Указатели и функции gettring - PullRequest
0 голосов
/ 21 апреля 2010

Я пытаюсь написать функцию для получения строки из uart. Это для встроенной системы, поэтому я не хочу использовать malloc.

Указатель, который передается в функцию getstring, кажется, указывает на мусор после вызова gets_e_uart1 (). Я не использую указатели слишком часто, поэтому я уверен, что это что-то действительно глупое и тривиальное, что я делаю неправильно.

int main()
    {   
        char *ptr  = 0;
        while(1)
        {

        gets_e_uart1(ptr, 100);
        puts_uart1(ptr);

    }
        return 0;
}*end main*/ 

//-------------------------------------------------------------------------
//gets a string and echos it
//returns 0 if there is no error

char getstring_e_uart1(char *stringPtr_, const int SIZE_)

{

char buffer_[SIZE_];
stringPtr_ = buffer_;
int start_ = 0, end_ = SIZE_ - 1;
char errorflag = 0;

/*keep geting chars until newline char recieved*/
while((buffer_[start_++] = getchar_uart1())!= 0x0D)
{       
    putchar_uart1(buffer_[start_]);//echo it

    /*check for end of buffer 
     wraparound if neccesary*/
    if(start_ == end_)
    {
        start_ = 0;
        errorflag = 1;
    }
}
putchar_uart1('\n');
putchar_uart1('\r');

/*check for end of buffer 
 wraparound if neccesary*/
if(start_ == end_)
{
    buffer_[0] = '\0';
    errorflag = 1;
}
else
{
    buffer_[start_++] = '\0';
}
return errorflag;
}

Обновление:

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

Обновленный код:

 //-------------------------------------------------------------------------
 //argument 1 should be a pointer to an array, 
 //and the second argument should be the size of the array
 //gets a string and echos it
 //returns 0 if there is no error
char getstring_e_uart1(char *stringPtr_, const int SIZE_)
{

    char *startPtr_ = stringPtr_;
    char *endPtr_  = startPtr_ + (SIZE_ - 1);
    char errorflag = 0;

    /*keep geting chars until newline char recieved*/
    while((*stringPtr_ = getchar_uart1())!= 0x0D)
    {       
        putchar_uart1(*stringPtr_);//echo it
        stringPtr_++;

        /*check for end of buffer 
         wraparound if neccesary*/
        if(stringPtr_ == endPtr_)
        {
            stringPtr_ = startPtr_;
            errorflag = 1;
        }
    }
    putchar_uart1('\n');
    putchar_uart1('\r');

    /*check for end of buffer 
     wraparound if neccesary*/
    if(stringPtr_ == endPtr_)
    {
        stringPtr_ = startPtr_;
        *stringPtr_ = '\0';
        errorflag = 1;
    }
    else
    {
        *stringPtr_ = '\0';
    }
    return errorflag;
}

Ответы [ 4 ]

2 голосов
/ 21 апреля 2010

Подсказка: ptr указывает на мусор до вызова gets_e_uart1 ().

Вам нужно передать указатель на ваш указатель на gets_e_uart1()

РЕДАКТИРОВАТЬ: За исключением ... если вы хотите, чтобы ptr в main() указывал на buffer_ в вашей функции ... у вас есть другая проблема. buffer_ находится в стеке и выходит из области видимости, как только функция возвращается. Вам потребуется malloc() эта память в вашей функции.

char getstring_e_uart1(char **stringPtr_, const int SIZE_)
{

    char *buffer_ = (char*) malloc(SIZE_ * sizeof(char));
    *stringPtr_ = buffer_;

(Снова редактирую, потому что я не обращал внимания на ваш основной цикл, извините)

Затем вам нужно будет освободить его после вызова puts_uart1(ptr), что означает, что вы постоянно нарушаете и освобождаете в этом цикле. Кажется, у вас есть фиксированный размер для этого буфера, почему бы просто не создать его в main() и передать его в обе функции?

1 голос
/ 21 апреля 2010

Вам нужно создать буфер до вызова getstring_e_uart1(). Написанный код приведет к уничтожению переменной buffer_ при выходе из функции.

Я думаю, вы хотите что-то более похожее на:

char buffer_[SIZE_];
while(1) {
  char* ptr = buffer_;
  gets_e_uart1(ptr, sizeof(buffer_));
  puts_uart1(ptr);
}

Примечание: я не проверял повторное использование буфера переменных _.

1 голос
/ 21 апреля 2010

В дополнение к ответу Брайана, я думаю, у вас также есть проблема здесь:

char getstring_e_uart1(char *stringPtr_, const int SIZE_)   
{  
char buffer_[SIZE_]; 
stringPtr_ = buffer_; 

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

0 голосов
/ 21 апреля 2010

Вам не нужно делать буфер статическим или глобальным - вам просто нужно, чтобы вызывающий выделил его. Изменения тривиальны:

int main()
{   
    while(1)
    {
        char buffer[100] = { 0 };

        gets_e_uart1(buffer, sizeof buffer);
        puts_uart1(buffer);

    }
    return 0;
}

//-------------------------------------------------------------------------
//gets a string and echos it
//returns 0 if there is no error

char getstring_e_uart1(char *buffer_, const int SIZE_)
{
    int start_ = 0, end_ = SIZE_ - 1;
    char errorflag = 0;

    /* ... */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...