AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Verständnisfrage: String nach Pointer kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verständnisfrage: String nach Pointer kopieren

Ein Thema von gmc616 · begonnen am 30. Jan 2013 · letzter Beitrag vom 30. Jan 2013
Antwort Antwort
Seite 1 von 2  1 2      
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#1

Verständnisfrage: String nach Pointer kopieren

  Alt 30. Jan 2013, 13:25
Hallo Delphianer,

wieder ein mal versuche ich mich an Pointern ...

folgender Code funktioniert im Delphi 2009, aber nicht so richtig:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);

  procedure fktCopy (APointer : Pointer ; AText : string);
  begin
    CopyMemory(APointer,PChar(AText),2*length(AText)+1);

  end;
var
  sStr , sData : WideString;
  pStr : Pointer;
begin
  sData := '123';
  sStr := 'Hallo Welt';
  pStr := PChar(sStr);

  fktCopy (pStr,sData);

  ShowMessage (sStr);

end;
Die Messagebox zeigt mir "123" als Ergebnis an.

Tatsächlich steht aber in  sStr ='123'#0'o Welt' .
Ich möchte aber, dass der Inhalt der Variable sStr durch den Inhalt der Varable sData komplett ersetzt wird, also das quasi in sStr '123' als Inhalt steht.
Wie kann ich in meiner fktCopy-Procedure die Länge des Strings korrekt setzen?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Verständnisfrage: String nach Pointer kopieren

  Alt 30. Jan 2013, 13:49
Das geht so nicht. Das wird vor allem spannend, wenn sData länger als sStr ist.

Was willst du denn machen?


PS: Und pass auf: wenn du widestring nimmst, solltest du auch PWideChar nehmen. Und die "2" in der Längenberechnung am besten mit sizeof(WideChar) ersetzen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Verständnisfrage: String nach Pointer kopieren

  Alt 30. Jan 2013, 14:47
Das geht so nicht.
Das habe ich gemerkt. Ist für mich auch irgendwie schlüssig.

Das wird vor allem spannend, wenn sData länger als sStr ist.
Dachte ich auch. Interessanterweise beschwert sich Delphi _nicht_ mit längeren sData. Überschreibt er einfach. Ich hätte zumindest mit einer Schutzverletzung gerechnet, sonst knallst hier bei mir ja auch an allen Ecken und Enden, aber nix^^

Was willst du denn machen?
Nun ja, im Prinzip genau das.

Ich habe einen Zeiger auf einen String, genauer auf ein StringProperty einer Klasse.
Dazu habe ich einen Editor gebastelt, der den Inhalt der Property ändern soll. Da der Editor den Namen der Property nicht kennt (nicht kennen kann!), gebe ich ihm den Zeiger auf die Property.
Anschließend soll der Editor den Inhalt auf den der Zeiger zeigt ändern. Mehr nicht.

Delphi-Quellcode:
// PseudoCode !!!

TEditClass = class (TObject)
public
   Property ID : Integer;
end;

TArtikel = Class (TEditClass)
public
   Property Name : WideString
End;

...
var
  MyArtikel : TArtikel;
...
MyArtikel := TArtikel.create;
...

fktCallEditor (MyArtikel,PWideChar (MyArtikel.Name));


procedure TEditor.SetValue (AEdit : TObject ; APointer : Pointer; AText : string);
begin
  if AEdit is TEditClass then
    fktCopy(APointer,AText);
end;
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Verständnisfrage: String nach Pointer kopieren

  Alt 30. Jan 2013, 15:01
Ich bin mir nicht sicher, ob ich deinen Pseudocode richtig verstanden habe, aber scheinbar hast du einen untypisierten Zeiger, von dem du weißt, das er auf einen String zeigt? Wenn das so ist, caste halt einfach und mach eine normale Zuweisung: PWideString(APointer) := AText;
Uli Gerhardt
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Verständnisfrage: String nach Pointer kopieren

  Alt 30. Jan 2013, 15:14
Jupp, richtig verstanden.

Jetzt sagt mir der Complier:
Code:
[DCC Fehler] Unit1.pas(117): E2010 Inkompatible Typen: 'PWideString' und 'WideString'
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Verständnisfrage: String nach Pointer kopieren

  Alt 30. Jan 2013, 15:43
Jupp, richtig verstanden.

Jetzt sagt mir der Complier:
Code:
[DCC Fehler] Unit1.pas(117): E2010 Inkompatible Typen: 'PWideString' und 'WideString'
Dann mach noch'n Haken hin: PWideString(APointer)^ := AText;
Uli Gerhardt
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Verständnisfrage: String nach Pointer kopieren

  Alt 30. Jan 2013, 16:24
Die Idee hatte ich auch.
Jetzt bekomme ich eine EOutOfMemory-Exception mit "Zu wenig Arbeitsspeicher."

Mein Test-Code aktuell:
Delphi-Quellcode:
procedure fktCopy (APointer : Pointer ; AText : WideString);
  begin
   // CopyMemory(APointer,PChar(AText),2*length(AText)+1);
    PWideString(APointer)^ := AText;
  end;
var
  sStr , sData : WideString;
  pStr : Pointer;
begin
  sData := '123';
  sStr := 'Hallo Welt';
  pStr := PWideChar(sStr);

  fktCopy (pStr,sData);

  ShowMessage (sStr);
Ändere ich alle WideString in String und alle PWideChar in PChar, was mir lieber wäre, komme ich eine Schutzverletztung.

Das geht mir nicht in den Kopf
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Verständnisfrage: String nach Pointer kopieren

  Alt 30. Jan 2013, 16:43
Ändere mal  pStr := PWideChar(sStr); in   pStr := @sStr; ab. Du willst ja nicht casten, sondern die Adresse deiner Variablen übergeben.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Verständnisfrage: String nach Pointer kopieren

  Alt 30. Jan 2013, 16:47
Du hast einen Widestring. Der hat eine feste länge im Speicher. Und daran kannst du mit deinen Speicherkopieraktionen nichts ändern. Du müsstest schon die Länge aktiv ändern. Das geht aber nicht mehr, wenn du nicht mehr weißt, auf was dein Zeiger eigentlich zeigt.

Achso und Delphi(Compiler) beschwert sich natürlich nicht bei deinen Kopieraktionen. Der kopiert einfach (wie in ANSI C) aber du musst wissen was du tust.


Edit:
Zitat:
Ändere ich alle WideString in String und alle PWideChar in PChar, was mir lieber wäre, komme ich eine Schutzverletztung.
Du machst try and error ohne nachzudenken. Glaub mir, das wird nix.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Verständnisfrage: String nach Pointer kopieren

  Alt 30. Jan 2013, 17:04
Du machst try and error ohne nachzudenken. Glaub mir, das wird nix.
Ja, mittlerweile schon.

Ändere mal  pStr := PWideChar(sStr); in   pStr := @sStr; ab. Du willst ja nicht casten, sondern die Adresse deiner Variablen übergeben.
Das ist die Lösung!

Ich dachte mal gelesen zu haben, das PChar(sStr) und @sStr das gleiche wären, ist es aber offensichtlich nicht.

BonusFrage: Aber PChar(sStr) und @sStr[1] ist das gleiche oder?
Das würde mir meinen Denkfehler erklären ...

Danke euch für die Hilfe
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:22 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