الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

المرحلة الثانية : تطوير وحدة i/o - الملفات .

بدأه فريق الأندلس في 11 أكتوبر 2009 · 35 رد · 4,539 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#26

:happy:

ردود سريعة يا أخوان حتى ننتهي من هذه الحزمة المملة وننتقل إلى قلب المحرك في المرحلة الثالثة .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#27
اقتباس
getOpenMode: لمعرفة الوضع المفتوح عليه الـStream

اعتقد انه مهما كانت فئة التعامل مع الملفات ديناميكيه لن تصل لفتح الملفات عن طريق تمرير متغيرات. الهدف من هذا الكلام ان هذه الداله لا داعى منها حيث انك عندما ستفتح ملف ستحدد اى نوع ترديه و غن لم تحدد سيكون الوضع الطبيعى للقراءة فقط.

** انا اؤيد الداله seek بنوعيها و اؤيد فكرة الغاء الداله setPosition، كذلك انا مع فكرة تغيير اسم الداله getPosition إلى getCursorPosition.

اقتباس
من المفترض أنه عند فتح الملف فإنه سيفتح للقراءة والكتابة معاً .. هل تقترحون اعطاء المستخدم الحرية في تحديد طريقة فتح الملف ، فلو اختار for reading مثلا .. فان write لن يكون لها أثر .

الوضع الإفتراضى عند فتح ملف دون تحديد اى معاملات ان يتم فتحه للقراءة فقط.

ايضا كما ذكرت سابقا المشيد الخاص بفئات الملفات سيقوم فقط بعمل initialize للفئه و لن يقوم بفتح الملف و لكن المستخدم هو من سيقوم بفتح الملف بإستخدام الداله open و كذلك سيقوم بإغلاقه بإستخدام الداله close و حيث اننا تطرقنا لهذه النقطه فلابد من وجود الداله flush التى تحفظ ما بالـ stream دون غلقها.

القيم التى سيمررها المستخدم للمشيد الخاص بالفئه (و الذى سيكون موجود داخل الفئه StreamManager) سيتم تخزينها فقط داخل متغيرات بالفئه حتى تسهل العمل داخل الفئه فيما بعد.

اقتباس
قد لا تكون الخيارات تغطي كافة المتطلبات ، لكن يمكن أن نسمح بخلطها

لا يجب خلط العمليات اثناء ادخالها و ذلك اولا لتنظيم عمليات الإدخال ثانيا لإنه يتم حفظ نوع العلميات داخل متغيرات و بهذا الإسلوب ستصبح عملية فصلهم صعبه حيث انه من الممكن ان يكون فتح الملف قراءة فقط ياخذ الرقم صفر و كذلك تحريك المؤشر لأخر الملف يأخذ نفس الرقم و بذلك لن يتم التفرقه بينهم.

** بالنسبه للدوال

	bool Open(); // open file
	bool IsOpen();  // is current file is opened
	LONGLONG getCursorPosition(); // get current position
	bool IsBOF(); // is pointer in beginning of the file
	bool IsEOF(); // is pointer in end of the file
	long getFileSize(); // get file size

اوافق عليهم بعد معرفة لأى فئه سيتم اضافتهم ؟؟

اقتباس
المشكلة الان أن الملف نفتحه بمجرد انشاء الكائن ، ولو أغلقناه عن طريق close لايمكن فتحه مرة أخرى إلا بإعادة انشاء الكائن new .. هل ترون اضافة open لتعمل مع الملفات ؟

تمت الإجابه على هذا الأمر بأعلى.

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

مدونتي: C++ Tips and Tricks

#28

بارك الله فيك أخ محمد :-) .

اقتباس
اوافق عليهم بعد معرفة لأى فئه سيتم اضافتهم ؟؟

إلى Stream ، بعض الدوال مثل : getFileSize ستعيد حجم الملف الثنائي أو حجم الملف النصي أو حجم المصفوفة في الذاكرة لذلك نختار لها اسم عام مثل getLength وهي موجودة بالفعل في المواصفات الان .

وهكذا مع بقية الدوال ، يكون الاسم عام وليس للملفات فقط ، حتى يمكن لاحقاً أن تتأقلم مع MemoryStream أو FileStream .

@ نقطة : فتح الملف واغلاقه واضحة الان ..

@ flush : لا أعرف كيف ستعمل عندما يكون Stream من نوع MemoryStream ؟

@ بعض العمليات لن يكون لها تأثير الا على FileStream وليس MemoryStream مثل ، close .. حسب ما أظن - لذلك لاتوجد مشكلة هنا -

اقتباس
الوضع الإفتراضى عند فتح ملف دون تحديد اى معاملات ان يتم فتحه للقراءة فقط.

ايضا كما ذكرت سابقا المشيد الخاص بفئات الملفات سيقوم فقط بعمل initialize للفئه و لن يقوم بفتح الملف و لكن المستخدم هو من سيقوم بفتح الملف بإستخدام الداله open و كذلك سيقوم بإغلاقه بإستخدام الداله close و حيث اننا تطرقنا لهذه النقطه فلابد من وجود الداله flush التى تحفظ ما بالـ stream دون غلقها.

لكن أخ محمد كيف سنتعامل مع الخيارات التالية :

- فتح ملف للقراءة - خطأ اذا لم يعثر عليه

- فتح ملف للقراءة و الكتابة - خطأ اذا لم يعثر عليه

- فتح ملف للقراءة والكتابة بعد تحريك المؤشر الى اخر الملف - خطأ اذا لم يعثر عليه .

- فتح ملف للقراءة ، امسح أي ملف موجود مسبقا .

- فتح ملف للقراءة و الكتابة ، اسمح أي ملف موجود مسبقا .

- ..

وهكذا .. هذه الخيارات موجودة في أي مكتبة ، مثال على ذلك ، من خلال std::fstream :

post-42837-1255727357_thumb.png

يمكن أن نصمم enum شبيهة بهذه مع التعديلات اللازمة :

enum	  openmode_bits {
  in = (1 << 0),
  out = (1 << 1),
  app = (1 << 2),
  ate = (1 << 3),
  trunc = (1 << 4)
}

تم تعديل هذه المشاركة بواسطة الشمري في 17 أكتوبر 2009 في 00:17

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#29
اقتباس
@ flush : لا أعرف كيف ستعمل عندما يكون Stream من نوع MemoryStream ؟

بالتأكيد لن تعمل لذا قد نصيف الداله getCanFlush للتأكد من ان الـ stream تدعم عملية الـ flush.

اقتباس
لكن أخ محمد كيف سنتعامل مع الخيارات التالية :

- فتح ملف للقراءة - خطأ اذا لم يعثر عليه

- فتح ملف للقراءة و الكتابة - خطأ اذا لم يعثر عليه

- فتح ملف للقراءة والكتابة بعد تحريك المؤشر الى اخر الملف - خطأ اذا لم يعثر عليه .

- فتح ملف للقراءة ، امسح أي ملف موجود مسبقا .

- فتح ملف للقراءة و الكتابة ، اسمح أي ملف موجود مسبقا .

- ..

وهكذا .. هذه الخيارات موجودة في أي مكتبة ، مثال على ذلك ، من خلال std::fstream :

انا كنت اتكلم عن Win32API حيث اذا تم فتح ملف و لم يكن موجود سيتعم العوده INVALID_HANDLE و سأعرف حينها ان هناك خطب ما و سأستطيع تحديده ثم العوده بـ (exception \ errCode).

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

لا اعلم بخصوص fstream فلم استخدمها كثيرا على عكس Win32API.

امر اخر لاحظت ان الفئه fstream عند تمرير المعاملات الخاصه بفتح الملف يتم تمريرها لها كلها داخل معامل واحد و هذا سيجعل عناصر الـ enum لها ترقيم معين، و على الجانب الأخر دوال الملفات تفصل بين تلك العمليات و لك واحده منهم رقم مخالف للذى يتم التعامل معه بإستخدام الأخر و بالتالى لابد من فصل تلك العناصر فى enums مختلفه و اعطائها ارقام معينه و بداخل الكود يتم ابدالهم بارقام اخرى تبعا للـ implementation.

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

مدونتي: C++ Tips and Tricks

#30
اقتباس
نقطه اخرى : لا تنسى مسأله مشاركة الملف بعد فتحه مع البرامج الأخرى فمثلا عندما تفتح الملف للقراءة فقط ستمنع الكتابه به و ذلك حتى لا تحدث مشكله به نفس الكلام عندما تفتحه للكتابه فستمنع الكتابه و لكن لا مشكله من القراءة منه اما فى حالة القراءه و الكتابه فستمنع العليتان من قبل البرامج الأخرى حتى تنتهى من الملف.

لا اعلم بخصوص fstream فلم استخدمها كثيرا على عكس Win32API.

لا أعرف شيء كهذا في المكتبات القياسية ، لذلك حتى لو أضفناها في المواصفات فقد نواجه صعوبات في implementation ، يمكنك معالجة هذه المشكلة في نسخة Win32 APIs لو أحببت ،وان شاء الله لن نحتاجها في المحرك بشكل كبير .

اقتباس
امر اخر لاحظت ان الفئه fstream عند تمرير المعاملات الخاصه بفتح الملف يتم تمريرها لها كلها داخل معامل واحد و هذا سيجعل عناصر الـ enum لها ترقيم معين، و على الجانب الأخر دوال الملفات تفصل بين تلك العمليات و لك واحده منهم رقم مخالف للذى يتم التعامل معه بإستخدام الأخر و بالتالى لابد من فصل تلك العناصر فى enums مختلفه و اعطائها ارقام معينه و بداخل الكود يتم ابدالهم بارقام اخرى تبعا للـ implementation.

لم أستوعب هذه النقطة كثيراً لكن يبدو لي أني فهمت شيء مما تقصد ، يمكننا تأجيلها إلى implementation ، افعل ماتراه مناسب في Implementation وبناء على المحصلة النهائية سنعرف الأرقام المناسبة وتوزيعها ان شاء الله ..

سأقوم ان شاء الله بتحديث المواصفات بناء على الاقتراحات التي وصلنا لها ،

بالنسبة للـ IniFile ، فيمكن اضافته متى ما تفرّغ الأخ سلوان لو أحب ذلك ( الواجهة IniFile ليست لها علاقة كثيراً ببقية الواجهات لذلك يمكننا اكمال العمل دون خوف ) .

اذا لم توجد المزيد من الملاحظات فأقترح أن نبدأ توزيع الكعكة غداً :D .

تم تعديل هذه المشاركة بواسطة الشمري في 17 أكتوبر 2009 في 18:22

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#31

السلام عليكــم ورحمـة الله وبركاتــه ،،

أحارب الوقت بشراسة هذه الأيام، أتمنى إني لم أكن سبباً للتأخير:

