Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2014, 19:42   #1
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию Лазарус и строковой массив

Никак не могу найти ошибку, вроде где-то на поверхности плавает, но чего-то седня переутомился:
Код:
procedure TNStore.CopyStrMas(Source: Array of String; var Dest: Array of String; Count: Integer);
var
   i, d: Integer;
begin

     // Количество элементов в массиве
     d:=Length(Source);
     if Count>-1 then d:=Count;

     // Выставим нужное количество элементов
     SetLength(Dest, d);

     // Перенос элементов
     for i:=0 to d-1 do
     begin

          // Построчно
          Dest[i]:=Source[i];
     end;
end;
Лазарус ругается на SetLength(Dest, d); - типа
Цитата:
treestorage.pas(195,24) Error: Type mismatch
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.08.2014, 20:11   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
type TMyArray = array of String;

...

procedure CopyStrMas(Source: TMyArray; var Dest: TMyArray; Count: Integer);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.08.2014, 20:15   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Array of String
Не лучше ли TStringList вместо открытого массива?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2014, 06:48   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
type TMyArray = array of String;
Так работает, но почему это нужно? У меня в юните полно обработок массивов и есть строковые с похожим принципом действия - вычисляем длину массива, заполняем массив. Другие участки кода Лазарус проглатывает молча.
Цитата:
Не лучше ли TStringList вместо открытого массива?
Мелкая обработка временных данных. Нет особого смысла разводить сыр-бор. И потом я хочу юникод, а у Лазаруса там со списками какие-то траблы. Вроде все работает, малейшее изменение и потом ищи где что не так (там часть операций по умолчанию поддерживает юникод, а часть надо явно преобразовывать кодировки).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 11.08.2014, 07:33   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

При объявлении как в #1 специальный механизм передачи параметров, не позволяющий внутри процедуры изменять длину массива.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.08.2014, 07:34   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну так я var написал, чтобы можно было. К чему такие сложности?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 11.08.2014, 08:44   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
procedure TNStore.CopyStrMas(Source: Array of String; var Dest: Array of String; Count: Integer);
в Паскале не было динамических массивов.
Но были так называемые "открытые массивы" (читать про передачу массивов в процедуры/функции - ТЫЦ)

Так это и перешло (на правах совместимости в ObjectPascal/Delphi)

поймите, что описанные у Вас массивы Source и Dest - НЕ динамические. Поэтому к ним и не применима операция SetLength

Теперь стало чуть яснее?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.08.2014, 08:47   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Теперь стало чуть яснее?
Немного. Как менять длину открытого массива? Только по-Аватарски?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 11.08.2014, 08:52   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Как менять длину открытого массива?
Ни как. Динамического SetLength
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.08.2014, 09:51   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да, никак. Только описывайте свой тип, как и предложил Аватар, его передавайте в процедуру/функцию и уже ему меняйте длину через SetLength
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лазарус SnS Помощь студентам 4 23.01.2014 00:15
Лазарус будущийпрограммист Помощь студентам 6 10.01.2014 23:11
Лазарус Ирина Андреевна Пс Помощь студентам 3 24.08.2013 11:24
Лазарус Simply-Art Qt и кроссплатформенное программирование С/С++ 15 03.04.2009 08:23