Меню

Ошибка файловой системы 1073740940

1) Скачайте последнюю версию лаунчера с главной страницы TLauncher

2) Нужно проверить, действительно ли у вас данная версия драйверов видеокарты. Нажимаем «Пуск» пишем в поиск «dxdiag. exe» и запускаем данную программу. В ней выбираем вкладку «Экран» (Монитор) и если находим такую надпись возле «Версии:» . 3.7849 (что и означает версию 378.49), то у вас проблема в драйверах! Переходите к следующему пункту.

3.1) Установите более новую версию драйвера, например 378.66, через их программу Geforce Experience.

Или второй вариант:

3.2) Так же, можно установить чуть более старую версию драйверов видеокарты, например 376.33. Ссылка для скачивания: https://www. nv >

На данной странице, вам придётся выбрать вашу модель видеокарты и версию операционной системы, нажать «Поиск» и скачать драйвера.

Если Ваша проблема остаётся актуальной, запросите поддержку у TLauncher:

Details

> [16:03:10] [Server thread/INFO]: Preparing spawn area: 100%

> [16:03:10] [Server thread/INFO]: Time elapsed: 22561 ms

> [16:03:13] [Server thread/INFO]: Changing view distance to 6, from 10

> [16:03:13] [Server thread/WARN]: Can’t keep up! Is the server overloaded? Running 2827ms or 56 ticks behind

> [16:03:15] [Server thread/INFO]: ****[local:E:e26e0339] logged in with entity id 401 at (34.5, 76.0, 22.5)

> [16:03:15] [Server thread/INFO]: ****joined the game

> [16:03:16] [Server thread/INFO]: Saving and pausing game.

> [16:03:16] [Server thread/INFO]: Saving chunks for level ‘New World’/overworld

> [16:03:16] [Client thread/INFO]: Loaded 0 advancements

[VersionManager] Refreshing versions locally.

[VersionManager] Versions has been refreshed (17 ms)

[Launcher] Launcher exited.

Tried almost everything, uinstalled java and installed few different versions, checked my drivers and all of them are the newest, tried something from internet videos what i saw. Does someone know?

Самая популярная песочница собрала внушительную армию фанатов, которая запускает миллионы игровых сессий ежедневно. Естественно, при таких масштабах нельзя обойтись без сбоев. Одной из популярных проблем является ошибка “Minecraft closed with exit code 1” или “TLauncher: произошла непредвиденная ошибка”, которая появляется при запуске TLauncher Forge любой версии. Сегодня мы постараемся рассказать о всех возможных причинах данного бага, а также покажем как устранить большинство из них.

Ошибка “Minecraft closed with exit code 1”

Причины ошибки в Майнкрафт

Сама ошибка указывает лишь на то, что произошел сбой. Конкретную информацию можно увидеть в информационном окне, где будет указанна сама причина. Источники проблемы могут быть разными, отчего пользователи получают различные уведомления:

Непредвиденная ошибка в TLauncher

В основном проблема появляется после смены версии ОС, применении системных обновлений или переходе на новую версию игрового лаунчера. Также стоит упомянуть про влияние модов и расширений.

Как исправить Minecraft closed with exit code 1

Мы собрали все отмеченные игроками решения, а описание сделали начиная с самых простых. Далее действуйте по-пунктам, каждый раз проверяя работоспособность игры.

Описанная ошибка в Майнкрафт является очень распространенной. Поочередно проверьте все пункты, которые обязательно должны помочь в устранении бага.

Про смартфон — цены, обзоры и реальные отзывы покупателей

1) Скачайте последнюю версию лаунчера с главной страницы TLauncher

2) Нужно проверить, действительно ли у вас данная версия драйверов видеокарты. Нажимаем «Пуск» пишем в поиск «dxdiag. exe» и запускаем данную программу. В ней выбираем вкладку «Экран» (Монитор) и если находим такую надпись возле «Версии:» . 3.7849 (что и означает версию 378.49), то у вас проблема в драйверах! Переходите к следующему пункту.

3.1) Установите более новую версию драйвера, например 378.66, через их программу Geforce Experience.

Или второй вариант:

3.2) Так же, можно установить чуть более старую версию драйверов видеокарты, например 376.33. Ссылка для скачивания: https://www. nv >

На данной странице, вам придётся выбрать вашу модель видеокарты и версию операционной системы, нажать «Поиск» и скачать драйвера.

Если Ваша проблема остаётся актуальной, запросите поддержку у TLauncher:

Некоторые пользователи операционной системы Windows при запуске какого-либо приложения с правами администратора могут столкнуться с ошибкой «Ошибка файловой системы 1073741819». Довольно часто это происходит при переходе и соответствующем обновлении с Windows 7 на Windows 10, но бывают случаи, что с данной проблемой встречаются пользователями Windows 7 и Windows 8. В этой статье я расскажу, в чём суть ошибки 1073741819, каковы её причины, и как исправить ошибку файловой системы на ваших ПК.

Скриншот — Error code: — 1073741819

Причины ошибки файловой системы 1073741819

Наиболее часто с данной ошибкой встречаются пользователи ОС Виндовс 10, после перехода на неё с Виндовс 7. Возникновение данной ошибки не только мешает запуску программ с административными правами, но и просто не даёт установить в системе какой-либо новый софт. Каждый раз, когда пользователь пытается выполнить подобное, UAC (система контроля учётных записей пользователя) выдаёт ошибку 1073741819, по сути блокируя административную активность в операционной системе.

Основной причиной, как не странно, обычно является звуковая схема, которая перешла с вашей Windows 7 на Windows 10 при обновлении из одной ОС в другую. По определённым причина Виндовс 10 не способна проигрывать некоторые системные звуки звуковой схемы Виндовс 7, и, как результат, UAC блокирует административный доступ к системному функционалу.

Доступ заблокирован

Как исправить ошибку файловой системы 1073741819

В соответствии с вышеописанным, пресловутая ошибка файловой системы 1073741819 исправляется следующими способами:

Способ 1. Измените звуковую схему на «по умолчанию»

Для этого перейдите в «Панель Управления» – «Звуки», найдите там параметр «Звуковую схема» и установите на «По умолчанию» (или «Windows по умолчанию»). Рассматриваемая мной ошибка после этого должна пропасть.

Выбираем звуковую схему «По умолчанию»

Рекомендую также отключить уведомления UAC, для чего откройте стартовое меню, найдите и кликните на «Контроль учётных записей пользователя» (User Access Control), нажмите на «Изменение параметров контроля учётной записи» (Change User Access Control»), и установите ползунок в самое нижнее значение.

Способ 2. Измените рабочую тему ОС Windows

Способ 3. Отключите UAC

Выбираем «Никогда не уведомлять»

Способ 4. Создайте другой пользовательский аккаунт

Ещё одним, и довольно эффективным способом решения проблемы 1073741819, будет создание новой учётной записи и работа с ней. Обычно в новой «учётке» рассматриваемая мной проблема пропадает.

Способ 5. Измените параметры питания

Способ 6. Удалите AVAST

В довольно редких случаях причиной рассматриваемой проблемы выступал функционал антивируса AVAST, установленного на компьютере пользователя. Для избавления от ошибки 1073741819 рекомендуется полностью удалить данный антивирус с вашего компьютера, заменив его более стабильной альтернативой.

Заключение

Основным решением проблемы «Ошибка файловой системы 1073741819» является схема звуковой схемы, использующейся по умолчанию в ОС Windows. Если данный вариант не помог, попробуйте другие, перечисленные мной, советы, они помогут устранить ошибку 1073741819 на ваших ПК.

We are currently investigating the root cause of this issue. In order to solve this issue, some known workarounds include reinstalling the JVM or updating your graphics drivers, this error may also be caused by having «D3Dgear» installed.

How to fix this

Due to the quite vagueness of the error, we are unsure of the exact cause. Please try the following and attempt to see it they solve your case:

Reinstalling Java

Minecraft, runs on a platform called Java. Java comes in many shapes, and forms, which may make it confusing exactly which version of it you should have installed, which is what this should hopefully explain.

First, we want to find out our OS’s processor architecture.

If you are on Windows — Press your Windows + R keys, to bring up a run dialogue, in it, type in: «cmd«, and hit enter. This will bring up a command prompt window. In the window, type in: echo %processor_architecture% then hit enter.
If the output was amd64, you have a 64-bit OS. If the output was x86, you have a 32-bit OS.

If you are on Mac OSX — You have a 64-bit OS, all good!

Now that we have that, look at the diagram below, and download the proper Java version for your OS and processor architecture. If you are prompted that said version of Java is already installed, please uninstall your current version of Java and redo this step.

# 32 bit OS 64 bit OS
Windows jre-7u25-windows-i586.exe jre-7u25-windows-x64.exe
Mac OSX jre-7u25-macosx-x64.dmg
Linux jre-7u25-linux-i586.rpm jre-7u25-linux-x64.rpm

Once you have installed the proper Java version, you should give the game a go!

Источники:

https://window-10.ru/launcher-minecraft-closed-with-exit-code/

https://pro-smartfon. ru/minecraft-closed-with-exit-code-1073741819/

Код ошибки 1073740940 (-1073740940, если быть точнее) может возникать в Minecraft по самым разным причинам, однако чаще всего ее вызывает следующее:

  • устаревшая версия Java;
  • недостаток выделенной оперативной памяти;
  • конфликтующие с игрой модификации.

Итак, что можно сделать, чтобы избавиться от ошибки 1073740940? Во-первых, вам нужно обновить версию Java на своем компьютере. Возможно, вы решили поиграть в Minecraft на только что установленной ОС, и еще не успели установить актуальную версию Java.

Также можно попробовать выделить чуть больше оперативной памяти для игры. Запустите лаунчер Minecraft и перейдите в раздел загрузок. У последнего релиза кликните на значок ••• и выберите «Редактировать». Опуститесь к строке аргументов JVM и вставьте в пустую строку значение -Xmx4G или -Xmx8G (зависит от объема ОЗУ в вашем ПК). Сохраните изменения и запустите игру.

Согласно сообщениям в сети, некоторые модификации также способны вызывать появление кода 1073740940 в Minecraft. К примеру, после продолжительных исследований, ребята на Reddit определили, что данную ошибку может вызывать мод Supplementaries (от MehVahdJukaar). Решение — удаление проблемного мода либо установка его другой версии.

  • Remove From My Forums

 none

присоединенное к системе устройство не работает

  • Вопрос

  • присоединенное к системе устройство не работает. выдает мне винда когда пытаюсь открыть программы типа эмуляторы и настройки звука другие программы не пробовал.

Ответы

  • для начала было бы хорошо описать среду в которой возникает ошибка — какая ос, с каким состоянием обновлений и антивирусом, на какое железо установлено, потом можно описать последовательность дейсвий которая приводит к проблемы,
    и чего вы пытаетесь добиться.

    вначале фигурировали эмуляторы, потом крах файловой системы, а в конце выяснится что вы на калькуляторе адронный коллайдер строите.

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


    The opinion expressed by me is not an official position of Microsoft

    • Изменено

      29 декабря 2017 г. 20:23

    • Помечено в качестве ответа
      Petko KrushevMicrosoft contingent staff, Moderator
      4 января 2018 г. 8:30

The program returns the user N number of odd squares starting from 1.

From numbers 5-10 and then 20, (I didn’t go further) when deleting array A it crashes with the error message: «Process returned -1073740940 (0xC0000374)». Which is apparently a memory violation?

