Пятница, 29 Ноября 2024, 05:08

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

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

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
FlyOfFlyДата: Среда, 20 Апреля 2016, 01:51 | Сообщение # 1481
заслуженный участник
Сейчас нет на сайте
Помогите исправить ошибку
Unhandled exception at 0x0107284a in 0xC0000005: Access violation writing location 0x0019bc98.
В общем создаю функцию, которая принимает адрес двух массива cards
Код
init(Card (*cards)[4][13],std::vector<sf::Vector2i> randomcard)

вызываю её
Код
init(&cards,randomcard);

доходит до строчки, где что то надо изменить в массиве и ошибка
Код

сards[x.x][x.y]->SetPos(sf::Vector2i(125*i,250+20*stack[i].getY()),false);


Сообщение отредактировал FlyOfFly - Среда, 20 Апреля 2016, 01:52
falcowareДата: Среда, 20 Апреля 2016, 02:01 | Сообщение # 1482
старожил
Сейчас нет на сайте
FlyOfFly, наверное надо передавать не указатель, а ссылочный указатель.

То есть не *pointer, а *&pointer. поскольку адрес массива меняется в функции.

А возможно.

Если Card cards[4][13], то надо передавать не &cards, а просто cards!
Либо:
&cards[0][0];


Сообщение отредактировал falcoware - Среда, 20 Апреля 2016, 02:06
FlyOfFlyДата: Среда, 20 Апреля 2016, 02:41 | Сообщение # 1483
заслуженный участник
Сейчас нет на сайте
Цитата falcoware ()

То есть не *pointer, а *&pointer. поскольку адрес массива меняется в функции.


Благодарю
LPДата: Суббота, 07 Мая 2016, 20:24 | Сообщение # 1484
частый гость
Сейчас нет на сайте
Может я просто устал после работы, да и глаза уже слипаются.
Компилятор GCC

Консолька говорит:


Листинг:


Сообщение отредактировал LP - Суббота, 07 Мая 2016, 20:41
falcowareДата: Суббота, 07 Мая 2016, 20:30 | Сообщение # 1485
старожил
Сейчас нет на сайте
LP, а Вам не кажется что std::time уже занято?

http://en.cppreference.com/w/cpp/chrono/c/time
LPДата: Среда, 11 Мая 2016, 10:13 | Сообщение # 1486
частый гость
Сейчас нет на сайте
falcoware, спасибо за быстрый ответ)
Просто делал задание из конца главы в книжке, там сказли запили клас time, я не подумав и написал. Действительно глупо получилось.

Добавлено (11 мая 2016, 10:13)
---------------------------------------------
Поможет кто ошибку отыскать? По задумке программа должна вывести перемешанную колоду карт, затем выдать игроку с верха колоды 6 карт(Заменить их нулями в колоде) И вывести на экран карты игрока.
Всё работает, но вот в первую карту(что у игрока) он помещает мусор. Не могу найти ошибку.
Так же буду рад выслушать замечания по оформлению кода и решений.
Код на Ideone

LertmindДата: Среда, 11 Мая 2016, 10:41 | Сообщение # 1487
заслуженный участник
Сейчас нет на сайте
LP, строчка 79, замени static int dgc = MAX1; на static int dgc = MAX1 - 1;
Как правильно перемешивать массив почитай Тасование_Фишера–Йетса, но вообще это уже реализовано в std::random_shuffle.


Сообщение отредактировал Lertmind - Среда, 11 Мая 2016, 10:43
LPДата: Среда, 11 Мая 2016, 11:04 | Сообщение # 1488
частый гость
Сейчас нет на сайте
Lertmind, уже менял так, перепроверь вывод, он в таком случае берет начиная не с последней карты, а с предпоследней. А это немного не то.
LertmindДата: Среда, 11 Мая 2016, 11:35 | Сообщение # 1489
заслуженный участник
Сейчас нет на сайте
Ещё ты не заметил, что у тебя нет пик, чтобы исправить, надо ++j; делать после case:
Код
n=6;
switch(j)
{
    case (0): m = peaks; break;
    case (1): m = worms; break;
    case (2): m = diamonds; break;
    case (3): m = baptize; break;
}
++j;

Но в данном случае весь switch можно заменить на m = (Mast)j;, т.е.:
Код
m = (Mast)j;
++j;

Также не использован srand.

Добавлено (11 мая 2016, 11:15)
---------------------------------------------
LP, она последняя, ты заполнение и вывод колоды сделал неправильный.

Добавлено (11 мая 2016, 11:19)
---------------------------------------------
LP, вот так заполнение надо исправить:

Код
void deck_gen()       //Гененрируем колоду карт
{
    Mast m = peaks;
    int n = 6;
    for(int i = 0, j = 0; i < MAX1; i++)
    {
        deck[i].numb = n++;
        deck[i].mast = m;
        if((i + 1)%9 == 0)
        {
            n=6;
            m = (Mast)j;
            ++j;
        }
    }
}

а так вывод:
Код
void deck_display()const    //Вывод на экран колоду
{
    cout << endl;
    for(int i = 0; i < MAX1; i++)
    {
        //Выводим по одной карте
        deck[i].card_display();
        //По 9 карт в строке
        if((i + 1)%9 == 0)
            cout << endl;
    }
}

Добавлено (11 мая 2016, 11:35)
---------------------------------------------
Ещё по мелочи:
1. Я бы использовал setw для красивого форматирования вывода номера карты.
2. "Твои карты" пишется как "Your cards".

LPДата: Среда, 11 Мая 2016, 11:51 | Сообщение # 1490
частый гость
Сейчас нет на сайте
Lertmind, спасибо, подправил, но немного не понятна конструкция m =(Mast)j; не подскажешь где искать описание?
И заметил сейчас только, что у меня 35 карт вместо 36и. Увеличивать MAX1 до 37? Или это снова ошибка в коде, просто насколько я помню массив только со строками последний символ занимает под '\0'. Или я не правильно запомнил?

Добавлено (11 мая 2016, 11:49)
---------------------------------------------
Цитата Lertmind ()
1. Я бы использовал setw для красивого форматирования вывода номера карты.

Пока пишу чисто чтоб работало, в свободные минуты на работе, потом на Qt перепишу если мне не будет лень и если я буду в силах.
Цитата Lertmind ()
2. "Твои карты" пишется как "Your cards".

Учту:)

Добавлено (11 мая 2016, 11:51)
---------------------------------------------
Цитата Lertmind ()
m = (Mast)j;

Эта запись позволяет присвоить m значение jитого элемента в перечислении Mast?


Сообщение отредактировал LP - Среда, 11 Мая 2016, 11:57
LertmindДата: Среда, 11 Мая 2016, 11:57 | Сообщение # 1491
заслуженный участник
Сейчас нет на сайте
LP, у тебя ошибка, вот весь код:

Цитата LP ()
m =(Mast)j; не подскажешь где искать описание?
Читай про enum, там каждый элемент это целое число.
LPДата: Среда, 11 Мая 2016, 12:04 | Сообщение # 1492
частый гость
Сейчас нет на сайте
Цитата Lertmind ()
Читай про enum, там каждый элемент это целое число.

Читал я про него, но видимо не всё, конструкцию такую впервые вижу и интересно. Посмотрю в книге Бьёрна, там должно быть полное описание.
Спасибо тебе)
LertmindДата: Среда, 11 Мая 2016, 12:11 | Сообщение # 1493
заслуженный участник
Сейчас нет на сайте
LP, с enum это просто приведение типа, полагаю потому что перечисление может принимать только ограниченное число значений.
Кстати, в этом коде нет смысла:
Код
while(sizeof(PlDeck) < 6)
{
    PlDeck[GetCard] = d1.deck_give_card();
    GetCard++;
}

Здесь sizeof(PlDeck) всегда будет равен количеству байт массива, а точнее в ideone: 288.
LPДата: Среда, 11 Мая 2016, 12:22 | Сообщение # 1494
частый гость
Сейчас нет на сайте
Lertmind, а по самому коду? Читается норм?

Цитата Lertmind ()
LP, у тебя ошибка, вот весь код:

Вечером уже только похоже смогу перепроверить весь код, сравнить с тем что ты скинул и подправить ту ошибку с выводом 35и карт вместо 36.
LertmindДата: Среда, 11 Мая 2016, 12:47 | Сообщение # 1495
заслуженный участник
Сейчас нет на сайте
Цитата LP ()
а по самому коду? Читается норм?
Код не большой разобраться можно, но можно было бы избавиться от магических чисел и подобрать более подходящие названия переменных и методов.
GudleifrДата: Среда, 11 Мая 2016, 13:17 | Сообщение # 1496
почти ветеран
Сейчас нет на сайте
Конечно, у всякого не-C++-ника возникает справедливый вопрос о том, нафига из 10 строк на BASIC делать 150 на языке высокого уровня? Для совместимости и повторного использования? Но, мы видим, что количество описок и несуразностей в приведенном "карточном" примере (как и время исполнения) пропорционально размеру кода. Т.е. напартачить на порядок проще, чем на BASIC (или честном C).
В чем же проблема? Очевидно, - в построении классов по-человечески, а не по-программистски. Например, зачем нам класс "карта"? Ведь масть и достоинство карты полностью определяется в данном случае ее номером? Тем более избыточен тип "масть" и трижды - константа "без карты". От класса "карта" остается единственная функция "печать карты #". (Конечно, когда таких функций накопиться больше - "проверка старшинства", "следующая", "цена"... или когда мы от обычных карт перейдем к MTG-подобным, класс понадобится... но пока - нет). Обратите, кстати внимание на детскую ошибку: 36 - константа, а 9 (одномастные) засунуто внутрь метода - это как раз следсвие избыточности классов.
Аналогично с классом колода. Очевидно, это множество, над которым надо производить некоторые операции. В данном случае "перемешать" и "выдать 6 штук". По самой сути этих операций - это список, т.к. Фишеры–Йетсы именно в терминах списка формулируют свой алгоритм, а выдача явно подразымевает разбиение одного списка на два. Однако, честные списки, понятно нас не устроят (на самом деле, честных списков в программировании вообще не существует). Значит, массивы. Начинаем думать. Берем "массив карт" и к каждому элементу добавляем список на следующий. Ура! Выдать 6 карт теперь просто, достаточно перенести начало списка полной колоды, а остаток пометить, как список игрока. Но тасовать-то... Честно остчитывать от начала случайную карту... Стоп! Мы же видели, что карта представляет "саму себя". Номер карты - позиция в масииве. Т.е. в нашем элементах нашего массива и нет других полей, кроме "следующий". А как получить случайную перестановку массива из списочного Фишера–Йетса, нам уже показали. Осталось записать это как можно короче, пусть даже и на убогом C++.

P.S. Попробуйте оценить представление колоды в виде битовой шкалы. Какие операции упростятся? Как выбрать из шкалы случайную карту?


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
LPДата: Среда, 11 Мая 2016, 18:39 | Сообщение # 1497
частый гость
Сейчас нет на сайте
Цитата Gudleifr ()
Обратите, кстати внимание на детскую ошибку: 36 - константа, а 9 (одномастные) засунуто внутрь метода

Это имел ввиду?
Код

MAX1/4

Не по теме:


Сообщение отредактировал LP - Среда, 11 Мая 2016, 18:40
GudleifrДата: Среда, 11 Мая 2016, 20:08 | Сообщение # 1498
почти ветеран
Сейчас нет на сайте
Цитата LP ()
потому что сообщение явно пропитано негативом
Негативом? Нет. Избыточной поучительностью? Да. Понимаете, учебные задачи, которыми вас напрягают, имеют целью не испортить вам жизнь, но заставить научиться решать задачи*. И в силу некоторых причин я, здесь, скорее на стороне педагогов, чем на стороне школяров. И пытаюсь немного вам объяснить "методическое значение" примеров.

* Д.Пойа говорил: "Человека нельзя научить решать задачи. Но человек может научиться решать задачи".

Цитата LP ()
MAX1/4
Это другая детская ошибка. Никогда не исправляйте ошибку "по месту" и наугад. Если хотите исправить всерьез - выбросите модуль в помойку целиком и напишите его заново - по памяти.

Касательно моей неприязни к С++ - я уже ее объяснял. Знатоки обещают, что весь тот декларационный мусор, который я вынужден добавлять в программу, окупится при включении модуля в большой проект. Но сколько я не встречал больших проектов, верно оказывалось только одно: больше мусора - больше ошибок.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Среда, 11 Мая 2016, 20:11
Andrey1973Дата: Среда, 24 Августа 2016, 22:15 | Сообщение # 1499
уже был
Сейчас нет на сайте
Привет, всем!

Я хотел бы добавить новый класс в игру. Исходники в открытом доступе (Quake3 RTCW).
Я хотел бы добавить модель танка в игру и написать программу для этой модели, чтобы он вёл себя как танк в игре.
Кроме модели (пока ничего нет). Я только начал изучать программирование на языке с++.
Может кто-нибудь объяснить. Что нужно вообще учитывать при написании такой программы или заменить какой-нибудь другой класс своей моделью и другой анимацией?
GudleifrДата: Среда, 24 Августа 2016, 22:34 | Сообщение # 1500
почти ветеран
Сейчас нет на сайте
Цитата Andrey1973 ()
Я хотел бы добавить новый класс в игру.
По "великой идее C++" - нужно всего лишь чуть-чуть изменить один из существующих классов и во все места, где этот класс может встретится, добавить "еще один класс" (вместо "выбери одного из 65 врагов", вставь "выбери одного из 66"). Но, по жизни: забудь о C++! научись программировать! изучи C++! посмотри на эту C++ фигню, выкинь на фиг и напиши по-своему!


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Среда, 24 Августа 2016, 22:35
Поиск:

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