Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.14;
Скачать: CL | DM;

Вниз

Перевод с С# на 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.013 c
11-1201359442
Elec3C
2008-01-26 17:57
2009.06.14
Вопрос по Button у


2-1240935307
Sowyer
2009-04-28 20:15
2009.06.14
Едиты ( часть II)


2-1240762612
Ramil
2009-04-26 20:16
2009.06.14
Фильтрация подстановочных полей


2-1240845722
Drowsy
2009-04-27 19:22
2009.06.14
Как переименовать таблицу IB?


2-1240583032
fgb
2009-04-24 18:23
2009.06.14
декларация из с++