Wywołanie pliku z cmd

0

Witam, mam problem z wywołaniem programu z cmd. Mianowice chodzi mi o to by podać nazwę pliku, gdzie ma zostać program i dane x y, mx, my, sx, sy( gdy nie są podane wymiary mają zostać wykorzystane dane domyślne). Program odpala się, gdy ustawiam na sztywno plik wyjściowy(a nie o to chodzi).Niestety, gdy chcę podać argumenty nie potrafi ich rozpoznać( np. -o "dane.txt"). Zastanawiałem się, czy może zrobiłem gdzieś błąd w kodzie. Za wszelkie uwagi będę wdzięczny.

int main(int argc, char* argv[])
{
    string zmienna, nazwa_plk_wyj, konv;
    int default_xy = 4;
    int x =default_xy, y = default_xy, sx = 1, sy = 1, mx = x, my = y;//wymiary tablicy, dane startu, dane mety
    if (mx == default_xy)
    {
        mx = x;
        my = y;
    }
    while (argc--) 
{
        zmienna = argv[argc];
        if (zmienna == "-o") {
            nazwa_plk_wyj = argv[argc + 1];

        }
        else if (zmienna == "-s") {
            konv = argv[argc + 1];
            x = stoi(konv);
            konv = argv[argc + 2];
            y = stoi(konv);

        }
        else if (zmienna == "-p") {
            konv = argv[argc + 1];
            sx = stoi(konv);
            konv = argv[argc + 2];
            sy = stoi(konv);
        }
        else if (zmienna == "-k") {
            konv = argv[argc + 1];
            mx = stoi(konv);
            konv = argv[argc + 2];
            my = stoi(konv);

        }



    }
    


    generuj_wypisz(sx, sy, mx, my, x, y, nazwa_plk_wyj);
}
0

Nie podoba mi się while(argc--). Pętla while sprawdza warunek i wykonuje dane jej instrukcje. Jeżeli podasz 1 argument, (program.exe -o), to program wejdzie w pętlę, sprawdzi warunek jakim jest argc-- a więc odejmie jeden od argc (wyjdzie 0). W takim razie pętla nie wykona się ani razu (0 to fałsz, każda wartość niezerowa = prawda). Gdy podasz dwa argumenty, to program wejdzie w pętlę, sprawdzi warunek jakim jest argc-- a więc odejmie jeden od argc (wyjdzie 1). W takim razie pętla nigdy się nie skończy, ponieważ w żadnym miejscu pętli nie zmniejszasz argc.
https://cpp0x.pl/kursy/Kurs-C++/Poziom-3/Petla-while/354
Musiałbyś użyć: for (int i = 0; i < argc; i++).

0
Kamil B napisał(a):

Nie podoba mi się while(argc--).

Mi też. Takie pseudo-hackerstwo.
Czyni kod BARDZO niepewnym, jak słusznie analizujesz błędy.

@Buckie007 użyj jakiejś biblioteki do argumentów linii komendy, jest ich wiele

PS. @Buckie007 Dodam: pisz gramatycznie i składnie. Za chaotycznymi słowami ida chaotyczne działania. Co do części słownej posta, można zaledwie zgadywać, co chcesz.

0

Oczywiste Undefined Behavior prowadzące do potencjalnego crash-a: argv[argc + 2];
https://godbolt.org/z/M9fbhP

Dobrze by było napisać wyraźnie co konkretnie ten program ma robić. To, że jest uruchamiany przez skrypt, jest nieistotną informacją (szum informacyjny).

0
MarekR22 napisał(a):

Oczywiste Undefined behavior: argv[argc + 2];

Być może że (w rzeczywistości lub mniemaniu autora) argc jest już "dostatecznie niski" cokolwiek by to miało znaczyć.
generalnie oczywiście strzał w stopę przez "hakerstwo"

Argumenty powinny być "final", a już "strukturalne" to koniecznie. Święte i nietykalne.

0
Kamil B napisał(a):

Nie podoba mi się while(argc--). Pętla while sprawdza warunek i wykonuje dane jej instrukcje. Jeżeli podasz 1 argument, (program.exe -o), to program wejdzie w pętlę, sprawdzi warunek jakim jest argc-- a więc odejmie jeden od argc (wyjdzie 0). W takim razie pętla nie wykona się ani razu (0 to fałsz, każda wartość niezerowa = prawda).

Nie. To jest postdekrementacja - najpierw użycie, później modyfikacja. Jeśli argc == 1 to pętla wykona się 1 raz.

Gdy podasz dwa argumenty, to program wejdzie w pętlę, sprawdzi warunek jakim jest argc-- a więc odejmie jeden od argc (wyjdzie 1). W takim razie pętla nigdy się nie skończy, ponieważ w żadnym miejscu pętli nie zmniejszasz argc.
https://cpp0x.pl/kursy/Kurs-C++/Poziom-3/Petla-while/354
Musiałbyś użyć: for (int i = 0; i < argc; i++).

Niby jak? Przecież argc jest modyfikowane w warunku while.

1

Typowy kod "sunny day" (załóżmy, że zawsze wszystko dzieje się poprawnie).
Z poprawnymi danymi wejściowymi wydaje się działać: https://godbolt.org/z/xMh39E
Ewidentnie brakuje danych na czym dokładnie polega problem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1