Błąd typów podczas dołączania plików nagłówkowych

0

Hej,
Mam problem z plikami nagłówkowymi,
Plik: memory_sector.h

#pragma once

#include "memory_operations.h"

#define DECLARE_MEMORY_SECTOR(sector_size) \
typedef struct memory_sector {             \
	int l_fence;                           \
	int buffer[sector_size];               \
	int r_fence;                           \
} memory_sector_t;

address_status_t copy_memory(memory_sector_t *, int * destination, int * source, size_t size);

#define RAND_SECTOR_SIZE 10 + ((int)__TIME__[6] + (int)__TIME__[7]) % 11
#define INITIALIZE_MEMORY_SECTOR() DECLARE_MEMORY_SECTOR(RAND_SECTOR_SIZE)

Plik: memory_operations.h

#pragma once

#include <cstddef>

#include "memory_sector.h"

INITIALIZE_MEMORY_SECTOR();

const unsigned int FENCE_INITIALIZER = 0xCAFEBABE;
const unsigned int BUFFER_INITIALIZER = 0xAB;

typedef enum address_status {
	NO_ERROR,
	ADDRESS_OUT_OF_RANGE
} address_status_t;

int * get_left_fence_address(memory_sector_t *);
int * get_right_fence_address(memory_sector_t *);

size_t get_memory_buffer_size(memory_sector_t *);

void initialize_memory(memory_sector_t *);

address_status_t validate_address(memory_sector_t * memory_sector, const int * address);

address_status_t read_memory(memory_sector_t *, const int * address, int * buffer);
address_status_t write_memory(memory_sector_t *, int * address, int value);

Plik: memory_sector.cpp

#include "memory_operations.h"
#include "memory_sector.h"
#include <cstring>

address_status_t copy_memory(memory_sector_t * x, int * destination, int * source, size_t size){
    if(destination==&(x->l_fence)){
        memcpy(destination, source, size);
        return NO_ERROR;
    }
    if(destination==&(x->r_fence)){
        memcpy(destination, source, size);
        return NO_ERROR;
    }
    for(int * k = &(x->l_fence)+1; k<&(x->r_fence)-1; ++k){
        memcpy(destination, source, size);
        if(destination==k){
            return NO_ERROR;
        }
    }
    return ADDRESS_OUT_OF_RANGE;
}

Oczywiście plik main.cpp istnieje ale nie ma nic wspólnego z tym co powoduje błąd, więc nie zaśmiecam
Problem tkwi w tym że używam składników obu plików nagłówkowych w nich nawzajem.
Zrozumiałem już że problem w tkwi w referencji cyklicznej, i że powinienem użyć pre-deklaracji, ale nijak nie jestem w stanie tego kodu poprawić by działał.
Błąd jaki wyskakuje to:
screenshot-20230404231024.png
Będę bardzo wdzięczny za jakąkolwiek podpowiedź, wskazanie, cokolwiek.

0

Po pierwsze primo, piszesz C w C++ (więcej makr niż jest potrzebne, typedef struct, wskaźniki tam gdzie referencja prawdopodobnie jest bardziej adekwatna w sygnaturach funkcji itp.).

Po drugie primo:

ByleDoPrzodu napisał(a):
#pragma once

#include "memory_operations.h"

#define DECLARE_MEMORY_SECTOR(sector_size) \
typedef struct memory_sector {             \
	int l_fence;                           \
	int buffer[sector_size];               \
	int r_fence;                           \
} memory_sector_t;

address_status_t copy_memory(memory_sector_t *, int * destination, int * source, size_t size);

#define RAND_SECTOR_SIZE 10 + ((int)__TIME__[6] + (int)__TIME__[7]) % 11
#define INITIALIZE_MEMORY_SECTOR() DECLARE_MEMORY_SECTOR(RAND_SECTOR_SIZE)

Ten kod jest taką zbrodnią przeciwko ODR, że zdziwię się jak program go używający się nie wysypie.

https://godbolt.org/z/WfG7EhrbE

Kompilator na pewno prędzej czy później sprawi, że Twój program będzie jechał ci po pamięci w najlepszym przypadku, a w najgorszym nawet nie jestem w stanie niczego powiedzieć.

Po trzecie primo, jeśli kod ma być C++'owy, to powyższy typ powinien raczej być szablonem. Coś takiego:

template <std::size_t _Size>
struct memory_sector_t
{
  int l_fence;
  int buffer[_Size];
  int r_fence;
};

Podobne działanie na funkcjach. Coś takiego, ale nie dam sobie głowy urwać:

template <std::size_t _Size>
address_status_t copy_memory(memory_sector_t *, int * destination, int * source, size_t size);

Więcej nie jestem w stanie powiedzieć dopóki się nie dowiem jaki cel tak właściwie próbujesz osiągnąć, pisząc taki a nie inny kod.

szybki edit: w powyższym linku do compiler explorer wyrzuciłem deklarację funkcji copy_memory do memory_operations.h - myślę, że copy_memory jest operacją, więc jak nazwałeś nagłówek tak a nie inaczej, to spodziewam się, że będzie raczej tam; po tym zabiegu i usunięciu #include "memory_operations.h" w memory_sector.h projekt się spokojnie skompilował.

3

Masz cykliczną zależność.
Każda cykliczna zależność w porgramowaniu to duży kłopot.

Dodaj trzeci nagłówek, z rzeczą od które zależą oba pierwotne nagłówki i w ten sposób rozbij cykl.

1
Marius.Maximus napisał(a):

Podaj całą treść zadania bo może są tam istotne detale których nie dostrzegasz a są ważne dla problemu ;)

@ByleDoPrzodu im więcej danych wejściowych tym celniejsza odpowiedz np. nie podałeś ograniczeń jakie były w zadaniu. Tak jak napisał @MarekR22 najprostsze rozwiązanie to dodatkowy nagłowek w ktorym bedzie deklaracja address_status_t

0

W pliku memory_operations.h spróbuj dokonać zmiany kolejności włączania plików nagłówkowych i dodaj pre-deklarację struktury memory_sector_t

#pragma once
// pre-deklaracja struktury memory_sector_t
struct memory_sector;

const unsigned int FENCE_INITIALIZER = 0xCAFEBABE;
const unsigned int BUFFER_INITIALIZER = 0xAB;

typedef enum address_status {
    NO_ERROR,
    ADDRESS_OUT_OF_RANGE
} address_status_t;

int * get_left_fence_address(memory_sector_t *);
int * get_right_fence_address(memory_sector_t *);

size_t get_memory_buffer_size(memory_sector_t *);

void initialize_memory(memory_sector_t *);

address_status_t validate_address(memory_sector_t * memory_sector, const int * address);

address_status_t read_memory(memory_sector_t *, const int * address, int * buffer);
address_status_t write_memory(memory_sector_t *, int * address, int value);

// włączenie pliku nagłówkowego memory_sector.h po pre-deklaracji
#include "memory_sector.h"

A w pliku memory_sector.h zmiana kolejności włączania plików nagłówkowych i dodaj pre-deklarację funkcji copy_memory

#pragma once

// pre-deklaracja funkcji copy_memory
struct memory_sector;
typedef enum address_status address_status_t;
address_status_t copy_memory(memory_sector_t *, int * destination, int * source, size_t size);

#include <cstddef>

#define DECLARE_MEMORY_SECTOR(sector_size) \
    typedef struct memory_sector {         \
        int l_fence;                       \
        int buffer[sector_size];           \
        int r_fence;                       \
    } memory_sector_t;

address_status_t copy_memory(memory_sector_t *, int * destination, int * source, size_t size);

#define RAND_SECTOR_SIZE 10 + ((int)__TIME__[6] + (int)__TIME__[7]) % 11
#define INITIALIZE_MEMORY_SECTOR() DECLARE_MEMORY_SECTOR(RAND_SECTOR_SIZE)

// włączenie pliku nagłówkowego memory_operations.h po pre-deklaracji
#include "memory_operations.h"
2

Hej,
dzięki wielkie wszystkim za starania i pomoc,
okazało się że w instrukcji do zadania był błąd.
Jeszcze raz dzięki wszystkim i miłego dnia

1 użytkowników online, w tym zalogowanych: 0, gości: 1