Forum > Spanish

Paso de Array

(1/2) > >>

JuanCP:
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:
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

JuanCP:
Lo he probado en Lazarus con el mismo resultado.

Paso el codigo.

Saludos

Edson:
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  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---unit funcIni;{$mode ObjFPC}{$H+}interfaceType   TDecena = array [1..10] of integer;procedure IniNum(var num: TDecena);procedure MuestraNumeros(var num: TDecena); implementationprocedure IniNum(var num: TDecena);var    i : SmallInt;begin     For i := 1 to 10 do        num[i] := i;end;procedure MuestraNumeros(var num: TDecena);var  i : SmallInt;begin    writeln('En la funcion MuestraNumeros');    for i := 1 to 10 do        begin          write(num[i], ' ')        end;        writeln();end;end. 

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---program project1;{$mode objfpc}{$H+}{$J-}uses    funcIni, ptcCrt;var   decena: TDecena;   i: Integer; begin   IniNum(decena);   MuestraNumeros(decena);    writeln('En la funcion de llamada');    for i := 1 to 10 do        begin          write(decena[i], ' ')        end;        writeln();   ReadKey;end. 

TRon:
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  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---unit funcini;{$mode objfpc}{$h+}// {$define wrong} interface  procedure IniNum(var num: array of integer);  procedure MuestraNumeros(var num: array of integer); implementation {$ifdef wrong}procedure IniNum(var num: array of integer);var i: smallint;begin  for i := 1 to 10    do num[i] := i;end;{$else}procedure IniNum(var num: array of integer);var i, j: smallint;begin  j := 1;  for i := low(num) to High(num) do  begin    num[i] := j;    inc(j);  end;end;{$endif} {$ifdef wrong}procedure MuestraNumeros(var num: array of integer);var i: smallint;begin  writeln('En la funcon MuestraNumeros');  for i := 1 to 10 do  begin    write(num[i], ' ');  end;  writeln;end;{$else}procedure MuestraNumeros(var num: array of integer);var i: smallint;begin  writeln('En la funcon MuestraNumeros');  for i := low(num) to high(num) do  begin    write(num[i], ' ');  end;  writeln;end;{$endif} end. 

Navigation

[0] Message Index

[#] Next page

Go to full version