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

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

Войти
Регистрация
Восстановить пароль
 
Bobster
Сообщений: n/a
#1

сконструировать класс - C++

31.08.2011, 12:27. Просмотров 860. Ответов 13
Метки нет (Все метки)

Добрый день. Мне надо сконструировать следующий класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class LogicElement {
public:
    // constructors / destructor
    LogicElement(const char *ElementType, int nIpiNmb );
    LogicElement(const LogicElement &);
    ~LogicElement();
    //methods
    void SetInputs(const bool *inputs);
    bool Evaluate();
    void PrintStatus();
private:    
    char *name;// имя элемента  
    int inp_nmb; // количество входов элемента
    bool *inputs;//входные сигналы
};
Но при построении появляется ошибка:
Run-Time Check Failure #3 - The variable 'inputs' is being used without being initialized.
Как правильно ее инициализировать?
Вот код программы:

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
#include "header.h"
#include "stdio.h"
#include "string.h"
 
LogicElement::LogicElement(const char *ElementType, int nIpiNmb ){  
    name = new char[ strlen(ElementType) + 1 ]; 
    strcpy(name, ElementType);
    inp_nmb = nIpiNmb;
    inputs = new bool;
}
 
LogicElement::LogicElement(const LogicElement &q){
    name = new char[ strlen(q.name) + 1 ];
    strcpy(name, q.name);
    inp_nmb = q.inp_nmb;
    inputs = new bool;
}
 
LogicElement::~LogicElement(){
    
    delete[] name;
    inp_nmb = 0;
    delete[] inputs;
}
 
bool LogicElement::Evaluate(){
    bool b;
    int i;
    b=0;
    
    if (name=="AND")
        for (i=0; i<inp_nmb; i++){
            b = b && (*inputs);
            inputs++;
        };
    if (name=="OR")
        for (i=0; i<inp_nmb; i++){
            b = b || (*inputs);
            inputs++;
        };
    if (name=="XOR")
        for (i=0; i<inp_nmb; i++){
            b = (b || (*inputs)) && !(b && (*inputs));
            inputs++;
        };
    if (name=="ANDNEG")
        for (i=0; i<inp_nmb; i++){
            b = !(b && (*inputs));
            inputs++;
        };
    if (name=="ORNEG")
        for (i=0; i<inp_nmb; i++){
            b = !(b || (*inputs));
            inputs++;
        };
    return b;
};
 
void LogicElement::SetInputs(const bool *Inputs){
    int i;
    for (i=0; i<inp_nmb; i++)
        if (i/2==0){
            *inputs=0;
            inputs++;
        }
        else {
            *inputs=1;
            inputs++;
        }
};
 
void LogicElement::PrintStatus(){
    printf("%s %d\n", *name,inp_nmb);
}
 
 
 
 
#include "header.h"
#include "stdio.h"
 
 
int main(){
    char *s;
    s="AND";
    LogicElement x(s,2);
    bool *inputs; 
    x.SetInputs(inputs);
    x.Evaluate();
    x.PrintStatus();
return 0;
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2011, 12:27     сконструировать класс
Посмотрите здесь:

Нужно сконструировать алгоритм задачи - C++
Добрый день. Задача: Отрезок числовой оси от 0 до 109 покрашен в белый цвет. Затем некоторые части этого отрезка были покрашены в...

Можно ли в поле private сконструировать объект с параметрами другого класса? - C++
Например у меня есть классы Basic и Second. Во 2-м классе есть конструктор с параметрами. Можно ли написать что-то типу такого? class...

Сконструировать новый класс, соответствующей фигуре "Два отрезка" - PascalABC.NET
Сконструировать новый класс,соответствующей фигуре &quot;Два отрезка&quot;.В котором обязательно реализованы следующие методы:рисование фигуры на...

Сконструировать вызов - Lisp
Доброго времени суток, уважаемые! Вот такое задание

Сконструировать матрицы - Matlab
Сконструировать блочные матрицы (используя функции для заполнения стандартных матриц) и применить функции обработки данных и поэлементные...

Сконструировать блочные матрицы - Matlab
Нужно сконструировать блочные матрицы (используя функции для заполнения стандартных матриц) и применить функции обработки данных и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
31.08.2011, 12:33     сконструировать класс #2
Bobster, Выделить память?

C++
1
2
        bool *inputs; 
        x.SetInputs(inputs);
Да и потом...

Вы в конструкторе выделяете под один bool память. А удаляете/используете как массив.
Bers
Заблокирован
31.08.2011, 13:37     сконструировать класс #3
Цитата Сообщение от Bobster Посмотреть сообщение
Run-Time Check Failure #3 - The variable 'inputs' is being used without being initialized.
Ругается, что был объявлен не проинициализированный указатель.
Лечится вот так:

C++
1
2
3
4
5
6
7
8
9
10
int main(){
  char *s;
  s="AND";
  LogicElement x(s,2);
  bool *inputs = NULL; //не забываем инициализировать. 
  x.SetInputs(inputs);
  x.Evaluate();
  x.PrintStatus();
  return 0;
};
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2011, 13:59     сконструировать класс #4
Bobster, в проекте ещё баги - например светиться ерор на память
После завершения работы приложения память и так освободиться
C++
1
2
3
4
5
6
7
8
LogicElement::~LogicElement()
{
    inp_nmb = 0;  
/*  if(name)
        delete[] name;
    if(inputs)
        delete[] inputs;*/
}
- притом ты выполяешь следующее

char *s ="AND";
strcpy(name, ElementType);т.е
strcpy(name, s);//s - в данном случае const и очистить память после неё не удасться

Чтобі норм печатало - нужно было убрать указатель от переменной name
C++
1
2
3
4
void LogicElement::PrintStatus()
{
    printf("%s %d\n", name,inp_nmb);
}
Миниатюры
сконструировать класс  
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
31.08.2011, 14:02     сконструировать класс #5
-=ЮрА=-, Вот про освобождение - не стоит плохому людей учить. Деструкторы существуют в том числе для того, чтобы память очищалась.
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2011, 14:26     сконструировать класс #6
Цитата Сообщение от ForEveR Посмотреть сообщение
Вот про освобождение - не стоит плохому людей учить
- я писал за конкретный случай - человек в strcpy присваивает строковой переменной класса, адрес константной строковой переменной, в данном случае при чистке вылезет баг . Касательно освобождения памяти в общем случае - если память используется 1-разово то при завершении программы операционка сама её очистит, это так же как снимать хук-точку не обязательно, т.к. при закрытии система кое-что и сама делает...
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
31.08.2011, 14:35     сконструировать класс #7
- я писал за конкретный случай - человек в strcpy присваивает строковой переменной класса, адрес константной строковой переменной, в данном случае при чистке вылезет баг
Человек предварительно выделяет память для переменной класса. Какой нафиг баг?
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2011, 14:43     сконструировать класс #8
Цитата Сообщение от ForEveR Посмотреть сообщение
Человек предварительно выделяет память для переменной класса. Какой нафиг баг?
- теперь всмотрелся что баг не на строке а на inputs вылетает, вот он
Миниатюры
сконструировать класс  
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,909
31.08.2011, 15:04     сконструировать класс #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Выделить память?
Так он этот переданный указатель и не использует )

Добавлено через 2 минуты
-=ЮрА=-, никаких проверок перед delete/deletel[] делать не нужно.

Добавлено через 3 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- теперь всмотрелся что баг не на строке а на inputs вылетает, вот он
Ну так память-то выделяется при помощи new, а не new[], следовательно и освобождать её надо соответственно.
-=ЮрА=-
Заблокирован
Автор FAQ
31.08.2011, 15:11     сконструировать класс #10
Цитата Сообщение от rangerx Посмотреть сообщение
никаких проверок перед delete/deletel[] делать не нужно.
если так её выделять
C++
1
new char[ strlen(ElementType) + 1 ];
, то да не нужна проверка, а вот для такого варианта выделения всё же нужна
C++
1
new char[ strlen(ElementType) ];
Добавлено через 28 секунд
Цитата Сообщение от rangerx Посмотреть сообщение
так память-то выделяется при помощи new, а не new[]
- за этот пост спасибо, с меня +1
asics
Freelance
Эксперт C++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
31.08.2011, 15:28     сконструировать класс #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а вот для такого варианта выделения всё же нужна
Такой вариант выделения памяти вообще не корректный, так как нет места на '\0'.

Добавлено через 1 минуту
Да и все равно, проверка не нужна.
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,909
31.08.2011, 18:17     сконструировать класс #12
-=ЮрА=-, перед освобождением памяти в стиле языка C обычно делают следующую проверку
C
1
2
if(p != NULL) // чаще пишут просто if(p)
    free(p);
