1

このエラーが発生します:

1>c:\users\b1021568\documents\visual

studio 2010 \ projects \ tarefa42 \ tarefa
42 \ main.cpp(112):エラーC2664:'cria_aluno':パラメーター2を'constchar[7]'から'char'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;
}
4

4 に答える 4

3

に変更します

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

「turma1」などは のタイプconst char*であり、そうではありませんchar

于 2011-05-09T11:51:13.197 に答える
1

関数は、パラメーター 2 および 3 の char 型であり、char ポインター (通常は「文字列」として使用される char*) ではありません。

メイン関数で、パラメーター 2 および 3 として char* 型 (文字列) を使用して cria_aluno を呼び出しました。これがエラーの原因です。

最初に、Aluno 構造体に何を格納するかを決定する必要があります。トゥルマを例に取りましょう:

単一の文字を格納する場合は、構造体と関数で turma の型として char を使用する必要があります。また、関数呼び出しでは、パラメーター 2 として 1 文字を使用する必要があります (例: 'a')。この文字をコピーするには、単純なコピーを使用する必要があります: a->turma = turma;

文字列を格納する場合は、構造体の turma のタイプとして char[x] (x は文字列の最大長 + 末尾の \0) を使用する必要があります。関数では、char* を使用する必要があります (const char* の方が適しています)。関数呼び出しでは、文字列を使用できます (例: "example")。この属性をコピーするには、strcpy を使用する必要があります。

turma を文字列モードとして構造体に格納する別の方法は、構造体で型を char* に変更することです。次に、必要に応じてメモリを割り当てます。

幸運を

アミール

于 2011-05-09T12:23:58.230 に答える
1

変化する

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;
}
于 2011-05-09T11:49:33.333 に答える
0

関数呼び出しで

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

"turma1""Joao"文字列リテラルであり、char( const charC++ では) の配列です。2 つの式の型は、それぞれchar [7]char [5]です。これらの型はと互換性がありませcharん. turmanomecria_aluno

ほとんどの場合、配列式の型は暗黙的に「N 要素配列T」から「ポインタ」に変換されますT。したがって、実際に渡されるのはではなくcria_aluno型の 2 つの式です。したがって、の宣言をに変更する必要がありますchar *charcria_aluno

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

なぜconst char *代わりにchar *?これにより、ポインターが指している内容の誤った変更を防ぐことができます。文字列リテラルの内容を変更しようとすると、未定義の動作が発生します。

于 2011-05-09T14:35:15.973 に答える