Russian Qt Forum
Ноябрь 23, 2024, 21:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: STL в QT конфликтует с STL в Borland  (Прочитано 4929 раз)
nvrrus
Гость
« : Март 29, 2011, 14:50 »

Здравствуйте, уважаемые форумчане!

std::vector, созданный в qt передается по указателю в функцию библиотеки, собранной в Borland Builder. Там в него добавляется элемент, при добавлении ошибка: Segmentation Fault.

Подскажите, пожалуйста, как быть?
Записан
Akon
Гость
« Ответ #1 : Март 29, 2011, 14:54 »

STL специфицирована в плане интерфейсов, а не реализации. Другими словами, на бинарном уровне std::vector может быть представлен совершенно по-разному.

Используй C-array.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Март 29, 2011, 14:56 »

В Qt нет STL.
И, да, STL не переносим между компиллерами.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
nvrrus
Гость
« Ответ #3 : Март 29, 2011, 15:14 »

Спасибо!

А есть ли смысл с одной стороны (Borland) и с другой (Qt) использовать один и тот же набор Stl, например Stlport?

Пробую этот вариант - три конфликта. Одинаковые функции в Borland и Qt  (InterlockedDecrement, InterlockedExchange, InterlockedIncrement) с разными параметрами.

Есть смысл разрешать конфликт? И как это лучше сделать?
Записан
Akon
Гость
« Ответ #4 : Март 29, 2011, 15:34 »

Если приложение и библиотека собраны разными компиляторами (даже одним компилятором но разных версий), то они в общем случае несовместимы.

Используй только C-экспорт из библиотек, например, вместо вектора передавай массив и его размер (vector.begin(), vector.size()). Если библиотека уже написана на Borland С++, то на нем же напиши враппер с C-экспортом, а исключения (например, std::runtime_error) преобразуй в коды ошибок.
Записан
nvrrus
Гость
« Ответ #5 : Март 31, 2011, 09:44 »

Спасибо!

А есть ли способы все-таки использовать stl?

Дело в том, что очень много работы было проделано по созданию интерфейса работы с запросами и предполагалось в использование stl. Сейчас отказываться от него - переписывать все библиотеки. Тем самым убивать все задумки эффективного и удобного использования библиотек.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Март 31, 2011, 09:50 »

Ни от чего отказываться не нужно. Внутри используй stl сколько душе угодно, но во внешнем интерфейсе все должно быть без stl. Как пример:
Было
Код
C++ (Qt)
class SomeClass {
public:
 void someFunction (const std::string& data) {
   data_ = data;
 }
private:
 std::string data_;
}
 
Будет
Код
C++ (Qt)
class SomeClass {
public:
 void someFunction (char* data, size_t dataSize) {
   data_.assign (data, dataSize);
 }
private:
 std::string data_;
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Akon
Гость
« Ответ #7 : Март 31, 2011, 10:29 »

Цитировать
Ни от чего отказываться не нужно. Внутри используй stl сколько душе угодно, но во внешнем интерфейсе все должно быть без stl

Во внешнем интерфейсе все должно быть без C++, только С!

Если есть исходный код библиотеки и он не завязан на специфике Borland (специфичные расширения компилятора, VCL, и т.п.), то его лучше перекомпилировать компилятором, которым будет компилироваться приложение (и скомпилирована Qt). Если библитеку перекомпилировать нельзя, то нужно писать C-врапперы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.135 секунд. Запросов: 22.