2014-11-10 4 views
0

현재 프로그램에서 .txt 파일의 데이터 열 다섯 개를 읽는 별도의 .h 파일에 템플릿 함수가 포함되어 있습니다. 데이터는 주 프로그램으로 전달되며,이 예에서는 배열 제목 "MISC_DATA"만 신경 씁니다. 나는 배열 "MISC_DATA"에서 가장 큰 값을 결정하려고하며이를 결정하기 위해 데이터가 전달되어야하는 또 다른 함수를 작성했습니다. 그러나 컴파일러에서 함수 호출 "Maximum_Value"인식하지 못한다고 알려줍니다. 나는 루틴 호출에 포함 된 변수 MISC_DATA에 문제가 있으며 함수 자체에는 문제가 없다고 확신한다. MISC_DATA를 배열로 인식하지 못하거나 구문이 잘못되었습니다. 나는 그것을 더 쉽게 읽을 수 있도록 중요한 코드 스 니펫 (snippet)을 포함시키고있다. Read_Five_Columns 함수는 정상적으로 작동합니다. 포인터 배열 MISC_DATA가 주 프로그램에 작성된 방식 때문에 컴파일러에서 인식하지 못하는 "Maximum_Value"함수입니다. 설명을 위해 함수 호출의 변수 MISC_DATA는 배열을 포함하는 float이고 변수 "size_Mis"는 배열 크기를 포함하는 정수입니다. 어떤 생각이라도 감사 할 것입니다.포인터 배열을 함수에 전달하는 데 문제가 있습니다.

int main(int argc, const char * argv[]) { 

#include "Use_RNG.h" 
#include "Read_Columnar_File.h" 
#include <fstream> 
#include <iostream> 

std::vector<std::string> str3; 
std::vector<int> str4; 
std::vector<char> str5; 
std::vector<int> str6; 

    unsigned long size_Mis; 
    std::vector<float> MISC_DATA; // Reads in Misc. spending data 
    char File1[8]; 
    strcpy(File1, "Misc.txt"); 
    Read_Five_Columns(File1,MISC_DATA,str3,str4,str5,str6); 
    str3.clear(); str4.clear(); str5.clear(); str6.clear(); 
    size_Mis = MISC_DATA.size(); 

float value; 
value = Maximum_Value(MISC_DATA,size_Mis); 

end_time = clock(); 
std::cout << std::endl << "Total Time: " << (end_time-start_time)/CLOCKS_PER_SEC << std::endl; 
return 0; 
} 

int Maximum_Value(float *array,int array_size) 
{ 
    float max = 0; 
    for(int i =10; i < array_size-1; i++) 
    { 
     if(array[i] > max) max = array[i]; 
    } 
    return max; 
} 
+0

왜'Maxmimum_Value' 리턴'int' 대신'float'는 무엇입니까? – cdhowie

+0

'MISC_DATA'는'std :: vector'이고 배열이나 포인터는 아닙니다. –

+2

그리고 함수 안에 헤더 파일을 포함시키지 않습니다. –

답변

6

여기에는 네 가지 문제점이 있습니다.

int main(int argc, const char * argv[]) { 

#include "Use_RNG.h" 
#include "Read_Columnar_File.h" 
#include <fstream> 
#include <iostream> 

이 모든 것들은 잘못된 순서입니다. 함수 헤더에 시스템 헤더 파일을 포함하면 안되며 일반적으로 다른 것들보다 먼저 표준 라이브러리를 포함해야합니다. 다음과 같이 수정하십시오.

#include <fstream> 
#include <iostream> 

#include "Use_RNG.h" 
#include "Read_Columnar_File.h" 

int main(int argc, const char * argv[]) { 

두 번째로 사용하기 전에 Maximum_Value을 선언하지 마십시오. 당신은 main()의 정의 전에이 함수의 정의를 이동하거나 필요로하거나 당신이 main() 전에 프로토 타입을 추가해야합니다

int Maximum_Value(float *array,int array_size); 

int main(int argc, const char * argv[]) { 

을 다음, 당신은 작동하지 않는 이는 float* 같은 std::vector<float>을 통과하려고 :

벡터의 스토리지가 연속으로 보장하고 배열처럼 배치되어 있기 때문에
value = Maximum_Value(MISC_DATA,size_Mis); 

그러나 안전하게 첫 번째 멤버에 대한 포인터를 전달할 수 있습니다

value = Maximum_Value(&MISC_DATA[0],size_Mis); 

마지막으로 float을 반환해야 할 때 intMaximum_Value에서 반환합니다. 나는 표준 <algorithm> 헤더의 일부입니다 std::max_element, 활용 제안 가능하면


는 :

// If you don't have C++11 then use std::vector<float>::iterator instead of auto. 
auto max = std::max_element(MISC_DATA.begin(), MISC_DATA.end()); 

지금 max가 가장 큰 요소의 반복자입니다, 그래서 *max 최대 float 자체 일 것이다.

(입력 범위가 비어있는 경우, 다음 maxMISC_DATA.end()와 동일합니다, 그래서 당신의 함수에 상응하는 value = max == MISC_DATA.end() ? 0f : *max; 될 것입니다.)

+0

당신이 정확하게 언급 한 문제에 대한 나의 사과는 잘라 내기와 붙여 넣기의 사고로 인하여 실제로 프로그램에 나열되어 있지 않습니다. 실제 프로그램 정의에는 main() 전에 있고 main() 앞에 프로토 타입이 있습니다. 이것은 주 프로그램에서이 웹 사이트에 붙여 넣기를 한 결과로 제출하기 전에 신속하게 검사하지 않았습니다. 그래서 배열의 첫 번째 요소에 포인터를 전달할 수 있다면; 함수에서 분석해야 할 전체 배열을 어떻게 전달할 수 있습니까? – Jon

+0

@ 존 내가 제안한 것과 같은 방법. 벡터의 메모리는 배열과 같은 방식으로 배치되기 때문에,'(& vec [0]) [n]'은'vec [n]'과 같은 값을 갖는다. 즉, 배열의 첫 번째 요소에 대한 포인터로'& vec [0]'을 처리하고 다른 배열에 대해 할 수있는 것처럼 연속적인 요소를 가져 오는 포인터 수학을 사용할 수 있습니다. – cdhowie

+0

아아, 첫 번째 요소에 대한 참조 만 전달하면 함수의 포인터 수학이 연속 된 요소/메모리 위치를 가리 키기 시작합니다. 대단히 감사합니다 !! – Jon

관련 문제