首先,我承认我对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;

10-08 10:52