All pastes #262892 Raw Edit

Someone

public text v1 · immutable
#262892 ·published 2006-11-30 23:39 UTC
rendered paste body
with ada.text_io; use ada.text_io;
with ada.integer_text_io; use ada.integer_text_io;
with Unchecked_Conversion;

procedure topologicalSort is 
	
	--create linked list nodes for 2 dimensional array to hold pointers 
	
	numberOfActions: integer :=0;
	Kn: integer :=0;
	j: integer :=0;
	k: integer :=0;
	r: integer :=0;
	f: integer :=0;
		
	type sNode;
		
	type sLink is access sNode;
	
	type sNode is
	record
		succ: integer;
		next: sLink;
	end record;
	
	function sLinkToInt is new Unchecked_Conversion(sLink, integer); 
	function intTosLink is new Unchecked_Conversion(integer, sLink); 
	
	p: sLink;
	
	function getSize return integer is
		na: integer;
	begin
		put_line("+++++++++++++++++++++++++++++++++++++++++++++++");
		put_line("+++ Welcome to the Topological Sort Program +++ ");
		put_line("+++++++++++++++++++++++++++++++++++++++++++++++");
	
		put("Please enter the number of actions ::");
		ada.integer_text_io.get(na);
		
		
		return na;
	
	end getSize;
	begin
		
		numberofActions:=getSize;
		Kn:=numberOfActions;
		declare
		
		count: array (1 .. numberOfActions) of integer;
		top: array (1 .. numberOfActions) of sLink;
		qlink: array (0 .. numberOfActions) of integer;
	
		begin
	
			--Step1
			for k in 1 .. numberOfActions loop
				count(k):=0; 
				top(k):=null;
			end loop;
			
			
			
			--Step2
			put_line("Please enter relations one at a time:::::::::");
			put_line("Input in 'j k' fashion where j preceeds k:::::");
			put_line("to end the sequence, enter '1337'::::::::::::");
			
			loop
				get(j);
				exit when j = 1337;
				get(k);
				
					count(k):= count(k)+1;
					p:=new sNode'(k,top(j));
					top(j):=p;
				
			
			end loop;
			
			--Step3
			put("step3");
			r:=0;
			qlink(0):=0;
			
			for k in 1 .. numberOfActions loop
				if count(k)=0 then
					qlink(r):=k;
					r:=k;
				end if;
			end loop;
			f:=qlink(0);
			
			--Step4
			
			put("step4");
			while f /=0 loop
				put(f);
				kn:=kn-1;
				p:=top(f);
				top(f):=intTosLink(0);
				while p/=null and p /= intTosLink(0) loop
					count(p.succ) := count(p.succ)-1;
					if count(p.succ) = 0 then
						qlink(r):=p.succ;
						r:=p.succ;
					end if;
					p:=p.next;
				end loop;
				put(qlink(f)); --this is used to debug and has been identified as why top(f) gets the error raised CONSTRAINT_ERROR : topologicalsort.adb:101 index check failed

				f:=qlink(f);
			end loop;
			
			--Step5
			
			put("step5");
			if kn = 0 then
				put("Successful topological sort");
			else
				put("Failed topological sort, now printing error::");
				for k in 1 .. numberOfActions loop
					qlink(k):=0;
				end loop;
			end if;
			
			--Step6
			for k in 1 .. numberOfActions loop
				p:=top(k);
				top(k):=intTosLink(0);
				while p /= null and p /=intTosLink(0) and qlink(p.succ) = 0 loop --raised CONSTRAINT_ERROR : topologicalsort.adb:134 access check failed
					qlink(p.succ):=k;
					if p /= intTosLink(0) then
						p:=p.next;
					end if;
				end loop;
			end loop;
			
			--Step7
			k:=1;
			while(qlink(k) = 0) loop
				k:= k + 1;
			end loop;
			
			--Step8
			loop
				top(k):=intTosLink(1); k:=qlink(k);
			exit when top(k) /= intTosLink(0);
			end loop;
			
			--Step9
			while top(k) /= intTosLink(0) loop
				ada.integer_text_io.put(k);
				top(k):=intTosLink(0);
				k:=qlink(k);
			end loop;
			
			
		end;
end topologicalSort;