Entra

View Full Version : [Sassari] Perchè la chiamata non funziona?


cos1950
26-10-2003, 18:23
Il listato prova.c qui sotto compilato con TurboC 2.00 funziona, con Microsoft C 6.00, non funziona.
Effettua la ricerca del primo file nella directory indicata con una chiamata al servizio 4Eh del DOS, prima perö va settata la DTA (Area di trasferimento del Disco) con una chiamata al servizio 1Ah.
Il problema sono le macro FP_SEG e FP_OFF che evidentemente non generano indirizzi di segmento e offset validi.
Si dovrebbe risolvere il tutto con un cast opportuno, ma solo dio sa qual è...
C'è qualcuno che puö fare le sue veci? :D:D




#include <dos.h>

static char *file = " ";

main()
{
union REGS regs;
struct SREGS sregs;
struct find_t *dta;

int i;
char *s;
dta = (struct find_t *) malloc(sizeof(struct find_t));

strcpy(file, "c:\\c600\\*.*");
strcpy(dta->name, "c:\\c600\\*.*");
regs.h.ah = 0x1a;
regs.x.dx = (unsigned) FP_OFF(dta);
sregs.ds = (unsigned) FP_SEG(dta);

intdosx(&regs, &regs, &sregs);

regs.h.ah = 0x4e;
regs.x.dx = (unsigned) FP_OFF(file);
sregs.ds = (unsigned) FP_SEG( file);
regs.x.cx = _A_NORMAL | _A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_VOLID | _A_SUBDIR | _A_ARCH ;

intdosx(&regs, &regs, &sregs);

printf("%d %s\n", regs.x.ax, dta->name);

getch();
}

Il risultato è che in AX c'è il valore 3 (e non 0) che indica che non ü stato trovato alcun file, il carryflag é settato a 1, mentre la Dir contiene almeno 7-8 file.
Lo so che c'é la funzione di libreria findFirst(char *, int); perö il problema resta...

cionci
27-10-2003, 02:42
La libreria dos.h non esiste in Visual C++ per diversi motivi:

- Visual C++ fa esclusivamente eseguibili a 32 bit
- gli interrupt DOS non sono disponibili per i programmi a 32 bit
- la memoria non è segmentata nei prgorammi a 32 bit

cos1950
27-10-2003, 08:33
chiedo scusa, ma se hai fatto caso, mi riferivo a compilatori in C classico della programmazione strutturata anni '90.
Ciao.

cionci
27-10-2003, 08:43
No, non ci avevo fatto caso... Comunque dos.h è una estensione Borland del C...

cos1950
27-10-2003, 16:42
up

cionci
27-10-2003, 18:16
Non credo che qualcun'altro possa risponderti una qualcosa di diverso da quello che ti ho detto io...

Semplicemente quel codice non è utilizzabile su compialtori diversi da Borland a meno di wrapper ad hoc...

cos1950
27-10-2003, 19:38
su Microsoft C vers. 6.x del 1990 (parliamo di programmazione strutturata) DEVE essere possibile; tanto é vero che ci sono le macro FP_SEG ed FP_OFF per spezzare un indirizzo assoluto nella porzione segment e offset.
E poi sarebbe un controsenso non poter scrivere una funzione che attua i servizi dos 4Eh e 4Fh per la ricerca del nome del primo file e dei successivi in una directory.
Il punto è che come compilatore è un po' obsoleto e quindi gli altri che si usano offrono MPC belle e pronte per fare la stessa cosa.

cionci
28-10-2003, 02:19
Fammi capire...ma il programma te lo compila ?

cos1950
28-10-2003, 06:37
certo... ma l'eseguibile non fa quello che deve fare perche' i dati messi da FP_SEG ed FP_OFF in DS:DX non sono segmenti di indirizzo validi e quindi puntano ad alltre porzioni di memoria a casaccio.