Помогите исправить ошибку Unhandled exception at 0x0107284a in 0xC0000005: Access violation writing location 0x0019bc98. В общем создаю функцию, которая принимает адрес двух массива cards
Может я просто устал после работы, да и глаза уже слипаются. Компилятор GCC
Консолька говорит:
Проверялл код на ideone.com, та же фигня.
Код
guest@calculate /GERMAN/oop $ c++ 14.cpp 14.cpp: В функции «int main()»: 14.cpp:32:7: ошибка: expected «;» before «a» time a(1, 3, 8), ^ 14.cpp:35:2: ошибка: нет декларации «c» в этой области видимости c.summ(a,b); ^ 14.cpp:35:9: ошибка: нет декларации «a» в этой области видимости c.summ(a,b); ^ 14.cpp:35:11: ошибка: нет декларации «b» в этой области видимости c.summ(a,b); ^
Листинг:
Код
#include <iostream> using namespace std; /////////////////////////////// class time { private: int h; int m; int s; public: time() : h(0), m(0), s(0) { } time(int z, int x, int c) : h(z), m(x), s(c) { } void display()const { cout << h << ":" << m << ":" << s; } time summ(time z, time x)const { time temp; temp.h = z.h+x.h; temp.m = z.m+x.m; temp.s = z.s+x.s; return temp; } }; ///////////////////////////////
int main() { time a(1, 3, 8), b(10, 10, 23), c; c.summ(a,b); a.display(); b.display(); c.display(); return 0; }
Сообщение отредактировал LP - Суббота, 07 Мая 2016, 20:41
falcoware, спасибо за быстрый ответ) Просто делал задание из конца главы в книжке, там сказли запили клас time, я не подумав и написал. Действительно глупо получилось.
Добавлено (11 мая 2016, 10:13) --------------------------------------------- Поможет кто ошибку отыскать? По задумке программа должна вывести перемешанную колоду карт, затем выдать игроку с верха колоды 6 карт(Заменить их нулями в колоде) И вывести на экран карты игрока. Всё работает, но вот в первую карту(что у игрока) он помещает мусор. Не могу найти ошибку. Так же буду рад выслушать замечания по оформлению кода и решений. Код на Ideone
LP, строчка 79, замени static int dgc = MAX1; на static int dgc = MAX1 - 1; Как правильно перемешивать массив почитай Тасование_Фишера–Йетса, но вообще это уже реализовано в std::random_shuffle.
Сообщение отредактировал Lertmind - Среда, 11 Мая 2016, 10:43
Ещё ты не заметил, что у тебя нет пик, чтобы исправить, надо ++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".
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
Читай про enum, там каждый элемент это целое число.
Читал я про него, но видимо не всё, конструкцию такую впервые вижу и интересно. Посмотрю в книге Бьёрна, там должно быть полное описание. Спасибо тебе)
LP, с enum это просто приведение типа, полагаю потому что перечисление может принимать только ограниченное число значений. Кстати, в этом коде нет смысла:
Конечно, у всякого не-C++-ника возникает справедливый вопрос о том, нафига из 10 строк на BASIC делать 150 на языке высокого уровня? Для совместимости и повторного использования? Но, мы видим, что количество описок и несуразностей в приведенном "карточном" примере (как и время исполнения) пропорционально размеру кода. Т.е. напартачить на порядок проще, чем на BASIC (или честном C). В чем же проблема? Очевидно, - в построении классов по-человечески, а не по-программистски. Например, зачем нам класс "карта"? Ведь масть и достоинство карты полностью определяется в данном случае ее номером? Тем более избыточен тип "масть" и трижды - константа "без карты". От класса "карта" остается единственная функция "печать карты #". (Конечно, когда таких функций накопиться больше - "проверка старшинства", "следующая", "цена"... или когда мы от обычных карт перейдем к MTG-подобным, класс понадобится... но пока - нет). Обратите, кстати внимание на детскую ошибку: 36 - константа, а 9 (одномастные) засунуто внутрь метода - это как раз следсвие избыточности классов. Аналогично с классом колода. Очевидно, это множество, над которым надо производить некоторые операции. В данном случае "перемешать" и "выдать 6 штук". По самой сути этих операций - это список, т.к. Фишеры–Йетсы именно в терминах списка формулируют свой алгоритм, а выдача явно подразымевает разбиение одного списка на два. Однако, честные списки, понятно нас не устроят (на самом деле, честных списков в программировании вообще не существует). Значит, массивы. Начинаем думать. Берем "массив карт" и к каждому элементу добавляем список на следующий. Ура! Выдать 6 карт теперь просто, достаточно перенести начало списка полной колоды, а остаток пометить, как список игрока. Но тасовать-то... Честно остчитывать от начала случайную карту... Стоп! Мы же видели, что карта представляет "саму себя". Номер карты - позиция в масииве. Т.е. в нашем элементах нашего массива и нет других полей, кроме "следующий". А как получить случайную перестановку массива из списочного Фишера–Йетса, нам уже показали. Осталось записать это как можно короче, пусть даже и на убогом C++.
P.S. Попробуйте оценить представление колоды в виде битовой шкалы. Какие операции упростятся? Как выбрать из шкалы случайную карту? Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Обратите, кстати внимание на детскую ошибку: 36 - константа, а 9 (одномастные) засунуто внутрь метода
Это имел ввиду?
Код
MAX1/4
Не по теме:
Gudleifr, ты видимо так самоутверждаешься, потому что сообщение явно пропитано негативом. Чтож, я верю, что негативные отзывы приносят больше пользы. Спасибо тебе.
Сообщение отредактировал LP - Среда, 11 Мая 2016, 18:40
Негативом? Нет. Избыточной поучительностью? Да. Понимаете, учебные задачи, которыми вас напрягают, имеют целью не испортить вам жизнь, но заставить научиться решать задачи*. И в силу некоторых причин я, здесь, скорее на стороне педагогов, чем на стороне школяров. И пытаюсь немного вам объяснить "методическое значение" примеров.
* Д.Пойа говорил: "Человека нельзя научить решать задачи. Но человек может научиться решать задачи".
ЦитатаLP ()
MAX1/4
Это другая детская ошибка. Никогда не исправляйте ошибку "по месту" и наугад. Если хотите исправить всерьез - выбросите модуль в помойку целиком и напишите его заново - по памяти.
Касательно моей неприязни к С++ - я уже ее объяснял. Знатоки обещают, что весь тот декларационный мусор, который я вынужден добавлять в программу, окупится при включении модуля в большой проект. Но сколько я не встречал больших проектов, верно оказывалось только одно: больше мусора - больше ошибок. Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Сообщение отредактировал Gudleifr - Среда, 11 Мая 2016, 20:11
Я хотел бы добавить новый класс в игру. Исходники в открытом доступе (Quake3 RTCW). Я хотел бы добавить модель танка в игру и написать программу для этой модели, чтобы он вёл себя как танк в игре. Кроме модели (пока ничего нет). Я только начал изучать программирование на языке с++. Может кто-нибудь объяснить. Что нужно вообще учитывать при написании такой программы или заменить какой-нибудь другой класс своей моделью и другой анимацией?
По "великой идее C++" - нужно всего лишь чуть-чуть изменить один из существующих классов и во все места, где этот класс может встретится, добавить "еще один класс" (вместо "выбери одного из 65 врагов", вставь "выбери одного из 66"). Но, по жизни: забудь о C++! научись программировать! изучи C++! посмотри на эту C++ фигню, выкинь на фиг и напиши по-своему! Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Сообщение отредактировал Gudleifr - Среда, 24 Августа 2016, 22:35