* * * *

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 27, 2024, 09:25:03 am

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

308 Visitatori, 0 Utenti

Autore Topic: Errore "Element zero of an ansi/wide- or longstring ..."  (Letto 311 volte)

petrusic

  • Hero Member
  • *****
  • Post: 589
  • Karma: +0/-0
Errore "Element zero of an ansi/wide- or longstring ..."
« il: Marzo 07, 2024, 03:59:59 pm »
Oggi ho ricevuto, in compilazione un Errore nuovo e, per me incomprensibile:
Citazione
frm9.pas(4897,27) Error: Element zero of an ansi/wide- or longstring cannot be accessed, use (set)length instead

L'Errore cita la  seguente riga di codice:
Codice: [Seleziona]
 if (tbCarichi[ixc, 0] < tbScarichi[ixs, 0]) then        

Essa fa parte di un gruppo di istruzioni della Form9. Dette istruzioni hanno il compito di comparare il contenuto di di due elementi di array dinamici diversi, dichiarati come Variabili Globali Nascoste, cioè dentro la sezione di implementazione:
Codice: [Seleziona]
implementation

{$R *.lfm}

uses
  FrmMain;

{ TForm9 }

type
  TtbIDMovim = array of array of String;
  TtbCarichi = array of array of string;
  TtbScarichi = array of array of string;
  TtbTotCar= array of array of string;
  TtbTotScar= array of array of string;

//const

var
  numRecApertura: Integer;

  esitoAnnoDig: ShortInt;

  dataIni, rispoFrm9, sottolinea: String;

  tbCarichi: TtbCarichi;          // La tabella ospita i movimenti vecchi di 10 anni e oltre di un solo cespite, da ammortizzare
//                                   e contiene n righe, ciascuna composta da:
//            Codice Voce del Cespite
//            Codice Voce del Sottoconto di Cassa corrispondente
//            Descrizione del movimento
//            Importo NON segnato del movimento
//            Data contabile del movimento
//            n. riga dell'eventauale movimento di scarico presente nella tbScarichi

  tbScarichi: TtbScarichi;          // La tabella ospita tutti i movimenti di scarico di un solo cespite, da ammortizzare
//                                   e contiene n righe, ciascuna composta da:
//            Codice Voce del Cespite
//            Codice Voce del Sottoconto di Cassa corrispondente
//            Descrizione del movimento
//            Importo NON segnato del movimento
//            Data contabile del movimento

  tbTotCar: TtbTotCar;
  tbTotScar: TtbTotScar;

... bla ... bla ...

procedure CreAmmortAutom(var tbCarichi, tbScarichi, tb, totScarAmmort: array of AnsiString);  // le tabelle vengono passate per riferimento e NON per valore
var
  ixs, lun1, numCar, numScar: Integer;
  ixc: Integer = 0;
begin
  numCar:= Length(tbCarichi) -1;
  numSCar:= Length(tbScarichi) -1;
  if (numcar <= 0) or (numScar <= 0)  then
  begin
    Exit;
  end;
  if (numScar >= 0) then
  begin
    for ixs:= 0 to numScar do
    begin
      if (tbCarichi[ixc, 0] < tbScarichi[ixs, 0]) then        // <=== riga n. 4897
      begin
        ixc:= ixc + 1;
        if (ixc >= numCar) then
        begin
          exit;
        end;
      end
      else begin
        if (StrToFloat(tbScarichi[ixs, 5]) = StrToFloat(tbCarichi[ixc, 5]) * (-1)) then
        begin
          tbCarichi[ixc, 5]:= IntToStr(ixs);
        end;
      end;
      ixc:= ixc + 1;
    end;
  end;
end;                   

Sia la tbCaricihi che la tbScarichi vengono inzializzate e riempite nella procedure "AmmortamentoCespiti":
Codice: [Seleziona]
 if (Length(striCarichi) > 0) then
    begin
      tabSplit:= striCarichi.Split(chr(13));
      setLength(tbCarichi, (Length(tabSplit)), 6);
      for i:= 0 to (Length(tabSplit) - 1) do
      begin
        tbEl:= tabSplit[i].Split(chr(9));
        for j:= 0 to 4 do
        begin
          tbCarichi[i, j]:= tbEl[j];    // Codice Voce del cespite
        end;
        tbCarichi[i, 5]:=  '0';
      end;
    end;

... bla ... bla ...

  if (Length(striScarichi) <= 0) then
  begin
    ixs:= k999;
  end
  else begin
    tabSplit:= striScarichi.Split(chr(13));
    setLength(tbScarichi, (Length(tabSplit)), 5);
    for i:= 0 to (Length(tabSplit) - 1) do
    begin
        tbEl:= tabSplit[i].Split(chr(9));
        for j:= 0 to 4 do
        begin
          tbScarichi[i, j]:= tbEl[j];    // Codice Voce del cespite
        end;
    end;

Ho riportato tutto quel codice per illustrare al meglio come penso di avere rispettato l'aspetto formale delle istruzioni impiegate per agire sugli array, oggetto dell'Errore di incompatibilità segnalato dal compilatore.

Ho cercato qualcosa anche sul web, ma non ho trovato niente che rimandi al caso mio.

Intanto, penso di avviare le prove e proseguire con la ricerca pratica dell'Errore.

