Zaloguj się, aby obserwować  
Bartuc

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

1979 postów w tym temacie

Dnia 24.05.2008 o 10:13, Olamagato napisał:

/.../


Dziękuje za informacje ;) Rozumiem że Flash jest skryptowy? Lub ew. niskopoziomowy? Przyznam że zacząłem się go uczyć, między innymi po tym: | http://duelmail.thewitcher.com/ | - strona zrobiona jest ponoć w całości we Flashu, więc skoro daje on takie możliwości to chyba warto się go nauczyć. Jeśli chodzi o jakiś język wysokopoziomowy, to chyba wybiorę Jave (ale to na razie tylko plany ;p). Czytałem że książka "Thinking in Java" jest bestsellerem wśród podręczników do nauki programowania, i można się dzięki niej sporo o Javie nauczyć. Widziałem tą księgę [wygląda jak rozbudowana biblia zaangażowanego księdza] i dlatego na razie to plany ;) Może ją czytałeś? Albo ktokolwiek tuta ją czytał? Warto? Bo z samych opinii wynika że tak :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bruce Eckel pisze bardzo dobre książki.
Thinking in Java (podobnie jak inne jego tytuły) jest dostępna za darmo do pobrania z jego strony: http://www.mindview.net/Books/TIJ/ - jeśli przeraża cię wizja tego, że ta wersja książki jest po angielsku, to sugeruję rozpocząć natychmiastową naukę tego języka. bez jego znajomości możesz nawet nie myśleć o tej pracy.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

>/.../
- Jezeli chodzi o Jave , to ja moge polecic ksiazki Cornella i Hortsmanna "Java 2 Podstawy" , oraz "Java 2 Techniki zaawansowane", wedlug mnie nadaje sie zarowno dla poczatkujacych jak i tych znajacych juz inne jezyki programowania. Co prawda opisuje Jave w wersji bodajze 1.3 , ale to nie powinien byc wedlug mnie spory problem, bo mozna nauczyc sie z tych ksiazek solidnych podstaw, a z mozliwosciami 1.5, 1.6 zapoznac sie korzystajac z internetu lub innych drukowanych publikacji, ktore skupiaja sie wlasnie tylko na prezentacji nowych mozliwosci a nie na nauce jezyka.
Mi wymienione wyzej ksiazki przypasowaly bardziej niz Thinking in Java , no ale to tylko moja opinia :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.05.2008 o 13:07, penny napisał:

/.../


Za darmo, no popatrz tylko ;p Nie wiem jak poradzę sobie z innym nazewnictwem - po polsku pętla, po angielsku loop/noose a to tylko jedne - dość łatwe - wyrażenie... Ale spróbować warto, bardzo Ci dziękuję za link :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.05.2008 o 12:59, Baneb14de napisał:

Dziękuje za informacje ;) Rozumiem że Flash jest skryptowy? Lub ew. niskopoziomowy?

Raczej silnie wysokopoziomowy. Możliwości masz dość duże przy małej ilości pisania. Ale jesteś też dość mocno ograniczony udostępnionym zestawem narzędzi. Tzn. Nie zrobisz wielu rzeczy, które wymyślisz, natomiast zrobisz szybko rzeczy, które przewidziano w Macromedia (teraz w Adobe).

Dnia 24.05.2008 o 12:59, Baneb14de napisał:

http://duelmail.thewitcher.com/ - strona zrobiona jest ponoć w całości we Flashu

Tak, ale cóż w niej jest takiego niezwykłego? To zwykła winietka bez żadnej niebanalnej funkcjonalności.

Dnia 24.05.2008 o 12:59, Baneb14de napisał:

Czytałem że książka "Thinking in Java" jest bestsellerem wśród podręczników do nauki programowania, i można się dzięki niej sporo o Javie nauczyć.

Tak, całkiem sporo.

Dnia 24.05.2008 o 12:59, Baneb14de napisał:

Widziałem tą księgę [wygląda jak rozbudowana biblia zaangażowanego księdza]

Wydanie dwa było całkiem małe. Zaledwie 700 stron w wydaniu drugim. To jak na niemal pełne kompendium wiedzy o języku dość niewiele. Wydanie 4 (tylko w księgarniach) jest trochę większe bo ma 1200 stron. Zapewniam Cię jednak po przeczytaniu pi razy oko ze 40 tys. stron w różnych książkach, że akurat w tym wypadku warto. Szczególnie jeżeli nie zna się zbyt dobrze angielskiego. Dla programistów innych języków, znających angielski może wystarczyć tutorial JDK na stronie Suna. To też jest dobry zbiór do nauczenia się Javy w stopniu podstawowym, ale niestety nie uczy on programowania jako takiego. A książka Eckela jednak to robi.
Nie chcę Cię straszyć, ale jak już ktoś chce się nauczyć programowania, to zapewne te kilka tysięcy stron w różnych książkach będzie musiał przeczytać.

Dnia 24.05.2008 o 12:59, Baneb14de napisał:

Może ją czytałeś?

Oczywiście. Jest też w niej chyba kilkaset zadań. Jeżeli zrobiłbyś wszystkie to spokojnie możesz startować do certyfikatu Suna na pierwszy stopień bo są tam też zadania na poziomie prac semestralnych.
W każdym razie po polsku nic lepszego raczej nie dostaniesz. Niektóre inne pozycje dorównują, ale ostatnio sam nie mam czasu, żeby czytać wszystko co mi wleci w ręce, więc tak za bardzo nie wiem które.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.05.2008 o 13:12, LifaR napisał:

Co prawda opisuje Jave w wersji bodajze 1.3 , ale to nie powinien byc wedlug mnie spory problem

W sumie też nie taki mały. Między Javą 1.3, a 1.6 jest już ogromna różnica. Że pobieżnie podam tylko - typy generyczne, niesamowicie potężne wyliczenia, uogólniona obsługa wielowątkowości do Swinga, adnotacje, bardzo poprawiona budowa bibliotek standardowych, dodana obsługa wyrażeń regularnych, dodane typy atomowe i JNI.
Jest tego na tyle dużo, że że kod programu może wyglądać zupełnie inaczej i ten z wersji 1.6 będzie krótszy, przejrzystszy, ale w większości niezrozumiały dla kogoś, kto dojechał do 1.3.

Dnia 24.05.2008 o 13:12, LifaR napisał:

bo mozna nauczyc sie z tych ksiazek solidnych podstaw, a z mozliwosciami 1.5, 1.6 zapoznac sie korzystajac z internetu

W sumie masz rację, ale ostatnie 2 wersje Javy bardzo dużo rzeczy oznaczyło jako przestarzałe. A co ciekawe za poprawianiem choćby tylko przykładów z tutoriala nawet Sun nie nadąża bo 90% z nich trzeba kompilować z opcjami akceptowania archaizmów.
Na przykład znalazłem tylko 1 przykład, w którym użyto tylko nowych elementów języka i wyrzucono wszystkie przestarzałe. Reszta to jakieś miksy, albo zupełne starocie. :]
Dla odmiany 4. wydanie Thinking in Java w pełni opisuje wersję 1.5 i niektóre elementy 1.6, które były w wersji beta.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 25.05.2008 o 06:22, Olamagato napisał:

/.../


Czy ty nie jesteś czasem informatykiem/programistą? ;) Trzeba przyznać że twoja wiedza jest imponująca ;p

Udostępnij ten post


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

Zarówno ANSI C i C++ umożliwia na przykład coś takiego:
void obrabiaj()
{
cout << "podaj rozmiar tablicy\n";
unsigned rozmiar = 0;
cin >> rozmiar;
int tablica[rozmiar][200];
wprowadz_dane(tablica);
wyswietl_dane(tablica);
transakcje (tablica);
przeslij_dane(tablica);
}


LOL Jesteś mistrzem w te klocki xD Tylko co robi unsigned rozmiar = 0 ? To jest deklaracja obiektu rozmiar?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Sory za podwójnego posta ale poprzedniego już nie mogłem zmodyfikować.

Napisałeś:

void obrabiaj()
{
cout << "podaj rozmiar tablicy\n";
unsigned rozmiar = 0;
cin >> rozmiar;
int tablica[rozmiar][200];
wprowadz_dane(tablica);
wyswietl_dane(tablica);
transakcje (tablica);
przeslij_dane(tablica);
}

Ja sobie przerobiłem na:

void lol()
{
cout << "Podaj wysokosc macierzy: ";
unsigned wys = 0;
cin >> wys;

cout<<endl;

cout << "Podaj szerokosc macierzy: ";
unsigned sze = 0;
cin >> sze;

int macierz[wys][sze];

pokazanie(macierz,wys,sze); <----------------------
}

<-------------------- I w tym problem. Jeżeli chciałbym pokazać macierz w formie tabelki w konsoli muszę przesłać do niej też zmienne wys i sze. Jak mam zadeklarować funkcje do której będą wysyłane tablica (macierz), jej wysokość (wys) i szerokość (sze)? Próbowałem tak:

