Вопрос-Ответ (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 |
|
| |
|