Профиль пользователя заблокирован в режиме readonly сроком с 30 декабря 2015 г. и навсегда по причине: Подозрение на взлом аккаунта
Ответы пользователя по тегу C++
  • Зачем нужны переменные перечисления?

    @Eddy_Em
    И почему в программировании микроконтроллеров чаще применятся конструкция #define?

    Да ладно! Не встречал как-то. Обычно define используют, если нужно 1-2 параметра определить, а уж когда их куча, то удобней enum использовать, который гарантирует, что не будет случаев, когда разным флагам одно и то же значение приписали.
    Ответ написан
    Комментировать
  • Почему не возможен синхронизованный вывод двух потоков при использовании двух мутексов?

    @Eddy_Em
    Что за чушь? Для этого мьютексы и придумали. Блокируем мьютекс родителем, выводим строчку, устанавливаем некий глобальный ключ в 1, сбрасываем мьютекс, ждем, пока ключ не будет 0. В дочернем же ждем, пока ключ не будет 1, блокируем мьютекс, выводим строчку, сбрасываем ключ, разблокируем мьютекс.
    Если используются не потоки (pthreads), а процессы (fork), то нужно убрать буферизацию или после каждой записи сбрасывать буферы.

    См. мой ответ с двумя мьютексами в комментарии к этому ответу.
    Ответ написан
  • Какими утилитами пользуетесь во время разработки c++ проектов под linux и не только?

    @Eddy_Em
    Плюсы не знаю за ненадобностью, пишу на С.
    IDE - geany (использую лишь в качестве редактора), мелкие правки делаю на месте в mcedit
    поиск по файлам - обычным grep'ом
    сборка - самописный Makefile для мелочевки, cmake для чего-нибудь посущественней (в т.ч. при использовании gettext)
    для рутины (проверка на уникальность запуска; обработка аргументов командной строки, полезные диагностические макросы и т.д.) использую самопальную мелочевку
    терминал - xfce4-terminal
    компилятор - gcc, arm-none-eabi-gcc
    gdb и valgrind не использую, т.к. не знаю их
    VCS - mercurial (сосфорж), git (гитхаб, битбакет, гитлаб); для надежности все храню одновременно в 4 указанных местах
    Ответ написан
    1 комментарий
  • Почему C всё еще актуален?

    @Eddy_Em
    Потому что лучше ЯП еще не придумали. А С++ — убожество какое-то!
    Ответ написан
    Комментировать
  • Какою директив лучше использовать для класса (#pragma once) или (#ifndef)?

    @Eddy_Em
    А я в заголовочных файлах оба варианта использую. Внешний — pragma once, внутренний — ifndef. У меня и в geany уже на ifndef вывешено автогенерирование этих "скобок". Дело в том, что еще не все компиляторы понимают pragma once, скажем, с sdcc были такие проблемы (не знаю, как сейчас — не проверял специально).
    Ответ написан
    Комментировать
  • Похоже ли это на ООП в Си?

    @Eddy_Em
    Если хочется посмотреть на жесть, то советую полистать документацию ГыТыКа. Уж хуже придумать, наверное, невозможно! Самый отличный образец того, как не надо писать код.
    Ответ написан
    2 комментария
  • Область применения C, C++, C#?

    @Eddy_Em
    Не знаю, как остальное, но С я применяю везде: от "скриптов" для рутины до всяких числодробилок и сервер-сайдов. Естественно, прошивки железок тоже только на сях.
    Ответ написан
    Комментировать
  • Как сделать звук в программе на си/си++?

    @Eddy_Em
    А операционную систему Пушкин указывать будет?
    Скажем, простейший генератор делается в OSS: открываем /dev/dsp и пишем туда...
    do{
            time = dtime() - time0;
            A[0]= 0x4000 * (1. +  cos(time * freq * 2. * M_PI));
            write(fd, &A, sizeof(A));
        }
        while( time < length);


    P.S. Попугать соседей можно так:
    cat /dev/urandom > /dev/dsp
    Ответ написан
    Комментировать
  • Как добавить "префикс" к аргументу argv[1] в С?

    @Eddy_Em
    char *p = malloc(strlen(argv[2]+4));
    sprintf(p, "my %s", argv[2]);
    argv[2] = p;
    Ответ написан
  • Как правильно переписать часть кода с Python на Си?

    @Eddy_Em
    Если списки небольшие, можно вообще в баше выдрать уникальные записи, просто отсортировав оба и запустив comm.
    Если списки большие, то я бы использовал БД, нежели самостоятельно такое выделывать.
    Если же это — лабораторная работа, то а) заполняем два строковых массива считанными данными; б) сортируем их; в) пробегаемся по отсортированным данным, избегая повторов, и выдираем совпадения. Можно готовые алгоритмы поискать.
    А еще есть самый тупой вариант: делаем mmap обоих файлов, строка за строкой читаем первый, при помощи strstr ищем это во втором, заполняем. В принципе, на коротких файлах даже этот способ никакого заметного торможения не выдаст.
    Ответ написан
  • Какой проект начать разрабатывать, чтобы продемонстрировать свои знания "работадателю"?

    @Eddy_Em
    За 2-3 недели ничего серьезного разработать все равно не получится! Не надо пыль в глаза пускать!
    Ответ написан
    5 комментариев
  • Как портировать код из Windows в Ubuntu?

    @Eddy_Em
    Забыть эту порнографию и написать заново.
    Ответ написан
    Комментировать
  • Как дела в системном программировании?

    @Eddy_Em
    А мне, например, пофиг: у меня и "скрипты" на сях, и системщина на сях, и прошивки железяк на сях, и числодробилки на сях, и CGI на сях...
    В общем, С годится для всего, чего угодно. Разве что для веба приходится еще с жабоскриптом заморачиваться. Благо, немного его.
    Ответ написан
    Комментировать
  • Как перейти с Windows на Linux для работы с C++?

    @Eddy_Em
    Быстро не получится.
    Сначала почитать пару-тройку книжек про то, как вообще в линуксе работать. Еще неплохо бы Advanced Bash Scripting почитать. Получается, минимум полгода уйдет на литературу.
    Далее обкладываемся гентушными хэндбуками, гуголом и т.п. и ставим генту.
    Помаленьку настраиваем и через год-два уже на мастдайку вообще не потянет! Главное — понять суть UNIX-way, тогда станет ясно, что мастдайка — это даже не гнилая операционная система, а некачественная прошивка для игровых приставок!
    Ответ написан
    1 комментарий
  • Какие есть типы данных c++?

    @Eddy_Em
    Я бы вообще руки отрывал за использование С++ с его жутким оверхедом на микроконтроллерах!
    В данном случае даже glibc нафиг не нужна: реализуем strcmp() вручную, аналогично поступаем для memmove и прочих полезных функций. В итоге код будет небольшим + шустрым.
    Если нужно сравнить содержимое полученной строки с эталоном, то просто пишем
    int strcmp(char *a, char *b){
      int ret = 0;
      do{ ret = (int)(*a++) - (int)(*b++); }while(!ret && *a && *b);
      return ret;
    }
    char *in = get_serial_buf(); // функция, возвращающая указатель на первый байт в кольцевом приемном буфере USART
    char *ref = "строка";
    if(!strcmp(in, ref)){ // действия, выполняемые при равенстве строк
    }

    Если нужно найти подстроку, то аналогичным образом реализуем функцию strstr:
    int strstr(char *haystack, char *needle){
      char *ret = NULL, *n = needle+1, n0 = needle[0];
      do{
        int cmp;
        if(*haystack != n0) continue;
        ret = haystack++;
        do{ cmp = (int)(*haystack++) - (int)(*n++); }while(!cmp && *haystack && *n);
        if(!cmp && !*n) break; // found
        ret = NULL; n = needle + 1;
        if(!haystack) break; // haystack ended while not found
      }while(*(++haystack));
      return ret;
    }
    Ответ написан
    6 комментариев
  • Как писать на чистом C под Linux?

    @Eddy_Em
    Поддерживаю Армянское Радио
    Сам использую три варианта: cat > file.c (для сиюминутной мелочевки), mcedit (для мелочевки, которую уже простым cat'ом сложновато набрать) и geany (полноценный IDE, но я его лишь в качестве редактора использую для больших файлов и/или проектов с кучей файлов).
    Ответ написан
    3 комментария
  • Как нарисовать круг на с++?

    @Eddy_Em
    Вот - простой способ:
    #include <GL/glut.h>
    #include <math.h>
    // compile:
    // gcc -Wall -Wextra -Werror -lglut -lGL -lm -std=gnu99 -D_GNU_SOURCE opengl.c -o openglcircle
    
    #define _U_    __attribute__((__unused__))
    // exit by ctrl+q or escape
    void keyPressed(unsigned char key, _U_ int x, _U_ int y){
    	int mod = glutGetModifiers(); // window = glutGetWindow()
    	if(mod == GLUT_ACTIVE_CTRL && key == 'q') exit(0);
    	else if(key == 27) exit(0);
    }
    
    void DrawCircle(float cx, float cy, float r, int num_segments){
    	float theta = 2. * M_PI / (float)num_segments;
    	float c, s, t, x = r, y = 0.;
    	sincosf(theta, &s, &c);
    	glBegin(GL_LINE_LOOP);
    	for(int ii = 0; ii < num_segments; ii++){
    		glVertex2f(x + cx, y + cy);
    		t = x;
    		x = c * x - s * y;
    		y = s * t + c * y;
    	}
    	glEnd();
    }
    
    void display(){
    	glClear(GL_COLOR_BUFFER_BIT);
    	DrawCircle(0.,0.,0.5,100);
    	glFlush();
    }
    
    int main(int argc, char** argv){
    	glutInit(&argc, argv);
    	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    	glutInitWindowSize(400, 400);
    	glutCreateWindow("A Simple Circle");
    	glutDisplayFunc(display);
    	glutKeyboardFunc(keyPressed);
    	glutMainLoop();
    }


    А, извиняюсь, про С++ не заметил. Ну да ладно, все равно я С++ не знаю и знать не хочу!

    P.S. А вот - чистая консолька:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *drawCircle(int R, int geom){
    	if(R > 200 || R < 1) return NULL;
    	int S, i, Y = 2 * R + 2;
    	if(geom)
    		S = Y * (R + 1);
    	else
    		S = Y * (Y - 1);
    	char *buf = malloc(S+1);
    	if(!buf) return NULL;
    	memset(buf, ' ', S);
    	buf[S] = 0;
    	for(i = Y-1; i < S; i+=Y) buf[i] = '\n';
    	inline void DrawPixel(int x, int y){
    		if(geom){
    			if(y%2==0) buf[Y * y/2 + x] = '*';
    		}else{
    			buf[Y * y + x] = '*';
    		}
    	}
    	// Bresenham's circle algorithm
    	int x = R;
    	int y = 0;
    	int radiusError = 1-x;
    	while(x >= y){
    		DrawPixel(x + R,   y + R);
    		DrawPixel(y + R,   x + R);
    		DrawPixel(-x + R,  y + R);
    		DrawPixel(-y + R,  x + R);
    		DrawPixel(-x + R, -y + R);
    		DrawPixel(-y + R, -x + R);
    		DrawPixel(x + R,  -y + R);
    		DrawPixel(y + R,  -x + R);
    		y++;
    		if (radiusError < 0){
    			radiusError += 2 * y + 1;
    		}else{
    			x--;
    			radiusError += 2 * (y - x) + 1;
    		}
    	}
    	return buf;
    }
    
    int main(int argc, char **argv){
    	int i, R;
    	char *buf;
    	for(i = 1; i < argc; i++){
    		if(!(buf = drawCircle(R = atoi(argv[i]), 1))){
    			printf("Wrong parameter %s\n", argv[i]);
    			continue;
    		}
    		printf("\nCircle with R = %d:\n%s\n", R, buf);
    		free(buf); buf = NULL;
    	}
    	return 0;
    }

    Алгоритм Брезенхэма, второй аргумент функции drawCircle задает поправку на геометрию терминала: если у вас вдруг в терминале высота буквы равна ширине, то пишите 0, если же высота в 2 раза больше ширины, пишите 1.
    Ответ написан
    Комментировать
  • Как отправить смайлики за минимальное количество операций?

    @Eddy_Em
    ceil(12/5) = 3 -> Npastes=3-1=2
    floor(12/3) = 4 -> copyOn = 4
    12-4*2=4 -> Ndeletes = 5-4 = 1

    Аналогично с любыми другими числами. Скажем, N=14, M=5:
    ceil(14/5) = 3 -> Npastes = 2
    floor(14/2) = 7 -> copyOn = 5 (т.к. мы до семи догнать не можем)
    14 - 5*2 = 4 -> Ndeletes = 1
    Ответ: CDVV
    Как определить, когда писать DC, а когда CD, понять несложно.
    А то ведь вообще получится, что я забесплатно домашнюю работу решил!
    Ответ написан
    3 комментария
  • Как научиться программировать?

    @Eddy_Em
    Если стоит такой вопрос, то, пожалуй, никак.
    Ответ написан
    Комментировать
  • Как добавить ООП C++ в проект Система Обмена Файлами Си?

    @Eddy_Em
    Если бы что-то нужно было улучшить/добавить, такого вопроса не стояло бы.
    Вывод: ничего добавлять не нужно!
    А плюсеры могут сишный интерфейс с легкостью использовать через extern "C", в отличие от сишников, которые вынуждены писать обертку, если какой-то умник библиотечку на плюсах написал, а сишного интерфейса не сделал!

    P.S. По ссылкам - жуткая мешанина из С++ и С. Это ужас!

    P.P.S. Советую сначала эту жуть исправить, чтобы она компилировалась с -Wall -Werror -Wextra. Кроме того, оформить нормальные отступы - совершенно же нечитабельно!
    И только после этого выкладывать.
    Ответ написан