Klassenfrage :)



  • Ich habe mal was dazu geschrieben: 2D Array in C++



  • @EL-europ Dir erklären hier verschiedene Experten, dass dein Kopieren so nicht geht und trotzdem beharrst du dadrauf, das das kein Problem sei.

    Du musst deine Matrix zeilenweise kopieren, sonst wird das nix.

    irgendwie sowas

        for (int x = 0; x < xres; x++) {
          memcpy(matrix[x], thr_matrix[x], yres * sizeof(int));
        }
    

    Aber, es geht ja um C++, da macht man das alles nicht:

    int main() {
      int xres = 10;
      int yres = 10;
      for (int count = 0; count < 1000; count++) {
        std::vector<std::vector<int>> thr_matrix(xres);
        for(auto& v : thr_matrix)
        {
          v.resize(yres);
        }
    
        int z = 0;
        for (int x = 0; x < xres; x++) {
          for (int y = 0; y < yres; y++) {
            thr_matrix[x][y] = z++;
          }
        }
        auto matrix = thr_matrix;
        for (int x = 0; x < xres; x++) {
          for (int y = 0; y < yres; y++) {
            if (matrix[x][y] != thr_matrix[x][y]) {
              printf("matrix[x][y]=%d, thr_matrix[x][y]=%d\n", matrix[x][y], thr_matrix[x][y]);
              printf("count %d\n", count);
            }
          }
        }
      }
    }
    

    Ist viel einfacher, man kann viel weniger Fehler machen und es gibt auch keine Performance Probleme. Noch schöner wird es, wenn man den Artikel von @DocShoe berücksichtigt und 2 D richtig macht.



  • @Th69
    Der speicher wird ja aber erst wieder vor einer neuberechnung, wenn die Werte nicht mehr gebraucht werden, freigegeben; zuvor bleibt er doch erhalten? so das die Zeiger auf die richtigen Werte zeigen



  • Nein! Mit dem memcpy überschreibst du die mittels

    matrix[i] = (int*)malloc(yres * sizeof(int));
    

    erstellten Werte (und bei einer, hier noch fehlenden, Freigabe würdest du dann einen Laufzeitfehler, sog. "double free", erhalten).

    @Schlangenmensch hat dir ja jetzt schon die Lösung verraten, aber eigentlich hätte schon bei deinem C -Code

    thr_matrix = matrix;
    

    vollkommen ausgereicht (denn auf das ganze Speicherallozieren und Kopieren kann man verzichten, da die Threads ja direkt den Matrix-Speicher beschreiben können - dein Code wartet ja explizit mit dem pthread_join auf die Abarbeitung aller Threads)...



  • @Th69
    ich denke mit
    matrix[i] = (int*)malloc(yres * sizeof(int));
    alloziere ich nur den speicher, und memcpy schreibt mit die neuen Zeiger in das array. Die doppelte Speicherverwaltung ist mir bewusst, das ist der Preis für Thread-Funktion



  • @Th69 sagte in Klassenfrage 🙂:

    Nein! Mit dem memcpy überschreibst du die mittels

    matrix[i] = (int*)malloc(yres * sizeof(int));
    

    erstellten Werte (und bei einer, hier noch fehlenden, Freigabe würdest du dann einen Laufzeitfehler, sog. "double free", erhalten).

    ..
    thr_matrix = matrix;

    vollkommen ausgereicht (denn auf das ganze Speicherallozieren und Kopieren kann man verzichten, da die Threads ja direkt den Matrix-Speicher beschreiben können - dein Code wartet ja explizit mit dem `pthread_join` auf die Abarbeitung aller Threads)...
    

    Das hab ich noch gar nicht ausprobiert! geht das ?



  • LOL 🙂



  • @EL-europ
    Jetzt sind auch keine Abbrüche mehr mit den Sanitizern, aber Meldungen nach Programmende.



  • @Th69
    Oje, jetzt hab ich mir selbst geantwortet 🙂
    Ich pushe git jetzt mal, die Apple->calc sollte soweit funzen?
    die rohen c-array one-, ten- und iter- Member werd ich mal in std::vector versuchen, vielleicht gehen dann noch sanitizer Meldungen weg. Da scheint mir in Apple->sort() auch nicht was ganz sauber zu sein.



  • Dieser Beitrag wurde gelöscht!


  • @EL-europ sagte in Klassenfrage 🙂:

    Das hab ich noch gar nicht ausprobiert! geht das ?

    Du musst nur beachten, dass du ausschließlich den Pointer kopierst. D.h, du hast dann zwei Pointer die auf den selben Speicherbereich zeigen



  • Ich hab die unnötoge Speicherallocierung für **matrix und **colormatrix erkannt und die Sanitizermeldungen dieser arrays weg bekommen🙃 Jetzt hab ich noch welche durch **iterMembers in Apple->sort(). Könnt ihr mir bitte helfen die noch weg zu bekommen?