Probleme mit void * Funktion
-
Hi,
ich verstehe nicht, warum folgende Funktion nicht korrekt arbeitet:void func (void *Dest, void *Source, size_t Size, int Pos) { char *cDest=reinterpret_cast<char *> (Dest); char *cSource=reinterpret_cast<char *> (Source); cDest=&cDest[Pos]; for (size_t i=0; i<Size-Pos; i++) { *cDest++=*cSource++; } } int main (int argc, char **argv) { uchar Buffer[100]; uchar Source[5]= { 1, 2, 3, 4, 5 }; func (Buffer, Source, 100*sizeof (Buffer[0]), 95*sizeof (Buffer[0])); for (int i=0; i<5; i++) cout << Buffer[95+i] << endl; return 0; }
Er gibt überhaupt nichts auf dem Bildschirm aus. Was mache ich falsch?
Ich vermute mal, das ist ein Segmentation Fault, allerdings weiß ich das nicht weil das Testprogramm auf KDevelop auch bei unzulässigen Zugriffen regulär und ohne Fehlermeldung abbricht.
-
Hallo,
hast du dir mal die Zeichen angeguckt, die 1,2,3,4,5 in der ASCII Tabelle darstellen?!
-
unter VC ++ funzt es .... fast ....
- naja, wenn ich statt uchar unsigned char nehme gehts.
was ist denn uchar bei Dir fuern datentyp ? ist der groesser wie char ? (sollte aber nen unsigned char sein, also genau so gross ...)- du gibst nicht ascii zeichen auf der konsole aus, vielleicht strikt deine console ....
- warum nimmst du fuer sizeof nicht den datentyp direkt ? also sizeof(char) und sizeof(uchar), anstatt sizeof(buffer[i]) ???
Ciao ...
-
oh gott, wie peinlich
Ja, jetzt kommt was raus. Aber die Zahlen stimmen nicht ganz:
cout << Buffer[95+i]+'0';
Ausgabe: 49, 50, 51...
Warum wird uchar implizit in int umgewandelt, obwohl ich '0' addiere?
-
- du gibst nicht ascii zeichen auf der konsole aus, vielleicht strikt deine console ....
Negativ, 1,2,3,4,5 sind non printing characters:
http://web.cs.mun.ca/~michael/c/ascii-table.htmlKein Wunder, dass er nix sieht.
-
@RHBaum:
uchar ist offensichtlicherweise ein typedef auf unsigned charich schreibe aus Prinzip immer sizeof (Variable), weil ich vielleicht irgendwann den Datentyp ändern könnte und auch weil ich nicht immer nachschauen will, welchen Datentyp den die entsprechende Variable hat. In diesem Fall könnte ich das aber natürlich weglassen, da sizeof (char bzw uchar) eh 1 ist.
-
@CartsenJ ... Aehm Asche auf mein Haupt ! meinte ich auch so ... Es sind ascii zeichen nur ned fuer die anzeige aufn screen bestimmt
@Randa
fuer den compiler isses eigentlich egal ... er loesst eh zur laufzeit auf ...
aber irgendwie siehts ein bisserl unsauber auswenn du daten hasst, wo du den datentyp ned 100% weisst, solltest du zumindest typdefs nehmen, dazu sind die unter anderem auch da ...
dann kannst auch den datentyp an einer stelle aendern .... und du bekommst noch ne menge anderen komfort
Bei sizeof geht der spass noch, bei casts dann schon nimmernaja, und zu faul zum nachschauen ... ist glaub ich ned wirklich nen argument oder ?
Ciao ...
-
RHBaum schrieb:
fuer den compiler isses eigentlich egal ... er loesst eh zur laufzeit auf ...
aber irgendwie siehts ein bisserl unsauber ausDas ist schon richtig, aber ich habe keine andere Wahl.
wenn du daten hasst, wo du den datentyp ned 100% weisst, solltest du zumindest typdefs nehmen, dazu sind die unter anderem auch da ...
Hä?
Also natürlich, ich kann, wenn ich ein typedef ändere, überall, wo das typedef benutzt wird, ebenfalls den datentyp ändern, aber das ist ja nicht die lösung, um zur Laufzeit für verschiedene Datentypen zu arbeiten.
Normalerweise benutzt man ja templates, aber wie gesagt, nicht zur runtime.