Sì, però non ti sei prorpio proprio sganciato dal tipo dell'array
io ho provato a passare un array di int, ma non va (ovviamente)
se vgliamo proprio renderci indipendenti dal tipo dell'array dobbiamo cambiare un po' il punto di vista
per cominciare non possiamo stampare l'elemento (non dalla funzione almeno, dato che non sa che tipo dovrebbe stampare)
ci tocca di indicare l'ordinale dell'elemento trovato doppio, ma non il suo valore (al limite potrebbe anche essere una struttura.........)
ecco cosa ho tirato fuori:
#include <stdio.h>
#include <string.h>
void contadoppi(void * a, size_t sa, size_t dimensione);
// conta i doppi in un array generico di oggetti generici
int main(int argc, char **argv)
{
int a[] = {1, 2, 1, 2, 4, 3, 3, 3, 3};
int sa = sizeof(a) / sizeof(a[0]);
int dima = sizeof(a[0]);
char b[] = "Una stringa piena di doppioni aabbccdd";
int sb = sizeof(b) / sizeof(b[0]);
int dimb = sizeof(b[0]);
float c[] = {1.0, 2.0, 3.0, 1.0, 1.0};
int sc = sizeof(c) / sizeof(c[0]);
int dimc = sizeof(c[0]);
contadoppi(a, sa, dima);
contadoppi(b, sb, dimb);
contadoppi(c, sc, dimc);
return 0;
}
void contadoppi(void * a, size_t sa, size_t dimensione)
// conta i doppi in un array generico di oggetti generici di dimensione (sizeof) conosciuta
{
for(size_t i = 0; i < sa; i++)
{
size_t contatore = 0;
// per tutti gli elementi
void * attuale = a + i * dimensione;
for(size_t j = 0; j < sa; j++)
{
// cerchiamo i doppi
void * candidato = a + j * dimensione;
// ora, se sono lo stesso elemento, lo ignoro
if(attuale == candidato)
{
continue;
}
// altrimenti devo vedere se sono due elementi uguali
if(!memcmp(attuale, candidato, dimensione))
{
// sono uguali
// se il puntatore è inferiore
if(candidato < attuale)
{
// già trovato e già contato in precedenza
// lo scarto
break;
}
else
{
// non ancora trovato ne contato in precedenza
contatore++;
}
}
}
// ok, se il contatore è alto
if(contatore)
{
// lo segnalo
printf("L'elemento numero %d è ripetuto nel complessivo %d volte\n", i, contatore + 1);
}
}
}
come vedi passo oltre al numero di elementi anche la loro dimensione, ma uso solo void *
quindi posso fare un test con la memcmp(), e uso l'aritmetica dei puntatori per trovare il vero indirizzo dell'oggetto
come vedi funzia con interi, caratteri e float
non ho provato con struct, ma confido in bene........