PDA

Visualizza la versione completa : [c/c++] Rendere la malloc parametrica rispetto al tipo di ritorno


anx721
19-04-2004, 13:32
Salve, c' un modo che posso seguire per rendere la malloc parametrica rispetto al tipo di ritorno in c/c++? In pratica io vorrei poter fare qlcosa del tipo:

int * = mymalloc(10 * sizeof(int));

e fare in modo che la mymalloc restituisca direttamente un puntatore castato a puntatore a int, in modo che se compilo come c++ non mi da problemi.


Con i template si potrebbe fare qlcosa? Non sono molto ottimista, visto che penso che non si e in grado di scegliere la giusta istanza solo in base al tipo di ritorno. Comunque se avete idee postatele!

:ciauz:

Invio
19-04-2004, 14:51
Prova a usare new che rispetto a Malloc calcola automaticamente
la dimensione del tipo da allocare, pertanto non serve usare sizeof
in pi restituisce automaticamente il giusto tipo di puntatore
eliminando il problema della conversione di tipo.

int *p = new int[10];

:ciauz:

anx721
19-04-2004, 17:43
Si lo so che potrei usare altro, se per questo potrei mettere appositamente il casting, il fatto e che devo compilare dei file con funzioni c come c++ senza modificarli direttamente, ma eventualemte riuscendo a ridefinire le funzioni che mi danno problemi.

zaknafein
19-04-2004, 22:12
Definisci una funzione cosi:

int *intMalloc(size_t size) {
return (int *) malloc(size * sizeof(int));
}

In questo modo crei una funzione che inserendo il numero di int che vuoi ottenere restituisca automaticamente un puntatore ad intero con la dimensione calcolata. Se sostituisci a int qualsiasi altro parametro puoi ottenere delle malloc personalizzate per qualsiasi tipo di dato :)

Se vuoi inoltre che i dati siano inizializzati a zero puoi sostituire malloc con calloc in questo modo:

int *intCalloc(size_t size) {
return (int *) calloc(size * sizeof(int));
}

:D

anx721
19-04-2004, 22:36
Si, ma il problema che i file sorgenti devono mantenere le originarie istruzioni malloc

int *p = malloc (...)

e ridefinire la malloc per mezzo di una macro in modo che venisse sotituita da una mia funzione che automaticamente mirestituisce il tipo giusto. Ma non si uo fare :(

zaknafein
19-04-2004, 22:44
Si, devi usare le direttive al preprocessore:

#define MyIntMalloc(variabile) (int *)malloc(variabile)

anx721
20-04-2004, 01:36
Originariamente inviato da zaknafein
Si, devi usare le direttive al preprocessore:

#define MyIntMalloc(variabile) (int *)malloc(variabile)

Ma nel file sorgente nessuno usa MyIntMalloc, nel file sorgente ci sono solo chiamate a malloc; l'obiettivo era proprio fare qlcosa come:

#define malloc(a) myMalloc(..)

dove myMalloc dovrebbe essere una funzione che restituisce il giusto tipo di ritorno in base al tipo della variabile che riceve il suo risultato; ma non si puo fare perche appunto non si puo determintare quale versione di myMalloc usare solo in base al tipo di ritorno.

:ciauz:

Loading