Перейти к содержанию
    

Выдать из функции указатель на ее статическую переменную

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

Можно определить глобальную int32_t переменную, в которую преобразовывать строку, и выдавать указатель на нее. Не нравится, что переменная глобальная.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При вызове функции передавайте туда указатель на внешнюю переменную, в которую будете возвращать указатель на переменную внутри функции. Стандартный подход.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если переменная внутри функции не статическая, то после выхода из функции ее не станет, аннигилирует.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да можно конечно, только вот зачем?

использовать нулевой указатель в качестве индикатора ошибки что строка плохая? не надо так делать.

 

int * func(const char * str){

static int num = 0;

if (!str) return 0;

num = atoi(str);

return #

}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если переменная внутри функции не статическая, то после выхода из функции ее не станет, аннигилирует.

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

Либо передавать указатель в функцию, либо передавать результат в возвращаемом значении.

Глобальная переменная, а уж тем более локальная переменная (пусть даже и static) - неоправданно для такого функционала.

Вроде, есть стандартные функции для перевода строки в число. Чем они не устраивают?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да можно конечно, только вот зачем?

использовать нулевой указатель в качестве индикатора ошибки что строка плохая? не надо так делать.

 

int * func(const char * str){

static int num = 0;

if (!str) return 0;

num = atoi(str);

return #

}

Да, именно, для индикации ошибки. А чем плохо? atoi при неправильной строке выдает неопределенное значение. Мне это не подходит. Свое преобразование буду делать.

 

Либо передавать указатель в функцию, либо передавать результат в возвращаемом значении.

Глобальная переменная, а уж тем более локальная переменная (пусть даже и static) - неоправданно для такого функционала.

Вроде, есть стандартные функции для перевода строки в число. Чем они не устраивают?

А что мне выдаст atoi("XPEN_TEBE!") ? :rolleyes: И как я об этом узнаю? Можно bool OK выдать, но все равно ссылку на результат нужно (ну, да, глобальную переменную можно).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что мне выдаст atoi("XPEN_TEBE!") ? :rolleyes: И как я об этом узнаю?

Для этого более продвинутая strtol есть.

 

А вообще, в старые добрые времена, для этого глобальная переменная "errno" была. Чтобы за собой всякие коды ошибок сообщать. Чем такой подход не устроил? сделать my_errno

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Можно определить глобальную int32_t переменную, в которую преобразовывать строку, и выдавать указатель на нее. Не нравится, что переменная глобальная.

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

 

Я бы возвращал число, а не указатель.

А в аргументы бы добавил указатель на идентификатор ошибки.

Если указатель на идентификатор NULL, то ошибку не записывать.

 

Таким образом можно либо вообще игнорировать ошибки (чтобы быстрее писать код) либо делать в определенных случаях детализированный лог ошибок.

Неплохой вариант переменную ошибки сделать глобальной.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Можно определить глобальную int32_t переменную, в которую преобразовывать строку, и выдавать указатель на нее. Не нравится, что переменная глобальная.

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

 

...чем только люди не страдают...

"Число-то" какого типа ?

Что мешает в общем виде сделать так ? предполагаем, что типа нашего числа int32

 

/**

@param pointer to a string to convert to a number

@param pointer to the variable that will be assigned the value on success

@return true if everything is OK

*/

bool MyAtoI(const char* apStr, int32* apRetVal)

{

[.. some dirty magic here..]

}

Изменено пользователем CrimsonPig

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вижу, вариантов много. Но не вижу лучшего. :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вижу, вариантов много. Но не вижу лучшего. :rolleyes:

 

Сделайте как в strtol - результат функции - само число. А указатель - на последний символ, на котором "запнулось" преобразование. По нему все сразу понятно. Если там isspace или ноль (конец строки), значит все ОК. Самая простая проверка - *endptr<=0x20 - под это попадает все сразу, все концы строк, ноль, пробел, табуляция.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вижу, вариантов много. Но не вижу лучшего. :rolleyes:

 

А не соизволит ли многоуважаемый Дон четко определить критерии "лучшести" ?

с моей т.з. все что есть лучше того бреда из первого поста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделайте как в strtol - результат функции - само число. А указатель - на последний символ, на котором "запнулось" преобразование. По нему все сразу понятно. Если там isspace или ноль (конец строки), значит все ОК. Самая простая проверка - *endptr<=0x20 - под это попадает все сразу, все концы строк, ноль, пробел, табуляция.

Функция сложновата, мне столько не нужно. Или в строке десятичное число со знаком или без, или "галимотня".

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Функция сложновата, мне столько не нужно. Или в строке десятичное число со знаком или без, или "галимотня".

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

 

Так тогда strtol вам и нужна в чистом ее виде. Зачем глобальная переменная с ползущим указателем, когда она при использовании strtol становится локальная - strtol ее и возвращает, именно, чтобы распознать галиматью, конец строки, или продолжить со следующим числом, все зайцы убиты одним выстрелом и без глобальных переменных. В strtol передаем указатель на текущее положение в строке, и передаем в качестве указателя на конец указатель на этот же указатель :) :) :) - в результате он один и "ползет по строке".

 

Или, сделайте так:

 

int my_strtol(char **pPtr);

 

То есть сразу передаете в функцию указатель на указатель, который передвигается по строке. По тому, на чем он остановился после вызова функции, распознаете, что там. Это эквивалентно вызову strtol(ptr, *ptr, 10).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так тогда strtol вам и нужна в чистом ее виде. Зачем глобальная переменная с ползущим указателем, когда она при использовании strtol становится локальная - strtol ее и возвращает, именно, чтобы распознать галиматью, конец строки, или продолжить со следующим числом, все зайцы убиты одним выстрелом и без глобальных переменных. В strtol передаем указатель на текущее положение в строке, и передаем в качестве указателя на конец указатель на этот же указатель :) :) :) - в результате он один и "ползет по строке".

 

strtol опасна в плане RTOS, функции этого ряда могут внутри себя лезть в глобальный heap и в глобальные переменные.

Её либо надо ретаргетить, либо не использовать, либо лепить вокруг них критические секции.

 

Но если до красоты, то на мой эстетский взгляд самое красивое все делать в глобальных структурах. Т.е. объединять глобальные переменные в глобальные структуры.

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

Структуры никогда не подведут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...