#include <iostream>
using namespace std;

int main(){
    int ok;
    int counter;
    do {
        int size;
        while (true) {
            cout << "Enter the number of perfect odd squares you want" << endl;
            cin >> size;
            if(size<1) {
                cout << "Enter a valid number" << endl;
                continue;
            }
            else break;
        }
        if (size%2==0) counter=size*2-1;
        else counter=size*2;
        int *A = new int[size];
        for (int i=1; i<=counter; i=i+2){
            A[i]=i*i;
            cout<<A[i] << endl;
        }
        delete[]A;

        cout << " Continue (1) or quit (0)?" << endl;
        cin >> ok;

    }while(ok==1);

}

asked Nov 25, 2021 at 22:02

Anatolijs Karpovs's user avatar

2

From the NTSTATUS reference:

0xC0000374 STATUS_HEAP_CORRUPTION — A heap has been corrupted

You appear to access A (a heap allocated object) out of bounds — A[0] through A[size-1] are valid elements to access but counter goes as high as 2*size. Any attempts to write to values past A[size-1] can corrupt the heap leading to this error.

Calculate counter first and use that as the allocation size.

answered Nov 25, 2021 at 22:09

nanofarad's user avatar

nanofaradnanofarad

39.7k4 gold badges88 silver badges116 bronze badges

0

The program returns the user N number of odd squares starting from 1.

From numbers 5-10 and then 20, (I didn’t go further) when deleting array A it crashes with the error message: «Process returned -1073740940 (0xC0000374)». Which is apparently a memory violation?

#include <iostream>
using namespace std;

int main(){
    int ok;
    int counter;
    do {
        int size;
        while (true) {
            cout << "Enter the number of perfect odd squares you want" << endl;
            cin >> size;
            if(size<1) {
                cout << "Enter a valid number" << endl;
                continue;
            }
            else break;
        }
        if (size%2==0) counter=size*2-1;
        else counter=size*2;
        int *A = new int[size];
        for (int i=1; i<=counter; i=i+2){
            A[i]=i*i;
            cout<<A[i] << endl;
        }
        delete[]A;

        cout << " Continue (1) or quit (0)?" << endl;
        cin >> ok;

    }while(ok==1);

}

asked Nov 25, 2021 at 22:02

Anatolijs Karpovs's user avatar

2

From the NTSTATUS reference:

0xC0000374 STATUS_HEAP_CORRUPTION — A heap has been corrupted

You appear to access A (a heap allocated object) out of bounds — A[0] through A[size-1] are valid elements to access but counter goes as high as 2*size. Any attempts to write to values past A[size-1] can corrupt the heap leading to this error.

Calculate counter first and use that as the allocation size.

answered Nov 25, 2021 at 22:09

nanofarad's user avatar

nanofaradnanofarad

39.7k4 gold badges88 silver badges116 bronze badges

0

Nikis0715

0 / 0 / 0

Регистрация: 06.10.2020

Сообщений: 26

1

30.01.2021, 17:55. Показов 7471. Ответов 17

Метки с++ (Все метки)


Здравствуйте, пишу калькулятор двоичных чисел. Почему-то часто вылезает ошибка -1073740940 и программа не считает. В чем может быть дело?

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
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
#include <iostream>
#include <string>
 
using namespace std;
 
class Binary {
public:
    int mem;
    int* bin;
    int dec;
 
    Binary();
    Binary(int dec);
    Binary(int dec, int mem);
    Binary(int* bin, int mem);
    Binary(const Binary& num2);
    ~Binary() {
        delete[]bin;
        bin = nullptr;
    }
    friend Binary operator+(Binary num1, Binary num2);
    friend Binary operator-(Binary num1, Binary num2);
    friend Binary operator*(Binary num1, Binary num2);
    friend void dectobin(int dec, int* bin, int mem);
    friend int bintodec(int* bin, int mem);
    int getmem();
    int getdec();
    int* getbin();
    void printbin();
    void printdec();
};
 
void dectobin(int dec, int* bin, int mem) {
    int dec1 = dec;
    for (int i = 0; i < mem; i++) {
 
        bin[i] = dec1 % 2;
        dec1 = (dec1 - bin[i]) / 2;
    }
}
 
int bintodec(int* bin, int mem) {
    int dec = 0;
    for (int i = 0; i < mem; i++) {
        dec = dec + bin[i] * (int) pow(2, i);
    }
    return dec;
}
 
Binary::Binary() {
    mem = 8;
    dec = 0;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
 
Binary::Binary(int d) {
    dec = d;
    mem = 8;
    if (d >= 0 && d < pow(2, 8)) mem = 8;
    if (d >= pow(2, 8) + 1 && d < pow(2, 16)) mem = 16;
    if (d >= pow(2, 16) + 1 && d < pow(2, 32)) mem = 32;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
 
Binary::Binary(int d, int m) {
    dec = d;
    mem = m;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
 
Binary::Binary(int* b, int m) {
    mem = m;
    bin = new int[mem];
    for (int i = 0; i < mem; i++) {
        bin[i] = b[i];
    }
    dec = bintodec(bin, mem);
}
 
Binary::Binary(const Binary& num2) {
    mem = num2.mem;
    dec = num2.dec;
    bin = new int[mem];
    for (int i = 0; i < mem; i++) {
        bin[i] = num2.bin[i];
    }
}
 
int Binary::getmem() {
    return this->mem;
}
 
int* Binary::getbin() {
    int* bin1 = new int[mem];
    for (int i = 0; i < mem; i++) {
        bin1[i] = bin[i];
    }
    return bin1;
}
 
int Binary::getdec() {
    return this->dec;
}
 
void Binary::printbin() {
    for (int i = mem - 1; i >= 0; i--) {
        cout << bin[i];
    }
}
 
void Binary::printdec() {
    cout << dec;
}
 
Binary operator+(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
    int mem3 = 8;
    if (num1.getmem() > num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3 - 8; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] += bin1[i];
            if (i == mem3 - 1 && bin3[i] == 2) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
        }
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() == num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (i == mem3 - 1 && bin1[i] + bin2[i] > 1) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                if (i < mem3 - 1) bin3[i + 1] += 1;
            }
 
        }
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() < num2.getmem()) {
        mem3 = num2.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3 - 8; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            if (i == mem3 - 1 && bin3[i] == 2) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
 
        }
        return Binary(bin3, mem3);
    }
    return Binary(0);
}
 
Binary operator-(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
 
    int mem3 = 8;
    if (num1.getmem() > num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3 - 8; i++) {
            if (bin1[i] < bin2[i]) {
                bin1[i + 1] -= 1;
                bin1[i] += 2;
                bin3[i] = bin1[i] - bin2[i];
            }
            else bin3[i] = bin1[i] - bin2[i];
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] = bin1[i];
        }
 
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() < num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3 - 8; i++) {
            if (bin2[i] < bin1[i]) {
                bin2[i + 1] -= 1;
                bin2[i] += 2;
                bin3[i] = bin2[i] - bin1[i];
            }
            else bin3[i] = bin2[i] - bin1[i];
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] = bin2[i];
        }
 
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() == num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            if (num1.getdec() > num2.getdec()) {
                if (bin1[i] < bin2[i]) {
                    bin1[i + 1] -= 1;
                    bin1[i] += 2;
                    bin3[i] = bin1[i] - bin2[i];
                }
                else bin3[i] = bin1[i] - bin2[i];
            }
            if (num1.getdec() <= num2.getdec()) {
                if (bin2[i] < bin1[i]) {
                    bin2[i + 1] -= 1;
                    bin2[i] += 2;
                    bin3[i] = bin2[i] - bin1[i];
                }
                else bin3[i] = bin2[i] - bin1[i];
            }
        }
 
        return Binary(bin3, mem3);
    }
    return Binary(0);
}
 
Binary operator*(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
    int mem3 = 8;
    int mem1 = num1.getmem();
    int mem2 = num2.getmem();
    int d1 = num1.getdec();
    int d2 = num2.getdec();
    int d = d1 * d2;
    if (d >= 0 && d < pow(2, 8)) mem3 = 8;
    if (d >= pow(2, 8) + 1 && d < pow(2, 16)) mem3 = 16;
    if (d >= pow(2, 16) + 1 && d < pow(2, 32)) mem3 = 32;
    if (d > pow(2, 32)) {
        cout << "Максимального размера выделяемой памяти недостаточно для получения ответа. Операция прервана";
        return Binary(0);
    }
    int* bin3 = new int[mem3];
    for (int i = 0; i < mem3; i++) {
        bin3[i] = 0;
    }
 
    for (int i = 0; i < mem1; i++) {
        for (int j = 0; j < mem2; j++) {
            bin3[i + j] += bin1[i] * bin2[j];
            if (bin3[i + j] > 1) {
                bin3[i + j] -= 2;
                bin3[i + j + 1] += 1;
            }
        }
    }
 
    return Binary(bin3, mem3);
}
 
int main() {
    setlocale(LC_ALL, "Rus");
    int otv(1);
    //while (otv == 1) {
        int d1(0), d2(0), count(0);
        char zn1('+'), zn2('+'), zn3('+'); //переменные для хранения знаков. Знак 2 определяем действие между числами. Знаки 1 и 3 - знаки чисел
        string v;//строка, для считывания выражения
        string D1, D2; //строки, в которые запишем числа
        cout << "Введите выражение" << endl;
        getline(cin, v); //считываем введенное выражение в строку
        int length = v.length(); // определяем длину строки
        /////////////////////////////////////////////
        //1 ЭТАП: ОПРЕДЕЛЕНИЕ ЗНАКОВ В ВЫРАЖЕНИИ//
        count = 0; //зануляем счетчик кол-ва знаков в строке
        for (int i = 0; i < length; i++) {
            if (v[i] == '-' || v[i] == '+' || v[i] == '*') count++; //узнаем кол-во знаков в строке
        }
 
        int* pointer = new int[3];//в этот массив сохраним номера позиций знаков, чтобы разграничить и считать числа
        for (int i = 0; i < 3; i++) {
            pointer[i] = 0;
        }
        if (count == 1) { // если в строке только 1 знак
            zn1 = '+';
            zn3 = '+'; // то 1 и 3 знак - это +
            for (int i = 0; i < length; i++) {
                if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                    zn2 = v[i]; //определяем знак 2
                    pointer[0] = i;
                }
            }
            D1.assign(v, 0, pointer[0]);//сохраняем первое число в строку
            d1 = atoi(D1.c_str());//переводим строку в число
            D2.assign(v, pointer[0] + 1, length - pointer[0]);//по аналогии
            d2 = atoi(D2.c_str());
        }
 
 
        if (count == 2) { //если в строке  2 знака, то
            if (v[0] == '-') {// если первый знак -, то далее ищем второй знак
                zn1 = '-';
                for (int i = 0; i < length; i++) {
                    if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                        zn2 = v[i];
                        pointer[0] = i;
                    }
                }
                zn3 = '+';
                D1.assign(v, 1, pointer[0] - 1);//сохраняем первое число в строку
                d1 = atoi(D1.c_str());//переводим строку в число
                D2.assign(v, pointer[0] + 1, length - pointer[0]);//по аналогии
                d2 = atoi(D2.c_str());
            }
            else { //иначе 
                count = 0; //зануляем счетчик кол-ва знаков
                for (int i = 0; i < length; i++) {
                    if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                        if (count == 1) {
                            zn3 = v[i];
                            count++;
                            pointer[1] = i;
                        }
                        if (count == 0) {
                            zn2 = v[i];
                            count++;
                            pointer[0] = i;
                        }
                    }
                }
                D1.assign(v, 0, pointer[0]);//сохраняем первое число в строку
                d1 = atoi(D1.c_str());//переводим строку в число
                D2.assign(v, pointer[1] + 1, length - pointer[1]);//по аналогии
                d2 = atoi(D2.c_str());
            }
        }
 
 
        if (count == 3) {//если в строке 3 знака, то сохраняем знаки поочередно 
            for (int i = 0; i < length; i++) {
                if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                    if (count == 2) {
                        zn3 = v[i];
                        count++;
                        pointer[2] = i;
                    }
                    if (count == 1) {
                        zn2 = v[i];
                        count++;
                        pointer[1] = i;
                    }
                    if (count == 0) {
                        zn1 = v[i];
                        count++;
                        pointer[0] = i;
                    }
                }
            }
            D1.assign(v, pointer[0] + 1, pointer[1] - pointer[0] - 1);//сохраняем первое число в строку
            d1 = atoi(D1.c_str());//переводим строку в число
            D2.assign(v, pointer[2] + 1, length - pointer[2]);//по аналогии
            d2 = atoi(D2.c_str());
        }
        /////////////////////
        //2 ЭТАП. ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЯ//
        if (count == 1) {
            Binary bin1(d1), bin2(d2);
            Binary bin3(bin1 + bin2), bin4(bin1 - bin2), bin5(bin1 * bin2), bin6(bin2 - bin1);
            switch (zn2)
            {
            case '+':
                bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; bin3.printbin(); cout << endl;
                bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; bin3.printdec(); cout << endl;
                break;
            case '-':
                if (bin1.getdec() < bin2.getdec()) {
                    bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin6.printbin(); cout << endl;
                    bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin6.printdec(); cout << endl;
                    break;
                }
                bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; bin4.printbin(); cout << endl;
                bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; bin4.printdec(); cout << endl;
                break;
            case '*':
                bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; bin5.printbin(); cout << endl;
                bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; bin5.printdec(); cout << endl;
                break;
            default: cout << "Введен неверный знак. Попробуйте еще раз" << endl;
                break;
            }
        }
        else {
            Binary bin1(d1), bin2(d2);
            Binary bin3(bin1 + bin2), bin4(bin1 - bin2), bin5(bin1 * bin2), bin6(bin2 - bin1);
            switch (zn2)
            {
            case '+':
                if (zn1 == '+' && zn3 == '+') {
                    bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; bin3.printbin(); cout << endl;
                    bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; bin3.printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '+') {
                    if (bin1.getdec() <= bin2.getdec()) {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; bin6.printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; bin6.printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin4.printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin4.printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '+' && zn3 == '-') {
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin6.printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin6.printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin4.printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin4.printdec(); cout << endl;
                        break;
                    }
                }
            case '-':
                if (zn1 == '+' && zn3 == '+') {
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin6.printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin6.printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin4.printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin4.printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '-' && zn3 == '+') {
                        cout << "-"; bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin3.printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin3.printdec(); cout << endl;
                        break;
                }
                if (zn1 == '+' && zn3 == '-') {
                        bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; bin3.printbin(); cout << endl;
                        bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; bin3.printdec(); cout << endl;
                        break;
                }
            case '*':
                if (zn1 == '+' && zn3 == '+') {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; bin5.printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; bin5.printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '+') {
                    cout << "-"; bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = -"; bin5.printbin(); cout << endl;
                    cout << "-"; bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = -"; bin5.printdec(); cout << endl;
                    break;
                }
                if (zn1 == '+' && zn3 == '-') {
                    bin1.printbin(); cout << " * (-"; bin2.printbin(); cout << ") = -"; bin5.printbin(); cout << endl;
                    bin1.printdec(); cout << " * (-"; bin2.printdec(); cout << ") = -"; bin5.printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '-') {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; bin5.printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; bin5.printdec(); cout << endl;
                    break;
                }
            default: cout << "Введен неверный знак. Попробуйте еще раз" << endl;
                break;
            }
        }
        /*cout << "Если хотите продолжить, введите 1" << endl;
        cin >> otv;
        cout << endl;*/
        
    //}
    return 0;
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



1270 / 1027 / 470

Регистрация: 25.12.2016

Сообщений: 3,333

30.01.2021, 19:10

2

В отладчике программу запускали?

Добавлено через 6 секунд
На каких входных данных возникает ошибка?



0



0 / 0 / 0

Регистрация: 06.10.2020

Сообщений: 26

30.01.2021, 19:21

 [ТС]

3

На сложениях чисел с одинаковым и разным количеством выделяемой памяти.

Отладчик выдает: wntdll.pdb содержит отладочную информацию, необходимую для поиска исходного кода для модуля ntdll.dll



0



1270 / 1027 / 470

Регистрация: 25.12.2016

Сообщений: 3,333

30.01.2021, 19:27

4

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

На сложениях чисел с одинаковым и разным количеством выделяемой памяти.

Приведите конкретные числа.



0



0 / 0 / 0

Регистрация: 06.10.2020

Сообщений: 26

30.01.2021, 21:11

 [ТС]

5

260 и 2



0



1270 / 1027 / 470

Регистрация: 25.12.2016

Сообщений: 3,333

30.01.2021, 21:37

6

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

260 и 2

У меня работает без ошибок (ввожу 260 + 2).

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

Отладчик выдает: wntdll.pdb содержит отладочную информацию, необходимую для поиска исходного кода для модуля ntdll.dll

Ну выдаёт и выдаёт — пусть так.
Вопрос в том работает отладка или нет? Программу можно выполнить «по шагам»?



0



0 / 0 / 0

Регистрация: 06.10.2020

Сообщений: 26

30.01.2021, 21:41

 [ТС]

7

Я только скопировал код и создал новый проект и все заработало. Не знаю, в чем была проблема. Новый проект все решил



0



1270 / 1027 / 470

Регистрация: 25.12.2016

Сообщений: 3,333

30.01.2021, 21:43

8

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

Новый проект все решил

Так бывает.



1



TheCalligrapher

Вездепух

Эксперт CЭксперт С++

10420 / 5692 / 1550

Регистрация: 18.10.2014

Сообщений: 14,022

30.01.2021, 22:03

9

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

Почему-то часто вылезает ошибка

Ну так а чем вас не устроила первая очевидная причина: Распространенные ошибки

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

260 и 2

Что такое «260 и 2»? Ваша программа поддерживает операцию «и»?

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

Новый проект все решил

Нет, не нужно выдумывать. Ничего он не решил. Программа действительно падает.

В operator * написана какая-то чушь при вычислении размера памяти mem3. В результате происходит вылет за пределы выделенной памяти и разрушение кучи. Отсюда и падение.

Точнее сказать, памяти этой хватило бы, если бы цикл бинарного умножения был написан грамотно. Но цикл бинарного умножения ведет себя «нагло»

C++
1
2
3
4
5
6
7
8
9
    for (int i = 0; i < mem1; i++) {
        for (int j = 0; j < mem2; j++) {
            bin3[i + j] += bin1[i] * bin2[j];
            if (bin3[i + j] > 1) {
                bin3[i + j] -= 2;
                bin3[i + j + 1] += 1;
            }
        }
    }

Вот этот цикл разрушает память.

Отдельно хотелось бы обратить внимание на такое

C++
1
2
3
4
    if (d > pow(2, 32)) {
        cout << "Максимального размера выделяемой памяти недостаточно для получения ответа. Операция прервана";
        return Binary(0);
    }

при int d. Это какого же размера у вас int, если он может быть больше чем 2 в 32 степени? Что за платформа?

И почему вообще у вас в программе используется функция pow? Откуда возникла такая идея?

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

пишу калькулятор двоичных чисел.

Непонятно, почему ваш «калькулятор двоичных чисел» параллельно делает вычисления во внутреннем формате и в вашем двоичном формате. Зачем вы писали двоичное умножение, если вы все равно в реализации operator * делаете обычное умножение int d = d1 * d2;? Какой смысл «писать калькулятор двоичных чисел», если вы все равно повторяете вычисления обычным образом???



1



Nikis0715

0 / 0 / 0

Регистрация: 06.10.2020

Сообщений: 26

30.01.2021, 22:15

 [ТС]

10

В фото требования к программе.

С умножением проблем нет. Проблемы с вычитанием и сложением 300 и 100, например. То есть, для одного выделяется массив с 16 элементами, а для другого — с 8.

Я убрал конструктор по умолчанию, и программа перестала падать.

C++ (Qt)
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
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
#include <iostream>
#include <string>
 
using namespace std;
 
class Binary {
public:
    int mem;
    int* bin;
    int dec;
 
    //Binary();
    Binary(int dec);
    Binary(int dec, int mem);
    Binary(int* bin, int mem);
    Binary(const Binary& num2);
    ~Binary() {
        delete[]bin;
    }
    friend Binary operator+(Binary num1, Binary num2);
    friend Binary operator-(Binary num1, Binary num2);
    friend Binary operator*(Binary num1, Binary num2);
    friend void dectobin(int dec, int* bin, int mem);
    friend int bintodec(int* bin, int mem);
    int getmem();
    int getdec();
    int* getbin();
    void printbin();
    void printdec();
};
 
void dectobin(int dec, int* bin, int mem) {
    int dec1 = dec;
    for (int i = 0; i < mem; i++) {
 
        bin[i] = dec1 % 2;
        dec1 = (dec1 - bin[i]) / 2;
    }
}
 
int bintodec(int* bin, int mem) {
    int dec = 0;
    for (int i = 0; i < mem; i++) {
        dec = dec + bin[i] * (int)pow(2, i);
    }
    return dec;
}
/*
Binary::Binary() {
    mem = 8;
    dec = 0;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
*/
Binary::Binary(int d) {
    dec = d;
    mem = 8;
    if (d >= 0 && d < pow(2, 8)) mem = 8;
    if (d >= pow(2, 8) && d < pow(2, 16)) mem = 16;
    if (d >= pow(2, 16) && d < pow(2, 32)) mem = 32;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
 
Binary::Binary(int d, int m) {
    dec = d;
    mem = m;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
 
Binary::Binary(int* b, int m) {
    mem = m;
    bin = new int[mem];
    for (int i = 0; i < mem; i++) {
        bin[i] = b[i];
    }
    dec = bintodec(bin, mem);
}
 
Binary::Binary(const Binary& num2) {
    mem = num2.mem;
    dec = num2.dec;
    bin = new int[mem];
    for (int i = 0; i < mem; i++) {
        bin[i] = num2.bin[i];
    }
}
 
int Binary::getmem() {
    return this->mem;
}
 
int* Binary::getbin() {
    return bin;
}
 
int Binary::getdec() {
    return this->dec;
}
 
void Binary::printbin() {
    for (int i = mem - 1; i >= 0; i--) {
        cout << bin[i];
    }
}
 
void Binary::printdec() {
    cout << dec;
}
 
Binary operator+(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
    int mem3;
    if (num1.getmem() > num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3 - 8; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] += bin1[i];
            if (i == mem3 - 1 && bin3[i] > 1) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
        }
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() == num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (i == mem3 - 1 && bin3[i] > 1) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                if (i < mem3 - 1) bin3[i + 1] += 1;
            }
 
        }
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() < num2.getmem()) {
        mem3 = num2.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3 - 8; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] += bin2[i];
            if (i == mem3 - 1 && bin3[i] == 2) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
 
        }
        return Binary(bin3, mem3);
    }
    return Binary(0);
}
 
Binary operator-(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
 
    int mem3 = 8;
    if (num1.getmem() > num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3 - 8; i++) {
            if (bin1[i] < bin2[i]) {
                bin1[i + 1] -= 1;
                bin1[i] += 2;
                bin3[i] = bin1[i] - bin2[i];
            }
            else bin3[i] = bin1[i] - bin2[i];
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] = bin1[i];
        }
 
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() < num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3 - 8; i++) {
            if (bin2[i] < bin1[i]) {
                bin2[i + 1] -= 1;
                bin2[i] += 2;
                bin3[i] = bin2[i] - bin1[i];
            }
            else bin3[i] = bin2[i] - bin1[i];
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] = bin2[i];
        }
 
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() == num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            if (num1.getdec() > num2.getdec()) {
                if (bin1[i] < bin2[i]) {
                    bin1[i + 1] -= 1;
                    bin1[i] += 2;
                    bin3[i] = bin1[i] - bin2[i];
                }
                else bin3[i] = bin1[i] - bin2[i];
            }
            if (num1.getdec() <= num2.getdec()) {
                if (bin2[i] < bin1[i]) {
                    bin2[i + 1] -= 1;
                    bin2[i] += 2;
                    bin3[i] = bin2[i] - bin1[i];
                }
                else bin3[i] = bin2[i] - bin1[i];
            }
        }
 
        return Binary(bin3, mem3);
    }
    return Binary(0);
}
 
Binary operator*(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
    int mem3 = 8;
    int mem1 = num1.getmem();
    int mem2 = num2.getmem();
    int d1 = num1.getdec();
    int d2 = num2.getdec();
    int d = d1 * d2;
    if (d >= 0 && d < pow(2, 8)) mem3 = 8;
    if (d >= pow(2, 8) + 1 && d < pow(2, 16)) mem3 = 16;
    if (d >= pow(2, 16) + 1 && d < pow(2, 32)) mem3 = 32;
    if (d > pow(2, 32)) {
        cout << "Максимального размера выделяемой памяти недостаточно для получения ответа. Операция прервана";
        return Binary(0);
    }
    int* bin3 = new int[mem3];
    for (int i = 0; i < mem3; i++) {
        bin3[i] = 0;
    }
 
    for (int i = 0; i < mem1; i++) {
        for (int j = 0; j < mem2; j++) {
            bin3[i + j] += bin1[i] * bin2[j];
            if (bin3[i + j] > 1) {
                bin3[i + j] -= 2;
                bin3[i + j + 1] += 1;
            }
        }
    }
 
    return Binary(bin3, mem3);
}
 
void main() {
    setlocale(LC_ALL, "Ru");
    int otv(1);
    int d1(0), d2(0), count(0);
    char zn1('+'), zn2('+'), zn3('+'); //переменные для хранения знаков. Знак 2 определяем действие между числами. Знаки 1 и 3 - знаки чисел
    string v;//строка, для считывания выражения
    string D1, D2; //строки, в которые запишем числа
    //while (otv == 1) {
        cout << "Введите выражение" << endl;
        getline(cin, v); //считываем введенное выражение в строку
        int length = v.length(); // определяем длину строки
        /////////////////////////////////////////////
        //1 ЭТАП: ОПРЕДЕЛЕНИЕ ЗНАКОВ В ВЫРАЖЕНИИ//
        count = 0; //зануляем счетчик кол-ва знаков в строке
        for (int i = 0; i < length; i++) {
            if (v[i] == '-' || v[i] == '+' || v[i] == '*') count++; //узнаем кол-во знаков в строке
        }
 
        int* pointer = new int[3];//в этот массив сохраним номера позиций знаков, чтобы разграничить и считать числа
        for (int i = 0; i < 3; i++) {
            pointer[i] = 0;
        }
        if (count == 1) { // если в строке только 1 знак
            zn1 = '+';
            zn3 = '+'; // то 1 и 3 знак - это +
            for (int i = 0; i < length; i++) {
                if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                    zn2 = v[i]; //определяем знак 2
                    pointer[0] = i;
                }
            }
            D1.assign(v, 0, pointer[0]);//сохраняем первое число в строку
            d1 = atoi(D1.c_str());//переводим строку в число
            D2.assign(v, pointer[0] + 1, length - pointer[0]);//по аналогии
            d2 = atoi(D2.c_str());
        }
 
 
        if (count == 2) { //если в строке  2 знака, то
            count = 0;
            if (v[0] == '-') {// если первый знак -, то далее ищем второй знак
                zn1 = '-';
                for (int i = 0; i < length; i++) {
                    if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                        zn2 = v[i];
                        pointer[0] = i;
                    }
                }
                zn3 = '+';
                D1.assign(v, 1, pointer[0] - 1);//сохраняем первое число в строку
                d1 = atoi(D1.c_str());//переводим строку в число
                D2.assign(v, pointer[0] + 1, length - pointer[0]);//по аналогии
                d2 = atoi(D2.c_str());
            }
            else { //иначе 
                count = 0; //зануляем счетчик кол-ва знаков
                for (int i = 0; i < length; i++) {
                    if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                        if (count == 1) {
                            zn3 = v[i];
                            count++;
                            pointer[1] = i;
                        }
                        if (count == 0) {
                            zn2 = v[i];
                            count++;
                            pointer[0] = i;
                        }
                    }
                }
                D1.assign(v, 0, pointer[0]);//сохраняем первое число в строку
                d1 = atoi(D1.c_str());//переводим строку в число
                D2.assign(v, pointer[1] + 1, length - pointer[1]);//по аналогии
                d2 = atoi(D2.c_str());
            }
            count = 2;
        }
 
 
        if (count == 3) {//если в строке 3 знака, то сохраняем знаки поочередно 
            count = 0;
            for (int i = 0; i < length; i++) {
                if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                    if (count == 2) {
                        zn3 = v[i];
                        count++;
                        pointer[2] = i;
                    }
                    if (count == 1) {
                        zn2 = v[i];
                        count++;
                        pointer[1] = i;
                    }
                    if (count == 0) {
                        zn1 = v[i];
                        count++;
                        pointer[0] = i;
                    }
                }
            }
            D1.assign(v, pointer[0] + 1, pointer[1] - pointer[0] - 1);//сохраняем первое число в строку
            d1 = atoi(D1.c_str());//переводим строку в число
            D2.assign(v, pointer[2] + 1, length - pointer[2]);//по аналогии
            d2 = atoi(D2.c_str());
            count = 3;
        }
        /////////////////////
        //2 ЭТАП. ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЯ//
        if (count == 1) {
            Binary bin1(d1), bin2(d2);
            Binary bin3(bin1 + bin2), bin4(bin1 - bin2), bin5(bin1 * bin2), bin6(bin2 - bin1);
            switch (zn2)
            {
            case '+':
                bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; bin3.printbin(); cout << endl;
                bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; bin3.printdec(); cout << endl;
                break;
            case '-':
                if (bin1.getdec() < bin2.getdec()) {
                    bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin6.printbin(); cout << endl;
                    bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin6.printdec(); cout << endl;
                    break;
                }
                else {
                    bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; bin4.printbin(); cout << endl;
                    bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; bin4.printdec(); cout << endl;
                    break;
                }
            case '*':
                bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; bin5.printbin(); cout << endl;
                bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; bin5.printdec(); cout << endl;
                break;
            default: cout << "Введен неверный знак. Попробуйте еще раз" << endl;
                break;
            }
        }
        else {
            Binary bin1(d1), bin2(d2);
            Binary bin3(bin1 + bin2), bin4(bin1 - bin2), bin5(bin1 * bin2), bin6(bin2 - bin1);
            switch (zn2)
            {
            case '+':
                if (zn1 == '+' && zn3 == '+') {
                    bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; bin3.printbin(); cout << endl;
                    bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; bin3.printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '+') {
                    if (bin1.getdec() <= bin2.getdec()) {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; bin6.printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; bin6.printdec(); cout << endl;
                        break;
                    }
                    else {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = -"; bin4.printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = -"; bin4.printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '+' && zn3 == '-') {
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin6.printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin6.printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; bin4.printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; bin4.printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '-' && zn3 == '-') {
                    cout << '-'; bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin3.printbin(); cout << endl;
                    cout << '-'; bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin3.printdec(); cout << endl;
                    break;
                }
            case '-':
                if (zn1 == '+' && zn3 == '+') {
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin6.printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin6.printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; bin4.printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; bin4.printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '-' && zn3 == '+') {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; bin3.printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; bin3.printdec(); cout << endl;
                        break;
                        }
                if (zn1 == '+' && zn3 == '-') {
                    bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; bin3.printbin(); cout << endl;
                    bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; bin3.printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '-') {
                    if (bin1.getdec() <= bin2.getdec()) {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; bin6.printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; bin6.printdec(); cout << endl;
                        break;
                    }
                    else {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = -"; bin4.printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = -"; bin4.printdec(); cout << endl;
                        break;
                    }
                }
            case '*':
                if (zn1 == '+' && zn3 == '+') {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; bin5.printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; bin5.printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '+') {
                    cout << "-"; bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = -"; bin5.printbin(); cout << endl;
                    cout << "-"; bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = -"; bin5.printdec(); cout << endl;
                    break;
                }
                if (zn1 == '+' && zn3 == '-') {
                    bin1.printbin(); cout << " * (-"; bin2.printbin(); cout << ") = -"; bin5.printbin(); cout << endl;
                    bin1.printdec(); cout << " * (-"; bin2.printdec(); cout << ") = -"; bin5.printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '-') {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; bin5.printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; bin5.printdec(); cout << endl;
                    break;
                }
            default: cout << "Введен неверный знак. Попробуйте еще раз" << endl;
                break;
            }
        }
        otv = 1;
    //}
 
}

Миниатюры

Программа завершила работу с кодом -1073740940
 



0



Вездепух

Эксперт CЭксперт С++

10420 / 5692 / 1550

Регистрация: 18.10.2014

Сообщений: 14,022

30.01.2021, 22:35

11

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

С умножением проблем нет.

Если я сказал, что с умножением проблемы есть, значит с умножением проблемы есть. Я их вам указал. Это не обсуждается.

Что там у вас творится в остальных функциях я даже не смотрел, т.е. программа всегда уверенно падает на умножении.

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

В фото требования к программе.

И каким же из этих требований соответствует ввод «260 и 2»?



0



0 / 0 / 0

Регистрация: 06.10.2020

Сообщений: 26

30.01.2021, 22:44

 [ТС]

12

Попробуйте ввести 260+2. Программа падает.

А что не так с циклом умножения?



0



TheCalligrapher

Вездепух

Эксперт CЭксперт С++

10420 / 5692 / 1550

Регистрация: 18.10.2014

Сообщений: 14,022

30.01.2021, 22:58

13

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

Попробуйте ввести 260+2. Программа падает.

Верно. Именно это я и вводил. И ваша программа падает именно на умножении.

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

А что не так с циклом умножения?

Я же написал уже выше.

Ваша программа вычислит d = 520 и решит, что для этого хватит 16 двоичных ячеек. То есть mem3 = 16 и размер массива bin3 равен 16.

