اطلاعیه

Collapse
No announcement yet.

|!!| سوالاتی در باب آرایه ها در CV

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

    |!!| سوالاتی در باب آرایه ها در CV

    سلام دوستان
    اولین سوال در باب آرایه:
    میخوام داخل کدویژن یه آرایه 2بعدی با اندازه متغیر (اما از پیش تعیین شده) تعریف و استفاده کنم، آیا امکانش هست؟
    (مثلا فرض کنید بعد اولش 20باشه، اما بعد دومش متغیر باشه)
    وقتی آرایه تعریف میشه مثل یه ماتریس میمونه، حالا فرض کنید ماتریسی میخوام که تعداد سطرهاش ثابته، اما هر سطری تعداد متفاوتی ستون داره، مثلا همچین آرایه ای:
    سطر اول، 5تا خونه داره
    سطر دوم، 7تا
    سطر سوم،4تا
    .
    .
    .
    اگه امکان پذیره، تعریف آرایه به چه شکلیه، یه مثال بزنید لطفا
    ممنون...
    اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

    #2
    پاسخ : |!!| سوالاتی در باب آرایه ها در CV

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

    خوب شما ماکزیمم تعریف کن بعد به هر اندازه نیاز داشتی استفاده کن

    int grgsumofdays[2][13]={{0,31,59,90,120,151,181,212,243,273,304,334,365} ,{0,31,60,91,121,152,182,213,244,274,305,335,366}} ;
    انجام پروژه هاي برنامه نويسي اندرويد
    [glow=red,2,300]نرم افزار نقشه هاي پاور کامپيوتر اندوريد[/glow]
    http://cafebazaar.ir/app/?id=com.atxdroid

    دیدگاه


      #3
      پاسخ : |!!| سوالاتی در باب آرایه ها در CV

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

      int **make_array(int n_rows, int *n_cols)
      {
      int i;

      int **array = (int **)malloc(sizeof(int *) * n_rows );
      for(i=0; i<n_rows; i++)
      array[ i ] = (int * )malloc(sizeof(int) * n_cols [ i ] );
      return array;
      }


      void main(void)
      {
      static int col_len[4]={5,7,12,3};
      int **array = make_array(4, col_len);
      }


      اما مسئولیت آدرس دهی خارج از محدوده هر بعدش با خودته!
      یک همچین چیزی رو در دات نت بهش میگن Jagged Array.

      دیدگاه


        #4
        پاسخ : |!!| سوالاتی در باب آرایه ها در CV

        ممنون
        خوب شما ماکزیمم تعریف کن بعد به هر اندازه نیاز داشتی استفاده کن
        اینجوری خیلی از حافظم هدر میره
        من در اصل میخوام لیست شهرهای ایران رو داخل یه آرایه سه بعدی بریزم، تعداد حروف شهرها هم حدودا بین 4تا 25 حرف متغیر هستش و اگه من هم رو 25فرض کنم خیلی حافظه هدر میره

        اگر واقعا به هر قیمتی بخوای این کار رو بکنی شدنیه. اما باید بفرم دینامیک تخصیص داده بشه. مثلا یک چیزی مثل این: ...
        نمیدونم چرا با اشاره گر مشکل دارم، حالا بماند که این اشاره به اشاره گر هستش!! (آخه تو یه پروژه اومدم و از اشاره گر استفاده کردم،چشمتون روز بد نبینه، هرچی آرایه داشتم، حاصلش اشتباه در میومد، هرچی وررقتم نفهمیدم ایراد چی بود، اما واقعا ایرادی تو کدهام نمیدیدم، تا این که اشاره گر رو به خارج از main برنامم منتقل کردم- یعنی بردمش تو یکی از هدرهام، اینجوری مشکل کاملا مرتفع شد oo:، هنوز هم نفهمیدم چرا؟!!)

        راه ساده تری نیست؟ :redface: :rolleyes:
        اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

        دیدگاه


          #5
          پاسخ : |!!| سوالاتی در باب آرایه ها در CV

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

          دیدگاه


            #6
            پاسخ : |!!| سوالاتی در باب آرایه ها در CV

            بسی سپاس!
            مشکلم اینه آقا رضا:
            "من در اصل میخوام لیست شهرهای ایران رو داخل یه آرایه سه بعدی بریزم، تعداد حروف شهرها هم حدودا بین 4تا 25 حرف متغیر هستش و اگه من هم رو 25فرض کنم خیلی حافظه هدر میره"
            ببینید مثلا من اینو دارم:
            کد:
            unsigned char ostan[31][20]= {"آذربایجان شرقی" , "آذربایجان غربی" , "اردبیل" , "اصفهان" , "ایلام" , "بوشهر" , "تهران" , "چهارمحال بختیاری" , "خراسان جنوبی" , "خراسان رضوی" , "خراسان شمالی" , "خوزستان" , "زنجان" , "سمنان" , "سیستان و بلوچستان" , "فارس" , "قزوین" , "قم" , "کردستان" , "کرمان" , "کرمانشاه" , "کهگیلویه و بویراحمد" , "گلستان" , "گیلان" , "لرستان" , "مازندران" , "مرکزی" , "هرمزگان" , "همدان" , "یزد" };//a
            unsigned char city[31][20][20]= // city[tedad Ostan] [max tedad shahre Ostanha] [max tedad Horoofe Shahrha]
            {
            {"آذرشهر" , "ارسباران" , "اسکو" , "اهر" , "بستان آباد" , "بناب" , "تبریز" , "جلفا" , "چاراویماق" , "سراب" , "شبستر" , "عجبشیر" , "کلیبر" , "مراغه" , "مرند" , "ملکان" , "میانه" , "هریس" , "هشترود"},
            {"ارومیه" , "اشنویه" , "بوکان" , "پیرانشهر" , "تکاب" , "چالدران" , "خوی" , "سردشت" , "سلماس" , "شاهین دژ" , "ماکو" , "مهاباد" , "میاندوآب" , "نقده"},
            {"اردبیل" , "بیله سوار" , "پارس آباد" , "خلخال" , "کوثر" , "گرمی" , "مشگین شهر" , "نمین" , "نیر"},
            
            و شهرهای بقیه استانها
            (این کد نویسی سایت ما رو کشته :angry: :angry: :mrgreen
            همونطور که ملاحظه میفرمایید من در کد بالا ماکزیمم ها رو در نظر گرفتم و در نهایت آرابه خیلی حافظه اشغال میکنه در صورتی که شاید بشه حدود 30% صرفه جویی کرد اگر که اندازه ابعاد آرایه ماکزیمم در نظر گرفته نشه و اصطلاحا به صورت دینامیک تعیین بشه

            یعنی من یه جوری باید بتونم در تخصیص حافظه صرفه جویی کنم، البته این واجب نیست اما خیلی بهتره اگه بشه انجامش داد
            اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

            دیدگاه


              #7
              پاسخ : |!!| سوالاتی در باب آرایه ها در CV

              من دو تا کار بیشتر به عقل ناقصم نمیرسه!
              1- تعریف چیزی مثل این (فکر کنم قرار نباشه این آرایه در زمان اجرا تغییر کنه):

              flash unsigned char flash *ostan[31]={....};

              flash unsigned char flash *city[31][20]={{...},...};


              2- قرار دادن درون یک جدول داخلی و یا خارجی و خوندن اونها از طریق صدا کردن یک تابع.
              چون بنظر میرسه دسترسی به این اسامی برای انجام کاری هست که ذاتا تاخیر بالایی داره.

              دیدگاه


                #8
                پاسخ : |!!| سوالاتی در باب آرایه ها در CV

                نوشته اصلی توسط رضا آقازاده
                من دو تا کار بیشتر به عقل ناقصم نمیرسه!
                1- تعریف چیزی مثل این (فکر کنم قرار نباشه این آرایه در زمان اجرا تغییر کنه):

                flash unsigned char flash *ostan[31]={....};

                flash unsigned char flash *city[31][20]={{...},...};


                2- قرار دادن درون یک جدول داخلی و یا خارجی و خوندن اونها از طریق صدا کردن یک تابع.
                چون بنظر میرسه دسترسی به این اسامی برای انجام کاری هست که ذاتا تاخیر بالایی داره.
                اختیار دارید شما
                خیلی ممنون
                امتحان میکنم ببینم بالاخره چی میشه...
                اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

                دیدگاه


                  #9
                  پاسخ : |!!| سوالاتی در باب آرایه ها در CV

                  با سلام،

                  شما باید مثل این تعریف کنی :


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

                  Sh_Nourbakhsh@Yahoo.com

                  http://s2.picofile.com/file/7170362468/_Wall_e_.jp

                  دیدگاه


                    #10
                    پاسخ : |!!| سوالاتی در باب آرایه ها در CV

                    خب
                    همینطور که هم آقای نوربخش و هم آقای آقازاده گفتند من اینجوری تعریف کردم:
                    flash unsigned char *City[5][20]= ... //a
                    البته دو کدویژن نمیشه به صورت flash unsigned char flash تعریف کرد، گیر میده که:
                    Error: C:\... can't specify more than one memory attribute
                    و به درستی جواب داد، اما یه مرحله از صرفه جویی انجام شد، ببینید روی مثال جناب نور بخش میگم:
                    میخوام طوری باشه که بعد دوم آرایه دومی که تعریف کردید هم متغیر باشه(لزوما 3 نباشه، بتونه 1و2 هم باشه) و خود برنامه تشخیص بده که چقدرفضا بهش تشخیص بده، اگه این بشه فکر کنم راحت 25-30% دیگه صرفه جویی میشه :wow:
                    حالا نظرتون چیه؟
                    اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

                    دیدگاه


                      #11
                      پاسخ : |!!| سوالاتی در باب آرایه ها در CV

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

                      فرض کنیم که آرایه ای داریم 2 بعدی ولی تعداد سطر ها ثابت و در هر سطر تعداد ستون ها متفاوت باشه.
                      اینطوری میشه یک آرایه از ساختار زیر تعریف کرد:


                      typedef struct
                      {
                      unsigned char row;
                      unsigned char col;
                      flash char *text;
                      }node_t;

                      static flash node_t nodes[N]=
                      {
                      {1,1,"Tehran"},
                      ....
                      };

                      flash char *get_text(unsigned char row, unsigned char col)
                      {
                      flash node_t *p;
                      int i;

                      for(p=nodes; p<p+N; p++)
                      {
                      if( (row == p->row) && (col == p->col) )
                      return p->text;
                      }
                      return NULL;
                      }


                      برای بالاتر بردن سرعت هم اگر فرض رو بر این بذاریم که لیست شما بر اساس سطر و سپس ستون مرتب باشه میشه در این تابعی که قید شد بجای حلقه از یک binary search برای جستجوی سریعتر استفاده کرد.
                      اینجوری مثلا برای 1000 شهر فقط به 10 مقایسه احتیاج هست.

                      دیدگاه


                        #12
                        پاسخ : |!!| سوالاتی در باب آرایه ها در CV

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

                        فرض کنیم که آرایه ای داریم 2 بعدی ولی تعداد سطر ها ثابت و در هر سطر تعداد ستون ها متفاوت باشه.
                        اینطوری میشه یک آرایه از ساختار زیر تعریف کرد:


                        typedef struct
                        {
                        unsigned char row;
                        unsigned char col;
                        flash char *text;
                        }node_t;

                        static flash node_t nodes[N]=
                        {
                        {1,1,"Tehran"},
                        ....
                        };

                        flash char *get_text(unsigned char row, unsigned char col)
                        {
                        flash node_t *p;
                        int i;

                        for(p=nodes; p<p+N; p++)
                        {
                        if( (row == p->row) && (col == p->col) )
                        return p->text;
                        }
                        return NULL;
                        }


                        برای بالاتر بردن سرعت هم اگر فرض رو بر این بذاریم که لیست شما بر اساس سطر و سپس ستون مرتب باشه میشه در این تابعی که قید شد بجای حلقه از یک binary search برای جستجوی سریعتر استفاده کرد.
                        اینجوری مثلا برای 1000 شهر فقط به 10 مقایسه احتیاج هست.
                        ممنون جناب آقازاده
                        اما اینا بالاتر از درک و فهم من هستش! (تو دانشگاه استادمون حتی اشاره گر هم بهمون درس نداد و خودم تا حدی که نیاز بود یادگرفتم، اما هنوز عمقی نفهمیدمش چون زیاد عملی باهاش کارنکردم)
                        ولی حتما سرفرصت کدتون رو بررسی میکنم تا یه چیزی ازش یاد بگیرم
                        (اگه امکانش هست یه لطفی بکنید: هر وقت حوصله و وقتش رو داشتید یه توضیح واسه این کدتون بذارید تا بتونم راحتتر درکس کنم)
                        بسیار سپاسگذار...
                        اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

                        دیدگاه


                          #13
                          پاسخ : |!!| سوالاتی در باب آرایه ها در CV

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


                          typedef struct
                          {
                          unsigned char row;
                          unsigned char col;
                          flash char *text;
                          }node_t;

                          static flash node_t nodes[N]=
                          {
                          {1,1,"Tehran"},
                          ....
                          };

                          flash char *get_text(unsigned char row, unsigned char col)
                          {
                          int i;

                          for(i=0; i<N; i++)
                          {
                          if( (row == nodes[ i ].row) && (col == nodes[ i ].col) )
                          return nodes[ i ].text;
                          }
                          return NULL;
                          }


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

                          دیدگاه

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