amd-hoja 2 / 2 / 4 Регистрация: 24.03.2016 Сообщений: 75 |
||||||||
1 |
||||||||
31.10.2017, 16:35. Показов 2107. Ответов 5 Метки нет (Все метки)
снова при переходе с С на С++ вылазит ошибка с которой никак не разберусь
на С собирается все ОК. на С++ на второй строчке
судя по всему С++ не очень дружит с временными массивами и переменными. как обойти эту ошибку. компилятор GCC
__________________
0 |
Mirmik techpriest 634 / 213 / 57 Регистрация: 27.02.2014 Сообщений: 1,180 |
||||
31.10.2017, 16:59 |
2 |
|||
Например:
0 |
amd-hoja 2 / 2 / 4 Регистрация: 24.03.2016 Сообщений: 75 |
||||
31.10.2017, 17:19 [ТС] |
3 |
|||
пробовал подобное. все равно ошибка вылазит на iarr та же самая
кстати самое интересное что на (char *[]) ошибки нет. только на int
0 |
techpriest 634 / 213 / 57 Регистрация: 27.02.2014 Сообщений: 1,180 |
|
31.10.2017, 17:30 |
4 |
Хм… А что вообще такое ParseFlag? какая сигнатура?
0 |
TheCalligrapher Вездепух 10435 / 5704 / 1553 Регистрация: 18.10.2014 Сообщений: 14,101 |
||||
31.10.2017, 17:34 |
5 |
|||
на С++ вылазит ошибка с которой никак не разберусь В С++ вообще нет таких конструкций, как
Это исключительно С.
кстати самое интересное что на (char *[]) ошибки нет. Простой эксперимент показывает, что ошибка вылезает именно на Во-первых, приводите все диагностические сообщения. Во-вторых, почему до сих пор не приведено объявление
1 |
amd-hoja 2 / 2 / 4 Регистрация: 24.03.2016 Сообщений: 75 |
||||||||||||
01.11.2017, 09:29 [ТС] |
6 |
|||||||||||
Во-вторых, почему до сих пор не приведено объявление ParseFlags? Телепатов тут нет. в .h
в .cpp
Добавлено через 4 минуты прошел вариант с объявлением массивов заранее. я заменял только инт потому и не срабатывало.
спасибо
0 |
av_err2str makes use of C array constructs that break newer versions of G++.
See: https://ffmpeg.org/pipermail/libav-user/2013-January/003458.html
Error:
In file included from normalize_ts.cpp:37:0:
normalize_ts.cpp:217:49: error: taking address of temporary array
fprintf(stderr, "Error occurred: %sn", av_err2str(ret));
^
Makefile:725: recipe for target 'normalize_ts-normalize_ts.o' failed
make[2]: *** [normalize_ts-normalize_ts.o] Error 1
make[2]: Leaving directory '/home/ctxz/dev/composite-video-simulator'
Makefile:745: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/ctxz/dev/composite-video-simulator'
Makefile:448: recipe for target 'all' failed
make: *** [all] Error 2
G++:
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.2.0-8ubuntu3.2' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3.2)
To work this issue around, I’ve placed the following macros, as suggested by this mail from the Libav-user mailinglist, after line line 40:
#undef av_err2str #define av_err2str(errnum) av_make_error_string((char*)__builtin_alloca(AV_ERROR_MAX_STRING_SIZE), AV_ERROR_MAX_STRING_SIZE, errnum)
With av_err2str being overwritten, compilation succeeds.
|
Автор | Тема: taking address of temporary (Прочитано 11230 раз) |
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
Независимо от того, что я делаю, я всегда получаю одно и то же сообщение об ошибке. Может быть, у кого-то есть идея, что я могу изменить.
Это мой сценарий:
void SendInventoryCustom(Player* player, Creature* vendor, int guid)
{
std::vector<ItemList> vendors = GetVendorList();
ItemList myVendor;
for(int i = 0; i < vendors.size(); i++)
{
if(vendors[i].GetVendor().getGuid() == guid)
{
myVendor = ItemList(&vendors[i].GetVendor(), &vendors[i].GetVendor().items);
break;
}
}
SmsgListInventory inventory_packet(vendor->GetGUID(), player->GetSession(), &myVendor.GetVendor().items, vendors);
inventory_packet.Send(vendor, player);
}
Во время компиляции я получаю следующее сообщение об ошибке:
1266:59: error: taking address of temporary [-fpermissive]
Строка 1266 начинается с:
myVendor = ItemList(&vendors[i].GetVendor(), &vendors[i].GetVendor().items);
И это полный сценарий:
http://pastebin.com/DNnyjEeT
Я был бы очень признателен, если бы кто-то мог помочь мне с моей проблемой.
Заранее спасибо, С наилучшими пожеланиями!
5
Решение
В коде сниппер
&vendors[i].GetVendor()
Применение оператора address-of к объекту, не имеющему значения, не является обязательным в соответствии со стандартом. Некоторые компиляторы могут разрешить это с предупреждениями или переопределением компилятора, но помните, что он некорректен и его следует избегать.
Назначьте возвращаемое значение вызова функции для объекта, локального / нелокального lvalue
а затем взять адрес объекта.
Стандарт цитирования
§5.3.1 Унарные операторы, раздел 3
Результат одинарный & Оператор является указателем на свой операнд.
операнд должен быть lvalue или квалифицированным идентификатором.
4
Другие решения
Когда вы сталкиваетесь с предупреждением, вы должны понимать каждый термин (который может потребовать некоторых исследований).
В C ++ временным является безымянный объект, который появляется при вычислении выражения, например:
int a = 5 + 3 * 6;
Эквивалентно:
int a = operator+(5, operator*(3, 6));
Результат operator*(3, 6)
временный тип int
Это означает, что компилятор переписывает код в нечто вроде:
int __1 = 3 * 6;
int a = 5 + __1;
Это может случиться во многих ситуациях, например:
int foo();
int a = 5 + foo(); // converted to `int __foo = foo(); int a = 5 + __foo;`
Итак, теперь перейдем к предупреждению, в чем проблема с принимая адрес временного ?
Проблема в том, что язык только гарантирует, что временные доживут до конца полного выражения (в основном, до ;
). Поэтому, взяв его адрес (или создав ссылку на него), вы получаете свисающий указательуказатель, который указывает на пустоту.
Таким образом, вы можете формально взять адрес, но вы никогда не должны пытаться получить доступ к его значению впоследствии …
Прагматически, компилятору разрешено (и gcc ввел его в 4.7) для повторного использования памяти, занятой временными объектами, из одного выражения в другое, поскольку они никогда не сосуществуют. Если вы используете ранее «захваченный» адрес для временного, вы можете случайно перезаписать другой объект!
Рассматривать:
void foo(int* a, int b) { std::cout << (*a + b) << "n"; }
int* i = &(5 + 3);
foo(i, 7 + 6);
Это Можно быть переведены на:
int __1 = 5 + 3;
int* i = &__1;
__1 = 7 + 6;
foo(i, __1); // equivalent to `foo(&__1, __1);`
6