Ciao a tutti,
dovendo, per una verifica, sfruttare il contenuto di una matrice fra tre, di diversa lunghezza l'una dall'altra, ho pensato di richiamare sempre una procedura, passandole il riferimento alla matrice corretta per la verifica:
unit cofamtrasf;
--- bla --- bla ---
private
type
PtbCoCas = ^TtbCoCas;
TtbCoCas = array[0..1, 0..1] of Integer;
PtbCoPartMov = ^TtbCoPartMov;
TtbCoPartMov = array[0..2, 0..1] of Integer;
PtbCoPreMom = ^ TtbCoPreMom;
TtbCoPreMom = array[0..1, 0..1] of Integer;
const
TtbCas: TtbCoCas = ((101001000, 101001997),
(101001990, 101001999));
TtbPartMov: TtbCoPartMov = ((102001000, 103999999),
(105001000, 203999999),
(205001000, 999999999));
TtbPreMom: TtbCoPreMom = ((104001000, 104999000),
(204001000, 204999000));
--- bla --- bla ---
procedure carCombo(Var TtbCoVoci);
var
i, ii, iMax: integer;
begin
iMax=TtbCoVoci.length/2-1;
for i:= 0; to iMax do
for ii:= 0 to 1 do
writeln('TtbCoVoci[', i,', ', ii, '] = ', TtbCoVoci[i, ii]);
end;
procedure TForm1.VoMasPartChange(Sender: TObject);
begin
case VoMasPart.Text of
'Cassa':
carCombo(TtbCas);
'Partmovv':
carCombo(TtbPartMov);
'Prestmom':
carCombo(TtbPreMom);
end;
end;
In compilazione ricevo l'errore :
cofamtrasf.pas(131,18) Error: Illegal qualifier
relativo a:
procedure carCombo(Var TtbCoVoci);
var
i, ii, iMax: integer;
begin
iMax=TtbCoVoci.length/2-1;
La posizione 131,18 e la prima lettera della parola length
Ma molto probabilmente l'errore si riferisce alla costante TtbCoVoci che ora dovrei usare per lavorare sul valore contenuto all'indirizzo di memoria passato per riferimento.
Purtroppo non ho trovato niente sull'argomento specifico.
Scusate, Ho quasi risolto.
L'errore precedente è superato. era determinato da:
procedure carCombo(Var TtbCoVoci);
Infatti si doveva scrivere
procedure carCombo(Var TtbCoVoci:integer);
Mi era sfuggito.
:'( :)
Non riesco a passare il riferimento alla matrice corretta alla procedura carCombo, che dovrebbe svolgere l'accesso al DB per la lettura della tabella di pertinenza.
Ho modificato il mio programma, riscrivendo gran parte del codice nell'editor sorgente che riporto, nelle parti salienti qui:
unit cofamtrasf; {Classe: tipo Form_Main}
{$mode objfpc}{$H+}
interface
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, db, Forms, Controls, Graphics, Dialogs, StdCtrls, EditBtn,
ExtCtrls, DBGrids, DBCtrls, ZConnection, ZDataset;
type
{ TForm1 }
TForm1 = class(TForm)
--- bla --- bla ---
private
var
FmatriceCassa: array[0..1] of array [0..1] of Integer;
FmatricePartitario: array[0..2] of array [0..1] of Integer;
FmatricePrestiti: array[0..1] of array [0..1] of Integer;
i: Integer;
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormActivate(Sender: TObject);
begin
FmatriceCassa[0,0]:= 101001000; FmatriceCassa[0,1]:= 101001997; // 1° range conti di Cassa (tabella movimgg)}
FmatriceCassa[1,0]:= 101001990; FmatriceCassa[1,1]:= 101001999; // ultimo range conti di Cassa (tabella movimgg)
FmatricePartitario[0,0]:= 102001000; FmatricePartitario[0,1]:= 103999999; // 1° range conti di contropartita (tabella partmovv)
FmatricePartitario[1,0]:= 105001000; FmatricePartitario[1,1]:= 203999999; // 2° range conti di contropartita (tabella partmovv)
FmatricePartitario[2,0]:= 205001000; FmatricePartitario[2,1]:= 999999999; // ultimo range conti di contropartita (tabella partmovv)
FmatricePrestiti[0,0]:= 104001000; FmatricePrestiti[0,1]:= 104999000; // 1° range conti di contropartita (tabella prestmoom)
FmatricePrestiti[1,0]:= 204001000; FmatricePrestiti[1,1]:= 204999000; // ultimo range conti di contropartita (tabella prestmoom)}
end;
procedure carCombo(FnomeMatrice: String; FNumRighe: Integer);
var
i: Integer;
ii: Integer;
begin
for i := 0 to FNumRighe do
for ii := 0 to 1 do
begin
writeln('Form1.FnomeMatrice[', i,', ', ii, '] = ', Form1.FnomeMatrice[i, ii]);
end;
end;
procedure TForm1.VoMasPartChange(Sender: TObject);
begin
case VoMasPart.Text of
'Cassa':
carCombo('FmatriceCassa', 2);
'Partmovv':
carCombo('FmatricePartitario', 3);
'Prestmom':
carCombo('FmatricePrestiti', 2);
end;
end;
end.
Secondo me scrivendo, nella procedura carCombo
writeln('Form1.FnomeMatrice[', i,', ', ii, '] = ', Form1.FnomeMatrice[i, ii]);
avrei dovuto puntare direttamente alla matrice corretta, invece mi sbaglio.
Ho provato a mettere il riferimento VAR dentro i parametri di ingresso di detta procedura, ma ricevo errore.
Ricordo di aver letto da qualche parte, ma non ricordo dove, che esiste una parola chiave che funziona come il this di java, che avrei voluto scrivere al posto di Form1.
Avrei voluto sfruttare le caratteristiche di un array dinamico, ma non ho capito si funziona sola per i vettori.
Come si vede, ho idee , tutte confusamente ingarbugliate.
Avrei bisogno di rimetterle in ordine per proseguire. Chissà, forse il dovere affrontare oggi problematiche per me complesse, mi potrà aiutare a conoscere più in dettaglio il Free Pascal.
un altro paio di esempi funzionanti
program project1;
type
TMatrice = array of array of Integer;
procedure Stampapatrice(UnaMatrice: TMatrice);
var i: Integer;
ii: Integer;
begin
for i := 0 to high(UnaMatrice) do
for ii := 0 to high(UnaMatrice[0]) do
begin
writeln(' UnaMatrice[', i,', ', ii, '] = ', UnaMatrice[i, ii]);
end;
end;
var
FmatriceCassa, FmatricePartitario: TMatrice;
begin
FmatriceCassa := TMatrice.Create(
[ 101001000, 101001997 ],
[ 101001990, 101001999 ]
);
writeln('FmatriceCassa');
Stampapatrice(FmatriceCassa);
writeln('');
writeln('FmatricePartitario');
SetLength(FmatricePartitario, 3, 2);
FmatricePartitario[0,0]:= 102001000; FmatricePartitario[0,1]:= 103999999; // 1° range conti di contropartita (tabella partmovv)
FmatricePartitario[1,0]:= 105001000; FmatricePartitario[1,1]:= 203999999; // 2° range conti di contropartita (tabella partmovv)
FmatricePartitario[2,0]:= 205001000; FmatricePartitario[2,1]:= 999999999; // ultimo range conti di contropartita (tabella
Stampapatrice(FmatricePartitario);
end.
beh, manca la dichiarazione di TMatrice
guarda nel mio sorgente ;)
No, la dichiarazione c'è. Può darsi che io l'abbia inserita male:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs;
type
TForm1 = class(TForm)
private
type
TMatrice = array of array of Integer;
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure Stampapatrice(UnaMatrice: TMatrice);
beh, manca la dichiarazione di TMatrice
guarda nel mio sorgente ;)
No, la dichiarazione c'è. Può darsi che io l'abbia inserita male:
unit Unit1;
{$mode objfpc}{$H+}
[code]unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs;
type
TMatrice = array of array of Integer;
type
TForm1 = class(TForm)
private
MiaMatrice : TMatrice;
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure Stampapatrice(UnaMatrice: TMatrice);
La dichiarazione di tmatrice va fuori dalla classe perchè è la dichiarazione di un tipo e non una variabile
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs;
type
TForm1 = class(TForm)
private
type
TMatrice = array of array of Integer;
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure Stampapatrice(UnaMatrice: TMatrice);
Quando ho cominciato questa discussione era il 4 aprile. Oggi è il 10 aprile. Sono perciò trascosi 7 giorni interi e, praticamente, sono sempre allo stesso punto, pur avendo fatto non so quanti cambiamenti, anche col vostro grande aiuto.
La compilazione non si completa. Mi viene il dubbio che Free Pascal non gestisca le matrici, ma soltanto vettori.
L'ho sparata grossa? Può darsi, ma dopo sei giorni di battaglie perse, sfiderei qualunque principiante a pensarla diversamente da me.
Scusate, ma dovevo sfogarmi.
Oggi ho fatto questo ragionamento. Cosa succede se anzicchè puntare alla matrice non vado a caricarne i valori? E poi: visto che la matrice è dichiarata a livello di Unit, perchè devo passarla alla procedura finale come parametro? Non posso richiamarla direttamente proprio nella procedura finale?
Mi sono così messo all'opera, ma ho perso di nuovo la battaglia perchè il compilatore produce l'errore:
identifier not found "FmatriceComune"
ecco il codice:
unit cofamtrasf; {Classe: tipo Form_Main}
{$mode objfpc}{$H+}
interface
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, db, Forms, Controls, Graphics, Dialogs, StdCtrls, EditBtn,
ExtCtrls, DBGrids, DBCtrls, ZConnection, ZDataset;
type
{ TForm1 }
TForm1 = class(TForm)
VoMasArri: TComboBox;
VoMasPart: TComboBox;
contabfamDB: TDataSource;
DBSotCtoArri: TDBComboBox;
DBVoSecArri: TDBComboBox;
DbVoSecPart: TDBComboBox;
DBSotCtoPart: TDBComboBox;
pExit: TButton;
PNoVis: TButton;
DtFin: TDateEdit;
DtIni: TDateEdit;
Label5: TLabel;
Label6: TLabel;
pVia: TButton;
CoVoPart: TEdit;
CoVoArri: TEdit;
Label3: TLabel;
Label4: TLabel;
MovDest: TGroupBox;
SotCtoPart: TComboBox;
Label2: TLabel;
SotCtoArri: TComboBox;
VoSecPart: TComboBox;
Label1: TLabel;
MovTrasf: TGroupBox;
VoSecArri: TComboBox;
ZConnection1: TZConnection;
ZQuery1: TZQuery;
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure pExitClick(Sender: TObject);
procedure pExitEnter(Sender: TObject);
procedure pExitExit(Sender: TObject);
procedure PNoVisEnter(Sender: TObject);
procedure VoMasPartChange(Sender: TObject);
private
type
TmatriceComune= array of array of Integer; // tipo di matrice dinamica
TmatriceCassa= array[0..1] of array [0..1] of Integer;
TmatricePartitario= array[0..2] of array [0..1] of Integer;
TmatricePrestiti= array[0..1] of array [0..1] of Integer;
var
FmatriceComune: TmatriceComune;
FmatriceCassa: TmatriceCassa;
FmatricePartitario: TmatricePartitario;
FmatricePrestiti: TmatricePrestiti;
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormActivate(Sender: TObject);
begin
FmatriceCassa[0,0]:= 101001000; FmatriceCassa[0,1]:= 101001997; // 1° range conti di Cassa (tabella movimgg)}
FmatriceCassa[1,0]:= 101001990; FmatriceCassa[1,0]:= 101001999; // ultimo range conti di Cassa (tabella movimgg)}
FmatricePartitario[0,0]:= 102001000; FmatricePartitario[0,1]:= 103999999; // 1° range conti di contropartita (tabella partmovv)
FmatricePartitario[1,0]:= 105001000; FmatricePartitario[1,1]:= 203999999; // 2° range conti di contropartita (tabella partmovv)
FmatricePartitario[2,0]:= 205001000; FmatricePartitario[2,1]:= 999999999; // ultimo range conti di contropartita (tabella
FmatricePrestiti[0,0]:= 104001000; FmatricePrestiti[0,1]:= 104999000; // 1° range conti di contropartita (tabella prestmoom)
FmatricePrestiti[1,0]:= 204001000; FmatricePrestiti[1,1]:= 204999000; // ultimo range conti di contropartita (tabella prestmoom)}}
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
procedure TForm1.pExitClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.pExitEnter(Sender: TObject);
begin
end;
procedure TForm1.pExitExit(Sender: TObject);
begin
end;
procedure TForm1.PNoVisEnter(Sender: TObject);
begin
end;
procedure carCombo(FNumRighe: Integer);
var
i: Integer;
ii: Integer;
begin
for i := 0 to FNumRighe do
for ii := 0 to 1 do
begin
writeln('FmatriceComune[', i,', ', ii, '] = ', FmatriceComune[i, ii]); //*** riga dell'ERROR ***
end;
end;
procedure TForm1.VoMasPartChange(Sender: TObject);
var
FnumEl: Integer;
begin
case VoMasPart.Text of
'Cassa':
FmatriceComune = FmatriceCassa;
FnumEl = 2;
'Partmovv':
FmatriceComune = FmatricePartitario:
FnumEl = 3;
'Prestmom':
FmatriceComune = FmatricePrestiti;
FnumEl = 2;
end;
carCombo(FnumEl);
end;
end.
É così che viene voglia di gettare tutto alle ortiche.
Ho appena scaricato e disimpaccato il file matrix.zip.
petrus@petrus-pc /media/dirdati/dativari/lazarus_progetti/Matrix $ unzip matrix.zip
Archive: matrix.zip
creating: matrix/
inflating: matrix/project1.ico
inflating: matrix/project1.lpi
inflating: matrix/project1.lps
inflating: matrix/project1.lpr
inflating: matrix/project1.res
inflating: matrix/unit1.pas
inflating: matrix/unit1.lfm
petrus@petrus-pc /media/dirdati/dativari/lazarus_progetti/Matrix $
Ho avviato Lazarus ed ho comandato l'apertura del progetto: si sono aperte tutte le finestre dell'IDE, ma tutte vuote.
Ho allora aperto i fil .pas, .lfm, .lpr, .lps ed ho avviato la compilazione.
Anche questa volta: nuovo errore. Ti prego di guardare l'allegato. Io non capisco l'errore, ma a sensazione di incompetente posso azzardare che ci sia un disallineamento fra la tua versione di Lazarus e la mia.
L'unica cosa che posso fare è leggere il contenuto del file unit1.pas