C 编译器错误退出状态1
我在编译时遇到这个错误。注意:在我将函数外部化之前,它工作得很好 MAIN.cppC 编译器错误退出状态1,c,function,compiler-errors,C,Function,Compiler Errors,我在编译时遇到这个错误。注意:在我将函数外部化之前,它工作得很好 MAIN.cpp g++ -Wall -o "3bV2" "3bV2.cpp" (in directory: /home/dylan/Desktop/3b/Done) /tmp/ccA8cFDY.o: In function `main': 3bV2.cpp:(.text+0x9ca): undefined reference to `struct_cmp_by_product(void const*, void const*)'
g++ -Wall -o "3bV2" "3bV2.cpp" (in directory: /home/dylan/Desktop/3b/Done)
/tmp/ccA8cFDY.o: In function `main':
3bV2.cpp:(.text+0x9ca): undefined reference to `struct_cmp_by_product(void const*, void const*)'
collect2: error: ld returned 1 exit status
Compilation failed.
#包括
#包括//strncat的要求
#包括//出口()的需求
#包括“/TAXRATES.h”
#包括“/EmployeeRecord.h”
#定义标题行1“员工的工资调整小时数总Fed SSI净额\n”
#定义HEADERLINE2“工作状态定义的名称速率\r\n”
#定义标题行3“**************************************************************************************************\n”
#定义REPLNEFORMT1“%-22s%6.2f%12.2f%10.2f%8.2f%8.2f%10.2f\n”//Main头行1(谢谢Dixon)
#定义REPLNEFORMT2“%40.2f%18.2f%8.2f\n\n”//主标题行2(谢谢Dixon)
#定义REPLNEFORMT3“%-21s%7.2f%12.2f%10.2f%8.2f%8.2f%10.2f\n”//Totals第1行
#定义最大尺寸5
void EmptyFileError(void)//3.01
无效初始化累计器(浮动*totreg,浮动*totovt,浮动*totpayrate,浮动
*totgross,float*totfed,float*totstate,float*totssi,float
*totdefr,float*totnet)//3.02
作废打印报告标题(文件*报告文件)//3.03
无效员工人数(整数*员工人数)//3.04
无效输入员工数据(字符项次[],字符项次[],浮动*小时,浮动*工资率,浮动
*定义,浮动*ovt);//3.05
浮动计算损失(浮动小时数、浮动工资率)//3.06
无效计算轴(浮点g、浮点d、浮点*馈送、浮点*状态、浮点*ssi)//3.07
无效PrintUserData(浮点p、浮点小时数、浮点g、浮点fed、浮点ssi、浮点n、字符str1[30]、浮点ovt、,
浮点状态,浮点d,文件*reportfile)//3.09
无效向累加器添加详细信息(浮动*总付款率、浮动p、浮动小时数、浮动*总付款率、,
浮点数g,浮点数*总计,浮点数馈送,浮点数*总计,浮点数ssi,
浮点数*totssi,浮点数n,浮点数*totnet,
浮动*totovt,浮动ovt,浮动状态,浮动*totstate,浮动
defr,float*totdefr)//3.10
无效平均利率(浮动总付利率、浮动*平均总付利率、浮动总付利率、浮动
*avgtotreg,浮点数总计,浮点数*AVGTOTGROWS,浮点数*avgtotfed,浮点数总计,
浮点数*avgtotssi,浮点数totssi,浮点数*avgtotnet,浮点数totnet,
浮点数*avgtotovt,浮点数totovt,浮点数*avgtotstate,浮点数tostate,
浮动*avgtotdefr,浮动totdefr)//3.11
作废打印汇总报告(浮动总额、浮动总额、浮动总额、浮动总额、,
浮动TOTSI,浮动totnet,浮动totovt,浮动totstate,浮动
totdefr,浮动avgtotpayrate,浮动avgtotreg,浮动avgtotgross,浮动
avgtotfed,浮点avgtotssi,浮点avgtotnet,浮点avgtotovt,浮点
avgtotstate、float avgtotdefr、FILE*reportfile)//3.12
无效计算时间(浮动*小时,浮动*ovt)//*3..11
无效计算轴(浮点g、浮点d、浮点*馈送、浮点*状态、浮点*ssi)//3.07
浮子cFed(浮子g,浮子d);//3.8.1
浮动cState(浮动英尺);//3.8.2
浮点数cSSI(浮点数g,浮点数d);//3.8.3
外部内部结构(const void*a,const void*b);
无效计算轴(浮点g、浮点d、浮点*ft、浮点*st、浮点*ssit)
{ // 3.5
*ft=cFed(g,d);//vs ft=cFed(g,d)
*st=cState(*ft);//调用3.5.2
*ssit=cSSI(g,d);//调用3.5.3
}
浮点数cFed(浮点数g,浮点数d)//3.5.1
{
退货(g-d)*联邦税率;
}
浮动cState(浮动ft)//3.5.2
{
返回ft*州税率;
}
浮点数cSSI(浮点数g,浮点数d)//3.5.3
{
收益率(g-d)*税率;
}
内部主(空)
{
EmployeeRecord MyAssociate[最大尺寸];
浮动totpayrate、totreg、totovt、totgross、totfed、totstate、totssi、,
totdefr、totnet、avgtotpayrate、avgtotreg、avgtotgross、avgtotfed、,
avgtotssi、avgtotnet、avgtotovt、avgtotstate、avgtotdefr、,
ovt;
//步骤1:声明报表“file”变量
文件*报告文件;
reportfile=fopen(“./report.txt”,“wt”);
//步骤2:打开“文件”进行“写入文本”访问
if(reportfile==NULL)
{
EmptyFileError();
}
初始化累计器(&totpayrate、&totreg、&ToToTovt、&totgross、&totfed、&totstate),
&totssi、totdefr和totnet);
打印报告标题(报告文件);
对于(int-EmpCounter=0;EmpCounter#include <stdio.h>
#include <string.h> //reqd for strncat
#include <stdlib.h> // reqd for exit()
#include "./TAXRATES.h"
#include "./EmployeeRecord.h"
#define HEADERLINE1 " Employee's Pay RegHours Gross Fed SSI Net\n"
#define HEADERLINE2 " Name Rate OvtHours Worked State Defr\n"
#define HEADERLINE3 " ******************* ***** ******** ******* ****** ****** ******\n"
#define REPLNEFORMT1 " %-22s%6.2f%12.2f%10.2f%8.2f%8.2f%10.2f\n"//Main Header Line 1 (Thank you Dixon)
#define REPLNEFORMT2 " %40.2f%18.2f%8.2f\n\n"//Main Header Line 2 (Thank you Dixon)
#define REPLNEFORMT3 " %-21s%7.2f%12.2f%10.2f%8.2f%8.2f%10.2f\n"//Totals Line 1
#define MAX_SIZE 5
void EmptyFileError(void);//3.01
void InitializeAccumulators(float *totreg, float *totovt,float *totpayrate, float
*totgross, float *totfed, float *totstate, float *totssi, float
*totdefr, float *totnet); //3.02
void PrintReportHeadings(FILE * reportfile); //3.03
void NumberOfEmployees(int *NumEmployees); //3.04
void InputEmployeeData(char Ln[],char Fn[], float *Hours,float *Payrate, float
*defr, float *ovt); // 3.05
float CalculateGross(float Hours,float Payrate);//3.06
void computeTaxes(float g,float d,float * fed,float *state,float *ssi); //3.07
void PrintUserData(float p,float Hours,float g,float fed,float ssi,float n,char str1[30],float ovt,
float state,float d, FILE *reportfile);//3.09
void AddDetailToAccumulators(float *totpayrate, float p, float Hours, float *totreg,
float g, float *totgross, float fed, float *totfed, float ssi,
float *totssi, float n, float *totnet,
float *totovt,float ovt, float state, float *totstate, float
defr, float *totdefr);//3.10
void CalcAverage(float totpayrate, float *avgtotpayrate,float totreg, float
*avgtotreg,float totgross, float *avgtotgross, float *avgtotfed, float totfed,
float *avgtotssi, float totssi, float *avgtotnet, float totnet,
float *avgtotovt, float totovt, float *avgtotstate, float totstate,
float *avgtotdefr, float totdefr);//3.11
void PrintSummaryReport(float totpayrate, float totreg, float totgross,float totfed,
float totssi, float totnet, float totovt,float totstate,float
totdefr,float avgtotpayrate,float avgtotreg,float avgtotgross,float
avgtotfed, float avgtotssi,float avgtotnet,float avgtotovt,float
avgtotstate,float avgtotdefr, FILE *reportfile);//3.12
void CalculateOT(float *Hours, float *ovt);//*3..11
void computeTaxes(float g,float d,float * fed,float *state,float *ssi); //3.07
float cFed(float g,float d); // 3.8.1
float cState(float ft); // 3.8.2
float cSSI(float g,float d); // 3.8.3
extern int struct_cmp_by_product(const void *a, const void *b);
void computeTaxes(float g,float d,float * ft,float *st,float *ssit)
{ // 3.5
*ft = cFed(g,d); // vs ft = cFed(g,d)
*st = cState(*ft); // call 3.5.2
*ssit = cSSI(g,d); // call 3.5.3
}
float cFed(float g,float d) // 3.5.1
{
return (g-d) * FEDTAXRATE;
}
float cState(float ft) // 3.5.2
{
return ft * STATETAXRATE;
}
float cSSI(float g,float d) // 3.5.3
{
return (g-d) * SSITAXRATE;
}
int main(void)
{
EmployeeRecord MyAssociate[MAX_SIZE];
float totpayrate, totreg, totovt, totgross, totfed, totstate, totssi,
totdefr,totnet,avgtotpayrate,avgtotreg, avgtotgross,avgtotfed,
avgtotssi, avgtotnet, avgtotovt, avgtotstate, avgtotdefr,
ovt;
// step 1: declare a report "file" variable
FILE * reportfile;
reportfile = fopen("./report.txt","wt");
// step 2: open the "file" for "write-text" access
if (reportfile == NULL)
{
EmptyFileError();
}
InitializeAccumulators(&totpayrate,&totreg,&totovt,&totgross,&totfed,&totstate,
&totssi,&totdefr,&totnet);
PrintReportHeadings(reportfile);
for (int EmpCounter = 0; EmpCounter < MAX_SIZE; EmpCounter++)
{
InputEmployeeData(MyAssociate[EmpCounter].Lastname,MyAssociate[EmpCounter].Firstname,&MyAssociate[EmpCounter].Hours,&MyAssociate[EmpCounter].Payrate,&MyAssociate[EmpCounter].Defr,&ovt);// call 3.3
strcpy(MyAssociate[EmpCounter].FullName, MyAssociate[EmpCounter].Lastname);
strcat(MyAssociate[EmpCounter].FullName, ", ");
strcat(MyAssociate[EmpCounter].FullName, MyAssociate[EmpCounter].Firstname);
CalculateOT(&MyAssociate[EmpCounter].Hours, &ovt);
MyAssociate[EmpCounter].Gross = CalculateGross(MyAssociate[EmpCounter].Hours,MyAssociate[EmpCounter].Payrate); // call 3.4
computeTaxes(MyAssociate[EmpCounter].Gross,MyAssociate[EmpCounter].Defr,&MyAssociate[EmpCounter].FedTax,&MyAssociate[EmpCounter].StateTax,&MyAssociate[EmpCounter].SsiTax); // call 3.5
MyAssociate[EmpCounter].NetPay = MyAssociate[EmpCounter].Gross-MyAssociate[EmpCounter].FedTax-MyAssociate[EmpCounter].StateTax-MyAssociate[EmpCounter].SsiTax-MyAssociate[EmpCounter].Defr;
PrintUserData(MyAssociate[EmpCounter].Payrate,MyAssociate[EmpCounter].Hours,MyAssociate[EmpCounter].Gross,
MyAssociate[EmpCounter].FedTax,MyAssociate[EmpCounter].SsiTax,MyAssociate[EmpCounter].NetPay,MyAssociate[EmpCounter].FullName,ovt,
MyAssociate[EmpCounter].StateTax,MyAssociate[EmpCounter].Defr,reportfile);
AddDetailToAccumulators(&totpayrate, MyAssociate[EmpCounter].Payrate, MyAssociate[EmpCounter].Hours, &totreg,
MyAssociate[EmpCounter].Gross, &totgross, MyAssociate[EmpCounter].FedTax, &totfed, MyAssociate[EmpCounter].SsiTax, &totssi, MyAssociate[EmpCounter].NetPay, &totnet,
&totovt, ovt, MyAssociate[EmpCounter].StateTax, &totstate, MyAssociate[EmpCounter].Defr, &totdefr);
while(getchar() != '\n'); // flush(stdin)
}
CalcAverage(totpayrate, &avgtotpayrate,totreg,&avgtotreg, totgross,
&avgtotgross, &avgtotfed, totfed, &avgtotssi, totssi,&avgtotnet, totnet,
&avgtotovt, totovt, &avgtotstate, totstate,&avgtotdefr, totdefr);
qsort(MyAssociate, MAX_SIZE, sizeof(struct EmployeeRecord), struct_cmp_by_product);//sort
fclose(reportfile); // step 4: close the report file
getchar();
while (getchar() != '\n');
return 0;
}
void EmptyFileError(void) //3.01
{
printf(" Report file open failed ...\n");
printf(" Press key to exit ...\n");
while (getchar() != '\n'); // same as fflush(stdin)
exit(-10); // reqs <stdlib.h>
}
void InitializeAccumulators(float *totpayrate, float *totreg,float *totovt,float
*totgross,float *totfed,float *totstate,
float *totssi, float *totdefr, float *totnet) //3.02
{
*totpayrate = 0;
*totreg = 0;
*totovt = 0;
*totgross = 0;
*totfed = 0;
*totstate = 0;
*totssi = 0;
*totdefr = 0;
*totnet = 0;
}
void PrintReportHeadings(FILE * reportfile)//3.03
{
fprintf(stdout,HEADERLINE1);
fprintf(stdout,HEADERLINE2);
fprintf(stdout,HEADERLINE3);
fprintf(reportfile,HEADERLINE1);
fprintf(reportfile,HEADERLINE2);
fprintf(reportfile,HEADERLINE3);
}
void InputEmployeeData(char Ln[],char Fn[],
float Hours[],float *Payrate, float *defr, float *ovt)//3.05
{
printf(" Enter the name ==> ");
scanf("%s%s",Fn,Ln);
printf(" Enter the hours and payrate ==> ");
scanf("%f%f",Hours,Payrate);
printf(" Enter the deferred earning amount ==> ");
scanf("%f",defr);
}
void CalculateOT(float *Hours, float *ovt)//3.06 FLOWCHART!!!!
{
if (*Hours > 40){
*ovt = *Hours - 40;
*Hours = *Hours - *ovt;
}
else
{
*ovt = 0.00;
}
}
float CalculateGross(float Hours,float Payrate)//3.7
{
if (Hours <= 40)
return Hours * Payrate;
else
return 40* Payrate + 1.5 * Payrate * (Hours-40);
}
void PrintUserData(float p,float h,float g,float fed,float ssi,float n,char str1[30],
float ovt, float state,float d,FILE * reportfile)//3.09
{
fprintf(stdout,REPLNEFORMT1,str1,p,h<=40?h:40,g,fed,ssi,n);
fprintf(stdout,REPLNEFORMT2,ovt,state,d);
fprintf(reportfile,REPLNEFORMT1,str1,p,h<=40?h:40,g,fed,ssi,n);
fprintf(reportfile,REPLNEFORMT2,ovt,state,d);
}
void AddDetailToAccumulators(float *totpayrate, float p, float h, float *totreg,
float g, float *totgross, float fed, float *totfed, float ssi,
float *totssi, float n, float *totnet, float *totovt,
float ovt, float state, float *totstate, float defr, float *totdefr)//3.10
{
*totpayrate = p + *totpayrate;
*totreg = h + *totreg;
*totgross = g + *totgross;
*totfed = fed + *totfed;
*totssi = ssi + *totssi;
*totnet = n + *totnet;
*totovt = ovt + *totovt;
*totstate = state + *totstate;
*totdefr = defr + *totdefr;
}
void CalcAverage(float totpayrate, float *avgtotpayrate, float totreg, float *avgtotreg, float totgross, float *avgtotgross, float *avgtotfed, float totfed, float *avgtotssi, float totssi,float *avgtotnet, float totnet,
float *avgtotovt, float totovt, float *avgtotstate, float totstate, float *avgtotdefr, float totdefr)//3.11
{
*avgtotpayrate = totpayrate / MAX_SIZE;
*avgtotreg = totreg / MAX_SIZE;
*avgtotgross = totgross / MAX_SIZE;
*avgtotfed = totfed / MAX_SIZE;
*avgtotssi = totssi / MAX_SIZE;
*avgtotnet = totnet / MAX_SIZE;
*avgtotovt = totovt / MAX_SIZE;
*avgtotstate = totstate / MAX_SIZE;
*avgtotdefr = totdefr / MAX_SIZE;
}
#include <stdio.h>
#include "./EmployeeRecord.h"
#include <string.h>
#define REPLNEFORMT1 " %-22s%6.2f%12.2f%10.2f%8.2f%8.2f%10.2f\n"//Main Header Line 1 (Thank you Dixon)
#define REPLNEFORMT2 " %40.2f%18.2f%8.2f\n\n"//Main Header Line 2 (Thank you Dixon)
#define MAX_SIZE 5
int struct_cmp_by_product(const void *a, const void *b);
void print_struct_array_pre(EmployeeRecord MyAssociate[]);
void print_struct_array_post(EmployeeRecord MyAssociate[]);
void print_struct_array_pre(EmployeeRecord MyAssociate[])
{
int i;
printf(" ***********ARRAY BEFORE NOT BEEN SORTED YET***************\n");
for(i=0; i<MAX_SIZE; i++)
{
//printf("%s %s]\n", MyAssociate[i].Lastname, MyAssociate[i].Firstname);
fprintf(stdout,REPLNEFORMT1,MyAssociate[i].FullName,MyAssociate[i].Payrate,
MyAssociate[i].Hours<=40?MyAssociate[i].Hours:40,MyAssociate[i].Gross,MyAssociate[i].FedTax,
MyAssociate[i].SsiTax,MyAssociate[i].NetPay);
fprintf(stdout,REPLNEFORMT2,MyAssociate[i].OVT,MyAssociate[i].StateTax,MyAssociate[i].Defr);
}
}
int struct_cmp_by_product(const void *a, const void *b)
{
struct EmployeeRecord *ia = (struct EmployeeRecord *)a;
struct EmployeeRecord *ib = (struct EmployeeRecord *)b;
return strcmp(ia->FullName, ib->FullName);
/* strcmp functions works exactly as expected from
comparison function */
}
void print_struct_array_post(EmployeeRecord MyAssociate[])
{
int i;
printf(" ***********ARRAY HAS BEEN SORTED VIA QUICK-SORT***************\n");
for(i=0; i<MAX_SIZE; i++)
{
//printf("%s %s]\n", MyAssociate[i].Lastname, MyAssociate[i].Firstname);
fprintf(stdout,REPLNEFORMT1,MyAssociate[i].FullName,MyAssociate[i].Payrate,
MyAssociate[i].Hours<=40?MyAssociate[i].Hours:40,MyAssociate[i].Gross,MyAssociate[i].FedTax,
MyAssociate[i].SsiTax,MyAssociate[i].NetPay);
fprintf(stdout,REPLNEFORMT2,MyAssociate[i].OVT,MyAssociate[i].StateTax,MyAssociate[i].Defr);
}
}
extern int struct_cmp_by_product(const void *a, const void *b);
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
extern int cmp_char(const void *a, const void *b);
int main(void)
{
char arr[13] = "cbacbacbacba";
qsort(arr, sizeof(arr) - 1, sizeof(char), cmp_char);
printf("arr = %s\n", arr);
getchar();
return 0;
}
#include <stdio.h>
#include <string.h>
int cmp_char(const void *a, const void *b);
int cmp_char(const void *a, const void *b)
{
char *pa = (char*)a;
char *pb = (char*)b;
return *pa - *pb;
}