Форум: "Прочее";
Текущий архив: 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.005 c