Výber maximálnych hodnôt zo štruktúry v C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Výber maximálnych hodnôt zo štruktúry v C – C / C++ – Fórum – Programujte.comVýber maximálnych hodnôt zo štruktúry v C – C / C++ – Fórum – Programujte.com

 

xxx7691
~ Anonymní uživatel
16 příspěvků
19. 3. 2015   #1
-
0
-

Dobrý deň všetkým,

Asi troška obšírnejšie opíšem svoj problém. 
Mám vytvorenú štruktúru, do ktorej sa mi zapisujú nejaké tie hodnoty. Daná štruktúra je reprezentovaná ako tabulka, Hodnoty, ktoré obsahuje sa aktualizujú vo funkcii aktualizaciaTabulky(). Vo funkcii display() sa dana tabulka zobrazuje na konzolu. Tabuľka pozostáva z niekoľkých stĺpcov. Prvý (najdôležitejší) stĺpec je IP adresa.
V ostatných stĺpcoch sú k daným IP adresam priradené rôzne parametre. Jedným z nich je parameter Bezpečnosť, ktorý získavám na základe výpočtu z predošlých parametrov. Parameter bezpečnosť je z rozsahu <-2; 2>. 
Môj problém spočíva v tom, že z danej štruktúry, teda tabuľky, chcem vybrať len určitý počet IP adries (na základe hodnoty Bezpečnosťi), teda nejakých prvých N adries spolu s ich hodnotami. Pre jednoduchosť dajme tomu, že mám 10 IP adries a chcem vybrať len 5, ktoré majú najväčšiu hodnotu Rn. Musí to byť zovšeobecnené, teda tých IP adries tam môže byť N. 
Na základe zvolených IP adries sa potom z nich vyberie jedna (pomocou ďalšieho parametra). Celý algoritmus výberu sa bude realizovať vo funkcii display(). 
Uvediem aj ukážky z kódu:

typedef struct TABULKA_PARANETROV
{
char*	 ip_adresa;			//prvy stlpec tabulky typu smernik na char 

int		PVC;				//treti stlpec tabulky typu integer
int		PVNC;				//stvrty stlpec tabulky typu integer
int		pocet_rrep;			//paraneter pre Dovernost
int		pocet_rreq;			//paraneter pre Dovernost

...

double	BEZPECNOST;		

struct TABULKA_PARANETROV	 *dalsi;  
}TABULKA_PARANETROV;

Teda potrebujem pristúpiť k tej hodnote BEZPECNOST a vybrať polovicu IP adries ktoré budú mať najväčšie adresy?

Dalo by sa to nejako spraviť? Viete mi poradiť? 
Ďakujem.
 

Nahlásit jako SPAM
IP: 94.136.137.–
ondrej39+1
Věrný člen
19. 3. 2015   #2
-
0
-

#1 xxx7691
S polem charů se blbě pracuje při porovnání. Udělal bych si ještě ješte jednu strukturu, třeba ip adresa, obsahující 4 short inty (IPv4 má čtyři části), reprezentující jednotlivé sekce dané IP adresy a porovnávání pak prováděl na těchto čtyřech short integerech.

Nahlásit jako SPAM
IP: 195.113.207.–
Inject all the dependencies!
xxx7691
~ Anonymní uživatel
16 příspěvků
19. 3. 2015   #3
-
0
-

Takýmto spôsobom to nepôjde. Tá IP adresa je reálna IP adresa, nie len mnou vytvorený náhodný reťazec. (Modifikujem zdrojový kód v jednom simulačnom programe). Akákoľvek zmena tam rozhodí celý kód a už to nefunguje. Dá sa to spraviť nejako inak? 
Ak mám hodnoty v štruktúre nedajú sa vytiahnúť naraz? (Nie som žiaden programátor, ovládam fakt len základy, moje otázky možno vyznejú trápne). 
Vďaka za vysvetlenie. 

Nahlásit jako SPAM
IP: 94.136.137.–
ondrej39+1
Věrný člen
19. 3. 2015   #4
-
0
-

#3 xxx7691
To ovšem vůbec nevadí, že to je reálná IP adresa. Vždyť IPv4 adresy jsou ve formátu XXX.XXX.XXX.XXX, kde XXX je 8bitů vymezených pro číslování, tedy jsou to čísla 0-255.

typedef struct IpAdresy
{
	//formát IP Adresy XXX.XXX.XXX.XXX
	short unsigned int m_prvniCast;
	short unsigned int m_druhaCast;
	short unsigned int m_tretiCast;
	short unsigned int m_ctvrtaCast;
} IpAdresa;

//return  0: Leva == Prava, IP adresy jsou stejne
//return -1: Leva < Prava, Leva IP adresa má menší hodnotu
//return  1: Leva > Prava, Leva IP adresa má větší hodnotu
int JeVetsi(const IpAdresa* pLeva, const IpAdresa* pPrava)
{
	if (pLeva->m_prvniCast > pPrava->m_prvniCast) { return 1; }
	if (pLeva->m_prvniCast < pPrava->m_prvniCast) { return -1; }

	if (pLeva->m_druhaCast > pPrava->m_druhaCast) { return 1; }
	if (pLeva->m_druhaCast < pPrava->m_druhaCast) { return -1; }

	if (pLeva->m_tretiCast > pPrava->m_tretiCast) { return 1; }
	if (pLeva->m_tretiCast < pPrava->m_tretiCast) { return -1; }

	if (pLeva->m_ctvrtaCast > pPrava->m_ctvrtaCast) { return 1; }
	if (pLeva->m_ctvrtaCast < pPrava->m_ctvrtaCast) { return -1; }

	return 0;
}

To, co jsem ti udělal, je funkce, která ti porovná dvě IP adresy. Tuto funkci můžeš použit při procházení tvých IP adres a na základě návratové hodnoty (-1, 0 nebo 1) provést další operace.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
vitamin+8
Grafoman
19. 3. 2015   #5
-
0
-

#4 ondrej39
Podla mna by stacilo nieco taketo:

typedef uint32_t IPv4Addr;
Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ondrej39+1
Věrný člen
19. 3. 2015   #6
-
0
-

#5 vitamin
Hodnotu nad 4 a půl miliardy do 32bit unsigned integeru nenacpeš. IPv4 adresa vyjádřena jako číslo může dosáhnout hodnoty až 255 miliard 255 milionů 255 tisíc 255.

Své řešení jsem navrhl proto, že mně osobně přijde nejlepší. Pokud bys měl grafické rozhraní, jednotlivé bloky IP adresy si pak můžeš jednoduše vypsat do 4 polí, v každém poli editovat pouze konkrétní část IP adresy, nemusíš teda adresu po 3 rozdělovat.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
q
~ Anonymní uživatel
219 příspěvků
20. 3. 2015   #7
-
0
-

#6 ondrej39
1. Je úplně jedno, jak tam tu adresu má, protože to vůbec neřeší.
2. Uint32 se na IPv4 adresu běžně používá. Na hodnotu 0 až 255 stačí 8 bitů a 4 * 8 je 32, víme?
3. Nepiš pořád všude nesmysly.

Nahlásit jako SPAM
IP: 78.156.159.–
vitamin+8
Grafoman
20. 3. 2015   #8
-
0
-

#6 ondrej39
Predstav si to takto:

typedef union{
	struct{
		uint8_t A;
		uint8_t B;
		uint8_t C;
		uint8_t D;
	};
	uint32_t IP;

}IPv4Addr;
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ondrej39+1
Věrný člen
20. 3. 2015   #9
-
0
-

#8 vitamin
Čím se tvůj příklad liší od tvého, kromě úplně zbytečné union, kterou stejně žádné místo neušetříš?

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
ondrej39+1
Věrný člen
20. 3. 2015   #10
-
0
-

#7 q
Nacpání IPv4 adresu do jednoho intu násobením daných částí na příslušné mocniny ti ve finále stejně nic nevyřeší. V reálném světě nikdy nevzdáváš IP třeba jako 2376053201, vždycky ji budeš zadávat po těch trojčíslích, tak proč ji tak rovnou neuchovat?

Ano, s jedním uintem můžeš potom udělat jen ipPrvni > ipDruha, ale na zobrazení konkrétní adresy budeš ve finále potřebovat stejně 4 integery a abys části dostal musíš ještě dělit.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
vitamin+8
Grafoman
20. 3. 2015   #11
-
0
-

#10 ondrej39
Naco nasobenie?

#include <stdio.h>
#include <stdint.h>


uint32_t init_ip(uint8_t a, uint8_t b, uint8_t c, uint8_t d){
    uint8_t tmp[4] = {a, b, c, d};
    return *(uint32_t*)tmp;
}

void print_ip(uint32_t ip){
    uint8_t tmp[4];
    *(uint32_t*)tmp = ip;

    printf("%d.%d.%d.%d", (int)tmp[0], (int)tmp[1], (int)tmp[2], (int)tmp[3]);
}


int main(){
    uint32_t ip = init_ip(123, 255, 32, 14);

    print_ip(ip);

}
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ondrej39+1
Věrný člen
20. 3. 2015   #12
-
0
-

#11 vitamin
No nic, uznávám, jsem úplně retardovanej, proč to navíc ukládat do 32 bitového unsigned integeru prostě nechápu, když to můžeš mít hned rozdělené do čtyř částí uvnitř struktury (ať by se použila moje, nebo tvoje verze - spíš tvoje, je o celých 32 bitů úspornější, jak jsem nepoužil 8 bitový integer ale 16 bitový short).

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
vitamin+8
Grafoman
20. 3. 2015   #13
-
+1
-
Zajímavé

#12 ondrej39
Tak s 1 intom sa manipuluje jednoduhsie ako so 4 intami, napr ked budes chciet zistit adresu siete staci tie jeden & s maskou a mas adresu site...

Porovnavanie adries je tiez jednoduhsie.

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
xxx7691
~ Anonymní uživatel
16 příspěvků
20. 3. 2015   #14
-
0
-

Ahojte. 
Nechcel som tu spôsobiť hádku :) dosť veľa vecí mi aj tak nie je jasné :) ako som písal nie som programátor skúsený. A keď som si znova prečítal svoj príspevok, zistil som, že som sa zle vyjadril. Možno aj kvôli tomu tá nejasnosť. Nechcem zistiť veľkosť adresy, ale chcem porovnať hodnotu BEZPEČNOSŤ daných adries. Citujem svoj príspevok, v ktorom bol preklep: 

"Teda potrebujem pristúpiť k tej hodnote BEZPECNOST a vybrať polovicu IP adries ktoré budú mať najväčšie adresy?" najvacsiu hodnotu bezpečnosti. Beriem späť teda a ospravedlnujem sa. Snáď sa už chápeme. Možno toto bude jednoduchšie ako tie IPčky. :) Len neviem ako pristúpiť ku štruktúre (tej v ktorej sa tá hodnota uchováva, spolu s IP adresami) a porovnávať danú premennú Bezpečnosť. 
Ďakujem.  

Nahlásit jako SPAM
IP: 94.136.137.–
vitamin+8
Grafoman
20. 3. 2015   #15
-
0
-

#14 xxx7691 

TABULKA_PARANETROV x;

if(x.BEZPECNOST > 3.14){
	//...
}

TABULKA_PARANETROV* y = &x;    //cez pointer

if(y->BEZPECNOST > 3.14){
	//...
}

najjednoduhsie bude asi spravyt si pole pointrov na TABULKA_PARANETROV a to zoradit bodla parameta BEZPECNOST.

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
xxx7691
~ Anonymní uživatel
16 příspěvků
21. 3. 2015   #16
-
0
-

Ďakujem za radu :) idem skúsiť. 

Nahlásit jako SPAM
IP: 94.136.137.–
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, 32 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ý