Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中对数据数组执行函数_C_Arrays_Function_Element - Fatal编程技术网

如何在C中对数据数组执行函数

如何在C中对数据数组执行函数,c,arrays,function,element,C,Arrays,Function,Element,我试图对一组数据执行一个函数,但我不太确定如何执行 这是我的密码 #include <stdio.h> #include <stdlib.h> #include <stdint.h> #define BUFFER_LEN 10 #define SAMPLE_RATE 48000 #define MAX_DELAY 0.25 int buffer_in[]= {0,1,2,3,4,5,6,7,8,9}; int buffer_out[10]; short

我试图对一组数据执行一个函数,但我不太确定如何执行

这是我的密码

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define BUFFER_LEN 10
#define SAMPLE_RATE 48000
#define MAX_DELAY 0.25


int buffer_in[]= {0,1,2,3,4,5,6,7,8,9};
int buffer_out[10];

short int flanger(float , float , int , short int );

int main(void)
{ 
int j,k,l;

    for (j = 0; j <=BUFFER_LEN; j++){
        buffer_out[j] = flanger(buffer_in[j]);    //this is causing the error
        printf("buffer out value = %d",buffer_out[j]);
        }

return 0;
}
// Flanger function

short int flanger(float range, float delay, int rate, short int inData){

  float flangerDelay; /* stores current delay required for flange effect */
  static int i=0;     /* keeps track of time for creating sweep waveform */
  static float sweepValue=0; /* keeps track of current sweep delay in ms */
  static int sweepFlag=1;    /* keeps track of waveform movement         */
  static int writePtr=0;     /* pointer to newest audio sample in buffer */
  static int readPtr=0;      /* pointer to oldest audio sample in buffer */
  float tmp; /* tmp value to see if dly will point to a position in buff */
  float delayArray[50];

  /* convert rate from Hz to Hz according to current sample rate    */
  /* NOTE: If it does not divise exact, take the integer part only! */

  /* is it time to change waveform? if not, increment counter */
  if (i >= rate) {
    /* has the maximum possible delay for sweep been reached? */
    if (sweepValue >= range)
      sweepFlag = 0; /* start the \ of triangular waveform */
    else if (sweepValue <= 0)
      sweepFlag = 1; /* start the / of triangular waveform */

    /* Is the waveform rising or falling? */
    if (sweepFlag==1)
      sweepValue += 0.001; /* increase sweep delay by .001 ms */
    else
      sweepValue -= 0.001; /* decrease sweep delay by .001 ms */

    /* reset i, to start count before waveform changes shape again */
    i=0;
  }
  else i++;

  /* Calculate the total current to delay (in ms, not samples!) */
  flangerDelay = sweepValue + delay;

  /* calculate delay in samples rather than in time */
  tmp = flangerDelay * 22.4f; //(float)(SAMPLE_RATE/1000);

  //printf("flangerDelay: %f samples: %d\n", flangerDelay, tmp);

  /* Calculate position of the read & write pointers */
  if (writePtr < (int)tmp )
    readPtr = (((SAMPLE_RATE/1000)*MAX_DELAY) - ((int)tmp - writePtr));
  else
    readPtr = writePtr - (int)tmp;

  /* has the write pointer reached end of delay buffer? */
  if (writePtr > ((SAMPLE_RATE/1000)*MAX_DELAY)) 
    writePtr=0;
  else
    writePtr++;

  /* now add current audio sample to array and return oldest sample */
  delayArray[writePtr] = inData;  

  /* is tmp a whole value? i.e. will it point to a sample in the buffer? */
  if (tmp > (int)tmp){
    /* not a whole number! therefore, interpolation is required! */
    if (readPtr == ((SAMPLE_RATE/1000) * MAX_DELAY))
      return((delayArray[readPtr] + delayArray[0])/2);
    else
      return((delayArray[readPtr] + delayArray[readPtr+1])/2);
  }
  else {
    /* is a whole number! therefore, can take straight from buffer! */
    return delayArray[readPtr];
  }

}
我得到了这部分的错误

for (j = 0; j <=BUFFER_LEN; j++){
        buffer_out[j] = flanger(buffer_in[j]);    //this is causing the error
        printf("buffer out value = %d",buffer_out[j]);
        }
基本上我想对buffer\u in中的数据执行函数,然后将结果放入buffer\u out 我把它设置错了吗?
非常感谢你的帮助

您声明flanger函数接受四个参数,但在调用它时只传递一个参数。必须使用正确数量的参数调用它,或者将函数更改为仅接受一个参数。

如果要将数组传递给flanger,必须声明它接受数组:

short int flanger(int aBuffer[]){

相反,您声明它接受4个不同的参数。

您需要这样的参数。但很难进一步说明,因为您的代码似乎离您想要的太远了

void flanger(int buf_out[], int buf_in[], float range, float delay, int rate, short int inData)
也许你只需要:

buffer_out[j] = flanger(range_val, delay_val, rate_val,buffer_in[j])

也许使用struct数组可以更好地为您服务?类似于:应按ANSI C中的原样构建

#include <windows.h>
#include <ansi_c.h>

    typedef struct  {
        float range;
        float delay;
        int rate;
        short inData;
    } PARAMS;

    PARAMS params[10], *pParams;

    void flanger(PARAMS *p);

    void main(void)
    {
        int i;
        pParams = &params[0];

        for(i=0;i<10;i++)
        {
            pParams[i].range = 45.0 + (float)i;
            pParams[i].delay = .003 + (float)i;
            pParams[i].rate = 23 + i;
            pParams[i].inData = 1 + i;
        }


        flanger(pParams);

    }

    void flanger(PARAMS *p)
    {
        //do something with params      
    }
[编辑以显示两个struct*参数] 这应该在ANSI C编译器中生成并运行,只需复制并粘贴:

#include <windows.h>
#include <ansi_c.h>

typedef struct  {
    float range;
    float delay;
    int rate;
    short inData;
} PARAMS;

#define DATESIZE 10

void flanger(PARAMS *o, PARAMS *i);

void main(void)
{
    int i;
    PARAMS out[DATESIZE], *pOut, in[DATESIZE], *pIn;

    pOut = &out[0];
    pIn = &in[0];


    printf("Out Data\n");
    printf("Range    Delay    Rate    InData\n");
    for(i=0;i<DATESIZE;i++)
    {
        pOut[i].range = 45.0 + (float)i;
        pOut[i].delay = .003 + (float)i;
        pOut[i].rate = 23 + i;
        pOut[i].inData = 1 + i;
        printf("%4.2f    %5.3f    %d    %d\n", 
                pOut[i].range,
                pOut[i].delay,
                pOut[i].rate,
                pOut[i].inData);
    }


    flanger(pOut, pIn); 

    printf("In Data\n");
    printf("Range    Delay    Rate    InData\n");
    for(i=0;i<DATESIZE;i++)
    {
        printf("%4.2f    %5.3f    %d    %d\n", 
                pIn[i].range,
                pIn[i].delay,
                pIn[i].rate,
                pIn[i].inData);
    }
    getchar();
}

void flanger(PARAMS *out, PARAMS *in)
{
    int i;
    //process "out", pass back "in"
    for(i=0;i<DATESIZE;i++)
    {
        in[i].range = pow(out[i].range, 2.0); 
        in[i].delay = pow(out[i].delay, 2.0);  
        in[i].rate = pow(out[i].rate, 2.0); 
        in[i].inData = pow(out[i].inData, 2.0);
    }


}

这是导致错误的原因。。。错误到底是什么?您需要将范围、延迟和速率传递给调用以及数组条目。它与数组没有任何关系。请看我的第二个答案。谢谢,但目前我的头脑中还没有结构!好吧,我也去过一次,没问题。但如果您改变主意,我留下的示例代码已经完成,将在ANSIC编译器中构建和运行。可以使用断点在值通过其循环时查看值。使用常规非结构数组要求所有元素的类型相同,结构允许多种类型:谢谢,我明白你的意思了。是否有可能通过上述代码传递一个样本数组,并获得一个有效样本数组作为结果?是的,这就是结构数组的真正威力。他们作为指挥员很容易传球。我在上面留下的例子是一个如何为你的要求设置的例子,我认为。我将用新代码编辑我的答案,类似于第一个代码,但显示如何使用同一结构的单独副本来包含原始值和修改后的值。请记住,您也可以只传递一个,让函数修改其值,当函数返回时,结构将包含修改后的值。非常感谢这段代码,它运行没有问题,我可以看到数据结果。我现在需要研究它,了解它是如何工作的,然后尝试通过它来推动我自己的价值观——它只是在我接受它的那一刻推动随机值?谢谢