Autor
|
Tema: Problema en C puntero a punteros. (Leído 4,776 veces)
|
Sicherer
Desconectado
Mensajes: 3
|
Buenas, como va? Soy nuevo en el foro y tenia una duda sobre Punteros a punteros en C.
Tengo q hacer una struct matriz
typedef struct { short filas,col; int **matriz; }Matriz;
Ahora, mi duda es la siguiente: ¿Es necesario reservar memoria? Si. ¿Como la reservo? (la idea del programa es que la matriz se dimensione por teclado y se autocomplete con srand()). ¿Las funciones a un puntero puntero, llevan * en el nombre?
Desde ya muchas gracias, y si podrian dar un ejemplo se agradece mucho! saludos y que sigan bien.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Tienes que definir como vas a trabajar. un Puntero de punteros tiene que tener una doble inicializacion, primero para definir cuantos apuntadores vas a tener y posteriormente Cada uno de esos apuntadores recien. Puedes trabajar con un solo apuntador para toda la matriz int *matriz; matriz = calloc(filas *columnas ,sizeof(int));
Ejemplo completo con matriz de punteros y cada puntero a un arreglo de enteros. #include<stdio.h> #include<stdlib.h> #include<time.h> #define MAGIC 354093428 typedef struct { short filas,col; int **matriz; }Matriz; int main() { short filas = 10; // Aqui puedes capturar filas short col = 5; // Aqui puedes capturar filas Matriz m; m.filas = filas; m.col = col; m. matriz = calloc(m. filas,sizeof(int*)); int i = 0,j; while(i < m.filas) { m. matriz[i ] = calloc(m. col,sizeof(int)); j =0; while(j < m.col) { m. matriz[i ][j ] = rand() % 1000; printf("[%3i]",m. matriz[i ][j ]); j++; } i++; } }
|
|
|
En línea
|
|
|
|
Sicherer
Desconectado
Mensajes: 3
|
Muchas gracias alberto! y una ultima pregunta (me marea como manejar los punteros cuando paso por referencia en una funcion) en el caso que yo quiera generar la matriz a travez de una matriz... Matriz crearMatriz() { Matriz *m; m ->matriz = calloc(m. filas,sizeof(int*)); int i = 0,j; while(i < m->filas) { m ->matriz [i ] = calloc(m ->col ,sizeof(int)); j =0; while(j < m->col) { m ->matriz [i ][j ] = rand() % 1000; printf("[%3i]",m ->matriz [i ][j ]); j++; } i++; } return m; }
o tengo que declararle la cantidad de memoria que usa en el main? · Los códigos deben ir en etiquetas GeSHi >aquí las reglas del foro -Engel Lex
|
|
« Última modificación: 14 Septiembre 2017, 00:55 am por engel lex »
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Puede quedar asi: Matriz *crearMatriz(); int main() { Matriz *nueva = crearMatriz(); } Matriz *crearMatriz() { Matriz *m; m ->matriz = calloc(m. filas,sizeof(int*)); int i = 0,j; while(i < m->filas) { m ->matriz [i ] = calloc(m ->col ,sizeof(int)); j =0; while(j < m->col) { m ->matriz [i ][j ] = rand() % 1000; printf("[%3i]",m ->matriz [i ][j ]); j++; } i++; } return m; }
Si la funcion crear Matriz devuelve un apauntador, este debe de tener el *antes del nombre tal como lo puse. Asi mismo la funcion debe de reservar memoria para la Estructura de la matriz que vas a usar. Saludos!
|
|
|
En línea
|
|
|
|
Tucho
Desconectado
Mensajes: 5
|
Buenas, un par de detalles nomás sobre la respuesta de AlbertoBSD. En las lineas 11 y 13, falta el & en los scanf. Por otro lado, no veo por que utilizar calloc en lugar de malloc, es mas lento y de todos modos despues le asignas un valor a cada uno de los elemetos, asi que estaria de más inicializarlos en cero. En la linea 14 es m->filas (dentro del calloc). Es una buena practica además, castear lo que devuelve el malloc, si bien todo deberia funcionar igual, te devuelve un void* y lo estas igualando a un Matriz* por ejemplo en la linea 9. Te evitas que te joda el compilador. Otra practica muy recomendable (si no casi obligatoria) es corroborar que todo sale bien, si falla el primer calloc ya todo el resto te va a tirar segmentation fault por todos lados, un: if(m ==NULL ){fprintf(stderr ,"Error allocando, linea %d\n", __LINE__ ); exit(EXIT_FAILURE );}
te salva las papas (sobretodo en programas mas complejos.) O definir una funcion por ejemplo: void *safe_malloc(int n, size_t size){ void *aux; if(aux==NULL){ fprintf(stderr ,"Error Allocando %d bytes", n *size ); } return aux; }
y despues simplemente en llamas a safe_malloc(cantidad,sizeof(tipo));
Un saludo, Tucho.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Buenas practicas y muy recomendables tus observaciones.
Sobre el codigo yo solo copie el código que puso Sicherer, en mi propuesta no use scanf, de hecho casi no recomiendo usar scanf.
Saludos!
|
|
|
En línea
|
|
|
|
Sicherer
Desconectado
Mensajes: 3
|
matriz *crearMatriz() { matriz *m; int i=0,j; printf("Ingrese el num de filas.\n"); scanf("%d",&m->filas); printf("Ingrese el num de filas.\n"); scanf("%d",&m->col); m->matrix = (int**)malloc(sizeOf(int*)); while(i<m->filas) { m->matrix[i] = (int*)malloc(sizeof(int)); j = 0; while(j < m->col) { m->matrix[i][j] = (int*)malloc(sizeof(int)); j++; } i++; } }
intenté hacerlo con malloc, pero claramente no me salio, esto fue a lo que mas me acerqué..
|
|
« Última modificación: 29 Septiembre 2017, 00:25 am por Sicherer »
|
En línea
|
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
F1 - Problema con puntero a Función C#
.NET (C#, VB.NET, ASP)
|
Maurice_Lupin
|
0
|
2,173
|
17 Mayo 2012, 16:14 pm
por Maurice_Lupin
|
|
|
Problema Incrementar puntero
Programación C/C++
|
x64core
|
5
|
3,317
|
16 Junio 2012, 20:32 pm
por david_BS
|
|
|
Problema de puntero
Programación C/C++
|
erest0r
|
9
|
3,789
|
7 Noviembre 2013, 17:52 pm
por erest0r
|
|
|
Punteros dobles / Punteros a puntero.
Programación C/C++
|
NOB2014
|
5
|
8,385
|
13 Abril 2016, 16:00 pm
por MAFUS
|
|
|
Pasar a función un arreglo con punteros o con el nombre del arreglo como puntero
Programación C/C++
|
NOB2014
|
3
|
3,414
|
9 Junio 2016, 17:10 pm
por geeke
|
|