Что не так с этой настройкой? - PullRequest
0 голосов
/ 05 мая 2009

Я создал программу под названием test:

#include<stdlib.h>
#include<iostream>
int main()
{
    std::cout<<system("..\\add\\debug\\add.exe 4 8");
    while(true);
    return 0;
}

add.exe состоит из

#include<stdlib.h>
int main(int argc,char **argv[])
{
    int n=((unsigned)argv[1]);
    int m=((unsigned)argv[2]);
    return(n+m);
}

поэтому, когда я запускаю тест, я получаю

6841420

Была сделана попытка добавить тестовый запуск с параметрами 4 и 8, а для добавления вернуть сумму этих значений (12), а затем тест отобразил бы это на экране. Как я получил 6841420 и как это исправить?

Ответы [ 4 ]

8 голосов
/ 05 мая 2009

Проблема в том, что вы конвертируете значение указателя в целое число. Аргументы будут переданы вашей программе в виде строк в стиле C (const char*). Вы должны сначала преобразовать их в строку, используя API, такой как atoi.

#include<stdlib.h>
int main(int argc,char *argv[])
{
    int n= atoi(argv[1]);
    int m= atoi(argv[2]);
    return(n+m);
}

EDIT

Как уже отмечали другие, вы также должны выполнить некоторую проверку ошибок, чтобы убедиться, что в программе передано 2 параметра.

0 голосов
/ 05 мая 2009

Ответы об использовании atoi () или sscanf () для преобразования элементов argv [] из строк в действительные целые числа находятся прямо на месте.

Однако в вашем тестовом примере есть еще одна проблема. Возвращаемое значение system() - это состояние выхода для процесса, который был запущен, что более чем зависит от платформы. Однако на большинстве платформ все устроено так, что значение 0 означает, что команда выполнилась нормально и в конечном итоге вызвала саму exit(0). Windows так много соответствует.

Строка cout<<system(...) печатает это значение состояния. На многих платформах (особенно POSIX-совместимых), если процесс запущен без аварийного завершения, младший байт кода состояния будет равен нулю, а старший байт будет значением, переданным exit(), при условии, что это значение равно 255 или менее.

На самом деле использование состояния выхода для передачи гораздо большего количества информации, чем просто успех / неудача, родительскому процессу сильно зависит от платформы, и есть гораздо лучшие способы сделать это.

0 голосов
/ 05 мая 2009

Это может быть нормально, как игрушка, но, как FYI, вы не можете рассчитывать на то, что сможете вернуть полный диапазон целых чисел из main (). Во-первых, system () использует различные значения в качестве часовых (например, -1 и 127), поэтому вы не сможете определить разницу между неудачным выполнением и допустимым результатом одного из этих значений. Во-вторых, оболочки могут ограничивать диапазон возвращаемого значения только 8 битами (используя оставшиеся биты для дополнительной информации о состоянии).

0 голосов
/ 05 мая 2009

Ваш add.exe переводит указатели на строки в беззнаковые целые, поэтому он добавляет их позиции в памяти, а не числа.

Используйте sscanf (или, как предложено в другом ответе, atoi - это, вероятно, проще).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...