Multiplicitny enumeracny typ ako parameter v C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Multiplicitny enumeracny typ ako parameter v C – C / C++ – Fórum – Programujte.comMultiplicitny enumeracny typ ako parameter v C – C / C++ – Fórum – Programujte.com

 

majkx0
Duch
14. 6. 2017   #1
-
0
-

Zdravim , predstavme si ze mame nasledujuci enumeracny typ :

 

enum type {

	hospital = 1,
	facility = 3,
	petrol = 5,
	fastfood = 7
};


Nasledne mam funkciu , kde tento enumeracny typ figuruje v pozicii parametra , a to konkretne :

 

struct poi {
	double latitude;
	double longitude;
	enum type type;
	char* description;
};

struct entry{
	struct poi poi;
	struct entry* next;
}

struct entry* find_closest(struct entry* first,double longitude, double latitude, enum type type){

	struct entry* temp = first;
	struct poi* me = (struct poi*)calloc(1,sizeof(struct poi));
	me->latitude = latitude;
	me->longitude = longitude;

	while(temp->next != NULL){
		
		if(get_distance_between(me,temp->poi) < distance && temp->poi->type == type) distance = get_distance_between(me,temp->poi);

	temp = temp->next;
	}

	while(first->next != NULL){
		if(get_distance_between(me,first->poi) == distance){
			struct entry* result = (struct entry*)calloc(1,sizeof(struct entry));
			result->poi = first->poi;
			result->next = NULL;
			return result;
		}
	}
return NULL;
}



problem nastava tuto : temp->poi->type == type

a to za stavu , ze funkcia je volana nasledovne :

find_closest(first,20,20,hospital | fastfood);
kde tych enumeracnych typov je v parametri viac.
Funkcia mi totizto stale "spapa" iba jeden.

Pytam sa vas teda, ako ziskat z parametra vsetky zadane enumeracne typy ?
Stale mi to totizto berie len jeden...

PS : Neviem na 100% ci je to uplny a funkcny kod , pisal som ho len z pameti a bez kompilacie

Dakujem :)

Nahlásit jako SPAM
IP: 178.40.50.–
KIIV
~ Moderátor
+43
God of flame
14. 6. 2017   #2
-
0
-

Prinejmensim pojmenovat ten enum "type" je opravdu skvely napad. Prebit ho uz muze jen pojmenovat promennou taky type, aby se to nepletlo.

V C by to jinak melo sezrat cokoliv tomu predhodis. V C++ by to mohlo vyzadovat jeste explicitne pretypovani.

No a pak samozrejme pouzivas bitovy OR, ale ty hodnoty nejsou zrovna stastne zvolene:

hospital je   0b0001
fastfood je  0b0111

No a kdyz udelas bitovy or, vyflusne to  0b0111 =>  fastfood!!!!

Doporucil bych osvedcenou metodu, pouzivat mocniny dvojky: 1, 2, 4, 8, ... (tj. 0b0001, 0b0010, 0b0100, 0b1000, ...)
 

Nahlásit jako SPAM
IP: 217.196.214.–
Program vždy dělá to co naprogramujete, ne to co chcete...
majkx0
Duch
14. 6. 2017   #3
-
0
-

#2 KIIV
Bohuzial, nemozem prepisat hodnoty, je to totizto zadanie ktore sme mali na skuske :)
A nezozralo to viacero typov , len prvy zadany... ospravedlnujem sa za syntax aj za pouzite nazvy, ale nevymyslal som to ja :)

 

Nahlásit jako SPAM
IP: 178.40.50.–
MilanL+1
Grafoman
17. 6. 2017   #4
-
0
-

#3 majkx
vzhledem k těm hodnotám enum, tak pokud je potřeba předávat do funkce více enum hodnot, tak argument spíš jako pole asi takhle

enum [] type poletypu

a nevím jak v C ale v jiných jazycích existuje pro detekci přítomnosti prvku v poli konstrukce prvek in pole takže v podmínce, pak

temp->poi->type in poletypu

pokud to C nemá tak bud ve smyčce o počtu prvků vstupního pole testovat tu podmínku pro každý prvek pole, nebo si tu funkci na přítomnost prvku v poli udělat

Nahlásit jako SPAM
IP: 193.165.115.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý