Это далеко не анахроизм из Си. Человек спросил решение его задачи, я предложил один из вариантов. Также мы все предложили варианты лучше. Что именно подойдёт как решение, автор топика сам выберет наилучший ему вариант.
Цитатаalkemist ()
в каких ситуациях жизненно необходим и единственно возможен данный вариант? мне кажется, что количество таких задач стремится к нулю. так что лучше изначально продумать архитектуру классов и data flow в них.
Согласен, просто, опять же - предложил вариант решения для той постановки задачи, что просили (а там уже была неудачная архитектура).
Цитатаalkemist ()
singleton применим в больших командах/проектах, когда ты хочешь быть абсолютно уверен, что студент Вася, не знающий архитектуры проекта, не создаст больше 1 экземпляра важной подсистемы.
Синглтон - это синглтон. Это не панацея от глобальных переменных и не является их заменой, даже частичной. Ведь зачастую могут понадобиться глобальные переменные тех типов, которые могут иметь и несколько экземпляров. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Пятница, 20 Марта 2015, 23:54
Aevien, по художественному отделу я не руководствуюсь - просто скинул скрин наработки одного из моделеров. Могу пока-что сказать, что разработка идёт. Апдейтер готов, лаунчер готов, сервер потихоньку пишем.
Добавлено (20 марта 2015, 09:56) ---------------------------------------------
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Эргалон, следуя логическим выводам, собирая траву, ты получаешь просто траву. Если знаешь, что это за трава, то ты собрал известную траву. Поэтому можно и разделить лут для простых смертных как сбор неизвестной травы, а лут для травников как целебная/ядовитая/иная трава. Такой метод является предпосылкой для торговых отношений, когда неизвестную траву хочется отнести травнику (другой игрок или NPC) и узнать, что именно это за трава. Для каждой собранной травинки можно скрытно хранить информацию, какая трава получится при опознании травником. Тогда после опознания будет получено несколько разных видов трав. Другой вариант - сделать шанс, что опознается определённый вид травы. Допустим, шанс, что ты собрал целебную траву 70%, ядовитую - 30%. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Можно ли создать класс в одном файле, создать объект класса в другом, а использовать объект в третьем?
Да
ЦитатаNedname ()
Если да, то как?
Переведу немного. Создать класс в одном файле: описываешь класс в одном файле с помощью ключевого слова class. Создать объект класса в другом: объявляешь переменную типа класса, который описал в предыдущем файле. При этом в текущем файле ты должен подключить предыдущий с директивой include либо описать класс вручную (возможно дублирование кода). Использовать объект в третьем: для этого надо подключить файл с помощью директивы include, в котором объявлена переменная типа того класса. Правильней, конечно, будет, как описал alkemist с объявлением объекта непосредственно в той области, где будет использоваться сам объект, а описание и реализацию методов класса отдельными файлами. Но... если необходим именно заданный вариант, то можно, опять же, воспользоваться принципами раздельной компиляции: file1.cpp - содержит описание класса и его реализацию. file2.cpp - содержит предопределение класса (заголовок). Желательно разделить file1.cpp с "созданием класса" на два файла - один содержит описание, другой - реализацию методов. По заданным условиям придётся обойтись без подключения файла file3.cpp - т.к. объект создан в file2.cpp, то надо объявить его ещё раз, но со спецификатором extern, чтобы указать, что данный объект уже создан, но в другом месте. Компоновщику надо будет скормить все эти файлы, чтобы избежать ошибок.
Цитатаshizofren ()
может не объект, а экземпляр?
Лол. Объект, по определению, и есть экземпляр. Если дословно: объект - это экземпляр класса.
Цитатаalkemist ()
статические переменные - это плохо, не пользуй их
Лол.
Повторюсь, правильно сказал alkemist в посте #9 - используй правильное разделение описаний и объявлений. Если хочешь использовать объект, объявленный в другом файле, который потенциально будет скомпилирован в иной объектный файл, то тебе придётся объявить этот объект ещё раз, но со спецификатором extern. Такие случаи допустимы при использовании глобальных переменных, но желательно избегать этого и объявлять все переменные непосредственно в местах использования. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Четверг, 19 Марта 2015, 22:47
Присвой управляемым элементам уникальность путём добавления уникального имени или идентификатора. После этого ищи элемент по имени или идентификатору семейством функций getElementBy[вставить_нужное]. Для полученных объектов можно исправлять поля .src, .innerHTML, .href и т.п. (в зависимости от полученного объекта).
Поиграйся также с .innerHTML и .href полями. Например, для ссылки: document.getElementById("link_id").href = "/image_link.php"; Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Суббота, 14 Марта 2015, 07:20
Скрин выше - одна из игровых моделей. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
При любом заказе скажите этот промо код и получите скидку 5% на любую услугу. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Как видно из названия, это функция чтения строки. Чтение будет выполнено до символа переноса строки (Enter). Замени на Read() Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Четверг, 27 Ноября 2014, 12:51
Ввод строк с консоли происходит до символа переноса строки (Enter), ввод значений простых типов происходит до пробельного символа (пробел, перенос строки), поэтому можно вводить значения в консоли через пробел и не писать дополнительный код при вводе. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Четверг, 27 Ноября 2014, 12:03
Мой вариант: *mas + index = z А может так: *(mas + index) = z
Слева от знака равенства должно быть что-то, куда можно поместить значение. По-любому, какая-то зпеременная. В приведённом примере будет ошибка lvalue required, т.к. слева от знака равенства стоит значение, а не переменная.
ЦитатаRamilyanamana ()
ввод данных выполняется с клавиатуры
При работе с указателями очень наглядно работает функция scanf(), которая позволяет ввести значение с клавиатуры и занести его по определённому адресу в памяти. Оператором взятия адреса можно взять адрес требуемой переменной, либо подставить сразу указатель, который этот адрес содержит. Пример:
Код
int value; // обычная переменная, содержит значение int *pValue; // переменная-указатель, содержит адрес // ... scanf("%d", &value); // ввод целого числа с клавиатуры. Помещаем по адресу переменной value scanf("%d", pValue); // ввод целого числа с клавиатуры. Помещаем по адресу, хранимому в переменной pValue
Обратите внимание, что я между объявлением и заданием значения с клавиатуры пропустил некоторое место. Изначально указатель никуда не показывает. Мы его объявили, чтобы потом хранить в нём адрес области памяти, которую запросим у операционной системы. Пример-сравнение: в отеле Вам выдают ключ от номера с биркой. На бирке написано число. Это число является адресом номера, который Вам выделен. Сама бирка (не число) является указателем. Опять же: указатель содержит адрес, как бирка содержит номер комнаты. Чтобы получить значение, надо проследовать по адресу. Вывод на экран будет таким:
Код
printf("%d", value); // вывод значения переменной value в формате целого числа printf("%d", *pValue); // вывод значения, которое хранится по адресу, а этот адрес находится в переменной pValue
Прибыв в отель в первый раз, нельзя взять свою бирку и последовать в номер, указанный на ней, ведь бирка может быть с другого отеля, а может быть пустой. Поэтому надо подойти с биркой к менеджеру и попросить номер, куда можно поселиться. Менеджер напишет номер на бирке. Это и есть процесс выдачи комнаты, процесс выделения памяти: у вас есть бирка (указатель), на которую надо нанести номер комнаты (присвоить адрес), которую выдал менеджер (выделила операционная система). Как вариант, вы можете уже для заказанной комнаты использовать свою бирку и написать на ней номер, когда подойдёте к двери (узнаете, что это тот номер, что надо). Процесс взятия адреса переменной уже был показан выше с использованием оператора & (амперсенд). Допустимо писать так:
Код
int value = 5; int *pValue = &value;
Процесс взятия значения по указанному адресу называется разыменованием указателя и обозначается символом * (звёздочка) перед именем переменной-указателем.
Код
printf("%d", *pValue);
Т.к. наша бирка до запроса номера комнаты может содержать неправильный номер комнаты (тот, что нам недоступен или не существует), то надо обращаться к менеджеру. При необходимости хранения какого-либо значения в памяти, надо запросить операционную систему выделить эту память. Операционная система старается выделить столько памяти, сколько мы попросим. Когда мы попросим память, операционная система скажет, где она её выделила.
Код
int *pValue; // стиль C pValue = (int *)malloc(sizeof(int)); // просим выделить память размером sizeof(int) и сообщаем, что получаемый адрес указывает на целое число // стиль C++ pValue = new(int);
Когда мы решим, что нам больше не нужен номер отела, мы говорим об этом менеджеру, тогда он сможет выдавать его другим постояльцам. В нашем случае просто надо сообщить операционной системе, что область памяти нам не нужна.
Код
// стиль С free(pValue); // стиль C++ delete pValue;
Накалякал решение в стиле Си. Можно было короче, но тогда менее наглядно будет.
Код
#include <stdio.h> #include <stdlib.h>
int main() { int sizeOfArray; int *pArray = 0; int i, iBegin, iEnd; int *pFirstZero = 0; int *pLastNegative = 0;
Enter array size: 10 Enter all 10 values: 3 -5 6 7 3 0 -1 0 -7 5 Array before: 3 -5 6 7 3 0 -1 0 -7 5 Array after: 3 -5 6 7 3 -7 -1 0 0 5 2 elements between
Результат выполнения для других данных:
Код
Enter array size: 6 Enter all 6 values: -1 1 1 1 1 0 Array before: -1 1 1 1 1 0 Array after: 0 1 1 1 1 -1 4 elements between
Надеюсь, плюсом не обидят - у меня суп остыл, пока отвечал.
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Среда, 26 Ноября 2014, 18:49
Похоже, что такая функция есть в вижуал студии и борландовском билдере. Я же использую кодблокс mingw gcc
Библиотеки и функционал языка, на сколько мне правильно мама объясняла, не зависят от среды разработки. Код, написанный в одной среде, можно скомпилировать и в другой. Работа с wchar - часть возможностей стандартной библиотеки. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
При работе с UTF8 желательно хранить строки как массивы wchar. Не могу по памяти сказать - найди функции для преобразования UTF8 в ANSI (wchar в char). Читаешь с файла UTF8 в wchar*, после чего используешь функцию, которая переведёт в char*, потом подаёшь в RenderText функцию. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
теперь какая-то фигня с кодировками. Латиница правильно отображается, а кириллица - нет. Фонты TTF содержат в себе русскоязычный алфавит. Пробовал файл сохранить в UTF8 и в ANSI - всё равно кракозябры, только в разной кодировке по-своему. Файл редактирую через notepad++ Если выводить буквы непосредственно из программы [print1.display("Аллаху акбар")] , то с кодировкой проблем нет.
Отображается где? На какой платформе? Если вывод в консоль, то можно использовать несколько вариантов:
Код
setlocale(LC_ALL,"Russian");
Есть костыльный вариант в случае использования dos-кодировки:
Код
system("chcp 1251");
Code page по умолчанию, если не ошибаюсь, 866, для возврата к ней, используется системный вызов "chcp 866".
При использовании UTF-8 возникает ещё затруднение, т.к. каждый символ кодируется двумя байтами - номером кодовой таблицы и кодом символа в этой таблице. Из-за использования двух байтов, надо хранить их не как char, а как wchar. Кстати, например, вывод тоже отличаеться будет: wcout вместо cout. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Alkosha, строка представляет из себя массив символов, последний из которых должен оканчиваться символом конца строки, или нулевым символом.
ЦитатаAlkosha ()
print1.display(input[0][i]);
Полагаю, что input - массив строк. Хорошо. Тогда каждый элемент этого массива является массивом символов. По сути, input - это массив указателей типа char*. Поэтому можно передавать таким образом:
Код
print1.display(input[i])
где i - номер строки в массиве input (начиная с нуля), которую нужно передать.
В случае использования стандартных контейнеров типа std::string, взять указатель на строку можно, воспользовавшись методом c_str():
Цитата E:\TURBO\platform3\main.cpp|974|error: invalid conversion from 'const char*' to 'char*' [-fpermissive]|
Не нравится ему, что константное значение.
метод c_str() возвращает константный указатель по причине закрытия возможности управлять содержимым контейнера вручную. Контейнер std::string считает длину хранимой строки и прочую другую информацию. Если будет доступ к хранимой строке по указателю с возможностью замены, то данные контейнера будут фальсифицироваться, что нарушит правильную его работу.
Могу предположить, что метод display() написан вручную, а по названию можно судить, что он не будет менять принимаемый параметр. Так не проще ли подставить квалификатор const в списке параметров?
Код
void display(const char* src);
ЦитатаAlkosha ()
Диалоги хранятся в файле. Каждая реплика отделяется ключевым словом (допустим "next"). И при считывании из файла, нужно каждую реплику расфасовать по отдельным строковым массивам
Могу предложить не просто чтение по словам, а сразу же поиск ключевого слова функцией find. Нашлась позиция - можно точно определить количество необходимых символов для хранения реплики. Сохраняем, идём далее - до конца файла. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Четверг, 20 Ноября 2014, 00:02
Babuka, значит, froex смотрит тред, увидел эти рабочие ссылки и наконец-то решил залатать дыры в своей суперской системе TEAM ONLY. Ссылки: #1, #2 и #3.
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Ещё актуально. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
И где написанные Вами приложения можно посмотреть?
Цитатаrrrfer ()
Ну а реально, я написал ТС, но учиться не стал
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
zisX, valueName заключи в другие кавычки (обратные, гравис) на клавише ~, ё, ` Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Суббота, 08 Ноября 2014, 23:04
zisX, valueName заключи в другие кавычки (обратные, гравис) на клавише ~, ё, ` Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
Сообщение отредактировал froex - Суббота, 08 Ноября 2014, 23:04