Почему я получаю «несовместимый тип указателя» при назначении указателей на многомерный массив - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь создать матрицу узлов для сохранения значения int, которое изменяется в каждой итерации в зависимости от его соседей, поэтому я решил, что у меня должна быть структура "Node", которая сохраняет его значение, и список узлов, которыеуже близко, но при компиляции я получаю следующее предупреждение при назначении узла списку:

предупреждение: назначение из несовместимого типа указателя [-Wincompatible-pointer-types] n -> соседей [0]= таблица [M - 1] [N - 1];

Это предупреждение приводит к тому, что мои узлы не инициализируются, что вызывает ошибку сегментации, когда я пытаюсь получить доступ к любой переменной внутри моей структуры (Я думаю, потому что это NULL).

Вот мой код, надеюсь, вы можете помочь мне с этим

...
typedef struct node {
    int state;
    struct Node** neighbours;
} Node;

Node* node_init(int i, int j, int M, int N, Node*** table) {
    Node* n = malloc(sizeof(Node));
    n -> state = -1;
    n -> neighbours = malloc(sizeof(Node*)*8);
    if (i == 0 && j == 0) {  // (0, 0)
        n -> neighbours[0] = table[M - 1][N - 1];  // Here is the problem
        n -> neighbours[1] = table[M - 1][j];
        n -> neighbours[2] = table[M - 1][j + 1];
        n -> neighbours[3] = table[i][N - 1];
        n -> neighbours[4] = table[i][j + 1];
        n -> neighbours[5] = table[i + 1][N - 1];
        n -> neighbours[6] = table[i + 1][j];
        n -> neighbours[7] = table[i + 1][j + 1];
    } ...  // for all cases
    return n;

Node*** table = malloc(sizeof(Node**)*M);          // M is the amount of rows
for (int i=0; i < M; i++) {
    Node** nodes = malloc(sizeof(Node*)*N);        // N is the amount of cols
    table[i] = nodes;
    for (int j=0; j < N; j++) {
        Node* node = node_init(i, j, M, N, table); // wont reach here
        table[i][j] = node;
        fscanf(fp, "%i", &(node -> state));        // ain't relevant

    }
}
...

Я знаю, что в первый раз я

n -> neighbours[0] = table[M - 1][N - 1]

Я присваиваю случайное значение, на которое указывает эта позиция таблицы, но я не думаю, что это проблема, верно?

В любом случае, надеюсь, вы поможете мне

Спасибо:)

1 Ответ

0 голосов
/ 28 марта 2019

table[M - 1][N - 1] - это Node*, которое после применения typedef struct node { /* ... */ } Node; является struct node*.n -> neighbours[0] - это struct Node*.Поскольку C чувствителен к регистру, это действительно указатели на две совершенно разные структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...