Dim внутри If, Do, Sub
Участников: 4
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Dim внутри If, Do, Sub
Про Sub я думаю всё понятно, там образуются массивы, к которым можно обращаться только внутри самой подпрограммы.
Но недавно я обнаружил интересную вещь - внутри циклов, или условий (Case,If) Dim действует как в функциях - к нему нельзя обратиться вне условия или цикла.
Но недавно я обнаружил интересную вещь - внутри циклов, или условий (Case,If) Dim действует как в функциях - к нему нельзя обратиться вне условия или цикла.
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва
Re: Dim внутри If, Do, Sub
Да, каждый блок обязан создавать собственное неименованое пространство имен. Это реализовано практически во всех языках, в том числе и С, но там на этот счет есть одна полезная фича: неймспейс создается только тогда, когда блок заключен в фигурные скобки (это относится ко всему, не только к ветвлениям и циклам). Это позволяет сэкономить пару машинных команд. В бейсике же этим процессом управлять нельзя. А жаль...
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: Dim внутри If, Do, Sub
Сомневаюсь. Сложно представить, как для этого нужно извратиться с бейсиковским синтаксисом.
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: Dim внутри If, Do, Sub
во-первых есть namespace их никто не мешает юзать.
А во-вторых посмотрите в сторону
Я сам не ковырял, но всё может быть.
А может это только для объектов.
На крайняк можно пользовать do ... loop.
А во-вторых посмотрите в сторону
vbman пишет:
...
заключить переменную в блок Scope-End Scope.
...
Я сам не ковырял, но всё может быть.
А может это только для объектов.
На крайняк можно пользовать do ... loop.
Re: Dim внутри If, Do, Sub
блок scope ... end scope, может работать не обязательно в объектах. короче в этом блоке можно определять переменные, которые уже были определены ранее. точнее говоря имена переменных.
все что находиться в блоке scope ... end scope, не затрагивает имен переменных созданных с таким же именем вне его. это что-то типа временных переменных.
с намеспаце можно работать так:
пример из мануала
использование пространства имен
using пространствоимен1, пространствоимен2, ...
короче читаем мануал. пока не могу сообразить как это перевести. вот пример с использованием пространства имен (using)
короче как я понял, к именам можно обращатся так:
Dim SomeVariable As Sample.T
если мы пишем строчку
Using Sample
то к именам можно обращаться без префиксов, вданном случае префикс, пространство имен называемое sample.
тоесть using, потключает пространства имен.
все что находиться в блоке 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
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Dim внутри If, Do, Sub
Ну короче почти как в C++.
А scope как фигурные скобочки. Которые:
1. создают вложенную область видимости.
(не временные переменные, а просто границы в которых они будут видны.).
2. переменная объявленная в этом блоке перекрывает одноимённую.
3. переменная объявленная в блоке, существует только в нём.
Короче про область видимости нужно писать ещё одну главу.
А scope как фигурные скобочки. Которые:
1. создают вложенную область видимости.
(не временные переменные, а просто границы в которых они будут видны.).
2. переменная объявленная в этом блоке перекрывает одноимённую.
3. переменная объявленная в блоке, существует только в нём.
Короче про область видимости нужно писать ещё одну главу.
Re: Dim внутри If, Do, Sub
Эрик, Электрик, я не знаю, что вы подумали, но я имел в виду невозможность отмены создания нового неймспейса в ветвлениях и циклах. Хотя признаю, что я ошибался - так же, как и в С++, новый неймспейс не создается, если ветвление записано в одну строчку:
if (a = b) then a += 1
Извиняюсь, снова попытался опорочить бейсик. И снова не удалось
if (a = b) then a += 1
Извиняюсь, снова попытался опорочить бейсик. И снова не удалось
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: Dim внутри If, Do, Sub
Если уж говорить о блоках, то в if ... end if, или в do ... loop неймспейс не создаёться.
Это называеться "область видимости".
Думаю, что в бэйсике также как в C++.
Нэймспейс это не совсем область видимости. Это подпространство имён.
Давайте попробую объяснить с областью видимости... Ха-эм, на C++ это показывать удобнее, впрочем попытаюсь и для бэйсика.
Есть глобальные переменные, это которые мы объявляем вне функций с ключвым словом shared.
Глобальная переменная будет доступна всем!
В прочем это не совсем так.
Если скажем в функции будет переменная с таким же именем, то глобальная переменная сделаеться невидимой.
Примерно такая же вещь происходит в классах.
Это как листок кальки.
берём простую бумажку и на ней рисуем.
кладём кальку, но рисунок по прежнему виден.
Мы можем нарисовать своё, по верх первого рисунка.
Но сняв кальку увидем, что первый рисунок всё такой же.
Точно так же работает блок scope ... end scope. Это как раз наложение и снятие кальки.
Все контейнеры, так же проделывают это наложение области видимости.
sub / function
класс ((включая методы)
scope .. end scope
if ... ed if
select case ... end select
do ... loop
for ... next
Кстати ещё одно замечательное свойство области видимости. Оно почему-то не очевидно.
При создании обекта, вызываеться его конструктор.
И деструктор вызываеться при его разрушении.
namespace работает совсем по другому.
По сути, заключая код в пространство имён, мы просто добавляем приставку к их названию.
Это очень похоже на семью.
namespace это фамилия.
Вы же не обращаетесь к жене / брату / сестре по фамилии + имени. Достаточно только имя.
Вы входите в семью и у вас у всех одна фамилия, это ваше именное пространство.
Но в официальных учреждениях нужно использовать имя + фамилию, чтобы не перепутать, вас с вашим тёской.
Хотя придя в какой-нибудь клуб или в дружескую компанию, мы можем отбросить официоз. Мы переходим на ты и сливаем наши пространства имён.
Так работает using.
Ладно. Я побежал кушать!
Это называеться "область видимости".
Думаю, что в бэйсике также как в 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.
Ладно. Я побежал кушать!
Re: Dim внутри If, Do, Sub
eric, молодец. умеешь правильно рассказать.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|