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.
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
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???
una ultima pregunta, siempre que declaro como puntero a matriz tengo que hacer un malloc entonces??
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.
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
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]);
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.
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í.
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!