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

متغير في Struct يصبح سالب عند إسناد عدد صحيح له

بدأه Xacker في 12 يناير 2009 · 5 رد · 685 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أعتقد أني احترت بما فيه الكفاية في هذه المشكلة وسأعود للأسمبلي حالما أنتهي هنا :angry:

المثال كالتالي مأخوذ في الأجزاء المهمة منه:

 

[color= #007f00;]#include <iostream>

 

[color= #007f00;]#define WIDTH 5

[color= #007f00;]#define HEIGHT 5

 

[color= #0000ff;]struct pt [color= #000000;]{

    [color= #0000ff;]int row        [color= #000000;]: [color= #ff0000;]1;

    [color= #0000ff;]int col        [color= #000000;]: [color= #ff0000;]1;

[color= #000000;]} en_cell, ex_cell;

 

[color= #0000ff;]void findEntry[color= #000000;]([color= #0000ff;]char [color= #000000;](maze[color= #000000;])[color= #000000;][[color= #000000;]][color= #000000;][[color= #ff0000;]40[color= #000000;]],[color= #0000ff;]int,[color= #0000ff;]int,[color= #0000ff;]char,pt [color= #000000;]* cell[color= #000000;]);

 

[color= #0000ff;]int main[color= #000000;]([color= #0000ff;]int argc,[color= #0000ff;]char [color= #000000;]*argv[color= #000000;][[color= #000000;]][color= #000000;])

[color= #000000;]{

    [color= #0000ff;]int width [color= #000000;]= WIDTH;

    [color= #0000ff;]int height [color= #000000;]= HEIGHT;

    [color= #0000ff;]char maze[color= #000000;][[color= #ff0000;]40[color= #000000;]][color= #000000;][[color= #ff0000;]40[color= #000000;]] [color= #000000;]= [color= #000000;]{[color= #000000;]([color= #A31515;]'1',[color= #A31515;]'1',[color= #A31515;]'1',[color= #A31515;]'1',[color= #A31515;]'1'[color= #000000;]),[color= #000000;]([color= #A31515;]'1',[color= #A31515;]'1',[color= #A31515;]'3',[color= #A31515;]'3',[color= #A31515;]'1'[color= #000000;]),[color= #000000;]([color= #A31515;]'1',[color= #A31515;]'3',[color= #A31515;]'3',[color= #A31515;]'3',[color= #A31515;]'1'[color= #000000;]),[color= #000000;]([color= #A31515;]'1'
,[color= #A31515;]'3',[color= #A31515;]'1',[color= #A31515;]'3',[color= #A31515;]'4'[color= #000000;]),[color= #000000;]([color= #A31515;]'1',[color= #A31515;]'2',[color= #A31515;]'1',[color= #A31515;]'1',[color= #A31515;]'1'[color= #000000;])[color= #000000;]};

[color= #007f00;]//    supposedly you filled the 2-dimensional array like this

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

[color= #007f00;]//    1 1 3 3 1

[color= #007f00;]//    1 3 3 3 1

[color= #007f00;]//    1 3 1 3 4    -> 4, represents the entrance

[color= #007f00;]//    1 2 1 1 1    -> 2, represents the exit

    [color= #0000ff;]char en [color= #000000;]= [color= #A31515;]'3',ex [color= #000000;]= [color= #A31515;]'4';         [color= #007f00;]// 3 for right most column, 4 for bottom most row in a 2-di
mensional array

 

    findEntry[color= #000000;](maze,width,height,en,[color= #000000;]&en_cell[color= #000000;]);

    [color= #0000ff;]return [color= #ff0000;]0;

[color= #000000;]}

[color= #0000ff;]void findEntry[color= #000000;]([color= #0000ff;]char maze[color= #000000;][[color= #000000;]][color= #000000;][[color= #ff0000;]40[color= #000000;]],[color= #0000ff;]int cols,[color= #0000ff;]int rows,[color= #0000ff;]char en,pt [color= #000000;]* cell[color= #000000;])

[color= #000000;]{

    [color= #0000ff;]int i [color= #000000;]= [color= #ff0000;]0;

    [color= #0000ff;]switch [color= #000000;](en[color= #000000;])

    [color= #000000;]{

    [color= #0000ff;]case [color= #A31515;]'1'[color= #000000;]:

        [color= #0000ff;]for [color= #000000;](i; i [color= #000000;]< rows; i[color= #000000;]++[color= #000000;])

        [color= #000000;]{

            [color= #0000ff;]if [color= #000000;](maze[color= #000000;][i[color= #000000;]][color= #000000;][[color= #ff0000;]0[color= #000000;]] [color= #000000;]== [color= #A31515;]'4'[color= #000000;])

            [color= #000000;]{   

                cell[color= #000000;]-[color= #000000;]>row [color= #000000;]= i; [color= #007f00;]// خطأ في الاسناد تكون القيمة صحيحة وبعد الاسناد خاطئة

                cell[color= #000000;]-[color= #000000;]>col [color= #000000;]= [color= #ff0000;]0;

                break;

            [color= #000000;]}       

        [color= #000000;]}

        break;

    [color= #0000ff;]case [color= #A31515;]'2'[color= #000000;]:

        [color= #0000ff;]for [color= #000000;](i; i [color= #000000;]< cols; i[color= #000000;]++[color= #000000;])

        [color= #000000;]{

            [color= #0000ff;]if [color= #000000;](maze[color= #000000;][[color= #ff0000;]0[color= #000000;]][color= #000000;][i[color= #000000;]] [color= #000000;]== [color= #A31515;]'4'[color= #000000;])

            [color= #000000;]{

                cell[color= #000000;]-[color= #000000;]>row [color= #000000;]= [color= #ff0000;]0;

                cell[color= #000000;]-[color= #000000;]>col [color= #000000;]= i;

                break;

            [color= #000000;]}

        [color= #000000;]}

        break;

    [color= #0000ff;]case [color= #A31515;]'3'[color= #000000;]:

        [color= #0000ff;]for [color= #000000;](i; i [color= #000000;]< rows; i[color= #000000;]++[color= #000000;])

        [color= #000000;]{

            [color= #0000ff;]if [color= #000000;](maze[color= #000000;][i[color= #000000;]][color= #000000;][cols[color= #ff0000;]-1[color= #000000;]] [color= #000000;]== [color= #A31515;]'4'[color= #000000;])

            [color= #000000;]{

                cell[color= #000000;]-[color= #000000;]>row [color= #000000;]= i;

                cell[color= #000000;]-[color= #000000;]>col [color= #000000;]= [color= #000000;](cols[color= #ff0000;]-1[color= #000000;]);

                break;

            [color= #000000;]}

        [color= #000000;]}

        break;

    [color= #0000ff;]case [color= #A31515;]'4'[color= #000000;]:

        [color= #0000ff;]for [color= #000000;](i; i [color= #000000;]< cols; i[color= #000000;]++[color= #000000;])

        [color= #000000;]{

            [color= #0000ff;]if [color= #000000;](maze[color= #000000;][rows[color= #ff0000;]-1[color= #000000;]][color= #000000;][i[color= #000000;]] [color= #000000;]![color= #000000;]= [color= #A31515;]'4'[color= #000000;])

            [color= #000000;]{

                cell[color= #000000;]-[color= #000000;]>row [color= #000000;]= [color= #000000;](rows[color= #ff0000;]-1[color= #000000;]);

                cell[color= #000000;]-[color= #000000;]>col [color= #000000;]= i;

                break;

            [color= #000000;]}

        [color= #000000;]}

    [color= #000000;]}

[color= #000000;]}

الكهرباء ستقطع وأنا أكتب بسرعة :lol:

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

سؤال على عجالة لاني داهب لاشرب كاس قهوة في الخارج

لمادا كل هده الحالات case التي وضعتها في الدالة findEntry

حسبما فهمت انك تبحث عن المدخل للمتاهة و الدي يكافئ 4 في المصفوفة

for (i; i < rows; i++)
{
  for (j; j < cols; i++)
  {
	if (maze[j] == '4'{
	  cell->row = i; 
	  cell->col = 0;
	  break;
	}
}

انا لا اعرف مادا يوجد داخل الاجزاء التي ازلتها من الكود لدلك فمعدرة ادا لم استطع ان انفعك :(

هل من الممكن ان ترسل ملف الواجب الى الاميل ربما احاول ان اساعدك الليلة ان شاء الله

لاني و الحمد لله ازلت عائق كبير من المشروع الدي كلمتك عنه :lol:

keep in touch dude ;)

العمل كثير و الوقت قليل أعاننا الله

seo zen SEO Enlightment amazon danbo

#3
fkugd2003 كتب:
حسبما فهمت انك تبحث عن المدخل للمتاهة و الدي يكافئ 4 في المصفوفة

...

انا لا اعرف مادا يوجد داخل الاجزاء التي ازلتها من الكود لدلك فمعدرة ادا لم استطع ان انفعك :(

نعم لكن المستخدم يقوم بإدخال قيم خلايا المتاهة بالتالي هناك احتمال أن يكون المستخدم أحمق ويقوم بإدخال 10 قيم مساوية لـ 4 :lol:

لذلك أقوم بإعطائه خيار لتحديد الضلع الذي يوجد فيه المدخل (والمخرج) لذلك تجد كل هذه الـ cases لأنها تقوم على اختيار الضلع (الجدار) تحضيرا لاختبار محتواه.

اقتباس
keep in touch dude ;)

هو أنا دائماً إن توتش بس إنت اللي مش بتـ/ـتش :lol:

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

السطر 18 عدد المدخلات 5*5 والمصفوفة 40*40 ؟

لو تشرح فقط فكرة البرنامج ماهو المطلوب بالضبط منه.

tvquran_6.gif

#5
فهدالشلوي كتب:
السطر 18 عدد المدخلات 5*5 والمصفوفة 40*40 ؟

لو تشرح فقط فكرة البرنامج ماهو المطلوب بالضبط منه.

هذا مجرد مثال لتجربته أخي فهد.

البرنامج يطلب من المستخدم أبعاد متاهة مفروضة أكبر بعد مسموح فيها هو 40×40

ثم يقوم المستخدم بإدخال القيم التي تمثل خلايا المتاهة بحيث:

1 للجدران والعوائق

2 للمخرج

3 للممرات

4 للمدخل

إحدى الدوال المطلوب كتابتها تقوم بإيجاد المدخل دون إظهاره.

وكما قلت مسبقاً ليس هناك أي شرط يمنع المستخدم من أن يضع المتاهة بكاملها بقيمة 4 التي تمثل المدخل

لذلك نطلب منه تحديد الجدار الذي يحوي المدخل من البداية ثم نفرض مجازاً أن أول قيمة 4 في هذا الجدار تمثل المدخل طبعا بعد تحقيق بعض الشروط مثل كون الخلايا المحيطية تحوي مخرج ومدخل فقط والباقي جدران (لكن هذا في دالة منفصلة تأتي بعد هذه الدالة).

البرنامج يحوي العديد من الدوال المطلوب كتابتها كدالة لحل المتاهة وتحسين الحل الناتج.. إلخ.

بالمناسبة وجدت عدة أخطاء في الكود في الأعلى من خلال دراسته بشفرة أسمبلي .. على الأقل أستطيع أن أقرأ وأفهم ما يجري -_- C++ is cool, use Assembly instead

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

شكراً خالد :)

تم حل المشكلة الحمد لله، خالد نبهني إلى أني أقوم باستخدام الـ struct والثوابت فيها كـ bitfields، يكفي أن يتم تعديل هذا والدالة تعمل الآن كما هي :)

شكراً خالد مرة أخرى :)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

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