PDA

View Full Version : سوال: ایا می شود در حین برنامه اجرا شده متغیر تعریف کرد؟



motherboard
دوشنبه 05 خرداد 1393, 13:34 عصر
سلام.ما همیشه در قبل از کامپایل برنامه هرچی که متغیر نیاز هست رو تعریف می کنیم.اما سوالی که دارم اینه که میشه کاری کرد که در حین اینکه یک برنامه ای رو کامپایل کردیم بتونیم چند تا متغیر رو بسته به برنامه ای که نوشتیم تعریف کنیم؟!!!!

rahnema1
دوشنبه 05 خرداد 1393, 13:47 عصر
متغیر که نمیشه تعریف کرد اما میشه حافظه را به مقدار مورد نیاز اشغال کرد یعنی حافظه پویا

motherboard
دوشنبه 05 خرداد 1393, 13:54 عصر
متغیر که نمیشه تعریف کرد اما میشه حافظه را به مقدار مورد نیاز اشغال کرد یعنی حافظه پویا
یعنی میشه به هر نحوی که شده از خانه های جدید استفاده کرد؟منظورم اینه که به طور مرسوم وقتی می خواهیم از خونه های حافظه استفاده کنیم اون خونه ها رو به یکی از انواع داده تعریف می کنیم.الان با همین حافظه پویا میشه در حین برنامه از خانه های جدید استفاده کنیم(هرچند اون خونه ها رو تعریف نکنیم) ؟

rahnema1
دوشنبه 05 خرداد 1393, 14:01 عصر
بله میشه
مثل این برنامه که در حین اجرای برنامه سایز آرایه را از کاربر می گیریم و یک آرایه با اون سایز در حافظه اشغال می کنیم
سپس آرایه را از 0 تا مقدار سایز اون پر می کنیم و بعد چاپ می کنیم

#include <iostream>
using namespace std;
int main()
{
int arrayDim;
cout<<"enter size of array: ";
cin>>arrayDim;
int* myarr= new int[arrayDim];
for (int i=0; i<arrayDim; i++)
myarr[i]=i;
for (int i=0; i<arrayDim; i++)
cout<<myarr[i]<<endl;
delete myarr;
}

(while(c=1) printf(cpp=0
جمعه 09 خرداد 1393, 01:46 صبح
این برنامه رو کامپایل و اجرا کن -- جالبه.
هر چند ثانیه، در صورت دُرُست بودنِ شرط، یک متغیر تعریف میشه.
متغیرها رو همچنان میشه طبق شروطی خاص تعریف کرد و ازشون استفاده کرد. البته این برنامه به صورت خودکاره.
در حین اجرای برنامه، متغیرها طبق شروط می تونن تعریف بشن.

#include <stdio.h>
int main (void)
{
int mmm = 0, i = 0, j = 10;
int *p, *p2;
for (p2 = &j; p = &i, *p <= *p2; *p += 1)
{
if (*p == j*1){ int j2 = 20; p2 = &j2; system ("TIMEOUT /T 4");}
if (*p == j*2){ int j3 = 30; p2 = &j3; system ("TIMEOUT /T 3");}
if (*p == j*3){ int j4 = 40; p2 = &j4; system ("TIMEOUT /T 2");}
if (*p == j*4){ int j5 = 49; p2 = &j5; system ("TIMEOUT /T 1");}
printf ("%d\n", mmm += 1);
}
system ("TIMEOUT /T -1");
return 0;
}

rahnema1
جمعه 09 خرداد 1393, 08:37 صبح
این برنامه رو کامپایل و اجرا کن -- جالبه.
هر چند ثانیه، در صورت دُرُست بودنِ شرط، یک متغیر تعریف میشه.
متغیرها رو همچنان میشه طبق شروطی خاص تعریف کرد و ازشون استفاده کرد. البته این برنامه به صورت خودکاره.
در حین اجرای برنامه، متغیرها طبق شروط می تونن تعریف بشن.

#include <stdio.h>
int main (void)
{
int mmm = 0, i = 0, j = 10;
int *p, *p2;
for (p2 = &j; p = &i, *p <= *p2; *p += 1)
{
if (*p == j*1){ int j2 = 20; p2 = &j2; system ("TIMEOUT /T 4");}
if (*p == j*2){ int j3 = 30; p2 = &j3; system ("TIMEOUT /T 3");}
if (*p == j*3){ int j4 = 40; p2 = &j4; system ("TIMEOUT /T 2");}
if (*p == j*4){ int j5 = 49; p2 = &j5; system ("TIMEOUT /T 1");}
printf ("%d\n", mmm += 1);
}
system ("TIMEOUT /T -1");
return 0;
}



دقت کنید شما متغیر را حین اجرای برنامه تعریف نمی کنید. متغیر ها حین کد نویسی قبلا تعریف شدن نه حین اجرای برنامه

(while(c=1) printf(cpp=0
جمعه 09 خرداد 1393, 11:14 صبح
دقت کنید شما متغیر را حین اجرای برنامه تعریف نمی کنید. متغیر ها حین کد نویسی قبلا تعریف شدن نه حین اجرای برنامه
ببین، متغیرها در صورت دُرُست بودن شرطی که داخلش قرار دارن، تعریف میشن.
تاوقتی که برنامه هنوز درگیر اولین if هست، متغیرهای بعدی داخل if های بعدی، هنوز تعریف شده نیستن.
دُرُسته که از قبل در برنامه نوشته شدن، اما هنوز تعریف نشدن. اگر من Timer قرار نمی دادم، برنامه خیلی سریع شروط رو اجرا، متغیرها رو تعریف، و از اونها استفاده می کرد.
من در حین برنامه متغیر تعریف نمی کنم، طبق شروط تعریف میشن.
چیزی که من در پُست قبلی خودم گفتم، واضح بود; در حین اجرای برنامه، متغیرها طبق شروط می تونن تعریف بشن; این یعنی من در حین اجرای برنامه کاری نمی کنم -- همش طبق شروطه.

rahnema1
جمعه 09 خرداد 1393, 11:42 صبح
ببین، متغیرها در صورت دُرُست بودن شرطی که داخلش قرار دارن، تعریف میشن.
تاوقتی که برنامه هنوز درگیر اولین if هست، متغیرهای بعدی داخل if های بعدی، هنوز تعریف شده نیستن.
دُرُسته که از قبل در برنامه نوشته شدن، اما هنوز تعریف نشدن. اگر من Timer قرار نمی دادم، برنامه خیلی سریع شروط رو اجرا، متغیرها رو تعریف، و از اونها استفاده می کرد.
من در حین برنامه متغیر تعریف نمی کنم، طبق شروط تعریف میشن.
چیزی که من در پُست قبلی خودم گفتم، واضح بود; در حین اجرای برنامه، متغیرها طبق شروط می تونن تعریف بشن; این یعنی من در حین اجرای برنامه کاری نمی کنم -- همش طبق شروطه.

در زبانی مثل سی یا سی پلاس پلاس، تعریف در حین اجرا بی معنیه. مفهوم اعلان declaration و تعریف definition در زمان اجرا معنی نمیده. اینها فقط در زبانهای پویا dynamic programming language مفهوم داره نه زبانهای static مثل سی پلاس پلاس

کامبیز اسدزاده
جمعه 09 خرداد 1393, 12:16 عصر
اگه این قابلیت رو روی زبان های استاتیکی مثل C++‎‎ فراهم میکردند که کلا همه چیز میرفت زیر سوال !!! این قابلیت رو فقط در زبان های اسکریپتی که قابلیت داینامیکی دارند میتوان پیاده سازی کرد.
درضمن وقتی شما برنامه رو کامپایل میکنید اطلاعات مربوط به متغیر ها از قبیل نام متغیر تعریف شده از بین میره و فقط آدرس های حافظه در دسترس قرار میگیرند پس در نتیجه حتی اگه بتونید متغیری رو در حالت اجرا پیاده سازی کنید کاملا بی معنی خواهد بود.

(while(c=1) printf(cpp=0
جمعه 09 خرداد 1393, 12:59 عصر
من تنها رَوند و ترتیب کدها و اجرای اونها رو در حین اجرای برنامه گفتم، دوستان!

motherboard
جمعه 09 خرداد 1393, 13:10 عصر
ممنون.ولی در این کد هم اشتباهی شبیه اون مورد قبلی در اون تاپیک (http://barnamenevis.org/showthread.php?453973-%D8%A7%D8%B1%D9%88%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B4%D9%85%D8%A7%D8%B1%D8%B4-%DA%A9%D8%A7%D8%B1%DA%A9%D8%AA%D8%B1%D9%87%D8%A7%D B%8C-%D8%AC%D9%85%D9%84%D9%87&p=2032522&viewfull=1#post2032522) ایجاد شده:
#include <stdio.h>

int main (void)
{
int mmm = 0, i = 0, j = 10;
int *p, *p2;
for (p2 = &j; p = &i, *p <= *p2; *p += 1)
{
if (*p == j*1){ int j2 = 20; p2 = &j2; system ("TIMEOUT /T 4");}
if (*p == j*2){ int j3 = 30; p2 = &j3; system ("TIMEOUT /T 3");}
if (*p == j*3){ int j4 = 40; p2 = &j4; system ("TIMEOUT /T 2");}
if (*p == j*4){ int j5 = 49; p2 = &j5; system ("TIMEOUT /T 1");}
printf ("%d\n", mmm += 1);
}
system ("TIMEOUT /T -1");

return 0;
}

rahnema1
جمعه 09 خرداد 1393, 14:09 عصر
من تنها رَوند و ترتیب کدها و اجرای اونها رو در حین اجرای برنامه گفتم، دوستان!


خب این چه ربطی به تعریف متغیر در حین اجرا داشت؟

(while(c=1) printf(cpp=0
جمعه 09 خرداد 1393, 14:59 عصر
ممنون.ولی در این کد هم اشتباهی شبیه اون مورد قبلی در اون تاپیک (http://barnamenevis.org/showthread.php?453973-%D8%A7%D8%B1%D9%88%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B4%D9%85%D8%A7%D8%B1%D8%B4-%DA%A9%D8%A7%D8%B1%DA%A9%D8%AA%D8%B1%D9%87%D8%A7%D B%8C-%D8%AC%D9%85%D9%84%D9%87&p=2032522&viewfull=1#post2032522) ایجاد شده:

برنامه نوشته شده داخل اون تاپیک مشکلی نداره. شاید مشکلی در پوشه System32 درایو C خودت ایجاد شده.
عکسهایی از اجرا شدنش برات گذاشتم و برو ببین. کلیک (http://barnamenevis.org/showthread.php?453973-%D8%A7%D8%B1%D9%88%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B4%D9%85%D8%A7%D8%B1%D8%B4-%DA%A9%D8%A7%D8%B1%DA%A9%D8%AA%D8%B1%D9%87%D8%A7%D B%8C-%D8%AC%D9%85%D9%84%D9%87&p=2032576&viewfull=1#post2032576).
این برنامه هم به خوبی کار می کنه.


خب این چه ربطی به تعریف متغیر در حین اجرا داشت؟
شاید منظور من رو بد متوجه شدی. شاید هم من به بدی منظورم رو بیان کردم.
من تنها رَوند تعریف یا همون اعلان شدن متغیرهای داخل اون برنامه رو گفتم. منظورم از "حین اجرا"، این بود که خب رَوند کدهای برنامه، به ترتیب در حین اجرای برنامه صورت می گیره.
درواقع تنها کدها رو توضیح دادم. من نگفتم متغیری رو که در قسمتی از کدها 'وجود نداره' رو میشه در حین اجرای برنامه تعریف کرد. منظورم تعریف شدنش طبق شروط در خود کدها بود، که در حین اجرای برنامه، رَوند الگوریتم نوشته شده، طی میشه.
اما قبول دارم که من منظورم رو بد بیان کردم.

rahnema1
جمعه 09 خرداد 1393, 15:11 عصر
اما قبول دارم که من منظورم رو بد بیان کردم

حالا هر منظوری داشتین اینجا جاش نبود چون تاپیک در مورد یک موضوع دیگه بود

(while(c=1) printf(cpp=0
جمعه 09 خرداد 1393, 15:22 عصر
حالا هر منظوری داشتین اینجا جاش نبود چون تاپیک در مورد یک موضوع دیگه بود

آره، اما چیزی رو که من گفتم در مقایسه با سوالی که رضا جان پرسیدن، زمین تا آسمون فرق نداره.
از همه مهمتر، فکر می کنم بهتر باشه که خود ایجاد کننده تاپیک نگران تاپیکش باشه.
در راستای موضوع تاپیک، خواستم به رضا جان مطالبی رو رسونده باشم.

همگی موفق باشید.

rahnema1
جمعه 09 خرداد 1393, 15:39 عصر
آره، اما چیزی رو که من گفتم در مقایسه با سوالی که رضا جان پرسیدن، زمین تا آسمون فرق نداره.
از همه مهمتر، فکر می کنم بهتر باشه که خود ایجاد کننده تاپیک نگران تاپیکش باشه.
در راستای موضوع تاپیک، خواستم به رضا جان مطالبی رو رسونده باشم.

همگی موفق باشید.

یه بار دیگه مطالبی که من و why.darkness نوشتیم به دقت مطالعه کن ببین فرقش از زمین تا آسمون هست یانه. اگه هم می خواهی به «رضا جان» مطالب اشتباه بگی می تونی به صورت پیام خصوصی بگی چون اینجا را عموم مطالعه می کنن
شما هم موفق باشید

(while(c=1) printf(cpp=0
جمعه 09 خرداد 1393, 16:53 عصر
یه بار دیگه مطالبی که من و why.darkness نوشتیم به دقت مطالعه کن ببین فرقش از زمین تا آسمون هست یانه. اگه هم می خواهی به «رضا جان» مطالب اشتباه بگی می تونی به صورت پیام خصوصی بگی چون اینجا را عموم مطالعه می کنن
شما هم موفق باشید

عجب. اونوقت جوابی که شما به رضا جان دادی (اشغال کردن فضای حافظه به مقدار مورد نیاز)، چه ربطی به سوال اصلی داشت؟ شما کاملا طبق سوال پیش رفتی و این واضحه!
اگر در حین اجرای برنامه، نمیشه متغیر تعریف کرد، تموم شد. می گفتی " نه نمیشه". بنابراین نیازی به گسترش این تاپیک نبود. آقای rahnema1، اگر من چپ رفتم، تو هم مستقیم نرفتی.
درضمن، «عُموم» این پُست شما (http://barnamenevis.org/showthread.php?454005-%D8%A7%D8%B4%D8%A7%D8%B1%D9%87-%DA%AF%D8%B1-%D9%87%D8%A7&p=2031550&viewfull=1#post2031550) رو هم مطالعه می کنن. در اون پُست شما از خانه اول شروع کردی به خانه پنجم، در صورتی که از خانه صفرم به خانه چهارم مقدار دهی شده بودن، و اگر من به ایجاد کننده تاپیک دُرُستش رو نمی گفتم، بنده خدا قسمت حلقه for که نوشته شده بود n<5 قاطی می کرد. چون شما نوشته بودی خانه پنجم هم مقدار دهی شده، اما در حلقه میگه که از خانه صفرم تا خانه چهارم را چاپ کن. امکان داشت که ندونه که اولین خانه یک آرایه، صفر هست.

خواننده عزیز کدها رو می بینه و اجراشون می کنه، و خودش می فهمه که چی به چیه. سر از بیابان درنمیاره. البته حائز ذکره که شما با داد و فریادتون، به خواننده عزیز فهموندید که برنامه ای که من نوشتم، درواقع با سوال اصلی متفاوته، اما در راستای اونه.
بنابراین ممنون.

rahnema1
جمعه 09 خرداد 1393, 17:10 عصر
عجب. اونوقت جوابی که شما به رضا جان دادی (اشغال کردن فضای حافظه به مقدار مورد نیاز)، چه ربطی به سوال اصلی داشت؟ شما کاملا طبق سوال پیش رفتی و این واضحه!
اگر در حین اجرای برنامه، نمیشه متغیر تعریف کرد، تموم شد. می گفتی " نه نمیشه". بنابراین نیازی به گسترش این تاپیک نبود. آقای rahnema1، اگر من چپ رفتم، تو هم مستقیم نرفتی.
درضمن، «عُموم» این پُست شما (http://barnamenevis.org/showthread.php?454005-%D8%A7%D8%B4%D8%A7%D8%B1%D9%87-%DA%AF%D8%B1-%D9%87%D8%A7&p=2031550&viewfull=1#post2031550) رو هم مطالعه می کنن. در اون پُست شما از خانه اول شروع کردی به خانه پنجم، در صورتی که از خانه صفرم به خانه چهارم مقدار دهی شده بودن، و اگر من به ایجاد کننده تاپیک دُرُستش رو نمی گفتم، بنده خدا قسمت حلقه for که نوشته شده بود n<5 قاطی می کرد. چون شما نوشته بودی خانه پنجم هم مقدار دهی شده، اما در حلقه میگه که از خانه صفرم تا خانه چهارم را چاپ کن. امکان داشت که ندونه که اولین خانه یک آرایه، صفر هست.

خواننده عزیز کدها رو می بینه و اجراشون می کنه، و خودش می فهمه که چی به چیه. سر از بیابان درنمیاره. البته حائز ذکره که شما با داد و فریادتون، به خواننده عزیز فهموندید که برنامه ای که من نوشتم، درواقع با سوال اصلی متفاوته، اما در راستای اونه.
بنابراین ممنون.

ببین من نمی گم اشتباه نمیکنم. هر جا اشتباه کنم به اشتباه خودم اعتراف می کنم. اونجا اندکس از صفر شروع میشه و هر مبتدی اون را میدونه من هم به خاطر تذکر شما تشکر کردم
من روند شما را در چند پست اخیر دیدم که هر تاپیکی شروع میشه شروع می کنید به پامنبری کردن. یک تاپیک داره خاک می خوره هیچ کس جواب نمیده تا من یا یکی دیگه جواب میده شما شروع می کنی به تکرار مکررات یا مطالب اشتباه یا ....
اون چیزی که من تا حالا از شما دیدم یه دونه printf بوده و یه دونه timeout
اگه واقعا چیزی در چنته دارین یا تاپیک بزنین مطلب مفید بذارین یا مستقیما به تاپیک پاسخ بدین و پامنبری نکنید در غیر اینصورت مجبور نیستید وارد مباحث بشید.
وظیفه من نیست به شما تذکر بدم.البته این وظیفه مدیران سایته که به شما برای اولین و آخرین بار تذکر بدن که به این روند خاتمه بدین

motherboard
جمعه 09 خرداد 1393, 17:43 عصر
رضا جان، ببخشید که نتونستم سوالت رو به خوبی جواب بدم.
اختیار دارید دوست من.من هم از شما و هم از جناب rahnema1 و هم از بقیه دوستان چه در سطح پیشکسوتان و چه در سطح کاربر جدید که اومدند اشکالات بنده رو رفع کردند و به سوالات بنده توجه کردند(هرچند اشتباه) سپاس گزارم.ببینید هیچکس در این انجمن علامه دهر نیست و نمی تونه خیلی راحت بیاد بگه من چنان هستم.شاید تعداد انگشت شماری تازه تازه دارند برنامه نویسی رو یاد میگیرند!!!!!من خودم در دی ماه ثبت نام کرده بودم.و اون اوایل اصلا صفره صفر بودم.اگر سوابق پست های من رو ببینید متوجه موضوع می شوید.این اولین تاپیک من بود!!!!! اینجا (http://barnamenevis.org/showthread.php?435987-%D8%B9%D9%84%D8%AA-%D8%B9%D9%85%D9%84-%D9%86%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%D8%A7%DB%8C%D9%84-iostream-h)
یا مثلا بلد نبودم که کد c++ رو بین تگ های ادیتور بزارم.که اتفاقا همین اقای rahnema1 در پست خصوصی روش کار رو به من یاد داد.
در کل می خوام بگم که از همه ی دوستان سپاسگزارم.و این رو هم در نظر بگیرید ما اومدیم اینجا یک چیزی یاد بگیریم نه اینکه معلومات خودمون رو به رخ همدیگه بکشیم.سوال کردن هم عیب نیست.بلکه ندانستن عیب هست.ادم تو هر درجه ای که باشه اگه از یک چیزی سردر نیاورد باید سوال کنه.در پایان من از همه ی دوستان ممنون هستم. مخلص همه هم هستم.

rahnema1
جمعه 09 خرداد 1393, 18:02 عصر
بله...
همچنینه... من دانشی ندارم تا در اختیار کسی بگذارم... و از این بابت متاسفم. همچنان ممنون که من رو باخبر کردید.
شاید بهتر باشه که دیگه برم...

رضا جان، ببخشید که نتونستم سوالت رو به خوبی جواب بدم.
دوستان عزیز، از اینکه طی این مدت با شما بودم، خیلی خوشحالم. همچنان به خاطر تک تکِ کاراکترهایی که در این انجمن پُست کردم، عذر میخوام.

خدا نگهدار همگی و موفق باشید.

حالا چرا ناراحت می شی؟ لینک این تاپیکی که گذاشتی از این بدترش هم دارم یک اشتباهات لپی کردم.
باز هم تند شدم که از شما معذرت می خوام. امیدوارم برگردی که بازهم شاهد معماها و مسابقات جالب شما باشیم

حامد مصافی
سه شنبه 24 تیر 1393, 17:31 عصر
خیلی خوبه که شما همچین سوالی به ذهنت خطور کرده و همینطور خوبه که دوستانی در صدد اندیشیدن به این سوال و پاسخ‌گویی بر اومدن.
اما یه سوال:

چرا..؟؟؟
چرا باید به همچین چیزی نیاز داشته باشیم؟
میشه به صورت کمی مبسوط و حتی‌الامکان با ذکر یک مثال این مسأله رو برام روشن کنی؟

motherboard
سه شنبه 24 تیر 1393, 21:46 عصر
خیلی خوبه که شما همچین سوالی به ذهنت خطور کرده و همینطور خوبه که دوستانی در صدد اندیشیدن به این سوال و پاسخ‌گویی بر اومدن.
اما یه سوال:

چرا..؟؟؟
چرا باید به همچین چیزی نیاز داشته باشیم؟
میشه به صورت کمی مبسوط و حتی‌الامکان با ذکر یک مثال این مسأله رو برام روشن کنی؟
من اون زمان که این تاپیک رو ایجاد کرده بودم چیزی از حافظه های پویا نمیدونستم!!!!! و کلا این سوال برام مطرح بود که ایا برای اینکه بتونیم از حافظه استفاده کنیم ایا باید حتما بیایم بگیم int x و یا char x و یا string x و کلا از این دست موارد که میایم برای استفاده از خونه حافظه یک فلان تعریفی رو می کنیم.اما این طرز استفاده از خونه های حافظه یک عیب بزرگ داشت و اون این بود که دیگه به صورت ثابت در هنگام اجرای برنامه به ازای اون تعریف ها بی جهت به خاطر اون تعاریف ها حافظه تخصیص داده می شد حتی در زمانی که نیاز نمی شد از ان ها استفاده کرد.!!!! به همین دلیل این سوال برام پیش اومد که ایا در حین اجرای برنامه نمیشه متغیر تعریف کرد؟!! و چون اون موقع در مورد حافظه های پویا چیزی نمی دونستم عنوان تاپیک رو به این صورت نوشتم.به عنوان مثال خیلی از برنامه های بزرگی که وجود دارند اگر قرار بود که همیشه خونه های برنامه توسط int فلانی و یا char فلانی به وجود بیایند اون وقت چه بلای سر رم کامپیوتر میومد؟؟!!!!!!. اون موقع ها نمیدونستم که میشه خونه ای رو ایجاد کرد و بعدا برحسب استفاده نکردن از ان ازاد کرد.مکانیسمی که بی برو و برگشت در برنامه های کاربردی استفاده میشه.از این ها که بگذریم (البته نمی خوام برم به حاشیه ولی با دیدن بعضی از پست ها دوست داشتم این رو بگم) روی سخنم هم با سی پلاس پلاس کارهاست و هم با دوستانی که با سایر زبان ها برنامه نویسی می کنند:
بزرگواران هر زبانی کاربرد خودش رو داره.اینکه اون بنده خدا اومد جاوا رو ساخت اومد دید چون نیازه اختراع کرد و الا بیکار نبود که وقت خودش رو تلف کنه و جاوا رو بسازه.بعضی اوقات نوشتن بعضی چیزها با جاوا بهتره.مثلا شما می خوای ازتبریز بری به تهران.هم می تونی با دوچرخه بری و هم با با ماشین.حالا عقل سلیم کدوم یکی رو انتخاب می کنه؟؟!!!!
تو بعضی چیزها سی پلاس پلاس حکم دوچرخه رو داره و سایر زبان ها حکم ماشین!!! و در بعضی چیز ها هم سایر زبان ها حکم دوچرخه رو داره و سی پلاس پلاس حکم ماشین رو داره.!!!
در هر حال مقایسه زبان ها به صورت بحث علمی چیز بدی نیست اما بعضا پست هایی داده میشه که بیشتر جنبه کوچک شمردن فرد رو داره تا بحث علمی!!!

a.r.khoshghalb
چهارشنبه 25 تیر 1393, 06:00 صبح
خیلی خوبه که شما همچین سوالی به ذهنت خطور کرده و همینطور خوبه که دوستانی در صدد اندیشیدن به این سوال و پاسخ‌گویی بر اومدن.
اما یه سوال:

چرا..؟؟؟
چرا باید به همچین چیزی نیاز داشته باشیم؟
میشه به صورت کمی مبسوط و حتی‌الامکان با ذکر یک مثال این مسأله رو برام روشن کنی؟

خیلی جالبه که تا حالا همچین چیزی برای شما پیش نیومده.
یک اینکه وقتی برنامه ای قرار است بنویسید که سایز ورودی حداکثر 10000 است می شود به این مقدار متغیر تعریف کرد اما بهتر نیست که حافظه اضافی نگیریم؟

دو، شما فرض کن ورودی برنامه 10 آرایه است که سایز هر کدام حداکثر 8^10 است ولی جمع سایز ورودی هم حداکثر 8^10 ، حالا شما میتونی 10 تا آرایه با سایز 8^10 یعنی مجموعا 9^10 خونه رو اشغال کنی؟ نه! باید سایز هر کدوم رو بگیری و همون قدر خونه اشغال کنی.

سه، در مقدار بسیـــار زیادی از برنامه ها شما تابعی داری که ورودیش معلوم نیست و وسط برنامه باید برای ورودی های جدید خونه جدید بگیری! برای تفهیم بهتر مثال میزنم:

برنامه ای بنویس که یک حالت مکعب روبیک رو ورودی بگیره و تمام حالت هایی که می شود با 10 حرکت به اون ها رسید را خروجی بدهد.
بهترین راه BFS است! باید تابعی داشته باشی که یک حالت روبیک رو بگیره، تعدادی متغیر جدید تعریف کنی و تمام حالت هایی را که با یک حرکت می شود از حالت ورودی به آنها رسید را دوباره به همین تابع ورودی دهی. و سپس در تابع چک کنی اگر روبیک ورودی 10 بار وارد تابع شده یکی از حالت های مورد نظر است.

در این برنامه شما باید به ازای هر بار اجرای تابع، 6 کلاس (یا هر چیز دیگر که بتوانی اطلاعات روبیک رو در اون نگه داری) تعریف کنی. (تعداد حالت های مختلفی که می شود با یک حرکت ایجاد کرد)

و در کل حالت های خیلیــــــی زیادی هستند که شما نیاز به گرفتن خونه وسط برنامه هستید.

Coder#
چهارشنبه 25 تیر 1393, 06:15 صبح
من اون زمان که این تاپیک رو ایجاد کرده بودم چیزی از حافظه های پویا نمیدونستم!!!!! و کلا این سوال برام مطرح بود که ایا برای اینکه بتونیم از حافظه استفاده کنیم ایا باید حتما بیایم بگیم int x و یا char x و یا string x و کلا از این دست موارد که میایم برای استفاده از خونه حافظه یک فلان تعریفی رو می کنیم.اما این طرز استفاده از خونه های حافظه یک عیب بزرگ داشت و اون این بود که دیگه به صورت ثابت در هنگام اجرای برنامه به ازای اون تعریف ها بی جهت به خاطر اون تعاریف ها حافظه تخصیص داده می شد حتی در زمانی که نیاز نمی شد از ان ها استفاده کرد.!!!! به همین دلیل این سوال برام پیش اومد که ایا در حین اجرای برنامه نمیشه متغیر تعریف کرد؟!! و چون اون موقع در مورد حافظه های پویا چیزی نمی دونستم عنوان تاپیک رو به این صورت نوشتم.به عنوان مثال خیلی از برنامه های بزرگی که وجود دارند اگر قرار بود که همیشه خونه های برنامه توسط int فلانی و یا char فلانی به وجود بیایند اون وقت چه بلای سر رم کامپیوتر میومد؟؟!!!!!!. اون موقع ها نمیدونستم که میشه خونه ای رو ایجاد کرد و بعدا برحسب استفاده نکردن از ان ازاد کرد.مکانیسمی که بی برو و برگشت در برنامه های کاربردی استفاده میشه.از این ها که بگذریم (البته نمی خوام برم به حاشیه ولی با دیدن بعضی از پست ها دوست داشتم این رو بگم) روی سخنم هم با سی پلاس پلاس کارهاست و هم با دوستانی که با سایر زبان ها برنامه نویسی می کنند:
بزرگواران هر زبانی کاربرد خودش رو داره.اینکه اون بنده خدا اومد جاوا رو ساخت اومد دید چون نیازه اختراع کرد و الا بیکار نبود که وقت خودش رو تلف کنه و جاوا رو بسازه.بعضی اوقات نوشتن بعضی چیزها با جاوا بهتره.مثلا شما می خوای ازتبریز بری به تهران.هم می تونی با دوچرخه بری و هم با با ماشین.حالا عقل سلیم کدوم یکی رو انتخاب می کنه؟؟!!!!
تو بعضی چیزها سی پلاس پلاس حکم دوچرخه رو داره و سایر زبان ها حکم ماشین!!! و در بعضی چیز ها هم سایر زبان ها حکم دوچرخه رو داره و سی پلاس پلاس حکم ماشین رو داره.!!!
در هر حال مقایسه زبان ها به صورت بحث علمی چیز بدی نیست اما بعضا پست هایی داده میشه که بیشتر جنبه کوچک شمردن فرد رو داره تا بحث علمی!!!


اینطوری ها هم که میگی نیست. نرم افزار فتوشاپ رو اجرا کن و کنارش Task Manager ویندوز رو هم اجرا کن. فتوشاپ رو از لیست برنامه های در حال اجرا در Task Manager پیدا کن. در فتوشاپ کارهای مختلفی رو انجام بده (از کوچک تا بزرگ). هرچقدر که پیش بری، متوجه میشی که فضای بیشتری در حال اشغال شدن در حافظه کامپیوتر توسط فتوشاپ هست; این یعنی کُل برنامه فوتوشاپ در حال کار نیست، و تنها وقتی که ما از ویژگی های فتوشاپ استفاده می کنیم، فضا برای کار در
حافظه اختصاص داده میشه، بنابراین حافظه اشغال میشه.

هرچقدر کدنویسی خلاصه تر و تمیز تر باشه، پردازشگر کمتر درگیر پردازش داده ها میشه و حافظه کامپیوتر هم کمتر اشغال میشه.

دوچرخه و ماشین ممکنه مثال های خوب و ساده ای باشن اما استثناعاتی وجود داره.
- با وجود وابستگی های تقریبا صفر زبان C به ابزارهای مختلف و خام بودن و کوچک بودن اون، برنامه های نوشته شده به زبان C سریعتر پردازش میشن; در اینجا میشه گفت که C مثل یک اتومبیل پر سرعته و زبان Java مثل یک دوچرخه.
- برنامه های نوشته شده به زبان C فضای کمتری از حافظه کامپیوتر رو اشغال می کنن; در اینجا میشه گفت که C مثل یک دوچرخه هست و Java مثل یک اتومبیله چون دوچرخه فضای کمتری از خیابان رو اشغال می کنه اما اتومبیل فضای بیشتری از خیابان رو اشغال می کنه (با فرض اینکه خیابان حافظه کامپیوتر هست).
در خلاصه:
- برنامه های نوشته شده به زبان C موقعیت بهتری رو برای پردازشگر فراهم می کنن پس پردازشگر با سرعت بیشتری داده ها رو پردازش می کنه.
- برنامه های نوشته شده به زبان C فضای کمتری از حافظه رو نسبت به برنامه های نوشته شده به زبان هایی مثل Java و ++C اشغال می کنن.

سعی کن خودت رو زیاد وابسته به مثال های دنیای واقعی نکنی چون ممکنه اصل قضیه رو بی جهت پیچیده کنن.
سعی کن از انواع داده های کمتری در برنامه هات استفاده کنی و با تعداد خطهای کمتری برنامه هات رو بنویسی.

پیچیده کردن برنامه از دید یک مبتدی ممکنه هیولا باشه اما یک باتجربه می تونه دو حدس بزنه:
- برنامه نویس برنامه مربوطه یک احمق بوده.
- برنامه نویس برنامه مربوطه قصد گیج کردن خواننده رو داشته.
در کُل، سورس کدها قابل مشاهده توسط مردم نیستن پس کسی چیزی نمی بینه تا بخواد گیج بشه، مگر اینکه برنامه نویس جهت دستکاری نشدن برنامه اش توسط Hackerها و Crackerها، اون رو پیچیده کنه; این بی فایده نیست اما تاریخ انقضاء داره (بالاخره برنامه مربوطه هک یا کرک میشه).

اگر خواستار مدیریت بهتر حافظه کامپیوتر هستی، بهتره برنامه نویسی به زبان Assembly رو هم یاد بگیری. انتخاب نوع Syntax با خودته: Intel یا AT&T.
اندازه فضایی که برنامه ها در حافظه کامپیوترها اشغال می کنن برای من هم مهمه.

از طرف دیگه، می تونی پردازشگر مخصوص خودت رو بسازی، به علاوه یک سیستم عامل جدید که با دستورات زبان Assembly مخصوص پردازشگر خودت نوشته شده. در خلاصه می تونی قانون گذاری کنی.

حامد مصافی
چهارشنبه 25 تیر 1393, 22:24 عصر
خیلی جالبه که تا حالا همچین چیزی برای شما پیش نیومده.
یک اینکه وقتی برنامه ای قرار است بنویسید که سایز ورودی حداکثر 10000 است می شود به این مقدار متغیر تعریف کرد اما بهتر نیست که حافظه اضافی نگیریم؟

برنامه کپی فایل یا نرم‌افزار پخش آهنگ با فایل‌های حجیم سر و کار دارند، اما آیا به اندازه این فایل‌ها متغیر تعریف می‌کنند؟ پاسخ خیر است، این نرم‌افزار‌ها بافری به اندازه ثابت تعریف می‌کنند که همواره در حال خواندن از فایل و پر کردن در آن هستند و در طرف دیگر در حال خواندن بافر محتویات پردازش شده را از آن حذف می‌کنند.




دو، شما فرض کن ورودی برنامه 10 آرایه است که سایز هر کدام حداکثر 8^10 است ولی جمع سایز ورودی هم حداکثر 8^10 ، حالا شما میتونی 10 تا آرایه با سایز 8^10 یعنی مجموعا 9^10 خونه رو اشغال کنی؟ نه! باید سایز هر کدوم رو بگیری و همون قدر خونه اشغال کنی.

این موضوع مورد بحث عنوان سوال نیست.
اما اگر بخوام جواب بدم در این حالت هم استفاده از لیست پیوندی اصولی‌تره.



سه، در مقدار بسیـــار زیادی از برنامه ها شما تابعی داری که ورودیش معلوم نیست و وسط برنامه باید برای ورودی های جدید خونه جدید بگیری! برای تفهیم بهتر مثال میزنم:

میشه یه تابع بنویسی که ورودیش معلوم نباشه؟


برنامه ای بنویس که یک حالت مکعب روبیک رو ورودی بگیره و تمام حالت هایی که می شود با 10 حرکت به اون ها رسید را خروجی بدهد.
بهترین راه BFS است! باید تابعی داشته باشی که یک حالت روبیک رو بگیره، تعدادی متغیر جدید تعریف کنی و تمام حالت هایی را که با یک حرکت می شود از حالت ورودی به آنها رسید را دوباره به همین تابع ورودی دهی. و سپس در تابع چک کنی اگر روبیک ورودی 10 بار وارد تابع شده یکی از حالت های مورد نظر است.

در این برنامه شما باید به ازای هر بار اجرای تابع، 6 کلاس (یا هر چیز دیگر که بتوانی اطلاعات روبیک رو در اون نگه داری) تعریف کنی. (تعداد حالت های مختلفی که می شود با یک حرکت ایجاد کرد)

و در کل حالت های خیلیــــــی زیادی هستند که شما نیاز به گرفتن خونه وسط برنامه هستید.
در تمام این حالات متغیر‌ها در حین کد نویسی تعریف می‌شوند. شما برای اینکه این سوال براتون پیش بیاد باید متغیری رو در کدنویسی ذکر نکنید اما در روند اجرای برنامه بهش نیاز پیدا کنید.

موارد زیادی پیش میاد که از انداره حافظه‌ای که قراره بگیریم اطلاعی ندایم. مثال الگوریتم‌های جستجو یا حریصانه یا ... در این حالات حد اقل باید یک نام برای اون قسمت از حافظه که قراره بعدا بگیریم داشته باشیم. اکثراً در همه این موارد از لیست‌های پیوندی یا وکتور‌ها یا ... استفاده میشه.

motherboard
پنج شنبه 26 تیر 1393, 00:06 صبح
- برنامه های نوشته شده به زبان C فضای کمتری از حافظه کامپیوتر رو اشغال می کنن; در اینجا میشه گفت که C مثل یک دوچرخه هست و Java مثل یک اتومبیله چون دوچرخه فضای کمتری از خیابان رو اشغال می کنه اما اتومبیل فضای بیشتری از خیابان رو اشغال می کنه (با فرض اینکه خیابان حافظه کامپیوتر هست).
از مجموع نظرات شما استفاده کردم.اما مقصودم از تشبیه زبان ها به دوچرخه و ماشین از جنبه اشغال حافظه نبود!!! اینکه گفتم گاهی سایر زبان ها مانند ماشین هست و سی پلاس پلاس مانند دوچرخه و یا همین طور گاهی سی پلاس پلاس در حکم ماشین و سایر زبان ها مانند دوچرخه اند.بیش تر منظورم این بود که یک زمانی ساخت یک برنامه با سایر زبان های سطح بالا به صرفه تر بوده و با سرعت بیشتری تولید می شود و البته سرعت اجرا هم نسبت به هدف برنامه ی ساخته شده قابل قبول است و گاهی هم برای ساخت برنامه های سیستمی دیگه زبان هایی مثل جاوا (برای pc) قابل قبول نیست.و این جاست که زبانی مثل c حکم ماشین رو پیدا می کند.شما فکرش رو بکن اگه ویندوز (pc) رو با جاوا می نوشتند چه اتفاقی می افتاد؟؟!!!! اگر قرار بود همه چیز با اسمبلی نوشته بشه ایا دانشمندان کامپیوتر بیکار بودند زبان اختراع کنند؟؟ الان اسمبلی خیلی در موارد نادر استفاده میشه.در مواردی که دیگه حتی زبانی مثل c هم پاسخگو نباشه از اسمبلی استفاده می کنند. و به نظر من با رشد سرعت پردازش سیستم های کامپیوتری همین زبان c هم وضعیت کنونی اسمبلی رو پیدا می کنه. و مثلا می بینی ویندوز رو با بیسیک نوشتند!!!!! در کل تشبیهی که کردم از این نظر بود!!! و الا همون طور که عرض کردید برای بهینه کردن حافظه هرچه از زبان های سطح پایین تر استفاده کنیم بهتر است.

motherboard
پنج شنبه 26 تیر 1393, 00:18 صبح
یک موضوعی در مورد همین حافظه ها برای من سواله. ببینید مثلا نمی تونیم یک ارایه هزاران تایی رو تعریف کنیم.چون سیستم عامل اجازه نمیده.حالا اگه این طور باشه و مثلا رم سیستم من 1 گیگ باشه اون وقت ایا نمی تونم برنامه ای رو (و یا بهتره بگم پروژه) تولید کنم که مثلا 2 گیگ باشه!!!! در حالی که سیستم من 1 گیگابایت رم داره!!!!

a.r.khoshghalb
پنج شنبه 26 تیر 1393, 04:47 صبح
برنامه کپی فایل یا نرم‌افزار پخش آهنگ با فایل‌های حجیم سر و کار دارند، اما آیا به اندازه این فایل‌ها متغیر تعریف می‌کنند؟ پاسخ خیر است، این نرم‌افزار‌ها بافری به اندازه ثابت تعریف می‌کنند که همواره در حال خواندن از فایل و پر کردن در آن هستند و در طرف دیگر در حال خواندن بافر محتویات پردازش شده را از آن حذف می‌کنند.

خیلی روشنه که برای این که حرف من رو نقض کنی نباید یک مثال بیاری که در این حالت اینطوری نیست و نتیجه بگیری پس دیگه کلا نیست. باید نشون بدی هیچ برنامه ای وجود نداره که نیاز داشته باشه نه یک برنامه مثال بزنی.
در ضمن تو برنامه هایی که شما گفتی حافظه از قبل گرفته شده! شما دیگه نیازی نداری حافظه بگیری و چیزیو ذخیره کنی.



این موضوع مورد بحث عنوان سوال نیست.
اما اگر بخوام جواب بدم در این حالت هم استفاده از لیست پیوندی اصولی‌تره.

دقیقا همین موضوع مورد بحث سواله! شما در شرایطی که من گفتم باید هر آرایه ات رو تو برنامه واسش n خونه بگیری، اگر قبلش همرو به اندازه حداکثر بگیری مشکل می خوری.
منظورت از لسیت پیوندی اصولی تره چیه؟؟
یعنی شما نمیدونی برای دسترسی به خونه i اوم لیست پیوندی باید i عملیات انجام بشه و ما همیشه نمی تونیم برنامه رو با هر زمانی می خوایم بنویسیم و محدودیت زمانی وجود داره؟
در ضمن که لیست پیوندی هم دقیقا به همین صورته. شما دقیقا به اندازه خونه هایی که کاربر میگه به لیستت اضافه می کنی.



میشه یه تابع بنویسی که ورودیش معلوم نباشه؟

برنامه روبیکی که گفتم مصداق همچین تابعی هست. برای درک بهتر مثال دیگه ای می زنم:

برنامه n وزیر.
برنامه ای بنویس که n رو ورودی بگیره و یک صفحه شطرنج n*n خروجی بده که توش n وزیر به طوری قرار گرفتند که هیچ کدوم همدیگر رو تهدید نمی کنند.

معروف ترین راه برای حل این سوال الگوریتم Hill Climbing هست. اینجا می بینی که ورودی برنامه شما n هست ولی ورودی تابع Hill Climbing ات یا یک آرایه 2 بعدی n*n هست یا یک آرایه یک بعدی n تایی.



در تمام این حالات متغیر‌ها در حین کد نویسی تعریف می‌شوند. شما برای اینکه این سوال براتون پیش بیاد باید متغیری رو در کدنویسی ذکر نکنید اما در روند اجرای برنامه بهش نیاز پیدا کنید.
موارد زیادی پیش میاد که از انداره حافظه‌ای که قراره بگیریم اطلاعی ندایم. مثال الگوریتم‌های جستجو یا حریصانه یا ... در این حالات حد اقل باید یک نام برای اون قسمت از حافظه که قراره بعدا بگیریم داشته باشیم. اکثراً در همه این موارد از لیست‌های پیوندی یا وکتور‌ها یا ... استفاده میشه.

خوب خیلی واضحه که نمیشه وقتی کد ران شده متعیری با هر اسمی که ورودی بده یا همچین چیزی گرفت. حرف منم همینه : "موارد زیادی پیش میاد که از انداره حافظه‌ای که قراره بگیریم اطلاعی ندایم."
این همون چیزیه که من میگم! شما یه پوینتر a در نظر میگیری، برنامه که ران شد ورودی میاد n تا خونه می خوام. شما n خونه بعد a رو برای برنامه ات میگیری! (که اطلاحا بهش میگن آرایه و [a[n دقیقا به معنای n خونه جلو تر از a هست.)

Coder#
پنج شنبه 26 تیر 1393, 08:36 صبح
یک موضوعی در مورد همین حافظه ها برای من سواله. ببینید مثلا نمی تونیم یک ارایه هزاران تایی رو تعریف کنیم.چون سیستم عامل اجازه نمیده.حالا اگه این طور باشه و مثلا رم سیستم من 1 گیگ باشه اون وقت ایا نمی تونم برنامه ای رو (و یا بهتره بگم پروژه) تولید کنم که مثلا 2 گیگ باشه!!!! در حالی که سیستم من 1 گیگابایت رم داره!!!!

قبل از هرکاری در کدنویسی، باید مقصود و مفهوم از اون کار معلوم باشه.
برنامه غول پیکری مثل موتور بازی سازی UDK که حافظه کامپیوتر رو می بلعه، حداقل حافظه ای که برای اجرا شدن نیاز داره، حدودا 900 مگابایته و حداکثر حافظه ای که در حین اجرا احتیاج داره، هرچقدر بیشتر بهتر، چون حداکثر رو نمیشه معلوم کرد. حتی برنامه Notepad ویندوز هم ممکنه تا چندین گیگابایت برسه اگر که میلیون ها کاراکتر داخلش بنویسیم و اگر که به مقدار کافی فضا در حافظه داشته باشیم، چون در غیر اینصورت سیستم عامل پیغام خطایی رو مبنی بر ناکافی بودن فضای حافظه کامپیوتر برای ادامه روند کار میده.

اعلان متغیرهای آرایه ای با مقدار زیرمجموعه ای بیش از ظرفیت نوع داده مورد نظرشون (char, short, int, long int, long long int, float, double, long double) واضحه که عملی نمیشه.
ظرفیت نوع داده ها بستگی به اندازه حافظه پردازشگر داره.