| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Array of String |
| Автор: Nic442 5.4.2006, 00:50 | ||
Надо создавать массив, но неисвестно его количество. Т.е. количество элементов будет наращиваться по одному и неизвестно конечное. Я бы, конечно мог, ограничить его 1000 но просто его надо будет очищать, причем очень часто. И если в массиве будет один элемент, то нецелессообразно гнать цикл до 1000. Я понимаю, что нужны указатели, но плохо их знаю. Можите привести пример заполнения массива?
|
| Автор: Poseidon 5.4.2006, 00:57 | ||
Массив будет от 0 до Length(struct_name)-1 |
| Автор: Nic442 5.4.2006, 01:11 |
| ВОТ СПАСИБО. Я даже не ожидал, что обойдётся без указателей. СПАСИБО А можно ещё вопрос: Как string запихнуть в буфер? (Вы просто так быстро ответили :-) ) |
| Автор: Poseidon 5.4.2006, 01:17 | ||
| Один топик - один вопрос! Следуй этому правилу ;) PS Как я понимаю "буфер" - это буфер обмена. Добавь в uses Clipbrd и вот так добавляй
|
| Автор: Nic442 5.4.2006, 01:25 |
| СПАСИБО Тогда вопросов больше не имею. Ещё раз спасибо. {Close Theme} |
| Автор: Alex 5.4.2006, 08:37 | ||
Хотелось бы сделать небольшое уточнение про заполнение массива, т.к. кол-во элементов в массиве перед выполнением цикла нам известно заранее, то нет необходимости увеличивать размер массива в цикле (это очень не эффективно на больших массивах), лучше выставить требуемый размер массива до цикла:
|
| Автор: Marriage 5.4.2006, 08:45 | ||
И обращаться как sl.Strings[0] ,sl.Strings[1] по индексам. При чем можешь сразу же сохранить фсе это в файл sl.SaveToFile или загрузить sl.LoadFromFile |
| Автор: Nic442 5.4.2006, 12:31 | ||
| Я понимаю, что лучше выносить функции за цикл. SetLength(struct_name, col+1); Но в любом случае у меня получится в цикле. Дело в том что у меня цикл в цикле. Но вот опять возник вопрос по теме. А как мне очищать массив, чтобы количество элементов стало равно 0?
|
| Автор: Romikgy 5.4.2006, 12:43 |
| через это нельзя Nic442, |
| Автор: Alexeis 5.4.2006, 12:49 | ||||
struct_name := Nil; для строки struct_name[i] := ''; Добавлено @ 12:51 Вообще странный цикл
|
| Автор: Moskalev 5.4.2006, 13:00 | ||
Я сам всегда делал:
но думаю, что это не правильно (не совсем правильно по нормам языка, ведь есть nil) |
| Автор: ~FoX~ 5.4.2006, 13:02 |
| Moskalev, Как задача поставлена, так ее и решают! Добавлено @ 13:06 только вот я не понял, а чем собствено TStrings, TStringList не устраивает, зачем велосипед то изобритать? |
| Автор: Nic442 5.4.2006, 13:26 | ||||||||
Romikgy
А как передавать массив в функцию, и в функции добавлять к нему элементы?
|
| Автор: ~FoX~ 5.4.2006, 13:35 |
| В функцию ты не можешь передавать массив, только указатель на него.... |
| Автор: Демо 5.4.2006, 13:57 | ||||
Ну почему, по ссылке массив можно передать и работать с ним:
|
| Автор: Alexeis 5.4.2006, 14:06 | ||
Демо,
а это разве не тоже самое что передавать указатель |
| Автор: Демо 5.4.2006, 14:09 |
| Конечно, нет. |
| Автор: Nic442 5.4.2006, 14:10 | ||
|
| Автор: Демо 5.4.2006, 14:13 |
| ~FoX~, Кстати, и возвращать массив из функции тоже можно. |
| Автор: ~FoX~ 5.4.2006, 14:22 | ||
А что такое var???? |
| Автор: Romikgy 5.4.2006, 14:23 |
| попробуй, узнаешь , что намного проще чем тебе изобретать велосипед |
| Автор: Alexeis 5.4.2006, 14:31 |
| Демо, Как же нет, при передаче через var парамет реально передается ссылка (т.е. указатель) на эту переменную, просто доступ к нему осуществляется как к уже к разименованному, а по сути это все одно и тоже. |
| Автор: Romikgy 5.4.2006, 14:38 |
| ~FoX~, procedure FillStrArray(var sa: TStrArray; Size: Integer); это ? если да то это обозначает что переменая может изменится и в измененом состоянии вернутся в основную программу |
| Автор: ~FoX~ 5.4.2006, 14:43 | ||
| [OFFTOP] Romikgy,
[/OFFTOP] |
| Автор: Nic442 5.4.2006, 14:45 | ||
Так мой код нормальный? В основную программу функция ничего не долна возвращать. Она должна принимать статический массив, и если что-то находит то дополнять его и осуществлять с ним нужные операции.
|
| Автор: Romikgy 5.4.2006, 14:48 |
| ~FoX~, ну и что я не правильно сказал? |
| Автор: Демо 5.4.2006, 14:48 | ||
| alexeis1, Разименуй плиз здесь и выполни те же функции, что и в FillStrArray выше:
|
| Автор: Poseidon 5.4.2006, 14:53 |
| не нормальный! Во первых ругнется компилятор на то, что нет результата у функции. Во вторых не обьявлена hight_mas. В-третьих послушай совета Алекса и выдели память под массив до начала его заполнения, а не в цикле. Это так, при первом осмотре... |
| Автор: ~FoX~ 5.4.2006, 14:59 |
| Попробуй откомпили и посмотри.....что скажет компилятор..... Добавлено @ 14:59 ой, не успел |
| Автор: Демо 5.4.2006, 15:37 | ||
Параметр передается по-ссылке, но ссылка и указатель - суть разные вещи. Ссылка - адрес. Указатель - переменная. т.е. Указатель может содержать ссылку, но не наоборот, и тождества между ними нет. PS. Забыл добавить - это мое мнение-) |
| Автор: Yanis 5.4.2006, 16:01 | ||||||||||
| Так же это можно сделать ещё двумя способами:
Здесь нет ничего странного. Delphi (да и Pascal кажется тоже) позволяет использовать циклы "наоборот", т.е. с уменьшением счётчика. А на месте слова down должно в твоём случае быть downto Интересно было бы узнать откуда у вас такая информация, потому что у меня есть подозрения, что ты неправ.
Как я уже сказал можно и SetLength использовать.
Демо прав. Ссылка это не тоже самое, что и указатель. Кто хочет попорить, прошу. Можно возвращать ссылку или указатель!
Добавлено @ 16:01 2 Демо Блин опередил Добавлено @ 16:02 Редиска |
| Автор: Nic442 5.4.2006, 17:55 | ||
Буду исправлять код. Будут вопросы обязательно напишу.
Это исправлю. |