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

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Mensajes
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13
31  Programación / Programación C/C++ / Re: [C++] Liberación de memoria dinámica. en: 18 Noviembre 2015, 19:52 pm
It es un iterador de un vector.

Ya corregí el error, estaba usando un vector y en realidad tenía que usar una lista. Estaba buscando diferencias y resulta que por estar todo el tiempo generando nuevas balas y eliminando encontré esto:

Lists are faster when you regularly need to insert elements in between two other elements, or delete elements from such positions though. Insertions and erasures are cheap no matter where in the list they occur. Iterators remain valid even when you add or remove elements from the list.

Así que simplemente cambié de un vector a una lista y funcionó. Escribo esto por si a alguien se le presenta lo mismo.

Pero gracias por responder igual. :)
32  Programación / Programación C/C++ / [C++] Liberación de memoria dinámica. en: 18 Noviembre 2015, 02:32 am
Vean, estaba haciendo una especie de "juego", y a la hora de programar la rutina de las balas me ha surgido un problema, podemos disparar las veces que queramos y no pasará nada, pero en el momento cuando la última bala llega al tope, el programa deja de funcionar.

El error está (creo) en la liberación de la memoria dinámica, no sé qué estoy haciendo mal. Verán, esta es la parte:

Código
  1.        for(it = balas.begin(); it != balas.end(); ++it) {
  2.            (*it)->borrar_bala((*it)->GetX(),(*it)->GetY());
  3.            if(!(*it)->rng_fuera()) {
  4.                (*it)->mod_pos_bala((*it)->GetY());
  5.                (*it)->pintar_bala();
  6.            }
  7.            else {
  8.                delete (*it);
  9.                balas.erase(it);
  10.            }
  11.        }
  12.  

La función rng_fuera() retorna un valor booleano, retorna true si la bala ha llegado al tope, es decir, cuando y = 0. Y false en caso contrario.

Entonces yo, como se muestra arriba, borro de la pantalla la posición actual de la bala, si ha llegado al tope, pues libero la memoria y borro ese elemento del vector, en caso contrario modifico la posición actual de la bala a la nueva posición y la pinto. Pero algo sucede y no puedo encontrar el error.

Si necesitan el código completo para entenderlo mejor, pídanmelo y lo publico en los comentarios. :)
33  Programación / Programación C/C++ / Re: como se hace donde dice: "imprimirá un cuadrado con puras ‘X’... en: 17 Noviembre 2015, 02:39 am
Supongo que lo más "difícil" es dibujar el cuadrado. Pues nada, como ha dicho furciorifa, 2 búcles, uno dentro de otro (anidados), el de dentro pintará cada una de las columnas y el de afuera se desplazará por las filas.

No debería hacer esto, pero en fin, sería así:
Código
  1. void pintar_cuadrado(const int base, const int altura) {
  2.    std::cout << "--- GRAFICA ---\n" << std::endl;
  3.  
  4.    for(int i = 0; i < altura; i++) {
  5.        for(int j = 0; j < base; ++j) {
  6.            std::cout << "X";
  7.        }
  8.        std::cout << std::endl;
  9.    }
  10. }
  11.  
34  Programación / Programación C/C++ / Re: Ayuda con vectores c++ en: 16 Noviembre 2015, 02:50 am
He presionado "citar" en lugar de editar, vaya torpe. xD
35  Programación / Programación C/C++ / Re: Ayuda con vectores c++ en: 16 Noviembre 2015, 02:44 am
y excluir el numero negativo que se ingresó al final para terminar de ingresarlo
Eso me ha confundido. XD

Según lo que entendí lo que puedes hacer es pedir los valores, si es menor que 0 cortas el búcle, y es imposible que ingreses más de 10 valores ya que el búcle te lo prohíbe, una vez llegues ahí se cortará. Y si quieres saber cuántos elementos hay en el arreglo entonces la función cargar_vector hazla entera y retorna el valor de longitud, no tiene mucho sentido que lo pases como parámetro e inmediatamente lo pongas igual a cero. Es decir, quedaría algo así:

