Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi string in array of char umwandeln (https://www.delphipraxis.net/25294-string-array-char-umwandeln.html)

Aenogym 4. Jul 2004 12:04


string in array of char umwandeln
 
hi,

ich habe ein problem. ich möchte einen string in einen array of char umwandeln. das war meine idee:

Delphi-Quellcode:
var msg: string;
    new_msg: array of char;
    i: integer;
begin
  setlength(new_msg, length(msg));
  for i := 0 to high(new_msg) do
  begin
    new_msg[i] := msg[i+1];
  end;
end;
der compiler meckert nicht. aber während der laufzeit crasht mein programm bei der zeile "new_msg[i] := msg[i+1];".

habt ihr eine funktionierende möglichkeit, einen string in einen array of char und auch wieder zurück umzuwandeln?

danke,
Aenogym

alcaeus 4. Jul 2004 12:06

Re: string in array of char umwandeln
 
Probiers mal so:
Delphi-Quellcode:
var msg: string;
    new_msg: array of char;
    i: integer;
begin
  setlength(new_msg, length(msg));
  for i := 1 to Length(msg) do
  begin
    new_msg[i-1] := msg[i];
  end;
end;
Vielleicht funktioniert das jetzt...

Greetz
alcaeus

Aenogym 4. Jul 2004 12:18

Re: string in array of char umwandeln
 
tja und wie geht das andersrum?
ich kanns nur testen, wenn ich das ganze auch wieder zurück in einen string konvertieren kann. ich will nämlich den array of char durchs internet schicken und der client soll ihn dann empfangen.

also beim server hab ich das jetzt so angepasst. hab auch versucht, das ganze "umzudrehen" und dann beim client einzufügen aber da gibts dann wieder ne exception.

Aenogym

Ratte 4. Jul 2004 12:34

Re: string in array of char umwandeln
 
Probier mal
Delphi-Quellcode:
var msg: string;
    new_msg: array of char;
    i: integer;
begin
  setlength(new_msg, length(msg)-1);
  for i := 1 to length(msg) do
  begin
    new_msg[i-1] := msg[i];
  end;
end;
Ratte

alcaeus 4. Jul 2004 12:37

Re: string in array of char umwandeln
 
@Ratte: Willkommen zur Zugriffsverletzung bei der letzten Schreiboperation. Length gibt dir nämlich Ord(msg[0]) zurück, und das ist zufällig die Anzahl Zeichen im String. Das -1 im SetLength musst du also weglassen.

Das Zurückumwandeln funktioniert jetzt ganz einfach:
Delphi-Quellcode:
var msg: string;
    new_msg: array of char;
    i: integer;
begin
  setlength(msg, length(new_msg));
  for i := 1 to Length(new_msg) do
  begin
    msg[i] := new_msg[i-1];
  end;
end;
Greetz
alcaeus

gekmihesg 4. Jul 2004 12:40

Re: string in array of char umwandeln
 
ging das nicht ungefähr so:

array_of_char:=PChar(string);

Christian Seehase 4. Jul 2004 13:23

Re: string in array of char umwandeln
 
Moin Zusammen,

es ginge auch noch so:

Delphi-Quellcode:
var
  msg    : string;
  new_msg : array of char;

begin
  msg := 'Meldung';
  setlength(new_msg,length(msg));
  StrLCopy(@new_msg[0],@msg[1],length(new_msg));
end;
@alcaeus
ord(msg[0]) wäre es bei einem ShortString (wobei hier length(msg) genausogut ginge).
Der Typ string ist eigentlich ein Pointer auf den Inhalt des Strings.
Auf der Adresse -4 beginnt der Zähler, auf Adresse -8 ein Referenzzähler.

Delphi-Quellcode:
var
  msg    : string;
  pLength : PDWORD;

begin
  msg := 'Meldung';
  pLength := PDWORD(msg);
  dec(pLength);
  ShowMessage(IntToStr(pLength^));
end;

Ratte 4. Jul 2004 13:42

Re: string in array of char umwandeln
 
@alcaeus: Also bei mir funzt's fehlerlos...

Ratte

Aenogym 4. Jul 2004 18:49

Re: string in array of char umwandeln
 
WOW, danke, dass sich soviele leute diesem thema annehmen ;)
ich werd's denn mal versuchen.

Aenogym

Aenogym 4. Jul 2004 22:01

Re: string in array of char umwandeln
 
hi nochmal,

also ich habs jetzt getestet und es klappt irgendwie nicht. das umwandeln von string in array klappt (array inspected - einzelne chars sind drin). dann wird mein record (in dem dieses array drinsteckt) über den serversocket versendet und kommt auch beim client an.

jetzt will ich es weiterverarbeiten, hänge aber wieder an einer exception:

Delphi-Quellcode:
var name: string;
    msg.username: array of char;

  setlength(name, length(msg.username)); //<== hier exception
  for i := 1 to Length(msg.username) do
  begin
    name[i] := msg.username[i-1];
  end;
falls es weiterhilft, hier mal die meldung:
Code:
---------------------------
Debugger Exception Notification
---------------------------
Project iceChat.exe raised exception class EAccessViolation with message 'Access violation at address 004059BC in module 'iceChat.exe'. Read of address 008D2688'. Process stopped. Use Step or Run to continue.
---------------------------
OK  Help  
---------------------------
ich kann auch noch mehr code zeigen, nur will diesen post jetzt nicht so füllen ;)
aber ist der code fürs zurückwandeln vielleicht doch fehlerhaft oder mache ich was falsch?

edit: ich versuche einfach mal die möglichkeit von christian seehase.

thx,
Aenogym

MrKnogge 4. Jul 2004 22:09

Re: string in array of char umwandeln
 
Servus !

vorweg, der variablenname "Name" ist schonmal unglücklich gewählt, da er von jedem objekt benutzt wird. Dann:
Delphi-Quellcode:
setlength(name, length(msg.username));
wozu ?

Das könntest du auch weglassen, und dann in der Schleife mit:
Delphi-Quellcode:
for i := 1 to Length(msg.username) do
    myname := myname + msg.username[i-1];
hintendrann hängen.

Aenogym 4. Jul 2004 22:36

Re: string in array of char umwandeln
 
okay danke.

fast so hatte ich das ja schon. die möglichkeit von christian seehase klappt nicht (meldung: "invalid pointer operation"...).
langsam glaube ich aber auch, dass mein record nicht richtig ankommt.

versand vom server:
Delphi-Quellcode:
type TChatMessage = record
    command: integer;
    userid: integer;
    username: array of char;
    parameters: array of char;
  end;

//...

var rec: TChatMessage;
  serversocket1.Socket.Connections[0].SendBuf(rec, sizeof(rec));
empfang beim client (in dem TClientSocket.OnRead-Event):
Delphi-Quellcode:
socket.receiveBuf(rec, sizeof(rec)
sollte doch klappen, oder?

Aenogym

MrKnogge 5. Jul 2004 10:24

Re: string in array of char umwandeln
 
Ich fürchte nicht, SizeOf hat probleme mit dynamischen Arrays.
(ob auch mit statischen, kann ich nicht sagen)

Tipp:
Schreibe command, userid, Length(Username), Length(parameters), sowie die beiden Arrays in ein MemoryStream und versende dann den.

Chewie 5. Jul 2004 10:26

Re: string in array of char umwandeln
 
Zitat:

Zitat von MrKnogge
Ich fürchte nicht, SizeOf hat probleme mit dynamischen Arrays.

Wieso denn das? Sizeof funktioniert wunderbar mit dynamischen Arrays, man muss als Programmierer nur wissen, dass eine dynamische Array-Variable nichts weiter als ein zeiger auf den Speicherbereich des Arrays ist und dementsprechend 4 Bytes groß. Um die Größe, die ein dynamisches Array belegt herauszufinden, reicht (bei eindimensionalen Arrays) ein Length(DynArray) * Sizeof(DynArray[0]).

choose 5. Jul 2004 10:33

Re: string in array of char umwandeln
 
Hallo Aenogym,

aus Deinem Code lese ich, dass Du einen Record über Sockets an einen anderen Prozess (oder gar Rechner) übertragen möchtest. Bitte lies Dir den Hinweis von Chewie genau durch!

Solltest Du das Record auf diese Weise übertragen, wird lediglich ein Verweis auf die tatsächlichen Daten (und indirekt auf die von Chewie dargestellten Metadaten) im Speicherraum des Absenderprozesses übertragen, nicht aber die Daten selbst!

Das Problem, dass Dich beschäftig heißt Serialisierung und ist hier (auch im Zusammenhang mit Records) schon mehrfach diskutiert worden.

Aenogym 5. Jul 2004 14:18

Re: string in array of char umwandeln
 
danke leute.
dass das thema hier schon öfter diskutiert wurde, hab ich in der suche gesehen...
ich werde denn mal die möglichkeit mit dem memoryStream ausprobieren (obwohl ich eigentlich noch nie mit streams gearbeitet hab - schon garnicht mit memorystreams...).

aber danke euch allen, ich schaff das schon irgendwie :thuimb:

Aenogym


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr.

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