• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Ziwdon

[Dúvida] Argumentos opcionais numa função?

15 mensagens neste tópico

Boas

É possivel criar argumentos opcionais numa função? Ou ter argumentos default ou assim?

Assim seria possivel chamar a função com x argumentos sem estoirar o programa.

Tipo a terminal do linux por exemplo...existem argumentos opcionais nos comandos.

Obrigado

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

com argumentos opcionais numa funcao ... bem eu sei que em c++ utiliza-se em C n me lembro de alguma vez ter visto ... nao digo que nao seja possivel mas nunca vi :)

uns bons search's nao fazem mal a ngm pois n ?! :)

boas programacoes

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parâmetros por default em C tenho 99% de certeza que não dá ... mas podes criar :)

Crias funções diferentes em que lá dentro dás valores a essas variáveis, não sei o contexto é capaz de resultar :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se quiseres complicar, também podes fazer algo parecido ao argc/argv da main, ou aos argumentos variáveis do printf... mas só se quiseres complicar! :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por acaso há algumas funções em C com número variável de argumentos (não só o printf e derivados, mas também funções da família exec, que têm um funcionamento ligeiramente diferente do printf).

Podes ver a biblioteca stdarg, mas parece-me que é complicação a mais para o que queres fazer...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm...pois eu previ que fosse dificil de mais.

Encontrei ISTO mas acho que nao da bem para o que queria.

Obrigado a todos

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

olha sabes como e que eu faço? mando inteiros para a funçao como opcçoes mais ou menos la dentro da funçao faço ifs...fica confuso mas e bue bacano de se fazer lol...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

olha sabes como e que eu faço? mando inteiros para a funçao como opcçoes mais ou menos la dentro da funçao faço ifs...fica confuso mas e bue bacano de se fazer lol...

Pois eu tambem estava a fazer assim.

O problema é que quando sao muitas opçoes depois esquecemo-nos o que recebe a funçao e temos de ir ver.

Talvez va optar por receber uma string com as opções...tipo "-l-f" se quisermos enviar 2 argumentos ou "" se nao quisermos enviar nenhum.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na verdade, a solução à lá argc/argv não é muito complicada.

Se os parâmetros forem todos do mesmo tipo, fazes algo assim:

void imprime(int numval, int *valores) {
int i;
for (i=0; i<numval; ++i)
	printf("%d ", valores[i]);
}

chamada assim:

int main() {
int i[]={ 1, 2, 3, 4, 5, 6, 7, 8 };
imprime(8, i);
return 0;
}

Se forem de tipos diferentes complica um bocadinho mais, mas não demasiado (penso eu de que), não podes é trocar a ordem dos argumentos (o que ambém não podia acontecer em C++):

void imprime(int numval, void **valores) {
//a função espera receber no apontador 1 int, 2 chars e 2 floats,
//dos quais o último float é opcional
if (numval==4) {
	printf("int = %d\nchar = %c\nchar = %c\nfloat = %f\no 5o valor nao foi passado\n", *((int*)valores[0]),
		*((char*)valores[1]), *((char*)valores[2]), *((float*)valores[3]));
}
if (numval==5) {
	printf("int = %d\nchar = %c\nchar = %c\nfloat = %f\nfloat = %f\n", *((int*)valores[0]), *((char*)valores[1]),
		*((char*)valores[2]), *((float*)valores[3]), *((float*)valores[4]));
}
}

que é chamada assim:

int main() {
int a=10;
char b='c', c='x';
float d=2.56, e=5.18;
//colocar os endereços das variáveis acima no array de apontadores
void *v1[] = { &a, &b, &c, &d, &e };
void *v2[] = { &a, &b, &c, &d };
printf("1a chamada:\n");
imprime(5, v1);
printf("\n\n2a chamada:\n");
imprime(4, v2);
return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@TheDark

Eu tambem tinha pensado fazer como a tua primeira opção...mas depois não me agradou muito o facto de termos que declarar um array para podermos chamar a função.

A 2ª opção já é um bocadinho mais complicada...ha ai alguns conceitos dos quais ainda não estou a par.

Ainda não sei use a 1ª opção ou se faça como disse no post anterior.

Obrigado pela atenção

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A ideia é a mesma nas 2 implementações, mas na 2ª recebes um array de apontadores sem tipo, por isso podes apontar para o tipo que quiseres.

Ainda não percebi bem em que situação queres utilizar isso...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A ideia é a mesma nas 2 implementações, mas na 2ª recebes um array de apontadores sem tipo, por isso podes apontar para o tipo que quiseres.

Ainda não percebi bem em que situação queres utilizar isso...

Neste caso estou a fazer uma library, em que uso uma função 'personalizavel', ou seja com items opcionais.

Mas para nao termos que fazer algo do genero function(0, 0, 0, 0, 0, 0, 0) em que cada int significa uma coisa, queria ter argumentos opcionais...assim poderiamos fazer so por exemplo function(0, 0) sendo os restantes argumentos opcionais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora