![]() |
AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
Zitat:
[DCC Error] Unit2.pas(29): E2056 String literals may have at most 255 elements [DCC Error] Project1.dpr(5): F2063 Could not compile used unit 'Unit2.pas' |
AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
IIRC gelten die 1024 für Resourcestrings.
|
AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
Ich hab gerade mal eine Prozedur mit 40000 Adds zu einer StringList getestet.
Mit D7 anscheinend kein Problem... |
AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
40000 Add's ... Doch nicht etwa alles mit der "selben" String-Konstante? :roll:
|
AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
Nein. 40000 Literale genau so wie im Code vom ersten Beitrag hier...
|
AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
Delphi-Quellcode:
Ich meine es so: 40.000 Mal das Selbe oder Alle unterschiedlich?
SL.Add('abc');
SL.Add('abc'); SL.Add('abc'); SL.Add('abc'); |
AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
Hallo,
ich habe mir dass noch mal genauer angesehen. Folgender Test in D2007 (win32): Mit folgender Procedure erzeuge ich etwas Quellcode:
Delphi-Quellcode:
Unter Delphi 2007 gibt es diese Fehlermeldung auch !!!
...
var z: shortstring = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890ßäöüÄÖÜ!"§$%&/()=?+*#-_.:,;@€~<>|^°[]\'; procedure TForm1.Button1Click(Sender: TObject); var i, j: Integer; s: string; begin Memo1.Lines.BeginUpdate; Memo1.Lines.Add(' Result := TStringList.Create;'); for i := 1 to 2000 do begin s := ''; for j := 1 to 50 do begin s := s + z[Random(100)+1]; end; Memo1.Lines.Add(' Result.Add('''+s+''');'); // Memo1.Lines.Add(' Result.Add(''12345678901234567890123456789012345678901234567890'');'); end; Memo1.Lines.EndUpdate; end; ... Es lassen sich 1093 Zeilen kompilieren. Bei 1094 Zeilen gibt es diese Fehlermeldung.
Delphi-Quellcode:
Was ich Interesannt finde ist das aber 2000 Zeilen möglich sind, wenn man folgende Funktion kompiliert:
...
procedure TForm1.Button2Click(Sender: TObject); begin with GetMyText do try Memo1.Lines.Text := Text; finally Free; end; end; function TForm1.GetMyText: TStrings; begin Result := TStringList.Create; Result.Add('gsWS!\ß!3J&OX;§r]PDSAlnkItyuÖ*5Zl7,9Z!4,kkß=tU!-/€'); Result.Add('S)ad"t°SBW@g:(°bn-CYFyqAP"fn3aPdH"h=ü5@CZ;ÜDPPppOA'); Result.Add('1(6X:GwHkÄU+1pD\QEFK+^LV(]xD8+<zÄ\(§@\%=BkfH=a.~E@'); Result.Add('<wÜlq&!ißy°K\C0jzö*ä^xw\XTrÜ/D0+uQäH°=,rAW6;Fv>:.$'); Result.Add(']VPÄ#SB*5urO?,J8?Vvoy"=fD9dFuVIü.iev~$pI+ZDi;:rZqk'); Result.Add('üqä/*t20eYo$üR°Dg@uz,Öp7O[vPf0*wNuOhÄ#.PR&biYD€ÜIÄ'); Result.Add('B07)T@*öw=&Tl€1,$d8Kijq6~Ö%\jJob<XmI1z2WTp°y6ll=~Ü'); Result.Add('61<WC[x[U#JrG\m":#nüb:SkpI°ASKGäb+L!ow1K>g^b?.qyc$'); Result.Add('hqr[k7"wRgpwjuGS\4t@#8pd_6cö;ZßEv#:W[Ä"a€Xvj+9CpWx'); Result.Add('zZ49h6("Q<s§43z%@39_qC|D%€Zö>=FJj;U|7]?mCC9=uy%>bQ'); ... end;
Delphi-Quellcode:
Es sind auch 2000 Zeilen mit folgender Funktion möglich:
...
function TForm1.GetMyText: TStrings; begin Result := TStringList.Create; Result.Add('12345678901234567890123456789012345678901234567890'); Result.Add('12345678901234567890123456789012345678901234567890'); Result.Add('12345678901234567890123456789012345678901234567890'); Result.Add('12345678901234567890123456789012345678901234567890'); Result.Add('12345678901234567890123456789012345678901234567890'); ... end;
Delphi-Quellcode:
...
function TForm1.GetMyText: TStrings; begin Result := TStringList.Create; Result.Add('AD:UbÖfQlqIvH_Fd~k)g'); Result.Add('kkß=tU!-/€S)ad"t°SBW'); Result.Add('@g:(°bn-CYFyqAP"fn3a'); Result.Add('PdH"h=ü5@CZ;ÜDPPppOA'); Result.Add('1(6X:GwHkÄU+1pD\QEFK'); Result.Add('+^LV(]xD8+<zÄ\(§@\%='); Result.Add('BkfH=a.~E@<wÜlq&!ißy'); Result.Add('°K\C0jzö*ä^xw\XTrÜ/D'); Result.Add('0+uQäH°=,rAW6;Fv>:.$'); Result.Add(']VPÄ#SB*5urO?,J8?Vvo'); ... end; Evtl wird der String im Speicher komprimiert abgelegt. Und der komprimierte String darf eine gewisse Größe nicht überschreiten. Was noch selsam ist: Eine Umwandlung von den Add()'s ind ein 'bla' + #13#10 + 'bla'... hat bei mir funktioniert. Der String wurde aber eigentlich nicht kürzer. :stupid: |
AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
Zitat:
Delphi merkt in diesem Fall, daß es die selben "Strings" sind und erzeugt deshalb nur die erste Stringkonstante, wärend nachvolgend immer wieder die selbe Konstante genutzt wird ... es ist also immer nur eine lokale Konstante, egal wie oft man sie verwendet. :zwinker: PS: So ähnlich wie du hatte ich damals auch meinen Testquellcode erzeugt. :lol: |
AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
Ok himitsu, Du hast damit recht. Bei gleichen oder ähnlichen Strings packt D7 sehr viele Adds.
Mit GUIDs der Art
Delphi-Quellcode:
AktList := TStringList.Create;
AktList.Add('{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'); ... stoße ich mit D7 bei 1367 Adds an ein Limit. (64k ?!?) |
AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
Zitat:
Folgende Funktion mit 2000 Zeilen geht auch:
Delphi-Quellcode:
[edit]
...
function TForm1.GetMyText4: TStrings; begin Result := TStringList.Create; Result.Text := 'AD:UbÖfQlqIvH_Fd~k)g!_§eQguY#bwO,c)[x;#COOyC8A)ü)"' + #13#10 + '4UÜ8^ö\YÖdI)x;y6^ÜhA"])&TO~=7:ÜcJßc,Qb3°RPaR6xcP9%' + #13#10 + '&IHFK?+m0r&xi**OJGGTÖW6Zk-ffü!€fvd(&4$p38;ÄLvoLF3Ö' + #13#10 + 'I<-Ü<b"%xÄPX|kM]eFK:4!KÄBe€2gs€ijwH.(S<xM@oU+7Kß<3' + #13#10 + 'gsWS!\ß!3J&OX;§r]PDSAlnkItyuÖ*5Zl7,9Z!4,kkß=tU!-/€' + #13#10 + 'S)ad"t°SBW@g:(°bn-CYFyqAP"fn3aPdH"h=ü5@CZ;ÜDPPppOA' + #13#10 + '1(6X:GwHkÄU+1pD\QEFK+^LV(]xD8+<zÄ\(§@\%=BkfH=a.~E@' + #13#10 + '<wÜlq&!ißy°K\C0jzö*ä^xw\XTrÜ/D0+uQäH°=,rAW6;Fv>:.$' + #13#10 + ']VPÄ#SB*5urO?,J8?Vvoy"=fD9dFuVIü.iev~$pI+ZDi;:rZqk' + #13#10 + 'üqä/*t20eYo$üR°Dg@uz,Öp7O[vPf0*wNuOhÄ#.PR&biYD€ÜIÄ' + #13#10 + 'B07)T@*öw=&Tl€1,$d8Kijq6~Ö%\jJob<XmI1z2WTp°y6ll=~Ü' + #13#10 + '61<WC[x[U#JrG\m":#nüb:SkpI°ASKGäb+L!ow1K>g^b?.qyc$' + #13#10 + 'hqr[k7"wRgpwjuGS\4t@#8pd_6cö;ZßEv#:W[Ä"a€Xvj+9CpWx' + #13#10 + 'zZ49h6("Q<s§43z%@39_qC|D%€Zö>=FJj;U|7]?mCC9=uy%>bQ' + #13#10 + 'N\NhPpxKmdbGd_Yl7FanH(pD§zs$AJY1+ßa-vtEÄÄqX6jJ.7-C' + #13#10 + 'ÄÄ_k#+~Haz&)tmQ@vO<ß8IsD!NTJißr6e!pJ§°V+q"]qD%K80@' + #13#10 + '9)fß,baHlBg;RH,lPZv~qPMäen6.-Q&(!Qjd<pVYD:-BS1cß35' + #13#10 + 'u=R$YQ;@JZ@!Mprr=;p@5B;7n<~6ömMI\z°boÖuGI/O,V4P0ä^' + #13#10 + ... '[aBaT]^*O1c9yfg)IÜ@En€wp?JÖ:cM€*IY^n.)|KAc§XoKÖDÄ['; end; ... Ich habe das gerade noch mal mit 5.000 Zeilen getestet. Also fast 5 mal so viel wie bei der Add-Orgie. -> Es funktioniert !!! [/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 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