2015-07-19 53 views
2

我正在嘗試編寫一個跟蹤員工工資單的程序,我似乎可以通過引用正確傳遞參數。執行程序時,我無法越過因爲自動出現斷點的用戶輸入功能。我不斷收到第一個函數中的線程1 EXC_BAD_ACCESS斷點

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

您對如何傳遞數組完全感到困惑。你沒有書嗎?這比你做得更容易。擺脫函數聲明中的星號。去掉通話中的&符號。數組自動作爲指針傳遞。順便說一句,你應該把'size'全部大寫:'SIZE'。這是定義常量的慣例。 – ooga

回答

1

它看起來像,指針的概念是不理解你。當你傳遞一個陣列的功能,你只需要傳遞變量,它指向所以

userinput(variableName); 

和功能定義應該是,

(Void)userinput(int variableName[size]) 
{ 
      //code here 
} 
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中將各種數據類型的數組傳遞給僅接受指針數組的函數。

你應該通過變量如:

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); 

這將主要滿足您的陣列。爲進一步閱讀,我會建議:http://www.tutorialspoint.com/cprogramming/c_arrays.htm。在對第一個功能進行更改後,您需要相應地更改其他功能 - >這是我首先注意到您的程序時注意到的其他事項。請儘可能進行調試。

1

將數組傳遞給函數時,該函數自動接收數組的地址。所以你的聲明不需要指向數組的指針,而只需要一個數組。因此,而不是這樣的:

float totalpay(float *grosspay[size]); 

你這樣做:

float totalpay(float grosspay[size]); 

此外,你可以調用這個函數是不正確的:

totalpay(&grosspay[size]) 

這不整個數組中傳遞,但一個指向數組結尾的元素的指針。你需要這個:

totalpay(grosspay); 

需要對您的其他功能進行類似修復。

calculatepay使用本地grosspay陣列。您可能想要傳入main而不是grosspay陣列。與taxtaxedpaid類似。在這兩種情況下,這些函數都不需要返回任何東西。

另外在calculatepaytax,在你for循環您所訪問的陣列,而不是i指數size

scanf調用來讀取的名稱應該是:

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

這限制了輸入19個字符加上空終止符。另外,由於name是一個二維數組,因此您需要在userinput的函數聲明中指定它爲name[size][20]

而且在userinput,一旦你修復參數聲明中,scanf呼籲hoursworkedrate需要更新的數組元素的地址通過你感興趣的:

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

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

mainsum不應該是一個數組,因爲它是所有人的工資的總和。你應該爲它分配totalpay返回值:

sum = totalpay(grosspay); 

這應該涵蓋大部分。

相關問題