Entree/sortie en C sous Windows

Résolu
Alex SwartzKaiser -  
 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 ?
A voir également:

7 réponses

blurk Messages postés 486 Date d'inscription   Statut Membre Dernière intervention   160
 
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 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
on pourrai voir le code de ta fonction?
0
Alex SwartzKaiser
 
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 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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
 
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   Statut Contributeur Dernière intervention   177
 
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 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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
Nicolas
 
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