Argumenty z příkazového řádku v C++

dword

Re:Argumenty z příkazového řádku v C++
« Odpověď #15 kdy: 12. 06. 2014, 15:17:52 »
To je moc velke sousto najednou, jediny zpusob jak to vyresit je to za tebe napsat. Ale celkem pekne jsi nastinil o co ti jde, jak chces ktere veci resit atd. Musis to rozdelit na jednotlive podproblemy a posilat je tady postupne, jestli se to ma nekam hnout.

Tridu jsi sice popsal slovy, ale chtelo by to videt ji kompletni, vcetne definic clenskych trid, pokud se na tom ma neco stavet.

Zkusim aspon odpovedet na par problemu co jsem si vsiml, ze resis.

PATH_MAX... tu konstantu vylozene nepotrebujes, rozhodne v <stdio.h> ji nema smysl hledat, jestli se chces rychle pohnout dal, ale na jejim pouziti trvas, definuj si ji prozatim sam
Kód: [Vybrat]
#define PATH_MAX 255
Zde neni potreba davat podminky do cyklu, elegantnejsi je zpracovat argument s indexem 0 pred cyklem a cyklus pustit s pocatecni hodnotou "i = 1"

Kód: [Vybrat]
int _tmain(int argc, _TCHAR* argv[])
{
_TCHAR *a;
cCurrentPath = _getcwd( NULL, 0);

        a = argv[0];

for(int i = 1; i < argc; i++)
{
//source[i]...
}

_getch();
return 0;
}

Citace
source.src - pole s objekty zdrojů např. pod source.src[0] by byl objekt který bude obsahovat minimální a maximální hodnoty RGB.
ale nevím jestli v c++ je možné přistupovat k objektům takto? source.src[0].min.h     a source.src[0].max.h

Je to v pohode zapis, pokud mas definovane vsechny ty podtridy nebo struktury, nevidim tam problem.

Navrh mas celkem jasny, trosku otravny mi prijde ten dynamicky parsing parametru, ale nic co by se take nedalo zvladnout.

Podukolu je tam hafo, napis tu znova az se zaseknes na nejakem konkretnim dalsim a pak mohu poradit.


D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re:Argumenty z příkazového řádku v C++
« Odpověď #16 kdy: 12. 06. 2014, 15:23:20 »
Pokud se nepletu, tak prikaz foreach v PHP pracuje s asociativnimi poly. Neni tedy lepsi v C++ pouzit rovnou tridu std::map (ci podobny datovy typ), misto vyuzivani nestandardnich a neprenosytelnych rozsireni kompilatoru? Navic osobne bych dal pro zpracovani parametru programu prednost vyuziti funkce getopt( )

std::map : http://www.cplusplus.com/reference/map/map/
example  : http://www.cplusplus.com/reference/map/map/begin/
getopt( ) : http://www.gnu.org/software/libc/manual/html_node/Getopt.html#Getopt 

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #17 kdy: 12. 06. 2014, 16:10:35 »
Napsal jsem RGB, a měl jsem napsat HSB. Ty hodnoty jsou v HSB - odstín saturace světlost.
Ještě poznámka. s kontejnerem map jsem nikdy nepracoval, spíš jsem něco četl o vektorech. Je dobré myslet na to že by to mělo být co nejjednodušší ke čtení a vyhodnocování. Tedy iniciace je jedna věc, tam se čas až tak nepočítá, ale jakmile pojede smyčka která bude číst pixely obrazu např. 4000x4000 a budu hodnotu rgb přepočítávat na hsb a porovnávat s nastavenýma hodnotama a dále případně ještě porovnávat s druhým zdrojovým souborem, tak pak už ten výkon hraje roli.

nejdříve se snažím navrhnout jak poskládat ty věci správně aby to bylo správně zabalené. Mám už funkci na převod barev kterou bych měl taky strčit do třídy:

Kód: [Vybrat]
class MyColorConverter{
  // Struktury pro funkci a převod barev rgb2hsv a hsv2rgb:
  private:
  struct RGB { int r; int g; int b; } rgb;
  struct HSV { float h; float s; float v; } hsv;
  struct STAT { float min; float max; } Stat;
  getMinMax(float R, float G, float B);
  // Struktury pro funkci a převod barev rgb2hsv a hsv2rgb:
  public:
  rgb2hsv(RGB, *HSV);
  hsv2rgb(HSV, *RGB);
}

class MyGlobalClass{
  public:
  // options types:
  struct RGB { int r; int g; int b; };
  struct HSV { float h; float s; float v; };
  struct OPTIONS { HSV from; HSV to; RGB replace; };
}

I když asi by ty struktury měly být zanořeny v třídě kterou budu dělat pro source

Konkrétní problém na kterém jsem se zasekl hned na začátku, takže nevím jak dál je v tom jak vyřešit to
source.src[0] aby obsahovalo objekt. Mám udělat .src jako vektor?

Snad takto?
Kód: [Vybrat]
    vector<OPTIONS*> src(255);

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re:Argumenty z příkazového řádku v C++
« Odpověď #18 kdy: 12. 06. 2014, 16:27:41 »
Dobre, tak ten tvuj priklad s mesty se pomoci std::vector da udelat naprosto jednoduse za pouziti standardnich iteratoru, bez pouzivani "vymozenosti", ktere do daneho jazyka nepatri. Na screenshotu mas prepsany cely priklad, odladeny a spusteny

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #19 kdy: 12. 06. 2014, 16:47:07 »
D.A. Tiger dík, dobře bude se hodit.


webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #20 kdy: 12. 06. 2014, 17:00:37 »
 'struct' : missing tag name
jak mám odkázat na třídu zevnitř? Něco jako MyColorConverter::RGB . V php je SELF:: ale v C++ si nevzpomínám.
Kód: [Vybrat]
class MyColorConverter{
  // Struktury pro funkci a převod barev rgb2hsv a hsv2rgb:
  private:
  struct RGB { int r; int g; int b; } rgb;
  struct HSV { float h; float s; float v; } hsv;
  struct STAT { float min; float max; } Stat;
  void getMinMax(float R, float G, float B);
  // Struktury pro funkci a převod barev rgb2hsv a hsv2rgb:
  public:
  void rgb2hsv(struct RGB rgb, struct *HSV hsv){};
  void hsv2rgb(struct HSV hsv, struct *RGB rgb){};
}

mankind_boost

Re:Argumenty z příkazového řádku v C++
« Odpověď #21 kdy: 12. 06. 2014, 17:17:21 »
Musí bejt public. Když je private, tak se k tomu zvenčí nedostaneš (k tomu to private přece existuje).

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #22 kdy: 12. 06. 2014, 17:19:45 »
Chci tomu přistoupit zevnitř té třídy, to není zvenku ne?

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #23 kdy: 12. 06. 2014, 17:22:43 »
Potřebuji říct kompilátoru, kde je třída rgb. Ona je uvnitř té třídy ale SELF:: tady nefunguje. Tak jak?
Kód: [Vybrat]
void rgb2hsv(struct RGB rgb, struct *HSV hsv){};

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re:Argumenty z příkazového řádku v C++
« Odpověď #24 kdy: 12. 06. 2014, 17:33:44 »
Mas na mysly tohle?
Kód: [Vybrat]
MyGlobaClass::RGB rgb;
Ale proc tak? Proc ty struktury nedeclarujes samostatne mimo tridy? Odpadnou ti potom (napr.) problemy s lexikalnim rozsahem. Navic v obou tridach definujes zbytecne stejne datove typy (RGB a HSV).

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #25 kdy: 12. 06. 2014, 17:44:18 »
Dobře, udělal jsem jak říkáš, ale stále dostávám tu hlášku, že struct rgb ve třídě MyColorConverter nemá definovaný "tag name". Nejsem si ani jistý co to je. je tam rgb a to by mělo stačit...

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #26 kdy: 12. 06. 2014, 17:49:52 »
Kód: [Vybrat]
#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <direct.h>
// #include <stdio.h>  /* NO!: defines FILENAME_MAX */
// #include <direct.h>
#include <conio.h>

#define PATH_MAX 255

using namespace std;

char cCurrentPath[FILENAME_MAX];

struct RGB { int r; int g; int b; } rgb;
struct HSV { float h; float s; float v; } hsv;
struct STAT { float min; float max; } Stat;
class MyColorConverter{
  // Struktury pro funkci a převod barev rgb2hsv a hsv2rgb:
  private:
  void getMinMax(float R, float G, float B);
  // Struktury pro funkci a převod barev rgb2hsv a hsv2rgb:
  public:
  void rgb2hsv(struct RGB rgb, struct *HSV hsv){};
  void hsv2rgb(struct HSV hsv, struct *RGB rgb){};
};
class MyGlobalClass{
  public:
  // options types:
  struct OPTIONS { HSV from; HSV to; RGB replace; };
};
class Src
{
  public:
  vector<string> sources;
  vector<OPTIONS*> sources;
      Src();
     ~Src();
};


int _tmain(int argc, _TCHAR* argv[])
{
_TCHAR a[PATH_MAX];
vector<string> cities;
string city;
cities.push_back("Seattle");
    cities.push_back("Los Angeles");
vector<string>::iterator it;
for(it = cities.begin(); it != cities.end(); it++)
{
city=(*it);
cout << city << "\n";
}

// cCurrentPath = _getcwd( NULL, 0);
for(int i = 0; i < argc; i++)
{
// a = argv[i];
/*if ( i ==1 )
source[1]*/
}

_getch();
return 0;
}

Kód: [Vybrat]
args.cpp(25): error C2332: 'struct' : missing tag name
args.cpp(25): error C2146: syntax error : missing ',' before identifier 'hsv'
args.cpp(26): error C2332: 'struct' : missing tag name
args.cpp(26): error C2146: syntax error : missing ',' before identifier 'rgb'
args.cpp(37): error C2065: 'OPTIONS' : undeclared identifier
args.cpp(37): error C2059: syntax error : '>'
args.cpp(40): error C2143: syntax error : missing ';' before '}'
args.cpp(43): error C2065: 'argv' : undeclared identifier
args.cpp(43): error C2059: syntax error : ']'
args.cpp(44): error C2143: syntax error : missing ';' before '{'
args.cpp(51): error C2143: syntax error : missing ')' before ';'
args.cpp(51): error C2059: syntax error : ')'
args.cpp(52): error C2143: syntax error : missing ';' before '{'
args.cpp(55): error C2143: syntax error : missing ';' before '}'
args.cpp(58): error C2143: syntax error : missing ')' before ';'
args.cpp(58): error C2059: syntax error : ')'
args.cpp(59): error C2143: syntax error : missing ';' before '{'
args.cpp(63): error C2143: syntax error : missing ';' before '}'
args.cpp(67): error C2143: syntax error : missing ';' before '}'
args.cpp(69): error C2143: syntax error : missing ';' before '}'
args.cpp(69): fatal error C1004: unexpected end-of-file found

DK

Re:Argumenty z příkazového řádku v C++
« Odpověď #27 kdy: 12. 06. 2014, 17:57:52 »
Kód: [Vybrat]
#include <vector>
#include <iostream>
// #include <stdio.h>  /* NO!: defines FILENAME_MAX */
// #include <direct.h>
#include <cstdio>

#define PATH_MAX 255

using namespace std;

char cCurrentPath[FILENAME_MAX];

struct RGB { int r; int g; int b; };
struct HSV { float h; float s; float v; };
struct STAT { float min; float max; };

class MyColorConverter{
  // Struktury pro funkci a převod barev rgb2hsv a hsv2rgb:
  private:
  void getMinMax(float R, float G, float B);
  // Struktury pro funkci a převod barev rgb2hsv a hsv2rgb:
  public:
  void rgb2hsv(RGB rgb, HSV hsv){};
  void hsv2rgb(HSV hsv, RGB rgb){};
};
class MyGlobalClass{
  public:
  // options types:
  struct OPTIONS { HSV from; HSV to; RGB replace; };
};
class Src
{
  public:
  vector<string> sources;
  vector<MyGlobalClass::OPTIONS*> sources2;
      Src();
     ~Src();
};


int main(int argc, char* argv[])
{
char a[PATH_MAX];
vector<string> cities;
string city;
cities.push_back("Seattle");
    cities.push_back("Los Angeles");
vector<string>::iterator it;
for(it = cities.begin(); it != cities.end(); it++)
{
city=(*it);
cout << city << "\n";
}

// cCurrentPath = _getcwd( NULL, 0);
for(int i = 0; i < argc; i++)
{
// a = argv[i];
/*if ( i ==1 )
source[1]*/
}

 getchar();
return 0;
}


a asi bych zacal uplnym zakladem c++

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re:Argumenty z příkazového řádku v C++
« Odpověď #28 kdy: 12. 06. 2014, 17:58:14 »
Zkus tohle.
Kód: [Vybrat]
class MyColorConverter{
  // Struktury pro funkci a převod barev rgb2hsv a hsv2rgb:
  private:
  void getMinMax(float R, float G, float B);
  // Struktury pro funkci a převod barev rgb2hsv a hsv2rgb:
  public:
  void rgb2hsv( const RGB &rgb, HSV *hsv) {};
  void hsv2rgb( const HSV &hsv, RGB *rgb) {};
};

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Argumenty z příkazového řádku v C++
« Odpověď #29 kdy: 12. 06. 2014, 18:00:30 »
Ve widlích neprogramuju, ale čekal bych, že budou mít nějakou nativní podporu pro zpracování argumentů předhozených programu v commandlajně.

Eh, myslím, že ne. Ale dá se využít ta z boost knihovny http://www.boost.org/doc/libs/1_55_0/doc/html/program_options.html .