DOMANDA linguaggio C, tipi variabili

Pubblicità

Peri

Nuovo Utente
Messaggi
82
Reazioni
3
Punteggio
29
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)
 
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.
 
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.
 
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)
 
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:
 
Pubblicità
Pubblicità
Indietro
Top