PDA

View Full Version : کمک در فهم یک کد



hojjatcroos
سه شنبه 13 مرداد 1388, 08:05 صبح
سلام دوستان میشه درباره کد زیر و نقش دستور pchar در اون توضیحی بدین با تشکر



function Encode.write(const byffer;count:longint):longint;
VAr
pbuf,PEnc:pchar;
i,Encval:Integer;
begin
getmem(pen,count);
try
pbuf:=pchar(@buffer);
for i:=0 to count-1 do
begin
encVal:=ord(pbuf[i]) mod 256;
penc[i]:=chr(encval);
Result:=write(penc^,count);
finally
freemem(Penc,count);
end;
end;

lord_viper
سه شنبه 13 مرداد 1388, 09:57 صبح
pchar یه اشاره گر هست به یه string یا ارایه ای از char

nilidelphi
پنج شنبه 15 مرداد 1388, 11:31 صبح
:خجالت:ببین عزیز چون شما در دلفی برنامه می نویسین و ویندوز با C++ نوشته شده و در سی پلاس پلاس ما رشته ی واقعی نداریم و رشته بصورت آرایه ای از کاراکتر هست
پس برای اینکه بتونی از توابع API یا هر تابع سیستمی دیگه ای استفاده کنی باید رشته هایی که تو دلفی استفاده می کنی به رشته های قابل فهم c++ تبدیل کنی
برای این کار دلفی تابع PChar را آماده کرده
اینم بگم که به این گونه رشته ها میگن : رشته ی ختم شده به Null

نمی دونم تونستم مشکلتون حل کنم یا نه؟
اگه بیشتر توضیح بدی بیشتر کمکت می کنم.

vcldeveloper
پنج شنبه 15 مرداد 1388, 12:04 عصر
برای این کار دلفی تابع PChar را آماده کرده
PChar یک نوع داده هست، نه یک تابع.


اینم بگم که به این گونه رشته ها میگن : رشته ی ختم شده به Null
string در دلفی بطور خودکار به null ختم میشه، و نیازی نیست برنامه نویس نگران این مسئله باشه.

PChar در دلفی اشاره گری به یک Char هست. در دلفی نوع داده string یک نوع داده مدیریت شده هست، و فقط توسط دلفی قابل فهم هست. در C یا ++C نوع داده مستقلی برای رشته ها وجود نداره، و یک رشته آرایه ایی از کارکترها است که آخرین عنصر آن 0# باشه. حالا اگر شما بخواید به یک تابع API رشته ایی ارسال کنید، باید آدرس اولین کارکتر رشته در حافظه و تعداد کارکترها را مشخص کنید، وگرنه تابع API درکی از نوع داده string دلفی نخواهد داشت.
نوع داده string دلفی و PChar اصطلاحا با هم Type Compatible هستند، یعنی شما می تونید فرضا یک PChar را به string یا بالعکس اختصاص بدید، و کامپایلر بطور خودکار این عمل را برای شما انجام میده.

اینکه شما می بینید در یک کد عبارتی مثل PChar(MyString) وجود داره، این تابع نیست، بلکه به این کار میگن Type Cast کردن؛ یعنی تبدیل یک نوع داده به نوعی دیگه. در واقع این کد نوع داده string مربوط به MyString را تبدیل به نوع داده PChar میکنه. کامپایلر با مشاهده این کد، آدرس اولین کارکتر رشته را برمیگردانه.

حالا اینا ربط چندانی به کد پست اول تاپیک نداشت. در اون کد خبری از تابع API و امثال آن نیست. در این کد برنامه نویس برای افزایش کارایی، بجای اینکه بخواد محتوای یک رشته را مرتبا تغییر بده، با استفاده از PChar از قبل حافظه مورد نیازش را اختصاص داده، و یکی یکی در خانه های آرایه اختصاص یافته می نویسه.
اگر بجای این کد از string استفاده کرده بود، و برای متغیر Penc عبارتی مثل Penc := Penc + X می نوشت، با هر بار اجرای این کد باید حافظه جدیدی به رشته اختصاص داده میشد، و محتوای قبلی رشته به اضافه یک کارکتر اضافه به آن کپی میشد که به شدت بر روی کارایی تاثیر منفی می گذاشت.