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

Делаю Memory Manager Array с простым (int) exception последний элемент чудит - C++

Восстановить пароль Регистрация
 
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
30.07.2012, 20:29     Делаю Memory Manager Array с простым (int) exception последний элемент чудит #1
array_hpp
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
//array_hpp 
#ifndef Array_HPP
#define Array_HPP
 
#include "Point.hpp"
#include <iostream>
 
 
class Array
{
private:    
 
    Point* m_data;                  // A data member for a dynamic C array of Point objects (Point* m_data).
    int m_size;                     // A data member for the size of the array.
 
 
public: 
 
    //----------- Declaration of Constructors -----------//
    Array::Array();                         // Default constructor
    Array::Array(const int new_size);       // Constructor with size argument.
    Array::Array(const Array& ObjArray);          // Copy constructor
    Array::~Array();                        // Destructor
 
 
    //----------- Declaration of Accessors member functions -----------//
    int Array::Size() const;                                // Get the data of m_size 
    Point& GetElement(const int index) const;               // Return a Element(Point* m_data) by given index of a Array object
    
 
    //----------- Declaration of Modificator(s) member functions -----------//
    void   SetElement(const Point& pt,const int index);     // Set Element to a Array object
 
 
    //----------- Declaration of Operators Overloading the class's members -----------//
    Array& operator =  (const Array& source);               // Overloading Assignment operator.
    Point& operator [] (int index);                         // Return a reference to needed m_data. 
    const Point& operator [] (int index) const ;            // Return a reference to needed m_data. Need for working with a const object 
 
 
    //----------- Declaration of Global (friend) Ostream << Operator  -----------//
    friend std::ostream& operator << (std::ostream& os, const Array& ar);           // Overloading << operator
 
}   /*!!!*/; /*!!!*/
#endif // Array_HPP


Point_hpp_test_version
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
//                                                      
//                                                  (----Point_hpp_test_version----)
//                                                          
#ifndef Point_HPP // anti multiply including gates
#define Point_HPP
#include <string>
#include <iostream>
#include <sstream>
 
 
            class Point 
 
            {   
                private:        //  declaration of private data members 
                double x;       // X coordinate
                double y;       // Y coordinate
 
 
                public: // public declaration of data members (in given example haven't ) and member functions
 
                //----------- Declaration of Constructors -----------//
                    Point();                                                    // Default constructor
                    Point( const double newX ,const double newY);               // Constructor 
                    ~Point();  
                //----------- Declaration of Accessors  -----------//
                    std::string ToString() const;    
 
                //----------- Declaration of Global Ostream << Operator  -----------//
                friend std::ostream& operator << (std::ostream& out,const Point & ObjPoint); 
            } /*!!!*/ ; /*!!!*/
 
#endif // Point_HPP


