Autor |
Mensaje |
Uciel
Nivel 6
Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
El tema es que quiero inicializar una matriz, con rango max=10 (poniendo ceros). Para ello creo un procedimiento que se encarge de eso. El procedimiento lo creo en un "header". Aca les paso el codigo, es cortito:
MAIN.CPP
#include <iostream>
using namespace std;
#include "procedimiento.h"
void inicializarMatriz(int **matriz,int rango);
int main() {
cout << "ingrese la rango de la matriz (MAX=10)"<<endl>> rango;
int matriz [10][10];
inicializarMatriz(matriz,rango);
int i,j;
i=1;
while (i<=rango){
j=1;
while (j<=rango){
cout << matriz[i][j];
j=j+1;
}
i=i+1;
{
return 0;
}
PROCEDIMIENTO.H
#ifndef PROCEDIMIENTO_H_
#define PROCEDIMIENTO_H_
void inicializarMatriz(int **matriz, int rango){
int i,j;
i=1;
while (i<=rango){
j=1;
while (j<=rango){
matriz[i][j]=0;
j=j+1;
}
i=i+1;
}
}
#endif /* PROCEDIMIENTO_H_ */
El error me lo tira en el MAIN.CPP en la linea que dice: "inicializarMatriz(matriz,rango);"
me dice: "invalids arguments Candidates are: void inicializarMatriz(int** , int)"
La verdad es que nose porque esta mal. Previo habia hechoo uno que haga lo mismo para un vector y me andaba perfecto.
Bueno cualquier ayudita que me puedan dar, bienvenida será!
Saludos. Uciel
|
|
|
|
|
|
|
|
|
Uciel
Nivel 6
Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
Perdon, borre sin querer una parte del MAIN.CPP, este es el verdadero.
MAIN.CPP
#include <iostream>
using namespace std;
#include "procedimiento.h"
void inicializarMatriz(int **matriz,int rango);
int main() {
cout << "ingrese la rango de la matriz (MAX=10)"<<endl>> rango;
int i=rango;
int j=rango;
int matriz [i][j];
inicializarMatriz(matriz,rango);
i=1;
while (i<=rango){
j=1;
while (j<=rango){
cout << matriz[i][j];
j=j+1;
}
i=i+1;
{
return 0;
}
El PROCEDIMIENTO.H esta bien ^^u
Salute
|
|
|
|
|
|
|
|
|
csebas
Nivel 9
Edad: 71
Registrado: 16 Feb 2009
Mensajes: 1634
Carrera: No especificada
|
|
tu inicializar matriz recibe un puntero a un puntero de int, y vos le estas mandando un puntero.
inicializarMatriz(&matriz,rango);
|
|
|
|
|
|
|
|
|
Symbolic
Nivel 6
Edad: 33
Registrado: 25 Ago 2011
Mensajes: 204
Ubicación: Avellaneda
Carrera: Informática
|
|
El problema es que int** matriz es un puntero a un puntero a un entero y no una matriz. Te recomiendo pasarla como matriz[][]. Total siempre pasa por referencia, sino pasalo como int* matriz, ya que es siempre un puntero al primer elemento que aparezca.
|
|
|
|
|
|
|
|
|
Pablisho
Nivel 5
Registrado: 25 Sep 2008
Mensajes: 142
Carrera: Electrónica y Informática
|
|
NO es lo mismo un array bidimensional(matriz) que un puntero a puntero!
Un array comun lo podes intercambiar con un puntero, y un puntero a puntero lo podes intercambiar con un array de punteros, que tmp es lo mismo que un array bidimensional.
Los array bidimensionales en efecto "no existen", cuando tenes una declaracion del estilo int matriz[5][10] y despues haces matriz[2][4] eso el compilador lo convierte a *(matriz + 2 * 10 + 4) (porque los array bidemensionales se ubican con todos los elementos uno al lado del otro, lo que pone en evidencia que no es lo mismo que un puntero a puntero), para el caso de una funcion cuando pasas un array multidimensional como parametro, en la definicion solo podes dejar libre la primer variable, las otras dimensiones las tenes que poner para que pueda hacer la multiplicacion cuando se mueve en el puntero(como hice mas arriba 2 *10), en efecto la definicion correcta es funcion(int matriz[][tamaño]) o funcion (int (*matriz)[tamaño])
Ahora me vas a decir y no se de cuanto es la matriz hasta que el usuario no ingresa, y bueno, por eso la tenes que declarar antes y solo usar el tamaño que necesites.
Ah y con el vector te funcionaba porque un vector si lo podes intercambiar con un puntero!
|
|
|
|
|
|
|
|
|
Uciel
Nivel 6
Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
Ante todo, muchas gracias por la ayuda que me estan dando. Excelente la explicacion de "Pablisho"
Hice lo que me recomendaron y ya no tengo ninguna marca en esa linea, osea me compilo bien esa parte.
Sin embargo, me aparecio una marca en la llave final "}" que me dice:
Descripción Información Ruta Ubicación Type
expected '}' at end of input main.cpp /matriz línea 24 C/C++ Problem
¿Es un bug o que?
|
|
|
|
|
|
|
|
|
Uciel
Nivel 6
Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
diossss.....corregi lo de la llave y me volvi a aparecer la marca en la linea
"inicializarMatriz(matriz, rango)"
probe lo de poner "inicializarMatriz(&matriz, rango)"
tmb lo de declarar el procedimiento de otras formas como
inicializarMatriz(int matriz[][rango]) o inicializarMatriz (int (*matriz)[rango])
pero sigo con el mismo error
¿¿que estare haciendo mal??
Saludos . Uciel
|
|
|
|
|
|
|
|
|
Daiana_Stefanelli
Nivel 2
Registrado: 27 Jun 2009
Mensajes: 19
Ubicación: Bs As
Carrera: Informática
|
|
habia que inicializar la matriz? yo directamente deje que la cargue el usuario
cuando declaras la funcion podes hacer ser:
tipo inicializarMatriz( int matriz[10][10], rango);
cuando la vayas a usar lo haces igual, yo lo hice asi y el programa me funciono lo mas bien.
|
|
|
|
|
|
|
|
|
Daiana_Stefanelli
Nivel 2
Registrado: 27 Jun 2009
Mensajes: 19
Ubicación: Bs As
Carrera: Informática
|
|
Asi la defini yo:
#ifndef FUNCIONES_H_INCLUDED
#define FUNCIONES_H_INCLUDED
#include <iostream>
#define MAXIMO 10
using namespace std;
int validarRango ();
void cargarMatriz (short int matriz[MAXIMO][MAXIMO], short int rango);
void buscarCamino (short int matriz[MAXIMO][MAXIMO], short int rango, bool &encontrado);
void buscarEnFila (short int matriz[MAXIMO][MAXIMO],short int rango, bool &encontrado);
void buscarEnColumna (short int matriz[MAXIMO][MAXIMO],short int rango, bool &encontrado);
void saltoDeLinea();
#endif // FUNCIONES_H_INCLUDED
asi la invoco:
cargarMatriz(matriz,rango);
y asi creo el procedimiento:
void cargarMatriz (short int matriz[MAXIMO][MAXIMO], short int rango){
espero que te sirva
|
|
|
|
|
|
|
|
|
koreano
Nivel 9
Registrado: 15 Jul 2010
Mensajes: 1796
Carrera: No especificada
|
|
int[] y int[MAXIMO] son tipos distintos estrictamente hablando (aplica para mas de 1 "dimensión"). Son detalles de C y C++ que hay que tener en cuenta.
Código:
|
int bar[5][5];
void procfoo(int asd[][]) { //illegal
}
void procbar(int** asd) { //no match
}
void procpoo(int* asd) { //no match
}
void procbaz(int asd[5][5]) { // works
}
// Manera mas elegante
const int size = 500;
typedef int matriz[size][size];
void procmatriz(matriz* pepe){ ... }
matriz foo;
procmatriz(&foo);
|
|
|
|
|
|
|
|
|
|
Uciel
Nivel 6
Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
Cita:
|
cuando declaras la funcion podes hacer ser:
tipo inicializarMatriz( int matriz[10][10], rango);
cuando la vayas a usar lo haces igual, yo lo hice asi y el programa me funciono lo mas bien.
|
Es una de las cosas que tmb probe, pero cuando invoco la funcion (bah, procedimiento) me sigue dando el mismo error:
"invalids arguments Candidates are: void inicializarMatriz(int** , int)"
mepa, que lo mejor es llevarselo a uno de los ayudantes en un pen y que lo miremos juntos en el Lab! ^^u
De todas formas, gracias a todos por la ayuda, aprendi igual algunas cositas nuevas
saludoss !!
|
|
|
|
|
|
|
|
|
Huey 7
Nivel 6
Registrado: 03 Mar 2010
Mensajes: 267
Carrera: Electrónica
|
|
Uciel escribió:
|
Cita:
|
cuando declaras la funcion podes hacer ser:
tipo inicializarMatriz( int matriz[10][10], rango);
cuando la vayas a usar lo haces igual, yo lo hice asi y el programa me funciono lo mas bien.
|
Es una de las cosas que tmb probe, pero cuando invoco la funcion (bah, procedimiento) me sigue dando el mismo error:
"invalids arguments Candidates are: void inicializarMatriz(int** , int)"
|
Si tira eso, ¿no sigue estando definida como void inicializarMatriz(int **matriz, int rango)? Si está definida como:
void inicializarMatriz(int matriz[10][10], int rango)
o
void inicializarMatriz(int matriz[][10], int rango)
y se invoca como inicializarMatriz(matriz, rango), tiene que andar...
Ahora, trolleando:
Código:
|
#include <iostream>
#include <vector>
using namespace std;
int main(){
int rango;
cout << "Ingrese el rango de la matriz" << endl;
cin >> rango;
typedef vector<int> fila_de_ints;
vector<fila_de_ints> matriz(rango, fila_de_ints(rango));
//matriz inicializada con ceros y lista para usar...
return 0;}
|
|
|
|
|
_________________
|
|
|
|
|
mausq
Nivel 4
Edad: 35
Registrado: 15 Mar 2009
Mensajes: 81
Carrera: Informática
|
|
Por que no creas la matriz(puntero a puntero en realidad) como atributo de la clase matriz. Ahí no tenes que mandarle nada. Solo llamas el método y listo.
|
|
|
|
|
|
|
|
|
Uciel
Nivel 6
Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
DIOSSSS!!! al finnnnn....lo logree ....no se porque rayos estaba definiendo la matriz como:
int matriz[i][j], osea lo cambie por un int matriz[10][10]
y el procedimiento lo defini como
void inicializarMatriz(int matriz[][10], int rango)
y me anduvo perfecto!!!
GRACIAS GENTE GRACIAS!!! despues de infinitas horas lo consegui XD
Saludos a todos =D
|
|
|
|
|
|
|
|
|
|