Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Функции и процедуры

Автор: Glykaman 6.09.2007 0:44

М
Код нужно заключать между тегами [code = pas ] [ /code ]



Значит проблема такая я пытался сделать библиотеку процедур. В этой библиотеке мне надо обьявить массив.
Паскаль ругается на ошибку 121 неизвесный сертификатор при первом же использовании массива (массив graf).
вот исходник:

unit DopforGr;
interface
uses
graph;

procedure NEMSAVE(nameFile:String ;nameintofile:string ;graf:array of integer);
implementation

procedure NEMSAVE(nameFile:String ;nameintofile:string ;graf:array of integer);
var

dlafor:integer;
col:integer;
s,d:byte;
gFile:text ;
begin
col:=0;
assign(gFile,'mario.nem') ;
rewrite(gFile) ;
writeln(gFile,nameintofile) ;
for s:=0 to 99 do
for d:=0 to 99 do
begin
if graf[d,s]>0 then col:=col+1;
end;
writeln(gFile,col);
for s:=0 to 99 do
for d:=0 to 99 do
begin
if graf[d,s]>0 then begin writeln(gFile,d); writeln(gFile,s) ; writeln(gFile,graf[d,s]); end;
end;



close(gFile) ;
end.

wacko.gif
подозреваю что я неправильно обьявил массив или какаято проблема с синтаксисом. wacko.gif
сама по себе процедура должна вызываться из библиотеки зарезервированым словом NEMSAVE(переменная;переменная;имя массива) и должна сохранять файлы с параметрами для графики.
Недавно примерно такаяже проблема была у меня при записи в типиризированые типы файлов массивов, но там удалось обойти при помощи циклов и текстовых файлов.
Зарание благодарен. smile.gif

Автор: volvo 6.09.2007 0:54

Проблема в другом: ошибка №121 - это неправильный квалификатор, т.е., ты объявил Graf одномерным массивов, а обратиться к нему пытаешься, как к двумерному.. А нельзя smile.gif

Автор: Glykaman 6.09.2007 1:16

Цитата(volvo @ 5.09.2007 20:54) *

Проблема в другом: ошибка №121 - это неправильный квалификатор, т.е., ты объявил Graf одномерным массивов, а обратиться к нему пытаешься, как к двумерному.. А нельзя smile.gif

Понятно как мне тогда обьявить двухмерный массив? На код:


unit DopforGr;
interface
uses
graph;

procedure NEMSAVE(nameFile:String ;nameintofile:string ;graf:array [0..99,0..99] of integer);
implementation

procedure NEMSAVE(nameFile:String ;nameintofile:string ;graf:array [0..99,0..99] of integer);
var

dlafor:integer;
col:integer;
s,d:byte;
gFile:text ;
begin
col:=0;
assign(gFile,'mario.nem') ;
rewrite(gFile) ;
writeln(gFile,nameintofile) ;
for s:=0 to 99 do
for d:=0 to 99 do
begin
if graf[d,s]>0 then col:=col+1;
end;
writeln(gFile,col);
for s:=0 to 99 do
for d:=0 to 99 do
begin
if graf[d,s]>0 then begin writeln(gFile,d); writeln(gFile,s) ; writeln(gFile,graf[d,s]); end;
end;



close(gFile) ;
end.



ругается что после array должен стоять of. (А если это обойти придётся делать 100 массивов ономерных.)

Автор: volvo 6.09.2007 1:22

Да что ты?

А вот так не пробовал:

unit DopforGr;

interface
uses
graph;

Type
TMatrix = array [0..99, 0..99] of integer;

procedure NEMSAVE(nameFile:String ;nameintofile:string ;graf: TMatrix);

?

(просто Паскаль не позволяет конструировать типы в описании заголовков процедур/функций, все типы, используемые в описании должны быть уже известны)

Автор: -Glykaman- 6.09.2007 1:37

Спасибо volvo. Походу в очередной раз было доказано что всё генеальное просто. Щас буду тестить.вроде всё должно получиться.Ещё раз спасибо! good.gif

Автор: Glykaman 6.09.2007 3:18

Прошу прощения что возвращаюсь к темже баранам. Тестил библиотека работает нормально а вот с использованием возникли проблемы и указывает на Graf :

[code = pas ]
program NeoNMooNpaintVersionFORPascal ;
uses
crt,graph,dopforgr;

type
TMatrix = array [0..99,0..99] of integer;


var
cursor:array[0..99,0..99] of boolean ;

a,b:integer;
x,y:integer;
color:byte;
name:string[8] ;
graf:TMatrix ;

Procedure graphinit ;
var
gm,gd:integer;
begin
gm:=2;
gd:=installuserdriver ('bgi256',nil);
initGraph(gd,gm,' ');

if graphResult <> grOK then halt(1);
end;

Procedure WrStr ;
begin
setcolor(150) ;
moveto (401,0);
lineto (401,401);
lineto (0,401);
moveto (401,40);
lineto (480,40);
SetTextStyle(DefaultFont, HorizDir, 1); ;
outtextxy(410,10,'Welcome to') ;
outtextxy(410,20,'NeoNMooN Paint for PASCAL') ;
outtextxy(410,30,'Glykasoft & NeoNMooN studio') ;
outtextxy(410,50,'You need Help? -> F1 ') ;
end;

Procedure initcolor ;
var
color2:byte;
begin
for color2:=0 to 255 do
begin
setcolor(color2) ;
rectangle(color2*2,460,color2*2,480);
rectangle(color2*2+1,460,color2*2+1,480);


end;
end;








Procedure nemLOAD ;
var
dlafor:integer;
col:integer;
s,d:byte;
gFile:text ;
begin
col:=0;
closegraph;
write('Input name(8) file please: ');
readln(name) ;
assign(gFile, name +'.nem') ;
reset(gFile) ;
readln(gFile,name) ;
readln(gFile,col) ;
for dlafor:=0 to col do
begin
readln(gFile,d) ;
readln(gFile,s) ;
readln(gFile,graf[d,s])
end;
close(gFile) ;
graphinit;
wrstr;
initcolor;
end;



Procedure text ;
var
printtext:string;
begin

setfillstyle(0,0);
bar(10,410,200,420);
setcolor(10) ;
outtextxy(10,410,'X=');
str(a,printtext);
outtextxy(30,410,printtext);
outtextxy(50,410,'Y=');
str(b,printtext);
outtextxy(70,410,printtext);
str(color,printtext);
outtextxy(90,410,'COLOR -');
outtextxy(150,410,printtext);



end;


Procedure chek ;
begin
setcolor(color);
setfillstyle(1,color);
bar(2*(color-10),430,2*(color+10),455) ;
rectangle(color*2,430,color*2,459) ;

for y:=0 to 99 do
begin
for x:=0 to 99 do
begin
if graf[x,y]<>0 then begin setcolor(graf[x,y]) ;rectangle(4*x+1,4*y+1,4*x+3,4*y+3); end;
end;
end;



setcolor(color);
for y:=0 to 99 do
begin
for x:=0 to 99 do
begin
if cursor[x,y]=true then rectangle(4*x,4*y,4*x+4,4*y+4);
end;
end;
end;





Procedure cursorinit ;
var
ch:char;
begin

repeat

chek;
text ;
setcolor(0);
ch := readkey;

case ch of
#75:if a>0 then begin rectangle(4*a,4*b,4*a+4,4*b+4); a:=a-1; cursor[a+1,b]:=false; cursor[a,b]:=true; end;
#77:if a<99 then begin rectangle(4*a,4*b,4*a+4,4*b+4);a:=a+1; cursor[a-1,b]:=false; cursor[a,b]:=true; end;
#72:if b>0 then begin rectangle(4*a,4*b,4*a+4,4*b+4);b:=b-1; cursor[a,b+1]:=false; cursor[a,b]:=true; end;
#80:if b<99 then begin rectangle(4*a,4*b,4*a+4,4*b+4);b:=b+1; cursor[a,b-1]:=false; cursor[a,b]:=true; end;
#49:begin rectangle(2*(color+10),430,2*(color+10)-1,455) ;rectangle(color*2,430,color*2,459) ;color:=color-1;end;
#51:begin rectangle(2*(color-10),430,2*(color-10)+1,455) ;rectangle(color*2,430,color*2,459) ;color:=color+1;end;
#13:graf[a,b]:=color;
#63:NEMSAVE('esd','nem', graf );
#66:nemLOAD;

{c #99:begin readln(color); end;}


else
end;
until ch = #27 ;
end;



begin
color:=1;
cursor[0,0]:=true;
graphinit;
wrstr;
initcolor;
cursorinit;




closegraph;
end.

[ /code ]

вобще тут много не относящегося к поблеме
если в кратце то при компиляции указатель в строке #63:NEMSAVE('esd','nem', graf ); указывает на graf и пишет тип несовместим несмотря на то что graf также принадлежит TMatrix.

Автор: volvo 6.09.2007 3:26

Цитата
несмотря на то что graf также принадлежит TMatrix.
Да, но только учти, что тип, описанный в модуле и заново описанный в основной программе - это разные типы с точки зрения Паскаля, несмотря на то, что их описание совпадает до последнего символа... Естественно, что при использовании разных типов ты получаешь сообщение об их несовместимости...

Решение очевидно: убери переопределение типа TMatrix из основной программы, оставь только в модуле, тогда Паскаль будет использовать одно и то же описание и там и там, и никаких проблем не возникнет...

Автор: Glykaman 6.09.2007 3:46

mega_chok.gif
с прогой разобрался только теперь компилятор возвращает меня в библиотеку с ошибкой 202 stack overflow error я сам ни разу ещё с этим не встречался. Если я тебя ещё не совсем задолбал своими вопросами раскажи что это и как с этим бороться. Я так понял там чтото с памятью типа переполнения но что такое "стек" (так написано в русификаторе справки) я не знаю.

Автор: volvo 6.09.2007 3:54

Цитата
теперь компилятор возвращает меня в библиотеку с ошибкой 202 stack overflow error
Смотри, что происходит:

Type
TMatrix = array [0..99, 0..99] of integer;

procedure NEMSAVE(nameFile:String ;nameintofile:string ;graf: TMatrix);

Так было, правда?А давай посмотрим, каков размер массива graf? 100*100*sizeof(integer) = 20000 байт... А передается массив по значению, то есть, целиком заталкивается в стек. А стек не безграничен, его размер равен... (Зайди в меню Options -> Memory Sizes, и посмотри, сколько байт отведено под стек...) Скорее всего, 16384, по умолчанию? Вот тебе и переполнение стека...

Вот это:
procedure NEMSAVE(nameFile:String ;nameintofile:string ; VAR graf: TMatrix); { <--- Var замечаешь? }

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

Автор: Glykaman 6.09.2007 4:07

Цитата(volvo @ 6.09.2007 0:54) *

Смотри, что происходит:

Type
TMatrix = array [0..99, 0..99] of integer;

procedure NEMSAVE(nameFile:String ;nameintofile:string ;graf: TMatrix);

Так было, правда?А давай посмотрим, каков размер массива graf? 100*100*sizeof(integer) = 20000 байт... А передается массив по значению, то есть, целиком заталкивается в стек. А стек не безграничен, его размер равен... (Зайди в меню Options -> Memory Sizes, и посмотри, сколько байт отведено под стек...) Скорее всего, 16384, по умолчанию? Вот тебе и переполнение стека...

Вот это:

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


Ураа! заработало! volvo ты действительно крут cool.gif незря у тебя репутация +153 .
Ты мне очень помог я уже чуть не отчаялся. А то в самоучителях нет подобной информации. good.gif