问题描述
将 uint8 转换为普通 int 的最佳方法是什么 我想用 rgb 直方图做一些工作,但我在这里找不到最后一块的正确方法(更新为 rm stbi lib)
unrecognized rule
我想过将 r1 转换为字符串,然后执行 parseInt() 之类的操作,但这似乎不合常理。有没有更干净的方法?
这里是编译器错误
proc obc*(image1,image2: string) =
type IntArray = array[24,int]
var
r24: IntArray
let f:float = 24/256
var
data1: seq[uint8]
#data1 = stbi.load(image1,w,h,c,stbi.Default) #uint8
for i in countUp(0,data1.len - 3,step = 4):
let
r1: uint8 = data1[i]
r24[ (int)(r1*f) ] = r24[(int)(r1*f)] + 1
解决方法
你的错误是忘记了 Nim 是强类型的。您尝试将 uint8 与浮点数相乘。要么将 float 与 float 相乘,要么将 uint8 与 uint8 相乘。有例外,请参阅:https://nim-lang.org/docs/manual.html#type-relations-convertible-relation
以下是将 uint8 转换为浮点数的示例:
let x = 1'u8
let y = float(x)
let z = x.float
浮动到 uint8:
let x = 1.0
let y = uint8(x)
let z = x.uint8
编译的代码示例,但我不知道这是否是您想要的结果:
proc obc*(image1,image2: string) =
type IntArray = array[24,int]
var
r24: IntArray
let f:float = 24/256
var
data1: seq[uint8]
#data1 = stbi.load(image1,w,h,c,stbi.Default) #uint8
for i in countUp(0,data1.len - 3,step = 4):
let
r1: uint8 = data1[i]
r24[int(r1 * uint8(f))] = r24[int(r1 * uint8(f))] + 1
,
好吧,看来我的代码比我想象的要糟糕 通过将这一行从
r1: uint8 = data1[i]
到
r1: float = (float)data1[i]
编译错误消失了。我原以为这是 uint8 的问题,但不是。这只是一个简单的 float int 不匹配,需要额外的转换。
所以可能原来的建议是对的,这种事情没问题
var u: uint8 = 8
var i: int = (int) u