我用的是一种叫做Sedona的语言,它可以采用原生C方法。为了在sedona中集成C,变量声明有点不对劲。
塞多纳->C
布尔->国际32区
布尔[]->单位8*
字节->int32
字节[]->uint8*
短->国际32
短[]->uint16*
整数->整数32
int[]->int32区*
长->int64_t
长[]->int64*
浮动->浮动
浮动[]->浮动*
双->双
双[]->双*
目标->无效*
对象[]->无效**
Str->单元8*
Str[]->单元8**
我的方法试图打开一个文件,读取其内容,并将文件内容作为字符串返回给其他Sedona方法使用。我知道你们大多数人可能不认识塞多娜,但我有一些我不明白的错误。这是我的代码:
#include <stdio.h>
#include "sedona.h"
Cell MyWeblet_MainWeblet_getFile(SedonaVM* vm, Cell* params){
uint8_t* file_name = params[1].aval;
FILE *fp;
uint8_t* fileContents;
struct stat st;
stat(&file_name, &st);
int32_t size = st.st_size;
int32_t itter = 0;
Cell result;
fileContents = malloc(sizeof(char)*size);
fp = fopen(file_name, "r"); //read mode
if (fp==NULL){
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
unit8_t* ch;
while ((ch = fgetc(fp))!=EOF){
fileContents[itter] = ch;
itter++;
}
result.aval = fileContents;
fclose(fp);
return result;
}
我得到的错误比这个多,但这里有一个弹出的例子:
- warning C4047:'function' : 'const char *' differs in levels of indirection from 'uint8_t **'
- warning C4024:'stat' : different types for formal and actual parameter 1
- error C2275: 'int32_t' : illegal use of this type as an expression
我只想了解这些错误意味着什么,我不需要任何人来修复我的代码(尽管建议会很好)。
最佳答案
当您将指针变量分配给非指针类型时,或者更一般地说,当指针变量中的间接(星)数不同时,会出现间接级别的差异。例如,在以下(反)引用案例中会出现此错误。
int *x, y;
x = y; // correct use: x = &y;
y = x; // correct use: y = *x;
特别是,您得到的错误显示了形式参数和实际参数之间的不匹配。当从调用者传递给被调用者的参数值涉及间接寻址级别的差异时,在函数调用期间会发生这种情况。下面是一个例子。
void swap(int* x, int *y) { ... }
int x = 2; y = 3;
swap(x, y); // correct use: swap(&x, &y);
不幸的是,C不是一种强类型语言,因此只是对这些类型的错误发出警告。但是,C++将这些错误报告为错误。