2017-01-11 4 views
0

Je le tableau 2D suivant:C++ - Comment utiliser memmove pour les éléments d'un tableau 2D?

float accumulator[MAX_CHANNELS][2*MAX_FRAME_LENGTH]; 

et je continue à déplacer les blocs de mémoire dans mon code pour chaque canal comme celui-ci:

for (int channel = 0; channel < nChannels; channel++) { 
    memmove(accumulator[channel], accumulator[channel] + stepSize, fftFrameSize * 2 * sizeof(float)); 
} 

Cependant, cela me donne de faux résultats et je ne Je ne comprends pas pourquoi. Quel est le problème avec l'appel memmove que j'utilise?

Sinon, j'ai essayé d'utiliser les tableaux 1D suivants (1 pour chaque canal) à la place et avons obtenu des résultats corrects:

float accumulator1[2*MAX_FRAME_LENGTH]; 
float accumulator2[2*MAX_FRAME_LENGTH]; 

memmove(accumulator1, accumulator1 + stepSize, fftFrameSize * 2 * sizeof(float)); 
memmove(accumulator2, accumulator2 + stepSize, fftFrameSize * 2 * sizeof(float)); 
+2

Qu'est-ce mauvais résultats? Nous avons besoin d'un [MCVE] (http://stackoverflow.com/help/mcve). –

+0

Dans la deuxième partie du code, vous utilisez 2 tableaux. Dans le premier morceau de code, nous n'avons aucune idée de ce qu'est 'MAX_CHANNELS', ou de ce qu'est' nChannels'. Donc, les deux ne sont pas équivalents à moins que vous n'ayez codé '' 2' pour 'MAXCHANNELS' et' nChannels'. Qu'est-ce que – PaulMcKenzie

+0

'' stepSize' et fftFrameSize' provoque l'erreur? De plus, à quoi correspond MAX_FRAME_LENGTH? – Pavel

Répondre

0

Je n'ai pas entrepris tout codage depuis plusieurs années, mais il me semble que peut-être vous avoir un code écrit difficile à suivre logiquement. Ma seule suggestion est de trouver un stylo et du papier tracer une ligne horizontalement à travers le milieu du papier de sorte que vous avez deux sections, représentant chaque bloc de mémoire que vous voulez déplacer. Faites la moitié inférieure du papier pour représenter la SOURCE et la moitié supérieure pour représenter la DESTINATION. Écrivez les lettres A, B et C dans la moitié supérieure verticalement sur le côté. Ensuite, écrivez les chiffres 1, 2 et 3 verticalement sur le côté de la moitié inférieure.

ensuite sur un morceau de papier notez le nom du compteur start « canal » avec la valeur zéro.

Maintenant rayez la lettre A de la destination et de mettre le numéro 1 dans ce lieu = numéro 1 va de la source à la destination A l'écrasement de destination. Maintenant incrémenter le compteur "canal" par 1 sur le morceau de papier séparé. Répétez 2 fois plus cette opération entière. Maintenant voir ce qui est à destination et ce qui reste dans la source et la valeur du « canal » contre cela vous montrera ce qui se passe à l'intérieur de votre ordinateur mémoire et le compteur « canal ». Personnellement serait enclin à réécrire le code de sorte que le deuxième paramètre memmove n'était pas aussi nommé canal. À l'intérieur des crochets. J'espère que cela t'aides. Voici la fonction expliquée http://www.cplusplus.com/reference/cstring/memmove/. Ne pas oublier que la fonction memmove continuera tant que canal est < nChannels. Vous devez écrire les valeurs dans toutes les variables pendant la boucle, pratique standard pour le débogage.