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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2008, 09:28   #1
Fonarik
 
Регистрация: 28.10.2008
Сообщений: 9
По умолчанию Тема:динамический массив, выскакивает ошибка

Задача стояла такая:
Проверить одномерный массив символов, какая наиболее чаще встречается цифра и вывести ее.

Программа то работает, но выдает вот такую ошибку

Код:
type
tmas=array[1..1] of char;
atn=^tmas;
var
  Form1: TForm1;
  M:atn;      // задаем динамический массив
  n,i:integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
n:=5;  edit1.Text:=inttostr(n);
stringgrid1.ColCount:=n;
randomize;
for i:=0 to n-1 do      // заполняем случайными символами Stringgrid1
stringgrid1.Cells[i,0]:=char(random(256));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=strtoint(edit1.text);  // изменение размерности массива
stringgrid1.colcount:=n;
randomize;
for i:=0 to n-1 do
stringgrid1.Cells[i,0]:=char(random(256));
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
   var j,kol,k,w:integer;
       c:char;
    begin
getmem(M,n*sizeof(char));        // выделяем память
for i:=0 to n-1 do
   M[i]:=stringgrid1.Cells[i,0][1]; // присваеваем значения из stringgrid1

w:=0;
for i:=0 to n-1 do            // проверяем массив на цифры
 if (m[i]>='0') and (m[i]<='9') // другое возможное условие: in ['0'..'9']
   then begin
        k:=0;
        for j:=0 to n-1 do     // вычисляем количество повторяющихся цифр
            if M[j]=M[i] then inc(k);
        if w=0 then begin c:=M[i];  kol:=k; w:=1; end
               else if k>kol then begin c:=M[i];  kol:=k;  end;
        end;
 if w=0 then label2.Caption:='В массиве нету цифр'
        else label2.Caption:='В массиве чаще всего встречается цифра "' +c+'"';
        freemem(M,n*sizeof(char));   // освобождаем память

end;
end.
Но вот если освобождение памяти происходит через setlength, то все работает без ошибок:
Код:
var
  Form1: TForm1;
  M:array of char;      // задаем динамический массив
  n,i:integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
n:=5;  edit1.Text:=inttostr(n);
stringgrid1.ColCount:=n;
randomize;
for i:=0 to n-1 do      // заполняем случайными символами Stringgrid1
stringgrid1.Cells[i,0]:=char(random(256));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=strtoint(edit1.text);  // изменение размерности массива
stringgrid1.colcount:=n;
randomize;
for i:=0 to n-1 do
stringgrid1.Cells[i,0]:=char(random(256));
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
   var j,kol,k,w:integer;
       c:char;
begin
setlength(M,n);        // освобождаем память
for i:=0 to n-1 do
   M[i]:=stringgrid1.Cells[i,0][1]; // присваеваем значения из stringgrid1

w:=0;
for i:=0 to n-1 do            // проверяем массив на цифры
 if (m[i]>='0') and (m[i]<='9') // другое возможное условие: in ['0'..'9']
   then begin
        k:=0;
        for j:=0 to n-1 do     // вычисляем количество повторяющихся цифр
            if M[j]=M[i] then inc(k);
        if w=0 then begin c:=M[i];  kol:=k; w:=1; end
               else if k>kol then begin c:=M[i];  kol:=k;  end;
        end;
 if w=0 then label2.Caption:='В массиве нету цифр'
        else label2.Caption:='В массиве чаще всего встречается цифры "' +c+'"';
        m:=nil;   // освобождаем память

end;

end.
Прошу помощи, т.к. уже не знаю что делать.
Fonarik вне форума Ответить с цитированием
Старый 24.11.2008, 09:34   #2
Ламер_001
Ну и что? :)
Форумчанин
 
Регистрация: 20.10.2008
Сообщений: 129
По умолчанию

в моем понимании динамический массив это некий стек (или очередь) а не array указателей
Учиться, учиться и еще раз учиться
Ламер_001 вне форума Ответить с цитированием
Старый 24.11.2008, 09:57   #3
Fonarik
 
Регистрация: 28.10.2008
Сообщений: 9
По умолчанию

препод требует через указатель, а причину ошибки не указывает =(
Fonarik вне форума Ответить с цитированием
Старый 24.11.2008, 11:56   #4
Ламер_001
Ну и что? :)
Форумчанин
 
Регистрация: 20.10.2008
Сообщений: 129
По умолчанию

правильно. но в динамике используется для хранения 1 (или 2) указателя. почитай в инете про стеки, очереди и графы.
Учиться, учиться и еще раз учиться
Ламер_001 вне форума Ответить с цитированием
Старый 24.11.2008, 19:15   #5
Fonarik
 
Регистрация: 28.10.2008
Сообщений: 9
По умолчанию

и все равно не понятно, почему выскакивает ошибка, как ее избежать, кто поможет?
Fonarik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамический массив Dimon Паскаль, Turbo Pascal, PascalABC.NET 3 21.03.2008 18:08
Динамический массив _ares_ Паскаль, Turbo Pascal, PascalABC.NET 3 26.12.2007 23:54
динамический массив Diller Помощь студентам 48 07.10.2007 16:43
Динамический массив. Mickle Помощь студентам 9 21.06.2007 20:31
Динамический массив Mickle Общие вопросы Delphi 8 19.06.2007 06:45