|
|
|
|
Strumenti |
04-04-2020, 08:09 | #1 |
Junior Member
Iscritto dal: Jan 2020
Messaggi: 17
|
Teoricamente parlando funzioni C- come posso farlo?!
Salve,
ho bisogno di creare una funzione di confronto che da la possibilità di scegliere (come argomento) su diversi tipi di valori su cui fare il paragone. Mi sorge la domanda di poter passare il valore come argomento VOID e poi all'interno della funzione cambiare il tipo di valore in base a quello scelto. Questo per evitare di creare più funzioni per tipo che svolgono lo stesso compito. Mi spiego meglio: supponiamo che la funzione sia Codice:
struct confronto(struct s1,structs2, void * valore){ //èpossibile passare il valore void qualunque esso sia il tipo fuori dalla funzione? //è possibile cambiare il tipo a Void valore qui all'interno per un corretto uso? return struct; } Come sempre grazie per l'attenzione ! Ultima modifica di 9abs : 04-04-2020 alle 08:15. |
04-04-2020, 08:27 | #2 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3594
|
se ho capito bene, potresti farne anche una sola con tutti gli argomenti che desideri e semplicemente se non sono obbligatori
if(parametro100 == nulla) continua lo stesso nn sos e ho reso l'idea. Ovviamente se servono la strada è scriverne n. |
06-04-2020, 10:17 | #3 |
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2275
|
mhh non so se ho ben capito il problema, ma se invece di passare il valore passassi direttamente la funzione di confronto?
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
07-04-2020, 19:31 | #4 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
Void ovviamente accetta qualsiasi cosa. Sta lì apposta. Ma poi i confronti tra oggetti vanno sempre in maniera sensata. Proprio dal punto di vista logico, potresti mai immaginare di confrontare una stringa con un intero? Avrebbe senso dal punto di vista logico? Ovviamente no. Se la stringa è una stringa contenente un numero, allora la converti prima in numero e poi fai il confronto. Per cui, a quella funzione manca un parametro che gli consente di capire l'oggetto d'origine di che tipo era. Dopo di che, una serie di if che fanno tutte le valutazioni e le conversioni del caso. |
|
09-04-2020, 21:25 | #5 |
Junior Member
Iscritto dal: Jan 2020
Messaggi: 17
|
Grazie a tutti. Utilissimi .
|
10-04-2020, 09:15 | #6 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12580
|
Non è chiaro quanto generico dev'essere il metodo.
Ad esempio questo è un pezzo di un codice che avevo scritto per aggiungere un elemento ad una hash table (non riporto tutto il codice per compattezza, ma solo la parte che ci interessa): Codice:
int ph_add_generic(struct ph_table *h, void *value, size_t keyoff, size_t keylen) { ... if (!memcmp(h->buckets[i] + keyoff, value + keyoff, keylen)) { /* element already present */ return 1; } ... } Il problema nelle hash table è determinare la "chiave" di cui fare l'hash, in questo caso specificata da 2 parametri: - "keyoff" che rappresenta l'offset in bytes del campo all'interno della struttura e - "keylen" che rappresenta quanto è lungo il campo Il confronto avviene banalmente usando "memcmp" (non è il massimo dell'efficienza se vuoi fare un confronto per uguaglianza ma comunque era efficace e rapido nell'implementazione). Tutto qui? No di certo. Usare la funzione generic direttamente è scomodo, così conviene scriversi degli helper, specialmente se il tipo di dato è noto a tempo di compilazione: Codice:
/** * Add an element to hash table, using a field as a key. * @param table: hash table pointer. * @param eptr: pointer to the element (struct) to add. * @param keyfield: name of the field containing the key (size is computed * automatically) * @return 0: if element was added, 1: if already present, -1: if table is full. */ #define ph_add(table, eptr, keyfield) \ ph_add_generic(table, eptr, offsetof(typeof(*eptr), keyfield), sizeof((*eptr).keyfield)) Quindi ad esempio: Codice:
struct pippo { int a; int b; char nome[15]; char c; }; struct pluto { short a; short b; int c; int d; }; ... struct ph_table *tab = ph_init(..); struct pippo x = { .. }; struct pluto y = { .. }; ph_add(tab, &x, nome); /* aggiungo alla hash table "x" usando come chiave il campo "nome" */ ph_add(tab, &y, c); /* aggiungo alla hash table "y" usando come chiave il campo "c" */ |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:13.