* * * *

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.
Novembre 25, 2024, 08:53:42 pm

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

62 Visitatori, 0 Utenti

Autore Topic: problema traduzione da Visual Basic a Lazarus  (Letto 5208 volte)

alexarmato66

  • Full Member
  • ***
  • Post: 147
  • Karma: +1/-0
problema traduzione da Visual Basic a Lazarus
« il: Aprile 18, 2021, 03:48:50 pm »
come potrei tradurre il seguente codice Visual Basic

ReDim Preserve MomentiRottura.polix(NP).X(1 To MomentiRottura.polix(NP).numv)

in Lazarus ?

grazie!

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1404
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #1 il: Aprile 18, 2021, 04:21:25 pm »
Sbaglierò, ma quello non è un codice nativo di VB.
Appartiene a qualche libreria o algoritmo di ingeneria e dovrebbe essere legato al calcolo su strutture 3D del dominio di rottura su una sezione.

Su questo, ritengo che un ingegnere civile del forum possa darti una mano.

In generale "REDIM" in VB è equivalente a "SetLength" in Pascal.
La scrittura "1 To MomentiRottura.polix(NP).numv" equivale alla definizione di un array. Però senza una definizione del contenuto dell'array non è possibile definire l'array stesso.

Come dato generico, la scrittura potrebbe essere equivalente a:

// ATTTENZIONE CHE IN PASCAL GLI ARRAY DINAMICI (CHE SONO GLI UNICI CHE POSSONO ESSERE RIDIMENSIONATI) INIZIANO CON INDICE 0 E NON 1.
// QUINDI L'ARRAY sotto indicato avà un indice in più, ossia lo zero.

Codice: [Seleziona]
SetLength(MomentiRottura.polix[NP].X, MomentiRottura.polix[NP].numv+1);
« Ultima modifica: Aprile 18, 2021, 04:29:00 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #2 il: Aprile 19, 2021, 12:59:34 am »
come potrei tradurre il seguente codice Visual Basic

ReDim Preserve MomentiRottura.polix(NP).X(1 To MomentiRottura.polix(NP).numv)

in Lazarus ?

grazie!


Ciao.
Cosa dovrebbe fare di preciso questa istruzione? Magari Drago ti ha già risposto, ma sono curioso lo stesso :)
Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

alexarmato66

  • Full Member
  • ***
  • Post: 147
  • Karma: +1/-0
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #3 il: Aprile 19, 2021, 02:09:27 pm »
Sto traducendo in Pascal per Lazarus un codice scritto in VB per il calcolo delle sezioni in c.a. .
Avevo usato Redim Preserve per non perdere i dati iniziali della matrice .In VB usando REDIM azzero la matrice.
Volevo sapere se in Pascal con SetLength preservavo i dati gia memorizzati nella matrice aggiungendo dei nuovi dinamicamente.
Grazie.

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1404
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #4 il: Aprile 19, 2021, 02:21:33 pm »
Il contenuto degli elementi esistenti vengono preservati.

Quando fai un SetLegnth, internamente il vecchio array viene copiato in una nuova posizione di memoria.

Ricordati che l'indice in Pascal parte da zero per gli array dinamici.

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

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #5 il: Aprile 19, 2021, 03:08:24 pm »
Avendo sempre messo dati nativi dentro gli array, o oggetti che dovevo passare ad altri pezzi di software, non mi sono mai posto la questione se :
Viene invocato il "finalize" degli elementi se rimpicciolisco l'array?


Se allarghi l'array non hai problemi di questo tipo. Ti prepara degli spazi "vuoti" da assegnare come preferisci.


[0..Length-1] sono gli indici validi.


In alternativa puoi usare Low(tuoArray) e High(tuoArray) per avere gli indici minori e superiori validi.


Se vuoi ancora meno sbattimenti puoi usare gli enumeratori automatici.


Dichiari una variabile del tipo che ti interessa e la usi nel ciclo for che diventa


Codice: [Seleziona]


for variabileDelTipoCheTiInteressa in ilTuoArray do
begin
end;




Spero di essere stato d'aiuto.


Stilgar


Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1404
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #6 il: Aprile 19, 2021, 03:28:09 pm »
Negli array dinamici, il contenuto andrebbe distrutto prima di liberare gli indici interessati (quindi distruggerlo o rimpicciolirlo).

Questo comunque andrebbe fatto (o sarebbe meglio fare), in quanto i distruttori PASCAL e VB (ma anche C)non è detto che siano coerenti (ammesso e non concesso che gli oggetti contenuti non siano "Pascal").

Per default le nuove posizioni sono a 0 o nil.

Ciò sopra vale per il concorrente di Lazarus, ma ritengo sia allineato anche Lazarus stesso.

Ricordati anche che gli array dinamici multidimensione (come il tuo) hanno l'accesso contiguo solo per "riga". Ma ogni riga potrebbe non essere contigua all'altra (anzi sicuramente non lo è).
Esempio:

NP := 1 (Elementi contigui tra loro)
MomentiRottura.polix(NP).X[0], MomentiRottura.polix(NP).X[1],  MomentiRottura.polix(NP).X[2] .....

NP := 2 (Elementi contigui tra loro)
MomentiRottura.polix(NP).X[0], MomentiRottura.polix(NP).X[1],  MomentiRottura.polix(NP).X[2] .....

Ma tra l'array con NP:=1 e l'array con NP:=2 non c'è alcun tipo di associazione, sono in memorie non contigue. I due array potrebbero avere anche lunghezza diversa.

Questo affinchè tu faccia attenzione a lavorare con i puntatori o funzioni che scrivono blocchi di memoria.

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

doc

  • Jr. Member
  • **
  • Post: 96
  • Karma: +2/-0
  • "L'Ingegnere sa quello che fa e fa quello che sa".
    • Spagnotto Ing. Mirko
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #7 il: Aprile 21, 2021, 10:34:35 am »
@ alexarmato66

Ma ti occupi di calcolo strutturale?

alexarmato66

  • Full Member
  • ***
  • Post: 147
  • Karma: +1/-0
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #8 il: Aprile 22, 2021, 01:48:33 pm »
Si

alexarmato66

  • Full Member
  • ***
  • Post: 147
  • Karma: +1/-0
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #9 il: Aprile 23, 2021, 09:10:07 am »


Purtroppo SetLength(MomentiRottura.polix[np].x, MomentiRottura.polix[np].numv+1); 

mi da il seguente errore: Type mismatch.


è all'interno della seguente procedura:
Procedure calcola_MomentiRottura_A(dom : Dominio_Rottura; soll : soll_esterne; MomentiRottura : momenti_rottura;flag_convergenza : Boolean; flag_circa : Boolean; index : Integer);
.......
......
.....


Di seguito riporto le strutture che ho utilizzato per le dichiarazioni:




// Struttura dati che contiene i valore dei momenti di rottura della sezione  //
// -------------------------------------------------------------------------- //
    momenti_rottura = record
    mrx : Double;                        // Momento di rottura con asse momento x
    mry : Double;                        // Momento di rottura con asse momento y
    ang : Double;                        // Rotazione dell//asse neutro rispetto all//asse x, antioraria positiva
    polix : Array of poligono_sezione;   // Poligono che definisce la porzione di cls compressa della sezione
    sigma_so: Array of Double;               // ' Array contenente le tensioni nelle barre di armatura a rottura
    sigma_sp: Array of Double;              // ' Array contenente le tensioni nei trefoli a rottura
    def_rottura : deform_sezione;        // configutrazione deformativa a rottura
    etac_max : Double;                   // distanza tra l//asse neutro e la fibra maggiormente compressa a rottura
    etas_min : Double;                   // distanza tra l//asse neutro e la fibra maggiormente tesa a rottura
    curv_rottura : Double;               // curvatura della sezione a rottura
    End ;                                                                                   
 

/ Struttura dati in cui sono definiti i dati dei singoli poligoni che com-   //
// pongono la sezione                                                         //
// -------------------------------------------------------------------------- //
   poligono_sezione = record
   x:array[1..100] of Double ;          // coordinata x del vertice
   y:array[1..100] of Double ;          // coordinata y del vertice
   numv : Integer;                      // numero di vertici del poligono
   fck : Double;                        //' fck
   fd : Double ;                        // Resistenza massima di calcolo (per verifiche SLU)
   omog : Double ;                      // coefficiente di omogeneizzazione (per verifiche SLE)
   traz : Integer ;                     // 0=non reagente a trazione; 1=reagente a trazione
   epsc0 : Double;                      // Deformazione in corrispondenza della fine della parte parabola/lineare del dominio
   epscu : Double;                      // Deformazione ultima del dominio
   sigma:array[1..100] of Double ;
   end ;
// -------------------------------------------------------------------------- //             

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1404
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #10 il: Aprile 23, 2021, 09:26:44 am »
x:array[1..100] of Double ;          // coordinata x del vertice

Gli array statici non possono essere ridimensionati.

Devi ridefinire l'array X come dinamico (ma ovviamente l'indice partirà da ZERO) e rivedere il codice corrispondente.

Poi devi rivedere anche gli altri array se è il caso.

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

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #11 il: Aprile 23, 2021, 09:33:58 pm »
Gli array statici se li definisci come "puntatori", diventano magicamente super dinamici :)
Ma devi sbatterti a gestirli bene.
:)


Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

alexarmato66

  • Full Member
  • ***
  • Post: 147
  • Karma: +1/-0
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #12 il: Aprile 24, 2021, 08:11:23 pm »
Grazie ai vostri importanti aiuti sto imparando tante cose.GRAZIE!!!!!
Altra tra questione (Enum Type):

posso scrivere:
Type
 FaseGetto = (Foro = 0 , Trave = 1, Getto = 2);

dichiarando:
tipogetto:array of  FaseGetto ;        //1 = Trave, 2 = Getto2aFase, 0 = Foro   

?

alexarmato66

  • Full Member
  • ***
  • Post: 147
  • Karma: +1/-0
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #13 il: Aprile 24, 2021, 08:19:12 pm »
//'carica geometria 1  *********************************************************
tipo1 := Form1.CB1.Text;

               case (tipo1) of

     'Trave': begin


        tipogetto[1] := Trave ;
        nv[1]:= StrToInt(Form1.EVertici1.Text);

   

        For k := 1 To nv[1] do
          begin
            X1[k]:=  StrToFloat(Form1.StringGrid1.Cells[1,k]);
            Y1[k]:=  StrToFloat(Form1.StringGrid1.Cells[2,k]);
          end;


        fck := StrToInt(Form1.CBcls1.Text);

     end;

    'Getto2aFase': begin
        tipogetto[1] := Getto;
        nv[1] := StrToInt(Form1.EVertici1.Text);
     
        For k := 1 To nv[1] do
          begin
            X1[k] :=  StrToFloat(Form1.StringGrid1.Cells[1,k]);
            Y1[k] :=  StrToFloat(Form1.StringGrid1.Cells[2,k]);
          end;

         fck := StrToInt(Form1.CBcls1.Text);

    end;

    'Foro': begin
        tipogetto[1] := Foro ;
        nv[1] := StrToInt(Form1.EVertici1.Text);
   
        For k := 1 To nv[1] do
          begin
            X1[k] :=  StrToFloat(Form1.StringGrid1.Cells[1,k]);
            Y1[k] :=  StrToFloat(Form1.StringGrid1.Cells[2,k]);
          end;

        fck := StrToInt(Form1.CBcls1.Text);

    end;

end ;
//******************************************************************************     

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1404
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:problema traduzione da Visual Basic a Lazarus
« Risposta #14 il: Aprile 24, 2021, 11:34:07 pm »
tipoogetto[1] := .......      //ricordati nel codice un SetLength(tipooggeto, 2);

Case (tipo1) of                // tipo1 è una stringa, il case non può essere usato su stringhe, deve essere usato con
                                       // tipi integrali (integer, boolean, char) o altri tipi con un limite (HIGH e LOW) finiti,
                                       // in quanto il case viene risolto in compilazione.

Ciao

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

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19197
  • Topic in totale: 2289
  • Online Today: 68
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 62
Total: 62

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.