DOMANDA linguaggio C, tipi variabili

Peri

Nuovo Utente
82
3
Non è facile descrivere in parole povere quello che cerco di fare, ma ci proverò...
Dunque sto preparando un file Header con un elenco di funzioni (solo prototipi) che mi serviranno per dei lavori universitari. Affiancato a questo un file .c nel quale ci sono le rispettive definizioni. Il problema che mi si pone è che nel main posso usare qualsiasi tipo standard che si possa usare per fare operazioni aritmetiche (char, int, float, double...). Dunque una funzione dovrà poter affrontare questo problema.
La miglior idea che ho avuto è questa:
Nel file che contiene il main, prima di includere l'header, definisco una macro chiamata TYPE a cui do il nome del tipo che voglio usare ( e che dovrà essere sempre lo stesso per tutta l'esecuzione del main). Nell'header ogni tipo usato sarà indicato con TYPE.
nel main:
C:
#define TYPE int
#include "libreria.h"

int
main (void)
{
    int v = 0;
    f(v); //f viene presa da libreria.h
    return 0;
}
nell'header
C:
#ifndef _LIB_H
#define _LIB_H

#ifndef TYPE
#define TYPE double
#endif

void f(TYPE);

#endif

Il problema di questo metodo è che per tutta l'esecuzione del main, il tipo delle variabili deve essere sempre lo stesso (concretamente questo non mi disturba perché di norma sarà sempre lo stesso), il secondo problema è il file .c.
Capisco che usare al suo interno TYPE possa essere un problema per il compilatore che infatti mi dice che non ha idea di cosa sia TYPE.
Come posso risolvere? magari anche usando un altro metodo. A naso credo che esistano tante soluzioni, ma preferirei una che permetta un facile uso dell'header :)

Faccio notare che ciò funziona se le definizioni stanno solo nell'header (il che mi sta anche bene, solo che così il file .h diventa enorme)
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,220
1,852
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
  • Mi piace
Reazioni: Peri

pabloski

Utente Èlite
2,868
916
In genere si usano i typedef per fare quello che chiedi.

C:
libreria.h

TD f(TD a) {
        return a*2;
}

C:
main.c

#include <stdio.h>

typedef int TD;

#include "libreria.h"

void main() {
        TD var = 2;
        printf("%d\n", f(var));
}

Il punto è che TD dev'essere definito prima che venga incluso, dal preprocessore, l'header file. Altrimenti non troverà la definizione durante il parsing dell'header e darà errore.
 
U

Utente cancellato 371741

Ospite
In realta non si capisce il suo scopo, e anche il suo codice potrebbe funzionare, se non per il fatto che in una libreria, se e' una vera libreria, dovrebbe, anche se non necessariamente, inplementare il corpo di

void f(TYPE);

in un .c (almeno lui dice di voler fare cosi) e quindi il tipo sara' quello definito nella libreria.

Peri: perche ti serve questo tipo unico ? Sempre meglio evitare offuscamenti di codice.
 

Peri

Nuovo Utente
82
3
Alla fine ho trovato più pratico usare C++ e la possibilità di gestire tutto con template e overloading.
Tuttavia, per rispondere comunque alla domanda, nel file .c ho usato TYPE ad esempio scrivendo:

#include "libreria.h"
TYPE f(TYPE a){return 2*a;}

In fase di compilazione però mi ha bloccato perché non conosceva TYPE. In ambiente Linux mi sono preoccupato di compilare prima il file del main (dove viene definito TYPE) e poi il file .c, ma comunque mi diceva che non conosceva TYPE.

L'header di cui volevo far uso mi avrebbe aiutato a costruire facilmente funzioni per studi di analisi numerica.
Quindi mi serviva un modo per creare funzioni basilari che facessero un po' di tutto. Poi col tempo ho visto che in C++ potevo realizzare codici più facilmente (L'ideale credo sia MATLAB, ma me lo sto studiando ora)
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,220
1,852
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Premesso che penso tu abbia fatto bene ad utilizzare C++, perché quanto ti ho suggerito anche io mina la manutenibilità ed è anche error prone (oltre che leggibile più difficilmente).

Se fai ciò che ho mostrato qui, dovrebbe funzionarti, se è ciò che ti serve:
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili