Fórum Tem como alterar em RUN - TIME o valor de uma constante??? #288632

19/07/2005

0

pessoal gostaria d saber se existe a possibilidade dealterar o valor de uma constante em RUN - TIME, e ela permanecesse com esta alteração...


ou se tem como alterar os dados de array static....


Agradeço antecipadamente desde já...


Cabelo

Cabelo

Responder

Posts

19/07/2005

Motta

Não complique.

Já que vai mudar use uma variável.


Responder

Gostei + 0

19/07/2005

Kapak

pessoal gostaria d saber se existe a possibilidade dealterar o valor de uma constante em RUN - TIME, e ela permanecesse com esta alteração...
Const Int7:Integer = 7; var p:PChar; Int8:Integer;
begin
  ShowMessage(IntToStr(Int7));
  p    := @Int7;
  Int8 := 8;
  Move(Int8, p^, 4);
  ShowMessage(IntToStr(Int7));
end;
ou se tem como alterar os dados de array static....
Faça um [b:efc3c46218]for[/b:efc3c46218] variando o ponteiro [b:efc3c46218]p[/b:efc3c46218]


Responder

Gostei + 0

19/07/2005

Massuda

Acho que basta fazer...
const
  K: Integer = 7;
...
  K := 8;
...
...desde que a opção [b:975f3cf528]Assignable typed constants[/b:975f3cf528] em [b:975f3cf528]Project|Options|Compiler[/b:975f3cf528] esteja marcada.

Com essa opção marcada, toda constante cujo tipo seja declarado (no exemplo, K é Integer) pode ter seu valor alterado. Independente se essa opção está ou não marcada, este código...
const
  K = 7;
...
  K := 8;
...
...nem compila.


Responder

Gostei + 0

19/07/2005

Motta

Posso parecer louco mas uso constant para valores que não pretendo mudar, definir uma constante e ficar preocupado em manipular ponteiro , ou opções de compilação para altera-las é complicar à tóa.

As soluções citadas são legais do ponto de vista acadêmico para entender como as coisas funcionam mas na prática não seria melhor simplificar ??!!

Kiss (Keep it simple student) já disse alguém


Responder

Gostei + 0

19/07/2005

Rjun

Motta

então somos dois loucos...acho que constante tem esse nome por algum motivo...


Responder

Gostei + 0

19/07/2005

Daemon

Apesar das ótimas soluções apresentadas pelos camaradas, não pegue esse costume, constantes é para ter o seu valor invariável, se é para variar, use variáveis (rs. ..soou até meio estranho) ...de qualquer maneira, com ponteiro vc pode fazer isso, assim como apresentado, vc pode até, em ponteiro, trocar o tipo de uma variavel de, por exemplo, float para inteiro EM RUNTIME, mas de maneira nenhuma é aconselhavel ser feito, mesmo pq, esse tipo de implementação pode complicar seu proprio debug, ou de outros, mais para frente. ....faça sempre bom uso dos bons costumes de implementação de sistemas. ....
...flws


Responder

Gostei + 0

19/07/2005

Massuda

Concordo que uma constante deveria ter seu valor imutável, mas o fato de ser possível modificar o valor de constantes tipadas (com tipo declarado) existe (se não me engano) desde os tempos do TurboPascal e está habilitado por default no Delphi.

Que eu saiba, isso tem apenas dois usos...[list:1f2be9339a][*:1f2be9339a]compilar código antigo que usava isso para compensar o fato do TP/Delphi não inicializar automaticamente variáveis comum determinado valor escolhido pelo programador (sei que o Delphi hoje faz isso, mas ele não fazia isso nas primeiras versões)[*:1f2be9339a]simular (usando uma terminologia estilo C) uma variável local estática, isto é, algo como uma variável global mas com escopo reduzido (normalmente o escopo dessa variável seria uma function ou procedure)[/list:u:1f2be9339a]


Responder

Gostei + 0

19/07/2005

Cabelo

Colegas...

Adorei colocar em pauta este assunto, pois já ví que é um assunto polêmico..

Agradeço muito a ajuda de todos..

Entre tantos, que optaram por solucionar o problema estão os que opnaram pelo uso de variáveis, sei que é o correto e é assim que eu uso nos meus sistema..

mas acho que vocês não entenderam a minha questão.. a questão é :

Existe alguma forma de manipular estas constantes criadas em desing-time, alterá-las em runtime, e elas permanecerem mudadas, isto é, quero saber se dá pra usar uma UNIT como banco de dados????

Armazenando dados nas constantes, para isso seria necessário mudar o valor atribuido inicialmente a uma constante, ou um static array...

acredito que deve ser assim que um BD funciona, por isso postei esta idéia..


Responder

Gostei + 0

19/07/2005

Massuda

...acredito que deve ser assim que um BD funciona, por isso postei esta idéia..
Não entendi... você queria alterar uma constante do programa e espera que [b:d18c844c77]na próxima[/b:d18c844c77] execução do programa o valor alterado continue lá no programa?


Responder

Gostei + 0

19/07/2005

Kapak

Modificar o valor de constantes as vezes pode ser útil; como por ex: no caso de um array de fim de meses:
const rFim_Mes:array[1..12] of Byte = (31,00,31,30,31,30,31,31,30,31,30,31);
Neste caso, dependendo do ano muda-se o segundo elemento p/ 28 ou 29.
Ao passo que declarar uma variável, teria-se que alimentar os elementos um a um.


Responder

Gostei + 0

19/07/2005

Cabelo

[quote:cf0ab6eaf1=´Cabelo´]...acredito que deve ser assim que um BD funciona, por isso postei esta idéia..
Não entendi... você queria alterar uma constante do programa e espera que [b:cf0ab6eaf1]na próxima[/b:cf0ab6eaf1] execução do programa o valor alterado continue lá no programa?[/quote:cf0ab6eaf1]

Massuda.. é exatamente isso.. gostaria de saber se é possível..


Modificar o valor de constantes as vezes pode ser útil; como por ex: no caso de um array de fim de meses:
const rFim_Mes:array[1..12] of Byte = (31,00,31,30,31,30,31,31,30,31,30,31);
Neste caso, dependendo do ano muda-se o segundo elemento p/ 28 ou 29. Ao passo que declarar uma variável, teria-se que alimentar os elementos um a um.


Kapak

este é um bom exemplo, você tem idéia de como fazer isso ?


Responder

Gostei + 0

19/07/2005

Massuda

[quote:a6cae074f3=´Massuda´][quote:a6cae074f3=´Cabelo´]...acredito que deve ser assim que um BD funciona, por isso postei esta idéia..
Não entendi... você queria alterar uma constante do programa e espera que [b:a6cae074f3]na próxima[/b:a6cae074f3] execução do programa o valor alterado continue lá no programa?[/quote:a6cae074f3]

... é exatamente isso.. gostaria de saber se é possível..[/quote:a6cae074f3]Não tem como fazer isso. Um dos motivos é que não é possível alterar o conteúdo de um arquivo em execução (no caso, seu programa).

Talvez outras idéias surjam se você explicar melhor o que pretende fazer.


Responder

Gostei + 0

19/07/2005

Daemon

1. ...não sei se isso resolve sua questão, mas nesse caso ainda não seria o correto alterar essas constantes, o certo seria vc criar um Reg do seu sistema, ou se não precisa de tanto, talvez soh um INI;

2. quanto à questão do ultimo dia do mes, ainda assim não é necessário se fazer a modificação de constante, pois existem outras formas mais praticas de ser fazer isso;

3. o que vc queria, no caso, não seria alterar a sua constante, mas sim reescrever o código no que diz respeito ao valor dessa constante;


Responder

Gostei + 0

19/07/2005

Kapak

este é um bom exemplo, você tem idéia de como fazer isso ?
Neste caso é simples; basta vc acessar o endereço de memória do segundo elemento e atribuir o valor:
var p:PChar;
begin
  p := @rFim_Mes[2];
  p^ := 28;
end;
2. quanto à questão do ultimo dia do mes, ainda assim não é necessário se fazer a modificação de constante, pois existem outras formas mais praticas de ser fazer isso;
Mas este foi só um exemplo; assim como este pode surgir outras necessidades de alterar apenas um dos ítens de um array de constantes.


Responder

Gostei + 0

19/07/2005

Cabelo

3. o que vc queria, no caso, não seria alterar a sua constante, mas sim reescrever o código no que diz respeito ao valor dessa constante;


É exatamente esta minha pergunta.. tem como??

[quote:ee934d3e0e=´Cabelo´]este é um bom exemplo, você tem idéia de como fazer isso ?
Neste caso é simples; basta vc acessar o endereço de memória do segundo elemento e atribuir o valor:
var p:PChar;
begin
  p := @rFim_Mes[2];
  p^ := 28;
end;
2. quanto à questão do ultimo dia do mes, ainda assim não é necessário se fazer a modificação de constante, pois existem outras formas mais praticas de ser fazer isso;
Mas este foi só um exemplo; assim como este pode surgir outras necessidades de alterar apenas um dos ítens de um array de constantes.[/quote:ee934d3e0e]

Fiz o teste aqui e funcionou bem, já tinha a tempos trabalhado com ponteiros, e acessos físicos àos endereços de memória..

Mas minha pergunta é...

se eu fizer isso, fechar o programa, e depois abrir, como faço para manter este mesmo valor para a segunda posição?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar