Hollosi Information eXchange /HIX/
HIX CODER 1182
Copyright (C) HIX
2001-05-21
Új cikk beküldése (a cikk tartalma az író felelőssége)
Megrendelés Lemondás
1 Re: *** HIX CODER *** #1180 (mind)  51 sor     (cikkei)
2 CBUILDER5 exception handling (mind)  25 sor     (cikkei)
3 palette problem (mind)  48 sor     (cikkei)
4 Re: Programozo vizsga (mind)  95 sor     (cikkei)
5 Delphi atlatszo ablak (mind)  5 sor     (cikkei)

+ - Re: *** HIX CODER *** #1180 (mind) VÁLASZ  Feladó: (cikkei)

Haho!

> Van egy console modu progi, ami win32-es CreateProcess-szel elindit
> egy masikat, aztan a ket processz 2 pipe-on keresztul kommunikal
> egymassal. Na most ha a masodik programhoz kell egy dll, ami nincs a
> gepen, akkor feljon egy ablak, amiben a win (egyebkent NT illetve
> 2000) a temakorben irt uzenettel valamint az aktualis path kiirasaval
> jelzi, hogy nem talalja az xxx.dll-t. Ezt elkerulendo CreateProcess
> elott atallitom az Error Mode-ot SetErrorMode(SEM_FAILCRITICALERRORS)-
> ra. Ettol az ablak nem jon fol, viszont eddig nem jottem ra, hogy az
> xxx.dll nevere hogyan tudnek rajonni, hogy rendes hibauzenetet adjak
> magam (az eredeti message box azert nem jo, mert ott a user-nek le
> kell okeznia az ablakot, ez meg egy user nelkuli szerveren futo
> program lenne).

En is processekkel es threadekkel vacakolok win32 alatt, ugyhogy
kicsit beleneztem a dologba...

A debuggerem szerint Win98 alatt az uzenet egy egyszeru MessageBox
hivas, amit kozvetlenul a KERNEL32.DLL (ring 3) ad ki az
USER32.DLLnek!!! (a Win9x kernelnek errol a szegyenfoltjarol meg nem
hallottam). Lehet hogy NT alatt van valami modszer a filenev
lekerdezesere, Win98 alatt elso ranezesre nincs.

> Szoval van valami otletetek, hogy mivel lehetne lekerdezni a hianyzo
> dll nevet? A CreateProcess egyebkent normalisan visszater miutan
> elinditja a process-t, es mihelyt a pipe-ba akarok irni valamit,

Ez biztos? Win98 alatt 0 val ter vissza, es a FormatMessage(...,
GetLastError(), ...); korrekt hibauzenetet ad (a DLL neve nelkul).

> akkor jon a hiba, hogy a pipe bezarult. A GetExitCodeProcess() azt
> adja vissza, hogy ERROR_WAIT_NO_CHILDREN. Ebbol tudom (illetve
> feltetelezem a programban), hogy egy dll hianyzik, de mi lehet a
> neve? Probalkoztam a FormatMessage() hivassal, csak annyit ad vissza,
> hogy "There are no child processes to wait for".

Nekem csak az jut eszembe, hogy ha CreateProcess() == 0, akkor
megnyitod a process moduljat es megnezed hogy megvan-e minden
importalt dll. IMAGEHLP hivasokkal eleg konnyu megcsinalni. Csunya egy
megoldas, nem is mukodik mindig (pl ha futtatasi jogod van de olvasasi nincs).

Nagyon kell abba hibauzenetbe a dll neve? :))

bLn

> Koszi a segitseget,
> István

> --  Istvan Marosi  --  http://www.sch.bme.hu/~marosi  --
> --  Recosoft Ltd.  --  mailto:  --
+ - CBUILDER5 exception handling (mind) VÁLASZ  Feladó: (cikkei)

Egy internetes alkalmazast fejlesztek hobbibol, ami egy CLIENTSOCKET-en
keresztul kommunikal egy szerverrel. Ez mukodik is, de nem tudom atvenni a
hibakezelest. Hiaba van egy handler rendelve az OnError esemenyhez a
TClientSocket-nel


void __fastcall TForm1::ClientSocket1Error(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
  StatusBar1->SimpleText = "Connection error....";
  ErrorCode = 0;
}


mindig kimaszik a hibauzenet a kepernyore es nyugtat var. A hiba 'Windows
socket error: (10049), on API 'connect'' vagy pl. (11001), on API
'ASyncLookup'. Ez teljesen jogos, hiszen vagy nincs INTERNET kapcsolat vagy
hibas a host nev. Hogy lehet ezt lekezelni? Nem sikerult a HELP-ben leirt
modon try ... catch segitsegevel sem.

Apropo, C++BUILDER. Egy MEMO-ban levo sorra kattintva az egerrel aaz ott
levo szo kijelolodik. Hogyan lehet megtudni, hogy a kattintas a MEMO melyik
sorara tortent illetve hozzajutni a kijelolt sz0hoz?

Koszonettel... Bela
+ - palette problem (mind) VÁLASZ  Feladó: (cikkei)

Sziasztok Coderek!
Lenne 1 kis gondom. 1 palettat kene fokozatosan
elovarazsolni csupa 0-sbol. Irtam 1 rutint (asm) de
nem muxik. A rutin var 1 picit majd hirtelen megjelenik
a celpaletta. Mi lehet a gond vele?
A furcsa, hogy ugyanennek a pascal verziojaval ugyanez
a baj, es a forditottja (megadott pal -> sotet pal)
tokeletesen megy.
procedure ShowPalette(var Pal: TPalette); assembler;
var Work: TPalette;
asm
        LEA     DI,Work
        MOV     CX,768
        XOR     AL,AL
        REP     STOSB
        MOV     CX,60
@@1:    LES     DI,Pal
        ADD     DI,3
        LEA     SI,Work
        ADD     SI,3
        MOV     DX,3C8H
        MOV     AL,1
        OUT     DX,AL
        INC     DX
        MOV     BX,765
@@2:    MOV     AL,[SI]
        CMP     AL,ES:[DI]
        JE      @@3
        INC     AL
        MOV     [SI],AL
@@3:    OUT     DX,AL
        INC     SI
        INC     DI
        DEC     BX
        JNZ     @@2
        CALL    WaitForRetrace ; var a visszafutasra
        PUSH    CX
        XOR     CX,CX    ; ez 1 delay akar lenni
        MOV     DX,1024  ; dx:cx = kesleltetesi ido
        MOV     AH,86H   ; ah=0x86
        INT     15H      ; int 0x15
        POP     CX
        DEC     CX
        JNZ     @@1
end;
Elore is koszi a segitseget!
thSoft
http://www.extra.hu/thsoft/
+ - Re: Programozo vizsga (mind) VÁLASZ  Feladó: (cikkei)

On Mon, Apr 13, 1964 at 02:04:50AM +0000,  wrote:
> 1.  Adja ossze fixpontosan, kettes komplemens kodot hasznalva
>      16 biten a -11 es a 15 tizes szamrendszerbeli egesz szamokat!

Gondolom olyasmit varnak el, hogy ird fel binarisan a ket szamit
es az osszegiket. Ehhez nem kell mast tudni, mint
-- hogyan kell negativ szamot abrazolni
-- hogyan kell binarisan osszeadni

A 15 binarisan:
0000 0000 0000 1111

A -11: a kettes alapu komplenes definicio szerint azt hiszem azt
a szamot jelenti, amelyhez hozzaadva a kivant szam abszolut
erteket, 16 db nullat kapnank az elejen egy egyessel (na ezt jol
elmondtam). A feladatunk az, hogy keressunk egy ennek megfelelo
szamot. Tehat:

   0000 0000 0000 1011 ==  11
 + 1111 1111 1111 0101 == -11
 ----------------------------
 1 0000 0000 0000 0000

Ez 16 biten tulcsodul, es lesz belole egy nulla, igy a
-11 + 11 == 0 egyenlet kielegul.

Na, osszeadva a ket szamot:

   0000 0000 0000 1111 ==  15
 + 1111 1111 1111 0101 == -11
 ----------------------------
 1 0000 0000 0000 0100

Osszeadni papiron kettes (meg akarhanyas) szamrendszerben pontosan
ugy kell mint tizesben: elindulunk a vegerol es hangosan mondjuk,
hogy ``Egy meg egy az nulla (ala irjuk), maradt az egy
(megjegyezzuk).'' Tovabblepunk balra egy szamjeggyel: ``Egy meg
nulla meg egy (ez az az egyes amit megjegyeztunk) az nulla,
maradt az egy. Egy meg egy meg egy az egy, maradt az egy. Egy meg
egy az nulla, maradt az egy. ...'' Es igy tovabb.

Ez eredmenykent kapott szam 16 biten ismet tulcsodul, es a vegen
marad egy 0100-as ami tizesben a 4-nek felel meg. Megkaptuk az
eredmenyt: 15 - 11 == 4.

> 2. Irja fel a 3456,16 tizes szamrendszerbeli szamot 16-os szamrend-
>     szerben, normalizalt formaban!

3456.16 = sum{i>=0}(a_i*16^i) + sum{i>0}(b_i*16^-i)
ahol 0 <= a_i, b_i <= 15 minden i-re (es persze egeszek)
(sum == nagy gorog szigma; ezek akar vegtelen osszegek is lehetnek!)
Ekkor megmutathato, hogy
	sum{i>0}(b_i*16^-i) < 1 es sum{i>=0}(a_i*16^i) egesz
	==> 3456 == sum{i>=0}(a_i*16^i) es 0.16 == sum{i>0}(b_i*16^-i)
Mar csak a megfelelo {a_i} es {b_i} sorozatokat kell megtalalni.

Kezdjuk a_i-vel:
	3456 = sum{i>=0}(a_i*16^i) == a_0*16^0 + a_1*16^1 + a_2*16^2 + a_3*16^3 + ...
Az egyenlet mindket oldalat maradekosan osztva 16-tal baloldalon
kapunk valamit (amit ki tudunk szamolni), jobb oldalon
pedig a_0*16^0 == a_0-t, mert a_i*16^i oszthato 16-tal minden i > 0-ra.
	0 = a_0
Visszairjuk az egyenletbe a_0-t, es kivonjuk:
	3456 = a_1*16^1 + a_2*16^2 + a_3*16^3 + ...
Most mar mindket oldal biztosan oszthato 16-tal, tegyuk is meg:
	216 = a_1*16^0 + a_2*16^1 + a_3*16^2 + ...
Ezek utan goto 10: lehet maradekosan osztani, visszairni, kivonni,
osztani, ... ameddig a bal oldal nem lesz nulla. Kesz a ciklus :)
(bar nemely matematikus inkabb a rekurziv formulakat reszesiti
elonyben)

Na megvan a_i. Lassuk b_i-t:
	0.16 = sum{i>0}(b_i*16^-i) == b_1*16^-1 + b_2*16^-2 + b_3*16^-3 + ...
Szorozzuk fel az egyenlet mindeket oldalat 16-tal:
	2.56 = b_1 + b_2*16^-1 + b_3*16^-2 + ...
Elovesszuk a regi jo ervelesunet: b_1 egesz,
sum{i>0}(b_i*16^-i) < 1; kepezzuk a ket oldal egesz reszet es
orulunk, hogy megvan b_1.
	2 = b_1
Kivonjuk mindket oldalbol:
	0.56 = b_2*16^-1 + b_3*16^-2 + ...
Lehet ezt a mokat is elorol kezdeni. De. Figyelni kell arra, hogy
ez a ciklus mar nem lesz minden esetben veges! (pl most sem)

Megkaptuk tehat: 3456.16 = D80.28F5B6666...
Most mar csak normalni kell: de nem mindegy am, hogy milyen
alapra! Van amelyik gep 2-esre csinalja, van amelyik 16-osra..
Egy szam b szerint akkor van normalva, ha a tort resze legalabb
1/b. Tehat 3456.16 == 0.D8028F5B6666... * 16^3 (16 szerint normalva)
es 3456.16 == 0.1101 1000 0000 0010 1000 1111 0101 1011 0110 0110 0110 0110 ...
 * 2^12
Most _veletlenul_ megegyezik a ketfele normalas, de ez nem mindig van igy!

Pista biztosan elmondja majd jol is :)
_tgz
+ - Delphi atlatszo ablak (mind) VÁLASZ  Feladó: (cikkei)

A problemara talalhatio megoldas a kovetkezo helyeken:
Delphi Sotfware Online 1999 1. evf. 2. szam, 43. szam
www.animare.hu

Schmidi

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