Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
1

Изменение значения статической переменной

04.08.2010, 00:12. Просмотров 2361. Ответов 19
Метки нет (Все метки)

не дает =\

C++
1
2
static char text[256];
text = "";
error: expression must be a modifiable lvalue
это же не конст, а просто статик, в pawn"е часто пользовался static и ок всё было
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2010, 00:12
Ответы с готовыми решениями:

Объявление статической переменной и статической функции в классе
Добрый вечер, столкнулся с проблемой и не могу решить. Есть класс...

Изменение значения переменной во время исполнения
Задача: Преобразовать введенный с клавиатуры массив таким образом, чтобы в...

Изменение значения переменной через заданное время
Всем привет!! Кто знает как можно заделать так что бы значения переменной...

Наследование статической переменной
есть класс с статистическим полем я от него "произвожу" два потомка. у всех...

Неожиданное значение в статической переменной
Всем привет! Либо мне надо отдохнуть, либо происходит что-то неведомое... Код...

19
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.08.2010, 00:14 2
Собсна..

C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    static char text[256];
    strcpy(text, "");
    return 0;
}
Или так.
Изменяем первый эл-т массива.
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    static char text[256];
    *text=' ';
    return 0;
}
0
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
04.08.2010, 00:21  [ТС] 3
надо полностью все чары убить в массиве, лучше
C++
1
strcpy(text, "");
или
C++
1
for(int i=0; i<sizeof text; i++){text[i]=0;}
?
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 00:24 4
Owyn, если ты хочешь, чтобы все элементы массива равнялись нулю:
C++
1
memset(text, 0, sizeof(text) / sizeof(text[0]));
1
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.08.2010, 00:25 5
CyBOSSeR, А можно ведь по сути просто char[256]={0}; Или с чаром такое не прокатит? По умолчанию, все элементы становятся нулем вроде как.

Вполне достойно отработало:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
    char x[5]={0};
    for(int i=0;i<5;++i)
        std::cout<<x[i];
    return 0;
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10113 / 6019 / 1510
Регистрация: 25.07.2009
Сообщений: 11,407
04.08.2010, 00:27 6
C++
1
2
3
#include <algorithm>
...
std::fill_n(text, 256, '\0');
2
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
04.08.2010, 00:27  [ТС] 7
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
sizeof(text) / sizeof(text[0])
text[256]:
т.е. 256 делить на один? а что не просто sizeof text
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 00:28 8
Lavroff, при инициализации можно и так. Вообще говоря, глобальные статические переменные инициализируются нулем по умолчанию.
1
easybudda
Модератор
Эксперт CЭксперт С++
10113 / 6019 / 1510
Регистрация: 25.07.2009
Сообщений: 11,407
04.08.2010, 00:29 9
Цитата Сообщение от Lavroff Посмотреть сообщение
Или с чаром такое не прокатит?
Ещё как прокатит. Но неплохо иметь способ обнулять буфер по мере надобности, а не только при инициализации...
1
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 00:31 10
Цитата Сообщение от Owyn Посмотреть сообщение
text[256]:
т.е. 256 делить на один? а что не просто sizeof text
Сегодня ты используешь ANSI строки (один байт на символ), а завтра перейдешь на UNICODE (два байта на символ) и придется тебе все подобные допущения отлавливать. Деление на размер первого элемента не повредит.
1
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
04.08.2010, 00:36  [ТС] 11
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Сегодня ты используешь ANSI строки (один байт на символ), а завтра перейдешь на UNICODE (два байта на символ) и придется тебе все подобные допущения отлавливать. Деление на размер первого элемента не повредит.
ясно,но я пока могу отличить char от wchar_t
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.08.2010, 00:37 12
Owyn, Одно дело отличить и писать заново) Другое дело просто поменять char на wchar)
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.08.2010, 00:39 13
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
memset(text, 0, sizeof(text) / sizeof(text[0]));
по мне так лучше знать размер массива в отдельной переменной.
C
1
memset(text, 0, size * sizeof(char));
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 00:50 14
Хотя нет, я не прав, для функции memset будет беспроблемной конструкция вида:
C++
1
memset(text, 0, sizeof(text));
т.к. ее необходимо знать количество байт, а не символов.
А вообще, я за вариант easybudda, только чуть поправленный для Windows:
C++
1
2
3
4
#include <algorithm>
#include <tchar.h>
 
std::fill_n(text, sizeof(text) / sizeof(text[0]), _T('\0'));
0
easybudda
Модератор
Эксперт CЭксперт С++
10113 / 6019 / 1510
Регистрация: 25.07.2009
Сообщений: 11,407
04.08.2010, 01:47 15
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
только чуть поправленный
Ну я вообще за то, чтобы размеры массивов в отдельной переменной или именованной константе хранить. Так в первую очередь самому нагляднее...
0
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
04.08.2010, 11:37  [ТС] 16
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Хотя нет, я не прав, для функции memset будет беспроблемной конструкция вида:
C++
1
memset(text, 0, sizeof(text));
т.к. ее необходимо знать количество байт, а не символов.
А вообще, я за вариант easybudda, только чуть поправленный для Windows:
C++
1
2
3
4
#include <algorithm>
#include <tchar.h>
 
std::fill_n(text, sizeof(text) / sizeof(text[0]), _T('\0'));
оно настолько лучше мемсета?.. а то доп инклюды включать итд.. +_+
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 12:12 17
Owyn, смотря как посмотреть. С одной стороны memset будет быстрее. С другой строны нам нужно заполнить строку нулевыми символами, которые записываются как '\0' для обычных символов и L'\0' для широких, поэтому с идеологической точки зрения std::fill_n будет предпочтительнее.
0
Owyn
0 / 0 / 0
Регистрация: 28.05.2009
Сообщений: 64
04.08.2010, 12:43  [ТС] 18
разве
'\0' != 0 != 0x00 ?
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.08.2010, 13:44 19
Owyn, просмотрел по этому вопросу стандарт, в стандарте явно не оговорено какой код имеет символ терминатор (может плохо смотрел). А если стандарт молчит, то обычно это означает, что реализация отдана на откуп разработчикам компилятора. Поэтому с полной уверенностью утверждать, что терминатор в представлении целого числа является нулем нельзя. Да и вообще для представления символов постарайся использовать только символьные литералы ('a', '2', 'Z' и т.п.).
0
accept
4833 / 3255 / 455
Регистрация: 10.12.2008
Сообщений: 10,569
05.08.2010, 03:57 20
'\0' - это восьмеричный код символа

C
1
2
3
    putchar('\12')
    putchar('\12')
    putchar('\12')
0
05.08.2010, 03:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2010, 03:57

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

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

Ошибка в объявлении статической переменной
Знакомлюсь со статическими переменными в ООП, первая программа, ошибки в строке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru