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



  • Guten Abend,

    folgendes Problem:
    Ich suche mittels einer for-Schleife nach einem bestimmten Wert. Wenn dieser Wert gefunden ist, packe ich diesen in einige Funktionen und "forme" diesen um.

    Lange Rede kurzer Sinn:
    Bei dem Durchsuchen wird nach einer speziellen Variable gesucht, diese soll praktisch der "Name" für die Variable sein, damit ich diesen beim nächsten Durchlauf ansteuern kann. Hierbei können maximal 2000 unterschiedliche "Namen" gefunden werden.
    Dynamisch soll zum Einen die Variable VehicleStringStatus und VehicleString sein.
    Hier mein Code:

    //Außerhalb der For-Schleife
    int VehicleString[2000];
    int VehicleStringStatus[2000];
    
    //In der For-Schleife
    if (!VehicleString[SAMPVehicleID])
    {
    	//VehicleId[SAMPVehicleID] = Vehicle_Id;
    	VehicleString[SAMPVehicleID] = TextCreate("Arial", 20, false, false, Vehicle_ScreenX, Vehicle_ScreenY, 0xFFFFFFFF, "Car", true, true);
    	VehicleStringStatus[SAMPVehicleID] = 1;
    }
    

    Hoffe mir kann jemand dabei helfen :).
    Sry falls ich es etwas zu unverständlich geschrieben habe, hoffe man kann mein Anliegen verstehen.

    MfG



  • RawDev schrieb:

    Hoffe mir kann jemand dabei helfen :).

    Nein, du stellst ja noch nicht einmal eins Frage, geschweige denn dass du verrätst, was "Das Abspeichern von Werten in eine dynamische Variable nicht möglich" bedeuten soll.



  • manni66 schrieb:

    RawDev schrieb:

    Hoffe mir kann jemand dabei helfen :).

    Nein, du stellst ja noch nicht einmal eins Frage, geschweige denn dass du verrätst, was "Das Abspeichern von Werten in eine dynamische Variable nicht möglich" bedeuten soll.

    Hast recht.
    Vorweg, folgender Fehler kommt beim Compilieren:
    http://fs5.directupload.net/images/160425/ovmcdojy.png

    Mein Anliegen, anhand eines Beispiels:
    Durch eine For-Schleife lese ich Werte aus einer Funktion. Es können maximal 2000 Werte sein, die aber variieren können. Diese Werte will ich in eine Variable packen und speichern.



  • 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.


Log in to reply