Вопрос про строки

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

Вопрос про строки

Сообщение RazArt » 25.12.2008 (Чт) 19:03

У меня есть естрока вида - "Аргумент 1","Аргумент 2","Аргумент 3","Аргумент 4"
Нужно сделать функцию что бы когда ей давали эту строку и нужный номер, то она возвратила бы эти данные записанныемежду запятыми. Например так:
str="Аргумент 1","Аргумент 2","Аргумент 3","Аргумент 4"
newstr=<название функции> (str, 3)
Здесь получится что newstr будет равен "Аргумент 3", как реализовать такую функцию?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Вопрос про строки

Сообщение RayShade » 25.12.2008 (Чт) 19:46

Код: Выделить всё
Function mySplit(str As String, num As Long) As String
mySplit = Split(str, ",")(num - 1)
End Function
I don't understand. Sorry.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Вопрос про строки

Сообщение RazArt » 25.12.2008 (Чт) 19:53

Я уже решил энто, только немного другим способом
Код: Выделить всё
Private Function GetNubmerArguments(str As String, number As Integer) As String
Dim TemporaryNumber As Integer
Dim TemporaryArgument As String
TemporaryNumber = 0
For x = 1 To Len(str) - 1
If Mid(str, x, 1) = "," Then
    TemporaryNumber = TemporaryNumber + 1
        If TemporaryNumber = number Then
            GetNubmerArguments = TemporaryArgument
            Exit Function
        End If
    TemporaryArgument = ""
Else
TemporaryArgument = TemporaryArgument & Mid(str, x, 1)
End If
Next x
GetNubmerArguments = TemporaryArgument & Chr("34")
End Function

А что лучше для быстродействия ваш или мой способ?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Вопрос про строки

Сообщение RayShade » 25.12.2008 (Чт) 19:56

Я не профайлил ни то ни то конечно. Но мне мой нравится больше :) Во первых там всего 3 строчки, а во вторых я думаю что 1 split точно не медленнее чем цикл с нарезанием строки :)
I don't understand. Sorry.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Вопрос про строки

Сообщение RazArt » 25.12.2008 (Чт) 20:15

Ясен, тогда остановлюсь на моём варианте, просто я собираюсь делать игру и делаю скриптовый язык ^^

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Вопрос про строки

Сообщение Mikle » 25.12.2008 (Чт) 20:26

Логично! :D

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Вопрос про строки

Сообщение RazArt » 25.12.2008 (Чт) 20:32

Что логично, остановиться на моём варианте или делать скриптовый язык для игры?)

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Вопрос про строки

Сообщение RayShade » 26.12.2008 (Пт) 13:12

Перед тем как делать какой то там скриптовый язык, надо уж всяко научиться по нормальному разбирать строки. И под словами "по нормальному" я точно не имею в виду посимвольный перебор в цикле.
I don't understand. Sorry.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Вопрос про строки

Сообщение RazArt » 26.12.2008 (Пт) 13:42

RayShade, а чем вас не устраевает такой вариант? Я не думаю что сплит устроен по другому

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Вопрос про строки

Сообщение RayShade » 26.12.2008 (Пт) 14:01

Split наверняка устроен совершенно по другому :)
Помимо него, есть еще regexp, с помощью которого можно разобрать строку с помощью патернов. Наконец, можно самостоятельно разрезать строку, используя InStr для поиска делителей.
И это только то что я просто навскидку придумал - в гугле скорее всего есть еще десяток способов :)

А да, забыл добавить - меня приведенный вариант не устраивает тем, что он напоминает мне заворачивание ста шурупов отверткой, когда можно был бы взять шуруповерт.
I don't understand. Sorry.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Вопрос про строки

Сообщение RazArt » 26.12.2008 (Пт) 14:36

Всё равно мне кажется что в основе лежит перебор строки

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Вопрос про строки

Сообщение iGrok » 26.12.2008 (Пт) 15:07

RazArt писал(а):Всё равно мне кажется что в основе лежит перебор строки

Угу. Только гораздо более оптимизированный. Заупусти оба примера в цикле на пару тысяч итераций, и замерь затраченное время.
10к итераций:
GetNumberArguments 172 мс.
MySplit 16 мс.

Разница более чем в 10 раз. Не убедительно?
Это со строкой из 4х аргументов по 4 символа. Т.е. 20 символов.
Думается, при строке из 100 символов разница будет гораздо больше...
label:
cli
jmp label

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Вопрос про строки

Сообщение RayShade » 26.12.2008 (Пт) 18:46

А ведь результат split можно закешировать, и если строка уже 1 раз сплитилась, выдавать сразу значение массива, а не сплитить его заново :)

И кстати, циклы - это одна из самых процессороемких конструкции вообще в приницпе. А уж строковые операции в цикле - это вообще туши свет.
I don't understand. Sorry.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Вопрос про строки

Сообщение Zenitchik » 27.12.2008 (Сб) 15:35

Один леший, если язык не тривиален, нужно писать КА. А за тем, как обойтись без строк в цикле - к Хакеру :D
Знание английского языка - затрудняет понимание кода

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Вопрос про строки

Сообщение RazArt » 27.12.2008 (Сб) 16:57

Zenitchik, я не понял, что вы имели в виду? оО

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

Re: Вопрос про строки

Сообщение Хакер » 27.12.2008 (Сб) 19:18

Он имеет в виду конечный автомат.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 93

    TopList