Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Error en declaración de funcion

Estas en el tema de Error en declaración de funcion en el foro de C/C++ en Foros del Web. Hola a todos. Estoy desarrollando un proyecto en C++. Mas especificamente lo estoy desarrollando con KDevelop 3.3.2 compilando con gcc 4.0 y g++ 4.0 El ...
  #1 (permalink)  
Antiguo 03/01/2007, 19:53
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Error en declaración de funcion

Hola a todos.
Estoy desarrollando un proyecto en C++. Mas especificamente lo estoy desarrollando con KDevelop 3.3.2 compilando con gcc 4.0 y g++ 4.0

El problema es que cuando declaro la cabecera de un metodo, por ejemplo:
Código:
void copiar(double a[][], double b[][], int n);
el compilador me da el siguiente error:

error: la declaración de ‘a’ como una matriz multidimensional debe tener límites para todas las dimensiones excepto la primera

y el mismo error pero con el parametro b.
No se si es un error mio pretender declarar parametros multidimensionales sin especificar la dimensión o si hay algo que puedo estar haciendo mal.
¿Se les ocurre cual puede ser el problema?

Gracias por la ayuda.
  #2 (permalink)  
Antiguo 03/01/2007, 21:29
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Re: Error en declaración de funcion

Bueno, investigando un poco a fondo, me encuentro conque en C++ no se pueden declarar parametros de funciones o metodos, si al menos especificar el tamaño de todas las dimensiones excepto la primera: es decir
void copiar(double a[][9], double b[][9][4], int n);

Lo que me lleva a otra consulta:
como se puede hacer para manejar arrays multidimensionles sin conocer previamente el tamaño del mismo, es decir, quier hacer algo coo esto:

void copiar(double a[][], double b[][], int n);donde n denota el tamaño de los arrays 'a' y 'b'.
  #3 (permalink)  
Antiguo 03/01/2007, 23:14
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Error en declaración de funcion

Que milagro TotalWare!.
Tu problema es sencillo.
Usa punteros dobles.

void copiar(double **a, double **b, int n)

Eso debe funcionar a la perfeccion.
Solo recuerda los cuidados que hay que tener al trabajr con punteros...aparte de que estos son dobles.

Alguna otra duda aqui nos preguntas.

SAludos
  #4 (permalink)  
Antiguo 04/01/2007, 01:52
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Re: Error en declaración de funcion

Cita:
Iniciado por TolaWare Ver Mensaje
Lo que me lleva a otra consulta:
como se puede hacer para manejar arrays multidimensionles sin conocer previamente el tamaño del mismo, es decir, quier hacer algo coo esto:

void copiar(double a[][], double b[][], int n);donde n denota el tamaño de los arrays 'a' y 'b'.
si estas trabajando con arreglos estaticos, siempre puedes saber su tamaño..... no?
  #5 (permalink)  
Antiguo 04/01/2007, 02:52
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Re: Error en declaración de funcion

Al pasar un array como parametro a una funcion en realidad se para unicamente la direccion de su primer indice en un puntero, por tanto al aplicar el operador sizeof tan solo te dara el tamaño del puntero y no del array.

en estos casos tienes que pasar su tamaño como un parametro mas a tu funcion, de hecho 2 mas, filas y columnas.

aun que una funcion te permita declarar un parametro como si fuese un array, en realidad se manejara como un puntero y su tamaño solo limitara tu funcion.
  #6 (permalink)  
Antiguo 04/01/2007, 06:32
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Re: Error en declaración de funcion

Cita:
Iniciado por blackwind Ver Mensaje
si estas trabajando con arreglos estaticos, siempre puedes saber su tamaño..... no?
Estas en lo cierto, pero lamentablemente, los arrays no tiene una cantidad de elmentos fija. De hecho, la semantica de la funcion que especifique, es copiar una matriz cuadrada en otra, de tamaño n*n.
  #7 (permalink)  
Antiguo 04/01/2007, 08:30
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Error en declaración de funcion

Cita:
Iniciado por TolaWare Ver Mensaje
Estas en lo cierto, pero lamentablemente, los arrays no tiene una cantidad de elmentos fija. De hecho, la semantica de la funcion que especifique, es copiar una matriz cuadrada en otra, de tamaño n*n.
Los arrays SIEMPRE tienen una cantidad de elementos fija.

En cualquier caso, como te dijo Instru, las funciones se suelen hacer pasando punteros **, y otro valor que indique el tamaño de lo que estás pasando.

Por otra parte, te desaconsejo completamente el uso de matrices dobles.

Y para hacer la función que quieres, basta usar un memcpy() :)
  #8 (permalink)  
Antiguo 04/01/2007, 11:24
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Error en declaración de funcion

Cita:
Los arrays SIEMPRE tienen una cantidad de elementos fija.

En cualquier caso, como te dijo Instru, las funciones se suelen hacer pasando punteros **, y otro valor que indique el tamaño de lo que estás pasando.

Por otra parte, te desaconsejo completamente el uso de matrices dobles.

Y para hacer la función que quieres, basta usar un memcpy() :)
vale si el quieres hacer su propia funcion especial para copiar matrices, esta en todo su derecho.

Te sigo diciendo que uses punteros dobles. Con eso no te debes preocupar por el tamaño ya que este va a ser dinamico.

Saludos
  #9 (permalink)  
Antiguo 05/01/2007, 08:39
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Re: Error en declaración de funcion

Cita:
Iniciado por MaxExtreme Ver Mensaje
Los arrays SIEMPRE tienen una cantidad de elementos fija.

En cualquier caso, como te dijo Instru, las funciones se suelen hacer pasando punteros **, y otro valor que indique el tamaño de lo que estás pasando.

Por otra parte, te desaconsejo completamente el uso de matrices dobles.

Y para hacer la función que quieres, basta usar un memcpy() :)
Estas en lo cierto, pero el problema es que no solo necesito copiar matrices, también tengo que hacer multiplicación de matrices, invertir matrices, averiguar autovectores de matrices, y un largo etc de matrices.

Coincido contigo en evitar el uso de arrays multidimensionales, pero lamentablemente, el problema que tiene que resolver el programa que estoy desarrollando es inherentemente multidimensional, por lo que no puedo evitar su uso.

Igual, el problema ya lo resolví como me indico instru.

Gracias a todos por las ayudas y sugerencias
  #10 (permalink)  
Antiguo 05/01/2007, 08:48
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Error en declaración de funcion

Cita:
Iniciado por Instru Ver Mensaje
vale si el quieres hacer su propia funcion especial para copiar matrices, esta en todo su derecho.

Te sigo diciendo que uses punteros dobles. Con eso no te debes preocupar por el tamaño ya que este va a ser dinamico.

Saludos
Instru, no es lo mismo [][] que **. Pese a que entre [] y * no halla poca diferencia, entre los de más de una dimensión sí.

Si quiere usar dobles punteros, tendrá que armar follón (hasta el compilador le avisará de que ** y [][] no es compatible). Lo mejor es usar un sólo puntero (*) y hacer el cálculo de dónde escribir con el resto de los parámetros.
  #11 (permalink)  
Antiguo 05/01/2007, 08:56
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Error en declaración de funcion

Cita:
Iniciado por TolaWare Ver Mensaje
Coincido contigo en evitar el uso de arrays multidimensionales, pero lamentablemente, el problema que tiene que resolver el programa que estoy desarrollando es inherentemente multidimensional, por lo que no puedo evitar su uso.
Puedes evitar su uso, da igual las operaciones que quieras hacer. Una matriz multidimensional es lo mismo que una de una dimensión, simplemente que el compilador te deja usar los [][], pero tú puedes imitar su uso creándote un par de funciones que hagan lo mismo.

De esa manera, podrás tener matrices de cualquier tamaño, pedir más, liberarlas, etc. Teniéndolas que aisgnar un tamaño desde el principio puede valer si sabes que siempre tendrán unas dimensiones, pero si no, te toca hacerlo de otra manera ;)

Cita:
Igual, el problema ya lo resolví como me indico instru.
¿Cómo? Si lo has hecho creando una función que pida punteros dobles, me temo que estará mal. ¿No te está avisando el compilador de nada?
  #12 (permalink)  
Antiguo 05/01/2007, 10:54
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Re: Error en declaración de funcion

Facil:
Si tenemos esta funcion:

void copiar(double **a, double **b, int n)

si intento llamarla de la siguiente manera:

double a[3][3],b[3][3];
copiar(a,b,3);


no anda ni para atras ni para delante.

Pero lo pude solucionar haciendo lo siguiente

Código:
double **a;
a = new double *[3];
for(int i=0;i<3;i++)
     a[i] = new double[3];
// lo mismo para b
copiar(a,b,3);
no pense que eso fuese a funcionar, pero funciono perfectamente. De hecho, los punteros dobles a double (double **a), despues de esa delcaracion se pueden usar como arrays multidimensionales normales, es decir, estas expresiones son validas:
a[2][1] = 9;
double num = a[1][2];
  #13 (permalink)  
Antiguo 05/01/2007, 11:23
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Error en declaración de funcion

Código:
double a[3][3],b[3][3];
copiar(a,b,3);
Claro como dijo MaxExtreme:
Cita:
Instru, no es lo mismo [][] que **. Pese a que entre [] y * no halla poca diferencia, entre los de más de una dimensión sí.
Asi que no te lo acepta el momento de invocar la fucion.

Cita:
no pense que eso fuese a funcionar, pero funciono perfectamente. De hecho, los punteros dobles a double (double **a), despues de esa delcaracion se pueden usar como arrays multidimensionales normales, es decir, estas expresiones son validas:
a[2][1] = 9;
double num = a[1][2];
Que te hizo pensar que no funcionaria, el codigo esta perfecto, pro imagino que la idea es hacerlo mas general, ¿no?

Algo asi:
Código:
double **a;
a = new double *[n];
for(int i=0;i<n;i++)
     a[i] = new double[n];
// lo mismo para b
copiar(a,b,n);
Porque si solo vas a usar matrices de 3x3 entonces no tienes por que usar punteros. Aunque imagino qu el aprendizaje que te quedo de esto es mas valioso.

Acuerdate de liberar la memoria que reservaste con el operador new

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #14 (permalink)  
Antiguo 05/01/2007, 11:52
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Error en declaración de funcion

Bueno si, lo d elos dobles punteros asi namas no funcinaria. Havria que inicializarlos de la manera que TotalWare lo hizo(sin darse cuenta jeje).
De hecho asi acostumbro usarlos.
Aunque no habia notado que la soluciond e MAxextreme es en escencia mejor.
Emular una matriz multidimencional usando una monodimensional.
Bueno, si te ha funcionado pues dejalo asi.

Saludos
  #15 (permalink)  
Antiguo 05/01/2007, 12:05
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Re: Error en declaración de funcion

Cita:
Iniciado por _Lucifer_ Ver Mensaje
Código:
double a[3][3],b[3][3];
copiar(a,b,3);
Claro como dijo MaxExtreme:


Asi que no te lo acepta el momento de invocar la fucion.



Que te hizo pensar que no funcionaria, el codigo esta perfecto, pro imagino que la idea es hacerlo mas general, ¿no?

Algo asi:
Código:
double **a;
a = new double *[n];
for(int i=0;i<n;i++)
     a[i] = new double[n];
// lo mismo para b
copiar(a,b,n);
Porque si solo vas a usar matrices de 3x3 entonces no tienes por que usar punteros. Aunque imagino qu el aprendizaje que te quedo de esto es mas valioso.

Acuerdate de liberar la memoria que reservaste con el operador new

Saludos
Lo que pasa es que en el programa, el tamaño de las matrices es variable, en el ejemplo puse un nro fijo, pero en ese mismo codigo se puede usar una variable, es decir:

int cant = 9;
double **a;
a = new double[cant];
........


este código en una declaración normal de arrays, no compila, la expresión new double[] nos permite crear arrays de la dimension que queramos darle (en tiempo de ejecución), y eso era lo que necesitaba.
  #16 (permalink)  
Antiguo 05/01/2007, 12:15
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Error en declaración de funcion

Cita:
Lo que pasa es que en el programa, el tamaño de las matrices es variable, en el ejemplo puse un nro fijo, pero en ese mismo codigo se puede usar una variable
¡Jajajaja! Entonces te copie lo mismo, pero yo la llame n en vez de cant.

Ah ok...entonces problema resuelto...

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:11.