printf("Ab hier werden die Werte der Struktur überschrieben");
7
}
Bis zum printf läuft auch alles so, wie ich es erwarte. Sobald ich aber
die Zeile mit dem printf (ein einfaches return oder andere Funktionen)
aufrufe, ändern sich die Werte meiner Struktur.
Was mache ich falsch bzw. wie würdet ihr diesen Fehler suchen?
Dankeschön,
Christian
Hmm. nIndex bleibt kleiner als MAX_ELEMENTS?
Dann kommt womöglich der Stack dem Speicherbereich ins Gehege, in dem Du
das statische Array abgelegt hast.
Schwer lesbarer Code. Schreib es doch so:
{
TEST *slot = g_STest + nIndex;
strncpy(slot->szName, Name, sizeof(slot->szName) - 1);
}
Das extra-Schreiben der 0 ist überflüssig, wenn man sie nie überschreibt
(da globale Arrays sowieso mit 0 initialisiert sind).
Woher dein Problem kommen könnte: wie die anderen schon sagen, vieleicht
ist nIndex zu gross? Oder der Rest der Funktion (wenn es einen gibt) hat
einen Fehler, der den Stack überschreibt.
Ich vermute auch ein Problem mit dem Stack (nIndex ist sogar nur 0 oder
1). Wenn ich MAX_ELEMENTS auf 4 setze, klappts. Wie kann ich den
feststellen, dass ich ein Problem mit dem Stack habe?
Hab mir gerade das Memory Window mal angesehen. Dort wird die Struktur
an der Adresse 0x400016AC abgelegt. Nach dem Füllen ist dort alles
richtig. Nach dem printf steht dort ein völlig anderer Wert. Allerdings
steht in der folgenden Adresse (0x400016B0) der Wert 0x400016AC (<-
meine Strukturanfangsadresse). Kann das ein Problem beim Retten und
Wiederherstellen der Werte sein?
die Werte dieser Variablen (Adresse 0x400016C0) werden beim strncpy
überschrieben. Das heisst doch, dass sich hier meine Speicherbereiche
überlappen, denn die Adresse 0x400016C0 sollte doch eigentlich noch zu
meiner Struktur gehören.
Es ist müßig, hier über Codefragmente zu spekulieren.
Das Überschreiben kann z.B. vollkommen legal sein, wenn sich der Fokus
der Variable test ändert - typisch für lokale Variablen in einem eigenen
Block...
Du solltest den Quellcode eines Minimalprogramms und das
Linkercontrolscript (bzw. ggf. die ROM/RAM/Stack-Einstellungen in einer
IDE) posten.
Problem gelöst:
leider hat der RealView-Compiler ein Problem, wenn die Elemente der
Struktur nicht initialisiert sind. Er legt zwar ohne Initialiserung den
Speicher der Struktur an, legt dort aber trotzdem noch andere Sachen ab
und überschreibt die Strukturvariablen. Meine Initialiserung sieht dann
folgendermaßen aus:
Hi Dietmar,
das war mein erster Versuch. Das ging leider nicht. Nur, wenn jedes
Element einzeln inititialisert wird, geht's.
Danke für die Hilfe,
Christian
Da bin ich wieder,
wie schon erwähnt, funktionieren einige Strukturen mittlerweile. Leider
habe ich noch Probleme mit Strukturen in Strukturen. Die können nämlich
mit Hilfe der "Einzelinitialisierung" vor dem Überschreiben geschützt
werden. Ein Beispiel wäre:
1
#define MAX_ELEMENTS 16
2
typedefstructDrive
3
{
4
struct*Driveprev;
5
struct*Drivenext;
6
charszName[32];
7
}TEST;
8
9
staticTESTg_sTest[MAX_ELEMENTS];
Hat jemand eine Idee, wie ich diese Strukur "einzeln" initialisieren
kann?
Wenn ich mir den Assembler Code für das Überschreiben der Strukturwerte
ansehe:
wird dort eine Variable (g_ucMinVolume) benutzt, die dort überhaupt
nichts zu suchen hat. Wie kann ich denn herausfinden, wo dewr Schuh
drückt?
Vielen Dank für die Hilfe,
Christian
>Hat jemand eine Idee, wie ich diese Strukur "einzeln" initialisieren>kann?
Einer Struktur einen Wert zuzuweisen, z.B. komplett löschen, geht ja so
direkt nur über memset() aus der stdlib.h etwa so:
memset (&Structvariable, 0, sizeof(STRUCTTYP));
RealView!
Ja, das hat mich auch schon geärgert, daß man nur zwischen Cholera und
Pest wählen kann, nämlich entweder alles initialisieren oder nichts,
halbe-halbe will das Ding unter keinsten Umständen.
Und das wäre beides wichtig, daß es geht!!!
Letztendlich werde ich den Compiler über einen nicht angegebenen
RAM-Bereich über das Linker-Script austricksen müssen, ein Scratch-Pad
außerhalb der Memory-Map anlegen, vielleicht funktioniert schon ein mit
EMPTY definierter Block mitten im RAM, um Variablen über einen Reset
hinaus zu retten, obwohl ich diese Methode überhaupt nicht so cool
finde.
Oder gibt es doch noch die Möglichkeit, nur Strukturen nach Reset nicht
zu initialisieren? Muß ich doch gleich mal ausprobieren!
Gruß
Dietmar (ohne E)