我使用一种名为Sedona的语言,可以采用原生C方法。为了在sedona中集成C,变量声明有点偏。
我的方法是尝试打开一个文件,读取其内容并将该文件的内容作为字符串返回给其他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
我真的只是想了解这些错误的含义,我不需要任何人为我修复代码(虽然建议会很好)。
答案 0 :(得分:1)
在该行中,
stat(&file_name, &st);
参数&file_name
不合适。 stat
的第一个参数的类型是char const*
。 &file_name
的类型为uint8_t**
。
如果您的平台中的char
和uint8_t
类型相同,则可以使用:
stat(file_name, &st);
答案 1 :(得分:1)
将指针变量分配给非指针类型时,或者更一般地说,当指针变量中的间接(星形)数量不同时,会发生间接级别的差异。例如,您在以下(de)引用案例中收到此错误。
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 ++会将这些报告为错误。