Объяснение отсутствующего сообщения об ошибке прототипа для пользовательской функции getln в C
#include <stdio.h>
#include <stdlib.h>
#include <reg51.h>
void main (void) {
SCON = 0x52; // serial port configuration
TMOD = 0x20;
TCON = 0x40;
TH1 = 0xf3; // 2403 baudrate @12mhz
printf("Hello World");
printf("Please enter some text: ");
scanf(getLine());
}
const char *getLine()
{
char *line = NULL, *tmp = NULL;
size_t size = 0, index = 0;
int ch = EOF;
while (ch) {
ch = getc(stdin);
if (ch == EOF || ch == 'n')
ch = 0;
if (size <= index) {
size += CHUNK;
tmp = realloc(line, size);
if (!tmp) {
free(line);
line = NULL;
break;
}
line = tmp;
}
line[index++] = ch;
}
return line;
}
free(str);
Это мой код. Я думаю, что неправильно звоню в гетлн. Есть ли способ заставить функцию принимать входные данные, которые я могу передать от пользователя?
Этот компилятор является ознакомительной версией, но я считаю, что он содержит необходимые мне библиотеки.
Моя цель состоит в том, чтобы принять "строку", или, скорее, массив символов, а затем манипулировать его порядком в качестве теста навыка. У меня есть только 2000 КБ памяти, чтобы написать это.Я немного новичок, когда дело доходит до указателей и не быть способен ссылаться. Помощь или даже просто объяснения очень ценятся.
Я использую компилятор KEIL.
Когда я выбираю Program>Rebuilded All Target Files to check my errors, я получаю следующее:
- запуск сборки.А51... сборка XBANKING.А51... скомпилировать Главный.с... ГЛАВНЫЙ.C (14): предупреждение C206: 'getln': отсутствует функция-прототип основной.C (14): ошибка C214: незаконное преобразование указателя Цель не создана
Спасибо,
3 ответа:
Вы правильно определили функцию внизу, но компилятору C нужен список функций, называемых
prototypes
, вверху. Прототип должен содержать тип функции, имя функции и все аргументы, которые принимает функция. Например:#include <stdio.h> void hello_world(); //This is the function prototype int main() { hello_world(); } void hello_world() //You did this part correctly, but C needs the { //prototype at the top in order to see this as a printf("Hello, world!\n"); //defined function }
В вашем случае прототипом будет просто:
const char *getLine(void);
И тогда ваша программа будет работать без каких-либо
prototype
ошибок. Ура!
Вам нужно добавить:
const char *getLine(void);
Вверху, под включениями.
Это называется прототипом функции , и он должен появиться в исходном файлеПеред использованием функции .
Вы, по сути, заранее говорите компилятору, что
В противном случае компилятор понятия не имеет, что такоеgetLine
- это функция, которая не принимает аргументов и возвращаетconst char *
. Таким образом, даже если компилятор еще не видел определения функции, он все равно может проверить, что она используется правильно, когда она появляется в вашей функцииmain
.getLine
, когда он попадает в строку 14, и выдает ошибку.