Duda estupida c++ en ubuntu

Betrayal

Pues bueno, el caso es que acabo de empezar con c++ en la facultad, y en la primera practica, que es hacer una tonteria de unos dados que tomen numeros aleatorios e imprimirlos por pantalla, me lleva dando toda la mañana fallos al compilar, y estoy ya desesperado por que no se que coño pasa, creo que el problema está en el tema de las librerias, pero tengo todo bien instalado en ubuntu (o eso creo)

El archivo principal del programa es este:

#include <iostream>
#include "dados.h"

using namespace std;
using namespace clases;

int main (int argc, char **argv)
{
Dados Ejemplo;

Ejemplo.lanzamiento(Ejemplo);
Ejemplo.dado1(Ejemplo);
Ejemplo.dado2(Ejemplo);

return 0;
}

el archivo donde estan las funciones es este:

#include <ctime>
#include "dados.h"

namespace clases
{

Dados:ados()
{
_dado1 = 0;
_dado2 = 0;
}

Dados Dados::lanzamiento(Dados clase)
{
srand(time(NULL));
clase.dado1 = rand()%(6+1);
clase.
dado2 = rand()%(6+1);
return clase;
}

void Dados::dado1(Dados clase)
{
cout<<clase._dado1<< endl;
}

void Dados::dado2(Dados clase)
{
cout<<clase._dado2<<endl;
}
}

Y el archivo .h es este:

#ifndef dados_h
#define dados_h

namespace clases
{
class Dados
{
public:

//Constructores:
Dados();

//Funciones:
Dados lanzamiento (Dados clase);
void dado1(Dados clase);
void dado2(Dados clase);

private:

int _dado1;
int _dado2;
};
}

#endif

Al compilar el error que me da es este:

g++ -I. -g juego.cpp dados.cpp -o juego.exe
dados.cpp: In member function ?clases:ados clases:ados::lanzamiento(clases:ados)?:
dados.cpp:15: error: ?srand? no se declaró en este ámbito
dados.cpp:16: error: ?rand? no se declaró en este ámbito
dados.cpp: In member function ?void clases:ados::dado1(clases:ados)?:
dados.cpp:24: error: ?cout? no se declaró en este ámbito
dados.cpp:24: error: ?endl? no se declaró en este ámbito
dados.cpp: In member function ?void clases:ados::dado2(clases:ados)?:
dados.cpp:30: error: ?cout? no se declaró en este ámbito
dados.cpp:30: error: ?endl? no se declaró en este ámbito
make: *** [compilar] Error 1

  • Es como si no puidera usar srand, ni rand ni cout, aunque tanto iostream como ctime estan incluidas e instaladas (he instalado todo con build-essentials.

AYUDA POR FAVOR !!!

B

Para las funciones matemáticas pásale el siguiente argumento al compilador

-lm

El resto, es que en el segundo archivo no tienes el namespace de std, aunque en mi opinión es que uses
siempre std::blabla , ya que así sabrás que estás usando realmente para todo. Ahora es un ejemplo tonto, pero
en el futuro lo agradecerás el coger buenas costumbres xD.

pd: por dios, quita ese .exe al binario xD

Betrayal

He añadido en los includes del segundo fichero <math.h>, justo debajo de los includes "using namespace std;" sin comillas, y al compilar he añadido la opcion -lm

Al intentar compilar tengo exactamente el mismo error que antes.

Edit: Ya esta resuelto, el problema era que tenia que meter los include en el .h para que evitar lo de los cout, y meter en el .h el #include <cstdlib>, para el tema del srand y el rand

JuAn4k4

Al lanzar es modulo 6 y al resultado sumarle 1 ( [de 0..5] +1 ). No hacer modulo (6+1) porque eso es modulo 7.

Tu amigo el man:

http://sman.informatik.htw-dresden.de:6711/man?=srand&=3

#include <stdlib.h> para usar rand y srand.

Te explico, srand(time(NULL)); solo deberias hacerlo 1 vez, no cada vez que vayas a lanzar, es decir usar una semilla para cada objeto dados y no cambiarla, para ello tendras que ponerla en el constructor ados().

Las funciones pseudo-random son funciones matematicas más o menos complicadas que empiezan en una semilla.

Xn = f(Xn-1) , y la semilla es el X0.

Hay semillas buenas y semillas malas, pero normalmente para estas librerias las funciones son bastante complejas y para estos ejemplos vale cualquier semilla.

PD: #pragma once , para evitar los #ifndef #endif etc.. http://es.wikipedia.org/wiki/Pragma_once

Puni

#4 de la wikipedia

Del Lenguaje de programación C y C++, #pragma once es una directiva de Preprocesador de C no-estandar pero con un extenso soporte.

No creo q en la facultad te enseñen ni te dejen usar cosas que aunq habituales se salgan del estandar

JuAn4k4

Anda que no hay cosas que se salen de ANSI-C.

dr_Rouman

Yo estoy en la misma carrera que este, y según el profesor te obligan a compilar con -pedantic y cosas de esas...Y hay mucho petardo del estándar

Puni

pues a eso voy, porq yo tb he sufrido clases de c++ hace bien poco en la facultad y a todo lo q era no estandar le ponian una cruz y un 666 al lado para q no nos acercaramos xD

NeB1

#5 eso me ha sonado a openMP (#pragma parallel for y mierdas de esas) que si que las dimos en la facultad.

Realmente lo he leido en la wiki y no tenía nada que ver aparte de la sintaxis de "pragma xxx" pero weno xD

Usuarios habituales