Newsgroup: it.comp.lang.pascal
Titolo: PutPixel e BP7

Ciao a Tutti!
Mi date una mano con questo programma? L'ho compilato in borland pascal 7
(non ditemi di usare il FreePascal perché funziona ancora di meno!), e
quando lo eseguo dal menu RUN-->RUN funziona tutto bene, ma quando eseguo
l'exe da dos o win9x/2000/XP non mi traccia alcune linee: la sinusoide, la
cosinusoide e metà della tangente! Mah! E perché alcune si e altre no?!?
Provandolo su altri pc non funziona nemmeno dal menu RUN-->RUN del pascal.
Cos' è, un'ennesimo bug tipo err200, div by zero del compilatore borland?
E la cosa strana è che mi da lo stesso errore sia usando la procedura
PutPixel della unit graph, sia usando una procedura PutPixel scritta in
assembly! Sotto posto il codice con la procedura standard della Unit,
comunque quella in assembly è:
procedure putpixel(x,y:integer; colore:byte);
begin
     asm
          mov ah,0Ch    {Funzione 0xC per mettere un pixel colorato sullo
schermo}
          mov al,colore  {Colore 0..15}
          mov bx,0        {Pagina video (mi pare...)}
          mov cx,x         {Coordinate X}
          mov dx,y         {Coordinate Y}
          int 10h             {Chiamata all'interrupt del BIOS 0x10}
     end;
end;
logicamente dopo aver inizializzato la modalità grafica con
asm
    mov ax,0012h {Modalità grafica 640x480x16}
    int 10h            {Chiamata all'interrupt del BIOS 0x10}
end;
Non è che c'è qualche anima pia di questo NG che mi da una mano a trovare
l'inghippo, magari compilandolo in qualche maniera differente?!?
Grazie a tuttti!
Ecco il codice:
Program bischero;
{Units}
uses graph;
{Dichiarazioni forwarded delle procedure e funzioni}
procedure tangente; forward;
procedure seno_coseno(n:byte; seno:boolean); forward;
procedure triangolo; forward;
procedure asseX; forward;
procedure asseY; forward;
{Costanti generali del programma}
const blu=1;
const rosso=4;
const bianco=15;
const PI=3.141592654;
{Variabili generali del programma}
var i:byte;
    grX,grY:integer;
    oggetto:string;
    {Queste due variabili sono per InitGraph}
    Gd, Gm: Integer;
{Disegna la funzione della tangente}
procedure tangente;
var x:real;
begin
     asseX; asseY;
     while (x<(PI/2.7)) do begin        {<----NON FUNZIONA NELL'EXE}
         x:=x+0.001;
         putpixel(round(x*100)+160,240-round((sin(x)/cos(x))*100),bianco);
     end;
     x:=PI;
     while (x>PI-(PI/2.7)) do begin
         x:=x-0.001;
         putpixel(round(x*100)+160,240-round((sin(x)/cos(x))*100),bianco);
     end;
end;
{Disegna la funzione del seno o del coseno}
procedure seno_coseno(n:byte; seno:boolean);        {<--NON FUNZIONA
NELL'EXE}
var i:byte;
    x:real;
begin
     writeln('Iterazioni: '); readln(i);
     asseX;
     if (seno) then begin
        while (x<=PI*2) do begin
              x:=x+0.001;
              putpixel(round(x*100),-round(sin(x*i)*100)+240,bianco);
        end;
     end
     else begin
        while (x<=PI*2) do begin
              x:=x+0.001;
              putpixel(round(x*100),-round(cos(x*i)*100)+240,bianco);
        end;
     end;
end;
{Disegna i vertici di un triangolo e ne calcola le dimensioni}
procedure triangolo;
var x,y,m: array [1..3] of real;
    len_ab,len_bc,len_ac:real;
    perimetro:real;
    tmpX,tmpY: array [1..3] of integer;
    {i,j:integer;}
begin
     for i:=1 to 3 do begin
         write('Immetti ',chr(i+64),'(x): '); readln(x[i]);
         write('Immetti ',chr(i+64),'(y): '); readln(y[i]);
     end;
     {Calcola le dimensioni del triangolo}
     len_ab := sqrt(sqr(x[2] - x[1]) + sqr(y[2] - y[1]));
     len_bc := sqrt(sqr(x[3] - x[2]) + sqr(y[3] - y[2]));
     len_ac := sqrt(sqr(x[3] - x[1]) + sqr(y[3] - y[1]));
     perimetro:=len_ab + len_bc + len_ac;
     if (x[2] <> x[1]) then begin
          m[1]:=(y[2]-y[1])/(x[2]-x[1]);
     end
     else begin
          m[1]:=x[1];
     end;
     if (x[2] <> x[3]) then begin
          m[2]:=(y[2]-y[3])/(x[2]-x[3]);
     end
     else begin
          m[2]:=x[2];
     end;
     if (x[3] <> x[1]) then begin
          m[3]:=(y[3]-y[1])/(x[3]-x[1]);
     end
     else begin
          m[3]:=x[3];
     end;
     for i:=1 to 15 do
         writeln;
     writeln('AB misura ',len_ab:8:6,' ed il suo coefficiente angolare S:
',m[1]:8:6);
     writeln('BC misura ',len_bc:8:6,' ed il suo coefficiente angolare S:
',m[2]:8:6);
     writeln('AC misura ',len_ac:8:6,' ed il suo coefficiente angolare S:
',m[3]:8:6);
     writeln;
     writeln('Il perimetro del triangolo misura: ', perimetro:8:6);
     asseX; asseY;
     {Disegna il triangolo}
     for i:=1 to 3 do begin
         putpixel(round(x[i])+320,-round(y[i])+240,rosso);
     end;
end;
{Disegna l'asse X}
procedure asseX;
begin
     for grX:=0 to 640 do
         putpixel(grX,240,bianco);
end;
{Disegna l'asse Y}
procedure asseY;
begin
     for grY:=0 to 480 do
         putpixel(320,grY,bianco);
end;
{Main (qui inizia il programma...)}
begin
     {Modalit. grafica 640x480x16}
     Gd:=Detect;
     InitGraph(Gd,Gm,' ');
     writeln;
     write('Oggetto: ');
     readln(oggetto);
     {Converte in maiuscolo}
     for i:=1 to length(oggetto) do
          oggetto[i]:=upcase(oggetto[i]);
     {Controlla quale oggetto S stato scelto}
     if ((oggetto='TANGENTOIDE') or (oggetto='TANGENTE')) then begin
        tangente;
     end
     else if ((oggetto='SINUSOIDE') or (oggetto='SENO')) then begin
          seno_coseno(i,true);
     end
     else if ((oggetto='COSINUSOIDE') or (oggetto='COSENO')) then begin
          seno_coseno(i,false);
     end
     else if (oggetto='TRIANGOLO') then begin
        triangolo;
     end
     else begin
         writeln('ERRORE: non riconosciuta: ',oggetto);
     end;
     readln;
     {Modalit. testo 640x400x256}
     CloseGraph;
end.
-------------
Kernel panic
-------------

L'unica cosa che mi viene in mente è questa.....
...L'int 10h lavora direttamente nella memoria video (e se non ricordo male è pienamente compatibile con la modalità
testo e non con quella grafica), ora ti converrebbe utilizzare le funzioni grafiche standard del BP per quanto riguarda
PutPixel settando la scheda video che più ti aggrada:
Procedure Apri_Grafica;
Var
  Gr, GD : Integer;
Begin
     (* Per le varie modalità guarda l'help *)
     Gr := VGA;
     GD := VGAHI;
     InitGraph(Gr, Gd, '');
     If GraphResult <> 0 Then (* Errore in apertura modalità grafica *)
End;
Per chiudere la grafica usa CloseGraph e per visualizzare un pixel usa PutPixel (guarda l'help comunque)
--
Ciao,
David (
www.utilityweb.net
)

 [snip]
hihihi subito a dare la colpa al compilatore :-)
in entrambe le procedure ti sei svanito di inizializzare x := 0 prima di 
utilizzarla: sotto l'IDE probabilmente qualche (santa) procedura pulisce 
la memoria prima di lanciare il tuo programma, quindi x e' zero, sotto dos 
no, quindi chissa' che valore contiene :-)
-- 
Dreadnaut - 
http://dreadnaut.servebeer.com/
(Life would be easier if I had the source code)

 no, quindi chissa' che valore contiene :-)
OOOOPPPPPSS!!! E io che sono stato 1 ora a disassemblare l'exe!!! ;) Cmq ero
in buona fede, pensavo che ogni volta che in pascal si dichiara una var,
questa venga sempre inizializzata a 0!
Vabbč grazie
-------------
Kernel panic
-------------

 Vabbč grazie
purtroppo no :-\  il turbo pascal non inizializza le variabili quindi
devi farlo tu a mano...  improvvisa reminiscenza della prima liceo, 
altrimenti non l'avrei mai trovato: io pensavo gia' fosse un problema 
dell'rtm o della gestione della memoria :-)
