banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Chuyển đổi giá trị trong visual studio 2005  XML
  [Programming]   Chuyển đổi giá trị trong visual studio 2005 13/05/2008 14:11:59 (+0700) | #1 | 130310
[Avatar]
pisco
Member

[Minus]    0    [Plus]
Joined: 23/08/2007 16:37:03
Messages: 39
Offline
[Profile] [PM]
Mình có đoạn code sau : (mình sử dụng chương trình Microsoft Visual Studio 2005 )

Mình muốn đổi từ độ phút giây ---> độ phần trăm :

Ví dụ : 1045.8055 (độ phút giây) ---> 10.76345 (độ phần trăm) - (10+45.8055/60).

//Latitude 1045.8055 ddmm.mmmm
CString dd = Latitude.Left(2);
CString mm = Latitude.Right(Latitude.GetLength()-2);
double f = _wtof((const TCHAR *)(LPCTSTR)(mm))/60;
Latitude.Format(_T("%s%f"),dd,f);
//Longtude 10640.0565 dddmm.mmmm
dd = Longitude.Left(3);
mm = Longitude.Right(Latitude.GetLength()-3);
f = _wtof((const TCHAR *)(LPCTSTR)(mm))/60;
Longitude.Format(_T("%s%f"),dd,f); 


Đoạn code trên của mình bị lỗi .Các bạn có thể check lỗi dùm mình được không ạ?

mình xin cám ơn.
[Up] [Print Copy]
  [Question]   Giúp em với (visual studio 2005) 13/05/2008 23:32:37 (+0700) | #2 | 130351
[Avatar]
Z0rr0
Q+WRtaW5pc3RyYXRvc+g

Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
[Profile] [PM] [WWW] [Yahoo!]

pisco wrote:
Em có đoạn code sau : (em sử dụng chương trình Microsoft Visual Studio 2005 )

Em muốn đổi từ độ phút giây ---> độ phần trăm :

Ví dụ : 1045.8055 (độ phút giây) ---> 10.76345 (độ phần trăm) - (10+45.8055/60).

//Latitude 1045.8055 ddmm.mmmm
CString dd = Latitude.Left(2);
CString mm = Latitude.Right(Latitude.GetLength()-2);
double f = _wtof((const TCHAR *)(LPCTSTR)(mm))/60;
Latitude.Format(_T("%s%f"),dd,f);
//Longtude 10640.0565 dddmm.mmmm
dd = Longitude.Left(3);
mm = Longitude.Right(Latitude.GetLength()-3);
f = _wtof((const TCHAR *)(LPCTSTR)(mm))/60;
Longitude.Format(_T("%s%f"),dd,f); 


