Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Проблема с масивом и строками


Автор: Canyon 19.3.2012, 11:41
Мне нужно из нескольких TStringList перевести строки в массивы строк, что бы потом легче их использовать.
Сделал функцию которая это все перекидывает, но вот она почему то не работает.

После выполнения функции STR пустая!!!
Что я сделал не так? 

Цель такова. В файлах хранятся настройки программы. 
Как их лучше прочитать и сделать красиво и со скоростью работы ничего не подводило?

Думал через ReadLn, но кода больше и не хочется закорачиваться. Решил Через TStringList. Может есть какое то мудрое решение. 

Код

//описанные переменные
var
STRList : TStringList;
 STR : Array [0..50] Of String;


//функция переводит строки из TStringList в массив STR
Function RWStr(InStr : TStringList; OutStr : Array Of String): Boolean;
Var
 I : Integer;
Begin
 For I := 0 to InStr.Count-1 Do
 Begin
  OutStr[i] := InStr.Strings[i];
 End;
 Result := True;
End;


//Вызываю так вот
RWStr(STRList, STR)

Автор: Чучмек 19.3.2012, 11:57
Поставь var перед OutStr : Array Of String): Boolean;
Цитата(Canyon @  19.3.2012,  11:41 Найти цитируемый пост)
 Array [0..50] Of String;

Цитата(Canyon @  19.3.2012,  11:41 Найти цитируемый пост)
Array Of String

Это разные вещи.Некрасиво.



Автор: Canyon 19.3.2012, 12:24
Цитата(Чучмек @ 19.3.2012,  11:57)
Поставь var перед OutStr : Array Of String): Boolean;
Цитата(Canyon @  19.3.2012,  11:41 Найти цитируемый пост)
 Array [0..50] Of String;

Цитата(Canyon @  19.3.2012,  11:41 Найти цитируемый пост)
Array Of String

Это разные вещи.Некрасиво.

Спасибо огромное за помощь.

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

объяснить пожалуйста почему надо ставить var в моем случае? 
 в чем разница между Array [0..50] Of String; и Array Of String

Автор: Чучмек 19.3.2012, 12:58
Цитата(Canyon @  19.3.2012,  12:24 Найти цитируемый пост)
почему надо ставить var

Без var происходит копирование исходной переменной. С var - в функцию передается адрес переменной.
Цитата(Canyon @  19.3.2012,  12:24 Найти цитируемый пост)
в чем разница

Array [0..50] Of String - 51 указатель, записанные последовательно.
Array Of String - указатель на 9 байт структуры
Код

record
ref:cardinal;
length:cardinal;
data:pointer;
end;

Хотя delphi и приводит неявное преобразование, но такая запись сильно отличается от того, что создаст компилятор.


Автор: Canyon 19.3.2012, 13:03
Вот и появилась ошибка. Прочитал Ваше последнее сообщение и сразу увеличил кол-во символов строках и мне уже приложение выдает ошибку.
А что мне тогда подставить вместо Array of String это Array of [0..50] of String; не подходит;

// Это Вы предложили в эту структуру загружать данные?
Код

record
ref:cardinal;
length:cardinal;
data:pointer;
end;



UPD Хотя это я ошибку сам допустил. Все работает.
Но вопрос теперь такой/ Правильно ли я описал OutStr в которую пападает переменная STR???

Код

var
STR : Array [0..50] Of String;

//функция 
Function RWStr(InStr : TStringList; OutStr : Array Of String): Boolean;

//Вызываю так
RWSTR(STRList, STR);

Автор: Чучмек 19.3.2012, 14:02
Цитата(Canyon @  19.3.2012,  13:03 Найти цитируемый пост)
Это Вы предложили в эту структуру загружать данные?

Нет, это внутренняя структура array of ...
STR сделай тоже Array Of String, а а в RWStr 
задай размер
Код

setlength(OutStr,InStr.Count);



Автор: bems 19.3.2012, 22:18
Цитата(Чучмек @  19.3.2012,  12:58 Найти цитируемый пост)
Array Of String - указатель на 9 байт структуры

Нет, это open array parameter, всё законно

Добавлено через 9 минут и 52 секунды
Canyon, запись array of имеет разное значение в зависимости от контекста. Если она встречается в описании аргумента процедуры/функции это уже не динамический массив. Читать http://docwiki.embarcadero.com/RADStudio/en/Parameters_(Delphi)#Open_Array_Parameters

Автор: Чучмек 19.3.2012, 23:20
Цитата(bems @  19.3.2012,  22:18 Найти цитируемый пост)
Нет, это open array

Цитата(bems @  19.3.2012,  22:18 Найти цитируемый пост)
запись array of имеет разное значение в зависимости от контекста

Да,действительно. smile 

век живи - век учись, дураком помрешь 

Автор: Canyon 19.3.2012, 23:48
Спасибо. Попробую прочитать завтра. с английским очень плохо.

Скажите как можно узнать сколько указателей у переменной STR?

Автор: bems 19.3.2012, 23:54
Каких указателей? Ты имел в виду сколько строк в массиве? Так ты же сам описал его как 0..50. Вот 51 и есть
Если нужно узнать массив какой длины передан в функцию, то Length(OutStr) это количество. Но чаще бывает нужен индекс последнего элемента. Это High(OutStr)
Внутри функции самый первый индекс OutStr всегда 0, независимо как объявлен массив который передали в функцию

Автор: Canyon 20.3.2012, 01:25
Спасибо. Сегодня читал про High, но упустил из виду.

P.S. Вспомнил подпись одного участника, вот только не помню кого и на каком форуме.
"Правильно задный вопрос, уже половина ответа" - Убедился сам.

Спасибо тема решена.

Автор: northener 20.3.2012, 01:27
Цитата(bems @  19.3.2012,  22:18 Найти цитируемый пост)
Нет, это open array parameter, всё законно

<offtop>
Попытка воплотить Compiler Magic в позднем исполнениии.
</offtop>

Автор: bems 20.3.2012, 02:28
Почему попытка? помоему всё удалось и нормально работает, не?

Автор: MetalFan 20.3.2012, 17:22
Цитата(Чучмек @  19.3.2012,  12:58 Найти цитируемый пост)
Array Of String - указатель на 9 байт структуры

И это утверждение так же не верно.
Переменная-динамический массив является указателем НА НУЛЕВОЙ(т.е. по сути-первый) элемент этого массива.
А вообще к чему новичку голову такими подробностями забивать?

Автор: Чучмек 20.3.2012, 22:04
Цитата(MetalFan @  20.3.2012,  17:22 Найти цитируемый пост)
И это утверждение так же не верно.
Переменная-динамический массив является указателем НА НУЛЕВОЙ(т.е. по сути-первый) элемент этого массива.

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

Автор: northener 21.3.2012, 00:17
Цитата(bems @  20.3.2012,  02:28 Найти цитируемый пост)
Почему попытка? помоему всё удалось и нормально работает, не? 

Да. Но это всё-таки не Compiler Magic.
Вот в функциях типа Write, Writeln, Read, Readln - действительно Compiler Magic.
Ну и да. Работает.  Но я всё-таки поставил тэг Offiop. smile 
Типа - это мой комментарий к факту.

Автор: bems 21.3.2012, 00:21
Там скрытый аргумент, тоже магия компилятора

Автор: northener 21.3.2012, 00:21
Цитата(Чучмек @  20.3.2012,  22:04 Найти цитируемый пост)
Да, но перед ним идет размер массива и счетчик ссылок.

Не успел ответить вовремя.
Ссылаться (указывать) можно лишь на конкретный адрес в памяти. А что там на самом деле знает компилятор.

Добавлено @ 00:26
Цитата(bems @  21.3.2012,  00:21 Найти цитируемый пост)
Там скрытый аргумент, тоже магия компилятора

Не буду спорить, ибо вы тоже правы.

Добавлено @ 00:30
Ещё один оффтоп.
Вот что мне очень не нравится в форумах Источников и Винграда. Я хотел ответить двум авторам на два совершенно разных замечания. А движок форума объединил их в один пост. :(

Автор: MetalFan 21.3.2012, 09:02
Народ, отдалились от темы)  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)