Lista con arrays

Iniciado por m@o_614, 15 Enero 2014, 19:51 PM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

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);
               p = ftell(hc12);
               buscarFinLinea(hc12);
               if(car == '\t')
               {
                   fseek(hc12,p,SEEK_SET);
                   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
   {
       car = fgetc(fd);
   }while(car == '\t' || car == ' ');
}

char *Tabla_Operandos(FILE *hc12)
{
   int car,lon = 0,pos;
   char *cadena;
   fseek(hc12,-1,SEEK_CUR);
   pos = ftell(hc12);
   do
   {
       car = fgetc(hc12);
       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

ivancea96

En que linea el warning?

m@o_614

#2
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
   {
       car = fgetc(fd);
   }while(car == '\t' || car == ' ');
}

char *Tabla_Operandos(FILE *hc12)
{
   int car,lon = 0,pos;
   char *cadena;
   fseek(hc12,-1,SEEK_CUR);
   pos = ftell(hc12);
   do
   {
       car = fgetc(hc12);
       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;
   tam = strlen(ins);
   tam1 = strlen(op);
   tam2 = strlen(dir);
   tam3 = strlen(maq);
   tam4 = strlen(calculado);
   tam5 = strlen(calcular);
   tam6 = strlen(total);
   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->codigo,ins);
   strcpy(x->Operando,op);
   strcpy(x->modo_direccionamiento,dir);
   strcpy(x->codigo_maquina,maq);
   strcpy(x->bytes_calculados,calculado);
   strcpy(x->bytes_x_calcular,calcular);
   strcpy(x->total_bytes,total);
   x->sig = NULL;
   return x;
}

void imprimirLista(COD *cabeza)
{
   COD *ptr;
   for(ptr = cabeza;ptr != NULL;ptr = ptr->sig)
   {
       printf("%s\t",ptr->codigo);
       printf("%s\t",ptr->Operando);
       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 :(



rir3760

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
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

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
    {
        car = fgetc(fd);
    }while(car == '\t' || car == ' ');
}

char *Tabla_Operandos(FILE *hc12)
{
    int car,lon = 0,pos;
    char *cadena;
    fseek(hc12,-1,SEEK_CUR);
    pos = ftell(hc12);
    do
    {
        car = fgetc(hc12);
        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;
    tam = strlen(ins);
    tam1 = strlen(op);
    tam2 = strlen(dir[i]);
    tam3 = strlen(maq[i]);
    tam4 = strlen(calculado[i]);
    tam5 = strlen(calcular[i]);
    tam6 = strlen(total[i]);
    x = malloc(sizeof(COD));
    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->codigo,ins);
    strcpy(x->Operando,op);
    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;
}