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

#371
Para la próxima, pon tu código entre las etiquetas GeSHI (entre [ code=cpp] y [ /code], quitando espacios). Además, explica que errores has detectado para que así sea más fácil ayudarte...

Bien, he compilado el código para detectar errores más rápidamente, y he encontrado unos cuantos (presuponiendo que es código C):

main.c: In function 'menu':
main.c:51:31: error: expected expression before 'Contacto'
               borrarContacto(Contacto(),nombreArchivo);
                              ^
main.c:51:31: error: too few arguments to function 'borrarContacto'
main.c:15:6: note: declared here
void borrarContacto(Contacto contacto, char* nombreArchivo);
     ^
main.c:54:34: error: expected expression before 'Contacto'
               modificarContacto(Contacto(),nombreArchivo);
                                 ^
main.c:54:34: error: too few arguments to function 'modificarContacto'
main.c:16:6: note: declared here
void modificarContacto(Contacto contacto,char* nombreArchivo);
     ^
main.c: In function 'pausar':
main.c:160:5: warning: zero-length ms_printf format string [-Wformat-zero-length
]
    printf("");
    ^


Realmente, todos los errores pasan porque no tienes creada una función llamada "Contacto". A esta función, la llamas en un par de ocasiones, pero no existe!.

Realmente, no puedes crear esa función, porque has definido un tipo con ese mismo nombre.

Fuera de los errores de sintaxis, no sé si hay más errores...

_____________________________

PD.: Yo he presupuesto que el código está en C, pero si lo estás haciendo en C++, puedes hacerlo MUCHO más óptimo (por ejemplo, pasando por referencia los argumentos).

Si fuera C++, he compilado el código, y me sale un Warning. Quitando eso, el programa me ha funcionado bien hasta que he decidido modificar un contacto... Sinceramente, no comprendo muy bien que intención o de que forma pretendías modificar contactos... Primero, escaneas la ID del contacto, pero después no usas esa ID. En la opción borrar contacto, eliminas todos los contactos!
#372
Claro, pero mi caso es más general :P
#373
Puedes hacer tu propia función 'round':

Código (cpp) [Seleccionar]
#include <math.h>

double Round(double d, int decimals) {
    return (double)((int)(d * pow(10, decimals))) / pow(10, decimals);
}


Estoy casi seguro de que existe una versión más reducida, pero al menos da una idea...
#374
De acuerdo. A ver si existe :D
#375
Hola, muy buenas. La duda es ¿dónde está el buffer de stdout? Por ejemplo, cuando llamamos a la función printf, lo que hacemos es copiar el buffer del parámetro de dicha función a otro buffer manejado por Windows. Entonces, ¿qué nivel de protección tiene?

Por si alguien anda despitadillo, me refiero a los anillos del modo protegido de los procesadores. He escuchado que suelen haber 4. El kernel se encuentra en el nivel 0, y las aplicaciones de usuario en el 3.

Lo pregunto por saber si puedo acceder a ese buffer directamente o está en el kernel, y por tanto solo se puede acceder a el por Windows y su API (o las librerías standard de los compiladores, aunque estas a su vez requieren a la API).

Gracias
#376
Respuesta corta: el operador '!' invierte entre true y false una expresión.
El operador && relaciona dos expresiones booleanas. Si alguna de las dos es false, entonces la expresión "expresion1 && expresion2" valdrá false, pero si las dos expresiones son true, entonces la expresión final será verdadera.

Respuesta larga:

Partimos de
Código (cpp) [Seleccionar]
*s1 && *s2 && !(*s1 - *s2)

Analicemos. El operador con menos prioridad en esa expresión es el &&, por lo que por ahora lo dejamos aparte y la dividimos en tres partes:
Código (cpp) [Seleccionar]
*s1 // Primera parte
*s2 // Segunda parte
!(*s1 - *s2) // Tercera parte


Vale, entonces, la única expresión que hay es !(*s1 - *s2). Dicha expresión tiene un paréntesis, el operador con más prioridad, por lo que lo evaluamos primero con el ejemplo donde *s1 vale 65, y *s2 vale 66. El paréntesis queda así:

Código (cpp) [Seleccionar]
65 - 66
Lo que a su vez equivale a...
Código (cpp) [Seleccionar]
-1 //Simplemente restamos

Entonces, ya tenemos el paréntesis. La expresión quedaría:
Código (cpp) [Seleccionar]
!(-1)

Lo que hace el operador '!' es cambiar de true a false o viceversa la expresión que tenga a la derecha. Por ejemplo, si tenemos "!(false)", pasaría a "true", y si tenemos "!(true)", pasaría a "false". Pero, ¿y que pasa cuando son números? Si tenemos un número distinto de cero, entonces pasa a ser 0 (por ejemplo, "!(2)" equivale a "0"), y si tiene un "0", entonces pasa a valer "1".

Sabiendo esto, la expresión de antes "!(-1)" quedaría así:
Código (cpp) [Seleccionar]
0 // Invertimos

Ya sabemos que la primera parte vale 65. Sabemos que la segunda parte vale 66 y sabemos que la tercera parte vale 0.  Entonces, nos quedaría así:

Código (cpp) [Seleccionar]
65 && 66 && 0

Las expresiones, normalmente, se evalúan de izquierda a derecha, por lo que primero evaluamos "65 && 66". Lo que hace el operador es lo siguiente:

Valor izquierdoValor derechoResultado
00false
0Distinto de 0false
Distinto de 00false
Distinto de 0Distinto de 0true

Entonces, la expresión ÚNICAMENTE valdrá true cuando los dos operandos sean DISTINTOS de 0. En cualquier otro caso, la expresión será false.

Entonces, "65 && 66" pasaría a valer true.

Ahora tenemos la expresión "true && 0". Como ya hemos visto, como hay un operando que vale 0, entonces la expresión es false.

Sé que es largo de leer, pero creo que si se lee con detenimiento, se puede entender perfectamente

______________________________________

PD.: Hubiera sido mejor la expresión
Código (cpp) [Seleccionar]
*s1 && *s2 && *s1 == *s2
#377
Muchas gracias. Me ha costado un poco xD (no es que sea complicado, es que me he comido el coco :P)
#378
Interesante... Pero, ¿por qué no se siguen usando las interrupciones? ¿Por qué motivo se están sustituyendo por syscall o demás instrucciones? ¿Qué desventajas tienen?

Gracias por tu respuesta!
#379
Hola, muy buenas! La pregunta es bastante simple. ¿Por qué Windows no usa interrupciones para operaciones de bajo nivel? Por ejemplo, Los sistemas Unix usan su clásica interrupción 0x80 para, por ejemplo, operaciones de lectura o escritura. Sin embargo, para hacer operaciones de escritura o lectura en Windows, necesitas usar su API.

La duda se puede plantear de otra forma. ¿Tienen las interrupciones alguna desventaja clara frente al sistema que usa Windows? Gracias!
#380
Al final lo que he hecho es rehacer el código y ha resultado. Llevo tanto con esto que no tengo ganas de comprobar que era. Siento la intriga xD