c++ 오류 질문합니다아아아아아아
위 상태에서 오류가 나오는데요.
배열이 문제인거 같은데 어떻게 수정을 해야할지 모르겠어요 ㅠㅠ
다른건 다 잘한거 같은데.............................................
해당 오류는 배열의 공간보다 하나를 더 많이 사용해서 생기는 오류 입니다.
배열 크기만 1증가 시켜주거나 반복문에서 적당히 조절해주면 해결됩니다.
아래 수정된 소스는 배열 크기를 1증가 시켜줘서 해결했고, 그외 조금(?) 더 수정해봤습니다.
수정된 소스로는 해당 오류 발생이 안되는걸 확인했습니다.
[수정 소스]
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
float genRanNumber(float *ranNum);
float calMean(float *ranNum);
float calStd(float *ranNum, float avg);
int main(){
float ranNum[11] = { 0.0, }; //0~10 까지 11개 라서 기존 배열 공간 10 에 이 하나 더 추가해줘야 오류가 안납니다.
float avg;
float std;
genRanNumber(ranNum);
//function to generate 10 random float
cout << " Random numbers are as follows: " << endl;
for (int i = 1; i <= 10; i++){ // 여기도 1~10으로 일치
cout << " " << ranNum[i] << endl; // ranNum[i] 는 숫자가 표시되고 &ranNum[i] 는 주소가 표시됨
}
cout << endl;
//function to calculate a mean using the random numbers
avg = calMean(ranNum);
cout << " Average: " << avg << endl;
//function to calculate a standard deviation using the random numbers
std = calStd(ranNum, avg);
cout << " Standard deviation: " << std << endl;
system("pause"); // 아무키나 입력될때까지 도스창 멈춤
return 0;
}
float genRanNumber(float *ranNum) {
int t = 0;
float *y = new float[t];
for (int k = 1; k <= 10; k++) { // 1~10
ranNum[k] = (float)(rand() % 10 + 1);
*y = ranNum[k];
}
return *y;
}
float calMean(float *ranNum){
float sum = 0;
for (int k = 1; k <= 10; k++) // 1~10
sum += ranNum[k];
float oavg = sum / 10;
return oavg;
}
float calStd(float *ranNum, float avg){
float t = 0;
for (int k = 1; k <= 10; k++) // 1~10
t += pow(ranNum[k] - avg, 2);
float ostd = sqrt(t / 10);
return ostd;
}
[실행 후 캡쳐]
C++ 로 작성하신 코드를 잘 보았습니다.
약간 애매모호한 코딩 내용이 있어서 한번 언급할게요.
1. main 함수
변수로 ranNum[10] = { 0.0} 을 선언하였습니다. 이는 메모리에 10개의 float 형 배열을 선언한 것이죠.
2. float getRanNumber(float * ranNum)
숫자를 랜덤하게 받아서 전달하려는 목적으로 만든 함수로 보입니다.
int t = 0,
float * y = new float[t] --> 목적을 잘모르겠습니다만, 질문하신 분의 의도를 추측하건데, 포인터에 메모리를 할당하여 배열포인터를 만들고 싶으셨던거 같아요.
혹시 크기가 1인 배열을 만들고 싶으셨는지요 ???
근데 이부분에서 배열을 가리키고 싶다면, 단순히 포인터로 만으로도 해결이 가능합니다.
그리고 for문
for(int k = 1; k <=10; k++)
ranNum[k] 에 1 부터 10까지 들어오게 됩니다.
근데 이상하지 않으신가요 ? 배열의 offset은 0부터 시작입니다. 즉 k = 0, k<10 이 되어야 맞습니다.
그리고 for문 안에 *y = ranNum[k] 를 하면 y 의 값이 1이 되었다가 9가 되었다가 계속 바뀔 것입니다.
ranNum을 포인터 변수로 넘겼는데, return *y를 하고, 그것을 받는 값이 없어요.
그러면 왜 return을 하셨을까요 ?
ranNum은 이미 메모리에 할당되어 있고, 여기에 포인터를 파라미터로 넘겼으며, random 함수를 통해 값을 넣었으면,
return 없이 함수를 선언해도, getRanNum 함수가 한번 실행되면 자연스럽게 ranNum에 값이 채워지게 될것입니다.
질문하신 분께서는 아직 포인터의 개념에 혼동이 있는거 같아요.
포인터 개념을 먼저 잡고 가야할 거 같아 참고 링크 전달 드립니다.
calMean(float *ranNum)에 보시면
int k가 1부터 10까지 돌고 있습니다.
ranNum이 [10]이기 때문에 0부터 9까지 돌아야 합니다.
즉
for (int k = 1; k <= 10; k++)이 아니라
for(int k = 0; k<10; k++)가 되어야 합니다.
고쳐도 안되시면 코드를 올려주세요. 스크린 샷으로 보기엔 디버깅 하기가 힘드네요 ^^..