nanoant20 |
» 2019-05-21 17:17:21 voilà bez żadnych niejawnych konwersji program1 string output = "program2.exe"; const char * command = output.c_str(); system( command );
program2 string zmienna = "vol"; const char * command = zmienna.c_str(); system( command );
Polecam przetestować na programie który nie kończy się z kodem 0. |
1. testowałem zanim kod wkleiłem na forum. 2. Po co mam zmieniać wartość return na inna liczbe, co będzię ją łapał i obsługiwał? W C++ instrukcja return jest opcjonalna. Kompilator automatycznie dodaje zwrot 0; jeśli wyraźnie nie zwróci wartości. Kod wyjścia 0 jest powszechnie akceptowaną konwencją i mówi „OK wykonanie programu powiodło się”. |
|
pekfos |
» 2019-05-21 21:47:47 Polecam przetestować na programie który nie kończy się z kodem 0. | 1. testowałem zanim kod wkleiłem na forum. 2. Po co mam zmieniać wartość return na inna liczbe, co będzię ją łapał i obsługiwał? |
Twój kod bez niepotrzebnych zmiennych: #include <cstdlib> #include <cstdio>
int main() { printf( "%s\n", system( "zwraca1" ) ); } |
|
nanoant20 |
» 2019-05-21 21:57:37 printf( "%s\n", system( "ls -l" ) ); aktualnie siedze na unix'ie i nie dostaje żadnego crash a dlaczego? ponieważ system( "zwraca1" ) "zwraca1" nie jest znana systemowi jeżeli używasz windows'a wpisz system( "dir" ) i zobacz czy jest crash |
|
pekfos |
» 2019-05-21 22:01:59 Nie wiem czy ty nie rozumiesz co się do ciebie pisze, czy nie chcesz zrozumieć.. C:\Users\admin\Desktop\_test_>g++ kod1.cpp -o zwraca1.exe
C:\Users\admin\Desktop\_test_>zwraca1
C:\Users\admin\Desktop\_test_>echo %errorlevel% 1 C:\Users\admin\Desktop\_test_>g++ kod2.cpp
C:\Users\admin\Desktop\_test_>a Crash (którego na windowsie nie widać w konsoli). Jeśli nie sypnęło się dla braku polecenia, to być może nie sypnie się w ogóle. Wartość zwracana z system() jest zależna od implementacji. |
|
nanoant20 |
» 2019-05-22 09:00:21 dla return 1; $ clang++ main.cpp -o ./pro $ ./pro $ echo $? 1
dla printf( "%s\n", system( "zwraca1" ) );
$ clang++ main.cpp -o ./pro main.cpp:21:21: warning: format specifies type 'char *' but the argument has type 'int' [-Wformat] printf( "%s\n", system( "zwraca1" ) ); // crash ~~ ^~~~~~~~~~~~~~~~~~~ %d 1 warning generated. $ ./pro sh: zwraca1: not found Segmentation fault (core dumped) $ echo $? 139
dla printf( "%s\n", system( "ls -l" ) );
$ clang++ main.cpp -o ./pro main.cpp:11:18: warning: format specifies type 'char *' but the argument has type 'int' [-Wformat] printf( "%s\n", system( "ls -l" ) ); // crash ~~ ^~~~~~~~~~~~~~~~~ %d 1 warning generated. $ ./pro total 32 -rw-r--r-- 1 nanoant20 nanoant20 1933 22 maj 08:44 main.cpp -rwxr-xr-x 1 nanoant20 nanoant20 12169 22 maj 08:45 pro (null) $ echo $? 0
dla string zmienna = "ls -l"; const char * command = zmienna.c_str(); system( command ); return 0;
$ clang++ main.cpp -o ./pro $ ./pro total 40 -rw-r--r-- 1 nanoant20 nanoant20 1680 22 maj 08:41 main.cpp -rwxr-xr-x 1 nanoant20 nanoant20 13694 22 maj 08:42 pro $ echo $? 0
dodam jeszcze z bez return $ cd test/ $ clang++ main.cpp -o ./pro $ ./pro $ echo $? 0
Tak jak pisałem wcześniej jeżeli program jest napisany dobrze instrukcja return w C++ jest opcjonalna. Kompilator automatycznie dodaje zwrot 0 dla printf bez crash, bez core dumped char output = static_cast < char >( system( "ls -l" ) ); printf( "%s", & output );
$ clang++ main.cpp -o ./pro $ ./pro total 32 -rw-r--r-- 1 nanoant20 nanoant20 472 22 maj 13:39 main.cpp -rwxr-xr-x 1 nanoant20 nanoant20 12185 22 maj 13:40 pro $ echo $? 0
|
|
pekfos |
» 2019-05-22 15:08:57 dla printf bez crash, bez core dumped
char output = static_cast < char >( system( "ls -l" ) ); printf( "%s", & output ); |
Nie masz pojęcia o czym piszesz. Jeśli system() zwróci coś innego niż 0, ten kod ma niezdefiniowane zachowanie. Możesz to naprawić nie pisząc takiego kodu. Ten kod nigdy nie miał sensu, przestań próbować go naprawić. |
|
nanoant20 |
» 2019-05-22 18:50:27 Jeśli system() zwróci coś innego niż 0, ten kod ma niezdefiniowane zachowanie. |
Zadam jeszcze raz to pytanie Po co "return" ma zwracać inną liczbę niż O ZERO? Bedzisz to obsługiwał czy co? Pytanie dotyczy dokładnie tego programu. Program zachowuje się poprawnie, nie zamierzam nic z tym dalej robić bo sam program nie ma sensu, o czym też wcześniej napisałem "korzystać z socket" Ze zwykłego swojego niedopatrzenia i niepochamowanej ciekawości pobawiłem się tymi kilkoma linijkami kodu, której efektem jest działający kod. Nie masz pojęcia o czym piszesz. |
Z takiej krytyki nie wynoszę żadnych korzyści, więc zachowaj ją dla siebie. Wcześniej też napisałem, że jeżeli miałbym przesyłać dane (komunikować się) pomiędzy okienkami to skorzystałbym z winsock socket@pekfos for you, check if it works int main() { system( "C:\\WINDOWS\\System32\\shutdown /s" ); }
|
|
Jacob99 |
» 2019-05-22 19:06:22 @nanoant20 zwracana liczba jest ważna dla systemu operacyjnego ze względu na powiązania między procesami. 0 oznacza poprawne zakończenie programu natomiast inne wartości mogą świadczyć o błędzie wykonania, zawieszeniu działania, trybie zakończenia programu itd., co jest często ważne np. dla procesu wywołującego. |
|
1 « 2 » 3 4 |