Kerbal Space Program Forum | Polska Społeczność Gry
Off-topic => Dyskusje na dowolne tematy => Wątek zaczęty przez: Rahilnux w Sob, 10 Sie 2013, 18:24:00
-
Ostatnio zacząłem uczyć się programowania w c++ , z pewnego kursu i mam problem z kompilacjom "zadania domowego", może znajdzie się tu jakiś programista który wytłumaczy mi błędy w kodzie. Chodzi o takie błędy kompilacji:
error: invalid conversion from 'int (*)(int, int, int, int*)' to 'int'
error: invalid conversion from 'int (*)(int*, int)' to 'int'
kod:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int losowanie(int od, int ile, int K2, int liczbB[])
{
liczbB[K2] = (rand() % ile ) + od;
return liczbB[K2];
}
int sumowanie(int liczbB[], int K2)
{
int wynik = liczbB[0];
do
{
wynik = wynik + liczbB[K2];
K2++;
} while(K2<999);
return wynik;
}
int wypisywanie(int ws, int liczbB[])
{
int Q = 0;
do
{
cout << liczbB[Q];
Q++;
} while(Q<999);
cout << ws;
}
int main()
{
srand( time(NULL) );
int liczbA[999];
int K = 0;
do
{
losowanie(4, 7, K, liczbA);
liczbA[K] = losowanie;
K++;
} while(K<999);
sumowanie(liczbA, 1);
int wynik2 = sumowanie;
wypisywanie(wynik2, liczbA);
}
-
Tak na przyszłość: pisz co ten kod ma robić (tu nie było się trudno domyślić, ale w większych programach może być to problemem) i pisz w których linijkach zwrócił błędy (wtedy często można je wyłapać bez kompilowania go). Wtedy łatwiej go poprawić. ;)
Pierwszy błąd (który akurat nie miał wpływu na działanie programu, ale na czytelność kodu) to użycie zapisanego na stałe w kodzie rozmiaru tablicy. Jak kod się rozrośnie to ktoś może zachodzić w głowę co oznacza to 999 (albo jak ktoś inny go czyta - ja na początku czytałem funkcje pomocnicze i nie zauważyłem tablicy w mainie, więc zachodziłem w głowę skąd ta liczba się wzięła). Lepiej zrobić sobie deklarację preprocesora albo jeszcze lepiej wartość stałą. Nie wiem dokładnie jak przyjęło się to robić w C++ (sam programuję głównie w C), więc wpiszę deklarację preprocesora - chociaż z tego co słyszałem, to nie jest najlepsza praktyka, ale na pewno lepsza niż pisanie wszędzie 999.
Przy okazji: zmieniłem "K2" na "k2", żeby było widać, że to zmienna, a nie coś zdefiniowanego w preprocesorze.
Drugi błąd to wywołanie funkcji "losowanie(4, 7, k, liczbA)", a następnie przypisanie do wybranej komórki tablicy wskaźnika na tę funkcję (czyli jej identyfikatora):
liczbA[k] = losowanie;
Jeżeli chcesz przypisać do "liczbA[k]" wartość zwracaną przez tę funkcję, powinno to wyglądać w ten sposób:
liczbA[k] = losowanie(4, 7, k, liczbA);
Ale tak naprawdę nie ma takiej potrzeby, bo przecież Twoja funkcja "losowanie" sama wpisuje do zadanej komórki tablicy daną liczbę. Wystarczy więc:
losowanie(4, 7, k, liczbA);
Ale to o czym mówiłem jest ważne, bo przy użyciu funkcji sumującej popełniłeś ten sam błąd.
Zapamiętaj sobie to:
Jeżeli mamy jakąś funkcję, np.:
funkcja przyklad (int blabla)
{
return blabla;
}
To:
przyklad - wskaźnik na tę funkcję (zmienna zawierająca jej położenie w pamięci, o typie wskaźnika na int - i stąd te krzyki kompilatora na temat niepoprawnej konwersji).
przyklad(2) - wywołanie funkcji przyklad z parametrem 2, po czym wstawienie w miejsce równania, w którym pojawił się ten zapis, wartości zwróconej przez nią.
Przy okazji - używanie "using namespace std;" nie jest dobrą praktyką, bo jakkolwiek ułatwia wiele rzeczy, to powoduje konflikty nazw kiedy mamy parę bibliotek z takimi samymi nazwami funkcji. Ale z drugiej strony bez tego jest trudniej, więc może to i lepiej że na początku każdy nauczyciel/książka nie mówi jak się programuje bez tego.
Poza poprawą tych błędów ulepszyłem też odrobinę kod, zmniejszyłem tablicę (bo nie szło przy takim rozmiarze sprawdzić czy program działa poprawnie) i dodałem wypisywanie znaków nowej linii (bo nie szło rozróżnić liczb między sobą). Nie poprawiałem strony algorytmicznej kodu, bo założyłem, że skoro niektóre rzeczy robisz naokoło to dlatego, że podręcznik kazał Ci przećwiczyć kilka konstrukcji.
Kod po poprawieniu:
#include <iostream>
#include <cstdlib>
#include <ctime>
#define ROZMIAR_TABLICY 10
using namespace std;
int losowanie(int od, int ile, int k2, int liczbB[])
{
liczbB[k2] = (rand() % ile ) + od;
return liczbB[k2];
}
int sumowanie(int liczbB[], int k2)
{
int wynik = liczbB[0];
do
{
wynik = wynik + liczbB[k2];
k2++;
}
while (k2 < ROZMIAR_TABLICY);
return wynik;
}
int wypisywanie(int ws, int liczbB[])
{
int Q = 0;
cout << ":";
do
{
cout << liczbB[Q] << ":";
Q++;
}
while(Q < ROZMIAR_TABLICY);
cout << endl << ws << endl;
}
int main()
{
srand(time(NULL));
int liczbA[ROZMIAR_TABLICY];
int k = 0;
do
{
losowanie(4, 7, k, liczbA);
k++;
}
while (k < ROZMIAR_TABLICY);
int wynik2 = sumowanie(liczbA, 1);
wypisywanie(wynik2, liczbA);
return EXIT_SUCCESS;
}
Wersja z tabulatorami zamiast spacji:
#include <iostream>
#include <cstdlib>
#include <ctime>
#define ROZMIAR_TABLICY 10
using namespace std;
int losowanie(int od, int ile, int k2, int liczbB[])
{
liczbB[k2] = (rand() % ile ) + od;
return liczbB[k2];
}
int sumowanie(int liczbB[], int k2)
{
int wynik = liczbB[0];
do
{
wynik = wynik + liczbB[k2];
k2++;
}
while (k2 < ROZMIAR_TABLICY);
return wynik;
}
int wypisywanie(int ws, int liczbB[])
{
int Q = 0;
cout << ":";
do
{
cout << liczbB[Q] << ":";
Q++;
}
while(Q < ROZMIAR_TABLICY);
cout << endl << ws << endl;
}
int main()
{
srand(time(NULL));
int liczbA[ROZMIAR_TABLICY];
int k = 0;
do
{
losowanie(4, 7, k, liczbA);
k++;
}
while (k < ROZMIAR_TABLICY);
int wynik2 = sumowanie(liczbA, 1);
wypisywanie(wynik2, liczbA);
return EXIT_SUCCESS;
}
-
nie ogarniam tego ;D
-
To się zacznij uczyć. ;D
-
ale 6 - klasisty chyba nie przyjmą na taki kurs
-
Pfff... wystarczą chęci i cpp0x.pl (http://cpp0x.pl/). Prawdopodobnie najlepsze darmowy kurs/forum programistyczne c++.
-
i zgoda rodziców :'(
-
Przecież to zwykła strona, którą się czyta.
-
zaraz, terraria jest na c++?
-
O ile mi wiadomo:
Terraria jest napisana w C#. Wymaga wirtualnej maszyny .NET (chociaż widziałem jak ktoś odpalił ją z trudem na Mono) i korzysta z bibliotek XNA.
-
Dzięki za pomoc, dałem pomógł (dopiero teraz bo mnie tydzień nie było :) )
-
Nie ma sprawy. :)
-
Skoro wyskoczył temat o C++, to ogarnia ktoś może WinAPI? Bo zaczynam się uczyć i czuję, że w przyszłości będzie mi potrzebna pomoc ;)
-
WinAPI? w sensie, że chcesz tworzyć okienka czy korzystać z innych funkcji biblioteki. Bo jeśli to pierwsze to powodzenia. Ja bym zalecił GTK+. Ta biblioteka jest prostsza do tworzenia okienek i nie jest ograniczona do jednego systemu operacyjnego. I znowu odsyłam do forum cpp0x. Tam są bardziej kompetentni ludzie.
-
No właśnie o to chodzi, że okienka :D Na szczęście mój najukochańszy kompilator Dev-C++ ma wbudowane template'y, więc wystarczył kurs internetowy i pouzupełniałem po swojemu template, a przy okazji się pouczyłem ;) a co do GTK+ to raczej nie, bo pewnie stoję na C++ i się przyzwyczaiłem, a z nakładką bym musiał od nowa działać.
-
Przecież to tylko biblioteka.
-
No to, skoro wątek leży tu tak opuszczony...
To i ja zadam swoje pytanie :D
Od jakiegoś czasu uczę się C++
Aktualnie tworzę prosty program wielofunkcyjny. Aby nie łazić po wiki stworzyłem listę planet, z podstawowymi informacjami.
Jednak tu pojawia się problem - Tekst który wprowadzam w funkcji ( za pomocą zmiennej string ) nie chce się wyświetlać przy wywoływaniu tej funkcji. Przy 1 z 13 ciał niebieskich ( Kerbolu ) wszystko śmigało bez problemu! Ale kiedy dodałem drugą funkcje... z resztą sami zobaczcie.
#include <iostream>
#include <string>
using namespace std;
int Kerbol_1 ( string Kinfo_1 )
{
/* \206 - ć \210 - ł \230 - ś \242 - ó \245 - ą \251 - ę \253 - ź \276 - ż \344 - ń */
Kinfo_1 = "Kerbol (oficjalnie zwany jako S\210o\344ce, lub Gwiazda) jest gwiazd\245 w centrum Kerbolskiego uk\210adu. ";
Kinfo_1 += "Wok\242\210 niej kr\245\210y 5 planet: Moho, Eve, Kerbin, Duna, oraz Jool i 2 planety kar\210owate Eeloo i Dres.\n ";
Kinfo_1 += "W por\242wnaniu z naszym w\210asnym s\210o\344cem, Kerbol jest 113 razy mniej masywny i posiada 3 razy kr\242tszy promie\344. ";
Kinfo_1 += "prawdopodobnie zalicza si\251 do Pomara\344czowych kar\210\242w w oparciu o jego temperatur\251, ";
Kinfo_1 += "ale mo\276e r\242wnie\210 by\206 czerwonym kar\210em je\230li oprze\206 si\251 na jego promieniu, ";
}
int Moho_1 ( string Moinfo_1 )
{
Moinfo_1 = "Moho jest to najbli\253sza planeta Kerbolu. Jest to mała planeta, ";
Moinfo_1 += "chocia\253 nie jest to najmniejsze c\210iao niebieskie. ";
Moinfo_1 += "Jest planet\245 bez naturalnych satelit\242w tak samo jak Dres. Od wersji 0.18, ";
Moinfo_1 += "na Moho jest \210atwiej wyl\245dowa\206. ";
Moinfo_1 += "Od wersji 0.18 Moho powierzchnia zmieniła się z jasnobrązową na ciemnobrązową. ";
Moinfo_1 += "Powierzchnia jest pokryta kraterami, ";
Moinfo_1 += "w przeciwieństwie do poprzedniej wersji nie ma już dużych wulkanów na Moho i teraz wygląda bardziej jak Merkury. ";
Moinfo_1 += "Moho ma bardzo pokrytą kraterami powierzchnię, ";
Moinfo_1 += "Ze względu na brak atmosfery na Moho, ";
Moinfo_1 += "głównym podejrzeniem erozji na Moho jest wulkanizm. ";
Moinfo_1 += "Wulkaniczne wybuchy na Moho związane są z bliskością gwiazdy Kerbol. ";
Moinfo_1 += "Może to doprowadzić do wypełnienia kraterów. ";
Moinfo_1 += "Moho ma dwa bardzo głębokie kratery na geograficznym biegunem północnym i południowym, ";
Moinfo_1 += "jak dotąd, mają nieokreśloną głębię. ";
Moinfo_1 += "Aktualne analizy i sondy wysłane do krateru na biegunie północnym wykazały, że jest więcej niż 5 km głębokości, ";
Moinfo_1 += "zanim sonda rozbiła się o coraz zwężające się ściany kanionu. ";
Moinfo_1 += "Możliwe jest, że wulkany są od tej chwili w uśpieniu. ";
Moinfo_1 += "Dalsza analiza kanionów powinna odpowiedzieć na wszystkie pytania. ";
}
int main()
{
int A;
cout << "wybie\253 aplikacje" << endl;
cout << "(1) KALKULATOR v.3.5" << endl;
cout << "(2) Encyklopedium Kerbanium v.1.0" << endl;
cin >> A;
if ( A == 1)
{
float a;
float b;
int c;
int d;
bool zle;
do
{
/* \206 - ć \210 - ł \230 - ś \242 - ó \245 - ą \251 - ę \253 - ź \276 - ż \344 - ń */
cout<<"===============================================================================" << endl;
cout<<" KALKULATOR v.3.5" << endl;
cout<<"===============================================================================" << endl;
cout<<"by Oli00PL" << endl;
cout << "\nco chcesz zrobi\206? \ndodawanie(1) \nodejmowanie(2) \nmo\276enie(3)\ndzielenie(4) \nrezygnacja(5) \n " << endl;
cin >> c;
cin.clear();
cin.sync();
if ( c == 5 )
{
cout << "rezygnacja... program zostanie zamkniety" << endl;
return 0;
}
cout << "\npodaj liczb\251" << endl;
cin >> a;
cin.clear();
cin.sync();
cout << "\npodaj kolejna liczb\251" << endl;
cin >> b;
cin.clear();
cin.sync();
switch ( c )
{
case 1:
cout << "dodawanie" << endl;
cout << "suma = " << a + b << endl;
break;
case 2:
cout << "odejmowanie" << endl;
cout << "r\242\276nica = " << a - b << endl;
break;
case 3:
cout << "mo\276enie" << endl;
cout << "iloczyn = " << a * b << endl;
break;
case 4:
cout << "dzielenie" << endl;
cout << "iloraz = " << a / b << endl;
break;
default:
cout << "b\210ad wpisywania..." << endl;
break;
}
if ( c < 5 )
{
cout << "co chcesz dalej zrobi\206?" << endl;
cout << "\nzakonczy\206 (1) \nkontynuowa\206 (2)" << endl;
cin >> d;
}
switch ( d )
{
case 1:
cout << "\nzamykanie..." << endl;
return 0;
break;
case 2:
cout << "\ntrwa restart programu..." << endl;
break;
}
if ( c < 5 )
{
d = 2;
}
} while ( d == 2 );
cout << "do widzenia..." << endl;
}
if ( A == 2 )
{
/* \206 - ć \210 - ł \230 - ś \242 - ó \245 - ą \251 - ę \253 - ź \276 - ż \344 - ń */
cout<<"===============================================================================" << endl;
cout<<" Encyklopedium Kerbanium v.1.0" << endl;
cout<<"===============================================================================" << endl;
cout<<"by Oli00PL" << endl;
int a;
int b;
int c;
string wczytywacz;
string wczytywacz_2;
cout << "\nwybie\276 rozdzia\210" << endl;
cout << "(1) Planety" << endl;
cin >> a;
if ( a == 1 )
{
do
{
cout << "wybie\276" << endl;
cout<<"(1) |Kerbol" << endl;
cout<<"(2) |Moho";
cout<<"\n(3) |Eve" << endl;
cout<<"(4) |gilly" << endl;
cout<<"(5) |Kerbin" << endl;
cout<<"(6) |Mun" << endl;
cout<<"(7) |Minmus" << endl;
cout<<"(8) |Duna" << endl;
cout<<"(9) |Ike" << endl;
cout<<"(10) |Dres" << endl;
cout<<"(11) |Jool" << endl;
cout<<"(12) |Laythe" << endl;
cout<<"(13) |Vall" << endl;
cout<<"(14) |Tylo" << endl;
cout<<"(15) |Bop" << endl;
cout<<"(16) |Pol" << endl;
cout<<"(17) |Eeloo" << endl;
cin >> b;
switch ( b )
{
case 1:
Kerbol_1 ( wczytywacz );
cout << wczytywacz << endl;
cout << "Co chcesz zrobi\206" << endl;
cout << "(1) Kontynuowa\206" << endl;
cout << "(2) Zako\344czy\206" << endl;
cin >> c;
break;
case 2:
Moho_1 ( wczytywacz_2 );
cout << wczytywacz_2 << endl;
cout << "co chcesz dalej zrobic?";
cin >> c;
}
} while ( c == 1 );
}
}
}
Jak widać jest też wbudowany kalkulator - Stworzyłem go już dawno, dla tego w całości jest w funkcji "main"
Przy
case 2:
Moho_1 ( wczytywacz_2 );
cout << wczytywacz_2 << endl;
cout << "co chcesz dalej zrobic?";
cin >> c;
Zamiast wpisu z Moinfo widzę... "co chcesz dalej zrobic?"
-
Małe pytanko, czy to mój błąd czy coś z kompilatorem, że program "kończy się" po wczytaniu 4 liczb.
#include <iostream>
using namespace std;
int wczytaj()
{
int liczba;
cin >> liczba;
return liczba;
}
int main()
{
int liczby[3];
int k = 0;
do
{
wczytaj();
liczby[k] = wczytaj();
k++;
} while(k<3);
}
ps. Zmieniłem while(k<2); na while(k<3); i teraz jest po sześciu.
-
Nie dałeś Getch() na końcu więc po wykonaniu 4 powtórzeń się wyłącza
-
Nie chodzi oto, że się wyłącza tylko, że się wyłącza po podaniu 6 a nie 3 liczb.
ps. Ponadto 1 podana liczba nie zapisuje się nigdzie, 2 w tablicy 0, 3 nigdzie, 4 w tablicy 2 ...
-
Spróbuj zmienić
while(k << 2);
Na
while(k<=2);
-
#include <iostream>
using namespace std;
int main()
{
int liczby[3];
cin >> liczby[0];
cin >> liczby[1];
cin >> liczby[2];
}
"but w drzwiach", ale działa.