Forum Linux.pl

Programowanie => C/C++ => Wątek zaczęty przez: w 2005-12-10, 21:03:32

Tytuł: C++ w linuxie
Wiadomość wysłana przez: w 2005-12-10, 21:03:32
w jaki sposob moge zmienic folder w ktorym umieszczone sa zakladki ??
Tytuł: C++ w linuxie
Wiadomość wysłana przez: w 2006-02-05, 19:56:49
2005-12-10 21:03:32 spony napisał:

> w jaki sposob moge zmienic folder w ktorym umieszczone sa zakladki ??
Moglbys jasniej ?
Tytuł: C++ w linuxie
Wiadomość wysłana przez: Maciej Rutecki w 2006-02-06, 10:44:20
2005-12-10 21:03:32 spony napisał:

> w jaki sposob moge zmienic folder w ktorym umieszczone sa zakladki ??

Zakładki są umiesznane w pliku

~/.mozilla/firefox/xxxx/bookmarks.html

--
Maciek
Tytuł: C++ w linuxie
Wiadomość wysłana przez: w 2005-12-09, 21:33:00
Z góry mówie, że szukałem i wiem co to sa google.

Prubuje skompilowac najprostrzy program za pomoca gcc.
Program wyglada tak:

#include  
main()  
{    
cout << 'costam';
}  

Mam go w katalogu pod nazwa hello.cpp. Kompiluje go poleceniem gcc hello.cpp i to co otrzymuje:

In file included from /usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c ++/4.0.1/backward/iostream.h:31,
                 from hello.cpp:1:
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/backward/back ward_warning.h:32:2: warning: #warning This file includes at least one deprecate d or antiquated header. Please consider using one of the 32 headers found in sec tion 17.4.1.2 of the C++ standard. Examples include substituting the header for the header for C++ includes, or instead of the deprecated h eader . To disable this warning use -Wno-deprecated.
/tmp/cc8Go2A6.o(.text+0x25): In function `main':
hello.cpp: undefined reference to `std::cout'
/tmp/cc8Go2A6.o(.text+0x2a):hello.cpp: undefined reference to `std::basic_ostrea m >& std::operator<< >(std: :basic_ostream >&, char const*)'
/tmp/cc8Go2A6.o(.text+0x47): In function `__tcf_0':
hello.cpp: undefined reference to `std::ios_base::Init::~Init()'
/tmp/cc8Go2A6.o(.text+0x74): In function `__static_initialization_and_destructio n_0(int, int)':
hello.cpp: undefined reference to `std::ios_base::Init::Init()'
/tmp/cc8Go2A6.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

Prosze o wytlumaczenie lopatologiczne co robie zle i jak powinno wygladac poprawne kompilowanie pod linuxem.
Tytuł: C++ w linuxie
Wiadomość wysłana przez: Mariusz Chilmon w 2005-12-09, 21:59:28
> Prosze o wytlumaczenie lopatologiczne co robie zle i jak powinno wygladac poprawne kompilowanie
 > pod linuxem.

Och... Zacznijmy od tego, że był sobie kiedyś C, ale ludziom zachciało się programowania obiektowego i powstał C++. Oczywiście C++ nie powstał w jednej chwili z chaosu, ale rodził się z C. Jak nietrudno się domyślić, dzisiaj nie mamy jednego C++ właśnie ze względu na zbyt długi proces jego powstawania. Ja wyróżniam dwa rodzaje C++:

- borlandowski (C++ be...)
- normalny (C++ OK)

Tak na serio: ten pierwszy właśnie zastosowałeś. Ma on pewne charakterystyczne naleciałości z C (jak dodawanie rozszerzenia .h dla nagłówków z biblioteki standardowej) i jest używany przez Borlanda. My jednak korzystamy z gcc, a to oznacza, że obowiązuje nas nowszy (żeby nie powiedzieć, że zwyczajnie "aktualny") standard.

Często będziesz napotykał na programy zaczynające się od:

#include

Możesz się po nich spodziewać przykrości, zwłaszcza jeżeli występuje w nich:

#include

(Borlandowska biblioteka I/O, o której lepiej zapomnieć pod Linuksem)

Czasem jednak (i tu jest ten szczęśliwy przypadek) przerobienie "starego" C++ na "nowy" jest banalne:

#include
using namespace std;

int main()
  {
    cout << "coś tam";
  }

Oto więc łopatologiczne zasady:

1. Nagłówki z biblioteki standardowej C++ nie mają rozszerzeń (właśnie dla odróżnienia od starego C++), a więc nie . (Uwaga: jeżeli korzystamy z bibliotek C, to zachowują one stare nazewnictwo z rozszerzeniem .h).

2. Biblioteki te pracują w przestrzeni nazw std, stąd polecenie "using namespace std;"

3. Funkcja główna musi być typu int, ale nie musi jawnie zwracać wartości (tu domyślnie program zachowuje się, jakby na końcu było return (0);).

4. Literały łańcuchowe, w przeciwieństwie do pojedynczych znaków ujmujemy w cudzysłów: "coś tam".

5. Jeżeli masz źródło w hello.cpp, to najlepiej kompilować je w ten sposób:

g++ -o hello hello.cpp

Otrzymasz dzięki temu program, który można uruchomić poleceniem:

./hello

6. Polecam "C++ Leksykon kieszonkowy" z Heliona. Za 9,90PLN będziesz miał podręczny opis języka. Warto też wyposażyć się w analogiczną książeczkę nt. języka C - znajduje się tam trochę informacji, których nie ma w pozycji o C++.
Tytuł: C++ w linuxie
Wiadomość wysłana przez: w 2005-12-09, 22:00:02
1. Jak sam piszesz, jest to program w C++ (temat postu = "C++ w linuksie"), więc polecam kompilację komendą do C++, a nie C. Czyli:

g++ plik.cpp


2. Zgodnie ze standardem C++ obiekt cout znajduje się teraz w przestrzeni nazw std, więć trzeba pisać std::cout (lub skorzystać z: using namespace std;)


3. Stałe napisowe umieszcza się w cudzysłowach, a nie apostrofach (stałe znakowe!), a więc poprawnie będzie albo:

std::cout << "costam";

albo

std::cout << 'c';


4. Czy to jest C++ w Linuksie, czy gdzie indziej, to akurat nie ma znaczenia.
Tytuł: C++ w linuxie
Wiadomość wysłana przez: w 2005-12-11, 01:00:35
Dzieki za pomoc. Jakies normane forum bo na innych to sa tylko 3 warianty:
-zjebka
-olewka
-google
Tytuł: C++ w linuxie
Wiadomość wysłana przez: Konrad Zapałowicz w 2005-12-11, 01:17:43
> - borlandowski (C++ be...)
> - normalny (C++ OK)

Nie ma czegoś takiego - jest jeden C++ definiowany przes standard ISO.

 > Tak na serio: ten pierwszy właśnie zastosowałeś. Ma on pewne charakterystyczne naleciałości z C
 > (jak dodawanie rozszerzenia .h dla nagłówków z biblioteki standardowej) i jest używany przez
 > Borlanda.

Nieprawda - pliki nagłowkowe .h nadal znajdują się w systemie z powodów zgodności z C. Nie są one typowo 'Borlandowskie' i gdyby nie błędy w kodzie to program by się skompilował.


 > #include
 > using namespace std;
 >
 > int main()
 >   {
 >     cout << "coś tam";
 >   }

Powinno być

#include
using namespace std;
 
int main()
{
cout << "coś tam";
return 0;
}

Program po wykonaniu musi zwrócić do systemu jakąś wartość.

> 3. Funkcja główna musi być typu int, ale nie musi jawnie zwracać wartości (tu domyślnie program
> zachowuje się, jakby na końcu było return (0);).

Bzdura.

Tytuł: C++ w linuxie
Wiadomość wysłana przez: Piotr Chmura w 2005-12-11, 01:33:03
2005-12-11 01:00:35 Mefistofeles napisał:

> Dzieki za pomoc. Jakies normane forum bo na innych to sa tylko 3 warianty:
 > -zjebka
 > -olewka
 > -google

to zalezy jedynie od tego, w jaki sposob zada sie pytanie... tobie sie akurat tym razem udalo ;-)
Tytuł: C++ w linuxie
Wiadomość wysłana przez: Mariusz Chilmon w 2005-12-11, 12:14:56
2005-12-11 01:17:43 bergo napisał:

> > - borlandowski (C++ be...)
 > > - normalny (C++ OK)
 >
 > Nie ma czegoś takiego - jest jeden C++ definiowany przes standard ISO.

1. Napisałem, że to moje osobiste rozróżnienie.

2. Są różnice między jednym a drugim, więc mam prawo je oddzielać. Nie twierdzę, że są to różne języki, ale różne implementacje.

3. Standard określa, że biblioteki standardowe są bez rozszerzenia, a w Borlandzie (przynajmniej tym dosowym, którego używamy na uczelni) takich bibliotek nie ma, bo przed standaryzacją obowiązywały zasady z C. I jak tu nie mówić o różnych wersjach tego samego języka?

4. Cytat z "http://www.intercon.pl/~sektor/cbx/basics/intro.html":

"Zatrzegam też od razu, że język o którym piszę jest zgodny ze standardem ANSI C++ oraz ISO C++. Przede wszystkim oznacza to, że na nic się nie zdadzą kompilatory, które nie są zgodne z ANSI C++ (m.in. jeden z nadal popularnych Borland C++ 3.1). Od tamtego czasu C++ przeszedł sporo zmian i wiele rzeczy zostało wycofanych, przez co programy zgodne ze standardem nie będą w nich prawidłowe, ani też programy prawidłowe w tych kompilatorach nie będą zgodne ze standardem."

 >  > Tak na serio: ten pierwszy właśnie zastosowałeś. Ma on pewne charakterystyczne
 > naleciałości z C
 >  > (jak dodawanie rozszerzenia .h dla nagłówków z biblioteki standardowej) i jest używany
 > przez
 >  > Borlanda.
 >
 > Nieprawda - pliki nagłowkowe .h nadal znajdują się w systemie z powodów zgodności z C. Nie są
 > one typowo 'Borlandowskie' i gdyby nie błędy w kodzie to program by się skompilował.

Z powodów zgodności z C, istnieją odpowiedniki bibliotek tego języka bez rozszerzenia .h, za to z przedrostkiem c (np. cstdlib zamiast stdlib.h). IMHO pliki nagłówkowe z rozszerzeniem .h znajdują się w systemie z powodów zgodności ze "starym" C++ (nie wiem jak Ty to określasz, skoro uważasz, że jest tylko ISO C++).

 >  > #include
 >  > using namespace std;
 >  >
 >  > int main()
 >  >   {
 >  >     cout << "coś tam";
 >  >   }
 >
 > Powinno być
 >
 > #include
 > using namespace std;
 >  
 > int main()
 > {
 > cout << "coś tam";
 > return 0;
 > }
 >
 > Program po wykonaniu musi zwrócić do systemu jakąś wartość.
>
 > > 3. Funkcja główna musi być typu int, ale nie musi jawnie zwracać wartości (tu domyślnie
 > program
 > > zachowuje się, jakby na końcu było return (0);).
 >
 > Bzdura.

By-zy-dy-u-r-a, jeżeli chodzi o to, że main nie musi być typu int (bo musi), co potwierdzają poniższe cytaty. Inaczej rzecz ma się w kwestii domyślnego zwracania wartości 0. Zwłaszcza ostatni cytat wzbudził moje wątpliwość. (dzięki za zwrócenie uwagi - zmotywowałeś mnie do zainteresowania się tą kwestią)

1. Cytaty ze wspomnianego przeze mnie leksykonu kieszonkowego:

"Typem zwracanym funkcji main jest int."

"Jeśli w treści funkcji main nie występuje instrukcja return, po wykonaniu wszystkich instrukcji funkcji main zwrócona zostaje niejawnie wartość 0."

2. Cytat z czasopisma "Komputer Świat Ekspert" (2/2004, s. 47), odnośnie kodu:

int main()
{
}

"Zaprezentowany kod jest w pełni poprawnym programem w C++, zgodnym ze standardem ISO C++ (jak również standardem C99). Standard ten mówi bowiem, że jeśli w funkcji głównej main nie ma instrukcji return, do systemu zwracana jest wartość 0 (czyli kod zachowuje się tak, jakby instrukcja istniała).

Jeszcze większym błędem jest stwierdzenie, że jeśli funkcja main nie zawiera instrukcji return, to powinna mieć postać

void main()
{
}

lub też, że może zwracać inny typ wyniku niż int (na przykład float, short, double). Podkreślmy więc z całą stanowczością, że w żadnym wypadku tak być nie może. Jeśli to ma być program w C++, zgodny ze standardami C++, funkcja main musi zwracać wartość int. Wyraźnie podkreśla to sam twórca języka Bjarne Stroustup."

Dalej jest mowa o różnych zachowaniach kompilatorów, niezgodnych ze standardem. Co ciekawe Redakcja korzysta z kompilatora Borland C++ Compiler! Cofam więc stwierdzenie, że Borland jest be. Borland jest be, jeżeli chodzi o jego starą wersję DOS-ową, z której zmuszony jestem korzystać na uczelni.

3. Cytat z C++ FAQ Lite (http://klub.chip.pl/b.krzemien/c++-faq-pl/newbie.html#faq-28.3):

"[28.3] Should I use void main() or int main()?

[Recently created (in 9/02). (...)]

int main()

main() must return int. Not void, not bool, not float. int. Just int, nothing but int, only int.

Some compilers accept void main(), but that is non-standard and shouldn't be used. Instead use int main().

 void main()  // <— BAD; DO NOT DO THIS
 {
   // ...
 }

 int main()  // <— GOOD
 {
   // ...
 }

 int main(char** argv, int argc)  // <— GOOD
 {
   // ...
 }

As to the specific return value, if you don't know what else to return just say return 0; "

(Łopatologiczne do granic możliwości. :-)

Podsumowanie: Cofam stwierdzenie, sugerujące jakoby wszystkie produkty Borlanda wspierały C++ niezgodny ze standardami, a kwestię domyślnego return 0 pozostawiam nierozsztrzygniętą. Resztę moich stwierdzeń udowodniłem, na miarę swoich możliwości.