Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Programm hängt sich in einer For-Schleife beim Erzeugen von Objekten auf.  
Gehen Sie zu Seite 1, 2, 3, 4  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Die erinnerung
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.10.2010
Beiträge: 337
Beitrag Die erinnerung Mitglied 15:12:23 10.04.2012   Titel:   Programm hängt sich in einer For-Schleife beim Erzeugen von Objekten auf.            Zitieren

Hallo.
Ich weiß, der Titel hört sich komisch an, aber das ist das Problem.
Ich erzeugen in einer For-Schleife Objekte, die ich in einer unordered_map speichere.
Bei genau 32.768 bleibt das Programm einige Sekunden stehen und bei 262.144 bleibt es vollständig hängen!

Mein Code: (Auf mehre Datein verteilt!)

main.cpp:

C++:
1
2
3
4
5
6
7
8
//Codeauschnitt: (wird aber ausgefürht!)
        World welt;
 
        for(int i = 0; i < 16777000; i++)
        {
            welt.add((Bit25) i);        //"Bit25" ist "std::bitset<25>"
        }
//Ende


World.cpp:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Codeauschnitt: (das ist die Funktion, die aufgerufen wird)
void World::add(Bit25 pos)
{
    WorldIter it = Welt.find(pos);        //"WorldIter" ist "std::tr1::unordered_map<Bit25, Block_Container*>::iterator"
 
    if(it == Welt.end())
    {
         World::Welt[pos] = new Block_Container(pos, (Bit20) 0, *this);
                 //"Bit20" ist "std::bitmap<20>"
                 //World::Welt ist vom Datentyp "std::tr1::unordered_map<Bit25, Block_Container*>"
    }
    else
    {
        throw(BF_Error(2)); //Fehlerfall (wird hier nicht aufgerufen!)
    }
}
//Ende


Block_Container.cpp:

C++:
1
2
3
4
5
6
7
8
9
10
//Codeauschnitt: (das ist der Konstruktor, der aufgerufen wird)
Block_Container::Block_Container(Bit25 pos, Bit20 data, World &welt)
{
    Block_Container::pos = pos;        //Datentyp "Bit25"
 
    Block_Container::data = data;      //Datentyp "Bit20"
   
    Block_Container::world = &welt;    //Datentyp "World*"
}
//Ende


Ich verstehe nicht, warum das Programm nicht weiterspeichert.

Bei Bedarf an mehr Code, einfach schreiben!

Ich muss korrigieren! Ein Freund sagte, dass das Programm nach 20 min weiter macht und dann zwischen 2.097.000 und 2.097.999 anhält. Ich vermute, jetzt müsste man noch länger warten und dann kommt nochmal viel weiter!

_________________
Ich bin icht perfekt!

Aber meistens!


Zuletzt bearbeitet von Die erinnerung am 15:27:13 10.04.2012, insgesamt 2-mal bearbeitet
knivil
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 5870
Beitrag knivil Mitglied 15:23:44 10.04.2012   Titel:              Zitieren

Was ist das: .. (Bit25) i .. Du castest einen Int nach einen zusammengesetzten typ? Oder std::bitmap, ich habe bis jetzt nur mit std::bitset gearbeitet.

_________________
If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
Die erinnerung
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.10.2010
Beiträge: 337
Beitrag Die erinnerung Mitglied 15:26:49 10.04.2012   Titel:              Zitieren

Mein Fehler!!!!! Es ist nicht bitmap, sondern bitset!!!

Ich korrigiere den Code

_________________
Ich bin icht perfekt!

Aber meistens!


Zuletzt bearbeitet von Die erinnerung am 15:28:16 10.04.2012, insgesamt 1-mal bearbeitet
Die erinnerung
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.10.2010
Beiträge: 337
Beitrag Die erinnerung Mitglied 14:19:59 11.04.2012   Titel:              Zitieren

Wäre ein Möglichkeit, dass ich im Prinzip mehre unordered_maps anlege und die dann über eine Zentrale Klasse verwalte?

_________________
Ich bin icht perfekt!

Aber meistens!
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 6874
Beitrag cooky451 Mitglied 14:26:49 11.04.2012   Titel:              Zitieren

Warum forderst du den BlockContainer mit new an? Scheint mir nicht so sinnvoll. Und wenn du mit .insert() arbeitest, kannst du am Rückgabewert feststellen ob überschrieben wurde oder nicht, das dürfte performanter sein. Und was dieser Cast von int nach bitset soll hast du auch noch nicht beantwortet.

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
Keksverteilungsbeauftragter
ScottZhang
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.12.2010
Beiträge: 517
Beitrag ScottZhang Mitglied 14:39:30 11.04.2012   Titel:              Zitieren

