Zdravím, pro aplikaci v MCU potřebuji vyvinout nastavovací menu. V menu by mělo být cca 10 položek zobrazovat budu aktuální položku, předchozí a následující. Některé položky budou nastavovány číselně, u jiných bude popis a na pozadí přiřazení k číslům. Jak realizovat takový seznam? Asi by bylo nejlepší přes strukturu, kde by byla uložená adresa následovníka a předka a v polích jednotlivé hodnoty a popisy. Celé bych to nejradši realizoval v C, s C++ moc velký kamarád nejsem. Napsat kus kódu mi nedělá problém, ale struktury, pointery a další věci z toho pravého programování jsou problém. Případně by mi hodně pomohl kus podobného kódu, pro lepší pochopení problému.
Fórum › C / C++
Vázaný seznam v MCU
Tak se o to snažím v wxDevC++ a marně. mám:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct xx{
char short_text[20];
char full_text[40];
int predchozi;
int dalsi;
}MENU_ITEM;
int main(void)
{
int aktualniPolozka;
MENU_ITEM *polozka1,*polozka2;
polozka1 = (MENU_ITEM *) malloc(sizeof(MENU_ITEM));
polozka2 = (MENU_ITEM *) malloc(sizeof(MENU_ITEM));
strcpy(polozka1->short_text,"nazev pol1");
strcpy(polozka1->full_text,"dlouhy nazev pol1");
polozka1->dalsi = 111;//polozka2;
strcpy(polozka2->short_text,"nazev pol2");
strcpy(polozka2->full_text,"dlouhy nazev pol2");
polozka2->dalsi = 0;
aktualniPolozka = polozka1;
printf("%d\r\n",polozka1->dalsi);
printf("%d\r\n",aktualniPolozka+60*sizeof(char)+sizeof(int));
printf("%d",polozka2);
getchar();
return 0;
}
a chtěl bych, aby se mi do proměné polozka1->dalsi uložila hodnota adresa další struktury a tu si přes ukazatel aktualniPolozka zobrazil. Co mě na tom celém zaráží asi nejvíc je, že když definuju strukturu staticky, zabírá 68 byte, ovšem při dynamickém alokování 80 byte. Strukturu mi stačí alokovat staticky, jenže to mi už vůbec nefungovalo.
Výsledkem prinft má být 3x stejné číslo a to adresa další struktury
Takhle:
typedef struct xx{
char short_text[20];
char full_text[40];
struct xx *predchozi;
struct xx *dalsi;
}MENU_ITEM;
int main(void)
{
MENU_ITEM *aktualniPolozka;
MENU_ITEM *polozka1,*polozka2;
polozka1 = (MENU_ITEM *) malloc(sizeof(MENU_ITEM));
polozka2 = (MENU_ITEM *) malloc(sizeof(MENU_ITEM));
strcpy(polozka1->short_text,"nazev pol1");
strcpy(polozka1->full_text,"dlouhy nazev pol1");
polozka1->dalsi = polozka2;
strcpy(polozka2->short_text,"nazev pol2");
strcpy(polozka2->full_text,"dlouhy nazev pol2");
polozka2->dalsi = 0;
aktualniPolozka = polozka1;
printf("%p\r\n",polozka1->dalsi);
printf("%p\r\n",aktualniPolozka->dalsi);
printf("%p",polozka2);
getchar();
return 0;
}
A pokud se teda nekamarádíš s ukazateli a nepotřebuješ to dynamicky, tak stačí pole třeba nějak takhle:
typedef struct xx{
char short_text[20]; // char *short_text;
char full_text[40]; // char *full_text;
}MENU_ITEM;
MENU_ITEM menu[] = {
{ "nazev pol1", "dlouhy nazev pol1" },
{ "nazev pol2", "dlouhy nazev pol2" },
};
...
int aktualniPolozka = 0;
int pocetPolozek = sizeof(menu) / sizeof(menu[0]);
...
printf("%s\r\n", menu[aktualniPolozka].short_text);
Pak taky jeste zalezi v jakym MCU. Napriklad u AVR bys zabral celou ramku retezcema, ktery potrebujes jen sem tam vypsat - tam je lepsi na ne pouzit pamet programu (retezce tam budou tak jak tak).
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Vázaný seznam — založil Pajda
Dvousměrně vázaný seznam — založil Ondrášek
Částečně vázaný přítel šablonové třídy — založil vdolek
OS pro MCU (RTOS) — založil babulax
MCU 8051 IDE — založil Tomas.P
Moderátoři diskuze