Markus Pitha: (C) Mehrdimensionales Array an Funktionen übergebebn

Nabend,

Wenn ich beispielsweise ein int Array namens feld[5][8] habe und dieses an eine Funktion übergeben will um es bearbeiten zu können, mache ich das so:
Prototyp:

  
void function(int f[5][8]);  

Übergabe:

  
function(feld);  

Nun war ich aber in der Situation, dass ich genau einen Wert irgendwo im Array feld[][], zB feld[3][2], an eine Funktion übergeben wollte.
Den Prototyp kann ich mir leicht zusammenreimen..

  
void function(int f[1][1]);  

..aber wie kann ich nun genau einen Zeiger auf genau diese eine Stelle zeigen lassen, die ich übergeben will?
Natürlich kann ich das komplette Array übergeben und abarbeiten, aber ich würde gerne die Problemstellung versuchen zu lösen.

Markus.

--
Wenn ich ein toller Programmierer währe, könnte ich vielleicht sogar Packete nach einem gewissen Standart kompelieren...
  1. hi!

    Nun war ich aber in der Situation, dass ich genau einen Wert irgendwo im
    Array feld[][], zB feld[3][2], an eine Funktion übergeben wollte.

    Wenn du einen Wert an die Funktion übergeben willst, dann mach es auch. Der
    Typ der Funktion ist dann einfach void function(int).

    bye, Frank!

    --
    Never argue with an idiot. He will lower you to his level and then
    beat you with experience.
    1. Hi,

      Wenn du einen Wert an die Funktion übergeben willst, dann mach es auch. Der
      Typ der Funktion ist dann einfach void function(int).

      Ich habe mich leider etwas undeutlich ausgedrückt. Ich habe eigentlich nicht nur einen Wert gemeint, sondern eigentlich die Werte an einer gewissen Stelle im mehrdimensionalen Array, die ich übergeben will, und in meinem richtigen Programm ist der Typ noch dazu nicht int, sondern etwas komplizierter aber ich wollte das Problem hier nur vereinfacht darstellen.

      Markus.

      --
      Wenn ich ein toller Programmierer währe, könnte ich vielleicht sogar Packete nach einem gewissen Standart kompelieren...
      1. hi!

        Wenn du einen Wert an die Funktion übergeben willst, dann mach es
        auch. Der Typ der Funktion ist dann einfach void function(int).
        Ich habe mich leider etwas undeutlich ausgedrückt. Ich habe eigentlich
        nicht nur einen Wert gemeint, sondern eigentlich die Werte an einer
        gewissen Stelle im mehrdimensionalen Array, die ich übergeben will, und
        in meinem richtigen Programm ist der Typ noch dazu nicht int, sondern
        etwas komplizierter aber ich wollte das Problem hier nur vereinfacht
        darstellen.

        Du solltest du bei der Vereinfachung keine entscheidenden Aspekte weglassen.
        Dein Problem verstehe ich immer noch nicht. feld[3][2] sind keine Werte an
        einer gewissen Stelle, sondern ist genau ein Wert.

        Also nochmal von vorne: Wie sieht deine Datenstruktur aus, aus der du
        irgendwelche Werte an eine Funktion übergeben willst? Und welche Werte davon
        willst du übergeben?

        bye, Frank!

        --
        Never argue with an idiot. He will lower you to his level and then
        beat you with experience.
  2. Hallo,

      
    &(f[1][1])  
    
    

    liefert Dir die Adresse.

    Die runden Klammern sind evtl. noch ueberfluessig, aber ich sehe mir jetzt nicht die Bindungsstaerken bei C an.

    Gruss
    Thomas

    1. Hallo,

      &(f[1][1])

      
      > liefert Dir die Adresse.  
        
      Bist du sicher? Ich könnte es zwar so ähnlich machen....  
      Prototyp:  
       ~~~c
        
       void function(int *f);  
       
      

      Übergabe:
       ~~~c

      function(&feld[3][2]);

        
      ...aber so könnte ich theoretisch unbeabsichtigterweise die Hauptvariable außerhalb der Funktion ändern.  
      Vielleicht gibt es noch eine bessere Lösung?  
        
      
      > Die runden Klammern sind evtl. noch ueberfluessig, aber ich sehe mir jetzt nicht die Bindungsstaerken bei C an.  
        
      Ja, sie sind überflüssig =)  
        
      Markus.  
      
      -- 
      Wenn ich ein toller Programmierer währe, könnte ich vielleicht sogar Packete nach einem gewissen Standart kompelieren...
      
      1. Hi,

        ...aber so könnte ich theoretisch unbeabsichtigterweise die Hauptvariable außerhalb der Funktion ändern.

        ich möchte dich zitieren: "..aber wie kann ich nun genau einen Zeiger auf genau diese eine Stelle zeigen lassen, die ich übergeben will?"
        Wenn du einen Pointer auf die Stelle hast, ist es doch nur logisch, dass du das Array verändern kannst.

        MfG Hopsel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
      2. gudn tach Markus!

        &(f[1][1]) liefert Dir die Adresse.

        sicher?

        ja. warum auch nicht?

        ...aber so könnte ich theoretisch unbeabsichtigterweise die Hauptvariable außerhalb der Funktion ändern.

        hmm, was meinst du mit "hauptvariable aendern"?
        meinst du damit, dass du die anderen array-werte auch noch veraendern kannst?
        also sowas:

          
        void function(int *f){  
          ++(*f); // ++feld[2][3]  
          --f;    // springe zu vorigem element  
          ++(*f); // ++feld[2][2]  
        }  
          
        //aufruf  
        function(&feld[2][3]);
        

        oder wo liegt jetzt noch das problem?

        prost
        seth

  3. Hi,

    zäh bist Du ja, das muß man Dir schon zugestehen. Ich kenne viele die schon viel früher die Brocken hingeworfen hätten :-)

    Nun war ich aber in der Situation, dass ich genau einen Wert irgendwo im Array feld[][], zB feld[3][2], an eine Funktion übergeben wollte.
    Den Prototyp kann ich mir leicht zusammenreimen..

    void function(int f[1][1]);

    
    > ..aber wie kann ich nun genau einen Zeiger auf genau diese eine Stelle zeigen lassen, die ich übergeben will?  
    > Natürlich kann ich das komplette Array übergeben und abarbeiten, aber ich würde gerne die Problemstellung versuchen zu lösen.  
      
    Dann poste doch mal die Problemstellung, denn so "ausse Lamäng" kann man da auch nicht viel zu sagen.  
      
    Wenn es aber Integer sind: warum kein work-on-copy und einfach den Integer kopieren und der Funktion übergeben? Es ist natürlich ein Problem, wenn der Wert zwischenzeitlich geändert wurde (Bei den Threads waren wir ja schon und ich nehme an, das Du dabei geblieben bist). Dann mußt Du einen Pointer auf die gewünschte Stelle übergeben, aber das tust Du ja bereits, wenn auch nicht so ganz, wie Du es gerne hättest.  
      
    Ich fang mal etwas quer an, denn dafür bin ich ja bekannt ;-)  
    Du kennst doch main(), oder? Ich schreibe z.B. immer  
      
    ~~~c
      
    #include <stdlib.h>  
    int main(int argc, char **argv){  
      exit(EXIT_SUCCESS);  
    }  
    
    

    Was ist jetzt in "argv"? Genau, ein zweidimensionales Array.

      
    #include <stdio.h>  
    #include <stdlib.h>  
    int main(int argc, char **argv){  
      printf("%d %s %c\n",argc,argv[1],argv[1][1]);  
      exit(EXIT_SUCCESS);  
    }  
    
    

    $ foo -bar
    2 -bar b
    $ foo # na, was kommt jetzt? ;-)
    Speicherzugriffsfehler

    Reicht das als Hinweise? Ansonsten müßtest Du schon mal Dein Problem genauer darlegen, vielleicht brauchst Du ja etwas gänzlich anderes.

    so short

    Christoph Zurnieden

    1. Hi,

      zäh bist Du ja, das muß man Dir schon zugestehen. Ich kenne viele die schon viel früher die Brocken hingeworfen hätten :-)

      Zumindest versuche ich es gerade mit einem neuen, einfacheren Progrämmchen :) Das Eine mit den Threads funktioniert zwar bisher, aber ich habe mich vor lauter Funktionen und Dingen, die ich bereits eingabaut habe und noch einbauen wollte, nicht mehr herausgesehen. Beim Aktuellen scheint es mir, als ob ich endlich mal mein Ziel erreiche.

      Dann poste doch mal die Problemstellung, denn so "ausse Lamäng" kann man da auch nicht viel zu sagen.

      Also ursprünglich funktionierte das Übergeben eines mehrdimensionalen Arrays nicht so, wie ich mir das vorstellte. Jetzt habe ich es so gelöst:

        
      Übergabe:  
      funktion(&array[3][4]);  //Vom Typ SDL_Rect  
        
      Prototyp:  
      funktion(SDL_Rect *feld);  
      
      

      und mit (*feld).x (*feld).y usw kann ich auf die Variablen des Typs SDL_Rect auf der Position [3][4] zugreifen.
      Aber eigentlich stört mich daran, dass ich in der Funktion mit Zeigern arbeiten muss, die die Variable außerhalb der Funktion beeinflussen könnte.

      Wenn ich das komplette Array übergebe, funktioniert es ja auch so:

        
      Übergabe:  
      funktion(array);  
        
      Prototyp:  
      funktion(SDL_Rect feld[5][8]); // array ist [5][8] groß.  
      
      

      Wobei ich jetzt mit feld[2][7] usw bequem auf die Elemente zugreifen kann, ohne die Variable außerhalb der Funktion zu beeinflussen.

      Wenn "array" ein Zeiger auf das allererste Element ist, wie sieht dann ein zu übergebender Zeiger auf beispielsweise [2][3] aus, also dass die Funktion nur diesen einen Wert bekommt?
      Ich frage das eigentlich nur aus Interesse.

      P.S Eines wollte ich noch wissen.
      Wenn ich ein Array, dass [4] lang ist an eine Funktion übergebe, die nur ein Array von [2] entgegen nimmt, kann es dann passieren, dass die letzten beiden Elemente von array[4] außerhalb der Funktion verloren gehen, oder macht es nichts, da ohnehin nur eine Kopie des Array übergeben wird?
      Ich brauchte nämlich nur die ersten beiden Elemente und bemerkte, dass es offensichtlich keine Probleme macht, wenn ich nur das verkürzte Array übergebe, aber es könnte natürlich auch nur Zufall gewesen sein?

      Markus.

      --
      Wenn ich ein toller Programmierer währe, könnte ich vielleicht sogar Packete nach einem gewissen Standart kompelieren...
      1. Hi,

        Dann poste doch mal die Problemstellung, denn so "ausse Lamäng" kann man da auch nicht viel zu sagen.

        Also ursprünglich funktionierte das Übergeben eines mehrdimensionalen Arrays nicht so, wie ich mir das vorstellte.

        Und wenn Du jetzt noch erklären würdest, wie Du Dir das vorgestellt hattest wäre das sehr hilfreich.

        Aber eigentlich stört mich daran, dass ich in der Funktion mit Zeigern arbeiten muss, die die Variable außerhalb der Funktion beeinflussen könnte.

        Also mal der Reihe nach.
        Du hast ein 2d-Array
        x_0,0 x_0,1 x_0,2 x_0,3
        x_1,0 x_1,1 x_1,2 x_1,3
        x_2,0 x_2,1 x_2,2 x_2,3

        Das ist entweder global oder lokal. Was ist es genau?

        Dann hast Du mindestens zwei Funktionen. In der einen wird das obige Array bearbeitet/erstellt und das Ergebnis einer anderen Funktion übergeben. Sind die beiden Funktionen getrennte Threads/Prozesse?

        Jetzt möchtest Du aber wohl nicht das ganze Array übergeben, ist das korrekt? Das kannst Du nicht sinnvoll beschränken, das einfachste wäre es eine Kopie des gewünschten Teile zu erstellen und dann dieses zu übergeben. Das kostet etwas Speicher -- ist das in Ordnung oder bist Du da jetzt schon klamm?

        Wenn "array" ein Zeiger auf das allererste Element ist, wie sieht dann ein zu übergebender Zeiger auf beispielsweise [2][3] aus, also dass die Funktion nur diesen einen Wert bekommt?
        Ich frage das eigentlich nur aus Interesse.

        Du solltest Dir mal 6.18 und Umgebung aus der C-FAQ vornehmen.

        Ich brauchte nämlich nur die ersten beiden Elemente und bemerkte, dass es offensichtlich keine Probleme macht, wenn ich nur das verkürzte Array übergebe, aber es könnte natürlich auch nur Zufall gewesen sein?

        Nein, es ist kein Zufall sondern alles vollkommen deterministisch ;-)

        Wenn Du nur die ersten beiden Elemente benötigst, warum nimmst Du sie dann nicht? Alloziere genügend Speicher und übergib die Kopie (Nicht vergessen den Speicher wieder zu befreien, falls Du den dynamisch alloziert hast!).

        so short

        Christoph Zurnieden