![]() |
Перевод СИ-текста под 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 ??? |
[quote=Александр COM;44407445]КАК это всё написать (перевести) на DELPHI ??? [/quote] никак. потому что permut = permutation = перестановки. на просторах инета их много, остаётся только взять поудобнее. пока их две. вот сейчас засну, проснусь и сделаю. несчастный ты человек. делаешь неизвестно что. |
Как корректно перевести: ... 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] переход к следующему символу. |
[quote=x0577216;44416263]переход к следующему символу. [/quote] в делфи так, кстати, тоже можно. |
[quote=Александр COM;44407445]1. Больше всего интересует преобразование (((unsigned char*)(&(lr[1]))).[/quote] Берется первый (не нулевой!) long из массива lr и его адрес передается как адрес массива из байт. Грубо говоря, permut получает байты из которых состоит lr[1] |
[quote=Александр COM;44407445]И непонятна конструкция table++[/quote] то же самое что и table = table + 1; |
[quote=IvUs;44417088]Цитата: Сообщение от Александр COM Посмотреть сообщение И непонятна конструкция table++ то же самое что и table = table + 1; [/quote] Там же звездочка впереди? Я уже не помню, разве в с можно к указателям прибавлять цифры? В паскале\делфи указатели можно только inc\dec |
[quote=Добрых дел мастер;44417137]Я уже не помню, разве в с можно к указателям прибавлять цифры?[/quote] целочисленные - можно. Указатель при этом сдвигается на соответствующее количество элементов (не байт). |
[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]) сидит единица! Хоть квантуй, хоть не ... всё равно полуишь .. Надо докопаться до исходной постановки, потому что здесь много чего неправильно. |
[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. |