středa 15. ledna 2014

Vypsání hodnoty #define preprocesorem jako #pragma message


#define MSG1 0x58
#define MSG1 13


#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)


#pragma message "msg1 = " STR(MSG1)
#pragma message "msg2 = " STR(MSG2)

Zapouzdření enum

Dlouhé roky jsem používal klasický enum kde před podtržítkem, jsem si držel význam toho enumu a bránil se tak i duplicitě např. NONE je velmi časté.

typedef enum {
  QUALITY_NONE = 0,  
  QUALITY_BAD,
  QUALITY_GOOD,
  QUALITY_EXCELENT
} eQuality;

Ale nedávno jsem objevil nový, lepší způsob jak toto zapsat a sice..
struct QUALITY{ enum{NONE = 0, BAD, GOOD, EXCELENT};};
Použití je potom
QUALITY::NONE

čtvrtek 5. ledna 2012

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