Dim внутри If, Do, Sub

Предыдущая тема Следующая тема Перейти вниз

Dim внутри If, Do, Sub

Сообщение  Gena в Сб Авг 22, 2009 8:13 pm

Про Sub я думаю всё понятно, там образуются массивы, к которым можно обращаться только внутри самой подпрограммы.
Но недавно я обнаружил интересную вещь - внутри циклов, или условий (Case,If) Dim действует как в функциях - к нему нельзя обратиться вне условия или цикла.

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  DiG. GeRR в Сб Авг 22, 2009 8:23 pm

Да, каждый блок обязан создавать собственное неименованое пространство имен. Это реализовано практически во всех языках, в том числе и С, но там на этот счет есть одна полезная фича: неймспейс создается только тогда, когда блок заключен в фигурные скобки (это относится ко всему, не только к ветвлениям и циклам). Это позволяет сэкономить пару машинных команд. В бейсике же этим процессом управлять нельзя. А жаль...

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  Eric-S в Сб Авг 22, 2009 9:01 pm

Вроде бы можно.
Что-то такое на форумуе уже мелькало.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  DiG. GeRR в Сб Авг 22, 2009 9:06 pm

Сомневаюсь. Сложно представить, как для этого нужно извратиться с бейсиковским синтаксисом.

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  Eric-S в Сб Авг 22, 2009 9:18 pm

во-первых есть namespace их никто не мешает юзать.
А во-вторых посмотрите в сторону
vbman пишет:
...
заключить переменную в блок Scope-End Scope.
...

Я сам не ковырял, но всё может быть.
А может это только для объектов.

На крайняк можно пользовать do ... loop.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  Eric-S в Сб Авг 22, 2009 9:21 pm

А эту тему нужно перенести в "общие вопросы", но никак не в onlinebook.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  electrik в Вс Авг 23, 2009 2:11 am

блок scope ... end scope, может работать не обязательно в объектах. короче в этом блоке можно определять переменные, которые уже были определены ранее. точнее говоря имена переменных.
все что находиться в блоке scope ... end scope, не затрагивает имен переменных созданных с таким же именем вне его. это что-то типа временных переменных.

с намеспаце можно работать так:
пример из мануала

Код:

Namespace Forms
    Type Point '' A 2D point
        As Integer x
        As Integer y
    End Type
    '' Since we are inside of the namespace, Point resolves to Forms.Point.
    Sub AdjustPoint( ByRef pt As Point, ByVal newx As Integer, ByVal newy As Integer )
        pt.x = newx
        pt.y = newy
    End Sub
End Namespace

Type Point '' A 3D point
    As Integer x
    As Integer y
    As Integer z
End Type

Sub AdjustPoint( ByRef pt As Point, ByVal newx As Integer, ByVal newy As Integer, ByVal newz As Integer )
    pt.x = newx
    pt.y = newy
    pt.z = newz
End Sub

Dim pt1 As Point
AdjustPoint( pt1, 1, 1, 1 )
Dim pt2 As Forms.Point
Forms.AdjustPoint( pt2, 1, 1 )

использование пространства имен
using пространствоимен1, пространствоимен2, ...
короче читаем мануал. пока не могу сообразить как это перевести. вот пример с использованием пространства имен (using)

Код:


Namespace Sample
    Type T
        x As Integer
    End Type
End Namespace

'' Just using the name T would not find the symbol,
'' because it is inside a namespace.
Dim SomeVariable As Sample.T

'' Now the whole namespace has been inherited into
'' the global namespace.
Using Sample

'' This statement is valid now, since T exists
'' without the "Sample." prefix.
Dim OtherVariable As T

короче как я понял, к именам можно обращатся так:
Dim SomeVariable As Sample.T

если мы пишем строчку
Using Sample
то к именам можно обращаться без префиксов, вданном случае префикс, пространство имен называемое sample.
тоесть using, потключает пространства имен.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  Eric-S в Вс Авг 23, 2009 9:08 am

Ну короче почти как в C++.

А scope как фигурные скобочки. Которые:

1. создают вложенную область видимости.
(не временные переменные, а просто границы в которых они будут видны.).

2. переменная объявленная в этом блоке перекрывает одноимённую.

3. переменная объявленная в блоке, существует только в нём.

Короче про область видимости нужно писать ещё одну главу.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  DiG. GeRR в Вс Авг 23, 2009 8:12 pm

Эрик, Электрик, я не знаю, что вы подумали, но я имел в виду невозможность отмены создания нового неймспейса в ветвлениях и циклах. Хотя признаю, что я ошибался - так же, как и в С++, новый неймспейс не создается, если ветвление записано в одну строчку:

if (a = b) then a += 1

Извиняюсь, снова попытался опорочить бейсик. И снова не удалось Very Happy

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  Eric-S в Вс Авг 23, 2009 8:50 pm

Если уж говорить о блоках, то в if ... end if, или в do ... loop неймспейс не создаёться.
Это называеться "область видимости".
Думаю, что в бэйсике также как в C++.

Нэймспейс это не совсем область видимости. Это подпространство имён.


Давайте попробую объяснить с областью видимости... Ха-эм, на C++ это показывать удобнее, впрочем попытаюсь и для бэйсика.

Есть глобальные переменные, это которые мы объявляем вне функций с ключвым словом shared.
Код:

dim shared mi_var as integer

Глобальная переменная будет доступна всем!

В прочем это не совсем так.
Если скажем в функции будет переменная с таким же именем, то глобальная переменная сделаеться невидимой.

Код:

sub foot()
dim mi_var as integer
' здесь, только в этой функции обращаясь к mi_var мы получаем доступ к локальной переменной, а не глобальной.
end sub

Примерно такая же вещь происходит в классах.
Код:

type SomeClass
declare sub foot()
value as integer
end type


sub SomeClass.foot()
' здесь к свойству value мы можем доступ получить напрямую
value = 333

' или пояснив, что речь идёт именно о свойстве
this->value = 666

' если же создадим одноимённую локальную переменную, то просто
value = 555
' будем обращаться именно к локальной
' а ксвойству тольк через
this->value = 111

end sub

Это как листок кальки.
берём простую бумажку и на ней рисуем.
кладём кальку, но рисунок по прежнему виден.
Мы можем нарисовать своё, по верх первого рисунка.
Но сняв кальку увидем, что первый рисунок всё такой же.

Точно так же работает блок scope ... end scope. Это как раз наложение и снятие кальки.

Все контейнеры, так же проделывают это наложение области видимости.
sub / function
класс ((включая методы)
scope .. end scope
if ... ed if
select case ... end select
do ... loop
for ... next
Кстати ещё одно замечательное свойство области видимости. Оно почему-то не очевидно.

При создании обекта, вызываеться его конструктор.
И деструктор вызываеться при его разрушении.

Код:


dim a as integer = 15

scope
dim a as integer ' это не ошибка
dim b as integer = 8

' изменяем локальную перееменную
a = 123
print a, b ' выведет 123 8

' область видимости закрываеться и объект разрушаеться
end scope


print a ' выведет 15, это переменная осталась по прежнему

print b ' не допустимо, переменной b не существует!

namespace работает совсем по другому.
По сути, заключая код в пространство имён, мы просто добавляем приставку к их названию.

Код:

namespace a
dim b as integer = 456

' внутри пространства имён, можем к переменной обращаться о короткому имени
print a
end namespace

' мы можем обратиться к этой переменной по полному имени
print a::b

' а можем просто локально раскрыть (наложить) пространство имён
using a
print b

Это очень похоже на семью.
namespace это фамилия.
Вы же не обращаетесь к жене / брату / сестре по фамилии + имени. Достаточно только имя.
Вы входите в семью и у вас у всех одна фамилия, это ваше именное пространство.

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


Хотя придя в какой-нибудь клуб или в дружескую компанию, мы можем отбросить официоз. Мы переходим на ты и сливаем наши пространства имён.
Так работает using.

Ладно. Я побежал кушать!

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  electrik в Вс Авг 23, 2009 8:57 pm

eric, молодец. умеешь правильно рассказать.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  Eric-S в Вс Авг 23, 2009 9:13 pm

Ха-эм. Не вгоняй меня в краску.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Dim внутри If, Do, Sub

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения