1d Array als 2d Array casten



  • hallo
    also ich habe folgendes Problem
    ich habe ein 1d Array (bilddaten). Nun ist meine Frage ob ich das Array auch als 2d Array nutzen kann, ohne die Daten zu kopieren. Da ich das Array meistens als 1d Array nutze kann ich es nicht im vorhinein als 2d Array anlegen.

    also im Programm sieht das ungefähr so aus

    #define imgWidth 5
    #define imgHeight 3
    
    //bild array anlegen
    int *img1dP=new int[imgWidth*imgHeight];
    
    //daten aus einem buffer kopieren
    memcpy(img1dP,buffer,imgWidth*imgHeight);
    
    //als beispiel zeile 3 spalte 3 in 4 ändern
    img1dP[2*imgWidth+2]=4;
    
    //jetzt würd ich gerne sowas änliches haben
    //aber so funktionierts natürlich noch nich
    int img2dP[imgHeight][imgWidth]=img1dP;
    

    dankeschön


  • Mod

    Zeile 11 ist doch schon die Lösung. Pack dir das doch in eine passende Funktion.

    Oder wenn du es unbedingt umcasten musst: Ja, das geht auch. Ungetestet:

    int array1d[12];
    int (array2d*)[3][4] = array1d;
    

    Das geht natürlich nur, wenn die Abmessungen der Dimensionen zur Compilezeit feststehen.



  • das klappt bei mir nich dann krieg ich ein
    Multiple markers at this line
    - expected ‘;’ before ‘int’
    - ‘array2d’ was not declared in this scope
    - expected primary-expression before ‘int’
    - Syntax error.

    int main(){
     	int array1d[12];
    	int (array2d*)[3][4] = array1d;
    

  • Mod

    Nur ein kleiner Schreibfehler (so etwas solltest du aber eigentlich selbstständig berichtigen können, wenn du so etwas wie hier machst):

    int (*array2d)[3][4] = array1d;
    


  • ja eigentlich schon aber ich dachte das sei jetzt ein trick oder so 😉

    int array1d[12];
    int (*array2d)[3][4] = array1d;
    

    Leider krieg ich nun ein

    cannot convert ‘int*’ to ‘int (*)[3][4]’ in initialization

    p.s.
    ach so nur zu deinem Kommentar warum ich den Cast machen will
    weil zeile 11 immer mit ner Multiplikation und ner Addition verbunden ist und ich das optimieren wollte. Eine andere möglichkeit wäre so eine art Mapping. Also das ich mir vorher ein Array mit den indexen erstelle.

    uint32_t k=0;
    const int index[rowSize][columSize];
    for(int i...<rowSize...)
    for(int j...<columSize...)
    index[i][j]=k;
    k++;
    }}
    array1d[index[2][2]]=4;
    


  • Darauf habe ich ja nur gewartet...das new im ersten Listing ließ mich schon stutzen.
    Programmierst Du C oder C++?

    Bei C++ würdest Du es wohl komplett anders lösen, mit C sollte es jetzt aber kompilieren - evtl. musst Du Deine Compilereinstellungen dahingehend ändern.


  • Mod

    Ein paar Kommentare:

    Allgemein zum Vorhaben:

    ach so nur zu deinem Kommentar warum ich den Cast machen will
    weil zeile 11 immer mit ner Multiplikation und ner Addition verbunden ist und ich das optimieren wollte.

    Das ist es nach dem Cast auch. Der Compiler kann nicht zaubern. Er erzeugt bloß den entsprechenden Code für die Multiplikation und Addition automatisch, wenn er gesagt bekommt, welche Werte er für die Feldgrenzen annehmen soll.

    Zur Sprache:
    Furble Wurble hat ja schon was gesagt. Deine Fehlermeldung würdest du bekommen, wenn du einen C++-Compiler benutzt, da in C++ strengere Regeln zur Umwandlung von Pointertypen gelten, in C++ müsstest du nämlich explizit casten (hier ist ja nirgendwo ein Cast). Auch das new aus deinem ersten Beitrag ist C++. C und C++ sind zwei verschiedene Sprachen, manchmal wird C++ mit C verwechselt, da man in C++ auch etwas machen kann (aber nicht sollte), was so ähnlich wie C aussieht.
    Du willst C machen:
    Dann benutzt du anscheinend sowohl einen C++-Compiler als auch eine sehr schlechte Quelle zum Lernen. Die meisten C++-Compiler sprechen auch C, man muss nur die richtigen Einstellungen wählen. Du solltest keinen C++-Compiler für C benutzen, denn wie du siehst, sind die Sprachen nicht kompatibel.
    Dein new stammt wohl aus einer Quelle für C++ (wobei man new in C++ eigentlich nie benutzt). Sei sicher, dass du wirklich C lernst. Kaum etwas ist schlimmer als ein Sprachmischmasch. Siehe die als wichtig markierten Threads hier im Forum zu Lehrbüchern und interessanten Links. Vergiss besser das meiste, was du aus deiner C++-Quelle gelernt hast.

    Du willst C++ machen:
    Dann hättest du voll daneben gegriffen mit deinem Lehrbuch. Dein C++ sieht aus wie C, das wenige, was davon C++ ist, ist zudem noch ungewöhnlich (das new sieht man in C++ fast nie und wenn doch, dann niemals so wie hier). In C++ würde man das ganze Thema ganz anders angehen. Stell sicher, dass du ein gutes C++ Lehrbuch benutzt, Internetquellen taugen da erfahrungsgemäß auf Anfängerniveau sehr wenig. Siehe die als wichtig markierten Threads im C++-Forum.



  • Oh ja ist mein Fehler! Ertappt ;-). hab ich gerade gesehen.
    Ich schreibe in c++ habe aber lange Jahre in C programmiert und lerne c++ gerade nebenbei.
    Ich stell die Frage jetzt nochmal in dem C++ Forum. Oder?


Log in to reply