Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » goto-Ersatz

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.08.2007, 12:31 Uhr
banshee




C++:
for(i = 1; i <= *VectorCount; i++)
    {
        for(j = 1; j <= copied; j++)
        {
            if(glmEqual(&vectors[3 * i], &copies[3 * j], epsilon))
                goto duplicate;
        }
        
        copies[3 * copied + 0] = vectors[3 * i + 0];
        copies[3 * copied + 1] = vectors[3 * i + 1];
        copies[3 * copied + 2] = vectors[3 * i + 2];
        
        j = copied++;
        
duplicate:

        vectors[3 * i + 0] = (GLfloat)j;
    }


Hat jemand eine Idee, wie man dieses Beispiel elegant in eine Version ohne goto umschreiben kann? Mit break komme ich ja nur aus der inneren Schleife raus. In Java gibts dafür auch goto-artige Sprungmarken, aber das gilt ja in cpp als schlechter Stil
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.08.2007, 13:12 Uhr
Kest
saint


Hi!

Auf Anhieb fällt mir so was ein:

C++:
bool st;
    for(i = 1; i <= *VectorCount; i++){
          
        for(st=true, j = 1; j <= copied; j++)
            if(glmEqual(&vectors[3 * i], &copies[3 * j], epsilon)){
                                   vectors[3 * i + 0] = (GLfloat)j;
                                   st=false;
                                   break;
                                   }
                
        
        if(st){
               copies[3 * copied + 0] = vectors[3 * i + 0];
               copies[3 * copied + 1] = vectors[3 * i + 1];
               copies[3 * copied + 2] = vectors[3 * i + 2];
               j = copied++;
               vectors[3 * i + 0] = (GLfloat)j;
               }
    }

--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 13.08.2007 um 13:16 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.08.2007, 13:19 Uhr
0xdeadbeef
Gott
(Operator)


Das ist auch in Java schlechter Stil. Ich würd das gleich refaktorisieren:

C++:
typedef double *vector;
std::size_t const vector_length = 3;

bool is_duplicate(vector vec, vector *copies, std::size_t copies_n) {
  for(std::size_t i = 0; i < n; ++i) {
    if(std::equal(vec, vec + vector_length, copies[i])) {
      return true;
    }
  }
  return false;
}

// ...

for(i = 0; i < *VectorCount; ++i) { // Array-Indices in C++ 0-basiert
  if(!is_duplicate(&vectors[i * vector_length], copies, copied)) {
    std::copy(&vectors[i *  vector_length     ],
              &vectors[i * (vector_length + 1)],
              &copies [copied * vector_length]);
    ++copied;
  }
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 13.08.2007 um 13:20 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.08.2007, 14:00 Uhr
banshee



okay, beides schöne Lösungen

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: