PDA

Ver la versión completa : error strcmp y estructura



webclon2000
23-02-2010, 16:37
hola wenas mi problema es que al compilar en c++ me da dos errores, uno en el strcmp y otro que me dice nose q de una estructura y he estado mirando que puede ser el error pero no lo encuentro y me esta volviendo loco ya...:confused::confused:haber si alguien consigue encontrarlo...muxas gracias



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <limits.h>


#define MAX_CAMARAS 15
#define LON_PARTE 80
#define MAX_NOMBRE 20


/* Tipos de datos necesarios. */

typedef char TCadena[LON_PARTE];

typedef int Tidentificador[];

typedef struct
{
char zona[MAX_NOMBRE];
char trafico_inicial[LON_PARTE];
char trafico_actualizado[LON_PARTE];
Tidentificador identificador;
}Tmaquinas;

typedef struct
{
Tmaquinas maquinas;
int ocupado;
}Tlugar;

typedef Tlugar Tcamaras[MAX_CAMARAS];

////////////*prototipos de las funciones*/////////////////////

void inicializar(Tcamaras camaras);
void menu();
void crearcamara(Tcamaras camaras);
void decirsitiovacio(const Tcamaras camaras,int*sitio);
void buscarid(Tcamaras camaras,Tidentificador id_comp,int *comp,int *pos);
void introducirdatoscam(Tmaquinas * maquinas);
void leer_real ( const char mensaje[], double *resultado );
void leer_cadena ( const char mensaje[], const int tam, char resultado[] );
void leer_entero ( const char mensaje[], int *dato );///*leer un numero entero*///


/************************************************** *********************
*************************PROGRAMA PRINCIPAL*****************************
************************************************** *********************/

int main()
{
Tcamaras camaras;
int opcion;

inicializar(camaras);
do
{ menu();
fscanf (stdin,"%d",&opcion);
switch(opcion)
{
case 1:
crearcamara(camaras);/*insertar empleado*/
break;

case 2:
/*modificar datos*/
break;

case 3:
/*dar de baja*/
break;

case 4:
/*listar todos lo datos*/
break;

case 5:
fprintf (stdout,"Hasta luego\n");
break;

default:
fprintf (stdout,"Introduzca una opcion correcta\n");
}
}
while (opcion!=5);
return 0;
}

///////////////////////*INICIALIZAR VACIO*////////////////////////

void inicializar(Tcamaras camaras)
{
int i;

i=0;
while(i<25)
{
camaras[i].ocupado=0;
i=i+1;
}
}

/////////////////*MENU DE PRESENTACION*////////////////////////

void menu()
{
fprintf (stdout,"\nBase de datos de empleados\n");
fprintf (stdout,"1. dar de alta una nueva camara\n");
fprintf (stdout,"2. Modificar\n");
fprintf (stdout,"3. Dar de baja \n");
fprintf (stdout,"4. Listar \n");
fprintf (stdout,"5. Salir del programa\n");
fprintf (stdout,"Seleccione opcion (1, 2, 3, 4, 5): ");
}

///////////////////*DAR DE ALTA A UNA CAMARA*///////////////////////

void crearcamara(Tcamaras camaras)
{
int pos;
Tidentificador identifica;/*dice storage size"identifica isnt know*/
int comp;
int pos_comp;

decirsitiovacio(camaras,&pos);
if(pos != -1)
{
leer_entero("Introduzca el identificador: ",identifica);
buscarid(camaras,identifica,&comp,&pos_comp);
if (comp!=0)
{
introducirdatoscam(&camaras[pos].maquinas);
camaras[pos].ocupado=1;
}
if (comp==0)
{
fprintf (stdout,"Ya existe el identificador introducido\n");
}

}
else
fprintf (stdout, "No hay sitio\n");
}

//////////////////*DICE SI HAY UN SITIO OCUPADO*///////////////

void decirsitiovacio(const Tcamaras camaras,int*sitio)
{
int i;

i=0;
*sitio=-1;
while((i<15) && (camaras[i].ocupado==1))
{
i=i+1;
}
if(i<15)
*sitio=i;
}

/////////////////////////*BUSCAR IDENTIFICADOR*//////////////////////////

void buscarid(Tcamaras camaras,Tidentificador id_comp,int *comp,int *pos)
{
int i;
int encontrado;

i=0;
encontrado=-1;
while (i<15 && encontrado!=0)
{
if (camaras[i].ocupado!=0)
{
encontrado=strcmp(camaras[i].maquinas.identificador,id_comp);
}
if (encontrado==0)
{
*pos=i;
*comp=0;
}
i=i+1;
}
}

////////////////*LECTURA DATOS LABORALES*////////////////////

void introducirdatoscam(Tmaquinas * maquinas)
{
leer_entero("Introduzca el id de la camara: ",maquinas->identificador);
leer_cadena("Introduzca la zona que monitoriza: ",20,maquinas->zona);
}

//////////////////////*LEER UNA CADENA DE CARACTERES Y NUMEROS REALES Y ENTEROS*///////////////

void leer_real ( const char mensaje[], double *resultado )
{
char aux[50]; /* almacén temporal para la línea tecleada */
double valido; /* indica si el valor introducido es válido o no */

fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, 50, stdin );


valido= sscanf( aux, "%lf", resultado)==1?1:0;

while ( valido==0 )
{
fprintf ( stdout, "ERROR: %s no valido\n", mensaje );
fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, 50, stdin );

valido= sscanf( aux, "%lf", resultado)==1?1:0;

}
}

void leer_cadena ( const char mensaje[], const int tam, char resultado[] )
{
int valido; /* indica si el valor introducido es válido o no */
char aux[tam+1]; /* almacén temporal para los datos tecleados */


fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, tam+1, stdin );
valido = ( aux[strlen(aux)-1]== '\n');
while ( !valido )
{

fprintf ( stdout, "ERROR: %s no valido\n", mensaje );
fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, tam+1, stdin );
valido = ( aux[strlen(aux)-1]== '\n' );
}
aux[strlen(aux)-1]= '\0';
strcpy ( resultado, aux );
}

void leer_entero ( const char mensaje[], int *dato )
{
char tmp[20]; /* recoge los datos escritos por el usuario */
char *fin; /* apunta al último carácter procesado */

do
{ do
{ fprintf ( stdout, "%s: ", mensaje );
fgets ( tmp, 20, stdin );
} while ( ( tmp[strlen(tmp)-1]!='\n' || tmp[0]=='\n' ) && !fflush(stdin) && fprintf ( stdout, "Dato no válido\n" ) );
*dato = strtol ( tmp, &fin, 10 );
} while ( ( *fin != '\n' || *dato == LONG_MIN || *dato == LONG_MAX ) && !fflush(stdin) && fprintf ( stdout, "Dato no válido\n" ) );
}

Marchi
24-02-2010, 00:11
El primer error es por que

typedef int Tidentificador[];
debería ser

typedef int *Tidentificador;

En el segundo error, usas strcmp para comparar un arreglo de enteros.
Para que funcione abría que hacerle un casteo, cambiando

encontrado=strcmp(camaras[i].maquinas.identificador,id_comp);
por

encontrado=strcmp((char*)(camaras[i].maquinas.identificador),(char*)id_comp);

Además fijate que para poder hacer este uso de strcmp() tenés que asegurarte que el arreglo termina con 0.
Si bien no lo leí al código, mas que para hacerlo compilar, el programa no funciona. Deberías revisarlo, si no entendés algo avisas y listo.


Saludos

Marchi
24-02-2010, 04:18
Antes de irme a dormir le di una miradita al código, y veo que me equivoqué en la primer corrección.
Deberías poner

typedef int Tidentificador[]; pero poniendo alguna constante entre los corchetes.
Yo había pensado que mas adelante en el código usabas asignamiento dinámico y por eso deje solo el puntero.

De esta forma el programa no me da el segmentation fault de antes, y con razón jeje


Saludos

webclon2000
24-02-2010, 17:54
:eek:muxisimas gracias,ahora compila bien lo que le pasa es q ahora se queda pillado al iniciarlo,ahora me pondre a investigar que le pasa,pero gracias de todas formas:):):)