Frage

Wie kann ich Speicher zuweisen für einen char-Variable (keine char Zeiger) innerhalb einer Struktur?
(Variablennamen sind auf portugiesisch, sorry, wenn es ein bisschen verwirrend ist)

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;

Das 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]);
    }
}

Dieses NovoEstado->flag = flag; nicht funktioniert ...
Gleich nachdem ich es gesetzt, wenn ich NovoEstado->flag drucken bekomme ich den richtigen Wert, aber 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 stelle dar, das ist, weil ich nicht richtig bin Zuweisung von Speicherplatz in flag Insere(), ist das richtig? Und wie kann ich es beheben?

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 jede mögliche Hilfe sehr geschätzt werden würde

Bearbeiten

Nach ocdecio Tipp habe ich einen Zeiger auf ein zweidimensionales Feld, um eine dinamic 3-dimensionale Array zu haben.
Mein Ziel ist es, eine „Tabelle“ wie diese haben:

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

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

So, jetzt das ist, 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 aus einer Datei lesen

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

aber noch bevor ich rufe Insere ich nicht die richtigen Werte zuweisen den Weg instrucao Ich möchte, da dies der Ausgang dieses printf ist

123
454
789

statt dem, 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, ist dies nur ein Bug ich bin immer im Zusammenhang mit Dateneingabe)

Durch eine ganze Menge

War es hilfreich?

Lösung

Ihr Problem ist wahrscheinlich in dieser Linie sein:

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

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

Andere Tipps

Ich denke, diese Linie ist das Problem:

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 zugewiesen wird.

Versuchen Sie es zu kommentieren, müssen Sie nicht Speicher zuweisen für diese Variable.

Sie müssen keine Flagge zuzuweisen. Es ist ein Zeichen innerhalb der Struktur definiert (im Gegensatz zu einem Zeiger entgegenstellen).

Ihr Fehler wird durch Überschreiben Flag des Inhalts innerhalb der Struktur während der for-Schleife verursacht, wo Sie schreiben, um NovoEstado->instrucao (das heißt es ist ein Speicher kritzelt oder überschreiben).

Update:. Als @ocdecio weist darauf hin, Sie müssen nicht in der Schleife realloc, wie instrucao auch statisch zugeordnet ist

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 Aufnahmestruktur zugeordnet malloc, aber die Innen betreffende Mitglied ist eine statisch definierte Anordnung, und es kann nicht rellocated werden, um den Haufen verwendet (da der Heap-Manager verfolgt nur den malloced Zeiger zu Knoten).

typedef struct {char Knoten Rótulo [10], Instrução [1] [2] [10], Flag;

Wenn Sie möchten, für um die Größe Instrução dynamisch, können Sie es als Zeigertyp definieren müssen und Speicher zuweisen für sie separat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top