elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ... 40
121  Programación / Programación C/C++ / Re: modos de direccionamiento en: 17 Febrero 2014, 19:18 pm
gracias erest0r por tu respuesta, ya cambie el printf que me estaba dando problemas ahora me queda una duda, para comparar cadenas tengo que usar strcmp pero si tengo que verificar si la cadena es "X","Y","SP" o "PC", no habra una manera de reducir el codigo en esa parte donde tengo los strcmps en el if??:

Código
  1. int direccionamientoIndexado(char *operando)
  2. {
  3.    int i;
  4.    char *cadena = NULL,c[2];
  5.    cadena = calloc(2,sizeof(char));
  6.    for(i = 3;operando[i] != ']';i++)
  7.    {
  8.        sprintf(c,"%c",operando[i]);
  9.        strcat(cadena,c);
  10.    }
  11.    printf("%s",cadena);
  12.    if((strcmp(cadena,"X") == 0)||(strcmp(cadena,"Y") == 0)||(strcmp(cadena,"SP") == 0)||(strcmp(cadena,"PC") == 0))
  13.       return 1;
  14.    else
  15.       return 0;
  16. }
  17.  

gracias
122  Programación / Programación C/C++ / modos de direccionamiento en: 16 Febrero 2014, 21:18 pm
Saludos, tengo el siguiente codigo que dado un operando (una cadena) tiene que verificar que modo de direccionamiento es, puede ser inmediato,directo o indexado, yo ahora estoy verificando cuando un operando es indexado, esto es: que el primer caracter sea un corchete [, que el segundo caracter sea una d ó D, que el tercer caracter sea una coma, y ya que verificaste los primeros 3 el termino que va despues de la coma puede ser X,Y,SP,PC, o sea algo como:

[D,X], [D,Y], [D,SP], [D,PC]  

el problema lo tengo en la funcion direccionamientoIndexado() que se supone que me tiene que imprimir el termino que va despues de la coma, pero cuando los operandos son: [D,SP] o [D,PC] el segundo termino lo imprime como SSP en vez de SP y no entiendo por qué. EL codigo va leyendo desde la coma hasta el corcheta ] y lo que se encuentre entre estos dos los guarda en una cadena

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define INMEDIATO '#'
  5. #define DIRECTO '$'
  6. #define INDEXADO '['
  7.  
  8. void modoDireccionamiento(char *operando);
  9. void direccionamientoIndexado(char *operando);
  10. int esNumeroBase16(char caracter);
  11. int esLetraBase16(char caracter);
  12. int esOctal(char caracter);
  13. int esBinario(char caracter);
  14.  
  15. int main()
  16. {
  17.    char *operando = "[D,PC]";
  18.    modoDireccionamiento(operando);
  19.    return 0;
  20. }
  21.  
  22. void modoDireccionamiento(char *operando)
  23. {
  24.    int car,esInmediato,esDirecto,esIndexado,tam,i;
  25.    tam = strlen(operando);
  26.    car = operando[0];
  27.    switch(car)
  28.    {
  29.        case INMEDIATO:
  30.           esInmediato = 1;
  31.           car = operando[1];
  32.           switch(car)
  33.           {
  34.               case '\0':
  35.                  printf("Es un formato invalido para un modo de direccionamiento inmediato\n");
  36.                  break;
  37.               case '$':
  38.                  for(i = 2;((i < tam)&&(esInmediato));i++)
  39.                  {
  40.                      if((!esNumeroBase16(operando[i]))&&(!esLetraBase16(operando[i])))
  41.                         esInmediato = 0;
  42.                  }
  43.                  if(!esInmediato)
  44.                     printf("Se encontro un digito invalido para un numero de base 16");
  45.                  break;
  46.               case '@':
  47.                  for(i = 2;((i < tam)&&(esInmediato));i++)
  48.                  {
  49.                      if(!esOctal(operando[i]))
  50.                         esInmediato = 0;
  51.                  }
  52.                  if(!esInmediato)
  53.                     printf("Se encontro un digito invalido para un numero de base 8");
  54.                  break;
  55.               case '%':
  56.                  for(i = 2;((i < tam)&&(esInmediato));i++)
  57.                  {
  58.                      if(!esBinario(operando[i]))
  59.                         esInmediato = 0;
  60.                  }
  61.                  if(!esInmediato)
  62.                     printf("Se encontro un digito invalido para un numero de base 2");
  63.                  break;
  64.               default:
  65.                  printf("Error");
  66.           }
  67.           break;
  68.        case DIRECTO:
  69.           esDirecto = 1;
  70.           if(operando[1] == '\0')
  71.              printf("Es un formato invalido para un modo de direccionamiento directo\n");
  72.           else
  73.           {
  74.               for(i = 2;((i < tam)&&(esDirecto));i++)
  75.               {
  76.                   if((!esNumeroBase16(operando[i]))&&(!esLetraBase16(operando[i])))
  77.                      esDirecto = 0;
  78.               }
  79.               if(!esDirecto)
  80.                  printf("Se encontro un digito invalido para un numero de base 16");
  81.           }
  82.           break;
  83.        case INDEXADO:
  84.           esIndexado = 1;
  85.           car = operando[1];
  86.           switch(car)
  87.           {
  88.               case '\0':
  89.                  printf("Es un formato invalido para un modo de direccionamiento indexado\n");
  90.                  break;
  91.               case ',':
  92.                  printf("No puede haber una instruccion vacia antes de la coma");
  93.                  break;
  94.               case 'd':
  95.               case 'D':
  96.                  if(operando[2] == ',')
  97.                  {
  98.                      direccionamientoIndexado(operando);
  99.                         //esIndexado = 0;
  100.                  }
  101.                  //if(!esIndexado)
  102.                     //printf("Es un formato invalido para direccionamiento indexado");
  103.                  break;
  104.               default:
  105.                  printf("Error");
  106.           }
  107.           break;
  108.        default:
  109.           printf("Error: es un formato invalido para los modos de direccionamiento inmediato\n");
  110.    }
  111. }
  112.  
  113. int esNumeroBase16(char caracter)
  114. {
  115.    if(caracter >= '0' && caracter <= '9')
  116.       return 1;
  117.    else
  118.       return 0;
  119. }
  120.  
  121. int esLetraBase16(char caracter)
  122. {
  123.    if((caracter >= 'A' && caracter <= 'F')||(caracter >= 'a' && caracter <= 'f'))
  124.       return 1;
  125.    else
  126.       return 0;
  127. }
  128.  
  129. int esOctal(char caracter)
  130. {
  131.    if(caracter >= '0' && caracter <= '7')
  132.       return 1;
  133.    else
  134.       return 0;
  135. }
  136.  
  137. int esBinario(char caracter)
  138. {
  139.    if(caracter == '1' || caracter == '0')
  140.       return 1;
  141.    else
  142.       return 0;
  143. }
  144.  
  145. void direccionamientoIndexado(char *operando)
  146. {
  147.    int i;
  148.    char *cadena = NULL,c[2];
  149.    cadena = calloc(2,sizeof(char));
  150.    for(i = 3;operando[i] != ']';i++)
  151.    {
  152.        sprintf(c,"%c",operando[i]);
  153.        strcat(cadena,c);
  154.        printf("%s",cadena);
  155.    }
  156. }
  157.  

si alguien me pudiera decir donde esta el error se lo agradeceria mucho
123  Programación / Programación C/C++ / Macros en C en: 14 Febrero 2014, 18:06 pm
Saludos, tengo una duda acerca de cómo se pueden usar unas MACROS en lenguaje C, es posible que el nombre de la MACRO tenga asignado mas de un valor?? por ejemplo:

NOMBRE '#','$','@'

124  Programación / Programación C/C++ / Re: problema con sprintf en: 9 Febrero 2014, 20:21 pm
muchas gracias leosansan por tu respuesta, en vez de usar el gets le puse una funcion para quitarle el salto de linea '\n' y ya con esto ya lo hace correctamente. Una ultima duda, si yo quisiera que al escribirse el nombre del archivo a abrir, no necesariamente tenga que ser identicamente a como se encuentra el original y que pudiera hacerse indistintamente con combinaciones de mayúsculas y minúsculas, ¿cómo lo podría hacer? alguna idea??
125  Programación / Programación C/C++ / problema con sprintf en: 9 Febrero 2014, 19:46 pm
Saludos, tengo el siguiente código que me tiene que abrir un archivo que se llama P1ASM.txt, pero el programa me tiene que preguntar el nombre del archivo para ver si se encuentra, pero me imprime No se pudo abrir el archivo y no entiendo por que si el archivo se encuentra en la misma carpeta donde tengo el codigo no deberia de haber errores

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX 40
  5.  
  6. int main()
  7. {
  8.   FILE *fd;
  9.    char nombre[MAX],archivo[MAX];
  10.    printf("Que archivo quieres abrir: ");
  11.    fgets(nombre,MAX,stdin);
  12.    sprintf(archivo,"%s.txt",nombre);
  13.    if((fd = fopen(archivo,"r"))!= NULL)
  14.       printf("Si se encontro");
  15.    else
  16.       printf("No se pudo abrir el archivo");
  17.   return 0;
  18. }
  19.  

gracias
126  Foros Generales / Dudas Generales / busco un libro en: 4 Febrero 2014, 23:29 pm
Saludos

necesito que alguien me recomiende un libro que hable sobre la computación tolerante a fallas, especificamente de los temas capacidad de proceso y especificacion de operacion, tengo que hacer unos resúmenes de estos temas pero no encuentro informacion que me ayude

gracias de antemano
127  Programación / Programación C/C++ / Re: problemas con fseeks en: 31 Enero 2014, 18:32 pm
Saludos x64Core el problema es que no se usar el depurador de codeblocks :S lo intente con un tutorial pero no pude
128  Programación / Programación C/C++ / problemas con fseeks en: 30 Enero 2014, 21:55 pm
Saludos, tengo problemas con unos fseeks que tengo dentro de un ciclo while que me lee un archivo, pero a la hora de imprimir el archivo no lo hace correctamente

este es el codigo:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX 8
  5.  
  6. typedef enum {INS,OP,DIR,MAQ,CALCULADO,CALCULAR,TOTAL} tabla;
  7.  
  8. void buscarFinLinea(FILE *hc12);
  9. void listaTABOP();
  10. char *Tabla_Operandos(FILE *hc12,int tabla);
  11. void ignorarEspacios(FILE *hc12);
  12. void quitarSaltosLinea(char *cadena);
  13.  
  14. int main()
  15. {
  16.    listaTABOP();
  17.    return 0;
  18. }
  19.  
  20. void buscarFinLinea(FILE *hc12)
  21. {
  22.    int car;
  23.    while((car = fgetc(hc12))!= '\n')
  24.        ;
  25. }
  26.  
  27. void quitarSaltosLinea(char *c)
  28. {
  29.    char *ptr;
  30.    if(((ptr = strchr(c,'\n'))!= NULL)||((ptr = strchr(c,'\t'))!= NULL)||((ptr = strchr(c,' '))!= NULL))
  31.       *ptr = '\0';
  32. }
  33.  
  34. void listaTABOP()
  35. {
  36.    int car,i,pos,n;
  37.    FILE *hc12;
  38.    COD *ultimo = NULL;
  39.    char *ins,*op,**dir,**maq,**cal,**x_cal,**sum;
  40.    if((hc12 = fopen("Tabla_OP.txt","r"))!= NULL)
  41.    {
  42.        while((car = fgetc(hc12))!= EOF)
  43.        {
  44.            i = 0;
  45.            fseek(hc12,-1,SEEK_CUR);
  46.            ins = Tabla_Operandos(hc12,INS);
  47.            printf("[%s]\t",ins);
  48.            ignorarEspacios(hc12);
  49.            op = Tabla_Operandos(hc12,OP);
  50.            printf("[%s]",op);
  51.            pos = ftell(hc12);
  52.            buscarFinLinea(hc12);
  53.            if((car = fgetc(hc12)) != '\t')
  54.            {
  55.                n = 0;
  56.                fseek(hc12,pos,SEEK_SET);
  57.                ignorarEspacios(hc12);
  58.                dir = (char**)malloc(sizeof(char*));
  59.                dir[i] = Tabla_Operandos(hc12,DIR);
  60.                printf("\t[%s]\t",dir[i]);
  61.                ignorarEspacios(hc12);
  62.                maq = (char**)malloc(sizeof(char*));
  63.                maq[i] = Tabla_Operandos(hc12,MAQ);
  64.                printf("[%s]\t",maq[i]);
  65.                ignorarEspacios(hc12);
  66.                cal = (char**)malloc(sizeof(char*));
  67.                cal[i] = Tabla_Operandos(hc12,CALCULADO);
  68.                printf("[%s]\t",cal[i]);
  69.                ignorarEspacios(hc12);
  70.                x_cal = (char**)malloc(sizeof(char*));
  71.                x_cal[i] = Tabla_Operandos(hc12,CALCULAR);
  72.                printf("[%s]\t",x_cal[i]);
  73.                ignorarEspacios(hc12);
  74.                sum = (char**)malloc(sizeof(char*));
  75.                sum[i] = Tabla_Operandos(hc12,TOTAL);
  76.                printf("[%s]\n",sum[i]);
  77.                buscarFinLinea(hc12);
  78.            }
  79.            else
  80.            {
  81.                n = 1;
  82.                fseek(hc12,pos,SEEK_SET);
  83.                dir = (char**)malloc(MAX*sizeof(char*));
  84.                maq = (char**)malloc(MAX*sizeof(char*));
  85.                cal = (char**)malloc(MAX*sizeof(char*));
  86.                x_cal = (char**)malloc(MAX*sizeof(char*));
  87.                sum = (char**)malloc(MAX*sizeof(char*));
  88.                do
  89.                {
  90.                    ignorarEspacios(hc12);
  91.                    dir[i] = Tabla_Operandos(hc12,DIR);
  92.                    printf("\t[%s]\t",dir[i]);
  93.                    ignorarEspacios(hc12);
  94.                    maq[i] = Tabla_Operandos(hc12,MAQ);
  95.                    printf("[%s]\t",maq[i]);
  96.                    ignorarEspacios(hc12);
  97.                    cal[i] = Tabla_Operandos(hc12,CALCULADO);
  98.                    printf("[%s]\t",cal[i]);
  99.                    ignorarEspacios(hc12);
  100.                    x_cal[i] = Tabla_Operandos(hc12,CALCULAR);
  101.                    printf("[%s]\t",x_cal[i]);
  102.                    ignorarEspacios(hc12);
  103.                    sum[i] = Tabla_Operandos(hc12,TOTAL);
  104.                    printf("[%s]\n",sum[i]);
  105.                    buscarFinLinea(hc12);
  106.                    i++;
  107.                    printf("\t");
  108.                }while((car = fgetc(hc12)) == '\t');
  109.            }
  110.        }
  111.    }
  112.    else
  113.       printf("No se pudo abrir el archivo");
  114. }
  115.  
  116. void ignorarEspacios(FILE *hc12)
  117. {
  118.    int car;
  119.    do
  120.    {
  121.        car = fgetc(hc12);
  122.    }while(car == '\t' || car == ' ');
  123. }
  124.  
  125. char *Tabla_Operandos(FILE *hc12,int tabla)
  126. {
  127.    int car,lon = 0,pos;
  128.    char *c;
  129.    fseek(hc12,-1,SEEK_CUR);
  130.    pos = ftell(hc12);
  131.    if((tabla==INS)||(tabla==OP)||(tabla==DIR)||(tabla==MAQ)||(tabla==CALCULADO)||(tabla==CALCULAR))
  132.    {
  133.        do
  134.        {
  135.            car = fgetc(hc12);
  136.            lon++;
  137.        }while(car != '\t' && car != EOF);
  138.    }
  139.    else
  140.    {
  141.        do
  142.        {
  143.            car = fgetc(hc12);
  144.            lon++;
  145.        }while(car != '\n' && car != EOF);
  146.        lon--;
  147.    }
  148.    fseek(hc12,pos,SEEK_SET);
  149.    c = (char*)calloc((lon+1),sizeof(char));
  150.    fgets(c,lon+1,hc12);
  151.    quitarSaltosLinea(c);
  152.    return c;
  153. }
  154.  
[
y el archivo es
quote]ABA         NO   INH      1806      2   0   2
          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
                            [D,IDX]   A9xb      1   1   2
                            [IDX2]   A9xbeeff   1   3   4[/quote]
el problema es que  cuando llega al codop ADCA no me imprime toda la linea solo me imprime

[]....[ADCA]...[SI]...[IMM]...[89ii]....[1]...[1]

 esto se arregla si le quito el primer fseek() que aparece en el while() de la funcion listaTABOP, pero si se lo quito ahora los codops siguientes al ADCA los imprime sin la primer letra, se la come,entonces como puedo arreglar este problema

gracias
129  Programación / Programación C/C++ / se me borro el codigo en: 27 Enero 2014, 05:08 am
Saludos, tengo un problema con el siguiente codigo que creo que ya habia posteado antes, pero lo que pasa es que de repente la pantalla se me congelo y cuando reinicie la maquina ya no tenia codigo, se me borro todo y ahora estoy empezandolo a hacer de nuevo todo, el codigo me lee de un archivo todos los codigos de operacion y me hace una lista simplemente ligada, esto si funciona bien, pero a la hora de que le pido que busque un codigo de operacion en la lista siempre me imprime que no lo encuentra, y no entiendo por que? si alguien me pudiera ayudar se lo agradeceria mucho

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define LONG_ETIQUETA 8
  5. #define LONG_CODOP 5
  6. #define COMENTARIO ';'
  7. #define TABULADOR '\t'
  8. #define ESPACIOS_ ' '
  9. #define MAX 8
  10.  
  11. typedef enum {FALSO,VERDADERO} booleano;
  12. typedef enum {ETIQUETA,CODOP,OPERANDO} linea;
  13.  
  14. typedef struct nodo
  15. {
  16.    char *instruccion;
  17.    struct nodo *sig;
  18. }COD;
  19.  
  20. void imprimirLista(COD *cabeza);
  21. int verificarCombinacion(FILE *fd);
  22. booleano esComentario(FILE *fd);
  23. char *Etiqueta_Codop_Operando(FILE *fd,int linea);
  24. void ultimaLinea(char *codop);
  25. void buscarFinLinea(FILE *fd);
  26. void ignorarEspacios(FILE *fd);
  27. void listaTABOP(COD **cabeza);
  28. COD *ultimoElemento(COD **cabeza);
  29. COD *crearNodo(char *ins);
  30. void insertarFinal(char *ins,COD *ultimo);
  31. char *Tabla_Operandos(FILE *hc12);
  32. COD *buscarCodop(COD *cabeza,char *codop);
  33. void quitarSaltosLinea(char *cadena);
  34. booleano esNumero(char caracter);
  35. booleano esLetra(char caracter);
  36.  
  37. int main()
  38. {
  39.    FILE *fd;
  40.    int car,combinacion;
  41.    COD *cabeza = NULL,*encontrado = NULL;
  42.    char *etiqueta,*codop,*operando;
  43.    listaTABOP(&cabeza);
  44.    //imprimirLista(cabeza);
  45.    if((fd = fopen("ejemplo_errores.txt","r"))!= NULL)
  46.    {
  47.        while((car = fgetc(fd))!= EOF)
  48.        {
  49.            switch(car)
  50.            {
  51.                case COMENTARIO:
  52.                   if(esComentario(fd))
  53.                      printf("COMENTARIO\n\n");
  54.                   else
  55.                      buscarFinLinea(fd);
  56.                   break;
  57.                case ESPACIOS_:
  58.                case TABULADOR:
  59.                   etiqueta = "null";
  60.                   printf("ETIQUETA = %s\n",etiqueta);
  61.                   ignorarEspacios(fd);
  62.                   codop = Etiqueta_Codop_Operando(fd,CODOP);
  63.                   printf("CODOP = %s\n",codop);
  64.                   erroresCodop(codop);
  65.                   combinacion = verificarCombinacion(fd);
  66.                   if(combinacion == 2)
  67.                   {
  68.                       operando = "null";
  69.                       printf("OPERANDO = %s\n\n",operando);
  70.                   }
  71.                   else
  72.                   {
  73.                       ignorarEspacios(fd);
  74.                       operando = Etiqueta_Codop_Operando(fd,OPERANDO);
  75.                       printf("OPERANDO = %s\n\n",operando);
  76.                   }
  77.                   break;
  78.                default:
  79.                   etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA);
  80.                   printf("ETIQUETA = %s\n",etiqueta);
  81.                   erroresEtiqueta(etiqueta);
  82.                   combinacion = verificarCombinacion(fd);
  83.                   if(combinacion == 2)
  84.                   {
  85.                       codop = "null";
  86.                       printf("CODOP = %s\n",codop);
  87.                       erroresCodop(codop);
  88.                       operando = "null";
  89.                       printf("OPERANDO = %s\n\n",operando);
  90.                   }
  91.                   else
  92.                   {
  93.                       ignorarEspacios(fd);
  94.                       codop = Etiqueta_Codop_Operando(fd,CODOP);
  95.                       printf("CODOP = %s\n",codop);
  96.                       erroresCodop(codop);
  97.                       combinacion = verificarCombinacion(fd);
  98.                       if(combinacion == 2)
  99.                       {
  100.                           operando = "null";
  101.                           printf("OPERANDO = %s\n\n",operando);
  102.                       }
  103.                       else
  104.                       {
  105.                           ignorarEspacios(fd);
  106.                           operando = Etiqueta_Codop_Operando(fd,OPERANDO);
  107.                           printf("OPERANDO = %s\n\n",operando);
  108.                       }
  109.                   }
  110.                   break;
  111.            }
  112.            if((encontrado = buscarCodop(cabeza,codop)) == NULL)
  113.               printf("NO SE ENCONTRO EL CODOP DE OPERACION\n");
  114.        }
  115.        ultimaLinea(codop);
  116.    }
  117.    else
  118.       printf("No se pudo abrir el archivo");
  119.    return 0;
  120. }
  121.  
  122. booleano esComentario(FILE *fd)
  123. {
  124.    int car;
  125.    while((car = fgetc(fd))!= '\n')
  126.    {
  127.        if(car == ';')
  128.           return 0;
  129.    }
  130.    return 1;
  131. }
  132.  
  133. void buscarFinLinea(FILE *fd)
  134. {
  135.    int car;
  136.    while((car = fgetc(fd))!= '\n')
  137.        ;
  138. }
  139.  
  140. void ignorarEspacios(FILE *fd)
  141. {
  142.    int car;
  143.    do
  144.    {
  145.        car = fgetc(fd);
  146.    }while(car == '\t' || car == ' ');
  147. }
  148.  
  149. int verificarCombinacion(FILE *fd)
  150. {
  151.    int car,combinacion;
  152.    fseek(fd,-1,SEEK_CUR);
  153.    if((car = fgetc(fd))== '\n')
  154.       combinacion = 2;
  155.    else
  156.       combinacion = 1;
  157.    return combinacion;
  158. }
  159.  
  160. booleano esLetra(char caracter)
  161. {
  162.    if((caracter >= 'A' && caracter <= 'Z')||(caracter >= 'a' && caracter <= 'z'))
  163.       return 1;
  164.    else
  165.       return 0;
  166. }
  167.  
  168. booleano esNumero(char caracter)
  169. {
  170.    if(caracter >= '0' && caracter <= '9')
  171.       return 1;
  172.    else
  173.       return 0;
  174. }
  175.  
  176. char *Etiqueta_Codop_Operando(FILE *fd,int linea)
  177. {
  178.    int car,lon = 0,pos;
  179.    char *cadena,*ptr;
  180.    fseek(fd,-1,SEEK_CUR);
  181.    pos = ftell(fd);
  182.    if((linea == ETIQUETA)||(linea == CODOP))
  183.    {
  184.        do
  185.        {
  186.            car = fgetc(fd);
  187.            lon++;
  188.        }while(car != '\t' && car != ' ' && car != '\n');
  189.    }
  190.    else
  191.    {
  192.        do
  193.        {
  194.            car = fgetc(fd);
  195.            lon++;
  196.        }while(car != '\n');
  197.    }
  198.    cadena = (char*)calloc((lon+1),sizeof(char));
  199.    fseek(fd,pos,SEEK_SET);
  200.    fgets(cadena,lon+1,fd);
  201.    if(((ptr=strchr(cadena,'\n'))!=NULL)||((ptr=strchr(cadena,'\t'))!=NULL)||((ptr=strchr(cadena,' '))!=NULL))
  202.       *ptr = '\0';
  203.    return cadena;
  204. }
  205.  
  206. void ultimaLinea(char *codop)
  207. {
  208.    if((strcmp(codop,"end")) != 0)
  209.       printf("Error:No se encontro el END.\n");
  210. }
  211.  
  212. void quitarSaltosLinea(char *cadena)
  213. {
  214.    char *ptr;
  215.    if(((ptr=strchr(cadena,'\n'))!=NULL)||((ptr=strchr(cadena,'\t'))!=NULL)||((ptr=strchr(cadena,' '))!=NULL))
  216.       *ptr = '\0';
  217. }
  218.  
  219. void listaTABOP(COD **cabeza)
  220. {
  221.    int car;
  222.    FILE *hc12;
  223.    COD *ultimo = NULL;
  224.    char *ins;
  225.    if((hc12 = fopen("Tabla_OP.txt","r"))!= NULL)
  226.    {
  227.         while((car = fgetc(hc12))!= EOF)
  228.        {
  229.            if(car != '\t')
  230.            {
  231.                ins = Tabla_Operandos(hc12);
  232.                buscarFinLinea(hc12);
  233.                if(*cabeza == NULL)
  234.                   *cabeza = crearNodo(ins);
  235.                else
  236.                {
  237.                    ultimo = ultimoElemento(cabeza);
  238.                    insertarFinal(ins,ultimo);
  239.                }
  240.            }
  241.            else
  242.               buscarFinLinea(hc12);
  243.        }
  244.    }
  245.    else
  246.       printf("No se pudo abrir el archivo");
  247. }
  248.  
  249. COD *ultimoElemento(COD **cabeza)
  250. {
  251.    COD *ptr;
  252.    ptr = *cabeza;
  253.    while(ptr->sig != NULL)
  254.       ptr = ptr->sig;
  255.    return ptr;
  256. }
  257.  
  258. char *Tabla_Operandos(FILE *hc12)
  259. {
  260.    int car,lon = 0,pos;
  261.    char *cadena;
  262.    fseek(hc12,-1,SEEK_CUR);
  263.    pos = ftell(hc12);
  264.        do
  265.        {
  266.            car = fgetc(hc12);
  267.            lon++;
  268.        }while(car != '\t');
  269.    fseek(hc12,pos,SEEK_SET);
  270.    cadena = calloc((lon+1));
  271.    fgets(cadena,lon+1,hc12);
  272.    quitarSaltosLinea(cadena);
  273.    return cadena;
  274. }
  275.  
  276. COD *buscarCodop(COD *cabeza,char *codop)
  277. {
  278.    COD *ptr;
  279.    for(ptr = cabeza;ptr != NULL;ptr = ptr->sig)
  280.    {
  281.        if(ptr->instruccion == codop)
  282.           return ptr;
  283.    }
  284.    return NULL;
  285. }
  286.  
  287. void insertarFinal(char *ins,COD *ultimo)
  288. {
  289.    ultimo->sig = crearNodo(ins);
  290.    ultimo->sig->sig = NULL;
  291.    ultimo = ultimo->sig;
  292. }
  293.  
  294. COD *crearNodo(char *ins)
  295. {
  296.    int tam;
  297.    COD *x;
  298.    x = (COD*)malloc(sizeof(COD));
  299.    tam = strlen(ins);
  300.    x->instruccion = malloc(tam);
  301.    strcpy(x->instruccion,ins);
  302.    x->sig = NULL;
  303.    return x;
  304. }
  305.  

130  Programación / Programación C/C++ / problema con doble punteros en: 26 Enero 2014, 23:11 pm
Saludos tengo una variable que es de tipo char** p, esto es para que sea un arreglo que contenga cadenas de tamaño variable y despues estas variables asignarselas al elemento nombre del mismo tipo que esta en una estructura, el problema es que el codigo me truena y no se por que

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX 4
  5.  
  6. typedef struct
  7. {
  8.    char **nombre;
  9. }CODOP;
  10.  
  11. int main()
  12. {
  13.    int tam,tam1,tam2,tam3,i;
  14.    CODOP *x;
  15.    char **p;
  16.    x = (CODOP*)malloc(sizeof(CODOP));
  17.    p = (char**)malloc(MAX*sizeof(char*));
  18.    p[0] = "anita";
  19.    p[1] = "lava";
  20.    p[2] = "la";
  21.    p[3] = "tina";
  22.    tam = strlen(p[0]);
  23.    tam1 = strlen(p[1]);
  24.    tam2 = strlen(p[2]);
  25.    tam3 = strlen(p[3]);
  26.    x->nombre = (char**)malloc(MAX*sizeof(char*));
  27.    x->nombre[0] = (char*)malloc((tam+1)*sizeof(char));
  28.    x->nombre[1] = (char*)malloc((tam1+1)*sizeof(char));
  29.    x->nombre[2] = (char*)malloc((tam2+1)*sizeof(char));
  30.    x->nombre[3] = (char*)malloc((tam3+1)*sizeof(char));
  31.    strcpy(x->nombre[0],p[0]);
  32.    strcpy(x->nombre[1],p[1]);
  33.    strcpy(x->nombre[2],p[2]);
  34.    strcpy(x->nombre[3],p[3]);
  35.    for(i = 0;i < MAX;i++)
  36.       printf("%s\n",x->nombre[i]);
  37.    return 0;
  38. }
  39.  

gracias de antemano
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ... 40
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines