Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.65
HighPredator
5477 / 1843 / 343
Регистрация: 10.12.2010
Сообщений: 5,435
Записей в блоге: 3
#1

Coding style или нет - C++

09.02.2012, 19:56. Просмотров 3013. Ответов 60
Метки нет (Все метки)

Услышал сегодня от коллеги такую интересную вещь: есть блоки кода ограниченные командными скобками {}. Так вот, рекомендуется переменные, используемые в блоках и только в них, объявлять в таких блоках. Я например, как правило объявляю переменные в начале подпрограмм. Привычка. Вопрос такой: это чисто coding style рекомендация или есть какое-то практическое значение подобного действия?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2012, 19:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Coding style или нет (C++):

Ошибка с массивами, хотя формально её нет (похожи ли массивы или нет?) - C++
Всем доброго времени суток!) В общем имею такую великолепную чтуку, она должна говорить мне, похожи ли массивы или нет, массив должен...

Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если требуемых слов нет - C++
Дана последовательность символов, состоящая из слов. Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если...

Как разбить код на 2 функции: Coding и Decoding? - C++
#include <iostream> #include <vector> #include <map> #include <list> #include <fstream> using namespace std; ...

Где можго почитать о Coding Convention для C++ на русскос языке? - C++
Я не смог нагуглить.

Как найти текст в файле и возвратить 0 или 1 в зависимости от того,найдено или нет? - C++
bool fnd(char* fn,string stf) { string s; ifstream ifs(fn); while (!ifs.eof()) { getline(ifs,s); ...

Вывести True или False в зависимости от того, имеют три заданных целых числа одинаковую четность или нет - C++
Всем привет! Помогите, пожалуйста в решении задачи. Знаю, что задачи более,или менее лёгкие,но я в c++ почти ничего не смыслю, а лабы...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.02.2012, 13:24 #31
Цитата Сообщение от AzaKendler Посмотреть сообщение
привел выше.
А от s память освобождать не надо?
К тому же он не отображает сути проблемы, возникшей при вызове ~basic_string().
code
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
soon@desktop:~/Src/C++/main$ cat main1.cpp
class Foo
{
    int* _ptr;
 
public:
    Foo(): _ptr(new int(3))
    {
 
    }
 
    ~Foo()
    {
        delete _ptr;
    }
};
 
int main()
{
    Foo f;
    f.~Foo();
    return 0;
}
soon@desktop:~/Src/C++/main$ g++ main1.cpp -o main && ./main
*** glibc detected *** ./main: double free or corruption (fasttop): 0x09d64008 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x6ebc2)[0xd24bc2]
/lib/i386-linux-gnu/libc.so.6(+0x6f862)[0xd25862]
/lib/i386-linux-gnu/libc.so.6(cfree+0x6d)[0xd2894d]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xbbc80f]
./main[0x8048613]
./main[0x80485cf]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xccf113]
./main[0x80484d1]
======= Memory map: ========
00461000-0047f000 r-xp 00000000 08:01 5899162    /lib/i386-linux-gnu/ld-2.13.so
0047f000-00480000 r--p 0001d000 08:01 5899162    /lib/i386-linux-gnu/ld-2.13.so
00480000-00481000 rw-p 0001e000 08:01 5899162    /lib/i386-linux-gnu/ld-2.13.so
00773000-0078f000 r-xp 00000000 08:01 5899196    /lib/i386-linux-gnu/libgcc_s.so.1
0078f000-00790000 r--p 0001b000 08:01 5899196    /lib/i386-linux-gnu/libgcc_s.so.1
00790000-00791000 rw-p 0001c000 08:01 5899196    /lib/i386-linux-gnu/libgcc_s.so.1
009ae000-009d6000 r-xp 00000000 08:01 5899205    /lib/i386-linux-gnu/libm-2.13.so
009d6000-009d7000 r--p 00028000 08:01 5899205    /lib/i386-linux-gnu/libm-2.13.so
009d7000-009d8000 rw-p 00029000 08:01 5899205    /lib/i386-linux-gnu/libm-2.13.so
00b0f000-00bed000 r-xp 00000000 08:01 3806517    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
00bed000-00bee000 ---p 000de000 08:01 3806517    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
00bee000-00bf2000 r--p 000de000 08:01 3806517    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
00bf2000-00bf3000 rw-p 000e2000 08:01 3806517    /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
00bf3000-00bfa000 rw-p 00000000 00:00 0 
00cb6000-00e2c000 r-xp 00000000 08:01 5899175    /lib/i386-linux-gnu/libc-2.13.so
00e2c000-00e2e000 r--p 00176000 08:01 5899175    /lib/i386-linux-gnu/libc-2.13.so
00e2e000-00e2f000 rw-p 00178000 08:01 5899175    /lib/i386-linux-gnu/libc-2.13.so
00e2f000-00e32000 rw-p 00000000 00:00 0 
00f5d000-00f5e000 r-xp 00000000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 08:01 797557     /home/soon/Src/C++/main/main
08049000-0804a000 rw-p 00000000 08:01 797557     /home/soon/Src/C++/main/main
09d64000-09d85000 rw-p 00000000 00:00 0          [heap]
b7600000-b7621000 rw-p 00000000 00:00 0 
b7621000-b7700000 ---p 00000000 00:00 0 
b779f000-b77a2000 rw-p 00000000 00:00 0 
b77b3000-b77b5000 rw-p 00000000 00:00 0 
bf8b6000-bf8d7000 rw-p 00000000 00:00 0          [stack]
Aborted
soon@desktop:~/Src/C++/main$
Bers
Заблокирован
10.02.2012, 13:30 #32
Цитата Сообщение от soon Посмотреть сообщение
К тому же он не отображает сути проблемы, возникшей при вызове ~basic_string().
В приведенном коде, проблема не в том, что был явно вызван диструктор. А в том, что он в принципе был неправильно записан. Указатель не был переведён в "не рабочее" состояние.
Если бы программист после удаления, занулил бы его, то повторный вызов диструктора не привел бы к трагедии.

Что до самих явно вызываемых диструкторов, имхо - это плохая идея, если конечно, вы не пишите какой нибудь пул памяти с new placement
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
10.02.2012, 13:35 #33
Цитата Сообщение от soon Посмотреть сообщение
А от s память освобождать не надо?
не надо - это синтаксис размещения.
и в данном случае s->~Test() служит для очистки, на тот случай если в Test() были переменные указывающие на динамически созданные объекты.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Test
{
        Test():a(40){};
        ~Test(){};
        int a;
};
 
 
int main()
{ 
        char* b = new char [100];
        Test* s = new(b) Test; 
      
        //s->~Test();
        delete [] b;// в этом пример оператор "зачистит" и члены тест.
        return 0;
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Test
{
        Test():a(new int(40)){};
        ~Test(){delete a; a=0;};
        int* a;
};
 
int main()
{ 
        char* b = new char [100];
        Test* s = new(b) Test; 
      
        s->~Test();
        delete [] b;// в этом пример оператор не сможет сам провести очистку вызов деструктора обязателен
        return 0;
}
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 378
Регистрация: 30.03.2009
Сообщений: 16,156
Записей в блоге: 26
10.02.2012, 13:46 #34
Цитата Сообщение от Bers Посмотреть сообщение
Вообще, формулировка "большое количество кода" намекает, что "код делает очень многое"
Я не совсем правильно выразился. У тебя там может быть и три строки кода, которые в цикле из миллиона итераций вызывают другую функцию, в которой вызываются ещё функции и т.п. Но эти три строки кода будут работать долго. И всё это время память для уже ненужного объекта будет висеть занятой. Только потому, что это как бы красиво выглядит в исходнике

Цитата Сообщение от Bers Посмотреть сообщение
А в несовершенном мире говнокод оказывается жизнеспособнее красивого кода. Потому что тупо некогда заниматься красивостями
Как раз-таки нет. Дофига ситуаций, когда распиливание одной процедуры на более мелкие приводит к гавнокоду. Поэтому нельзя к программированию подходить со всякими догмами типа "функция ДОЛЖНА быть короткой", "НЕЛЬЗЯ использовать goto" и т.д. В каждом конкретном случае надо принимать конкретное решение, являющееся оптимальным в данном конкретном случае

Цитата Сообщение от AzaKendler Посмотреть сообщение
спасибо. не обращал внимание. это обрезает область видимости оказывается. просто скобки.
интересный момент
Не просто область видимости, но ещё и время жизни автоматического объекта

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool x;
 
// Допустим, так сложилось, что во время работы нашей программы "x" всегда
// равно "false" (пользователь не пытался использоватьнекоторые фичи программы)
x = false;
...
 
if (x)
{
  // В этот блок мы никогда не попадём, а следовательно, объект никогда не будет
  // создан (т.е. никогда для него не вызовутся конструктор и деструктор). Это справедливо
  // как для автоматического объекта, так и для статического, который помещён вовнутрь
  // лексического блока. Т.е. сэкономили память и время исполнения
  std::string str;
  ...
}
Цитата Сообщение от AzaKendler Посмотреть сообщение
не подойдет для такого управления?
Не подойдёт, потому что компилятор по достижении закрывающей фигурной скобки автоматически влепит вызов деструктора (и на это ты повлиять никак не можешь). Таким образом, у тебя будет два вызова деструктора. Деструктор ручками можно вызывать ТОЛЬКО в том случае, если динамический объект создавался при помощи конструкции "placement new"
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
10.02.2012, 13:48 #35
soon, конкретно по твоей ошибке тебе написали уже


C++
1
2
3
4
5
~Foo()
    {
        delete _ptr;
        _ptr = 0; // обнуляем и второй вызов пройдет безболезненно
    }
пробуй

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Деструктор ручками можно вызывать ТОЛЬКО в том случае
ну вот мы вызываем же в примерах.

и если кровь из носа надо очистить память на которую ссылаются члены класса то вызов деструктора в том месте сделает это. а то что он вызовется второй раз в холостую это конечно не очень хорошо, но краша не будет если в самом деструкторе все ровно, наверно это и имелось ввиду под неудобством?
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.02.2012, 13:56 #36
AzaKendler, деструктор не предназначен для того, чтобы вызывать его вручную. Соответственно обнулять указатель в нём просто так никто не будет, а из этого и следует падение программы, когда пытаемся к указателю на память, которая уже не принадлежит программе, применить delete.
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
10.02.2012, 13:58 #37
Цитата Сообщение от silent_1991 Посмотреть сообщение
деструктор не предназначен для того, чтобы вызывать его вручную. Соответственно обнулять указатель в нём просто так никто не будет
что то ты меня удивил. как это обнулять никто не будет - этож золотое правило для экспертов с++.
почему не предназначен, можешь растолковать?
он постоянно вызывается вручную в stl.
только мы как пользователи, например vector, это не видим, если не захотим пройтись в дебаге по всему что там происходит, ну или почитать про это
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.02.2012, 14:00 #38
AzaKendler, он вызывается вручную в стл в аллокаторае. А вам уже не раз написали, что аллокатор для создания объекта использует placement new, поэтому проблемы с двойным вызовом конструктора там нет.
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 378
Регистрация: 30.03.2009
Сообщений: 16,156
Записей в блоге: 26
10.02.2012, 14:00 #39
Цитата Сообщение от AzaKendler Посмотреть сообщение
и если кровь из носа надо очистить память на которую ссылаются члены класса то вызов деструктора в том месте сделает это
Если вопрос стоит как кровь из носа, то вместо использования объекта использовать динамическое выделение памяти. И искусственно в это место засовывать placement new вовсе не к чему. Говоря про удобство и неудобство я имел в виду работу именно с ПЕРЕМЕННЫМИ типа класса, для которых компилятор АВТОМАТИЧЕСКИ вызывает конструкторы и деструкторы. Т.е. у тебя нет никакой возможности забыть вызвать деструктор

А проблема в общем случае не в том, чтобы освободить память, занимаемую экземпляром класса (как ты приводил в сових примерах). Экземпляр класса std::string занимает совсем немного места. Проблема в том, что экземпляр класса в момент создания внутри себя заводит динамически выделяемую память, которую можно освободить только удалив экземпляр класса.

Т.е. на Си я могу написать код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct String str;
...
 
/* Как бы вызов конструктора, который я могу вставлять там, где мне заблагорассудится */
InitString (&str);
 
/* Поработали с экземпляром */
 
/* Как бы вызов деструктора, который я также могу вставлять там, где мне заблагорассудится */
ClearString (&str);
 
/* И могу даже повторно вызвать как бы конструктор (ибо захотелось мне повторно
 * проинициализировать существующий объект) */
InitString (&str);
На Си++ это выразить никак нельзя. Потому что конструктор может вызываться только автоматически и только при создании переменной. Аналогично деструктор. Единственное, что можно сделать в Си++ - так это вместо объектов использовать указатели и рожать-удалять объекты через new/delete, что, вобщем-то, совсем неэффективно. Понятно, что ровно такой код с вызовами функций можно написать и на Си++, но это уже как бы не есть программирование на Си++
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
10.02.2012, 14:07 #40
silent_1991, там вообще проблем нет. мы рассматриваем можно не можно.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
динамически выделяемую память, которую можно освободить только удалив экземпляр класса.
я как раз про это и писал в примере. когда в классе есть указатель на динамически созданный объект, а деструкторе его удаление и обнуление указателя.

конструктор с++ позволяет вызвать явно если это необходимо. explicit.

Добавлено через 4 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Говоря про удобство и неудобство я имел в виду работу именно с ПЕРЕМЕННЫМИ типа класса, для которых компилятор АВТОМАТИЧЕСКИ вызывает конструкторы и деструкторы. Т.е. у тебя нет никакой возможности забыть вызвать деструктор
понятно. мне кажется в стринге в деструкторе как раз таки присутсвует код очищающий память динамического буфера и обнуляющий указатель. я это имел ввиду когда шла речь о стринге и о том, что требуется как то очистить его не используя { }.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
Но теперь
* // деструктор вызовется только в конце процедуры, а потребляемая string'ом память
* // всё это время будет висеть мёртвым грузом.
вот если от этого надо избавится, то можно использовать неудобное средство - вызвать деструктор. динамический буфер будет уничтожен. память таки осовбодится. другое дело что последующая попытка использования очищенного стринга может привести к ошибке. но ведь не об этом шла речь.
это наверно какой то случай мегаэкономии памяти должен быть, тогда лучше стринг наверно не использовать там
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 378
Регистрация: 30.03.2009
Сообщений: 16,156
Записей в блоге: 26
10.02.2012, 14:08 #41
Цитата Сообщение от AzaKendler Посмотреть сообщение
я как раз про это и писал в примере. когда в классе есть указатель на динамически созданный объект, а деструкторе его удаление и обнуление указателя
Ну и чтобы инициализация-деинициализация была в руках программиста, нужно либо все экземпляры создавать динамически, либо заниматься онанизмом и использовать placement new (в качестве буфера можно использовать обычный локальный массив, не прибегая к динамической памяти). В обоих случаях всё сводится к тому, что нужно извращаться.
Bers
Заблокирован
10.02.2012, 14:10 #42
Цитата Сообщение от Evg Посмотреть сообщение
... Но эти три строки кода будут работать долго. И всё это время память для уже ненужного объекта будет висеть занятой. Только потому, что это как бы красиво выглядит в исходнике
Ну ежели, это не критично для всего приложения - почему бы и нет? Они жить не мешают. А вот красивость - это бонус.

Но у меня другой подход - бритва Оккама. Если можно что то не делать - этого делать не нужно.
Если данному куску кода не нужен данный объект, то нет ни одной причины вообще создавать этот ненужный объект.

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

Иногда бывают особые моменты, когда могут потребоваться дополнительные временные объекты.
На самом деле требуются некие услуги, которые можно через них поиметь, а не сами объекты.
Можно просто сделать отдельную inline функцию, на которую свалить задачу по предоставлению данной услуги. Это оградит основной алгоритм от ненужных ему подробностей реализации, и избавит от присутствия совершенно не нужных ему временных объектов:

//здесь кучка кода
...
выходные_данные = foo(входные); //мелкая услуга
...
//остальной код
...
выходные_данные = foo(входные); //ещё какая нибудь мелкая услуга
...

С точки зрения "большого" куска кода, все объекты которые он используют - нужны.
Временных, или лишних не существует. Как работают мелкие поставщики услуг - их собственные трудности.
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
10.02.2012, 14:14 #43
Цитата Сообщение от Evg Посмотреть сообщение
Ну и чтобы инициализация-деинициализация была в руках программиста, нужно либо все экземпляры создавать динамически, либо заниматься онанизмом и использовать placement new (в качестве буфера можно использовать обычный локальный массив, не прибегая к динамической памяти). В обоих случаях всё сводится к тому, что нужно извращаться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Foo
{
    int* _ptr;
 
public:
    Foo(): _ptr(new int[10000])
    {
 
    }
 
    ~Foo()
    {
        delete [] _ptr;
        _ptr = 0;
    }
};
 
int main()
{
    Foo f;
 
//код
 
//а тут надо очень очень очень сэкономить и избавиться от того что висит в памяти. 
    f.~Foo();
//это все скорее неправильно и лучше сделать очищающую функцию, но речь об том как деструктором
//код
//код
//код
 
    return 0;
}
и правда не очень все это. но возможность есть
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 378
Регистрация: 30.03.2009
Сообщений: 16,156
Записей в блоге: 26
10.02.2012, 14:23 #44
Цитата Сообщение от Bers Посмотреть сообщение
Ну ежели, это не критично для всего приложения - почему бы и нет? Они жить не мешают. А вот красивость - это бонус
А это и есть причина появления гавнокода. Тут оказалось не совсем критичным, там окзалось не совсем критичным. А потом наберётся этих ситуаций целая куча и программа начинает работать в два раза медленнее и жрать памяти в два раза больше

Цитата Сообщение от Bers Посмотреть сообщение
Если данному куску кода не нужен данный объект, то нет ни одной причины вообще создавать этот ненужный объект.
Дык проблема в том, что он был нужен чуть ранееи дальше появляется точка, где от объекта уже можно избавиться, т.к. по результату его использования было вычислено нужное значение, которое будет использовано в цикле из миллиона итераций. Я использую в примере string весьма условно (просто как некий экземпляр некоего класса)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void func1 (int x1, int x2, int x3)
{
  std::string str;
 
  str += x1;
  str += x2;
  str += x3;
 
  int len = str.length();
 
  // Здесь str нам больше не нужен. Но поскольку у тебя принципиально нет никаких
  // переменных влексических блоках, то на время работы цикла память, отжираемая
  // экземпляром str, будет необоснованно болтаться как использованная
 
  for (i = 0; i < 1000000; i++)
    func2 (len);
}
Далее по твоей логике код работы с str надо выносить в отдельную функцию, в которую передать три параметра. Ну это в моём простом случае параметрв три, а может быть их и больше. Могут быть промежуточные значения, которые используются в виде локалов данной функции, которые придётся передавать в функцию. Могут быть несколько объектов типа str. И в итоге из-за принципиальных соображений один нормально читаемый код в виде одной нормально читаемой функции првреатится в десяток функций, в которых ориентироваться будет намного сложнее.

Добавлено через 4 минуты
Цитата Сообщение от AzaKendler Посмотреть сообщение
но возможность есть
Так твой код не рабочий. Он работает по счастливой случайности, что в дестркуторе ты вставил "_ptr=0", из-за чего повторный вызов "delete [] _ptr" не сломался. А ты воткни в деструктор печать, работу с файлом или чем-нибудь ещё, что имеет внешнее проявление. И увидишь, что завершающие действия у тебя выполняются два раза вместо одного
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
10.02.2012, 14:32 #45
Evg
Так твой код не рабочий. Он работает по счастливой случайности, что в дестркуторе ты вставил "_ptr=0", из-за чего повторный вызов "delete [] _ptr" не сломался. А ты воткни в деструктор печать, работу с файлом или чем-нибудь ещё, что имеет внешнее проявление. И увидишь, что завершающие действия у тебя выполняются два раза вместо одного
он рабочий только потому что обнулен указатель. да деструктор вызовется 2 раза. и 2 раза выйдет на печать бодяга.
но ты ведь вел речь об экономии памяти в стринге ну и о том что он будет висеть до конца процедуры. для этого там есть clear(). и динамическая память очистится. с деструкторами это уже так полезли не в ту сторону. изначальная мысль - в с++ нет удобных средств для очистки памяти пока идет выполнение программы со строкой из твоего примера. возражаю они ЕСТЬ, это либо предусмотренные функции очистки в библиотченых классах. либо кривизна с деструктором.
ну а сам по себе стринг много места не занимает - ты сам писал. и уж если и это критично то можно не использовать стринг.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2012, 14:32
Привет! Вот еще темы с ответами:

Опечатка или нет? - C++
class my_class { public: my_class() { a = b = 0; } my_class(constint...

симафор или нет? - C++
ПРивет всем! написал программу для следующего задания с использованием симафора: Написать программу, создающую два потока. Оба...

C++11 в production, да или нет? - C++
Всем привет. Выбил все-таки разрешение юзать С++11 на работе, по мелочи, лямбды вместо предикатов, range-based-for, auto. Сегодня наш тех....

Палиндром или нет? - C++
Определить, является ли заданное натуральное число палиндромом, т.е. таким, десятичная запись которого читается одинаково слева направо и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.02.2012, 14:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru