好吧,伙计们,请不要对我刻薄,我只是一个尝试编码的女孩,并且对此感到非常困惑。
我有这个练习来创建一个抽象数据类型,在其中的一部分中,我需要从文件中获取一些值并使用它们创建一行。在文件中,我首先有直线上的点数,然后是每个点的对坐标。 我正在使用的结构是这样的:
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;
}
问题是,我不知道如何将文件中的值传递到缓冲区,并且我不确定我编写的代码是否有效,因为我无法测试没有缓冲区的情况。 那么...有人可以帮助我了解如何创建此缓冲区以及是否有更好的方法使用“criaLinha”函数创建线条?
最佳答案
你的代码有很多错误。
第一:
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
);
}
}
希望这对您有一点帮助,您没有提供足够的代码来帮助您获得更多帮助。
关于c - 如何使用不能将数组作为参数的函数来填充作为结构一部分的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18560515/