Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Текстовый файл. Странная ошибка 
V
    Опции темы
arcsupport
Дата 16.8.2010, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 24.10.2008

Репутация: нет
Всего: 2



Добрый день. Есть подобный код:
Код

    while not eof(f) do
    begin
        FillChar(s, sizeof(s), 0);
        readln(f, s);
        if s = '' then continue;
        inc(n);
        .............
        k := 0;
        repeat
            FillChar(s, sizeof(s), 0);
            s := '';
            readln(f, s);
            if s <> '' then //// ***
            begin
                inc(k);
                .............
            end;
        until s = '';
    end;
Иногда, непонятно почему, условие, отмеченное ***, при пустой строке не срабатывает. С чем это связано?

Добавлено через 2 минуты
Т.е. выполняется if ****, и, кроме того, не выходит из repeat until.
В текстовом файле есть только русские и английские буквы, цифры, пробелы, точки, запятые. Больше ничего нет.

Добавлено через 4 минуты и 20 секунд
Кроме того:
Код

var
  n, k : integer;
  f : text;
  s : array [0..512] of char;
Используется Emarcadero Delphi 2010
PM MAIL   Вверх
Данкинг
Дата 16.8.2010, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Может быть, там не '', а ' ', т.е. пробелы лишние?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
amsoft
Дата 17.8.2010, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



Цитата(arcsupport @  17.8.2010,  01:54 Найти цитируемый пост)
Иногда, непонятно почему, условие, отмеченное ***, при пустой строке не срабатывает


по условию оно у тебя и не должно срабатывать при пустом значении

--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
arcsupport
Дата 17.8.2010, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 24.10.2008

Репутация: нет
Всего: 2



При пустой строке этот самый if не должен выполняться. А он выполняется.
Лишних пробелов точно нет.
PM MAIL   Вверх
Чoо
Дата 17.8.2010, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



Цитата(amsoft @  17.8.2010,  08:24 Найти цитируемый пост)
по условию оно у тебя и не должно срабатывать при пустом значении

я думаю автор имел ввиду, что если массив s<>'', то переход на then происходит (хотя конструкция if then else всегда работает, только бывает не так как хочет автор) 
(кароч фигню я написал выше . Ну вобщем даже если в массиве ни чего нет, то происходит переход на then даже по условию s<>'')
а действительно при значении '' он бы вышел из цикла 
Код

until s = '';

а что бы выходил из цикла, надо дополнить условие (s='') or (eof(f))
вообще думаю там действительно пробел где-то затесался

Добавлено @ 09:24
arcsupport, покажите ваш текстовый файл, только зазипуйте его

Это сообщение отредактировал(а) Чoо - 17.8.2010, 09:26


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
arcsupport
Дата 17.8.2010, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 24.10.2008

Репутация: нет
Всего: 2



Сделал StrPas(s) и все заработало. Странно.
PM MAIL   Вверх
Чoо
Дата 17.8.2010, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



что-то мне интересно стало, почему так?
по идее, если сравнивать следующим образом x<>'', то аргумент справа будет иметь тип shortstring. если x:array [0..n] of char, то после 
Код

fillchar(x,sizeOf(x),0);

он будет иметь прежнюю длину n, а каждый элемент массива будет равен #0.
Опять же по идее, сравнивать напрямую массив символов и shortstring компилятор не даст. Может он перед сравнением преобразует один из аргументов к соотв. типу и производит дальнейшее сравнение?

***
ну вобщем без StrPas должно работать если сделать так:
Код

 ..............
            if s[0] <> #0 then //// ***
            begin
                inc(k);
                .............
            end;
        until s[0] = #0;
 


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.