我想在VS2008下编译beecrypt库.但是以下几种结构会产生语法错误(C2059语法错误:'.'):
const hashFunction md5 = {
.name = "MD5",
.paramsize = sizeof(md5Param),
.blocksize = 64,
.digestsize = 16,
.reset = (hashFunctionReset) md5Reset,
.update = (hashFunctionUpdate) md5Update,
.digest = (hashFunctionDigest) md5Digest
};
Run Code Online (Sandbox Code Playgroud)
VC++不接受开头的点.如果我评论上面的内容,我稍后会收到链接错误(LNK2001未解析的符号_md5) - 所以我想它必须取消注释.
这个结构是什么?我需要什么?我如何告诉VS2008编译它?
我在维基百科上看到了C99可变长度数组的这个例子:
float read_and_process(int n)
{
float vals[n];
for (int i = 0; i < n; i++)
vals[i] = read_val();
return process(vals, n);
}
Run Code Online (Sandbox Code Playgroud)
这是不正确的?我的印象是变长数组仍然只是指针,这意味着上面的代码将过期的指针val传递给process(...)函数.
我的代码包含以下行:
int counts[config.max_c];
Run Code Online (Sandbox Code Playgroud)
我很惊讶地看到它在gcc没有任何标志的情况下使用默认编译而没有问题.根据man gccc代码的默认标准是gnu89.这个标准是否支持这种类型的数组初始化,如果是这样,我在哪里可以找到参考?
来自一篇文章:
"GNU CC识别不仅以通常的十进制表示法写入的浮点数,例如1.55e1,而且还记录以十六进制格式写入的0x1.fp3等数字.在该格式中,0x十六进制导引器和p或P指数字段是指数是一个十进制数,表示有效位数乘以2的幂.因此0x1.f为1 15/16,p3乘以 8,0x1.fp3的值与1.55e1."
似乎说0x1.fp3被评估为=(1 + 15/16)*2 ^ 3
15/16来自哪里?
我正在这个(法国)网站上学习C:http://openclassrooms.com/courses/apprenez-a-programmer-en-c 我在关于模块化编程的章节中说:
因为订单在这里具有真正的重要性:如果您将功能放在源代码中的main之前,那么您的计算机已经阅读并了解它.当您打电话给该功能时,计算机将知道该功能,并知道去哪里获取它.
但是,如果将函数放在main之后,它将无法工作,因为计算机还不知道该函数.试试看吧!
我尝试将我的函数放在main函数之后,如下面的代码,但我的代码工作:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int nbE = 0;
int nbM = 0;
printf("Nombre a tripler : ");
scanf("%d", &nbE);
nbM = triple(nbE);
printf("Le nombre triple de %d est %d", nbE, nbM);
return 0;
}
int triple(int nb)
{
return nb * 3;
}
Run Code Online (Sandbox Code Playgroud)
你能解释一下它的工作原理吗?
检查最小值:
#include <stdio.h>
#include <string.h>
int main(void) {
char newline = '\n';
char* p = &newline;
if(strcmp(p, "\n") == 0) {
printf("ok\n");
} else {
printf("wrong\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是不确定的行为?或者它是完全错误的(即它总是返回不相等)?无论是什么,请解释原因!
根据GCC在C99模式下,以下代码是未定义的行为:
signed char c = CHAR_MAX; // assume CHAR_MAX < INT_MAX
c = c + 1;
printf("%d", c);
Run Code Online (Sandbox Code Playgroud) C99标准是否要求符合标准的编译器具有64位int64_t 定义(和可用)?或者它是可选的,恰好被所有流行的编译器定义?我显然要特别询问CPU无法直接处理64位值的平台,但问题更为笼统
我不能真正从C数据类型维基百科页面中找出这一点,也不能从这个相关问题的答案中解决这个问题.
我试图弄清楚为什么当我从函数内部调用memset时不起作用。当然,我可以使用for循环来重置所有值,但是我在这里学习,这件事使我没有任何解释。
/* First source code */
#include <stdio.h>
#include <string.h>
int main(void) {
int i, j, num;
printf("Digit a number :");
scanf("%d", &num);
int magic[num][num];
printf("First\n");
for(i = 0; i < num; ++i) {
for(j = 0; j < num; ++j) {
printf("%4d", magic[i][j]);
}
printf("\n\n");
}
memset(magic, 0, sizeof(magic));
printf("Before\n");
for(i = 0; i < num; ++i) {
for(j = 0; j < num; ++j) {
printf("%4d", magic[i][j]);
}
printf("\n\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
/* Second source code */ …Run Code Online (Sandbox Code Playgroud) 我已经读过,返回的值scanf指示它是否能够读取和转换值。我已经使用返回值来检测输入是否为整数,但是输入是否4.5 scanf返回1而输入是否g scanf返回0。她是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x;
int ReturnedValue=scanf("%d",&x);
printf("Scanf Returned:%d",ReturnedValue);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在多篇不同的文章中,您建议使用返回的值scanf检测整数,但是为什么现在不起作用?