c - C 函数变量意外更改
问题描述
我在 Atmel Studio 中使用模拟器(Atmega 2560)调试器。当我运行调试器时,函数 MoveStraight 开始处的值 F = 30,并且在第一次 Math/Struct 值分配后变为 0。
#include <math.h>
#include <stdio.h>
struct Straight { //Define structure to move straight
long Sx;
long Sy;
long Sz;
unsigned char NX;
unsigned char OCRXAH;
unsigned char OCRXAL;
unsigned char NY;
unsigned char OCRYAH;
unsigned char OCRYAL;
unsigned char NZ;
unsigned char OCRZAH;
unsigned char OCRZAL;
};
struct Straight MoveStraight(unsigned char MoveMode, int X, int Y, int Z, unsigned int F, int Lx, int Ly, int Lz);
struct Straight MoveStraight(unsigned char MoveMode, int X, int Y, int Z, unsigned int F, int Lx, int Ly, int Lz) {
//Here is F = 30
struct Straight StraightMovement;
if (MoveMode == 1) {
StraightMovement.Sx = X * Lx;
//Here is F = 0
StraightMovement.Sy = Y * Ly;
StraightMovement.Sz = Z * Lz;
}
float Fs = (float)F/60;
float St = sqrt(pow(X, 2)+pow(Y, 2)+pow(Z, 2));
float Tt = St/Fs;
//Here comes other code
return StraightMovement;
}
int main(void) {
unsigned char MoveMode = 1;
int X = 5;
int Y = 0;
int Z = 0;
unsigned int F = 30;
int Lx = 6400;
int Ly = 6400;
int Lz = 6400;
struct Straight Move = MoveStraight(MoveMode, X, Y, Z, F, Lx, Ly, Lz);
while (1) {
}
}
为什么 F 不碰它就变了。
解决方案
@linuxfansaysReinstateMonica在评论中给出了答案
有时调试器会被编译器弄糊涂。也许用于保存 F 的寄存器在不再使用 F 后会被重新使用,并且调试器不会注意到。尝试禁用所有优化。
推荐阅读
- sql-server - 是否可以在 SSAS 中存储 SSAS 对象的自定义元数据?(用于版本控制)
- android - 在 Android 中手动设置蓝牙服务器端口
- neural-network - 如何解释没有预测到负面?
- c# - 事件的类字段实现
- variables - Visual Studio Fortran 卡在将值从一个变量重新分配给另一个变量
- php - 搜索任何表字段中是否存在变量并获取表字段名称
- php - 使用数据库值的 Smarty 计算
- r - 使用 grepl() 从 R 中的数据框中删除值
- java - 如何处理 RequestMapping 中的@Valid 违规行为?
- python - 用于股票市场预测、回归的卷积神经网络