2015-12-03 2 views
-3
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. 

Я получаю эту ошибку при компиляции. ПРИМЕЧАНИЕ. Он работал нормально, пока я не отключил свою функцию.Ошибка компилятора Состояние выхода 1

main.cpp

#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; 
} 

Qsort.cpp

#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); 
    } 
} 
+2

Что вы подразумеваете под функцией 'qsort'? Он находится в 'stdlib.h' – Alexguitar

+1

' qsort() '- очень хорошо известная функция, которая является частью библиотеки C. Ваше первое утверждение состоит в том, что оно не существует, и вам нужно переписать его или что-то еще, это утверждение ложно. (см. первый комментарий) – ebyrob

+0

Почему вы называете свой источник '.cpp' и компилируете с помощью' g ++ ', в то время как ваш код (и тег) является« C »? – usr2564301

ответ

0

Вот самодостаточный пример того, что вы, кажется, делают. Хотя это не дает мне никаких ошибок компилятора на визуальной студии, составленной как vanilla C++.

main.cpp:

#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; 
} 

other.cpp:

#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; 
} 

Примечание: Ваш пример уже есть внешняя ссылка в main.cpp к функции в другом файле, так что дон Понимаете, почему вы получите ошибку, которую вы получаете. Может быть, вам нужны оба файла C++ в командной строке компилятора? (Итак, он знает, чтобы скомпилировать и связать оба файла вместе?)

+1

Я заработал. Моя проблема была 2 вещи. 1) Мне нужно связать мои файлы в командной строке. 2) Я вызывал печать из внешней функции. Он должен работать таким образом, но он печатался пустым. – GeekyDewd

+0

@ GeekyDewd cheers – ebyrob

0

Если функция сравнения находится в другом исходном файле, чем один QSort вызова(), а затем объявить функцию сравнения, как внешние по исходный файл, который вызывает qsort(). qsort() объявляется внешним в stdlib.h. поэтому никаких проблем нет. Если это C++, вы также можете использовать std :: sort() или std :: stable_sort(), но вы отметили это как c?

Так в main.c, добавьте следующую строку:

extern int struct_cmp_by_product(const void *a, const void *b); 
+1

Пожалуйста, сделайте быстрый пик в моем коде (я отредактировал главный пост) – GeekyDewd

+0

@GeekyDewd - хорошо, так ли это решило проблему компоновщика? – rcgldr

+1

Да, спасибо! – GeekyDewd

Смежные вопросы