Помогите с ошибками c - PullRequest
1 голос
/ 09 мая 2011

получаю эту ошибку:

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

студия 2010 \ проекты \ tarefa42 \ tarefa
42 \ main.cpp (112): ошибка C2664: 'cria_aluno': невозможно конвертировать параметр 2 от 'const char [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;
}

Ответы [ 4 ]

3 голосов
/ 09 мая 2011

Измените его на

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

"turma1" и т. Д. Относятся к типу const char*, а не char

1 голос
/ 09 мая 2011

Ваша функция ожидает в качестве параметра 2 и 3 тип char, а не указатель char (char *, обычно используется как "string").

В вашей главной функции вы вызвали cria_aluno с типом char * type (string) в качестве параметров 2 и 3, что является причиной вашей ошибки.

Сначала вам нужно решить, что вы хотите хранить в структуре Aluno. Давайте возьмем турму в качестве примера:

Если вы хотите сохранить один символ, вы должны использовать char в качестве типа turma в структуре и в функции. Также в вызове функции вы должны использовать один символ в качестве параметра 2, например: «a». Чтобы скопировать этот символ, вы должны использовать простую копию: a-> turma = turma;

Если вы хотите сохранить строку, вы должны использовать char [x] (где x - максимальная длина строки + \ 0 в конце) в качестве типа turma в структуре. В функции вы должны использовать char * (const char * будет лучше). В вызове функции вы можете использовать строку (пример: «пример»). Чтобы скопировать этот атрибут, вы должны использовать strcpy.

Еще один способ сохранить turma в вашей структуре как строковый режим, это изменить тип на char * в структуре. Затем, при необходимости, выделите память.

Удачи

Amir

1 голос
/ 09 мая 2011

Изменить

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;
}
0 голосов
/ 09 мая 2011

В вызове функции

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

"turma1" и "Joao" являются строковыми литералами , которые являются массивами char (const char в C ++). Типы двух выражений: char [7] и char [5] соответственно. Эти типы несовместимы с char, который вы объявили turma и nome в cria_aluno, следовательно, ошибка.

В большинстве случаев выражения массивов имеют свои типы, неявно преобразуемые из «массива N-элемента из T» в «указатель на 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 *? Это помогает защитить вас от случайного изменения содержимого того, на что указывает указатель; попытка изменить содержимое строкового литерала приводит к неопределенному поведению.

...