Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: crx - Gennaio 11, 2015, 12:57:50 pm

Titolo: Array
Inserito da: crx - Gennaio 11, 2015, 12:57:50 pm
Stavo facendo delle prove quando ho visto uno strano comportamento di un array.
Per prova, ho scritto questo:
Codice: [Seleziona]
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

var
  arr : Array [1..10] of Integer;
  i, c : Integer;

begin
  WriteLn(Low(arr), '..', High(arr));

  c := 14;

  for i := 0 to c do begin
    arr[i] := i;
  end;
  WriteLn('Array Creato');

  for i := 0 to c do begin
    WriteLn(arr[i]);
  end;
end.

Il cui risultato è questo:
Codice: [Seleziona]
1..10
Array Creato
0
1
2
3
4
5
6
7
8
9
10
11
12

Se uso c := 15, il risultato è:
Codice: [Seleziona]
1..10
Errore di segmentazione (core dump creato)

Non è strano? Non dovrei avere un errore sia in assegnazione che in lettura anche con il primo codice? Devo sempre usare Low() e High() anche per array statici?
Titolo: Re:Array
Inserito da: xinyiman - Gennaio 11, 2015, 05:26:25 pm
L'errore è che hai dichiarato un array di 10 celle

 arr : Array [1..10] of Integer;


e hai cercato di assegnarl 14 valori.

Se ne dichiari 10 la tua variabile c deve essere valorizzata a 10
Titolo: Re:Array
Inserito da: crx - Gennaio 11, 2015, 11:40:00 pm
Mi sa che non mi sono spiegato: l'array l'ho dichiarato apposta di dieci celle, numerate da 1 a 10. Il problema è proprio che non mi da nessun errore né in fase di compilazione né in fase di esecuzione: mi assegna fino alla cella 12 (perché poi, visto che il massimo è 14?), anche a partire dalla cella 0 (quando il minimo è 1). L'errore me lo dà solo quando imposto c=15: non avrebbe dovuto darlo subito?
Nella documentazione del freepascal non ho trovato nulla a riguardo. C'è forse qualche direttiva per il compilatore per farmi segnalare questo errore (dovrebbe accorgersene in fase di compilazione se cerco di assegnare all'array la posizione 0 o di leggere la posizione 13, no?).
Titolo: Re:Array
Inserito da: xinyiman - Gennaio 12, 2015, 09:00:13 am
In realta' la compilazione rileva errori di sintassi e non logici. Si vede che il tuo programma ha scritto in aree di memoria limitrofe a quelle da te dichiarate che erano fortuitamente libere e sulla quindicesima ha trovato la memoria occupata.
Titolo: Re:Array
Inserito da: El Salvador - Gennaio 12, 2015, 09:51:27 am
Citazione
Devo sempre usare Low() e High() anche per array statici?
Si, anche perchè cosi non devi perdere tempo a ricordarti ogni volta quanto le dimensioni degli array. Inoltre sono indispensabili nei cicli FOR.
Titolo: Re:Array
Inserito da: crx - Gennaio 12, 2015, 10:51:31 am
Ok, ma la mia curiosità era relativa al fatto che il compilatore non mi segnala che sto provando ad accedere a posizioni che non esistono.