Typical Newbie Issue (Linker Error)

Hi everyone,

My name is Anthony and I and currently studying C++ and OOP. I have an assignment for my midterm I am working on and am struggling greatly. I don't have a 100% grasp on pointers and am trying to make them work. I am receiving a Linker Error Undefined reference to Pointer and Sorting in my code. I have been up all night and now still struggling to figure out what it is that I am doing wrong here. Any help would be greatly appreciated.

Anthony P.

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
#include<fstream>
#include<iostream>
#include<iomanip>
#include<algorithm>

using namespace std;

//Function Prototypes
int readalldata(long int[], int[], float[], const int);
void findovertimehours(int[],int[],int);
void findovertimepay(int[],float[],float[],int);
void findregularhours(int[],int[],int);
void findregularpay(int[],float[],float[],int);
void findgrosspay(float[],float[],float[],int);
void findtaxrate(float[],float[],int);
void findtaxamount(float[],float[],float[],int);
void findnetpay(float[],float[],float[],int);
void findsum(float[],int);
void findavg(int);
void printalldata(long int[],int[],float[],float[],float[],float[],float[],int);
void displayheader(void);
void displaycalc(float[],int);
void pointer(float[],float[],int,int);
void sorting(int,int,int,int,float[],float);
float sum;
float avg;


int main(){
     const int MAXSIZE=100; //Maximum of 100 employees
     
     //Delcaration of Variables
     int i,j,x,n;
     long int id[MAXSIZE];
     int hoursworked[MAXSIZE],overtimehours[MAXSIZE];
     int regularhours[MAXSIZE];
     float hourlyrate[MAXSIZE];float regularpay[MAXSIZE];
     float overtimepay[MAXSIZE];float grosspay[MAXSIZE];
     float taxrate[MAXSIZE];float taxamount[MAXSIZE];float netpay[MAXSIZE];
     float (*p[MAXSIZE]);
     int sortedflag=0;
     float (*temp);
     
     //Function Calls
     n=readalldata(id,hoursworked,hourlyrate,MAXSIZE);//Get All Data
     findovertimehours(hoursworked,overtimehours,n);
     findovertimepay(overtimehours,hourlyrate,overtimepay,n);
     findregularhours(hoursworked,regularhours,n);
     findregularpay(regularhours,regularpay,hourlyrate,n);
     findgrosspay(regularpay,overtimepay,grosspay,n);
     findtaxrate(grosspay,taxrate,n);
     findtaxamount(grosspay,taxamount,taxrate,n);
     findnetpay(grosspay,netpay,taxamount,n);
     findsum(netpay,n);
     findavg(n);
     displayheader();
     printalldata(id,hoursworked,hourlyrate,overtimepay,grosspay,taxamount,
     netpay,n);
     displaycalc(netpay,n);
     pointer((*p),netpay,i,n);
     sorting(sortedflag,n,i,j,(*p),(*temp));

     cout<<"Program created by Anthony A. Pellegrino"<<endl;
     
system("PAUSE");
return 0;
     }//Main
     
     //Function Definitions
     int readalldata(long int id[],int hoursworked[],float hourlyrate[], int n){
         ifstream fin("payroll7.in");
         n=0;
         
         while(fin>>id[n]>>hoursworked[n]>>hourlyrate[n]) n++;
         
         fin.close();
         return n;
         }//Read All Data
         
     void findovertimehours(int hoursworked[],int overtimehours[], int n){
          for(int i=0;i<n;i++){
                  if(hoursworked[i]>40)overtimehours[i]=hoursworked[i]-40;
                  else overtimehours[i]=0;
                  }//FOR
                  }//FINDOVERTIMEHOURS
     
     void findovertimepay(int overtimehours[],float hourlyrate[],
          float overtimepay[],int n){
                for(int i=0;i<n;i++){
                        overtimepay[i]=overtimehours[i]*hourlyrate[i]*1.5;
                   }//FOR
                   }//FINDOVERTIMEPAY
                   
     void findregularhours(int hoursworked[],int regularhours[], int n){
          for(int i=0;i<n;i++){
                  if(hoursworked[i]>40) regularhours[i]=40;
                  else regularhours[i]=hoursworked[i];
                  }//FOR
                  }//FINDREGULARHOURS

     void findregularpay(int regularhours[], float regularpay[],
                         float hourlyrate[],int n){
          for(int i=0;i<n;i++){
                  regularpay[i]=regularhours[i]*hourlyrate[i];
                  }//FOR
                  }//FINDREGULARPAY

     void findgrosspay(float regularpay[],float overtimepay[],
                       float grosspay[],int n){
          for(int i=0;i<n;i++){
                  grosspay[i]=regularpay[i]+overtimepay[i];
                  }//FOR
                  }//FINDGROSSPAY

     void findtaxrate(float grosspay[],float taxrate[],int n){
          for(int i=0;i<n;i++){
                  if(grosspay[i]>4000.00) taxrate[i]=0.40;
                  else if(grosspay[i]>3000.00) taxrate[i]=0.30;
                  else if(grosspay[i]>1000.00) taxrate[i]=0.20;
                  else taxrate[i]=0.10;
                  }//FOR
                  }//FINDTAXRATE

     void findtaxamount(float grosspay[],float taxamount[],
                        float taxrate[], int n){
          for(int i=0;i<n;i++){
                   taxamount[i]=grosspay[i]*taxrate[i];
                  }//FOR
                  }//FINDTAXAMOUNT

     void findnetpay(float grosspay[],float netpay[],float taxamount[],int n){
          for(int i=0;i<n;i++){
                  netpay[i]=grosspay[i]-taxamount[i];
                  }//FOR
                  }//FINDNETPAY

     void findsum(float netpay[],int n){
          for(int i=0;i<n;i++){
                  sum+=netpay[i];

                  }//FOR
                  }//FINDSUM

     void findavg(int n){
          for(int i=0;i<n;i++){
                  avg=sum/n;
                  }//FOR
                  }//FINDAVG

     void displayheader(){
          cout<<setw(55)<<"Dr. Ebrahimi's Payroll Institute"<<endl;
          cout<<setw(45)<<"106 Easy Ways"<<endl;
          cout<<setw(52)<<"Pleasantville, NY 11068"<<endl;
          cout<<endl;
          }//DISPLAYHEADER

     void printalldata(long int id[],int hoursworked[],float hourlyrate[],
                       float overtimepay[],float grosspay[],float taxamount[],
                       float netpay[],int n){
     cout<<setw(14)<<setprecision(2);
     cout<<setiosflags(ios::fixed|ios::showpoint|ios::left);

     cout<<setw(10)<<"EMP ID"<<setw(10)<<"HOURS"<<setw(10)<<"RATE"<<setw(12)
         <<"OVERPAY"<<setw(12)<<"GROSSPAY"<<setw(12)<<"TAX"<<setw(10)
         <<"NETPAY"<<endl;

          for(int i=0;i<n;i++){
                  cout<<setw(10)<<id[i]<<setw(10)<<hoursworked[i]<<setw(10)<<hourlyrate[i]
                      <<setw(12)<<overtimepay[i]<<setw(12)<<grosspay[i]
                      <<setw(12)<<taxamount[i]<<setw(10)<<netpay[i]<<endl;
                      }//FOR
                      }//PRINTALLDATA

     void displaycalc(float netpay[],int n){
          cout<<setw(55)<<setprecision(2);
          cout<<setiosflags(ios::right|ios::showpoint|ios::fixed);
          cout<<endl;
          cout<<setw(55)<<"Calculation for Average Net Pay"<<endl<<endl;
          for(int i=0;i<n;i++){
          cout<<setw(43)<<netpay[i]<<endl;}//FOR
          cout<<setw(45)<<endl<<"Sum of Net Pay is: "<<sum<<endl<<endl;
          cout<<setw(38)<<sum<<"/"<<n<<"= "<<avg<<endl<<endl;
          cout<<setw(48)<<"The Average Net Pay is: "<<avg<<endl<<endl<<endl;
          }//DISPLAYCALC

     void pointer(float (*p[]),float netpay[],int i,int n){
          cout<<setw(58)<<"Memory Slot Addresses for Netpays"<<endl<<endl;
          
          for(i=0;i<n;i++){p[i]=netpay+i;}//INITIALIZING POINTER ARRAY

          cout<<setw(37)<<"Memory Slot Address "<<p[i]<<" for Netpay "<<netpay[i]
          <<endl<<endl;
          }//POINT
          
     void sorting(int sortedflag,int n,int i,int j,float (*p[]),float (*temp)){
          while(!sortedflag){
                        sortedflag=1;
                        for(j=0;j<n-1;j++){
                                           if(*p[j]>*p[j+1]){
                                                            temp=p[j];
                                                            p[j]=p[j+1];
                                                            p[j+1]=temp;
                                                            sortedflag=0;
}//SWAP
}//J
}//I
}//SORTING
//END SOURCE CODE 
Thats alot of code bro, maybe give info like what line and if possible give us concept code rather than your source.
Yeah sorry I didn't want to leave anything out in case there was a bigger picture in question. I'll isolate it to what I believe is the problem area. The Linker Error is coming up with the

