Oggi ho ricevuto, in compilazione un Errore nuovo e, per me incomprensibile:
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:
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:
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":
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.
Oggi ho ricevuto, in compilazione un Errore nuovo e, per me incomprensibile:
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:
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.