PDA

View Full Version : تبدیل رشته ها



A_Salimi
جمعه 02 فروردین 1387, 12:40 عصر
با سلام و تبریک سال جدید خدمت دوستان :

در مورد تبدیل رشته ها چند تا سوال دارم :

میخواستم بدونم فرق string و CString و System::string دقیقا چیه ؟(تا جایی که اطلاع دارم CString برای mfc و string داده ای در دات نت هستش . System::string رو هم نمی دونم
حالا میخواستم در مورد تبدیل در مورد این نوعها واسم توضیح بدید :
من تابعی دارم که آرگومانهاش بعد از باز کردن پرانتز در tooltip ی به صورت زیر نمایش داده میشه :




System::object ^)نام تابعsystem::string ^ %,int %)

بعد از تحقیق دوستان برای استفاده از این تابع راه حلی رو به صورت زیر به من پیشنهاد دادن :




System::String^x = gcnew System::String(CString داده از نوع );


در هر حالx متغیری برای نوع مورد نیاز من هست
اما در نهایت با این error مواجه میشم :

cannot convert parameter 1 from 'System::Object ^' to '__const_String_handle'

ممکنه راهنمایی بدید
با تشکر

Nima_NF
جمعه 02 فروردین 1387, 13:35 عصر
به این صورت بنویسید ، نباید مشکلی باشد:



CString str = _T("test");

String ^ strE = gcnew String( str );

A_Salimi
جمعه 02 فروردین 1387, 14:11 عصر
باید بگم بدتر شد!!

فرض کنید str قراره از یک edit box مقدار بگیره
با این کدها مشکلات زیر بوجود اومدند :


String' : undeclared identifier
error C2061: syntax error : identifier 'String'

همونطوری که گفتم و در بالا آوردم پارامتر ورودی تابع از نوع system::string هست

من این تبدیل رو برای استفاده در تابع میخوام.
تشکر

Nima_NF
جمعه 02 فروردین 1387, 16:16 عصر
منظور از قطعه کد قبلی این بود که آدرس رشته ارسال شود ،ضمنا باید فضای System را در ابتدا تعریف کنید به این صورت:



using namespace System;

یا به همان شکل کد خودتان با System::String


من این تبدیل رو برای استفاده در تابع میخوام.تبدیل خاصی نمی خواهد ، هر رشته ای که دارید و از هر کجا که می خواهید ( مثلا اشاره گری به یک رشته از نوع char و یا CString مخصوص MFC) آن را در متغیر رشته ای خود کپی کنید و سپس همان قطعه کد را استفاده کنید تا به System::String تبدیل کند. شما کد خود را کامل ننوشتید تا به شما بگوییم چه اشتباهی کرده اید فقط نوشتید داده از نوع CString .
ضمنا String با strting که s کوچک هست فرق می کنند ، دقت کنید.

توابع دیگری برای تبدیلات وجود دارد:
http://msdn2.microsoft.com/en-us/library/ms235631(VS.80).aspx (http://msdn2.microsoft.com/en-us/library/ms235631%28VS.80%29.aspx)
PtrToStringChars

A_Salimi
جمعه 02 فروردین 1387, 23:58 عصر
در لینکی که دادید هم دقیقا داره روشی رو که گفتم رو انجام میده یعنی برای CString به System::string داره اینطور کاری رو انجام میده :



// Convert to a System::String
String ^systemstring = gcnew String(orig);
systemstring += " (System::String)";
Console::WriteLine("{0}", systemstring);
delete systemstring;

ولی مشکل من از اینجا شروع شد :
من دارم از همون dll معروف shami استفاده می کنم تمام توابعش رو که البته یک آرگومان ورودی داشتند رو با همون کدی که دادم به راحتی باهاشون کار می کنم اما یه تابع با دو آرگومان به نام ShamsiIncrease در این dll وجود داره که داره مشکل ساز میشه من به این صورت دارم باهاش کار میکنم :



using namespace ShamsiDLL;





UpdateData();
ClassShamsiClass cls;
System::String^ strDate = gcnew System::String(Edit1);
hasel = cls.ShamsiIncrease(strDate,num);
UpdateData(FALSE);


Edit1متغیر یک edit box از نوع CString و strDateخروجی برای استفاده در تابع هست
و hasel برای چاپ جواب در خروجی هست . numهم عددی است که قرار است از تاریخ مورد نظر ما کم کند
نمیدونم چرا در این تابع به error زیر میرسه ؟

cstringt.h(1098) : error C2664: 'PtrToStringChars' : cannot convert parameter 1 from 'System::Object ^' to '__const_String_handle'

see reference to function template instantiation 'ATL::CStringT<BaseType,StringTraits>::CStringT<System::Object>(SystemString ^)' being

Nima_NF
شنبه 03 فروردین 1387, 02:13 صبح
لطفا سوال خود را از ابتدا به صورت کامل مطرح کنید ؛ چون پس از چندین ارسال معلوم می شود که کلا هدف شما چیز دیگری بوده است، لطفا در هنگام مطرح کردن سوال خود دقت بیشتری کنید.

روش System::String و این تبدیل از نوع دات نت هست ، dll مذکور شما یک کتابخانه COM هست و نمونه هایی که در آن dll با string وجود دارد برای زبان VB مثال زده شده است نه ++C ، و ربطی به دات نت ندارد ، چرا از این شیوه تبدیل استفاده می کنید؟

شما در هر زبانی که هستید با رشته های همان زبان باید کار کنید مثلا تا آنجا که اطلاع دارم برای پارامتر اول ShamsiIncrease نیاز به استفاده از یک رشته یه صورت wide هست

A_Salimi
شنبه 03 فروردین 1387, 14:03 عصر
لطفا سوال خود را از ابتدا به صورت کامل مطرح کنید ؛ چون پس از چندین ارسال معلوم می شود که کلا هدف شما چیز دیگری بوده است، لطفا در هنگام مطرح کردن سوال خود دقت بیشتری کنید.

تصور من این بود که اشکال در نوع تبدیل است و چون توابع دیگر این dll رو به همون روشی که گفتم صدا میزدم اون رو کامل مطرح نکردم چون احساس میکردم با یک تبدیل ساده مشکل برطرف میشه

در هر حال مشکل فکر میکنم در اینجاست که خروجی تابعی که در موردش بحث شد از نوع داده ای object هست و اشتباه من این بود که از نوع CString برای خروجی استفاده میکردم
اما در هر حال من از روش زیر استفاده کردم (با اینکه جواب داد خیلی دوست دارم نظرتون رو راجع به این تبدیل بدونم )



UpdateData();
ClassShamsiClass cls;
String^ y = gcnew String(date1);
System::Object^ o;
o=cls.ShamsiIncrease(y ,num);
String^ ss = o->ToString();
hasel= ss;
UpdateData(FALSE);

اگه پیشنهادی دارید خوشحال میشم روش کار کنم