Duda con C++ [Solucionado]
Tengo una duda que me parecen interesantes:
Supongamos que quiero hacer una funcion que reciba como argumento un arreglo de dos dimensiones arbitrarias.
Si declaro mi funcion asi :
void myfunction(float **matrix); entonces le puedo pasar cualquier matriz de dos dimensiones
siempre y cuando esta haya sido creada dinamicamente.
El problema es cuando quiero pasarle una estatica ej :
float A[10][10];en ese caso el compilador me da un error. Yo se que esto se debe a que la funcion necesita saber el numero maximo de columnas para poder referenciar correctamente los numeros dentro de la matriz, la definicion correcta seria:
void myfunction(float matrix[][10]);
Pero como 10 es una constante entonces debo cambiar la definicion de la funccion cada vez que quiera pasarle un matriz de un tamagno diferente?????. Claro que puedo definir una constante a la que le cambio el valor, pero eso es casi lo mismo, tambien implica recompilar el codigo.
En fortran 77 podia pasar las dimensiones de la matriz como argumentos de la funcion, pero creo que eso aqui no funciona.
Entonces como hago para hacer mi funcion generica ...
saludos
Roberto
- Inicie sesión o regístrese para enviar comentarios
- 633 lecturas


creo que, no recuerdo bien, podrias hacer esto:
void myfunction(float matrix[][], int numMaxColumnas)...y pasar el numero maximo de columnas tambien como parametro y en caso de ser necesario el numero de filas.
No, asi no funciona. Eso ya lo he intentado
Gracias
¿Puedes pegar el código?
Porque hasta donde recuerdo (vagamente y estoy haciendo memoria) lo que te han comentado debe funcionar creando y pasando el arreglo con un número máximo de renglones y columnas y después delimitas cuantos vas a usar de cada uno.
Aunque hasta ahora parece más c ya que en c++ lo más correcto sería crear un objeto Matriz.
Probablemente el error que te de sea debido a que a[][] y **a NO son lo mismo.
a[][] para el compilador es un montón de int seguidos, mientras que **a son ints accesibles mediante indirección.
Saludos.
PD: en c++ más te valdría hacerte una clase matriz que pegarte con esto.
"Quick and dirty":
#include <iostream>#include "stdlib.h"
using namespace std;
void f(float **p, int r, int c)
{
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cout<<p[i][j];
}
cout<<endl;
}
}
int main(int argc, char ** argv)
{
int N = atoi(argv[1]);
float matriz[N][N];
float * p[N];
// Matriz triangular inferior
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
if(j>i)
matriz[i][j] = 0.0;
else
matriz[i][j] = 1.0;
for(int k=0;k<N;k++)
p[k] = matriz[k];
f(p,N,N);
return 0;
}
Resultados:
$ ./prueba 3100
110
111
$ ./prueba 6
100000
110000
111000
111100
111110
111111
m__x_ esa via si funciona, pero no te parece un poco trabajosa, es decir yo esperaba que existe una forma mas sencilla de hacerlo, como por ejemplo la propuesta por asusto68, pero esa no funciona.
Viorel : aqui te muestro el codigo siguiendo la segerencia de asusto68, si puedes intenta compilarlo y dime que tal:
#include <iostream>using namespace std;
void function(int p[][], int row );
int main()
{
int a[10][10];
function(a, 10);
return 0;
}
void function(int p[][], int row )
{
int i, j;
for (i = 0; i < row; i++)
{
for (j=0; j<row; j++)
cout<<p[i][j]<<' ';
cout<<'\n';
}
}
En cuanto a lo de usar un objeto matriz, yo lo he echo. Pero C++ tambien admite programacion no orientada a objeto.
Pero como 10 es una constante entonces debo cambiar la definicion de la funccion cada vez que quiera pasarle un matriz de un tamagno diferente?????.Si la matriz es estática:
#define N 10Y usas N en tu código. No puedes tener como argumento en una función matriz[][] debido a cómo se calcula el acceso a un elemento (fila i*COLS + columna j) para eso tienes que hacer uso de la memoria dinámica. En C++ new y delete.
Ok, muchas gracias. Parece ser que simplemente no se puede hacer al estilo de fortran como habia dicho antes.
Saludos
Roberto
Cerrare el hilo
Sin hacer "apaños" no se puede, tienes que indicar el tamaño de todos los subarrays menos el primero, lo mejor como te han dicho es usar una clase matriz (que levamos a hacer, la librería estandar de c++ es así de escasa y no trae una...), por si te vale la tuve que hacer para la uni ;)
#ifndef MatrizH#define MatrizH
#include "Errores.h"
template <class T>
class Matriz
{
private:
int nCols;
int nFils;
T** matriz;
public:
// Constructora y destructora
Matriz (int nFils,int nCols);
Matriz (const Matriz &mat);
~Matriz();
// Obtener/Definir datos
int getSize() const { return this->nCols * this->nFils; }
int getNumCols() const { return this->nCols; }
int getNumFils() const { return this->nFils; }
void fill(T valor);
T getElement(int f,int c) const;
void setElement(int f,int c, T e);
};
//------------------------------------------------------------------------------
template <class T>
T Matriz<T>::getElement(int f,int c) const
{
if(f>=0 && f<=nFils-1 && c>=0 && c<=nCols-1)
return matriz[f][c];
else
throw EMatriz("");
}
template <class T>
void Matriz<T>::setElement(int f,int c, T e)
{
if(f>=0 && f<=nFils-1 && c>=0 && c<=nCols-1)
matriz [f][c] = e;
else
throw EMatriz("");
}
template <class T>
void Matriz<T>::fill(T valor)
{
for ( int f=0; f<nFils; f++)
for ( int c=0; c<nCols; c++)
matriz[f][c]=valor;
}
template <class T>
Matriz<T>::Matriz(int nFils,int nCols)
{
this->nFils = nFils;
this->nCols = nCols;
this->matriz = new T*[nFils];
for(int i=0;i<nFils;i++)
this->matriz[i] = new T [nCols];
}
template <class T>
Matriz<T>::Matriz(const Matriz &mat)
{
this->nFils = mat.getNumFils();
this->nCols = mat.getNumCols();
this->matriz = new T*[nFils];
for(int i=0;i<nFils;i++)
{
this->matriz[i] = new T [nCols];
for (int j=0; j<nCols;j++)
this->matriz[i][j] = mat.getElement(i, j);
}
}
template<class T>
Matriz<T>::~Matriz()
{
for( int i=0;i<this->nFils;i++)
delete[] this->matriz[i];
delete[] matriz;
}
#endif
Hola gracias ......