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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Shtolz
5 / 5 / 0
Регистрация: 10.10.2008
Сообщений: 138
#1

показывает вот сюда if (*pb++ != bCheck) - C++

20.09.2011, 15:17. Просмотров 1485. Ответов 28
Метки нет (Все метки)

Здравствуйте =)
Проблема следующая

после работы вот этого кода

main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void _tmain(int argc, _TCHAR* argv[])
{
    MyMatrix A(2);
    A.Init();
 
    MyMatrix B(2);
    B.Init();
 
    MyMatrix C(2);
    C.Init();
 
    (A.Transp()*B-B*C).Print();
}
MyMatrix.cpp
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
#include "StdAfx.h"
#include "MyMatrix.h"
using namespace std;
 
MyMatrix::MyMatrix() 
    {
        arr = 0;
        size = 0;
    }
    
    MyMatrix::MyMatrix(int _size) 
    {
        arr = 0;
        size = _size;
        
        arr=(int**)malloc(size*sizeof(int*));
        for(int i=0; i<size; i++)
            arr[i]=(int*)malloc(size*sizeof(int));
    }
    
    void MyMatrix::Init()
    {
        for(int i=0;i<size;i++)
        {
            for(int j=0;j<size;j++)
            {
                cin>>arr[i][j];
            };
        };
    }
 
    void MyMatrix::Print()
    {
        int i,j;
        for(i=0;i<this->size;i++)
        {   
            cout<<"  \n";
            for(j=0;j<size;j++)
            {
                cout << arr[i][j]<<" ";
            };
        }
        cout <<" \n" ;
    }
    
    
    MyMatrix::~MyMatrix() 
    {
        if (arr)
        {
            for(int i=0; i<size; i++)
            {
                if (arr[i])
                    free(arr[i]);
            }
        free(arr);
        }
    }
 
    MyMatrix& MyMatrix::Transp()
    {
        MyMatrix *mTemp = new MyMatrix(size);
        
        for (int i=0;i<size;i++)
        {
            for(int j=0; j<size; j++)
            {
                mTemp->arr[i][j] = arr[j][i];
            }
        }
 
        return *mTemp;
    }
 
    MyMatrix& MyMatrix::operator *(MyMatrix M2)
    {
        MyMatrix *mTemp = new MyMatrix(size);
        for(int i=0;i<size;i++)
        {
            for(int j=0;j<size;j++)
            {
                mTemp->arr[i][j] = 0;
                for(int k=0;k<size;k++)
                {
                    mTemp->arr[i][j] += arr[i][k] * M2.arr[k][j];
                }
            }
        }
 
        return *mTemp;
    }
 
    MyMatrix& MyMatrix::operator -(MyMatrix M2)
    {
        MyMatrix *mTemp = new MyMatrix(size);
        
        for (int i=0;i<size;i++)
        {
            for(int j=0; j<size; j++)
            {
                mTemp->arr[i][j] = arr[i][j] - M2.arr[i][j];
            }
        }
 
        return *mTemp;
    }

выскакивает ошибка указывающая вот сюда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
extern "C" static int __cdecl CheckBytes(
        unsigned char * pb,
        unsigned char bCheck,
        size_t nSize
        )
{
        while (nSize--)
        {
      ->> if (*pb++ != bCheck)
            {
                return FALSE;
            }
        }
        return TRUE;
}
при чем уже после вывода готовой матрицы
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2011, 15:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос показывает вот сюда if (*pb++ != bCheck) (C++):

Вот такое вот кажется лёгкое задание но не как не могу решить. - C++
задание 223(В,И)Картинки загружайте на форум, во избежание их удаления или потери на сторонних ресурсах.

вот такой вот пример - C++
даны числа a1,a2,...,a10.Определить их сумму оператор цикла и условного оператора! как это ?

Как быть вот с этим (каким местом втыкать сюда клаву и мышь)? - Материнские платы
Интересно каким местом втыкать сюда клаву и мышь, это типа новые половинчатые разъёмы:

Установил Linux Mint 17.1 x32 и выходит вот такая вот штука - Linux
Уважаемые люди помогите кто сталкивался с такой проблемой Google не помогает опишу по подробней у меня два Винчестера Первый на 1 терабайт...

Нужно нарисовать вот такой вот дом на языке программирования QBasic - QBasic
Прошу очень Вашей помощи. Нужно нарисовать вот такой вот дом на языке программирования QBasic. В универе задали нарисовать дом в...

asp - xml - vb dll - html вот такая вот компания и что с ней делать - C# ASP.NET
как из асп создать хмл-файл, передающий информацию в vb-dll, там она анализируется и результат снова в виде html (asp)? я - чайник в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 15:02 #16
CAHTEXHUK, я тебя прошу уволь меня от разборок с тобой, (ну вот вы все лезите думаете дааа я умею кодировать, а вот ты тупой), так вот я решил проблемму топика в Release всё отрабатывает, потому что связывание идёт по другому,
2- е на старых версиях free студии (в 6-ке в которой пишу) действительно глючит, так же как и
C++
1
2
double val;
scanf("%lf",&val);
CAHTEXHUK, бросай офтоп и иди реально кому то помоги...
CAHTEXHUK
Заблокирован
22.09.2011, 15:14 #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
так вот я решил проблемму топика в Release всё отрабатывает, потому что связывание идёт по другому,
пфффф, это ты называешь решил проблему?! значит это нормально писать программы, работа которых зависит от настроения комилятора, операционной системы и ещё бог знает чего?

код который работает рандомно В РАЗЫ хуже кода, который вобще не работает, тебе об этом раскажет любой практикующий программист
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 15:22 #18
Цитата Сообщение от CAHTEXHUK Посмотреть сообщение
код который работает рандомно В РАЗЫ хуже кода, который вобще не работает, тебе об этом раскажет любой практикующий программист
- вобще свой класс CMatrix по другому построил и что мне нужно было выкладывать его?Понятное дело постоянное выделение памяти под двумерный массив очень скоро загробит оперативку и заставит приложение опрокинуться. Проблемму решил так как понятно Shtolz, на его уровне

Не по теме:

PS:Будешь офтопить - уйдёшь в минус. Дай мне заниматься делом, а не разборками!

CAHTEXHUK
Заблокирован
22.09.2011, 15:52 #19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Проблемму решил так как понятно Shtolz
ты чё издеваешься? проблема напоминаю стоит что ТС дважды пытается повторно освободить память и один раз обращается к памяти, которая была освобожденна! значит как ты решил проблему - переключил с Debug на Release? Бога ради можешь писать как угодно свои программы, но давать подобные советы на форуме начинающим не надо ок? Проблему ты не только не решил, но ещё и усугубил и я уже объяснял почему - не работающий код лучше работающего через раз
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 16:10 #20
CAHTEXHUK, говорю последний раз - в Release другой механизм линковки, если не понимаешь этого ну наверное , вот тебе Release - экзе и Скрин(как видишь алгоритм не отпал при 2-м вводе)
Миниатюры
показывает вот сюда if (*pb++ != bCheck)  
Вложения
Тип файла: rar BadMatrix.exe.rar (45.3 Кб, 5 просмотров)
LosAngeles
Заблокирован
22.09.2011, 16:27 #21
товарищ, какие режимы линковки? это UB! никто не гарантирует, что в следующий раз программа не выпадет в синий экран и отформатирует тебе жёсткий диск. Программа падает совсем не из-за того что глючит free, виндус или скайнет, free работает правильно, ошибку выдаёт по делу. Кончай уже втирать эту байку про чудодейственный Release и отстойный Debug, а иди исправляй свои программы, потому что судя по этому сообщению там есть, что исправлять:
Я уже с таким встречался free иногда "гонит беса на пустом месте"
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 16:46 #22
Цитата Сообщение от LosAngeles Посмотреть сообщение
что в следующий раз программа не выпадет в синий экран и отформатирует тебе жёсткий диск.
- это тебе
Цитата Сообщение от LosAngeles Посмотреть сообщение
иди исправляй свои программы, потому что судя по этому сообщению там есть, что исправлять
- раз такое пишешь и не понимаешь различий Debug и Release иди сам учи язык, а на счёт этого ты 100% уверен что free всегда отрабатывает - мой ответ конечно же нет!

Добавлено через 2 минуты
LosAngeles, мой экзешник вылетел, выпал в синий экран я жду примеров, а то бросаешся тяжеовесными выссказываниями, ну давай уж приведи пример некорректной работы, я жду...
LosAngeles
Заблокирован
22.09.2011, 16:59 #23
человек который дважды удаляет память по одному указателю и обращается к освобождённой памяти решает эту проблему изменив опции компиляции и советует мне при этом идти учить язык... У меня остался только один вопрос - ты мастер-классы проводишь?
LosAngeles
Заблокирован
22.09.2011, 17:03 #24
АХАХАХА!!! решил проверить, хотя впринципе и так ясно что код полное говно. Просто проверить заработает или нет. Первый запуск, прилагаю скриншоты
Миниатюры
показывает вот сюда if (*pb++ != bCheck)   показывает вот сюда if (*pb++ != bCheck)  
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 17:18 #25
Цитата Сообщение от LosAngeles Посмотреть сообщение
АХАХАХА!!! решил проверить, хотя впринципе и так ясно что код полное говно.
LosAngeles,
LosAngeles, ты вобще смотре кто ТС и о чьём коде говорим, мне твой компилятор в Debug не нужен что ты скрины кидаешь, о которых уже 15 постов назад сказал показывает вот сюда if (*pb++ != bCheck)

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

Не по теме:

LosAngeles, или разберись в топике или млин не рви мне мозг



Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а в том что free в Debug глючит
по поводу сего вот єто имел ввиду а в том что free в ряде случаев(особенно на старых компиляторах) в Debug глючит...

LosAngeles, это тебе, я специально ввёл try catch в деструкторе, компилируй, вводи маттрицы запускай, ну что вылетело исключение, ммм?!!Да провожу прям сейчас
Цитата Сообщение от LosAngeles Посмотреть сообщение
ты мастер-классы проводишь?
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
#include "MyMatrix.h"
#include <windows.h>
 
LPSTR StrWinError(HRESULT hRes)
{
    LPSTR errString = NULL;  // will be allocated and filled by FormatMessage
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM, // use windows internal message table
        0,       // 0 since source is internal message table
        hRes,    // this is the error code 
                          // Could just as well have been an error code from generic
                          // Windows errors from GetLastError()
        0,       // auto-determine language to use
        (LPSTR)&errString,
        0,       // min size for buffer
        0 ); 
    return errString;
}
 
MyMatrix::MyMatrix() 
{
    arr = 0;
    size = 0;
}
        
MyMatrix::MyMatrix(int _size) 
{
    arr = 0;
    size = _size;
                
    arr=(int**)malloc(size*sizeof(int*));
    for(int i=0; i<size; i++)
        arr[i]=(int*)malloc(size*sizeof(int));
}
        
void MyMatrix::Init()
{
    for(int i=0,j;i<size;i++)
    for(j=0;j<size;j++)
    {
        cout<<"arr["<<i + 1<<"]["<<j + 1<<"] = ";
        cin>>arr[i][j]; 
    }
}
 
void MyMatrix::Print()
{
    for(int i=0,j;i<this->size;i++)
    { 
        for(j=0;j<size;j++)
            cout << arr[i][j]<<" ";
        cout <<" \n" ;
    }
}
        
MyMatrix::~MyMatrix() 
{
    try
    {
    if ((void *)arr != NULL)
    {
        for(int i=0; i<size; i++)
            if ((void *)arr[i] != NULL)
                free((void *)arr[i]);
        free((void *)arr);
    }
    }
    catch(...)
    {
        MessageBox(NULL,StrWinError(GetLastError()),"TRYCATCH",MB_OK);
    }
}
 
MyMatrix& MyMatrix::Transp()
{
    MyMatrix *mTemp = new MyMatrix(size);        
    for(int i=0,j;i<size;i++)
    for(j=0; j<size; j++)
        mTemp->arr[i][j] = arr[j][i];    
    return *mTemp;
}
 
MyMatrix& MyMatrix::operator *(MyMatrix M2)
{
    MyMatrix *mTemp = new MyMatrix(size);
    for(int i=0,j,k;i<size;i++)
    {
        for(j=0;j<size;j++)
        {
            mTemp->arr[i][j] = 0;
            for(k=0;k<size;k++)
                mTemp->arr[i][j] += arr[i][k] * M2.arr[k][j];
        }
    }
    return *mTemp;
}
 
MyMatrix& MyMatrix::operator -(MyMatrix M2)
{
    MyMatrix *mTemp = new MyMatrix(size);
    for (int i=0,j;i<size;i++)
    for(j=0; j<size; j++)
        mTemp->arr[i][j] = arr[i][j] - M2.arr[i][j];
    return *mTemp;
}
MyMatrix.h
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
#ifndef MATRIX
#define MATRIX
 
#include <iostream>
#include <cstdlib> //malloc
using namespace std;
 
class MyMatrix
{
private:
    int ** arr;
    int size;
public:
    MyMatrix();
    MyMatrix(int _size);
    ~MyMatrix();
    void Init();
    void Print();
    MyMatrix& Transp();
    MyMatrix& operator *(MyMatrix M2);
    MyMatrix& operator -(MyMatrix M2);
};
 
