Navržení stavby programu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Navržení stavby programu – C / C++ – Fórum – Programujte.comNavržení stavby programu – C / C++ – Fórum – Programujte.com

 

hajnis0
Newbie
28. 12. 2011   #1
-
0
-

Dobrý de,

Při programování jsem narazil na takový problém( řadím se spíše k začátečníkům):

Mám n proměnných libovolně pojmenovaných, kde každá z nich odkazuje na určitý offset v souboru a stejný počet proměnných x, které se jmenují stejně jako n, pouze s velkými písmeny, kde do každé proměnné x by se měla uložit nějaká hodnota . Dále cyklus, který dělá operaci, při níž si na vstupu sebere informaci offsetu proměnné n a na výstupu uloží vypočítanou hodnotu do proměnné x. Problém je ale v tom, že nevím, jak při každém cyklu měnit vstupní proměnné n a k nim náležící proměnné x, aniž bych to musel otrocky vypisovat ručně.

Díky za odpovědi

Nahlásit jako SPAM
IP: 93.153.11.–
liborb
~ Redaktor
+18
Guru
28. 12. 2011   #2
-
0
-

A co použít pole ...nebo pole struktur ... ?

Nahlásit jako SPAM
IP: 78.80.52.–
hajnis0
Newbie
28. 12. 2011   #3
-
0
-

Ano pole struktur by se tam mělo použít, horší je že nevím jak.

Nahlásit jako SPAM
IP: 93.153.11.–
liborb
~ Redaktor
+18
Guru
28. 12. 2011   #4
-
0
-

A nějaká ukázka by nebyla? Z toho tvého popisu mi vychází triviální cyklus, ale je možné, že jsem to špatně pochopil.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.210.–
hajnis0
Newbie
28. 12. 2011   #5
-
0
-

   

unsigned int App1,NulAdres,MI,Exif;
unsigned char info[65536]; // v promenne info jsou nahrana vsechna data
/*vstupni promenne*/
unsigned int tag=0x0132,tag2=0x0100,tag3=0x0101;
unsigned char datetime[20],width[n],lenght[n];
unsigned int typ,pocet,offset,kontrola;

/*zjistovani souradnice tagu pro MM*/
		for(int i=0x0000;i<0xFFFF;i++){
			kontrola=((info[i]*0x0100) + info[i+1]*0x0001);
			if(tag==kontrola){// tag je vstupni promenna
				cout<< "\nRadek: "<<hex<<i<<"\n";
				i+=2;
				kontrola=((info[i]*0x0100) + info[i+1]*0x0001);
				typ=kontrola;
				cout<< "\nTyp: "<<hex<<typ<<"\n";
				i+=2;
				kontrola=((info[i]*0x01000000)+(info[i+1]*0x010000)+(info[i+2]*0x0100) + info[i+3]*0x0001);
				pocet=kontrola;
				cout<< "\npocet bytu: "<<pocet<<"\n";
				i+=4;
				kontrola=((info[i]*0x01000000)+(info[i+1]*0x010000)+(info[i+2]*0x0100) + info[i+3]*0x0001);
				offset=kontrola;
				cout<< "\nna offsetu: "<<hex<<offset<<"\n";
				break;
			}else if(i==0xFFFE){
				cout<<"\nInformace datum vyfoceni nebyla nalezena\n";
			}
		}

		/*zjistovani exif informace pro MM*/
		Exif=NulAdres+offset+pocet;
		for(int i=NulAdres+offset+1,y=0;i<Exif;i++,y++){
			datetime[y]= info[i];
			cout<<hex<<datetime[y];//vystupni promenna datetime 
		}

A nyní to potřebuji dát ještě do dalšího cyklu, který mi bude střídat proměnnou tag a datetime za další tj. místo tag se hodí proměnná tag2 a data se nebudou ukládat do proměnné datetime ale width atd..

Vím, že se to má dělat nějak pomocí těch polí, ale stále mi to nechce docvaknout

Nahlásit jako SPAM
IP: 93.153.11.–
zlz
~ Anonymní uživatel
634 příspěvků
28. 12. 2011   #6
-
0
-

Na co další cyklus? Podle toho jaký tag čteš, takovou hodnotu nastav. na to ti stačí if v jednom cyklu.

Nahlásit jako SPAM
IP: 213.211.51.–
hajnis0
Newbie
28. 12. 2011   #7
-
0
-

#6 zlz
ale já potřebuji aby se ty tagy a datové proměnné do kterých se narve informace prostřídaly automaticky a to bych právě udělal v tom hlavním cyklu

Nahlásit jako SPAM
IP: 93.153.11.–
hajnis0
Newbie
28. 12. 2011   #8
-
0
-

Tak už jsem přišel na to, jak zapsat pole struktur pro tagy:

unsigned int tag;
struct exif{
		char *tag;
		unsigned short adresa;
	}tabulka [] = 	
	{
		{"exifverze", 0x9000},
		{"datumorigin", 0x9003},
		{"vyskapx", 0x0100},
		{"delkapx", 0x0101},
		{"komprese", 0x0103},
		{"datumzmena", 0x0132},
		{"nazev", 0x010E},
		{"model", 0x0110},
		{"software", 0x0131},
		{"fotograf", 0x013B},
		{"barevnepodlozi", 0xA001},
		{"poznamka", 0x927C},
		{"komentar", 0x9286},
		{"scenerie", 0x1301},
		{"zdrojprogramu", 0xA300},
		{"expozicnicas", 0x829A},
		{"silablesku", 0xA20B},
		{"blesk", 0x9209},
	};
for(int i=0; i<=sizeof(tabulka);i++){
tag= tabulka[i].adresa;
/*.....*/

Tak nějak by to mohlo jít, jen nevím jak takhle obměňovat proměnné kde do každé se nahraje jiná informace..

Nahlásit jako SPAM
IP: 93.153.11.–
zlz
~ Anonymní uživatel
634 příspěvků
28. 12. 2011   #9
-
0
-

Já jsem vyplodil toto, nevím jestli se ti to takhle hodí

class Tag
{
	uint16_t mTag, mType;
	uint32_t mCount;
	uint8_t *mData;

public:
	Tag(uint16_t aTag, uint16_t aType, uint32_t aCount, uint8_t *aData)
	: mTag(aTag), mType(aType), mCount(aCount), mData(0)
	{
		if (!TypeSize(aType) || !aCount || !aData)
		{
			mType = mCount = 0;
			return;
		}

		size_t size = mCount * TypeSize(mType);
		mData = new uint8_t[size];
		memcpy(mData, aData, size);
	}

	static size_t TypeSize(uint16_t aType)
	{
		switch (aType)
		{
		case 1: return 1; // byte
		case 2: return 1; // ascii
		case 3: return 2; // short
		case 4: return 4; // long
		//...
		}
		return 0;
	}

	uint32_t Data(size_t index)
	{
		if (index < mCount)
		{
			uint8_t *p = mData + index * TypeSize(mType);
			switch (mType)
			{
			case 1: return GET8(p);
			case 2: return GET8(p);
			case 3: return GET16(p);
			case 4: return GET32(p);
			}
		}
		return 0;
	}

	string String()
	{
		stringstream ss;
		switch (mType)
		{
		case 1:
		case 3:
		case 4:
			for (uint32_t i = 0; i < mCount; i++)
				ss << Data(i) << " ";
			break;
		case 2:
			for (uint32_t i = 0; i < mCount; i++)
				ss << (char)Data(i);
			break;
		default:
			ss << "[tag " << mTag << "]";
		}
		return ss.str();
	}
};
typedef map<uint16_t,Tag*> tagmap;

tagmap mapa;

for (int i = 0; i < sizeof(info); i += 12)
{
	uint16_t tag = GET16(&info[i]);
	uint16_t type = GET16(&info[i+2]);
	uint32_t count = GET32(&info[i+4]);
	uint32_t offset = GET32(&info[i+8]);

	size_t size = count * Tag::TypeSize(type);

	if (count == 0 || type == 0 || size == 0 || count > 1000)
		continue;

	uint8_t *pData = (size <= 4) ? (&info[i+8]) : (start + offset);
	mapa[tag] = new Tag(tag, type, count, pData);
}

tagmap::iterator ti;
if ((ti = mapa.find(tagImageWidth)) != mapa.end())
{
	Tag *pTag = ti->second;
	cout << "width " << pTag->String() << endl;
}

if ((ti = mapa.find(tagImageLength)) != mapa.end())
{
	Tag *pTag = ti->second;
	cout << "height " << pTag->String() << endl;
}

if ((ti = mapa.find(tagDateTime)) != mapa.end())
{
	Tag *pTag = ti->second;
	cout << "datetime " << pTag->String() << endl;
}

Nahlásit jako SPAM
IP: 213.211.51.–
hajnis0
Newbie
29. 12. 2011   #10
-
0
-

#9 zlz
Asi se to hodí, jen bych poprosil, jestli bys tam nedopsal komentáře co dělá co, jak jsem psal na začátku, jsem stále spíše ten začátečník, díky

Nahlásit jako SPAM
IP: 93.153.11.–
zlz
~ Anonymní uživatel
634 příspěvků
29. 12. 2011   #11
-
0
-

Tak to udělej s tou tabulkou.

struct exif
{
	char *jmeno;
	uint16_t tag, type;
	uint32_t count;
	uint8_t *data;
} ...
for (int i = 0; i < sizeof(info); i += 12)
{
	uint16_t tag = GET16(&info[i]);
	uint16_t type = GET16(&info[i+2]);
	uint32_t count = GET32(&info[i+4]);
	uint32_t offset = GET32(&info[i+8]);

	size_t size = count * TypeSize(type);
	uint8_t *data = (size <= 4) ? (&info[i+8]) : (start + offset);

	for (int j = 0; j < ALEN(tabulka); j++)
	{
		if (tabulka[j].tag == tag)
		{
			tabulka[j].type = type;
			tabulka[j].count = count;
			tabulka[j].data = data;
			break;
		}
	}
}

for (int i = 0; i < ALEN(tabulka); i++)
{
	cout << tabulka[i].jmeno << ": ";

	if (!tabulka[i].data)
	{
		cout << "nichego" << endl;
		continue;
	}

	if (tabulka[i].type == 2)
		cout << (char *) tabulka[i].data << endl;
	else // ... dalsi typy
		cout << "ne ponimayu" << endl;
}

Nahlásit jako SPAM
IP: 213.211.51.–
zlz
~ Anonymní uživatel
634 příspěvků
29. 12. 2011   #12
-
0
-

#define ALEN(a) ( sizeof (a) / sizeof (a)[0] )

Nahlásit jako SPAM
IP: 213.211.51.–
hajnis0
Newbie
30. 12. 2011   #13
-
0
-

No horší je to, že já potřebuji, aby se mi na výstupu střídaly proměnné( názem i typem porměnné)

Nahlásit jako SPAM
IP: 93.153.11.–
zlz
~ Anonymní uživatel
634 příspěvků
30. 12. 2011   #14
-
0
-

Tak si do toho ifu napiš!

Nahlásit jako SPAM
IP: 213.211.51.–
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, 14 hostů

Podobná vlákna

Prace v programu C — založil Pavel

Chyba v programu — založil choice_

Uprava programu — založil Milan

Padanie programu v C — založil Erik12345

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ý