void pokazanie(int macierz[][], unsigned int wys, unsigned int sze)

ale to nie działa. Co mam zrobić?

Zawsze pokazanie macierzy robie w ten sposób:

void pokazanieakt()
{
for(int i=0;i<w;i++)
{
for(int j=0;j<k;j++)
cout<< setw(4) << macierz[ i ][ j ] << " ";
cout<<endl;
}
}

Gdzie macierz jest zadeklarowana jako obiekt globalny.

Udostępnij ten post


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

<-------------------- I w tym problem. Jeżeli chciałbym pokazać macierz w formie tabelki
w konsoli muszę przesłać do niej też zmienne wys i sze. Jak mam zadeklarować funkcje
do której będą wysyłane tablica (macierz), jej wysokość (wys) i szerokość (sze)? Próbowałem
tak:

void pokazanie(int macierz[][], unsigned int wys, unsigned int sze)

ale to nie działa. Co mam zrobić?


Skoro macierz (konkretnie tablica dwuwymiarowa) to tablica tablic, a tablicę jednowymiarową ja zazwyczaj przesyłam jako wskaźnik to może zadziała deklaracja przesłania wskaźnika na wskaźnik:
void pokazanie(int **macierz, unsigned int wys, unsigned int sze)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 25.05.2008 o 15:37, Baneb14de napisał:

Czy ty nie jesteś czasem informatykiem/programistą? ;) Trzeba przyznać że twoja wiedza jest imponująca ;p

Wbrew temu co Ci się wydaje ta wiedza, to absolutne przedszkole. :)
Naprawdę.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 25.05.2008 o 18:45, Eldven napisał:

Tylko co robi unsigned rozmiar = 0 ?
To jest deklaracja obiektu rozmiar?

To jest definicja zmiennej z przypisaniem jej początkowej wartości zero. Jako rozmiar jest on nieprawidłowy i właśnie o to chodzi. Jeżeli napiszesz tylko delarację
unsigned rozmiar; to taka zmienna będzie automatyczna lub rejestrowa i do pierwszego przypisania ma wartość nieokreśloną. Użycie niezainicjowanej zmiennej to jeden z najczęstszych błędów.

Jeżeli operacja cin >>rozmiar; nie powiedzie się (na przykład nie uda się wczytać liczby), to zmiennej nie jest przypisywana żadna wartość, a więc przed utworzeniem tablicy możesz za pomocą if lub jako warunek w pętli sprawdzać czy rozmiar ma wartość większą od zera bo jest to najłatwiejsze potwierdzenie, że udało się wczytać jakiś rozmiar.
na przykład tak instrukcja złożona:
do { puts "Podaj rozmiar: "; cin >> rozmiar; } while(rozmiar > 0);
wyświetla zapytanie i oczekuje na wprowadzenie rozmiaru aż nie wczyta poprawnej wartości.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 25.05.2008 o 20:39, Olamagato napisał:

Wbrew temu co Ci się wydaje ta wiedza, to absolutne przedszkole. :)
Naprawdę.


Więc rozumiem że nie jesteś informatykiem? ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

>/.../
-> Hmm, po tym jak przeczytalem o typach generycznych, wielowatkowosci, cos mi w glowie zaswitalo, ze wprowadzilem kolege w blad. Ksiazki ktore opisalem, skupiaja sie na wersji 1.5 a nie 1.3. Niepotrzebnie zasugerowalem sie informacja na stronie ksiegarni, na ktorej wyszukalem dokladny tytul publikacji, takze swobodnie mozna uczyc sie i z nich :)
[zawieraja tez przydatne informacje, ktore czesci rozdzialow moze pominac osoba zapoznana z C/C++, ale kolegi akurat to nie dotyczy chyba :) ]
Jesli chodzi o rozmiary, to pierwszy tom ma ponad 700 stron, a drugi ponad 1100, kody przykladowych programow na plycie to tez spora pomoc. No ale koncze z reklama, bo jeszcze ktos pomysli, ze mi za to placa ;)

Udostępnij ten post


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

cin >> wys;
cout<<endl;
cout << "Podaj szerokosc macierzy: ";

W tym miejscu niepotrzebnie dodajesz środkową instrukcję opróżniania bufora wierszowego. Strumienie cout i cin są ze sobą "sparowane". Oznacza to, że operacja wczytywania i wysyłania automatycznie powoduje wyczyszczenie bufora wejściowego lub wyjściowego tak aby zachować relację kolejności. Jest to zapisane jako przenośna zasada, więc jest to obecnie niepotrzebna asekuracja. Część starszych nauczycieli uczyło się starszej wersji C++, w którym ta zasada nie obowiązywała, więc uczą, żeby zawsze wyrzucać bufor wyjściowy przez wczytywaniem. Chociaż nie jest to jakaś wada.

Dnia 25.05.2008 o 19:18, Eldven napisał:

int macierz[wys][sze];
pokazanie(macierz,wys,sze); <----------------------
<-------------------- I w tym problem. Jeżeli chciałbym pokazać macierz w formie tabelki
w konsoli muszę przesłać do niej też zmienne wys i sze.

Zgadza się. ponieważ C++ przetwarza argumenty tylko przez wartość, a nie przez referencję teoretycznie powinno udać się przesłać całą tablicę - ALE... dotyczy to tylko zmiennych prostych oraz struktur i unii (i to tylko w ANSI C/C++). Nazwa tablicy zawsze reprezentuje wskaźnik do pierwszego jej elementu. Trzeba to pamiętać i powtarzać sobie jak mantrę.
Nie jest możliwe przesłanie tablicy inaczej jak przez wskaźnik/referencję, a typ tablicowy użyty jako typ parametru też obowiązuje ta sama zasada, czyli jest on zamieniany na wskaźnik.
Sposoby są następujące:
1. Przez niejawny wskaźnik (NIE DZIAŁA NA ZMIENNYCH ROZMIARACH)
Deklaracja: void pokazanie(int (*wsk_el_macierzy)[MAXY], unsigned wys, unsigned szer);
Wywołanie: pokazanie(macierz, wys, szer);
Uzycie w funkcji: macierz[x][y]

2. Przez jawny wskaźnik do całej tablicy (NIE DZIAŁA NA ZMIENNYCH ROZMIARACH)
Deklaracja: void pokazanie(int (*wsk_macierzy)[MAXX][MAXY], unsigned wys, unsigned szer);
Wywołanie: pokazanie(&macierz, wys, szer);
Użycie w funkcji: (*macierz)[x][y]

3. Przez referencję (NIE DZIAŁA NA ZMIENNYCH ROZMIARACH)
Deklaracja void pokazanie(int (&macierz)[MAXX][MAXY], unsigned wys, unsigned szer);
Wywołanie: pokazanie(macierz, wys, szer);
Użycie w funkcji: macierz[x][y]

4. Przez zamianę na wskaźniki
Deklaracja void pokazanie (int **macierz, unsigned wys, unsigned szer);
Wywołanie: pokazanie(macierz, wys, szer);
Użycie w funkcji: macierz[x][y], albo *(macierz+x)[y], albo *(*(macierz+x)+y)
Zwróć w tym wypadku uwagę na przemienność dodawania. Działa więc również: x[macierz][y] i inne bardziej karkołomne odmiany. :)

Problem ze zmiennymi rozmiarami jest taki, że typ tablica[5] jest zupełnie innym typem niż tablica[6], więc nie można ich miksować. W deklaracji typu C i C++ oczekują wyrażenia stałego, czyli możliwego do obliczenia w czasie kompilacji programu - czyli dowolnie skomplikowanego wyrażenia pod warunkiem, że wszystkie jego składniki są stałymi (można takie wyrażenie zwinąć do konkretnej liczby przed wykonaniem programu).
I jak widać najwięcej możliwości, ale też największą szansę pomyłki ma ostatnia wersja.

Dnia 25.05.2008 o 19:18, Eldven napisał:

Zawsze pokazanie macierzy robie w ten sposób:

/*...*/

Dnia 25.05.2008 o 19:18, Eldven napisał:

cout<< setw(4) << macierz[ i ][ j ] << " ";

W tym miejscu przy wersji wskaźnikowej również piszesz tak samo. Spróbuj zapamiętać, że
wyrażenie t[x] <=> *(t+x) <=> *(x+t) <=> x[t].
A dla wersji dwuwymiarowych:
t[x][y] <=> (t[x])[y] <=> *(t[x]+y) <=> *(*(t+x)+y) <=> *(x[t]+y) <=> *(y+x[t]) <=> y[x[t]]
Szczególnie dziwnie to wygląda w tej ostatniej wersji, ale jest to konsekwencja arytmetyki na wskaźnikach. Każdy z tych zapisów jest równoważny i działa identycznie dając dostęp do pojedynczego elementu takiej tablicy "dwuwymiarowej".

Właśnie z powodu tego, że do funkcji trzeba przekazywać jednocześnie 3 argumenty, zamiast pojedynczej tablicy ujmowano to w strukturę:
struct tablica2d
{
int **t;
unsigned szer;
unsigned wys;
}
Wtedy taką strukturę można już przekazywać do funkcji tak samo jak zmienną prostą czyli przez wartość. Jednak to nie wiele zmienia ponieważ nie powoduje to kopiowania obszaru na który wskazuje pole tablica2d.t. Jeżeli nie można operować na oryginalnej tablicy, to kopiuje się ją przez skopiowanie struktury oraz samego obszaru tablicy poleceniami, np.
struct tablica2d nowa = macierz;
nowa.t = calloc(sizeof(int[szer][wys])); //nie wolno użyć "sizeof macierz.t" bo przydzieli obszar o wielkości zmiennej wskaźnikowej czyli zwykle 4 bajty.
memcpy( nowa.t, macierz.t, sizeof(int[szer][wys]) );

Dopiero po takiej operacji można używać tablicy "nowa".
Z powodów rozwlekłości takiego zapisu tego typu operacje stały się pierwszymi celami programowania obiektowego, a struktury takie jak tablica2d zamieniono na obiekty, natomiast kopiowaniem obszarów zajęły się definiowane konstruktory kopiujące. Definiowalne operatory pozwalały nadal używać operatora [] w celu dostępu do elementów, więc dopiero obiekty pozwoliły na łatwe posługiwanie się tablicami o zmiennych rozmiarach.

Warto sprawdzić czy na Twoim kompilatorze działa w środku kodu instrukcja:
typedef int tablica2d[x][y];
gdzie x i y nie są stałe. I ewentualnie jaki błąd wyrzuca. Gdyby to działało, to można się pokusić o sprawdzenie możliwości użycia typu tablica2d jako typ argumentu funkcji - ale to raczej nie zadziała (chyba, że coraz nowsze definicje języka poszły dalej niż myślę...)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 25.05.2008 o 20:48, Baneb14de napisał:

Więc rozumiem że nie jesteś informatykiem? ;)

Jestem, ale ta wiedza, którą mam - ma każdy w tej branży.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam taki program:

#include<iostream>
#include<fcntl.h>
#include<sys/wa it.h>
#include<unistd.h>
using namespace std;

int desk2[2];
int desk1[2];
const size_t SIZE(200);
char buf[SIZE+1];
int bytes;

void pm(const char* filename)
{
cout<<"Początek procesu macierzystego"<<endl;
close(desk2[0]);
close(desk1[1]);
write(desk2[1]),filename,SIZE);
while(bytes=read(desk1[0],buf,SIZE)){
buf[bytes]=''\0'';
cout<<buf;
}
wait(0);
cout<<"Koniec procesu macierzystego"<<endl;
}

void pp()
{
cout<<"Początek procesu potomnego"<<endl;
close(desk1[0]);
close(desk2[1]);
read(desk2[0],buf,SIZE);
int infile=open(buf,O_RDONLY);
if (infile==-1)
{
write(desk1[1],"Bledne otwarcie pliku\n",22);
}

else
{
while(bytes=read(infile,buf,SIZE)){
write(desk1[1],buf,bytes);
}
}

cout<<"Koniec procesu potomnego"<<endl;

}

int main(int argc,char **argv)
{
if(argc!=2){
cout<<"Przekazywany parametr:nazwa_pliku"<<endl;
exit(1);
}

if(pipe(desk2)==-1 || pipe(desk1)==-1)
{
cout<<"Bledne otwarcie deskryptorow"<<endl;
exit(2);
}
if(fork())
pm(argv[1]);
else
pp();

}


po kompilacji wywala mi taki błąd:

/usr/include/unistd.h: In function `void pm(const char*),:
/usr/include/unistd.h:333: błąd: too few arguments to function `ssize_t write(int, const void*, size_t),
otis.cpp:18: błąd: at this point in file
otis.cpp:18: błąd: expected `;'' before `), token



Pomoże ktoś ?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 25.05.2008 o 15:37, Baneb14de napisał:

> /.../

nawet się nie zorientujesz kiedy to ci samo do głowy zacznie wchodzić :D nastaw się na to, że jest to zawód w którym, ze względu na ciągły rozwój technologii, w zasadzie cały czas nadrabia się zaległości ;)

Udostępnij ten post


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

Jestem, ale ta wiedza, którą mam - ma każdy w tej branży.


I programujesz na zamówienie tak jak to było powyżej, czy zajmujesz się czymś innym? ;]

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ć