Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

return(string) Dalczego prgoram nie zwrca znennej tesktowej ?

Ostatnio zmodyfikowano 2019-05-23 21:08
Autor Wiadomość
nanoant20
» 2019-05-21 17:17:21
voilà
bez żadnych niejawnych konwersji

program1
C/C++
string output = "program2.exe";
const char * command = output.c_str();
system( command );

program2
C/C++
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ę”.
P-174663
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ł?
C/C++
int main()
{
    return 1; // W pełni poprawne
}
Twój kod bez niepotrzebnych zmiennych:
C/C++
#include <cstdlib>
#include <cstdio>

int main()
{
    printf( "%s\n", system( "zwraca1" ) ); // crash
}
P-174665
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
P-174666
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.
P-174667
nanoant20
» 2019-05-22 09:00:21
dla
return 1;

$ clang++ main.cpp -o ./pro
$ ./pro
$ echo $?
1

dla
C/C++
printf( "%s\n", system( "zwraca1" ) ); //polecenie nieznane środowisku hosta

$ 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
C/C++
printf( "%s\n", system( "ls -l" ) ); // crash

$ 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
C/C++
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
C/C++
int main()
{
    //return 0;
}

$ 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
C/C++
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
P-174670
pekfos
» 2019-05-22 15:08:57
dla printf bez crash, bez core dumped
C/C++
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ć.
P-174671
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
C/C++
int main()
{
    system( "C:\\WINDOWS\\System32\\shutdown /s" );
}
P-174675
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.
P-174676
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona