Cześć,
Mam pewien problem z zaprojektowaniem "globalnych" ustawień dla całego pliku .c. Najlepiej będzie to omówić na przykładzie
Wyobraźmy sobie, że mamy pliki main.c i math.c . Pliki posiadają następującą budowę:
//main.c
//zignorować błędne typy.
int main(int argc, char *argv[])
{
int result = 0;
if(strcmp(argv[0],"add"))
{
result = add_values(argv[1], argv[2]);
}
else if(srcmp(argv[0], "div"))
{
result = div_values(argv[1], argv[2]);
}
printf("result: %d\n",result);
return 0;
}
//math.c
int add_values(int a, int b)
{
return a+b;
}
int div_values(int a, int b)
{
if(b == 0)
{
// no właśnie, co tutaj ?
}
else return a/b;
}
I teraz tak. Przyjmijmy, że istnieje w tym programie parametr np. -errors. Umożliwia on wyświetlenie informacji, gdzie i na jakim etapie coś poszło nie tak. Jak teraz zaprojektować taki
mechanizm, który by to umożliwiał. Na necie trochę czytałem o extern i zmiennych globalnych - ale czy to dobry pomysł ? Przykładowo:
//main.c
//zignorować błędne typy.
#include "math.c"
int show_message = 0;
int main(int argc, char *argv[])
{
int result = 0;
if(strcmp(argv[3], "-errors"))
{
show_message = 1;
}
if(strcmp(argv[0],"add"))
{
result = add_values(argv[1], argv[2]);
}
else if(srcmp(argv[0], "div"))
{
result = div_values(argv[1], argv[2]);
}
printf("result: %d\n",result);
return 0;
}
//math.c
extern show_message;
int add_values(int a, int b)
{
return a+b;
}
int div_values(int a, int b)
{
if(b == 0)
{
if(show_messages)
{
puts("ERROR: Divide by zero");
return -1;
}
}
else return a/b;
}
Myślałem też o czymś takim:
//main.c
//zignorować błędne typy.
#include "math.c"
int main(int argc, char *argv[])
{
int result = 0;
char *probably_error = NULL;
int error_occur = 0;
if(strcmp(argv[0],"add"))
{
result = add_values(argv[1], argv[2]);
}
else if(srcmp(argv[0], "div"))
{
result = div_values(argv[1], argv[2], &error, &error_detected);
}
if(error_detected)
{
printf("%s\n", error);
return 1;
}
printf("result: %d\n",result);
return 0;
}
//math.c
extern show_message;
int add_values(int a, int b)
{
return a+b;
}
int div_values(int a, int b, char **error, int *error_detected)
{
if(b == 0)
{
if(show_messages)
{
*error = malloc(0x10);
*error = "ERROR: Div by zero";
*error_detected = 1;
}
}
*error_detected = 0;
else return a/b;
}
Ale nie wiem co o tym myśleć. Wydaje mi się, że podchodzę do tego od złej strony. I właśnie mam z tym problem, ponieważ chcę wypisywać na różnych etapach w różnych miejscach kodu co poszło nie tak w zależności od wprowadzonego parametru (czy wypisywać czy nie). Nie potrafię znaleźć dobre drogi. Mógłby ktoś zaproponować jak taki mechanizm błędów zrealizować dla różnych kilku plików .c ?
Pozdr.
NeuroXiq,