Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: [Lazarus] Не изменяется переменная  (Прочитано 2124 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
[Lazarus] Не изменяется переменная
« : 27 Августа 2010, 14:04:52 »
Столкнулся с проблемой. Написал такой код
Код: (pascal) [Выделить]
procedure SettingsSave(Find, Value : ansistring);
var S : ansistring;
    Flag : boolean;
    SettingsFile, SettingsFileOld : TextFile;
begin
   S := '';
   Flag := False;
   AssignFile(SettingsFile, 'some.conf');
   AssignFile(SettingsFileOld, 'some.conf.old');
   Rewrite(SettingsFile);
   Reset(SettingsFileOld);
   while not eof(SettingsFileOld)  do
      begin
         readln(SettingsFileOld, S);
         if (Pos(Find + '=', S) <> 0) then
            begin
               Flag := True;
               S := Find + '=' + Value;
            end;
         writeln(SettingsFile, S);
      end;
   if Flag <> True then writeln(SettingsFile, Find + '=' + Value);
   Close(SettingsFile);
   Close(SettingsFileOld);
end;
Смысл его в том, чтобы при нахождении определенной строки в конфигурационном файле переписывать ее, в ином случае дописывать. Но проблема в том что переменная Flag не изменяется, и по этому строка
Код: (pascal) [Выделить]
   if Flag <> True then writeln(SettingsFile, Find + '=' + Value);не работает. Может кто подсказать где я туплю?
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: [Lazarus] Не изменяется переменная
« Ответ #1 : 27 Августа 2010, 14:38:43 »
я не особо силен в pascal

1. вы можете перед этой строкой сделать вывод этой переменной и посмотреть какое она имеет значение
2. в паскале нет операции "!="? Не то "<>" для переменной такого типа как то не айс ИМХО, лучше уж Flag = False
« Последнее редактирование: 27 Августа 2010, 14:40:29 от Владимир Николаевич »

Оффлайн vanili

  • Участник
  • *
  • Сообщений: 142
    • Просмотр профиля
Re: [Lazarus] Не изменяется переменная
« Ответ #2 : 27 Августа 2010, 14:49:31 »
!= - это из Си, в Паскале именно <>. Только вот к переменным буленовского типа такое применять нельзя (по крайней мере в fpc только что протестил). Так что поддерживаю предыдущего оратора -
If Flag=False ...

Оффлайн Guranvir

  • Участник
  • *
  • Сообщений: 195
    • Просмотр профиля
    • Блог начинающего линуксоида
Re: [Lazarus] Не изменяется переменная
« Ответ #3 : 27 Августа 2010, 18:40:46 »
Можно еще if not flag then тра ля ля

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
Re: [Lazarus] Не изменяется переменная
« Ответ #4 : 27 Августа 2010, 20:49:17 »
до этого была проверка if Flag = False then writeln(SettingsFile, Find + '=' + Value); но результат функции от этого не менялся.

просмотрел значение переменной. меняется. но запись в фаил не происходит. оО
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: [Lazarus] Не изменяется переменная
« Ответ #5 : 27 Августа 2010, 21:05:24 »
ZwS, опиши сам алгоритм, а не цель алгоритма.

Просто я не понял почему у тебя в цикле переменная не возвращается в false. Естественно, что после цикла она всегда будет true и:
if Flag <> True then writeln(SettingsFile, Find + '=' + Value);никогда не сработает.
« Последнее редактирование: 27 Августа 2010, 21:09:53 от Protopopulus »
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн Guranvir

  • Участник
  • *
  • Сообщений: 195
    • Просмотр профиля
    • Блог начинающего линуксоида
Re: [Lazarus] Не изменяется переменная
« Ответ #6 : 27 Августа 2010, 21:31:19 »
Ну похоже того такой подстроки просто нет в файле

Оффлайн vanili

  • Участник
  • *
  • Сообщений: 142
    • Просмотр профиля
Re: [Lazarus] Не изменяется переменная
« Ответ #7 : 27 Августа 2010, 23:10:12 »
она всегда будет true и:
if Flag <> True then writeln(SettingsFile, Find + '=' + Value);никогда не сработает.

На сколько я понял, в этом и заключается смысл: если строка Find + '=' найдена в файле, то она заменяется на Find + '=' + Value, при этом изменяется значение флага, в противном случае, значение флага не меняется, что и ведёт к добавлению Find + '=' + Value в конец файла.
« Последнее редактирование: 27 Августа 2010, 23:31:36 от vanili »

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1695
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: [Lazarus] Не изменяется переменная
« Ответ #8 : 27 Августа 2010, 23:22:23 »
Как вариант - попробовать:
if NOT Flag then WriteLn(SettingsFile, Find, '=', Value);
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн vanili

  • Участник
  • *
  • Сообщений: 142
    • Просмотр профиля
Re: [Lazarus] Не изменяется переменная
« Ответ #9 : 27 Августа 2010, 23:47:29 »
Странно, проверил всю процедуру в точности как в первом посте (за исключением AssignFile заменил на Assign) в fpc 2.2.4-3 (понимаю, что не Lazarus, но Lazarus тот же компилятор и использует). Так вот, всё работает как положено, может проблемы с доступом к файлу???

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
Re: [Lazarus] Не изменяется переменная
« Ответ #10 : 28 Августа 2010, 06:56:22 »
На сколько я понял, в этом и заключается смысл: если строка Find + '=' найдена в файле, то она заменяется на Find + '=' + Value, при этом изменяется значение флага, в противном случае, значение флага не меняется, что и ведёт к добавлению Find + '=' + Value в конец файла.
именно так оно и должно работать.

if not тоже не дает никаких результатов.

с доступом к файлу все в порядке, более того в фаил записывается от рута.

заметил что если файла нет или он пустой, то процедура срабатывает раз и все.
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

Оффлайн ShadowUser15

  • Активист
  • *
  • Сообщений: 718
    • Просмотр профиля
Re: [Lazarus] Не изменяется переменная
« Ответ #11 : 28 Августа 2010, 09:00:55 »
Со строками (точнее с кодировками) в лазаре дикий бардак, пробовал использовать - ничего не пашет (в делфях сразу заработало), из-за того что в части функций кодировка родная линуховая, в части - виндовая... вот и получается что ни открыть файл, ни найти подстроку толком без МЕГАбубна (в коде) не получается.

Плюнул, тотже код проверил в делфях - все работает.
Задача была - загрузить текст в мемо из файла (диалог -> .loadfromfile), найти в нем подстроку.
Первая часть была решена (слава поиску) - с перекодировками имени файла и самого загруженного текста (т.е. без loadfromfile, :=-м), а вот на найти подстроку все и застопорилось.
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

Оффлайн Ururu_2

  • Активист
  • *
  • Сообщений: 291
    • Просмотр профиля
Re: [Lazarus] Не изменяется переменная
« Ответ #12 : 28 Августа 2010, 12:34:51 »
А я, кажется, нашёл косяк.  :)
Попробуй так:

   CloseFile(SettingsFile);
   CloseFile(SettingsFileOld);

Скорее всего у тебя просто не закрываются файлы, а Линукс любит записывать всё и сразу, вот и ждёт закрытия.

И странный какой-то у тебя алгоритм. Он дописывает/записывает строку не в конфигурационный файл, а в новый, свежесозданный, записывает ровно 1 строку.

Оффлайн ZwS

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1674
    • Просмотр профиля
Re: [Lazarus] Не изменяется переменная [Решено]
« Ответ #13 : 28 Августа 2010, 17:46:54 »
И странный какой-то у тебя алгоритм. Он дописывает/записывает строку не в конфигурационный файл, а в новый, свежесозданный, записывает ровно 1 строку.
Таки да, я в алгоритме лапухнулся :D. У меня ведь весь фаил переписывается, по этому записывается только то значение, которое записывается последним вызовом процедуры. Спасибо =)
Dell Inspiron One 2330 | Intel+Radeon HD7650A | 8GB RAM | Ubuntu GNOME 17.10

 

Страница сгенерирована за 0.049 секунд. Запросов: 25.