Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Array versendbar? (https://www.delphipraxis.net/105942-array-versendbar.html)

Sheak 2. Jan 2008 19:15


Array versendbar?
 
Nabend und frohes neues liebe Delphi-Praxis-Community und -Admins,

im Zuge einer Facharbeit an unserer Schule schreibe ich an einem kleinen Programm mit Delphi, welches ich dann für die Facharbeit analysiere und den Weg zum Endprodukt hin beschreibe.

Mein Ziel ist, dass ich Daten erzeuge, welche ich an meinen gegenüber im Netzwerk schicke, welcher sie dann (mittels des Programms) interpretiert. Es sind etwa 8 Werte.

Eingefallen sind mir 2 Wege:

1) ich speichere die Daten in einem Array und verschicke diesen an meinen gegenüber

2) ich limitere die Stellenanzahl die die Werte annehmen können, was dann in etwa aussieht wie "1,259,032,259,033"

Zu 1) hab ich (leider) rein gar nix, weder in der Community hier noch bei google gefunden, genauso wie bei 2) ich keien Möglichkeit gefunde habe, vor den String mehrere Nullen zu Adden.

Jemand eine anregende Idee? :)

wicht 2. Jan 2008 19:38

Re: Array versendbar?
 
Mahlzeit!

Delphi-Quellcode:
1) ich speichere die Daten in einem Array und verschicke diesen an meinen gegenüber
Ich glaube ein Array kannst du nicht einfach so verschicken. Aber keine Angst, es gibt wirklich genug Wege, die nicht besonders kompliziert sind. Du hast es im Prinzip schon selbst hingeschrieben: "1,259,032,259,033" - Das wäre ein String, und die länge der Daten musst du dabei auch nicht festlegen, wenn du zum Beispiel ein "," als Trennzeichen verwendest, mit dessen Hilfe das Gegenüber die Daten wieder auseinandernimmt. Das wäre glaube ich die einfachste Möglichkeit, und wie es sich für mich anhört, muss die Sache nicht extrem professionell sein.

Delphi-Quellcode:
Zu 1) hab ich (leider) rein gar nix, weder in der Community hier noch bei google gefunden, genauso wie bei 2) ich keien Möglichkeit gefunde habe, vor den String mehrere Nullen zu Adden.
Falls dir die Grundlagen fehlen, empfehle ich dir mal ein Tutorial zu Delphi allgemein, davon rückt Google einige raus. Das soll nicht provozieren, aber könnte glaube ich helfen. Für Socket-Geschichten sind glaube ich Komponenten bei Delphi dabei, ich persönlich bevorzuge die ICS von www.overbyte.be. Die Indy-Komponenten gibt es dann auch noch, für beide Sammlungen gibt es Genug Beispiele...

HTH :)

alzaimar 2. Jan 2008 19:53

Re: Array versendbar?
 
Zitat:

Zitat von wicht
Ich glaube ein Array kannst du nicht einfach so verschicken.

"Glauben heißt, Nichts wissen" hat mein Lehrer immer gesagt. Ist schon ne Weile her, stimmt aber immer noch. :zwinker:

Du kannst beliebige Daten in einem Stream speichern und diesen Stream dann übertragen. Auf der anderen Seite ließt Du den Streaminhalt wieder in deine beliebigen Daten.

Ich glaube, bei den Delphi-Demos ist ein Beispiel mit Sockets, be denen das gezeigt wird. Wenn nicht, würde ich die Indy-Komponenten nehmen, da diese einfacher zu handhaben sind. Dafür sind sie nicht optimal, aber das ist hier egal. Es spielt nur dann eine Rolle, wenn man sehr viele Daten gleichzeitig verschickt und empfängt (Stichwort: Asynchrone Übertragung).

Weiterhin kannst du Daten auch in einen String packen, verschicken und auf der anderen Seite wieder entpacken. Hier würde ich die Formate 'XML' oder 'JSON' empfehlen. Alles Andere ist Frickelei, denn man sollte sich schon weitestgehend an Standards halten. Und XML bzw. JSON sind Standards.

wicht 2. Jan 2008 20:15

Re: Array versendbar?
 
:wink: *grr*.. Sage ich mal so: Ich kenne keine Klasse, die einem eine Funktion wie TClient.Send(array of string) zur Verfügung stellt :-D Naja ääh.. wie gesagt.

Desmulator 2. Jan 2008 21:07

Re: Array versendbar?
 
öhm wenn du die IndyTco's nutzt kannst du auch den befehl WriteBuffer benutzen

und zwar so

Delphi-Quellcode:
 Client.WriteBuffer(Array, SizeOf(Array));
Das ganze ist recht einfach, mit SizeOf bestimmst du die binäre größe des arrays und dann wird einfach das array binär geschikt.

Wenn du jetzt das array wieder empfangen willst benutzt du einfach

Delphi-Quellcode:
type
 TDasArray = array [0..7] of integer;


var
 DestArray : TDasArray;

 Server.ReadBuffer(DestArray, SizeOf(TDasArray));
Hier ists was kniffliger, da du ja die größe von dem array nicht kennst, aber alles kein problem, denn wir wissen wie das array aussieht. und zwar sind es acht integer von 0 - 7. also 8 mal SizeOf(integer)...

So nun lesen wir also diesen wert ein und zwar in die Variable DestArray, die vom tüp her unserem gesendeten array enspricht..

und fetisch sind wir ;-)

3_of_8 2. Jan 2008 21:45

Re: Array versendbar?
 
Bei dynamischen Arrays geht das so nicht. Da muss das dann heißen :
Delphi-Quellcode:
Client.WriteBuffer(Array[0], length(Array)*sizeof(<Array-Elementtyp>);
Bei mehrdimensionalen, dynamischen Arrays ist das wieder anders. Ein solches Array ist nämlich eigentlich ein Array von Pointern, die (je nach Dimension) wieder auf weitere Arrays zeigen. Erst die Arrays der letzten Dimension enthalten dann die eigentlichen Array-Elemente. Da muss man dann mithilfe von for-Schleifen das ganze auftrennen. Also bei einem array mit den Längen a und b sähe das so aus:

Delphi-Quellcode:
Client.WriteInteger(length(Array)); //Damit der Emfpänger weiß, wie viele Werte durchkommen
for I:=0 to high(Array) do
  Client.WriteBuffer(Array[I][0], length(Array[I])*size(<Array-Elementtyp>));

Sheak 5. Jan 2008 15:36

Re: Array versendbar?
 
Erstmal danke für die Hilfe! :)
Bin nun in der Lage den Array zu versenden, allerdings stehe ich nun vor einem neuen Problem: Der Array bekommt die ersten Werte zudefiniert und verschickt diese, alles wunderbar. Aber nach dem ersten Senden werden die Werte nicht überschrieben, sondern die alten Werte bleiben erhalten (sry für meien Dummheit :mrgreen: ). Wie kann ich die Array-Werte (nicht die Array-Länge) dynamisch machen? :pale:

little_budda 5. Jan 2008 15:43

Re: Array versendbar?
 
Ein Array-Wert ist immer dynamisch.

alzaimar 5. Jan 2008 15:46

Re: Array versendbar?
 
Zitat:

Zitat von little_budda
Ein Array-Wert ist immer dynamisch.

:gruebel: Was will uns der Autor damit sagen?

Muetze1 5. Jan 2008 15:54

Re: Array versendbar?
 
Zitat:

Zitat von Sheak
Wie kann ich die Array-Werte (nicht die Array-Länge) dynamisch machen? :pale:

Einfach den neuen Wert zuweisen?

Zitat:

Zitat von little_budda
Ein Array-Wert ist immer dynamisch.

Ok, dann hier die Aufgabe:

Delphi-Quellcode:
const
  arr: array[0..4] of integer = ( 1, 2, 3, 4, 5 );
Ändere Eintrag Nummer 2 - ist ja schliesslich immer dynamisch...

Und dies ohne die (standardmäßig) deaktivierte Option für änderbare Konstanten zu verändern. Sprich: auch keine Zeigerarithmetik...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz