Перевод алгоритмов, написанных на языке С на макроязык

Нельзя не затронуть такую важную тему, как перенос алгоритмов, написанных ранее на языке С, на макроязык, так как создано уже достаточно много оригинальных алгоритмов расчета, удовлетворяющих конкретным нуждам той или иной организации.

Т.к. макроязык очень похож на язык программирования C, проще всего переводить на макроязык алгоритмы, написанные на «чистом» С, то есть без применения каких-либо классов. Перенос алгоритмов можно выполнить, как и написание нового алгоритма, двумя способами:

Перенос алгоритма в функцию

Чтобы перенести алгоритм в отдельную функцию:

  1. Скопируйте текст алгоритма в файл usalg.s создав там отдельную функцию: UserAlg_номер_алгоритма(&info,&r).

  2. Если в алгоритме использовались переменные-указатели, например, int *a, double *b и т.п., то их необходимо сделать обычными переменными соответствующего типа. То есть, для нашего примера, записать: int a, double b.

  3. Если где-либо в алгоритме при вызове функций передается адрес переменной, то есть используется конструкция вида: &имя_переменной, необходимо убрать значок &(амперсант) и оставить только имя переменной.

  4. Если в алгоритме используются данные, находящиеся в структуре info (см. описание этой структуры выше): базовое значение строки, даты действия и т.п., то к этим данным необходимо обращаться непосредственно в структуре info. То есть, если в алгоритме где-либо используется переменная bz (базовое значение), то ее необходимо заменить на info.bz, d1 (дата начала действия строки) – на info.d1 и т.д.

  5. Если в тексте алгоритма есть досрочные выходы из алгоритма (операторы break, goto), замените их в соответствии с таблицей:

    Таблица 4.

    Выход «по старому»Выход «по новому»
    break;
    goto return_c;
    
    
    
    
    
    goto mdfault;
                        
    return code_Break;
    return code_ReturnCode;
    (При этом в info.c должен быть занесен возвращаемы код:
    if ((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)
    return code_ReturnCode;
    )
    return code_MDefault;;
                        


  6. В функции UserAlgorithmCalc между строчками «начало описания алгоритмов пользователя» и «конец описания алгоритмов пользователя» вставьте вызов функции:

    case номер_алгоритма:
      return UserAlg_номер_алгоритма(info,r);
              
  7. Протестируйте полученный результат, произведя расчет по данному алгоритму в лицевом счете.

Перенос алгоритма в функцию UserAlgorithmCalc

Чтобы перенести алгоритм в функцию UserAlgorithmCalc:

  1. Скопируйте текст алгоритма в файл usalg.s между строчками «начало описания алгоритмов пользователя» и «конец описания алгоритмов пользователя».

  2. Если в алгоритме использовались переменные-указатели, например, int *a, double *b и т.п., то их необходимо сделать обычными переменными соответствующего типа. То есть, для нашего примера, записать: int a, double b.

  3. Если где-либо в алгоритме при вызове функций передается адрес переменной, то есть используется конструкция вида: &имя_переменной, необходимо убрать значок &(амперсант) и оставить только имя переменной.

  4. Если в тексте алгоритма есть досрочные выходы из алгоритма (операторы break, goto), замените их в соответствии с таблицей:

    Таблица 5.

    Выход «по старому»Выход «по новому»
    break;
    goto return_c;
    
    goto mdfault;
    
                        
    break;
    RetFlag=code_ReturnCode;
    break;
    RetFlag=code_MDefault;
    break;
                        


  5. Протестируйте полученный результат, произведя расчет по данному алгоритму в лицевом счете.

Из написанного выше видно, что перенос «старых» алгоритмов проще осуществлять не через отдельную функцию, а путем непосредственной вставки в функцию UserAlgorithmCalc.