forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Работа с массивом указателей (http://forum.boolean.name/showthread.php?t=15700)

ANIK123 23.10.2011 03:32

Работа с массивом указателей
 
Вложений: 2
Приветствую Вас, Булочники)
Эта проблемма наверн элементарно решается... но пока Мне, ламеру за призванием, это еще трудно дается:sorry:
В общем есть массив указателей в котором храняться адреса на обьекты - пули
При выстреле новые пули добавляются в массив - это дает возможность обрабатывать их в главном цикле
По истечении некоторого времени они самоуничтожаются - список сортируется так чтобы данную пулю "замять" т е заменить на следующую а последняя удаляется соответственно
Дело в том что программа наверное постоянно попадает при обработке в главном цикле на "пустое место" в списке - потому и крашится
Это уже чисто логическая задача но как Я уже писал выше - пока Мне такие проблемы решаются не спервого раза
А в этом случае и не с второго и даже не с третьего

Выкладываю два файла:
первый - проект целиком
второй - сам только код (для истинных джедаев (или просто интернет равликовый))
Помогите Пожалуйста и заранее Всем Вам гигантское Спасибо!!!)

.Squid 23.10.2011 03:58

Ответ: Работа с массивом указателей
 
Запусти дебаггер и сразу найдешь причину краша.
Честно хотел помочь, но увидел код, испугался и забился в угол.

ANIK123 23.10.2011 04:23

Ответ: Работа с массивом указателей
 
Насколько Я не понял причина в обращении программы к пустой ячейке списка т е получаю неинициализированный обьект - пустой сосуд об который программа жалко спотыкается

Цитата:

Сообщение от .Squid (Сообщение 206669)
Честно хотел помочь, но увидел код, испугался и забился в угол.

Спасибо! Но чем тебя код напугал? Неужели он настолько ужасен и кривой?:''((
Кстати - очень хотелось бы узнать Ваше Мнение о Моем коде - и заодно направить на Путь Истинный молодого бойца)

ANIK123 23.10.2011 08:22

Вложений: 1
Как глаголится на сия снг: "Пока не запостишь вопрос - ответ не свалит с твоего носа в твою зону видимости" (или тип того)
>O< Решение нашлось! - причем как и упоминалось в порвом посте - оно обидно-элементарное) Значит Моя тропинка к зарплате размером в 999 999 999уе остается для Меня тропинкой к зарплате в 999 999 999уе)
йохохо Я пипец крутой! :В (это для Меня Подвиг - каждая решенная Мною проблема в С++ дает мне больше гормона счастья чем от 100500 выпусков +100500):punk:
Проблема была в наркоманском удалении пули (см функцию killBullet)
Прикрепляю исправленный рабочий вариант хедера
И еще разочек: УУРРЯАААА!!!:compl:

(пишу в отдельном посте потому что просто так)
Оцените Мой код - за что заслуживаю похвалы и за что Меня можно убить - и вообще сам "проект" - т к первый раз делаю - не хочу запороться в самом начале
Мне Очень Важно Ваше Мнение

IGR 23.10.2011 12:56

Ответ: Работа с массивом указателей
 
код в тег кода, а то всем влом качать !!

ffinder 23.10.2011 14:32

Ответ: Работа с массивом указателей
 
аффтар, есть отличные саеты, которые специализируются именно на том, чтобы можно было удобно прочитать код:
например pastebin.com

Reks888 23.10.2011 14:43

Ответ: Работа с массивом указателей
 
Кроме того что убить надо за подпись, любовь к +100500 и смайлам стоило бы разделить все типы хотя бы по разным файлам. Хрен прочитаешь.
PS http://pastebin.com/T2XbZawm
PPS
Сначала
int zsp,xsp,bsp,smosp;
Потом:
float zspf=zsp; zspf=zspf/100; float xspf=xsp; xspf=xspf/100;//хреново что в классе можно держать только целые числа :(

Ох, так это классы во всем виноваты

ANIK123 23.10.2011 20:13

Ответ: Работа с массивом указателей
 
Цитата:

код в тег кода, а то всем влом качать !!
Код вроде великоват - думал удобнее будет скачать
Цитата:

аффтар, есть отличные саеты, которые специализируются именно на том, чтобы можно было удобно прочитать код:
например pastebin.com
спасибо
не знал про такую фишку
Цитата:

Кроме того что убить надо за подпись, любовь к +100500 и смайлам стоило бы разделить все типы хотя бы по разным файлам. Хрен прочитаешь.
1 - а чем подпись не нравится?)
2 - +100500 просто добавил к слову - если уже об этом заговорили - то видел Я его только 2 выпуска - не понравилось (а Мэддисон рулит)
3 - смайлы? О_О а чего тут плохого? Для чего созданы смайлы? Может для помощи в выражении эмоций? Не???
4 - типы по файлам? Для двух базовых и трех производных классов???
5 - Если есть "здравый" способ хранения не целых чисел в качестве переменной-члена или еще чего то милости прошу описать сие чудо

И в общем : не будьте такими злобными >:)

UPD: И вообще - не таких ответов Я ожидал

FireOwl 23.10.2011 20:54

Ответ: Работа с массивом указателей
 
Нормальная подпись. Не хуже моей.
__________________

ANIK123 23.10.2011 23:56

Ответ: Работа с массивом указателей
 
Да не ну Я серьезно
(хотел написать длинное сообщ но...)
:(

Reizel 24.10.2011 01:05

Ответ: Работа с массивом указателей
 
Цитата:

Сообщение от ANIK123 (Сообщение 206724)
1 - а чем подпись не нравится?)
2 - +100500 просто добавил к слову - если уже об этом заговорили - то видел Я его только 2 выпуска - не понравилось (а Мэддисон рулит)
3 - смайлы? О_О а чего тут плохого? Для чего созданы смайлы? Может для помощи в выражении эмоций? Не???
4 - типы по файлам? Для двух базовых и трех производных классов???
5 - Если есть "здравый" способ хранения не целых чисел в качестве переменной-члена или еще чего то милости прошу описать сие чудо

1) Ваще пофиг, не знаю почему прицепился)
2)...
4) В С++ нужно код класса разделять на *.h и *.cpp, в *.h хранятся только прототипы классов и функций, *.cpp объявляет их)
4)
class Lol
{
public:
float fScale;
double dGpsW;
...

Reks888 24.10.2011 01:11

Ответ: Работа с массивом указателей
 
Да, действительно, если что-то шевелится в подписи то мы похожи на труъ имиджборду
Я такой злой потому что целый день про*бался над кодом и не люблю обзорщиков на фоне ковра

ANIK123 24.10.2011 15:05

Ответ: Работа с массивом указателей
 
Цитата:

1) Ваще пофиг, не знаю почему прицепился)
2)...
4) В С++ нужно код класса разделять на *.h и *.cpp, в *.h хранятся только прототипы классов и функций, *.cpp объявляет их)
4)
class Lol
{
public:
float fScale;
double dGpsW;
...
1) Красивая подпись правда?)
4) Спасибо, не знал
5) Кстати Я попробовал - и получилось! Для тебя это идиотизм но мне кто-то был сказал что можно добавлять в членны класса только целочисленные значиния или логические "були"!
Павел - Спасибо за Дельный Ответ!
Цитата:

Я такой злой потому что целый день проебался над кодом и не люблю обзорщиков на фоне ковра
Хрен с ними)

HolyDel 25.10.2011 02:31

Ответ: Работа с массивом указателей
 
итак:
1) жуткая каша - блиц стайл. про разделение на файлы уже говорили, рекомендую попробывать - забористая штука :)
2) индикаторы движения камеры должны лежать внутри камеры.
3) зачем ты хранишь id-шник внутри пули?
4) зачем ты сдвигаешь часть массива после удаленной пули? тебе важен порядок - нет. вот и меняй с последним.
5)
Код:

float speed=sp; speed=speed/100;
        xMoveEntity(model,0,0,speed);

аналогично
Код:

xMoveEntity(model,0,0,sp/100);
компилятор скорее всего сгенерирует один и тот-же код, но все же, чтобы пальцы болели меньше - нужно писать компактнее.

Код:

int cBullet::getId()const{return id;} void cBullet::setId(unsigned int sid){id=sid;}
тут у тебя есть тривиальный геттер и сеттер. почему просто не открыл доступ к id?

ну и еще - класса, безполезнее чем cUnit я в жизни не видывал. почитай про виртуальные функции и абстрактные классы.

в остальном все круто - переменные стараешься инициализировать в инициализаторах класса, константность логически константных функций соблюдаешь, лишнего в открытом доступе нет. видно, что книгу уже читал:) молодец.


настроение хорошее. два наших проекта отправили в Сочи на ТЭФИ 2011 :)

ANIK123 25.10.2011 20:24

Ответ: Работа с массивом указателей
 
Цитата:

итак:
1) жуткая каша - блиц стайл. про разделение на файлы уже говорили, рекомендую попробывать - забористая штука
2) индикаторы движения камеры должны лежать внутри камеры.
3) зачем ты хранишь id-шник внутри пули?
4) зачем ты сдвигаешь часть массива после удаленной пули? тебе важен порядок - нет. вот и меняй с последним.
5)

Код:

float speed=sp; speed=speed/100;
        xMoveEntity(model,0,0,speed);

аналогично

Код:

xMoveEntity(model,0,0,sp/100);
компилятор скорее всего сгенерирует один и тот-же код, но все же, чтобы пальцы болели меньше - нужно писать компактнее.
1) Я что если сделать так: каждый класс в отдельном хедере - так вроде удобнее + для совместной работы то что надо) Ваше Мнение?
2) Ну Да)
3) А как еще узнать положение пули в массиве?
4) Да, это отличное решение, спасибо!)
5) Это было для того чтоб глаза мозолило по-сильнее - чтоб решение скорее нашлось) Как уже говорилось выше - Я не знал о возможности хранения членов любых типов в классе)

А книжку пока-что только до половины дочитал - как идиот сразу рвусь в бой) Мне бы закрепить текущие знания - а потом уже и новые приобретать) Спасибо Большое за дельную критику и советы) И отдельно спасибо за похвалу - теперь прибавилось еще больше энтузиазма и тяги к работе!)
Ого! Удачи Вам!)

FireOwl 26.10.2011 00:42

Ответ: Работа с массивом указателей
 
3) Но ты же их как-то перебираешь (циклом)? Или возникает необходимость проверить случайную пулю отдельно?
Да и кстати, зачем надо знать какая это именно пуля?

Reizel 26.10.2011 00:51

Ответ: Работа с массивом указателей
 
1) Именно так я и объяснял
3) for(int k = 0;k<10;k++)
Переменная k... Она тебе ни о чем не говорит??

ANIK123 26.10.2011 00:53

Ответ: Работа с массивом указателей
 
FireOwl, В самой пули есть маленький метод, который по истечению некоторого времени запускает глобольную функцию уничтожения пули - в нее то и передается идентификатор - с его помощью Мы знаем что где удалять) А как еще можно?
Может и можно использовать "delete this;" но ведь важно не нарушать целесность массива - с его помощью пули обрабатываются в главном цикле
Если есть другой более праведный способ реализовать подобное (почему-то Я уверен что он есть) - то очень прошу тебя поделится ним)

Павел, 3) К сожелению, нет( Может обьяснишь?

FireOwl 26.10.2011 01:01

Ответ: Работа с массивом указателей
 
Понятно.
Я бы вынес этот метод в глобальный перебор пуль, а "внутри" пули оставил только счетчик времени. Ну или вообще удалял пулю после преодоления определенного расстояния между ней и игроком.

HolyDel 26.10.2011 01:06

Ответ: Работа с массивом указателей
 
Цитата:

3) А как еще узнать положение пули в массиве?
а зачем его узнавать? даже если тебе так уж уперся етот id, то почему бы просто не открыть к нему доступ. подумай сам - твои тривиальные сеттеры и геттеры ничуть не лучше открытого доступа. только более многословны. запомни - лучший код, это тот который не написан. если есть возможность не писать - не пиши.

Цитата:

В самой пули есть маленький метод, который по истечению некоторого времени запускает глобольную функцию уничтожения пули - в нее то и передается идентификатор - с его помощью Мы знаем что где удалять) А как еще можно?
ты мешаешь мух с котлетами. (объекты с их менеджером)
есть метод обработки пули (который перемещает пулю, оставляет от нее трейсер, свистит и пердит, просверливает дырку в голове противника, оставляет декаль на стене)
есть метод обработки пуль (который менеджерит пули. скорее всего ето сведется к вызову метода Gear для каждой пули из списка. Однако никто не мешает обработать результат этого метода. Почему бы не возвращать ему 1-цу если пуля есть и 0 - если она уже сдохла(неважно как: просверлив дырку, оставив декаль или свиснув). пуля не должна НИКАК влиять на список.


спасибо. удача нам пригодится :)

Reizel 26.10.2011 01:08

Ответ: Работа с массивом указателей
 
Цитата:

Сообщение от ANIK123 (Сообщение 207017)
FireOwl, В самой пули есть маленький метод, который по истечению некоторого времени запускает глобольную функцию уничтожения пули - в нее то и передается идентификатор - с его помощью Мы знаем что где удалять) А как еще можно?
Может и можно использовать "delete this;" но ведь важно не нарушать целесность массива - с его помощью пули обрабатываются в главном цикле
Если есть другой более праведный способ реализовать подобное (почему-то Я уверен что он есть) - то очень прошу тебя поделится ним)

Павел, 3) К сожелению, нет( Может обьяснишь?

Ок, int Update() - это будет метод, который вернет 1 в случае необходимости удалить пулю, а так же по ходу отрисует ее, и произведет все действия рассчетные. Потом делаем так:
Код:

for(int k = 0;k<MAX_BULLETS;k++)
  if(pbBullets[k])
  if(pbBullets[k]->Update())
  {
      delete pbBullets[k];
      pbBullets[k] = 0;
  }


ANIK123 26.10.2011 01:09

Ответ: Работа с массивом указателей
 
Спасибо Всем за Хорошие Ответы!)
Принял во внимание все Ваши советы и прямие указания - уже аж стыдно стало - потому убегаю в оффлайн - следующая созданная мною тема уже надеюсь будет посвящена самой "игре")
Но тему не закривайте т к чувствую что она еще Мне пригодится)

ANIK123 12.11.2011 15:44

Ответ: Работа с массивом указателей
 
Маленький вопросик:
Код:

class cObject{};
class cDecor : public cObject{};

cDecor* bugaga = new cDecor();
cObject* objects[1];
objects[0] = bugaga;

delete objects[0];

что произойдет? удалится все содержимое bugaga или только то что принадлежит cObject?

.Squid 12.11.2011 16:02

Ответ: Работа с массивом указателей
 
Вопрос как-то топорно поставлен.
Удалится то все, но декструктор будет вызван только ~cObject, а не ~cDecor, как тебе, вероятно, хотелось бы.
ЗЫ. Вообще такие вещи самому проверить можно в течении 1 минуты.

HolyDel 12.11.2011 20:17

Ответ: Работа с массивом указателей
 
виртуальный декструктор

ANIK123 14.11.2011 23:10

Ответ: Работа с массивом указателей
 
Спасибо)

Еще один вопросик:
Сегодня начал делать самопальный интерфейс для редактора
Есть уже пародия на окна и объекты в них (кнопочки)
Мне интересно как сделать возможным нацеплять на объекты действия (например создание нового окна или закрытие) которые выполняются при каком-либо ключевом действии (например нажатие по кнопке окна)
Пробую сейчас ссылки на функции - но мягко говоря получается фигня - даже объяснять не буду - мозги уже взорвались
Суть вопроса: можно ли как-то еще сделать это?
Помогите Пожалуйста Мне собрать Мой Мозг обратно)

UPD:
main->OnClick(DUI*(*fuuuck)(DUI*));
error C2059: синтаксическая ошибка: )

HolyDel, как там ТЭФИ 2011?)

HolyDel 15.11.2011 01:18

Ответ: Работа с массивом указателей
 
Код:

OnClick(DUI*(*fuuuck)(DUI*));
это объявление.

надо так:
Код:

DUI * somemethod(DUI *value)
{
}

main->OnClick(somemethod);


проекты поедут тока 19-го. результаты будут вообще тока в мае известны.

ANIK123 15.11.2011 19:56

Ответ: Работа с массивом указателей
 
HolyDel, Спасибо!
Короче на данный момент решил использовать простые else_if (but->pressed) {but->pressed = false; blablabla;}
Начал Все переписывать заново)
Но вот получилась незадачка:
Код:

typedef unsigned short int usi;
const usi MAX_DGUI_SIZE(1024);

class DGui{
public:
        static cDWindow* CreateDWindow(usi pos_x, usi pos_y);

        static cDBase* DGuiList[MAX_DGUI_SIZE];
        static usi dgui_num;
};

usi DGui::dgui_num = 0;

cDWindow* DGui::CreateDWindow(usi pos_x, usi pos_y){
        cDWindow* win = new cDWindow(pos_x, pos_y);
        dgui_num++; DGuiList[dgui_num] = win;
        return win;
}

ЗЫ: cDBase является базовым для cDWindow
Цитата:

неразрешенный внешний символ ""public: static class cDBase * * DGui::DGuiList" (?DGuiList@DGui@@2PAPAVcDBase@@A)"
Я же ведь просто обращаюсь статической функцией к статическому массиву и переменной одного класса О_О
Фкуссное ожидание)))

HolyDel 15.11.2011 21:06

Ответ: Работа с массивом указателей
 
вообще православные люди делают так:

Код:

class Button
{
public:
        struct Action
        {
                virtual void action() = 0;
        };
private:
        Action *action;
public:
        void onAction(Action *act)
        {
                action = act;
        }

        void Action()
        {
                action->action();
        }
};

struct ToStdCOutAction : Button::Action
{
        virtual void action()
        {
                std::cout<<"нажали на кнопку"<<std::endl;
        }
};

int main()
{
        Button *but = new Button();
        but->onAction(new ToStdCOutAction());
        but->Action();
return 0;
}


ANIK123 15.11.2011 21:23

Ответ: Работа с массивом указателей
 
ммм
а зачем наследовать экшн от кнопки?
и еще: а если надо работать с текущими обьектами - только-что созданными в Мейн? С Вашем вариантом можно только закрывать окна и открывать новые
лучше уже функции пересылать через ссылки или просто скостылять отдельный класс Экшн
или Я не правильно трактовал Ваш совет?

HolyDel 15.11.2011 22:59

Ответ: Работа с массивом указателей
 
по твоей проблеме:
DBase* DGui::DGuiList[MAX_DGUI_SIZE] = {};
напиши в cpp-шнике.

Цитата:

а зачем наследовать экшн от кнопки?
так можно делать более гибкие обратные вызовы.

можно и функции отсылать. но как правило функции нужны какие нибудь данные. удобнее когда эти дополнительные данные хранятся в самом вызове.

вообще есть книга Стива Дьюхерста -Священные знания С++. там неплохо давалась проблема обратных вызовов. советую почитать.

ANIK123 16.11.2011 02:51

Ответ: Работа с массивом указателей
 
Спасибо тебе большущее!
В книжке ничего не было сказано о таком "определении" массива указателей( Если бы не ты то эта проблема наверное так и не решилась бы
И за "Священные знания С++" Спасибо!:compl:
Святой ты человек, HolyDel)
А на счет кнопок Я решил вешать Все действия на сами окна с помощью ссылок на функции (которые будут принимать адрес вызывающего окна) - а кнопки стали лишь Кнопками)
И еще раз спасибо!

ANIK123 01.12.2011 23:42

Ответ: Работа с массивом указателей
 
Два вопросика по теме С++:
1 - Как избавится от надоедливых предупреждений от функций типа strcpy и strcat ? Есть ли аналоги?
2 - В англицком Я ни бум-бум - что за чудо такое - windows symbol package? И какие еще есть полезности для истинного и не очень программиста?

HolyDel 01.12.2011 23:45

Ответ: Работа с массивом указателей
 
MSVS?

strcpy_s
strcat_s

windows symbol package - не слышал, покажи контекст в котором студия их пишет. вообще всякие symbol package это либо для отладки информация, либо для внешнего интерфейса библиотек. насколько я знаю.

ANIK123 02.12.2011 15:10

Ответ: Работа с массивом указателей
 
Спасибо - теперь окошко вывода стало намного чище)
Мож кинуть ссыль где есть польный список таких безопасных функций? На данный момент осталось избавиться еще от stricmp и все)
windows symbol package - где-то увидел статейку в которой в двух строках упоминалось о нем - вроде как это чудо помогает отловить ошибки типа "обращение по неправильному адресу памяти" - указывает на виноватую строку в исходнике
Вот и спрашиваю у знающих английский - что это такое (и Мне расскажут - и себе мож чего полезного найдут)

ANIK123 19.12.2011 12:42

Ответ: Работа с массивом указателей
 
Форумчани - что значит следующая запись?
void ggg(int a = 3 | 5){}
Просто не знаю как в гугле запрос оформить :-D

UPD: еще вопросик)))
Код:

int * hhh = new int[2];
delete hhh[];

компилятор ругается на
Код:

delete hhh[];
но вроде как массивы именно так и удаляются? не?

pozitiffcat 19.12.2011 13:01

Ответ: Работа с массивом указателей
 
delete [] hhh;
int a = 3 | 5 читай про работу с битами


имеется xxxxx и 000NN.

xxxxx & 11100 -> xxx00;

xxx00 | 000NN -> xxxNN;

SBJoker 19.12.2011 13:02

Ответ: Работа с массивом указателей
 
массивы созданные оператором new[], удаляются оператором delete[],
например, delete[] myArray;

void ggg(int a = 3 | 5){}
функция без возвращаемого значения под именем ggg получает параметр типа int, в качестве которого передаётся переменная создаваемая в этом же месте. Под именем a, и значением являющемся результатом выражения (3 | 5);

pozitiffcat 19.12.2011 13:08

Ответ: Работа с массивом указателей
 
Цитата:

Сообщение от ANIK123 (Сообщение 211999)
На данный момент осталось избавиться еще от stricmp и все)

strncmpi или strnicmp ???

pozitiffcat 19.12.2011 13:10

Ответ: Работа с массивом указателей
 
Цитата:

Сообщение от SBJoker (Сообщение 214556)
в качестве которого передаётся переменная создаваемая в этом же месте

в функцию можно передать свое значение, а 3 | 5 это значение по умолчанию, если ниче не передавать.

ANIK123 19.12.2011 13:19

Ответ: Работа с массивом указателей
 
Спасибо за пояснения!)

HolyDel 19.12.2011 17:47

Ответ: Работа с массивом указателей
 
так пишут негодяи.
обычно вместо 3 (чего ТРИ?) или 5 (чего ПЯТЬ?) идут какие то осмысленные флаги. ито они, обычно не перекрывают биты друг друга как в этом случае.
т.е.
0
1<<1
1<<2
1<<3
..
1<<n

степень двойки вобщем чтобы была

pozitiffcat 19.12.2011 19:52

Ответ: Работа с массивом указателей
 
Цитата:

Сообщение от HolyDel (Сообщение 214587)
так пишут негодяи.
обычно вместо 3 (чего ТРИ?) или 5 (чего ПЯТЬ?) идут какие то осмысленные флаги. ито они, обычно не перекрывают биты друг друга как в этом случае.
т.е.
0
1<<1
1<<2
1<<3
..
1<<n

степень двойки вобщем чтобы была

эт точно


Часовой пояс GMT +4, время: 20:40.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot