Dynamisches Array der besonderen Art



  • Hallo.
    Folgender Code:

    #include "stdafx.h"
    #include "dib.h"
    #include "dib_dll.h"
    
    HANDLE CDIB::Modify1DIB()
    {
      LPBITMAPINFOHEADER lpBIalt;       // Zeiger auf DIB-Eigenschaften
      LPBITMAPINFOHEADER lpBIneu;       // Zeiger auf DIB-Eigenschaften
      LPBITMAPINFO       lpBMIalt;      // Zeiger auf DIB-Informationsblock
      LPBITMAPINFO       lpBMIneu;      // Zeiger auf DIB-Informationsblock
      BYTE huge         *lpBitsalt;     // Zeiger auf Bilddaten der DIB
      BYTE huge         *lpBitsneu;     // Zeiger auf Bilddaten der DIB
      HANDLE             hGrayDIB;      // Handle der Gray-DIB
      HANDLE             hModifyDIB;    // Handle der Modify-DIB
      DWORD              dwWidth;       // Breite der DIB
      DWORD              dwHeight;      // Höhe der DIB
      DWORD              dwX, dwY;      // Zähler für X- und Y-Schleife
      BYTE               cGray;         // Grauwert (8 Bit)
    
      try
        {
         if (m_hDIB)
    
         hGrayDIB = ::GrayDIB(m_hDIB);  // Graustufentransformation durchführen und DIB übergeben
         lpBMIalt = (LPBITMAPINFO) GlobalLock(hGrayDIB);
         lpBIalt  = (LPBITMAPINFOHEADER) lpBMIalt;
         hModifyDIB = ::CopyDIB(hGrayDIB);  // DIB kopieren
         lpBMIneu   = (LPBITMAPINFO) GlobalLock(hModifyDIB);
         lpBIneu    = (LPBITMAPINFOHEADER) lpBMIneu;
    
         // Bildbreite und -heohe bestimmen
         dwWidth  = lpBIneu->biWidth;
         dwHeight = lpBIneu->biHeight;
    
         // Bilddaten manipulieren
         lpBitsalt  = GetDIBBits(lpBIalt);
         lpBitsneu  = GetDIBBits(lpBIneu);
    
         int array[256];
         int i,j;
    
         BYTE **zweid_array = new  BYTE * [dwWidth];    // Zeilen
         BYTE **zweidneu_array = new BYTE* [dwWidth]; //Zeilen  
    
         for (i=0;i<dwWidth;++i)
             {  
                      zweid_array[i] = new int [dwHeight];    //Spalten
              zweidneu_array[i] = new int [dwHeight]; //Spalten
    
                 };
    

    Also nicht wundern, die Funktion geht noch weiter, aber das ist nicht weiter relevant. Es geht um die dynamische Anlegung der beiden zweidimensionalen Arrays. Hab da schon alles durchgetestet mit Cast und so, aber nix geht. Habt ihr ne Idee?
    Danke, wäre nett wenn ihr mal ein Auge draufwerfen könntet.



  • hi!

    weiß nicht ob dir das weiterhelfen wird aber vielleicht doch:

    BYTE *zweid_array = new BYTE [dwWidth*dwHeight];    //Zeilen+Spalten
         BYTE *zweidneu_array = new BYTE [dwWidth*dwHeight]; //Zeilen+Spalten
    
         for (i=0;i<dwWidth;i++)
            for (j=0;j<dwWidth;j++)
               {
                   zweid_array[j+i*dwWidth]= //array füllen
                   zweid_array[j+i*dwWidth]= //array füllen
               }
    

    wolltest du soetwas in der art?
    array löschen nicht vergessen!

    gruß

    jemand



  • uups... tippfehler entdeckt...

    bei der inneren äußeren schleife handelt es
    sich natürlich um ein dwHeight.

    mfg

    jemand



  • Wie wärs mit einer verketteten Liste?



  • Hallo.
    Also die zwei Arrays sollten zweidimensional sein. Ich komme bloss irgendwie mit den Datentypen nicht zurecht. Ich meine, es wäre sinnvoll als Felanzahl in der eckigen Klammer nur ein int anzugeben, da int nur ganzzahlig ist.



  • Also. Ich hab es jetzt erstmal hinbekommen, das die Arrays angelegt werden. Das läuft auch soweit alles. Wenn ich allerdings zum Schluss delete einfüge, dann spuckt der Compiler Fehler aus....
    Hab jetzt delete ausgelassen, ist ja aber nicht sauber.... woran könnte das denn liegen? 😕



  • Die Datentypen stimmen nicht.
    Wenn du bYTE ptr hast, solltest du auch Bytes erzeugen also nicht new int [x],
    sondern new BYTE [x]



  • Also die zwei Arrays sollten zweidimensional sein.

    Ähm, warum?

    Um ein dynamisches 2dimensionales Array zu erstellen, musst Du mindestens
    min( dwHeight, dwWidth)+1 Arrays mit new erstellen und auch wieder löschen.
    Beim Vorschlag von 'jemand' muss new bzw. delete nur 1x aufgerufen werden. Und die Zugriffsgeschwindigkeit ist nicht langsamer!

    Wenn Du unbedingt mit Array-Operatoren arbeiten willst, empfehle ich std::vector

    d.h.

    using namespace std;
    typdef vector< vector<BYTE> > Dim2Array;
    Dim2Array myArray;
    myArray.resize( dwHeight);
    for( Dim2Array::iterator it=myArray.begin(); it!=myArray.end(); it++)
      it->resize( dwWidth);
    
    // Und schon kann man drauf zugreifen ...
    myArray[0][0] = 5;
    

Anmelden zum Antworten