سؤال

بسم الله الرحمن الرحيم

أثناء عملى فى أحد البرامج أردت إتاحة الفرصة للمستخدم أن يدخل للبرنامج ملف و يقوم بتحديد الـ character set أو الـ code page التى كتب بها هذا البرنامج، و داخل برنامجى قمت بعملها و لكن بعد ذلك اردتها فى برنامج أخر لذا قمت بكتابة هذه المكتبة و التى قمت بداخلها بتضمين الـ character set التالية:

ISO/IEC 8859-1    ISO/IEC 8859-2    ISO/IEC 8859-3    ISO/IEC 8859-4    ISO/IEC 8859-5    ISO/IEC 8859-6ISO/IEC 8859-7    ISO/IEC 8859-8    ISO/IEC 8859-9    ISO/IEC 8859-10   ISO/IEC 8859-11   ISO/IEC 8859-13ISO/IEC 8859-14   ISO/IEC 8859-15OEM-437    OEM-667    OEM-720    OEM-737    OEM-775    OEM-850    OEM-852    OEM-855    OEM-857OEM-858    OEM-860    OEM-861    OEM-862    OEM-863    OEM-864    OEM-865    OEM-866    OEM-867OEM-869    OEM-MIK    OEM-IranWindows-1250    Windows-1251    Windows-1252    Windows-1253    Windows-1254    Windows-1255Windows-1256    Windows-1257    Windows-1258

بالطبع يمكن إضافة أخرين و لكنى اكتفيت بهؤلاء.

الشرح التالي مختصر و لشرح أكثر تفصيلا قم بقرائة محتويات الملف DOC بمجلد المشروع، أيضا توجد بعض الأمثله موجوده داخل الملف TUTOR قم بقرائتهم إن اردت ان تتعرف على إستخدام المكتبه بشكل أكبر.

داخل مكتبة charset تكون three layers حيث كل منهم يختص بأمر معين و هذه الـ layers هى:

  • Unicode conversion.
  • character set implementation
  • character set conversion

الطبقة الأولى ممثلة بالفئة Unicode هى فئة تستخدم للتحويل بين UTF-8 و UTF-16 و UTF32 و موجودة داخل مجال الأسماء charset و تستخدم الأنواع التالية:

  • cu8_t: يقوم بحفظ code unit واحدة فقط لـ UTF-8.
  • cu16_t: يقوم بحفظ code unit واحده فقط لـ UTF-16.
  • cu32_t: يقوم بحفظ code unit واحده فقط لـ UTF-32.
  • utf8_t: يقوم بحفظ بحد أقصى عدد 4 قيم من نوع cu8_t.
  • utf16_t: يقوم بحفظ بحد أقصى عدد قيمتان من نوع cu16_t.
  • utf32_t: يقوم بحفظ بحد أقصى قيمة واحدة من نوع cu32_t.

الطبقة الثانية تحتوى على تعريف فئات character set و ليس لهم parent class لأن كل الدوال و الثوابت تم تعريفهم بـ static و الـ interface الخاصه بأيهم تستخدم أنواع Unicode السابق ذكرها باإضافه إلى الانواع التالية:

  • ncp_t: مسمي أخر للنوع char و يستخدم لتعريف حرف داخل الـ character-set بمساحة النوع char.
  • ccp_t: و هو النوع الذى يستخدم لتمثيل قيمة أى عنصر داخل أى character set و أى حرف به قيمته من صفر و حتى 0x7FFFFFFF.

الـ interface الخاصه بالـ character set تأخذ الشكل التالي:

struct charset{	// number of characters in character-set	static const cs_int32 char_count;	// is characters from 0 to 127 maps to US-ASCII character-set	static const bool ascii_compatible;	// is character-set is a multi-byte	static const bool is_multibyte;	// is character-set have unused slots in its map	static const bool have_unused_chars;	// is character-set have undefined characters by Unicode	static const bool have_undefined_unicode_chars;	// get character-set name	// return null-terminated non-empty US-ASCII string	inline static const char* get_name();	// get character-set description	// return null-terminated non-empty US-ASCII string	inline static const char* get_description();	// is character-set code-point allocated in the map	inline static bool is_defined(const ncp_t& cp);	inline static bool is_defined(const ccp_t& cp);	// is character-set code-point is unused by character-set	inline static bool is_charset_undefined(const ncp_t& cp);	inline static bool is_charset_undefined(const ccp_t& cp);	// is character-set code-point is undefined in Unicode	inline static bool is_unicode_undefined(const ncp_t& cp);	inline static bool is_unicode_undefined(const ccp_t& cp);	// is Unicode code-point exist in character-set	inline static bool unicode_in_charset(const utf8_t& cp);	inline static bool unicode_in_charset(const utf16_t& cp);	inline static bool unicode_in_charset(const utf32_t& cp);	// convert input Unicode code-point to character-set code-point	// returns:	//	1- helper::not_defined_in_charset if Unicode code-point not exist in character-set.	//	2- valid code-point value in range 0x00000000 to 0x7FFFFFFF	inline static ccp_t convert_to_charset(const utf8_t& cp);	inline static ccp_t convert_to_charset(const utf16_t& cp);	inline static ccp_t convert_to_charset(const utf32_t& cp);	// convert input character-set code-point to Unicode code-point	// returns:	//	1- helper::not_defined_in_unicode if code-point not exist in Unicode or out-of-charset-range or unused-in-charset.	//	2- a valid Unicode code-point.	inline static utf8_t convert_to_utf8(const ncp_t& cp);	inline static utf8_t convert_to_utf8(const ccp_t& cp);	inline static utf16_t convert_to_utf16(const ncp_t& cp);	inline static utf16_t convert_to_utf16(const ccp_t& cp);	inline static utf32_t convert_to_utf32(const ncp_t& cp);	inline static utf32_t convert_to_utf32(const ccp_t& cp);};

فئات الـ character set الموجوده داخل charset تستخدم UTF-32 لوصف حروفها و بالطبع ليسوا جميعهم فمثلا لو نظرت لصفحة محارف windows-1256 ستجد أن الأكواد من 0 و حتى 127 تطابق ASCII و بالتالي أكواد Unicode الخاصه بهم واحده و لهذا جعلت المصفوفة التى تحتوى على الأكواد الخاصه بـ UTF-32 تبدأ بالقيم من 128 و حتى 255 و بهذا قمت بحفظ المساحه المستهلكه لأقل قدر ممكن، بالطبع كان توجد أسليب أخرى لحفظ المساحه أكثر و لكني لم أرد استخدامهم و ذلك لعزمي على إضافة أكواد Han داخل المكتبة و فى هذه الحالة فـ UTF-32 ستكون مناسبة جدا عن غيرها.

فى التصميم السابق تم مراعاة الأمور التالية:

  • أن الـ character set التى تقوم بكتابة فئة لها تحتوى على كود غير مرتبط بحرف بمعنى unused slot.
  • أن الـ character set تحتوى على حرف غير موجود بـ Unicode.
  • أن الـ character set تستخدم أكثر من بايت لوصف حرف واحد.

فى التصميم السابق تقوم بتعريف الثوابت التالية:

  • char_count: هو عدد الأكواد المرتبطه بحروف داخل character set.
  • ascii_compatible: قم بجعل قيمتها true إذا كان أول 128 حرف داخل الـ character set هم ASCII.
  • is_multibyte: قم بجعل قيمتها true إذا كانت الـ character set تستخدم أكثر من بايت لوصف حرف واحد.
  • have_unused_chars: قم بجعل قيمتها true إذا كانت الـ character set تحتوى على اماكن أكواد غير مستخدمه.
  • have_undefined_unicode_chars: قم بجعل قيمتها true إذا كانت الـ character set تحتوى على حرف أو أكثر لا يوجد وصف لهم داخل Unicode.

بالإضافة للثوابت السابقه توجد الدوال التالية:

  • get_name: تقوم بإرجاع إسم الـ character set على هيئة نص ينتهى بـ NULL character و بحروف من ASCII فقط.
  • get_description: تقوم بإرجاع وصف الـ character set على هيئة نص ينتهى بـ NULL character و بحروف من ASCII فقط.
  • is_defined: تقوم بتمرير كود من أكواد الـ character set و تعيد true إذا كان هذا الكود مرتبط بحرف و هذا الحرف معرف داخل Unicode.
  • is_charset_undefined: تقوم بتمرير كود من أكواد الـ character set و تعيد true إذا كان هذا الكود غير مستخدم.
  • is_unicode_undefined: تقوم بتمرير كود من أكواد الـ character set و تعيد true إذا كان هذا الحرف المقابل لهذا الكود غير معرف داخل Unicode.
  • unicode_in_charset: تقوم بتمرير لها كود بصيغة UTF-8 أو UTF-16 أو UTF-32 و تعيد true إذا كان هذا الكود له حرف داخل الـ character set.
  • convert_to_charset: تقوم بتمرير لها كود بصيغة UTF-8 أو UTF-16 أو UTF-32 و إذا كان الحرف موجود داخل الـ character set يتم إرجاع الكود الخاص بالـ character set فى المدى من صفر إلى 0x7FFFFFFF و إذا كان كود Unicode غير موجود يتم إرجاع قيمة معرفة داخل الفئة helper بالإسم not_defined_in_charset.
  • convert_to_utfx: توجد منها 3 نسخ تتعامل مع أكواد يونيكود الثلاثة و تقوم فيهم بتمرير كود خاص بالـ character set و إذا كان هذا الكود يمكن تمثيله بـ Unicode يتم إرجاع الكود يونيكود بالصيغه التى تتلائم مع إسم الدالة المستخدمه و إذا كان كود الـ character set غير معرف داخل Unicode او غير مستخدم داخل الـ character set يتم إرجاع قيمة معرفة داخل الفئة helper بالإسم not_defined_in_unicode.

الطبقه الثالثه و الاخير موجوده داخل مجال الأسماء charset::conversion و تحتوى على فئة template واحدة بالإسم basic_converter و تستخدم فى التحويل بين أى character set و أخرى و قبل التحدث عنها توجد بعض الأمور التى تحتاج ان تعرفها:

الفئه basic_converter تقوم بالعمل على الفئتين basic_istream و basic_ostream و بالتالي أى فئات تندرج أسفلهم يمكن إستخلاص البيانات من istm و تحويلها ثم حفظها داخل ostm.

مع العلم انه يوجد character sets تحتوى على حرف يمكن تمثيله بأكثر من بايت و Unicode منهم إلا أن الكود الإفتراضي المكتوب لـ basic_converter لا يسمح بالتعامل إلى مع الـ streams المبنية على النوع char فقط و السبب يعود ان الفئات المبنية على النوع wchar_t او النوع unsigned short تتبع مفهوم wide character و تتسبب فى فشل حفظ بعض القيم الخاصه بـ Unicode.

الكود الإفتراضي للفئه basic_converter يسمح بتحويل الـ streams بالمحتويات التالية:

  • أى charset إلى charset أخرى، وإذا كانت نفس الـ charset مدخله فى الجانبين يتم التحقق من أكوادها قبل حفظها داخل الـ stream الأخرى.
  • من charset إلى Unicode و تسمح لك بتحديد أى نوع من Unicode ترغب به و أيضا إختيار حفظ الـ BOM و LE أو BE.
  • من Unicode إلى charset.
  • من Unicode إلى Unicode و تسمح لك بتحديد أى نوع من Unicode ترغب به و أيضا إختيار حفظ الـ BOM و LE أو BE.

فى الحالات السابقه:

  • التحويل من character set إلى اخرى يحتاج منك إستخدام فئة أخرى للوصل بين أكواد الـ character set المدخله.
  • لإستخدام Unicode تم تعريف فئات tag للعمل مع basic_converter فقط و هم utf8_charset و utf16_charset و utf32_charset.
  • التحويل بين أى character set واخرى (Unicode من ضمنهم) قد يفشل لعدة أسباب سيتم ذكرهم بعد قليل و إذا حدث أن فشلت عملية التحويل فسيتم وقف الكتابة داخل basic_ostream مباشرة.
  • الـ streams الممرره لابد و أن تفتح بإستخدام ios_base::binary و ذلك لمنع نظام التشغيل من تحويل أى قيم يتم تمريرها فمثلا داخل ويندوز إذا تم كتابة الكود 0x000AUTF-16 فستجد أن ويندوز قد كتبها بهذا الشكل 0x0D 0x0A 0x00 و هذا غير صحيح، هذا الأمر ينطبق على basic_istream و basic_ostream.
  • إذا كان الملف المدخل Unicode فإنه يتم تلقائيا التعرف على وجود الـ BOM و الـ Endiannes الخاصه به.

فشل عملية التحويل له أسباب محدده و هم موجودين داخل states enum و محتوياته هى:

  • OK: عملية التحويل تمت بنجاح.
  • UnexpectedEndOfFile: فشل التحويل للوصول لنهاية أثناء توقع وجود بيانات أخرى.
  • WriteError: لا يمكن الكتابة داخل basic_ostream.
  • ReadError: لا يمكن القراءة من basic_istream.
  • NoUnget : الفئة basic_istream لا تدعم إستخدام الدالة unget.
  • InvalidUTF16BOM: الملف المدخل له ترميز UTF-16 و الـ BOM به غير صحيحه.
  • InvalidUTF32BOM: الملف المدخل له ترميز UTF-32 و الـ BOM به غير صحيحه.
  • InvalidUTF8Byte: الملف المدخل له ترميز UTF-8 و يحتوى على octet بقيمه غير صحيحه.
  • InvalidUTF16Surrogate: الملف المدخل بترميز UTF-16 و قيمة الـ code unit التى تم قرائتها غير صحيحه.
  • OutOfRangeUnicodeCodePoint: الملف المدخل بترميز Unicode و يحتوى على قيمة تتعدى 0x10FFF.
  • UTF32InUTF16ReservedArea: الملف المدخل بترميز UTF-32 و يحتوى على ٌيمه محجوزه لترميز UTF-16.
  • OutOfRangeCharsetCodePoint: تم قراءة كود غير مدعوم داخل input character set.
  • CodePointNotDefinedInCharset: تم قراءة كود صحيح داخل الـ character set و لكن هذا الكود غير مستخدم و لا يوجد حرف مرتبط به.
  • CodePointNotDefinedInUnicode:تم قراءة كود صحيح داخل الـ character set و الحرف المرتبط بهذا الكود غير معرف بـ Unicode.

ذكرت عند التحويل بين character sets و لا أحد منهم Unicode فإنه يتم إستخدام فئة للربط بين أكواد الـ character set، هذه الفئه إسمها char_map و شكلها كالتالي:

template<typename ICS, typename OCS, bool ics_tag, bool ocs_tag, bool ics_mb, bool ocs_mb>struct charset_map;{   charset_map();   bool may_fail() const;   ccp_t operator[](const ncp_t&) const;   ccp_t operator[](const ccp_t&) const;};

الفئه charset_map تأخذ معاملين كـ template arguement و هم الت character set المراد التحويل منها و المراد التحويل إليها، و باقي المعاملات يتم تمرير القيم لها تلقائيا حسب المعاملين الأولين (راجع توثيق المكتبه لمزيد من الشرح)

تحتوى الفئه على التالي:

  • مشيد إفتراضي: يتم إستدعائه لإعداد الفئه.
  • الدالة may_fail: تعيد true إذا كانت input character set تحتوى على حروف غير موجوده داخل output character set.
  • المعاملين subscript: يتم إدخال كود يتبع input character set و يتم إعادة كود يتبع الـ output character set و إن كان الكود لا يقابله شئ يتم إرجاع not_defined_in_charset.

الفئه basic_converter هى فئه template و تصميمها يأخذ الشكل التالي:

template<typename ICS, typename OCS, typename IS, typename OS, bool ics_is_tag, bool ocs_is_tag>struct basic_converter{   basic_converter(IS& input, OS& output);   static bool may_fail();   OS& run();   states state() const;   bool failed() const;};

المعاملين ICS و OCS هم input and output character sets و المعاملين IS و OS هم المكان الذى سيتم القراءة منه و الذى سييم الكتابه فيه على التوالي، باقي المعاملات يتم تمرير قيمها تلقائيا.

المعاملين IS و OS لهم قيم إفتراضية و هم std::istream و std::ostream و هذا يعنى أنك يمكنك إستخدام الفئه و تمرير الـ character sets فقط إن كانت فئات الـ streams التى تستخدمها مبنية على istream و ostream و أغلب فئات iostream هم كذلك.

داخل الفئه basic_converter توجد الدوال التاليه:

  • المشيد: يحتوى دائما على معاملين على الأقل و هم على الترتيب كائن ليتم القراءة منه و اخر يتم الكتابه فيه.
  • may_fail: تعيد true إذا كانت عملية التحويل قد تفشل، لاحظ ان هذه الدالة static و لا تحتاج لإنشاء نسخه من الفئه لإستخدامها.
  • run: تقوم بتنفيذ عملية التحويل و تعيد دائما الكائن الذى كتب فيه.
  • state: تعيد أحد عناصر states و قبل عملية التحويل تعيد OK و بعد عملية التحويل تعيد قيمة تحديد حالة التحويل.
  • failed: قبل عملية التحويل تعيد false و بعد عملية التحويل تعيد true إذا فشلت عملية التحويل و false إذا نجحت.

الفئه basic_converter تم تخصيص نسخ منها للتعامل مع فئات الـ character sets المعرفه بالمكتبه و أيضا فئات Unicode tags السابق ذكرها و كل نسخه مخصصه تحتوى على بعض المشيدات و إليك تفصيلهم.

