enum jako indeks tablicy stuktury - można?

enum jako indeks tablicy stuktury - można?
KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:1683
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?

Kopiuj
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();
}

PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:14 dni
1

po pierwsze, wystarczy:

Kopiuj
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"


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Azarien
żeby mieć nazwy plików w jednym miejscu, a nie rozsiane po całym kodzie?
_13th_Dragon
W takim razie wystarczy const char TOMEK[]="tomek.txt"; i tak samo resztę.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:minuta
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:

Kopiuj
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.

edytowany 1x, ostatnio: Azarien
KA
Skompilowałam bez żadnych flag na GCC i to działa super (nawet jak pozamieniam kolejność) :)
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:14 dni
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:1683
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.


PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
edytowany 1x, ostatnio: karolinaa
Ola Nordmann
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 8 lat
  • Postów:414
2

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

Kopiuj
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"
};

<img src="http://scontent-a-vie.xx.fbcdn.net/hphotos-ash3/1379478_311850692288742_1730250652_n.jpg" />
Geniusz zua :>
edytowany 1x, ostatnio: Ola Nordmann
KA
Okey jeszcze lepiej dzięki!

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.