cod naspa

Acest forum este dedicat intrebarilor de programare care nu-si au locul in unul din celelalte forumuri
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 08 Nov 2011, 19:32

Code: Select all

try 
{         
   TCHAR szFileName[ MAX_PATH ];
   if( !::GetModuleFileName( 0, szFileName, MAX_PATH ) )
      throw __LINE__;          
   DWORD nParam;         
   DWORD nVersionSize = ::GetFileVersionInfoSize( szFileName, &nParam );         
   if( !nVersionSize )                 
      throw __LINE__;          
   HANDLE hMem = ::GetProcessHeap();         
   if( !hMem )                 
      throw __LINE__;          
   LPVOID lpVersionData = ::HeapAlloc( hMem, 0, nVersionSize );
   if( !lpVersionData )
      throw __LINE__;
   if( !::GetFileVersionInfo( szFileName, 0, nVersionSize, lpVersionData ) )
      throw __LINE__;
   LPVOID pVersionInfo;
   UINT nSize;
   if( !::VerQueryValue( lpVersionData, _T("\\"), &pVersionInfo, &nSize ) )
      throw __LINE__;
   VS_FIXEDFILEINFO *pVSInfo = (VS_FIXEDFILEINFO *)pVersionInfo;
   CString strVersion;
   strVersion.Format( _T(" version %i.%i.%i.%i"),
      pVSInfo->dwProductVersionMS >> 16,
      pVSInfo->dwProductVersionMS & 0xFFFF,
      pVSInfo->dwProductVersionLS >> 16,
      pVSInfo->dwProductVersionLS & 0xFFFF);
   GetDlgItem( IDC_ABOUT_VERSION )->SetWindowText( strAppName + strVersion );
   if( !HeapFree( hMem, 0, lpVersionData ) )
      throw __LINE__; 
} 
catch( int err ) 
{
   ASSERT( !err ); // always break on debug builds to inspect error codes and such
   DWORD dwErr = ::GetLastError();
}
Note that the catch part is purely educational - in a real situation you would properly cleanup after the memory allocation and actually use the error code!



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 28 Aug 2012, 16:05

Daca tot am pus o suta de membri intr-o clasa de ca n-am pune inca unul ca sa stie tot prostu cand a fost "creat" un dialog? :)

Code: Select all

CWhateverDialog::CWhateverDialog()
{
   //...
   m_bIsCreated = FALSE;
}

BOOL CWhateverDialog::OnInitDialog()
{
   // ....
   m_bIsCreated = TRUE;
   return m_bIsCreated;
}

void CWhateverDialog::OnDestroy()
{
   // ...
   m_bIsCreated = FALSE;
   CDialog::OnDestroy();
}
Bineinteles acel CWhateverDialog::m_bIsCreated nu mai este testat nicaieri in alte parte. Normal, la ce bun?
Dar oricum, a facut totusi branza cu el returnandu-l din OnInitDialog. Jmeker, nu-i asa? :D

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2343
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: cod naspa

Post by Marius Bancila » 28 Aug 2012, 16:08

Era fain sa mai fie un flag care sa indice daca a fost distrus sau nu.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 28 Aug 2012, 16:24

Marius Bancila wrote:Era fain sa mai fie un flag care sa indice daca a fost distrus sau nu.
Nu zi "hop!", acusi gasim si flag-ul... :)
Pana una-alta, iata cum se poate obtine elegant si indubitabil si fara drept de apel un "pointer la instanta":

Code: Select all

class CWhateverDialog : public CDialog
{
   //...
   static CWhateverDialog* m_Instance;
   static CWhateverDialog* Instance() {return m_Instance;}
};

Code: Select all

CWhateverDialog* CWhateverDialog::m_Instance = NULL;

BOOL CWhateverDialog::OnInitDialog()
{
   m_Instance = this;
   //...
}
CWhateverDialog::~CWhateverDialog
{
   m_Instance = NULL;
   //...
}
Cool! :D

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 28 Aug 2012, 17:12

Si-acum, iata cum se poate intari prietenia intre parinti si copii:

Code: Select all

class CWhateverCtrl : public CStatic
{
   friend class CWhateverDialog;
public:
   CWhateverDialog *m_pParent;
   //...
};

Code: Select all

class CWhateverDialog : public CDialog
{
   friend class CWhateverCtrl;
public:
   CWhateverCtrl m_ctrl;
   // ...
};
Bineiteles, tot ce misca in CWhateverCtrl si CWhateverDialog e... public.
Mai ceva ca la Facebook. Daca v-a placut, dati Like si Share! :biggrin:

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: cod naspa

Post by Silviu Ardelean » 28 Aug 2012, 18:07

Ovidiu Cucu wrote:Bineiteles, tot ce misca in CWhateverCtrl si CWhateverDialog e... public.
Mai ceva ca la Facebook. Daca v-a placut, dati Like si Share! :biggrin:
N-ai idee cat de mult imi lipseste butonul de Like. Nu ar fi prima data cand l-as folosi.
Imi place prietenia! :thumbup:

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: cod naspa

Post by bu7ch3r » 28 Aug 2012, 22:43

Aia cu Instance() imi aduce aminte de baieti care aveau ceva probleme de sincronizare si vroiau sa fie siguri ca au dialog cand inchid aplicatia :)
Cu stima,
Lupu Claudiu

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 28 Sep 2012, 19:32

Dupa indelungi cautari, am gasit in sfarsit clasa CError suprema. :)

Code: Select all

class CError
{
   BOOL m_answer;
   CString m_error;
public:
   CError();
   virtual ~CError();
   void set_error() {m_answer = FALSE;}
   void reset_error() {m_answer = TRUE;}
   BOOL is_error() {return !m_answer;}
   void add_error(CString text_error);
   const CError& operator = (const CError& error);
   int message_error() {::MessageBox(NULL, m_error, _T("Error"), MB_ICONERROR);}  
};
Nu bag si detalii de implementare, nu vreau sa aiba nimeni cosmaruri.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 28 Sep 2012, 20:15

Tocmai am aflat ce este de facut in caz ca a papat pisica CString::Trim (sau CString::TrimLeft si CString::TrimRight) din MFC:

Code: Select all

   // trim the LF and CR in the begin
   while(strText.GetAt(0) == '\r' || strText.GetAt(0) == '\n')
   {
      strText.Delete(0);
   }

   // reverse text
   strText.MakeReverse();

   // trim the LF and CR in the end
   while(strText.GetAt(0) == '\r' || strText.GetAt(0) == '\n')
   {
      strText.Delete(0);
   }

   // reverse text again
   strText.MakeReverse();
Solutia este utila si daca suntem platiti la numarul de linii. :)

User avatar
Knuth
Junior
Junior
Posts: 15
Joined: 02 Feb 2012, 12:17
Judet: Hunedoara
Contact:

Re: cod naspa

Post by Knuth » 29 Sep 2012, 17:25

Creativ, dar nu se compara cu urmatoarea implementare de atoi() pe care am vazut-o mai demult:

Code: Select all

int atoi(const char *pChar)
{
   int ret_val = 0, length = 0;
   bool isNegative =  (*pChar == '-') ? true : false;

   if (!isNegative && (*pChar < '0' || *pChar > '9'))
      return 0;

   while (*pChar != '\0')
   {
      if ((isNegative && length == 1 && (*pChar != '-') && (*pChar < '0' || *pChar > '9')) ||
         (length > 0 && (*pChar < '0' || *pChar > '9'))) // invalid char inside of string
            break;

      length++;
         pChar += sizeof(char);   // [sic] - remains for wide - char
   } 

   bool isFirst = false;   
   int decimal = 0;

  // simple way:  pChar -= length; 
   while (length > 0)
   {
      decimal = 1;
      if (isNegative) 
      {
         if (!isFirst)
         {
            length--;
            if (0 == length)
               break;
         }

         isFirst = true;
      }

      for (int i = 1; i < length; i++)
         decimal *= 10;

                
      ret_val +=   decimal * (int(*(pChar - length) - '0') % 10);   // maybe to much pointers arithmetics ;) just for fun
      length--;
   }

   if (isNegative)
      ret_val *= -1;

   return ret_val;
}

0ptr
Membru
Membru
Posts: 71
Joined: 01 Feb 2011, 23:27
Judet: Ilfov

Re: cod naspa

Post by 0ptr » 29 Sep 2012, 23:19

Knuth wrote:Creativ, dar nu se compara cu urmatoarea implementare de atoi() pe care am vazut-o mai demult:
Nu-mi place sa fiu avocatul nimanui, dar intre implementarea ce-o citezi tu aici si celelalte exemple din acest thread cred ca exista o diferenta: exemplul cred ca e facut in joaca "ca la interviu" iar restul perlelor par a fi culese din proiecte reale. Din ce am vazut la acel topic si alte implementari au hibele lor, dar cred ca e frumos sa ne aratam cu degetul pe aici. ;)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 30 Sep 2012, 07:24

Knuth wrote:Creativ, dar nu se compara cu urmatoarea implementare de atoi() pe care am vazut-o mai demult:

Code: Select all

int atoi(const char *pChar)
{
[...]
Intr-adevar, naspa tare! Trebuia in primul rand testat daca pChar e NULL (0) sau aproape NULL (0x1, 0x2 etc).
In caz ca da, trebuia afisat un mesaj-box, scris in log si (optional) trimis un rapot la server. :)

User avatar
Knuth
Junior
Junior
Posts: 15
Joined: 02 Feb 2012, 12:17
Judet: Hunedoara
Contact:

Re: cod naspa

Post by Knuth » 30 Sep 2012, 09:14

0ptr wrote: Nu-mi place sa fiu avocatul nimanui, dar intre implementarea ce-o citezi tu aici si celelalte exemple din acest thread cred ca exista o diferenta: exemplul cred ca e facut in joaca "ca la interviu" iar restul perlelor par a fi culese din proiecte reale.
Bazindu-ma pe ce am mai vazut si auzit, eu cred ca autorul ar fi scris acelasi cod si intr-un "proiect real". De altfel, nu vad de ce "la interviu" ai vrea sa treci de 2 ori prin string, sa exponentiezi la fiecare pas, sa bagi un modulo inutil, sa scrii conditiile alea superbe, sa testezi daca booleanu' e boolean etc., daca ai sti ca de fapt nu se face asa.

In alta ordine de idei, inca una, dintr-un "proiect real" de data asta:

Code: Select all

for(iterDynMenu it = m_menuMap.begin(); it != m_menuMap.end(); ++it)
{
    if (it->first == nMapKey)
    {
        // key exists and should be changed
        m_menuMap[nMapKey].bIsVisible = bFlag;
        bRet = true;
        break;
    }
}
Cind colegii si-au exprimat dubiile asupra eficientei acestei manevre, autorul s-a scuzat ca pe vremea cind a scris codul nu aflase inca de std::find_if(), dar ca acum l-ar folosi si ar rezolva problema. Colegii nu se puteau opri din ris.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: cod naspa

Post by Ovidiu Cucu » 01 Oct 2012, 08:24

Knuth wrote:[...]
Cind colegii si-au exprimat dubiile asupra eficientei acestei manevre, autorul s-a scuzat ca pe vremea cind a scris codul nu aflase inca de std::find_if(), dar ca acum l-ar folosi si ar rezolva problema. Colegii nu se puteau opri din ris.
Razi tu razi Harap Alb, dar fata Imparatului Ros o implementeaza acum cu Linq, Lambda, Gof si din cand din cand cu toti pointerii din familia lui Smart. :biggrin:

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: cod naspa

Post by bu7ch3r » 01 Oct 2012, 09:05

Fata Imparatului Ros sa-si bage mintile-n cap si sa gandeasca inainte sa scrie cod sau....sa se marite:)

Code: Select all

try
{ 
    m_menuMap.at(nMapKey).bIsVisible = bFlag; 
}
catch(...)//out_of_range something
{
   //try again :))
}
Cu stima,
Lupu Claudiu

Post Reply