【问题标题】:why is my for loop executing an extra time in UNIX environment?为什么我的 for 循环在 UNIX 环境中执行了额外的时间?
【发布时间】:2017-04-01 12:36:14
【问题描述】:

我编写了一个运行良好的代码,但是,一旦我将代码外部化并将代码传输到像 Puttty 或 MAC 系统控制台这样的 UNIX 环境,我就会发现异常。我有一个 for 循环执行一次额外的时间,这很奇怪。 Here is a picture of the report

抱歉,我不太确定如何在此处输入我的代码,因为当我查看预览时我的#define 变得过大。

This is a link to all the source files if it is necessary to view all of them

maxEmployee.h 头文件只包含#define MAXEMP 40

这是主要功能:

#include <stdio.h>
#include "maxEmployee.h"


extern void InitializeAccumulators(float* totDefr, float *totPayRate, float *totRegHrs, float *totOvtHrs, float *totGross, float *totFed, float *totSt, float *totSSI, float *totNet); //3.1 Prototype

extern void InputEmployeeData(char ln[][10+1], char fn[][10+1], float hr[], float pRate[], float defr[], int i); //3.2 Prototype

extern void CalculateGross(float hr[], float pRate[], float reghr[], float ovthr[], float gross[], int i); //3.3 Prototype

extern void calculateTaxes(float gross[], float defr[], float ft[], float st[], float ssit[], int i); //3.4 Prototype

extern void CalculateNetPay(float gross[], float defr[], float ft[], float st[], float ssit[], float netPay[], int i); //3.5 Prototype

extern void CalculateTotAvg(float pRate[], float reghr[], float ovthr[], float gross[], float ft[], float st[], float ssit[], float netPay[], float defr[], int i, float *totDefr, float *totPayRate, float *totRegHrs, float *totOvtHrs, float *totGross, float *totFed, float *totSt, float *totSSIT, float *totNet,
    float *avgDefr, float *avgPayRate, float *avgRegHrs, float *avgOvtHrs, float *avgGross, float *avgFed, float *avgSt, float *avgSSIT, float *avgNet); //3.6 Prototype

extern void PrintReportSummary(char fn[][10+1], char ln[][10+1], float pRate[], float reghr[], float ovthr[], float gross[], float ft[], float st[], float ssit[], float netPay[], float defr[], int i, float totDefr, float totPayRate, float totRegHrs, float totOvtHrs, float totGross, float totFed, float totSt, float totSSIT, float totNet,
    float avgDefr, float avgPayRate, float avgRegHrs, float avgOvtHrs, float avgGross, float avgFed, float avgSt, float avgSSIT, float avgNet); //3.7 Prototype


int main(void)

{ // 3.0
    char ln[MAXEMP][10 + 1], fn[MAXEMP][10 + 1]; //last name and first name
    float hr[MAXEMP], pRate[MAXEMP], defr[MAXEMP], gross[MAXEMP], reghr[MAXEMP], ovthr[MAXEMP]; // hour, payrate, deferred, gross, regular hour, over time hours
    float ft[MAXEMP], st[MAXEMP], ssit[MAXEMP]; //calculate taxes
    float netPay[MAXEMP];

    float totDefr, totPayRate, totRegHrs, totOvtHrs, totGross, totFed, totSt, totSSIT, totNet;
    float avgDefr, avgPayRate, avgRegHrs, avgOvtHrs, avgGross, avgFed, avgSt, avgSSIT, avgNet;
    int i, yesno = 1;


    InitializeAccumulators(&totDefr, &totPayRate, &totRegHrs, &totOvtHrs, &totGross,
        &totFed, &totSt, &totSSIT, &totNet); //call 3.1
    for (i = 0; i < MAXEMP && yesno == 1; i++)
    {
        InputEmployeeData(ln, fn, hr, pRate, defr, i); //call 3.2
        CalculateGross(hr, pRate, reghr, ovthr, gross, i); //call 3.3
        calculateTaxes(gross, defr, ft, st, ssit, i); //call 3.4
        CalculateNetPay(gross, defr, ft, st, ssit, netPay, i); //call 3.5
        printf("Do you have another employee you wish to enter? (1 = Yes, 0 = No) ");
        scanf("%d", &yesno);  
    } 
    CalculateTotAvg(pRate, reghr, ovthr, gross, ft, st, ssit, netPay, defr, i, &totDefr, &totPayRate, &totRegHrs, &totOvtHrs, &totGross, &totFed, &totSt, &totSSIT, &totNet, &avgDefr, &avgPayRate, &avgRegHrs, &avgOvtHrs, &avgGross, &avgFed, &avgSt, &avgSSIT, &avgNet); //call 3.6

    PrintReportSummary(fn, ln, pRate, reghr, ovthr, gross, ft, st, ssit, netPay, defr, i, totDefr, totPayRate, totRegHrs, totOvtHrs, totGross, totFed, totSt, totSSIT, totNet, //call 3.7
        avgDefr, avgPayRate, avgRegHrs, avgOvtHrs, avgGross, avgFed, avgSt, avgSSIT, avgNet);

    fflush(stdin), getchar(); // hold screen

    return 0;

}

这是 PrintReportSummary 子函数:

