【问题标题】:Array from function to another with dynamic allocating (C)使用动态分配从函数到另一个数组 (C)
【发布时间】:2018-05-07 08:30:58
【问题描述】:

我正在尝试编写以下代码来计算移动平均线。 在“main.c”文件中,我调用了“movingAVG.h”的 2 个函数: 函数 initAVG() 创建一个数组并将所有元素初始化为 0,使用此函数我选择用于平均的 saples 数量。 函数 getAVG() 获取数组,用最新的样本替换最旧的样本并返回计算的平均值。 我需要使用指针数组对偶属性将数组从 initAVG 传递给 getAVG,但我不能这样做,我是 C 新手。我做错了什么? 任何帮助将非常感激。非常感谢!

/* ========================================
 *
MEDIA MOBILE.
 *
 * ========================================
*/

#include "project.h"

uint8 start=0;
uint8 iy; //sample's vector index
uint32 sum=0;
uint32 avg;
uint32 *ptrSamples;

void initAVG(nSample)
{
    uint8 i=0;
    uint32 Samples[nSample];
    ptrSamples = Samples;

    while (i<=nSample)
    {
        Samples[nSample]=0;
        i++;
    }
    start=1;
}

uint32 getAVG(uint8 nSample,uint32 lastvalue)
{
    if (iy<=nSample && start==1)
    {
        sum -= ptrSamples[iy];
        ptrSamples[iy] = lastvalue;
        sum += ptrSamples[iy];
        avg = sum / (nSample + 1);
        if (iy<nSample)
        {
            iy++;
        }else {iy = 0;}
    }
    return avg;
}

/* [] END OF FILE */

编辑: 我尝试对数组使用带有 malloc() 的动态内存分配,但它不起作用。怎么了? 使用 malloc() 分配的内存在退出 initAVG() 函数后是否仍然存在?

#include "project.h"
#include "malloc.h"

uint8 start=0;
uint8 iy; //sample's vector index
uint32 sum=0;
uint32 avg;
uint8 nSample;
uint32* ptrSamples;

void initAVG(numberOfSample)
{
    uint8 i=0;
    nSample=numberOfSample;
    ptrSamples = malloc((nSample+1)*sizeof(uint32)); 

    while (i<=nSample)
    {
        ptrSamples[i]=0;
        i++;
    }
    start=1;
}

uint32 getAVG(uint32 lastvalue)
{
    if (iy<=nSample && start==1)
    {
        sum -= ptrSamples[iy];
        ptrSamples[iy] = lastvalue;
        sum += ptrSamples[iy];
        avg = sum / (nSample + 1);
        if (iy<nSample)
        {
            iy++;
        }else {iy = 0;}
    }
    return avg;
}

【问题讨论】:

  • 看起来您所要做的就是让 Samples 全球化。
  • 在 initAVG 中,您将 ptrSamples 设置为指向局部变量的指针,然后在 getAVG 中使用该指针。那是违法的。试试 mnistic 的建议。

标签: c arrays memory-management malloc heap-memory


【解决方案1】:

您正在函数 initAVG() 中创建数组 Samples,并将数组第一个元素的地址存储在指针 ptrSamples 中。

但是如果你是从main()中调用这些函数,按照下面的顺序作为

initAVG();
getAVG();

Samples 的生命周期仅适用于函数 initAVG() 执行的时间。函数执行后,数组将不在内存中。但是指针仍然指向相同的内存位置。

所以请使数组全局化或为数组分配动态内存。

【讨论】:

  • 如果我将数组 Sample[nSample] 声明为全局,我不能使用变量 nSample 的长度 uint32 Samples[nSample]; 不允许
【解决方案2】:

有效! 我正在开发板上,问题只是设置中的堆大小不足。增加它,代码运行良好。 真的很感谢大家!

#include "project.h"
#include "malloc.h"

uint8 start=0;
uint8 iy; //sample's vector index
uint32 sum=0;
uint32 avg;
uint8 nSample;
uint32* ptrSamples;     //dichiaro un puntatore ad un uint32 chiamato ptrSamples

void initAVG(numberOfSample)
{
    uint8 i=0;
    nSample=numberOfSample;
    ptrSamples = malloc((nSample+1)*sizeof(uint32));      //allòco 255 celle il cui indirizzo della prima sarà memorizzato nel puntatore ptrSamples

    while (i<=nSample)
    {
        ptrSamples[i]=0;    //sfruttando la dualità puntatore-vettore estraggo l'i-esimo valore del vettore corrispondente al puntatore
        i++;
    }
    start=1;
}

uint32 getAVG(uint32 lastvalue)
{
    if (iy<=nSample && start==1)
    {
        sum -= ptrSamples[iy];  
        ptrSamples[iy] = lastvalue;
        sum += ptrSamples[iy];
        avg = sum / (nSample + 1);
        if (iy<nSample)
        {
            iy++;
        }else {iy = 0;}
    }
    return avg;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2017-04-19
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多