2009-06-21 10 views
1

Wie reserviere ich Speicher für eine Char-Variable (kein Char-Zeiger) innerhalb einer Struktur?
(Variablennamen in portugiesisch sind, sorry, wenn es irgendwie verwirrend)Wie setze ich ein Zeichen in einer Struktur in C?

Ich habe diese Struktur:

typedef struct node{ 
    char rotulo[10], instrucao[1][2][10], flag; 
    int simplificado; 

    struct node *referencias[2]; 
    struct node **antecessores; 
    int nrAntecessores; 

    struct node *ant; 
    struct node *prox; 
} Estado; 

Und dies ist Funktion insere() die abgelesenen Werte aus einer Eingabedatei in einem neuen Knoten setzt:

void Insere(char *rotulo, char instrucao[][2][10], int qtdInstrucao, char flag){ 
    int i,j; 
    Estado *NovoEstado; 
    NovoEstado = (Estado*)malloc(sizeof(Estado)); 
    NovoEstado->prox = NULL; 
    NovoEstado->ant = P->ult; 
    strcpy(NovoEstado->rotulo, rotulo); 
    NovoEstado->flag = flag; 
    NovoEstado->antecessores = NULL; 
    NovoEstado->nrAntecessores = 0; 
    NovoEstado->simplificado = 0; 

    for(i=0;i<qtdInstrucao;i++){ 
     realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10])); 
     strcpy(NovoEstado->instrucao[i][0], instrucao[i][0]); 
     strcpy(NovoEstado->instrucao[i][1], instrucao[i][1]); 
    } 
} 

Diese NovoEstado->flag = flag; nicht funktioniert ...
Gleich nachdem ich es gesetzt, wenn ich NovoEstado->flag drucke ich den richtigen Wert zu erhalten, b ut, wenn ich es nach diesem for durch das Ende der Funktion setzen, wenn ich NovoEstado->flag drucken bekomme ich das erste Zeichen von NovoEstado-> Rótulo ...
Das gleiche passiert, wenn ich versuche, flag in main() zu drucken ...

Ich denke, das ist, weil ich nicht richtig Speicherplatz flag in Insere() reservieren, ist das richtig? Und wie repariere ich es?

Ich bin mir ziemlich sicher, dass es eine schreckliche einfache Frage, und dass ich possibily dies einmal wusste, aber ich habe vergessen, und kann es nicht überall ... So würde jede mögliche Hilfe sehr

EDIT geschätzt werden

Nach Ocdecios Tipp habe ich einen Zeiger auf ein zweidimensionales Array erstellt, um ein dynamisches 3-dimensionales Array zu haben.
Mein Ziel ist es, eine „Tabelle“ wie diese zu haben:

10 chars | 10 chars 
|__________|__________| 
|__________|__________| 
|__________|__________| 

Wo die Anzahl der Zeilen dinamic ist, aber es ist immer ein Array von 2 Strings von 10 Zeichen.

So, jetzt ist es das, was ich in Haupt tun:

char estado[127], rotulo[10], strInstrucoes[117], *conjunto = calloc(21, sizeof(char)), flag; 
    char (*instrucao)[2][10]; 

    FILE * entrada; 
    Automato *Aut = (Automato*)malloc(sizeof(Automato)); 

    if((entrada = fopen(argv[1], "r")) != NULL){ 
     CriaAutomato(Aut); 
     while(fgets(estado, 127, entrada)){ 
      flag = 0; 
      sscanf(estado,"%[^:]: %[^;]; %c", rotulo, strInstrucoes, &flag); 
      instrucao = calloc(1, sizeof(char[2][10])); 
      conjunto = strtok(strInstrucoes,"() "); 
      for(i = 0; conjunto != NULL; i++){ 
       realloc(instrucao, i+1*sizeof(char[2][10])); 
       sscanf(conjunto,"%[^,],%s", instrucao[i][0], instrucao[i][1]); 
       printf("%s || %d\n", instrucao[i][1], i); 
       conjunto = strtok(NULL, "() "); 
      } 
      Insere(Aut, rotulo, instrucao, i, flag); 
      free(instrucao); 
     } 
     fclose(entrada); 

Aber das funktioniert nicht ...
Dies ist die Eingabe von Datei

adsasdfg2: (abc,123) (def,456) (ghi,789); 

lesen ist aber auch Bevor ich rufe Insere Ich bin nicht die richtigen Werte zu instrucao die Art, wie ich will, da dies die Ausgabe von diesem printf

ist
123 
454 
789 

statt dessen, was ich bin mit dem Ziel für

123 
456 
789 

Was ist los?

(bevor jemand fragt, ist dies Teil eine Hausaufgabe, aber nicht die Hausaufgaben.Meine Aufgabe ist es, eine deterministische Finite Automata minimizer zu machen, das ist nur ein Fehler, den ich auf der Dateneingabe im Zusammenhang bin immer)

Dank einer ganze Menge

+0

Nein, das ist es nicht. Wenn Sie ein Malloc (sizeof (Estado)) machen, vergeben Sie Platz für Flag. – Macarse

Antwort

7

Ihr Problem ist wahrscheinlich in dieser Linie sein:

realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10])); 

Es ist nicht notwendig, etwas in Ihrer Struktur zuzuordnen, da das Feld instrucao statisch durch die Anweisung instrucao[1][2][10] definiert ist, es ist keine dynamisch zugewiesene Struktur.

+0

+1. schön gefleckt. –

+0

Also, wenn ich 'instrucao 'als eine dynamisch zugewiesene Struktur umschreiben (wie ich es brauche), sollte es funktionieren? – Gabe

+0

@Gabe - wenn Sie es richtig machen, ja. –

0

Sie müssen kein Flag zuweisen. Es ist ein Zeichen, das innerhalb der Struktur definiert ist (im Gegensatz zu einem Zeiger).

Ihr Fehler wird durch das Überschreiben des Flag-Inhalts innerhalb der Struktur während der for-Schleife verursacht, wo Sie in NovoEstado->instrucao schreiben (d. H. Es ist ein Speicher-Scribble oder überschreiben).

Update: Wie @ocdecio darauf hinweist, müssen Sie innerhalb der Schleife nicht neu zuweisen, da instrucao auch statisch zugewiesen ist.

1

Ich denke, diese Linie das Problem ist:

realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10])); 

In der Struktur der Instrução als Batzen kontinuierlichen Speicher definiert ist, aber Sie sind jetzt einen Speicher und Zuordnen der Zeiger zuordnet.

Versuchen Sie es auskommentieren, Sie müssen nicht für diese Variable Speicher reservieren.

0

Ich weiß nicht die Absicht des Codes, aber es ist sicherlich illegal folgendes zu tun:

realloc (NovoEstado-> Instrução, i + 1 * sizeof (char [2] [10])) ;

Grundsätzlich wurde die umschließende Struktur mit malloc zugewiesen, aber das betreffende innere Element ist ein statisch definiertes Array und kann nicht mithilfe des Heapspeichers neu zugeordnet werden (weil der Heap-Manager nur den Malloced-Zeiger auf Knoten verfolgt).

typedef struct Knoten {char rotulo [10], instrucao [1] [2] [10], flag;

Wenn Sie die Größe für instrucao dynamisch ändern möchten, müssen Sie sie als Zeigertyp definieren und Speicher separat zuweisen.

Verwandte Themen