2016-07-24 3 views
0

안녕하세요 저는 C 프로그래밍에 대해 새롭고 새로운 것 같습니다. 이 코드를 실행하면 Segmentation 오류가 발생합니다. 경우 1 설정 값의 가장 큰 숫자를 얻으려고 애 쓰고 2 내가 제공하는 숫자를 함께 추가합니다. 3 주사위 굴림 출력을 기록하고 있지만 세그먼트 오류가 발생합니다. 오류가 나에게 문제의 줄 번호를주지 않기 때문에 어디에서보아야할지 모르겠습니다. 당신은세그먼트 오류 오류입니다. C 프로그래밍

int choice,DiceRoll,k,x,i,g,Max,Sum,Numb,Numb2,Array[x],Array2[Numb2],MyArray[k]; 

ans와의 불확정 인덱스 xArray를 선언하는

#include <stdio.h> 

int ArrayMax(int arr[], int N) { 
    int i, Max = 0; 

    Max = arr[0]; 
    for (i = 0; i < N; ++i) { 
     if (arr[i] > Max) 
      Max = arr[i]; 
    } 
    return Max; 
} 

int ArrayAdd(int arr[], int N) { 
    int i, Sum; 

    Sum = 0; 
    for (i = 0; i < N; ++i) { 
     Sum = Sum + arr[i]; 
    } 
    return Sum; 
} 

void DiceFill(int DR[], int many) { 
    int j; 

    for (j = 0; j < many; ++j) { 
     printf("You rolled: %d", DR[j]); 
    } 
} 

int main() { 

    int choice, DiceRoll, k, x, i, g, Max, Sum, Numb, 
     Numb2, Array[x], Array2[Numb2], MyArray[k]; 

    do { 
     printf("\n"); 
     printf("\n"); 
     printf("------ Menu ------------\n"); 
     printf("1) Find the maximum value in a set of numbers\n"); 
     printf("2) Print the sum of a list of values. \n"); 
     printf("3) Simulate many rolls of a standard dice.\n"); 

     choice = -1; 
     while (choice < 0 || choice > 3) { 
      printf("Choice 0-14: "); 
      scanf("%d", &choice); 
     } 

     switch (choice) { 
     case 1: 
      printf("Type the # of elements you want to compare to get the largest value: "); 
      scanf("%d", &Numb); 
      for (x = 0; x < Numb; ++x) { 
       printf("Number %d is : ", x+1); 
       scanf("%d", &Array[x]); 
      } 
      Max = ArrayMax(Array, Numb); 
      printf("The largest value is %d", Max); 
      break; 
     case 2: 
      printf("Type the # of elements you want to add: "); 
      scanf("%d", &Numb2); 
      for (i = 0; i < Numb2; ++i) { 
       printf("Number %d is : ", i + 1); 
       scanf("%d", &Array2[i]); 
      } 
      Sum = ArrayAdd(Array2, Numb2); 
      printf("The Sum of the values is:%d", Sum); 
      break; 
     case 3: 
      srand(time(NULL)); 
      printf("How many time do you want to roll a dice? "); 
      scanf("%d", &DiceRoll); 

      for (k = 0; k < DiceRoll; ++k) { 
       MyArray[k] = rand()% 6 + 1; 
      } 
      DiceFill(MyArray, DiceRoll); 
      break; 
     } 
    } while (choice > 0); 
    return 0; 
} 
+0

어떤 운영체제와 컴파일러를 사용하고 있습니까? 줄 번호를 찾을 수 있지만 시스템에 따라 다릅니다. – SurvivalMachine

+0

디버거에서 프로그램을 실행하여 줄 번호를 찾습니다. – Barmar

+2

배열의 크기로'x','Numb2','k'를 사용합니다. – Barmar

답변

0

그렇게 Array2[Numb2] & MyArray[k]의 경우.

명시 적으로 초기화되지 않은 자동 변수는 불확정 값을 갖습니다.

+1

삼가면서 말하는 주의점 – Ven

+0

@Ven : 나는 조금 서둘 렀을지도 모른다. Pls는 편집을 참조하십시오. – sjsam

+0

당신이 이것을 잃어 버렸습니다. let go go – Ven

0

변수 x, Numb2 및 k가 초기화되지 않았으므로 배열의 크기가 일정하지 않습니다.

int choice,DiceRoll,k,x,i,g,Max,Sum,Numb,Numb2,Array[x],Array2[Numb2],MyArray[k]; 

가변 길이 배열을 지원하는 컴파일러는 케이스 코드 블록 안에 배열을 정의 할 수 있습니다. 예를 들어,

int main(void) 
{ 

int choice; 

do 
{ 
    printf("\n"); 
    printf("\n"); 
    printf("------ Menu ------------\n"); 
    printf("1) Find the maximum value in a set of numbers\n"); 
    printf("2) Print the sum of a list of values. \n"); 
    printf("3) Simulate many rolls of a standard dice.\n"); 

choice = -1; 
while (choice < 0 || choice > 3) 
     { 
     printf("Choice 0-14: "); 
     scanf("%d", &choice); 
     } 

    switch (choice) 
     { 
     case 1: 
     { 
       int Numb; 


       printf("Type the # of elements you want to compare to get the largest value: "); 
       scanf("%d", &Numb); 

       int Array[Numb]; 
       ^^^^^^^^^^^^^^^^ 

       for(x=0;x<Numb;++x) 
       { 
        printf("Number %d is : ", x+1); 
        scanf("%d", &Array[x]); 
       } 
       int Max = ArrayMax(Array, Numb); 
       printf("The largest value is %d", Max); 
       break; 
     } 

     //... 

변수는 사용되는 최소 범위에 선언해야합니다.

2

당신의 main의 첫 번째 행은

int choice,DiceRoll,k,x,i,g,Max,Sum,Numb,Numb2,Array[x],Array2[Numb2],MyArray[k];

이 (당신이 그것을 초기화되지 않았습니다으로) 정의되지 않은 값을 정수로 x 잎; 1, 12345678 또는 -654321 - 일 수 있습니다.. 오른쪽으로 가면 int 배열 (Array[x])을 선언하려고합니다.이 크기는 그 크기입니다. 이것이 근본 원인입니다.

x의 값에 따라이 줄이 계속 작동하지만 나중에 덤프됩니다.

C에서는 선언 할 때 배열의 크기를 선언해야합니다. 마술처럼은 나중에 x이라는 변수의 변화에 ​​적응합니다.

int x=1000; 
int choice,DiceRoll,k,i,g,Max,Sum,Numb,Numb2,Array[x],Array2[Numb2],MyArray[k]; 

:

당신은 당신이 처리, 또는 빠른 솔루션으로, 별도의 라인 X에 대한 선언을 당긴 을 할당 할 최대 배열 크기와 일정한 선행을 선언해야 k, Numb2 등의 경우에도 마찬가지입니다.

+1

'x'와'k'는'for' 루프의 반복 변수이므로 배열 크기로 사용해서는 안됩니다. – Barmar

0

변수의 값으로 배열을 선언하고 있지만 해당 변수의 값은 가져 오지 않습니다. 해당 변수의 가비지 값이 음수이면 어레이에 음수 크기를 할당하려고 시도했음을 나타내며 이는 올바르지 않으며 오류가 발생합니다. 먼저 해당 변수를 사용자로부터 입력 받아 어레이 크기를 제한하십시오.

int i,a[1000],x; //set the initial size of array as a large value. 
scanf("%d",&x); 
for(i = 0; i < x; i++) { //then limit the size by the input you gave 
    scanf("%d",&a[i]); 
}