fatal error и большое использование памяти при компиляции

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

fatal error и большое использование памяти при компиляции

Сообщение Drag » 03.03.2008 (Пн) 11:03

Приветствую всех. Извиняюсь, если такая тема уже была, но поиском найти ее не смог.
Проблема такая - при компиляции проекта VB, похоже, начинает использовать коллосальное количество оперативной памяти и файла подкачки, даже при повторной компиляции ему не хватило 3Гб файла подкачки. В конце концов VB выдает нечто вроде "unexpected error occured", а в тексте ошибки написано:
"C:\Documents and Settings\Admin\Мои документы\Мои программы\CommonUniverse\CurrentVersion\MainModule.bas(2817) : fatal error C1002: compiler is out of heap space in pass 2"

Строки 2814-2823 у меня выглядят вот так(указанная строка содержит лишь метку Bot0):
Код: Выделить всё
                        If Ship(b).WType(a2) > 0 Then
                            tmp = FindStationWithMaxResPrise(Ship(b).WType(a2), Ship(b).SectX, Ship(b).SectY, 3, IIf(tmp = 0, Ware(Ship(b).WType(a2)).MinPrise, (Ware(Ship(b).WType(a2)).MinPrise + Ware(Ship(b).WType(a2)).MaxPrise) / 2), Ship(b).RaceI, False)
                            If tmp > -1 Then
Bot0:
                                Call Ship(b).AddCommand(b, COMMAND_DOCK, tmp)
                                For tmp3 = 1 To 3
                                    If Station(tmp).ResType(tmp3) = Ship(b).WType(a2) Then Call Ship(b).AddCommand(b, COMMAND_CHECK_RES_PRISE, IIf(tmp = 0, Ware(Ship(b).WType(a2)).MinPrise, (Ware(Ship(b).WType(a2)).MinPrise + Ware(Ship(b).WType(a2)).MaxPrise) / 2), tmp3, 600)
                                Next
                                Call Ship(b).AddCommand(b, COMMAND_SELL, Ship(b).WType(a2), Ship(b).WCount(a2))
                                GoTo 732
...



Как думаете, от чего могла возникнуть такая ошибка? Она могла возникнуть из-за большого размера модуля(4176 строк), или большого размера самой подпрограммы(981 строка)? Или здесь проблема в чем-то другом?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.03.2008 (Пн) 11:57

Если бы мы еще смогли бы телепатически понять смысл приведенного куска, то цены бы нам не было
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.03.2008 (Пн) 12:03

Да, может.
Правда у меня есть проекты и больше, тысяч из восьми строк, но тем не менее рекомендуется разбивать проекты на не очень большие куски.
Lasciate ogni speranza, voi ch'entrate.

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Сообщение Drag » 03.03.2008 (Пн) 18:32

Viper
Извиняюсь, не думал, что это потребуется. Я просто хотел указать примерное положение проблемной строки. Должен признаться, вся моя программа явяется кошмаром для программиста :). Ну а смысл такой:
[syntax="vb"]If Ship(b).WType(a2) > 0 Then 'Если у корабля с индексом b есть товар с индексом a2
tmp = FindStationWithMaxResPrise(Ship(b).WType(a2), Ship(b).SectX, Ship(b).SectY, 3, IIf(tmp = 0, Ware(Ship(b).WType(a2)).MinPrise, (Ware(Ship(b).WType(a2)).MinPrise + Ware(Ship(b).WType(a2)).MaxPrise) / 2), Ship(b).RaceI, False) 'Найти станцию с максимальной ценой на ресурс Ship(b).WType(a2), начиная с сектора с координатами Ship(b).SectX, Ship(b).SectY, с максимальным количеством прыжков 3, с минимальной ценой в зависимости от заполненности трюма, принадлежащую расе Ship(b).RaceI, не включая дружественные расы
If tmp > -1 Then 'Если такая станция найдена
Bot0:
Call Ship(b).AddCommand(b, COMMAND_DOCK, tmp) 'приказать кораблю провести стыковку
For tmp3 = 1 To 3 'Начинаем просмотр ресурсов найденной станции
If Station(tmp).ResType(tmp3) = Ship(b).WType(a2) Then Call Ship(b).AddCommand(b, COMMAND_CHECK_RES_PRISE, IIf(tmp = 0, Ware(Ship(b).WType(a2)).MinPrise, (Ware(Ship(b).WType(a2)).MinPrise + Ware(Ship(b).WType(a2)).MaxPrise) / 2), tmp3, 600) 'если индекс данного ресурса соответствует нужному, то приказать кораблю после стыковки проверить цену на ресурс...
Next
Call Ship(b).AddCommand(b, COMMAND_SELL, Ship(b).WType(a2), Ship(b).WCount(a2)) 'После удачной проверки корабль должен продать ресурс станции
GoTo 732 'Завершить анализ действий данного корабля.[/syntax]

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

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Re: fatal error и большое использование памяти при компиляции

Сообщение Drag » 02.02.2009 (Пн) 18:02

В конце концов нашел источник проблемы. Оказалось, что компилятор зависал, пытаясь понять мою подпрограмму :). Смысл в том, что эта подпрограмма, в которой возникала такая ошибка, оказывалась слишком большой для компилятора.
Я не сплю, я перешел в режим замедленного функционирования.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList  
cron