реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> оператор new
RRaptor
сообщение Aug 3 2006, 09:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 3-08-06
Из: Санкт-Петербург
Пользователь №: 19 279



При разработке программы для 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, но хотелось бы понять что к чему.
Go to the top of the page
 
+Quote Post
PrSt
сообщение Aug 3 2006, 09:57
Сообщение #2


http://uschema.com
****

Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394



Цитата(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)

Сообщение отредактировал PrSt - Aug 3 2006, 09:59


--------------------
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 3 2006, 10:13
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(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, но хотелось бы понять что к чему.

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
upc2
сообщение Aug 3 2006, 11:06
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063



Думаю, что оператор выделения динамической памяти просто не поддерживается компилятором.
Go to the top of the page
 
+Quote Post
Harbour
сообщение Aug 3 2006, 11:50
Сообщение #5


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



f() abort должна быть обьявлена как extern "C", так как замангленная она будет иметь другое имя - что-то типа _Z5aborti и линкер конечно ее не найдет. Если в этом причина, то это говорит о низком качестве toolchain'а, а именно об ошибке в инклюдах. Так же она может вообще отстутвовать в libc, так как могли посчитать что в embedded приложениях она не нужна.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 3 2006, 14:14
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 3 2006, 15:46
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

Именно оно.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
RRaptor
сообщение Aug 4 2006, 06:11
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 3-08-06
Из: Санкт-Петербург
Пользователь №: 19 279



Цитата
Только прежде, чем писать, подумайте а оно (эта обертка на malloc() ) Вам надо?

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

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

к чему бы это
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 4 2006, 07:40
Сообщение #9


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(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

Сообщение отредактировал dxp - Aug 4 2006, 07:41


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
RRaptor
сообщение Aug 4 2006, 10:03
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 3-08-06
Из: Санкт-Петербург
Пользователь №: 19 279



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


Это я забыл указать здесь public, в реальном коде он конечно имеется
Go to the top of the page
 
+Quote Post
ig_z
сообщение Aug 4 2006, 11:39
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



Цитата(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 , и поэтому тербуют явного задания области видимости
Go to the top of the page
 
+Quote Post
yosephcz
сообщение Aug 6 2006, 06:19
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 30-06-04
Пользователь №: 223



Цитата(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
Go to the top of the page
 
+Quote Post
AVR
сообщение Aug 6 2006, 14:36
Сообщение #13


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Насколько безопасно использовать оператор new для однократной инициализации динамических массивов?


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 7 2006, 14:20
Сообщение #14


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

new, насколько я знаю вообще не инициализирует выделяемую память.
Если же вопрос был о безопасности выделения, то в чём же тут опасность?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01484 секунд с 7
ELECTRONIX ©2004-2016