Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с несложной программой пожалуйста))) [D7]


vit196sh ©   (2011-11-30 03:13:00) 

program Project1;

{$APPTYPE CONSOLE}
type tst=array[1..100]of string[15];
procedure word(st:string;var k:Byte; b:tst);
var i:Byte;a:array[1..100]of string[15];
begin
 st:=st+' ';k:=1;
a[1]:='0';
a[2]:='1';
a[3]:='2';
a[4]:='3';
a[5]:='4';
a[6]:='5';
a[7]:='6';
a[8]:='7';
a[9]:='8';
a[10]:='9';
while Length(st)>0 do
  begin
     if Pos(' ',st)=1 then Delete(st,1,1);
   for  i:=1 to 10 do
    if st[1]=a[i] then begin
     b[k]:=Copy(st,1,Pos(' ',st)-1);k:=k+1;
    end;
     Delete(st,1,Pos(' ',st)-1);
  end;
end;
var a:tst;
   st:string;k,i:Byte;
BEGIN
k:=1;
Writeln('insert yous text');readln(st);Writeln(st);
word(st,k,a);
for i:=1 to k do
Writeln(a[i]);
Readln;
END.
прога должна переписать числа из текста в отдельный массив ,когда компилирую выдает ошибку runtime error 216 at 00404230 .Я никак не могу понять что не так .Помогите пожалуйста))))


Ega23   (2011-11-30 13:15:00) [1]


> Кроме того, дженерик, поскольку использует дин. массив,
> вынужден устраивать "зачистку" после изменения длины, что
> - время.


А TList, блин, не использует дин.массив, да?


> TList быстрее, чем TList<T>

Смотря в чём. Смотря где. Смотря как.


Jeer   (2011-11-30 13:01:00) [2]

Кроме того, дженерик, поскольку использует дин. массив, вынужден устраивать "зачистку" после изменения длины, что - время.


Jeer   (2011-11-30 12:59:00) [3]


> Ega23 ©   (30.11.11 12:05) [11]


Я о дженерике, а не стандартном TList.
TList быстрее, чем TList<T>


Dennis I. Komarov   (2011-11-30 12:06:00) [4]

Спасиб, сейчас накачу update в мозг... :)


Ega23   (2011-11-30 12:05:00) [5]


> + медленнее за счет более "жадного" алгоритма реаллока.


Наоборот, быстрее. Прирост размера 25% сразу. Но - по одному разу, а не на каждой итерации SetLength делать.


Jeer   (2011-11-30 11:58:00) [6]


> Собственно, это и есть дин.массив, просто он в привате сидит
> и реаллок несколько иначе реализован.
>


Да.
+ медленнее за счет более "жадного" алгоритма реаллока.


Ega23   (2011-11-30 10:37:00) [7]


>  В чем отличия от обычного TList?


http://www.tdelphiblog.com/2009/07/generics-delphi-2009-win32-1.html


> В данном случае - список integer ( аля дин. массив ).


Собственно, это и есть дин.массив, просто он в привате сидит и реаллок несколько иначе реализован.


Jeer   (2011-11-30 09:51:00) [8]

Дженерики ( обобщения ).
Обычный TList - список указателей.
Обобщения позволяют создавать список оговоренного типа данных.
В данном случае - список integer ( аля дин. массив ).


Dennis I. Komarov   (2011-11-30 09:32:00) [9]


> FData: TList<Integer>;

Я понимаю, что я из каменного, но это что за конструкция? В чем отличия от обычного TList?


Jeer   (2011-11-30 09:30:00) [10]


> Ega23 ©   (30.11.11 08:00) [5]


Теперь аффтар сюда долго не зайдет :)


Ega23   (2011-11-30 08:00:00) [11]


unit Unit12;

interface

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

type

 TNumericalData = class (TObject)
 private
   FData: TList<Integer>;
   procedure AddToken(var Token: string); inline;
 public
   constructor Create;
   destructor Destroy; override;
   procedure Execute(const Value: string);
   property Data: TList<Integer> read FData;
 end;

 TForm12 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form12: TForm12;

implementation

{$R *.dfm}

{ TNumericalData }

//*****************************************************************************

procedure TNumericalData.AddToken(var Token: string);
var
 i: Integer;
begin
 if TryStrToInt(Token, i) then
   if FData.IndexOf(i) = -1 then
     FData.Add(i);
 Token := '';
end;

//*****************************************************************************

constructor TNumericalData.Create;
begin
 inherited;
 FData := TList<Integer>.Create;
end;

//*****************************************************************************

destructor TNumericalData.Destroy;
begin
 FData.Free;
 inherited;
end;

//*****************************************************************************

procedure TNumericalData.Execute(const Value: string);
var
 i: Integer;
 aToken: string;
begin
 FData.Clear;
 aToken := '';
 for i := 1 to Length(Value) do
   if Value[i] in ['0'..'9'] then
    aToken := aToken + Value[i]
   else
     AddToken(aToken);
 AddToken(aToken);
end;

//*****************************************************************************

{TForm12}

//*****************************************************************************

procedure TForm12.Button1Click(Sender: TObject);
var
 i: Integer;
begin
 Memo1.Clear;
 with TNumericalData.Create do
   try
     Execute(Edit1.Text);
     for i := 0 to Data.Count - 1 do
       Memo1.Lines.Add(IntToStr(Data[i]));
   finally
     Free;
   end;
end;

//*****************************************************************************

end.


Германн   (2011-11-30 06:25:00) [12]


> когда компилирую выдает ошибку runtime error 216 at 00404230

Не ври. При компиляции такой ошибки не бывает.
Ну а код просто "ужас, летящий на крыльях ночи"! :)


KilkennyCat   (2011-11-30 04:33:00) [13]

:) че-то я туплю.
procedure word(st:string;var k:Byte; b:tst);
var
i : Byte;
tempStr : String;
begin
i := 1;
tempStr := '';
while i <= Length(st) do begin
 if st[i] in ['0'..'9'] then tempStr := tempStr + st[i] else begin
   b[k] := tempStr;
   tempStr := '';
   inc(k);
 end;
 inc(i);
end;

наверное, все равнго накосячил, пофиг, спать пора.


KilkennyCat   (2011-11-30 04:25:00) [14]

ошибся.
procedure word(st:string;var k:Byte; b:tst);
var
i : Byte;
tempStr : String;
begin
i := 1;
tempStr := '';
while k >= Length(st) do begin
  if st[i] in ['0'..'9'] then tempStr := tempStr + st[i] else begin
    b[k] := tempStr;
    tempStr := '';
  end;
  inc(k);
end;


KilkennyCat   (2011-11-30 04:23:00) [15]


> a[1]:='0';
> a[2]:='1';
> a[3]:='2';
> a[4]:='3';
> a[5]:='4';
> a[6]:='5';
> a[7]:='6';
> a[8]:='7';
> a[9]:='8';
> a[10]:='9';

жуть


procedure word(st:string;var k:Byte; b:tst);
var
 i : Byte;
 tempStr : String;
begin
 i := 1;
 tempStr := '';
 while Length(st) > 0 do begin
   if st[i] in ['0'..'9'] then tempStr := tempStr + st[i] else begin
     b[k] := tempStr;
     tempStr := '';
     inc(k);
   end;
end;

и вообще логичнее использовать динамический массив, ибо тут неизвестно количество элементов.


Наверх

Титульная страница Поиск, карта сайта Написать письмо