Files
TransPyV/Test/App/ptr_test.py
2026-07-19 13:18:46 +08:00

112 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import stdio
import t, c
# ============================================================
# 简单指针 + 逻辑测试
# ============================================================
def ptr_test() -> int:
# 逻辑测试if 语句
x: int = 10
if x:
stdio.printf("if: x is truthy\n")
if 1 == 1:
stdio.printf("if: 1==1 is truthy\n")
# While 循环 + 累加
i: int = 0
total: int = 0
while i < 5:
total = total + i
i = i + 1
stdio.printf("while: total=%d i=%d\n", total, i)
# For 循环
for j in range(5):
stdio.printf("for: j=%d\n", j)
# Break 测试
for k in range(10):
if k == 3:
break
stdio.printf("break: k=%d\n", k)
# Continue 测试
for m in range(5):
if m == 2:
continue
stdio.printf("continue: m=%d\n", m)
# 布尔运算 and短路求值
if x > 5 and x < 100:
stdio.printf("bool: x>5 and x<100 is true\n")
# 布尔运算 or短路求值
if x > 100 or x > 5:
stdio.printf("bool: x>100 or x>5 is true\n")
# ============================================================
# 指针 + c.Deref / c.DerefAs 测试
# ============================================================
# 字符串遍历: while c.Deref(p) != 0
s: str = "hello"
sp: str = s
slen: int = 0
while c.Deref(sp) != 0:
slen = slen + 1
sp = sp + 1
stdio.printf("ptr: len(hello)=%d\n", slen)
# c.DerefAs 写入字符(使用 c.Addr 获取栈变量地址,字符串字面量是只读的)
v: int = 65 # 'A'
px: str = c.Addr(v)
c.DerefAs(px, 88) # *px = 88
stdio.printf("ptr: after DerefAs v=%d\n", v)
# 遍历字符串并累加字符值
p2: str = "ABC"
total_ch: int = 0
while c.Deref(p2) != 0:
total_ch = total_ch + c.Deref(p2)
p2 = p2 + 1
stdio.printf("ptr: sum(A,B,C)=%d\n", total_ch)
# ============================================================
# c.Load 测试: *a = *b加载源指针的值存储到目标指针
# ============================================================
# 基本复制: v2 = v1
v1: int = 42
v2: int = 0
c.Load(c.Addr(v2), c.Addr(v1))
stdio.printf("ptr: c.Load v2=%d (expected 42)\n", v2)
if v2 != 42:
stdio.printf("[FAIL] c.Load expected 42 got %d\n", v2)
return 1
# 覆盖已有值: v3 = v4
v3: int = 100
v4: int = 200
c.Load(c.Addr(v3), c.Addr(v4))
stdio.printf("ptr: c.Load overwrite v3=%d (expected 200)\n", v3)
if v3 != 200:
stdio.printf("[FAIL] c.Load overwrite expected 200 got %d\n", v3)
return 1
# 验证源不被修改: v5 保持原值
v5: int = 999
v6: int = 0
c.Load(c.Addr(v6), c.Addr(v5))
stdio.printf("ptr: c.Load src unchanged v5=%d v6=%d (expected 999, 999)\n", v5, v6)
if v5 != 999:
stdio.printf("[FAIL] c.Load src changed v5=%d\n", v5)
return 1
if v6 != 999:
stdio.printf("[FAIL] c.Load dst expected 999 got %d\n", v6)
return 1
return 0