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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2010, 10:15   #1
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию Процедура с изменяемым параметром

Собственно не уверен, в это ли проблема...
В общем пишу статью по длинную арифметику. В процедуре умножения используется классический способ - столбиком. А в ней вызывается процедура беззнакового сложения такого вот вида:
Код:
AddNonC(Dop, Res, Res);
Объявлена она следующим образом:
Код:
// Сложение без учета знака
procedure AddNonC (Op1, Op2: TBigNum; var Res: TBigNum);
Вызывается она в цикле и после последнего выхода из данной процедуры программа вываливается в 'Invalid pointer operation', что не может радовать. Индексы и параметры я проверил - для умножения специально предусмотрен еще один незначащий разряд, чтобы ошибки не возникало. Предполагаю, что дело в том, что я использую одну и ту же структуру в вызове процедуры дважды - первый раз для чтения, а второй раз для ее же модификации. В чем может быть дело? Я вызывал данную процедуру с данными параметрами самостоятельно - подсчет выполняется без проблем...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 26.11.2010, 10:53   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вызывается она в цикле и после последнего выхода из данной процедуры программа вываливается в 'Invalid pointer operation',
пример тестовой программы дайте, чтобы можно было пощупать в отладке, где именно эта ошибка возникает...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2010, 10:55   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Могу скинуть все библиотеку - там много зависимых функций в двух юнитах.
Вложения
Тип файла: rar Длинные числа.rar (183.5 Кб, 9 просмотров)
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

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

Если я правильно понял, то:
Цитата:
AddNonC(Dop, Res, Res);

Объявлена она следующим образом:
Код:


// Сложение без учета знака
procedure AddNonC (Op1, Op2: TBigNum; var Res: TBigNum);
Два результата, а возможность возврата (Var) только у одной переменной. Да и вообще, грешно такие вещи через стеки гонять, я бы везде Var проставил.

P.S. попробуйте возвращать не измененный RES типа RES := RES + DOP, а еще одну копию как третью переменную. Т.е. создать новую переменную с нуля (NEW := RES + DOP) и заполнить результатом.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 26.11.2010 в 11:08.
Alex Cones вне форума Ответить с цитированием
Старый 26.11.2010, 12:56   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Alex Cones Посмотреть сообщение
Два результата, а возможность возврата (Var) только у одной переменной. Да и вообще, грешно такие вещи через стеки гонять, я бы везде Var проставил.
Нет, результат один, просто я пытался съэкономить на одной структуре . Если Вы помните - то в результате умножения столбиком нужно умножать первое число на разряды второго, а потом сложить все это свинство. Только я складывал сразу, чтобы не организовывать второй цикл.
Цитата:
P.S. попробуйте возвращать не измененный RES типа RES := RES + DOP, а еще одну копию как третью переменную. Т.е. создать новую переменную с нуля (NEW := RES + DOP) и заполнить результатом.
Попробовал, увы проблема осталась.... Делал следующим образом, копировал Res в новую структуру и в сложение участвовала три параметра, но видно не судьба . Но кроме того, так еще и не очень хорошо с теоретической точки зрения. Числа-то должны учавствовать большие, а это чревато сотнями разрядов (байтов) в параметрах даннхы процедур. Поэтому каждая промежуточная переменная такого типа как серпом по яй....
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 26.11.2010, 13:32   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Могу скинуть все библиотеку - там много зависимых функций в двух юнитах.
Едрит


Код:
    GetBigNum('811.11,118', x);
    GetBigNum('486,66670.8', y);
Скушала
Дальше смотреть мало желания.

Мой совет, как любитель любителю: Пишите заново.

P.S.: Что значит
Цитата:
Код:
  Left: Array of Byte;      // Левая часть последовательности
  Rigth: Array of Byte;     // Правая часть последовательности
?
Sibedir вне форума Ответить с цитированием
Старый 26.11.2010, 13:42   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Едрит


Код:
    GetBigNum('811.11,118', x);
    GetBigNum('486,66670.8', y);
Скушала
Дальше смотреть мало желания.
И напрасно. Во-первых, не доделано. Во-вторых, если вы заметили, то GetBigNum не процедура, а функция, которая возвращает TRUE в случае если число можно скушать и соответственно False, если нет. Вы проверяли, точно скушала?

Цитата:
Мой совет, как любитель любителю: Пишите заново.
Нет уже. У меня есть арифметика на строках, я хочу так . И заново и ёж сможет, а вот имеющееся хозяйство до ума довести, здесь нужен стальной стержень, кремень, каменное сердце и т.д.

Цитата:
P.S.: Что значит
Это некая структура данных, вспомогательная - удобно при работе с такой бедой как длинные числа. Вкратце: нефикисрованные числа обладают крайне неприятным для меня свойством, а именно могут в результате различных операций увеличиваться в обе стороны - как в сторону увеличения целой части, так и в сторону увеличения дробной. Ничего более умного я не придумал как создать новую структуру, которая бы решала эту проблему. Просто обидно, да - динамический массив увеличивается только в одну сторону, но если их головами соединить, то получится фигня которую можно двигать и туда и сюда . Надеюсь внятно обрисовал ситуацию.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 26.11.2010, 13:51   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Лан, убедил, покопаюсь.

Кстати:
У меня была такая фигня 'Invalid pointer operation'. Помог перевод проекта на D2010.
http://www.programmersforum.ru/showthread.php?t=113506
Sibedir вне форума Ответить с цитированием
Старый 26.11.2010, 14:01   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Спасибо гляну. Кстати, превидя вопрос - в Left данные хранятся задом наперед. Так чисто на всякий случай...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 30.11.2010, 10:57   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Нашел причину - была в зависимых функциях. Проблема в обращении к несуществующему элементу динамического массива. Была операция вида массив[длина_массива-a], причем а могло принимать значение нуль.
Sibedir, возможно в Вашем случае была аналогичная причина.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедура с параметром динамическим массивом. VintProg Общие вопросы Delphi 12 11.06.2010 13:12
задача с параметром for bonys91 Помощь студентам 4 01.04.2009 11:35
Цикл с параметром DaniyMilner Общие вопросы C/C++ 5 11.03.2009 20:09
поиск с параметром? Alexi БД в Delphi 3 09.03.2009 17:10
Запрос с параметром odi_noki Microsoft Office Access 2 17.12.2008 20:07