Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-05-2020
usuario1000 usuario1000 is offline
Miembro
 
Registrado: nov 2016
Posts: 86
Poder: 8
usuario1000 Va por buen camino
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.

Última edición por Casimiro Notevi fecha: 17-05-2020 a las 19:05:59.
Responder Con Cita
  #2  
Antiguo 17-05-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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));
Responder Con Cita
  #3  
Antiguo 17-05-2020
usuario1000 usuario1000 is offline
Miembro
 
Registrado: nov 2016
Posts: 86
Poder: 8
usuario1000 Va por buen camino
Muchas gracias por tu pronta respuesta.

Lo pondré en práctica.

Gracias.

Última edición por Casimiro Notevi fecha: 17-05-2020 a las 21:47:27.
Responder Con Cita
  #4  
Antiguo 17-05-2020
usuario1000 usuario1000 is offline
Miembro
 
Registrado: nov 2016
Posts: 86
Poder: 8
usuario1000 Va por buen camino
Red face

Siento decir que no me ha funcionado.


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.
Responder Con Cita
  #5  
Antiguo 17-05-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #6  
Antiguo 18-05-2020
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
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
__________________
El malabarista.
Responder Con Cita
  #7  
Antiguo 18-05-2020
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
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,
Responder Con Cita
  #8  
Antiguo 18-05-2020
usuario1000 usuario1000 is offline
Miembro
 
Registrado: nov 2016
Posts: 86
Poder: 8
usuario1000 Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
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.
Responder Con Cita
  #9  
Antiguo 18-05-2020
usuario1000 usuario1000 is offline
Miembro
 
Registrado: nov 2016
Posts: 86
Poder: 8
usuario1000 Va por buen camino
Cita:
Empezado por gatosoft Ver Mensaje
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.


Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿BCB6 Como Cambiar valor Variable que esta en otra unit? JXJ C++ Builder 3 03-10-2013 01:17:36
Asignar el valor de una variable de php a una variable js que puede no existir jandroruiz PHP 5 04-03-2013 12:23:02
Almacenando datos en una variable de otra unidad R0M3R0 OOP 11 21-08-2008 21:09:04
Refrescar un DBGrid y que el puntero siga apuntando donde estaba Carmelo Cash OOP 11 11-04-2008 10:59:39
¿informe de Crystal apuntando a diferentes usuarios de oracle? dnieto Varios 0 30-09-2005 13:21:33


La franja horaria es GMT +2. Ahora son las 08:02:10.


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
Copyright 1996-2007 Club Delphi