Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 699

Раздел: C++
/ вопрос открыт /

Здравствуйте, эксперты!

Сегодня вылезла ошибка "Acess violation.." при попытке добавить строку в Memo или сообщение в StatusBar.
Хотя вчера все было Ок.
Комментирую одну строку, вылетает на следующей. В чем может быть дело?
C++Builder2007

Muratov Radik Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 27 января 2010, 11:10
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 28; последнее сообщение — 28 января 2010, 10:52; участников в обсуждении: 4.

Страницы: [1] [2] [Следующая »]

Егор

Егор (статус: 10-ый класс), 27 января 2010, 11:22 [#1]:

у меня друг есть, он телепат. но как раз сегодня в отпуск уехал...

код давай, как мы тебе ответим, если кода не видим?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 27 января 2010, 11:27 [#2]:

классический ответ звучит так - ошибка в 17 строке. Потому что никаких исходников не было предоставлено.

В целом, может быть что угодно - от расстрела памяти в одном месте до передачи мертвого указателя.
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 27 января 2010, 11:42 [#3]:

block1 - Объект того самого класса, создан через new, и туда записаны данные
Код обычный:
readMemo->Lines->Add("Выводим Таблицу №"+IntToStr(block1->StartAddr));
for(j=0; j<block1->Size; j++)
{
  tmpStr.sprintf("0x%x", block1->Data[j]);
  readMemo->Lines->Add("["+IntToStr(j)+"] = " + tmpStr);
 } 
 }
 MainStatusBar->Panels->Items[0]->Text = "Вывод завершен!";
Muratov Radik

Muratov Radik (статус: Посетитель), 27 января 2010, 11:44 [#4]:

Таких кусков соответственно по кол-ву block-ов. И вылетает именно на обращении к Memo или StatusBar.
Егор

Егор (статус: 10-ый класс), 27 января 2010, 12:04 [#5]:

как создаются объекты? приведи строчку с new
и коструктор тоже приведи
что-то похоже, что у тебя объект не создаётся (или неправильно создаётся)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
min@y™

min@y™ (статус: Доктор наук), 27 января 2010, 12:14 [#6]:

Попробуй убрать tmpStr.sprintf("0x%x", block1->Data[j]), а вот это readMemo->Lines->Add("[" + IntToStr(j) + "] = " + tmpStr) заменить на readMemo->Lines->Add("[" + IntToStr(j) + "] = 0x" + IntToHex(block1->Data[j], 0)) и посмотреть, что получится.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Muratov Radik

Muratov Radik (статус: Посетитель), 27 января 2010, 12:19 [#7]:

создание:
 block1 = new TMemoryBlock();
 block1->StartAddr = 0;
 block1->Size = 986;
 block1->InitData(0);

Конструктор
TMemoryBlock::TMemoryBlock()
{
 // конструктор пустой, не знаю что туда писать,
 
}
//---------------------------------------------------------------------------
void TMemoryBlock::InitData(unsigned int initValue)
{
 unsigned int i;
 
 Data = new unsigned int[Size];
 for (i=0; i<Size; i++)
  Data[i] = initValue;
}

Деструктора нет
Muratov Radik

Muratov Radik (статус: Посетитель), 27 января 2010, 12:38 [#8]:

To min@y™
Я полностью комментирую блок с выводом в Memo. Оставляю только StatusBar и на нем вылетает.
Поэтому думаю это не поможет, но спасибо, попробую
Вадим К

Вадим К (статус: Академик), 27 января 2010, 12:49 [#9]:

и цикл комментируется?
а в статусбаре есть добавленные панельки? а то по умолчанию их туда никто не добавляет.
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 27 января 2010, 13:38 [#10]:

Панельки есть. Цикл вывода в Memo комментируется
Вадим К

Вадим К (статус: Академик), 27 января 2010, 13:56 [#11]:

Тогда значит классический расстрел памяти. Где то в другом месте код пишет не в свою память. Сказать наверняка где - нельзя. Это одна из самых увлекательных задач.

Общие методы решения такие
- коментировать код до тех пор, пока ошибка не пропадет. потом методом деления попалам локализировать строку, подумать.
- воспользоваться инструментом типа valgrind
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 27 января 2010, 14:18 [#12]:

1) А CodeGuard поможет?
2) а что, если увеличить макс. размер стека и "кучи" в настройках проекта?
Вадим К

Вадим К (статус: Академик), 27 января 2010, 14:25 [#13]:

CodeGuard не использовал, не могу ничего советовать в его сторону.

а вот увеличивать размер стека/кучи не советовал бы. в таких случаях наоборот часто уменьшают, что бы спровоцировать проблему более явно. В любом случае, изменения размера кучи обычно размажет проблему или сделает её чуть иной.
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 27 января 2010, 14:53 [#14]:

Подскажите пжслта как мне правильно организовать мой класс?
CodeGuard ругается на место, где я создаю объекты класса

Access overrun: Attempt to access 4 byte(s) at 0x00F3000C+3012, that is at
offset 0+3012 in heap block 0x00F3000C which is only 2024 bytes long.

The object array (0x00F3000C) [size: 2024 bytes] was created with new[]
Call Tree:
0x00406855(=PConf812M_v2_1.exe:0x01:005855) MemoryMapUnit.cpp#21
0x0041AB5D(=PConf812M_v2_1.exe:0x01:019B5D) ZDevSettings.cpp#1300
Вадим К

Вадим К (статус: Академик), 27 января 2010, 15:11 [#15]:

Вот это уже веселее. теперь явно видно, что расстрел памяти есть. выделено памяти 2024 байт, а хочется получить доступ к смещению 3012.
Он показывает, какой именно код(строка какая именно) ему не нравиться? если да, проведите кусок кода и выделите строку.
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 27 января 2010, 15:20 [#16]:

 block6 = new TMemoryBlock();
 block6->StartAddr = 0x1000;
 block6->Size = 2 + 2 + 2 + 2*250;
 block6->InitData(0); // !!!!!!!!!!!!!!!!!!!!!! Line: 1300
класс с методами я выше уже писал
Muratov Radik

Muratov Radik (статус: Посетитель), 27 января 2010, 15:21 [#17]:

а в MemoryMapUnit описан сам класс
Muratov Radik

Muratov Radik (статус: Посетитель), 27 января 2010, 15:23 [#18]:

похоже я неправильно описал класс, и неправильно его использую в основной программе
Вадим К

Вадим К (статус: Академик), 27 января 2010, 15:28 [#19]:

у меня есть только одно предположение. что в строке

Data = new unsigned int[Size];

Size равен чему то другому, попробуйте вывести его куда нибудь, или заменить на this->Size (или через точку).
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 27 января 2010, 15:29 [#20]:

Сейчас попробую.
А как насчет пустого конструктора? Это нормально? Или что туда прописать?

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.03 сек.