Jak můžu opustit funkci

Jeded Vojka

Jak můžu opustit funkci
« kdy: 12. 07. 2018, 09:56:42 »
Mám funkci:

void Kresli ()
{
 .. nějaký ten kód
if (nějaká podmínka)
vyfuň z funkce ..

}

na místo "vyfuň z funkce" jsem zkoušel dát break; ale překladači se to nelíbilo, jako že "illegal break".
Tak jsem dal return;, ten se provedl, ale vytuhnul mi celý program.
Jak mohu opustit tu funkci Kresli, aby program pokračoval za místem, odkud byla Kresli zavolána?


Jenda

Re:Jak můžu opustit funkci
« Odpověď #1 kdy: 12. 07. 2018, 10:02:52 »
Ano, return. A to vytuhnutí musíš nějak vyřešit, tipuju, že jsi před tím alokoval nějaké prostředky, zamkl nějaký zámek atd. a proto ti to vytuhne. Ty prostředky musíš samozřejmě zase uvolnit.

balki

Re:Jak můžu opustit funkci
« Odpověď #2 kdy: 12. 07. 2018, 10:45:27 »
Navrhoval by som spravne pouzit strukturovane programovanie a vyhnut sa returnom a breakom uprostred procedury.

daemon

Re:Jak můžu opustit funkci
« Odpověď #3 kdy: 12. 07. 2018, 10:46:41 »
A víš, kde to vytuhne? Třeba to není v okamžiku návratu z Kresli(), ale někde pozděj. Přidej si tam nějaký pomocný printf() nebo puts(), do Kresli() před return, potom až za volání Kresli(). Nebo to odkrokuj v debuggeru. Za tím ifem je ještě nějaký další kód? Takto, jak jsi to napsal, Kresli() skončí vždy, bez ohledu na výsledek toho ifu. Ani bys tam ten return nemusel psát.

void Kresli()
{
 puts("zacatek funkce Kresli()\n");
  nějaký kód
  if (podmínka)
  {
    puts("konec funkce Kresli() - podminka splnena\n");
    return;
  }
  nějaký další kód
  puts("konec funkce Kresli()\n");
}

/* ------ */

/* odtud Kresli() volame */
 puts("ted zavolam Kresli()\n");
 Kresli();
 puts("ted jsem zpet z Kresli()\n");


Pokud to bude psát:

ted zavolam Kresli()
zacatek funkce Kresli()
konec funkce Kresli() - podminka splnena
ted jsem zpet z Kresli()

return funguje správně a příčinu problému musíš hledat jinde.

Jeded Vojka

Re:Jak můžu opustit funkci
« Odpověď #4 kdy: 12. 07. 2018, 11:04:46 »
Jo, jasně - dík všem. Jenda měl pravdu, já měl v "Kresli" zámek, aby mi proběhla vždycky úplně celá a nenarušil mi jí třeba časovač windows, i když si nejsem jist, jestli je vůbec něco takového možné. No a pak jsem tam přidal kód s tím, že část "Kresli" by pod podmínkou chvíli běhala v takové jako smyčce. Ale musí si při tom "odskočit" pro zprávy windows, čtení klávesnice a tak, takže fakt musí úplně ven. Takže "Kresli" skutečně "vyfuněla" nebo spíš ten - jak vono se to- ten ukazatel do programu nebo tak, a nechal "Kresli" zamknutou a když se chtěl vrátit, tak strašně vytuhl, aniž by se k tomu mohl jakkoliv vyjádřit  :D
No, jinak ano -"Kresli" pokračovala ještě za podmínkou, takže to ona by neskončila a provedl by se další kód. Tenhle return je tam fakt výjimečně, taky to nemám moc rád, vlastně jsem to použil poprvé.


borekz

  • ****
  • 493
    • Zobrazit profil
    • E-mail
