Ir ao conteúdo

sobre funçoes


Cambalinho

Posts recomendados

Postado

eu ja vi como se faz parametros opcionais, mas como os uso?

printf(const char *__format, ...);

as reticencias fazem como os paremetros fossem opcionais, mas como os uso\comparo?

Postado

Quando a função apresentar "...", quer dizer que poderá receber um ou mais parâmetros no lugar.

Exemplo:


printf("Nome: %s", nome);
printf("Nome: %s - Idade: %d", nome, idade);

No caso da função "printf()", esses parâmetros servirão pra preencher os campos "%?" (? = tipo).

Se você quiser entender como implementar uma função desse tipo, aconselho estudar sobre o tipo "va_list".

Postado
Quando a função apresentar "...", quer dizer que poderá receber um ou mais parâmetros no lugar.

Exemplo:


printf("Nome: %s", nome);
printf("Nome: %s - Idade: %d", nome, idade);

No caso da função "printf()", esses parâmetros servirão pra preencher os campos "%?" (? = tipo).

Se você quiser entender como implementar uma função desse tipo, aconselho estudar sobre o tipo "va_list".

com a tua ajuda cheguei a este link que é melhor: http://bobobobo.wordpress.com/2008/01/28/how-to-use-variable-argument-lists-va_list/

muito obrigado

#include <stdio.h>
#include <conio.h>
#include <stdarg.h>

int Menu( char *sentence, ... )
{
va_list listPointer;
va_start( listPointer, sentence );

for( int i = 0 ; i < numargs; i++ )
{
char *arg = va_arg(listPointer, char );
printf( "%s", i, arg );
}
va_end( listPointer );

return 0;
}


void main()
{
Menu("hello", "hi", "back", "Down");
getch();
}

o meu problema é que ainda nao entendi como vou saber quantas frases tenho, para as poder mostrar:(

o exemplo do link é int

Postado
Trabalhando com alocação dinâmica, não tem restrição* de limite.

* Significa que não haverá limite no código, apenas o limite será da máquina.

desculpa mas ainda nao aprendi memoria.

mas podes me ajudar corrigir a funçao?

Postado

Baseado no seu código, ajustei a função para se tornar totalmente dinâmica:


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>

void Menu( char *sentence, ... )
{

int i = 0;
int indice = 0;
char **word = NULL; // Quando alocado memória, se tornará word[][]
va_list listPointer;

word = malloc( sizeof(char *) ); // Aloca memória para índice, word[]
word[indice] = malloc( sizeof(char) * strlen(sentence) ); // Aloca memória para a string, word[][]
strcpy( word[indice], sentence );
indice++;

va_start( listPointer, sentence );

sentence = va_arg(listPointer, char *);

while( strlen(sentence) )
{
word = realloc(word, sizeof(char *) * (indice + 1) ); // Realoca memória para índice, word[]
word[indice] = malloc( sizeof(char) * strlen(sentence) ); // Aloca memória para a nova string, word[][]
strcpy( word[indice], sentence );
indice++;
sentence = va_arg(listPointer, char *);
}

va_end( listPointer );

for( i = 0; i < indice; i++ )
printf( "Posicao: %d - String: %s\n", i, word[i] );

// Libera a memória alocada para cada string
for( i = 0; i < indice; i++ )
free( word[i] );

// Libera a memória do indice
free(word);

}


int main(void)
{
Menu("hello", "hi", "back", "Down");

return 0;
}

Postado
Baseado no seu código, ajustei a função para se tornar totalmente dinâmica:


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>

void Menu( char *sentence, ... )
{

int i = 0;
int indice = 0;
char **word = NULL; // Quando alocado memória, se tornará word[][]
va_list listPointer;

word = malloc( sizeof(char *) ); // Aloca memória para índice, word[]
word[indice] = malloc( sizeof(char) * strlen(sentence) ); // Aloca memória para a string, word[][]
strcpy( word[indice], sentence );
indice++;

va_start( listPointer, sentence );

sentence = va_arg(listPointer, char *);

while( strlen(sentence) )
{
word = realloc(word, sizeof(char *) * (indice + 1) ); // Realoca memória para índice, word[]
word[indice] = malloc( sizeof(char) * strlen(sentence) ); // Aloca memória para a nova string, word[][]
strcpy( word[indice], sentence );
indice++;
sentence = va_arg(listPointer, char *);
}

va_end( listPointer );

for( i = 0; i < indice; i++ )
printf( "Posicao: %d - String: %s\n", i, word[i] );

// Libera a memória alocada para cada string
for( i = 0; i < indice; i++ )
free( word[i] );

// Libera a memória do indice
free(word);

}


int main(void)
{
Menu("hello", "hi", "back", "Down");

return 0;
}

desculpa mas da-me erro:(

eu uso o você++6:

"--------------------Configuration: Menu - Win32 Debug--------------------

Compiling...

menu.cpp

c:\users\joaquim\documents\visual c 98\menu\menu.cpp(14) : error C2440: '=' : cannot convert from 'void *' to 'char ** '

Conversion from 'void*' to pointer to non-'void' requires an explicit cast

c:\users\joaquim\documents\visual c 98\menu\menu.cpp(15) : error C2440: '=' : cannot convert from 'void *' to 'char *'

Conversion from 'void*' to pointer to non-'void' requires an explicit cast

c:\users\joaquim\documents\visual c 98\menu\menu.cpp(25) : error C2440: '=' : cannot convert from 'void *' to 'char ** '

Conversion from 'void*' to pointer to non-'void' requires an explicit cast

c:\users\joaquim\documents\visual c 98\menu\menu.cpp(26) : error C2440: '=' : cannot convert from 'void *' to 'char *'

Conversion from 'void*' to pointer to non-'void' requires an explicit cast

Error executing cl.exe.

Menu.exe - 4 error(s), 0 warning(s)"

Postado

Esse seu compilador tem problemas sérios. :P

A função malloc e realloc deveria funcionar sem fazer typecast, e que, por sinal, é o correto não fazer.

Nas linhas 14 e 15, troque por:


word = (char **) malloc( sizeof(char *) ); // Aloca memória para índice, word[]
word[indice] = (char *) malloc( sizeof(char) * strlen(sentence) ); // Aloca memória para a string, word[][]

Na linhas 25 e 26, troque por:


word = (char **) realloc(word, sizeof(char *) * (indice + 1) ); // Realoca memória para índice, word[]
word[indice] = (char *) malloc( sizeof(char) * strlen(sentence) ); // Aloca memória para a nova string, word[][]

Postado
Esse seu compilador tem problemas sérios. :P

A função malloc e realloc deveria funcionar sem fazer typecast, e que, por sinal, é o correto não fazer.

Nas linhas 14 e 15, troque por:


word = (char **) malloc( sizeof(char *) ); // Aloca memória para índice, word[]
word[indice] = (char *) malloc( sizeof(char) * strlen(sentence) ); // Aloca memória para a string, word[][]

Na linhas 25 e 26, troque por:


word = (char **) realloc(word, sizeof(char *) * (indice + 1) ); // Realoca memória para índice, word[]
word[indice] = (char *) malloc( sizeof(char) * strlen(sentence) ); // Aloca memória para a nova string, word[][]

se calhar tem lol

mas mesmo assim... agora o windows da erro e termina a aplicaçao lol

Postado
Ativou o debug pra acompanhar passo-a-passo a execução?

Esse compilador é muito estranho.

Estou sem o VS, pra poder testa-lo com esse código.

eu sou 'novo' com o debug lol

e sim é 1 pouco estranho lol

depois vejo melhor... obrigado amigo

Postado

Cambalinho,

eu sou 'novo' com o debug lol

e sim é 1 pouco estranho lol

depois vejo melhor... obrigado amigo

Sobre o problema do typecast relatado é que o Cambalinho está compilando o código em C++, daí realmente a necessidade de fazer o cast...

@ScreenBlack: o problema é que o elemento seguinte ao último passado no argumento vem como lixo e não como "", o que seria o esperado (o padrão?); então, o teste no strlen() nunca para e consequentemente o erro... acho que tá na hora do Cambalinho atualizar esse compilador dele... :D

A forma que vi para resolver isso foi explicitamente adicionando uma string vazia ao parâmetro:

Menu("hello", "hi", "back", "Down", "");

Agora funciona..

E tem outra coisa, Cambalinho, vá até o menu Build > Set Active Configuration... | selecione Win32 Release. Se você executar esse programa com as opções de Debug, este erro abaixo vai ocorrer:

i1h91u.png

Um abraço aos amigos,

NW

Postado
Cambalinho,

Sobre o problema do typecast relatado é que o Cambalinho está compilando o código em C++, daí realmente a necessidade de fazer o cast...

@ScreenBlack: o problema é que o elemento seguinte ao último passado no argumento vem como lixo e não como "", o que seria o esperado (o padrão?); então, o teste no strlen() nunca para e consequentemente o erro... acho que tá na hora do Cambalinho atualizar esse compilador dele... :D

A forma que vi para resolver isso foi explicitamente adicionar uma string vazia ao parâmetro:

Menu("hello", "hi", "back", "Down", "");

Agora funciona..

E tem outra coisa, Cambalinho, vá até o menu Build > Set Active Configuration... | selecione Win32 Release. Se você executar esse programa com as opções de Debug, este erro abaixo vai ocorrer:

i1h91u.png

Um abraço aos amigos,

NW

desculpa, mas é normal se eu estiver a complicar o C++. eu estou a estar C e a usar muito C++(neste caso funçoes API e Classes);)

mas nao leves a mal;)

eu ja fiz esse menu de outra forma mais simples. usando 1 string e delimitar os items por ';' e consigo retira-los da string;)

funciona bem, mas ainda tenho algo a resolver;)

abraço e muito obrigado

Postado

Opa,

desculpa, mas é normal se eu estiver a complicar o C++. eu estou a estar C e a usar muito C++(neste caso funçoes API e Classes);)

mas nao leves a mal;)

eu ja fiz esse menu de outra forma mais simples. usando 1 string e delimitar os items por ';' e consigo retira-los da string;)

funciona bem, mas ainda tenho algo a resolver;)

abraço e muito obrigado

Tudo joia meu amigo, é bom que fica para registro. ;)

Um abraço,

NW

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!