🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #60165

Re: Jak zrobić program obliczający dużą silnię?

#60165
From: Wojtek Kaniewski
Date: Wed, 26 Oct 2005 12:47
111 lines
3565 bytes
Jacek Popławski napisał(a):
>> bo w rzeczywistych sytuacjach często są jeszcze zmienne lokalne, 
>> których wartości trzeba w jakiś sposób do funkcji przekazać.
> 
> Możesz podać kod rzeczywistej sytuacji? Bo cały czas padają dosyć 
> hipotetyczne przykłady.

mogę, chociaż pewnie usłyszę, że kod jest źle napisany, że przecież 
wszystko powinno być rozbite na malutkie funkcje. jasne, jeśli ktoś lubi 
bawić się w akademickie podejście, proszę bardzo. dla mnie bardziej 
czytelna jest jedna funkcja robiąca jedną rzecz, a nie wywołująca 
dziesiątki mniejszych funkcji _foo(), _schmoo(), _bar(), _bah(), _baz(), 
którym przekazuje się wskaźniki na kilka zmiennych lokalnych, na których 
funkcje operują.

int window_printat(WINDOW *w, int x, int y, const char *orig_format, 
void *orig_data, int fgcolor, int bold, int bgcolor, int status)
{
         int orig_x = x;
         int backup_display_color = config_display_color;
         char *format = (char*) orig_format;
         const char *p;
         struct format_data *data = orig_data;

	/* ... */

	while (*p && *p != '}' && x <= w->_maxx) {
                 int i, nest;

		/* ... */

                 for (i = 0; data && data[i].name; i++) {
                         int len;

			/* ... */

			if (!strncmp(p, data[i].name, len) && p[len] == '}') {
                                 char *text = data[i].text;
                                 int j;

				/* ... */

				goto next;
			}
		}

		if (*p == '?') {
			/* ... */
		}

next:

		/* ... */

		while (*p && nest) {
			/* ... */
		}
	}

	/* ... */

	return x - orig_x;
}

przy okazji szukania przykładowego kodu znalazłem całe mnóstwo sytuacji 
w stylu:

int foo(char *data)
{
	char *tmp;
	int value;
	void *ptr;

	tmp = malloc(123);

	while (*data) {
		switch (*data) {
			case 1:
				/* ... */

				if (costam())
					goto warning;

				break;

			case 2:
				/* ... */

				if (costam())
					goto error;

				break;

			/* ... */
		}
	}

warning:
	log("warning, blabla\n");
	free(tmp);
	return 0;

error:
	log("error, blabla\n");
	free(tmp);
	return -1;
}

jak można to zapisać nie używając goto, żeby było bardziej przejrzyste?

w.
Technical Details
Message-ID: <djntuu$1l4$1@inews.gazeta.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
References: <djfrn5$i55$1@nemesis.news.tpi.pl> <dji80k$2a5$2@atlantis.news.tpi.pl> <20051024135514.GA237@siebert> <djij31$st1$1@sunnews.cern.ch> <20051024162624.GA1132@siebert> <djleog$fok$1@nemesis.news.tpi.pl> <1t4bv9mozvw38.12szxw58iqmbp.dlg@40tude.net> <djn9lh$ktl$1@nemesis.news.tpi.pl> <djnq2f$9i4$1@inews.gazeta.pl> <djnqvu$be7$2@atlantis.news.tpi.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: Wojtek Kaniewski <wojtekka@SPAM.SPAM.SPAM>
Newsgroups: pl.comp.os.linux.programowanie
Subject: Re: Jak zrobić program
 obliczający dużą silnię?
Date: Wed, 26 Oct 2005 14:47:58 +0200
Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
Lines: 111
Message-ID: <djntuu$1l4$1@inews.gazeta.pl>
References: <djfrn5$i55$1@nemesis.news.tpi.pl> <dji80k$2a5$2@atlantis.news.tpi.pl> <20051024135514.GA237@siebert> <djij31$st1$1@sunnews.cern.ch> <20051024162624.GA1132@siebert> <djleog$fok$1@nemesis.news.tpi.pl> <1t4bv9mozvw38.12szxw58iqmbp.dlg@40tude.net> <djn9lh$ktl$1@nemesis.news.tpi.pl> <djnq2f$9i4$1@inews.gazeta.pl> <djnqvu$be7$2@atlantis.news.tpi.pl>
NNTP-Posting-Host: nat-241-119.man.bydgoszcz.pl
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1130330920 1700 82.146.241.119 (26 Oct 2005 12:48:40 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Wed, 26 Oct 2005 12:48:40 +0000 (UTC)
In-Reply-To: <djnqvu$be7$2@atlantis.news.tpi.pl>
X-Accept-Language: pl, en-us, en
X-User: wojtekka12
User-Agent: Mozilla Thunderbird 1.0.7 (X11/20050923)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit