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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2011, 22:30   #11
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Если уж совсем точно:

"One or more lines were too long and have been truncated" - выдаётся редактором среды при попытке обработать файл со строками длиннее, кажется, 4096 символов. Это есть в любой Delphi и относится только к работе текстового редактора IDE. Это не имеет отношения конкретно к строковым константам, а ссылается на строки в файле вообще. Т.е. если вы весь код в .pas файле запишете в одну строку (которая получится длиннее 4096 символов), то получите такую ошибку, даже если строк вы в коде не используете.

"String too long" или "String literals may have at most 255 elements" - выдаётся компилятором Delphi при обработке строковых литералов длиннее 256 символов. К самой строковой константе или строке это не имеет никакого отношения. Она ограничивается только естественными пределами.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 16.01.2011, 23:42   #12
maloy_ya
Пользователь
 
Регистрация: 09.07.2010
Сообщений: 59
По умолчанию

он пишет не 4096 а 1023...но это не суть по итогам обсуждения я так понимаю вариантов у меня нет??
maloy_ya вне форума Ответить с цитированием
Старый 16.01.2011, 23:52   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
но это не суть по итогам обсуждения я так понимаю вариантов у меня нет??
с точностью до наоборот.
В результате обсуждения сказано,что Вам достаточно ваши 3500 строк разбить по десятку-два слов в одной строчке программного кода и всё должно пройти компиляцию.
Код:
const
  ish : array [0..3499] of string = 
  ('xxxx','sadd','zef','xef','vits','bits','zech','x ech', 
   'ddsx','dxxd','efxx','xef','vits','bits','pech','tech', 
   'wssx','axwe','edfx','fref','vits','bits','oxch','xch', 
   ...........
);
и если строчки у Вас небольшой длины, то лучше ограничить размер строковой константы.
Допустим, если в ваших строчка не может быть строк длинее 10 символов, тогда уместнее:
Код:
const
  ish : array [0..3499] of string[10] =
  ('xxxx','sadd','zef','xef','vits','bits','zech','x ech',

А вообще, неужели удобно такую огромную массу в код засовывать? неужели во внешнем файле или ресурсе это было не проще хранить,
редактировать, грузить и т.д. и т.п...

Последний раз редактировалось Serge_Bliznykov; 16.01.2011 в 23:57.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.01.2011, 00:33   #14
maloy_ya
Пользователь
 
Регистрация: 09.07.2010
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
с точностью до наоборот.
В результате обсуждения сказано,что Вам достаточно ваши 3500 строк разбить по десятку-два слов в одной строчке программного кода и всё должно пройти компиляцию.
Код:
const
  ish : array [0..3499] of string = 
  ('xxxx','sadd','zef','xef','vits','bits','zech','x ech', 
   'ddsx','dxxd','efxx','xef','vits','bits','pech','tech', 
   'wssx','axwe','edfx','fref','vits','bits','oxch','xch', 
   ...........
);
и если строчки у Вас небольшой длины, то лучше ограничить размер строковой константы.
Допустим, если в ваших строчка не может быть строк длинее 10 символов, тогда уместнее:
Код:
const
  ish : array [0..3499] of string[10] =
  ('xxxx','sadd','zef','xef','vits','bits','zech','x ech',

А вообще, неужели удобно такую огромную массу в код засовывать? неужели во внешнем файле или ресурсе это было не проще хранить,
редактировать, грузить и т.д. и т.п...
вожможно вы правы!!но ведь гораздо проще работать с массивом чем ворочать файл??я могу ошибаться конешно!!спасибо за варианты буду пробовать....
maloy_ya вне форума Ответить с цитированием
Старый 17.01.2011, 01:09   #15
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от cosmic_call Посмотреть сообщение
но тем не менее с точки зрения экономии лучше так делать чем не делать
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
и если строчки у Вас небольшой длины, то лучше ограничить размер строковой константы.
Поздравляю, вы только что удвоили размер необходимый для хранения данных, плюс замедлили выполнение программы.

Домашнее задание: объяснить почему.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 17.01.2011 в 01:12.
GunSmoker вне форума Ответить с цитированием
Старый 17.01.2011, 04:07   #16
maloy_ya
Пользователь
 
Регистрация: 09.07.2010
Сообщений: 59
Радость

ну на самом деле помогло компилятор пропустил все заработало!!!спасибо огромное!!а домашнее задание я бы послушал с удовольствием так как я сам его сделать не смогу!!
maloy_ya вне форума Ответить с цитированием
Старый 17.01.2011, 05:12   #17
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Увеличение размера: потому что ShortString (а любая строка вида String[20] есть ShortString) занимает фиксированный объём в памяти вне зависимости от размера ваших данных.

Иными словами, если в String[20] записать строчку 'xyz', то у вас будет занято 20 + 1 = 21 байт памяти (1 байт на длину строки), даже хотя вам надо всего 3 байта на данные. Если же вы используете String, то у вас занято только 3 + 4 + 4 = 11 байт памяти (4 байта на длину и ещё 4 - на счётчик ссылок).

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

К примеру, ShowMessage(S) - если S - это String, то действий никаких нет: S передаётся в ShowMessage как есть. Если же S - это ShortString, то прежде чем можно было вызвать ShowString, компилятор вынужден вставлять скрытый вызов типа UStrFromString (в каждой версии Delphi разный), который преобразует строку ShortString в String. Если подобное обращение к ShortString встречается в цикле... ну, вы только что здорово насорили.

Это уже не говоря про то, что ShortString не может хранить Unicode символы!
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 17.01.2011, 07:08   #18
maloy_ya
Пользователь
 
Регистрация: 09.07.2010
Сообщений: 59
По умолчанию

Ёшкин кот!дико извиняюсь за нестандартную лексику но просто другого ничего не пришло в голову!!спасибо всем за полезную информацию и за помощь в написании программы!!результат достигнут тему можно закрывать!!
maloy_ya вне форума Ответить с цитированием
Старый 17.01.2011, 08:25   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

GunSmoker, спасибо, познавательно. Учту на будущее.

NB.
Цитата:
даже хотя вам надо всего 3 байта на данные
если мне нужно 3 байта на данные, я поставлю string[3] - 4 байта всё поменьше, чем 11 байт (почти в три раза). Это раз. Второе - отсутствие поддержки Unicode - не всегда минус (если мне нужно хранить ТОЛЬКО маленькие английские буквы и цифры (нижнюю половину таблицы ASCII) - то я экономлю ещё в два раза больше памяти + (я не проверял, но чисто предположительно) скорость обработки текста не уникодного не медленее, чем уникодного. По поводу счётчика ссылок и длины строки - в случае, если я использую константный массив, я же надеюсь, что он у меня в программе не будет изменяться.. (кстати, многие компиляторы Pascal, в отличие от Delphi - не позволяют изменять значения, заданные в секции Const). Кроме того, использовав ShortString я сразу отрубаю менеджер слежения за использованием моих строк, что тоже хорошо (в данном случае, конечно).

Но в целом я согласен с Вашим замечанием.
(и вообще, на самом деле всё не так, как кажется ).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.01.2011, 08:32   #20
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
(и вообще, на самом деле всё не так, как кажется ).
А на самом деле вся эта микрооптимизация не нужна.

А вот отсутствие совместимости с String/PChar и отсутствие поддержки Unicode в D2009+ - вполне реальные факторы. Потому что можно забыть, что это у тебя ShortString, и ненароком "чего не то" с ней сделать, что ты обычно делаешь с обычной строкой. И долго-долго потом искать глупую ошибку.

В общем, грабли на пустом месте себе лучше не создавать. В конце-концов, это backward-compatibility only.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли написать игру на Delphi типа S.T.A.L.K.E.R и GTA4 VintProg Gamedev - cоздание игр: Unity, OpenGL, DirectX 71 21.09.2011 04:03
Отображение значений переменных типа float и double(Языки Pascal и C) Сырно Помощь студентам 3 17.10.2010 18:37
Сохранение и загрузка в файл текстовых значений и значений типа Boolean krikaved Общие вопросы Delphi 1 16.03.2010 07:53
Как можно взять кусок чужой страницы и засунуть его на свою? wis239 PHP 7 12.02.2009 18:11
можно ли DBF засунуть в ADOQuery? Abbatik БД в Delphi 3 28.01.2008 10:26