Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
21 / 55 / 9
Регистрация: 29.09.2011
Сообщений: 617

Taking address of temporary [-fpermissive]

15.09.2017, 23:28. Показов 3784. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Чем заменить
C++
1
2
cv::Mat **img = new cv::Mat*[numberOfelements];
if((img[i] = &cv::imread(enumToString(i), 1)) == 0)
, чтобы избежать ошибки?

Функция cv::imread(..) возвращает значание Mat.
C++
1
Mat imread(const string& filename, int flags=1 )
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.09.2017, 23:28
Ответы с готовыми решениями:

Taking address of temporary
Я что - то с этим error: taking address of temporary совсем запутался. Это что, новая фитча С++14? Почему можно IplImage img =...

Ошибка: taking address of temporary array
снова при переходе с С на С++ вылазит ошибка с которой никак не разберусь dss->flag=ParseFlags(xcur, ptr, 0,...

Предупреждение: returning address of local variable or temporary
Есть код программы для кодирования в base64 и обратно, не самый лучший код, но все же. И вот выскакивает два предупреждения на 2 return в...

12
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
16.09.2017, 00:01
Лучший ответ Сообщение было отмечено _20_ как решение

Решение

C++
1
2
3
cv::Mat **img = new cv::Mat*[numberOfelements];
cv::Mat* pMat = new cv::Mat(cv::imread(enumToString(i), 1));
if((img[i] = pMat) == 0)
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
16.09.2017, 00:15
Цитата Сообщение от _20_ Посмотреть сообщение
Чем заменить
Какой-то бессмысленный код.
Если img[i] - это адрес, то в данном выражении он никогда не может быть null, т.к. imread возвращает объект по значению, а значит проверка не имеет смысла, даже если бы адрес временного объекта можно было взять.

Добавлено через 1 минуту
И в #2 проверка также не имеет смысла, т.к. new будет бросать исключение, в случае неудачи, а не возвращать nullptr.
Чего сделать-то надо?

Добавлено через 9 минут
Т.к. не известно зачем там понадобился указатель, и автор не хочет отвечать, пока предложу такой вариант:
C++
1
2
cv::Mat * img = new cv::Mat[numberOfelements];
img[i] = cv::imread(enumToString(i), 1);
учитывая то, что imread работает со значением, не понятно зачем вообще нужна эта лишняя косвенность в первоначальном коде и потенциальные грабли с временем жизни.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,178
16.09.2017, 00:19
Цитата Сообщение от _20_ Посмотреть сообщение
Чем заменить
Ответ на вопрос о том, чем это заменить, фундаментально зависит от требуемого времени жизни указуемого объекта. А это известно только вам.
1
21 / 55 / 9
Регистрация: 29.09.2011
Сообщений: 617
16.09.2017, 01:12  [ТС]
DrOffset,
Спасибо Вам за пояснения про сравнение, но вопрос был не про это. Меня интересует, как действовать, если функция возвращает объект, который я хочу сохранить. Казалось бы взять адрес да и сохранить в массиве, ан, нет не получается. Вот про это вопрос.

nd2 предложил через оператор new. Но, по моему, это прокатит, если определён конструктор Mat(Mat) (могу ошибаться). А что делать, если нет?

DrOffset, Ваш вариант хорош, если объекты небольшие или скорость не требуется. Одномерные массивы должны быть непрерывны в памяти, и при добавлении следующего элемента места может нехватить и начнётся перенос всех элементов на новое место, что не есть хорошо. Поэтому я использовал массив указателей.
Могли бы Вы объяснить "работает со значанием" - что Вы имели в виду?

TheCalligrapher, Объект должен пережить данную функцию и помереть только с моего разрешения.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
16.09.2017, 01:38
Цитата Сообщение от _20_ Посмотреть сообщение
А что делать, если нет?
Что значит нет? Конструктор копирования для этого объекта запрещен? Ну тогда ты особо ничего с ним не сделаешь, т.к. если ты хочешь неограниченно "продлить" ему время жизни, то его придется скопировать в память с динамическим размещением.

Цитата Сообщение от _20_ Посмотреть сообщение
Ваш вариант хорош, если объекты небольшие или скорость не требуется. Одномерные массивы должны быть непрерывны в памяти, и при добавлении следующего элемента места может нехватить и начнётся перенос всех элементов на новое место, что не есть хорошо.
Опять эти разговоры про мифическую скорость. Ну да ладно.
О какой нехватке места идет речь? Ты собираешься в этом случае вручную перераспределять память под элементы? Выделять новый массив указателей, копировать туда указатели из старого массива, а старый массив удалять? Не проще ли список тогда использовать?

Цитата Сообщение от _20_ Посмотреть сообщение
Меня интересует, как действовать, если функция возвращает объект, который я хочу сохранить. Казалось бы взять адрес да и сохранить в массиве, ан, нет не получается.
Компилятор тебе бъет по рукам, за то, что пытаешься взять адрес временного объекта, который помрет в конце выражения. Этот адрес, даже если бы его можно было взять, бесполезен, т.к. будет указывать на мертвый объект в следующей строчке.
Продлить жизнь временного объекта (но только до конца области видимости) можно, если использовать ссылку:
C++
1
cv::Mat const & tmpRef = cv::imread(enumToString(i), 1);
Но не зная задачу, трудно сказать подойдет это или нет.

Если же хочется найти какое-то шаблонное решение "на все времена", то это мимо. Надо думать головой в каждой конкретной ситуации. Нет серебряных пуль. А если бы были, то профессия программиста давно выродилась бы, т.к. подверглась бы тотальной автоматизации.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
16.09.2017, 01:56
Цитата Сообщение от _20_ Посмотреть сообщение
если определён конструктор Mat(Mat) (могу ошибаться). А что делать, если нет?
Для cv::Mat определён: http://docs.opencv.org/2.4/mod... ml#mat-mat
1
21 / 55 / 9
Регистрация: 29.09.2011
Сообщений: 617
16.09.2017, 01:58  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
О какой нехватке места идет речь?
Ну вот например, нашёла программа свободную область памяти размером в 500 Мб. Загрузила первый элемент, второй, третий... а их оказывается 101 по 5Мб каждый. И полсле сотого элемента памяти не хватит и придётся всё перемещть на свободный участок. Лучше уже пусть элементы находятся в памяти где придётся, а в массиве будут ссылки на них.

Цитата Сообщение от DrOffset Посмотреть сообщение
Компилятор тебе бъет по рукам
Компилятор, конечно, молодец, но мне - то как быть, если объект ещё нужен? Видимо придётся так: создать пустой объект оператором new прировнять его результату функции, (или скопировать, как nd2 показал), а потом забрать ссылку в массив. Велосипедом попахивает, но видимо это единственный вариант.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
16.09.2017, 02:09
Цитата Сообщение от _20_ Посмотреть сообщение
Загрузила первый элемент, второй, третий... а их оказывается 101 по 5Мб каждый.
Здесь подойдет список.

Цитата Сообщение от _20_ Посмотреть сообщение
но мне - то как быть, если объект ещё нужен?
Нормальная ситуация скопировать результат, который вернула функция. Никакой это не велосипед.
В чем проблема?
Если функция всегда должна давать такой объект, временем жизни которого ты сам хочешь полностью управлять, то это изначально должен быть динамический объект. Вывод: в этом случае нужно изменить функцию.

Цитата Сообщение от _20_ Посмотреть сообщение
Видимо придётся так: создать пустой объект оператором new прировнять его результату функции, (или скопировать, как nd2 показал), а потом забрать ссылку в массив. Велосипедом попахивает, но видимо это единственный вариант.
Если что-то кажется неестественным, значит надо менять подход к задаче, а не пытаться натягивать сову на глобус
1
21 / 55 / 9
Регистрация: 29.09.2011
Сообщений: 617
16.09.2017, 02:33  [ТС]
nd2, Определён. Я там ещё доискался функции .empty(), чтоб с нулём не сравнивать. Вопрос более на будущее. Но ответ в принципе уже дан.

DrOffset, Зачем же список? Почему Вам таблица указателей так не нравится?
Доступа к функции нет, а другой подход к копированию переменных я не вижу. Но задача уже решена, большое спасибо всем отписавшимся.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
16.09.2017, 03:19
Цитата Сообщение от _20_ Посмотреть сообщение
Я там ещё доискался функции .empty(), чтоб с нулём не сравнивать.
Так сравнение с 0, в твоём коде, это не про то, про что empty():
Цитата Сообщение от DrOffset Посмотреть сообщение
И в #2 проверка также не имеет смысла, т.к. new будет бросать исключение, в случае неудачи, а не возвращать nullptr.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
16.09.2017, 11:37
Цитата Сообщение от _20_ Посмотреть сообщение
Зачем же список? Почему Вам таблица указателей так не нравится?
Ты же сам написал:
Цитата Сообщение от _20_ Посмотреть сообщение
Загрузила первый элемент, второй, третий... а их оказывается 101 по 5Мб каждый. И полсле сотого элемента памяти не хватит и придётся всё перемещть на свободный участок.
Тоже самое будет и с массивом указателей, как только в нем кончится память под доступные адреса. Придется выделять новый массив и перемещать туда адреса из старого. Я же писал об этом выше. Естественно, могут быть другие требования, которые будут играть против списка, например потребность в быстром доступе по индексу. Но ты их не озвучивал, как и задачу в целом, так что предложение было основано на той информации, которую ты дал, а не на том, что мне что-то нравится или не нравится
1
21 / 55 / 9
Регистрация: 29.09.2011
Сообщений: 617
16.09.2017, 15:20  [ТС]
DrOffset,

Большое спасибо за ответ. Думаю, что перенос 100 адресов - это перенос 200 (или 400) байт, более, чем терпимо для моей задачи. Так, что я пока останусь при массивах, но если мне понадобиться вдруг бОльшая скорость создания массива, то я непременно воспользуюсь Вашим советом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.09.2017, 15:20
Помогаю со студенческими работами здесь

[ошибка] taking address of temporary [-fpermissive]
Доброго времени суток. Работал с DirectX3D и C++, возникла ошибка: D:\game\GR3D engine\v.0.1\engine\xObjMesh.h(230) Error: taking address...

Access violation at address in module. Read of address при скачивании файла
Код программы: unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,...

access violation at address 40009720 in module 'rtl60.bpl'. read of address
Где может быть проблема?String alphabet1=Edit1->Text,command,way,answer=""; char *alpha1=alphabet1.c_str(); int...

Ошибка access violation at address in module borlndmm.dll write of address
Всем здравствуйте. Не могу побороть ошибку "access violation at address in module borlndmm.dll write of address ". Попробую объяснить....

Access violation at address . in module 'DFWEDIT.DLL'. Read at address
все было нормально, был открыт делфи, потом не знаю чем спровоцировано, но началась какая то хрень: не снималось выделение с текста, с...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru