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

error en tipo de datos matriz c++

Estas en el tema de error en tipo de datos matriz c++ en el foro de C/C++ en Foros del Web. Estoy aprendiendo esto de matrices en c++ y bueno me toco hacer una matriz transpuesta... pero al compilar el programa me sale errores en esta ...
  #1 (permalink)  
Antiguo 18/06/2012, 18:59
 
Fecha de Ingreso: marzo-2012
Mensajes: 30
Antigüedad: 12 años
Puntos: 0
error en tipo de datos matriz c++

Estoy aprendiendo esto de matrices en c++ y bueno me toco hacer una matriz transpuesta... pero al compilar el programa me sale errores en esta funcion x favor alguien si me pudiera ayudar con esto de "tipos de datos" os agradeceria...
Gracias de antemano... Aca esta el codigo de la funcion que mencione.
Código:
double trans(double **a, unsigned n, unsigned m) {
	double nfa,nca; double **at;
	*at=new double(nca);
	for(double i=0;i<n;i++)
		(*at)[i]=new double(nfa);
	for(double j=0;j<n;j++){
		for(double k=0;j<m;k++)
			(*at)[j][k]=a[k][j];
	}
	return **at;
}
  #2 (permalink)  
Antiguo 19/06/2012, 01:34
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: error en tipo de datos matriz c++

Hola! nose mucho de C++, pero tenes algunos errores
1º tenes problemas de punteros. Esto *at significa indireccion, osea "lo apuntado de at", es lo mismo hacer at[i].
2º usas nfa y nca, pero a esas variables nunca le diste un valor. Por lo que entiendo del codigo tendria que ser n y m, osea nfa=m y nca=n // si es q n son filas y m columnas de double **a

Si queres hacer matrices dinamicas debe ser:
Código C:
Ver original
  1. double **trans(double **a, unsigned n, unsigned m) {
  2.     double nfa,nca; double **at;
  3. at=new double *[nfa];
  4.     for(double i=0;i<m;i++)
  5.         at[i]=new double [nca];
  6.     for(double j=0;j<n;j++){
  7.         for(double k=0;k<m;k++)
  8.             at[k][j]=a[j][k];
  9.     }
  10.         return at;
  11. }
fijate lo que retorno y lo que devuelve la funcion. Retorno at que es un puntero a puntero a double, por lo tanto la funcion debe devolver lo mismo.. Sino qdo muy claro el tema de la matriz dinamica, mira aca:
http://c.conclase.net/curso/?cap=013b


Saludos
  #3 (permalink)  
Antiguo 19/06/2012, 01:42
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: error en tipo de datos matriz c++

Primero, estás utilizando nca y nfa (que, supongo, se refieren a número de columnas y de filas) sin haberles asignado valor alguno, por lo que tomarán valores aleatorios.

Segundo, para lo que estás empleando estas variables es para reservar memoria de forma dinámica. Aunque el compilador haga la conversión correspondiente, debido a que los valores que hayan tomado son aleatorios, puede que sean valores no válidos para una reserva de memoria.

Tercero, estás utilizando variables de tipo double como variables de control para bucles e índices para los elementos de la matriz. No es ilegal, pero tampoco conveniente. Para esto, utiliza valores int o unsigned int.

Cuarto, estás devolviendo un doble puntero a double en una función que has declarado como que retorna un double.

Para transponer una matriz, sería más sencillo así:

Código C++:
Ver original
  1. void Trans1(double **A, unsigned filas, unsigned cols)
  2. {
  3. double x;
  4. for (int i=0; i<filas; i++)
  5. for (int j=0; j<columnas; j++)
  6. {
  7. x = A[i][j];
  8. A[i][j] = A[j][i];
  9. A[j][i] = x;
  10. }

Esta te sobreescribe la matriz de entrada. Si necesitas conservar la matriz de entrada, tendrás que pasar también la matriz de salida:

Código C++:
Ver original
  1. void Trans2(double **A, double **B, unsigned filas, unsigned cols)
  2. {
  3. for (int i=0; i<filas; i++)
  4. for (int j=0; j<columnas; j++)
  5. B[i][j] = A[j][i];
  6. }

Claro está, suponiendo que las matrices A y B han sido convenientemente creadas antes de llamar a la función.
  #4 (permalink)  
Antiguo 19/06/2012, 12:26
 
Fecha de Ingreso: marzo-2012
Mensajes: 30
Antigüedad: 12 años
Puntos: 0
Respuesta: error en tipo de datos matriz c++

Muchas gracias por las respuestas ... ya entendi mejor el uso de estas variables... ahora no se por que este programa no me funciona aca el codigo... Creo que es algun error de logica en la funcion "**trans" si me pudieran ayudar les agradeceria ... aca el codigo completo... El programa debe devolver la matriz transversa... El programa funciona hasta que pongo numeros muy grandes para las filas y columnas de la matriz por ej 15 y 12

Código C++:
Ver original
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <vector>
  4. #include <cmath>
  5. #include <cstdlib>
  6. using namespace std;
  7.  
  8. void leerDimensiones(unsigned &n, unsigned &m){
  9.     try{
  10.         cout<<"Numero de filas y columnas (0 y 0) para salir: "<<endl;
  11.         cin>>n>>m;
  12.         if(n==0 && m==0) throw string("¡Error! Matriz vacía.");
  13.         if(n<=0) throw 1;
  14.         if(m<=0) throw 2;
  15.     }catch(int e){
  16.         switch(e){
  17.         case 1:
  18.             cout<<"El numero de filas debe ser mayor a 0!"<<endl;break;
  19.         case 2:
  20.             cout<<"El numero de columnas debe ser mayor a 0!"<<endl; break;
  21.         }
  22.         leerDimensiones(n,m);
  23.     }
  24. }
  25.  
  26. void leerlim(double &li, double &ls){
  27.     try{
  28.         cout<<"Limites inferior y superior: "<<endl;
  29.         cin>>li>>ls;
  30.         if(li>=ls) throw 1;
  31.     }catch (int e){
  32.         cout<<"El limite inferior debe ser menor al superior !"<<endl;
  33.         leerlim(li,ls);
  34.     }
  35. }
  36.  
  37. int **randMatE(unsigned n, unsigned m, int li, int ls) {
  38.     unsigned i,j,d=ls-li; int **a;
  39.     a=new int*[n];
  40.     for (i=0;i<n;i++){
  41.         a[i]=new int[m];
  42.         for (j=0;j<m;j++)
  43.             a[i][j]= (int)((double)rand()/RAND_MAX*d+li);}
  44.     return a;
  45. }
  46.  
  47. void showMat(int **a, unsigned n, unsigned m){
  48.     unsigned i,j;
  49.     for (i=0;i<n;i++){
  50.         for (j=0;j<m;j++){
  51.             cout<<" "<<setw(8)<<setprecision(5)<<a[i][j];
  52.             if ((j+1)%10==0) cout<<endl;
  53.         }
  54.         cout<<endl;
  55.     }
  56. }
  57.  
  58.  
  59. int **trans(int **a, unsigned n, unsigned m) {
  60.     unsigned i,j;int **at;
  61.     at=new int *[n];
  62.     for(i=0;i<m;i++)
  63.         at[i]=new int(m);
  64.     for(i=0;i<n;i++){
  65.         for(j=0;j<m;j++)
  66.             at[j][i]=a[i][j];
  67.     }
  68.     return at;
  69. }
  70.  
  71. int main(){
  72.     double li,ls;int **a;
  73.     unsigned n,m;
  74.     cout<<"***** Matriz traspuesta *****"<<endl;
  75.     try{
  76.         do {
  77.             leerDimensiones(n,m);
  78.             leerlim(li,ls);
  79.             a=randMatE(n,m,li,ls);
  80.             showMat(a,n,m);
  81.             a=trans(a,n,m);
  82.             cout<<"Matriz transpuesta"<<endl;
  83.             showMat(a,m,n);
  84.         } while(n!=0 && m!=0);
  85.     } catch(string &e) {
  86.         cout<<e;
  87.     }
  88.     return 0;
  89. }

Etiquetas: c++, funcion, matrices
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 01:31.