Forum: Compiler & IDEs Pointer vergleichen


von Michael (Gast)


Lesenswert?

Hallo,
wie kann ich in winavr herausfinden, ob zwei Pointer auf die gleiche 
Adresse zeigen?
Ich hab den gesamten EEPROM als Fehlerspeicher belegt
1
uint8_t Fehler[512] EEMEM;
und will dann mit
1
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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wie ist FehlerZeiger definiert?

von Michael (Gast)


Lesenswert?

Fehlerzeiger ist wie folgt definiert:
1
uint8_t *FehlerZeiger; //Zeiger auf den letzten Fehler

von PointMe (Gast)


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.

von PointMe (Gast)


Lesenswert?

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

von Andreas K. (a-k)


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.

von Klaus F. (kfalser)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Folgendes (nicht besonders sinnvolles) kompiliert bei MCU=atmega128 ohne 
Fehlermeldung:
1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
4
uint8_t Fehler[512] EEMEM;
5
uint8_t * FehlerZeiger = &Fehler[0];
6
7
int main(void)
8
{
9
    if( FehlerZeiger == &Fehler[511] ) //Fehlerspeicher voll prüfung
10
       /* EEPROM voll */ ;   
11
   
12
    while(1)
13
       ;
14
15
    return 0;
16
}

Du solltest vielleicht die komplette Problemsource angeben.

von Andreas K. (a-k)


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.

von Michael (Gast)


Lesenswert?

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

Hier noch mal der der Sourcecode von log.c:
1
#include <avr/eeprom.h>
2
3
void SchreibeFehler( uint8_t Fehler );    //Schreibt Fehler ans Ende der Liste
4
void LoescheFehlerSpeicher( void );  //Löscht gesamten Fehlerspeicher
5
void InitialisiereSpeicher( void );  //ermittelt die position des letzten fehlers
6
7
uint8_t EEMEM *FehlerZeiger;        //Zeiger auf den letzten Fehler
8
uint8_t Fehler[512] EEMEM;      //gesamtes EEPROM als Fehlerspeicher
9
uint8_t SpeicherInitialisiert = 0;  //wurde speicher initialisiert?
10
11
void InitialisiereSpeicher( void )
12
{
13
  uint8_t tmpFehler;
14
15
  SpeicherInitialisiert = 1;
16
  FehlerZeiger = Fehler;      //zeiger auf ersten fehler initialisieren
17
  
18
  do
19
  {
20
    tmpFehler = eeprom_read_byte( FehlerZeiger++ );  //lese fehler aus
21
  }
22
  while( tmpFehler != 0xFF );    //0xFF kein Fehler geschrieben
23
  
24
  FehlerZeiger--;
25
  
26
}
27
28
void SchreibeFehler( uint8_t Fehler )
29
{
30
  if( SpeicherInitialisiert==0 ) InitialisiereSpeicher();  //initialisiere zuerst
31
  
32
  if( FehlerZeiger == &Fehler[0] )             //Fehlerspeicher voll prüfung
33
    eeprom_write_byte( ++FehlerZeiger, Fehler );
34
35
}
36
37
void LoescheFehlerSpeicher( void )
38
{
39
  
40
  for( uint16_t i=0; i<511; i++ ){
41
    eeprom_write_byte( &Fehler[i], 0xFF );
42
  }
43
}

Die Funktionen werden dann von main.c aufgerufen

von Andreas K. (a-k)


Lesenswert?

void SchreibeFehler( uint8_t ==> Fehler <== )

von Karl H. (kbuchegg)


Lesenswert?

Probiers mal so
1
  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.

von Andreas K. (a-k)


Lesenswert?

Ok, dann deutlicher: mit -Wshadow übersetzen.

von Karl H. (kbuchegg)


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.

von Michael (Gast)


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.

von Karl H. (kbuchegg)


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

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.