Массивы
|
|
basme | Дата: Суббота, 15 Декабря 2007, 22:59 | Сообщение # 1 |
MMB Club
Группа: Проверенные
Сообщений: 358
Репутация: 5
Награды: 2
Статус: Offline
| Умные люди, объясните мне, я, как не старался, так и не понял. Запись в массив производится при помощи команды, подобной С другой стороны, массив представляет из себя одну строку с элементами, разделёнными делимитерами. Так когда мы записываем данные в массив способом, указанным выше, то у этого массива какой делимитер? А то, такое ощущение, что эти два массива вообще разные вещи. Если я сейчас сказал полную ерунду, не ругайте меня сильно!
|
|
| |
YURIY | Дата: Суббота, 15 Декабря 2007, 23:09 | Сообщение # 2 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Нет. Массив - это группа значений одного типа под именем одной переменной. Чтобы не создавать, скажем, в программе такие перменные для даты рождения, как Day, Mounth, Year, можно оформить это дело в виде массива. Например с именем Date. Массив характеризуется такой важной штукой, как индекс элемента. Так вот, для данного массива организовать хранение данных о дате рождения можно следующим образом: Date[1]=День Date[2]=Месяц Date[3]=Год Соответственно, День, Месяц, Год - числовые значения. Чтобы узнать в каком году родился пользователь, достаточно написать вот так: Code s$=CHAR(Date[3]) LoadText("Text","s$") Что-нибудь понял?
Вечная память Андрею Сергееву!
|
|
| |
toizy | Дата: Суббота, 15 Декабря 2007, 23:12 | Сообщение # 3 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Ты сказал полную ерунду При чём тут разделители, массив это много-много элементов спод одним именем. Т.е. так: Code array[1]='' array[2]='' array[3]='' Очень удобно обращаться к элементам массива по индексу. Массив - это список в памяти. И делимитеры ни при чём, элемент массива в ММВ получают по индексу, а не по GetArrayItem Добавлено (15 Декабрь 2007, 23:12) --------------------------------------------- Блин, везде сегодня опоздал...
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
as-master | Дата: Суббота, 15 Декабря 2007, 23:37 | Сообщение # 4 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| Делимитеры ни при чем в плане получения данных, но имеют важнейшее значение, ибо этот самый знак д елимитера потом нужно указывать в команде GetArrayItem, с помощью именно которой и получают элементы массива (почему ты эту команду обругал, я не понял). Короче, Склифосовский. Если масив представляет собой следующее: дата$='день$#месяц$#год$#' То его элементы получают следующим образом: день$=GetArrayItem(дата$,#,1) месяц$=GetArrayItem(дата$,#,2) год$=GetArrayItem(дата$,#,3)
Да пребудет с вами ММВ!
|
|
| |
toizy | Дата: Воскресенье, 16 Декабря 2007, 00:29 | Сообщение # 5 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Речь шла именно о массиве, а не о строке с делимитерами. Строка - это не массив.
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
basme | Дата: Воскресенье, 16 Декабря 2007, 20:29 | Сообщение # 6 |
MMB Club
Группа: Проверенные
Сообщений: 358
Репутация: 5
Награды: 2
Статус: Offline
| ОК, всё понял, спасибо!
|
|
| |
as-master | Дата: Понедельник, 17 Декабря 2007, 10:07 | Сообщение # 7 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| Quote (toizy) Строка - это не массив Я думаю, ты ошибаешься. Строка, содержащая в себе несколько переменных - это уже массив переменных. Вот наглядный пример из справки: Code Items$='item1#item2#item3#item4#item5#' For i=1 To 5 ArrayItem$=GetArrayItem(Items$,#,i) Message("Полученный элемент массива:","ArrayItem$") Next i Видишь? ArrayItem$ здесь называется элементом массива, следовательно сам массив - это Items$, массив переменных item1...item5 А когда строк много - это уже многострочный массив, вот пример из моей же программы: Code For I=1 To NOL(list$) string$=StrFromFile(list$,I,1) variable1$[I]=GetArrayItem(string$,#,1) variable2$[I]=GetArrayItem(string$,#,2) variable3$[I]=GetArrayItem(string$,#,3) Next I
Да пребудет с вами ММВ!
|
|
| |
YURIY | Дата: Понедельник, 17 Декабря 2007, 12:37 | Сообщение # 8 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Quote (as-master) Я думаю, ты ошибаешься. В классическом программировани массив есть понятие переменной с несколькими значениями под индексами. Что там придумали в Mediachance - меня не интересует. Массивы на wikipedia
Вечная память Андрею Сергееву!
|
|
| |
as-master | Дата: Понедельник, 17 Декабря 2007, 13:56 | Сообщение # 9 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| Quote (Yuriy) Что там придумали в Mediachance - меня не интересует. В таком случае, дорогой мой Юрик, иди и обсуждай массивы на форумах по нормальному программированию. Ты часом не забыл, что здесь форум по ММВ? А в ММВ массивом называется именно то, о чем я написал, точнее привел пример, в посте номер 7. Я всё понимаю, что с точки зрения программирования это не так, однако нам придется говорить о том, что это именно так!!! В противном случае юзер совсем запутается...
Да пребудет с вами ММВ!
|
|
| |
toizy | Дата: Понедельник, 17 Декабря 2007, 16:41 | Сообщение # 10 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| И всё же, речь в данном случае не об этом. Тело спрашивает: это - именно массив, вот мы и говорим про настоящие массивы. А массив в строке - это тупой парсинг, не более. ИМХО, Юрик прав. Медиашанс порой гонит. Ну и что с того, что они функцию назвали GetArrayItem? По хорошему ещё надо было как-то вроде ParseStr обозватьДобавлено (17 Декабрь 2007, 16:41) --------------------------------------------- К слову о массивах. Сама справка ММВ подтверждает наше с Юрой мнение: Quote Array in MMB is a group of variables under the same name, with addresses, so we can reach every item in array. In MMB script language, arrays are used just like variables. По русски: Массивы в ММВ - это группа переменных, имеющих одно имя, доступ к каждой из которых осуществляется по индексу. В сценариях ММВ массивы не отличаются от обычных переменных.
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
as-master | Дата: Понедельник, 17 Декабря 2007, 17:05 | Сообщение # 11 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| Quote (toizy) В сценариях ММВ массивы не отличаются от обычных переменных ВОТ!!! Об этом я и говорю. Факт тот, что указанная функция работает и без индексов [i], вытаскивая из переменной с делимитерами НЕСКОЛЬКО других переменных... Короче, Юра и Дима - закончим этот спор. Мы с вами друг друга прекрасно понимаем, а вот юзер точно запутается от наших споров... Суть в том, что функцию GetArrayItem можно применять без всяких [i], извлекая переменные просто по номеру делимитера. Если то, из чего извлекают, имеет только одну строку. Хватит уж, наверное, нам воду в ступе толочь...
Да пребудет с вами ММВ!
|
|
| |
toizy | Дата: Понедельник, 17 Декабря 2007, 17:40 | Сообщение # 12 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Итак. Дабы мой ответ был по существу, как Андрей говорит, даю краткий ликбез по массивам. Просто и ясно. Итак, массив с точки зрения ММВ - переменная вида i - любое знаковое число или числовая переменная. Таким образом, переменная одна, а элементов у неё сколько угодно. На самом деле переменных несколько, просто мы оперируем с ними через одно и то же имя, но при помощи разных индексов. Теперь, строка вида формально не является массивом. Такую строку правильнее назвать строкой с разделителями, хоть в справке по команде GetArrayItem и написано, что такая строка - это якобы тоже массив. И именно эта часть справки и сбивает с понту многих пользователей ММВ. У них складывается твёрдая уверенность, будто строка с разделителями и массив - одно и то же. Поэтому не путайте строку с массивом. В этом топике человек спросил, а можно ли получать элементы массива s$[i] при помощи GetArrayItem. Нет. Нельзя. GetArrayItem - это команда парсинга, т.е. вычленения каких-либо частей из строковой переменной по предопределённым правилам. Забудьте, что имя команды переводится как "получить элемент массива", для вас эта команда должна именоваться ParseString, т.е. "разбор строки". GetArrayItem имеет функциональное значение. Ну и напоследок. Кто бы что ни говорил, строка это строка, а массив это массив. Точка. Плевать мне на справку.
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
as-master | Дата: Понедельник, 17 Декабря 2007, 17:47 | Сообщение # 13 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| Quote (toizy) можно ли получать элементы массива s$[i] при помощи GetArrayItem. Нет. Нельзя. Врёшь, мужик!!! А вот это что? Я же приводил этот пример: For I=1 To NOL(list$) string$=StrFromFile(list$,I,1) name$[I]=GetArrayItem(string$,#,1) Next I здесь list$ - адрес текстового файла, name$[I] - массив переменных name$
Да пребудет с вами ММВ!
|
|
| |
toizy | Дата: Понедельник, 17 Декабря 2007, 18:12 | Сообщение # 14 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Quote (as-master) Врёшь, мужик!!! <Тут грязная ругань>. Уанс мор: Code string$=StrFromFile(list$,I,1) - строка идём дальше: Code name$[I]=GetArrayItem(string$,#,1) - массив. Тут ты не получаешь элемент массива, а устанавливаешь. Получить же у массива элемент командой GetArrayItem невозможно! Забудь, всё что ты знал раньше и читай мой пост выше. Добавлено (17 Декабрь 2007, 18:12) --------------------------------------------- А если речь о присваивании (установке) значения элементу массива, как в том коде, что ты привёл, то присваивание можно сделать и так Code name$[I]=GetArrayItem(string$,#,1) и так и вот так и даже так Code name$[I]=CHAR((123*456)+(7/8))+' blablabla' В данном случае правая часть уравнения совершенно не имеет значения, поскольку здесь выполняется только инструкция присваивания. А получение (именно получение) элемента массива путём применения команды GetArrayItem выглядело бы так Code name$=GetArrayItem(string$, #, i) что совершенно не имеет смысла, потому что массив не имеет разделителя. Ты назваешь присвоение значения элементу массива его получением, а это неправильно. Это противополложные вещи.
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
as-master | Дата: Вторник, 18 Декабря 2007, 00:05 | Сообщение # 15 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| ниасилил - слишкам многа низнакомых букаф... А если серьезно, то такими вот постами ты только всех запутаешь еще больше. И главное - я так и не понял, как же получить элемент массива (но только применительно к ММВ!!!) Мне-то на всё это тут грязная ругань, а что другие будут делать? Они ведь так и не пойму, что за тут опять ругань и какая разница между получением и присваиванием. Ну пусть будет присваивание, какая разница, в конце концов тут такой мат, что я бы еще хуже мат
Да пребудет с вами ММВ!
|
|
| |
toizy | Дата: Вторник, 18 Декабря 2007, 00:15 | Сообщение # 16 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Quote (as-master) то такими вот постами ты только всех запутаешь еще больше. Пост выше адресован тебе. А человеку я уже ответил тут. Я соглашусь что я всех запутываю, если вопрошавший скажет тут, что ему немонятно то, о чём я писал в 12 посте.
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
as-master | Дата: Вторник, 18 Декабря 2007, 00:38 | Сообщение # 17 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| Quote (toizy) если вопрошавший скажет тут, что ему немонятно то, о чём я писал в 12 посте Дело не только в этом вопрошавшем. А и во всех других людях, читающих форум. В том числе и большого количества тех, кто просто приходит сюда почитать-посмотреть, и никогда не регистрируется.
Да пребудет с вами ММВ!
|
|
| |
as-master | Дата: Вторник, 18 Декабря 2007, 00:39 | Сообщение # 18 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| И еще. Глупо было бы не использовать твои глубокие познания в корыстных целях Так что с тебя теперь статья, а вернее - урок для сайта, в раздел "Уроки - Скрипты". Тема - само собой "Массивы в ММВ". Чтобы доходчиво, и главное - с примерами практических строк кода. Я не говорю о сроках, но всё время буду напоминать, пока не получу желаемое Кстати, и Юрика надо напрячь - он у нас главный спец по матрицам, это несомненно после его Зика.
Да пребудет с вами ММВ!
|
|
| |
Alex3A | Дата: Вторник, 18 Декабря 2007, 21:43 | Сообщение # 19 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Quote name$[I]=GetArrayItem(string$,#,1) name$ - массив А, string$ - массив В, идет присваивание элементу массива А значения элемента массива В. Строка string$ интерпритируется, в данном случае, как массив, элементы которого разделены каким либо делимитором (разделителем). В любом случае, элементу массива А (левая часть выражения) присваивается значение правой части выражения. Quote Кто бы что ни говорил, строка это строка, а массив это массив В общем верно, но смотря как смотреть, и то и другое просто область памяти, а как ее воспринимать - уже другое дело и тут могут быть более изящные методы. Жаль что билдер не поддерживает многомерные массивы.
|
|
| |
as-master | Дата: Вторник, 18 Декабря 2007, 22:38 | Сообщение # 20 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| Вот наконец-то нашелся мудрый человек, который и рассудил: Quote (Alex3A) Строка string$ интерпритируется, в данном случае, как массив, элементы которого разделены каким либо делимитором (разделителем).
Да пребудет с вами ММВ!
|
|
| |
toizy | Дата: Вторник, 18 Декабря 2007, 23:42 | Сообщение # 21 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Всё равно не согласен. Строка с делимитером если и массив, то псевдо. К тому же и работающее очень медленно. Так что я своё мнение не меняю. Массив - массив, строка - строка. Хто е согласен, не шлюхай.
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
as-master | Дата: Вторник, 18 Декабря 2007, 23:51 | Сообщение # 22 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| Гы-ы-ы Слова закончились...
Да пребудет с вами ММВ!
|
|
| |
toizy | Дата: Вторник, 18 Декабря 2007, 23:52 | Сообщение # 23 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| да, забыл сказать. Я против того только, чтобы неоправданно считать строку массивом. Если бы все сразу понимали, что строка и массив- вещи разные, то вопросов, выраженных в первом посте сего топика не возникало бы даже в принципе. А раз начинают смешивать эти понятия, то и появляются непонятки типа "а что же там за разделитель, в тех массивах? В этих же есть, а в тех нету...". ЗЫ. то что строка - это массив байт, это бесспорно. Но в случае ММВ это не имеет большого значения, поскольку я не вижу повода называть строку массивом - это было бы неправльно по определению. И способ представления, имхо, ни при чём.
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
Peter | Дата: Среда, 19 Декабря 2007, 05:59 | Сообщение # 24 |
Админ NeoBook
Группа: Админ NeoBook
Сообщений: 1265
Репутация: 75
Награды: 18
Статус: Offline
| Я конечно дико извиняюсь за вторжение... Читаю этот диспут... Читаю... Но не могу не согласиться с Quote (toizy) На самом деле переменных несколько, просто мы оперируем с ними через одно и то же имя, но при помощи разных индексов. Теперь, строка вида Code s$='a#b#c#' формально не является массивом. Такую строку правильнее назвать строкой с разделителями, хоть в справке по команде GetArrayItem и написано, что такая строка - это якобы тоже массив. И именно эта часть справки и сбивает с понту многих пользователей ММВ. У них складывается твёрдая уверенность, будто строка с разделителями и массив - одно и то же. Поэтому не путайте строку с массивом. ИМЕННО! Не нужно подменять понятия и "смотреть с разных сторон"! В программировании ОДНОЗНАЧНО: "Массив - это структура данных, доступ к элементам которой осуществляется по НОМЕРУ (или индексу). Все элементы в массиве имеют одинаковый тип". Это из учебника по Дэлфи. И строка с разделителями ну никак не "тянет" на массив! Странно как-то в ММВ понимается массив...
Никто не может вернуться в прошлое и изменить свой старт. Но каждый может стартовать сейчас и изменить свой финиш!
Сообщение отредактировал Peter - Среда, 19 Декабря 2007, 06:13 |
|
| |
as-master | Дата: Среда, 19 Декабря 2007, 09:49 | Сообщение # 25 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| toizy и Peter! Ну что вы напрасно бьетесь головой об стену! В этом топике я уже сто раз повторил, что с этим (и с вами) никто и не спорит. И дело вовсе не в том, как определяется понятие массива в программировании, а в том, как работать с этим в ММВ. А в ММВ строка с разделителями тоже используется как массив переменных, и правильно это, или неправильно, но с ней работает та же команда, что и с "нормальным" массивом - команда GetArrayItem - дословно переводимая как "получить элемент массива". Да, пусть юзер знает, что строка и массив на самом деле - не одно и то же. Но пусть он также знает, что строка с разделителями в ММВ используется как массив. Все-таки форум тут именно по ММВ...
Да пребудет с вами ММВ!
|
|
| |
Alex3A | Дата: Среда, 19 Декабря 2007, 11:09 | Сообщение # 26 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Quote Всё равно не согласен. Строка с делимитером Quote Странно как-то в ММВ понимается массив... Все все надо воспринимать по принципу "черного ящика", ибо, еще раз повторяю, все это только области памяти, и механизм ее интерпритации, для нас несущесвенен. Строка, то же имеет свой делимитер, должна заканчиваться 0, (о разновидностях строк, я речи не веду). Quote Это из учебника по Дэлфи. Да, скажем так, Дэлфи так это понимает, всего лишь соглашение об интерпритации некоторых структур данных. А когда откроешь файл в хекс редакторе, получишь иную интерпритацию, той же области памяти. Это я о том, что все условно, и если придерживаться условностей, то не имеет значение, что это в действительности.
|
|
| |
andrej | Дата: Воскресенье, 03 Февраля 2008, 22:31 | Сообщение # 27 |
Новый участник
Группа: Пользователи
Сообщений: 3
Репутация: 0
Награды: 0
Статус: Offline
| Здравствуйте! Читал я,читал Ваш спор и не вядержал.Решил тоже вмешеться.По-моему Вы все глубоко заблуждаетесь. Все дело в том, что любой массив- это набор ссылок на какие-то значния в памяти. Т.е. в памяти-это идущие подряд адреса каких-то значений. В C, FORTRANе они явные, в других языках это проявляется после транслятора. Т.е. если у Вас есть строка : str$='Здравствуйте!' и вы заводите массив: m$[13] типа CHAR (однобайтовый) то присвоение m$=str$ приведет к тому, что скажем m$[10] - это 'й' если индекс начинается с 1. Но т.к. если адресация 32-разрядная, то его размер 32*13=416 байт. Здесь все значения идут подряд и ссылки тоже,но если сделать отдельное присвоение: m$[13]='!' m$[12]='й' . . . m$[1]='З' то ссылки пойдут в другом порядке. Значения по ссылкам могут быть где угодно. Если массив двумерный, то каждый элемент T[i][]- это массив ссылок на массив ссылок. По крайней мере это ни вкоем случаае не сами значения.Правда что творится внутри MMB одному богу известно.Согласитесь, что искать 1000 вхождение делиметра при переменных подстроках довольно долго.Поэтому при больших сортировках сортируются ссылки. а не значения. Вот! С приветом , Андрей.
Андрей
|
|
| |
toizy | Дата: Воскресенье, 03 Февраля 2008, 23:15 | Сообщение # 28 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Quote (andrej) С приветом , Андрей. Привет, Андрей! Дело в том, что заблуждаешься, похоже ты. Нельзя применять к ММВ принципы высокоуровнего программирования. Для начала стоило бы вникнуть в основы скриптинга ММВ, а уж потом судить, кто прав, а кто нет. Приведённые тобой паскалевские массивы не имеют общего с массивами в ММВ, Формально да, строки string - это масивы указателей на char, т.е. PChar. но массив это не только массив символов. Это может быть массив любых данных, поскольку элементы массива указывают на значения памяти, как ты говорил. А по этим адресам может быть что угодно - от Byte, char, word до record, set, variant и т.д... ЗЫ. Особенно понравилось это: Quote (andrej) искать 1000 вхождение делиметра при переменных подстроках довольно долго.Поэтому при больших сортировках сортируются ссылки. а не значения. Ну дык а кто утверждал, что строка это массив указателей на char? И чем использование ссылок отличается от использования PChar, непонятно. Про арифметику указателей слышали? Прошу прощения, если грубо... Творческий ступор напрягает
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
Alex3A | Дата: Воскресенье, 25 Мая 2008, 21:40 | Сообщение # 29 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| А твой скрипт где!
|
|
| |
Alex3A | Дата: Воскресенье, 25 Мая 2008, 22:47 | Сообщение # 30 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Quote (serkhg) "a[1]=<Embedded>\1.htm". У тебя ведь цифровой массив!! a$[1]='<Embedded>\1.htm'
|
|
| |