Hallo zusammen! Ich versuche gerade einen Code im Simulator des AVR Studio 6.1 laufen zu lassen. Dabei ist mir aufgefallen, dass meine Schleifenvariablen immer mit dem Wert 0 angezeigt werden. Auch nach einem oder zwei Durchläufen hab ich hier immer noch die Null stehen. Trotzdem springt der Simulator aber nach der benötigten Anzahl der Schleifendurchläufe aus der Schleife raus! Ich habe bereits die Optimierungseinstellungen des Compilers ganz ausgeschlatet. Aber die Schleifenvariablen sind und bleiben bei Null! Weiß zufällig jemand hier woran es liegen könnte? Gruß Andreas
Ich habe eine Hose. Meine Freundin findet sie schön. Was meinst DU?
Ihr Schlaumeier! Es hat nichts mit dem Code zu tun! Sondern wird an irgendwelchen Einstellungen liegen Aber bitte...... hier ist die For-Schleife um die es geht:
1 | int i; |
2 | int spalte; |
3 | int zeile; |
4 | Matrix_3x3 invMatrix; |
5 | double HM[5][5]; |
6 | |
7 | //Erstellen einer 5x5 Hilfsmatrix
|
8 | for(zeile=0; zeile<3; zeile++){ |
9 | for(spalte=0; spalte<3; spalte++){ |
10 | HM[spalte][zeile]=M1.data[spalte][zeile]; |
11 | }
|
12 | }
|
13 | .
|
14 | .
|
15 | .
|
Matrix_3x3 ist eine struct-Variable die per typdef definiert ist und hat in data ein 3x3 Aray.
Grad bei so kurzen Schleifen kann sich der Compiler überlegen, einfach die neun Zuweisungen hintereinander zu schreiben (loop unrolling). Compilier mit -O0 um dir das anzuschauen...
Ich hab doch schon in meinem Post geschrieben, dass ich die Optimierung ganz ausgeschaltet hab! Ich hab also schon mit -O0 compiliert! Daran liegt es nicht! Andreas S. schrieb: > Ich habe bereits die Optimierungseinstellungen des Compilers ganz > ausgeschlatet. Aber die Schleifenvariablen sind und bleiben bei Null! > Weiß zufällig jemand hier woran es liegen könnte?
Andreas S. schrieb: > Daran > liegt es nicht! Aber er beschreibt die richtigen Array-Felder, korrekt? d.H. es wird garantiert irgendwo irgendwie richtig gezählt, nur dein Simulator/Debugger zeigt das nicht an. Ich würde an der Stelle einfach dem Compiler vertrauen. Wenn der eine dumme 0…2-For-Schleife nicht hinkriegen würde, wäre das bestimmt schon jemandem aufgefallen... Versuchs vielleicht noch mit Volatile an deinen Schleifenzählern, wenn du wirklich unbedingt beim zählen zuschauen willst. Ansonsten: Bugs im Debugger/Simulator sind *viel, viel* warscheinlicher als Bugs im Compiler.
Deklariere mal die Variablen zusätzlich mit
1 | volatile
|
Wie du mit der Schleife allerdings eine 5x5 Matrix erstellen willst, musst du mir noch erklären.
Martin Kreiner schrieb: > Deklariere mal die Variablen zusätzlich mitvolatile Hatte ich auch schon probiert --> gleiches Ergebnis! Martin Kreiner schrieb: > Wie du mit der Schleife allerdings eine 5x5 Matrix erstellen willst, > musst du mir noch erklären. Die Punkte in meinem Code deuten an, dass die Funktion da noch weiter geht! Mittlerweile habe ich noch ein bisschen rum probiert und festgestellt, dass die Probleme mit den Schleifenvariablen nur dann auftauchen, wenn ich sie in einer Funktion einsetze die als Rückgabewert meinen struct haben. Also in meinem Fall die Stuktur die ich mit
1 | struct Matrix3x3{ |
2 | double data[3][3]; |
3 | double Determinante; |
4 | };
|
5 | typedef struct Matrix3x3 Matrix_3x3; |
definiert habe.
Andreas S. schrieb: > Weiß zufällig jemand hier woran es liegen könnte? Frag halt Atmel oder Microsoft, warum deren Debugger das nicht richtig anzeigt, oder schreib denen einen bug-Report. Oliver
Dann erklär nochmal dein Problem: Ist es, dass du dem (simulierten) µC beim Zählen bis drei zusehen willst, das aber nicht klappt, oder ist es, dass deine Berechnung schiefgehen, weil die Schleife nicht dreimal durchlaufen wird? Wenn ich deinen Quelltext soweit zusammenkopiere und kompiliere, dann schaut das alles problemlos & richtig aus. Kommt zwar mords-umständlicher ASM-Code bei raus (16 Bit für eine Schleifen-Zählvariable, die nur bis 3 zählt...) aber, es wird gezählt: ...
1 | .LM5: |
2 | ldd r24,Y+1 |
3 | ldd r25,Y+2 |
4 | cpi r24,3 ; <<< "spalte < 3" |
5 | cpc r25,__zero_reg__ |
6 | brge .+2 |
7 | rjmp .L4 |
8 | .stabn 68,0,16,.LM6-.LFBB1 |
9 | .LM6: |
10 | ldd r24,Y+3 |
11 | ldd r25,Y+4 |
12 | adiw r24,1 ; <<< "zeile++" |
13 | std Y+4,r25 |
14 | std Y+3,r24 |
15 | .L2: |
16 | .stabn 68,0,16,.LM7-.LFBB1 |
17 | .LM7: |
18 | ldd r24,Y+3 |
19 | ldd r25,Y+4 |
20 | cpi r24,3 ; <<< "zeile < 3" |
21 | cpc r25,__zero_reg__ |
22 | brge .+2 |
23 | rjmp .L5 |
...
Oliver schrieb: > oder schreib denen einen bug-Report. Hab ich schon gemacht! Εrnst B✶ schrieb: > aber, es wird gezählt: Sag ich ja! Nach drei Durchläufen springt er aus der Schleife! Auch wenn im Simulator die Zähvariable konstant auf NULL bleibt!
Auch wenn es schon älter ist,hatte das gleiche Problem. Man muß bei den Projekt Properties All Configurations anwählen und die Compileroptimierung ausschalten,dann sollte es funktionieren
> Man muß ... die Compileroptimierung ausschalten
Toll.
Das steht schon weiter oben, hat in diesem Fall aber nicht geholfen.
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.