2013-10-29 1 views
0

은 내가 매개 변수 2.4가 출력 내 프로그램을 실행하면 원내 프로그램이 어떤 인수에도 반응하지 않는 이유는 무엇입니까?

#include <iostream> 
#include <stdlib.h> 
#include "circle.h" // contains the Circle class 

using namespace std; 

void print_circle_attributes(float r) { 
    Circle* c = new Circle(r); 
    cout << "radius: " << c->get_radius() << endl; 
    cout << "diameter: " << c->get_diameter() << endl; 
    cout << "area: " << c->get_area() << endl; 
    cout << "circumference: " << c->get_circumference() << endl; 
    cout << endl; 
    delete c; 
} 

int main(int argc, const char* argv[]) { 
    float input = atof(argv[0]); 
    print_circle_attributes(input); 
    return 0; 
} 

의 속성을 출력 C++에서 간단한 테스트 프로그램을 가지고 : 나는 이전에 프로그램을 테스트 한

radius: 0.0 
diameter: 0.0 
area: 0.0 
circumference: 0.0 

매개 변수없이 간단히 정적 값을 사용하면 괜찮습니다. 그래서 나는 내가 만든 수업에 아무런 문제가 없다는 것을 알고 있습니다 ...

그래서 내가 뭘 잘못 했습니까?

+2

그와 같이'new'를 사용하도록 가르쳐주십시오. 무시하십시오. 'Circle c (r);'을 쓰고,'new'도,'delete'도, 포인터도 없습니다. 마법! –

+0

아, 여기 [좋은 학습 자료가 있습니다] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). –

+0

스택에 오버플로가 일어나지 않으므로 힙에 객체를 만들고 싶었 기 때문에 특별히 새 키워드를 사용합니다 (하나의 객체가 아무것도하지 않지만 여전히 그렇습니다). –

답변

4

argv[0]은 프로그램 이름입니다. 첫 번째 인수로는 argv[1]이 필요합니다.

또한 액세스를 시도하기 전에 argc이 2 이상인지 확인하십시오. 가짜 입력을 감지 할 수 있으므로 atoi이 아닌 std::stoi, std::istringstream 또는 strtod을 전환으로 간주 할 수도 있습니다.

마지막으로, 자동 변수로 충분할 때 new을 사용하는 이유는 무엇입니까? 그 습관에서 곧바로 벗어나거나, 영원의 나머지 부분을 메모리 누출을 디버깅하는 데 소비해야합니다.

+0

스택을 사용하지 않고 힙에 객체를 새로 만들 때 사용했습니다. 그것은 목적에 따라 행해졌 다. –

+2

@ElectricCoffee : 동적 할당이 필요하다면 (여기에없는), [RAII] (http://en.wikipedia.org/wiki/), 특히 똑똑한 포인터를 사용하여 개체를 범위에 바인딩하고 예외가 throw 된 경우에도 메모리가 해제되는지 확인합니다. 그러나 여기에는 동적 인 객체가 전혀 필요하지 않습니다. 필요하지 않을 때 힙을 사용하는 것은 나쁜 습관입니다. –

4

argv[0]은 호출되는 실행 파일의 이름입니다.

첫 번째 명령 줄 매개 변수는 argv[1]입니다.

프로그램이 자동으로 다시 실패하지 않도록하려면 실제 매개 변수의 수와 atof이 값을 반환하는지 확인하고 이에 따라 문제를 설명하는 메시지를 사용자에게 표시해야합니다.

관련 문제