AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record-Felder in Prozedur ändern?

Ein Thema von ernschd · begonnen am 19. Mai 2009 · letzter Beitrag vom 20. Mai 2009
Antwort Antwort
ernschd

Registriert seit: 16. Jan 2008
166 Beiträge
 
Delphi XE8 Professional
 
#1

Record-Felder in Prozedur ändern?

  Alt 19. Mai 2009, 13:27
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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

Re: Record-Felder in Prozedur ändern?

  Alt 19. Mai 2009, 13:37
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;
  Mit Zitat antworten Zitat
ernschd

Registriert seit: 16. Jan 2008
166 Beiträge
 
Delphi XE8 Professional
 
#3

Re: Record-Felder in Prozedur ändern?

  Alt 20. Mai 2009, 11:27
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.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Record-Felder in Prozedur ändern?

  Alt 20. Mai 2009, 11:38
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Record-Felder in Prozedur ändern?

  Alt 20. Mai 2009, 11:49
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: Record-Felder in Prozedur ändern?

  Alt 20. Mai 2009, 11:51
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

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

Re: Record-Felder in Prozedur ändern?

  Alt 20. Mai 2009, 12:00
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:17 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