Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с масивом и строками 
V
    Опции темы
Canyon
Дата 19.3.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Мне нужно из нескольких 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)

PM   Вверх
Чучмек
Дата 19.3.2012, 11:57 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Поставь 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

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





--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Canyon
Дата 19.3.2012, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Цитата(Чучмек @ 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
PM   Вверх
Чучмек
Дата 19.3.2012, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Цитата(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 и приводит неявное преобразование, но такая запись сильно отличается от того, что создаст компилятор.



Это сообщение отредактировал(а) Чучмек - 19.3.2012, 13:01


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Canyon
Дата 19.3.2012, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Вот и появилась ошибка. Прочитал Ваше последнее сообщение и сразу увеличил кол-во символов строках и мне уже приложение выдает ошибку.
А что мне тогда подставить вместо 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);


Это сообщение отредактировал(а) Canyon - 19.3.2012, 13:11
PM   Вверх
Чучмек
Дата 19.3.2012, 14:02 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



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

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

setlength(OutStr,InStr.Count);





--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
bems
Дата 19.3.2012, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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

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

Добавлено через 9 минут и 52 секунды
Canyon, запись array of имеет разное значение в зависимости от контекста. Если она встречается в описании аргумента процедуры/функции это уже не динамический массив. Читать тут

Это сообщение отредактировал(а) bems - 19.3.2012, 22:19


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Чучмек
Дата 19.3.2012, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Цитата(bems @  19.3.2012,  22:18 Найти цитируемый пост)
Нет, это open array

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

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

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



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Canyon
Дата 19.3.2012, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Спасибо. Попробую прочитать завтра. с английским очень плохо.

Скажите как можно узнать сколько указателей у переменной STR?
PM   Вверх
bems
Дата 19.3.2012, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Canyon
Дата 20.3.2012, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Спасибо. Сегодня читал про High, но упустил из виду.

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

Спасибо тема решена.
PM   Вверх
northener
Дата 20.3.2012, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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

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


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 20.3.2012, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Почему попытка? помоему всё удалось и нормально работает, не?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
MetalFan
Дата 20.3.2012, 17:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



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

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



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Чучмек
Дата 20.3.2012, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



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

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


Это сообщение отредактировал(а) Чучмек - 20.3.2012, 23:04


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.