Zaloguj się, aby obserwować  
UthersonL

Programowanie - pytania, problemy, przykłady programów

1812 postów w tym temacie

Nie mogę tego przejść. W main() mam wywołanie obiektu klasy A, jako tablice np.
A tab[3]={A("BBB"), A("AAAA"),A("CCCCC")};
co muszę zrobić?
I 2 pytanie, jeśli mam static int tab[3]={100,200,300}; to co muszę zrobić by odwołać się do tych wartości z klasy B?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.01.2014 o 22:01, Daronn_Darker napisał:

Nie mogę tego przejść. W main() mam wywołanie obiektu klasy A, jako tablice np.
A tab[3]={A("BBB"), A("AAAA"),A("CCCCC")};
co muszę zrobić?


Wolno ci używać C++11 mam nadzieję?
Najpierw stworzymy sobie małą klasę:

class test{
public:
test(string publiczny)
{
prywatny = publiczny;
}
const string print()
{
return prywatny;
}
private:
string prywatny;
};

Teraz w mainie:
test abba[] { {"abba"},{"acca"}, {"adda"} }; // to stworzy nam 3 obiekty naszej klasy test.
I test czy działa:
cout << abba[0].print() << endl;
cout << abba[1].print() << endl;
cout << abba[2].print() << endl;

Dnia 24.01.2014 o 22:01, Daronn_Darker napisał:

I 2 pytanie, jeśli mam static int tab[3]={100,200,300}; to co muszę zrobić by odwołać
się do tych wartości z klasy B?

Twój static int tab musi być zdefiniowany przed pojawieniem się klasy B.
Np. tak:
static int tab[3]={1,2,3};
class B{};
Możesz też zamiast static użyć extern i wykorzystać zmienną o zasięgu globalnym:

extern int tab[]
class B{};

i w zupełnie innym miejscu programu, nawet w innym pliku (byleby o zasięgu globalnym):
int tab[3]={1,2,3};
Słowo kluczowe extern mówi kompilatorowi "Słuchaj, to będzie taka zmienna której na razie nie musisz jeszcze znać. Poznasz ją dopiero podczas linkowania plików". Mówisz tylko kompilatorowi jaki to będzie typ zmiennej ale nie podajesz szczegółów.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jeśli mam takie coś semctl(id_sem, 2, SETVAL, 1) to o co dokładnie chodzi w tej funkcji? Tzn. wiem ze to 1 odnosi się do uni, ale nie wiem, czy unia zwraca 1 czy co?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 03.02.2014 o 22:22, Daronn_Darker napisał:

Jeśli mam takie coś semctl(id_sem, 2, SETVAL, 1) to o co dokładnie chodzi w tej funkcji?
Tzn. wiem ze to 1 odnosi się do uni, ale nie wiem, czy unia zwraca 1 czy co?


Unia jest kontenerem różnych typów który przechowuje jeden element.

union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;

Ta jedynka pasuje mi do int val bo wskaźnikiem to raczej nie jest ;p. I tak, unia może "zwrócić" 1 jeśli jednym z elementów wewnątrz niej jest int.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

kiedy i dlaczego stosuje sie destruktor wirtualny?
Niby wiem, tzn. stosuje się go gdy mamy klasę pochodną i w niej właśnie destruktor, a w klasie głównej mamy konstruktor. Ale czy dobrze myślę i czy jest jeszcze jakaś odpowiedź?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 13.02.2014 o 22:35, Daronn_Darker napisał:

kiedy i dlaczego stosuje sie destruktor wirtualny?
Niby wiem, tzn. stosuje się go gdy mamy klasę pochodną i w niej właśnie destruktor, a
w klasie głównej mamy konstruktor. Ale czy dobrze myślę i czy jest jeszcze jakaś odpowiedź?


Konstruktory i destruktory powinny być i w klasie bazowej i w klasie pochodnej - destruktor w jednej a konstruktor w drugiej to jakaś mocno krejzi idea.

Wirtualny destruktor wykorzystujemy dokładnie z tego samego powodu, dla którego używamy wirtualnych metod (Java to jest jednak klawa pod tym względem, że wszystko jest domyślnie wirtualne) - jeśli mamy wskaźnik klasy bazowej do obiektu klasy pochodnej to bez słowa kluczowego "virtual" w momencie wołania delete zostanie zostanie wywołany destruktor klasy bazowej a nie pochodnej. Czyli będzie miało miejsce tzw. wczesne wiązanie - coś na zasadzie "wskaźnik klasy bazowej? Kij na co wskazuje, ciśniemy po metodach, konstruktorach i destruktorach klasy bazowej". Jeśli wiesz, jak działają metody wirtualne to co do destruktorów jest to dokładnie tak samo.

Pozwolę sobie zacytować mądrą książkę:
"Kiedy próbujemy usunąć obiekt klasy potomnej poprzez wskaźnik klasy bazowej, która zawiera niewirtualny destruktor, wynik jest nieprzewidywalny".
(C++, 50 efektywnych sposób na udoskonalenie Twoich programów. Swoją drogą polecam).

Po prostu część danych nie zostanie usunięta. Pamiętaj przy tym, że w przypadku dziedziczenia destruktory wywoływane są w odwrotnej kolejności niż konstruktory - destruktor najpierw klasy pochodnej a potem bazowej.

No, chyba wyczerpałem temat. Poczytaj jeszcze o dziedziczeniu wirtualnym i już będzie pełen lans bałns :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Problem nie dotyczy stricte programowania, ale obija się o komputery. Potrzeba mi artykuł na 8 stron, czcionką 12 (z dziedziny Informatyki)na temat np. nowych technologii. po angielsku, może ktoś sie z tym spotkał?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.02.2014 o 12:22, Thalanthas napisał:

Artykułów jest w Internecie cała masa. Wpisz w google temat i na pewno coś znajdziesz
nawet takie dłuższe.

No ludzie... czy gdybym znalazł coś co się nadaje w sensie merytorycznym i długościowym to bym pisał na forum?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Napisałem sobie w C++ drobny program służący mi do pewnych obliczeń. Z racji, że są one dość długotrwałe zrównolegliłem je przy pomocy OpenMP. Na laptopie, na którym pisałem kod (z prockiem i3) wszystko po odpaleniu chodzi elegancko - rdzenie procesora niemal cały czas pracują na 100%, jednak z racji że cpu mocno się przy tym grzeje pomyślałem, że lepiej będzie odpalić obliczenia na kompie stacjonarnym (z prockiem i5). I tu mam mały problem bo po uruchomieniu tego samego kodu na nim procesor jest wykorzystywany tylko w 15-20%, a zrównoleglenie omp nie przynosi żadnego przyspieszenia. Czym może to być spowodowane?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.02.2014 o 15:57, Hoplita napisał:

Napisałem sobie w C++ drobny program służący mi do pewnych obliczeń. Z racji, że są one
dość długotrwałe zrównolegliłem je przy pomocy OpenMP. Na laptopie, na którym pisałem
kod (z prockiem i3) wszystko po odpaleniu chodzi elegancko - rdzenie procesora niemal
cały czas pracują na 100%, jednak z racji że cpu mocno się przy tym grzeje pomyślałem,
że lepiej będzie odpalić obliczenia na kompie stacjonarnym (z prockiem i5). I tu mam
mały problem bo po uruchomieniu tego samego kodu na nim procesor jest wykorzystywany
tylko w 15-20%, a zrównoleglenie omp nie przynosi żadnego przyspieszenia. Czym może to
być spowodowane?


Hmmm... że tak spytam - skompilowałeś ponownie projekt na PC-cie? Windows z natury nie jest zgodny ze standardem POSIX więc może źle reaguje na aplikację napisaną pod inną platformą.

Poza tym możesz sprawdzić czy np. rozwiązanie wątków wbudowane bezpośrednio w C++11 obciąża u ciebie PC-ta "tak jak powinno", spróbuj napisać dosłownie "Hello World" dla wielordzeniowca:
http://pastebin.com/BeAqxJGP
UWAGA ^ Powyższy kod jest paskudny! Ale obciąża odpowiednio 1, 2 i 4 rdzenie więc w celu diagnostycznym powinien działać.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 22.02.2014 o 22:20, ziptofaf napisał:

Hmmm... że tak spytam - skompilowałeś ponownie projekt na PC-cie? Windows z natury nie
jest zgodny ze standardem POSIX więc może źle reaguje na aplikację napisaną pod inną
platformą.

Tak, skompilowałem. Na obu kompach używam Visuala 2010.

Dnia 22.02.2014 o 22:20, ziptofaf napisał:

Poza tym możesz sprawdzić czy np. rozwiązanie wątków wbudowane bezpośrednio w C++11 obciąża
u ciebie PC-ta "tak jak powinno", spróbuj napisać dosłownie "Hello World" dla wielordzeniowca:
http://pastebin.com/BeAqxJGP
UWAGA ^ Powyższy kod jest paskudny! Ale obciąża odpowiednio 1, 2 i 4 rdzenie więc w celu
diagnostycznym powinien działać.

Chętnie bym to przetestował, ale na stacjonarce używam jeszcze Widnowsa XP i mam na nim problem z odpaleniem tego kodu. Zdaje się, że żadna wersja Visuala obsługująca C++11 nie wspiera już tego systemu, zainstalowałem też najnowszą wersję MinGW, ale i on ma problemy z odpaleniem wątków (chociaż testowałem parę innych rzeczy z najnowszego standardu i nie miał z nimi kłopotów).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Witam, mam nadzieję, że znajdę tu jakiegoś ochotnika do pomocy. :)
Napisałem sobie bowiem taki prosty (i jeszcze nieskończony) programik szyfrujący, którego kod wrzucę na dole. Chodzi mi o funkcję anagram, a dokładnie komendę cin.getline. Gdy tworzyłem tę funkcję to działała ona normalnie. Teraz, gdy dodałem switcha, funkcja nie zauważa tej komendy i przehodzi od razu do kolejnego tekstu do wyświetlenia. Zmiana cin.getline na cin pomaga, ale cin "urywa" tekst po spacji, więc to nie jeste rozwiązania.
Z góry dzięki za pomoc! :)

Kodzik:

#include<iostream>
#include<conio.h>
using namespace std;
void anagram ()
{
char tab[128];
int ilosc;
cout<<"Podaj tekst\n";
cin.getline(tab,128);
cout<<"Podaj ilosc znakow (jest potrzebna w niektorych szyfrach, nie pomijaj spacji)\n";
cin>>ilosc;
cout<<"Tekst "<<tab<<"\n";
for (int i=0; i<ilosc; i++)
{
cout<<tab;
}
}
main()
{
char tab[128];
int ilosc, wybor;

cout<<"Witaj w programie szyfrujacym!\n";
cout<<"Program szyfruje nastepujacymi metodami:\n";
cout<<"1. Anagram\n 2. Plotek\n";
cout<<"Ktorej metody mam uzyc?\n";
cin>>wybor;
switch(wybor)
{
case 1:
anagram();
break;
case 2:

break;
default:
cout<<"Nie mam az tyle funkcji :)\n";
break;
}
getch();
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 03.03.2014 o 18:58, tylor2_AKA_Wylfryd napisał:


Od razu zaznaczam, że jestem początkującym "programistą".

Zamieniłem cin.getline na cin >> ws >> tab;

Jest to modyfikator dzieki któremu cin będzie pomijał spacje.

Przed cin>>ilosc dalem fflush(stdin)

Powinno dzialac.


EDIT. Wyglada na to że uzycie fflush po linijce cin>>wybor rozwiązuje problem ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

A nie prościej skorzystać z string-a? dowolna długość tekstu, spacje obsługuje (do string trafi wszystko aż do enter-a), jest funkcja która zwróci jego długość, więc nie trzeba pytać o nią użytkownika.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Utwórz konto lub zaloguj się, aby skomentować

Musisz być użytkownikiem, aby dodać komentarz

Utwórz konto

Zarejestruj nowe konto na forum. To jest łatwe!


Zarejestruj nowe konto

Zaloguj się

Masz już konto? Zaloguj się.


Zaloguj się
Zaloguj się, aby obserwować