Allgemeine Funktion



  • Hi,

    Wie kann ich eine Funktion "ausgeben()" schreiben, die folgenden Aufbau hat:

    void ausgeben(void *array, unsigned int anz_elm, unsigned int size)..
    

    , der man ein beliebiges (int, long int, float ..) Array übergibt und die Funktion dann dieses Array ausgibt? Würde mich auf eure Hilfe freuen.

    greetz



  • Du musst den Typ des Arrays irgendwie übergeben. Da man in C leider keine Templates hat, musst du dir wohl irgendwas dafür ausdenken. Zahlen, Strings, .. und dann switch() bzw. if-else.

    Aber wozu brauchst du das?



  • Indem du statt size den Typ mit übergibst und dann array entsprechend castest.
    Für den Typ kannst du ja die selben Bezeichner nehmen wie bei printf (oder auch andere) und dann in einem switch entsprechen darauf reagieren.



  • Mir fiele dazu sonst höchstens noch ein Makro ein:

    #include <stddef.h>
    #include <stdio.h>
    
    #define PRINT_ARRAY(array, spec, size) do {             \
        size_t PRINT_ARRAY_INTERN_i;                        \
        for(PRINT_ARRAY_INTERN_i = 0;                       \
            PRINT_ARRAY_INTERN_i < size;                    \
            ++PRINT_ARRAY_INTERN_i)                         \
        {                                                   \
          printf(spec " ", array[PRINT_ARRAY_INTERN_i]);    \
        }                                                   \
      } while(0)
    
    int main() {
      double d[] = { 1.2, 3.4, 5.6 };
      int i[] = { 1, 2, 3 };
    
      PRINT_ARRAY(i, "%d"  , 3); putchar('\n');
      PRINT_ARRAY(d, "%.1f", 3); putchar('\n');
    
      return 0;
    }
    

    Über die Schönheit dieses Ansatzes lässt sich allerdings streiten.



  • Makros sind nur sinnvoll, wenn man die Grösse nicht mehr angeben muss.

    #include <stddef.h>
    #include <stdio.h>
    
    #define PRINT_ARRAY(array, spec) do {                  \
        if (sizeof(array)/sizeof((array)[0]) > 0) {        \
          printf(spec, array[0]);                          \
          size_t PRINT_ARRAY_INTERN_i;                     \
          for (PRINT_ARRAY_INTERN_i = 1;                   \
               PRINT_ARRAY_INTERN_i <                      \
                 sizeof(array)/sizeof((array)[0]);         \
               ++PRINT_ARRAY_INTERN_i) {                   \
            printf(" " spec, array[PRINT_ARRAY_INTERN_i]); \
          }                                                \
          putchar('\n');                                   \
        }                                                  \
      } while(0)
    
    int main() {
      double d[] = { 1.2, 3.4, 5.6 };
      int i[] = { 1, 2, 3 };
    
      PRINT_ARRAY(i, "%d"  );
      PRINT_ARRAY(d, "%.1f");
    
      return 0;
    }
    

    @Light: Wie wäre es mit folgender Funktionssignatur?

    enum printf_type { PRINTF_TYPE_INT, PRINTF_TYPE_FLOAT, PRINTF_TYPE_CHAR, ... }
    void ausgeben(void *array, size_t anz_elm, enum printf_type typ)
    {
      const char *spec;
      size_t elem_size;
      switch (typ) {
        case PRINTF_TYPE_INT: spec = "%d"; elem_size=sizeof(int); break;
        case PRINTF_TYPE_FLOAT: spec = "%f"; elem_size=sizeof(float); break;
        case PRINTF_TYPE_CHAR: spec = "%c"; elem_size=sizeof(char); break;
        ...
      }
      ...
    }
    ...
    
    double d[] = { 1.2, 3.4, 5.6 };
    ausgeben(d, 3, PRINTF_TYPE_DOUBLE);
    

Anmelden zum Antworten