Vous n'êtes pas identifié.
Voila comme vous l'avez compris je me mes au C++. pourquoi bah parceque je trouve que le code est plus claire. les variable on sait a koi elle servent, elles sont plus perdu dans le code mais dans un classe. je trouve ca bcp plus claire.
Mais j'ai un prob a la compilation de pointeur far je sais pas koi. voila le code:
//using namespace std; extern _C { void far handler() { _hardresume(_HARDERR_FAIL); } void erreur_materiel() { _harderr(handler); } } int main() { //Lecteur *Lec_M=NULL,*Lec_N=NULL,*Lec_O=NULL,*Lec_P=NULL,*Lec_Q=NULL; erreur_materiel(); return 0; }
l'erreur se produit avec handler uniquement quand je compile en c++. en C ca passe. le message que j'ai avec tc3:
cannot convert 'void (*)()' to 'void (far*)(unsigned int,unsigned int, unsigned int far*)'
et j'arrive pas a resoudre le probleme
Hors ligne
essaie avec
void handler(unsigned int,unsigned int,unsigned int far*) { _hardresume(_HARDERR_FAIL); } void erreur_materiel() { _harderr(handler); } int main() { //Lecteur *Lec_M=NULL,*Lec_N=NULL,*Lec_O=NULL,*Lec_P=NULL,*Lec_Q=NULL; erreur_materiel(); return 0; }
Sinon tu verras que les classes ne servent pas directement à clarifier ton code mais plutot à penser en terme d'objets (la clarté du code en étant une conséquence directe c'est vrai)
Hors ligne
ca ne marche pas plus.
Hors ligne
alors
int handler(int,int,int,int) { hardresume(_HARDERR_FAIL); return 0; } void main() { harderr(handler); // ... }
Chez moi ça ça compile bien
Hors ligne
thanks !
je vais essayer de migrer vers dm
Hors ligne
Fais attention avec DM pour la recherche de fichiers dans les lecteurs vides, ce n'est malheureusement pas aussi simple à régler qu'avec TCC...
Avec TCC si on scanne les 6 lecteurs on peut faire une simple boucle for dans laquelle on appelle findfirst() par exemple, et si jamais le lecteur est vide l'appel de cette fonction provoquera une erreur et on n'obtiendra pas de résultats pour le lecteur en question. La recherche continue alors avec le lecteur suivant.
Avec DM par contre l'erreur qui survient arrive à "casser" la boucle for (je ne sais pas trop comment), et donc si on tombe sur un lecteur vide on risque de ne pas scanner les suivants, même s'ils contiennent des fichiers :?
Pour rechercher un certain fichier dans un lecteur moi j'ai du écrire ceci:
static void __far my_handler(unsigned, unsigned, unsigned __far *) { _hardretn(0); } void main() { _harderr(my_handler); ... } bool findFile(char* nom,char* sortie) { char chemin[50]="L:\"; uchar i; struct find_t ff; strcpy(chemin+3,nom); bool ok; do { for(; chemin[0]<='Q' && _dos_findfirst(chemin,0,&ff) ; chemin[0]++); if(chemin[0]<='Q' && strlenght(ff.name)<4) { chemin[0]++; // on est tombe sur un lecteur vide qui a fait quitter la boucle ok=false; } else ok=true; } while(!ok); if(chemin[0]<='Q') { strcpy(sortie,"x:\"); sortie[0] = chemin[0]; strcpy(sortie+3,ff.name); return true; } sortie[0]=' '; return false; } void strcpy(char* dst, const char* src) { uchar i; for(i=0; src[i]; i++) dst[i] = src[i]; dst[i] = ' '; }
(Ici la fonction findFile() sert à scanner les racines des lecteurs pour trouver un certain fichier et récupérer son chemin complet )
Hors ligne
En fait c'est peut-etre bien findfirst qui renvoie 0 en cas de lecteur vide... mais j'avoue ne pas avoir cherché tres loin lol
Hors ligne
J'avais eu des problèmes avec l'interception de ces erreurs, et j'en étais arrivé à faire ceci:
#ifndef __DMC__ #pragma warn -par #endif //static char diskerror; int DOSerrors_handler(int errval, int ax, int bp, int si) { hardretn(0); return 0; } #ifndef __DMC__ #pragma warn +par #endif int main () { ... harderr(DOSerrors_handler); ... }
sinon le prgramme devenait instable après, problème lors d'exécutions successives de programmes (autant que je me rappelle)
Hors ligne
ho?
"execution sucessives"?
on a des problèmes de ce genre effectivement... j'ai atteind pour ma part 9 executions mirroirs (cad 2 exe qui s'executent)
Hors ligne
En effet, c'est le genre de problèmes que j'ai eus!
En fait le code que j'ai écrit pour mon handler avec DM ressemble fort à celui que tu as donné, et puisque c'est compilé avec ce compilo les #ifndef ne me serviront pas... Donc je ne pense pas que ca va arranger les choses Enfin je vais essayer de tte facon, et j'essaierai de creuser de ce coté la pour resoudre le probleme si ca ne marche toujours pas
Hors ligne
TOUCHE et son exploreur n'on pas ce problème d'exécution miroir, là j'ai conté 25 exécutions successivent de T explorer par TOUCHE et de TOUCHE par T explorer (25 parce que j'ai arrêté de conté...)
Sinon à tout hazard, voici la fonction execute() telle que je l'utilise dans T_EXPLOR et TOUCHE:
void execute(char *pathp) // {{{ { char command[128]; //buffer for the command line char *args[64]; //table of arguments int i; int numberofargs =0; //no comment int execres; int a =0; int cline_size; //size of the command line cline_size=strlen(pathp); //cline_size is set if (cline_size > 128) //Error if the command line size is more than 128 return; printf("nExecuting :n%sn", pathp); //This, below, scan the command line to find space characters for (i=0; i <= cline_size; i++) { if (pathp[i]!=(char)32)//if there is no space { if (a==0)//if it is the first character of the arg args[numberofargs]=&command[i];//copy the address of the first arg command[i]=pathp[i];//copy the arg in command a++;//a is increased till a space is found } else if (a > 0 && args[numberofargs][a - 1]!=(char)32) //if a space is found after //an argument and if the //previous character wasn't a //space { command[i]=' '; //this end the argument numberofargs++; //a new argument has been found a=0; //reset the index of character of the argument } } args[numberofargs + 1]=NULL; //This is for the last argument execres=execv(args[0], args); //execute the progs with the argument list if (execres==-1)//if error { perror("ERROR while executing"); } forcasio_bioskey(); //Waits for a key (just clear properly the buffer //if no key in it and correct a bug that only occurs on the g100) return; } // }}}
Hors ligne
Moui ben c'est un appel à execv normal quoi :P
Hors ligne