| 
	
		
		
			| Вопрос-Ответ (C++) |  |  |  | 
| Kornival | Дата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1 |  |   The Witcher Сейчас нет на сайте | Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь. 
 Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
 |  |  |  |  |  | 
| MR_Borg | Дата: Вторник, 22 Июля 2014, 18:20 | Сообщение # 1341 |  |   участник Сейчас нет на сайте | Здарова народ, либо я туплю либо чет не до понял. Возникла проблема с записью и считыванием строки типа char 
 В объекте прописал:
 char *name;
 
 Потом вывожу в файл.
 
 
 Код  fwrite(&(Planet[i]->sys),sizeof(int),1,f);
 fwrite(&(Planet[i]->speed),sizeof(float),1,f);
 fwrite(&(Planet[i]->alt),sizeof(float),1,f);
 fwrite(&(Planet[i]->scale),sizeof(float),1,f);
 fwrite(&(Planet[i]->sprind),sizeof(int),1,f);
 fwrite(&(Planet[i]->name),sizeof(char),1,f);
 fwrite(&(Planet[i]->fraction),sizeof(int),1,f);
 fwrite(&(Planet[i]->typ),sizeof(int),1,f);
 fwrite(&(Planet[i]->dir),sizeof(int),1,f);
 
И так-же потом считываю. Проблема в том что в поле name пишет неверный указатель, может кто знает в чем прикол?
 
 Изучаю C++ попутно пишу игру.
 |  |  |  |  |  | 
| RUNGOGET2THECHOPAH | Дата: Среда, 23 Июля 2014, 02:07 | Сообщение # 1342 |  |   участник Сейчас нет на сайте | Цитата MR_Borg (  ) fwrite(&(Planet[i]->name),sizeof(char),1,f); Во-первых, ты вместо указателя на массив символов передаешь указатель на указатель на массив символов.
 Во-вторых, вместо единицы нужно указывать длину этого массива.
 В итоге, в файл ты записываешь обрубок адреса, а не строку.
 Нужно как-то так:
 fwrite(Planet[i]->name, sizeof(char), strlen(Planet[i]->name) + 1, f);
 |  |  |  |  |  | 
| Pancho99000 | Дата: Среда, 23 Июля 2014, 19:56 | Сообщение # 1343 |  |   был не раз Сейчас нет на сайте | Всем привет, Как я понял функция _getch() возвращает код аски символа из консоли. А есть ли функция, которая возвращает код клавиши?
 
 |  |  |  |  |  | 
| MR_Borg | Дата: Среда, 23 Июля 2014, 20:22 | Сообщение # 1344 |  |   участник Сейчас нет на сайте | Цитата RUNGOGET2THECHOPAH (  ) Во-первых, ты вместо указателя на массив символов передаешь указатель на указатель на массив символов. Во-вторых, вместо единицы нужно указывать длину этого массива.
 В итоге, в файл ты записываешь обрубок адреса, а не строку.
 Нужно как-то так:
 fwrite(Planet[i]->name, sizeof(char), strlen(Planet[i]->name) + 1, f);
 
 Чет я нефига не понял.
 Сделал так.
 
 
 Код  int namelen;
 namelen=strlen(Planet[i]->name)+1;
 fwrite(&namelen,sizeof(int),1,f);
 fwrite((Planet[i]->name),sizeof(char),strlen(Planet[i]->name)+1,f);
 
Далее считываю так же, но выводит ошибку: Run-Time Check Failure #2 - Stack around the variable 'name' was corrupted.
 
 Изучаю C++ попутно пишу игру.
 |  |  |  |  |  | 
| RUNGOGET2THECHOPAH | Дата: Четверг, 24 Июля 2014, 02:44 | Сообщение # 1345 |  |   участник Сейчас нет на сайте | Цитата MR_Borg (  ) Run-Time Check Failure #2 - Stack around the variable 'name' was corrupted. Ты перед чтением память под строку выделяешь?
 |  |  |  |  |  | 
| MR_Borg | Дата: Четверг, 24 Июля 2014, 06:43 | Сообщение # 1346 |  |   участник Сейчас нет на сайте | Цитата RUNGOGET2THECHOPAH (  ) Ты перед чтением память под строку выделяешь?Ага все разобрался.
   
 Изучаю C++ попутно пишу игру.
 |  |  |  |  |  | 
| Alkosha | Дата: Среда, 30 Июля 2014, 16:51 | Сообщение # 1347 |  |   участник Сейчас нет на сайте | Есть класс условного противника myEnemy 
 За счёт которого объявленны разные типы противников
 myEnemy enemyType1[256];
 myEnemy enemyType2[256];
 myEnemy enemyType3[256];
 
 Для каждого типа инициализируется разное кол-во противников.
 Где лучше хранить значение количества ? Создать отдельную структуру ?
 
 И ещё, на следующем уровне будет уже другое количество этих противников. Как обнулить массивы enemyType[...] для повторного использования ?
 |  |  |  |  |  | 
| wcpt | Дата: Среда, 30 Июля 2014, 18:12 | Сообщение # 1348 |  | постоянный участник Сейчас нет на сайте | массив обнулить можно при помощи memset: 
 
 Код int a[3]={10,20,30}; memset(a,0,sizeof a)
 
 
 Сообщение отредактировал wcpt - Среда, 30 Июля 2014, 18:17 |  |  |  |  |  | 
| OpenGOO | Дата: Среда, 30 Июля 2014, 18:39 | Сообщение # 1349 |  |   почти ветеран Сейчас нет на сайте | Alkosha, зачем тебе с++ программисту эти низкоуровневые массивы, если есть vector. 
 Мои проекты:
 - Свободный и открытый клон World Of Goo
 - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
 
 [GameMaker: Studio v1.4.9999]
 |  |  |  |  |  | 
| Alkosha | Дата: Четверг, 31 Июля 2014, 23:58 | Сообщение # 1350 |  |   участник Сейчас нет на сайте | Пробую объявить векторами. 
 
 Код  vector <myEnemy> bird;
 vector <myEnemy> turtle;
 vector <myEnemy>spider;
 Вылет из программы происходит.
 
 Ставлю обратно стандартным массивом - не вылетает.
 |  |  |  |  |  | 
| wcpt | Дата: Пятница, 01 Августа 2014, 09:38 | Сообщение # 1351 |  | постоянный участник Сейчас нет на сайте | что, от одного объявления вылетает?   |  |  |  |  |  | 
| Snake174 | Дата: Пятница, 01 Августа 2014, 11:23 | Сообщение # 1352 |  |   участник Сейчас нет на сайте | Цитата Есть класс условного противника myEnemy За счёт которого объявленны разные типы противников
Тогда уж лучше std::map использовать
 
 Код  enum тип { ... }
 std::map<тип, массив противников>
 
 
 Цитата Вылет из программы происходит.Пример кода бы хоть привёл.
 
 Не следует обманывать инспектора
 Pipmak Assistant
 Love2D Exporter
 Love2D-Helpers
 
  Old Consoles Games 
 
 Сообщение отредактировал Snake174 - Пятница, 01 Августа 2014, 11:24 |  |  |  |  |  | 
| Alkosha | Дата: Суббота, 02 Августа 2014, 23:21 | Сообщение # 1353 |  |   участник Сейчас нет на сайте | Цитата wcpt (  ) что, от одного объявления вылетает? 
 Одно объявление - полёт нормальный. А вот стоит мне только занести данные в какое-либо поле класса (vector <myEnemy> bird; bird[0].x = 100;) -- вылет из программы.
 
 
 Цитата Snake174 (  ) Пример кода бы хоть привёл. Боюсь засмеёте.
   
 
 Сообщение отредактировал Alkosha - Суббота, 02 Августа 2014, 23:22 |  |  |  |  |  | 
| RUNGOGET2THECHOPAH | Дата: Воскресенье, 03 Августа 2014, 00:06 | Сообщение # 1354 |  |   участник Сейчас нет на сайте | Цитата Alkosha (  ) vector <myEnemy> bird; bird[0].x = 100;У тебя тут вектор пустой, а ты пытаешься обратиться к его элементам.
 
 
 Сообщение отредактировал RUNGOGET2THECHOPAH - Воскресенье, 03 Августа 2014, 00:08 |  |  |  |  |  | 
| Alkosha | Дата: Воскресенье, 03 Августа 2014, 00:55 | Сообщение # 1355 |  |   участник Сейчас нет на сайте | Цитата RUNGOGET2THECHOPAH (  ) У тебя тут вектор пустойа как и чем его заполнить ?
 |  |  |  |  |  | 
| Wikke | Дата: Воскресенье, 03 Августа 2014, 00:59 | Сообщение # 1356 |  |   частый гость Сейчас нет на сайте | vector <myEnemy> bird( 10 ); 
 создаст тебе вектор на 10 элементов. вроде после этого можно обращаться к его элементам.
 
 заполнять : bird.push_back ( тут_структура );
 
 C++ forever :3
 |  |  |  |  |  | 
| goldsphere | Дата: Воскресенье, 03 Августа 2014, 04:23 | Сообщение # 1357 |  |   заслуженный участник Сейчас нет на сайте | Цитата vector <myEnemy> bird( 10 ); 
 создаст тебе вектор на 10 элементов. вроде после этого можно обращаться к его элементам.
 
 заполнять : bird.push_back ( тут_структура );
Что это?
 Тут создаётся 10 элементов, а потом ещё и 11 зачем-то.
 Достаточно
 
 Код vector<myEnemy> bird; bird.push_back(myEnemy());
Потом уже можно обращаться к элементу
 bird[0].x ...
 
 FinderX - Android Аркада
 
 
 Сообщение отредактировал goldsphere - Воскресенье, 03 Августа 2014, 04:24 |  |  |  |  |  | 
| Alkosha | Дата: Воскресенье, 03 Августа 2014, 14:15 | Сообщение # 1358 |  |   участник Сейчас нет на сайте | Почему-то когда после 
 Код vector <myEnemy> bird( 10 ); пишу bird.x ... -- работает
 
 А если
 
 Код vector <myEnemy> bird; bird.x ... -- выбивает.
 Добавлено (03.08.2014, 14:15)---------------------------------------------
 То есть надо зарезервировать память ?
 bird.reserve(10);
 |  |  |  |  |  | 
| goldsphere | Дата: Воскресенье, 03 Августа 2014, 15:16 | Сообщение # 1359 |  |   заслуженный участник Сейчас нет на сайте | vector<myEnemy> bird; bird.push_back(myEnemy());
 bird[0].x = ...
 
 Если вам заранее известно сколько должно быть объектов можно и как в вашем случае - просто в скобках написать кол-во. При надобности можно добавить ещё функцией push_back(myEnemy()) тогда в конец добавится ещё один объект
 
 FinderX - Android Аркада
 
 
 Сообщение отредактировал goldsphere - Воскресенье, 03 Августа 2014, 15:32 |  |  |  |  |  | 
| Saitei | Дата: Понедельник, 04 Августа 2014, 18:16 | Сообщение # 1360 |  | старожил Сейчас нет на сайте | Я делаю что-то не так?: 
 Код #pragma once #include <SFML\Graphics.hpp>
 #include <map>
 #include <string>
 using namespace std;
 
 class Assets
 {
 map<string,sf::Texture*>Textures;
 public:
 Assets(void);
 sf::Texture& Get(const string& Key); //Получить текстуру со словесным ключем
 void Push(const string& Key, const string& FilePath); //Положить текстуру с ключем
 ~Assets(void);
 };
 Код  #include "Assets.h"
 
 Assets::Assets(void)
 {
 }
 
 sf::Texture& Assets::Get(const string& Key)
 {
 return *Textures[Key];
 }
 
 void Assets::Push(const string& Key, const string& FilePath)
 {
 sf::Texture* some = new sf::Texture; //Создать в программной куче место под текстуру
 some->loadFromFile(FilePath); //Загрузить текстуру (хочу заметить, что в FilePath вместо \ надо писать \\, т.к. \ - это специальный символ С\С++
 Textures[Key] = some; //Поместить указатель на текстуру с "пометкой" Key
 }
 
 Assets::~Assets(void)
 {
 /*Домашнее задание: удаление всех текстур из памяти*/
 }
 
 то грузит текстуры, а вот одну добавлю - всё летит к чертям. Магия...
 
 
 Код bool Game::Load() {
 res.Push("LAND","land.png");
 res.Push("GRASS","grass.png");
 res.Push("FLOWERS","_flowers.png");
 
 map = new GameMap();
 mapGen.Generate(map->blocks, (int)(game_width/32), (int)(game_height/32));
 return true;
 }
 P.S. Во время написания урока с проблемой столкнулся. Раньше такой класс у меня превосходно работал..
 
 Добавлено (04.08.2014, 18:16)
 ---------------------------------------------
 
 
 
 Сообщение отредактировал Saitei - Понедельник, 04 Августа 2014, 18:16 |  |  |  |  |  
 |