Unverständlicher Quellcode



  • Hallo,
    ich durchforste gerade ein Quellcode und mir ist da was aufgefallen womit ich nix anfangen kann.

    unsigned short *LiveFrame;
    .
    .
    .
    .
    MbufGet(MilDummyBuffer,(void*)LiveFrame);
    

    Zuerst wird *LiveFrame als unsigned short deklariert und in der Funktion MbufGet() als (void*). Was bedeutet das? Ist das ein typecast und wenn was bringt das?

    Übrigens:
    MbufGet() stammt aus der Matrox Imaging Library. Das ist einfach eine Funktion die Bilder, die in MilDummyBuffer gegrabbed wurden, in ein Benutzerdefinierten Puffer laden soll.



  • (void*) ist ein Typecast im C-Stil (den man aus diversen Gründen eigentlich nur noch Selten in C++ benutzt). Vermutlich handelt es sich bei der Bibliothek um eine C-Bibliothek (oder zumindest eine C++-Bibliothek mit einer sehr schlechten API). In C gibt es keine Möglichkeit der generischen Programmierung (templates in C++), die es einem ermöglichen erst spät zur Compile-Zeit den Typ einer Variable (=> also auch eines Parameters) festzulegen. Daher gibt es in C void-Pointer, die einfach normale Pointer sind, aber nicht spezifizieren auf was für Daten (also welchen Typs) sie zeigen. (Daher sind sie auch nicht dereferenzier oder arithmetisch veränderbar, da der Compiler bei ++p; ja nicht weiß, wie viele bytes er nun weiter gehen muss).

    Intern wird die Funktion den Pointer dann wieder in etwas für sie benutzbares casten, vermutlich unsigned char (also in Byte größe). Dann schreibt die Funktion die Daten da rein, unabhängig von dem eigentlichen Typ des Buffers. Du kennst den Buffer genauer (zB weil du gesagt hast, dass du 16 Bit Blöcke haben willst) und weißt daher diesen richtig zu interpretieren (eben als Buffer aus unsigned shorts).

    In C++ verwendet man aber idr kein void*!


Anmelden zum Antworten