Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
vse
0 / 0 / 1
Регистрация: 04.01.2012
Сообщений: 8
#1

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

21.01.2012, 18:41. Просмотров 1056. Ответов 8
Метки нет (Все метки)

Хотя дело может быть и не в виртуальных функциях.
В общем портянка такова:
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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2012, 18:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Виртуальные функции. Программа вылетает с ошибкой. (C++):

Программа вылетает с ошибкой - C++
начал читать Б. Страуструпа &quot;Программирование. Принципы и практика использования C++&quot; Пробую пример из текста и при запуске вылетает с...

Программа вылетает с неизвестной ошибкой - C++
Всем доброго времени суток. Имеется следующий простенький код для рисования круга. #include &lt;iostream&gt; #include &lt;windows.h&gt; #include...

Программа вылетает с ошибкой std::bad_alloc - C++
Всем привет! Задали написать программу, которая удаляет из файла все закомментированные строки(учитываются и //, и /* */) и реализовать в...

Программа то вылетает с ошибкой, то работает корректно - C++
При запуске программа то вылетает с ошибкой, то работает нормально. Нутром чую, что проблема в следующем куске кода, где я создаю объекты...

Удаление последнего элемента динамического массива (программа вылетает с ошибкой) - C++
for (vector&lt;P&gt;::iterator i = p.begin(); i != p.end(); ++i) { i -&gt; life --; if (i -&gt; life ==0) p.erase(i);...

При обращении к индексу двумерного массива char программа вылетает с ошибкой - C++
Программа вылетает с ошибкой на 66й строке. Почему?((( // Task_1.cpp : Defines the entry point for the console application. // ...

8
soon
2545 / 1310 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 18:58 #2
Навскидку в show где-то косяк. Задание скажите, так проще будет.
0
dimcoder
Полярный
467 / 440 / 68
Регистрация: 11.09.2011
Сообщений: 1,142
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, если его он не используется.
Да и вообще лучше сделать через перегрузку операторов, хотя можно и так.
0
soon
2545 / 1310 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 19:08 #4
vse, нашел, в самом деле в show. В функции sprintf, вы передавали указтель на массив в 1 элемент. Естественно, этого не хватало.
Имхо, можно все сделать проще, намного.
1
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 буфер из более чем одного символа?
0
NoMasters
Псевдослучайный
1907 / 1118 / 77
Регистрация: 13.09.2011
Сообщений: 3,173
21.01.2012, 20:06 #6
sprintf принимает произвольное параметры, типы не могут быть автоматически приведены.
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
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);
     }

Не по теме:

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

0
soon
2545 / 1310 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.01.2012, 21:12 #8
Цитата Сообщение от vse Посмотреть сообщение
проще? если не сложно, то покажи, будь добр, механизм - а то я пока на оптимальность не нацелен.
Если только завтра, днем или ближе к вечеру, раньше вряд ли получится.
Про sprintf можно прочитать на cplusplus.com. Но нужно знание английского, хотя бы базовое.
0
vse
0 / 0 / 1
Регистрация: 04.01.2012
Сообщений: 8
22.01.2012, 06:59  [ТС] #9
kravam, ) так-то да, благодарю.

Не по теме:

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



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

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

Добавлено через 6 минут
... на уровне целостного осознания...
0
22.01.2012, 06:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2012, 06:59
Привет! Вот еще темы с ответами:

Вылетает программа (Структуры и функции) - C++
Здравствуйте! Пишу программу и столкнулся с такой проблемой. Когда я писал ее на ноутбуке, то у меня стала вылетать программа после того,...

виртуальные и чисто виртуальные функции - C++
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто виртуальную? #include &lt;iostream&gt; using...

Visual Studio 6.0 вылетает с ошибкой - C++
Хочу добавить в проект файл. перехожу во вкладку где список файлов слева. контекстное меню-&gt; add file и студия вылетает с ошибкой памяти...

после ввода сразу вылетает с крит. ошибкой - C++
int main(int nNumberofArgs, char* pszArgs) { char *ipshnik; cout &lt;&lt; &quot;enter IP&quot;; cin &gt;&gt; *ipshnik; system...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru