|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Temas - antlcn
Páginas: [1]
1
« en: Lunes 16 de Abril de 2012, 09:37 »
Hola, estoy trabajando en el juego del ahorcado donde existe un servidor al que pueden conectarse varios clientes y jugar partidas individuales simultaneas gracias a la funcion select(). El caso es que al compilar "servidor.c" todo va bien pero lo ejecuto y me devuelve el siguiente error: *** glibc detected *** ./servidor: corrupted double-linked list: 0x09310168 *** ======= Backtrace: ========= /lib/libc.so.6(+0x6c0c1)[0x17c0c1] /lib/libc.so.6(+0x6d9f3)[0x17d9f3] /lib/libc.so.6(cfree+0x6d)[0x180a1d] /lib/libc.so.6(fclose+0x14a)[0x16c3da] ./servidor[0x8048ad2] ./servidor[0x80492d0] /lib/libc.so.6(__libc_start_main+0xe7)[0x126ce7] ./servidor[0x8048931] ======= Memory map: ======== 00110000-00267000 r-xp 00000000 07:00 21126 /lib/libc-2.12.1.so 00267000-00269000 r--p 00157000 07:00 21126 /lib/libc-2.12.1.so 00269000-0026a000 rw-p 00159000 07:00 21126 /lib/libc-2.12.1.so 0026a000-0026d000 rw-p 00000000 00:00 0 00381000-0039b000 r-xp 00000000 07:00 95 /lib/libgcc_s.so.1 0039b000-0039c000 r--p 00019000 07:00 95 /lib/libgcc_s.so.1 0039c000-0039d000 rw-p 0001a000 07:00 95 /lib/libgcc_s.so.1 003e8000-003e9000 r-xp 00000000 00:00 0 [vdso] 0081c000-00838000 r-xp 00000000 07:00 21110 /lib/ld-2.12.1.so 00838000-00839000 r--p 0001b000 07:00 21110 /lib/ld-2.12.1.so 00839000-0083a000 rw-p 0001c000 07:00 21110 /lib/ld-2.12.1.so 08048000-0804b000 r-xp 00000000 08:05 5213 /"RUTA FICHERO"/ 0804b000-0804c000 r--p 00002000 08:05 5213 /"RUTA FICHERO"/ 0804c000-0804d000 rw-p 00003000 08:05 5213 /"RUTA FICHERO"/ 09310000-09331000 rw-p 00000000 00:00 0 [heap] b7600000-b7621000 rw-p 00000000 00:00 0 b7621000-b7700000 ---p 00000000 00:00 0 b77b4000-b77b5000 rw-p 00000000 00:00 0 b77c9000-b77cb000 rw-p 00000000 00:00 0 bfada000-bfafb000 rw-p 00000000 00:00 0 [stack] Abortado Aquí dejo mi código: #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <string.h> #include <stdlib.h> #include <signal.h> #include <time.h> #include "funciones.c" void quitHandler(int sig); int socketDes=-1; //socket del servidor int main(void) { /*--------------------------------------- Descriptor del socket y buffer de datos ---------------------------------------*/ struct sockaddr_in sockname, from; char buffer[200]; int from_len; struct hostent* host; /*----------------- Se abre el socket -----------------*/ socketDes = socket (AF_INET, SOCK_STREAM, 0); if (socketDes == -1) { perror ("No se puede abrir el socket servidor"); } /*------------------------------------------------------ Se rellenan los campos de la estructura con la IP del servidor y el puerto del servicio que ofrecemos ------------------------------------------------------*/ sockname.sin_family = AF_INET; sockname.sin_port = htons(2050); sockname.sin_addr.s_addr = INADDR_ANY; if (bind (socketDes, (struct sockaddr*)&sockname, sizeof(sockname)) == -1) { perror("Error en la operacion bind"); close (socketDes); } from_len = sizeof(from); if (listen(socketDes,1) == -1) { perror("Error en la operacion de listen"); close (socketDes); } signal(SIGINT, quitHandler); signal(SIGTSTP, quitHandler); /*-------------------------------- Aceptar peticiones de clientes -------------------------------*/ char **refranes; int numRefranes; struct cliente infoCli; int infoSelect; int numClientesIn=0; int socketEntrada, newSocket; int i=0,j=0; char kword[30]; char bufferAux[200]; char *cadAux, *cadAux1; int index=0, index1=0; char letra; struct cliente auxCli; fd_set sockIn; fd_set sockAux; FD_ZERO(&sockIn); FD_ZERO(&sockAux); FD_SET(socketDes,&sockIn); refranes=extraeRefranes(&numRefranes); //cargamos refranes desde fichero while(1) //bucle para el continuo analisis de peticiones de entrada { sockAux=sockIn; //FD_COPY(&sockIn, &sockAux); infoSelect=select(FD_SETSIZE,&sockIn,NULL,NULL,NULL); if(infoSelect==-1) { perror("\nError en la funcion select()\n"); } else { socketEntrada=buscarSocket(&sockIn); if(socketEntrada>=0) { if(recv(socketEntrada,buffer,200,0)==-1) printf("\nError en la recepcion con -recv-\n"); else { i=0; do { kword[i]=buffer[i]; i++; }while(buffer[i]!=' ' && buffer[i]!='\0'); kword[i]='\0'; if(strcmp(kword , "USUARIO")==0) //se introdujo la clave USUARIO { cadAux=buffer+8; auxCli=buscaClienteNombre(cadAux); if(auxCli.registrado!=1) { strcpy(buffer ,"-Err. Usuario incorrecto"); if(send(socketEntrada,buffer,200,0)==-1) perror("\nSe produjo un erro al enviar\n"); } else { if(auxCli.loggeado!=1) { auxCli.loggeado=1; auxCli.numSocket= socketEntrada; modificarCliente(auxCli); } strcpy(buffer ,"-Ok. Usuario correcto"); if(send(socketEntrada,buffer,200,0)==-1) perror("\nSe produjo un erro al enviar\n"); } }//fin opcion USUARIO if(strcmp(kword ,"PASSWORD")==0) //se introdujo la clav PASSWORD { cadAux=buffer+9; //esta es la contraseña auxCli=buscaCliente(socketEntrada); //puede ser NULL?????????????????????? if(auxCli. loggeado==1 && (strcmp(auxCli. passUser,cadAux )==0)) { strcpy(buffer , "+Ok. Usuario validado"); if(send(socketEntrada, buffer, 200, 0) == -1) modificarCliente(auxCli); //se incluye la informacion en el fichero } else { strcpy(buffer , "-Err. Error en la validacion"); if(send(socketEntrada, buffer, 200, 0) == -1) } }//fin opcion PASSWORD if(strcmp(kword ,"REGISTRO")==0) //se introdujo la clave REGISTRO { for(i =0;i <=strlen(buffer );i ++) { if(buffer[i]=='-' && buffer[i+1]=='u') { index=i+3; cadAux=buffer+index; //aqui esta el usuario } if(buffer[i]=='-' && buffer[i+1]=='p') { cadAux1=buffer+(i+3); //aqui la contraseña index1=i; } } cadAux[index1-index-1]='\0'; auxCli=buscaClienteNombre(cadAux); if(auxCli.registrado!=1) { auxCli.numSocket=0; auxCli.jugando=0; auxCli.registrado=1; auxCli.loggeado=0; auxCli.autenticado=0; strcpy(auxCli. nombreUser,cadAux ); strcpy(auxCli. passUser,cadAux1 ); auxCli.puntuacionPartida=0; auxCli.puntuacionTotal=0; auxCli.numIntentos=0; auxCli.numeroRefran=-1; auxCli.frasesAcertadas=0; auxCli.frasesFalladas=0; auxCli.modoJuego=-1; introduceCliente(auxCli); strcpy(buffer ,"+Ok. Usuario registrado"); if(send(socketEntrada,buffer,200,0)==-1) perror("Error envio confirmacion registro"); } else { strcpy(buffer ,"-Err. Usuario ya existe"); if(send(socketEntrada,buffer,200,0)==-1) perror("Error envio respuesta registro"); } } //fin opcion registro { auxCli=buscaCliente(socketEntrada); letra=buffer[6]; if(letra=='a' || letra=='e' || letra=='i' || letra=='o' || letra=='u') { if(auxCli.modoJuego==0) { if(compruebaLetra(refranes[auxCli.numeroRefran], auxCli.frasePartida, letra)==1) { strcpy(buffer ,"+Ok. Existe la vocal ---> "); strcat(buffer ,auxCli. frasePartida); if(send(socketEntrada,buffer,200,0)==-1) perror("\nError al enviar confirmacion vocal\n"); } else { strcpy(buffer ,"-Err. No existe la vocal ---> "); strcat(buffer ,auxCli. frasePartida); if(send(socketEntrada,buffer,200,0)==-1) perror("\nError al enviar confirmacion vocal\n"); } auxCli.numIntentos++; } } else { strcpy(buffer ,"-Err. Mensaje invalido"); if(send(socketEntrada,buffer,200,0)==-1) perror("\nError al enviar mensaje error\n"); } } //fin opcion VOCAL if(strcmp(kword ,"CONSONANTE")==0) { auxCli=buscaCliente(socketEntrada); letra=buffer[11]; if(letra!='a' && letra!='e' && letra!='i' && letra!='o' && letra!='u') { if(auxCli.modoJuego==0) { if(compruebaLetra(refranes[auxCli.numeroRefran], auxCli.frasePartida, letra)==1) { strcpy(buffer ,"+Ok. Existe la consonante ---> "); strcat(buffer ,auxCli. frasePartida); if(send(socketEntrada,buffer,200,0)==-1) perror("\nError al enviar confirmacion consonante\n"); } else { strcpy(buffer ,"-Err. No existe la consonante ---> "); strcat(buffer ,auxCli. frasePartida); if(send(socketEntrada,buffer,200,0)==-1) perror("\nError al enviar confirmacion consonante\n"); } auxCli.numIntentos++; } } else { strcpy(buffer ,"-Err. Mensaje invalido"); if(send(socketEntrada,buffer,200,0)==-1) perror("\nError al enviar mensaje error\n"); } } //fin opcion CONSONANTE if(strcmp(kword ,"RESOLVER")==0) { auxCli=buscaCliente(socketEntrada); if(auxCli.modoJuego==0) { if(strcmp(buffer +9,refranes [auxCli. numeroRefran])==0) { if(auxCli.numIntentos<5) auxCli.puntuacionPartida=150; if(auxCli.numIntentos>=5 && auxCli.numIntentos<=8) auxCli.puntuacionPartida=100; if(auxCli.numIntentos>=9 && auxCli.numIntentos<=11) auxCli.puntuacionPartida=70; if(auxCli.numIntentos>=12 && auxCli.numIntentos<=15) auxCli.puntuacionPartida=50; if(auxCli.numIntentos>15) auxCli.puntuacionPartida=0; auxCli.frasesAcertadas++; auxCli.puntuacionTotal+=auxCli.puntuacionPartida; sprintf(bufferAux ,"+Ok. Enhorabuena\n\n Puntuacion en esta partida: %d\nPuntuacion total: %d\nIntentos realizados: %d\nFrases acertadas: %d\nFrases fallidas: %d",auxCli. puntuacionPartida,auxCli. puntuacionTotal,auxCli. numIntentos,auxCli. frasesAcertadas,auxCli. frasesFalladas); auxCli.puntuacionPartida=0; if(send(socketEntrada,bufferAux,200,0)==-1) perror("\nError al enviar estadisticas\n"); } else { auxCli.frasesFalladas++; sprintf(bufferAux ,"-Err. Mejor suerte la proxima vez\n\n Puntuacion en esta partida: %d\nPuntuacion total: %d\nIntentos realizados: %d\nFrases acertadas: %d\nFrases fallidas: %d",auxCli. puntuacionPartida,auxCli. puntuacionTotal,auxCli. numIntentos,auxCli. frasesAcertadas,auxCli. frasesFalladas); auxCli.puntuacionPartida=0; if(send(socketEntrada,bufferAux,200,0)==-1) perror("\nError al enviar estadisticas\n"); //reiniciamos la informacion del jugador auxCli.jugando=0; auxCli.modoJuego=-1; auxCli.puntuacionPartida=0; strcpy(auxCli. frasePartida,""); auxCli.numIntentos=0; auxCli.numeroRefran=-1; } } } //fin opcion RESOLVER if(strcmp(kword ,"PARTIDA-INDIVIDUAL")==0) { auxCli=buscaCliente(socketEntrada); if(auxCli.loggeado==1 && auxCli.registrado==1 && auxCli.autenticado==1) { if(auxCli.jugando==0) { auxCli.jugando=1; auxCli.modoJuego=0; auxCli. numeroRefran=rand()%numRefranes ; j=0; for(i =0;i <strlen(refranes [auxCli. numeroRefran]);i ++) { switch(refranes[auxCli.numeroRefran][i]) { case ',': buffer[i]=','; break; case ' ': buffer[i]=' '; break; case '.': buffer[i]='.'; default: buffer[i]='-'; break; } } buffer[i]='\0'; strcpy(auxCli. frasePartida,buffer ); if (send(socketEntrada, buffer, 200, 0) == -1) perror("\nError envio refran oculto\n"); } else { strcpy(buffer , "-Err. Ya tiene una partida en curso"); if(send(socketEntrada, buffer, 200, 0) == -1) } } else { strcpy(buffer , "-Err. Debe iniciar sesion antes de empezar"); if(send(socketEntrada, buffer, 200, 0) == -1) perror("\nError en el envio fallo partida nueva\n");; } } //fin opcion PARTIDA-INDIVIDUAL if(strcmp(kword ,"PARTIDA-GRUPO")==0) { //CODIGO PARA PARTIDA COLECTIVA } { strcpy(buffer ,"¡Hasta otra!"); if(send(socketEntrada,buffer,200,0)==-1) perror("\nError en el envio de mensaje salida\n"); close(socketEntrada); FD_CLR(socketEntrada,&sockAux); auxCli=buscaCliente(socketEntrada); if(auxCli.registrado==1) { auxCli.numSocket=0; auxCli.jugando=0; auxCli.loggeado=0; auxCli.autenticado=0; auxCli.modoJuego=-1; strcpy(auxCli. frasePartida,""); auxCli.numeroRefran=-1; auxCli.frasesFalladas=0; auxCli.frasesAcertadas=0; auxCli.puntuacionPartida=0; auxCli.numIntentos=0; } numClientesIn--; } //fin opcion SALIR }//fin else de recepcion de mensaje sockIn=sockAux;//FD_COPY(&sockAux,&sockIn); }//fin if de existencia de socketEntrada else //si no esta en el conjunto de sockets { if((newSocket=accept(socketDes,(struct sockaddr*)&from, &from_len))==-1) { printf("\nError aceptando peticion de conexion\n"); } else numClientesIn++; if(numClientesIn>50) { strcpy(buffer ,"\n-Err. No se aceptan mas conexiones\n"); if(send(newSocket,buffer,200,0)==-1) perror("\nError envio negacion conexion\n"); close(newSocket); } else { printf("\n+Ok. Aceptada una nueva conexion, usuario nº %d",numClientesIn ); auxCli.numSocket=newSocket; auxCli.jugando=0; auxCli.registrado=0; auxCli.loggeado=0; auxCli.autenticado=0; auxCli.modoJuego=-1; auxCli.puntuacionPartida=0; auxCli.puntuacionTotal=0; strcpy(auxCli. frasePartida,""); auxCli.numIntentos=0; auxCli.numeroRefran=-1; auxCli.frasesAcertadas=0; auxCli.frasesFalladas=0; introduceCliente(auxCli); } sockIn=sockAux;//FD_COPY(&sockAux,&sockIn); if(numClientesIn<50) FD_SET(newSocket,&sockIn); sockAux=sockIn;//FD_COPY(&sockIn,&sockAux); } } } return 0; } void quitHandler (int sig) { close(socketDes); printf("\nServidor terminado\n"); }
Gracias de antemano. Un saludo!
2
« en: Viernes 5 de Agosto de 2011, 17:44 »
Hola, tengo un programa escrito en C++ que define una clase matriz con plantillas esta todo en un .h con las funciones inline, y al compilar me da errores que no se de que son. Una ayudita por favor!. #ifndef _Matrix_H_ #define _Matrix_H_ #include <cassert> #include <cstdlib> using namespace std; namespace storage{ template<class Type> class Matrix { public: /* constructor vacio */ inline Matrix(); /* constructor copia */ inline Matrix(const Matrix &M); /* constructor parametrizado */ inline Matrix(unsigned int nRows, unsigned int nCols); /* destructor */ inline ~Matrix(); /* redimensionar la matriz */ inline void resize(unsigned int nRows, unsigned int nCols); /* indica el numero de filas */ unsigned int getNRows() { return _nRows;} /* indica el numero de columnas */ unsigned int getNCols() { return _nCols;} /* retorna el valor indicado por las variables */ inline Type & get(unsigned int r,unsigned int c); /* hace que la matriz sea la indentidad */ inline void setIdentity(); /* operador de asignacion */ inline Matrix & operator=(const Matrix &M); /* realiza la suma de dos matrices */ inline Matrix operator+(const Matrix &M); private: Type **_data; unsigned int _nRows; unsigned int _nCols; }; ////////////////////////// // ////////////////////////// template<class Type> Matrix<Type>::Matrix() { _data=NULL; _nRows=0; _nCols=0; } ////////////////////////// // ////////////////////////// template<class Type> Matrix<Type>::Matrix(const Matrix &M) { int i=0,j=0; _data=NULL; resize(M._nRows, M._nCols); for(i=0;i<_nRows;i++) { for(j=0;j<_nCols;j++) { _data[i][j]=M._data[i][j]; } } } ////////////////////////// // ////////////////////////// template<class Type> Matrix<Type>::Matrix(unsigned int nRows, unsigned int nCols) { _data=NULL; resize(nRows, nCols); } ////////////////////////// // ////////////////////////// template<class Type> Matrix<Type>::~Matrix() { int i; if(_data!=NULL){ for(i=0;i<_nRows;i++){ delete []_data[i]; } delete []_data; } } ////////////////////////// // ////////////////////////// template<class Type> void Matrix<Type>::resize(unsigned int nRows, unsigned int nCols) { int i; if(_data!=NULL){ for(i=0;i<nRows;i++){ delete []_data[i]; } delete []_data; } _nRows=nRows; _nCols=nCols; _data=NULL; _data=new Type *[_nRows]; for(i=0;i<_nRows;i++) _data[i]=new Type[_nCols]; } } ////////////////////////// // ////////////////////////// template<class Type> Type & Matrix<Type>::get(unsigned int r, unsigned int c) { assert(0<r<_nRows); assert(0<r<_nCols); return _data[r][c]; } ////////////////////////// // ////////////////////////// template<class Type> void Matrix<Type>::setIdentity() { int i,j; for(i=0;i<_nRows;i++){ for(j=0;j<_nCols;j++){ if(i==j) _data[i][j]=1; else _data[i][j]=0; } } } ////////////////////////// // ////////////////////////// template<class Type> Matrix<Type> & Matrix<Type>::operator=(const Matrix &M) { int i,j; if(_nRows==M._nRows && _nCols==M._nCols) for(i=0;i<_nRows;i++) for(j=0;j<_nCols;j++) _data[i][j]=M._data[i][j]; return *this; } ////////////////////////// // ////////////////////////// template<class Type> Matrix<Type> Matrix<Type>::operator+(const Matrix &M) { assert(_nRows==M._nRows && _nCols==M._nCols); Matrix<Type> aux(M._nRows, M._nCols); int i,j; for(i=0;i<_nRows;i++){ for(j=0;j<_nCols;j++){ aux._data[i][j]=_data[i][j]+M._data[i][j]; } } return aux;//no se si esto se puede hacer } }; #endif
Este es el main.cpp para probrarlo: #include <matrix.h> #include <iostream> using namespace std; using namespace storage; //template Function that prints a matrix template<class Type> void print(Matrix<Type> &M) { for(unsigned int i=0;i<M.getNRows();i++){ for(unsigned int j=0;j<M.getNCols();j++) cout<<M.get(i,j)<< " "; cout<<endl; } cout<<endl; } int main(int argc,char **argv) { Matrix<float> M; M.resize(10,10); M.setIdentity(); print(M); Matrix<float> M2(M); print(M2); Matrix<float> M3(10,10); M3=M+M2; print(M3); //check the result for(unsigned int i=0;i<M3.getNRows();i++){ for(unsigned int j=0;j<M.getNCols();j++) if (i!=j) assert(M3.get(i,j)==0); else assert(M3.get(i,j)==2); } cout<<"Perfect"<<endl; }
3
« en: Viernes 28 de Enero de 2011, 12:37 »
Hola, estoy haciendo una clase matriz con sus constructores, operadores, etc y me da un fallo de segmentación tras la comprobación "Ok4" del main, les adjunto el codigo: main.cpp: #include <matrix.h> #include <iostream> using namespace std; using namespace storage; //template Function that prints a matrix template<class Type> void print(Matriz<Type> &M) { for(unsigned int i=0;i<M.getNRows();i++){ for(unsigned int j=0;j<M.getNCols();j++) cout<<M.get(i,j)<< " "; cout<<endl; } } int main(int argc,char **argv) { Matriz<float> M; M.resize(10,10); cout<<"ok1"<<endl; M.setIdentity(); cout<<"ok2"<<endl; print(M); cout<<"ok3"<<endl; Matriz<float> M2(M); print(M2); cout<<"ok4"<<endl; Matriz<float> M3(10,10); M3=M+M2; cout<<"ok5"<<endl; print(M3); cout<<"ok6"<<endl; //check the result for(unsigned int i=0;i<M3.getNRows();i++){ for(unsigned int j=0;j<M.getNCols();j++) if (i!=j) assert(M3.get(i,j)==0); else assert(M3.get(i,j)==2); } cout<<"Perfect"<<endl; }
matrix.h: #ifndef _Matrix_H_ #define _Matrix_H_ #include <cassert> #include <cstdlib> using namespace std; namespace storage{ template<class Type> class Matriz { public: /* constructor vacio */ inline Matriz(); /* constructor copia */ inline Matriz(const Matriz &M); /* constructor parametrizado */ inline Matriz(unsigned int nRows, unsigned int nCols); /* redimensionar la matriz */ inline void resize(unsigned int nRows, unsigned int nCols); /* indica el numero de filas */ unsigned int getNRows() { return _nRows;} /* indica el numero de columnas */ unsigned int getNCols() { return _nCols;} /* retorna el valor indicado por las variables */ inline Type & get(unsigned int r,unsigned int c); /* hace que la matriz sea la indentidad */ inline void setIdentity(); /* operador de asignacion */ inline Matriz & operator=(const Matriz &M); /* realiza la suma de dos matrices */ inline Matriz & operator+(const Matriz &M); /* destructor */ inline ~Matriz(); private: Type **_data; unsigned int _nRows; unsigned int _nCols; }; ////////////////////////// // ////////////////////////// template<class Type> Matriz<Type>::Matriz() { _data=NULL; _nRows=0; _nCols=0; } ////////////////////////// // ////////////////////////// template<class Type> Matriz<Type>::Matriz(const Matriz &M) { int i,j; _nRows=M._nRows; _nCols=M._nCols; _data= new Type*[_nRows]; for(i=0;i<_nRows;i++){ _data[i]=new Type[_nCols]; } for(i=0;i<_nRows;i++){ for(j=0;j<_nCols;j++){ _data[i][j]=M._data[i][j]; } } } ////////////////////////// // ////////////////////////// template<class Type> Matriz<Type>::Matriz(unsigned int nRows, unsigned int nCols) { int i; _nRows=nRows; _nCols=nCols; if(_data==NULL){ _data= new Type*[_nRows]; for(i=0;i<_nRows;i++){ _data[i]=new Type[_nCols]; } } } ////////////////////////// // ////////////////////////// template<class Type> void Matriz<Type>::resize(unsigned int nRows, unsigned int nCols) { int i; if(_data!=NULL){ for(i=0;i<nRows;i++){ delete []_data[i]; } delete []_data; } Matriz(nRows, nCols); } ////////////////////////// // ////////////////////////// template<class Type> Type & Matriz<Type>::get(unsigned int r, unsigned int c) { return _data[r][c]; } ////////////////////////// // ////////////////////////// template<class Type> void Matriz<Type>::setIdentity() { int i,j; for(i=0;i<_nRows;i++){ for(j=0;j<_nCols;j++){ if(i==j) _data[i][j]=1; else _data[i][j]=0; } } } ////////////////////////// // ////////////////////////// template<class Type> Matriz<Type> & Matriz<Type>::operator=(const Matriz &M) { int i,j; if(_data==NULL) Matriz(M._nRows, M._nCols); for(i=0;i<_nRows;i++){ for(j=0;j<_nCols;j++){ _data[i][j]=M._data[i][j]; } } return *this; } ////////////////////////// // ////////////////////////// template<class Type> Matriz<Type> & Matriz<Type>::operator+(const Matriz &M) { int i,j; if(_data==NULL) Matriz(M._nRows, M._nCols); for(i=0;i<_nRows;i++){ for(j=0;j<_nCols;j++){ _data[i][j]=_data[i][j]+M._data[i][j]; } } return *this; } ////////////////////////// // ////////////////////////// template<class Type> Matriz<Type>::~Matriz() { int i; if(_data!=NULL){ for(i=0;i<_nRows;i++){ delete []_data[i]; } delete []_data; } } }; #endif
gracias de antemano.
4
« en: Jueves 27 de Enero de 2011, 17:44 »
hola, tengo un problema con un ejemplo de programa en C++ que suma los elementos de un vector utilizando una clase plantilla, me da un error en la linea 21 de el archivo suma.h, a continuación pongo el código: main.cpp: #include<iostream> #include<suma.h> #include<stdlib.h> using namespace std; using namespace values; int main(void) { Suma<int> S; int *V, nElementos; cout<<"Introduce el numero de elementos del vector: "<<endl; cin>>nElementos; V=(int *)malloc(nElementos*sizeof(int)); S.sumar(V, nElementos); cout<<S.getResult()<<endl; free(V); return 0; }
suma.h: #ifndef _SUMA_H_ #define _SUMA_H_ namespace values{ /** Brief esta clase realiza la suma de un vector */ template<class Type> class Suma { public: /** Suma los elementos de un vector */ void sumar(Type *p, int nElementos); Type getResult() { return _res; } private: Type _res; }; } template<class Type> void Suma<Type>::sumar(Type *p, int nElementos) { int i; for(i=0;i<nElementos;i++){ _res=res+*(p+i); } } #endif
gracias de antemano.
5
« en: Domingo 30 de Mayo de 2010, 16:14 »
hola, necesito hacer un programa en C al que le introduzcas una expresion postfija y te devuelva el resultado la expresion se guarda en una cadena con expacios entre cada dato introducido con un caracter final de parada "f", y no me funciona el programa, a ver si alguien sabe en que fallo. #include<stdio.h> #include<stdlib.h> #include<string.h> struct pila{ int n; struct pila *sig; }; void apilar(struct pila **cabeza, int n); struct pila *nuevoElemento(); int desapilar(struct pila **cabeza); int pilaVacia(struct pila *cabeza); int operacion(int n1, int n2, char caract); void conversion(struct pila *cabeza, char cad[]); void mostrarPila(struct pila **cabeza); int main(void) { int res; struct pila *operandos=NULL; char expresion[15]; printf("nIntroduce la expresion separada por espacios: "); conversion(operandos, expresion); mostrarPila(&operandos); res=desapilar(&operandos); printf("nEl resultado de la expresion es: %dn", res ); return 0; } struct pila *nuevoElemento() { return (struct pila *)malloc(sizeof(struct pila )); } void apilar(struct pila **cabeza, int n) { struct pila *nuevo=NULL; nuevo=nuevoElemento(); nuevo->n=n; nuevo->sig=*cabeza; *cabeza=nuevo; } int desapilar(struct pila **cabeza) { int n; struct pila *aux=NULL; n=(*cabeza)->n; aux=*cabeza; *cabeza=aux->sig; return n; } int pilaVacia(struct pila *cabeza) { if(cabeza==NULL) return 0; return 1; } int operacion(int n1, int n2, char caract) { int r; if(caract=='*') r= n1*n2; if(caract=='-') r= n1-n2; if(caract=='+') r= n1+n2; if(caract=='/') r= n1/n2; return r; } void conversion(struct pila *cabeza, char cad[]) { int n1, n2, nuevo, i=0; while(cad[i]!='f'){ if(cad[i]>47 && cad[i]<57) apilar(&cabeza, cad[i]); if(cad[i]>41 && cad[i]<47){ n1=desapilar(&cabeza); n2=desapilar(&cabeza); nuevo=operacion(n1, n2, cad[i]); apilar(&cabeza, nuevo); } i++; } } void mostrarPila(struct pila **cabeza) { struct pila *aux=NULL; aux=*cabeza; while(aux!=NULL){ } }
un saludo. gracias de antemano.
6
« en: Miércoles 17 de Marzo de 2010, 16:08 »
hola, estoy haciendo un programa que trabaja con un fichero de texto y necesito una función que modifique una linea, el programa consiste en introducir en un fichero de texto titulo (de un libro), autor y editorial...cada dato en una linea...tal que así: libro1 autor1 editorial1 libro2 autor2 editorial2... a la funcion se le pasas el titulo del libro (ya que la busqueda se hace por titulo) y también la nueva editorial, tengo esto..pero no funciona y por mas vueltas que le doy no lo saco. void modificarEditorial(char *fichero, char *titulo, char *Nedit) { FILE *f; char *aux; if((f =fopen(fichero , "r+"))==NULL ){ printf("nError al abrir ficheron"); } while(fscanf(f , "%s", aux )==1){ } } }
un saludo y gracias de antemano!
7
« en: Miércoles 3 de Marzo de 2010, 18:09 »
hola, estoy haciendo un bingo en C cuyo enunciado es: Realizar un programa para simular una sesión de Bingo en la que hay tres jugadores. Para ello, el programa debe incluir funciones para: a)Generar los cartones. Cada cartón será una matriz aleatoria de 5 filas y 8 columnas, con valores enteros no repetidos de 0 a 99. b)Sacar una bola del bombo. Para ello, se debe generar un número aleatorio de 0 a 99, teniendo cuidado de no generar dos veces el mismo valor. c)Actualizar un cartón según la bola que ha salido y comprobar si el jugador ha obtenido línea (todos los valores de una línea del cartón) o bingo (todos los valores del cartón). Para probar las funciones implementadas, simule la generación de bolas hasta que se acaben todas las bolas del bombo. tengo todo, o eso creo pero no se exactamente como ir comprobando en con cada bola sacada si se ha hecho linea o bingo... mi codigo: #include<stdio.h> #include<stdlib.h> #include<time.h> void gen_cartones(int *ptr); int revisarRepetido(int *ptr, int n, int lim); void mostrar(int M[][8]); int saca_bola(int *B, int i); int menu(); int main(void) { int op=0, i=0, aux; int C1[5][8], C2[5][8], C3[5][8], B[99]; op=menu(); while(op!=0){ switch (op){ case 1: printf("pulsa una tecla para generar el primer carton..."); gen_cartones(C1[0]); printf("pulsa una tecla para generar el segundo carton..."); gen_cartones(C2[0]); printf("pulsa una tecla para generar el tercer carton..."); gen_cartones(C3[0]); break; case 2: printf("npulsa una tecla para mostrar cartones..."); printf("ncarton jugador 1: n"); mostrar(C1); printf("ncarton jugador 2: n"); mostrar(C2); printf("ncarton jugador 3: n"); mostrar(C3); break; case 3: if(i==100) printf("nno se pueden sacar mas bolasn"); else{ aux=saca_bola(B, i); B[i]=aux; i++; } break; default: printf("nError...introduce una opcion validan"); break; } op=menu(); } return 0; } void gen_cartones(int *ptr) { int aux, i=0; while(i<40) { if((revisarRepetido(ptr, aux, 40))==0) { *(ptr+i)=aux; i++; } } } int revisarRepetido(int *ptr, int n, int lim) { int i, ret=0; for(i=0;i<lim;i++) { if(*(ptr+i)==n) ret=1; } return ret; } void mostrar(int M[][8]) { int i, j; for(i=0;i<5;i++) { for(j=0;j<5;j++) { } } } int saca_bola(int *B, int i) { int aux=0; while(revisarRepetido(B, aux, i)!=0){ } return aux; } int menu() { int op=0; printf("nt1. Rellenar cartones."); printf("nt2. Mostrar cartones."); return op; }
gracias de antemano!
8
« en: Viernes 26 de Febrero de 2010, 11:42 »
Hola, mi problema es que debo hacer un programa que genere dos matrices, una de numeros aleatorios a secas, y otra con numeros aleatorios sin repetir, y la funcion que genera la segunda matriz no me sale por muchas vueltas que le doy...un poco de ayuda no me vendria mal.
gracias.
aqui el codigo:
#include<stdio.h> #include<stdlib.h> #include<time.h>
void genera_alSin(int M[][5], int n); int revisarRepetido(int M[][5], int num); void mostrarMatriz(int M[][5]); void genera_al(int M[][5], int n);
int main(void) { int M[5][5], lim, N[5][5]; printf("introduce el limite para numeros aleatorios: "); scanf("%d",&lim); genera_al(M, lim); mostrarMatriz(M); printf("nahora sin repetirn"); genera_alSin(N, lim); mostrarMatriz(M); return 0; }
void genera_alSin(int M[][5], int n) { int j=0, aux, i; srand(time(NULL)); for(i=0;i<5;i++){ while(j<5){ aux=1+rand()%n; if((revisarRepetido(M, aux))==0){ M[j++]=aux; } } } }
void genera_al(int M[][5], int n) { int j, aux, i; srand(time(NULL)); for(i=0;i<5;i++){ for(j=0;j<5;j++){ aux=rand()%(n+1); M[j]=aux; } } }
int revisarRepetido(int M[][5], int num) { int i, j, ret=0; for(i=0;i<5;i++){ for(j=0;j<5;j++){ if(M[j]==num) ret=1; } } return ret; }
void mostrarMatriz(int M[][5]) { int i, j; for(i=0;i<4;i++){ for(j=0;j<4;j++){ printf("t%d",M[j]); } printf("n"); } }
Páginas: [1]
|
|
|