Indeksowanie tablic i nadpisywanie zmiennych.

0

Pewnie znowu jakiś głupi bład robię. Więc pytam się jaki?

char LiczbaEl;
int Tablica[9]; /* skoro indeksowanie jest od 0 to mam 10 elementów */

LiczbaEl = 10; /* przy 9 jest OK. Przy 10 nadpisuje mi LiczbaEl */
for (int i=0;i

0

Pewnie znowu jakiś głupi bład robię. Więc pytam się jaki?

char LiczbaEl;
int Tablica[9]; /* skoro indeksowanie jest od 0 to mam 10 elementów */

Właśnie nieprawda bo Tablica będzie o 0 do [b]8[/b] !! I będzie mieć 9 elementów.

[dopisek]
Czemu LiczbaEl jest charem ?

0

Deklaracja: int Tablica[9]; to deklaracja tablicy 9-elementowej indexowanej w zakresie 0-8 :)

0

Deklaracja: int Tablica[9]; to deklaracja tablicy 9-elementowej indexowanej w zakresie 0-8 :)

Ale jazda. Deklaracja tak, a indeksowanie tak :( Już mnie łeb boli od tego. Dzięki.

0

po prostu w c/c++ gdy robisz tablice podajesz ile elementów ci jest potrzebnych. Kompilator stworzy tablice o rozmiarze n+1 tak wiec jezeli stworzysz tablice np: int[10] masz w niej 10 elementów (0..9) plus jeden w którym nic nie mozna zapisywac.

0

Jest jakis dodatkowy element, w ktorym nie mozna nic zapisywac ??

0

nie ma dodatkowego elementu po którym nie można pisac , przykładem tego są wartownicy , tak mi sie przynajmniej wydaje

0

Nie wiem czy to dobrze nazwałem ale chodziło mi o zmienną na samym końcu tablicy w której jest chyba zapisany znak konca tablicy (?)..

0

A czemu sie tak dzieje? i gdzie sa zapisywane dane?
(testowalem w BCB)

Jest sobie funkcja (nie ma ona sensu ale... jest)

int Funkcja()
{
int Tab[5];

Tab[10] = 20; // jedenasty element? przeciez jest 5

return Tab[10];
}

No i funkcja zwruci wartosc... 20. Tylko gdzie ta wartosc zostala zapisana skoro tablica ma 5 elementow ???

0

No i funkcja zwruci wartosc... 20. Tylko gdzie ta wartosc zostala zapisana skoro tablica ma 5 elementow ???

Gdzieś w pamięci w 10 słowie po Tab[0] (a może 9. Już się plączę).
Tablica jest w rzeczywistości wskaźnikiem do pierwszego jej elementu w pamięci. Ponieważ w C nie ma kontroli indeksów, jaka jest w innych pożądnych językach (nawet procesory Intela udostępniają instrukcję BOUNDS) to możesz latać po pamięci i psuć co się da.
Dlatego nie radzę robić takich przypisań (ja już zdążyłem sobie w ten sposób IDE BorlandC wywalić przy uruchamianiu progsa).

0

Mozesz zapisac cos nawet pod numerem 1000000 tyle ze zapszesz poza tablicą czyli w praktyce na jakiejs innej zmiennej. To sie chyba nazywa wyciek pamieci.

0

Nie wiem czy to dobrze nazwałem ale chodziło mi o zmienną na samym końcu tablicy w której jest chyba zapisany znak konca tablicy (?)..

chyba chodzi ci o znak końca tekstu ( jak go tutaj napisze to utnie mi posta :( ) . To nie jest tak że nie można po tym elemencie pisać , po prostu jak masz stringa to lepiej sie postarać o ten znak na końcu , bo w przeciwnym przypadku program nie będzie wiedział gdzie kończy sie tekst :( . Jak używasz tablicy znaków to przechowywania pojedyńczych znaków i odnosisz sie do nich bezpośrednio to w tym ostatnim elemencie mozesz napisać co zechcesz .

Ponieważ w C nie ma kontroli indeksów, jaka jest w innych pożądnych językach (nawet procesory Intela udostępniają instrukcję BOUNDS) to możesz latać po pamięci i psuć co się da.

Dryo ! Ty chyba na serio nie lubisz C++ . Skoro ten język jest taki fatalny , nie tak jak inne pożądne języki ( pewnie miałeś na myśli Delphi ) to czemu komercyjne programy i gry pisze sie przedewszstkim w tym języku ?? Czemu jest on najczęściej wymagany w firmach tworzących oprogramowanie ?? Czemu na studiach uczą tego języka ??
Czemu , można powiedzieć , jest to najpopularniejszy język ????
Równie dobrze moge powiedzieć , że Delphi i inne pożądne języki są "językami dla gospodyń domowych" bo kompilator robi wszystko za ciebie a ty nie musisz sie niczym martwić . Widzisz tylko ujemną strone tej zbytniej swobody jaką daje C++ . Może dzięki temu mamy większe możliwości , możemy odpowiednio manipulować komórkami pamieci , to jest bardzo przydatne przy np dynamicznym przydzielaniu pamięci , wtedy nie znasz rozmiaru tablicy , więc skąd kompilator ma wiedzieć kiedy będizesz pisać po tablicy , a kiedy po przypadkowych komórkach pamięci ?? [browar]

Mozesz zapisac cos nawet pod numerem 1000000 tyle ze zapszesz poza tablicą czyli w praktyce na jakiejs innej zmiennej. To sie chyba nazywa wyciek pamieci.

wyciek pamięci jest chyba wtedy gdy zrobisz coś takiego :
int *wsk=new int[10];
wsk=new int[10];

0

Dryo ! Ty chyba na serio nie lubisz C++ . Skoro ten język jest taki fatalny , nie tak jak inne pożądne języki ( pewnie miałeś na myśli Delphi ) to czemu komercyjne programy i gry pisze sie przedewszstkim w tym języku ?? Czemu jest on najczęściej wymagany w firmach tworzących oprogramowanie ?? Czemu na studiach uczą tego języka ??
Czemu , można powiedzieć , jest to najpopularniejszy język ????
Równie dobrze moge powiedzieć , że Delphi i inne pożądne języki są "językami dla gospodyń domowych" bo kompilator robi wszystko za ciebie a ty nie musisz sie niczym martwić . Widzisz tylko ujemną strone tej zbytniej swobody jaką daje C++ . Może dzięki temu mamy większe możliwości , możemy odpowiednio manipulować komórkami pamieci , to jest bardzo przydatne przy np dynamicznym przydzielaniu pamięci , wtedy nie znasz rozmiaru tablicy , więc skąd kompilator ma wiedzieć kiedy będizesz pisać po tablicy , a kiedy po przypadkowych komórkach pamięci ?? [browar]

Ano nie lubię. Ale to akurat nie ma tu żadnego znaczenia. Nie zawsze można pisać w tym co się lubi (żeby to chociaż C++ było. A to czyste C musi być)
Nie zwracaj uwagi na moje komentarze odnośnie C. Jak jestem zły, bo mam do zrobienia 7 projektów w ciągu tygodnia to mnie szlag trafia.
Wracając do C. Są rzeczy, które mi się bardzo podobają. Np. świetną rzeczą są operatory typu += Podoba mi się także sposób definiowania pętli for (choć trochę mało czytelny).
Wściekam się natomiast na całkowity brak kontroli zakresów indeksów. Skoro asm udostępnia instrukcję BOUNDS, to dlaczego nie wykorzystać tego w C? Nawet MASM ma już wprowadzoną podstawową kontrolę typów! (a przecież to kompilator asm).
Podoba mi się też jeden typ dla znaków oraz dla liczb z zakresu 0..255. Dla mnie bajt to bajt. Nie ważne, czy jest to kod ASCII czy liczba. W Pascalu denerowało mnie stałe używanie Ord i Chr (dlatego często wolałem skorzystać z rzutowania :-D ). Może tylko nazwa char trochę nie bardzo (wolałbym byte).
Lecimy dalej. Sposób określenia łańcuchów znaków. To, że to są w rzeczywistości wskaźniki do miejsca w pamięci to świetna rzecz. Ale to, że aby określić jego koniec należy znaleźć znak o kodzie ASCII 0 to mnie dobija. Jak przez przypadek nadpiszę: to program się wykrzaczy. Jak mam wykorzystać jakiś algorytm, to zwykle muszę przetrzymywać długość łańcucha, żeby w miarę szybko działało. Pascalowe stringi biją tu na głowę PChar. Może tylko powinny być w kilku odmianach (0..FFh, 0..FFFFh, 0..FFFFFFh, 0..FFFFFFFFh).
Następna rzecz, która mi się podoba, to modyfikator unsigned. Dzięki temu widać od razu jaki rozmiar ma zmienna (no prawie. Gdyby było byte, word itp. to byłoby widać. W MASMie akurat to ciekwie rozwiązano. Nie myślałem, że doczekam czasu, kiedy będę chwalił narzęcia micro...).
Operatory przesunięcia bitowego też świetna rzecz. Moim zdaniem bardziej intuicyjne niż shl i shr. Ale || oraz && jako zamiast or i and, a także rozdział operatorów bitowych od logicznych to już przesada (| w matematyce jest operatorem dysjunkcji, co w żaden sposób nie pasuje do lub i to jeszcze bitowego). Przecież C już pozbyło się czegokolwiek takiego jak True i False (co moim zdaniem nie jest najciekawszym rozwiązaniem. W Javie już to naprawiono). Skoro False=0, a True to każda inna wartość (przyjmijmy 1, dla każdej innej wartości różnej od 0 będzie to samo), to:
True or False = 1 or 0 = 1 || 0 = 1 = 1 | 0 :)
True and False = 1 and 0 = 1 && 0 = 0 = 1 | 0 :)
Jak widać żadnej różnicy.
Fajną rzeczą są bloki { i } są naprawdę zgrabne (choć przyzwyczajonym pisania na klawiaturze napisanie begin zamiast { nie wiele zmienia). Może tylko tyle, że nie są tak rzucające się w oczy przy robieniu wcięć (ale jak się robi podwójne to jakoś ujdzie).
Dalej na tapetę idzie operator negacji !. Wy mnie zabijcie, a nie powiem wam skąd to się wzięło... Wolę not.
Następne. Przypisanie = To już nie mogło być :=, skoro jest *=, += itp.? A potem trzeba pisać == Bez przesady.
Lecimy dalej. Rozróżnienie dużych i małych liter. Wprost wściec się można, jak się pomyli i potem szuka błędu.
Parametry funkcji. Dlaczego nie mogę wpisać:
int F(int q, w, e) ?
tylko muszę zasówać:
int F(int q, int w, int e)
I to ma być oszczędność miejsca?
Dobra jest inicjalizacja nawet zmiennych lokalnych przy deklaracji:
int q=0;
Z tą deklaracją zmiennych w dowolnym miejscu to mam mieszane uczucia. Z punktu widzenia piszącego to wygodna rzecz (np. przy pętli stale to robię). Ale jak się to czyta, to wygląda strasznie. Wolę rozkład blokowy. Dlatego też brakuje mi zagnieżdżania funkcji.

A wracając do argumentu o dużych możliwościach. Jeżeli chcę mieć nieskończone możliwości to używam assemblera :) Poza tym np. Delphi udostępnia mi bardzo dobre narzędzia do zarządzania pamięcią. Latać po pamięci też teoretycznie mogę. Mogę nawet okreslić gdzie dokładnie w pamięci mają znajdować się zmienne (pod jakim adresem).
Mógłbym jeszcze duuuuużo wymieniać.

0

Ale sie rozpisałeś :)
Co tu dużo mówić , gusta są różne , a idealnego języka programowania nigdy nie będzie . Mi te rzeczy nie przeszkadzają bo po prostu ja zaczynałem od C więc dla mnie do wszystko to normalka . To w jakim języku uczyło się programowac ma ogromne znaczenie . [browar]

0

Ale sie rozpisałeś :)

Mógłbym tak dłużej... Zarażam sie od Kapustki :)

Co tu dużo mówić , gusta są różne , a idealnego języka programowania nigdy nie będzie.

Święte słowa. De gustibus non disputatum.
A co do idealnego języka to po prostu sam swój sobie powolutku projektuję (jak mi chęci wystarczy to może do końca studiów napiszę własny kompilator). Oczywiście bez generatorów, bo nie miałbym wtedy zabawy.

Mi te rzeczy nie przeszkadzają bo po prostu ja zaczynałem od C więc dla mnie do wszystko to normalka . To w jakim języku uczyło się programowac ma ogromne znaczenie . [browar]

Ciekaw jestem co Marooned na to powie. Podobno zaczynał od assemblera :)
A co do [browar] to już go u mnie masz za pomoc :)

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