|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2009
Messaggi: 83
|
[C\C++] Chiamare funzione C++ da C
ciao a tutti! Ho di nuovo bisogno del vostro aiuto.
Ho un simulatore che dispone di un modulo di comunicazione con C..È quindi in grado di convertire nel suo linguaggio una funzione scritta in C.. Questa funzione mi serve per ricevere un input esterno. Finora leggevo dal mouse e quindi bastava una funzione C..ora dovrà essere un device qualsiasi e dovrà leggere dati dal BUS..Questa parte è stata già implementata e funziona..il problema è che è scritta in C++.. Devo quindi scrivere una funzione C che riesca a ricevere dei dati (credo 2 o tre double) da quella funzione C++.. Potrei risolvere comunicando tramite socket ma dovrei avviare un'applicazione c++ durante la simulazione, o no?..Comunque preferirei che il programma di simulazione lavorasse, per così dire, da solo. Premetto che non sono un programmatore.. per la tesi specialistica in ing Meccanica mi hanno catapultato in questo mondo che mi affascina molto ma che non conosco profondamente.. Ogni consiglio è ben accetto.. Grazie in anticipo, Francesco |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
il C++ è un sovrainsieme del C, ragion per cui non puoi fare quello che dici
ps: comunque non ho capito... in che senso è stata già implementata in C++? cioè chi è che ha scritto sta roba in C++ se il simulatore compila (o interpreta?) solo C? Ultima modifica di tuccio` : 15-10-2010 alle 11:11. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Apr 2009
Messaggi: 83
|
io avevo pensato fosse impossibile ma speravo di sbagliarmi..
Cerco di spiegarmi meglio.. Si tratta di un progetto ampio..in pratica ci sono vari moduli che comunicano col BUS..per moduli intendo sia software di simulazione che device di input e/o output.. Per rendere tutto flessibile le comunicazioni di dati avvengono tramite BUS cosicché se si vuole cambiare device o simulatore è necessario solo passare al "nuovo arrivato" un config file con le informazioni che gli servono per ricevere ed inviare dati al BUS.. La parte finale, quella che permette di scrivere o leggere sul BUS, è anch'essa universale (scritta in C++ e richiama una JNI) ed in pratica fornisce delle classi che leggono o scrivono sul BUS..quindi dovrebbe essere in qualche modo aggiunta al o richiamata dal codice dello specifico "modulo".. Spero di aver chiarito.. Quindi? Mi consigliate i socket? |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Apr 2009
Messaggi: 83
|
A ho dimenticato la parte importante
Il simulatore in question è OpenModelica..ed ha un suo linguaggio..semplicemente può chiamare una funzione C passandole degli argomenti che poi riottiene modificati (ad esempio).. Io avevo pensato che la funzione C potesse a sua volta chiamare una funzione C++ |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Generalmente si usa C++ per poter sfruttare il paradigma della programmazione ad oggetti, ovvero strutturando il codice tramite classi. Richiamare un metodo di una classe da C non è fattibile. |
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Apr 2009
Messaggi: 83
|
Perdona l'ignoranza..
quindi da C non è possibile neppure richiamare una funzione C++ che usi una classe?..cioè sarebbe la stessa cosa che chiamare la classe direttamente da C? O, essendo la stessa cosa, neppure le funzioni C++ possono richiamare metodi da classi?..non credo.. Ultima modifica di fdf86 : 15-10-2010 alle 12:05. |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Apr 2009
Messaggi: 83
|
Per intenderci..avevo intenzione di far qualcosa del genere..
http://developers.sun.com/solaris/ar...tml#cpp_from_c alla voce "Accessing C++ Classes From C" |
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
|
||
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Apr 2009
Messaggi: 83
|
Quote:
|
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Se c'è un meccanismo di comunicazione remota, questo dovrebbe astrarre dal linguaggio specifico. |
|
|
|
|
|
|
#11 | |||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Proviamo a fare chiarezza.
Ovviamente sto tentando di dare una mia intrepetazione (sto tirando a caso). Ogni deduzione è marcata con un numero tra parentesi e rimanda a un quote per indicare da quali affermazioni è stata dedotta: Sembra che esista una applicazione, chiamiamola X, che gestisce internamente una sorta di canale di comunicazione, chiamiamolo BUS (1), e che espone un'interfaccia (in C++?) (3) con cui delle applicazioni clienti terze, chiamiamole MODULI, possono comunicare/interagire scambiare dati con detto BUS (1). Per connettersi al BUS in modo corretto, un MODULO deve conoscere i parametri del protocollo di comunicazione specificati in un file di configurazione fornito da X (2). Forse X, l'applicazione che gestisce il BUS e ne fornisce l'accesso ai MODULI, è un'applicazione Java che però espone un'interfaccia in C++ (3). (1) Quote:
Quote:
Quote:
E' corretto? EDIT: Ok, NON è corretto
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 15-10-2010 alle 15:28. |
|||
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Apr 2009
Messaggi: 83
|
Non vorrei dirti stupidaggini..ma da quel che ho capito dovrebbe essere proprio il BUS fisico del computer..
come ti ho detto io non sono espertissimo..ma l'azienda in cui sto facendo lo stage si..mi hanno detto che è molto complicato comunicare col BUS direttamente e mi hanno solo accennato al funzionamento di quella parte in JNI di codice (credo sia coperta da segreto industriale tra l'altro).. insomma questo codice crea sul bus uno slot con il nome che vuoi e ci mette dentro la variabile (double o vettore di double) che vuoi iterativamente (sono simulazioni in tempo reale).. Il contenuto dello slot può poi essere letto sempre tramite questo blocco in JNI (basta sapere il nome della variabile e quindi dello slot)... Comunque il punto non è questo..ho già fatto altri wrapper per altri moduli.. Il problema è che OpenModelica mette a disposizione al massimo un'interfaccia C (un po' come la Mex-Function di Matlab, almeno come concetto, non so se hai presente).. Quindi se posso creare una funzione C++ che elabori dei dati utilizzando classi e richiamarla in C è ok..altrimenti devo passare i dati via socket..ovvero creo un'altra applicazione c++ che legge e scrive sul BUS ed invia i dati tramite protocollo tcp/ip alla funzione C.. Scusa se non sono chiarissimo e Grazie per l'aiuto comunque! |
|
|
|
|
|
#13 | ||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
Bus -> Wrapper C++ -> C OpenModelica C OpenModelica -> Wrapper C++ -> Bus Suppongo che in quest'ultimo caso l'interfaccia di OpenModelica esponga delle funzioni che consentono di ricevere eventuali eventi (callback), se questa dovesse generare degli eventi spontanei. Il C++ è stato creato appositamente con il (pesante) vincolo di essere compatibile con il C quindi non vedo che problemi tu possa avere nel farli convivere. |
||
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Apr 2009
Messaggi: 83
|
Scusa banryu ma stavo già scrivendo quando hai postato..è in parte corretta ma è sicuramente colpa mia..
Diciamo che l'applicazione X non c'è..ogni modulo ha un suo .exe che funziona benissimo (se ci sono dei dati disponibili) da solo.. Vengono lanciati tutti i .exe. Il BUS è come uno scaffale di documenti..Ogni modulo è un impiegato che riempie i suoi bei documenti e li mette in questo scaffale.. Se ad un altro modulo servono i documenti passa e li prende..(poi se non li trova si lamenta con crash o con messaggi... ma questo è un dettaglio).. L'importante è che ogni impiegato metta (e prenda) quel che gli serve sullo (e dallo) scaffale. L'applicazione JNI è lo strumento che mi hanno dato per scrivere sul BUS (che è proprio quello fisico)..potrei anche scrivere un codice che faccia lo stesso in Pascal (se ne fossi capace) ma capite che mi conviene utilizzare quello che ho (è un lavoro di anni).. il problema quindi lo hai azzeccato comunque..io devo interfacciarmi con questa JNI che espone quest'interfaccia C++..poi sarà lei a fare avanti ed indietro verso lo scaffale Ultima modifica di fdf86 : 15-10-2010 alle 16:01. Motivo: avevo mancato un pezzo..e scusate se l'esempio è un po' cretino :D |
|
|
|
|
|
#15 | ||
|
Member
Iscritto dal: Apr 2009
Messaggi: 83
|
Quote:
Quote:
|
||
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ma sto JNI per cosa sta?
Non sarà mica Java Native Interface per caso?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Questo codice può sia richiamare le funzioni C di OpenModelica sia ovviamente l'interfaccia verso JNI. |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
|
|
|
|
|
|
#20 | ||
|
Member
Iscritto dal: Apr 2009
Messaggi: 83
|
Quote:
Quote:
io non voglio chiamare OpenModelica da C++..voglio mettere a disposizione della funzione C di OpenModelica una funzione che possa usare il wrapper C++.. Mi spiego meglio..Questa è la vecchia funzione C (per il mouse) Codice:
#include <windows.h>
#include <winuser.h>
#include <stdio.h>
#include "prova.h"
void importExt(int val, double* a,double* b)
{
POINT coord;
GetCursorPos(&coord);
int d;
d=prova();
*a=(coord.x)-1000;
*b=(coord.y);
FILE *stream;
stream=fopen("C:/Users/fdf/Desktop/car0/results.txt","a");
fprintf(stream,"%f \t %f \n",*a,*b);
fclose(stream);
return ;
}
Vorrei usare al posto della windows.h un mioC++.h che metta a disposizione una funzioni mioC++ (invece della GetCursor) che passi i due valori che mi servono.. Questi due valori dovrò però leggerli dal BUS usando sta famosa classe che mi danno.. È possibile questo? P.S.: quella d=prova(); è la funzione c++ che provo a chiamare..ed è vuota per ora :P Ultima modifica di fdf86 : 15-10-2010 alle 16:22. |
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:53.




















