2016-07-24 11 views
0

Hallo Ich bin neu hier und neu in C-Programmierung. Ich erhalte einen Segmentierungsfehler, wenn ich diesen Code ausführe. Im Fall 1 Ich versuche, die größte Zahl eines gesetzten Wertes zu erhalten, Fall 2 Ich addiere Zahlen zusammen, die ich zur Verfügung stelle, in Fall 3 ich nehme die Ausgabe einer Würfelrolle auf, aber ich bekomme einen Segmentierungsfehler. Ich weiß nicht, wo ich suchen soll, da der Fehler mir keine Zeilennummer für das Problem gibt.Segmentierungsfehlerfehler. C Programmierung

#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

Welches Betriebssystem und welchen Compiler verwenden Sie? Die Zeilennummer kann gefunden werden, aber es hängt vom System ab. – SurvivalMachine

+0

Sie finden die Zeilennummer, indem Sie das Programm in einem Debugger ausführen. – Barmar

+2

Sie verwenden 'x',' Numb2' und 'k' als Größen Ihrer Arrays, bevor Sie diesen Variablen etwas zuweisen. – Barmar

Antwort

0

Du Array mit einem unbestimmten Index x in

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

erklären am so ist der Fall mit Array2[Numb2] & MyArray[k].

Der Standard besagt, dass automatische Variablen, die nicht explizit initialisiert werden, unbestimmte Werte haben.

+1

Untertreibung der Woche – Ven

+0

@Ven: Ich könnte ein wenig geeilt haben. Bitte sehen Sie die Änderung. – sjsam

+0

hast du diesen verloren. Lass es gehen – Ven

0

Die Arrays haben unbestimmte Größen, weil die Variablen x, Numb2 und k nicht initialisiert wurden.

Wenn Ihr Compiler Arrays variabler Länge unterstützt, können Sie die Arrays innerhalb von Cases definieren. Zum Beispiel

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; 
     } 

     //... 

Sie sollten Variablen im minimalen Gültigkeitsbereich deklarieren, in dem sie verwendet werden.

2

Die erste Zeile in Ihrem main ist

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

Dies lässt x als eine ganze Zahl mit einem undefinierten Wert (wie Sie es nicht initialisiert wurde); Es könnte 1, 12345678 oder -654321 - alles sein. Weiter rechts versuchen Sie, ein int Array (Array[x]) zu deklarieren, das von dieser Größe sein soll. Das ist die Ursache.

Je nach dem (mehr oder weniger zufälligen) Wert von x funktioniert diese Zeile möglicherweise noch, aber dann wird sie später ausgegeben.

In C müssen Sie die Größe eines Arrays deklarieren, wenn Sie es deklarieren; es tut nicht magisch sich später an Änderungen der Variablen von x anpassen.

sollten Sie eine Konstante im Voraus mit der max Array Größe, die Sie behandeln mögen erklären, oder als eine schnelle Lösung, die Deklaration für x in einer zusätzlichen Linie ziehen, und einen Wert zuweisen:

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

Dasselbe gilt für k, Numb2, usw.

+1

'x' und' k' sind die Iterationsvariablen in seinen 'for'-Schleifen, sie sollten nicht auch als Array-Größen verwendet werden. – Barmar

0

Sie deklarieren Arrays mit dem Wert der Variablen, aber Sie nehmen keine Werte für diese Variablen. Wenn der Wert für den Abfall dieser Variablen negativ ist, zeigt dies an, dass Sie dem Array eine negative Größe zuweisen möchten, die nicht richtig ist, und Sie erhalten einen Fehler. Nehmen Sie zuerst diese Variablen als Eingabe vom Benutzer und begrenzen Sie dann die Array-Größe.

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]); 
}