• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

آموزش C++ سي پلاس پلاس از پايه

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
كلا من به اين نتيجه تاسف بار رسيدم كه در سي ، هر تابع رفتارش خاص است و نميشه دسته بندي كنيم به انواع و يادگيري اش را براي خود ساده كنيم.

ببینید کار توابع و زیر برنامه ها مشخص است ! ما برای سهولت کار و صرفه جویی در زمان از آنها استفاده میکنیم.

توابع خروجی دارند،حالا چه با return برگردانده شود و چه از طریق لیست پارامترها !

بعضی توابع (زیر برنامه ها) خروجی ندارند و فقط کاری که انجام میدهند مد نظر ماست.

برنامه نویس میتواند (گاهی لازم میداند) از توابع به صورت زیربرنامه استفاده کند.

فلسفه بکارگیری توابع این است که ما از کدهای آماده استفاده کنیم و بیش از حد درگیر جزئیات نشویم.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
اولا تشكر مي كنم از اساتيد گرامي ،
دوما جناب programmer شما از پاسكال مثال زديد ، البته من پاسكال زياد آشنا نيستم و من از ويژوال بيسيك به سمت سي آمده ام و در vb هم مشابه پاسكال ، زيربرنامه و تابع با دو اسم مختلف تعريف مي شوند. كلا هر كس از زباني به زبان ديگر مي رود تا مدتي در حال و هواي زبان قبلي است ، من هم فكر مي كردم كه در سي ، دو جور تعريف داريم ولي از سويي به ياد داشتم كه در سي همه تابع است. و با توضيحات شما همه چيز برايم روشن شد.
راستش من بعد از چند ماهي vb كار كردن مي خواستم بروم سراغ دلفي ، چون شنيده بودم دلفي از vb قوي تر است. كتاب و كامپايلر و همه چيز را آماده كردم كه ....
يكي از آشنايان ، يك ((پروژه خيلي بزرگ سي)) به من داد كه اصلاح كنم ، چون فكر مي كرد كه من به سي مسلط ام . من هم تصميم گرفتم كه با زدن اين تاپيك ((سي)) ياد بگيرم و آن پروژه را حل كنم. ولي 2 روز بعد او زنگ زد و گفت ديگه لازم نيست . ولي من به يادگيري ادامه دادم تا امروز.

يك چيز ديگه . ((اولين درسهاي سي)) را من از يك تاپيك فارسي ياد گرفتم كه استارتر آن آقاي boggerman بود. در يك فرومي كه الان چند ماه است تعطيله. يعني با كتاب شروع نكرده ام. من در آن تاپيك از صحبتها بيشتر چيز ياد مي گرفتم تا كدها. به همين دليل سعي مي كنم كمتر تاپيك مملو باشه از كد و بيشتر بحث باشه. از اين اولين استادم هم اينجا تشكر مي كنم و همچنين از آقا مصطفي و آقا سعيد و جناب programmer كه خيلي زحمت كشيدند تشكر مي كنم. البته اين تاپيك سالها مورد استفاده قرار مي گيرد و فقط به من كمك نشده.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
براي كار با فايل هم سعي ميشه يك تاپيك ديگر باز بشه.
براي توابع ريضي هم شايد تاپيكي باز بشه.
براي توابع رشته اي هم تاپيك جدايي ، حتما بايد باز بشه.
براي شرح كلاس هم به احتمال زياد تاپيك جديد باز ميشه.

يك بحث مهمي هم داريم كه مديريت حافظه است و اصلا كار نشده. شايد در تاپيك جدايي بحث بشه.
= == = == = == = == = == = == =

پس
اينجا مي مونه:

تمرين بيشتر بحثهاي گفته شده مثل:
انواع ساختارها ( استراكت و يونيون و انوم)
تمرين اشاره گر و ارتباطش با رشته ها و آرايه ها.
تمرين انواع فراخواني تابع ها.

الگوريتم هاي سورت (مرتب سازي)
شرح بيشتر كلاسهاي حافظه.


ديگه الان يادم نيست. كلا هر چي كم بحث شده تا حالا.
===========================
من راستش يك كتاب پيدا كردم كه مفصل راجع به struct بحث كرده. ولي هنوز قسمت نشده بخوانم و اينجا بگم. اين تاپيك را هم خلوت كردم ، تا با چنين ابزارهايي (مثل struct ) تمرين كنيم.
براي همين ((گرافيك)) و(( رشته)) و ((فايل سازي)) و ((كلاس)) و بقيه را مي خواهم در تاپيك ديگري پي بگيريم.
حالا ببينيم چي پيش مياد.
.


= == = == = == = == = == = == =
البته همه با توكل بر خدا و حمايت اساتيد گرامي.
.
 

sina_judgment

کاربر تازه وارد
تاریخ عضویت
2 می 2005
نوشته‌ها
635
لایک‌ها
10
محل سکونت
زندان اوین....
1_سلام دوستان میدونم سوالم ربطی نداره ولی خواهشا جواب منو بدین من تو قسمت ساختمانهای بیتی اشکال دارمنمسدونم برنامه چقدر فضا لازم داره برای مثال این برنام رو یکی بگه به من
Struct w {
Struct info;
Float pye;
Unsigned l_o: 1;
Unsigned hu: 1;
Unsigned sh: 1;
};
یا مثلا این برنامه چقدر حافضه لازم داره:
Struct bd {
Unsigned int d: 5 ;
Unsigned int m:5;
Unsigned int y:7;
};
همچنین در مورد آداپتور ارتباط سری و اینکه برنامه رسیو و تجزیه و تحلیلش چطوریه؟
در مورد این توابع هم کمی توضیح بدین لطفا(کارش چیه):
()title
()strtoul
و اینکه کار این دستور چیه؟: (a=atoi(b
همچنین در این تابع کاراکتر 'a'چند بار در این دستور چاپ میشه
for(i=-2;i<=20;i+=2);h
puts(a");j
خیلی ممنون از اینکه جواب میدین و بازم میگم شرمنده خارج از بحث سوال میکنم
(راستی این hوj که آخر تکه برنامه نوشتم چیزی نیست فقط چون پارانتز forاول می اومد نوشتم تا درست نوشته بشه)
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
اولا اين تاپيك مخصوص تمرين و مباحثه در مورد تمرينات است و سئوال شما كاملا مناسب تاپيك است.

دوما خوب بود كه اساتيد فن مثل programmer و آقا سعيد جواب شما را مي دادند. كه احتمالا فرصت نكرده اند يا هنوز اينجا سرنزده اند.
فعلا من در حد سواد خودم جواب مي دهم بعدا ايشان اصلاح و تكميل مي كنند.

پاسخ سئوال اول:
تا آنجا كه سواد من ميگه ، struct ، نوعي به هم مربوط كردن انواع مختلف داده است . مثلا يك int را كنار char مي گذاريم. مثلا مشخصات يك ماشين ، يكي پلاك ماشين است كه ميشه int يا long و يكي نام ماشين كه با char مثلا ميشه ساخت. اين طوري تمام انواع اطلاعات ماشين در يك struct بسته بندي ميشه و باعث تسهيل در استفاده است.

کد:
car.name
car.number

ولي اين باعث نميشه كه تعداد خانه هاي حافظه كمتر استفاده بشه. به تعداد بايتهاي لازم براي ساختن اين متغيرها در خارج struct حافظه لازمه. يعني چه معمولي int بسازيم و چه در داخل يك struct فرقي نداره.
فكر كنم شما با union اشتباه گرفته ايد. Union هم يك نوع struct است ولي همه متغيرها روي هم مي خوابند. و طول حافظه مورد مصرف ميشه برابر با طول بزرگترين آنها. مثلا اگر long و int و char داشته باشيم در union ، مقدار حافظه مصرفي برابر ميشه با طول long .
اگر اشتباه گفتم دوستان اصلاح كنند.

سئوال دوم : آداپتور ارتباط سري.
يا من كلا بلد نيستم يا اسم ديگه اي داره كه من با اون اسم ميشناسم.
بهر حال محبت دوستان را مي طلبد.

سئوال سوم: دو تابع title و strtoul .
كلا در مورد توابع من تا يك برنامه نسازم و نتوانم از آن تابع استفاده كنم و مسلط نشوم ، جواب نمي دهم.ولي strtoul مربوط به تبديل هاست . و title را هم در help توربو سي پيدا نكردم. شايد مال كامپايلر ديگري باشه يا در header نوشته شده توسط شخصي شما برخورد كرده ايد يا من دقت نكرده ام و در دستورات وجود داره. اگر حياتي بود برايتان هر قسمت تاكيد بيشتري كنيد تا با سرچ در اينترنت به منابع بيشتري دست پيدا كنيم.

کد:
  ‏ strtoul converts a string to an unsigned long
   unsigned long strtoul(const char *s, char **endptr, int radix);



سئوال چهارم: a=atoi(b)
هلپ help توربو سي اين طور معرفي اش مي كنه.


Macro that converts string to integer

Declaration: int atoi(const char *s);

يعني ماكرويي كه string را به integer تبديل مي كند. و ورودي تابع همان طور كه مي بينيد constant char است و خروجي عدد. Constant هم يعني حروف باشه دقيقا فكر كنم . نه متغير. من قبلا از عكس اين حالت استفاده كرده ام. و در يكي از پستهاي همين تاپيك هست. پست شماره 131 صفحه 9 . البته اگر صفحات شما به شكل ديفالت يعني 15 پستي فرمت شده باشه.
حالا آن برنامه را دوباره من اينجا مي گذارم.

کد:
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
void main()
{
clrscr();char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
 


   int number = 12345;
   char string[25];

   itoa(number, string, 10);
   //printf("integer = %d string = %s\n", number, string);
   cout<<"integer="<<number<<"    string="<<string<<endl;


 // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
c=getch();if(c != 'x') goto menu;
}

همان طور كه استاد گرامي فرمودند آن 10 يعني مبناي 10 و كار اين تابع تبديل از عدد به رشته است. مال شما برعكسش است. ديگه خودتان استادش كنيد طرز استفاده را.

سئوال پنجم: كه در حلقه شما كاراكتر چند بار چاپ ميشه؟
بهترين راه اينه كه برنامه را بنويسيد و اجرا كنيد.

کد:
#include <conio.h>		
#include <iostream.h>
[color=red]#include <STDIO.H>[/color]
void main()
{		
clrscr();char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
 
int i;
for(i=-2;i<=20;i+=2);
[color=red]puts[/color]("a");

//cout<<"---- "<<endl;


 // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
	c=getch();if(c != 'q') goto menu;
}

يك بار حرف a نوشته ميشه. علتش را خودتان استدلال كنيد. اين تابع گاهي براي print استفاده ميشه و در header ئي است كه با رنگ قرمز مشخص كرده ايم.
در پست بعدي اقا سعيد گفته كه چرا يك بار چاپ ميشه. علتش سمي كالن بعد تعريف حلقه است.
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
خوب سئوال اول رو دوست عزيز اقاي سالك جواب دادن
سئوال دوم منظورتون نوشتن يه برنامه براي ارتباط با پورت سريال و پورت پارالل هست من هم منظورتون رو درست نفهميدم .( من مثل شما تازه كارم ديگه ندونستن عيب نيست نپرسيدن عيبه)
اما سئوال سوم و چهارم: من هم در مورد title چيزي نميدونم
اما كد زير را براي strtoul و atoi كمك ميكنه
کد:
#include <stdlib.h>
#include <conio.h>
#include <iostream.h>

void main(void)
{
   clrscr();
   int n;
   char *str1 = "1323.7";
   char *str2 = "14324324365";
   char *str3 = "1432d123.1";
   char *str4 = "1432d123.1";
   char *endptr;

   cout<<"Str1="<<str1<<" integer="<<atoi(str1)<<" uLong="<<strtol(str1, &endptr, 10)<<endl;
   cout<<"Str2="<<str2<<" integer="<<atoi(str2)<<" uLong="<<strtol(str2, &endptr, 10)<<endl;
   cout<<"Str3="<<str3<<" integer="<<atoi(str3)<<" uLong="<<strtol(str3, &endptr, 10)<<endl;
   cout<<"Str4="<<str4<<" integer="<<atoi(str4)<<" uLong="<<strtol(str4, &endptr, 10)<<endl;
   getch();
}
خروجيش ميشه
کد:
Str1=1323.7 integer=1323 uLong=1323
Str2=14324324365 integer=-10227 uLong=2147483647
Str3=1432d123.1 integer=1432 uLong=1432
Str4=1432332.1 integer=-9460 ulong=1432332
توي خروجي 1 مي بيني كه فرقي بين خروجي دوتا تابع نيست و فقط قسمت صحيح برگداننده شده است زيرا عدد مورد نظر توي محدوده اينتيجره
اما در خط دوم چون عددي كه توي استرينگ ذخيره شده از محدوده Ulong خارج شده هم تابع atoi و هم strtol خروجي اشتباه داده است
در مورد سوم ديده ميشه كه عدد قسمت سمت چپ كاركتر ها مورد بررسي است ( اگه پايه را تغيير دهيم يعني 10 ميتونيم از حروف abcdeوf هم استفاده كنيم )
در خط چهارم هم محدوده عمل اين دوتا تابع مورد بررسي قرار گرفت
سئوال 5
کد:
for(i=-2;i<=20;i+=2);
puts("a");
هنگام استفاده از اين سيمبل ; بايد دقت شود
ببينيد هنگامي كه از اين سيمبل استفاده ميشه يعني اون دستور كامل شده يعني حلقه for بدون انجام كاري فقط به عنوان يه شمارنده عمل مينمايد ووقت بر است ( هر چند كه بعلت كوچكي وقت مصرف شده و سرعت بالاي c اين زمان به نظر نميرسد)
لذا دستور puts يك بار اجرا ميشه چون توي بدنه حلقه نيست ( يعني بصورت معمولي )
حال اگر از اين دستور استفاده بشه

کد:
for(i=-2;i<=20;i+=2)
puts("a");
خودتون حدس بزنيد چند بار اجرا ميشود.
12 بار :lol:
 

sina_judgment

کاربر تازه وارد
تاریخ عضویت
2 می 2005
نوشته‌ها
635
لایک‌ها
10
محل سکونت
زندان اوین....
با سلام و عرض تشکر از لطفت...
در مورد struct این رو کمکتون کنم که معروف به ساختمان هستش و برای تعریف متغیرهای محلی تو در تو هم به کار میره یعنی مثلا:
void main()
int i=4
char c=w
struct ww{
int i=12
char c=x
} sina
در مورد اینکه حافظه چطور میشه اینو بگم که اگه دقت کنین میبینین که جلوی هر متغیری یه:ویک عدد نوشته شده{داخل ساختمان}که اون عدد میزان حافظه رو نشون میده مثلاunsigned l_o به اندازه 1بایت حافظه لازمشه!!!!!فقط اینجا مسئله اینه که خود unsigned به اندازه 4 بایت حافظه میگیره و تکلیف ما این وسط مشخص نیست(4بایت یا 1 بایت)و اون کار نیم و کار نامبر که شما نوشتی به فیلدها و رکرودهای ساختمان از قبل تعریف شده دسترسی پیدا میکنه...
در مورد آداپتور سری هم بگم که برای سند ورسیو هستش اگه اشتباه نکنم که این ترک پدر منو در آورده!!!!!!!!!
در مورد stroulبیشتر توضیح بدین ممنون میشم
و در مورد سوال آخر چرا 1 بار چاپ میشه من که مغز فندقیم به جایی آنتن نمیده:D
به هر حال ممنون از لطفت....
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
خوب براي برقراري ارتباط با پورت ها سريال و پارالل شما بايد از دستور put و out توي اسمبلي استفاده كني يعني
out portN,Num
كه portNشماره پورت و num عددي است كه شما به پورت ميفرستيد
مثلا شماره پورت پارالل 387H ميباشد
و در مورد مطلبي كه گفتي 4 بايت صحيحه .
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
امروز داشتم كل اين تاپيك رو مطالعه ميكردم چندين سئوال به نظرم رسيد كه جواب داده نشده بود ( اگه دوباره كاري ببخشيد بگيد كدوم قسمت دوباره كاريه تا اون رو تصحيح كنم)
اولين مورد فرق مفسر و كامپايلر
مفسر برنامه رو خط بخ خط خونده و تبديل به كد واسطه ميكنه و بعد اين كد واسطه رو توسط كدهاي ديگر كه به زبان اسمبلي نوشته شده اجرا ميكنه يعني هميشه اين كدها كند تر هستند چون بايد توسط يه واسط اجرا بشن
اما كامپايلر ايتدا برنامه رو چك وبعد از اون مياد اون ها تبديل به يك ابجكت ميكنه يعني چيزهاي كه لازمه رو گرد هم مياره و بعد اونها راتوسط يه لينك كننده لينك كرده واستفاده ميكنه
بزاريد با يه مثال توضيح بدم فرض كنيد شما x.h رو صدا زديد و فقط تابع y رو ازش استفاده كرديد كه اين تابع از هيچ كدوم از توابع موجود در x.h استفاده نميكنه وقتي برنامه رو كامپايل ميكنيد تمامي بخشهاي لازم جمع ميشن يعني فقط قسمت تابع y از x.h مورد مصرف قرار ميگيره و بعد همگي انها به كد اسمبلي تغيير ميكنن ولي كدها هم خودشون اسمبلي هستند مثلا
کد:
 while(i=5,i!=0,i--)
ميشه
کد:
Mov cx,5
1*:dec cx
Test cx,cx
Jnz 1*

نتيجه اينكه فايل هم كوچكتر هم سريع تره
اما همين مثال while بالا توسط مفصر كد شده و تكه اجراي مفصر با كد وجود داره نتيجتا فايل بزرگ و كند ميشه چون براي يه كار ساده بايد چندين تابع پشت سر هم صدا زده بشن مثلا تابع a كه كار تبديل عدد 5 به long رو انجام بده ( همچنين براي بقيه اعداد) و بعد صدا زدن تابع while و بعد دوباره تابع b كه اعداد رو از حالت long به int تبديل كنه باعث كند كار كردن برنامه ميشود ( تابع whileفقط با ورودي long كار ميكنه )
اينها همشون يه مثاله و واقعا همچين چيزي نيست فقط براي فهميدن نحوه عملكرد گفتم
و ...
*** آيا سرعت بالاي c نسبت به بيسيك به علت همين قضيه است. راجع به پاسكال چي؟ آيا آن هم كامپايلي است؟ پس چرا سرعت سي از پاسكال خيلي بيشتر است؟
( در مورد پاسكال تحت داس)
فكر كنم كامپايلي است ولي به علت استفاده از تمامي هدر در برنامه بعضي از وقتها كندتر و فايل حجيم تر ميشه ( براي يك الگوريتم مشابه )
*** فكر كنم توربو سي تحت داس هم داريم. آيا ايني كه ما استفاده مي كنيم تحت ويندوزه؟
اگه تحت شل داس استفاده ميكنيد همان برنامه تحت dos حساب ميشه
ببخشيد خيلي كنه بود:lol:
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
ممنون از توضيحات خوبتان.
خيلي چيزها برايم جا افتاد و واقعا لذت بردم و به سي باز هم بيشتر علاقه مند شدم.
فقط يك سئوال هنوز برايم باقي است . چرا در بيسيك نتوانسته اند كامپايل كنند و به تفسير قناعت كرده اند؟
آيا بخاطر دوري اين زبان از زبان ماشين است؟
.
 

sina_judgment

کاربر تازه وارد
تاریخ عضویت
2 می 2005
نوشته‌ها
635
لایک‌ها
10
محل سکونت
زندان اوین....
به نقل از saeedsmk :
خوب براي برقراري ارتباط با پورت ها سريال و پارالل شما بايد از دستور put و out توي اسمبلي استفاده كني يعني
out portN,Num
كه portNشماره پورت و num عددي است كه شما به پورت ميفرستيد
مثلا شماره پورت پارالل 387H ميباشد
و در مورد مطلبي كه گفتي 4 بايت صحيحه .
چرا 4بایت مگه ما 1بایت برای سایر متغیر ها تعریف نکردیم؟؟؟؟در ضمن برای پورت پارالل با C پروژه دادن بخ ما و پدر ما رو در میارن البته گفته تا سال بعد بیارین
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
سيناي عزيز گفته بود :
...
اون عدد میزان حافظه رو نشون میده مثلاunsigned l_o به اندازه 1بایت حافظه لازمشه!!!!!فقط اینجا مسئله اینه که خود unsigned به اندازه 4 بایت حافظه میگیره و تکلیف ما این وسط مشخص نیست
...
خوب ببين فرض كن ما x رو چهار بايتي تعريف كنيم و مقدار اون را بعد از تعريف، برابر 1 قراردهيم x توي مموري ميشه :
x=0x00000001
تا اينجا فكر نكنم مشكلي داشته باشيد
حالا ما حين تعريف ميايم و مقدار x را برابر 1ميگذاريم ( x را چهار بايتي تعريف ميكنم). و مشكل شما شروع ميشه .
**نكته در واحد زمانكامپيوتر و يا پالس زماني سي پيو فقط يك كار انجام ميدهد.
اين نكته بسيار جالب است كه بايد دقت شود كه دو عمل را با هم انجام دادن در واحد زمان فقط براي انسان ممكن است نه كامپيوتر (ولي چون كامپيوتر بسرعت عمل مينمايد و واحد زماني بسيار كوچكي دارد پس به نظر ميرسد كه هر دو كار را با هم انجام داده است !!!!!!!!!!!!.)
كامپيوتر وقتي به كد مقدار دهي حين تعريف ميرسد دقيقا چكار مينمايد ؟
1- ابتدا جاي از حافظه را بر حسب بايت وان چنانكه تعريف شده است معين كرده
2- سپس مقدار دهي مينمايد
پس درهر دو مورد ؛ تعريف و بعد مقدار دهي و مقدار دهي حين تعريف؛ بر اساس تعريف مقداري از حافظه گرفته ميشود( allocate)
حرف شما زماني درست است ( يعني يك بايت ) كه ابتدا مقدار دهي شود و بعد بر اساس ان تعريف صورت گيرد واين غير ممكن است زيرا تا جايي معين نشود نميتوان به ان محل ديتايي اختصاص داد

و....
سالك جان گفته بودي :
فقط يك سئوال هنوز برايم باقي است . چرا در بيسيك نتوانسته اند كامپايل كنند و به تفسير قناعت كرده اند؟
و...
جواب اين سئوال بر ميگرده به نحوه برنامه نويسي توي اين زبان كه بي ربط به سئوال دوست خوبمان سينا نيست .
توي بيسيك مخصوصا vb شما ميتوانيد متغيير را تعريف نكيند ( يا فقط به ان اشاره كنيد ) و بعد خود مفسر بر اساس مقدار دهي ان متغيير را تعريف مينمايد و از اين گونه موارد .... كه نتيجه ان نياز به يك مفسر ميانجي است و در ضمن از انجايي كه وي بي و بيسيك را با خانواده c نوشته اند و ساختار ديتا دهي بيسك و نحوه دستور عمل ها وديگر موارد استفاده از مفسر بسيار بهتر و عاقلانه تر بوده است
البته اين موارد دليل بر عدم توانايي و بدي ان زبان برنامه نويسي نميشود.

اميدوارم كمك تون كنه
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
ممنون از پاسخ.
يك سئوال ديگه هم دارم. كه مربوط به سئوال دوستمان است.
وقتي ما از
regs & union
استفاده مي كنيم. مگر اينها سي محسوب نميشه. منظورم مقدار دهي به رجيسترها و استفاده از وقفه هاست با اين كلمات كه بالا نوشتم.
منظورم اينه كه باعث غير قابل حمل بودن نميشه. چون اسمبلي غيرقابل حمله ولي سي قابل حمله.

با
asm
وقتي اسمبلي استفاده مي كنيم چه؟ آيا باز هم اين مشكل قابل حمل بودن ايجاد نميشه؟
با تشكر.
.
============================
به نظرم كل سئوالم اشتباه بود.
انگار اين اسمبلي كه ما در سي استفاده مي كنيم از نوع 8086 است و در همه كامپيوترها قابل قبوله.
و نيازي نيست كه براي گول زدن خود برنامه خودمان را در يك بلوك قرار بدهيم و بالاش asm را اضافه كنيم و بگيم كه حالا از غير قابل حمل به قابل حمل تبديل شد . يعني فكر كنيم كه از اسمبلي به سي آمده ايم و ديگه قابل حمل شده برنامه ما. چون آن اسمبلي كه استفاده مي كنيم هم از نوع 8086 است و همه جا مورد قبول است.

لطفا هر يك از حرف هاي من كه اشتباه بود بگيد.
.
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
شرمنده من نفهميدم چرا اسمبلي غير قابل حمله
منظورتون از غير قابل حمل چيه ؟

ايا منظورتون تفاوت در نحوه ساختار اسمبلي براي مثال تفاوت دستورات اسمبلي z80و 8086 ؟

ببينيد در تمامي كامپيوتر هاي مبتني بر 8086 يعني 8086 - 286-386-486-586 يا پنتيوم و خانواده بعد از اون يعني P1-P2-p3-p4 و سي پيوهاي amd و سايريكس و از اين دسته كه بر روي انها سيستم عامل مايكروسافت باشه فايلهاي كه با اسمبلي نوشته شوند قابل اجراند .مگر اينكه سيستم عامل مورد نظر توانايي اجرا اين دسته از فايلهارا نداشته باشد مثلا فايل براي ويندوز نوشته شده باشد و در داس 6.22 اجرا شود .
تا اونجايي كه من ميدونم ( و دانش كمم اجازه ميده ) در حالتي كه برنامه اسمبلي براي يونيكس طراحي بشه باز هم با تغييراتي ميشه اون رو توي سيستم مايكروسافت اجرا كرد( مگر اينكه از برنامه از توانايي هاي سيستم عامل استفاده كرده باشه كه در ديگري نيست ).همين مشكل براي برنامه سي وجود داره .
وقتي شما يه فايل اسمبلي رو توسط اسمبلر كامپايل ميكنيد يه فايل obj به شما ميدهد و سپس شما توسط لينكر اين فايل obj را تبديل به فايل اجرايي ( com يا exe بر اساس نوع تعريف فايل اوليه) مينماييد .
حالا وقتي شما يك فايل سي رو كامپايل ميكنيد سي ابتدا از برنامه شما يك فايل obj ميسازه و سپس اون فايل رو با لينكر سي ( شما ميتونيد از اين لينكر براي فايلهاي اسمبلي هم استفاده كنيد ) تبديل به فايل اجرايي يا فايل Exe مينمايد.
دقيقا مثل اسمبلي با اين تفاوت كه فايل com رو نميتونه بسازه و فقط exe ميسازه ( بعلت ساختار فايل اوليه و استفاده كردن از سكشن هاي مختلف )
همونطور كه ميبنيد دقيقا يه روش رو دنبال ميكنن پس اگر سي قابل حمل باشه اسمبلي هم هست

اگر مسله قابل حملي از نظر مايكروروسافت و يونيكسه
بازم تا اونجايي كه من ميدونم تنها زباني كه به پلت فورم بستگي نداره ودر همه سيستم ها قابل اجرا است ( بر اساس گفت هاي شركت سان ) جاوا است . در نتيجه فقط برنامه هاي نوشته شده در زبان جاوا كه همشون نيمه كامپايل هستند و در نهايت توسط مفسر ماشين مجازي جاوا اجرا ميشن را ميتوان قابل حمل دانست .

نميدونم تونست كمك كنم يا نه
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
عالي بود.
من همين مطالب را مي خواستم.
ولي راجع به جاوا ، فكر كنم اگر كسي جاوا ويرچوال ماشين را نداشته باشه اجرا نشه. البته من اطلاعاتم نزديك به صفره.
اگر قرار باشه چيزي را در كامپيوتر هدف نصب كنيم يعني مثل همين جاوا ويرچوال ماشين ، اين جوري ويژوال بيسيك هم قابل حمله. چون ميشه رفت تمام ((دي ال ال)) ها را قبلا نصب كرد. يا براي دات نت ، دات نت فريم ورك را.
به نظر من قابل حمل بودن يعني كه بر اساس قابل فهماندن بودن به پردازشگر باشه نه يك واسط.
البته گفتم اطلاعات من در حد صفره. و اين حرفها را زدم تا اگر اشتباه فكر مي كنم اصلاح بشه. راجع به اسمبلي هم اطلاعات شما خيلي برايم مفيد بود. من شنيده بودم كه در پنتيوم 1 با 4 اسمبلي اش فرق مي كنه . به همين خاطر گفتم غيرقابل حمله. ولي خودم غير 8086 تابحال چيزي كار نكرده ام.
.
=============================
من مطالعاتم پراكنده بوده و جمع بندي خوبي ندارم. در يك ساين مي نويسه كه (( سي قابل حمل است )) در يك سايت ديگر ميگه ((فقط جاوا قابل حمل است.))
ولي كلا نظر شخصي من اينه كه نبايد با اين تعريفهاي تئوري كار داشت . زيرا بايد درگير شد و با اين مسائل برخورد كرد ، بعدش خودمان مي فهميم چه زباني قابل حمل است يا نيست. لازمه بگم منظور من از قابل حمل چيه.
قابل حمل يعني اين كه وقتي برنامه قابل اجرا را ساختيم ، بدون همراه كردن با فايلهايي وقتي به كامپيوتر ديگر منتقل كنيم ، بي هيچ اشكالي در آن كامپيوتر هم اجرا بشه.

ولي باز نظر شخصي من اينه كه با هر زباني كه نوشتيم ، وقتي قابل حمل نباشد ، هيچ مسئله بزرگي نيست.
چون يا دستي يا با برنامه هاي ستاپ ساز ميشه به فايلهاي مورد نيازش تجهيزش كرد برنامه امان را. چون با وجود هاردهاي بزرگ كنوني ، زياد فرق نمي كنه كه چه يك مگا اضافه بشه به برنامه ، چه 10 مگا. به نظر من 10 مگا ديگه حجمي نيست كه بخواهيم اينقدر راجع به آن فكر كنيم. حتي گاهي سرعت اجرا هم آنچنان مهم نيست. البته گاهي هم خيلي مهم است و فرق داره از برنامه اي با برنامه اي.

من خودم سي را به خاطر نزديكي به اسمبلي و زبان ماشين و سرعت بالايش دوست دارم.
حتي ميشه با برنامه اي مثل ويژوال بيسيك كه سرعت كمي داره جور ديگه اي برخورد كرد. يعني ظاهرش با ويژوال بيسيك ساخته بشه و كارهايي كه نياز به سرعت بالا را دارد را با فايلهاي سي در پشت پرده انجام داد. البته شايد اين كاري غيرطبيعي باشد ولي اگر حساب شده اين كار را بكنيم و اجرا بشه چه اشكالي داره. مثلا ويژوال بيسيك در كارهاي گرافيكي سرعتش پايينه ، خوب ميشه بعضي قسمتها را با سي يا جاوا انجام داد. البته شايد ويژوال سي همين كار را انجام مي دهد. ولي من هنوز بخاطر بعضي پيچيدگي هاي وي سي هنوز نتوانسته ام باهاش كار كنم. يا در مواردي دلفي همين كار را تا حدي انجام دهد. ولي به نظرم اگر سرعت سرسام آور بخواهيم فقط سي پاسخ است. مخصوصا برنامه هايي از سي كه مستقيما حافظه هايي خاص را دستكاري مي كند. و با اسمبلي گاهي اجراي برنامه ها تا 10 برابر سرعتش بالا تر مي رود. البته خيلي جاها مي دانم بيراه دارم ميگم كه بخاطر سواد و تجربه كم و عجول بودنم است ولي اين مانع نمي شود كه نظرم را نگم.
تاپيك شايد بيش از يك هفته اي است كه به علت اوج فصل امتحانات خواننده ندارد و اين فرصت خوبيه تا من اشكالاتم را رفع كنم. و اين سرمايه اي بشه براي آينده ام. اگر جايي اشتباه گفتم حتما اصلاح كنيد ، چون من بخاطر حضور شما دارم بي محابا نظر مي دهم و نمي خواهم مطالب غلط بي اصلاح اينجا بمونه.
.
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
اول قابل حملي در پلتفورم هاي متفاوت ( يعني سيستم عامل هاي متفاوت از شركت هاي متفاوت (
بزاريد يه مثال بزنم بگم چرا ميگن جاوا قابل حمله
فرض كنيم ما يه برنامه نوشتيم و بعد آن را توسط تربو سي تحت داس كامپايل نموديم .در نهايت ما يه فايل اجرايي كه فقط در پلت فورم خانواده مايكروسافت قابل اجرا است داريم. اين برنامه در پلتفورم خانواده يونيكس قابل اجرا نيست ( مگر از برنامه هاي كمكي استفاده شود)
اما حالا همان برنامه را با جاوا نوشتيم و كامپايل كرديم ( فرض ميكنيم بتوانيم همان الگوريتم را در جاوا پيدا كنيم ).حالا هر پلتفورمي كه جاوا ويرچوال ماشين را داشته باشه ميتونه اين برنامه را اجرا كنه يعني پلتفورم هاي مايكروسافت- يونيكس -مكينتاش- او اس و ....
پس با اين توضيح فقط جاوا قابل حمله ( شما همش روي يك پلت فورم داري نگاه ميكني يعني سيستم عاملهاي مايكروسافت)
حالا قابل حملي در يك پلت فورم : ( يعني مايكروسافت )
هر برنامه اي كه شما نوشته ايد و از اصول استاندارد در ان استفاده نماييد بعد از كامپايل توانايي اجرا در كامپيوتر هاي ديگر با همون پلت فورم و يا بالاتر را دارند مگر اينكه زبان خاص مورد مصرفي بصورت مفسري بوده و مفسر همراه فايل اجرايي نباشد .مثل بعضي از فايلهي اجرايي توليد شده توسط qbasic
**نكته: اگر شما از توانايي خاص يك كامپيوتر مثلا از توابع mmx در برنامه تان استفاده كنيد ديگر اين برنامه در كامپيوتر هاي كه داري همين پلتفورم هستند ولي mmx نيستد قابل اجرا نيست .
ما وقتي برنامه اسمبلي مينويسم استفاده از اين دست توابع راحتر و در بعضي از موارد مناسب تر است ( در سي هم ميتوان از اين دسته توابع استفاده كرد اما عموميت ندارد ) لذا برنامه اجرايي نهايي فقط در ان دسته كامپيوتر و يا بالاتر كه اين قابلت را دارند قابل اجرا است . در نتيجه بعضي ها ميگويند فايلهي اجراي كه با زبان اسمبلي نوشته شده است قابل حمل نيست .
فكر كنم با توضيحي كه دادم مشخص شد كه در حين برنامه نويسي با زبان اسمبلي ؛ در صورت استفاده از دستورات استاندارد، در هر كامپيوتري فابل اجرايي نهايي قابل حمل است
**نكته: شما ممكن است در برنامه تان بر اساس نياز از فايلهاي استفاده كنيد كه در كامپيوتر ديگر نباشد و لذا برنامه شما اجرا نگردد.
اين ربطي به قابل حمل بودن ندارد. مثلا برنامه اي نوشتيد كه از winxxx.dll استفاده منمايد و در كامپيوتر ديگر نيست و هم در سي و هم اسمبلي و هر زبان ديگري تا اين فايل موجود نباشد برنامه شما اجرا نخواهد شد . پس اين مشكل ربطي به مسئله قابل حملي ندارد.
ببنيد در شرايط خاص قابل حملي مهم ميشود .فرض كنيد يك برنامه نوشتيد كه كار پچ كردن برنامه شما را انجام ميدهد و باگي را در برنامه شركت شما كه در ويندوزهاي متفاوت ( پلتفورمهاي با ورژنهاي متفاوت ) در حال اجرا است زا بر طرف مينمايد .
حال اگر شما از يك برنامه غير قابل حمل استفاده كنيد ناچاريد برنامه هاي اضافي را هم در پچتون قرار دهيد و در نتيجه برنامه شما سنگين شده و براي كساني كه از طريق اينترنت در حال دانلود اين پچ هستند دانلود برنامه پچ را سخت و يا غير مشكل مينمايد.
اما در مورد سرعت بايد بگم درست ميگيد. و پيشنهاد شما براي استفاده از چند زبان همين الان هم در حال اجرا است

اميدوارم كمك كنه :d
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
اول تشكر مي كنم كه وقت گذاشتيد و جواب داديد.
دوم بگم كه فهميدم قضيه از چه قرار است.
يعني اينكه اگر ما از قسمتهاي پايه اي ( فايل و تابع و غيره) استفاده كنيم ، هيچ مشكلي پيش نمي آيد .
ولي اگر از قسمتي(فايل ، تابع و غيره) استفاده كنيم كه مختص يك سيستم عامل است ، مشكل ايجاد ميشه. حالا با هر زباني كه باشه. مثل اسمبلي ، سي و غيره.
تا حد زيادي قضيه برايم جا افتاد.
= == = == = == = == = == = == = ==
نتيجه گيري: اگر مي خواهيم كه برنامه ما محدوده اجرايش ( در سيستم هاي مختلف) گسترده باشه، پس بايد....
((سعي كنيم از كلاسها و توابع سيستم خودمان استفاده نكنيم ، بلكه از عناصري استفاده كنيم كه در هر سيستمي موجود باشه. ))

باز هم تشكر مي كنم از زحمتي كه كشيديد. من چون سيستم لينوكس را نمي شناسم و حتي تفاوت سيستم عاملهاي مختلف ميكروسافت را هم نمي دانم و خيلي چيزهاي ديگه كه نمي دانم ، ترجيح مي دهم كه اين بحث را ادامه ندهم. و بگذارم براي وقتي كه از لحاظ دانستني هايم به سطح بالاتري برسم و فعلا به آموختن برنامه نويسي بپردازم.

راجع به اين كه استفاده از چند زبان مرسوم است هم خوشحال شدم. چون اين كار به آدم توانايي خوبي مي دهد.
بعضي زبانها راحتند و بعضي زبانها قوي. و ميشه بعضي قسمتها را با يكي انجام داد و بعضي قسمتها را با ديگري.
.
بيش از اين وقت شما را نمي گيرم. ولي محتاج كمك شما همچنان هستيم.
.
 

sina_judgment

کاربر تازه وارد
تاریخ عضویت
2 می 2005
نوشته‌ها
635
لایک‌ها
10
محل سکونت
زندان اوین....
به نقل از saeedsmk :
سيناي عزيز گفته بود :
...
اون عدد میزان حافظه رو نشون میده مثلاunsigned l_o به اندازه 1بایت حافظه لازمشه!!!!!فقط اینجا مسئله اینه که خود unsigned به اندازه 4 بایت حافظه میگیره و تکلیف ما این وسط مشخص نیست
...
خوب ببين فرض كن ما x رو چهار بايتي تعريف كنيم و مقدار اون را بعد از تعريف، برابر 1 قراردهيم x توي مموري ميشه :
x=0x00000001
تا اينجا فكر نكنم مشكلي داشته باشيد
حالا ما حين تعريف ميايم و مقدار x را برابر 1ميگذاريم ( x را چهار بايتي تعريف ميكنم). و مشكل شما شروع ميشه .
**نكته در واحد زمانكامپيوتر و يا پالس زماني سي پيو فقط يك كار انجام ميدهد.
اين نكته بسيار جالب است كه بايد دقت شود كه دو عمل را با هم انجام دادن در واحد زمان فقط براي انسان ممكن است نه كامپيوتر (ولي چون كامپيوتر بسرعت عمل مينمايد و واحد زماني بسيار كوچكي دارد پس به نظر ميرسد كه هر دو كار را با هم انجام داده است !!!!!!!!!!!!.)
كامپيوتر وقتي به كد مقدار دهي حين تعريف ميرسد دقيقا چكار مينمايد ؟
1- ابتدا جاي از حافظه را بر حسب بايت وان چنانكه تعريف شده است معين كرده
2- سپس مقدار دهي مينمايد
پس درهر دو مورد ؛ تعريف و بعد مقدار دهي و مقدار دهي حين تعريف؛ بر اساس تعريف مقداري از حافظه گرفته ميشود( allocate)
حرف شما زماني درست است ( يعني يك بايت ) كه ابتدا مقدار دهي شود و بعد بر اساس ان تعريف صورت گيرد واين غير ممكن است زيرا تا جايي معين نشود نميتوان به ان محل ديتايي اختصاص داد

و....
سالك جان گفته بودي :
فقط يك سئوال هنوز برايم باقي است . چرا در بيسيك نتوانسته اند كامپايل كنند و به تفسير قناعت كرده اند؟
و...
جواب اين سئوال بر ميگرده به نحوه برنامه نويسي توي اين زبان كه بي ربط به سئوال دوست خوبمان سينا نيست .
توي بيسيك مخصوصا vb شما ميتوانيد متغيير را تعريف نكيند ( يا فقط به ان اشاره كنيد ) و بعد خود مفسر بر اساس مقدار دهي ان متغيير را تعريف مينمايد و از اين گونه موارد .... كه نتيجه ان نياز به يك مفسر ميانجي است و در ضمن از انجايي كه وي بي و بيسيك را با خانواده c نوشته اند و ساختار ديتا دهي بيسك و نحوه دستور عمل ها وديگر موارد استفاده از مفسر بسيار بهتر و عاقلانه تر بوده است
البته اين موارد دليل بر عدم توانايي و بدي ان زبان برنامه نويسي نميشود.

اميدوارم كمك تون كنه
خیلی ممنون از این که با حوصله توضیح دادی
 
بالا