Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: оператор new
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
RRaptor
При разработке программы для LP2136 использую CrossStudio 1.4. Почему то его линкер отказывается понимать оператор new например на строку
int* i=new int[10];
он пишет
C:/Program Files/Rowley Associates Limited/CrossWorks for ARM 1.4/lib/libcpp_v4t_a_i_le.a(new.o)(.text+0x4c): In function `operator new(unsigned long)':: undefined reference to `abort'
хотя компилируется нормально и на delete линкер не ругается. Можно конечно обойтись и без new, но хотелось бы понять что к чему.
PrSt
Цитата(RRaptor @ Aug 3 2006, 12:28) *
При разработке программы для LP2136 использую CrossStudio 1.4. Почему то его линкер отказывается понимать оператор new например на строку
int* i=new int[10];
он пишет
C:/Program Files/Rowley Associates Limited/CrossWorks for ARM 1.4/lib/libcpp_v4t_a_i_le.a(new.o)(.text+0x4c): In function `operator new(unsigned long)':: undefined reference to `abort'
хотя компилируется нормально и на delete линкер не ругается. Можно конечно обойтись и без new, но хотелось бы понять что к чему.


если мне не изменяет память то new это относится к c++

ИМХО: что само под собой уже подрузумевает его тяжесть да и
маловероятно, что его вообще нормально портировати под ARM

более того ругаль идет на несовместимость int и operator new(unsigned long)
dxp
Цитата(RRaptor @ Aug 3 2006, 16:28) *
При разработке программы для LP2136 использую CrossStudio 1.4. Почему то его линкер отказывается понимать оператор new например на строку
int* i=new int[10];
он пишет
C:/Program Files/Rowley Associates Limited/CrossWorks for ARM 1.4/lib/libcpp_v4t_a_i_le.a(new.o)(.text+0x4c): In function `operator new(unsigned long)':: undefined reference to `abort'
хотя компилируется нормально и на delete линкер не ругается. Можно конечно обойтись и без new, но хотелось бы понять что к чему.

Не находит в библиотеке указанную функцию. Может, библиотеку какую-нито забыли подключить?
upc2
Думаю, что оператор выделения динамической памяти просто не поддерживается компилятором.
Harbour
f() abort должна быть обьявлена как extern "C", так как замангленная она будет иметь другое имя - что-то типа _Z5aborti и линкер конечно ее не найдет. Если в этом причина, то это говорит о низком качестве toolchain'а, а именно об ошибке в инклюдах. Так же она может вообще отстутвовать в libc, так как могли посчитать что в embedded приложениях она не нужна.
Сергей Борщ
Цитата(dxp @ Aug 3 2006, 13:13) *
Цитата(RRaptor @ Aug 3 2006, 16:28) *

При разработке программы для LP2136 использую CrossStudio 1.4. Почему то его линкер отказывается понимать оператор new например на строку
int* i=new int[10];
он пишет
C:/Program Files/Rowley Associates Limited/CrossWorks for ARM 1.4/lib/libcpp_v4t_a_i_le.a(new.o)(.text+0x4c): In function `operator new(unsigned long)':: undefined reference to `abort'
хотя компилируется нормально и на delete линкер не ругается. Можно конечно обойтись и без new, но хотелось бы понять что к чему.

Не находит в библиотеке указанную функцию. Может, библиотеку какую-нито забыли подключить?

Скорее требуется написать самописную функцию обработки ошибки выделения памати с именем abort.
zltigo
Цитата(Сергей Борщ @ Aug 3 2006, 17:14) *
Скорее требуется написать самописную функцию обработки ошибки выделения памати с именем abort.

Именно оно.

То RRaptor
Только прежде, чем писать, подумайте а оно (эта обертка на malloc() ) Вам надо?
Для раздумий, можете почитать топик:
http://electronix.ru/forum/index.php?showt...6000&hl=new
Или, припасть к первоисточнику.
RRaptor
Цитата
Только прежде, чем писать, подумайте а оно (эта обертка на malloc() ) Вам надо?

Дак в том то и дело, что не надо. Написал класс дя управления 16 буферами (что то типа 2 очередей) в котором перегрузил new и delete для работы со статической памятью (без new) а он гад отказался компилироваться так как память для буферов вылялась динамически. Я то сначала думал что это он на мой перегруженный new ругается, а оказалось в нем этого new вообще никакого нет. Я этот класс уже перекроил на работу без выделения памяти. Кстати, еще один прикол в компиляторе. При наследовании почему то надо явно указывать функции из базового класса. Например:
Код
class A
{
void Funk1(void){}
};

class B: public A
{
void  Funk2(void)
{
   Funk1();// не работает
   A::Funk1(); // работает
}
}

к чему бы это
dxp
Цитата(RRaptor @ Aug 4 2006, 13:11) *
Код
class A
{
void Funk1(void){}
};

class B: public A
{
void  Funk2(void)
{
   Funk1();// не работает
   A::Funk1(); // работает
}
}

к чему бы это

В этом коде функция A::Funk1 является закрытой и не может быть доступна никому, кроме экземпляров класса А. Поэтому на

A::Funk1(); // работает

компилятор должен выдать ошибку, дескать, A::Funk1 inaccessible. Чтобы был доступ, надо эту функцию объявить в секции public либо protected. Вроде так, если ничего на забыл. smile.gif
RRaptor
Цитата(dxp @ Aug 4 2006, 11:40) *
В этом коде функция A::Funk1 является закрытой и не может быть доступна никому, кроме экземпляров класса А. Поэтому на
A::Funk1(); // работает
компилятор должен выдать ошибку, дескать, A::Funk1 inaccessible. Чтобы был доступ, надо эту функцию объявить в секции public либо protected. Вроде так, если ничего на забыл. smile.gif


Это я забыл указать здесь public, в реальном коде он конечно имеется
ig_z
Цитата(RRaptor @ Aug 4 2006, 09:11) *
Код
class A
{
void Funk1(void){}
};

class B: public A
{
void  Funk2(void)
{
   Funk1();// не работает
   A::Funk1(); // работает
}
}

к чему бы это


В иаре с паблик обе строки работают, без паблик обе строки дают
Error[Pe265]: function "A::Funk1" is inaccessible ... main.c 58
Error[Pe265]: function "A::Funk1" is inaccessible ... main.c 59

Попробую предположить, что ровлики считают обявление "class B: public A" частным вариантом множественного наследования biggrin.gif , и поэтому тербуют явного задания области видимости
yosephcz
Цитата(RRaptor @ Aug 3 2006, 13:28) *
При разработке программы для LP2136 использую CrossStudio 1.4. Почему то его линкер отказывается понимать оператор new например на строку
int* i=new int[10];
он пишет
C:/Program Files/Rowley Associates Limited/CrossWorks for ARM 1.4/lib/libcpp_v4t_a_i_le.a(new.o)(.text+0x4c): In function `operator new(unsigned long)':: undefined reference to `abort'
хотя компилируется нормально и на delete линкер не ругается. Можно конечно обойтись и без new, но хотелось бы понять что к чему.




ето вам нужно для Rowley Crossworks 1.4:

void * operator new(size_t sz_) throw()
{
return (void *)malloc(sz_);
}



YOSEPHCZ
AVR
Насколько безопасно использовать оператор new для однократной инициализации динамических массивов?
IgorKossak
Цитата(AVR @ Aug 6 2006, 17:36) *
Насколько безопасно использовать оператор new для однократной инициализации динамических массивов?

new, насколько я знаю вообще не инициализирует выделяемую память.
Если же вопрос был о безопасности выделения, то в чём же тут опасность?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.