Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: длинные строки в консольном приложении  (Прочитано 17454 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
eugrita
Помогающий

ru
Offline Offline

« : 24-08-2013 00:55 » 

не очень понятно использование типа AnsiString в консольном приложении. С 1 стороны хочется иметь в консольном приложении длинную строку длиной более 255 символов.
Объявление var s:AnsiString компилятор пропускает
но вот на такой уже код
Код:
uses SysUtils;
var s1,s2: AnsiString;
 
begin
  writeln('vvesti 1 stroky');readln(s1);
  writeln('vvesti 2 stroky');readln(s2);
end.
компилятор говорит couldn't find a program
Если все readln заменить на read - будет работать.
Если заменить тип AnsiString на ShortString оставив readln - тоже будет работать.
В чем фишка?  Как вообще работает?  вроде AnsiString VCL-тип, а в консольнои VCL не подключена?
Очень надо иметь длинную строку до 1000 символов в консольном приложении
« Последнее редактирование: 24-08-2013 00:57 от eugrita » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 24-08-2013 04:10 » 

Посмотреть мануал, какие имено типы воспринимает функция readln. Кстати опиши задачу, в которой человека просиш вводить более 255 символов.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Гость
« Ответ #2 : 24-08-2013 04:30 » 

eugrita, смешно конечно, но ругань компилятора к коду никакого отношения не имеет. Отключи у себя антивирус - и программа скомпилируется. Просто данный код создает сигнатуру имеющуюся в антивирусной базе, вот антивирус и удаляет твой скомпилированный экзешник.
Что касается ограничения на 255 символов, так это проблема консоли, а не типа AnsiString и использование AnsiString эту проблему не решит.
Записан
eugrita
Помогающий

ru
Offline Offline

« Ответ #3 : 25-08-2013 20:56 » 

Задача вступительного экз.в аспирантуру ВМК
Написать программу, принимающую на вход строку, длина которой неизвестна.
Структура строки <последовательность>,<последовательность>
Последовательность состоит из прописных латинск.букв. Любая буква может повторяться в последовательности
не более 100 раз.Букве являющейся n-ой от начала алфавита соответствует число 6^n
Над перекодировать каждую из 2 последовательностей в числа , найти их сумму и вывести результат
в самой короткой из возможных форме. Запрещается использовать длинную арифметику.
Объем ОП должен быть оптимален и не зависеть от длины входной строки
Пример:  aabaabaa, baabbaa        Результат:  caaaa
----------------------------------------------------------------------------------------------------------------------------------------
Собственно  смутила меня формулировка "программу, принимающую на вход строку,"
Конечно эту задачу как и другие на обработку текста можно решать посимвольным считыванием. Тогда не нужно хранить весь текст в оперативной памяти. И вопрос отпадет. Правда при посимвольном вводе длинной последовательности придется после каждого набора буквы нажимать Enter -довольно противно.
Наверно хотят чтобы все таки сделал в посимвольной обработке  из за замечания оптимальности ОП.
Есть правда компромиссный вариант разбить длинную последовательность на части разумной длины, скажем не более 10 симв и вводить пока в одной не окажется запятая в строку ShortString .Но тогда еще надо добавить признак конца ввода 2-й последовательности, скажем, 0.
-------------------------------------------------------------------------------------------------------
А по замечанию zubr хотелось бы так думать, но отключил антивирус (стоит Comodo) ничего не изменилось. Правда GeekBuddy постоянно создает в памяти экземпляры процесса, но запускал в моменты когда тот еще не создал-тоже самое.
Насколько мог убедиться компилятор на другие синтаксич ошибки реагирует также, например объявить переменную типа множества, но оставить ее пустой и использовать в операторе...
И поведением антивируса не объяснить то почему уже в увеличенной проге заменив только лишь одно объявление AnsiString на ShortString программа идет. Дело видно в недопустимости AnsiString в консоли. Можно ли VCL подключить в консоли?
« Последнее редактирование: 25-08-2013 22:37 от eugrita » Записан
zubr
Гость
« Ответ #4 : 25-08-2013 23:00 » 

1. Какая связь типа AnsiString и VCL? VCL - это библиотека визуальных компонентов, а AnsiString - встроенный тип данных (по крайней мере то что представляет модуль System, хотя его можно отключить, то есть подключить свой).  Разница между переменными следующая:
Переменная ShortString будет содержать массив байтов, где первый байт - длина строки, последующие байты - символы строки. Переменная AnsiString будет содержать указатель на строку, типа сишного char* или дельфийскокго PChar. Память под строку компилятор выделяет динамически и по необходимости (например при конкатенации) меняет ее размер.
2. Сообщение "couldn't find a program" - это не сообщение компилятора, а сообщение отладчика среды разработки. То есть на стадии запуска приложения из среды разработки самого исполняемого файла уже нет, его кто то удалил.
3. У меня на компе DrWeb - и я получаю тот же эффект при включенном антивирусе. При отключении все нормально компилируется с типом AnsiString, что и должно быть. Почему антивирус пропускает с ShortString и не пропускает с AnsiString? Да потому что бинарный код получается разный, а АВ просто тупо находит в бинарном коде сигнатуру, которая у него есть в базе.
4. Вот скомпилированная в Delphi7 твоя программка с типом AnsiString. Пробуй запустить с отключенным АВ или на другой машине, где нет АВ.

* Project1.rar (19.9 Кб - загружено 872 раз.)
« Последнее редактирование: 25-08-2013 23:08 от zubr » Записан
eugrita
Помогающий

ru
Offline Offline

« Ответ #5 : 26-08-2013 05:59 » new

По поводу отключения антивируса-   удалил из автозагрузки Start GeekBuddy,
затем вручную в списке служб остановил все службы, связанные с Comodo т GeekBuddy
Проверил - в списке процессов нет, но не фига не работает. Т.е. при нажатии на Build или
Build All Projects exe не создается.
Записан
zubr
Гость
« Ответ #6 : 26-08-2013 06:53 » 

При компиляции какие ошибки выдает?
Мой экзешник работает?
Записан
zubr
Гость
« Ответ #7 : 26-08-2013 06:55 » 

Ну так ты в теме https://forum.shelek.ru/index.php/topic,29530.0/topicseen.html сам подтверждаешь вину АВ.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines