[ Alexandar_d @ 22.03.2005. 19:48 ] @
Nije mi jasna jedna stvar.
Naime, ovaj code razumijem:

Code:


#include <stdio.h>

main()
{

   int x[] = {2,5,6,4,7};
     
      printf("\n cifra 0: %d", x[0]);
}



Znaci, on mi ispise odredjenu cifru na odredjenom mjestu koje oznacim, u ovom slucaju ispisat ce mi broj 2. Ali mi nije jasno kada imam ovu situaciju:

Code:


#include <stdio.h>

main()
{

   int x[100];
   
   scanf("%d", &x)
     
      printf("\n cifra 0: %d", x[0]);
}




Sada mi treba kada ja na unosu unesem recimo 4356, treba da mi ispise cifru na recimo 2. mjestu (brojeci i nulu), to bi bila cifra 5. Kako da to izvedem?

I zanima me kako kad u nekom fajlu txt imam broj (npr. 4356) i treba mi procitati taj broj i ispisati ciftu na 2. mjestu?

Hvala puno.
[ X Files @ 22.03.2005. 21:28 ] @
Citat:

int x[] = {2,5,6,4,7};
printf("\n cifra 0: %d", x[0]);

Znaci, on mi ispise odredjenu cifru na odredjenom mjestu koje oznacim,
u ovom slucaju ispisat ce mi broj 2. Ali mi nije jasno kada imam ovu situaciju:


Greska. X[] je *niz* celobrojnih vrednosti (a ne jedan 'int' sa pozicijama cifara),
a to sto nema nista u zagradama je olaksica u kodiranju (da ih ne bi rucno
prebrojavao).

Dakle ono gore je isto sto i:
X[0] = 2;
X[1] = 5;
X[2] = 6;
X[3] = 4;
X[4] = 7;

Dakle, ti si u prvom slucaju 'stracio' 5 bajtova da bi smestio broj 25647. To
si trebao da uradis ovako:

x[0] = 25647;
ili samo:
x = 25647;

U jednu 'int' celiju mozes da upises broj od -32768 do 32767 ili 0 do 65535
ako imas i 'unsigned' modifikator (unsigned int). Velicina 'int'-a moze biti i
veca (2147483648 do 2147483647 ili 0 do 4294967295) ako konfigurises
okruzenje drugacije. Uglavnom, funkcijom sizeof(int) mozes da dobijes koliko
je bajtova rezervisano.

Citat:

int x[100];
scanf("%d", &x)


U ovom slucaju ti su u vrednost x[0], uneo broj (kako si rekao) 4356. Dakle, opet
se radi o *nizu* celobrojnih vrednosti, a ne o pozicijama cifara. To si ti nesto
pomesao sa stringovima, gde je stvarno jedna pozicija - jedna oznaka.

Sto se tice upisa celobrojnih vrednosti u fajl, stvarno postoje (uopsteno) dva
nacina:
1) kao string (posle vadis cifre po pozicijama kao sto si u pocetku radio,
samo sto neces koristiti niz 'int'-ova nego niz 'char'-ova)
2) kao broj (da izdvojis cifre moras da koristis mat.operacije '/' i '%' )

Evo kako se upisuju/citaju brojevi u slucaju 2:

Code:

// pseudo
int ceobroj = 25647;
Write ( &ceobroj, sizeof(int) );


Code:

// pseudo
int prostor_za_ucitavanje = 0;
Read ( &prostor_za_ucitavanje, sizeof(int) );


[ Milan Aksic @ 25.03.2005. 01:06 ] @
Citat:
X Files:
Code:

int x[100];
scanf("%d", &x)

U ovom slucaju ti su u vrednost x[0], uneo broj (kako si rekao) 4356.
Ne. Naziv niza (promenljiva) je pokazivac na prvi - [0], clan niza, a kako je funkciji bilo potrebno proslediti pokazivac promenljive (elementa) a ne adresu samog pokazivaca (&x odnosno &x[0]) vrednost je upisana samo zbog toga sto je ime promenljive niza konstantan pokazivac te se nije moglo promeniti na sta pokazuje pokazivac x.
Ocigledno, ako se umesto prethodne deklaracije niza napise npr.
Code:

