¿Que le está pasando a este Programa? [C++]

Iniciado por mastersuv, 18 Agosto 2010, 08:07 AM

0 Miembros y 1 Visitante están viendo este tema.

mastersuv

Estoy haciendo un Programita para practicar mis habilidades con C++

Lo que hace es hacer un efecto de rotación hacia la derecha de una cadena.
Es decir, si la cadena a rotar fuera "HOLA" pasaría esto:

HOLA
AHOL
LAHO
OLAH
HOLA

Y con una limpiada de pantalla con el System("CLS"); se miraría bonito.

---------------

El punto es... que estoy teniendo problemas en la ejecución.
Compila...
Lo raro es... que solo funciona con ciertas cadenas.
Es decir, si pruebo con mi nombre:
"Santiago" funciona a la perfección, tal y como quiero.

Pero con cadenas mas cortas, no funciona.  :-\
Me saca del programa con una excepción.

Tampoco cadenas muy largas... unas si y otras no... lo mismo.
No se que patrón este siguiendo para dar o no dar la excepción.  :¬¬

No hay errores, pero me da una excepción que dice así:

CitarUnhandled exception at 0x7c812afb in RotacionString.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0013e994..

¿Que podrá estar causando eso?

Aquí les dejo mi código, pruebénlo.

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>

using std::cout;
using std::cin;
using std::string;
using std::vector;
using std::iterator;

vector<string> VectorizarString(vector<string> vector, string str){
string letraactual;
for(int i = 0; i < str.length(); i++){
letraactual = str[i];
vector.push_back(letraactual);
}
return vector;
}

int main(int argc, char* argv[]){
string a;
vector<string> letras; // Este vector contendrá cada una de las letra que tenga la String a Rotar
vector<string>::iterator it = letras.begin(); // Este es un Simple Iterador, que apunta al Primer elemento del Vector letras

cout << "Ingresa una String: ";
cin >> a;

letras = VectorizarString(letras, a);

for(int i = 0; ; i++){
it = letras.begin(); // it se posiciona en el primer elemento del Vector letras
letras.insert(it, letras.back()); // Se inserta el ultimo elemento en la posicion de it
letras.pop_back(); // Se borra el ultimo elemento, ya que ahora este esta al inicio

for(int i = 0; i < letras.size(); i++){
cout << letras[i]; // Se muestra en pantalla el resultado, y el ciclo continua
}
Sleep(200);
system("CLS");
}

system("PAUSE");
return 0;
}

do-while

¡Buenas!

No te lies tanto con la STL, en cstring (#include <cstring>), tienes funciones que te hacen casi todo el trabajo:

Código (cpp) [Seleccionar]

longitud = strlen(cadena);   // obtenemos el numero de caracteres
caracter = cadena[longitud - 1];  // guardamos el ultimo caracter para no perderlo
memmove(cadena + 1 , cadena, longitud - 1);  // desplazamos la cadena una posicion a la derecha
cadena[0] = caracter;  // y guardamos el ultimo caracter en la primera posicion


Y con esto, tienes todo el trabajo hecho, sin complicarte tanto la vida.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

mastersuv

#2
Cita de: do-while en 18 Agosto 2010, 13:05 PM
¡Buenas!

No te lies tanto con la STL, en cstring (#include <cstring>), tienes funciones que te hacen casi todo el trabajo:

Código (cpp) [Seleccionar]

longitud = strlen(cadena);   // obtenemos el numero de caracteres
caracter = cadena[longitud - 1];  // guardamos el ultimo caracter para no perderlo
memmove(cadena + 1 , cadena, longitud - 1);  // desplazamos la cadena una posicion a la derecha
cadena[0] = caracter;  // y guardamos el ultimo caracter en la primera posicion


Y con esto, tienes todo el trabajo hecho, sin complicarte tanto la vida.

¡Saludos!

Jajaja, siento que me haz dejado en ridículo al cambiar todo el código que yo escribí, por uno mucho mas corto y con mejores resultados.

Pero bueno, valio la pena pensarle un poquito  :D
De todas formas seguiré buscando como resolver el problema anterior.

Muchas gracias colega.

do-while

#3
¡Nooooo!

Mi intencion no era dejar en ridiculo a nadie. Simplemente queria mostrarte que hay diferente s formas de hacer las cosas. Es cierto que hacerlo a tu manera es mas largo, pero asi se aprenden las cosas, y asi hemos empezado todos. Si el ejercicion hubiese sido en C, te hubieses olvidado de la STL, y hubieses acudido a funciones de la libreria estandar de C, que es lo que he hecho yo. En el caso de C++, tienes la STL, que en muchos casos resulta de mucha ayuda porque contiene estructuras de datos abstractas que te ahorran mucho codigo, pero a veces hay que olvidarlas y recurrir a codigo estructurado en lugar de orientado a objetos, y las cosas se simplifican. Y por supuesto, a la inversa tambien ocurre. Solo hay que escoger el codigo mas conveniente en cada momento, pero eso se aprende con la experiencia.

¡Un saludazo y a seguir aprendiendo!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Littlehorse

Igualmente los beneficios de utilizar la STL no pasan solamente por la abstracción de código. En gran parte de los casos se obtiene una mejora de rendimiento notable (sobre todo en grandes volúmenes de datos) y una mayor estabilidad.

En cuanto al código inicial, no se si has decidido implementar un vector de strings por algún motivo en particular u solo por probar, pero no creo que sea la mejor forma ya que estas usando un vector de cadenas para manipular una sola cadena.

Para resolver el error lo mejor que podes hacer es depurarlo, a simple vista el error no se ve, he incluso lo he probado con unas 200 cadenas y no me ha dado ningún error. Por el mensaje que te da cuando falla, el error claramente es en el manejo de memoria dinámica, así que con esos datos podes empezar a depurar.

En cuanto a la STL, bueno, con 3 lineas podes hacer algo como:

Código (cpp) [Seleccionar]
for(;;;)//La condicion que gustes.
{
rotate(str.begin(),str.end()-1,str.end());//#include <algorithm>
cout<<a;
system("cls");//Si ya estas usando WINAPI, tenes varias formas de limpiar la pantalla y te ahorras la llamada a system.
}


Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Karman

Cita de: Littlehorse en 20 Agosto 2010, 09:20 AMIgualmente los beneficios de utilizar la STL no pasan solamente por la abstracción de código. En gran parte de los casos se obtiene una mejora de rendimiento notable (sobre todo en grandes volúmenes de datos)

justamente lo has dicho, tengo un programa que no maneja grandes volúmenes de datos, solo hace "rotaciones de caracteres en strings" (efecto comúnmente utilizado para desplazar texto por pantalla) es más, es un "detalle gráfico", y voy a utilizar grandes librerías para un detalle???

personalmente creo que todas las cosas tienen su "uso", (es como usar vectores de la stl para manejar un vector estático de 10 elementos)

creo que como todo el la vida, las herramientas están para usarlas, uno puede sacar un tornillo con un cuchillo, con un destornillador manual o con un destornillador mecánico, ahora, siempre hay consecuencias...

S2

Littlehorse

Esta claro que depende del caso, por supuesto. Al utilizar esas "grandes librerías" también posiblemente estés usando librerías con "grandes" testeos, y eso influye en el resultado final.

Utilizar la STL o no con un detalle depende exclusivamente de la importancia del detalle, pero igualmente también depende de si te sentís cómodo o no utilizándola.

La realidad es que nadie codifica en poco tiempo métodos existentes en la STL que posean la misma estabilidad y el mismo rendimiento. Como poder, se puede, pero te vas a tomar el trabajo solo si es estrictamente necesario ya sea porque necesitas un control interno que la STL no te permite, porque queres implementar detalles extras, y por otros tantos motivos que posiblemente sean validos.

Lo que vos puedas darle como uso a una determinada herramienta es relativo y depende del programador. Vos pones como ejemplo de una mala practica utilizar un vector STL para manejar un vector estático, el tema es que quien lo usa puede hacer una transición a un vector dinámico fácilmente, mientras que para que vos hagas lo mismo tenes que realizar toda la implementación del manejo de memoria dinámica. Sera igual de estable? sera igual de rápida? bueno, eso varia, si no en el foro no se verían tantos post con errores de segmentación.

Pero en fin, cada caso es un mundo y obviamente la STL no aplica para todos. Lo que si estoy seguro es que no es ni un cuchillo, ni un destornillador, mas bien es una navaja suiza, ahora depende de uno saber utilizarla.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

do-while

#7
¡Buenas!

Antes de nada queria disculparme por si he creado algun tipo de ¿flameware lo llamais? sobre  la utilizacion o no utilizacion de la STL.

Tengo que admitir, que mi primer contacto con la POO fue a traves del libro "Como programar en C/C++" de los Deitel, y en la edicion que tengo (creo que es la segunda), no se trataba el tema de la STL y la parte de C++ no se correspondia con el estandar actual. Pero hemos podido ver que la solucion basa en la STL (que desconozco casi por completo) que ha dado Littlehorse es mucho mas simple.

Tambien tengo que admitir, que viniendo de C, y en este caso concreto, siendo que estudio matematicas, habia situaciones en la que no me convencia la POO, por ejemplo en al caso de clasificar funciones matematicas dentro de un calse math, ya que dichas funciones, intuitivamente, actuan sobre elementos numericos (se que existe el calculo funcional, pero ya se escapa a la intuicion de la mayor parte de la gente), y existen de forma independiente al conjunto numerico en el que tienen la salida. Son "verbos", describen como transformar numeros, no objetos (aunque tengan propiedades dependiendo del tipo de funcion). Mi vision de la programacion, no es que sea radical con respecto a una progrmacion procedural absoluta o una orientacion a objetos absoluta. Pienso que muchas soluciones pasan por un punto intermedio.

Hay mucha gente que compara la programacion procedural con la utillizacion de verbos, y la POO con la utilizacion de objetos (valga la redundancia) y sus propiedades, pero ¿No es cierto que las ideas se expresan mediante objetos, verbos e interacciones entre objetos expresadas mediante verbos?. Creo, y ya estoy divagando, que las ideas extremas no llevan a ningun lado. Puede que lleven a sitios mejores o peores, pero un punto intermedio, me parece, que siempre sera mas rico.

¡Un saludo y espero no haber levantado demasiadas ampollas con este comentario!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!