Cita de: dato000 en 7 Diciembre 2013, 18:10 PMEl enunciado del ejercicio es este:Supongo algo salio mal en tu mensaje ya que no esta el enunciado del programa.
Cita de: dato000 en 7 Diciembre 2013, 18:10 PMEsta 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.Código (c) [Seleccionar]printf("%1f ", mt[f][c]);
El primer error en tu segundo programa (C++) se encuentra en la sentencia:
Código (cpp) [Seleccionar]
*(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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
while (mt_puntero < mt + N) ...
El programa con (algunos de) los cambios:
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
#define N 4
#define M 5
int main()
{
int f, c;
double mt[N][M];
double (*p_array)[M];
double *p_double;
for (p_array = mt; p_array < mt + N; p_array++)
for (p_double = *p_array; p_double < *p_array + M; p_double++)
*(p_double) = 2.00;
p_array = mt;
for (f = 0; f < N; f++){
for (c = 0; c < M; c++){
cout << *(*(p_array + f) + c) << "--> ";
cout << &p_array[f][c] << endl;
}
cout << endl;
}
// ...
return 0;
}
Un saludo