проблем при стартиране на програма на Паскал
При стартиране на програма на Паскал веднага след изпълнението на програмата се получава следната грешка:
http://darkmentor.hit.bg/sshot-1.jpg
Мисля, че това е някаква грешка свързана с това, че програмата я направих на Dev-pas за 32 битова ОС, а съм с Vista Ultimate x64.
Търсих в Интернет, но всичко, което открих е , че това е грешка на виртуалната машина, а не е стартирана такава.
Програмата работи със стек - въвежда извежда елементи под формата на топки с различни цветове, за демонстрация на работата на стека.Ето и програмния код:
Цитат:
Program cviat_topki;
TYPE
st15=string[15];
poredica=^element; {тип указател към един елемент от стека}
element=record
cviat:st15; {цвят на топката}
predishen:poredica; {предишен елемент}
end;
VAR
s:st15;
posleden:poredica;
procedure dobav (s:st15); {добавяне на елемент към стека}
VAR
w:poredica;
begin
new(w); {създава се елемент}
w^.cviat:=s;
w^.predishen:=posleden;
posleden:=w; {трябва да съдържа последната добавена топка към стека}
end; {край на процедура}
procedure izvlich(var s:st15);
VAR
w:poredica;
begin
s:=posleden^.cviat; {извлича се цвета на последната добавена топка}
w:=posleden;
posleden:=posleden^.predishen;
dispose(w); {освобождава се заеманата от последната добавена топка памет}
end;
procedure vavej; {процедура за въвеждане на топките със съответния цвят}
VAR
i:integer;
begin
write('Vavedete cviat na topka No1 (Za izhod -> "1"): ');
readln(s);
i:=1;
while s<>'1' do
begin
i:=i+1;
dobav(s);
write('Cviat na topka No',i,' : ');
readln(s);
end;
end; {край на процедура}
procedure izvej; {процедура за извеждане на цвета на топките по реда на изваждането им }
VAR
i:integer;
begin
i:=1;
while posleden^.cviat<>'white' do
begin
izvlich(s);
writeln(i,'.',s);
i:=i+1;
if i mod 24 = 0 then
readln
end;
end; {край на процедура}
BEGIN
posleden:=nil;
vavej;
izvej;
//readln;
END.
Някой да има идея на какво може да се дължи тази грешка?
Re:проблем при стартиране на програма на Паскал
dokolkoto gledam kraq na faila ne e zavyr6en
procedure vavej; - do kato ne nameri "1"
procedure izvej; - tyrsi do "while posleden^.cviat<>'white' do" kyde definirano "posleden^.cviat='white'"
Дали това ще стане
Цитат:
Program cviat_topki;
TYPE
st15=string[15];
poredica=^element; {тип указател към един елемент от стека}
element=record
cviat:st15; {цвят на топката}
predishen:poredica; {предишен елемент}
end;
VAR
s:st15;
posleden:poredica;
procedure dobav (s:st15); {добавяне на елемент към стека}
VAR
w:poredica;
begin
new(w); {създава се елемент}
w^.cviat:=s;
w^.predishen:=posleden;
posleden:=w; {трябва да съдържа последната добавена топка към стека}
end; {край на процедура}
procedure izvlich(var s:st15);
VAR
w:poredica;
begin
s:=posleden^.cviat; {извлича се цвета на последната добавена топка}
w:=posleden;
posleden:=posleden^.predishen;
dispose(w); {освобождава се заеманата от последната добавена топка памет}
end;
procedure vavej; {процедура за въвеждане на топките със съответния цвят}
VAR
i:integer;
begin
write('Vavedete cviat na topka No1 (Za izhod -> "1"): ');
readln(s);
i:=1;
while s<>'1' do
begin
i:=i+1;
dobav(s);
write('Cviat na topka No',i,' : ');
readln(s);
end;
dobav(s); { добавя цвят '1' }
end; {край на процедура}
procedure izvej; {процедура за извеждане на цвета на топките по реда на изваждането им }
VAR
i:integer;
begin
i:=1; { промених на '1' }
while posleden^.cviat<>'1' do
begin
izvlich(s);
writeln(i,'.',s);
i:=i+1;
if i mod 24 = 0 then
readln
end;
end; {край на процедура}
BEGIN
posleden:=nil;
vavej;
izvej;
END.
Re:проблем при стартиране на програма на Паскал
Не е и така, понеже последната "топка" с цвят "1" така и не се добавя в стека, затова и извличането няма да спре коректно. И защо, по дяволите трябва да се черпи от стека до достигане на бяла топка, кафява топка или торен бръмбар?! Правилно е просто да провериш дали posleden не съдържа вече nil. Затова и дава грешка според мен, програмката опитва да вади данни от изпразнения вече стек, за които не е заделена памет въобще, та няма нищо общо с 32бит/64битовата ОС.
:offtopic:
Структурата на програмата ми се вижда малко нечиста... тая проверка дали стекът е празен трябва да си я върши процедурата izvej! В обектно-ориентираното програмиране "въведи" и "изведи" щяха да са си методи към класа "стек", а клиентът да не си блъска главата по какво аджеба ще познае коя топка е в дъното на торбата.
Re:проблем при стартиране на програма на Паскал
@XIIID - прав си!
промених проверката и нещата се оправиха! :Drinks:
Благодаря и на двамата за помоща.Ето и окончателния код:
Цитат:
Program cviat_topki;
TYPE
st15=string[15];
poredica=^element; {тип указател към един елемент от стека}
element=record
cviat:st15; {цвят на топката}
predishen:poredica; {предишен елемент}
end;
VAR
s:st15;
posleden:poredica;
procedure dobav (s:st15); {добавяне на елемент към стека}
VAR
w:poredica;
begin
new(w); {създава се елемент}
w^.cviat:=s;
w^.predishen:=posleden;
posleden:=w; {трябва да съдържа последната добавена топка към стека}
end; {край на процедура}
procedure izvlich(var s:st15);
VAR
w:poredica;
begin
s:=posleden^.cviat; {извлича се цвета на последната добавена топка}
w:=posleden;
posleden:=posleden^.predishen;
dispose(w); {освобождава се заеманата от последната добавена топка памет}
end;
procedure vavej; {процедура за въвеждане на топките със съответния цвят}
VAR
i:integer;
begin
write('Vavedete cviat na topka No1 (Za izhod -> "1"): ');
readln(s);
i:=1;
while s<>'1' do
begin
i:=i+1;
dobav(s);
write('Cviat na topka No',i,' : ');
readln(s);
end;
end; {край на процедура}
procedure izvej; {процедура за извеждане на цвета на топките по реда на изваждането им }
VAR
i:integer;
begin
i:=1;
while posleden <> nil do
begin
izvlich(s);
writeln(i,'.',s);
i:=i+1;
if i mod 24 = 0 then
readln
end;
end; {край на процедура}
BEGIN
posleden:=nil;
vavej;
writeln();
izvej;
readln;
END.