[C++] print_r comme en php !

Statut
N'est pas ouverte pour d'autres réponses.

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];
 
1er
OP
neku

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;
}
 

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
 
1er
OP
neku

neku

Codeur roumain
null a dit:
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
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");
 

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/
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut