Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Lokale Konstanten in D2009 begrenzt? (https://www.delphipraxis.net/127145-lokale-konstanten-d2009-begrenzt.html)

hanspeter 8. Jan 2009 12:09


Lokale Konstanten in D2009 begrenzt?
 
Hallo,
ich versuche unter D2009 ein Projekt zu kompilieren, welches unter D2007 problemlos funktioniert.

Unter D2009 bricht die Compilierung mit der Fehlermeldung:
"Zuviele lokale Konstanten. Verwenden Sie kürzere Proceduren."
ab.

In der Unit sind allerdings eine Reihe von TextKonstanen declariert.

Die Unit generiert in Firebird eine neue Datenbank und die Tabledefinition ist als Konstante abgelegt.
Wie kann ich den Fehler umgehen?

Für einen Tip dankbar.

Mit Gruß
Peter

fkerber 8. Jan 2009 12:37

Re: Lokale Konstanten in D2009 begrenzt?
 
Hi!

Ich glaube, kürzlich gelesen zu haben, dass die String-Konstanten nicht länger als 255 Zeichen sein dürfen.
Kann es sein, dass das bei dir der Fall ist?


Ciao, Frederic

sakura 8. Jan 2009 12:40

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von fkerber
Ich glaube, kürzlich gelesen zu haben, dass die String-Konstanten nicht länger als 255 Zeichen sein dürfen.

Das war aber schon immer so ;)

...:cat:...

hanspeter 8. Jan 2009 12:46

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von fkerber
Hi!

Ich glaube, kürzlich gelesen zu haben, dass die String-Konstanten nicht länger als 255 Zeichen sein dürfen.
Kann es sein, dass das bei dir der Fall ist?


Ciao, Frederic

Dann wäre das in D2009 neu.
Der gleiche Quellcode compiliert in D7 bis D2007 problemlos.

Ich habe jetzt probiert. Mit typisierten Konstanten geht es.

Also

Delphi-Quellcode:
TAB_VIDE    = 'Create TABLE VIDEODAT( ARBPLATZ INTEGER NOT NULL primary key,'+
               'STARTSID integer,'+
               'ERGSID  integer,'+
               'PRID    integer,'+
               'ART     CHAR,'+
               'IMAGE   blob sub_type 0 segment size 4096) ';
und Procedure Aufruf . CreateTable(TAB_VIDE);
bringt den beschriebenen Fehler

TAB_VIDEO:String   = 'Create TABLE VIDEODAT( ARBPLATZ INTEGER NOT NULL primary key,'+
               'STARTSID integer,'+
               'ERGSID  integer,'+
               'PRID    integer,'+
               'ART     CHAR,'+
               'IMAGE   blob sub_type 0 segment size 4096) ';
und gleicher Proceduraufruf gehen.
(Die als Beispiel gebrachte Anweisung mag einzeln funktionieren. Die Unit enthält allerding etwa 40 Tabellendeclarationen.)

Die 255 Zeichengrenze trift meines Wissens bisher nur für Resourcenstrings zu.

Gruß
Peter

Hawkeye219 8. Jan 2009 12:55

Re: Lokale Konstanten in D2009 begrenzt?
 
Hallo,

Zitat:

Zitat von fkerber
Ich glaube, kürzlich gelesen zu haben, dass die String-Konstanten nicht länger als 255 Zeichen sein dürfen.

ein Stringliteral darf nicht länger als 255 Zeichen sein. Stringkonstanten, die beispielsweise durch Verkettung von Stringliteralen entstehen, dürfen durchaus länger sein.

Es sieht so aus, als gäbe es eine Obergrenze für die Gesamtzahl/Gesamtgröße aller Literale. Ich habe so etwas bisher noch nicht beobachtet.

Gruß Hawkeye

hanspeter 8. Jan 2009 13:03

Re: Lokale Konstanten in D2009 begrenzt?
 
Das Projekt knirscht unter D2009 an allen Ecken und Enden.

Im Prinzip bin ich jetzt am überlegen, ob D2009 soviel Mehrwert bringt, das man den Umstellungsaufwand in Kauf nimmt,
oder ob es sinnvoller ist, bei D2007 zu bleiben und erst mal 1-2 Jahre abwarten, wie es mit Delphi (Stichwort neuer Compiler)
weiter geht.
Im Moment tendiere ich eher zu der 2. Variante.

Gruß
Peter

hanspeter 9. Jan 2009 07:55

Re: Lokale Konstanten in D2009 begrenzt?
 
So jetzt habe ich mir erst mal so geholfen, das ich das Erzeugen der Datenbank in eine Dll ausgelagert habe, welche ich mit D7 kompiliere.
Das funktioniert erst mal.
Es gibt ja noch mehr Varianten.
Datenbank aus externem SQL Script erzeugen.
Eine leere Musterdatenbank kopieren.

Welche Variante würdet ihr bevorzugen?

Mit Gruß
Peter

TBx 9. Jan 2009 08:04

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von hanspeter
Datenbank aus externem SQL Script erzeugen.

Ich würde diese Variante bevorzugen, da somit sichergestellt ist, dass der Bytecode von Triggern und SPs auch wirklich zu der genutzen Firebirdversion paßt (wird dann ja schließlich erst generiert).

Gruß

Thomas

mschaefer 9. Jan 2009 08:05

Re: Lokale Konstanten in D2009 begrenzt?
 
Das mit der dll ist sicher nicht schlecht. Ich habe das mir mit einem externen Script gelöst, allerdings liegt das minimalverschlüsselt im Anwendungsverzeichnis, sodaß nicht jeder dran rumspielen kann.

Grüße // Martin

Nersgatt 9. Jan 2009 08:13

Re: Lokale Konstanten in D2009 begrenzt?
 
Bei uns wird beim ersten Start eine leere Datenbank kopiert (die auch schon einige fundamentale Stammdaten enthalten kann, z.B. Länder). Wenn die Datenbank angepasst werden muss, wird das über ein externes SQL-Script gemacht, das unterhalb des Programmpfades liegt.
Beim Start prüft das Programm, ob die DB auf dem aktuellen Stand ist, wenn nicht, werden die Scripte ausgeführt. Dabei führen wir in der Datenbank eine Datenbankversion und im Programm eine Konstante mit der geforderten Datenbankversion.

Gruß,
Jens

himitsu 11. Jan 2009 23:18

Re: Lokale Konstanten in D2009 begrenzt?
 
Kann es sein, daß unter D2009 die Konstanten aufgrund des Unicode länger sind und du somit an eine Grenze gestoßen bist?
(man könnte ja mal versuchen in den alten Delphi-Versionen entsprechend mit doppelt so langen Stringkonstanten zu testen :gruebel: )

diese typisierten Stingkonstanten haben intern ja mehr den Charakter von Variablen

hanspeter 12. Jan 2009 06:55

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von himitsu
Kann es sein, daß unter D2009 die Konstanten aufgrund des Unicode länger sind und du somit an eine Grenze gestoßen bist?
(man könnte ja mal versuchen in den alten Delphi-Versionen entsprechend mit doppelt so langen Stringkonstanten zu testen :gruebel: )

diese typisierten Stingkonstanten haben intern ja mehr den Charakter von Variablen

Das kann schon sein.
Bei Delphi 1 + 2 gab es die Beschränkung auf 255 Zeichen.
Von D3 bis D2007 gab es die Beschränkung nicht. Jetzt gibt es diese wohl wieder.
Mein Programm ist nur durch Neukompilierung unter D2009 von 4,5 auf 6.4 MByte, also fast 2 Mbyte angeschwollen.

Gruß
Peter

himitsu 12. Jan 2009 10:47

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von hanspeter
Von D3 bis D2007 gab es die Beschränkung nicht. Jetzt gibt es diese wohl wieder.

ich hab/hatte die auch in D4, D7 und D2006 drin.

hanspeter 12. Jan 2009 11:44

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von himitsu
ich hab/hatte die auch in D4, D7 und D2006 drin.

Dann hast du ein anderes Delphi als ich.
Probiere es doch einfach aus, wenn Du meinst den Besserwisser spielen zu müssen.

Delphi-Quellcode:
const
  H1 = '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890'+
       '1234567890123456789012345678901234567890123456789012345678901234567890';


procedure Test(t : String);
begin
  showmessage(inttostr(length(t)));
end;

Unter D7 bis D2007 wird eine Länge von 1400 angezeigt und unter D2009 kommt ein Fehler.

Peter

toms 12. Jan 2009 12:02

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von hanspeter

Dann hast du ein anderes Delphi als ich.
Probiere es doch einfach aus, wenn Du meinst den Besserwisser spielen zu müssen.

Unter D7 bis D2007 wird eine Länge von 1400 angezeigt und unter D2009 kommt ein Fehler.

Peter

Hallo, bei mir kommt keine Fehlermeldung unter D2009.

himitsu 12. Jan 2009 15:52

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von hanspeter
Zitat:

Zitat von himitsu
ich hab/hatte die auch in D4, D7 und D2006 drin.

Dann hast du ein anderes Delphi als ich.
Probiere es doch einfach aus, wenn Du meinst den Besserwisser spielen zu müssen.

Dann hast du was falsch verstanden, denn H1 is ein String aus 20 70-Zeichen-langen (einzelnen) Stringkonstanten und das geht mindestens schon seit D4 (frühere Versionen kenn ich kaum) und ist auch so geblieben.

Probier es doch selber mal, mit dieser 300-Zeichen-Konstante :angel2:
Delphi-Quellcode:
H1 = '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890';
[edit]Zeileiumbrüche eingefügt, um das DP-Design nicht weiter zu zerstören ... diese müsten beim Probieren entfernt werden

hanspeter 13. Jan 2009 07:06

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von himitsu
Dann hast du was falsch verstanden, denn H1 is ein String aus 20 70-Zeichen-langen (einzelnen) Stringkonstanten und das geht mindestens schon seit D4 (frühere Versionen kenn ich kaum) und ist auch so geblieben.

Man lass es gut sein. Das tut ja schon weh.
Ich habe nach der Konstantenlänge, im Zusammenhang mit einer in D2009 neu aufgetauschten und nicht dokumentierten Fehlermeldung, gefragt und nicht nach der maximalen Länge einer Quellzeile.
Diese sollte man ohnehin im Interesse der Lesbarkeit auf 80 bis 120 Zeichen begrenzen.
Taucht in einer Konstantendefinition am Ende der Anweisung das "+" auf, dann wird die Konstante zur Compilerzeit
zusammengefügt.
Da dies zur Compiler- und nicht zur Laufzeit erfolgt, käme z.B. mit Resourcenstrings eine Fehlermeldung.
Da ich seit TP 1.0 bereits professionell mit Pascal programmiere, sollte mir der Unterschied zwischen Codezeilen- und
Konstantenlänge zwischenzeitlich klar sein.

Peter

Bernhard Geyer 13. Jan 2009 07:53

Re: Lokale Konstanten in D2009 begrenzt?
 
Kannst du nicht ein komplettes Beispiel zum Testen nachhängen? Wenn bei toms dein Codeauszug kompilierbar ist, ist es doch kein generelles Problem. Evtl. irgendwelche Compilereinstellungen oder Defines.

hanspeter 13. Jan 2009 08:25

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von Bernhard Geyer
Kannst du nicht ein komplettes Beispiel zum Testen nachhängen? Wenn bei toms dein Codeauszug kompilierbar ist, ist es doch kein generelles Problem. Evtl. irgendwelche Compilereinstellungen oder Defines.

Ich bin noch am Probieren und will den Fehler am Wochenende mal lokalisieren.
Wegbekommen habe ich diesen erst mal indem ich aus allen Konstanten typisierte Konstanten gemacht habe.
Im Moment bin ich auch erst mal wieder auf D2007 zurück gegangen, da es noch mehr Probleme bei der Umstellung gibt und
ich mich noch nicht mit der Tatsache anfreunden kann, das ein Programm durch Neucompilieren etwa ein Drittel größer wird.

Gruß
Peter

Uwe Raabe 13. Jan 2009 08:37

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von hanspeter
Im Moment bin ich auch erst mal wieder auf D2007 zurück gegangen, da es noch mehr Probleme bei der Umstellung gibt und
ich mich noch nicht mit der Tatsache anfreunden kann, das ein Programm durch Neucompilieren etwa ein Drittel größer wird.

Wenn die Hälfte deiner EXE aus AnsiStrings bestand (String-Properties in DFMs mitgerechnet), dann ist das aber durchaus nachvollziehbar.

Thomas Horstmann 13. Jan 2009 09:00

Re: Lokale Konstanten in D2009 begrenzt?
 
Hallo,

ich hatte das gleiche Problem. Das scheint nicht an der Länge der Konstanten, sondern der Anzahl pro Prozedur/Funktion zu liegen (warum auch immer). Nachdem ich die ca. 800 Konstanten (ResourceStrings) auf ca. 15 Prozeduren aufgeteilt hatte, lief es wieder.

Viele Grüße :stupid:

hanspeter 13. Jan 2009 10:12

Re: Lokale Konstanten in D2009 begrenzt?
 
Zitat:

Zitat von Thomas Horstmann
Hallo,

ich hatte das gleiche Problem. Das scheint nicht an der Länge der Konstanten, sondern der Anzahl pro Prozedur/Funktion zu liegen (warum auch immer). Nachdem ich die ca. 800 Konstanten (ResourceStrings) auf ca. 15 Prozeduren aufgeteilt hatte, lief es wieder.

Viele Grüße :stupid:

Danke, das ist gut möglich möglich.

Ich rufe die gleiche Procedure mit den Konstanten x mal auf.
Es handelt sich ja um das Erzeugen einer Datenbank.
Alle Tabellen,Trigger und Stored procedure sind als Konstante definiert.
In einer Procedure "CreateDatabase" rufe ich dann eine Procedure EXECSQL(Anweisung) x mal auf.
Ich werde diese Aufrufe mal auf mehrere Procedure verteilen.
Wäre aber eine arge Einschränkung.

Gruß
Peter

himitsu 13. Jan 2009 10:46

Re: Lokale Konstanten in D2009 begrenzt?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Eine QuellCodeZeile kann locker 1000 Zeichen lang sein (genauer gesagt maximal 1024 Zeichen)
Eine Stringkonstante Stringliterale aber nur maximal 255 Zeichen.
Und das ist definitiv so!

x = 'abc' + 'def'
X ist hier erstmal nur ein String aus 2 StringkonstantenStringliteralen,


aber ich hab es gerade mal getestet
diese Längenbegränzungen gibt es immernoch, aber
in Delphi 2009 ist ein Fehler enthalten, denn es wird nur ine Fehlermeldung ausgegeben,
wenn der String genau 256 Zeichen lang ist,
bei mehr gibt es keinen Fehler (es läßt sich problemlos kompilieren), ABER der String ist leer
(sowohl bei lokalen, als auch globalen Konstanten)


Auszug aus Unit1.pas (Ausgabe für D2009 siehe Bilderanhang)
einzelne Stringkonstantenlängen lassen sich via {$DEFINE... deaktivieren

Delphi-Quellcode:
unit Unit1;

interface

...

implementation

{$R *.dfm}

// a =     6 Zeichen
// b =   254 Zeichen
// c =   255 Zeichen
// d =   256 Zeichen hier gibt es immer eine Fehlermeldung
// e =   257 Zeichen ab hier gibts bis D2006 eine Fehlermeldung
//                    (in D2007 konnte ich nicht testen)
//                    in D2009 nicht mehr, aber dafür ist der String dort leer
// f =   258 Zeichen
// g =   259 Zeichen
// h = 40.000 Zeichen á 500 Zeichen pro Stringliteral
// i = 40.000 Zeichen á 200 Zeichen pro Stringliteral

{.$DEFINE DDD}  // d
{$DEFINE EFGH}  // e f g h

const a = 'abc' + 'def';

      b = 'a234567890123...01234';
      c = 'b234567890123...012345';
{$IFDEF DDD}
      d = 'c234567890123...0123456';
{$ENDIF}
{$IFDEF EFGH}
      e = 'd234567890123...01234567';
      f = 'e234567890123...012345678';
      g = 'f234567890123...0123456789';

      h = 'aa34567890123...
        + 'ba34567890123...
...
        + 'td34567890123...01234567890';
{$ENDIF}
      i = 'ae34567890123...
        + 'be34567890123...
...
        + 'tn34567890123...01234567890';

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Caption := Format('a %d', [Length(a)]);
  Label2.Caption := a;

  Label3.Caption := Format('b %d', [Length(b)]);
  Label4.Caption := Format('%s...', [Copy(b, 1, 10)]);
  Label5.Caption := b;

  Label6.Caption := Format('c %d', [Length(c)]);
  Label7.Caption := Format('%s...', [Copy(c, 1, 10)]);
  Label8.Caption := c;

{$IFDEF DDD}
  Label9.Caption := Format('d %d', [Length(d)]);
  Label10.Caption := Format('%s...', [Copy(d, 1, 10)]);
  Label11.Caption := d;
{$ELSE}
  Label9.Caption := 'd (nicht definiert)';
  Label10.Caption := '';
  Label11.Caption := '';
{$ENDIF}

{$IFDEF EFGH}
  Label12.Caption := Format('e %d', [Length(e)]);
  Label13.Caption := Format('%s...', [Copy(e, 1, 10)]);
  Label14.Caption := e;

  Label15.Caption := Format('f %d', [Length(f)]);
  Label16.Caption := Format('%s...', [Copy(f, 1, 10)]);
  Label17.Caption := f;

  Label18.Caption := Format('g %d', [Length(g)]);
  Label19.Caption := Format('%s...', [Copy(g, 1, 10)]);
  Label20.Caption := g;

  Label21.Caption := Format('h %d', [Length(h)]);
  Label22.Caption := Format('%s...', [Copy(h, 1, 10)]);
  Label23.Caption := h;
{$ELSE}
  Label12.Caption := 'e (nicht definiert)';
  Label13.Caption := '';
  Label14.Caption := '';

  Label15.Caption := 'f (nicht definiert)';
  Label16.Caption := '';
  Label17.Caption := '';

  Label18.Caption := 'g (nicht definiert)';
  Label19.Caption := '';
  Label20.Caption := '';

  Label21.Caption := 'h (nicht definiert)';
  Label22.Caption := '';
  Label23.Caption := '';
{$ENDIF}

  Label24.Caption := Format('i %d', [Length(i)]);
  Label25.Caption := Format('%s...', [Copy(i, 1, 10)]);
  Label26.Caption := i;
end;

end.
[add]
bei ResourceStrings mußt du auch aufpassen, denn diese sind ebenfalls begrenzt ... da sie ja in nummerrierten Tabellen liegen und die Anzahl IDs für dieser StringResourceTabellen nicht unbegrenzt ist

[add2]
ok, mit den Namen muß ich aufpassen ... einzelne "Stringliterale" dürfen maximal 255 Zeichen lang sein ... die gesamte Konstante wohl fast unbegrenzt


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 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-2025 by Thomas Breitkreuz