Troublesome error, please help!

So my school assignment was this: Write a program that creates three identical arrays, list1, list2, and list3 of 5000 elements. The program then sorts list1 using bubble sort, list2 using selection sort, and list3 using insertion sort and outputs the number of comparisons and item assignments made by each sorting algorithm.

This might sounds fairly simple to some, but for someone who has little to no experience with c++ (such as myself) this is pretty tricky. So this is what I've come up with so far.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
//In my functions.cpp file
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>

using namespace std; 

// global constant value to create three arrays of 5000 elements
const int MAX = 5000;

// generates random arrays with numbers between 1 to 500
void generateRandomArray(int arr1[],int arr2[],int arr3[])
{
    srand(time_t(0));
        for (int i = 0;i < MAX;i++)
            arr1[i]= arr2[i]= arr3[i]= rand()%500+1;
} // end generateRandomArray

void bubbleSort( int num[], int &comparisons, int &itemAssignments)
{
	{
	bool isSort = false;
	while( !isSort ){
		isSort = true;
		for (int index = 0; index < MAX-1;index++)
		{
			//increment comparisons by one
			comparisons++;
			if (num[index] > num[index + 1])
			{
				isSort = false;
				int temp = num[index];
				num[index] = num[index + 1];
				num[index + 1] = temp;
				//increment itemAssignments value by one // 3
				itemAssignments += 3;
			}
		}
	}
	//}
} //end of bubbleSort method

// // selectionSort
void selectionSort( int num[], int &comparisons, int &itemAssignments)
{
//local variables
int index;
int smallestIndex;
int location;
int temp;

    for (index = 0; index < MAX-1;index++)
    {
    smallestIndex = index;
        for (location = index +1; location < MAX;location++)
        {
        //increment comparisons by one
        comparisons++;
            if (num[location] < num[smallestIndex])
            {
            smallestIndex = location;
            }
    } //end of location loop

temp = num[smallestIndex];
num[smallestIndex] = num[index];
//increment assignments by three
itemAssignments = itemAssignments + 3;
num[index] = temp;
} //end of index for loop
} //end of selection sort

//insertionSort method
void insertionSort( int num[], int &comparisons, int &itemAssignments)
{
//local declarations of variables
int firstOutOfOrder,location;
int temp;

for (firstOutOfOrder = 1; firstOutOfOrder < MAX; firstOutOfOrder++)
{
//increment comparisons value by one
comparisons++;
if (num[firstOutOfOrder] < num[firstOutOfOrder-1])
{
comparisons++;
temp = num[firstOutOfOrder];
location = firstOutOfOrder;
//increment assignment value by two
itemAssignments = itemAssignments+2;

    do
    {
    num[location] = num[location-1];
    itemAssignments++;
    location--;
    comparisons++;
    } 
    while(location > 0 && num[location -1] > temp);
    num[location] = temp;
    itemAssignments++;
    }
    }}} //end insertion sort

//In my main.cpp file
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>

using namespace std; 

// global constant value to create three arrays of 5000 elements
const int MAX = 5000;

// generates random arrays with numbers between 1 to 500
void generateRandomArray(int arr1[],int arr2[],int arr3[])
{
    srand(time_t(0));
        for (int i = 0;i < MAX;i++)
            arr1[i]= arr2[i]= arr3[i]= rand()%500+1;
} // end generateRandomArray

void bubbleSort( int num[], int &comparisons, int &itemAssignments)
{
	//int index; ????
	//for (int iteration = 0; iteration < MAX-1; /*index++???// iteration++)
	{
	bool isSort = false;
	while( !isSort ){
		isSort = true;
		for (int index = 0; index < MAX-1;index++)
		{
			//increment comparisons by one
			comparisons++;
			if (num[index] > num[index + 1])
			{
				isSort = false;
				int temp = num[index];
				num[index] = num[index + 1];
				num[index + 1] = temp;
				//increment itemAssignments value by one // 3
				itemAssignments += 3;
			}
		}
	}
	//}
} //end of bubbleSort method

// // selectionSort
void selectionSort( int num[], int &comparisons, int &itemAssignments)
{
//local variables
int index;
int smallestIndex;
int location;
int temp;

    for (index = 0; index < MAX-1;index++)
    {
    smallestIndex = index;
        for (location = index +1; location < MAX;location++)
        {
        //increment comparisons by one
        comparisons++;
            if (num[location] < num[smallestIndex])
            {
            smallestIndex = location;
            }
    } //end of location loop

temp = num[smallestIndex];
num[smallestIndex] = num[index];
//increment assignments by three
itemAssignments = itemAssignments + 3;
num[index] = temp;
} //end of index for loop
} //end of selection sort

//insertionSort method
void insertionSort( int num[], int &comparisons, int &itemAssignments)
{
//local declarations of variables
int firstOutOfOrder,location;
int temp;

for (firstOutOfOrder = 1; firstOutOfOrder < MAX; firstOutOfOrder++)
{
//increment comparisons value by one
comparisons++;
if (num[firstOutOfOrder] < num[firstOutOfOrder-1])
{
comparisons++;
temp = num[firstOutOfOrder];
location = firstOutOfOrder;
//increment assignment value by two
itemAssignments = itemAssignments+2;

    do
    {
    num[location] = num[location-1];
    itemAssignments++;
    location--;
    comparisons++;
    } 
    while(location > 0 && num[location -1] > temp);
    num[location] = temp;
    itemAssignments++;
    }
    }}} //end insertion sort

//And finally, these are the errors that show up for me
functions.cpp: In function ‘void bubbleSort(int*, int&, int&)’:
functions.cpp:47:1: error: a function-definition is not allowed here before ‘{’ token
 {
 ^
functions.cpp:77:1: error: a function-definition is not allowed here before ‘{’ token
 {
 ^


Any help is greatly appreciated!
I bet if you indented it properly you would see the problem.
I still don't see the problem, unfortunately...but thank you for your assistance!
Then post your code with proper indentation.
Your original post doesn't make sense since it seems you meant to show two files but instead posted the same file twice (i.e., functions.cpp and main.cpp are identical above).
So sorry about that! It must've slipped my mind...

Here is the correct code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//In my functions.cpp file
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>

using namespace std; 

// global constant value to create three arrays of 5000 elements
const int MAX = 5000;

// generates random arrays with numbers between 1 to 500
void generateRandomArray(int arr1[],int arr2[],int arr3[])
    {
        srand(time_t(0));
            for (int i = 0;i < MAX;i++)
                arr1[i]= arr2[i]= arr3[i]= rand()%500+1;
    } // end generateRandomArray

void bubbleSort( int num[], int &comparisons, int &itemAssignments)
{
	{
	bool isSort = false;
	while( !isSort ){
		isSort = true;
		for (int index = 0; index < MAX-1;index++)
		{
			//increment comparisons by one
			comparisons++;
			if (num[index] > num[index + 1])
			{
				isSort = false;
				int temp = num[index];
				num[index] = num[index + 1];
				num[index + 1] = temp;
				//increment itemAssignments value by one // 3
				itemAssignments += 3;
			}
		}
	}
	//}
} //end of bubbleSort method

// selectionSort
void selectionSort( int num[], int &comparisons, int &itemAssignments)
{
    //local variables
    int index;
    int smallestIndex;
    int location;
    int temp;

        for (index = 0; index < MAX-1;index++)
        {
        smallestIndex = index;
            for (location = index +1; location < MAX;location++)
            {
            //increment comparisons by one
            comparisons++;
                if (num[location] < num[smallestIndex])
                {
                smallestIndex = location;
                }
        } //end of location loop

    temp = num[smallestIndex];
    num[smallestIndex] = num[index];
//increment assignments by three
    itemAssignments = itemAssignments + 3;
    num[index] = temp;
        } //end of index for loop
    } //end of selection sort

//insertionSort method
void insertionSort( int num[], int &comparisons, int &itemAssignments)
    {
    //local declarations of variables
    int firstOutOfOrder,location;
    int temp;

        for (firstOutOfOrder = 1; firstOutOfOrder < MAX;                   firstOutOfOrder++)
        {
//increment comparisons value by one
            comparisons++;
                if (num[firstOutOfOrder] < num[firstOutOfOrder-1])
                    {
                        comparisons++;
                        temp = num[firstOutOfOrder];
                        location = firstOutOfOrder;
                        //increment assignment value by two
                        itemAssignments = itemAssignments+2;

                           do
                                {
                                    num[location] = num[location-1];
                                    itemAssignments++;
                                    location--;
                                    comparisons++;
                                } 
    while(location > 0 && num[location -1] > temp);
    num[location] = temp;
    itemAssignments++;
    }
    }}} //end insertion sort 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//In my main.cpp file
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "functions.cpp"

using namespace std; 

int main()
{
    int list1[5000]; 
    int list2[5000];
    int list3[5000];

    int compBubbleSort = 0, compSelectionSort = 0, compInsertionSort = 0;
    int assignBubbleSort = 0, assignSelectionSort = 0, assignInsertionSort = 0;

    fillArray(list1, 5000);
    copyArray(list1, list2, 5000);
    copyArray(list1, list3, 5000);

    bubbleSort(list1, 5000, compBubbleSort, assignBubbleSort);  
    selectionSort(list2, 5000, compSelectionSort, assignSelectionSort);  
    insertionSort(list3, 5000, compInsertionSort, assignInsertionSort);   

    cout << "Number of comparisons---" << endl;
    cout << "  Bubble sort: " << compBubbleSort << endl;
    cout << "  Selection sort: " << compSelectionSort << endl;
    cout << "  Insertion sort: " << compInsertionSort << endl << endl;

    cout << "Number of item assignments---" << endl;
    cout << "  Bubble sort: " << assignBubbleSort << endl;
    cout << "  Selection sort: " << assignSelectionSort << endl;
    cout << "  Insertion sort: " << assignInsertionSort << endl << endl;


    return 0;   
}
This is your code, indented according to what you've actually written (but not what you meant).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//In my functions.cpp file
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>

using namespace std;

// global constant value to create three arrays of 5000 elements
const int MAX = 5000;

// generates random arrays with numbers between 1 to 500
void generateRandomArray(int arr1[], int arr2[], int arr3[])
{
  srand(time_t(0));
  for (int i = 0; i < MAX; i++)
    arr1[i] = arr2[i] = arr3[i] = rand() % 500 + 1;
}                               // end generateRandomArray

void bubbleSort(int num[], int &comparisons, int &itemAssignments)
{
  {
    bool isSort = false;
    while (!isSort) {
      isSort = true;
      for (int index = 0; index < MAX - 1; index++) {
        //increment comparisons by one
        comparisons++;
        if (num[index] > num[index + 1]) {
          isSort = false;
          int temp = num[index];
          num[index] = num[index + 1];
          num[index + 1] = temp;
          //increment itemAssignments value by one // 3
          itemAssignments += 3;
        }
      }
    }
    //}
  }                             //end of bubbleSort method

// selectionSort
  void selectionSort(int num[], int &comparisons, int &itemAssignments) {
    //local variables
    int index;
    int smallestIndex;
    int location;
    int temp;

    for (index = 0; index < MAX - 1; index++) {
      smallestIndex = index;
      for (location = index + 1; location < MAX; location++) {
        //increment comparisons by one
        comparisons++;
        if (num[location] < num[smallestIndex]) {
          smallestIndex = location;
        }
      }                         //end of location loop

      temp = num[smallestIndex];
      num[smallestIndex] = num[index];
//increment assignments by three
      itemAssignments = itemAssignments + 3;
      num[index] = temp;
    }                           //end of index for loop
  }                             //end of selection sort

//insertionSort method
  void insertionSort(int num[], int &comparisons, int &itemAssignments) {
    //local declarations of variables
    int firstOutOfOrder, location;
    int temp;

    for (firstOutOfOrder = 1; firstOutOfOrder < MAX; firstOutOfOrder++) {
//increment comparisons value by one
      comparisons++;
      if (num[firstOutOfOrder] < num[firstOutOfOrder - 1]) {
        comparisons++;
        temp = num[firstOutOfOrder];
        location = firstOutOfOrder;
        //increment assignment value by two
        itemAssignments = itemAssignments + 2;

        do {
          num[location] = num[location - 1];
          itemAssignments++;
          location--;
          comparisons++;
        }
        while (location > 0 && num[location - 1] > temp);
        num[location] = temp;
        itemAssignments++;
      }
    }
  }
}                               //end insertion sort 

Why is line 39 commented out?

Line 43 is indented one level (it shouldn't be).

Ditto line 69.

Line 96 is apparently the end of bubble sort, not the end of selection sort.

1
2
3
4
5
6
7
8
//And finally, these are the errors that show up for me
functions.cpp: In function ‘void bubbleSort(int*, int&, int&)’:
functions.cpp:47:1: error: a function-definition is not allowed here before ‘{’ token
 {
 ^
functions.cpp:77:1: error: a function-definition is not allowed here before ‘{’ token
 {
 ^

Your compiler is correct. C++ does not allow nested function definitions.

By commenting out that first brace, you completely threw off the parser!

Notice how really good indentation shows up this problem clearly.
Thank you for this help, but I am still getting errors that I don't know how to fix, so could you help me out there?
The same errors?

Or some new errors?

Be SPECIFIC.
- post your latest properly indented code.
- post your actual error messages.

How are we supposed to guess what you've changed and what you've seen as a result.


> so could you help me out there?
http://www.catb.org/esr/faqs/smart-questions.html#prune
After indenting the code, these are the errors I get:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
main.cpp: In function ‘int main()’:
main.cpp:17:5: error: ‘fillArray’ was not declared in this scope
     fillArray(list1, 5000);
     ^~~~~~~~~
main.cpp:18:5: error: ‘copyArray’ was not declared in this scope
     copyArray(list1, list2, 5000);
     ^~~~~~~~~
main.cpp:21:61: error: cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’
 compBubbleSort, assignBubbleSort);
                                 ^
In file included from main.cpp:4:0:
functions.cpp:19:6: note: in passingargument 2 of ‘void bubbleSort(int*,int&, int&)’
 void bubbleSort(int num[], int &comparisons, int &itemAssignments)
      ^~~~~~~~~~
main.cpp:22:70: error: cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’
 lectionSort, assignSelectionSort);
                                 ^
In file included from main.cpp:4:0:
functions.cpp:42:8: note: in passingargument 2 of ‘void selectionSort(int*, int&, int&)’
   void selectionSort(int num[], int&comparisons, int &itemAssignments) {
        ^~~~~~~~~~~~~
main.cpp:23:70: error: cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’
 ertionSort, assignInsertionSort);
                                ^
In file included from main.cpp:4:0:
functions.cpp:68:8: note: in passingargument 2 of ‘void insertionSort(int*, int&, int&)’
   void insertionSort(int num[], int&comparisons, int &itemAssignments) {
        ^~~~~~~~~~~~~
> main.cpp:17:5: error: ‘fillArray’ was not declared in this scope
> main.cpp:18:5: error: ‘copyArray’ was not declared in this scope
Your functions.cpp contains neither of these functions at all.
You need to write them!.

> main.cpp:21:61: error: cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’
> compBubbleSort, assignBubbleSort);
Check your function prototypes.
They expect 3 parameters.
You're passing 4 parameters.

> #include "functions.cpp"
This is a very bad way to do things, but it will work for today.
Don't make a habit of using this approach in future.
So I made some changes to my code, and some new errors occurred.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//In my main.cpp file
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "functions.cpp"

using namespace std; 

int main()
{
    int list1[5000]; 
    int list2[5000];
    int list3[5000];

    int compBubbleSort = 0, compSelectionSort = 0, compInsertionSort = 0;
    int assignBubbleSort = 0, assignSelectionSort = 0, assignInsertionSort = 0;

    //fillArray(list1, 5000);
    //copyArray(list1, list2, 5000);
    //copyArray(list1, list3, 5000);

    bubbleSort(list1, compBubbleSort, assignBubbleSort);  
    selectionSort(list2, compSelectionSort, assignSelectionSort);  
    insertionSort(list3, compInsertionSort, assignInsertionSort);   

    cout << "Number of comparisons---" << endl;
    cout << "  Bubble sort: " << compBubbleSort << endl;
    cout << "  Selection sort: " << compSelectionSort << endl;
    cout << "  Insertion sort: " << compInsertionSort << endl << endl;

    cout << "Number of item assignments---" << endl;
    cout << "  Bubble sort: " << assignBubbleSort << endl;
    cout << "  Selection sort: " << assignSelectionSort << endl;
    cout << "  Insertion sort: " << assignInsertionSort << endl << endl;


    return 0;   
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//In my function.cpp file
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>

using namespace std;

// global constant value to create three arrays of 5000 elements
const int MAX = 5000;

// generates random arrays with numbers between 1 to 500
void generateRandomArray(int arr1[], int arr2[], int arr3[])
{
  srand(time_t(0));
  for (int i = 0; i < MAX; i++)
    arr1[i] = arr2[i] = arr3[i] = rand() % 500 + 1;
}                               // end generateRandomArray

void bubbleSort(int num[], int &comparisons, int &itemAssignments)
{
  {
    bool isSort = false;
    while (!isSort) {
      isSort = true;
      for (int index = 0; index < MAX - 1; index++) {
        //increment comparisons by one
        comparisons++;
        if (num[index] > num[index + 1]) {
          isSort = false;
          int temp = num[index];
          num[index] = num[index + 1];
          num[index + 1] = temp;
          //increment itemAssignments value by one // 3
          itemAssignments += 3;
        }
      }
    }
   }
  }                             //end of bubbleSort method

// selectionSort
  void selectionSort(int num[], int &comparisons, int &itemAssignments) {
    //local variables
    int index;
    int smallestIndex;
    int location;
    int temp;

    for (index = 0; index < MAX - 1; index++) {
      smallestIndex = index;
      for (location = index + 1; location < MAX; location++) {
        //increment comparisons by one
        comparisons++;
        if (num[location] < num[smallestIndex]) {
          smallestIndex = location;
        }
      }                         //end of location loop

      temp = num[smallestIndex];
      num[smallestIndex] = num[index];
//increment assignments by three
      itemAssignments = itemAssignments + 3;
      num[index] = temp;
    }                           //end of index for loop
  }                             //end of selection sort

//insertionSort method
  void insertionSort(int num[], int &comparisons, int &itemAssignments) {
    //local declarations of variables
    int firstOutOfOrder, location;
    int temp;

    for (firstOutOfOrder = 1; firstOutOfOrder < MAX; firstOutOfOrder++) {
//increment comparisons value by one
      comparisons++;
      if (num[firstOutOfOrder] < num[firstOutOfOrder - 1]) {
        comparisons++;
        temp = num[firstOutOfOrder];
        location = firstOutOfOrder;
        //increment assignment value by two
        itemAssignments = itemAssignments + 2;

        do {
          num[location] = num[location - 1];
          itemAssignments++;
          location--;
          comparisons++;
        }
        while (location > 0 && num[location - 1] > temp);
        num[location] = temp;
        itemAssignments++;
      }
    }
  } //end insertion sort  


1
2
3
4
5
6
7
8
9
10
11
12
13
/tmp/cc54DlpS.o: In function `generateRandomArray(int*, int*, int*)':
main.cpp:(.text+0x0): multiple definition of `generateRandomArray(int*, int*, int*)'
/tmp/ccpjRMxz.o:functions.cpp:(.text+0x0): first defined here
/tmp/cc54DlpS.o: In function `bubbleSort(int*, int&, int&)':
main.cpp:(.text+0xa8): multiple definition of `bubbleSort(int*, int&, int&)'
/tmp/ccpjRMxz.o:functions.cpp:(.text+0xa8): first defined here
/tmp/cc54DlpS.o: In function `selectionSort(int*, int&, int&)':
main.cpp:(.text+0x1a3): multiple definition of `selectionSort(int*, int&,int&)'
/tmp/ccpjRMxz.o:functions.cpp:(.text+0x1a3): first defined here
/tmp/cc54DlpS.o: In function `insertionSort(int*, int&, int&)':
main.cpp:(.text+0x2a4): multiple definition of `insertionSort(int*, int&,int&)'
/tmp/ccpjRMxz.o:functions.cpp:(.text+0x2a4): first defined here
collect2: error: ld returned 1 exit status
In salemc's last post, they pointed out that including a .cpp file is a bad thing to do.
This has bitten you. Your compiler dutifully included function.cpp as you instructed, but it also picked it up as a separate file to be compiled, thereby including your functions twice in the object file.

@AbstractionAnon so what would be the appropriate fix for this issue then? Any help is greatly appreciated!
The proper way to do this with two source files is to compile each of the two files separately (which you are currently doing). Change the #include functions.cpp to #include functions.h and place prototypes of each of your functions in functions.h.
@AbstractionAnon,

Thank you so much! This worked perfectly.
Topic archived. No new replies allowed.