Visual c++

Ok ragazzi in circa 3 settimane un pò di ossa me le sono fatte.
Diciamo che pochi minuti fa sono riuscito a far girare il tutto e funziona :stuck_out_tongue_winking_eye: :stuck_out_tongue_winking_eye:.

Però l’ultimo intoppo che ho avuto l’ho risolto un pò brutalmente, avete altri consigli? Praticamente in una funzione avevo messo talmente tante variabili che mi andava in stack overflow. Documentandomi ho capito che la memoria di stack è quella all’interno della funzione e che una soluzione al problema poteva essere quella di portare le variabili in globale, ossia fuori dalla funzione e cosi ho fatto.

Trovando altre info però ho capito che non è la soluzione ottimale, ma il massimo sarebbe usare delle “memorie dinamiche”?? Ora non ho approfondito in quanto per ora funziona e a me basta ma vorrei sapere quanto potrebbe essermi utile una soluzione del genere? E quanto è difficile da realizzare?

La memoria globale è molto più grande di quella di stack vero?

Sì, la memoria per lo stack è generalmente dell’ordine di poche centinaia di KB.

Paolo Amoroso

E questo mi fa venire in mente un esempio di utiizzo di puntatori.
Supponi di avere bisogno di un grande spazio dati (diciamo un vettore o una matrice molto grossa), ma di volerla “nascondere” in una funzione (dunque non renderla globale).

Puoi utilizzare malloc() per allocare quanta memoria ti serve, e malloc ritornerà un puntatore all’inizio di tale memoria.
Se dichiari tale puntatore all’interno della funzione hai ottenuto l’information hiding utilizzando l’heap (quella che chiami memoria globale) anzichè lo stack.

Ta-dah :slight_smile: i puntatori sono utili.

esatto proprio del malloc parlavo.
Si ma vorrei vapire una cosa, cosa cambia? Cioè su uso malloc() o se rendo la variabile globale cosa cambia?

Ti cito un autore famoso.

Allora se uso malloc all’interno della funzione uso l’heap e quindi è come se la dichiarassi come variabile globale giusto? Cioè a parte l’ordine del programma, a “occupazione” di memoria siamo li no?! Oppure non ho ancora capito bene :flushed:

Un altra cosa.

Dovrei utilizzare un’antenna gps con alimentazione usb. Cercando in rete ho trovato questo:

Praticamente delle librerie per comunicare con il gps ma solo tramite porta seriale, io invece lo dovrei fare con l’usb.
Sapete se esistono cose analoghe ma con interfaccia usb? Oppure se esistono modelli commerciali di gps con allegati API per windows?

potrei risolvere con una porta seriale virtuale?

ok. Ho utilizzato le funzioni new e delete del c++ per risolvere il problema di stack overflow ed ora va perfettamente :slight_smile:

Per il gps ho preso il garmin 18 usb e userò queste librerie

http://www.stempsoft.com/

Ok allora ecco cosa sto facendo, fino al commento l’ho praticamente copiato da un file di esempio, il resto l’ho scritto io, il problema è che non riesco a farlo funzionare, cioè non mi accede ai dati di posizione e velocità PVT:

[code]// SimpleProductData.cpp
//

#include “stdafx.h”
#include “stdio.h”
#include “conio.h”

#include “GarXfaceAll.h”

int main()
{
GarXface4::GpsUsbDevice usbDev;

/*StempSoftMessageLogger::MsgLoggerFileDevice *pMsgLoggerFileDevice;

//The log can be turned on for recording diagnostic messages
pMsgLoggerFileDevice = new StempSoftMessageLogger::MsgLoggerFileDevice("SimpleProductData.log");
StempSoftMessageLogger::SetMessageLoggerDevice(pMsgLoggerFileDevice);*/

GarXface4::UsbDeviceNameList lst;

GarXface4::UsbDeviceName *n=lst[0];
		
usbDev.SetDeviceName(lst[0]->GetDeviceName());

GarXface4::Gps gps;
	
try
{

//Qui ho scritto io
printf(“E’ acceso? %i\n\n\n”,gps.IsOpen());
gps.Open(&usbDev);
printf(“GPS acceso”);

	GarXface4::ProductData *pProductData = gps.GetProductData();
	
	printf("Product Description: %s\n",pProductData->GetDescription());
	printf("Model ID: %d\n",pProductData->GetProductID());
	printf("Software Version: %f\n\n",pProductData->GetSwVersion());

	printf("E' acceso? %i\n",gps.IsOpen());  
	
	gps.PvtDataOn();

	GarXface4::PVTdata *pvt;

	pvt = gps.GetPVTdata();

	printf("E' connesso il GPS? %i\n",pvt->GetGpsConnect());
	printf("Dati validi? %i\n",pvt->GetValidData());

	printf("Alitudine: %f\n",pvt->GetAltitude());

	double m_dLatitude = GarXface4::Math::WGS84::radiansToDegrees(pvt->GetLatitude());
	printf("m_dLatitude %f\n\n",m_dLatitude);

	getchar();
	
} catch(GarXface4::Exceptions::GxException e) {
	e.ReportError();
}


return 0;

}

[/code]

Praticamente le classi per accenderlo (gps.Open) funziona, mentre mi dive che i dati non sono validi quando cerco di accedere ai dati PVT.

Il file di esempio che c’è sui dati PVT è un casino, perchè utilizza le MFC per fare una finestrella dove aggiorna in continuo i dati, mentre a me serve una cosa molto molto più semplice

Alla fine sono riuscito ad usare un’altra classe per prendere latitudine e longitudine, non usando il metodo PVT che è un formato proprio della Garmin.

Oggi ho effettuato una prova del funzionamento del programma con accelerometro e gps. Praticamente mentre il gps segna il percorso l’accelerometro elabora il valore rms delle accelerazioni secondo norma iso2631 e poi ne fa un appunto sulla mappa con il valore numerico.