WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  омогите плз!!!

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   омогите плз!!!
Evkisiy опубликован 17-01-2002 15:12 MSK   Click Here to See the Profile for Evkisiy   Click Here to Email Evkisiy  
Пишу на пятом билдере. Описал класс:
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     Click Here to See the Profile for Valery  Click Here to Email Valery     
проинициализировать нужно статический член твоего класса, вот так:

template<class T>
int Matrix<T>::count = 0;

Flex Ferrum опубликован 17-01-2002 16:41 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Я бы не рискнул в шаблонных классах объявлять статические члены. Могут возникнуть сложности с их определением.
Vovochka опубликован 17-01-2002 16:45 MSK     Click Here to See the Profile for Vovochka  Click Here to Email Vovochka     
Flex Ferrum прав. Добалю, что пользовать статические члены внутри класса без должного обоснования, очень вредно для головы.
Valery опубликован 17-01-2002 19:54 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
позволю себе с Вами не согласиться, очень даже полезно бывает. А для головы-то чем же плохо? Пущай поработает.
Evkisiy опубликован 18-01-2002 11:39 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
Дело в том, что мне нужно реализовать стек внутри класса, если можно это сделать подругому - подскажите плз.
Flex Ferrum опубликован 18-01-2002 11:46 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Поясни идею. И еще, зачем тебе стек, зашаренный между всеми объектами класса?
Evkisiy опубликован 18-01-2002 11:53 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
После переопределения опрератора *, появляется мусор в памяти, идея такая, помещать в стек все элементы извлекать из стека все элементы на которые есть ссылка, остальное удалять.
Flex Ferrum опубликован 18-01-2002 00:19 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Мммм... А как ты переопределил этот оператор (в смысле, приведи кусок кода). Может, проблема решается другим образом... И почему именно стек?
Valery опубликован 18-01-2002 00:44 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Тю, батенька, да Вы на сборщик мусора замахнулись! :) Рекомендую почитать Джефа Элджера, очень хорошо это у него изложено. А по поводу потерь памяти, это который * перегружен умножение или разыменование?
может лучше его код привести, вместе и подумаем, может там чего не так?
Evkisiy опубликован 18-01-2002 14:26 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
* в смысле умножение, если описать деструктор руками, то он убивает и то что нужно и то, что не нужно :(. Вот поэтому и приходиться что то придумывать
Evkisiy опубликован 18-01-2002 14:29 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
кстати, Valery ссылочку на книгу не кинете?
Flex Ferrum опубликован 18-01-2002 14:31 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Evkisiy:
Ты, всетаки, код приведи. А то на пальцах мы еще долго объясняться будем...
Evkisiy опубликован 18-01-2002 14:33 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
К сожалению код привести тяжеловато, много его :(. А если кусок то какой? У меня проблема именно получить доступ к статическим членам класса
Flex Ferrum опубликован 18-01-2002 14:40 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Тады хоть идею расскажи. Мне, честно говоря, не совсем понятно, зачем для операции умножения матриц необходимы статические члены. Или ты результат не знаешь как вернуть?
Evkisiy опубликован 18-01-2002 14:46 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
Очень хочется при работе с матрицами использовать выражения типа
A = B*C*D...*X;
при выполнение данной операции появляются структуры в которых содержиться промежуточный результат. Т.е. на n операндов, n-1 кусков мусора. Хочется сделать стек, куда будут занесены все n кусков, при операции = верхний элемент будет удален из стека, а остальные будут уничтожены.
Evkisiy опубликован 18-01-2002 14:48 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
кстати, Valery я так и не понял (прости убогова) как ты предлагаешь инициализировать Count? В том виде в котором ты предложил компилятор вообще ругается на недобустимый синтаксис
Flex Ferrum опубликован 18-01-2002 14:54 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Промежуточные результаты жевут не дольше времени вычисления всего выражения. Так что мусор будет копиться недолго. Это первое. Второе - стек тебе не поможет. По той простой причине, что последовательность действий не обязательно будет A * B * C * ... * X. Может быть, например, A * B + C * D. Как поступишь в этом случае. Кстати, насколько я помню из курса линейки, Операции сложения и умножения матриц имеют одинаковый приоритет (но я могу ошибаться).
Могу предложить тебе другой вариант. Создать класс (не-матрицу), который будет хранить промежуточный результат (наподобие ведущего указателя). Расход памяти в этом случае должен снизиться. Но, ИМХО, это тоже не полное решение проблемы.
Evkisiy опубликован 18-01-2002 14:58 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
Для этого мне и нужен статический стек, тогда при операции *,+,- или еще чего я буду класть указатели на мусор в один и тот же стек, и чистить его только после выполнения оператора =.
Flex Ferrum опубликован 18-01-2002 15:04 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
А теперь представь себе многопоточную программу на многопроцессорной архитектуре. Один поток выполняет умножение, а другой - присваивание. Что в итоге получится? Несколько дней мучительного поиска ошибки в вычислениях :))
Flex Ferrum опубликован 18-01-2002 15:09 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Кстати, избежать множественного копирования данных (при вычислении выражения) можно путем передачи ссылок в соответсвующие операции. А коприрования результатов вычислений (внутри одной операции) тебе все равно не избежать. Другой вопрос, как ты будешь хранить промежуточные результаты этих вычислений.
Valery опубликован 18-01-2002 15:23 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Ой, как надолго я отвлекся.
По порядку - Джефа Элджера в электронном виде не знаю, есть ли где. Сам предпочитаю книги (глаза жалко :).
Второе - исходник, сударь, исходник.... (с) чье-то
Третье, у кого же я видел, по поводу умножения матриц очень дельную мысль - результать умножения матрицы на матрицу вводится некий тип который лишь хранит ссылки на перемножаемые матрицы, а вот оператор присвоения для матрицы перегружен, если присваиваем этот новый тип, то вот тут и происходит реальное умножение. Идея ясна?
Вроде у Страуструпа видел.
Или еще у кого... Старый становлюсь, не помню. Если надо будет, скажи постараюсь найти.
Evkisiy опубликован 18-01-2002 15:31 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
Эта феня явно не будет крутиться на многопроцессорной машине, ну да дело даже не в этом. Мне просто нужно достучаться до статических членов класса, когда встанет проблемма потери данных - тогда она и будет решаться :).
Evkisiy опубликован 18-01-2002 15:37 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
Valery, на счет копирайта не особо понял :( если нужны исходники - пошлю на мыло, просто смысла особого не вижу. А с тем что ты предлагаешь, реально не получиться, по причинам правил матричного умножения, алгоритм для перемножения n матриц разной размерности не последовательно (без промежуточных вычислений) придумать нельзя :(.
Valery опубликован 18-01-2002 15:45 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
посмотрел еще раз это обсуждение, как это у тебя не проходит инициализация?
хоть конечно борланд и лажается с шаблонами(сам из-за этого с него ушел), но не до такой же степени!
Поиграйся с опциями у компилятора, там есть относящиеся к шаблонам.
Да, кстати, ты в курсе, надеюсь, что инициализацию статических членов также необходимо в хайдере писать? это я так - просто спросил. в курсе конечно.
Valery опубликован 18-01-2002 15:48 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
копирайт я к фразе в своем сообщении поставил, уж очень созвучно с "бумагу, сударь, бумагу...", а это не моё. :)
вообщем поищу я тот пример с умножениями матриц, сейчас не буду спорить.
Evkisiy опубликован 18-01-2002 16:03 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
Блин, на счет опций компилятора что то есть, но пока не очень понятное, все равно спс, ща попробую покопаться.
Valery опубликован 18-01-2002 17:36 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
прищел домой, покопался, нашел. почитай у Страуструпа в "Язык программирования С++" (у меня третье издание) главу 22.4.7 Временные массивы, копирование и циклы.
Не буду утверждать, что абсолютно то же самое, там про M*V1+V2, но близко по теме.
Flex Ferrum опубликован 18-01-2002 17:59 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
И еще... В догонку... Промежуточные вычисления и так сохраняются на стеке. Процессора :))). И удаляются, когда будет выполнено присваивание... Таковы правила и стандарты. А то, что ты не совсем корректно работаешь с памятью из кучи - это уже твои проблемы. И наличием стека ты их не решишь.
Vovochka опубликован 18-01-2002 18:51 MSK     Click Here to See the Profile for Vovochka  Click Here to Email Vovochka     
Valery: "позволю себе с Вами не согласиться, очень даже полезно бывает. А для головы-то чем же плохо? Пущай поработает"
Не так давно американские ученые сделали открытие, что наибольший вред здоровью приносит думание головой. (особенно если использвать статические члены внутри класса..., хотя, иногда, это действительно бывает полезно..., несмотря на вышесказанное)
Valery опубликован 19-01-2002 16:22 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
2Vovochka:
жить вообще вредно - от этого умирают.
Evkisiy опубликован 20-01-2002 17:18 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
Мужики! все прикольно и про думание и про все остальное, я весьма благодарен за все вышесказанное, но все может кто нить скажет как мне получить доступ к статическим членам класса. Плз...
Valery опубликован 21-01-2002 09:39 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
1.что у тебя компилер/линкер говорит на тот _стандартный_ синтаксис инициализации статических членов данных шаблонных классов?
2.отдельно я бы все-таки взялся утверждать, что несмотря ни на что оптимизировать перемножение матриц используя отложенное умножение все-таки можно. Страуструпа почитал в части той ссылки, что я давал? Мало того с использованием этой технологии можно было бы даже попытаться "обмануть" систему приоритетов операций С++, если как утверждает Flex Ferrum приоритеты операций сложения и умножения для матриц должны быть одинаковы, я этого не знаю. Правда есть там одна заковыка, если кто-то явно использует скобки, мы этого знать не будем. Ну, да ладно, отвлекся я.
Evkisiy опубликован 21-01-2002 09:50 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
На странный синтаксис просто ругается об недопустимости его как такового (попробуй сам). Отложенное умножение даже если и можно сделать, то в моем случае врят-ли, у меня специфика задачи заставляет структуру матрицы описывать в виде списка и промежуточные вычисления все же придеться представлять опять-таки в виде списка.
Valery опубликован 21-01-2002 10:15 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
перед тем как приводить свои куски кода я обычно их пробую. компилится у меня, но я сижу на визуале 6-м. билдера у меня нет.
в качестве доказательства, что я пробовал - у тебя в первой же строке ошибка, слово class пропущено, я не заметил сразу, а компилер - фигушки! :)
По поводу остального я больше не спорю, зачем мне преодолевать такое сопротивление?
"Что Вам угодно, - это Ваш сон, сударыня." (с) анекдот какой-то.
Evkisiy опубликован 21-01-2002 10:19 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
Почитал я Страуструпа, к сожалению то что он предлагает, не решает всех моих проблем (собственно поэтому и описываю сам все :( )
Evkisiy опубликован 21-01-2002 10:20 MSK     Click Here to See the Profile for Evkisiy  Click Here to Email Evkisiy     
Напиши мыло, пришлю исходники, или подцепи аську, мой UIN 16292571
Valery опубликован 21-01-2002 10:52 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Ты не поверищь, но в своем профайле я указал реальный email. Все еще верю в человечество. :)
Ну, чтоб туда не лазить - v_florov@mail.ru

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.