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;
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.
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
"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.
> 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)?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.