« first day (2399 days earlier)      last day (37 days later) » 

1:00 AM
@gbianchi estas?
 
capaz... :p
 
sabes vue ?
dime que si
 
 
5 hours later…
5:59 AM
A las güenas :-)
Asco de Miércoles :-(
 
6:45 AM
Asco de Güindo$ ... lo diré mientras viva.
 
Windows es lo mejor
buenos dias
 
Todo porque no distingue may/min, y .../H/... se lo traga ... y en Linux hay que ponerlo en minúscula: .../h/...
@Pikoh Entiendo que para pobres ignorantes, que se lo da todo hecho, pueda tener alguna utilidad ...
... pero para los que sabemos ... pues un coñ_zo
Enga, a ver que dice el Jenkins
 
pues ponlo todo en minusculas..solucionado
 
Si fuera mio ... es del cliente
Anda que ya les vale, en código multiplataforma, poner cosas en mayúsculas
 
eso no es culpa de windows entonces
XD
 
6:50 AM
XDD
Pero que también se podía quejar y no encontrar las cosas, y te darías cuenta en local
Así ... pues en local compila, y en el Jenkins ... pues un mojón
 
en windows no se puede hacer eso por retrocompatibildad, dado que nunca desde msdos se han distinguido mayusculas y minusculas
 
Lo se. Que es un churro desde la primera línea de código del MS/DOS xD
 
o es unix el especialito por distinguir entre mayusculas y minusculas
 
¡ Como tiene que ser, caramba !
Ya sabes el refrán, no es lo mismo una pelota vieja que una vieja en pelotas
 
por que? es mas comodo que no distinga
XD
no tiene sentido que un parámetro de un comando tenga que acordarme si para que sea recursivo tengo que poner -r o -R
 
6:56 AM
Na. Paso de discutir con Windowseros fanáticos. Es perder el tiempo ;-p
 
es r. punto, da igual r o R
XD
 
@Pikoh Eso es una cosa distinta. Ahí es el programa el que manda
Pero que holamundo.c sea lo mismo que HolaMundo.C ...
pues tu me dirás
 
y en las rutas igual.
holamundo y HolaMundo es lo mismo
XD
 
jejeje ... será en tu mundo ;-p
Enga, cruzemos los dedos. Compilación en Win sin problemas.
A ver la de Linux ...
 
he cambiado por cierto el otro dia mi NAS de FreeBsd a Linux...a ver que tal
 
7:00 AM
Pues igual, mas o menos
@Pikoh ¿ Que has usado ? ¿ OpenMediaVault ?
 
No, truenas
He pasado de TrueNas core (frebsd) a Truenas Scale (linux)
 
Ok, me suena, pero no lo he usado nunca
Solo probé una vez, por curiosidad, el OpenMediaVault en una raspberry
 
basicamente porque trunas scale tiene kubernetes y docker..mas comodo para desplegar aplicaciones
 
Hoy el coworking invita a café y bollería ... me voy, que me quedo sin
 
@Trauma yo estoy encantado con truenas...usa ZFS
@Trauma corre
 
7:16 AM
Pues tampoco era para tanto
Café casi frio y donettes ... pero bueno
A caballo regalado no le mires el dentado xDD
El Jenkins este que usamos ... en Windows tarda 15 minutos en compilar, en Linux se le va la pinza
Ya lleva mas de 32 minutos.
 
7:39 AM
Windows FTW
 
@Pikoh También. Y el devop, que no tiene ni idea xD
 
 
2 hours later…
9:32 AM
@Pikoh yo lo he llegado a usar y es muy potente
 
 
4 hours later…
1:05 PM
@Trauma pero que dices o: si linux es más óptimo para todo!
eso no posible es
 
@Aritzbn El devop. Que vete tú a saber como tiene configurado el Jenkins, la VM de compilación, posibles cachés, ...
 
estoy parafraseando
me aburro mucho
hoy ha sido un día del culo
no va nada
Porque en esta empresa hay una manía de replicar componentes genéricos y hacer componentes propios que no se documentan en absoluto. Quiero llorar.
 
Vente aquí y peléate con 28 repos propios del cliente, en C++, con código de hace mas de 15 años, y con 0 documentación
 
@Trauma aquí tienen más de 80 repos...
 
Y luego con el Jenkins, al que no tienes acceso mas que por los correos que te envía
 
1:13 PM
En visual basic, c#, angularjs, angular8, angular9...
espera, voy a ver si puedo contar los repos en gitlab
 
Compilación multiplataforma, con directorios y archivos en may/min
 
La puta arquitectura por capas
me cago en dios
150 repos para un único producto
T_T
 
No está mal tampoco :-/
 
@Trauma si se hace bien supongo que no está mal
Pero se tiene que hacer bien
 
Je. Ahí le has dao. Si se hace bien
Que no suele ser el caso xD
 
1:16 PM
No sé, es muy guay hacer cosas, pero cuando no llegas, no llegas. No eres capaz de documentar un proyecto y mantener la documentación, vas a meterte a montar todo un esquema de arquitectura de capas homebrew que nadie entiende
 
Bueno, listo esto. Si el nombre del campo empieza por '_', y se pasó la opción ignoreInitialUrderline en el constructor, pues eso, ignorar el primer '_'.
Salvo se se indicó una concordancia explícita, en cuyo caso se toma literal, tenga o no el '_'.
Enga, a compilar el bischo este, a ver de que se queja ...
¡ Otia ! ¡ Compiló !
Eso no me lo esperaba :-/
 
 
1 hour later…
2:46 PM
@Trauma me ayudas? :)
 
 
1 hour later…
3:49 PM
@Christian Pues como siempre: depende de a qué xD
 
 
2 hours later…
5:23 PM
@Trauma abulafia ya me ayudó un poco, pero igual tengo unas dudas.
Es sobre como especificar que un campo de una struct sea una función
me dijo que sería, por ejemplo float (*funcion)(int, int)
pero mi pregunta es si en vez de colocar float puedo colocar auto y usar <template Args...> para decir que puede recibir cualquier parámetro
 
5:48 PM
@Christian Si, claro. Una función-miembro plantilla
Es la misma sintaxis que si si estuviera fuera de la struct
Pero son cosas distintas; @abulafia te ha dicho como sería un puntero-a-función, mas propio de C (pero perfectamente válido en C++)
Y tu me estás preguntando por una función-miembro plantilla. Que es otra cosa. De entrada, no ocupa espacio dentro de la struct.
Pero vamos, que no tienes mas que probarlo xDD
 
 
1 hour later…
7:19 PM
@Trauma Cómo uso la struct?
Ya tengo esto:
template <class... Args>
struct Opcion
{
    const char* enunciado;
    auto (*funcion)(Args... args);
};
 
7:51 PM
@Christian Eso no es lo que preguntaste
Opcion< int, char > opt; opt.funcion( 10, 'a' );
Pero ese auto como valor de retorno ... no tengo muy claro que te vaya a funcionar. Es mas, diría que no va a funcionar ... pero es que no suelo usar esas excentricidades O_º
Solo por si quieres ahorrarte trabajo ... existe un std::function< > que te podría servir (creo, no tengo muy claro lo que quieres hacer)
 
8:14 PM
@Trauma entonces se lo cambio por void
Lo que quiero hacer es un Menú
El cual tiene opciones, si eliges una opción se ejecuta una función
 
¿ Y para que quieres que sea plantilla ?
 
Yo nunca quise que sea plantilla ._.
Solo quería usar una plantilla
para que aceptara varios parámetros
 
Te estás volviendo a meter en camisa de 11 varas
por lo menos
Cada vez que la llames, vas a tener que usar todos los parametros, ergo el punto en el que la llamas no puede ser plantilla
ergo no es necesario que sea plantilla, savo que te quieras ahorrar varias definiciones
 
Por ahora tengo esto:
 
Vale, en ese último caso si te podría server, ahorrarte hacer varios struct muy similares
 
8:18 PM
template <class... Args>
struct Opcion
{
    const char* enunciado;
    void (*funcion)(Args... args);
};

template <class... Args>
class Menu {
    Opcion *lista_opciones = new Opcion[1];
    int size_opt = 2;
    const char* dialogo = "";

    public:
        Menu();
        void add_option(const char* msg_opcion){
            int i = this->size_opt;
            Opcion opcion;
            opcion.enunciado = msg_opcion;
            this->lista_opciones[i] = opcion;
            this->size_opt++;
En add_option me falta poner un parámetro que sería la función a ejecutar
 
Eso no compila
 
Aaa.... bueno, aún no lo había compilado
 
Haces unas cosas muy muy muy raras
 
Me lo dicen siempre >_<
 
Opcion *lista_opciones = new Opcion[1];
3 veces lo he mirado ... y aun no se que pretendes con eso
opcion es una plantilla, no lo puedes instanciar así
 
8:21 PM
Cómo que es una plantilla?
Cuando se volvió plantilla?
 
Pues tiene un template< class... Args > muy hermoso delante
plantilla variádica, para mas señas
 
Si le pongo una plantilla a una struct se vuelve plantilla?
 
Lo mismo que template< class... Args > class Menu, otra plantilla
Pues claro :-)
La declaración de plantillas se hace justamente con la keyword template xDDD
todo a lo que le pongas template delante, es una plantilla
 
Aaa... yap
Y entonces como instancio una plantilla?
 
En clases, tienes que decirle los tipos exactos a usar
Opcion< int, char > opcion1;
Ahí se declara la variable opcion1, de tipo Opcion< int, char >
Que es distinta a, por ejemplo, Opcion< int, int > opcion2;
Que es la variable opcion2, de tipo Opcion< int, int >
Son totalmente incompatibles una y otra, no tienen nada que ver. Son 2 tipos totalmente distintos.
 
8:28 PM
Y cómo creo un array de ese tipo?
 
Opcion< int, char > *lista_opciones;, por ejemplo
u Opcion< int, char > lista_opciones[5];
Pero no los puedes mezclar: Opcion< int, char > no es lo mismo que Opcion< int, int >
 
El editor me marca error en la plantilla Opcion
un parámetro no puede tener el tipo void
Opcion<char, void> *lista_opciones[1];
 
Efectivamente, eso está mal :-)
El error es exacto
Tu plantilla es variadica, basta con Opcion< char >
Se tragará cualquier cosa que le metas
Opcion< int, float, double, long > también sería posible
 
O_o
 
Cualquier cosa que no sea void, claro :-)
 
8:32 PM
Pero esos tipos hacen referencia al tipo de dato de cada atributo o al tipo de dato retorno de la función?
 
¿ Tipo de retorno ? ¿ Pero no lo has puesto void ?
jejejeje
@Christian Piensa en una plantilla como en una macro
 
aún no tengo claro que es una macro
 
XDDD
Es que no se como explicartelo
El compilador reemplazará todo lo que hayas declarado en la lista de argumentos de la plantilla
es como un buscar/reemplazar
mas o menos, no 100% literal
 
Pero esos tipos <int, float, double, long> hace referencia al tipo de parámetros que recibe mi función, no?
 
Esos parametros se aplican a cualquier cosa que los use. En tu caso, si, los argumentos de tu función.
 
8:37 PM
pero.... y si no sé que va a recibir mi función?
 
¿ Y como pretendes usarlo si no sabes lo que vas a recibir ?
dentro de la función, digo
o no te he entendido
Esto no es python. Los argumentos se pasan a través de la pila de la CPU, y hay que usar instrucciones de la CPU para copiar las cosas de un lado a otro
en ambos lados, el que envía y el que recibe
 
Ya sé como resolverlo
 
O-O
 
No le paso nada
:D
 
¡ HAHAHAHA !
Buen sistema :-)
@Christian También puedes usar stdarg ... pero creo que te vas a liar todavía mas XDD
Ale, para que no te aburras xDD
 
8:40 PM
Ya tengo bastante por ahora
no solo con la programación, sino con otros trabajos
Ya me lo veo, gracias
 
Enga, que te diviertas :-)
 
Ahora solo me falta entender como pasar una función por parámetro :)
 
No puedes, solo puedes pasar un puntero a función
es automático si pones el nombre de la función
el compilador entiende que quieres usar un puntero a ella
 
Python es más sencillo :(
por eso ya me compré mi segundo patito de goma
 
Mas limitado :-)
Y por eso los módulos para python se programan en C y C++ jejeje
 
8:43 PM
Jaja, cierto
El editor me da otro error :(
Menu *this
la expresión debe tener un tipo de clase, pero tiene el tipo "Opcion<char> *"
cout<<this->lista_opciones[i].enunciado<<endl;
 
¿¿¿¿ Menu *this ????
this es una palabra reservada, no la puedes usar como quieras
 
Pero si estoy haciendo referencia a la clase!
quiero acceder a uno de sus atributos
 
Menu *this;
eso es una declaración en mi pueblo
 
Ni idea de donde pasa eso
 
@Christian No tienes que usar el this para nada
Tu error es muy fácil, no es un punto, es ->
 
8:45 PM
Cómo que para nada
 
lista_opciones[i]->enunciado
@Christian Pues eso, para nada
 
Muy raro el this en C++
 
Lo raro es en python
xDD
El this solo se usa si hay conflicto de nombres. Basta con escogerlos bien :-)
 
A yap
osea esto int i = this->size_opt; también lo cambio?
 
Al gusto ... pero es lo mismo que int i = size_opt;
Bueno, a mi personalmente, cuando veo un this, siempre pienso novato jejeje
 
8:49 PM
Había elegido ponerlo en otra variable por que me resultaba largo escribir el this
Otro error :)
no existe ninguna función de conversión de "Opcion<char>" a "Opcion<char> *" adecuada
lista_opciones[size_opt] = opcion;
 
te lo está diciendo muy claro: no puedes asignar un valor a un puntero.
lista_opciones[size_opt] = new opcion< ALGO >;
 
Tenía esto:
    void add_option(const char* msg_opcion){
        Opcion<char> opcion;
        opcion.enunciado = msg_opcion;
        lista_opciones[size_opt] = opcion;
        this->size_opt++;
    }
 
Entiendo que es Opcion< char > *lista_opciones; ¿ no ?
 
sip
 
no, tienes que tener Opcion< char > *lista_opciones[5];
con un asterisco *
osea, tienes ya un asterisco ¿ no ?
 
8:53 PM
sip
Bueno, me di cuenta que lo tengo así Opcion<char> *lista_opciones[1];
 
Ahora si me cuadra :-)
ufff ... comportamiento indifinido en el aire ...
tienes que usar new para asignar ahí. Es un array de punteros a Opcion< char >
lista_opciones[size_opt] = new Opcion< char >( );
jejeje ... los lios que se monta la gente con los punteros ...
 
Está bien esto?
    void add_option(const char* msg_opcion){
        lista_opciones[size_opt] = new Opcion<char>();
        lista_opciones[size_opt]->enunciado = msg_opcion;
        this->size_opt++;
    }
 
Diria que si, que compilará
Que funciones, sin explotar, con el resultado esperado, y sin fugas de memoria ... pues eso ya se verá XDDD
 
No me asustes
 
¡ HAHAHAHA !
 
8:58 PM
Espero que los 2GB de Ram aguanten todo
 
Ningún daño permanente al equipo, no te preocupes XDD
 
Bien
mejor lo pruebo luego de terminar mi trabajo
Gracias
 
Ok, ya me irás contando
Me tengo que retirar ya
No hay por que darlas :-)
 
Bueno, que tengas buen día
 
Igualmente
 

« first day (2399 days earlier)      last day (37 days later) »