enum jako indeks tablicy stuktury - można?

0

Cześć. Mam w tablicy struktur zgromadzone kilkanaście nazw plików. Niektóre z tych plików mogą mieć swoje zapasowe odpowiedniki jakby nie było tego pierwszego. Chciałabym je jakoś ładnie zgrupować i mieć możliwość łatwego odwoływania się do tych plików w programie. Można korzystać z enum jako indeksu czy jest to niezalecana praktyka?

struct pracownik {
	char *filename;
};

enum dla_listy { MAJA, ANNA, PIOTREK, TOMEK, MAJA2, MAJA3, ANNA2 };
static struct pracownik lista[] = {
		{"maja.txt"},
		{"anna.txt"},
		{"piotrek.txt"},
		{"tomek.txt"},
		{"maja_bak.txt"},
		{"maja_bak2.txt"},
		{"anna_old.txt"}
};

void costam() {
	if(sprawdz_plik(lista[TOMEK].filename)!=NULL)
		jakies_tam_dzialanie();
	//i ponizej jezeli moze byc kilka odpowiendikow
	if(sprawdz_plik(lista[MAJA].filename)!=NULL)
		jakies_tam_dzialanie();
	else if(sprawdz_plik(lista[MAJA2])!=NULL)
		jakies_tam_dzialanie();
}
1

po pierwsze, wystarczy:

const char *lista[]={"maja.txt","anna.txt", ...};

po drugie, naprawdę nie widzę w tym sensu czym niby zapis lista[TOMEK].filename jest lepszy od zapisu "tomek.txt"

1

Można korzystać z enum jako indeksu czy jest to niezalecana praktyka?
Nie wiem czy zalecana czy nie, korzystać można, ale problem jest w tym, że nic (poza własną ostrożnością) nie pilnuje zachowania tej samej kolejności w enumie i w tablicy. Łatwo potem namieszać dodając lub odejmując jakiś element.

EDIT: coś mi się przypomniało.
Pod Visual Studio 2013, albo jeśli używasz GCC - przy dodanym parametrze kompilatora --std=c99 albo --std=c11 można zrobić tak:

enum dla_listy { MAJA, ANNA, PIOTREK, TOMEK, MAJA2, MAJA3, ANNA2 };

const char* lista[] = {
        [MAJA]    = "maja.txt",
        [ANNA]    = "anna.txt",
        [PIOTREK] = "piotrek.txt",
        [TOMEK]   = "tomek.txt",
        [MAJA2]   = "maja_bak.txt",
        [MAJA3]   = "maja_bak2.txt",
        [ANNA2]   = "anna_old.txt"
};

w ten sposób pomylenie kolejności elementów nie będzie miało tragicznych skutków.

1

Zastanów się nad wczytaniem wszystkich plików *.txt z podanej lokalizacji i znalezieniem który musisz użyć analizując np pierwszy wiersz.

0

Chciałam na górze przedstawić nazwy plików, żeby w razie czego łatwo można było je zmienić. Z tablicą to byłoby już np.lista[TOMEK]vs tomek.txt, ale już sama nie wiem chyba rzeczywiście nie ma to sensu i powpisuje normalnie.

EDIT: nie widziałam dwóch ostatnich odpowiedzi. Dobra pomyślę. @Azarien dzięki za informacje.

2

Ja bym przy takim zastosowaniu zaproponował jawną inicjalizacje enuma:

enum dla_listy {
        MAJA     = 0,
        ANNA     = 1,
        PIOTREK = 2,
        TOMEK   = 3,
        MAJA2   = 4,
        MAJA3   = 5,
        ANNA2   = 6
};
 
const char* lista[] = {
        [MAJA]    = "maja.txt",
        [ANNA]    = "anna.txt",
        [PIOTREK] = "piotrek.txt",
        [TOMEK]   = "tomek.txt",
        [MAJA2]   = "maja_bak.txt",
        [MAJA3]   = "maja_bak2.txt",
        [ANNA2]   = "anna_old.txt"
};

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