Для изменения начала нумерации в массиве на 1 используется инструкция

 

venrt

Пользователь

Сообщений: 54
Регистрация: 29.03.2017

#1

21.11.2018 16:09:31

Создаю из строки через Split массив:

Код
Dim arrP() As String
P = "P20 P44 P64 P83"
arrP = Split(P)

Но мне нужно что бы элементы массива отсчитывались не от 0, а от 1.
option base — не срабатывает.
Пытаюсь переопределить командой

Код
ReDim Preserve arrP(1 To 4)

выпадает с ошибкой subscript out of range.
Если переопределить массив вначале, то после срабатывания Split , элементы опять начинаются с 0.

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

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

«Все гениальное просто, а все простое гениально!!!»

 

Казанский

Пользователь

Сообщений: 8839
Регистрация: 11.01.2013

#3

21.11.2018 16:36:34

venrt, Если именно As String() и именно через Split, то штатными средствами — никак.
Можно поставить впереди текста пробел и получить массив с нижним индексом 0, но с полезными данными, начинающимися с 1

Код
P = " P20 P44 P64 P83"
arrP = Split(P)

Можно разбить строку во временный массив и переписать в основной с нужным нижним индексом.
Можно получить массив типа Variant/String так

Код
Option Base 1
'...
Dim arrP()
arrP = Array("P20", "P44", "P64", "P83")

Или нештатными средствами — с помощью RtlMoveMemory изменить нижний индекс в структуре SAFEARRAY.

Изменено: Казанский21.11.2018 16:39:30

 

venrt

Пользователь

Сообщений: 54
Регистрация: 29.03.2017

#4

21.11.2018 16:42:52

Цитата
Nordheim написал:
Перебросьте циклом в другой массив созданный с 1. А чем помешал массив с 0 непонятно?

Дальше идет цикл по массиву с формулами и приходится прибавлять 1.
Думаю тогда уж лучше остановится на 0.

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#5

21.11.2018 20:59:37

Цитата
venrt написал:
Дальше идет цикл по массиву с формулами и приходится прибавлять 1

Вот тут не совсем понял, какое это имеет значение?

«Все гениальное просто, а все простое гениально!!!»

 

venrt

Пользователь

Сообщений: 54
Регистрация: 29.03.2017

#6

22.11.2018 08:54:32

Цитата
Nordheim написал:
Вот тут не совсем понял, какое это имеет значение?

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

Код
For i = 0 To 3
For ii = 20 To 25 Step 5
        f = (i+1) * 100 + ii
        cFileName = f & ""
        With r
            Set rr = Union(.ListColumns(Clmn1).DataBodyRange, _
            .ListColumns(arrPzmx(i)).DataBodyRange, .ListColumns(arrQzmx(i)).DataBodyRange)
        End With
...
 

БМВ

Модератор

Сообщений: 21827
Регистрация: 28.12.2016

Excel 2013, 2016

venrt,  прибавьте или отнимите  1 от переменной цикла и не ищите проблем.

По вопросам из тем форума, личку не читаю.

 

venrt

Пользователь

Сообщений: 54
Регистрация: 29.03.2017

 

mtts54

Пользователь

Сообщений: 164
Регистрация: 10.09.2015

#9

22.11.2018 09:54:48

Цитата
venrt написал:
option base — не срабатывает.

Попробуйте написать ПЕРЕД самым первым Sub.

Excel непознаваем как атом.

 

Jack Famous

Пользователь

Сообщений: 11364
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#10

22.11.2018 10:15:22

Цитата
mtts54: Попробуйте написать ПЕРЕД самым первым Sub

насколько я знаю — это не сработает, т.к. Split всегда возвращает массив с 0. Также как и создание массива из диапазона листа всегда даёт нижнюю границу 1. Указание Option Base 1 задаст нижнюю границу с единицы (а не с 0 по-умолчанию), если она не указана явно. Возьмём, например, Dim arrTemp(10,5) as String. Размер массива по-умолчанию = 11*6 = 66. Размер массива при Option Base 1 = 10*5 = 50. Я представляю себе это как-то так…

Источник
P.S.:

сам лично не тестил, т.к. нет необходимости, поэтому не ручаюсь…

Цитата
venrt: нужно что бы элементы массива отсчитывались не от 0, а от 1

а я как раз обратным занимаюсь — массивы с листа перегоняю в цикле в одномерные и с нуля. Часто это делается потому что одномерный массив с нуля очень быстро и просто можно сцепить в текстовую строку через Join.

Изменено: Jack Famous22.11.2018 10:48:25

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#11

22.11.2018 10:36:05

Цитата
Jack Famous написал:
массивы с листа перегоняю в цикле в одномерные и с нуля

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

«Все гениальное просто, а все простое гениально!!!»

 

