Autor
|
Tema: Duda con ficheros y structs en C (Leído 5,817 veces)
|
chica_23
Desconectado
Mensajes: 48
|
Hola no se si alguien ha colgado algo similar , en todo caso si alguien puede ayudarme lo agradeceria muchisimo .Se que el código que voy a poner es un poco tonto pero me gustaria que saber fallo basico estoy teniendo.Me he dado cuenta de que he puesto este msmo tema en un foro de programacion general, y acabo de descubrir que existe este , siento saturaros...
#include <ctype.h> #include <math.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h>
/****************************************************************************************************************************************************************** *******************************************************************************************************************************************************************/
main ( int argc,char *argv[])
{ typedef struct matric { int filas; int columnas; }matriz; matriz *m; int f,c; int numero;
FILE* f1; char* nombre_fich; nombre_fich=argv[1]; f1=fopen(nombre_fich,"r");//abrimos fichero en modo lectura
fscanf(f1,"%d",&f); printf("numero de filas%d",f);
//m->filas=numero;//************
fscanf(f1,"%d",&c); //m->columnas=c;//*********** char buffer[4]; fscanf(f1,"%s",buffer); printf("%s\n",buffer);
fclose(f1);
}
Si descomento las lineas con asteriscos me salen fallos de segmentacion!!Y no se porque.. El fichero que leo es:
3 3 1e-3 0.8 0.1 0.1 0.1 0.8 0.1 0.1 0.1 0.8
se llama fichero .txt
Muchas gracias.
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
Porque tu m es un puntero a struct matriz, no un struct matriz.
O bien ese puntero necesitas que apunte a una estructura de tipo matriz (memoria dinámica), o bien, haz que deje de ser un puntero, y que sea una estructura
|
|
|
En línea
|
|
|
|
chica_23
Desconectado
Mensajes: 48
|
Muchisimas gracias!!!
hice que
matriz m;
en lugar de un puntero
y la asignacion m.filas=numero; y funciona Estaba confundida pensando que si hacia como antes es decir declarar m como puntero a matriz , los datos se introducirian utilizando m->filas simplemente.
Estoy en lo cierto, quiero decir , ese era mi error???
|
|
|
En línea
|
|
|
|
chica_23
Desconectado
Mensajes: 48
|
una ultima pregunta, siempre que declaro como puntero a matriz tengo que hacer un malloc entonces??
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
Si, o al menos asignarle la dirección de otro elemento de tipo matriz. matriz* puntero; puntero =(matriz *)malloc(sizeof(matriz ));
matriz no_puntero; matriz* puntero; puntero=&no_puntero;
Tu problema antes, era que si el puntero apunta a una dirección indeterminada, o a Null, cualquier acceso, da un segmentation fault.
|
|
|
En línea
|
|
|
|
chica_23
Desconectado
Mensajes: 48
|
Todo este codigo es una consecuencia de otro problema que tenia..Abandoné y pienso que no es una mala pregunta.He estado mirando en libros y tambien en internet.
Si me dan un fichero como el anterior , lo leo e introduzco en n las filas, y en m las columnas. luego creo un array de este tamaño m*n y se lo paso a una funcion. La pregunta es: la funcion puede recibir ..
float * matriz [] [m] como parametro?? en caso de tener una matriz de floats.
A mi me dan fallos de compilacion. La m no puedo ponerla, siempre tengo que poner una constante en la segunda dimension.Una posibilidad que he leido por ahi es utilizar un define.
Muchas gracias de nuevo
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
Tienes un problema ahí, si haces float *matriz[][] le estás diciendo, que va a recibir una matriz de punteros a float, no una matriz de floats. Y a parte, hay otro problema: una matriz con arrays bidimensionales--> matriz[m][n] matriz --> puntero a puntero del tipo que almacenes matriz[] es un vector del tipo que almacenes matriz[][] es el tipo que alamacenas. cada vez que tu haces matriz[m] seleccionas un vector, y cuando haces matriz[m][n] del vector m, seleccionas el elemento n La diferencia con simplemente declarar un vector de n*m elementos, es que tu eso lo tienes, por así decirlo, en un único bloque, mientras que la matriz, primero tienes un bloque con los punteros a los vectores, y luego los distintos vectores apuntados. te pongo un ejemplo: funcion1(float **matriz) //uso: funcion1(matriz);
funcion2(float *vector) //uso: funcion2(matriz[algo]); funcion2(vector);
funcion3(float elemento) //uso: funcion3(matriz[algo][otra_cosa]); funcion3(vector[elemento_a_buscar]);
|
|
« Última modificación: 19 Marzo 2011, 14:52 pm por Akai »
|
En línea
|
|
|
|
chica_23
Desconectado
Mensajes: 48
|
He intentado el primer ejemplo de codigo que me das con un codigo sencillo... Siento ser tan insistente pero quiero saber si lo entiendo.
#include <ctype.h> #include <math.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h>
void op1(int** matriz)
{ printf("hola"); }
main ( int argc,char *argv[]) { int i,j; int m=4; int n=4; int matriz[m][n];
printf("vuelve a CASA VUELVEEE\n");
for (i=0;i<n;i++) { for (j=1;j<m;j++) { matriz[j]=1;
} }op1(matriz);
}
Me dice que le paso mal el argumento matriz.. Quiero saber si lo estoy entendiendo. Cuando me dices que en el caso de las matrices hai dos bloques distintos, esto es: una zona de memoria donde se almacenan los punteros /direcciones de la otra zona de memoria donde se guardan los contenidos de la matriz? Y que por tanto debo indicarle a la funcion con float** matriz que realmente tiene que indexar 2 veces (o como se diga) , buscar primero el puntero y luego ir a coger el contenido?
Muchas gracias.
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
Tu problema es el siguiente: for (i=0;i<n;i++) { for (j=1;j<m;j++) { matriz[j]=1;
De esa forma, estás haciendo que el puntero de matriz, posición j, apunte a la dirección de memoria 1. Para acceder a un elemento de la matriz, es de esta forma matriz[fila][columna]
Así que tu bucle, quedaría como: for (i=0;i<n;i++) { for (j=1;j<m;j++) { matriz[i][j]=1;
Por otro lado, no estoy seguro que esto lo puedas hacer: int m=4; int n=4; int matriz[m][n];
Debido a que el compilador necesita saber qué tamaño debe tener esa matriz, y de esa forma no estoy seguro que lo haga. int matriz[4][4];
de esta forma, si lo haría correctamente en cualquier caso. Ya digo que tengo dudas que lo primero no se haga correctamente, por eso propongo una alternativa. Por otro lado... me extraña que te diga que le pasas mal matriz, en principio no veo que haya error ahí.
|
|
« Última modificación: 19 Marzo 2011, 20:02 pm por Akai »
|
En línea
|
|
|
|
chica_23
Desconectado
Mensajes: 48
|
Lo de poner solo matriz [j] fue un error al copiar el codigo...Pero gracias igualmente. Y si estoy de acuerdo en lo de que seguramente no me deje hacer matriz[m] [n]. Lo he probado de todas las formas humanamente posibles , lo juro XDDD y me da error.
Lo voy a hacer pasandole un struct ya me las apañaré.
Muchisimas gracias de nuevo!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Structs Y Clases
.NET (C#, VB.NET, ASP)
|
anion
|
1
|
2,444
|
14 Julio 2007, 04:26 am
por MANULOMM
|
|
|
Duda con structs C/C++
« 1 2 »
Programación C/C++
|
SARGE553413
|
13
|
8,462
|
21 Junio 2013, 18:50 pm
por pacoperico
|
|
|
Problema structs
Programación C/C++
|
Ccomplica
|
1
|
2,143
|
30 Octubre 2013, 05:53 am
por edr89
|
|
|
Array de structs duda con los nombres C#
.NET (C#, VB.NET, ASP)
|
RevolucionVegana
|
2
|
3,398
|
3 Junio 2017, 05:31 am
por Eleкtro
|
|
|
Duda sobre structs!!!
Programación C/C++
|
pablombf
|
1
|
2,055
|
10 Enero 2018, 03:23 am
por Serapis
|
|