Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 EAccessViolation  [new]
polizei
Member

Откуда:
Сообщений: 3
int main(int argc, char* argv[])
{
int data;
unsigned short TransBytes;
MSerial* com = new MSerial;
cout << "Enter data number to write (from 0 to 31): ";
cin >> data;
if(com->Open("COM1", 1200, 5, 'N', 1))
{
cout << "Transmitting..." << endl;
TransBytes = com -> Write((BYTE*)&data, 1);
cout << endl << TransBytes << endl;
}
else {cout << "Îøèáêà îòêðûòèÿ ïîðòà";}

com->Close();
delete com;
getch();
return 0;
}
Почему на delete выскакивает exception EAccesViolation. Я же не разыменовываю нулевой указатель и не суюсь в невыделенную память. Причем, если не вызывать функцию Open, то деструктор работает нормально.
22 авг 06, 01:40    [3035118]     Ответить | Цитировать Сообщить модератору
 Re: EAccessViolation  [new]
Тынц.
Guest
А что за MSerial такой?
Код есть? давай в студию, будем в ём баги шукать. Особенно в Open'е.

Ещё есть такая суперская вещь, как дебаггер...
22 авг 06, 03:00    [3035164]     Ответить | Цитировать Сообщить модератору
 Re: EAccessViolation  [new]
polizei
Member

Откуда:
Сообщений: 3
MSerial это самопальный класс для работы с COM-портом. Open соответственно функция для открытия порта и рядя соответствующих операций. Вообщето я его позаимствовал. И просьба выражаться яснее, я еще тока въезжаю)))
class MSerial
{
public:
MSerial();
~MSerial();
boolean Open(char port[], int BaudRate, int ByteSize,
char Parity, int StopBits);
void Close(void);
unsigned short Read(BYTE *buffer, unsigned short numbytes);
unsigned short Write(BYTE *buffer, unsigned short numbytes);
private:
HANDLE handle;
COMMTIMEOUTS CommTimeOuts;
DCB dcb;
COMSTAT ComState;
OVERLAPPED Overlap;
char String_Mode[];

};

MSerial::MSerial()
{
};
MSerial::~MSerial()
{
};
boolean MSerial::Open(char port[], int BaudRate, int ByteSize,
char Parity, int StopBits)
{
handle = CreateFile
(
port,
GENERIC_READ, //| GENERIC_WRITE,
NULL,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL
);

if(handle == INVALID_HANDLE_VALUE){return FALSE;}
dcb.DCBlength = sizeof(DCB);
if(!BuildCommDCB("1200,n,5,1", &dcb))
{
cout << "DCB faild" << endl;
}
CommTimeOuts.ReadIntervalTimeout = TimeoutInterval;
CommTimeOuts.ReadTotalTimeoutMultiplier = NumBytesMultiplier;
CommTimeOuts.ReadTotalTimeoutConstant = Constant;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;

if(!SetCommState(handle, &dcb))
{
return FALSE;
}
if(!SetCommTimeouts(handle, &CommTimeOuts))
{
cout << "Configure faild" << endl;
return FALSE;
}
return TRUE;
};

void MSerial::Close(void)
{
if(!CloseHandle(handle)){cout << "Port not closed" << endl;}
}

unsigned short MSerial::Read(BYTE *buffer, unsigned short numbytes)
{
DWORD temp;
ClearCommError(handle, &temp, &ComState);
if (!temp)
{
boolean result=ReadFile(handle, buffer, numbytes, &temp, &Overlap);
if(result)
{
return (unsigned short)temp;
}
}
return 0;
}

unsigned short MSerial::Write(BYTE* buffer, unsigned short numbytes)
{
DWORD temp;
if(numbytes)
{
ClearCommError(handle, &temp, &ComState);
if((numbytes + ComState.cbOutQue)>=SizeBuffer)
MessageBox(NULL, "Íå õâàòàåò ñâîáîäíîãî ìåñòà â âûõîäíîì áóôåðå ",
"", MB_OK);
boolean result=WriteFile(handle, buffer, numbytes, &temp, &Overlap);
if(result)
{
return (unsigned short)temp;
}
}
return 0;
}
23 авг 06, 00:29    [3040567]     Ответить | Цитировать Сообщить модератору
 Re: EAccessViolation  [new]
Тынц.
Guest
Ну канешна, спёр класс на Телесистемах, дописал свой пустой конструктор и деструктор и вперёд ;) (кстати там и пример есть работы с классом).

>>И просьба выражаться яснее, я еще тока въезжаю
Просьба выражаться яснее: "въезжаю" во что? В С++ или в принципы работы с RS-232 ?
Если второе, то вот, для затравки:
http://rs232.ru/doc002.html ("KOI-8R, подумал Штирлиц" ) )

Ну а если первое (С++ то бишь), то не советую начинать с Com-porta, а потренироваться, для начала, на кошках )) (например, написать класс СStudent, содержащий ...... в т.ч. конструктор/деструктор, отнаследоваться от класса СHomoSapiens и т.д.)
Попутно разобраться-таки с дебаггером ( желательно даже подружиться, он будет часто выручать в трудные моменты).

Удачи.
23 авг 06, 01:19    [3040648]     Ответить | Цитировать Сообщить модератору
 Re: EAccessViolation  [new]
polizei
Member

Откуда:
Сообщений: 3
Да читал я эту статью. И не на телесистемах я его взял. Дайте хоть ссылку на эти телесистемы. Если посмотреть внимательно, то он - гибрид как раз с этой статьей. Это конечно круто стебаться и все такое. Но по делу-то есть что-нибудь? Я ни в одной книжке не могу найти, какие проблемы могут быть у delete. А пустой конструктор и деструктор - это я уж изгалялся. По делу плиз и без апломба. А то нахрен вообще писать чего-то
26 авг 06, 00:20    [3056482]     Ответить | Цитировать Сообщить модератору
 Re: EAccessViolation  [new]
Тынц.
Guest
polizei
Да читал я эту статью. И не на телесистемах я его взял. Дайте хоть ссылку на эти телесистемы. Если посмотреть внимательно, то он - гибрид как раз с этой статьей. Это конечно круто стебаться и все такое. Но по делу-то есть что-нибудь? Я ни в одной книжке не могу найти, какие проблемы могут быть у delete. А пустой конструктор и деструктор - это я уж изгалялся. По делу плиз и без апломба. А то нахрен вообще писать чего-то

Да шутю я, шутю... ужо и обиделся...
Обычная реакция на нежелание человека разбираться в проблеме.

1. Если ты и читал статью, то читал невнимательно:
из статьи

lpDCB
Указатель на заполняемую структуру DCB. При этом структура должна быть уже создана и заполнена нулями, кроме поля DCBlength, которое должно содержать корректное значение. Возможно так же использование уже заполненой структуры DCB, например полученой вызовом одной из функций чтения параметров порта.

Поэтому нужно что-то вроде memset(&dcb,0,sizeof(dcb));
Иначе, подозреваю, Open даже не отработает нормально.
Я уже не говорю про неиспользование входных параметров Open'a. (ясно что экспериментировал, но эксперименты тоже надо ставить аккуратно)

2. Судя по приведённому коду трудно сказать что могдо вызвать AV, поэтому в интересах следствия выложи именно тот код, на котором был получен AV. + укажи испоьлзуемый компилятор и состояние самого COMa - к нему подключено что-нибудь, стоит заглушка TxD-RxD или ещё что-нибудь...

3. Ссылка на Телесистемы - третья по счёту из Гугля по строке MSerial.
Класс там, похоже, тот же, но не исковерканный + пример работы с ним:

http://www.telesys.ru/projects/proj064/mserial.h
http://www.telesys.ru/projects/proj064/prog.cpp

Попробуй приведённый там код, сначала без конструктора/деструктора, потом добавь (если уж так нужно ) ) и попробуй получить AV. Ну и дебаггером пройдись, посмотри что где портится...

Удачи.
27 авг 06, 14:19    [3058457]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить