|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2000
Città: prov. Olbia-Tempio; Trattative concluse: ne ho perso da tempo il conto
Messaggi: 6847
|
[Sassari] Perchè la chiamata non funziona?
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? ![]() ![]() #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(®s, ®s, &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(®s, ®s, &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... Ultima modifica di cos1950 : 26-10-2003 alle 18:30. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2000
Città: prov. Olbia-Tempio; Trattative concluse: ne ho perso da tempo il conto
Messaggi: 6847
|
chiedo scusa, ma se hai fatto caso, mi riferivo a compilatori in C classico della programmazione strutturata anni '90.
Ciao. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No, non ci avevo fatto caso... Comunque dos.h è una estensione Borland del C...
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2000
Città: prov. Olbia-Tempio; Trattative concluse: ne ho perso da tempo il conto
Messaggi: 6847
|
up
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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... |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2000
Città: prov. Olbia-Tempio; Trattative concluse: ne ho perso da tempo il conto
Messaggi: 6847
|
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. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Fammi capire...ma il programma te lo compila ?
Ultima modifica di cionci : 28-10-2003 alle 02:23. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2000
Città: prov. Olbia-Tempio; Trattative concluse: ne ho perso da tempo il conto
Messaggi: 6847
|
certo... ma l'eseguibile non fa quello che deve fare perche' i dati messi da FP_SEG ed FP_OFF in DS
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:38.