|
|
  |
оператор new |
|
|
|
Aug 3 2006, 09:28
|
Участник

Группа: Участник
Сообщений: 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, но хотелось бы понять что к чему.
|
|
|
|
|
Aug 3 2006, 09:57
|

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
--------------------
|
|
|
|
|
Aug 3 2006, 14:14
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Aug 3 2006, 15:46
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 4 2006, 06:11
|
Участник

Группа: Участник
Сообщений: 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(); // работает } } к чему бы это
|
|
|
|
|
Aug 4 2006, 07:40
|

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. Вроде так, если ничего на забыл.
Сообщение отредактировал dxp - Aug 4 2006, 07:41
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Aug 4 2006, 10:03
|
Участник

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

|
Цитата(dxp @ Aug 4 2006, 11:40)  В этом коде функция A::Funk1 является закрытой и не может быть доступна никому, кроме экземпляров класса А. Поэтому на A::Funk1(); // работает компилятор должен выдать ошибку, дескать, A::Funk1 inaccessible. Чтобы был доступ, надо эту функцию объявить в секции public либо protected. Вроде так, если ничего на забыл.  Это я забыл указать здесь public, в реальном коде он конечно имеется
|
|
|
|
|
Aug 4 2006, 11:39
|
Местный
  
Группа: Свой
Сообщений: 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" частным вариантом множественного наследования  , и поэтому тербуют явного задания области видимости
|
|
|
|
|
Aug 6 2006, 06:19
|
Участник

Группа: Свой
Сообщений: 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
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|