А затем ваша программа запустит вышеупомянутые циклы двоичного умножения, в которых mem1 = 16 (это 260) и mem2 = 8 (это 2). В результате сумма i+j в

C++
1
2
3
4
    for (int i = 0; i < mem1; i++) {
        for (int j = 0; j < mem2; j++) {
            bin3[i + j] += bin1[i] * bin2[j];
            ...

запросто будет доходить до 22, то есть превышать 16. То есть будет происходить вылет за пределы массива bin3, разрушение памяти и падение.

Добавлено через 2 минуты

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

Я убрал конструктор по умолчанию, и программа перестала падать.

Это бессмысленные танцы с бубном, которые ничего не меняет. С таким же успехом вы можете «пересоздать проект».



0



2020 / 1592 / 518

Регистрация: 29.06.2020

Сообщений: 5,974

30.01.2021, 23:03

14

целый int для 0 или 1 ?



0



Nikis0715

0 / 0 / 0

Регистрация: 06.10.2020

Сообщений: 26

30.01.2021, 23:11

 [ТС]

15

Моя проблема ушла. Убрал в main создание новых объектов класса при подсчетах

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
if (count == 1) {
            Binary bin1(d1), bin2(d2);
            //Binary bin3(bin1 + bin2), (bin1 - bin2)(bin1 - bin2), (bin2 * bin1)(bin1 * bin2), (bin2 - bin1)(bin2 - bin1);
            switch (zn2)
            {
                case '+':
                    bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin1+bin2).printbin(); cout << endl;
                    bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin1 + bin2).printdec(); cout << endl;
                    break;
                case '-':
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin2 - bin1).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 - bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                case '*': {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                default: cout << "Введен неверный знак. Попробуйте еще раз" << endl;
                    break;
            }
            
        }
        else {
            Binary bin1(d1), bin2(d2);
            //Binary bin3(bin1 + bin2), (bin1 - bin2)(bin1 - bin2), (bin2 * bin1)(bin1 * bin2), (bin2 - bin1)(bin2 - bin1);
            switch (zn2)
            {
            case '+':
                if (zn1 == '+' && zn3 == '+') {
                    bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin1 + bin2).printbin(); cout << endl;
                    bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin1 + bin2).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '+') {
                    if (bin1.getdec() <= bin2.getdec()) {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin2 - bin1).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = -"; (bin1 - bin2).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = -"; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '+' && zn3 == '-') {
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin2 - bin1).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 - bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '-' && zn3 == '-') {
                    cout << '-'; bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin1 + bin2).printbin(); cout << endl;
                    cout << '-'; bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin1 + bin2).printdec(); cout << endl;
                    break;
                }
            case '-':
                if (zn1 == '+' && zn3 == '+') {
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin2 - bin1).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 - bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '-' && zn3 == '+') {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin1 + bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin1 + bin2).printdec(); cout << endl;
                        break;
                        }
                if (zn1 == '+' && zn3 == '-') {
                    bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 + bin2).printbin(); cout << endl;
                    bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 + bin2).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '-') {
                    if (bin1.getdec() <= bin2.getdec()) {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin2 - bin1).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = -"; (bin1 - bin2).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = -"; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
            case '*':
                if (zn1 == '+' && zn3 == '+') {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '+') {
                    cout << "-"; bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = -"; (bin2 * bin1).printbin(); cout << endl;
                    cout << "-"; bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = -"; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '+' && zn3 == '-') {
                    bin1.printbin(); cout << " * (-"; bin2.printbin(); cout << ") = -"; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * (-"; bin2.printdec(); cout << ") = -"; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '-') {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
            default: cout << "Введен неверный знак. Попробуйте еще раз" << endl;
                break;
            }
        }

Вот так исправил умножение

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
Binary operator*(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
    int mem1 = num1.getmem();
    int mem2 = num2.getmem();
    int mem3 = num1.getmem() + num2.getmem();
    if (mem3 > 32) {
        cout << "Максимального размера выделяемой памяти недостаточно для получения ответа. Операция прервана";
        return Binary(0);
    }
    int* bin3 = new int[mem3];
    for (int i = 0; i < mem3; i++) {
        bin3[i] = 0;
    }
 
    for (int i = 0; i < mem1; i++) {
        for (int j = 0; j < mem2; j++) {
            bin3[i + j] += bin1[i] * bin2[j];
            if (bin3[i + j] > 1) {
                bin3[i + j] -= 2;
                bin3[i + j + 1] += 1;
            }
        }
    }
 
    return Binary(bin3, mem3);
}

Но теперь почему-то 127+1 выдает 0. Вот весь получившийся код

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
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
#include <iostream>
#include <string>
 
using namespace std;
 
class Binary {
public:
    int mem;
    int* bin;
    int dec;
 
    //Binary();
    Binary(int dec);
    Binary(int dec, int mem);
    Binary(int* bin, int mem);
    Binary(const Binary& num2);
    ~Binary() {
        delete[]bin;
    }
    friend Binary operator+(Binary num1, Binary num2);
    friend Binary operator-(Binary num1, Binary num2);
    friend Binary operator*(Binary num1, Binary num2);
    friend void dectobin(int dec, int* bin, int mem);
    friend int bintodec(int* bin, int mem);
    int getmem();
    int getdec();
    int* getbin();
    void printbin();
    void printdec();
};
 
void dectobin(int dec, int* bin, int mem) {
    int dec1 = dec;
    for (int i = 0; i < mem; i++) {
 
        bin[i] = dec1 % 2;
        dec1 = (dec1 - bin[i]) / 2;
    }
}
 
int bintodec(int* bin, int mem) {
    int dec = 0;
    for (int i = 0; i < mem; i++) {
        dec = dec + bin[i] * (int)pow(2, i);
    }
    return dec;
}
/*
Binary::Binary() {
    mem = 8;
    dec = 0;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
*/
Binary::Binary(int d) {
    dec = d;
    mem = 8;
    if (d >= 0 && d < pow(2, 8)) mem = 8;
    if (d >= pow(2, 8) && d < pow(2, 16)) mem = 16;
    if (d >= pow(2, 16) && d < pow(2, 32)) mem = 32;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
 
Binary::Binary(int d, int m) {
    dec = d;
    mem = m;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
 
Binary::Binary(int* b, int m) {
    mem = m;
    bin = new int[mem];
    for (int i = 0; i < mem; i++) {
        bin[i] = b[i];
    }
    dec = bintodec(bin, mem);
}
 
Binary::Binary(const Binary& num2) {
    mem = num2.mem;
    dec = num2.dec;
    bin = new int[mem];
    for (int i = 0; i < mem; i++) {
        bin[i] = num2.bin[i];
    }
}
 
int Binary::getmem() {
    return this->mem;
}
 
int* Binary::getbin() {
    return bin;
}
 
int Binary::getdec() {
    return this->dec;
}
 
void Binary::printbin() {
    for (int i = mem - 1; i >= 0; i--) {
        cout << bin[i];
    }
}
 
void Binary::printdec() {
    cout << dec;
}
 
Binary operator+(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
    int mem3;
    if (num1.getmem() > num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3 - 8; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] += bin1[i];
            if (bin3[mem3 - 1] > 1) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                if (i < mem3 - 2) bin3[i + 1] += 1;
            }
        }
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() == num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (bin3[mem3 - 1] > 1) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                if (i < mem3 - 2) bin3[i + 1] += 1;
            }
 
        }
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() < num2.getmem()) {
        mem3 = num2.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3 - 8; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            if (i == mem3 - 1 && bin3[mem3 -1 ] == 2) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                if (i < mem3 - 2) bin3[i + 1] += 1;
            }
 
        }
        return Binary(bin3, mem3);
    }
    return Binary(0);
}
 
Binary operator-(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
 
    int mem3 = 8;
    if (num1.getmem() > num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3 - 8; i++) {
            if (bin1[i] < bin2[i]) {
                bin1[i + 1] -= 1;
                bin1[i] += 2;
                bin3[i] = bin1[i] - bin2[i];
            }
            else bin3[i] = bin1[i] - bin2[i];
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] = bin1[i];
        }
 
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() < num2.getmem()) {
        mem3 = num2.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3 - 8; i++) {
            if (bin1[i] < bin2[i]) {
                bin1[i + 1] -= 1;
                bin1[i] += 2;
                bin3[i] = bin1[i] - bin2[i];
            }
            else bin3[i] = bin1[i] - bin2[i];
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] = bin1[i];
        }
 
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() == num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
                if (bin1[i] < bin2[i]) {
                    bin1[i + 1] -= 1;
                    bin1[i] += 2;
                    bin3[i] = bin1[i] - bin2[i];
                }
                else bin3[i] = bin1[i] - bin2[i];
        }
        return Binary(bin3, mem3);
    }
    return Binary(0);
}
 
Binary operator*(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
    int mem1 = num1.getmem();
    int mem2 = num2.getmem();
    int mem3 = num1.getmem() + num2.getmem();
    if (mem3 > 32) {
        cout << "Максимального размера выделяемой памяти недостаточно для получения ответа. Операция прервана";
        return Binary(0);
    }
    int* bin3 = new int[mem3];
    for (int i = 0; i < mem3; i++) {
        bin3[i] = 0;
    }
 
    for (int i = 0; i < mem1; i++) {
        for (int j = 0; j < mem2; j++) {
            bin3[i + j] += bin1[i] * bin2[j];
            if (bin3[i + j] > 1) {
                bin3[i + j] -= 2;
                bin3[i + j + 1] += 1;
            }
        }
    }
 
    return Binary(bin3, mem3);
}
 
