Título: Lista con arrays
Publicado por: m@o_614 en 15 Enero 2014, 19:51 pm
Saludos tengo el siguiente archivo de texto: ADCA****SI***IMM***89ii******1***1***2 **************DIR***99dd*****1***1***2 **************EXT***B9hhll****1***2***3 **************IDX***A9xb*****1***1***2 **************IDX1**A9xbff****1***2***3 **************IDX2**A9xbeeff**1***3***4 los * son espacios Y tengo que leer este archivo y que me guarde cada uno de los elementos en una variable para esto se me ocurrio que podia hacer una lista simplemente ligada que tuviera los elementos: codop = ADCA, operando = SI y para los 5 elementos restantes pense que podria hacerlos con arreglos, que direccionamiento fuera algo como: direc[0] = IMM direc[1] = DIR direc[2] = EXT direc[3] = IDX direc[4] = IDX1 y codigo maquina fuera: maq[0] = 89ii maq[1] = 99dd maq[2] = B9hhl .... .... esto seria un array de cadenas un char **direc y para los campos que tienen numeros seria un simple array, el codigo que tengo hecho es el siguiente pero me aparecen warnings que dicen assignment makes integer from pointer without a cast, y no entiendo por que,¿¿¿como corregirlo??? #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct nodo { char *codigo; char *Operando; char **modo_direccionamiento; char **codigo_maquina; char *bytes_calculados; char *bytes_x_calcular; char *total_bytes; struct nodo *sig; }COD; void buscarFinLinea(FILE *hc12); void ignorarEspacios(FILE *hc12); char *Tabla_Operandos(FILE *hc12); void insertarFinal(char *ins,char *op,char **dir,char **maq,char *calculado,char *calcular,char *total,COD *ultimo,int i); COD *ultimoElemento(COD *cabeza); COD *crearNodo(char *ins,char *op,char **dir,char **maq,char *calculado,char *calcular,char *total,int i); void quitarSaltosLinea(char *cadena); int main() { COD *cabeza = NULL,*ultimo; FILE *hc12; int p,i,car; char *ins,*op,**dir,**maq,*calculado,*calcular,*total; if((hc12 = fopen("archivo.txt","r"))!= NULL ) { i = 0; while((car = fgetc(hc12 ))!= EOF ) { if(car != '\t') { ins = Tabla_Operandos(hc12); ignorarEspacios(hc12); op = Tabla_Operandos(hc12); ignorarEspacios(hc12); buscarFinLinea(hc12); if(car == '\t') { dir = (char**)malloc(8*sizeof(char)); dir[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); maq = (char**)malloc(8*sizeof(char)); maq[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); calculado = (char*)malloc(8*sizeof(char)); calculado[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); calcular = (char*)malloc(8*sizeof(char)); calcular[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); total = (char*)malloc(8*sizeof(char)); total[i] = Tabla_Operandos(hc12); buscarFinLinea(hc12); if(cabeza == NULL) //cabeza = crearNodo(ins,op,dir,maq,calculado,calcular,total,i); else { //ultimo = ultimoElemento(cabeza); //insertarFinal(ins,op,dir,maq,calculado,calcular,total,ultimo); } i++; } } } } else printf("No se pudo abrir archivo\n"); return 0; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { }while(car == '\t' || car == ' '); } char *Tabla_Operandos(FILE *hc12) { int car,lon = 0,pos; char *cadena; do { lon++; }while(car != '\t'); fseek(hc12 ,pos ,SEEK_SET ); cadena = (char*)calloc((lon +1),sizeof(char)); fgets(cadena ,lon +1,hc12 ); quitarSaltosLinea(cadena); return cadena; } void quitarSaltosLinea(char *cadena) { char *ptr; if(((ptr =strchr(cadena ,'\n'))!=NULL )||((ptr =strchr(cadena ,'\t'))!=NULL )||((ptr =strchr(cadena ,' '))!=NULL )) *ptr = '\0'; }
de antemano gracias
Título: Re: Lista con arrays
Publicado por: ivancea96 en 15 Enero 2014, 20:26 pm
En que linea el warning?
Título: Re: Lista con arrays
Publicado por: m@o_614 en 16 Enero 2014, 01:18 am
las lineas de warning aparecen en las variables calculado[i] = Tabla_Operandos(hc12);
y tambien en calcular[i] = Tabla_Operandos(hc12);
y la de total. si hago el codigo de esta manera: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct nodo { char *codigo; char *Operando; char *modo_direccionamiento; char *codigo_maquina; char *bytes_calculados; char *bytes_x_calcular; char *total_bytes; struct nodo *sig; }COD; void imprimirLista(COD *cabeza); void buscarFinLinea(FILE *hc12); void ignorarEspacios(FILE *hc12); char *Tabla_Operandos(FILE *hc12); void insertarFinal(char *ins,char *op,char *dir,char *maq,char *calculado,char *calcular,char *total,COD *ultimo); COD *ultimoElemento(COD *cabeza); COD *crearNodo(char *ins,char *op,char *dir,char *maq,char *calculado,char *calcular,char *total); void quitarSaltosLinea(char *cadena); int main() { COD *cabeza = NULL,*ultimo; FILE *hc12; int car; char *ins,*op,*dir,*maq,*calculado,*calcular,*total; if((hc12 = fopen("archivo.txt","r"))!= NULL ) { while((car = fgetc(hc12 ))!= EOF ) { if(car != '\t') { ins = Tabla_Operandos(hc12); ignorarEspacios(hc12); op = Tabla_Operandos(hc12); ignorarEspacios(hc12); dir = Tabla_Operandos(hc12); ignorarEspacios(hc12); maq = Tabla_Operandos(hc12); ignorarEspacios(hc12); calculado = Tabla_Operandos(hc12); ignorarEspacios(hc12); calcular = Tabla_Operandos(hc12); ignorarEspacios(hc12); total = Tabla_Operandos(hc12); buscarFinLinea(hc12); if(cabeza == NULL) cabeza = crearNodo(ins,op,dir,maq,calculado,calcular,total); else { ultimo = ultimoElemento(cabeza); insertarFinal(ins,op,dir,maq,calculado,calcular,total,ultimo); } } else buscarFinLinea(hc12); } imprimirLista(cabeza); } else printf("No se pudo abrir archivo\n"); return 0; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { }while(car == '\t' || car == ' '); } char *Tabla_Operandos(FILE *hc12) { int car,lon = 0,pos; char *cadena; do { lon++; }while(car != '\t'); fseek(hc12 ,pos ,SEEK_SET ); cadena = (char*)calloc((lon +1),sizeof(char)); fgets(cadena ,lon +1,hc12 ); quitarSaltosLinea(cadena); return cadena; } void quitarSaltosLinea(char *cadena) { char *ptr; if(((ptr =strchr(cadena ,'\n'))!=NULL )||((ptr =strchr(cadena ,'\t'))!=NULL )||((ptr =strchr(cadena ,' '))!=NULL )) *ptr = '\0'; } void insertarFinal(char *ins,char *op,char *dir,char *maq,char *calculado,char *calcular,char *total,COD *ultimo) { ultimo->sig = crearNodo(ins,op,dir,maq,calculado,calcular,total); ultimo->sig->sig = NULL; ultimo = ultimo->sig; } COD *ultimoElemento(COD *cabeza) { COD *ptr; ptr = cabeza; while(ptr->sig != NULL) ptr = ptr->sig; return ptr; } COD *crearNodo(char *ins,char *op,char *dir,char *maq,char *calculado,char *calcular,char *total) { COD *x; int tam,tam1,tam2,tam3,tam4,tam5,tam6; x = (COD *)malloc(sizeof(COD )); x ->codigo = (char*)malloc((tam +1)*sizeof(char)); x ->Operando = (char*)malloc((tam1 +1)*sizeof(char)); x ->modo_direccionamiento = (char*)malloc((tam2 +1)*sizeof(char)); x ->codigo_maquina = (char*)malloc((tam3 +1)*sizeof(char)); x ->bytes_calculados = (char*)malloc((tam4 +1)*sizeof(char)); x ->bytes_x_calcular = (char*)malloc((tam5 +1)*sizeof(char)); x ->total_bytes = (char*)malloc((tam6 +1)*sizeof(char)); strcpy(x ->modo_direccionamiento ,dir ); strcpy(x ->codigo_maquina ,maq ); strcpy(x ->bytes_calculados ,calculado ); strcpy(x ->bytes_x_calcular ,calcular ); x->sig = NULL; return x; } void imprimirLista(COD *cabeza) { COD *ptr; for(ptr = cabeza;ptr != NULL;ptr = ptr->sig) { printf("%s\t",ptr ->modo_direccionamiento ); printf("%s\t\t",ptr ->codigo_maquina ); printf("%s\t",ptr ->bytes_calculados ); printf("%s\t",ptr ->bytes_x_calcular ); printf("%s\n",ptr ->total_bytes ); } }
funciona correctamente y me imprime la primer linea del archivo: codop operan direccionamiento cod maquina bytes etc etc ADCA SI IMM 89ii 1 1 2 pero no me imprime los demas lineas, es por eso que queria que los direccionamientos, codigos maquina, etc... fueran arrays para que asi cupieran todos, pero no se como hacer para que las variables dir, maq, calculado, calcular, total me puedan almacenar un solo elemento y despues poder modificarla para que sea un array, no se si me di a entender espero que si :(
Título: Re: Lista con arrays
Publicado por: rir3760 en 16 Enero 2014, 02:12 am
Ya te había comentado en otros temas que utilizar fseek en un archivo abierto en modo texto no es una buena idea. El error que mencionas se genera en las lineas: calculado[i] = Tabla_Operandos(hc12); ... calcular[i] = Tabla_Operandos(hc12); ... total[i] = Tabla_Operandos(hc12);
Y se genera porque "calculado[ i ]", "calcular[ i ]" y "total[ i ]" son (expresiones) de tipo char mientras que el tipo de retorno de la función "Tabla_Operandos" es "char *". Un saludo
Título: Re: Lista con arrays
Publicado por: m@o_614 en 16 Enero 2014, 19:19 pm
gracias rir3760 tratare de pensar en alguna manera de sustituir el fseek aunque por ahora no se me ocurre nada, tambien le hice modificaciones al codigo y ya no me aparecen errores ni warnings pero el codigo me truena no entiendo por que #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct nodo { char *codigo; char *Operando; char *modo_direccionamiento[8]; char *codigo_maquina[8]; char *bytes_calculados[8]; char *bytes_x_calcular[8]; char *total_bytes[8]; struct nodo *sig; }COD; void imprimirLista(COD *cabeza); void buscarFinLinea(FILE *hc12); void ignorarEspacios(FILE *hc12); char *Tabla_Operandos(FILE *hc12); void insertarFinal(char *ins,char *op,char **dir,char **maq,char **calculado,char **calcular,char **total,COD *ultimo,int i); COD *ultimoElemento(COD *cabeza); COD *crearNodo(char *ins,char *op,char **dir,char **maq,char **calculado,char **calcular,char **total,int i); void quitarSaltosLinea(char *cadena); int main() { COD *cabeza = NULL,*ultimo; FILE *hc12; int car,i; char *ins,*op,*dir[8],*maq[8],*calculado[8],*calcular[8],*total[8]; if((hc12 = fopen("archivo.txt","r"))!= NULL ) { i = 0; while((car = fgetc(hc12 ))!= EOF ) { if(car != '\t') { ins = Tabla_Operandos(hc12); ignorarEspacios(hc12); op = Tabla_Operandos(hc12); ignorarEspacios(hc12); dir[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); maq[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); calculado[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); calcular[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); total[i] = Tabla_Operandos(hc12); buscarFinLinea(hc12); i++; if(cabeza == NULL) cabeza = crearNodo(ins,op,dir,maq,calculado,calcular,total,i); else { ultimo = ultimoElemento(cabeza); insertarFinal(ins,op,dir,maq,calculado,calcular,total,ultimo,i); } } else {/* dir[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); maq[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); calculado[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); calcular[i] = Tabla_Operandos(hc12); ignorarEspacios(hc12); total[i] = Tabla_Operandos(hc12); i++;*/ buscarFinLinea(hc12); } } //imprimirLista(cabeza); } else printf("No se pudo abrir archivo\n"); return 0; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { }while(car == '\t' || car == ' '); } char *Tabla_Operandos(FILE *hc12) { int car,lon = 0,pos; char *cadena; do { lon++; }while(car != '\t'); fseek(hc12 ,pos ,SEEK_SET ); cadena = (char*)calloc((lon +1),sizeof(char)); fgets(cadena ,lon +1,hc12 ); quitarSaltosLinea(cadena); return cadena; } void quitarSaltosLinea(char *cadena) { char *ptr; if(((ptr =strchr(cadena ,'\n'))!=NULL )||((ptr =strchr(cadena ,'\t'))!=NULL )||((ptr =strchr(cadena ,' '))!=NULL )) *ptr = '\0'; } void insertarFinal(char *ins,char *op,char **dir,char **maq,char **calculado,char **calcular,char **total,COD *ultimo,int i) { ultimo->sig = crearNodo(ins,op,dir,maq,calculado,calcular,total,i); ultimo->sig->sig = NULL; ultimo = ultimo->sig; } COD *ultimoElemento(COD *cabeza) { COD *ptr; ptr = cabeza; while(ptr->sig != NULL) ptr = ptr->sig; return ptr; } COD *crearNodo(char *ins,char *op,char **dir,char **maq,char **calculado,char **calcular,char **total,int i) { COD *x; int tam,tam1,tam2,tam3,tam4,tam5,tam6; x ->codigo = (char*)malloc(tam +1); x ->Operando = (char*)malloc(tam1 +1); x ->modo_direccionamiento [i ] = (char*)malloc(tam2 +1); x ->codigo_maquina [i ] = (char*)malloc(tam3 +1); x ->bytes_calculados [i ] = (char*)malloc(tam4 +1); x ->bytes_x_calcular [i ] = (char*)malloc(tam5 +1); x ->total_bytes [i ] = (char*)malloc(tam6 +1); strcpy(x ->modo_direccionamiento [i ],dir [i ]); strcpy(x ->codigo_maquina [i ],maq [i ]); strcpy(x ->bytes_calculados [i ],calculado [i ]); strcpy(x ->bytes_x_calcular [i ],calcular [i ]); strcpy(x ->total_bytes [i ],total [i ]); x->sig = NULL; return x; }
|