т.е., если указателю присвоено значение NULL, значит он ни на что не указывает. Другими словами, либо для него забыли вызвать malloc, либо вызов malloc оказался неудачным. Для работы с памятью в стиле C такая проверка перед free обязательна(!). Операторы delete и delete[] такой проверки не требуют, например:
C++
1
2
int* p = NULL;
delete p; // бессмысленно, но допустимо
Цитата Сообщение от Bobster Посмотреть сообщение
if (name=="AND")
C++
1
if(!strcmp(name, "AND"))
Сыроежка
Заблокирован
31.08.2011, 18:32     сконструировать класс #13
Цитата Сообщение от Bobster Посмотреть сообщение
Добрый день. Мне надо сконструировать следующий класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class LogicElement {
public:
    // constructors / destructor
    LogicElement(const char *ElementType, int nIpiNmb );
    LogicElement(const LogicElement &);
    ~LogicElement();
    //methods
    void SetInputs(const bool *inputs);
    bool Evaluate();
    void PrintStatus();
private:    
    char *name;// имя элемента  
    int inp_nmb; // количество входов элемента
    bool *inputs;//входные сигналы
};
Но при построении появляется ошибка:
Run-Time Check Failure #3 - The variable 'inputs' is being used without being initialized.
Как правильно ее инициализировать?
Вот код программы:

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
#include "header.h"
#include "stdio.h"
#include "string.h"
 
LogicElement::LogicElement(const char *ElementType, int nIpiNmb ){  
    name = new char[ strlen(ElementType) + 1 ]; 
    strcpy(name, ElementType);
    inp_nmb = nIpiNmb;
    inputs = new bool;
}
 
LogicElement::LogicElement(const LogicElement &q){
    name = new char[ strlen(q.name) + 1 ];
    strcpy(name, q.name);
    inp_nmb = q.inp_nmb;
    inputs = new bool;
}
 
LogicElement::~LogicElement(){
    
    delete[] name;
    inp_nmb = 0;
    delete[] inputs;
}
 
bool LogicElement::Evaluate(){
    bool b;
    int i;
    b=0;
    
    if (name=="AND")
        for (i=0; i<inp_nmb; i++){
            b = b && (*inputs);
            inputs++;
        };
    if (name=="OR")
        for (i=0; i<inp_nmb; i++){
            b = b || (*inputs);
            inputs++;
        };
    if (name=="XOR")
        for (i=0; i<inp_nmb; i++){
            b = (b || (*inputs)) && !(b && (*inputs));
            inputs++;
        };
    if (name=="ANDNEG")
        for (i=0; i<inp_nmb; i++){
            b = !(b && (*inputs));
            inputs++;
        };
    if (name=="ORNEG")
        for (i=0; i<inp_nmb; i++){
            b = !(b || (*inputs));
            inputs++;
        };
    return b;
};
 
void LogicElement::SetInputs(const bool *Inputs){
    int i;
    for (i=0; i<inp_nmb; i++)
        if (i/2==0){
            *inputs=0;
            inputs++;
        }
        else {
            *inputs=1;
            inputs++;
        }
};
 
void LogicElement::PrintStatus(){
    printf("%s %d\n", *name,inp_nmb);
}
 
 
 
 
#include "header.h"
#include "stdio.h"
 
 
int main(){
    char *s;
    s="AND";
    LogicElement x(s,2);
    bool *inputs; 
    x.SetInputs(inputs);
    x.Evaluate();
    x.PrintStatus();
return 0;
};
На мой вгляд, у вас вообще безграмотно определен класс.
Я не вижу никакого смысла объявлять указатель на bool вместо самого члена класса типа bool. Какой глубокий смысл состоит в том, чтобы выделять указатель на bool? Во-первых, вы не инициализируете свою переменную inputs значением при создании объекта вашего класса. То есть в этом члене содержится некий мусор. Во-вторых, в своей функции

C++
1
void LogicElement::SetInputs(const bool *Inputs)
вы передаваемыфй параметр Inputs вообще не используете. Спрашиваете, а зачем он тогда присутствует в объявлении вашей функции?!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2011, 22:54     сконструировать класс
Еще ссылки по теме:

Нужно сконструировать список ‘(1 2 3 4 5) из ‘(2), ‘(3 4) и 5 - Lisp
Ребят, помогите пжл с заданиями. 1) Нужно сконструировать список ‘(1 2 3 4 5) из ‘(2), ‘((3 4)) и 5 в LISP. 2) Определить функцию...

Сконструировать блочные матрицы - Matlab
Сконструировать блочные матрицы (используя функции для заполнения стандартных матриц) и применить функции обработки данных и поэлементные...

Сконструировать простой калькулятор - Delphi
Сконструировать простой калькулятор, который будет включать в себя следующие управляющие элементы: 1) поле редактирования, в которое...

Сконструировать простой калькулятор - Delphi
Сконструировать простой калькулятор, который будет включать в себя следующие управляющие элементы:  поле редактирования, в которое...


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

Или воспользуйтесь поиском по форуму:
Bobster
Сообщений: n/a
31.08.2011, 22:54     сконструировать класс #14
Все, всем спасибо. Со всем разобрался. Код реально глупый у меня был сначала) Просто начал изучение с++ два месяца назад. Язык вроде немного выучил, но вот навык программирования отсутствует.
Yandex
Объявления
31.08.2011, 22:54     сконструировать класс
Ответ Создать тему
Опции темы

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