reklama

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

webhope

Argumenty z příkazového řádku v C++
« kdy: 12. 06. 2014, 10:31:36 »
Zdravím,
jsem začátečník v C++ a chtěl bych zpracovat arg. z přík. řádku. Hledám jak použít obdobu foreach() kterou jsem byl zvyklý používat v PHP. Na netu jsem jen zkušební kód, který se mi ale nepovedlo rozjet - ale na tom jen testuju ten for each.

Kód: [Vybrat]
#include "stdafx.h"
#include <vector>
#include <string>
#include <iostream>
#include <conio.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
vector<string> cities;
    cities.push_back("Seattle");
    cities.push_back("Los Angeles");

    // Use C++ "for each" construct syntax
    // to iterate over "cities" vector
    for each(string& city in cities)
    {
        cout << city << endl;
    }
_getch();
return 0;
}


a vrací mi chybu

Kód: [Vybrat]
------ Build started: Project: proccessing_args, Configuration: Debug Win32 ------
  proccessing_args.cpp
proccessing_args.cpp(20): error C2440: 'initializing' : cannot convert from 'const std::basic_string<_Elem,_Traits,_Ax>' to 'std::string &'
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>,
              _Ax=std::allocator<char>
          ]
          Conversion loses qualifiers
« Poslední změna: 12. 06. 2014, 13:38:38 od Petr Krčmář »

reklama


green lantern

Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #1 kdy: 12. 06. 2014, 11:08:05 »
Pokud je to c++11 a novejsi, tak muzes pouzit:

        vector<string> cities;
        cities.push_back("Seattle");
        cities.push_back("Los Angeles");

        for (auto &city : cities) {
                cout << city << endl;
        }


Pokud je to starsi c++ tak tam "for each" neni. Maximalne si vytvorit nejaky makro...

green lantern

Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #2 kdy: 12. 06. 2014, 11:16:07 »
Jeste kdyz se divam na tu chybu co ti to pise, tak treba ten prekladac co mas "for each" obsahuje jako nestandardni rozsireni.

V ty chybe si stezuje na const, takze by melo stacit zmenit typ na "string const &city".

Kazdopadny tyhle nekompatibilni rozsireni bych to nedoporucoval pouzivat...

webhope

Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #3 kdy: 12. 06. 2014, 11:18:48 »
Mám VS Express 2010 tak asi bych měl aktualizovat, jenže zatím jsem nepřišel na to jak to nainstalovat. Mám s tím nějaký problém.

bezprizorny

Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #4 kdy: 12. 06. 2014, 11:30:57 »
Ahoj,

táto verzia VS už podporuje časť C++11. Takže konštrukciu, čo ti radí green lantern môžeš použiť.


reklama


webhope

Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #5 kdy: 12. 06. 2014, 12:04:58 »
Hází mi to další chybu:

proccessing_args.cpp(20): error C2143: syntax error : missing ',' before ':'
proccessing_args.cpp(20): error C2530: 'city' : references must be initialized
proccessing_args.cpp(20): error C3531: 'city': a symbol whose type contains 'auto' must have an initializer
proccessing_args.cpp(20): error C2143: syntax error : missing ';' before '{'

Zkoušel jsem updatovat na VS 2013 jenže instalátor se zastaví. Vytvoří šedé okno s popiskem produktu a nic se neděje. Trvá to dlouho, ale instalátor nic nedělá.

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #6 kdy: 12. 06. 2014, 12:07:28 »
Může být potřeba zapnout tu podporu v překladači.

Nicméně doporučuji nainstalovat VS 2013. Jinak to šedé okno - může být potřeba zaškrtnout nenápadný checkbox dole že souhlasíš s podmínkami? Pak se objeví tlačítko "install"

webhope

Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #7 kdy: 12. 06. 2014, 12:40:00 »
Ne tím to není. Prostě Novější verzi než 2010 nenainstaluji protože MS už nepodporuje XP.

webhope

Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #8 kdy: 12. 06. 2014, 12:49:30 »
Máte tip jak to udělat postaru?

dword

Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #9 kdy: 12. 06. 2014, 12:52:45 »
Po staru:

Kód: [Vybrat]
#include "stdafx.h"
#include <vector>
#include <string>
#include <iostream>
#include <conio.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
int i;
for(i = 0; i < argc; i++)
{
_TCHAR *argument = &argv[i];
//udelej neco s 'argument'
}

return 0;
}


dword

Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #10 kdy: 12. 06. 2014, 13:04:26 »
Jeste se zeptam, o co ti jde prioritne? O zpracovani argumentu, nebo o pouziti foreach? Ma predchozi odpoved se tykala zpracovani argumentu predanych programu.

webhope

Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #11 kdy: 12. 06. 2014, 13:12:40 »
Tak jelikož nemohu updatovat tak prioritní je to nějak udělat aby to jelo. Ok. Tak zatím díkes. Jdu na to.

dword

Re:C++ Jak zpracovat argumenty z příkazového řádku? for each
« Odpověď #12 kdy: 12. 06. 2014, 13:29:58 »
Ja se neptal co je tvoji prioritou, ja se ptal co ze dvou moznosti, ktere jsem ti nabidl ve sve otazce a na ktere se ptas v uvodnim prispevku, je pro tebe to hlavni. Samozrejme to byla ta treti (nejak neco rozjet) o niz vim kulove :D Ach jo nekterym lidem je fakt tezke pomoci...

for_each je v C++98 cili by ti normalne mel jet normalne i ve starsim VS a s updatem to nijak nesouvisi.

Spatne se pomaha tomu kdo je zmateny v tom, co vlastne chce.

webhope

Re:Argumenty z příkazového řádku v C++
« Odpověď #13 kdy: 12. 06. 2014, 14:25:45 »
Hele tak já sem hodím co chci udělat, protože se v tom vrtám a stále to hází spoustu chyb. Tak chci nejdříve zpracovat první argument, ale ten není třeba zpracovávat v cyklu, protože v C++ je funkce, která mi vrátí pracovní cestu, jenže ta funkce mi nejde spustit, protože to po mě chce konstantnu PATH_MAX, která ovšem není definovaná a ani includování stdio.h mi nepomohlo. Nevím jaký používáš systém, já mám Win XP, Visual Studio C++ Express a používám Unicode.

Vysvětlím k čemu má být program. Chci hledat barvy v obrazu podle přesně zadaných kritérií HSB/HSV a na základě toho vygenerovat obraz nebo obrazy. Teď tedy řeším to zpracování argumentů a přípravu dat podle kterých budu porovnávat. Zadám nejdříve jméno hlavního zdrojového souboru ve kterém budu hledat barvy (argument 1). Pak zadám jméno cílového souboru (argument 2). Následovat můžou buďto barvy, respektive podmínky pro hledání a náhradu oddělené mezerou to jsou ty argumenty které nezačínají pomlčkou, nebo specifikace dalšího zdroje pomocí argumentu -sčíslo a dalšího cíle pomocí argumentu -dčíslo .


Co se týče zpracování argumentů - během ladění chci nejdříve testovat tyto argumenty:
...cesta\program.exe inputfile.png destfile.png (12,14,35)-(13,16,42)-0000FF (102,104,55)-(103,106,65)-00FFFF

( To v závorkách a mimo ně jsou jakože barvy).

Kód: [Vybrat]
#include "stdafx.h"
#include <vector>
#include <string>
#include <iostream>
// #include <stdio.h>  /* NO!: defines FILENAME_MAX */
#include <direct.h>
#include <conio.h>

using namespace std;

char cCurrentPath[FILENAME_MAX];

class MojeTrida
{
  private:
     int *Cesta; // pracovní cesta
  public:
     MojeTrida(); // Konstruktor
     ~MojeTrida();
};


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

_getch();
return 0;
}



Rád bych ty hodnoty z argumentů ukládal do členů třídy. Takže jsem si založil třídu MojeTrida ve které by mělo být vše zabalené, abych to bylo přehlednější. Moje představa by byla takováto. Hlavními členy třídy by měly být:
- source: (objekt může obsahovat více zdrojů a každý zdroj bude obsahovat několik barev podle účelu použití).
  source.count - int kolik zdrojů je uloženo
  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 ?
  source.bmp ... tady si pak budu ukládat data týkající se zdrojových bitmap
- target:(objekt může obsahovat více cílů a každý cíl je prostě jméno souboru).
  target.count - počet cílových souborů
  target.dest - konkrétní data týkající se těch rozpracovaných souborů

Další obdoba příkazu:
...cesta\program.exe inputfile.png destfile.png (12,14,35)-(13,16,42)-0000FF (102,104,55)-(103,106,65)-00FFFF -s photo1.jpg (15,25,65)-(17,35,95)-DDFF00


inputfile.png patří do source.src[0]
destfile.png patří do target.dest[0]
argumenty (12,14,35)-(13,16,42)-0000FF
bych potřeboval rozparsovat a uložit do
source.src[0] .. jako první trojici dat
(102,104,55)-(103,106,65)-00FFFF
a
(102,104,55)-(103,106,65)-00FFFF .. jako druhou trojici dat. Tyto barvy říkají v jakém rozsahu hledám barvu a za jakou barvu ji chci zaměnit.

Sice asi v praxi budu pracovat max. se dvěma zdrojovými soubory, ale těch výstupních souborů by mohlo být více, podle toho kolik masek budu chtít vytvořit.


Re:Argumenty z příkazového řádku v C++
« Odpověď #14 kdy: 12. 06. 2014, 15:02:41 »
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ě.

Jinak bych se mrknul třeba na:
http://forums.codeguru.com/showthread.php?393293-lt-getopt-h-gt-library-in-windows
http://www.codeproject.com/Articles/157001/Full-getopt-Port-for-Unicode-and-Multibyte-Microso
http://note.sonots.com/Comp/CompLang/cpp/getopt.html

 

reklama