C структура проекта, совместное использование кода и компиляция кода с зависимостями - PullRequest
0 голосов
/ 03 ноября 2019

До сих пор я писал весь код в одном файле, поэтому мне никогда не приходилось думать о структуре проекта и компиляции кода с зависимостями. Сейчас я реализую очередь с приоритетами, использующую код кучи в качестве подпрограммы, и в будущем мне придется использовать очередь с приоритетами в качестве подпрограммы для Bellmanford. Я также проверяю все алгоритмы независимо друг от друга по мере их реализации.

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

max_heap_header.h

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define arr_length(arr) (sizeof(arr) == 0 ? 0 : sizeof(arr) / sizeof((arr)[0]));

#define swap(arr, x, y) do { typeof(arr[x]) temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } while (0);

#define parent(i) (floor(i));

#define left(i) ((i << 1) + 1);

#define right(i) ((i << 1) + 2);


/* function declaration */ 

void max_heapify (int arr[], int i, int arr_len);

/* produce a max heap from an unsorted array */
void build_max_heap (int arr[], int arr_len);

/* sorts an array in place */
void heapsort (int arr[], int arr_len);

max_heap.c

#include "max_heap_header.h"

void max_heapify (int arr[], int i, int arr_len)
{
  int largest = i;
  int l = left(i);
  int r = right(i);

  if (l < arr_len && arr[l] > arr[i]) {
    largest = l;
  }

  if (r < arr_len && arr[r] > arr[largest]) {
    largest = r;
  }

  if (largest != i) {
    swap(arr, i, largest);
    max_heapify(arr, largest, arr_len);
  }
}

void build_max_heap (int arr[], int arr_len)
{
  int heap_size = arr_len;

  for (int i = floor(arr_len / 2); i >= 0; i--) {
    max_heapify(arr, i, arr_len);
  }
}

void heap_sort (int arr[], int arr_len)
{
  build_max_heap(arr, arr_len);

  for (int i = arr_len; i >= 1; i--) {
    swap(arr, 0, i);
    max_heapify(arr, 0, arr_len);
  }
}

max_heap_driver_program.c

int main ()
{
  int arr[] = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7}; 
  int arr_len = arr_length(arr);

  build_max_heap(arr, arr_len);

  for (int i = 0; i < arr_len; i++) {
    printf("%d ", arr[i]);
  }

  return 0;
}

Перед тем, как разбить код на разные файлы - max_heap_header.h , max_heap. c и max_heap_driver_program.c - весь код был в одном файле max_heap.c и с помощью команды gcc -lm -o max_heap max_heap.c -ggdb -g3 я смог успешно скомпилировать и запустить код.


Trials

Интерактивная подсказка моей оболочки находится в папке Project / Heap / Max_heap . Здесь я попробовал команду - gcc -I ../lib/ -c ./max_heap.c - которая успешно запустилась и создала файл max_heap.o , а затем на gcc -o max_heap_driver_program max_heap_driver_program.c max_heap.o, я получил:

max_heap_driver_program.c: In function ‘main’:
max_heap_driver_program.c:4:17: warning: implicit declaration of function ‘arr_length’ [-Wimplicit-function-declaration]
   int arr_len = arr_length(arr);
                 ^
max_heap_driver_program.c:6:3: warning: implicit declaration of function ‘build_max_heap’ [-Wimplicit-function-declaration]
   build_max_heap(arr, arr_len);
   ^
max_heap_driver_program.c:9:2: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
  printf("%d ", arr[i]);
  ^
max_heap_driver_program.c:9:2: warning: incompatible implicit declaration of built-in function ‘printf’
max_heap_driver_program.c:9:2: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
/tmp/ccnyLTUs.o: In function `main':
max_heap_driver_program.c:(.text+0x6a): undefined reference to `arr_length'
max_heap.o: In function `build_max_heap':
max_heap.c:(.text+0x151): undefined reference to `floor'
collect2: error: ld returned 1 exit status

Нужна помощьздесь!


Структура проекта:

Project
  |--Heap
    |--Max_Heap
      |--max_heap.c
      |--max_heap_driver_program.c 
    |--Min_Heap 
      |--min_heap.c
      |--min_heap_driver_program.c
    |--lib
      |--max_heap_header.h            
  |--Priority_Queue
    |--max_priority_queue.c
    |--min_priority_queue.c
  |--Bellmanford
    |--bellmanford.c
  |--Other_Algorithms
  |--Other_Algorithms

Макро-функции:

  • #define arr_length(arr) (sizeof(arr) == 0 ? 0 : sizeof(arr) / sizeof((arr)[0]));
  • #define swap(arr, x, y) do { typeof(arr[x]) temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } while (0);

используются в других алгоритмах . Поэтому я хочу переместить это куда-нибудь выше в структуре папок. В настоящее время я определяю их в каждом файле, где они используются.


Учитывая будущее развитие, как мне организовать организацию проекта? .

1 Ответ

1 голос
/ 03 ноября 2019

Существует три вопроса:

  1. Файл max_heap_driver_program.c должен включать #include "max_heap_header.h".
  2. Этот файл также должен быть скомпилирован. Используйте gcc -I ../lib/ -c max_heap_driver_program.c.
  3. Шаг связывания должен быть gcc -o max_heap_driver_program max_heap_driver_program.o max_heap.o -lm. Флаг -lm указывает gcc связать код с математической библиотекой lib. Флаг следует за объектами для ссылки.
...