Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];

Вниз

Перевод с С# на Delphi...   Найти похожие ветки 

 
asafr   (2009-03-19 14:47) [0]

Добрый день. В настоящее время переписываю вручную одну программку с C# на Delphi и столкнулся с Си-Шарповской конструкцией, которую не соображу, как перевести на язык Delphi... Просто не представляю. Может кто что-нибудь посоветует? Ниже привожу кусок кода C#:

Point[][] alPattern = new Point[1][];
for (int i = 0; i < 1; i++)
 {
     alPattern[i] = new Point[1];
 }


Что делает данный код C# я на 99% понимаю, но не могу придумать, как это реализовать на Delphi?
Обратите внимание, что alPattern - это двухмерный массив типа, которому в Дельфи соответствует тип TPoint. Но в цикле идет присваивание ячейке alPattern по одной координате... Причем присваивается Point[1], что так же мне не совсем понятно... Что значит эта единица в Point[1]  ?
Прошу помощи.... Спасибо.


 
StriderMan   (2009-03-19 14:56) [1]


> Что значит эта единица в Point[1]

одномерный массив с одним элементом.


> for (int i = 0; i < 1; i++)
>  {
>      alPattern[i] = new Point[1];
>  }
>



бессмысленный код какой-то. одна итерация выполнится. можно заменить на
alPattern[1] = new Point[1];

type
 TalPattern = array[1..1] of array of TPoint
var
 alPattern: TalPattern ;

SetLength(alPattern[1], 1);


 
Jack128_   (2009-03-19 14:56) [2]


> Причем присваивается Point[1], что так же мне не совсем
> понятно... Что значит эта единица в Point[1]  ?


ну скоре всего - это создание одномерного массива из одного элемента.


 
MBo ©   (2009-03-19 14:58) [3]

Что значит эта единица в Point[1]
конструктор динамического массива длиной 1

SetLength(alPattern[i], 1)


 
asafr   (2009-03-19 15:14) [4]

Да, код, действительно, странный. Но что есть, то есть....
Прочитав Ваши комментарии, и собрав все в кучу, можно ли сделать вывод, что в Дельфи этот код можно представить таким образом? :


type
TalPattern = array[1..1] of array of TPoint
var
alPattern: TalPattern ;
i:Byte;
begin
SetLength(alPattern[1], 1);
i := 0;
while (i < 1) do
 begin
   SetLength(alPattern[i], 1);
   Inc(i);
 end;
end;


Ужасная бессмыслица... Но я вырвал только кусок кода, ниже еще идут манипуляции с этой переменной... Меня заинтересовал только этот кусок..


 
asafr   (2009-03-19 15:15) [5]

бред какой то  :(


 
StriderMan   (2009-03-19 15:31) [6]


type
 TalPattern = array[1..1] of array of TPoint
var
 alPattern: TalPattern;
 i: integer;
begin
 for i := 1 to 1 do
   SetLength(alPattern[i], 1);
end;


 
MBo ©   (2009-03-19 15:32) [7]

достаточно
var
 alPattern: array of array of TPoint;// если их Point - наш TPoint
и
SetLength(alPattern, 1, 1);

полагаю, что исходный код предполагает возможное расширение (разные границы массива), правда, для этого стоило хотя бы константы задать.

array[1..1]  - это вообще не то, что нужно - нумерация ведь с нуля будет далее в коде.


 
StriderMan   (2009-03-19 15:37) [8]


> array[1..1]  - это вообще не то, что нужно - нумерация ведь
> с нуля будет далее в коде.

почему с нуля? это ж статический массив динамических массивов :)

а вообще если везде юзать low() и high() то пофигу


 
MBo ©   (2009-03-19 15:46) [9]

>почему с нуля? это ж статический массив динамических массивов :)
в шарпе и статические ведь только с нуля


 
asafr   (2009-03-19 16:02) [10]

Может так?

var
alPattern: array of array of TPoint;
i: integer;
P:TPoint;
begin
SetLength(alPattern,1,1);
for i := 0 to 0 do
  begin
    alPattern[i,0]:= P;
  end;

end;


 
asafr   (2009-03-19 16:03) [11]

Хотя, конечно alPattern[i] = new Point[1] в Шарпе,
это НЕ  alPattern[i,0]:= P  в Дельфи


 
MBo ©   (2009-03-19 16:04) [12]

нет, цикл не нужен - зачем неинициализированную переменную присваивать?


 
asafr   (2009-03-19 16:25) [13]

Я просто стараюсь перевести "дословно", даже если глупостью выглядит..
Вот для чего так было написано? Подобные конструкции в коде встречаются довольно часто. Не думаю, что программист, написавший это - безграммотный. Что-то он имел ввиду... Программа его реализует весьма не тривиальную вещь и человек, написавший подобное, сознательно глупость вряд ли допустит, тем более  во многих местах. Программа - это декодер двухмерного штрих кода QR Code из изображения, написанная для мобильного телефона. Т.е., получив картинку формата jpg, bmp и т.д. - получаем то, что в нем зашифровано без сканера двухмерных штрих кодов...


 
asafr   (2009-03-19 16:30) [14]

Я же пытаюсь "перепереть эту польку на родной язык", включив в свой проект... С уетом того, что я не знаю алгоритма кодирования/декодирования QR Code - исходники Си-Шарп программиста для меня бесценны..  :)


 
Pavia ©   (2009-03-19 16:41) [15]

var
alPattern: array of array of TPoint; // Это объевление соответсвует си шарпному
begin
SetLength(alPattern,1,1); // Тут все SetLength автоматом очищает переменные

end;


> Я просто стараюсь перевести "дословно", даже если глупостью
> выглядит..Вот для чего так было написано? Подобные конструкции
> в коде встречаются довольно часто. Не думаю, что программист,
>  написавший это - безграммотный. Что-то он имел ввиду...
>  Программа его реализует весьма не тривиальную вещь и человек,
>  написавший подобное, сознательно глупость вряд ли допустит,
>  тем более  во многих местах. Программа - это декодер двухмерного
> штрих кода QR Code из изображения, написанная для мобильного
> телефона. Т.е., получив картинку формата jpg, bmp и т.д.
>  - получаем то, что в нем зашифровано без сканера двухмерных
> штрих кодов...

Это стандарт Си# в нем обязательно инициировать переменные.
В 10 сообщении, ошибка ты присваеваешь неинициализованную переменную p.  А во-вторых программисты тоже люди и могут делать ошибки. А вот обязательная инициализация переменных в Си шарп уменьшает долю таких ошибок.


 
asafr   (2009-03-19 16:58) [16]

То есть достаточно написать? :

var
alPattern: array of array of TPoint; // Это объевление соответсвует си шарпному
begin
SetLength(alPattern,1,1); // Тут все SetLength автоматом очищает переменные

end;


Моё 10 сообщение - конечно, глупость..


 
Pavia ©   (2009-03-19 17:12) [17]


> То есть достаточно написать?

Да.


 
asafr   (2009-03-19 17:13) [18]

спасибо


 
asafr   (2009-03-19 17:20) [19]

Всем спасибо


 
Правильный$Вася   (2009-03-19 18:04) [20]


> Подобные конструкции в коде встречаются довольно часто.
> Не думаю, что программист, написавший это - безграммотный.
>  Что-то он имел ввиду...

очень подозреваю, что использовался генератор кода по шаблону


 
asafr   (2009-03-24 10:04) [21]

В продолжении темы. Господа програмисты, снова С# -> Delphi... Вновь конструкции, которая повергли меня в состояние "ступора". Исходит все из-за недопонимания классов С#. Помогите найти аналог в дельфи. Привожу полностью текст двух функций, затруднительные для меня строчки выделяю жирным. Надеюсь, что отнесетесь к моей проблеме доброжелательно.
1 - я функция:

virtual public sbyte[] DataByte
{
get
{
 canvas.println("Reading data blocks.");
 System.IO.MemoryStream output = new System.IO.MemoryStream();

 try
 {
   do
   {
     int mode = NextMode;
     if (mode == 0)
     {
       if (output.Length > 0)
         break;
       else
         throw new InvalidDataBlockException("Empty data block");
     }
     if (mode != MODE_NUMBER && mode != MODE_ROMAN_AND_NUMBER && mode != MODE_8BIT_BYTE && mode != MODE_KANJI)
     {
       throw new InvalidDataBlockException("Invalid mode: " + mode + " in (block:" + blockPointer + " bit:" + bitPointer + ")");
     }
     dataLength = getDataLength(mode);
     if (dataLength < 1)
       throw new InvalidDataBlockException("Invalid data length: " + dataLength);
     switch (mode)
     {

       case MODE_NUMBER:
         sbyte[] temp_sbyteArray;
         temp_sbyteArray = SystemUtils.ToSByteArray(SystemUtils.ToByteArray(getFigureString(dataLength)));
         output.Write(SystemUtils.ToByteArray(temp_sbyteArray), 0, temp_sbyteArray.Length);

         break;
       case MODE_ROMAN_AND_NUMBER:
         sbyte[] temp_sbyteArray2;
         temp_sbyteArray2 = SystemUtils.ToSByteArray(SystemUtils.ToByteArray(getRomanAndFigureString(dataLen gth)));
         output.Write(SystemUtils.ToByteArray(temp_sbyteArray2), 0, temp_sbyteArray2.Length);

         break;
       case MODE_8BIT_BYTE:
         sbyte[] temp_sbyteArray3;
         temp_sbyteArray3 = get8bitByteArray(dataLength);
         output.Write(SystemUtils.ToByteArray(temp_sbyteArray3), 0, temp_sbyteArray3.Length);

         break;
       case MODE_KANJI:
         sbyte[] temp_sbyteArray4;
         temp_sbyteArray4 = SystemUtils.ToSByteArray(SystemUtils.ToByteArray(getKanjiString(dataLength)));
         output.Write(SystemUtils.ToByteArray(temp_sbyteArray4), 0, temp_sbyteArray4.Length);

         break;
       }
   }
   while (true);
 }
 catch (System.IndexOutOfRangeException e)
 {
   SystemUtils.WriteStackTrace(e, Console.Error);
   throw new InvalidDataBlockException("Data Block Error in (block:" + blockPointer + " bit:" + bitPointer + ")");
 }
 catch (System.IO.IOException e)
 {
   throw new InvalidDataBlockException(e.Message);
 }
 return SystemUtils.ToSByteArray(output.ToArray());
}

}

Функция getRomanAndFigureString(dataLength) - возвращает строку...

2-я функция:
Здесь, собственно

public virtual String decode(QRCodeImage qrCodeImage)
{
 sbyte[] data = decodeBytes(qrCodeImage);
 byte[] byteData = new byte[data.Length];
 Buffer.BlockCopy(data, 0, byteData, 0, byteData.Length);

 System.Text.Encoding encoding;
 if (QRCodeUtility.IsUnicode(byteData))
 {
     encoding = Encoding.Unicode;
 }
 else
 {
     encoding = Encoding.ASCII;
 }
 String decodedData;
 decodedData = encoding.GetString(byteData);
 return decodedData;
}


 
asafr   (2009-03-24 10:27) [22]

Господа.. О первой функции надо забыть... Все разрешилось - я "лоханулся"...
SystemUtils - "доморощенный" класс. Ко встроеным классам отношения не имеет...

А вот вторая функция меня по прежнему интересует:

public virtual String decode(QRCodeImage qrCodeImage)
{
sbyte[] data = decodeBytes(qrCodeImage);
byte[] byteData = new byte[data.Length];
Buffer.BlockCopy(data, 0, byteData, 0, byteData.Length);

System.Text.Encoding encoding;
if (QRCodeUtility.IsUnicode(byteData))
{
    encoding = Encoding.Unicode;
}
else
{
    encoding = Encoding.ASCII;
}
String decodedData;
decodedData = encoding.GetString(byteData);
return decodedData;
}


 
Сергей М. ©   (2009-03-25 08:46) [23]


> Buffer.BlockCopy(data, 0, byteData, 0, byteData.Length);


Move(Data[0], byteData[0], Length(byteData));


 
Palladin ©   (2009-03-25 09:13) [24]

а лучше сразу в String и Move(Data[1], byteData[1], Length(byteData));


 
asafr   (2009-04-08 11:07) [25]

Следующее затруднение у меня....
Не могу найти аналог в Delphi...

Конструкция № 1. Аналог Delphi мне не найти:

       internal static byte[] GetResource(String name)
       {          
           object obj = ResourceManager.GetObject(name, resourceCulture);
           return ((byte[])(obj));

       }

где  System.Resources.ResourceManager ResourceManager

И далее, конструкция №2, реализация и BufferedStream :

.....................................
String fileName = "qrv" + Convert.ToString(qrcodeVersion) + "_" + Convert.ToString(ec);
               MemoryStream memoryStream = new MemoryStream(Resources.GetResource(fileName));
               BufferedStream bis = new BufferedStream(memoryStream);
               
SystemUtils.ReadInput(bis, matrixX, 0, matrixX.Length);
................................................................


Строка SystemUtils.ReadInput(bis, matrixX, 0, matrixX.Length) меня не интересует, но не понятно, что такое BufferedStream ??? И для чего он?

Спасибо за любую конструктивную подсказку или помощь..  :)


 
asafr   (2009-04-08 11:10) [26]

Дополнение к asafr   (08.04.09 11:07) [25]

Конструкцию № 2 мне тоже не реализовать на Дельфи

MemoryStream memoryStream = new MemoryStream(Resources.GetResource(fileName));
BufferedStream bis = new BufferedStream(memoryStream);


Вообще не представляю - как бы это могло выглядеть на язsке Delphi....


 
Polevi ©   (2009-04-08 11:22) [27]

ну наверное так

var
 memoryStream:TMemoryStream;
 bis:TBufferedStream;
begin
 memoryStream:=TMemoryStream.Create(Resources.GetResource(fileName));
 bis:=TBufferedStream.Create(memoryStream);
...
...


 
asafr   (2009-04-08 11:54) [28]

Сергей, спасибо за содержательный ответ  :D
Но если честно, то довольно трудно мне представить в дельфи

ResourceManager.GetObject

а так же BufferedStream, которого, как я понимаю, в Delphi не существует...


 
asafr   (2009-04-08 14:21) [29]

2Polevi.
Сергей, у тебя № телефона сотового изменился? Последний раз мы созванивались году в 2003-м... :)


 
asafr   (2009-04-08 18:08) [30]

Вопрос с повестки снят, аналог Дельфи написан.. :)



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.004 c
15-1239121494
theAddon
2009-04-07 20:24
2009.06.14
Помогите написать небольшую программку


11-1202161306
Jon
2008-02-05 00:41
2009.06.14
Wrap text in editbox/memo


15-1238963824
GibiW
2009-04-06 00:37
2009.06.14
Сопряжение окружностей (помогите)


2-1240666145
HF-Trade
2009-04-25 17:29
2009.06.14
idHTTP.Get не получаеться забрать страничку


2-1240598762
buzb
2009-04-24 22:46
2009.06.14
Как разместить компонент над всеми остальными





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский