Passare variabili differenti a funzione

In che modo è possibile passare variabili di diverso tipo ad una funzione e poi conoscerne il tipo all'interno di essa?

In un linguaggio compilato sai sempre che tipo di parametro passi.
Mi sfugge qualcosa?

secondo me se ti serve una cosa così non hai analizzato abbastanza il problema

come dice fratt in un linguaggio compilato questa esigenza non dovrebbe esistere

comunque tempo fa, per puro diletto, in C++ avevo fatto una cosa che si avvicinava

spiega bene il tuo problema, che secondo me non ti serve realmente
casomai andrò a cercare il mio vecchio post

Mi spiego : questa funzione deve accettare un valore in ingresso elaborarlo e valorizzare un array. Dovrebbe poter accettare variabili di diverso tipo

ovvero?

fai un esempio

anzi magari elenca tutti i possibili casi che desideri

1 Like

Ciao, si può creare un tipo struct avente un membro per ciascun tipo di dato. La variabile è un array di tale struct. La funzione ha in ingresso un parametro per ciascun tipo, e al suo interno assegna ciascun parametro al membro dello stesso tipo. Posso fare un esempio, ma comincia tu :slight_smile:

beh, allora invece di una struct usare una union
permette una consistente riduzione di spazio occupato
ma ancora non ci siamo:
perché serve di sapere il tipo della variabile salvata per conoscere quale membro usare tra quelli salvati
come vedi non se ne esce

In realtà usando i template ed il casting in C++ è possibile.
Se riesco a ricordarmi dove lo avevo fatto, metto un esempio.

La funzione è dichiarata in questo modo : void(char *v, int32_t valore);
Scusate sono da cellulare e non riesco ad inserire i tag.
In pratica la funzione prende il valore e lo formatta cifra x cifra all'interno dell' array. Non chiedetemi di usare la sprint perché non mi interessa. Però il valore in ingresso potrebbe essere anche un int16_t.

1 Like

sì, lo avevo fatto anch'io, usando lo overload delle funzioni
era venuta fuori una cosa un po' naif...
il tipo delle variabili
ma rimane il fatto che se "poi" non si sa che tipo di variabile è stata salvata, siamo punto e a capo

anche nel mio
La mia seconda volta in C++
e le discussioni che la hanno originata, tra le quali
Salva che ti passa

ho tentato di affrontare organicamente la cosa
ma rimane sempre di una difficoltà unica
dato che esisterà sempre una configurazione, un tipo, una classe o anche solo una matrice che NON rientra nelle categorie previste

quale array?
io vedo solo che accetti una stringa E un intero
vuoi dire che tutto questo è per avere una qualche forma di formattazione "numerica" su stringhe, magari per le stampe?

lasciamelo dire ma non ti sei spiegato bene per nulla con la richiesta iniziale

In qualche modo dovrebbe essere possibile abilitare il supporto del compilatore per typeid(), ma anche secondo me è un po' un non-sense.

Comunque questo esempietto fatto al volo, fa il suo (se non serve ricavare il type della variabile).

template <typename T>
void printVar(const char* label, T value) {
  auto var = static_cast<T>(value);
  Serial.print(label);
  Serial.println(var);
}

void setup() {
  Serial.begin(115200);
  
  float var1 = 12.34;
  printVar("Questo è un float: ", var1);

  int var2 = 1234;
  printVar("Questo è un int: ", var2);
}

quando leggo cose come queste mi dispiace non conoscere il C++....

invidia....

te pensa che io "vagamente intuisco" quello che hai scritto...

A dire il vero non sono un profondo conoscitore del C++ nemmeno io ed i template sono uno di quegli argomenti che butto giù davvero con fatica...
Ma smanettando qua e la e con l'aiuto di Mr. Google (e soprattutto stackoverflow) alla fine un modo per cavare 'sto benedetto ragno dal buco si trova sempre (più o meno).

Allora, la funzione in oggetto è questa, quello che vorrei fare è passare al parametro val anche variabili int16_t.

static char cont_str[12]; 
gen_str(cont_str, old_contatore);

void gen_str(char *arr, int32_t val) {
    val < 0 ? arr[0] = '-' : arr[0] = '+';    //aggiungo il segno al primo carattere della stringa [0]
    val = abs(val);                           //salvo il valore di val senza segno
    uint8_t l_riga;                           //creo la variabile della lunghezza riga
    l_riga = conta_riga(val) + 1;             //conto il numero dei caratteri e aggiungo 1 per il segno
    uint8_t pos;
    for (pos = l_riga - 1; pos > 0; pos--) {  //inizializzo la posizione del carattere da salvare al valore della lunghezza riga - 1 (-1 perchè l'array parte da 0)
      uint32_t a = (val / 10) * 10;
      arr[pos] = 48 + (val - a);              //copio le cifre del valore del contatore nella stringa buf
      val /= 10;
    }
    

    do arr[l_riga++] = (' ');                 //aggiungo tanti spazi per riempire l'intera stringa
    while (l_riga < 11);
  }

Io credo che se glieli passi la 'promozione automatica' di 'C' faccia tutto da sola senza bisogno di dannarti l'anima

Hai provato?

Non ancora ma ci provo.

In linguaggio C e C++ è un linguaggio tipizzato e quindi non è possibile (puoi con Python x esempio).
L'unica è fare come fa la print() ovvero si usa l'overloading (grazie al C++)
Cerca in rete "overloading di funzioni linguaggio C++" e trovi molti esempi
Usando i template, alla fine è usare overloading ma con un aiuto nella stesura del codice.

Nel caso specifico, però.... che problema c'e' ? Gli passi un int16_t e lui lo prende comunque, a limite fai un cast a int32_t

1 Like

Non è mica colpa mia se il C è a tipizzazione statica. Io metterei un flag nella struct. Oppure vedi l'overloading, come è stato detto, che è la soluzione standard. Dipende dall'applicazione.

Ma non serve nulla di tutto questo

Ci pensa la promozione automatica, chiamata anche casting implicito