ورود

View Full Version : سوال: این کد چیه؟



Mask
دوشنبه 16 اسفند 1389, 13:28 عصر
با سلام.
میخواستم بدونم کد زیر چه کاری انجام میده و کجا استفاده میشه. لطفا با یه مثال.

buffer1, buffer2, buffer3: array [1..32] of Char;

hossein_h62
دوشنبه 16 اسفند 1389, 13:49 عصر
سلام
سه تا متغیر تعریف شده از نوع آرایه ای از جنس char .
خیلی جاها هم میتونه استفاده بشه!

Mask
دوشنبه 16 اسفند 1389, 14:19 عصر
ممنون.
اینو میدونم.
اگه 3 تا متغیر تعریف شده پس 1..32 چیه؟

BORHAN TEC
دوشنبه 16 اسفند 1389, 14:26 عصر
کدی که شما نوشته اید، همانطور که دوست عزیزمان گفتند سه آرایه از نوع char تعریف می کنه. این مورد کاربرد زیادی دارد.به عنوان مثال در مورد استفاده با بعضی از توابع API شما مجبور به استفاده از آن خواهید بود. برای درک بیشتر این موضوع به کد نوشته شده در زیر که نام کامپیوتر را برمیگرداند توجه کنید:
procedure TForm1.Button1Click(Sender: TObject);
var
buf: array [0 .. 255] of char;
size: Cardinal;
begin
GetComputerName(buf, size);
ShowMessage(buf);
end;

BORHAN TEC
دوشنبه 16 اسفند 1389, 14:29 عصر
اگه 3 تا متغیر تعریف شده پس 1..32 چیه؟
این اصلاً مسئله عجیبی نیست. کدی که شما نوشته اید دقیقاً معادل کد زیر است:
procedure TForm1.Button1Click(Sender: TObject);
type
myType = array [1 .. 32] of char;
var
buf1, buf2, buf3: myType;
begin
// more Codes
end;

Mask
دوشنبه 16 اسفند 1389, 14:40 عصر
ممنون.
بازم متوجه نشدم.
ببینید :
با مقدار بعد از VAR متغیر تعریف میشه. خوب
میخام بدونم این 1...32 کارش چیه؟
ممنون.

BORHAN TEC
دوشنبه 16 اسفند 1389, 15:07 عصر
میخام بدونم این 1...32 کارش چیه؟
یعنی هر کدام از این متغییرهایی که تعریف کرده اید نهایتاً می توانند 32 کاراکتر را در خود جای دهند. اگر یکی از این متغییرها مثلاً Buffer1 را در نظر بگیریم، برای دسترسی به اولین کاراکتر موجود در آن باید از اندیس 1 و برای دسترسی به آخرین کاراکتر موجود در آن باید از اندیس 32 استفاده کنید. حال اگر تعریف شما را به شکل زیر تغییر دهیم:
buffer1, buffer2, buffer3: array [5..20] of Char;
باز هم سه متغییر از نوع آرایه خواهیم داشت. توجه داشته باشید که اینبار تعداد کاراکتر هایی که یکی از این متغییرها می تواند در خود جای دهد از فرمول زیر بدست می آید:
(20-5)+1 =16
ولی اینبار اگر یک متغییر مثلاً Buffer3 را در نظر بگیریم برای دسترسی به اولین کاراکتر موجود در آن باید از کد زیر استفاده کنیم:
buffer3[5]
or
buffer3[Low(buffer3)]
حالا برای دسترسی داشتن به آخرین کاراکتر موجود در buffer3 باید از کد زیر استفاده کنیم:
buffer3[20]
or
buffer3[High(buffer3)]

Mask
دوشنبه 16 اسفند 1389, 15:28 عصر
ممنون.
خیلی خیلی خوب توضیح دادید.
و سوال آخرم اینه چه نوع از متغیرهای آرایه ای رو میشه مثل این شکل نوشت.
مثلا 1..32 .
این منوال مخصوص char هست . یا برای تمامی متغیر ها قابل پذیرشه؟
ممنون.

Felony
دوشنبه 16 اسفند 1389, 21:27 عصر
ممنون.
خیلی خیلی خوب توضیح دادید.
و سوال آخرم اینه چه نوع از متغیرهای آرایه ای رو میشه مثل این شکل نوشت.
مثلا 1..32 .
این منوال مخصوص char هست . یا برای تمامی متغیر ها قابل پذیرشه؟
ممنون.
فکر میکنم مفهوم آرایه برای شما جا نیافتاده ، برای تعریف آرایه باید محدوده رو مشخص کنید مگر آرایه دینامیک باشه .

آرایه موضوع پیچیده ای نیست ، شما فرض کن میخوای حروف انگلیسی ( A,B,C و ... ) رو بریزی داخل متغییر های کاراکتری ، حالا برای این کار میای 26 تا متغییر تعریف میکنی و هر حرف رو میریزی داخل یکی از این متغییر ها ، تعریف متغییر به این صورت خیلی زمان بر هست و برای راحت تر شدن کار شما از آرایه استفاده میکنید ، مثلا :
var
aChar: array [1..26] of char;
با تعریف بالا شما در حقیقت 26 تا متغییر از نوع کارکتر دارید و با یک خط کد انگار 26 تا متغییر تعریف کردی و میتونید با براکت [] به هر کدوم از اونها به صورت زیر دسترسی داشته باشی :
aChar[i]

حالا فرض کنید میخوایم نام دانش آموزان یک کلاس 40 نفره رو داخل متغییرهایی ذخیره کنیم ، میتونیم 40 تا متغییر رشته ای تعریف کنیم یا یک آریه رشته ای 40 خانه ای برای راحت تر شدن کار تعریف کنیم :
var
StudentName: array [1..40] of string;

حالا هر کدوم از خانه های آرایه StudentName به عنوان یک متغییر رشته ای در نظر گرفته میشن ، OK ؟

اون تعریف آرایه ای هم که قرار دادی بیشتر برای توابع API استفاده میشه ، چون کتابخانه های ویندوز با ++C نوشته شدن و در ++C چیزی به نام رشته وجود نداره ، بلکه رشته آرایه ای از کارکترها هست که با کنار هم قرار گرفتن این کاراکترها رشته تشکیل میشه ، شما هم با توجه به اینکه توابع API با ++C نوشته شدن برای کار با اونها باید متغییرهای سازگار با ++C رو بهشون پاس بدید ، پس به جای رشته مجبورید مثل همون ++C آرایه ای از کاراکترها رو به تابع API پاس بدید .

tdkhakpur
سه شنبه 17 اسفند 1389, 00:37 صبح
چون کتابخانه های ویندوز با ++C نوشته شدن و در ++C چیزی به نام رشته وجود نداره ، بلکه رشته آرایه ای از کارکترها هست که با کنار هم قرار گرفتن این کاراکترها رشته تشکیل میشه ،

داخل هیچ زبانی رشته یک استاندارد نیست بلکه داده های از بایتها یا یک سری از بایتها هستند که در نهایت به یک توکن یا علامت مثل null یا همان nil پاسکال ختم میشن تا توابع استفاده کننده از این سری از داده ها انتهای داده را تشخیص بدهند.
بنا به تعریف عمومی - رشته داده هایی از بایتها هستند که ختم به 0 یا nil شده باشن که این در مورد دلفی یا پاسکال صدق میکند.


شما هم با توجه به اینکه توابع API با ++C نوشته شدن برای کار با اونها باید متغییرهای سازگار با ++C رو بهشون پاس بدید ، پس به جای رشته مجبورید مثل همون ++C آرایه ای از کاراکترها رو به تابع API پاس بدید

الزاما داخل سی داشتن یک متغییر خاص برای پاس دادن به توابع یا api بصورت اولیه که تعریف شده باشد اجباری نیست میتونید یک api رو مثلا اگر پارامتر integer داشته باشه رو با استفاده از یک متغییر دیگه مثل char پاس بدید.


char a[2];
apiProc(int p);
////
apiProc((int)[a[0]);

و در نهایت اینکه یک متغییر از نوع string در پاسکال تعریفی از یک آرایه 80 خانه ای هست که بیشتر از 80 نمیتونه اندیس بگیره پس بهتره برای اینگونه کارها که ممکن هست فضای غیر استانداردی یا بیشتری رو طلب بکند از ارایه به کاراکتر استفاده کنید.

mbshareat
سه شنبه 17 اسفند 1389, 08:53 صبح
سلام
جناب آقای تاجیک من فکر کنم خود شما قبلا در تاپیک دیگه ای فرموده بودید رشته عملا اشاره گره.
در ضمن اگه انتهای رشته کارکتر صفر نداره چظور میشه از PChar برای پاس دادن رشته به توابع API استفاده کرد؟ مگه PChar صرفا یک اشارگر نیست؟

Felony
سه شنبه 17 اسفند 1389, 11:05 صبح
داخل هیچ زبانی رشته یک استاندارد نیست بلکه داده های از بایتها یا یک سری از بایتها هستند که در نهایت به یک توکن یا علامت مثل null یا همان nil پاسکال ختم میشن تا توابع استفاده کننده از این سری از داده ها انتهای داده را تشخیص بدهند.
پیاده سازی رشته های در C و Delphi کاملا با هم متفاوت هست !


بنا به تعریف عمومی - رشته داده هایی از بایتها هستند که ختم به 0 یا nil شده باشن که این در مورد دلفی یا پاسکال صدق میکند.

قسمتی از مقاله PChars: no strings attached (http://rvelthuis.de/articles/articles-pchars.html) نوشته Alan Perlis ، برگرفته از Rudy's Delphi Corner :


PChars were inspired by strings, as used in the C language. Most Windows API functions have a C interface, and accept C style strings. To be able to use APIs, Borland had to introduce a type that mimicked them, in the ancestor of Delphi, Turbo Pascal.

In C, there is no real string type, like there is in Delphi. Strings are just arrays of characters, and the end of the text is marked by a character with ASCII code zero. This allows them to be very long (unlike Turbo Pascal's string type, which was limited to 255 characters and a length byte - this is Delphi's ShortString type now)

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


الزاما داخل سی داشتن یک متغییر خاص برای پاس دادن به توابع یا api بصورت اولیه که تعریف شده باشد اجباری نیست میتونید یک api رو مثلا اگر پارامتر integer داشته باشه رو با استفاده از یک متغییر دیگه مثل char پاس بدید.
ما رو مسخره کردی ؟!
برداشتی یک متغییر کاراکتری رو به عدد صحیح Typecast کردی بعد میگی ... ! خیلی باحالی !


جناب آقای تاجیک من فکر کنم خود شما قبلا در تاپیک دیگه ای فرموده بودید رشته عملا اشاره گره.
در ضمن اگه انتهای رشته کارکتر صفر نداره چظور میشه از PChar برای پاس دادن رشته به توابع API استفاده کرد؟ مگه PChar صرفا یک اشارگر نیست؟
مگر الان اون صحبتم رو تکذیب کردم ؟
رشته ها در دلفی مستقیما حاوی اطلاعات نیستند بلکه حاوی اشاره گری هستند که به اطلاعات اصلی اشاره میکنند ، آقای کشاورز مقاله با عنوان Different function parameter modifiers in Delphi (http://vcldeveloper.com/articles/different-function-parameter-modifiers-in-delphi/) در سایتشون قرار دادن که در بخشی از اون مقاله این نکته هم ذکر شده :


Objects, interfaces, strings, and dynamic arrays are behind the scene just pointers. They do not contain the real data. They are pointers that refer to the real data.

در مورد PChar هم فلسفه به وجود اومدن PChar این بود که بتونید از توابع API که به رشته های C Style نیاز دارن به راحتی استفاده کنید و در اول پست هم اون نقل قولی که از مقاله زدم این موضوع رو اشاره کرده ، میتونید برای درک کامل موضوع همون مقاله PChars: no strings attached که در اول پست معرفی کردم رو مطالعه کنید .

tdkhakpur
سه شنبه 17 اسفند 1389, 14:46 عصر
همین قسمت مقاله همه چیز رو روشن میکنه ، اگر باز هم مثل همیشه روی حرفتون پافشاری دارید میتونید مقاله رو به صورت کامل مطالعه کنید

چه ربطی داره؟
strings کجا string خالی کجا؟!!!
اگر تازه شروع به کار با سی رو کرده اید بهتره قدم بعدیتان اشاره گر باشه تا معنی تبدیل و غیر تبدیل رو بدانی؟
امیدوارم ناراحت نشی تما اون مطالبی که در مورد سی و برداشتی که از سی در مورد رشته ها دارید کاملا غلطه ؟

Felony
چهارشنبه 18 اسفند 1389, 09:37 صبح
چه ربطی داره؟
strings کجا string خالی کجا؟!!!
اگر تازه شروع به کار با سی رو کرده اید بهتره قدم بعدیتان اشاره گر باشه تا معنی تبدیل و غیر تبدیل رو بدانی؟
امیدوارم ناراحت نشی تما اون مطالبی که در مورد سی و برداشتی که از سی در مورد رشته ها دارید کاملا غلطه ؟
مثل همیشه ...
اون کسی که باید موضوع رو بفهمه فهمید ...
موفق باشید .