#endif
main.cpp
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
#include "MyMatrix.h"
#include <conio.h>
 
void main()
{
    do
    {
        MyMatrix A(2);
        std::cout<<"Init A\r\n";
        A.Init();
 
        MyMatrix B(2);
        std::cout<<"Init B\r\n";
        B.Init();
 
        MyMatrix C(2);
        std::cout<<"Init C\r\n";
        C.Init();
 
 
        (A.Transp()*B-B*C).Print();
        cout<<"Press Y - to new input\r\n";
    }
    while(toupper(getch()) == 'Y');
}
LosAngeles
Заблокирован
22.09.2011, 17:19 #26
-=ЮрА=-, с каких пор free выбрасывает С++ные исключения?! к слову сказать delete объявлен с пустой спецификацией исключений и тоже не выбрасывает исключений

Что именно тебе непонятно:
1) Ты не видишь, что память освобождается дважды? а также идёт обращение к освобождённой памяти?
2) Видишь, но считаешь что это вполне нормально и решается с помощью переключения опций компиляции?
если первое я могу попытаться объяснить почему это так, хотя тут всё доходчиво написано показывает вот сюда if (*pb++ != bCheck)
а если второе то это no comments вобще

Добавлено через 43 секунды
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ты вобще смотре кто ТС и о чьём коде говорим, мне твой компилятор в Debug не нужен
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
LosAngeles, Release поставь
ты вобще скрин смотришь? там Release версия!
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 17:35 #27
Цитата Сообщение от LosAngeles Посмотреть сообщение
2) Видишь, но считаешь что это вполне нормально и решается с помощью переключения опций компиляции?
- я думаю в случае Release, здесь if ((void *)arr != NULL) скорее всего arr == NULL(т.к. память некорректно выделяется) и free в деструкторе вообще не вызывается!
Сначала однин, теперь другой, не рвите мне мозг!ТС удовлетворился, потому что не в 10-ке пишет и там трюки с Releas-ом проходят. Уже писал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- вобще свой класс CMatrix по другому построил и что мне нужно было выкладывать его?Понятное дело постоянное выделение памяти под двумерный массив очень скоро загробит оперативку и заставит приложение опрокинуться. Проблемму решил так как понятно Shtolz, на его уровне
LosAngeles
Заблокирован
22.09.2011, 17:56 #28
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
и free в деструкторе вообще не вызывается!
то есть ты не понял, что free вызывается дважды для одного и того же адреса. Окей, а то я уже подумал, что ты пытаешься протолкнуть идею, что это нормально освобождать память по одному адресу дважды. В посте сантехника же написано почему это происходит пошагово, что именно в нём непонятно? Проблема возникает в том что в операторах * и - создаётся копия матрицы, которая содержит тот же arr, что и оригинал. Копия уничтожается, делая оригинал недействительным, адрес указателя не обнуляется, а остаётся тем же. Затем при выходе из _tmain вызывается деструктор для оригинала, который содержит невалидный указатель. Что будет если попытаться освободить память по указателю, который указывает на мусор? ЭТО И БУДЕТ!!! Проблема сразу исчезает, если написать конструктор копирования

Добавлено через 4 минуты
и кстати если в эти самые операторы передавать матрицы по ссылке, а не по значению, то глюк тоже пройдёт. Но этот способ ничем не лучше переключения на Release версию, это я так к слову сказал, чтобы ещё раз обратить внимание на то, что глюк именно в отстутсвии КК, если кто-то ещё не понял
Shtolz
5 / 5 / 0
Регистрация: 10.10.2008
Сообщений: 138
23.09.2011, 16:35  [ТС] #29
Всем спасибо!! и отдельно CAHTEXHUK, за объяснение ошибки
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2011, 16:35
Привет! Вот еще темы с ответами:

Microsoft edge открывает сам по себе браузер вот с таким вот сайтом thisgo.su/cgo - Удаление вирусов
Здравствуйтеб помогите пожалуйста с проблемойб microsoft edge открывает сам по себе браузер вот с таким вот сайтом thisgo.su/cgo ...

Как создать вот такой вот слайдер - HTML, CSS
Очень часто вижу, на сайте требуется создать вот такой вот 3d слайдер что ли, так вот как его делать понятия не приложу, опять плагин...

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

Что сделать с вот такой вот кодировкой - C++ Builder
Тема выделена из темы: http://www.cyberforum.ru/cpp-builder/thread622714.html По поводу вызовов функций, и в других непонятных...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.09.2011, 16:35
Ответ Создать тему
Опции темы

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