You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C程序获取输入后无法输出avgHits结果的问题求助

问题修复:C程序无输出avgHits的问题

核心问题分析

你的程序输入完成后无输出,本质是内存越界导致的未定义行为,加上一处循环逻辑错误:

  1. 变长数组(VLA)初始化时机错误:定义hitDiceResults[hitSimulations]、woundDiceResults[successfulHits]、saveDiceResults[successfulWounds]时,这些变量初始值都是0,数组长度为0,后续对数组的赋值操作直接越界,破坏内存结构,导致程序崩溃或卡死。
  2. 循环边界错误:统计save骰子结果的循环中,循环条件写成了k < successfulHits,但saveDiceResults的长度是successfulWounds,越界访问会引发内存异常。
  3. 整数除法精度丢失:avgHits = successfulHits / simulations是整数除法,结果会被截断,无法得到正确的浮点平均值。

修复步骤

  1. 调整变长数组定义位置:将所有依赖输入值的数组定义,移到对应变量赋值完成之后:
    • 在计算hitSimulations = simulations * attacks;之后,定义hitDiceResults
    • 在计算出successfulHits之后,定义woundDiceResults
    • 在计算出successfulWounds之后,定义saveDiceResults
  2. 修正循环边界:将统计save结果的循环条件改为k < successfulWounds
  3. 修正整数除法:强制将其中一个操作数转为浮点型,确保除法结果为浮点数:avgHits = (double)successfulHits / simulations;

修复后的关键代码片段

// ... 前面的输入和计算逻辑保持不变

// Determines how many attacks are done and multiples that by simulations 
attacks *= attackingUnitSize;
hitSimulations = simulations * attacks;

// 移到此处定义hitDiceResults,此时hitSimulations已有正确值
int hitDiceResults[hitSimulations];

int i, j, k;
for (i = 0; i < hitSimulations; i++){
    dice = rand() % 6 + 1;
    hitDiceResults[i] = dice;
}

// ... 中间的hit统计逻辑保持不变

// Tallies up successful hits
if (skill == 1){
    successfulHits = hitOnes + hitTwos + hitThrees + hitFours + hitFives + hitSixes;
}
// ... 其他skill判断保持不变

// 移到此处定义woundDiceResults,此时successfulHits已有正确值
int woundDiceResults[successfulHits];

//rolls dice for wounds after successful hits
for(j = 0; j < successfulHits; j++){
    dice = rand() % 6 + 1;
    woundDiceResults[j] = dice;
}

// ... 中间的wound统计逻辑保持不变

//tallies up the successful wound rolls
if (woundRoll == 1){
    successfulWounds = woundOnes + woundTwos + woundThrees + woundFours + woundFives + woundSixes;
}
// ... 其他woundRoll判断保持不变

// 移到此处定义saveDiceResults,此时successfulWounds已有正确值
int saveDiceResults[successfulWounds];

//rolls dice equal to the number of successfulwounds    
for (k = 0; k < successfulWounds; k++){
    dice = rand() % 6 + 1;
    saveDiceResults[k] = dice;
}

// 修正循环条件为successfulWounds
for(k = 0; k < successfulWounds; k++){
    if (saveDiceResults[k] == 1){
        saveOnes += 1;
    }
    // ... 其他save判断保持不变
}

// ... 后续save统计逻辑保持不变

// 修正整数除法为浮点除法
avgHits = (double)successfulHits / simulations;
printf("Average number of hits across %d simulations ", simulations);
printf(" is: %f.\n", avgHits);

return 0;

内容的提问来源于stack exchange,提问作者AnoXicz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:23:06