Você está na página 1de 3

Dicas de Programação C

Passagem de dados da linha de


comandos
• Estrutura de comandos da linha de comandos
<comando>[[<espaço><argumento>]...]
• <comando> = nome do ficheiro executável ou comando do sistema
(sem espaços ou entre aspas)
• <espaço> = caractére espaço (‘ ‘)
• <argumento> = conjunto de carateres sem espaços entre eles
• As aplicações C podem receber dados da linha de
comando através de argumentos especiais
(normalizados) da função ‘main’
void main(int argc, char* argv[])
• Suponha que é digitado o comando “dir /p /s”
A aplicação “dir” receberá:
• argc = 3 (número de argumentos)
• argv[] = {“dir”, “/p”, “/s”} (array de strings com cada uma das strings
da linha de comandos)
Apontadores e Passagem de
parâmetros de funções
• A passagem de parâmetros para uma função pode fazer-se por valor ou por referência
• Exemplo
Suponha uma função
int func1(int pa, int* pb);
que é invocada pelo seguinte código
int a=1, b=2, c=3;
...
c = func1(a, &b);
...
O 1º parâmetro é passado por valor, porque a função recebe uma variável local para onde é copiado o valor da
variável ‘a’ (ou seja, ‘pa’ tem o valor ‘1’)
O 2º parâmetro é passado por referência, porque a função recebe uma variável local para onde é copiado o
endereço da variável ‘b’ (ou seja, ‘pb’ tem o valor ‘0x0000d2f1’, que é a posição da variável ‘b’ na memória)
• Consequências
– as funções não podem alterar o valor das variáveis passadas por valor
mesmo que na função existe uma linha “pa = 4;”, apenas a variável local “pa” é modificada
– as funções podem alterar o valor das variáveis passadas por referência
se na função existe uma linha “*pb = 5;”, a variável externa ‘b’ fica com o valor “4”
• A passagem por referência pode ser feita de duas formas
– Declarando uma variável do tipo requerido e fornecendo o respectivo endereço (tal como no exemplo
acima)
– Declarando um apontador para o tipo requerido e fornecendo o apontador
int a=1, *b, c=3;
b = malloc(sizeof(int));
*b = 2:
...
c = func1(a, b);

Tipos de variáveis
• Na API do Windows e no WDK são utilizados variáveis do tipo
LPCVOID, PUCHAR, ...
• Estes tipos correspondem aos tipos base de C/C++ decorados com
modificadores e significam:
L – apontador longo (equivale ao modificador ‘far’ se necessário)
P – apontador (equivale ao ‘*’)
C – constante (equivale ao modificador ‘const’)
U – sem sinal (equivale ao modificador ‘unsigned’)
...
• Exemplo
‘LPCVOID’ equivale a ‘const void *’
• Estes tipos estão definidos na secção “Windows Data Types” do
MSDN (http://msdn.microsoft.com/en-
us/library/aa383751(VS.85).aspx)
Declaração de funções
• Uma função pode aparecer no código de um programa de três formas:
– Declaração: definição do nome e o tipo dos seus parâmetros, e.g.
int func2(int, int*);
– Invocação: utilização da função para realizar a respectiva operação sobre os argumentos
concretos, e.g.
c = func2(a, &b);
– Implementação: corpo da função que contém o código que implementa a respectiva
operação, e.g.
int func2(int a, int *b) {
int resultado = a+(*b);
return resultado;
}
• Em cada ficheiro ‘.c’ ou ‘.cpp’:
– a invocação tem que aparecer depois da declaração ou da implementação (senão o
compilador não conhece a função)
– a declaração é necessária sempre que a implementação apareça depois da invocação
• Declaração e Implementação
– a inclusão pode ser directa ou através de ficheiros ‘.h’
– a implementação pode estar num ficheiro separado, que é ligado aos outros pelo linker (erro
de ‘linkage’ quando não está acessível)

Você também pode gostar