Forum: Mikrocontroller und Digitale Elektronik AVR - Verlust von Wert in Array


von Peter K. (peter_km)


Lesenswert?

Hallo,

Ich muss Werte von einem Array in einen anderen "kopieren".
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <stdlib.h>
4
5
#include "uart.h"
6
7
uint8_t pwm[8];
8
9
void update() {
10
11
  char s_val[3];
12
13
  for ( uint8_t i = 0; i < 8; i++ ) {
14
15
    itoa(pwm[i], s_val, 10);
16
    sendString(s_val);
17
    sendString("\r\n");
18
19
  }
20
21
  sendString("\r\n");
22
  sendString("\r\n");
23
24
}
25
26
int main(void) {
27
28
  init_USART();
29
30
  //Clear screen
31
  sendString("\033[2J");
32
33
  while ( 1 ) {
34
35
    pwm[0] = 1;
36
    pwm[1] = 7;
37
    pwm[2] = 15;
38
    pwm[3] = 33;
39
    pwm[4] = 40;
40
    pwm[5] = 80;
41
    pwm[6] = 140;
42
    pwm[7] = 255;
43
44
    update();
45
    _delay_ms(1000);
46
47
    pwm[0] = 255;
48
    pwm[1] = 140;
49
    pwm[2] = 80;
50
    pwm[3] = 40;
51
    pwm[4] = 33;
52
    pwm[5] = 15;
53
    pwm[6] = 7;
54
    pwm[7] = 1;
55
56
    update();
57
    _delay_ms(1000);
58
59
  }
60
61
  return 0;
62
63
}

Dass dieser Code in der Form keinen echten Nutzen hat, ist mir bewusst, 
sei jetzt aber erst einmal egal.

Einmal pro Sekunde wird das Array per Hand umgedreht. Das überprüfe ich 
via UART. Nun aber der Output, der mich vor ein Rätsel stellt:
1
1
2
7
3
15
4
33
5
40
6
80
7
140
8
255
9
10
11
255
12
0
13
80
14
40
15
33
16
15
17
7
18
1
19
20
21
1
22
7
23
15
24
33
25
40
26
80
27
0
28
255
29
30
31
255
32
0
33
80
34
40
35
33
36
15
37
7
38
1

Wo ist die 140 ab der zweiten "Ausgabe" hin? Entweder der Compiler macht 
Müll (was ich stark bezweifle), ich sehe den Fehler einfach nicht oder 
es gibt etwas über Arrays zu wissen, dass ich noch nicht weiß.

Wenn mir jemand helfen kann, wäre ich mehr als dankbar,

LG Peter

von Juri (Gast)


Lesenswert?

Dein s-val ist einen char zu kurz? Null-character paast da nicht mehr 
rein

von Bernhard S. (b_spitzer)


Lesenswert?

Ein String belegt immer 1 Zeichen mehr, weil er mit einem NUL-Zeichen 
terminiert ist. Dein s_val[3] kann also nur Zahlen von 0-99 aufnehmen. 
Bei 255 schreibt itoa() das NUL-Zeichen irgend wo hin und trifft 
scheinbar genau pwm[1]. Dann steht 0 drin und mit mit itoa() korrekt in 
"0" umgewandelt.

Also s_val[4] und der Fehler sollte weg sein.

von Peter K. (peter_km)


Lesenswert?

Vielen Dank! Es funktioniert. Wieder einmal ein dummer Fehler, den man 
nicht sieht, aber nie weider machen wird. :/

LG Peter

von Matthias P. (matthias_p65)


Lesenswert?

Ich habe auch zweimal hinsehen müssen.

Ist eigentlich ein genialer Fehler, an dem sich so mancher C-Anfänger 
die Zähne ausbeissen wird.

Kann ich das mal so für unsere Azubis verwenden?

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.