2016-09-25 2 views
-1

I template Funktion definieren folgenden, die auf jedem Element eines ArraysEine Template-Funktion abstürzt

template <typename X, typename Y, size_t n>  
array <Y, n> lod (const function <Y (const X)> f, const array <X, n> w) 
{ 
    array <Y, n> l; 
    for (GLint i = 0; i = i + 1; i < n) 
     l [i] = f (w [i]); 
    return l; 
} 

Als Beispiel f eine Funktion f gilt, definiere ich eine Funktion

template <typename X> 
function <X (const X)> ae (const X a) 
{ 
    return [a] (const X x) 
    { 
     return x + a; 
    }; 
} 
„ein In“

Dann versuche ich es

const array <ivec3, 12> oblad = {ivec3 (0, 2, 1), ivec3 (0, 3, 2), ivec3 (0, 1, 5), ivec3 (0, 5, 4), 
           ivec3 (1, 2, 6), ivec3 (1, 6, 5), ivec3 (2, 3, 7), ivec3 (2, 7, 6), 
           ivec3 (3, 0, 4), ivec3 (3, 4, 7), ivec3 (4, 5, 6), ivec3 (4, 6, 7)}; 

array <ivec3, 12> w = lod (ae (ivec3 (1)), oblad); 

Das Programm kompiliert ganz gut, jedoch gelten bei der Ausführung abstürzt.

+0

Ihre Schleife schreibt außerhalb der Grenzen des Arrays, einmal 'I' 'n' erreicht. Wahrscheinlich meintest du 'für (GLint i = 0; i

+0

So funktionieren Loops nicht. Bitte konsultieren Sie irgendein elementares Lehrbuch zu C++. –

+1

Abstimmung als Tippfehler zu schließen (vermasselt die for-Schleife Zustand Reihenfolge) –

Antwort

0

Abgesehen von der Tatsache, dass Sie Arrays um nach Wert, der Grund für den Absturz sind vorbei ist einfach:

for (GLint i = 0; i = i + 1; i < n) 

Diese

for (GLint i = 0; i < n; i = i + 1) 

Ihre Version der Schleife auf bedingt ist sein sollte i = i + 1, die für alle Werte von i, die nicht Wrap-around zu 0 true zurück, wenn 1. Am Ende jeder Schleife Zugabe wurde das Sie Durchführung des Tests i < n aber das Ergebnis ignoriert.

- Bearbeiten -

Nach the standard Die Syntax für eine for-Schleife ist:

for (init-statement conditionopt ; expressionopt) statement 

conditionopt für die bedingte am Beginn jeder Iteration der Schleife, getestet ist expressionopt ist ein optionaler Ausdruck, der bei Ende jeder Iteration ausgeführt wird.

+0

geliebt hätte, Ihren Code zu bearbeiten, aber ich kann nicht, da es nur eine ‚;‘ in Ihrem bearbeiten fehlt :( – Zouch

+0

@Zouch Das war und eine Kopie von dem Standard-Paste: https://1drv.ms/i/s!AoIctv5uIJy5hLM8nJIEjuQHOu_fgQ – kfsone

+0

Rolled zurück - der Standard ist tatsächlich korrekt ist (wenig überraschend), die Definition von * für -init-Anweisung * beinhaltet, dass es in einem Semikolon endet –