Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не правильно работает SetLength? [D7, WinXP]


Страницы:   1 2

kir86975 ©   (2009-06-04 11:44:00) 

у меня проблема... Не хочет работать процедура SetLength. Говорит, что якобы не хватает памяти либо в доступе к ячейке памяти отказано.
Вот фрагмент кода:

procedure Teaching(S:TMMVector); //ñîçäàíèå ñåòè
var i,j,k,x,y: integer; w: real;
begin
 SetLength(NetAr,0);
   //Length(S) - êîë-âî ñëî¸â
   //S[I] - êîë-âî íåéðîíîâ íà I ñëîå
 for i := 1 to Length(S) - 1 do //ïåðåáèðàåì Ñëîè
   begin
     SetLength(NetAr,i);
     x := S[i]; //êîëè÷åñòâî íåéðîíîâ
     y := S[i - 1]; //êîëè÷åñòâî ñâÿçåé ó êàæäîãî íåéðîíà ñ ïðåäûäóùèì ñëîåì
     for j := 1 to x do //ïåðåáèðàåì Íåéðîíû
       begin
         SetLength(NetAr[i - 1],j);
         Randomize;
         for k := 1 to y do //ïåðåáèðàåì Âåñà
           begin
             w := Random - Random;
             SetLength(NetAr[i - 1,j - 1],k);
             NetAr[i - 1,j - 1,k - 1] := w;
           end;
         SetLength(NetAr[i - 1,j - 1],y + 1);
         NetAr[i - 1,j - 1, y] := Random - Random; //çàïîìèíàåì çíà÷åíèå ñäâèãà w0
       end;
   end;
end;


Wadim005   (2009-06-04 16:18:00) [1]

попробуй не вот так
SetLength(NetAr,i);

а SetLength(NetAr,length(NetAr)+1);
так точно не прогадаешь, сколько тебе надо элементов

ну и т.д. по уровню массива


Sapersky   (2009-06-04 14:20:00) [2]

procedure Teaching(Const S:TMMVector);

Хотя нет, Const в данном случае не имеет значения. Т.е. его лучше оставить, так чуть быстрее, но с т.з. глючности без разницы.
Проблема с DLL в том, что у неё и проекта разные менеджеры памяти. Поэтому то, что выделено в DLL - должно быть освобождено в DLL, и для основного проекта так же.


kir86975   (2009-06-04 13:51:00) [3]

надо время чтобы внести во всю программу советуемые изменения... вечерее напишу что-то изменилось или нет ) спасибо за отзывчивость!


Игорь   (2009-06-04 13:47:00) [4]


> kir86975   (04.06.09 13:39) [28]
> вот что-то вроде этого я и ждал


Ладно уж давай домучаем тебя до конца, продолжай не стесняйся


kir86975   (2009-06-04 13:39:00) [5]

хорошо, спасибо большое... вот что-то вроде этого я и ждал


Sapersky   (2009-06-04 13:31:00) [6]

Не рекомендуется передавать в (возвращать из) DLL'ки дин. массивы, строки и прочие автоматически финализируемые типы. Хотя, если добавить Const, то должно работать нормально:
procedure Teaching(Const S:TMMVector);


Игорь   (2009-06-04 13:22:00) [7]

kir86975   (04.06.09 13:18) [25]

{ Important note about DLL memory management: ShareMem must be the
 first unit in your library's USES clause AND your project's (select
 Project-View Source) USES clause if your DLL exports any procedures or
 functions that pass strings as parameters or function results. This
 applies to all strings passed to and from your DLL--even those that
 are nested in records and classes. ShareMem is the interface unit to
 the BORLNDMM.DLL shared memory manager, which must be deployed along
 with your DLL. To avoid using BORLNDMM.DLL, pass string information
 using PChar or ShortString parameters. }


Пользуй WideString


kir86975   (2009-06-04 13:18:00) [8]

Еще кое-что уточню... Сначала программу с этой процедурой я писал в моей оболочке и все работало блестяще. Мне предложили сделать эту программу как часть другой, т.е. написать Длл-ку. Вот уже в Длл-ке этот алгоритм аварийно завершается из-за нехватки памяти... может быть кто-то сталкивался с таким при использовании SetLength???


kir86975   (2009-06-04 13:13:00) [9]

Sapersky, спс хорошая идея


Sapersky   (2009-06-04 13:04:00) [10]

Если заранее известно, сколько нужно выделять - то лучше это делать не в цикле, а перед циклом. Т.е. вместо

for i := 1 to Length(S) - 1 do begin
 SetLength(NetAr,i);

нужно написать

SetLength(NetAr, Length(S));
for i := 1 to Length(S) - 1 do begin

и все остальные SetLength исправить по тому же принципу.


Игорь   (2009-06-04 13:04:00) [11]


> Медвежонок Пятачок ©   (04.06.09 13:01) [21]


Логично Винипух


Медвежонок Пятачок   (2009-06-04 13:01:00) [12]

Ну чтобы памяти хватало ее выделение надо увеличить.

А чтобы денег в бюджете хватало, надо увеличить выделение денег из бюджета.

Так?


Медвежонок Пятачок   (2009-06-04 12:58:00) [13]

это Вы к чему???

SetLength выделяет память.

и если ты считаешь, что :

Ну чтобы памяти хватало ее выделение надо увеличить.

то надо увеличить число вызовов SetLength


Dennis I. Komarov   (2009-06-04 12:56:00) [14]

А может от REAL отказаться?


kir86975   (2009-06-04 12:55:00) [15]

Ну чтобы памяти хватало ее выделение надо увеличить.
>Увеличить количество вызовов SetLength
это Вы к чему???

ведь как раз выделение таким образом памяти требует памяти О_о


Медвежонок Пятачок   (2009-06-04 12:49:00) [16]

как увеличить количество выделяемой памяти?

А зачем ее увеличивать, если ее у тебя и так не хватает?
Надо уменьшать количество выделяемой памяти.


Медвежонок Пятачок   (2009-06-04 12:46:00) [17]

как увеличить количество выделяемой памяти?

Увеличить количество вызовов SetLength


brother   (2009-06-04 12:43:00) [18]

> как увеличить количество выделяемой памяти?

добавь мозгов


kir86975   (2009-06-04 12:42:00) [19]

как увеличить количество выделяемой памяти?


brother   (2009-06-04 12:41:00) [20]

> Не хочет работать процедура SetLength.

где именно?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо