Код нужно заключать между тегами [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.
подозреваю что я неправильно обьявил массив или какаято проблема с синтаксисом. сама по себе процедура должна вызываться из библиотеки зарезервированым словом NEMSAVE(переменная;переменная;имя массива) и должна сохранять файлы с параметрами для графики. Недавно примерно такаяже проблема была у меня при записи в типиризированые типы файлов массивов, но там удалось обойти при помощи циклов и текстовых файлов. Зарание благодарен.
volvo
6.09.2007 0:54
Проблема в другом: ошибка №121 - это неправильный квалификатор, т.е., ты объявил Graf одномерным массивов, а обратиться к нему пытаешься, как к двумерному.. А нельзя
Glykaman
6.09.2007 1:16
Цитата(volvo @ 5.09.2007 20:54)
Проблема в другом: ошибка №121 - это неправильный квалификатор, т.е., ты объявил Graf одномерным массивов, а обратиться к нему пытаешься, как к двумерному.. А нельзя
Понятно как мне тогда обьявить двухмерный массив? На код:
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 массивов ономерных.)
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 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
с прогой разобрался только теперь компилятор возвращает меня в библиотеку с ошибкой 202 stack overflow error я сам ни разу ещё с этим не встречался. Если я тебя ещё не совсем задолбал своими вопросами раскажи что это и как с этим бороться. Я так понял там чтото с памятью типа переполнения но что такое "стек" (так написано в русификаторе справки) я не знаю.
volvo
6.09.2007 3:54
Цитата
теперь компилятор возвращает меня в библиотеку с ошибкой 202 stack overflow error
Так было, правда?А давай посмотрим, каков размер массива graf? 100*100*sizeof(integer) = 20000 байт... А передается массив по значению, то есть, целиком заталкивается в стек. А стек не безграничен, его размер равен... (Зайди в меню Options -> Memory Sizes, и посмотри, сколько байт отведено под стек...) Скорее всего, 16384, по умолчанию? Вот тебе и переполнение стека...
Вот это:
procedure NEMSAVE(nameFile:String ;nameintofile:string ; VAR graf: TMatrix); { <--- Var замечаешь? }
тебе поможет, теперь массив не заталкивается в стек, а передается по ссылке...
Так было, правда?А давай посмотрим, каков размер массива graf? 100*100*sizeof(integer) = 20000 байт... А передается массив по значению, то есть, целиком заталкивается в стек. А стек не безграничен, его размер равен... (Зайди в меню Options -> Memory Sizes, и посмотри, сколько байт отведено под стек...) Скорее всего, 16384, по умолчанию? Вот тебе и переполнение стека...
Вот это:
тебе поможет, теперь массив не заталкивается в стек, а передается по ссылке...
Ураа! заработало! volvo ты действительно крут незря у тебя репутация +153 . Ты мне очень помог я уже чуть не отчаялся. А то в самоучителях нет подобной информации.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.