» »

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.

		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).

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;
}  

darkkk ::

Tko nekako ja, pointer na funkcijo je kar hočeš :)
(menda se temu reče delegat)

mallard ::

Glede vektorjev:
#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.

#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…

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Stand up comedy (strani: 1 2 )

Oddelek: Sedem umetnosti
618605 (4230) drvo
»

[Python + pyplot] Scatter plot in barve posameznih točk

Oddelek: Programiranje
71062 (1003) Raptor F16
»

Odpiranje programa v Visual Studio

Oddelek: Programiranje
8912 (770) darkolord
»

HTC HD mini, Legend, Desire

Oddelek: Mobilne tehnologije
459513 (6396) LuGi
»

Azureus 2.2.0.0 zunaj

Oddelek: Novice / Ostala programska oprema
294555 (4555) zile

Več podobnih tem