Autor |
Beitrag |
ShadowThief
      
Beiträge: 278
|
Verfasst: Do 24.07.03 12:51
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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Do 24.07.03 13:08
Wahrscheinlich weil die Funktion einen Pointer auf einen Speicherbereich erwartet und keinen String!
Gruß
Tino
|
|
ShadowThief 
      
Beiträge: 278
|
Verfasst: 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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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)); |
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: 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.
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
ShadowThief 
      
Beiträge: 278
|
Verfasst: Do 24.07.03 16:12
ne gefällt ihm auch net besser:
[Warnung] form_Main.pas(121): Unsicherer Typ 'Pointer'
|
|
Eisenherz
      
Beiträge: 48
|
Verfasst: 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.
_________________ aloa Eisenherz
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Do 24.07.03 17:27
hast du an das ^ gedacht?
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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".
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: 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 
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
ShadowThief 
      
Beiträge: 278
|
Verfasst: 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
      
Beiträge: 48
|
Verfasst: 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.
_________________ aloa Eisenherz
|
|
ShadowThief 
      
Beiträge: 278
|
Verfasst: 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
      
Beiträge: 48
|
Verfasst: 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.
_________________ aloa Eisenherz
|
|
ShadowThief 
      
Beiträge: 278
|
Verfasst: Fr 25.07.03 14:32
ok, mal sehn.
vielen dank einstweilen.
|
|