void main() {
    setlocale(LC_ALL, "Ru");
    int otv(1);
    int d1(0), d2(0), count(0);
    char zn1('+'), zn2('+'), zn3('+'); //переменные для хранения знаков. Знак 2 определяем действие между числами. Знаки 1 и 3 - знаки чисел
    string v;//строка, для считывания выражения
    string D1, D2; //строки, в которые запишем числа
    //while (otv == 1) {
        cout << "Введите выражение" << endl;
        getline(cin, v); //считываем введенное выражение в строку
        int length = v.length(); // определяем длину строки
        /////////////////////////////////////////////
        //1 ЭТАП: ОПРЕДЕЛЕНИЕ ЗНАКОВ В ВЫРАЖЕНИИ//
        count = 0; //зануляем счетчик кол-ва знаков в строке
        for (int i = 0; i < length; i++) {
            if (v[i] == '-' || v[i] == '+' || v[i] == '*') count++; //узнаем кол-во знаков в строке
        }
 
        int* pointer = new int[3];//в этот массив сохраним номера позиций знаков, чтобы разграничить и считать числа
        for (int i = 0; i < 3; i++) {
            pointer[i] = 0;
        }
        if (count == 1) { // если в строке только 1 знак
            zn1 = '+';
            zn3 = '+'; // то 1 и 3 знак - это +
            for (int i = 0; i < length; i++) {
                if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                    zn2 = v[i]; //определяем знак 2
                    pointer[0] = i;
                }
            }
            D1.assign(v, 0, pointer[0]);//сохраняем первое число в строку
            d1 = atoi(D1.c_str());//переводим строку в число
            D2.assign(v, pointer[0] + 1, length - pointer[0]);//по аналогии
            d2 = atoi(D2.c_str());
        }
 
 
        if (count == 2) { //если в строке  2 знака, то
            count = 0;
            if (v[0] == '-') {// если первый знак -, то далее ищем второй знак
                zn1 = '-';
                for (int i = 0; i < length; i++) {
                    if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                        zn2 = v[i];
                        pointer[0] = i;
                    }
                }
                zn3 = '+';
                D1.assign(v, 1, pointer[0] - 1);//сохраняем первое число в строку
                d1 = atoi(D1.c_str());//переводим строку в число
                D2.assign(v, pointer[0] + 1, length - pointer[0]);//по аналогии
                d2 = atoi(D2.c_str());
            }
            else { //иначе 
                count = 0; //зануляем счетчик кол-ва знаков
                for (int i = 0; i < length; i++) {
                    if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                        if (count == 1) {
                            zn3 = v[i];
                            count++;
                            pointer[1] = i;
                        }
                        if (count == 0) {
                            zn2 = v[i];
                            count++;
                            pointer[0] = i;
                        }
                    }
                }
                D1.assign(v, 0, pointer[0]);//сохраняем первое число в строку
                d1 = atoi(D1.c_str());//переводим строку в число
                D2.assign(v, pointer[1] + 1, length - pointer[1]);//по аналогии
                d2 = atoi(D2.c_str());
            }
            count = 2;
        }
 
 
        if (count == 3) {//если в строке 3 знака, то сохраняем знаки поочередно 
            count = 0;
            for (int i = 0; i < length; i++) {
                if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                    if (count == 2) {
                        zn3 = v[i];
                        count++;
                        pointer[2] = i;
                    }
                    if (count == 1) {
                        zn2 = v[i];
                        count++;
                        pointer[1] = i;
                    }
                    if (count == 0) {
                        zn1 = v[i];
                        count++;
                        pointer[0] = i;
                    }
                }
            }
            D1.assign(v, pointer[0] + 1, pointer[1] - pointer[0] - 1);//сохраняем первое число в строку
            d1 = atoi(D1.c_str());//переводим строку в число
            D2.assign(v, pointer[2] + 1, length - pointer[2]);//по аналогии
            d2 = atoi(D2.c_str());
            count = 3;
        }
        /////////////////////
        //2 ЭТАП. ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЯ//
        if (count == 1) {
            Binary bin1(d1), bin2(d2);
            //Binary bin3(bin1 + bin2), (bin1 - bin2)(bin1 - bin2), (bin2 * bin1)(bin1 * bin2), (bin2 - bin1)(bin2 - bin1);
            switch (zn2)
            {
                case '+':
                    bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin1+bin2).printbin(); cout << endl;
                    bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin1 + bin2).printdec(); cout << endl;
                    break;
                case '-':
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin2 - bin1).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 - bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                case '*': {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                default: cout << "Введен неверный знак. Попробуйте еще раз" << endl;
                    break;
            }
            
        }
        else {
            Binary bin1(d1), bin2(d2);
            //Binary bin3(bin1 + bin2), (bin1 - bin2)(bin1 - bin2), (bin2 * bin1)(bin1 * bin2), (bin2 - bin1)(bin2 - bin1);
            switch (zn2)
            {
            case '+':
                if (zn1 == '+' && zn3 == '+') {
                    bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin1 + bin2).printbin(); cout << endl;
                    bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin1 + bin2).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '+') {
                    if (bin1.getdec() <= bin2.getdec()) {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin2 - bin1).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = -"; (bin1 - bin2).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = -"; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '+' && zn3 == '-') {
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin2 - bin1).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 - bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '-' && zn3 == '-') {
                    cout << '-'; bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin1 + bin2).printbin(); cout << endl;
                    cout << '-'; bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin1 + bin2).printdec(); cout << endl;
                    break;
                }
            case '-':
                if (zn1 == '+' && zn3 == '+') {
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin2 - bin1).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 - bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '-' && zn3 == '+') {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin1 + bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin1 + bin2).printdec(); cout << endl;
                        break;
                        }
                if (zn1 == '+' && zn3 == '-') {
                    bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 + bin2).printbin(); cout << endl;
                    bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 + bin2).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '-') {
                    if (bin1.getdec() <= bin2.getdec()) {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin2 - bin1).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = -"; (bin1 - bin2).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = -"; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
            case '*':
                if (zn1 == '+' && zn3 == '+') {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '+') {
                    cout << "-"; bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = -"; (bin2 * bin1).printbin(); cout << endl;
                    cout << "-"; bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = -"; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '+' && zn3 == '-') {
                    bin1.printbin(); cout << " * (-"; bin2.printbin(); cout << ") = -"; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * (-"; bin2.printdec(); cout << ") = -"; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '-') {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
            default: cout << "Введен неверный знак. Попробуйте еще раз" << endl;
                break;
            }
        }
        
        //otv = 1;
    //}
 
}



0



TheCalligrapher

Вездепух

Эксперт CЭксперт С++

10420 / 5692 / 1550

Регистрация: 18.10.2014

Сообщений: 14,022

30.01.2021, 23:23

16

По-прежнему:
Распространенные ошибки
Распространенные ошибки

Добавлено через 2 минуты

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

Вот так исправил умножение

После такого шага мне не ясно, зачем вы вообще тогда делаете вот это

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

C++
1
2
3
    if (d >= 0 && d < pow(2, 8)) mem = 8;
    if (d >= pow(2, 8) && d < pow(2, 16)) mem = 16;
    if (d >= pow(2, 16) && d < pow(2, 32)) mem = 32;

Зачем нужны все эти манипуляции, если можно просто везде и всегда выделять ровно 32 и не мучаться?



0



Nikis0715

0 / 0 / 0

Регистрация: 06.10.2020

Сообщений: 26

31.01.2021, 00:21

 [ТС]

17

Такие вот требования у преподавателя

Добавлено через 29 минут
Добавил перегрузку оператора присваивания, поменял возвращаемое значение main. И самое главное, исправил ошибку в операторе сложения, из-за которой 127+1 было = 0. Вот итоговая программа, полностью рабочая

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
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
#include <iostream>
#include <string>
 
using namespace std;
 
class Binary {
public:
    int mem;
    int* bin;
    int dec;
 
    //Binary();
    Binary(int dec);
    Binary(int dec, int mem);
    Binary(int* bin, int mem);
    Binary(const Binary& num2);
    ~Binary() {
        delete[]bin;
    }
    friend Binary operator+(Binary num1, Binary num2);
    friend Binary operator-(Binary num1, Binary num2);
    friend Binary operator*(Binary num1, Binary num2);
    Binary& operator=(const Binary& num1);
    friend void dectobin(int dec, int* bin, int mem);
    friend int bintodec(int* bin, int mem);
    int getmem();
    int getdec();
    int* getbin();
    void printbin();
    void printdec();
};
 
void dectobin(int dec, int* bin, int mem) {
    int dec1 = dec;
    for (int i = 0; i < mem; i++) {
 
        bin[i] = dec1 % 2;
        dec1 = (dec1 - bin[i]) / 2;
    }
}
 
int bintodec(int* bin, int mem) {
    int dec = 0;
    for (int i = 0; i < mem; i++) {
        dec = dec + bin[i] * (int)pow(2, i);
    }
    return dec;
}
/*
Binary::Binary() {
    mem = 8;
    dec = 0;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
*/
Binary& Binary::operator=(const Binary& num2) {
    if (this == &num2) return *this;
    delete[] this->bin;
    dec = num2.dec;
    mem = num2.mem;
    bin = new int[mem];
    for (int i = 0; i < mem; i++) {
        bin[i] = num2.bin[i];
    }
    return *this;
}
Binary::Binary(int d) {
    dec = d;
    mem = 8;
    if (d >= 0 && d < pow(2, 8)) mem = 8;
    if (d >= pow(2, 8) && d < pow(2, 16)) mem = 16;
    if (d >= pow(2, 16) && d < pow(2, 32)) mem = 32;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
 
Binary::Binary(int d, int m) {
    dec = d;
    mem = m;
    bin = new int[mem];
    dectobin(dec, bin, mem);
}
 
Binary::Binary(int* b, int m) {
    mem = m;
    bin = new int[mem];
    for (int i = 0; i < mem; i++) {
        bin[i] = b[i];
    }
    dec = bintodec(bin, mem);
}
 
Binary::Binary(const Binary& num2) {
    mem = num2.mem;
    dec = num2.dec;
    bin = new int[mem];
    for (int i = 0; i < mem; i++) {
        bin[i] = num2.bin[i];
    }
}
 
int Binary::getmem() {
    return this->mem;
}
 
int* Binary::getbin() {
    return bin;
}
 
int Binary::getdec() {
    return this->dec;
}
 
void Binary::printbin() {
    for (int i = mem - 1; i >= 0; i--) {
        cout << bin[i];
    }
}
 
void Binary::printdec() {
    cout << dec;
}
 
Binary operator+(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
    int mem3;
    if (num1.getmem() > num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3 - 8; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] += bin1[i];
            if (bin3[mem3 - 1] > 1) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                if (i < mem3 - 1) bin3[i + 1] += 1;
            }
        }
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() == num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (bin3[mem3 - 1] > 1) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                if (i < mem3 - 1) bin3[i + 1] += 1;
            }
 
        }
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() < num2.getmem()) {
        mem3 = num2.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
            bin3[i] = 0;
        }
        for (int i = 0; i < mem3 - 8; i++) {
            bin3[i] += bin1[i] + bin2[i];
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                bin3[i + 1] += 1;
            }
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            if (i == mem3 - 1 && bin3[mem3 -1 ] == 2) {
                cout << endl << "Ошибка. Недостаточно выделенной памяти в размере " << mem3 << " бит" << endl;
                return Binary(0);
            }
            if (bin3[i] > 1) {
                bin3[i] -= 2;
                if (i < mem3 - 1) bin3[i + 1] += 1;
            }
 
        }
        return Binary(bin3, mem3);
    }
    return Binary(0);
}
 
Binary operator-(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
 
    int mem3 = 8;
    if (num1.getmem() > num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3 - 8; i++) {
            if (bin1[i] < bin2[i]) {
                bin1[i + 1] -= 1;
                bin1[i] += 2;
                bin3[i] = bin1[i] - bin2[i];
            }
            else bin3[i] = bin1[i] - bin2[i];
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] = bin1[i];
        }
 
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() < num2.getmem()) {
        mem3 = num2.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3 - 8; i++) {
            if (bin1[i] < bin2[i]) {
                bin1[i + 1] -= 1;
                bin1[i] += 2;
                bin3[i] = bin1[i] - bin2[i];
            }
            else bin3[i] = bin1[i] - bin2[i];
        }
        for (int i = mem3 - 8; i < mem3; i++) {
            bin3[i] = bin1[i];
        }
 
        return Binary(bin3, mem3);
    }
 
    if (num1.getmem() == num2.getmem()) {
        mem3 = num1.getmem();
        int* bin3 = new int[mem3];
        for (int i = 0; i < mem3; i++) {
                if (bin1[i] < bin2[i]) {
                    bin1[i + 1] -= 1;
                    bin1[i] += 2;
                    bin3[i] = bin1[i] - bin2[i];
                }
                else bin3[i] = bin1[i] - bin2[i];
        }
        return Binary(bin3, mem3);
    }
    return Binary(0);
}
 
Binary operator*(Binary num1, Binary num2) {
    int* bin1 = num1.getbin();
    int* bin2 = num2.getbin();
    int mem1 = num1.getmem();
    int mem2 = num2.getmem();
    int mem3 = num1.getmem() + num2.getmem();
    if (mem3 > 32) {
        cout << "Максимального размера выделяемой памяти недостаточно для получения ответа. Операция прервана";
        return Binary(0);
    }
    int* bin3 = new int[mem3];
    for (int i = 0; i < mem3; i++) {
        bin3[i] = 0;
    }
 
    for (int i = 0; i < mem1; i++) {
        for (int j = 0; j < mem2; j++) {
            bin3[i + j] += bin1[i] * bin2[j];
            if (bin3[i + j] > 1) {
                bin3[i + j] -= 2;
                bin3[i + j + 1] += 1;
            }
        }
    }
 
    return Binary(bin3, mem3);
}
 
int main() {
    setlocale(LC_ALL, "Ru");
    int otv(1);
    int d1(0), d2(0), count(0);
    char zn1('+'), zn2('+'), zn3('+'); //переменные для хранения знаков. Знак 2 определяем действие между числами. Знаки 1 и 3 - знаки чисел
    string v;//строка, для считывания выражения
    string D1, D2; //строки, в которые запишем числа
    //while (otv == 1) {
        cout << "Введите выражение" << endl;
        getline(cin, v); //считываем введенное выражение в строку
        int length = v.length(); // определяем длину строки
        /////////////////////////////////////////////
        //1 ЭТАП: ОПРЕДЕЛЕНИЕ ЗНАКОВ В ВЫРАЖЕНИИ//
        count = 0; //зануляем счетчик кол-ва знаков в строке
        for (int i = 0; i < length; i++) {
            if (v[i] == '-' || v[i] == '+' || v[i] == '*') count++; //узнаем кол-во знаков в строке
        }
 
        int* pointer = new int[3];//в этот массив сохраним номера позиций знаков, чтобы разграничить и считать числа
        for (int i = 0; i < 3; i++) {
            pointer[i] = 0;
        }
        if (count == 1) { // если в строке только 1 знак
            zn1 = '+';
            zn3 = '+'; // то 1 и 3 знак - это +
            for (int i = 0; i < length; i++) {
                if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                    zn2 = v[i]; //определяем знак 2
                    pointer[0] = i;
                }
            }
            D1.assign(v, 0, pointer[0]);//сохраняем первое число в строку
            d1 = atoi(D1.c_str());//переводим строку в число
            D2.assign(v, pointer[0] + 1, length - pointer[0]);//по аналогии
            d2 = atoi(D2.c_str());
        }
 
 
        if (count == 2) { //если в строке  2 знака, то
            count = 0;
            if (v[0] == '-') {// если первый знак -, то далее ищем второй знак
                zn1 = '-';
                for (int i = 0; i < length; i++) {
                    if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                        zn2 = v[i];
                        pointer[0] = i;
                    }
                }
                zn3 = '+';
                D1.assign(v, 1, pointer[0] - 1);//сохраняем первое число в строку
                d1 = atoi(D1.c_str());//переводим строку в число
                D2.assign(v, pointer[0] + 1, length - pointer[0]);//по аналогии
                d2 = atoi(D2.c_str());
            }
            else { //иначе 
                count = 0; //зануляем счетчик кол-ва знаков
                for (int i = 0; i < length; i++) {
                    if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                        if (count == 1) {
                            zn3 = v[i];
                            count++;
                            pointer[1] = i;
                        }
                        if (count == 0) {
                            zn2 = v[i];
                            count++;
                            pointer[0] = i;
                        }
                    }
                }
                D1.assign(v, 0, pointer[0]);//сохраняем первое число в строку
                d1 = atoi(D1.c_str());//переводим строку в число
                D2.assign(v, pointer[1] + 1, length - pointer[1]);//по аналогии
                d2 = atoi(D2.c_str());
            }
            count = 2;
        }
 
 
        if (count == 3) {//если в строке 3 знака, то сохраняем знаки поочередно 
            count = 0;
            for (int i = 0; i < length; i++) {
                if (v[i] == '-' || v[i] == '+' || v[i] == '*') {
                    if (count == 2) {
                        zn3 = v[i];
                        count++;
                        pointer[2] = i;
                    }
                    if (count == 1) {
                        zn2 = v[i];
                        count++;
                        pointer[1] = i;
                    }
                    if (count == 0) {
                        zn1 = v[i];
                        count++;
                        pointer[0] = i;
                    }
                }
            }
            D1.assign(v, pointer[0] + 1, pointer[1] - pointer[0] - 1);//сохраняем первое число в строку
            d1 = atoi(D1.c_str());//переводим строку в число
            D2.assign(v, pointer[2] + 1, length - pointer[2]);//по аналогии
            d2 = atoi(D2.c_str());
            count = 3;
        }
        /////////////////////
        //2 ЭТАП. ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЯ//
        if (count == 1) {
            Binary bin1(d1), bin2(d2);
            //Binary bin3(bin1 + bin2), (bin1 - bin2)(bin1 - bin2), (bin2 * bin1)(bin1 * bin2), (bin2 - bin1)(bin2 - bin1);
            switch (zn2)
            {
                case '+':
                    bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin1+bin2).printbin(); cout << endl;
                    bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin1 + bin2).printdec(); cout << endl;
                    break;
                case '-':
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin2 - bin1).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 - bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                case '*': {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                default: cout << "Введен неверный знак. Попробуйте еще раз" << endl;
                    break;
            }
            
        }
        else {
            Binary bin1(d1), bin2(d2);
            //Binary bin3(bin1 + bin2), (bin1 - bin2)(bin1 - bin2), (bin2 * bin1)(bin1 * bin2), (bin2 - bin1)(bin2 - bin1);
            switch (zn2)
            {
            case '+':
                if (zn1 == '+' && zn3 == '+') {
                    bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin1 + bin2).printbin(); cout << endl;
                    bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin1 + bin2).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '+') {
                    if (bin1.getdec() <= bin2.getdec()) {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin2 - bin1).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = -"; (bin1 - bin2).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = -"; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '+' && zn3 == '-') {
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin2 - bin1).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 - bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '-' && zn3 == '-') {
                    cout << '-'; bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin1 + bin2).printbin(); cout << endl;
                    cout << '-'; bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin1 + bin2).printdec(); cout << endl;
                    break;
                }
            case '-':
                if (zn1 == '+' && zn3 == '+') {
                    if (bin1.getdec() < bin2.getdec()) {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin2 - bin1).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 - bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
                if (zn1 == '-' && zn3 == '+') {
                        bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = -"; (bin1 + bin2).printbin(); cout << endl;
                        bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = -"; (bin1 + bin2).printdec(); cout << endl;
                        break;
                        }
                if (zn1 == '+' && zn3 == '-') {
                    bin1.printbin(); cout << " - "; bin2.printbin(); cout << " = "; (bin1 + bin2).printbin(); cout << endl;
                    bin1.printdec(); cout << " - "; bin2.printdec(); cout << " = "; (bin1 + bin2).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '-') {
                    if (bin1.getdec() <= bin2.getdec()) {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = "; (bin2 - bin1).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = "; (bin2 - bin1).printdec(); cout << endl;
                        break;
                    }
                    else {
                        cout << "-"; bin1.printbin(); cout << " + "; bin2.printbin(); cout << " = -"; (bin1 - bin2).printbin(); cout << endl;
                        cout << "-"; bin1.printdec(); cout << " + "; bin2.printdec(); cout << " = -"; (bin1 - bin2).printdec(); cout << endl;
                        break;
                    }
                }
            case '*':
                if (zn1 == '+' && zn3 == '+') {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '+') {
                    cout << "-"; bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = -"; (bin2 * bin1).printbin(); cout << endl;
                    cout << "-"; bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = -"; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '+' && zn3 == '-') {
                    bin1.printbin(); cout << " * (-"; bin2.printbin(); cout << ") = -"; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * (-"; bin2.printdec(); cout << ") = -"; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
                if (zn1 == '-' && zn3 == '-') {
                    bin1.printbin(); cout << " * "; bin2.printbin(); cout << " = "; (bin2 * bin1).printbin(); cout << endl;
                    bin1.printdec(); cout << " * "; bin2.printdec(); cout << " = "; (bin2 * bin1).printdec(); cout << endl;
                    break;
                }
            default: cout << "Введен неверный знак. Попробуйте еще раз" << endl;
                break;
            }
        }
        
        //otv = 1;
    //}
        return 0;
}



0



TheCalligrapher

Вездепух

Эксперт CЭксперт С++

10420 / 5692 / 1550

Регистрация: 18.10.2014

Сообщений: 14,022

31.01.2021, 00:54

18

Цитата
Сообщение от Nikis0715
Посмотреть сообщение

Такие вот требования у преподавателя

Да, но когда вы сделали

C++
1
int mem3 = num1.getmem() + num2.getmem();

в операторе умножения, вы не нарушили эти требования?



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

31.01.2021, 00:54

Помогаю со студенческими работами здесь

Выход из цикла for: требуется, чтобы программа завершила свою работу как только найдет первую единицу матрицы
дана матрица A размера MxN, состоящая из нулей и единиц,
Требуется, чтобы программа завершила свою…

Программа завершает работу с непонятным кодом
Чесnно говоря я понимаю от части почему программа в конце не выдает 0 , так как я не написал нигде…

Посимвольная конкатенация строк, программа завершает работу с кодом 3
Доброго времени суток. Программа крашится на 22 строке на 2-й итерации вложенного цикла, не…

Как сделать, чтобы пока одна функция не завершила работу, другая бы не могла начаться?
Здравствуйте, написал JS код, который анимирует две картинки, однако если запускать функцию…

Программа вылетает с ошибкой Process returned -1073740940 (0xC0000374)
Всем привет! Есть вот такое задание : &quot;Одномерный массив А, состоящий из N элементов, заполняется…

Процесс завершил работу с кодом 0
Здравствуйте,сейчас пишу текстовую игру для конкурса начинающих программистов.
Пишу в консоли и…

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

Или воспользуйтесь поиском по форуму:

18

Используйте CUDA сегодня, чтобы добиться негативных эффектов изображения

оглавление

описание проблемы

анализ проблемы

1. Результат расчета необъективен.

2. exited with code -1073740940 (0xc0000374)

решение

Резюме


описание проблемы

1. Результат расчета необъективен.

2. exited with code -1073740940 (0xc0000374)


анализ проблемы

1. Результат расчета необъективен.

cudaError_t supplementPix(uchar *c, const uchar *a, unsigned int size);

__global__ void supplementKernel(int *c, const int *a)
{
	int i = threadIdx.x;
         c [i] = 255-a [i]; // Постоянное вычисление вызовет ошибки вычислений, например 255-1 = 253
}

результат операции

Позже создайте объект cv :: Mat со всеми 255 и CV_8UC3 и извлеките массив данных как вычитаемое число.

cv::Mat mask = cv::Mat(rows, cols, CV_8UC3, cv::Scalar::all(255));
	// Постоянный расчет вызовет ошибки расчета, например 255-1 = 253
	 // Необходимо использовать массив для передачи параметров
const uchar* maskData = mask.data;

Результат операции правильный:

Но есть новые проблемы


2. exited with code -1073740940 (0xc0000374)

Найдите соответствующую информацию

《Exit code -1073740940》(https://www.baidu.com/link?url=ud0ZNzh-8ZJmrpFojN8F2uxyOQXEBoeSAJvhiVsvsVuvfXca6U5Kup3UsaBMU-vo5gH_gBCAsqPdI6BpPXtp1F7fBaksS_RFgEFb1IMWs7fKHORjUTdTzm8FmA_uhYQK2q7zXj2R1MSszMqTc7wnAJABHZw-HItOL8AzVBUG39yO2NnvitqXRJWrrv3JohHh&wd=&eqid=95880f450000d468000000055e85a6e6)

«VS сообщил об ошибке, что wntdll.pdb не был загружен, ntdll.dll0xC0000374: куча повреждена» (https://blog.csdn.net/luoye2333/article/details/89087530)

Начать отладку

После отладки было обнаружено, что ошибка памяти возникла после вызова метода CUDA, который вызывал ошибку, когда объект был уничтожен в конце программы.

Проверить функцию вызова CUDA

cudaError_t supplementPix(uchar *c, const uchar *a, const uchar *b, unsigned int size){
    cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
    cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
    cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
    cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
    cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
    cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
}

Обнаружено, что при изменении кода шаблона int было изменено на uchar, а sizeof (int) было изменено.


решение

После модификации результат операции (успех)



Резюме

Когда возвращаемое значение программы выходит с кодом -1073740940 и ошибка отладки указывает 0xc0000374, что куча ntdll.dll повреждена, это означает, что это утечка памяти.

Особенно это приводит к ошибкам, когда объект уничтожается (т.е. release ()) в конце программы.



Offline

Касболат

 


#1
Оставлено
:

16 марта 2022 г. 9:31:01(UTC)

Касболат

Статус: Участник

Группы: Участники

Зарегистрирован: 02.03.2022(UTC)
Сообщений: 22

Сказал(а) «Спасибо»: 5 раз

Время от времени, на одних и тех же файлах, проверка выдаёт вот такой результат в консоли:

Цитата:

CryptCP 5.0 (c) «КРИПТО-ПРО», 2002-2021.
Утилита командной строки для подписи и шифрования файлов.
Папка ‘.’:
ZHM070596S07004_220207.xlsx… Проверка подписи…
Автор подписи: подпись_1
Подпись проверена.
Автор подписи: подпись_2
Подпись проверена.
Автор подписи: подпись_3
Подпись проверена.
Автор подписи: подпись_4

Но наше ПО фиксирует код выхода -1073740940.

В обычной ситуации при выводе в консоль ещё добавляется:

Цитата:

[ErrorCode: 0x00000000]

Либо какой-то конкретный код из приложения.
И ПО фиксирует именно его.
Но вот в ситуациях выше такого нет и не ясно как быть.

Мы можем зашить, конечно же, реакцию на отрицательные коды, но где гарантия, что не будет другой ситуации?
Например, что отрицательный код реально показывает проблему с подписью, а мы её проигнорируем.


Вверх


Offline

Андрей *

 


#2
Оставлено
:

16 марта 2022 г. 11:13:01(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 11,740
Мужчина
Российская Федерация

Сказал «Спасибо»: 451 раз
Поблагодарили: 1838 раз в 1421 постах

Здравствуйте.

Возникает сбой…

Цитата:

The -1073740940 value corresponds to the status code C0000374.
This code is STATUS_HEAP_CORRUPTION (A heap has been corrupted)

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

Касболат

 


#3
Оставлено
:

16 марта 2022 г. 11:38:15(UTC)

Касболат

Статус: Участник

Группы: Участники

Зарегистрирован: 02.03.2022(UTC)
Сообщений: 22

Сказал(а) «Спасибо»: 5 раз

Автор: Андрей * Перейти к цитате

Здравствуйте.

Возникает сбой…

Цитата:

The -1073740940 value corresponds to the status code C0000374.
This code is STATUS_HEAP_CORRUPTION (A heap has been corrupted)

Как страшно жить.
И как быть?
Игнорировать системные ошибки и просто перезапускать?


Вверх


Offline

Максим Коллегин

 


#4
Оставлено
:

16 марта 2022 г. 15:09:53(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,253
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 658 раз в 582 постах

Попробуйте собрать dump:

Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsWindows Error ReportingLocalDumps]
"DumpType"=dword:00000002

Dump будет в папке %localappdata%CrashDumps

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Касболат

 


#5
Оставлено
:

16 марта 2022 г. 15:38:15(UTC)

Касболат

Статус: Участник

Группы: Участники

Зарегистрирован: 02.03.2022(UTC)
Сообщений: 22

Сказал(а) «Спасибо»: 5 раз

Автор: Максим Коллегин Перейти к цитате

Попробуйте собрать dump:

Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsWindows Error ReportingLocalDumps]
"DumpType"=dword:00000002

Dump будет в папке %localappdata%CrashDumps

Получился архив на 20 Мб.
Кому его можно показать? Куда послать?


Вверх


Offline

Максим Коллегин

 


#6
Оставлено
:

16 марта 2022 г. 15:49:51(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,253
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 658 раз в 582 постах

В ЛС отписал.

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Максим Коллегин

 


#7
Оставлено
:

16 марта 2022 г. 16:03:07(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,253
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 658 раз в 582 постах

Наших модулей в стеке падения нет. Пока не знаю в чём проблема. А сможете приложить сертификат, на котором проблема проявляется?
Но скорее всего это продолжение этой истории: https://www.cryptopro.ru…aspx?g=posts&t=14515

Код:

00000021`ba51dfe0 00007ffc`3557708f     : 000001d5`04e93cc0 00000000`00000001 00000000`00000000 00000000`ffffffff : ntdll!RtlFreeHeap+0x51
00000021`ba51e020 00007ffc`35378c80     : 000001d5`04e93cc0 00000000`00000000 00000000`00000001 000001d5`00000000 : KERNELBASE!LocalFree+0x2f
00000021`ba51e060 00007ffc`2b5b4372     : 00000000`00000000 000001d5`00000001 000001d5`00000004 00000000`00000000 : crypt32!CryptVerifyCertificateSignatureEx+0x2a0
00000021`ba51e160 00007ffc`2b5a96f4     : 000001d5`00010001 00000000`00000045 000001d5`0254d0b0 00000021`0000021e : cryptnet!I_GetOcspSignerCert+0x7d12
00000021`ba51e340 00007ffc`2b5acce0     : 000001d5`025de900 00000000`000000f0 00000000`00000000 00000000`00000000 : cryptnet!OcspVerifyResponse+0x194
00000021`ba51e410 00007ffc`2b5a5d26     : 000001d5`00000000 00000000`00000000 00000000`00000022 00007ffc`378d5ba1 : cryptnet!I_ValidateOcspResponse+0x130
00000021`ba51e550 00007ffc`2b5a80bc     : 00000000`00000000 00000000`80000002 00000000`00000001 00000000`00000054 : cryptnet!I_RetrieveObjectByOcspUrlValidForSubject+0x276
00000021`ba51ea60 00007ffc`2b5a78e6     : 00000021`00000000 00000000`00000001 000001d5`00000000 000001d5`022c6920 : cryptnet!RetrieveTimeValidObjectByUrl+0x34c
00000021`ba51eb90 00007ffc`2b5a6d93     : 00000000`80070057 00000000`00000000 000001d5`003de140 000001d5`003de140 : cryptnet!CTVOAgent::GetTimeValidObjectByUrl+0x276
00000021`ba51ed50 00007ffc`2b5a66df     : 00000000`80000000 00000000`00000000 000001d5`003da870 00007ffc`35378659 : cryptnet!CTVOAgent::GetTimeValidObject+0x6a3
00000021`ba51f000 00007ffc`2b5aa40d     : 00000021`ba51f610 00000000`00000000 00000000`00000001 00000021`ba51f170 : cryptnet!CrlFromCertGetTimeValidObject+0x4f
00000021`ba51f070 00007ffc`2b5a9e25     : 00000000`00000003 000001d5`025d7710 000001d5`025d7710 000001d5`025d8690 : cryptnet!GetTimeValidCrl+0x1ad
00000021`ba51f1d0 00007ffc`35377d0f     : 00000000`00000000 00000021`ba51f658 00000021`00000001 00000000`00000020 : cryptnet!MicrosoftCertDllVerifyRevocation+0x1f5
00000021`ba51f350 00007ffc`3537782a     : 00000021`ba51f658 00000000`00000000 000001d5`003dad40 000001d5`025d76c0 : crypt32!VerifyDefaultRevocation+0x23b
00000021`ba51f450 00007ffc`35392b1e     : 00000000`00000001 00000000`00000000 000001d5`003dad40 00000021`ba51f590 : crypt32!CertVerifyRevocation+0x13a
00000021`ba51f550 00007ffc`3539243e     : 00000000`00000000 000001d5`003dad40 00000021`ba51f748 000001d5`003e4c60 : crypt32!CChainPathObject::CalculateRevocationStatus+0x4ca
00000021`ba51f6d0 00007ffc`35391db0     : 00000000`00000001 00000000`00000001 00000000`00000001 000001d5`025bb620 : crypt32!CChainPathObject::CalculateAdditionalStatus+0x146
00000021`ba51f790 00007ffc`35373185     : 00000000`00000000 00000021`00000001 000001d5`025d7710 00000000`00000000 : crypt32!CCertChainEngine::CreateChainContextFromPathGraph+0x408
00000021`ba51f910 00007ffc`35372308     : 000001d5`00401bb0 000001d5`025d7710 00000000`00000000 00000000`00000000 : crypt32!CCertChainEngine::GetChainContext+0x91
00000021`ba51f9a0 00007ff6`5cdf5fe4     : 000001d5`00401bb0 00000021`ba51fb30 00000000`00000000 00007ff6`00000000 : crypt32!CertGetCertificateChain+0xf8

Отредактировано пользователем 16 марта 2022 г. 16:08:39(UTC)
 | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Максим Коллегин

 


#8
Оставлено
:

16 марта 2022 г. 16:22:20(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,253
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 658 раз в 582 постах

Но у меня проблема воспроизводится только, если не установлена компонента «Расширенная совместимость с продуктами MSFT». Патч, исправляющий поведение MS, попал именно туда. У вас она установлена?

Отредактировано пользователем 16 марта 2022 г. 16:23:04(UTC)
 | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW


Offline

Касболат

 


#9
Оставлено
:

16 марта 2022 г. 16:28:35(UTC)

Касболат

Статус: Участник

Группы: Участники

Зарегистрирован: 02.03.2022(UTC)
Сообщений: 22

Сказал(а) «Спасибо»: 5 раз

Автор: Максим Коллегин Перейти к цитате

Но у меня проблема воспроизводится только, если не установлена компонента «Расширенная совместимость с продуктами MSFT». Патч, исправляющий поведение MS, попал именно туда. У вас она установлена?

Snimok ehkrana 2022-03-16 162722.png (31kb) загружен 5 раз(а).
Прикладываю скрин установки.


Вверх


Offline

Максим Коллегин

 


#10
Оставлено
:

16 марта 2022 г. 16:32:41(UTC)

Максим Коллегин

Статус: Сотрудник

Группы: Администраторы

Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,253
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 21 раз
Поблагодарили: 658 раз в 582 постах

Однако в вашем дампе модуля cpcrypt.dll нет. Это реальная машина, не horizon? Антивирусы или DLP установлены?

Знания в базе знаний, поддержка в техподдержке


Вверх

WWW

Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка файловой системы 1073740791 windows 10 как исправить
  • Ошибка файловой системы 10737