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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Shtolz
 Аватар для Shtolz
5 / 5 / 0
Регистрация: 10.10.2008
Сообщений: 138
20.09.2011, 15:17     показывает вот сюда if (*pb++ != bCheck) #1
Здравствуйте =)
Проблема следующая

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

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++
C++ Кому легко, сюда
Ikis Всем знающим,сюда.Пожалуйста.Готов заплатить. C++
C++ Бинарные деревья ! кому интересно , сюда!;)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shtolz
 Аватар для Shtolz
5 / 5 / 0
Регистрация: 10.10.2008
Сообщений: 138
22.09.2011, 00:24  [ТС]     показывает вот сюда if (*pb++ != bCheck) #2
Че никто не знает что-ли?
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
22.09.2011, 00:37     показывает вот сюда if (*pb++ != bCheck) #3
А где вызывается функция CheckBytes ?
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
22.09.2011, 04:49     показывает вот сюда if (*pb++ != bCheck) #4
1. Пересоздайте проект как Empty.
2. Транслируйте в режиме Release
Запустите без среды...
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 12:12     показывает вот сюда if (*pb++ != bCheck) #5
Shtolz, в твоём алгоритме банальный выход за пределы памяти отведенной под массивы. Как я понял дебагом пошёл за ошибкой и уже попал в какой-нибудь студийный срр, увидел что эта функция показывает ошибку и отписал сюдаПо свободе посмотрю где выход за пределы области памяти...

Добавлено через 7 минут
Цитата Сообщение от Shtolz Посмотреть сообщение
MyMatrix *mTemp = new MyMatrix(size);
- ага так тебе и вернёться инициализация при выделении памяти внутри блока, жди - не будет такого!

Добавлено через 2 минуты
Цитата Сообщение от Shtolz Посмотреть сообщение
return *mTemp;
Ну да, уже б тогда &m_Temp[0] сделал, хотя врядли и это поможет
Shtolz
 Аватар для Shtolz
5 / 5 / 0
Регистрация: 10.10.2008
Сообщений: 138
22.09.2011, 12:24  [ТС]     показывает вот сюда if (*pb++ != bCheck) #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ага так тебе и вернёться инициализация при выделении памяти внутри блока, жди - не будет такого!
а как тогда инициализировать временный объект?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ну да, уже б тогда &m_Temp[0] сделал, хотя врядли и это поможет
не, дак она все возвращает.
Программа отрабатывает нормально. Выполняет действия , печатает матрицу, а потом вылетает
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 12:32     показывает вот сюда if (*pb++ != bCheck) #7
Цитата Сообщение от Shtolz Посмотреть сообщение
не, дак она все возвращает.
Программа отрабатывает нормально. Выполняет действия , печатает матрицу, а потом вылетает
- Всё я разобрался - ошибка вылетает в деструкторе при Debug версии в Release Всё отрабатываетЯ уже с таким встречался free иногда "гонит беса на пустом месте". Единственное что переписал так єто Init() когда вводишь значения не разберёшь что ввводить в данный момент
C++
1
2
3
4
5
6
7
8
9
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]; 
    }
}
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 12:36     показывает вот сюда if (*pb++ != bCheck) #8
Цитата Сообщение от Shtolz Посмотреть сообщение
а как тогда инициализировать временный объект?
- На счёт этого
Цитата Сообщение от Shtolz Посмотреть сообщение
MyMatrix& MyMatrix::Transp()
* * * * {
* * * * * * * * MyMatrix *mTemp = new MyMatrix(size);
-а он тебе нужен дополнительный двумерный масссив???Думаю целесообразней в исходной матрице менять столбцы со строками.Вод скрин Release - посыла от ОС в dbheap.c не идёт
Миниатюры
показывает вот сюда if (*pb++ != bCheck)  
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 12:40     показывает вот сюда if (*pb++ != bCheck) #9
Shtolz, в заключение вот Matrix.h совмещённый с прототипами его методов(часто совмешаю при малом числе методов и функций класса+подключать удобней). Подключаешь его к 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
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
#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);
};
 
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() 
{
    if ((void *)arr != NULL)
    {
        for(int i=0; i<size; i++)
            if ((void *)arr[i] != NULL)
                free((void *)arr[i]);
        free((void *)arr);
    }
}
 
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;
}
 
#endif
CAHTEXHUK
Заблокирован
22.09.2011, 12:47     показывает вот сюда if (*pb++ != bCheck) #10
Shtolz, вопрос на засыпку: сколько раз в этой строке произошла утечка памяти?
C++
1
(A.Transp()*B-B*C).Print();
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 13:00     показывает вот сюда if (*pb++ != bCheck) #11
CAHTEXHUK, дело же не в ресурсозатратности программы, я уже об этом писал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а он тебе нужен дополнительный двумерный масссив
а в том что free в Debug глючит
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 13:11     показывает вот сюда if (*pb++ != bCheck) #12
На миниатюрах скрин Debug и место в DBGHEAP.C о которое споткнулись вызывая free
Миниатюры
показывает вот сюда if (*pb++ != bCheck)   показывает вот сюда if (*pb++ != bCheck)  
CAHTEXHUK
Заблокирован
22.09.2011, 13:52     показывает вот сюда if (*pb++ != bCheck) #13
-=ЮрА=-, ну сначала я просто обратил внимание на серьёзный косяк, но при беглом просмотре выяснилось, что и косяк с free тоже кроется в этой строчке. Даю вторую подсказку: чтобы "free перестал глючить", необходим конструктор копирования. Глючит пока только код, с free всё впорядке

Добавлено через 29 минут
C++
1
B*C
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        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;
        }
побайтово делается копия С и его arr совпадает с arr оригинала, при выходе из оператора копия С уничтожается, но так arr у них общий то и содержимое С становится не валидным. При выходе из блока main вызывается деструктор для С, который пытается освободить уже освобождённую память
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 14:20     показывает вот сюда if (*pb++ != bCheck) #14
Цитата Сообщение от CAHTEXHUK Посмотреть сообщение
Даю вторую подсказку: чтобы "free перестал глючить", необходим конструктор копирования.
Да не мне подсказывай, а ТС
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ага так тебе и вернёться инициализация при выделении памяти внутри блока, жди - не будет такого!
CAHTEXHUK
Заблокирован
22.09.2011, 14:44     показывает вот сюда if (*pb++ != bCheck) #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Я уже с таким встречался free иногда "гонит беса на пустом месте"
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
CAHTEXHUK, дело же не в ресурсозатратности программы, я уже об этом писал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Да не мне подсказывай, а ТС
epic fail, мне так непонятно кто из вас двоих - ты или ТС пытается кому помочь. ТС хотя бы не строит нелепых теорий и не вводит ими никого в заблуждение. Желание помочь конечно похвально, однако такая помощь смахивает на медвежью услугу
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 15:02     показывает вот сюда if (*pb++ != bCheck) #16
CAHTEXHUK, я тебя прошу уволь меня от разборок с тобой, (ну вот вы все лезите думаете дааа я умею кодировать, а вот ты тупой), так вот я решил проблемму топика в Release всё отрабатывает, потому что связывание идёт по другому,
2- е на старых версиях free студии (в 6-ке в которой пишу) действительно глючит, так же как и
C++
1
2
double val;
scanf("%lf",&val);
CAHTEXHUK, бросай офтоп и иди реально кому то помоги...
CAHTEXHUK
Заблокирован
22.09.2011, 15:14     показывает вот сюда if (*pb++ != bCheck) #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
так вот я решил проблемму топика в Release всё отрабатывает, потому что связывание идёт по другому,
пфффф, это ты называешь решил проблему?! значит это нормально писать программы, работа которых зависит от настроения комилятора, операционной системы и ещё бог знает чего?

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

Не по теме:

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

CAHTEXHUK
Заблокирован
22.09.2011, 15:52     показывает вот сюда if (*pb++ != bCheck) #19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Проблемму решил так как понятно Shtolz
ты чё издеваешься? проблема напоминаю стоит что ТС дважды пытается повторно освободить память и один раз обращается к памяти, которая была освобожденна! значит как ты решил проблему - переключил с Debug на Release? Бога ради можешь писать как угодно свои программы, но давать подобные советы на форуме начинающим не надо ок? Проблему ты не только не решил, но ещё и усугубил и я уже объяснял почему - не работающий код лучше работающего через раз
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2011, 16:10     показывает вот сюда if (*pb++ != bCheck)
Еще ссылки по теме:

вот такой вот пример C++
C++ Вот такое вот кажется лёгкое задание но не как не могу решить.
Ребята капец сюда опытные программеры C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
22.09.2011, 16:10     показывает вот сюда if (*pb++ != bCheck) #20
CAHTEXHUK, говорю последний раз - в Release другой механизм линковки, если не понимаешь этого ну наверное , вот тебе Release - экзе и Скрин(как видишь алгоритм не отпал при 2-м вводе)
Миниатюры
показывает вот сюда if (*pb++ != bCheck)  
Вложения
Тип файла: rar BadMatrix.exe.rar (45.3 Кб, 5 просмотров)
Yandex
Объявления
22.09.2011, 16:10     показывает вот сюда if (*pb++ != bCheck)
Ответ Создать тему
Опции темы

Текущее время: 09:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru