首先,我承认我对C和指针不是很了解,但是我一直在阅读并且尚未找到解决方案。我还尝试了一些在SO上找到的解决方案,但没有一个起作用。
从文件中读取填充结构的信息以及数组的大小。因此,我想在main()中声明该数组,以用于进一步处理,并通过引用将其传递给read_p5_info()进行初始化和填充。 “ configs”将由configuration()函数填充。
typedef struct pentomino_info pentomino_info;
struct pentomino_info {
char name;
int orientations;
int blocks[5][2];
int configs[8];
};
int read_p5_info(int *npieces, int *matrix_size, pentomino_info **pieces) {
// piece info is read from file
// npiece and matrix_size are also read from the file
// With file I'm testing with, npieces = 12 and matrix_size = 5
*pieces = malloc(*npieces * sizeof *pieces);
for (p = 0 ; p < *npieces ; p++) {
pieces[p] = malloc(sizeof *pieces[p]);
ret = fscanf(fp, "%c %*d %d %d %*d %*d %*f", &pieces[p]->name, &p5_rotations, &p5_flips);
pieces[p]->orientations = p5_rotations * p5_flips;
// read p5 blocks
int b = 0;
for (l = *matrix_size - 1 ; l >= 0 ; l--) {
for (c = 0 ; c < *matrix_size ; c++) {
// p5_char is a char read from the file
if(p5_char == '#' || p5_char == 'X') {
pieces[p]->blocks[b][0]=c;
pieces[p]->blocks[b][1]=l;
b++;
}
}
}
}
return 0;
}
int main() {
int npieces, matrix_size;
pentomino_info *pieces; // array of p5 pieces
int ret;
ret = read_p5_info(&npieces, &matrix_size, &pieces);
// configurations() operates on each piece individually
configurations(matrix_size, &pieces[k]);
}
我正在谈论的部分是Pentominos。 npieces是文件具有信息的五氨基氨基的数量,matrix_size是因为pentamino_info.blocks具有matrix_size x matrix_size矩阵中每个块的放置坐标X,Y。
我在main()的末尾遇到段错误。个片段[0]看起来不错,但仍然给我带来段错误,而其他片段则格式错误。
我试图通过删除一些看起来不相关的部分来使代码更加紧凑,如果我过分的话请告诉我。在此先感谢您的帮助。
最佳答案
*pieces = malloc(*npieces * sizeof *pieces);
分配了错误的内存量。应该是sizeof **pieces
。模式为P = malloc(N * sizeof *P);
作为认知交叉检查,请检查sizeof的论证前面是否还有一个星星。pieces[p]->x
应为(*pieces)[p].x
,您会在多个地方出现此错误。在数组表示法中,您编写了pieces[p][0].x
,但正确的索引是pieces[0][p].x
。指针pieces
仅指向一个指针,然后指向信息数组的第一个元素。
如果这令人困惑,我建议您在函数中使用“普通”指针,然后在最后实现按引用返回,例如:
int n_pie = 12; // or whatever you read
pentomino_info *pie = malloc(n_pie * sizeof *pie);
// ...
pie[p].orientations = bla;
// ...
*npieces = n_pie;
*pieces = pie;
return 0;