elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ayuda con problema de matrices y punteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda con problema de matrices y punteros  (Leído 3,049 veces)
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
ayuda con problema de matrices y punteros
« en: 7 Diciembre 2013, 18:10 pm »

Que tal gente como estan, estoy retomando el tema de punteros, y estoy en problemas, no he podido hacer el siguiente ejercicio, por favor, echenme una mano, porque no he entendido porque me da errores de segmentation fault, y pues no me imprime la matriz por medio de aritmetica de punteros.

El enunciado del ejercicio es este:

------------------------------------------------------------------------------------------------------------------


En el siguiente código se accede a los elementos de una matriz. Acceder a los mismos elementos con aritmética de apuntadores.

Código
  1. #define N 4
  2. #define M 5
  3. int f, c;
  4. double mt [N][M]
  5. ...
  6. for(f=0; f<N; f++)
  7. {
  8.     for(c=0; c<M; c++)
  9.              printf("%1f ", mt[f][c]);
  10.     printf("\n");
  11. }
  12.  

------------------------------------------------------------------------------------------------------------------

Se que esta en C, pero quise hacer el C++ porque estoy avanzando en todo el tema y quiero pasar rapidamente de punteros, luego memoria dinamica, luego archivos, luego clases y luego hacer cosas en serio.


Código
  1. #include <iostream>
  2.  
  3. #define N 4
  4. #define M 5
  5.  
  6.  
  7.  
  8. using namespace std;
  9.  
  10. int main()
  11. {
  12.    int f, c;
  13.    double mt[N][M];
  14.  
  15.    double **mt_puntero;
  16.  
  17.    *(mt_puntero) = &mt[0][0];
  18.    while(*mt_puntero)
  19.    {
  20.        *(*(mt_puntero)) = 2.00;
  21.        mt_puntero++;
  22.    }
  23.  
  24.  
  25.    for(f=0; f<N; f++)
  26.    {
  27.        for(c=0; c<M; c++, mt_puntero++)
  28.        {
  29.            //cout << mt[f][c] << " ";
  30.            // Aritmetica de punteros
  31.            cout << *(*(mt_puntero + f) + c) << "--> ";
  32.            cout << &mt_puntero[f][c] << endl;
  33.        }
  34.        cout << endl;
  35.    }
  36.  
  37.    while(*mt_puntero)
  38.    {
  39.        cout << *(*(mt_puntero ) );
  40.        mt_puntero++;
  41.    }
  42.  
  43.    return 0;
  44. }
  45.  

Se que hay varias cosas mal, pero esto es debido a que probe de muchas formas y no he podido dar con el tema, ya he leido varios documentos y no he podido atinarle, agradeceria más allá de que me resuelvan el ejercicio, el que puedan explicarme como es el correcto uso de la aritmetica de punteros enfocado a matrices/arrays multidimensionales

slds


« Última modificación: 7 Diciembre 2013, 19:06 pm por dato000 » En línea


rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ayuda con problema de matrices y punteros
« Respuesta #1 en: 7 Diciembre 2013, 19:01 pm »

El enunciado del ejercicio es este:
Supongo algo salio mal en tu mensaje ya que no esta el enunciado del programa.

Código
  1. printf("%1f ", mt[f][c]);
Esta mal. "%lf" se utiliza con scanf para leer un valor de tipo double, en el caso de printf "%f" es para el tipo double y "%Lf" para el tipo long double.

El primer error en tu segundo programa (C++) se encuentra en la sentencia:
Código
  1. *(mt_puntero) = &mt[0][0];
La variable "mt_puntero" es un puntero y antes de cualquier uso (por ejemplo indirección) debes almacenar en el una dirección valida.

Otro detalle algo feo: cuando se nombra un array en la mayoría de las ocasiones resulta en la dirección en memoria de su primer elemento, por ejemplo un array de enteros genera un puntero a entero y un array de arrays (tu caso) genera un puntero a array. Por ello el tipo del puntero debe ser "double (*)[M]"

Otro error es utilizar dos bucles como este:
Código
  1. while (*mt_puntero) ...
Ello funciona con cadenas "a la C" porque estas tienen un valor que indica el final de estas (el '\0') pero en tu caso tal delimitador no existe. En su lugar debes utilizar aritmética de punteros, por ejemplo:
Código
  1. while (mt_puntero < mt + N) ...

El programa con (algunos de) los cambios:
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. #define N 4
  5. #define M 5
  6.  
  7. int main()
  8. {
  9.   int f, c;
  10.   double mt[N][M];
  11.  
  12.   double (*p_array)[M];
  13.   double *p_double;
  14.  
  15.   for (p_array = mt; p_array < mt + N; p_array++)
  16.      for (p_double = *p_array; p_double < *p_array + M; p_double++)
  17.         *(p_double) = 2.00;
  18.  
  19.   p_array = mt;
  20.   for (f = 0; f < N; f++){
  21.      for (c = 0; c < M; c++){
  22.         cout << *(*(p_array + f) + c) << "--> ";
  23.         cout << &p_array[f][c] << endl;
  24.      }
  25.      cout << endl;
  26.   }
  27.  
  28.   // ...
  29.  
  30.   return 0;
  31. }

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: ayuda con problema de matrices y punteros
« Respuesta #2 en: 7 Diciembre 2013, 19:20 pm »

Vaya, bueno ya deje arreglado el enunciado, la parte C era el del ejercicio que queria convertir en C++, efectivamente solo encontre ejemplos con "Cadenas a la C", no cai en cuenta de lo del delimitador "\0" tienes toda la razón.

Funciona perfectamente pero tengo unas dudas, ayudame a aclararlas maese:

Código
  1. double (*p_array)[M];
  2. double *p_double;
  3.  

Que significa particularmente el (*p_array)[M], hay que indireccionar por separado las columnas y las filas???


Código
  1. for (p_array = mt; p_array < mt + N; p_array++)
  2. {
  3.        for (p_double = *p_array; p_double < *p_array + M; p_double++)
  4.        {
  5.            *(p_double) = 2.00;
  6.        }
  7. }
  8.  
  9. p_array = mt;
  10.  

Entiendo entiendo entiendo, dime entonces, o confirmame, siempre es necesario indicar al puntero que retorne a la posición inicial de la matriz, eso es lo que provoca el error de "segmentation fault", es así cierto??

Que significaria entonces si se hace esto:

Código
  1. **(p_double) = 2.00;
  2. *(*(p_double) = 2.00;
  3.  

En línea


rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ayuda con problema de matrices y punteros
« Respuesta #3 en: 10 Diciembre 2013, 19:09 pm »

Código
  1. double (*p_array)[M];
  2. double *p_double;

Que significa particularmente el (*p_array)[M], hay que indireccionar por separado las columnas y las filas?
Por partes.

Tienes un array de arrays de doubles (el array mt) y la intención es practicar con los punteros y la aritmética con estos. Para procesar un array de tipo "T [N]" se debe utilizar un puntero de tipo "T *". En este caso:
1) El array es mt y el tipo de sus elementos es "double [M]"
2) El puntero para procesar cada elemento debe ser de tipo "double (*)[M]", se utilizan paréntesis porque de no hacerlo (utilizando "double *[M]") la declaración se tomaría como la de un array de M elementos de tipo "double *", en otras palabras no seria un puntero a array sino un array de punteros (no es lo mismo y no es igual).

Con el puntero "p_array" procesamos cada uno de los elementos del array mt (mt[ 0 ], mt[ 1 ], etc.), como este es un array de arrays cada elemento también es un array y ahí utilizamos el puntero "p_double" para procesar los elementos:
Código
  1. // Por cada elemento del array mt (mt[0], mt[1], ...)
  2. for (p_array = mt; p_array < mt + N; p_array++){
  3.   // Por cada elemento del array mt[i] (mt[i][0], mt[i][1], ...)
  4.   for (p_double = *p_array; p_double < *p_array + M; p_double++){
  5.      *(p_double) = 2.00;
  6.   }
  7. }

Que significaria entonces si se hace esto:

Código
  1. **(p_double) = 2.00;
  2. *(*(p_double) = 2.00;
No es valido ya que el tipo de "p_double" es "double *", al aplicar el operador de indirección con "*(p_double)" (los paréntesis no son necesarios en este caso) ya no tratas con el puntero sino con el objeto apuntado y no puedes hacer, siguiendo el ejemplo, "*(2.00)".

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: ayuda con problema de matrices y punteros
« Respuesta #4 en: 10 Diciembre 2013, 21:02 pm »

wow, un poco complicado pero entiendo la mayoria de cosas que decias, muchas gracias, muy bueno en serio, tendre que practicar más (y lo estoy haciendo) todo este cuento.
En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Uso de matrices o vectores de punteros
Programación C/C++
novalida 1 12,399 Último mensaje 16 Marzo 2011, 01:19 am
por Don Pollo
punteros dobles y matrices en DELPHI
Programación C/C++
Flack 4 3,152 Último mensaje 4 Febrero 2014, 16:25 pm
por x64core
Matrices con punteros
Programación C/C++
sherry_XD 3 2,642 Último mensaje 21 Abril 2014, 09:14 am
por eferion
¿Matrices de punteros a funciones en C?
Programación C/C++
blackshack_zero 3 2,527 Último mensaje 29 Agosto 2015, 23:34 pm
por ivancea96
Matrices con punteros
Programación C/C++
Skali 2 1,949 Último mensaje 15 Mayo 2018, 20:34 pm
por Skali
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines