Dexter's Lab Posted October 12, 2013 at 12:15 PM Report #528660 Posted October 12, 2013 at 12:15 PM (edited) Boas, criei esta função que me corre muito bem em linux, com o compilador gcc. Mas preciso implementá-la no windows, que por sua vez usa o mingw. void menu(int count, ...) { va_list listPointer; va_start(listPointer, count); for(int i = 1; i <= count; i++) { char *string = va_arg(listPointer, char*); printf("\n%d ..... %s", i < count ? i : 0 , string); } va_end(listPointer); } chamo a função da seguinte forma: menu(3, "optiuon1", "option 2", "option 3"); No linux corre perfeitamente, mas no Windows crasha. Acontece que o erro está na linha printf("\n%d ..... %s", i < count ? i : 0 , string); Porque se substituo string por "texto", ele não crasha, faz o menu normalmente mas onde todas as opções são "texto". Como posso resolver este problema? EDIT: mas principalmente, porque está a acontecer este problema? Obrigado pela atenção Edited October 12, 2013 at 12:17 PM by Dexter's Lab
falk0n Posted October 13, 2013 at 09:10 AM Report #528723 Posted October 13, 2013 at 09:10 AM (edited) Olá, Em vez de tentares fazer isso com um variable argument, porque não experimentas fazer isso com um array de strings e um inteiro. Penso que seja uma solução muito semelhante e provavelmente compativel entre todos os compiladores. (penso que os variable arguments também ...). Em vez de: void menu(int count, ...) { va_list listPointer; va_start(listPointer, count); for(int i = 1; i <= count; i++) { char *string = va_arg(listPointer, char*); printf("\n%d ..... %s", i < count ? i : 0 , string); } va_end(listPointer); } Experimenta algo assim: void menu(int count, char *array_de_strings[]) { int i; for (i = 0; i < count; i++) { char *string = array_de_strings[i]; printf("\n%d ... %s", i < count ? i : 0, string); } } /* e crias um array de array de chars (ou seja um array de strings) */ char *array_de_strings[] = {"menu1", "menu2", "menu3", NULL}; int count = 3; menu(count, array_de_strings); Penso que seja algo assim o que tu queres. Experimenta este código em ambos os sitios. Cumprimentos e boas programações, Nuno Martins Edited October 13, 2013 at 01:50 PM by falk0n
HappyHippyHippo Posted October 13, 2013 at 10:07 AM Report #528727 Posted October 13, 2013 at 10:07 AM o teu código não apresenta nenhum problema, e dúvido sinceramente que o problema esteja no compilador (visto que estás a trabalhar sobre uma funcionalidade básica do C) devido a isso, só posso presumir que o problema esteja noutro local. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
falk0n Posted October 13, 2013 at 01:55 PM Report #528756 Posted October 13, 2013 at 01:55 PM Exacto, não deveria existir qualquer problema. No entanto, o código que escrevi para que ele pudesse perceber se existia algum problema está ai. Não vejo a necessitade de escrever o código daquela forma, com variable arguments. O código que escrevi penso que seja semelhante. Fiquei na dúvida sobre o porquê de ele começar o for em 1, e utilizar a declaração do inteiro dentro do for (sim eu sei que C99 permite isso). Boas programações e espero que o Dexter's lab indique se obteve ou não resultados.
HappyHippyHippo Posted October 13, 2013 at 10:04 PM Report #528813 Posted October 13, 2013 at 10:04 PM Não vejo a necessitade de escrever o código daquela forma, com variable arguments. fica um código muito mais limpo é fácil de fazer a envocação da função. Fiquei na dúvida sobre o porquê de ele começar o for em 1, e utilizar a declaração do inteiro dentro do for (sim eu sei que C99 permite isso). é irrelevante para o cíclo porque no termo de comparação é usado o <=. desconfio que terá feito dessa maneira para que as entradas do menu não apresentassem o valor 0 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pwseo Posted October 14, 2013 at 09:50 AM Report #528853 Posted October 14, 2013 at 09:50 AM (edited) Também não compreendo por que motivo estava a dar mal no Windows, o código está perfeitamente correcto. Já agora, uma pequena variação do que foi falado, desta vez com compound literals (C99) para simplificar a invocação da função: #include <stdio.h> #define menu(X,...) menu_(X, ((char*[]){ __VA_ARGS__ })) void menu_(int count, char **items) { for (int i = 0; i < count; ++i) printf("%d .. %s\n", i + 1, items[i]); } int main(void) { menu(4, "menu1", "menu2", "menu3", "menu4"); return 0; } EDIT: ou então de uma forma ainda mais simplificada (novamente com compound literals): #include <stdio.h> #define menu(...) menu_((char*[]){ __VA_ARGS__, NULL }) void menu_(char **items) { for (int i = 0; items[i] != NULL; ++i) printf("%d .. %s\n", i + 1, items[i]); } int main(void) { menu("menu1", "menu2", "menu3"); return 0; } Edited October 14, 2013 at 12:28 PM by pwseo
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now