Access violation - dlaczego?

0

Funkcję wziąłem z książki Jerzego Grębosza - "Symfonia c++".

#include <iostream.h>
#include <conio.h>
long potega(int stopien, long liczba);
main()
{
int pocz, koniec;
cout<<"Program na obliczanie poteg liczb"
<<"calkowitych\n"
<<"z zadanego przedzialu \n"
<<"Podaj poczatek przedzialu: ";
cin>>pocz;
cout<<"\nPodaj koniec przedzialu: ";
cin>>koniec;
        for (int i=pocz; i<=koniec ; i++)
        {
           cout<<i
           <<" do kwadratu= "
           <<potega(2,i)
           <<" a do szescianu= "
           <<potega(3,i)
           <<endl;
        }
}

long potega (int stopien, long liczba)
{
long wynik=liczba;
        for(int i=1 ; i<stopien ; i++)
        {
           wynik=wynik*liczba;
        }
        getch();
        return wynik;
}

Chciałbym, żebyście mi wyjaśnili jej część:

long potega (int stopien, long liczba)
{
long wynik=liczba;
        for(int i=1 ; i<stopien ; i++)
        {
           wynik=wynik*liczba;
        }
        getch();
        return wynik;
}

Mianowicie nie rozumiem zasady w jaki sposób program podnosi liczbę do kwadratu, a później sześcianu.
Dlaczego skoro

long wynik=liczba

występuje później

wynik=wynik*liczba

(to znaczy zmienna pomnożona przez inną zmienną daje tę samą zmienną co na początku).

  1. Czy na tym forum nie można zmieniać postów? Nigdzie nie widzę tej funkcji...
    Pozdrawiam,
    Krzysiek
0

to nie jest operator rownosci, tylko przypisania, np. w w + 10, oznacza w staje sie wieksze o 10, co do edycji postow to sluzy do tego ikonka z taka "karteczka" i olowkiem

0

Wiem, że znak równości to w C++ przypisanie, może troszeczkę źle mnie zrozumiałeś. Interesuję mnie dlaczego w tym programie jest to zrobione tak, a nie inaczej.
Proszę kogoś o wytłumaczenie mi kliku ostatnich linijek kodu (to co powtórzyłem na końcu, czyli ciało funkcji potęga).

Co do zmiany postów to po najechaniu na tę ikonkę powinien się pojawić napis "Edytuj", a nie "Panel administracyjny".

0

Moim zdaniem autor uzyl takiego sposobu, poniewaz jes on chyba najprostszym sposobem obliczenia poteg.
Prosty przyklad:
stopien = 3, liczba = 3
i jedziemy:
wynik = liczba //mamy w wyniku 3
i teraz powtazamy (stopien - 1) razy (jesli stopien jest 0 to tak nie bedzie, ale mniejsza z tym) wynik = wynik * liczba, czyli mamy kolejne kroki
1 --> wynik = wynik * liczba // wynik = 3 * 3 = 9
2 --> wynik = wynik * liczba // wynik = 9 * 3 = 27
//Koniec petli
i zwracamy wynik czyli 27 bo tyle jest 3^3

Prosciej nie potrafie. Na przyszlosc Debugger i/lub kartka papieru z olowkiem.

0

Dziękuję Foflik, zrozumiałem :)

0

Nie będę co chwila zakładał lamerskich topików, więc kontynuję ten. Dokładnie za 2 tygodnie mam egzamin poprawkowy z C++, więc proszę o wyrozumiałość. I tak do tej pory już się bardzo dużo od Was nauczyłem :)
Tym razem pytanie brzmi, dlaczego w poniższej funkcji wyskakuje access violation i jak się tego pozbyć.

#include<conio.h>
#include<iostream.h>
#include<stdlib.h>

int *wynik();
void main()
{
int *result;
randomize();
char press;
do
{
clrscr();
result=wynik();
cout<<"Wygenerowano: "<<*result;
press=getch();
}
while (press!=27);
}

int *wynik()
{
int *ptr;
*ptr=random(100);
return ptr;
}

Dziękuję,
Krzysiek

0

Należy zaalokować pamięć na wskaźniki, a poza tym, ta funkcja powinna zwracać wartość typu int, a nie int*, gdzyż zmienna jest szybsza niż wskaźnik. Czy random() ma jakieś parametry, i czy randomize() jest zapowiedziane w tych plikach nagłówkowych?

0

Więc czy mógłby ktoś to poprawić?

0

pamiec alokuje sie za pomoca operatora new

0

Przeglądam tak programiki z Waszych kursów. Są bardzo fane, ale niekiedy występują w nich błędy. Chociażby ten:

#include<iostream.h>
#include<conio.h>
class clip {
private:
int wartosc;
public:
void ustaw_wartosc(int liczba);
int oddaj_wartosc(void);
};

void clip::ustaw_wartosc(int liczba)
{
wartosc = liczba;
}

int oddaj_wartosc(void)
{
return (wartosc);
}

int main(void)
{
 clip schowek1, schowek2;

schowek1.ustaw_wartosc(20);
schowek2.ustaw_wartosc(50);
printf("\nW schowku pierwszym jest: %d", schowek1.oddaj_wartosc());
printf("\nW schowku drugim jest: %d", schowek2.oddaj_wartosc());
return 0;
}

Wyskakuje komunikat: "undefined symbol 'wartosc'". Co należy zmienić, żeby się kompilowało?

0

Zapomniałeś o czymś, powinno być:

int clip::oddaj_wartosc(void)
{
    return (wartosc);
}

To jest metoda klasy a nie zwykła funkcja

1 użytkowników online, w tym zalogowanych: 0, gości: 1