Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 08, 2025 23:23

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Streams
BeitragVerfasst: So Dez 17, 2006 23:22 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
Da ich momentan am ausprobieren bin von streams, würde ich gerne wüssen, wie ich mehrere (unbekannte) Parameter übergeben kann, die als var übergeben werden.
Ich möchte eigentlich den Effekt hinbringen von write() und read(), in der Konsole.

Ich habe dann zb für write eine Methode writearray(const array of const), wie mache ich das gleiche jetzt mit readarray(???)
Ich weiss auch nicht ob das mit "const array of const" wirklich funktioniert, aber auf jeden Fall spuckt mir der Debugger da keine Exception aus.

Ich wäre natürlich auch für Alternativmethoden zu haben, da ich bei der obigen Procedure immer ein "[]" setzen muss.
Wenn es nicht möglich ist dieses Problem so zu lösen, wäre ich natürlich auch für Alternativvorschläge zu haben.

mfg

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 18, 2006 15:56 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Fürs lesen gibt es sowas wie array of const nicht. Wenn du array of const zum schreiben verwenden willst, solltest du dir vorher unbedingt die DelphiHilfe mit dem Sample ansehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 18, 2006 19:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
doch, müsste mit array of var gehen

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 18, 2006 22:42 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Ein Array of Var gibt es bei mir jedenfalls nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 19, 2006 08:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich denke mal, dass Delphi intern anstelle des "array of const" ein VariantArrays benutzt. Ein Variant ist ein Datentyp der beliebige Datentypen beinhalten kann. Ich hätte darauf getippt, dass ein "var blah: array of const" funktioniert. Tut es aber nicht. Aber hier mal eine andere Idee.

Code:
  1. type
  2.   TMyFunnyArray = array of Variant;
  3.  
  4.   TForm1 = class(TForm)
  5.     Button1: TButton;
  6.     procedure Button1Click(Sender: TObject);
  7.   public
  8.     procedure Read(var Data: TMyFunnyArray);
  9.     procedure Write(const Data: array of Variant);
  10.   end;
  11.  
  12.  
  13. implementation
  14.  
  15.  
  16. procedure TForm1.Read(var Data: TMyFunnyArray);
  17. begin
  18.   SetLength(Data, 3);
  19.  
  20.   Data[0] := 10;
  21.   Data[1] := 'Blah';
  22.   Data[2] := 3.1415;
  23. end;
  24.  
  25.  
  26. procedure TForm1.Write(const Data: array of Variant);
  27. var
  28.   Idx: Integer;
  29.   Temp: String;
  30. begin
  31.   for Idx := Low(Data) to High(Data) do
  32.     Temp := Temp +
  33.       VarTypeAsText(VarType(Data[Idx])) + ' = ' +
  34.       VarAsType(Data[Idx], varString) + #10#13;
  35.  
  36.   ShowMessage(Temp);
  37. end;
  38.  
  39.  
  40. procedure TForm1.Button1Click(Sender: TObject);
  41. var
  42.   Data: TMyFunnyArray;
  43. begin
  44.   Read(Data);
  45.  
  46.   Write(Data);
  47.  
  48.   Write(['A', 'B', 'C', 17]);
  49. end;


Das funktioniert soweit. Allerdings ist es besser, wenn man bei Write auch den Typen TMyFunnyArray benutzt. Dann kann man aber keine Arrays wie das zweite Write mehr direkt übergeben. Sondern nur noch per TMyFunnyArray. Dafür könnte man sich aber eine Hilfsfunktion shreiben. Aber das ist reine Geschmackssache.

Noch etwas nicht unwichtiges. Varianten sind nicht die schnellsten Datentypen. Wenn du also etwas mehr damit zu tun hast oder es Zeitkritisch werden könnte dann solltest du dir etwas anderes überlegen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 19, 2006 10:29 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Array of Const ist kein Array of Variant. Das ist ein array von bestimmten Records. Details dazu findet man in der Delphihilfe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 24, 2006 18:11 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
@lossy: das ganze ist ja schonmal sehr gut nur möchte ich eigentlich im read auch einfach typen eingeben können, nämlich so: read([string, integer, word]); usw... ich weiss also nicht wie das mit der parameter übergabe geht...

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 25, 2006 00:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Gaukler. Irgendwie verstehe ich das gerade absolut nicht. Aber da das "array of const" nur zum reinreichen in die Methode gedacht sind denke ich wirst du so eine einfache Methode nicht bekommen. Zu mindest nicht so einfach wie du dir das gerade vorstellst.

Möchtest du der Methode sagen, dass du als erstes einen String dann einen Integer und zu letzt ein Word laden soll? Wenn ja dann hast du das Problem, dass du sowohl etwas reinreichen als auch etwas wieder heraus bekommen möchtest. Ich persönlich würde das nicht mit einer Methode machen die Nachteile die du davon mitbekommst dürften den vorteilen überwiegen.

Du müsstest dann dann wohl so machen wie es delphi mit den "array of const" machst. Das ist ein array von records welche eine Feld mit dem Typen hat und ein Feld mit den Daten. Und das wird über ein Case ausgewählt. Aber wie gesagt ich finde das nicht sonderlich optimal.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 25, 2006 02:12 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
Lossy eX hat geschrieben:
Möchtest du der Methode sagen, dass du als erstes einen String dann einen Integer und zu letzt ein Word laden soll? Wenn ja dann hast du das Problem, dass du sowohl etwas reinreichen als auch etwas wieder heraus bekommen möchtest.


hmm hast du mich etz falsch verstanden oder kapier ichs einfach nich?

Naja wie auch immer, ich möchte einfach ein paar werte herausbekommen, bzw ich möchte die referenz eines wertes, mehrere undefinierte werte aus einer datei laden, dass sieht dann zb so aus:

Code:
  1. procedure TBinaryFile.Read(var Data: array of Variant);
  2.  
  3. var
  4.   i:             integer;
  5.   size:          word;
  6.   //----types----
  7.   _smallint:      smallint;
  8.   _integer:       integer;
  9.   _single:        single;
  10.   _double:        double;
  11.   _currency:      currency;
  12.   _boolean:       boolean;
  13.   _ShortInt:      ShortInt;
  14.   _Byte:          Byte;
  15.   _word:          word;
  16.   _LongWord:      LongWord;
  17.   _Int64:         Int64;
  18.   _string:        string;
  19. begin
  20.   for i := 0 to High(Data) do
  21.     case VarType(Data[i]) of
  22.       varSmallint:
  23.       begin
  24.         S.Read(_Smallint,SizeOf(Smallint));
  25.         Data[i] := _Smallint;
  26.       end;
  27.  
  28.       varInteger:  
  29.       begin
  30.         S.Read(_integer,SizeOf(integer));
  31.         Data[i] := _integer;
  32.       end;
  33.  
  34.       varSingle:  
  35.       begin
  36.         S.Read(_single,SizeOf(single));
  37.         Data[i] := _single;
  38.       end;
  39.  
  40.       varDouble:  
  41.       begin
  42.         S.Read(_double,SizeOf(double));
  43.         Data[i] := _double;
  44.       end;
  45.  
  46.       varCurrency:
  47.       begin
  48.         S.Read(_currency,SizeOf(currency));
  49.         Data[i] := _currency;
  50.       end;
  51.  
  52.       varBoolean:
  53.       begin
  54.         S.Read(_boolean,SizeOf(boolean));
  55.         Data[i] := _boolean;
  56.       end;
  57.  
  58.       varShortInt:
  59.       begin
  60.         S.Read(_ShortInt,SizeOf(ShortInt));
  61.         Data[i] := _ShortInt;
  62.       end;
  63.  
  64.       varByte:  
  65.       begin
  66.         S.Read(_byte,SizeOf(byte));
  67.         Data[i] := _byte;
  68.       end;
  69.  
  70.       varWord:    
  71.       begin
  72.         S.Read(_Word,SizeOf(word));
  73.         Data[i] := _Word;
  74.       end;
  75.  
  76.       varLongWord:
  77.       begin
  78.         S.Read(_LongWord,SizeOf(Longword));
  79.         Data[i] := _LongWord;
  80.       end;
  81.  
  82.       varInt64:  
  83.       begin
  84.         S.Read(_Int64,SizeOf(Int64));
  85.         Data[i] := _Int64;
  86.       end;
  87.  
  88.       varString:  
  89.       begin
  90.         S.Read(size,SizeOf(size));
  91.         S.Read(Pchar(_string)^, size);
  92.         Data[i] := _string;
  93.       end;
  94.  
  95.       else
  96.         S.Read(Data[i], SizeOf(Data[i]));
  97.     end;
  98.  
  99. end;


Allerdings kann ich hier nicht wie bei const array of Variant einfach Werte zurückschreiben, wenn ich hier zb ein Read([integer, word, string]); eingebe, spuckt er irgendeine Compilermeldung raus.

Von mir aus, kann das ganze auch ohne Variant zu erledigen sein, ich will halt einfach nur mehrere Typen nacheinander auslesen.

mfg

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 25, 2006 13:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja okay dann habe ich das doch richtig verstanden. Und so wie du dir das denknst geht es nicht. Das Problem ist, dass String, Integer und word Delphi Typen sind. Mit denen kannst du nicht arbeiten. Abgesehen mal davon, dass ein String sogar nur ein Pointer ist und du vorher in die Datei eigentlich eine Größe schreiben musst. Andersherum musst du diese natürlich auch wieder auslesen.

Aber wie auch immer. Ich denke mal von der Grundidee wird es so in etwa ablaufen müssen wie du es gemacht hast. Also dass du ein Array hättest bei der du auf dem einen Feld einen Typen zuweist und entsprechend bei dem anderen Feld dann den Wert zuweist. Davon müsstest du ein Array erstellen welches du vor dem Aufruf füllst (also die Typen) und an die Methode übergibst. Diese wiederrum würde das befüllen und du hättest deine Werte in den entsprechenden einträgen stehen.

Code:
  1.   TVarRecType = (vtInteger, vtBoolean, vtChar, vtExtended, vtString);
  2.   TVarRec2 = record { do not pack this record; it is compiler-generated }
  3.     DataType: TVarRecTypes;
  4.     case DataType of
  5.       vtInteger:    (VInteger: Integer);
  6.       vtBoolean:    (VBoolean: Boolean);
  7.       vtChar:       (VChar: Char);
  8.       vtExtended:   (VExtended: Extended);
  9.       vtString:     (VString: String);
  10.   end;


Allerdings finde ich das viel viel zu umständlich. Abgesehen davon, dass das Datenhandling auch vel zu umständlich ist und wohl zu viel Rechenleistung schlucken würde.

Ich persönlich würde mir wohl kleine Hilfsmethoden erstellen die mir einen einen Integer, einen String oder ein Word auslesen. Weil es eigentlich keine Rolle spielt ob du 3 unterschiedliche Methoden aufrufst oder eine Methode mit den 3 Parametern. Was du haben willst musst du vorher eh wissen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 18 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]