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.