我没有那么多使用C,最近我对2d数组初始化问题感到困惑.我需要调试某人的代码并坚持以下(她的原始代码):
const int location_num = 10000;
bool **location_matrix;
if (node_locations)
{
location_matrix = (bool **)malloc(location_num*sizeof(bool *));
if (!location_matrix)
{
cout<<"error 1 allocating location_matrix" << endl;
exit;
}
for (i=0; i<location_num; i++)
{
location_matrix[i] = (bool *) malloc(location_num*sizeof(bool ));
if (!location_matrix[i])
{
cout<<"error 2 allocating location_matrix" << endl;
exit;
}
for (j=0; j<location_num; j++)
location_matrix[i][j] = false;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为是多余的,所以我将其更改为以下内容:
location_matrix[location_num][location_num] = { {false} };
但是,分段错误在运行时发生.我的问题是:上面的代码是如何失败的?如果它看起来正确,动态分配和静态分配之间有什么区别?是因为维度可能不是常数,所以我们需要动态地做这个吗?另外,只是为了好奇,我如何malloc 2d数组存储指针?谢谢.
想象一个模型/集合,如:
var AModel = Backbone.Model.extend({
defaults: {
a: 'a string',
b: 'another string',
c: 'yet another string'
}
});
var ACollection = Backbone.Collection.extend({
model: AModel,
comparator: function(amodel) {
...
}
});
Run Code Online (Sandbox Code Playgroud)
我怎么能写一个比较器来实现多级排序?我想作为排序依据AModel的a属性,然后通过它的b属性,然后通过它的c属性.
我已经把一个比较器看起来像这样,但我想知道是否有更好/更聪明的方法?
comparator: function(amodel) {
var s = '',
assumed_max_length_of_any_attribute = 30;
s += amodel.get('a');
while (s.length < assumed_max_length_of_any_attribute) {
s += ' ';
}
s += amodel.get('b');
while (s.length < assumed_max_length_of_any_attribute) {
s += ' ';
}
s += amodel.get('c'); …Run Code Online (Sandbox Code Playgroud) 它如何将所有输入字符串转换为UTF-8?它是否使用C库函数?
当前工作区域设置是否必须是UTF-8语言环境?
更新:如果具体的技术细节可以在你的答案中,那将是伟大的,因为这更符合我正在寻找的.我已经理解了在内部使用UTF-8的原因以及为什么它使得处理多个语言环境变得更加简单.
更新:提到简单地使用iconv和/或ICU的答案,但是,如何strcmp()与其他所有例程一起知道将它们作为UTF-8进行比较呢?是否setlocale()必须运行?或者没关系?
这个问题是故意非常通用的,虽然我在这里和那里涉猎,但我并不是一个C程序员.以下代码故意模糊,可能无法编译,但我希望你明白......
处理平台细节似乎是动态的,像C这样的编译语言似乎是不必要甚至可怕的:
int main(int argc, char *argv[]) {
if (windows)
dowindowsroutine();
else
dounixroutine();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,通过非常基本的宏来处理平台细节似乎也很粗糙,因为函数被切割成可能无法正确编译的小块(读取C#define宏的答案以用于类似问题的调试打印).
int main(int argc, char *argv[]) {
#ifdef windows
dowindowsroutine();
#else
dounixroutine();
#endif
return 0;
}
Run Code Online (Sandbox Code Playgroud)
那么这样做的"正确"方法是什么?这是个案的基础吗?有没有一种很好的方法可以完全保留这些粗糙的宏?我记得在某处(可能在内核文档或相关内容中)读取宏(更重要的是,复杂的宏逻辑)是针对头文件而不是.c文件.你怎么处理这种东西?
我厌倦了ifdef在函数内部的"意大利面条代码"...我觉得有些情况可能没问题,但我看到的大多数代码都滥用它.
注意:我已经看到一些perl XS代码看起来像包装函数原型和东西,但这是唯一的方法吗?在社区中有点不公平吗?或者那样好吗?来自perl,python,shell等主要是"脚本化"的背景......我很难说.
更新:让我更清楚一点,我试图避免的问题是我不想要乱码.我希望能够确保如果我的代码在linux的编译时断开,它也会在编译时在windows中中断.使用不稳定的代码,它可以打破编译窗口,但不是Linux,反之亦然.这种事可能吗?到目前为止最接近这一点的是ifdef整个函数,但是函数名是相同的,有一个更好的解决方案,有一个接口,但操作系统特定的部分有他们的操作系统名称嵌入名称?
在Perl中:
my ($usr,$sys,$cusr,$csys) = times;
printf "real %s, user %s, sys %s\n", $usr + $sys, $usr, $sys;
Run Code Online (Sandbox Code Playgroud)
这是真的?我读了一些其他问题,其中人们做了一些事情,比如将当前时间保存在变量中并稍后收集它,但为什么这不起作用?
我在一些"humanize_bytes()"代码中遇到了一个有趣的问题.此循环表示没有所有其他逻辑的问题.当字节被截断为"人类可读"级别时,循环需要停止.它继续迭代,直到最终值小于1024(或可指定的字节大小).
当函数输出"1024.0 P"为1024 PB时,我开始研究这个问题.起初我以为我不小心使用了<= vs <,但经过进一步的检查,我发现更有趣的事情正在发生.
此代码重现了该问题.我正在使用perl 5.8.8.
use strict;
my $bytesize = 1024;
my $final = 1152921504606846720;
while (1) {
printf "bytesize %%d: %d %%f: %s %s final %%d: %19d %%f: %26f\n",
$bytesize,$bytesize,
(
$bytesize == $final ? '==' :
$bytesize > $final ? '>' :
$bytesize < $final ? '<' :
'<error>'
),
$final,$final;
last if $final < $bytesize;
$final /= $bytesize;
}
printf "final = bytesize d:%d f:%s %s final d:%d f:%f\n",
$bytesize,$bytesize,
(
$bytesize == $final …Run Code Online (Sandbox Code Playgroud) 我注意到perl中perlio层的一些问题.给我一个美好的一天来追踪它,并希望其他人知道这件事吗?最可怕的是,由于它的级别太低,我担心它会降低代码的可移植性.
服务器代码:
use strict;
use Socket;
socket(my $sock, AF_INET, SOCK_STREAM, getprotobyname('tcp')) or die();
setsockopt($sock, SOL_SOCKET, SO_REUSEADDR, 1) or die();
bind($sock, pack_sockaddr_in(23457, inet_aton('0.0.0.0'))) or die();
listen($sock, 10) or die();
my $paddr = accept(my $csock, $sock);
if (not $paddr) {
die();
}
my ($port, $iaddr) = unpack_sockaddr_in($paddr);
printf "accepted %s:%s\n", inet_ntoa($iaddr), $port;
send($csock, "1234567890", 0);
recv($csock, my $tmp, 8192, 0);
close($csock);
close($sock);
Run Code Online (Sandbox Code Playgroud)
客户端代码(我稍微改变以测试):
use strict;
use Socket;
use PerlIO;
socket(my $sock, AF_INET, SOCK_STREAM, getprotobyname('tcp')) or die();
connect($sock, pack_sockaddr_in(23457, inet_aton('localhost'))) or die();
print …Run Code Online (Sandbox Code Playgroud) c ×2
perl ×2
backbone.js ×1
c++ ×1
coding-style ×1
decimal ×1
javascript ×1
macros ×1
portability ×1
select ×1
sockets ×1
unix ×1