Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
3 / 2 / 1
Регистрация: 14.06.2014
Сообщений: 52
1

При чтении cbInQue из структуры COMSTAT Ошибка Access violation

02.09.2021, 17:03. Показов 1927. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь определить сколько байт пришло на ком порт и вываливается Access Violation. В остальном проблем нет, порт открывается, в него данные пишутся, принимаются. Но что бы верно принимать данные, мне необходимо знать сколько байт в буфере. Обыскал форум и гугл, у многих ClearCommError возвращает COMSTAT структуру из которой они спокойно читают cbInQue. У меня же ошибка всегда. Делфи 6, вин 7 x64

Естественно в основном разделе Var юнита я объявляю laserCOMStat:PComStat;

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.Button23Click(Sender: TObject);
var
  errorsData:Cardinal;
  nofbyte:cardinal;
begin
  if laserPort_Open then begin
    if not ClearCommError(laserPort, errorsData, laserCOMStat) then begin
      Application.MessageBox('Ошибка чтения параметров порта', 'Hardware error' , IDOK);
    end else begin
      nofbyte :=laserCOMStat.cbInQue;
      memo1.Lines[23] := inttostr(nofbyte);
    end;
  end;
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.09.2021, 17:03
Ответы с готовыми решениями:

При попытке присвоить полям новой структуры значений типа AnsiString появляется ошибка Access Violation
При попытке присвоить полям новой структуры значений типа AnsiString появляется ошибка. Как я...

При чтении вектора из файла, открытого как бинарник - выскакивает Access violation writing location 0xFEEEFEEE
При чтении файла, открытого как бинарник в консольном приложении всё ок. При чтении файла,...

Деструктор структуры. Ошибка: Access violation reading location
struct WorldItem { string text = ""; }; struct WorldInfo { int width = 100; int height =...

Ошибка при Parent - нестабильная ошибка Access Violation
Добрый день. У меня возникает странная ошибка, раньше с такой не сталкивался. У меня есть свой...

Ошибка Access Violation при записи
void Texts :: setC_String() { str=strb; str->setC_String();//здесь указывает на ошибку ...

7
Native x86
Эксперт Hardware
5520 / 3277 / 936
Регистрация: 13.02.2013
Сообщений: 10,432
02.09.2021, 18:30 2
Судя по синтаксису вызова ClearCommError, переменная laserCOMStat является глобальным (зачем?) указателем (зачем?), память под который никто предварительно не выделил.

Почему не объявить локальную переменную laserCOMStat: COMSTAT и не передать указатель на нее ClearCommError(laserPort, errorsData, @laserCOMStat)
0
3 / 2 / 1
Регистрация: 14.06.2014
Сообщений: 52
02.09.2021, 21:46  [ТС] 3
Думаю я понял свою ошибку. Я пытался передавать как аргумент функции саму переменную, а не указатель на структуру. Завтра проверю и увижу результат.
0
3 / 2 / 1
Регистрация: 14.06.2014
Сообщений: 52
03.09.2021, 18:07  [ТС] 4
Действительно, когда я в функции начал использовать указатель на переменную
Delphi
1
ClearCommError(laserPort, errorsData, @laserCOMStat);
У меня снова выскочила ошибка Access Violation, но в среде появилось сообщение for loop control variable must be simple local variable, после объявления структуры локально в процедуре, всё заработало без ошибок.

Я не совсем понимаю почему структуру нельзя использовать глобально, но проблему я решил.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,253
03.09.2021, 20:30 5
Цитата Сообщение от ID_Hacker Посмотреть сообщение
в среде появилось сообщение for loop control variable must be simple local variable, после объявления структуры локально в процедуре
В огороде бузина, а в Киеве дядька.
0
Модератор
9267 / 6045 / 2380
Регистрация: 21.01.2014
Сообщений: 25,815
Записей в блоге: 3
04.09.2021, 05:26 6
Цитата Сообщение от ID_Hacker Посмотреть сообщение
но в среде появилось сообщение for loop control variable must be simple local variable, после объявления структуры локально в процедуре, всё заработало без ошибок.
А Вы текст сообщения хоть перевели? Неужели непонятно, что к Вашей "структуре" это не имеет никакого отношения? Тут Вам говорится, что переменная-счетчик цикла for должна быть локальной в процедуре - не более того.
0
3 / 2 / 1
Регистрация: 14.06.2014
Сообщений: 52
04.09.2021, 15:47  [ТС] 7
D1973, Да, спасибо, как то не обратил внимания на сам текст сообщения, оно и правда относилось к циклу и даже не влияло на компиляцию и работу. т.к. сказать варнинг, а не эрор.

Относительно COM порта же ошибка крылась вот здесь
Цитата Сообщение от ID_Hacker Посмотреть сообщение
Естественно в основном разделе Var юнита я объявляю laserCOMStat:PComStat;
потому как объявлять надо было laserCOMStat:ComStat и вот в этом случае, уже будет сообщение о несоответствии типов:
Код
[Error] Unit1.pas(783): Incompatible types: '_COMSTAT' and 'PComStat'
По сути, моей ошибкой было объявление структуры, в которой и не было элементов и она была равна nil, а при попытке обращения к элементу структуры laserCOMStat.cbInQue вываливалось "Access Violation", даже в отладке на этот элемент показывает "Inaccessible value", потому что данный элемент просто не создан. Самое странное, что функция
Код
ClearCommError(laserPort, errorsData, laserCOMStat)
при этом нормально вызывалась и не давала ошибок, хотя по логике должны была пытаться заполнить структуру данными, а при ошибке вернуть отличное от нуля значение.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,253
04.09.2021, 15:56 8
Цитата Сообщение от ID_Hacker Посмотреть сообщение
Самое странное, что функция
ClearCommError(laserPort, errorsData, laserCOMStat)
при этом нормально вызывалась и не давала ошибок
Ничего странного. Откуда она может узнать была ли выделена память для этой структуры или нет? Она просто заполняла некую область памяти данными в соответствии с переданным ей указателем. И если указатель указывал на область памяти не принадлежащую данному процессу, возникало AV. А если эта область памяти принадлежала процессу, AV не было.
1
04.09.2021, 15:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2021, 15:56
Помогаю со студенческими работами здесь

Ошибка Access Violation при записи
void Texts :: setC_String() { str=strb; str->setC_String();//здесь указывает...

Ошибка Access violation при открытии файла
При открытии файла, выдает ошибку "Access violation...." (скриншот прикрепил). Подскажите...

Ошибка access violation при работе с паролем
Здравствуйте! Помогите с кодом. Пароль хранится в dll.

TList. Ошибка Access Violation при создании.
Имеется такая структура данных: type TMyList = class private FMyList: TList; public...

Ошибка 'Access Violation' при освобождении потока
Доброго времени суток, форумчане. В общем пытаюсь реализовать поток, пусть он выглядит так:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru