2016-03-21 5 views
1

Ich versuche, den angezeigten Code zu kompilieren und ich bin immer: range-based-for-Schleifen sind nicht in C++ erlaubt 98-ModusBereich Basis für Schleifen und Vektoren in C++ 98

int max_even = timer_table[0]; 
int max_odd = timer_table[1]; 
bool even = true; 
for(int v : timer_table) 
{ 
    if(even) { 
    if(v > max_even) 
     max_even = v; 
    } else { 
    if(v > max_odd) 
     max_odd = v; 
    } 
    even = ! even; 
} 

std::cout << "max even " << max_even << " max odd " << max_odd << std::endl; 

Irgendeine Möglichkeit, es auf c++98 zu kompilieren?

+4

Sie in der Regel nicht C++ Standards verwenden können neuere als der Compiler unterstützt. Wenn Sie den C++ 98-Standard * verwenden müssen, schreiben Sie C++ 98-Standardcode. – crashmstr

+2

Ändern Sie die Schleife in eine reguläre Iteratorschleife. – NathanOliver

+2

Wenn Sie z. [this range-for-reference] (http://en.cppreference.com/w/cpp/language/range-for) Sie sehen das Äquivalent mit non-range-for. –

Antwort

1

Erste Annäherung ist es, es durch reguläre for Schleife zu ersetzen. Für genauere Antwort müssen wir wissen, wie timer_table deklariert ist oder wo wir seine Größe bekommen können.

int max_even = timer_table[0]; 
int max_odd = timer_table[1]; 
bool even = true; 
int timer_table_size = sizeof(timer_table)/sizeof(timer_table[0]); 
for(int i = 0, v = timer_table[0]; i < timer_table_size; ++i, v = (i<timer_table_size)?timer_table[i]:0) 
{ 
    if(even) { 
    if(v > max_even) 
     max_even = v; 
    } else { 
    if(v > max_odd) 
     max_odd = v; 
    } 
    even = ! even; 
} 

std::cout << "max even " << max_even << " max odd " << max_odd << std::endl; 
+1

Dies ist nicht dasselbe wie die Schleife des OPs. 'v' sollte jedes Element von' timer_table' sein. – NathanOliver

+0

Oh, ich verstehe. Ich werde es beheben – user2807083

1

Um den Code Arbeit in C++ 98, sollten Sie den Iterator Ansatz verwenden:

for(std::vector<int>::iterator i = timer_table.begin(); i != timer_table.end(); ++i) 
{ 
    int v = *i; 
    ... 

Oder wenn es ein einfaches Array ist:

for(int *i = timer_table; i < sizeof(timer_table)/(sizeof(timer_table[0]); ++i) 
{ 
    int v = *i; 
    ... 
+0

Woher weißt du, dass "timer_table" ein Vektor ist? – NathanOliver

+0

Man tut es nicht. Aber die anderen Antworten gehen davon aus, dass es sich um ein einfaches Array handelt. Woher weiß man das? – owacoder

+0

Oder Sie könnten Ihre eigenen Funktionen beginnen und nicht annehmen, sondern dem OP eine Antwort geben, die in beiden Fällen funktioniert. – NathanOliver

2

Nehmen wir an, Array timer_table hat N Elemente.

In diesem Fall können Sie

int max_even = timer_table[0]; 
int max_odd = timer_table[1]; 
bool even = true; 

for(const int *p = timer_table + 2; p != timer_table + N; ++p) 
{ 
    if(even) { 
    if(max_even < *p) 
     max_even = *p; 
    } else { 
    if(max_odd < *p) 
     max_odd = *p; 
    } 
    even = !even; 
} 

std::cout << "max even " << max_even << " max odd " << max_odd << std::endl; 

In der Tat schreiben Sie jede Art von Schleife verwenden können, die alle Elemente des Arrays zu durchqueren können. :)

3

Sieht aus wie der Compiler in zu kompilieren versucht C++98, die standardmäßig keine bereichsbasierten for-Schleifen unterstützt (siehe unten den Kommentar von el.pescado). Sie haben zwei Möglichkeiten:

  1. Stellen Sie Ihren Compiler C++ 11
  2. Verwenden Sie einen einfachen wie so für Schleife verwenden:

    int max_even = timer_table[0]; 
    int max_odd = timer_table[1]; 
    bool even = true; 
    for(int i = 2 ; i < table_length; i++) 
    { 
        if(even) { 
         if(timer_table[i] > max_even) 
         max_even = timer_table[i]; 
        } else { 
         if(timer_table[i] > max_odd) 
         max_odd = timer_table[i]; 
        } 
        even = ! even; 
    } 
    
    std::cout << "max even " << max_even << " max odd " << max_odd << std::endl; 
    
+0

Dies ist die beste Antwort. Wenn der Compiler sagt, dass "bereichsbasierte-for-Schleifen im C++ 98-Modus nicht erlaubt sind", bedeutet dies, dass er dies unterstützt, aber nicht in der Standardkonfiguration. Die Lösung besteht also darin, es so zu konfigurieren, dass C++ 11-Funktionen aktiviert werden. Wenn der Compiler C++ 11 nicht unterstützt, würde er einen allgemeinen Syntaxfehler ausgeben. Das Umschreiben dieser Schleife in C++ 98 macht den Code schlechter, nicht besser. –

+0

Danke für die Präzision! Ich werde meine Antwort aktualisieren. Was meinst du mit "Umschreiben dieser Schleife in C++ 98 macht Code schlechter, nicht besser"? – ShadowMitia

+0

Bereichsbezogene Schleifen sind viel prägnanter und einfacher zu lesen. Weniger verbaler Code ⇒ besserer Code. Das ist aber meine persönliche Meinung. –

Verwandte Themen