Need help debugging this

This is a discussion on Need help debugging this within the C Programming forums, part of the General Programming Boards category; Header file: Code: void initialize(int s[], int *count); void display(int s[], int count); Implementation file: Code: #include "Set.h" #define MAX ...

  1. #1
    Registered User
    Join Date
    Nov 2010
    Posts
    28

    Need help debugging this

    Header file:
    Code:
    void initialize(int s[], int *count);
    void display(int s[], int count);
    Implementation file:
    Code:
    #include "Set.h"
    #define MAX 10
    
    void initialize(int s[], int *count)
    {	
    	int i;
    	for(i=0; i < MAX; i++)
    	{
    		count = &s[i];
    		*(count + i) = 0;
    	}
    }
    
    void display(int s[], int count)
    {
    	int i;
    	for(i=count; i < MAX; i++)
    		printf("%d,", s[i]);
    }
    Main:
    Code:
    #include<stdio.h>
    #include<stdlib.h>
    #include "Set.h"
    
    #define MAX 10
    
    int main()
    {
    	int elements1[MAX];
    	int elements2[MAX];
    	int *cnt1 = 0;
    	int *cnt2 = 0;
    	int counter1 = 0;
    	int counter2 = 0;
    	
    	initialize(elements1, cnt1);
    	printf("Set 1 initialized.\n");
    	initialize(elements2, cnt2);
    	printf("Set 2 initialized.\n");
    	printf("\nDisplaying set 1...\n");
    	display(elements1, counter1);
    	printf("\nDisplaying set 2...\n");
    	display(elements1, counter2);
    	
    	return 0;
    }
    This code runs but the problem is, even when I want the sets to contain only zeros, negative numbers also get displayed. Help me determine which part of my code should be corrected to solve this run-time error. It seems to have something to do with the first function (i.e. the initialize function) but I can't understand why it's wrong.

    Thanks in advance for any help.

  2. #2
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    22,304
    What exactly is the initialize function supposed to do?
    C + C++ Compiler: MinGW port of GCC
    Version Control System: Bazaar

    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  3. #3
    Registered User
    Join Date
    Nov 2010
    Location
    Long Beach, CA
    Posts
    5,676
    Quote Originally Posted by We'reGeeks View Post
    Header file:
    Code:
    void initialize(int s[], int *count);
    void display(int s[], int count);
    Use include guards for your header files so they don't get included twice.

    Implementation file:
    Code:
    #include "Set.h"
    #define MAX 10
    
    void initialize(int s[], int *count)
    {	
    	int i;
    	for(i=0; i < MAX; i++)
    	{
    		count = &s[i];
    		*(count + i) = 0;
    	}
    }
    Just define MAX in Set.h
    You loop body only initializes every other element. The first time through, count = &s[0], which means *(count+0) refers to the first element. The next iteration, count = &s[1], which makes it seem like count is an array starting at the second index of s. Then, when you do *(count+1), you're looking at the second element of the "count" array, which is really the third element of s. Try just s[i] = 0; in your loop body. You also won't need to pass in count anymore.

    Code:
    void display(int s[], int count)
    {
    	int i;
    	for(i=count; i < MAX; i++)
    		printf("%d,", s[i]);
    }
    Why are you starting at count and going to MAX? Why not try the classic: for (i = 0; i < count; i++)?
    Main:
    Code:
    #include<stdio.h>
    #include<stdlib.h>
    #include "Set.h"
    
    #define MAX 10
    
    int main()
    {
    	int elements1[MAX];
    	int elements2[MAX];
    	int *cnt1 = 0;
    	int *cnt2 = 0;
    	int counter1 = 0;
    	int counter2 = 0;
    	
    	initialize(elements1, cnt1);
    	printf("Set 1 initialized.\n");
    	initialize(elements2, cnt2);
    	printf("Set 2 initialized.\n");
    	printf("\nDisplaying set 1...\n");
    	display(elements1, counter1);
    	printf("\nDisplaying set 2...\n");
    	display(elements1, counter2);
    	
    	return 0;
    }
    The declaration for cnt1 and cnt2 is most likely not what you want. You are declaring a pointer, so there is no place to store an actual number. Besides, it's irrelevant since your init function wont be using it anymore. Get rid of them. That last call to display should also read display(elements2...

  4. #4
    Registered User
    Join Date
    Nov 2010
    Posts
    28
    @laserlight: I'm trying to initialize a set. In my main function, I initialized both set 1 and set 2.
    @anduril: I can't implement the function the way you said I should because this is a homework where the header file is already given; meaning, I should use pointers with arrays. =/

    Anyways, I think I have already solved that part. I'm now trying to put an add function to my program. However, it's also having some problems. Please care to check where I went wrong.

    This is now my main:

    Code:
    #include<stdio.h>
    #include "Set.h"
    
    #define MAX 10
    
    int main()
    {
    	int elements1[MAX];
    	int elements2[MAX];
    	int *cnt1 = 0;
    	int *cnt2 = 0;
    	int counter1 = 0;
    	int counter2 = 0;
    	int choice = 0;
    	int item;
    	
    	initialize(elements1, cnt1);
    	printf("Set 1 initialized.\n");
    	initialize(elements2, cnt2);
    	printf("Set 2 initialized.\n");
    	printf("\nDisplaying set 1...\n");
    	display(elements1, counter1);
    	printf("\nDisplaying set 2...\n");
    	display(elements1, counter2);
    	printf("\n\nMENU:\n");
    	printf("1.) Add element to Set 1\n");
    	printf("2.) Add element to Set 2\n");
    	printf("3.) End\n\n");
    
    	while(counter1 < MAX || counter2 < MAX && choice != 3)
    	{
    		printf("? ");
    		scanf("%d", &choice);
    		switch(choice)
    		{	
    			case 1:
    				if(counter1 < MAX)
    				{
    					printf("\nEnter element: ");
    					scanf("%d", &item);
    					add(elements1, item, cnt1);
    					cnt1++;
    					counter1++;
    				}
    				else printf("\nArray full! Cannot add another element!\n");
    				break;
    			
    			case 2:
    				if(counter2 < MAX)
    				{
    					printf("\nEnter element: ");
    					scanf("%d", &item);
    					add(elements2, item, cnt2);
    					cnt2++;
    					counter2++;
    				}
    				else printf("\nArray full! Cannot add another element!\n");
    				break;
    			
    			default:
    				printf("\nInvalid choice.\n");
    				break;
    		}
    		
    		printf("\nSet 1:\n");
    		display(elements1, counter1);
    		printf("\nSet 2:\n");
    		display(elements2, counter2);
    		printf("\n\n");
    	}
    
    	printf("\nCan no longer add another element to either sets.\n");
    
    	return 0;
    }
    And this is the add function (which can only edit the first element of the array, btw)

    Code:
    void add(int s[],int elem,int *count)
    {
    	count = s;
    	*count = elem;
    }
    And just for you to have an idea about how this program would run, here's the modified initialize function:

    Code:
    void initialize(int s[], int *count)
    {	
    	int i;
    	for(i=0; i < MAX; i++)
    	{
    		count = &s[i];
    		*count = 0;
    	}
    }
    Last edited by We'reGeeks; 01-06-2011 at 05:40 AM.

  5. #5
    Registered User
    Join Date
    Nov 2010
    Location
    Long Beach, CA
    Posts
    5,676
    I know this is an assignment and you don't have total control over the code, but I think you're misunderstanding the professor's intentions of the given function prototypes. As laserlight was suggesting, it might help us if we had a more complete description of the assignment (i.e. post or link us to the assignment itself).

    I think we need to back way, way up. Let's start with your implementation of a set. You have two parts. One is an array to store the values, the other is an integer to store how many items you have in the set. If I wanted to know the first element in the set, I would look at set[0], the second element, set[1], etc. If my set had 3 elements, they would be at set[0], set[1], set[2] and count would equal 3. Count will always correspond to the index just after the last number in my set. Your display function suggests you understand at least this much, but I just wanted to be clear.

    Now let's talk about your initialize funciton. Presumably you need to do something like set every element of s to zero, then set count to zero. You would do that by looping through every element of s and setting s[i] to zero. Then you need to set count to zero. Since you were given the parameter as "int *count", you actually have a pointer to an integer (i.e. the address of an integer). You would set the integer at that address to zero by using the dereference operator, *, like so:
    *count = 0;

    That brings me to my next point: pointers. Declaring a pointer to an int, like "int *cnt1" doesn't actually give you any place to put a number. It only makes a variable to store an address, an address where you expect to find a number. Furthermore, you set the addresses in cnt1 and cnt2 to zero (which is probably an invalid address on your system), so any attemnt to do *cnt1 and change the value of the number it's pointing to will probably cause a seg fault. Incrementing a pointer using the ++ operator will change the value by the size of the element it points to. That is, doing cnt1++ is like doing cnt1 = cnt1 + sizeof(int). So cnt1 doesn't point to any of the elements in elements1 in main, nor does it actually reflect the number of elements in that set.

    You are using counter1 and counter2 to actually track the number of elements in elements1 and elements2. These are the variables that need to be passed to initialize and add so that they change when you initialize or add a set. There is one big thing to consider though. C uses pass by value, which means it passes a copy of the value in counter1 to a function. To get the value of counter1 in main to change when you initialize or add to a set, you need to pass in the address of counter1 so that the function knows the address of the actual variable, can go there, and can change the number. Then, when you get back to main, counter1 will have changed. This is how you simulate pass by reference in C. You use the & operator to get the address of a variable, so a function call to initialize would look like this:
    initialize(elements1, &counter1);

    Hopefully you can see now that you don't need cnt1 and cnt2.

    Lastly, let's take a look at your add function. If my set had 3 elements as above, and I wanted to add a fourth element, I would need to make set[3] equal to the new element and increase count by one, so it's 4. Then to add a fifth element, I would set set[4] to the new element and increase count to 5. Notice that each time I add, I am putting the new element the count'th index of set, then incrementing count. That's what your add function should do. Also, good design dictates that the add function should do everything related to the adding of an element to a set. That is, I shouldn't be responsible for incrementing counter1 on my own, somewhere in main. You need to pass the address of counter1 to add, in a similar fashion to the initialize example above.

    I hope that clears up some of the issues you're having.

  6. #6
    Registered User
    Join Date
    Nov 2010
    Location
    Long Beach, CA
    Posts
    5,676
    One more thing. I think you need to brush up on operator precedence in C. The following line has a problem since && is stronger than ||:

    Quote Originally Posted by We'reGeeks View Post
    while(counter1 < MAX || counter2 < MAX && choice != 3)[/code]
    That is equivalent to:
    Code:
    while(counter1 < MAX || (counter2 < MAX && choice != 3))
    When what I think you want is:
    Code:
    while((counter1 < MAX || counter2 < MAX) && choice != 3)

  7. #7
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    22,304
    Quote Originally Posted by We'reGeeks
    I'm trying to initialize a set. In my main function, I initialized both set 1 and set 2.
    There's a reason why I included the word "exactly"

    For example, you might state that the initialize function should initialise all MAX number of elements in s to 0, through the count pointer.
    C + C++ Compiler: MinGW port of GCC
    Version Control System: Bazaar

    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  8. #8
    Registered User
    Join Date
    Nov 2010
    Posts
    28
    @anduril & laserlight:
    Here is a link to the instructions in my assignment: Instructions

    @anduril:
    How am I going to use pointers if I used your method? And I would not be following instructions if I didn't pass the parameter cnt to functions initialize and add.
    Also, let me note that the parameters for the add function is lacking (as I figured because it actually needs an offset). Anyways, I think I have solved the add function part.
    But still, thank you for your advices.

    Now here comes a new problem. I'm adding a union function but there seems to be something wrong with it again (I guess I have a knack for getting things wrong all the time). I do understand what union means and thus, know how to get it. However, I can't implement my algorithm in C correctly. Please help me once again.

    Here's my union function:

    Code:
    void getUnion(int result[],int *count,int s1[],int count1, int s2[],int count2)
    {
    	int i, j;
    
    	for(i=0; i < MAX_RESULT; i++)
    	{
    		for(j=0; j < count2; j++)
    		{
    			if(s2[i] != s1[j] || contains(result, i-1, s1[j]) != 1)
    			{
    				count = &result[i];
    				*count = s1[j];
    			}
    			if(i >= count1)
    			{
    				count = &result[i];
    				*count = s2[i];
    			}
    		}
    	}
    	display(result,i);
    }
    Nothing gets displayed.

    And by the way, here's my working add function:

    Code:
    void add(int s[],int elem,int *count, int cnt) //cnt here is the offset
    {
    	count = &s[cnt]; 
    	*count = elem;
    }
    And here is my modified main function:

    Code:
    #include<stdio.h>
    #include "Set.h"
    
    int main()
    {
    	int elements1[MAX];
    	int elements2[MAX];
    	int resultSet[MAX_RESULT];                      //I have added #define MAX_RESULT  20 in the header file
    	int *cnt1 = 0, *cnt2 = 0, *cnt3 = 0;
    	int counter1 = 0, counter2 = 0;
    	int choice = 0;
    	int item;
    	int offset1 = 0, offset2 = 0;
    	int set;
    	int count1 = 0, count2 = 0;
    	
    	initialize(elements1, cnt1);
    	printf("Set 1 initialized.\n");
    	initialize(elements2, cnt2);
    	printf("Set 2 initialized.\n");
    	printf("\nDisplaying set 1...\n");
    	display(elements1, counter1);
    	printf("\nDisplaying set 2...\n");
    	display(elements1, counter2);
    	printf("\n\nMENU:\n");
    	printf("1.) Add element to Set 1\n");
    	printf("2.) Add element to Set 2\n");
    	printf("3.) Determine if an element exists in a set\n");
    	printf("4.) Determine if list is empty\n");
    	printf("5.) End");
    
    	while( offset1 < MAX || offset2 < MAX )
    	{
    		printf("\n\n? ");
    		scanf("%d", &choice);
    		if(choice == 1)
    		{
    			if(offset1 < MAX)
    			{
    				printf("\nEnter element: ");
    				scanf("%d", &item);
    				add(elements1, item, cnt1, offset1);
    				printf("\n\nElement added.\n");
    				offset1++;
    			}
    			else printf("\nArray full! Cannot add another element!\n");
    		}//end choice 1 -- add element to set 1
    
    		else if(choice == 2)
    		{
    			if(counter2 < MAX)
    			{
    				printf("\nEnter element: ");
    				scanf("%d", &item);
    				add(elements2, item, cnt2, offset2);
    				printf("\n\nElement added.\n");
    				offset2++;
    			}
    			else printf("\nArray full! Cannot add another element!\n");
    		}//end choice 2 -- add element to set 2
    
    		else if(choice == 3)
    		{
    			printf("\nFrom what set? ");
    			scanf("%d", &set);
    			printf("\nEnter element: ");
    			scanf("%d", &item);
    			if(set == 1)
    			{
    				if( contains(elements1, count1, item) == 1)
    					printf("\nElement exists.\n");
    				else printf("\nNo such element exists.\n");
    			}
    			else if(set == 2)
    			{
    				if( contains(elements2, count2, item) == 1)
    					printf("\nElement exists.\n");
    				else printf("\nNo such element exists.\n");
    			}
    			else printf("\nInvalid input.\n");
    		}//end choice 3 -- determine if element exists
    
    		else if(choice == 4)
    		{
    			printf("\nWhat set? ");
    			scanf("%d", &set);
    			if(set == 1)
    			{
    				if( isEmpty(offset1) == 1 )
    					printf("\nSet 1 is empty.\n");
    				else printf("\nSet 1 is not empty.\n");
    			}
    			else if(set == 2)
    			{
    				if( isEmpty(offset2) == 1 )
    					printf("\nSet 2 is empty.\n");
    				else printf("\nSet 2 is not empty.\n");
    			}
    			else printf("\nInvalid input.\n");
    		}//end choice 4 -- determine if list is empty
    
    		else if(choice == 5) break;
    		else
    		{
    			printf("\n\nInvalid choice.\n");
    		}
    		
    		if(offset1 == MAX && offset2 == MAX)
    			printf("\nCan no longer add another element to either sets.\n\n");
    		
    	}
    	
    	printf("\nSet 1:\n");
    	display(elements1, counter1);
    	printf("\nSet 2:\n");
    	display(elements2, counter2);
    	printf("\n\nUnion:\n");
    	getUnion(resultSet, cnt3, elements1, offset1, elements2, offset2);
    	
    	
    
    	return 0;
    }
    Thanks in advance for any help.
    Last edited by We'reGeeks; 01-07-2011 at 07:05 PM.

  9. #9
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,185
    So let's spend seventy-three seconds with this "working" "add" function:
    Code:
    void add(int s[],int elem,int *count, int cnt)
    {
    	count = &s[cnt];
    	*count = elem;
    }
    The directions from your handout say:
    Quote Originally Posted by Directions
    void add(int s[],int elem,int *count);
    Simply store elem in the array indexed by count then increment count
    Notice how, for one, you seem to be unable to count to three, as you have four arguments passed to your function. In addition, you throw away the pointer to the count variable that is supposed to be incremented, making it difficult to increment said count variable.

    Also I am interested as to what you think you are trying to do with your union function. We should probably start with your version-in-English, rather than your version-in-C, and go from there.

  10. #10
    Registered User
    Join Date
    Nov 2010
    Posts
    28
    @tabstop:

    Oops, I didn't catch that part of the instruction. I guess I was only concerned with how to use the pointer parameter. Sorry. =/

    Code:
    void add(int s[],int elem,int *count, int cnt) //cnt here is the offset
    {
    	count = s;
    	*(count + cnt) = elem;
    }
    Combining all the elements of any two sets is called the Union of those sets. So for instance, given set1: {1,2,3} and set2: {345}, union : {1,2,3,4,5}. Right?

    So here's my algorithm:

    Compare ith element of set 2 with each elements of set 1. For as long as the ith element in set2 does not equal to any element in set1, ith element is stored in the array 'result' (as part of the union). When all elements of set 2 have each been compared to all elements of set 1, see if there are still elements in set 1 that have not been stored in 'result' and add them directly to 'result'.
    Last edited by We'reGeeks; 01-07-2011 at 07:44 PM.

  11. #11
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,185
    Quote Originally Posted by We'reGeeks View Post
    @tabstop:

    Oops, I didn't catch that part of the instruction. I guess I was only concerned with how to use the pointer parameter. Sorry. =/

    Code:
    void add(int s[],int elem,int *count, int cnt) //cnt here is the offset
    {
    	count = s;
    	*(count + cnt) = elem;
    }
    So ... so ... but ... ... ... ...

    You still are trying to accept four arguments. You still aren't incrementing count. Did you read any of the instructions? Do you know what the "count" variable is supposed to be? I suspect you are going to test your instructor/TA's resolve about not giving negative grades.

    Quote Originally Posted by We'reGeeks View Post
    Combining all the elements of any two sets is called the Union of those sets. So for instance, given set1: {1,2,3} and set2: {345}, union : {1,2,3,4,5}. Right?

    So here's my algorithm:

    Compare ith element of set 2 with each elements of set 1. For as long as the ith element in set2 does not equal to any element in set1, ith element is stored in the array 'result' (as part of the union). When all elements of set 2 have each been compared to all elements of set 1, see if there are still elements in set 1 that have not been stored in 'result' and add them directly to 'result'.
    That's not a completely horrific algorithm. It would certainly be far easier to just put all the elements of set 1 into your result set first, then do checking on set 2. And if your add code was designed properly (this is your instructor's fault, not yours) you wouldn't have to work nearly so hard at that part. (We appear to be doing a multi-set here, since there's nothing stopping you from making a set of all threes.)

    What's worse is that it doesn't have a great deal of resemblance to your C code. Your English description above pretty clearly has three loops in it (one loop for going through the ith elements of set 2, with a nested loop inside it to check it against the elements of set 1, followed by another for loop to pick up the stray elements in set 1. Your C code pretty clearly has two for loops, one of which (the first, or outer, one) is looping over nothing in particular, which certainly can't help.

  12. #12
    Registered User
    Join Date
    Nov 2010
    Location
    Long Beach, CA
    Posts
    5,676
    Quote Originally Posted by We'reGeeks View Post
    @anduril:
    How am I going to use pointers if I used your method? And I would not be following instructions if I didn't pass the parameter cnt to functions initialize and add.
    Look at the function signature for initialize: void initialize(int s[], int *count). See the * next to count? That means that count is a pointer to an int. The instructions from your assignment say "simply set count to 0". That means all you need to do in the function is: *count = 0;. And yes, that does use a pointer, since it uses count, which is a pointer to an int. Not only do you not need to, but you most definitely shouldn't reassign count. count contains the address of the variable in main that you use to track the number of elements in a set. *count gives you the number pointed to by count.

    Also, let me note that the parameters for the add function is lacking (as I figured because it actually needs an offset). Anyways, I think I have solved the add function part.
    None of the add functions you've proposed are correct. Your professor did not give you a bogus function signature for add. There should be exactly 3 parameters. There are precisely two things you need to do:
    1. store elem in the array indexed by count
    2. increment count

    The only reason you think they're working is because your scrambling the address in count, reassigning it, then incrementing count outside the add function. This is bad. Again, in add, count is an int *, so it contains the address of an int variable and again, using it in add means you would be "using a pointer". You need to store elem in the array indexed by count (actually the number of elements, which is pointed to by count). So, since count is the address, the actual number of elements is again *count. Make that the index into your array. Set that spot in the array to elem. Then, increment count. It will be easiest to tackle this in the form of x = x + 1, since the ++ operator gets a bit tricky when used with the * (dereference) operator.

    Now here comes a new problem. I'm adding a union function but there seems to be something wrong with it again (I guess I have a knack for getting things wrong all the time). I do understand what union means and thus, know how to get it. However, I can't implement my algorithm in C correctly. Please help me once again.
    I know what tabstop said, and he's right that you need a clear understanding of the problem in your natural language before you can go on solving the problem in C, but don't start the union function until you have initialize, display, add, contains and isEmpty done correctly. You'll only cause nightmares.
    Last edited by anduril462; 01-07-2011 at 08:40 PM.

  13. #13
    Registered User
    Join Date
    Nov 2010
    Posts
    28
    Thank you anduril and tabstop.

    You need to store elem in the array indexed by count (actually the number of elements, which is pointed to by count). So, since count is the address, the actual number of elements is again *count. Make that the index into your array. Set that spot in the array to elem. Then, increment count.

    Do you mean do this:

    Code:
    void add(int s[],int elem,int *count)
    {	
    	s[*count] = elem;
    	count =  count + 1;
    }
    I get a fatal error when I run the program. =/

  14. #14
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,185
    Quote Originally Posted by We'reGeeks View Post
    Thank you anduril and tabstop.




    Do you mean do this:

    Code:
    void add(int s[],int elem,int *count)
    {	
    	s[*count] = elem;
    	count =  count + 1;
    }
    I get a fatal error when I run the program. =/
    You need to update the value count points to, not the value of count itself. (You're not trying to move the pointer around, but affect the actual count.)

  15. #15
    Registered User
    Join Date
    Nov 2010
    Location
    Long Beach, CA
    Posts
    5,676
    Quote Originally Posted by We'reGeeks View Post
    Do you mean do this:

    Code:
    void add(int s[],int elem,int *count)
    {	
    	s[*count] = elem;
    	count =  count + 1;
    }
    I get a fatal error when I run the program. =/
    YES!!! I think you're finally there! Well, at least half way there. Notice how count is a pointer, so to get the number stored there, which you use as an index for s, you dereferenced it? You need to do that when you add 1 to it as well. Remember, count is an address, *count is the number stored there.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. help debugging in Pelles C IDE
    By gaurav9991 in forum C Programming
    Replies: 3
    Last Post: 10-30-2010, 08:15 AM
  2. help on debugging
    By Masterx in forum C++ Programming
    Replies: 56
    Last Post: 01-30-2009, 10:09 AM
  3. Dev-C++: Problems with Breakpoint Debugging
    By Thileepan_Bala in forum C Programming
    Replies: 1
    Last Post: 01-17-2008, 10:48 AM
  4. Problem in debugging in Eclipse
    By Bargi in forum Linux Programming
    Replies: 1
    Last Post: 08-21-2007, 10:53 AM
  5. Debugging book recommendation
    By dagans in forum Projects and Job Recruitment
    Replies: 1
    Last Post: 09-13-2005, 08:35 PM

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21