Probleme mit srand()

betaros

Computerspezi
Beiträge
181
Moin,

ich programmiere gerade meinen eigenen Passwortgenerator, einfach nur aus Spaß und um in C++ wieder ein wenig rein zukommen. Jedoch hab ich bereits Probleme bei der Erstellung eines Zufallswertes...

Mein Codeausschnitt:
Code:
void Creater::genAlgorithm(int length, int category){
	if(category<1 || category>6){
		category = 6;
	}

	const string numbers = "1234567890";
	const string klein   = "abcdefghijklmnopqrstuvwxyzäöü";
	const string gross   = "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ";
	const string sonder  = ".,-;:_#'*+/()[]{}&%$ۤ!";

	cout << "Generiertes Passwort:     ";

	/*
	 * temp1 waehlt ein Zeichen aus einer Konstante aus
	 * temp2 waehlt aus welche Art von Zeichen genutzt wird
	 * */

	size_t temp;
	int temp2;
	srand(time(NULL));

	for(int i; i<length; i++){
		switch(category){
		default:
			return;
			break;
		case 1:
			temp = rand()%10;
			cout << numbers.at(temp);
			break;
		case 2:
			temp = rand()%29;
			cout << klein.at(temp);
			break;
		case 3:
			temp = rand()%29;
			cout << gross.at(temp);
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
			break;
		}
	}
}

Fehler im Debugger bei srand:
Code:
No source available for "_dl_vdso_vsym() at 0x39a232dae0"

Da mir der Fehler leider gar nix sagt, würde ich mich sehr über Hilfe freuen :D

Grüße
betaros
 

tgruene

Routinier
Beiträge
418
Der Fehler bedeutet wahrscheinlcih nur, dass die Bibliothek, in der srand() steht, keine debug-Symbole enthaelt und Dir der Debugger deswegen nichts Genaueres sagen kann.
Ich wuerde einen Zwischenschritt einbauen,
Code:
unsigned int myseed = time(NULL); srand (myseed);
,
dann kannst Du auch den Wert von 'myseed' vorher anschauen. Vielleicht passiert ein Fehler bei der Konvertierung, oder ein Ueberlauf,...
Kompilierst Du mit '-Wall -O0 -g' (zumindest fuer gcc)?
 

betaros

Computerspezi
Beiträge
181
Ich habe mal den Zwischenschritt so eingebaut, wie du es geschrieben hast. Nun kommt der Fehler beim initialisieren von myseed.
Code:
No source available for "_dl_vdso_vsym() at 0x39a232dae0"

Meine Includes sind
Code:
#include <iostream>
#include <string>
#include <ctime>
#include <cstdio>
#include <cstdlib>

Was das kompilieren angeht, kann ich dir das gar nicht beantworten, da ich mit Eclipse CDT programmiere und einfach eine neues Projekt angelegt habe. ?(
 

tgruene

Routinier
Beiträge
418
Ein Rechtsklick auf den Projentnamen im "Project Explorer" bringt Dich ueber Properties zu C/C++ Builds -> Settings. Dort kannst Du das ueberpruefen. Es koennte sein, dass an ganz anderer Stelle ein Fehler mit z.B. new/delete stattfindet, der erst an dieser Stelle zu einem Speicherzugriffsfehler fuehrt. In C++ sieht das manchmal merkwuerdig aus und ist schwer zu finden. Du koenntest auch valgrind benutzen, um den Fehler zu finden. Der Code selber ("unsigned int myseed = time(NULL);") kann eigentlich keinen (eigenen) Fehler erzeugen.
 

betaros

Computerspezi
Beiträge
181
Ich kompiliere hiermit:
Code:
g++ -O0 -g3 -Wall -c -fmessage-length=0

main.cpp
Code:
#include <iostream>
#include "creater.h"
using namespace std;

int main(){
	cout << "Passwortmanager" << endl;

	Creater c;

	c.menu();

	return 0;
}

creater.cpp
Code:
#include "creater.h"

int Creater::menu(){
	cout << "------------------------------" << endl;
	cout << "1) Generiere Passwort" << endl;
	cout << "2) Speichere Passwort" << endl;
	cout << "3) Zeige Passwortliste an" << endl;
	cin >> Creater::choise;

	switch(Creater::choise){
	default:
		cout << "Falsche Eingabe!" << endl;
		break;
	case 1:
		Creater::generator();
		break;
	case 2:
		break;
	case 3:
		break;
	}
	return 0;
}

void Creater::generator(){
	cout << "Laenge des Passwortes: ";
	cin >> Creater::length;

	cout << "Kategorie:" << endl;
	cout << "1) 1234567890" << endl;
	cout << "2) abcdefghijklmnopqrstuvwxyz" << endl;
	cout << "3) ABCDEFGHIJKLMNOPQRSTUVWXYZ" << endl;
	cout << "4) blubb123" << endl;
	cout << "5) BluBB123" << endl;
	cout << "6) 8(uBb|]3" << endl;
	cin >> Creater::category;

	Creater::genAlgorithm(Creater::length, Creater::category);
}

void Creater::genAlgorithm(int length, int category){
	if(category<1 || category>6){
		category = 6;
	}

	const string numbers = "1234567890";
	const string klein   = "abcdefghijklmnopqrstuvwxyzäöü";
	const string gross   = "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ";
	const string sonder  = ".,-;:_#'*+/()[]{}&%$ۤ!";

	cout << "Generiertes Passwort:     ";

	/*
	 * temp1 waehlt ein Zeichen aus einer Konstante aus
	 * temp2 waehlt aus welche Art von Zeichen genutzt wird
	 * */

	size_t temp;
	//int temp2;
	unsigned int myseed = time(NULL);
	srand (myseed);

	for(int i; i<length; i++){
		switch(category){
		default:
			return;
			break;
		case 1:
			temp = rand()%10;
			cout << numbers.at(temp);
			break;
		case 2:
			temp = rand()%29;
			cout << klein.at(temp);
			break;
		case 3:
			temp = rand()%29;
			cout << gross.at(temp);
			break;
		case 4:

			break;
		case 5:
			break;
		case 6:
			break;
		}
	}
}

creater.h
Code:
#ifndef CREATER_H_
#define CREATER_H_

#include <iostream>
#include <string>
#include <ctime>
#include <cstdio>
#include <cstdlib>
using namespace std;

class Creater{
private:
	int choise;
	unsigned int length;
	int category;

public:
	int menu();
	void generator();
	void genAlgorithm(int length, int category);
};

#endif /* CREATER_H_ */

Ich hoffe das hilft bei der Suche nach dem Fehler. Ich nutze übrigends Fedora 17 x64.

Grüsse
betaros
 

tgruene

Routinier
Beiträge
418
Code:
for(int i; i<length; i++)
Hier wuerde ich 'int i = 0' initialisieren. Viele Compiler machen das zwar, ich wuerde mich jedoch nicht darauf verlassen. Daran sollte allerdings Dein Fehler nicht liegen. Nachdem ich das eingefuegt hatte, laeuft das Programm auch fehlerfrei durch, sowohl durch gdb als auch durch valgrind. Vielleicht hat Dein Kernel einen Fehler, oder Deine Entwickungsumgebung (gcc), allerdings waere das schon seltsam.
Wie gesagt, ich wuerde valgrind installieren, und dann "valgrind ./creater" laufen lassen. Die Ausgabe kannst Du ja hier posten, vielleicht findet jemand darin einen Fehler.
 

betaros

Computerspezi
Beiträge
181
Bei mir läuft es jetzt auch. Der Fehler war tatsächlich die for-Schleife.... Komische Sache...

Vielen Dank für deine Hilfe! :)

Grüsse
betaros
 

Ähnliche Themen

skript aus der kommandozeile starten

wirre zeichen :(

NagiosGrapher 1.7.1 funktioniert nicht

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

Aus Datei lesen

Sucheingaben

speicherzugriffsfehler bei srand

Oben