elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Que le está pasando a este Programa? [C++]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Que le está pasando a este Programa? [C++]  (Leído 5,578 veces)
mastersuv

Desconectado Desconectado

Mensajes: 23


Tomorrow couldn't be a new day...


Ver Perfil WWW
¿Que le está pasando a este Programa? [C++]
« en: 18 Agosto 2010, 08:07 am »

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í:

Citar
Unhandled 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
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <Windows.h>
  5.  
  6. using std::cout;
  7. using std::cin;
  8. using std::string;
  9. using std::vector;
  10. using std::iterator;
  11.  
  12. vector<string> VectorizarString(vector<string> vector, string str){
  13. string letraactual;
  14. for(int i = 0; i < str.length(); i++){
  15. letraactual = str[i];
  16. vector.push_back(letraactual);
  17. }
  18. return vector;
  19. }
  20.  
  21. int main(int argc, char* argv[]){
  22. string a;
  23. vector<string> letras; // Este vector contendrá cada una de las letra que tenga la String a Rotar
  24. vector<string>::iterator it = letras.begin(); // Este es un Simple Iterador, que apunta al Primer elemento del Vector letras
  25.  
  26. cout << "Ingresa una String: ";
  27. cin >> a;
  28.  
  29. letras = VectorizarString(letras, a);
  30.  
  31. for(int i = 0; ; i++){
  32. it = letras.begin(); // it se posiciona en el primer elemento del Vector letras
  33. letras.insert(it, letras.back()); // Se inserta el ultimo elemento en la posicion de it
  34. letras.pop_back(); // Se borra el ultimo elemento, ya que ahora este esta al inicio
  35.  
  36. for(int i = 0; i < letras.size(); i++){
  37. cout << letras[i]; // Se muestra en pantalla el resultado, y el ciclo continua
  38. }
  39. Sleep(200);
  40. system("CLS");
  41. }
  42.  
  43. system("PAUSE");
  44. return 0;
  45. }


« Última modificación: 18 Agosto 2010, 08:19 am por mastersuv » En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: ¿Que le está pasando a este Programa? [C++]
« Respuesta #1 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
  1. longitud = strlen(cadena);   // obtenemos el numero de caracteres
  2. caracter = cadena[longitud - 1];  // guardamos el ultimo caracter para no perderlo
  3. memmove(cadena + 1 , cadena, longitud - 1);  // desplazamos la cadena una posicion a la derecha
  4. cadena[0] = caracter;  // y guardamos el ultimo caracter en la primera posicion
  5.  

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

¡Saludos!


En línea

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

Desconectado Desconectado

Mensajes: 23


Tomorrow couldn't be a new day...


Ver Perfil WWW
Re: ¿Que le está pasando a este Programa? [C++]
« Respuesta #2 en: 19 Agosto 2010, 00:34 am »

¡Buenas!

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

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

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.
« Última modificación: 19 Agosto 2010, 00:50 am por mastersuv » En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: ¿Que le está pasando a este Programa? [C++]
« Respuesta #3 en: 19 Agosto 2010, 03:13 am »

¡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!
« Última modificación: 19 Agosto 2010, 03:34 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: ¿Que le está pasando a este Programa? [C++]
« Respuesta #4 en: 20 Agosto 2010, 09:20 am »

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
  1. for(;;;)//La condicion que gustes.
  2. {
  3. rotate(str.begin(),str.end()-1,str.end());//#include <algorithm>
  4. cout<<a;
  5. system("cls");//Si ya estas usando WINAPI, tenes varias formas de limpiar la pantalla y te ahorras la llamada a system.
  6. }

Saludos
En línea

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


Desconectado Desconectado

Mensajes: 673



Ver Perfil WWW
Re: ¿Que le está pasando a este Programa? [C++]
« Respuesta #5 en: 21 Agosto 2010, 05:17 am »

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)

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
En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: ¿Que le está pasando a este Programa? [C++]
« Respuesta #6 en: 21 Agosto 2010, 06:20 am »

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
En línea

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


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: ¿Que le está pasando a este Programa? [C++]
« Respuesta #7 en: 26 Agosto 2010, 02:51 am »

¡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!
« Última modificación: 26 Agosto 2010, 03:14 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ver lo que está pasando en otra Shell en Linux
GNU/Linux
dm2010 2 3,518 Último mensaje 13 Febrero 2011, 02:42 am
por dm2010
mu pueden ver este programa en c++ y ver si esta bueno
Programación C/C++
eduardo17445 3 3,822 Último mensaje 5 Marzo 2013, 02:59 am
por NoLife
¿Está mal este programa? Concurrencia y semáforos
Java
NathanD 1 1,671 Último mensaje 4 Octubre 2014, 20:07 pm
por NathanD
Duda que esta pasando en el foro? El hacking esta muriendo « 1 2 3 »
Sugerencias y dudas sobre el Foro
Flamer 28 12,825 Último mensaje 12 Febrero 2015, 20:28 pm
por WaAYa HaCK
que esta pasando con mi codigo que me da error de offset
PHP
geshiro 1 2,052 Último mensaje 3 Mayo 2016, 16:09 pm
por MinusFour
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines