Fehler: Mehr als eine Instanz von überladene Funktion "sqrt" entspricht der argument-Liste. Was das?
In meine Hausaufgaben für meine C-Klasse haben wir ein Programm schreiben, dass prüft, ob eine ganze Zahl eine Primzahl ist. Ich bin immer ein Fehler bei der sqrt () - Funktion. Mein professor sagte mir, dass num muss ein integer sein, und wir müssen mit der sqrt () - Funktion. Ich dachte, das problem war, dass die sqrt () - Funktion kann nicht verwendet werden, die auf ein integer, aber mein professor hat mir gesagt, dass es kann, und das war ich immer ein Fehler von etwas anderem. Seid Ihr das problem sehen?
int primality(int num)
{
int isprime;
/*check if num is prime*/
for (int i = 2; i <= sqrt(num); i++)
{
if (num % i == 0)
isprime = 0; /*is not prime*/
else
isprime = 1; /*is prime*/
}
if (isprime == 0)
return 0;
elseif (isprime == 1)
return 1;
}
BEARBEITEN:
Ja, ich bin mit Mathe.h und kompilieren als C-code.
Den Fehler msg "Fehler: Mehr als eine Instanz von überladene Funktion "sqrt" entspricht der argument-Liste.
- Und die Fehlermeldung, die Sie bekommen haben, war... ? Ohne zu sehen, dass (a) Sie beinhalten math.h? (b) hast du den link mit libm? (Ich Ignoriere alle anderen Fehler im Programm, @CarlNorum hat darauf hingewiesen, man)
- In diesem code kommen Sie zurück aus jeder iteration der Schleife. In anderen Worten, man wird nur eine iteration. Diesen code einfach prüft, ob Ihre Anzahl gerade oder ungerade ist. Durch die Art und Weise, die korrigierte Funktion benannt werden sollten
isprime
. Und kann Sie nicht verwendenbool
eher alsint
für eine logische Wert? - Wie sind Sie mit dem kompilieren? Ich bin riechen
C++
in der Fehlermeldung. - Ich bin mit Visual C++ schreiben und kompilieren meines Codes. Könnte das das problem sein? Ich hatte noch nie irgendwelche Probleme mit es vor.
- Schreiben Sie
i <= sqrt(num)
alsi * i <= num
- Vorschlag: Wenn es nicht auf die Logik des Programms, können Sie beseitigen die if / elseif-block an das Ende der Funktion und ersetzen Sie es mit einer einzigen Zeile C++ - code aus einem reservierten Wort, einen einzigen Variablennamen und ein Semikolon. Das reservierte Wort-und Variablen-Namen sollten durch ein Leerzeichen getrennt werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die C Sprache nicht "überlasten". Meine Wette ist, dass Sie den code zu kompilieren als C++, nicht C. Wenn Sie mit GCC kompilieren mit
gcc
, nichtg++
. Wenn Sie Visual Studio, es gibt eine option in den Eigenschaften des Projekts:In jedem Fall, benennen Sie Ihre Datei mit einem
.c
Erweiterung (Kleinbuchstaben 'c').In der Tat, in C gibt es nur eine
sqrt
, definiert alsund Ganzzahlen konvertieren zu verdoppeln.
sqrt(int,...)
imcmath
so haben Sie, um werfen Sie Ihre ints zu verdoppeln, wie diessqrt((double)num)
mit einem von sqrt () - Definitionen. Auch Sie sind mit C++, wie Sie deklariert und initialisiertint i = 2
direkt in Ihremfor loop
Kopf Abschnitt. 🙂for
loop-Nutzung ist standard-C.Wollen Sie nicht
return 1
im inneren der Schleife - es muss sein, nachdem die Schleife abgeschlossen ist. Ihr professor ist richtig, dasssqrt(num)
arbeiten -num
gefördert werden, umdouble
automatisch - C hat Regeln für Veränderungen in der Funktion Anrufe, etc. Sie tun müssenmath.h
wenn Sie nicht getan haben, die an anderer Stelle in Ihrer Programm - welche Fehler sind Sie immer?x
ist ein perfektes Quadrat nicht breiter als 53 bitssqrt(x)
hat ein exaktes Ergebnis und IEEE 754 Mandate, die das exakte Ergebnis zurückgegeben werden.Ihre Logik ist falsch, hier richtig:
Wenn Sie darüber nachdenken, wenn die Zahl ist nicht teilbar durch zwei, Ihre Funktion sofort zurück
1
.Sind Sie
return
ing zu früh. Denken Sie daran, dass einreturn
im wesentlichen beendet die Funktion und bricht aus ihm heraus.Versuchen Sie stattdessen, brechen aus nur, wenn die Zahl composite und zurück
True
nur, wenn Sie sicher sind, dass es eine Primzahl ist.Nur als Randnotiz, Ihre Funktion zu registrieren, die Quadrate von Primzahlen (d.h.
9
,25
,49
) als prime, da Sie die<
Zeichen in Ihremfor
Schleife.Ändern, um eine
<=
Zeichen, wie die Rechnung für die Quadratwurzel die einzigen Teiler der Zahl.(int)(sqrt(100)) == 9
mag wahr sein, für alles, was wir wissen.Hast du
#include <math.h>
?Auch, entsprechend Ihrer Funktion, 1, 2, und 3 kommen wieder als nicht prime... Könnte möchten, dass zu beheben. Ich würde bieten mehr helfen, aber es klingt wie das ist, für die Hausaufgaben und ich möchte lieber nicht nur geben Sie die Antwort (einige Universitäten halten es für Cheaten).
Zur Beantwortung Ihrer eigentlichen Frage: sqrt() nicht eine überlastung für int, aber es hat überlastungen sowohl für double und float, und damit der compiler kann nicht erraten, welche man zu verwenden.
Das problem ist, dass die sqrt-Funktion nicht nehmen, eine ganze Zahl als argument. Wollen Sie
sqrt((double)n) oder sqrt((float)n), um es zu beheben.
Wenn Sie
#include <math.h>
, können Sie beheben die Fehler von:for (int i = 2; i <= sqrt(num); i++)
durch ändern dersqrt(num)
zu einem einfach deklarierten Variablen (wien, x, i...
), weilsqrt(num)
bereits in dermath.h
Bibliothek.die Funktion der
sqrt()
definieren alsdouble sqrt(double)
du bist also der Eingang sein sollte double oder float.Drehen eine
integer
variablefloat
ohne den Typ ändern, verwenden Siefloat( integer_Variable )
Z.B. das Sie code schreiben
i<=sqrt(float(num));