Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1

    [ C ] funzione per tipi non specifici

    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 è:
    codice:
    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…?

  2. #2
    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.
    www.matteosteri.it

  3. #3
    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
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  4. #4
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    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...

  5. #5
    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.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    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

  7. #7
    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
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  8. #8
    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

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423

    Re: [ C ] funzione per tipi non specifici

    Guarda ti consiglio di usare una sintassi tipo quella del printf, cioè fare così:
    codice:
    #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.

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Ho controllato. E' precisamente ANSI C.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.