我在第一个函数中不断获得"线程1 EXC_BAD_ACCESS断点

时间:2015-07-19 01:23:18

标签: c xcode

我正在尝试编写一个跟踪员工工资单的程序,我似乎可以通过引用正确传递参数。执行程序时,由于断点自动出现,我无法通过用户输入功能。

#include <stdio.h>

#define size 5

void userinput(int *hoursworked[size], float *rate[size], char *name[size]);
float calculatepay(float *rate[size], int *hoursworked[size]);
float tax(float *grosspay[size]);
float totalpay(float *grosspay[size]);
void print(char *name[size][20], float *rate[size], int *hoursworked[size], float *grosspay[size], float sum[size], float taxespaid[size]);

int main()
{
    int hoursworked[size];
    float rate[size];
    char name[size];
    float grosspay[size];
    float taxespaid[size];
    float sum[size];

    userinput(&hoursworked[size], &rate[size], &name[size]);
    calculatepay(&rate[size], &hoursworked[size]);
    tax(&grosspay[size]);
    totalpay(&grosspay[size]);
    print(&name[size], &rate[size], &hoursworked[size], &grosspay[size],   &sum[size], &taxespaid[size]);

    return 0;
}

void userinput(int *hoursworked[size], float *rate[size], char *name[size])
{
    for(int i=0; i<size; i++){
        printf("Enter name: ");
        scanf("%s", name[i] , 20);

        printf("Enter hours worked: ");
        scanf("%d", hoursworked[i]);

        printf("Enter hourly rate: ");
        scanf("%f", rate[i]);
    }
}

float calculatepay(float *rate[size], int *hoursworked[size])
{
    float grosspay[size];

    for(int i=0; i<size; i++){
        grosspay[size] = *rate[size] * *hoursworked[size];
    }
    return grosspay[size];
}

float tax(float *grosspay[size])
{
    float taxespaid[size];

    for(int i=0; i<size; i++){
        taxespaid[size] = *grosspay[size]*0.2;
    }
    return taxespaid[size];
}

float totalpay(float *grosspay[size])
{
    float sum;
    int i;

    for (i=0; i<size; i++) {
        sum = sum + *grosspay[i];
    }
    return(sum);
}

void print(char *name[size][20], float *rate[size], int *hoursworked[size], float *grosspay[size], float sum[size], float taxespaid[size])
{
    for(int i=0; i<size; i++){
        printf("Pay to: %s", name[i][20]);
        printf("Hours worked: %d", hoursworked[i]);
        printf("Hourly rate: %f", rate[i]);
        printf("Gross Pay: %f", grosspay[i]);
        printf("Taxes paid: %f", taxespaid[i]);
        printf("Net pay: %f", *grosspay[i] - taxespaid[i]);
        printf("Total paid to all employees: %f", sum[i]);
    }
}

3 个答案:

答案 0 :(得分:1)

看起来,指针概念并不适合你。将数组传递给函数时,只需传递变量即可。它指向数组的地址。所以

userinput(variableName);

功能定义应该是,

(Void)userinput( int  variableName[size])
{
          //code here
 }

答案 1 :(得分:1)

将数组传递给函数时,该函数会自动接收数组的地址。所以你的声明不需要指向数组的指针,只需要一个数组。所以不要这样:

float totalpay(float *grosspay[size]);

你这样做:

float totalpay(float grosspay[size]);

此外,您对此功能的调用不正确:

totalpay(&grosspay[size])

这不会传递整个数组,而是传递给一个元素 - 指向数组的末尾。你反而想要这个:

totalpay(grosspay);

需要对您的其他功能进行类似的修复。

calculatepay使用本地grosspay数组。您可能希望从grosspay传递main数组。与taxtaxedpaid类似。在这两种情况下,这些函数都不需要返回任何内容。

同样在calculatepaytax中,在您的for循环中,您正在访问数组的索引size,而不是i

scanf致电阅读名称应为:

scanf("%19s", name[i]);

这会将输入限制为19个字符加上空终止符。此外,由于name是一个二维数组,您需要在userinput的函数声明中将其指定为name[size][20]

同样在userinput中,修复参数声明后,需要更新scanf hoursworked rate调用以传递数组元素的地址你对以下内容感兴趣:

printf("Enter hours worked: ");
scanf("%d", &hoursworked[i]);

printf("Enter hourly rate: ");
scanf("%f", &rate[i]);

main中,sum不应该是一个数组,因为它是所有人的工资总额。您应该为其指定totalpay的返回值:

sum = totalpay(grosspay);

这应该涵盖大部分内容。

答案 2 :(得分:0)

在您的主体中,您定义了几个不同数据类型的数组:

int hoursworked[size];
float rate[size];
char name[size];
float grosspay[size];
float taxespaid[size];
float sum[size];

然后你将它们传递给你的函数:

void userinput(int *hoursworked[size], float *rate[size], char *name[size]);

当您将变量从main传递给函数时,它们与声明的类型不匹配。您试图将一系列各种数据类型从main传递给只接受指针数组的函数。

你应该传递变量:

int hoursworked[size];
float rate[size];
char name[size];
float grosspay[size];
float taxespaid[size];
float sum[size];


userinput(&hoursworked, &rate, &name);

宣布你的职能:

void userinput(int *hoursworked, float *rate, char *name);

这将匹配main中的数组。为了进一步阅读,我建议:http://www.tutorialspoint.com/cprogramming/c_arrays.htm。在对第一个函数进行更改后,您需要相应地更改其他函数 - &gt;这是我第一眼看到你的程序时注意到的其他事情。请尽可能调试。