ViKo 1 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба В функции преобразую строку в число, и хочу выдать указатель на это число, если оно получилось из строки, и NULL, если в строке галимотня. Можно определить глобальную int32_t переменную, в которую преобразовывать строку, и выдавать указатель на нее. Не нравится, что переменная глобальная. Могу ли создать статическую переменную внутри функции, и выдавать указатель на нее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mc_off 0 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба При вызове функции передавайте туда указатель на внешнюю переменную, в которую будете возвращать указатель на переменную внутри функции. Стандартный подход. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба Если переменная внутри функции не статическая, то после выхода из функции ее не станет, аннигилирует. Мне незачем передавать указатель в функцию, если я знаю, указатель на что хочу выдать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба да можно конечно, только вот зачем? использовать нулевой указатель в качестве индикатора ошибки что строка плохая? не надо так делать. int * func(const char * str){ static int num = 0; if (!str) return 0; num = atoi(str); return # } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба Если переменная внутри функции не статическая, то после выхода из функции ее не станет, аннигилирует. Мне незачем передавать указатель в функцию, если я знаю, указатель на что хочу выдать. Либо передавать указатель в функцию, либо передавать результат в возвращаемом значении. Глобальная переменная, а уж тем более локальная переменная (пусть даже и static) - неоправданно для такого функционала. Вроде, есть стандартные функции для перевода строки в число. Чем они не устраивают? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба да можно конечно, только вот зачем? использовать нулевой указатель в качестве индикатора ошибки что строка плохая? не надо так делать. 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 выдать, но все равно ссылку на результат нужно (ну, да, глобальную переменную можно). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба А что мне выдаст atoi("XPEN_TEBE!") ? :rolleyes: И как я об этом узнаю? Для этого более продвинутая strtol есть. А вообще, в старые добрые времена, для этого глобальная переменная "errno" была. Чтобы за собой всякие коды ошибок сообщать. Чем такой подход не устроил? сделать my_errno Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба В функции преобразую строку в число, и хочу выдать указатель на это число, если оно получилось из строки, и NULL, если в строке галимотня. Можно определить глобальную int32_t переменную, в которую преобразовывать строку, и выдавать указатель на нее. Не нравится, что переменная глобальная. Могу ли создать статическую переменную внутри функции, и выдавать указатель на нее? Я бы возвращал число, а не указатель. А в аргументы бы добавил указатель на идентификатор ошибки. Если указатель на идентификатор NULL, то ошибку не записывать. Таким образом можно либо вообще игнорировать ошибки (чтобы быстрее писать код) либо делать в определенных случаях детализированный лог ошибок. Неплохой вариант переменную ошибки сделать глобальной. Смысл в том чтобы с рабочими переменными поменьше применять указатели, а все что касается отладочных ситуаций и ошибок переводить на указатели как менее критичный код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 5 декабря, 2014 Опубликовано 5 декабря, 2014 (изменено) · Жалоба В функции преобразую строку в число, и хочу выдать указатель на это число, если оно получилось из строки, и 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..] } Изменено 5 декабря, 2014 пользователем CrimsonPig Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба Вижу, вариантов много. Но не вижу лучшего. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба Вижу, вариантов много. Но не вижу лучшего. :rolleyes: Сделайте как в strtol - результат функции - само число. А указатель - на последний символ, на котором "запнулось" преобразование. По нему все сразу понятно. Если там isspace или ноль (конец строки), значит все ОК. Самая простая проверка - *endptr<=0x20 - под это попадает все сразу, все концы строк, ноль, пробел, табуляция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба Вижу, вариантов много. Но не вижу лучшего. :rolleyes: А не соизволит ли многоуважаемый Дон четко определить критерии "лучшести" ? с моей т.з. все что есть лучше того бреда из первого поста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба Сделайте как в strtol - результат функции - само число. А указатель - на последний символ, на котором "запнулось" преобразование. По нему все сразу понятно. Если там isspace или ноль (конец строки), значит все ОК. Самая простая проверка - *endptr<=0x20 - под это попадает все сразу, все концы строк, ноль, пробел, табуляция. Функция сложновата, мне столько не нужно. Или в строке десятичное число со знаком или без, или "галимотня". Указатель, ползущий по строке - сохраняется в глобальной переменной, для других парсерных функций. На этом числе еще не конец. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба Функция сложновата, мне столько не нужно. Или в строке десятичное число со знаком или без, или "галимотня". Указатель, ползущий по строке - сохраняется в глобальной переменной, для других парсерных функций. На этом числе еще не конец. Так тогда strtol вам и нужна в чистом ее виде. Зачем глобальная переменная с ползущим указателем, когда она при использовании strtol становится локальная - strtol ее и возвращает, именно, чтобы распознать галиматью, конец строки, или продолжить со следующим числом, все зайцы убиты одним выстрелом и без глобальных переменных. В strtol передаем указатель на текущее положение в строке, и передаем в качестве указателя на конец указатель на этот же указатель :) :) :) - в результате он один и "ползет по строке". Или, сделайте так: int my_strtol(char **pPtr); То есть сразу передаете в функцию указатель на указатель, который передвигается по строке. По тому, на чем он остановился после вызова функции, распознаете, что там. Это эквивалентно вызову strtol(ptr, *ptr, 10). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 5 декабря, 2014 Опубликовано 5 декабря, 2014 · Жалоба Так тогда strtol вам и нужна в чистом ее виде. Зачем глобальная переменная с ползущим указателем, когда она при использовании strtol становится локальная - strtol ее и возвращает, именно, чтобы распознать галиматью, конец строки, или продолжить со следующим числом, все зайцы убиты одним выстрелом и без глобальных переменных. В strtol передаем указатель на текущее положение в строке, и передаем в качестве указателя на конец указатель на этот же указатель :) :) :) - в результате он один и "ползет по строке". strtol опасна в плане RTOS, функции этого ряда могут внутри себя лезть в глобальный heap и в глобальные переменные. Её либо надо ретаргетить, либо не использовать, либо лепить вокруг них критические секции. Но если до красоты, то на мой эстетский взгляд самое красивое все делать в глобальных структурах. Т.е. объединять глобальные переменные в глобальные структуры. Пока задача одна структура глобальна, как только задач несколько структуру одним движением превращаем в динамически выделяемую и уводим в управляющую структуру задачи. Структуры никогда не подведут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться