Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
DEEBOT T90 PRO OMNI abbina un sistema di aspirazione basato su tecnologia BLAST ad un rullo di lavaggio dei pavimenti dalla larghezza elevata, capace di trattare al meglio le superfici di casa minimizzando i tempi di lavoro. Un robot completo che riesce anche ad essere sottile e garantire automazione ed efficienza nelle operazioni di pulizia di casa
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-04-2020, 09:09   #1
9abs
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;
}
o devo per forza fare diverse funzioni per il confronto in base ai vari tipi?

Come sempre grazie per l'attenzione !

Ultima modifica di 9abs : 04-04-2020 alle 09:15.
9abs è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2020, 09:27   #2
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
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.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 06-04-2020, 11:17   #3
-MiStO-
Senior Member
 
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2287
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...

-MiStO- è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2020, 20:31   #4
pabloski
Senior Member
 
Iscritto dal: Jan 2008
Messaggi: 8406
Quote:
Originariamente inviato da 9abs Guarda i messaggi
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){ == nulla) c
                
 //è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;
}
o devo per forza fare diverse funzioni per il confronto in base ai vari tipi?

Come sempre grazie per l'attenzione !
Brutta strada. Il C è famoso per i bug dovuti all'inconsistenza del suo modello di programmazione. E francamente tu stai cercando di arrivare ai limiti di quest'inconsistenza.

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.
pabloski è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2020, 22:25   #5
9abs
Junior Member
 
Iscritto dal: Jan 2020
Messaggi: 17
Grazie a tutti. Utilissimi .
9abs è offline   Rispondi citando il messaggio o parte di esso
Old 10-04-2020, 10:15   #6
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12964
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;
    }
    ...
}
Ad esempio l'elemento può essere una struct, passata genericamente attraverso il puntatore "value".

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))
Qui c'è un po' di "magia nera" dovuta soprattutto all'uso della funzione "offsetof" che ti calcola l'offset di un campo in una struttura.

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" */
Chiaramente è solo un esempio, dipende tutto da quello che vuoi realizzare e con quale grado di genericità.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
NVIDIA RTX PRO 4500 Server Edition: la s...
Core Ultra 200 HX Plus: Intel mette il t...
Starfield arriva su PS5: data ufficiale,...
iPad Air 13" (M4) scende di prezzo: -100...
Oracle annuncia Java 26 con il Java Veri...
OPPO Find N6 è ufficiale: sottile...
Influencer sotto controllo Agcom: arriva...
Scontro in OpenAI sul ChatGPT per adulti...
Apple Watch Series 11 a 349€ e altri int...
Starlink rinnova i piani residenziali in...
POCO X8 Pro e Pro Max ufficiali: potenza...
Jensen Huang propone i token come nuovo ...
Realme 16 Pro e 16 Pro+ tra i più...
Dall'enciclopedia all'algoritmo: Encyclo...
Il CEO di Epic Games Tim Sweeney ha comp...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:37.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v