Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для dioxidin
132 / 99 / 11
Регистрация: 21.11.2007
Сообщений: 544

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

13.12.2007, 21:35. Показов 3576. Ответов 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
Ответ Создать тему
Новые блоги и статьи
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru