作为我正在开展的更大项目的一部分,我需要在C程序上使用OpenCV库.我在Fedora 17 32位中使用yum安装了OpenCV和opencv-devel.我指示预处理器导入opencv/cv.h和opencv/highgui.h作为必要的头文件.
正如我所提到的,gcc用于编译整个C项目.但是,链接器似乎存在问题.
每当我尝试编译项目(gcc opencv.c -o opencv)时,我都会得到一个错误列表,类似于:
/tmp/ccLJWE0c.o: In function `cvRound': opencv.c:(.text+0x19):
undefined reference to `lrint' /tmp/ccLJWE0c.o: In function
`cvDecRefData': opencv.c:(.text+0xa5c): undefined reference to
`cvFree_' opencv.c:(.text+0xacd): undefined reference to `cvFree_'
/tmp/ccLJWE0c.o: In function `cvGetRow': opencv.c:(.text+0xbc3):
undefined reference to `cvGetRows' /tmp/ccLJWE0c.o: In function
`cvGetCol': opencv.c:(.text+0xbee): undefined reference to `cvGetCols'
/tmp/ccLJWE0c.o: In function `cvReleaseMatND': opencv.c:(.text+0xc01):
undefined reference to `cvReleaseMat' /tmp/ccLJWE0c.o: In function
`cvSubS': opencv.c:(.text+0xd21): undefined reference to `cvAddS'
/tmp/ccLJWE0c.o: In function `cvCloneSeq': opencv.c:(.text+0xd6f):
undefined reference to `cvSeqSlice' /tmp/ccLJWE0c.o: In …Run Code Online (Sandbox Code Playgroud) 考虑:
char f(const char (*x)[4]);
void foo(void) {
typeof(*"FOO") x[4];
f(&x);
}
Run Code Online (Sandbox Code Playgroud)
编译-Wwrite-strings:
gcc-5 -c gcc5.c -Wwrite-strings
Run Code Online (Sandbox Code Playgroud)
你得到:
gcc5.c: In function ‘foo’:
gcc5.c:5:7: warning: passing argument 1 of ‘f’ from incompatible pointer type [-Wincompatible-pointer-types]
f(&x);
^
gcc5.c:1:6: note: expected ‘const char (*)[4]’
but argument is of type ‘const char (*)[4]’
char f(const char (*x)[4]);
^
Run Code Online (Sandbox Code Playgroud)
看起来像gcc中的bug,除非我遗漏了什么?
注意:-Wwrite-strings更改文字字符串的类型:
编译C时,给字符串常量类型"const char [length]"
使用atomic_store存储的数据和使用atomic_load加载的数据是否总是一致?
具体来说:C11程序访问故意放置在现代Intel CPU上高速缓存行之间边界的64位数据.它使用atomic_store和atomic_load(from <stdatomic.h>)从多个线程(在不同的核心上运行)访问此数据.
数据是否总是显得一致,或者加载它(atomic_load)有时会有一些属于旧值的字节,以及属于更新值的其他字节?
以下是基本的结构和变量定义以及程序的有趣部分,它们在一个循环中,并行地从多个线程发生:
struct Data {
uint8_t bytes[CACHELINE__BYTECOUNT - 4];
atomic_uint_fast64_t u64;
} __attribute__((packed)) __attribute__((aligned ((CACHELINE__BYTECOUNT))));
#define VAL1 (0x1111111111111111)
#define VAL2 (0xFFFFFFFFFFFFFFFF)
static struct Data data = { .u64 = VAL1 };
...
for (uint32_t j = 0; j < 1000; j++) {
atomic_store(&data.u64, VAL1);
atomic_store(&data.u64, VAL2);
}
const uint64_t val = atomic_load(&data.u64);
/* is 'val' always VAL1 or VAL2? */
Run Code Online (Sandbox Code Playgroud)
(完全可运行的程序:https://gist.github.com/sinelaw/1230d4675d6a4fff394110f17e463954)
用gcc 6.3.0和clang 3.7检查它显示它不是原子的:
$ clang -std=c11 -Wall -Wextra /tmp/atomic.c -o …Run Code Online (Sandbox Code Playgroud) 这个问题是关于正确使用Google Closure Compiler的类型注释.
我们有一个约定,每个javascript文件都包含在一个函数中.示例文件:
Square.js:
(function() {
'use strict';
/**
* @constructor
*/
function Square() {};
Square.prototype.draw = function() {
};
}());
Run Code Online (Sandbox Code Playgroud)
如果我们在这个函数中定义一个类型(比如构造函数),那么闭包编译器在其他文件中并不知道它.例如,在另一个文件中:
foo.js:
(function() {
'use strict';
/** @param {Square} square */
function drawSquare(square) {
square.draw();
}
}());
Run Code Online (Sandbox Code Playgroud)
编译它-W VERBOSE会给出一个错误,即Square未定义类型:
foo.js:4: WARNING - Bad type annotation. Unknown type Square
/** @type {Square} square */
^
0 error(s), 1 warning(s), 83.3% typed
Run Code Online (Sandbox Code Playgroud)
我们已经在单独的文件中为所有类创建了externs来解决这个问题.创建externs是一个糟糕的解决方案,因为现在我们必须为每个类维护两个文件.
在下面的测试中,TesterClass对其两个类型参数之间的关系设置了约束.方法func2()似乎打破了这个约束,我希望它会在某处导致类型编译错误(在func2的定义中,或者每当类与String之外的任何第二个参数一起使用时),但它不会!
此外,如果我调用func2并将结果保存在适当类型的变量中,则编译失败(在该变量的类型上).但是做同样的事情并保存在更通用的类型(例如Object)中会成功,尽管事实上函数的返回类型在两种情况下都应该具有相同的类型(在向上转换之前).
这里发生了什么?
谢谢!
public class TestGenerics {
public static class ParamedType<T> {}
public class TesterClass<A extends ParamedType<B>, B> {
public TesterClass<A, B> func() {
return new TesterClass<A, B>();
}
public TesterClass<A, String> func2() {
return new TesterClass<A, String>();
}
}
public Object test() {
// How can I use these type parameters? Doesn't .func2 now have an invalid return type?
TesterClass<ParamedType<Integer>,Integer> testClass = new TesterClass<TestGenerics.ParamedType<Integer>, Integer>();
//TesterClass<ParamedType<String>, Integer> res2 = testClass.func2(); // <-- will not compile
Object res = …Run Code Online (Sandbox Code Playgroud) 在C11中,
char foo(char x, char y) {
return x % y;
}
Run Code Online (Sandbox Code Playgroud)
是否在任何地方进行了隐式转换(例如,提升为int)?
例如mootools !! 我在js编码很舒服,但显然不适合所有人.
考虑以下程序(在Haskell中,但可以是任何HM推断语言):
x = []
y = x!!0
Run Code Online (Sandbox Code Playgroud)
使用HM(或运行编译器),我们推断:
x :: forall t. [t]
y :: forall a. a
Run Code Online (Sandbox Code Playgroud)
我理解这是如何发生的,通过通常的泛化/实例化规则,但我不确定是否有可能有这样的东西forall a. a.
一个问题是:由于我们在这里有一个越界访问,人们可以排除该程序作为一个有效的例子.相反,我们可以说我们推断的通用类型是程序中出错的标志吗?如果是的话,我们是否可以使用这个"事实"故意在其他情况下无效检查无效程序?
下一个程序甚至可以获得更奇怪的类型:
c = []
d = (c!!0) + (1 :: Int)
Run Code Online (Sandbox Code Playgroud)
推断类型:
c :: forall t. [t]
d :: Int
Run Code Online (Sandbox Code Playgroud)
......虽然d是从中抽出来的c!
我们可以在没有排除有效程序的情况下增强HM在这里做得更好吗?
编辑:我怀疑ed这是使用部分函数的工件(!!0在这种情况下).但请看:
c = []
d = case c of [] -> 0; (x:_) -> x + (1 :: Int)
Run Code Online (Sandbox Code Playgroud)
现在没有使用部分功能.然而,c :: forall t. [t] …
temperatura :: Float->Float
temperatura qCalor
| qCalor == 0 = 10
| 0 < qCalor < 3 = 30--fTem1
| 3 <= qCalor <= 9 = 50
| qCalor > 9 = 60--fTemp2
| 15 <= qCalor <= 24 = 150
| 24 < qCalor <= 27 = 170--fTemp3
| otherwise = "Nao existe temperatura correspondente a esse calor no grafico!"
Run Code Online (Sandbox Code Playgroud)
优先级解析错误为什么会这样?
在过去的4天里,我一直坚持这个错误:
Unhandled exception at 0x77c415de in ls_client_app.exe:
0xC0000005: Access violation reading location 0xcccccccc.
Run Code Online (Sandbox Code Playgroud)
这是代码:
typedef struct client {
string ID;
// some other strings
} client;
typedef struct client_card {
client CLIENT;
client_card * next;
} client_card;
typedef client_card * ls_client;
Run Code Online (Sandbox Code Playgroud)
这是add_client函数:
int add_client(ls_client &LS_CLIENT) {
client NEW_CLIENT;
ls_client NEW_CLIENT_CARD = (ls_client) malloc (sizeof(client_card));
cout << "CLIENT ID: " <<endl;
cin >> NEW_CLIENT.ID;
NEW_CLIENT_CARD->next = NULL;
NEW_CLIENT_CARD->CLIENT = &NEW_CLIENT;
while (LS_CLIENT != NULL) {
LS_CLIENT = LS_CLIENT->next;
}
LS_CLIENT = …Run Code Online (Sandbox Code Playgroud) 编辑:显然偏离主题...转移到Programmers.StackExchange.com.
这不是一个实际问题,它更像是一个谜.
我很想知道是否有办法实现与以下相同的东西,但不使用yield:
IEnumerable<T> Infinite<T>()
{
while (true) { yield return default(T); }
}
Run Code Online (Sandbox Code Playgroud)
yield关键字mscorlib.dll,System.Core.dll?不确定还包括哪些内容).但是,如果您找到一些其他.NET程序集(WPF ?!)的解决方案,我也很感兴趣.我最接近的是:
IEnumerable<int> infinite = null;
infinite = new int[1].SelectMany(x => new int[1].Concat(infinite));
Run Code Online (Sandbox Code Playgroud)
这是"正确的",但在14399次迭代通过可枚举(非常无限)之后会遇到StackOverflowException.
我认为由于CLR 缺乏尾递归优化,可能无法做到这一点.证明会很好:)
c ×4
gcc ×3
haskell ×2
javascript ×2
c# ×1
c++ ×1
clang ×1
compiler-bug ×1
eclipse ×1
eclipse-jdt ×1
generics ×1
gwt ×1
header ×1
ienumerable ×1
intel ×1
java ×1
jsni ×1
linker ×1
opencv ×1
parsing ×1
pointers ×1
string ×1
syntax ×1
visual-c++ ×1