Forum: Compiler & IDEs kleines C Problem - brauch mal Hilfe


von Bjoern B. (tishima)


Lesenswert?

Hallo,
So nach drei Tagen Fehlersuche habe ich mein Problem auf ein minimum 
reduziert, hab schon nach Hardwarefehler gesucht.
Compiler ist der WinARM GCC Optimierung ist aus

U8 ist als unsigned Char definiert

Der adcbuffer[] wird in ner Timerinterupptroutine mit ner Konstanten 
(10) gefüllt. Hab ich testweise gemacht um ein ADC Fehler 
auszuschliessen.

Es sollten sich so im ganzen buffer die gleichen Werte befinden.


U8 dx,dy,dc,dd;
volatile U8 temp;

while(1) {
dc=adcbuffer[temp];
dd=adcbuffer[temp-1];

if (dc!=dd) {rprintf("%d %d\r",dd,dc);}

temp--;

}

Wenn temp den Wert 0 annimmt tritt ein Fehler auf.

Ich bin bisher davon ausgegangen das temp einen Wertebereich von 0-255 
hat. ???
Wenn temp den Wert 0 annimmt erhalte ich als Ausgabe auf dem 
Terminelprg.

182 10

In diesem Fall scheint adcbuffer[temp-1] der temp Wert aus dem 
Wertebereich  (0-255) herauszuhüpfen und übergibt mir nen falschen 
Bufferwert.

Wie sorge ich nun in C dafuer das bei temp 0 temp-1 auch wirklich 255 
ist ?   oder wo mach ansonsten den Gedankenfehler.

gruß,
Bjoern


von Gerd (Gast)


Lesenswert?

volatile U8 temp; was ist U8 ?

von Bjoern B. (tishima)


Lesenswert?

Siehe Zeile 6  sollte ein unsigned Char sein laut typedef.

gruß,
Bjoern

von Karl heinz B. (kbucheg)


Lesenswert?

> Wenn temp den Wert 0 annimmt tritt ein Fehler auf.

Ja logisch.
Das Arrayelement adcbuffer[-1] existiert nicht.
Also kannst du dort auch nicht zugreifen um den
Wert von dort zu lesen.

Auch wenn temp den Datentyp unsigned char hat, so werden
arithmetische Ausdrücke in C immer als int (oder long)
durchgeführt. Mit anderen Worten, dein temp-1
wird gerechnet als
   ((unsigned int)temp)-1)


von Gerd (Gast)


Lesenswert?

char U8;
volatile U8 temp; kann temp so deklariert werden? wär mir neu

von Karl heinz B. (kbucheg)


Lesenswert?

Er sagt doch er hat einen typedef dafür.

typedef unsigned char U8;
volatile U8 temp;


von Bjoern B. (tishima)


Lesenswert?

Hmm, kann ich in C den arithmetischen Ausdrücken irgenwie dazu zwingen 
ein unsigned char zu sein. Sonst muss ich mein ganzen Programm nochmal 
abaendern, son mist.

gruß,
Bjoern

von Karl heinz B. (kbucheg)


Lesenswert?

Du kannst probieren:

   buffer [ ( temp - 1 ) & 0xFF ];

Das müsste auf jeden Fall gehen.
Wenn du Glück hast, dann ist der Compiler schlau genug,
rauszufinden dass dadurch die Erweiterung auf unsigned int völlig
sinnlos ist und er lässt es bleiben (zwecks Laufzeit).

von Bjoern B. (tishima)


Lesenswert?

@Karl Heinz

Der Compiler scheint schlau genug zu sein.
Da im eigentlichen Programm der Fall das temp 0 wird nur sehr sellten 
vorkommt, muss ich das aber noch weiter beobachten.

danke,
Bjoern




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.