Array_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
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
//                                          Array_cpp
#include "Array.hpp"
                                        
    //----------- Implementation of Constructors -----------//
    Array::Array() :  m_size(10), m_data(new Point[m_size])                                    
            {
            //  std::cout << "Array Default Constructor was called " ;
            }
 
    Array::Array(const int new_size) :m_size(new_size), m_data(new Point[new_size])       //specified by the size input argument                    
            {   
            //  std::cout << "Array Constructor was called "; 
            }
 
    Array::Array(const Array& ObjArray) 
        {
           // std::cout << "Array copy Constructor "; 
            m_size    =    ObjArray.m_size;         // shallow copy - this is not dynamic alloc
                if (ObjArray.m_data)                // if not zeros then there is a ref. - Deep copy needed
                    {
                        m_data = new Point[ObjArray.m_size];
                        for (int i = 0; i <   ObjArray.m_size; i++)
                        m_data[i]    =    ObjArray.m_data[i];
                    }
                else
                m_data = 0;                         //NULL
        }
 
    Array::~Array()                                 
        {
            std::cout << "Array Destructor was called" ;
            delete [] m_data;
        }
 
 
    //----------- Implementation of Modificators member functions -----------//
    void Array::SetElement(const Point& ObjPoint,const int index)
        {   
                try
                    {
                        if (index > m_size) {throw -1;} // When the index is out of bounds, ignore the “set”.
                        m_data[index] = ObjPoint;
                        std::cout << "Set Element " 
                                  << ObjPoint  << std::endl;
                    }
                catch (int throw_variable ) //!!!MY QUESTION DELETED!!! what does x mean what this is the mystical variable 
                    {
                        std::cout << " ERROR *** " 
                                  << throw_variable 
                                  << " ignore the set, because index of element bigger then massive size "
                                  << std::endl;
                    }
        }
 
 
 
    //----------- Implementation of Accessor(s) member functions -----------//
    Point& Array::GetElement(const int index) const
        {   // cout << "GetElement...done " << endl;
            try 
                {
                    
                    if (index > m_size || index < 0)    
                        { 
                            throw -1;
                        } 
                    
                    return m_data[index];
                    
                } 
            
 
            catch (int throw_variable)
                {
                    std::cout << "\nindex incorrect, index too big or too small " 
                              << throw_variable 
                              << std::endl; 
                }  
                
        }
 
    int Array::Size() const // Get size
    { 
        return m_size;
    }
 
 
    //----------- Implementation of Operators Overloading the class's member -----------//
    const Point& Array::operator [] (int index) const
        {   
 
            //std::cout << " []  OPERATOR for ***READING*** was called " ; 
 
            if (index > this-> m_size)
                    {
                        std::cout << "OUT OF BOUND ";
                        return this->m_data[0];
                    }
 
            return m_data[index];
        }
 
    Point& Array::operator [] (int index)
        {   
 
        //  std::cout << "[] operator for writing was called \n" ; 
 
            if (index > this->m_size)
                    {
                        std::cout << "OUT OF BOUND \n" ; 
                        return this->m_data[0];
                    }
            return m_data[index];
 
        }
 
 
    Array& Array::operator = (const Array& ObjArray)
        {
            
 
        //  std::cout << " In the Array Assignment operator\n";
 
            if (this == &ObjArray)
                {
            //  std::cout << "Same Array \n"; 
                return *this;
                }
 
            delete [] m_data;
            std::cout << "Deleted m_data array\n";
 
            m_size = ObjArray.m_size;                               // shallow copy - this is not dynamic alloc
 
            if (ObjArray.m_data)                                    // if not zeros then there is a ref.
                    {
                        std::cout <<"im here\n"; 
 
                        m_data = new Point[ObjArray.m_size];        // create a new pointee.
 
                        for (int i = 0; i < ObjArray.m_size; i++)
                            m_data[i]    =    ObjArray.m_data[i];   //copy the points from/to array
                    }
            else
                m_data = 0;  //NULL
 
            return *this;
        }
 
    
 
 
    //----------- Implementation of GLOBAL(friend) Ostream << Operator  -----------//
std::ostream& operator << (std::ostream& os, const Array& ObjArray)
        {
            os << "\nArray Size = " << ObjArray.m_size << std::endl;
 
                for (int i = 0; i < ObjArray.m_size; i++)
                    os << "Array [" << i << "]= "<< ObjArray.m_data[i] << "\n";
 
            return os;
        }


Point_hpp_test_version
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
//                                                      
//                                                  (----Point_hpp_test_version----)
//                                              
#include "Point.hpp"
 
 int number_of_point_constructor_calls          = 1 ; 
 int number_of_point_destructor_calls           = 1 ; 
 int number_of_point_assignment_operator_calls  = 1 ; 
 
                    //----------- Implementation of Constructors -----------//
            Point::Point() : x(0) , y(0)                                    // Default constructor (implemented using colon syntax )
                { 
                //  std::cout << "hi my default constructor\n\n\t";
                }                           
            Point::Point(const double newX ,const double newY) : x(newX)  , y(newY)     // Constructor 
                { 
 
                    //std::cout << " My Point constructor was called " << number_of_point_constructor_calls++ << " times " << "\n"; 
                }               
            Point::~Point()                                                             // Destructor
                {
                //  std::cout << " My Point destructor was called " << number_of_point_destructor_calls++ << " times " << "\n"; 
                }           
 
            //----------- Implementation of Accessors  -----------//
                std::string Point::ToString() const
                
                {
   
            std::ostringstream os;                              // std::stringstream object
            os << " Point (" << x << ", " << y << ")\n";        // customization of output 
            return os.str();                                    // str() function retrieve the string from the string buffer
                }
                
 
 
        /*  Point& Point::operator =  (const Point& ObjPoint)                           // Assignment operator.             
                {       
                    std::cout << " My Point assignment operator was called " << number_of_point_assignment_operator_calls++ << " times " << "\n"; 
                    x=ObjPoint.x, y=ObjPoint.y;
                    return *this;                                                       // The meaning of *this explained in this example (implementation) see comment out  
                }*/
 
            std::ostream& operator << (std::ostream& out,const Point & ObjPoint)
                    {
                        return out << "[" << ObjPoint.x << "," << ObjPoint.y << "]" ; 
                    }


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
//                                                      main_cpp
 
#include <iostream>
#include "Point.hpp"
#include "Array.hpp"
 
int main()
 
    {
                                              
    int size_of_array = 5;                                      
    Point** MyArrayOfPointers = new Point*[size_of_array];          //Creating an array of Point pointers with 3 elements on the heap.
                    
    
    int some_data_for_x[5] = {1830 , 1901 , 1914, 1900 , 1895} ; 
    int some_data_for_y[5] = {1903 , 1947 , 1211, 1969 , 1789} ; 
 
   
    for (int i = 0 ; i <size_of_array; i++ )                        // Create for each element in the array a point on the heap.
        {
            MyArrayOfPointers[i] = new Point(some_data_for_x[i],                
                                             some_data_for_y[i]);                                                                                       
        }
 
 
         std::cout  << "\nCreating object of Array class \n"; 
         Array* MemoryManagerArray = new Array(size_of_array); 
 
 
    std::cout   << "\n\t Printing elements of MemoryManagerArray \n";
    std::cout   << MemoryManagerArray->GetElement(0)    << "\n"             // Printing elements of MemoryManagerArray
                << MemoryManagerArray->GetElement(1)    << "\n"
                << MemoryManagerArray->GetElement(2)    << "\n"
                << MemoryManagerArray->GetElement(3)    << "\n"
                << MemoryManagerArray->GetElement(27) << " "    
                << "\n";
   
    std::cout << "\n\t Setting elements of MemoryManagerArray \n";
 
   
    MemoryManagerArray->SetElement(*MyArrayOfPointers[0],0);                // Setting elements of MemoryManagerArray
    MemoryManagerArray->SetElement(*MyArrayOfPointers[1],1);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[2],2);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[3],3);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[4],17);               // The set will be ignored, because out of bounds
  
 
 
    std::cout   << "\n\t Printing elements of MemoryManagerArray \n";
    std::cout   << MemoryManagerArray->GetElement(0)    << "\n"             // Printing elements of MemoryManagerArray
                << MemoryManagerArray->GetElement(1)    << "\n"
                << MemoryManagerArray->GetElement(2)    << "\n"
                << MemoryManagerArray->GetElement(3)    << "\n"
                << MemoryManagerArray->GetElement(17) << " "                // The given getting is impossible , because out of bounds
                                                                            
                << MemoryManagerArray->GetElement(4) << " " ;               
        
 
    
    std::cout << std::endl; 
    return 0;
 
    }


Когда я геттаю элемент с неправильным индексом на консоле вместе с сообщением об ошибке (которое продуцируется try catch блоком ) печатается точка со злыми координатами а ля 3 млрд в млрд степени (см принскрин ). не много понять что я не так сделал
Заранее спасибо
Миниатюры
Делаю Memory Manager Array с простым (int) exception последний элемент чудит  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 20:29     Делаю Memory Manager Array с простым (int) exception последний элемент чудит
Посмотрите здесь:

С++:invalid types 'int[int]' for array subscript C++
Строки. Как найти в слове первый элемент? Второй элемент, последний элемент? C++
Ошибка при написании класса: Unhandled exception std::bad_alloc at memory location C++
Invalid types `int[int]' for array subscript C++
C++ Custom memory manager
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.07.2012, 21:38     Делаю Memory Manager Array с простым (int) exception последний элемент чудит #2
Что-то вы намудрили с исключениями. В чём прикол выбрасывать их в геттеро-сеттерах и тут же ловить? Это ведь должно быть головная болью пользователя контейнера, если он обращается чёрти-куда, хотя может узнать, куда может обращаться.

Не по теме:

> ignore the set, because index of element bigger then massive size
И английский не мешало бы подтянуть.



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Point& Array::GetElement(const int index) const
{
    try {
        if (index > m_size || index < 0) { 
            throw -1;
        } 
        return m_data[index];
    } 
    catch (int throw_variable) {
        std::cout << "\nindex incorrect, index too big or too small " 
                  << throw_variable 
                  << std::endl; 
    }          
}
В массиве 3 элемента, я обращаюсь к элементу номер 42. Следите за руками:
1. Входим в try-блок.
2. Проваливаем проверку в if, бросаем минус единицу.
3. Она перехватывается catch-блоком.
4. Выводится на экран сообщение.
// а теперь интересное
5. Выходим из catch-блока.
6. Функция должна была вернуть ссылку на элемент, но ведь return не был вызван.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
30.07.2012, 21:52  [ТС]     Делаю Memory Manager Array с простым (int) exception последний элемент чудит #3
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Что-то вы намудрили с исключениями. В чём прикол выбрасывать их в геттеро-сеттерах и тут же ловить? Это ведь должно быть головная болью пользователя контейнера, если он обращается чёрти-куда, хотя может узнать, куда может обращаться.

Не по теме:

> ignore the set, because index of element bigger then massive size
И английский не мешало бы подтянуть.



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Point& Array::GetElement(const int index) const
{
    try {
        if (index > m_size || index < 0) { 
            throw -1;
        } 
        return m_data[index];
    } 
    catch (int throw_variable) {
        std::cout << "\nindex incorrect, index too big or too small " 
                  << throw_variable 
                  << std::endl; 
    }          
}
В массиве 3 элемента, я обращаюсь к элементу номер 42. Следите за руками:
1. Входим в try-блок.
2. Проваливаем проверку в if, бросаем минус единицу.
3. Она перехватывается catch-блоком.
4. Выводится на экран сообщение.
// а теперь интересное
5. Выходим из catch-блока.
6. Функция должна была вернуть ссылку на элемент, но ведь return не был вызван.
array.cpp new
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
//                                          Array_cpp
#include "Array.hpp"
                                        
    //----------- Implementation of Constructors -----------//
    Array::Array() :  m_size(10), m_data(new Point[m_size])                                    
            {
            //  std::cout << "Array Default Constructor was called " ;
            }
 
    Array::Array(const int new_size) :m_size(new_size), m_data(new Point[new_size])       //specified by the size input argument                    
            {   
            //  std::cout << "Array Constructor was called "; 
            }
 
    Array::Array(const Array& ObjArray) 
        {
           // std::cout << "Array copy Constructor "; 
            m_size    =    ObjArray.m_size;         // shallow copy - this is not dynamic alloc
                if (ObjArray.m_data)                // if not zeros then there is a ref. - Deep copy needed
                    {
                        m_data = new Point[ObjArray.m_size];
                        for (int i = 0; i <   ObjArray.m_size; i++)
                        m_data[i]    =    ObjArray.m_data[i];
                    }
                else
                m_data = 0;                         //NULL
        }
 
    Array::~Array()                                 
        {
            std::cout << "Array Destructor was called" ;
            delete [] m_data;
        }
 
 
    //----------- Implementation of Modificators member functions -----------//
    void Array::SetElement(const Point& ObjPoint,const int index)
        {   
                try
                    {
                        if (index > m_size) {throw -1;} // When the index is out of bounds, ignore the “set”.
                        m_data[index] = ObjPoint;
                        std::cout << "Set Element " 
                                  << ObjPoint  << std::endl;
                    }
                catch (int throw_variable ) //!!!MY QUESTION DELETED!!! what does x mean what this is the mystical variable 
                    {
                        std::cout << " ERROR *** " 
                                  << throw_variable 
                                  << " ignore the set, because index of element bigger then massive size "
                                  << std::endl;
                    }
        }
 
 
 
    //----------- Implementation of Accessor(s) member functions -----------//
    Point& Array::GetElement(const int index) const
        {   // cout << "GetElement...done " << endl;
            /*try 
                {
                    
                    if (index > m_size || index < 0)    
                        { 
                            throw -1;
                        } 
                    
                    return m_data[index];
                    
                } 
            
 
            catch (int throw_variable)
                {
                    std::cout << "\nindex incorrect, index too big or too small " 
                              << throw_variable 
                              << std::endl; 
                }  */
 
                try {
        if (index > m_size || index < 0) { 
            throw -1;
        } 
        return m_data[index];
    } 
    catch (int throw_variable) {
        std::cout << "\nindex incorrect, index too big or too small " 
                  << throw_variable 
                  << std::endl; 
    }          
 
                
        }
 
    int Array::Size() const // Get size
    { 
        return m_size;
    }
 
 
    //----------- Implementation of Operators Overloading the class's member -----------//
    const Point& Array::operator [] (int index) const
        {   
 
            //std::cout << " []  OPERATOR for ***READING*** was called " ; 
 
            if (index > this-> m_size)
                    {
                        std::cout << "OUT OF BOUND ";
                        return this->m_data[0];
                    }
 
            return m_data[index];
        }
 
    Point& Array::operator [] (int index)
        {   
 
        //  std::cout << "[] operator for writing was called \n" ; 
 
            if (index > this->m_size)
                    {
                        std::cout << "OUT OF BOUND \n" ; 
                        return this->m_data[0];
                    }
            return m_data[index];
 
        }
 
 
    Array& Array::operator = (const Array& ObjArray)
        {
            
 
        //  std::cout << " In the Array Assignment operator\n";
 
            if (this == &ObjArray)
                {
            //  std::cout << "Same Array \n"; 
                return *this;
                }
 
            delete [] m_data;
            std::cout << "Deleted m_data array\n";
 
            m_size = ObjArray.m_size;                               // shallow copy - this is not dynamic alloc
 
            if (ObjArray.m_data)                                    // if not zeros then there is a ref.
                    {
                        std::cout <<"im here\n"; 
 
                        m_data = new Point[ObjArray.m_size];        // create a new pointee.
 
                        for (int i = 0; i < ObjArray.m_size; i++)
                            m_data[i]    =    ObjArray.m_data[i];   //copy the points from/to array
                    }
            else
                m_data = 0;  //NULL
 
            return *this;
        }
 
    
 
 
    //----------- Implementation of GLOBAL(friend) Ostream << Operator  -----------//
std::ostream& operator << (std::ostream& os, const Array& ObjArray)
        {
            os << "\nArray Size = " << ObjArray.m_size << std::endl;
 
                for (int i = 0; i < ObjArray.m_size; i++)
                    os << "Array [" << i << "]= "<< ObjArray.m_data[i] << "\n";
 
            return os;
        }


копипастнул ошибка осталась
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.07.2012, 22:02     Делаю Memory Manager Array с простым (int) exception последний элемент чудит #4
Это не исправленный код, это переформатированный ваш код, приведённый как иллюстрация к тексту ниже, где описывается, что идёт не так.

Вы совершенно не понимаете сути try-catch. Перехват исключений и формирование сообщений об ошибках должен происходить не в методах Array, а в том коде, который их использует (то есть в main).
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
30.07.2012, 22:26  [ТС]     Делаю Memory Manager Array с простым (int) exception последний элемент чудит #5
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Это не исправленный код, это переформатированный ваш код, приведённый как иллюстрация к тексту ниже, где описывается, что идёт не так.

Вы совершенно не понимаете сути try-catch. Перехват исключений и формирование сообщений об ошибках должен происходить не в методах Array, а в том коде, который их использует (то есть в main).
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
//                                                      main_cpp
 
#include <iostream>
#include "Point.hpp"
#include "Array.hpp"
 
int main()
 
    {
 
        try 
        {
                                              
    int size_of_array = 5;                                      
    Point** MyArrayOfPointers = new Point*[size_of_array];          //Creating an array of Point pointers with 3 elements on the heap.
                    
    
    int some_data_for_x[5] = {1830 , 1901 , 1914, 1900 , 1895} ; 
    int some_data_for_y[5] = {1903 , 1947 , 1211, 1969 , 1789} ; 
 
   
    for (int i = 0 ; i <size_of_array; i++ )                        // Create for each element in the array a point on the heap.
        {
            MyArrayOfPointers[i] = new Point(some_data_for_x[i],                
                                             some_data_for_y[i]);                                                                                       
        }
 
 
         std::cout  << "\nCreating object of Array class \n"; 
         Array* MemoryManagerArray = new Array(size_of_array); 
 
 
    std::cout   << "\n\t Printing elements of MemoryManagerArray \n";
    std::cout   << MemoryManagerArray->GetElement(0)    << "\n"             // Printing elements of MemoryManagerArray
                << MemoryManagerArray->GetElement(1)    << "\n"
                << MemoryManagerArray->GetElement(2)    << "\n"
                << MemoryManagerArray->GetElement(3)    << "\n"
                << MemoryManagerArray->GetElement(27) << " "    
                << "\n";
   
    std::cout << "\n\t Setting elements of MemoryManagerArray \n";
 
   
    MemoryManagerArray->SetElement(*MyArrayOfPointers[0],0);                // Setting elements of MemoryManagerArray
    MemoryManagerArray->SetElement(*MyArrayOfPointers[1],1);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[2],2);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[3],3);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[4],17);               // The set will be ignored, because out of bounds
  
 
 
    std::cout   << "\n\t Printing elements of MemoryManagerArray \n";
    std::cout   << MemoryManagerArray->GetElement(0)    << "\n"             // Printing elements of MemoryManagerArray
                << MemoryManagerArray->GetElement(1)    << "\n"
                << MemoryManagerArray->GetElement(2)    << "\n"
                << MemoryManagerArray->GetElement(3)    << "\n"
                << MemoryManagerArray->GetElement(17) << " "                // The given getting is impossible , because out of bounds
                                                                            
                << MemoryManagerArray->GetElement(4) << " " ;               
        
        }
 
    
    catch (int throw_variable)
    {
        std::cout << "\nindex incorrect, index too big or too small " 
                  << throw_variable 
                  << std::endl; 
    }          
    
    std::cout << std::endl; 
    return 0;
 
    }


array.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
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
//                                          Array_cpp
#include "Array.hpp"
                                        
    //----------- Implementation of Constructors -----------//
    Array::Array() :  m_size(10), m_data(new Point[m_size])                                    
            {
            //  std::cout << "Array Default Constructor was called " ;
            }
 
    Array::Array(const int new_size) :m_size(new_size), m_data(new Point[new_size])       //specified by the size input argument                    
            {   
            //  std::cout << "Array Constructor was called "; 
            }
 
    Array::Array(const Array& ObjArray) 
        {
           // std::cout << "Array copy Constructor "; 
            m_size    =    ObjArray.m_size;         // shallow copy - this is not dynamic alloc
                if (ObjArray.m_data)                // if not zeros then there is a ref. - Deep copy needed
                    {
                        m_data = new Point[ObjArray.m_size];
                        for (int i = 0; i <   ObjArray.m_size; i++)
                        m_data[i]    =    ObjArray.m_data[i];
                    }
                else
                m_data = 0;                         //NULL
        }
 
    Array::~Array()                                 
        {
            std::cout << "Array Destructor was called" ;
            delete [] m_data;
        }
 
 
    //----------- Implementation of Modificators member functions -----------//
    void Array::SetElement(const Point& ObjPoint,const int index)
        {   
                
                        if (index > m_size || index < 0)    {throw -1;} // When the index is out of bounds, ignore the “set”.
                        m_data[index] = ObjPoint;
                        std::cout << "Set Element " 
                                  << ObjPoint  << std::endl;
                
        }
 
 
 
    //----------- Implementation of Accessor(s) member functions -----------//
    Point& Array::GetElement(const int index) const
        {   // cout << "GetElement...done " << endl;
            /*try 
                {
                    
                    if (index > m_size || index < 0)    
                        { 
                            throw -1;
                        } 
                    
                    return m_data[index];
                    
                } 
            
 
            catch (int throw_variable)
                {
                    std::cout << "\nindex incorrect, index too big or too small " 
                              << throw_variable 
                              << std::endl; 
                }  */
 
                
        if (index > m_size || index < 0) 
        { 
            throw -1;
        } 
 
        return m_data[index];
    
    }
                
        
 
    int Array::Size() const // Get size
    { 
        return m_size;
    }
 
 
    //----------- Implementation of Operators Overloading the class's member -----------//
    const Point& Array::operator [] (int index) const
        {   
 
            //std::cout << " []  OPERATOR for ***READING*** was called " ; 
 
            if (index > this-> m_size)
                    {
                        std::cout << "OUT OF BOUND ";
                        return this->m_data[0];
                    }
 
            return m_data[index];
        }
 
    Point& Array::operator [] (int index)
        {   
 
        //  std::cout << "[] operator for writing was called \n" ; 
 
            if (index > this->m_size)
                    {
                        std::cout << "OUT OF BOUND \n" ; 
                        return this->m_data[0];
                    }
            return m_data[index];
 
        }
 
 
    Array& Array::operator = (const Array& ObjArray)
        {
            
 
        //  std::cout << " In the Array Assignment operator\n";
 
            if (this == &ObjArray)
                {
            //  std::cout << "Same Array \n"; 
                return *this;
                }
 
            delete [] m_data;
            std::cout << "Deleted m_data array\n";
 
            m_size = ObjArray.m_size;                               // shallow copy - this is not dynamic alloc
 
            if (ObjArray.m_data)                                    // if not zeros then there is a ref.
                    {
                        std::cout <<"im here\n"; 
 
                        m_data = new Point[ObjArray.m_size];        // create a new pointee.
 
                        for (int i = 0; i < ObjArray.m_size; i++)
                            m_data[i]    =    ObjArray.m_data[i];   //copy the points from/to array
                    }
            else
                m_data = 0;  //NULL
 
            return *this;
        }
 
    
 
 
    //----------- Implementation of GLOBAL(friend) Ostream << Operator  -----------//
std::ostream& operator << (std::ostream& os, const Array& ObjArray)
        {
            os << "\nArray Size = " << ObjArray.m_size << std::endl;
 
                for (int i = 0; i < ObjArray.m_size; i++)
                    os << "Array [" << i << "]= "<< ObjArray.m_data[i] << "\n";
 
            return os;
        }


теперь он находит первое исключение и все...
причем находит на первом элементе что не верно
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
30.07.2012, 22:27  [ТС]     Делаю Memory Manager Array с простым (int) exception последний элемент чудит #6
скринер
Миниатюры
Делаю Memory Manager Array с простым (int) exception последний элемент чудит  
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.07.2012, 22:43     Делаю Memory Manager Array с простым (int) exception последний элемент чудит #7
Вот тут я не уверен в семантике кода и ассоциативности оператора <<, стандарты читать лень. Попробуйте переписать строки 36–41 следующим образом, разбив на несколько операторов. Должно вылетать тогда только на последнем.
C++
1
2
3
4
5
std::cout << MemoryManagerArray->GetElement(0)  << "\n";
std::cout << MemoryManagerArray->GetElement(1)  << "\n";
std::cout << MemoryManagerArray->GetElement(2)  << "\n";
std::cout << MemoryManagerArray->GetElement(3)  << "\n";
std::cout << MemoryManagerArray->GetElement(27) << "\n";
Но в любом случае лучше пользоваться правильной идиомой обработки ошибок с помощью исключений:
C++
1
2
3
4
5
6
7
// оборачивать в try-catch *каждый* кусок, где может произойти ошибка
try {
  /* код, в котором может произойти ошибка */
}
catch (/* значение */) {
  /* обработка ошибки */
}
а не
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
  // весь код завёрнут в один try-catch-блок
  try {
    /* кот */
  }
  catch (/* значение */) {
    /* обработка */
  }
  return 0;
}
Это работает, но ведь это ловит только одну, первую ошибку. Дальше программа завершается.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
30.07.2012, 22:50  [ТС]     Делаю Memory Manager Array с простым (int) exception последний элемент чудит #8
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Вот тут я не уверен в семантике кода и ассоциативности оператора <<, стандарты читать лень. Попробуйте переписать строки 36–41 следующим образом, разбив на несколько операторов. Должно вылетать тогда только на последнем.
C++
1
2
3
4
5
std::cout << MemoryManagerArray->GetElement(0)  << "\n";
std::cout << MemoryManagerArray->GetElement(1)  << "\n";
std::cout << MemoryManagerArray->GetElement(2)  << "\n";
std::cout << MemoryManagerArray->GetElement(3)  << "\n";
std::cout << MemoryManagerArray->GetElement(27) << "\n";
Но в любом случае лучше пользоваться правильной идиомой обработки ошибок с помощью исключений:
C++
1
2
3
4
5
6
7
// оборачивать в try-catch *каждый* кусок, где может произойти ошибка
try {
  /* код, в котором может произойти ошибка */
}
catch (/* значение */) {
  /* обработка ошибки */
}
а не
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
  // весь код завёрнут в один try-catch-блок
  try {
    /* кот */
  }
  catch (/* значение */) {
    /* обработка */
  }
  return 0;
}
Это работает, но ведь это ловит только одну, первую ошибку. Дальше программа завершается.
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
//                                                      main_cpp
 
#include <iostream>
#include "Point.hpp"
#include "Array.hpp"
 
int main()
 
    {
 
                                              
    int size_of_array = 5;                                      
    Point** MyArrayOfPointers = new Point*[size_of_array];          //Creating an array of Point pointers with 3 elements on the heap.
                    
    
    int some_data_for_x[5] = {1830 , 1901 , 1914, 1900 , 1895} ; 
    int some_data_for_y[5] = {1903 , 1947 , 1211, 1969 , 1789} ; 
 
   
    for (int i = 0 ; i <size_of_array; i++ )                        // Create for each element in the array a point on the heap.
        {
            MyArrayOfPointers[i] = new Point(some_data_for_x[i],                
                                             some_data_for_y[i]);                                                                                       
        }
 
 
         std::cout  << "\nCreating object of Array class \n"; 
         Array* MemoryManagerArray = new Array(size_of_array); 
 
         
        try 
        {
 
    std::cout << MemoryManagerArray->GetElement(0)  << "\n";
    std::cout << MemoryManagerArray->GetElement(1)  << "\n";
    std::cout << MemoryManagerArray->GetElement(2)  << "\n";
    std::cout << MemoryManagerArray->GetElement(3)  << "\n";
    std::cout << MemoryManagerArray->GetElement(27) << "\n";
        }
         catch (int throw_variable)
    {
        std::cout << "\nindex incorrect, index too big or too small " 
                  << throw_variable 
                  << std::endl; 
    }          
    
    
 
    
   
    std::cout << "\n\t Setting elements of MemoryManagerArray \n";
 
   
         
        try 
        {
 
 
    MemoryManagerArray->SetElement(*MyArrayOfPointers[0],0);                // Setting elements of MemoryManagerArray
    MemoryManagerArray->SetElement(*MyArrayOfPointers[1],1);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[2],2);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[3],3);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[4],17);               // The set will be ignored, because out of bounds
  
    }
         catch (int throw_variable)
    {
        std::cout << "\nindex incorrect, index too big or too small " 
                  << throw_variable 
                  << std::endl; 
    }       
 
             
        try 
        {
 
 
    std::cout << MemoryManagerArray->GetElement(0)  << "\n";
    std::cout << MemoryManagerArray->GetElement(1)  << "\n";
    std::cout << MemoryManagerArray->GetElement(2)  << "\n";
    std::cout << MemoryManagerArray->GetElement(3)  << "\n";
    std::cout << MemoryManagerArray->GetElement(4)  << "\n";
    std::cout << MemoryManagerArray->GetElement(27) << "\n";    
    
        }
 
         catch (int throw_variable)
    {
        std::cout << "\nindex incorrect, index too big or too small " 
                  << throw_variable 
                  << std::endl; 
    }       
 
        
    std::cout << std::endl; 
    return 0;
    
   }


Вроде нормально работает... да действидельно try catch надо было нормально расставить и да... удивительно что действительно семантика вредила .... большое спасибо сам бы голову сломал в чем дело
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.07.2012, 22:54     Делаю Memory Manager Array с простым (int) exception последний элемент чудит #9
Разобрался с ней. Вот это:
cout << a << b << c;
эквивалентно:
(((cout << a) << b) << c);
что эквивалентно:
operator<<(operator<<(operator<<(cout, a), b), c);

В итоге ни один из operator<< не приступает к выводу данных, пока не будет вычислены все значения выводимых объектов. Поэтому, естественно, если при вычислении любого из значений возникает исключение, то ни один из них не выводится.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 23:01     Делаю Memory Manager Array с простым (int) exception последний элемент чудит
Еще ссылки по теме:

Memory Manager C++
C++ Ошибка error: invalid types 'int[int]' for array subscript
C++ Invalid types 'int[int]' for array subscript

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

Или воспользуйтесь поиском по форуму:
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
30.07.2012, 23:01  [ТС]     Делаю Memory Manager Array с простым (int) exception последний элемент чудит #10
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Разобрался с ней. Вот это:
cout << a << b << c;
эквивалентно:
(((cout << a) << b) << c);
что эквивалентно:
operator<<(operator<<(operator<<(cout, a), b), c);

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

Мне еще расти и расти...
Yandex
Объявления
30.07.2012, 23:01     Делаю Memory Manager Array с простым (int) exception последний элемент чудит
Ответ Создать тему
Опции темы

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