Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Variables Apuntando A Otra Variable (https://www.clubdelphi.com/foros/showthread.php?t=94672)

usuario1000 17-05-2020 17:19:30

Variables Apuntando A Otra Variable
 
Hola a todos.
¡¡¡Espero que estéis todos bien!!!
Tengo una duda y después de buscar por ahí y en el foro no he encontrado mucho que me sirva.
Es algo tan sencillo como guardar "el nombre de una variable" en UNA "variable" y luego utilizar esa "variable" para asignarle un valor, pero que realmente se lo estás asignando a la variable que está guardada en esa segunda variable.
En otros lenguajes sería algo así como(no recuerdo exactamente la sintaxis)

b = &c; // guardo en b el nombre de la variable que contiene C.
&c = 15; // Estaría guardando 15, no en C, sino en el nombre de la variable que contiene C.

Saludos.

Casimiro Notevi 17-05-2020 19:05:37

Creo que te refieres a punteros, no a "nombre de la variable".

Código Delphi [-]
var
  i: integer; 
  a: integer;     
  Pi: PInteger;
begin
  i:= 100;
  Pi:= @i;  <<--- Fill pointer to i with the address of i
  a:= Pi^;  <<--- Complicated way of writing (a:= i)
            <<--- Read: Let A be what the pointer_to_i points to
  Pi^:= 200;<<--- Complicated way of writing (i:= 200)
  writeln('i = '+IntToStr(i)+' and a = '+IntToStr(a));

usuario1000 17-05-2020 21:28:24

Muchas gracias por tu pronta respuesta.

Lo pondré en práctica.

Gracias.

usuario1000 17-05-2020 22:22:37

Siento decir que no me ha funcionado. :mad:


El problema es que tengo 5 variables globales declarada de la siguiente forma:





aux_reg1_remesas: array[0..299] of char;
aux_reg2_remesas: array[0..299] of char;
aux_reg3_remesas: array[0..299] of char;
aux_reg5_remesas: array[0..299] of char;



Las posiciones de cada una de las variables las voy rellenando mediante una "función en comun" que utilizo con la siguiente estructura:


Código Delphi [-]
function encomun(variable:PInteger; cadena:string; longitud:integer); // no sé como declarar el parámetro de la funcion "variable", pero así no funciona.

var 

  i:integer;

begin
     // aquí asigno el valor a la posición que me interesa de la variable que quiera de las 5 anteriores.
   ...

     variable[i] := cadena; // no es exactamente así pero la idea es esta. No se como ponerlo aquí para que el compilador lo acepte.

   ...

end




procedure registro;
begin
     ....

     encomun(aux_reg1_remesas, cadena, 3); // La idea es que le mando a la funcion "encomun" la variable que quiero rellenar con la cadena que quiero y con las posiciones que quiero.
     encomun(aux_reg2_remesas, cadena, 5); // La idea es que le mando a la  funcion "encomun" la variable que quiero rellenar con la cadena que  quiero y con las posiciones que quiero.
     ....
     ....

end;

Espero haberme explicado.


Gracias.

Casimiro Notevi 17-05-2020 22:53:51

Si declaras esto:
Código Delphi [-]
aux_reg1_remesas: array[0..299] of char;
Y a la función envías ese array de char:
Código Delphi [-]
encomun(aux_reg1_remesas, cadena, 3);
No puedes esperar allí un puntero a entero (pinteger)
Código Delphi [-]
function encomun(variable:PInteger; cadena:string; longitud:integer);
O no lo he entendido.

mamcx 18-05-2020 05:26:39

Existe razones para usar punteros.

MUY raramente.

---

Una de las lecciones para mantener un código sin líos es EVITAR MUTACIONES (osea: reducir al máximo el alterar los datos desde multiples puntos). Un ejemplo concreto es todo lo que se parezca a una variable global (que es lo que esto parece).

Es mejor pasar los datos, y crear nuevos en base a estos. Algo asi:

Código Delphi [-]
function generar(entrada):array[0..299] 
begin
  nuevo := array[0..299];
  //copias o generas los datos desde entrada y retornas
  result:= nuevo;
end

gatosoft 18-05-2020 17:05:19

Creo que aun tienes muy arraigado el paradigma de tu lenguaje anterior e intentas implementar en Delphi algo, pensando siempore en el homologo de otro lenguaje.

Tu pregunta inicial es muy especifica, pero en la segunda parte vemos mejor el panorama de lo que quieres hacer.

En delphi puedes trabajar con apuntadores y direcciones de momoria pero como dice mamcx, hoy en dia es una necesidad muy muy rara.

Igual como te dice casimiro, para lo que tu quieres puede bastar con definir una funcion que reciba el array como parametro (no la dirección de memoria).

Para que el array pueda ser enviado como parametro, debes defnbir un tipo

Código Delphi [-]
type
  TMyArray = Array[0..299] of char;

Y redefinir tus variables para que sean este tipo (Aunque sean lo mismo, el compilador es muy quisquilloso y prefiere estar seguro.):

Código Delphi [-]
Var
aux_reg1_remesas: TMyArray ; //array[0..299] of char;
aux_reg2_remesas: TMyArray ; //array[0..299] of char;
aux_reg3_remesas: TMyArray ; //array[0..299] of char;
aux_reg5_remesas: TMyArray ; //array[0..299] of char;


Posteriormente, defines la función, teniendo en cuenta que el parámetro de entrada que quieres que se modifique debe ser enviado con la palabra reservada "VAR"

Código Delphi [-]
procedure TForm1.setArray(var pElArray: TMyArray; pIndex: Integer; pValor: char);
begin
  pElArray[pIndex] := pValor;
end;

Y OJO..!!!!!

El valor que vas a asignar a la posición X, no puede ser String, sino CHAR, pues lo vas a asignar a una única posición...


Aqui es donde creo que tu esperas que Delphi funcione como otro lenguje, en el que las cadenas de texto se manejan como listas de char y al asignar un valor a una posición, se llenan los valores de ahi en adeante.

Seria bueno saber que estas grabando en las variables remesas... ¿Estas guardando codigos alfanuméricos de remesas y los vas concatenando?

Si este es el caso... tambien creoq ue la estructura de datos que seleccionaste no es la adecuada. Si nos das mas contexto del problema, podriamos decirte que estructura de datos sería la adecuada.


Saludo,

usuario1000 18-05-2020 17:13:39

Cita:

Empezado por mamcx (Mensaje 537286)
Existe razones para usar punteros.

MUY raramente.

---

Una de las lecciones para mantener un código sin líos es EVITAR MUTACIONES (osea: reducir al máximo el alterar los datos desde multiples puntos). Un ejemplo concreto es todo lo que se parezca a una variable global (que es lo que esto parece).

Es mejor pasar los datos, y crear nuevos en base a estos. Algo asi:

Código Delphi [-]function generar(entrada):array[0..299] begin nuevo := array[0..299]; //copias o generas los datos desde entrada y retornas result:= nuevo; end




Gracias por tu respuesta. Intento no usar variables globales, pero a veces caigo en el vicio. ;)

usuario1000 18-05-2020 17:31:58

Cita:

Empezado por gatosoft (Mensaje 537292)
Creo que aun tienes muy arraigado el paradigma de tu lenguaje anterior e intentas implementar en Delphi algo, pensando siempore en el homologo de otro lenguaje.

Tu pregunta inicial es muy especifica, pero en la segunda parte vemos mejor el panorama de lo que quieres hacer.

En delphi puedes trabajar con apuntadores y direcciones de momoria pero como dice mamcx, hoy en dia es una necesidad muy muy rara.

Igual como te dice casimiro, para lo que tu quieres puede bastar con definir una funcion que reciba el array como parametro (no la dirección de memoria).

Para que el array pueda ser enviado como parametro, debes defnbir un tipo

Código Delphi [-]type TMyArray = Array[0..299] of char;


Y redefinir tus variables para que sean este tipo (Aunque sean lo mismo, el compilador es muy quisquilloso y prefiere estar seguro.):

Código Delphi [-]Var aux_reg1_remesas: TMyArray ; //array[0..299] of char; aux_reg2_remesas: TMyArray ; //array[0..299] of char; aux_reg3_remesas: TMyArray ; //array[0..299] of char; aux_reg5_remesas: TMyArray ; //array[0..299] of char;



Posteriormente, defines la función, teniendo en cuenta que el parámetro de entrada que quieres que se modifique debe ser enviado con la palabra reservada "VAR"

Código Delphi [-]procedure TForm1.setArray(var pElArray: TMyArray; pIndex: Integer; pValor: char); begin pElArray[pIndex] := pValor; end;


Y OJO..!!!!!

El valor que vas a asignar a la posición X, no puede ser String, sino CHAR, pues lo vas a asignar a una única posición...


Aqui es donde creo que tu esperas que Delphi funcione como otro lenguje, en el que las cadenas de texto se manejan como listas de char y al asignar un valor a una posición, se llenan los valores de ahi en adeante.

Seria bueno saber que estas grabando en las variables remesas... ¿Estas guardando codigos alfanuméricos de remesas y los vas concatenando?

Si este es el caso... tambien creoq ue la estructura de datos que seleccionaste no es la adecuada. Si nos das mas contexto del problema, podriamos decirte que estructura de datos sería la adecuada.


Saludo,


Gracias por tu respuesta. Sois impresionante.


Voy a intentar modificarlo según me comentas y a ver que sale. Y efectivamente guardo caracteres alfanumericos en cada variable remesas que paso a modo de cadena, pero no del tirón, sino que voy generando trozos de cadena según condiciones y cuando tengo ese trozo elaborado la envío a la funcion "encomun" para que lo meta en el array, la función "encomun" sabe donde está el primero hueco libre del array y a partir de ahí empieza a meter cada caracter de la cadena en el array.


^\||/


La franja horaria es GMT +2. Ahora son las 16:51:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi