è possibile con il linkage inviare da un file .cpp delle informazioni ad un altro file .cpp?? Cioè in real time la variabile che varia nel file1 viene aggiornata anche nel file2??
La visibilità (scope) delle variabili non segue una logica di “file”, ma le regole di visibiltà del linguaggio.
Sono davvero troppo arrugginito in C++ per fare degli esempi concreti.
C’è QUASI SEMPRE un metodo migliore di quello che ti sto per dire, per fare quello che devi fare, ma un modo è dichiarare una varibile globale (i.e. dichiarata all’esterno di qualsiasi funzione o oggetto, ad esempio dopo l’inclusione degli header file).
Pagina 159 del Thinking in C++, che so tu possiedi.
si si già mi ero studiato lo scope di una variabile ed infatti avevo definito una variabile globale che gli assegnavo il valore delle accelerazioni ed era possibile vederla ovunque.
Il problema è che anche se il programma una volta entrato nel loop che gli fa assumere i dati non ne esce più e quindi non riesco a farlo in real time. Cioè posso definire una variabile globale tipo un array, assegnargli i valori delle accelerazione e poi usare questo array nel resto del programma questo si, ma in real time non ci riesco.
Qui l’intoppo:
[code]#include “stdafx.h” #include “phidget21.h”
//callback that will run if the acceleration changes by more than the Acceleration trigger.
//Index - Index of the axis that is generating the event, Value - the value read by the accelerometer axis
int __stdcall accel_AccelChangeHandler(CPhidgetAccelerometerHandle WGT, void *userptr, int Index, double Value)
{
printf(“Axis: %i %6f\n”, Index, Value);
return 0;
}
//main entry point to the program
int _tmain(int argc, _TCHAR* argv)
{
int result;
const char *err;
//Declare an accelerometer handle
CPhidgetAccelerometerHandle accel = 0;
//create the accelerometer object
CPhidgetAccelerometer_create(&accel);
//Impostando -1 apre il primo dispositivo disponibile
CPhidget_open((CPhidgetHandle)accel, -1);
//get the program to wait for an accelerometer device to be attached
printf("Waiting for accelerometer to be attached.... \n\n");
//Aspetta 10 secondi che venga connesso il dispositivo
if((result = CPhidget_waitForAttachment((CPhidgetHandle)accel, 10000)))
{ CPhidget_getErrorDescription(result, &err);
printf("Problem waiting for attachment: %s\n", err);
//Interruzione, spingere invio per continuare
getchar();
return 0;}
//Imposta la sensibilità
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 0, 0.500);
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 1, 0.500);
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 2, 0.500);
//Registra un evento se l'accelerazione cambia oltre una certa soglia.
CPhidgetAccelerometer_set_OnAccelerationChange_Handler(accel, accel_AccelChangeHandler, NULL);
//Interruzione
getchar();
//Chiude il dispositivo e l'oggetto
printf("Closing...\n");
CPhidget_close((CPhidgetHandle)accel);
CPhidget_delete((CPhidgetHandle)accel);
//Interruzione
getchar();
return 0;
}
[/code]
In rosso ho evidenziato la funzione che assegna le accelerazioni alla variabile locale Value. Il problema è che quando il programma entra in accel_AccelChangeHandler non ne esce fin che non spingo un tasto (getchar() ).
//callback that will run if the acceleration changes by more than the Acceleration trigger.
//Index - Index of the axis that is generating the event, Value - the value read by the accelerometer axis
int __stdcall accel_AccelChangeHandler(CPhidgetAccelerometerHandle WGT, void *userptr, int Index, double Value)
{
clock_t clock();
printf(“Time: %i Axis: %i Acceleration: %6f\n”,clock()/CLOCKS_PER_SEC, Index, Value);
return 0;
}
//main entry point to the program
int _tmain(int argc, _TCHAR* argv)
{
int result;
const char *err;
//Declare an accelerometer handle
CPhidgetAccelerometerHandle accel = 0;
//create the accelerometer object
CPhidgetAccelerometer_create(&accel);
//Impostando -1 apre il primo dispositivo disponibile
CPhidget_open((CPhidgetHandle)accel, -1);
//get the program to wait for an accelerometer device to be attached
printf("Waiting for accelerometer to be attached.... \n\n");
//Aspetta 10 secondi che venga connesso il dispositivo
if((result = CPhidget_waitForAttachment((CPhidgetHandle)accel, 10000)))
{ CPhidget_getErrorDescription(result, &err);
printf("Problem waiting for attachment: %s\n", err);
//Interruzione, spingere invio per continuare
getchar();
return 0;}
//Imposta la sensibilità
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 0, 0.500);
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 1, 0.500);
CPhidgetAccelerometer_setAccelerationChangeTrigger(accel, 2, 0.500);
//Registra un evento se l'accelerazione cambia oltre una certa soglia.
CPhidgetAccelerometer_set_OnAccelerationChange_Handler(accel, accel_AccelChangeHandler, NULL);
//Interruzione
getchar();
//Chiude il dispositivo e l'oggetto
printf("Closing...\n");
CPhidget_close((CPhidgetHandle)accel);
CPhidget_delete((CPhidgetHandle)accel);
//Interruzione
getchar();
return 0;
Praticamente registro le accelerazioni e il tempo in due array e quando raggiungono i 16384 valori con un if li faccio passare nel programma del prof dove vengono lavorati e tirano fuori il valore che cerco. Dopo di che ricomincia da capo
Ora sto facendo lo sborone cercando di capire come funzionano le librerie SDL per fare un grafico dei dati.
Qualche idea? Non capisco come modificare l’immagine con dei dati, cioè ho visto come si fa da tastiera o da mouse ma con dei valori no
la libreria <chplot.h> e funziona. Praticamente ogni 16384 valori li plotto in un grafico molto semplicemente usando le istruzione di quelle librerie. Il problema è che non riesco a farlo in tempo reale, ne a decidere quanto visualizzare il grafico.
Mi basterebbe anche un aggiornamento ogni 16384 valori, aggiorna i valori e mostra la schermata per tot secondi. Invece cosi arrivato al plot il programma si blocca e devo chiudere la schermata per farlo continuare.
[code]
if(t==MAX_INT)
{
//Perchè nell’else l’ultima istruzione è t++
t–;
class CPlot plot;
//Imposta il plot della funzione
plot.data2DCurve(tempo, accz, MAX_INT);
//Plotta la funzione
plot.plotting();
//Cancella il plot
void deletePlots();
//IMPORTA LA FUNZIONE ISO2631
iso2631();
//Riporta a 0 il contatore dell'array accz e tempo
t=0;
}
else
{
//Funzione della libreria time.h
clock_t clock();
//Quanti cilci fa il PC in un millesimo di secondo
millis=CLOCKS_PER_SEC/1000;
//Scrive in accz[] il valore dell'accelerazione
accz[t]=Value;
//Tempo in secondi
tempo[t]=0.001*(clock()/millis);
//Incrementa il contatore degli array
t++;
}}[/code]
MAX_INT è 16384, quando l’array arriva a quel valore viene richiamata la funzione iso2631 che elabora i dati e ne estrae un valore. Tutto quello che ho postato è racchiuso in un ciclo che immagazzina ogni 17millisecondi un valore dell’accelerazione.
Ora se non proprio un grafico in tempo reale a me basterebbe anche che ogni 16384 secondi facesse una schermata dei dati, e in effetti lo fa, solo che per far proseguire il programma devo chiudere la schermata che mi si apre.
Considerando che il programma fa una elaborazione ogni 260 secondi circa, e che devo prendere dei dati per 8 ore di fila, chiudere sempre la schermata non mi sembra il massimo, non c’è un comando per fargli chiudere la schermata da solo? Oppure il massimo sarebbe un costante aggiornamento, ma anche se mi sono letto il problema del produttore-consumatore…non riesco a tirarne fuori nulla