AnsiString und sein Data Pointer



  • Hallo,
    mich interessiert einmal eure Meinung zum Stil folgender Konstruktion, über die ich gerade gestolpert bin:
    Es handelt sich um ein Codesnippet aus dem Beispiel zu TCommThread:

    if(AvailableBytes>0)
    {
        ReceivedData.SetLength(AvailableBytes); 
        if(ReadFile(DeviceHandle,(void*)ReceivedData.data(),AvailableBytes,&ReadBytes,NULL)==true)
        {
        }
    }
    

    Es funktioniert, erst den AnsiString 'ReceivedData' mit SetLenght() auf ein entsprechendes Mass zu erweitern, und dann den Data Pointer an eine WIN Api Funktion zu übergeben, aber ist das stillistisch sauber programmiert?
    Würdet ihr eine solche Konstruktion in euren Programmen verwenden?



  • Hallo,

    Ich finde das weder stilistisch sauber, noch würde ich das in meinem Programm verwenden. Immerhin schreibst du hier in den internen Puffer einer Klasse der zudem auch als const deklariert ist. Allein das const sollte uns sagen, dass man hier nichts rein schreiben darf.



  • Hallo

    Es ist nur funktionstüchtig, weil sich hier auf die interne Implementation von AnsiString verlassen wird, die sinnvollerweise auch auf einen C-Array aufbaut. Darum wird das Schreiben korrekt ausgeführt.
    Sauber ist das nicht, Methoden wie c_str() und data() liefern nicht umsonst immer Zeiger auf konstante Daten zurück (Hier durch den häßlichen C-Cast vertuscht). Desweiteren wird nicht behandelt, wenn in dem ReadFile-Aufruf auch ein '\0' übertragen wird, der ja in einem AnsiString an sich nichts zu suchen hat. Hier sollte als direkter Empfänger lieber ein eigenes (dynamisches) C-Array oder ein TMemoryStream verwendet werden. Die Verarbeitung zu AnsiString sollte dann mit konformen Mittel und nur wenn nötig geschehen.

    bis bald
    akari



  • Danke,
    ich hatte ähnliche Vorbehalte gegen diese Verwendung des AnsiString, war mir bei der Bewertung aber nicht ganz sicher.


Anmelden zum Antworten