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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


  Mostrar Mensajes
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12
1  Programación / Programación C/C++ / Re: alguna forma de pasar una funcion miembro como argumento a otro miembro de clase? en: 18 Abril 2022, 04:47 am
Hola!
Acá puedes usar el concepto de "friends" (https://isocpp.org/wiki/faq/friends)

Una cosa espantosa puede ser algo así...

Código
  1. #include <iostream>
  2.  
  3. //ClaseB
  4. class ClaseB {
  5.    friend class ClaseA;
  6. public:
  7.    void Beta(class ClaseA* a);
  8. };
  9.  
  10. //ClaseA
  11. class ClaseA {
  12. private:
  13.    ClaseB* b;
  14.    bool hecho = false;
  15.    friend class ClaseB; // https://isocpp.org/wiki/faq/friends
  16.  
  17. public:
  18.    ClaseA() : b{ new ClaseB } {}
  19.    ~ClaseA() { delete b; }
  20.    void Alpha();
  21.  
  22. };
  23.  
  24.  
  25. //ClaseA fuente
  26. void ClaseA::Alpha() {
  27.    //hacer algo
  28.    if (hecho)
  29.        return;
  30.    b->Beta(this);      //invoco a ClaseB::Beta()
  31.    std::cout << "Alpha";
  32.    hecho = true;
  33. }
  34.  
  35. //ClaseB fuente
  36. void ClaseB::Beta(class ClaseA* a) {
  37.    //el hilo proveniente de ClaseA::Alpha pasa por aqui...
  38.    //hacer algo
  39.    //invocar de vuelta a ClaseA::Alpha() desde un principio...
  40.  
  41.    if (a->hecho)
  42.        return;
  43.    a->hecho = true;
  44.    std::cout << "Beta";
  45.    a->Alpha();
  46. }
  47.  
  48. // Lo que busco hacer es llamar desde ClaseA::Alpha() a ClaseB::Beta(), luego ClaseB::Beta() debe invocar a ClaseA::Alpha() de vuelta.
  49.  
  50. int main()
  51. {
  52.    ClaseA a;
  53.    a.Alpha();
  54.  
  55. }
2  Programación / Programación C/C++ / Re: Línea de Código : duda en: 17 Diciembre 2021, 17:18 pm
Una más...

Código
  1. int arreglo[ cantidad ];
error C2131: expression did not evaluate to a constant arm64 msvc v19.latest

cantidad no es constante, lo que hace que esta no sea una expresión válida C++.
Es válida en C99, pero no lo es no lo fue nunca en C++.

Se trata de VLA "Variable Length Array" (array de longitud variable). Algunos compiladores lo implementan como una extensión al lenguaje pero otros no, por ejemplo del del Visual Studio...

3  Programación / Programación C/C++ / Re: templates : T y T* en: 5 Octubre 2021, 08:04 am
Hola, creo que te facilitará la idea si consideras que en

Código
  1. template <typename T>
  2. void my_function ( T _param);

T es el tipo del parámetro _param, o lo que es lo mismo: "el tipo de _param es T"; como cuando se tiene int i = 5; decimos que el tipo de i es int, o que i es de tipo int. (Fíjate que le he dado la vuelta a la forma en que lo dices).

Cuando se tiene int* p; se dice que p es de tipo int* (Como el C++ está más centrado en tipos que el C, es por eso que se prefiere escribir int* p en lugar de int *p).

En el ejemplo de acá abajo, la función genérica f tiene un parámetro t de tipo T*. Creo que al decirlo de esta manera se percibe más claramente la idea.

Código
  1. #include <iostream>
  2. #include <typeinfo>
  3.  
  4. template<typename T>
  5. void f(T* t) {
  6.    std::cout << "type: " << typeid(t).name() << '\n';
  7. }
  8.  
  9. int main()
  10. {
  11.    int* p = new int(6);
  12.  
  13.    f<int>(p);  // en esta funcion el tipo de t es "int*".
  14.    f(p);       // es lo mismo ("Template argument deduction")
  15.  
  16.    f<int*>(&p); // en esta segunda funcion el tipo de t es "int**"
  17.    f(&p);       // es lo mismo ("Template argument deduction")
  18.  
  19.    std::string str = "hola";
  20.    f(&str);
  21. }



4  Programación / Programación C/C++ / Re: La cantidad de cifras significativas que soporta C ++ se ven afectadas en: 26 Agosto 2021, 02:40 am
Fue mi error, std::numeric_limits está en <limits>

Acá va un ejemplo donde se muestra la capacidad de representación como número decimal en punto flotante de un float, double o long double que garantiza el lenguaje:


Código
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <limits>
  4. #include <string>
  5.  
  6. int main()
  7. {
  8.    std::streamsize p_inicial = std::cout.precision(); // precision inicial
  9.    std::cout << "precision inicial = " << p_inicial << "\n\n";
  10.  
  11.    std::string s = "2.99999999999999999999999999999";
  12.    std::cout << "s = " << s << '\n';
  13.  
  14.    std::cout << std::fixed;
  15.  
  16.    float f = stof(s);
  17.    std::cout << "float " << f << '\n';
  18.    std::cout << std::setprecision(std::numeric_limits<float>::digits10-1); // -1 para la cantidad de decimales
  19.    std::cout << "float: " << std::numeric_limits<float>::digits10 << " digitos significativos.\n";
  20.    f = stof(s.substr(0UI64, std::numeric_limits<float>::digits10+1)); // +1 por el punto decimal
  21.    std::cout << f << "\n\n";
  22.    std::cout << std::setprecision(p_inicial);
  23.  
  24.    double d = stod(s);
  25.    std::cout << "double " << d << '\n';
  26.    std::cout << std::setprecision(std::numeric_limits<double>::digits10-1);
  27.    std::cout << "double: " << std::numeric_limits<double>::digits10 << " digitos significativos.\n";
  28.    d = stod(s.substr(0UI64, std::numeric_limits<double>::digits10+1));
  29.    std::cout << d << "\n\n";
  30.    std::cout << std::setprecision(p_inicial);
  31.  
  32.    long double ld = stold(s);
  33.    std::cout << "long double " << d << '\n';
  34.    std::cout << std::setprecision(std::numeric_limits<long double>::digits10 - 1);
  35.    std::cout << "long double: " << std::numeric_limits<long double>::digits10 << " digitos significativos.\n";
  36.    ld = stod(s.substr(0UI64, std::numeric_limits<long double>::digits10 + 1));
  37.    std::cout << ld << "\n\n";
  38.    std::cout << std::setprecision(p_inicial);
  39. }
  40.  
  41.  
5  Programación / Programación C/C++ / Re: La cantidad de cifras significativas que soporta C ++ se ven afectadas en: 25 Agosto 2021, 03:13 am
Cada compilador implementa los tipos de punto flotante más o menos igual, aunque hay algunas peculiaridades (como el Visual Studio, que usa la misma representación para double que para long double).

Pueden ver en std::numeric_limits<T>::digits10
https://en.cppreference.com/w/cpp/types/numeric_limits/digits10

Por ejemplo:

Código
  1. #include <iostream>
  2. #include <numeric>
  3.  
  4. int main()
  5. {
  6.    std::cout << "cantidad de digitos que pueden representarse sin redondeos ni desbordamiento :\n";
  7.    std::cout << "float: " << std::numeric_limits<float>::digits10 << " digitos significativos.\n";
  8.    std::cout << "double: " << std::numeric_limits<double>::digits10 << " digitos significativos.\n";
  9.    std::cout << "long double: " << std::numeric_limits<long double>::digits10 << " digitos significativos.\n";
  10. }
  11.  
6  Programación / Programación C/C++ / Re: Saber la memoria liberada con free() ? en: 1 Julio 2021, 01:34 am
¿hay una manera de saber la memoria que liberaste con free()?

No.

La forma y la cantidad de memoria asignada con malloc, calloc o realloc depende exclusivamente de tu compilador ("implementation defined"). Algunos compiladores suelen asignar un bloque de memoria mayor al que estrictamente se necesitaría, para poder disponer de información de cuánta memoria dinámica deberá liberar free().

Por ejemplo, un método frecuente en algunos compiladores es escribir primero datos sobre el tamaño, un checksum, un par de punteros a los bloques anterior y siguiente, algún marcador. y alguna cosa más, y a continuación los bytes que se solicitaron como múltiplos de 16 (a modo de optimización).

En tu ejemplo sería: primero calloc busca memoria para esa estructura de datos más la cantidad num * sizeof(int) de bytes a alojar como múltiplo de 16 (si necesita alojar 10 int, digamos 40 bytes, agregará 48 = 16*3).

Luego, la dirección devuelta por calloc es la dirección donde comienzan esos datos iniciales, no donde comienza la serie de ints.

Pero como te decía, el mecanismo real depende de cada compilador, de modo que lo que funcione para el tuyo no necesariamente funcionará para otro.



7  Programación / Programación C/C++ / Re: ¡¡¡AYUDA!!! [C++] en: 17 Junio 2021, 01:42 am
Te paso una: en C++ no se puede llamar a main()
8  Programación / Programación C/C++ / Re: Punteros en c++ en: 26 Mayo 2021, 22:41 pm
Bueno, no, no está bien.

    int x;
    int *y;  // (1) y es un puntero sin inicializar
 
    x = 3;
    *y = x;  // (2) se usa una dirección de memoria que no fue inicializada. 

(1) debería llamar la atención
(2) es un error.


9  Programación / Programación C/C++ / Re: Mi primer programa en C. en: 19 Abril 2021, 02:35 am
En este caso tu profesor te pide que uses una función de biblioteca para mostrar en la consola una distribución de ciertos caracteres en una determinada disposición. No es un problema específico del lenguaje C, es un problema específico del uso de alguna función de biblioteca en particular, un juego de caracteres en particular y una consola en particular.

Por ejemplo, tu caso es estudiar cómo funciona y cómo se usa printf(), con un juego de caracteres específico sobre una consola en particular. Ni el juego de caracteres ni la consola que estés usando tienen nada que ver con el lenguaje C. El lenguaje C tiene que ver sólo con printf(), el resto es hojarasca del entorno.

Si puedes cambia de profesor.
10  Programación / Programación C/C++ / Re: ¿Se puede usar la librería de #include <ncurses> en C? en: 11 Diciembre 2020, 03:34 am
Si, si estás en windows tendrás que usar Cygwin
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines