Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: daew 02. 02. 2011, 12:51:46
-
Prosím o pomoc, vytvářím prográmek pro Atmel32 s LCD, tam by mělo být k dispozici menu, které jsem chtěl vytvořit pomocí struktur a 2-rozměrného pole, mám to nějak takto:
typedef struct menu
{ char jmeno[8];
char anone:1;
}MENU;
struct MENU polozka_menu[5][50];
#define polozka_menu[0,0].jmeno="menu1"; //proměnné hl. menu
#define polozka_menu[0,1].jmeno="menu2";
#define polozka_menu[0,2].jmeno="menu3";
#define polozka_menu[0,3].jmeno="menu4";
#define polozka_menu[0,4].jmeno="menu5";
#define polozka_menu[1,0].jmeno="submenu1-A";
#define polozka_menu[1,1].jmeno="submenu1-B";
#define polozka_menu[1,2].jmeno="submenu1-C";
atd.atd.
v samotném programu se k proměnným nemůžu nějak dostat:
polozka_menu[0,10].jmeno="aaaa" //to mi samozrejme nefunguje, docetl jsem se, ze takto NE, ikdyž nevím proč
strcpy(polozka_menu[0,10].jmeno,"sss"); //ale nejde mi to ani takhle
polozka_menu[0,10].anone=1; //ale i u tohoto mi to pise "invalid expression"
Zkoušel jsem hledat po netu, ale podobný příklad jsem nikde nenašel, určitě to bude nějaká ptákoviny, ale už jsem z toho zoufalý... Případně moc dík za každou radu.
-
Konstrukce #define slouží k definici makra a ne k plnění hodnot do pole nebo struktury, člověče...
-
A v C (pokud mi něco neuniká v tom CodeVision) se do dvourozměrného pole přistupuje a[1][2] a ne a[1,2].
-
Budiž, díky za reakci. Tak jsem všechny definice vyhodil /*. Ale to nemění nic na tom, že se k prvkům stejně nemohu dostat :'(. A myslím, že zde jde obojí
- [y] i [y,x]. Jde mi o to, že všechny 3 uvedené pokusy o zápis mi píšou chybu. Teď mi to dokonce píše u
polozka_menu[2][2].jmeno[]="asd";
chybu "undefined member jmeno", přitom jsem to tam nechal jako to bylo, tedy
typedef struct menu
{ char jmeno[8];
char anone:1;
}MENU;
struct MENU polozka_menu[5][50];
-
Nejlepší by bylo, kdybys sem postnul celý kód. Takhle můžeme jenom hádat. Takže:
1. smysl dává používat
struct menu polozka_menu[5][50];
nebo
MENU polozka_menu[5][50];
Ta Tvoje deklarace je divná.
2. To přiřazování, které tam používáš (a uznávám, že může CodeVision mít nějaký prazvláštní dialekt), je IMO příkaz a tudíž v C musí být ve funkci a ne někde v headeru nebo v hlavní úrovni souboru.
3. Navíc nedává smysl, ani syntakticky a ani logicky - do již vytvořené proměnné se řetězec kopíruje pomocí strcpy() nebo něčeho takového. Pokud chceš inicializovat pole struktur při jeho vytvoření, mrkni sem, jak se to dělá: http://publications.gbdirect.co.uk/c_book/chapter6/initialization.html (http://publications.gbdirect.co.uk/c_book/chapter6/initialization.html)
4. Pokud chceš proměnnou používat v různých modulech, v headeru si ji nadeklaruj jako extern a v jednom modulu si udělej tu definici a případně inicializaci.
-
A protože mám dneska výjimečně lidumilnou náladu, uvedu malý příklad, jak to v C zhruba funguje, zbytek si musíš zjistit jinde:
#include <stdio.h>
void main(void)
{
typedef struct menu {
char jmeno[8];
char anone:1;
} MENU;
struct menu polozka_menu[2][2] = {
{{"Franta", 1}, {"Pepa", 0}},
{{"Cenek", 0}, {"Jana", 1}}
};
puts(polozka_menu[1][1].jmeno);
}
-
Možná jsem kdysi nedával pozor, možná jsem trochu unavený, ale co znamená příkaz
char anone:1;
???
Ta proměnná se opravdu má jmenovat "anone:1", nebo je to překlep a má tam být znak "="? Mám takový dojem že oboje je při deklaraci struktury špatně. A pokud má tento prvek obsahovat číselné hodnoty, nebylo by lepší použít typ int?
-
To je bitové pole; v tom problém není.
-
Tak už to funguje, bezva, díky moc. Chyba byla skutečně v tom, že ta definice nebyla ve fci, ale v headru. Já zkoušel dát do funkce definici "struct MENU polozka_menu[][50]", ale ne i tu definici struct. Přikládám test. prográmek (ořezaný). Ještě bych se zeptal, proč mi to vezme definici "polozka_menu[][50]", ale "polozka_menu[50][]" nevezme. Jinak ještě jednou dík.
#include <mega32.h>
#include <alcd.h>
#include <string.h>
void main(void)
{
typedef struct menu
{ char jmeno[15];
char anone:1;
}MENU;
struct MENU polozka_menu[][50]= {
{{"menu1",0},{"menu2",0},{"menu3",0},{"menu4",0}},
{{"submenuA1",0},{"submenuA2",0},{"submenuA3",0},{"submenuA4",0}},
{{"submenuB1",0},{"submenuB2",0},{"submenuB3",0},{"submenuB4",0},{"submenuB5",0}},
{{"submenuC1",0},{"submenuC2",0},{"submenuC3",0}}
};
while (1)
{
strcpy(polozka_menu[1][5].jmeno,"ssd");
polozka_menu[1][5].anone=0;
lcd_puts(polozka_menu[1][5].jmeno);
lcd_putchar(polozka_menu[1][5].anone);
//polozka_menu[1][5]={"ssd",0}; //takto to nejde
}
}
-
Není zač. Na tu poslední otázku nevím přesnou odpověď, ale v zásadě jde podle mě o to, že to pole musí být "obdélníkové" (aby bylo možné takové pole rozumně indexovat apod.) a zatímco tu první dimenzi si dokáže dopočítat z počtu položek, mohly by se délky jednotlivých položek v poli první dimenze lišit a kompilátor odmítá dopočítat si to podle nejdelší z nich. Teoreticky si to sice dovedu představit, ale smířil bych se s tím, že to prostě neudělá. A je samozřejmě otázka, zda to obdélníkové pole nebude i tak zbytečně řídké - všechna podmenu typicky nebudou stejně dlouhá. V takovém případě bych zvolil jinou techniku.