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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error en funcion que retorna vectores en C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error en funcion que retorna vectores en C.  (Leído 3,164 veces)
euroesp

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Error en funcion que retorna vectores en C.
« en: 28 Julio 2016, 19:34 pm »

Buenas,

Estoy haciendo un programa que primero me diga cuantas lineas tiene el archivo (se trata de un archivo con tres columnas y alrededor de 300.000 lineas) y luego me cree un vector en el que me escriba los términos de la segunda columna y otro con los términos de la tercera columna (la segunda columna son ints y la tercera long doubles). El problema es que todo funciona correctamente pero cuando le pido que me escriba las componentes de los vectores, me escribe "0" en todas, como si no estuviera leyendo nada. ¿Podrian ayudarme?

Les adjunto el codigo:

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. #define dim 10
  6. #define dim2 10000
  7.  
  8. int contarlineas (FILE *datos);
  9. double* vectorizaciont (FILE *datos, int lineas);
  10. double* vectorizacionUV (FILE *datos, int lineas);
  11.  
  12.  
  13. int main(){
  14.  
  15.    int lineas;
  16.    double *t;
  17.    long double *UV;
  18.  
  19.    FILE* datos = NULL;
  20. datos = fopen("00_10_01_01.00.00_._00_11_30_23.00.00_.txt", "r");
  21.  
  22.    lineas = contarlineas(datos);
  23.  
  24.    t = malloc(lineas*sizeof(double));
  25.    UV = malloc(lineas*sizeof(long double));
  26.  
  27.    t = vectorizaciont(datos,lineas);
  28.    UV = vectorizacionUV(datos,lineas);
  29.  
  30.  
  31. return 0;
  32.  
  33. }
  34.  
  35. int contarlineas (FILE *datos){
  36.  
  37.    int lineas = 0;
  38.    char aux[dim2] = "";
  39.  
  40.     while (!feof(datos)){
  41.  
  42.              lineas++;
  43.  fscanf(datos, " %[^\n]", &aux);
  44.  
  45.    }
  46.  
  47.    return lineas;
  48.  
  49.    }
  50.  
  51. double* vectorizaciont (FILE *datos, int lineas){
  52.  
  53.    int *t;
  54.    char aux[dim2] = "";
  55.    int i,i2,i3;
  56.  
  57.    t = malloc(lineas*sizeof(int));
  58.  
  59.    for (i=1;i<=lineas;i++){
  60.  
  61.        i2 = i-1;
  62.  
  63.        for(i3=1;i3<=3;i3++){
  64.  
  65.            if (i3 == 1){
  66.  
  67.                fscanf(datos, "%s", &aux);
  68.            }
  69.  
  70.            if (i3 == 2){
  71.  
  72.                fscanf(datos,"%i", &t[i2]);
  73.                printf("t[%i] = %i \n", i2, t[i2]);
  74.            }
  75.  
  76.            if (i3 == 3){
  77.  
  78.                fscanf(datos,"%s", &aux);
  79.            }
  80.  
  81.        }
  82.    }
  83.  
  84.    return t;
  85. }
  86.  
  87. double* vectorizacionUV (FILE *datos, int lineas){
  88.  
  89.    long double *UV;
  90.    char aux[dim2] = "", aux2[dim2] = "";
  91.    int i,i2,i3;
  92.  
  93.    UV = malloc(lineas*sizeof(long double));
  94.  
  95.    for (i=1;i<=lineas;i++){
  96.  
  97.        i2 = i-1;
  98.  
  99.        for(i3=1;i3<=3;i3++){
  100.  
  101.            if (i3 == 1){
  102.  
  103.                fscanf(datos,"%s", &aux);
  104.            }
  105.  
  106.            if (i3 == 2){
  107.  
  108.                fscanf(datos,"%s", &aux);
  109.            }
  110.  
  111.            if (i3 == 3){
  112.  
  113.                fscanf(datos,"%lf", &aux2);
  114.                printf("UV[%i] = %lf \n", i2, UV[i2]);
  115.            }
  116.  
  117.        }
  118.    }
  119.  
  120.    return UV;
  121.  
  122. }

Gracias por adelantado.


Mod: Los códigos deben ir en etiquetas GeSHi


« Última modificación: 29 Julio 2016, 12:32 pm por euroesp » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Problema programacion en C.
« Respuesta #1 en: 28 Julio 2016, 21:08 pm »

Mod: Modifica el título de tu tema, las reglas el foro indican que el mismo debe ser descriptivo a la tematica


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Problema programacion en C.
« Respuesta #2 en: 29 Julio 2016, 09:19 am »

Solo voy a indicar el fallo, aunque veo algunas cosas que se podrían optimizar. El fallo es que al contar las líneas, ya has leído el archivo, por lo que cuando vas a tomar los datos enteros, no lees nada porque ya has leído el archivo. Para reiniciar la lectura del archivo, usa la siguiente función: fseek(apuntador_archivo, 0, SEEK_SET);
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problema programacion en C.
« Respuesta #3 en: 29 Julio 2016, 09:37 am »

Solo voy a indicar el fallo, aunque veo algunas cosas que se podrían optimizar. El fallo es que al contar las líneas, ya has leído el archivo, por lo que cuando vas a tomar los datos enteros, no lees nada porque ya has leído el archivo. Para reiniciar la lectura del archivo, usa la siguiente función: fseek(apuntador_archivo, 0, SEEK_SET);

O directamente puede utilizar la función rewind(Fichero).  :xD
« Última modificación: 29 Julio 2016, 09:39 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
euroesp

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Error en funcion que retorna vectores en C.
« Respuesta #4 en: 29 Julio 2016, 12:35 pm »

Buenas,

Antes de nada agradecerles sus aportes y el tiempo que han dedicado a mi problema. El caso es que he probado con el fseek y con el rewind pero el problema persiste, incluso quitando la funcion "contarlineas" y dando a lineas un valor fijo, sigue devolviendo ceros.

Les adjunto el codigo nuevo.

Código:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define dim 10
#define dim2 10000

int contarlineas (FILE *datos);
double* vectorizaciont (FILE *datos, int lineas);
double* vectorizacionUV (FILE *datos, int lineas);


int main(){

    int lineas;
    double *t;
    long double *UV;

    FILE* datos = NULL;
datos = fopen("00_10_01_01.00.00_._00_11_30_23.00.00_.txt", "r");

    lineas = contarlineas(datos);

    rewind(datos);

    t = malloc(lineas*sizeof(double));
    UV = malloc(lineas*sizeof(long double));

    t = vectorizaciont(datos,lineas);
    UV = vectorizacionUV(datos,lineas);


 return 0;

}

int contarlineas (FILE *datos){

    int lineas = 0;
    char aux[dim2] = "";

     while (!feof(datos)){

              lineas++;
  fscanf(datos, " %[^\n]", &aux);

    }

    return lineas;

    }

double* vectorizaciont (FILE *datos, int lineas){

    double *t;
    char aux[dim2] = "";
    int i,i2,i3;

    t = malloc(lineas*sizeof(double));

    for (i=1;i<=lineas;i++){

        i2 = i-1;

        for(i3=1;i3<=3;i3++){

            if (i3 == 1){

                fscanf(datos, "%s", &aux);
                free(aux);
            }

            if (i3 == 2){

                fscanf(datos,"%f", &t[i2]);
                printf("t[%i] = %f \n", i2, t[i2]);
            }

            if (i3 == 3){

                fscanf(datos,"%s", &aux);
                free(aux);
            }

        }
    }

    return t;
}

double* vectorizacionUV (FILE *datos, int lineas){

    long double *UV;
    char aux[dim2] = "", aux2[dim2] = "";
    int i,i2,i3;

    UV = malloc(lineas*sizeof(long double));

    for (i=1;i<=lineas;i++){

        i2 = i-1;

        for(i3=1;i3<=3;i3++){

            if (i3 == 1){

                fscanf(datos,"%s", &aux);
                free(aux);
            }

            if (i3 == 2){

                fscanf(datos,"%s", &aux);
                free(aux);
            }

            if (i3 == 3){

                fscanf(datos,"%lf", &aux2);
                printf("UV[%i] = %lf \n", i2, UV[i2]);
            }

        }
    }

    return UV;

}

Gracias por su tiempo.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Error en funcion que retorna vectores en C.
« Respuesta #5 en: 29 Julio 2016, 14:42 pm »

Código
  1. double* vectorizacionUV (FILE *datos, int lineas){
  2.  
  3.    long double *UV;
  4.    char aux[dim2] = "", aux2[dim2] = "";
  5.    int i,i2,i3;
  6.  
  7.    UV = malloc(lineas*sizeof(long double));
  8.  
  9.    for (i=1;i<=lineas;i++){
  10.  
  11.        i2 = i-1;
  12.  
  13.        for(i3=1;i3<=3;i3++){
  14.  
  15.            if (i3 == 1){
  16.  
  17.                fscanf(datos,"%s", &aux);
  18.                free(aux);
  19.            }
  20.  
  21.            if (i3 == 2){
  22.  
  23.                fscanf(datos,"%s", &aux);
  24.                free(aux);
  25.            }
  26.  
  27.            if (i3 == 3){
  28.  
  29.                fscanf(datos,"%lf", &aux2);
  30.                printf("UV[%i] = %lf \n", i2, UV[i2]);
  31.            }
  32.  
  33.        }
  34.    }
  35.  
  36.    return UV;
  37.  
  38. }

Un par e cosas ahí. en primer lugar, no hagas esos free(aux). aux no tiene es memoria dinámica.
Luego, ese for e ifs son innecesarios:
Código
  1. double* vectorizacionUV (FILE *datos, int lineas){
  2.  
  3.    long double *UV;
  4.    char aux[dim2] = "", aux2[dim2] = "";
  5.    int i,i2,i3;
  6.  
  7.    UV = malloc(lineas*sizeof(long double));
  8.  
  9.    for (i=1;i<=lineas;i++){
  10.  
  11.        i2 = i-1;
  12.  
  13.        fscanf(datos,"%s", &aux);
  14.  
  15.        fscanf(datos,"%s", &aux);
  16.  
  17.        fscanf(datos,"%lf", &aux2);
  18.        printf("UV[%i] = %lf \n", i2, UV[i2]);
  19.    }
  20.  
  21.    return UV;
  22.  
  23. }

Luego, ese último printf saca por pantalla UV[i2]. ¿Dónde le asignas un valor a UV[i2]?

Por último, puedes prescindir de aux2. Puedes usar aux en la tercera parte.

Lo mismo se aplica para la otra función, vectorizaciont.
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Error en funcion que retorna vectores en C.
« Respuesta #6 en: 29 Julio 2016, 14:57 pm »

La función 'vectorizaciont' retorna un puntero a double, mientras que debería retornar un puntero a entero. Además, el rewind o fseek lo tienes que hacer también de leer los enteros
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Error en funcion que retorna vectores en C.
« Respuesta #7 en: 29 Julio 2016, 16:17 pm »

Y a fscanf le estás pasando un doble puntero a caracteres en lugar de utilizar simplemente el identificador de la cadena...
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines