Autor
|
Tema: Lista con arrays (Leído 1,702 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
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
|
|
« Última modificación: 15 Enero 2014, 19:55 pm por m@o_614 »
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
En que linea el warning?
|
|
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
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
|
|
« Última modificación: 16 Enero 2014, 01:23 am por m@o_614 »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
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; }
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Lio con Arrays
Programación Visual Basic
|
X-TN
|
2
|
1,506
|
28 Junio 2006, 20:03 pm
por X-TN
|
|
|
Arrays
« 1 2 »
Programación Visual Basic
|
xDie
|
12
|
4,121
|
20 Septiembre 2006, 20:05 pm
por xDie
|
|
|
[H] Arrays
ASM
|
Erik#
|
4
|
3,366
|
9 Julio 2009, 19:13 pm
por Amerikano|Cls
|
|
|
Duda con arrays dentro de arrays
« 1 2 »
PHP
|
Servia
|
11
|
6,856
|
10 Marzo 2011, 09:04 am
por Servia
|
|
|
Cargar Lista de un fichero con fseek a una lista auxiliar en el programa.
Programación C/C++
|
samur88
|
1
|
3,135
|
12 Mayo 2011, 23:25 pm
por samur88
|
|