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

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #45 kdy: 12. 06. 2014, 18:51:01 »
DK: Tutorialy mají právě tu nevýhodu, že se tam ten kód kopíruje příp. musíš ho přizpůsobit aby to vůbec jelo. Není jiné cesty pro samouka.


D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re:Argumenty z příkazového řádku v C++
« Odpověď #46 kdy: 12. 06. 2014, 19:06:16 »
Achjo chlape ty jsi, ale tvrdohlavy. Vzdyt tu otazku jsem se snazil ti odpoved jiz drive. Jak ale chces :
k prvkum tridy se pristuje pomoci kvlifikatoru '::'
k prvkum instance tridy muzes pristoupit pomoci staticka_instance.prvek, ukazatel_na_instanci->prvek, this->prvek

tak si tedy vyber.

DK

Re:Argumenty z příkazového řádku v C++
« Odpověď #47 kdy: 12. 06. 2014, 19:11:54 »
pokud trida "nebyla vytvorena", musis ji nejdrive deklarovat

DK

Re:Argumenty z příkazového řádku v C++
« Odpověď #48 kdy: 12. 06. 2014, 19:14:09 »
a ne, tutorialy te nenuti slepe kopirovat kod, naopak je tam vysvetleno, co to vlastne zapisujes, to je spravna cesta pro samouka (nebo si koupit knihu)...


zacni treba tady - http://www.cplusplus.com/doc/tutorial/

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #49 kdy: 12. 06. 2014, 19:20:46 »
DK: To jsem bral v létě a v listopadu minulého roku.


webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #50 kdy: 12. 06. 2014, 19:23:47 »
Tiger: Z toho co píšeš to chápu takhle:
Kód: [Vybrat]
  public:
  void rgb2hsv(const MyGlobalClass->RGB &rgb,
  const MyGlobalClass->HSV *hsv){};
  void hsv2rgb(const MyGlobalClass->HSV &hsv, const MyGlobalClass->RGB *rgb){};
Ale tím dostávám chybu zas to samou co předtím:
missing type specifier - int assumed. Note: C++ does not support default-int

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Argumenty z příkazového řádku v C++
« Odpověď #51 kdy: 12. 06. 2014, 19:47:35 »
const MyGlobalClass->HSV &hsv

rozhodně ne.

Deklaruj MyGlobalClass v nějakém hlavičkovém souboru (dobrá konvence je přípona .h pokud obsahuje pouze rozhraní, .hpp pokud obsahuje i implementaci, ale extra často se nepoužívá).

Ten hlavičkový soubor includni.

Jestli metody rgb2hsv a hsv2rgb jsou v MyGlobalClass, pak zkus struktury deklarovat PŘED tím, než je použiješ.

Pak snad není důvod, aby nefungovalo void rgb2hsv(const MyGlobalClass::RGB &rgb, const MyGlobalClass::HSV &hsv){};

Jinak použití referencí je obvykle preferováno nad ukazateli. Dá se použít chytrý ukazatel (std::unique_ptr, std::shared_ptr a std::weak_ptr v hlavičce <memory> pro C++ 11; pro C++ 03 byl dostupný std::auto_ptr, který je teď deprecated a jeho funkci plní právě shared_ptr), který se obvykle předává jako konstantí reference: void function(const shared_ptr<MyGlobalClass::RGB>& rgb). Nebudeš muset tolik myslet na paměť.

C++ je dost komplexní jazyk, dá se v něm psát čitelný high-level kód na první pohled k nerozeznání od Javy nebo C#, na druhou stranu jsou tam věci pro opravdu low-level programování a spousta konstrukcí, které Ti umožní se střelit do nohy a ustřelit si ji. Jo a to, že v hlavičkovém souboru zapomeneš středník, zdechne Ti kompilace a kompilátor ohlásí nesmyslnou chybu v dalším includnutém souboru, což klidně může být <iostream>, je normální. Rozhodně to není dobrý jazyk pro učení se základů.

A jinak opravdu, chybí Ti naprosté základy. Pustil ses na své schopnosti do příliš složitého projektu. Sorry, že Ti to znovu píši (já vím, už Tě to musí s..t, je to snad po páté), ale když si přiznáš, že na to teď nemáš, budeš věnovat měsíc až dva učením se základů C++ od znova, může z Tebe být dobrý programátor. Vůli na to máš. Argument, že máš za sebou 2 semestry je mimo - neumíš základy. Stejně tak argumentace zkušenostmi z PHP... ve Tvém případě je to 0 a ani zdvojnásobení nebude mít efekt.

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #52 kdy: 12. 06. 2014, 19:47:51 »
Tak jsem na to konečně přišel. Zase jsem to jméno nacpal všude proto mi to nejelo! Mělo tam být
Kód: [Vybrat]
  public:
  void rgb2hsv(const MyColorConverter::RGB &rgb, const MyColorConverter::HSV *hsv){};
  void hsv2rgb(const MyColorConverter::HSV &hsv, const MyColorConverter::RGB *rgb){};

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re:Argumenty z příkazového řádku v C++
« Odpověď #53 kdy: 12. 06. 2014, 19:55:30 »
Tiger: Z toho co píšeš to chápu takhle:
Kód: [Vybrat]
  public:
  void rgb2hsv(const MyGlobalClass->RGB &rgb,  const MyGlobalClass->HSV *hsv){};
  void hsv2rgb(const MyGlobalClass->HSV &hsv, const MyGlobalClass->RGB *rgb){};
Ale tím dostávám chybu zas to samou co předtím:
missing type specifier - int assumed. Note: C++ does not support default-int
To chapes spatne. Jak jsem psal operator -> se pouziva pro pristup k DATUM, nebo METODAM INSTANCE TRIDY. Spravne bu to melo byt podle meho skromneho nazoru takto:


public:
  void rgb2hsv(const MyGlobalClass::RGB &rgb, MyGlobalClass::HSV *hsv){}
  void hsv2rgb(const MyGlobalClass::HSV &hsv, MyGlobalClass::RGB *rgb){}

Prvni argument predas hodnotou, takze se nekopiruje, ale jako konstantu, tudis jej nemuzes menit (pouze cist hodnoty). Do druheho argumentu budes vkladat vysledky hodnot, tudis na nej predas ukazatel, a je zbytecne, aby byl const. Prvni argument oba argumenty jsou subtypy tridy MyGlobalClass. Proto pouzijes kvalifikator ::

Apropo
a) proc ty funkce nedeklarujes tak aby vysledek vracely? Tedy napr. takto:
  MyGlobalClass::HSV* rgb2hsv( const MyGlobalClass::RGB &rgb) { }

b) Kde mas vubec vlozenou deklaraci tridy MyGlobalClass? Ve stejnem souboru?

c) pokud pri deklaraci metodu rovnou implementujes ( i prazdnou ) za slozenymi zavorkami se nepise strednik.

Chlape je toho moc a to jsou opravdu chyby, ktere by jsi mel vychytat prave pri prepisovani tech tutorialu. Jak myslis, ze jsem se C/C++ ucil ja a mnoho dalsich?

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re:Argumenty z příkazového řádku v C++
« Odpověď #54 kdy: 12. 06. 2014, 19:57:41 »
Tak jsem na to konečně přišel. Zase jsem to jméno nacpal všude proto mi to nejelo! Mělo tam být
Kód: [Vybrat]
  public:
  void rgb2hsv(const MyColorConverter::RGB &rgb, const MyColorConverter::HSV *hsv){};
  void hsv2rgb(const MyColorConverter::HSV &hsv, const MyColorConverter::RGB *rgb){};

Jo to je spravne, akorad odstran ty stredniky za zavorkami a psat modifikator 'const' u ukazatele je zbytecne, protoze ukazatel je jen cislo ukazujici do pameti, kde se nachazi pozadovana hodnota.

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #55 kdy: 12. 06. 2014, 20:02:25 »
Chyba se týkala ne třídy MyGlobalClass ale třídy MyColorConverter - prostě jsem slepý no, nebo moc zbrklý při tom přepisování kódu.

Ten kvalifikátor :: jsem tam už musel zkoušet předtím ale měl jsem tam nejspíš nesprávné jméno.

JJ já to pak deklaruju zvlášť do .h, ale když člověk píše na forum tak zase po mě lidi chtějí kompletní kód

Struktury jsem už deklaroval ale tady mi nedává smysl proč vytvářet ti "instance". Tohle mě příjde jako že bych spíše měl vytvořit třídu místo struktur. Proč? Protože rgb a hsv uvnitř MyGlobalClass mají být uvnitř vektoru MyGlobalClass.source<vector>.src nebo jak se to má správně psát. Naco vytvářet rgb, hsv instance když je zde nepoužiju. Potřebuju jen deklarovat ten typ. Proto jsem se to snažil psát bez jmén. C++11 se radši vyhnout, na VS 2010 mi to nejede i když iniciační seznamy mi tam fungujou tak ten zbytek věcí ne. S těmi referencemi nemám zkušenosti, já bych se do toho zatím raději nepouštěl.

To ne to si nepřiznám, protože bych se nikam nedostal. Já totiž když čtu ty dlouhé tutorialy co jsou v cplusplus a skončím tak stejně si z toho nic nepamatuju a nevím nic co bylo na začátku bo než to dojedu tak to zapomenu. Praxe a praxe, opakování a opakování je jediná cesta jak se něco naučit. Taky už mám nějaké zkušenosti, protože v minulosti mě už lidé podobně odrazovali a naštěstí jsem je neposlechl a dotáhl to úspěšně do konce. Dnes píšu mnohem složitější programy než tyto v jiných jazycích. Taky si uvědom, že kdybych měl pokaždé začínat odznova jen proto že mi někdo naforu řekl ať začnu znova, tak bych už musel resetovat 4x!!! A byl bych stále na nule a jen a jen u blbé nevyzkoušené teorie!!!

 

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #56 kdy: 12. 06. 2014, 20:37:44 »
Já ale nejsem ty. Každý se učí jinak a já tuplem jinak než ty.

Takže tady je to funkční:

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];

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

_getch();
return 0;
}


Ještě bych potřeboval odpověď na to jestli ty struktury v MyGlobalClass mají smysl, nebo spíš to přepsat na třídu abych nevytvářel instanci. Stejně tam ta instance je na nic. Ten typ má sloužit k tomu abych mohl ve vectoru vytvořit či deklarovat ty options, čili abych volby z přík. řádku mohl uložit do vektoru/do objektu.

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re:Argumenty z příkazového řádku v C++
« Odpověď #57 kdy: 12. 06. 2014, 20:58:27 »
To, ze nejsi ja a neucis se stejne jako ja, je samozrejme pravda a je to tak dobre. Zas na druhou stranu do C/C++ fusuju uz o dost delsi dobu nez ty a tak si dovoluji drze osocovat narok na nejake ty zkusennosti, alespon co se tyce problemu, ktere pri tom mohou nastat. A to ja jsem pred C++ nemel nic lepsiho nez QBASIC. Co je o dost vetsi rozdil oproti C++ jak PHP. A mozna take male plus, ale to je jedno. Chci jen rict, ze ti radu poradne si projit, prepsat a zkompilovat tutorialy nerikame jen tak pro nic za nic. Vetsinou jsou odladene a chyby jsou vychytane, tak peclivym porovnavanim toho co jsi udelal a co je v tutorialu se naucis odhalovat jednak syntaxni chyby (zapomenuty, prebytecny strednik, hvezdicka ukazatele na nespravnem miste, atp...), jejich studiem zaroven zjistujes jak veci funguji a proc je programator pred tebou napsal prave takto a osvojujes si zakladni konstrukce jazyka a navic se jej ucis i cist. To jsou proste osvedcene postupy, ale pokud jsi masochysta ... nu proti gustu zadnej disputat. Ale potom, az se ti to jednoho dne zprotivy a ty dojdes k tomu, ze C++ je tva nocni mura, nenadavej na nej.   

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re:Argumenty z příkazového řádku v C++
« Odpověď #58 kdy: 12. 06. 2014, 21:02:19 »
A jeste jedno doporuceni - uc se ciste C a C++. Nadstandardnim rozsirenim (kterymi je zrovna VC prervany k prasknuti a z drtive vetsiny jsou naprosto nanic) se venuj az zvladnes zaklad jazyka. Akorad ti budou zbytecne mast a vest k defektni tvorbe kodu.

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #59 kdy: 12. 06. 2014, 21:08:14 »
Problem je v tom že ty jejich tutorialy řeší vždycky něco jiného - jejich kód je vždycky odlišný a nikdy mi nedal to co jsem potřeboval jakožto celek. Jen útržky které jsem musel poslepovat. Dám příklad. Místo objektů v tutorialu o třídě nebo vektoru používaj stringy nebo integery. Kdežto já hledám komplexnější řešení. Jejich tutorialy často řeší něco jiného, specifického pro konkrétní problém.