Mailinglist Archive: opensuse-programming-de (140 mails)

< Previous Next >
Re: Konvertierung von unsigned char* auf signed char*
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



< Previous Next >