Array von Struct an Funktion übergebn



  • Üblicherweise übergibt man die Adresse des ersten Elementes, die erhält man mit

    &TEMP_BUFFER[0]
    // oder kurz
    TEMP_BUFFER
    

    an eine Funktion, die einen Zeiger auf diesen Typ erwartet:

    int funktion(temp_buffer_t *messwerte) { ... }
    // oder gleichwertig
    int funktion(temp_buffer_t messwerte[]) { ... }
    

    Beim letzten könnte man auf den ersten Blick glauben, das Array würde kopiert werden, aber es wird trotzdem nur ein Zeiger übergeben.

    Habe folgendes Problem ich bekomme immer 4 Messwerte.Diese habe ich in einem struct definiert

    Warum eigentlich eine Struktur? Wäre da nicht ein Array von Arrays die bessere Wahl?
    🙂



  • hätte da auch gleich noch ne frage, bei mir klappt das irgendwie nich:

    struct yesjo { 
        int bla; 
        int blabla; 
       }
    
    void sort(hoho[][],int n) //??? welche argumente brauch funktion
    {
    //sortier schön z.b. nach bla...
    return; 
    }
    
    int main{ 
    int n=99;
    struct yesjo hoho[n][n];
    //so jetzt wird hoho[][].gefüllt....
    //und sortiert:
    sort(hoho n);    //?????????? wie die funktion aufrufen
    return;}
    


  • Mit Arrays variabler Länge ist das etwas...gespenstisch. Du kannst in C99 folgendes machen:

    #include <stdio.h>
    
    struct data {
      double val;
    };
    
    void fill(int n, struct data arr[][n]) {
      for(int i = 0; i < n; ++i) {
        for(int j = 0; j < n; ++j) {
          arr[i][j].val = i * j;
        }
      }
    }
    
    int main(void) {
      int n = 10;
      struct data foo[n][n];
    
      fill(n, foo);
    
      return 0;
    }
    

    Dabei muss n in der Parameterliste von fill vor dem VLA kommen, dessen Größe es bezeichnet. Wisse aber, dass einige übliche Compiler C99 bis heute nicht beherrschen, beispielsweise MSVC, und um Himmels Willen, stell sicher, dass n genau der Größe des Arrays entspricht! Keine Tricks a la "ich brauch ja nur die erste Hälfte."



  • danke!
    leider sagt mein dev c++ compiler: n was not declared in this scope:(



  • Wenn ich das richtig im Kopf habe, benutzt der einen (alten) gcc. Schreib mal -std=c99 in die Compileroptionen - allerdings sollte der sich aber so oder so über Arrays variabler Länge beschweren.

    Und wird Dev-C++ nicht seit mehreren Jahren nicht mehr weiterentwickelt? Ich würde mich an deiner Stelle mal nach einem zeitgemäßen Compiler bzw. einer zeitgemäßen IDE umsehen.



  • Jürgen123 schrieb:

    leider sagt mein dev c++ compiler: n was not declared in this scope:(

    Lies mal das:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-237002.html
    🙂



  • danke für die Tips!
    benutze jetzt code blocks, is ja auch echt ein viel besserer editor!
    das problem habe ich jetzt erstmal damit gelöst dass ich die "struct arrays" einfach global definiert habe.
    habe allerdings schon wieder ein neues problem:)
    und zwar gehts um qsort was ich gerne benutzen würde...
    also wie schon vorher habe ich:

    enum{n=10);
    struct data {
      int val;
      int zahl;
    };
    struct data foo[n][n];
    

    jetzt würd ich gern alle foo[n][n] nach foo[n][n].val aufsteigend sortieren. dafür gibts ja eigentlich schon qsort
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-241826.html hier wurde das schonmal gemacht, allerdings benutzen die einen struct-pointer array, was auch immer das bringt:)
    da brauch ich irgendne compare funktion

    int compar(const void *A, const void *B)
    {
        jo *a=(data *)A;
        jo *b=(data *)B;
        if(a->batch_release > b->batch_release) return 1;
        if(a->batch_release< b->batch_release) return -1;
    }
    qsort(foo,n,sizeof(data),compar);
    

    nunja leider scheint das vorne und hinten nich zu funktionieren und ich weiss uach nich wirklich was ich da mach:)
    würd mich freun wenn mir noob nochmal jemand helfen könnte:)



  • Jürgen123 schrieb:

    int compar(const void *A, const void *B)
    {
        jo *a=(data *)A;
        jo *b=(data *)B;
        if(a->batch_release > b->batch_release) return 1;
        if(a->batch_release< b->batch_release) return -1;
    }
    qsort(foo,n,sizeof(data),compar);
    

    Wer schreibt denn sowas?! Machs lieber so:

    int compar(const void *A, const void *B)
    {
        return ((data *)A)->batch_release - ((data *)B)->batch_release;
    }
    

    Die Fallunterscheidung ist völlig unnötig, und der Fall, dass die beiden gleich sind, sollte auch berücksichtigt werden. Ein vernünftiger Compiler sollte bei der Wolfroutine da oben bemerken, dass sie nicht in allen Fällen was zurückgibt.

    Sodann: willst du nach val oder nach zahl sortieren? Und wie ist das mit der 2. Dimension deines Arrays?
    🙂



  • hey danke schonmal:)
    diesen quellcode den ich da geschrieben hab hab ich nur irgendwo im itnernet gefunden:)
    eigentlich hat das array mittlerweile schon 3 dimensionen, macht das n unterschied?
    ups und ich seh gerade dass ich in meinem post beim kopieren n bisschen was vermixt habe. das batch_release is in meinem programm im struct drin, aber nich so wichtig..
    also wenn ich habe

    enum{n=10);
    struct data {
      int val;
      int zahl;
    }data foo[n][n][n];
    

    will ich z.b. nach aufsteigender zahl sortieren.
    was ich später auch noch machen werden muss ist zuerst nach zahl sortieren, unnd für gleiche zahl dann nahc val sortieren.. ohje ohje :))



  • enum{n=10);
    struct data {
      int val;
      int zahl;
    }data foo[n][n][n];
    

    Wozu eigentlich dieses enum?

    Jürgen123 schrieb:

    eigentlich hat das array mittlerweile schon 3 dimensionen, macht das n unterschied?
    ...
    will ich z.b. nach aufsteigender zahl sortieren.

    Gute Idee, mach das. Ich frag mich nur: was soll das heissen? Willst du jede Zeile sortieren? Oder jede Spalte? Die 3. Dimension sprech ich lieber erst mal gar nicht an...
    🙂



  • ich will soviel sortieren hahaha:)
    ne also z.b.:

    for(i=0;i<n;i++){
    for j=0,j<n;j++){
    sort foo[1][i][j].val;}}
    

    das problem bei mir ist halt auch die variabilität, einmal will ich nach der einen variable z.b. zahl, dann wieder nach val, das eine mal absteigend und das andere mal aufsteigend, und wieder das eine mal die ganze matrix, und dann vielleicht nur die eine spalte der matrix.
    also echt kompliziert, da wäres echt besser wenn man ahnung von der sache hat:)



  • Du brauchst für die verschiedenen Arten des Sortierens jeweils eine eigene Sortierfunktion.
    (Ok, das war jetzt wohl nicht sehr hilfreich :D.)
    Willst du z.B. nur eine Spalte sortieren, so kopierst du sie in einen Zwischenpuffer. Diesen Puffer sortierst du und schreibst ihn zurück in die Matrix. Hier spielt die Dimension prinzipiell keine Geige.
    Eventuell könnte es hilfreich sein sich zu überlegen, ob sich die Aufgabe (welche auch immer) ohne mehrdimensionale Matrizen einfacher lösen lässt.

    Gru-huß,
    B.B.



  • enum hab ich als define alternative genommen, (für die globalen fixen variablen) leider brauch ich mindestens 2 dimensionen;(
    und klar brauch ich verschiedene funktionen z.b. fürs auf und absteigend sortieren, aber vom prinzip her werden sie ja gleich sein (und das prinzip fehlt mir noch:) )
    das mit dem rauskopieren ist ne gute idee nur vielleicht etwas langsam.

    das ganze wird übrigens n metaheuristik algo(tabusearch) zur maschinenbelegungsoptimierung. das muss ja mal gesagt sein wo ihr mir ja immer schon so gute tips gebt.


Anmelden zum Antworten