Nezd, en mar nagyon sok goto elleni kereszteshaboruban vettem reszt, de nem zarkozom el ujabbak elol... nem valamifele elmelet alapjan hasznalok goto-t, hanem egyszeruen az elet ugy hozza hogy ha el akarom kerulni a sokszorosan egymasba agyazott if-eket, a kodok megismetleset, a tobbszoros kilepest (return), akkor egyszeruen nincs mas eszkoz mint az ugras.
Ime egy fuggvenyem, amelyet teljesen valos programbol vagtam ki peldanak:
int S3_ReAllocMem (S3_MEMKEY memkey, unsigned new_size,
S3_MEMINFO *minfo)
{
CORE_CB *cb;
MEMO_CB *m, *mnew;
int rc;
S3_MEMKEY k;
if (memkey<0 || memkey>S3_MAX_MEMKEY ||
(cb = mcb.currmem[memkey].o) == NULL ||
(m = mcb.currmem[memkey].m) == NULL) {
rc = -1;
goto VEGE;
}
if (new_size == m->size) { /* same size - keep the old */
rc = 0;
mnew = m; /* LZS. 2002.06.18. */
goto VEGE;
}
FrMem ((CORE_CB *)cb, m);
mnew = (MEMO_CB *) realloc (m, sizeof (MEMO_CB)+new_size);
if (mnew == NULL) { /* Could not realloc - keep the old */
mnew = m;
ToMemB ((CORE_CB *)cb, m);
rc = 1;
} else { /* Realloced */
mnew->size = new_size;
mnew->addr = (char *)mnew + sizeof (MEMO_CB);
ToMemB ((CORE_CB *)cb, mnew);
rc = 0;
if (m != mnew) { /* and moved too */
for (k = 0; k<=S3_MAX_MEMKEY; ++k) {
if (mcb.currmem[k].o != NULL &&
mcb.currmem[k].m == m)
mcb.currmem[k].m = mnew;
}
}
}
VEGE:
if (minfo) {
if (rc<0) memset (minfo, 0, sizeof (*minfo));
else memcpy (minfo, mnew, sizeof (*minfo));
}
return rc;
}