2016-07-20 15 views
2

Ich schreibe Code, der ein Array von ganzen Zahlen aufnehmen wird, die dann in eine gewünschte Basis wie Base-16 konvertiert werden können.Warum konvertiert mein Array variabler Länge nicht?

Aus irgendeinem Grund das Terminal seinen Weg durch das Programm macht und druckt

"umgewandelte Zahl ="

Hier ist mein Code:

#include <stdio.h> 
#include <cs50.h> 

int convertedNumber[64]; 
int base; 
int digit = 0; 

void getNumberAndBase(void) { 
    int size; 

    printf("How many numbers to be converted??\n"); 
    size = GetInt(); 

    int array[size]; 

    for (int i = 0; i < size; i++) { 
     printf("Number to be converted?\n"); 
     array[i] = GetInt(); 
    } 

    printf("Base?\n"); 

    do { 
     base = GetInt(); 

     if (base < 2 || base > 16) { 
      printf("Bad base - must be between 2 and 16. Try again!\n"); 
     } 
    } while (base < 2 || base > 16); 

    void convertNumber(int size, int array[size]); 
} 

void convertNumber(int size, int numberToConvert[size]) { 
    for (int i = 0; i < size; i++) { 
     do { 
      convertedNumber[digit] = numberToConvert[i] % base; 
      digit++; 
      numberToConvert[i] /= base; 
     } while (numberToConvert[i] != 0); 
    } 
} 

void displayConvertedNumber(void) { 
    const char baseDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 
    int nextDigit; 

    printf("Converted number = "); 

    for (--digit; digit >= 0; --digit) { 
     nextDigit = convertedNumber[digit]; 
     printf("%c", baseDigits[nextDigit]); 
    } 

    printf("\n"); 
} 

int main(void) { 
    void getNumberAndBase(void), displayConvertedNumber(void); 

    getNumberAndBase(); 
    displayConvertedNumber(); 

    return 0; 
} 
+2

'Leere convertNumber (int size, int array [size]);' das ist nicht, wie Sie –

+0

eine Funktion _call_ Bitte, formatieren Sie Ihren Code konsequent, es ist schwer zu lesen. Danke – user3078414

+0

alternativ, '(void) convertNumber (int Größe, int Array [Größe]);' – babon

Antwort

5

In Ihrem Code, haben Sie nie einen Aufruf zu convertNumber() Funktion gemacht. Sie sollten von

void convertNumber(int size, int array[size]); 

zu

convertNumber (size, array); 

, um den letzten Teil der getNumberAndBase() Funktion ändern, um einen Anruf zu tätigen.

Das heißt, Sie sollten convertedNumber, base und digit innerhalb main() definieren und sie dann als einige der Argumente übergeben zu den Funktionen (in der Lage sein Gebrauch davon innerhalb aufgerufenen Funktionen zu machen). Es gibt keinen Grund dafür, dass sie im Allgemeinen global sind.

Verschieben Sie auch die Funktionsdeklarationen aus main(); Legen Sie sie in den Dateibereich.

+0

Und ein weiterer guter Punkt wäre, Deklarationen für 'convertedNumber',' base' und 'digit' in' main() 'zu verschieben und sie als Parameter zu übergeben. Es gibt keinen Grund, warum sie global sein sollten. (Es gibt Fälle, in denen die Verwendung von Globals erforderlich ist, aber im Allgemeinen sollten sie auf andere Weise vermieden werden) –

+0

@ DavidC.Rankin Ja, ich habe die Globals irgendwie vermisst, habe meine Antwort bearbeitet, um sie unterzubringen. –

1

Sie haben mehrere Fehler in Ihrem Code. Hier ist eine funktionierende Version Ihres Codes, die so unverändert wie möglich ist (ich widerstand dem Drang, es zu bereinigen). Ich habe den Änderungen, die ich vorgenommen habe, Kommentare hinzugefügt.

#include <stdio.h> 
#include <cs50.h> 

/* I moved your prototypes up here rather than leaving them inline. */ 
void displayConvertedNumber(void); 
void convertNumber(int size, int *array); 

int convertedNumber[64]; 
int base; 
int digit = 0; 

void getNumberAndBase (void) 
{ 
    /* I moved your variable declarations here. If you want your C to be 
     portable, define your variables at the beginning of your function. 
     Don't expect "int i = 0;" to work in your for loop on all C compilers. */ 
    int size; 
    int array[size]; 
    int i; 

    printf("How many numbers to be converted??\n"); 
    size = GetInt(); 

    for(i = 0; i < size; i++){ 
     printf("Number to be converted?\n"); 
     array[i] = GetInt(); 
    } 

    printf("Base?\n"); 

    do{ 
     base = GetInt(); 

     if(base < 2 || base > 16) 
     { 
      printf("Bad base - must be between 2 and 16. Try again!\n"); 
     } 
    } while(base < 2 || base > 16); 

    /* I corrected your call to this function. */ 
    convertNumber(size, array); 
} 

void convertNumber (int size, int numberToConvert[size]) 
{ 
    int i; 

    for(i = 0; i < size; i++) 
    { 
     do{ 
      convertedNumber[digit] = numberToConvert[i] % base; 
      digit++; 
      numberToConvert[i] /= base; 
     } 
     while(numberToConvert[i] != 0); 

     /* I added a call to display the number here. The way 
      you've written your code means each number has to be 
      displayed after it is converted. You cannot convert 
      them all first and then attempt to display them since 
      you're using a single variable and index (convertedNumber 
      and digit) for the conversion. */ 
     displayConvertedNumber(); 
    } 
} 

void displayConvertedNumber (void) 
{ 
    const char baseDigits[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 
    int nextDigit; 

    printf("Converted number = "); 

    for(--digit; digit >= 0; --digit) 
    { 
     nextDigit = convertedNumber[digit]; 
     printf("%c", baseDigits[nextDigit]); 
    } 

    printf("\n"); 

    /* I reset your digit variable here. Otherwise it would have 
     been left at -1 since that was the exit condition for your 
     loop above. */ 
    digit = 0; 
} 

int main (void) 
{ 
    getNumberAndBase(); 
    /* I removed the other function call because now everything is 
     handled in this function. */ 

    return 0; 
}