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

imprimir un arreglo por referencia

Estas en el tema de imprimir un arreglo por referencia en el foro de C/C++ en Foros del Web. Hola buenos, he oido hablar de este foro y me parece bueno, y bien, ya estaba registrado hace tiempo pero hasta hoy vengo a participar, ...
  #1 (permalink)  
Antiguo 05/12/2008, 02:49
Avatar de grifo  
Fecha de Ingreso: octubre-2005
Ubicación: COLOMBIA
Mensajes: 49
Antigüedad: 18 años, 6 meses
Puntos: 0
Pregunta imprimir un arreglo por referencia

Hola buenos, he oido hablar de este foro y me parece bueno, y bien, ya estaba registrado hace tiempo pero hasta hoy vengo a participar, pues no se como hacer algo en c++ permitanme y les comento.

Tengo una clase que me regresa un arreglo de enteros con este metodo

Código:
int* Cadena::getCadNum()
{
	return this->cadNum;
}
y lo recibo en main() así

Código:
int* cad =  p.getCad1().getCadNum();
quiero entonces ver que tiene ese arreglo y lo itero con un for así

Código:
for(int i = 0; i < 3; i++)
	{
		cout << "esto es el array " << *(cad+i) << "\n";
	}
Y me imprime lo que tiene el arreglo pero al final me sale ese mensaje

segmentation fault
error code 139

Entonces yo compilo y bien, construyo y bien.... ejecuto el programa y me sale ese error. Estuve busncando al respecto y me dice que un puntero puede estar descarriado, o sea que en otras palabras quiere apoderarse de la memoria que le da el SO eso es un violacion de acceso.


Entonces mi pregunta es: ¿que estoy haciendo mal? o como imprimo un arreglo que me retorna getCadNum().

Como datos varios, pues, estoy programando en gnu/linux en xubuntu con geany


alguien ¿?


gracias por el tiempo ;)


nos vemos entonces

ciao
__________________
-Tener la conciencia limpia es síntoma de mala memoria.
- Lo importante no es ganar, sino hacer perder al otro
- Si no eres parte de la solución, eres parte del problema.
- Errar es humano, pero echarle la culpa a otro, es más humano todavía.
- Yo no sufro de locura la disfruto a cada momento :-D
:-D
  #2 (permalink)  
Antiguo 05/12/2008, 09:36
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: imprimir un arreglo por referencia

Parece correcto pero sin comprobaciones (por ejemplo cad podria ser un puntero nulo) y no se de donde sacas que hay 3 elementos puede que no los haya, pega la minima expresion de codigo que genere la excepcion (segmentation fault).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 05/12/2008, 13:33
Avatar de grifo  
Fecha de Ingreso: octubre-2005
Ubicación: COLOMBIA
Mensajes: 49
Antigüedad: 18 años, 6 meses
Puntos: 0
Respuesta: imprimir un arreglo por referencia

Eternal Idol muchas gracias por la respuesta, verás, sé que el arreglo debe tener 3 elementos pues eso es lo que le he colocado en otra función, (eso en teoria por eso quiero imprimir parav ver) y por eso me imprime lo que debe tener, pero como digo arriba me sale ese mensaje de segment fault.

Coloco aqui una captura de la pantalla



Ahora no se ... que parte del codigo es la que genera el error... en todo caso pues coloco aqui la funcion donde modifico el arreglo que quiero ver... por si desde un principio estoy haciendo mal..

Código:
string Cadena::minusculas(string s)
{
   for(int i = 0; s[i]; i++) 
   {  
   		s[i] = tolower(s[i]); //<--convierte a minusculas la cadena
   		
   		switch(s[i])
   		{
   			case 'a':	
   				this->cadNum[i] = 11;
   				break;
   		}	// fin de switch
   
   }
   return s;
}

Este metodo lo que hace es... pasar a minusculas las letras de un string, luego si encuentras una 'a' coloca en el arreglo que quiero imprimir, un numero 11. Con ese metodo tengo la cadena en minusculas... y con el metodo de mi primer mensaje .. quiero ver que tiene el arreglo cadNUm[]

gracias ;)
__________________
-Tener la conciencia limpia es síntoma de mala memoria.
- Lo importante no es ganar, sino hacer perder al otro
- Si no eres parte de la solución, eres parte del problema.
- Errar es humano, pero echarle la culpa a otro, es más humano todavía.
- Yo no sufro de locura la disfruto a cada momento :-D
:-D

Última edición por grifo; 05/12/2008 a las 13:41
  #4 (permalink)  
Antiguo 05/12/2008, 14:08
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: imprimir un arreglo por referencia

