#c #pointers #reference #null
#c #указатели #ссылка #null
Вопрос:
я попытаюсь объяснить весь код, который я помещу в следующие части, сначала я расскажу вам о проблеме, я теряю ссылку на указатель в этой матрице, которая соединяет один узел с ее соседом, я отправил вам printf, чтобы помочь увидеть, какие потерянныеиз ссылки, которую я имею, теперь программа, которую я пытаюсь создать, представляет собой матрицу, содержащую узлы, у которых в его атрибуте был сосед вверх, вниз, влево, вправо, и я пытаюсь предотвратить краевой случай, помещающий нулевые указатели в атрибут neighbor, но я не знаю, почему не работает правильно, потому что значение null внезапно меняется на 1, и я действительно не знаю, почему. вот код: (это меньший код, который я мог бы сделать для отображения ошибки)
#include <stdio.h>
#include <unistd.h>
#include <string.h>
typedef struct Node
{
int id;
int col;
int row;
int node_restricted;
struct Node* up;
struct Node* down;
struct Node* left;
struct Node* right;
int color;
}Node;
Node init_node(int id,int col, int row){
Node new_node;
new_node.id=id;
new_node.col = col;
new_node.row = row;
new_node.up = NULL;
new_node.down = NULL;
new_node.left = NULL;
new_node.right = NULL;
new_node.color = 0;
new_node.node_restricted = 0;
return new_node;
}
Node** form_matrix_with_node(int amount_of_node_axis_x,int amount_of_node_axis_y){
Node** matrix_with_node = calloc(amount_of_node_axis_x,sizeof(Node*));
for (int i = 0; i < amount_of_node_axis_x; i )
{
matrix_with_node[i] = calloc(amount_of_node_axis_y,sizeof(Node));
}
int total_of_node = amount_of_node_axis_x*amount_of_node_axis_y;
int row = 0;
int col = 0;
for (int i = 0; i < total_of_node; i )
{
if (((col 1)%amount_of_node_axis_x)==0)
{
matrix_with_node[row][col] = init_node(i,row,col);
row = row 1;
col = 0;
}else{
matrix_with_node[row][col] = init_node(i,row,col);
col = col 1;
}
}
link_between_node(matrix_with_node,amount_of_node_axis_x,amount_of_node_axis_y);
matrix_with_node[0][0].color = 1;
matrix_with_node[0][2].color = 1;
matrix_with_node[0][3].color = 1;
printf("this is my left pointer %dn",matrix_with_node[1][0].left);
matrix_with_node[0][4].color = 1;
printf("this is my left pointer %dn",matrix_with_node[1][0].left);
matrix_with_node[1][0].color = 1;
matrix_with_node[1][1].color = 1;
matrix_with_node[1][2].color = 1;
matrix_with_node[2][0].color = 1;
matrix_with_node[3][0].color = 2;
return matrix_with_node;
}
void link_between_node(Node** matrix_with_node,int amount_of_node_axis_x,int amount_of_node_axis_y){
for (int i = 0; i < amount_of_node_axis_x; i )
{
for (int j = 0; j < amount_of_node_axis_y; j )
{
//en el siguente se ve si la conexion con el nodo de arriba
if ((i-1)>=0)
{
matrix_with_node[i][j].up = amp;(matrix_with_node[i-1][j]);
}//en el siguente se ve si la conexion con el nodo de abajo
if ((i 1)<amount_of_node_axis_y)
{
matrix_with_node[i][j].down = amp;(matrix_with_node[i 1][j]);
}//en el siguente se ve si la conexion con el nodo de izquierda
if ((j-1)>=0)
{
matrix_with_node[i][j].left = amp;(matrix_with_node[i][j-1]);
}//en el siguente se ve si la conexion con el nodo de derecha
if ((j 1)<amount_of_node_axis_x)
{
matrix_with_node[i][j].right = amp;(matrix_with_node[i][j 1]);
}
}
}
}
int main(int argc, char** argv)
{
form_matrix_with_node(4,4);
}
Комментарии:
1. Одна из проблем заключается в том, что если вы выделяете 4 элемента, вы не можете назначить элемент с индексом 4. т. Е.
matrix_with_node[0][4].color = 1;
Требуется не менее 5 элементов.2. Если у вас так много указателей в вашей структуре узла, может быть, вам не понадобится матрица?
3. wildplasser да, я знаю, но нужна матрица, чтобы сделать указатель: D
4. спасибо EdmCoff, это была проблема, я не видел, чтобы матрица была меньше: D