Código
  1. int cargar_vector(int vector[])
  2. {
  3. int longitud=1; //El 1 es porque ya contarás al primer elemento
  4.    cout<<"Ingrese los numeros del vector: ";
  5.  
  6. while(longitud<(MAX + 1)) /* el + 1 es porque estamos contando desde 1, si no estaríamos cogiendo solo 9 valores.*/
  7. {
  8.  cin>>vector[longitud];
  9.  
  10.  if(vector[longitud]<0)
  11.  {
  12.  break;
  13.  }
  14.  
  15.  longitud++;
  16.  
  17. }
  18.  
  19. return longitud;
  20. }
  21.  

Y el main quedaría así:
Código
  1. int main()
  2. {
  3.  
  4. int vector[MAX];
  5.  
  6. imprimir_vector(vector, cargar_vector(vector));
  7.  
  8. return 0;
  9. }
  10.  
  11.  

Y imprimir_vector te quedaría así:
Código
  1. void imprimir_vector(int vector[], int longitud) {
  2.     for(int i = 0; i < longitud; ++i) {
  3.          if(vector[i] < 0) {
  4.               vector[i] = 0; // Encontramos un valor negativo y lo sustituimos por 0.
  5.               break;
  6.          }
  7.          cout << vector[i];
  8.     }
  9. }
  10.  

Edit: Una cosa que me he dado cuenta a último momento, en la función main el arreglo está cogiendo 11 valores, no 10, tendrías que hacer MAX igual a 9. Pero entonces quitarías el + 1 que he puesto en el búcle.
36  Programación / Programación C/C++ / Re: [Ayuda]Secuencias en: 14 Noviembre 2015, 21:52 pm
No me quedó del todo claro lo que intentas hacer, pero acá varias cosillas:

Código
  1. cout << "DADES:" << endl;
  2.    cin >> numero; // <- Acá
  3.    while (numero != EOS)
  4.    {
  5.        cin >> numero; // <- Estás pidiendo el mismo valor 2 veces.
  6.        sumaXifres(numero) = n;
  7.    }
  8.  

También estás declarado numero y número1, y "numero1" nunca la utilizas, así que:
Código
  1. if ((sumaXifres(numero)) == (sumaXifres(numero1))) // <- Este if jamás se cumplirá.
  2.    {
  3.        cout << "LA SEQUENCIA CONTE UNA PARELLA CONSECUTIVA AMB IGUAL SUMA DE XIFRES:" << numero << "," << numero1;;
  4.    }
  5.  

Y no es válido hacer esto:

Código
  1. sumaXifres(numero) = n; /*A menos que la función retorne una referencia, y a esta se le asigna el valor de la variable 'n'*/
  2.  

En fin, si lo que quieres es ir guardando valores de manera indefinida e ir registrando al mismo tiempo la suma de sus números que componen a ese entero puedes usar vectores.

Código
  1. int main() {
  2.  
  3.    int valor;
  4.    vector<int> enteros, sumas;
  5.  
  6.    cin >> valor;
  7.  
  8.    while(valor != EOS) {
  9.        enteros.push_back(valor);
  10.        sumas.push_back(sumaXifres(valor));
  11.        cin >> valor;
  12.    }
  13.  
  14.    return EXIT_SUCCESS;
  15. }
  16.  

Y luego recorrerás cada valor del vector hasta encontrar otro valor que coincida con la suma. Y lógicamente el valor de la suma tendrá el mismo índice que el del número entero en sí. Por lo que vas comparando el primer valor con el resto, y así sucesivamente con todos hasta dar con otro igual y luego muestras los 2.
37  Programación / Programación C/C++ / Re: [Ayuda] Librería dinámica. en: 14 Noviembre 2015, 14:06 pm
Oh, ya lo he pillado. No debí precipitarme en publicar esto, mi error. Un moderador por favor cierre el tema. :)
38  Programación / Programación C/C++ / [Ayuda] Librería dinámica. en: 14 Noviembre 2015, 13:34 pm
Bueno, iré al grano, me puse a crear una librería dinámica y para ser honesto no sé si estoy haciendo bien la importación/exportación.

Acá el código:

// main.h
Código
  1.  
  2. #ifndef __MAIN_H__
  3. #define __MAIN_H__
  4.  
  5.  
  6. #ifndef DLL_MATH
  7.    #define DLL_MATH __declspec(dllimport)
  8. #else
  9.    #define DLL_MATH __declspec(dllexport)
  10. #endif
  11.  
  12. int DLL_MATH suma(int a, int b);
  13. int DLL_MATH resta(int a, int b);
  14. int DLL_MATH multip(int a, int b);
  15.  
  16. #endif //__MAIN_H__
  17.  
  18.  

// main.cpp
Código
  1.  
  2. #include "main.h"
  3.  
  4. int DLL_MATH suma(int a, int b) {
  5.    return (a + b);
  6. }
  7.  
  8. int DLL_MATH resta(int a, int b) {
  9.    return (a - b);
  10. }
  11.  
  12. int DLL_MATH multip(int a, int b) {
  13.    return (a*b);
  14. }
  15.  
  16.  

Como verán es bastante simple, hasta ridículo. Si cambio el orden, es decir, de esta forma:

//main.h
Código
  1.  
  2. #ifndef __MAIN_H__
  3. #define __MAIN_H__
  4.  
  5.  
  6. #ifndef DLL_MATH
  7.    #define DLL_MATH __declspec(dllexport)
  8. #else
  9.    #define DLL_MATH __declspec(dllimport)
  10. #endif
  11.  
  12. int DLL_MATH suma(int a, int b);
  13. int DLL_MATH resta(int a, int b);
  14. int DLL_MATH multip(int a, int b);
  15.  
  16. #endif //__MAIN_H__
  17.  
  18.  

Sí funciona, pero a lo mejor he captado mal de dónde he leído, ¿no se suponía que si la macro no estaba definida se debía importar en la DLL, y una vez definida, exportar hacia el programa con el cual la estemos corriendo? Corregidme acá, por favor. :)
39  Programación / Programación C/C++ / Re: [Ayuda] Programa capicua en: 3 Noviembre 2015, 04:43 am
Como dice ivancea96, plantea el algoritmo en un papel y así te resultará todo más claro cuando lo pases a código ya que sabrá lo que tienes que hacer y no lo harás todo a "pegar" a ver si funciona.

Para invertir un número lo que tienes que hacer es tomar la última cifra, luego tienes que ir desplazándola para sumarle la siguiente, por lo que tienes que multiplicar por 10 y sumarle la siguiente, y así hasta que el valor del número a invertir sea cero.

Teniendo eso en mente, el código quedaría algo así:

Código
  1. #include <iostream>
  2.  
  3. int invertir(int n) {
  4.    int nInvertido = 0;
  5.  
  6.    while(n != 0) {
  7.        nInvertido = (nInvertido * 10) + (n % 10);
  8.        n /= 10;
  9.    }
  10.  
  11.    return nInvertido;
  12. }
  13.  
  14. int main() {
  15.    int numero;
  16.    std::cout << "Introduzca numero: "; std::cin >> numero;
  17.    std::cout << "Numero invertido: " << invertir(numero);
  18.    std::cin.get();
  19.    return 0;
  20. }
  21.  
  22.  
40  Programación / Programación C/C++ / Re: DESPLEGAR SERIE DE NUMEROS en: 3 Noviembre 2015, 04:06 am
Simplemente cojes el valor inicial y lo vas aumentando hasta llegar al valor final y eso es todo. Un búcle for podría servirte para ello.
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5.    int inicio, fin;
  6.  
  7.    cout << "Numero inicial: "; cin >> inicio;
  8.    cout << "Numero final: "; cin >> fin;
  9.  
  10.    for(int h = inicio; h <= fin; ++h) {
  11.        cout << h << endl;
  12.    }
  13.  
  14.    cin.get();
  15.    return 0;
  16. }
  17.  
  18.  
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines