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

 

 


Tema destacado: Curso de javascript por TickTack


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12
71  Programación / Programación C/C++ / Re: Representación visual de punteros y punteros a punteros.. en: 2 Mayo 2019, 22:36 pm

No. Es tal cuál lo puse. Reitero, yo me estoy guiando en lo que digimikeh pidió, que es un tamaño de 10x10.

Ah, Ok, cierto.
72  Programación / Programación C/C++ / Re: Representación visual de punteros y punteros a punteros.. en: 2 Mayo 2019, 21:09 pm
RayR; hay una falta de ortografía en tu ejemplo:

Código:
int **matriz = new int*[10];
for(int i = 0; i < 10; i++)
    matriz[i] = new int[10];

debería ser:
Código:
int** matriz = new int* [10];
    for (int i = 0; i < 10; i++)
        matriz[i] = new int; // sin el [10]

Amplío un poco el ejemplo que muestra un ciclo completo:

Código:
#include <iostream>

int main()
{
    // puntero a un array de 10 punteros a int
    int** matriz = new int* [10];
    for (int i = 0; i < 10; i++)
        matriz[i] = new int{i};  // cada uno de esos 10 punteros con valores inicializados con el indice i.

    // a ver...
    for (int i = 0; i < 10; ++i)
        std::cout << *matriz[i] << '\n';
    std::cout << '\n';

    // deletes:
    for (int i = 0; i < 10; ++i)
        delete[] matriz[i];
    delete[] matriz;
   
}
73  Programación / Programación C/C++ / Re: Representación visual de punteros y punteros a punteros.. en: 2 Mayo 2019, 20:49 pm
Aprovechando que este es un tema un poco recurrente, creo que este programita puede ayudar a aclarar un poco dónde están las cosas. Puedes convertir las salidas en hexadecimal a decimal si te resulta más cómodo (calculadora de Windows o la que te guste) y ver que los punteros están realmente lejos unos de otros.

Código
  1. #include <iostream>
  2.  
  3. int main()
  4. {
  5.    const char* puntero_probablemente_a_zona_de_solo_lectura = "hola";  // segmento "data" en el ejecutable
  6.    std::cout << "apunta al string literal: \"" << puntero_probablemente_a_zona_de_solo_lectura << "\"\n";
  7.    std::cout << "su direccion es: "
  8.        << (void*)puntero_probablemente_a_zona_de_solo_lectura << "\n\n";
  9.  
  10.    const char* puntero_a_heap = new char[6] { "adios" };  // asignación "dinámica" en heap, usa new / delete
  11.    std::cout << "apunta a la C string en heap: \"" << puntero_a_heap << "\"\n";
  12.    std::cout << "su direccion es: "
  13.        << (void*)puntero_a_heap << "\n\n";
  14.    delete[] puntero_a_heap;
  15.  
  16.    char ch = 'a';
  17.    const char* puntero_a_stack = &ch;  // en el stack frame de main
  18.    std::cout << "apunta al char en stack: \'" << *puntero_a_stack << "\'\n";
  19.    std::cout << "su direccion es: "
  20.        << (void*)puntero_a_stack << "\n\n";
  21.  
  22. }

74  Programación / Programación C/C++ / Re: Duda sobre una parte del libro de k&r en: 1 Mayo 2019, 05:59 am
Tú dices:
Citar
Más adelante dice:
"La declaración static, aplicada a una variable o función externa, ...

En esta porción de tu pregunta encuentro dos problemas:

1.- Un error del traductor:
Donde dice:
Citar
La declaración static, aplicada a una variable o función externa, ... "
El original dice:
Citar
"The static declaration, applied to an external variable or function, ...."

El problema aquí es que las variables pueden ser "externas" (en el sentido de que no están definidas en el cuerpo de una función sino fuera), pero no las funciones. Quizá pudo haberse traducido por:
Código:
La declaración static, aplicada a una variable externa o a una función, ..."

Este punto no hace a la cuestión, pero me pareció que valía la pena aclararlo. El otro problema que encuentro es:

2.- Un descuido tuyo:
Comienzas diciendo
Citar
"Más adelante dice: ..."

El problema aquí es que esa frase que citas está incompleta, la primera parte es importante a la idea esta de nombres de cosas "visibles" u "ocultas" para quién y desde dónde.

La frase de la versión en inglés que veo ahora comienza diciendo
Citar
"The variables sp and val in stack.c , and buf and bufp in getch.c , are for the private
use of the functions in their respective source files, and are not meant to be accessed by
anything else."

Que aunque no tengo tu traducción, supongo que debe estar de alguna manera. Mal, bien o más o menos, como siempre, pero algo debe decir ¿verdad?. Supongo que si lees esa primera parte te podrás formar una mejor idea sobre a qué se refieren los autores con "visible" o "no visible" en este contexto.


75  Programación / Programación C/C++ / Re: Duda sobre una parte del libro de k&r en: 1 Mayo 2019, 03:55 am
Citar
¿Qué significa "ocultar nombres" y que "no son visibles"?

En general creo que conviene tener algún cuidado y no olvidar que lo que se está leyendo es una traducción; así que al estilo de los autores, no siempre la mejor prosa posible, naturalmente, también hay que añadir la buena o mala suerte del traductor.

Yo entiendo que en la frase que citas, la relación es:
Código:
Las variables no son visibles (a los meros usuarios de getch y de ungetch) porque tienen sus nombres ocultos (gracias a que han sido declaradas "static"). 

El problema que veo en el ejemplo es que ni buf ni bufp están declaradas "static", lo que no ayuda mucho al entendimiento. Pero si pones:

Código
  1. #include <stdio.h>
  2. #define BUFSIZE 100
  3.  
  4. static char buf[BUFSIZE];  ///< ahora buf esta declarada "static"
  5. static int bufp = 0;       ///< bufp tambien.            
  6. itn getch(void) {
  7.   ...
  8. }
  9.  
  10. void ungetch(int) {
  11.   ...
  12. }

Pero... aunque las variables no fueran declaradas "static", de todos modos sus nombres tampoco serían "visibles" fuera del archivo getch.c, a no ser que se las declare como "extern" en un header, por ejemplo.

Como ves, la cosa no es muy lineal, ahora además de "static" apareció "extern". Bueno, creo que hubiera convenido presentar antes la declaración "extern", que hace que se puedan compartir variables entre archivos. ¿Me disculpas? Te lo dejo a ti.

De todos modos, la idea es que:
Código:
Al declarar las variables globales como "static", se está prohibiendo su acceso desde otros archivos (se ocultan sus nombres, ya no serán visibles desde otros archivos, incluso aunque algún pícaro o descuidado las declare "extern")

[Nota]
- Pero, ¿a quién se le ocultan esos nombres, si yo los estoy viendo y supongo que tú también?
- Al compilador hombre, ni a tí ni a mí, al compilador.
[/Nota]
76  Programación / Programación C/C++ / Re: Símbolos no encontrados para arquitectura x86/x64 en: 24 Abril 2019, 00:33 am
Citar
Y al parecer, char * es una excepción a la regla, es lo único que implícitamente solicita memoria dinámica ...

No, no se trata de una excepción, lo que sucede es que las expresiones como "data.db" son de tipo "string literal", que tienen"static storage duration" [https://en.cppreference.com/w/c/language/static_storage_duration], por lo que existen durante toda la vida del programa y se inicializan antes de main().

Por ejemplo, el tipo de "data.db" es const char[8] (los 7 caracteres visibles más el 0 del final). Como los arrays decaen en punteros, es también natural escribir:
Código:
const char* file_name = "data.db";
Entonces, file_name es un puntero a carácter que apunta a la primera 'd' del array, se le asigna esa dirección de memoria, que ya existe, por eso es que no es necesario crearla.

Otra cosa; al declarar las variables "static", si vas a poner tu UTools en un .h, estarás haciendo que cada unidad donde se incluya (cada .cpp) tenga su propia copia de todas esas variables. En este caso son todas const char* y nadie las va a modificar, pero de todos modos creo que conviene tenerlo en cuenta.

77  Programación / Programación C/C++ / Re: Duda sobre sintaxis: Un argumento que hace referencia a una funcion... en: 18 Abril 2019, 03:07 am
Citar
Bajo que circunstancias se puede usar puntero a función y método miembro?

En C++ hay funciones pero no "métodos", algunas veces se dice así por costumbre adquirida en otros lenguajes, pero en C++ sólo hay funciones, algunas serán "member functions" y otras no, pero no hay más.

Y francamente no tengo una respuesta de esas iluminadoras, pero creo que en general se usa un puntero a función miembro más o menos de la manera en que se usa un puntero a función.

Como has estado viendo, QT Creator implementa sus event handlers usando punteros a funciones miembro.

Muchas veces puede usarse otro mecanismo para conseguir el mismo resultado, comúnmente apelando a las funciones virtuales.

También, en la biblioteca estándar están std::function que puede inicializarse con una función miembro, y está std::bind, que devuelve un function object que puede invocar una función (miembro o no), con sus parámetros de llamada asociados.

Aunque no encuentro un ejemplo simple donde pueda mostrarse fácilmente un uso indiscutible, se puede ver su uso en la aplicación del "Open-close principle" https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle; por ejemplo, en "The Safe Bool Idiom": https://www.artima.com/cppsource/safebool2.html


78  Programación / Programación C/C++ / Re: Duda sobre sintaxis: Un argumento que hace referencia a una funcion... en: 17 Abril 2019, 17:18 pm
Citar
Entonces las funciones también estarían ocupando un espacio en la memoria?

Los punteros a funciones sí, pero en tu caso no tienes un puntero a función sino un "puntero a función miembro", que es diferente.

Un puntero a función miembro no apunta a nada hasta que no se cree el objeto y se defina a qué función apuntará, y como es "implementation defined", dependerá del compilador si lo implementa como un puntero u otra cosa.

La sintaxis es un poco compleja; un ejemplo simple ya lo muestra:

Código
  1. #include <iostream>
  2.  
  3. class UnaClase {
  4. public:
  5.    void unMetodo()
  6.    {
  7.        std::cout << "UnaClase::unMetodo()\n";
  8.    }
  9. };
  10.  
  11. void unaFuncion(UnaClase* p, void(UnaClase::* pmf)())
  12. {
  13.    (p->*pmf)();  ///< recien aqui se define a que funcion de que objeto apunta el "puntero a funcion miembro" (pmf)
  14. }
  15.  
  16. int main()
  17. {
  18.    UnaClase unaClase;
  19.    unaFuncion(&unaClase, &UnaClase::unMetodo);  ///< debe invocarse con el objeto ademas del "puntero a funcion miembro";
  20.                                                 ///< y si la funcion miembro toma parametros, tambien habra que pasarselos.
  21. }

79  Programación / Programación C/C++ / Re: Duda de sintaxis.. en: 13 Abril 2019, 19:34 pm
No puedo decirte cómo son las reglas del C++/CLI, que ignoro olímpicamente, pero te comento para el C++ (sobreescribo tu ejemplo):

Código
  1. namespace Stuffs {
  2.    class UnaCosa {
  3.    public: ///< En C++ getTrue debe ser public para que pueda ser accedida desde fuera.
  4.        static bool getTrue() /*const*/ {  ///< En C++ una funcion miembro static no puede tener calificador de tipo
  5.            return true;
  6.        }
  7.    };
  8. }
  9.  
  10. int main() {
  11.    bool unaExpresion = Stuffs::UnaCosa::getTrue();
  12.  
  13.    //una instancia a UnaCosa
  14.    Stuffs::UnaCosa unaCosa;
  15.    unaCosa.getTrue();     //Esto deberia dar error verdad?
  16.                           ///< En C++ es una expresion valida, equivalente a Stuffs::UnaCosa::getTrue();
  17.  
  18.    //puntero
  19.    Stuffs::UnaCosa* p_unaCosa = new Stuffs::UnaCosa;
  20.    p_unaCosa->getTrue();   //Esto tambien deberia dar error, si?
  21.                            ///< En C++ es una expresion valida, equivalente a Stuffs::UnaCosa::getTrue();
  22. }
80  Programación / Programación C/C++ / Re: condicion de carrera c++ threads en: 3 Abril 2019, 21:43 pm
Citar
Lo que dijiste de la funcion print en el visual studio te da error al compilar o te compila sin problemas?
Me da error al compilar.
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