Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Skrócone wywołanie funkcji

Ostatnio zmodyfikowano 2017-01-31 16:53
Autor Wiadomość
Saran
Temat założony przez niniejszego użytkownika
» 2017-01-30 20:34:44
Debugger pokazuje na tą linijkę:


#0 ?? ?? ()
#1 0x43e571 G<void (*)(unsigned int)     <-----
f( std::forward < Args >( args )...);

#2 0x401914 Shader::Shader(this=0x28fedc, dir_vert_shader=0x4b0187 <std::piecewise_construct+351> "glsl\basic.vert", dir_frag_shader=0x4b0178 <std::piecewise_construct+336> "glsl\basic.frag")
#3 0x401e3e main()


Kod:
http://wklej.org/hash/cfa65ef16d3/

(shadery niepotrzebne, na razie i tak mam problem z ich wczytywaniem)
P-157141
jankowalski25
» 2017-01-31 11:29:21
glDeleteShader( vert_shader )( frag_shader );
C/C++
auto delete_shaders = make( glDeleteShader );

delete_shaders( vert_shader )( frag_shader );
Co zyskujesz stosując drugie podejście zamiast pierwszego?
P-157156
Saran
Temat założony przez niniejszego użytkownika
» 2017-01-31 11:46:31
No
glDeleteShader( vert_shader )( frag_shader );
 raczej nie jest poprawne.
Normalnie musiałbym pisać
glDeleteShader( vert_shader ); glDeleteShader( frag_shader );


PS. ktoś ten temat do działu "Inne" mógłby przenieść?
P-157159
jankowalski25
» 2017-01-31 15:04:00
To zrób sobie zwykłą dwuargumentową funkcję i później ją wywołuj. Zwłaszcza, jeśli kolejność wywołań ma znaczenie (zgaduję, że to jest przyczyną problemu). Chyba, że chcesz obsługiwać bardziej ogólne przypadki.

PS. ktoś ten temat do działu "Inne" mógłby przenieść?
Ja nie mogę, więc nie przeniosę. Wbrew pozorom ci, którzy wchodzą w "Ostatnio na forum" zamiast na stronę główną forum, prawie wcale się nie przejmują, w jakim dziale jest dany temat (zwłaszcza, jeśli ikonka pozostaje ta sama).
P-157166
Saran
Temat założony przez niniejszego użytkownika
» 2017-01-31 16:21:25
To zrób sobie zwykłą dwuargumentową funkcję i później ją wywołuj. Zwłaszcza, jeśli kolejność wywołań ma znaczenie (zgaduję, że to jest przyczyną problemu). Chyba, że chcesz obsługiwać bardziej ogólne przypadki.
Niee, to byłby przerost formy nad treścią.
No i bardziej ogólne przypadki.
P-157169
michal11
» 2017-01-31 16:53:02
Na początku chciałem użyć std::initializer_list ale ona może trzymać tylko const wartości (a wygląda na to, że ty musisz przesyłać referencje dlatego napisałem coś takiego:

C/C++
#include <iostream>
#include <vector>
#include <functional>

//====================================================================================================================

template < typename T >
using RefVector = std::vector < std::reference_wrapper < T >>;

template < typename T, class Function >
void DeleteShaders( RefVector < T >&& params, Function fun )
{
    for( T & el: params )
    {
        fun( el );
    }
}

void Printer( int id )
{
    std::cout << id << std::endl;
}

//====================================================================================================================
int main()
{
    int a = 1, b = 2, c = 3, d = 4;
   
    DeleteShaders( RefVector < int >( { a, b, c, d } ),[]( int & arg ) { arg *= 10; } );
    DeleteShaders( RefVector < int >( { a, b, c, d } ), Printer );
   
    return 0;
}

w twoim kodzie wykorzystałbym to tak
DeleteShaders( RefVector < GLuint >( { vert_shader, frag_shader } ), glDeleteShader );

masz zachowaną kolejność wywoływania argumentów oraz wszystko w jednej linii.
P-157170
1 « 2 »
Poprzednia strona Strona 2 z 2