Anzeige:
Ergebnis 1 bis 3 von 3

Thema: [C++] Mehrdimensionale Felder

  1. #1
    Registrierter Benutzer
    Registriert seit
    04.11.2012
    Beiträge
    23

    [C++] Mehrdimensionale Felder

    Hallo zusammen;

    für eine Hausarbeit muss ich ein Programm in C++ schreiben, allerdings hab ich eigentliche nur Java- und teilweise C-Kenntnisse. Kombiniert mit Google komme ich eigentlich relativ gut klar, aber eine Sache kriege ich einfach nicht hin. Ich benötige für das Programm ein 3-Dimensionales Feld.

    In Java ließe sich das ja ganz einfach realisieren
    Code:
    int[][][] tensor = new int[dim][dim][dim]
    in C++ scheitere ich damit aber leider, lediglich das zweidimensionale Array habe ich bisher geschaft.
    Code:
    double** matrix;
    matrix = new double*[dim];
    for(int i=0 ; i<dim ; i++) {
      matrix[i] = new double[dim];
    }
    Mein Versuch das ganze dann zu übertragen war folgender:
    Code:
    double*** tensor
    tensor = new double**[dim];
    for(int i=0 ; i<dim ; i++) {
      tensor[i] = new double*[dim];
      for(int j=0 ; i<dim ; i++) {
        tensor[i][j] = new double[dim];
      }
    }
    Hierbei erhalte ich aber einen Speicherzugriffsfehler. Kann mir da jemand weiterhelfen?

    Nachtrag: hat sich erledigt, bei der zweiten For-Schleife war ich etwas blöd und hab die laufvariablen durchmischt.
    Geändert von javatar (04-11-2012 um 16:39 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Hat sich zwar schon erledigt, aber ich möchte trotzdem antworten:

    Ich benötige für das Programm ein 3-Dimensionales Feld.
    [...]
    in C++ scheitere ich damit aber leider, lediglich das zweidimensionale Array habe ich bisher geschaft.
    Verständlich, hier kann es zum Problem werden dass in C++ bei deklarierten Arrays nur die erste Dimension von variable Breite sein darf und das auch nur bei mit "new" erzeugten Arrays.

    Anscheinend ist "dim" bei dir eine Konstante, sonst würde der Compiler meckern.

    Mein Versuch das ganze dann zu übertragen war folgender:
    [...]
    Hierbei erhalte ich aber einen Speicherzugriffsfehler.
    Du könntest dir eine kleine Hilfsklasse schreiben, ähnlich dieser hier:
    Code:
    struct vec_3d
    {
      vec_3d(int size_x, int size_y, int size_z)
      : size_x(size_x), size_y(size_y), size_z(size_z), storage(size_x * size_y * size_z) { }
    
      int& get(int x, int y, int z)
      {
        return const_cast<vec_3d&>(*this).get(x, y, z);
      }
    
      int const& get(int x, int y, int z)
      {
        assert(x < size_x); assert(y < size_y); assert(z < size_z);
        return storage.at(x * size_y * size_z + y * size_z + z);
      }
    
      std::vector<int> storage;
    };
    Dann hättest du eine Art mehrdimensionales Array mit rudimentärer Bereichsüberprüfung (d.h. die ist noch nicht ganz vollständig).

    Generell würde ich empfehlen für Hausaufgaben den Compiler so aufzurufen, dass möglichst viele Sicherheitsüberprüfungen vorgenommen werden. Für den GCC z.B. die Optionen -D_GLIBCXX_DEBUG und -fstack-protector-all zu benutzen, wenn möglich. Und zusätlich viele Asserts in den Code einzubauen. Das kann einem die Fehlersuche ggf. erleichtern.

  3. #3
    Registrierter Benutzer
    Registriert seit
    04.11.2012
    Beiträge
    23
    Vielen Dank, deine Hilfklasse erschlägt mich aber im Augenblick noch etwas. Mit den Sicherheitsüberprüfungen hast du natürlich recht, die Optionen vom gcc kannte ich bisher noch gar nicht. Mal schauen, was meine zukünftige "Karriere" mit C++ alles noch für mich bereit hält.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •