Сейчас на форуме: subword, rtsgreg1989, zds, _MBK_ (+5 невидимых)

 eXeL@B —› Основной форум —› Помогите с STL. Не могу понять структуру std::string
Посл.ответ Сообщение

Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 10 декабря 2007 18:49
· Личное сообщение · #1

Кратко:
Мне нужно запустить процедуру "?TimeStampAdd@CTimeStampTable@@QAE_NABV?$basic_string@DU?$char_traits @D@std@@V?$allocator@D@2@@std@@W4INIT_REQUEST_TYPE@@@Z" из одной дллки (hфайла нет). В С++ стиле эта функция выглядит так:
[CODE=cpp]bool __thiscall CTimeStampTable::TimeStampAdd(class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> const &, enum INIT_REQUEST_TYPE)[/CODE]

Ну я скачал последний STL и запустил эту функцию передав ей переменную s типа std::string (пробовал также заводить std::basic_string< char,std::char_traits<char>,std::allocator<char> > но это тоже самое помоему). Но в результате получил ошибку в этой процедуре (TimeStampAdd()).
Начал разбираться с помощью дебаггера (асмдебаггера IDA) в том какие параметры передаю функции я и какие передает другое приложение написанное не мной.

Я передаю структуру типа (переменная s в дебагере имеет следующий вид):
S1 :
{
void * P; //сслыка на какой то участок памяти (мне непонятный =) )
char[8] c = 'a','b','c','d','e','f','g';
int Length = 8;
}

А приложение передает структуру типа:
S2 :
{
int i = 1; //число так же мне не понятное
char * c = "absdefgh";
int Length = 8;
}

То есть структуры разные! Знатоки STL объясните пожалуйста, как мне получить string такого же типа как S2???
Приложение (и библиотека) написаны на Visual Studio 6.0. Может ли быть такое что предудыщие версии STL использовали другой вид std::string?



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 10 декабря 2007 20:15
· Личное сообщение · #2

Сейчас полазил по процедуре дебагером и выяснил что ошибка происходит стопудово изза того что я передаю параметр string не в том формате!!! В процедуре происходит обращение к ('a','b','c','d') как к указателю, что и приводит естественно к ошибке.

Кто знает ответ как мне сделать стринг вида S2 или догадывается изза чего такая конитель с типами, пожалуйста отзовитесь!!!




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 10 декабря 2007 22:54 · Поправил: s0larian
· Личное сообщение · #3

shob_vas, чувак, компиль код С++ компилером и передавай reference на обычный std::string объект. Тебе нужет весь С++ run-time, на асме это не пишется. C каждой версией VC++/VS идут standard C++ libraries, в которые входит и STL.


class CTimeStampTable
{
public:
bool TimeStampAdd(const std::string &s, INIT_REQUEST_TYPE type);
};


P.S. проект надо компилить в ANSI.



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 декабря 2007 00:06
· Личное сообщение · #4

Так в том то и дело! Что запускаю из Visual С эту процедуру и передаю std::string!!! И в процедуре случается ошибка изза того что тип std::string должен быть другим! В первом посте я проблему со стрктурами описал подробно.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 11 декабря 2007 00:23 · Поправил: s0larian
· Личное сообщение · #5

проверь вот что:
- что у тебя ANSI build (а не unicode/mbcs)
- что в декларации "const &"

P.S. КСТА, что значит "скачал последний STL"?



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 декабря 2007 00:28
· Личное сообщение · #6

Ахренеть!
Классы std::string в Visual C 7.0 и в Visual C 6.0 реально отличаются!!!
Какое же это сложное занятие ковырять программы без исходников. Столько всего нового узнал за эти две недели. Странно что голова не взорвалась!

Может кто подскажет как конвертить стринги из нового формата в старый? Я даже не знаю по каким ключевым словам весьти поиск!



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 декабря 2007 00:31
· Личное сообщение · #7

const & никак не влияет на вид переменной std::string ни в 6й версии ни в 7й (ток что проверил)




Ранг: 155.4 (ветеран)
Активность: 0.140
Статус: Участник
Робо-Алкаш

Создано: 11 декабря 2007 01:18
· Личное сообщение · #8

shob_vas, дык и чем же они отличаются если не секрет?

-----
Researcher




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 11 декабря 2007 03:16
· Личное сообщение · #9

Судя по тому, что std::string используются в dll, должна так же линковаться и msvc*.dll. То есть сначала можно вызывть из неё конструктор std::string, а потом уже требуемую функцию.

overwriter пишет:
чем же они отличаются если не секрет?

Конечно не секрет, как и сорцы STL.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 11 декабря 2007 07:55 · Поправил: s0larian
· Личное сообщение · #10

shob_vas, скомпиль код тем же компилером, а иначе потратишь дикое кол-во времяни впустую. Если в проге dynamic runtime (как подсказал S_T_A_S_) то тебе надо линковать против именно этих библиотек что бы был тот же работающий heap. Новый VS тебе этого не даст сделать, кочни старый компилер и header and libs. IDE тебе не нужен.

P.S. реализации STL разные, но писаны одним и тем же человеком - PJ Plauger.



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 декабря 2007 09:52
· Личное сообщение · #11

Я уже придумал че делать. Сделаю маленькую библиотеку на Visual C 6.0 и экспортирую конструктор оттуда.


 eXeL@B —› Основной форум —› Помогите с STL. Не могу понять структуру std::string
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати