Суббота, 23 Ноября 2024, 01:21

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-Ответ (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 ()
Ты перед чтением память под строку выделяешь?

Ага все разобрался. biggrin


Изучаю 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
постоянный участник
Сейчас нет на сайте
что, от одного объявления вылетает? surprised
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 ()
Пример кода бы хоть привёл.

Боюсь засмеёте. shy


Сообщение отредактировал 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
Поиск:

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