pondělí 28. listopadu 2011

Dvourozměrné pole o různé délce

Mám tu pevně dané ale různé velikosti několik desítek proměnných, které potřebuju spravovat.

unsigned char SIZES[] = {1,5,14,3,...};

Umístit si je do pole, resp. pole polí je velice nešikovné, protože bych vše musel dimenzovat na největší proměnnou.

unsigned char variables[N][max_size]

Při porovnání proměnné 1 s proměnnou 3 tímto přístupem ztrácím 13 bajtů.
Uspornější bude vytvořit si pole pointerů které ukazují na dané proměnné, ty alokuju dynamicky přesně podle definované délky.

unsigned char *pVariables[N];
for(i=0;i<N;i++)
   pVariables[i] = new unsigned char[SIZES[i]];

čtvrtek 25. srpna 2011

Python: Setřídění slovníku

Tohle je asi docela obvyklá struktura, jméno prvku a jeho paramatry.

dict = { 
  "time"    : {"tabName":"cas", "dbName":"time", "width":40}, 
  "address" : {"tabName":"adresa", "dbName":"address", "width":30}, 
  "number"  : {"tabName":"cislo", "dbName":"number", "width":35} 
}
Slovník sám o sobě je v pythonu 2.x netříditelný.
Takže nedrží ani tvar v kterém jsme ho definovali.

print dict 

>>> 
{
'address': {'width': 30, 'tabName': 'adresa', 'dbName': 'address'},
'time'    : {'width': 40, 'tabName': 'cas', 'dbName': 'time'}
'number'  : {'width': 35, 'tabName': 'cislo', 'dbName': 'number'}, 
}


řešení spočívá v převodu na list metodou items() a třídění pomocí
lambda funkce

print sorted(dict.items(), key = lambda (k,v): (v["width"])) 

>>> 
[
('address', {'width': 30, 'tabName': 'adresa', 'dbName':'address'}), 
('number' , {'width': 35, 'tabName': 'cislo', 'dbName':'number'}), 
('time'   , {'width': 40, 'tabName': 'cas', 'dbName':'time'})
] 

paramater key je funkce, které se předávají prvky listu a vrací hodnotu pro abecední třízení.

C/C++: Chyba a její příčina

Chybu v následujícím kódu odhalíte snadno, ale proč je výpis při chybě takový jaký je?

Definujme typ struktura o 3 bytových položkách..

typedef struct
{
  byte polozka1;
  byte polozka2;
  byte polozka3;
} tStructure;

a funkci pro její naplnění

void setStructure(tStructure *p_structure){
 byte a = 55;
 byte b = 66;
 
 getStructure();  //jen výpis
 p_structure->polozka1 = 11;
 getStructure();  //jen výpis 
 p_structure->polozka2 = 22;
 getStructure();  //jen výpis 
 p_structure->polozka3 = a + b;
 getStructure();  //jen výpis 
}

samotný kód jsem potom napsal takhle..
tStructure *p_structure;  //pointer na strukturu

setStructure(p_structure);

Funkce **getStructure()** slouží jen v výpisu a ten vypdal následovně..


00 00 00 //na začátku
11 00 00 //po zápisu do polozka1
11 22 00 //po zápisu do polozka2
55 66 BB //po zápisu do polozka3


Proč není po posledním zápisu obsah struktury 11 22 BB, tak jak jsem očekával?

Proč je tam zrovna to, co tam je?

Já myslím, že vím :D

čtvrtek 18. srpna 2011

C/C++: Callback ve struktuře

Tsha,
musím říct, že jsem byl skálopevně přesvědčen, že ze syntaxe céčka znám vše podstatné.

Nechť vznikne struktura, v které je pointer na funkci, třeba nějáký callback. V téhle funkci chci mít k dispozici data z této struktury a tak si jí předám jako parametr, resp. pointer na ní.
#include <stdio.h>  
#include <stdlib.h>   
struct tMYSTRUCTURE;   
typedef struct{  
    int myint;
    void (* pCallback)(struct tMYSTRUCTURE *mystructure);
}tMYSTRUCTURE;
Žádná velká věda, definujme ještě nějákou tu funkci..
void myCallback(struct tMYSTRUCTURE *mystructure){
    puts("!!!Hello World!!!");
}
a konečně vytvořme strukturu a zavolejme callback..
int main(void) {

    //vytvoření struktury
    tMYSTRUCTURE mystruct;

    //přirazení funkce
    mystruct.pCallback = myCallback;

    //zavolání funkce
    mystruct.pCallback(&mystruct);

   return EXIT_SUCCESS;
}


..\src\retyping.c:31:5: warning: passing argument 1 of 'mystruct.pCallback' from incompatible pointer type

..\src\retyping.c:31:5: note: expected 'struct tMYSTRUCTURE *' but argument is of type 'struct tMYSTRUCTURE *'

Marně jsem vzpomínal na Herouta a na pojmy název struktury a název typu. Snad vždy jsem si vystačil s konstrukcí

typedef struct{
    ..
    ..
}tSTRUCT 
Až s pomocí stackoverflow jsem dal dohromady řešení, které překladač přechroustá bez reptání.

čtvrtek 20. ledna 2011

Python: metoda Join()

Metodu Join() je dobré znát.
Osvědčila se mi při všemožných výpisech, při generování různých řetězců nebo například při poskládání záznamů do formátu CSV.

list = ["A","B","C"]

print ",".join(list) #list stringů


Výpis

A,B,C

Pro nestringový list musím použít ještě přetypování

print ",".join(str(x) for x in list)