Tabelle mit verschiedenen Datentypen
-
Liebes Forum,
ich würde gerne folgende Tabelle erstellen| a | b |
------------
0| 0 | 1 |
1_| 1 | 1 |kann man das lesen? auf der x-achse: a,b. y-achse: 0,1.
mit welchen Datentypen kann ich das am besten realisieren? was brauch ich da für Pointer/Arrays?
Vielen Dank für TIpps!
-
Hi,
ist ne Frage der Codierung, ne:enum {x=2, y=2}; void kuggi(char tab[x][y]) { int i, j; for ( i=0; i<x; i++ ) for ( j=0; j<y; j++ ) printf("%c %d %d\n", i+97, j, tab[i][j] ); } int main() { char tab[x][y] = {0,1,1,1}; kuggi(tab);
Gruß,
B.B.
-
ok, vielen Dank für die Antwort!
nun komm ich aber trotzdem nicht weiter, aufgrund inkompatiblen Typen:
ich habe folgende Struktur:struct automaton { int initial_state; int current_state; int *transitions[NR_LETTERS][NR_STATES]; int *final_states; };
und folgende init()-Funktion:
void init() { struct automaton *myautomaton; int letters[NR_LETTERS] = {'a', 'b'}; // accepted letters int states[NR_STATES] = {1,0}; // list of states int transitions[NR_LETTERS][NR_STATES] = {letters, states}; int i; myautomaton = &myAutomaton; // final states int final[2] = {0,1}; myautomaton->final_states = &final[0]; // initial state myautomaton->current_state = INITIAL_STATE; // transition table myautomaton->transitions = &transitions; // ERROR !!! }
dabei bekomm ich folgende Fehlermeldung:
error: incompatible types when assigning to type ‘int *[2][2]’ from type ‘int (*)[2][2]’
was ist genau der Fehler?
-
Du versuchst Adressen von klinisch toten Variablen zu speichern. Nixa gutta. Lokal in einer Funktion deklarierte Variable leben im Funktionsstackspeicher nur während der Funktionsausführung. Ist die Funktion ausgeführt, ist der Stackspeicher nicht mehr existent. Die von dir gespeicherten Adressen existieren zwar noch physikalisch, aber es können sich dort nun Daten eines Stacks von einer anderen Funkion oder sonst irgendwas befinden. Eine Dereferenzierung deiner gespeicherten Zeiger hat dann bestenfalls eine Speicherzugriffsverletzung zur Folge(Das wirft gleich ne Exception, die Suche nach überschriebenen Daten anderer Variable kann Stunden dauern :D).
Schreibst du an die Adresse Daten, kannst du damit den Inhalt anderer Variable killen, etc. Das Programm wird zur random running wild sowDu kannst eine Strukturvariable gleich bei der Definition initialisieren, damit kann man sich hier und da mal eine Initialisierungsfunktion sparen:
enum {x=2, y=2, z=3}; struct automaton { int a[x][y]; int b[z]; char* s; }; void struct_kuggi ( struct automaton* pma ) { int i, j; for ( i=0; i<x; i++ ) for ( j=0; j<y; j++ ) printf("%c %d %d\n", i+97, j, pma->a[i][j] ); for ( i=0; i<z; i++ ) printf ("%d ", pma->b[i] ); printf("%s\n", pma->s ); } int main() { struct automaton ma = { {0,1,1,1}, {1,2,3}, "Hi Bruder!"}; struct_kuggi ( &ma ); return 0; }
Ansonsten musst du für deine Strukturmember genug Speicher reservieren und in der Initialisierungsfunktion den Inhalt der Variablen kopieren (malloc, memcpy, etc).
-
Du kannst eine Strukturvariable gleich bei der Definition initialisieren
Das hab ich gemacht:
struct automaton { int initial_state; int current_state; int *transitions[NR_LETTERS][NR_STATES]; int *final_states; }; static struct automaton *myAutomaton;
Deshalb hab ich dann in der init() auch mit Adressen + Pointer gearbeitet, damit das Resultat der Funktion erhalten bleibt.
hab ich mit dem obigen Code nicht meinen Automaten global verfügbar gemacht? also sollte ich ihn doch auch verändern können
-
kulturfenster schrieb:
Deshalb hab ich dann in der init() auch mit Adressen + Pointer gearbeitet, damit das Resultat der Funktion erhalten bleibt.
hab ich mit dem obigen Code nicht meinen Automaten global verfügbar gemacht? also sollte ich ihn doch auch verändern können
Du hast einen Zeiger verfügbar gemacht, der auf nichts zeigt. Du brauchst noch Speicher, auf den der Zeiger zeigen kann. Irgendwo in der main sollte so etwas wie
struct automaton automat = {0};
stehen.
Dann kannst du dem Zeiger die Adresse des Speichers zuweisen:myAutomaton = &automat;
Das löst aber noch nicht das Problem der temporären Verfügbarkeit der Adressen in der init Funktion. Die Adressen allein kopieren genügt nicht, du musst den Speicherinhalt kopieren.