Deja vu

Posted in Codare cu premeditare, Premiul n00bel on January 28th, 2011 by Mihnea

Vazindu-se din nou trasi in poze pe site-ul nostru, expertii au dat fuga la butonul de edit si au incercat sa-si corecteze “micile scapari“. Din fericire insa, doar Marius a reusit. Repetind performanta din saga dimensiunii fisierelor, Silviu ne prezinta varianta imbunatatita a tehnologiei indexarii array-urilor:

const int rows = 10, cols = 12;
unsigned char* bmp1 = new unsigned char[cols * rows];

for(int j=0;j<cols;j++)
  for(int i=0;i<rows;i++)
      bmp1[i*rows + j] = i+j;

delete [] bmp1;
bmp1 = NULL;

Nu, Silviu-Marius. Nici asa nu e bine. Apreciem faptul ca ai inversat for-urile intre ele, ca sa nu para ca ai copiat de la Marius, dar tot n-ai reusit sa iei un numar dintr-un array. Hai sa vedem daca poti sa-ti depasesti recordul anterior de 4 corecturi.

Oricum, in urma acestui esec plenar, in comunitatea expertilor au inceput sa se puna intrebari. Vazind faptul ca personaje ca viorel2005 si mesajflaviu ii tot pun in dificultate cu probleme de clasa a 5-a, unii experti au inceput sa se intrebe daca nu cumva respectivii sintem noi. Mai tineti minte cind expertii erau convinsi ca jos8cal si cu mine sintem aceeasi persoana? In curind vor ajunge sa se banuiasca si intre ei.

Edit: 1 minut. Atit i-a trebuit minerului pentru a-si curata trecutul. La 1 minut dupa ce am postat “corectura”, si-a sters de tot codul. Urmele prostiei sale se pastreaza doar in reply-ul lui viorel2005 de pe pagina urmatoare, care a inglobat aberatia minerului in aberatia proprie, dar din pacate cind a dat el quote era varianta cu “coloum”, nu asta extinsa. Nu-i nimic Silviu, noi stim, si tu stii ca noi stim, la fel cum stii ca poza din articolul asta e o reprezentare destul de fidela a modului in care-ti petreci 3 sferturi din zi.

Tags: , , , , , ,

Aventuri 2D in Valea Jiului

Posted in 112, Premiul n00bel on January 27th, 2011 by Mihnea

Dupa cum ne-a obisnuit deja, minerul nu se lasa cu una, cu doua cind spune o timpenie. El continua sa loveasca problema iar si iar, pina aceasta recunoaste ca a ascuns droguri, armament, munitie si masini de scris automate la peneteu, caci cu totii stim ca perseverenta e mama mineritului. Dupa ce i-a explicat lui viorel2005 cum sa reduca numarul de apeluri catre o functie facind parametrii sai variabile globale, a atacat chestiunea de fond, si anume o tehnologie pe care el a descoperit-o cu multi ani in urma: cum sa tii o matrice 2D intr-un array 1D. Daca va amintiti, aceasta problema a mai framintat ograda expertilor, deci clar e o chestie importanta, care ar merita FAQ-ul sau. Oricum, Silviu explica cu cuvintele lui tehnologia in cauza:

Edit: imi cer scuze, din greseala scrisesem corect “column” in subtitrari.

Tags: , , , , , , , , , ,

Sa nu-ti faci array cioplit

Posted in Codare cu premeditare on August 5th, 2010 by Mihnea

Deci imi scapa ceva, deci. Deci a facut colegu’ bascalie de Silviu “Traffic Sign Recognition” Ardelean, da’ se pare ca de fapt Silviu chiar avea dreptate propovaduind lumii tehnologia pe care tocmai o inventase. Deci sa va explic.

MVP Marius Bancila, care parea cel mai breaz dintre codexperti, a pus pe blogul dinsului o aplicatie pentru torturat oamenii cu dicromatism. Implementarea acestei aplicatii presupunea manipularea unui array bidimensional. Privind in sursele puse la dispozitie cu generozitate, observam urmatoarea abominatie:

int** m_pCells;
void Create()
{
   m_pCells = new int*[m_nSize];
   for(int i = 0; i< m_nSize; ++i)
      m_pCells[i] = new int[m_nSize];
}

Acu’ vreo doua zile imi zicea un prieten de un program scris de fizicieni care aproape si-a dublat footprintu’ cind a fost mutat pe 64 de biti din cauza ca autorii aveau genul asta de relatie contra naturii cu array-urile de pointeri. Azi vad ca problema nu e rezervata exclusiv refugiatilor din Fortran si juniorilor care aloca vertecsi cu new float[3], ci isi intinde tentaculele pina la virfurile comunitatilor de experti in C++ (auto-proclamate, ce-i drept). Acum nu ca in cazul de fata ar conta overhead-ul sau muile murmurate in barba de procesor la vederea festivalului de pointer chasing, da’ chiar imi scapa de ce ai scrie atita cod in plus, ca la sfirsit sa mearga si prost.

Avind in vedere ca tehnologia aia de tinut array-uri multidimensionale in vectori nu este atit de cunoscuta pe cit credeam, zic ca merita un loc in panoplia evidentului, adica sa fie transformata intr-un “design pattern” d-ala. Sa stea acolo la loc de cinste cu variabila globala, instructiunea switch si alte astfel de geme indispensabile inginerilor de pe tot globu’ de pamint. Ce zici bre Silviule, te bagi sa-i dai un nume in engleza?

Si daca tot am ajuns la subiectul patterns si best practices, sa observam si aceasta tehnica de programare defensiva:

CBrush* CColorMap::GetBrush(int key) const
{
   if(key < 0 || key > (int)m_brushes.size())
      throw std::exception("Invalid color key", key);

   return m_brushes[key];
}

Pe linga abila inlocuire a lui assert() cu throw, codul de mai sus demonstreaza si abila utilizare a unui constructor non-standard pentru std::exception care nu face tocmai ce se asteapta Marius sa faca. Din nefericire autorul nu s-a sinchisit sa stea si la primire, deci problema nu apuca sa se si manifeste, iar codul e chiar mai eficient in varianta asta obfuscata. Se pare ca pina la urma puroiul ala de Coelho avea dreptate.

Tags: , , , , , , , , , , , , ,