Forum: Mikrocontroller und Digitale Elektronik Array initialisiert nicht richtig


von Patrick (Gast)


Lesenswert?

Hallo die Herren,

Ich versuche gerade ein Array zu initialisieren.
Leider klappt dies nicht wie gewünscht.

Anbei der Code
1
// Variablendeklaration
2
unsigned int k = 0;
3
unsigned int BufferSize = 300;
4
unsigned int zeiger = 0;
5
unsigned char Ringbuffer[BufferSize];  
6
7
8
// Alle Werte im Array auf 0 setzten (eigentlich überflüssig da: unsigned char Ringbuffer[BufferSize];  dies ja schon machen sollte)
9
10
      for (k=0;k<=BufferSize-1;k++)   
11
      {
12
        Ringbuffer[k]=0;  
13
        printf("\n\rLösche Ringbuffer[%u]:",k) ;
14
        delay_ms (10);  
15
      }
16
17
// Ausgabe über RS232
18
19
do
20
{
21
            printf("\n\rRingbuffer[%u]:%u",zeiger ,Ringbuffer[zeiger]) ; 
22
                          
23
            if(zeiger>=BufferSize-1)
24
            {
25
                zeiger = 0;
26
            }
27
            else
28
            {
29
                 zeiger++;
30
            }
31
}
32
while(1);

Nun lese ich aber leider immer folgendes aus:
// Erster Durchlauf
Ringbuffer[2]:0
Ringbuffer[3]:0
Ringbuffer[4]:4
Ringbuffer[5]:0
Ringbuffer[6]:0
Ringbuffer[7]:0
Ringbuffer[8]:0
Ringbuffer[9]:0
Ringbuffer[10]:0
Ringbuffer[11]:0
Ringbuffer[12]:0
Ringbuffer[13]:0
Ringbuffer[14]:51
Ringbuffer[15]:93
Ringbuffer[16]:93
Ringbuffer[17]:93
Ringbuffer[18]:93
Ringbuffer[19]:93
Ringbuffer[20]:93
Ringbuffer[21]:93
Ringbuffer[22]:0
Ringbuffer[23]:0
Ringbuffer[24]:0
Ringbuffer[25]:0
Ringbuffer[26]:0


// 2ter Druchlauf
Ringbuffer[2]:0
Ringbuffer[3]:0
Ringbuffer[4]:4
Ringbuffer[5]:0
Ringbuffer[6]:0
Ringbuffer[7]:0
Ringbuffer[8]:0
Ringbuffer[9]:0
Ringbuffer[10]:0
Ringbuffer[11]:0
Ringbuffer[12]:0
Ringbuffer[13]:0
Ringbuffer[14]:58
Ringbuffer[15]:53
Ringbuffer[16]:53
Ringbuffer[17]:53
Ringbuffer[18]:53
Ringbuffer[19]:53
Ringbuffer[20]:53
Ringbuffer[21]:53
Ringbuffer[22]:0
Ringbuffer[23]:0
Ringbuffer[24]:0
Ringbuffer[25]:0
Ringbuffer[26]:0

// 3er Druchlauf
Ringbuffer[2]:0
Ringbuffer[3]:0
Ringbuffer[4]:4
Ringbuffer[5]:0
Ringbuffer[6]:0
Ringbuffer[7]:0
Ringbuffer[8]:0
Ringbuffer[9]:0
Ringbuffer[10]:0
Ringbuffer[11]:0
Ringbuffer[12]:0
Ringbuffer[13]:0
Ringbuffer[14]:101
Ringbuffer[15]:49
Ringbuffer[16]:57
Ringbuffer[17]:55
Ringbuffer[18]:53
Ringbuffer[19]:51
Ringbuffer[20]:49
Ringbuffer[21]:57
Ringbuffer[22]:0
Ringbuffer[23]:0
Ringbuffer[24]:0
Ringbuffer[25]:0
Ringbuffer[26]:0
usw.

Was mache ich den hier bitte falsch???

Ich verwende einen ATmega32 und programmiere mit CodeVision

Danke für alle Tipps
mfg
Patrick

von Uwe (de0508)


Lesenswert?

Hallo Patrick schrieb:

> unsigned int BufferSize = 300;
Wo hast du schon mal so etwas gesehen?

> unsigned int zeiger = 0;
> unsigned char Ringbuffer[BufferSize];

Die Arraygröße muss im Compilerlauf bekannt und konstant sein !
1
#define BufferSize 300

Wäre richtg, es gibt noch eine zweite Schreibweise, welche ?

von DirkB (Gast)


Lesenswert?

@Uwe
Das geht schon, denn seit C99 (also 12 Jahre) gibt es VLA 
(variable-length arrays).

@Patrick
Hast du genug RAM?

von DirkB (Gast)


Lesenswert?

Mamoent mal,
Patrick schrieb:
> // Alle Werte im Array auf 0 setzten (eigentlich überflüssig da: unsigned char 
Ringbuffer[BufferSize];  dies ja schon machen sollte)

In welchem Scope ist denn der Ringbuffer definiert?
global: dann gibt es kein VLA
lokal :  dann werden die Variablen nicht mit 0 initialisiert

von Noname (Gast)


Lesenswert?

Zeig am besten mal kompletten, kompilierbaren Code.
Reduziere den Code auf das Minimum, so das der Fehler nocht auftritt.

Was für einen Prozessor und welchen Compiler verwendest Du?

Und noch eins. Du hast zwar nicht danach gefragt aber Konstruktionen wie
1
k <= BufferSize - 1
sind äquivalent zu
1
k < BufferSize

was es überflüssig macht, zur Laufzeit noch Buffersize - 1 zu rechnen. 
(Wenn auch möglicherweise dieser Wert wegen Optimierung 
zwischengespeichert wird).

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.