Hallo,
ich nutze den Codevision-Compiler und möchte ein Array mit konstanten
Werten in den Flash legen.
Wenn ich es so deklariere
int testarray[150][2];
bekomme ich folgende Fehlermeldung, da der Code wahrscheinlich nicht ins
RAM passt:
"main.c (65): too many local variables declared inside this function"
Wenn ich es so deklariere (im *.h File)
flash int testarray[150][2];
bekomme ich folgende Fehlermeldung:
"... storgage modifiert not allowed in this context"
So, was mache ich falsch?
hallo stefanieh
wann willst du denn das array initialisieren ?
du wirst wohl die werte gleich uebergeben muessen, denn nachtraegliches
hinein schreiben ist nicht drinn.
gruss
hans
--
stefanieh schrieb:> "main.c (65): too many local variables declared inside this function"
So definiert ist das eine lokale Variable und damit auf dem Stack und
nicht im Flash.
Mindestens muss da ein "const" damit das auch wirklich ein Array mit
konstanten Werten wird. Dann noch "static", damit das nicht als lokale
Variable behandelt wird. Eventuell kann man in diesem Fall static
weglassen, weil konstante lokale Variablen nicht auf dem Stack abgelegt
werden müssen, aber es ist nicht garantiert, dass der Compiler das auch
ohne Optimierungen so macht.
Wenn es in mehr als einer Funktion verwendet werden soll, würde ich in
eine Header-Datei das reinpacken:
1
externflashconstinttestarray[150][2];
Dann in einer C-Datei die passende Definition dazu (obige Header-Datei
muss auch hier eingebunden werden):
1
flashconstinttestarray[150][2]={{...
(Falls das die richtige Verwendung von "flash" ist, wie Codevision das
erwartet.)
Danke für die Antwort:
Ich hab's nun so gemacht
In defines.h
int testarray[150][2];
In defines.c:
testarray[150][2] = { { ...
Nachdem ich "Build Projekt" gedrückt habe, hat alles wunderbar
funktioniert (noch nicht aufgespielt, habe aber keine Fehlermeldung
bekommen)
Dann bin ich auf "Build all Project Files" im Compiler gegangen und habe
folgenden Assembler-Fehler bekommen:
"project.asm": Undefined symbol:_testarray
Weiß wer, woran dies liegen könnte, und was ich jetzt am besten mache??
stefanieh schrieb:> ch hab's nun so gemacht> In defines.h> int testarray[150][2];>> In defines.c:> testarray[150][2] = { { ...
Das ist so nicht sinnvoll.
Einerseits gehört eine Variablendefinition NIE in eine Headerdatei,
andererseits können Definition und Initialisierung nicht getrennt
werden.
In Deine Headerdatei gehört nur eine Deklaration (die hier mit dem
Schlüsselwort extern versehen werden muss).
So, nun habe ich einen für mich total unverständlichen Fehler!
Vielleicht kann mir ja wer von euch weiterhelfen?
Ich mache folgendes innerhalb einer Funktion:
1
{
2
inta;
3
chartest[5];
4
a=var/100-1;
5
itoa(a,test);
6
putchar1(' ');
7
putchar1('a');
8
putchar1(test[0]);
9
putchar1(test[1]);
10
putchar1(test[2]);
11
putchar1(test[3]);
12
putchar1(' ');
13
itoa(testarray[a][0],test);
14
putchar1(' ');
15
putchar1('P');
16
putchar1(test[0]);
17
putchar1(test[1]);
18
putchar1(test[2]);
19
putchar1(test[3]);
20
putchar1(' ');
21
itoa(testarray[a][1],test);
22
putchar1(' ');
23
putchar1('F');
24
putchar1(test[0]);
25
putchar1(test[1]);
26
putchar1(test[2]);
27
putchar1(test[3]);
28
putchar1(' ');
29
itoa(a,test);
30
putchar1(' ');
31
putchar1('a');
32
putchar1(test[0]);
33
putchar1(test[1]);
34
putchar1(test[2]);
35
putchar1(test[3]);
36
putchar1(' ');
37
}
wenn ich nun meine Ausgaben anschaue, dann wird für a z.B. 65 richtig
berechnet.
Die Ausgabe bei testarray[a],[1] stimmt noch.
Die Ausgabe bei testarray[a],[0] ist die, wie wenn a=0 wäre!!
Die Ausgabe von a ist nun 0!!!
Wie kann das sein?? Ich ändere a doch gar nicht und bin immer in der
gleichen Funktion!!
Wenn ich a als static int deklariere, funktioniert alles.
Warum?!
stefanieh schrieb:> Wenn ich a als static int deklariere, funktioniert alles.
Das wird daran liegen, daß das Array "test" zu klein ist, und itoa die
Variable a überschreibt.
Oliver
stefanieh schrieb:> Nun Arrayelement ist immer 0.> Warum?
Weil Du es mit 0 initialisierst und ihm nie einen anderen Wert zuweist.
Bist Du Dir sicher, daß Du wahlweise mit einem Strukturelement
"me->inc_counter" und mit einer lokalen Variable inc_counter arbeiten
möchtest?
> Warum?
Kurz gesagt:
Wenn du irgendwo ein Array überläufst, dann kann alles mögliche
passieren. Immerhin bügelst du dann im Speicher irgendwelche
Speicherzellen nieder, die gar nicht zum Array gehören und das kann in
weiterer Folge alles mögliche bewirken.
Ist das ein Fehler in deiner Funktion:
Du versuchst offenbar Überläufe beim Array Zugriff zu verhindern. Nur:
einmal kommt das Increment das du benutzt aus inc_counter und das ander
mal aus me->inc_counter. D.h. dein ganzer komplizierter Code macht alles
mögliche, nur nicht sich gegen Überläufe beim Zugriff abzusichern.
stefanieh schrieb:> Nun Arrayelement ist immer 0.> Warum?
Was wird das jetzt hier?
Deine Fehler im Code musst du schon selber suchen, und wenn das nicht
dein Code ist, musst du ihn selber verstehen lernen. Ein gutes C-Buch
ist dabei sehr hilfreich.
Arrayelement ist immer 0, weil es so im Programm steht. Ob das Programm
das macht, was es machen soll, ist eine andere Frage. Das kannst und
musst du selber rausfinden
Oliver
stefanieh schrieb:> ops, ich habe 2 x me->inc_counter geschrieben statt inc_counter.> Aber nur hier, ich wollte das Bsp einfacher darstellen...
Spar dir das in Zukunft.
Du siehst was in vielen Fällen dabei rauskommt.
Poste deinen Code so wie er ist!
Dann kann man auch sinnvoll helfen.