Coroutines – cod ce pare a sfida logica
Last Updated: Nov 11 2017 13:22, Started by
dani.user
, Nov 11 2017 11:05
·
0
#1
Posted 11 November 2017 - 11:05
Recent dorea cineva sa populeze o matrice cu numere prime: https://forum.softpe...-in-codul-asta/ (ignoram detaliul ca le si ridica la puterea a 3-a)
A rezultat urmatorul cod: for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) { if (prim(z)) a[i][j] = z * z * z; else { while (!prim(z)) z++; a[i][j] = z * z * z; } z++; } Codul, foarte reprezentativ pentru genul de cod scris de elevi/studenti vine cu o sumedenie de probleme:
Exista vreun mod de a curata codul, a separa popularea matricii de iterarea prin numere prime si a imbunatatii si performanta? Exista o metoda, ce, suprinzator, poate conduce si la mai putin cod. #include <iostream> #include <vector> #include <boost/coroutine2/coroutine.hpp> using namespace boost::coroutines2; coroutine<unsigned int>::pull_type genereazaNumerePrime([&](coroutine<unsigned int>::push_type& ofera) { ofera(2); std::vector<unsigned int> valoriDejaGasite;//nu-l includem si pe 2 deoarece iteram doar prin numere impare for (unsigned int i = 3; ; i += 2) { bool eNumarPrim = true; for (auto numarPrim : valoriDejaGasite) { if ((i % numarPrim) == 0) { eNumarPrim = false; break; } } if (eNumarPrim) { valoriDejaGasite.push_back(i); ofera(i); } } }); int main() { unsigned int matrice[10][10]; auto generator = begin(genereazaNumerePrime); for (unsigned int y = 0; y < 10; ++y) { for (unsigned int x = 0; x < 10; ++x, ++generator) { matrice[y][x] = *generator; } } //afisare matrice... } Quote Pai vad un loop infinit in acel for (unsigned int i = 3; ; i += 2)Se mai termina codul asta de executat? Surprinzator: da. Untitled.png 25.35K 38 downloads Pe scurt, coroutines permit transferul executiei dintr-o parte in alta, cele doua functii ruland cu schimbul
Rezultatul:
Nu e un subiect chiar usor. Cine e curios de mai multe are la dispozitie documentatia: http://www.boost.org...html/index.html Edited by dani.user, 11 November 2017 - 11:26. |
#2
Posted 11 November 2017 - 12:06
Articolul e bine venit.
Cred că cei care ar beneficia cel mai mult de pe urma articolului nu s-ar descurca cu instalarea boost și cu linkerul. În Ubuntu e simplu: apt-get install libboost-all-dev ArchLinux: pacman -S boost Similar și în alte distribuții. Poate un CMakeFiles ar fi o idee bună. |
#3
Posted 11 November 2017 - 12:18
Nu e chiar grea compilarea din sursa a boost (vreo doua comenzi), dar pun diversi builduri gata facute si pentru Windows: https://sourceforge....boost-binaries/ (trebuie aleasa arhiva pentru versiunea de Visual Studio ce urmeaza a fi folosita, ABI-ul nu e compatibil intre versiuni).
Mai departe, pentru proiectul in cauza:
VS 2017 stie lucra si cu CMakeFiles direct. Edited by dani.user, 11 November 2017 - 12:20. |
#4
Posted 11 November 2017 - 13:22
Nu vreau sa crezi ca am vreo intentie sa te atac in vreun fel, vreau sa inteleg de ce in codul tau ai folosit tot for in for. Ce stiu eu despre Coroutines este ca, la un anumit punct, cedeaza executia catre firul principal si dupa asta revin/e in locul unde a/u cedat executia. De asta ai folosit for in for? Pentru ca oricum nu asteapta pana termina primul for? //Edit: M-am grabit, nu am citit cu atentie si din aceasta cauza am inteles ca ai zis ca nu e bine sa folosesti for in for. Dar nu e cazul, tot ce am scris mai sus nu are sens, scuzati. Se poate sterge. Edited by Daniel2222, 11 November 2017 - 13:39. |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users