【问题标题】:Problem with parameter passing with arrays使用数组传递参数的问题
【发布时间】:2026-01-06 23:40:01
【问题描述】:

这是我的 C 编程课的作业。该程序计算员工总工资、税金和净实得工资。

程序运行但它自动结束说“分段错误(核心转储) 错误消息说:

第 127 行:警告:从不兼容的指针类型传递“提示”的参数 1

第 13 行:注意:预期为 'char*' 但参数类型为 'char*(*)[5]'

第 143 行:警告:从不兼容的指针类型传递 'PrintOutput' 的参数 1

第 90 行:注意:预期为 'char*' 但参数类型为 'char(*)[20][5]'

我不太了解int 类型,因为我在main() 函数中将first_name 变量声明为数组。 其余的错误我也不明白。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Prompt(char* a, float* b, float* c)
{
    int i;
    for (i = 0; i < 5; i++) {
        printf("Enter name: ");
        scanf("%s", &a[i]);
        if (strcmp(&a[i],"-1") == 0) {
            break;
        }

        printf("Enter hourly rate: ");
        scanf("%f", &b[i]);
        if (b[i] == -1) {
            break;
        }

        printf("Enter hours worked: ");
        scanf("%f", &c[i]);
        if (c[i] == -1) {
            break;
        }
    }
    return;
}

void GrossPay(float* grosspay, float* basepay, float* overtimepay,
              float* rate, float* hours)
{
    int i;

    if (hours[i] > 40) {
        overtimepay[i] = (hours[i] - 40) * (rate[i]) * 1.5;
        basepay[i] = rate[i] * hours[i];
        grosspay[i] = rate[i] * hours[i] + (hours[i] - 40) * (rate[i]) * 1.5;
    } else {
        overtimepay[i] = 0;
        basepay[i] = rate[i] * (hours[i]);
        grosspay[i] = basepay[i];
    }
    return;
}

float Taxes(float gross_pay[])
{
    int i;
    float taxes_owed[5];

    for (i = 0; i < 5; i++) {
        taxes_owed[i] = 0.2 * gross_pay[i];
    }
    return taxes_owed[5];
}

float CalculateTotal(float gross_pay[])
{
    int i;
    float total_pay = 0;

    for (i = 0; i < 5; i++) {
        total_pay += gross_pay[i];
    }

    return total_pay;
}

void PrintOutput(char first_name[5], float* rate, float* hours,
                 float* gross_pay, float* base_pay, float* overtime_pay,
                 float* taxes_owed, float* net_pay, float* total_pay)
{
    int i;
    for (i = 0; i < 5; i++) {
        printf("\nPay to: %s\n", &first_name[i]);
        printf("Hours worked: %5.1f\n", hours[i]);
        printf("Hourly rate: $%5.2f\n", rate[i]);
        printf("Gross pay: $%5.2f \n", gross_pay[i]);
        printf("Base pay: $%5.2f \n", base_pay[i]);
        printf("Overtime pay: $%5.2f\n", overtime_pay[i]);
        printf("Taxes paid: $%5.2f\n", taxes_owed[i]);
        printf("Net pay: $%5.2f\n\n", net_pay[i]);
    }
    printf("Total paid to all employees= $%5.2f\n", *total_pay);

    return;
}

int main()
{
    char first_name[20][5];
    float rate[5];
    float hours[5];
    float gross_pay[5];
    float base_pay[5];
    float overtime_pay[5];
    float taxes_owed[5];
    float net_pay[5];
    float total_pay;
    int i;


    Prompt(first_name, rate, hours);

    GrossPay(gross_pay, base_pay, overtime_pay, rate, hours);


    taxes_owed[5] = Taxes(gross_pay);

    total_pay = CalculateTotal(gross_pay);


    for (i = 0; i < 5; i++) {
        net_pay[i] = gross_pay[i] - taxes_owed[i];
    }


    PrintOutput(&first_name, rate, hours, gross_pay, base_pay, \
                overtime_pay, taxes_owed, net_pay, &total_pay);

    return 0;
}

对不起,我对编码很陌生,以前从未上过编码课程,现在我非常困惑,尤其是在参数传递方面。

【问题讨论】:

  • 一一检查编译器错误并修复它们。一次一行,从第一个错误开始。一旦这些都解决了,请尝试再次运行该程序。不要费心尝试运行编译器警告您有错误的程序。
  • '我不太了解 int 类型'——事实上,我也不懂。错误消息的哪一部分让您认为它与“int 类型”有关?

标签: arrays c pointers parameter-passing


【解决方案1】:

当您遇到此类问题时,第一步将使用 compiler errors 并使用 Debugger 解决所有 syntax 错误和逻辑错误好吧。 如果您仍然遇到错误,那么您可以在此处发布源代码 code sn-plogs 文件(如果有),但请确保问题不应发布为 重复,所以在发布前搜索。

现在我已经解决了你的代码,可以在Ideone 上找到here,这里也是示例输出。

Pay to: emp1
Hours worked:  20.0
Hourly rate: $10.00
Gross pay: $200.00 
Base pay: $200.00 
Overtime pay: $ 0.00
Taxes paid: $40.00
Net pay: $160.00


Pay to: emp2
Hours worked:  20.0
Hourly rate: $15.00
Gross pay: $300.00 
Base pay: $300.00 
Overtime pay: $ 0.00
Taxes paid: $60.00
Net pay: $240.00


Pay to: emp3
Hours worked:  25.0
Hourly rate: $15.00
Gross pay: $375.00 
Base pay: $375.00 
Overtime pay: $ 0.00
Taxes paid: $75.00
Net pay: $300.00
Total paid to all employees= $2375.00

这里有一些关于数组和指针的误解的注释。

  • char* a 是单个数组,但您将名称声明为 2d array 使用 char** 表示 二维数组 的二级指针。

  • 传递 2d 数组 然后你需要 2 个索引 ij 用于 cols 分别。

  • 始终使用 NULL0 初始化局部变量。

  • 函数参数中的指针和数组的作用相同,所以 arr[]arr*
    是相同的参数,但不在 local/global 变量中。

  • Scanf 获取变量的地址,因此我们使用 & 来传递地址,但对于 数组我们不这样做,因为数组本身充当指针,所以我们
    编写 scanf("%d",arr+i) 以访问包含所有元素的数组。

  • 始终在声明顶部使用 #define 定义常量以重复使用 它在代码中。

  • 不要尝试从函数返回本地数组,而是将其传递为
    参数作为通过引用传递

如果代码在编辑器中太长而无法显示,请使用 pastebin.comideone.com 粘贴代码。

【讨论】:

  • 非常感谢!
最近更新 更多