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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2008, 08:37   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Почему у мну ошибка???

Вот написал функцию!
Код:
function{ Число словами }number_by_words(input_number: integer): string;
const
ones: array [0..19] of string = ('', ' один', ' два', ' три', ' четыри', ' пять',
' шесть', ' семь', ' восемь', ' девять', ' десять', ' одиннадцать', ' двенадцать', ' тринадцать',
' четырнадцать', ' пятнадцать', ' шестнадцать', ' семнадцать', ' восемнадцать', ' девятнадцать');
tens: array [0..9] of string = ('', '', ' двадцать', ' тридцать', ' сорок', ' педесят', ' шесдесят',
' семдесят', ' восемдесят', ' девяносто');
hundreds: array [0..9] of string = ('', ' сто', ' двести', ' триста', ' четыреста', ' пятьсот',
' шестьсот', ' семьсот', ' восемьсот', ' девятсот');
more: array [1..3] of string = (' тысяч', ' миллион', ' миллиард');
var
answer, work, ending: string;
counter, tag, long, index: integer;
mark_negative: boolean;
p: pointer;
begin
   result := ' ноль';
   if input_number = 0 then exit;
   mark_negative := false;
   answer := '';
   p := @answer;
   if input_number < 0 then
   begin
      input_number := input_number * (-1);
      mark_negative := true;
   end;
   work := IntToStr(input_number);
   long := length(work);
   for counter := long downto 1 do
   begin
      ending := '';
      tag := long - counter + 1;
      index := strToInt(work[counter]);
      case tag of
      // 0..999
      1: string(p^) := ones[index];
      2: if index = 1 then string(p^) := ones[strToInt(work[counter] + work[counter + 1])]
      else string(p^) := tens[index] + string(p^);
      3: string(p^) := hundreds[index] + string(p^);
      // 1,000..999,999
      4: if work[counter - 1] <> '1' then
         begin
            if (index = 3) or (index = 4) then ending := 'и';
            if (index = 1) or (index = 2) then
            begin
               if index = 1 then string(p^) := ' тысяча' + string(p^)
               else string(p^) := ' две тысячи' + string(p^);
               end
               else
            begin
               if index > 0 then
               string(p^) := ones[index] + more[1] + ending + string(p^);
            end;
         end;
      5: if index = 1 then string(p^) := ones[strToInt(work[counter] + work[counter + 1])] + more[1] + string(p^)
      else string(p^) := tens[index] + string(p^);
      6: string(p^) := hundreds[index] + string(p^);
      // 1,000,000...999,999,999
      7: if work[counter - 1] <> '1' then
         begin
            if index > 4 then ending := 'ов';            
            if (index = 3) or (index = 4) then ending := 'а';
            if (index = 1) or (index = 2) then
            begin
               if index = 1 then string(p^) := ' миллион' + string(p^)
               else string(p^) := ' два миллиона' + string(p^);
               end
               else
            begin
               if index > 0 then
               string(p^) := ones[index] + more[2] + ending + string(p^);
            end;
         end;
      8: if index = 1 then string(p^) := ones[strToInt(work[counter] + work[counter + 1])] + more[2] + string(p^)
      else string(p^) := tens[index] + string(p^);
      9: string(p^) := hundreds[index] + string(p^);
      end;
   end;
   if mark_negative then answer := ' минус' + string(p^);
   result := string(p^);
end;
В DLL библиотеку воткнул. Но при больших числач ~<1000000 иногда выдаёт ошибку , а иногда возвращает ответ!

А если воткну в приложение, то всё OK ...
На кой так??? Спасибо заранее!
Altera вне форума Ответить с цитированием
Старый 09.03.2008, 09:18   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Скажу сразу мне не нравиться string(p^). Юзайте лучше уже p: PCHAR;
BOBAH13 вне форума Ответить с цитированием
Старый 09.03.2008, 09:28   #3
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

А в начале dll есть uses ShareMem ?
alexBlack вне форума Ответить с цитированием
Старый 09.03.2008, 09:29   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Вначале у меня было без указателей, и всёравно глючило...
Altera вне форума Ответить с цитированием
Старый 09.03.2008, 09:29   #5
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
А в начале dll есть uses ShareMem ?
Нет! Нету... Поставить? Ща....
Altera вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему ошибка в IBDataSet? 3lander БД в Delphi 3 10.10.2007 11:38
Почему ошибка только в DLL? AidarBik Общие вопросы Delphi 13 08.10.2007 14:49
Почему не работает код? Kashp Общие вопросы Delphi 3 09.08.2007 17:33
Почему? Sota О форуме и сайтах клуба 4 26.07.2007 16:26
Почему так? Сильванович Михаил Общие вопросы C/C++ 2 03.07.2007 11:57