CodeVision, pole, struct

daew

CodeVision, pole, struct
« kdy: 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.
« Poslední změna: 02. 02. 2011, 14:20:15 od Petr Krčmář »


Inkvizitor

Re: CodeVision, pole, struct
« Odpověď #1 kdy: 02. 02. 2011, 13:34:31 »
Konstrukce #define slouží k definici makra a ne k plnění hodnot do pole nebo struktury, člověče...

Inkvizitor

Re: CodeVision, pole, struct
« Odpověď #2 kdy: 02. 02. 2011, 13:36:42 »
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].

daew

Re: CodeVision, pole, struct
« Odpověď #3 kdy: 02. 02. 2011, 14:19:40 »
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];

Inkvizitor

Re: CodeVision, pole, struct
« Odpověď #4 kdy: 02. 02. 2011, 22:54:16 »
Nejlepší by bylo, kdybys sem postnul celý kód. Takhle můžeme jenom hádat. Takže:

1. smysl dává používat

Kód: [Vybrat]
struct menu polozka_menu[5][50];
nebo

Kód: [Vybrat]
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

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.


Inkvizitor

Re: CodeVision, pole, struct
« Odpověď #5 kdy: 02. 02. 2011, 23:02:50 »
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:

Kód: [Vybrat]
#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);
}

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re: CodeVision, pole, struct
« Odpověď #6 kdy: 02. 02. 2011, 23:36:56 »
Možná jsem kdysi nedával pozor, možná jsem trochu unavený, ale co znamená příkaz
Kód: [Vybrat]
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?

Inkvizitor

Re: CodeVision, pole, struct
« Odpověď #7 kdy: 03. 02. 2011, 00:09:07 »
To je bitové pole; v tom problém není.

daew

Re: CodeVision, pole, struct
« Odpověď #8 kdy: 03. 02. 2011, 11:58:35 »
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.
Citace
#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

      }
}

Inkvizitor

Re: CodeVision, pole, struct
« Odpověď #9 kdy: 03. 02. 2011, 21:38:19 »
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.