Semantischer fehler.....woran liegt das?



  • Hi,
    ich habe folgendes Problem.....habe hier ein kleines Beispiel:

    #include "stdio.h"
    #include "stdlib.h"
    #include "conio.h"
    
    using namespace std;
    
    int fillImageOrdered (int arr[], int mWidth, int mHeight);
    void showImage (int arr[], int mWidth, int mHeight);
    
    int main (void)
    {
      int *Map;
      int mWidth=10;
      int mHeight=10;
      int x,y;
    
      Map = (int*)malloc(sizeof(int) * (mWidth * mHeight + 2)); 
    
    fillImageOrdered (Map,mWidth,mHeight);
    showImage (Map,mWidth,mHeight);
    
      getch();
    return 0;
    }
    
    void showImage (int *Map, int mWidth, int mHeight){
         int x,y;
      for(x = 0; x < mWidth; x++){
        for(y = 0; y < mHeight; y++){
          printf("%d\t",Map[x+y]);
                                    }
        printf("\n");
                                 }
         }
    
    int fillImageOrdered (int *Map, int mWidth, int mHeight){
      int value=0;int x,y;
      for(x = 0; x < mWidth; x++){
        for(y = 0; y < mHeight; y++){
          *(Map+x+y)= value;value++;}
                                 }
    
                                        return *Map;            }
    

    nun sollte aber beim Funktionsaufruf "showImage" meiner Meinung nach 0,1,2,3,4..usw.bis 99 ausgegeben werden.....

    woran liegt denn das bitte? wahrscheinlich is es irgendwas dummes was ich die ganze Zeit übersehe, aber ich komm nicht drauf:(

    thx for help
    lg holzi



  • *(Map+x+y)= value
    

    Ueber diese Zeile solltest du nochmal nachdenken.



  • thx knivil für die schnelle Antwort!
    Wie könnte ich denn das anders machen?

    Irgendwie hänge ich die ganze Zeit an dam selben Problem.....ich war überzeugt , dass das Problem irgendwie durch die return Anweisung entsteht...da das ergebniss von :

    int value=0;
      for(x = 0; x < mWidth; x++){
        for(y = 0; y < mHeight; y++){
          *(Map+x+y)= value;value++;
          printf("%d\t",Map[x+y]);
        }
        printf("\n");
      }
    

    in der main genau das gewünschte ist....... nur in einem seperaten Methodenaufruf kommt eine mir nicht nachvollziehbare Zahlenfolge zum Vorschein leider*gg*.

    gibt es eine effizientere Methode als

    *(Map+x+y)= value;
    

    um den gewünschten Sektor des arr[] anzusprechen?



  • H0lzi schrieb:

    gibt es eine effizientere Methode als

    *(Map+x+y)= value;
    

    um den gewünschten Sektor des arr[] anzusprechen?

    naja - wie wär's denn erstmal mit der richtigen statt mit einer effizienteren Methode. Wenn ich das richtig verstehe soll das doch eine Art Matrix mit mWidth Spalten und mHeight Yeilen werden. x läuft über die Spalten und z über die Zeilen.
    Mal angenommen die Matrix ist Spaltenweise im Speicher abgelegt dann läuft y schneller - d.h. in der inneren Schleife. Dann wäre fillImageOrdered:

    int fillImageOrdered( int *Map, int mWidth, int mHeight){
        int value=0;
        for( int x = 0; x < mWidth; ++x )
        {
            for( int y = 0; y < mHeight; ++y, ++value)
                *Map++= value;
        }
        return *Map; // zeigt jetzt hinter das Ende der Map      
    }
    

    jetzt überlege nochmal was in Zeile 33 geschehen muss.

    PS.: :xmas2: ist denn schon wieder Weihnachten?



  • Zum einen ist 3 + 5 das gleiche wie 5 + 3, aber der Pixel an Stelle (5,3) ist nicht der gleiche wie an (3,5). Ich interpretiere deinen Code so, dass du ein zweidimensionales "Objekt" (sprich Bild/Image) hast und du es in einem eindimensionalen Array (Vektor or what ever) gespeichert hast. Der Zugriff auf Pixel (x,y) erfolgt dabei durch die Abbildung (x,y) -> (x*mWidth + y) (oder (x,y) -> y*mHeight + x). Je nachdem ob du dein Bild zeilen- oder spaltenorientiert ablegst (und je nachdem, was ueberhaupt Zeile oder Spalte repraesentiert). Der Code dafuer sieht so aus:

    Map[x*mWidth+y] = value
    


  • thx Werner_logoff & knivil !!

    richtig is hier eben genau das Problem:) *gg*

    auch wenn ich mit

    Map[x*mWidth+y] = value
    

    oder

    *Map++= value;
    

    zugreife, so kommt immer eine von mir nicht gewünschte Zahlenfolge heraus...
    und ich kann mir nicht erklären warum....
    Wenn ich die länge des 2d arr auf 3 und höhe auf 3 setzt kommt:
    `0 1 2

    1 2 3

    2 3 4`
    und leider nicht 1,2,3,4,5,6,7,8,9 als Ausgabe hervor.... 😞



  • Hoppla, hab das jz wohl beides falsch aufgefasst....sry:)

    knivil schrieb:

    3 + 5 das gleiche wie 5 + 3, aber der Pixel an Stelle (5,3) ist nicht der gleiche wie an (3,5)

    DAS WAR IMMER NOCH MEIN PROBLEM:)
    habe die anfrage nur falsch gemacht:)

    Danke für die Hilfe Werner_logoff & knivil,nun ist alles klar :xmas2:


Anmelden zum Antworten