Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 21

Использование указателя this

01.05.2016, 18:48. Показов 1335. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток
Ошибка при первом использовании указателя this, не в ходе компиляции, а как только заходит на это строчку в след ф-ции класса:
C++
1
2
3
4
5
6
7
8
// изменение модели ноутбука
void notebook::change_model() {
    printf("\nИзменение модели(%s) ноутбука.", this->model); // на этой строчке вылет с (*this). тоже самое
    char *new_model = (char*) calloc(max, sizeof(char));
    printf("\nВведите модель: "); gets(new_model);
    strcpy(this->model, new_model);
    free(new_model);
}
а если посмотреть содержимое "this" то там пишется только "чтение памяти невозможно" для всех полей

сама ошибка: Необработанное исключение по адресу 0x010D1C68 в L8.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC.

вот используемый класс:
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
class notebook {
    private:
        char *model;
        int RAM, CPU, *price, *date;
    public:
        // ------------------------
        char *get_model() {return model;}
        int get_RAM() {return RAM;}
        int get_CPU() {return CPU;}
        int *get_price() {return price;}
        int *get_date() {return date;}
        // ------------------------
        void set_model(char *name); 
        void set_RAM(int num) {RAM = num;}
        void set_CPU(int num) {CPU = num;}
        void set_price(int *mass);
        void set_date(int *mass);
        // функции
        void change_model();
        int compare_price(notebook &obj);
        void add_RAM();
        void change_CPU();
        void show();
        // конструкторы с параметрами и без
        notebook();
        notebook(char *model, int RAM, int CPU, int *price, int *date);
        notebook(const notebook &obj);
        ~notebook();
};
код из главной функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        printf("\nИзменить модель какого-либо ноутбука?(да - любая клавиша; нет  - esc)");
        int change_num;
        if (getch() != 27) {
            printf("\nМодель какого ноутбука вы хотите изменить(всего %d)?", nb);
            do {
                fflush(stdin); printf("\nВвод: ");  scanf("%d", &change_num);
            } while(change_num > nb || change_num < 0);
            notebooks[change_num]->change_model();
            //show_all_nb(notebooks);
            
            printf("%12.12s %12.12s %12.12s %12.12s %12.12s", "модель", "RAM(ГБ)", "CPU(мГЦ)", "цена", "дата");
            for (int i = 0; i < nb; i++) {
                printf("\n%3d ", i + 1);    
                notebooks[i]->show();
            }
        }
если надо могу весь код кинуть
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.05.2016, 18:48
Ответы с готовыми решениями:

Использование указателя this
Здравствуйте. Помогите пожалуйста сделать такое приложение на С++: Создать класс массив, состоящий из 10 действительных чисел....

Использование указателя this
Вообщем решил я задачу: файл 1: // stack.h -- class definition for the stack ADT #ifndef STACK_H_ #define STACK_H_ #include...

Использование указателя this
Есть класс пользователя в к нему нужно реализовать: 1) setEmail(char* email): void - изменение электронной почты с проверкой на...

21
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,877
01.05.2016, 20:18
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Mr_Wou Посмотреть сообщение
значения которые я ввиду или нет?
нет
вот допустим массив для цены из 4 элементов, допустим обнулен
потом вводим цену 1 2 3 и 4
значит сначала массив будет
0 0 0 0
потом
1 0 0 0
1 2 0 0
1 2 3 0
1 2 3 4
но в конструктор передается адрес массива, то бишь начало, и оно не меняется
в конструкторе копируются два элемента
значит у первого ноутбука будет цена 1 0
у всех последующих 1 2
0
0 / 0 / 0
Регистрация: 27.02.2016
Сообщений: 21
01.05.2016, 20:22  [ТС]
вот весь код, и я попробовал ввести для 3-4 ноутбуков и оно нормально ввелось
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define nb 2        // кол-во ноутбуков
#define max 100     // максимальное число ячеек при описании
 
class notebook {
    private:
        char *model;
        int RAM, CPU, *price, *date;
    public:
        // ------------------------
        char *get_model() {return model;}
        int get_RAM() {return RAM;}
        int get_CPU() {return CPU;}
        int *get_price() {return price;}
        int *get_date() {return date;}
        // ------------------------
        void set_model(char *name); 
        void set_RAM(int num) {RAM = num;}
        void set_CPU(int num) {CPU = num;}
        void set_price(int *mass);
        void set_date(int *mass);
        // функции
        void change_model();
        int compare_price(notebook &obj);
        void add_RAM();
        void change_CPU();
        void show();
        // конструкторы с параметрами и без
        notebook();
        notebook(char *model, int RAM, int CPU, int *price, int *date);
        notebook(const notebook &obj);
        ~notebook();
}; 
 
void show_all_nb(notebook *notebooks);
 
// главная функция
int main(void) {
    system("chcp 1251");
    notebook *notebooks[nb];
    notebook l;
    char model[max];
    int RAM, CPU, price[2], date[3];
    do {
        printf("\nВводите: модель, размер RAM(ГБ), частоту CPU(мГЦ), цену(руб. и коп. через пробел), дату(д. м. г. через пробел) через пробел!");
        for (int i = 0; i < nb; i++) {
            fflush(stdin);
            printf("\nВведите данные ноутбука %d.", i + 1);
            printf("\nВвод: "); scanf("%s%d%d", model, &RAM, &CPU);
            for (int i = 0; i < 2; i++) scanf("%d", &price[i]);
            for (int i = 0; i < 3; i++) scanf("%d", &date[i]);
            notebooks[i] = new notebook(model, RAM, CPU, price, date);
        }
        //show_all_nb(notebooks);
            
        printf("%12.12s %12.12s %12.12s %12.12s %12.12s", "модель", "RAM(ГБ)", "CPU(мГЦ)", "цена", "дата");
        for (int i = 0; i < nb; i++) {
            printf("\n%3d ", i + 1);    
            notebooks[i]->show();
        }
 
        printf("\nИзменить модель какого-либо ноутбука?(да - любая клавиша; нет  - esc)");
        int change_num;
        if (getch() != 27) {
            printf("\nМодель какого ноутбука вы хотите изменить(всего %d)?", nb);
            do {
                fflush(stdin); printf("\nВвод: ");  scanf("%d", &change_num);
            } while(change_num > nb || change_num < nb);
            notebooks[change_num]->change_model();
            //show_all_nb(notebooks);
            
            printf("%12.12s %12.12s %12.12s %12.12s %12.12s", "модель", "RAM(ГБ)", "CPU(мГЦ)", "цена", "дата");
            for (int i = 0; i < nb; i++) {
                printf("\n%3d ", i + 1);    
                notebooks[i]->show();
            }
        }
        puts("\nПовторить работу программы?(ДА - ESC; НЕТ - любая клавиша).");
    } while (getch() != 27);
    return 0;
}
 
void show_all_nb(notebook **notebooks) {
    
        printf("%12.12s %12.12s %12.12s %12.12s %12.12s", "модель", "RAM(ГБ)", "CPU(мГЦ)", "цена", "дата");
        for (int i = 0; i < nb; i++) {
            printf("\n%3d ", i + 1);    
            notebooks[i]->show();
        }
}
 
// печать параметров одного ноутбука
void notebook::show() {
    printf("%12s %12d %12d ", model, RAM, CPU);
    printf("%10d.%2d ", price[0], price[1]);
    printf("%6d:%2d:%4d ", date[0], date[1], date[2]);
    //for (int i = 0; i < 2; i++) {printf(" %6d", price[i]); if(i + 1 != 2) printf(".");}
    //for (int i = 0; i < 3; i++) {printf(" %4d", date[i]); if (i + 1 != 3) printf(":");}
}
 
// изменение модели ноутбука
void notebook::change_model() {
    model = (char*) calloc(max, sizeof(char));
    printf("\nИзменение модели(%s) ноутбука.", model);
    char *new_model = (char*) calloc(max, sizeof(char));
    printf("\nВведите модель: "); gets(new_model);
    strcpy(model, new_model);
    free(new_model);
}
 
// сравнение двух ноутбуков по цене
int notebook::compare_price(notebook &obj) {
    for (int i = 0; i < 2; i++) {
        if ((*this).price[i] > obj.price[i]) return 1;
        if ((*this).price[i] > obj.price[i]) return 2;
    }
    return 0;
}
 
// добавление модуля оперативной памяти
void notebook::add_RAM() {
    printf("\nДобавление оперативной памяти к уже имеющимся: %d.", (*this).RAM);
    int add_RAM;
    printf("\nВведите кол-во добавленняемой памяти: "); scanf("%d", &add_RAM);
    (*this).RAM = add_RAM;
}
 
// изменение процессора
void notebook::change_CPU() {
    printf("\nИзменение частоты процессора(%d) ноутбука.", (*this).CPU);
    int new_CPU;
    printf("\nВведите новую частоту процессора: "); scanf("%d", &new_CPU);
    (*this).CPU = new_CPU;
}
 
// описание модели
void notebook::set_model(char *name) {
    if ((*this).model == NULL)
        (*this).model = (char*) calloc(max, sizeof(char));
    strcpy((*this).model, name);
}
 
// описание цены
void notebook::set_price(int *mass) {
    if ((*this).price == NULL)
        (*this).price = (int*) calloc(2, sizeof(int));
    for (int i = 0; i < 2; i++)
        (*this).price[i] = mass[i];
}
 
// описание даты
void notebook::set_date(int *mass) {
    if ((*this).date == NULL)
        (*this).date = (int*) calloc(3, sizeof(int));
    for (int i = 0; i < 3; i++)
        (*this).date[i] = mass[i];
}
 
// конструктор класса ноутбук
notebook::notebook() {
    model = (char*) calloc(max, sizeof(char));
    RAM = 0;
    CPU = 0;
    price = (int*) calloc(max, sizeof(int));
    date = (int*) calloc(max, sizeof(int));
}
 
// конструктор с параметрами класса ноутбук
notebook::notebook(char *model, int RAM, int CPU, int *price, int *date) {
    //if ((*this).model == NULL) {
//      free((*this).model);
        (*this).model = (char*) calloc(max, sizeof(char));
    //}
    for (int i = 0; i  < strlen(model) + 1; i++) 
        (*this).model[i] = model[i];
    //strcpy((*this).model, model);
 
    (*this).RAM = RAM;
    (*this).CPU = CPU;
 
    /*if ((*this).price == NULL)*/ (*this).price = (int*) calloc(2, sizeof(int));
    for (int i = 0; i < 2; i++) 
        (*this).price[i] = price[i];
 
    /*if((*this).date == NULL)*/ (*this).date = (int*) calloc(3, sizeof(int));
    for (int i = 0; i < 3; i++) {
        (*this).date[i] = date[i];
        int k = 1;
    }
}
 
// конструктор копирования класса ноутбук
notebook::notebook(const notebook &obj) {
    if (obj.model) {
        free(model);
        model = (char*) calloc(strlen(obj.model) + 1, sizeof(char));
        strcpy(model, obj.model);
    }
    else model = 0;
    RAM = obj.RAM;
    CPU = obj.CPU;
    if (obj.price) {
        free(price);
        price = (int*) calloc(2, sizeof(int));
        for (int i = 0; i < 2; i++) price[i] = obj.price[i];
    }
    else price = 0;
    if (obj.date) {
        free(date);
        date = (int*) calloc(3, sizeof(int));
        for (int i = 0; i < 3; i++) date[i] = obj.date[i];
    }
    else date = 0;
}
 
// деструктор класса ноутбук
notebook::~notebook() {
    if (model) free(model);
    RAM = 0;
    CPU = 0;
    if (price) free(price);
    if(date) free(date);
}
вот

Добавлено через 1 минуту
ну так там поток чистится перед вводом следующего ноутбука
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.05.2016, 20:22

Использование указателя на функцию
void treug (float a, float b, float c, int*p) { p=0; if ((a+b&gt;c) || (b+c&gt;a) || (c+a&gt;b)) { p=1; printf (&quot;Treug. sush.&quot;); ...

Использование указателя на функцию
нужна помощь с переделкой кода. имеющийся код который вычисляет максимально из 2 чисел, нужно переделать используя функции на указатель....

Использование ссылки и указателя
Доброго времени суток! Возник такой вопрос, есть код: #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() ...

Использование младшего бита указателя
#include &lt;iostream&gt; using namespace std; struct Foo { void hello() { int seachSecretBit = reinterpret_cast&lt;int&gt;(this); ...

Использование указателя на константную строку
Здравствуйте. Почему так char* kk = &quot;345345&quot;; kk = 0x00; компилятор ругается, а так char* kk = new char;


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. Сразу отвечу: А в PvP с ним. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru