Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

GLib: Pole (3)

Dnešním pokračováním završíme výklad o polích knihovny GLib. Probereme si práci s automaticky rostoucími poli bajtů.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Pole bajtů je speciálním případem polí, definovaných strukturou GArray (viz GLib část 9.). Automaticky rostoucí pole bajtů je definováno strukturou:

struct GByteArray
{
  guint8 *data;
  guint   len;
};

Jako obvykle, data je naše pole bajtů, se kterým se může pracovat jako s obyčejným céčkovským polem, len pak zase aktuální délka pole. Funkce pro práci s GByteArray  jsou analogické s funkcemi pro práci s  GArray (GLib část 9.) či GPtrArray (GLib část 10.), proto dnes jen velice v krátkosti:

Vytvoření pole GByteArray

Nové „nafukovací“ pole bajtů ( GByteArray) se vytvoří zavoláním funkce

GByteArray* g_byte_array_new(void); 

Přidávání položek do pole GByteArray

Pro ukládání položek do pole bajtů slouží následující dvě funkce.

GByteArray* g_byte_array_append(GByteArray *array,
                                const guint8 *data, guint len);

GByteArray* g_byte_array_prepend(GByteArray *array,
                                 const guint8 *data, guint len);

Funkce g_byte_array_append() slouží k přidání položek na konec pole, zatímco g_byte_array_prepend() ukládá prvky na začátek pole (všechny ostatní položky se posunou).

V obou případech platí, že array je cílové pole, data je pointer na pole vkládaných dat (popřípadě pointer na jeden prvek) a len pak počet bajtů, které se mají do pole přidat. Funkce tedy do pole array přidají len bajtů od adresy uložené v pointeru data. Pole array se podle potřeby zvětší.

GByteArray* g_byte_array_set_size(GByteArray *array,
                                  guint length);

…nastaví velikost pole array na hodnotu length. Je-li length větší, než aktuální velikost pole, vytvoří se na konci patřičný počet nových položek. Je-li argument length naopak menší než délka pole array, dojde k oříznutí pole na stanovenou velikost. Nově vytvořené položky se neinicializují, budou tedy mít náhodnou hodnotu.

Odstraňování položek z GByteArray

GByteArray* g_byte_array_remove_index(GByteArray *array,
                                      guint index);

…z pole array odstraní prvek s indexem index. Položky za tímto prvkem se posunou na jeho místo.

Funkce:

GByteArray* g_byte_array_remove_index_fast(GByteArray *array,
                                           guint index);

…je „rychlejší“ variantou funkce g_byte_array_remove_index(). Tato funkce odstraní index-tý prvek pole array tak, že na jeho místo přesune poslední položku. Ušetří se tak čas, protože není nutno přesouvat všechny prvky za tímto indexem o pozici dopředu. Nevýhodou však zůstává nedodržení pořadí prvků v poli.

Odkazování se na položky pole GByteArray

Pro přístup k položkám je dobré používat makro g_array_index(a,t,i), které bylo důkladně popsáno v deváté části. Pro rychlost jen připomenu, že se toto makro rozvine do kódu, ve kterém a znamená zdrojové pole, t typ uložených prvků (v našem případě vždy guint8) a i index požadované položky.

Škoda jen, že tvůrci knihovny GLib zapomněli jaksi pro úplnost dodefinovat makro g_byte_array_index(), které by se pro tento účel používalo. Mohlo by vypadat třeba takto:

#define g_byte_array_index(a,i)   (((guint8*) (a)->data) [(i)])

Uvolnění GByteArray z paměti

void g_byte_array_free(GByteArray *array,
                       gboolean free_segment);

Tato funkce uvolní pole array z paměti. Je-li argument free_segment roven TRUE, dealokuje také veškerá data.

Michal Burda

Michal Burda

Michal Burda vystudoval informatiku a aplikovanou matematiku a nyní pracuje na Ostravské univerzitě jako odborný asistent. Zajímá se o data mining, Javu a Linux.

Školení: Návrh a používání MySQL databáze

 

Naučte se používat jednu z nejrozšířenějších databází. Dozvíte se vše potřebné od návrhu až po samotné využití MySQL v projektech.

Školení pro všechny, kteří se chtějí naučit efektivně pracovat s MySQL nebo se v práci s touto databází zlepšit.

Přihláška a podrobné informace

Ohodnoťte jako ve škole:
Průměrná známka 3,18

Přehled názorů

Zatím nebyl přidán žádný názor. Přidejte svůj názor jako první.

       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem