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 | extern flash const int testarray[150][2]; |
Dann in einer C-Datei die passende Definition dazu (obige Header-Datei muss auch hier eingebunden werden):
1 | flash const int testarray[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??
Evtl. wird deine defines.c ja gar ncht verwendet? Dein Hauptfehler ist, daß du zu wenig zeigst. Evtl. ja auch dem Compiler.
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 | int a; |
3 | char test[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
Das wird daran liegen, daß das Array "test" zu klein ist, und itoa die Variable a überschreibt. Oliver
Kann eigentlich sein, jetzt kommt ein neues Beispiel aus dem gleichen Projekt: weitere Funktion
1 | {
|
2 | const int Amplitudenarray[10] = {20,60,100,120,140,160,180,210,240,300}; |
3 | static int Arrayelement =0; |
4 | timeout_counter++; |
5 | |
6 | //Auswertung des Inc-Counters
|
7 | if(inc_counter != 0) |
8 | {
|
9 | if(Arrayelement + inc_counter <= 0) |
10 | {
|
11 | Amplitude = Amplitudenarray[0]; |
12 | }
|
13 | else if(Arrayelement + me->inc_counter >= 9) |
14 | {
|
15 | Amplitude = Amplitudenarray[9]; |
16 | }
|
17 | else
|
18 | {
|
19 | Amplitude = Amplitudenarray[Arrayelement + inc_counter]; |
20 | }
|
21 | me->inc_counter = 0; |
22 | Arrayelement = Arrayelement + me->inc_counter; |
23 | }
|
Nun Arrayelement ist immer 0. Warum?
ops, ich habe 2 x me->inc_counter geschrieben statt inc_counter. Aber nur hier, ich wollte das Bsp einfacher darstellen...
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.
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.