2016-03-08 4 views
0

Я пытаюсь запустить код, но он не может быть создан. Я хочу читать 3 разных имени до 40 символов, сохранять в одном векторе и печатать. Мне нужно сделать это с помощью функции. Я получаю «Объект с переменным размером не может быть инициализирован» для строки 15. Я считаю, что могу получить эту ошибку, если размер вектора не определен. Я уже пытался определить его с помощью констант (NOMESQUAN и NOMESTAM) и в декларации (nomes [3] [41]), но каждый раз получаю ту же ошибку.объект переменной величины не может быть инициализирован - ошибка C

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

#define NOMESQUAN 3 
#define NOMESTAM 41 

int lenomes(int i); 

int main() 
{ 
    int i; 
    char nomes[NOMESQUAN][NOMESTAM]; 

    for(i=0; i<3; i++){ 
     char nomes[i][NOMESTAM] = lenomes(i); /*LINE 15*/ 
    } 

} 

int lenomes(int i){ 
    char nome[NOMESTAM]; 

    printf("Digite o nome %d", i); 
    gets(nome); 

    return nome; 
} 
+4

'return nome;' - Неа. Вы не можете сделать это. –

+1

У вашего кода несколько проблем, что вы пытаетесь сделать? –

+1

Вы возвращаете указатель на 'char' в' lenomes', который имеет 'int' как возвращаемый тип. Вы объявляете «nomes» два раза (один в начале «main», а второй - в цикле). – ForceBru

ответ

0

Прежде всего функции lenomes содержит код нонсенс и не будет компилироваться. Вы не можете вернуть массив из функции. И вы еще не объявили функцию для возврата массива, вы заявили, что он возвращает int. Как это имеет смысл, скажите мне.


символьные номы [NOMESQUAN] [NOMESTAM];

Здесь вы объявить массив, но затем внутри цикла объявляется другой массив char nomes[i][NOMESTAM] снова, но в этот раз как массив с переменной длиной (так как i является переменной во время выполнения). Такие массивы не могут быть инициализированы, поскольку для них имеет смысл получить значения во время выполнения.


Подводя итог, при программировании вы не можете просто взять шанс на синтаксисе языка, вы действительно должны знать, что каждая линия писать делает.

Вы, вероятно, хотите сделать что-то вроде этого, вместо:

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

#define NOMESQUAN 3 
#define NOMESTAM 41 

void lenomes (int i, char nomes[i][NOMESTAM]); 

int main() 
{ 
    int i; 
    char nomes[NOMESQUAN][NOMESTAM]; 

    for(i=0; i<NOMESQUAN; i++){ 
     lenomes(i, nomes); 
    } 

} 

void lenomes (int i, char nomes[i][NOMESTAM]) { 
    printf("Digite o nome %d", i); 
    gets(nome[i]); 
} 
+0

_However_, обратите внимание, что функция 'gets' была удалена с языка C. Было отмечено, что эта функция по своей природе опасна для использования около 25 лет назад, поэтому она была уничтожена 17 лет назад и полностью удалена 5 лет назад. Поэтому тот, кто научил вас использовать его, не является хорошим источником для программирования C, их знания полностью устарели. – Lundin

0

В этом заявлении

char nomes[i][NOMESTAM] = lenomes(i); /*LINE 15*/ 

определен переменной массив длины, который пытался инициализировать. Прежде всего, VLA не может быть инициализирован, и более того, инициализация в любом случае неверна.

Функция lenomes также недействительна.

int lenomes (int i) { char nome [NOMESTAM];

printf("Digite o nome %d", i); 
gets(nome); 

return nome; 

}

Он пытается вернуть указатель преобразуется в тип Int, который имеет адрес первого элемента локального массива, который будет уничтожен после выхода из функции.

Учтите, что функция gets больше не поддерживается стандартом C, поскольку она небезопасна.

Вам нужно что-то вроде следующего

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

#define NOMESQUAN 3 
#define NOMESTAM 41 

char * lenomes(char *nome, size_t n); 

int main(void) 
{ 
    size_t i; 
    char nomes[NOMESQUAN][NOMESTAM]; 

    for (i = 0; i < sizeof(nomes)/sizeof(*nomes); i++) 
    { 
     lenomes(nomes[i], sizeof(nomes[i])); 
    } 
} 

char * lenomes(char *nome, size_t n) 
{ 
    char *p; 

    printf("Digite o nome "); 
    p = fgets(nome, n, stdin); 

    if (p) p[strcspn(p, "\n")] = '\0'; 

    return p; 
} 
0

С помощью комментариев, которые показали проблемы в вашем коде, здесь возможно осуществление.

#include <stdio.h> /* io functions MUST be declared */ 

#define NOMESQUAN 3 
#define NOMESTAM 41 

/* pass a buffer and a length to io routine */ 
char *lenomes(int i, char *buf, int sz); 

int main() 
{ 
    int i; 
    char nomes[NOMESQUAN][NOMESTAM]; 

    for(i=0; i<3; i++){ 
     lenomes(i, nomes[i], NOMESTAM); /*LINE 15*/ 
    } 

} 

char* lenomes(int i, char *nome, int sz){ 

    printf("Digite o nome %d", i); 
    return fgets(nome, sz, stdin); /* NEVER use gets */ 
}