我不清楚C中使用了什么编码argv
.特别是,我对以下场景感兴趣:
N
包含非ASCII字符的文件P在命令行上看到了什么字节序列?
我观察到在Linux上,在UTF-8语言环境中创建一个文件名然后在(例如)zw_TW.big5
语言环境中填充它似乎会导致我的程序P被输入UTF-8而不是Big5
.但是,在OS X上,同一系列操作会导致程序P获得Big5
编码的文件名.
这是我认为到目前为止所发生的事情(很长时间,我可能错了,需要纠正):
文件名以某种Unicode格式存储在磁盘上.所以Windows取名N
,从L1(当前代码页)转换为N
我们将调用的Unicode版本N1
,并存储N1
在磁盘上.
我接下来假设的是,当稍后完成制表符时,名称N1
将转换为区域设置L2(新的当前代码页)以供显示.幸运的是,这将产生原始名称N
- 但如果N
包含的字符在L2中无法代表,则不会成立.我们称之为新名称N2
.
当用户实际按Enter键以使用该参数运行P时,该名称N2
将转换回Unicode,N1
再次产生.这N1
是现在UCS2格式可供程序通过GetCommandLineW
/ wmain
/ tmain
,但用户GetCommandLine
/ main
会看到的名称N2
在当前区域设置(代码页).
据我所知,磁盘存储故事是一样的.OS X将文件名存储为Unicode.
使用Unicode终端,我认为终端会在Unicode缓冲区中构建命令行.因此,当选项卡完成时,它会将文件名作为Unicode文件名复制到该缓冲区.
当您运行该命令时,该Unicode缓冲区将转换为当前区域设置L2,并通过该方式提供给程序argv
,程序可以将具有当前区域设置的argv解码为Unicode以供显示.
在Linux上,一切都是不同的,我对正在发生的事情感到困惑.Linux将文件名存储为字节字符串,而不是Unicode.因此,如果您N
在区域设置L1中创建一个名称为file N
的字节字符串,则存储在磁盘上.
当我稍后运行终端并尝试选项卡完成名称时,我不确定会发生什么.在我看来,命令行被构造为字节缓冲区,并且作为字节字符串的文件名称只是连接到该缓冲区.我假设当你键入一个标准字符时,它会被动态编码为附加到该缓冲区的字节.
当你运行程序时,我认为缓冲区是直接发送的 …
我正在尝试将命令的输出分配给变量 - 例如,我正在尝试将当前的flash版本设置为变量.我知道这是错的,但这是我试过的:
set var = reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion>
要么
reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion >> set var
是的,你可以看到我有点失落.任何和所有的帮助表示赞赏!
我有一个函数,我希望能够返回失败和未初始化的特殊值(它返回成功指针).
目前它为失败返回NULL,为未初始化返回-1,这似乎有效......但我可能会欺骗系统.iirc,地址总是积极的,不是吗?(虽然由于编译器允许我将地址设置为-1,这看起来很奇怪).
[更新] 我有另一个想法(如果-1是有风险的)是malloc一个char @全局范围,并使用该地址作为哨兵.
在一些遗留代码中,我遇到了以下空指针检查。
if( myPtr > 0 ) {
...
}
Run Code Online (Sandbox Code Playgroud)
通过此 if 检查检查空指针是否存在任何技术风险?
我有一个base32字符串,我需要将其转换为字节数组.我在.NET框架中找到转换方法时遇到了麻烦.我可以找到base64的方法,但不能找到base32的方法.
Convert.FromBase64String
- 像base32这样的东西是完美的.
在框架中是否有这样的方法或者我必须自己滚动?
1011000111011010
)的低阶位起作用?教练说:"当你把mod变为2的幂时,你只需要取其低阶位".我太害怕问他的意思了=)
我正在阅读一本算法书,其中包含以下二进制搜索算法:
public class BinSearch {
static int search ( int [ ] A, int K ) {
int l = 0 ;
int u = A. length ?1;
int m;
while (l <= u ) {
m = (l+u) /2;
if (A[m] < K) {
l = m + 1 ;
} else if (A[m] == K) {
return m;
} else {
u = m?1;
}
}
return ?1;
}
}
Run Code Online (Sandbox Code Playgroud)
作者说:"错误在于m = (l+u)/2;
它可能导致溢出的分配,应该被替换为m = l …
我写了一段简单的代码来比较随机数组的差异,发现了一些我不太了解的东西。
我本来希望结果是接近0.5的随机数,但实际上是0.3333。
为什么随机数数组位于0.3而不是0.5上?
const result = document.getElementById('result');
const generateRandomNrArray = (nrNumbers) => {
let i;
let result = [];
for (i = 0; i < nrNumbers; i++) {
result.push(Math.random());
}
return result;
}
const getArrayDiff = (arr1, arr2) => {
var diff = 0;
arr1.forEach(function (v1, index) {
diff += Math.abs(v1 - arr2[index]);
});
return diff;
}
const run = (nr) => {
const arr1 = generateRandomNrArray(nr);
const arr2 = generateRandomNrArray(nr);
const totalDiff = getArrayDiff(arr1, arr2);
result.innerHTML …
Run Code Online (Sandbox Code Playgroud)我需要快速的整数平方根,不涉及任何明确的除法.目标RISC架构可以在一个周期内执行add,mul,sub,shift等操作(好的 - 操作的结果是在第三个周期写的,真的 - 但是有交错),所以任何使用这些操作并且速度很快的Integer算法都会非常赞赏.
这就是我现在所拥有的,我认为二进制搜索应该更快,因为以下循环每次执行16次(无论值如何).我还没有广泛地调试它(但很快),所以也许有可能提前退出:
unsigned short int int_sqrt32(unsigned int x)
{
unsigned short int res=0;
unsigned short int add= 0x8000;
int i;
for(i=0;i<16;i++)
{
unsigned short int temp=res | add;
unsigned int g2=temp*temp;
if (x>=g2)
{
res=temp;
}
add>>=1;
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
看起来上面[在目标RISC的上下文中]的当前性能成本是5个指令的循环(bitset,mul,compare,store,shift).缓存中可能没有完全展开的空间(但这将是部分展开的主要候选者[例如,4循环而不是16],当然).因此,成本是16*5 = 80指令(加上循环开销,如果没有展开).如果完全交错,则仅花费80(对于最后指令为+2)周期.
我可以在82个周期内获得一些其他sqrt实现(仅使用add,mul,bitshift,store/cmp)吗?
常问问题:
为什么不依靠编译器来生成一个好的快速代码?
该平台没有可用的C-> RISC编译器.我将把当前的参考C代码移植到手写的RISC ASM中.
您是否对代码进行了分析,以确定它add
是否真的成为瓶颈?
不,没有必要.目标RISC芯片大约为20 MHz,因此每条指令都很重要.核心环(计算射击器和接收器贴片之间的能量转移形状因子),mul
使用它,将在每个渲染帧运行~1000次(当然,假设它足够快),每秒高达60,000,整个演示大约有1,000,000次.
您是否尝试过优化算法以删除sub
?
是的,我已经这样做了.事实上,我已经摆脱了2 shift
秒和许多分裂(移除或替换为移位).即使在我的千兆赫笔记本上,我也可以看到巨大的性能提升(与参考浮动版相比).
申请是什么?
它是compo演示的实时渐进细化光能传递渲染器.我们的想法是每帧都有一个拍摄周期,所以它会在每个渲染帧上明显地收敛并且看起来更好(例如每秒上升60次,尽管SW光栅化器可能不会那么快[但至少它可以运行]在与RISC并行的另一个芯片上 - 因此,如果渲染场景需要2-3帧,RISC将并行处理2-3帧的光能传递数据.).
为什么不直接在目标ASM中工作?
因为光能传递是一个略微涉及的算法,我需要Visual Studio的即时编辑和继续调试功能.我周末在VS中做了几百次代码更改,将浮点数学转换为整数,这将花费我6个月的目标平台,只打印"调试".
你为什么不能使用分裂?
因为它在目标RISC上的速度比以下任何一个慢16倍:mul,add,sub,shift,compare,load/store(只需1个周期).因此,它仅在绝对需要时才使用(不幸的是,已经好几次,当不能使用换档时). …
我正在Linux上的gdb 7.1中调试C++.
我有一个a()
在代码中的许多地方调用的函数.我想在其中设置一个断点,但只有从它调用它b()
.有什么办法吗?
有没有什么方法可以做到这一点,只有b()
从c()
无线电话中调用,等等?
c ×4
math ×3
algorithm ×2
c++ ×2
.net ×1
base32 ×1
batch-file ×1
bitwise-and ×1
breakpoints ×1
c# ×1
callstack ×1
cmd ×1
comparison ×1
encoding ×1
flash ×1
gdb ×1
javascript ×1
linux ×1
null ×1
null-check ×1
null-pointer ×1
pointers ×1
random ×1
registry ×1
return-value ×1
signed ×1
sqrt ×1
statistics ×1
unicode ×1
variables ×1