Форум программистов, компьютерный форум CyberForum.ru

Виртуальные функции. Программа вылетает с ошибкой. - C++

Восстановить пароль Регистрация
 
vse
 Аватар для vse
0 / 0 / 1
Регистрация: 04.01.2012
Сообщений: 8
21.01.2012, 18:41     Виртуальные функции. Программа вылетает с ошибкой. #1
Хотя дело может быть и не в виртуальных функциях.
В общем портянка такова:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <iostream>
#include <cstdlib>
#include <time.h>
 
using namespace std;
using std::srand;
using std::rand;
 
class Object {
      public:
             unsigned char pole;
             void init();
             void set(unsigned char val);
             virtual Object plus(Object a);
             virtual Object minus(Object a);
             virtual void show(int type);
};
 
class BitString : public Object {
      public:
             int size;
             unsigned char stroka[100];
             void init(int val);
             virtual BitString plus(BitString a); //or
             virtual BitString minus(BitString a); //and
             virtual void show();
};
 
class Hex : public Object {
      public:
             virtual Object plus(Object a);
             virtual Object minus(Object a);
             virtual void show(int type);
};
 
void Object::init(){
     pole=0;          
}
 
void Object::set(unsigned char val){
     pole=val;          
}
 
Object Object::plus(Object a){
       Object res;
       res.init();
       res.pole=pole+a.pole;
       return res;
}
       
Object Object::minus(Object a){
       Object res;
       res.init();
       res.pole=pole-a.pole;
       return res;
}
 
void Object::show(int type=0){
     char stroka[3];
     if (type==0) cout<<pole; 
     else { 
          sprintf(stroka,"%3d",pole);
          cout<<stroka;
     }
}
 
 
void BitString::init(int val){
     int i,bit;
     srand(time(NULL));
     pole=0;
     size=val;
     for (i=0;i<val;i++){
         bit=rand()%1000;
         stroka[i]=bit%2;
         }
}
     
BitString BitString::plus(BitString a){//or
          BitString res;
          int i,min;
 
          res.init(10);
          
        return res;
}
          
BitString BitString::minus(BitString a){//and
          
          BitString res;
          int i,min;
          
          res.init(10);
           return res;
          }
          
void BitString::show(){
     char symb[1];
     int i;
     
     for (i=0;i<size;i++){
          sprintf(symb,"%1d",stroka[i]);
          cout<<symb;
     }
     cout<<"\n";
     
}
 
 
 
int main() {
    Object a,b,c;
    BitString s1,s2;
    BitString s3;
    cout<<"===== Object =====\n";
    a.init();
    b.init();
    c.init();
    a.set(10);
    b.set(20);
    c=a.plus(b);
    cout<<"c=a+b "; c.show(1); cout<<" "; a.show(1); cout<<" ";b.show(1);cout<<"\n";
    c=a.minus(b);
    cout<<"c=a-b "; c.show(); cout<<" "; a.show(); cout<<" ";b.show();cout<<"\n";
 
    cout<<"===== BitString =====\n";
    s1.init(10);
    cout<<"s1:\n"; s1.show();
    s2.init(15);
    cout<<"s2:\n"; s2.show();
    s3.init(10);
    cout<<"s3:\n"; s3.show();    
    s3=s1.plus(s2); //ВОТ ТУТ выполнение программы завершается виндовым приложение будет закрыто, 
//с предложением отправить отчет
    cout<<"s3=s1 or s2\n"; s3.show();//или тут
  //  s3=s1.minus(s2);
  //  cout<<"s3=s1 and s2\n"; s3.show();
    
    
    
    cin.get();
    return 0;
}
при таком варианте
C++
1
2
3
4
5
6
7
8
9
10
11
     cout<<"===== BitString =====\n";
    s1.init(10);
    cout<<"s1:\n"; s1.show();
    s2.init(15);
    cout<<"s2:\n"; s2.show();
    s3.init(10);
    cout<<"s3:\n"; s3.show();    
    //s3=s1.plus(s2); 
   // cout<<"s3=s1 or s2\n"; s3.show();
  //  s3=s1.minus(s2);
  //  cout<<"s3=s1 and s2\n"; s3.show();
успевает до ошибки вывести на экран кучу символов, как если бы был бесконечный цикл в init(), потом вылетает с ошибкой.
Система винда xp sp2.
Работаю в Dev-C++ 4.9.9.2

Что это может быть?

Добавлено через 6 минут
при варианте
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void BitString::init(int val){
     int i,bit;
     srand(time(NULL));
     pole=0;
     size=val;
     for (i=0;i<val;i++){
         bit=rand()%1000;
         stroka[i]=bit%2;
         }
}
...
void BitString::show(){
     char symb[1];
     int i;
     
     for (i=0;i<10;i++){
          sprintf(symb,"%1d",stroka[i]);
          cout<<symb;
     }
     cout<<"\n";
     
}
...
    cout<<"===== BitString =====\n";
    s1.init(10);
    cout<<"s1:\n"; s1.show();
    s2.init(15);
    cout<<"s2:\n"; s2.show();
    s3.init(10);
    cout<<"s3:\n"; s3.show();
Выходит без ошибки с такими данными:
Код
s1:
0000011100
s2:
0000011100
s3:
02533400000208253
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2012, 18:41     Виртуальные функции. Программа вылетает с ошибкой.
Посмотрите здесь:

C++ виртуальные и чисто виртуальные функции
Программа то вылетает с ошибкой, то работает корректно C++
C++ Visual Studio 6.0 вылетает с ошибкой
C++ после ввода сразу вылетает с крит. ошибкой
C++ Программа вылетает с ошибкой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 18:58     Виртуальные функции. Программа вылетает с ошибкой. #2
Навскидку в show где-то косяк. Задание скажите, так проще будет.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
21.01.2012, 19:00     Виртуальные функции. Программа вылетает с ошибкой. #3
Цитата Сообщение от vse Посмотреть сообщение
BitString BitString:lus(BitString a){//or
* * * * * BitString res;
* * * * * int i,min;
res.init(10);
return res;
}
Не понятно зачем здесь передавать Bitsring a, если его он не используется.
Да и вообще лучше сделать через перегрузку операторов, хотя можно и так.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 19:08     Виртуальные функции. Программа вылетает с ошибкой. #4
vse, нашел, в самом деле в show. В функции sprintf, вы передавали указтель на массив в 1 элемент. Естественно, этого не хватало.
Имхо, можно все сделать проще, намного.
vse
 Аватар для vse
0 / 0 / 1
Регистрация: 04.01.2012
Сообщений: 8
21.01.2012, 20:01  [ТС]     Виртуальные функции. Программа вылетает с ошибкой. #5
soon, задание такое
Создать базовый класс Object с полем типа unsigned char.Реализовать конструктор
инициализации, задающий начальное значение этому полю (по умолчанию 0). Реализо-
вать в данном классе виртуальные функции сложения, вычитания и вывода на экран. Ре-
ализовать два производных класса, переопределив виртуальные функции предка (класс
Object). Вызывающая программа должна демонстрировать все варианты вызова вирту-
альных функций.

Создать класс с BitString и класс Hex.

Создать класс BitString для работы с битовыми строками не более чем из 100 бит.
Битовая строка должна быть представлена массивом типа unsigned char, каждый элемент
которого принимает значение 0 или 1. Реальный размер массива задается как аргумент
конструктора инициализации. Должны быть реализованы все традиционные операции для
работы с битовыми строками: and, or, xor, not. Реализовать сдвиг влево и сдвиг вправо на
заданное количество битов.
проще? если не сложно, то покажи, будь добр, механизм - а то я пока на оптимальность не нацелен.
В функции sprintf, вы передавали указтель на массив в 1 элемент.
исходил из этого:
C++
1
2
3
4
5
6
7
8
9
10
void BitString::init(int val){
     int i,bit;
     srand(time(NULL));
     pole=0;
     size=val;
     for (i=0;i<val;i++){
         bit=rand()%1000;
         stroka[i]=bit%2;
         }
}
хотя да - не совсем въехал в sprintf...

dimcoder, там я коментил алгоритм, ошибку вылавливал...

Добавлено через 9 минут
Благодарю , увеличение размерности массива вылечило...

объясните, дураку.
int sprintf(buffer, format-string[, argument...]);
char *buffer; память для хранения вывода
char *format-string; строка управления форматом

Описание.

Функция sprintf форматирует и запоминает наборы символов и
значений в buffer. Каждый аргумент argument (если он есть), пре-
образуется и выводится согласно соответствующей спецификации фор-
мата в format-string.
Format-string состоит из порядковых символов и имеет ту же
самую форму и функцию, что аргумент format-string для функции
printf. Смотрите функцию printf для описания format-string и ар-
гументов.

Возвращаемое значение.

Функция sprintf возвращает количество символов, записанных
в buffer.
C++
1
2
3
4
5
6
7
8
     char symb[1];
     int i;
     
     for (i=0;i<size;i++){
          sprintf(symb,"%1d",stroka[i]);
          cout<<symb;
     }
     cout<<"\n";
по идее в stroka[i] один символ, зачем в sprintf буфер из более чем одного символа?
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,094
21.01.2012, 20:06     Виртуальные функции. Программа вылетает с ошибкой. #6
sprintf принимает произвольное параметры, типы не могут быть автоматически приведены.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
21.01.2012, 20:37     Виртуальные функции. Программа вылетает с ошибкой. #7
vse, сделай так:
C++
1
2
3
for (i=0;i<size;i++){
  printf("%c\n",(char)stroka[i]+ 48);
}
Ибо зачем плодить лишние сущности?

Добавлено через 3 минуты
Или даже так:
C++
1
2
3
     for (i=0;i<size;i++){
          printf("%c\n",stroka[i]+ 48);
     }

Не по теме:

Кстати, ты не задумывался о версии своего компилятора?

soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 21:12     Виртуальные функции. Программа вылетает с ошибкой. #8
Цитата Сообщение от vse Посмотреть сообщение
проще? если не сложно, то покажи, будь добр, механизм - а то я пока на оптимальность не нацелен.
Если только завтра, днем или ближе к вечеру, раньше вряд ли получится.
Про sprintf можно прочитать на cplusplus.com. Но нужно знание английского, хотя бы базовое.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2012, 06:59     Виртуальные функции. Программа вылетает с ошибкой.
Еще ссылки по теме:

C++ При обращении к индексу двумерного массива char программа вылетает с ошибкой
C++ Вылетает программа (Структуры и функции)
C++ Программа вылетает с неизвестной ошибкой

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

Или воспользуйтесь поиском по форуму:
vse
 Аватар для vse
0 / 0 / 1
Регистрация: 04.01.2012
Сообщений: 8
22.01.2012, 06:59  [ТС]     Виртуальные функции. Программа вылетает с ошибкой. #9
kravam, ) так-то да, благодарю.

Не по теме:

а о версии компилятора не задумывался. НО меня последние пару дней преследуют числа 666



soon, ) а с чего мне торопить: поведаешь - радостно, нет - дело хозяйское.

Добавлено через 6 минут
ага, на cplusplus.com утонул...
единственное, что смущает - это Pointer, их я пока не догоняю...

Добавлено через 6 минут
... на уровне целостного осознания...
Yandex
Объявления
22.01.2012, 06:59     Виртуальные функции. Программа вылетает с ошибкой.
Ответ Создать тему
Опции темы

Текущее время: 23:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru