Newsgroup: it.comp.lang.pascal
Titolo: pascal ma non delphi

Lo vedete questo programma sotto? Molto probabilmente no perchè ancora
dovete arrivarci qua sotto...
Apparte di scherzi perchè questo programma sotto pascal gira alla perfezione
e sotto delphi no?
È ovvio che le varie stringhe vengono sostituite da edit e che invece di
writeln la stringa va a finire in una label...
La cosa più strana è che la Codifica (programma che fa l'esatto contrario di
questo) funge alla perfezione e l'ho trascritto senza il minimo intoppo...
Aiutatemi voi.
Grazie
{-------------------------------------------------}
Program Decodificatore;
Uses Crt,Dos;
{
Questo programma decripta un messaggio, sapendo la password ad esso
associata.
}
Const Lung=7;
      Alt=18;
Var Messaggio:String[(Lung*Alt)];
    Password:String[Lung+1];
    I,J,K:Integer;
    Matrix:Array[1..Lung,1..Alt] Of Char;
    Ordina:Array[1..Lung*Alt] Of Integer;
Begin
     {INSERIMENTO PASSWORD}
     Repeat
     Repeat
           Clrscr;
           Writeln('Questo programma decripta un messaggio, sapendo la
password ad esso associata.');
           Writeln;
           Write('Inserisci la password conosciuta: ti ricordo ');
           Textcolor(4);
           Write('DEVE');
           Textcolor(7);
           Write(' essere lunga ',Lung,' caratteri: ');
           Writeln;
           Writeln;
           Write('Password= ');
           Readln(Password);
     Until (Length(Password)=Lung);
     J:=0;
     For I:=1 To Lung Do
          Begin
               If (Password[I]=Chr(35)) Then
               J:=1;
          End;
     Until (J=0);
     {INSERIMENTO FRASE}
     Repeat
           Clrscr;
           Write('Inserisci la frase da decriptare lunga ');
           Textcolor(4);
           Write('OBBLIGATORIAMENTE');
           Textcolor(7);
           Write(' ',Lung*Alt,' caratteri:');
           Writeln;
           Writeln;
           Write('Frase= ');
           Readln(Messaggio);
     Until (Length(Messaggio)=Lung*Alt);
     Writeln;
     {ASSEGNAZIONE DEI # ALLA MATRICE}
     For I:=1 To Alt Do
     For J:=1 To Lung Do
         Matrix[I,J]:=Chr(35);
     For I:=1 To Lung*Alt Do
        If (Messaggio[I]<>Chr(35)) Then
           Messaggio[I]:=Chr(Ord(Messaggio[I])-1);
     {ASSEGNAZIONE DELLA FRASE IN ORDINE ALLA MATRICE}
     For K:=1 To Lung Do
     Begin
          For I:=1 To Length(Messaggio) Do
          If (I Mod Alt=1) Then
          Begin
               If ((Password[K]=Messaggio[I]) And (Matrix[1,K]=Chr(35)))
Then
                  For J:=1 To Alt Do
                  Begin
                       Matrix[J,K]:=Messaggio[J+I-1];
                       Messaggio[J+I-1]:=Chr(254);
                  End;
          End;
     End;
     {SCRITTURA DELLA FRASE DECRIPTATA}
     Writeln('La frase decriptata S:');
     Writeln;
     For I:=2 To Alt Do
     For J:=1 To Lung Do
         If (Matrix[I,J]<>Chr(35)) Then
            Write(Matrix[I,J]);
     Writeln;
     Writeln;
     Writeln('N.B. se la frase decriptata risulta illegibile prova a
reinserirla daccapo e');
     Writeln('controlla la password!');
     Writeln;
     Writeln('Premi invio per uscire');
     Writeln;
     Textcolor(2);
     Write('Copyright¸ Carletto 
chiamac...@tiscalinet.it
');
     Readln;
End.

Uses Crt,Dos;
Le unità che usi dovrebbero dare un indizio.
Con Delphi non puoi scrivere programmi per console DOS.
Anche se credo di avere una specie di patch da qualche parte... cerca
sull'archivio Simtel.
---
Ciao
PV

spedisci la versione delphi ch non funzia...
non quella pascal che va :-)
--
Dreadnaut (dn)
drea...@liberoDALLASPAM.it
(Life would be easier if I had the source code)

> Con Delphi non puoi scrivere programmi per console DOS.
Non è del tutto vero, esiste una direttiva particolare che dice al
compilatore di generare un exe per dos-shell (senza mail form & co) ma non
viene mai usata perchè, a quel punto, converrebbe usare un altro linguaggio
più adatto.
Ciauz
--
KNOWLEDGE IS POWER
http://www.sverzat.com
¯`·.           .·´¯`:
'·.   .`·.   .·´.   .·'
   `:--·´   `·--:´
      `·. '_' .·
        ;`·-·´;

Con Delphi non puoi scrivere programmi per console DOS.
program HelloWorld;
{$APPTYPE CONSOLE}
 
begin
    Writeln('Hello world!');
end.
Puoi farci tutto ciò che fai con il turbo pascal e anche di più, visto
che hai in + la VCL a disposizione ;)
-- 
(*metallikop*libero*it*)
{
http://digilander.iol.it/metallikop
}

ecco la versione in delphi che non funzia
dateci un occhiata please
l'errore che mi da č
{
Project Project1.exe raised exception class EAccessViolation with message
'Access violation at address 004423AA in module 'Project1.exe'. Read of
address 00223F418'. Process stopped. Use Step or Run to continue.
}
look here
la parte che non funge č la decodifica, la codifica va
-----------------------
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Mask;
type
  TCodDecod = class(TForm)
    Text: TEdit;
    FraseLabel: TLabel;
    PassLabel: TLabel;
    Pass: TEdit;
    Btn: TButton;
    Rb1: TRadioButton;
    Rb2: TRadioButton;
    Status: TLabel;
    FraseLabelCodDecod: TLabel;
    FraseCodDecod: TEdit;
    procedure Rb1Click(Sender: TObject);
    procedure Cod(Sender: TObject);
    procedure Decod(Sender: TObject);
    procedure Rb2Click(Sender: TObject);
    procedure StatusChange(Sender: TObject);
    procedure BtnClick(Sender: TObject);
    function Codifica(Pass,Text:String):String;
    function Decodifica(Pass,Text:String):String;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  CodDecod: TCodDecod;
implementation
{$R *.DFM}
procedure TCodDecod.Cod(Sender: TObject);
begin
//Codifica
end;
procedure TCodDecod.Decod(Sender: TObject);
begin
//Decodifica
end;
procedure TCodDecod.Rb1Click(Sender: TObject);
begin
FraseLabel.Caption:='Inserire Qui La Frase Da Codificare';
Text.MaxLength:=119;
Btn.Caption:='Codifica';
FraseLabelCodDecod.Caption:='La Frase Codificata Č:';
StatusChange(Sender);
end;
procedure TCodDecod.Rb2Click(Sender: TObject);
begin
FraseLabel.Caption:='Inserire Qui La Frase Da Decodificare';
Text.MaxLength:=126;
Btn.Caption:='Decodifica';
FraseLabelCodDecod.Caption:='La Frase Decodificata Č:';
StatusChange(Sender);
end;
procedure TCodDecod.StatusChange(Sender: TObject);
begin
If (Rb1.Checked) Then
begin
  If ((Length(Pass.Text)=7) And (Text.Text<>'')) Then
  begin
     Btn.Enabled:=True;
     Status.Visible:=False;
  end
  Else
  begin
     Btn.Enabled:=False;
     Status.Visible:=True;
  end;
end;
If (Rb2.Checked) Then
begin
  If ((Length(Pass.Text)=7) And (Length(Text.Text)=126)) Then
  begin
     Btn.Enabled:=True;
     Status.Visible:=False;
  end
  Else
  begin
     Btn.Enabled:=False;
     Status.Visible:=True;
  end;
end;
end;
procedure TCodDecod.BtnClick(Sender: TObject);
begin
FraseLabelCodDecod.Visible:=True;
FraseCodDecod.Visible:=True;
If (Rb1.Checked) Then
   FraseCodDecod.Text:=Codifica(Pass.Text,Text.Text);
If (Rb2.Checked) Then
   FraseCodDecod.Text:=Decodifica(Pass.Text,Text.Text);
end;
function TCodDecod.Codifica(Pass, Text: String): String;
Var
  Matrix:Array[1..18,1..7] Of Char;
  Ordina:Array[1..7] Of Char;
  Temp:Char;
  I,J,K:Integer;
begin
//Riempimento Stringa
  For I:=Length(Text)+1 To 119 Do
    Text:=Text+Chr(35);
//Assegnazione Password
  For J:=1 To 7 Do
    Matrix[1,J]:=Pass[J];
//Assegnazione Frase
  K:=0;
  For I:=2 To 18 Do
    Begin
      For J:=1 To 7 Do
        Begin
          K:=K+1;
          Matrix[I,J]:=Text[K];
        End;
    End;
//Ordinamento Password
  For I:=1 To 7 Do
    Ordina[I]:=Matrix[1,I];
  For I:=1 To 7 Do
    Begin
      For J:=1 To 6 Do
        Begin
          If (Ordina[J]>Ordina[J+1]) Then
            Begin
              Temp:=Ordina[J];
              Ordina[J]:=Ordina[J+1];
              Ordina[J+1]:=Temp;
            End;
        End;
    End;
//Oscuramento Lettere
  For I:=1 To 7 Do
    Begin
      For J:=I+1 To 7 Do
        If (Ordina[I]=Ordina[J]) Then
          Ordina[J]:=Chr(254);
    End;
//Assegnazione Frase
  Text:='';
  For K:=1 To 7 Do
    Begin
      For J:=1 To 7 Do
        Begin
          If (Ordina[K]=Matrix[1,J]) Then
            For I:=1 To 18 Do
              If (Matrix[I,J]<>Chr(35)) Then
                Text:=Text+Chr(Ord(Matrix[I,J])+1)
              Else
                Text:=Text+Matrix[I,J];
        End;
    End;
//Restituzione Frase
Codifica:=Text;
end;
function TCodDecod.Decodifica(Pass, Text: String): String;
Var
  K,I,J:Integer;
  Matrix:Array[1..7,1..18] Of Char;
begin
//Azzeramento Matrice
  For I:=1 To 18 Do
    For J:=1 To 7 Do
      Matrix[J,I]:=Chr(35);
//Decodifica;
  For I:=126 DownTo 1 Do
    If (Text[I]<>Chr(35)) Then
      Text[I]:=Chr(Ord(Text[I])-1);
//Assegnazione
  For K:=1 To 7 Do
    Begin
      For I:=1 To 126 Do
        If (I Mod 18=1) Then
          Begin
            If ((Pass[K]=Text[I]) And (Matrix[1,K]=Chr(35))) Then
              For J:=1 To 18 Do
                Begin
                  Matrix[J,K]:=Text[J+I-1];
                  Text[J+I-1]:=Chr(254);
                End;
          End;
    End;
end;
end.


Mumble... mi č tornato in mente di aver visto da qualche parte (leggi:
Simtel o Garbo) una patch per creare programmi in modo reale con
Delphi.
Ora sul disco trovo piů niente al riguardo... devo avere spostato
tutto in qualche backup.
---
Ciao
PV

                  Text[J+I-1]:=Chr(254);
questo a che serve ? annulli la stringa in text, pero'
il parametro non e' dichiarato var quindi l'effetto e' zero
poi manca la restituzione del risultato della funzione,
una cosa del tipo:
 var res: string;
...
  Res := '';
  For I:=2 To 7 Do
   For J:=1 To 126 Do
    If (Matrix[I,J]<>Chr(35)) Then Res := Res + Matrix[I,J];
{recuperata piu' o meno dal .pas per dos... ma e' abbastanza
diverso cmq da quello per delphi !!? }
  Decodifica := Res;
cosi' funziona... al massimo avanzano 3/4 char alla fine
della stringa decodificata... ma forse e' colpa mia :-)
ciao


controllerò... comunque mi chiedo perchè quella stessa funzione in pascal
funga e in delphi no
cioè è spiaccicata ed ora ti spiego
***programma pascal***
Const Lung=7;
      Alt=18;
Var Messaggio:String[(Lung*Alt)];
    Password:String[Lung+1];
    I,J,K:Integer;
    Matrix:Array[1..Lung,1..Alt] Of Char;
***funzione principale pascal***
     For K:=1 To Lung Do
     Begin
          For I:=1 To Length(Messaggio) Do
          If (I Mod Alt=1) Then
          Begin
               If ((Password[K]=Messaggio[I]) And (Matrix[1,K]=Chr(35)))
Then
                  For J:=1 To Alt Do
                  Begin
                       Matrix[J,K]:=Messaggio[J+I-1];
                       Messaggio[J+I-1]:=Chr(254);
                  End;
          End;
     End;
***fine funzione***
***funzione delphi***

***fine programma delphi***
è ovvio che per forza di cose devo sostituire la variabile Messaggio di tipo
string con una identica chiamata text che fa riferimento ad una edit
i programmi sono identici
anche la funzione di codifica è identica nel pascal ma quella trascritta è
rimasta identica ma con questa non va
delucidami ancora please
"Dreadnaut" <Drea...@liberoDALLASPAM.it> ha scritto nel messaggio
news:i6Z38.828$6e5....@twister2.libero.it...


 Ora sul disco trovo più niente al riguardo... devo avere spostato


  i programmi sono identici
infatti :-)



Intendi dire qualcosa del genere?
var CrtMode: Byte absolute $0040;
oppure:
var
  Str: string[32];
  StrLen: Byte absolute Str;
Allora in delphi si può :-)
-- 
(*metallikop*libero*it*)
{
http://digilander.iol.it/metallikop
}

e perchè non funzionaaaaaaaaaaaaaaaaa
ciao
"Dreadnaut" <Drea...@liberoDALLASPAM.it> ha scritto nel messaggio
news:kAi48.6704$761.2...@twister1.libero.it...


 ciao
a questo punto mi sento scemo...


> a questo punto mi sento scemo...
dato che forse e' perche' lo sono, mi metto l'anello Calma +20
e indosso la maglia Gentilezza +5 e cerco di spiegarmi...
Non funziona perche' e' sbagliata.
E' sbagliata sia quella per pascal che quella per delphi.
in entrambe definisci la matrice come un rettangolo 7x18
ma quando la usi nell'ultimo ciclo della decodifica la indicizzi
su J e K, che vanno rispettivamente fino a 18 e 7.
Cioe' cerchi di accedere a delle celle che sono fuori dalla
matrice !! non esistono !!
In pascal la memoria e' gestita in modo diverso, quindi se
anche leggi e scrivi in celle non tue i danni sono limitati,
al massimo sovrascrivi altre variabili, invece sotto win il
memory manager si rifiuta di lasciarti leggere celle di memoria
che non fanno parte delle tue variabili, e quindi da' errore.
boh...


 {
http://digilander.iol.it/metallikop
}
Ciao...
Kyle

già così va meglio...
quindi intendi che in teoria anche la versione pascal è sbagliata... non so
se hai ragione fatto sta che in pascal funzionava così ed in delphi no e mi
ero inpuntato su questo...
adesso ho cambiato i cicli, l'errore è scomparso, la conversione sembra sia
avvenuta correttamente, ma alla fine della frase decodificata mi mette
sempre 3 caratteri strani e le frasi di lunghezza maggiore a 56 caratteri
(anche 57) non me le traduce correttamente.
bah se mi puoi aiutare ti sono grato
"Dreadnaut" <Drea...@liberoDALLASPAM.it> ha scritto nel messaggio
news:WjC48.11622$761.3...@twister1.libero.it...


var vram:Tvram absolute $A000:$0000;
In Delphi5 l'offset non si usa visto che si lavora a 32 bit.
Quello lo facevo quando usavo Delphi1 e borland turbo basic,  che
funzionavano a 16 bit.
-- 
(*metallikop*libero*it*)
{
http://digilander.iol.it/metallikop
}

> borland turbo basic,  che
sigh... che bei tempi... quando ci volevano 30 sec per
compilare 200 righe di codice... -snif-
ciao,
un Dreadnaut che una lacrimuccia gli scappa...

interface 
 uses Dreadnaut; 
 const date = Sat, 26 Jan 2002 23:11:18 GMT; 

LOL, io col mio potentissimo 386 e 4 Mb di ram ci mettevo moooolto
meno, diciamo 10 secondi :-))))
-- 
(*metallikop*libero*it*)
{
http://digilander.iol.it/metallikop
}