Код нужно заключать между тегами [code = pas ] [ /code ]
Значит проблема такая я пытался сделать библиотеку процедур. В этой библиотеке мне надо обьявить массив. Паскаль ругается на ошибку 121 неизвесный сертификатор при первом же использовании массива (массив graf). вот исходник:
unit DopforGr;
interfaceuses
graph;
procedure NEMSAVE(nameFile:String ;nameintofile:string ;graf:arrayof integer);
implementationprocedure NEMSAVE(nameFile:String ;nameintofile:string ;graf:arrayof 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:=0to99dofor d:=0to99dobeginif graf[d,s]>0then col:=col+1;
end;
writeln(gFile,col);
for s:=0to99dofor d:=0to99dobeginif graf[d,s]>0thenbegin 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;
interfaceuses
graph;
procedure NEMSAVE(nameFile:String ;nameintofile:string ;graf:array [0..99,0..99] of integer);
implementationprocedure 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:=0to99dofor d:=0to99dobeginif graf[d,s]>0then col:=col+1;
end;
writeln(gFile,col);
for s:=0to99dofor d:=0to99dobeginif graf[d,s]>0thenbegin 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;
interfaceuses
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. Походу в очередной раз было доказано что всё генеальное просто. Щас буду тестить.вроде всё должно получиться.Ещё раз спасибо!
Glykaman
6.09.2007 3:18
Прошу прощения что возвращаюсь к темже баранам. Тестил библиотека работает нормально а вот с использованием возникли проблемы и указывает на Graf :
[code = pas ] program NeoNMooNpaintVersionFORPascal ; uses crt,graph,dopforgr;
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
Смотри, что происходит:
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 ты действительно крут незря у тебя репутация +153 . Ты мне очень помог я уже чуть не отчаялся. А то в самоучителях нет подобной информации.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.