小编tom*_*afe的帖子

在switch语句中使用enum类型

如果检测到一些特殊情况,我正在使用switch语句提前从我的main函数返回.特殊情况使用枚举类型进行编码,如下所示.

typedef enum {
    NEG_INF,
    ZERO,
    POS_INF,
    NOT_SPECIAL
} extrema;

int main(){

    // ...

    extrema check = POS_INF;

    switch(check){
        NEG_INF: printf("neg inf"); return 1;
        ZERO: printf("zero"); return 2;
        POS_INF: printf("pos inf"); return 3;
        default: printf("not special"); break;
    }

    // ...

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我运行它时,字符串not special被打印到控制台,主要功能的其余部分继续执行.

如何让switch语句在这里正常运行?谢谢!

c enums switch-statement

15
推荐指数
1
解决办法
5万
查看次数

漂亮的打印列中的颜色转义码

我有一个制表符分隔的文本文件,我发送column到"漂亮的打印"表.

原始档案:

1<TAB>blablablabla<TAB>aaaa bbb ccc
2<TAB>blabla<TAB>xxxxxx
34<TAB>okokokok<TAB>zzz yyy
Run Code Online (Sandbox Code Playgroud)

使用column -s$'\t' -t <original file>,我明白了

1  blablablabla aaaa bbb xxx
2  blabla       xxxxxx
34 okokokok     zzz yyy
Run Code Online (Sandbox Code Playgroud)

如预期的.现在我想为列添加颜色.我试图在原始文件中的每个制表符分隔字段周围添加转义码.column成功打印颜色,但列不再对齐.相反,它只是逐字打印TAB分隔符.

问题是:如何使列对齐,还有独特的颜色?

我想过两种方法来实现这个目标:

  1. 调整column参数以使对齐与颜色代码一起使用
  2. 将列的输出重定向到另一个文件,并在前两个空格分隔的字段上执行搜索+替换(前两列保证包含空格;第三列很可能包含空格,但没有TAB字符)

问题是,我不确定如何做到这两个...

作为参考,这是我要传递的内容column:

带有颜色代码的原始文件

请注意,这些字段确实由TAB字符分隔.我已经证实了这一点od.

编辑:

着色似乎没有问题.我已经有上面显示的文件,颜色代码正常工作.column一旦我使用转义码发送输入,问题就不会对齐.我正在考虑将没有颜色代码的字段传递给column,然后复制column每个字段之间输出的确切空格数,并在漂亮的打印方案中使用它.

unix bash escaping multiple-columns

8
推荐指数
2
解决办法
3607
查看次数

需要当前进程的PID,getpid()返回-1

我需要为进程使用的文件(执行我的C++程序)提供一个唯一的名称.在我使用静态字符串之前,但当我尝试并行运行程序的两个实例时,我意识到它们都访问了同一个文件.

为此,我希望文件名包含创建和使用它的进程的PID.

但是,当我尝试使用时getpid(),我似乎总是得到-1返回值.

void accessfile(){
   std::cout << "DEBUG: accessfile() called by process " << getpid() << " (parent: " << getppid() << ")" << std::endl;
   // Code here to create and/or access the file
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到:

DEBUG: accessfile() called by process -1 (parent: 17565)
Run Code Online (Sandbox Code Playgroud)

我检查过ps ux,这个过程17565实际上是我的登录shell.如何获取我正在执行的程序的PID?

我确实注意到手册条目中的这些信息getpid():

   Since glibc version 2.3.4, the glibc wrapper function for getpid()
   caches PIDs, so as to avoid additional system calls when a process
   calls …
Run Code Online (Sandbox Code Playgroud)

c++ unix linux process

8
推荐指数
1
解决办法
4万
查看次数

malloc()返回我无法访问的地址

我有一个C++程序,它调用由Flex/Bison生成的一些C例程.

当我以Windows 8.1 64位平台为目标时,我在运行时遇到以下异常:

Unhandled exception at 0x0007FFFA70F2C39 (libapp.dll) in application.exe: 0xC0000005: 
Access violation writing location 0x000000005A818118.
Run Code Online (Sandbox Code Playgroud)

我将此异常跟踪到以下代码:

YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
{
   YY_BUFFER_STATE b;
   b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
   if ( ! b )
      YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
   b->yy_buf_size = size; // This access is what throws the exception
}
Run Code Online (Sandbox Code Playgroud)

作为参考,代码中的其他地方(也由Flex/Bison生成),我们有:

typedef struct yy_buffer_state *YY_BUFFER_STATE;
struct yy_buffer_state
{
   FILE *yy_input_file;
   char *yy_ch_buf;
   char *yy_buf_pos;
   yy_size_t yy_buf_size;
   // ... …
Run Code Online (Sandbox Code Playgroud)

c c++ malloc visual-studio-2010 flex-lexer

7
推荐指数
1
解决办法
949
查看次数

新字符数组不会初始化为全零

我正在尝试为可变长度的字符串分配内存n.这是我的尝试:

int n = 4; // Realistically, this number varies.
char* buffer = new char[n * 512]();
printf("buffer[0:3] = [%d][%d][%d][%d]\n", buffer[0], buffer[1], buffer[2], buffer[3]);
Run Code Online (Sandbox Code Playgroud)

我的理解是,最后的包含()应该将所有元素初始化为零.但是,我注意到了.这是控制台的输出:

buffer[0:3] = [-120][-85][-45][0]
Run Code Online (Sandbox Code Playgroud)

如何使new初始化程序正常工作?

注意:我知道我可以使用std::fill,但我很好奇为什么new初始化程序不能像宣传的那样工作.

编辑:这是我修改后的方法std::fill,它给出了正确的行为.但我仍然想知道为什么这是必要的.

int n = 4; // Realistically, this number varies.
char* buffer = new char[n * 512]();
std::fill(&buffer[0], &buffer[n * 512], 0)
printf("buffer[0:3] = [%d][%d][%d][%d]\n", buffer[0], buffer[1], buffer[2], buffer[3]);
Run Code Online (Sandbox Code Playgroud)

这输出:

[0][0][0][0]
Run Code Online (Sandbox Code Playgroud)

c++ memory-management

6
推荐指数
1
解决办法
904
查看次数

为什么这个参数扩展替换在 bash 4.2 中失败但在 5.1 中有效?

我正在尝试将一些代码从 bash 5.1 移植到 4.2.46。一个尝试从特定格式的字符串中去除颜色代码的函数停止工作。

text这是这种格式的示例字符串。我为此打开了扩展通配符。

text="$(printf -- "%b%s%b" "\[\e[31m\]" "hello" "\[\e[0m\]")"
shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

在 bash 5.1 中,此参数扩展可删除所有颜色代码和转义字符

bash-5.1$ echo "${text//$'\[\e'\[/}"
31m\]hello0m\]
bash-5.1$ echo "${text//$'\[\e'\[+([0-9])/}"
m\]hellom\]
bash-5.1$ echo "${text//$'\[\e'\[+([0-9])m$'\]'/}"
hello
Run Code Online (Sandbox Code Playgroud)

在 bash 4.2.46 中,当我构建参数扩展时,我开始出现不同的行为。

bash-4.2.46$ echo "${text//$'\[\e'\[/}"
\31m\]hello\0m\]
bash-4.2.46$ echo "${text//$'\[\e'\[+([0-9])/}"
\[\]hello\[\]  ## no longer matches because `+([0-9])` doesn't follow `\[`
Run Code Online (Sandbox Code Playgroud)

差异来自于这一行:echo "${text//$'\[\e'\[/}"

bash-5.1:    31m\]hello0m\]
bash-4.2.46: \31m\]hello\0m\]
Run Code Online (Sandbox Code Playgroud)

显示内容如下printf "%q" "${text//$'\[\e'\[/}"

bash-5.1:    31m\\\]hello0m\\\]
bash-4.2.46: \\31m\\\]hello\\0m\\\]
Run Code Online (Sandbox Code Playgroud)

4.2.26 中的额外内容从哪里来\

即使当我尝试删除它时,模式也会停止匹配:

bash-5.1:    31m\]hello0m\]
bash-4.2.46: \31m\]hello\0m\]
Run Code Online (Sandbox Code Playgroud)

我猜测可能存在与参数扩展、反斜杠转义和扩展通配符相关的错误。

我的目标是编写适用于 …

bash glob parameter-expansion

6
推荐指数
2
解决办法
209
查看次数

使用Unix排序使用小数部分对pos/neg数字进行排序

运用 sort (coreutils) 5.2.1

我有以下文件,我想按字段4的非整数部分排序.这可以是负数或正数,也可能具有值INF.

field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=0.123 field5 field6
field1 field2 field3 tag=4.22 field5 field6
field1 field2 field3 tag=5.77 field5 field6
field1 field2 field3 tag=-1.92 field5 field6
field1 field2 field3 tag=-1.91 field5 field6
field1 field2 field3 tag=INF field5 field6
Run Code Online (Sandbox Code Playgroud)

我希望将其排序为

field1 field2 field3 tag=-1.92 field5 field6
field1 field2 field3 tag=-1.91 field5 field6
field1 field2 field3 tag=0.123 field5 field6
field1 field2 field3 tag=4.22 field5 field6
field1 field2 …
Run Code Online (Sandbox Code Playgroud)

unix linux sorting

5
推荐指数
1
解决办法
263
查看次数

if语句中的"<signal>不是常量"错误

我正在尝试编写一个简单的模块,根据四个输入信号的值输出一个14位数.我的尝试如下所示.

module select_size(
    input a,
    input b,
    input c,
    input d,
    output [13:0] size
);

    if (a) begin
        assign size = 14'h2222;
    end
    else begin
        if (b) begin
            assign size = 14'h1111;
        end
        else begin
            if (c) begin
                assign size = 14'h0777;
            end
            else begin
                assign size = 14'h0333;
            end
        end
    end

endmodule
Run Code Online (Sandbox Code Playgroud)

编译时,我收到以下错误:

错误:HDLCompiler:44 - 第67行:c不是常数

我不明白为什么如果前面的另外两个if语句不起作用的话.我试过将条件改为

if (c == 1) begin
Run Code Online (Sandbox Code Playgroud)

但无济于事.

有谁知道如何解决这个错误?谢谢!

verilog

4
推荐指数
1
解决办法
3万
查看次数

如何别名'清除'到CTRL + L键击

我有发布clear命令的习惯.

当我运行cygwin时,clear没有安装包含的包,我没有安装它的选项.Ctrl+ L是一个很好的替代品; 但是,我仍然clear习惯性地发出命令.

我想对clear关键字进行别名以发出Ctrl+ L击键.这可以在.bashrc文件中实现,还是类似的东西?

谢谢!

bash alias

4
推荐指数
1
解决办法
1249
查看次数

VBA:从URL打开文本文件以进行读取

我的网站上有一个文本文件,只包含字符串"1.15"(我正在编写的应用程序版本).在初始化用户表单时,我想从其URL读取该文件并返回字符串"1.15",以便我可以根据应用程序的版本(存储为const字符串)进行检查.

这是我想要的格式......

Const version As String = "1.14"
Const currentVersionURL As String = "http://mywebsite.com/currentversion.txt"

Sub UserForm_Initialize()

    If version <> GetCurrentVersionNumber() Then
        MsgBox "Please update the application."
    End If

End Sub

Function GetCurrentVersionNumber() As String

    ' What do I put here? :(

End Function
Run Code Online (Sandbox Code Playgroud)

我知道该Workbooks.OpenText方法,但我不想将字符串写入工作簿.我尝试过使用ADODB.LoadFromFileWinHttp.WinHttpRequest.Open方法,但两者都无法读取文件.

任何有关填写内容的建议GetCurrentVersionNumber()都将不胜感激.:)

excel vba excel-vba

3
推荐指数
1
解决办法
5574
查看次数

grep在bash脚本中的行为与交互式shell中的行为不同

在我的bash脚本中,我试图解析状态文件并根据某些关键字检测错误.我将这些前缀存储在列表中,然后循环遍历它们.

Bash脚本:

status_page="/path/to/file.txt"
list="aaa bbb ccc ddd"

for pre in $list
do
    echo "grep '\w\w\w${pre}-.*\.lin failed' ${status_page}" # debug
    if grep '\w\w\w${pre}-.*\.lin failed' ${status_page}; then
        echo "Found error!"
        exit 8;
    fi
done
Run Code Online (Sandbox Code Playgroud)

/path/to/file.txt:

xyzfff-tool.lin failed
xyzggg-exec.lin failed
rstccc-tool.lin failed
Run Code Online (Sandbox Code Playgroud)

bash脚本应该捕获该行rstccc-tool.lin failed,但它会跳过它.

为了调试,我逐字打印grep命令,当我复制该行并在我的shell(tcsh)中发出命令时,它返回该行...

贝壳:

$ grep '\w\w\wccc-.*\.lin failed' /path/to/file.txt
    rstccc-tool.lin failed
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

如果grep可以在我正常发出命令时找到该行,那么当bash脚本调用grep时它怎么会找不到呢?

bash shell grep

2
推荐指数
1
解决办法
543
查看次数

查找数组B中不在数组A中的任何元素

预先警告,我是一个Perl新手.

我在寻找一个很好的简写来比较两个数组,说arrAarrB.

我想知道是否有任何元素arrB不在里面arrA.

如果重要,这些数组中的元素就是字符串.

我知道我可以通过迭代数组并使用来完成这个grep,但我想知道是否有一个很好的速记方式来做到这一点.我的Perl-fu缺乏.

谢谢!

编辑:这是我正在寻找的,以防我上面不清楚.

my @arrA = ( "aaa", "bbb", "ccc" );
my @arrB = ( "aaa", "bbb", "ccc", "ddd" );
my @BnotA = ();

# Something goes here, help!

print "Elements of arrB that are not in arrA: @BnotA\n";
Run Code Online (Sandbox Code Playgroud)

我对这里的数据结构并不挑剔; 如果我可以改变结构以使其更有效,我可以做到这一点.

arrays perl

0
推荐指数
1
解决办法
94
查看次数