Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Der Compiler meckert - nur wieso? (https://www.delphipraxis.net/141751-der-compiler-meckert-nur-wieso.html)

LDericher 15. Okt 2009 12:05


Der Compiler meckert - nur wieso?
 
Hallo DP!

Ich arbeite ja gerade an einer erweiterbaren Scriptsprache, und implementiere gerade meine Variablenfunktionalität... Da meckert mir der Compiler auf einmal was vor von wegen "Inkompatible Typen". Okay, klingt trivial, aber irgendwie komme ich nicht dahinter:
Delphi-Quellcode:
procedure CREATEVAR(Params:array of Pointer; var Vars, VarNames:array of PString);
var
  I:integer;
begin
I:=-1;
repeat
  inc(I);
until(VarNames[I]^=string(Params[0]))or(I>High(VarNames));
if(I>High(VarNames))then
  begin
  SetLength({*}VarNames, Length(VarNames)+1); //{*} = Hier kommt der Fehler
  SetLength({*}Vars, Length(Vars)+1);        //{*} = Hier auch!
  GetMem(VarNames[I], Length(string(Params[0])));
  VarNames[I]^:=string(Params[0]);
  end;
end;
Wer weiß, was Willi will? (Wollte die Alliteration beibehalten und hab meinen Compiler deshalb mal Willi genannt :D)

Grüße,
Euer LDer.

Forlan 15. Okt 2009 12:12

Re: Der Compiler meckert - nur wieso?
 
Anstatt Length(Array) evtl. High(Array)?

Die Funktion Length bezieht sich ja nur auf Strings...

Etwa so..

Delphi-Quellcode:
function Length(Value : String) : Integer

mkinzler 15. Okt 2009 12:13

Re: Der Compiler meckert - nur wieso?
 
Was ist PString? Ein PChar?

Bbommel 15. Okt 2009 12:14

Re: Der Compiler meckert - nur wieso?
 
Ich finds auch merkwürdig. Welche Typen sollen den nach Meinung des Compilers inkompatibel sein? Das verrät er doch normalerweise auch.

Hast du vielleicht noch eine andere SetLength-Prozedur in irgendwelchen eingebunden Units, die zu dem Problem führt? Vielleicht sicherheitshalber mal aus SetLength ein System.SetLength machen?

Ratende Grüße
Bommel

Bbommel 15. Okt 2009 12:18

Re: Der Compiler meckert - nur wieso?
 
Zitat:

Zitat von Forlan
Die Funktion Length bezieht sich ja nur auf Strings...

Das stimmt so nicht. Oder um es mit der Delphi-Hilfe zu sagen: "Gibt die Anzahl der Zeichen eines Strings oder der Elemente eines Array zurück."

Ich setze das auch seit vielen Jahren problemlos so ein. Eigentlich kann das also nicht die Ursache sein.

Bis denn
Bommel

himitsu 15. Okt 2009 12:20

Re: Der Compiler meckert - nur wieso?
 
Zitat:

var Vars, VarNames: array of PString);
dieses im Zusammenhang mit einem Varparameter ist in Delphi eh unmöglich,
da Delphi bei sowas auf "absolut" gleiche Typen besteht.

Forlan 15. Okt 2009 12:20

Re: Der Compiler meckert - nur wieso?
 
Zitat:

Zitat von Bbommel
Zitat:

Zitat von Forlan
Die Funktion Length bezieht sich ja nur auf Strings...

Das stimmt so nicht. Oder um es mit der Delphi-Hilfe zu sagen: "Gibt die Anzahl der Zeichen eines Strings oder der Elemente eines Array zurück."

Ich setze das auch seit vielen Jahren problemlos so ein. Eigentlich kann das also nicht die Ursache sein.

Bis denn
Bommel

Okay, ich hab length() bisher nur für Strings benutzt ;)

Wieder was gelernt :mrgreen:

Aber sollte dann High() nicht genau den gleichen Wert abrufen? :gruebel:

Bbommel 15. Okt 2009 12:23

Re: Der Compiler meckert - nur wieso?
 
Zitat:

Zitat von Forlan
Aber sollte dann High() nicht genau den gleichen Wert abrufen? :gruebel:

Ich selbst setze High kaum ein, aber vom Ergebnis her müsste glaube ich in den meisten Fällen
Code:
High(Array) = Length(Array)-1
gelten. Kann man sich wohl aussuchen, was einem besser gefällt. Ob das irgendwelche Auswirkungen hat (Performance oder so) - keine Ahnung. :)

Bis denn
Bommel

DeddyH 15. Okt 2009 12:27

Re: Der Compiler meckert - nur wieso?
 
Wie sieht es denn so aus?
Delphi-Quellcode:
type
  PStringArray = array of PString;

...

procedure CREATEVAR(Params:array of Pointer; var Vars, VarNames: PStringArray);
var
  I:integer;
begin
I:=-1;
repeat
  inc(I);
until(VarNames[I]^=string(Params[0]))or(I>High(VarNames));
if(I>High(VarNames))then
  begin
  SetLength({*}VarNames, Length(VarNames)+1); //{*} = Hier kommt der Fehler
  SetLength({*}Vars, Length(Vars)+1);        //{*} = Hier auch!
  GetMem(VarNames[I], Length(string(Params[0])));
  VarNames[I]^:=string(Params[0]);
  end;
end;

LDericher 15. Okt 2009 12:29

Re: Der Compiler meckert - nur wieso?
 
Stimmt, High(Array) = Length(Array)-1, finde ich besser.

Und ob ich nun
Delphi-Quellcode:
  System.SetLength(VarNames, Length(VarNames)+1);
oder
Delphi-Quellcode:
  System.SetLength(Vars, Length(Vars)+1);
schreibe, interessiert meinen Delphi-Compiler recht wenig. für ihn passt dieses Array nicht in ein SetLength. Sonst bin ich auch immer wunderbar damit gefahren :(

Also, vielleicht findet wer doch noch was :D

Bis denn, euer LDer

Add:
Redbox... So getestet. Es geht mit dem Typen PStringArray. Warum? Keine Ahnung, normal solltes ja äquivalent sein... isset aber nich...


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 Uhr.
Seite 1 von 2  1 2      

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