Entwickler-Ecke
Dateizugriff - FileStream.Write
ShadowThief - Do 24.07.03 12:51
Titel: FileStream.Write
kann mir mal bitte jemand erklären, warum man
Delphi-Quelltext
1: 2:
| str := 'getZ'; FileStream.Write(str[1], Length(str)); |
schreiben muss, also warum str[1] ?
thx.
shadow.
Tino - Do 24.07.03 13:08
Wahrscheinlich weil die Funktion einen Pointer auf einen Speicherbereich erwartet und keinen String!
Gruß
Tino
ShadowThief - Do 24.07.03 13:44
ich frag mich nur so, warum delphi 7 bei mir da eine warnung ausgibt,
bei der zeile.
[Warnung] form_Main.pas(324): Unsicherer Code 'String index to var param'
ähm, ich möcht halt keinen unsicheren code schreiben, keine ahnung
wie ich das sicher schreiben kann, ihr?
thx.
shadow.
Motzi - Do 24.07.03 14:08
Ich weiß nicht ob das deinem Compiler besser gefällt ;) aber es ginge auch so:
Delphi-Quelltext
1:
| FileStream.Write(Pointer(str)^, Length(str)); |
tommie-lie - Do 24.07.03 14:34
Ja, das gefällt dem Compiler besser.
Und TFilestream.Write will auch keinen Pointer haben, sondern einen Buffer, den es direkt schreibt. Daher wäre auch ein Write(str, Length(str)) falsch, wenn str ein LongString ist, weil das ja nur ein Pointer ist. Mit dem Pointer(str)^hat man einen PChar, den man dereferenziert, also einen C-String ohne führender Längenbezeichnung, ohne Pointe.
ShadowThief - Do 24.07.03 16:12
ne gefällt ihm auch net besser:
[Warnung] form_Main.pas(121): Unsicherer Typ 'Pointer'
Eisenherz - Do 24.07.03 17:18
ShadowThief hat folgendes geschrieben: |
ne gefällt ihm auch net besser:
[Warnung] form_Main.pas(121): Unsicherer Typ 'Pointer' |
Ich vermute, dass du mit Delphi 7 arbeitest.
Mit Delphi 7 kann man auch Anwendungen für .NET machen. Deswegen gibt es diese Warnung. So weit ich weiß, kann man in den Projektoptionen einstellen, dass keine .NET-Warnungen ausgegeben werden sollen. Da ich selbst kein Delphi 7 habe, kann ich dir nicht genauer sagen, wo man das abstellt.
tommie-lie - Do 24.07.03 17:27
hast du an das ^ gedacht?
Motzi - Do 24.07.03 18:40
@tommie-lie: str[1] und PChar(str]^ sind eigentlich genau dasselbe! Beide Codes geben das erste Zeichen des Strings zurück! Die Methode Write nimmt einen const-Parameter, solche Parameter werden intern auch nur als Referenz übergeben, daher funzt Write(str, Length(str)) auch nicht, da ein LongString eben nur ein Pointer ist und daher nur die 4 Bytes des Pointers geschrieben werden.
Nachdem das .NET-Framework nach einem ähnlichen Prinzip wie Java funktioniert gibt es unter .NET auch keine Pointer (auch keine PChars) mehr - daher auch die Warnung "Unsicherer Typ".
tommie-lie - Do 24.07.03 19:58
Motzi hat folgendes geschrieben: |
@tommie-lie: str[1] und PChar(str]^ sind eigentlich genau dasselbe! Beide Codes geben das erste Zeichen des Strings zurück! |
Letzteres ist mir bekannt...
Ich nehm' trotzdem immer PChar(str)^ :-)
Zitat: |
daher funzt Write(str, Length(str)) auch nicht, da ein LongString eben nur ein Pointer ist und daher nur die 4 Bytes des Pointers geschrieben werden. |
Ja, das sagte ich bereits ;-)
ShadowThief - Fr 25.07.03 08:58
ok, danke für die erklärungen.
aber ..... es muss doch ne möglichkeit geben, diesen code "sicher" zu schreiben. ich halte es für keine lösung, die warnungen zu unterbinden, wenn welche kommen. wenn, dann möchte ich portablen code schreiben, ich meine, die werden sich schon was dabei gedacht haben, diese warnung rauszuhaun.
Eisenherz - Fr 25.07.03 13:26
ShadowThief hat folgendes geschrieben: |
aber ..... es muss doch ne möglichkeit geben, diesen code "sicher" zu schreiben. ich halte es für keine lösung, die warnungen zu unterbinden, wenn welche kommen. wenn, dann möchte ich portablen code schreiben, ich meine, die werden sich schon was dabei gedacht haben, diese warnung rauszuhaun. |
Ich habe mich noch nicht näher mit .NET befasst, aber ich vermute, dass es sehr schwer sein wird Code zu schreiben, der sowohl für das "normale" Windows als auch für .NET geeignet ist. Wenn du das trotzdem möchtest, dann musst du mit dem kleinsten gemeinsamen Nenner leben (was schwer sein dürfte) oder du arbeitest mit bedingter Compilierung.
Wenn du nur für das "normale" Windows entwickeln willst, dann ist es auch O.K., wenn du die .NET-Warnungen abschaltest. Besser gesagt, dann solltest du die .NET-Warnungen abschalten, da sie sonst nur unnötige Verwirrung stifften.
ShadowThief - Fr 25.07.03 13:42
es ist ja so, dass ich irgendwann vorhabe auf delphi.NET umzusteigen.
deswegen versuche ich meinen code halt dementsprechend zu schreiben.
in .NET gibt es ja die lustigste VCL immer noch, und streams sind doch
ein teil der VCL. da muss es ja wohl irgendwie gehn, oder?
auch auf die gefahr hin, dass ich euch damit jetzt n weng nerve, oder so,
aber ... dateien schreiben ist ja wohl eines der wichtigste dinge, dies so
gibt in der programmierung, und ich kann mir nicht vorstellen, dass
borland sein delphi in die .NET-familie reinschickt, wenn solche grund-
liegenden dinge nicht irgendwie, ja ähm standardisiert sind.
es ist ja so, dass viele firmen sich überlegen, von delphi auf delphi.NET
umzusteigen, und die möchten dann bestimmt nicht ihre ganzen progs
umcoden, kann ich mir denken.
artet jetzt vielleicht in ne grundsatzdiskussion aus, aber ...
ja nix aber.
sers.
shadow.
Eisenherz - Fr 25.07.03 14:23
Ich könnte mir vorstellen, dass du im Forum des Entwicklers (http://www.entwickler-forum.de/webx?13@34.m04FaUXJfXT^6@.ee6b9c4) bessere Changen hast dazu kompetente Meinungen zu hören. Dort geistert u.a. ein Autor herum, der ein Buch zun .NET und Delphi geschrieben hat.
ShadowThief - Fr 25.07.03 14:32
ok, mal sehn.
vielen dank einstweilen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!