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 | 9483 (5108) | drvo |
| » | [Python + pyplot] Scatter plot in barve posameznih točkOddelek: Programiranje | 1290 (1231) | Raptor F16 |
| » | Odpiranje programa v Visual StudioOddelek: Programiranje | 1024 (882) | darkolord |
| » | HTC HD mini, Legend, DesireOddelek: Mobilne tehnologije | 9991 (6874) | LuGi |
| » | Azureus 2.2.0.0 zunajOddelek: Novice / Ostala programska oprema | 4757 (4757) | zile |
