Forum: Mikrocontroller und Digitale Elektronik Reihenfolge der Structs im Speicher durcheinander


von Honkmichi (Gast)


Lesenswert?

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?

von Little B. (lil-b)


Lesenswert?

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] = {...}

von Peter D. (peda)


Lesenswert?

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
        };

von Mark B. (markbrandis)


Lesenswert?

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.

von Mandrake (Gast)


Lesenswert?

Beide Strukturen in eine Hauptstruktur packen und dann das pragma packed 
einsetzen.

von Rudolph (Gast)


Lesenswert?

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.

von Honkmichi (Gast)


Lesenswert?

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)

von Holm T. (Gast)


Lesenswert?

probiere mal -fno-toplevel-reorder

Gruß,

Holm

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
Noch kein Account? Hier anmelden.