2016-05-06 3 views
0

Ich arbeite derzeit an einer Aufgabe, wo wir einen Assembler mit C++ machen. Ich bin so weit gegangen, den Code unterscheiden zu lassen, wenn eine Zahl eingegeben wird, und versuche, das Programm zu veranlassen, die relevanten Bits in einem 16-Bit-Array zu der erforderlichen Binärzahl zu ändern.C++ Übergeben einer Int, Fehler zu sagen, es ist ein Doppel

Das Problem ist, dass, nachdem die Leistung berechnet wird, der Rest der Eingangsnummer und die erste Macht, die es übersteigt, einem int zugeordnet ist, aber es zurück in dec_to_bin() übergeben ich bekomme den folgenden Fehler.

assembler.cpp: In function ‘void dec_to_bin(int, int*)’: assembler.cpp:135:32: error: invalid conversion from ‘double (*)(double, double)throw()’ to ‘int’ [-fpermissive] dec_to_bin(remainder, pointer);

//*pointer points to an array[16] 
void dec_to_bin(int num, int *pointer) 
{ 
    //Base cases 
    if(num == 2) 
    { 
     pointer[14] = 1; 
     return; 
    } 
    else if(num == 1) 
    { 
     pointer[15] = 1; 
     return; 
    } 
    else 
    { 
     int power = 0; 
     //power function outlined below. The inbuilt pow(a, b) returns a 
     //double and gave the same problem, so I tried this instead. 
     while(PowerFunc(2, power) < num) 
     { 
      power++; 
     } 
     //Problem arises here. remainder is assigned as an int 
     //Using typeinfo shows it as an int, yet passing it a few lines 
     //down gives the quoted error. 
     int remainder = PowerFunc(2, power)-num; 
     pointer[16-power] = 1; 
    } 
    if(remainder == 0) 
    { 
     return; 
    } 
    else 
    { 
     //Line that throws the error. Saying remainder is a double. 
     dec_to_bin(remainder, pointer); 
    } 
} 
//Power function to replace pow(a, b). Not ideal but it works. 
int PowerFunc(int number, int powernum) 
{ 
    if(powernum == 0) 
    { 
     return 1; 
    } 
    else if(powernum == 1) 
    { 
     return number; 
    } 
    else 
    { 
     return number * PowerFunc(number, powernum-1); 
    } 
} 

Das hat mich ehrlich verblüfft. Zuerst dachte ich, ich würde pow (a, b) benutzen und es einem int zuweisen, würde aber nur den Dezimalteil spleißen, aber selbst wenn ich meine eigene Potenzfunktion mache, sagt sie mir immer noch, dass mein Int ein Double ist.

+0

betrachten die Befugnisse schrittweise Berechnung, aktualisieren Sie einfach es für jede Iteration. –

Antwort

3

Die Linie

int remainder = PowerFunc(2, power)-num; 

zwischen geschweiften Klammern-getrennten Block unter else, so wird der Bereich des remainder variable nach unten erstreckt, nur eine Zeile erscheint. Die remainder in

if(remainder == 0) 

und in

dec_to_bin(remainder, pointer); 

ist eine andere Einheit, durch Zufall mit dem gleichen Namen. Sie können das überprüfen, indem Sie Ihre remainder zu etwas Umbenennung sonst, sagen myremainder ...

Zusätzliche Hinweise:
betrachten if(powernum == 0) mit if(powernum <= 0) ersetzen -, dass Sie eine Menge Berechnung bei negativen Exponenten sparen.

Ich würde auch

return number * PowerFunc(number, powernum-1); 

mit Iteration die Rekursion zu ersetzen vorschlagen:

int result = 1; 
while(powernum-- >= 0) 
    result *= number; 
return result; 
+0

Nun, das war ziemlich offensichtlich. Frische Augen helfen immer. Das Initialisieren der Restvariablen zu Beginn von dec_to_bin hat perfekt funktioniert. –

1

Es ist einfach, remainder ist auch eine Funktion an anderer Stelle erklärt, und der Compiler beschwert sich, dass dec_to_bin eine double als erstes Argument nimmt und nicht einen Zeiger auf eine Funktion vom Typ double (*)(double, double).

An der Stelle, die Sie dec_to_bin(remainder, pointer); Variable remainder im else Gültigkeitsbereich deklariert nennen, ist nicht sichtbar.

Sie haben auch ein Problem mit Ihrem if(remainder == 0), da es immer als falsch ausgewertet wird.