نمایش نتایج 1 تا 14 از 14

نام تاپیک: ساخت آرایه داینامیک دو بعدی

  1. #1
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486

    ساخت آرایه داینامیک دو بعدی

    من تو یه سایت دیدم که برای ساخت آرایه داینامیک دو بعدی یه کدی رو به این شکل گذاشته بود

    void main()
    {
    int n;
    cout<<"enter your rows:";
    cin>>n;
    int **a=new int *[n];
    for(int i=1;i<=n;i++)
    a[i-1]=new int[i];
    }

    ولی من درست نفهمیدم که این چه جوری یه ارایه دو بعدی می سازه در واقع مشکل من سر این حلقه for هست که چه جوری بعد دوم رو به وجود میاره

    for(int i=1;i<=n;i++)
    a[i-1]=new int[i];

    مثلا اگه من بخوام یه آرایه 3*3 به وجود بیارم تو این حلقه for برای i=1 به خونه a[0] یه خونه حافظه اختصاص میده ولی نمیدونم چه جوری مثل 3*3 آرایه به وجود میاد اگه کسی میدونه لطف کنه بگه

  2. #2
    مثلا اگه من بخوام یه آرایه 3*3 به وجود بیارم تو این حلقه for برای i=1 به خونه a[0] یه خونه حافظه اختصاص میده ولی نمیدونم چه جوری مثل 3*3 آرایه به وجود میاد اگه کسی میدونه لطف کنه بگه
    int **a=new int *[3];
    for(int i=0;i<3;i++)
    a[i]=new int[3];

  3. #3
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    به ضاهر باید همین جوری که شما مگین باشه ولی جواب نمیده اون کدی که نوشتین میاد یه ارایه 9*3 میسازه نه 3*3

  4. #4
    نقل قول نوشته شده توسط emad_67 مشاهده تاپیک
    به ضاهر باید همین جوری که شما مگین باشه ولی جواب نمیده اون کدی که نوشتین میاد یه ارایه 9*3 میسازه نه 3*3
    نه، کد آرایه 3*3 میسازه. برای 3 سطر و 9 ستون اینجوری میشه:
    int **a=new int *[3];
    for(int i=0;i<3;i++)
    a[i]=new int[9];

    حالا چیش جواب نمیده؟! با هر خونه که کار داشتی، مثل آرایه معمولی فراخونی کن:
    a[x][y]


    فقط حواست باشه که وقتی خودت new میکنی، delete هم یادت نره!

  5. #5
    کاربر دائمی
    تاریخ عضویت
    شهریور 1385
    محل زندگی
    تهران
    پست
    117
    نقل قول نوشته شده توسط emad_67 مشاهده تاپیک
    من تو یه سایت دیدم که برای ساخت آرایه داینامیک دو بعدی یه کدی رو به این شکل گذاشته بود

    void main()
    {
    int n;
    cout<<"enter your rows:";
    cin>>n;
    int **a=new int *[n];
    for(int i=1;i<=n;i++)
    a[i-1]=new int[i];
    }

    ولی من درست نفهمیدم که این چه جوری یه ارایه دو بعدی می سازه در واقع مشکل من سر این حلقه for هست که چه جوری بعد دوم رو به وجود میاره

    for(int i=1;i<=n;i++)
    a[i-1]=new int[i];

    مثلا اگه من بخوام یه آرایه 3*3 به وجود بیارم تو این حلقه for برای i=1 به خونه a[0] یه خونه حافظه اختصاص میده ولی نمیدونم چه جوری مثل 3*3 آرایه به وجود میاد اگه کسی میدونه لطف کنه بگه
    سلام
    این کد میاد یه آرایه 2 بعدی درست میکنه اما نه بصورت منظم یعنی تعداد به صورت n*m نیست. سطر اول (صفرم) 1 ستون داره. سطر دوم 2 ستون الی آخر.
    به نظر من کد آقای someCoder درست بود.

  6. #6
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    بازم میگم اون کدی که گفتیم 9*3 میده شما ای کد رو اجرا کنید متوجه میشید

    #include<iostream.h>
    #include<stdlib.h>
    #include<conio.h>
    void main()
    {
    int i;
    int **a=new int *[3];
    for(i=0;i<3;i++)
    a[i]=new int[3];
    for(i=0;i<3;i++)
    for(int j=0;j<9;j++)
    a[i][j]=rand()%10;
    for(i=0;i<3;i++)
    for(int j=0;j<9;j++)
    {
    cout<<a[i][j]<<" ";
    if(j==8)
    cout<<endl;
    }
    getch();
    }


  7. #7
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    سلام
    این کد میاد یه آرایه 2 بعدی درست میکنه اما نه بصورت منظم یعنی تعداد به صورت n*m نیست. سطر اول (صفرم) 1 ستون داره. سطر دوم 2 ستون الی آخر.
    به نظر من کد آقای someCoder درست بود.
    منم برام جای تعجب داره ولی کاملا مرتب ستون ها رو میچینه

  8. #8
    بازم میگم اون کدی که گفتیم 9*3 میده شما ای کد رو اجرا کنید متوجه میشید
    الان این کد که نوشتی، نشون میده که یک آرایه 3*3 تعریف شده و از حد آرایه بیشتر استفاده کردی و عملا یک کد اشتباه (از نظر منطقی) نوشتی و داری با آدرسهایی که تخصیص داده نشده کار میکنی. اینو فراموش نکن که حد آرایه ها در c چک نمیشه و خود برنامه نویس باید مراقب حدود آرایه باشه.
    این مثال رو اجرا کن تا بفهمی قضیه چیه.
    	int a[3][3], i, j;
    for(i=0;i<9;i++){
    a[0][i]=i;
    }

    for(i=0;i<3;i++){
    for(j=0;j<3;j++){
    cout<<a[i][j]<<" ";
    }
    cout<<endl;
    }


    ضمنا، اینجا رو بخون: http://en.wikipedia.org/wiki/Array#M...nsional_arrays

  9. #9
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    الان این کد که نوشتی، نشون میده که یک آرایه 3*3 تعریف شده و از حد آرایه بیشتر استفاده کردی و عملا یک کد اشتباه (از نظر منطقی) نوشتی و داری با آدرسهایی که تخصیص داده نشده کار میکنی. اینو فراموش نکن که حد آرایه ها در c چک نمیشه و خود برنامه نویس باید مراقب حدود آرایه باشه.
    این مثال رو اجرا کن تا بفهمی قضیه چیه.
    خوب اینو من میدونم ولی اگه تخصیص حافظه نشده بود که ارور زمان اجرا پیش میومد و اصلا اون خونه ها مقذار نمی گرفتن چون مثلا اگه تو حلقه for مقدار j رو به 10 تغییر بدیم اون وقت ارور میده در زمان اجرا
    در مورد این مثالتون هم خوب کامپایلر میاد با یه ارایه دو بعدی مثل یه بعدی رفتار میکنه ولی تو این مثال من قضیه فرق میکنه
    ضمنا اگه اون مثالی که من در اولین پست گذاشتم غلطه پس چرا دقیقا درست جواب میده

  10. #10
    اگه تخصیص حافظه نشده بود که ارور زمان اجرا پیش میومد
    نه الزاما
    اصلا اون خونه ها مقذار نمی گرفتن
    چرا میگیرن. یه جایی مقدار میگیره که مال تو نیست!
    مثلا اگه تو حلقه for مقدار j رو به 10 تغییر بدیم اون وقت ارور میده در زمان اجرا
    همین الان هم اگر کدت رو تو NET 2005. اجرا کنی، با همین 9 بهت خطا میده.
    ضمنا اگه اون مثالی که من در اولین پست گذاشتم غلطه پس چرا دقیقا درست جواب میده
    اون مثال یه چیز دیگه است، اینی که تو میپرسی یه چیز دیگه و من نگفتم اون غلطه.

    در مورد این مثالتون هم خوب کامپایلر میاد با یه ارایه دو بعدی مثل یه بعدی رفتار میکنه ولی تو این مثال من قضیه فرق میکنه
    بذار برات یه مثال دیگه بزنم تا مشکلت حل بشه:
    	int a[10], b[10], i;
    for(i=0;i<20;i++){
    a[i]=i;
    }

    for(i=0;i<20;i++){
    cout<<a[i]<<" ";
    }

  11. #11
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    بذار برات یه مثال دیگه بزنم تا مشکلت حل بشه:
    من مثالتونو کامپایل کردم ولیاجرا نشد طبیعی هم هست چون وقتی یه ارایه رو به صورت staticبهش حافظه میدیم مشکلی پیش نمیاد مشکل برا زمانی هست که صورت dynamic حافظه میگیره
    مثلا وقتی این جوری نوشتم

    void main()
    {
    int i;
    int *a=new int[2];
    for(i=0;i<5;i++){
    a[i]=i;
    }
    for(i=0;i<5;i++)
    {
    cout<<a[i]<<" ";
    }
    }

    باز هم همون مشکل پبش میاد می خوام بدونم کامپایلر با ارایه های dynamic چه حوری رفتار میکنه که این مشکل پیش میادش مثلا تو این مثال من اشاره گر رو با دو تا خونه تخصیص حافظه کردم ولی تا 5 تا عدد هم قبول میکنه

  12. #12
    خوب، خدا رو شکر که بالاخره فهمیدی ارور ندادن کامپایلر دلیل درست بودن کد نیست ضمن اینکه همین الان کدی که برای تو درست کار میکنه، تو کامپایلر من runtime error میده.
    کامپایلر عملا چیزی به نام آرایه داینامیک نمیشناسه! تو وقتی مینویسی:
    a[i]
    عملا کامپایلر فرض میکنه آرایه ای داریم که از آدرس a شروع شده و خونه شماره i رو تو لازم داری. پس کد تو تبدیل به این میشه:
    a[i] ==> *(a+i)
    و کامپایلر هیچ کنترل دیگه ای روی کد تو نداره. حالا ممکنه این آدرس وقتی غلط هست، خطای زمان اجرا بگیری و ممکنه نگیری! در هر صورت مسوولیت کنترل آدرس ها با خودته.
    برای اینکه ماجرای تبدیل کد کامپایلر رو ببینی، یه کار جالب میشه کرد، کدت رو اینجوری بنویس و ببین چی میشه:
    void main()
    {
    int i;
    int *a=new int[2];
    for(i=0;i<2;i++){
    i[a]=i;
    }
    for(i=0;i<2;i++)
    {
    cout<<i[a]<<" ";
    }
    }

  13. #13
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    خیلی ممنون از جوابتون
    حالا یه سوال در مورد همین runtime error در واقع وقتی کامپایلر میاد با ارایه به این صورت رفتار میکنه
    a[i] ==> *(a+i)
    پس عملا نباید هیچ وقت به run time error بر خورد کنیم مثلا تو همین برنامه ای که گذاشتم من وقتی اونو به این صورت مینویسم

    void main()
    {
    int i;
    int *a=new int[2];
    for(i=0;i<10;i++)
    a[i]=i;
    for(i=0;i<10;i++)
    cout<<a[i]<<" ";
    }

    این دفعه عدد ها رو چاپ میکنه و بعد یه error میده فقط تو این مثال من 5 رو به 10 تبدیل کردم که منطقا نباید اروری پیش بیاد ایا برای این هم میشه دلیلی اوورد یا مشکل کامپایلره؟
    ضمنا در مورد اون کدتونم ممنون جالب بود

  14. #14
    کاربر دائمی
    تاریخ عضویت
    شهریور 1385
    محل زندگی
    تهران
    پست
    117
    علت ارور اینکه جایی رو دستکاری کردی که برای کاری در نظر گرفته شده مثلا قسمتی از استک که ادرس برگشت تو اون push شده، که این قسمت تو حالت قبل دستکاری نمیشد.
    به جرات میتونم بگم بالای 50 درصد باگ ها و ارور های برنامه هایی که تو سی نوشته میشه مربوط به همین بیرون زدن از محدوده آرایه هاست.

قوانین ایجاد تاپیک در تالار

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