Entree/sortie en C sous Windows

Résolu/Fermé
Alex SwartzKaiser - 21 juin 2004 à 12:48
 Nicolas - 16 août 2007 à 12:03
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 ?
A voir également:

7 réponses

blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
21 juin 2004 à 13:05
comment a été ouvert le fichier ? (lecture, ecriture, append, texte, binaire ?)
est-ce qu'on peut voir le code concerné ?
0
Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
21 juin 2004 à 14:32
on pourrai voir le code de ta fonction?
0
Alex SwartzKaiser
22 juin 2004 à 03:44
Ok...

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...
0
Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
22 juin 2004 à 12:12
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Alex SwartzKaiser
22 juin 2004 à 13:02
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 ?!!
0
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 177
22 juin 2004 à 15:41
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!!!
0
Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
22 juin 2004 à 14:15
Cela vient peut etre de la façon dont tu fait ta dll...
mais la je ne pourrai t aider je ne sait faire que des dll zarb...( pour java :p)
0
J'ai exactement le meme pb que toi, tous les pointeurs passé aux fonctions de ma dll sont corrects sauf les FILE* qui provoque des erreurs. Je suis sur que ca doit etre lié a une option de visual mais je ne trouve pas. Tu as trouvé la solution a ton pb ?
0