Пятница, 15 Ноября 2024, 17:50

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

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

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
ad141Дата: Суббота, 15 Декабря 2012, 16:12 | Сообщение # 761
почетный гость
Сейчас нет на сайте
Да это всё у меня есть!

Добавлено (15.12.2012, 16:12)
---------------------------------------------
Мне нужно вращение куба как в игре EDGE

Дано:

Code
namespace Keys
{
       bool Up, Left, Down, Right;
}



Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
sem6666Дата: Воскресенье, 16 Декабря 2012, 02:50 | Сообщение # 762
участник
Сейчас нет на сайте
Вроде переделал:
Code

#include "stdafx.h"
#include <stdio.h>  

  #define N 4  

  int main()  
  {  
   int m[N][N];  
   for (int i=0; i<N; ++i)  
    for (int j=0; j<N; ++j)  
     m[i][j] = i+j;  
     
   printf("K:");  
   for (int i=0; i<N; ++i)    
   {  
    for (int j=0; j<N; ++j)  
    {  
     while( m[i][j] - m[j][i] )  
     {  
      j=N;  
      break;  
     }  
     while(j == N-1)  
     {  
      printf("%d\n",i );  
      break;  
     }  
    }  
   }  
     
   printf("Average:");  
   for (int i=0; i<N; ++i)    
   {  
    while(i%2)  
    {  
     int ave = 0;  
     for (int j=0; j<N; ++j)  
     {  
      ave += m[i][j];  
     }  
     printf("%d\n",i,  ": ", (float)ave/(float)N);  
     break;  
    }  
   }  
   return 0;  
  }

Но смущает правильность работы. Где тут ошибка?
ad141Дата: Воскресенье, 16 Декабря 2012, 14:49 | Сообщение # 763
почетный гость
Сейчас нет на сайте
sem6666, ты вместо "if" пишешь "while" ?!


Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
LevriteДата: Воскресенье, 16 Декабря 2012, 16:51 | Сообщение # 764
участник
Сейчас нет на сайте
ad141, потому что в задании сказано что условный о-р нельзя использовать.

ApatiДата: Воскресенье, 16 Декабря 2012, 18:11 | Сообщение # 765
заслуженный участник
Сейчас нет на сайте
Quote (sem6666)
printf("%d\n",i,  ": ", (float)ave/(float)N);  

Правильнее так: printf("%d: %f\n",i, (float)ave/(float)N);
sem6666Дата: Воскресенье, 16 Декабря 2012, 19:14 | Сообщение # 766
участник
Сейчас нет на сайте
Apati, спасибо за поправку:)
Надеюсь правильно работает.
MR_BorgДата: Воскресенье, 23 Декабря 2012, 17:55 | Сообщение # 767
участник
Сейчас нет на сайте
Подскажите пожалуйста, правильно ли я сделал?
Есть вектор

for(int i=0;i<eff.size();i++)
{
if(eff.at(i)->kill==false)
{
eff.at(i)->Update();
}else
{
eff.erase(eff.begin()+i);
};
};
В самом эфекте при уничтожении в функции Update
if(time<0)
{
kill=true;
delete this;
};
effect::~effect()
{
delete sprite;
};


Изучаю C++ попутно пишу игру.
TikaraДата: Среда, 26 Декабря 2012, 10:08 | Сообщение # 768
частый гость
Сейчас нет на сайте
Цитата (Saitei)
здравствуйте! Я использую для ввода значений переменным cin. Часто так бывает, что пользователь вводит некорректные данные с точки зрения компьютера. Например в int a кто-то пытается запихнуть "пвып" или "2,2". Скажите пожалуйста, как "ограничить" и "наладить" всё это дело? Не думаю, что всё очень сложно, но для меня это будет очень полезно. Заранее спасибо - жду с нетерпением!


Если хочешь использовать потоки cin cout, то строку с консоли считывай не прямиком, а сначало в массив символов, а там уже проверяй.

Например

Код

std::string str;
int num;

std::cin >> str;

if(!isValidNumber(str))
       std::cout << "Это не число!\n";
else
       num = atoi(str.c_str());


Сообщение отредактировал Tikara - Среда, 26 Декабря 2012, 10:12
Animan2010Дата: Среда, 26 Декабря 2012, 10:50 | Сообщение # 769
постоянный участник
Сейчас нет на сайте
В C++, как я понимаю, include подключает конкретный файл кода Y к файлу кода X.
Можно ли сделать так, чтобы подключить файлы кода Y и Z к файлу X, но чтобы не только файл X, но и Y мог видеть содержимое файла Z? Такое возможно в движке BlitzMax, когда подключаешь целую тучу файлов к одному, то все эти файлы могут видеть содержимое друг друга, а не только тот файл, к которому они подключены.

PS: знаю, что задавал подобный вопрос, но пока у меня логика кода весьма корявая, и так было бы удобнее. Может есть специальные ide, которые позволяют это делать? Хотя бы чтобы был огромный файл исходного кода, который визуально в ide был бы разбит на тучу более мелких.


Anima Games
Animan Publishing


Сообщение отредактировал Animan2010 - Среда, 26 Декабря 2012, 10:53
TikaraДата: Среда, 26 Декабря 2012, 10:58 | Сообщение # 770
частый гость
Сейчас нет на сайте
Цитата (Animan2010)
В C++, как я понимаю, include подключает конкретный файл кода Y к файлу кода X.
Можно ли сделать так, чтобы подключить файлы кода Y и Z к файлу X, но чтобы не только файл X, но и Y мог видеть содержимое файла Z? Такое возможно в движке BlitzMax, когда подключаешь целую тучу файлов к одному, то все эти файлы могут видеть содержимое друг друга, а не только тот файл, к которому они подключены.


Очевидно, что здесь можно сделать так:

Z->Y

Z && Y->X

Проблем не будет.

Но конечно же всё зависит от реализации - тут ничего не поделаешь.
Animan2010Дата: Среда, 26 Декабря 2012, 11:48 | Сообщение # 771
постоянный участник
Сейчас нет на сайте
Tikara, в таком случае, вроде бы, Z не сможет видеть содержимое Y. Хотелось бы, чтобы каждый файл мог видеть содержимое любого другого файла.
Разве что объединить весь исходный код в один огромный файл остается х)

Кстати, а может возможно дать среде разработки команду во время компиляции объединить все файлы исходного кода в один?


Anima Games
Animan Publishing


Сообщение отредактировал Animan2010 - Среда, 26 Декабря 2012, 11:51
TikaraДата: Среда, 26 Декабря 2012, 12:05 | Сообщение # 772
частый гость
Сейчас нет на сайте
Y.h
Код

void funcY();
...


Z.h
Код

void funcZ();
...


X.cpp
Код

#include "Z.h"
#include "Y.h"

int main{
       funcZ();
       funcY();
       return 0;
}


Y.cpp
Код

#include "Y.h"
#include "Z.h"

void main2(){
      funcZ();
}


Z.cpp
Код

#include "Y.h"
#include "Z.h"

void main3(){
      funcY();
}


Написал ради спортивного интереса, так сказать.

Цитата (Animan2010)
Разве что объединить весь исходный код в один огромный файл остается х)


А так да. Можно вынести часть header'ов в отдельный h. Но на практике к самим хедерам нужно подключать какие-то реализации (обьектов/методов пр.), что может вылиться в бесконечный цикл включений.

Всё-таки, я бы вам настоятельно порекомендовал изменить логику, чтобы избегать подобного.

Добавлено (26.12.2012, 12:05)
---------------------------------------------
Цитата (Animan2010)
Кстати, а может возможно дать среде разработки команду во время компиляции объединить все файлы исходного кода в один?


Точно не знаю, но думаю, что такого нет. Как раз-таки #include этим и занимается.

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


Сообщение отредактировал Tikara - Среда, 26 Декабря 2012, 12:11
Animan2010Дата: Суббота, 29 Декабря 2012, 16:04 | Сообщение # 773
постоянный участник
Сейчас нет на сайте
Проблемка возникла =(
Инициализирую массив:
void set_map(int map_id)
{
if (map_id == MAP_FOREST)
{
map[6][6] = {'#','#','#','#','#','#',
'#','.','.','.','.','#',
'#','.','.','.','.','#',
'#','.','.','.','.','#',
'#','.','.','.','.','#',
'#','#','#','#','#','#'};
}
}

При компиляции выдает ошибку:

\Documents\C++ projects\Roguelike\main.cpp||In function 'void set_map(int)':|
\Documents\C++ projects\Roguelike\main.cpp|62|warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x|
\Documents\C++ projects\Roguelike\main.cpp|62|error: cannot convert '<brace-enclosed initializer list>' to 'char' in assignment|
||=== Build finished: 1 errors, 1 warnings ===|

Использую Code::Blocks

Где-то нагуглил, что посоветовали использовать вместо {} круглые скобки (), компилируется и запускается, но при выводе на экране консоли появляются лишь сплошные квадраты.

В чем проблема? В настройках code::blocks ставил вместо GNU GCC компилятор VS2008, тоже не помогло.


Anima Games
Animan Publishing
zodiakДата: Суббота, 29 Декабря 2012, 16:22 | Сообщение # 774
постоянный участник
Сейчас нет на сайте
Animan2010,
{{'#','#','#','#','#','#'},
{'#','.','.','.','.','#'},
{'#','.','.','.','.','#'},
{'#','.','.','.','.','#'},
{'#','.','.','.','.','#'},
{'#','#','#','#','#','#'}}


Точка зору окремо взятого індивіда завжди суб'єктивна!

Взломщик
Battle City.Net
Animan2010Дата: Суббота, 29 Декабря 2012, 16:44 | Сообщение # 775
постоянный участник
Сейчас нет на сайте
zodiak, нет, та же ошибка =(
Может быть, из-за того, что массив расположен в области глобальных переменных, инициализировать в функции его нельзя?

Да, инициализировал его при объявлении, всё норм. Но можно ли в функции присвоить ему значение таким же образом, как при инициализации?

Добавлено (29.12.2012, 16:44)
---------------------------------------------
В общем, я чуток переменил код. Создал указатель char, который будет ссылаться на массив карты.
Только меня кое-что удивило:
С детства меня готовили к тому, что имя массива также является адресом первого элемента. Но если массив двумерный, то нельзя прописать char* ptr = mas, но можно char* ptr = &mas[0][0]. Почему так?


Anima Games
Animan Publishing


Сообщение отредактировал Animan2010 - Суббота, 29 Декабря 2012, 16:44
TikaraДата: Суббота, 29 Декабря 2012, 18:32 | Сообщение # 776
частый гость
Сейчас нет на сайте
Цитата (Animan2010)
С детства меня готовили к тому, что имя массива также является адресом первого элемента. Но если массив двумерный, то нельзя прописать char* ptr = mas, но можно char* ptr = &mas[0][0]. Почему так?


Здесь важно понять, что двумерный массив – это одномерный массив из одномерных массивов. Из этого следует, что указатель mas[i] указывает на i-тый массив.
Поэтому запись "char* ptr = mas" невозможна, так компилятор не знает какой адрес собственно нужен. В записе "char* ptr = &mas[0][0]" мы получаем указатель на первый элемент первого массива. Значит мы можем обращаться к ptr как к одномерному массиву ptr[0], ptr[1].. ptr[i], что будет эквивалетно(с точки зрения результата) mas[0][0], mas[0][1].. mas[0][i].

Такая запись верна:

char *ptr = mas[0];

ptr[3]; // = mas[0][3]

Что собственно подтверждает выше сказанное.

Надеюсь, обьяснил понятно. cool
Animan2010Дата: Воскресенье, 30 Декабря 2012, 12:12 | Сообщение # 777
постоянный участник
Сейчас нет на сайте
Да, благодарю, Tikara =)

Добавлено (30.12.2012, 12:12)
---------------------------------------------
Наконец-то я нашел решение своей проблемы ^^

main.cpp:
#include <iostream>

#include "class1.h"
#include "class2.h"

using namespace std;

int main()
{
class1 cl1;
class2 cl2;
cl1.cl.a = 1;
cl2.a = 2;
cout << cl1.cl.a;
cout << "\n" << cl2.a;
return 0;
}

Class1.h:
#include "class2.h"
#ifndef _CLASS1_
#define _CLASS1_
class class1
{
public:
class2 cl;
};
#endif

class2.h:
#ifndef _CLASS2_
#define _CLASS2_
class class2
{
public:
int a;
};
#endif

Теперь и main.cpp, и class1.h могут видеть содержимое class2.h и работать с ним


Anima Games
Animan Publishing
SaiteiДата: Вторник, 01 Января 2013, 17:29 | Сообщение # 778
старожил
Сейчас нет на сайте
Здавствуйте! Скажите пожалуйста, а как можно засечь время в C++? Сделать что-то вроде таймера. Хочу посмотреть за сколько секунд (или миллисекунд) функция выполняется
TikaraДата: Среда, 02 Января 2013, 05:58 | Сообщение # 779
частый гость
Сейчас нет на сайте
Цитата (Saitei)
Здавствуйте! Скажите пожалуйста, а как можно засечь время в C++? Сделать что-то вроде таймера. Хочу посмотреть за сколько секунд (или миллисекунд) функция выполняется


Можно так чисто Сишными средствами:

Код
#include <time.h>
int main(){
clock_t time;
   
time = clock();
/* вызов функции */
time = clock() - time;
return 0;
}


А можно использовать WINAPI:

Код
#include <mmsystem.h>

#pragma comment (lib, "winmm.lib")

int main(){
DWORD time = timeGetTime();
/* вызов функции */
time =  timeGetTime() - time;
return 0;
}
goldsphereДата: Среда, 02 Января 2013, 13:16 | Сообщение # 780
заслуженный участник
Сейчас нет на сайте
Код
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,i++)
     a[i][j]=0;
  }
  int &operator[](int i)
  {
   if(i<0 || i>size-1){
    exit(1);
   }
   return a[i];
  }
};


я пытался написать класс для двумерного массива, но не доконца понял как. Когда я пытался объявить экземпляр такого класса, вот такие ошибки выдаёт:

Принцип в том, что после размер будет браться из файла
Так как мне правильно сделать?


FinderX - Android Аркада
Поиск:

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