* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 16, 2024, 10:30:23 am

Inserisci il nome utente, la password e la durata della sessione.

14 Visitatori, 0 Utenti

Autore Topic: [Risolto] variabile array restituita da function  (Letto 860 volte)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
[Risolto] variabile array restituita da function
« il: Aprile 20, 2021, 12:59:21 pm »
Per farmi restituire più variabili da una function ho sempre utilizzato variabili array.
Non ho mai avuto problemi, anche in Lazarus. Ho però impiegato variabili di tipo variant.
Questa volta, dovendo ricevere dati della stessa natura, ho messo in campo variabili String.
Però il compilatore non accetta le mie dichiarazioni e mi fornisce errori come l seguenti:
Citazione
frmmain.pas(1114,13) Error: Incompatible types: got "TtbRitorno" expected "AnsiString"
frmmain.pas(1357,21) Error: Incompatible types: got "AnsiString" expected "TtbRispo"
Riporto il codice scritto:
Codice: [Seleziona]
function LeggiRecPiaCont(coVoce: String): String;
type
  TtbRitorno = array[0..4] of String;

var
  swErro: Boolean;

  descrMov: String;
  sql: String = 'SELECT * FROM piancont WHERE NumVoce = ';

  tbRitorno: TtbRitorno;
begin
  sql:= sql + coVoce;
  Form1.ZQuery1.SQL.Text:= sql;
  try
    Form1.ZQuery1.ExecSQL;
  except
    on E: Exception do
    begin
      swErro:= True;
       ShowMessage('ERRORE ' + E.Message + System.lineending + 'nella LETTURA del record ContabFamDB.piancont.' + coVoce + System.lineending + System.lineending  + '***** Il programma verra'' chiuso *****');
       Application.Terminate;
    end;
  end;
   tbRitorno[0]:= Form1.ZQuery1.FieldByName('NumVoce').AsString;
   tbRitorno[1]:= Form1.ZQuery1.FieldByName('NomeVoce').AsString;
   tbRitorno[2]:= Form1.ZQuery1.FieldByName('ContrPartSiNo').AsString;
   tbRitorno[3]:= Form1.ZQuery1.FieldByName('DtPrimoUso').AsString;
   tbRitorno[4]:= Form1.ZQuery1.FieldByName('DtUltimUso').AsString;
   Result:= tbRitorno;   <--- produce ERROR
end;                     

procedure InsRecMovvgg(dtTratt, infTb: String; ixTbMovv: Integer);
type
   TtbRispo = array of String;                 
[...]
var
tbRispo: TtbRispo;
begin
[...]
          tbRispo:= LeggiRecPiaCont(tbMovv[i, 3]);   // tbMovv[i, 3], cioè "codice Voce"  <--- produce ERROR
          SetLength(tbRispo, 2);
          nomeVoce:= tbRispo[0];   // piancont.NomeVoce
          segnContrPart:= tbRispo[1];   // piancont.ContrPartSiNo
[...]

Da ieri cerco di risalire all'errore, ma qualsiasi soluzioone tentata dalla mia immaginazione è fallita. Ho provato anche a sostituire il tipo di variabili da String a Variant, ma inutilmente.
« Ultima modifica: Aprile 20, 2021, 10:05:23 pm da petrusic »
ciao ciao

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:variabile array restituita da function
« Risposta #1 il: Aprile 20, 2021, 01:09:09 pm »
il fatto è hai dichiarato la funzione che restituisce una string (e quindi result è di tipo string)
è normale che se si assegna a result qualsiasi cosa che non sia string dia errore

dovresti quindi dichiarare una funzione che restituisca il tipo TtbRitorno

tipo:

Codice: [Seleziona]

type
  TtbRitorno = array[0..4] of String;


...

function LeggiRecPiaCont(coVoce: String): TtbRitorno;

var
  swErro: Boolean;

  descrMov: String;
  sql: String = 'SELECT * FROM piancont WHERE NumVoce = ';

  tbRitorno: TtbRitorno;
begin
  sql:= sql + coVoce;
  Form1.ZQuery1.SQL.Text:= sql;
  try
    Form1.ZQuery1.ExecSQL;
  except
    on E: Exception do
    begin
      swErro:= True;
       ShowMessage('ERRORE ' + E.Message + System.lineending + 'nella LETTURA del record ContabFamDB.piancont.' + coVoce + System.lineending + System.lineending  + '***** Il programma verra'' chiuso *****');
       Application.Terminate;
    end;
  end;
   tbRitorno[0]:= Form1.ZQuery1.FieldByName('NumVoce').AsString;
   tbRitorno[1]:= Form1.ZQuery1.FieldByName('NomeVoce').AsString;
   tbRitorno[2]:= Form1.ZQuery1.FieldByName('ContrPartSiNo').AsString;
   tbRitorno[3]:= Form1.ZQuery1.FieldByName('DtPrimoUso').AsString;
   tbRitorno[4]:= Form1.ZQuery1.FieldByName('DtUltimUso').AsString;
   Result:= tbRitorno;   <--- produce ERROR
end;       
Imagination is more important than knowledge (A.Einstein)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:variabile array restituita da function
« Risposta #2 il: Aprile 20, 2021, 03:13:56 pm »
il fatto è hai dichiarato la funzione che restituisce una string (e quindi result è di tipo string)
è normale che se si assegna a result qualsiasi cosa che non sia string dia errore

dovresti quindi dichiarare una funzione che restituisca il tipo TtbRitorno

Sicuramente la prova da me riportata non dimostra di avere provato anche quella che mi hai suggerito, ma ti assicuro di avere messo in pratica anche quella.
Ecco cosa viene fuori:
Codice: [Seleziona]
function LeggiRecPiaCont(coVoce: String): String;
type
  TtbRitorno = array[0..4] of String;

var
  swErro: Boolean;

  descrMov: String;
  sql: String = 'SELECT * FROM piancont WHERE NumVoce = ';

  tbRitorno: TtbRitorno;
begin
  sql:= sql + coVoce;
  Form1.ZQuery1.SQL.Text:= sql;
  try
    Form1.ZQuery1.ExecSQL;
  except
    on E: Exception do
    begin
      swErro:= True;
       ShowMessage('ERRORE ' + E.Message + System.lineending + 'nella LETTURA del record ContabFamDB.piancont.' + coVoce + System.lineending + System.lineending  + '***** Il programma verra'' chiuso *****');
       Application.Terminate;
    end;
  end;
   tbRitorno[0]:= Form1.ZQuery1.FieldByName('NumVoce').AsString;
   tbRitorno[1]:= Form1.ZQuery1.FieldByName('NomeVoce').AsString;
   tbRitorno[2]:= Form1.ZQuery1.FieldByName('ContrPartSiNo').AsString;
   tbRitorno[3]:= Form1.ZQuery1.FieldByName('DtPrimoUso').AsString;
   tbRitorno[4]:= Form1.ZQuery1.FieldByName('DtUltimUso').AsString;
   Result:= tbRitorno;    <-- riga 1116
end;                                                                                                                                                   

Ecco l'errore segnalato dal compilatore:
Citazione
frmmain.pas(1116,13) Error: Incompatible types: got "TtbRitorno" expected "AnsiString"
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:variabile array restituita da function
« Risposta #3 il: Aprile 20, 2021, 03:55:23 pm »
@petrusic
Codice: [Seleziona]
function LeggiRecPiaCont(coVoce: String): String;

Questa funzione ritorna una stringa, è per quello che il compilatore di dice che si aspetta una AnsiString ...  ;D
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:variabile array restituita da function
« Risposta #4 il: Aprile 20, 2021, 05:21:40 pm »
@ DragoRosso
Non capisco cosa vuoi dire.
Il mio array "tbRitorno" è di tipo String, quindi è corretto che la funzione restituisca una String.

In altra function in cui l'array "tbRitorno" è di tipo Variant, la function restituisce una Variant e NON da errore. Allora perchè quello di tipo String  mi da Errore?

Tu come faresti?
ciao ciao

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:variabile array restituita da function
« Risposta #5 il: Aprile 20, 2021, 05:40:39 pm »
tbRitorno non è di tipo string, ma è di tipo array of string

per fare in modo che la tua funzione ritorni un array di string devi dichiararla come segue
Codice: [Seleziona]
function LeggiRecPiaCont(coVoce: String): TtbRitorno;
Imagination is more important than knowledge (A.Einstein)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:variabile array restituita da function
« Risposta #6 il: Aprile 20, 2021, 05:42:49 pm »
In altra function in cui l'array "tbRitorno" è di tipo Variant, la function restituisce una Variant e NON da errore. Allora perchè quello di tipo String  mi da Errore?

il tipo Variant è un tipo particolare
non ti dava errore perché Variant può assumere sia valore scalare (esempio string) chee "array of"
puoi vederla come un tipo di variabile che non ha tipo e che quindi può rappresentare sia valori singoli che multipli
Imagination is more important than knowledge (A.Einstein)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:variabile array restituita da function
« Risposta #7 il: Aprile 20, 2021, 06:27:28 pm »
tbRitorno non è di tipo string, ma è di tipo array of string

per fare in modo che la tua funzione ritorni un array di string devi dichiararla come segue
Codice: [Seleziona]
function LeggiRecPiaCont(coVoce: String): TtbRitorno;

Ma TtbRitorno è un type dichiarato dentro la stessa function, perciò scrivendo:
Codice: [Seleziona]
function LeggiRecPiaCont(coVoce: String): TtbRitorno;   
type
  TtbRitorno = array[0..4] of String;
var
  tbRitorno: TtbRitorno;             
[...]
ottengo il seguente Errore:
Citazione
frmmain.pas(1097,43) Error: Identifier not found "TtbRitorno"

Per farlo funzionare devo dichiararlo fra i type della sezione Implementation
Infatti, così facendo, l'errore in compilazione non si presenta più.

Confesso che una situazione simile non rientrava nel mio orizzonte di immaginazione.

Grazie, gr....sime.
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:variabile array restituita da function
« Risposta #8 il: Aprile 20, 2021, 06:42:08 pm »
Devi tenere presente che in Pascal le dichiarazioni sono fortemente tipizzate.

Cioè i tipi che vengono usati nelle dichiarazioni devono essere assolutamente compatibili.

Questo "rigore" in primis è necessario per avere poi un runtime che di base non dovrebbe avere delle problematiche legate alle assegnazioni.

Usando i puntatori (non sempre) e i variant si vanno incontro a delle problematiche (infatti hai visto che puoi passare come result qualsisi cosa se una funzione ha un valore di ritorno variant).
Se il chiamante non fà poi la tipizzazione del risultato della funzione che ritorna un variant, può accadere che prenda "lucciole" per "lanterne" come si suol dire.

Prova a pensare se fai manutenzione al codice dopo diverso tempo e magari nel result (variant) ci metti un nuovo dato non gestito da tutti i "punti" di chiamata di quella funzione ..........

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:variabile array restituita da function
« Risposta #9 il: Aprile 20, 2021, 06:50:02 pm »
Per farlo funzionare devo dichiararlo fra i type della sezione Implementation
Infatti, così facendo, l'errore in compilazione non si presenta più.

infatti se guardi bene quì
http://www.lazaruspascal.it/index.php?topic=2460.msg15663#msg15663

la dichiarazione l'avevo portata fuori dalla funzione ;)
Imagination is more important than knowledge (A.Einstein)

petrusic

  • Hero Member
  • *****
  • Post: 588
  • Karma: +0/-0
Re:variabile array restituita da function
« Risposta #10 il: Aprile 20, 2021, 10:04:52 pm »
ciao ciao

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18769
  • Topic in totale: 2232
  • Online Today: 80
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 14
Total: 14

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.