Vi faccio sapere.
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:Errore "Element zero of an ansi/wide- or longstring ..."
« Risposta #1 il: Marzo 07, 2024, 04:32:16 pm »
Oggi ho ricevuto, in compilazione un Errore nuovo e, per me incomprensibile:
Citazione
frm9.pas(4897,27) Error: Element zero of an ansi/wide- or longstring cannot be accessed, use (set)length instead

L'errore riportato riguarda l'accesso ad una stringa, esempio:
Codice: [Seleziona]
var a: string;

a := 'pippo';

if a[0] =  'p' then  //<--- a[0] ritorna quell'errore in compilazione, perchè l'elemento 0 di una stringa non è accessibile. Per motivi storici nell'elemento 0 ci dovrebbe essere la lunghezza in caratteri o byte della stringa (in realtà non è più così ...).

Il codice da te indicato risulta apparentemente corretto.

Sono curioso di sapere quale è la reale causa dell'errore.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Errore "Element zero of an ansi/wide- or longstring ..."
« Risposta #2 il: Marzo 07, 2024, 06:36:42 pm »
sia tbCarichi che tbScarichi sono di tipo: array of array of String
la procedura CreAmmortAutom invece si aspetta parametri di tipo: array of AnsiString

credo che il problema sia li
Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:Errore "Element zero of an ansi/wide- or longstring ..."
« Risposta #3 il: Marzo 07, 2024, 09:03:28 pm »
sia tbCarichi che tbScarichi sono di tipo: array of array of String
la procedura CreAmmortAutom invece si aspetta parametri di tipo: array of AnsiString

credo che il problema sia li
Caspita che occhio, complimenti, è proprio li il problema.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Errore "Element zero of an ansi/wide- or longstring ..."
« Risposta #4 il: Marzo 08, 2024, 09:49:48 am »
penso anche io ma aspettiamo la conferma di petrusic
Imagination is more important than knowledge (A.Einstein)

slapshot

  • Jr. Member
  • **
  • Post: 85
  • Karma: +1/-0
Re:Errore "Element zero of an ansi/wide- or longstring ..."
« Risposta #5 il: Marzo 08, 2024, 12:43:19 pm »
Forse può aiutare questo link: https://wiki.freepascal.org/AnsiString

Credo che le Ansistring inizino da uno come riportato dal wiki:

Citazione
Characters in AnsiString have a 1-based index. myAnsiString[1] refers to the first character.

petrusic

  • Hero Member
  • *****
  • Post: 589
  • Karma: +0/-0
Re:Errore "Element zero of an ansi/wide- or longstring ..."
« Risposta #6 il: Marzo 08, 2024, 05:28:24 pm »
Ciao a tutti e grazie per le vostre risposte.

Oggi ho finito le prime prove pratiche del mio programma in cantiere. Ho rivisto anche la logica delle istruzioni che ho tante volte manipolato, per via della complessità che l'argomento richiede.
Appositamente non ho ritoccato nessuna delle dichiarazioni relative alle variabili utilizzate.

Ebbene, dopo avere eliminato gli errori formali che il compilatore mia ha, via via, dato, quando mi aspettavo la riproposizione dell'Errore comparso ieri, l'esecuzione si è avviata senza problemi ed ho potuto andare avanti tranquillamente.

L'anomalia è scomparsa da sola. Ritengo perciò che fosse causata da una qualche impostazione sintattica che, senza rendermene conto, ho tolto, durante le altre correzioni che ho dovuto operare.

Una di queste è stata quella di spostare un paio di routine, chiamate durante l'esecuzione, che, nella sequenza di codice, avevo erroneamente inserito dopo la chiamata:
Es.  la "procedure CarGridPreAmmort"  chiamata nella riga 2570, si trovava oltre la riga 4000. Lo stesso dicasi per la  "procedure ScriRgTotGridPreAmmort".

Purtroppo, ogni volta che inserisco una routine, devo essere accorto a porla sempre prima di quella, dentro la quale, ne effettuo la chiamata.
Fino ad ora è andata bene. Ma cosa succederebbe se mi dovessi trovare di chiamare una routine che non potrei spostare, perchè, magari, quest'ultima dovesse chiamare, a sua volta, una routine diversa, che si trovasse più avanti e che non potrei assolutamente spostare?
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:Errore "Element zero of an ansi/wide- or longstring ..."
« Risposta #7 il: Marzo 08, 2024, 05:42:39 pm »
Purtroppo, ogni volta che inserisco una routine, devo essere accorto a porla sempre prima di quella, dentro la quale, ne effettuo la chiamata.
Fino ad ora è andata bene. Ma cosa succederebbe se mi dovessi trovare di chiamare una routine che non potrei spostare, perchè, magari, quest'ultima dovesse chiamare, a sua volta, una routine diversa, che si trovasse più avanti e che non potrei assolutamente spostare?

Questo fà parte della logica del linguaggio. Devi imparare ad articolare bene classi / procedure / funzioni / etc ... in modo che non accada ciò che hai detto. Di questo fanno parte anche le ricorrenze vietate tra unità (circolari, una unità che dichiara un'altra nella sezione interface e anche quest'ultima dichiara quella referente sempre nella interface).

Con un pò di esercizio ed esperienza non è difficile. Sono anni ormai che non ho più di quei problemi.

Consiglio spassionato: cerca di dividere, ossia creare funzioni base con poche istruzioni e magari creare unità che abbiano una funzione logica completa.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

 

Recenti

How To

Utenti
Stats
  • Post in totale: 18776
  • Topic in totale: 2234
  • Online Today: 233
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 308
Total: 308

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.