Паскалевские строки в C/C++

Тема в разделе "LANGS.C", создана пользователем sivsoft, 23 янв 2012.

  1. sivsoft

    sivsoft New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2008
    Сообщения:
    82
    std::string - всегда наивно считал оберткой вокруг С-шных строк - рад что был не прав. :) Можно писать на них.
    1. Бока есть какие хитрые с ними?

    2. И не маловажный вопрос - библиотека для работы с DBF есть какая-нить или придется ручками писать?
     
  2. sivsoft

    sivsoft New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2008
    Сообщения:
    82
    Без CRT не хочет линковаться, а CRT в придачу очень не хочу - требует:
    Код (Text):
    1. unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ)
    2. unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ)
    3. unresolved external symbol _memcpy_s
    4. unresolved external symbol _memmove_s
    5. unresolved external symbol "public: virtual char const * __thiscall std::exception::what(void)const " (?what@exception@std@@UBEPBDXZ)
    6. unresolved external symbol "public: virtual __thiscall std::exception::~exception(void)" (??1exception@std@@UAE@XZ)
    7. unresolved external symbol "public: __thiscall std::exception::exception(char const * const &)" (??0exception@std@@QAE@ABQBD@Z)
    8. unresolved external symbol "public: __thiscall std::exception::exception(class std::exception const &)" (??0exception@std@@QAE@ABV01@@Z)
    9. unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
    Xran Xlen memcpy_s memmove_s надо я так понимаю писать свои - может у кого готовые есть?
    exception - не знаю что ему нужно
    vftable - тоже не понятно
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    sivsoft
    C++ - это обертка вокруг C.

    MFC, .NET

    Пишите без C. На ассемблере. А лучше - сразу в хекс-кодах. Клерк вам тут подскажет что к чему. Только пока что не уверен, какой у него сейчас ник.
     
  4. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    _DEN_
    А разве у вас не вызывают эти CRT и прочие костыли блевотные спазмы ?

    Клерку чистый код нравится. Асм это наше всё :)
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Booster
    Какие пределы и эксепшены, если граница выделенной (доступной для чтения) памяти всегда кратна 4-м байтам?! Поэтому достаточно проверить только выравненность исходного указателя, и если он не кратен 4-м, то проверить начало побайтово, а затем перейти на дворды.
    PS: Соотв-но, если при копировании строки оба указателя src и dest выравнены на 4, то можно сразу копировать строку двордами, определяя ее конец "по ходу дела"
     
  6. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    leo
    действительно
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    leo
    Согласен, спасибо.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    kejcerfcrv
    Эмоции у меня вызывает не код, а выписка моего банковского счета. И чем меньшими усилиями досигается одна и та же сумма, тем больше у меня эмоций. А холивар CRT vs ТолькоМолодостьТолькоАссемблер - это детсадовские развлечения.
     
  9. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    sivsoft
    Длину буфера под строку всегда выравнивайте на 4 байта.
    Тогда не только копирование, но и сравнение можно произвести используя
    инструкции: MOVSD, CMPSD.

    Например, есть строка: "Шмулик".
    Её длина 7 байт (6 на текст и 1 на нулевой терминатор).
    Делаем буфер в 8 байт. Копируем 6 символов туда и далее до конца
    буфера - нули.

    Кроме того, зачем вам strlen() - если можно хранить длину строки рядом с буфером.
    Длину буфера тожно можно хранить рядом, чтобе не тратить время на её
    вычисления при копировании или сравнении.

    К примеру вот такая структура может хранить всё это:
    Код (Text):
    1. typedef struct tag_STRPAS
    2. {
    3.     UINT    m_StrLen;
    4.     UINT    m_StrBufLen;
    5.     UINT    m_StrBufMaxLen;
    6.     CHAR    m_Text [4];
    7. }
    8. STRPAS;
     
  10. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    _DEN_
    Тогда вы товарищ барыга и с вами нет смысла здесь общаться.
     
  11. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    AsmGuru62, в оригинале ещё счётчик ссылок есть с особым состоянием "константа". Если задача про строковые массивы с кучей одинаковых строк, память экономится существенно. Только копирование при записи самому ручками реализовывать может быть сильно лениво.

    PS А в общем и целом все операции со строками нижнего уровня можно из исходников RTL содрать, они наполовину на ассемблере, а на другую половину - довольно простые.
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    kejcerfcrv
    Не совсем. Моя цель - доехать из точки А в точку Б как можно быстрее, а не меряться, у кого выше протектор на покрышках.
     
  13. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    _DEN_
    Всё понятно, вопросов больше не имею.)
     
  14. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    А можно немного разъяснить этот момент? Допустим исходный указатель выравнен по границе 4 байт, длина строки 13 байт, разве мы не пропустим конец строки, если будем работать с двордами?
     
  15. bolt90

    bolt90 New Member

    Публикаций:
    0
    Регистрация:
    21 май 2009
    Сообщения:
    18
  16. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    Прочитал. Г-н Касперски пишет, что побайтового сравнения избежать нельзя.
     
  17. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Sholar
    Если тупить, то можно и пропустить ;) При работе с двордами юзаются преобразования, позволяющие определить есть ли в данном дворде хоть один нулевой байт или нет - если нет, то продолжаем работать двордами, если есть, то - стоп с переходом на байты. И насчет критики "хода конем" с "просвечиванием через 4 битовые маски" Каспер не прав, т.к. тут тоже все зависит от хитрости или тупости реализации этого "просвечивания". Например, стандартная реализация if (((eax+0x7EFEFEFF) ^ ~eax) & 0x81010100), используемая в strlen ntdll и msvcrt, работает достаточно шустро. Ну и ес-но, т.к. побайтового анализа в конце строки "избежать нельзя", то чем длинее строка, тем больше выигрыш от ее прохода двордами.
     
  18. Sholar

    Sholar New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2011
    Сообщения:
    189
    leo, спасибо.