[C++] бага g++?

Sachaa

main.cpp

file = fopen ("test.dat", "r");
if (file == 0)
{
printf ("cannot open 'test.dat'\n");
return 0;
}

Tetrahedronizer t(0);

printf ("1\n");

while (fscanf (file, "%d %d", &m, &n) == 2)
{
printf ("2\n");
...
}

tetra.hpp

class Tetrahedronizer
{
struct point_t;
struct face_t;
struct tetrahedron_t;
public:
typedef unsigned point_index_t;
typedef std::set<face_t>::iterator face_index_t;
typedef unsigned tetrahedron_index_t;
typedef unsigned index_t;

private:
typedef Cell* cell_t;
struct point_t
{
double p[3];
double f;
};
struct edge_t
{
point_index_t i[3];
edge_t ;
edge_t (point_index_t i0, point_index_t i1, point_index_t i2);
...
};
struct tetrahedron_t
{
point_index_t i[4];

tetrahedron_t ;
tetrahedron_t (point_index_t i0, point_index_t i1, point_index_t i2, point_index_t i3);
...
};

struct face_t
{
cell_t cell;
point_index_t i[2];

face_t ;
face_t (cell_t c, point_index_t i0, point_index_t i1);
face_t (cell_t c);
...
};

std::vector<point_t> points;
std::vector<tetrahedron_t> tetrahedrons;
std::set<face_t> faces;
std::map<cell_t, int> completed_sections;

int d;

...
};

tetrahedronizer.cpp

Tetrahedronizer::Tetrahedronizer (const int direction)
{
this->d = direction;
}

собирал без оптимизаций и прочего:
CXXFLAGS =
вот test.dat:
32 32
32 64
32 128
32 256
32 512
32 1024

запускаем:
$ ./test
1
Segmentation fault
если убрать Tetrahedronizer t(0) из кода, то все работает.
Что это может быть? На lenny этот код работал и работал правильно. На squeeze, как видно, что-то не так...

evgen5555

Так валится же после инициализации - есть уверенность, что &m и &n валидны?

Sachaa

до того кода, что я указал, в main.cpp идут только объявления переменных и там есть
int m, n;

Есть ощущение, что конструктор Tetrahedronizer вылазит за пределы своей памяти, но не понятно где.

okunek

Выложи код полностью, без троеточий.

evgen5555

конструктор не может завершиться позже первого оператора printf

Sachaa

там его дохуя много. Что конкретно нужно? методы класса - вряд ли нужны, потому что они не используются. Вот выложу целиком main.cpp до точки падения:

int main(void)
{
Cell cell;
FILE *file, *res;
int m, n;
char buf[128];
double max_h, min_h;
double t1, t2, t3;
unsigned cc;
unsigned cn;
double *pts;
int FEM_n = 23;

double cres1 = 0.0, cres2 = 0.0;
double l1res1 = 0.0, l1res2 = 0.0;

file = fopen ("test.dat", "r");
if (file == 0)
{
printf ("cannot open 'test.dat'\n");
return 0;
}

Tetrahedronizer t(0);
printf ("1\n");

while (fscanf (file, "%d %d", &m, &n) == 2)
{
printf ("2\n");
max_h = 1.0 / (double)m;
min_h = 1.0 / (double)n;
...
}
}

cell.cpp
Cell::Cell (Cell *p)
{
leaf = true;
u[0] = u[1] = v[0] = v[1] = w[0] = w[1] = 0.0;

children[0] = children[1] = children[2] = children[3] = children[4] = children[5] = children[6] = children[7] = 0;

parent = p;
if (parent)
depth = parent->depth + 1;
else
depth = 0;

center[0] = 0.5;
center[1] = 0.5;
center[2] = 0.5;

side = 1.0;

ind = -1;
}

cell.h
class Cell
{
public:
Cell *children[8];
Cell *parent;

int depth;
int ind;

double u[2];
double v[2];
double w[2];

bool leaf;
int flags;

double center[3];
double side;

Cell (Cell *parent = 0);
...
};

Sachaa

да, и что?

otets-mihail

Еще желательно printf заменить на fprintf(stderr,

evgen5555

а если так попробовать?

int foo;
Tetrahedronizer t(0);
int bar;
printf ("1 %d %d %d\n", &foo, &bar, sizeof(t;

Sachaa

 
	int foo;
Tetrahedronizer t(0);
int bar;
fprintf (stderr, "1 %p %p %d\n", &foo, &bar, sizeof(t;

while (fscanf (file, "%d %d", &m, &n) == 2)
{
fprintf (stderr, "2\n");
max_h = 1.0 / (double)m;
min_h = 1.0 / (double)n;

$ ./test
1 0x7ffff1976914 0x7ffff1976910 80
2
2
Segmentation fault
стало еще интереснее. Правда в цикле уже используется t, если отключить его использование, то все нормально. Вопрос, правда, все равно остался: в чем дело?

istran

Под gdb запускал?

Sachaa

нет, не умею им дебажить...Да и вообще, редко приходится дебажить )

Serab

Я бы покомментил страшные STL-хуйни в определении класса по одной (или пополам или посмотрел внимательно на конструкторы классов, используемых в них (где они нетривиальные).
Поведение, где для падения требуется использование t в цикле — лишнее, его рассматривать не надо, и так какой-то глюк (скорее всего порча памяти).

Sachaa

Сделал, беда в
std::map<cell_t, int> completed_sections; 

что с этим делать и куда писать? Может ли быть такое, что с вектором или сэтом такая же музыка? разбираться в STL коде может быть себе дороже :)

Serab

Разбираться в STL-коде для поиска багов не надо :grin: Надо разбираться в своем коде и понять, почему ваш класс не подходит для использования в map. Давайте код cell поближе (конструкторы, деструкторы, операторы присваивания и сравнения на всякий :grin:).

Serab

А, cell_t — указатель, тогда не надо :grin:

Sachaa

Собственно, тогда что делать? от STL отказываться не очень хочется, да и вроде он, говорят, хорошо отлажен...

Serab

не, не надо от него отказываться. Надо думать :smoke:

procenkotanya

Можно под valgrind'ом запустить, мб понимание придёт быстрее.

Sachaa

спасибо за совет :grin: могу скинуть тебе полный код, вместе подумаем, м? :grin:
я плохо умею пользоваться отладчиками по той причине, что редко (с ходу не припомню) приходится отлаживать программы на таком уровне.

Serab

кстате, фишка в том, что бага может быть все еще не в этом конкретном мапе :grin: Да и скорее всего не в нем (там простыми типами инстанцируется).

Serab

Ну скинь, у меня 20 минут есть.

iravik

а насколько хорошо использовать в качестве ключей указатель? Просто меня это почему-то смущает

Serab

ну я глубоко не задумываюсь (потому что трудно сейчас но мной завладела мысль, что это то же самое, что и целое число в некотором смысле :)

iravik

есть бредовая идея, попробуй поменять std::map на std::tr1 ::unordered_map

Sachaa

 error: ‘std::tr1’ has not been declared 

Serab

#include <tr1/unordered_map>

evgen5555

кароче запусти
gdb yourprogram
потом в ней r<Enter>
и когда вывалится (ахтунг - может и не вываливаться) жамкаеш bt<Enter>
потом смотришь стек

Serab

но ящетаю, это не оно, хотя может и починиться на некоторых тестах заменой :D

Sachaa

$ ./test
1
Segmentation fault
(убрал foo и bar, т.е. все так, как было изначально).

Sachaa

для gdb наверное ее надо как-нибудь по особому собрать?

evgen5555

йес
CXXFLAGS=-g3

Sachaa

  1

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff731eb2b in _IO_vfscanf from /lib/libc.so.6
(gdb) bt
0x00007ffff731eb2b in _IO_vfscanf from /lib/libc.so.6
0x00007ffff7325f78 in fscanf from /lib/libc.so.6
0x000000000040211a in main at test.cpp:96
(gdb)

ну и что с этим делать? :)

Serab

а, кстати, почему ты сделал вывод, что проблема в мапе? Когда его убираешь, все отрабатывает? Так это не значит. Вот если убираешь все, кроме него и не работает, то еще может быть. Я это к тому, что таки да, хуйни с STL надо убирать не делением попалам нифига, а перебрать там побольше вариантов.

Sachaa

Перепробовал кучу вариантов - работает только с не более чем тремя контейнерами oO :)

evgen5555

значит надо перед каждым сканфом следить, чтобы &m и &n не менялись

Papazyan

Очень странный адрес у либ с. Он со стеком не конфликтует случаем.

Papazyan

Слинкуй статически, это писец какой-то, как так вообще можно было туда библиотеку загрузить.

rosali

а покажи ка apt-cache policy libc6 ?
ну и gcc -v заодно

Maurog

бага g++?
бага в программе :grin:

Sachaa

 
$ apt-cache policy libc6
libc6:
Installed: 2.11.2-10
Candidate: 2.11.2-10
Version table:
*** 2.11.2-10 0
500 http://mirror.yandex.ru/debian/ squeeze/main amd64 Packages
100 /var/lib/dpkg/status

 
$ gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.5 (Debian 4.4.5-8)

Sachaa

Ошибка, очевидно, в код—компилятор, причем тут линковка?

Sachaa

как могут поменяться адреса переменных?
Отмечу, после инициализации t переменная n меняет свое значение на 0.
Прога не работает если используются одновременно 4 контейнера. С первыми 3мя программа работала и работала верно, но потом в целях изучения данной ситуации пришлось закоментить кучу кода и, как посоветовали, пробовать разные комбинации STL-контейнеров. Поэтому я не могу сказать о правильной работе с любыми тремя, но сегфолтов не происходит.

Serab

как могут поменяться адреса переменных?
ну у тебя же меняется адрес локальной переменной, когда происходит рекурсивный вызов функции. Это длинная история, если знаком с архитектурой, то в кратце так: локальные переменные отсчитываются от BP, если кто-то засрал стек, то после выхода из функции может из стека достаться левый BP, соответственно, локальные переменные будут иметь левые адреса.

Sachaa

проверил — адреса сохраняются:

$ ./test
1 0x7fff4b7034ac 0x7fff4b7034a8
1 0x7fff4b7034ac 0x7fff4b7034a8
1
Segmentation fault

вот конструкторы и операторы сравнения:
	
typedef unsigned point_index_t;
struct point_t
{
double p[3];
double f;
};
struct edge_t
{
point_index_t i[3];
edge_t { }
edge_t (point_index_t i0, point_index_t i1, point_index_t i2)
{
i[0] = i0;
i[1] = i1;
i[2] = i2;
}
};
struct tetrahedron_t
{
point_index_t i[4];

tetrahedron_t { }
tetrahedron_t (point_index_t i0, point_index_t i1, point_index_t i2, point_index_t i3)
{
i[0] = i0;
i[1] = i1;
i[2] = i2;
i[3] = i3;
}
};

struct face_t
{
cell_t cell;
point_index_t i[2];

face_t { }
face_t (cell_t c, point_index_t i0, point_index_t i1)
{
cell = c;
i[0] = i0;
i[1] = i1;
}
face_t (cell_t c)
{
cell = c;
}

bool operator == (const face_t &face) const
{
return cell == face.cell;
}

bool operator < (const face_t &face) const
{
return cell < face.cell;
}
};

evgen5555

Линковка может быть при том, что область libc (cat /proc/<PID>/maps во время выполнения) может быть расположена близко к стеку, при этом создание класса на стеке, а не на куче отжирает много памяти, сдвигая стек-пойнтер как раз к области libc, и, возможно, "заезжает" немного туда, захерачивая системные переменные.

Sachaa

Ты об этом?

Tetrahedronizer *t = new Tetrahedronizer(0);
delete t;

$ ./test 
1 0x7fffa32abf7c 0x7fffa32abf78
*** glibc detected *** ./test: free: invalid next size (fast): 0x0000000001b7e250 ***
======= Backtrace: =========
/lib/libc.so.6(+0x71ad6)[0x7ffd92c4cad6]
/lib/libc.so.6(cfree+0x6c)[0x7ffd92c5184c]
./test[0x401943]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7ffd92bf9c4d]
./test[0x401669]
======= Memory map: ========
00400000-004e7000 r-xp 00000000 08:15 131033 /programming//cell/test
006e7000-006e8000 rw-p 000e7000 08:15 131033 /programming//cell/test
01b7e000-01b9f000 rw-p 00000000 00:00 0 [heap]
7ffd8c000000-7ffd8c021000 rw-p 00000000 00:00 0
7ffd8c021000-7ffd90000000 ---p 00000000 00:00 0
7ffd92bdb000-7ffd92d33000 r-xp 00000000 08:05 97739 /lib/libc-2.11.2.so
7ffd92d33000-7ffd92f32000 ---p 00158000 08:05 97739 /lib/libc-2.11.2.so
7ffd92f32000-7ffd92f36000 r--p 00157000 08:05 97739 /lib/libc-2.11.2.so
7ffd92f36000-7ffd92f37000 rw-p 0015b000 08:05 97739 /lib/libc-2.11.2.so
7ffd92f37000-7ffd92f3c000 rw-p 00000000 00:00 0
7ffd92f3c000-7ffd92f52000 r-xp 00000000 08:05 97731 /lib/libgcc_s.so.1
7ffd92f52000-7ffd93151000 ---p 00016000 08:05 97731 /lib/libgcc_s.so.1
7ffd93151000-7ffd93152000 rw-p 00015000 08:05 97731 /lib/libgcc_s.so.1
7ffd93152000-7ffd931d2000 r-xp 00000000 08:05 97748 /lib/libm-2.11.2.so
7ffd931d2000-7ffd933d2000 ---p 00080000 08:05 97748 /lib/libm-2.11.2.so
7ffd933d2000-7ffd933d3000 r--p 00080000 08:05 97748 /lib/libm-2.11.2.so
7ffd933d3000-7ffd933d4000 rw-p 00081000 08:05 97748 /lib/libm-2.11.2.so
7ffd933d4000-7ffd934ca000 r-xp 00000000 08:07 1294364 /usr/lib/libstdc++.so.6.0.13
7ffd934ca000-7ffd936ca000 ---p 000f6000 08:07 1294364 /usr/lib/libstdc++.so.6.0.13
7ffd936ca000-7ffd936d1000 r--p 000f6000 08:07 1294364 /usr/lib/libstdc++.so.6.0.13
7ffd936d1000-7ffd936d3000 rw-p 000fd000 08:07 1294364 /usr/lib/libstdc++.so.6.0.13
7ffd936d3000-7ffd936e8000 rw-p 00000000 00:00 0
7ffd936e8000-7ffd93706000 r-xp 00000000 08:05 97751 /lib/ld-2.11.2.so
7ffd938e9000-7ffd938ed000 rw-p 00000000 00:00 0
7ffd93903000-7ffd93905000 rw-p 00000000 00:00 0
7ffd93905000-7ffd93906000 r--p 0001d000 08:05 97751 /lib/ld-2.11.2.so
7ffd93906000-7ffd93907000 rw-p 0001e000 08:05 97751 /lib/ld-2.11.2.so
7ffd93907000-7ffd93908000 rw-p 00000000 00:00 0
7fffa3299000-7fffa32ae000 rw-p 00000000 00:00 0 [stack]
7fffa3345000-7fffa3346000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

кстати, это уже интереснее

evgen5555

через валгринд надо пропускать

rosali

> Ну скинь, у меня 20 минут есть.
ну так чо воспроизводится у кого нибудь?..

Sachaa

я ему еще не кидал; тебе тоже могу кинуть. Если хочешь в этом покопаться, то куда кидать?

ppplva

Ну вы тут просто что где когда развели. Так не отлаживают.
Сделай _простой_ пример. Чтобы не было "а вот тут у меня еще кусочек кода есть, но он точно не может ни на что влиять, наверное". Минимизируй его. Если лень руками, возьми delta (delta.tigris.org). После этого станет очевидно где у тебя ошибка.
А еще лучше - запусти под валгриндом.

Sachaa

 
valgrind ./test 
выдает дофига всего, но все в таком виде:
 
==2183==  Invalid write of size 8
==2183== at 0x40349D: std::_Rb_tree<Cell*, std::pair<Cell* const, int>, std::_Select1st<std::pair<Cell* const, int> >, std::less<Cell*>, std::allocator<std::pair<Cell* const, int> > >::_Rb_tree_impl<std::less<Cell*>, false>::_Rb_tree_impl (stl_tree.h:434)
==2183== by 0x4030F3: std::_Rb_tree<Cell*, std::pair<Cell* const, int>, std::_Select1st<std::pair<Cell* const, int> >, std::less<Cell*>, std::allocator<std::pair<Cell* const, int> > >::_Rb_tree (stl_tree.h:591)
==2183== by 0x402E9B: std::map<Cell*, int, std::less<Cell*>, std::allocator<std::pair<Cell* const, int> > >::map (stl_map.h:151)
==2183== by 0x402BBF: Tetrahedronizer::Tetrahedronizer(int) (tetrahedronizer.cpp:33)
==2183== by 0x40190A: main (test.cpp:92)
==2183== Address 0x5936318 is 8 bytes after a block of size 80 alloc'd
==2183== at 0x4C24DFA: operator new(unsigned long) (vg_replace_malloc.c:261)
==2183== by 0x4018F7: main (test.cpp:92)

еще примерно столько же сообщений Invalid read of size 8
ну и вот в конце:
 
 1 0x7ff00012c 0x7ff000128 8
1
2

valgrind: m_mallocfree.c:225 (mk_plain_bszB): Assertion 'bszB != 0' failed.
valgrind: This is probably caused by your program erroneously writing past the
end of a heap block and corrupting heap metadata. If you fix any
invalid writes reported by Memcheck, this assertion failure will
probably go away. Please try that before reporting this as a bug.

нужен ли весь список?
и что с этим делать? :)

zya369

выложил бы архив с исходниками на форум - давно б тебе уже все решили наверняка

Sachaa

Проблема решена. Произошло нечто гениальное:
у меня есть 2 файла: tetra.h и tetra.hpp. Реализацию класса я делаю согласно объявлению в .hpp (т.е. в tetrahedronizer.cpp стоит #include "tetra.hpp" а вызываю согласно .h (т.е. в main.cpp стоит #include "tetra.h"). Забавно то, что линкер не ругался на это, хотя это вполне логично — класc, описанный в .h, определен. Интересная ситуация и хороший опыт :grin:
Вердикт — бага моя ) было бы совсем печально, если бы было не так :grin:
Помог совет "минимизации кода", когда я удалил tetra.h (т.к. он мне на самом деле не нужен прога не собиралась.
Всем спасибо.

Serab

Это C++ :D

elenangel

hpp
довыделывался с модным расширением, ящетаю

Sachaa

1) это не модное, а правильное расширение. Чувствуешь разницу? Может ты C++ код в .c файлах пишешь, но я использую .cpp. Если говорить о модности, то это скорее .cxx и .hxx
2) emacs и geany лучше (с точки зрения синтаксиса) подсвечивают такие файлы по умолчанию. Конечно, можно настроить и для .h, но зачем?
PS Я, кстати, не использую protected и наследование в черт пойми каких местах (это насчет выделываюсь) ;)

