Article View: pl.comp.os.linux.programowanie
Article #60165Re: Jak zrobić program obliczający dużą silnię?
From: Wojtek Kaniewski
Date: Wed, 26 Oct 2005 12:47
Date: Wed, 26 Oct 2005 12:47
111 lines
3565 bytes
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-mailReferences:
<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