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ú

Temas - digimikeh

#1
Programación C/C++ / Typeid de tipos básicos
2 Noviembre 2021, 13:26 PM
buenas

Al imprimir en el terminal el nombre del tipo de unas variable me imprime solo la primera letra.

Código (cpp) [Seleccionar]

int m = 6;
std::cout << typeid(m).name();


Imprime: i
Es eso debido al compilador? Estoy usando Linux

Saludos


MOD: Movido el código dentro de la etiqueta GeSHi
#2
Programación C/C++ / templates : T y T*
5 Octubre 2021, 05:24 AM
Buenas señores..

Tengo una duda a medias... creo entender como va esto de las plantillas pero quisiera estar seguro.

Del siguiente codigo:
Código (cpp) [Seleccionar]
template <typename T>
void my_function ( T _param);



Entiendo que para este caso, T es un tipo generico que acepta cualquier clase de argumento (puntero, referencia o valor)
Como quien dice, no tiene formato, puede ser constante, estatico, etc...

Código (cpp) [Seleccionar]
int x = 19;
my_function ( x );  //en la plantilla, T se transformaria en int    ....     int _param = 19;

int * px = &x;
my_function ( px );  //en la plantilla, T se transformaria en int *    ....      int * _param = &x;


Como T es virgen (por decirlo de alguna forma), no esta pre-formateada, simplemente es una T sola, puede aceptar cualquier tipo de clase y con cualquier tipo de atributo... es asi?



Pero en este siguiente caso:
Código (cpp) [Seleccionar]
template <typename T>
void my_function ( T* _param);



Aqui T es puntero, entiendo que solo acepta una direccion de memoria u otro puntero, pero no un elemento por valor, ya que T* ha sido pre-formateado para funcionar solo como puntero.

Código (cpp) [Seleccionar]
int x = 19;
my_function ( x );  //esto produce un error porque x es un tipo, no un puntero....

int * px = &x;
my_function ( px );   //esto estaria bien, ya que seria una asignacion de puntero....



Segun entiendo, en el fondo la asignacion a un tipo plantilla es como si se comportara como override de funcion:


T = Acepta cualquier cosa por valor
T& = Acepta cualquier cosa solo que como referencia
T* = Preformateada para aceptar solo punteros o direcciones de memoria o referencias a punteros
const T = Preformateada para aceptar cualquier cosa por valor pero se transforma obligatoriamente en constante
const T& = Preformateada para aceptar cualquier cosa por referencia pero se transforma en constante
const T* = Preformateada para aceptar solo punteros o direcciones de memoria y lo transforma a constante.


En el siguiente ejemplo:
Código (cpp) [Seleccionar]
template <typename T>
void my_function ( const T* _param);

const float * pfloat = new float(12.5f);
my_function ( pfloat );   //esto se asignara bien.

float * pfloat2 = new  float (6.9f);
my_function ( pfloat2 );   //esto tendria el mismo efecto que pfloat ya que en la plantilla siempre quedara como const.




Es mas o menos como lo creo?

Saludos
#3
Programación C/C++ / extension .inl y .hpp
16 Septiembre 2021, 03:42 AM
Buenas estimados.

Estoy estudiando un libro de SFML, y en una de sus paginas al usar plantillas para cargar recursos menciona que cuando se trabaja con plantilla de clases es bueno renombrar la cabecera a .hpp y las definiciones de los metodos en .inl .. incluyendo dicho .inl al final del .hpp

El libro no explica claramente el por qué.
Se debe esto a alguna convencion o tiene un significado objetivo?


saludos y gracias.
#4
Hola amigos...

Estoy desarrollando un programa, y se esta volviendo un poco spaghetti, es un sistema de e-learning:

Tengo el siguiente escenario (para resumirlo):


class A{

    B objetoB;
    std::vector<C> objetosC;
   
};

class B{

    X objetoX;
    std::vector<Y> objetosY;


};

class  C { ...}
class X {...}

class Y {

    std::string palabra = "Hola";
}


//singleton.h
std::vector<A> todos_los_objetos_A;
std::vector<B> todos_los_objetos_B;




En mi caso son mas clases pero expuse esto para aislar mi duda...
encontrar un subobjeto Y y acceder a la variable "palabra" desde fuera se esta volviendo tremendamente tedioso... .. tan solo para modificar la palabra "Hola" a "Hello" (por ejemplo).. debo escribir lo siguiente:


singleton s;
s.todos_los_objetosA[0].objetoB.objetosY[2].palabra = "Hello";


Imaginar que el vector tiene 20 elementos al menos y que el total de clases son 10... y por si fuera poco, cada indice de vector debo calcularlo previamente tambien, luego una vez encontrado, debo excavar demasiado para modificar el bisnieto de una clase...  no se si hay alguna solucion para evitar esto, ya que es propenso a confusión y errores....  estuve pensando en deshacer las composiciones y dejar todos los vectores en singleton.h


//singleton.h
std::vector<A> todos_los_objetos_A;
std::vector<B> todos_los_objetos_B;
std::vector<C> todos_los_objetos_C;
std::vector<Y> todos_los_objetos_Y;


.. y acceder a los objetos de los subindices directamente en la raiz de la clase singleton...  esto rompe un poco el paradigma orientado a objetos pero me da la impresion de que es menos confusion...


Que harian en mi caso?  estoy usando base de datos.


Saludos.





#5
Redes / Balnceadores de carga
9 Abril 2021, 16:22 PM
Buenas..

Tengo una red de mas de 30 computadores y 3 proveedores de internet, un proveedor entrega 500mpbs, otro 200  y un tercero 60..

Mi intencion es que el balanceador utilice solamente la primera red (500) para que los equipos puedan navegar mas rapido, en caso de que ese proveedor se caiga o tenga problemas, solo ahi pasar al siguiente (200) y asi con el siguiente...

Es posible configurar un balanceador de esa forma?
O quiza haya alguna forma de distribuir los 3 proveedores paralelalmente por toda la red?.

O como recomiendan ustedes para este caso ?

saludos y gracias
#6
Hola.. espero que se encuentren bien.

Me ha asaltado una duda con las clases, sus miembros y punteros...  Suponiendo el siguiente ejemplo:


class Alpha{
private:
    ObjetoA  objA;
    ObjetoB  objB;
};


void main(){
    Alpha* a = new Alpha;
}


Desde main, un objeto de tipo Alpha se está almacenando en la memoria dinamica....
Pero el objeto Alpha tiene otros dos objetos que no son punteros, tambien se estan almacenando en la memoria dinamica?.... o estos dos se separan (fisicamente) de la clase y se almacenan en la pila?..

Saludos..
#7
Hola amigos..
Que pasa en este codigo que la funcion virtual do_xy() en x no se está ejecutando?

Código (cpp) [Seleccionar]

#include <iostream>

struct x{ 
  x(){}
  ~x(){}
 
protected:
  virtual void do_xy(){
      cout << "from x " << endl;     //esto no se ejecuta
  } 
};

struct y : public x{
  y(){}
  ~y(){}
 
public:
  void do_xy() override{
      cout << "from y " << endl;     //esto se ejecuta
  }   
};

int main(){
    y _y;
    _y.do_xy();
   
    cin.get();
    return 0;
}


Saludos.. gracias.
#8
Buenas a todos...

Revisando el código de un driver me di cuenta que se hace uso de valores hexadecimales, cual es su utilidad/ventaja ?



const uint8_t value0 = 22c;


Saludos
#9
buenas...

Me pregunto por qué no hay fallo de segmentacion (o indice fuera de rango en el vector) en el siguiente codigo..:

Código (cpp) [Seleccionar]

#include <iostream>
#include <vector>

class alpha{
private: 
    int x {0};
public:
    alpha(const int _x) : x{_x}{}
};

int main(){
    std::vector<alpha*> vA;
    for (int m{0}; m != 2; ++m) vA.push_back(nullptr);
   
    vA[0] = new alpha(0);   //OK
    vA[1] = new alpha(1);   //OK
    vA[2] = new alpha(2);   //Aqui debe arrojar un error de subscript fuera de rango..
   
    return 0;
 
}


La duda me vino ya que estoy desrarollando un programa en Qt Creator, estoy usando GCC pero ahi nunca me arrojó un error, luego probé compilar en windows con msvc y ahi me arrojo el error, luego al revisar el codigo encontré sentido que arrojara el error porque realmente la linea vA[2] esta fuera de rango, no hay nullptr empujado en el vector en ese indice.... pero GCC lo acepto de todas formas.. no comprendo por qué

saludos.!
gracias.

#10
Programación C/C++ / consulta sobre esta sintaxis..
10 Septiembre 2020, 19:33 PM
Hola amigos...

Primera vez que veo este tipo en una sintaxis... me da la idea que es un tipo de macro pero les pregunto a ustedes para estar seguros:


PT(AsyncTaskManager) taskMgr = AsyncTaskManager::get_global_ptr();


La linea está sacada de un Game Engine llamado Panda3D, entiendo que es un declaracion de una variable cuyo valor es el resultado de una funcion estática y que devuelve un objeto del tipo PT(AsyncTaskManager)

Mi duda es justamente con ese tipo, primera vez que veo un tipo que parece función, como se llaman o qué función cumplen?

Saludos y gracias


Edit::

Sospecho que es una clase functor (con el operador () sobrecargado).. puede ser?
#11
Programación C/C++ / Hilos
8 Julio 2020, 04:29 AM
Buenas noches...

Entiendo a modo muy general el tema de los hilos...
Al ejecutar el programa no está ejecutando ambos hilos al mismo tiempo, sino que ejecuta h1, espera a que termine y luego ejecuta h2... como logro que se ejecuten ambos a la vez?, entiendo que debo usar mutex para que no haya resultado inesperado con std::cout lo tengo en cuenta.. pero independiente de eso, mi objetivo es ejecutar los dos hilos a la vez. Saludos y gracias.



#include <iostream>
#include <thread>

int main(){
    std::thread h1(
                [](){ for (short x{0}; x != 11; ++x) std::cout << x << std::endl; }
    );
    h1.join();
   
    std::thread h2(
                [](){ for (short x{90}; x != 101; ++x) std::cout << x <<std::endl; }
                );
    h2.join();

    return 0;
}
#12
Hola amigos... Este post es a modo de cultura general.

Entiendo a esta altura como funciona la lógica de programar, algoritmos, etcetc... Es relativamente fácil... Sin embargo aun no entiendo como hicieron para crear un lenguaje de programacion a partir de la nada practicamente... 

Acaso Daniel Ritchie ( por nombrar uno) tenía conocimientos profundos de electronica?, como determinaron ellos el curso de un pulso eléctrico que va a la memoria?... Yo he usado protoboards y entiendo cuando la energía eléctrica viaja por los canales y se topa con resistencias y luego encienden un led... Pero eso es extremadamente básico comparado a lo que pienso que se tendría que hacer para generar lo necesario para que la palabra void tuviera un significado...

Lo que me intriga es la cantidad de abstracciones que hay entre una palabra y todos los pulsos eléctricos que hay detrás de ella...

Alguien tiene alguna idea de como funciona esto?

Saludos
#13
Hola amigos..

Siempre me ha pasado esto, cuando estoy seguro que tengo un diseño de mi software y estoy convencido de que funcionará el flujo de programacion, llego a mitad de camino y veo que se me ocurre algo mejor, deshago la mitad del código, vuelvo a escribir la nueva idea y pasa que encuentro otra mejor y vuelvo a deshacer... No me sirve de nada solamente saber la sintaxis ni lo que quiero conseguir, necesito algo mas, necesito alguna guía de diseño de software, tecnicas que me permitan hacer un pseudocódigo completo fluido y terminado y no estar perdiendo tiempo reescribiendo código...

Llevo haciendo dibujos en un cuaderno sobre diagramas UML, hago lineas por aqui, luego otras por alla, flechitas, diagramas de flujo y todo lo termino deshaciendo por algo que creo que esta mejor..  :-X

Alguna sugerencia?.. donde puedo buscar algo?
Gracias.
#14
Hola!

Antes mis programas eran con bases de datos locales sqlite, donde yo al iniciar el programa volcaba toda la informacion de la base de datos en la memoria (en vectores) y luego trabajaba directamente con tales vectores en vez de estar interactuando constantemente con la base de datos, luego tenia un boton "guardar" el cual subia todos los cambios a la BD...



Ahora estoy haciendo un programa cuyo objetivo es agregar personas a una tabla del programa, la cosa es que cada registro debe quedar guardado en una tabla en la base de datos mysql en un servidor remoto.

Ej:

Jorge en España a las 16:00 hrs UTC ingresa una persona a la bd
La tabla del programa de Jorge se actualiza con su registro correctamente

Jaime en Argentina a las 16:01 ingresa otra persona a la bd..
La tabla del programa de Jaime se actualiza con su registro correctamente

Como es que Jorge y Jaime actualizan sus tablas respectivamentes para que muestren ambos registros?... en teoria se como se hace, pero no se si es ortodoxo, se me ocurre que cada vez que uno de los dos guarde un registro se rellenen las tablas de los programas directamente de la base de datos y no de un vector interno del programa como lo hacia yo con sqlite ya que la informacion local de Jaime no seria la misma que la de Jorge..

Estara bien esto?

En el fondo para expresarme mejor, lo que necesito es que la tabla del programa sea una referencia de la tabla de la base de datos todo el tiempo, cada vez que se haga una operacion (agregar, modificar o quitar). que sean como espejos..

gracias
#15
Hola!.

He comprado 3 access point marca Ubiquiti, son del tipo platillo que va en el techo, el modelo es UAP AC LITE, he logrado configurar uno, me conecto a el y todo va bien, sin embargo el segundo me deja colgado, pareciera que no funciona como AP independiente, dice que el nombre Wifi del segundo hereda del nombre del wifi del primero.. es como si solo un nombre de SSID fuera disponible para los 3 APs.

Ubiquiti utiliza un controlador que ya instale y va bien.. pero esto de los nombres no lo entiendo, la idea es que cada AP tenga nombres distintos, ya que si no, va a ser difícil saber a cual me estoy conectando.

#16
Hola amigos..

Anteriormente habia hecho con otro amigo una plataforma web que usaba ISS con Windows Server, en este caso era facil porque los clientes accedian a través de un navegador por el puerto 81 (cuyo puerto fue abierto en el router en port forwarding) a la aplicacion web del servidor, luego el servidor se comunicaba internamente con la base de datos mysql en este caso.  Se usaba un servicio dyndns.

Ahora estoy haciendo un cliente desktop que se tiene que comunicar con una base de datos que esta alojada en un servidor en internet, la cosa es que como veran, ni el browser ni el puerto 81 tienen algo que ver aqui, la comunicacion ahora es directa entre un cliente desktop ubicado en la antartida (ejemplo) y una base de datos alojada en un servidor que esta en paris (ejemplo)·

Al no acceder por web browser, es el cliente desktop internamente el que tiene que ingresar por el puerto... esto ya esta listo!.. ya tengo configurado este desktop, el problema esta en como diantres configuro el servidor que aloja la base de datos, no se si tengo que hacer port forwarding (debido a que ya no sale por web).

El puerto configurado para la base de datos es 3306, tiene su root y password, tambien esta configurado el servicio no-ip... solo falta que desde fuera se puedan meter a la base de datos...

Alguna luz como hacer esto?

Saludos!  gy gracias.

#17
Bases de Datos / Conectores MySQL
21 Febrero 2020, 17:04 PM
Hola amigos!.

Estoy intentando utilizar MariaDB y el conector ODBC para que un cliente de cierto lugar del país acceda a un servidor remoto.

Se que tengo que instalar el conector MySql ODBC, lo que no se es donde va instalado, en el cliente o en el servidor?..

si fuera en el cliente, eso quiere decir que cada vez que el programa se instala en una computadora se debe configurar ODBC en dicha máquina?

saludos!
#18
hola amigos:

Tengo un dilema con una Base de Datos Ms SQL Server 2005... pasa que al cliente que utiliza esa bd se le llenaron dos tablas, sin espacio para dichas tablas no puede seguir trabajando, el problema es que la empresa que mantenia el sistema ya no existe y no hay forma de comunicacion con ellos, por lo que es imposible obtener el password de root o el puerto... Sin embargo, los archivos .mdf existen, hay algo que pueda hacer con esos archivos para liberar un poco las tablas o aumentarle el tamaño?.. o que puedo hacer en este caso?

gracias..

saludos.
#19
Hola amigos..

Tengo que diseñar un programa que será un cliente hecho en Qt C++, se debe conectar a una base de datos alojada en un servidor.

La situacion es que son 13 regiones, cada region tiene 15 modulos, y cada modulo utiliza 7 tablas independientes, entonces como verana son muchas muchas tablas (ese es mi concepto, posiblemente este equivocado), cada modulo ingresa informacion separada del resto, por eso pienso que son cientos de tablas...

Que se hace en este caso?

1) Crear una sola base de datos gigante que tenga 1365 tablas (13 x 15 x 7) y distinguirlas con un prefijo, ejemplo:  table_region0_modulo0_usuarios, table_region0_modulo0_direcciones, etc

2) Crear 13 bases de datos y 105 tablas por cada db..

3) Otra ...

All final, la idea es que cada modulo ejecute su cliente del programa, y se conecte al indice de su propio modulo y lea la informacion segun ese sufijo...


Como les he comentado, los registros de usuarios del modulo 0 no son los mismos que los del modulo 1.. por eso pense en crear muchas tablas..

Que hacer en este caso?
saludos y gracias.
#20
Hola!

Hago esta pregunta desde la ignorancia, entiendo que virtual/override ayuda mucho a no tener que redefinir trozos de codigo de una función, sin embargo no entiendo cual es el fin de las funciones virtuales puras, es decir, no implementan nada, solo veo que ocupan un espacio en el archivo de cabecera, al fin y al cabo de todas formas tendrás que volver a declararlas y definirlas en las subclases como override...



class A{
protected:
    virtual void hacer_algo() = 0;     //Esto me parece que estuviera de más.....
    //otras cosas..

};



class B : public A{
protected:
    void hacer_algo() override;   //.... si aqui tengo que estar escribiendolo nuevamente.

};


Por qué no directamente?:


class A{
protected:
    //otras cosas
};



class B : public A{
protected:
    void hacer_algo();
};

#21
Programación C/C++ / enums heredados ?
5 Octubre 2019, 04:44 AM
Buenas noches:

De la misma forma que se puede virtualizar una función y sobreemontarla en alguna clase hija... me pregunto si es posible hacer lo mismo con los enums....

por ejemplo:


class padre{

protected:
    virtual enum mis_objetos{    //virtual aqui?
         objPrincipal = 99
    };

    virtual void una_funcion(mis_objetos mo){
         //hacer algunas cosas previas que sirven para todas las subclases//
    }

}



class hija1 : public padre{

protected:
    enum mis_objetos override{
         obj0 = 0,
         obj1
    };

    void una_funcion(ms_objetos mo) override;
}




class hija2 : public padre{

protected:
    enum mis_objetos override{
         obj50 = 3,
         obj55
    };

    void una_funcion(ms_objetos mo) override;
}


Como verán, cada clase tiene sus propios elementos enum, sin embargo, para que la función una_funcion(mis_objetos) pueda sobremontarse, es necesario que el enum exista en el padre..

Es posible hacer esto? (con el codigo estoy especulando, lo mas seguro que tenga errores)

Gracias.
#22
Programación C/C++ / Variables estaticas...
29 Agosto 2019, 05:16 AM
Muy buenas..

Tengo un mal concepto quizá de lo que son las variables estáticas, yo las imagino algo asi como un contenedor que se crea automáticamente al iniciarse un programa, vive durante todo el programa y luego se cierra una vez que el programa termina... como un bolso de viaje que tomas al iniciar el viaje y te deshaces de él cuando regresas a casa... asi es como yo las veo.. (por favor, indicarme si estoy mal).

El siguiente código no esta reflejando esto:

main.cpp
Código (cpp) [Seleccionar]

#include <iostream>
#include "Archivo2.h"
#include "Archivo1.h"

int main() {
x::num = 10;
std::cout << "Desde main -> " << x::num << "Memoria : " << &x::num;
std::cout << std::endl;
Archivo1 a;
a.printVal();
return 0;
}



Archivo1.h
Código (cpp) [Seleccionar]

#pragma once
struct Archivo1{
void printVal() const;
};


Archivo1.cpp
Código (cpp) [Seleccionar]

#include "Archivo2.h"
#include "Archivo1.h"
#include <iostream>

void Archivo1::printVal() const {
std::cout << "Desde Archivo1 -> " << x::num << "Memoria : " << &x::num;

}


Archivo2.h
Código (cpp) [Seleccionar]

namespace x{
    static int num;
}



La salida de consola "Desde Main ->" imprime 10
La salida de consola "Desde Archivo1 ->" imprime 0...

Creí que estaba imprimiendo el mismo elemento, pero no, cuando le agregue que imprimiera la dirección de memoria, me encontré con la sorpresa de que ambas estan imprimiendo direcciones diferentes....

En qué momento se creó una nueva instancia de la variable estática y como puedo solucionar este dilema?.. mi intención es escribir e imprimir en una sola variable x::num

Saludos_!

#23
Buenas..

Tengo este código y me está saliendo error, ppienso que la sintaxis está correcta.. aun no entiendo por qué el error..  Alguna pista?


Ver en el siguiente enlace el codigo para probar:
https://onlinegdb.com/ryO2ptQ7B

Saludos.


Edit : Le quite el simbolo de referencia en el parámetro para la funcion de la linea 5 y ahí compiló..
Pero no veo por qué...
#24
Hola amigos.. que tal.

Tengo una gran duda, la verdad me confunde un poco el hecho de que se pueda inicializar una variable de 3 formas:

Código (cpp) [Seleccionar]

int x = 3;
int y {4};
int z(5);


Las 3 son válidas, bueno, así como se ve, no está complejo realmente, el problema es cuando usas elementos como un contenedor.. ya que los contenedores aceptan una lista de argumentos encerradas en llave, sin embargo esto me confunde un poco, porque no se cuando está inicializando o cuando está pasando por argumento a un constructor.. o cuando está usando un constructor de conversión.. etc..


Ejemplo:
Código (cpp) [Seleccionar]


vector<string> vs { "Hola", " Que tal"};     //No hay problema..
vector<string> vs2 { 5, 1 };                     //Houston

istream_iterator<string> is;
istream_iterator<string> is2;

vector<string> vs3{is, is2};                     //No hay problema.. por que?




Sospecho que en vs3 no estoy inicializando ... pensé que las llaves eran para eso... que esta pasando en esta línea?..


Saludos y gracias.


--------------------------------

Edito:

Estuve viendo los constructores que tiene std::vector y encontre uno que acepta un iterator de inicio y otro de fin... entonces eso es lo que debe estar aceptando, es decir,  vs3 no esta inicializando, solo le estoy pasando los iteradores que están conectados al flujo de entrada ifstream....  En el fondo lo que me habia confundido es el uso de las llaves, tenia entendido que las llaves servian para inicializar en los contenedores, pero ya vi que hace lo mismo que los parentesis, a menos que este poblando al contenedor, ahi seria una inicialización...

Saludos.
#25
Programación C/C++ / Error C2662 - const
7 Julio 2019, 18:15 PM
Hola amigos..

En el siguiente código, si yo quito la palabra const (línea 52) derivada de un template tipo C, el programa corre....


Link -> https://onlinegdb.com/SyW1F9kWS
Hagan clic en Fork para probar el código.

Estuve buscando por què pasa esto, segun el compilador no pudo realizar una conversion de un tipo que no es const a uno que es const...  entiendo que quitando la palabra const se acaba el problema, pero por que?.. y si no deseo retirar la palabra const donde mas debería agregarla para que pueda compilar?... (Pasa que el libro que estudio aparece con const, ero no veo diferencia realmente con lo que tengo).

Gracias.




Bueno, según un usuario de discord, me dijo que las funciones begin() y end() deben ser const también, y efectivamente colocándolas asi compiló correctamente.

Pero es curioso porque en el libro que estudio, dichas funciones no son const..

Ahora mismo estoy investigando por que´.




Si yo coloco las funciones begin() y end() como funciones no miembro, es decir, fuera de la clase o estructura, el compilador no las detecta...

Lnik -> https://onlinegdb.com/SJgL5ayZH


Debe forzosamente ser funciones miembro?

EI: NO HAGAS DOBLE POST NUEVAMENTE, SERA BORRADO.
#26
Hola amigos. que tal.

Tengo el siguiente caso:
Código (cpp) [Seleccionar]


#include <iostream>
#include <initializer_list>

struct x {
private:
    int * iArray = nullptr;
    int tam;       //Sin inicializar

public:
    x(std::initializer_list<int> lst) : iArray{new int[lst.size()}, tam{lst.size()}{
         std::copy(lst.begin(), lst.end(), iArray);
    }

    //Constructor de copia
    x(const x & otherX);
 
};

//Definición de constructor de copia (notar aquí que al momento de hacer
//la primera inicialización tam no ha recibido valor.
x::x(const x & otherX) : iArray{new int[tam]}, tam{otherX.tam}{
    for (int y = 0; y < tam; ++y){
         iArray[y] = otherX.iArray[y];
    }
}

int main (){
    x x0 {2, 4, 6};
    x x1 = x0;   //copia correcta...

    //prueba directa de asignacion de una variable no definida a un array dinamico:

    int x;
    int * arr = new int[x];     //error, x no está definida.
}


Como se puede observar, en la linea 22 se está inicializando el array dinamico con un tamaño de tam antes que inicializar al mismo tam, o sea, se esta inicializando con un valor desconocido...  sin embargo, esta funcionando bien, ahora bien, en la linea 35, se esta intentando crear un array dinamico con un tamaño x, pero no sirvio.... acaso la inicialización funciona distinto a la asignacion?

Gracias, saludos.

#27
Buenas..

Me ha causado extrañeza la forma en que se puede inicializar un tipo a traves de un argumento al constructor:

Código (cpp) [Seleccionar]

struct s {
private:
int x = 0;
public:
s(int _x) : x{ _x } {}
void p() const { std::cout << x; }
int getx() const { return x; }
};

int main() {
s _s(5);                                       //forma argumento a constructor 1
s _t = 6;                                     //forma argumento a constructor 2
s _u{ 7 };                                   //forma argumento a constructor 3
s _v = { 8 };                              //forma argumento a constructor 4

std::cout << std::endl;
std::cout << _s.getx() << std::endl; //salida : 5
std::cout << _t.getx() << std::endl; //salida : 6
std::cout << _u.getx() << std::endl; //salida : 7
std::cout << _v.getx() << std::endl; //salida : 8
return 0;
}


Siempre he inicializado un tipo (que reciba un argumento de constructor) con los parentesis, es decir, tal como sale en la salida 5, es decir:
Código (cpp) [Seleccionar]

s _s(5);



Sin embargo, estaba convencido que la siguiente linea solo tenia como fin la asignacion de un valor:
Código (cpp) [Seleccionar]

s _t = 6;


Me ha parecido curioso porque se supone que una asignacion por regla general debe tener el mismo tipo que el asignado... sin embargo, el tipo s no es un entero.


Entonces me pregunto si esa linea realmente es una asignacion o lleva otro nombre....



#28
Hola nuevamente:

El siguiente código:

Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

struct s{
   
private:
    double * d = nullptr;       
   
public:
    s() : d{new double}{}
    ~s(){ if (d != nullptr) delete d; }
    void setd(const double _d){ *this->d = _d; }
    double getd() const { return *this->d; }
   
};

s operator+(const s & _s0, const s & _s1){
    s ns;
    ns.setd(_s0.getd() + _s1.getd());
    return ns;
}

int main(){
   
    s s0;
    s s1;
   
    s s2;
    s2 = s0 + s1;
   
    return 0;
}



Aqui listo para ejecutar:
https://onlinegdb.com/rJNPQ68kr

Al ejecutar, obtengo el mensaje de error:

*** Error in `./a.out': double free or corruption (fasttop): 0x0000000000795c80 ***                                             
Aborted (core dumped)


Estoy seguro que el problema esta entre el puntero privado y el delete en el destructor, ya que si no uso puntero, compila bien.

Sin embargo, he puesto puntero porque quiero entender qué está pasando.  Me da la impresión de que en la definición del operador+ como se crea el objeto ns al terminar el ámbito, se está destruyendo y esta eliminando el puntero.  Lo cual parece valido, pero no tendría por qué corromper la ejecución, se supone que estoy destruyendo un objeto de copia, no los operandos utilizados.

#29
Hola..

haciendo algunos ensayos, me he encontrado con una sorpresa, cuando intento utilizar algún operador sobrecargado con un tipo propio, se ejecuta el constructor y el destructor al instante.... ej:

Código (cpp) [Seleccionar]


struct x{

private:
     int a;

public:
     x(){ std::cout << "Constructor ejecutado."; }
     ~x() { std::cout << "Deconstructor ejecutado."; }
     inline void setA(const int _a){ this->a = _a; }
     inline int getA() const { return this->a; }
}

std::ostream operator <<(std::ostream & _os, const x _x){
     _os << _x.getA();
     return _os;
}



int main(){

     x typeX;    //Constructor llamado como es usual..
     std::cout << x;     //Constructor y deconstructor llamados, por que?

}


#30
Hola !

He llegado al punto de practicar el static_assert(), entiendo ya como funciona y a que se refiere, seria basicamente una afirmacion a la fuerza y evaluada luego, si es falsa entonoces habra un error, si es verdadera, continuara con el programa.

Lo que entiendo (a diferencia de assert()) es que static_assert evalua en tiempo de compilacion, aqui esto no lo entiendo bien, a que se refiere con tiempo de compilacion ?....  mientras escribes el codigo o cuando haces el build?  Si si, entiendo que esta pregunta es absurda, se supone que tiempo de compilacion es cuando haces build, pero lo pregunto por lo siguiente:

Resulta que estoy en Visual Studio 2017, al escribir:

Código (cpp) [Seleccionar]


int main (){
    static_assert(sizeof(int) == 4, "Su sistema no es de 64bits");
    std::cout << "64 bits.";
   
}


No me va ningun error, es decir, todo bien... pero si le cambio el valor 4 por 5, o por cualquier otro, de inmediato VS me lanza un error, y la descripcion del error es justamente el segundo argumento "Su sistema no es de 64bits", esto quiere decir que static_assert esta evaluando mientras escribo el codigo, no cuando hago build..


Esto definitivamente no puede ser ni tiempo de ejecucion, ni tiempo de compilacion, como le podriamos llamar??..


Editado:
Parece que es el compilador de Microsoft el que hace esta verificacion en el tiempo de edicion, GCC parece no tenerla, no sale el error hasta que le doy build...  entonces SI que es en tiempo de compilacion, pero el compilador de MS te ahorra un poco mas de tiempo mostrandote mientras escribes...
#31
Hola!

"spam"
Por sugerencia de un usuario del foro me he comprado el libro "The C++ Programming Language 4th Edition - Bjarne Strouptup",
"/spam"  (perdón  :laugh:) entonoces he llegado a una parte que empieza a hablar sobre constexpr,  pero aun no entiendo bien su funcionamiento, es decir, es lógico que quiere decir que se pueden crear expresiones constantes, pero no le veo mayor diferencia con la palabra reservada const al menos por ahora....

Lo que llegue a comprender solamente es que no puedo asignarle valores no-constantes a una expresión constante.....  estoy seguro que es constexpr es algo muy muy útil...  alguna luz del para que sirve?

Gracias..
#32
Programación C/C++ / Sobrecarga de operador
15 Mayo 2019, 15:54 PM
Hola amigos..

Estoy experimentando con el contenedor set y tengo duda con el operador de sobrecarga que se necesita para meter al contenedor un tipo creado por mi mismo...

Según estuve leyendo y alguien me dijo también que necesito sobrecargar el operador <

Pero este operador menor que, en que forma hace la comparación de elementos?, el contenedor set no permite objetos duplicados, no seria mas lógico sobrecargar == en vez de < para comparar si el elemento ya existe?


#33
Hola..

Tengo una duda con el patron de diseño MVC:

Entiendo que todo lo que se refiere a la visual esta en V (View)
Y todo lo que corresponda a la lógica está en C (Controller)
Lo que pertenece a base de datos en M (Model)

Pero no me imagino como pueda organizarse todo esto, aun no entiendo como se separa.. por ejemplo, un botón es una mezcla de V y C, porque no solo es algo visual sino que ejecuta una función, es decir es programación y visual... a menos que la programación de los botones no entre en la capa de Controller...  si es así, qué entra en esta capa?..

Saludos y gracias.
#34
Hola

Me he topado con algo que no había visto antes.. es lo siguiente;

Código (cpp) [Seleccionar]

auto director = Director::getInstance();
auto glview = director->getOpenGLView();


director no es puntero, porque entonces utiliza el operador -> ?

Gracias
Saludos
#35
buen dia..

Todo este tiempo me he imaginado la memoria de un computador tal como se llama : RAM Random Access Memory, ya saben, de acceso aleatorio, pero al tratar de entender que es el Stack, me ha confundido un poco este concepto con la RAM..

Stack para mi es algo ordenado, que vaya en forma secuencial o en serie ocupando un espacio, tal como lo es una pila, no?.

Tengo dos esquemas aqui:

I.- Asignacion en forma ordenada:
Cuando se ejecuta el programa, el sistema va asignando memoria a cada variable segun vaya leyendo el programa y la va ordenando en una pila.




II.- Asignacion en forma aleatoria:
Cuando se ejecuta el programa, el sistema va asignando aleatoriamente cada variable en un area de memoria para el uso del programa.



Cual seria el correcto?

Gracias y saludos.

#36
Muy buenas..

Entiendo como funcionan los punteros y los punteros a punteros (según el dibujo adjunto que he realizado, si hay algo malo, corregidme por favor)..



Pero como quedaría dibujada el siguiente puntero doble?

Código (cpp) [Seleccionar]

int ** matriz = new int[10][10];


Es un puntero a un puntero, pero almacena una matriz bidimensional, no logro visualizar como sería el mapa en la memoria... como seria?

Gracias.
Saludos..
#37

Hola!

Tengo 4 archivos:

udbmanagement.hpp
uloginwindow.h
main.cpp
uloginwindow.cpp


main.cpp está incluyendo a "udbmanagement.hpp"
loginwindow.cpp también incluye esta misma cabecera "udbmanagement.hpp"

Sin embargo, al compilar, me envía ese error del linker, símbolos duplicados, los símbolos duplicados son 4 funciones que están dentro del archivo .hpp

El problema es que utilizo esas funciones tanto en main, como en uloginwindow.cpp

que debería hacer en este caso?..

(he probado con #pragma once pero sigo teniendo el mismo error.)

en el archivo .hpp tengo 2 structs cada una tiene algunas funciones, y esta todo definido dentro del mismo .hpp .. quizá sea mejor idea separarlos en .h y .cpp ...

Alguna idea?..
Saludos y gracias...
#38
Hola!

Estoy trabajando con QT Creator y tengo el siguiente código:

Código (cpp) [Seleccionar]

    struct Constants{

        static const char * DB_FILE_NAME;
        static const char * DB_FULL_PATH;
        static const char * DB_FULL_PATH_NAME;

        Constants();
        ~Constants();

    };

    Constants::Constants(){
        DB_FILE_NAME = "data.db";
        DB_FULL_PATH = "./";
        DB_FULL_PATH_NAME = "./data.db";
    }

    Constants::~Constants(){
        delete DB_FILE_NAME;
        delete DB_FULL_PATH;
        delete DB_FULL_PATH_NAME;
    }




Sin embargo, al compilar, me dice :


symbol(s) not found for architecture x86_64
linker command failed with exit code 1 (use -v to see invocation)


Definí los valores de las constantes estéticas fuera del structs debido a que tenia entendido que nunca se hacen en la misma declaración... a que puede deberse este error?

gracias.
#39
Hola!..

Estoy practicando Unreal y QT Creator, en ambos he visto esta sintaxis:


Código (cpp) [Seleccionar]


void unaFuncionCualquiera(){

    unaClase.unMetodo(&ClaseA::unaFuncionB);  //este argumento..

}


void ClaseA::unaFuncionB(){
    //hacer algo
}


En Unreal se manipulan los controles de esta forma.
En QT se conecta un botón con una función...

Entiendo el efecto que tiene, pero que tipo de parámetro es?,, como se denomina este tipo de parámetros?



Saludos y gracias.
#40
Programación C/C++ / Duda de sintaxis..
11 Abril 2019, 16:58 PM
Hola!

Entiendo que el operador de resolución de ámbito :: conecta un namespace con otro namespace o con una clase o con un método que esté dentro de un namespace específico... sin embargo, estoy viendo esto en Visual C++ y me asaltó la duda:


System::Windows::Forms::Application::Run(gcnew Prototipo::MyForm());


Entiendo que System es un namespace, pero que serían Windows, Forms, Application y Run en este caso?

No estoy seguro pero me da la idea de que desde System hasta Application son namespace y Run es una función...  pero quisiera estar seguro.

Gracias saludos.

#41

Muy buenas..

Estoy siguiendo unos tutoriales de Unreal Engine y me tope con algo que no habia visto:

Código (cpp) [Seleccionar]

float CurrentScale = OurVisibleComponent->GetComponentScale().X;


Mi duda está precisamente en la sintaxis de GetComponentScale().X;

Es primera vez que veo esa terminación  ().X;

Cual sería el prototipo de esa clase de funcion ?

Gracias de antemano.
#42
Buenas ..

Cual es el objetivo de la siguiente sintaxis ?

Código (cpp) [Seleccionar]

#include "ActorY"

class Actor{

public:

     class ActorY _actorY;     //Que pinta class aqui?

};



Saludos y gracias.
#43
Hola amigos..

Estoy estudiando templates y no comprendo este comportamiento:

A continuacion la forma en que NO funciona (con esta forma obtengo el error que sale en el titulo)

Código (cpp) [Seleccionar]

//Clase.h

template <class TM>
class Clase{

    TM num1, num2;

public:
    Clase(TM n1, TM n2);
    TM ObtenerMultiplicacion() const;

};



Código (cpp) [Seleccionar]

//Clase.cpp

#include "Clase.h"

template <class TM>
Clase<TM>::Clase(TM n1, TM n2){
    this->num1 = n1;
    this->num2 = n2;
}


template <class TM>
TM Clase<TM>::ObtenerMultiplicacion() const{
    return this->num1 * this->num2;
}



Sin embargo, con esta forma SI que funciona:
Código (cpp) [Seleccionar]

//Clase.h

template <class TM>
class Clase{

    TM num1, num2;

public:
    Clase(TM n1, TM n2);
    TM ObtenerMultiplicacion() const;

};

template <class TM>
Clase<TM>::Clase(TM n1, TM n2){
    this->num1 = n1;
    this->num2 = n2;
}


template <class TM>
TM Clase<TM>::ObtenerMultiplicacion() const{
    return this->num1 * this->num2;
}


Como verán, declarar la clase y definir sus miembros dentro del mismo archivo me funciona, pero si lo separo, no va... y me parece extraño, porque en el archivo Clase.cpp estoy incluyendo la cabecera con #include "Clase.h"

Que ha sucedido??


gracias de antemano.






#44
Buenas.

Estoy intentando guardar y leer de/a un archivo en forma binaria, no tengo problemas guardando, el problema va leyendo el archivo:


Código (cpp) [Seleccionar]


Ifstream fromFile;
fromFile.open("Archivo.bin", iOS::binary);

if (fromFile.good()){

     UnaClase uc;
   
     fromFile.read((char*)&uc, sizeof(UnaClase));

     //La siguiente linea me da el error:
     std::cout << uc.LeerNumero() << std::endl;


}


Pareciera que no se está escribiendo la información en la memoria que le corresponde a la variable "uc".

Que podrá ser=?

gracias.
#45
Hola nuevamente por aquí..

Código (cpp) [Seleccionar]


#include <fstream>

void Extraer(){

    int x = 0;
    int y = 0;

    ifstream fromFile;
    fromFile.open("file.txt");
    if (fromFile.is_open()){

         while (fromFile >> x >> y){      // *

          }


    }
 
}


Mi duda especificamente va en la linea donde se lee:

Código (cpp) [Seleccionar]

while (fromFile >> x >> y){
}


Como se lee esa sintaxis?, entiendo que dentro del parámetro de un while va una expresión por lo general del tipo bool... pero la expresión de extraccion que se ve ahi no me hace sentido como argumento... 

Saludos y gracias de antemano.