Duda con ficheros y structs en C

Iniciado por chica_23, 18 Marzo 2011, 22:47 PM

0 Miembros y 1 Visitante están viendo este tema.

chica_23

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.

Akai

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

chica_23

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???

chica_23

una ultima pregunta, siempre que declaro como puntero a matriz tengo que hacer un malloc entonces??

Akai

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.


chica_23

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

Akai

#6
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:
Código (cpp) [Seleccionar]
funcion1(float **matriz)
//uso:
funcion1(matriz);


Código (cpp) [Seleccionar]
funcion2(float *vector)
//uso:
funcion2(matriz[algo]);
funcion2(vector);


Código (cpp) [Seleccionar]
funcion3(float elemento)
//uso:
funcion3(matriz[algo][otra_cosa]);
funcion3(vector[elemento_a_buscar]);

chica_23

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.



Akai

#8
Tu problema es el siguiente:

Código (cpp) [Seleccionar]
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í.

chica_23

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!