Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - K-YreX

#161
Claro.

En este caso en concreto no se ejecuta por 2 motivos:
  • La variable creada es del tipo de la struct derivada. Entonces se llama a la función definida ahí.
  • Una función virtual se define así para eso, para poder llamar a la función más adecuada en tiempo de ejecución

    Si creas las funciones sin usar virtual, se decide en tiempo de compilación a qué función llamar:
    Código (cpp) [Seleccionar]

    struct Base {
      void show(){
        cout << "Base" << endl;
      }
    };

    struct Derived : Base {
      void show(){
        cout << "Derived" << endl;
      }
    };

    int main(){
      Base b;
      b.show(); // b es de tipo Base, se muestra: Base
      Derived d;
      d.show(); // d es de tipo Derived, se muestra: Derived
      // LA DIFERENCIA ESTA AQUI:
      Base *p = &b;
      p->show(); // El puntero es de tipo Base, se muestra: Base
      p = &d;
      p->show(); // El puntero sigue siendo de tipo Base, se muestra: Base
    }


    En cambio, si definimos la función como virtual:
    Código (cpp) [Seleccionar]

    struct Base {
      virtual void show(){
        cout << "Base" << endl;
      }
    };

    struct Derived : Base {
      void show(){
        cout << "Derived" << endl;
      }
    };

    int main(){
      Base b;
      b.show(); // b es de tipo Base, se muestra: Base
      Derived d;
      d.show(); // d es de tipo Derived, se muestra: Derived
      // LA DIFERENCIA ESTA AQUI:
      Base *p = &b;
      p->show(); // La variable a la que apunta es de tipo base, se muestra: Base
      p = &d;
      p->show(); // La variable a la que apunta es de tipo derived, se muestra: Derived
    }


    No sé si se ve bien. La diferencia es que si la función es virtual, en tiempo de ejecución se comprueba de qué tipo es la variable a la que está apuntando un puntero y se utiliza su función correspondiente. Si no se usa virtual, el compilador coge el tipo del puntero y llama a la función de su clase sin importarle de qué clase es la variable a la que apunta.
#162
Entiendo que lo que quieres hacer es encontrar el valor del elemento más grande del primer array y la posición del elemento más grande del segundo array, no?

Tienes algunos problemas que son los siguientes:
  • Empiezas a rellenar el array en la posición 1 y acabas en la 5 (incluida). Los arrays tienen longitud 5 y como en C/C++, el primer índice es el 0, deberías recorrer desde 0 hasta 4 (incluido). {0,1,2,3,4} -> 5 posiciones. La posición 5 queda fuera del array.
  • En la función EncuentraMayor() no buscas los índices en los que se encuentre el elemento más grande sino cuántas veces aparece el elemento más grande. Esto es porque incrementas la variable cont cada vez que lo encuentras.

    Además como consejo te recomiendo utilizar constantes para los tamaños y cuando trabajes con arrays como parámetros, pasa como parámetro también la longitud de este, así haces las funciones más genéricas y las puedes reutilizar más veces:

    #include <stdio.h>

    const int MAX_SIZE = 5;

    int main(){
      int v1[MAX_SIZE], v2[MAX_SIZE];
      // Guardar los valores en los arrays. Recuerda: desde el 0 hasta el MAX_SIZE-1.
      for(int i = 0; i < MAX_SIZE; ++i){
        printf("Introduce el valor %d: ", i+1);
        scanf("%d", &v1[i]);
      }
      //...
      int valorMaximo = buscarMayor(v1, MAX_SIZE);
      mostrarIndices(v2, valorMaximo);
    }


    Como ves, la función buscarMayor() es igual solo que recibes la longitud como argumento. Su definición deberá ser:
    int buscarMayor(int v[], int size);

    En el caso de la segunda función, como puede ser que más de un elemento tenga el valor buscado, no podemos devolver el índice como un <int>. Se puede hacer devolviendo un array o modificando un array pasado como argumento pero como supongo que estás empezando, también puedes mostrarlo directamente en la función.
    void mostrarIndices(int v[], int valorBuscado);
    En esta función lo que tienes que hacer es cada vez que un elemento del array sea igual a <valorBuscado> muestras un mensaje con el índice que tiene tu iterador del bucle en ese momento.

    Inténtalo y si tienes algún problema coméntalo. :-X
#163
Estoy empezando a programar en Android por medio de Android Studio y se me está haciendo desesperante. Es por temas de estudios y tengo que desarrollar aplicaciones Android usando Java desde este IDE.

Principalmente, los problemas que tengo con este IDE son:
  • Los tiempos de carga cuando abro un proyecto no son pequeños que digamos y eso que son proyectos muy sencillos.
  • Cada vez que ejecuto una aplicación, es bastante lento construyendo el proyecto también. Además los proyectos aumentan mucho de tamaño al ser construidos. No sé si será por la plataforma (Android) o por el IDE pero nunca me ha pasado esto con proyectos de escritorio de Eclipse (Java) o Visual Studio (C#).
  • Los AVDs no son muy de fiar. He tenido problemas para ejecutar algunos intents implícitos en estos porque no se lanzan y al final he tenido que probar las aplicaciones en mi dispositivo (lo cual también es una pesadilla tener que estar siempre con el móvil conectado).
  • La vista de Diseño de los xml tampoco es muy de fiar. En ocasiones los componentes no se actualizan correctamente hasta después de ejecutar la aplicación.

    He intentado utilizar el plugin de Genymotion para virtualizar los dispositivos Android pero este sólo está disponible hasta la versión 4.0 de AS. Ahora mismo que la última versión estable es la 4.1, no se puede instalar este plugin.

    Quería saber si hay alguna forma o alternativa de solucionar al máximo estos inconvenientes pues se me está haciendo, como ya digo, desesperante desarrollar en Android.
#164
Cita de: [D]aniel en  9 Noviembre 2020, 22:11 PM
Esta parte me llama la atención:
cout<<"proceso"<<x+1<<"

proceso es un string y lo estás intentando unir con un tipo int por lo que eso dará error, no se en C++ pero al menos en Python hay que pasar de int a string, es decir hacer el cálculo el int, luego pasarlo a string y después unirlo, también podes usar la función eval() para hacer el cálculo y unir con cadenas string.

Saludos
En C/C++ no es necesario castear esos valores.
Ese código es válido.
#165
Programación C/C++ / Re: Marca error en sintaxis
10 Noviembre 2020, 09:34 AM
El error como tal está en las cabeceras.
Estás incluyendo dos veces <string.h> cuando no la usas para nada y no estás incluyendo <stdlib.h> que es la que contiene las funciones malloc() y free().

Supongo que es un programa de prueba porque digamos que no sirve de mucho imprimir el valor de un puntero cuando ya lo has liberado.

Además es aconsejable castear el valor de retorno de malloc() ya que es <void*>:
int *p = (int*)malloc(sizeof(int));

Y en el caso de que no haya espacio para reservar el puntero, el trozo del if-else funcionará bien pero al llegar a la línea 14, intentarás liberar una memoria que no está reservada... -> Error.
#166
Antes que nada, para futuras publicaciones introduce tu código entre etiquetas de Código GeSHi seleccionando el lenguaje adecuado.
En este caso ya lo he modificado yo, pero como digo, para otra ocasión.

En un primer vistazo veo:
  • La función <piladebusqueda(int, int)> no está implementada, sólo está definida.
  • Y la función <anadir()> más de lo mismo.

    Como consejos te diría que:
  • Las variables globales no son recomendables.
  • No utilices la biblioteca <conio.h> de no ser estrictamente necesario (tu caso no lo parece). No es estándar.

    Y como consejo para las publicaciones en este o cualquier otro foro:
  • Asegúrate de que el código es fácil de entender. Tanto en cuanto a nombres de variables/funciones como a identación.
  • Especifica tu error. Copia el error que te aparezca o comenta la situación concreta en la que el programa falla. Acota el error lo máximo posible para que quien te ayude pueda ir directo a una zona.

    Si pegas tu código diciendo que hay un error y que alguien te lo solucione, no creo que haya muchos dispuestos a hacerlo. En cambio si dices: "me sale el siguiente error al compilar: <copias el error>" o "para el caso ... funciona bien pero para el caso ..., no"; seguramente haya más personas dispuestas a ayudar.




    EDIT: Después de responder ya he visto el mensaje de error (en el asunto del tema).
    Puede ser que tengas el mismo programa ejecutándose y no lo hayas finalizado. Comprueba eso.
#167
Cita de: georginho30 en  5 Noviembre 2020, 20:27 PM
y como se metería esa ecuación dentro de un for? porque lo que se me da mal de c es usar lenguaje matemático
No vamos a darte la tarea hecha.
Intenta hacerlo tú y será entonces cuando aprendas.

Si no lo consigues, adjunta tu código usando las etiquetas de Código GeSHi y el problema concreto que tienes y entonces será más fácil que alguien intente ayudarte.
#168
Ya te adelanto que no vas a conseguir unos círculos perfectos pero es lo que se puede hacer.

Para dibujar un círculo tienes que aprovechar la propiedad de que un círculo de radio r está formado por todos los puntos que se encuentran a una distancia de r desde el centro.
La distancia entre dos puntos A(xa, ya) y B(xb, yb) se calcula como: d(A,B) = raiz((xa - xb)^2 + (ya - yb)^2).

PD: Cuanto mayor sea el círculo mejor se verá. Para "círculos" muy pequeños, el resultado serán cuadrados  :-\
#169
Programación C/C++ / Re: Algoritmo
5 Noviembre 2020, 00:44 AM
Como ya te comenté, depende mucho de cómo tengas estructurado tu código. Pero a grandes rasgos, aunque la función sea de tipo void puedes poner un return y hacer que termine.

void func(){
 printf("Hola ");
 return;
 printf(" Mundo!");
}


SALIDA:
Hola



También puedes usar una variable de control que mientras sea válida, sigue y cuando no lo sea, termine.
#170
Programación C/C++ / Re: Algoritmo
4 Noviembre 2020, 19:50 PM
Eso es porque no puedes usar el operador de módulo (%) entre un número decimal y un entero.
producto1 += digito * ((int)pow(2,i) % 11);
Con esto haces un casting a int de la potencia de 2 truncando su parte decimal y después obtienes el resto de dividir ese número entre 11.