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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2013, 05:16   #1
PhVG
 
Регистрация: 20.04.2011
Сообщений: 4
По умолчанию Перенос проги из Паскаля в Delphi, ошибка 216

Помогите! Не могу заставить работать на Delphi прогу. На TP7 работает без проблем, в Delphi 7 и во FreePascal выдает runtime error 216 (ошибка доступа к памяти). В проге используются динамические списки.

Вылетает вот на этой процедуре:

Цитата:
procedure sum1(p1,p2:u; var p_rez:u);
var
flag,i,t3,c1,max_stepen:integer;
start:u;
begin
c1:=1;
flag:=0;
if p1^.data.stepen>p2^.data.stepen then
max_stepen:=p1^.data.stepen
else
if p1^.data.stepen<p2^.data.stepen then
max_stepen:=p2^.data.stepen
else
max_stepen:=p1^.data.stepen;

for i:=0 to max_stepen do
begin
t3:=0;

if ((max_stepen-i)=p1^.data.stepen)and(p1<>nil) then
begin
t3:=t3+p1^.data.coeff;
p1:=p1^.next;

end;
if ((max_stepen-i)=p2^.data.stepen)and(p2<>nil) then
begin
t3:=t3+p2^.data.coeff;
p2:=p2^.next;

end;
if (t3<>0) then
begin
if flag=0 then
begin
new(p_rez);p_rez^.next:=nil;start:= p_rez;
p_rez^.data.coeff:=t3;
p_rez^.data.stepen:=max_stepen-i;
flag:=1;

end
else
begin
new(p_rez^.next);
p_rez:=p_rez^.next;
p_rez^.next:=nil;
p_rez^.data.coeff:=t3;
p_rez^.data.stepen:=max_stepen-i;

end;
end;
end;{End For}

p_rez:=start;
end;
PhVG вне форума Ответить с цитированием
Старый 26.02.2013, 06:37   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

1. А что за тип такой u. Это я так понимаю указатель на структуру, но какую?
2. Чтобы не было недоразумений, поясните логику суммирования.
3. Коль скоро речь идёт о динамических списках и ошибки доступа к памяти, то проблема может крыться вовсе не в самой процедуре sum1. Важно не только то, как обрабатываются динамические данные, но и как они создаются и инициализируются.
4. При работе с указателями проверки ссылок (p1 <> nil) нужно производить в первую очередь.
Код:
...
    if (p1 <> nil) and ((max_stepen - i) = p1^.data.stepen) then begin
...
И ещё желательно выполнить такие проверки в самом начале.
5.
Код:
...
  flag := 0;
  if p1^.data.stepen < p2^.data.stepen then
    max_stepen := p2^.data.stepen
  else
    max_stepen := p1^.data.stepen;
...
6. Если в теле процедуры есть
Код:
New(p_rez);
, то процедуру, во избежание утечек памяти, лучше оформить в виде функции. Как-то так:
Код:
function sum1 (p1, p2: u): u;
var
...
  start, p_rez: u;
begin
...
  Result := start;
end;
7. c1 ни где не используется.

Последний раз редактировалось Sibedir; 26.02.2013 в 06:40.
Sibedir вне форума Ответить с цитированием
Старый 26.02.2013, 14:32   #3
PhVG
 
Регистрация: 20.04.2011
Сообщений: 4
По умолчанию

Спасибо за подсказки, буду пробовать, о результатах напишу.
Вот сама прога, в TP7 она работает:
Вложения
Тип файла: rar 9.rar (1.6 Кб, 4 просмотров)
PhVG вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод проги из паскаля в ассемблер .:DEZ:. Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 26 12.06.2012 15:56
перенос на другую ПК проги sergey2501 БД в Delphi 1 26.10.2008 20:07
Перенос проги на другой комп VenMaster Общие вопросы Delphi 6 11.06.2008 09:16
Перенос проги с одного ПК на другой Azef Помощь студентам 2 13.05.2008 18:07
перенос с паскаля на си Ядовитый Общие вопросы C/C++ 2 29.06.2007 13:17