Конфликтующие типы Предупреждение при передаче String для функции в C - PullRequest
1 голос
/ 27 апреля 2011

Я давно не программировал на C, и у меня возникла проблема с передачей строки в функцию. Код работает, однако я получаю предупреждения от gcc.

Я вызываю функцию в моем главном с:

copyToCode(code, section1, section2);

Функция:

void copyToCode (char **code, char *loc, char *data ){}

Я получаю "конфликтующие типы для copyToCode" в строке, содержащей функцию, и предупреждение "неявное ранее объявление copyToCode было здесь" в строке, вызывающей функцию.

Я объявил переменные:

char *code = malloc (32*1000* sizeof(char));

char *section1 = malloc(8*sizeof(char)), *section2 = malloc(8*sizeof(char));

Я тоже пробовал это: char *section1[8];

Как побочный вопрос - что правильно?

Секции 1 и секция 2 должны быть строками, а код - массивом строк.

Спасибо за чтение, я ценю любую помощь. Gareth

Ответы [ 4 ]

3 голосов
/ 27 апреля 2011

Вам необходимо объявить функцию перед вызовом, иначе компилятор попытается определить, какой прототип функции от вашего имени.

Сообщение

previous неявное объявление copyToCode

говорит вам об этом.Неявное объявление - это то, что делает компилятор, потому что вы еще не дали ему явное объявление.


В своем обновлении вопроса вы говорите, что code предназначен для массива строкно вы определяете это как:

char *code = malloc (32*1000* sizeof(char));

Это выделяет одну строку.Массив строк будет храниться в char**, как argv.Сначала вам нужно выделить массив, который будет содержать n строк, каждая из которых будет char*.Тогда вам придется распределять каждый char* один за другим в цикле.

Этот тип кодирования намного проще в C ++ со стандартной строкой библиотеки и векторными классами.

0 голосов
/ 27 апреля 2011

Чтобы определить массив строк, вам понадобится что-то вроде следующего:

char **code;
int i;
code = malloc (32*sizeof(*code));
for (i=0; i<32; i++) {
  code[i]=malloc(1000*sizeof(**code));
}

Обратите внимание, что это не включает проверку ошибок результатов malloc, что вы должны сделать. И он создает массив размером 32, содержащий строки размером 1000, которые не следует кодировать жестко.

0 голосов
/ 27 апреля 2011

Это предупреждение означает, что ваша декларация отличается от реализаций.Или у вас есть два разных объявления функции.

Поскольку в предупреждении упоминается неявное объявление , это означает, что объявление было выведено gcc, поскольку вы использовали функцию до ее объявления.GCC будет использовать параметры вызова функции для вывода объявления, что может привести к неприятным проблемам.

Если вы объявите функцию, вы, вероятно, все равно получите ошибку, но она должна быть гораздо более конкретной.

Примечание: если вы работаете с gcc, всегда компилируйте как gcc -std=c99 -pedantic -Wall -Wextra -Wwrite-strings source.c

Для редактирования: Ваши переменные неверны.код char * но ваша функция занимает char **.

0 голосов
/ 27 апреля 2011

Можете ли вы дать нам более подробную информацию о переменных, которые вы используете в качестве параметров функции?

Также стоит отметить тот факт, что первым параметром copyToCode является pointer to a pointer of chars, который можно использовать как array of strings.

Строка:

void copyToCode (char **code, char *loc, char *data ){}

является объявлением вашей функции?В этом случае вы должны написать это так:

void copyToCode (char **code, char *loc, char *data );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...