2016-04-09 7 views
-1

Also muss ich brauchen, um eine Teilungsfunktion zu machen, die eine Nummer aus der Hauptklasse nehmen und teilen sie durch 2.Dividing Zahlen von 2 mit einer gewissen Einschränkung

Dies ist, was ich bisher:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main() 
{ 
    int num = 20; 
    divide(num); 
    printf(num); 
} 

void divide(int* a) 
{ 
    int prod = a; 
    int y; 
    y = prod/2; 
} 

Ich denke, dass der einzige Teil, in dem ich Probleme habe, wenn dieser Code oben falsch ist.

Danke!

+0

** Bitte ** kompilieren mit Warnungen aktiviert, und berücksichtigen ** jede Warnung, die der C-Compiler ausgibt ** zu ** ein Fehler, der von Ihnen gemacht ** **. –

Antwort

4

Hier sind zwei Fehler, die C leider relativ einfach macht.

Zuerst müssen Sie einen Zeiger in divide übergeben, aber Sie übergeben gerade eine Ganzzahl, die in einen Zeiger konvertiert wird. Mit anderen Worten, Sie müssen die Adresse num übergeben, nicht den Wert num. Kurz gesagt, Sie müssen divide(&num) statt divide(num) verwenden.

Zweitens machen Sie einen ähnlichen Fehler in divide. Sie haben einen Zeiger auf eine ganze Zahl akzeptiert, a, und dann teilen Sie a durch 2. a ist keine Ganzzahl. Es ist ein Zeiger auf eine ganze Zahl! Wenn Sie mit dem Wert arbeiten möchten, auf den a zeigt, müssen Sie ihn dereferenzieren. Mit anderen Worten, Sie benötigen a* = *a/2;.


Als eine Randnotiz sollten Sie die Warnungen von welchem ​​Compiler Sie verwenden. Alle wichtigen Compiler warnen Sie, wenn Sie eine Ganzzahl in einen Zeiger oder einen Zeiger auf eine Ganzzahl ohne explizite Umwandlung konvertieren. Wenn Sie beispielsweise gcc verwenden, möchten Sie vielleicht die Flags -Wall -Wextra -pedantic verwenden (oder lesen Sie die gcc-Dokumentation und finden Sie einige Flags, die Ihnen besser passen). Dies könnte wie folgt aussehen: gcc -o some_prog -Wall -Wextra -pedantic some_prog.cpp.

+0

'a * = * a/2;' → '* a = * a/2;'. Und drittens: Das 'printf' des OP ist falsch. –

+0

Danke funktioniert und @CoolGuy hat es behoben printf ("% i", num); –

3

Ich nehme an, das ist eine Hausaufgabe. Wenn es sich um eine Hausaufgabenfrage handelt, sollten Sie sie als zukünftige Referenz kennzeichnen.

Diese Frage bezieht sich auf Zeiger. Das Kernkonzept hier ist, dass die Divide-Funktion einen Zeiger auf eine ganze Zahl nimmt. Ein Zeiger ist ein Ort im Speicher - mit diesem Zeiger kann er direkt zu diesem Ort gehen und den Wert dort ändern. Dann wird main() in der Lage sein, den Wert zu sehen, ohne dass er von divide() zurückgegeben werden muss.

Der erste Schritt ist, Divide zu schreiben. Ich werde Kommentare hinzufügen, um zu erklären, was jeder Schritt tut.

void divide(int* a) 
{ 
    //go to the location in memory referenced by a and get the value 
    int aValue = *a; 

    //divide the value by 2 
    aValue = aValue/2; 

    //store the value in the memory location referenced by a 
    *a = aValue; 
} 

Der nächste Schritt ist, Ihre Hauptfunktion ein wenig zu ändern. Gerade jetzt übergeben Sie divide() und Integer. Sie müssen es einen ganzzahligen Zeiger übergeben.

Versuchen Sie Folgendes. Der Operator "&" erhält die Speicheradresse einer Variablen.

int main() 
{ 
    int num = 20; 
    divide(&num); 
    printf("%d\n", num); 
} 

Beachten Sie, dass dieses Programm in fehlerfrei laufen kann, wenn er versucht, eine ungerade Zahl von 2 zu teilen, aber für Ihr Beispiel sollte dies tun, in Ordnung. Lass mich von anderen Fragen wissen.

+1

"_wenn es sich um eine Hausaufgabenfrage handelt, solltest du sie als solche markieren._" - Nein.Es gibt auch kein Tag [Tag: Hausaufgaben] –

+0

@CoolGuy Also vielleicht ist das Wort "Tag" hier falsch, aber die allgemeine Richtlinie ist, dass Sie klar sein sollten, dass es Hausaufgaben richtig ist? – nhouser9

+0

@CoolGuy bearbeitet, um Ihren Kommentar zu printf – nhouser9

Verwandte Themen