package name [color= #000000;]: Andalus.[color= #808000;]IO

 

[color= #007f00;]/// Represents one ini file

[color= #007f00;]///

[color= #007f00;]/// This object represents one ini file, you construct it by passing the filename/path

[color= #007f00;]///

[color= #007f00;]/// # Syntax

[color= #007f00;]/// ini files syntax is as follows:

[color= #007f00;]/// code

[color= #007f00;]///     [sECTION]

[color= #007f00;]///    NAME=VALUE

[color= #007f00;]///    ...

[color= #007f00;]/// endcode

[color= #007f00;]/// SECTION: the name of the section of data, for example: [VideoSettings]

[color= #007f00;]/// NAME: any valid variable name, for example: Resolution

[color= #007f00;]/// VALUE: could be

[color= #007f00;]///          - Integer (example: Depth=32)

[color= #007f00;]///        - Float (example: Version=4.55)

[color= #007f00;]///        - String (example: Background=nature.jpg)

[color= #007f00;]///        - List of Integers (example: Resolution=1024,768)

[color= #007f00;]///        - List of Floats (example: triangle_v0 = 3.0,2.3)

[color= #007f00;]///

[color= #007f00;]/// # Usage

[color= #007f00;]/// When you create an inifile, it automatically parses the given file to provide you with

[color= #007f00;]/// quick access to data, you can also modify data and save the new changes back to

[color= #007f00;]/// any file.

[color= #007f00;]/// It is possible to create an empty IniFile object, then fill it with data and save

[color= #007f00;]/// the resulting ini to a file.

[color= #007f00;]///

[color= #007f00;]/// # Implmentation

[color= #007f00;]/// IniFile is a high level object, so it doesn't have to present a low level interface.

[color= #007f00;]/// Data should be organised in maps/dictionaries internally.

[color= #007f00;]/// 

[color= #007f00;]/// # Exceptions

[color= #007f00;]/// - File not found: when you pass a file name that doesn't exist to constructor.

 

interface IniFile

[color= #000000;]{

    [color= #007f00;]/// @Purpose    : constructs an empty IniFile.

    IniFile[color= #000000;]([color= #000000;]);

    [color= #007f00;]/// @Purpose    : constructs an IniFile and fills it with data by parsing the ini file.

    [color= #007f00;]/// Throws exception if file was not found.

    IniFile[color= #000000;]([color= #000000;][IN[color= #000000;]] std[color= #000000;]::[color= #808000;]string[color= #000000;]& filename[color= #000000;]);

 

    [color= #007f00;]/// @Purpose    : sets an integer value.

    [color= #0000ff;]void setInt[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& section, [color= #000000;][IN[color= #000000;]] string[color= #000000;]& name, [color= #000000;][IN[color= #000000;]] [color= #0000ff;]int value[color= #000000;]);

    [color= #007f00;]/// @Purpose    : gets an integer value

    [color= #007f00;]/// @Return    : 'true' if value is found, 'false' if it wasn't.

    [color= #0000ff;]bool getInt[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& section, [color= #000000;][IN[color= #000000;]] string[color= #000000;]& name, [color= #000000;][OUT[color= #000000;]] [color= #0000ff;]int value[color= #000000;]);

 

    [color= #007f00;]/// @Purpose    : sets an integer list.

    [color= #0000ff;]void setIntList[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& section, [color= #000000;][IN[color= #000000;]] string[color= #000000;]& name, [color= #000000;][IN[color= #000000;]] List[color= #000000;]<[color= #0000ff;]int[color= #000000;]> value_list[color= #000000;]);

    [color= #007f00;]/// @Purpose    : gets an integer list.

    [color= #007f00;]/// @Return    : 'true' if list is found, 'false' if it wasn't.

    [color= #0000ff;]bool getIntList[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& section, [color= #000000;][IN[color= #000000;]] string[color= #000000;]& name, [color= #000000;][OUT[color= #000000;]] List[color= #000000;]<[color= #0000ff;]int[color= #000000;]> value_list[color= #000000;]);

 

    [color= #007f00;]/// @Purpose    : sets a float value.

    [color= #0000ff;]void setFloat[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& section, [color= #000000;][IN[color= #000000;]] string[color= #000000;]& name, [color= #000000;][IN[color= #000000;]] [color= #0000ff;]float value[color= #000000;]);

    [color= #007f00;]/// @Purpose    : gets a float value

    [color= #007f00;]/// @Return    : 'true' if value is found, 'false' if it wasn't.

    [color= #0000ff;]bool getFloat[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& section, [color= #000000;][IN[color= #000000;]] string[color= #000000;]& name, [color= #000000;][OUT[color= #000000;]] [color= #0000ff;]float value[color= #000000;]);

 

    [color= #007f00;]/// @Purpose    : sets a float list.

    [color= #0000ff;]void setFloatList[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& section, [color= #000000;][IN[color= #000000;]] string[color= #000000;]& name, [color= #000000;][IN[color= #000000;]] List[color= #000000;]<[color= #0000ff;]float[color= #000000;]> value_list[color= #000000;]);

    [color= #007f00;]/// @Purpose    : gets a float list

    [color= #007f00;]/// @Return    : 'true' if list is found, 'false' if it wasn't.

    [color= #0000ff;]bool getFloatList[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& section, [color= #000000;][IN[color= #000000;]] string[color= #000000;]& name, [color= #000000;][OUT[color= #000000;]] List[color= #000000;]<[color= #0000ff;]float[color= #000000;]> value_list[color= #000000;]);

 

    [color= #007f00;]/// @Purpose    : sets a string value.

    [color= #0000ff;]void setString[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& section, [color= #000000;][IN[color= #000000;]] string[color= #000000;]& name, [color= #000000;][IN[color= #000000;]] string[color= #000000;]& value[color= #000000;]);

    [color= #007f00;]/// @Purpose    : gets a string value.

    [color= #007f00;]/// @Return    : 'true' if value is found, 'false' if it wasn't.

    [color= #0000ff;]bool getString[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& section, [color= #000000;][IN[color= #000000;]] string[color= #000000;]& name, [color= #000000;][OUT[color= #000000;]] string[color= #000000;]& value[color= #000000;]);

 

    [color= #007f00;]/// @Purpose    : checks whether section exists

    [color= #007f00;]/// @Return    : 'true' if section exists, 'false' if it doesn't

    [color= #0000ff;]bool hasSection[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& section[color= #000000;]);

    [color= #007f00;]/// @Purpose    : returns all sections.

    [color= #007f00;]/// @Return    : a string list of all sections within IniFile now.

    List[color= #000000;]<string[color= #000000;]> getSections[color= #000000;]([color= #000000;]);

 

    [color= #007f00;]/// @Purpose    : saves current data to specified file.

    [color= #007f00;]/// @Return    : 'true' if file was written successfully, 'false' if not

    [color= #0000ff;]bool save[color= #000000;]([color= #000000;][IN[color= #000000;]] string[color= #000000;]& filename[color= #000000;]);

[color= #000000;]}

ما رأيكم؟ :)

يجب أن أذهب للجامعة بسرعة الآن... :wacko:

تم تعديل هذه المشاركة بواسطة SandHawk في 18 أكتوبر 2009 في 13:05

#32

رائع وتوثيق واضح :) .. سأضيفه إلى قائمة المواصفات وأرفعه إلى svn اذا لم تفعل ذلك .. سأتأكد الان .

بالمناسبة : لا يجب أن يعمل أحد في المشروع إلا وهو يشعر بمتعة العمل به .. ويملك الوقت لذلك .. لايجب محاربة الوقت ;) .. حتى لاتكره المنتدى بكامله :) .

سأحاول تحديث المواصفات وتحديث svn كذلك .. حيث تكلمت مع الاخ محمد علاء سابقاً حول موضوع اضافة ملف المشروع الى svn .. حتى نختصر العمل الروتيني مع الاحتفاظ على نفس هيكلة svn الحالية ( تقريباً ) .

بداية Implementation قريبة بحول الله .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#33

امم .. كسل في الأيام الماضية :lol:

هناك مشكلة في نسخة السي بلس ،

على فرض أن من يريد عمل implementation باستخدام Win32 APIs .

سيستخدم uint64 أو int64 .

ومن يريد استخدام standard c++ lib أي fstream ، سيتعامل مع streampos .. أي مع Int .

السؤال :

ما رأيكم ، هل نجعل كل البيانات الخاصة بالملفات من نوع int32 أو uint32 ؟ وبالتالي نتجاهل 64-bit لأني أظن أننا لن نتعامل في الألعاب مع ملفات ضخمة تزيد عن 2 جيجا ؟ أليس كذلك ؟

صوتي هو مع الاستغناء عن دعم 64- bit الان .. وبانتظار أي رأي أفضل .

اذا كان الرأي مع دعم 64-bit ، كيف سنوافق بين أنواع البيانات في هذه الحالة ؟

هل نعمل cast في fstream إلى int32 ?

بالمناسبة :

استخدم حاليا برنامج power designer لتصميم class diagram، وهو يقوم بانشاء الملفات و الكلاسات اللازمة واضافة التعليقات بأسلوب جميل ، لجميع اللغات .. لذلك عند عمل implementation سيجد المبرمج أن كل شيء جاهز .. ما عليه إلا أن يكتب محتوى كل Method !

سأرفع ان شاء الله المشروعين على svn ، متى ما حلّينا المشكلة السابقة .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#34

لا أعتقد أن الملفات الضخمه ستكون مشكله لأن يمكن تقسيم أي ملف إلى عدت أقسام وبذلك لو كان هناك ملف حجمه 3G يمكن تقسيمه إلى قسمين مساحت كل منهما 1.5G مثلا

أتمنى لكم التوفيق شباب

#35

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

تأخرنا كثيرا -_- .

قمت بتحديث svn ، نسخة السي بلس و الجافا :

  1. للتذكير : يمكن تحميل المحرك بشكل كامل من هنا ( svn طبعا ) :
    https://andalus-engine.svn.sourceforge.net/.../andalus-engine
    ولاستعراض الملفات :
    http://andalus-engine.svn.sourceforge.net/...andalus-engine/
  2. هنا العديد من التحديثات وأهمها :
    • الان تـاتي ملفات المشاريع بشكل تلقائي .. بالتالي لاحاجة لأن تقوم بأي اعدادات بنفسك ، كل ماعليك فعله هو فتح ملف المشروع وستجد كل شيء جاهز للترجمة .
    • في السي بلس بلس : يوجد دعم للمترجم Visual C++ 2008 و CodeBlocks-MingW حيث يمكن أن تجد ملفات المشاريع تحت المجلد build اختر ما يناسبك منهما ..
    • في الجافا : افتح NetBeans واختر المجلد 0.1 المتواجد تحت المجلد andalus-java وعندها سيتم فتح المشروع .
    • في السي بلس : هناك ثلاث مجلدات رئيسية :
      source : ويحوي على كود المحرك .. كل حزمة تكون في مجلد خاص مثل Core و IO والملفات التي تحت الحزمة Andalus مباشرة .. مثل Exception فهي توجد داخل المجلد source مباشرة .
      tests : ويحوي على التجارب .. كل حزمة لها مجلد خاص مثل IO و Core
      build : يحوي على مجلدين VC9 و CodeBlocks حيث توجد المشاريع ,
      في الجافا .. أيضا نفس الهيكلة تقريبا .
      المهم .. عند اضافة أي ملف .. تضعه في مكانه .. فاذا كان تحت الحزمة Core مثلا .. فتضعه في المجلد source/core ..
      طبعا .. كل شيء سيكون ئتحت namespace أو package .. حيث هذه هي الهيكلة :
      Andalus
      --- Core
      --- IO


      الخ .

    • لو أحببت انشاء مشروعك الخاص .. لأي سبب من الأسباب .. فكل ما عليك هو اضافة المسار الى IDE الخاص بك .. مثلاً :
      F:\andalus\andalus-cpp\trunk\0.1\source
      وأضف الملفات التي تريد من داخل البرنامج الذي تعمل عليه .. add files .. وقم بالترجمة .

هل عملت update الان ... ؟

الخطوة التالية :

عمل implementation لهذه الكلاسات :

في السي بلس :

  • StdFileStream
  • StdMemoryStream
  • StdTextStream
  • Win32IniFile
  • Win32FileStream - اختيارية
  • Win32TextStream -اختيارية

في الجافا :

  • CIniFile
  • CMemoryStream
  • StdTextStream
  • StdBinaryStream

قمت بتجهيز كل كلاس .. المطلوب هو كتابة محتوى كل دالة أو method .. يعني لايوجد شيء متعب :wink: .

حيث ستجد تعريف method ووصف لها .. وبالتالي عليك كتابة المحتوى .

اذا لاحظت أي مشكلة في الواجهة .. فضع ملاحظة هنا .. حتى يمكننا توحيد الكود .

في الحقيقة .. استخدمت برنامج powerdesigner لتوليد الكود .. لتوفير وقتنا .. ولكنه أضاع الوقت .. ببعض الاخطاء الغير ملاحظة .. لذلك تأخرت كثيراً .

اذا لاحظ أحد أي خطأ .. فأرجو التفاعل والتنبيه .. لأني عملت بعض الأمور على عجل .. فحصلت أخطاء هنا وهناك ( أخطاء منطقية وليس في ترجمة الكود ) .

( ملاحظة : الملفات في السي بلس تأخذ متغير int32 .. وهذا بشكل مؤقت .. الى أن ننظر الى حل شامل ) .

يمكنني أن أكتب جميع الكلاسات ..في السي بلس والجافا .. باستثناء IniFile .

الان : من يتطوع لكتابة بعض الكلاسات .. :) .

نريد أن ننتهي سريعاً .. ونبدأ في المرحة التالية خلال هذا الأسبوع .

تم تعديل هذه المشاركة بواسطة الشمري في 21 نوفمبر 2009 في 22:51

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#36

يبدو هذه الحزمة مملة .. تباً :D

سأقوم بعمل كلاسات الجافا بالكامل باستثناء CIniFile .

سأقوم بعمل الكلاس StdBinaryStream في السي بلس .

وبقية الكلاسات سأتركها الى أن نجد أحد .. أو أقوم بها بنفسي .. المهم .. أن نتخلص من هذه الحزمة سريعاً .

تم تعديل هذه المشاركة بواسطة الشمري في 25 نوفمبر 2009 في 03:57

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…