رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

پرچمداران

  1. قاسم رمضانی منش

    قاسم رمضانی منش

    میانجی گر‌ها


    • امتیاز

      2

    • تعداد ارسال ها

      73


  2. فرهاد شیری

    فرهاد شیری

    مدیران مرجع


    • امتیاز

      1

    • تعداد ارسال ها

      142



مطالب محبوب

در حال نمایش مطالب دارای بیشترین امتیاز در جمعه, 15 شهریور 1398 در همه بخش ها

  1. 1 امتیاز
    بله این فرض درست است.در حقیقت دی رفرنس میکنیم. بله وقتی که arr& می گوییم یعنی آدرس شروع آرایه ، ولی نمی توانیم به یک اشاره گر temp ویا define شده بگوییم که هم آدرس arr را داشته باش وهم آدرس خودت. برای اینکه قضیه برای شما روشن تر بشه مثالی میزنم.. دستورات زیر را مشاهده کنید... char c = 'm'; char* string = NULL; /* Allocating memory */ string = malloc(7); /* Copy char into `string` */ strcpy(string, (char*)"ghase"); /* Append `c` to end of `string` */ //*((char*)(&string + 1) - 2) = c; // *((char*)(&string + 1) - 1) = '\0'; char* tmp = (string + 1) ; printf("%s\n", tmp);//print string -> hase printf("%d\n", &tmp);//print address -> 0x2686628 printf("%d\n", (&tmp+0));//print address -> 0x2686628 printf("%c\n", *(tmp+0));//print char -> g همانطور که مشاهده میکنید می توان آدرس یک افست آرایه را به یک آرایه دیگه انتقال داد و با آرایه جدید به آرایه قبلی هم اشاره کرد! ولی در صورتی که چنین چیزی تعریف کنید یک رفتار تعریف نشده خواهید داشت... char* tmp2 = (&string+1 ); printf("%s\n", tmp2); آنهم به این دلیل که شما دارید یک اشاره گر به اشاره گر میسازید. بنابراین اگر چنین تعریفی انجام بدید... char** tmp3 = (&string); printf("%s\n", *tmp3);//print string -> ghase قطعا می توانید به آدرس آرایه اشاره کنید! بنابراین رفتار کامپایلر عجیب نیست، نوع تعریف شما یکم عجیبه! دقیقا به همین علت دراینجا رفتار تعریف نشده پیش میاد. معلومه که نمیشه! چون توکد اسمبلی که مشاهده کردید، در زمانی که محتویات ثبات32 بیتی (edx) را به سگمنت bss. که آرایه string در اونجا تعریف شده انتقال میده مقدار این رجیستر 0 شده بنابراین آرایه شماهم NULL میشه! حالا من نمیدونم که چه اصراری داری که اینطوری بنویسی برادر! دیگه یه چیزهایی هم از دست من و شما خارجه !
  2. 1 امتیاز
    با تشکر از شما، متوجه شدم که چگونه باید اشیاء را در ScrollView قرار بدم : ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("Hello World") color: "gray" Rectangle{ anchors.centerIn: parent width: parent.width / 2; height: parent.height / 2 border.color: "black" ScrollView{ anchors.fill: parent clip: true anchors.centerIn: parent Column{ x: 110 Repeater{ model: 40 Rectangle{color: "red"; border.color: "yellow"; width: 80; height: 80} } } } } } خروجی نمونهٔ بالا :
  3. 1 امتیاز
    میشه کاری کرد که اصلاً دست به اشاره‌گر string نزنه ؟ یعنی همان کد بالا ولی هیچ تغییری در محتوای اشاره‌گر string ایجاد نکنه که باعث بشه به ناکجاآباد اشاره‌کنه ؟ بله درست متوجه شدید، و بعد چون اون اشاره‌گر از نوع کل‌آرایه هست من تبدیلش کردم به نوع *char که بتونم خونه‌های ۱ بایتی را ازش کم کنم؛ که میشه خونهٔ آخر آرایه. یه کم کامل‌تر بگم : وقتی ما می‌نویسیم arr* یعنی مقدار خانه‌ای که arr به آن اشاره می‌کند را درخواست می‌کنیم (فرض می‌گیریم arr یک []char است). حالا وقتی می‌گوییم arr& یعنی آدرس خانه‌ای که arr به آن اشاره می‌کند را می‌گیریم، با تفاوتش با arr + 2& این است که arr& آدرس کل خانه‌های arr را به ما می‌دهد به جای آدرس یک خانه. پس وقتی که arr + 1& می‌گوییم درواقع یک همچین چیزی است : /* ================= | x | x | x | x | ================= \---+---/ | char arr[]: -+ ================= | x | x | x | x | ======|========== | | arr + 1 : -+ ================= | x | x | x | x | ================= ^ | &arr + 1 : -+ / ================= +> | x | x | x | x | \ ================= +--------+ | &arr : ----+ ================= -------------... | x | x | x | x | | | | | |... ================= -------------... ^ +----------+ | &arr + 1: ----+ */ و در انتها وقتی که ما نوع اشاره‌گر را به *char تغییر می‌دهیم و یک واحد کم می‌کنیم، درواقع یک واحد از نوع *char کم‌ می‌شود به جای یک واحد از نوع arr&. و اینطوری می‌توانیم به خانهٔ آخر آرایه به راحتی دسترسی داشته باشیم چرا که آن خانه در دسترس است. امّا اینکه چرا نمی‌توانم مقداری درآن خانه قرار بدم و آن رفتار کامپایلر اتفاق می‌اٌفتد عجیبه. من فقط آدرس را می‌گیرم، اصلاً هیچ دسترسی به آن خانه ندارم که بخواد مشکلی ایجاد کنه؛ فقط آدرس را می‌گیرم و واحدهایی (به اندازهٔ مقدارحافظه‌ای که char می‌گیرد) ازش کم‌ می‌کنم که بتونم به خانهٔ آخر آرایه دسترسی داشته‌باشم، نمونه : #define END_OF_ARRAY(type, arr, index) \ (*((type*) (&arr + 1) - index)) int main (void){ char string[] = "ghasem is here"; printf("%c\n", END_OF_ARRAY(char, string, 2)); printf("%s\n", string); return 0; }
این صفحه از پرچمداران بر اساس منطقه زمانی تهران/GMT+04:30 می باشد
×
×
  • جدید...