Суббота, 16 Ноября 2024, 02:40

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

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

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
НохчиДата: Воскресенье, 22 Июля 2012, 13:42 | Сообщение # 581
заслуженный участник
Сейчас нет на сайте
Quote (goldsphere)
Как узнать сколько регистровых переменных поддерживает процессор?

Нет такого понятия вообще. Все зависит от контекста, то есть сколько регистров в данный момент уже используются для чего-то другого. Но обычно можно расчитывать на 2-3 свободных регистра максимум.

Добавлено (22.07.2012, 13:42)
---------------------------------------------
Это я говорю о x86, как там с другими архитектурами не знаю.


Многие вопросы по Windows отпадут, если посмотреть тут

Сообщение отредактировал Нохчи - Воскресенье, 22 Июля 2012, 13:43
ArchidoДата: Воскресенье, 22 Июля 2012, 13:55 | Сообщение # 582
Сэнсэй
Сейчас нет на сайте
Quote (MrAkakuy)
Можно так или нет? Я думаю что нет, но если можно, скажите пожалуйста как. Очень надо.

Нельзя. Нужно делать по-другому - есть некий класс и его экземпляр(объект), как правило один. У него есть массив, в котором хранятся указатели на базовый класс GameCanvas. При создании дочерних классов, они добавляются в этот самый массив, после чего можно "проходить" по нему и дергать нужные методы каждого.

Quote (goldsphere)
Как узнать сколько регистровых переменных поддерживает процессор?

Просто любопытно, а нафига тебе нужны эти "регистровые переменные" ? smile


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

Сообщение отредактировал Archido - Воскресенье, 22 Июля 2012, 13:57
MrAkakuyДата: Воскресенье, 22 Июля 2012, 14:03 | Сообщение # 583
участник
Сейчас нет на сайте
Archido, нихераничего не понял.
Quote (Archido)
некий класс

Game в моем примере?
Quote (Archido)
указатели на базовый класс

Не понял что вы имеете ввиду этой фразой.

Quote (Archido)
дергать нужные методы каждого

И каким образом это делать?





Сообщение отредактировал MrAkakuy - Воскресенье, 22 Июля 2012, 14:08
ArchidoДата: Воскресенье, 22 Июля 2012, 14:09 | Сообщение # 584
Сэнсэй
Сейчас нет на сайте
MrAkakuy
Мм, ты опиши более точно, что ты пытаешься сделать, чтобя я зря не о том не писал.
К дочерим классам прямо обращаться нельзя, т.к. базовый класс о них ничего не знает. Чтобы вызывать методы дочерних нужно хранить их где-нить в массиве (у какого - нить класса - менеджера, который уже и будет обращаться к каждому и дергать нужные методы).


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
MrAkakuyДата: Воскресенье, 22 Июля 2012, 14:13 | Сообщение # 585
участник
Сейчас нет на сайте
Archido, спасибо, уже не надо. Без этого обошелся.


GavolotДата: Понедельник, 23 Июля 2012, 01:23 | Сообщение # 586
Последователь Тени
Сейчас нет на сайте
Люди вопрос а зачем нужны вообще таймеры? Для задержки чего либо? А почему бы просто не использовать Sleep, просто как бы в потоках эта фигня работает точно так как если бы я сделал свой задерживающий таймер (проверено), как можно вообще использовать таймер, чтобы это отличалось от Sleep. Просто Sleep заставляет задерживаться не всю программу, а только поток в котором эта штука определена.

В общем что-то делаю, но пока не пойму ни как :)
Тень - выражение основной сущности человека.
НохчиДата: Понедельник, 23 Июля 2012, 01:35 | Сообщение # 587
заслуженный участник
Сейчас нет на сайте
А кто сказал, что таймер должен задерживать весь поток?

Многие вопросы по Windows отпадут, если посмотреть тут
GavolotДата: Понедельник, 23 Июля 2012, 01:55 | Сообщение # 588
Последователь Тени
Сейчас нет на сайте
Quote
А кто сказал, что таймер должен задерживать весь поток?

Та что-то я после таймеров ас3 и алармов game maker ни как не могу начать мыслить по С++'ному =)) Не могу я просто вобрать как эти таймеры в С++ использовать, если каждый поток это как бы программа, которая просто сверху вниз идет) Т.е. мне надо просто запустить функцию таймера, а как это потом проверять к примеру, что таймер исполнился, ну проверил к примеру и вызвал какое-то действие, оно исполнилось. Т.е. мне таймер тоже как отдельный поток запускать?

Походу короче надо скорее в вин-апи лезть или куда-то в этом духе, потому-что я привык мыслить событиями)


В общем что-то делаю, но пока не пойму ни как :)
Тень - выражение основной сущности человека.
НохчиДата: Понедельник, 23 Июля 2012, 01:59 | Сообщение # 589
заслуженный участник
Сейчас нет на сайте
Ты говоришь о таймерах которые ставятся функцией SetTimer ?

Многие вопросы по Windows отпадут, если посмотреть тут
GavolotДата: Понедельник, 23 Июля 2012, 02:07 | Сообщение # 590
Последователь Тени
Сейчас нет на сайте
Нохчи, да я пока кроме GetTickCount(); из windows.h нечего еще не пробовал вообще.

Добавлено (23.07.2012, 02:03)
---------------------------------------------
Да она и работает как-то странно. Погуглил и нашел какой-то тоже стремноватый вариант впихать какой-то промежуточный цикл между переменными start и end.

Добавлено (23.07.2012, 02:07)
---------------------------------------------
И только после того как прошел промежуточный цикл, вызывая какую-то функцию, уже потом идет вычисление end-start.


В общем что-то делаю, но пока не пойму ни как :)
Тень - выражение основной сущности человека.


Сообщение отредактировал Gavolot - Понедельник, 23 Июля 2012, 02:06
НохчиДата: Понедельник, 23 Июля 2012, 02:07 | Сообщение # 591
заслуженный участник
Сейчас нет на сайте
Допустим у тебя есть две анимации, которые должны обновляться с разной частотой.
Code

timer1 = timeGetTime();
timer2 = timeGetTime();

while(true)
{
         if( timeGetTime()-timer1 > 10)
         {
             timer1 = timeGetTime();
             anim1.update();
          }

         if( timeGetTime()-timer2 > 25)
         {
             timer2 = timeGetTime();
             anim2.update();
          }

}

Очевидно Sleep в данном случае не прокатил бы.


Многие вопросы по Windows отпадут, если посмотреть тут

Сообщение отредактировал Нохчи - Понедельник, 23 Июля 2012, 02:09
GavolotДата: Понедельник, 23 Июля 2012, 19:53 | Сообщение # 592
Последователь Тени
Сейчас нет на сайте
Нохчи, тфу-ты все я понял))

Добавлено (23.07.2012, 19:53)
---------------------------------------------
Вопрос про потоки, самое простое введение я в принципе понял, теперь и копипастить нечего не нужно, на низком уровне все уже нагуглено, ну что для потока открытого с помощью _beginthread нужно чтобы в функции был указатель на void и т.п. тонкости я уже понял и какие параметры у этой команды. Но вот мне интересно, а чтобы сделать к примеру RTS, ну я так гипотетически спрашиваю, нужно получается для каждого юнита потоки делать?


В общем что-то делаю, но пока не пойму ни как :)
Тень - выражение основной сущности человека.
НохчиДата: Понедельник, 23 Июля 2012, 23:18 | Сообщение # 593
заслуженный участник
Сейчас нет на сайте
Нет.

Многие вопросы по Windows отпадут, если посмотреть тут
GavolotДата: Вторник, 24 Июля 2012, 01:04 | Сообщение # 594
Последователь Тени
Сейчас нет на сайте
Так-с, ща вот собераюсь решить в консоли задачу о 8 ферзях, я в принципе уже все в голове продумал. И что примерно делать знаю, но хотелось бы придуманные мною тут функции сделать более универсальными, так вот функция должна принимать как параметр двумерный массив:

Code

//Функция заполнения символьного массива
void fillArr(char (*arr)[8] ,int y,int x, char element)
{
     //Заполняем массив
         for(int i = 0; i<y;i++)
   {
       for(int j = 0; j<x; j++)
       {
         arr[i][j] = element;
       }
   }
}


Но вот эта char (*arr)[8] меня как-то не устраивает, я хотел бы чтобы функция могла принимать любой указатель на двумерный массив, а не строго только указатель на 8 массивов и как это сделать? Я что только не перепробовал, все выдает ошибку, пока я там не втулю ту цифру которую ему надо.

Добавлено (24.07.2012, 01:04)
---------------------------------------------
Просто я еще начинающий хотелось бы понять точно)


В общем что-то делаю, но пока не пойму ни как :)
Тень - выражение основной сущности человека.
RUNGOGET2THECHOPAHДата: Вторник, 24 Июля 2012, 01:53 | Сообщение # 595
участник
Сейчас нет на сайте
Gavolot,
создаешь двумерный массив размера n на m:
Code
char** arr = new char* [n];
for (int i=0; i<n; i++)
arr[i] = new char[m];

И передаешь везде указатель на него - char** arr.

И еще по поводу оператора new: память, выделенная при его использовании, не освобождается при выходе соответствующей переменной из поля видимости, так что как только этот массив тебе становится не нужным, неплохо бы освободить память следующим образом:
Code

for (int i=0; i<n; i++)
delete[] arr[i];
delete[] arr;    

И вообще, почитай про new/delete на rsdn'е например, не помешает.


Сообщение отредактировал RUNGOGET2THECHOPAH - Вторник, 24 Июля 2012, 02:06
GavolotДата: Вторник, 24 Июля 2012, 02:11 | Сообщение # 596
Последователь Тени
Сейчас нет на сайте
Ну вот допустим сделал так:

Code

:::::

char** pArr = new char* [8];

    fillArr(pArr, bY, bX, floor);

::::::

//Функция заполнения символьного массива
void fillArr(char** arr,int y,int x, char element)
{
      //Заполняем массив
          for(int i = 0; i<y;i++)
    {
        for(int j = 0; j<x; j++)
        {
          arr[i][j] = element;
        }
    }
}


Оно компилируется, но почему-то ошибку выдает, не пойму почему, вроде же тогда все правильно.

Добавлено (24.07.2012, 02:06)
---------------------------------------------
ааа стоп =)))

Добавлено (24.07.2012, 02:06)
---------------------------------------------
Я же вроде забыл адрес массива присвоить, капец я))

Добавлено (24.07.2012, 02:08)
---------------------------------------------
Хотя нет, это же я создал новый массив.

Добавлено (24.07.2012, 02:11)
---------------------------------------------
RUNGOGET2THECHOPAH, та я уже читал, просто двумерный массив не делал еще, так пролистал и забыл блин)) Я кажется понял, я же там еще не выделил память для одномерных массивов, прости не просканировал твое сообщение)


В общем что-то делаю, но пока не пойму ни как :)
Тень - выражение основной сущности человека.


Сообщение отредактировал Gavolot - Вторник, 24 Июля 2012, 02:05
RUNGOGET2THECHOPAHДата: Вторник, 24 Июля 2012, 02:13 | Сообщение # 597
участник
Сейчас нет на сайте
Gavolot, ты создал массив указателей, но ни один из этих указателей никуда не указывает. А потом в функции обращаешься в это "никуда", поэтому и ошибка. Посмотри внимательнее мой код - в том цикле после первого new вся соль, а ты его почему-то пропустил.
GavolotДата: Вторник, 24 Июля 2012, 02:18 | Сообщение # 598
Последователь Тени
Сейчас нет на сайте
RUNGOGET2THECHOPAH, да-да я уже разобрался, я даже вспомнил эту тему в книге)))) Я ее благополучно понял и пропустил без практики)

Добавлено (24.07.2012, 02:18)
---------------------------------------------
Я просто вспомнил как там говорилось, что сначала объявляется указатель на два измерения, а потом он заполняется одномерными указателями))


В общем что-то делаю, но пока не пойму ни как :)
Тень - выражение основной сущности человека.
ctpzДата: Среда, 25 Июля 2012, 09:44 | Сообщение # 599
участник
Сейчас нет на сайте
Quote (Нохчи)
timeGetTime()

Из какой это библиотеки?
НохчиДата: Среда, 25 Июля 2012, 09:56 | Сообщение # 600
заслуженный участник
Сейчас нет на сайте
winmm

Многие вопросы по Windows отпадут, если посмотреть тут
Поиск:

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