2017-07-27 13 views
-2

Mon fonctionnement du système est la fenêtre, je veux écrire mes données sur un pcm avec 16bit.Here est mon code:C écriture uint16 dans le fichier obtenu Erreur

typedef unsigned short uint16; 
void write2PCM(char* file_path, int length, double* data) { 
FILE* file=NULL; 
file = fopen(file_path, "wb+"); 
for (int i = 0; i < length; i++) { 
    uint16 val=data[i]*10000; 
    uint16 fin_val = (val >> 8 & 0x00ff) | (val << 8 & 0xff00); 
    fwrite(fin_val,sizeof(fin_val),1,file); 
} 

fclose;} 

et quand je l'invoquons, je me suis erreur à la place de fwrite: "Une violation d'accès s'est produite lors de la lecture de l'emplacement 0x ....", Je peux voir le fichier a été créé avec succès, donc je ne sais pas pourquoi cette erreur est survenue.

Répondre

4

N'obtenez-vous vraiment aucun diagnostic ? Chaque avertissement du compilateur C est significative, ils sont généralement des signes d'erreurs graves! En outre, lorsque vous demandez sur Stack Overflow, copiez les diagnostics du compilateur textuellement dans la question.

Le problème est ici:

fwrite(fin_val, sizeof(fin_val), 1, file); 

Le prototype de fwrite est

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 

Le premier argument doit être un pointeur sur const vide, mais vous passez dans un uint16_t. Il devrait être &fin_val, de sorte que fwrite obtienne l'adresse à cette variable.

Sur une note connexe, fclose; n'est pas un appel de fonction, et cela aussi aurait dû produire un message de diagnostic dans tout compilateur sain d'esprit. Il devrait être fclose(file);.

Voici un exemple de sortie de GCC sans avertissement préalable:

% gcc -c pcm.c 
pcm.c: In function ‘write2PCM’: 
pcm.c:10:12: warning: passing argument 1 of ‘fwrite’ makes pointer from integer without a 
      cast [-Wint-conversion] 
    fwrite(fin_val,sizeof(fin_val),1,file); 
      ^~~~~~~ 

et ici avec tous les avertissements activés:

% gcc -c pcm.c -Wall 
pcm.c: In function ‘write2PCM’: 
pcm.c:10:12: warning: passing argument 1 of ‘fwrite’ makes pointer from integer without a 
      cast [-Wint-conversion] 
    fwrite(fin_val,sizeof(fin_val),1,file); 
      ^~~~~~~ 
In file included from pcm.c:1:0: 
/usr/include/stdio.h:717:15: note: expected ‘const void * restrict’ but argument is of 
      type ‘uint16 {aka short unsigned int}’ 
extern size_t fwrite (const void *__restrict __ptr, size_t __size, 
       ^~~~~~ 
pcm.c:13:1: warning: statement with no effect [-Wunused-value] 
fclose;} 
^~~~~~ 
+0

J'utilise vs2017, Il y a juste un message d'erreur: Une violation d'accès s'est produite lors de la lecture de l'emplacement 0x ...., pas waring comme gcc @ _ @! –

+0

@ 马 慧 超 pendant la * compilation *, pas pendant l'exécution du programme. –

+0

@ 马 慧 超 il est absolument nécessaire que vous trouviez où ces diagnostics du compilateur sont sortis et lisez-les attentivement, sinon vous ne programmerez jamais un programme C qui fonctionne! : D –

1

fwrite attend un pointeur vers les données que vous voulez écrire.

Cela fin_val écrire dans le fichier en mode binaire:

fwrite(&fin_val,sizeof(fin_val),1,file); 

Votre compilateur devrait vous avoir averti que vous avez fourni une valeur entière au lieu d'un pointeur. Vous devriez augmenter le niveau d'avertissement de votre compilateur. Si vous utilisez gcc, ajoutez -Wall à la ligne de commande du compilateur.

+0

merci, je ne suis pas très familier avec c, maintenant je sais quel est le problème, Merci beaucoup. –

+0

L'important est d'activer/de mettre en garde les avertissements du compilateur. Cela vous aidera beaucoup dans le futur. Le compilateur peut trouver beaucoup (mais loin de toutes) des erreurs de codage. –

+0

Je m'en souviendrai et je m'améliorerai, mais il y a un petit message d'erreur dans vs mais beaucoup dans gcc .. –