mikrocontroller.net

Forum: Compiler & IDEs Zeiger-Problem


Autor: gasti (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hi,
ich habe ein kleines Programm geschrieben. Das Programm soll Adresse und 
der Inhalt ausgeben.
Ich bekomme immer diese Warnung:
warning: assignment makes pointer from integer without a cast

wegen dieser Schreibweise: Ptr_Reg = Adr_Reg;

Autor: gasti (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
das letzte File

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einem Zeiger weist man eine Adresse zu. Also z.B.:

Ptr_Reg = &Adr_Reg;

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

Bewertung
0 lesenswert
nicht lesenswert
Wobei allerdings mehr als zweifelhaft ist, ob das dem entspricht, was 
sich der TO vorstellt.
Syntaktisch ist es auf jeden Fall korrekt.

Allerdings bin ich mir ziemlich, sicher das das Hauptprogramm nicht 
einfach nur eine Pintervariable auf so eine uart struct übergeben soll, 
sondern dass die Funktion eigentlich die Adresse einer uart struct haben 
will.
Da wartet daher schon der nächste logische Fehler.

Autor: gasti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ja hast du recht, aber ich wollte erst diese Warnung korrigiert.

Autor: frueher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1000 POKE Ptr_Reg, PEEK(Adr_Reg)

hrr hrrrrr HRRRRRRRRR

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

Bewertung
0 lesenswert
nicht lesenswert
gasti schrieb:
> Hi,
>
> ja hast du recht, aber ich wollte erst diese Warnung korrigiert.

Schön.
Ich denke allerdings, dass du damit immer noch nicht das hast, was du 
haben willst. Dein jetziger Code ist nichts anderes als eine verdammt 
komplizierte Art und Weise um

    ptr_uartStruct->Uart_Message_ID = ptr_uartStruct->Uart_Mask;

zu schreiben. Und anhand der Namen der Member denke ich nicht, dass du 
das wolltest. Aber ich kann mich auch irren.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>1000 POKE Ptr_Reg, PEEK(Adr_Reg)

das ist kein C64...

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

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> gasti schrieb:
>> Hi,
>>
>> ja hast du recht, aber ich wollte erst diese Warnung korrigiert.
>
> Schön.
> Ich denke allerdings, dass du damit immer noch nicht das hast, was du
> haben willst. Dein jetziger Code ist nichts anderes als eine verdammt
> komplizierte Art und Weise um
>
>     ptr_uartStruct->Uart_Message_ID = ptr_uartStruct->Uart_Mask;
>
> zu schreiben. Und anhand der Namen der Member denke ich nicht, dass du
> das wolltest. Aber ich kann mich auch irren.

Tschuldigung. Stimmt nicht ganz. Die Entsprechung wäre
     ptr_uartStruct->Uart_Message_ID = (uint8_t)ptr_uartStruct->Uart_Mask;

(Das grenzt schon fast an Gemeinheit, den Cast hinter ein paar 
Pointeroperationen zu verstecken)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> Tschuldigung. Stimmt nicht ganz. Die Entsprechung wäre
     ptr_uartStruct->Uart_Message_ID = (uint8_t)ptr_uartStruct->Uart_Mask;

Dem würde ich widersprechen. Wenn man in seinem Code die angewarnte 
Zeile durch das vorgeschlagene "Ptr_Reg = &Adr_Reg;" ersetzt, reduziert 
sich das Ganze eher zu:
Adr_Reg = ptr_uartStruct->Uart_Mask;

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

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> Karl heinz Buchegger schrieb:
>
>> Tschuldigung. Stimmt nicht ganz. Die Entsprechung wäre
>
>      ptr_uartStruct->Uart_Message_ID =
> (uint8_t)ptr_uartStruct->Uart_Mask;
> 
>
> Dem würde ich widersprechen. Wenn man in seinem Code die angewarnte
> Zeile durch das vorgeschlagene "Ptr_Reg = &Adr_Reg;" ersetzt, reduziert
> sich das Ganze eher zu:
>
Adr_Reg = ptr_uartStruct->Uart_Mask;


Ack.
Da hat mich der Pointer auch schon konfus gemacht.

Autor: gasti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich bin wieder da und ekläre euch was ich machen will.

Ich bekomme über uart so ein String:"WRRG 28 FF".Der String hat diese 
Bedeutung:
WRRG = Write Register
28 = Adresse = ptr_uartStruct->Uart_Message_ID
FF = der Wert = ptr_uartStruct->Uart_Mask
Was mich interessiert ist der Register und sein Inhalt.
 Adr_Reg = ptr_uartStruct->Uart_Message_ID;
 Val_Reg= ptr_uartStruct->Uart_Mask;
 Ptr_Reg = &(Adr_Reg);
 *Ptr_Reg = Val_Reg;

mit: printf("the value %x has been written in adresse %x", 
Val_Reg,ptr_uartStruct->Uart_Message_ID); bekomme ich diese Meldung:

warning: format '%x' expects type 'unsigned int', but argument 5 has 
type 'uint32_t'

mit: printf("the value %x has been written in adresse %x", 
Val_Reg,Ptr_Reg);
bekomme diese Meldung:
warning: format '%x' expects type 'unsigned int', but argument 5 has 
type 'uint8_t *'
und die Adresse stimmmt nicht.

Autor: gasti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler: argument 3 für die Warnung

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es nur um das printf geht: %lx statt des 2. %x benutzen.

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

Bewertung
0 lesenswert
nicht lesenswert
gasti schrieb:

> WRRG = Write Register

Und was sind das für Register?

Du willst doch hoffentlich nicht am Compiler vorbei irgendwelche CPU 
Register manipulieren?

> mit: printf("the value %x has been written in adresse %x",
> Val_Reg,ptr_uartStruct->Uart_Message_ID); bekomme ich diese Meldung:
>
> warning: format '%x' expects type 'unsigned int', but argument 5 has
> type 'uint32_t'

und recht hat er

Autor: gasti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bekomme die selbe Warnung

Autor: gasti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"WRRG" ist das Schlüsselwort, damit ich die Funktion void 
writeRegister(struct uartStruct *ptr_uartStruct) aufrufe.
es gibt auch ein zweites Schlüsselwort "RERG" für read Register

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

Bewertung
0 lesenswert
nicht lesenswert
gasti schrieb:
> ich bekomme die selbe Warnung

%x    ist das Formatzeichen für einen unsigned int als HEX-Ausgabe
%lx   ditto für unsigned long als HEX-Ausgabe
%p    ist das Formatzeichen für einen Pointer


Einfach das C-Lehrbuch deiner Wahl auf der Seite für die zulässigen 
Formatangaben bei printf aufschlagen und nachlesen.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ptr_Reg = &(Adr_Reg);

Ist das wirklich so gewollt?
Nach dem restlichen Text ist das dann die Adresse der Variablen, in der 
die Adresse steht?!
Sollte die Zeile darunter dann nicht wenigsten
**Ptr_Reg = Val_Reg;
lauten (man beachte den zweiten Stern)?

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.