Forum » Programiranje » c++ klicanje določene funkcije glede na zanko?
c++ klicanje določene funkcije glede na zanko?
pizdarija1 ::
Zdravo, imam dva vprašanja.
Ali obstaja kakšen boljši način za zamenjavo vrednosti v celem vektorju.
Kako bi klical funkcijo glede na i v zanki npr showLegendText0, showLegendText1, showLegendText2.
Hvala za odgovore.
Ali obstaja kakšen boljši način za zamenjavo vrednosti v celem vektorju.
Kako bi klical funkcijo glede na i v zanki npr showLegendText0, showLegendText1, showLegendText2.
for(int i=0;i<menuTabRect.size(); i++){ if(menuTab[i]){ for(int i=0;i<menuTabRect.size(); i++){ // vse vrednosti menuTab vektorja na 0 menuTab[i]=0; //menuTab je vektor } menu.showLegend(screen, &tmprect, i+1); menu.showLegendText0(screen,tmprect); // showLegendText+i ? break; } }
Hvala za odgovore.
W3by ::
Za določitev enakih vrednosti uporabi operator assign: http://www.cplusplus.com/reference/stl/...
Funkcijo showLegendText moraš predelati tako, da boš 'i' podajal kot parameter - showLegendText(i, screen, tmprect).
Funkcijo showLegendText moraš predelati tako, da boš 'i' podajal kot parameter - showLegendText(i, screen, tmprect).
joze67 ::
#include<iostream.h> void showLegend0(int i) { cout << "showLegend0(" << i <<")\n"; } void showLegend1(int i) { cout << "showLegend1(" << i <<")\n"; } void showLegend2(int i) { cout << "showLegend2(" << i <<")\n"; } int main() { void (*f[3])(int) = { showLegend0, showLegend1, showLegend2 }; for(int i=0; i<3; i++) f[i](2*i+1); return 0; }
mallard ::
Glede vektorjev:
Glede funkcij, poleg tega kar ti je joze67 pokazal, pa (če ti prevajalnik podpira C++11):
Kaj točno je namen tvoje kode, mi pa ni uspelo dešifrirat :) lp
#include <vector> #include <algorithm> #include <ctime> #include <cstdlib> int main() { std::vector<int> v(5); // {0, 0, 0, 0, 0} std::fill(v.begin(), v.end(), 42); // {42, 42, 42, 42, 42} std::fill_n(v.begin() + 1, 3, 99); // {42, 99, 99, 99, 42} srand(time(0)); std::generate(v.begin(), v.end(), rand); // {?, ?, ?, ?, ?} v.assign(3, 0); // {0, 0, 0} }
Glede funkcij, poleg tega kar ti je joze67 pokazal, pa (če ti prevajalnik podpira C++11):
#include <array> #include <functional> #include <iostream> int main() { std::array<std::function<void(int)>, 3> showLegend_arr = {{ [](int i) { std::cout << i << '\n'; }, [](int i) { std::cout << i << '\n'; }, [](int i) { std::cout << i << '\n'; } }}; for (size_t i = 0; i <showLegend_arr.size(); ++i) { std::cout << "showLegend_arr[" << i << "] "; showLegend_arr[i](2*i + 1); } }
Kaj točno je namen tvoje kode, mi pa ni uspelo dešifrirat :) lp
pizdarija1 ::
Mi podpera. Ne štekam pa lih najbolj komenteran del, prvič vidim.
Težko boš dešifreru =) tle za vprašanja mal skrajšam kodo da ne pride preveč vrstic. Drgač pa delam game editor probavam narest lepšo kodo, zgornja koda naredi takle meni . Ko kliknem recmo na legend vse vrednosti tabov nastavi na 0 razen odprtega tko da je lahko samo en odprt. Funkcija pa piše spodaj tekst, slikce .. vsak bo unikat, zato bi rad da je vsaka fukcija posamezna.
#include<iostream.h> void showLegend0(int i) { cout << "showLegend0(" << i <<")\n"; } void showLegend1(int i) { cout << "showLegend1(" << i <<")\n"; } void showLegend2(int i) { cout << "showLegend2(" << i <<")\n"; } int main() { void (*f[3])(int) = { showLegend0, showLegend1, showLegend2 }; // tale vrstica for(int i=0; i<3; i++) f[i](2*i+1); return 0; }
#include <array> #include <functional> #include <iostream> int main() { std::array<std::function<void(int)>, 3> showLegend_arr = {{//std::function<void(int)> [](int i) { std::cout << i << '\n'; },// [] ? [](int i) { std::cout << i << '\n'; }, [](int i) { std::cout << i << '\n'; } }}; for (size_t i = 0; i <showLegend_arr.size(); ++i) {// size_t ? si ga uporabil ker je tip unsigned int al je še kakšen drug razlog? std::cout << "showLegend_arr[" << i << "] "; showLegend_arr[i](2*i + 1); } }
Težko boš dešifreru =) tle za vprašanja mal skrajšam kodo da ne pride preveč vrstic. Drgač pa delam game editor probavam narest lepšo kodo, zgornja koda naredi takle meni . Ko kliknem recmo na legend vse vrednosti tabov nastavi na 0 razen odprtega tko da je lahko samo en odprt. Funkcija pa piše spodaj tekst, slikce .. vsak bo unikat, zato bi rad da je vsaka fukcija posamezna.
Zgodovina sprememb…
- spremenil: pizdarija1 ()
mallard ::
void (*f[3])(int) = { showLegend0, showLegend1, showLegend2 }; // tale vrstica
Polje treh kazalcev na funkcijo, ki vzame int parameter in vrne void. Deklaracijo bereš od identifierja (f) v spirali navzven, v smeri urinega kazalca:
void (*f[3])(int) ^ f je void (*f[3])(int) ^ polje (z velikostjo 3) void (*f[3])(int) ^ kazalcev void (*f[3])(int) ^-----^ na funkcijo void (*f[3])(int) ^ ki vzame en parameter tipa int void (*f[3])(int) ^ in vrne void // Z uporabo typedef-a lahko malo poenostaviš: typedef void(*ptr)(int); ptr f[3] = { showLegend0, showLegend1, showLegend2 };
std::array<std::function<void(int)>, 3> showLegend_arr = {{ //std::function<void(int)> [](int i) { std::cout << i << '\n'; }, // [] ? [](int i) { std::cout << i << '\n'; }, [](int i) { std::cout << i << '\n'; } }};
std::function je šablonski razred, ki ti malo poenostavi delo s tistimi grdimi kazalci na funkcije. Tisto z oglatimi oklepaji so pa lambda funkcije. Zgornji dve deklaraciji sta, kar se uporabe tiče, praktično enaki. Namesto lambd bi polje lahko inicializiral enako kot zgoraj:
std::function<void(int)>[3] = {showLegend0, showLegend1, showLegend2};
for (size_t i = 0; i <showLegend_arr.size(); ++i) {// size_t ? si ga uporabil ker je tip unsigned int al je še kakšen drug razlog?
Da prevajalnik ne sika "comparison between signed and unsigned".
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Stand up comedy (strani: 1 2 )Oddelek: Sedem umetnosti | 8605 (4230) | drvo |
» | [Python + pyplot] Scatter plot in barve posameznih točkOddelek: Programiranje | 1062 (1003) | Raptor F16 |
» | Odpiranje programa v Visual StudioOddelek: Programiranje | 912 (770) | darkolord |
» | HTC HD mini, Legend, DesireOddelek: Mobilne tehnologije | 9513 (6396) | LuGi |
» | Azureus 2.2.0.0 zunajOddelek: Novice / Ostala programska oprema | 4555 (4555) | zile |