Array Deklaration Problem

OP #4149811
Lesenswert?

Hallo an alle,

wenn ich versuche Werte in ein Array zu schreiben, habe ich das Problem, 
dass nicht immer die Werte auch im Array stehen.

Funktioniert NICHT:
1
char level1[8] = {0, 10, 17, 21, 17, 10, 0, 0};

Funktioniert NICHT:
1
char level1[] = {0, 10, 17, 21, 17, 10, 0, 0};

Funktioniert:
1
char level1[8];
2
 
3
level1[0]=0; 
4
level1[1]=10; 
5
level1[2]=17; 
6
level1[3]=21; 
7
level1[4]=17; 
8
level1[5]=10; 
9
level1[6]=0; 
10
level1[7]=0;

Nur bei der letzten Variante befinden sich die Werte auch im Array wenn 
ich diese zum Beispiel am Display ausgebe. Woran könnte das liegen? Die 
anderen Varianten müssten doch auch gehen, oder?

lg Nino
#4149847
Lesenswert?

Also mit GCC 4.7.1 macht folgender Code:
1
int main()
2
{
3
    int i;
4

5
    int level1[8] = {20,30,40,50,60,70,80,90};
6
    int level2[] = {21,31,41,51,61,71,81,91};
7
    int level3[8];
8

9
    level3[0] = 22;
10
    level3[1] = 32;
11
    level3[2] = 42;
12
    level3[3] = 52;
13
    level3[4] = 62;
14
    level3[5] = 72;
15
    level3[6] = 82;
16
    level3[7] = 92;
17

18

19
    for(i = 0; i < 8; i++)
20
        printf("Level1[%d]: %d\n", i , level1[i]);
21
    for(i = 0; i < 8; i++)
22
        printf("Level2[%d]: %d\n", i , level2[i]);
23
    for(i = 0; i < 8; i++)
24
        printf("Level3[%d]: %d\n", i , level3[i]);
25

26
    return 0;
27
}
wie erwartet folgende Ausgabe
1
Level1[0]: 20
2
Level1[1]: 30
3
Level1[2]: 40
4
Level1[3]: 50
5
Level1[4]: 60
6
Level1[5]: 70
7
Level1[6]: 80
8
Level1[7]: 90
9
Level2[0]: 21
10
Level2[1]: 31
11
Level2[2]: 41
12
Level2[3]: 51
13
Level2[4]: 61
14
Level2[5]: 71
15
Level2[6]: 81
16
Level2[7]: 91
17
Level3[0]: 22
18
Level3[1]: 32
19
Level3[2]: 42
20
Level3[3]: 52
21
Level3[4]: 62
22
Level3[5]: 72
23
Level3[6]: 82
24
Level3[7]: 92
OP #4150106
Lesenswert?

Ich habe nun den Fehler gefunden. War echt gut versteckt.
Im Makefile meines projektes und der libraries hatte ich -Os stehen und 
wie es scheint hat das nach dem Update der AVR Toolchain und WinAVR 
etwas zu viel beschnitten.

Nachdem ich die makefiles auf -O0 geändert habe, funktioniert diese 
Zuweisung wieder.

Echt seltsam. Habe es auch nur durch Zufall gefunden, da ich zeitgleich 
nach dem Update Probleme mit dem Display hatte.
#4150119
Lesenswert?

Nino K. schrieb:

> Nachdem ich die makefiles auf -O0 geändert habe, funktioniert diese
> Zuweisung wieder.

Das ist keine Zuweisung, sondern eine Intialisierung.

Und mit dem Abschalten des Optimizers hast du nur den eigentlichen 
Fehler versteckt aber nicht beseitigt. Drinn ist er immer noch, nur gibt 
es jetzt keinen Optimizer mehr, der ihn gnadenlos ausnutzen würde.
OP #4150129
Lesenswert?

Hi Karl Heinz,

da muss ich die leider recht geben. Denn in einem anderen Zusammenhang 
funktioniert es wieder nicht. :-(

Dieser Code funktioniert. Da habe ich wieder zeilenweise das Array 
befüllt. Es wird am Display ein Ball angezeigt.
1
#define F_CPU 14745600
2
 
3
#include <stdio.h>
4
 
5
#include <avr/io.h>
6
#include <avr/pgmspace.h>
7
 
8
#include <inttypes.h>
9
#include <string.h>
10
 
11
#include <util/delay.h>
12
#include "../libnerdkits/delay.h"
13
#include "../libnerdkits/lcd.h"
14

15
int main(void) {
16

17
  // Local Variables  (The Arrays haven been set to a size of 12 to increase afterwards)
18

19
  char level1[8];
20
  
21
  level1[0]=0;
22
  level1[1]=10;
23
  level1[2]=17;
24
  level1[3]=21;
25
  level1[4]=17;
26
  level1[5]=10;
27
  level1[6]=0;
28
  level1[7]=0;
29

30
  int i = 0;
31

32
  // fire up the LCD
33
  lcd_init();
34
  lcd_home();
35

36
lcd_set_type_command();     // Change into command mode
37
lcd_write_byte(0x40);       // Change to CGRAM to store custom character - at 0x00
38
lcd_set_type_data();        // Change into data mode
39

40
for (i=0; i<8; i++)
41
{
42
    lcd_write_byte(level1[i]);
43
}
44

45
lcd_set_type_command();     // Change into command mode
46
lcd_write_byte(0x80);       // Change to DDRAM
47

48
lcd_set_type_data();
49
lcd_write_byte(0x00);       // Show stored custom character on lcd screen
50

51
  // busy loop
52
  while(1) {
53

54
  // do nothing
55
  }
56

57
  return 0;
58
}

Aber der folgende Code funktioniert nicht. Es wird am Display ein 
Kästchen komplett ausgefüllt. Ich habe lediglich die Befüllung des 
Arrays geändert.
1
#define F_CPU 14745600
2
 
3
#include <stdio.h>
4
 
5
#include <avr/io.h>
6
#include <avr/pgmspace.h>
7
#include <inttypes.h>
8
 
9
#include <string.h>
10
 
11
#include <util/delay.h>
12
#include "../libnerdkits/delay.h"
13
#include "../libnerdkits/lcd.h"
14

15
int main(void) {
16

17
  // Local Variables  (The Arrays haven been set to a size of 12 to increase afterwards)
18

19
  int level1[8] = {0,10,17,21,17,10,0,0};
20

21
  int i = 0;
22

23
  // fire up the LCD
24
  lcd_init();
25
  lcd_home();
26

27
lcd_set_type_command();     // Change into command mode
28
lcd_write_byte(0x40);       // Change to CGRAM to store custom character - at 0x00
29
lcd_set_type_data();        // Change into data mode
30

31
for (i=0; i<8; i++)
32
{
33
    lcd_write_byte(level1[i]);
34
}
35

36
lcd_set_type_command();     // Change into command mode
37
lcd_write_byte(0x80);       // Change to DDRAM
38

39
lcd_set_type_data();
40
lcd_write_byte(0x00);       // Show stored custom character on lcd screen
41

42
  // busy loop
43
  while(1) {
44

45
  // do nothing
46
  }
47

48
  return 0;
49
}

Woran könnte das liegen?
#4150484
Lesenswert?

>Ich habe lediglich die Befüllung des
Arrays geändert.

Nur ein Hinweis: Du hast mehr geändert: Du hast den Typ von level1 von 
char nach int geändert. Das kann der entscheidene Unterschied sein.

Schau Dir mal eventuelle Warnings an. Auch ein Blick ins Mapping-File 
könnte sachdienliche Hinweise liefern (welche Variablen liegen 
vor/hinter dem betroffenen Array, welcher Code greift auf diese zu, 
usw.)
OP #4150852
Lesenswert?

Stefan Ernst schrieb:
> An einem Fehler im Build-Process.
> Poste das Makefile.

Anbei mein makefile:
1
GCCFLAGS=-g -Os -Wall -mmcu=atmega168 
2
LINKFLAGS=-Wl,-u,vfprintf -lprintf_flt -Wl,-u,vfscanf -lscanf_flt -lm
3
AVRDUDEFLAGS=-c avr109 -p m168 -b 115200 -P COM8
4
LINKOBJECTS=../libnerdkits/delay.o ../libnerdkits/lcd.o ../libnerdkits/uart.o
5

6
all:  lnino_eval_board-upload
7

8
lnino_eval_board.hex:  lnino_eval_board.c
9
  make -C ../libnerdkits
10
  avr-gcc ${GCCFLAGS} ${LINKFLAGS} -o lnino_eval_board.o lnino_eval_board.c ${LINKOBJECTS}
11
  avr-objcopy -j .text -O ihex lnino_eval_board.o lnino_eval_board.hex
12
  
13
lnino_eval_board.ass:  lnino_eval_board.hex
14
  avr-objdump -S -d lnino_eval_board.o > lnino_eval_board.ass
15
  
16
lnino_eval_board-upload:  lnino_eval_board.hex
17
  avrdude ${AVRDUDEFLAGS} -U flash:w:lnino_eval_board.hex:a

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