> #include <stdio.h>
> #include <string.h>
> #include "maxEmployee.h"
> 
> #define REPORTHEADERFORMAT "\n%-20s%16.2f%18.2f%18.2f%18.2f%18.2f%18.2f\n%54.2f%36.2f%18.2f\n"
> #define REPORTHEADERTOT "\nTotals%30.2f%18.2f%18.2f%18.2f%18.2f%18.2f\n%54.2f%36.2f%18.2f\n"
> #define REPORTHEADERAVG "\nAverages%28.2f%18.2f%18.2f%18.2f%18.2f%18.2f\n%54.2f%36.2f%18.2f\n"
> 
> void PrintReportSummary(char fn[][10+1], char ln[][10+1], float
> pRate[], float reghr[], float ovthr[], float gross[], float ft[],
> float st[], float ssit[], float netPay[], float defr[], int i, float
> totDefr, float totPayRate, float totRegHrs, float totOvtHrs, float
> totGross, float totFed, float totSt, float totSSIT, float totNet,
>   float avgDefr, float avgPayRate, float avgRegHrs, float avgOvtHrs,
> float avgGross, float avgFed, float avgSt, float avgSSIT, float
> avgNet); //3.7 Prototype
> 
> void PrintReportSummary(char fn[][10+1], char ln[][10+1], float
> pRate[], float reghr[], float ovthr[], float gross[], float ft[],
> float st[], float ssit[], float netPay[], float defr[], int i, float
> totDefr, float totPayRate, float totRegHrs, float totOvtHrs, float
> totGross, float totFed, float totSt, float totSSIT, float totNet,
>     float avgDefr, float avgPayRate, float avgRegHrs, float avgOvtHrs, float avgGross, float avgFed, float avgSt, float avgSSIT, float
> avgNet) //3.7 {
> 
>   char fullname[MAXEMP][20+1];
> 
>   printf("Employee            Pay     Reg Hrs       Gross          Fed        SSI            
> Net\n");  printf("Name                Rate        Ovt Hrs       Pay            State            
> Defr            Pay\n");
>     printf("==============================================================================================================================");
> 
>   for (int k = 0; k <= i; k++)    {   strcpy (fullname[k], ln[k]);
>   strcat(fullname[k], ", ");  strcat(fullname[k], fn[k]);
> 
>   printf(REPORTHEADERFORMAT, fullname[k], pRate[k], reghr[k], gross[k],
> ft[k], ssit[k], netPay[k], ovthr[k], st[k], defr[k]);     }
>   printf(REPORTHEADERTOT, totPayRate, totRegHrs, totGross, totFed,
> totSSIT, totNet, totOvtHrs, totSt, totDefr);  printf(REPORTHEADERAVG,
> avgPayRate, avgRegHrs, avgGross, avgFed, avgSSIT, avgNet, avgOvtHrs,
> avgSt, avgDefr); }

这是我的制作文件:

dataReport.exe: main.o InitializeAccumulators.o InputEmployeeData.o CalculateGross.o calculateTaxes.o CalculateNetPay.o CalculateTotAvg.o PrintReportSummary.o
    g++ main.o InitializeAccumulators.o InputEmployeeData.o CalculateGross.o calculateTaxes.o CalculateNetPay.o CalculateTotAvg.o PrintReportSummary.o -o dataReport.exe

main.o: main.cpp maxEmployee.h
    g++ -c main.cpp -o main.o

InitializeAccumulators.o: InitializeAccumulators.cpp
    g++ -c InitializeAccumulators.cpp -o InitializeAccumulators.o

InputEmployeeData.o: InputEmployeeData.cpp
    g++ -c InputEmployeeData.cpp -o InputEmployeeData.o

CalculateGross.o: CalculateGross.cpp
    g++ -c CalculateGross.cpp -o CalculateGross.o

calculateTaxes.o: calculateTaxes.cpp taxrates.h
    g++ -c calculateTaxes.cpp -o calculateTaxes.o

CalculateNetPay.o: CalculateNetPay.cpp
    g++ -c CalculateNetPay.cpp -o CalculateNetPay.o

CalculateTotAvg.o: CalculateTotAvg.cpp
    g++ -c CalculateTotAvg.cpp -o CalculateTotAvg.o

PrintReportSummary.o: PrintReportSummary.cpp maxEmployee.h
    g++ -c PrintReportSummary.cpp -o PrintReportSummary.o

clean:
    rm *.o dataReport.exe

那么我的问题是如何解决这个问题?我已经被困在这几天了......

【问题讨论】:

  • 您真的是要使用&lt;= 而不是&lt;
  • 至少在 Linux 下这个fflush(stdin)(刷新标准输入)会引发未定义的行为。
  • 使用 -O2 -W -Wall 否则你会失去 g++ 对错误代码发出的大部分警告。很多时候未定义的行为显示为警告。
  • 您能否将其简化为表现出这种行为的minimal reproducible example
  • 了解如何使用调试器。 stackoverflow.com 不是针对大量代码的分布式调试服务。

标签: c++ unix makefile


【解决方案1】:

在 main 中你循环了 1 次,所以变量“i”在 for 循环结束时的值为 1。

在 PrintReportSummary 中,您使用以下循环:

for (int k = 0; k <= i; k++)

用 1 代替 i 给出:

for (int k = 0; k <= 1; k++)

所以循环体被执行了 2 次。 Windows 中的行为应该相同,因此您可以重新测试:) 此外,如果您输入 40 条记录,或者将 MAXEMP 设置为 1 并输入 1 条记录,则程序将在第二个 for 循环中崩溃或显示未定义的行为,因为它会从您的数组中访问超出范围的元素。

解决方案:将

要稍微清理一下代码,您可以使用结构而不是那么多函数参数:)

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2018-01-05
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多