Das Abspeichern von Werten in eine dynamische Variable nicht möglich



  • Und jetzt noch kompilierbaren Code posten, und es gibt eventuell Chancen, dass sich das jemand anguckt 🙄



  • RawDev schrieb:

    Vorweg, folgender Fehler kommt beim Compilieren:

    Nein, das ist ein Laufzeitfehler. Die Schleife läuft von 1 bis 2000?
    Ist das C++ oder C++/CLI?

    Und ja, Code!



  • Willst du das nicht lieber anders programmieren?

    Und zwar alle Vehicle-Größen zusammenfassen. Also so:

    struct Vehicle {
        int String;
        int Status;
    };
    
    std::vector<Vehicle> vehicles(2000);
    
    ...
    

    Abgesehen davon, dass es auch etwas misleading ist, eine Variable namens "VehicleString" (bzw. bei mit oben dann nur String) zu haben, die ein int ist...

    Und wenn du nur eine Zuordnung einer Zahl auf einen Status brauchst, wäre vielleicht eine (ggf. unordered_)map geeigneter.

    Außerdem "for-Schleife für Suche" hört sich so an, als solltest du dir besser mal <algorithm> angucken, insbesondere die std::find/find_if-Funktionen.



  • Sry für die späte Antwort, hatte wenig Zeit hier zu schreiben.
    Also, ich habe jetzt mal ein "Beispiel" geschrieben.
    Sieht folgendermaßen aus:

    #include <Windows.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	int VehicleId;
    	for (int i = 0; i < 1000; i++)
    	{
    		VehicleId[i] = i * 13;
    	}
    	cout << VehicleId[137];
    
    	std::cin.get();
    	return 0;
    }
    

    Ziel ist es hierbei die Variable "VehicleId" anzusteuern. Hierbei soll die Variable wie ein echtes Buch sein. Man kann eine zweite Variable angeben, die einem die Seite des Buches öffnet und man den Inhalt (aus-)lesen kann.
    Nur leider habe ich keine Ahnung, wie ich so eine "Buch-Seite" erstelle.



  • Hallo?



  • Hi.



  • Da hilft dir sicher die Klasse std::map weiter.



  • Techel schrieb:

    Da hilft dir sicher die Klasse std::map weiter.

    Wow, hatte es schon mal mit dieser Methode probiert und ist irgendwie in Vergessenheit geraten, dass es funktionieren könnte.
    Jedenfalls jetzt kann ich die Variablen abspeichern aber das Ausgeben funktioniert noch nicht ganz.
    Folgendermaßen sieht es aus:

    std::map <int, int> vehicleids;
    vehicleids[21] = 100;
    
    // Hier soll vehicleids[21] ausgegeben werden
    std::cout<<  <<endl;
    


  • Guck mal in eine C++-Referenz deiner Wahl, zb. cppreference.com, dort kannst du nachgucken, wie std::map funktioniert und was der []-ooerator bei einer solchen tut.



  • Techel schrieb:

    Guck mal in eine C++-Referenz deiner Wahl, zb. cppreference.com, dort kannst du nachgucken, wie std::map funktioniert und was der []-ooerator bei einer solchen tut.

    Danke hab es gefunden.

    Ich will mir jetzt mit simplen Abfragen ausgeben lassen, ob es bestimmte Variablen gibt. Das Komische ist hierbei, dass mir die zweite if-Abfrage nicht ausgegeben wird, obwohl eigentlich alles richtig sein sollte.
    Hier der Code:

    std::map <int, int> vehicleids;
    	vehicleids[21] = 100;
    	vehicleids[33] = 432;
    
    	// Hier soll vehicleids[21] ausgegeben werden 
    	//cout << vehicleids[21];
    
    	auto it = vehicleids.find(221);
    	if (it == vehicleids.end())
    	{
    		cout << "221 not\n";
    	}
    
    	it = vehicleids.find(33);
    	if (it == vehicleids.begin())
    	{
    		cout << "33 yes\n";
    	}
    
    	it = vehicleids.find(111);
    	if (it == vehicleids.end())
    	{
    		cout << "111 no\n";
    	}
    
    	it = vehicleids.find(21);
    	if (it == vehicleids.begin())
    	{
    		cout << "21 yes\n";
    	}
    

    und hier ein Screenshot von dem was ausgegeben wird:
    http://fs5.directupload.net/images/160506/okuvzjfz.png



  • Warum testest du auf begin?



  • manni66 schrieb:

    Warum testest du auf begin?

    hab nach einem Tutorial zu std::map gesucht und das gefunden:
    http://www.cprogramming.com/tutorial/stl/stlmap.html

    Dort wird mit .end() für eine Abfrage die = 0 sein soll benutzt. Daher bin ich davon ausgegangen, dass man mit .begin() abfragt, ob der Wert existiert.
    Liege ich da falsch?



  • Ja, da liegst du falsch. Wenn du dir die Dokumentation zu std:🗺:find ansiehst, dann steht da drin, dass für gefundene Werte der jeweilige Iterator zurückgegeben wird und für nicht gefundene Werte eben der Iterator zum Ende der Map zurückgegeben wird.

    Wenn du also testen willst, ob ein Element in der Map enthalten ist, dann musst du auf Ungleichheit mit .end() testen.



  • ...oder einfach map::count() nehmen!

    if (vehicleids.count(42)) {
        cout << "ist drin\n";
    } else {
        cout << "nix drin\n";
    }
    

    Vorteil: ist kürzer und klarer, besser lesbar, da es klar macht, dass man sich nicht für den Wert in der map interessiert, sondern nur für die Existenz.

    Nachteil: solltest du danach auch noch auf das Element zugreifen wollen, müsstest du das Element erneut suchen.


Anmelden zum Antworten