ivanok_v2

Пользователь

Сообщений: 712
Регистрация: 19.08.2018

#12

22.11.2018 10:40:39

venrt, что бы  не морочить себе голову заведите себе правило работать через

Код
Option Base 0

и забудете с чего начинать.
хотя есть отдельные случаи, когда нужно работать с 1

Изменено: ivanok_v222.11.2018 10:40:56

 

Jack Famous

Пользователь

Сообщений: 11364
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#13

22.11.2018 10:41:56

Цитата
Nordheim: сразу в цикле сделать строковую переменную не пользуясь Join, а то чего зря цикл гонять

тогда её хранить надо, а она не факт что понадобится. А так массив я храню по-любому (а значит циклу сбора нулевого одномерного массива быть) и получить строку могу тоже в любой момент (и быстро). Вообще решил перейти на одномерные массивы с нуля для универсальности. В надстройке функции писал под них, да, вроде как, они считаются более «классическими» что-ли…
Кроме того, думаю, что «накопление» текстовой строки в цикле перебора массива будет медленнее, чем формирование одномерного с последующим Join (не тестил, но у Join просто фантастическая скорость).

Цитата
ivanok_v2: работать через Option Base 0

он же по-умолчанию стоит — и запоминать ничего не надо)) я вот так и делаю  :)

Изменено: Jack Famous22.11.2018 10:46:50

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

ivanok_v2

Пользователь

Сообщений: 712
Регистрация: 19.08.2018

#14

22.11.2018 10:50:32

Цитата
Jack Famous написал:
он же по-умолчанию стоит

повторение — мать учения.

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

Jack Famous, На самом деле не видел частого использования преобразования огромных массивов  в строку, обычно делается наоборот, строки преобразовывают в массив.

«Все гениальное просто, а все простое гениально!!!»

 

Jack Famous

Пользователь

Сообщений: 11364
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#16

22.11.2018 11:03:35

OFF

Цитата
Nordheim: преобразования огромных массивов  в строку

есть столбец «справочник номенклатур» в котором собраны уникальные значения. Есть несколько столбцов/полей «номенклатуры», в которых эти самые номенклатуры могут повторяться. Задача: проверить поля на соответствие справочнику и выделить несовпадения.

Решение:

вот для подобного я и использую текстовые строки — они избавляют от необходимости плодить циклы и тратить время.

Источник

Изменено: Jack Famous22.11.2018 11:07:56

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

БМВ

Модератор

Сообщений: 21827
Регистрация: 28.12.2016

Excel 2013, 2016

#17

22.11.2018 11:54:06

Цитата
mtts54 написал:
Попробуйте написать ПЕРЕД самым первым Sub.

а еще функции ближе к началу модуля имеют больший приоритет и выполняются быстрее. :-)

По вопросам из тем форума, личку не читаю.

 

Юрий М

Модератор

Сообщений: 60897
Регистрация: 14.09.2012

Контакты см. в профиле

#18

22.11.2018 11:54:13

Цитата
Jack Famous написал:
Вообще решил перейти на одномерные массивы с нуля для универсальности

И в чём же универсальность? )

 

ivanok_v2

Пользователь

Сообщений: 712
Регистрация: 19.08.2018

#19

22.11.2018 12:04:43

Цитата
БМВ написал:
еще функции ближе к началу модуля имеют больший приоритет и выполняются быстрее

ето шутка?

 

БМВ

Модератор

Сообщений: 21827
Регистрация: 28.12.2016

Excel 2013, 2016

Юра. Тот кошак еще только огонь добывает, а другой уже пожарил рыбу и съел.

По вопросам из тем форума, личку не читаю.

 

Казанский

Пользователь

Сообщений: 8839
Регистрация: 11.01.2013

#21

22.11.2018 12:13:59

Цитата
Jack Famous написал:
Split всегда возвращает массив с 0

Да. А вот Array может всегда возвращать массив с 0, а может учитывать Option Base!

Код
Option Base 1

Sub test()
Dim a(), b$()
  a = Array(1, 2, 3)
  Debug.Print LBound(a), UBound(a) '1 3
  a = VBA.Array(1, 2, 3)
  Debug.Print LBound(a), UBound(a) '0 2
  b = Split("a b c")
  Debug.Print LBound(a), UBound(a) '0 2
  b = VBA.Split("a b c")
  Debug.Print LBound(a), UBound(a) '0 2
End Sub

Изменено: Казанский22.11.2018 12:14:39

 

ivanok_v2

Пользователь

Сообщений: 712
Регистрация: 19.08.2018

#22

22.11.2018 12:18:40

Казанский,а в чем разница между

Код
Array(1, 2, 3)

и

Код
VBA.Array(1, 2, 3)

ето же одна и таже функция, или нет?

 

БМВ

Модератор

Сообщений: 21827
Регистрация: 28.12.2016

Excel 2013, 2016

#23

22.11.2018 12:22:41

Цитата
ivanok_v2 написал:
ето шутка?

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

По вопросам из тем форума, личку не читаю.

 

venrt

Пользователь

Сообщений: 54
Регистрация: 29.03.2017

#24

22.11.2018 12:26:01

Про

Код
Option Base

было сразу написано, что не срабатывает.

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#25

22.11.2018 12:28:41

venrt, надо помнить, что

Код
Option Base

не действует на:

Код
VBA.Array()
Split()

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


Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

ivanok_v2

Пользователь

Сообщений: 712
Регистрация: 19.08.2018

#26

22.11.2018 12:37:15

Цитата
БМВ написал:
а чего еще можно ожидать от медведя который с понедельника на курсах по электробезопасности .

ну как минимум, поход на пиво с рибкой

 

venrt

Пользователь

Сообщений: 54
Регистрация: 29.03.2017

JayBhagavan, ага, спасибо. Теперь буду знать. А Vba.Array в чем суть/отличия?

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#28

22.11.2018 12:47:27

Цитата
venrt написал: А Vba.Array в чем суть/отличия?

Всегда с нуля и не нужен Lbound().


Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

Jack Famous

Пользователь

Сообщений: 11364
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#29

22.11.2018 12:49:03

Цитата
Юрий М: И в чём же универсальность?

в основном под Join это всё и подводил  :) ну и ещё я эти одномерные массивы передаю в форму с поиском, а так как форма одна, а передавать я могу всё, что угодно, то в неё встроена функция преобразования «всего-что-угодно» в одномерный массив с нуля. Как-то столкнулся с проблемами при передаче массивов двумерных и/или с 1 в форму. С тех пор, как перешёл — не было…

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Юрий М

Модератор

Сообщений: 60897
Регистрация: 14.09.2012

Контакты см. в профиле

#30

22.11.2018 12:54:33

Джек, а если несколько столбцов? Да и с одномерным массивом при выгрузке на лист возникает необходимость транспонирования…
Так что решение «перейти на одномерные массивы для универсальности» вызывает (у меня лично) сомнения ) Ну какая может быть универсальность? Может быть что-то не так с формулировкой? :)

Ciberst, коллекцию мы применяем для определенного случая, и в этом — она вряд ли подойдет, потому как штатными средствами нельзя изменить текущий элемент коллекции.
Да и не сказал бы я, что они такие уж тупые.
Можно еще заюзать Array Of…

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Public Class Form1
    Private Declare Function GetTickCount Lib "kernel32.dll" () As Integer
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim MassStart, MassEnd, ColStart, ColEnd As Integer
 
        Dim Mass(80000) As String
 
        Dim Col As New List(Of String)
        For I As Integer = 1 To 80000
            Col.Add("QWERTY")
        Next
 
        MassStart = GetTickCount
        For I As Integer = 0 To 80000 - 1
            Mass(I) = "QWERTY"
        Next
        MassEnd = GetTickCount
        ColStart = GetTickCount
        For I As Integer = 0 To 80000 - 1
            Col(I) = "ASDFGH"
        Next
        ColEnd = GetTickCount
        MsgBox("На обработку 80000 элемента массив затратил " & MassEnd - MassStart & " мс., Коллекция: " & ColEnd - ColStart & " .мс")
    End Sub
End Class

Довольно мощная штука и с удалением-добавлением проблем нет
Нумерация правда тоже с нуля.

Топикстартеру: Как уже посоветовали, привыкай к тому, что единицей отсчета является-таки 0.
Это не только у массива, но и у листбоксов, Датагридов, таблиц в базах данных и вообще много где.

Как сделать, чтобы массив начинался не с 0, а 1 индекса?

Виталина's user avatar

Виталина

111 золотой знак2 серебряных знака8 бронзовых знаков

4

Если программируете на С++, то можно переписать действие оператора [ ], но я вам не рекомендую это делать, можете непосредственно вычитать единицу при индексации:

for (int i=1; i<N; i++){
cout<<array[i-1]<<endl; }

ответ дан 7 сен 2014 в 17:27

Svensen's user avatar

SvensenSvensen

3261 серебряный знак5 бронзовых знаков

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

Виталина's user avatar

Виталина

111 золотой знак2 серебряных знака8 бронзовых знаков

ответ дан 5 сен 2014 в 14:26

aleksandr_mai's user avatar

3

13

Dim Количество As Byte, Вес As Single

При вводе кода программы с клавиатуры среда программирования оказывает помощь пользователю – после набора ключевого слова As и пробела раскрывается список, в котором наряду с другими типами объектов указаны базовые типы переменных:

Тип переменной можно установить, щелкнув дважды по имени типа в этом списке.

Неявное объявление

В этом способе определения переменных никакие инструкции для объявления переменной вообще не используются. Когда транслятор VBA первый раз встречает в коде программы необъявленную переменную, то он назначает ей тип Variant, и переменная может принимать значение любого типа. Следовательно, в программе VBA, в принципе, можно вообще не использовать инструкцию Dim. Тем не менее использование типа Variant рекомендуется использовать только в следующих случаях:

для ускорения процесса отладки программы;

пользователь не уверен, какой тип данных обрабатывается инструкцией в конкретной ситуации.

Явное объявление переменных позволяет:

увеличить скорость решения задачи;

оптимизировать распределение памяти для переменных;

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

Для того чтобы избежать неприятностей в случае ошибочной записи имени переменной, необходимо в общей области программного модуля помещать оператор Option Explicit. В этом случае Visual Basic будет расценивать любую неявно объявленную переменную как ошибочную.

Константа по определению является постоянной величиной и поэтому не меняет своего значения при выполнении программы. Константы в VBA подразделяются на константы, определяемые пользователем, и встроенные константы. Встроенная константа должна объявляться; при этом используется оператор Const, аналогичный оператору Dim:

Const <ИмяКонстанты> [As <ТипДанных>] = <Выражение>

14

где <Выражение> – это любое значение или формула, возвращающая значение, которое должно использоваться в качестве константы.

Пример

Const ПИ As Single = 3,14

Встроенные константы используются обычно при работе с объектами приложения. Эти константы не требуют предварительного объявления. Имена встроенных констант начинаются с префикса, который указывает, к объекту какого приложения Microsoft Office они относятся. Например, встроенные константы объектов Excel имеют префикс xl, встроенные константы языка VBA имеют префикс vb и т.д. Например, встроенные константы vbYes и vbNo используются в функции MsgBox, предназначенной для вывода данных на экран.

Операторы объявления переменных и констант можно размещать в любом месте программного кода, но обязательно до первого оператора,

в котором переменная или пользовательская константа применяется. Хороший стиль программирования предполагает, что объявление переменных и констант осуществляется в начале процедуры.

2.4. Строковые переменные

Различают строки переменной и фиксированной длины. Строки переменной длины могут содержать до двух миллиардов символов; их размер заранее не определяется. Когда такой переменной присваивается значение, то размер переменной изменяется так, чтобы он соответствовал длине присвоенного строкового значения.

Строка фиксированной длины – это строка постоянного размера, указанного при объявлении переменной. Если такой строке присваивается значение более длинное, то лишние символы отбрасываются. Если значение, которое присваивается, короче, то остающееся место заполняется пробелами. Строковые переменные фиксированной длины должны объявляться явно.

Синтаксис объявления строковой переменной следующий: Dim VarName As String [* ДлинаСтроки]

где ДлинаСтроки – целочисленная переменная или константа, содержащая число, которое указывает длину строковой переменной.

Например:

Dim strMyName As String* 20

Объявляется строковая переменная фиксированной длины в 20 символов

Dim intLen As Integer Intlen = 10

Dim MyName As String * Intlen

Объявляется строковая переменная длиной в 10 символов.

15

2.5. Массивы

представляет собой структуру, все элементы которой имеют одинаковый тип. Массивы могут быть одномерными и многомерными. Так, для отображения отдельного столбца или отдельной строки таблицы, содержащей данные одинакового типа, может быть использован одномерный массив, для отображения таблицы – двумерный, а для отображения совокупности таблиц – трёхмерный массив. Количество размерностей массива может достигать 60.

В VBA массив объявляется следующим образом:

[Public | Private] Dim ИмяМассива([Индексы]) [As ТипДанных]

где

ИмяМассива – идентификатор, определяющий имя массива; Индекс – значение номера элемента в размерности массива, зада-

ваемого одним из двух способов:

1.указанием номера последнего элемента в каждой размерности массива;

2.указанием номеров первого и последнего элемента в каждой размерности массива.

Примечание

Номера элементов (индексы) должны быть указаны целым числом.

При использовании первого метода первому элементу по умолчанию присваивается номер “ноль”. Например, объявление одномерного массива Товар из трёх элементов, каждый из которых состоит не более чем из 15 символов, по умолчанию выглядит следующим образом:

Dim Товар(2) As String*15

Для обращения к элементам массива необходимо поместить в круглых скобках за идентификатором массива целочисленное выражение, например, Товар(0), Товар(К*2) – для одномерного массива и Продажи(I,L), Продажи(3,4) ) – для двумерного массива; величины I, K, L должны быть целыми.

В приведённой ниже процедуре ОбъявлениеМассива1 Sub ОбъявлениеМассива1()

Dim Товар(2) As String*15

Товар(0) = «Стул мягкий» MsgBox Товар(0)

End Sub

выражения Товар(0), Товар(1), Товар(2) являются элементами массива;

инструкция Товар(0) = «Стул мягкий» присваивает первому элементу массива Товар значение текстовой константы «Стул мягкий»;

функция MsgBox Товар(0) выводит значение этого элемента на экран:

16

Примечание

Инструкция присваивания и функция MsgBox будут подробно рассмотрены ниже.

Для изменения начала нумерации индексов массива можно поступить одним из следующих способов.

1. Использовать инструкцию Option Base 1. При этом инструкция Option Base 1 должна находиться в самом начале модуля VBA, перед первой процедурой модуля, например,

Option Base 1

Sub ОбъявлениеМассива2()

Dim Товар(3) As String * 15

Товар(1) = «Стул мягкий» MsgBox Товар(1)

End Sub

По умолчанию инструкция Option Base имеет значение 0 (ноль).

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

Sub ОбъявлениеМассива3()

Dim Товар(1 To 3) As String * 15

Товар(1) = «Стул мягкий» MsgBox Товар(1)

End Sub

При объявлении многомерного массива в поле индекса указывается несколько индексов, в соответствии с размерностью массива: номер последней строки, номер последнего столбца и номер последней таблицы – для трёхмерного массива. Например, двумерный массив из пяти строк и десяти столбцов объявляется без использования инструкции Option Base 1 одним из следующих способов:

Dim Продажи(4,9) As String

или

Dim Продажи(0 To 4,0 To 9) As String

17

Примечания

1.Наличие инструкции Option Base 1 не влияет на индексацию элементов массива, если в его объявлении используется конструкция

<нижняя граница> To <верхняя граница>

Массив Продажи можно объявить так: Dim Продажи(1 To 5, 1 To 10) As String

2.Элементы массива Продажи имеют тип строковая переменная неопределённой длины.

Выше рассмотрено объявление массивов, связанных с обработкой только статических данных, т.е. таких, память под которые выделяется во время компиляции и сохраняется в течение всей работы программы.

В VBA существует другой способ выделения памяти под массивы, который называется динамическим, в котором память под массивы отводится и может быть перераспределена во время выполнения программы. Такие массивы называются динамическими.

Использование динамических величин предоставляет возможность подключать память динамически, что позволяет:

увеличить объем обрабатываемых данных;

если потребность в каких-то данных отпала до окончания программы, то занятую ими память можно освободить для другой информации;

определять динамически изменяющееся количество реально существующих элементов массива.

Динамический массив объявляется следующим образом:

[Public | Private] Dim ИмяМассива() [As ТипДанных]

т.е. размерность динамического массива в его объявлении не указывает-

ся.

Пример

Dim Товар() As String * 15

Перед использованием динамического массива необходимо переопределить его размеры. Это выполняется при помощи инструкции ReDim, используемой на уровне процедуры:

ReDim [Preserve] ИмяМассива(Индексы) [As ТипДанных] Параметр Preserve используется для сохранения данных в сущест-

вующем массиве при изменении размерности. В противном случае все старые значения элементов массива будут удалены. Однако если новый размер массива меньше, чем количество помещенных в него элементов, часть данных будет потеряна.

Примеры

ReDim Товар(1 To 3) As String * 15

ReDim Preserve Товар(1 To 10) As String * 15

18

При использовании параметра Preserve можно изменить размер только последней размерности, а количество размерностей изменить нельзя.

Массивы типа Variant можно создавать и заполнять одновременно при помощи встроенной функции Array(<СписокЗначений>), например:

Dim Товар As Variant

Товар = Array(“Стул”, “Стол”, “Шкаф”)

Освободить память, занимаемую элементами динамического массива, и повторно инициализировать элементы массива фиксированной длины можно инструкцией Erase:

Erase СписокМассивов

Здесь СписокМассивов – один массив или список разделенных запятыми массивов. Инициализация элементов массива фиксированной длины осуществляется следующим образом:

Тип массива

Действие инструкции Erase

Фиксированный числовой массив

Устанавливает каждый элемент

в нуль

Фиксированный массив строк

Устанавливает каждый элемент

(переменной длины)

на нулевую длину строки («»)

Фиксированный массив строк

Устанавливает каждый элемент

(фиксированной длины)

в нуль

Фиксированный массив типа Variant

Устанавливает каждый элемент

в Empty

Массив данных определенных

Устанавливает каждый элемент, как

пользователем типов

будто это отдельная переменная

Массив объектов

Устанавливает каждый элемент

в величину Nothing

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

UBound (ИмяМассива [, Измерение])

Необязательный параметр Измерение имеет тип Variant или Long. Это целое число, указывающее размерность, для которой определяется верхняя граница индекса. Для первой размерности используется число 1, для второй – 2 и т.д. если аргумент не указывается, по умолчанию используется значение 1.

Пример

Dim Товар(1 To 3) As String * 15 L=UBound (Товар)

Переменная L получит значение 3.

Функция UBound обычно используется с функцией LBound для определения размера массива, позволяющей найти наименьшее значение индекса указанной размерности. Формат функции:

LBound (ИмяМассива [, Измерение])

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Содержание

  1. Важность понимания начала нумерации элементов массива
  2. Массив: определение и применение
  3. Порядковый номер и его роль в массиве
  4. Массивы: способы начала нумерации
  5. Практические примеры начала нумерации
  6. 1. Начало нумерации с 0
  7. 2. Начало нумерации с 1
  8. 3. Начало нумерации с произвольного числа
  9. Достоинства нумерации с 0
  10. Недостатки нумерации с 0
  11. Или все же нужно начинать с 1?
  12. Интересные факты о начале нумерации
  13. Вопрос-ответ
  14. С какого числа начинается нумерация элементов массива?
  15. Почему в программировании индексация элементов массива начинается с нуля?
  16. Что произойдет, если попытаться обратиться к элементу массива по индексу, который выходит за пределы диапазона?
  17. Можно ли изменить начальное значение нумерации элементов массива?
  18. С какой цифры начинается нумерация элементов массива?

Нумерация элементов массива — это важный аспект программирования. Когда мы работаем с массивами, нам часто приходится обращаться к их элементам по индексу. Но с чего же начинается нумерация элементов в массиве?

В большинстве языков программирования нумерация элементов массива начинается с нуля. Это означает, что первый элемент массива имеет индекс 0, следующий — индекс 1 и так далее. Такая нумерация имеет свои исторические причины и стала общепринятой в программировании.

Некоторые новички могут задаться вопросом, почему нумерация не начинается с единицы. Причина в том, что такое решение сэкономило много времени и памяти компьютерам ещё на ранних этапах развития программирования. Можно сказать, что это удобство для программистов и компьютеров.

Также важно отметить, что есть языки программирования, в которых нумерация элементов массива может начинаться с единицы или любого другого числа. Это зависит от дизайна языка и его создателей, поэтому всегда стоит обращать внимание на специфические особенности каждого языка.

Важность понимания начала нумерации элементов массива

Понимание начала нумерации элементов массива является фундаментальным аспектом программирования. Знание, с какого числа начинается нумерация элементов массива, позволяет эффективно и точно обращаться к конкретным элементам массива в своем коде. Это имеет решающее значение при разработке и отладке программного обеспечения.

В большинстве языков программирования нумерация элементов массива начинается с 0. Это означает, что первый элемент массива имеет индекс 0, второй элемент — индекс 1, и так далее. Такая схема нумерации называется нулевой базой индексации.

Однако, известны исключения. Некоторые языки программирования, такие как Fortran и MATLAB, используют схему нумерации, начинающуюся с 1. Некоторые другие языки, такие как Pascal, позволяют программисту выбирать, с какого числа начинать нумерацию элементов массива.

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

Кроме того, понимание начала нумерации элементов массива помогает программистам лучше понимать семантику различных операций, связанных с массивами. Например, когда вы проходите циклом по массиву, зная, что нумерация начинается с нуля, вы можете легко определить, когда достигнут последний элемент массива.

Важно учесть, что нумерация элементов массива может различаться в разных языках программирования или даже внутри одного языка программирования в зависимости от контекста. Поэтому, перед началом работы с массивами в конкретном языке программирования, всегда следует изучить правила нумерации элементов в этом языке.

Массив: определение и применение

Массив — это структура данных, представляющая собой набор элементов одного типа, размещенных в памяти компьютера последовательно друг за другом и доступных по индексам.

Определенный тип данных элементов массива может быть любым: числами, строками, объектами и т.д. Однако элементы массива должны иметь одинаковый тип данных.

Применение массивов широко распространено в программировании. Они используются для хранения и обработки большого объема данных, которые можно организовать в логически связанные группы.

Массивы предоставляют простой и эффективный способ доступа к элементам по индексу. Индексы массива начинаются с 0 и увеличиваются на 1 для каждого следующего элемента. Например, первый элемент массива имеет индекс 0, второй — 1, третий — 2 и так далее.

С помощью массивов можно решать различные задачи, такие как хранение и обработка данных, сортировка, поиск по элементам, выполнение математических операций и многое другое.

Ниже приведен пример создания и использования массива в языке программирования JavaScript:


const numbers = [1, 2, 3, 4, 5];
console.log(numbers[0]); // Выводит 1
console.log(numbers[2]); // Выводит 3
console.log(numbers.length); // Выводит 5

Данный пример создает массив чисел и выводит первый элемент, элемент с индексом 2 и длину массива.

Массивы — полезный инструмент при работе с данными. Их использование позволяет эффективно организовывать и обрабатывать информацию.

Порядковый номер и его роль в массиве

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

Наиболее распространенные варианты нумерации элементов массива в программировании следующие:

  1. Нумерация с нуля (zero-based numbering):
    В этом случае, первый элемент массива имеет порядковый номер 0, второй – 1, третий – 2 и так далее. Это означает, что количество элементов массива будет на единицу больше, чем его порядковый номер.
  2. Нумерация с единицы (one-based numbering):
    В некоторых языках программирования или в определенных ситуациях, нумерация элементов массива начинается с 1. Первый элемент имеет номер 1, второй – 2, третий – 3 и так далее.

Выбор варианта нумерации зависит от языка программирования и его стандартов, а также от предпочтений программиста. Например, в языке программирования Python используется нумерация с нуля, в то время как в Matlab нумерация элементов массива начинается с единицы.

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

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

Порядковый номер Значение элемента
0 4
1 8
2 15
3 16
4 23

В данном примере, элемент с порядковым номером 2 имеет значение 15. Нумерация элементов начинается с 0 и продолжается до 4, где 4 – это количество элементов массива.

Массивы: способы начала нумерации

В программировании существует несколько способов начала нумерации элементов массива. Рассмотрим основные из них:

  1. Нумерация с нуля

    Самым распространенным способом является начало нумерации элементов массива с нуля. Такая нумерация используется во многих языках программирования, включая C, C++, Java, JavaScript и другие.

    Пример:

    int[] arr = new int[3];
    arr[0] = 1;
    arr[1] = 2;
    arr[2] = 3;
  2. Нумерация с единицы

    Некоторые языки программирования, в основном математически ориентированные, используют нумерацию элементов массива с единицы. К таким языкам относятся, например, MATLAB и R.

    Пример:

    arr = [1, 2, 3];
  3. Другие способы

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

    Пример:

    SetLength(arr, 3, 2); // Нумерация начинается с 2

При работе с массивами важно знать, с какого числа начинается нумерация элементов, чтобы корректно обращаться к ним и избегать ошибок.

Практические примеры начала нумерации

В зависимости от языка программирования и конкретной реализации, начало нумерации элементов массива может различаться. Вот несколько практических примеров:

1. Начало нумерации с 0

Одним из самых распространенных вариантов является начало нумерации элементов массива с нуля. Этот метод применяется во многих языках программирования, таких как C, C++, Java, Python и других.

int[] array = new int[5];
// Элементы массива будут доступны по индексам от 0 до 4
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;

2. Начало нумерации с 1

Некоторые языки программирования, в особенности те, которые пришли из математического контекста, предпочитают начинать нумерацию элементов массива с единицы. Этот подход часто используется в языке MATLAB.

array = [1, 2, 3, 4, 5];
% Элементы массива будут доступны по индексам от 1 до 5

3. Начало нумерации с произвольного числа

Некоторые языки программирования предоставляют возможность выбирать начало нумерации элементов массива с любого произвольного числа. Например, в языке R можно указать начало нумерации с единицы или даже отрицательного числа.

array <- c(1, 2, 3, 4, 5)
# Элементы массива будут доступны по индексам от 1 до 5
array <- c(1, 2, 3, 4, 5)
names(array) <- c("a", "b", "c", "d", "e")
# Элементы массива будут доступны по индексам "a" до "e"

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

Достоинства нумерации с 0

  • Простота использования: Начиная нумерацию с 0 делает код более простым и понятным. Это объясняется тем, что в большинстве языков программирования индексация элементов массива начинается с 0. При использовании нумерации с 0 нет необходимости добавлять или вычитать единицу при работе с индексами массива, что упрощает код и предотвращает возможные ошибки.

  • Единообразие: Множество языков программирования, включая C, C++, Java, JavaScript и Python, используют нумерацию с 0. Использование этой нумерации позволяет писать переносимый код, который будет работать на различных платформах и языках программирования без дополнительных изменений.

  • Совместимость с математическими операциями: Начиная нумерацию с 0, можно проще проводить математические операции с индексами массива. Например, чтобы получить следующий элемент массива, можно использовать операцию инкремента, а для получения предыдущего элемента — операцию декремента.

  • Соответствие памяти: Одна из причин для выбора нумерации с 0 в языках программирования — соответствие этой нумерации адресам памяти. Индексация с 0 означает, что первый элемент массива будет располагаться по адресу памяти 0, что удобно и соответствует внутренней работе компьютерной памяти.

  • Привычность: Нумерация с 0 стала стандартным подходом в большинстве языков программирования и индустрии разработки программного обеспечения. Из-за этого разработчики и студенты, изучающие программирование, привыкают и легко работают с нумерацией, начинающейся с 0.

Недостатки нумерации с 0

1. Несогласованность с привычками людей

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

2. Ошибки в индексации

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

3. Математическая несогласованность

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

4. Отсутствие единообразия

Разные программные языки и инструменты могут использовать разную систему нумерации элементов в массивах. Некоторые языки, например, Lua или MATLAB, начинают нумерацию с единицы, в то время как большинство популярных языков, таких как C, Java, Python, начинают счет с нуля. Это может вызывать путаницу и сложности при переключении с одного языка на другой, особенно для начинающих программистов.

Или все же нужно начинать с 1?

Возможно, вы уже знакомы с тем, что в программировании, и в особенности при работе с массивами, нумерация элементов обычно начинается с 0. Но есть и другая точка зрения: а что, если начинать нумерацию с 1?

Самая распространенная система нумерации элементов массива — это нумерация, начинающаяся с 0. Это означает, что первый элемент массива будет иметь индекс 0, второй элемент — индекс 1 и так далее. Такая система нумерации имеет свою логику и широко применяется во многих языках программирования, включая C, C++, Java, JavaScript и многие другие.

Однако есть и другие языки программирования, в которых нумерация элементов массива начинается с 1. Примером может служить язык программирования Matlab. В таких случаях первый элемент массива будет иметь индекс 1, второй элемент — индекс 2 и так далее.

У обеих систем нумерации есть свои преимущества и недостатки. Начинать нумерацию с 0 имеет смысл потому, что это позволяет более естественным образом работать с указателями и адресами памяти. Кроме того, нумерация с 0 может упростить математические вычисления и способствовать более четкому пониманию кода.

С другой стороны, начинать нумерацию с 1 может быть полезно для начинающих программистов, которым будет проще понять, как работает нумерация элементов массива. Также нумерация с 1 может быть более интуитивной для пользователей, которые привыкли считать с 1, а не с 0.

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

Интересные факты о начале нумерации

Существует несколько индексационных систем, которые определяют с какого числа начинается нумерация элементов массива:

  • Натуральная индексация (начинается с 1) — довольно распространена в некоторых языках программирования, таких как Pascal и Lua. Это означает, что первый элемент массива имеет индекс 1.
  • Нулевая индексация (начинается с 0) — это самая популярная индексационная система и используется в таких языках программирования, как C, C++, Java, JavaScript и Python. В этих языках первый элемент массива имеет индекс 0.
  • Отрицательная индексация — некоторые языки программирования, такие как Python, поддерживают отрицательную индексацию. При такой индексации первый элемент массива имеет индекс -1, второй — индекс -2 и так далее.

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

Сравнение индексационных систем

Индексация Преимущества Недостатки
Натуральная (1) Интуитивно понятна Может привести к ошибкам, если программист забудет учесть натуральную индексацию
Нулевая (0) Позволяет использовать простую арифметику при работе с индексами (индекс + 1 эквивалентен индекс следующего элемента) Может путать начинающих программистов, так как отсчет начинается с нуля
Отрицательная Удобна для доступа к элементам массива в обратном порядке Не всегда интуитивно понятна, особенно для новичков

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

Вопрос-ответ

С какого числа начинается нумерация элементов массива?

В большинстве языков программирования нумерация элементов массива начинается с нуля. Это означает, что первый элемент массива имеет индекс 0, второй элемент — индекс 1 и так далее.

Почему в программировании индексация элементов массива начинается с нуля?

Исторически сложилось так, что в языках программирования выбрана индексация с нуля. Это связано с особенностями организации памяти и адресации. С нуля начинается адресация ячеек памяти, и чтобы упростить работу с массивами, был выбран нулевой индекс для первого элемента массива.

Что произойдет, если попытаться обратиться к элементу массива по индексу, который выходит за пределы диапазона?

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

Можно ли изменить начальное значение нумерации элементов массива?

В большинстве языков программирования нельзя изменить начальное значение нумерации элементов массива. Однако, есть некоторые языки, которые позволяют изменить эту настройку или использовать другие структуры данных, которые не начинают нумерацию с нуля.

С какой цифры начинается нумерация элементов массива?

Нумерация элементов массива начинается с нуля. Это означает, что первый элемент массива будет иметь индекс 0, второй элемент — индекс 1, третий элемент — индекс 2 и так далее.

Понравилась статья? Поделить с друзьями:
  • Для женс климо инструкция по применению цена
  • Для желудка энтеросгель инструкция по применению
  • Для горла таблетки для рассасывания доритрицин инструкция
  • Для гладких пяток с мочевиной инструкция
  • Для ветом инструкция по применению для котов