Аватар для dioxidin
132 / 99 / 11
Регистрация: 21.11.2007
Сообщений: 544

Инициализация указателей

13.12.2007, 21:35. Показов 3580. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема: Объявил указатель TMatrix *M в секции private: класса, напр., MyClass, а инициализировал их в функции, объявленной в секции public: того же класса. В результате выполнения кода
C++
1
M = new TMatrix(3,1);
внутри моей функции проинициализированная матрица М работает как локальная переменная, и вне этой функции выдает нулевые значения. Однако если я инициализирую эту матрицу в конструкторе класса, то матрица работает как надо.

Пришлось переопределять конструктор класса, чтобы туда можно было передавать параметром размеры матрицы.

PS: Это не есть большая проблема, но хотелось бы получить разъяснения от более опытных людей...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.12.2007, 21:35
Ответы с готовыми решениями:

Инициализация указателей
Добрый вечер, объясните пожалуйста, что значит присвоение начальных значений указателям, как...

Инициализация массива указателей в классе
Доброго времени суток. Столкнулся с проблемой, не могу инициализировать массив указателей в классе:...

Задание размера и инициализация массива указателей в конструкторе
1) h: SDL_Texture *textures; Как задать размер и инициализировать в конструкторе? Если пишу...

9
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
14.12.2007, 10:06
а можно продемонстрировать кодами все это, а то не осилил...
0
 Аватар для dioxidin
132 / 99 / 11
Регистрация: 21.11.2007
Сообщений: 544
15.12.2007, 18:05  [ТС]
Header:
C++
1
2
3
4
5
6
7
8
9
10
class MyClass
{
...
private:
TMatrix *M;
...
public:
MyClass(...; int R; int C);
bool SetMatr(TMatrix *Mat);
}
CPP
C++
1
2
3
4
5
6
MyClass::MyClass(...; int R; int C)
{
...
    M = new TMatrix(R,C);
...
}
Это работает нормально...

C++
1
2
3
4
5
6
bool MyClass::SetMatr(TMatrix *Mat)
{
delete M;
M = new TMatrix(Mat->GetRowCount(),Mat->GetColCount());    
...
}
неправильно...
Оператор delete можно опустить... Смысл в том, что внутри функции SetMatr(...) проинициализированная матрица М (объявленная глобально в классе) валидна, но за ее пределы она передается с нулевыми значениями.
Вот так...
PS: в синтаксисе я мог и напутать, т.к. исходники на работе
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
16.12.2007, 10:41
чтобы матрица была видна в любом методе класса, ее создание должно находится в конструкторе класса...
а для второго метода я бы сделал так:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
TMatrix* MyClass::SetMatr(int R, int C)
{
return new TMatrix(R,C);    
...
M = new TMatrix(Mat->GetRowCount(),Mat->GetColCount());    
...
}
MyClass::MyClass(...; int R; int C)
{
...
    M = SetMatr(R, C);
...
}
0
 Аватар для dioxidin
132 / 99 / 11
Регистрация: 21.11.2007
Сообщений: 544
21.12.2007, 22:16  [ТС]
Не понял я чето...
Инициализация матрицы M с параметрами, которые не переданы (в заголовке функции теперь же нет матрицы Мat). К тому же эта инициализация идет после оператора return (он же завершит выполнение функции)
Еще я не понимаю что таким образом будет результатом функции? Матрица проинициализируется и будет передана пустой?

Через эту функцию с использованием критических секций я планировал перезаписывать элементы разделяемой между потоками матрицы...
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
23.12.2007, 12:59
Цитата Сообщение от dioxidin Посмотреть сообщение
Не понял я чето...
Инициализация матрицы M с параметрами, которые не переданы (в заголовке функции теперь же нет матрицы Мat). К тому же эта инициализация идет после оператора return (он же завершит выполнение функции)
Еще я не понимаю что таким образом будет результатом функции? Матрица проинициализируется и будет передана пустой?

