void* vs. char*



  • Belli schrieb:

    Klingt so, als ob Wutz was anderes behauptet hätte, hat er aber doch nicht?!

    Er hat viel anderes behauptet. Lies doch einfach mal seinen Beitrag. Ich könnte schwören, dass er jemand ist, der sich tierisch was darauf einbildet, weil er etwas C kann, aber praktisch nie etwas auf die Reihe gebracht hat.



  • Wutz schrieb:

    .
    Wenn du mal 25 Jahre Erfahrungen in praktischer C Programmierung haben solltest ...

    Dann zeig mal bitte deine Referenzen. Ansonsten halte ich dich für einen Faker und Blender. Mehr nicht.

    Ich hoffe, dass ich mich täusche!



  • Naiver und durchschaubarer Versuch eines Ahnungslosen. Damit bist du hier nicht der Erste.


  • Mod

    Kritiker1 schrieb:

    Wutz schrieb:

    .
    Wenn du mal 25 Jahre Erfahrungen in praktischer C Programmierung haben solltest ...

    Dann zeig mal bitte deine Referenzen. Ansonsten halte ich dich für einen Faker und Blender. Mehr nicht.

    Ich hoffe, dass ich mich täusche!

    Also ich sehe jede Menge korrekte Aussagen von Wutz über Alignment und Zeigerhandling. Dagegen steht eine ungenaue und irrelevante Aussage über das interne Arbeiten von memcpy und eine Möchtegern-Erwiderung auf Wutz, bei der offenbar nicht einmal gelesen wurde, was Wutz geschrieben hat.

    Also für mich ist ganz klar, wer hier Kompetenz gezeigt hat und wer nur heiße Luft produziert hat (Unnötige Beleidigungen sind aus allen Richtungen gekommen). Wir reden hier von einer Sprache mit genau definierten Regeln, da braucht man keine Zeugnisse¹, um ein Argument zu untermauern. Jeder kann objektiv prüfen, ob eine Aussage richtig oder falsch ist.

    ¹: Und Hinweise auf Erfahrung, wie Wutz sie gerne macht, sind aus dem gleichen Grund irrelevant.



  • Wutz schrieb:

    Das ist natürlich Quatsch.
    Erstmal ist void* kein undefinierter Typ sondern ein definierter Typ.
    Und weiterhin ist Sinn und Zweck eines (Daten)Zeigers die Dereferenzierung,
    und da wird bei void* nun mal der originale Ausgangstyp (oder kompatibel) benötigt um type punning und damit UB zu vermeiden.
    Ausschließlich für Zwecke, bei denen der Speicher als rohe Bytefolge verarbeitet werden kann/soll, ist void* ohne Originaltypinfo ohne UB verwendbar, da hierbei mit char/signed char/unsigned char ohne strict aliasing break(d.h. ohne UB) gefahrlos gearbeitet werden kann, da void* genau das gleiche (und beste) Alignment gemäß Standard besitzt wie char/signed char/unsigned char.
    Beispiele sind memcpy,fread,fwrite

    Natürlich ist "void*" definiert, aber in der Abstraktion der Sprache 'C' ist es ein undefinierter Typ, der erst durch einen Cast seinen Typ bekommt.
    Du spricht hier von der Implementierung, natürlich sollte das ein C-Programmierer auch beachten, aber um einen Code lesbar und pflegbar zu machen, sollte man "void*" als undefiniert betrachten.
    Wenn ich keine Abstraktion will, dann sollte man Assembler verwenden...



  • ralros schrieb:

    Wenn ich keine Abstraktion will, dann sollte man Assembler verwenden...

    C ist sowas wie eine portable Assemblersprache. Recht Maschinennah und von geringem Abstraktionsgrad.



  • Futz schrieb:

    ralros schrieb:

    Wenn ich keine Abstraktion will, dann sollte man Assembler verwenden...

    C ist sowas wie eine portable Assemblersprache. Recht Maschinennah und von geringem Abstraktionsgrad.

    Das will ich ja auch nicht bestreiten, daß ist der Grund, warum ich C liebe, aber wenn man hier schon Diskussionen über "void* vs. char*" führt, dann führt man auch die Sprache C "ad absurdum"...wer solche "Probleme" hat, der soll doch bitte Assembler nutzen! 😃



  • ralros schrieb:

    Natürlich ist "void*" definiert, aber in der Abstraktion der Sprache 'C' ist es ein undefinierter Typ, der erst durch einen Cast seinen Typ bekommt.

    void* ist ein unbestimmter datentyp. undefiniert bedeutet sozusagen "existiert nicht". 🙄

    Futz schrieb:

    C ist sowas wie eine portable Assemblersprache. Recht Maschinennah und von geringem Abstraktionsgrad.

    nein c ist eine hochsprache. ich muss mich da nicht mit registern herumärgern und cpu-funktionen wie z.b. rdtsc kann ich auch nicht direkt aufrufen.



  • Wade1234 schrieb:

    ralros schrieb:

    Natürlich ist "void*" definiert, aber in der Abstraktion der Sprache 'C' ist es ein undefinierter Typ, der erst durch einen Cast seinen Typ bekommt.

    void* ist ein unbestimmter datentyp. undefiniert bedeutet sozusagen "existiert nicht". 🙄 [...]

    In der Abstraktion der Sprache schon, aber im Speicher muß eine reale Adresse existieren, in der der Zeiger gespeichert wird und da ist die Implementierung wichtig.
    Ich kann den Ansatz der Diskussion schon verstehen, aber wenn ich sehe, welchen Overhead durch andere Hochsprachen verursacht wird und auch durch Bibliotheken, dann kann man eigentlich nur den Kopf schütteln über diese Diskussion.
    Das bedeutet aber nicht, daß ich auch nicht ein Fan von effektiver Programmierung bin - ganz im Gegenteil.
    Aber vielleicht war auch der Initiator des Threads ein Troll!? 😉


  • Mod

    ralros schrieb:

    Aber vielleicht war auch der Initiator des Threads ein Troll!? 😉

    Von Seiten des Threaderstellers eine sehr nachvollziehbare Frage und auch sonst vernünftiges Verhalten. Es geriet aus der Bahn, als gewisse Möchtegernkritiker versuchten, den Thread mit Halbwissen anzureichern.

    Was mich übrigens dazu bringt: Hi Fricky/Kritiker1! Ich habe dich gewarnt, aber du konntest es ja nicht lassen. Auf nimmer Wiedersehen!


Anmelden zum Antworten