IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Проблемы с динамической памятью
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Добрый вечер, необходимо написать программу, задание слеудющее:

Создать объект «чтение строки» позволяющий считывать строку введенную с клавиатуры. От объекта чтение строки создать дочерний объект «анализ строки», подсчитывающий частоту, с какой символы встречаются во введенной строке и выводящий результат на экран. От объекта «анализ строки» создать дочерний объект «анализ текста», позволяющий считывать текст из файла и анализировать его.

Код программы:


uses crt;
type
tmas=array[1..255] of char;
read_str=object
str:^string;
mas:^tmas;
h:^integer;
flag:^boolean;
constructor init;
procedure chtenie; virtual;
destructor done; virtual;
procedure run; virtual;
end;
analiz_str=object(read_str)
mas_char_1:array ['a'..'z'] of word;
mas_char_2:array ['A'..'Z'] of word;
constructor init;
procedure analiz; virtual;
procedure run; virtual;
destructor done; virtual;
end;
analiz_text=object(analiz_str)

constructor init;
procedure chtenie; virtual;
procedure analiz_txt; virtual;
procedure run; virtual;
destructor done; virtual;
end;
constructor read_str.init;
begin
New(str);
New(mas);
New(flag);
New(h);
end;

destructor read_str.done;
begin
dispose(str);
dispose(mas);
dispose(flag);
dispose(h);
end;

constructor analiz_str.init;
begin
end;

destructor analiz_str.done;
begin
end;

constructor analiz_text.init;
begin
end;

destructor analiz_text.done;
begin
end;

procedure read_str.run;
begin

end;

procedure read_str.chtenie;
var
i:integer;
k:integer;
stroka_b:string;
begin
clrscr;
for i:=1 to 255 do
{read_s^.}mas^[i]:=' ';
writeln('vvedite stroky:');
readln(stroka_b);
{read_s^.}h^:=0;
{read_s^.}h^:=length(stroka_b);
for i:=1 to {read_s^.}h^ do
begin
{read_s^.}mas^[i]:=stroka_b[i];
end;
{read_s^.}str^:=stroka_b;
end;

procedure analiz_str.run;
var
s:char;
begin
{analiz_s^.}flag^:=false;
analiz;
for s:='a' to 'z' do
begin
if {analiz_s^.}mas_char_1[s]<>0 then writeln(s,'-',{analiz_s^.}mas_char_1[s]);
end;
for s:='A' to 'Z' do
begin
if {analiz_s^.}mas_char_2[s]<>0 then writeln(s,'-',{analiz_s^.}mas_char_2[s]);
end;
end;

procedure analiz_str.analiz;
var
s:char;
i,j,k:byte;
begin
if {analiz_s^.}flag^=false then
begin
for s:='a' to 'z' do mas_char_1[s]:=0;
for s:='A' to 'Z' do mas_char_2[s]:=0;
chtenie;
end;
for j:=1 to {read_s^.}h^ do
begin
case {read_s^.}mas^[j] of
'a'..'z':inc({analiz_s^.}mas_char_1[{read_s^.}mas^[j]]);
'A'..'Z':inc({analiz_s^.}mas_char_2[{read_s^.}mas^[j]]);
end;
end;
end;
procedure analiz_text.chtenie;
Var
f:text;
s:char;
ch:string[1];
i,j,k,p,m:byte;
str2:string;
begin
readkey;
clrscr;
{analiz_s^.}flag^:=true;
Assign(f,'file.txt');
Reset(f);
for s:='a' to 'z' do {analiz_s^.}mas_char_1[s]:=0;
for s:='A' to 'Z' do {analiz_s^.}mas_char_2[s]:=0;
i:=1;
j:=1;
k:=1;
{read_s^.}h^:=0;
while not eof (f) do
begin
while not eoln (f) do
begin
{read_s^.}str^:='';
readln(f,{read_s^.}str^);
k:=1;
for i:=1 to length({read_s^.}str^) do
begin
{read_s^.}mas^[i]:={read_s^.}str^[i];
write({read_s^.}mas^[i])
end;
{read_s^.}h^:=length({read_s^.}str^);
analiz_txt;
end;

readln(f);
end;
writeln;
for s:='a' to 'z' do
begin
if {analiz_s^.}mas_char_1[s]<>0 then writeln(s,'-',{analiz_s^.}mas_char_1[s]);
end;
for s:='A' to 'Z' do
begin
if {analiz_s^.}mas_char_2[s]<>0 then writeln(s,'-',{analiz_s^.}mas_char_2[s]);
end;
writeln;
end;

procedure analiz_text.run;
begin
chtenie;
end;

procedure analiz_text.analiz_txt;
begin
analiz;
end;
var
read_s:^read_str;
analiz_s:^analiz_str;
analiz_t:^analiz_text;
begin
new(analiz_s,init);
new(analiz_t,init);
analiz_s^.run;
analiz_t^.run;
dispose(analiz_t,done);
dispose(analiz_s,done);
readkey;
end.


Трудность заключается в следующем: а именно в процедуре read_str.chtenie; в строчке for i:=1 to 255 do {read_s^.}mas^[i]:=' '; мне необходимо обнулить массив который находится в динамической памяти, т.е. я заменяю все символы пробелом.
Если массив расположить в статической памяти, то все работает корректно.
Задание именно на объекты и динамическую память. Также если обращаться к переменным или к объектам через переменные (закоментированнно), то так же все работает корректно, но преподователь сказал что нужно обращаться напрямую <имя объекта>.<имя переменной>

Помогите разобраться с данной проблемой, заранее блаодарен.

Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 5.05.2024 14:44
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name