PDA

Ver la Versión Completa : Cómo paso por parametro una matriz??


NeoAnderson
11-03-2008, 05:51:01
Hola nuevamente a toda la comunidad, agradeciendo de antemano la ayuda que siembre me brindan, y la que espero puedan darme una vez mas para un problema que creo es cosa de niños, pero pues aun no he dado con la solucion.

Pues es eso, cómo paso por parametro una funcion en un procedimiento

intente cosas como
prodedure miProc(var mat:array[0..x,0..x] of integer)
prodedure miProc(var mat:array of integer), etc, pero pues no doy con la respuesta correcta, espero puedan hecharme una mano, ah, y aprovechando la oportunidad, tambien quisiera saber cómo puedo regresar una matriz con una funcion.

Gracias nuevamente.

dec
11-03-2008, 06:20:15
Hola,

Tienes que hacer algo así:


type
TMyArray: array of integer;

{...}

function Foo(pArray: TMyArray): TMyArray;
begin
{...}
end;

NeoAnderson
11-03-2008, 22:15:25
Gracias dec por la respuesta, si, seguro que debe ser asi como lo planteas, es solo que aun soy muy novato y tuve problemas al declarar el tipo, es decir, lo hice de la siguiente manera

unit Main
interface
uses
{........}

type
TMyArray: array of integer; {.....}
{....}


pero de esta manera me marca el error: Expected an identifier but Array found, y si lo hago de la siguiente manera

unit Main
interface
uses
{........}
type
TMyArray= array of integer; {.....}

Marca: Expected ":" but "=" found

Si lo declaro de la ultima manera en la parte de implementation, entonces si funciona, pero si los "procedure" o "function" de la parte de type ocupan este nuevo tipo entonces marca el error Undeclared identifier "TMyArray"

y pues yo me imagino que lo estoy declarando en el lugar equivocado, espero puedas indicarme el lugar correcto para declarar un tipo predefinido, ademas, pienso pasarle esa matriz como parametro a un procedimiento que está en otro form, por ello creo que no serviría declarar el tipo en la parte de implementation. Espero puedas aclararme esta duda

Gracias nuevamente por la ayuda.

dec
11-03-2008, 22:37:11
Hola,

Creo que el problema estriba en que hay que declarar el tipo en cuestión dentro de la cláusula "interface" (para que esté disponible en otras unidades que añaden aquella donde se declare el tipo) o en la cláusula "implementation". Y, según tú mismo sabes, no puede declararse en otro lugar. Así pues:


unit Main;

interface

uses
{........}

type
TMyArray: array of integer; {.....}

{....}



La declaración de "TMyArray" está fuera de "interface", pero, pareciera que también queda fuera de "implementation". Debería quedar algo como esto:


unit Main;

interface

type
TMyArray: array of integer; {.....}

uses
{........}

{....}



O bien:


unit Main;

interface

uses
{........}

implementation

type
TMyArray: array of integer; {.....}

{....}

NeoAnderson
12-03-2008, 01:13:52
gracias nuevamente por tu respuesta dec, sin embargo tampoco resultó de la manera que me indicaste, que fue la siguiente

unit Main;

interface

type
TMyArray = array of integer; {.....}

uses
{........} porque me marca el error "Declaration expected but USES found"

y en implementation si puedo declarar el tipo, pero tampoco me sirve, pues mi programa tiene la siguiente estructura.

unit Main

interface

uses {.....}

type
{......}
procedure RecibeMatriz(var mat:TMyArray); //aqui marca error

private
{ Private declarations }

public
{ Public declarations }
end;

var
FMain: TFMain;

implementation
{$R *.dfm}
type TMyArray= array[0..2,0..2] of integer;
{......}

y como dije, de esa manera si puedo declarar el tipo, pero en la linea que comenté en el codigo me marca "Undeclared identifier TMyArray" por lo que imagino que si debe ser en un nivel mas arriba la declaracion, solo que no funcionó dentro de interface. Ya probe declararlo en varias partes, pero sigo sin obtener resultados.

He hecho algo mal sobre tu sugerencia?? Gracias nuevamente

Delphius
12-03-2008, 02:47:09
Hola,
No deberías tener problemas...

No se a que se deba el error del uses, pero mi primera sospecha se deba a que tienes un uses "vacio", es decir que no haces uso de ninguna unidad.
Si no vas a usar ninguna, borra la sección uses. Te debería quedar algo asi:

unit Main;

interface

uses
Listado de units;

type
// Primero viene el tipo
TMyArray = array of [0..2,0..2] of integer;

TFmain = class(TForm);
private
{ Private declarations }

public
{ Public declarations }
// este procedimiento debe pertener a la form? o debe ser "global"?
procedure RecibeMatriz(var mat:TMyArray);
end;

var
FMain: TFMain;

implementation
{$R *.dfm}

procedure TFmain.RecibeMatriz(var mat:TMyArray);
begin
// lo que venga...
end;

end;

De la segunda manera (el tipo en implementation) no vas a poder "comunicarte" en forma externa cuando desees suministrar los parámetros debido a que el tipo no es dado a conocer a los demás.

Algo que no me queda claro en tus códigos es que si se trata de una Unit asociada a un Form, o es una unidad limpia (sin form asociado).

¿Podrías exponer el código completo? De esta manera podremos saber realmente que es lo que estás haciendo... en ocasiones esos "puntos suspensivos" pueden decirnos más de lo que crees.

Saludos,