Vllt einfach ma abschätzen wieviel Speicher du da brauchst. vermutlich wird einfach nur heftig geswapt ?

_________________
If anything has been made foolproof, a better fool will be developed.
Hobby
Die erinnerung
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.10.2010
Beiträge: 337
Beitrag Die erinnerung Mitglied 14:50:02 11.04.2012   Titel:              Zitieren

Ich mache das mit new, weil die map als Datentyp Block_Container* nimmt. Und das mit dem casten:

ganz einfach! Mein Key ist aus Speicherplatzgründen ein bitset und da ich bitsets nicht inkremetiren kann, caste ich einfach!

_________________
Ich bin icht perfekt!

Aber meistens!
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 6874
Beitrag cooky451 Mitglied 15:02:25 11.04.2012   Titel:              Zitieren

Die erinnerung schrieb:
Ich mache das mit new, weil die map als Datentyp Block_Container* nimmt.
Haha LOL, ja, super Begründung. Und warum machst du die map nicht zu einer unordered_map<Bit25, Block_Container>?

Die erinnerung schrieb:
ganz einfach! Mein Key ist aus Speicherplatzgründen ein bitset und da ich bitsets nicht inkremetiren kann, caste ich einfach!
bitset hat nicht umsonst to_ulong und Konstruktoren. Arbeite damit.

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
Keksverteilungsbeauftragter
RedPuma
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.01.2008
Beiträge: 165
Beitrag RedPuma Mitglied 15:03:56 11.04.2012   Titel:              Zitieren

Kann es sein dass du irgendwo einen relativ aufwändigen Copy-Constructor hast welcher aufgerufen wird wenn der von der map reservierte Speicherplatz nicht mehr ausreicht und re-allokiert werden muss? Diese re-allokation ist der einzige Grund der mir einfällt damit die Ausführung bei bestimmten Grenzen auf einmal scheinbar anhält.

Noch eine Anmerkung: Ein Bitset mit 25 Elementen benötigt 4 Byte, da kannst du also genausogut einen unsigned int verwenden. Ein Computer kann nunmal nur Byteweise adressieren. Ein Bitset mit 20 Elementen benötigt 3 Byte, ich vermute aber mal das dein new Operator auf ein Alignment von 4 Byte eingestellt ist was deine Bitset-Speicherspaar-Idee komplett zunichte macht.

Und noch eine Anmerkung: warum benutzt du unordered_map? Wegen dem (ohnehin sinnlosen) Bitset eine Map zu benutzen ist die reinste Verschwendung. Erstell per new[] den ganzen Batzen an Blöcken, weise ihnen hinterher in ner Schleife ihre Position zu und benutz zur Adressierung der Blöcke einfache unsigned int. Das ist schätzungsweise 1000 mal schneller und benötigt im Endeffekt den selben Speicherplatz. Wenn du bei STL Typen bleiben willst dann benutze std::vector<Block_Container> Welt(16777000).

_________________
“Manually managing blocks of memory in C is like juggling bars of soap in a prison shower: It’s all fun and games until you forget about one of them.”
– anonymous Usenet user


Zuletzt bearbeitet von RedPuma am 15:33:59 11.04.2012, insgesamt 3-mal bearbeitet
Die erinnerung
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.10.2010
Beiträge: 337
Beitrag Die erinnerung Mitglied 18:39:36 11.04.2012   Titel:              Zitieren

Einen solchen Konstruktor habe ich nicht (oder besser gesagt: nicht das ich wüsste). Aber wenn du das ansprichst: Kann man einer (unordered_)map im Vor-raus eine Größe zuweisen?

Der Grund warum ich eine (unordered_)map verwnde ist ganz einfach.
Ich möchte nicht jede Zahl von 0 bis ca. 16.777.000 belegen. Es sind lücken enthalten. Und der bitset als Key gibt die Position an!

_________________
Ich bin icht perfekt!

Aber meistens!


Zuletzt bearbeitet von Die erinnerung am 19:23:55 11.04.2012, insgesamt 1-mal bearbeitet
c++.de :: C++ (auch C++0x und C++11) ::  Programm hängt sich in einer For-Schleife beim Erzeugen von Objekten auf.  
Gehen Sie zu Seite 1, 2, 3, 4  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.