Пятница, 27 Декабря 2024, 22:15

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-Ответ (C++)
KornivalДата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1
The Witcher
Сейчас нет на сайте
Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
ganstermДата: Понедельник, 27 Апреля 2015, 13:39 | Сообщение # 1421
частый гость
Сейчас нет на сайте
Добрый день товарищи. Есть вектор в кротом храню объекты, так же есть указатель
Код

objects* obj;//берет некоторый объект из вектора, далее делаем некоторые манипуляции с ним
if(!obj==NULL)
  {
   SetPos(obj->x,obj->y);
  }

Но проблема в том, что данный объект может удалиться в любой момент, но условие все равно срабатывает и в функцию передаются неверные данные. Как можно это исправить?
ArchidoДата: Понедельник, 27 Апреля 2015, 17:19 | Сообщение # 1422
Сэнсэй
Сейчас нет на сайте
Стоит почитать про smart pointer'ы

C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
SaiteiДата: Понедельник, 27 Апреля 2015, 19:44 | Сообщение # 1423
старожил
Сейчас нет на сайте
Цитата gansterm ()
Но проблема в том, что данный объект может удалиться в любой момент, но условие все равно срабатывает и в функцию передаются неверные данные. Как можно это исправить?

Цитата Archido ()
Стоит почитать про smart pointer'ы

+1. Или же можно извратиться:
Код
...
if(objects[i].Update() == false)
{
objects[i].Delete();
//здесь уже можно удалять objects[i], например
}
...
ganstermДата: Понедельник, 27 Апреля 2015, 20:08 | Сообщение # 1424
частый гость
Сейчас нет на сайте
Спасибо, но это немного не то. Как можно проверить что в указателе отсутствуют данные?
При объявлении
vector<object*> vec;
object *obj=0;

obj=vec.at(i);
if(!obj==0)
{
/////
}
Если из вектора удалить данный объект, то в указателе будет мусор типа 0xfeefee, вот можно ли его как то обнаружить?
SaiteiДата: Понедельник, 27 Апреля 2015, 20:24 | Сообщение # 1425
старожил
Сейчас нет на сайте
Цитата gansterm ()
Как можно проверить что в указателе отсутствуют данные?

Никак. Читай про smart pointer'ы
ganstermДата: Понедельник, 27 Апреля 2015, 21:15 | Сообщение # 1426
частый гость
Сейчас нет на сайте
Хм, интересно получается. Добавил флаг kill на проверку перед удалением из вектора, а в памяти он весит. Так что обычной проверкой на флаг вроде как справился.
ArchidoДата: Вторник, 28 Апреля 2015, 10:19 | Сообщение # 1427
Сэнсэй
Сейчас нет на сайте
Цитата gansterm ()
Как можно проверить что в указателе отсутствуют данные?

В указателе нет данных, в нем содержится только адрес области памяти, в которой уже и располагаются эти самые данные.
Штука в том, что когда удаляется какой-то объект, память, которую он ранее занимал, не удаляется в прямом смысле слова - она просто перестает принадлежать этому объекту и всем указателям, которые на этот объект\память указывали. Поэтому вот это:
Цитата
Добавил флаг kill на проверку перед удалением из вектора, а в памяти он весит. Так что обычной проверкой на флаг вроде как справился.
в корне не правильно.
В этой памяти может располагаться уже совсем другой объект, чем это плохо и чем это грозит нужно объяснять? Однажды там будет краш.

В чем проблема про умные указатели почитать? Они специально придуманы для управления временем жизни объекта, для вот таких вот ситуаций. Могу еще один вариант, конечно, посоветовать: можно хранить указатель на вектор в классе объекта, а позже в деструкторе удалять себя из этого вектора.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Вторник, 28 Апреля 2015, 10:20
ganstermДата: Вторник, 28 Апреля 2015, 12:21 | Сообщение # 1428
частый гость
Сейчас нет на сайте
Да, я уже заметил ошибку, но как быть то auto_ptr копирует из вектора причем обнуляя его значение в нём.
Нашел пример

Но как адаптировать под свою задачу пока не очень понял.
ArchidoДата: Вторник, 28 Апреля 2015, 17:57 | Сообщение # 1429
Сэнсэй
Сейчас нет на сайте
Цитата gansterm ()
но как быть то auto_ptr копирует из вектора причем обнуляя его значение в нём.

Это только один из видов таких указателей, auto_ptr использует технику разрушающего копирования, поэтому объектом может владеть только один указатель. Тебе нужен shared и скорее всего weak для хранения. Вообще советую нормально ознакомиться с этой темой, что, как и в каких случаях используется... простым копированием примеров тут едва ли можно обойтись.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Среда, 29 Апреля 2015, 05:50
SaiteiДата: Вторник, 05 Мая 2015, 22:00 | Сообщение # 1430
старожил
Сейчас нет на сайте
Код
auto some = [](auto... i)
{
};

Ковыряюсь в С++14. Как работать с "auto... i"? Как понимаю, в функцию я могу передавать сколько угодно аргументов разных типов.
Как их всех вывести на экран, например?
harmoxyneДата: Вторник, 05 Мая 2015, 22:18 | Сообщение # 1431
заслуженный участник
Сейчас нет на сайте
Saitei, учитывая, что там получается parameter pack, думаю, стоит почитать это, вопрос должен разъясниться.
PoidetLiДата: Суббота, 06 Июня 2015, 18:55 | Сообщение # 1432
участник
Сейчас нет на сайте
Кто работал с LuaBridge, помогите, у меня допустим есть код, в LUA
Код
test = {5,3,2,1}

как занести 5,3,2,1 в массив.
Код
int test[4]


в еюдуго прсхлуренц
http://gcup.ru/forum/9-44187-1 мой Project 96
GudleifrДата: Суббота, 06 Июня 2015, 19:33 | Сообщение # 1433
почти ветеран
Сейчас нет на сайте
<ошибка>

Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Суббота, 06 Июня 2015, 19:33
PoidetLiДата: Суббота, 06 Июня 2015, 19:37 | Сообщение # 1434
участник
Сейчас нет на сайте
Цитата PoidetLi ()
Кто работал с LuaBridge, помогите, у меня допустим есть код, в LUA
Код
test = {5,3,2,1}

как занести 5,3,2,1 в массив.
Код
int test[4]

решил свою проблему, не знал что LuaRef сами по себе массивы


в еюдуго прсхлуренц
http://gcup.ru/forum/9-44187-1 мой Project 96
innovationДата: Воскресенье, 14 Июня 2015, 18:01 | Сообщение # 1435
участник
Сейчас нет на сайте
Ребят, срочно нужна помощь. Как преобразовать вещественное число с фиксированной точкой в число с плавающей точкой, сохранив две цифры после точки в мантиссе.

Какой самый живучий паразит? Бактерия? Вирус? Кишечный глист? Идея. Она живучая и крайне заразная; стоит идее завладеть мозгом, избавиться от нее практически невозможно. Я имею виду сформировавшуюся идею, полностью осознанную, поселившуюся в голове.
GudleifrДата: Воскресенье, 14 Июня 2015, 20:45 | Сообщение # 1436
почти ветеран
Сейчас нет на сайте
innovation, речь идет о каких-то супер-пупер классах чисел-объектов, или, просто, о необходимости красиво их напечатать? В последем случае смотрите свойства printf, тип e.

Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
innovationДата: Понедельник, 15 Июня 2015, 17:44 | Сообщение # 1437
участник
Сейчас нет на сайте
Gudleifr, А можно все такие увидеть пример данного алгоритма ?

Какой самый живучий паразит? Бактерия? Вирус? Кишечный глист? Идея. Она живучая и крайне заразная; стоит идее завладеть мозгом, избавиться от нее практически невозможно. Я имею виду сформировавшуюся идею, полностью осознанную, поселившуюся в голове.
GudleifrДата: Понедельник, 15 Июня 2015, 17:54 | Сообщение # 1438
почти ветеран
Сейчас нет на сайте
innovation, алгоритма чего? Что, конкретно, Вы хотите? Какого типа входная величина, какого - выходная? Если типы стандартные, у них есть имена - float, double, char*, string... Если нестандартные - требуется описать в виде record, unit, struct или class...

Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Понедельник, 15 Июня 2015, 17:59
JhonДата: Понедельник, 15 Июня 2015, 19:52 | Сообщение # 1439
частый гость
Сейчас нет на сайте
innovation, в C++ нет родной поддержки чисел с фиксированной точкой, поэтому для ответа на вопрос нужно либо больше информации (как число представлено в памяти), либо нужен экстрасенс.
Быстрый гуглинг дал вот это: http://habrahabr.ru/sandbox/44727/ (я не читал, но вроде есть что-то про переводы)


Сообщение отредактировал Jhon - Понедельник, 15 Июня 2015, 19:54
innovationДата: Понедельник, 15 Июня 2015, 21:03 | Сообщение # 1440
участник
Сейчас нет на сайте
Вообщем, набросал код, но выскакивает ошибка "Нарушение прав доступа при чтении"

Может кто сможет помочь

Код
#include <iostream>
#include <string.h>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

char *format(char *x);

char *format(char *x)
{
         int e;
         char z[64], s[64];
   
         if(x[0] == '-') {
                 x = x + 1;
                 z[0] = '-';
         }
   
         while(x[0] = '0')
                 x = x + 1;
   
         while(x[e] != '.')
                 e++;
   
         if(e == 0)
         {
                 while(x[1] == '0')
                 {
                         e--;
                         memmove (x+1, x+2, strlen (x+2));
                 }
         }
         memmove(x + 1 + e, x + 2 + e, strlen(x + 2 + e));
         e--;
         memmove(x + 2, x + 3, strlen(x + 2));
         x[1] = '.';
         x[6] = 0;
         while(strlen(x) < 4)
                 strcat(x, "0");
   
         itoa(e, s, 64);
         char *result = new char[64];
         memset(result, 0, 64);
         memcpy(result, z, strlen(z));
         strcat(result, x);
         strcat(result, "E");
         strcat(result, s);
         return result;
}
void main()
{

  cout << format("12024.120000");

  int t;
  cin >> t;
}


Какой самый живучий паразит? Бактерия? Вирус? Кишечный глист? Идея. Она живучая и крайне заразная; стоит идее завладеть мозгом, избавиться от нее практически невозможно. Я имею виду сформировавшуюся идею, полностью осознанную, поселившуюся в голове.
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг