整数转换(缩小,扩展),未定义的行为

我很难以我能够轻易理解的方式找到关于这个主题的信息,所以我要求对我发现的内容进行审查。这只是转换和转换的全部内容。 在示例中,我将指的是: (signed/unsigned) int bigger; (signed/unsigned) char smaller; 截断整数。 (超大化>小) 首先在MSB端截断 bigger以匹配smaller尺寸。 第二,根据较小的类型将截断的结果转换为有符号/无符号 。 如果较大的值太大而不适合较小的类型,则会导致不确定的行为(纠正我)。 但是我的规则应该是在所有机器上工作(对此也是正确的),结果应该是可预测的。 加宽整数(小 – >更大) a) signed char – > signed int 使用MSB(1或0)前置较小以匹配较大的大小 转换为签名 b) signed char – > unsigned int 使用MSB(1或0)前置较小以匹配较大的大小。 转换为无符号 c) unsigned char – > signed int 以0为前缀以匹配更大的尺寸 转换为签名 d) unsigned char – > unsigned int 以0为前缀以匹配更大的尺寸 转换为无符号 […]

fgetc,检查EOF

在Linux系统编程一书中我读过这样的文章: fgetc将读取的字符作为unsigned char强制转换为文件末尾或错误的int或EOF 。 使用fgetc的常见错误是: char c; if ((c = fgetc()) != EOF) {…} 这段代码的正确版本是: int c; if ((c = fgetc()) != EOF) { printf(“%c”, (char)c); … } 那么,为什么我不能在与EOF比较之前将返回值转换为char ? 为什么我必须将EOF与int进行精确比较? 当EOF定义为-1 ,它是否通常被转换为char ? 是否有平台/编译器不适用?

如何使用xlib正确截取屏幕截图?

我正在尝试捕获屏幕图像以用于截屏。 因此我需要一个快速的解决方案,并且不能依赖shell程序,如import或xwd。 这是我到目前为止编写的代码,但是它失败并且给了我一个垃圾图像,它似乎只是显示了几个奇怪颜色的图像片段被拼凑在一起。 http://sofzh.miximages.com/c%2B%2B/blah.png 关于我做错的任何想法? #include #include #include #include using namespace cimg_library; int main() { Display *display = XOpenDisplay(NULL); Window root = DefaultRootWindow(display); XWindowAttributes gwa; XGetWindowAttributes(display, root, &gwa); int width = gwa.width; int height = gwa.height; XImage *image = XGetImage(display,root, 0,0 , width,height,AllPlanes, ZPixmap); unsigned char *array = new unsigned char[width * height * 3]; […]

将字符串解析为argv / argc

在C中是否有办法解析一段文本并获取argv和argc的值,就像文本已经在命令行中传递给应用程序一样? 这不一定适用于Windows,只需要Linux – 我也不关心引用参数。

有没有办法在C中循环使用不同类型元素的结构?

我的结构是这样的 typedef struct { type1 thing; type2 thing2; … typeN thingN; } my_struct 如何在循环中枚举struct childrens,例如while,或for?

accept()线程安全吗?

我正在用C编写一个简单的网络服务器,用于我正在做的课程。 一个要求是我们实现一个线程池来处理使用pthreads的连接。 我知道我将如何大致这样做(在主线程中调用accept并将文件描述符传递给freee线程),但是我的朋友提出了一种替代方法而不是我想到的方法:在前面创建我的所有线程,让他们全部循环接受电话。 接受的想法是阻塞所有空闲线程,当连接进入时,只给出一个文件描述符。 然后当一个给定的线程完成一个连接时,它会循环回来并阻塞一个再次接受的调用。 使用accept()作为信号量的调用。 这样可以简化实现,因为您不需要跟踪哪些线程正忙,哪些线程已准备好进行连接。 理论上它也会降低延迟,因为线程可以立即开始执行。 我的问题是,这样安全吗? 我打算实施它并尝试一下,但我还没准备好,我很想知道答案。 我在谷歌和这里搜索stackoverflow,但找不到任何人这样做。 接受线程安全吗? 我假设这种方法会有更多的开销,因为你一直在运行所有的线程,这两种方法只是一个简单的内存/延迟权衡吗? 编辑:我不确定这应该是社区维基,如果它应该是道歉,我找不到按钮:P

“n *(rand()/ RAND_MAX)”是否会产生偏斜的随机数分布?

我想找到一种在C中获取随机数的无法解释的方法(尽管最多我会将它用于0-20的值,更可能只有0-8)。 我已经看过这个公式,但经过一些测试后,我不确定它是否有偏差。 有帮助吗? 这是使用的完整function: int randNum() { return 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0))); } 我使用以下方法播种: unsigned int iseed = (unsigned int)time(NULL); srand (iseed); 下面建议的那个拒绝为我工作,我试过了 int greek; for (j=0; j<50000; j++) { greek =rand_lim(5); printf("%d, " greek); greek =(int) (NUM * (rand() / (RAND_MAX + 1.0))); int togo=number[greek]; number[greek]=togo+1; } 当我注释掉printf时,它停止工作并给我相同的数字50000次。

以对数时间平行减少

给定n部分和,可以将log2并行步骤中的所有部分和相加。 例如,假设有八个线程具有八个部分和: s0, s1, s2, s3, s4, s5, s6, s7 。 这可以在log2(8) = 3连续步骤中减少; thread0 thread1 thread2 thread4 s0 += s1 s2 += s3 s4 += s5 s6 +=s7 s0 += s2 s4 += s6 s0 += s4 我想用OpenMP做这个,但我不想使用OpenMP的reduction条款。 我想出了一个解决方案,但我认为可以使用OpenMP的task子句找到更好的解决方案。 这比标量加法更通用。 让我选择一个更有用的案例:数组缩减(请参见此处 , 此处以及有关数组缩减的更多信息)。 假设我想在数组a上进行数组缩减。 下面是一些代码,它们为每个线程并行填充私有数组。 int bins = 20; int a[bins]; int **at; // […]

AES CTR 256加密OpenSSL上的操作模式

我是OpenSSL的新手,任何人都可以给我一个如何从C文件初始化AES CTR模式的提示。 我知道这是方法的签名,但我遇到了参数问题,没有很多文档也没有明确的例子如何进行简单的加密。 如果有人可以举例说明这种方法,我将不胜感激。 提前致谢! void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, const unsigned long length, const AES_KEY *key, unsigned char ivec[AES_BLOCK_SIZE], unsigned char ecount_buf[AES_BLOCK_SIZE], unsigned int *num); Hi Caf我真的很感谢你的快速回答它真的很有用,而且是我在网上找到的最好的例子。 我试图打开一个长度不确定的文件,加密它并用生成的密文写入另一个文件,然后打开加密文件并恢复明文。 我需要使用相当数量MB的文件,因为我想对CPU的性能进行基准测试。 但是我在解密时仍然遇到问题。 不知何故,当解密相当大的txt文件(1504KB)时,它不会解密它完成,我得到一半的明文,另一半仍然加密。 我认为这可能与iv的大小或我打电话给柜台的方式有关。 这是我到目前为止: #include #include #include struct ctr_state { unsigned char ivec[16]; unsigned int num; unsigned char ecount[16]; }; FILE *fp; […]

C – 为什么strcpy()是必需的

有人可以向我解释为什么strcpy()是必须将字符串分配给字符数组,例如在下面的代码片段中。 int main(void) { char s[4]; s = “abc”; //Fails strcpy(s, “abc”); //Succeeds return 0; } s = “abc”失败的原因是什么? 为什么strcpy()是在声明字符串之后将字符串赋值给char数组的唯一方法? 我似乎很奇怪你必须使用一个函数来执行一个基本的赋值。