int *x = (int *)malloc(100 * sizeof(int));
i poziv funkcije scanf ostavi nepromenjen, u toku izvrsavanja ce najverovatnije doci do greske (SIGSEGV) jer se pokusava promeniti sama vrednost pokazivaca tako sto mu dodeljuje (da pokazuje) neka nedozvoljena adresa.
Ali nece uvek dolaziti do greske pri izvrsavanju, odnosno pri svakom unosu. Moze se npr. pre unosa saznati prethodna adresa npr. 0x344, i uneti 0x348 (ako je u ovom slucaju tip int velicine 4 bajta), sto je adresa drugog - [1], clana niza, pri cemu nece doci do greske. Ali sumnjam da je ovakav nacin unosa bio namera autora - da manipulise vrednostima pokazivaca a ne vrednostima elemenata niza.
[ Goran Rakić @ 25.03.2005. 08:26 ] @
Zar nije a[0] isto sto i (*a)? U tom slucaju je ipak potrebno pisati &a[0], dok je ako se izostavi ovaj indeks moguce pisati samo scanf("%d", a). Ili mozda gresim...
[ caboom @ 25.03.2005. 12:53 ] @
pa u sustini sa stanovista kompajlera &a == &a[0], isto tako a[0] == 0[a] (probaj...).
[ Buffy @ 25.03.2005. 14:12 ] @
Citat:
caboom: pa u sustini sa stanovista kompajlera &a == &a[0], isto tako a[0] == 0[a] (probaj...).

Kako je &a==&a[0]?
&a[0] predstavlja adresu od prvog clana niza 'a',
dok &a ne predstavlja nista jer je to greska.
Jedino je moguce napisati:
Code:

a==&a[0];

[ dragansm @ 25.03.2005. 14:30 ] @
copy-paste iz watch prozora:
Code:

+    x    0x0012fecc    int [3]
+    &x    0x0012fecc ""    char *
+    &x[0]    0x0012fecc    int *


Citat:

I zanima me kako kad u nekom fajlu txt imam broj (npr. 4356) i treba mi procitati taj broj i ispisati ciftu na 2. mjestu?


Code:

char buffer[2];
FILE *f = fopen( "ime_fajla", "rt" );
if ( f ) {
  fread( buffer, sizeof( char ), 2, f );
  fclose(f);
}
cout << buffer[1];


ili

Code:

char c = ' ';
FILE *f = fopen( "ime_fajla", "rt" );
if ( f ) {
  if  ( !fseek(f, 1, SEEK_SET) )
  {
     c = fgetc( f );
  }
  fclose(f);
}
cout << c;


Dodao bih jos i ovo:
Code:

  int x[5];
  int a == *(x+3); // x[3]

[ srki @ 25.03.2005. 15:30 ] @
Citat:
Buffy: Kako je &a==&a[0]?

caboom je u pravu jer &a i a imaju istu vrednost (tip se razlikuje).

http://www.eskimo.com/~scs/C-faq/q6.12.html

Citat:
&a[0] predstavlja adresu od prvog clana niza 'a',
dok &a ne predstavlja nista jer je to greska.

Nije greska mada u pravu si da se obicno ne koristi &a i greska je u stvari sto neko to uopste tako pise. Ako pises &a umesto a to moze kasnije dovesti do posledica po tvoj program ako odlucis da niz a alociras dinamicki pomocu pokazivaca a.

Citat:
Jedino je moguce napisati:
Code:

a==&a[0];

i to je tacno ali je tacan i gornji primer.
[ caboom @ 25.03.2005. 16:32 ] @
wellcome to the wonderfull world of C buffy... razlika tipova se jako lepo oslikava kod extern-ovanja pointera i nizova, tu mogu da se dobiju stvarno sjajni rezultati. iako je je &a[0] tacnije, for the sake of the readability ces najcesce nalaziti &a po kodu. poenta je sto su tipovi sustinski razliciti, ali je pointer aritmetika ispravna. takodje, isto tako ce ti raditi 0[a] i a[0], kao i verovatno &0[a], posto se sustinski prevodi u &(0 + a) == &(a +0).
[ Goran Rakić @ 25.03.2005. 16:44 ] @
jaoj...

U principu kada se malo zamislis to je sve logicno, medjutim mogu samo da zamislim kako izgleda citanje tudjeg koda koji je na taj nacin napisan.
[ caboom @ 25.03.2005. 16:50 ] @
fora je sto se na ovo vremenom naviknes, mnogo gore stvari su los memory management. npr. kada se neko lose igra sa alokacijom i oslobadjanjem, pa imas non-aligned probleme (SIGBUS rings a bell), ili veoma cest problem sa fragmentacijom memorije neopreznim koriscenjem standardnog malloc-a. jos ako imas relativno los kernel i userland kakav imas kod linux-a ne mozes lepo ni da resis neke probleme sa alokacijom u thread-ovima... C u neku ruku dodje kao GO, veoma malo pravila, veoma teska igra.
[ Buffy @ 25.03.2005. 17:19 ] @
Stvarno zanimljivo!!!
Kada sam istampao na ekran adresu '&a' i adresu 'a' dosao sam do saznanja da su te adrese iste!!!
C je jezik koji stvarno mnogo iznenadjuje!
[ caboom @ 25.03.2005. 17:31 ] @
pa i nije u sustini. stvar je upravo u veoma malom broju pravila i restrikcija koje C89/C99 standardi postavljaju pred kompajlere.
meni licno je ovo jedan od veoma zanimljivih primera:
http://www.lysator.liu.se/c/duffs-device.html
IOCCC je takodje mesto gde se mogu naci neki veoma zanimljivi efekti i varijacije na razne prljave C teme.
[ toroman @ 25.03.2005. 19:04 ] @
Code:

#include <stdio.h>

main()
{

   int x[100];
   
   scanf("%d", &x)
     
      printf("\n cifra 0: %d", x[0]);
}



Evo mojeg rešenja:
Code:

char* getcifre(unsigned long broj) {
    char* buffer = malloc(256);
    buffer[255]='\n'; // za svaki slucaj 
    int i=0;
    while (broj>0) {
       buffer[i++]=broj%10;
       broj/=10;
    }
    buffer[i]=0;
    return buffer;
}


Mislim da ovo radi...
Sad samo trebas da iskoristis
main() {
unsigned long b;
scanf("%d",&d);
char* cifre=getcifre(b);
printf("3. cifra> %c", c[2]);
}


Dalje, pravi nacin bio bi>
main() {
int broj;
char cifre[256];
cifre=itoa(broj,cifre,10);
printf("Cifra 2. > %c", cifre[1]);
}

nadam se da sam pomogao bar malo, btw, jel ovo uopste pitanje, mislim, nisam bas najbolje razumio o cemu se radi... :( dumb
[ caboom @ 26.03.2005. 03:40 ] @
Citat:
toroman:
Evo mojeg rešenja:
Code:

char* getcifre(unsigned long broj) {
    char* buffer = malloc(256);
    buffer[255]='\n'; // za svaki slucaj 
.....



'\0'? da nisi mislio nesto kao memset(buffer, '\0', 256) ili naprosto calloc(1, 256)?
[ toroman @ 28.03.2005. 10:31 ] @
Pa mislim da je calloc najbolji izbor. ma šta više, nije ništa ni potrebno :) džaba sam to dodavao, mislim, nisam imao linux(man, anjuta o_O) pri sebi tako da nisam bio siguran šta da stavim ...

Uglavnom, mislim da funkcija radi svoj posao :)
[ caboom @ 28.03.2005. 15:21 ] @
pardon... ne treba pisati postove pre prve kafe, ili u petak uvece u 1-2am. zapravo me je cudilo cemu onaj '\n'.
[ toroman @ 30.03.2005. 22:39 ] @
Ej, pridruzujem se misljenju :)

Taj \n osigurava da ce se string zavrsiti, ali je ustvari beskoristan nakon sto se kod malo izanalizira :) najbolje je koristiti funkciju itoa, KRAJ diskusije :)

int i = 100;
char buffer[256];
itoa(i,buffer,10);

[ Alexandar_d @ 02.04.2005. 17:25 ] @
Rijesio sam problem, hvala.
[ caboom @ 07.04.2005. 22:49 ] @
Citat:
toroman:
Taj \n osigurava da ce se string zavrsiti...


zaboravih ovo potpuno... elem, mislim da se nismo razumeli, '\n' ti apsolutno nista ne garantuje. zapravo i markiranje kraja stringa sa '\0' ti ne garantuje sprecavanje buffer overrun-a, ili citanje veceg bloka memorije od duzine samog "stringa" osim ako ne baratas f-jama koje proveravaju tako nesto.