Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> тест, исправте исходный текст проги 
:(
    Опции темы
veselchak
Дата 18.8.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 18.8.2006
Где: Иркутск

Репутация: нет
Всего: нет



Здравствуйте!Вот сделал прогу,преставляющую собой обыкновенный тест. Вроде все правильно, но во время работы эгзешника возникает исключение:"Access violation addres...in module rtl.bpl.Read of addres ...".Ниже исходный текст проги

НА 237 СТРОКЕ В ТЕКСТЕ И ТОРМОЗИЛа ПРОГА,НО ИСПРАВИВ ЛЯПУС ПО СОВЕТУ 
ROCKIE ВОЗНИКЛА ТА ЖЕ ОШИБКА,ТОЛЬКО НА 180 СТРОКЕ
 



Код


//H-файл
#ifndef test1H
#define test1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
struct TVopros
{
AnsiString Vopr; //вопрос

AnsiString Otv[4];//варианты ответа
int nOtv;  //к-во вариантов ответа
int rOtv;  //номер правильного ответа

};


class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TLabel *Label1; //message,вопрос
        TButton *Button1; //кнопка ОК/Дальше
        void __fastcall FormActivate(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender); //Ok,next
private:    // User declarations
//варианты ответа-радиокнопки выбора
TRadioButton *RadioButton[4];
 //щелчок на кнопке выбора правильного ответа
void __fastcall RadioButtonClick(TObject *Sender);
void __fastcall ShowVopros (TVopros v); //write answer
void __fastcall EraseVopros(void);//delete answer

public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

**************************
//текст модуля
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>//доступ к функции sscanf
#include "test1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//int i;
int f;//дескриптор файла теста
int level[4];//к-во правильных ответов,необходимых для достижения уровня
AnsiString mes[4]; //сообщение о достижениии уровня
TVopros Vopros; //вопрос
int otv; //номер выбранного ответа
int right=0; //к-во правильных ответов;
 int i;
 int dl;
//функции,обеспечивающие чтение вопроса из файла теста
 int GetInt(int f); //read entire/byte
int GetString (int f,AnsiString *st); //read string
//---------------------------------------------------------------------------
 //constructor
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
//int i;
int left=10;
for (i=0;i<4;i++)
{
//создадим радиокнопки для выбора прав. ответа
RadioButton[i]=new TRadioButton(Form1) ;
//checked свойства
RadioButton[i]->Parent=Form1;
RadioButton[i]->Left=left;
RadioButton[i]->Width=Form1->ClientWidth - Left - 20;
RadioButton[i]->Visible=false;
RadioButton[i]->Checked=false;
//зададим функцию обработки события клик
RadioButton[i]->OnClick=RadioButtonClick;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
AnsiString st;
//int i;
f=FileOpen("1.txt",fmOpenRead); //open file
if ( f==-1 ) //если файл несуществует
{
Label1->Font->Style=TFontStyles()<<fsBold;
Label1->Caption="Ошибка доступа к файлу 1.txt";
Button1->Tag=2;
return;
}
GetString(f,&st);//прочитать название теста
Form1->Caption=st;
GetString(f,&st);//прочитать вводную информацию
Label1->Width=Form1->ClientWidth -Label1->Left-20;
Label1->Caption=st;
Label1->AutoSize=true;
//прочитать информацию об уровнях оценки
for(int i=0;i<4;i++);
{
level[i]=GetInt(f);
GetString(f,&mes[i]);
}
}
//читает из файла очередной вопрос
bool GetVopros(TVopros *v)
{
AnsiString st;
if (GetString(f,&(v->Vopr)) !=0)
{
//прочитать к-во вариантов ответа и номер правильного ответа
v->nOtv=GetInt(f) ;
v->rOtv=GetInt(f);
for(int i=0;i<v->nOtv;i++); //читаем варианты ответа
{
 GetString (f,&(v->Otv[i]));
}
return true;
}
else return false;
}
//выводит вопрос
void __fastcall TForm1::ShowVopros(TVopros v)
{
int top;
//int i;
Label1->Width=ClientWidth - Label1->Left -20;
Label1->Caption=v.Vopr;
Label1->AutoSize=true;
//variants
for (i=0;i<v.nOtv;i++)
{
RadioButton[i]->Top=top;
RadioButton[i]->Caption=v.Otv[i];
RadioButton[i]->Visible=true;
RadioButton[i]->Checked=false;
top+=20;
}
}
//щелчок на радиокнопке выбора ответа
void __fastcall TForm1::RadioButtonClick(TObject *Sender)
{
int i=0;
while (! RadioButton[i]->Checked)
i++;
otv=i+1;
//ответ выбран,сделаем доступной кнопку  "Дальше"
Button1->Enabled=true;
}
//удаляет вопрос с экрана
void __fastcall TForm1::EraseVopros(void)
{
//скрыть поля выбора ответа
for (int i=0;i<4;i++)
{
RadioButton[i]->Visible=false;
RadioButton[i]->Checked=false;
}
//not enables button next
Button1->Enabled=false;
}
//---------------------------------------------------------------------------
 //щелчок на кнопке Ок/Дальше/Ок
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 bool ok;//результат чтения из файла очередного вопроса
switch (Button1->Tag)
{
case 0: //клик на кнопке ОК в начале работы проги,прочитать и вывести первый вопрос
GetVopros(&Vopros);
        ShowVopros(Vopros);
        Button1->Caption=" Дальше ";
        Button1->Enabled=false;
        Button1->Tag=1;
        break;
case 1:  //clic на кнопке Даьше
if(otv==Vopros.rOtv)//выбран правильный ответ
right++;
EraseVopros();
ok=GetVopros(&Vopros);
if(ok)
 ShowVopros(Vopros);
 else //вопросов нет
 {
 FileClose(f);
 //вывести результата
AnsiString st;
int i; //number достигнутого уровня
Form1->Caption="результат тестирования";
st.printf("Правильных ответов:%i \ n",right);
//определим оценку
i=0;
while ((right<level[i])&(i<3))
i++;
st=st+mes[i];
Label1->Caption=st;
Button1->Caption="Ok";
Button1->Enabled=true;
Button1->Tag=2;
}
break;
case 2:Form1->Close(); //завершить работу проги
}
}

 //читает строкку из файла
 //значение функции - к-во прочитанных символов
int GetString(int f, AnsiString *st)
{
unsigned char buf[300]; //строка(буфер)
unsigned char *p=buf;  //указатель на строку

int n; //количестыо прочитанных байт(значение ф-и FileRead)
int dl=0;//длина строки
n=FileRead(f,p,1);
while (n !=0)
{
if (*p=='\r')
{
n=FileRead (f,p,1);
break;
}
dl++;
p++;
n=FileRead (f,p,1);
}
*p='\0';
***код об который спотыкается прога*
if (dl!=0 ) st->printf("%s",buf);
*********************************
return dl;
//читает из файла целое число
int GetInt (int f)
{
char buf[20]; //строка(буфер)
char *p=buf; //указатель на строку
int n;//количество прочитанных байт(значение ф-и FileRead)
int a; //число,прочитанное из файла
n=FileRead(f,p,1);
while ((*p>='0')&& (*p<='9')&&(n>0))
{
p++;
n=FileRead(f,p,1);
}
if (*p=='\r')
n=FileRead(f,p,1);
*p='\0';
//преобразуем стрроку из буфера в целое
sscanf(buf,"%i",&a);
return a;
}

СПАСИБО ЗА ВНИМАНИЕ!

Это сообщение отредактировал(а) veselchak - 21.8.2006, 12:14
PM MAIL   Вверх
Palladin
Дата 18.8.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



Просмотри программу пошагово и приведи код в котором возникает ошибка! Иначе врядли ктонить поможет smile 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
MAKCim
Дата 18.8.2006, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



тем более с таким оформлением


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 19.8.2006, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



veselchak, для красивого оформления нужно пользоватся кнопкой код, это не рекомендация, а требование. Чтобы это исправить надо нажать кнопку "редактировать" у поста в правом верхнем углу.
Потом нажав кнопку "Код" выбрать подсветку С++ и поместить между получеными тегами код С++.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rockie
Дата 19.8.2006, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Цитата(veselchak @  18.8.2006,  14:37 Найти цитируемый пост)
НА ВЫДЕЛЕННОМ СТРОКЕ В ТЕКСТЕ И ТОРМОЗИТ ПРОГА

в какой именно строчке (номер)

мда. нашел. ну и правильно делает что тормозит, скорее всего должно быть просто
Код
if (dl!=0 ) printf("%s",buf);


Это сообщение отредактировал(а) Rockie - 19.8.2006, 09:28


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.