Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

StackOverflowException [C#, WinXP]


как - то так   (20.07.08 22:21

Есть dll сборка, в ней класс, в нем метод, метод начинается с:
Move[] mv = new Move[50];
Муви - это класс из то же сборки. В нём 8 однобайтовых полей, конструктор и всё.
Так вот, вызываю метод из приложения, и приложение вываливается с сообщением о переполнении стека. VS показывает как раз на строку Move[] mv = new Move[50];
Реурсии нигде не используется.
В чём может быть проблема?
P.S. сделал консольку, в ней пишу:
static void Main(string[] args)
       {
           Move[] mv = new Move[10000];
           Console.WriteLine("OK");
           Console.ReadKey();
      }
Все работает...


boa_kaa ©   (21.07.08 00:52[1]

а код-то можно увидеть?
или секрет страшный?


как - то так   (21.07.08 02:44[2]

Код не секретный, но страшный :)

Тут странная история: библиотеку компилирую сам, кидаю в  папку к компонену (тоже сам пишу)(библиоткеку к компоненту добавил через Add reference). Постоянно изменяю что - то в библиотеке, и кидаю снова к компоненту.
Компилирую компонент, запускаю в дебаг режиме - при определеных условиях (вызов метода из библиотеки, который еще 6 методов вызывает) вываливается, причём в студии (VS2008) открывается код библиотеки, и желтым выделяется строка (с подпсью анхендлед стек оверфлоу эксепшн). Раньше выделялась та, что выше привёл, а сейчас - фигурная скобочка в начале совсем другого метода (я тот код преписал, без массива, так что дело не в нем). (вообще, если вставить на место скобки строку "//Здесь был Вася" - выделится она)

Получается, когда компилирую компонент, студия берет код не из последней библиотеки, а откуда - то из старого(откуда?).

Почитал что нашел по компиляции дотнета (под рукой только Рихтер и гугл), ответа на вопрос не нашел.
Код не привожу, там больше 1000 строк

P.S. рекурсии все - еще нигде в коде нет


b z   (21.07.08 10:41[3]


> библиотеку компилирую сам, кидаю в  папку к компонену (тоже
> сам пишу)(библиоткеку к компоненту добавил через Add reference)
Зачем кидать? Укажите в свойствах reference копировать локально.
Брать может из кэша, но такие случаи очень редки, и то часто в следствии именного "ручного" вмешательства, пробуйте не мешать студии.


boa_kaa ©   (21.07.08 13:18[4]

а библиотека в сольюшене?


Как - то так   (21.07.08 14:20[5]

Да, в солюшене.
Впрочем, с библиотекой разобрался.
Эксепшн вываливается вот на этом месте:
private Move MoveGen(SByte fx, SByte fy, SByte px, SByte py)
       {
          Move m = new Move()

метод вызывается много раз подряд (от 1 до примерно 100 в зависимости от доп. условий). Я так понимаю объект m не успевает уничтожиться сборщиком мусора.
Но как - то наследовать класс Move от CriticalFinalizerObject и IDisposable не хочется (накладные расходы, класс простой и этот код должен максимально быстро работать). Может, есть другой способ?


Как - то так   (21.07.08 14:41[6]

сделал Move : IDisposable, засунул в using. Все - равно ексепшн появляется...


boa_kaa ©   (21.07.08 19:27[7]


> private Move MoveGen(SByte fx, SByte fy, SByte px, SByte
> py)        {           Move m = new Move()метод вызывается
> много раз подряд (от 1 до примерно 100 в зависимости от
> доп. условий). Я так понимаю объект m не успевает уничтожиться
> сборщиком мусора.

нет, здесь нет ошибки
она возникает в другом месте
и сборщик мусора здесь не причем


clickmaker ©   (22.07.08 09:27[8]

> Move m = new Move()

а после этого что?


Как - то так   (22.07.08 16:18[9]

после этого много присвоений открытым полям m значений, и reurn m; Там ошибки тоже нет.

Перенес классы в консольное приложение, стек оверфлоу возникает теперь:
private Boolean FieldAttacked(SByte x, SByte y, Boolean white)  
       {
           SByte i, Yd;

в поле local написано:  
i  Cannot obtain value of local or argument 'i' as it is not available at this instruction pointer, possibly because it has been optimized away. sbyte

То же самое про Yd;
Что это за ошибка?

И еще: this равно null. Так должно быть?


b z   (23.07.08 09:31[10]


> стек оверфлоу возникает теперь
Может уже пора прочитать про этот злополучный "стек оверфлоу", и сделать соотв. выводы?


Как - то так   (25.07.08 13:46[11]


> Может уже пора прочитать про этот злополучный "стек оверфлоу",
>  и сделать соотв. выводы?


Так и зделал. Помогло. Всем спасибо за внимание


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо