Entree/sortie en C sous Windows
Résolu
Alex SwartzKaiser
-
Nicolas -
Nicolas -
Bonjour
Je realise une jolie librairie, ecrite en C pour Windows. C'est donc une DLL... Pour diverses raisons, je compile tout, donc ma DLL, "a la main"" avec des makesfiles fait maisons, et non par un editeur graphique style VC++. Y se peut donc que j''ai mal fait un truc a ce niveau. J'utilise que du C ANSI.
J'ai une fonction de ma librarie qui prend en parametre un FILE* , suppose initialise par un fopen. Mon programme de test ouvre donc le fichier, je verifie si tout va bien, et ca va bien, je peut faire des fread sans lever d'erreurs. Mais quand je passe dans la fonction de ma librairie, des que je touche a mon fichier (avec fread par exemple), je leve une erreur "Bad file descriptor" avec perror(). La seule chose entre ces 2 moments, c' est l'appel de fonction. Que ce passe t-il ? Ou est mon erreur ?
Je realise une jolie librairie, ecrite en C pour Windows. C'est donc une DLL... Pour diverses raisons, je compile tout, donc ma DLL, "a la main"" avec des makesfiles fait maisons, et non par un editeur graphique style VC++. Y se peut donc que j''ai mal fait un truc a ce niveau. J'utilise que du C ANSI.
J'ai une fonction de ma librarie qui prend en parametre un FILE* , suppose initialise par un fopen. Mon programme de test ouvre donc le fichier, je verifie si tout va bien, et ca va bien, je peut faire des fread sans lever d'erreurs. Mais quand je passe dans la fonction de ma librairie, des que je touche a mon fichier (avec fread par exemple), je leve une erreur "Bad file descriptor" avec perror(). La seule chose entre ces 2 moments, c' est l'appel de fonction. Que ce passe t-il ? Ou est mon erreur ?
A voir également:
- Entree/sortie en C sous Windows
- Clé d'activation windows 10 - Guide
- Montage video windows - Guide
- Windows ne démarre pas - Guide
- Windows movie maker - Télécharger - Montage & Édition
- Remettre un pc en sortie d'usine - Guide
7 réponses
comment a été ouvert le fichier ? (lecture, ecriture, append, texte, binaire ?)
est-ce qu'on peut voir le code concerné ?
est-ce qu'on peut voir le code concerné ?
Ok...
Voila le programme de test
Ici, perror ne signale aucune erreur.
FileAudioInput_create(file) est une fonction de ma librairie, donc qui est dans ma DLL
Ici perror me dit "Bad file descriptor" !!!? Pourtant, le descripteur de fichier est bien le meme dans cette fonction et dans le programme de test... Comme un simple appel de fonction peut modifier un descripteur ??? Le pointeur FILE* est bien le meme, on dirait donc que ce n''est pas un probleme de convention d''appels...
Voila le programme de test
#include <stdio.h>
#include <stdlib.h>
#include "lydie.h"
static char* usage_str = "AudioInputTest <filename>\n";
int
main(int argc, char** argv) {
FILE* file;
AudioInput input;
AudioFormat format;
/* Command line checking */
if (argc != 2) {
printf("%s\n", usage_str);
return EXIT_FAILURE;
}
/* Open the file */
file = fopen(argv[1], "rb");
if (file == NULL) {
printf("Unable to open the file %s\n", argv[1]);
return EXIT_FAILURE;
}
/* Test for a strange bug */
/* No errors detected... */
rewind(file);
printf("main descripteur fichier = %u\n", file);
perror("main ");
/* Build the AudioInput from the file */
input = FileAudioInput_create(file);
/* Printing information about the file */
printf("%s\n", argv[1]);
format = AudioInput_getAudioFormat(input);
if (format == NULL) {
printf("Unsupported sound file format\n");
return EXIT_FAILURE;
}
printf("\t- nb channels = %u\n", AudioFormat_nbChannels(format));
printf("\t- big endian = %u\n", AudioFormat_isBigEndian(format));
printf("\t- bits per sample = %u\n", AudioFormat_bitsPerSample(format));
printf("\t- samples per second = %u\n", AudioFormat_samplesPerSecond(format));
/* Job done */
AudioInput_destroy(input);
fclose(file);
return EXIT_SUCCESS;
}
Ici, perror ne signale aucune erreur.
FileAudioInput_create(file) est une fonction de ma librairie, donc qui est dans ma DLL
AudioInput
FileAudioInput_create(FILE* f)
rewind(f);
printf("FileAudioInput_create descripteur fichier = %u\n", f);
perror("FileAudioInput_create ");
Ici perror me dit "Bad file descriptor" !!!? Pourtant, le descripteur de fichier est bien le meme dans cette fonction et dans le programme de test... Comme un simple appel de fonction peut modifier un descripteur ??? Le pointeur FILE* est bien le meme, on dirait donc que ce n''est pas un probleme de convention d''appels...
Salut,
Bon apres rapide evaluation de ton code le passage d'argument est tout à fait corect donc cela ne vient pas de la c est sure...
c'est kle code complet de FileAudioInput_create que tu as donné?
c est etrange cette histoire..
tu as essayé au debugger il rentre bien dans la fonction?
tu ne fait a aucun moment de modification du fichier?
Bon apres rapide evaluation de ton code le passage d'argument est tout à fait corect donc cela ne vient pas de la c est sure...
c'est kle code complet de FileAudioInput_create que tu as donné?
c est etrange cette histoire..
tu as essayé au debugger il rentre bien dans la fonction?
tu ne fait a aucun moment de modification du fichier?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Hum non mais le reste est sans importance vut que ca plante au debut... Mais quand je fait une librairie statique (.lib) au lieu d''une librairie dynamique (.dll) ca marche sans probleme ?!!
mais Alex, pourqoi ces rewind ??? t'en as pas besoin en plus, l'ouverture en lecture le place au début. Je pense que l'erreur, provient d'autre part.
Et puis, il est conseillé de mettre errno à 0 avant d'appeler perror, car il n'est pas mis automatiqement a 0 aprés usage.
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!
Et puis, il est conseillé de mettre errno à 0 avant d'appeler perror, car il n'est pas mis automatiqement a 0 aprés usage.
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!!