Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2011, 18:35   #1
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
Вопрос Возникает ошибка Acces Violation при использовании функции Copy

Здравствуйте.

Хотел бы обратиться за помощью. У меня возникла ошибка Access Violation (скриншот я прикреплю ниже) при операции со строками, а именно – при попытке сравнить (проверить на НЕРАВЕНСТВО) две строки, одна из которых была получена присваиванием ей содержимого поля Edit, то есть

Код:

s2:=edit2.text // переменная s2 объявлена как string, то есть s2: string;
Вторая строка является результатом функции Copy, и записано это ТАКИМ ОБРАЗОМ:

Код:
copy( R.AnswerVariant[2], 2, length(R.AnswerVariant[2]) - 1 )
Здесь R – запись,
AnswerVariant – поле этой записи, которое описано таким образом

Код:
AnswerVariant: array[1..6] of string;
То есть, массив строк, а AnswerVariant[2] второй элемент этого массива – просто строка.

Вот кусок кода, который у меня вызывает ошибку:

Код:
// Проверка Второго варианта
                                if
                               ( s2 <>

                                copy( R.AnswerVariant[2], 2, length(R.AnswerVariant[2]) - 1 ) )
                                              OR
                                  ( (R.AnswerVariant[2][1] = '=') AND (not radioButton2.Checked) )
                                              OR
                                  ( (R.AnswerVariant[2][1] = '-') AND (radioButton2.Checked) )

                                                                             then
                                                                                begin
                                                                                  Result:=TRUE;
                                                                                  exit;
                                                                                end;
Соль, правда, может в том, что у меня строки s2 и R.AnswerVariant[2] являются пустыми, однако, как мне кажется, никакое из этих условий не должно давать повода для ошибки.

Прошу помощи и консультации (я то я чё-то туплю с этим очень долго и дальше дело у меня не двигается, запарился).

P.S. Если этой информации недостаточно, скажите мне, что конкретно следует указать сверх того, что было мной указано здесь.

P.P.S. Скриншот леплю ниже.
Изображения
Тип файла: jpg AccesViolation.jpg (122.0 Кб, 164 просмотров)
Вадим Мошев вне форума Ответить с цитированием
Старый 07.05.2011, 18:55   #2
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Довольно страшный код, я рекомендую полностью пересмотреть принцип действия программы.

Что это такое будет вообще?
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 07.05.2011, 19:37   #3
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Отладочные опции компилятора включены?
eduard93 вне форума Ответить с цитированием
Старый 07.05.2011, 19:40   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

поставьте madexcept. Он в стеке покажет, откуда ноги ростут.
Человек_Борща вне форума Ответить с цитированием
Старый 07.05.2011, 21:15   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Valio

Цитата:
Довольно страшный код, я рекомендую полностью пересмотреть принцип действия программы.

Что это такое будет вообще?
Я планирую написать такую систему тестирования знаний...
Код страшный? Хм, странно, я же совсем наоборот старался писать код так, чтобы он легко читался и чётко выделялась иерархия. Что именно вам не нравится в коде? Что у меня неправильно с точки зрения форматирования?

eduard93

Цитата:
Отладочные опции компилятора включены?
Отладочные опции? Извините, плохо понимаю, о чём речь... но я выполнял пошаговую трассировку (F7), наблюдал за значениями переменных (Watch).

Человек_Борща

Цитата:
поставьте madexcept. Он в стеке покажет, откуда ноги ростут.
Я впервые сталкиваюсь с этим понятием. Не поможете разжевать?

заранее спасибо
Вадим Мошев вне форума Ответить с цитированием
Старый 07.05.2011, 21:19   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://www.gunsmoker.ru/2009/05/access-violation.html
http://www.gunsmoker.ru/2009/04/delphi_19.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 07.05.2011, 21:28   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Вадим Мошев, смотрим http://madshi.net/ это средство отлова исключений. Бесплатное.
Возможностей не так уж и много как у EurekaLog но его вполне достаточно. При ошибках типа AV и тд. формирует довольно детальные отчёты.

Последний раз редактировалось Человек_Борща; 07.05.2011 в 21:40.
Человек_Борща вне форума Ответить с цитированием
Старый 07.05.2011, 21:31   #8
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

При пустышке R.AnswerVariant[2] в R.AnswerVariant[2][1] будет КРЯ!!!
ReportCube вне форума Ответить с цитированием
Старый 07.05.2011, 22:05   #9
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Код:
Я планирую написать такую систему тестирования знаний...
 Код страшный? Хм, странно, я же совсем наоборот старался писать код так, чтобы он 
легко читался и чётко выделялась иерархия. Что именно вам не нравится в коде? 
Что у меня неправильно с точки зрения форматирования?
Сам факт наличия таких структур:

Код:
if
                               ( s2 <>

                                copy( R.AnswerVariant[2], 2, length(R.AnswerVariant[2]) - 1 ) )
                                              OR
                                  ( (R.AnswerVariant[2][1] = '=') AND (not radioButton2.Checked) )
                                              OR
                                  ( (R.AnswerVariant[2][1] = '-') AND (radioButton2.Checked) )
говорит о том, что стоит пересмотреть способ обработки данных.

===========
Допустим ты хочешь написать экзаменатор аля "кто хочет стать импотентом с Максимом Галкиным".

Дано:
1 вопрос, 10 варианта ответа, ответов может быть сколько угодно.

Думаем:
Нам нужно гдето хранить всё это что указано в дано.
Вопрос - вопрос может быть длиный. Однозначно TStringList.
Варианты ответов - они будут у нас однострочные, но их много. Однозначно TStringList;

Прикидываем:

Код:
  TCard = Record
    Question : TStringList;           // Вопрос
    VariantsOfAnswers : TStringList;  // Варианты ответов
    AnswerCode : String;            // Код правильного ответа
  End;

.....

Var M : Array [1..100] of TCard;
На форму кидаешь TMemo. Чекбоксы создаёшь автоматически.

(чекбоксы - потому что ответов может быть не один)

После того как юзер понатыкал чекбоксов, то идёт обработка их с формированием AnswerCode вроде такой

Код:
UserAnswerCode := '';

if Checkbox1.Checked = True Then UserAnswerCode := UserAnswerCode + '1' else UserAnswerCode := UserAnswerCode + '0';

... (это тоже в цикле перебирается) 

if Checkbox2.Checked = True Then UserAnswerCode := UserAnswerCode + '1' else UserAnswerCode := UserAnswerCode + '0';
И на выходе у тебя строка вида '0100101001' - это и будет код ответов.

Осталось его обработать процедурой и както учесть.

Код:
Procedure CheckedCodeUserAnswer(N : integer;  Code : String)
Функция принимает номер вопроса и код ответов, сверяет с AnswerCode и даёт результат.

Всё. Вся программа занимает дай бог 50 строк, и нет никаких громадных ифоф.
Сливочное масло Valio - компиляция как по маслу

Последний раз редактировалось Valio; 07.05.2011 в 22:12.
Valio вне форума Ответить с цитированием
Старый 07.05.2011, 22:27   #10
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Цитата:
Отладочные опции? Извините, плохо понимаю, о чём речь... но я выполнял пошаговую трассировку (F7), наблюдал за значениями переменных (Watch).
Они находятся в опциях проекта на вкладке Compiler. В вашем случае должна помочь опция Range checking, но и Overflow checking не помешает.
eduard93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при вызове функции Access violation Hottabych Win Api 1 22.01.2011 20:35
Непонятное Acces Violation при вызове Create у формы из Avaliable forms Человек_Борща Общие вопросы Delphi 11 26.08.2010 14:28
Исправить Acces Violation при загрузке файла Человек_Борща Общие вопросы Delphi 2 01.08.2010 14:50
Ругается(Acces Violation) при чтении DAT-файла Человек_Борща Общие вопросы Delphi 5 25.05.2010 19:42
Access violation at address при использовании DLL spamer Общие вопросы Delphi 4 27.08.2009 22:19