Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Вниз

Почему не правильно работает SetLength?   Найти похожие ветки 

 
kir86975   (2009-06-04 11:44) [0]

у меня проблема... Не хочет работать процедура 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;


 
Медвежонок Пятачок ©   (2009-06-04 11:54) [1]

а ты верь тому, что оно тебе говорит.
оно правду говорит


 
Игорь ©   (2009-06-04 12:06) [2]


> Медвежонок Пятачок ©   (04.06.09 11:54) [1]


Говорит правду, но он не верит


 
kir86975   (2009-06-04 12:09) [3]

укажите что в коде не так?


 
Игорь ©   (2009-06-04 12:15) [4]


> kir86975   (04.06.09 12:09) [3]


NetAr, TMMVector что такое?


 
kir86975   (2009-06-04 12:20) [5]

NetAr: array of array of array of real;

TMMVector=array of integer;


 
brother ©   (2009-06-04 12:22) [6]

> NetAr: array of array of array of real;

О_о памяти говорит нет?)


 
kir86975   (2009-06-04 12:26) [7]

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

У меня эта процедура может отработать несколько раз, на какой-то n-ый раз все падает


 
brother ©   (2009-06-04 12:27) [8]

> на какой-то n-ый раз все падает

все верно, памяти нет)


 
Игорь ©   (2009-06-04 12:29) [9]


> kir86975   (04.06.09 12:26) [7]


Ну и флаг тебе в руки, не хочешь сам себе помочь, никто тебе не поможет


 
kir86975   (2009-06-04 12:38) [10]

...


 
kir86975   (2009-06-04 12:38) [11]

Элементы массива S не превышают 10-15 , самих элементов может быть 4-5


 
kir86975   (2009-06-04 12:39) [12]

неужели Delphi не хватает памяти на такой небольшой массивчик?


 
brother ©   (2009-06-04 12:41) [13]

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

где именно?


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

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


 
brother ©   (2009-06-04 12:43) [15]

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

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


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

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

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


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

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

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


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

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

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


 
Dennis I. Komarov ©   (2009-06-04 12:56) [19]

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


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

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

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

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

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

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


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

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

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

Так?


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


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


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


 
Sapersky   (2009-06-04 13:04) [23]

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

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 исправить по тому же принципу.


 
kir86975   (2009-06-04 13:13) [24]

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


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

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


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

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


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

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


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

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


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


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


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


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

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


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

procedure Teaching(Const S:TMMVector);

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


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

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

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

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.007 c
15-1242296673
Sergey Masloff
2009-05-14 14:24
2009.08.02
Ну вот и привет зрению... :(


10-1159243302
Думкин
2006-09-26 08:01
2009.08.02
OWC.SpreadSheet


15-1243813516
dmk
2009-06-01 03:45
2009.08.02
Популярная математика


3-1225220926
kile
2008-10-28 22:08
2009.08.02
sql server, оператор output и adoDataSet


15-1243863130
Пит
2009-06-01 17:32
2009.08.02
функция LoadStr





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский