Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Record-Felder in Prozedur ändern? (https://www.delphipraxis.net/134291-record-felder-prozedur-aendern.html)

ernschd 19. Mai 2009 12:27


Record-Felder in Prozedur ändern?
 
Hi,

ich bin mal wieder dran, ein altes Pascal in Delphi umzusetzen.
Natürlich funktioniert der Code im Original, nur enthalten die Felder in meinem "neuen" Code unsinnige Werte.

Delphi-Quellcode:
// der Record
type H_TYP = record
    H24 : String [7];
    H25 : String [30];
    H26 : Byte;
end;

type H_Zeiger = ^H_Typ;

// mein Sorgenkind
procedure changeH(var Woher; var Wohin);
var Quelle : String absolute Woher;
    Ziel : String absolute Wohin;
    Dummy : string;
begin
    Dummy := Copy(Quelle, 4, 7);
    Ziel := Dummy;
end;

...

// das Hauptprogramm
var H_N : H_Zeiger;
    dummy: string;
begin

    // wird nur zum Testen verwendet
    dummy := 'dasisteinsuperlangerstring';

    H_N := Nil;
    New(H_N);
    with H_N^ do begin
       H24 := ''; H25 := '';
       changeH(dummy,H24);      
    end;
    Dispose(H_N);
end;
H24 enthält nun irgendwelche Ansammlungen von Zeichen, aber keinesfalls den gewünschten Teil des Strings ('isteins').

Was mache ich falsch? Wenn ich H24 durch eine Hilfsvariable ersetzte, dann klappt alles wunderbar.
Leider ist das aber in meinem Programm nicht möglich, da sich der Feldtyp im Record jedesmal ändert.

Vielen Dank.

Ernschd

nahpets 19. Mai 2009 12:37

Re: Record-Felder in Prozedur ändern?
 
Hallo,

das was Du da machst funktioniert nur mit kurzen String, d.H.: Du musst für alle Strings bei der Deklaration eine Längenangabe machen, so wie es in der Typdeklaration von H_TYP gemacht wird.

Vermutlich in der Form (nicht getestet)
Delphi-Quellcode:
// der Record
type H_TYP = record
    H24 : String [7];
    H25 : String [30];
    H26 : Byte;
end;

type H_Zeiger = ^H_Typ;

// mein Sorgenkind
procedure changeH(var Woher; var Wohin);
var Quelle : String[255] absolute Woher;
    Ziel : String[255] absolute Wohin;
    Dummy : string[255];
begin
    Dummy := Copy(Quelle, 4, 7);
    Ziel := Dummy;
end;

...

// das Hauptprogramm
var H_N : H_Zeiger;
    dummy: string[255];
begin

    // wird nur zum Testen verwendet
    dummy := 'dasisteinsuperlangerstring';

    H_N := Nil;
    New(H_N);
    with H_N^ do begin
       H24 := ''; H25 := '';
       changeH(dummy,H24);      
    end;
    Dispose(H_N);
end;

ernschd 20. Mai 2009 10:27

Re: Record-Felder in Prozedur ändern?
 
So hat es funktioniert, vielen Dank.

Könntest Du mir vielleicht noch erklären, wieso das so ist?
Ich verstehe nicht ganz, weshalb es in Pascal funktioniert, aber nicht in Delphi.

Hansa 20. Mai 2009 10:38

Re: Record-Felder in Prozedur ändern?
 
Neuere Delphi Versionen sind 32 Bit. Früher war das nur 16 Bit. Der jetztige Byte Type entspricht dem alten integer und geht nicht nur von 0..255.

Satty67 20. Mai 2009 10:49

Re: Record-Felder in Prozedur ändern?
 
Zitat:

Zitat von Hansa
Früher war das nur 16 Bit. Der jetztige Byte Type entspricht dem alten integer und geht nicht nur von 0..255.

Bist Du Dir da sicher?

Byte war und ist doch schon immer 8 bit. Integer hat sich geändert von SmallInt auf LongInt. Das oben sah mir aber auch nach ShortString <> String Problem aus.

Falls ich jetzt total daneben liege, hab' ich nichts gesagt und behaupte das Gegenteil.

himitsu 20. Mai 2009 10:51

Re: Record-Felder in Prozedur ändern?
 
Delphi-Quellcode:
H24 : String[7];
dummy : String[255];
:!: also wenn jetzt bei changeH(dummy,H24); mal zufällig (was hier zum Glück nicht der Fall ist und welches durch das Copy auch noch verhindert wird) ein String mit mehr als 7 Zeichen in H24 reinkopiert werden sollte, dann hättest du einen netten Bufferoverflow und würdest irgendwas, welches zufällig im Speicher hinter H24 steht, überschreiben.

[add]
Byte ist Byte

der alte Integer entspricht jetzt SmallInt
der jetzige Integer dagegen LongInt

Hier lag es einfach daran, das String[x] ein ShortString ist und String ein "LongString" (AnsiString und in D2009 ein WideString)

uligerhardt 20. Mai 2009 11:00

Re: Record-Felder in Prozedur ändern?
 
Probier mal sowas (ungetestet):
Delphi-Quellcode:
procedure changeH(var Woher: OpenString; var Wohin: OpenString);
var
  Dummy : ShortString;
begin
  Dummy := Copy(Woher, 4, 7);
  Wohin:= Dummy;
end;
Statt OpenString kannst du auch ShortString schreiben, wenn du in den Projektoptionen "Offene Parameter" anhakst. Und statt ShortString kannst du string schreiben, wenn du "Huge-Strings" ausschaltest. Letzteres würde ich aber wirklich nur machen, wenn du den Code auch noch in TurboPascal verwenden willst.

HTH,
Uli.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 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