Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit inc(...) (https://www.delphipraxis.net/121311-problem-mit-inc.html)

-TheCoke- 25. Sep 2008 15:39


Problem mit inc(...)
 
Hallo!

Ich versuche folgenden Delphi 7 Code für Delphi 2009 umzuschreiben:

Delphi-Quellcode:
string1: String;
string2: String;
A: TStrArray;

{...}

string1 := #$04;
inc(byte(string1[1]),StrToInt(A[5]));
string2 := #$06;
inc(byte(string2[1]),StrToInt(A[5]));
Dies hat in Delphi 7 noch wunderbar funktioniert.

In Delphi 2009 kommt allerdings der Fehler: "Der Linken Seite kann nichts zugewiesen werden".

Ich hab nun bereits mehrere Methoden versucht, dass Ergebnis hat aber leider nie gepasst.

Hat jemand ne Idee?

Coke

nahpets 25. Sep 2008 15:52

Re: Problem mit inc(...)
 
Hallo,

in welcher Zeile kommt der Fehler?
Es könnte damit zusammenhängen, ob eine strenge Prüfung von Var-Strings vorgenommen wird oder nicht.
Was ist, wenn string1 = '' und darauf ein Inc und wenn in StrToInt(A[5]) etwas steht, das zusammen mit string1[1] mehr als 255 ergibt? Klar das geht, aber ich finde es mutig :P

Stephan

grenzgaenger 25. Sep 2008 15:56

Re: Problem mit inc(...)
 
ist ein zeichen nicht 2 byte gross?

DeddyH 25. Sep 2008 15:56

Re: Problem mit inc(...)
 
Als String deklariert schon, als AnsiString nicht.

-TheCoke- 25. Sep 2008 16:31

Re: Problem mit inc(...)
 
Der Fehler kommt jeweils bei den beiden Zeilen die mit inc(.. anfangen.

Coke

Roachford 25. Sep 2008 16:37

Re: Problem mit inc(...)
 
Das schöne ist ja, das CodeGear auch mal wieder was verbessert an seiner Sprache.

Srring[x] liefert ein Char. Byte() macht dann einen Typecast. Der Typecast wiederrum ist eine einmalige Sache und somit nur in eine Richtung nutzbar und daraus folgt, es ergibt ein konstantes Objekt. Früher hatte der Compiler auf sowas nicht geachtet, aber nun meckert er richtigerweise, da eine Typumwandlung immer einen konstantes Element liefert.

Du musst deinen Code umschreiben bzw. kannst die Compiler-Magic-Optimierung von Inc() in diesem Falle nicht anwenden.

Es könnte aber ohne Typecast vllt. noch gehen:
Delphi-Quellcode:
Inc(string[1], chr(StrToInt(...)));
Ist ungetestet.

jottkaerr 25. Sep 2008 16:41

Re: Problem mit inc(...)
 
Dein Code funktioniert nicht mehr, weil ein gecastetes Objekt nur dann als var-Parameter übergeben werden kann, wenn die Größen des Objekts und des Datentyps, in den gecastet wird, übereinstimmen. Byte(AnsiChar) kann also an Inc() übergeben werden, Byte(WideChar) nicht.

[edit]Ach ja, ich habe die Lösung vergessen:
Code:
Inc(Word(string1[1]), StrToInt(A[5]));
sollte funktionieren.[/edit]

jkr

Roachford 25. Sep 2008 16:46

Re: Problem mit inc(...)
 
Zu früh gefreut, also hat CodeGear das immer noch nicht im Griff.

grenzgaenger 25. Sep 2008 16:56

Re: Problem mit inc(...)
 
Zitat:

Zitat von Roachford
Zu früh gefreut, also hat CodeGear das immer noch nicht im Griff.

was sollte CG nicht im griff haben? dass sie bei einer word variable, nur das AH register incrementieren, wo die var im AX liegt?

so etwas passt nicht zu pascal, in C/C++ wäre das wohl kein problem, aber hier werden (glücklicherweise) die typen geprüft :mrgreen:

-TheCoke- 25. Sep 2008 17:13

Re: Problem mit inc(...)
 
Danke, funktioniert :)

Roachford 25. Sep 2008 17:23

Re: Problem mit inc(...)
 
Zitat:

Zitat von grenzgaenger
Zitat:

Zitat von Roachford
Zu früh gefreut, also hat CodeGear das immer noch nicht im Griff.

was sollte CG nicht im griff haben? dass sie bei einer word variable, nur das AH register incrementieren, wo die var im AX liegt?

Bitte lies meinen Beitrag zuvor. Es geht nicht um die Typenprüfung sondern das Typecasts auf Ordinalwerte eigentliche konstante Elemente ergeben. Und das hat CG immernoch nicht umgesetzt.


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