Автор
|
Тема: омогите плз!!!
|
Evkisiy |
опубликован 17-01-2002 15:12 MSK
Пишу на пятом билдере. Описал класс: template<class T> Matrix { ........ public: static int count; ........ };...... Matrix<double> tmp; ...... При попытке обращения к count возникает ошибка (да и вообще к любому статическому члену): [Linker Error] Unresolved external 'Matrix<double>::Count' referenced from C:\LINALG\UNIT1.OBJ Причем работа со всеми остальными нестатическими элементами класса происходит нормально. Может кто подскажет что делать, вторую неделю копаюсь :(
|
Valery
|
опубликован 17-01-2002 15:35 MSK
проинициализировать нужно статический член твоего класса, вот так:template<class T> int Matrix<T>::count = 0; |
Flex Ferrum
|
опубликован 17-01-2002 16:41 MSK
Я бы не рискнул в шаблонных классах объявлять статические члены. Могут возникнуть сложности с их определением. |
Vovochka
|
опубликован 17-01-2002 16:45 MSK
Flex Ferrum прав. Добалю, что пользовать статические члены внутри класса без должного обоснования, очень вредно для головы. |
Valery
|
опубликован 17-01-2002 19:54 MSK
позволю себе с Вами не согласиться, очень даже полезно бывает. А для головы-то чем же плохо? Пущай поработает. |
Evkisiy
|
опубликован 18-01-2002 11:39 MSK
Дело в том, что мне нужно реализовать стек внутри класса, если можно это сделать подругому - подскажите плз. |
Flex Ferrum
|
опубликован 18-01-2002 11:46 MSK
Поясни идею. И еще, зачем тебе стек, зашаренный между всеми объектами класса? |
Evkisiy
|
опубликован 18-01-2002 11:53 MSK
После переопределения опрератора *, появляется мусор в памяти, идея такая, помещать в стек все элементы извлекать из стека все элементы на которые есть ссылка, остальное удалять. |
Flex Ferrum
|
опубликован 18-01-2002 00:19 MSK
Мммм... А как ты переопределил этот оператор (в смысле, приведи кусок кода). Может, проблема решается другим образом... И почему именно стек? |
Valery
|
опубликован 18-01-2002 00:44 MSK
Тю, батенька, да Вы на сборщик мусора замахнулись! :) Рекомендую почитать Джефа Элджера, очень хорошо это у него изложено. А по поводу потерь памяти, это который * перегружен умножение или разыменование? может лучше его код привести, вместе и подумаем, может там чего не так? |
Evkisiy
|
опубликован 18-01-2002 14:26 MSK
* в смысле умножение, если описать деструктор руками, то он убивает и то что нужно и то, что не нужно :(. Вот поэтому и приходиться что то придумывать |
Evkisiy
|
опубликован 18-01-2002 14:29 MSK
кстати, Valery ссылочку на книгу не кинете? |
Flex Ferrum
|
опубликован 18-01-2002 14:31 MSK
Evkisiy: Ты, всетаки, код приведи. А то на пальцах мы еще долго объясняться будем... |
Evkisiy
|
опубликован 18-01-2002 14:33 MSK
К сожалению код привести тяжеловато, много его :(. А если кусок то какой? У меня проблема именно получить доступ к статическим членам класса |
Flex Ferrum
|
опубликован 18-01-2002 14:40 MSK
Тады хоть идею расскажи. Мне, честно говоря, не совсем понятно, зачем для операции умножения матриц необходимы статические члены. Или ты результат не знаешь как вернуть? |
Evkisiy
|
опубликован 18-01-2002 14:46 MSK
Очень хочется при работе с матрицами использовать выражения типа A = B*C*D...*X; при выполнение данной операции появляются структуры в которых содержиться промежуточный результат. Т.е. на n операндов, n-1 кусков мусора. Хочется сделать стек, куда будут занесены все n кусков, при операции = верхний элемент будет удален из стека, а остальные будут уничтожены. |
Evkisiy
|
опубликован 18-01-2002 14:48 MSK
кстати, Valery я так и не понял (прости убогова) как ты предлагаешь инициализировать Count? В том виде в котором ты предложил компилятор вообще ругается на недобустимый синтаксис |
Flex Ferrum
|
опубликован 18-01-2002 14:54 MSK
Промежуточные результаты жевут не дольше времени вычисления всего выражения. Так что мусор будет копиться недолго. Это первое. Второе - стек тебе не поможет. По той простой причине, что последовательность действий не обязательно будет A * B * C * ... * X. Может быть, например, A * B + C * D. Как поступишь в этом случае. Кстати, насколько я помню из курса линейки, Операции сложения и умножения матриц имеют одинаковый приоритет (но я могу ошибаться). Могу предложить тебе другой вариант. Создать класс (не-матрицу), который будет хранить промежуточный результат (наподобие ведущего указателя). Расход памяти в этом случае должен снизиться. Но, ИМХО, это тоже не полное решение проблемы. |
Evkisiy
|
опубликован 18-01-2002 14:58 MSK
Для этого мне и нужен статический стек, тогда при операции *,+,- или еще чего я буду класть указатели на мусор в один и тот же стек, и чистить его только после выполнения оператора =. |
Flex Ferrum
|
опубликован 18-01-2002 15:04 MSK
А теперь представь себе многопоточную программу на многопроцессорной архитектуре. Один поток выполняет умножение, а другой - присваивание. Что в итоге получится? Несколько дней мучительного поиска ошибки в вычислениях :)) |
Flex Ferrum
|
опубликован 18-01-2002 15:09 MSK
Кстати, избежать множественного копирования данных (при вычислении выражения) можно путем передачи ссылок в соответсвующие операции. А коприрования результатов вычислений (внутри одной операции) тебе все равно не избежать. Другой вопрос, как ты будешь хранить промежуточные результаты этих вычислений. |
Valery
|
опубликован 18-01-2002 15:23 MSK
Ой, как надолго я отвлекся. По порядку - Джефа Элджера в электронном виде не знаю, есть ли где. Сам предпочитаю книги (глаза жалко :). Второе - исходник, сударь, исходник.... (с) чье-то Третье, у кого же я видел, по поводу умножения матриц очень дельную мысль - результать умножения матрицы на матрицу вводится некий тип который лишь хранит ссылки на перемножаемые матрицы, а вот оператор присвоения для матрицы перегружен, если присваиваем этот новый тип, то вот тут и происходит реальное умножение. Идея ясна? Вроде у Страуструпа видел. Или еще у кого... Старый становлюсь, не помню. Если надо будет, скажи постараюсь найти. |
Evkisiy
|
опубликован 18-01-2002 15:31 MSK
Эта феня явно не будет крутиться на многопроцессорной машине, ну да дело даже не в этом. Мне просто нужно достучаться до статических членов класса, когда встанет проблемма потери данных - тогда она и будет решаться :). |
Evkisiy
|
опубликован 18-01-2002 15:37 MSK
Valery, на счет копирайта не особо понял :( если нужны исходники - пошлю на мыло, просто смысла особого не вижу. А с тем что ты предлагаешь, реально не получиться, по причинам правил матричного умножения, алгоритм для перемножения n матриц разной размерности не последовательно (без промежуточных вычислений) придумать нельзя :(. |
Valery
|
опубликован 18-01-2002 15:45 MSK
посмотрел еще раз это обсуждение, как это у тебя не проходит инициализация? хоть конечно борланд и лажается с шаблонами(сам из-за этого с него ушел), но не до такой же степени! Поиграйся с опциями у компилятора, там есть относящиеся к шаблонам. Да, кстати, ты в курсе, надеюсь, что инициализацию статических членов также необходимо в хайдере писать? это я так - просто спросил. в курсе конечно. |
Valery
|
опубликован 18-01-2002 15:48 MSK
копирайт я к фразе в своем сообщении поставил, уж очень созвучно с "бумагу, сударь, бумагу...", а это не моё. :) вообщем поищу я тот пример с умножениями матриц, сейчас не буду спорить. |
Evkisiy
|
опубликован 18-01-2002 16:03 MSK
Блин, на счет опций компилятора что то есть, но пока не очень понятное, все равно спс, ща попробую покопаться. |
Valery
|
опубликован 18-01-2002 17:36 MSK
прищел домой, покопался, нашел. почитай у Страуструпа в "Язык программирования С++" (у меня третье издание) главу 22.4.7 Временные массивы, копирование и циклы. Не буду утверждать, что абсолютно то же самое, там про M*V1+V2, но близко по теме.
|
Flex Ferrum
|
опубликован 18-01-2002 17:59 MSK
И еще... В догонку... Промежуточные вычисления и так сохраняются на стеке. Процессора :))). И удаляются, когда будет выполнено присваивание... Таковы правила и стандарты. А то, что ты не совсем корректно работаешь с памятью из кучи - это уже твои проблемы. И наличием стека ты их не решишь. |
Vovochka
|
опубликован 18-01-2002 18:51 MSK
Valery: "позволю себе с Вами не согласиться, очень даже полезно бывает. А для головы-то чем же плохо? Пущай поработает" Не так давно американские ученые сделали открытие, что наибольший вред здоровью приносит думание головой. (особенно если использвать статические члены внутри класса..., хотя, иногда, это действительно бывает полезно..., несмотря на вышесказанное)
|
Valery
|
опубликован 19-01-2002 16:22 MSK
2Vovochka: жить вообще вредно - от этого умирают. |
Evkisiy
|
опубликован 20-01-2002 17:18 MSK
Мужики! все прикольно и про думание и про все остальное, я весьма благодарен за все вышесказанное, но все может кто нить скажет как мне получить доступ к статическим членам класса. Плз... |
Valery
|
опубликован 21-01-2002 09:39 MSK
1.что у тебя компилер/линкер говорит на тот _стандартный_ синтаксис инициализации статических членов данных шаблонных классов? 2.отдельно я бы все-таки взялся утверждать, что несмотря ни на что оптимизировать перемножение матриц используя отложенное умножение все-таки можно. Страуструпа почитал в части той ссылки, что я давал? Мало того с использованием этой технологии можно было бы даже попытаться "обмануть" систему приоритетов операций С++, если как утверждает Flex Ferrum приоритеты операций сложения и умножения для матриц должны быть одинаковы, я этого не знаю. Правда есть там одна заковыка, если кто-то явно использует скобки, мы этого знать не будем. Ну, да ладно, отвлекся я. |
Evkisiy
|
опубликован 21-01-2002 09:50 MSK
На странный синтаксис просто ругается об недопустимости его как такового (попробуй сам). Отложенное умножение даже если и можно сделать, то в моем случае врят-ли, у меня специфика задачи заставляет структуру матрицы описывать в виде списка и промежуточные вычисления все же придеться представлять опять-таки в виде списка. |
Valery
|
опубликован 21-01-2002 10:15 MSK
перед тем как приводить свои куски кода я обычно их пробую. компилится у меня, но я сижу на визуале 6-м. билдера у меня нет. в качестве доказательства, что я пробовал - у тебя в первой же строке ошибка, слово class пропущено, я не заметил сразу, а компилер - фигушки! :) По поводу остального я больше не спорю, зачем мне преодолевать такое сопротивление? "Что Вам угодно, - это Ваш сон, сударыня." (с) анекдот какой-то. |
Evkisiy
|
опубликован 21-01-2002 10:19 MSK
Почитал я Страуструпа, к сожалению то что он предлагает, не решает всех моих проблем (собственно поэтому и описываю сам все :( ) |
Evkisiy
|
опубликован 21-01-2002 10:20 MSK
Напиши мыло, пришлю исходники, или подцепи аську, мой UIN 16292571 |
Valery
|
опубликован 21-01-2002 10:52 MSK
Ты не поверищь, но в своем профайле я указал реальный email. Все еще верю в человечество. :) Ну, чтоб туда не лазить - v_florov@mail.ru |