Błąd multideklaracji wskaźników

0

Witam,
Potrzebuję pomocy z kodem w C... Mam taki plik "readers.h":


#pragma once
#ifndef Readers_H_
#define Readers_H_

#include <stdio.h>
#include <stdlib.h>
#include "calendar.h"

typedef struct Readers
{
    int ID;
    char *first_name; //will be needed to malloc?
    char *surname;
    char *street;
    char *house_number;
    int postcode;
    char *city;
    Date birthdate;
    int sex; //1 male, 0 female
    char *ID_number;
    Readers *next; //pointer to the next reader on the list.
} Readers;

Readers *readers_head, *p_readers; //doesn't work

void get_new_reader_info(Readers &new_reader); //function that loads data to the struct Readers new_reader
int reg_reader(); //function that registers new reader
int show_readers_list();

#endif

Niestety, przy kompilacji w Visualu mam problem, mianowicie, twierdzi, że p_readers i readers_head są już gdzieś zadeklarowane. Ich deklaracja jeszcze raz występuje w innym pliku, ale pod postacią komentarza, więc nie rozumiem, dlaczego Visual twierdzi, że jest ten kod wielokrotnie zdefiniowany. Potrzebuję tych 2 zmiennych jako globalne, żeby nie bawić się w ich wielokrotne kombinowanie z referencjami, etc. w poszczególnych funkcjach.

1

Pewnie masz tego include'a w kilku miejscach. Zadeklaruj te zmienne jako extern, a zdefiniuj je tylko w jednym TU.

0

W sensie include na readers.h? Tak, zgadza się, ale jednocześnie używam ifndefa, więc nie powinno chyba multideklarować? W żadnym innym pliku nie ma później czegoś takiego jak

Readers *head_readers

lub

Readers *p_readers

A... I dodatkowe pytanie. Na linijce:

			{
				p_readers->next = NULL;
			}

Mam błąd niezdefiniowanego NULLa, nie rozumiem dlaczego...

1

Nie zmienia to faktu, że jeśli w różnych TU inkludujesz ten plik, to masz wiele definicji tych zmiennych - bo to są definicje. Zamień je na deklaracje (z extern), a definicję umieść wyłącznie jedną.

0

TU? Co to znaczy? Dawno w programowaniu się nie bawiłem, z C styczności w przeszłości nie miałem wcale (jeśli już, to CPP). W razie potrzeby - mogę wysłać całą solucję, przy czym nie chcę jej kompletnie upubliczniać ;)

1

Translation Unit. Generalnie, plik .c lub .cpp.

0

A... I dodatkowe pytanie. Na linijce:

			{
				p_readers->next = NULL;
			}

dostaję błąd, że NULL niezdefiniowany. Nie wiem dlaczego, skoro next jest z założenia pointerem na strukturę Readers.

1

NULL jest zdefiniowany w jednym z następujących nagłówków:

<stddef.h>
<string.h>
<wchar.h>
<time.h>
<locale.h>
<stdio.h>
<stdlib.h> 
0

Wychodzi na to, że błąd Visuala (pokusiłem się chyba niepotrzebnie na RC 2017)
title

Tymczasowo rozwiązałem to za pomocą #define NULL 0...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.