Mailinglist Archive: opensuse-programming-de (140 mails)
| < Previous | Next > |
Re: Konvertierung von unsigned char* auf signed char*
- From: Ralf Corsepius <corsepiu@xxxxxxxxxxxxxx>
- Date: 10 Oct 2002 15:24:50 +0200
- Message-id: <1034256290.26212.550.camel@mccallum>
Am Don, 2002-10-10 um 14.38 schrieb Christian Weickhmann:
> Hallo Michael!
>
> Am Donnerstag, 10. Oktober 2002 14:08 schrieb Michael Matz:
> >
> > Irgendwie bin ich nicht sicher, ob du weisst, was du willst. Willst du ne
> > Typkonvertierung, z.B. um Funktion mit als 'char *' deklarierten
> > Argumenten, mit 'unsigned char *' Parametern aufzurufen? Dann willst du
> > einen Typecast:
>
> Das ist vielleicht nicht so ganz rübergekommen (OK, ich habe es ja nicht
> richtig hingeschrieben...): Genau dieser Typecast führt zu Müll!
>
> Wenn ich
>
> unsigned char* irgendwas = "Blablabla";
> strcpy(zielString, (const char*)irgendwas);
1. Siehe K'n'R Kapitel "Array vs. Pointer" (Auf Dtsch. Felder und
Zeiger)
Dann wahrscheinliche Lösung:
unsigned char irgendwas[] = "blablabla",
2. Ist zielString alloziert?
Wenn nein, suchst Du strdup() oder malloc.
> Was ich eben gemerkt habe ist, dass das SIGSEGV nicht an der
> Typkonvertierung liegt. Der Debugger sagte mir, dass der Fehler
> in der Zeile liegt, wo strcpy() aufgerufen wird. Ich fürchte aber,
> dass das Problem in der Klasse liegt, die strcpy aufruft.
Klasse? Reden wir hier von C++ oder von C? (C und C++ unterscheiden sich
in Zeiger/Felderbehandlung nicht unerheblich im Detail)
Reden wir hier von (es war von xmlChar die Rede) libxml und C++ mit
gcc-3.2? (In diesem Fall gäbe es noch ein weiteres Problem, das sich
u.U. auswirken könnte)
> Sieht folgendermaßen aus:
>
> Klasse sm_schueler speichert die Daten einer Person (eines Schülers)
> und stellt Funktionen zu deren Manipulation bereit.
> Will ich jetzt ein Array von solchen Objekten erzeugen, kann es dann
> der Grund für dieses SIGSEGV sein, dass ich folgendes gemacht habe:
>
> sm_schueler *s[100]; // um 100 Elemente von sm_schueler zu initialisieren...
Falls C++, nimm vector<>, map<> oder ähnliches.
> dann der Aufruf:
>
> s[0]->setName("EinName");
>
> Ist das so korrekt oder muss ich s[0] vorher noch initialisieren?
Jein, Du musst es allozieren.
Dein obiges Array erzeugt lediglich 100 Zeiger auf sm_schueler, jeden
einzelnen Schüler musst du noch allozieren und gegebenenfalls
initialisieren.
> Wenn ja,
> wie?
In C++ mit new, in C mit malloc ;)
Ralf
> Hallo Michael!
>
> Am Donnerstag, 10. Oktober 2002 14:08 schrieb Michael Matz:
> >
> > Irgendwie bin ich nicht sicher, ob du weisst, was du willst. Willst du ne
> > Typkonvertierung, z.B. um Funktion mit als 'char *' deklarierten
> > Argumenten, mit 'unsigned char *' Parametern aufzurufen? Dann willst du
> > einen Typecast:
>
> Das ist vielleicht nicht so ganz rübergekommen (OK, ich habe es ja nicht
> richtig hingeschrieben...): Genau dieser Typecast führt zu Müll!
>
> Wenn ich
>
> unsigned char* irgendwas = "Blablabla";
> strcpy(zielString, (const char*)irgendwas);
1. Siehe K'n'R Kapitel "Array vs. Pointer" (Auf Dtsch. Felder und
Zeiger)
Dann wahrscheinliche Lösung:
unsigned char irgendwas[] = "blablabla",
2. Ist zielString alloziert?
Wenn nein, suchst Du strdup() oder malloc.
> Was ich eben gemerkt habe ist, dass das SIGSEGV nicht an der
> Typkonvertierung liegt. Der Debugger sagte mir, dass der Fehler
> in der Zeile liegt, wo strcpy() aufgerufen wird. Ich fürchte aber,
> dass das Problem in der Klasse liegt, die strcpy aufruft.
Klasse? Reden wir hier von C++ oder von C? (C und C++ unterscheiden sich
in Zeiger/Felderbehandlung nicht unerheblich im Detail)
Reden wir hier von (es war von xmlChar die Rede) libxml und C++ mit
gcc-3.2? (In diesem Fall gäbe es noch ein weiteres Problem, das sich
u.U. auswirken könnte)
> Sieht folgendermaßen aus:
>
> Klasse sm_schueler speichert die Daten einer Person (eines Schülers)
> und stellt Funktionen zu deren Manipulation bereit.
> Will ich jetzt ein Array von solchen Objekten erzeugen, kann es dann
> der Grund für dieses SIGSEGV sein, dass ich folgendes gemacht habe:
>
> sm_schueler *s[100]; // um 100 Elemente von sm_schueler zu initialisieren...
Falls C++, nimm vector<>, map<> oder ähnliches.
> dann der Aufruf:
>
> s[0]->setName("EinName");
>
> Ist das so korrekt oder muss ich s[0] vorher noch initialisieren?
Jein, Du musst es allozieren.
Dein obiges Array erzeugt lediglich 100 Zeiger auf sm_schueler, jeden
einzelnen Schüler musst du noch allozieren und gegebenenfalls
initialisieren.
> Wenn ja,
> wie?
In C++ mit new, in C mit malloc ;)
Ralf
| < Previous | Next > |