Zeiger-Problem

Gast #1487296
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;
Angehängte Dateien:
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.
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.
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
1
     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)
Karl heinz Buchegger schrieb:

> Tschuldigung. Stimmt nicht ganz. Die Entsprechung wäre
1
     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:
1
Adr_Reg = ptr_uartStruct->Uart_Mask;
Stefan Ernst schrieb:
> Karl heinz Buchegger schrieb:
>
>> Tschuldigung. Stimmt nicht ganz. Die Entsprechung wäre
>
1
>      ptr_uartStruct->Uart_Message_ID =
2
> (uint8_t)ptr_uartStruct->Uart_Mask;
3
>
>
> 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:
>
1
Adr_Reg = ptr_uartStruct->Uart_Mask;


Ack.
Da hat mich der Pointer auch schon konfus gemacht.
Gast
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.
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
Gast
"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
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.
Gast
> 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
1
**Ptr_Reg = Val_Reg;
lauten (man beachte den zweiten Stern)?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.