Wartosci w tablicy

0

Troche sie zdziwilem jak zobaczylem co sie kryje pod pusta komorka tablicy... w programie przypisuje wrtosc podano przez usera do jakiejs komorki arraya a wynik to:
array[0] = 15 #tu gdzie przypislem
array[1] = -858993460
array[2] = -858993460
...
array[n] = -858993460

Czemu jest liczba -858993460 pod nieokreslona wartoscia tablicy???

0

Zarowno C jak i C++ nie zeruje wszystkich pol tablicy, po prostu rezerwuje pamiec(tak samo dzieje sie ze zmiennymi po deklaracji). Dlatego trzeba albo samemu wyzerowac tablice albo nie korzystac z komorek jak to nazywasz "nieokreslonych".

0

Jak nie zainicjalizowałeś jej wartością to ma przypadkową. Załóżmy, że wcześniej w tym miejscu w pamięci siedział jakiś program, a teraz jest tam twoja tablica i odczytujesz jakieś przypadkowe wartości.

Eh.. Długo się już zbieram do napisania arta o podstawach komputera, bo coraz więcej widzę pytań wynikających z braku zrozumienia budowy komputera. Niech się tylko sesja skończy...

0

Przy czym wydaje mi się, że C/C++ automatycznie wyzerują wszystkie elementy w definicji takiej jak:

int tab[10]={0};

Być może zależy to od konkretnego kompilatora, niemniej standard mówi, że w takiej sytuacji inicjalizuje się określone jawnie zmienne (w tym wypadku jawnie jest określona tylko wartość dla pierwszej komórki) natomiast pozostałe wyrazy są zerowane.

tak mi się przynajmniej wydaje, a jestem dziś wykończony ....

0

Przy czym wydaje mi się, że C/C++ automatycznie wyzerują wszystkie elementy w definicji takiej jak:

int tab[10]={0};

  1. Taki szczegół: deklaracji :)
  2. Ustawi, ale tylko pierwszy znak (przynajmniej w BorlandC)
    Sens stosowania takiego czegoś jest tylko dla wygody zapisu lub jeżeli jest to zmienna globalna. Dla zmiennych globalnych, tak samo jak to jest w Delphi czy czystym asm od razu przy uruchomieniu programu dane komórki są zarezerwowane na odpowiednią wartość. W przypadku zmiennych lokalnych przy każdym wywołaniu funkcji tablica musi być zainicjowana odpowiednimi wartościami, co w przypadku takiej deklaracji jest chyba mniej efektywne niż zwykła pętelka.

Ale to tylko tak na marginesie.

0

Z góry przepraszam za agresywny ton wypowiedzi

Boże, co wyście się tacy czepliwi zrobili - wpierw Marooned, teraz Dryo. Skutecznie zniechęcacie przed napisaniem czegokolwiek.

Zaczyna do mnie dochodzić, że w tym czasie gdy zrobiłem przerwę od forum tak naprawdę niewielę straciłem.

  1. Taki szczegół: deklaracji

Deklaracja to określenie jakiego typu jest zmienna.
Definicja to zarezerwowanie dla tej zmiennej pamięci.

powiedz więc Dryo, czym jest wiersz taki jak ten:
int tab[10]={0};

Oczywiście jest deklaracją i definicją jednocześnie.
Twoja uwaga może mieć na celu tylko jedną rzecz (i robi to skutecznie) uprzykrzanie życia forumowiczom.

To że napisałeś trylion postów nie oznacza że możesz się wpie@#$@ (często niesłusznie) w każdy szczegół mojej wypowiedzi.

  1. Ustawi, ale tylko pierwszy znak (przynajmniej w BorlandC)

Aby nie było wątpliwości, oto fragment 99 strony książki niejakiego Bjarne'a Stroustrupa "Język C++", dla nie wtajemniczonych - ta książka jest autentyczną biblią języka C++.

" 5.2.1 Inicjowanie tablic
Tablicę można inicjować listą wartości ...
... Jeśli lista zawiera za mało elementów, to przyjmuje się, że brakującymi elementami są zera,

np.
int v5[8] = { 1,2,3,4 };
jest równoważne
int v5[8] = { 1,2,3,4,0,0,0,0 };
"

w przypadku takiej deklaracji jest chyba mniej efektywne niż zwykła pętelka.

nie rozśmieszaj mnie

Ale to tylko tak na marginesie.

aaaaaaaaaa Już po jednym tygodniu mam dość tego forum, ratunku!

0

Boże, co wyście się tacy czepliwi zrobili - wpierw Marooned, teraz Dryo. Skutecznie zniechęcacie przed napisaniem czegokolwiek.

Nie wiem co Marooned napisał, bo tylko wybiórczo przeglądam ostatnio forum, a co do Twojej odpowiedzi, to tylko tak dla zabawy sobie odpowiedziałem. Wiesz, że wcale nie miałem zamiaru krytykować Ciebie. Jak dla mnie jesteś dużym autorytetem w dziedzinie algorytmiki.

Zaczyna do mnie dochodzić, że w tym czasie gdy zrobiłem przerwę od forum tak naprawdę niewielę straciłem.

Ano atmosfera troszkę się psuje... :(

Deklaracja to określenie jakiego typu jest zmienna.
Definicja to zarezerwowanie dla tej zmiennej pamięci.

Wybacz, jeżeli akurat w tym miejscu się z Tobą nie zgodzę, choć wszystko zależy od spojrzenia. Ja wyrosłem na językach pascalowych i tam taki blok:

var
a: Integer;

to jest blok deklaracji zmiennej. Oznajmiam kompilatorowi (deklaruję), że mam zamiar używać zmiennej a typu Integer i on ma zarezerwować odpowiednią ilość miejsca.
Natomiast blok:
type TMojTyp = Integer;

to blok definicji. Definiuję sobie TMojTyp i wszędzie w programie gdzie będzie coś takiego użyte kompilator ma wiedzieć, że chodzi mi o taką to a taką strukturę (przy czym słowo struktura używam tu w potocznym znaczeniu. Nie chodzi mi o struct ;) ).
I żeby już uzupełnić całość, to:
const
Pi = 3.14;
jest blokiem definicji stałych. Definiują sobie stałą Pi i kompilator ma wiedzieć, że pod takim oto znaczniek Pi ma rozumieć konkretna liczbę.
Akurat w tym przypadku nazwa definicja bardziej pasowałaby do #define z C niż const z Pascala (inna implementacja, taka jak const w C)

Jakby co to źródło nazewnictwa to gdzieś w pomocy było (choć i na tych nielicznych wykładach z Pascala też gościu tak mówił, ale jego to za autorytet bym nie uważał).

powiedz więc Dryo, czym jest wiersz taki jak ten:
int tab[10]={0};

Taki wiersz jest deklaracją połączoną z inicjalizacją. W przypadku zmiennych globalnych jest to inicjalizowan już przy ładowaniu programu. Przy lokalnych jest po prostu odpowiednia wartość ustawiana (patrząc w źródła programu BorlandC zauważyłem, że z innego miejsca w programie są kopiowane. Ale to tak dla ciekawości. To co robi jeden kompilator nie muszą inne).
Do definicji w C służy typedef (type definition).

Oczywiście jest deklaracją i definicją jednocześnie.

Jest deklaracją wskaźnika (do komórki pamięci, która jest traktowana jako początek tablicy) i inicjalizacją odpwiednich danych.

Twoja uwaga może mieć na celu tylko jedną rzecz (i robi to skutecznie) uprzykrzanie życia forumowiczom.
To że napisałeś trylion postów nie oznacza że możesz się wpie@#$@ (często niesłusznie) w każdy szczegół mojej wypowiedzi.

Zaczynam się czuć dyskryminowany ze względu na ilość postów. Wiwat coyote i brak licznika postów!
W Polsce mamy wolność słowa i chyba mogę napisać, co o tym sądzę. Nie mówię, że zawsze mam racje. Wręcz przeciwnie. Dosyć często się mylę, ale inni zwracają mi uwagę i się w ten sposób uczę (choć jeżeli jestem pewien swego to jestem uparty).

Aby nie było wątpliwości...

W BorlandC (uparłem się na niego, bo akurat wygodnie mi w nim sprawdzić źródło) przy ustawieniach ANSI C.
Deklaracja taka jak ta:
int q[10] = {1, 2, 3};
jest przekładana na coś takiego:
q:
dw 1, 2, 3,
dw 7 dup(0)
więc to co podałeś jest absolutnie prawdziwe.

w przypadku takiej deklaracji jest chyba mniej efektywne niż zwykła pętelka.

nie rozśmieszaj mnie

I to akurat dla mnie nie wydaje się śmieszne. O ile chodzi o zmienne globalne, to oczywiście jest to znacznie szybsze. Ale jeżeli chodzi o zmienne lokalne, to możnaby tu się sprzeczać. Sporo zależy od samego kompilatora. Wywołanie odzielnej funkcji, która kopiuje dane z innej lokalizacji jest jak na moją znajomość assemblera troszkę wolniejsze niż wrzucenie petli bezpośrednio. Ale mogę się oczywiście mylić.

aaaaaaaaaa Już po jednym tygodniu mam dość tego forum, ratunku!

Rozluźnij się. Wszyscy z utęsknieniem czekaliśmy na Twój triumfalny powrót i każdy chciał jakoś zaznaczyć, że o Tobie pamiętamy, a Ty już tak, jakby nie patrzeć, ostro reagujesz. Chyba naprawdę prowadzisz stresujący tryb życia. Czyżby sesja?

P. S. Taki głupi problem a taka dyskusja. Jak ja to kocham :)

0

Poniosło mnie, przepraszam Dryobates.

Przy czym wspomniane przeze mnie rozróżnienie pomiędzy deklaracją a definicją występuje w wielu książkach poświęconych C++ (no i tej szczególnie ważnej)

jeszcze raz sorry.

*A w którym wątku ja się czepiałem? user image Chodzi Ci o te posty sprzed paru miesięcy? Hmm - Marooned

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