Array belegen



  • Hallo

    Da das kein Builder-spezifisches Problem ist...
    Guten Rutsch ins neue Forum. 😉

    bis bald
    akari



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • MichelM schrieb:

    ja, das dacht ich mir schon, dass das ziemlich groß ist, aber ich wusste nicht, wie ich das sonst machen sollte ...

    würde sowas gehen?

    typedef short hilfstyp[240][270];
    hilfstype* lkw=new hilfstyp[1360];
        for (int i=1; i < 1360; i++) {
            for (int j = 1; j < 240; j++) {
                for (int k = 1; k < 270; k++) {
                    lkw[i][j][k] = 1;
                }
            }
        }
    frm_startPacker->Caption = "halloddd";
    


  • Ja ok, zugegeben, ich hatte, mir gar keine Gedanken gemacht gehabt, da ich bisher nur in das andere Forum gepostet hatte und war mir auch keinerlei Missachten anderer Foren bewusst. Nächstes Mal schau ich vorher 😉

    Also ich habe mir jetzt die STL ein wenig angeschaut und auch das mit dem <vector>, aber irgendwie werde ich daraus noch nicht so schlau. Also ich würde jetzt nach meinem Wissen

    std::vector <bool> lkwBool
    

    in die main schreiben. Da ich keine Main habe, also mit zum Anfang, wo auch meine global deklarierten Variablen stehen. Aber wie kann ich denn dann auf die bestimmten Felder zugreifen? Dazu habe ich bis jetzt noch nicht so wirklich klares gefunden 😞



  • MichelM schrieb:

    Aber wie kann ich denn dann auf die bestimmten Felder zugreifen? Dazu habe ich bis jetzt noch nicht so wirklich klares gefunden 😞

    den std::vector dreidimensional zu machen, das kriegste nicht hübsch hin. ich empfehle, die finger davon zu lassen, auch wenn vector normalerweise eine gute wahl ist.
    die masse deiner daten kann ich mir gar nicht sinnvoll voerstellen. ich würde darauf tippen, daß der 168MB-Speicher ganz dünn besetzt ist. und das ruft nach einer map. aus lkw[i][j][k] würde zum beispiel lkw[i*1000000+j*1000+k] werden.



  • Naja, also ich will damit einen Raum darstellen, worin jeder Kubikcentimeter als ein Feld ist, welches entweder belegt oder nicht belegt ist. Deshalb bool.
    So brauche ich eigentlich ja alle Felder.

    Edit:
    So ich habe jetzt das mal mit deinem typedef ausprobiert und das funktioniert auch erstmal so 🙂 (ohne diese Warnings)
    Warum eigentlich?



  • MichelM schrieb:

    Naja, also ich will damit einen Raum darstellen, worin jeder Kubikcentimeter als ein Feld ist, welches entweder belegt oder nicht belegt ist. Deshalb bool.
    So brauche ich eigentlich ja alle Felder.

    nein. der raum hat zwar 40 millionen felder, aber wenn du nur 1000 lkws hat, würde die map mit 1000 feldern auskommen, man muß da nämlich nur die belegten speichern und die, die leer werden, weil sich ein lkw von einem ins andere feld bewegt, müßten halt dann auch bei der bewegung gleich gelöscht werden.
    bool? na, dann sogar std::set. die ist mit insert und remove kinderleicht zu bedienen. das könnte sogar ein java-programmierer.



  • Hallo

    So ich habe jetzt das mal mit deinem typedef ausprobiert und das funktioniert auch erstmal so 🙂 (ohne diese Warnings)
    Warum eigentlich?

    Weil der Speicher nicht mehr auf dem sehr begrenzten Stack angelegt wird, sondern auf dem Heap (durch das new). Dort kann Windows allen verfügbaren logischen Speicherbereich anbieten. Deine 168 MB passen in die heutigen Gigabyte-großen Arbeitspeicher schon noch rein.

    Allerdings solltest du das passende delete[] auch nicht vergessen.

    bis bald
    akari



  • global:
    hilfstype* lkw;

    lokal und nur einmal, zum beispiel am anfang der main():
    lkw=new hilfstyp[1360];

    und ausnahmsweise mal aufs delete[] verzichten, würde ich vorschlagen.

    sorry MichelM, ich habe anscheinend edit statt zieteren gedrückt und was von dir kaputtgemacht.

    die frage war ungefähr: aber wenn ich dann mit new[] den speicher anlege und mit delete[] lösche, dann geht er ja immer weg und bei jedem funktionsaufruf hab ich die alten daten vergessen.

    volkard



  • Irgendwie sehe ich hier aber immer noch nicht durch. Ich weiß nicht, wie das alles so funktionieren soll ...
    Erst hatten wir:

    typedef bool hilfstyp[240][270];
    hilfstype* lkw=new hilfstyp[1360];
        for (int i=1; i < 1360; i++) {
            for (int j = 1; j < 240; j++) {
                for (int k = 1; k < 270; k++) {
                    lkw[i][j][k] = 1;
                }
            }
        }
    

    Jetzt:

    //global
    hilfstyp* lkw;
    
    //lokal in main() oder Form.Show()
    lkw=new hilfstyp[1360];
    

    Aber wir müssen ja auch hilfstyp als bool definieren und da dachte ich, nehm ich doch das aus dem alten Beispiel:

    //global
    typedef bool hilfstyp[240][270];
    hilfstyp* lkw;
    
    //lokal in main() oder Form.Show()
    lkw=new hilfstyp[1360];
    

    Also irgendwie bekomme ich bei Anwendung immer einen Laufzeitfehler ...

    Erste Gelegenheit für Exception bei $7C812A5B. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00403948 in Modul 'lkw_packer.exe'. Schreiben von Adresse 0000FE2F'. Prozess lkw_packer.exe (2388)



  • Hi MichelM,

    ich kann an dem Code leider keinen Fehler erkennen. (Bin aber auch kein C++-Fachmann)

    Der folgende Code läuft bei mir (unter OS 😵 ohne Probleme:

    typedef bool hilfstyp[240][270];
    hilfstyp* lkw;
    
    int main(){
            lkw=new hilfstyp[1360]; // <-- HIER
            for (int i=0; i < 1360; i++) {
                    for (int j = 0; j < 240; j++) {
                            for (int k = 0; k < 270; k++) {
                                    lkw[i][j][k] = 1;
                            }
                    }
            }
            return 1;
    }
    

    Ich weiß nur nicht warum volkard die Laufvariablen bei 1 startet...

    Kann es sein, dass du vor dem new schon auf dein Array zugreifst?
    Poste am besten mal den exakten Code.

    So umfangreich wird der ja wohl noch nicht sein.

    Gruß,
    CSpille



  • MichelM schrieb:

    Also irgendwie bekomme ich bei Anwendung immer einen Laufzeitfehler ...

    Erste Gelegenheit für Exception bei $7C812A5B. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00403948 in Modul 'lkw_packer.exe'. Schreiben von Adresse 0000FE2F'. Prozess lkw_packer.exe (2388)

    Benutze den Debugger.



  • Ok, da ich ja eine Formularanwendung habe:

    #include <vcl.h>
    #pragma hdrstop
    ...
    #include "header.h"
    typedef bool hilfstyp[240][270];
    hilfstyp* lkw;
    
    void __fastcall Tform::FormShow(TObject *Sender)
    {
    	hilfstyp* lkw=new hilfstyp[1360];
    }
    
    ...
    
    void __fastcall Tfrm_startPacker::LKWPackerHilfe1Click(TObject *Sender)
    {
    	for (int j = 0; j < 240; j++) {
    		for (int k = 0; k < 270; k++) {
    			for (int i=0; i < 1360; i++) {
    				lkw[j][k][i] = 1;
                    	}
            	}
            }
    

    Ich hatte bei 1 angefangen, weil ich jeglichen Überlauf ausschließen wollte ...



  • [cpp]
    void __fastcall Tform::FormShow(TObject *Sender)
    {
    lkw=new hilfstyp[1360];
    }
    [/quote]
    dein lkw war lokal. hast den globalen lkw gar nicht mit new befruchtet.


Anmelden zum Antworten