| 
	
		|  Autor | Tema: Duda con ficheros y structs en C  (Leído 6,426 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,655 |  14 Julio 2007, 04:26 am por MANULOMM
 |  
						|   |   | Duda con structs C/C++
							« 1 2 » Programación C/C++
 | SARGE553413 | 13 | 9,259 |  21 Junio 2013, 18:50 pm por pacoperico
 |  
						|   |   | Problema structs Programación C/C++
 | Ccomplica | 1 | 2,375 |  30 Octubre 2013, 05:53 am por edr89
 |  
						|   |   | Array de structs duda con los nombres C# .NET (C#, VB.NET, ASP)
 | RevolucionVegana | 2 | 3,716 |  3 Junio 2017, 05:31 am por Eleкtro
 |  
						|   |   | Duda sobre structs!!! Programación C/C++
 | pablombf | 1 | 2,375 |  10 Enero 2018, 03:23 am por Serapis
 |    |