帮助解决 c 错误

Help with c errors

本文关键字:错误 解决 帮助      更新时间:2023-10-16

收到此错误:

1>c:usersb1021568documentsvisual

工作室 2010\项目\塔雷法42\塔雷法
42\main.cpp(112): 错误 C2664: "cria_aluno":无法转换 参数 2 从"常量字符 [7]"到 "字符" 1> 没有上下文可以进行这种转换

尝试编译此内容时:

int main(void)
{
    Aluno *a[5];
    a[0] = cria_aluno(1, "turma1", "Joao", 7.0, 8.4, 4.3);
    a[1] = cria_aluno(2, "turma2", "Maria", 3.2, 5.1, 10.0);
    a[2] = cria_aluno(3, "turma3", "Rafael", 8.1, 3.2, 4.5);
    a[3] = cria_aluno(4, "turma4", "Jose", 1.3, 7.7, 9.3);
    a[4] = cria_aluno(5, "turma5", "Lais", 4.5, 1.3, 9.9);
    ordena(5, a);
return 0;
}

这是我cria_aluno功能:

Aluno *cria_aluno(int mat, char turma, char nome, float p1, float p2, float p3)
{
    Aluno *a;
    a = (Aluno*) malloc(sizeof(Aluno));
    if(a == NULL)
    {
        printf("Memoria insuficiente");
        return NULL;
    }
    a->mat = mat;
    a->turma = turma;
    strcpy(a->nome, nome);
    a->p1 = p1;
    a->p2 = p2;
    a->p3 = p3;
    return a;
}

将其更改为

Aluno *cria_aluno(int mat, const char* turma, const char* nome, float p1, float p2, float p3)

"turma1"等属于const char*型,而不是char

更改

Aluno *cria_aluno(int mat, char turma, char nome, float p1, float p2, float p3)

Aluno *cria_aluno(int mat, const char* turma, const char* nome, float p1, 
                  float p2, float p3)
{
   Aluno *a = (Aluno*) malloc(sizeof(Aluno));
   if(a == NULL)
   {
      printf("Memoria insuficiente");
      return NULL;
   }
   a->mat = mat;
   a->turma = malloc(strlen(turma)+1);
   strcpy(a->turma, turma);
   a->nome = malloc(strlen(nome)+1);
   strcpy(a->nome, nome);
   a->p1 = p1;
   a->p2 = p2;
   a->p3 = p3;
   return a;
}

您的函数期望参数 2 和 3 字符类型,而不是字符指针(char*,通常用作"字符串")。

在 main 函数中,您使用 char* 类型(字符串)作为参数 2 和 3 调用了 cria_aluno,这就是导致错误的原因。

首先,您需要决定要在 Aluno 结构中存储什么。让我们以图尔马为例:

如果要存储单个字符,则应使用 char 作为结构和函数中的 turma 类型。此外,在函数调用中,应使用单个字符作为参数 2,例如:"a"。要复制此字符,您应该使用一个简单的副本:a->turma = turma;

如果你想存储一个字符串,你应该使用 char[x](其中 x 是末尾的最大字符串长度 + \0)作为结构中的 turma 类型。在函数中,你应该使用 char* (const char* 会更好)。在函数调用中,可以使用字符串(例如:"example")。要复制此属性,您应该使用 strcpy。

将 turma 作为字符串模式存储在结构中的另一种方法是将结构中的类型更改为 char*。然后,在需要时分配内存。

祝你好运

阿米尔

在函数调用中

a[0] = cria_aluno(1, "turma1", "Joao", 7.0, 8.4, 4.3); 

"turma1""Joao"字符串文本,它们是char数组(C++ 中const char)。 这两个表达式的类型分别是 char [7]char [5]。 这些类型与char不兼容,这是您声明turmanomecria_aluno中的内容,因此会出现错误。

在大多数情况下,数组表达式的类型从"T的 N 元素数组"隐式转换为"指向T的指针"。 所以实际传递给cria_aluno的是两个类型的表达式 char * ,而不是 char 。 因此,您需要将cria_aluno声明更改为

Aluno *cria_aluno(int mat, const char *turma, const char *nome, float p1, float p2, float p3)

为什么const char *而不是char *? 这有助于防止您意外修改指针指向的内容;尝试修改字符串文本的内容会导致未定义的行为。