C-C-C-C... Kad je bilo zasto a da nije bilo zato ?!

C-C-C-C... Kad je bilo zasto a da nije bilo zato ?!

offline
  • Pridružio: 08 Sep 2005
  • Poruke: 70

#include <stdio.h>

void main()
{
int i, br, nule=0;
char broj[32];
printf("Unesi decimalni broj: "); scanf("%d", &br);
for(i=0;i<35;i++) /* problem je sto kad je ovde 35 , promenljiva 'nule' se povecava enormno, a kad je 32, sve funkcionise normalno. ZASTO? */
{
if(br&0x80000000) broj[i]='1';
else
{
nule++;
broj[i]='0';
}
br<<=1;

}

printf("\nBroj nula u broju \n");
for(i=0;i<32;i++)
{
putchar(broj[i]);
if(i%8==7) putchar(' ');
}
printf("je : %d\n", nule);

}

Znaci, treba neki decimalni broj prebaciti u binarni i izbrojati koliko tu ima nula. Nije mi jasno, zasto se u dodatna 3 prolaska kroz petlju (umesto do 32, do 35) promenljiva nule uveca enormno? Sta se zapravo desava? Ako neko moze da objasni ne bi bilo zgorega ! Ovim putem se unapred zahvaljujem za svako zdravorazumsko objasnjenje! Very Happy



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Pa 35 nikako ne izgleda razumno obzirom da je niz od 32 karaktera. To je definitivno greska.



offline
  • Pridružio: 08 Sep 2005
  • Poruke: 70

Ma znam ja da nije logično,al me interesuje zašto se promenljiva nule ne uveća za 3 nego za neki enorman broj.

offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Ko zna sta se desava kada predjes granicu niza. Pitaj boga. Smile

offline
  • Pridružio: 08 Sep 2005
  • Poruke: 70

Ne zna ni on, malopre smo razgovarali!

offline
  • Pridružio: 17 Mar 2004
  • Poruke: 293
  • Gde živiš: UK

Nemoj tako da se igrash granicama niza, niti shta dobro mozhesh da ochekujesh, niti cesh ishta ekstra korisno nauchiti.

Ono shto se konkretno deshava, u tvom primeru, je da je kompjler tako slozhio varijable u memoriji da ti "nule" pada direktno IZA 32 bajta niza, pa kad ga prekorachish ti direktno upisujesh u memoriju rezervisanu za drugu promenljivu.

offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Vidi, vidi, ni ne pada mi to na pamet. Ja ko mazga kontam ako je deklarisano pre onda je i u memoriji pre niza ta promenljiva. U svakom slucaju, ima logike. Samo ... zasto ne koristis snprintf()? Mislim da je mnogo lakse sa njom. U sustini, jedan poziv i odradi ti sve, samo kasnije prebrojis po nizu koliko ima nula.

offline
  • Pridružio: 08 Sep 2005
  • Poruke: 70

Hvala Bnasty i meka! Posle objašnjenja nije mi bilo odmah jasno šta se dešava. Ali posle malo prčkanja po MS Visual Studiu i debugger-u, posmatranja adresa i sl. - skontah! Uz to naučih da je bajt sa najmanjom adresom ujedno i bajt sa najmanjom težinom u predstavljanju brojeva, od kog počinje dodeljivanje bajtova za promenljivu određenog tipa - što zvuči logično, ali ja sam imao malo drugačiju predstavu.
No, kad smo kod adresa, da li postoji mogućnost da ja odredim ili dodelim adresu neke promenljive unapred? Probao sam da dodelim pomoću operatora & (ili da direktno nekom pokazivaču dodelim vrednost), ali javlja grešku oko neslaganja tipova ... Znam da je to vrlo neumesno raditi i da može da dovede do brljotina, ali me interesuje. I nije mi jasno zašto je prilikom svakog izvršavanja programa s početka teme uvek promenljive isto raspoređivao i dodeljivao im iste adrese?! Kakvom se to „prostornom planu“ povinuju programi?

offline
  • Pridružio: 17 Mar 2004
  • Poruke: 293
  • Gde živiš: UK

Citat:No, kad smo kod adresa, da li postoji mogućnost da ja odredim ili dodelim adresu neke promenljive unapred? Probao sam da dodelim pomoću operatora & (ili da direktno nekom pokazivaču dodelim vrednost), ali javlja grešku oko neslaganja tipova ...

Adresu mozhesh 'bezobrazno' da dodelish recimo ovako :
int *x = (int *)0xbaadf00d;

C++ takodje podrzhava kreiranje promenljivih na unapred zadatom mestu u memoriji. Pogledaj "placement new/delete operator".
Placement-new je veoma koristan ako radish sa unapred alociranim baferima u kojima naknadno kreirash objekte sa 'new'.

Citat:I nije mi jasno zašto je prilikom svakog izvršavanja programa s početka teme uvek promenljive isto raspoređivao i dodeljivao im iste adrese?! Kakvom se to „prostornom planu“ povinuju programi?
Ovo je duuuuga tema. Za to bi trebao da pogledash Win32 memory model, PE file format i slichne stvari.

Ko je trenutno na forumu
 

Ukupno su 864 korisnika na forumu :: 45 registrovanih, 3 sakrivenih i 816 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 357magnum, Andrija357, antonije64, benne, Bokiboks, Boris BM, Brana01, darionis, darios, Denaya, DPera, flash12, Georgius, ikan, ILGromovnik, ivan1973, Ivica1102, JOntra, Karla, kihot, Klecaviks, Krvava Devetka, kybonacci, laurusri, Leonov, Lieutenant, mercedesamg, milenko crazy north, milutin134, Mixelotti, Mlav, mrav pesadinac, naki011, nemkea71, nenad81, ozzy, pein, raptorsi, RJ, rodoljub, royst33, slonic_tonic, stegonosa, Trpe Grozni, uruk