Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Visual Basic Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
Короче... решил поюзать VB6, потому что он читает .bas и т.п. Нашел в сети какую-то portable сборку.
Решил посмотреть как себя поведет эта штука при переносе в нее vbscript.
В общем не знаю че не так, но такой вот код не пашет:

i = Split(i, ",")

For x = 0 To UBound(i)
i(x) = CLng(i(x)): MsgBox ("i = " & i(x) & " " & TypeName(i(x)))
Next


Суть в том, что преобразование типа не работает. Говорит, что тип данных String.
Это говносборка такая или я что-то не так делаю???




*** "Лучший копилятор - это мозг…" © ***

Сообщение было отредактировано: 3 май 21, 22:21
3 май 21, 22:29    [22317993]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21102
Значение в переменной i нам предлагается угадать?

Но вообще - говнокод голимый, конечно.
3 май 21, 23:22    [22318019]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
Eolt
Member

Откуда:
Сообщений: 1816
user-77,

Это не говносборка. Просто код - бред сумасшедшего.
3 май 21, 23:41    [22318033]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
Eolt
Member

Откуда:
Сообщений: 1816
Много повидал на этом форуме, но вот это

i = Split(i, ",")


просто вишенка на торте
3 май 21, 23:43    [22318036]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
Eolt,

Нормальный код. i - естественно строка, которую мы превращаем в массив через Split. Че непонятного? Я же писал, что изначально был скрипт. А на счет MsgBox - он тупо должен показать тип переменной, которая должна была стать Long, а она остается String. Какого?
4 май 21, 00:27    [22318054]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
Akina,

тоже мне спецы.. мля. лишь бы пакость сказать не по делу.
4 май 21, 00:30    [22318059]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
Eolt
Member

Откуда:
Сообщений: 1816
user-77
Eolt,

Нормальный код. i - естественно строка, которую мы превращаем в массив через Split. Че непонятного? Я же писал, что изначально был скрипт. А на счет MsgBox - он тупо должен показать тип переменной, которая должна была стать Long, а она остается String. Какого?


Если "нормальный" код почему ошибка? Повторюсь твой код - бред сумасшедшего.
4 май 21, 01:26    [22318082]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
Eolt
Member

Откуда:
Сообщений: 1816
user-77
Akina,

тоже мне спецы.. мля. лишь бы пакость сказать не по делу.


Тебя пытаются заставить думать. А не просто тупо копировать код, работу которого ты не понимаешь.
Из-за этого у тебя возникают ошибки.
4 май 21, 01:29    [22318083]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
Eolt,

Ну опять... типа я не понимаю как работает собственный скрипт, который прекрасно работал/работает сам по себе. Я лишь пытаюсь перенести его в VB. И там он не работает.

В VB6 не работает x = CLng(x)? Надо как-то иначе преобразовывать тип? Или неправильно работает TypeName(x) и он показывает неверные данные?
4 май 21, 01:41    [22318086]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
x1ca4064
Member

Откуда:
Сообщений: 1264
user-77


Суть в том, что преобразование типа не работает. Говорит, что тип данных String.
Это говносборка такая или я что-то не так делаю???


У меня есть большие сомнения, что VB поддерживает массив из элементов разного типа: попробуйте создать новый массив нужного типа, а в него уже кидайте результат конвертации строки.
4 май 21, 01:59    [22318091]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
Eolt
Member

Откуда:
Сообщений: 1816
user-77
Eolt,

Ну опять... типа я не понимаю как работает собственный скрипт, который прекрасно работал/работает сам по себе. Я лишь пытаюсь перенести его в VB. И там он не работает.


1. Кто тебе сказал, что VBScript и VB6 полностью совместим между собой на уровне переноса кода?
2. Подумай какого типа в VB6 оказалась переменная i после твоего переноса из VBScript
3. Какого типа вернула массив функция Split
4. Почему в дальнейшем операции над этим типом приводят к ошибке.


автор
В VB6 не работает x = CLng(x)? Надо как-то иначе преобразовывать тип? Или неправильно работает TypeName(x) и он показывает неверные данные?


У плохих программистов всегда виноват компилятор или операционная система. Исправляйте кривые руки.
4 май 21, 02:05    [22318092]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
user-77,

Все уже работает.. но код мне не нравится. Пришлось везде прописать CLng. Т.е. везде вообще, и при сравнениях и при записи в массив и т.д.
Вместо

For x = 0 To UBound(i)
i(x) = Clng(i(x))
Next


Т.е. когда ты проходишь весь массив, преобразуя по ходу тип данных. Т.е. вместо того, чтобы
это преобразование выполнить один раз для всего массива пришлось везде добавлять
дурацкий CLng. А там очень много таких мест. Почему так???

Может быть можно как-то преобразовать массив целиком не через цикл?
4 май 21, 02:06    [22318093]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
Eolt,

Split естественно выполняется над строкой, над чем же еще? Соответственно в массиве
оказывается тип String - может я неправильно понимаю, но по-моему так.
CLng об ошибке преобразования типа не сообщал, значит тип должен был быть
преобразован. А вот TypeName говорит, что не преобразован. И собственно далее все
работало неправильно.
Вообще по сравнению со скриптом VB просто выбесил. Мало того, что ему везде подавай
Dim вместо (перед) a = так еще и CLng весь код засрал.. фу.
Я конечно пока точно не знаю все ли там работает как надо.. но сам код стал ужасный
с этими дебильными костылями.

Блин. Может есть скриптовые языки (только не ява) у которых есть формы и которые
более удобные для переноса??? На что бы перейти. Я только из-за форм.
4 май 21, 02:24    [22318095]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
Eolt
Member

Откуда:
Сообщений: 1816
user-77
user-77,

Все уже работает.. но код мне не нравится. Пришлось везде прописать CLng. Т.е. везде вообще, и при сравнениях и при записи в массив и т.д.
Вместо

For x = 0 To UBound(i)
i(x) = Clng(i(x))
Next


Т.е. когда ты проходишь весь массив, преобразуя по ходу тип данных. Т.е. вместо того, чтобы
это преобразование выполнить один раз для всего массива пришлось везде добавлять
дурацкий CLng. А там очень много таких мест. Почему так???

Может быть можно как-то преобразовать массив целиком не через цикл?


Трындец. Ты хоть понял в чем твоя ошибка? Зачем ты лепишь CLng в коде не понимая причины происходяещего?
4 май 21, 02:27    [22318096]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
Eolt
Member

Откуда:
Сообщений: 1816
user-77
Eolt,

Соответственно в массиве
оказывается тип String - может я неправильно понимаю, но по-моему так.


Разумеется нет. Не String. Странно что ты этого не понимаешь.

Сообщение было отредактировано: 4 май 21, 02:21
4 май 21, 02:28    [22318097]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
Eolt,

Ты по делу скажи лучше.. Я вообще не программер. Показывает String, а не variant, если что.

Откуда я знаю в чем там ошибка с типом данных??? Ну может есть у VB нюанс при передаче переменных из функции в функцию? Я без понятия.

Сообщение было отредактировано: 4 май 21, 02:42
4 май 21, 02:47    [22318099]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
Eolt
Member

Откуда:
Сообщений: 1816
Мне кажется user-77 так и не поймет в чем причина его ошибки. Попробую объяснить чтобы было понятно непрограммисту.

VBScript - язык бестиповый (точнее с одним типом Variant), с автоматическим приведением типа во всех функциях.
VB6 - язык с типами (Variant тоже есть) с автоматическим и явным приведением типов в зависимости от ситуации.

Делая объявление переменной Dim i в VBScript ты просто объявляешь переменную.
В VB6 объявление Dim i равнозначно Dim i as Variant т.е. ты получаешь не String а Variant !

Из за этого будет куча проблем в последствии, когда множество функций будут валится с ошибкой несоответствия типа.
Функция хочет String, а ты пихаешь в нее Variant, из за этого ошибка. Которую ты перекрываешь операцией явного приведения типа Clng например, или Cstr и т.д.

Чтобы побороть эту ошибку не используй тип Variant. Это слишком коварный тип для новичков, который таит в себе кучу граблей в операциях автоматического приведения типа. Объявляй нужный тебе тип явно, например String или Long и будет тебе счастье.
4 май 21, 02:58    [22318101]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
Eolt,

Я вроде это как бы знаю.. но возможно не совсем.)) Я действительно объявлял как вариант.
Только делал это специально, потому что..
Dim a, b, c, d написать проще чем a As ... b As.. и т.д. А переменных там до хрена.

i - изначально был пользовательский ввод через InputBox. Поэтому там строка, а не вариант.
Т.е. было так:

Dim i: i = InputBox -> и поехали...

Затем Split -> получаем массив.
Но поскольку этот ввод это цифры, то далее мне требуется привести это к числу.
И это приведение я делал через цикл, но оно почему-то не работает. Поэтому пришлось
юзать CLng.

Возможно мне столо привести другие переменные к конкретике, но это долго, потому что
они по ходу дела меняются неоднократно. У меня не хватает фантазии их придумывать, а
тупое d1, d2, d3... и т.д. меня не устраивает.

Еще эти переменные катаются между разными функциями, где эта зараза тоже просила
Dim. Т.е. там тоже пришлось бы объявлять их с As..

Сообщение было отредактировано: 4 май 21, 03:11
4 май 21, 03:12    [22318102]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
Eolt
Member

Откуда:
Сообщений: 1816
Во всех советах по VB6 советуют не использовать Variant, это очень плохой тип для разработки программ

Избегайте использования переменных типа Variant
4 май 21, 03:27    [22318103]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
Eolt,

Ладно. Проверим. Заменю потом для одного из массивов начальный тип и посмотрим как сработает потом преобразование в цикле.
4 май 21, 04:07    [22318106]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
booby
Member

Откуда:
Сообщений: 2521
user-77, избранная вами манера общения по сути не позволяет давать вам вменяемые советы.

user-77
... типа я не понимаю как работает собственный скрипт, который прекрасно работал/работает сам по себе. Я лишь пытаюсь перенести его в VB. И там он не работает.
...

Если бы вы понимали, у вас и вопроса вашего не возникло.
Чтобы понять, что происходит, достаточно увидеть результат выполнения вот такого кода:

i = Split(i, ",")
MsgBox( Typename(i))


В VB/VBA код
i = Split(i, ",")

For x = 0 To UBound(i)
i(x) = CLng(i(x)): MsgBox ("i = " & i(x) & " " & TypeName(i(x)))
Next

такого вида бессмысленный.
Он в принципе не может достигнуть нужной вам цели.
Массив с типом элемента строка в принципе никогда не превращается в массив с элементом длинное целое.
Ни за какое количество Clng.

И вы не можете там (в VB/VBA) результат выполнения split присвоить массиву с типом элемента Variant.
Вот и всё.

Сообщение было отредактировано: 4 май 21, 16:19
4 май 21, 16:23    [22318364]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
exp98
Member

Откуда:
Сообщений: 2985
Вчитался в вопрос и всё фычеркнул наф.

Сообщение было отредактировано: 4 май 21, 18:29
4 май 21, 18:31    [22318439]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
booby,

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

А если по вашему это не бред - ответьте ПОЧЕМУ, НЕ КОНВЕРТИТ? В чем проблема то?
Мог бы и отконвертить, если бы этот VB нормальные люди писали.

А работает только вот так (через костыли):

tmp = Split(i, ";"): ReDim i(UBound(tmp)) As Long

  For x = 0 To UBound(i)
  i(x) = tmp(x)
  Next


Проблема была только в том, что мне не хотелось прибегать к дополнительным
переменным.
вчера, 23:52    [22321894]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
booby,

booby
user-77, избранная вами манера общения по сути не позволяет давать вам вменяемые советы.


Дайте совет пожалуйста! Можно ли в VB6 как-то обойти ограничение на ввод в 1024 знака?
Или это зашито намертво и никакой библиотекой вопрос с multiline textbox на много букофф
не решается?
вчера, 23:57    [22321895]     Ответить | Цитировать Сообщить модератору
 Re: И снова здрасте.))  [new]
user-77
Member

Откуда:
Сообщений: 43
booby,

Блин.. заработался, пардон перепутал копипасты. Это про другое было.

А на счет манеры общения. Что не так с моей манерой? Разве тот вариант, что я в предыдущем посте написал мне не могли подсказать? Конечно могли! Но не захотели...
Вместо этого пошел флуд на тему "какой он дебил, какой говнокод" и т.п. Так что я
полагаю, проблема не во мне, друзья.
сегодня, 00:21    [22321899]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Visual Basic Ответить