Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Лабораторная работа 1
- ## Установка ПО
- Лабораторная работа выполнялась в ОС Debian Linux. Было установлено следующее ПО:
- * Git
- * QtCreator
- Остальные необходимые утилиты входят в состав системы.
- ## Знакомство со стадиями компиляции
- Была разработана программа из индивидуального задания №1 (*commit 306b8fcf00396fd07a35c1b38b8f413b2d5e4991*), вычисляющая периметр треугольника. Программа состоит из одного файла исходного текста `task1.c`. *Размер исходного файла: 1060 байт.*
- ### 1. Обработка препроцессором
- С помощью команды `cpp -o task1.i task1.c` исходный текст был склеен с заголовочными файлами подключенных директивой #include библиотек (поэтому размер файла значительно увеличился) и записан в новый файл `task1.i`. Объявленные с помощью #define выражения подверглись замене, а комментарии были удалены. *Размер полученного файла: 59458 байт.*
- Фрагмент полученного файла:
- <pre>
- . . .
- # 70 "/usr/include/math.h" 2 3 4
- # 88 "/usr/include/math.h" 3 4
- # 1 "/usr/include/x86_64-linux-gnu/bits/mathcalls.h" 1 3 4
- # 52 "/usr/include/x86_64-linux-gnu/bits/mathcalls.h" 3 4
- extern float acosf (float __x) __attribute__ ((__nothrow__ , __leaf__)); extern float __acosf (float __x) __attribute__ ((__nothrow__ , __leaf__));
- extern float asinf (float __x) __attribute__ ((__nothrow__ , __leaf__)); extern float __asinf (float __x) __attribute__ ((__nothrow__ , __leaf__));
- extern float atanf (float __x) __attribute__ ((__nothrow__ , __leaf__)); extern float __atanf (float __x) __attribute__ ((__nothrow__ , __leaf__));
- extern float atan2f (float __y, float __x) __attribute__ ((__nothrow__ , __leaf__)); extern float __atan2f (float __y, float __x) __attribute__ ((__nothrow__ , __leaf__));
- . . .
- </pre>
- ### 2. Трансляция на язык ассемблера
- `c99 -S task1.i` В результате работы утилиты получен новый файл `task1.s`, содержащий команды ассемблера. *Размер файла: 2929 байт.*
- Фрагмент содержимого этого файла:
- <pre>
- . . .
- main:
- .LFB1:
- .cfi_startproc
- pushq %rbp
- .cfi_def_cfa_offset 16
- .cfi_offset 6, -16
- movq %rsp, %rbp
- .cfi_def_cfa_register 6
- subq $64, %rsp
- movq stdout(%rip), %rax
- movl $0, %esi
- movq %rax, %rdi
- call setbuf
- movl $0, -8(%rbp)
- jmp .L4
- .L5:
- . . .
- </pre>
- ### 3. Ассемблирование
- Командой `as -o task1.o task1.s` получаем бинарный объектный файл. *Размер файла: 2448 байт.*
- ### 4. Компановка
- Компановка выполняется с помощью системной утилиты `ld`. Написанная программа использует две стандартных статических библиотеки `stdio.h` и `math.h`. Библиотека stdlib входит в состав пакета libc и подключается компановщиком с помощью ключа `-lc`, math также входит в число стандартных библиотек и подключается ключом `-lm`. Используя ключ `--entry main`, явно указываем точку входа в программу. И наконец указываем динамический загрузчик `-dynamic-linker /lib64/ld-linux-x86-64.so.2`, соответствующий архитектуре.
- Полная команда: `ld -o task1 task1.o -lc -lm -dynamic-linker /lib64/ld-linux-x86-64.so.2 --entry main`.
- На выходе получен исполняемый файл `task1`. *Размер файла: 4600 байт.*
- ### Результаты работы компилятора
- `$ gcc -std=c99 -Wall -Werror -lm -g0 -o task1 task1.c
- $ gcc -std=c99 -Wall -Werror -lm -g3 -o task1_debug task1.c`
- Компилируем два исполняемых файла с отладочной информацией и без, используя компилятор gcc.
- *Размер файла task1: 8088 байт. Размер файла task1_debug: 32688 байт.*
- Исследуем секции исполняемых файлов.
- Вывод команды `objdump -h task1`:
- <pre>
- 0 .interp 0000001c 0000000000400200 0000000000400200 00000200 2**0
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 1 .note.ABI-tag 00000020 000000000040021c 000000000040021c 0000021c 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 2 .note.gnu.build-id 00000024 000000000040023c 000000000040023c 0000023c 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 3 .gnu.hash 00000024 0000000000400260 0000000000400260 00000260 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 4 .dynsym 00000120 0000000000400288 0000000000400288 00000288 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 5 .dynstr 000000c3 00000000004003a8 00000000004003a8 000003a8 2**0
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 6 .gnu.version 00000018 000000000040046c 000000000040046c 0000046c 2**1
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 7 .gnu.version_r 00000050 0000000000400488 0000000000400488 00000488 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 8 .rela.dyn 00000030 00000000004004d8 00000000004004d8 000004d8 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 9 .rela.plt 000000a8 0000000000400508 0000000000400508 00000508 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 10 .init 0000001a 00000000004005b0 00000000004005b0 000005b0 2**2
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 11 .plt 00000080 00000000004005d0 00000000004005d0 000005d0 2**4
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 12 .text 00000332 0000000000400650 0000000000400650 00000650 2**4
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 13 .fini 00000009 0000000000400984 0000000000400984 00000984 2**2
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 14 .rodata 0000003a 0000000000400990 0000000000400990 00000990 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 15 .eh_frame_hdr 0000003c 00000000004009cc 00000000004009cc 000009cc 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 16 .eh_frame 00000114 0000000000400a08 0000000000400a08 00000a08 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 17 .init_array 00000008 0000000000600b20 0000000000600b20 00000b20 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 18 .fini_array 00000008 0000000000600b28 0000000000600b28 00000b28 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 19 .jcr 00000008 0000000000600b30 0000000000600b30 00000b30 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 20 .dynamic 000001e0 0000000000600b38 0000000000600b38 00000b38 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 21 .got 00000008 0000000000600d18 0000000000600d18 00000d18 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 22 .got.plt 00000050 0000000000600d20 0000000000600d20 00000d20 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 23 .data 00000010 0000000000600d70 0000000000600d70 00000d70 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 24 .bss 00000010 0000000000600d80 0000000000600d80 00000d80 2**4
- ALLOC
- 25 .comment 00000039 0000000000000000 0000000000000000 00000d80 2**0
- CONTENTS, READONLY
- </pre>
- Что соответствует файлу, скомпилированному без отладочной информации.
- Вывод команды `objdump -h task1_debug`:
- <pre>
- 0 .interp 0000001c 0000000000400200 0000000000400200 00000200 2**0
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 1 .note.ABI-tag 00000020 000000000040021c 000000000040021c 0000021c 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 2 .note.gnu.build-id 00000024 000000000040023c 000000000040023c 0000023c 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 3 .gnu.hash 00000024 0000000000400260 0000000000400260 00000260 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 4 .dynsym 00000120 0000000000400288 0000000000400288 00000288 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 5 .dynstr 000000c3 00000000004003a8 00000000004003a8 000003a8 2**0
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 6 .gnu.version 00000018 000000000040046c 000000000040046c 0000046c 2**1
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 7 .gnu.version_r 00000050 0000000000400488 0000000000400488 00000488 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 8 .rela.dyn 00000030 00000000004004d8 00000000004004d8 000004d8 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 9 .rela.plt 000000a8 0000000000400508 0000000000400508 00000508 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 10 .init 0000001a 00000000004005b0 00000000004005b0 000005b0 2**2
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 11 .plt 00000080 00000000004005d0 00000000004005d0 000005d0 2**4
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 12 .text 00000332 0000000000400650 0000000000400650 00000650 2**4
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 13 .fini 00000009 0000000000400984 0000000000400984 00000984 2**2
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 14 .rodata 0000003a 0000000000400990 0000000000400990 00000990 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 15 .eh_frame_hdr 0000003c 00000000004009cc 00000000004009cc 000009cc 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 16 .eh_frame 00000114 0000000000400a08 0000000000400a08 00000a08 2**3
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 17 .init_array 00000008 0000000000600b20 0000000000600b20 00000b20 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 18 .fini_array 00000008 0000000000600b28 0000000000600b28 00000b28 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 19 .jcr 00000008 0000000000600b30 0000000000600b30 00000b30 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 20 .dynamic 000001e0 0000000000600b38 0000000000600b38 00000b38 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 21 .got 00000008 0000000000600d18 0000000000600d18 00000d18 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 22 .got.plt 00000050 0000000000600d20 0000000000600d20 00000d20 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 23 .data 00000010 0000000000600d70 0000000000600d70 00000d70 2**3
- CONTENTS, ALLOC, LOAD, DATA
- 24 .bss 00000010 0000000000600d80 0000000000600d80 00000d80 2**4
- ALLOC
- 25 .comment 00000039 0000000000000000 0000000000000000 00000d80 2**0
- CONTENTS, READONLY
- 26 .debug_aranges 00000030 0000000000000000 0000000000000000 00000db9 2**0
- CONTENTS, READONLY, DEBUGGING
- 27 .debug_info 0000038e 0000000000000000 0000000000000000 00000de9 2**0
- CONTENTS, READONLY, DEBUGGING
- 28 .debug_abbrev 00000102 0000000000000000 0000000000000000 00001177 2**0
- CONTENTS, READONLY, DEBUGGING
- 29 .debug_line 0000024b 0000000000000000 0000000000000000 00001279 2**0
- CONTENTS, READONLY, DEBUGGING
- 30 .debug_str 000045e3 0000000000000000 0000000000000000 000014c4 2**0
- CONTENTS, READONLY, DEBUGGING
- 31 .debug_macro 000010d4 0000000000000000 0000000000000000 00005aa7 2**0
- CONTENTS, READONLY, DEBUGGING
- </pre>
- Добавились секции, содержащие отладочную информацию: *debug_aranges, debug_info, debug_abbrev, debug_line, debug_str, debug_macro*.
- Наличие этих разделов обеспечивает столь ощутимую разницу в размере исполняемых файлов.
- С помощью утилиты *ldd* можно увидеть список динамических библиотек используемых программой:
- <pre>
- linux-vdso.so.1 (0x00007ffdbcbf3000)
- libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa427c76000)
- libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa427975000)
- /lib64/ld-linux-x86-64.so.2 (0x00007fa428021000)
- </pre>
- В этом списке мы наблюдаем подключенные нами с помощью компоновщика libc и libm, динамический компановщик и виртуальный динамический разделяемый объект.
- ## Синтаксические ошибки
- Исходный код программы из второго задания добавлен в локальный репозиторий (*commit 641f94a6e5caad660a36a8e7119a64c9e561cb42*). При компиляции возникает ряд ошибок.
- `$ gcc -std=c99 -Wall -Werror -g0 -o task2 task2.c`
- <pre>
- task2.c:1:1: error: unknown type name ‘include’
- include studio.h
- ^
- task2.c:1:15: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
- include studio.h
- ^
- task2.c:4:1: error: expected identifier or ‘(’ before numeric constant
- 3
- ^
- </pre>
- Компилятор приводит очень информативное сообщение об ошибке. В нем указаны: исходный файл, номер строки, номер символа, далее следует описание и классификация ошибки, после чего приводится фрагмента кода, содержащий синтаксическую ошибку.
- include является директивой препроцессора и должна начинаться с "#"
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index 9c32318..b8513b6 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -1,4 +1,4 @@
- -include studio.h
- +#include studio.h
- main{}
- (
- 3
- </pre>
- Вывод компилятора:
- <pre>
- task2.c:1:10: error: #include expects "FILENAME" or <FILENAME>
- #include studio.h
- ^
- task2.c:2:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
- main{}
- ^
- task2.c:4:1: error: expected identifier or ‘(’ before numeric constant
- 3
- ^
- </pre>
- Имя заголовочного файла следует поместить в двойные или треугольные кавычки:
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index 9c32318..cc18237 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -1,4 +1,4 @@
- -#include studio.h
- +#include <studio.h>
- main{}
- (
- 3
- </pre>
- Вывод компилятора:
- <pre>
- task2.c:1:20: fatal error: studio.h: Нет такого файла или каталога
- #include <studio.h>
- ^
- compilation terminated.
- </pre>
- Библиотеки с именем studio.h не существует, очевидно, имелась в виду библиотека stdio.h:
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index cc18237..1f29e69 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -1,4 +1,4 @@
- -#include <studio.h>
- +#include <stdio.h>
- main{}
- (
- 3
- </pre>
- Вывод компилятора:
- <pre>
- task2.c:2:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
- main{}
- ^
- task2.c:4:1: error: expected identifier or ‘(’ before numeric constant
- 3
- ^
- </pre>
- После имени функции должны следовать операторные круглые скобки:
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index 1f29e69..408438a 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -1,5 +1,5 @@
- #include <stdio.h>
- -main{}
- +main()
- (
- 3
- int s;
- </pre>
- Вывод компилятора:
- <pre>
- task2.c:4:1: error: expected declaration specifiers or ‘...’ before numeric constant
- 3
- ^
- task2.c:6:2: error: unknown type name ‘s’
- s: = 56;
- ^
- task2.c:7:2: error: unknown type name ‘print’
- print (Year has s weeks)
- ^
- </pre>
- Одиночная константа не является корректным выражением в языке Си:
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index 408438a..43b853a 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -1,7 +1,6 @@
- #include <stdio.h>
- main()
- (
- -3
- int s;
- s: = 56;
- print (Year has s weeks)
- </pre>
- Вывод компилятора:
- <pre>
- task2.c:5:2: error: expected declaration specifiers or ‘...’ before ‘s’
- s: = 56;
- ^
- task2.c:6:2: error: unknown type name ‘print’
- print (Year has s weeks)
- ^
- </pre>
- В языке Си оператором присваивания является "=":
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index 43b853a..861250e 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -2,6 +2,6 @@
- main()
- (
- int s;
- - s: = 56;
- + s = 56;
- print (Year has s weeks)
- )
- </pre>
- Вывод компилятора:
- <pre>
- task2.c:5:2: error: expected declaration specifiers or ‘...’ before ‘s’
- s = 56;
- ^
- task2.c:6:2: error: unknown type name ‘print’
- print (Year has s weeks)
- ^
- </pre>
- Тело функции должно быть заключено фигурные скобки:
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index 861250e..a2fea5d 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -1,7 +1,7 @@
- #include <stdio.h>
- main()
- -(
- +{
- int s;
- s = 56;
- print (Year has s weeks)
- -)
- +}
- </pre>
- Вывод компилятора:
- <pre>
- task2.c:2:1: error: return type defaults to ‘int’ [-Werror]
- main()
- ^
- task2.c: In function ‘main’:
- task2.c:6:2: error: implicit declaration of function ‘print’ [-Werror=implicit-function-declaration]
- print (Year has s weeks)
- ^
- task2.c:6:9: error: ‘Year’ undeclared (first use in this function)
- print (Year has s weeks)
- ^
- task2.c:6:9: note: each undeclared identifier is reported only once for each function it appears in
- task2.c:6:14: error: expected ‘)’ before ‘has’
- print (Year has s weeks)
- ^
- task2.c:7:1: error: expected ‘;’ before ‘}’ token
- }
- ^
- task2.c:4:6: error: variable ‘s’ set but not used [-Werror=unused-but-set-variable]
- int s;
- ^
- cc1: all warnings being treated as errors
- </pre>
- Тип возвращаемого функцией main значения - int:
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index a2fea5d..cc42c2a 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -1,5 +1,5 @@
- #include <stdio.h>
- -main()
- +int main()
- {
- int s;
- s = 56;
- </pre>
- Вывод компилятора:
- <pre>
- task2.c: In function ‘main’:
- task2.c:6:2: error: implicit declaration of function ‘print’ [-Werror=implicit-function-declaration]
- print (Year has s weeks)
- ^
- task2.c:6:9: error: ‘Year’ undeclared (first use in this function)
- print (Year has s weeks)
- ^
- task2.c:6:9: note: each undeclared identifier is reported only once for each function it appears in
- task2.c:6:14: error: expected ‘)’ before ‘has’
- print (Year has s weeks)
- ^
- task2.c:7:1: error: expected ‘;’ before ‘}’ token
- }
- ^
- task2.c:4:6: error: variable ‘s’ set but not used [-Werror=unused-but-set-variable]
- int s;
- ^
- cc1: all warnings being treated as errors
- </pre>
- Функция print не объявлена, вместо нее используем printf:
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index cc42c2a..a8e0cc4 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -3,5 +3,5 @@ int main()
- {
- int s;
- s = 56;
- - print (Year has s weeks)
- + printf(Year has s weeks)
- }
- </pre>
- Вывод компилятора:
- <pre>
- task2.c: In function ‘main’:
- task2.c:6:9: error: ‘Year’ undeclared (first use in this function)
- printf(Year has s weeks)
- ^
- task2.c:6:9: note: each undeclared identifier is reported only once for each function it appears in
- task2.c:6:14: error: expected ‘)’ before ‘has’
- printf(Year has s weeks)
- ^
- task2.c:7:1: error: expected ‘;’ before ‘}’ token
- }
- ^
- task2.c:4:6: error: variable ‘s’ set but not used [-Werror=unused-but-set-variable]
- int s;
- ^
- cc1: all warnings being treated as errors
- </pre>
- Printf принимает в качестве аргумента строку формата и параметры:
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index a8e0cc4..48ec65d 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -3,5 +3,5 @@ int main()
- {
- int s;
- s = 56;
- - printf(Year has s weeks)
- + printf("Year has %s weeks", s)
- }
- </pre>
- Вывод компилятора:
- <pre>
- task2.c: In function ‘main’:
- task2.c:6:2: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Werror=format=]
- printf("Year has %s weeks", s)
- ^
- task2.c:7:1: error: expected ‘;’ before ‘}’ token
- }
- ^
- cc1: all warnings being treated as errors
- </pre>
- Требуется точка с запятой в конце оператора:
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index 48ec65d..eb273a5 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -3,5 +3,5 @@ int main()
- {
- int s;
- s = 56;
- - printf("Year has %s weeks", s)
- + printf("Year has %s weeks", s);
- }
- </pre>
- Вывод компилятора:
- <pre>
- task2.c: In function ‘main’:
- task2.c:6:2: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Werror=format=]
- printf("Year has %s weeks", s);
- ^
- cc1: all warnings being treated as errors
- </pre>
- S имеет тип int, следовательно нужно использовать "%d":
- <pre>
- diff --git a/lab_01_02/2/task2.c b/lab_01_02/2/task2.c
- index eb273a5..95341d4 100644
- --- a/lab_01_02/2/task2.c
- +++ b/lab_01_02/2/task2.c
- @@ -3,5 +3,5 @@ int main()
- {
- int s;
- s = 56;
- - printf("Year has %s weeks", s);
- + printf("Year has %d weeks", s);
- }
- </pre>
- Теперь программа успешно компилируется.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement