[C++] print_r comme en php !

Discussion dans 'Web, design' créé par neku, 18 Janvier 2008.

Statut de la discussion:
Fermée.
  1. Offline
    neku Codeur roumain
    Voici un fonction écrite en C++ permettant d'avoir un affichage des variables tableau un peu comme en php, ce n'est pas exactement la même chose, mais cela s'en approche.

    Code:
    template<typename _T> void func_print_r(const char* varname, _T result) {
    	if (*result) {
    		int i = 0;
    		std::cout << varname << " (" << (void*)*result << ") = {" << std::endl;
    		while ((*result)[i] && !IsBadReadPtr((*result)[i], sizeof(_T))) {
    			std::cout << "\t[" << i << "] " << "(" << (void*)&(*result)[i] << ")" << " => " << (*result)[i] << std::endl;
    			i++;
    		}
    		std::cout << "}[" << i << "];" << std::endl;
    	}
    }
    #define print_r(ptr) func_print_r(#ptr + 1, ptr)
    voici des exemples de sortie

    Code:
    	int ent[10] = {18, 35, 345, 2, 235, 634, 222, 2, 9, 19};
    	print_r(&ent);
    
    	char* toto = "coucou";
    	print_r(&toto);
    Code:
    ent (0xbffff7ac) = {
    	[0] (0xbffff7ac) => 18
    	[1] (0xbffff7b0) => 35
    	[2] (0xbffff7b4) => 345
    	[3] (0xbffff7b8) => 2
    	[4] (0xbffff7bc) => 235
    	[5] (0xbffff7c0) => 634
    	[6] (0xbffff7c4) => 222
    	[7] (0xbffff7c8) => 2
    	[8] (0xbffff7cc) => 9
    	[9] (0xbffff7d0) => 19
    }[10];
    toto (0x2da3) = {
    	[0] (0x2da3) => c
    	[1] (0x2da4) => o
    	[2] (0x2da5) => u
    	[3] (0x2da6) => c
    	[4] (0x2da7) => o
    	[5] (0x2da8) => u
    }[6];
    
    cela fonctionne aussi avec un char** / char*[] (comme argv[] (2eme arguments de la fonction main))

    Code:
    Nekuz0r:Desktop neku$ ./test coucou a tous
    
    print_r(&argv);
    
    Code:
    argv (0xbffff7e4) = {
    	[0] (0xbffff7e4) => ./test
    	[1] (0xbffff7e8) => coucou
    	[2] (0xbffff7ec) => a
    	[3] (0xbffff7f0) => tous
    }[4];
    neku, 18 Janvier 2008
    #1
  2. Offline
    neku Codeur roumain
    Pour les personnes comme moi, ne travaillant pas spécialement sous windows, voici une fonction équivalente à IsBadReadPtr de windows.

    Code:
    #include <setjmp.h>
    #include <signal.h>
    
    unsigned char g_ucCalledByTestRoutine = 0;
    jmp_buf g_pBuf;
    void MemTestHandler ( int nSig) {
         if (g_ucCalledByTestRoutine) longjmp (g_pBuf, 1);
    }
    
    bool IsBadReadPtr(const void* pv, unsigned long ulSize) {
        char* pc;
        void(*pPrev) (int sig);
        g_ucCalledByTestRoutine = 1;
        if(setjmp(g_pBuf)) {
             return true;
        }
        pPrev = signal (SIGSEGV, MemTestHandler);
        pc = (char*)malloc(ulSize);
        memcpy (pc, pv, ulSize);
        free(pc);
        g_ucCalledByTestRoutine = 0;
        signal (SIGSEGV, pPrev);
        return false;
    }
    
    neku, 18 Janvier 2008
    #2
  3. Offline
    null ose();
    J'ai juste une petite question :

    Code:
    #define print_r(ptr) func_print_r(#ptr + 1, ptr)
    Il sert à quoi le "#" devant "ptr" ?

    Merci :p
    null, 20 Janvier 2008
    #3
  4. Offline
    neku Codeur roumain
    a transformer l'argument en chaine de caractère

    donc :

    exemple :

    un macro print:
    #define print(text) printf("%s", #text);

    utilisation : print(coucou);

    tu remarquera que j'ai pas mis de (") autour de coucou
    car le résultat de la macro est printf("%s", "coucou");
    neku, 20 Janvier 2008
    #4
  5. Offline
    foobar42 Touriste
    Code:
    #include <errno.h>
    #include <unistd.h>
    
    bool isBadReadPtr(void *ptr) {
      return access((char*)ptr, 0) == -1 && errno == EFAULT;
    }
    http://www.gcu.info/1604/2005/08/24/non-ce-n-est-pas-sale%21/
    foobar42, 21 Janvier 2008
    #5
Statut de la discussion:
Fermée.