Hollosi Information eXchange /HIX/
HIX CODER 440
Copyright (C) HIX
1999-04-24
Új cikk beküldése (a cikk tartalma az író felelőssége)
Megrendelés Lemondás
1 Re: String C++ (#438) (mind)  114 sor     (cikkei)
2 Re: String C++ (#438) (mind)  73 sor     (cikkei)
3 Re: String C++ (mind)  69 sor     (cikkei)
4 Re: C++ stringbe levo kodok (mind)  22 sor     (cikkei)
5 re : max. filehandle (mind)  57 sor     (cikkei)
6 mp3 lejatszo (mind)  9 sor     (cikkei)
7 Re: bitszamolas (#439) (mind)  23 sor     (cikkei)
8 Re: bitszamolas (mind)  32 sor     (cikkei)
9 bitszamolas (mind)  35 sor     (cikkei)
10 Re: CODER #439 Byte-ban az egyesek szama (mind)  42 sor     (cikkei)
11 Watcom C & Visual C (mind)  6 sor     (cikkei)
12 Delphi3 Database Pack kerdes (mind)  23 sor     (cikkei)
13 Re: bitszamolas (mind)  23 sor     (cikkei)
14 jump if ... (mind)  10 sor     (cikkei)

+ - Re: String C++ (#438) (mind) VÁLASZ  Feladó: (cikkei)

On 23 Apr 99 at 6:07,  wrote:

> Kedves Istvan!

Szia!

> > > Remelem nem irtam nagy marhasagot...
> >
> > Csak egy picit :))
> > Az abc ugyanis nem pointer.
> 
> Szerintem meg igen.

Pedig bizony nem... :))

De az a gyanum, hogy nem az ellen bizonygatjatok ezt, ami ellen en 
irom. Az termeszetesen igaz, hogy amikor a tomb nevet onmagaban 
hasznalod, az az expression a tomb elso elemere valo mutatora fog 
kiertekelodni. Ugyanugy, mint egy szubrutin neve is, annak a 
kifejezesnek is a szubrutin kezdocime lesz az erteke. Ettol azert meg 
nem mondja senki, hogy a szubrutin az egy pointer. :)

> > > char def[29];
> > > def = abc;
> > Ez nem jo, nem kap meg def semmit!
> 
> Szerintem sem. A def egy const char *pointer (bizonyitast lasd alabb). Azaz a

Jujj, az teljesen mas dolog!!!

const char *poi; egy olyan pointer, ami const char-ra mutat, tehat
*poi = 'a'; helytelen, viszont poi++; mar lehetseges.

> leforditott ertek lesz a def-ben es utanna nem irhatod at. Ugyanis
> forditaskor 29 byte le lesz foglalval valahol es az erre mutato POINTER
> betoltodik a def pointer-be.

Nincs def pointer sehol a memoriaban, ahova betoltodhetne barmi is!

> > Legegyszerubb ugy megnezni ezt, hogy kiprobalod ezt a kettot:
> >
> >   extern char abc[5];
> >   char *p = abc;
> >
> > illetve
> >
> >   extern char *abc;
> >   char *p = abc;
> 
> Mivel az elso esetben abc erteke az offset "tomb valahol a memoriaban", ezert
> a ket dolog ugyan az (SZERINTEM).

Forditsd le, nezd meg, milyen kod lesz belole, es latod, hogy nem 
ugyanaz.

> Igyexem alatamasztani az allitasomat
[...]
> Ha az abc nem a "valahol elhelyezkedo tomb"-re mutato pointer lenne, hanem
> maga a tomb, akkor valami zagyvasagot kellene kiirnia. De nem azt irja ki.
> Tehat abc egy pointer.

Szoval a szohasznalatban van kulonbseg koztunk: Te ugy hasznalod a 
tomb nevet, mint a kifejezes erteket (ami egy pointer), en meg 
szemantikailag (ami egy tomb, ami kifejezesekben az elso elemere 
mutato pointerkent ertekelodik ki).

> Az a kulonlegessege, hogy const. Bizonygatas:
...
> char abc[]="ABC";
> char *p=abc;
> abc=p;
...
> >cc x.c
> "x.c", line 4: left operand must be modifiable lvalue: op "="

Ez a hibajelzes nem azt jelenti, hogy konstans!! Hanem azt, hogy nem 
lvalue.

> Szoval levonhato az a kovetkeztetes, hogy az abc egy const pointer.

No ez nagyon nem igaz!

> Tovabb is varialhato a dolog. Barmely string egy pointer-kent fordul le. Es
> hasznalhato is ugy, mint egy pointer.

Pontosabban: barmely string egy char tomb.

> printf("%p\n", "ABCDE");
> printf("%p\n", "ABCDE");
> printf("%p\n", "ABCDEF");
...
> >a.out
> 20ae0
> 20aec
> 20af8
> 
> Jol lathato, hogy az ugyanolyan string-eket ez a fordito nem
> fesuli egybe. A Borlan TurboC-ben erre kulon opcio volt, hogy ilyet
> tegyen-e.

Nem csak ez a fordito van ezzel igy! Ugyanis a string az egy char 
tomb, nem pedig egy const char tomb!! Vagyis az erteke modosithato! 
Ezert nem szabad oket egyetlen helyre rakni, mert ha az egyiknek egy 
betujet modositja valami, akkor a tobbi is modosulna.

Hogy miert nem const char tomb a string eleve? Valoszinu azert, mert 
akkor megoszulne az ember, amig az osszes forrasaban vegigvezeti, 
hogy melyik char* -bol kell const char* -ot csinalnia, hogy hajlando 
legyen a fordito leforditani a kodot. ;-)

István

--  Istvan Marosi  --  http://www.sch.bme.hu/~marosi  --
--  Recosoft Ltd.  --  mailto:  --
+ - Re: String C++ (#438) (mind) VÁLASZ  Feladó: (cikkei)

On 23 Apr 99 at 19:35, Mink Barnabas > wrote:

> >   extern char abc[5];
> >   char *p = abc;
> >
> > illetve
> >
> >   extern char *abc;
> >   char *p = abc;

[...]

> A tomb offset <-> mutato kulonbseg szemantikailag: Az abc az elso
> peldaban egy konstans (-> nem lehet megvaltoztani), ami egy ervenyes
> helyre mutat,

Iiiigen, mondhatjuk igy is, bar ez IMHO inkabb ~~szintaktikai, mint 
szemantikai kulonbseg. (A szemantikai kulonbseg az, amit en irtam, 
hogy mas kod fordul belole.)

> es automatikusan le is lesz foglalva 5 byte ennel az
> offsetnel. A masodikban egy valtozo, ami mutathat akarhova is, es
> nincs automatice lefoglalva semmi hely ott, ahova mutat.

Viszont le van neki foglalva egy pointernyi hely valahol... A tombnel 
ilyen nincs.

> Utobbinal lehet
> pointer aritmetikat hasznalni (pl. ++abc, abc = xyz), elobbinel nem.
> 
> Helyes? :-)

Igen, durvan. Viszont a peldat masra akartam kihegyezni, csak rossz 
szokasom szerint csak a felet irtam le annak, amire gondolok, 
feltetelezve, hogy a masik felet ugyis mindenki kitalalja ;)

Szoval az akart lenni ez bovebben, hogy van az egyik forras:

file1.c:

char abc[5] = "abcd";
// stb.

Aztan van a masik forras ket valtozatban:

file2.v1.c:

extern char abc[];

void feldolgtomb()
{
    char *p = abc;
    ... stb...
}

file2.v2.c:

extern char *abc;

void feldolgtomb()
{
    char *p = abc;
    ... stb...
}

Nos, ez a feldolgtomb rutin a v1-ben jol mukodik, mig a v2-ben
hulyesegeket kezd el csinalni, core-t dump-ol, GPF ablakot hoz fel,
stb. C++ eseten jobb a helyzet, mert ott mar a linker hibat jelez, 
mert a name mangling miatt a ketfele abc-nek mas lesz a neve.

István
--  Istvan Marosi  --  http://www.sch.bme.hu/~marosi  --
--  Recosoft Ltd.  --  mailto:  --
+ - Re: String C++ (mind) VÁLASZ  Feladó: (cikkei)

On 23 Apr 99 at 6:55,  wrote:

abc[] tombrol van szo...

> Hmmm lehet, hogy szorszalhasogato vagyok, de szerintem valahogy
> ugy van ez a dolog, hogy a tomb neve fent abc egy pointer, ami
> konstans, tehat az erteket nem modosithatom

Felfoghato igy is a dolog, csak eppen pont e miatt a felfogas miatt 
irtam azt a cikket, mert vannak esetek, amikor rossz kodot eredmenyez 
ez a felfogas.

[...]

> char a[11]="abcdefghij";
> char *b;

[...]

> tehet "a" nem csak a fugvenyhivaskor lesz pointer, hanem az
> ertekadasnal, es a muveleteknel is az, de erteket nem
> valtoztathatjuk meg.

Igen. Ezt nem hangsulyoztam (mert nem ez a lenyeg), de termeszetesen
igy van. Ezt egyreszt a praktikussag, masreszt az ortogonalitas miatt
definialtak igy a C-ben, de az egesz onnan indult ki, hogy a tombot
nem ertek szerint, hanem cim szerint adjak at parameterkent.

(Amikor a C-t kitalaltak, abban az idoben a parameteratadas mikentje 
nagyon sokakat foglalkoztato elvi problema volt. Ezt a C egyszeruen 
megszuntette azzal, hogy dontse el a rutin hivoja, hogy erteket akar 
atadni, vagy pointert. A C++ mar visszahozta azt, hogy szintaktikai 
elemmel megadhato, hogy egy parameter milyen modon legyen atadva.)

> Szereny olvasatomban ez azt jeleti, hogy "a" egy konstans pointer.

A konstans pointer kifejezes teljesen masra van fenntartva, 
feltetelezem, hogy nem arra gondoltal. (Szoval nem const char*-ra)

> Ezert hibas a
> a="akarmi";             mig a
> b="akarmi";             helyes, bar itt vigyazni kell a
> b[7]=0;                viszont mar igen csak ketseges kimenetelt
> eredmenyez, mert ilyenkor olyan helyre irunk, amit csak a fordito
> fog tudni( mivel akarmi 6 hosszu + egy '0' az pont 7, es a tomb
> szamozasa 0 val kezdodik :)))
> vagyis ilyenkor csinaltunk egy olyan kodot, ami fugg attol, hogy milyen
> forditoval forditjuk le, ami nem biztos hogy a legszerencsesebb.

Ugyanilyen problemat okoz az a[11] is, ugyhogy ez nem kulonbseg. (Bar 
valoszinunek tartom, hogy ezt a tematol fuggetlenul irtad csak 
ide...)

Egyebkent itt leirtal egy olyan kodot, ami par eve engem nagyon 
meglepett, hogy szintaktikailag helyes:

  char *b;
  b = "akarmi";
  b[0] = 'A';

Ez tenyleg helyes szintax, es ez is resze annak a misztifikalasnak,
hogy a tomb es a pointer ugyanaz. Egyszeruen arrol van szo, hogy
mindketfele 'indexelesi' szintaktikat (b[x] illetve *(b+x)) lehet
tombre is meg pointerre is alkalmazni. Ettol meg szemantikailag a
tomb es a pointer nem lesz ugyanaz.

István
--  Istvan Marosi  --  http://www.sch.bme.hu/~marosi  --
--  Recosoft Ltd.  --  mailto:  --
+ - Re: C++ stringbe levo kodok (mind) VÁLASZ  Feladó: (cikkei)

On 23 Apr 99 at 2:28,  > wrote:

>    Lenne egyproblemam. Borland C++3.1, es GNU alatt elkezdtem nezni, ha
> egy stringbe kodokat tesztek ("\13" CR kod), akkor nem ez kerul bele,
> hanem a 13 helyet 11. Vagyis nem decimalisban, hanem oktalisban veszi az
> erteket.

Igen, ez igy lett kitalalva meg a kezdeti idokben.

>    Tud valaki olyan abrazolasi modot, ahol vagy decimalisban, vagy
> hexaba tudom ugy beirni a szamot, hogy barmilyen szoveg is lehesen
> utanna, de ne zavarja meg a kodot.

Egyreszt a leggyakoribb kodokra vannak \akarmi kodok, pl. CR="\r".
Ha pedig valami mas kodot akarsz beirni, lezarhatod idezojellel, ha 
felsz, hogy a \x szamot koveto betut/szamot is a hexa szam reszenek 
tekinti. Pl.: "\x09abcd" helyett irhatsz "\x9" "abcd" -t. A fordito 
osszeszedi a stringeket egybe.

István
--  Istvan Marosi  --  http://www.sch.bme.hu/~marosi  --
--  Recosoft Ltd.  --  mailto:  --
+ - re : max. filehandle (mind) VÁLASZ  Feladó: (cikkei)

Hali Coder !

Andrew Schulman,... Undocumented DOS-bol (ISBN
0-201-57064-5):

/***************************************************
*	COUNTF.C - Jim Kyle
*	Last change   13 August 1990
***************************************************/

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

#ifndef MK_FP
#define MK_FP( s, o ) (void far *)(((long)(s) << 16) |
(unsigned)(o))
#endif
unsigned files(void) 
{
 union REGS regs;
 struct SREGS sregs;
 unsigned int far *ptr;
 int n = 0;

 if ( _osmajor < 2 )
 {
	puts( "FILES not supported in this DOS version.");
	exit(0);
 }
 regs.h.ah = 0x52;
 intdosx( ®s, ®s, &sregs );
 ptr = (unsigned int far *) MK_FP(sregs.es, regs.x.bx + 4 );
 ptr = (unsigned int far *) MK_FP( ptr[1], ptr[0] );
 while ( FP_OFF(ptr) != 0xFFFF )
 {
	n += ptr[2];
	ptr = (unsigned int far *) MK_FP( ptr[1], ptr[0] );
 }
 return n;
}

#ifdef TESTING
void main( void )
{
   printf("FILES=%d\n", files();
}
#endif

A 0x52 DOS funkcio (get list of lists) a DOS belso
tablazataihoz
ad egy pointert. Azok leirasa is megtalalhato ugyanabban a
konyvben.

Udv.

Szalai Gabor
+ - mp3 lejatszo (mind) VÁLASZ  Feladó: (cikkei)

Hello!

Nem tudom, mennyie jol dokumentaltak, de Linux ala van egy halom mp3
lejatszo forrassal egyutt... (www.freeamp.org, www.x11amp.org)

vagy:
http://www.mp3.com/software/linux/players.html

Barna
+ - Re: bitszamolas (#439) (mind) VÁLASZ  Feladó: (cikkei)

On Sat, 24 April 1999,  wrote:
> Sziasztok jatekos kedvu coder-ek!
            ^^^^^^^^^^^^^^^^^^^^^^
:-)

> Az rendben, hogy egy 256-os lookup tablaval egy indexelessel 
> megkaphatjuk, hogy egy byte-ban mennyi 1-es bit van. De hogyan tudjuk 
> ezt a tablazatot gyorsan inicializalni?

A kovetkezo negysorossal palyazok:

     int i, t, nsb_t[256] = {0};
     for (i=1;i<=128;i<<=1)
	  for (t=0;t<i;++t)
	       nsb_t[i+t]=nsb_t[t]+1;

A 0 erteke meg van adva, aztan a kovetkezo X mezot (X=az eddig
kitoltott mezok szama) mindig ugy tolti ki, hogy az eddigi ertekekhez 
hozzaad egyet, egeszen addig, ameddig mind a 256 ertek megvan.

Biztos lehetne meg optimalizalni...

Barna
+ - Re: bitszamolas (mind) VÁLASZ  Feladó: (cikkei)

Szia Istvan!

>Meg kellett szamolnom, hogy egy bitkepen mennyi 1-es erteku bit van,
>es elgondolkodtam kicsit, hogy hogyan lehetne ezt gyorsan csinalni.
>Az rendben, hogy egy 256-os lookup tablaval egy indexelessel
>megkaphatjuk, hogy egy byte-ban mennyi 1-es bit van. De hogyan tudjuk
>ezt a tablazatot gyorsan inicializalni?

Nem kodot irok, hanem matematikai oldalrol elemzem a problemat
/ne felj, en is a villanykaron tanultam matekot, par evvel alattad
jartam:))/

Ez is rekurziv megoldas. A legelso byte 0 egyes bitet tartalmaz. Ez az elso
lepes.
A kovetkezo bajtok 1-es bitjeinek a szamat ugy kapjuk, hogy az adott ponttol
annyi bajtra vegezzuk el a muveletet, ahany mar ki van a tablazatban
szamolva, es az ertek pedig a korabbi tablazat ertekek 1-el megnovelve.

Nehany lepest leirok, igy talan kevesbe felreertheto:
1. lepes utan a tablazat:    0
2. lepes utan a tablazat:    0 1
3. lepes utan a tablazat:    0 1 1 2
4. lepes utan a tablazat:    0 1 1 2 1 2 2 3
5. lepes utan a tablazat:    0 1 1 2 1 2 2 3 1 2 2 3 2 3 3 4

A 9. lepes utan kesz a tablazat. Amugy a megoldasra ugy jottem rá, hogy
leirtam 16-ig a szamokat binarisan es osszeszamolva az ertekeket feltunt
a szabaly.

udv.
Joco

+ - bitszamolas (mind) VÁLASZ  Feladó: (cikkei)

>Meg kellett szamolnom, hogy egy bitkepen mennyi 1-es erteku bit van,
>es elgondolkodtam kicsit, hogy hogyan lehetne ezt gyorsan csinalni.
>Az rendben, hogy egy 256-os lookup tablaval egy indexelessel
>megkaphatjuk, hogy egy byte-ban mennyi 1-es bit van. De hogyan tudjuk
>ezt a tablazatot gyorsan inicializalni?
>
>Szoval ki tudja a leggyorsabb/legrovidebb algoritmust kitalalni?
>(Algoritmus kell, nem binaris include :) Ha lehet, olyan, ami nem
>shift-elessel szamolja ossze a biteket a byte-ban.
>
>En rekurzivat csinaltam, erdekel, hogy ki mit talal ki :)
>Johet C, asm, Pascal, akarmi.

Szia István!

Valoszinuleg nem a legkisebb...

;       al-ben a vizsgalando
;       cx-ben az eredmeny
;
        mov   cx,0        ; szamlalo torlese
t01:    test  al,01h      ; 0. bit vizsgalata
        jz    t02         ; ha Z: 0 volt
        inc   cx          ; egyel tobb 1-es
t02:    test  al,02h      ; 1. bit vizsgalata
        jz    t04         ; ha Z: 0 volt

 ... es igy tovabb, azt hiszem ertheto.

A test allitja a carry-t (nincs keznel leiras)? Akkor nem kellene az
ugras, csak adc al.
Szerintem fontosabb a jol olvashato kod mint a gyorsasag, kiveve, ha
a gyorsasag kritikus.

Veres Sandor
+ - Re: CODER #439 Byte-ban az egyesek szama (mind) VÁLASZ  Feladó: (cikkei)

  kerdezte:
> megkaphatjuk, hogy egy byte-ban mennyi 1-es bit van. De hogyan tudjuk
> ezt a tablazatot gyorsan inicializalni?
> 
> Szoval ki tudja a leggyorsabb/legrovidebb algoritmust kitalalni?
> (Algoritmus kell, nem binaris include :) Ha lehet, olyan, ami nem
> shift-elessel szamolja ossze a biteket a byte-ban.

Ha nem lehet shiftelni, akkor en igy csinalnam:

int  egyszam( unsigned char c )
{
unsigned char  i;
int  n=0;		/*  Az egyesek szama  */

for( i=128 ; i > 0  &&  c ; i /= 2 ) {
  if( c >= i )  n++,  c -= i;
  }
return( n );
}


Ha fontos a gyorsasag:

int  egyszam( unsigned char c )
{
unsigned char  i;
int  n=0;		/*  Az egyesek szama  */

for( i=128 ;  ; i /= 2 ) {
  if( c >= i ) {
    n++;
    if( (c=c-i) <= 0 ) break;
    }
  if( i <= 1 ) break;
  }
return( n );
}



                       Aggod Jozsef
+ - Watcom C & Visual C (mind) VÁLASZ  Feladó: (cikkei)

Hello!

Valakinek nincs meg veletlenul a Watcom C valamilyen ujabb verzioja
(10.5-tol nagyobb) vagy a Visual C? Tanulasi celzattal kellene. Lehet
teljes CD-s is.
                       Udv: Luka'cs A'rpa'd
+ - Delphi3 Database Pack kerdes (mind) VÁLASZ  Feladó: (cikkei)

Sziasztok !

Nem tudok megbirkozni a kov. feladattal: a tablabol torolt rekordokat
fizikailag is torolni kellene idonkent programbol.
Erre vonatkozoan a helpben semmifele utalast nem talaltam,
de megprobaltam mindenfele trukkot, amibol eddig a
BatchMove parancs volt a legjobb, de azzal is nagyon
sok godom akadt.
A Database Desktop-pal viszont nagyon korrektul tudok
tomoriteni, de nekem mindenkeppen programbol kellene.

Tehat lenne vagy 10-20 DBase tabla (most meg 10, de
fejlodik a program), amiket be kellene tomoriteni.
A sebesseg sem lenyegtelen, mert eleg nagy meretuek
lesznek a tablak, de a legfontosabb a megbizhatosag.

Minden mukodo otletet orommel vennek a postaladamban
is, mert sajnos a nagy kuzdelemben keves idom jut
a lista olvasasara...  :))))

Elore is koszonom:
---
Norbi )
+ - Re: bitszamolas (mind) VÁLASZ  Feladó: (cikkei)

Hello!

en nem tablaval csinaltam, csak siman bt-vel, szerintem
ezzel lehet a legrovidebbre megirni. (ami nem jelenti azt,
hogy az en verzion a legrovidebb).
viszont ugy tudom, hogy a bt nem a sebessegerol hires. bar
a pentiket ilyen szempontbol nem ismerem.
a kod:

	mov si,offset bitterkep
	mov cx,length(bitterkep)*8-1
	xor dx,dx
cycle:
	bt  [si],cx
	adc dx,0
	dec cx
	jns cycle

a ciklus 9 byte hosszu, 486-os procin ha jol szamoltam, 17 orajel.
a bt 12-t eszik :(

Bye,
	Panther / mnemonic
+ - jump if ... (mind) VÁLASZ  Feladó: (cikkei)

Hello!

Az assembly felteteles ugrasavial kapcsolatban lenne egy kerdesem. Meg
lehet-e azt oldani, hogy
egy ilyen ugrassal 128 bajtnal tavolabbi cimekre is lehessen kozvetlenul
ugorni?
Elore is koszi a valaszokat!

Feri
mailto:

AGYKONTROLL ALLAT AUTO AZSIA BUDAPEST CODER DOSZ FELVIDEK FILM FILOZOFIA FORUM GURU HANG HIPHOP HIRDETES HIRMONDO HIXDVD HUDOM HUNGARY JATEK KEP KONYHA KONYV KORNYESZ KUKKER KULTURA LINUX MAGELLAN MAHAL MOBIL MOKA MOZAIK NARANCS NARANCS1 NY NYELV OTTHON OTTHONKA PARA RANDI REJTVENY SCM SPORT SZABAD SZALON TANC TIPP TUDOMANY UK UTAZAS UTLEVEL VITA WEBMESTER WINDOWS