Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » [C] Böse gecastet oder liegt das Problem ganz woanders ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
21.08.2007, 21:13 Uhr
cfx



Hi ho,
ich bin da kürzlich mal wieder auf was gestoßen:


C++:
#include <stdio.h>

unsigned char test;

int
main ()
{
    unsigned char test2;

    printf ("Wert (0-255): ");
    scanf ("%d", (int *) &test);

    printf ("Wert2 (0-255): ");
    scanf ("%d", (int *) &test2); // <- funzt nicht

    return 0;
}



Man erkennt vielleicht schon, was ich vorhabe.
Ich dachte mir, ich schraub einfach mal diesen "immensen" Speicherbedarf von Int auf 1 Byte runter. Tja, ich weiß zwar nicht, ob man so wild casten darf, aber bei der globalen Deklaration funktioniert's, bloß bei der lokalen krieg ich immer einen Speicherzugriffsfehler ... und da kommt ihr ins Spiel !

Aber mal angenommen, dieser "verrückte" Cast geht wirklich nicht, könntet ihr mir dann sagen, wie ich sonst eine Variable mit einem Speicherbedarf von einem Byte verwende ? Ein Bitfeld geht nicht, da er sich die Speicheradresse nicht merkt.

Ich verwende übrigens den gcc 4.1.2

Freue mich auf Antworten !
Gruß cfx
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.08.2007, 21:18 Uhr
xXx
Devil


hmm ... sollte beides nicht gehen oO ... bzw nicht ganz

C++:
#include <cstdio>

unsigned char test1 = 'B';

int main ()
{
    unsigned char test2 = 'A';

    std::printf ("Wert (0-255): ");
    std::scanf ("%d", static_cast<int>(test1));

    std::printf ("Wert2 (0-255): ");
    std::scanf ("%d", static_cast<int>(test2));
}
...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.08.2007, 21:31 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von xXx:
hmm ... sollte beides nicht gehen oO ... bzw nicht ganz

C++:
#include <cstdio>

unsigned char test1 = 'B';

int main ()
{
    unsigned char test2 = 'A';

    std::printf ("Wert (0-255): ");
    std::scanf ("%d", static_cast<int>(test1));

    std::printf ("Wert2 (0-255): ");
    std::scanf ("%d", static_cast<int>(test2));
}
...

erstens falsch und zweitens C++ und kein C ...


C++:
scanf ("%d", (int *) &test2); // <- funzt nicht


was genau funzt denn da nicht?
Ich tippe mal darauf das du durch dein vorheriges scanf noch weitere Zeichen (z.b das "Enter") im Eingabepuffer hast.

Ansonsten passt in ein char nur 8bit daten, wenn dir -128/+127 bzw 0-255 reichen, dann ist das kein Problem, ansonsten musst du einen größeren datentyp nehmen.
Mal abgesehen davon das auf nem 32bit rechner normalerweise die 32bit arithmetik noch am schnellsten ist als wenn er kleinere datentypen verarbeitet (bzw die kleineren dann doch wieder intern erstmal vergrößert zum verarbeiten)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.08.2007, 22:27 Uhr
Kest
saint


Hi!


Zitat von FloSoft:

Ich tippe mal darauf das du durch dein vorheriges scanf noch weitere Zeichen (z.b das "Enter") im Eingabepuffer hast.


>scanf< überliest Enter.


C++:
scanf ("%d", (int *) &test2);


alle Zeiger haben immer dieselbe Größe, >(int *)< ist entbehrlich; das Umwandlungszeichen bestimmt wie die Eingabe gespeichert wird.

Was du machen wolltest, geht, glaube ich, so:

C++:
scanf ("%hhu", &test2);


--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 21.08.2007 um 22:38 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.08.2007, 22:32 Uhr
xXx
Devil


Ähm weiß zwar net warum du so gereitz reagierst ... aber was meinst du denn sei falsch @ FloSoft?

Er wollte, so wie ich das verstanden hab den Wert und nicht die Adresse ausgeben ... in seinem Beispiel tut er das aber ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.08.2007, 22:33 Uhr
Kest
saint


>scanf< erwartet einen Zeiger.

C++:
static_cast<int>(test1));


kein Zeiger.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.08.2007, 22:42 Uhr
xXx
Devil


Ups ... sorry ... ich hab halt diese C-Funktionen nie genutzt ... stimmt ... scanf war ja zum einlesen ... dann hast du natürlich recht. Hatte an Ausgabe gedacht ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.08.2007, 23:02 Uhr
0xdeadbeef
Gott
(Operator)


Das kann in beiden Fällen segfaulten, weil dein Ziel - ein char - weniger Speicherbereich zur Verfügung stellt, als %d verlangt - das heißt, er schreibt irgendwo in die Wallachei, oder noch schlimmer, auf den Stack und über andere Variablen bzw. den Rückgabewert oder die Rücksprungadresse. Du kommst nicht drumherum, für %d sizeof(int) Byte Speicher zu übergeben, sonst ist das Verhalten undefiniert.

Was geht, ist

C++:
short x;

scanf("%hd", &x);


aber auf ein Byte kriegst du's, soweit ich weiß, nicht runter. Im Übrigen interessiert es scanf nicht, ob da jetzt ein char* oder ein int* übergeben wird, das weiß der innerhalb der Funktion eh nicht mehr.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 21.08.2007 um 23:03 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.08.2007, 23:41 Uhr
Kest
saint



Zitat von 0xdeadbeef:

aber auf ein Byte kriegst du's, soweit ich weiß, nicht runter.


Schwachsinn.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.08.2007, 23:43 Uhr
Kest
saint


Ich mein, dafür unterstützt ein 99-Compiler >hh< als Längenangabe.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: