www.mikrocontroller.net

Forum: Compiler & IDEs Pointer vergleichen


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wie kann ich in winavr herausfinden, ob zwei Pointer auf die gleiche 
Adresse zeigen?
Ich hab den gesamten EEPROM als Fehlerspeicher belegt
uint8_t Fehler[512] EEMEM; 
und will dann mit
if( FehlerZeiger == &Fehler[511] ) //Fehlerspeicher voll prüfung
prüfen, ob der Speicher voll ist.
Bekomme dann aber folgende Fehlermeldung: subscripted value is neither 
array nor pointer

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist FehlerZeiger definiert?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehlerzeiger ist wie folgt definiert:
uint8_t *FehlerZeiger; //Zeiger auf den letzten Fehler

Autor: PointMe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sollen denn für Werte geschrieben werden ?

Vielleicht könnte man eine Stopp-Marke ans Ende des EEPROMS schreiben 
und diese dann nach dem Inkrementieren des Pointers abfragen.

Ein Adressenvergleich sollte mit &pointer1 == &pointer2 funktionieren.

Autor: PointMe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Fehlermeldung kommt daher, weil Du eine Adresse mit einem Pointer 
vergleichst. Caste mal den Fehlerpointer dann sollte das gehen.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> sollte mit &pointer1 == &pointer2 funktionieren

Kaum.

> weil Du eine Adresse mit einem Pointer vergleichst

Was völlig i.O. ist. Eine Adresse ist ein Pointer.

> subscripted value is neither array nor pointer

Das klingt eher danach, als ob die Deklaration von Fehler[]
- nicht gesehen wird
- oder "EEPROM" unbekannt ist
- oder "Fehler" auch ein Präprozessor-Symbol ist
- oder irgendwas anderes in der Art.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der AVR hat verschiedene Adressbereiche für EEPROM und RAM, deshalb 
unterscheiden sich die Zeiger.

Dein Feld Fehler liegt im EEPROM :
uint8_t Fehler[512] EEMEM;

Dein Pointer ist aber ein "normaler" Pointer, und zeigt auf den 
RAM-Speicher:
uint8_t *FehlerZeiger;

Versuchs mal mit :
uint8_t EEMEM *FehlerZeiger;

Das sollte einen Zeiger auf EEMEM Speicher geben.

Klaus

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgendes (nicht besonders sinnvolles) kompiliert bei MCU=atmega128 ohne 
Fehlermeldung:
#include <avr/io.h>
#include <avr/eeprom.h>

uint8_t Fehler[512] EEMEM;
uint8_t * FehlerZeiger = &Fehler[0];

int main(void)
{
    if( FehlerZeiger == &Fehler[511] ) //Fehlerspeicher voll prüfung
       /* EEPROM voll */ ;   
   
    while(1)
       ;

    return 0;
}

Du solltest vielleicht die komplette Problemsource angeben.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> deshalb unterscheiden sich die Zeiger.

An sich schon. Aber GCC ist leider nicht dafür bekannt, sich um solche 
Feinheiten zu kümmern.

Die Meldung kommt auch nicht vom "==" Operator, sondern von "[]". Und 
besagt dass er auf "Fehler" nicht anwendbar ist. Was "FehlerZeiger" ist, 
interessiert zu diesem Zeitpunkt noch garnicht.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>uint8_t EEMEM *FehlerZeiger;
funktioniert leider nicht. Selbe Fehlermeldung

Hier noch mal der der Sourcecode von log.c:
#include <avr/eeprom.h>

void SchreibeFehler( uint8_t Fehler );    //Schreibt Fehler ans Ende der Liste
void LoescheFehlerSpeicher( void );  //Löscht gesamten Fehlerspeicher
void InitialisiereSpeicher( void );  //ermittelt die position des letzten fehlers

uint8_t EEMEM *FehlerZeiger;        //Zeiger auf den letzten Fehler
uint8_t Fehler[512] EEMEM;      //gesamtes EEPROM als Fehlerspeicher
uint8_t SpeicherInitialisiert = 0;  //wurde speicher initialisiert?

void InitialisiereSpeicher( void )
{
  uint8_t tmpFehler;

  SpeicherInitialisiert = 1;
  FehlerZeiger = Fehler;      //zeiger auf ersten fehler initialisieren
  
  do
  {
    tmpFehler = eeprom_read_byte( FehlerZeiger++ );  //lese fehler aus
  }
  while( tmpFehler != 0xFF );    //0xFF kein Fehler geschrieben
  
  FehlerZeiger--;
  
}

void SchreibeFehler( uint8_t Fehler )
{
  if( SpeicherInitialisiert==0 ) InitialisiereSpeicher();  //initialisiere zuerst
  
  if( FehlerZeiger == &Fehler[0] )             //Fehlerspeicher voll prüfung
    eeprom_write_byte( ++FehlerZeiger, Fehler );

}

void LoescheFehlerSpeicher( void )
{
  
  for( uint16_t i=0; i<511; i++ ){
    eeprom_write_byte( &Fehler[i], 0xFF );
  }
}

Die Funktionen werden dann von main.c aufgerufen

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void SchreibeFehler( uint8_t ==> Fehler <== )

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiers mal so
  if( FehlerZeiger == Fehler )             //Fehlerspeicher voll prüfung

sollte ansich keinen Unterschied machen. Ich könnte mir aber
vorstellen, dass das EEMAM Attribut bei Fehler da irgend
einen Unterschied bewirkt.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dann deutlicher: mit -Wshadow übersetzen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> Ok, dann deutlicher: mit -Wshadow übersetzen.

< Boing !>
(Geräusch, wenn die Stirn auf dem Tisch aufschlägt)

@Michael
Tus nicht, nenn einfach das Funktionsargument anders, so dass
der Compiler es vom globalen Array unterscheiden kann.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger:
>>Tus nicht, nenn einfach das Funktionsargument anders, so dass
>>der Compiler es vom globalen Array unterscheiden kann.

Danke. Das war die Lösung. Im nachhinein hätte man da auch von selber 
drauf kommen können. Hatte wegen der komischen Fehlermeldung aber 
garnicht drauf geachtet.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael wrote:
> Karl heinz Buchegger:
>>>Tus nicht, nenn einfach das Funktionsargument anders, so dass
>>>der Compiler es vom globalen Array unterscheiden kann.
>
> Danke.

Andreas gebühren die Lorbeeren

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.