forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
Struktura v C pod jinou strukturou, která def. velikost polí

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Jiné mikrokontroléry, procesory, hradla
 
hazardrok
Profesionál
Profesionál


Založen: 16.1.2012
Příspěvky: 132

PříspěvekZaslal: 16 březen 2013, 0:26    Předmět: Struktura v C pod jinou strukturou, která def. velikost polí Citovat

Ahoj, mám jeden pro mě zapeklitý problém se strukturama. Rád bych vytvořil strukturu podobnou příkladu:

kód:

typedef struct{
  unsigned char RAM_READ[pocet_1];       
  unsigned char RAM_WRITE[pocet_2];
  }MEMORY_MAP;
MEMORY_MAP slave_jednotka_1..... slave_jednotka_n


Ale chtěl bych, aby kazda promena slave_jednotka_x mela jiny pocet_1 nebo pocet_2. Řekněme, že by tato struktura byla v jine struktuře a ta by definovala jak velká budou tato pole. Je něco takového v céčku možné, nebo je to pitomost? Díky za radu

Arrow administrator: přesunuto z "Ostatní"

Arrow administrator: přejmenováno z "Struktury v Cčku"
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Panda38
Profesionál
Profesionál


Založen: 18.9.2012
Příspěvky: 398
Bydliště: Praha, Most

PříspěvekZaslal: 16 březen 2013, 9:32    Předmět: Citovat

Nemůže to být statické pole (protože by byla proměnlivá velikost struktury), musí se použít dynamicky alokovaná pole:
kód:
typedef struct{
  unsigned char* RAM_READ;
  unsigned char* RAM_WRITE;
  }MEMORY_MAP;
MEMORY_MAP slave_jednotka_1..... slave_jednotka_n

Při inicializaci struktury se vytvoří pole pomocí malloc:
slave_jednotka_n->RAM_READ = (unsigned char*)malloc(n*sizeof(unsigned char));
slave_jednotka_n->RAM_WRITE = (unsigned char*)malloc(n*sizeof(unsigned char));

Při rušení struktury se musí pole zrušit pomocí free:
free(slave_jednotka_n->RAM_READ);
free(slave_jednotka_n->RAM_WRITE);

K prvkům pole se pak přistupuje jako k statickému poli:
slave_jednotka_n->RAM_READ[i]

Taková struktura pak může být součástí jiných struktur, velikost polí je modifikovatelná.

Jiná alternativa - spíš se tato problematika řeší jinak. Aby se nemusela pole alokovat (jednak manažer paměti spotřebovává pro bloky nějakou paměť navíc a jednak je s tím obtížná manipulace), tak se použijí větší pole, pro max. velikost, a ztracená paměť se oželí (jinak se s tím pracuje stejně, jako s menším polem, nevadí že má rezervu):
kód:
#define MAP_MAX 10
typedef struct{
  unsigned char RAM_READ[MAP_MAX];
  unsigned char RAM_WRITE[MAP_MAX];
  }MEMORY_MAP;
MEMORY_MAP slave_jednotka_1..... slave_jednotka_n
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Jiné mikrokontroléry, procesory, hradla Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2017 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)