2016-03-24 16 views
1

Ich versuche, Matrizen in einer LinkedList zu speichern. Aber ich habe einen Fehler, Code kann kompilieren, kann aber nicht ausgeführt werden. Wahrscheinlich über Speicherzuteilung, aber ich konnte es nicht herausfinden.Matrix in Struct in C

Meine Struktur wie das ist:

typedef struct node { 
    int** matrix; 
    struct node *next; 
} node; 

struct node *head; 
struct node *tail; 

ich die Struktur so zu initialisieren versucht:

struct node *init(void) { 
    head = (struct node *) malloc(sizeof *head); 
    tail = (struct node *) malloc(sizeof *head); 

    head->next = tail; 
    tail->next = tail; 
    return head; 
} 

Und ich habe eine Matrix voll von 1s:

int **mat = (int **) malloc(N * sizeof(int *)); 

for (i = 0; i < N; i++) { 
    mat[i] = (int *) malloc(N * sizeof(int)); 
    for (j = 0; j < N; j++) { 
     mat[i][j] = 1; 
    } 
} 

Aber als ich versucht habe, es an die Liste anzuhängen, ist das Programm abgestürzt.

Ich habe versucht, so anhängen:

struct node *l1; 
l1 = init(); 

l1 = append(mat, "t1", N); 
int** a3 = returnNode(0, l1); 

Und schließlich meine append und returnNode Funktionen wie das sind:

struct node *append(int** mat, char* name, int N) { 
    struct node *ptr; 

    struct node *t; 
    ptr = head; 
    while (ptr->next != tail) 
      ptr = ptr->next; 
    t = (struct node *) malloc(sizeof *t); 

    t->matrix = (int**) malloc(N * sizeof(int*)); 
    int i,j; 
    for (i = 0; i < N; i++) { 
     for (j = 0; j < N; j++) { 
      t->matrix[i][j] = (int)malloc(N * sizeof(int*)); 
     } 
    } 
    t->matrix = mat; 
    t->next = tail; 

    ptr->next = t; 
    return ptr; 
} 

int** returnNode(int index, struct node *ptr) { 
    int i; 
    struct node *t; 
    t = (struct node *) malloc(sizeof *t); 
    t = head; 
    for (i = 0; i < index; i++) { 
     t = t->next; 
    } 

    return t->matrix; 
} 

Was mache ich falsch?

+0

"Matrix" ist in der Regel ein Synonym für ein 2D-Array. Wenn das Ihre Absicht ist, ist etwas wie "int **" kein 2D-Array und kann nicht als ein solches verwendet werden. Wenn Sie ein echtes 2D-Array verwenden, wird der Code übersichtlicher und die Zuordnung/Freigabe erfolgt einfach. Es kann auch (!) Einen Leistungsgewinn hinzufügen. – Olaf

+0

Ich bekomme den N-Wert aus einer Textdatei. Also sollte es dynamisch sein, deswegen benutze ich int ** – pilkington

+1

'Aber ich habe einen Fehler, Code kann kompilieren, aber kann nicht laufen' - welcher Fehler, warum wird es nicht laufen? Unklar, was du fragst ... –

Antwort

1

Der Fehler ist, dass:

Cast von Zeiger auf ganze Zahl unterschiedlicher Größe

auf

t->matrix[i][j] = (int)malloc(N * sizeof(int*)); 

Lösung: -

Hier können Sie versuchen, um eine Adresse zu konvertieren ss zu einem Integer-Wert und weisen Sie dies einer Integer-Variablenposition zu.

Das eigentliche Problem ist hier:

(int)malloc(N * sizeof(int*)); 

malloc liefert einen Zeiger, sollten Sie den Typ entsprechend gegossen und dass jeweils zuweisen.

+0

Ich habe es gelöst. Jetzt ist das einzige Problem "Segmentation Fault" – pilkington

+0

können Sie die Frage aktualisieren? – tod

+0

Ich habe es jetzt aktualisiert :) – pilkington