Re:Jak můžu opustit funkci
« Odpověď #5 kdy: 12. 07. 2018, 13:15:21 »
Jestli pod časovačem myslíš SetTimer a jestli metodu Kresli voláš z události WM_PAINT, tak by ti ji časovač přerušit neměl, protože jen pošle událost WM_TIMER do stejné fronty, ze které předtím tvůj program nebo framework vytáhnul WM_PAINT. Pokud se chceš profesionálně zabývat aplikacemi pro Windows 7 a starší, doporučuji začít v C nebo C++ a v čistém Win32 bez frameworků, aby jsi měl představu, jak to funguje.

Jeded Vojka

Re:Jak můžu opustit funkci
« Odpověď #6 kdy: 12. 07. 2018, 13:20:44 »
borekz:
já jí volám z case WM_TIMER:
a časovač mám 100.
   case WM_CREATE:
      SetTimer(hWnd, 1, 100, NULL);
      break;

Honza

Re:Jak můžu opustit funkci
« Odpověď #7 kdy: 12. 07. 2018, 16:36:28 »
Navrhoval by som spravne pouzit strukturovane programovanie a vyhnut sa returnom a breakom uprostred procedury.

Ty vado.... Ten člověk má evidentně problémy se základy C a ideolog mu tady radí jak psát krásný kód.

Re:Jak můžu opustit funkci
« Odpověď #8 kdy: 12. 07. 2018, 16:54:33 »
Navrhoval by som spravne pouzit strukturovane programovanie a vyhnut sa returnom a breakom uprostred procedury.
Mohl byste uvést konkrétní příklad, kdy může být v C break na konci procedury (a má tam nějaký smysl)?

Kiwi

Re:Jak můžu opustit funkci
« Odpověď #9 kdy: 12. 07. 2018, 17:07:02 »
Navrhoval by som spravne pouzit strukturovane programovanie a vyhnut sa returnom a breakom uprostred procedury.
Mohl byste uvést konkrétní příklad, kdy může být v C break na konci procedury (a má tam nějaký smysl)?
Chtěl tím říci, že puristi místo

if (chyba)
    return;
/* zbytek kódu */

napíšou

if (!chyba) {
   /* zbytek kódu */
}

Jenda

Re:Jak můžu opustit funkci
« Odpověď #10 kdy: 12. 07. 2018, 17:18:46 »
...

Deadlock (a segfault) jsou podle mě dvě nejjednodušší věci, při kterých se začátečník může naučit s debuggerem - například v gdb stačí napsat "bt" a ihned vidíš, kde to skončilo.

(jinak teda hodilo by se příště říct, co to je za jazyk :)

Re:Jak můžu opustit funkci
« Odpověď #11 kdy: 12. 07. 2018, 18:34:32 »
Chtěl tím říci, že puristi…
Ovšem je hloupé, když chce být někdo purista a puntičkář, a zamotá break mezi způsoby, jak v C ukončit funkci. Čtenář pak totiž může pochybovat, jestli dotyčný vůbec umí programovat…

BoneFlute

  • *****
  • 1 983
    • Zobrazit profil
Re:Jak můžu opustit funkci
« Odpověď #12 kdy: 12. 07. 2018, 18:51:04 »
Ovšem je hloupé, když chce být někdo purista a puntičkář, a zamotá break mezi způsoby, jak v C ukončit funkci. Čtenář pak totiž může pochybovat, jestli dotyčný vůbec umí programovat…
Normálního člověka to nenapadne. Normální člověk chápe, že chtěl předat myšlenku. Normální člověk neprudí... oh wait!

TomBA

Re:Jak můžu opustit funkci
« Odpověď #13 kdy: 12. 07. 2018, 22:16:24 »
"Jak můžu opustit funkci?"
Bureš, si to ty?
Optimálne by bolo "v želiezkach"...

Re:Jak můžu opustit funkci
« Odpověď #14 kdy: 12. 07. 2018, 22:35:44 »
Normálního člověka to nenapadne. Normální člověk chápe, že chtěl předat myšlenku. Normální člověk neprudí... oh wait!
Jistěže mi připadalo pravděpodobné, že balki prostě jen prudí. Ale předpokládám u lidí vždy tu lepší variantu, proto jsem se zeptal – co kdyby tam opravdu nějaká myšlenka byla a já jsem jí přehlédl?