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) |
|
jankowalski25 |
» 2017-01-31 11:29:21 glDeleteShader( vert_shader )( frag_shader ); |
auto delete_shaders = make( glDeleteShader );
delete_shaders( vert_shader )( frag_shader ); |
Co zyskujesz stosując drugie podejście zamiast pierwszego? |
|
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ść? |
|
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). |
|
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. |
|
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: #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. |
|
1 « 2 » |