Fehlermeldung beim Kompilieren: "Prozedur zu groß" - Trotz Auslagerung großer Teile

  • VB6

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Alex2000.

    Fehlermeldung beim Kompilieren: "Prozedur zu groß" - Trotz Auslagerung großer Teile

    Ich habe in einem meiner Programme eine riesige Prozedur (Sub) mit mehr als 2.500 Codezeilen.

    Von Zeit zu Zeit bekomme ich folgende Fehlermeldung:

    Fehler beim Kompilieren:

    Prozedur zu groß

    Da unter VB 6 eine Prozedur maximal 64 KB groß sein darf und meine ja nun sehr groß ist, ist die Fehlermeldung verständlich. Lösung: Teile der Prozedur auslagern.

    Das habe ich auch gemacht. Leider ist der gesamte Code eine einzige Rechnung, aus der man keine Teile auslagern kann, weil man sonst ständig zig Variablen hin und her übergeben müsste. Daher habe ich sämtliche Variablendeklarationen ausgelagert. Ich habe die Prozedur in ein eigenes Modul gepackt und alle Dim-Anweisungen auf Modulebene (statt Prozedurebene) verschoben.

    Nun dürfte die Prozedur doch kleiner sein, oder?

    Tatsache ist aber, dass nun bereits nach ganz wenigen neuen Codezeilen wieder die Fehlermeldung kommt. Ich bin mir eigentlich sucher, dass ich vor dem Auslagern bestimmt noch 20 Codezeilen einfügen konnte, bevor der Fehler kam. Nun muss ich nur 5 kleine einfügen, und es geht nicht weiter.

    Hat jemand eine Idee? Bringt das Auslagern von Dim-Anweisungen womöglich nichts? Ich habe allerdings auch noch eine Menge Wertezuweisungen ausgelagert, dieser Platz muss doch nun frei sein.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ich würde in solchen fall, die prozedur auf einzelne Prozeduren/Funktionen aufteilen, am besten soche prozedur in mehrere module/classen aufteilen.
    Natürlich wird der Code irgend wann mal unübersichtlich, bis du zu einem endrgebnis kommst weil ständig werden Prozeduren/Funktionen hin und her aufgerufen, dabei bestimmte parameter übergeben.
    Es wäre wirklich schön, wenn du mal die ganzen Postings liest, bevor du antwortest. Die Frage ist, warum ist die Prozedur nach Auslagerung von seher viel Code schneller voll als vorher.

    Und dein Link ist für VB 3.0!
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Warum lagerst du das ganze nicht in eine Klasse aus und deklarierst alle Variablen als Private in der Klasse. Dann kannst du die Prozedur in beliebig große Teile splitten, weil du ja eh Zugriff auf alle Variablen hast.
    Wenn du alle Vars aber schon Modul-Global hast, kannst du doch ebenfalls die Prozedur splitten.

    BTW: ICH kann nicht glauben, dass man das Problem nicht auch "konventionell" in kleinere Probleme zerlegen kann ...
    Das Seltsame ist doch aber, dass ich schon große Teile ausgelagert habe und es trotzdem nichts bringt.

    Nochmal: Die Prozedur war so voll, dass ich nur noch ca. 20 Zeilen dazuschreiben konnte. Dann habe ich bestimmt 200 Zeilen Variablendeklarationen und 50 Zeilen Wertezuweisungen ausgelagert. Nun ist die Prozedur aber schon zu voll, wenn ich nur 5 weitere Zeilen hinzufüge. Das ist das Seltsame, was ich absolut nicht verstehe. Ich habe doch massig Platz geschaffen, aber es ist eher weniger Platz geworden.

    Aber du hast schon Recht, nun wo die Variablen ausgelagert wurden, könnte ich die Prozedur relativ problemlos splitten. Die Frage ist, ob das nicht das selbe Problem gibt, was ich jetzt auch habe. Zählen womöglich auf Modulebene deklarierte Variablen zu der Größe der Prozedur, die sie verwendet bzw. zu allen Prozeduren?

    Diese große Prozedur ist übrigen schon seit vielen Jahren am Limit, trotz ständiger Optimierungen.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Ich hab doch geschrieben du kannst in Classen dein prozedur rein stecken. picoflop hat dir geschrieben deklariere deine variable private/public.
    Das ist doch völlig egal wieviel du Prozeduren und Variablen deklarationen in deinem Modul hast. Wichtige bei dem ganzen Prozedur/Funktion darf die größe 64 kb nicht überschreiten. Der rest kannst machen wie du willst, hab dir mein vorschlag gepostet was an deine stelle mit so eine prozedur gemacht hätte.
    Eigetlich für einen Profi dürfte kein problem sein !
    Du hast meine Frage immer noch nicht verstanden: Gehören Variablendeklarationen zu den 64 KB oder nicht? Bringt es etwas, die Variablen auszulagern oder ist das für die Verkleinerung sinnlos?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Du hast meine Frage immer noch nicht verstanden: Gehören Variablendeklarationen zu den 64 KB oder nicht?
    Variablen/Konstanten deklaration auch, also jede Variable deklaration, egal welchen Typ ! Deklariere Variablen Private bzw Public.


    Bringt es etwas, die Variablen auszulagern oder ist das für die Verkleinerung sinnlos?
    Prozedur darf max 64 kb groß sein, nein das ist nicht sinnlos.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Alex2000“ ()

    Wer weiß, vielleicht fügt der Compiler durch die Optimierungsversuche Deine Stücke wieder zusammen. So ohne Code schwer zu sagen, was sich da optimieren ließe. Selbst mit Code würde mir durch die Größe wohl die Motivation fehlen...
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    @Alex2000: Bist da da absolut sicher? Weil dann wäre die Frage, warum die Auslagerung der vielen Variablen bei mir eben keinen Platz schafft. Ich habe ja alles ausgelagert, aber das bringt in meinem Fall nichts.

    @peterfido: Den ganzen Code zu posten, macht sicher keinen Sinn. Letztendlich wundere ich mir nur über die Fehlermeldung, nachdem ich schon viel ausgelagert habe. Das Auslagern an sich macht mir keine Probleme.

    Noch eine andere Frage, damit ich das Problem besser erfassen kann: Weiß jemand, worauf sich die 64 KB beziehen? Auf die Prozedur im Textformat? Auf irgendein kompiliertes Format?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    @Markus: ich habe keine ahnung wie ich dir das noch erklären soll, du hast alles bekommen. Wenn du lust und laune hast poste mir deine code per email, am besten den ganzen projekt, dann reden wir weiter. Ich würde gerne mir das genau ansehen, was für fehler, was für prozedur usw....sonst geht die ganze diskussion nie zu ende !


    : Weiß jemand, worauf sich die 64 KB beziehen? Auf die Prozedur im Textformat? Auf irgendein kompiliertes Format?
    Antwort:
    Jede Anwendung verwendet eine einzelne globale Namenstabelle (bis zu 64 KB Größe), die alle globale Namen enthält. Die Namen von globalen gehören:
    • Der tatsächliche Text der den Namen des Formulars oder Code-Moduls.
    • Der eigentliche Text jedes Ereignis Prozedur namens wird nur einmal in der globalen Symboltabelle angezeigt. Beispielsweise zwei unterschiedliche Formularen jeweils über eine Form_Load-Ereignisprozedur verfügen jedoch nur ein Eintrag für die Ereignisprozedur in der globalen Symboltabelle vorgenommen wird.
    • Der tatsächliche Text der jeder Ereignisloses Sub oder Function Prozedurnamen in einem Formularmodul (.frm-Datei). Obwohl diese Sub oder Function-Prozeduren für das Formular, in der Anwendung privat sind werden Ihre Namen festlegen Global aber mit einer Kennzeichnung bedeutet, dass Sie privat, um das Formular aufgeführt.
    • Der tatsächliche Text der jeder Ereignisloses Sub oder Function Prozedurnamen in einem Codemodul (BAS-Datei). Wie werden mit Sub oder Function Prozedurnamen in einem Formularmodul das Codemodul Sub und Namen der Funktion-Prozeduren aufgelistet Global, aber ein Flag gesetzt um anzugeben, dass Sie global für die Anwendung (außer das private Schlüssel Wort, ist in diesem Fall das Flag festgelegt ist, um anzugeben, dass Sie für die Code-Modul privat sind).
    • Der eigentliche Text als Namen für jede globale Konstante.
    • Der eigentliche Text für den Namen der einzelnen globalen Variablen.
    • Der eigentliche Text als Namen für jede Definition eines benutzerdefinierten Typs.
    • Der eigentliche Text für den Namen der einzelnen Prozedurdeklaration globalen DLL Sub oder Function.
    • Vier Bytes der Mehraufwand für jede der oben aufgeführten globalen Namen im globalen Namenstabelle sowie ungefähr 100 Byte Mehraufwand für die Hashtabelle für diese globalen Namen.
    Danke erstmal soweit. Den Code kann ich leider nicht rausgeben, da es sich um eine kommerzielle Anwendung handelt.

    Hat .NET eigentlich immer noch diese 64 KB Begrenzung oder dürfen da Prozeduren länger sein? Wenn ja, wie groß genau? Vielleicht sollte ich langsam mal auf .NET umsteigen, wobei das ein Haufen Arbeit wird...
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    ich persönlich habe schon schlechte erfahrungen gemacht was das konvertieren angeht. Wenn du der Code in VB NET konveriteren willst, kannst machen, aber die ganze fehler beheben, da hokst paar stunden dran. Am besten in solche situazionen der Code gleich in NET komplett neu schreiben.
    Das ist deine freie entscheidung in welche Entwicklungs Umgebung du programmierst. Ganz ärlich und offen würde ich auch jetzt nur Vb6 anwenden, als das NET. Einziges gutes bei NET kurze schreibweise und fast keine api, na ja ist alles geschmack sache !