array



  • wie kann ich folgende tabelle in ein array reinbiegen? will dann mit ner funktion werte aus der tabelle zurückgeben

    v | pos
    |0-10|10-20|20-30|30-40|40-50|
    -----------------------------------------
    0 - 50 | 1 | 9 | 4 | 3 | 6 |
    50 - 100 | 5 | 7 | 5 | 12 | 4 |
    100 - 150 | 9 | 3 | 6 | 4 | 13 |
    150 - 200 | 3 | 1 | 11 | 2 | 22 |

    unsigned char get_value(unsigned char v, unsigned char pos);
    
    unsigned char value = get_value(10, 15);  // <-- soll 9 zurückgeben
    unsigned char value = get_value(102, 39);  // <-- soll 4 zurückgeben
    


  • v 		|		pos
    		|0-10|10-20|20-30|30-40|40-50|
    ----------------------------------------------
    0 - 50 		| 1  | 9   | 4   | 3   | 6   |
    50 - 100	| 5  | 7   | 5   | 12  | 4   |
    100 - 150	| 9  | 3   | 6   | 4   | 13  |
    150 - 200	| 3  | 1   | 11  | 2   | 22  |
    


  • Wie wärs mit einem 3-dimensionalen Array?

    Aber mal was anderes. Was machst du bei einer Angabe wie 10,50 ?

    Du solltest das System npch mal überdenken



  • Ich denke ein zweidimensionales Array dürfte reichen 😉



  • Dann will ich heute mal nicht so sein:

    Hier:

    #include <stdio.h>
    
    unsigned char arr[4][5] = { {1, 9, 4, 3, 6}, 
                                {5, 7, 5, 12, 4}, 
                                {9, 3, 6, 4, 13},
                                {3, 1, 11, 2, 22}};
    
    static int conv_pos(unsigned char pos) {
        if (pos<10) return 0;
        if (pos<20) return 1;
        if (pos<30) return 2;
        if (pos<40) return 3;
        return 4;
    }
    
    static int conv_v(unsigned char v) {
        if (v<50) return 0;
        if (v<100) return 1;
        if (v<150) return 2;
        return 3;
    }
    
    static unsigned char get_value(unsigned char v, unsigned char pos) {
        return arr[conv_v(v)][conv_pos(pos)];
    }
    
    int main(void) {
        unsigned char v, pos;
    
        for (v=0; v<200; ++v) {
            for (pos=0; pos<50; ++pos) {
                printf("value[%3d][%2d] = %2d\n", v, pos, get_value(v, pos));
            }
        }
        return 0;
    }
    

    Das kommt aber so schnell nicht wieder vor.
    Das nächste Mal solltest du ein wenig länger drüber überlegen.

    Gruß mcr



  • #define conv_pos(pos) ((pos)<49?(pos)/10:4)
    

    ^^ mach doch so (und für conv_v so ähnlich)
    🙂



  • mcr schrieb:

    Dann will ich heute mal nicht so sein:

    Hier:

    #include <stdio.h>
    
    unsigned char arr[4][5] = { {1, 9, 4, 3, 6}, 
                                {5, 7, 5, 12, 4}, 
                                {9, 3, 6, 4, 13},
                                {3, 1, 11, 2, 22}};
    
    static int conv_pos(unsigned char pos) {
        if (pos<10) return 0;
        if (pos<20) return 1;
        if (pos<30) return 2;
        if (pos<40) return 3;
        return 4;
    }
    
    static int conv_v(unsigned char v) {
        if (v<50) return 0;
        if (v<100) return 1;
        if (v<150) return 2;
        return 3;
    }
    
    static unsigned char get_value(unsigned char v, unsigned char pos) {
        return arr[conv_v(v)][conv_pos(pos)];
    }
    
    int main(void) {
        unsigned char v, pos;
    
        for (v=0; v<200; ++v) {
            for (pos=0; pos<50; ++pos) {
                printf("value[%3d][%2d] = %2d\n", v, pos, get_value(v, pos));
            }
        }
        return 0;
    }
    

    Das kommt aber so schnell nicht wieder vor.
    Das nächste Mal solltest du ein wenig länger drüber überlegen.

    Gruß mcr

    mcr erkläre doch mal, was das static vor den Rückgabewerten Deiner drei Funktionen bewirken soll - Danke. 😉



  • willy schrieb:

    mcr erkläre doch mal, was das static vor den Rückgabewerten Deiner drei Funktionen bewirken soll

    die funktionen sind lokal und von anderen c-files nicht aufrufbar. gehört zum guten stil.
    🙂



  • macro-freak schrieb:

    #define conv_pos(pos) ((pos)<49?(pos)/10:4)
    

    ^^ mach doch so (und für conv_v so ähnlich)
    🙂

    Stimmt, hätte ich auch machen können. Ich verwende aber sehr selten
    Makros, so dass ich da nicht dran gedacht habe.

    Auf die Idee, die Division zu verwenden, bin ich nicht gekommen. Aber
    sehr nett. 😉

    Gruß mcr



  • conv_pos(i++); // Ooops
    

    Makro ohne Sinn.



  • Tim schrieb:

    conv_pos(i++); // Ooops
    

    Makro ohne Sinn.

    ne, aufruf ohne sinn. dass ++ im makroargument problematisch ist, sollte ja allgemein bekannt sein.
    🙂


Anmelden zum Antworten