Zamiennij zmiennej globalnej dla całego pliku .c

0

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,

0

Przekombinowałeś i to mocno (zwłaszcza w tym ostatnim kodzie). Zwracaj po prostu strukturę zamiast surowej liczby:

struct OperatorResult {
  
  float result;
  const char* errorMessage;

  int hasError() {
    return errorMessage != NULL;
  }

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1