Forum: Mikrocontroller und Digitale Elektronik Array Deklaration Problem


von Nino K. (lnino)


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

von Timmo H. (masterfx)


Lesenswert?

Welcher Compiler? Was bekommst du wenn du dir in einer schleife alle 
Werte ausgibst?

von Nino K. (lnino)


Lesenswert?

Ich verwende den GCC. Es steht immer null drin.

von Karl H. (kbuchegg)


Lesenswert?

Compilierbares komplettes Beispiel.
Da wir davon ausgehen können, dass jeder C Compiler das Initialisieren 
eines Arrays beherrscht, muss das Problem im Umfeld dieser 
Initialisierung liegen.

: Bearbeitet durch User
von Ingo (Gast)


Lesenswert?

An deinem Code ist nichts falsch, der Fehler muss woanders sein.

von Timmo H. (masterfx)


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

von Cyblord -. (cyblord)


Lesenswert?

Ingo schrieb:
> An deinem Code ist nichts falsch, der Fehler muss woanders sein.

PEBKAC

von Nino K. (lnino)


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.

von Karl H. (kbuchegg)


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.

von Nino K. (lnino)


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?

von Stefan E. (sternst)


Lesenswert?

Nino K. schrieb:
> Woran könnte das liegen?

An einem Fehler im Build-Process.
Poste das Makefile.

von Dirk B. (dirkbilland)


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.)

von Nino K. (lnino)


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

von Stefan E. (sternst)


Lesenswert?

1
  avr-objcopy -j .text -O ihex lnino_eval_board.o lnino_eval_board.hex
Da ist die Ursache deines Problems.
Keine data-Section => keine Initialisierungsdaten für das Array

von Nino K. (lnino)


Lesenswert?

Stefan Ernst schrieb:
> Keine data-Section => keine Initialisierungsdaten für das Array

Vielen Dank Stefan, das war die Lösung.

Habe nun die Zeile im Makefile angepasst, nun passen die Werte vom 
Array.

1
avr-objcopy -j .text -j .data -O ihex lnino_eval_board.o lnino_eval_board.hex

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.