Fehler nach Arraydeklaration

Gast #2120718
Lesenswert?

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?
Gast #2121171
Lesenswert?

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.)
Gast #2123270
Lesenswert?

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??
Persönliche Seite #2123346
Lesenswert?

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).
Gast #2124716
Lesenswert?

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?!
Gast #2124816
Lesenswert?

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?
#2124847
Lesenswert?

> 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.
Gast #2124851
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren