Zaloguj się, aby obserwować  
Bartuc

Język C / C++ / C# / Java - pytania, problemy...

1979 postów w tym temacie

Dnia 01.04.2011 o 18:14, Piotrbov napisał:

Właśnie tak mam ;) Podczas kompilacji mam błędy, pierwszy to, taki, że może być tylko
jedna zmienna w nawiasach

Jedna zmienna występuje gdy definiujesz operator będący metodą obiektu. Wtedy lewy operand jest obiektem na rzecz którego wywołuje się operator. Jeżeli jednak operator jest globalną funkcją, to lewy operand musi być argumentem funkcji.

Dnia 01.04.2011 o 18:14, Piotrbov napisał:

, więc przeniosłem tego ofstream''a do środka

Nie ofstream, a ostream. Jedna literka, a zmienia wszystko.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 01.04.2011 o 19:18, Olamagato napisał:

Nie ofstream, a ostream. Jedna literka, a zmienia wszystko.


No fakt, lecz i tak mam ten sam błąd kompilacji...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 01.04.2011 o 19:00, Erton napisał:

template <class Type>
bool News<Type>::isempty()
{
return this-> Node.data == 0;
}
i chcę ją wyspecjalizować, żeby dla na przykład String robiła co innego. Jak to zapisać?

Użyj operatora typeid, włącz do plików żródłowych nagłówek type_info i poczytaj sobie w jakimś podręczniku o RTTI. Tego samego RTTI używa operator dynamic_cast<>().

Dnia 01.04.2011 o 19:00, Erton napisał:

Głównie chodzi mi o fragment News<Type>, bo nigdzie, gdzie czytałem (Prata i Internet)
nie było wyjaśnione, co zrobić w takiej sytuacji.

Musisz sprawdzić czy type_info klasy Type jest identyczne jak type_info obiektu innej istniejącej klasy. Na przykład możesz sobie zrobić taki:
static string ZERO = new string("");
a potem porównywać:
if ( typeid(this) == typeid(&ZERO) ) { /*wchodzi tutaj jeżeli this jest typu string*/ }
dokładniej rozwinięcie jest takie:
if ( typeid(this).operator==(typeid(&ZERO)) ) { /*wchodzi tutaj jeżeli this jest typu string*/ }
bo operator==() pochodzi z klasy type_info.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 01.04.2011 o 19:23, Piotrbov napisał:

No fakt, lecz i tak mam ten sam błąd kompilacji...

Spróbuj:
ostream& ::operator >> (ostream& out, const Book& book)
//...
Oraz upewnij się, że operator jest funkcją globalną lub przynajmniej statyczną dla miejsca, gdzie próbujesz go użyć.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 01.04.2011 o 21:19, Olamagato napisał:

> No fakt, lecz i tak mam ten sam błąd kompilacji...
Spróbuj:
ostream& ::operator >> (ostream& out, const Book& book)
//...


Niestety nic z tego:
"std::ostream& Book::operator>>(std::ostream&, const Book&)'' must take exactly one argument "
" no match for ''operator>>'' in ''out >> argbook->Book::title'' "

Dnia 01.04.2011 o 21:19, Olamagato napisał:

Oraz upewnij się, że operator jest funkcją globalną lub przynajmniej statyczną dla miejsca,
gdzie próbujesz go użyć.


A jak to sprawdzić?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 01.04.2011 o 21:27, Piotrbov napisał:

> > No fakt, lecz i tak mam ten sam błąd kompilacji...
> Spróbuj:
> ostream& ::operator >> (ostream& out, const Book& book)
> //...

Niestety nic z tego:
"std::ostream& Book::operator>>(std::ostream&, const Book&)'' must take exactly
one argument "

Ten komunikat mówi Ci, że kompilator próbuje dopasować operator>>() z klasy Book. A do tego nie można dopuścić. Po to właśnie należy użyć operatora zakresu ::.
Ups. Piszemy cały czas o złym operatorze. Do wyjścia stosuje się operator<<(), a nie operator>>(). Zamień to i powinno być dobrze.
Poza tym aby sprawdzić poprawność operatorów, powinieneś na etapie debugowania używać składni:
( a.operator XX (b) ) lub ( operator XX (a,b) ), zamiast ( a XX b )
Dzięki temu masz pewność co do poprawności argumentów oraz użycia właściwego operatora. Dopiero kiedy kod działa tak jak powinno powinieneś zmienić składnię z funkcyjnej na operatorową, aby zająć się już tylko poprawnością podstawiania operatora przez kompilator.

ps. Tu masz trochę podstaw: http://mst.mimuw.edu.pl/lecture.php?lecture=poc

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Witam :) Może mógłby mi ktoś pomóc - problem ze stosem: mam napisać program w którym na stosie będą przechowywane wskaźniki do zmiennych (a nie same zmienne).
Napisałem już aby przechowywane były zmienne, tylko jak to przerobić żeby przechować tam wskaźniki? (nie jest to trudne, tylko po prostu tego ''nie widzę'' - pomóżcie mi przejrzeć :D)
Fragment kodu:
#define SIZE 4096

Struct Stack {
double tab[SIZE], val;
int idx;
int push(double val);
};

int Stack::push(double val) {
if(idx>SIZE) return -1;
else {
tab[idx++] = val;
return 0;
}
}

PS: Jeśli chodzi o język to możemy przyjąć że piszemy w czystym C z elementami C++ (proszę nie pytajcie dlaczego tak, to nie mój pomysł :))

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 05.04.2011 o 19:48, eNcore napisał:

Witam :) Może mógłby mi ktoś pomóc - problem ze stosem: mam napisać program w którym
na stosie będą przechowywane wskaźniki do zmiennych (a nie same zmienne).

Wszędzie gdzie użyłeś double wpisz zamiast niego typ double* - czyli wskaźnik do double.

Przy wywołaniu wrzutki na stos dajesz: push(&zmienna);
Przy zdejmowaniu ze stosu: double wartość = *pop();
Wszystko.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Język Java.

Załóżmy, że mamy 10 lub więcej dialogów JOptionPane.showMessageDialog. Chcę, żeby program wylosował i wyświetlił jeden z nich.
Co muszę napisać w tym celu?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 13.04.2011 o 17:55, Kardithron napisał:

Załóżmy, że mamy 10 lub więcej dialogów JOptionPane.showMessageDialog. Chcę, żeby program
wylosował i wyświetlił jeden z nich. Co muszę napisać w tym celu?

Najprościej - referencje do tych dialogów wrzucić do dziesięcioelementowej tablicy typu JOptionPane, wylosować indeks o zakresie 0..9 i wywołać dialog. np. tablica[wylosowany].showMessageDialog(...);

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Hm, mógłbym Cię prosić, byś rozpisał mi to na jakimś prostym przykładzie? Niestety, chyba nie do końca zrozumiałem. Przede wszystkim, to nie wiem jeszcze, jak tworzyć tablice w Javie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 14.04.2011 o 19:15, Kardithron napisał:

Hm, mógłbym Cię prosić, byś rozpisał mi to na jakimś prostym przykładzie? Niestety, chyba
nie do końca zrozumiałem. Przede wszystkim, to nie wiem jeszcze, jak tworzyć tablice
w Javie.

Tworzenie referencji tablicy jako zmienna lokalna (referencyjna) z inicjacją tej referencji na null:
JOptionPane[] tablica = null;

Tworzenie referencji tablicy jako pole klasy, które jest domyślnie inicjowane nullem:
private JOptionPanel poleTablicowe;

Utworzenie obiektu dziesięcioelementowej tablicy z przypisaniem zmiennej lub polu:
tablica = new JOptionPane[10];
poleTablicowe = new JOptionPane[10];

Utworzenie zmiennej lub pola od razu z inicjacją nowo utworzoną tablicą:
JOptionPane[] tablica = new JOptionPane[10];
private JOptionPanel poleTablicowe = new JOptionPane[10];

Pamiętaj, że utworzone tablice mają wszystkie elementy typu JOptionPane o wartości null.

Utworzenie Obiektu Swing i przypisanie do jednej z komórek tablicy:
tablica[3] = new JOptionPane(...);
poleTablicowe[3] = new JOptionPane(...);

Wykorzystanie obiektu poprzez tablicę (wyłączenie komponentu):
tablica[3].setVisible(false);
poleTablicowe[3].setVisible(false);

Kilka uwag.
Wszystkie tablice w Javie są normalnymi obiektami. Obiekty te przechowują w kolejnych komórkach albo wartości proste takie jak int, char czy double, albo referencje do obiektów konkretnego typu lub interfejsu - np. JOptionPane, Object, Runnable. Ponieważ tablice są również obiektem, to elementami tych komórek mogą być również referencje do kolejnych tablic, co daje funkcjonalność taką samą jak tablice wielowymiarowe, np.:
JOptionPane[][] szachownicaOpcji = new JOptionPane[10][20];
można to napisać również jako:
(JOptionPane[])[] szachownicaOpcji = new JOptionPane[10][20];
Weź po uwagę, że typem elementu jest tu JOptionPane[], poza tym jest to normalna deklaracja jednowymiarowej tablicy o elementach będących tablicami.

Tablice w Javie działają więc jak dynamiczne tablice wskaźników w C/C++. Jedynym ograniczeniem jest tylko konieczność zadeklarowania maksymalnego rozmiaru podczas tworzenia obiektu za pomocą new (wtedy jest przydzielany konkretny rozmiar tablicy).
Do tej samej zmiennej tablicowej można przypisywać kolejne tablice, np.:
tablica = new JOptionPane[12];
//...
tablica = new JOptionPane[5000];
Referencja do poprzedniej tablicy (JOptionPane[12]) zostanie zgubiona i jeżeli nie zapisano jej (referencji) w żadnej innej zmiennej, to zajmie się nią odśmiecacz, który ją po jakimś czasie samodzielnie usunie z pamięci.

Na tej zasadzie działają różne klasy kolekcji, które w swoich polach trzymają referencje do tablicy, a kiedy trzeba powiększyć rozmiar, to tworzą nową większą tablicę, kopiują do nowej wszystkie stare referencje, a następnie "gubią" referencję do starej tablicy przez przypisanie referencji do nowej tablicy w poprzednie miejsce.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jest tutaj ktoś dobry w naprawianiu błędów w kompilacji. Sobie na spokojnie piszę program, a w kompilacji pokazują się między innymi takie errory:
"error: ''Book'' is not a class or namespace"
"error: number was not declared in this scope"
Wszystkie te zmienne są zdeklarowane w pliku book.h i ten plik jest includowany do book.cpp

I tak ciągle w tym konstruktorze:

"Book::Book(string newauthor,string newtitle,int newyear)
{
number++;
author=newauthor;
title=newtitle;
year=newyear;

std::cout << "Wywolanie konstruktora Book " << std::endl;
}"

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 16.04.2011 o 15:13, Piotrbov napisał:

Jest tutaj ktoś dobry w naprawianiu błędów w kompilacji. Sobie na spokojnie piszę program,
a w kompilacji pokazują się między innymi takie errory:
"error: ''Book'' is not a class or namespace"
"error: number was not declared in this scope"
Wszystkie te zmienne są zdeklarowane w pliku book.h i ten plik jest includowany do book.cpp

I tak ciągle w tym konstruktorze:

"Book::Book(string newauthor,string newtitle,int newyear)
{
number++;
author=newauthor;
title=newtitle;
year=newyear;

std::cout << "Wywolanie konstruktora Book " << std::endl;
}"

Cóż, bez pliku h ciężko coś powiedzieć. W tej chwili tak jak kompilator - nie wiem co to jest Book i co to jest number :) Załącz plik nagłówkowy.
Poza tym piszesz "wszystkie te zmienne". IMO Book to nie zmienna, a klasa. Generalnie coś najprawdopodobniej w pliku h sprawia problemy.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ok trzymaj:

class Book
{
private:
Book();
std::string author;
std::string title;
int year;

public:

static int number;


A dalej to mam tylko deklaracje funkcji i operatorów.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dobra jakoś to sam naprawiłem, lecz teraz mam inny problem. Otóż, jak kompiluje pliki cpp to pojawia mi sie od groma błędów tego typu ( i tylko te błędy ):

ld: fatal: symbol `Book::operator>>(std::basic_istream<char, std::char_traits<char> >&)'' is multiply-defined:
(file /var/tmp//cczrcGPA.o type=FUNC; file /var/tmp//ccLXFn02.o type=FUNC);

O co w tym chodzi?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 17.04.2011 o 14:23, Piotrbov napisał:

Dobra jakoś to sam naprawiłem, lecz teraz mam inny problem. Otóż, jak kompiluje pliki
cpp to pojawia mi sie od groma błędów tego typu ( i tylko te błędy ):

ld: fatal: symbol `Book::operator>>(std::basic_istream<char, std::char_traits<char>
>&)'' is multiply-defined:
(file /var/tmp//cczrcGPA.o type=FUNC; file /var/tmp//ccLXFn02.o type=FUNC);

O co w tym chodzi?

Jesteś pewien, że tylko raz zdefiniowałeś ten operator? Być może na skutek wielokrotnego dołączania tego samego pliku?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 17.04.2011 o 15:16, Vel_Grozny napisał:

Jesteś pewien, że tylko raz zdefiniowałeś ten operator? Być może na skutek wielokrotnego
dołączania tego samego pliku?


Ech... Dobra nie ważne. Zawsze piszę na forum, gdy mam jakiś problem, a później jakoś udaje mi się go naprawić. Bez odbioru ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dzięki wielkie za pomoc.
Wpadł mi do głowy w międzyczasie jeszcze jeden pomysł z wykorzystaniem liczb pseudolosowych.

a=Math.random() *10;

if(a==1) wyświetl komunikat a
if(a==2) wyświetl komunikat b
etc.

Prawidłowy tok rozumowania?

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ć