ПОС/Лаб 4 2016 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Dodato resenje prvog zadatka)
 
м (-spoiler)
 
(Није приказано 16 међуизмена 3 корисника)
Ред 1: Ред 1:
{{tocright}}
{{tocright}}
<div class="unhide-spoilers"></div>
Лаб 4 се појављује у '''шестом''' термину вежби.


== Група 3 ==
== Група 3 ==
=== Задатак 1 ===
=== Задатак 1 ===
==== Поставка ====
==== Поставка ====
(6) У фајл 'test/project/makefile' уписати правила за превођење кода датог у фолдерима 'src' и 'include'.  
'''(6п)''' У фајл ''test/project/makefile'' уписати правила за превођење кода датог у фолдерима ''src'' и ''include''.  
У фолдеру 'obj' треба се нађу сви .о фајлови,  
У фолдеру ''obj'' треба се нађу сви '''' фајлови,  
У 'project' фолдеру треба да се налази извршни фајл под називом 'program'.  
У ''project'' фолдеру треба да се налази извршни фајл под називом ''program''.  
Правила треба да уклоне непотребне зависности.
Правила треба да уклоне непотребне зависности.
Користити променљиве, '$@', '$<', '$^' и 'patsubst' где год има смисла.
Користити променљиве, ''$@'', ''$<'', ''$^'' и ''patsubst'' где год има смисла.
(4) У 'makefile' додати акције 'clean' и 'all'.
 
'clean' треба да брише све фајлове који нису '.c' или '.h' или 'makefile' (потребно је уклонити и скривене фајлове који имају '~' на крају, а које генерише едитор)
'''(4п)''' У ''makefile'' додати акције ''clean'' и ''all''.
'all' треба да уради поновно формирање свих зависних фајлова без обзира да ли су ажурирани или не  
''clean'' треба да брише све фајлове који нису ''.c'' или ''.h'' или ''makefile'' (потребно је уклонити и скривене фајлове који имају ''~'' на крају, а које генерише едитор)
(дакле, треба да се опет генеришу сви '.о' фајлови, као и сам програм)
''all'' треба да уради поновно формирање свих зависних фајлова без обзира да ли су ажурирани или не  
Заштити 'clean' и 'all' акције тако да се увек извршавају.  
(дакле, треба да се опет генеришу сви ''.о'' фајлови, као и сам програм)
Заштити ''clean'' и ''all'' акције тако да се увек извршавају.


==== Решење ====
==== Решење ====
Једно од решења које има максимални број бодова:
Једно од решења које има максимални број бодова:
<syntaxhighlight lang="makefile" class="spoiler">
<syntaxhighlight lang="makefile">
# makefile
# makefile


Ред 39: Ред 40:


$(SRCDIR)/%.d: $(SRCDIR)/%.c
$(SRCDIR)/%.d: $(SRCDIR)/%.c
$(CC) -MM $< $(CFLAGS) > $@
$(CC) -MM -MT $(OBJDIR)/%.o $< $(CFLAGS) > $@
include $(DEP)  
include $(DEP)  


Ред 56: Ред 57:
all
all
</syntaxhighlight>
</syntaxhighlight>
=== Задатак 2 ===
==== Поставка ====
'''(4п)''' Користећи ''gdb'', написати следеће команде у фајл ''test/gdb/gdb.txt'':
# Створити извршни програм од кода датог у фолдерима ''src'' и ''include''
# Поставити бреакпоинт на линију 14 у ''main.c'' фајлу <syntaxhighlight lang="c" inline>a = dohvFibonaciBrojeve(n);</syntaxhighlight>
# Покренути програм са параметром 10
# Ући у функцију ''dohvFibonaciBrojeve'' и прочитати вредност ''fib[9]'' када програм стигне до линије 18: <syntaxhighlight lang="c" inline>return (int*)fib;</syntaxhighlight>
# Скочити на линију 23 у фајлу маин.ц: <syntaxhighlight lang="c" inline>return 0;</syntaxhighlight>
# Завршити програм
# Приказати све бреакпоинт-ове
# Уклонити све бреакпоинт-ове
# Изаћи из дибагера
==== Решење ====
# potreban kontekst zadatka
# <syntaxhighlight lang="c" inline>break main.c:14</syntaxhighlight>
# <syntaxhighlight lang="c" inline>run 10</syntaxhighlight>
# potreban kontekst zadatka
# <syntaxhighlight lang="c" inline>jump 23</syntaxhighlight>
# ako se odnosi na završavanje debuggovanja, onda CTRL-c, ako se odnosi na završavanje gdb-a onda <syntaxhighlight lang="c" inline>quit</syntaxhighlight>
# <syntaxhighlight lang="c" inline>info breakpoint</syntaxhighlight>
# <syntaxhighlight lang="c" inline>delete</syntaxhighlight> (bez argumenata) ili <syntaxhighlight lang="c" inline>clear main.c:14</syntaxhighlight>
# <syntaxhighlight lang="c" inline>quit</syntaxhighlight>


[[Категорија:ПОС]]
[[Категорија:ПОС]]
[[Категорија:Лабораторијске вежбе]]
[[Категорија:Лабораторијске вежбе]]

Тренутна верзија на датум 29. јун 2021. у 10:13

Лаб 4 се појављује у шестом термину вежби.

Група 3

Задатак 1

Поставка

(6п) У фајл test/project/makefile уписати правила за превођење кода датог у фолдерима src и include. У фолдеру obj треба се нађу сви фајлови, У project фолдеру треба да се налази извршни фајл под називом program. Правила треба да уклоне непотребне зависности. Користити променљиве, $@, $<, $^ и patsubst где год има смисла.

(4п) У makefile додати акције clean и all. clean треба да брише све фајлове који нису .c или .h или makefile (потребно је уклонити и скривене фајлове који имају ~ на крају, а које генерише едитор) all треба да уради поновно формирање свих зависних фајлова без обзира да ли су ажурирани или не (дакле, треба да се опет генеришу сви фајлови, као и сам програм) Заштити clean и all акције тако да се увек извршавају.

Решење

Једно од решења које има максимални број бодова:

# makefile

CC = gcc
OBJDIR = ./obj
SRCDIR = ./src
IDIR = ./src/include
CFLAGS = -w -I$(IDIR)
PROGRAM = ../program

SRC = $(wildcard $(SRCDIR)/*.c)
OBJ = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRC))
DEP = $(patsubst $(SRCDIR)/%.c,$(SRCDIR)/%.d,$(SRC))

$(PROGRAM): $(OBJ) 
	$(CC) -o $@ $^

$(OBJDIR)/%.o: $(SRCDIR)/%.c | proveridir
	$(CC) -o $@ -c $< $(CFLAGS)

$(SRCDIR)/%.d: $(SRCDIR)/%.c
	$(CC) -MM -MT $(OBJDIR)/%.o $< $(CFLAGS) > $@
	include $(DEP) 

clean:
	rm -rf obj
	rm -f $(PROGRAM)
	rm -f $(SRCDIR)/*.d
	rm -f *~
all: clean $(PROGRAM)

proveridir:
	[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR)
.PHONY: 
	proveridir
	clean
	all

Задатак 2

Поставка

(4п) Користећи gdb, написати следеће команде у фајл test/gdb/gdb.txt:

  1. Створити извршни програм од кода датог у фолдерима src и include
  2. Поставити бреакпоинт на линију 14 у main.c фајлу a = dohvFibonaciBrojeve(n);
  3. Покренути програм са параметром 10
  4. Ући у функцију dohvFibonaciBrojeve и прочитати вредност fib[9] када програм стигне до линије 18: return (int*)fib;
  5. Скочити на линију 23 у фајлу маин.ц: return 0;
  6. Завршити програм
  7. Приказати све бреакпоинт-ове
  8. Уклонити све бреакпоинт-ове
  9. Изаћи из дибагера

Решење

  1. potreban kontekst zadatka
  2. break main.c:14
  3. run 10
  4. potreban kontekst zadatka
  5. jump 23
  6. ako se odnosi na završavanje debuggovanja, onda CTRL-c, ako se odnosi na završavanje gdb-a onda quit
  7. info breakpoint
  8. delete (bez argumenata) ili clear main.c:14
  9. quit