Forum: Compiler & IDEs Zeiger-Problem


von gasti (Gast)


Angehängte Dateien:

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;

von gasti (Gast)


Angehängte Dateien:

Lesenswert?

das letzte File

von Mark B. (markbrandis)


Lesenswert?

Einem Zeiger weist man eine Adresse zu. Also z.B.:

1
Ptr_Reg = &Adr_Reg;

von Karl H. (kbuchegg)


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.

von gasti (Gast)


Lesenswert?

Hi,

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

von frueher (Gast)


Lesenswert?

1000 POKE Ptr_Reg, PEEK(Adr_Reg)

hrr hrrrrr HRRRRRRRRR

von Karl H. (kbuchegg)


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.

von Matthias L. (Gast)


Lesenswert?

>1000 POKE Ptr_Reg, PEEK(Adr_Reg)

das ist kein C64...

von Karl H. (kbuchegg)


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
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)

von Stefan E. (sternst)


Lesenswert?

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;

von Karl H. (kbuchegg)


Lesenswert?

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.

von gasti (Gast)


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.

von gasti (Gast)


Lesenswert?

Fehler: argument 3 für die Warnung

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


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

von gasti (Gast)


Lesenswert?

ich bekomme die selbe Warnung

von gasti (Gast)


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

von Karl H. (kbuchegg)


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.

von ... (Gast)


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
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
Noch kein Account? Hier anmelden.