Undefined Reference to pointer(float*,float*,int,int)
Undefined Reference to sorting(int,int,int,int,float*,float)

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
#include<fstream>
#include<iostream>
#include<iomanip>
#include<algorithm>

using namespace std;

//Function Prototypes
int readalldata(long int[], int[], float[], const int);
........
void pointer(float[],float[],int,int);
void sorting(int,int,int,int,float[],float);

int main(){
     const int MAXSIZE=100; //Maximum of 100 employees
     
     //Delcaration of Variables
     int i,j,x,n;
     long int id[MAXSIZE];
     int hoursworked[MAXSIZE],overtimehours[MAXSIZE];
     int regularhours[MAXSIZE];
     float hourlyrate[MAXSIZE];float regularpay[MAXSIZE];
     float overtimepay[MAXSIZE];float grosspay[MAXSIZE];
     float taxrate[MAXSIZE];float taxamount[MAXSIZE];float netpay[MAXSIZE];
     float (*p[MAXSIZE]);
     int sortedflag=0;
     float (*temp);
     
     //Function Calls
     n=readalldata(id,hoursworked,hourlyrate,MAXSIZE);//Get All Data
.......
     pointer((*p),netpay,i,n);
     sorting(sortedflag,n,i,j,(*p),(*temp));

     cout<<"Program created by Anthony A. Pellegrino"<<endl;
     
system("PAUSE");
return 0;
     }//Main
........

void pointer(float (*p[]),float netpay[],int i,int n){
          cout<<setw(58)<<"Memory Slot Addresses for Netpays"<<endl<<endl;
          
          for(i=0;i<n;i++){p[i]=netpay+i;}//INITIALIZING POINTER ARRAY

          cout<<setw(37)<<"Memory Slot Address "<<p[i]<<" for Netpay "<<netpay[i]
          <<endl<<endl;
          }//POINT
          
     void sorting(int sortedflag,int n,int i,int j,float (*p[]),float (*temp)){
          while(!sortedflag){
                        sortedflag=1;
                        for(j=0;j<n-1;j++){
                                           if(*p[j]>*p[j+1]){
                                                            temp=p[j];
                                                            p[j]=p[j+1];
                                                            p[j+1]=temp;
                                                            sortedflag=0;
}//SWAP
}//J
}//I
}//SORTING 
Last edited on
You need to ensure that these three things are consistent:
Function prototype - line 23
calling the function - line 60
Function definition - line 186

In the case of function Pointer(), the definition and prototype are not the same.
Okay. I assume it has something to do with the *p[] variable ? and same thing for the sorting function ?
An unrelated issue is that you are unnecessarily passing what should be local variables, as parameters. For example, i, j, and temp should be declared locally within the scope where they are used. If you do that, the function declarations become simpler as there are fewer parameters.

prototype:
void pointer(float *[], float [], int);

function call:
pointer(p, netpay, n);

function definition:
1
2
3
4
void pointer(float *p[], float netpay[], int n)
{
// etc.
}


And similarly with function sorting()
Here sortedflag should be defined as a local variable inside the function, there's no need for it to be a parameter. I'd also suggest type bool rather than int. Also i, j and temp should be local to the function rather than parameters.
Topic archived. No new replies allowed.