void main()
{
TMatr *Head /*голова*/ ,*TP,*P1,*P2;
// По ходу выполнения P1 и P2 присваиваются
// определенные TMatr*
TP->item=(P1->item)+(P2->item); // Ошибка e2085 Invalid pointer addition (C++ Builder 6)
}
Скажите, пожалуйста, как ошибку исправить? Я так понимаю, это из-за сложения указателей? Или нет?
P1->item и P2->item - это указатели на Matrix. Как я понимаю, делается попытка найти сумму матриц, т.е. сумму двух экземпляров Matrix. Если так, то следует быть написанным:
void main()
{
TMatr *Head /*голова*/ ,*TP,*P1,*P2;
// По ходу выполнения P1 и P2 присваиваются
// определенные TMatr*
TP->item=(P1->item)+(P2->item); // Ошибка e2085 Invalid pointer addition (C++ Builder 6)
}
Скажите, пожалуйста, как ошибку исправить? Я так понимаю, это из-за сложения указателей? Или нет?
Как верно заметил Romeo, нужно создать объекты перед их исползованием. Без этого, ты делаеш попытку складывать неинициализированные указатели, вот оно и ругается.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Airhand писал(а):Как верно заметил Romeo, нужно создать объекты перед их исползованием. Без этого, ты делаеш попытку складывать неинициализированные указатели, вот оно и ругается.
Блин, робяты, ну вы что, ведь в исходном тексте же написано:
Сорри, не было времени прочитать код подробно. Написал первую проблему, которую увидел. Тогда да, нужно разыменовывать указатели на матрицы перед тем, как написать +, иначе будет попытака сложить поинтеры вместо вызова оператора + для класса Matrix.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
У меня вот еще созрел вопрос. Пытаюсь перегрузить () - доступ к элементу матрицы. Чтобы иметь представление, как это делается, быстренько накатал вот сие:
Matix m;
double d1 = m(1,2);
Matrix* pM = new Matrix();
double d2 = (*pM)(1, 2);
delete pM;
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Да это я опечатался. Твой последний вариант более корректен.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
class TMas // создал абстрактный, чтобы в главной проге работать с одним указателем, а не с кучей типизированных указателей на объект
{
public:
virtual void PrintElem(const int& id)=0;
//..
};
template <class TType> class Massiv: virtual public TMas
{
public:
//..
void PrintElem(const int& id);
TType operator[](const int& id);
protected:
struct TT{
TType item;
TT*next;
};
int count;
TT *Head;
TT *Last;
};
---------> И вот мне надо id-й элемент вывести, вызываю в главной функции PrintElem(id).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.