2013-10-30 14 views
6

C'è un modo per dichiarare una funzione variadica C e chiamarla da Fortran? Devo chiamare questa funzione per calcolare alcuni prodotti punto tra vettori etichettati con una stringa. La mia idea era di dichiarare qualcosa di simile al seguente, dove l'elenco delle variabili degli argomenti contiene stringhe letterali. Se l'elenco delle variabili delle variabili è vuoto, eseguirò una ricerca tra le etichette standard ed eseguirò il calcolo. Se l'utente ha specificato due etichette vorrei recuperare quei due vettori e ottenere il loro prodotto scalare:Interoperabilità della funzione variadica C e Fortran

extern "C" void compute_dot_product(double * dot_product, ...) 
{ 
    va_list args; 
    va_start(args, NULL); 
    char * label1 = va_arg(args, char *); 
    if (!label1) 
    { 
     // Do standard label lookup and compute dot product 
    } 
    else 
    { 
     // Compute dot product between the vectors with the specified labels 
     char * label2 = va_arg(args, char *); 
    } 
    va_end(args); 
} 

l'unico problema è che posso compilare la mia libreria C e collegarlo a un eseguibile Fortran, ma ottengo un errore di runtime quando provo ad accedere alla lista variabile di argomenti. Qualche idea se quello che sto cercando di fare è possibile? Una possibile soluzione sarebbe quindi quella di dividere in due funzioni: una che esegue la ricerca dell'etichetta standard (caso 0 argomenti), l'altra che gestisce la ricerca dell'etichetta non standard (caso 2 argomenti). Preferirei evitare questa soluzione.

+0

Deve essere dichiarato come cdecl su entrambi i lati. Il tuo errore di runtime potrebbe essere dovuto al fatto che un lato è stdcall e l'altro è cdecl. – cup

risposta

3

Non è possibile chiamare una funzione variadica in modo standard conforme (cioè portatile).

È possibile rendere la definizione della funzione C solo due parametri (quindi non è più variadic - i riferimenti esistenti alla funzione devono essere modificati), con il secondo parametro nella funzione C un puntatore, NULL per indicare che non ci sono cose aggiuntive che vengono passate o che puntano a un array di puntatori (forse NULL terminato) o qualsiasi altra cosa, con qualsiasi cosa aggiuntiva. In F201X un corpo di interfaccia per questo tipo di funzione potrebbe essere in grado di utilizzare l'attributo OPTIONAL per il secondo argomento.

+0

Questo è ciò che fa una funzione variadica. Vedi: http://stackoverflow.com/a/19171063/1162141 – technosaurus

+0

@technosaurus Non vedo la rilevanza del commento o della risposta collegata. – IanH

+0

Il "..." in una funzione variadica è essenzialmente un array di puntatori (anche se possono essere tipi interi) Il collegamento mostra il modo un po 'complicato con cui questi cast vengono eseguiti per ottenere il tipo giusto iniziando dal primo puntatore. Quindi la tua risposta ha senso in sostituzione di "..." +1. – technosaurus

Problemi correlati