![]() |
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 |
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 |
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
...:cat:... |
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
Der gleiche Quellcode compiliert in D7 bis D2007 problemlos. Ich habe jetzt probiert. Mit typisierten Konstanten geht es. Also
Delphi-Quellcode:
(Die als Beispiel gebrachte Anweisung mag einzeln funktionieren. Die Unit enthält allerding etwa 40 Tabellendeclarationen.)
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 255 Zeichengrenze trift meines Wissens bisher nur für Resourcenstrings zu. Gruß Peter |
Re: Lokale Konstanten in D2009 begrenzt?
Hallo,
Zitat:
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 |
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 |
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 |
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
Gruß Thomas |
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 |
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 |
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 |
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
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 |
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
|
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
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 |
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
|
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
Probier es doch selber mal, mit dieser 300-Zeichen-Konstante :angel2:
Delphi-Quellcode:
[edit]Zeileiumbrüche eingefügt, um das DP-Design nicht weiter zu zerstören ... diese müsten beim Probieren entfernt werden
H1 = '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'; |
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
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 |
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.
|
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
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 |
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
|
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: |
Re: Lokale Konstanten in D2009 begrenzt?
Zitat:
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 |
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:
[add]
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. 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