2014-03-29 74 views
0

我相信会有更多的东西不对的代码比这个,但目前我得到现在唯一的错误是从字符*无效转换为char从字符*无效转换为char

完整的代码

发生错误
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define REPORTHEADING1 "  Employee    Pay  Hours  Gross  Tax  Net\n" 
#define REPORTHEADING2 "  Name     Rate  Worked Pay  Due  Pay\n" 
#define REPORTHEADING3 "  ===============  ====  ====== =====  ====  ====\n" 
#define REPORTHEADING4 "       ====  ====== =====  ====  ====\n" 
#define REPORTLINEFORMAT1 "  %-20s%6.2f%11.2f%9.2f%9.2f%10.2f\n" 
#define REPORTLINEFORMAT2 "  Totals    %6.2f%11.2f%9.2f%9.2f%10.2f\n" 
#define REPORTLINEFORMAT3 "  Averages   %6.2f%11.2f%9.2f%9.2f%10.2f\n" 


#define COUNTLINEFORMAT "  Number of employees: %-10i\n\n" 

#define MAXREGHOURS 40 
#define OVERTIMERATE 1.5 



void PrintReportHeadings(FILE *reportFile); //printReportHeadings prototype 

void InitializeAccumulators(float *totRegHour,float *totOvtHours,float *totPayrate, 
     float *totGross,float *totdeferred,float *totFedtax, 
     float *totStatetax,float *totSSItax,float *totNet,int *empCount); //InitializeAccumulators prototype 

void InputEmployeeData(char *firstName,char *lastName, 
      float *hours,float *payrate,float *deferred); //InputEmployeeData prototype 

void CalculateGross(float hours,float payrate,float *regHours,float *ovtHours, 
      float *gross); //CalculateGross prototype 

extern void CalculateTaxes(float gross,float deferred,float * fedtax, 
       float * statetax,float * ssitax); //CalculateTaxes prototype (external) 

float CalculateNetPay(float gross,float fedtax,float statetax,float ssitax, 
       float deferred); 

void AddDetailToAccumulators(float regHours,float ovtHours,float payrate, 
     float gross,float deferred,float fedtax,float statetax, 
     float ssitax,float net,float *totRegHours,float *totOvtHours, 
     float *totPayrate,float *totGross,float *totdeferred, 
     float *totFedtax,float *totStatetax,float *totSSItax, 
     float *totNet); 

void PrintSummaryReport(FILE *reportFile,char fullName,float regHours,float ovtHours, 
      float payrate,float gross,float deferred,float fedtax, 
      float statetax,float ssitax,float net); 

int main(void) 
{ 
    float ft,st,ssit; 
    char firstName[10+1]; 
    char lastName[15+1]; 
    char fullName[25+1]; 
    float regHours, ovtHours, hours, payrate, deferred, gross, netpay; 
    float totRegHours, totOvtHours, totPayrate, totGross,totdeferred, 
     totFedtax, totStatetax, totSSItax, totNet; 
    int empcount; 
    char answer; 
    FILE * reportFile; 

    reportFile = fopen("./report.txt","wt"); 
    if(reportFile == NULL) 
    { 
     printf(" Report open request failed...\n"); 
     while(getchar() != '\n'); 
     exit(-90);// reqs <stdlib.h> 
    } 

    PrintReportHeadings(reportFile); 

    InitializeAccumulators(&totRegHours,&totOvtHours,&totPayrate,&totGross, 
     &totdeferred,&totFedtax,&totStatetax,&totSSItax,&totNet, 
     &empcount);//set all accumulators to 0 

    do 
    { 
    InputEmployeeData(firstName,lastName,&hours,&payrate,&deferred); 
    CalculateGross(hours, payrate, &regHours, &ovtHours, &gross); 
    CalculateTaxes(gross,deferred,&ft,&st,&ssit); 
    netpay = CalculateNetPay(gross,ft,st,ssit,deferred); 
    strcpy(fullName,lastName); 
    strcat(fullName,", "); 
    strcat(fullName,firstName); 

    AddDetailToAccumulators(regHours,ovtHours,payrate,gross,deferred,ft,st, 
     ssit,netpay,&totRegHours,&totOvtHours,&totPayrate,&totGross, 
     &totdeferred,&totFedtax,&totStatetax,&totSSItax,&totNet); 

    PrintSummaryReport(reportFile,fullName,regHours,ovtHours,payrate,gross,deferred,ft,st,ssit,netpay); 

    empcount++; 
    printf(COUNTLINEFORMAT,empcount); 

    printf(" do you have anymore? (Y/N): "); 
    while(getchar() != '\n'); 
    answer = getchar(); 
    printf("\n"); 

    } 
    while(answer != 'N' && answer != 'n'); 

    while (getchar()!= '\n'); 
    getchar(); 
    return 0; 
} 

void PrintReportHeadings(FILE *reportFile) 
{ 
     reportFile = fopen("./report.txt","wt"); 
     fprintf(reportFile,REPORTHEADING1); 
     fprintf(reportFile,REPORTHEADING2); 
     fprintf(reportFile,REPORTHEADING3); 
} 


void InitializeAccumulators(float *totRegHour,float *totOvtHours,float *totPayrate, 
       float *totGross,float *totdeferred,float *totFedtax, 
       float *totStatetax,float *totSSItax,float *totNet,int *empCount) 
{ 
     totRegHour, totOvtHours, totPayrate, totGross,totdeferred, 
       totFedtax, totStatetax, totSSItax, totNet, empCount = 0; 
} 

void InputEmployeeData(char *firstName,char *lastName,float *hours, 
      float *payrate,float *deferred) 
{ 
    printf(" Enter employee first name : "); 
    scanf("%s",firstName); 
    printf(" Enter employee last name : "); 
    scanf("%s",lastName); 
    printf(" Enter %s's hours worked : ",firstName); 
    scanf("%f",hours); 
    printf(" Enter %s's pay rate : ",firstName); 
    scanf("%f",payrate); 
    printf(" Enter %s's amount deferred : ",firstName); 
    scanf("%f",deferred); 
} 

void CalculateGross(float hours,float payrate,float *regHours,float *ovtHours,float *gross) 
{ 
float overtimeHours(float hours); 

    if(hours <= MAXREGHOURS) 
    { 
     *regHours = hours; 
     *gross = hours * payrate; 
    } 
    else 
    { 
     *regHours = MAXREGHOURS; 
     *ovtHours = overtimeHours(hours); 
     *gross = payrate * MAXREGHOURS + OVERTIMERATE * payrate * (hours - MAXREGHOURS); 
    } 
} 

float overtimeHours(float hours) 
{ 
    return hours - MAXREGHOURS; 
} 
float CalculateNetPay(float gross,float fedtax,float statetax,float ssitax, 
     float deferred) 
{ 
    return gross - (fedtax + statetax + ssitax + deferred); 
} 
void AddDetailtoAccumulators(float regHours,float ovtHours,float payrate, 
       float gross,float deferred,float fedtax,float statetax, 
       float ssitax,float netpay,float *totRegHours,float *totOvtHours, 
       float *totPayrate,float *totGross,float *totDeferred, 
       float *totFedtax,float *totStatetax,float *totSSItax, 
       float *totNet) 
{ 
    *totRegHours =+ regHours; 
    *totOvtHours =+ ovtHours; 
    *totPayrate =+ payrate; 
    *totGross =+ gross; 
    *totDeferred =+ deferred; 
    *totFedtax =+ fedtax; 
    *totStatetax =+ statetax; 
    *totSSItax =+ ssitax; 
    *totNet =+ netpay; 
} 

void PrintSummaryReport(FILE *reportFile,char fullName,float regHours,float ovtHours, 
         float payrate,float gross,float deferred,float fedtax, 
         float statetax,float ssitax,float netpay) 
{ 
    reportFile = fopen("./report.txt","wt"); 

    fprintf(reportFile,REPORTLINEFORMAT1,fullName,payrate,regHours,gross,fedtax, 
     ssitax,netpay); 
    fprintf(reportFile,REPORTLINEFORMAT2,ovtHours,statetax,deferred); 


} 

线:

PrintSummaryReport(reportFile,fullName,regHours,ovtHours,payrate,gross,deferred,ft,st,ssit,netpay); 

感谢您的帮助,这个程序将是我的死亡!

回答

2

我认为你的函数签名是错误的。您可能想要char * fullname而不是char fullname

void PrintSummaryReport(FILE *reportFile,char /* you probably want this to be a char * */ fullName,float regHours,float ovtHours, 
     float payrate,float gross,float deferred,float fedtax, 
     float statetax,float ssitax,float net); 
+0

不幸的是,这只是创造了更多的错误D:我得到了一堆“未定义的引用”错误,为我的其他功能。 – user3475151

1

所以你在做什么是要求一个指向reportFile的指针,而你正在喂它别的东西。

void PrintSummaryReport(FILE *reportFile,char fullName,float regHours,float ovtHours, 
      float payrate,float gross,float deferred,float fedtax, 
      float statetax,float ssitax,float net); 

printSummaryReport(reportFile,fullName,regHours,ovtHours,payrate,gross,deferred,ft,st,ssit,netpay); 

我认为这会工作得很好:

printSummaryReport(&reportFile,fullName,regHours,ovtHours,payrate,gross,deferred,ft,st,ssit,netpay); 
+0

这给了我错误: 无法将FILE转换为FILE *参数为void PrintSummaryReport – user3475151

1

对不起,我不认识的垂直滚动条。您得到的错误是由于main中的fullName的类型为char *,因为数组标签是指向元素序列的第一个元素的指针。

fullName[0]*(fullName + 0)都是相同的,都是一个char,但仅靠fullNamechar *

此外,您使用的%s格式说明符或%-20s预计会有一个指向字符char *的指针用于替换。不过,你试图给它一个字符char。进行以下更改以解决上述所有问题:

// prototype 
void PrintSummaryReport(FILE *reportFile, char * fullName, // <-- added an asterisk * 
    float regHours, float ovtHours, float payrate,   //  after char 
    float gross, float deferred, float fedtax, 
    float statetax, float ssitax, float net); 

... 

// definition 
void PrintSummaryReport(FILE *reportFile, char * fullName, // <-- same here 
    float regHours, float ovtHours, float payrate, 
    float gross, float deferred, float fedtax, 
    float statetax, float ssitax, float netpay) { ... } 

代码中存在一些其他问题。例如,您的格式字符串" %-20s%6.2f%11.2f%9.2f%9.2f%10.2f\n"定义为REPORTLINEFORMAT1有1个字符串和5个双打,但您在PrintSummaryReport函数中第一个fprintf呼叫时向其推送1个额外的浮点数。

然后" Totals %6.2f%11.2f%9.2f%9.2f%10.2f\n"定义为REPORTLINEFORMAT2会使第二个fprintf期望5双打,但是你只推送3个浮点数,比预期的少2个浮点数。

在函数AddDetailtoAccumulators内部,所有的= +都是奇怪的符号。前面的+并没有做任何事情,可能在C中的任何地方都不会做任何事情,甚至在C++的时候它可能在C后面。确保您不希望添加赋值运算符+=

有这个有趣的原型您CalculateGross函数中:

float overtimeHours(float hours); 

它做什么应该,原型,是会得到一些更多的行定义的函数,可以让你定义之前正确地使用它。由于该功能overtimeHours仅在CalculateGross内部使用,所以它仍然可以正常使用,但将其置于顶端仍然更合理。在CalculateGross函数之外,您将无法在定义之上的任何地方使用overtimeHours

InitializeAccumulators里面的东西真的有问题。我想你希望为这些指针指向的所有变量赋零。逗号运算符,不会帮助你。你可以做一个连锁分配;但首先第一件事情,不分配这样一个指针,而其分配指向值:

// do it like 
*empCount = 0; 
// not like 
empCount = 0; 
// which would only invalidate the pointer, make the pointer point to the memory 
// location that has the address of 0, I don't think you'd want that 

而在一般情况下,更换所有那些有以下几点:

*totRegHour = *totOvtHours = *totPayrate = *totGross = *totdeferred = 
    *totFedtax = *totStatetax = *totSSItax = *totNet = *empCount = 0; 

由关联方向根据此C Operator Precedence Table分配运算符=,评估将发生从右到左。所以,首先,0将被分配到*empCount,其将总计评估为0。那么0将被分配到*totNet,等等...现在

,在main功能,你显然已经打开"./report.txt"一旦与"wt"标志。 w标志将截断,即清除已存在的具有相同名称的文件的所有内容。取决于你想要什么,在那里做那个是没问题的。

但是,一旦你这样做了,你不应该与"wt"相同的文件一遍又一遍,否则内容将被清除与每个fopen。既然你已经在main一次打开它,你应该删除以下行:

reportFile = fopen("./report.txt", "wt"); 

无论从功能PrintReportHeadingsPrintSummaryReport,否则文件将只放置fopen最后一次通话后的内容。

既然你有firstNamelastName一个非常稀缺的空间,您可能希望限制字符的数量由scanf S中InputEmployeeData函数内被读取,像这样:

... 
scanf("%10s", firstName); 
... 
scanf("%15s", firstName); 

这个宽度规格东西只计算字符数量,不考虑要求终止'\0'。所以不要在那里写11和16。

此外,您可能需要将fullName的容量增加2,以将其中的", "考虑在内。

0

fullname参数在联合定义中应该是char fullname[]char* fullname

相关问题