Russian Qt Forum

Программирование => С/C++ => Тема начата: nvrrus от Март 29, 2011, 14:50



Название: STL в QT конфликтует с STL в Borland
Отправлено: nvrrus от Март 29, 2011, 14:50
Здравствуйте, уважаемые форумчане!

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

Подскажите, пожалуйста, как быть?


Название: Re: STL в QT конфликтует с STL в Borland
Отправлено: Akon от Март 29, 2011, 14:54
STL специфицирована в плане интерфейсов, а не реализации. Другими словами, на бинарном уровне std::vector может быть представлен совершенно по-разному.

Используй C-array.


Название: Re: STL в QT конфликтует с STL в Borland
Отправлено: Пантер от Март 29, 2011, 14:56
В Qt нет STL.
И, да, STL не переносим между компиллерами.


Название: Re: STL в QT конфликтует с STL в Borland
Отправлено: nvrrus от Март 29, 2011, 15:14
Спасибо!

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

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

Есть смысл разрешать конфликт? И как это лучше сделать?


Название: Re: STL в QT конфликтует с STL в Borland
Отправлено: Akon от Март 29, 2011, 15:34
Если приложение и библиотека собраны разными компиляторами (даже одним компилятором но разных версий), то они в общем случае несовместимы.

Используй только C-экспорт из библиотек, например, вместо вектора передавай массив и его размер (vector.begin(), vector.size()). Если библиотека уже написана на Borland С++, то на нем же напиши враппер с C-экспортом, а исключения (например, std::runtime_error) преобразуй в коды ошибок.


Название: Re: STL в QT конфликтует с STL в Borland
Отправлено: nvrrus от Март 31, 2011, 09:44
Спасибо!

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

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


Название: Re: STL в QT конфликтует с STL в Borland
Отправлено: Пантер от Март 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_;
}
 


Название: Re: STL в QT конфликтует с STL в Borland
Отправлено: Akon от Март 31, 2011, 10:29
Цитировать
Ни от чего отказываться не нужно. Внутри используй stl сколько душе угодно, но во внешнем интерфейсе все должно быть без stl

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

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