La excepcion se produce fuera del bucle aparentemente, al menos es capaz de imprimir los 3 elementos ... por favor pega la minima expresion de codigo COMPILABLE que genere la excepcion (segmentation fault).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 05/12/2008, 14:27
Avatar de grifo  
Fecha de Ingreso: octubre-2005
Ubicación: COLOMBIA
Mensajes: 49
Antigüedad: 18 años, 6 meses
Puntos: 0
Respuesta: imprimir un arreglo por referencia

Eternal Idol... hombre que pena la ignorancia y gracias por su tiempo... pero no entiendo a que se refiere... :( con la minima expresion de codigo compilable...

No se que parte es la que generra el error, si se refiere a una linea especifica del codigo fuente ..

gracias

ciao
__________________
-Tener la conciencia limpia es síntoma de mala memoria.
- Lo importante no es ganar, sino hacer perder al otro
- Si no eres parte de la solución, eres parte del problema.
- Errar es humano, pero echarle la culpa a otro, es más humano todavía.
- Yo no sufro de locura la disfruto a cada momento :-D
:-D
  #6 (permalink)  
Antiguo 05/12/2008, 14:33
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: imprimir un arreglo por referencia

Me refiero a que no es necesario que pongas TODO tu codigo (a menos que solo pase con todo) sino que con el minimo (que compile) es suficiente para probarlo.

Sino sabes cual es la parte que genera el error y queres investigarlo por vos mismo usa el gdb para depurarlo.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 18/12/2008, 22:43
Avatar de grifo  
Fecha de Ingreso: octubre-2005
Ubicación: COLOMBIA
Mensajes: 49
Antigüedad: 18 años, 6 meses
Puntos: 0
Respuesta: imprimir un arreglo por referencia

Hola a todos que pena responder despues de tanto tiempo ... una vez lei el mensaje de Eternal, fui a buscar que era un gdb y ya se que sirve para depurar, ahora entiendo a que se referia Eternal con la liena de codigo que me marcará error... En linux no he podido depurar por eso que no volví, no tenía una respuesta... pero me instalé el gdb y no lo entendí no me sirvio es muy feo... me bajé una gui para el mismo ... y no di con el chiste. Probé Anjuta que este IDE tiene depurador... pero al compilar mi codigo en Anjuta este me saca errores por todos lados, incluso por declarar una funcion... por lo que no pude depurarlo desde allí...

pues escribía para reportame... no se que tengo mal.... (ni en que linea)...

gracias por el tiempo.

saludos
__________________
-Tener la conciencia limpia es síntoma de mala memoria.
- Lo importante no es ganar, sino hacer perder al otro
- Si no eres parte de la solución, eres parte del problema.
- Errar es humano, pero echarle la culpa a otro, es más humano todavía.
- Yo no sufro de locura la disfruto a cada momento :-D
:-D
  #8 (permalink)  
Antiguo 19/12/2008, 02:14
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: imprimir un arreglo por referencia

Pega aca la minima expresion de codigo que genere la excepcion (sino podes, pega todo el codigo y listo).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 21/12/2008, 11:33
Avatar de grifo  
Fecha de Ingreso: octubre-2005
Ubicación: COLOMBIA
Mensajes: 49
Antigüedad: 18 años, 6 meses
Puntos: 0
Respuesta: imprimir un arreglo por referencia

hola Eternal muchas gracias por la respuesta, mira entonces coloco mi codigo, lo que quiero en este momento es que las letras que hay en 2 cadenas string sean pasadas a numeros así:

a = 11
b = 12
c = 13
···

Y así sucesivamente hasta la z que seria 36. Lo anterior es lo minimo que debe hacer el programa en este momento, para hacer la conversion de letras a numero, en un arreglo de enteros voy poniendo los numeros en el orden de las letras y quiero ver como ha quedado ese arreglo... y ese es mi problema pues hay ese violacion de acceso.

Para hacer eso tengo pensado 4 archivos :

El archivo que tiene la funcion main

Código:
#include <iostream>
#include <sstream>
#include <stdlib.h>
#include "principal.cpp"
using namespace std;


int main()
{
	Principal p = Principal("AAA", "daniel");
	cout << p.getCad1().toString() << "\n";
	cout << p.getCad1().toString() << "\n";
	
        return 0;
}
La el archivo que tiene la clase Principal que en main se instancia un objeto de esta clase

Código:
#define _principal_cpp_
#include <iostream>
#include "cadena.cpp"
using namespace std;

class Principal
{
	public:
		Principal();
		Principal(string c1, string c2);
		Cadena getCad1() { return this->cadena1; }
		Cadena getCad2() { return this->cadena2; }
				
	private:
		Cadena cadena1;			// objeto que tiene una cadena son numeros
		Cadena cadena2;			// objeto que tiene una cadena son numeros
		InfoBase cad1[]; 	// vector que tendrá objeto infobase y van 2 a Z de c1
		InfoBase cad2[]; 	// vector que tendrá objeto infobase y van 2 a Z de c2
};



// averiguar Bien como se recibe un vector por parametro
/*
void InfoBase::llenarBases() 	
{
	//int Base = 2 ;
	//int NumerodeBases = 34 ;
	for(int i = 0, base = 2; i <= 34 ; i++, base++) 
	    {
	    	//if (Base <= 36)
	    	  //  {
	    	    	this->cad1[i]= InfoBase(Base,conversor(Base));
	    	  //  }
		}
}
*/


Principal::Principal(string c1, string c2)
{
	this->cadena1 = Cadena(c1);
	this->cadena2 = Cadena(c2);
}

Principal::Principal()
{		}

El archivo que tiene la clase Cadena en en Principal hay dos atributos

Código:
#define _cadena_cpp_
#include <iostream>
#include <ctype.h>	
#include <sstream>								// para atoi
#include <math.h>								
#include "infobase.cpp"							
#define length(x) (sizeof(x)/sizeof(x[0]))		// pasara el tamaño de un arreglo
using namespace std;


class Cadena
{
	public:
		Cadena();						// constructor vacio
		Cadena(string cad);
		int* getCadNum();
		string toString();
		void letraANumero(string s);	// pasa un string a minusculas
		string atoi(int num);
		int conversor(int Base);		// convierte un numero a una base 
		void llenarBases(InfoBase x[]);
	
	private:
		int cadNum[];					// cadena 1 con solo numeros 
		
};


//~ Pasa las letras de la cadena a numeros equivalentes 
void Cadena::letraANumero(string s)
{
   for(int i = 0; s[i]; i++) 
   {  
   		s[i] = tolower(s[i]); //<--convierte a minusculas la cadena
   		switch(s[i])
   		{
   			case 'a':	
   				this->cadNum[i] = 11;
   				break;
   		}	// fin de switch
   }
} 


//~ Convierte el arreglo de enteros en un decimal dependiendo de la base
int Cadena::conversor(int Base)
{
	int valorDecimal = 0 ;
	int exp = 0 ;
	for (int i =(length(this->cadNum)-1); i>=0 ; i--)
	  {
		valorDecimal =+ this->cadNum[i] * pow(Base,exp); 
		exp =+ 1 ;
      }
  return valorDecimal;
}


//~ convierte el arreglo de enteros en una cadena
string Cadena::toString()
{
	string rta = "";
	for(int i = 0; length(this->cadNum); i++)
	{    rta = rta + this->atoi(this->cadNum[i]) + "\n";   
	}
	return rta;
}


//~ Pasa un entero a cadena
string Cadena::atoi(int num)
{
	stringstream cadena;
	cadena << num;
	return cadena.str();
}


int* Cadena::getCadNum()
{
	return this->cadNum;
}


Cadena::Cadena(string cad)
{
	this->cadNum[cad.size()];
}


Cadena::Cadena()
{		}
La otra es la clase InfoBase que permite guardar un valor en decimal y la base

Código:
#include <iostream>
#define _infobase_cpp_


class InfoBase
{
	public:
		InfoBase();
		InfoBase(int base, int valDeci);
		
	private:
		void llenarBases();
		int base;
		int valDeci;	
};


InfoBase::InfoBase()
{	}


InfoBase::InfoBase(int base, int valDeci)
{
	this->base = base;
	this->valDeci = valDeci;	
}
En el main simplente instancio un objeto de Principal y quiero ver lo que hay en unos arreglos.

gracias muchas gracias por los comentarios y gracias por el tiempo..

ciao
__________________
-Tener la conciencia limpia es síntoma de mala memoria.
- Lo importante no es ganar, sino hacer perder al otro
- Si no eres parte de la solución, eres parte del problema.
- Errar es humano, pero echarle la culpa a otro, es más humano todavía.
- Yo no sufro de locura la disfruto a cada momento :-D
:-D

Última edición por grifo; 21/12/2008 a las 11:54
  #10 (permalink)  
Antiguo 21/12/2008, 12:13
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: imprimir un arreglo por referencia

Todos los lugares donde haces length(this->cadNum) son incorrectos, no podes trabajar con cadNum de esa manera en realidad, tenes que reserva su tamaño dinamicamente (podes hacer un array estatico grande pero es una solucion pobre).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
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 13:37.