[C con Clase] Problema vectores/array

Steven Davidson srd4121 en njit.edu
Dom Sep 5 04:54:10 CEST 2010


Hola Jorge,

On 9/4/2010 1:40 PM, Jorge Vega Sanchez wrote:
> Sigo rompiendome los cuernos con los dichosos vectores en C++. Pienso
> que estan definidos de una forma muy muy rara.
>
> Bueno la cosa es que intento definir una matriz de tamaño dinámico,
> que el usuario introducirá por teclado y posteriormente esta matriz
> la mando a un procedimiento para hacer unas operaciones sencillas.
> Total un ejemplito sencillo para trabajar con vectores.
>
> El problema es que me salen errores de compilación pero no consigo
> solucionarlo. En el procedimiento me sale que las dimensiones del
> vector no están definidas y esto es sobremanera lo que más me
> intriga.
>

Veamos el código fuente. Te voy comentando mientras veo el prorama.

> Dejo el código de ejempllo:
> #include<stdlib.h>
> #include<stdio.h>

En C++, usa los nombres estándares de estos ficheros de cabecera. Esto es,

#include <cstdlib>
#include <cstdio>

> #include<iostream>
>
> using namespace std;
>
> void visualiza(int a[n][m])

Esto es un error, ya que las dimensiones de un array deben ser conocidas 
por el compilador y por tanto deben ser constantes o expresiones constantes.

> {
> 	a[0][1]=a[0][1]+7;
> 	cout<<  a[0][1]<<  endl;
> }
>
> int main()
> {
> 	
>    	int n,m;
>
>    	cout<<  "Introducir las dimensiones de la matriz :"
>    	
>      n=getchar();
>      m=getchar();
>    	

Esto no es lógico. La función 'getchar()' extrae el siguiente carácter 
del búfer del teclado y lo retorna. Esto implica que 'n' contendrá el 
código ASCII que representa el carácter tecleado por el usuario. Esto 
supone que no hay interpretación alguna de tal carácter. Por ejemplo,

Introducir las dimensiones de la matriz :10 20[ENTER]

'n' contendrá 49, que es el código ASCII de '1', y
'm' contendrá 48, que es el código ASCII de '0'.

> 	int vec[n][m];
>

Esto no es correcto. He dado mi explicación anteriormente: el compilador 
necesitas conocer los tamaños de los arrays.

> 	visualiza(vec);
>
> cout<<  "valor una vez retornado el vector: "<<  vec[0][1]<<  endl;
> 	
> 	return 0;
> }
>

Si quieres crear y manejar arrays dinámicos, entonces debes usar 
punteros y memoria dinámicamente adjudicada. Sugiero que eches un 
vistazo al capítulo 13 en nuestro curso de C++. Puedes ir directamente 
a: http://c.conclase.net/curso/index.php?cap=013b#OP2_NewDelete

Tendrías que hacer esto:

void visualiza( int **a, int n, int m );

int main()
{
   int n,m;
   ...
   int **vec;
   ...
}


Espero haber aclarado las dudas.

Steven





Más información sobre la lista de distribución Cconclase