Array direkt beim Funktionsaufruf erzeugen



  • Hi,
    ich würde gern ein Array von irgendwelchen Objekten erzeugen, und zwar direkt als Parameter einer Funktion.
    Wenn ich zum Beispiel diese Funktion hab:

    void f ( int * arr )
    {
    /* ... */
    }
    

    Würde ich sie gern statt so

    int iarr [3] = {1,2,3};
    f ( iarr );
    

    So aufrufen (nur als Beispiel, Syntax ist frei erfunden):

    f ( {1,2,3} );
    

    Das Array soll vor dem Aufruf der Funktion erzeugt und dann die Addresse der Funktion übergeben werden. So passiert das ja auch, wenn man einen String als Parameter übergibt. Jetzt hätte ich das nur gern statt mit char-Werten mit jedem anderen Datentyp auch.
    Ich hoffe, ihr könnt mir da helfen.
    Danke fürs ansehn,

    Morph

    PS: Variable Argumentlisten statt eines Array funktionieren leider in meinem Fall nicht, weil ich das auch mit selbstdefinierten Strukturen einsetzen möchte.



  • Jetzt hätte ich das nur gern statt mit char-Werten mit jedem anderen Datentyp auch.
    

    das geht nicht nur in C++ dort könntest mit einem template - Parameter arbeiten (heisst eine funktion kann beliebige Datentypen verarbeiten solange diese
    Datentypen auch über die notwendigen Operatoren verfügen + - * / = usw.)

    Desweiteren müsstest Du diese Funktion mit beliebiger Parameterzahl schreiben, das geht! Das funktioniert unter C als auch unter C++!

    Loesung
    Du koenntest also fuer C die Funktion so definieren das sie mit unterschiedlicher Parameterzahl arbeiten kann! Und da C keine Templates unterstuetzt, die Funktion
    fuer jeden Datentypen den du brauchst, extra eine solche schreiben (Funktion ueberschreiben)!

    Mit freundlichen Gruessen



  • Stichwort: Ellipsen - Prototypen für Funktionen mit variabler Parameterzahl

    es gibt eine solche Funktion bereits in <stdio.h> nehmlich: printf(...); wenn du weisst wie ich das meine, dir ist das da bestimmt schonmal aufgefallen!

    Gruesse



  • Morph01 schrieb:

    Würde ich sie gern statt so

    int iarr [3] = {1,2,3};
    f ( iarr );
    

    So aufrufen (nur als Beispiel, Syntax ist frei erfunden):

    f ( {1,2,3} );
    

    Wo ist das Problem wenn man es in 2 zeilen schreibt? Oo



  • sclearscreen schrieb:

    Stichwort: Ellipsen - Prototypen für Funktionen mit variabler Parameterzahl

    es gibt eine solche Funktion bereits in <stdio.h> nehmlich: printf(...); wenn du weisst wie ich das meine, dir ist das da bestimmt schonmal aufgefallen!

    Gruesse

    Seltsam, als ich das letztens ausprobiert hab, hat mir mein Compiler gesagt, dass ich Klassen nicht als Argumente benutzen kann. Jetzt macht ers, ohne zu Murren. Seltsam...

    Trotzdem danke!

    Morph



  • Statt nen Array kannste jetzt beliebig viele Parameter uebergeben!
    Hier nen Beispiel:

    #include <stdio.h>
    #include <stdarg.h>
    
    int sum_ints(int anz_param, ...)
    {
        va_list va;
        int idx,sum=0;
        va_start(va,anz_param);
        for(idx=0;idx<anz_param && va != NULL;idx++)
        {
            sum = sum + va_arg(va, int);    
        }
        va_end(va);
        return sum;    
    }        
    
    int main(int argc, char *argv[])
    {
        int erg = sum_ints(3,1,2,3);
        printf("%d\n",erg);
    
      getchar();	
      return 0;
    }
    

    mfg



  • PS: Variable Argumentlisten statt eines Array funktionieren leider in meinem Fall nicht, weil ich das auch mit selbstdefinierten Strukturen einsetzen möchte.

    Gut hat ich jetzt erst gelesen, trotzdem beliebiger Datentypen funktioniert dann
    nur wenn du fuer jeden Datentypen der auftritt die Funktion explizit überschreibst.

    MFG



  • @Morph01

    Seltsam, als ich das letztens ausprobiert hab, hat mir mein Compiler gesagt, dass ich Klassen nicht als Argumente benutzen kann. Jetzt macht ers, ohne zu Murren. Seltsam...

    hast das bestimmt als C++ - Programm kompliert also C++ als Standardsprache fuer dein Projekt gesetzt! Dann geht das auch.
    In C kannste maximal ne

    struct
    

    an ne Funktion übergeben!

    MFG


Anmelden zum Antworten