Pascal/Turbo Pascal - Alguien que me encuentre los errores!!!!

 
Vista:

Alguien que me encuentre los errores!!!!

Publicado por Serguei Esquivel (16 intervenciones) el 16/06/2005 03:15:34
function reloj(i,j,k:integer;):intiger;
begin
for i:=0 to 2 do
for j:=0 to 59 do
for k:=0 to 59 do
begin
reloj:=(i,j,k);
delay(500);
end;
end;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Alguien que me encuentre los errores!!!!

Publicado por Roberto Garcia (56 intervenciones) el 16/06/2005 05:56:01
El ultimo parametro de la funcion no debe llevar ;

El tipo de la funcion debe ser integer y no intiger

No puedes hacer esto reloj:=(i,j,k) en todo caso deberia ser reloj(i,j,k) o reloj:=i, solo una de las tres variables

Y en todo caso seria un error llamar recursivamente a la funcion de la forma que intentas hacerlo pues generarias un stack overflow

Pero el error principal ya te lo detectaron en tu primer post, que no especificas exactamente que es lo que quieres hacer con esta funcion.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Alguien que me encuentre los errores!!!!

Publicado por Serguei Esquivel (16 intervenciones) el 17/06/2005 18:53:59
Se supone que devo de hacer un reloj que esté presente en el programa, dólo para validar procesos de acuerdo a X tiempo, por eso pense en una funcion que me entregue el tiempo y yo valide luego
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Alguien que me encuentre los errores!!!!

Publicado por Diego Romero (786 intervenciones) el 17/06/2005 19:34:50
Lo que Roberto y yo no entendemos es si ese reloj debe estar activo AL MISMO TIEMPO que el resto del programa. Dicho de otra forma, reloj y programa se están ejecutando en paralelo.
Si ese es el caso, lo que has hecho no se acerca no remotamente.
Y para obtener la hora y fecha del sistema tampoco sirve, investigas los procedimientos GetTime y GetDate.
Por el contrario, si quieres un procedimiento que actúe como un contador horario, tampoco sirve lo que has hecho.
Lo primero es establecer una unidad, supongamos el segundo.

procedure Tiempo;
var
segundos, minutos, horas: integer;
diadeljuicio:boolean;
begin
diadeljuicio:=false;
segundos:=0;
minutos:=0;
horas:=0;
while diadeljuicio = false do
begin
writeln(horas:2,':',minutos:2,':',segundos:2);
delay(1000);
inc(segundos);
if segundos = 60 then
begin
segundos:=0;
inc(minutos);
if minutos = 60 then
begin
minutos:=0;
inc(horas);
end { if }
end; { if }
end; { while }
end;

El procedimiento que acabo de escribir termina e día del juicio (o sea nunca), tú sabrás qué condición de salida le pones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Alguien que me encuentre los errores!!!!

Publicado por Serguei Esquivel (16 intervenciones) el 19/06/2005 01:29:00
pues gracias a los dos, si lo que ocupo es un reloj que esté activo dentro del programa, algo como un reloj residente, pero trataré más, luego les aviso
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Alguien que me encuentre los errores!!!!

Publicado por Roberto Garcia (56 intervenciones) el 19/06/2005 05:53:30
Ahora bien, creo que ya te entendi, lo que tu quieres es un reloj en tiempo real, es decir que se actualize conforme el reloj del sistema, y ademas poder trabajar normalmente con el programa. Y el reloj lo quieres usar para hacer digamos "acciones programadas" conforme a un horario.

Si es asi, pues Diego tiene razon, nada de lo que has estado intentando te va a ayudar mucho.

Si no conoces la funcion keypressed, te recomiendo que la investiges, y si ya la conoces esa te podria servir para que lo que quieres hacer.

De todas formas en la pagina

http://mx.geocities.com/antrahxg

en la seccion de pascal hay un link que dice "Keypressed y la obtencion de teclas" checalo, el ejemplo del final podria ser algo parecido a lo que necesitas.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Alguien que me encuentre los errores!!!!

Publicado por Diego Romero (786 intervenciones) el 19/06/2005 06:28:02
Bien, tengo algo mejor, Serguei y Roberto.
Se trata de poner una llamada a un procedimiento creado por nosotros en la cola de interrupciones del DOS que mantiene el reloj del sistema, de forma tal que cada vez que el DOS actualiza el reloj (una vez cada centecima de segundo) llame además a nuestro procedimiento.
Para ello tendremos que "colgar" nuestro procedimiento, esto lo haremos mediante una combinación de llamadas a los procedimientos estandar de la unidad dos de TP, GetInVec y SetInVec.
GetIntVec() devuelve un puntero con la dirección de memoria de la interrupción solicitada, la interrupción del reloj es la $1C.
SetIntVec() hace lo contrario, pone la dirección de memoria donde está el inicio del procedimiento que queremos agregar a la cola de interrupciones.
Para saber cuál es la dirección de memoria de un procedimiento usaremos la función Addr().
El procedimiento que colgaremos de la cola lo único que hará será llamar a GetTime para tomar la hora actual. Este procedimiento no puede ser cualquier cosa, debido a que el DOS necesita que cumpla algunas condiciones especiales, NO se pueden usar strings dentro del procedimiento y no se pueden hacer excesivas llamadas a Write o WriteLn y algunos otros detalles que sería extenso de explicar así que por ahora confien en mi :D.
Veamos:

uses Dos, Crt;
var
Int1CSave : Pointer; { puntero genérico a memora para respaldar la cola antigua }

procedure Ya(hh, mm, ss, cc:word); { este procedimiento recibirá la hora "desde adentro }
begin
gotoxy(10,10);
Write(hh:2,':',mm:2,':',ss:2);
end;

{$F+,S-,W-} { directivas de compilación }
procedure TimerHandler; interrupt; { procedimiento tipo interrupción }
var
hh,mm,ss,cc:word;
begin
GetTime(hh,mm,ss,cc); { se toma la hora actual }
gotoxy(65,1);
Write(hh,':',mm,':',ss);
Ya(hh, mm, ss, cc); { se la pasamos a un procedimiento "externo" }
end;
{$F-,S+}

begin
ClrScr; { borra la pantalla }
GetIntVec($1C,Int1CSave); { resguarda la cola de interrupciones actual }
SetIntVec($1C,Addr(TimerHandler)); { agrega nuestro procedimiento a la cola }
writeln('Ves la hora en la esquina superior derecha?');
ReadKey;
SetIntVec($01C,Int1CSave); { restaura la cola guardada ¡muy importante! }
end.

En el procedimiento Ya() debería ir el código que evalúa la hora para disparar los eventos que nos interesan. No se puede poner mucho código en el procedimiento TimeHandler pues un proc. tipo interrupt no debe superar cierto tamaño en memoria sino producirá un cuelgue del sistema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Alguien que me encuentre los errores!!!!

Publicado por Roberto Garcia (56 intervenciones) el 20/06/2005 06:20:08
Vaya, que interesante, lo probare enseguida
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Alguien que me encuentre los errores!!!!

Publicado por Serguei Esquivel (16 intervenciones) el 22/06/2005 18:40:07
Al final modifiqué la funcion reloj, le mande parametros ( i,j,k) en cero y que me devolviera un boolean, dentro de la funcion metí tres repeat anidados, hora, minutos, segundos, lo que hice diferente fue validar dentro de la funcion para que me tirara el boolean a "true" en el monento que ocupo valiadar.luego en el programa principal llamé a mi funcion validando que cuando devuelva el true activara las ventanas y los procedimientos de registros que ocupaba.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar