Объяснение отсутствующего сообщения об ошибке прототипа для пользовательской функции 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 2

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, и выдает ошибку.

В качестве альтернативы, если вы хотите избежать определения прототипа функции, определите getLine Перед main, например

#include ...

const char * getLine() {
   ...
}

int main() {
    ...
}