  • ICS==OCS==non-Unicode
    basic_converter(IS& input, OS& output, const charset_map<ICS, OCS>& map)
    المعامل map هو كائن من الفئة charset_map تقوم أنت بتمريرها.
     
  • ICS==Unicode && OCS==non-Unicode
    basic_converter(IS& input, OS& output);
  • ICS==non-Unicode && OCS==Unicode
    basic_converter(IS& input, OS& output);basic_converter(IS& input, OS& output, bool ostm_be);basic_converter(IS& input, OS& output, bool ostm_be, bool ostm_bom);
    ostm_be: إذا كانت true فحتوى output stream سيكون بصيغة Big Endian و إذا كانت false فسيتم الكاتبة بإستخدام Little-Endian.
    ostm_bom: إذا كانت true فسيتم كتابة Byte Order Mark.
    إذا كانت OCS==UTF-8 فقيمة ostm_be سيتم تجاهلها و إذا كانت OCS!=UTF-8 فسيتم تجاهل قيمة ostm_bom و سيتم كتابتها بكل الأحوال، أيضا داخل المشيدات التى لا تحتوى على ostm_be و ostm_bom فقيهم الإفتراضية هى false.
     
  • ICS==OCS==Unicode: مثل السابق تماما.

المثال التالي يفترض وجود الملف "input.txt" مكتوب بصيغة UTF-8 (الـ BOM لا تهم) و يحتوى على الكلمة "الفريق العربي للبرمجة - قسم ++C - مكتبة charset" داخل مجلد البرنامج و سيقوم بإنشاء الملفات التالية و يحتووا على نفس الكلمه:

  • win.txt: لصفحة محارف Windows-1256.
  • iso.txt: لصفحة محارف ISO/IEC 8859-6.
  • oem.txt: لصفحة محارف 720-OEM.
  • u8.txt: يونيكود UTF-8 بدون BOM.
  • u8bom.txt: يونيكود UTF-8 مع وجود BOM.
  • u16.txt: يونيكود UTF-16 Little-Endian
  • u16_be.txt: يونيكود UTF-16 Big-Endian
  • u32.txt: يونيكود UTF-32 Little-Endian
  • u32_be.txt: يونيكود UTF-32 Big-Endian
#include <iostream>#include <fstream>using std::cout;using std::endl;using std::ifstream;using std::ofstream;#include "charset.hpp"using charset::windows1256;using charset::iso8859_6;using charset::oem720;using charset::conversion::states;using charset::conversion::utf8_charset;using charset::conversion::utf16_charset;using charset::conversion::utf32_charset;using charset::conversion::basic_converter;template<typename OCS> states to_cp(ifstream& ifs, const char* file_name);template<typename OCS> states to_utf(ifstream& ifs, const char* file_name, bool bom, bool be);const char* file_names[] ={   "win.txt", "iso.txt", "oem.txt", "u8.txt", "u8bom.txt",   "u16.txt", "ut16_be.txt", "u32.txt", "ut32_be.txt"};const char* target_cs[] = {   windows1256::get_name(), iso8859_6::get_name(), oem720::get_name(),   "UTF-8", "UTF-8", "UTF-16", "UTF-16", "UTF-32", "UTF-32"};const char* states_name[] ={	"OK", "UnexpectedEndOfFile", "WriteError", "ReadError", "NoUnget",	"InvalidUTF16BOM", "InvalidUTF32BOM", "InvalidUTF8Byte", "InvalidUTF16Surrogate",	"OutOfRangeUnicodeCodePoint", "UTF32InUTF16ReservedArea", "OutOfRangeCharsetCodePoint",	"CodePointNotDefinedInCharset", "CodePointNotDefinedInUnicode"};int main(){   if (!ifstream("input.txt").is_open())   {      cout << "input file may not exist.\n";	  return 1;   }   for(int i=0; i<(sizeof(file_names)/sizeof(char*)); ++i)   {	  ifstream ifs("input.txt");	  states r = states::OK;      const char* fn = file_names[i];	  switch(i)	  {      case 0: r = to_cp<windows1256>(ifs, fn); break;      case 1: r = to_cp<iso8859_6>(ifs, fn); break;      case 2: r = to_cp<oem720>(ifs, fn); break;      case 3: r = to_utf<utf8_charset>(ifs, fn, false, false); break;      case 4: r = to_utf<utf8_charset>(ifs, fn, true, false); break;      case 5: r = to_utf<utf16_charset>(ifs, fn, true, false); break;      case 6: r = to_utf<utf16_charset>(ifs, fn, true, true); break;      case 7: r = to_utf<utf32_charset>(ifs, fn, true, false); break;      case 8: r = to_utf<utf32_charset>(ifs, fn, true, true); break;	  }	  	  if (r == states::OK)	     cout << "conversion succeeded to character-set '" << target_cs[i] << "' into file '" << fn << "'.\n";	  else	  {	     cout << "conversion failed with error: " << r << " (" << states_name[r] << ").\n";		 return 1;	  }   }}template<typename OCS>states to_cp(ifstream& ifs, const char* file_name){   ofstream ofs(file_name, std::ios_base::binary);   basic_converter<utf8_charset, OCS> conv(ifs, ofs);   conv.run();   return conv.state();}template<typename OCS>states to_utf(ifstream& ifs, const char* file_name, bool bom, bool be){   ofstream ofs(file_name, std::ios_base::binary);   basic_converter<utf8_charset, OCS> conv(ifs, ofs, be, bom);   conv.run();   return conv.state();}

كل ما يهمك موجود فى الدالتين to_cp و to_utf لأن كود التحويل موجود بهم.

صفحة المشروع داخل sourceforge.net، أيضا توجد نسخه إستاتيكية من المكتبة لمترجم مايكروسوفت و ++g بالموقع

كود الإصدار v1.1 بالمرفقات

v1.1src.zip

 

تابع تطورات المشروع على صفحته.

 

 

و الله ولي التوفيق

تم تعديل بواسطه C++er
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

5 إجابة على هذا السؤال .

  • 0

السلام عليكم ...

شكرا .. جزاك الله خيرا ..

سؤال خارج الموضوع عن بيئة التطوير التي استخدمتها ؟ (المحرر ونظام التشغيل) ...؟ لفت نظري انه لا يوجد اي makefile  أو سكربت للترجمة ...؟ :)

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
سؤال خارج الموضوع عن بيئة التطوير التي استخدمتها ؟ (المحرر ونظام التشغيل) ...؟ لفت نظري انه لا يوجد اي makefile  أو سكربت للترجمة ...؟ :)

بيئة التطوير Sublime Text 2 استخدمته لكتابة و ترجمة الكود، نظام التشغيل Windows XP و Ubuntu Linux 12.10 64Bit.

 

عدم وجود ملف Makefile نسيت رفعه :)، كنت وضعته فى مكان منفصل لكثرة التعديل عليه.

 

شكرا لتنبيهي، جزاك الله خيرا.

 

 

و الله ولي التوفيق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تم تحديث المرفقات بالمشاركه الأولى لتحتوى على ملف Makefile و الذى يمكن إستخدامه مع المترجمات التاليه:

  • ++GNU C: و هو الإفتراضي و يمكن إستدعائه بشكل صريح بإستخدام gnu.
  • Clang: يتم إستدعائه بشكل صيح بإستخدام clang.
  • ++Visual C: يتم إستدعائه بشكل صريح بإستخدام vcpp.
  • ++Intel C: يتم إستدعائه بشكل صريح بإستخدام icl.

كل المترجمات تقوم بإنشاء ملفات object داخل المجلد obj و تقوم بإنشاء اللمكتبة الإستاتيكية داخل المجلد bin و إسم المكتبه يأخذ الشكل charset-cn.ext حيث cn هو إسم المترجم و ext هو إمتداد المكتبة و يكون إما a او lib حسب المترجم المستخدم.

 

نسخ المكتبات الموجوده بصفحة المشروع تم تحديثها لوجود خطأ فى مكتبة ++Visual C السابقة.

 

 

و الله ولي التوفيق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزاك الله خيرا على التوضيح و الشرح ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تم تحديث المكتبة للإصدار 1.1.1

 

 

و الله ولي التوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .