![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 28.12.2011
Сообщений: 124
|
![]()
Не знаю насколько я правильно делаю.
Но идея такова: есть массив с двумя (в последствии может с тремя) элементами, хочу возвратить эти значения по средствам функции. Объявление функции: Код:
Код:
Код:
"Думай не о задаче, а о решении" (с)
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]()
1. Судя по представленному коду, значения статического массива не "порой не обновляются" потому что не изменяются значения массивов x и y, которые скармливаются статическому массиву.
2. Синтаксически корректно, правомерно. 3. Идеологически - серьёзный признак ущербной архитектуры. 4. Практически - мина замедленного действия, пороховая бочка, либо - выстрел в ногу. Судя по тому, что у вас "что то там порой работает не так, как ожидается", выстрел в ногу уже произведен. |
![]() |
![]() |
![]() |
#3 | |
Форумчанин
Регистрация: 28.12.2011
Сообщений: 124
|
![]() Цитата:
"Я ещё не волшебник, я только учусь" (с) И как следствие всё криворуко и кособоко. Подскажите, что можно использовать вместо этого, чтобы идеологию улучшить, да и ногу себе не отстрелить.
"Думай не о задаче, а о решении" (с)
|
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]()
Здесь нужно понимать две вещи:
1. Принцип работы со статическими данными. А конкретно - время их жизни, и где они вообще на самом деле живут. Статические переменные живут в статической области памяти. Эта область памяти, которая выделяется приложению при загрузке, и которая инициализируется согласно указивкам, прописанным в запускаемом файле приложения. Особенность статических переменных заключается в том, что время их жизни - до конца жизни всего приложения. Если объявить статическую переменную внутри обычной функции, то область видимости переменной будет - внутри этой функции. А время жизни - до конца приложения. Если объявить статическую переменную внутри метода класса, то область видимости переменной будет - внутри этого метода. А время жизни - до конца приложения. Есть распространенная ошибка новичков, которые полагают, что для каждого объекта класса будет создан его персональный метод, содержащий его уникальную статическую переменную. На самом деле, статическая переменная внутри метода будет создана только один раз, и будет "общей" для любого вызвавшего метод объекта класса. Пример: Первый объект толкает метод getPos(), изменяет значения статического массива, и получает на него указатель. Потом второй объект тоже толкает метод getPos(), и таким образом, содержимое статического массива изменяется. Потом из первого объекта по указателю извлекаются данные. Но это вовсе не те данные, которые установил этот первый. Это данные, которые установил Второй. Второй объект воздействовал на тот же самый массив. Итого: Первый объект выдаёт совсем не те данные, которые он устанавливал. Вы уверены, что это именно то, что вам было нужно? 2. Здравый смысл, целесообразность конструкции. Статические переменные, объявленные внутри метода - общие для всех объектов класса. В этом случае, теряется смысл самих статических переменных, объявленных внутри методов. Такая практика только запутывает. Если вам действительно нужны общие для всех объектов данные-члены, объявите их статическими в самом классе, а не в отдельных его методах. Эффект будет примерно тот же, но путаницы на порядок меньше. Если же вам изначально не нужны были общие данные для всех экземпляров класса, а их состояния должны быть уникальными, то использовать статические переменные вообще не нужно. Нужно строить совсем другое строение класса. Идеологически корректно (просто для понимания, и логично с точки зрения здравого смысла) следующее положение: Все общее для всех экземпляров класса - статическое Все уникальные для каждого объекта данные - мемберы Попытка запихать в метод-мембер "общую для всех сущность" противоречит здравому смыслу. Есть лишь очень и очень мало ситуаций, где такой подход действительно может быть оправданным. И совсем не существует ситуаций, где это действительно необходимо, и где этого нельзя было бы избежать. Резюмируя: статические переменные внутри методов класса не нужны. Они запутывают, и несут в себе потенциальную опасность. Последний раз редактировалось _Bers; 01.03.2012 в 00:13. |
![]() |
![]() |
![]() |
#5 | ||
Форумчанин
Регистрация: 28.12.2011
Сообщений: 124
|
![]() Цитата:
Цитата:
Впрочем такой метод используется в моей программе только раз, и я его не очень понимаю - поэтому и обратилась с вопросом корректен ли он. До этого я не применяла статические переменные. В основном класс такой: Параметр static используется только потому, что нужно хранить указатель на массив. Если убрать этот параметр - данные будут пропадать сразу и такой метод с возвращением указателя на массив использовать будет нельзя в моём случае. Сделаю без указателей и массивов. ![]() Спасибо за подробное разъяснение.
"Думай не о задаче, а о решении" (с)
|
||
![]() |
![]() |
![]() |
#6 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]() Цитата:
Подозрение - данные в массивах x и y остаются без изменений. Поэтому, в a значения и не меняются (в него попадают одни и те же значения). Но что бы знать точно - нужно видеть код. |
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 28.12.2011
Сообщений: 124
|
![]()
Ну код там страшный и запутанный на самом деле. x и y меняются, но не всегда. Скорее всего я намудрила в этих условиях, впрочем в приложении 3 нужных файла.
Оговоренный метод используется в процедуре Move()
"Думай не о задаче, а о решении" (с)
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
![]()
Похоже, что вы пишете в си билдере. У меня нет этой ИДЕ, посему я просто внешне глянул код. Смотрите:
Вот это строки из метода move() Код:
Теперь смотрим, что за массив такой, и кто там живет: Код:
Смотрим, сколько там живет зверей: Код:
Теперь возвращаемся на исходную: Код:
Смотрим, где выше по тексту он может изменится: Он у вас может менятся, как выше по тексту: Код:
Код:
Код:
Этот метод я вызываю только для одного объекта данного класса и сразу записываю полученные данные. Как минимум требует точной проверки. Теоретически, в вашем коде возможна ситуация, что метод getPos() толкают разные объекты класса. Нужно понатыкать брейк-поинтов, и в режиме отладки смотреть, какие именно объекты толкают этот метод, и на какие значения изменяют общий для всех статический массив. Если вы не умеете выполнять пошаговую отладку - тогда попробуйте вести лог: Вам понадобится какой нибудь виджет, в который можно выводить сообщение. Что-то типа вот такого: Код:
/зы: не увидел в коде самого класса статического массива. А так же какой бы то ни было в нем необходимости. Последний раз редактировалось _Bers; 01.03.2012 в 02:20. |
![]() |
![]() |
![]() |
#9 | |
Форумчанин
Регистрация: 28.12.2011
Сообщений: 124
|
![]() Цитата:
Но все проверки у меня как раз и есть, я же вывожу: Код:
"Думай не о задаче, а о решении" (с)
|
|
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Функция возвращает неправильный указатель | RomanA | Общие вопросы C/C++ | 3 | 25.02.2012 19:06 |
Функция возвращает массив | Рик | Общие вопросы Delphi | 5 | 22.03.2011 09:07 |
Функция Pos возвращает 0 | gufon | Общие вопросы Delphi | 16 | 14.03.2011 22:10 |
Функция которая возвращает динамический массив | gagarin0 | Помощь студентам | 5 | 19.01.2011 13:48 |
функция не возвращает нужный мне массив | LOST94 | Общие вопросы C/C++ | 0 | 01.07.2010 15:33 |