• Programowanie 5 1
Aktualna ocena:  

Autor Wątek: Programowanie  (Przeczytany 4665 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Sob, 10 Sie 2013, 18:24:00

Offline Rahilnux

  • Szeregowy
  • *
  • Wiadomości: 39
  • Reputacja: 1
    • Zobacz profil
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);

}
« Ostatnia zmiana: Śro, 04 Wrz 2013, 17:24:34 wysłana przez Rahilnux »
Aby zobaczyć link - ZAREJESTRUJ SIĘ lub ZALOGUJ SIĘ

Śro, 14 Sie 2013, 13:02:02
Odpowiedź #1

Offline Fifi

  • Szeregowy
  • *
  • Wiadomości: 17
  • Reputacja: 6
    • Zobacz profil
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:
Kod: Aby zobaczyć link - ZAREJESTRUJ SIĘ lub ZALOGUJ SIĘ
#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:
Kod: Aby zobaczyć link - ZAREJESTRUJ SIĘ lub ZALOGUJ SIĘ
#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;
}
« Ostatnia zmiana: Śro, 14 Sie 2013, 13:05:17 wysłana przez Fifi »

Reklama

Re: Programowanie
« Odpowiedź #1 dnia: Śro, 14 Sie 2013, 13:02:02 »

Śro, 14 Sie 2013, 17:34:18
Odpowiedź #2

Offline Diakon

  • Plutonowy
  • ***
  • Wiadomości: 373
  • Reputacja: 14
    • Zobacz profil
nie ogarniam tego ;D


Pomogłem? Kliknij "Pomógł". Taka mała rzecz, a cieszy.

Pią, 16 Sie 2013, 20:49:57
Odpowiedź #3

Offline Madrian

  • Kapral
  • **
  • Wiadomości: 243
  • Reputacja: 15
    • Zobacz profil
To się zacznij uczyć.  ;D

Reklama

Re: Programowanie
« Odpowiedź #3 dnia: Pią, 16 Sie 2013, 20:49:57 »

Sob, 17 Sie 2013, 12:54:19
Odpowiedź #4

Offline Diakon

  • Plutonowy
  • ***
  • Wiadomości: 373
  • Reputacja: 14
    • Zobacz profil
ale 6 - klasisty chyba nie przyjmą na taki kurs


Pomogłem? Kliknij "Pomógł". Taka mała rzecz, a cieszy.

Sob, 17 Sie 2013, 20:41:18
Odpowiedź #5

Offline Schulze13

  • Plutonowy
  • ***
  • Wiadomości: 296
  • Reputacja: 13
  • Nie mam pojęcia co robię.
    • Zobacz profil
Pfff... wystarczą chęci i Aby zobaczyć link - ZAREJESTRUJ SIĘ lub ZALOGUJ SIĘ. Prawdopodobnie najlepsze darmowy kurs/forum programistyczne c++.
Przed użyciem zapoznaj się z treścią ulotki dołączonej do opakowania bądź skonsultuj się z lekarzem lub polonistą, gdyż każdy post niewłaściwie czytany zagraża Twojemu życiu lub zdrowiu.

Reklama

Re: Programowanie
« Odpowiedź #5 dnia: Sob, 17 Sie 2013, 20:41:18 »

Sob, 17 Sie 2013, 22:52:48
Odpowiedź #6

Offline Diakon

  • Plutonowy
  • ***
  • Wiadomości: 373
  • Reputacja: 14
    • Zobacz profil
i zgoda rodziców  :'(


Pomogłem? Kliknij "Pomógł". Taka mała rzecz, a cieszy.

Nie, 18 Sie 2013, 14:10:47
Odpowiedź #7

Offline Fifi

  • Szeregowy
  • *
  • Wiadomości: 17
  • Reputacja: 6
    • Zobacz profil
Przecież to zwykła strona, którą się czyta.

Reklama

Re: Programowanie
« Odpowiedź #7 dnia: Nie, 18 Sie 2013, 14:10:47 »

Nie, 18 Sie 2013, 15:19:02
Odpowiedź #8

Offline Diakon

  • Plutonowy
  • ***
  • Wiadomości: 373
  • Reputacja: 14
    • Zobacz profil
zaraz, terraria jest na c++?


Pomogłem? Kliknij "Pomógł". Taka mała rzecz, a cieszy.

Pon, 19 Sie 2013, 01:19:33
Odpowiedź #9

Offline Fifi

  • Szeregowy
  • *
  • Wiadomości: 17
  • Reputacja: 6
    • Zobacz profil
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.

Reklama

Re: Programowanie
« Odpowiedź #9 dnia: Pon, 19 Sie 2013, 01:19:33 »

Pon, 19 Sie 2013, 17:12:06
Odpowiedź #10

Offline Rahilnux

  • Szeregowy
  • *
  • Wiadomości: 39
  • Reputacja: 1
    • Zobacz profil
Dzięki za pomoc, dałem pomógł (dopiero teraz bo mnie tydzień nie było :) )
Aby zobaczyć link - ZAREJESTRUJ SIĘ lub ZALOGUJ SIĘ

Wto, 20 Sie 2013, 15:32:58
Odpowiedź #11

Offline Fifi

  • Szeregowy
  • *
  • Wiadomości: 17
  • Reputacja: 6
    • Zobacz profil
Nie ma sprawy. :)

Reklama

Re: Programowanie
« Odpowiedź #11 dnia: Wto, 20 Sie 2013, 15:32:58 »

Wto, 20 Sie 2013, 16:00:29
Odpowiedź #12

Offline disentombed

  • Szeregowy
  • *
  • Wiadomości: 15
  • Reputacja: 2
  • Quidquid latine dictum sit, altum videtur.
    • Zobacz profil
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 ;)
Nonsense, it would not explode...

Śro, 21 Sie 2013, 14:16:44
Odpowiedź #13

Offline Schulze13

  • Plutonowy
  • ***
  • Wiadomości: 296
  • Reputacja: 13
  • Nie mam pojęcia co robię.
    • Zobacz profil
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.
Przed użyciem zapoznaj się z treścią ulotki dołączonej do opakowania bądź skonsultuj się z lekarzem lub polonistą, gdyż każdy post niewłaściwie czytany zagraża Twojemu życiu lub zdrowiu.

Reklama

Re: Programowanie
« Odpowiedź #13 dnia: Śro, 21 Sie 2013, 14:16:44 »

Czw, 22 Sie 2013, 18:26:28
Odpowiedź #14

Offline disentombed

  • Szeregowy
  • *
  • Wiadomości: 15
  • Reputacja: 2
  • Quidquid latine dictum sit, altum videtur.
    • Zobacz profil
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ć.
Nonsense, it would not explode...