Advertisement
Guest User

Untitled

a guest
Mar 30th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.43 KB | None | 0 0
  1. # Лабораторная работа 1
  2.  
  3. ## Установка ПО
  4. Лабораторная работа выполнялась в ОС Debian Linux. Было установлено следующее ПО:
  5. * Git
  6. * QtCreator
  7.  
  8. Остальные необходимые утилиты входят в состав системы.
  9.  
  10. ## Знакомство со стадиями компиляции
  11. Была разработана программа из индивидуального задания №1 (*commit 306b8fcf00396fd07a35c1b38b8f413b2d5e4991*), вычисляющая периметр треугольника. Программа состоит из одного файла исходного текста `task1.c`. *Размер исходного файла: 1060 байт.*
  12.  
  13. ### 1. Обработка препроцессором
  14. С помощью команды `cpp -o task1.i task1.c` исходный текст был склеен с заголовочными файлами подключенных директивой #include библиотек (поэтому размер файла значительно увеличился) и записан в новый файл `task1.i`. Объявленные с помощью #define выражения подверглись замене, а комментарии были удалены. *Размер полученного файла: 59458 байт.*
  15.  
  16. Фрагмент полученного файла:
  17. <pre>
  18. . . .
  19. # 70 "/usr/include/math.h" 2 3 4
  20. # 88 "/usr/include/math.h" 3 4
  21. # 1 "/usr/include/x86_64-linux-gnu/bits/mathcalls.h" 1 3 4
  22. # 52 "/usr/include/x86_64-linux-gnu/bits/mathcalls.h" 3 4
  23.  
  24.  
  25. extern float acosf (float __x) __attribute__ ((__nothrow__ , __leaf__)); extern float __acosf (float __x) __attribute__ ((__nothrow__ , __leaf__));
  26.  
  27. extern float asinf (float __x) __attribute__ ((__nothrow__ , __leaf__)); extern float __asinf (float __x) __attribute__ ((__nothrow__ , __leaf__));
  28.  
  29. extern float atanf (float __x) __attribute__ ((__nothrow__ , __leaf__)); extern float __atanf (float __x) __attribute__ ((__nothrow__ , __leaf__));
  30.  
  31. extern float atan2f (float __y, float __x) __attribute__ ((__nothrow__ , __leaf__)); extern float __atan2f (float __y, float __x) __attribute__ ((__nothrow__ , __leaf__));
  32. . . .
  33. </pre>
  34.  
  35. ### 2. Трансляция на язык ассемблера
  36. `c99 -S task1.i` В результате работы утилиты получен новый файл `task1.s`, содержащий команды ассемблера. *Размер файла: 2929 байт.*
  37.  
  38. Фрагмент содержимого этого файла:
  39. <pre>
  40. . . .
  41. main:
  42. .LFB1:
  43. .cfi_startproc
  44. pushq %rbp
  45. .cfi_def_cfa_offset 16
  46. .cfi_offset 6, -16
  47. movq %rsp, %rbp
  48. .cfi_def_cfa_register 6
  49. subq $64, %rsp
  50. movq stdout(%rip), %rax
  51. movl $0, %esi
  52. movq %rax, %rdi
  53. call setbuf
  54. movl $0, -8(%rbp)
  55. jmp .L4
  56. .L5:
  57. . . .
  58. </pre>
  59.  
  60. ### 3. Ассемблирование
  61. Командой `as -o task1.o task1.s` получаем бинарный объектный файл. *Размер файла: 2448 байт.*
  62.  
  63. ### 4. Компановка
  64. Компановка выполняется с помощью системной утилиты `ld`. Написанная программа использует две стандартных статических библиотеки `stdio.h` и `math.h`. Библиотека stdlib входит в состав пакета libc и подключается компановщиком с помощью ключа `-lc`, math также входит в число стандартных библиотек и подключается ключом `-lm`. Используя ключ `--entry main`, явно указываем точку входа в программу. И наконец указываем динамический загрузчик `-dynamic-linker /lib64/ld-linux-x86-64.so.2`, соответствующий архитектуре.
  65.  
  66. Полная команда: `ld -o task1 task1.o -lc -lm -dynamic-linker /lib64/ld-linux-x86-64.so.2 --entry main`.
  67.  
  68. На выходе получен исполняемый файл `task1`. *Размер файла: 4600 байт.*
  69.  
  70. ### Результаты работы компилятора
  71. `$ gcc -std=c99 -Wall -Werror -lm -g0 -o task1 task1.c
  72. $ gcc -std=c99 -Wall -Werror -lm -g3 -o task1_debug task1.c`
  73.  
  74. Компилируем два исполняемых файла с отладочной информацией и без, используя компилятор gcc.
  75.  
  76. *Размер файла task1: 8088 байт. Размер файла task1_debug: 32688 байт.*
  77.  
  78. Исследуем секции исполняемых файлов.
  79. Вывод команды `objdump -h task1`:
  80. <pre>
  81. 0 .interp 0000001c 0000000000400200 0000000000400200 00000200 2**0
  82. CONTENTS, ALLOC, LOAD, READONLY, DATA
  83. 1 .note.ABI-tag 00000020 000000000040021c 000000000040021c 0000021c 2**2
  84. CONTENTS, ALLOC, LOAD, READONLY, DATA
  85. 2 .note.gnu.build-id 00000024 000000000040023c 000000000040023c 0000023c 2**2
  86. CONTENTS, ALLOC, LOAD, READONLY, DATA
  87. 3 .gnu.hash 00000024 0000000000400260 0000000000400260 00000260 2**3
  88. CONTENTS, ALLOC, LOAD, READONLY, DATA
  89. 4 .dynsym 00000120 0000000000400288 0000000000400288 00000288 2**3
  90. CONTENTS, ALLOC, LOAD, READONLY, DATA
  91. 5 .dynstr 000000c3 00000000004003a8 00000000004003a8 000003a8 2**0
  92. CONTENTS, ALLOC, LOAD, READONLY, DATA
  93. 6 .gnu.version 00000018 000000000040046c 000000000040046c 0000046c 2**1
  94. CONTENTS, ALLOC, LOAD, READONLY, DATA
  95. 7 .gnu.version_r 00000050 0000000000400488 0000000000400488 00000488 2**3
  96. CONTENTS, ALLOC, LOAD, READONLY, DATA
  97. 8 .rela.dyn 00000030 00000000004004d8 00000000004004d8 000004d8 2**3
  98. CONTENTS, ALLOC, LOAD, READONLY, DATA
  99. 9 .rela.plt 000000a8 0000000000400508 0000000000400508 00000508 2**3
  100. CONTENTS, ALLOC, LOAD, READONLY, DATA
  101. 10 .init 0000001a 00000000004005b0 00000000004005b0 000005b0 2**2
  102. CONTENTS, ALLOC, LOAD, READONLY, CODE
  103. 11 .plt 00000080 00000000004005d0 00000000004005d0 000005d0 2**4
  104. CONTENTS, ALLOC, LOAD, READONLY, CODE
  105. 12 .text 00000332 0000000000400650 0000000000400650 00000650 2**4
  106. CONTENTS, ALLOC, LOAD, READONLY, CODE
  107. 13 .fini 00000009 0000000000400984 0000000000400984 00000984 2**2
  108. CONTENTS, ALLOC, LOAD, READONLY, CODE
  109. 14 .rodata 0000003a 0000000000400990 0000000000400990 00000990 2**2
  110. CONTENTS, ALLOC, LOAD, READONLY, DATA
  111. 15 .eh_frame_hdr 0000003c 00000000004009cc 00000000004009cc 000009cc 2**2
  112. CONTENTS, ALLOC, LOAD, READONLY, DATA
  113. 16 .eh_frame 00000114 0000000000400a08 0000000000400a08 00000a08 2**3
  114. CONTENTS, ALLOC, LOAD, READONLY, DATA
  115. 17 .init_array 00000008 0000000000600b20 0000000000600b20 00000b20 2**3
  116. CONTENTS, ALLOC, LOAD, DATA
  117. 18 .fini_array 00000008 0000000000600b28 0000000000600b28 00000b28 2**3
  118. CONTENTS, ALLOC, LOAD, DATA
  119. 19 .jcr 00000008 0000000000600b30 0000000000600b30 00000b30 2**3
  120. CONTENTS, ALLOC, LOAD, DATA
  121. 20 .dynamic 000001e0 0000000000600b38 0000000000600b38 00000b38 2**3
  122. CONTENTS, ALLOC, LOAD, DATA
  123. 21 .got 00000008 0000000000600d18 0000000000600d18 00000d18 2**3
  124. CONTENTS, ALLOC, LOAD, DATA
  125. 22 .got.plt 00000050 0000000000600d20 0000000000600d20 00000d20 2**3
  126. CONTENTS, ALLOC, LOAD, DATA
  127. 23 .data 00000010 0000000000600d70 0000000000600d70 00000d70 2**3
  128. CONTENTS, ALLOC, LOAD, DATA
  129. 24 .bss 00000010 0000000000600d80 0000000000600d80 00000d80 2**4
  130. ALLOC
  131. 25 .comment 00000039 0000000000000000 0000000000000000 00000d80 2**0
  132. CONTENTS, READONLY
  133. </pre>
  134. Что соответствует файлу, скомпилированному без отладочной информации.
  135.  
  136. Вывод команды `objdump -h task1_debug`:
  137. <pre>
  138. 0 .interp 0000001c 0000000000400200 0000000000400200 00000200 2**0
  139. CONTENTS, ALLOC, LOAD, READONLY, DATA
  140. 1 .note.ABI-tag 00000020 000000000040021c 000000000040021c 0000021c 2**2
  141. CONTENTS, ALLOC, LOAD, READONLY, DATA
  142. 2 .note.gnu.build-id 00000024 000000000040023c 000000000040023c 0000023c 2**2
  143. CONTENTS, ALLOC, LOAD, READONLY, DATA
  144. 3 .gnu.hash 00000024 0000000000400260 0000000000400260 00000260 2**3
  145. CONTENTS, ALLOC, LOAD, READONLY, DATA
  146. 4 .dynsym 00000120 0000000000400288 0000000000400288 00000288 2**3
  147. CONTENTS, ALLOC, LOAD, READONLY, DATA
  148. 5 .dynstr 000000c3 00000000004003a8 00000000004003a8 000003a8 2**0
  149. CONTENTS, ALLOC, LOAD, READONLY, DATA
  150. 6 .gnu.version 00000018 000000000040046c 000000000040046c 0000046c 2**1
  151. CONTENTS, ALLOC, LOAD, READONLY, DATA
  152. 7 .gnu.version_r 00000050 0000000000400488 0000000000400488 00000488 2**3
  153. CONTENTS, ALLOC, LOAD, READONLY, DATA
  154. 8 .rela.dyn 00000030 00000000004004d8 00000000004004d8 000004d8 2**3
  155. CONTENTS, ALLOC, LOAD, READONLY, DATA
  156. 9 .rela.plt 000000a8 0000000000400508 0000000000400508 00000508 2**3
  157. CONTENTS, ALLOC, LOAD, READONLY, DATA
  158. 10 .init 0000001a 00000000004005b0 00000000004005b0 000005b0 2**2
  159. CONTENTS, ALLOC, LOAD, READONLY, CODE
  160. 11 .plt 00000080 00000000004005d0 00000000004005d0 000005d0 2**4
  161. CONTENTS, ALLOC, LOAD, READONLY, CODE
  162. 12 .text 00000332 0000000000400650 0000000000400650 00000650 2**4
  163. CONTENTS, ALLOC, LOAD, READONLY, CODE
  164. 13 .fini 00000009 0000000000400984 0000000000400984 00000984 2**2
  165. CONTENTS, ALLOC, LOAD, READONLY, CODE
  166. 14 .rodata 0000003a 0000000000400990 0000000000400990 00000990 2**2
  167. CONTENTS, ALLOC, LOAD, READONLY, DATA
  168. 15 .eh_frame_hdr 0000003c 00000000004009cc 00000000004009cc 000009cc 2**2
  169. CONTENTS, ALLOC, LOAD, READONLY, DATA
  170. 16 .eh_frame 00000114 0000000000400a08 0000000000400a08 00000a08 2**3
  171. CONTENTS, ALLOC, LOAD, READONLY, DATA
  172. 17 .init_array 00000008 0000000000600b20 0000000000600b20 00000b20 2**3
  173. CONTENTS, ALLOC, LOAD, DATA
  174. 18 .fini_array 00000008 0000000000600b28 0000000000600b28 00000b28 2**3
  175. CONTENTS, ALLOC, LOAD, DATA
  176. 19 .jcr 00000008 0000000000600b30 0000000000600b30 00000b30 2**3
  177. CONTENTS, ALLOC, LOAD, DATA
  178. 20 .dynamic 000001e0 0000000000600b38 0000000000600b38 00000b38 2**3
  179. CONTENTS, ALLOC, LOAD, DATA
  180. 21 .got 00000008 0000000000600d18 0000000000600d18 00000d18 2**3
  181. CONTENTS, ALLOC, LOAD, DATA
  182. 22 .got.plt 00000050 0000000000600d20 0000000000600d20 00000d20 2**3
  183. CONTENTS, ALLOC, LOAD, DATA
  184. 23 .data 00000010 0000000000600d70 0000000000600d70 00000d70 2**3
  185. CONTENTS, ALLOC, LOAD, DATA
  186. 24 .bss 00000010 0000000000600d80 0000000000600d80 00000d80 2**4
  187. ALLOC
  188. 25 .comment 00000039 0000000000000000 0000000000000000 00000d80 2**0
  189. CONTENTS, READONLY
  190. 26 .debug_aranges 00000030 0000000000000000 0000000000000000 00000db9 2**0
  191. CONTENTS, READONLY, DEBUGGING
  192. 27 .debug_info 0000038e 0000000000000000 0000000000000000 00000de9 2**0
  193. CONTENTS, READONLY, DEBUGGING
  194. 28 .debug_abbrev 00000102 0000000000000000 0000000000000000 00001177 2**0
  195. CONTENTS, READONLY, DEBUGGING
  196. 29 .debug_line 0000024b 0000000000000000 0000000000000000 00001279 2**0
  197. CONTENTS, READONLY, DEBUGGING
  198. 30 .debug_str 000045e3 0000000000000000 0000000000000000 000014c4 2**0
  199. CONTENTS, READONLY, DEBUGGING
  200. 31 .debug_macro 000010d4 0000000000000000 0000000000000000 00005aa7 2**0
  201. CONTENTS, READONLY, DEBUGGING
  202. </pre>
  203. Добавились секции, содержащие отладочную информацию: *debug_aranges, debug_info, debug_abbrev, debug_line, debug_str, debug_macro*.
  204. Наличие этих разделов обеспечивает столь ощутимую разницу в размере исполняемых файлов.
  205.  
  206. С помощью утилиты *ldd* можно увидеть список динамических библиотек используемых программой:
  207. <pre>
  208. linux-vdso.so.1 (0x00007ffdbcbf3000)
  209. libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa427c76000)
  210. libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa427975000)
  211. /lib64/ld-linux-x86-64.so.2 (0x00007fa428021000)
  212. </pre>
  213. В этом списке мы наблюдаем подключенные нами с помощью компоновщика libc и libm, динамический компановщик и виртуальный динамический разделяемый объект.
  214.  
  215. ## Синтаксические ошибки
  216. Исходный код программы из второго задания добавлен в локальный репозиторий (*commit 641f94a6e5caad660a36a8e7119a64c9e561cb42*). При компиляции возникает ряд ошибок.
  217.  
  218. `$ gcc -std=c99 -Wall -Werror -g0 -o task2 task2.c`
  219. <pre>
  220. task2.c:1:1: error: unknown type name ‘include’
  221. include studio.h
  222. ^
  223. task2.c:1:15: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
  224. include studio.h
  225. ^
  226. task2.c:4:1: error: expected identifier or ‘(’ before numeric constant
  227. 3
  228. ^
  229. </pre>
  230. Компилятор приводит очень информативное сообщение об ошибке. В нем указаны: исходный файл, номер строки, номер символа, далее следует описание и классификация ошибки, после чего приводится фрагмента кода, содержащий синтаксическую ошибку.
  231.  
  232. include является директивой препроцессора и должна начинаться с "#"
  233. <pre>
  234. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  235. index 9c32318..b8513b6 100644
  236. --- a/lab_01_02/2/task2.c
  237. +++ b/lab_01_02/2/task2.c
  238. @@ -1,4 +1,4 @@
  239. -include studio.h
  240. +#include studio.h
  241. main{}
  242. (
  243. 3
  244. </pre>
  245.  
  246. Вывод компилятора:
  247. <pre>
  248. task2.c:1:10: error: #include expects "FILENAME" or <FILENAME>
  249. #include studio.h
  250. ^
  251. task2.c:2:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
  252. main{}
  253. ^
  254. task2.c:4:1: error: expected identifier or ‘(’ before numeric constant
  255. 3
  256. ^
  257. </pre>
  258.  
  259. Имя заголовочного файла следует поместить в двойные или треугольные кавычки:
  260. <pre>
  261. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  262. index 9c32318..cc18237 100644
  263. --- a/lab_01_02/2/task2.c
  264. +++ b/lab_01_02/2/task2.c
  265. @@ -1,4 +1,4 @@
  266. -#include studio.h
  267. +#include <studio.h>
  268. main{}
  269. (
  270. 3
  271. </pre>
  272.  
  273. Вывод компилятора:
  274. <pre>
  275. task2.c:1:20: fatal error: studio.h: Нет такого файла или каталога
  276. #include <studio.h>
  277. ^
  278. compilation terminated.
  279. </pre>
  280.  
  281. Библиотеки с именем studio.h не существует, очевидно, имелась в виду библиотека stdio.h:
  282. <pre>
  283. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  284. index cc18237..1f29e69 100644
  285. --- a/lab_01_02/2/task2.c
  286. +++ b/lab_01_02/2/task2.c
  287. @@ -1,4 +1,4 @@
  288. -#include <studio.h>
  289. +#include <stdio.h>
  290. main{}
  291. (
  292. 3
  293. </pre>
  294.  
  295. Вывод компилятора:
  296. <pre>
  297. task2.c:2:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
  298. main{}
  299. ^
  300. task2.c:4:1: error: expected identifier or ‘(’ before numeric constant
  301. 3
  302. ^
  303. </pre>
  304.  
  305. После имени функции должны следовать операторные круглые скобки:
  306. <pre>
  307. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  308. index 1f29e69..408438a 100644
  309. --- a/lab_01_02/2/task2.c
  310. +++ b/lab_01_02/2/task2.c
  311. @@ -1,5 +1,5 @@
  312. #include <stdio.h>
  313. -main{}
  314. +main()
  315. (
  316. 3
  317. int s;
  318. </pre>
  319.  
  320. Вывод компилятора:
  321. <pre>
  322. task2.c:4:1: error: expected declaration specifiers or ‘...’ before numeric constant
  323. 3
  324. ^
  325. task2.c:6:2: error: unknown type name ‘s’
  326. s: = 56;
  327. ^
  328. task2.c:7:2: error: unknown type name ‘print’
  329. print (Year has s weeks)
  330. ^
  331. </pre>
  332.  
  333. Одиночная константа не является корректным выражением в языке Си:
  334. <pre>
  335. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  336. index 408438a..43b853a 100644
  337. --- a/lab_01_02/2/task2.c
  338. +++ b/lab_01_02/2/task2.c
  339. @@ -1,7 +1,6 @@
  340. #include <stdio.h>
  341. main()
  342. (
  343. -3
  344. int s;
  345. s: = 56;
  346. print (Year has s weeks)
  347. </pre>
  348.  
  349. Вывод компилятора:
  350. <pre>
  351. task2.c:5:2: error: expected declaration specifiers or ‘...’ before ‘s’
  352. s: = 56;
  353. ^
  354. task2.c:6:2: error: unknown type name ‘print’
  355. print (Year has s weeks)
  356. ^
  357. </pre>
  358.  
  359. В языке Си оператором присваивания является "=":
  360. <pre>
  361. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  362. index 43b853a..861250e 100644
  363. --- a/lab_01_02/2/task2.c
  364. +++ b/lab_01_02/2/task2.c
  365. @@ -2,6 +2,6 @@
  366. main()
  367. (
  368. int s;
  369. - s: = 56;
  370. + s = 56;
  371. print (Year has s weeks)
  372. )
  373. </pre>
  374.  
  375. Вывод компилятора:
  376. <pre>
  377. task2.c:5:2: error: expected declaration specifiers or ‘...’ before ‘s’
  378. s = 56;
  379. ^
  380. task2.c:6:2: error: unknown type name ‘print’
  381. print (Year has s weeks)
  382. ^
  383. </pre>
  384.  
  385. Тело функции должно быть заключено фигурные скобки:
  386. <pre>
  387. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  388. index 861250e..a2fea5d 100644
  389. --- a/lab_01_02/2/task2.c
  390. +++ b/lab_01_02/2/task2.c
  391. @@ -1,7 +1,7 @@
  392. #include <stdio.h>
  393. main()
  394. -(
  395. +{
  396. int s;
  397. s = 56;
  398. print (Year has s weeks)
  399. -)
  400. +}
  401. </pre>
  402.  
  403. Вывод компилятора:
  404. <pre>
  405. task2.c:2:1: error: return type defaults to ‘int’ [-Werror]
  406. main()
  407. ^
  408. task2.c: In function ‘main’:
  409. task2.c:6:2: error: implicit declaration of function ‘print’ [-Werror=implicit-function-declaration]
  410. print (Year has s weeks)
  411. ^
  412. task2.c:6:9: error: ‘Year’ undeclared (first use in this function)
  413. print (Year has s weeks)
  414. ^
  415. task2.c:6:9: note: each undeclared identifier is reported only once for each function it appears in
  416. task2.c:6:14: error: expected ‘)’ before ‘has’
  417. print (Year has s weeks)
  418. ^
  419. task2.c:7:1: error: expected ‘;’ before ‘}’ token
  420. }
  421. ^
  422. task2.c:4:6: error: variable ‘s’ set but not used [-Werror=unused-but-set-variable]
  423. int s;
  424. ^
  425. cc1: all warnings being treated as errors
  426. </pre>
  427.  
  428. Тип возвращаемого функцией main значения - int:
  429. <pre>
  430. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  431. index a2fea5d..cc42c2a 100644
  432. --- a/lab_01_02/2/task2.c
  433. +++ b/lab_01_02/2/task2.c
  434. @@ -1,5 +1,5 @@
  435. #include <stdio.h>
  436. -main()
  437. +int main()
  438. {
  439. int s;
  440. s = 56;
  441. </pre>
  442.  
  443. Вывод компилятора:
  444. <pre>
  445. task2.c: In function ‘main’:
  446. task2.c:6:2: error: implicit declaration of function ‘print’ [-Werror=implicit-function-declaration]
  447. print (Year has s weeks)
  448. ^
  449. task2.c:6:9: error: ‘Year’ undeclared (first use in this function)
  450. print (Year has s weeks)
  451. ^
  452. task2.c:6:9: note: each undeclared identifier is reported only once for each function it appears in
  453. task2.c:6:14: error: expected ‘)’ before ‘has’
  454. print (Year has s weeks)
  455. ^
  456. task2.c:7:1: error: expected ‘;’ before ‘}’ token
  457. }
  458. ^
  459. task2.c:4:6: error: variable ‘s’ set but not used [-Werror=unused-but-set-variable]
  460. int s;
  461. ^
  462. cc1: all warnings being treated as errors
  463. </pre>
  464.  
  465. Функция print не объявлена, вместо нее используем printf:
  466. <pre>
  467. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  468. index cc42c2a..a8e0cc4 100644
  469. --- a/lab_01_02/2/task2.c
  470. +++ b/lab_01_02/2/task2.c
  471. @@ -3,5 +3,5 @@ int main()
  472. {
  473. int s;
  474. s = 56;
  475. - print (Year has s weeks)
  476. + printf(Year has s weeks)
  477. }
  478. </pre>
  479.  
  480. Вывод компилятора:
  481. <pre>
  482. task2.c: In function ‘main’:
  483. task2.c:6:9: error: ‘Year’ undeclared (first use in this function)
  484. printf(Year has s weeks)
  485. ^
  486. task2.c:6:9: note: each undeclared identifier is reported only once for each function it appears in
  487. task2.c:6:14: error: expected ‘)’ before ‘has’
  488. printf(Year has s weeks)
  489. ^
  490. task2.c:7:1: error: expected ‘;’ before ‘}’ token
  491. }
  492. ^
  493. task2.c:4:6: error: variable ‘s’ set but not used [-Werror=unused-but-set-variable]
  494. int s;
  495. ^
  496. cc1: all warnings being treated as errors
  497. </pre>
  498.  
  499. Printf принимает в качестве аргумента строку формата и параметры:
  500. <pre>
  501. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  502. index a8e0cc4..48ec65d 100644
  503. --- a/lab_01_02/2/task2.c
  504. +++ b/lab_01_02/2/task2.c
  505. @@ -3,5 +3,5 @@ int main()
  506. {
  507. int s;
  508. s = 56;
  509. - printf(Year has s weeks)
  510. + printf("Year has %s weeks", s)
  511. }
  512. </pre>
  513.  
  514. Вывод компилятора:
  515. <pre>
  516. task2.c: In function ‘main’:
  517. task2.c:6:2: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Werror=format=]
  518. printf("Year has %s weeks", s)
  519. ^
  520. task2.c:7:1: error: expected ‘;’ before ‘}’ token
  521. }
  522. ^
  523. cc1: all warnings being treated as errors
  524. </pre>
  525.  
  526. Требуется точка с запятой в конце оператора:
  527. <pre>
  528. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  529. index 48ec65d..eb273a5 100644
  530. --- a/lab_01_02/2/task2.c
  531. +++ b/lab_01_02/2/task2.c
  532. @@ -3,5 +3,5 @@ int main()
  533. {
  534. int s;
  535. s = 56;
  536. - printf("Year has %s weeks", s)
  537. + printf("Year has %s weeks", s);
  538. }
  539. </pre>
  540.  
  541. Вывод компилятора:
  542. <pre>
  543. task2.c: In function ‘main’:
  544. task2.c:6:2: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Werror=format=]
  545. printf("Year has %s weeks", s);
  546. ^
  547. cc1: all warnings being treated as errors
  548. </pre>
  549.  
  550. S имеет тип int, следовательно нужно использовать "%d":
  551. <pre>
  552. diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
  553. index eb273a5..95341d4 100644
  554. --- a/lab_01_02/2/task2.c
  555. +++ b/lab_01_02/2/task2.c
  556. @@ -3,5 +3,5 @@ int main()
  557. {
  558. int s;
  559. s = 56;
  560. - printf("Year has %s weeks", s);
  561. + printf("Year has %d weeks", s);
  562. }
  563. </pre>
  564.  
  565. Теперь программа успешно компилируется.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement