Форум на Kuban.ru (http://forums.kuban.ru/)
-   Разработка программ (http://forums.kuban.ru/f1024/)
-   -   Перевод СИ-текста под DELPHI (http://forums.kuban.ru/f1024/perevod_si-teksta_pod_delphi-8370697.html)

ComAlex 25.06.2017 13:16

Перевод СИ-текста под DELPHI
 
Господа программисты, помогите перевести текст, написанный на СИ, под Delphi (кусок модуля и функцию "permut")

Как корректно перевести:
...
unsigned long lr[3];
signed long i;
lr[1]=0;
lr[2]=0;
permut(((unsigned char*)(&(lr[1]))),input,ip);
...
где
void permut(unsigned char * out,const unsigned char * in, const unsigned char * table)
unsigned long i;
for(i=1;*table;i++)
// if(bittest(in,*table)) // На это можно не смотреть
// bitset(out,i); // На это можно не смотреть
table++;
...

1. Больше всего интересует преобразование (((unsigned char*)(&(lr[1]))).
Как первый параметр функции permut .... Что это?
2. И непонятна конструкция table++

КАК это всё написать (перевести) на DELPHI ???

x0577216 26.06.2017 06:50

[quote=Александр COM;44407445]КАК это всё написать (перевести) на DELPHI ??? [/quote]
никак. потому что permut = permutation = перестановки. на просторах инета их много, остаётся только взять поудобнее. пока их две. вот сейчас засну, проснусь и сделаю. несчастный ты человек. делаешь неизвестно что.

x0577216 27.06.2017 01:46

Как корректно перевести:
...
unsigned long lr[3];
signed long i;
lr[1]=0;
lr[2]=0;
permut(((unsigned char*)(&(lr[1]))),input,ip);
[quote=Александр COM;44407445]1. Больше всего интересует преобразование (((unsigned char*)(&(lr[1]))).[/quote] насколько я понял, просто позволяет обращаться с массивом lr как со строкой [quote=Александр COM;44407445] И непонятна конструкция table++[/quote]
переход к следующему символу.

Добрых дел мастер 27.06.2017 10:02

[quote=x0577216;44416263]переход к следующему символу. [/quote]
в делфи так, кстати, тоже можно.

IvUs 27.06.2017 10:09

[quote=Александр COM;44407445]1. Больше всего интересует преобразование (((unsigned char*)(&(lr[1]))).[/quote]
Берется первый (не нулевой!) long из массива lr и его адрес передается как адрес массива из байт. Грубо говоря, permut получает байты из которых состоит lr[1]

IvUs 27.06.2017 10:11

[quote=Александр COM;44407445]И непонятна конструкция table++[/quote]
то же самое что и
table = table + 1;

Добрых дел мастер 27.06.2017 10:22

[quote=IvUs;44417088]Цитата: Сообщение от Александр COM Посмотреть сообщение И непонятна конструкция table++ то же самое что и table = table + 1; [/quote]
Там же звездочка впереди?
Я уже не помню, разве в с можно к указателям прибавлять цифры?
В паскале\делфи указатели можно только inc\dec

IvUs 27.06.2017 15:15

[quote=Добрых дел мастер;44417137]Я уже не помню, разве в с можно к указателям прибавлять цифры?[/quote]
целочисленные - можно. Указатель при этом сдвигается на соответствующее количество элементов (не байт).

x0577216 29.06.2017 08:32

[quote=Добрых дел мастер;44417038]в делфи так, кстати, тоже можно.[/quote]
можно и так inc(k,2);
[quote=IvUs;44418759]Указатель при этом сдвигается на соответствующее количество элементов (не байт).[/quote]
Очень сомневаюсь.
само по себе преобразование ничего не меняет, но обнаружив нулевой символ, уходит из проц.

void permut(unsigned char * out,const unsigned char * in, const unsigned char * table)
unsigned long i;
for(i=1;*table;i++)
-------- сюда мы не смортим
// if(bittest(in,*table)) // На это можно не смотреть
// bitset(out,i); // На это можно не смотреть
-------
смотрим только на значение байта, адрес которого table; строка по стандарту С заканчивается нулем.
--
тщательное изучение обнаружило, что в(lr[1]) сидит единица! Хоть квантуй, хоть не ... всё равно полуишь ..
Надо докопаться до исходной постановки, потому что здесь много чего неправильно.

max 04.07.2017 07:55

[quote=IvUs;44417074]Берется первый (не нулевой!) long из массива lr и его адрес передается как адрес массива из байт[/quote] - не первый, а второй (индексация в "С" с 0), а так все правильно.
[quote=IvUs;44418759]целочисленные - можно. Указатель при этом сдвигается на соответствующее количество элементов (не байт).[/quote] - все верно, арифметика указателей:
T arr[10];
T* p = arr;
p = p + 1; // Трактуется как ((BYTE*)p) + sizeof(T)

[quote=x0577216;44427245]тщательное изучение обнаружило, что в(lr[1]) сидит единица! Хоть квантуй, хоть не ... всё равно полуишь ..[/quote] - не должно там быть 1, там 0. :)
[quote=x0577216;44427245]Надо докопаться до исходной постановки, потому что здесь много чего неправильно.[/quote] - согласен.


Текущее время: 07:52. Часовой пояс GMT +3.