PDA

View Full Version : سوال: چاپ عناصر آرایه بدون اطلاع از تعداد آنها



Marjan_Bala
چهارشنبه 27 آبان 1388, 19:01 عصر
سلام دوستان
فرض کنید نمیدونیم تعداد عناصر آرایمون چندتاس ، حالا میخوایم اونارو چاپ کنیم ، چجوری باید اینکارو کنیم؟(توی C++‎ منظورمه چون تو C#‎ میزدیم .len تموم میشد میرفت )




void main()


{



int a[] = {1,2,3,4,5};



for(int i=0; ? ; i++)



cout<<a[i];



}



یعنی جای علامت سوال چه شرطی باید گذاشت؟
راهی که من خودم به نظرم میرسه استفاده از اشاره گراس ، چون میدونیم که اسم آرایه اشاره میکنه به خونه اول آرایه ، یعنی یه همچین چیزی میشه:




void main()



{


int a[] = {1,2,3,4,5};



for(int i=0; *a=!NULL ; i++)



cout<<a[i];



}




حالا توی اون حلقه for چجوری باید بگم a به خونه بعدی آرایه اشاره کنه؟
راه بهتری پیشنهاد نمیکنید؟
پیشاپیش ممنون از لطفتون

tdkhakpur
چهارشنبه 27 آبان 1388, 20:44 عصر
int a[] = {1,2,3,4,5};
int c=sizeof(a)/sizeof(int);
for(int i=0; i<c ; i++)
cout<<a[i];

Marjan_Bala
چهارشنبه 27 آبان 1388, 21:46 عصر
ممنون دوست عزیز ، جواب داد.
فقط یه چیزی sizeof (a) چرا 20 میشه و اینکه sizeof (int) همیشه 4 میشه؟!
بعد اینکه حالا اگه نخوایم از sizeof استفاده کنیم و مجبور باشیم از همون اشاره گرا استفاده کنیم باید چیکار کنیم؟تو اون برنامه ای که گذاشتم چجوری باید بگم a به خونه بعدی آرایه اشاره کنه؟
ببخشید من انقد سوال میپرسم ، ولی بدون استفاده از sizeof هم یه راه حل بدید واقعا" ممنون میشم.

m.soleimani
چهارشنبه 27 آبان 1388, 22:36 عصر
ممنون دوست عزیز ، جواب داد.
فقط یه چیزی sizeof (a) چرا 20 میشه و اینکه sizeof (int) همیشه 4 میشه؟!

به این علت که در سیستم شما برای نوع داده‌ی int چهار بایت حافظه اختصاص داده می‌شه و این می‌تونه تو یه سیستم دیگه مقدار دیگری باشه, و این در حالی هست که sizeof a یعنی این‌که a آرایه‌ای هست از یه نوع خاص در این‌جا int پس هر کدام از اندیس‌های آرایه‌ی a برابر می‌شن با چهار بایت.


بعد اینکه حالا اگه نخوایم از sizeof استفاده کنیم و مجبور باشیم از همون اشاره گرا استفاده کنیم باید چیکار کنیم؟تو اون برنامه ای که گذاشتم چجوری باید بگم a به خونه بعدی آرایه اشاره کنه؟

فرض کنیم که اشاره‌گر شما به نوع داده‌ int هست به نام p پس هر بار بنویسیم ++p به مقدار چهار بایت به طرف جلو حرکت می‌کنیم.

Marjan_Bala
چهارشنبه 27 آبان 1388, 23:28 عصر
به این علت که در سیستم شما برای نوع داده‌ی int چهار بایت حافظه اختصاص داده می‌شه و این می‌تونه تو یه سیستم دیگه مقدار دیگری باشه.

ممنون از جوابتون ، من فکر میکردم برا نوع داده int دو بایت در نظر میگیره،این که کامپایلر برای هر نوع داده ای چند بایت فضا در نظر بگیره به سیستم ارتباط داره؟ منظورتون از سیستم همون زبانیه که باهاش کار میکنم دیگه ؟یعنی اینکه متغیر نوع int در زبان ++c همیشه 4 بایت فضا میگیره.


فرض کنیم که اشاره‌گر شما به نوع داده‌ int هست به نام p پس هر بار بنویسیم ++p به مقدار چهار بایت به طرف جلو حرکت می‌کنیم.


اسم آرایه خودش یه اشاره گره دیگه ، با این حساب باید تو بدنه for بنویسم ;++a
ولی ارور میده میگه:Error 1 error C2105: '++' needs l-value
فکر کنم تو #c میشد بگیم a.next (یه چیزی تو همین مایه ها!)

tdkhakpur
چهارشنبه 27 آبان 1388, 23:50 عصر
فرض کنیم که اشاره‌گر شما به نوع داده‌ int هست به نام p پس هر بار بنویسیم ++p به مقدار چهار بایت به طرف جلو حرکت می‌کنیم
ببينيد حافظه مكاني هست كه به داده ها به عنوان كوچكترين واحد يعني بايت نگاه ميكند و 4و 8و 16و غيره معنيهاي منطقي براي دسترسي به داده هاست.
شما از هرنوع داده اي كه بخواهيد تعريف كنيد از لحاظ دسترسي به مكان بعدي بايد طبق اندازه متغيير كه توسط sizeof تعيين ميشود اقدام كنيد پس


int a[] ={1, 2, 3, 4 , 5};
*(a+0) = اولين مكان
*(a+4) = دومين مكان
*(a+8) = سومين مكان

ولي a++ كردن هر مكان از حافظه از لحاظ تئوري صيحيح بوده و ايرادي ندارد ولي برنامه به دلايل امنيتي احتياج دارد كه داده ها و متغيير هايي را كه تعريف ميكند به گونه اي آزاد كند لذا بايد تفاوتهاي بين داده هاي تعريف شده در برنامه با داده هاي پويا توسط اشاره كر جدا شده و سيستم از اين طريق بايد كنترل كند آدرس متغير ها نبايد دستكاري شود(به جز اشاره گر ها) كه همان پيغام را اول كار براي شما ارسال ميكند.

Marjan_Bala
پنج شنبه 28 آبان 1388, 12:11 عصر
سلام دوست عزیز ، ممنون از شرکتتون تو این بحث
درسته که تو این مثال هر کدوم از عناصر آرایه 4 بایت فضا میگیره ولی برای حرکت بین عناصر آرایه همون طور که جناب m.soleimani فرمودند باید یک واحد یک واحد به اسم آرایه اضافه کنیم اما نه با ++ ، یعنی:

پنجمین عضو آرایه=(a+4)*
و
دومین عضو آرایه=(a+1)*

اما با این روش هیچ موقع شرطی که من تو for گذاشتم یعنی a=!NULL* نادرست نمیشه ، چون ما جایی که a اشاره میکنرو مقدارشو عوض نکردیم ، یعنی تو برنامه جایی که a اشاره میکنه همیشه خونه اول آرایه باقی میمونه ، چرا نمیشه گفت a=a+1 ؟
بعدم اینکه چرا (a+5)* مقدار NULL برنمیگردونه؟(چون آرایه ما 5 تا عنصر که بیشتر نداره)

m.soleimani
پنج شنبه 28 آبان 1388, 14:28 عصر
سلام دوست عزیز ، ممنون از شرکتتون تو این بحث
درسته که تو این مثال هر کدوم از عناصر آرایه 4 بایت فضا میگیره ولی برای حرکت بین عناصر آرایه همون طور که جناب m.soleimani فرمودند باید یک واحد یک واحد به اسم آرایه اضافه کنیم اما نه با ++ ، یعنی:

پنجمین عضو آرایه=(a+4)*
و
دومین عضو آرایه=(a+1)*

اما با این روش هیچ موقع شرطی که من تو for گذاشتم یعنی a=!NULL* نادرست نمیشه ، چون ما جایی که a اشاره میکنرو مقدارشو عوض نکردیم ، یعنی تو برنامه جایی که a اشاره میکنه همیشه خونه اول آرایه باقی میمونه ، چرا نمیشه گفت a=a+1 ؟


بعدم اینکه چرا (a+5)* مقدار NULL برنمیگردونه؟(چون آرایه ما 5 تا عنصر که بیشتر نداره)

ببین شما وقتی که از کاراکتر * استفاده می‌کنی به مقداری دسترسی پیدا می‌کنی که اشاره‌گر مورد نظر به اون اشاره می‌کنه, یعنی این‌که اشاره‌گر p به یه آدرس در حافظه داره اشاره می‌کنه که بر فرض مثال ما اون آدرس مربوط به یه متغیر int هست و یه مقدار صحیح باز به فرض مثال 13 را تو خودش ذخیره کرده حالا اگر از p* استفاده کنی به این مقدار 13 دسترسی پیدا می‌کنی ولی اگر از p خالی استفاده کنی داره به آدرس متغیر مورد نظر در حافظه اشاره می‌کنی. امیدوارم که قابل فهم توضیح داده باشم در غیر این‌صورت بگین تا بیشتر توضیح بدم.
پس حالا هر موقع به p خالی یه دونه اضافه کنی توی حافظه به مقدار بایتی که به اون نوع داده خاص اختصاص داده شده اضافه می‌شه و دقیقن مثل یه آرایه به اندیس بعدی یا عضو بعدی که از همون نوع داده هست اشاره می‌کنه موفق باشید.

tdkhakpur
پنج شنبه 28 آبان 1388, 14:35 عصر
ببينيد چه كسي گفته هميشه اشاره گر به null ختم ميشود اين عمل فقط در مورد رشته صدق ميكند و اون هم اگر بصورت زير تعريف شده باشد.


char *a={"how are you today."};

كه در فوق اندازه حافظه گرفته شده 19 ميشود كه عدد 19 به خاطر اينه كه كامپايلر null را آخر رشته قرار ميدهد.
ولي در مورد اينكه چرا نميشه عدد به آدرس هر متغيير افزود را داخل تايپك بالا توضيح دادم.
و اما اينكه چرا يه جاي 1 عدد 4 به اندازه اضاضه ميشويد اينه كه بستگي به متغيير دارد كه اين واحد چقدر افزايش يابد براي char اين واحد 1 ميشه و براي int‌عدد 4 و براي double اين واحد برابر 8 ميباشد.
والسلام عليكم و رحمت الله و بركات ..

Marjan_Bala
پنج شنبه 28 آبان 1388, 14:44 عصر
پس حالا هر موقع به p خالی یه دونه اضافه کنی توی حافظه به مقدار بایتی که به اون نوع داده خاص اختصاص داده شده اضافه می‌شه و دقیقن مثل یه آرایه به اندیس بعدی یا عضو بعدی که از همون نوع داده هست اشاره می‌کنه موفق باشید.
پس با این حساب باید تو بدنه for بنویسم ;a=a+1 دیگه، ولی نمیشه ارور میده.


ببينيد چه كسي گفته هميشه اشاره گر به null ختم ميشود اين عمل فقط در مورد رشته صدق ميكند


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

tdkhakpur
پنج شنبه 28 آبان 1388, 14:46 عصر
حالا اگر از p* استفاده کنی به این مقدار 13 دسترسی پیدا می‌کنی ولی اگر از p خالی استفاده کنی داره به آدرس متغیر مورد نظر در حافظه اشاره می‌کنی. امیدوارم که قابل فهم توضیح داده باشم در غیر این‌صورت بگین تا بیشتر توضیح بدم.
پس حالا هر موقع به p خالی یه دونه اضافه کنی توی حافظه به مقدار بایتی که به اون نوع داده خاص اختصاص داده شده اضافه می‌شه و دقیقن مثل یه آرایه به اندیس بعدی یا عضو بعدی که از همون نوع داده هست اشاره می‌کنه موفق باشید.
آقاي سليماني عزيز شما داريد به دوستمان محبت ميكنيد البته شايد جسارت باشد ولي مطالب ارسالي شما اشتباه بوده و احتياج هست كه يه مطالعه اي در اين مورد داشته باشيد.
اولا اينكه اضافه كردن يك واحد به آدرس هر اشاره گر به ايندكس بعدي اشاره ندارد بلكه به بايت بعدي اشاره ميكند
ثانيا به آدرس هر متغييري نمي تواند عدد افزود همانطور كه تاپيك قبلي نحوه اين كار توضيح داده شد.

m.soleimani
پنج شنبه 28 آبان 1388, 15:02 عصر
آقاي سليماني عزيز شما داريد به دوستمان محبت ميكنيد البته شايد جسارت باشد ولي مطالب ارسالي شما اشتباه بوده و احتياج هست كه يه مطالعه اي در اين مورد داشته باشيد.
اولا اينكه اضافه كردن يك واحد به آدرس هر اشاره گر به ايندكس بعدي اشاره ندارد بلكه به بايت بعدي اشاره ميكند
ثانيا به آدرس هر متغييري نمي تواند عدد افزود همانطور كه تاپيك قبلي نحوه اين كار توضيح داده شد.
موضوع بد توضیح دادن بود که خودم هم می‌دونستم خوب توضیح نمی‌دم؛ دنبال کلمات بهتر بودم!. در مورد ایندکس و بایت فقط می‌خواستم قابل تجسم‌تر بشه براش, وقتی بزنی p++ این یعنی این‌که به مقدار نوعی که اشاره‌گر داره بهش اشاره می‌کنه به آدرس فعلی اضافه می‌شه و مثل یه دنباله. در ضمن اگر شما به نیت موضوع مطلع هستی توضیحات ناقص بنده را به صورتی تکمیل کن که شخص سوال کننده بتونه به سادگی متوجه منظور ما بشه چون اگر به صورت جملات و توضیحات کتاب‌ها می‌تونستن به جواب برسن مطمنن به این‌جا سر نمی‌زدن و تا الان به پاسخ خودشون رسیده بودن. ممنون از موضوعی که گوش‌زد کردید سعی می‌کنم در آینده بدون ابهام‌تر پست بزنم موفق باشید.

Marjan_Bala
پنج شنبه 28 آبان 1388, 15:12 عصر
ثانيا به آدرس هر متغييري نمي تواند عدد افزود همانطور كه تاپيك قبلي نحوه اين كار توضيح داده شد.
ببخشید منظورتون از تاپیک قبلی کدوم تاپیکه؟میشه لینکشو بذارید بی زحمت.

a.gh.n
پنج شنبه 28 آبان 1388, 15:59 عصر
[/FONT][/SIZE]

ممنون از جوابتون ، من فکر میکردم برا نوع داده int دو بایت در نظر میگیره،این که کامپایلر برای هر نوع داده ای چند بایت فضا در نظر بگیره به سیستم ارتباط داره؟ منظورتون از سیستم همون زبانیه که باهاش کار میکنم دیگه ؟یعنی اینکه متغیر نوع int در زبان ++c همیشه 4 بایت فضا میگیره.




اسم آرایه خودش یه اشاره گره دیگه ، با این حساب باید تو بدنه for بنویسم ;++a
ولی ارور میده میگه:Error 1 error C2105: '++' needs l-value
فکر کنم تو #c میشد بگیم a.next (یه چیزی تو همین مایه ها!)
اسم آرایه مشابه یک اشاره‌گر هست ولی یه اشاره‌گر ثابت! پس نمی‌نونی از ptr++ اینجا استفاده کنی وقتی ptr اسم آرایه هست. کامپایلر خطا خواهد گرفت. می‌تونی اون اشاره‌گر رو بریزی تو یه اشاره‌گر دیگه که ثابت نیست.
ببین در کل آرایه‌ها و اشاره‌گرها دو چیز کاملا متفاوت هستند. نه آرایه اشاره‌گر هست نه اشاره‌گر آرایه هست. فقط این دو تا می‌تونن در شرایط زیادی به هم تبدیل بشن.
حالا برای دسترسی به عناصر کمی سطح پایین فکر می‌کنیم: وقتی بخوایم محتویات چند تا خونه رو بخونیم باید بدونیم دقیقا محتویات چند تا خونه رو می‌خوایم بخونیم. این جواب سواله.
جناب tdkhakpur (http://barnamenevis.org/forum/member.php?u=99732) کد مناسب سوال شما رو گذشتن. این کد درست کار می‌کنه چون در آرایه سایز ثابتی داره. وقتی هم sizeof به اون اعمال می‌شه فضای مصرفی رو که زمان compile مشخص هست، بر می‌گردونه.
راه‌حل‌های دیگه توسط اشاره‌گر مبتنی بر این نکته هست که تا آمدن مقدار خاصی، مقادیر قبلی رو جزو مجموعه در نظر می‌گیرن. مثلا برای string به صورت اشاره‌گر به کاراکتر دقیقا همین اتفاق می‌افته. مقداری که با کاراکتر اشتباه گرفته نشه به عنوان قراول به حساب میاد و این نشون دهنده‌ی خانمه‌ی اشاره‌گر/آرایه هست. توسعه‌دهندگان C از این تدبیر استفاده می‌کنند و یه عنصر رو با '\0' مشخص می کنند و بهش می‌گن NULL. حالا کلی تابع می‌سازن که NULL درش نقش اساسی داره. مثلا تابعی برای طول string که تنها پوزیشن این براش مهمه.
راه‌حل‌هایی که دوستان ارایه می‌دن مثل افزایش مقدار اشاره‌گر تنها درصورتی کارساز خواهد بود که به قراول برسیم. وگرنه یک اشاره‌گر می‌تونه بارها و بارها اضافه بشه بدون اینکه مشکلی براش پیش بیاد.

Marjan_Bala
پنج شنبه 28 آبان 1388, 16:58 عصر
می‌تونی اون اشاره‌گر رو بریزی تو یه اشاره‌گر دیگه که ثابت نیست.



آره؛خودمم به همین نتیجه رسیدم فقط مشکل اینه که این حلقه تموم نمیشه ؛ حالا مسئله اینه که شرط پایان حلقرو باید چی بذارم ، این برنامه ای که گذاشتم عناصر آرایرو چاپ میکنه ولی بعد از اینکه عناصر آرایه تموم شدن شروع میکنه به اعداد چاپ کردن اعداد بی معنی(مقادیری که متغیرc به اونا اشاره میکنه):



void main()
{
int a[] = {1,2,3,4,5};
int* c;
c=a;
while(!(*c==NULL))
{
cout<<*c;
C++‎;
}

}



وقتی بخوایم محتویات چند تا خونه رو بخونیم باید بدونیم دقیقا محتویات چند تا خونه رو می‌خوایم بخونیم. این جواب سواله.

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

tdkhakpur
پنج شنبه 28 آبان 1388, 19:35 عصر
خب من گفتم فرض کنید نمیدونیم دیگه ، خیلی از مواقع پیش میاد که ما نمیدونیم قراره چندتا خونرو از کاربر بگیریم یا چند تا خونرو باید چاپ کنیم ،اونوقت باید اشاره گرا استفاده کنیم دیگه
خب كامپيوتر كه علم غيب نداره بالخره با هر ترفندي كه شده اين عمل را بايد مشخص كرد شما در فوق عمل بررسي NULL را مورد استفاده قرار داديد كه اين هم به نوبه خودش ترفندي براي اين كار هست ولي همانطور كه شما هم اطلاع داريد اشتباهه پس همان sizeof بهترين گزينه براي اين كاره.


int a[] ={1, 2, 3, 4, 5};
in count;
count = sizeof(a)/sizeof(int);
while(--count>=0)
{
// عمليات مربوطه
}

البته راه هاي ديگري هم هست فكر كنم اين بهترين راه براي اين كار باشد.

Marjan_Bala
پنج شنبه 28 آبان 1388, 21:33 عصر
خب كامپيوتر كه علم غيب نداره بالخره با هر ترفندي كه شده اين عمل را بايد مشخص كرد شما در فوق عمل بررسي NULL را مورد استفاده قرار داديد كه اين هم به نوبه خودش ترفندي براي اين كار هست ولي همانطور كه شما هم اطلاع داريد اشتباهه
بله همانطور که شما گفتید NULL جواب نمیده ، حالا میشه بگید چه شرطی باید بزارم تا درست شه؟(فکر کنید sizeof اصلا وجود نداره یا به هر دلیلی مجاز به استفاده از اون نیستیم اون موقع این برنامرو چجوری مینوشتید؟)


البته راه هاي ديگري هم هست فكر كنم اين بهترين راه براي اين كار باشد.
اگه ممکنه یکی از اون راههارو بگید،ممنون.

Ceytar
پنج شنبه 28 آبان 1388, 23:13 عصر
شاید بدردت بخوره :

#include <iostream>
#include <conio.h>

template<typename T, int size>
int GetArrLength(T(&)[size]){return size;}

void main(){
int arr[17];
int arrSize = GetArrLength(arr);
std::cout<<arrSize;
getche();
}

queen-mm
پنج شنبه 28 آبان 1388, 23:44 عصر
سلام.من وقتي اين سوالتون رو ديدم رفتم و جزوم رو نيگا كردم.دقيقا يه همچين مثالي رو استادمون بهمون گفته بود.وقتي اون موقع كامپايل كردم جواب نداد.الان هم كه كامپايل كردم جواب نداد.اول خواستم نگم ولي حالا مي گم لااقل يه چيزي دستگيرمون مي شه:
استادمون گفته بودبراي اينكه آرايه اي از كاراكتر يا عدد رو وقتي مي خواين تا جاي بخصوصي دريافت يا چاپ كنين از دستور cin.getline(a) استفاده كنين.و براي چاپ cout.putline(a) .كه تا جايي كه null نيست چاپ مي كنه.ولي راستش من هنوزم كه هنوزه نمي دونم اين كد هدرش چيه؟كاربردش چه جوريه؟گفتم اينجا بپرسم شايد كسي چيزي بدونه؟

tdkhakpur
جمعه 29 آبان 1388, 00:16 صبح
بله همانطور که شما گفتید NULL جواب نمیده ، حالا میشه بگید چه شرطی باید بزارم تا درست شه؟(فکر کنید sizeof اصلا وجود نداره یا به هر دلیلی مجاز به استفاده از اون نیستیم اون موقع این برنامرو چجوری مینوشتید؟)

اگه ممکنه یکی از اون راههارو بگید،ممنون.
ببينيد من چه مثالي بزنم وقتي شما جلوي راهها را بستيد.اگر شرايط درخواست شما به اين شكل باشد راهي وجود ندارد.

a.gh.n
شنبه 30 آبان 1388, 13:15 عصر
آره؛خودمم به همین نتیجه رسیدم فقط مشکل اینه که این حلقه تموم نمیشه ؛ حالا مسئله اینه که شرط پایان حلقرو باید چی بذارم ، این برنامه ای که گذاشتم عناصر آرایرو چاپ میکنه ولی بعد از اینکه عناصر آرایه تموم شدن شروع میکنه به اعداد چاپ کردن اعداد بی معنی(مقادیری که متغیرc به اونا اشاره میکنه):



void main()
{
int a[] = {1,2,3,4,5};
int* c;
c=a;
while(!(*c==NULL))
{
cout<<*c;
C++‎;
}

}



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

a.gh.n
شنبه 30 آبان 1388, 13:28 عصر
سلام.من وقتي اين سوالتون رو ديدم رفتم و جزوم رو نيگا كردم.دقيقا يه همچين مثالي رو استادمون بهمون گفته بود.وقتي اون موقع كامپايل كردم جواب نداد.الان هم كه كامپايل كردم جواب نداد.اول خواستم نگم ولي حالا مي گم لااقل يه چيزي دستگيرمون مي شه:
استادمون گفته بودبراي اينكه آرايه اي از كاراكتر يا عدد رو وقتي مي خواين تا جاي بخصوصي دريافت يا چاپ كنين از دستور cin.getline(a) استفاده كنين.و براي چاپ cout.putline(a) .كه تا جايي كه null نيست چاپ مي كنه.ولي راستش من هنوزم كه هنوزه نمي دونم اين كد هدرش چيه؟كاربردش چه جوريه؟گفتم اينجا بپرسم شايد كسي چيزي بدونه؟
توابع از iostream هستند. ولی چه ارتباطی داشت به این مساله؟ همونطور که گفتیم اشاره‌گرهای به کارکتر بعد از انتساب به طور خودکار با null پر می‌شن. توابع زیادی هم برای این کار نوشتن که فقط با null سر و کار دارن. مساله اینجا چیز دیگه‌ای هست... این null نداریم.

Marjan_Bala
شنبه 30 آبان 1388, 15:25 عصر
توابع از iostream هستند. ولی چه ارتباطی داشت به این مساله؟ همونطور که گفتیم اشاره‌گرهای به کارکتر بعد از انتساب به طور خودکار با null پر می‌شن. توابع زیادی هم برای این کار نوشتن که فقط با null سر و کار دارن. مساله اینجا چیز دیگه‌ای هست... این null نداریم.
پس یعنی این برنامرو نمیشه با اشاره گرا نوشت دیگه ، درسته؟
تنها راه نوشتن این برنامه همون استفاده از sizeof هست و راه دیگه ای نداره؟!

queen-mm
شنبه 30 آبان 1388, 17:22 عصر
توابع از iostream هستند. ولی چه ارتباطی داشت به این مساله؟ همونطور که گفتیم اشاره‌گرهای به کارکتر بعد از انتساب به طور خودکار با null پر می‌شن. توابع زیادی هم برای این کار نوشتن که فقط با null سر و کار دارن. مساله اینجا چیز دیگه‌ای هست... این null نداریم.
ربطش اين بود كه بدون اينكه بدوني آرايه اندازش چقدره مي تونه تا جايي كه null هست چاپ كنه.اگه سر در نميارين مجبور به پاسخ گويي نبودين البته با عرض معذرت:لبخند:

a.gh.n
شنبه 30 آبان 1388, 18:01 عصر
پس یعنی این برنامرو نمیشه با اشاره گرا نوشت دیگه ، درسته؟
تنها راه نوشتن این برنامه همون استفاده از sizeof هست و راه دیگه ای نداره؟!
همین‌طور فکر می‌کنم. تنها راه دیگه که به ذهنم می‌رسه همون استفاده از یک مقدار خاص هست که تو آرایه نباشه. احتمالا این منظورتون نیست.

ربطش اين بود كه بدون اينكه بدوني آرايه اندازش چقدره مي تونه تا جايي كه null هست چاپ كنه.اگه سر در نميارين مجبور به پاسخ گويي نبودين البته با عرض معذرت:لبخند:
چندین بار تو همین تاپیک گفته شد استرینگ‌های مدل C (اشاره‌گر به کاراکتر) از چه سیستمی استفاده می‌کنن و این قابل تعمیم به آرایه از اعداد صحیح نیست... دقیقا کاراکتر null اونجا کار نشانگر سایز رو انجام می‌ده... توضیحات کامل تو همین تاپیک هست.
خواهش می‌کنم. فکر کردم می‌تونم کمک کنم.