|
|
View previous topic :: View next topic |
Author |
Message |
carl
Joined: 06 Feb 2008 Posts: 240 Location: Chester
|
Array Accessing - [SOLVED] |
Posted: Tue Aug 14, 2012 7:51 am |
|
|
Sorry to bother you all again,
but I have a question regarding arrays and look-up tables.
If I had an array [46] [2]
And to access it you would say:
I want what is in row [35] and column [2].
so X = [35] [2] returns what is in that location from the array. In this case = 6.
This is the normal way of doing it.
But is there any way to 'match' the information in the array to a variable rather than accessing the row/column??
so my array is below Code: | unsigned int32 max_val[46][2] = {
{0,0}, //row0
{64,33},
{100,16},
{128,11},
{152,8},
{180,6}, //row5
{256,6},
{360,5},
{512,4},
{600,4},
{720,3}, //row 10
{800,3},
{1000,3},
{1024,3},
{1440,3},
{1500,2}, //row 15
{2000,2},
{2048,2},
{2880,2},
{3600,2},
{4096,2}, //row 20
{0X3FF,33},
{0X7FF,16},
{0XFFF,11},
{0X1FFF,8},
{0X3FFF,6}, //row25
{0X7FFF,6},
{0XFFFF,5},
{0X1FFFF,4},
{0X3FFFF,4},
{0X7FFFF,3}, //row 30
{0XFFFFF,33},
{0X1FFFFF,16},
{0X3FFFFF,11},
{0X7FFFFF,8},
{0XFFFFFF,6}, //row35
{0X11DF,6},
{0X23BF,5},
{0X477F,4},
{0X8EFF,4},
{0X11DFF,3}, //row 40
{0X14F27,3},
{0X23BFF,3},
{0X3245F,3},
{0X477FF,3},
{0X8E,2}, //row 45
}; |
Now if I read a value (which will always be incorporated in the array above) from somewhere else (eeprom or other hardware), and lets say the value is val = 0X477FF.
Is it possible to search the array, to find when 'val' = 'the value in the first array' - so that I can then return the value from the second array - in this case '3' would be returned.
Any help appreciated
Carl
Last edited by carl on Wed Aug 15, 2012 3:12 am; edited 1 time in total |
|
|
carl
Joined: 06 Feb 2008 Posts: 240 Location: Chester
|
|
Posted: Tue Aug 14, 2012 9:07 am |
|
|
Tried using switch case as below but got this error message: Quote: | Constant out of the valid range 131071 is not less than 65536 |
so I presume that a switch case can only work on 16bit variables.
I need 32 bit - so this method is not going to work. Code: | extern unsigned int32 load_max_result;
unsigned int32 get_max(void){
switch (load_max_result){
case 64: return 0;
case 100: return 76;
case 128: return 0;
case 152: return 76;
case 180: return 0;
case 256: return 76;
case 360: return 0;
case 512: return 76;
case 600: return 0;
case 720: return 76;
case 800: return 0;
case 1000: return 76;
case 1024: return 0;
case 1440: return 76;
case 1500: return 0;
case 2000: return 76;
case 2048: return 0;
case 2880: return 76;
case 3600: return 0;
case 4096: return 76;
case 0x3FF: return 0;
case 0x7FF: return 76;
case 0xFFF: return 0;
case 0x1FFF: return 76;
case 0x3FFF: return 0;
case 0X7FFF: return 76;
case 0XFFFF: return 0;
case 0X1FFFF: return 76;
case 0X3FFFF: return 0;
case 0X7FFFF: return 76;
case 0XFFFFF: return 0;
case 0X1FFFFF: return 76;
case 0X3FFFFF: return 0;
case 0X7FFFFF: return 76;
case 0XFFFFFF: return 0;
case 0X11DF: return 76;
case 0X23BF: return 76;
case 0X477F: return 0;
case 0X8EFF: return 76;
case 0X11DFF: return 0;
case 0X14F27: return 76;
case 0X23BFF: return 0;
case 0X3245F: return 76;
case 0X477FF: return 0;
case 0X8E: return 76;
}
} |
Any THoughts? |
|
|
carl
Joined: 06 Feb 2008 Posts: 240 Location: Chester
|
|
Posted: Tue Aug 14, 2012 1:57 pm |
|
|
Anyone?
The only other way I can think of if loads of nested IF's - but I dont like this plan.... |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Tue Aug 14, 2012 2:22 pm |
|
|
Just search the array. Not exactly 'rocket science'.....
Code: |
int8 find(int32 valtofind) {
int8 count;
for (count=0;count<46;count++) {
if (max_val[count][0]==valtofind) return(max_val[count][1]);
}
return(0); //put what you want here - error did not find the value;
}
|
This is really a 'C 101' question, nothing to do with CCS as such.
Best Wishes |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Tue Aug 14, 2012 2:23 pm |
|
|
your exposition is not totally clear to me.
there are ways to index - as you seem to desire with TWO arrays
where each is loaded with constants
as in
int32 a[48]
int 8 b[48]
then searching with comparisons ( especially if the arrays are SORTED from hi to lo or vice versa ) funny but, i just wrote some code like that this morning to add to a project.
here is an excerpt
Code: |
int16 omult=0;
const unsigned int16 fcor[8]={2700,3143,3883,5191,5333,5491,5571,5659,};
const unsigned int32 gfreq[8]={250000,200000,150000,100000,96000,92000,90000,80000,};
.... later
for (j=0; j<8; j++) { if (infreq>=gfreq[j]) { omult=fcor[j]; break; }}
// the version i actually wrote has 72 elements but this is the idea
|
|
|
|
carl
Joined: 06 Feb 2008 Posts: 240 Location: Chester
|
|
Posted: Wed Aug 15, 2012 3:12 am |
|
|
Thanks |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|