FI_aDOndeVoySiAndo(int *,int *)
.
Esta función no es imprescindible para resolver la práctica.
filosofar2.cpp
, cuya adecuada compilación producirá
el ejecutable filosofar2.exe
.
Los procedimientos, estructuras, etc. son iguales
a los correspondientes de la práctica anterior.
filosofar2
acepta los mismos argumentos por
la línea de órdenes que la práctica de UNIX, con
idéntico significado. Si no se introducen argumentos, se imprimirá
un mensaje con la forma de uso del programa por el canal de
error estándar.
filosofar2.dll
y un fichero de cabeceras,
filosofar2.h
.
Gracias a la biblioteca, muchas de las funciones no las tendréis
que programar sino que invocarlas a la DLL, tal como se
explica en la sesión octava.
FI2_inicio
.
La clave que se debe usar es: 28545168465992.FI2_fin
.filosofar2.dll
filosofar2.dll
y el fichero de cabeceras filosofar2.h
.
filosofar2.dll (ver. 2.0)
:
Descárgalo de aquí.
filosofar2.h (ver. 1.0)
:
Descárgalo de aquí.int FI2_inicio(int ret, unsigned long long clave,
struct DatosSimulaciOn *ddssp, int const *dE)
int FI2_inicioFilOsofo(int nFilOsofo)
int FI2_pausaAndar(void)
int FI2_puedoAndar(void)
int FI2_andar(void)
int FI2_entrarAlComedor(int puesto)
int FI2_cogerTenedor(int t)
int FI2_comer(void)
int FI2_dejarTenedor(int t)
int FI2_entrarAlTemplo(int puesto)
int FI2_meditar(void)
int FI2_finFilOsofo(void)
int FI2_fin(void)
void pon_error(char *mensaje)
int FI2_aDondeVoySiAndo(int *x, int *y)
FI2_puedoAndar
, pero en
lugar de devolver si se puede andar o qué filósofo
bloquea el paso, devuelve en las variables pasadas por
referencia las coordenadas (x,y) del lugar
donde irá el filósofo si anda desde la
posición actual, si las circunstancias no cambian.
Devuelve 0 en una ejecución normal y -1 en caso de error.EVENTOS Y VALOR INICIAL: EC* (automático), EV (automático). SEUDOCÓDIGO: C V === === Por_siempre_jamás Por _siempre_jamás { { W(EC) W(EV) escribir_consonante escribir_vocal Set(EV) Set(EC) } }Debéis indicar, asimismo, en el caso de que las hayáis realizado, las optimizaciones de código realizadas.
TerminateThread
para acabar con
los hilos o TerminateProcess
para acabar con
los procesos. El problema de estas funciones es que
están diseñada para ser usada sólo en condiciones
excepcionales y los hilos mueren abruptamente.
Puede dejar estructuras colgando, ir llenando
la memoria virtual del proceso con basura o no
invocar adecuadamente las funciones de descarga de la
DLL.
fprintf(stderr,...)
a
un fichero, añadiendo al final de la línea de órdenes
2>salida
. De este modo, toda la información
aparecerá en el fichero salida
para su
análisis posterior. No os olvidéis de incluir el
identificador del hilo que escribe el mensaje.
XXXX
de la biblioteca. No consigo de
ningún modo acceder a ella.XXXX
por lo que veremos más
abajo. Para definir el tipo de esta variable
correctamente, debéis conocer cómo son los
punteros a función. En la
última sesión de Sistemas Operativos I,
se describe una función, atexit
.
Dicha función en sí no es importante para lo
que nos traemos entre manos, pero sí el argumento
que tiene. Ese argumento es un puntero a función.
Fijándoos en ese argumento, no os resultará
difícil generalizarlo para poner un puntero
a funciones que admiten otro tipo de parámetros
y devuelve otra cosa.
Notad, además, que, al contrario que
ocurre con las variables "normales",
la definición
de una variable puntero a función es especial
por cuanto su definición no va solo antes del
nombre de la variable, sino que lo rodea.
Tenéis que poner algo similar a:
#$%&%$ XXXX $%&$·@;
, es decir,
algo por delante y algo por detrás.GetProcAddress
.
Pero, ¡cuidado!, GetProcAddress
devuelve un FARPROC
, que sólo
funciona con punteros a funciones que devuelven
int
y no se les pasa nada
(void)
. Debéis hacer el
correspondiente casting. Para ello,
de la definición de vuestro puntero, quitáis
el nombre, lo ponéis todo entre paréntesis
y lo añadís delante de
GetProcAddress
, como siempre.XXXX
como nombre al puntero,
ahora no se diferenciarán en nada vuestras
llamadas a la función respecto a si dicha
función no perteneciera a una DLL y la
hubierais programado vosotros..h
si llamáis a vuestro
fichero fuente con extensión .c
. Llamadlo
siempre con extensión .cpp
.
libc
(malloc
y free
). Son funciones que no están
sincronizadas, es decir, no se comportan bien
en entornos multihilo. O bien las metéis en una
sección crítica o, mejor aún, tratad de evitarlas.
error XXXXX: 'FuncionW': no se
puede convertir de 'const char[X]' a 'LPCWSTR'
.
El motivo del error es que, por defecto, esa versión
de Visual Studio supone que deseáis usar UNICODE
(caracteres de 16 bits) en lugar de los normales
(caracteres de 8 bits). La solución pasa por
transformar el código fuente para que se ajuste
a la programación en UNICODE de Microsoft o
decirle a Visual Studio que no, que no queréis
trabajar con UNICODE. Unos compañeros vuestros
nos escriben diciendo que si en la configuración
del proyecto seleccionáis
"Juego de Caracteres->Sin establecer", se soluciona.