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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2009, 19:10   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Передача результата функции как String

Код:
Var
 Res:String;
begin
  Res := Bla-bla-bla('45445');
  MEMResult.Text := Res;
Код:
Function Bla-bla-bla(F:String) : String;
Код:
   Result := RESString; {Здесь RESString = '0046'}
И вылет с ошибкой :


Что делать?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 04.12.2009 в 19:13.
Alex Cones вне форума Ответить с цитированием
Старый 04.12.2009, 19:13   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Отладчиком пробегались? Просто без кода-это просто тычки пальцем в небо.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 04.12.2009, 19:17   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Дык если б не пробегся не спросил бы.

До строки
Код:
Result := RESString;
Все значения просто замечательные, а после F7, когда она выделена - выскакивает ошибка.

P.S. То, что функа лежит в другом юните может сказаться?
----
Сделал вот так:
Код:
For I := 1 to Length(RESString) do
     Result := Result + RESString[I];
Прошелся отладчиком - Result заполняется правильно, и как только заполняется полностью при отправке обратно в гл. модуль идет ошибка
----
Переложил функу в гл. модуль. ошибка не исчезла...
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 04.12.2009 в 19:39.
Alex Cones вне форума Ответить с цитированием
Старый 04.12.2009, 20:49   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Так, ладно, уговорили, предъявляю код.
Пишу модуль для работы с длинной арифметикой. Сейчас готова функция сложения, считает правильно, RESString получает правильное значение, но при передаче выбивает ошибку.
Код:
unit ALXCNSLongMath;

interface

Uses
  SysUtils; (* Для StrToInt и IntToStr *)

Function LongCalc(FSTValue, SNDValue : String; Operation : Char) : String;

implementation

Function LongCalc(FSTValue, SNDValue : String; Operation : Char) : String;
 Var
  FSTValueBin : Array of Byte; (* Первое число                  *)
  SNDValueBin : Array of Byte; (* Второе число                  *)
  RESValueBin : Array of Byte; (* Для результата                *)
  I           : LongInt;       (* Для перевода из STRING в BYTE *)
  MaxSize     : LongInt;       (* Для цикла по обработке        *)
  Sum         : Byte;          (* Сумма сложения двух ячеек     *)
  RESString   : String;        (* Для результата конечного      *)
 Begin
  SetLength(FSTValueBin, Length(FSTValue) + 2); (* Установим    *)
  SetLength(SNDValueBin, Length(SNDValue) + 2); (* длины        *)
  SetLength(RESValueBin, Length(FSTValue) + 2); (* массивов     *)

  For I := 1 to Length(FSTValueBin) do FSTValueBin[I] := 0; (* Удалим   *)
  For I := 1 to Length(SNDValueBin) do SNDValueBin[I] := 0; (* мусор    *)
  For I := 1 to Length(RESValueBin) do RESValueBin[I] := 0; (* массивов *)

  For I := 1 to Length(FSTValue) do         (* Заполним байтовые массивы *)
   FSTValueBin[I - 1] := Ord(FSTValue[Length(FSTValue) - ( I - 1 )]) - 48;
  For I := 1 to Length(SNDValue) do         (* Заполним байтовые массивы *)
   SNDValueBin[I - 1] := Ord(SNDValue[Length(SNDValue) - ( I - 1 )]) - 48;

  If Operation = '+' Then  (* Операция сложения *)
   Begin
    MaxSize := Length(SNDValue);  (* Если второе > первого или они равны *)
    If Length(FSTValueBin) > Length(SNDValueBin) Then
     MaxSize := Length(FSTValue); (* Если первое больше второго          *)
    For I := 0 to MaxSize - 1 do  (* Начинаем обработку                  *)
     Begin
      Sum := FSTValueBin[I] + SNDValueBin[I]; (* Складываем ячейки        *)
      While Sum > 9 do                        (* Sum должно быть меньше 9 *)
       Begin
        Dec(Sum, 10);                         (* Откусим у Sum             *)
        Inc(FSTValueBin[I + 1], 1);           (* и добавим это в           *)
       End;                                   (* следующий разряд [ I + 1] *)
      RESValueBin[I] := Sum;                  (* Наконец получим результат *)
     End;
    RESString := '';
    For I := 1 to Length(RESValueBin) do RESString := RESString + '0';
    For I := 1 to Length(RESValueBin) do       (* "Развернем" результат    *)
     RESString[Length(RESValueBin) - I + 1] := Chr(RESValueBin[I - 1] + 48);
   End;
  For I := 1 to Length(RESString) do
   Result := Result + RESString[I];
 End;

end.
Вложения
Тип файла: rar LongAModule.rar (172.8 Кб, 6 просмотров)
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 04.12.2009 в 21:11.
Alex Cones вне форума Ответить с цитированием
Старый 04.12.2009, 21:30   #5
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Складывает не правильно. И работает не со всеми цифрами.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 04.12.2009, 21:37   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Складывает не правильно
С чего вдруг? 12+34=46
Цитата:
И работает не со всеми цифрами
Покажите на примере.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 04.12.2009, 21:39   #7
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

9+9=8

Нашёл проблемные строки:
Код:
  SetLength(FSTValueBin, Length(FSTValue)); (* Óñòàíîâèì    *)
  SetLength(SNDValueBin, Length(SNDValue)); (* äëèíû        *)
  SetLength(RESValueBin, Length(FSTValue)); (* ìàññèâîâ     *)
Так всё работает, но обрезает строки
upd:
Работает опять не со всеми числами, но проблема в этих строках
pushl $0x18E3DF6B
call ICQ

Последний раз редактировалось russian-stalker; 04.12.2009 в 21:42.
russian-stalker вне форума Ответить с цитированием
Старый 05.12.2009, 06:37   #8
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Вообще, в таких случаях желательно врубать проверку ошибок на полную мощность.
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 05.12.2009, 10:04   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Код:
Inc(FSTValueBin[I + 1], 1);           (* и добавим это в           *)
при переносе ПОСЛЕДНЕГО (i=length(...))


не проще ли было бы организовать цикл вычислений без инвертирования
for i:=length(...) downto 0
....
Inc(FSTValueBin[I - 1], 1);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 05.12.2009, 10:21   #10
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

НАШЕЛ!!! Проблема была в этой строке (будь проклята моя невнимательность!):
Код:
 Inc(RESValueBin[I + 1], 1);
И теперь даже результат возвращает! Чу-де-са!
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача функции как параметра ezus Общие вопросы C/C++ 2 24.08.2009 10:19
Передача выражения функции (string) в переменную real Vohakisa Помощь студентам 3 12.05.2009 01:57
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57
Возврат результата функции по ссылке gladov Общие вопросы C/C++ 2 24.06.2008 22:48