okunek

Да нет никакого правильного расширения для инклюдов. Компилятору насрать, что вставлять вместе препроцессорной директивы, лишь бы нашлось.
А расширения для компилируемых файлов помогают тому же gcc всего-навсего определиться с языком. Нормальные редакторы-вьюверы и h-файлы "из коробки" подсвечивают сразу правильно.

Sachaa

Причем тут "мнение" компилятора? Есть понятие — стандарт. Отклонение от стандарта — дело каждого. Компилятору также почти всегда пофигу на оформление кода в целом. Хоть в одну строчку, так сказать. Но это, повторюсь, личное дело программиста.
и как редактору C и C++ различать?
И причем тут "коробка"?

Serab

и как редактору C и C++ различать?
щетать, что C++ по умолчанию. Что из-за этого может неправильно подсветиться? Я еще понимаю, можно придумать код, который не откомпилится плюсами, но подсветке точно пох.

Sachaa

ну вот typedef A B в geany подсвечивается по разному относительно языка. В .hpp еще выделится B, например. То же самое относительно структур и классов.

serega1604

> щетать, что C++ по умолчанию. Что из-за этого может неправильно подсветиться? Я еще понимаю, можно придумать код, который не откомпилится плюсами, но подсветке точно пох.
подсветит class или public не как переменную, а как ключевое слово. в особо хитрых редакторах ещё и скажет что ошибка у тебя и выделит красным.

iravik

если явно писать gcc main.cpp, разве будет выбор языка внутри gcc? Это если, например, cmake делать, то тогда он взависимости от расширения будет делать gcc или g++

Serab

компилировать будет ок, скомпоновать не получится.

Serab

Ладно, поторопился :(

elenangel

1) это не модное, а правильное расширение. Чувствуешь разницу? Может ты C++ код в .c файлах пишешь, но я использую .cpp. Если говорить о модности, то это скорее .cxx и .hxx
правильное относительно чего? c - язык Си, c++ - язык Си Плюс Плюс; h - header. Если не ошибаюсь, насчет расширений ни в каком стандарте ничего не сказано.
2) emacs и geany лучше (с точки зрения синтаксиса) подсвечивают такие файлы по умолчанию. Конечно, можно настроить и для .h, но зачем?
Подсветка синтаксиса не должна от расширения зависить. Нужно определиться на каком языке ты пишешь и соответствующим образом настроить среду. Смешивать языки, тем более такие похожие как C и C++ - это зло.
PS Я, кстати, не использую protected и наследование в черт пойми каких местах (это насчет выделываюсь) ;)

Этого вообще не понял. Наследование и защищенные члены и методы это просто инструмент, которым надо пользоваться, если ты используешь ООП. Гордиться тем, что ты их не используешь - глупо. Как вообще можно использовать ООП без наследования?

Dasar

Подсветка синтаксиса не должна от расширения зависить. Нужно определиться на каком языке ты пишешь и соответствующим образом настроить среду. Смешивать языки, тем более такие похожие как C и C++ - это зло.
и держать две среды, если в одних проектах C, а в других C++?

iravik

защищенные члены и методы
а разве сам Страуструп не признал, что protected нахрен не нужно?

elenangel

нет, не держать 2 среды. Настройки используемого языка должны быть в файле проекта среды. Или среда cannot into per project settings?

elenangel

не знаю. давай цитату - номер тома полного собрания сочинений, глава, etc

Dasar

нет, не держать 2 среды. Настройки используемого языка должны быть в файле проекта среды. Или среда cannot into per project settings?
а если брать вариант, когда над одними и теми же проектами работают разные люди в разных редакторах?
тогда проще договориться о разных расширениях, чем о единых project settings

Sachaa

для C - .c .h
для C++ .cpp .hpp, .cxx .hxx
это трудно? это и есть стандарт. Хедеры в си++ отличаются от хедеров в си. Ок, не стандарт, а рекомендация.
Подсветка синтаксиса не должна от расширения зависить. Нужно определиться на каком языке ты пишешь и соответствующим образом настроить среду. Смешивать языки, тем более такие похожие как C и C++ - это зло.
Исторически так сложилось, что, к сожалению для тебя, .c и .h — это файлы Си. И подсвечиваться они должны согласно синтаксису Си.
Этого вообще не понял. Наследование и защищенные члены и методы это просто инструмент, которым надо пользоваться, если ты используешь ООП. Гордиться тем, что ты их не используешь - глупо. Как вообще можно использовать ООП без наследования?
:grin: часто делаешь приватные конструкторы? имхо это реально единственное место, где критично нужен private в твоей программе. В protected за 10 лет программирования я пока большого смысла не увидел, увы. Это, конечно, не касается тех случаев, когда ты пишешь какую-нибудь библиотеку аля того же STL, которой будут пользоваться. В чем я дико сомневаюсь.
Помимо полиморфизма (а зачем по сути нужно еще наследование? напомню, есть еще пара концепций ООП. Почитать можно в Б. Страуструп, например.
btw, все сторонние пакеты (хотя их не так много которые мне приходилось собирать, используют именно грамотные расширения. В основном это .hxx и .cxx для С++ и .c, .h для С.

elenangel

неа, если в одном проекте не перемешаны файлы из C и C++, то пусть каждый в своей среде определит - что он открывает в данный момент. Если перемешаны - то да, имеет смысл разделять по расширениям, но уже сама эта ситуация это не совсем хорошо.

elenangel

это и есть стандарт.
RFC please.

Sachaa

признавал, помню. И нигде в его примерах толком не было protected (кроме главы о самом protected).

elenangel

часто делаешь приватные конструкторы? имхо это реально единственное место, где критично нужен private в твоей программе. В protected за 10 лет программирования я пока большого смысла не увидел, увы
no comments

Sachaa

Да понятно, что ноу комментс. Тут, на самом деле, и нечего комментировать ;) Я вот тоже не пойму смысла твоего появления в теме, когда проблема была решена и тема уже, в общем-то, была закрыта. Может ты мне дельные советы дать хотел? Или что?
кстати, совсем забыл, еще весьма популярные .cc и .hh.

Sachaa

 
неа, если в одном проекте не перемешаны файлы из C и C++, то пусть каждый в своей среде определит - что он открывает в данный момент. Если перемешаны - то да, имеет смысл разделять по расширениям, но уже сама эта ситуация это не совсем хорошо.
 
В проектах, которыми я занимаюсь по учебе, замешаны не только Си и Си++, а еще фортран и питон, например. Такая ситуация наверное вообще катастрофическая, да? Хотя, теоретически, все можно в .c писать и не париться. Компилятор(ы) все поймет(ут) :grin: Большинство людей в моей команде (внимание!) пишут на Си++ в стиле Си. Без protected'ов. Как в индии короче :grin:
И еще, языки Си и Си++ отнюдь не похожи. Схожи синтаксисы, не более.

elenangel

В проектах, которыми я занимаюсь по учебе, замешаны не только Си и Си++, а еще фортран и питон, например.
мое сочувствие.
И еще, языки Си и Си++ отнюдь не похожи. Схожи синтаксисы, не более.

кэп, я про схожесть синтаксиса и говорил.

Sachaa

мое сочувствие.
в твоих локальных поделках (впрочем, как и в моих можно обойтись и без фортрана — понятно. Но если пишешь что-нибудь более менее разумное и математическое, то без фортрана и прекрасно отлаженных пакетов на нем не обойтись. Видимо, ты мало участвовал (если вообще участвовал) в подобных проектах.
 
кэп, я про схожесть синтаксиса и говорил.
молодец! :grin:

elenangel

мои "локальные поделки" востребованы на рынке.
"более менее разумное" далеко не всегда равно "математическое"

Sachaa

мои "локальные поделки" востребованы на рынке.
ну примерчик кинь, чтоли.
"более менее разумное" далеко не всегда равно "математическое"
я поэтому и поставил "и".

elenangel

не думаю что примерчик будет широко известен, все-таки это не десктопный рынок. конкретнее - эмуляция SNMP-устройств, транслятор all2snmp.

Papazyan

Че спорите? С++ по любому говно, прогать надо на джаве.

elenangel

толсто, бро.

Sachaa

Богачева на тебя нет :D

serega1604

>а если брать вариант, когда над одними и теми же проектами работают разные люди в разных редакторах?
// vim: set noai ts=2 sw=4 syntax=on tw=78 filetype=c: а остальные пусть
// ебуццо в гамаке в лыжах

Serab

Смешивать языки, тем более такие похожие как C и C++ - это зло.
иногда это необходимо

iravik

Пианиста на тебя нет

elenangel

Я вот тоже не пойму смысла твоего появления в теме, когда проблема была решена и тема уже, в общем-то, была закрыта. Может ты мне дельные советы дать хотел? Или что?
я так просто флуднуть зашёл. не думал что ты так близко к сердцу воспримешь.
Оставить комментарий
Имя или ник:
Комментарий: