Autor
|
Tema: Error en funcion que retorna vectores en C. (Leído 3,463 veces)
|
euroesp
Desconectado
Mensajes: 8
|
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: #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); 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] = ""; lineas++; fscanf(datos , " %[^\n]", &aux ); } return lineas; } double* vectorizaciont (FILE *datos, int lineas){ int *t; char aux[dim2] = ""; int i,i2,i3; t = malloc(lineas *sizeof(int)); for (i=1;i<=lineas;i++){ i2 = i-1; for(i3=1;i3<=3;i3++){ if (i3 == 1){ } if (i3 == 2){ printf("t[%i] = %i \n", i2 , t [i2 ]); } if (i3 == 3){ } } } 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){ } if (i3 == 2){ } if (i3 == 3){ printf("UV[%i] = %lf \n", i2 , UV [i2 ]); } } } return UV; }
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
|
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
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
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
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
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).
|
|
« Ú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
Mensajes: 8
|
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. #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
Mensajes: 3.412
ASMático
|
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){ } if (i3 == 2){ } if (i3 == 3){ printf("UV[%i] = %lf \n", i2 , UV [i2 ]); } } } return UV; }
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: 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; printf("UV[%i] = %lf \n", i2 , UV [i2 ]); } return UV; }
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
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
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
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
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!
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema con funcion retorna recordset
Programación Visual Basic
|
alone-in-the-chat
|
1
|
2,153
|
1 Mayo 2006, 03:39 am
por alone-in-the-chat
|
|
|
Función que retorna dos tipos distintos de datos.
Programación C/C++
|
samur88
|
9
|
7,695
|
18 Mayo 2011, 20:52 pm
por samur88
|
|
|
Función que retorna el valor de retorno de otra función
Programación C/C++
|
naderST
|
7
|
5,088
|
7 Diciembre 2011, 23:45 pm
por naderST
|
|
|
Diferencias entre funcion que retorna y no retorna.
Programación C/C++
|
FKT
|
7
|
4,304
|
21 Agosto 2015, 00:31 am
por FKT
|
|
|
[C] Problema: funcion 'validar_numero()' siempre me retorna 1
Programación C/C++
|
krowa
|
1
|
1,836
|
17 Septiembre 2015, 00:36 am
por engel lex
|
|