Вопрос-Ответ (C++)
|
|
Kornival | Дата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1 |
The Witcher
Сейчас нет на сайте
| Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.
Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
|
|
| |
Tikara | Дата: Среда, 02 Января 2013, 14:25 | Сообщение # 781 |
частый гость
Сейчас нет на сайте
| goldsphere,
Ну во-первых
Код template <int sizeX, int sizeY> class Map { int a[sizeX][sizeY];
public: Map() { register int i, j; for(i=0;i<sizeX;i++) for(j=0;j<sizeY;j++) a[i][j]=0; } int *operator[](int i) // возвращаем указатель, т.к. ссылка и указатель это разные вещи (указатель нам позволит обращаться к массиву, на который указывает массив "i") { if(i<0 || i>size-1){ exit(1); // если выходим за пределы массива вываливаемся из программы? А отлаживать-то потом как? =) } return a[i]; } };
Во-вторых, вы неправильно обьявляете ваш "массив". Очевидно, нужно так:
Код Map< 5 , 8 > map;
map[2][5] = 7;
Сообщение отредактировал Tikara - Среда, 02 Января 2013, 14:26 |
|
| |
AlexeyBond | Дата: Среда, 02 Января 2013, 14:39 | Сообщение # 782 |
был не раз
Сейчас нет на сайте
| Цитата (goldsphere) Принцип в том, что после размер будет браться из файла
В таком случае, использовать шаблон - неправильное решение т.к. аргументы передаваемые в шаблон можно определить только на этапе компиляции ( из исходного кода ), а изменить их во время исполнения невозможно. В данном случае рекомендую использовать динамическое выделение памяти с помощью оператора new или функций malloc/calloc и имитацию двухмерного массива с использованием одномерного.
|
|
| |
Saitei | Дата: Среда, 02 Января 2013, 15:31 | Сообщение # 783 |
старожил
Сейчас нет на сайте
| Цитата (Tikara) #include <time.h> int main(){ clock_t time; time = clock(); /* вызов функции */ time = clock() - time; return 0; } Спасибо большое. Есть немного мелких вопросов (пожалуйста, ответьте, если я вам ещё не сильно надоел)) ): time = clock(); - это мы "заводим" таймер? time = clock() - time; - а это мы его останавливаем? Я правильно понимаю?
|
|
| |
Tikara | Дата: Среда, 02 Января 2013, 16:04 | Сообщение # 784 |
частый гость
Сейчас нет на сайте
| Цитата (Saitei) time = clock(); - это мы "заводим" таймер? time = clock() - time; - а это мы его останавливаем? Я правильно понимаю?
С практической точки зрения, можно и так сказать
time = clock(); // получаем время прошедшее с момента старта программы (то есть теперь мы знаем, когда начал выполняться наш блок кода) time = clock() - time; // теперь определяем разницу между временем в данный момент и временем, с которого начал выполняться блок кода
|
|
| |
goldsphere | Дата: Четверг, 03 Января 2013, 08:55 | Сообщение # 785 |
заслуженный участник
Сейчас нет на сайте
| AlexeyBond, массив должен быть глобальным.
FinderX - Android Аркада
|
|
| |
AlexeyBond | Дата: Четверг, 03 Января 2013, 18:03 | Сообщение # 786 |
был не раз
Сейчас нет на сайте
| Цитата (goldsphere) массив должен быть глобальным.
А в чём, собственно, проблема? Можно же создать глобальный объект для массива, а память выделять только тогда, когда становится известно, сколько её нужно ( при загрузке данных из файла в данном случае ). Например это можно сделать так: Код class Map { private: int* Data; int sizeX, sizeY; public: Map( ) :Data(NULL),sizeX(0),sizeY(0) {}; ~Map( ) { if( Data ) delete [] Data;//Если память была выделена, освобождаем её. } void Alloc( int x, int y ) {//Выделить память под массив размером x на y Data = new int[(sizeX = x)*(sizeY = y)]; } int& operator () ( int y, int x ) {//Получение ссылки на элемент a[y][x] if( (x >= sizeX)||(y>=sizeY) ) throw;//выход за пределы массива return Data[x+sizeX*y]; } };
//Объявляем глобальный объект Map map; . . . //Перед записью в массив: map.Alloc( newSzX, newSzY );
//И доступ к элементу: map( i, j ) = n;
|
|
| |
goldsphere | Дата: Четверг, 03 Января 2013, 18:15 | Сообщение # 787 |
заслуженный участник
Сейчас нет на сайте
| код Смысл данного кода, при нажатие на клавишу отобразить на пол секунды другую текстуру и вернуть потом прежнюю. Проблема в том, что он мне не отрисовывает новую текстуру. Однако при нажатие(в моём случае на пробел) он в функцию заходит, и даже switch работает. Возможно это особенность класса hgeSprite..
FinderX - Android Аркада
|
|
| |
Нохчи | Дата: Четверг, 03 Января 2013, 18:31 | Сообщение # 788 |
заслуженный участник
Сейчас нет на сайте
| Что за position?
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
AlexeyBond | Дата: Четверг, 03 Января 2013, 19:15 | Сообщение # 789 |
был не раз
Сейчас нет на сайте
| Цитата (goldsphere) Смысл данного кода, при нажатие на клавишу отобразить на пол секунды другую текстуру и вернуть потом прежнюю.
Похоже, проблема в том, что всё это происходит в течение одного кадра, т.е. один спрайт просто накладывается на другой, и только потом это всё выводится.
|
|
| |
goldsphere | Дата: Пятница, 04 Января 2013, 07:05 | Сообщение # 790 |
заслуженный участник
Сейчас нет на сайте
| Цитата (Нохчи) Что за position? char position; При передвижении допустим вверх(W) она принимает значение 'U', и в уже этой функции определяется спрайт, нарисованный в какую сторону, должен отобразиться. Цитата (AlexeyBond) Похоже, проблема в том, что всё это происходит в течение одного кадра, т.е. один спрайт просто накладывается на другой, и только потом это всё выводится. Сомневаюсь, просто до этого была практически идентичная функция, только без обратно смены спрайта, то есть нажал, спрайт отобразился и остался, пока не произойдёт действие которое вновь его сменит, допустим движение. Выглядело это так. Функция SetTexture: Код void Sprite::SetTexture(FPath filename) { hge->Texture_Free(texture); texture = hge->Texture_Load(filename); sprite->SetTexture(texture); }
FinderX - Android Аркада
Сообщение отредактировал goldsphere - Пятница, 04 Января 2013, 07:09 |
|
| |
AlexeyBond | Дата: Пятница, 04 Января 2013, 09:59 | Сообщение # 791 |
был не раз
Сейчас нет на сайте
| goldsphere, правильно. Старая функция просто меняла спрайт и выводила его, а новая меняет его, выводит, ждёт, потом снова меняет и выводит, а между сменами спрайтов вывода графики не происходит. И ещё: пожалуй, задам наводящий вопрос: где вызывается Gfx_EndScene( ) и что она делает?
|
|
| |
Saitei | Дата: Пятница, 04 Января 2013, 23:50 | Сообщение # 792 |
старожил
Сейчас нет на сайте
| ругается на строку: Код if(map[0][0] & map[0][2] & map[0][4] = 'x') { finished = true; } почему? как быть? Делаю крестики-нолики
|
|
| |
Нохчи | Дата: Пятница, 04 Января 2013, 23:55 | Сообщение # 793 |
заслуженный участник
Сейчас нет на сайте
| Saitei, не уверен, что понял суть условия, но мб должно быть так: Код if(map[0][0]=='x' && map[0][2]=='x' && map[0][4] == 'x')
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
Saitei | Дата: Пятница, 04 Января 2013, 23:59 | Сообщение # 794 |
старожил
Сейчас нет на сайте
| Код #include <iostream> #include <conio.h> #include <Windows.h> using namespace std;
char map[6][6] ={"1|2|3", "-+-+-", "4|5|6", "-+-+-", "7|8|9"}; int input; bool finished = false;
int main() { while(!finished) { system("cls"); for(int i = 0; i < 6; i++) { for(int j = 0; j < 6; j++) { cout<<map[i][j]; } cout<<'\n'; } input = getch(); if(input=='1') { if(map[0][0]!='O') { map[0][0] = 'X'; input=0; } } if(input=='2') { if(map[0][2]!='O') { map[0][2] = 'X'; input=0; } } if(input=='3') { if(map[0][4]!='O') { map[0][4] = 'X'; input=0; } } if(map[0][0]=='x' && map[0][2]=='x' && map[0][4] == 'x') { finished = true; } } cout<<"YOU WIN!!!"; getch(); return 0; } сделал так, но из цикла программа не вышла => условие работает некорректно
|
|
| |
Нохчи | Дата: Суббота, 05 Января 2013, 00:06 | Сообщение # 795 |
заслуженный участник
Сейчас нет на сайте
| Saitei, 'x' и 'X' - это разные символы, регистр имеет значение.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
Saitei | Дата: Суббота, 05 Января 2013, 00:18 | Сообщение # 796 |
старожил
Сейчас нет на сайте
| Нохчи, извините, совсем не заметил. Спасибо большое за помощь
|
|
| |
Edison6 | Дата: Суббота, 05 Января 2013, 00:39 | Сообщение # 797 |
TRUE Programmer
Сейчас нет на сайте
| Вот вопросик по кросс-платформенной разработки, допустим написал я консольную программку в Code::Blocks на С++ она скомпилировалась и все хорошо, а как мне теперь сделать чтобы она работала на других системах типа Linux? Насколько я понимаю то нужно скомпилировать эту программу в Linux чтобы она работала там и в Windows чтобы она работала под виндой.Если так то это получается необходимо ставить вторую ОС или виртуальную машину на которой компилить? И вопрос сразу второй мне для моей первой сетевой игры где будут бегать два спрайта необходима кроссплатформенная библотека для работы с сетью какие есть предложения? если boost::asio То пожалуйста представьте пример обычной проги посылающей Hello world!
Берил сбрей усы
|
|
| |
Saitei | Дата: Суббота, 05 Января 2013, 00:47 | Сообщение # 798 |
старожил
Сейчас нет на сайте
| Цитата (Edison6) И вопрос сразу второй мне для моей первой сетевой игры где будут бегать два спрайта необходима кроссплатформенная библотека для работы с сетью какие есть предложения? Мне вот тоже интересно. Какую-нибудь легенькую и с целой кучей русских уроков... на WinSock мало что находил (в основном книги).
|
|
| |
Edison6 | Дата: Суббота, 05 Января 2013, 00:57 | Сообщение # 799 |
TRUE Programmer
Сейчас нет на сайте
| Цитата Какую-нибудь легенькую и с целой кучей русских уроков... Из всего найденного думаю пока в сторону boost::asio ЗЫ .Первый вопрос актуален.
Берил сбрей усы
|
|
| |
Нохчи | Дата: Суббота, 05 Января 2013, 01:12 | Сообщение # 800 |
заслуженный участник
Сейчас нет на сайте
| Цитата (Edison6) необходимо ставить вторую ОС или виртуальную машину на которой компилить? Да. По boost::asio есть очень много документации и уроков. Гуглите.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |