Автор Тема: Открытые массивы в O7  (Прочитано 10679 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Открытые массивы в O7
« Ответ #15 : Сентябрь 23, 2013, 08:22:51 am »
Еще про массивы. Я тут просматриваю модули компилятора на предмет кандидатов в переписывание на обероне, чтобы определить направление "допиливания" языка до юзабельного состояния... Конкретно про массивы такой вопрос: а как будет выглядеть массив строковых литералов на обероне? Аналог на С имеет практически нулевой "оверхед" и выглядит так:
char const *array[] = {"str1", "str2", "str3"};

На современных платформах это будет тупо участок read-only памяти "str1\x0str2\x0str3\x0" + массив указателей. Без всяких мегаоптимизаций со стороны компилятора и вполне читаемо со стороны человека.
На существующем O7 рисуется такой ужос-ужос:
VAR array: ARRAY 3 OF ARRAY 10 OF CHAR;
BEGIN
    array[0] := "str1";
    array[1] := "str2";
    array[2] := "str3";

Смущает не столько количество букаф, сколько количество возможностей ошибиться (с размером и индексами).  Ну и несколько смущает оверхед по памяти в случае строк сильно разной длины. Замечу также, что "упаковать" все строки в одну строку ("str1\x0str2\x0str3\x0") также нет возможности, поскольку в обероновских строках нельзя использовать специальные символы (хотя этот вариант все равно мне не нравится).

Дык я же показывал как это делается в случае наличия стандартной либы. Оверхед (по производительности) ровно тот же самый при наличии оптимизирующего компилятора :-) По синтаксису - оверхед оверхед совсем чуть-чуть больше.

Возможности ошибиться нет.
Y = λf.(λx.f (x x)) (λx.f (x x))

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Открытые массивы в O7
« Ответ #16 : Сентябрь 23, 2013, 01:26:40 pm »
Что выдаст LEN(array[0])? 4 или 10? Количество символов как получить?

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Открытые массивы в O7
« Ответ #17 : Сентябрь 23, 2013, 01:41:47 pm »
Что выдаст LEN(array[0])? 4 или 10? Количество символов как получить?

Из "10.2. Predefined procedures":

LEN(v) v: array the length of v

Из "6.2. Array types":

The number of elements of an array is called its length.

Следовательно, LEN(array[0]) должен выдать в данном случае 10.
Стандартной функции вроде strlen, по всей видимости, в обероне нет...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Открытые массивы в O7
« Ответ #18 : Сентябрь 23, 2013, 01:57:18 pm »
Интересно. Как получить длину строки? То есть нужно сканировать строку до определённого символа? Типа \0? Или нужно делать свою структура, где будет указана длина выделенной памяти, количество символов, заканчивается ли 0 и т.д Как в каждом проекте на си? :)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Открытые массивы в O7
« Ответ #19 : Сентябрь 23, 2013, 02:07:50 pm »
Интересно. Как получить длину строки? То есть нужно сканировать строку до определённого символа? Типа \0? Или нужно делать свою структура, где будет указана длина выделенной памяти, количество символов, заканчивается ли 0 и т.д Как в каждом проекте на си? :)

Ну да, оберон же мало чем отличается от сей кроме синтаксиса )))
Посчитайте длину строки в цикле по массиву пока не встретится символ \0 или массив не кончится ))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Открытые массивы в O7
« Ответ #20 : Сентябрь 23, 2013, 02:36:26 pm »
Интересно. Как получить длину строки? То есть нужно сканировать строку до определённого символа? Типа \0? Или нужно делать свою структура, где будет указана длина выделенной памяти, количество символов, заканчивается ли 0 и т.д Как в каждом проекте на си? :)

Ну да, оберон же мало чем отличается от сей кроме синтаксиса )))
Посчитайте длину строки в цикле по массиву пока не встретится символ \0 или массив не кончится ))
Угу. И в 07/11 Вирт еще ближе подтянул Оберон к Си - убрав массивы с неизвестной на этапе компиляции длиной. В Си (до C99) ведь их тоже нет :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Открытые массивы в O7
« Ответ #21 : Сентябрь 23, 2013, 04:13:09 pm »
Дык я же показывал как это делается в случае наличия стандартной либы.

std.init3strings(array, "str1", "str2", "str3");
?

Даже если наплевать на устои и эстетику, все равно... какашка.

Возможности ошибиться нет.

Можно ошибиться в размере array и размере его элементов.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Открытые массивы в O7
« Ответ #22 : Сентябрь 23, 2013, 04:18:59 pm »
Что выдаст LEN(array[0])? 4 или 10? Количество символов как получить?

Нету в обероне строк. Есть строковые литералы и ARRAY OF CHAR + весьма поверхностное описание того как литералы превращаются в массивы. Все остальное (длина строки, кодировки и т.д.) - делаешь сам :) Если бы были динамические массивы было бы проще - можно было бы строкой назвать ARRAY OF CHAR с размером равным размеру строки. А в существующем варианте все максимально приближено к С - или таскаешь дину строки отдельно или имеешь соглашение, что строка заканчивается нулем.