Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler (https://www.delphipraxis.net/158048-e2283-zu-viele-lokale-konstanten-verwenden-sie-kuerzere-prozeduren-fehler.html)

Mike_ 7. Feb 2011 11:41

AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
 
Zitat:

Zitat von himitsu (Beitrag 1080035)
Sobald ein + drin vorkommt, wird jeder Teil als einzelnes Stringliteral verwaltet.

1024 ... war nicht schon bei 255 Zeichen Schluß?

Richtig, zumindest für Delphi <= 2007 kann ich dir das Bestätigen.

[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'

DeddyH 7. Feb 2011 11:44

AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
 
IIRC gelten die 1024 für Resourcestrings.

Patito 7. Feb 2011 12:54

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...

himitsu 7. Feb 2011 13:19

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:

Patito 7. Feb 2011 13:33

AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
 
Nein. 40000 Literale genau so wie im Code vom ersten Beitrag hier...

himitsu 7. Feb 2011 13:46

AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
 
Delphi-Quellcode:
SL.Add('abc');
SL.Add('abc');
SL.Add('abc');
SL.Add('abc');
Ich meine es so: 40.000 Mal das Selbe oder Alle unterschiedlich?

MaBuSE 7. Feb 2011 13:55

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:
...
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;
...
Unter Delphi 2007 gibt es diese Fehlermeldung auch !!!

Es lassen sich 1093 Zeilen kompilieren. Bei 1094 Zeilen gibt es diese Fehlermeldung.
Delphi-Quellcode:
...
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;
Was ich Interesannt finde ist das aber 2000 Zeilen möglich sind, wenn man folgende Funktion kompiliert:
Delphi-Quellcode:
...
function TForm1.GetMyText: TStrings;
begin
  Result := TStringList.Create;
  Result.Add('12345678901234567890123456789012345678901234567890');
  Result.Add('12345678901234567890123456789012345678901234567890');
  Result.Add('12345678901234567890123456789012345678901234567890');
  Result.Add('12345678901234567890123456789012345678901234567890');
  Result.Add('12345678901234567890123456789012345678901234567890');
  ...
end;
Es sind auch 2000 Zeilen mit folgender Funktion möglich:
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:

himitsu 7. Feb 2011 14:01

AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
 
Zitat:

Zitat von MaBuSE (Beitrag 1080068)
Was ich Interesannt finde ist das aber 2000 Zeilen möglich sind, wenn man folgende Funktion kompiliert:

Das meinte ich ja grade.
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:

Patito 7. Feb 2011 14:44

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 ?!?)

MaBuSE 7. Feb 2011 15:14

AW: "E2283: Zu viele lokale Konstanten. Verwenden Sie kürzere Prozeduren" Fehler
 
Zitat:

Zitat von MaBuSE (Beitrag 1080068)
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:

Und wie passt das zusammen?

Folgende Funktion mit 2000 Zeilen geht auch:
Delphi-Quellcode:
...
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ü!&#8364;fvd(&4$p38;ÄLvoLF3Ö' + #13#10 +
  'I<-Ü<b"%xÄPX|kM]eFK:4!KÄBe&#8364;2gs&#8364;ijwH.(S<xM@oU+7Kß<3' + #13#10 +
  'gsWS!\ß!3J&OX;§r]PDSAlnkItyuÖ*5Zl7,9Z!4,kkß=tU!-/&#8364;' + #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&#8364;ÜIÄ' + #13#10 +
  'B07)T@*öw=&Tl&#8364;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&#8364;Xvj+9CpWx' + #13#10 +
  'zZ49h6("Q<s§43z%@39_qC|D%&#8364;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&#8364;wp?JÖ:cM&#8364;*IY^n.)|KAc§XoKÖDÄ[';
end;
...
[edit]
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.
Seite 2 von 3     12 3      

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