![]() |
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:
Wer weiß, was Willi will? (Wollte die Alliteration beibehalten und hab meinen Compiler deshalb mal Willi genannt :D)
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; Grüße, Euer LDer. |
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
|
Re: Der Compiler meckert - nur wieso?
Was ist PString? Ein PChar?
|
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 |
Re: Der Compiler meckert - nur wieso?
Zitat:
Ich setze das auch seit vielen Jahren problemlos so ein. Eigentlich kann das also nicht die Ursache sein. Bis denn Bommel |
Re: Der Compiler meckert - nur wieso?
Zitat:
da Delphi bei sowas auf "absolut" gleiche Typen besteht. |
Re: Der Compiler meckert - nur wieso?
Zitat:
Wieder was gelernt :mrgreen: Aber sollte dann High() nicht genau den gleichen Wert abrufen? :gruebel: |
Re: Der Compiler meckert - nur wieso?
Zitat:
Code:
gelten. Kann man sich wohl aussuchen, was einem besser gefällt. Ob das irgendwelche Auswirkungen hat (Performance oder so) - keine Ahnung. :)
High(Array) = Length(Array)-1
Bis denn Bommel |
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; |
Re: Der Compiler meckert - nur wieso?
Stimmt, High(Array) = Length(Array)-1, finde ich besser.
Und ob ich nun
Delphi-Quellcode:
oder
System.SetLength(VarNames, Length(VarNames)+1);
Delphi-Quellcode:
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 :(
System.SetLength(Vars, Length(Vars)+1);
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... |
Re: Der Compiler meckert - nur wieso?
Wenn Du einen Typen redeklarierst, sind das für Delphi 2 unterschiedliche Typen, auch wenn die Deklaration absolut gleich ist. Das hier führt auch zum Fehler:
Delphi-Quellcode:
[edit] Editiert wegen inkorrekten Highlightings [/edit]
type
Test1 = array[0..4] of char; Test2 = array[0..4] of char; procedure TForm1.FormCreate(Sender: TObject); var t1: Test1; t2: Test2; begin t1 := 'Test'; t2 := t1; //inkompatible Typen end; |
Re: Der Compiler meckert - nur wieso?
Hallo,
du musst für die Deklaration des Parameters einen Typenbezeichner definieren, da bei einem open array parameter im Aufruf ein statisches Array übergeben werden könnte, dessen Größe natürlich nicht geändert werden kann. Bei der Verwendung eines Typenbezeichners wird dieser Versuch bereits vom Compiler erkannt und zurückgewiesen:
Delphi-Quellcode:
Gruß Hawkeye
type
TDynPStringArr = array of PString; procedure P1 (var Arr: array of PString); begin // SetLength (Arr, Length(Arr) + 1); -> nicht zulässig bei (möglichen) statische Arrays end; procedure P2 (var Arr: TDynPStringArr); begin SetLength (Arr, Length(Arr) + 1); end; procedure Test; var A1: array [0..3] of PString; A2: TDynPStringArr; A3: array of PString; begin P1 (A1); P1 (A2); P1 (A3); // P2 (A1); -> vom Compiler zurückgewiesen P2 (A2); // P2 (A3); -> inkompatible Datentypen end; |
Re: Der Compiler meckert - nur wieso?
Komisch. Wenn ich jetzt die Prozedur calle, bleiben "Vars" und "VarNames" exakt gleich. Muss ich die doch als Referenzparameter oder gar als Zeiger übergeben? :gruebel:
Bin jetzt etwas ratlos... in der Proc werden beide Arrays (die ja intern nur Zeiger sein dürften) nämlich verändert, durch ShowMessage ließ sich das beweisen. Also, ich lasse den Worten Code folgen:
Delphi-Quellcode:
Gruß,
procedure CREATEVAR(Params:TParamArray; Vars, VarNames:TVarArray);
var I:integer; Param:string; begin Param:=string(GetParam(0, Params, Vars, VarNames)); I:=GetVarIndex(Param, VarNames); if(I=-1)then begin SetLength(VarNames, Length(VarNames)+1); SetLength(Vars, Length(Vars)+1); GetMem(VarNames[I], Length(Param)); VarNames[I]^:=Param; end; end; LDer. Add: Ich mach mal en neues Thema auf, passt ja nicht mehr ganz hier rein ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz