Autor
|
Tema: ¿Cómo dimensionar un doble apuntador? (Leído 5,512 veces)
|
ERIK546
|
Hola a todos los expertos en programación en C, esta vez me han surgido dudas al hacer un programa que multiplique dos matrices de tamaños "m x n" y "n x p". Sin embargo no subiré tanto código esta vez para explicarles mi duda, ya que la considero un error de concepto acerca de los dobles apuntadores. Lo que se pretende es dimensionar un doble apuntador, ya que yo considero un doble apuntador como un arreglo de dos dimensiones, sin embargo estas se pueden dimensionar con la función "malloc". Viéndolo de esta forma la primera matriz sería "a[m][n]", la segunda matriz "b[n][p]" y la matriz resultante "c[m][p]". Sin embargo el doble apuntador; "a", "b" y "c", deben dimensionarse según los diferentes valores de "m", "n" y "p". Agradecería que me explicaran la forma de hacerlo, les dejo la forma en que lo dimensioné el doble apuntador "a" pero solo lo hice para el valor de "m" y para el valor correspondiente a "n" en ese doble apuntador no sabría como hacerlo. De forma que me quede un doble apuntador "a[m][n]". Gracias de antemano. #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int **a; a =(int**)malloc(sizeof(int*)*m ); return 0; }
|
|
|
En línea
|
|
|
|
Anvil
Desconectado
Mensajes: 38
|
// ejemplo de http://www.eskimo.com/~scs/cclass/int/sx9b.html #include <iostream> int main(int argc, const char * argv[]) { // numero de filas const int nrows = 5; // numero de columnas const int ncolumns = 3; // declaración del arreglo int **array; array = (int **)malloc(nrows * sizeof(int *)); // si no se pudo reservar memoria if(array == NULL) { // mandar mensaje de error fprintf(stderr, "out of memory\n"); return 0; } // recorremos las filas for(int i = 0; i < nrows; i++) { // reservamos memoria en cada fila array[i] = (int * )malloc(ncolumns * sizeof(int)); if(array[i] == NULL) { fprintf(stderr, "out of memory\n"); return 0; } } // se llena el arreglo for(int i = 0; i < nrows; i++) { for(int j = 0; j < ncolumns; j++) { array[i][j] = i + j; } } free(array); return 0; }
|
|
|
En línea
|
\\::_--__!!ss"1122
|
|
|
david_BS
|
El ejemplo que te mostraron está muy bien. Pero para que entiendas el concepto de doble puntero te muestro este código de ejemplo que había publicado hace un tiempo aquí: http://foro.elhacker.net/programacion_cc/manipulacion_de_punteros_ejemplo_con_float-t358223.0.htmlfloat vec1[5]={ 0.5f, 0.2f, 0.22f, 0.01f, 0.0f }; float vec2[5]={ 0.5f, 0.2f, 0.22f, 0.01f, 0.0f }; float vec3[5]={ 0.5f, 0.2f, 0.22f, 0.01f, 0.0f }; float* pf1[3]; //vector de punteros a vectores de float pf1[0]=&vec1[0]; pf1[1]=&vec2[0]; pf1[2]=&vec3[0]; float** ppf1; ppf1 = (float**)&pf1;//se le asigna la direccion de un vector de punteros a vectores de float
osea, el concepto de que un doble puntero es un puntero el cual apunta a otro puntero. y dicho puntero debe apuntar a una región de memoria asignada en el programa. si usás asignación dinámica, entonces si tenés que hacer como en el ejemplo que te mostraron.
|
|
|
En línea
|
|
|
|
ERIK546
|
Muchas gracias a todos por sus respuestas, gracias a ellas he podido completar mi programa que multiplica matrices de cualquier tamaño (siempre y cuando sea posible). Pero mi programa presenta un error en la ejecución ya que aunque devuelve el resultado esperado, al finalizar el programa marca un error ".exe" que lo hace finalizar casi de inmediato. Agradecería que me ayudaran a identificar el problema ya que yo no he podido. Les dejo el código:#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int **a; int **b; int **c; int m,u,n,p,i,j,k,t; printf("Programa que multiplica dos matrices m * u y n * p y regresa la traza de la matriz resultante\n"); a =(int**)malloc(sizeof(int*)*m ); b =(int**)malloc(sizeof(int*)*n ); c =(int**)malloc(sizeof(int*)*m ); if(u==n){ for(i=1;i<=m;i++){ a [i ]=(int*)malloc(sizeof(int)*u ); } for(i=1;i<=n;i++){ b [i ]=(int*)malloc(sizeof(int)*p ); } for(i=1;i<=m;i++){ c [i ]=(int*)malloc(sizeof(int)*p ); } for(i=1;i<=m;i++){ for(j=1;j<=u;j++){ printf("Introduce los valores %d-%d de la primera matriz\n",i ,j ); } } for(i=1;i<=n;i++){ for(j=1;j<=p;j++){ printf("Introduce los valores %d-%d de la segunda matriz\n",i ,j ); } } for(i=1;i<=m;i++){ for(j=1;j<=p;j++){ c[i][j]=0; for(k=1;k<=n;k++){ c[i][j]+=a[i][k]*b[k][j]; } } } printf("La matriz resultante es:\n"); for(i=1;i<=m;i++){ for(j=1;j<=p;j++){ } } } return 0; }
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
Hola! una pregunta, empezas los indices de las matrices en 1 por que te parece mas comodo??? o porque no sabes que empieza en cero?? El problema es que estas accediendo fuera de la memoria asignada por malloc. Supongamos que creas un arreglo dinamico de 5 elementos, y si vos haces i=1 y en la condicion del for pones i<=5; cuando ingresas datos se almacenan en las posiciones 1 2 3 4 5 del arreglo, PERO los arreglos empiezan desde el cero, posiciones: 0 1 2 3 4 (cinco posiciones), por lo tanto arr[5] no pertenece al arreglo.... y a esto se debe el error del programa(aplicado a las matrices) Soluciones: si usas i=1, vas a teneer q reservar un elemento mas; ó usas i=0 y en la condicion i<n (lo cual es mas optima ya que no desperdicias un elemento) Para liberar la memoria reservada, se hace el proceso inverso a como lo reservaste, ej: for(i=0; i<m; i++)
y asi para las demas matrices.... Saludos
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
ERIK546
|
Hola! una pregunta, empezas los indices de las matrices en 1 por que te parece mas comodo??? o porque no sabes que empieza en cero?? El problema es que estas accediendo fuera de la memoria asignada por malloc. Supongamos que creas un arreglo dinamico de 5 elementos, y si vos haces i=1 y en la condicion del for pones i<=5; cuando ingresas datos se almacenan en las posiciones 1 2 3 4 5 del arreglo, PERO los arreglos empiezan desde el cero, posiciones: 0 1 2 3 4 (cinco posiciones), por lo tanto arr[5] no pertenece al arreglo.... y a esto se debe el error del programa(aplicado a las matrices) Soluciones: si usas i=1, vas a teneer q reservar un elemento mas; ó usas i=0 y en la condicion i<n (lo cual es mas optima ya que no desperdicias un elemento) Para liberar la memoria reservada, se hace el proceso inverso a como lo reservaste, ej: for(i=0; i<m; i++)
y asi para las demas matrices.... Saludos Muchísimas gracias durasno; efectivamente utilice los ciclos desde "i=1" debido a que me pareció más cómodo utilizarlos de esa forma para referirme a los espacio 1-1, etc. Y el problema residía en la dimensión de las filas, así como en la liberación de la memoria. Lo he corregido y le he agregado un ciclo que regresa la traza de la matriz resultante. Gracias a todos por su oportuna ayuda. Les dejo el código correspondiente:#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int **a; int **b; int **c; int m,u,n,p,i,j,k,t; printf("Programa que multiplica dos matrices m * u y n * p y regresa la traza de la matriz resultante\n"); a =(int**)malloc(sizeof(int*)*m ); b =(int**)malloc(sizeof(int*)*n ); c =(int**)malloc(sizeof(int*)*m ); if(u==n){ for(i=0;i<m;i++){ a [i ]=(int*)malloc(sizeof(int)*u ); } for(i=0;i<n;i++){ b [i ]=(int*)malloc(sizeof(int)*p ); } for(i=0;i<m;i++){ c [i ]=(int*)malloc(sizeof(int)*p ); } for(i=0;i<m;i++){ for(j=0;j<u;j++){ printf("Introduce los valores %d-%d de la primera matriz\n",i +1,j +1); } } for(i=0;i<n;i++){ for(j=0;j<p;j++){ printf("Introduce los valores %d-%d de la segunda matriz\n",i +1,j +1); } } for(i=0;i<m;i++){ for(j=0;j<p;j++){ c[i][j]=0; for(k=0;k<n;k++){ c[i][j]+=a[i][k]*b[k][j]; } } } printf("La matriz resultante es:\n"); for(i=0;i<m;i++){ for(j=0;j<p;j++){ } } } if(m==p){ t=0; for(i=0;i<m;i++){ for(j=0;j<p;j++){ if(i==j){ t+=c[i][j]; } } } printf("\nLa traza es: %d\n",t ); } for(i=0;i<m;i++){ } for(i=0;i<n;i++){ } for(i=0;i<m;i++){ } return 0; }
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
grabar IMG en doble capa (como?)
Software
|
Reznor
|
7
|
6,901
|
20 Agosto 2007, 05:10 am
por Reznor
|
|
|
como quemar dvd de doble capa
Software
|
aspire t180
|
1
|
6,246
|
12 Noviembre 2010, 16:07 pm
por lesone-
|
|
|
Como aprovechar un doble núcleo?
Programación C/C++
|
Og.
|
2
|
4,808
|
11 Mayo 2010, 08:13 am
por Littlehorse
|
|
|
Apuntador a arreglo bidimensional en c
Programación C/C++
|
UltimateDragoon
|
2
|
5,142
|
3 Octubre 2011, 23:05 pm
por UltimateDragoon
|
|
|
como re-dimensionar un input
Desarrollo Web
|
Drewermerc
|
4
|
4,435
|
26 Septiembre 2014, 06:55 am
por Drewermerc
|
|