Duvida sobre declaracao de funçao ou procedure
Boa tarde
Me surgiu agora esta duvida, qual a forma correta de declarar um funcao ou procedure, pois eu sempre declaro assim:
mas ja vi em codigos funçoes declaradas assim:
ou assim:
Gostaria de saber a diferença entre elas e qdo usar uma ou outra.
Obrigado
Renato.
Me surgiu agora esta duvida, qual a forma correta de declarar um funcao ou procedure, pois eu sempre declaro assim:
function Teste(S: string): String;
mas ja vi em codigos funçoes declaradas assim:
function Teste(const S: string): String;
ou assim:
function Teste(var S: string): String;
Gostaria de saber a diferença entre elas e qdo usar uma ou outra.
Obrigado
Renato.
Renato.pavan
Curtidas 0
Respostas
Rjun
27/03/2007
Quando você passa um parâmetro utilizado a palavra reservada [b:10c3d801e4]var[/b:10c3d801e4], você está passando o endereço de onde se encontra aquela variável e dessa maneira qualquer alteração que essa variável sofra na função ela irá se refletir diretamente no endereço, ou seja, após a execução da função ou procedure, a alteração da variável será refletida globalmente. Isso se chama passagem de parâmetros por referência..
Quando não se utiliza a palavra [b:10c3d801e4]var[/b:10c3d801e4], você está passando o valor da variável, uma cópia. Nesse caso qualquer alteração que essa variavel sofra na função ou procedure ficará dentro do escopo da função ou procedure. Isso se chama passagem de parâmetros por valor.
O Const (peço ajuda ao universitários, se minha explicação não estiver correta), diz que a varável não pode ter seu valor alterado dentro da procedure ou function. Dessa forma o compilador pode otimizar essa passagem.
Não existe forma correta. Cada forma deve ser utilizada de acordo com sua necessidade.
Quando não se utiliza a palavra [b:10c3d801e4]var[/b:10c3d801e4], você está passando o valor da variável, uma cópia. Nesse caso qualquer alteração que essa variavel sofra na função ou procedure ficará dentro do escopo da função ou procedure. Isso se chama passagem de parâmetros por valor.
O Const (peço ajuda ao universitários, se minha explicação não estiver correta), diz que a varável não pode ter seu valor alterado dentro da procedure ou function. Dessa forma o compilador pode otimizar essa passagem.
Não existe forma correta. Cada forma deve ser utilizada de acordo com sua necessidade.
GOSTEI 0
Newpaulo
27/03/2007
[b:f0f8d75b8f]PASSAGEM DE PARAMETROS[/b:f0f8d75b8f]
Podemos passar parâmetros para functions e procedures da mesma for-
ma, ou melhor de três formas diferentes :
# [b:f0f8d75b8f]Por valor[/b:f0f8d75b8f], esta é a forma mais comum, quando uma determinada in- formação é passada como parâmetro por valor é feita uma cópia local para que a função possa trabalhar.
Assim :
implementation
{$R *.DFM}
function soma( x,y : integer ):integer;
begin
result := ( x + y );
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage( IntToStr ( soma ( 2,5 ) ) );
end;
Desta forma dentro da function soma os valores 2 e 5 são armazena-
dos nas variáveis x e y, esta é a forma mais comum de se trabalhar
com os parâmetros, provavelmente pro ser a mais simples e despreo-
cupada :) ...
O isolamento proporcionado por este tipo de pratica é otimo,nenhum
valor manipulado dentro da função fica visível,a não ser o próprio
valor de retorno.
Isto tem um custo, como é feita uma copia dos valores para serem
trabalhados internamente mais memória é alocada para esta copia
extra e se a quantidade de parâmetros for muito grande ou se
existir recursividade envolvida a coisa pode começar a se compli-
car.
# [b:f0f8d75b8f]Por referencia[/b:f0f8d75b8f], a passagem por referencia deve ser utilizada quando desejamos que qualquer alteração no valor dentro da função seja refletida fora também.
O que isto quer dizer ??? bem quando um parâmetro é passado por
referencia na realizada o compilador é informado que não deve
fazer uma copia local do valor e sim utilizar o mesmo endereço de
memória que já existe, na pratica seria como duas variáveis dife-
rentes que apontem para o mesmo local da memória, uma fora e outra
dentro da função.
O inconveniente é que não podemos passar valores diretamente
dentro da chamada da função como fizemos no exemplo anterior, já
que o compilador apenas aceita variáveis na passagem de parametros
por referencia.
function soma( x,y : integer ):integer;
begin
x := ( x + y );
result := x;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,z : integer;
begin
x := 2;
y := 5;
z := 0;
z := soma( x,y );
ShowMessage( ´Valor de x = ´ + IntToStr( x ) + #13+
´Valor de y = ´ + IntToStr( y ) + 13+
´Valor de z = ´ + IntToStr( z ) );
end;
Quando você executar este código o resultado obtido será um
showmessage com os valores 2, 5 e 7 ...
Ótimo, é o que esperávamos mesmo, como não acrescentamos a palavra
reservada VAR na função soma todos os valores foram copiados para
serem manipulados internamente, assim o que fazemos com a variável
x interna da função não afeta o valor da variável x externa.
Agora vamos mudar a declaração da função, acrescentando VAR na
passagem dos parâmetros...
function soma( var x,y : integer ):integer;
Executando novamente o programa podemos notar que o resultado do
ShowMessage agora será 7, 5 e 7 ... :) ...
Uma ou mais variáveis podem ser passadas por referencia, da forma
como fizemos no exemplo acima, todas as variáveis foram passadas
assim, poderíamos ter feito de outra forma ...
function soma( var x: integer; y : integer ):integer;
# [b:f0f8d75b8f]Constante[/b:f0f8d75b8f], a passagem de um parâmetro como constante é útil quando queremos prevenir que um determinado valor não possa ser alterado de forma alguma em uma seqüência muito grande de calculos
É bastante simples agora ver como fazemos este tipo de declaração.
function soma( var x: integer; const y : integer ):integer;
Neste exemplo x é passado por referencia e y declarado como cons-
tante...
Esse texto não é meu !
Maiores informações em :
http://www.mrsoftware.com.br/user/martins/tutoriais/artigos/artigos.php?num=27
Podemos passar parâmetros para functions e procedures da mesma for-
ma, ou melhor de três formas diferentes :
# [b:f0f8d75b8f]Por valor[/b:f0f8d75b8f], esta é a forma mais comum, quando uma determinada in- formação é passada como parâmetro por valor é feita uma cópia local para que a função possa trabalhar.
Assim :
implementation
{$R *.DFM}
function soma( x,y : integer ):integer;
begin
result := ( x + y );
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage( IntToStr ( soma ( 2,5 ) ) );
end;
Desta forma dentro da function soma os valores 2 e 5 são armazena-
dos nas variáveis x e y, esta é a forma mais comum de se trabalhar
com os parâmetros, provavelmente pro ser a mais simples e despreo-
cupada :) ...
O isolamento proporcionado por este tipo de pratica é otimo,nenhum
valor manipulado dentro da função fica visível,a não ser o próprio
valor de retorno.
Isto tem um custo, como é feita uma copia dos valores para serem
trabalhados internamente mais memória é alocada para esta copia
extra e se a quantidade de parâmetros for muito grande ou se
existir recursividade envolvida a coisa pode começar a se compli-
car.
# [b:f0f8d75b8f]Por referencia[/b:f0f8d75b8f], a passagem por referencia deve ser utilizada quando desejamos que qualquer alteração no valor dentro da função seja refletida fora também.
O que isto quer dizer ??? bem quando um parâmetro é passado por
referencia na realizada o compilador é informado que não deve
fazer uma copia local do valor e sim utilizar o mesmo endereço de
memória que já existe, na pratica seria como duas variáveis dife-
rentes que apontem para o mesmo local da memória, uma fora e outra
dentro da função.
O inconveniente é que não podemos passar valores diretamente
dentro da chamada da função como fizemos no exemplo anterior, já
que o compilador apenas aceita variáveis na passagem de parametros
por referencia.
function soma( x,y : integer ):integer;
begin
x := ( x + y );
result := x;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,z : integer;
begin
x := 2;
y := 5;
z := 0;
z := soma( x,y );
ShowMessage( ´Valor de x = ´ + IntToStr( x ) + #13+
´Valor de y = ´ + IntToStr( y ) + 13+
´Valor de z = ´ + IntToStr( z ) );
end;
Quando você executar este código o resultado obtido será um
showmessage com os valores 2, 5 e 7 ...
Ótimo, é o que esperávamos mesmo, como não acrescentamos a palavra
reservada VAR na função soma todos os valores foram copiados para
serem manipulados internamente, assim o que fazemos com a variável
x interna da função não afeta o valor da variável x externa.
Agora vamos mudar a declaração da função, acrescentando VAR na
passagem dos parâmetros...
function soma( var x,y : integer ):integer;
Executando novamente o programa podemos notar que o resultado do
ShowMessage agora será 7, 5 e 7 ... :) ...
Uma ou mais variáveis podem ser passadas por referencia, da forma
como fizemos no exemplo acima, todas as variáveis foram passadas
assim, poderíamos ter feito de outra forma ...
function soma( var x: integer; y : integer ):integer;
# [b:f0f8d75b8f]Constante[/b:f0f8d75b8f], a passagem de um parâmetro como constante é útil quando queremos prevenir que um determinado valor não possa ser alterado de forma alguma em uma seqüência muito grande de calculos
É bastante simples agora ver como fazemos este tipo de declaração.
function soma( var x: integer; const y : integer ):integer;
Neste exemplo x é passado por referencia e y declarado como cons-
tante...
Esse texto não é meu !
Maiores informações em :
http://www.mrsoftware.com.br/user/martins/tutoriais/artigos/artigos.php?num=27
GOSTEI 0
Renato.pavan
27/03/2007
Obrigado a todos pelas respostas.
Renato.
Renato.
GOSTEI 0