اطلاعیه

Collapse
No announcement yet.

سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)

    سلام
    آیا کسی میدونه چطوری میشه به آدرس اولین رشته از آرایه دو بعدی زیر با استفاده از اشاره گر دسترسی پیدا کرد؟
    کد:
    flash char String [3] [10] = {"1234567891","abcdefghij","0987654321"};

    اشاره گر رو اینجوری تعریف کردم:
    کد:
    flash char *Ptr;
    آیا این روش درسته؟
    کد:
    Ptr = & String [0] [0]
    :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:
    فکر آن باشد که بگشاید رهی

    #2
    پاسخ : سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)

    روشتون درسته اما احتمالا مشکل پیدا میکنین چون یک رشته 10 بایتی بایستی آخرین بایتش 0\ باشه بنابراین شما نبایستی با تعریف طول 10 برای بعد دوم بخوایین رشته abcdefghij رو که طولی برابر با 10 رو داره توی این آرایه قرار بدین. بعد دوم رو بکنین: طول مد نظرتون + 1

    دیدگاه


      #3
      پاسخ : سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)

      نکته ای که شما به اون اشاره کردید کاملا درسته. یه واحد از هر عبارت کم کردم.
      سئوال بعدی من اینه که اگه بخوام با استفاده از اشاره گر به آدرس هر عبارت دسترسی پیدا کنم اونوقت باید چیکار کنم؟
      مثلا من می خوام آدرس شروع عبارت دوم رو به یه تابع بفرستم.
      روش عادی برای دسترسی به آدرس عبارت دوم باید این باشه:
      کد:
      Ptr = & String [1][0]

      اما معادل کد بالا با استفاده از اشاره گر با کد زیر جواب نمیده :
      کد:
      Ptr+1
      یعنی من انتظار دارم وقتی آدرس عبارت اول رو پیدا کردم و اونو توی اشاره گر قرار دادم با یک واحد اضافه کردن به اشاره گر به آدرس عبارت بعدی دسترسی پیدا کنم.این مسئله وقتی طول عبارت ها یکسان نباشه منطقی به نظر میرسه.
      چون ما انتظار داریم کمپایلر آدرس عبارت بعدی رو بصورت خودکار محاسبه کنه.
      اما یه جای کار مشکل داره.
      دوستانی که اطلاعاتی دارن کمک کنند. ممنون :read: :read: :read:
      فکر آن باشد که بگشاید رهی

      دیدگاه


        #4
        پاسخ : سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)

        وقتی Ptr معادل آدرس شروع رشته "abcdef" باشه؛ مقدار Ptr+1 آدرس شروع کاراکتر b در اون رشته هست. اگر بخوایین از Ptr برای محاسبه آدرس رشته بعدی استفاده کنین باید خودتون طول بعد دوم رو به Ptr اضافه کنین. چون در اصل آرایه شما به صورت زیر ذخیره شده:

        "123456789 \0 abcdefghi \0 098765432 \0"


        (البته جاهای خالی رو برای خوانایی اضافه کردم.)
        و مشکل هم اینجاست که شما اشاره گر به کاراکتر دارین. نه اشاره گر به آرایه کاراکتری.

        دیدگاه


          #5
          پاسخ : سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)

          یعنی واقعا تنها راه حل اینه که برنامه نویس باید خودش محل قرارگیری عبارت ها (رشته ها) رو محاسبه کنه؟
          این روش وقتی طول رشته ها برابر باشن کار تقریبا راحتیه. ولی وقتی طول رشته ها متفاوت باشن موضوع دیگه به این راحتی ها هم نخواهد بود!
          فکر کنم باید یه راه حلی وجود داشته باشه.
          تو کتاب C آقای جعفرنژاد قمی (فصل ششم صفحه 166) اشاره کوچیکی به این موضوع شده ولی خوب توضیح داده نشده.
          فکر آن باشد که بگشاید رهی

          دیدگاه


            #6
            پاسخ : سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)

            مشکل اینجاست که اگه بخوای از آدرس یک المان برای پیدا کردن آدرس المان دیگه ای در آرایه حاوی اون المان برسی باید نگاه سطح بالاتری داشته باشی. بقولی میگن میخوای از جزء به کل برسی.و اینجا این نشدنیه. مگه اینکه همیشه کل همراهت باشه. یا دسترسی به کل داشته باشی. مثلا:


            flash char *list[]={"aaaaa","bb","cccccc&qu ot;};


            در اینجا مادامی که با list کار میکنی میتونی به اجزائش دسترسی داشته باشی. مثلا list[0] و غیره. ولی با داشتن یک عنصر مثل list[0] نمیشه به کل آرایه list دسترسی داشت. مواظب باش اینجور جاها چیزی که به چشم میبینی گولت نزنه.

            دیدگاه


              #7
              پاسخ : سئوال در باره اشاره گر به آرایه های دو &#157

              نوشته اصلی توسط reza_agha
              مشکل اینجاست که اگه بخوای از آدرس یک المان برای پیدا کردن آدرس المان دیگه ای در آرایه حاوی اون المان برسی باید نگاه سطح بالاتری داشته باشی. بقولی میگن میخوای از جزء به کل برسی.و اینجا این نشدنیه. مگه اینکه همیشه کل همراهت باشه. یا دسترسی به کل داشته باشی. مثلا:


              flash char *list[]={"aaaaa","bb","cccccc&qu ot;};


              در اینجا مادامی که با list کار میکنی میتونی به اجزائش دسترسی داشته باشی. مثلا list[0] و غیره. ولی با داشتن یک عنصر مثل list[0] نمیشه به کل آرایه list دسترسی داشت. مواظب باش اینجور جاها چیزی که به چشم میبینی گولت نزنه.
              دوست عزیز،
              به نظر من از جزء به کل رسیدن اینجا مفهومی نداره توی بحث ساختمان داده و همچنین طراحی الگوریتمها مساله انجام دادن کار با کمترین زمان ممکن و بهترین پاسخ هست.
              جواب سوال ایشون خیلی راحت هست و نیازی به تعمق فراوان یا کلی اندیشی نداره و اون هم استفاده از لیستهای پیوندی هست.
              ایشون میخوان با اضافه کردن اشاره گر به جای اینکه به کاراکتر بعدی و آدرس اون دسترسی داشته باشن میخوان به عنصر بعدی آرایه دسترسی داشته باشن که لسیتهای پیوندی این کار رو به راحتی انجام میده.
              تنها کافیه که یه structure از همون نوع آرایه ای از کاراکترها(رشته ها) ایجاد کنن و یه حافظه ی رو به اون اختصاص بدن و از نوع اشاره گر قرار بدن، و بعد از اون هم خیلی راحت هست و اون اینکه یه لینک در structure خودشون قرار یدن بعد برای حرکت در لیست خودشون به لینک بعدی اشاره کنن.
              مانند شکل زیر:

              دیدگاه


                #8
                پاسخ : سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)

                دقیقا! ولی ممکنه این مشکل رو حل کنین که چطوری میتونن حتی با استفاده از لیست های پیوندی و بدون دسترسی به خود لیست و تنها دسترسی به رشته داخل گره (اینجا هم دسترسی به یک رشته صورت گرفته و دسترسی به کل آرایه نیست) به رشته های دیگه در گره های دیگه دسترسی پیدا کرد؟
                چون شما اینجا وقتی با یک گره کار میکنین هنوز ارتباطتون رو با لیست قطع نکردین.
                غیر از این مشکلی که طرح کردن استفاده از یک آرایه دو بعدی بود. لیست های پیوندی در تئوری جواب میده ولی لیست های پیوندی بیشتر عناصر زمان اجرا هستن نه عناصر زمان کامپایل.

                دیدگاه


                  #9
                  پاسخ : سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)

                  نوشته اصلی توسط reza_agha
                  دقیقا! ولی ممکنه این مشکل رو حل کنین که چطوری میتونن حتی با استفاده از لیست های پیوندی و بدون دسترسی به خود لیست و تنها دسترسی به رشته داخل گره (اینجا هم دسترسی به یک رشته صورت گرفته و دسترسی به کل آرایه نیست) به رشته های دیگه در گره های دیگه دسترسی پیدا کرد؟
                  چون شما اینجا وقتی با یک گره کار میکنین هنوز ارتباطتون رو با لیست قطع نکردین.
                  غیر از این مشکلی که طرح کردن استفاده از یک آرایه دو بعدی بود. لیست های پیوندی در تئوری جواب میده ولی لیست های پیوندی بیشتر عناصر زمان اجرا هستن نه عناصر زمان کامپایل.
                  دسترسی به گره های بعدی خیلی راحت هست تنها کافیه اشاره گر رو جرکت داد تا به گره بعدی دسترسی داشته باشه.
                  ایشون نیازی به دسترسی به کل آرایه نداره فقط میخوان به رشته ها دسترسی داشته باشن.
                  "چون شما اینجا وقتی با یک گره کار میکنین هنوز ارتباطتون رو با لیست قطع نکردین" من منظورتون رو متوجه نشدم ، وقتی Ptr به گره فعلی اشاره میکنه 100 درصد نمیتونه به گره بعدی اشاره داشته باشه و همونظور که قبلا گفتم کافیه اشاره گر رو حرکت داد.
                  ایشون برای این خاطر آرایه دو بعدی تعریف کردن که بتونن آرایه ای از رشته ها رو داشته باشن اما با لیست پیوندی و تعریف constructor همینکار رو میشه به راحتی انجام داد.
                  اگه لیست پیوندی در تئوری صورت میگرفت الگوریتمهایی همچون الگوریتم هافمن ، دایجسترا ، min heap ، max heap و... رو نداشتیم.

                  دیدگاه


                    #10
                    پاسخ : سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)

                    وقتی Ptr به گره فعلی اشاره میکنه 100 درصد نمیتونه به گره بعدی اشاره داشته باشه و همونظور که قبلا گفتم کافیه اشاره گر رو حرکت داد.
                    مجموعه قوانین:

                    1- ما که با هم دعوا نداریم!
                    2- Ptr شما به یک گره اشاره میکنه و نه یک رشته داخل گره. بنا براین دید شما در این سطح یک دید بالاتر هست نسبت به اینکه Ptr به یک رشته اشاره کنه. پس حرف من هنوز درسته!!!
                    3- با اینکه راه حل شما بطور کلی درست هست ولی اینجا متاسفانه (برای شما) و خوشبختانه (برای من!!) بحث فقط روی استفاده از یک آرایه هست.

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

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


                    لیست های پیوندی بیشتر عناصر زمان اجرا هستن نه عناصر زمان کامپایل.
                    باز هم عرض میکنم حرف شما درسته اما روی میکرو با حجم حافظه پایین معمولا این تیپ پیاده سازی ها یه کمی اتلاف حافظه یا تا حدودی اتلاف وقته. چون میشه بصورت static هم پیاده سازیش کرد. ولی همون پیاده سازیش هم دردسر داره.

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

                    5- (قانون پنجم) من بیش از این به عقلم چیزی نمیرسه. شرمنده. :redface:

                    دیدگاه


                      #11
                      پاسخ : سئوال در باره اشاره گر به آرایه های دو بعدی (رشته ای)

                      reza_agha و vahid.ch عزیز !
                      از توجهی که به این بحث کردید ممنونم. راستش من دارم روی پروژه ای کار میکنم که در اون حدود 50 آرایه دوبعدی وجود داره و هر آرایه هم شامل 64 رشته با ابعاد 10 کاراکتر هست.
                      با پیشنهادی که reza_agha عزیز داد و با توجه به اینکه طول هر رشته 10 کاراکتر بوده و ثابت هست من آدرس ابتدای هر آرایه رو بدست اوردم و باز اضافه کردن به اشاره گر به صورت مضربی از 10 واحد حالا به هر رشته دسترسی دارم.
                      من اطلاعات چندانی از لیست های پیوندی ندارم ولی مطمئنم با توجه به بحث زیبایی که دوست خوبمون vahid.ch مطرح کرده حتما راهی برای دسترسی به آرایه هایی که طول رشته های اون مساوی نیست وجود داره.
                      بخاطر اینکه این پروژه سرم رو خیلی شلوغ کرده و همچنین اطلاعات کمی که در باره لیست های پیوندی دارم از این بحث فعلا خارج می شم . امیدوارم بزودی برگردم تا بتونیم این بحث رو به سرانجام برسونیم.
                      باز هم ممنون :applause: :applause: :applause: :bye :bye :bye
                      فکر آن باشد که بگشاید رهی

                      دیدگاه

                      لطفا صبر کنید...
                      X