Forum: PC-Programmierung warning: cast from pointer to integer of different size


von Maik G. (maik81ftl)


Angehängte Dateien:

Lesenswert?

Moin Moin,

Hab ein kleines Problem, wenn ich ein Zeichen eines Zeigers als 
Zahlenwert ausgeben möchte.
1
int main()
2
{
3
  char *text = Testfkt("H");
4
  printf("\n\nMoin : %s == %hu\n\n", text, (unsigned short)text);
5
  free(text);
6
}

wie warnung erhalte ich bei der Zeile
1
printf("\%s == %d\n", text, (unsigned short)text);

Ziel dieser Function soll sein, das ich den ASCII code von beliebigen 
Zeichen (Hier als Beispiel "H") 72 rausbekomme. Zugegeben, dadurch, das 
ich mit Zeiger arbeiten muß, sehe ich einfach nur das Problem, das ich 
irgendwo einen Fehler bei der Übergabe habe.

Hätte da ggf. jemand 'nen Wind mit der Haustür für mich über???

danke im Vorraus.

von Albert .. (albert-k)


Lesenswert?

Dein Fehler war bei der Übergabe des zweiten parameters. Diese müsste 
korrekt wie folgt lauten:
1
  printf("\nMoin : %s == %u\n", text, (unsigned short)*text);
Du hast nämlich den pointer auf unsignes short gecastet, nciht aber den 
inhalt.

Auch hast du das allokireren des Speichers unnötig kompliziert gemacht. 
Geht auch eifnach so:
1
  char *zeichen = (char*)malloc(strlen(sValue)+1);

von Maik G. (maik81ftl)


Lesenswert?

Albert ... schrieb:

>
1
>   printf("\nMoin : %s == %u\n", text, (unsigned short)*text);
2
>
> Du hast nämlich den pointer auf unsignes short gecastet, nciht aber den
> inhalt.
STimmt da war doch noch was. :D danke für die Holzwand

> Auch hast du das allokireren des Speichers unnötig kompliziert gemacht.
> Geht auch eifnach so:
>
1
>   char *zeichen = (char*)malloc(strlen(sValue)+1);
2
>
Hier sage ich auch danke.

und wenn ich nun den Zahlenwert in eine Valiable "x" übertragen will 
sollte dies mit
1
int x = (unsigned short)*test;
 thoereitisch laufen?

sry für die wirklich doofen fragen, aber auf sowas wird in meinem Buch, 
mit dem ich grad lerne nicht eingegangen

von Albert .. (albert-k)


Lesenswert?

1
int x = (unsigned short)*test;
Dies wird zumindest ein Warning (wenn nicht auch einen error) 
hervorrufen. Denn ein unsigned short ist kein int. Wenn du ein int haben 
willst musst du es auch zu einem int casten:
1
int x = (int)*text;
Da dies aber nicht nötig ist (die standard ASCII zZeichen passen ja in 1 
Byte) geht auch:
1
unsigned short x = (unsigned short) *text;

von Rolf Magnus (Gast)


Lesenswert?

Albert ... schrieb:
> int x = (unsigned short)*test;
> Dies wird zumindest ein Warning (wenn nicht auch einen error)
> hervorrufen.

Nein. Keins von beiden wird passieren, genausowenig wie bei:
1
int x = *test;

Albert ... schrieb:
> Da dies aber nicht nötig ist (die standard ASCII zZeichen passen ja in 1
> Byte) geht auch:unsigned short x = (unsigned short) *text;

int ist aber eher üblich. Alle Standardfunktionen, die mit einzelnen 
Zeichen arbeiten, nehmen dafür auch int (wie z.B. toupper() oder 
isalpha()).

von Maik G. (maik81ftl)


Lesenswert?

nun rolf, diese funktionen würde ich ja gerne nehmen, wenn diese den für 
mich nötigen zweck erfüllen würden.

auf Deutsch gesagt, ich will nur den AscII wert einer "Zeichens" 
zurückhaben und dies im
1
unsigned short
, warum ich gereade auf diesen Typ bestehe??? schau dir einfach die 
ASCII tabelle mal an.

von DirkB (Gast)


Lesenswert?

Wenn du unbedingt unsigned short nehmen willst, dann solltest du printf 
das aber auch richtig mitteilen:
1
printf("\nMoin : %s == %hu\n", text, (unsigned short)*text);
2
//                      ^ hier zeigst du short unsigned.

Maik Geßner schrieb:

> warum ich gereade auf diesen Typ bestehe??? schau dir einfach die
> ASCII tabelle mal an.
Dann reicht doch ein char (dafür ist er ja auch gedacht). Und ASCII geht 
nur bis 127. Daher reicht es auch wenn char signed ist.

int sollte dem nativen Datentyp vom System entsprechen. Damit arbeitet 
der Prozessor am schnellsten.
Wenn du Zeichen in einem Array benutzt dann nimm char, sonst int.

von Maik G. (maik81ftl)


Lesenswert?

DirkB schrieb:
> Wenn du unbedingt unsigned short nehmen willst, dann solltest du printf
> das aber auch richtig mitteilen:
nun das sind kleine sachen, welche ich schon lange entsprechend 
verändert habe. auch wenn in jedem Forum gesagt wird, das ich mit Char 
rechnen kann, rechne ich schon aus gewohnheit mit int und co.

>
1
> printf("\nMoin : %s == %hu\n", text, (unsigned short)*text);
2
> //                      ^ hier zeigst du short unsigned.
3
>
die Ausgabe via printf ist nur für Testzwecke gedacht. Beim einbau in 
die *.so-file, wird diese so oder so rausfliegen, da von der lib keine 
ausgabe in der konsolle stattfinden soll und darf.

> Maik Geßner schrieb:
>
>> warum ich gereade auf diesen Typ bestehe??? schau dir einfach die
>> ASCII tabelle mal an.
> Dann reicht doch ein char (dafür ist er ja auch gedacht). Und ASCII geht
> nur bis 127. Daher reicht es auch wenn char signed ist.

mir fällt's ehrlichgesagt irgendwo schwer den char als Zeichen und zahl 
gleichzeitig zu sehen. dies wiederstreubt sich sich zu 100% meiner 
Programmiererfahrung via fpc. noch bescheidener find ich die def. von 
char

> int sollte dem nativen Datentyp vom System entsprechen. Damit arbeitet
> der Prozessor am schnellsten.
> Wenn du Zeichen in einem Array benutzt dann nimm char, sonst int.

wenn ASCII nur bis 127 geht, dann muß ich das mal richtig stellen. in 
dem Fall kommt bei mir er erweiterte ASCII zum Einsatz.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Maik Geßner schrieb:
> wenn ASCII nur bis 127 geht, dann muß ich das mal richtig stellen. in
> dem Fall kommt bei mir er erweiterte ASCII zum Einsatz.

ASCII ist 7 Bit. Was Du mit "erweitertem ASCII" meinst, kann irgendein 
8-Bit-Zeichensatz sein, wie CP437, CP850 oder CP1252 (entspricht 
weitestgehend ISO 8859-1, "Latin 1").

Wenn Dir char nicht für ein 8-Bit-Zeichen genügt, nimm halt
unsigned char.

von Rolf Magnus (Gast)


Lesenswert?

Maik Geßner schrieb:
> mir fällt's ehrlichgesagt irgendwo schwer den char als Zeichen und zahl
> gleichzeitig zu sehen.

Ist auch eher nicht dafür gedacht. char nimmst du, um Zeichen zu 
speichern. Zum Rechnen immer explizit signed oder unsigned char oder 
halt einen der größeren Integer-Typen.

> dies wiederstreubt sich sich zu 100% meiner Programmiererfahrung via fpc.
> noch bescheidener find ich die def. von char

Was soll da "bescheiden" sein? Es ist aus Konsistenzgründen etwas 
ungeschickt, daß er nicht wie alle anderen Integer-Typen per Default 
signed sein muß, aber wenn man ihn ausschließlich zum Speichern von 
Zeichen verwendet, spielt das sowieso keine Rolle.

von Rolf Magnus (Gast)


Lesenswert?

DirkB schrieb:
> Wenn du unbedingt unsigned short nehmen willst, dann solltest du printf
> das aber auch richtig mitteilen:
> printf("\nMoin : %s == %hu\n", text, (unsigned short)*text);
> //                      ^ hier zeigst du short unsigned.

Das bringt nichts. Das kleinste, was man als Teil einer variablen 
Argumentliste übergeben kann, ist sowieso int bzw. unsigned int. Alles, 
was kleiner ist, wird zu int "befördert". Das h hat hier keinen weiteren 
Effekt.
Davon abgesehen ist es sowieso unsinnig, unsigned short zu verwenden. 
Das wird dir für neagtive Werte von *test (so dein char signed ist) auch 
noch falsche Werte ausgeben.

Wenn's vorzeichenlos sein soll, caste nach unsigned char:
1
printf("\nMoin : %s == %u\n", text, (unsigned char)*text);

von Maik G. (maik81ftl)


Lesenswert?

@rufus. Jopp wird auf die verwendung des CP1252 hinauslaufen.

Hoffe, das der bei Windows/Linux 1 zu 1 ist.

@Rolf zum rechnen verwende ich gennerell nur unsigned short. Größer 
brauch ich auch nicht gehen, da ich dem Programm schon sage, das es 
einzig und alleine max 11111111 binär nutzen darf. sollte ein Zeichen 
doch mal wiedererwartend die 255 überschreiten, muß ich das im 
sendeaufruf auf Lazarus schon im vorfeld beachten.

von Rolf Magnus (Gast)


Lesenswert?

Maik Geßner schrieb:
> @Rolf zum rechnen verwende ich gennerell nur unsigned short.

Wie gesagt: In diesem Fall führt es zu einem Fehler, sobald du mal einen 
negativen char-Wert bekommst.

> Größer brauch ich auch nicht gehen, da ich dem Programm schon sage, das
> es einzig und alleine max 11111111 binär nutzen darf. sollte ein Zeichen
> doch mal wiedererwartend die 255 überschreiten, muß ich das im
> sendeaufruf auf Lazarus schon im vorfeld beachten.

Was versprichst du dir denn davon, unsigned short zu nehmen? Wie gesagt 
wollen die meisten Funktionen sowieso mit int arbeiten, und schneller 
ist short auf dem PC auch nicht. Der Default sollte eigentlich an allen 
Stellen, an denen man nicht explizit was anderes braucht, int sein.

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.