小编phu*_*clv的帖子

argv的编码是什么?

我不清楚C中使用了什么编码argv.特别是,我对以下场景感兴趣:

  • 用户使用区域设置L1创建名称N包含非ASCII字符的文件
  • 稍后,用户使用区域设置L2在命令行上选项卡填写该文件的名称,该文件作为命令行参数提供给程序P.

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.

据我所知,磁盘存储故事是一样的.OS X将文件名存储为Unicode.

使用Unicode终端,我认为终端会在Unicode缓冲区中构建命令行.因此,当选项卡完成时,它会将文件名作为Unicode文件名复制到该缓冲区.

当您运行该命令时,该Unicode缓冲区将转换为当前区域设置L2,并通过该方式提供给程序argv,程序可以将具有当前区域设置的argv解码为Unicode以供显示.

Linux的

在Linux上,一切都是不同的,我对正在发生的事情感到困惑.Linux将文件名存储为字节字符串,而不是Unicode.因此,如果您N在区域设置L1中创建一个名称为file N的字节字符串,则存储在磁盘上.

当我稍后运行终端并尝试选项卡完成名称时,我不确定会发生什么.在我看来,命令行被构造为字节缓冲区,并且作为字节字符串的文件名称只是连接到该缓冲区.我假设当你键入一个标准字符时,它会被动态编码为附加到该缓冲区的字节.

当你运行程序时,我认为缓冲区是直接发送的 …

c linux unicode encoding

38
推荐指数
2
解决办法
5947
查看次数

将命令输出分配给批处理文件中的变量

我正在尝试将命令的输出分配给变量 - 例如,我正在尝试将当前的flash版本设置为变量.我知道这是错的,但这是我试过的:

set var = reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion>

要么

reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion >> set var

是的,你可以看到我有点失落.任何和所有的帮助表示赞赏!

registry variables flash cmd batch-file

38
推荐指数
2
解决办法
10万
查看次数

指针(地址)可以是负数吗?

我有一个函数,我希望能够返回失败未初始化的特殊值(它返回成功指针).

目前它为失败返回NULL,为未初始化返回-1,这似乎有效......但我可能会欺骗系统.iirc,地址总是积极的,不是吗?(虽然由于编译器允许我将地址设置为-1,这看起来很奇怪).

[更新] 我有另一个想法(如果-1是有风险的)是malloc一个char @全局范围,并使用该地址作为哨兵.

c signed pointers return-value

35
推荐指数
4
解决办法
2万
查看次数

通过“myPtr > 0”检查空指针

在一些遗留代码中,我遇到了以下空指针检查

if( myPtr > 0 ) {
...
}
Run Code Online (Sandbox Code Playgroud)

通过此 if 检查检查空指针是否存在任何技术风险?

c++ comparison null null-pointer null-check

33
推荐指数
2
解决办法
3042
查看次数

Base32解码

我有一个base32字符串,我需要将其转换为字节数组.我在.NET框架中找到转换方法时遇到了麻烦.我可以找到base64的方法,但不能找到base32的方法.

Convert.FromBase64String - 像base32这样的东西是完美的.

在框架中是否有这样的方法或者我必须自己滚动?

.net c# base32

32
推荐指数
5
解决办法
4万
查看次数

按位运算符的幂2的调制?

  1. 2的幂的mod如何只对二进制数(1011000111011010)的低阶位起作用?
  2. 这个数字mod 2为0,2为4的功率是多少?
  3. 2的幂与模运算符有什么关系?它有特殊财产吗?
  4. 有人能举个例子吗?

教练说:"当你把mod变为2的幂时,你只需要取其低阶位".我太害怕问他的意思了=)

c math bit-manipulation bitwise-operators bitwise-and

32
推荐指数
4
解决办法
5万
查看次数

在二进制搜索中计算mid

我正在阅读一本算法书,其中包含以下二进制搜索算法:

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 …

algorithm binary-search

32
推荐指数
5
解决办法
2万
查看次数

有关JavaScript Math.random()和基本逻辑的问题

我写了一段简单的代码来比较随机数组的差异,发现了一些我不太了解的东西。

  1. 我生成2个充满随机数的数组
  2. 将随机数之间的差相加
  3. 打印出平均差异

我本来希望结果是接近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)

javascript random math statistics

32
推荐指数
2
解决办法
2010
查看次数

最快的整数平方根[指令数量最少]

我需要快速的整数平方根,不涉及任何明确的除法.目标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个周期).因此,它仅在绝对需要时才使用(不幸的是,已经好几次,当不能使用换档时). …

c algorithm math sqrt

30
推荐指数
3
解决办法
2873
查看次数

有没有办法在gdb中设置一个以调用堆栈为条件的断点?

我正在Linux上的gdb 7.1中调试C++.

我有一个a()在代码中的许多地方调用的函数.我想在其中设置一个断点,但只有从它调用它b().有什么办法吗?

有没有什么方法可以做到这一点,只有b()c()无线电话中调用,等等?

c++ callstack gdb breakpoints

26
推荐指数
4
解决办法
4223
查看次数