PDA

View Full Version : خطا در تعریف آرایه ثابت



hadisalahi2
دوشنبه 23 شهریور 1388, 12:48 عصر
با سلام
من یک آرایه به صورت زیر تعریف کردم.



const
Map: array[Char] of Byte = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0);



البته این تعریف رو از یک کد رمزنگاری رشته پیدا کردم.
هنگامی که این در دلفی 2009 کامپایل میکنم . یغام خطای زیر رو میده؟



[DCC Error] uEncrypt.pas(30): E2072 Number of elements (256) differs from declaration (65536)


دوستان اگه راهنمایی کنند ممنون میشم.

Saeed_m_Farid
دوشنبه 23 شهریور 1388, 13:05 عصر
با سلام
...

هنگامی که این در دلفی 2009 کامپایل میکنم . یغام خطای زیر رو میده؟



[DCC Error] uEncrypt.pas(30): E2072 Number of elements (256) differs from declaration (65536)

دوستان اگه راهنمایی کنند ممنون میشم.





نوع Char (کاراکتر) تو دلفی 2009یونیکد هست، و همونطوریکه میدونید یونیکد دو بایته (بر خلاف دلفی 7 که یک بایته)،
بنابراین کافیه که توی براکت بجای char مقدار [0..255] بذارید یا [0 .. MAXBYTE]

hadisalahi2
دوشنبه 23 شهریور 1388, 13:24 عصر
با تشکر
ولی مشکل در اینه که نوعی که تعریف شده کارکتری هست و من در ادامه کدهایی دارم که از همون نوع کاراکتر استفاده میکنه .مثل کد زیر:



function Decode(const S: String): String;
const
Map: array[0..255] of Byte = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0);
var
I: LongInt;
begin
case Length(S) of
2:
begin
I := Map[S[1]] + (Map[S[2]] shl 6);


حالا وقتی که نوع Char را به 0.255 تغییر میدم خطای تبدیل نوع Integer,char رو میده.



[DCC Error] uEncrypt.pas(37): E2010 Incompatible types: 'Integer' and 'Char'

Saeed_m_Farid
دوشنبه 23 شهریور 1388, 14:10 عصر
حالا وقتی که نوع Char را به 0.255 تغییر میدم خطای تبدیل نوع Integer,char رو میده.



قضیه فرق کرد، من اصلاً حواسم نبود که این آرایه یک Map Table هست، فقط خواستم مشکل موردنظر مرتفع بشه؛ در هر حال الان مشکل شد 2 تا!
شما یه جدول Character Map لازم دارین که کاراکترهای داده شده به معادل رمز شده اش مپ بشن، حالا چه جوری، فعلاً بنده راهی که زیاد تو این کدتون تغییر ندین و امن هم باشه، به ذهنم نمیرسه؛ مشکل اینجاست که دامنه کاراکترها خیلی زیادتر شده (0 تا FFFF$ یعنی 65535 تا کاراکتر!) واسه اونهمه کاراکتر که نمیشه Map Table درست کرد، یا باید رشته ورودی محدود بشه یا الگوریتم بهینه بشه یا یه کاری که سواد من قد نمیده، بشه ...
فعلاً تا زمانی که جرقه ای حاصل بشه، دست به دامن سایر اساتید خواهیم شد :خجالت:...

Hamid.Kad
دوشنبه 23 شهریور 1388, 16:50 عصر
بجای Char بنویسید byte و هرجا لازم بود بجای کاراکتری که ذکر شده از تایع ord برای بدست آوردن عدد معادل استفاده کنید.
مثلاً اگه جایی نوشته شده بود

map[S[1]]
شما بنویسید


map[ord(S[1])]

Saeed_m_Farid
دوشنبه 23 شهریور 1388, 17:40 عصر
بجای Char بنویسید byte و هرجا لازم بود بجای کاراکتری که ذکر شده از تایع ord برای بدست آوردن عدد معادل استفاده کنید.

دوست عزيز،
تو دلفي 2009 كاراكتر 4 بايتي است، بنابراين مثلاً (65)Chr حتماً معادل 'A' نخواهد بود؛
يا برعكس (Ord(A برابر 65 نيست، چون اين كامپايلر همه جور كاراكتر يونيكدي رو ساپورت ميكنه؛ پس به همين راحتي هم نيست، مثلاً براي كاراكتر 'س' يا 'µ' يا حتي كاراكترهاي هندي و تايواني و ... مهمه كه چه راه حلي داشته باشيم.

vcldeveloper
دوشنبه 23 شهریور 1388, 17:48 عصر
به جای Char در تعریف اون آرایه، از AnsiChar استفاده کنید.

hadisalahi2
دوشنبه 23 شهریور 1388, 20:59 عصر
باسلام
توی تعریف آرایه از AnsiChar استفاده کنم؟ یعنی به صورت زیر آرایه رو تعریف کنم؟



const
Map: array[AnsiChar] of Byte = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,



اگه منظورتون اینه که ، تغییر رو انجام دادم ولی بازهم خطای عدم تطابق نوع رو میده.
البته در خطوطی که از آرایه Map استفاده میکنم.



E2010 Incompatible types: 'AnsiChar' and 'Char'


اگه منظور روش تعریف دیگه ای هست که اگه لطف کنید راهنمایی کنید ممنون میشم.
یا حق

vcldeveloper
سه شنبه 24 شهریور 1388, 19:22 عصر
اگه منظورتون اینه که ، تغییر رو انجام دادم ولی بازهم خطای عدم تطابق نوع رو میده.
البته در خطوطی که از آرایه Map استفاده میکنم.
طبیعی هست که بعد از این تغییر خطا دریافت کنید. وقتی آرایه شما AnsiChar شد، هر جا که در کد باهاش کار می کنید، باید چک کنید که مقادیر بصورت AnsiChar باشه. اگر نیست، باید Type-cast بشه به AnsiChar.

بطور کلی، شما دارید از یک کد قدیمی که از یونیکد هیچ اطلاعی نداره، در یک محیط یونیکد استفاده می کنید. برای اینکه کد شما درست کار کنه، یا باید کد شما به نوعی Unicode-aware بشه، و بتونه با یونیکد درست کار کنه، یا باید به محیط یونیکد خودتان بفهمانید که این کد چیزی از یونیکد حالیش نمیشه.

درباره سازگار کردن کدهای قدیمی با یونیکد در دلفی 2009 مقالات مختلفی نوشته شده، و در کتاب های مربوط به دلفی 2009 هم توضیح داده شده. حداقل چیزی که باید مدنظر داشته باشید این هست که در دلفی 2009:
نوع داده string معادل UnicodeString هست، در حالی که در نسخه های قدیمی تر معادل AnsiString بود.
نوع داده Char معادل WideChar هست، در حالی که در نسخه های قدیمی تر معادل AnsiChar بود.

پس اگر شما کدی را که در آن از Char استفاده شده، از نسخه های قدیمی دلفی به دلفی 2009 بیارید، دلفی آن را بصورت WideChar میشناسه. حالا اگر کد شما پیش فرضش این باشه که این Char همیشه AnsiChar هست (مثل کد شما)، اون وقت به مشکل بر میخوره؛ یا باید در روش کارش تغییر بده و پیش فرضی که Char همیشه AnsiChar هست را حذف کنه؛ یا باید بجای Char از AnsiChar استفاده کنه تا در همه نسخه های دلفی درست عمل کنه. وقتی گفته میشه از AnsiChar استفاده کنه، یعنی همه تعاملات با آن باید Ansi باشه، نه اینکه فقط تعریف آرایه را تغییر بدید، و مابقی چیزها بطور خودکار درست بشه!

hadisalahi2
سه شنبه 24 شهریور 1388, 22:08 عصر
با سلام و تشکر از توضیحات کاملتون ، پس باید رشته ها رو هم از حالت String به حالت AnsiString تبدیل کنم دیگه درسته؟

vcldeveloper
سه شنبه 24 شهریور 1388, 22:39 عصر
پس باید رشته ها رو هم از حالت String به حالت AnsiString تبدیل کنم دیگه درسته؟
بله، اون رشته هایی که با این کد تعامل دارند را باید به AnsiString تبدیل کنید.