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

HolyC语言参数传递异常求助:向量计算结果不符预期

HolyC向量计算结果异常,变量值读取错误问题

问题描述

我在用类C的HolyC语言开发游戏时遇到异常:代码意图计算两个向量的方向向量,但实际输出的计算结果完全不符合预期,初始化的变量值打印出来也出现错误。

代码实现

class Vector2 {
  F64 x, y;
};

U0 TargetVelocity(Vector2 a, Vector2 b, Vector2 *out)
{
  "AX(%f) AY(%f)\n",a.x,a.y;
  "BX(%f) BY(%f)\n",b.x,b.y;
  F64 vx = b.x - a.x;
  F64 vy = b.y - a.y;

  "RX(%f) RY(%f)\n",vx,vy;

  F64 length = Sqrt(vx * vx + vy * vy);

  if(length != 0)
  {
    vx /= length;
    vy /= length;
  }
  "RX(%f) RY(%f)\n",vx,vy;
  out->x = vx;
  out->y = vy;
}

Vector2 testVector;
testVector.x = 10;
testVector.y = 20;
Vector2 testVector2;
testVector2.x = 10;
testVector2.y = 40;
Vector2 Velocity = {0.0, 0.0};
TargetVelocity(testVector, testVector2, &Velocity);
"X(%f) Y(%f)\n",Velocity.x,Velocity.y;

实际输出

AX(10) AY(10)                                                                    
BX(10) BY(0)                                                                     
RX(0) RY(-10)                                                                    
RX(0) RY(-1)                                                                     
X(0) Y(-1)   

明明初始化testVector.y=20、testVector2.y=40,打印结果却变成10和0,计算vy = b.y - a.y得到-10,完全不符合预期。


问题根源

你使用了错误的打印语法。在HolyC中,"格式化字符串", 参数1, 参数2;这种写法不是合法的打印调用,会被解析为逗号表达式求值,而非输出操作。这种错误写法会破坏栈帧布局,导致后续读取变量时拿到错误的内存值,最终出现异常的计算结果。

修复方案

将所有打印语句替换为HolyC标准的Print函数调用,修改后的代码如下:

class Vector2 {
  F64 x, y;
};

U0 TargetVelocity(Vector2 a, Vector2 b, Vector2 *out)
{
  Print("AX(%f) AY(%f)\n", a.x, a.y);
  Print("BX(%f) BY(%f)\n", b.x, b.y);
  F64 vx = b.x - a.x;
  F64 vy = b.y - a.y;

  Print("RX(%f) RY(%f)\n", vx, vy);

  F64 length = Sqrt(vx * vx + vy * vy);

  if(length != 0)
  {
    vx /= length;
    vy /= length;
  }
  Print("RX(%f) RY(%f)\n", vx, vy);
  out->x = vx;
  out->y = vy;
}

Vector2 testVector;
testVector.x = 10;
testVector.y = 20;
Vector2 testVector2;
testVector2.x = 10;
testVector2.y = 40;
Vector2 Velocity = {0.0, 0.0};
TargetVelocity(testVector, testVector2, &Velocity);
Print("X(%f) Y(%f)\n", Velocity.x, Velocity.y);

预期输出

修复后变量值会被正确读取,计算结果符合预期:

AX(10) AY(20)                                                                    
BX(10) BY(40)                                                                     
RX(0) RY(20)                                                                    
RX(0) RY(1)                                                                     
X(0) Y(1)   

补充说明

HolyC虽语法类似C,但IO操作有独立规范,必须显式调用Print函数完成输出,不能沿用C中隐式调用printf的错误写法(这种写法在标准C中同样不合法)。显式调用打印函数既能正确输出内容,也能避免栈帧异常导致的变量读取错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 16:04:58