Marten83
04.11.2009, 08:58
Guten Morgen!
Ich habe ein Problem mit einem Array aus Strukturen.
Zuerst habe ich eine Struktur deklariert um einen neuen Typ zu erzeugen.
Diesen Typ habe ich dann als Array von 100 (soll später bis 255) Ebenen aufgezogen.
Nun möchte ich in einer Routine dieses Array wie folgt beschreiben:
/*
'AIS_search_data_section_put'
compares MMSI with those in the list and returns memory adress of the SRAM
-unoccupied sections are filled as early as possible
-list is expanded if new MMSI is recognised
-list can grow up to 'MAXVESSELS'
-'0xFFFF' (= ERROR) will be returned in case of
no MMSI match and full list */
uint16_t
AIS_search_data_section_put (const uint32_t comp_MMSI)
{
/*local variables*/
volatile uint8_t out = 0;
volatile uint8_t match = 0;
volatile uint16_t section = 0;
volatile uint8_t newsection = 0;
volatile uint8_t search_sec = 0;
volatile uint8_t temp_section = 0;
char puffer1 [20];
/*loop until MMSI found or new section occupied*/
do
{
/*check if section is occupied*/
if (AIS_data_section [search_sec].occupied != 0)
{
utoa (AIS_data_section [search_sec].occupied, puffer1, 10);
glcd_print (27, (search_sec + 2), &puffer1 [0]);
ultoa (comp_MMSI, puffer1, 10);
glcd_print (0, 3, &puffer1 [0]);
ultoa (AIS_data_section [search_sec].MMSI, puffer1, 10);
glcd_print (0, 4, &puffer1 [0]);
/*store memory adress if MMSI matches*/
if (AIS_data_section [search_sec].MMSI == comp_MMSI)
{
section = AIS_data_section [search_sec].section;
match = 1;
out = 1;
}
}
/*reserve first unoccupied section to store new AIS data
in case of no MMSI match*/
else
{
if (newsection == 0)
{
section = search_sec * 0x40;
temp_section = search_sec;
newsection = 1;
}
}
/*increment section to compare next MMSI...*/
if (search_sec < list_depth)
{
search_sec++;
}
/*...or expand list if necessary and leave loop*/
else
{
if (search_sec == list_depth)
{
if (list_depth < MAXVESSELS)
{
list_depth++;
}
}
out = 1;
}
}
while (out == 0);
/*store new data in list*/
if (match == 0 && newsection == 1)
{
AIS_data_section [temp_section].occupied = 1;
AIS_data_section [temp_section].MMSI = comp_MMSI;
AIS_data_section [temp_section].section = section;
ultoa (AIS_data_section [temp_section].MMSI, puffer1, 10);
glcd_print (30, (temp_section + 2), &puffer1 [0]);
}
/*ERROR if MMSI not found and list full*/
if (match == 0 && newsection == 0)
{
section = 0xFFFF;
}
return section;
}/*AIS_search_data_section_put*/
Zuerst hatte ich das Array nicht weiter klassifiziert und hatte das Problem, dass die Startwerte undefiniert waren.
So weit so gut, habe ich also dien Inhalt initialisiert.
Leider wurde mir während der Programmlaufzeit das Array teilweise wieder überschrieben.
Mit der Klassifizierung 'static' hat sich das Problem anscheinend behoben, allerdings werden nun anscheinend nur noch 5-6 Ebenen beschrieben und ausgewertet.
Hier nochmal die Deklaration des Arrays:
typedef struct
{
uint8_t occupied;
uint32_t MMSI;
uint16_t section;
}lookup_t;
static lookup_t AIS_data_section [MAXVESSELS];
Kann mir einer eine Erklärung darauf geben, warum dem so ist?
Vielen Dank im Vorraus!
MfG, Marten83
Ich habe ein Problem mit einem Array aus Strukturen.
Zuerst habe ich eine Struktur deklariert um einen neuen Typ zu erzeugen.
Diesen Typ habe ich dann als Array von 100 (soll später bis 255) Ebenen aufgezogen.
Nun möchte ich in einer Routine dieses Array wie folgt beschreiben:
/*
'AIS_search_data_section_put'
compares MMSI with those in the list and returns memory adress of the SRAM
-unoccupied sections are filled as early as possible
-list is expanded if new MMSI is recognised
-list can grow up to 'MAXVESSELS'
-'0xFFFF' (= ERROR) will be returned in case of
no MMSI match and full list */
uint16_t
AIS_search_data_section_put (const uint32_t comp_MMSI)
{
/*local variables*/
volatile uint8_t out = 0;
volatile uint8_t match = 0;
volatile uint16_t section = 0;
volatile uint8_t newsection = 0;
volatile uint8_t search_sec = 0;
volatile uint8_t temp_section = 0;
char puffer1 [20];
/*loop until MMSI found or new section occupied*/
do
{
/*check if section is occupied*/
if (AIS_data_section [search_sec].occupied != 0)
{
utoa (AIS_data_section [search_sec].occupied, puffer1, 10);
glcd_print (27, (search_sec + 2), &puffer1 [0]);
ultoa (comp_MMSI, puffer1, 10);
glcd_print (0, 3, &puffer1 [0]);
ultoa (AIS_data_section [search_sec].MMSI, puffer1, 10);
glcd_print (0, 4, &puffer1 [0]);
/*store memory adress if MMSI matches*/
if (AIS_data_section [search_sec].MMSI == comp_MMSI)
{
section = AIS_data_section [search_sec].section;
match = 1;
out = 1;
}
}
/*reserve first unoccupied section to store new AIS data
in case of no MMSI match*/
else
{
if (newsection == 0)
{
section = search_sec * 0x40;
temp_section = search_sec;
newsection = 1;
}
}
/*increment section to compare next MMSI...*/
if (search_sec < list_depth)
{
search_sec++;
}
/*...or expand list if necessary and leave loop*/
else
{
if (search_sec == list_depth)
{
if (list_depth < MAXVESSELS)
{
list_depth++;
}
}
out = 1;
}
}
while (out == 0);
/*store new data in list*/
if (match == 0 && newsection == 1)
{
AIS_data_section [temp_section].occupied = 1;
AIS_data_section [temp_section].MMSI = comp_MMSI;
AIS_data_section [temp_section].section = section;
ultoa (AIS_data_section [temp_section].MMSI, puffer1, 10);
glcd_print (30, (temp_section + 2), &puffer1 [0]);
}
/*ERROR if MMSI not found and list full*/
if (match == 0 && newsection == 0)
{
section = 0xFFFF;
}
return section;
}/*AIS_search_data_section_put*/
Zuerst hatte ich das Array nicht weiter klassifiziert und hatte das Problem, dass die Startwerte undefiniert waren.
So weit so gut, habe ich also dien Inhalt initialisiert.
Leider wurde mir während der Programmlaufzeit das Array teilweise wieder überschrieben.
Mit der Klassifizierung 'static' hat sich das Problem anscheinend behoben, allerdings werden nun anscheinend nur noch 5-6 Ebenen beschrieben und ausgewertet.
Hier nochmal die Deklaration des Arrays:
typedef struct
{
uint8_t occupied;
uint32_t MMSI;
uint16_t section;
}lookup_t;
static lookup_t AIS_data_section [MAXVESSELS];
Kann mir einer eine Erklärung darauf geben, warum dem so ist?
Vielen Dank im Vorraus!
MfG, Marten83