Đoạn code trên của em bị lỗi .Các bác có thể check lỗi dùm em được không ạ? (:=(|) (:=(|) (:=(|)

Em xin cám ơn. 


Lỗi cụ thể là gì?
Nếu là giải thuật thì bồ phải coi lại, còn về ngôn ngữ, biên dịch thì nêu rõ ràng xem.
Lần sau chịu khó ghi thêm vài chữ để tiết kiệm thời gian cho nhiều người nhé.
Hibernating
[Up] [Print Copy]
  [Question]   Re: Chuyển đổi giá trị trong visual studio 2005 14/05/2008 05:48:26 (+0700) | #3 | 130402
[Avatar]
pisco
Member

[Minus]    0    [Plus]
Joined: 23/08/2007 16:37:03
Messages: 39
Offline
[Profile] [PM]
Với đoạn code trên ,khi mình chạy chương trình thì cho ra kết quả là Latitude =1000.45 và Longitude = 1060.54

Mà kết quả đúng thì phải là Latitude =10.76345 .

Công thức đổi từ độ phút giây ra độ % là :

1045.8055 : 10 độ 45.8055 phút ---> 10.76345 (độ %)

10 + 45.8055/60 = 10.76345

Giải thuật của mình bị sai.Mong được giúp đỡ và chỉnh sửa .

[Up] [Print Copy]
  [Question]   Re: Chuyển đổi giá trị trong visual studio 2005 14/05/2008 08:14:30 (+0700) | #4 | 130421
[Avatar]
pisco
Member

[Minus]    0    [Plus]
Joined: 23/08/2007 16:37:03
Messages: 39
Offline
[Profile] [PM]
Đây là đoạn code đầy đủ của mình :

Code:
#include "stdafx.h"
#include "myPortCom.h"
#include "GPSInfo.h"


// CGPSInfo

CGPSInfo::CGPSInfo()
{
}

CGPSInfo::~CGPSInfo()
{
}


// CGPSInfo member functions
void CGPSInfo::parse()
{
	//nmeainfo = "$GGAGA,,,,aa,\n\r";
	//LPTSTR k = (LPTSTR)nmeainfo.Right(1);
	//int k = nmeainfo.Replace(_T("\n\r"),_T(""));
	int n = nmeainfo.Replace(_T(","), _T(", "));
	CString *tok = new CString[n+1]; 
	
	CString resToken;
	int curPos= 0;
	int i = 0;
	resToken= "xxx";
	while (i<=n)
	{
	   //tok[i++] = resToken;
	   resToken= nmeainfo.Tokenize(_T(","),curPos);
	   if (resToken == "") break;
	   tok[i] = resToken;
	   tok[i].Trim();
	   i++;
	};

	if (tok[0]==_T("$GPGGA"))
	{
		UTCTime = tok[1];
		Latitude = tok[2];
		NSIndicator = tok[3];
		Longitude = tok[4];
		EWIndicator= tok[5];
	}else 
	if	(tok[0]=="GPRMC")
	{
		UTCTime = tok[1];
		Latitude = tok[3];
		NSIndicator = tok[4];
		Longitude = tok[5];
		EWIndicator= tok[6];
	} ;
	//doi ra Degree cho Longtitude va Latitude
	//Latitude 3723.2475 ddmm.mmmm
	

	CString dd = Latitude.Left(2);
	CString mm = Latitude.Right(Latitude.GetLength()-2);
	double f = _wtof((const TCHAR *)(LPCTSTR)(mm))/60;
	Latitude.Format(_T("%s%f"),dd,f);
	//Longtude  12158.3416 dddmm.mmmm
	dd = Longitude.Left(3);
	mm = Longitude.Right(Latitude.GetLength()-3);
	f = _wtof((const TCHAR *)(LPCTSTR)(mm))/60;
	Longitude.Format(_T("%s%f"),dd,f);

	delete[] tok;
}



và :

Code:
class CGPSInfo : public CObject
{
public:
	CGPSInfo();
	virtual ~CGPSInfo();
	CString nmeainfo;
	CString UTCTime,
		Latitude ,
		NSIndicator,
		Longitude,
		EWIndicator;
	void parse();
};


Khi mình dịch chương trình thì cho ra kết quả sai của 2 biến Latitude và Longitude .




Mong được giải đáp và chỉ dẩn .
[Up] [Print Copy]
  [Question]   Re: Chuyển đổi giá trị trong visual studio 2005 15/05/2008 12:31:44 (+0700) | #5 | 130623
[Avatar]
pisco
Member

[Minus]    0    [Plus]
Joined: 23/08/2007 16:37:03
Messages: 39
Offline
[Profile] [PM]
Vì mình mới làm quen với Visual studio nên các giải thuật của nó mình chưa nắm được .

Cái mình thắc mắc chính là cách viết code để nó thực hiện phép toán đổi từ độ phút giây sang độ % .

Mong rằng ai có kinh nghiệm bỏ ra 1 chút thời gian đề hướng dẫn mình .

Mình xin cảm ơn .
[Up] [Print Copy]
  [Question]   Re: Chuyển đổi giá trị trong visual studio 2005 16/05/2008 11:47:04 (+0700) | #6 | 130797
[Avatar]
pisco
Member

[Minus]    0    [Plus]
Joined: 23/08/2007 16:37:03
Messages: 39
Offline
[Profile] [PM]
Khi mình viết :
Code:
CString dd = Latitude.Left(1);
 	CString mm = Latitude.Right(Latitude.GetLength()-1);
 	double f = _wtof(Latitude.Left(1)) + _wof(Latitude.Right(Latitude.GetLength()-1));
 	Latitude.Format(_T("%s%f"),dd,f);
 	//Longtude  12158.3416 dddmm.mmmm
 	dd = Longitude.Left(2);
 	mm = Longitude.Right(Latitude.GetLength()-2);
 	f = _wtof(Longitude.Left(2)) + _wof(Longitude.Right(Latitude.GetLength()-2));
 	Longitude.Format(_T("%s%f"),dd,f);


Thì kết quả mình nhận được là :




Kết quả thu được trực tiếp từ thiết bị (kết quả chưa qua chuyển đổi ) là :
1045.8055 --> kết quả trực tiếp do thiết bị nhận được
10.76345 ---> kết quả đúng khi chuyển qua độ % (kết quả mong muốn đạt được .)

Ai có thể chỉ cho mình lỗi trên được không ?

Mong được giúp đỡ .



p/s: có lẽ câu hỏi của mình ngốc quá nên không ai muốn trả lời chăng ?
[Up] [Print Copy]
  [Question]   Re: Chuyển đổi giá trị trong visual studio 2005 16/05/2008 16:52:35 (+0700) | #7 | 130809
Z0diac
Member

[Minus]    0    [Plus]
Joined: 25/04/2008 02:49:37
Messages: 21
Offline
[Profile] [PM]
Bạn thử Debug từng bước trong solution của bạn xem. Bạn thử làm ngoài giấy bằng tay từng bước giải thuật mà bạn đang áp dụng với một ví dụ cụ thể nào đó, sau đó trong quá trình Debug, bạn xem mình bị sai chỗ nào, và vì sao sai...Chúc bạn may mắn.
[Up] [Print Copy]
  [Question]   Re: Chuyển đổi giá trị trong visual studio 2005 17/05/2008 01:08:04 (+0700) | #8 | 130842
[Avatar]
pisco
Member

[Minus]    0    [Plus]
Joined: 23/08/2007 16:37:03
Messages: 39
Offline
[Profile] [PM]

Z0diac wrote:
Bạn thử Debug từng bước trong solution của bạn xem. Bạn thử làm ngoài giấy bằng tay từng bước giải thuật mà bạn đang áp dụng với một ví dụ cụ thể nào đó, sau đó trong quá trình Debug, bạn xem mình bị sai chỗ nào, và vì sao sai...Chúc bạn may mắn.
 


Thật sự mình mới làm quen với visual studio 2005 nên các hàm giải toán của nó mình vẫn chưa biết .

Nếu bạn biết thì hướng dẫn dùm mình nha.

Mình xin cảm ơn.

***

Đây là kết quả nhận được trực tiếp từ thiết bị (chưa qua chuyển đổi của độ (degree)) :




Còn đây là kết quả với đoạn code mình viết :
Code:
//doi ra Degree cho Longtitude va Latitude
	//Latitude 1045.8067 ddmm.mmmm
	CString dd = Latitude.Left(1);
	CString mm = Latitude.Right(Latitude.GetLength()-1);
	double f = _wtof(Latitude.Left(1))+ _wtof(Latitude.Right(Latitude.GetLength()-1))/60;
	Latitude.Format(_T("%s%f"),dd,f);
	//Longtude  10640.0508 dddmm.mmmm
	dd = Longitude.Left(2);
	mm = Longitude.Right(Latitude.GetLength()-2);
	double g = _wtof(Latitude.Left(2))+_wtof(Latitude.Right(Latitude.GetLength()-2))/60;
	Longitude.Format(_T("%s%f"),dd,g);


Kết quả :




Thật sự thì mình chưa biết vì sao kết quả lại ra như vậy ?

Ai có thể chỉ mình chỗ sai và hướng dẫn cho mình đựoc ko ?
[Up] [Print Copy]
  [Question]   Re: Chuyển đổi giá trị trong visual studio 2005 17/05/2008 01:20:21 (+0700) | #9 | 130845
[Avatar]
4hfoo
Elite Member

[Minus]    0    [Plus]
Joined: 29/01/2007 01:50:20
Messages: 115
Offline
[Profile] [PM]

//doi ra Degree cho Longtitude va Latitude
//Latitude 1045.8067 ddmm.mmmm
CString dd = Latitude.Left(1);
CString mm = Latitude.Right(Latitude.GetLength()-1);
double e = _wtof(dd); //đổi giá trị dd thành số thực tại đây:
double f = _wtof(Latitude.Left(1))+ _wtof(Latitude.Right(Latitude.GetLength()-1))/60;
double g = e + f; // tính tổng 2 cái
//bỏ cái này - Latitude.Format(_T("%s%f"),dd,f);
// đổi giá trị tổng g thành chuỗi rồi hiển thị lên màn hình...
//Longtude 10640.0508 dddmm.mmmm
dd = Longitude.Left(2);
mm = Longitude.Right(Latitude.GetLength()-2);
double g = _wtof(Latitude.Left(2))+_wtof(Latitude.Right(Latitude.GetLength()-2))/60;
Longitude.Format(_T("%s%f"),dd,g);
 


Bạn xem phần chú thích của mình để biết bị sai chỗ nào.
Bạn cần sửa tương trị cho phần longtitude.

Thân
[Up] [Print Copy]
  [Question]   Re: Chuyển đổi giá trị trong visual studio 2005 17/05/2008 10:23:14 (+0700) | #10 | 130907
[Avatar]
pisco
Member

[Minus]    0    [Plus]
Joined: 23/08/2007 16:37:03
Messages: 39
Offline
[Profile] [PM]

4hfoo wrote:

//doi ra Degree cho Longtitude va Latitude
//Latitude 1045.8067 ddmm.mmmm
CString dd = Latitude.Left(1);
CString mm = Latitude.Right(Latitude.GetLength()-1);
double e = _wtof(dd); //đổi giá trị dd thành số thực tại đây:
double f = _wtof(Latitude.Left(1))+ _wtof(Latitude.Right(Latitude.GetLength()-1))/60;
double g = e + f; // tính tổng 2 cái
//bỏ cái này - Latitude.Format(_T("%s%f"),dd,f);
// đổi giá trị tổng g thành chuỗi rồi hiển thị lên màn hình...
//Longtude 10640.0508 dddmm.mmmm
dd = Longitude.Left(2);
mm = Longitude.Right(Latitude.GetLength()-2);
double g = _wtof(Latitude.Left(2))+_wtof(Latitude.Right(Latitude.GetLength()-2))/60;
Longitude.Format(_T("%s%f"),dd,g);
 


Bạn xem phần chú thích của mình để biết bị sai chỗ nào.
Bạn cần sửa tương trị cho phần longtitude.

Thân 


Chào bạn !

Hôm nay mình có tìm lệnh để chuyển từ double về string : là _ecvt , nhưng khi mình debug thì giá trị bị sai .

Bạn có thể chỉ cho mình cách // đổi giá trị tổng g thành chuỗi rồi hiển thị lên màn hình...

Cám ơn bạn.
[Up] [Print Copy]
  [Question]   Re: Chuyển đổi giá trị trong visual studio 2005 17/05/2008 20:31:05 (+0700) | #11 | 130966
[Avatar]
4hfoo
Elite Member

[Minus]    0    [Plus]
Joined: 29/01/2007 01:50:20
Messages: 115
Offline
[Profile] [PM]

//doi ra Degree cho Longtitude va Latitude
//Latitude 1045.8067 ddmm.mmmm
CString dd = Latitude.Left(1);
CString mm = Latitude.Right(Latitude.GetLength()-1);
double e = _wtof(dd); //đổi giá trị dd thành số thực tại đây:
double f = _wtof(Latitude.Left(1))+ _wtof(Latitude.Right(Latitude.GetLength()-1))/60;
double g = e + f; // tính tổng 2 cái
//bỏ cái này - Latitude.Format(_T("%s%f"),dd,f);
Latitude.Format(_T("%f"),g); //hiển thị kết quả
//...
 


Bạn có thể dùng lệnh cũ bạn đã sử dụng, thử xem được hông smilie
Code:
Latitude.Format(_T("%f"),g);


Thân
[Up] [Print Copy]
  [Question]   Re: Chuyển đổi giá trị trong visual studio 2005 17/05/2008 21:46:06 (+0700) | #12 | 130973
[Avatar]
pisco
Member

[Minus]    0    [Plus]
Joined: 23/08/2007 16:37:03
Messages: 39
Offline
[Profile] [PM]
@4hfoo: Cách chuyển trên của bạn thì đúng rồi .

Nhưng giờ chương trình của mình có 1 rắc rối xày ra .

Code:
int n = nmeainfo.Replace(_T(","), _T(", "));
	CString *tok = new CString[n+1]; 
	CString resToken;
	int curPos= 0;
	int i = 0;
	resToken= "xxx";
	while (i<=n)
	{
	   //tok[i++] = resToken;
	   resToken= nmeainfo.Tokenize(_T(","),curPos); ---> nhận giá trị liên tiếp từ cổng COM
	   if (resToken == "") break;
	   tok[i] = resToken;
	   tok[i].Trim();
	   i++;
	};
        // nhận biết và tách chuỗi
        if (tok[0]==_T("$GPGGA"))
	{
		UTCTime = tok[1];
		Latitude = tok[2];
		NSIndicator = tok[3];
		Longitude = tok[4];
		EWIndicator= tok[5];
	}else 
	if	(tok[0]=="GPRMC")
	{
		UTCTime = tok[1];
		Latitude = tok[3];
		NSIndicator = tok[4];
		Longitude = tok[5];
		EWIndicator= tok[6];
	} ;


Các giá trị Latitude và Longitude của mình được nhận liên tục từ cổng COM .

Vì thế khi chuyển từ độ phút giây qua sang độ % và hiển thị kết quả thì xảy ra hiện tượng "chồng" giá trị . (Trong khi hiển thị giá trị Latitude & Longitude vẫn có giá trị đúng nhưng nó cứ bị nhảy đan xen vào các giá trị sai).

Vì mình muốn lưu 2 giá trị Latitude & Longitude (sau khi đã đổi qua độ %) vào 1 file text.

Code:
UpdateData(1);
		if (comm.get_CommEvent()==2){
		VARIANT data = comm.get_Input();
		tem += (CString)data.bstrVal; 
		if (( tem.Replace(_T("\r\n"),_T(""))))
		{
			
			gps.nmeainfo = tem;
			gps.parse();
			sreceive += tem;
			tem = "";
			dispUTC.SetWindowTextW ( (gps.UTCTime));
			dispLong.SetWindowTextW((gps.Longitude));
			dispLat.SetWindowTextW((gps.Latitude));

			//xuat ra file LAT LONG
			 CStdioFile fff(_T("toado.txt"),CFile::modeCreate | CFile::modeWrite | CFile::typeText );
			 fff.WriteString(gps.Latitude);
			 fff.WriteString(_T(","));
			 fff.WriteString(gps.Longitude);
			 fff.Close(); 
		}
	
	};
	UpdateData(false);


Có cách nào để khác phục hiển tượng trên không bạn .

Mình có nghĩ ra 1 giải pháp đó là : đầu tiên ta sẽ lưu tất cả các giá trị của Latitude & Longitude vào 1 mảng .Sau khi ghi xong , ta sẽ bắt đầu lấy Lat & Long từ mảng đó ra và xử lý . Có thể như vậy sẽ tránh được hiện tượng "chồng" giá trị khi hiển thị như ở bên trên.

Mong được bạn góp ý và hướng dẫn .

Cám ơn bạn .^^
[Up] [Print Copy]
  [Question]   Re: Chuyển đổi giá trị trong visual studio 2005 22/05/2008 09:44:56 (+0700) | #13 | 131954
[Avatar]
4hfoo
Elite Member

[Minus]    0    [Plus]
Joined: 29/01/2007 01:50:20
Messages: 115
Offline
[Profile] [PM]
Mình có một số ý kiến sau hi vọng có thể giúp bạn:

1- Việc hiện giá trị hiển thị bị đan xen với các giá trị sai, bạn có thể viết lại chương trình, sao cho khi đã nhận đầy đủ giá trị Latitude và Longitude thì mới chuyển đổi giá trị và hiển thị giá trị đó lên màn hình.

2- Việc ghi dữ liệu vào file, hiện tại mỗi lần bạn nhận được thì liền ghi giá trị vào file (mở file, ghi dữ liệu, rồi đóng file -> việc đóng mở file liên tục sẽ làm hao tốn tài nguyên). Bạn có thể mở file duy nhất một lần, sau đó cứ liên tục ghi vào file, sau đó trước khi bạn đóng chương trình hay cần lưu file thì bạn đóng nó lại.

Một cách khác là bạn có thể lưu dữ liệu tạm vào một mảng, khi đã tương đối nhiều thì mới bắt đầu ghi vào file. Tuy nhiên bạn cần chú ý tới điểm là trong khi bạn lưu dữ liệu vào file, dữ liệu từ cổng COM vẫn được truyền vào. Bạn cần cẩn thận trong việc xử lý để tránh dữ liệu bị đè lên nhau.

3- Nếu hiển thị dữ liệu trên màn hình bị nhấp nháy vì việc cập nhật quá nhanh, bạn có thể kiếm tài liệu về double-buffering để tìm hiểu thêm.

Thân
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|