Forum: Compiler & IDEs wie Zeiger richtig deklarieren


von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

bei meinen Übungen mit der C-Programmierung des Atmel AVR bin ich 
inzwischen bei den Pointern angekommen. Ich wolle mal die einfachen 
Beispiele aus dem angegebenen Buch ausprobieren und es hagelt 
Fehlermeldungen, die ich nicht beseitigen kann. Das erste Übungsprogramm 
soll beispielsweise mir die Inhalte mehrerer Speicherstellen auf den 
PORT ausgeben. wenn ich den Zeiger um eins erhöhe, soll die nächste 
Speicherstelle z.B. aus dem SRAM ausgegeben werden.

AVR Studio    4.18.684
AVR Simulator    1, 0, 2, 1

AVR-Studio steuert diesen GCC-Compiler:
WinAVR-20100110

Kann mir da jemand bitte mit Tipps weiterhelfen?

mit freundlichem Gruß
Röhrenvorheizer



#include <avr/io.h>                // Deklarationen
#define TAKT 1000000UL             // Controllertakt 1 MHz


unsigned char *px, x;
px = &x;
*px =1;


void main (void)
{
  while (1)
  {
    PORTB = *px;
    x++;
  }
}


/*

Build started 1.10.2012 at 21:40:45
avr-gcc  -mmcu=at90s2313 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT

Pointer_S219.o -MF dep/Pointer_S219.o.d  -c  ../Pointer_S219.c
../Pointer_S219.c:82: warning: data definition has no type or storage 
class
../Pointer_S219.c:82: warning: type defaults to 'int' in declaration of 
'px'
../Pointer_S219.c:82: error: conflicting types for 'px'
../Pointer_S219.c:81: error: previous declaration of 'px' was here
../Pointer_S219.c:82: warning: initialization makes integer from pointer 
without a cast
../Pointer_S219.c:83: warning: data definition has no type or storage 
class
../Pointer_S219.c:83: warning: type defaults to 'int' in declaration of 
'px'
../Pointer_S219.c:83: error: conflicting types for 'px'
../Pointer_S219.c:81: error: previous declaration of 'px' was here
../Pointer_S219.c:83: warning: initialization makes pointer from integer 
without a cast
../Pointer_S219.c:86: warning: return type of 'main' is not 'int'
make: *** [Pointer_S219.o] Error 1
Build failed with 4 errors and 7 warnings...

_______________________

Das da hier läßt sich direkt simulieren:
//Buch G.Schmitt Seite 260 Kapitel Funktionen 3.5.3 Die Übergabe von 
Referenzen (Adressen)

#include <avr/io.h>                // Deklarationen
#define TAKT 1000000UL             // Controllertakt 1 MHz

void test1 (char x)      //Funktion gibt argument + 1 aus
{
  PORTB = x + 1;      //Argument + 1 ausgeben
}

void test2 (char x)      //Funktion gibt Argumet + 2 aus
{
  PORTB = x + 2;      //Argument + 2 ausgeben
}

void test (void (*func) (char), char wert)  //Funktion als Argument
{
  func (wert);
}

void main (void)
{
DDRB = 0xFF;
while (1)
  {
  test(test1,1);    //Funktion test1 gibt 1+1 aus
  test(test2,1);    //Funktion test2 gibt 1+2 aus
  }
}

von dochgast (Gast)


Lesenswert?

Du versuchst Code außerhalb von Funktionen auszuführen und deine main 
hat den falschen Rückgabetyp. Allgemein ist es sehr gefährlich mit 
Pointern im Speicher rumzuwurschteln...

von Minimalist (Gast)


Lesenswert?

Christian S. schrieb:
> #define TAKT 1000000UL             // Controllertakt 1 MHz

Normalerweise definiert man dafür F_CPU, weil die delay.h damit 
arbeitet.

> unsigned char *px, x;
> px = &x;
> *px =1;

Das gehört bestimmt in die main().

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo ,

danke erstmal, so geht's jetzt. Das genügt für weitere Experimente.

Wie bekomme ich die Warnung noch weg? Ist das relevant?

Gruß Roehrenvorheizer


#include <avr/io.h>                // Deklarationen
#define F_CPU 1000000UL             // Controllertakt 1 MHz

void main (void)

{

unsigned char *px, x;
px = &x;
*px =1;


  while (1)
  {
    PORTB = *px;
    x++;
  }
}


Build started 1.10.2012 at 22:54:56
../Pointer_S219.c:86: warning: return type of 'main' is not 'int'
avr-gcc -mmcu=at90s2313 -Wl,-Map=Zeiger_S219.map Pointer_S219.o     -o 
Zeiger_S219.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature 
Zeiger_S219.elf Zeiger_S219.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 --no-change-warnings -O ihex 
Zeiger_S219.elf Zeiger_S219.eep || exit 0
avr-objdump -h -S Zeiger_S219.elf > Zeiger_S219.lss

AVR Memory Usage
----------------
Device: at90s2313

Program:      48 bytes (2.3% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)


Build succeeded with 1 Warnings...

von Muetze1 (Gast)


Lesenswert?

Dabei sagt er doch schon alles:

> warning: return type of 'main' is not 'int'

Dein Rückgabetyp von main() ist derzeit nicht "int". Wo er Recht hat, 
hat er Recht. Also schnell den Rückgabetyp der Funktion main() auf "int" 
ändern...

von Checker Bunny (Gast)


Lesenswert?

Laut ANSI Standard gibt "main" immer integer zurück.
Der Rahmen muss also wie folgt aussehen:

int main(void)
{
 ...
  return 0;
}


Statt der 0 kannst du auch einen Fehlercode zurückgeben. Das ist 
allerdings nur von Interesse, wenn die Rückgabe z.B. unter Windows von 
einem Script abgefragt wird. Beim AVR ist das rein akademisch.

Grüße
Checker Bunny

von Sauger (Gast)


Lesenswert?

Moin,

oder man macht es so:

int __attribute__((OS_main)) main(void)
{
 unsigned char *px, x;
 px = &x;
 *px =1;


 while (1)
  {
   PORTB = *px;
   x++;
  }
}

MfG

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

...oder so.
1
__attribute__ ((noreturn)) void main(void) {
2
...
3
}
 und übersetzen mit dem Schalter "-ffreestanding".

mfg

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

** Lötlackl schrieb:
> [...] und übersetzen mit dem Schalter "-ffreestanding".

Das willst du nicht wirklich.  Das hat weitaus mehr Auswirkungen als 
main zur void-Funktion zu machen.

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.