PDA

View Full Version : سوال: ریگی در کفش C++ ؟!!



Nabege
جمعه 22 فروردین 1393, 09:44 صبح
سلام دوستان
من یه برنامه (موازی دو هسته ای) دارم با C++‎‎‎‎‎‎ می نویسم و دو روزه یه جاش گیر کردم.
یک جای برنامم این شکلیه که یه آرایه از نوع char نوشتم :
char elm[2][60][3]={};
بعد مقادیری به از اندیس هاش دادم:
elm[1][4][0]='H';
elm[1][4][1]=0;
بعد یه حلقه و شرط گذاشتم :
for (a=1;a<=12;a++)
if (elm[1][a][0] != 'H'){
if (elm[1][a][0] =='H') cout<<"Wrong Wrong Wrong!!!"<<endl;
.
.
.
}
حالا وقتی برنامه رو اجرا می کنم عبارت "Wrong Wrong Wrong!!!" ظاهر می شود.
چرا باید این عبارت ظاهر شود ؟ چطور این دو شرط متناقض پشت سرهم اجرا می شوند ؟ و ...
یعنی واقعا مشکل از کجاست ؟ من که دارم شاخ در میارم ! ممکنه C++‎‎‎‎‎‎ واقعا ایراد داشته باشه ؟؟؟
برنامم فعلا به دلیل این مشکل معطل شده، هر وقت به این قضیه فکر می کنم سردرد می گیرم:عصبانی::عصبانی::عصبانی: لطفا کمک کنید.:گریه:

sourcecode
جمعه 22 فروردین 1393, 10:38 صبح
دوست عزیز من تا جایی که می دونم برای مقایسه یه رشته نمی تونیم از == استفاده کنیم .

Nabege
جمعه 22 فروردین 1393, 10:59 صبح
شما درست می گید برای مقایسه ی رشته ها نمی توان از == استفاده کرد، ولی من از رشته استفاده نکردم آرایه ای از char رو هم با هم مقایسه نکردم بلکه یک اندیس از آرایه ی elm رو با هم مقایسه کردم.
که این کار مجاز هست چون فقط یک مقدار رو با یه مقدار دیگه مقایسه می کنیم نه آرایه ای از مقادیر با آرایه ای دیگری از مقادیر.

بابک.م.
جمعه 22 فروردین 1393, 13:01 عصر
کد شما مشکلی نداره. اگر این آرایه توسط چند Thread مختلف دستکاری میشه باید از Lock برای کنترل همزمانی خواندن و نوشتن استفاده کنید.

ali chegini
جمعه 22 فروردین 1393, 14:22 عصر
سلام.
من قطعه کد رو به صورت عادی اجرا کردم مشکل نداشت.

char elm[2][60][3];
elm[1][4][0]='H';
elm[1][4][1]=0;

for (int a=1;a<=12;a++)
if (elm[1][a][0] != 'H'){
if (elm[1][a][0] =='H') cout<<"Wrong Wrong Wrong!!!"<<endl;

}

احتمالا مشکل از جای دیگه هست.

Nabege
جمعه 22 فروردین 1393, 21:05 عصر
این کدی که من نشون دادم همه ی کدم نبود و بلکه قسمتی از کدم بود، کد کاملم خیلی گستردست نزدیک 3000 خط.
دوستان میشه از تجربه و دانشتون بیشترین بهره رو بگیرین و بگید کلا در چه مواقعی ممکنه همچین اتفاقی بیفته ؟
با توجه به اونچه که من می دونم این کد در هیچ مواقعی نباید اجرا بشه چون دو تا شرط متناقض پشت سرهمه، یعنی اگر اولی درست باشه دومی قطعا غلطه و اگر دومی درست باشه اولی قطعا غلطه، ولی اتفاقی که می افته واقعا حیرت انگیزه که چرا دو تا شرط متناقض درست درمیان و کد اجرا میشه!!
لطفا کمکم کنید 4 روز بیشتر واسم نموده و پروژه رو باید تموم کنم، در حقیقت کدم تموم شده فقط این مشکل مونده.

Nabege
جمعه 22 فروردین 1393, 21:07 عصر
یعنی ممکنه که تو برنامه دو هسته ای cpu خطا کنه ؟!!!!!!!!!!!!

omid_kma
جمعه 22 فروردین 1393, 22:19 عصر
مگه مسخره بازیه که cpu خطا کنه یا C++‎‎ مشکل داشته باشه کوچکترین مشکلی که cpu داشته باشه 1000 جور مشکل خیلی بزرگتر پیش میاد
شما هم هرجا گیر می کنی سریع گیر میدی به cpu و ++C !

خب برنامت داره موازی اجرا میشه ممکنه اول این اجرا بشه if (elm[1][a][0] != 'H'){
بعد دقیقا قبل از این که شرط دوم اجرا بشه داخل یک thread دیگه elm عوض بشه مقدارش و بشه H

ضمنا اگر داری آرایه رو بوسیله 2 تا thread همزمان عوض می کنی باید از mutex , lock استفاده کنی.

ali chegini
شنبه 23 فروردین 1393, 10:27 صبح
الان یادم اومد اگه می خوای دلیلش رو بدونی می تونی کتاب سیستم های عامل با رویکرد حل مسئله ( مولف : دکتر حقیقت) رو بخونی.
و همون طور که دوستان فرمودند میتونی از mutex , سمافور ، monitor , lock و... استفاده کنی .
مثل این می مونه که دونفر دارن غذا می خورن ولی یه ذونه قاشق دارن .(دو هسته یک منبع کد) .

Nabege
چهارشنبه 03 اردیبهشت 1393, 21:13 عصر
من از همون ابتدا این آرایه رو مقدار دهی کرده ام و تو برنامه اصلی هیچ جا این آرایه دستکاری نمیشه و فقط بررسی میشه! هنوز نتونستم بفهمم مشکل از کجاست ؟؟؟؟!!!!!!

rahnema1
پنج شنبه 04 اردیبهشت 1393, 07:47 صبح
سلام
احتمالا متغیر a داره یه جایی دستکاری میشه