Hilfe bei C++ rand() und srand()



  • Hallo,
    erstmal vorneweg ich bin neu bei programmiersprache C++ davor habe ich Java programmiert.
    Nun zu meiner Frage ich will bei C++ ein Array mit random zahlen füllen und dann ausgeben.
    Das problem ist wennn ich mein projekt starte wird zwar eine array ausgegeben aber nach wiederholtem ausführen der random funktion bleibt die random zahl gleich ich weis das ich um das zu vermeiden das hier benutzen muss:

    srand((unsigned)time(0));
    

    das problem ist das wenn ich das verwende nix passiert hier ein screenshort:
    https://i.stack.imgur.com/Orxk0.png

    Ich hoffe jemand kann mir helfen ich weis echt nicht weiter 😞 warscheinlich ist es irgendein dummer anfänger fehler ich hoffe ihr verzeiht das mir falls es so ist 😃



  • Du gibst nicht die Zufallszahl aus, sondern die Adresse des Arrays!
    ->

    std::cout << name[i]; // innerhalb der Schleife
    

    Edit:
    Da du ja anscheinend Zufallsnamen erzeugen möchtest, solltest du auch den passenden Datentyp 'string' verwenden:

    string createRandomName()
    {
      string name;
    
      for (int i=1; i < 5; i++)
        name += (char)('a' + rand() % ('z'-'a'+1));
    
      return name;
    }
    

    Und bitte Code hier direkt einfügen (mit Code-Tags), keine externen Bilder.

    PS: Falsches Unterforum.



  • okay danke dir, ja das war teilweise Fehler. Wobei der Fehler immer noch besteht trotz benutzen der

    srand()
    

    funktion(wie du auf dem Foto siehst) die random namen gleich bleiben.
    Und würdest du mir erklären falls es dir nichts ausmacht warum ich so die adresse ausgebe:

    std::cout << name[i]; //außerhalb der schleife
    

    und so:

    std::cout << name[i]; // innerhalb der Schleife
    

    die value von der Adresse ausgebe. Das ist mir irgendwie nicht ganz ersichtlich 😕

    Ich dachte wenn man die Adresse einer Value ausgeben will macht man immer das:

    std::cout << &name; // innerhalb der Schleife
    

    also mit dem

    &
    

    operator. 😕



  • Du verhaust hier gerade etwas.

    std::cout << name[i];
    

    Außerhalb der Schleife führt das Zwangsläufig zu einem Fehler. Er bezog sich darauf, dass du quasi "name" und nicht "name[n]" ausgibst.

    Du hast also 5 Elemente im Array. - Greifst aber auf keines davon zu, sondern gibst das Array (die Adresse dessen) aus.



  • Bei einem Array ist der Zugriff mittels des Namens dasselbe wie "&arrayname[0]", d.h.

    std::cout << name;
    

    sowie

    std::cout << &name[0];
    

    geben dieselbe Adresse aus.



  • Danke dir @Th69 das wusste ich nicht.

    und zu @inflames2k ich weis das er sich darauf bezogen hat. Da habe ich mich in meinem davohrige beitrag wohl etwas schlecht ausgedrückt trotzdem danke.

    Falls jemand weiß warum mein random array(mitlerweile string wie @Th69 vorgeschlagen hat) den gleichen array(string) aus gibt würde ich es gerne wissen 😃



  • Dann poste deinen aktuellen Code hier direkt im Forum (mit C++-Tags).

    PS: Kann ein Mod diesen Thread ins "C++"-Forum verschieben?



  • okay danke hier ist der volle projektcode.

    // AssaultCubeWithClr.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    
    using namespace System;
    
    class variabeln
    {
    	public:
    		DWORD clientAddress = 0x400000;
    		DWORD playerBaseAdress = 0x00509b74;
    		DWORD offsePrimaryAmmo = 0x128;
    		DWORD offsetPistolAmmo = 0x13C;
    		DWORD offsetArmor = 0xFC;
    		DWORD offsetHealth = 0xF8;
    		DWORD offsetRoll = 0x0080;
    		//DWORD baseforName = 0x005028FC;
    		DWORD baseforName = 0x51019C;
    		DWORD teamNum1 = 0x204;
    		DWORD teamNum2 = 0x32C;
    		DWORD playerVertical = 0x44;
    		DWORD playerHorizontal = 0x40;
    
    		int inputCheat;
    		int inputNumber;
    		DWORD processId;
    		DWORD localPlayer;
    		DWORD localName;
    		DWORD primaryAmmo;
    		DWORD pistolAmmo;
    		DWORD health;
    		DWORD armor;
    		DWORD roll;
    
    		bool firstSetRand = true;
    		bool firstExecute = true;
    };
    
    struct InitRandHelper
    {
    	InitRandHelper() { srand((unsigned)time(0)); }
    };
    
    std::string randomName()
    	{
    	static InitRandHelper init;
    
    	int i = 1;
    	static std::string name;
    	for (int i = 1; i < 5; i++)
    		{
    			name += (char)('a' + rand() % ('z' - 'a' + 1));
    			std::cout << name[i] << std::endl;
    		}
    		return name;
    	}
    
    void StartText()
    {
    	//Text to See in the Console
    	Console::ForegroundColor = System::ConsoleColor::Green;
    	Console::WriteLine("Welcome to my Cheat for AssaultCube!");
    	Console::WriteLine("------------------------------------");
    	Console::WriteLine("1. For More Health type in: 1.");
    	Console::WriteLine("2. For More Ammo type in: 2");
    	Console::WriteLine("3. For More Armor type in: 3");
    	Console::WriteLine("4. For Turn on Name changer: 4");
    }
    int main(array<System::String ^> ^args)
    {
    	//create new object with variabeln
    	variabeln varobj;
    
    	HWND hwnd = FindWindowA(NULL, "AssaultCube");		//Find Window with Name AssaultCube
    
    	StartText();		//function call
    	while (true)
    	{
    
    		if (hwnd == NULL)	//Check if the game exists
    		{
    			if (varobj.firstExecute == true)
    			{
    				Console::ForegroundColor = System::ConsoleColor::Red;
    				Console::WriteLine("ERROR: The Game couldn´t found!");
    				varobj.firstExecute = false;
    			} 
    		}
    		else
    		{
    			GetWindowThreadProcessId(hwnd, &varobj.processId);		//Get Process id from the Window
    			HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, false, varobj.processId);
    
    			if (handle == NULL) //check if process id exsits
    			{
    				Console::ForegroundColor = System::ConsoleColor::Red;
    				Console::WriteLine("ERROR: Wrong Process Id!");
    				Console::ForegroundColor = System::ConsoleColor::Green;
    			}
    			else
    			{
    				ReadProcessMemory(handle, (LPCVOID)varobj.playerBaseAdress, &varobj.localPlayer, sizeof(varobj.playerBaseAdress), NULL); //Read the local adresse and save it in localPlayer
    				ReadProcessMemory(handle, (LPCVOID)varobj.baseforName, &varobj.localName, sizeof(varobj.playerBaseAdress), NULL);
    
    				varobj.primaryAmmo = varobj.localPlayer + varobj.offsePrimaryAmmo;
    				varobj.pistolAmmo = varobj.localPlayer + varobj.offsetPistolAmmo;
    				varobj.health = varobj.localPlayer + varobj.offsetHealth;
    				varobj.armor = varobj.localPlayer + varobj.offsetArmor;
    				varobj.roll = varobj.localPlayer + varobj.offsetRoll;
    
    				std::cin >> varobj.inputCheat;		//wait for user input
    
    				switch (varobj.inputCheat)			//check which case match with the user input
    				{
    					case 1:
    						Console::WriteLine("Write how much Health you want: ");
    						std::cin >> varobj.inputNumber;
    						WriteProcessMemory(handle, (LPVOID)varobj.health, &varobj.inputNumber, sizeof(varobj.inputNumber), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    
    					case 2:
    						Console::WriteLine("Write how much Ammo you want: ");
    						std::cin >> varobj.inputNumber;
    						WriteProcessMemory(handle, (LPVOID)varobj.primaryAmmo, &varobj.inputNumber, sizeof(varobj.inputNumber), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    
    					case 3:
    						Console::WriteLine("Write how much Armor you want: ");
    						std::cin >> varobj.inputNumber;
    						WriteProcessMemory(handle, (LPVOID)varobj.armor, &varobj.inputNumber, sizeof(varobj.inputNumber), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    
    					case 4:
    						Console::WriteLine("Random Number: ");
    						WriteProcessMemory(handle, (LPVOID)varobj.localName, &randomName(), sizeof(randomName()), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    
    					case 5:
    						Console::WriteLine("test: ");
    						std::cin >> varobj.inputNumber;
    						WriteProcessMemory(handle, (LPVOID)varobj.roll, &varobj.inputNumber, sizeof(varobj.inputNumber), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    
    					default:
    						Console::ForegroundColor = System::ConsoleColor::Red;
    						Console::WriteLine("ERROR: Wrong Entry!");
    						Console::WriteLine("Try a other input :D");
    						Console::ForegroundColor = System::ConsoleColor::Green;
    						break;
    				}
    			}
    		}
    		Sleep(200);
    	} 
    	return 0;
    }
    


  • Du benutzt ja doch C++/CLI, aber das solltest du wirklich sein lassen und natives C++ verwenden (d.h. ein Win32-Konsolenprojekt im VS erzeugen).
    Du mischst in deinem Code bisher die WinAPI, C++-Standard als auch .NET - das wird auf Dauer nur Probleme machen...

    Entferne das 'static' bei 'std::string name'.

    Außerdem ist der Aufruf in Zeile 139

    WriteProcessMemory(handle, (LPVOID)varobj.localName, &randomName(), sizeof(randomName()), NULL); //Write to the local adress memory and change the value
    

    völlig falsch!

    Ich schreibe dir jetzt extra nicht sofort die Lösung hin, damit du ein bißchen darüber nachdenkst und recherchierst...



  • @Th69 okay vielen dank für die Antwort ich werde mal etwas rumexperimentieren und versuchen es rauszukriekgen 👍



  • was mir noch eingefallen ist wann soll man den dann C++\Cli benutzen und wann die c++ standart liabary?



  • C++/CLI ist nur als Interop-Sprache für Projekte zwischen C++ und .NET gedacht, nicht um damit eigenständige Programme zu entwickeln. Für .NET benutzt man daher hauptsächlich C#.

    s.a. den als wichtig markierten Beitrag Windows Forms und Visual C++ MACHT KEINEN SINN!



  • 2 Dinge erstens zu meinem Problem das konnte ich nun lösen und es funktioniert auch super indem ich das gemacht habe:

    char NamePrefix[][5] = {
    	"", "bel", "nar",
    	"xan", "bell", "natr",
    	"ev", "pe", "da", "wen"
    };
    char NameSuffix[][5] = {
    	"", "us", "ix", "ox", "ith",
    	"ath", "um", "ator", "or", "axia",
    	"imus", "ais", "itur", "orex", "o",
    	"y"
    };
    const char NameStems[][10] = {
    	"adur", "aes", "anim", "apoll", "imac",
    	"educ", "equis", "extr", "guius", "hann",
    	"equi", "amora", "hum", "iace", "ille",
    	"inept", "iuv", "obe", "ocul", "orbis"
    };
    char playerName[21];
    
    char* randomName(char* playerName)
    {
    	playerName[0] = 0;
    
    	strcat(playerName, NamePrefix[(rand() % 10)]);
    	strcat(playerName, NameSuffix[(rand() % 20)]);
    	strcat(playerName, NameStems[(rand() % 16)]);
    
    	playerName[0] = toupper(playerName[0]);
    	std::cout << playerName << std::endl;
    
    	return playerName;
    }
    
    case 4:
    					Console::WriteLine("Random Number: ");
    						WriteProcessMemory(handle, (LPVOID)varobj.localName, randomName(playerName), sizeof(playerName), NULL); //Write to the local adress memory and change the value
    						Console::WriteLine("\nWhat did you want to cheat up: ");
    						break;
    

    Wie du gesagt hast habe ich jetzt ein neues Projekt ohne Cli erstellt und tue von meinem altem Projekt nur die Funktionen übernehmen.

    2tens:
    Zudem was du zu C++/Cli geschrieben hast(und den link) konnte ich das hier raus zulesen bitte korrigiere mich falls es nicht stimmt.
    Cli nimmt man wenn man ein fertiges C++ Programm hat und das mit .net verbinden will.

    und was ich nicht weiß kann man auch ohne Cli .net programmieren oder ist das zwingend. Ich weiß das man mit c# .net programmieren kann geht das aber auch mit C++? 😕