Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [Delphi]Problema dichiarazione for

    Riciao
    Volevo creare una DLL e dentro contenente un for, giusto giusto per capire i for ma mi da un problema, il codice che ho inserito è questo seguente e completo:

    codice:
    library MyDLL;
    uses SysUtils, Classes;
    var
       i: Integer;
       Fact: real; 
    function Factorial(x:double):double;  cdecl; 
      begin
        for i:=x downto 2 do
          begin
            Fact:=Fact*(i-1)
          end;
         Result:=Fact;
       end;
    exports Factorial;
    
    begin
    end.
    Mi da i seguenti errori:
    [Warning] Project2.dpr(9): For loop control variable must be simple local variable
    [Error] Project2.dpr(9): Incompatible types: 'Integer' and 'Double'

    Vedendo sulla Guida di questo sito non sembra che ho sbagliato qualcosa...
    cosa causa gli errori?
    Forza Napoli!

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469

    Re: [Delphi]Problema dichiarazione for

    Originariamente inviato da CaMpIoN
    Riciao
    Volevo creare una DLL e dentro contenente un for, giusto giusto per capire i for ma mi da un problema, il codice che ho inserito è questo seguente e completo:

    codice:
    library MyDLL;
    uses SysUtils, Classes;
    var
       i: Integer;
       Fact: real; 
    function Factorial(x:double):double;  cdecl; 
      begin
        for i:=x downto 2 do
          begin
            Fact:=Fact*(i-1)
          end;
         Result:=Fact;
       end;
    exports Factorial;
    
    begin
    end.
    Mi da i seguenti errori:
    [Warning] Project2.dpr(9): For loop control variable must be simple local variable
    [Error] Project2.dpr(9): Incompatible types: 'Integer' and 'Double'

    Vedendo sulla Guida di questo sito non sembra che ho sbagliato qualcosa...
    cosa causa gli errori?
    Esattamente quello che ti viene indicato.
    Due errori.
    1) La variabile-indice di un for deve essere un intero, nel tuo caso X è un valore in virgola mobile (double)
    Devi avere qualcosa del genere
    codice:
    var i:integer;
    
    for i:=trunc(x)...
    Oppure cambi il parametro passato a Factorial in un integer

    e

    2) la variabile i deve essere definita DENTRO la procedura, non FUORI, in quanto deve essere locale e non globale.

    e poi

    3) non funzionerà, perchè la variabile globale Fact non è inizializzata ad un valore ben preciso

    dovrebbe assomigliare più a questo
    codice:
    function fattoriale(n:integer):integer;
    var i:integer;
    begin
    
     fattoriale:=1;
    if n<=0 then
     exit;
     for i:= to n do
       fattoriale:=i*fattoriale;
    end
    PS ovviamente questo è il metodo computazionalmente lento, ma direi di non appesantire eccessivamente il discorso

  3. #3
    Grande ora mi funziona , è veloce e perfetto
    Grazie Mille.
    Un'altra domanda Result deve avere per forza una variabile?
    perchè io metto un numero tipo 0 o 1 mi da errore, mi dice a tutte le variabili "Value assigned to 'var' never used"...
    Forza Napoli!

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da CaMpIoN
    Un'altra domanda Result deve avere per forza una variabile?
    perchè io metto un numero tipo 0 o 1 mi da errore, mi dice a tutte le variabili "Value assigned to 'var' never used"...
    Non è chiarissimo quale sia la domanda.
    Result è una variabile "speciale", definita automaticamente da Delphi, che rappresenta il valore del risultato della funzione, in modo abbastanza simile al nome della funzione stessa.

    Esempio:
    codice:
    function pippo:integer;
    begin
    pippo:=1;
    end;
    e
    codice:
    function pippo:integer;
    begin
    result:=1;
    end;
    In realtà però il nome della funzione ha un comportamento "speciale": se è a sinistra di un'assegnazione allora è un alias per result.
    Altrimenti è una chiamata ricorsiva.

    Result puoi anche usarla ad esempio come indice, mentre il nome della funzione no (per il motivo precedente: non essendo a sinistra diventa una chiamata ricorsiva)
    codice:
    prova:=vettore[pippo]
    non è in generale equivalente a
    codice:
    prova:=vettore[result]
    ----
    Versione breve: se usi le funzioni in modo non-ricorsivo, e ti limiti a ritornare valori, puoi usare il nome della funzione.
    Altrimenti result

  5. #5
    Non ho capito bene, una funzione cosa restituisce, cioè io metto prova:=vettore[pippo], se vettore è un array pippo dovrebbe essere l'indice ma questo prova:=vettore[pippo] si trova nella blocco della funziona? se si cosa restituisce pippo questo non lo capito, intendo tipo questo:
    codice:
    function pippo:integer;
    begin
    prova:=vettore[pippo];
    end;
    Non so' se è giusto, se si puoi spiegarmi pippo cos'è.. poi le funzioni non sono tipo:
    codice:
    function pippo(x:double)
    begin
    ...
    end;
    sono un po'

    Poi un'altra cosa :P (cavolo non riesco proprio a capire delphi), un Porgram deve andare in implementation?
    Io ho fatto New->Application:
    Ho cancellato tutto ciò che c'era e ho incollato il seguente codice:
    codice:
    Program Editor;
    Uses
    Forms,
    REAbout in 'REABOUT.PAS' {AboutBox},
    REMain in 'REMAIN.PAS' {MainForm};
    {$R *.RES}
    Begin
    Application.Title := 'Text Editor';
    Application.CreateForm(TMainForm, MainForm);
    Application.Run;
    End.
    Mi da questo problema: 'Error in module Unit1: Declaration of class TForm1 is missing or incorrect.'

    Il codice l'ho preso dal corso su questo sito...
    Forza Napoli!

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da CaMpIoN
    Non ho capito bene, una funzione cosa restituisce (...)
    Facciamo un esempio
    codice:
    function pippo:integer;
    var vettore: array [1..100] of integer;
     j:integer;
    begin
      pippo:=1; // questo è equivalente a result:=1;
     j:=pippo; // questo è equivalente a j:=1  
    vettore[27]:=vettore[pippo]; // qui "pippo" sta a destra=> chiamata ricorsiva
      
    end;

    Il codice l'ho preso dal corso su questo sito...
    non l'ho fatto io

    Poi un'altra cosa :P (cavolo non riesco proprio a capire delphi), un Porgram deve andare in implementation?
    Io ho fatto New->Application:
    Ho cancellato tutto ciò che c'era e ho incollato il seguente codice:
    codice:
    Program Editor;
    Uses
    Forms,
    REAbout in 'REABOUT.PAS' {AboutBox},
    REMain in 'REMAIN.PAS' {MainForm};
    {$R *.RES}
    Begin
    Application.Title := 'Text Editor';
    Application.CreateForm(TMainForm, MainForm);
    Application.Run;
    End.
    Mi da questo problema: 'Error in module Unit1: Declaration of class TForm1 is missing or incorrect.'
    Stai facendo un po' di confusione.

    Esistono 700 tipi diversi di progetti delphi.
    I due più "comuni" sono eseguibili senza interfaccia grafica (a riga di comando) e eseguibili "normali" Windows (con finestre e cavoli vari).

    Quello che hai messo è il progetto (.DPR) di un programma Windows.
    Questo "progetto" contiene una serie di istruzioni che, in sintesi, creano una o più form del programma e le attivano.

    Quando dall'IDE dici di creare un progetto nuovo, vuoto, ti prepara proprio un DPR "scheletro" tipo quello che hai messo.

    Nel tuo caso puoi lasciarlo stare (il DPR), in quanto si modifica tipicamente quando è necessario fare qualcosa PRIMA di creare le form (ad esempio verificare che non ci siano due istanze in esecuzione, o quando vuoi disabilitare l'autocreazione delle form, perchè ne hai centinaia ed il programma ci metterebbe molto ad avviarsi etc).

    ----------
    OK, riassumendo che sto andando a pranzo, il DPR che hai messo non va perchè mancano questi file
    codice:
    REAbout in 'REABOUT.PAS' {AboutBox},
    REMain in 'REMAIN.PAS' {MainForm};
    Che altro non sono che form dentro reabout.pas/reabout.dfm, e remain.pas/remain.dfm

    In supersintesi, un progetto minimale è composto da

    nomeprogetto.dpr => compilato diventa nomeprogetto.exe
    dove ci sono i vari file compresi. Nel tuo caso puoi usare quello generato automaticamente da delphi


    nomefile.pas=> sorgenti pascal di una form "il codice" con le procedure etc
    nomefile.dfm=> componenti usati nella form (bottoni, liste, griglie etc)

    ce ne sono altri, ma non ti faccio confusione

    codice:
    program sr;
    
    uses
      Forms,
      ZSmtp in 'zsmtp.pas' {frmZSMTP},
      mainsr in 'mainsr.pas' {frmSR},
      Consts in 'consts.pas';
    
    {$R *.RES}
    
    begin
      Application.Initialize;
      Application.CreateForm(TfrmSR, frmSR);
      Application.CreateForm(TfrmZSMTP, frmZSMTP);
      Application.Run;
    end.
    In questo esempio di sr.dpr vedi un programma SR.EXE, che usa
    1) la libreria forms
    2) un file zsmtp.pas, con associata una form (quindi pure zsmtp.dfm)
    3) un file mainsr.pas, con associata mainsr.dfm
    4) un file consts.pas, il quale non ha (apparentemente) una form

    Al momento dell'avvio vengono create le due form frmSR e frmZSMTP, e viene avviata quella definita come "principale"

  7. #7
    Ma quindi unit1 è il codice riguardante la form, mentre Project.exe ad esempio vedendo dal Project Manager è quello dove dovrebbe andare program ecc..
    se ho capito bene giusto?
    Ah buon appetito e scusami
    Purtroppo prima utilizzavo un linguaggio non proprio di programmazione, Game Maker ed è molto semplificato e le sintassi sono moolto diverse allora ho un po' di difficoltà a capire..
    Forza Napoli!

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da CaMpIoN
    Ma quindi unit1 è il codice riguardante la form, mentre Project.exe ad esempio vedendo dal Project Manager è quello dove dovrebbe andare program ecc..
    se ho capito bene giusto?
    Stai proponendo diverse discussioni con domande che trovano risposta nei primi capitoli di qualsiasi manuale e/o documentazione esistente su Delphi: prima di utilizzare uno strumento o un linguaggio di programmazione, è necessario fare un passo alla volta e acquisire la conoscenza degli elementi fondamentali prima di iniziare a sviluppare, altrimenti sarai fermo ogni cinque secondi e ti ritroverai ad aprire discussioni tendenzialmente sterili dove ogni contributo non sarà altro che la replicazione di ciò che puoi trovare, appunto, nella documentazione.

    Suggerisco di approfondire meglio il linguaggio e di verificare prima con una ricerca o con uno studio maggiore determinate problematiche di base; poi, qualora ci fossero delle difficoltà inaffrontabili o irrisolvibili autonomamente, è ok aprire la discussione per chiedere suggerimenti.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    E che non mi aspettavo di affrontare qualcosa di piu difficile per questo ci sono andato un po' piu veloce, comunque farò cio' che mi hai consigliato , cercando di afferrare il più possibile le cose anche complicate..
    Forza Napoli!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.