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 - CalgaryCorpus

#301
Un poco de historia.
Los primeros compiladores de C eran bastante rudimentarios y no hacian chequeos, suponiendo que el programador sabia lo que hacia. En particular los parametros de las funciones. Al inicio, el lenguaje C permitia no especificar parametros como en
int mifuncion()

y luego mas adelante invocar esa funcion asi:

valor = mifuncion( a, b, c );


y el compilador no reclamaba nada.

Con el tiempo, el lenguaje se estandarizo y le agregaron el que uno pueda especificar los tipos de los parametros, pero aun manteniendo la compatibilidad hacia atras, vale decir, si no especificabas nada, no habia chequeos, pero si especificabas algo, entonces habia chequeos.

En este caso, si ponias
int mifuncion(void)


entonces el compilador va a reclamar si invocas la funcion con algun parametro, pues al poner el void ahi, le estas pidiendo explicitamente al compilador que chequee, y este no va a permitir la invocacion con mas parametros.

Ahora ya no importa la compatibilidad hacia atras, si no pones parametros en la definicion de la funcion el compilador va a chequear que NO pases ningun parametro, del mismo modo si pones void entre los parentesis.

Resumen

  • mucho antes: no habia chequeo alguno
  • luego: chequeo si especificas void
  • ahora: chequeo siempre
#302
Me pregunto si este programa es exactamente el que ejecutas, si es que lo llegas a ejecutar.

Mi duda es porque aparece un printf mal escrito, dice prinft,  en la línea 31. Lo que debería ser rechazado por el compilador.

Está bien copiado?
#303
Y qué pasa si se ingresa una velocidad negativa?
#304
Los string literales usan doble comilla, e internamente usan 1 caracter adicional para guardar el final del string. Entonces lo que se ve asi  "hola" tiene en realidad 5 caracteres, no 4.
#305
Serviria si indentaras mejor el codigo, para leerlo mejor y si presentaras como estas probando el mismo. Tal vez el problema esta en la prueba y no en el codigo que muestras.
#306
La firma de la funcion modificada que propuse esta mala, o incompleta.

Dice

void dato_insertar (dato datos, int tipo, void* d, void (*f)() ){

deberia decir

void dato_insertar (dato datos, void* d, void (*f)(void *) ){
#307
Cuando estas insertando, en estos momentos, con el codigo que presentas, indicas explicitamente el tipo de dato que esta siendo guardado., por ejemplo:

dato_insertar(general, ENTERO, &b);
dato_insertar(general2, DOUBLE, &num);
dato_insertar(general3, CADENA, cadena);

luego te obligas a hacer un switch con ese tipo.

Tengo una solucion que elimina el switch posterior, aunque aun tienes que indicar el tipo de dato que usas al insertar.

Sugiero crear un nuevo campo que guarde un puntero a una funcion que sepa imprimir el dato que estas agregando.

typedef struct _variante{
int tipo;
void* valor;
        void (*f)(void *);
       
} variante;

definir las funciones que saben imprimir, por ejemplo:

void tipo_entero(void * pTipo) {
  printf("%d", *(int *)pTipo );
}


Las otras funciones son similares, pero usan otros %d en el printf y otro cast.

luego en dato_insertar simplemente se copia el puntero a funcion

void dato_insertar (dato datos, int tipo, void* d, void (*f)() ){
datos->tipo = tipo;
datos->valor = d;
        datos->f = f;
}

y esta funcion se invoca usando el nombre de la funcion a usar para imprimr. Nota que es solo el nombre de la funcion, No como siempre usas las funciones, con parentesis.

dato_insertar(general, &b, tipo_entero );
   
y finalmente cuando quieras imprimir el dato, solo haces

dato.f(dato.valor);


y esto imprimira de acuerdo a la funcion que usaste.

Suerte!
#308
Programación C/C++ / Re: Sobre argv
28 Septiembre 2014, 18:05 PM
Estas comparando un char contra un string. En C son tipos distintos.
Usa comilla simple y compararas caracter contra caracter.
#309
¿por que no aplicaste el modulo 10 al decriptar?
#310
Genéricamente, la notacion que usa el parentesis cuadrado, como

p[ entero ]

es igual a

* ( p + entero )

por lo que

puntero[ -1 ]

es igual a

*( puntero - 1 )

El codigo que muestras mueve a "s" un lugar hacia adelante unas lineas antes por lo que si se quiere acceder a posiciones previas el -1 tiene (algo de) sentido.