Jump to content
Dexter's Lab

string com comportamento diferente em SO's

Recommended Posts

Dexter's Lab

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 by Dexter's Lab

Share this post


Link to post
Share on other sites
falk0n

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 by falk0n

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
falk0n

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.

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
pwseo

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 by pwseo

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.