• Надо решить проблему с include?

    @Mercury13
    Программист на «си с крестами» и не только
    Учи понятие «единица компиляции».

    Два варианта.
    a) Несколько единиц компиляции (основной вариант, когда идёт активная разработка проекта). Тогда в хедере каждую переменную отмечаешь модификатором extern — «переменная есть, но где-то в другом месте». В одной из единиц компиляции объявляешь переменные, уже без extern.

    Насколько мне известно, защита от двойного включения для extern-переменных не важна, но, например, для классов или функций ой как пригодится.

    ///// unit.h /////
    #ifndef UNIT_H
    #define UNIT_H
    
    extern int myVar;
    
    #endif
    
    ///// unit.cpp /////
    #include "unit.h"
    
    int myVar;
    
    ///// main.cpp /////
    #include "unit.h"
    
    int main()
    {
       myVar = 1;
    }


    б) Одна большущая единица компиляции (в такой вид часто преобразуют библиотеки перед выпуском). Тогда достаточно оградить каждый хедер от двойного включения, и всё в порядке.

    ///// unit.h /////
    #ifndef UNIT_H
    #define UNIT_H
    
    int myVar;
    
    #endif
    
    ///// main.cpp /////
    #include "unit.h"
    
    int main()
    {
       myVar = 1;
    }


    ЗЫ. Когда я писал ответ, кода ещё не было. А тут он взял и пришёл. Для переменных (SYMBOL_WIDTH, LINE_HEIGHT) решение то самое. А для констант вариантов несколько.

    Путь сишный.
    #define LEFTPANEL 200
    ВОЗМОЖНО для литеральных констант, и особенно классно работает с текстовыми строками (например, "[" TEXT "]").
    НЕДОСТАТКИ: это препроцессор, и при пересечении имён будет нехорошо.

    Путь перечислимый.
    enum {
      LEFTPANEL = 200
    };
    ВОЗМОЖНО для констант, влезающих в int.
    НЕДОСТАТКИ: возможны приколы с кроссплатформенностью, если на отдельных платформах константа вылезет за грань int.

    Путь переменный.
    extern const int LEFTPANEL;
    ....
    const int LEFTPANEL = 200;
    ВОЗМОЖНО для любых констант.
    НЕДОСТАТКИ: нет вычисления при компиляции. Только линкер знает, что это 200.

    Путь C++11.
    constexpr int LEFTPANEL = 200;
    ВОЗМОЖНО для литеральных констант.
    НЕДОСТАТКИ: только C++11.

    Путь «на рывок»
    static const int LEFTPANEL = 200;
    ВОЗМОЖНО для всех литеральных типов, но при этом может создавать дублирующиеся переменные: так, в Borland будет дублироваться всё сверх int — и, соответственно, не допускать предкомпилированных заголовков, ибо создаётся код.
    НЕДОСТАТКИ: семантика зависит от компилятора и типа, ради чего и сделали constexpr.
    Ответ написан
    2 комментария
  • Сложен ли язык программирования "C"?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    1. Нет. Культовая K&R C -- 260 страниц
    2. Да. libGTK

    Язык С весь можно уложить в голову за неделю. Потом учиться программировать
    Ответ написан
    Комментировать
  • Почему float a= 3.141593 и #define a 3.141593 при сравнении не равно?

    AtomKrieg
    @AtomKrieg
    Давай я поищу в Google за тебя
    answer - double

    #define d 3.141593
    #define f 3.141593f
    float a = 3.141593;
    
    cout << "d cmp a: " << boolalpha << (d==a) << endl;
    cout << "f cmp a: " << boolalpha << (f==a) << endl;
    
    cout << setprecision(10);
    cout << d << endl << f << endl;
    Ответ написан
    3 комментария
  • Как компилируется C++ код?

    @dmitryKovalskiy
    программист средней руки
    Врет ваш преподаватель. Чистые плюсы компилятся в ассембленные команды. Хотя вобщем можно найти компилятор, превращающий C++ во что нибудь поэкзотичнее
    UPD: knzsoft.ru/cpp-bgr-ls1 вроде неплохая статейка по теме
    Ответ написан
    Комментировать
  • Как не ждать окончания вызова функции в Python?

    @bromzh
    Drugs-driven development
    https://docs.python.org/3/library/threading.html
    Только учти, что у питона есть глобальная блокировка, и такое распараллеливание будет весьма условным.
    А вообще, всё зависит от задачи. Если ты пишешь что-то сетевое, то лучше взять tornado/asyncio или celery
    Ответ написан
    Комментировать
  • Когда заголовок iostream заменяет другие заголовки, например, string?

    TrueBers
    @TrueBers
    Гуглю за еду
    Однозначно нужно подключать всё как положено. Совсем не факт, что какой-то другой компилятор будет у себя подключать где-то этот самый string.h. Точно так же может смениться реализация в другой версии, и всё поломается.

    По сути, работает оно по чистой случайности. Всегда подключайте необходимый заголовок. Проще всего смотреть на сайте C++ Reference. Там для каждого класса есть вверху строка Defined in header <...>. Вот этот хедер и подключайте всегда, будет работать в 99% компиляторов. А чтобы не замедлялась скорость сборки, добавляйте часто используемые заголовки в precompiled header.
    Ответ написан
    Комментировать
  • С++. Работа с графикой. Когда начинать?

    Nipheris
    @Nipheris Куратор тега C++
    > Возможно перед работой с любой библиотекой нужно знать "основу" в самом языке?
    Вполне логично, что язык надо знать, вопрос - насколько полно (особенно это касается C++, полностью его знают только разработчики стандарта и компиляторов).
    OpenGL (который я бы советовал вам посмотореть) это по сути Си-шная либа, поэтому с ней проще - выучите что такое функции и указатели, разберитесь с базовыми типами данных и особенностями операций (чтобы не удивляться, почему 3 / 2 = 1, а 3.0 / 2.0 = 1.5), и можете пробовать. Из общего развития - матричная алгебра, особенности компьютерной арифметики (числа с плавающей точкой и т.д.). Ну и сама "графика" - устройство графического конвейера, типы рендеринга (фотореалистичный/реального времени), этапы рендеринга, и т.д.
    Отдельная задача - уметь настроить компилятор и IDE для того, чтобы все, что использует OpenGL, нормально компилилось, но это вы и в гугле найдете.
    Ответ написан
    Комментировать
  • Как реализовать в Java возврат к началу класса?

    EugeneP2
    @EugeneP2
    Java Dev
    Как то так обычно это делается
    package ru.toster.java.q241826;
    
    import java.util.Date;
    import java.util.Scanner;
    
    public class App {
    
    	public static void main(String[] args) {
    
    		Scanner scnr = new Scanner(System.in);
    
    		while (true) {
    
    			System.out.print("enter command>");
    			String command = scnr.nextLine();
    
    			if ("help".equals(command)) {
    				printListCommand();
    			} else if ("date".equals(command)) {
    				printDate();
    			} else if ("time".equals(command)) {
    				printTime();
    			} else if ("exit".equals(command)) {
    				System.out.println("Good Bye!");
    				break;
    			} else {
    				System.out.println("Unknown command! Please enter 'help'");
    			}
    
    		}		
    		scnr.close();
    	}
    	
    	private static void printTime() {
    		System.out.printf("%1tT\n", new Date());		
    	}
    
    	private static void printDate() {
    		System.out.printf("%1tY-%1$tm-%1$td\n", new Date());		
    	}
    
    	private static void printListCommand() {
    		System.out.println(
    				"'help'\tprint list commands;\n" + 
    				"'exit'\texit from programm;\n" + 
    				"'date'\tprint today's date;\n" + 
    				"'time'\tprint current time;");
    	}
    }
    Ответ написан
    3 комментария
  • Как создать exe из формы c++ cli?

    @JustSokol
    newby programmer
    у вас то ли путаница в терминах то ли непонимание архитектуры построения современных программ/игр/Инф.Систем.
    движок нельзя отделить от игры тк это его неотъемная часть.
    это всеравно что "я хочу отделить скелет от человека чтобы при этом человек жил без скелета где-то в другом месте". движок и есть скелет игры.

    если вы под "движком" подразумевали редактор или типа того - то вам нужно менять понимание архитектуры игр. тк редактор лишь конфигурирует различные подгружаемые файлы для игры (точнее для его настоящего движка, а не того что вы под ним подразумеваете).
    редактор не создает игру обычно (хотя конечно в теории так наверное можно извращаться) а лишь конфигурирует посредством различных подключаемых файлов (модельки, текстурки, скрипты, настройки модулей движка)
    Ответ написан
    Комментировать
  • Как получить указатель на метод объекта?

    Можно
    Если напрямую, то надо использовать тип "указатель на функцию член" вида Ret (Class::*)(Args...) [const]. Сам указатель получать &Class::Fun, а вызывать операторами .* или ->*
    Или использовать std::function (boost::function), std::bind (boost::bind) или std::mem_fun, std::mem_fn для более унифицированного подхода:

    struct some
    {
    	some() : value(0) {}
    
    	int inc() { return ++value; }
    	int dec() { return --value; }
    	int get() const { return value; }
    
    	int value;
    };
    
    int main()
    {
    	some s;
    
    	int (some::*inc_f)() = &some::inc; // inc_f - указатель на функцию
    	std::cout << "(s.*inc_f)() = " << (s.*inc_f)() << std::endl; // оператор .* - оператор вызова по указателю на функцию
    	int (some::*val_ptr) = &some::value; // val_ptr - указатель на член
    	s.*val_ptr = 10;
    	std::cout << "s.*val_ptr = " << s.*val_ptr << std::endl;
    
    	int (some::*const_f)() const = &some::get; // const-функция
    	std::cout << "s.*const_f() = " << (s.*const_f)() << std::endl;
    
    	using namespace std::placeholders;
    	std::function<int (some&)> mem_f;
    	
    	mem_f = std::bind(&some::inc, _1); // биндим на функцию-член, _1 - placeholder для объекта
    	std::cout << "mem_f(s) = " << mem_f(s) << std::endl; // s.inc();
    	mem_f = std::mem_fn(&some::dec); // другой способ через mem_fn
    	std::cout << "mem_f(s) = " << mem_f(s) << std::endl; // s.dec();
    
    	std::function<int()> mem_f_ = std::bind(&some::inc, &s); // биндим на функцию член и сразу указываем объект, получаем функцию без аргументов
    	std::cout << "mem_f_() = " << mem_f_() << std::endl; /// s.inc();
    
    	std::function<int(some const &)> const_fn = std::mem_fn(&some::get); // some const &
    	std::cout << "const_fn(s) = " << const_fn(s) << std::endl;
    
        return 0;
    }
    Ответ написан
    Комментировать
  • Как подключить класс к форме - C++/CLI?

    Nipheris
    @Nipheris Куратор тега C++
    1) в первом блоке кода у вас, возможно, пропущена закрывающая фигурная скобка, проверьте;
    2) если вы создаете окно, то скорее всего оно у вас будет жить относительно долго, и его временем жизни нужно будет управлять вручную. Это значит, вам пора разобраться, что такое указатели и ручное управление памятью/временем жизни объекта (т.е. WindowOpen w(640, 480) скорее всего не годится)
    3) сразу учитесь давать адекватные имена сущностям в программе. WindowOpen это имя для функции, но не для класса, возможно вы имели в виду просто Window.
    4) по возможности не используйте C++/CLI как учебный язык. Это стыковочный диалект C++ для реализации взаимодействия систем поверх .net и нативных - в нем может запутаться даже бывалый C++ разработчик, новичкам даже смотреть на него нельзя - убивает душу. То, что MS по дефолту предлагает проект в студии - это так исторически сложилось. MS сейчас вообще ничего не предлагает адекватного для десктопа под C++, так что мой вам совет: либо C# + WPF/WinForms, либо Qt + C++. SFML вроде бы нормально работает в паре с Qt.
    Ответ написан
    Комментировать
  • Как построить полную сетку из не полной?

    Nipheris
    @Nipheris Куратор тега C#
    Тоже не совсем поменял что такое неравномерная сетка, может вам просто брать среднее из ближайших значений в той точке, где значения нет? Ну или как-то иначе интерполировать..
    Ответ написан
    Комментировать
  • Можно ли перегружать базовые типы в С++?

    @MiiNiPaa
    Нет, нельзя. В вашем случае можно написать свой компаратор и передать его шаблонным параметром в ваше дерево.
    Если оно не поддерживает кастомных компараторов, добавьте поддержку, это очень полезно.
    Ответ написан
    3 комментария
  • Что должна возвратить функция?

    @MiiNiPaa
    Если функция не должна ничего возвращать, объявите её как не возвращающую значения:
    void areaOfASquare() {
    Ответ написан
    Комментировать
  • Как правильно сравнить массивы и оценить их схожесть?

    nowm
    @nowm
    Если два массива имеют одинаковую длину, можно просто двигать по кругу первый массив и сравнивать его элементы с элементами второго. Потом можно просто выбрать максимальное совпадение и перегнать в проценты. Примерно так:

    $arr1 = [1,2,3,4,5,7,2,8];
    $arr2 = [2,9,5,5,7,2,8,1];
    
    $len = count($arr1);
    $conformity = [];
    
    for($i = 0; $i < $len; $i++) {
    	/**
    	 * $temp содержит нули в позициях, где числа в двух массивах 
    	 * по одному и тому же индексу не равны. Единицы — там, где равны.
    	 */
    	$temp = array_map(function($x,$y){return intval($x==$y);}, $arr1, $arr2);
    	
    	// Элементы полученного массива суммируются и добавляются в отчётный массив
    	$conformity[] = array_sum($temp);
    	
    	// Массив прокручивается на одну позицию
    	$arr1[] = array_shift($arr1);
    }
    
    //С помощью max($conformity) выбирается максимальное совпадение элементов
    echo sprintf("Max conformity is %s%%\n", number_format(100*(max($conformity)/$len), 2));


    Это конкретно для ситуации, когда длина «колец» одинаковая.

    Update: ещё один вариант:

    $arr1 = [1,2,3,4,5,7,2,8];
    $arr2 = [2,9,5,5,7,2,8,1];
    
    function conformity($arr1, $arr2) {
    	$len = count($arr1);
    	$max = $curr = 0;
    	
    	for($i = 0; $i < $len; $i++) {
    		array_map(function($x,$y)use(&$curr){$curr += intval($x==$y);}, $arr1, $arr2);
    		
    		if($curr == $len) {
    			return 100;
    		}
    
    		$max = $max > $curr ? $max : $curr;
    		$curr = 0;
    		
    		$arr1[] = array_shift($arr1);
    	}
    	
    	return 100*($max/$len);
    };
    
    echo sprintf("Max conformity is %s%%\n", number_format(conformity($arr1, $arr2), 2));
    Ответ написан
    6 комментариев
  • Почему при удалении значения не присваеваеться последнее id?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Перестаньте пожалуйста помечать вопросы о базах данных тегами C++ и QT.
    Ответ написан
    Комментировать
  • Программирование. Какой ВУЗ выбрать?

    Able1991
    @Able1991
    Пишу на рельсах
    Выбирай вуз в котором сильные математики, программировать все равно сам будешь учиться, а всякие матаны и терверы натренируют твою соображалку на это.
    Ответ написан
    1 комментарий
  • Почему в char (C++) записывается лишняя информация?

    SHVV
    @SHVV
    В зыбыли место под терминальный ноль. Прибавьте по одному символу каждой строке.
    Ответ написан
    8 комментариев
  • Использование switch вместе с RadioButton(и некорректная работа switch)?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Первое - почему поломался switch - уберите кавычки. C++ расценивает ваше '1' как число 49 (ASCII-код символа 1).
    Второе - как сделать реакцию switch на radiobutton - я давно не использую VCL, но возможно, у groupBox, в котором ваши переключатели лежат, можно узнать, какой из них выбран.
    Ответ написан
    1 комментарий