Через эту функцию с использованием критических секций я планировал перезаписывать элементы разделяемой между потоками матрицы...
ты с билдером и с++ давно дружишь? результатом функции будет созданная матрица, ее необязательно передавать по ссылке, можно и создать и вернуть в виде выходного параметра... а твоего вопроса про return я просто не осилил, потому что в этом операторе ты и указываешь, что вернется... матрица создается и передается в конструктор с заданными размерами, понятное дело, что она будет пустой, потому что в нее еще данные залить надо... но она станет видна другим методам класса
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
23.12.2007, 13:02
а еще твой код:
Code
1
2
3
4
5
6
bool MyClass::SetMatr(TMatrix *Mat)
{
delete M;
M = new TMatrix(Mat->GetRowCount(),Mat->GetColCount());    
...
}
он не работает, потому что ты внутри метода порождаешь объект, и поэтому его не видит класс, потому что объект локален...
Code
1
2
3
4
5
6
bool MyClass::SetMatr(TMatrix *Mat, int R, int C)
{
 
Mat = new TMatrix(R,C);    
...
}
это передача по ссылке, раз мой код тебя так смущает...
0
 Аватар для dioxidin
132 / 99 / 11
Регистрация: 21.11.2007
Сообщений: 544
25.12.2007, 21:05  [ТС]
Про return... Меня смущает то, что он в начале функции стоит. После него ведь больше ничего не выполнится... Он завершит выполнение функции, и какой тогда смысл был оставлять что-либо после него?

Твоя,WooDooMan666, "перепись" лишила функцию заложенного в нее смысла.. У меня было два потока, и оба могут и читать и писать в общую матрицу. В функции этой я хотел реализовать работу с критической секцией, но все слишком запутал с этими задумками...
Получилось, что сама матрица внутри содержит КС, а потом еще снаружи одна... к тому же и сама КС эта использовалась для доступа к другим объектам...
В общем я пока отложил создание многопоточной проги... Вот в основных алгоритмах ошибки исправлю и буду пробовать мультитрид... Может потом и в Линух попрусь с немытыми лапами... Мне бы тока удобочитаемый самомучитель найти по програмированию в Линухах (им. в виду работу с ядром, а не гламур какой с Qt или WxWidgets; не в них проблема)
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
26.12.2007, 09:37
просто твоя задумка про мультипоточность в такой задаче лишена смысла, потому что я слабо представляю смысл многопоточной записи в одну матрицу... хотя у каждого своя голова на плечах, я когда-то точно также изголялся с многопоточным калькулятором ггггг.... да и критические секции надо использовать осторожнее, они же притормаживают работу проги...
0
 Аватар для dioxidin
132 / 99 / 11
Регистрация: 21.11.2007
Сообщений: 544
17.01.2008, 10:43  [ТС]
Все правильно... Все картины я просто изложить не смог, пока сам был в процессе...
Вот концепция... Три потока:
1) первый - назовем InThread - формирует входной вектор (данные для обработки)
2) второй - CffThread - формирует и накладывает помеху
3) третий - KalmThread - реализует фильтр Калмана и выдает данные в InThread
Смысл в том, что Фильтр Калмана требует больших вычислительных затрат, и два других потока должны быть в слипе пока он не обсчитает все. Передача данных само собой должна производиться либо через критические секции, либо с использованием методики "Synchronize".
В общем говоря, InThread сделал вектор и записал его в CffThread (при этом должен спросить сначала "отпустило" ли этот поток с момента передачи предыдущей порции), а тот формирует данные с помехой, и спрашивает KalmThread проглотил ли он предыдущую порцию хавки. KalmThread жует все что ему дали, а в конце отправляет данные в InThread или сигналит ему, чтоб забрал с него (пока не заберут не писать в выходной буфер ничего - но врядли он окажется быстрее InThread'а).
В общем алгоритм такой вот сложный для обеспечения некоей универсальности и гибкости. Нужен он для моделирования работы цифровых фильтров. Если кто занимается тем же, милости просим пообщаться...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.01.2008, 10:43
Помогаю со студенческими работами здесь

Инициализация массива указателей на указатель
Помогите инициализировать данное объявление: int **m6;

Инициализация указателей
Здравствуйте! Возник вопрос только что. Я в принципе догатываеюсь, но для проверки решил...

Инициализация указателей
Объявите указатели на следующие объекты: unsigned, char, double, int - проинициализируйте их, ...

Инициализация массива указателей на функцию
При попытке инициализировать массив указателей на функцию возникает ошибка, не могу разобраться в...

Инициализация массива указателей на указатели
Всем привет. Есть такой код: char **pchAr = new char*; //в цикле по i pchAr = new char; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru