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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 02:30   #1
Kykyryza
Новичок
Джуниор
 
Регистрация: 09.12.2010
Сообщений: 1
Печаль Проблема работы с текстом.

Програма должна выводить нименьшие строки, но вместо этого,вылетает сообщение об ошибке "debugge exception natification", и всё зависает.
Я не могу понять, это что то с компилятором, или очень коряво написано?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  tn,s:string;
  t:TextFile;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if opendialog1.execute then
  begin
	tn:=opendialog1.filename;
        memo1.lines.loadfromfile(tn);
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
var ca, i,g,j: integer;  c:Real;
    a: array [1..100] of Integer;
begin
      assignfile(t,tn);
      reset(t);
      read(t,s);


    ca:=0;
    while not Eof(t) do
      begin
         a[i]:=length(s);
              ca:=ca+a[i];
               i:=i+1;
      end;
     c:=ca/i;
     j:=0;
    for g:=0 to i do
    begin
      if a[g]<c then Memo2.Lines[j]:=memo1.Lines[g];

    end;
      closefile(t);
       end;

end.

Последний раз редактировалось Stilet; 09.12.2010 в 09:28.
Kykyryza вне форума Ответить с цитированием
Старый 09.12.2010, 05:02   #2
Alexei91
Заблокирован
Форумчанин
 
Аватар для Alexei91
 
Регистрация: 30.12.2009
Сообщений: 544
По умолчанию

Нельзя смешивать работу с файлами, открытыми с помощью Reset и Rewrite
(для их обработки применяются процедуры Read, Write, BlockRead, BlockWrite) и работу с файлами, открытыми с помощью функций Windows.
Темы для WordPress. Русские WordPress шаблоны
Alexei91 вне форума Ответить с цитированием
Старый 09.12.2010, 09:30   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Alexei91
Ну и где мы там такое увидели?
Цитата:
Kykyryza
Пройдишь пошаговкой по программе, выясни на каком операторе застряет.
Поставь точку прерывания на assignfile(t,tn); и от нее трассируй.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.12.2010, 09:54   #4
WhiteSpirit
Пользователь
 
Регистрация: 28.05.2010
Сообщений: 82
По умолчанию

Скорее всего, ошибка здесь:
Код:
for g:=0 to i do
    begin
      if a[g]<c then Memo2.Lines[j]:=memo1.Lines[g];
а массив объявлен как
Код:
a: array [1..100] of Integer;
т.е. индексация должна идти с 1.
WhiteSpirit вне форума Ответить с цитированием
Старый 09.12.2010, 17:02   #5
Alexei91
Заблокирован
Форумчанин
 
Аватар для Alexei91
 
Регистрация: 30.12.2009
Сообщений: 544
По умолчанию

Код:
var
  Form1: TForm1;
  tn,s:string;
...
memo1.lines.loadfromfile(tn);
...
assignfile(t,tn);
Обратите внимание на tn.
http://articles.org.ru/docum/filefunc.php - работа с файлами в Delphi.
ИМХО,
Kykyryza смешивает досовский метод работы с файлами (от паскаля) и виндосовский - от этого и беды.


WhiteSpirit вроде как у Memo.Lines[i] нумерация с 0 идёт.

P.S.
Не считая того, что лишние begin ... end (но это уже по мелочи):
Код:
    for g:=0 to i do
    begin
      if a[g]<c then Memo2.Lines[j]:=memo1.Lines[g];

    end;
Темы для WordPress. Русские WordPress шаблоны

Последний раз редактировалось Alexei91; 09.12.2010 в 17:09.
Alexei91 вне форума Ответить с цитированием
Старый 09.12.2010, 17:12   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Обратите внимание на tn.
И что там такого криминального?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.12.2010, 17:56   #7
WhiteSpirit
Пользователь
 
Регистрация: 28.05.2010
Сообщений: 82
По умолчанию

А ещё вот здесь
Код:
while not Eof(t) do
      begin
         a[i]:=length(s);
              ca:=ca+a[i];
               i:=i+1;
Переменная i не инициализирована
WhiteSpirit вне форума Ответить с цитированием
Старый 09.12.2010, 18:03   #8
Alexei91
Заблокирован
Форумчанин
 
Аватар для Alexei91
 
Регистрация: 30.12.2009
Сообщений: 544
По умолчанию

Stilet
Я перепутал с File или ещё с чем-то,потому как этот код рабочий:
Код:
var
  F: TextFile;
  S: String;
begin
  if OpenDialog1.Execute then
  begin
    AssignFile(F, OpenDialog1.FileName);
    Reset(F);
    Readln(F, S);
    Edit1.Text := S;
    CloseFile(F);
  end;
end;
Темы для WordPress. Русские WordPress шаблоны
Alexei91 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с текстом в .cmd nub' Операционные системы общие вопросы 2 05.02.2010 13:47
Библиотека, расширяющая функции для работы с текстом (Delphi) a_n_n_a Помощь студентам 3 28.04.2009 10:42
Разные языки в компонентах работы с текстом DeKot Общие вопросы Delphi 5 26.02.2009 09:43
Проблема с текстом! Starscream Общие вопросы Delphi 2 22.02.2008 17:55
Проблема с текстом FlooPy HTML и CSS 3 21.11.2007 19:31