Вопрос-Ответ (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
Z.h
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]
Что собственно подтверждает выше сказанное.
Надеюсь, обьяснил понятно.
|
|
| |
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 Аркада
|
|
| |
|