wie Zeiger richtig deklarieren

OP #2855668
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
  }
}
OP #2855747
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...
Gast #2855749
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...
Gast #2855750
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

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