C atoi/srand/rand to C++

11/06/2012 09:12 bloodx#1
Code:
#include <iostream>
#include <Windows.h>
#include <time.h>
#include <sstream>
struct PlayerStr
{
	int Health;
	int Damage;
	int UID;
	int Honor;
	std::string Look;
	int Gender;
	int Race;
	int Class;
	std::string Name;
	int Level;
	int MinimalDamage;
	int MaximalDamage;
	int MainAttribute;
};PlayerStr Player;
struct EnemyStr
{
	int Health;
	int Damage;
	int UID;
	int Honor;
	std::string Look;
	int Gender;
	int Race;
	int Class;
	std::string Name;
	int Level;
	int MinimalDamage;
	int MaximalDamage;
	int MainAttribute;
};EnemyStr Enemy;
int main(int args,char *argv[])
{
	std::string FinalPacket = argv[1];
	Player.Health		 = atoi(argv[2]);
	Enemy.Health		 = atoi(argv[3]);
	Player.Damage		 = atoi(argv[4]);
	Enemy.Damage		 = atoi(argv[5]);
	Player.UID			 = atoi(argv[6]);
	Player.Honor		 = atoi(argv[7]);
	Enemy.UID			 = atoi(argv[8]);
	Enemy.Honor			 = atoi(argv[9]);
	Player.Look			 = argv[10];
	Player.Gender		 = atoi(argv[11]);
	Player.Class		 = atoi(argv[12]);
	Player.Race			 = atoi(argv[13]);
	Player.Name			 = argv[14];
	Enemy.Look			 = argv[15];
	Enemy.Gender		 = atoi(argv[16]);
	Enemy.Race			 = atoi(argv[17]);
	Enemy.Class			 = atoi(argv[18]);
	Enemy.Name			 = argv[19];
	Player.Level		 = atoi(argv[20]);
	Enemy.Level			 = atoi(argv[21]);
	Player.MinimalDamage = atoi(argv[22]);
	Player.MaximalDamage = atoi(argv[23]);
	Enemy.MinimalDamage  = atoi(argv[24]);
	Enemy.MaximalDamage  = atoi(argv[25]);
	Player.MainAttribute = atoi(argv[26]);
	Enemy.MainAttribute  = atoi(argv[27]);
	std::stringstream s;
	s << FinalPacket;
        int luckone = 0;
                        Sleep(500); // Damit der rand wert auch unterschiedlich ist
			srand ( static_cast<unsigned int >(time(NULL)) );
			luckone = rand() % (5 + 1);
}
Gibt es in C++ eine bessere alternative als atoi?
und alternativen zu srand / rand wären auch gut zu wissen :D
11/06/2012 14:27 Trollface-#2
Soweit ich weiß, gibt es keine direkte alternative zu atoi.
Aber in C++ lässt sich das ganze per std::stringstream lösen.

Code:
int ConvertToInt(std::string s)
{
	int convert;
	std::stringstream ss(s)
	ss >> convert;
	return convert;
}
Edit: Bezüglich einer srand/rand C++ alternative schau mal in die Boost Library.
11/06/2012 15:27 Farmär#3
Nur eine eigene funktion, eine random funktion könntest du hinbekommen mit einem Algorithmus. Eine funktion für atoi ist nicht nötig, da diese funktion schon die kürzeste version ist die man benutzen kann.
11/06/2012 19:16 bloodx#4
@Trollface Danke für die Antwort dass mit std::stringstream wusste auch leider schon, dachte nur da gibt es noch eine andre Möglichkeit :).

hm boost library muss ich mir nochmal downloaden dann wohl :P

@Farmär das kürzeste ist aber nicht immer das beste! Was ich dort geschrieben habe ist für ein Online Spiel d.h muss es GENAU und SCHNELL sein :).

und rand funktionert halt nunmal nur mit blöden Sleeps ~.~
11/07/2012 14:00 Tyrar#5
Quote:
Originally Posted by bloodx View Post
@Trollface Danke für die Antwort dass mit std::stringstream wusste auch leider schon, dachte nur da gibt es noch eine andre Möglichkeit :).

hm boost library muss ich mir nochmal downloaden dann wohl :P

@Farmär das kürzeste ist aber nicht immer das beste! Was ich dort geschrieben habe ist für ein Online Spiel d.h muss es GENAU und SCHNELL sein :).

und rand funktionert halt nunmal nur mit blöden Sleeps ~.~
eine andere möglichkeit zu std::stringstream wäre speziell für diesen fall boost::lexical_cast :) (wenn du dir die lib sowieso saugst)
11/07/2012 14:50 bloodx#6
Darüber habe ich auch schon etwas gelesen danke dir :)


jetzt bräuchte ich nur ne alternative für rand() halt :D weil Sleeps sind ja total doof! :D
11/07/2012 15:28 Dr. Coxxy#7
Quote:
Originally Posted by bloodx View Post
Darüber habe ich auch schon etwas gelesen danke dir :)


jetzt bräuchte ich nur ne alternative für rand() halt :D weil Sleeps sind ja total doof! :D
du benutzt rand nur falsch.
du musst einmal srand, also den seed mit time(NULL) initialisieren.
danach rufst du immer nur noch rand auf.
wenn du jedes mal srand aufrufst, wird der seed wieder neu gesetzt (ändert sich bei time(NULL) einmal pro sekunde), und die rand abfolge fängt wieder von vorne an.
11/07/2012 16:24 Tyrar#8
Quote:
Originally Posted by Dr. Coxxy View Post
du benutzt rand nur falsch.
du musst einmal srand, also den seed mit time(NULL) initialisieren.
danach rufst du immer nur noch rand auf.
wenn du jedes mal srand aufrufst, wird der seed wieder neu gesetzt (ändert sich bei time(NULL) einmal pro sekunde), und die rand abfolge fängt wieder von vorne an.
example:
Code:
srand(time(nullptr));

for(uint32_t i = 0; i < 10; ++i)
    std::cout << rand()%101 << "%" << std::endl;
würde z.b. das ausgeben:
Code:
45%
13%
10%
84%
0%
99%
32%
29%
9%
70%
11/08/2012 02:08 bloodx#9
oh weia dat tut weh -.- Danke euch !
11/08/2012 10:09 MrSm!th#10
Für C: strtol ist atoi afaik sogar vorzuziehen.

Warum genau schreibst du in deiner Schleife % (5+1)?
Schreib doch gleich % 6.
Ich vermute mal, du willst eine Zahl zwischen 1 und 6 haben. Das macht man so:

Code:
 
int i = rand()  % 5 + 1;
Btw. wieso sollte man für unterschiedliche Zahlen Sleep brauchen? Ist die Zeit API nicht eigentlich genau genug, dass in den zwei Durchgängen unterschiedliche Timestamps und damit auch Seeds rauskommen, was trotzdem zu einer anderen Zahl am Anfang führen müsste?
11/08/2012 11:44 Tyrar#11
Quote:
Originally Posted by MrSm!th View Post
Für C: strtol ist atoi afaik sogar vorzuziehen.

Warum genau schreibst du in deiner Schleife % (5+1)?
Schreib doch gleich % 6.
Ich vermute mal, du willst eine Zahl zwischen 1 und 6 haben. Das macht man so:

Code:
 
int i = rand()  % 5 + 1;
Btw. wieso sollte man für unterschiedliche Zahlen Sleep brauchen? Ist die Zeit API nicht eigentlich genau genug, dass in den zwei Durchgängen unterschiedliche Timestamps und damit auch Seeds rauskommen, was trotzdem zu einer anderen Zahl am Anfang führen müsste?
timestamps liefern nur sekunden (was ich daraus schliesse, dass die sich auch nur jede sekunde ändern)

in c++ würde ich jedenfalls zu chrono greifen :)
11/08/2012 15:55 MrSm!th#12
Ok dachte eigentlich die liefern Millisekunden.
Naja gut, mal rein theoretisch gedacht sollte es dann aber mit dem Tick Counter der CPU oder der Millisekunden genauen System Uhr gehen :P (kann sein, dass ich mich da irre, aber ich meine sogar eine Api Funktion mit Nanosekunden Genauigkeit gesehen zu haben)
11/08/2012 16:01 Dr. Coxxy#13
Quote:
Originally Posted by MrSm!th View Post
Ok dachte eigentlich die liefern Millisekunden.
Naja gut, mal rein theoretisch gedacht sollte es dann aber mit dem Tick Counter der CPU oder der Millisekunden genauen System Uhr gehen :P (kann sein, dass ich mich da irre, aber ich meine sogar eine Api Funktion mit Nanosekunden Genauigkeit gesehen zu haben)
[Only registered and activated users can see links. Click Here To Register...]
11/08/2012 17:29 Tyrar#14
Quote:
Originally Posted by Dr. Coxxy View Post
[Only registered and activated users can see links. Click Here To Register...]
das wäre eine option, allerdings muss man da auch die frequenz des prozessors beachten!

zusätzlich wäre die reine c++ variante cross platform! ;)

kleines sample, sieht dem original sehr ähnlich (is übrigens nur auf die schnelle geschrieben) ([Only registered and activated users can see links. Click Here To Register...])
11/08/2012 17:37 Dr. Coxxy#15
Quote:
Originally Posted by HeavyHacker View Post
Code:
std::chrono::high_resolution_clock::time_point timeBegin;
std::chrono::high_resolution_clock::time_point timeEnd;
std::chrono::duration<double> timeValue;

timeBegin = std::chrono::high_resolution_clock::now();

for(uint32_t i = 0; i < 10; ++i)
    std::cout << "FAP ";

timeEnd = std::chrono::high_resolution_clock::now();
timeValue = std::chrono::duration_cast<std::chrono::duration<double> >(timeEnd-timeBegin);

std::cout << std::endl << "Fapped " << timeValue << " seconds!" << std::endl;
iih also wirklich, doch nicht hier öffentlich im forum ^^

Die frequenz ist unerheblich, da das ganze ja nur als srand init value benutzt werden sollte.

Wenn man nen timer machen will, muss man natürlich die frequenz beachten.