memset用法 & int、long long、float、double 的极值怎么清

memset用法 & int、long long、float、double 的极值怎么清

memset 是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部(以字节为单位)设置为指定的值。在竞赛中,常用来进行数组的初始化。

memset 函数原型定义如下:

// 函数解释:将 ptr 中当前位置后面的 num 个字节用 value 替换并返回 ptr
// 其中,size_t 其实就是  unsigned int
void * memset ( void * ptr, int value, size_t num );

Copy

正因为 memset 函数是以字节为单位赋值的,所以使用它并不能将数组元素修改为任意值,而竞赛中又常常需要将数组初始化为 0、最大值或最小值。写循环赋值的话,也不是不可以,不过显得不那么“优雅”,针对这一点,下面整理了使用 memset 实现数组初始化的一些常用方法。

1、memset 可以对 字符数组 进行赋值吗?

可以的,比如将字符数组 s 全部初始化为 ‘#’ 字符,就可以使用下面的方法:memset(s, '#', sizeof s); 。不过使用memset 对 字符 进行赋值很少使用,除了在一些字符迷宫搜索类的题目外。

需要注意:memset 无法对 string 字符串进行赋值!想对字符串进行赋值,请使用 string.resize() 函数。

2、memset 对 布尔型数组 进行赋值吗?

INT_MAX=2^{31}-1231−1=2147483647

INT_MIN=-2^{31}−231=-2147483648

”较大/小“的优点:加法不爆。

int</

//#include &quot;LPC177x_8x.h&quot; // Device header #include &quot;includes.h&quot; typedef struct { float k; // 需要存储 float zero_trace; // 零点追踪 float Loading_coef; // 加载值 float zero_coef; // 零点值 需要存储 float NetWeight_coef; // 去皮标定值 uint16_t wen_flag; // 大于10表示稳定 float weight; // 重量g float weight_Last; // 上次重量g uint32_t weight_show; // 显示重量 uint32_t weight_show_Last; // 显示重量 uint32_t ADC_VALUE_Last; // 上一次AD差分值 uint32_t ADC_VALUE; // 本次AD差分值 uint8_t Symbol; // 符号 1为负,0为正 uint32_t magnification; // 放大倍数 uint8_t coff; // 一级滤波强度 uint8_t Blance_Abnormal; // 传感器异常标志 uint8_t Valve_change; // 电磁阀状态改变 } ADS1232; extern ADS1232 ADS_coef; //初始化 void ADS1232_init(); // 零点标记 uint8_t zero_calibration(); //加载标定 uint8_t Loading_calibration(uint32_t loading_value); uint32_t Read_Ads1232(uint8_t Calibration); void ADS1232_Processing(uint8_t Calibration); /* ADS1232 配置增益 #define GainX1 GAIN0_0;GAIN1_0; #define GainX2 GAIN0_1;GAIN1_0; #define GainX64 GAIN0_0;GAIN1_1; 目前使用 #define GainX128 GAIN0_1;GAIN1_1; */ uint16_t trace_s; uint8_t FirstUp; uint32_t liu_wen; uint8_t liu_count; uint8_t big_count; ADS1232 ADS_coef; extern struct COM com4; extern struct BALANCEDATA BaData; INT8U Amountadding[10];//质量变化数组//ly20241104 #define WINDOW_SIZE_MAX 20 #define WINDOW_LEISURE_SIZE 12 #define WINDOW_FILL 3 #define WINDOW_CARDINAL 6 #define ADCa_t 1 #define FIXED_VALUE (214748364.8 / 2 / 5) #define SAMPLE_RATE_HZ 80 // ADC采样率 #define FILTER_CUTOFF_HZ 15 // 滤波器截止频率 #define M_PI 3.14159265358979323846f // 单精度浮点版本 // 平滑窗口结构体定义 typedef struct { uint32_t buffer[WINDOW_SIZE_MAX]; // 窗口数据存储 uint8_t index; // 当前写入位置 uint32_t sum; // 窗口数据总和 uint32_t mean; // 窗口数据取极值平均值 uint32_t window_number; // 窗口个数 uint8_t WINDOW_SIZE; // 采集个数 uint8_t EXCLUDE_NUM; // 去除最大/最小值数量 } SlidingFilter; SlidingFilter SF; SlidingFilter SF_W; // IIR滤波器结构体 typedef struct { float alpha; float prev_output; } IIR_Filter; IIR_Filter weight_filter; // IIR滤波器实例 IIR_Filter fill_filter; // 观测维度定义为1(仅AD测量值) #define OBS_DIM 1 // 状态维度:假设我们估计的是重量值及其变化率(速度) #define STATE_DIM 2 #define WINDOW 10 // 自适应参数结构体 typedef struct { double lambda; // 遗忘因子(0.95~0.99) double rho; // 衰减因子(0.95~0.99) double Q_scale; // Q调整基准值 double R_scale; // R调整基准值 double innov_mean; // 新息均值 double innov_var; // 新息方差 double innov_window[WINDOW]; // 新息窗口 int innov_index; // 窗口索引 // 保存基准噪声值 double R_base; // 初始观测噪声基准值 double Q_pos_base; // 初始位置过程噪声基准值 double Q_vel_base; // 初始速度过程噪声基准值 // 新增:稳定性控制参数 double dead_zone; // 死区阈值 double stable_innov_thresh; // 稳定状态新息阈值 double dynamic_innov_thresh; // 动态状态新息阈值 double max_Q_scale; // 最大Q缩放 double max_R_scale; // 最大R缩放 uint32_t stable_count; // 稳定状态计数 uint8_t is_stable; // 是否处于稳定状态 double velocity_threshold; // 速度阈值判断稳定 double last_velocity; // 上次速度 double stability_factor; // 稳定性因子 } AdaptParams; // 强跟踪滤波器结构体 typedef struct { double x[STATE_DIM]; // 状态向量 [位置, 速度] double P[STATE_DIM][STATE_DIM]; // 状态协方差矩阵 double Q[STATE_DIM][STATE_DIM]; // 过程噪声协方差 double R; // 观测噪声协方差 double F[STATE_DIM][STATE_DIM]; // 状态转移矩阵 double H[OBS_DIM][STATE_DIM]; // 观测矩阵 AdaptParams adapt; // 自适应参数 int steady_state; // 稳态标志 (0:动态 1:稳态) uint32_t steady_count; // 稳态计数器 } ASTKF; ASTKF filter; uint32_t uabs_diff(uint32_t value1, uint32_t value2) { return (value1 &gt;= value2) ? (value1 - value2) : (value2 - value1); } /** *一阶滤波算法 *@param new_value 新采样值 *@param old_value 上次滤波结果 *@param cof(一级滤波系数cof / 256) *@return 本次滤波结果 */ uint32_t first_filter(uint32_t new_value, uint32_t old_value, uint8_t cof) { unsigned long temp; if (new_value &lt; old_value) { temp = old_value - new_value; temp = temp * cof / 256; temp = old_value - temp; } else if (new_value &gt; old_value) { temp = new_value - old_value; temp = temp * cof / 256; temp = old_value + temp; } else { temp = old_value; } return temp; } // 高级滑动滤波器 int compare_floats(const void *a, const void *b) { return *(uint32_t *)a &gt; *(uint32_t *)b ? 1 : -1; } float advanced_sliding_filter(SlidingFilter *SF_t) { uint32_t sorted[SF_t-&gt;WINDOW_SIZE]; // 排序去极值 memset(sorted, 0, sizeof(sorted)); memcpy(sorted, SF_t-&gt;buffer, sizeof(sorted)); qsort(sorted, SF_t-&gt;WINDOW_SIZE, sizeof(uint32_t), compare_floats); SF_t-&gt;sum = 0; for (int i = SF_t-&gt;EXCLUDE_NUM; i &lt; SF_t-&gt;WINDOW_SIZE - SF_t-&gt;EXCLUDE_NUM; i++) { SF_t-&gt;sum += sorted[i]; } SF_t-&gt;mean = (SF_t-&gt;sum / (SF_t-&gt;WINDOW_SIZE - 2 * SF_t-&gt;EXCLUDE_NUM)); //SF_t.mean = division_value(SF_t.mean); return SF_t-&gt;mean; } // IIR滤波器实现 void IIR_Filter_Init(IIR_Filter *filter, float alpha) { filter-&gt;alpha = alpha; filter-&gt;prev_output = 0.0f; } float IIR_Filter_Update(IIR_Filter *filter, float input) { // 根据重量变化率动态调整截止频率 if (0 &gt; (ADS_coef.weight * ADS_coef.weight_Last)) { float delta_weight = fabsf(ADS_coef.weight - ADS_coef.weight_Last); float dynamic_cutoff = FILTER_CUTOFF_HZ * (1.0 - fminf(0.7, delta_weight / 100.0)); filter-&gt;alpha = 1.0f - expf(-2 * M_PI * dynamic_cutoff / SAMPLE_RATE_HZ); } filter-&gt;prev_output = filter-&gt;alpha * input + (1.0f - filter-&gt;alpha) * filter-&gt;prev_output; return filter-&gt;prev_output; } // 初始化滤波器 void astkf_init(ASTKF *filter, double init_pos, double init_vel, double q_pos, double q_vel, double r) { int i, j, k; memset(filter, 0, sizeof(ASTKF)); // 初始状态 filter-&gt;x[0] = init_pos; filter-&gt;x[1] = init_vel; // 状态协方差初始化 for (i = 0; i &lt; STATE_DIM; i++) { for (j = 0; j &lt; STATE_DIM; j++) { filter-&gt;P[i][j] = 0.0; } } filter-&gt;P[0][0] = 0.1; filter-&gt;P[1][1] = 0.01; // 过程噪声协方差 Q filter-&gt;Q[0][0] = q_pos; filter-&gt;Q[1][1] = q_vel; // 观测噪声协方差 R filter-&gt;R = r; // 状态转移矩阵 F(假设匀速模型) filter-&gt;F[0][0] = 1.0; filter-&gt;F[0][1] = 0.0125; // dt = 0.0125 filter-&gt;F[1][0] = 0.0; filter-&gt;F[1][1] = 1.0; // 观测矩阵 H filter-&gt;H[0][0] = 1.0; filter-&gt;H[0][1] = 0.0; // 新增自适应参数初始化 filter-&gt;adapt.lambda = 0.97; filter-&gt;adapt.rho = 0.98; filter-&gt;adapt.Q_scale = 1.0; filter-&gt;adapt.R_scale = 1.0; filter-&gt;adapt.innov_mean = 0.0; filter-&gt;adapt.innov_var = 1.0; filter-&gt;adapt.innov_index = 0; for (int i = 0; i &lt; WINDOW; i++) { filter-&gt;adapt.innov_window[i] = 0.0; } filter-&gt;adapt.R_base = r; filter-&gt;adapt.Q_pos_base = q_pos; filter-&gt;adapt.Q_vel_base = q_vel; filter-&gt;steady_state = 1; // 初始设为稳态 filter-&gt;steady_count = 0; // 稳态计数器零 // 稳定性控制参数 filter-&gt;adapt.dead_zone = 50.0; // 根据您的AD值波动设置 filter-&gt;adapt.stable_innov_thresh = 2.5; // 提高稳定状态阈值 filter-&gt;adapt.dynamic_innov_thresh = 4.0; // 提高动态状态阈值 filter-&gt;adapt.max_Q_scale = 2.0; // 降低最大缩放限制 filter-&gt;adapt.max_R_scale = 1.5; filter-&gt;adapt.stable_count = 0; filter-&gt;adapt.is_stable = 1; filter-&gt;adapt.velocity_threshold = 15.0; filter-&gt;adapt.last_velocity = 0.0; filter-&gt;adapt.stability_factor = 1.0; } // 预测步骤 void astkf_predict(ASTKF *filter) { int i, j, k; // 临时变量 double temp[STATE_DIM] = {0}; double FP[STATE_DIM][STATE_DIM] = {{0}}; double P_new[STATE_DIM][STATE_DIM] = {{0}}; // 状态预测: x = F * x for (i = 0; i &lt; STATE_DIM; i++) { for (j = 0; j &lt; STATE_DIM; j++) { temp[i] += filter-&gt;F[i][j] * filter-&gt;x[j]; } } // 协方差预测: FP = F * P for (i = 0; i &lt; STATE_DIM; i++) { for (j = 0; j &lt; STATE_DIM; j++) { for (k = 0; k &lt; STATE_DIM; k++) { FP[i][j] += filter-&gt;F[i][k] * filter-&gt;P[k][j]; } } } // P_new = FP * F^T + Q for (i = 0; i &lt; STATE_DIM; i++) { for (j = 0; j &lt; STATE_DIM; j++) { for (k = 0; k &lt; STATE_DIM; k++) { P_new[i][j] += FP[i][k] * filter-&gt;F[j][k]; } P_new[i][j] += filter-&gt;Q[i][j]; // 添加过程噪声 } } // 更新状态和协方差 for (i = 0; i &lt; STATE_DIM; i++) { filter-&gt;x[i] = temp[i]; for (j = 0; j &lt; STATE_DIM; j++) { filter-&gt;P[i][j] = P_new[i][j]; } } } // 更新新息统计信息 void update_innovation_statistics(ASTKF *filter, double innovation) { int i; // 更新滑动窗口 filter-&gt;adapt.innov_window[filter-&gt;adapt.innov_index] = innovation; filter-&gt;adapt.innov_index = (filter-&gt;adapt.innov_index + 1) % WINDOW; // 计算窗口内的新息均值和方差 double sum = 0.0; double sq_sum = 0.0; int actual_count = 0; for (i = 0; i &lt; WINDOW; i++) { if (filter-&gt;adapt.innov_window[i] != 0.0) // 跳过未初始化的值 { sum += filter-&gt;adapt.innov_window[i]; sq_sum += filter-&gt;adapt.innov_window[i] * filter-&gt;adapt.innov_window[i]; actual_count++; } } if (actual_count &gt; 0) { // 使用指数加权平均更新统计量 double mean = sum / actual_count; double var = (sq_sum / actual_count) - (mean * mean); // 应用遗忘因子 filter-&gt;adapt.innov_mean = filter-&gt;adapt.lambda * filter-&gt;adapt.innov_mean + (1 - filter-&gt;adapt.lambda) * mean; filter-&gt;adapt.innov_var = filter-&gt;adapt.lambda * filter-&gt;adapt.innov_var + (1 - filter-&gt;adapt.lambda) * var; } } // 改进的稳定性检测 void update_stability_detection(ASTKF *filter, double innovation) { double current_velocity = fabs(filter-&gt;x[1]); double velocity_change = fabs(current_velocity - filter-&gt;adapt.last_velocity); // 多重稳定性判断条件 int velocity_stable = (current_velocity &lt; filter-&gt;adapt.velocity_threshold); int velocity_change_stable = (velocity_change &lt; 5.0); // 速度变化小 int innovation_stable = (fabs(innovation) &lt; filter-&gt;adapt.dead_zone * 1.5); if (velocity_stable &amp;&amp; velocity_change_stable &amp;&amp; innovation_stable) { filter-&gt;adapt.stable_count++; if (filter-&gt;adapt.stable_count &gt; 25) // 需要更长的稳定时间 { filter-&gt;adapt.is_stable = 1; // 稳定状态下降低自适应灵敏度 filter-&gt;adapt.stability_factor = 0.3; } } else { filter-&gt;adapt.stable_count = 0; filter-&gt;adapt.is_stable = 0; filter-&gt;adapt.stability_factor = 1.0; // 动态状态下正常灵敏度 } filter-&gt;adapt.last_velocity = current_velocity; } // 更新步骤(带自适应强跟踪机制) void astkf_update(ASTKF *filter, double z) { int i, j; // 计算新息(观测残差) double innovation = z - (filter-&gt;H[0][0] * filter-&gt;x[0] + filter-&gt;H[0][1] * filter-&gt;x[1]); // 更新稳定性检测 update_stability_detection(filter, innovation); // 死区处理 - 统一忽略小波动 if (fabs(innovation) &lt; filter-&gt;adapt.dead_zone) { innovation = innovation * 0.1; // 小波动时大幅减弱影响,但不完全忽略 } // 更新新息统计信息 update_innovation_statistics(filter, innovation); // 计算新息协方差 S = H * P * H^T + R double S = 0.0; for (i = 0; i &lt; STATE_DIM; i++) { double temp = 0.0; for (j = 0; j &lt; STATE_DIM; j++) { temp += filter-&gt;H[0][j] * filter-&gt;P[j][i]; } S += temp * filter-&gt;H[0][i]; } S += filter-&gt;R; // ===== 统一强度的强跟踪因子 ===== double beta = 1.0; double innov_std = sqrt(filter-&gt;adapt.innov_var + 1e-6); double innov_size = fabs(innovation); // 统一阈值策略 double innov_thresh = filter-&gt;adapt.is_stable ? filter-&gt;adapt.stable_innov_thresh : filter-&gt;adapt.dynamic_innov_thresh; // 更保守且统一的强跟踪触发 if (innov_size &gt; innov_thresh * innov_std) { // 使用平滑的beta调整,避免突变 double excess_ratio = (innov_size - innov_thresh * innov_std) / (innov_thresh * innov_std); excess_ratio = fmin(excess_ratio, 2.0); // 限制最大超出比例 beta = 1.0 / (1.0 + 0.3 * excess_ratio); // 平滑调整 beta = fmax(beta, 0.3); // 设置最小beta限制 } // ===== 统一的自适应调整策略 ===== double innovation_ratio = innov_size / (innov_std + 1e-6); // 统一的Q调整策略 if (innovation_ratio &gt; innov_thresh &amp;&amp; !filter-&gt;adapt.is_stable) { // 使用稳定性因子降低调整灵敏度 double adjust_step = 0.05 * filter-&gt;adapt.stability_factor * (innovation_ratio - innov_thresh); filter-&gt;adapt.Q_scale += adjust_step; filter-&gt;adapt.Q_scale = fmin(filter-&gt;adapt.Q_scale, filter-&gt;adapt.max_Q_scale); } else { // 统一的恢复策略 filter-&gt;adapt.Q_scale *= filter-&gt;adapt.rho; filter-&gt;adapt.Q_scale = fmax(filter-&gt;adapt.Q_scale, 1.0); } // 应用统一的Q调整 filter-&gt;Q[0][0] = filter-&gt;adapt.Q_scale * filter-&gt;adapt.Q_pos_base; filter-&gt;Q[1][1] = filter-&gt;adapt.Q_scale * filter-&gt;adapt.Q_vel_base; // 统一的R调整策略 - 更加保守 if (filter-&gt;adapt.innov_var &gt; 2.0 * S &amp;&amp; !filter-&gt;adapt.is_stable) { double r_factor = 1.0 + 0.05 * (filter-&gt;adapt.innov_var / S - 2.0); filter-&gt;R = fmin(r_factor * filter-&gt;adapt.R_base, filter-&gt;adapt.max_R_scale * filter-&gt;adapt.R_base); } else { // 统一使用基准R值 filter-&gt;R = filter-&gt;adapt.R_base; } // ===== 卡尔曼滤波更新 ===== // 计算卡尔曼增益 K = P * H^T / S double K[STATE_DIM] = {0}; for (i = 0; i &lt; STATE_DIM; i++) { for (j = 0; j &lt; STATE_DIM; j++) { K[i] += filter-&gt;P[i][j] * filter-&gt;H[0][j]; } K[i] /= S; } // 更新状态 x = x + beta * K * innovation for (i = 0; i &lt; STATE_DIM; i++) { filter-&gt;x[i] += beta * K[i] * innovation; } // 更新协方差 P = (I - beta * K * H) * P double KH[STATE_DIM][STATE_DIM] = {{0}}; for (i = 0; i &lt; STATE_DIM; i++) { for (j = 0; j &lt; STATE_DIM; j++) { KH[i][j] = K[i] * filter-&gt;H[0][j]; } } double I_minus_betaKH[STATE_DIM][STATE_DIM] = {{0}}; for (i = 0; i &lt; STATE_DIM; i++) { for (j = 0; j &lt; STATE_DIM; j++) { I_minus_betaKH[i][j] = (i == j ? 1.0 : 0.0) - beta * KH[i][j]; } } double P_new[STATE_DIM][STATE_DIM] = {{0}}; for (i = 0; i &lt; STATE_DIM; i++) { for (j = 0; j &lt; STATE_DIM; j++) { for (int k = 0; k &lt; STATE_DIM; k++) { P_new[i][j] += I_minus_betaKH[i][k] * filter-&gt;P[k][j]; } } } // 保存更新后的协方差 for (i = 0; i &lt; STATE_DIM; i++) { for (j = 0; j &lt; STATE_DIM; j++) { filter-&gt;P[i][j] = P_new[i][j]; } } } uint32_t division_value(uint32_t AD) { uint32_t i = 0; i = AD / 25; return i * 25; } uint32_t division_value50(uint32_t AD) { uint32_t i = 0; i = AD / 50; return i * 50; } unsigned long i_us; unsigned long AD_dat = 0x00; /******************************************************************************* 函数:Read_Ads1232() 功能: 从ADS1232芯片中读取24位数据值(3字节) 参数: Calibration 返回: AD_dat *******************************************************************************/ unsigned long read_Ads1232(uint8_t Calibration) // 读取数值,并校准 { unsigned char x = 0; AD_dat = 0x00; ADS_SCLK_L; // SCLK_L while (ADS_DOUT_Read) { i_us++; delay_us(100); if (i_us &gt; 0x1ffff) return 0; } // 等待数据线拉低,表示可以读取数据 for (x = 0; x &lt; 24; x++) // 连续读取24位数据 { AD_dat &lt;&lt;= 1; // 左移 1位 ADS_SCLK_H; // SCLK_H delay_us(10); ADS_SCLK_L; // SCLK_Ladvanced if (ADS_DOUT_Read) // 获取数据口线的值 { AD_dat |= 0x00000001; } else { AD_dat &amp;= 0xfffffffe; } delay_us(10); } if (Calibration) // 增加一个脉冲,芯片校准 { ADS_SCLK_H; // SCLK_H delay_us(10); ADS_SCLK_L; // SCLK_L } return division_value50(AD_dat &amp; 0x00ffffff); // 防止数据溢出 // return (AD_dat&amp;0x00ffffff);//防止数据溢出 } // 将AD值转换为差分电压并放大ADS_coef.precision倍 uint32_t ADtoDiffVolt(uint32_t AD_Data) { return (AD_Data / FIXED_VALUE) * ADS_coef.magnification; } // 将差分电压与零点之差计算重量单位g float DiffVoltTOg(uint32_t DiffVolt) { float NetZero = (ADS_coef.zero_coef + ADS_coef.NetWeight_coef); uint32_t AD_Diff = (DiffVolt &gt;= NetZero) ? (DiffVolt - NetZero) : (NetZero - DiffVolt); if (DiffVolt &gt;= NetZero) { ADS_coef.Symbol = 0x00; //正值 BaData.TotalSymbol = 0x00; BaData.NetSymbol = 0x00; } else { ADS_coef.Symbol = 0x01; //负值 BaData.TotalSymbol = 0x01; BaData.NetSymbol = 0x01; } return ADS_coef.k * AD_Diff; } // 返回值为差分电压放大值 uint32_t Read_Ads1232(uint8_t Calibration) { static uint8_t diff_cont; static uint8_t i = 0; static uint8_t index_last = 0; static uint8_t window_size; static uint8_t fluctuate_num; uint32_t temp; uint32_t ADTemp; if (Filling.State == FUELING) //加注中 { window_size = WINDOW_FILL; SF.EXCLUDE_NUM = 0; if (SF.WINDOW_SIZE &gt; window_size * 4) SF.WINDOW_SIZE = window_size; } else { window_size = WINDOW_CARDINAL; SF.EXCLUDE_NUM = 1; } // 更新数据缓冲区 temp = read_Ads1232(Calibration); temp = IIR_Filter_Update(&amp;fill_filter, (float)temp); // 过滤特大跳动 if (SF.buffer[index_last] != 0 &amp;&amp; uabs_diff(temp, SF.buffer[index_last]) &gt; ((SF.buffer[index_last] - ADS_coef.zero_coef) / 3)) //本次与上一次之差大于上一次与零点之差的1/3 { //空闲稳定状态是重量异常跳动,连续3次才使用 if (Filling.State == IDLE &amp;&amp; ADS_coef.wen_flag &gt; 0xf) { fluctuate_num++; if (fluctuate_num &lt; 6) temp = SF.buffer[index_last]; } //加注状态重量异常跳动使用上一次的值 else if (Filling.State != IDLE) { temp = SF.buffer[index_last]; } else fluctuate_num = 0; } if (i == 0)// 第一个根据情况赋值 { if (uabs_diff(ADtoDiffVolt(temp), ADS_coef.ADC_VALUE_Last) &gt; (0x500)) // 电压差分值变化大 { diff_cont++; if(diff_cont &lt; 3) { SF.buffer[SF.index] = SF.buffer[index_last]; SF.EXCLUDE_NUM += 1; } else { diff_cont = 0; SF.buffer[SF.index] = temp; SF.WINDOW_SIZE = window_size; SF.index = 0; } } else { diff_cont = 0; if (SF.WINDOW_SIZE == window_size) { SF.index = window_size; SF.buffer[window_size] = temp; SF.WINDOW_SIZE = window_size * 2; } else if (SF.WINDOW_SIZE == window_size * 2) { SF.index = window_size * 2; SF.buffer[window_size * 2] = temp; SF.WINDOW_SIZE = window_size * 3; } else { SF.buffer[SF.index] = temp; if (Filling.State == FUELING) SF.EXCLUDE_NUM = 2; else SF.EXCLUDE_NUM = 3; } } } else // 其他 { if (uabs_diff(temp, SF.buffer[index_last]) &gt; (0x700) &amp;&amp; uabs_diff(ADtoDiffVolt(temp), ADS_coef.ADC_VALUE_Last) &gt; (0x350)) { diff_cont++; if(diff_cont &lt; 6) { SF.buffer[SF.index] = SF.buffer[index_last]; } else { diff_cont = 0; SF.buffer[SF.index] = temp; } } else { diff_cont = 0; SF.buffer[SF.index] = first_filter(temp, SF.buffer[index_last], ADS_coef.coff); } } if ((SF.buffer[SF.index] &gt;= 0x3FFFFF) || (temp &lt;= 0X200)) // 改为传感器异常?? { ADS_PDWN_L; // PDWN_L delay_us(20); ADS_PDWN_H; // PDWN_H delay_ms(50); // 去电复位 SF.buffer[SF.index] = read_Ads1232(Calibration); if (SF.buffer[SF.index] &gt;= 0x3FFFFF || SF.buffer[SF.index] &lt;= 0X200) // 传感器异常 { ADS_coef.Blance_Abnormal = 1; SetBit((uint8 *)&amp;FillAlarm.STS, 6, 0); // 6-称传感器异常 } } else { ADS_coef.Blance_Abnormal = 0; } index_last = SF.index; SF.index = (SF.index + 1) % SF.WINDOW_SIZE; if (i &gt;= (window_size - 1) &amp;&amp; ADS_coef.k &gt; 0.0f &amp;&amp; ADS_coef.k &lt; 1.0f) ADS1232_Processing(Calibration); i = (i + 1) % window_size; if (ADS_coef.k &lt; 0.0f || ADS_coef.k &gt; 1.0f) SetBit((uint8 *)&amp;FillAlarm.STS, 4, 0); // 6-电子秤标定异常 //预测与更新 astkf_predict(&amp;filter); astkf_update(&amp;filter, (double)ADtoDiffVolt(SF.buffer[index_last])); if (filter.x[0] != 0) return filter.x[0]; else return ADtoDiffVolt(SF.buffer[index_last]); } // 零点标记 uint8_t zero_calibration() { LPC_GPIOINT-&gt;IO2IntEnF &amp;= (~ADS_DOUT);//禁止ADS_DOUT中断 uint8_t i = 0; FillFlag.ZeroBiaoding = 4; // 标记中 ADS_coef.zero_coef = 0x00; for (i = 0; i &lt; 90; i++) { ADS_coef.ADC_VALUE_Last = Read_Ads1232(ADCa_t); if (ADS_coef.zero_coef == 0x00) { ADS_coef.zero_coef = ADS_coef.ADC_VALUE_Last; } else { ADS_coef.zero_coef = (ADS_coef.zero_coef + ADS_coef.ADC_VALUE_Last) / 2; } } ADS_coef.zero_trace = ADS_coef.zero_coef; if (1 != ADS_coef.Blance_Abnormal) { ADS_coef.NetWeight_coef = 0; //FillPara.ADS1232_zero = ADS_coef.zero_coef; FillFlag.ZeroBiaoding = 2; // 标定成功 Write_ADS1232(); // 保存 LPC_GPIOINT-&gt;IO2IntEnF |= ADS_DOUT;//启用ADS_DOUT中断 return 2; } else { LPC_GPIOINT-&gt;IO2IntEnF |= ADS_DOUT;//启用ADS_DOUT中断 return 3; } } // 加载标记 uint8_t Loading_calibration(uint32_t loading_value) { uint8_t i = 0; LPC_GPIOINT-&gt;IO2IntEnF &amp;= (~ADS_DOUT);//禁止ADS_DOUT中断 for (i = 0; i &lt; 90; i++) { ADS_coef.ADC_VALUE_Last = Read_Ads1232(ADCa_t); if (ADS_coef.Loading_coef == 0x00) { ADS_coef.Loading_coef = ADS_coef.ADC_VALUE_Last; } else { ADS_coef.Loading_coef = (ADS_coef.Loading_coef + ADS_coef.ADC_VALUE_Last) / 2; } } // 计算k值 ADS_coef.k = ((float)(loading_value * 10) / (ADS_coef.Loading_coef - ADS_coef.zero_coef)); if (ADS_coef.k &gt; 0.0f &amp;&amp; ADS_coef.k &lt; 1.0f &amp;&amp; 1 != ADS_coef.Blance_Abnormal) { ClrBit((uint8*)&amp;FillAlarm.STS, 4); //FillPara.ADS1232_k = (ADS_coef.k * 1000000000); Write_ADS1232(); // 保存 LPC_GPIOINT-&gt;IO2IntEnF |= ADS_DOUT;//启用ADS_DOUT中断 return 2; // 标定成功 } else { SetBit((uint8 *)&amp;FillAlarm.STS, 4, 0); //电子秤标定异常 LPC_GPIOINT-&gt;IO2IntEnF |= ADS_DOUT;//启用ADS_DOUT中断 return 3; // 标定失败 } } //去皮标定 uint8_t NetWeight_calibration() { uint8_t i = 0; float NetTemp; for (i = 0; i &lt; 90; i++) { ADS_coef.ADC_VALUE_Last = Read_Ads1232(ADCa_t); if (NetTemp == 0x00) { NetTemp = ADS_coef.ADC_VALUE_Last; } else { NetTemp = (NetTemp + ADS_coef.ADC_VALUE_Last) / 2; } } ADS_coef.NetWeight_coef = NetTemp - ADS_coef.zero_coef; } void FillingStream() { char Temp, i; INT32U temp1; INT8U TotalOffset; if ((Filling.State == FUELING) &amp;&amp; (BaData.TotalSymbol == 0)) //ly20240410 zxl20241210 { //计算加注速率 if (FillFlag.ReadBalanceTimes &lt; 50) { FillFlag.ReadBalanceTimes++; } FillFlag.Readflag = 0; Temp = (Filling.TotalWeight&gt;Filling.OldTotalWeight)?(Filling.TotalWeight-Filling.OldTotalWeight):0;//uabs_diff(Filling.TotalWeight, Filling.OldTotalWeight); //ly20241218 if ((Filling.PotType == FORTY_EIGHTKG) || (Filling.PotType == FIVTYKG)) //ly20250107 { TotalOffset = 80; } else { TotalOffset = 50; } if (Temp &gt; 0) { if ((Temp &lt; TotalOffset) || (FillFlag.Calculateflag == 0) || (FillFlag.ReadBalanceTimes &lt; 30)) //ly20241221 { Amountadding[FillFlag.Index] = Temp; FillFlag.OldAddTotal = Temp; Filling.OldTotalWeight = Filling.TotalWeight; Filling.TotalAbnormalTimes = 0; } else { Filling.TotalAbnormalTimes++;//ly20241221 if (Filling.TotalAbnormalTimes &lt; 4) { Filling.TotalWeight = Filling.OldTotalWeight; //ly20241220 Amountadding[FillFlag.Index] = FillFlag.OldAddTotal; Filling.OldTotalWeight += FillFlag.OldAddTotal; } else { Filling.State = SUSPEND; //保存数据 DCF_OUT_CTRL(DCF_V1, OFF); //关阀 DCF_OUT_CTRL(DCF_V2, OFF); //关阀 ADS_coef.Valve_change = VALUE_VIBRATION; WriteWork_status(SUSPEND); LogDispose(&quot;Goto Suspend4 \n&quot;, strlen(&quot;Goto Suspend4 \n&quot;)); show.dislist = 59; Filling.Abnormalstopflag = 1; //ly20240920 Filling.TotalAbnormalTimes = 0; } } } else { Filling.OldTotalWeight = Filling.TotalWeight; Amountadding[FillFlag.Index] = 0x00; } FillFlag.Index++; if (FillFlag.Index &gt;= 10) { FillFlag.Calculateflag = 1; FillFlag.Index = 0; } if (FillFlag.Calculateflag == 1) //ly20241104 { temp1 = 0; for (i = 0; i &lt; 10; i++) { temp1 += Amountadding[i]; } Filling.FillingSpeed = temp1 * 5; //计算流速平均值标识Ng/600ms流速 if (Filling.FillingSpeed &gt; Filling.FillingMaxSpeed) { Filling.FillingMaxSpeed = Filling.FillingSpeed; } if (Filling.FillingSpeed &gt; 350) { Filling.FillingSpeed = Filling.FillingoldSpeed; } else { Filling.FillingoldSpeed = Filling.FillingSpeed; } } if (Filling.State == FUELING) { FuelingOperation(); } } } uint32_t WeightShow_10(float weight) { uint32_t show_value = weight / 10; uint8_t units_digit = (uint32_t)weight % 10; if (0 == show_value &amp;&amp; units_digit &lt; 8) { ADS_coef.weight_show = show_value * 10; } else { if (units_digit &gt;= 5) { ADS_coef.weight_show = (show_value + 1) * 10; } else { ADS_coef.weight_show = show_value * 10; } } Filling.TotalWeight = ADS_coef.weight_show / 10; BaData.TotalWeight = ADS_coef.weight_show / 10; BaData.LastData = BaData.TotalWeight; Filling.NetWeight = ADS_coef.weight_show / 10; BaData.NetWeight = ADS_coef.weight_show / 10; FillingStream(); BaData.DataUpdateflag = 1; } uint32_t WeightShow_20(float weight) { uint32_t show_value = weight / 20; uint8_t units_digit = (uint32_t)weight % 20; if (weight &gt; 15 &amp;&amp; ADS_coef.wen_flag &gt;= 30 &amp;&amp; (fabsf(weight - ADS_coef.weight_show) &lt; 15)) {} else { if (0 == show_value &amp;&amp; units_digit &lt; 15) { ADS_coef.weight_show = show_value * 20; } else { if (units_digit &gt;= 10) { ADS_coef.weight_show = (show_value + 1) * 20; } else { ADS_coef.weight_show = show_value * 20; } } } Filling.TotalWeight = ADS_coef.weight_show / 10; BaData.TotalWeight = ADS_coef.weight_show / 10; BaData.LastData = BaData.TotalWeight; Filling.NetWeight = ADS_coef.weight_show / 10; BaData.NetWeight = ADS_coef.weight_show / 10; FillingStream(); BaData.DataUpdateflag = 1; } // 初始化 void ADS1232_init() { uint8_t i = 0; uint32 int32Temp; // 初始化 FirstUp = 1; ADS_coef.magnification = 10000000; ADS_coef.coff = 180; ADS_coef.NetWeight_coef = 0; ADS_coef.Valve_change = 0; ADS_PDWN_L; // PDWN_L delay_us(20); ADS_PDWN_H; // PDWN_H delay_us(40); // 去电复位 // 读取几次,待数据稳定后再读取输出 for (i = 0; i &lt; 12; i++) { ADS_coef.ADC_VALUE_Last = Read_Ads1232(ADCa_t); delay_us(20); } //读取铁电保存值 ReadContinuumeMBRS64A((uint8 *)(&amp;RealTimeData.ADS1232[0]) - &amp; (RealTimeData.Head), (void *)&amp;RealTimeData.ADS1232[0], 12, FillFlag.FmDeviceType); int32Temp = ComputeCRC32((uint32_t *)(&amp;RealTimeData.ADS1232[0]), 2); if (int32Temp != RealTimeData.ADS1232[2]) { SetBit((uint8 *)&amp;FillAlarm.STS, 4, 0); //电子秤标定异常 } else { ADS_coef.zero_coef = RealTimeData.ADS1232[0]; ADS_coef.k = ((float)RealTimeData.ADS1232[1] / 1000000000.0); if (ADS_coef.k &gt; 0.0f &amp;&amp; ADS_coef.k &lt; 1.0f) { ClrBit((uint8*)&amp;FillAlarm.STS, 4); } else { SetBit((uint8 *)&amp;FillAlarm.STS, 4, 0); //电子秤标定异常 } } // 滤波器初始化 float alpha = 1.0f - expf(-2 * M_PI * FILTER_CUTOFF_HZ / SAMPLE_RATE_HZ); IIR_Filter_Init(&amp;weight_filter, alpha); IIR_Filter_Init(&amp;fill_filter, alpha); // 初始化滤波器:初始位置=4000,初始速度=0 // Q:过程噪声,R:观测噪声 //astkf_init(&amp;filter, ADS_coef.ADC_VALUE_Last, 0, 8000, 50000, ADS_coef.ADC_VALUE_Last*0.005); astkf_init(&amp;filter, ADS_coef.ADC_VALUE_Last, // 初始位置 0.0, // 初始速度 100, // 降低Q_pos - 减少过程噪声 100, // 降低Q_vel - 减少速度噪声 ADS_coef.ADC_VALUE_Last * 0.00001); // 降低R - 减少观测噪声 //zero_calibration(); // 零点标记 //Loading_calibration(20000); // 假设加载标定值为20000g LPC_GPIOINT-&gt;IO2IntEnF |= ADS_DOUT;//启用ADS_DOUT中断 } uint8_t SFW_A; float LLw; float Lw_w; void ADS1232_Processing(uint8_t Calibration) { uint32_t ad; uint32_t IIRTemp; static uint8_t wen_num; if (1 == ADS_coef.Blance_Abnormal) SetBit((uint8 *)&amp;FillAlarm.STS, 6, 0); // 6-称传感器异常 else ClrBit((uint8*)&amp;FillAlarm.STS, 6); advanced_sliding_filter(&amp;SF); SF.window_number++; // char SFbuf[512] = {0}; // sprintf(SFbuf, &quot;menan: %d sfbuf:&quot;, SF.mean); // char SFtemp[30] = {0}; // for(int i = 0; i &lt; SF.WINDOW_SIZE; i++) // { // sprintf(SFtemp, &quot; %d&quot;, SF.buffer[i]); // strcat(SFbuf, SFtemp); // } // strcpy(com4.TX_Buffer, SFbuf); // com4.TX_tailPtr = strlen(com4.TX_Buffer); // STARTtx4(); if (SF.window_number &gt; 0xffff &amp;&amp; (Filling.State == IDLE)) // 加上没有在加注状态判断 { SF.window_number = 0; ADS_PDWN_L; // PDWN_L delay_us(40); ADS_PDWN_H; // PDWN_H 去电复位 delay_us(40); read_Ads1232(Calibration); delay_us(10); read_Ads1232(Calibration); } ADS_coef.ADC_VALUE = ADtoDiffVolt(SF.mean); // 读取差分电压值 ad = ADS_coef.ADC_VALUE; // 对采集AD值错误的剔除 if (Filling.State == IDLE &amp;&amp; i_us &gt; 1500) ADS_coef.ADC_VALUE = ADS_coef.ADC_VALUE_Last; else if(Filling.State == FUELING &amp;&amp; i_us &gt; 900) { ADS_coef.ADC_VALUE = ADS_coef.ADC_VALUE_Last; SF.WINDOW_SIZE = WINDOW_FILL; SF.index = 0; ADS_PDWN_L; // PDWN_L delay_us(20); ADS_PDWN_H; // PDWN_H 去电复位 delay_us(20); } if (Filling.State == IDLE &amp;&amp; ADS_coef.wen_flag &gt; 0xf &amp;&amp; uabs_diff(ADS_coef.ADC_VALUE, ADS_coef.ADC_VALUE_Last) &gt; 0x200) { wen_num++; if (wen_num &lt; 5) ADS_coef.ADC_VALUE = ADS_coef.ADC_VALUE_Last; else wen_num = 0; } else if(Filling.State == FUELING &amp;&amp; uabs_diff(ADS_coef.ADC_VALUE, ADS_coef.ADC_VALUE_Last) &gt; 0x200) { wen_num++; if (wen_num &lt; 3) ADS_coef.ADC_VALUE = ADS_coef.ADC_VALUE_Last + Lw_w; else wen_num = 0; } // 预测与更新 if (ADS_coef.Valve_change &gt; 0) //阀门有改变AD值不可信 { ADS_coef.Valve_change--; ADS_coef.ADC_VALUE = filter.x[0]; } else { //卡尔曼滤波 astkf_predict(&amp;filter); // 在astkf_update预测步骤后添加 if (Filling.State == FUELING &amp;&amp; filter.x[1] &lt; 0) { filter.x[1] = 0; // 加注时强制速度非负 } astkf_update(&amp;filter, ADS_coef.ADC_VALUE); ADS_coef.ADC_VALUE = filter.x[0]; } ADS_coef.weight = DiffVoltTOg(ADS_coef.ADC_VALUE); Lw_w = fabsf(ADS_coef.weight_Last - ADS_coef.weight); // if (Lw_w &lt; 10 &amp;&amp; Filling.State == IDLE) // ADS_coef.weight = (ADS_coef.weight + ADS_coef.weight_Last) / 2; //稳定性加强 if (Filling.State == FUELING &amp;&amp; Filling.FillingSpeed &gt; 0) //上次重量差小于上上次重量差三倍 { SF_W.WINDOW_SIZE = ((SFW_A &gt;= 3) ? (SFW_A = 9) : SFW_A++); SF_W.EXCLUDE_NUM = 2; SF_W.buffer[SF_W.index] = ADS_coef.weight; if (SFW_A &gt; 5) { advanced_sliding_filter(&amp;SF_W); if (fabsf(SF_W.mean - ADS_coef.weight) &lt; 80) ADS_coef.weight = SF_W.mean; else { SFW_A = 0; SF_W.index = 0; } } SF_W.index = (SF_W.index + 1) % 9; } else if (Lw_w &lt; 60) { SF_W.WINDOW_SIZE = ((SFW_A &gt;= 14) ? (SFW_A = 14) : SFW_A++); if (Filling.State == SAVEDATA || Filling.State == SUSPEND) SF_W.EXCLUDE_NUM = 4; else SF_W.EXCLUDE_NUM = 2; SF_W.buffer[SF_W.index] = ADS_coef.weight; if (SFW_A &gt; 9) { advanced_sliding_filter(&amp;SF_W); ADS_coef.weight = SF_W.mean; } SF_W.index = (SF_W.index + 1) % 14; } else { SFW_A = 0; SF_W.index = 0; } // IIRTemp = IIR_Filter_Update(&amp;weight_filter, (float)ADS_coef.weight); // if (uabs_diff(IIRTemp, ADS_coef.weight_Last) &lt; 10) // ADS_coef.weight = IIRTemp; // 判稳 if (fabsf(ADS_coef.weight_Last - ADS_coef.weight) &lt; 5) //g { ADS_coef.wen_flag++; if (20 &lt; ADS_coef.wen_flag) // 连续20次于上一次重量相差在5g以内 { BaData.DataStable = 1; FillFlag.DataState = 1; // 判断为数据稳定 if (1 == FirstUp &amp;&amp; ADS_coef.weight != 0 &amp;&amp; ADS_coef.weight &lt; 200 &amp;&amp; ADS_coef.zero_coef &gt; 0) { FirstUp = 0; ADS_coef.NetWeight_coef = ADS_coef.ADC_VALUE - ADS_coef.zero_coef; } } if (ADS_coef.wen_flag &gt; 0x2fff) // 保持稳定状态 ADS_coef.wen_flag = 0x2f; if (ADS_coef.wen_flag &gt; 0x50 &amp;&amp; ADS_coef.weight &lt; 200 &amp;&amp; Filling.State == IDLE) // 零点跟踪 { trace_s++; ADS_coef.zero_trace += ADS_coef.ADC_VALUE; ADS_coef.zero_trace = ADS_coef.zero_trace / 2; if (trace_s &gt; 0x80) { ADS_coef.NetWeight_coef = ADS_coef.zero_trace - ADS_coef.zero_coef; trace_s = 0; } } } else { ADS_coef.wen_flag = 0; BaData.DataStable = 0; FillFlag.DataState = 0; // 判断为数据不稳 } WeightShow_10(ADS_coef.weight); sprintf((char *)com4.TX_Buffer, &quot;sh:%d w:%f AD:%d-&gt;%d L_LL:%f Fs:%d v:%d us:%ld\n&quot;, ADS_coef.weight_show, ADS_coef.weight, ad, ADS_coef.ADC_VALUE, fabsf(ADS_coef.weight_Last - LLw), (Filling.FillingSpeed), ADS_coef.Valve_change, i_us); com4.TX_tailPtr = strlen(com4.TX_Buffer); STARTtx4(); i_us = 0; LLw = ADS_coef.weight_Last; ADS_coef.weight_Last = ADS_coef.weight; ADS_coef.ADC_VALUE_Last = ADS_coef.ADC_VALUE; ADS_coef.ADC_VALUE = 0; } 这是在LPC1788上面用ADS1232芯片编写电子秤项目的采集和处理AD值的代码,可以看出我用了很多滑动滤波和卡尔曼滤波等算法,但实际使用中发现AD值会有连续好几个采集错误,会直接导致最后输出的重量出现波动,第二发现在实际用水加注测试中重量增加的不是很平稳,有时增加的多有时几乎不增加,导致最后关阀后得到的重量与实际想要的重量有几十g的差距,不稳定
最新发布
10-24
&lt;think&gt;嗯,用户想了解如何用memset初始化long long类型的变量。首先,我得回忆一下memset函数的作用。根据引用[1]和[2],memset是用来将某块内存的前n个字节设置为特定的int型值c。这里的关键是,memset按字节操作,而不是按数据类型的大小。 那long long类型通常占8个字节,对吧?如果用memset来初始化,比如想把它设为0,可以写memset(&amp;var, 0, sizeof(var)),这样每个字节都被设为0,整体就是0。但是如果用户想设为其他值,比如全1,那可能有问题。比如用memset(&amp;var, 1, sizeof(var))的话,每个字节变成0x01,整个long long变量实际上是0x0101010101010101,而不是1。这可能会导致数值不符合预期。 所以需要告诉用户,memset适合将内存块设置为0或-1(因为补码下-1的所有位都是1),但其他值可能会有意外结果。比如,对于非零值,可能需要用循环赋值而不是memset。另外,要注意结构体或数组的情况,这时候用memset初始化整个结构体或数组为0比较方便,但对于非零值要小心。 还有,用户可能需要例子。比如正确和错误的用法对比。比如初始化数组为0是对的,但初始化单个long long变量为全1是错的,应该用循环或者直接赋值。另外,跨平台的问题,不同系统long long的大小可能不同,所以最好用sizeof来确保正确性。 总结下来,回答应该分步骤:首先说明memset的原理,然后适用场景(0和-1),接着其他值的注意事项,给出示例代码,最后注意事项如结构体、跨平台等。同时要提醒用户避免常见错误,比如误用非0值。&lt;/think&gt;### 使用`memset`初始化`long long`类型变量的方法及注意事项 #### 1. **`memset`的基本原理** `memset`函数的作用是**按字节填充内存**,将指针`s`指向的内存区域的前`n`个字节设置为整型值`c`的低8位(即`c`会被隐式转换为`unsigned char`)[^2]。例如,`memset(&amp;a, 0, sizeof(a))`会将变量`a`的所有字节设为`0x00`。 #### 2. **初始化`long long`的适用场景** - **全零初始化**: 若需将`long long`变量所有字节设为`0`,可直接使用`memset`: ```c long long num; memset(&amp;num, 0, sizeof(num)); // 正确:所有字节设为0,等价于num = 0 ``` - **全`-1`初始化**: 若需将`long long`变量所有字节设为`0xFF`(即`-1`的补码表示): ```c memset(&amp;num, 0xFF, sizeof(num)); // 正确:所有字节设为0xFF,等价于num = -1 ``` #### 3. **非0/非-1值的注意事项** 若尝试将`long long`设为其他值(如`1`),会导致**按字节重复填充**,而非整体赋值。例如: ```c memset(&amp;num, 1, sizeof(num)); // 错误:实际值为0x0101010101010101(非1) ``` 此时应直接赋值或通过循环逐字节操作。 #### 4. **示例代码对比** - **正确用法(全零初始化)**: ```c long long array[10]; memset(array, 0, sizeof(array)); // 正确:数组所有元素初始化为0 ``` - **错误用法(非零初始化)**: ```c long long num; memset(&amp;num, 0x3F, sizeof(num)); // 错误:每个字节为0x3F,整体值为0x3F3F3F3F3F3F3F3F ``` #### 5. **其他注意事项** - **结构体中的`long long`成员**: 若结构体包含`long long`字段,使用`memset`初始化整个结构体为0是安全的。 - **跨平台兼容性**: `long long`的大小固定为8字节(C标准),但需确保`sizeof`正确计算内存长度[^1]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10247D

我会继续努力,信息技术会越好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值