Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2009, 10:56   #1
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию Прошу помощи в проверке моего перевода небольшого фрагмента кода от Си к делфи!

Добрый день!

Прошу помощи в проверке моего перевода небольшого фрагмента кода от Си к делфи.

исходный код на СИ:

Код:
int fadelen, fadepos; // fade length/position
void *buffer, DWORD length
short *s=(short*)buffer; 
for (; length; length--, s++, fadepos++)
   s[0]=s[0]*fadepos/fadelen;
мой перевод на делфи цикла:

Код:
var a : Integer;
     s : ^SmallInt;
for a := length-1 downto 0 do
begin
  s^ := Trunc(s^*fadepos/fadelen);
  Inc(s);
  Inc(fadepos);
end;
Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 16.08.2009, 11:33   #2
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Странно... а откуда берётся значение buffer? А то ерунда получается
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 16.08.2009, 11:35   #3
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

меня интересует только этот маленький фрагмент цикла, а сама процедура начинается так:

Код:
void CALLBACK FadeInDSP(HDSP handle, DWORD channel, void *buffer, DWORD length, void *user)
Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 16.08.2009, 11:49   #4
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Inc(s) разве работает?
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 16.08.2009, 12:32   #5
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Цитата:
Inc(s) разве работает?
Да.

В принципе, переведенный на Delphi код, похож по смыслу на то, что было написано на C, но...
1)Неплохо бы знать для чего этот код предназначен
2)В коде на C используется идентификатор length, и это мешает использовать в переведенном коде те же имена

...да, вроде правильно.
megachuhancer вне форума Ответить с цитированием
Старый 16.08.2009, 15:21   #6
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Это код, который работает с библиотекой BASS

исходный:

Код:
void CALLBACK FadeInDSP(HDSP handle, DWORD channel, void *buffer, DWORD length, void *user)
{
	short *s=(short*)buffer; // assuming 16-bit data (use "float" for floating-point, eg. FLOATDSP)
	if (fadepos==fadelen) return; // fade-in completed
	length/=sizeof(*s);
	if (length>fadelen-fadepos) length=fadelen-fadepos; // limit length to remaining fade-in
	for (; length; length--, s++, fadepos++)
		s[0]=s[0]*fadepos/fadelen;
}
мой перевод:

Код:
procedure FadeInDSP(handle : HDSP; channel : DWORD; buffer : Pointer; length : DWORD; user : Pointer); stdcall; 
      var a : Integer;
          s : ^SmallInt;
begin
  s := buffer;
  if (fadepos=fadelen) then Exit;
  length := Trunc(length/SizeOf(s));
  if (length>DWORD(fadelen-fadepos)) then length := DWORD(fadelen-fadepos); // limit length to remaining fade-in
  for a := length-1 downto 0 do
  begin
    s^ := Trunc(s^*fadepos/fadelen);
    Inc(s);
    Inc(fadepos);
  end;
end;
Все правильно? ошибок нет?

Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 16.08.2009, 15:44   #7
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Мне кажется, что ошибок нет. Хотя, если честно, я не знаю, что такое библиотека BASS. Но что касаемо перевода, ошибок вроде нет.

А какой ответ вы ожидали? Да? Нет? Что вы думаете по поводу правильности этого кода?

-----------------------------------------------------------------------------------------------------------------------------------

Вместо
Код:
length := Trunc(length/SizeOf(s));
можно написать
Код:
length := length div SizeOf(s);
Это позволяет избжать вещественных вычислений, когда работа только с целыми числами.

Последний раз редактировалось megachuhancer; 16.08.2009 в 15:48.
megachuhancer вне форума Ответить с цитированием
Старый 16.08.2009, 15:51   #8
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

что я думаю о правильности кода я написал в своем переводе его. :-)

А мне нужно мнение профессионалов о том, насколько я правильно интерпретировал. Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 16.08.2009, 15:53   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Inc(s), может и работает, но рекомендую всетаки разименовывать указатель, потому что сами указатели это считай тот же Cardinal...аккуратнее стоит быть
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 16.08.2009 в 15:55.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.08.2009, 16:01   #10
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Цитата:
А мне нужно мнение профессионалов
Нуууу... Мне довольно много приходилось переводить с Delphi на C и наоборот, и для этого знания того, что такое BASS не требуется... И вот ещё что: вас интересовала правильность перевода или что-то ещё?..
Цитата:
Inc(s), может и работает, но рекомендую всетаки разименовывать указатель, потому что сами указатели это считай тот же Cardinal...аккуратнее стоит быть
Если разыменовать, то увеличится само значение, а тут, как я понял, происходит сдвиг указателя(см. код на C)
megachuhancer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу помощи в разборе куска кода драйвера RIL под ARM Lebets_VI Win Api 0 14.08.2009 13:58
Прошу помощи в конвертации на Делфи кода от С++. SkAndrew Общие вопросы Delphi 11 07.08.2009 12:14
Прошу помощи в делфи sergeyfsd Помощь студентам 5 23.05.2008 20:39
Ч чём ошибка моего кода сохранения и загрузки? AngelOfDeath Общие вопросы Delphi 3 08.04.2008 13:55