小编sin*_*law的帖子

安装OpenCV并使用GCC编译C程序

作为我正在开展的更大项目的一部分,我需要在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)

c linker gcc opencv header

6
推荐指数
1
解决办法
2万
查看次数

使用-Wwrite-strings时,在GCC 5中键入与自身不兼容的类型

考虑:

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]"

c gcc

6
推荐指数
1
解决办法
128
查看次数

来自<stdatomic.h>的atomic_store/load是否适用于英特尔上未对齐的跨缓存行数据?

使用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)

c multithreading gcc intel clang

6
推荐指数
1
解决办法
166
查看次数

如何在代码包装在函数中时定义全局类型

这个问题是关于正确使用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是一个糟糕的解决方案,因为现在我们必须为每个类维护两个文件.

  1. 如果文件由文件级函数包装,是否可以共享类型?
  2. 一般来说,在文件之间共享类型的推荐方法是什么?使用闭包库是否以任何方式提供/需要帮助?

javascript google-closure google-closure-compiler

5
推荐指数
1
解决办法
113
查看次数

为什么编译?代码似乎打破了类型参数的约束

在下面的测试中,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)

java eclipse generics compiler-bug eclipse-jdt

4
推荐指数
1
解决办法
411
查看次数

C11隐式转换字符,x%y

在C11中,

char foo(char x, char y) {
    return x % y;
}
Run Code Online (Sandbox Code Playgroud)

是否在任何地方进行了隐式转换(例如,提升为int)?

c

3
推荐指数
1
解决办法
119
查看次数

我可以在GWT中使用第三方Javascript库吗?

例如mootools !! 我在js编码很舒服,但显然不适合所有人.

javascript gwt jsni

2
推荐指数
1
解决办法
3330
查看次数

欣德利 - 米尔纳的概括变坏了?

考虑以下程序(在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] …

haskell type-inference hindley-milner

2
推荐指数
1
解决办法
318
查看次数

Haskell,语法错误

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)

优先级解析错误为什么会这样?

syntax parsing haskell

0
推荐指数
1
解决办法
2183
查看次数

使用字符串访问冲突写入位置0xcccccccc

在过去的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)

c++ string pointers visual-c++

0
推荐指数
1
解决办法
1822
查看次数

是否可以在不使用仅包含C#代码的yield的情况下实现无限的IEnumerable?

编辑:显然偏离主题...转移到Programmers.StackExchange.com.

这不是一个实际问题,它更像是一个谜.

问题

我很想知道是否有办法实现与以下相同的东西,但不使用yield:

IEnumerable<T> Infinite<T>()
{
    while (true) { yield return default(T); }
}
Run Code Online (Sandbox Code Playgroud)

规则

  1. 您无法使用该yield关键字
  2. 直接使用C#本身 - 没有IL代码,没有构建动态程序集等.
  3. 您只能使用基本的.NET lib(仅限mscorlib.dll,System.Core.dll?不确定还包括哪些内容).但是,如果您找到一些其他.NET程序集(WPF ?!)的解决方案,我也很感兴趣.
  4. 不要实现IEnumerable或IEnumerator.

笔记

我最接近的是:

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# ienumerable infinite-loop

-2
推荐指数
1
解决办法
557
查看次数