Forum: Compiler & IDEs Warnung "incompatible pointer type"


von Michi (Gast)


Lesenswert?

Wie kommt es zu dieser Warnung?

warning: passing argument 2 of 'rtcc_to_ascii' from incompatible pointer 
type
1
#define ADDR_HOUR 0x01
2
char Buffer[15];
3
char tmp=0x02;
4
5
rtcc_to_ascii(tmp,&Buffer,ADDR_HOUR);

1
void rtcc_to_ascii(char tmp, char *Buffer, char mask) {
2
3
4
}

von Peter II (Gast)


Lesenswert?

weil &Buffer falsch ist, entweder &Buffer[0] oder Buffer.

von Floh (Gast)


Lesenswert?

Michi schrieb:
> rtcc_to_ascii(tmp,&Buffer,ADDR_HOUR);

Bei einem Array ist der Name bereits eine Adresse, also gits zwei 
Möglichkeiten:

direkt:
rtcc_to_ascii(tmp, Buffer ,ADDR_HOUR);

und Adresse des ersten Feldes:
rtcc_to_ascii(tmp, &Buffer[0] ,ADDR_HOUR);

:-)

von Matthias (Gast)


Lesenswert?

Wobei ich lieber statt

"rtcc_to_ascii(tmp, &Buffer[0] ,ADDR_HOUR);"

die Variante

"rtcc_to_ascii(tmp, &(Buffer[0]) ,ADDR_HOUR);"

bevorzugen würde ;-)

von Michi (Gast)


Lesenswert?

aaah Danke!

was veraendert die () um &(Buffer[0]) ?

von Peter II (Gast)


Lesenswert?

Matthias schrieb:
> Wobei ich lieber statt
> die Variante
> bevorzugen würde ;-)
warum - schreibst du gerne Klammern?

von Peter II (Gast)


Lesenswert?

Michi schrieb:
> was veraendert die () um &(Buffer[0]) ?

nichts. Aus dem Grund stand sie auch nicht da.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jeder C-Programmierer, der das Zeigerkonzept erstmal verstanden
hat, wird aber einfach nur "Buffer" schreiben statt dieser
unsäglichen Verrenkungen. ;-)  Es dauert auch nicht lange, da kann
man diese Schreibweise dann deutlich besser lesen.  Da schreibt man
dann auch "Buffer + 2", wenn man einen Zeiger auf das zweite
Element von Buffer weitergeben will, statt irgendwelcher krückiger
"&Buffer[2]". :)

Das Kapitel "Pointer and Arrays" hat eine relativ zentrale Bedeutung
im Verständnis und der Beherrschung der Sprache C.  Es sei jedem
angeraten, die Details verstanden zu haben, statt das jedesmal per
trial&error zu implementieren.

von Michi (Gast)


Lesenswert?

> Das Kapitel "Pointer and Arrays" hat eine relativ zentrale Bedeutung

Deshalb C Buch besorgt :-)


Buffer+1 wäre meine nächste Frage gewesen.
1
itoa(tmp,Buffer+1,10);
Ist das erlaubt wenn man das erste Zeichen wegschneiden möchte?

Vielen Dank

von Peter II (Gast)


Lesenswert?

Michi schrieb:
> Ist das erlaubt wenn man das erste Zeichen wegschneiden möchte?

ja warum auch nicht?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Michi schrieb:

> Ist das erlaubt wenn man das erste Zeichen wegschneiden möchte?

Genauer: das erste Element des Arrays.  Das ist nicht zwingend nur
ein Byte, wenn die Elemente größer sind, werden Zeigeradditionen in
der Größe der Elemente vorgenommen.

von Matthias (Gast)


Lesenswert?

Also meiner Meinung nach, lässt sich die "Verrenkung" besser lesen.
Aber das dürfte von den Gewohnheiten des jeweiligen Programmierers 
abhängen.

Wenn "&(Buffer[2])" da steht, dann lese ich das als "Adresse des 
Elements mit Index 2" von dem Array.
Der Compiler mach natürlich intern auch nur ein "Buffer+2" und
Buffer ist ja auch "nur" ein Zeiger auf das erste Element des
Arrays.

Aber wie schon gesagt, das ist Geschmackssache...

@Jörg
>>dann auch "Buffer + 2", wenn man einen Zeiger auf das zweite
Ist das nicht das 3. Element?

(Index[0] = 1. Element, Index[1] = 2. Element und Index[2] = 3. Element)

Genau deswegen schreibe ich das als Index. (auch wenn es eine Verrenkung 
ist)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Matthias schrieb:

>>>dann auch "Buffer + 2", wenn man einen Zeiger auf das zweite
> Ist das nicht das 3. Element?

Ja, latürnich.  Zu schnell hingeschrieben.

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.