0 / 0 / 0
Регистрация: 08.04.2015
Сообщений: 36
|
||||||
1 | ||||||
Объяснить назначение ключевого слова static27.12.2015, 13:28. Показов 1979. Ответов 40
Метки нет (Все метки)
Здравствуйте! Я пытаюсь разобраться с использованием static`a и у меня такой вопрос: будет ли корректно работать программа конвертирования числа в строку , если объявить массив char как static ?
0
|
27.12.2015, 13:28 | |
Ответы с готовыми решениями:
40
Нюансы синтаксиса: объяснить использование ключевого слова typedef в заданном фрагменте кода Назначение static ? Объяснить назначение макроса Объяснить назначение элемента кода |
27.12.2015, 13:43 | 2 | |||||
static будет означать, что содержимое буфера сохраняется между вызовами. Если он будет заполняться каждый раз с начала и завершаться нуль-терминатором, это ничему не помешает (и ничему не поможет).
Если возвращать указателем адрес нулевого байта этого буфера - могут быть косяки, например
1
|
0 / 0 / 0
Регистрация: 08.04.2015
Сообщений: 36
|
||||||
27.12.2015, 18:26 [ТС] | 3 | |||||
То есть, если я потом захочу использовать функцию ещё раз и там будет меньше знаков, чем размер буфера, то получу ерунду на выходе? если возвращать как
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
27.12.2015, 18:30 | 4 |
зачем оно вам? вопрос из ряда про квадратные колёса велосипеду...
0
|
0 / 0 / 0
Регистрация: 08.04.2015
Сообщений: 36
|
|
27.12.2015, 22:02 [ТС] | 5 |
Мне и не нужно, есть программа, где массив char объявлён как static, пытаюсь понять, законно это или нет
0
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
27.12.2015, 22:14 | 6 |
если утрировать, тогда:
вот есть глобальные переменные. время их жизни - до конца программы. локальные статические - считай те же самые глобальные, только область их видимости ограниченно функцией-хозяином. то есть, снаружи функции они не видны. но видны изнутри функции. а поскольку время их жизни до конца программы, то такие переменные сохраняют своё значение между вызовами функции-хозяина. воспринимайте локальный статик просто как переменную, которая не умирает по завершению работы функции
1
|
0 / 0 / 0
Регистрация: 08.04.2015
Сообщений: 36
|
|
27.12.2015, 23:43 [ТС] | 8 |
Спасибо ! То есть, если я два раза подряд вызову эту функцию, то она будет работать нормально?
0
|
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
|
|
27.12.2015, 23:49 | 9 |
Если она написана нормально то и работать будет нормально. Первая ссылка поиска http://ic.asf.ru/~/docs/cpp/cppd_qualifier.htm
0
|
28.12.2015, 08:11 | 10 |
Работать будет нормально, результат может быть не нормальный (см. пост #2). Если массив используется вообще для каких-то своих внутренних целей, то беспокоится не о чем до тех пор, пока ты вызываешь эту ф-цию из 2х разных потоков.
1
|
0 / 0 / 0
Регистрация: 08.04.2015
Сообщений: 36
|
|
28.12.2015, 12:58 [ТС] | 11 |
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
28.12.2015, 13:05 | 12 |
Даже если перед обращением(рабоет с) к данной переменной использовать mutex или critial zone(или как там). Если я понял проблему описанную вами, то она появится везде где потоки используют одно адрессное пространство для чтения/записи.
0
|
28.12.2015, 13:12 | 13 | |||||
Ну если внутренний буфер используется для каких-то внутренних целей, то синхронизация поможет. Например
1
|
rikimaru2013
|
28.12.2015, 13:14
#14
|
0
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|
28.12.2015, 14:15 | 15 |
Законно в том смысле, что до сих пор используется в темном наследии Си. Например, ctime грешит подобным. Причем, альтернативы ctime использующей заданный пользователем буфер (ctime(&time,user_buf);) нет и не предвидится. Видимо, библиотеки Си как мумии - не обновляются.
Другое дело, что подражать этим мумиям не есть гуд, ибо могут обнаружиться неожиданные грабли.
0
|
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
|
|
28.12.2015, 14:21 | 16 |
0
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|
28.12.2015, 14:30 | 17 |
Есть - ctime потокобезопасность (thread-safety) не дает, ибо два параллельных вызова стукнутся лбами ломанувшись в один общий static буффер. Во времена однопоточных мумий это было не слишком актуально, но времена то немного изменились.
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
28.12.2015, 14:31 | 18 |
Renji, а разве с появлением потоков не вышли классы работы с временем в стандр библиотеках?
0
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|
28.12.2015, 14:36 | 19 |
Эти классы переводят время в текст через все тот же ctime. Альтернативы ctime в std::chrono почему-то так и не внесли.
0
|
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
28.12.2015, 14:40 | 20 |
темное наследние си - это морально устаревшие глобальные переменные,
с сопутствующим extern которое привело к возниконвению статических членов классов - костыльное прошлое с++. локальные статики - это настоящее и будущие с++. локальный статик - черезвычайно постребованная на практике конструкция. собственно, это единственный способ построить безопасные сингелтоны, которые в автоматическом режиме, практически без участия человека, самостоятельно разрулят собственное время жизни, и проблемы возможных созависимостей, поимев иммунитет против static order initialization fiasco,
0
|
28.12.2015, 14:40 | |
28.12.2015, 14:40 | |
Помогаю со студенческими работами здесь
20
Объяснить назначение функций getchar и putchar Объяснить назначение и работу статического метода Объяснить назначение и нюансы работы функции strtok() Объяснить назначение функции length(), принимающей в качестве аргумента std::vector Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |