[C++] Logarytm

using namespace std;

#include "StdAfx.h"

#include 

#include "math.h"


int main()

{

	long long int a;


        do

        {

                std::cin >> a;

				long double a = log(a);

				printf(a/long double log(2));


        } while (scanf("%d") == 1);


	return 0;

}

1>------ Build started: Project: a, Configuration: Debug Win32 ------

1> a.cpp

1>d:\adam\moje dokumenty\visual studio 2010\projects\program\a\a.cpp(14): error C2062: type 'long double' unexpected

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Kompilator: Visual C++ 2010

Nie mam już siły… Najpierw krzyczy że “ambiguous function” a potem jak mu podaję to co chce to marudzi że “type unexpected”. Co z tym zrobić? :s

Co to ma wg Ciebie robić? Zupełnie nie rozumiem, na pewno nie tak się używa printf

printf(a/long double log(2));

No i mieszasz iostream z cstdio, raczej niezalecane.

Zawsze używałem iostream ale tutaj mi kompilator to załączył i się pomieszało(wcześniej używałem devc++ ale mniejsza z tym). To ma wypisywać logarytm o podstawie 2 z podanej liczby.

#include "StdAfx.h"

#include "math.h"


int main()

{

	long long int a;


        do

        {

                scanf ("%a");

				a = log10(a);

				printf("%a", a/log10(2));


        } while (scanf("%d") == 1);


	return 0;

}

No to printf raz, że przyjmuje string formatujący jako pierwszy, to raz, a dwa “long double log(2)” to nie jest poprawna konstrukcja C++.

Albo użyć IO z C++, czyli std::cout << log(2); albo jeśli chcesz printf to printf("%f", log(2));. No i powtórzę się, raczej niezalecane jest mieszanie iostream z cstdio.

OK, zamieniłem wszystko na jedno:

#include "StdAfx.h"

#include "math.h"


int main()

{

	long long int a;


        do

        {

                scanf ("%a");

				a = log10(a);

				printf("%f", a/log10(2));


        } while (scanf("%d") == 1);


	return 0;

}

Teraz wyskakuje:

1>------ Build started: Project: a, Configuration: Debug Win32 ------

1> a.cpp

1>d:\adam\moje dokumenty\visual studio 2010\projects\program\a\a.cpp(10): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

1> d:\microsoft visual studio 10.0\vc\include\stdio.h(304) : see declaration of 'scanf'

1>d:\adam\moje dokumenty\visual studio 2010\projects\program\a\a.cpp(11): error C2668: 'log10' : ambiguous call to overloaded function

1> d:\microsoft visual studio 10.0\vc\include\math.h(577): could be 'long double log10(long double)'

1> d:\microsoft visual studio 10.0\vc\include\math.h(529): or 'float log10(float)'

1> d:\microsoft visual studio 10.0\vc\include\math.h(121): or 'double log10(double)'

1> while trying to match the argument list '(__int64)'

1>d:\adam\moje dokumenty\visual studio 2010\projects\program\a\a.cpp(12): error C2668: 'log10' : ambiguous call to overloaded function

1> d:\microsoft visual studio 10.0\vc\include\math.h(577): could be 'long double log10(long double)'

1> d:\microsoft visual studio 10.0\vc\include\math.h(529): or 'float log10(float)'

1> d:\microsoft visual studio 10.0\vc\include\math.h(121): or 'double log10(double)'

1> while trying to match the argument list '(int)'

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Zupełnie niepoprawnie używasz scanf - nie podajesz żadnych adresów pod które ma wczytać dane plus nie ma określonego specyfikatora %a. Może użyj iostream, jeśli cstdio jest zbyt trudne dla Ciebie?

Nie ma co być złośliwym, naprawdę. Denerwuje mnie to, że wiem co mam zrobić a wyskakują mi jakieś dziwne błędy i potem zaczynam przez to popełniać kolejne. Dlaczego? Bo kod wygląda mi na poprawny więc zaczynam gmerać w nim losowo(w tym wypadku w printf i scanf) i wychodzą z tego potworki. Fakt, powinienem wkleić tu wersję pierwotną, mea culpa.

#include "StdAfx.h"

#include "math.h"


int main()

{

	long long int a;


        do

        {

                scanf ("%a", a);

				a = log10(a);

				printf("%f", a/log10(2));


        } while (scanf("%d") == 1);


	return 0;

}

Teraz już dobrze? Możemy przejść do właściwej części tam gdzie wyskakuje błąd?

To C++, a więc:

nagłówek z funkcjami matematycznymi to cmath oraz otacza się go nawiasami trójkątnymi, a więc

#include

(no chyba że faktycznie math.h to Twój nagłówek znajdujący się w katalogu razem z tym plikiem źródłowym, ale wątpię)

Ponadto używasz funkcji ze cstdio, więc ten nagłówek też wypadałoby załączyć. Jeśli już chcesz używać scanf, to tu jest lista specyfikatorów: http://www.cplusplus.com/reference/clib … dio/scanf/

Scanf przyjmuje adresy na zmienne, a więc &a. Long long nie występuje w C++, to rozszerzenie poza standardem. Specyfikator dla long long, przynajmniej w g++, to %Ld.

Robisz dwa odczyty, nie wiem czy to to czego chcesz, ale raczej nie. Raczej zapisuj wynik scanf i potem sprawdzaj go w warunku pętli.

Co do błędu, który dostałeś, to myślę że jasno wyjaśnia co jest nie tak - wywołujesz funkcję przeładowaną i kompilator nie wie którą wybrać (choć na g++ nie dostaję tego błędu). Podejrzewam, że wystarczy napisać literał odpowiedniego typu, czyli nie 2, a 2.0

Aha, no i wszystkie te funkcje powinny być w przestrzeni nazw std.

Wprowadziłem poprawki i pozostaje ten sam błąd co na początku.

using namespace std;

#include "StdAfx.h"

#include 

#include 


int main()

{

	long int a;


        while (scanf("%Ld", &a) == 1)

        {

                a = log10(a);

				printf("%Ld", a/log10(2.0));


        }


	return 0;

}

1>------ Build started: Project: a, Configuration: Debug Win32 ------

1> a.cpp

1>d:\adam\moje dokumenty\visual studio 2010\projects\program\a\a.cpp(10): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

1> d:\microsoft visual studio 10.0\vc\include\stdio.h(304) : see declaration of 'scanf'

1>d:\adam\moje dokumenty\visual studio 2010\projects\program\a\a.cpp(12): error C2668: 'log10' : ambiguous call to overloaded function

1> d:\microsoft visual studio 10.0\vc\include\math.h(577): could be 'long double log10(long double)'

1> d:\microsoft visual studio 10.0\vc\include\math.h(529): or 'float log10(float)'

1> d:\microsoft visual studio 10.0\vc\include\math.h(121): or 'double log10(double)'

1> while trying to match the argument list '(long)'

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Problemem w tym przypadku jest “ambiguous call to overloaded function”. Twoje odwołanie do funkcji log10 usiłuje wywołać ją dla argumentu long int, ale taka funkcja nie istnieje w math.h (nie istnieje przeciążenie tej funkcji dla argumentu całkowitego) - zatem nastąpi konwersja do najlepszego dopasowania, ale kompilator nie jest w stanie sam zdecydować które jest najlepsze (niejednoznaczność/ambiguous) - musisz jawnie rzutować argument np. na double:

log10( (double) a);

przy każdym wywołaniu tej funkcji lub po prostu zamiast long long int a zastosować double a.