Recent

Author Topic: Paso de Array  (Read 1278 times)

JuanCP

  • New Member
  • *
  • Posts: 17
Paso de Array
« on: January 30, 2025, 08:58:37 pm »
Un saludo a tod@s

Tengo un problema y no tengo ni idea porque pasa:

Tengo un array de enteros decena[1..10]
Lo paso como referencia a un procedimiento de otra unidad para que inicialice los elementos del mismo,  mediante un for, cuyo indice es igual a 1,  hasta 10

Lo paso como referencia a otro procedimiento para que muestre los valores, y los muestra correctamente es decir 1,2,3,4,5,6,7,8,9,10

Intento mostrarlos igualmente ahora desde el procedimiento de llamada y el resultado es:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

¿Que hago mal?, se supone que freepascal permite crear arrays que cuyo primer indice no tiene porque ser 0.

¿Me falta alguna directiva?

Adjunto una imagen del código y el resultado.

Agradecería un poco de luz.

Gracias

Edson

  • Hero Member
  • *****
  • Posts: 1324
Re: Paso de Array
« Reply #1 on: January 30, 2025, 09:24:12 pm »
Hola.

Yo veo bien el código. Debería mostrar lo esperado. A lo mejor no estás ejecutando la última versión compilada o algo así.

¿Podrías mandar el proyecto en un archivo *.zip? Es mejor probarlo en Lazarus para ver qué pasa.


Saludos
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

JuanCP

  • New Member
  • *
  • Posts: 17
Re: Paso de Array
« Reply #2 on: January 30, 2025, 09:35:29 pm »
Lo he probado en Lazarus con el mismo resultado.

Paso el codigo.

Saludos

Edson

  • Hero Member
  • *****
  • Posts: 1324
Re: Paso de Array
« Reply #3 on: January 30, 2025, 10:12:16 pm »
El problema es que estás usando un parámetro de tipo "array of integer", y le estás pasando un "array [1..10] of integer".

Ambos arreglos, aunque son del mismo tamaño, no son compatibles para usarse como parámetros.

Mejor define TDecena en la unidad, y usa ese tipo para todos los procedimientos.

Code: Pascal  [Select][+][-]
  1. unit funcIni;
  2. {$mode ObjFPC}{$H+}
  3. interface
  4. Type
  5.    TDecena = array [1..10] of integer;
  6. procedure IniNum(var num: TDecena);
  7. procedure MuestraNumeros(var num: TDecena);
  8.  
  9. implementation
  10. procedure IniNum(var num: TDecena);
  11. var
  12.     i : SmallInt;
  13. begin
  14.      For i := 1 to 10 do
  15.         num[i] := i;
  16. end;
  17. procedure MuestraNumeros(var num: TDecena);
  18. var
  19.   i : SmallInt;
  20. begin
  21.     writeln('En la funcion MuestraNumeros');
  22.     for i := 1 to 10 do
  23.         begin
  24.           write(num[i], ' ')
  25.         end;
  26.         writeln();
  27. end;
  28. end.
  29.  

Code: Pascal  [Select][+][-]
  1. program project1;
  2. {$mode objfpc}{$H+}{$J-}
  3. uses
  4.     funcIni, ptcCrt;
  5. var
  6.    decena: TDecena;
  7.    i: Integer;
  8.  
  9. begin
  10.    IniNum(decena);
  11.    MuestraNumeros(decena);
  12.  
  13.    writeln('En la funcion de llamada');
  14.     for i := 1 to 10 do
  15.         begin
  16.           write(decena[i], ' ')
  17.         end;
  18.         writeln();
  19.    ReadKey;
  20. end.
  21.  
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

TRon

  • Hero Member
  • *****
  • Posts: 4296
Re: Paso de Array
« Reply #4 on: January 30, 2025, 11:01:54 pm »
Apologies for the English (you really do not want me to write Spanish as I probably will butcher it).

When passed an array its bounds will always start from 0, not 1. If you enable range-checking the compiler will actually throw an error at runtime.

You can use the low and high functions to retrieve the lower and upper bound of the array.

traducción:
Disculpas por el inglés (realmente no quieres que escriba en español ya que probablemente lo masacraré).

Cuando se pasa una matriz, sus límites siempre comenzarán desde 0, no desde 1. Si habilita la comprobación de intervalos, el compilador producirá un error en tiempo de ejecución.

Puede utilizar las funciones low y high para recuperar el límite inferior y superior de la matriz.


Code: Pascal  [Select][+][-]
  1. unit funcini;
  2. {$mode objfpc}{$h+}
  3. // {$define wrong}
  4.  
  5. interface
  6.   procedure IniNum(var num: array of integer);
  7.   procedure MuestraNumeros(var num: array of integer);
  8.  
  9. implementation
  10.  
  11. {$ifdef wrong}
  12. procedure IniNum(var num: array of integer);
  13. var
  14.  i: smallint;
  15. begin
  16.   for i := 1 to 10
  17.     do num[i] := i;
  18. end;
  19. {$else}
  20. procedure IniNum(var num: array of integer);
  21. var
  22.  i, j: smallint;
  23. begin
  24.   j := 1;
  25.   for i := low(num) to High(num) do
  26.   begin
  27.     num[i] := j;
  28.     inc(j);
  29.   end;
  30. end;
  31. {$endif}
  32.  
  33. {$ifdef wrong}
  34. procedure MuestraNumeros(var num: array of integer);
  35. var
  36.  i: smallint;
  37. begin
  38.   writeln('En la funcon MuestraNumeros');
  39.   for i := 1 to 10 do
  40.   begin
  41.     write(num[i], ' ');
  42.   end;
  43.   writeln;
  44. end;
  45. {$else}
  46. procedure MuestraNumeros(var num: array of integer);
  47. var
  48.  i: smallint;
  49. begin
  50.   writeln('En la funcon MuestraNumeros');
  51.   for i := low(num) to high(num) do
  52.   begin
  53.     write(num[i], ' ');
  54.   end;
  55.   writeln;
  56. end;
  57. {$endif}
  58.  
  59. end.
  60.  
« Last Edit: January 30, 2025, 11:06:03 pm by TRon »
Today is tomorrow's yesterday.

JuanCP

  • New Member
  • *
  • Posts: 17
Re: Paso de Array
« Reply #5 on: January 31, 2025, 03:59:27 am »
Edson, es la solución que me quedaba, gracias por tu interés

Don't worry Tron, the same thing happens to me with the English language.
Thank you very much for your solution.



 

TinyPortal © 2005-2018