Как задать нижнюю границу массива динамически?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Как задать нижнюю границу массива динамически?

Сообщение CRobin » 06.07.2016 22:50:13

скалогрыз писал(а):возможно. А что за паскаль такой?
На моём 486, Turbo Pascal 7.0 и 5.0 такого не разрешали.


Extended Pascal разрешал

zub еще один полоумный, который хочет рассказать мне как через SetLength устанавливать нижний лимит индекса?
CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как задать нижнюю границу массива динамически?

Сообщение скалогрыз » 06.07.2016 22:55:30

CRobin писал(а):Extended Pascal разрешал

тогда, может быть стоит, попробовать GNU Pascal.
Он хвалится, тем, что поддерживает Extended Pascal.

FPC никогда не заявлял поддержки Extended Pascal-я, а поддержка GNU паскаля прекратилась несколько версий назад... из-за недостаточного спроса на функционал. А вот патч, могут и принять :)

Хмммм... странно. Вот на этой страничке сказано. Дескать есть -Mextendedpascal.
Однако, врёт! в 3.0.0 её нет.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как задать нижнюю границу массива динамически?

Сообщение zub » 06.07.2016 23:26:28

скалогрыз
>>Однако, врёт! в 3.0.0 её нет.
Есть, но насчет работоспаособности хз.
http://svn.freepascal.org/svn/fpc/trunk ... canner.pas глянь 501 строку

CRobin
Ты бы выбирал выражения - про SetLength от меня какието фантазии. Тебе уже и так и сяк разжевали, однако баранья натура преобладает - надо индексы
>>ожет можно как то выкрутится, объявив константы динамически чтоб добится того же эффекта?
Нет, нельзя - выкручивайся подругому
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Как задать нижнюю границу массива динамически?

Сообщение скалогрыз » 06.07.2016 23:43:56

zub писал(а):Есть, но насчет работоспаособности хз.
http://svn.freepascal.org/svn/fpc/trunk ... canner.pas глянь 501 строку
воистену!
ждём доработки синатксиса.

Кстати! в спецификации на Extended Pascal (стр 41 в pdf). Правда за 1990 год, есть ещё и 1991. Ничего про динамические массивы не говорится. Т.е. даже параметрическое определение типа, всё-равно в итоге даёт статический массив.

считаю, что лучшим решением проблемы сабж-а - дженерики :) и возмножно на основое advanced record или object, а не class. Чтобы с динамикой лишний раз возиться не надо было :)

Добавлено спустя 5 часов 33 минуты 7 секунд:
zub писал(а):Есть, но насчет работоспаособности хз.
http://svn.freepascal.org/svn/fpc/trunk ... canner.pas глянь 501 строку

проверил транком - не компилирует.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как задать нижнюю границу массива динамически?

Сообщение sign » 07.07.2016 06:49:58

CRobin писал(а):Здравствуйте. Необходимо объявить массив-справочник, индекс которого будет находится внутри диапазоне Uint64. Проблема в том, что заранее не известно минимальное значение ключа, иначе бы его можно было бы объявить константой

Код: Выделить всё
const a = 22222222222222;
         b = 22222222222333;
var dic : array[a..b] of TEntry;


Может можно как то выкрутится, объявив константы динамически чтоб добится того же эффекта?


Примерно так:
Код: Выделить всё
var
  RangeMin, RangeMax: Int64;
  Range: array of TEntry;

  procedure SetNewRange(cMin, cMax: Int64);
  function Entry(Key: Int64): TEntry;
  procedure ToEmtry(Key: Int64; const Value: TEntry);

implementation

procedure SetNewRange(cMin, cMax: Int64);
begin
  SetLength(Range, cMax - cMin + 1);
end;

function Entry(Key: Int64): TEntry;
begin
  Result := Range[Key - RangeMin];
end;

procedure ToEmtry(Key: Int64; const Value: TEntry);
begin
  Range[Key - RangeMin] := Value;
end;


Добавлено спустя 11 минут 11 секунд:
Проверка:

1.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Как задать нижнюю границу массива динамически?

Сообщение Снег Север » 07.07.2016 07:29:55

CRobin писал(а):Как задать нижнее значение индекса?

Для динамических массивов - никак, нижняя граница всегда равна только 0.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Как задать нижнюю границу массива динамически?

Сообщение AlphaBlend » 07.07.2016 12:31:09

ребят , я может и полная дура , но .... Смотрите )))) Если применить метод , как в учебниках пишут ? ))) Создается структура данных ( в случае паскаля - RECORD ) с двумя полями - 1. Указатель на данные , 2 - Указатель на следующую запись ) Типа "список " ) Может , так задача решится ? ) :roll:
Код: Выделить всё
// что-то такое :

TIndex = packed record
     PData: ^Variant;
     PField: ^TIndex;
end;

// так  нельзя  сделать в  Паскале ? ( у  меня  сейчас  под рукой  лазаруса  нету - проверить сама  не могу )


Добавлено спустя 5 минут 10 секунд:
vvvch писал(а):Не обращайте внимания, ему нужно действительно использовать что, то типа TList. Возможно мы не понимаем сути его задачи


почему тогда он не "прикрутит" к TList метод , преобразующий тап Variant и не пользуется ? ) Изобретает константы какие-то :shock:

Добавлено спустя 4 минуты 48 секунд:
CRobin писал(а):vvvchты реально до сих пор не понял "сути задачи"? Открой глаза, прочитай название темы, в которую пишешь. Если это не стеб, то ситуация просто клиническая.

фу как некрасиво :(

Добавлено спустя 1 минуту 25 секунд:
з.ы. Я этот метод читала в учебнике по С++ , но .... может он и к паскалю применится ? )) "Связанные списки " называется ) ( Visual c++.Net для чайников ) :twisted:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: Как задать нижнюю границу массива динамически?

Сообщение Лекс Айрин » 07.07.2016 12:45:27

проще задать константу "пересчитывающую" индекс.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как задать нижнюю границу массива динамически?

Сообщение vvvch » 07.07.2016 12:59:27

AlphaBlend
Там не так делается... Можно конечно джинэриками, но тут я пока не разобрался полностью. А в случае TList - создаётся свой класс, полем которого и будет TList, а все остальные методы пишутся так, что они используют этот TList для добавления исключения и др. TList много ченго позволяет, сортировать например, но во первых это отдельный довольно большой класс. Проблема у человека в том, что младший элемент массива имеет довольно большой индекс. Но и это можно решить, путём смены диапазона (пересчёта). Кроме того TList выделяет память блоками, и (кажется - точно не помню) может быть более 64к. Но человек захотел решить проблему "в лоб" путём что-бы компилятор индексы сам пересчитал. Тоже подход, но не работает.
Да, связанные списки - это я довольно давно видел и в паскале, но тут проблема, по ним очень медленно передвигаться, и при большом кл-ве элементов, лучше TList.
В связанных списках тоже надо класс писать. И не порвётся ничего при прав. обслуживании, приемлема - медленно.
Последний раз редактировалось vvvch 07.07.2016 13:06:40, всего редактировалось 2 раз(а).
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Как задать нижнюю границу массива динамически?

Сообщение AlphaBlend » 07.07.2016 12:59:59

ну да , у решения . предложенного мной есть "косяк" - если в середине списка стоящий указатель потеряется - порвется вся цепочка ) Хотя пусть он сам разбирается ) Хамоватый тип какой-то :roll:

Добавлено спустя 4 минуты 11 секунд:
vvvch Скажите , а ведь такого размера массивы только 65535 индексов поддерживают , или я не права ? ) Int64 - больше , но ... есть ли смысл забивать память таким большим массивом ? ) Каждый индекс - минус памяти ) Скорость работы программы в этом случае сильно "удорожится" ) Если монопользовательский режим - то почему файлы не применить ? А если многопользовательский , то есть же SQL ! )

Добавлено спустя 1 минуту 59 секунд:
кстати ЛЕкс Айрин прав ) Если массиву задать "считалку" типа какой-то "дельты" , то нулевой массив превратится в 116 путем 0 + 116 , а второй в 117 и так далее ) Но ... если верхний передел выйдет за область Integer ? )

Добавлено спустя 2 минуты 54 секунды:
вообще что-то непонятное )
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: Как задать нижнюю границу массива динамически?

Сообщение vvvch » 07.07.2016 13:13:30

AlphaBlend
Мне надо вспомнить про TList, я им давно не пользовался, забыл.
Касательно больших списков Вы не видели 1С -справочник? Он очень большой. Но отсортирован и индексирован.
Касательно "считалки", класс все-равно писать надо, как пересчитывать будете?

А вообще, когда будет проблема, тогда и будете её решать. А сейчас - "не заморачивайтесь".
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Как задать нижнюю границу массива динамически?

Сообщение AlphaBlend » 07.07.2016 13:22:14

vvvch писал(а):А вообще, когда будет проблема, тогда и будете её решать. А сейчас - "не заморачивайтесь"

касательно паскаля я читаю книги и правильно ставлю вопросы на форуме ) Относительно РНР - пишу скрипты за еду ) Вот про ассемблер ) Если кто-нибудь бы мне подкинул книжку "ассемблер для блондинок" ))) была бы признательна ) :mrgreen: :mrgreen: В часности я знаю , что поставленная задача Автором способами SysUtils и возможностями простых массивов не решима ) :mrgreen:

Добавлено спустя 3 минуты:
vvvch писал(а):Вы не видели 1С -справочник?

я ненавижу ни 1С , ни его создателей , ни программистов ) :evil:
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Re: Как задать нижнюю границу массива динамически?

Сообщение Лекс Айрин » 07.07.2016 13:25:20

AlphaBlend, по идее, для TList надо делать функцию поджимающую массив. Но, видимо, это сделано для более легкой вставки новых элементов.

vvvch писал(а):Да, связанные списки - это я довольно давно видел и в паскале, но тут проблема, по ним очень медленно передвигаться, и при большом кл-ве элементов, лучше TList.


не факт. Представьте, что вам нужно вставить элемент в начало, а свободные слоты закончились? для связного списка ноу проблем, а вот TList будет сдвигать ВЕСЬ список.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как задать нижнюю границу массива динамически?

Сообщение vvvch » 07.07.2016 13:25:59

AlphaBlend
Почитайте Дональда Э. Кнута "Искуство програмирования" - 3-й том, там как раз про списки.
Аватара пользователя
vvvch
постоялец
 
Сообщения: 105
Зарегистрирован: 26.04.2013 11:05:39
Откуда: г.Боровичи, Новг. обл.

Re: Как задать нижнюю границу массива динамически?

Сообщение AlphaBlend » 07.07.2016 13:27:43

vvvch мне до таких книг как амебе до абака )

Добавлено спустя 4 минуты 20 секунд:
и вообще . Для больших объемов данных еще с "азов изучения РНР ( 9 класс) я решила для себя , что Огромные и Большие объемы данных - только SQL . Массивы разбирают текстовые файлы , хранят "кратковременную " информацию , какие-то данные для последовательных математических вычислений ( интегралы , ряды ) . В остальном массивы не очень удобны , тем более в таком неповоротливом с точки зрения массивов языке , как Паскале . в РНР очень мощная реализация массивов , и мегабайт текста можно спокойно "засунуть " в массивы и выдать пользователю согласно алгоритму . Но вот в Паскале . Он очень сложен в использовании массивов . Мнение блондинки , возможно , но я тоже искала "решения вопроса сортировки больших данных" . Решение п ростое и готовое - SQL
Аватара пользователя
AlphaBlend
постоялец
 
Сообщения: 207
Зарегистрирован: 22.05.2016 10:13:10

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 247

Рейтинг@Mail.ru