PDA

Visualizza la versione completa : [ C ] funzione per tipi non specifici


FastMagister
17-12-2004, 17:43
Ciao a tutti.

Ho bisogno di scrivere una funzione C che effettui il confronto tra due parametri passati in ingresso e ritorni il valore 0 se questi sono uguali, ritorni un valore negativo se il primo parametro < del secondo e ritorni un valore positivo se primo parametro > secondo parametro.
Il problema è che questa stessa funzione deve poter essere richiamata sia passandogli 2 stringhe, ma anche passandogli 2 interi (in pratica non deve essere scritta per uno specifico tipo…). E’ ovvio quindi che vi sarà un altro parametro che indichi il tipo dei 2 parametri da confrontare.
Il codice che ho scritto è:


int Confronta(void *elem1, void *elem2, int codiceTipo)
{
int x;
switch(codiceTipo)
{
case 1: x = strcmp((char *)elem1,(char *)elem2);
break;
case 2: if((int )elem1 < (int )elem2)
x = -1;
else
if((int )elem1 == (int )elem2)
x = 0;
else
if((int )elem1 > (int )elem2)
x = 1;
break;
}
return x;
}


Questo funziona quando la richiamo passandogli 2 stringhe, ma non quando gli passo 2 interi…

Qualcuno saprebbe illuminarmi…?

tommisceddu
17-12-2004, 18:16
perchè invece alla funzione non passi 5 parametri invece che 3?

ovvero li passi comunque sempre due interi e due stringhe, quando hai la necessità di passarli due interi, i parametri stringhe saranno delle stringhe vuote, metre se devi passare le stringhe metti i parametri interi ad un valore preciso al di fuori del range (0, -1 ...)

se devi lavorare solo con delle stringhe e degli interi potrebbe andar bene , se invece devi lavorare anche su altri tipi di dati allora no. :bhò:

unomichisiada
17-12-2004, 19:32
Non funziona perchè nella partre relativa al confronto tra interi tu consideri i puntatori ad interi invece dovresti fare un'indirezione su di essi ('*' applicato al nome del puntatore) per confrontare i VALORI da essi puntati.Con le stringhe funge perchè strcmp pensa a tutto lei

FinalFantasy
17-12-2004, 19:38
Problema facilmente risolvibile...fai due funzioni usando l'overloadig...fai questi prototipi e poi scrivi i codici:

int Confronta(char Stringa1[],char Stringa2[], int codicetipo);
int Confronta(int numero1,int numero2, int codicetipo);

Il compilatore andrà a prendere la funzione a seconda se i parametri passati sn stringhe o interi...

unomichisiada
17-12-2004, 19:47
Originariamente inviato da FinalFantasy
Problema facilmente risolvibile...fai due funzioni usando l'overloadig...fai questi prototipi e poi scrivi i codici:

int Confronta(char Stringa1,char Stringa2, int codicetipo);
int Confronta(int numero1,int numero2, int codicetipo);

Il compilatore andrà a prendere la funzione a seconda se i parametri passati sn stringhe o interi...
si ovviamente questa è la soluzione migliore,solo che mi sa che lui ha proprio bisogno di fare un'UNICA funzione.Se non è così il mio consiglio per lui è di usare la tua soluzione.

FinalFantasy
17-12-2004, 19:52
beh...l'overloading è fatto a posta per far 2 funzioni, come se fossero una sola, andando a prendere quella più adatta in base ai parametri e al tipo di dato che deve restituire

unomichisiada
17-12-2004, 20:00
Originariamente inviato da FinalFantasy
beh...l'overloading è fatto a posta per far 2 funzioni, come se fossero una sola, andando a prendere quella più adatta in base ai parametri e al tipo di dato che deve restituire
Si questo lo so benissimo,ma di metodi ne deve comunque scrivere 2,bisogna vedere per quale motivo lui ha questo vincolo però.Ciao

FastMagister
18-12-2004, 12:08
Il problema è proprio che ho quel vincolo di dover scrivere 1 unica funzione, ed inoltre, per semplicità, qui ho scritto che devo poter lavorare o su interi o su stringhe, ma in realtà la scelta è anche fra altri tipi di dati (due date, due float...), quindi passare più di 3 parametri mi sembra una soluzione non percorribile...

La soluzione con i puntatori a void credo sia la più "elegante", ma è fattibile? Come avete osservato, con gli interi, per come l'ho scritta confronta gli indirizzi e non i valori. Come posso fare?

Grazie cmq a tutti x gli interventi

pprllo
18-12-2004, 12:19
Guarda ti consiglio di usare una sintassi tipo quella del printf, cioè fare così:


#include <stdarg>

int compare(int i, ...)
{
int r;
va_list p;
va_start(p, i);
switch(i)
{
case 1: r = strcmp(va_arg(p, char*), va_arg(p, char*)); break;
case 2: r = (va_arg(p, int) - va_arg(p, int)); break;
}
va_end(p);
return r;
}


Che io ricordi stdarg è C, ed è decisamente il modo più elegante ed efficiente.

pprllo
18-12-2004, 12:20
Ho controllato. E' precisamente ANSI C.

Loading