Hi, ich möchte eine Art Datenbank in C hinterlegen. Dazu habe ich mehrere Stukturen unterschiedlicherer Größe als Konstante angelegt. const struct pbl_char = {....}; const struct pbl_int = {....}; Mit Zeigeroperationen gehe ich die gesamte Liste durch. Dazu müssen die Strukturen zwingend hintereinander im Speicher liegen. Leider würfelt der Compiler mir die Stukturen beim optimieren durcheinander. Ich habe versucht die Optimierung für den Bereich auszuschalten. #pragma GCC optimize ("O0") (ARM GCC Compiler) Leider funktioniert das nicht. (Weiß nicht warum.) Ich habe auch versucht die Strukturen in eine weitere zu verpacken, aber dann kann ich die strukturen nicht mehr mit den enthaltenen Funktionspointern initialisieren. Die Initialisierung mit Funktionspointer funktioniert nur bei der ersten Struktur, bei einer Struktur in der Struktur gibt es eine Compilerfehler. Hat jemand noch eine Idee?
zwei punkte dazu: Wie einzelne Variablen im Speicher abgelegt werden ist Aufgabe des Linkers. Darauf hat der c-Code keinen Einfluss (normalerweise) Auf Structs benutzt man keine Pointer, da der Compiler diese optimieren kann. Pointer verwendet man normalerweise mit Arrays oder Listen. Wenn du eine Datenbank anlegen möchtest, dann tu das doch in Form eines Arrays von einem Struct.
1 | struct DataElement MeineDatenbank [DatenbankGroesse] = {...} |
Honkmichi schrieb: > Die Initialisierung mit > Funktionspointer funktioniert nur bei der ersten Struktur, bei einer > Struktur in der Struktur gibt es eine Compilerfehler. Und der lautet? Du kannst jedes Element einer Struct über seinen Namen initialisieren.
1 | struct data data = { |
2 | // ...
|
3 | .p[USET].mon.gain = 1.0, |
4 | .p[USET].mon.offset = 0.0, |
5 | // ...
|
6 | };
|
Little B. schrieb: > Auf Structs benutzt man keine Pointer Komisch, wieso sieht man das dann so oft? ;-) Für Zeiger auf Strukturen bzw. Strukturelemente gibt es in C doch extra den Operator -> zur Vereinfachung der Schreibweise. > Wenn du eine Datenbank anlegen möchtest, dann tu das doch in Form eines > Arrays von einem Struct. >
1 | > struct DataElement MeineDatenbank [DatenbankGroesse] = {...} |
2 | >
|
Das wiederum klingt vernünftig.
Beide Strukturen in eine Hauptstruktur packen und dann das pragma packed einsetzen.
Honkmichi schrieb: > Mit Zeigeroperationen gehe ich die gesamte Liste durch. Also sowas wie zeiger = &struct1 + (sizeof(struct) * n) ? Ich weiss gerade nicht, wo ich das gelesen habe, aber direkte Manipulation von Zeigern dürften nach diversen Kodier-Richtlinien verboten sein. Da ist ein Array von Structs doch direkt viel sauberer.
Peter D. schrieb: > Du kannst jedes Element einer Struct über seinen Namen initialisieren. Peter, ich geb dir Recht. Der Fehler hieß "Syntax Error". Grund dafür war aber ein define vor dem Funktionspointer, das unbekannt war. Es funktionier. Ich kann eine Struktur in der Struktur auch mit einem Funktionspointer initialisieren. Weiß jemand wie ich dem Linker für einen Codeabschnitt sagen kann, das er die Variablen nicht optimieren soll? (ARM GCC)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.