Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何填充它所在的数组';s结构的一部分,使用的函数可以';不能将数组作为参数_C_Arrays_File_Struct_Abstract Data Type - Fatal编程技术网

C 如何填充它所在的数组';s结构的一部分,使用的函数可以';不能将数组作为参数

C 如何填充它所在的数组';s结构的一部分,使用的函数可以';不能将数组作为参数,c,arrays,file,struct,abstract-data-type,C,Arrays,File,Struct,Abstract Data Type,好的,伙计们,请不要对我刻薄,我只是一个尝试我的手在这个编码的东西,并被它可怕的困惑的女孩 我有这个练习来创建一个抽象数据类型,其中一部分我需要从文件中获取一些值,并使用它们创建一行。在这个文件中,我首先得到了直线上的点数,然后是每个点的对坐标。 我使用的结构如下所示: typedef struct ponto{ double x; double y; } ponto; typedef struct linha{ double

好的,伙计们,请不要对我刻薄,我只是一个尝试我的手在这个编码的东西,并被它可怕的困惑的女孩

我有这个练习来创建一个抽象数据类型,其中一部分我需要从文件中获取一些值,并使用它们创建一行。在这个文件中,我首先得到了直线上的点数,然后是每个点的对坐标。 我使用的结构如下所示:

    typedef struct ponto{
      double x;
      double y;
       } ponto;

    typedef struct linha{
      double numVertices;
      ponto verticesLin[ ];
       }linha;
我需要使用的功能是:

void criaLinha (linha *, double , ponto *);
因此,我编写了这段代码,通过使用该函数将数据从文件转换到buff,然后再转换到struct linha:

    BuffToLine(ponto buff[], numMax, linha *l){
      double i;
      ponto Aux;
       for(i=0, i<numMax , i++){
           Aux.x = buff[i].x;
           Aux.y = buff[i].y;
        criaLinha(*l, i, *Aux);
                       }
                      }

    void criaLinha (linha *l, double numVertices, ponto *vertices){

       *l.verticesLin[numVertices].x = Aux.x;
       *l.verticesLin[numVertices].y = Aux.y;
                 }
BuffToLine(蓬托buff[],纽马克,林哈*l){
双i;
奥克斯桥;

对于(i=0,i,您的代码有很多错误

第一:

ponto verticesLin[ ];
不是有效的标准C,
gcc
将接受此选项,但如果您希望在结构中具有尾部数组,则正确的声明为:

ponto verticesLin[0];
如果这样做,则需要为结构分配足够的内存

第二:

 double i;
不要对数组索引使用
double
类型,使用
int
size\t

第三:正确地缩进代码并给变量赋予有意义的名称是一种很好的做法,否则即使你下个月也读不懂

现在,如果您将结构声明为

typedef struct ponto {
    double x;
    double y;
} ponto;

typedef struct linha {
    size_t numVertices; // counters should have an integer type
    ponto verticesLin[0];
} linha;
然后,在创建
linha
的实例时,需要分配足够的空间

linha * l = malloc(sizeof(l) + numVertices * sizeof(ponto));
传递参数时,还需要正确输入类型:

void criaLinha (linha * l, size_t numVertices, ponto * vertices);

BuffToLine(ponto buff[], size_t numMax, linha * l) {
    size_t i; // should be an integer type
    ponto Aux;
    for(i=0, i< numMax , i++){
        Aux = buff[i]; // you can copy the whole thing, no need to to it by variable
        criaLinha(
            l // l is already a pointer no need to dereference it
            , i
            , &Aux // Aux is a ponto, you need a ponto*, so you need to take the address of it
        );
    }
}
void cralinha(linha*l、尺寸/垂直度、ponto*顶点);
BuffToLine(ponto buff[],尺寸为mm,linha*l){
size\u t i;//应为整数类型
奥克斯桥;
对于(i=0,i

希望这有点帮助,您没有提供足够的代码来帮助您完成更多工作。

您对第二个结构的声明是错误的。它没有编译或运行有什么问题?(顺便说一句,Uchia是对的)@UchiaItachi如果他使用的是支持的C99兼容编译器,那么第二种结构就没有错。但是,使用
double
进行索引肯定是错误的。@WhozCraig不知道这一点。谢谢你的链接:)它没有运行,因为我需要创建一个缓冲区来用文件数据填充linha结构。但我不知道如何做。测试文件是这样的:
2-98546
1这是另一行的开始,我不知道如何在创建第一行时阻止缓冲区也得到它。我希望它不会太混乱。(我已经修复了结构,谢谢)谢谢,这确实有点帮助。但是我不能更改函数
criaLinha
的参数类型。整个代码应该是一个ADT,使用文件中给定的坐标创建点、线和多边形。我应该实现使用参数中的类型给出的某些函数。因此,如果文件是这样的5-6 7第一个number是一行中的点的数量,其他的是点。我需要使用它来创建
linha l
,使用函数cralinha(linhal,numVertice,ponto)。如果它们需要作为指针,也许我应该将函数移出另一个
BuffToLine
?您应该注意他对
ponto verticesLin[]
如果成员使用的是兼容C99的编译器,则该成员是合法的。