Abnormal Termination Firebird 1.5.3.4870

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Valmir
Сообщения: 21
Зарегистрирован: 14 сен 2006, 10:59

Сообщение Valmir » 15 сен 2006, 12:01

хорошо, соглашусь метод старый и возможно из-за него косяк, переделал на такой вариант:

Код: Выделить всё

function CalcPrice(Formula: PChar; var PriceDiler, PriceIn, RateDiler,
    RateIn, RateOut, Coef: double; var PriceType: integer): Double;
  var
    KeyLen: Word;
    KeyStr: PChar;
    s: AnsiString;
  begin
    PriceDiler := PriceDiler*RateDiler;
    PriceIn := PriceIn*RateIn;
    case PriceType of
      -2: Result := PriceDiler*Coef;
      -3: Result := PriceIn*Coef;
      else
      begin
        KeyLen := PSmallInt(Formula)^;
        KeyStr := AllocMem(KeyLen + 1);
        Move((Formula + 2)^, KeyStr^, KeyLen);
        s := KeyStr;
        s := AnsiReplaceText(AnsiLowerCase(s), '[pricediler]', FloatToStr(PriceDiler));
        s := AnsiReplaceText(s, '[pricein]', FloatToStr(PriceIn));
        s := AnsiReplaceText(s, ',', '.');
        Result := CalcFunction(s, 0, 0, 0);
        FreeMem(KeyStr, KeyLen+1);
      end;
    end;
    Result := RoundReal(Result/RateOut, 2);
  end;

уж он то правильный или вы вобще против allocMem и Move? как тогда получить строку из PChar?

отладку я сделал в первую очередь (не настолько уж я зелен), но в том и проблема, что у меня эта отладка ничего не дает, все правильно работает

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 сен 2006, 12:02

как тогда получить строку из PChar?
читайте хелп по delphi.

тьфу, совсем забыл!!!! в декларации udf надо не varchar писать, а cstring!!!
у вас проблемы скорее всего из-за этого.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 15 сен 2006, 13:01

Да нет, варчаровскую структуру он более-менее приемлемо разбирает, но вот присваивание строке PChar-а меня напрягает.

Valmir
Сообщения: 21
Зарегистрирован: 14 сен 2006, 10:59

Сообщение Valmir » 15 сен 2006, 13:02

читайте хелп по delphi.
-дык это и есть способ, имея ссылку PChar получить строку, выделив память и сделав сдвиг на 2 байта
тьфу, совсем забыл!!!! в декларации udf надо не varchar писать, а cstring!!!
у вас проблемы скорее всего из-за этого.
что это изменит? всего лишь сдвиг не на 2, а на 1 байт
я не хочу показаться наглым или невежественным, но чем именно вам не нравиться allocmem, move, freemem? конкретно факты, почему могут произойти утечки памяти? если знаете другой способ, то предложите, а иначе как тогда можно утверждать, что такой метод не корректный

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 15 сен 2006, 13:18

Зачем вам вообще эта динамика раз уж работаете с AnsiString? Выкиньте ее нафиг и вместо allocate, move и KeyStr просто напишите

Код: Выделить всё

SetString(s, Formula+2, PShortInt(Formula)^);
Или если таки надумаете передавать через cstring,

Код: Выделить всё

SetString(s, Formula, strlen(Formula));

Valmir
Сообщения: 21
Зарегистрирован: 14 сен 2006, 10:59

Сообщение Valmir » 15 сен 2006, 13:41

To Dimitry: динамику сделал, т.к. не приходило в голову другого варианта, попробую Ваш первый вариант. Но почему-то думается, что сервак падает не из-за этого....

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 сен 2006, 22:26

Но почему-то думается, что сервак падает не из-за этого....
гм, ну тогда думайте. идите к гадалке, пусть на сервер приворот наложит.
я вообще не понимаю, что тут гадать. взял, переписал, положил новую udf, проверил.

Ответить