Нуль-терменированные строки

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Нуль-терменированные строки

Сообщение arthur2 » 12.03.2010 (Пт) 13:54

В описаниях многих апи написано, что они ждут указатель на нуль-терменированую строку.

Но обычно такие АПИ принимают обычную бейсиковскую строку без вопросов и без проблем. На сколько я понимаю, это потому, что нуль в конце строки уже входит в формат строк, в котором они хранятся в бейсике.

Я прав? Или это работает лишь от случая к случаю, и нужно на всякий случай добавлять к строке нуль руками?
Артур
 
   

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Нуль-терменированные строки

Сообщение alibek » 12.03.2010 (Пт) 14:29

arthur2 писал(а):Но обычно такие АПИ принимают обычную бейсиковскую строку без вопросов и без проблем. На сколько я понимаю, это потому, что нуль в конце строки уже входит в формат строк, в котором они хранятся в бейсике.

Нет. Скорее причина в том, что API-функции достаточно умные.
Lasciate ogni speranza, voi ch'entrate.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Нуль-терменированные строки

Сообщение ANDLL » 12.03.2010 (Пт) 14:35

Да, строки в VB завершаются нуль терминатором, и строки которые передаются в API то же им завершаются
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Нуль-терменированные строки

Сообщение alibek » 12.03.2010 (Пт) 14:39

Хм... Ну значит ошибся.
Lasciate ogni speranza, voi ch'entrate.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Нуль-терменированные строки

Сообщение Денис » 12.03.2010 (Пт) 14:59

Как же так? Тут недавно чел требовал нуль-терминированную строку в бейсике и ему так никто и не сказал, что она уже такая. Кроме того, он утверждал, что в бейсике строка не нуль-терминированная. С ним никто не спорил. Вообще-то нет, спорили. Я так понял, в бейсике строка начинается с дескриптора длины и заканчивается нулем. Убивают двух зайцев одним типом данных при работе с API.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Нуль-терменированные строки

Сообщение arthur2 » 12.03.2010 (Пт) 21:11

Спасибо!
ANDLL писал(а):и строки которые передаются в API то же им завершаются
Тут могла бы быть проблема, если я передавал не саму строку, а её адрес, но раз
ANDLL писал(а):строки в VB завершаются нуль терминатором
значит проблемы таки нет :D
Артур
 
   

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Нуль-терменированные строки

Сообщение ANDLL » 12.03.2010 (Пт) 21:46

Я както на заре времен писал на эту тему
http://forum.sources.ru/index.php?showtopic=166377
(можно также найти по словам BSTR за моим авторством и на vbstreets, но без картинки)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Нуль-терменированные строки

Сообщение arthur2 » 13.03.2010 (Сб) 8:40

Спасибо, познавательно :)
Кстати, может и сюда картинку запостишь?
viewtopic.php?p=6642384#p6642384
Тем более, что она там когда-то была :D
Артур
 
   

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Нуль-терменированные строки

Сообщение 0xy » 14.03.2010 (Вс) 19:31

arthur2 писал(а):Спасибо!
ANDLL писал(а):и строки которые передаются в API то же им завершаются
Тут могла бы быть проблема, если я передавал не саму строку, а её адрес, но раз
ANDLL писал(а):строки в VB завершаются нуль терминатором
значит проблемы таки нет :D

В общем сучае, проблема есть! :twisted: Все зависит от СПОСОБА передачи адреса.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Нуль-терменированные строки

Сообщение ANDLL » 14.03.2010 (Вс) 20:57

Не зависит. Содержимое указателя от способа передачи не зависит, если конечно это не способ в стиле "заменить указатель на рандомное число"
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Нуль-терменированные строки

Сообщение 0xy » 14.03.2010 (Вс) 21:09

ANDLL
Содержимое указателя от способа передачи не зависит

Для String--очень даже зависит! ;)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Нуль-терменированные строки

Сообщение Хакер » 14.03.2010 (Вс) 21:42

Причём тут CString?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Нуль-терменированные строки

Сообщение 0xy » 14.03.2010 (Вс) 23:24

??
1) сколько байт занимает строка "12345" в VB?
2) а сколько хотят видеть внешние либы (WinAPI)?
При "передаче" через Declare...As String--все довольны, но arthur мог получить адрес строки и иным способом (VarPtr...):
arthur2 писал(а): Тут могла бы быть проблема, если я передавал не саму строку, а её адрес

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Нуль-терменированные строки

Сообщение SLIM » 15.03.2010 (Пн) 0:04

Кстати, раз уж такое обсуждение, попробую вставить слово.
В VB как и во всем COM свой тип строк - BSTR.
А вот API принимают свои строки (указатель на свои строки). В частности API принимает LP(C)(T)STR. Но так как BSTR имеет свою особую структуру, то для преобразования часто используют нужны специальные функции. Эти функции находятся в разделе Automation Functions.
В частности, для преобразования строк нужно выделять определенное количество памяти под массив символов. Длину BSTR-строки вернет SysStringLen.
Так вот, походу длина строки BSTR возвращается что называется в "чистом виде", т.е. без всех тех примочек что есть в BSTR - чисто количество символов.
Я вот вчера сидел уже поздней ночью, и получилось что чтобы выделить нормальное количество памяти под API-шную строку нужно 4 символа + 1 нулевой. Уж не помню как мне это пришло в голову, но сегодня утром я переписал кое-что без всяких выделений памяти.

В итоге, после переписывания, у меня MessageBox нормально принял указатель на BSTR и нормально с ним поработал (в C++)

Вообще, строки - это самое больное для меня место. Я в них постоянно тяжело разбираюсь. Но ясно одно - хотите понять что такое строки и как они работают - попробуйте написать для работы со строками пару функций на С++
Пишите жизнь на чистовик.....переписать не удастся.....

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Нуль-терменированные строки

Сообщение 0xy » 15.03.2010 (Пн) 0:08

ИХМО, проще глянуть в дебагере ;)

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Нуль-терменированные строки

Сообщение SLIM » 15.03.2010 (Пн) 1:43

Так а я и не к простом призывал :)
Пишите жизнь на чистовик.....переписать не удастся.....

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Нуль-терменированные строки

Сообщение arthur2 » 15.03.2010 (Пн) 6:21

0xy писал(а):но arthur мог получить адрес строки и иным способом (VarPtr...)
Адрес строки нужно получать с помощью StrPtr - она указывает начало данных строки, а не её обёртки. С VarPtr, естественно, будут проблемы :D

As String нужно передавать ANSI, а уникодные строки - as long. Посмотри статью Тёмыча о строках в бейсике :D
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Нуль-терменированные строки

Сообщение Хакер » 15.03.2010 (Пн) 14:25

1) сколько байт занимает строка "12345" в VB?
2) а сколько хотят видеть внешние либы (WinAPI)?

1) Who cares?
2) Nobody cares.

При "передаче" через Declare...As String--все довольны

Довольны только А-боригены, которых устраивает использование A-вариантов функций.

Адрес строки нужно получать с помощью StrPtr - она указывает начало данных строки, а не её обёртки. С VarPtr, естественно, будут проблемы

Напоминаю, что это одна и та же функция, по разному объявленная. Разница возникает от разницы в объявлении, влекущей разницу в кастовании: у VarPtr аргумент ByRef-ный, поэтому передаётся адрес того, что указали (а указали переменную, в которой другой адрес); у StrPtr — ByVal, поэтому передаётся само значение (адрес) переменной, которой указали.

Тов. 0xy взят под контроль антифлудового комитета.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Нуль-терменированные строки

Сообщение SLIM » 15.03.2010 (Пн) 20:35

Хакер, а что ты меня не прокомментировал?
Пишите жизнь на чистовик.....переписать не удастся.....


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 48

    TopList