【问题标题】:C Programming : Parameter : Can't convert to int*C 编程:参数:无法转换为 int*
【发布时间】:2020-03-19 18:16:25
【问题描述】:

我是新来的,我有一个问题。

我正在做关于过程和结构的 C 编程作业。

所以我想声明一个结构数组,然后将其作为别名。这是代码:

typedef struct Mahasiswa
{
    int NIM;    
    char NamaMhs[16];
    char KodeMK[6];
    char Nilai;
}TabMhs[100];
TabMhs M; //Alias

我想使用这个结构作为另一个过程的参数:

这是程序:

void SortDataMhs(struct Mahasiswa M[Nmaks],int n);

这是过程调用:

SortDataMhs(&M,n);

但我得到一个错误: [错误] 无法将参数 '1' 'void SortDataMhs(Mahasiswa*,int)' 的 'Mahasiswa()][100]' 转换为 'Mahasiswa'

有什么帮助吗?很抱歉问了这样一个新手问题。因为我是编程新手 :)

【问题讨论】:

  • “别名”是什么意思?这不是 C 术语。我需要问一下,否则你的意图不清楚,因此很难回答。
  • 我真的不知道,我认为它就像实际变量是 TabMhs 但我用它来缩短变量为 M
  • 致电SortDataMhs 像这样SortDataMhs(M,n)SortDataMhs(&M[0],n)。它会起作用的。

标签: c arrays merge


【解决方案1】:

这个结构体数组的声明,即:

typedef struct Mahasiswa
{
    int NIM;    
    char NamaMhs[16];
    char KodeMK[6];
    char Nilai;
}TabMhs[100];
TabMhs M; //Alias

不是好习惯。你可以阅读更多关于它的信息here

现在,下面的代码更具可读性和可理解性:

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

typedef struct Mahasiswa
{
    int NIM;    
    char NamaMhs[16];
    char KodeMK[6];
    char Nilai;
}TabMhs;

TabMhs m[100];

void ss(TabMhs* m, int n){ // `m` is the pointer to array of structures and `n` is the number of elements in that array.
    for(int i=0; i<n ; i++){
        printf("%d\t%s\t%s\t%c\t%d\n", m[i].NIM, m[i].NamaMhs, m[i].KodeMK, m[i].Nilai, n);
    }
}

int main(){
    m[0].NIM = 0;
    strcpy(m[0].NamaMhs, "m0nama");
    strcpy(m[0].KodeMK, "m0kod");
    m[0].Nilai='a';

    m[1].NIM = 1;
    strcpy(m[1].NamaMhs, "m1nama");
    strcpy(m[1].KodeMK, "m1kod");
    m[1].Nilai='b';

    ss(m,2);

    return 0;
}

但是说明天你的结构数组需要多于(或少于)100 个元素,在这种情况下,你可以通过删除语句 TabMhs m[100] 并将其替换为以下语句来使该数组动态化:

int main(){

    int n = 10;
    TabMhs* m = malloc(sizeof(TabMhs) * n);

    /* rest of the code remains same */

    free(m);
}

【讨论】:

  • 好的,我明白了,非常感谢您的长篇回答,我真的很感激。但是,如果我可以问更多“ss”参数之后的 TabMhs 之后的 * 是什么?
  • 一个“*”表示该变量是一个指针。所以,m 是一个指向TabMhs 类型变量的指针。 “指针”就像任何其他变量一样,除了它将“地址”存储到另一个变量。我建议您阅读 C 中的指针:geeksforgeeks.org/…
  • 哦,如果我把它写成“TabMhs* M”和TabMhs *M”是一样的吗?
  • 是的,间距无关紧要。即使TabMhs * MTabMhs* MTabMhs *M 相同。
猜你喜欢
  • 2014-04-02
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 2015-03-09
  • 2015-06-12
  • 2018-11-25
相关资源
最近更新 更多