Visual c++

Ho trovato l’errore…incredibile!!!

Nel programma del prof c’era:

fp1 = fopen("c:\seat.txt","r");

Invece se faccio cosi funziona:

fp1 = fopen("c:\\seat.txt","r");

Adesso non capisco perchè io ho dovuto mettere un altra \ mentre al mio prof non serviva :confused: :confused: :confused:

\ è un escape character. Scusa la sinteticità ma ho le batterie scariche.

Paolo Amoroso

ok!
Praticamente “” è un carattere speciale di escape di c++ e quindi lo interpretava erroneamente invece scrivendo \ lui intende proprio , giusto??

Ora la mia domanda è perchè al mio prof invece gli girava?

Esatto.

Probabilmente il tuo professore usa un sistema operativo diverso da Windows in cui \ non è un carattere speciale per i percorsi dei nomi di file.

Paolo Amoroso

No no usava xp l’ho visto io. Bà :astonished: :astonished:, vabbè non è un problema, ho capito l’errore e ora funziona…va benissimo :stuck_out_tongue_winking_eye: :stuck_out_tongue_winking_eye:

Ho dato una rattoppata al programma della phidget che stampava a video i valori dell’accelerazione e poi regolava la sensibilità :astonished: :astonished:

sono anche riuscito a tirare fuori i dati delle accelerazioni dai relativi assi usando le libreria fstream.

è 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() ).

allego il pdf dove sono spiegate le API

Ho incluso la libreria time.h e ora mi segna anche il tempo in cui rileva l’evento, ma il problema persiste

[code]#include “stdafx.h”
#include “phidget21.h”
#include <time.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)
{
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;

}

[/code]

Alla fine ci sono riuscito :stuck_out_tongue_winking_eye: :stuck_out_tongue_winking_eye: :stuck_out_tongue_winking_eye: :stuck_out_tongue_winking_eye: :stuck_out_tongue_winking_eye:

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 :nerd: :nerd: :nerd:

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

Parlo assolutamente da profano e, purtroppo solo per sentito dire, ma per caso una cosa del genere si potrebbe eseguire con gli interrupts?

io mi sono scaricato questo:

http://www.softintegration.com/docs/ch/plot/

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.

PS: degli interrupts non so niente

E` un esempio di problema del produttore-consumatore, un classico problema di sincronizzazione fra processi.

Paolo Amoroso

ok non mi sono messo di impegno a leggere bene, ma a quanto ho visto è risolvibile con usando uno di quell’algoritmi?!

Sì.

Paolo Amoroso

mmm…aiutino???

Ho provato a capirci qlk ma niente… sto anche provando a vedere librerie tipo sfml o qt o gtkmm

In soldoni questo è il pezzo di interesse:

[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 :disappointed: :disappointed: