divyang4481 / mipt-hw

Automatically exported from code.google.com/p/mipt-hw
0 stars 0 forks source link

task09_Topological Sort(Балдин) #229

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago

/baldin_dima/task09_topological/

Original issue reported on code.google.com by dmitryba...@gmail.com on 2 May 2013 at 12:55

GoogleCodeExporter commented 9 years ago
0. Warnings:
TopologicalSort.cpp: In function ‘void 
read_graph(std::vector<std::vector<int, std::allocator<int> >, 
std::allocator<std::vector<int, std::allocator<int> > > >&, std::vector<clr, 
std::allocator<clr> >&)’:
TopologicalSort.cpp:16: warning: format ‘%d’ expects type ‘int*’, but 
argument 3 has type ‘size_t*’
TopologicalSort.cpp:16: warning: format ‘%d’ expects type ‘int*’, but 
argument 4 has type ‘size_t*’
TopologicalSort.cpp:16: warning: format ‘%d’ expects type ‘int*’, but 
argument 3 has type ‘size_t*’
TopologicalSort.cpp:16: warning: format ‘%d’ expects type ‘int*’, but 
argument 4 has type ‘size_t*’
TopologicalSort.cpp: In function ‘int to_check(std::list<int, 
std::allocator<int> >&, std::vector<std::vector<int, std::allocator<int> >, 
std::allocator<std::vector<int, std::allocator<int> > > >&)’:
TopologicalSort.cpp:64: warning: comparison between signed and unsigned integer 
expressions

1. Я еще воправил >>, чтобы собиралось для 
С++2003. Не забудьте сделать svn update.

2. Запускаю решение. Падает:
x(4070) malloc: *** mmap(size=3377596641316864) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
libc++abi.dylib: terminate called throwing an exception
Abort trap: 6

Original comment by aivyu...@gmail.com on 10 May 2013 at 10:55

GoogleCodeExporter commented 9 years ago
падает на чем? на тесте для вашего графа, 
который в svn?

Original comment by dmitryba...@gmail.com on 18 May 2013 at 11:31

GoogleCodeExporter commented 9 years ago
да

Original comment by aivyu...@gmail.com on 18 May 2013 at 11:33

GoogleCodeExporter commented 9 years ago
Нашел ошибку, но у меня с ней не падало. Все 
варнинги, которые выдавались компилятором 
исправил.

Original comment by dmitryba...@gmail.com on 18 May 2013 at 11:50

GoogleCodeExporter commented 9 years ago
В С++ ведь UB не гарантирует, что будет падать 
(по определению :) ).
Так что, неправильный код может работать, и 
даже правильно работать. Но "НЕ ВСЕГДА" и "НЕ 
НА ВСЕХ ПЛАТФОРМАХ".

Original comment by aivyu...@gmail.com on 18 May 2013 at 11:52

GoogleCodeExporter commented 9 years ago
И еще... какой у Вас компилятор, просто я 
специально скачал кодеблок, где gcc? но и он 
мне столько варнингов не выдает

Original comment by dmitryba...@gmail.com on 18 May 2013 at 12:08

GoogleCodeExporter commented 9 years ago
Насколько я знаю, нет gcc под windows.

Я Собираю с опцией -Wall. Кстати, я уже писал 
об этом.

Можете попробовать сами собрать в 
командной строке:
g++ -Wall main.cpp

Original comment by aivyu...@gmail.com on 18 May 2013 at 12:25

GoogleCodeExporter commented 9 years ago
А вообще, я всегда пытаюсь собирать двумя 
способами:

1ый:
g++ -Wall -o x main.cpp

2ой (с поддержкой С++11):
g++-mp-4.7 -Wall -std=c++11 -o x main.cpp

Если каким-то собралось без 
варингом/ошибок, выбираю в пользу студента 
:)

Original comment by aivyu...@gmail.com on 18 May 2013 at 12:27

GoogleCodeExporter commented 9 years ago
В первом случае я использую g++ версии 4.2
Во втором - 4.7

Original comment by aivyu...@gmail.com on 18 May 2013 at 12:29

GoogleCodeExporter commented 9 years ago
а варнинга вида что я переменную size_t 
считываю %d считаются за варнинги?

Original comment by dmitryba...@gmail.com on 18 May 2013 at 12:33

GoogleCodeExporter commented 9 years ago
Ну конечно! %d предполагает int.
А size_t - во-первых беззнаковый, во-вторых 
может быть не 4, а 8 байт (implementation dependent).

И кстати, на моей - 64-битной системе, - это 
потенциально может привести к проезду по 
памяти.

Original comment by aivyu...@gmail.com on 18 May 2013 at 12:36

GoogleCodeExporter commented 9 years ago
Я запутался, там много всяких 
спецификаторов. size_t нужно считывать при 
помощи %ud?

Original comment by dmitryba...@gmail.com on 18 May 2013 at 12:47

GoogleCodeExporter commented 9 years ago
или %zu?

Original comment by dmitryba...@gmail.com on 18 May 2013 at 12:50

GoogleCodeExporter commented 9 years ago
Согласно тому, что пишут здесь: 
http://ru.wikipedia.org/wiki/Printf
можно попробовать так: %z

z   size_t (или эквивалентный по размеру 
знаковый тип)    указатель на эквивалентный 
по размеру size_t знаковый тип

Original comment by aivyu...@gmail.com on 18 May 2013 at 12:54

GoogleCodeExporter commented 9 years ago
Вот еще оттуда же цитата:

При написании программ на языке Си++ нужно 
внимательно относиться к выводу значений 
переменных, объявленных при помощи 
псевдонимов целочисленных типов, в 
частности size_t и ptrdiff_t; формальное 
определение стандартной библиотеки Си++ 
ссылается на первый стандарт языка Си (1990). 
Во втором стандарте языка Си (1999) для типов 
size_t и ptrdiff_t и для ряда иных типов определены 
спецификаторы размера для использования с 
подобными объектами. Многие реализации Си++ 
их также поддерживают.
  size_t s = 1;
  printf("%u", s);
Данный пример содержит ошибку, способную 
проявиться на платформах, где sizeof (unsigned int) 
не равно sizeof (size_t).
  size_t s = 1;
  printf("%zu", s);
Правильный способ вывести значение 
объекта типа size_t в языке Си.

Original comment by aivyu...@gmail.com on 18 May 2013 at 12:56

GoogleCodeExporter commented 9 years ago
ну visual studio скомпилила без варнингов, а вот 
кодеблок выдает варнинги на %z

Original comment by dmitryba...@gmail.com on 18 May 2013 at 12:58

GoogleCodeExporter commented 9 years ago
Эхъ... Сдавайте как-нибудь...

Original comment by aivyu...@gmail.com on 18 May 2013 at 12:58

GoogleCodeExporter commented 9 years ago
вот вроде %u подходит...

Original comment by dmitryba...@gmail.com on 18 May 2013 at 1:07

GoogleCodeExporter commented 9 years ago
%u - не подходит для 64bit-платформ. Ладно. 
Сдавайте так.

Original comment by aivyu...@gmail.com on 18 May 2013 at 1:26

GoogleCodeExporter commented 9 years ago
Решение принято.

Минус 20% за сдачу после дедлайна.

Original comment by aivyu...@gmail.com on 19 May 2013 at 11:44