Hollosi Information eXchange /HIX/
HIX CODER 213
Copyright (C) HIX
1998-09-07
Új cikk beküldése (a cikk tartalma az író felelőssége)
Megrendelés Lemondás
1 Vedett modu videomemoria (mind)  32 sor     (cikkei)
2 Turbo C 3.0 hiba (mind)  84 sor     (cikkei)
3 Re: data1c - alvarez, onmodosito kod - Stenya (mind)  32 sor     (cikkei)
4 Re: adat az exe-ben (mind)  34 sor     (cikkei)

+ - Vedett modu videomemoria (mind) VÁLASZ  Feladó: (cikkei)

> Az a problemam, hogy van egy clipperes progim, amiben
> rengeteg kepernyokezeles C-ben van.
> [...] Szoval az a kerdesem, hogy hogyan lehet
> vedett modban firkalni a videomemoriaba?

ha a clipper 5.3-hoz jaro lebutitott ExoSpace linkert hasznalod,
akkor valahogy igy:

   mov   bx, 0b800h  ; gondolom, szines tv-d van..
   mov   [VideoSegment], bx
   call  ExoIsExoSpace ; ha nem exospace-szel linkeled, kesz
   or    ax, ax
   jz    

   push  8000h ; egyebkent vedett modu ptr kell a videoszegmensre
   push  [VideoSegment]
   push  0
   call  ExoProtectedPtr
   add   sp, 6
   mov   [VideoSegment], dx

:

   ; ezek utan a kepernyore iras:
   mov   ax, [VideoSegment]
   mov   es, ax
   mov   di, <offset>
   mov   ah, <attributum>
   mov   al, <karakter>
   stosw

bocs, hogy asm, ha nem erted, irjal...udv: 
+ - Turbo C 3.0 hiba (mind) VÁLASZ  Feladó: (cikkei)

Sziasztok!

Van egy gondom, amiben segitseget szeretnek kerni. A suliba kell egy 
fajlkezelo programot irni. Ennek elso lepese, hogy 10000 db rekordot 
kell legeneralni, es ezt fajlba kiirni. A problemam az, hogy a kod, 
amit irtam, nem egeszen mukodik. Roviden arrol van szo, hogy a 
generalas mukodik, de amikor a fajlba kiirt adatokat beolvasom, akkor 
csak az elso 5-10 rekord jon be jol, a tobbibe teljesen mas adatok 
vannak, mint amit generaltam. Nem tudom, hogy mi lehet a gond, hiszen 
az elso nehany adattal minden rendben van, csak aztan jonnek a 
problemak. Raadasul teljesen veletlenszeru, hogy hanyadik elemtol 
kezdodoen. Neha az elso 15 teljesen jo, kozvetlenul utana valo 
futtataskor meg mar pl. az 5-tol kezdve rossz.

Sajnos azt sem tudom, hogy a kiirasnal mennek gallyra a dolgok, vagy 
a beolvasasnal. Mar rengeteg mindent megprobaltam: kikapcsoltam a 
Norton cache-t, kikapcsoltam a C pufferet, atvittem Pentiumrol 386-
osra, semmi javulas. Megmutattam ket hivatasos programozonak, de 
fogalmuk sem volt mi lehet a hiba oka. Virus nem lehet, mert csak a 
forrast vittem at masik gepre. A hiba jelentkezik akkor is, ha csak 
az exet futtatom BDE-n kivul. Probaltam hogy nem irasasra+olvasasra 
nyitom meg a fajlt, hanem eloszor csak irasra, aztan lezarom (fflush, 
fclose) es csak olvasasra nyitom meg, de hiaba. Memoriahibat sem 
jelez.

Kodreszletek:
 ...
FILE *fpteljes;

typedef struct {
  char ures[7];
  unsigned long kulcs;
  unsigned int fiz;
  unsigned int varos;
  char foglalt;
} trecord;

trecord rek;

 ...

  fpteljes = fopen("teljes.dat", "w");  //Kulcsfajl megnyitasa irasra
  if (fpteljes == NULL) {
    fprintf(stderr, "Sikertelen file-nyitasi kiserlet: teljes!\n");
    exit(-1);
  };

  for (i=0; i<N; i++) {			//N az elemszam, 10000
    rek.kulcs=kulcs[i];			//A kulcsot mar korabban generalta
    rek.fiz=(random(30)+20)*1000;	//Fizetesek generalasa
    rek.varos = random(9000)+1000; 	//Varoskodok (irszam) generalasa
    fwrite (&rek,sizeof(rek),1,fpteljes);
    cout <<i <<". " <<rek.kulcs <<". " <<rek.fiz <<". " <<rek.varos 
<<"\n";					//Itt meg jol irja ki
  };

  cout <<"\n\n";

  fflush(fpteljes); fclose(fpteljes);

  fpteljes = fopen("teljes.dat", "r");  //Kulcsfajl megnyitasa irasra
  if (fpteljes == NULL) {
    fprintf(stderr, "Sikertelen file-nyitasi kiserlet: teljes!\n");
    exit(-1);
  };

  for (i=0; i<N; i++) {
    fseek (fpteljes, i*sizeof(rek), SEEK_SET);
    fread (&rek,sizeof(rek),1,fpteljes);
    cout <<i <<". " <<rek.kulcs <<". " <<rek.fiz <<". " <<rek.varos 
<<"\n";						//Itt mar nem ugyanazt irja 
							//ki, mint amit az elobb :-(
  };

  fflush(fpteljes); fclose(fpteljes);

 ...

Tudnatok otletet adni, hogy mi lehet a hiba oka?

A leveleket legyszi cc-zzetek a magancimemre is, mert nem jar a Coder.
Ja, C++ -ban irom.

Norbi
+ - Re: data1c - alvarez, onmodosito kod - Stenya (mind) VÁLASZ  Feladó: (cikkei)

On Fri, 28 Aug 1998 11:25:25 EDT,   wrote:

>Alvarez:
>>interruptot interruptbol valoban nem lehet hivni, de meg lehet
>>trukkozni ugy, hogy kiolvasod az interrupt cimet amit hasznalni
>>akarsz, aztan egy pushf utan raugrasz.
>Miert ne lehetne interruptot interruptbol meghivni?
>Siman meg lehet...
>A problemajara szerintem Hali.Non valaszolt, ezert nem irom
>le en is.

megkovetlek titeket: valaszomat egy assembly-oktato konyvben olvastam
valaha (cimere sajna nem emlexem), onnan szarmazik ez a megallapitas
(it-bol nem lehet it-t hivni) es onnan szarmazik a megoldasa is (ami
szerintem igen egyszeru es igen jol mukodik.)

>Otti:
>>Termeszetesen nem hivhatsz barmikor DOS funkciot,
>>foleg megszakitasbol nem. Van egy un. DOS foglaltsagi
>>flag, aminek a bebillentett allapotaban nem ajanlatos
>>DOS funkciot hivni!
>Igy van, ha jol tudom az elso 9(?) szolgaltatas reentrans,
>azok, amelyek karakterkiiratast (beolvasast) vegeznek.

aztan lehet, hogy enis csak a dos-os interruptokra gondoltam, csak
akkor meg nem tudtam rola...

                 : alvarez :          

  ]:[http://www.inf.bme.hu/~alvarez]

 ... mingyar' hozom is befele a baltat, oszt' megnezheted magad...
+ - Re: adat az exe-ben (mind) VÁLASZ  Feladó: (cikkei)

Hello, Arp!

 irta a kovetkezo uzenetben: ...
>Az egyik otlet hogy obj-kent belelinkelni az exebe. Lehet hogy
>hulyeseget kerdezek de ha igy csinalom, az ugye betoltodik a memoba, es
>ha igen, akkor az az adatszegmenshez vagy a kodszegmenshez tartozik?

Az attol fugg, hogy milyen szegmensnevet adtal meg annak a proginak, amivel
eloallitottad. De ha igy csinalod, azt ugyanaz, mintha a progidban statikus
adatteruletkent megjelolod, es ugy forditod. Milyen nyelven irnad a
progidat?

>A kerdes, hogy le tudom-e valahogy kerdezni maganak a futo programnak a
>nevet, hogy igy nyissam-e meg.

DOS alatt ez a programnak atadott elso parancssori parameter, a futo progi
teljes path-evel egyutt. Ha C-ben irsz, akkor:
int main(int argc, char *argv[])
{
    FILE *f;

    f = fopen(argv[0], "rb");
    ...
}

>Viszont remelem jol gondolom, hogy az igy hozzafuzott adat nem foglalja
>memoriat, mivel nem toltodik be hanem a wincsin/lemezen marad, ami
>viszont igen elonyos.

Jol gondolod! De mi az elonye annak, hogy hozzaszerkeszted az exe-hez? Miert
nem adodo kulon fajlkent melle?

Szia,
Gyuri

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