Verstehe gerade wieder nichts...



  • Hallo,

    da mir hier in der Vergangenheit sehr viel geholfen wurde, hoffe ich wieder,
    dass nette Menschen mir hier weiterhelfen. Mein Anliegen ist folgendes:

    Ich habe eine Reihe von 3D Punkten, die ich im Array vertex *v speichere.
    Was ich dann anschliessend mache; ich nehme zwei bestimmte Punkte und
    berechne den Mittelpunkt mit der Funktion new_v. Danach moechte ich mit der
    Funktion add_v gucken, ob dieser neuer Punkt schon im Array v enthalten ist.
    Wenn nein, dann fuege es zu und muss wissen, welchen Arrayindex es hat.
    Wenn ja, dann moechte ich nur wissen, welcher Arrayindex es hat.

    Genau mit dieser Funktion (add_v) habe ich so meine schwierigkeiten). Der
    return-Wert der Funktion soll der Arrayindex sein (ich muss es so haben).
    Gleichzeitig soll die Funktion add_v, wenn der Punkt noch nicht in der Liste
    ist, diesen hinzufuegen und die Variable v_length um eins vergroessern.

    Genau da habe ich meine Schwierigkeiten; ich moechte nicht gerne v und v_length
    als externe bzw. globale variablen definieren.

    Ich hatte mal gelesen, dass es in C auch moeglich ist in einer Funktion mehere
    Parameter bzw. auch Arrays "gleichzeitig" auszugeben.

    Waere euch sehr dankbar, wenn Ihr mir weiterhelfen koenntet.

    typedef struct {
     double x;
     double y;
     double z;
    } vertex;
    
    int
    c_sphere (void)
    {
    
     size_t i = 0, v_length = 12;
    
     int t1, t2, t3;
    
     vertex v1, v2, v3, new_v1, new_v2, new_v3;
    
     vertex *v = (vertex *) malloc(v_length * sizeof(vertex));
     if (v == NULL)
      c_error_exit(E_MEM_ALL_NULL, "c_sphere() -> *v", EXIT_FAILURE);
    
     for (i=0; i<v_length; i++)
      v[i] = geosphere_v(i);
    
      new_v1 = new_v(v1, v2);   t1 = add_v(&v, new_v1, &v_length);
      new_v2 = new_v(v2, v3);   t2 = add_v(&v, new_v2, &v_length);
      new_v3 = new_v(v3, v1);   t3 = add_v(&v, new_v3, &v_length);
    
    }
    
    size_t
    add_v (vertex *v, vertex new_v, size_t *v_length)
    {
    
     size_t i = 0;
    
     int chk = 0, ret = 0;
    
     for (i=0; i<*v_length; i++) {
    
      if ( new_v.x == v[i].x && new_v.y == v[i].y && new_v.z == v[i].z ) {
    
       chk = 1;
       ret = i;
       break;
    
      }
    
     }
    
     if (chk != 1) {
    
      *v[*v_length] = new_v;
      ret = *v_length;
      *v_length += 1;
    
     }
    
     return ret;
    
    }
    

    Beste Gruesse, simsa


  • Mod

    Hast du irgendeine Art von Erfahrung mit objektorientierter Programmierung in C? Selbst mit solchen Techniken wird dein Vorhaben einigermaßen viel Code auf durchaus gehobenem Schwierigkeitsgrad erfordern. Ohne würde ich es gar nicht erst versuchen.
    Bist du sicher, dass du das wirklich brauchst? Falls ja, dann würde ich ganz dringend empfehlen, dass du dich erst einmal mit den Grundlagen beschäftigst, wie man in C objektorientiert programmiert. Deine Frage nach "mehreren Parametern" für Funktionen und die Lösung mittels globaler Variablen deutet jedoch darauf hin, dass du voraussichtlich mit dem Vorhaben derzeit noch deutlich überfordert sein wirst.



  • Hallo SeppJ,

    ich habe gerade es ganz anderes geloest 😉

    add_v gibt mir nun v, v_length und ret aus.

    Wenn dich der Code interessiert, dann kann ich es hier posten.

    Gruesse, simsa



  • simsa schrieb:

    Genau da habe ich meine Schwierigkeiten; ich moechte nicht gerne v und v_length
    als externe bzw. globale variablen definieren.

    ?
    Das machst du doch auch nicht.
    Trotzdem ist das Design schlecht, weil add_v 2 Aufgaben übernimmt (Suchen+abhängiges Einfügen). Diese Funktionalitäten gehören jeweils genau in eine eigene Funktion.
    Du siehst add_v "von außen" nicht an, was passiert ist (eingefügt oder nicht) => schlecht.

    Dein add_v berücksichtigt auch einen möglichen Index-Überlauf nicht.
    double-Gleichheitsabfragen sind fragil und immer zu vermeiden.


Log in to reply