Помощь начинающему

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Re: Помощь начинающему

Сообщение Little_Roo » 07.01.2013 00:29:05

nikolay61 писал(а):то то не так работает. Слово не выдает.

а чего выдавать то ??? оператор write подразумевается как идеология новых компьютеров - чтение мыслей программиста??? :D
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Помощь начинающему

Сообщение Putnick » 07.01.2013 11:43:10

Мне кажется, было бы логичнее перебирать символы из более короткой строки, обрезая более длинную и не забывая "выпадать" из цикла при совпадении символов (иначе обрежем строку по последнему совпадению):
Код: Выделить всё
for j:=1 to m do
  for i:=1 to length(a) do
    if a[i]=b[j] then begin
      d:=d+a[i];
      delete(a,1,i);
      break
    end;

Предлагаемый Вами вариант имеет следующие недостатки:
1. Поскольку у Вас длина строки b постоянно меняется, то и цикл нужно делать не до m, а до length(b), а то словите исключение или ошибку (мало ли что в "мусоре" за границей строки может быть - тут всё от настроек компилятора зависеть будет):
Например, введите:
Код: Выделить всё
a:='aaaaaa'
b:='aa'

в Вашем варианте
Код: Выделить всё
d:='aaaaaaaaaaaa'
- если не учтёте пункт №2, или
Код: Выделить всё
d:='aaaaaa'
- если учтёте.
Если компилятор не "взбрыкнет" на выходе за границу строки,то последние 10(4) символов(-а), как раз из "мусора" и соберутся.
2. Из-за отсутствия оператора break в блоке условия вы будете собирать последовательно все совпадения, да ещё и прихватывать "мусор" (т.к. не будете успевать пересчитать длину строки):
при
Код: Выделить всё
a:='asaa';
b:='asa'
,
вы будете получать
Код: Выделить всё
d:='aaas'
- если учтёте пункт №1, или
Код: Выделить всё
d:='aaasaaaa'
- если не учтёте.
Putnick
новенький
 
Сообщения: 62
Зарегистрирован: 18.03.2009 13:02:56

Re: Помощь начинающему

Сообщение Oleg_D » 07.01.2013 13:34:47

Leon писал(а):2.Сравнивать по компонентам R c R,G c G,B c B. Но тогда как все свести воедино? Пропорции ведь окажутся разными,а как сделать вывод о схожести в цифровом виде?

Можно трактовать цвет как вектор в трёхмерном пространстве (R,G,B). Разность между двумя векторами вычисляется по теореме Пифагора, т.е. квадрат разности равен:
Sqr(R-R1) + Sqr(G-G1) + Sqr(B-B1)
Стало быть, вычисляем два таких квадрата и сравниваем:
IF (Sqr(R-R1) + Sqr(G-G1) + Sqr(B-B1)) < (Sqr(R-R2) + Sqr(G-G2) + Sqr(B-B2)) THEN ... { первый цвет ближе }

Добавлено спустя 4 часа 57 минут 18 секунд:
nikolay61 писал(а):{ Заданы 2 слова a и b. Можно ли получить из слова a, вычеркивание некоторого кол-ва букв, слово b. }


Вот такое решение пришло в голову:

Код: Выделить всё
{ Условие: даны две строки, можно ли удалением символов из первой строки получить вторую ? }

function Test(A: string; const B : string): boolean;
var i : integer;
begin
  for i:=1 to Length(B) do begin
    while Length(A)>Length(B) do begin
      if A[i] <> B[i]
        then Delete(A,i,1)
        else Break
    end;
  end;
  Test:= Pos(B, A) > 0;
end;

var X, Y : string;

begin
  Write('Большая строка X= '); Readln(X);
  Write('Малая строка   Y= '); Readln(Y);
  Writeln(Test(X, Y));
  Readln;
end.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Помощь начинающему

Сообщение Leon » 16.01.2013 00:28:14

Тут такая заморочка.StringGrid заполняется автоматически по данным от аналогово-цифрового преобразователя.Случается,что последний дает сбои и процесс дохнет.Таблица по-аварийному сохраняется в файле
и после перезапуска программы прям в процедуре FormCreate снова считывается в таблицу.Так что когда открывается форма,таблица оказывается заполнена теми данными,которые уже удалось снять.Можно продолжать дальше.Да вот незадача.Требуется,чтобы фокус ввода автоматом выставился на следующей пустой ячейке.А он почему-то всегда стоит в позиции (1,1).Только щелчек мыши выбирает фокусируемую ячейку правильно.
Пробовал уже и StringGrid1.Row:=A;(например),StringGrid1.Col:=B,где А и В найденная требуемая ячейка.
Пробовал также StringGrid1.Selection:=TGridRect(Rect(В,А,В,А)) и ничего.Фокус упорно ставится в начало таблицы и только мышь исправляет дело.Притом компилятор никакой ошибки кода не выводит.

Что я не так делаю?
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Помощь начинающему

Сообщение Stilet » 16.01.2013 17:56:51

Всем привет,люди подскажите пожалуйста из за чего может возникать ошибка программы?при повторной компиляции в окне Free Pascal,если при первом запуске все работало??И из рабочей папки программа тоже запускается,а вот в окне паскаля после сохранения глючит и выдаёт ошибку (14,1)Error:Can’t create object file: c:\user\интернет\desktop\pascal\proga1.exe.
(14,1)Error:Can’t create executable c:\user\интернет\desktop\pascal\proga1.exe.
Fatal: Compilation aborted . (14,1)=End.
Stilet
незнакомец
 
Сообщения: 1
Зарегистрирован: 27.05.2012 17:53:09

Re: Помощь начинающему

Сообщение Oleg_D » 17.01.2013 08:32:32

Stilet писал(а):(14,1)Error:Can’t create executable c:userинтернетdesktoppascalproga1.exe.
Fatal: Compilation aborted . (14,1)=End.

А в момент компиляции исполняемый файл уже не был запущен (автономно)?

Добавлено спустя 2 часа 10 минут 44 секунды:
Leon писал(а):Требуется,чтобы фокус ввода автоматом выставился на следующей пустой ячейке.

А зачем? Ведь для заполнения ячеек этого не нужно.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Помощь начинающему

Сообщение Leon » 17.01.2013 14:13:46

В принципе уже все раскопал.Просто в дебрях кода хранилась еще одна команда,где фокус и сбрасывался в 1,1.
Я ее только пошаговым отладчиком выловил.
Теперь еще одна задача и мне пока невдомек почему так происходит.Забиваю,значит я свою табличку данными из АЦП.При завершении заполнения таблички вызывается подпрограмма цветовой раскраски ячеек в зависимости от их содержимого.Процедурка в принципе немудреная,примеров кода в Интернете не скупо.Ну вот мой.

procedure TForm2.Raskraska;//раскраска ячеек соответственно значения
var yac:TRect;
r,c:byte;//строки,колонки таблицы
u:byte=0;
begin
With StringGrid1 do
begin
for c:=14 downto 1 do for r:=5 downto 1 do //в таблице 14 колонок в 5 строк
begin
yac:=CellRect(c,r);//определяем текущую ячейку
u:=strToint(Cells[c,r]);//считываем с нее данные и преобразуем в чисельный вид
case u of //и анализируем..
1..8:Canvas.Brush.Color:=$00FFFFAA;
9..16:Canvas.Brush.Color:=clLime;
17..24:Canvas.Brush.Color:=clRed;
25:Canvas.Brush.Color:=$00DF00DF;
end;
Canvas.FillRect(yac);//здесь ячейку и красим
// Canvas.TextOut(yac.Left+3, yac.Top+3, Cells[c,r]);// это вариант кода 1
// Canvas.TextRect(yac,3,3,Cells[c,r]);// а это вариант кода 2
update;
end;
end;
end;

Ну вот.После того как данные АЦП полностью заполнят табличные ячейки,вызывается эта раскрасочная процедура,все красится,все красиво.По ходу дела табличка сохраняется в файл командой StringGrid1.SaveToFile('tabl.dat');

И вот когда я захожу в программу повторно,на форме есть кнопочка "Прочитать из файла".То бишь кнопочка командой StringGrid1.LoadFromFile('tabl.dat') считывает данные в пустую табличку.Но вызванная вслед за ней процедура раскраски делает абракадабру.Ячейки она красит правильно,но текста не видно.Только щелчок мышкой на ячейке возвращает ей ее "природний" белый цвет и проявляет содержимое.Это,когда я пользуюсь вариантом кода вывода текста №2 (Canvas.TextRect(yac,3,3,Cells[c,r]);// а это вариант кода 2).
Если же используется вариант №1 (Canvas.TextOut(yac.Left+3, yac.Top+3, Cells[c,r]);) текст все-таки выводится.
Жирные красные цифры,которые при закраске ячейки красным,снова же-таки не видны.Что делать - пока не второпаю... :shock:

Добавлено спустя 29 минут 29 секунд:
Stilet иногда в паскалевских программах бывают такие заморочки.И вот,что я могу сказать из своего опыта.
1.Если прога раньше компилировалась нормально,а теперь капризится,проверь в диспетчере процессов (Ctrl+Alt+Del),может она уже раз запускалась и там висит работающая ее копия.Если да - закрой процесс проги прям в диспетчере и попробуй компилировать снова.
2.Иногда Паскаль капризится,встретив кирилицу в прописях путей к файлам.Попробуй заменить свой "интернет" на "internet".Старайся,чтобы пути к исполняемым файлам были короткими.Не любит Паскаль длинных путей,а еще если в именах есть пробелы,так вообще капец...
3.Бывает все вроде бы сделал,а компиляция не идет.Чисто случайно выловил,если файл с кодом открываешь в постороннем (не паскалевском) редакторе и что-то там правишь,а потом сохраняешь файл,компилятор потом выдает непонятно откуда берущиеся ошибки.Просто некоторые посторонние редакторы вносят в текст невидимые символы на которых компилятор и спотыкается.У меня нередко такие конфликты случались с всеми любимыи Блокнотом.После правки кода в Блокноте плевался не только Паскаль 7,но и ранние версии Делфи и Лазаруса.С тех пор я и не рискую.
Попробуй выделить весь текст (Ctrl+A),скопируй его и перенеси в какой-нить простенький редактор,не поддерживающий никакого форматирования.Битый некомпилирующийся файл закрой и переименуй,но не удаляй.Вдруг он еще понадобится.Открой новый файл под тем же именем,что был только что переименованый
и перенеси в него код из сохраненного файла простенького текстового редактора.А теперь попробуй компилировать снова.У меня бывало получалось.Малость заморочливо,кто-нить может подскажет что проще.Но морока того стоит,если код большой и переписывать все заново ой как нудно... :(
Кроме того советую тебе взять за моду хороший программистсткий прием.Когда ты редактируешь программу,в конце работы назови ее как-нить понятливо,например Prog1601_1520,что означает: версия кода по состоянию на 16 января 15 часов 20 минут.Повторно приступая к работе,скопируй всю папку и продолжай работу с копией.Если ты че-нить запартачишь,у тебя всегда будет подстраховкой сохраненная предыдушая версия.И никогда не продолжай редакционной работы с работающей версией.всегда работай с копией.Поверь,боль потери всегда будет меньше.Удачи! :lol:
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Помощь начинающему

Сообщение Leon » 26.01.2013 14:42:40

Как я понял программирование без всяких там козней и подводных камней не обходится :((
Уважаемые эксперты,подскажите что не так.
В таблице StringGrid у меня имеется список каталогов,который я могу выбирать свободно.Это - каталоги с фотографиями.На форме есть объект Image1 и есть у этого объекта процедура OnMouseDown.
При выборе в таблице некоего каталога первое фото из него отображается в Image1.
Нужно Opendialog'ом открыть этот каталог и посмотреть все остальные фотки.Опендиалог открывается щелчком мышки на Имидже.
Код:
procedure Image1.OnMouseDown(.....);
begin
OpenDialog1.InitialDir:='C:/Foto/'+StringGrid1.Cells[Col,Row);
OpenDialog1.Execute;
end;


Первый вызов идет нормально.Но стоит мне переместиться в табличке на несколько позиций ниже-выше и Опендиалог дает сбой.То есть фотка в имидже открывается правильно,а Опендиалог открывает преждний, чужой то есть,каталог.Притом параметры для InitialDir передаются правильно.В отладчике проверял.Что за фича?
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Помощь начинающему

Сообщение Leon » 21.02.2013 18:53:38

Задача,которую в Лазарусе пока не осилил.Мастера,подскажите как выйти из ситуации,плиз.
Итак есть изображение BMP формата,которое лазаровской программой нужно перебить в GIF.
В сети нашел ссылки на некий делфовский модуль TGIFImage и даже откопал его в загранице.Но Лазарус работать с ним не хочет,пишет чего-то там ему не хватает и он не знает где его взять.Как быть? Возможна ли конвертация графики в Лазарусе? Или это удел фантастики? Будет большое спасибо,если кто не поскупится примером реального кода.
Leon
новенький
 
Сообщения: 65
Зарегистрирован: 30.03.2011 09:27:02

Re: Помощь начинающему

Сообщение serg134 » 23.02.2013 11:49:21

Здравствуйте всем....скажите мне пожалуйста....я сам решил начать учиться программированию...и мне подсказали что лучше начинать с турбо паскаля 7.0....но он на моем буке не работает...т.к. у меня 64 бит (не имею опыта выразиться правильно) теперь подсказали что фрии паскаль подойдет для бука....не хочу делать лишних движений поэтому задам вопросы знающиму:

1Фрии паскаль это тоже самое что и турбо паскаль 7.0?
2 Можно ли выполнить все что в турбо паскале 7.0....могу ли я дальше по книге турбо паскаль 7 0 работать во фрии паскале
serg134
незнакомец
 
Сообщения: 4
Зарегистрирован: 23.02.2013 11:34:08

Re: Помощь начинающему

Сообщение Vadim » 23.02.2013 12:19:47

serg134 писал(а):и мне подсказали что лучше начинать с турбо паскаля 7.0

Над Вами жестоко посмеялись. Дело в том, что такой вариант был актуален для древних компьютеров, но никак не для нынешних.
serg134 писал(а):1Фрии паскаль это тоже самое что и турбо паскаль 7.0?

По языку - почти да. В Turbo Pascal не было, к примеру, классов, а во FreePascal они есть. Можно пользоваться книжками по TurboPascal для обучения, если речь идёт не об объективно-ориентированном программировании и работе с памятью. Однако лучше скачать книжки с нашего сайта:
http://www.freepascal.ru/article/book/
или пользоваться книжками по Delphi. Delphi - тоже основан на языке Pascal.
serg134 писал(а):Можно ли выполнить все что в турбо паскале 7.0

Почти всё, кроме:
- того, что относится к объектно-ориентированному программированию;
- того, что относится к непосредственной работе с памятью. Например указание адресов памяти и т.п.
Кроме того, в книжках по TurboPascal ничего не говорится про работу с базами данных. На сегодняшний день незнание этой темы полностью закрывает путь программисту к работе в более-менее оплачиваемых проектах.
могу ли я дальше по книге турбо паскаль 7 0 работать во фрии паскале

Можно, но крайне вдумчиво и с большой осторожностью, учитывая то, что написано выше.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Помощь начинающему

Сообщение serg134 » 23.02.2013 12:53:16

Тогда подскажите с чего начинать самообучение программированию...дайте ссылки или книги пожалуйста
serg134
незнакомец
 
Сообщения: 4
Зарегистрирован: 23.02.2013 11:34:08

Re: Помощь начинающему

Сообщение Paster Fob » 23.02.2013 13:15:06

Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Помощь начинающему

Сообщение Vadim » 23.02.2013 19:46:32

serg134 писал(а):дайте ссылки или книги пожалуйста

Увы, в Вашем случае всё бесполезно. Я Вам дал ссылку на книги, а Вы её даже не заметили. Вам уже ничего не поможет... :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Помощь начинающему

Сообщение serg134 » 24.02.2013 15:32:47

Paster Fob спасибо за помощь. вопрос стал в другом теперь - не получается скачать free pascal на оф сайте. подскажите где скачать.

Добавлено спустя 33 секунды:
нужна для 64 бит

Добавлено спустя 2 часа 6 минут 5 секунд:
нашел поставил но вот что вышло в итоге

Скачал fpc-2.6.0.x86_64-win64.exe 18мег
Хочу программить(новичек), после установки ярлык на рабочем столе не создался. В директории установки ppcrossx64.exe запускаю - консоль, ***press enter***в три страницы напичкана. Читаю - вышел новый компилятор 2.6.0 типа этот,но вначале установки написано "Free Pascal x64 Setup" Что докачать нужно чтоб я смог!

Добавлено спустя 16 минут 53 секунды:
Начал читать книгу Песни о паскале...но очень нужно что бы заработал паскаль на моем компе 64 бит с 7 виндой, отзовитесь пожалуйста
serg134
незнакомец
 
Сообщения: 4
Зарегистрирован: 23.02.2013 11:34:08

Пред.След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru