塞多纳的本地C方法 - 间接水平

时间:2014-06-27 18:36:52

标签: c file file-io

我使用一种名为Sedona的语言,可以采用原生C方法。为了在sedona中集成C,变量声明有点偏。

  1. Sedona - > C
    • bool - > int32_t
    • bool [] - > uint8_t *
    • byte - > int32_t
    • byte [] - > uint8_t *
    • 短 - > int32_t
    • 短[] - > uint16_t *
    • int - > int32_t
    • int [] - > int32_t *
    • long - >的int64_t
    • long [] - > *的int64_t
    • float - >浮
    • float [] - >浮*
    • double - >双
    • double [] - >双*
    • Obj - >无效*
    • Obj [] - >无效**
    • Str - > uint8_t *
    • Str [] - > uint8_t **
  2. 我的方法是尝试打开一个文件,读取其内容并将该文件的内容作为字符串返回给其他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
    

    我真的只是想了解这些错误的含义,我不需要任何人为我修复代码(虽然建议会很好)。

2 个答案:

答案 0 :(得分:1)

在该行中,

stat(&file_name, &st);

参数&file_name不合适。 stat的第一个参数的类型是char const*&file_name的类型为uint8_t**

如果您的平台中的charuint8_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 ++会将这些报告为错误。