[ poljane @ 24.10.2002. 01:28 ] @
Najprije bih pozdravio ovaj forum i vrlo ga pohvalio.
Posto sam pocetnik u C-u molio bi za mala objasnjenja:

1. posto je C vrlo tezak sa deklaracijama molio bih za
objasnjenje poziva slijedece funkcije (funkcija)
Kod u kome je ova funkcija radi, znaci nije gresk!!

qsort((void **) lineptr, 0 ,nlines-1, (int (*) (void *, void *))(numeric ? numcmp : strcmp));

-sta znaci (void**), da li je to pokazivac na pokazivac jer je lineptr
deklarisano kao polje

2. posto C ucim po knjizi od Kernighan i Ritchie "Programski jezik C"
koja je vrlo kompleksno i sazeto napisana i sluzi prije kao referenca
za C nego kao knjiga za ucenje, ali sam stisnuo zube i proradio cijelu
knjigu. Mogu reci da se isplatilo jer ako ja kao cisti hardveras mogu da
pratim i cak dajem komentare u ovim diskusijama (to ne radim jer nemam jos rutinu , a vidim da to neke kolege rade strucno i rutinski) onda je to neki pokazatelj.
Kao sto rekoh knjiga je prilicno teska ali treba je proraditi do kraja.
Ah da, pitanje:
u knjizi su unije skrto objasnjene (nema niti jedan primjer) pa da li je moj zakljucak tacan: Unija je promjenjiva koja zauzima samo jednu memorijsku lokaciju koja je dovoljno velika da u nju stane najveci clan unije, za razliku od strukture koja za svaki clan zauzima po jednu lokaciju u memoriji (cija velicina ovisi od tipa toga clana)
Hvala

[ tOwk @ 24.10.2002. 02:04 ] @
(void **) je samo običan kast (cast), i ne utiče na vrednost promenljive, i radi se o pokazivaču na pokazivač na void :)))

E sada, ne znam šta ti znači da je lineptr deklarisano kao polje.

Na osnovu imena promenljive, čini mi se da bi moglo biti nešto kao
char *lineptr[nlines];
ali naravno, ne može se na osnovu ovoga što si dao izvući konačan zaključak (postoji suviše raznih varijanti, a i ime ne mora reći sve), tako da je ovo u najboljem slučaju pogađanje (a u najgorem, lupetanje :)

Drugi kast je kast na funkciju kakvu qsort očekuje.


A što se K&R tiče, nemam iskustva (nisam je čitao), ali mi je drago zbog tvog novog iskustva i preporuka :)

Što se unija tiče, u pravu si.

Tol'ko
[ poljane @ 24.10.2002. 22:55 ] @
Hvala puno,
To je jasno , ali zar ovo drugo ( int(*)() ) ne bi trebalo biti pokazivac na f-iju koja vraca int?
[ Dragi Tata @ 24.10.2002. 23:13 ] @
Deklaracija za qsort je:

Code:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );


Gde je:

- base: pokazivač na početak niza koji treba sortirati;

- num: broj elemenatatog niza

- width: veličina (u bajtovima) elementa niza

- compare: funkcija koja vrši poređenja članova niza

Evo primera kako se koristi (ukradeno sa MSDN-a):
Code:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int compare( const void *arg1, const void *arg2 );

void main( int argc, char **argv )
{
   int i;
   /* Eliminate argv[0] from sort: */
   argv++;
   argc--;

   /* Sort remaining args using Quicksort algorithm: */
   qsort( (void *)argv, (size_t)argc, sizeof( char * ), compare );

   /* Output sorted list: */
   for( i = 0; i < argc; ++i )
      printf( "%s ", argv[i] );
   printf( "\n" );
}

int compare( const void *arg1, const void *arg2 )
{
   /* Compare all of both strings: */
   return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );
}


Inače, C++ programerima predlažem da umesto ove funkcije koriste STL algoritam sort
[ tOwk @ 25.10.2002. 00:40 ] @
Citat:
poljane:
Hvala puno,
To je jasno , ali zar ovo drugo ( int(*)() ) ne bi trebalo biti pokazivac na f-iju koja vraca int?


Mada je ,,DragiTata'' dao potpun odgovor (mada i malo spartanski :), objasniću ono što tvoj primer koristi, a nije prikazano u njegovom primeru.

Naime, ti najverovatnije imaš dve razne funkcije:
Code:
int numcmp(int *a, int *b);
int strcmp(char *a, char *b);

E sada, pošto qsort ima navedenu deklaraciju, onda ti radiš kast bilo koje od ove dve funkcije na traženu.

Naravno, parameter qsort-a nije sama funkcija, već pokazivač na nju, i to ti ovaj kast obezbeđuje.

Ukoliko sebi dopustiš malo pesničke slobode, taj kast ti nije ni potreban, već možeš koristiti samo (numeric? numcmp:strcmp), a rezultat će biti isti uz C prevodioc (plus/minus jedno upozorenje; C++ prevodioci bi trebali malo više da se pobune, čak možda i da ne dopuste kod, iz razloga koji su jasni kada se upoznaju dodatne mogućnosti istog).


Znači ključna ideja je ideja kasta: davanje određenog tipa vrednosti koja je nekog drugog tipa. Koristiš kada želiš da od int-a napraviš pokazivač, ili obrnuto, ali sadržaj memorije se ne menja (znači nećeš dobiti ,,očekivani'' rezultat ako kastuješ int na float).

Nadam se da je sada jasnije šta god da sam ja to hteo da kažem :)

Pozdrav

PS. Da dodam da je ,,demikrosoftovana'' deklaracija qsort funkcije prema cenjenom ISO C standardu
Code:
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
[ Rapaic Rajko @ 27.10.2002. 08:44 ] @
Citat:
poljane:
Hvala puno,
To je jasno , ali zar ovo drugo ( int(*)() ) ne bi trebalo biti pokazivac na f-iju koja vraca int?


Bas tako, funkcija koja vraca int, a evo i zasto. Ti mozes da podmetnes funkciju koju hoces, i time direktno da menjas nacin sortiranja. Sustina je u tome da tvoja funkcija treba da vrati sledece vrednosti:
- (-1), ako je prvi operand manji od drugog;
- 0, ako je prvi operand jednak drugom i
- 1, ako je prvi operand veci od drugog.

Vrlo mocna ideja, zar ne?
Pozdrav

Rajko