Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нехватка памяти в куче, Error 203: Heap overflow error. 
V
    Опции темы
bullvinkle
Дата 24.12.2008, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



Написал программу. Пока что она просто сортирует один и то же набор тестовых записей разными способами сортировки, и разным количеством элементов.
Но возникает ошибка. В хелпе почитал, советы. Которые понял  - те сделал, но ошибка та же.
Плюс ко всему я еще планирую туда добавить еще один метод, который будет, как и все остальные, выполняться три раза. И еще надо засекать время выполнения каждого метода. Вобщем еще не конец, а уже проблемы.
Что Вы мне можете посоветовать в этом случае?

Код

type words = record
       number: word;
       word: string[20];
  end;
var  T:words;
     a: array [1..1500,1..9] of ^ words;
     f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11:text;
     ch:char;
     s,str1, str2, min: string;
     c,i,n,j,l,p,kol,ww,q,imin,u:integer;
BEGIN
assign(f2, 'd:\2.txt');
reset(f2);
assign(f3, 'd:\3.txt');
rewrite(f3);
assign(f4, 'd:\4.txt');
rewrite(f4);
assign(f5, 'd:\5.txt');
rewrite(f5);
assign(f6, 'd:\6.txt');
rewrite(f6);
assign(f7, 'd:\7.txt');
rewrite(f7);
assign(f8, 'd:\8.txt');
rewrite(f8);
assign(f9, 'd:\9.txt');
rewrite(f9);
assign(f10, 'd:\10.txt');
rewrite(f10);
assign(f11, 'd:\11.txt');
rewrite(f11);
s:='';
p:=0;
i:=0;
writeln(memavail);

for i:=1 to 1500 do
    for j:=1 to 9 do new(a[i,j]);
{======================Заносим слова в масив=============================}
for j:=1 to 9 do begin
 reset(f2);
 while not eof(f2) do begin
 readln(f2,s);
 inc(p);
 a[p,j]^.word:=s;
 a[p,j]^.number:=p;
 end;
 end;

{=================СОРТИРОВКА ВЫБОРОМ==========================}


    {количество элементов  =  500}
  j:=1;
for i:=1 to 499 do begin

  min:=a[i,j]^.word;
  imin:=i;
   for p:=i+1 to 500 do
       if a[p,j]^.word<min then
       begin
            min:=a[p,j]^.word;
              imin := p;
           end;
       a[imin,j]:=a[i,j];
      a[i,j]^.word:=min;
      a[i,j]^.number:=imin;
     end;

      {количество элеменов = 1000}

  j:=2;
for i:=1 to 999 do begin

  min:=a[i,j]^.word;
  imin:=i;
   for p:=i+1 to 1000 do
       if a[p,j]^.word<min then
       begin
            min:=a[p,j]^.word;
              imin := p;
           end;
       a[imin,j]:=a[i,j];
      a[i,j]^.word:=min;
      a[i,j]^.number:=imin;
     end;

   {количество элементов = 1500}


 j:=3;
for i:=1 to 1499 do begin

  min:=a[i,j]^.word;
  imin:=i;
   for p:=i+1 to 1500 do
       if a[p,j]^.word<min then
       begin
            min:=a[p,j]^.word;
              imin := p;
           end;
       a[imin,j]:=a[i,j];
      a[i,j]^.word:=min;
      a[i,j]^.number:=imin;
     end;

{============================СОРТИРОВКА ПУЗЫРЬКОВАЯ=========================}

      {количество элементов = 500}


     j:=4;
 for i:=500 downto 2 do
    for u:=1 to 499 do begin

     if (a[u,j]^.word < a[u+1,j]^.word) then begin
        T.word:=a[u,j]^.word;  T.number:=a[u,j]^.number;
        a[u,j]:=a[u+1,j];
        a[u,j]^.word:=t.word;   a[u,j]^.number:=t.number;

      end;  end;

      {количество элементов = 1000  }


      j:=5;
 for i:=100 downto 2 do
    for u:=1 to 500 do begin

     if (a[u,j]^.word < a[u+1,j]^.word) then begin
        T.word:=a[u,j]^.word;  T.number:=a[u,j]^.number;
        a[u,j]:=a[u+1,j];
        a[u,j]^.word:=t.word;   a[u,j]^.number:=t.number;
      end;  end;
      {количество элементов = 1500 }

      j:=6;
 for i:=1500 downto 2 do
    for u:=1 to 1499 do begin

     if (a[u,j]^.word < a[u+1,j]^.word) then begin
        T.word:=a[u,j]^.word;  T.number:=a[u,j]^.number;
        a[u,j]:=a[u+1,j];
        a[u,j]^.word:=t.word;   a[u,j]^.number:=t.number;
      end;  end;

{===========================СОРТИРОВКА ВСТАВКАМИ===========================}
       {количество элементов = 500}

       j:=7;
        for p:=2 to 500 do begin
  T.word:=a[u,j]^.word;  T.number:=a[u,j]^.number;
  ww:=p-1;

   while (ww>0) and (T.word > a[ww,j]^.word) do begin
    a[ww+1,j] := a[ww,j]; dec(ww);
   end;
   a[u,j]^.word:=t.word;   a[u,j]^.number:=t.number;
 end;

      {количество элементов = 1000}
       j:=8;
       for p:=2 to 1000 do begin
  T.word:=a[u,j]^.word;  T.number:=a[u,j]^.number;
  ww:=p-1;

   while (ww>0) and (T.word > a[ww,j]^.word) do begin
    a[ww+1,j] := a[ww,j]; dec(ww);
   end;
   a[u,j]^.word:=t.word;   a[u,j]^.number:=t.number;
 end;
     {количество элементов = 1500}
      j:=9;
      for p:=2 to 1500 do begin
  T.word:=a[u,j]^.word;  T.number:=a[u,j]^.number;
  ww:=p-1;

   while (ww>0) and (T.word > a[ww,j]^.word) do begin
    a[ww+1,j] := a[ww,j]; dec(ww);
   end;
   a[u,j]^.word:=t.word;   a[u,j]^.number:=t.number;
 end;
{===============================ВЫВОД======================================}
for p:=1 to 500 do writeln(f3,a[p,1]^.word,'   ',a[p,1]^.number);
for p:=1 to 1000 do writeln(f4,a[p,2]^.word,'   ',a[p,2]^.number);
for p:=1 to 1500 do writeln(f5,a[p,3]^.word,'   ',a[p,3]^.number);
for p:=1 to 500 do writeln(f6,a[p,4]^.word,'   ',a[p,4]^.number);
for p:=1 to 1000 do writeln(f7,a[p,5]^.word,'   ',a[p,5]^.number);
for p:=1 to 1500 do writeln(f8,a[p,6]^.word,'   ',a[p,6]^.number);
for p:=1 to 500 do writeln(f9,a[p,7]^.word,'   ',a[p,7]^.number);
for p:=1 to 1000 do writeln(f10,a[p,8]^.word,'   ',a[p,8]^.number);
for p:=1 to 1500 do writeln(f11,a[p,9]^.word,'   ',a[p,9]^.number);
close(f4);
close(f5);
close(f6);
close(f7);
close(f8);
close(f9);
close(f10);
close(f11);
close(f2);
close(f3);
  END.


П.С. Я чет представить себе не могу, как создают огромные проекты, если даже на такой учебной программе уже не хватает памятиsmile


Это сообщение отредактировал(а) bullvinkle - 24.12.2008, 23:13
PM MAIL ICQ   Вверх
volvo877
Дата 25.12.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(bullvinkle @  24.12.2008,  21:37 Найти цитируемый пост)
Вобщем еще не конец, а уже проблемы.
У тебя проблемы - вообще в самом начале:

Код
{======================Заносим слова в масив=============================}
for j:=1 to 9 do begin
  reset(f2);
  while not eof(f2) do begin
    readln(f2,s);
    inc(p);
    a[p,j]^.word:=s; { <--- Вот тут еще проблемка-то заложена }
    a[p,j]^.number:=p;
  end;
end;

Будет у тебя в файле больше, чем 1500/9 = 166 строк - вылетишь за пределы массива, потому что P - накапливается, или (если отключен Range Check) - просто будешь портить содержимое соседних переменных. В любом случае - веры результатам нет никакой. Приведи свой файл 2.txt, кстати...
PM MAIL   Вверх
bullvinkle
Дата 25.12.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



У меня в файле 2.тхт 1500 строк. Я все же не могу понять, почему не может быть более 166. У меня в файле 1500 строк и в каждой строчке массива 1500 элементов. Вроде все сходится.
Внизу мой файл 2.тхт.

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  2.TXT 11,01 Kb
PM MAIL ICQ   Вверх
bullvinkle
Дата 26.12.2008, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



Оставил от программы всего лишь вот такой код
Код

type words = record
       number: word;
       word: string[20];
  end;
var  T:words;
     a: array [1..1500,1..9] of ^ words;
     f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11:text;
     ch:char;
     s,str1, str2, min: string;
     c,i,n,j,l,p,kol,ww,q,imin,u:integer;
BEGIN

writeln(memavail);
for i:=1 to 1500 do
    for j:=1 to 9 do new(a[i,j]);
writeln(memavail);
readln;
  END.

все равно ошибка та же.
Неужели надо искать другой подход к решению задачи?
PM MAIL ICQ   Вверх
volvo877
Дата 26.12.2008, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(bullvinkle @  26.12.2008,  01:18 Найти цитируемый пост)
все равно ошибка та же.
У тебя что-то не в порядке с системой, либо Паскаль глючит и компилирует так, что при запуске выбивает ошибку, либо виртуальная машина, под которой это все крутится, сбоит, либо память... Потому что и твой первый код (на файле длиной 150 строк), и второй прекрасно отрабатывают... Скриншот - в аттаче...

Теперь насчет:
Цитата(bullvinkle @  25.12.2008,  18:39 Найти цитируемый пост)
Я все же не могу понять, почему не может быть более 166. У меня в файле 1500 строк и в каждой строчке массива 1500 элементов. Вроде все сходится.
Ничего не сходится... У тебя P изменяется от 0 до скольки? Ну, записал ты 1500 строк при J = 1, перешел на J = 2, переоткрыл файл, увеличил значение P (не забыл, после прочтения всего файла оно у тебя равно 1500), попытался записать прочитанную строку в ячейку A[1501, 2], получил выход за пределы массива, вылетел... Так понятнее? При переоткрытии файла P обнулять не пробовал?

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  memavail.PNG 15,56 Kb
PM MAIL   Вверх
bullvinkle
Дата 26.12.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



Спасибо, действительно не правильно добавлял слова в массив.
Но ошибка с переполнением возникает как у меня дома, так и в универе. Видимо надо как то по-особенному настроить паскаль. Может кто знает?
Задачу уже решил чуть другим способом и сдал.
Может кому по учебе надо ("Проведение вычислительных экспериментов с алгоритмами внутренней сортировки"), или просто интересно, вот код (правда время не всегда показывает как надо):

Код

uses dos;
type words = record
       number: word;
       word: string[20];
  end;
var  T:words;
     a: array [1..1500] of words;
     f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11:text;
     ch:char;
     s,str1, str2, min: string;
     c,i,n,j,l,p,kol,ww,q,imin,u:integer;
     time,time1,time2,tmptime:real;
     e1,e2,e3,e4,o1,o2,o3,o4:word;
     z:integer;
BEGIN
writeln('--------------------------------------------');
writeln('   Метод   |   500   |   1000   |   1500   |');
writeln('--------------------------------------------');
assign(f2, 'd:\2.txt');
reset(f2);
assign(f3, 'd:\3.txt');
rewrite(f3);
assign(f4, 'd:\4.txt');
rewrite(f4);
assign(f5, 'd:\5.txt');
rewrite(f5);
assign(f6, 'd:\6.txt');
rewrite(f6);
assign(f7, 'd:\7.txt');
rewrite(f7);
assign(f8, 'd:\8.txt');
rewrite(f8);
assign(f9, 'd:\9.txt');
rewrite(f9);
assign(f10, 'd:\10.txt');
rewrite(f10);
assign(f11, 'd:11.txt');
rewrite(f11);
s:='';
p:=0;
i:=0;
time1:=0;
time2:=0;
{======================Заносим слова в масив=============================}
 reset(f2);
 while not eof(f2) do begin
 readln(f2,s);
 inc(p);
 a[p].word:=s;
 a[p].number:=p;
 end;
{=================СОРТИРОВКА ВЫБОРОМ==========================}
time:=0;
    {количество элементов  =  500}
for z:=1 to 30 do begin
settime(0,0,0,0);
for i:=1 to 499 do begin

  min:=a[i].word;
  imin:=i;
   for p:=i+1 to 500 do
       if a[p].word<min then
       begin
            min:=a[p].word;
              imin := p;
           end;
       a[imin]:=a[i];
      a[i].word:=min;
      a[i].number:=imin;
     end;
gettime(e1,e2,e3,e4);
tmptime:=(e3*100+e4)/100;
time:=time+tmptime;
end;
for p:=1 to 500 do writeln(f3,a[p].word,'   ',a[p].number);
      {количество элеменов = 1000}
  {======================Заносим слова в масив=============================
 close(f2);                                                                }
 reset(f2);
 p:=0;s:='';
 while not eof(f2) do begin
 readln(f2,s);
 inc(p);
 a[p].word:=s;
 a[p].number:=p;
 end;
for z:=1 to 30 do begin
settime(0,0,0,0);
for i:=1 to 999 do begin

  min:=a[i].word;
  imin:=i;
   for p:=i+1 to 1000 do
       if a[p].word<min then
       begin
            min:=a[p].word;
              imin := p;
           end;
       a[imin]:=a[i];
      a[i].word:=min;
      a[i].number:=imin;
     end;
gettime(e1,e2,e3,e4);
tmptime:=(e3*100+e4)/100;
time1:=time1+tmptime;
end;
for p:=1 to 1000 do writeln(f4,a[p].word,'   ',a[p].number);
   {количество элементов = 1500}
 {======================Заносим слова в масcив=============================}
 p:=0; s:='';
 reset(f2);
 while not eof(f2) do begin
 readln(f2,s);
 inc(p);
 a[p].word:=s;
 a[p].number:=p;
 end;
for z:=1 to 30 do begin
settime(0,0,0,0);
for i:=1 to 1499 do begin
  min:=a[i].word;
  imin:=i;
   for p:=i+1 to 1500 do
       if a[p].word<min then
       begin
            min:=a[p].word;
              imin := p;
           end;
       a[imin]:=a[i];
      a[i].word:=min;
      a[i].number:=imin;
     end;
gettime(e1,e2,e3,e4);
tmptime:=(e3*100+e4)/100;
time2:=time2+tmptime;
end;
writeln('   Выбор   |  ',time:3:2,'   |   ',time1:3:2,'  |   ',time2:3:2,'   |');
time:=0; time1:=0; time2:=0;
for p:=1 to 1500 do writeln(f5,a[p].word,'   ',a[p].number);
{============================СОРТИРОВКА ПУЗЫРЬКОВАЯ=========================}
      {количество элементов = 500}
 {======================Заносим слова в масив=============================}
 p:=0; s:='';
 reset(f2);
 while not eof(f2) do begin
 readln(f2,s);
 inc(p);
 a[p].word:=s;
 a[p].number:=p;
 end;
 for z:=1 to 30 do begin
 settime(0,0,0,0);
 for i:=500 downto 2 do
    for u:=1 to 499 do begin
     if (a[u].word > a[u+1].word) then begin

        T:=a[u];
        a[u]:=a[u+1];
        a[u+1]:=t;
      end;  end;
gettime(e1,e2,e3,e4);
tmptime:=(e3*100+e4)/100;
time:=time+tmptime;
end;
for p:=1 to 500 do writeln(f6,a[p].word,'   ',a[p].number);
      {количество элементов = 1000  }
 {======================Заносим слова в масив=============================}
 p:=0; s:='';
 reset(f2);
 while not eof(f2) do begin
 readln(f2,s);
 inc(p);
 a[p].word:=s;
 a[p].number:=p;
 end;
 for z:=1 to 30 do begin
 settime(0,0,0,0);
 for i:=100 downto 2 do
    for u:=1 to 500 do begin
     if (a[u].word > a[u+1].word) then begin
        T:=a[u];
        a[u]:=a[u+1];
        a[u+1]:=t;
      end;  end;
      gettime(e1,e2,e3,e4);
tmptime:=(e3*100+e4)/100;
time1:=time1+tmptime;
end;
for p:=1 to 1000 do writeln(f7,a[p].word,'   ',a[p].number);
      {количество элементов = 1500 }
 {======================Заносим слова в масив=============================}
 p:=0; s:='';
 reset(f2);
 while not eof(f2) do begin
 readln(f2,s);
 inc(p);
 a[p].word:=s;
 a[p].number:=p;
 end;
 for z:=1 to 30 do begin
 settime(0,0,0,0);
 for i:=1500 downto 2 do
    for u:=1 to 1499 do begin
     if (a[u].word > a[u+1].word) then begin
       T:=a[u];
        a[u]:=a[u+1];
        a[u+1]:=t;
      end;  end;
gettime(e1,e2,e3,e4);
tmptime:=(e3*100+e4)/100;
time2:=time2+tmptime;
end;
for p:=1 to 1500 do writeln(f8,a[p].word,'   ',a[p].number);
writeln(' Пузырек   |  ',time:3:2,'   |   ',time1:3:2,'  |   ',time2:3:2,'   |');
{===========================СОРТИРОВКА ВСТАВКАМИ===========================}
   time:=0; time1:=0; time2:=0;
       {количество элементов = 500}
  {======================Заносим слова в масив=============================}
 p:=0;s:='';
 reset(f2);
 while not eof(f2) do begin
 readln(f2,s);
 inc(p);
 a[p].word:=s;
 a[p].number:=p;
 end;
 for z:=1 to 30 do begin
 settime(0,0,0,0);
        for p:=2 to 500 do begin
  T:=a[p];
  j:=p-1;
   while (j>0) and (T.word < a[j].word) do begin
    a[j+1] := a[j]; dec(j);
   end;
   a[j+1]:=t;
 end;
 gettime(e1,e2,e3,e4);
tmptime:=(e3*100+e4)/100;
time:=time+tmptime;
end;
 for p:=1 to 500 do writeln(f9,a[p].word,'   ',a[p].number);
  {======================Заносим слова в масив=============================}
 p:=0; s:='';
 reset(f2);
 while not eof(f2) do begin
 readln(f2,s);
 inc(p);
 a[p].word:=s;
 a[p].number:=p;
 end;      {количество элементов = 1000}
 for z:=1 to 30 do begin
 settime(0,0,0,0);
        for p:=2 to 1000 do begin
  T:=a[p];
  j:=p-1;
   while (j>0) and (T.word < a[j].word) do begin
    a[j+1] := a[j]; dec(j);
   end;
   a[j+1]:=t;
 end;
 gettime(e1,e2,e3,e4);
tmptime:=(e3*100+e4)/100;
time1:=time1+tmptime;
end;
for p:=1 to 100 do writeln(f10,a[p].word,'   ',a[p].number);
     {количество элементов = 1500}
 {======================Заносим слова в масив=============================}
 p:=0;s:='';
 reset(f2);
 while not eof(f2) do begin
 readln(f2,s);
 inc(p);
 a[p].word:=s;
 a[p].number:=p;
 end;
 for z:=1 to 30 do begin
 settime(0,0,0,0);
           for p:=2 to 500 do begin
  T:=a[p];
  j:=p-1;
   while (j>0) and (T.word < a[j].word) do begin
    a[j+1] := a[j]; dec(j);
   end;
   a[j+1]:=t;
 end;
 gettime(e1,e2,e3,e4);
tmptime:=(e3*100+e4)/100;
time2:=time2+tmptime;
end;
 for p:=1 to 1500 do writeln(f11,a[p].word,'   ',a[p].number);
writeln(' Вставка   |  ',time:3:2,'   |   ',time1:3:2,'  |   ',time2:3:2,'    |');
{===============================ВЫВОД======================================}
writeln('---------------------------------------------------------------');
close(f4);
close(f5);
close(f6);
close(f7);
close(f8);
close(f9);
close(f10);
close(f11);
close(f2);
close(f3);
writeln('memavail');
readln;
  END.


PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.