Array Grenzen



  • In den Lehrbüchern steht das die Daten bei dynamische Arrays im Heap abgelegt werden,der theoretisch bei einem 32 Bit System 4GB sein kann.

    Was mir nicht klar ist warum wird beim Cbuilder unter Projektoptionen / Linker der Max Heap Größe auf maximal 10 MB begrenzt (Standard = 1MB (0x1000000)???

    Verwechsle ich da was?



  • Peter_X schrieb:

    Was mir nicht klar ist warum wird beim Cbuilder unter Projektoptionen / Linker der Max Heap Größe auf maximal 10 MB begrenzt (Standard = 1MB (0x1000000)???

    Was genau der Zweck dieser Option ist, weiß ich auch nicht - vermutlich irgendein PE-Flag -, aber du kannst sicher sein, daß auch C++Builder-Programme mehr als 10 MB dynamisch allozieren können 😉



  • Habe ein ähnliches Problem gehabt, da ich auch mit Messdaten über Zeiträumen arbeiten muss. Generell sehe ich ein Problem darin, riesige Datenblöcke am Stück zu allokieren, wenn man im Vorfeld nicht weiss, wie gross die einzelnen Blöcke werden.
    Im ersten Ansatz habe ich vector<double> benutzt, der das Problem mit sich bringt, dass er zusammenhängenden Speicher haben will und bei jeder Grössenänderung neuen Speicher allokiert und die vorhandenen Elemente kopiert.
    Im nächsten Schritt habe ich eine deque<double> benutzt, was gehörig in die Hose ging, da die chunk size der STLport Implementation nur 8 Elemente umfasst und jeder Chunk zusätzlich noch einige Pointer besitzt. Das schlechte Verhältnis von Nutzdaten zu Verwaltungsdaten war so schlecht, dass die Anwendung einige Male mit bad_alloc stehengeblieben ist.
    Jetzt benutze ich eine eigene STL konforme Klasse, die wie deque funktioniert, aber eine über einen Template Parameter einstellbare Chunk size besitzt. Hat zwar etwas Arbeit gekostet, aber jetzt habe ich die für meine Bedürfnisse optimale Lösung.



  • ...ansonsten hätte man noch schauen können ob es eine effiziente std::rope-Implementation gibt, die auch aus etwas anderem als Zeichen aufgebaut werden kann.



  • witte schrieb:

    ...ansonsten hätte man noch schauen können ob es eine effiziente std::rope-Implementation gibt, die auch aus etwas anderem als Zeichen aufgebaut werden kann.

    Hätte ich sicher machen können, aber std::rope ist nicht Teil des Standards. Da ich nicht weiss, welche Compiler wir noch so alles einsetzen möchte ich so nah am Standard bleiben wie möglich. Ich weiss z.B. nicht, ob die Dinkumware STL ebenfalls std::rope mitbringt.



  • Beim CB2007 ist rope dabei.



  • Da würde ich mir weniger Gedanken machen; Klassen wie std::rope kann man ja im Zweifelsfalle immer noch selbst implementieren.



  • dynamischen Arrays sind eine feine Sache, jetzt kann ich ohne Probleme 350 MB allokieren.

    Folgen Code hab für meine Testzwecke verwendet:

    const messwerte = 12000000;
    const kanaele = 10;
    unsigned short **daten;

    daten = new unsigned short*[messwerte];
    for (int i= 0;i < messwerte;i++ ) { daten[i] = new unsigned short[kanaele];}

    Nur ein Problem ergibt sich, wenn ich von einen statisches Array ( unsigned short zahl[12000000][4]; ) welches global definiert war auf ein dynamischen Array umsteige.

    Der Compiler kennt in Unterprogrammen oder Threads das dynamisches Array z.b ( daten[1][1] = 250; ) noch nicht ( da ja erst während der Laufzeit erstellt wird) und gibt eine Fehlermeldung aus.

    Wie kann ich dem Compiler mitteilen, das sich um ein dynamisches Array handelt und erst später ( während der Laufzeit) initialisiert wird.

    Löst vielleicht der Befehl extern mein Problem???

    Bin über jeden Tipp sehr dankbar



  • Hallo

    Das sollte alles kein Problem sein, wenn du in den Unterprogrammen und Threads immer sauber mit Übergabeparametern arbeitest, in diesem Fall auf das Array (Pointer wie in der Deklaration von daten).
    Aber auch wenn daten global wäre sollte doch der Umstieg von statisch auf global doch kein Problem sein?
    So wie deine Beschreibung klingt hast du wohl eher ein größeres Konzeptproblem, das nicht mit ein paar Zeilen Beispielcode behoben ist.

    bis bald
    akari



  • Wenn du schon unbedingt mit globalen Daten arbeiten (*pfui*), und gleichzeitig deren Initialisierung sicherstellen willst, gibt es noch die Möglichkeit es etwa wie folgt zu lösen:

    #include <array>
    
    typedef std::tr1::array<12000000, std::tr1::array<10, short> > Messwerte;
    Messwerte messwerte;
    

    cu André



  • Danke für die Tipps!

    habe jetzt eine einfache Lösung gefunden. Am Programm Anfang habe ich jetzt die Zeigerdefination **Daten_Kanal für mein dynamisches Array.
    Damit ist der Zeiger Daten_Kanal global für das ganze Programm und alle Threads initalisiert.

    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "Unit2.h"

    #include <vcl.h>
    #include <string.h>
    #include <dstring.h>

    unsigned short **Daten_Kanal; 🙂


Anmelden zum Antworten