RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-189652

AccumPlus's questions

Martin Hope
AccumPlus
Asked: 2020-07-08 16:31:04 +0000 UTC

使用默认参数的 Lambda 表达式类型推断

  • 10

在不使用 option-Wpedantic的情况下,启用 c++11 的编译器允许在 lambda 表达式中使用默认值。

对于这样的表达式,您可以使用std::function指定所有参数类型的类型,包括默认指定的参数。

但是,当使用带有 auto 关键字的自动类型推断时,lambda 表达式采用特定类型,例如main()::<lambda(int)>,其中括号中的值是传递给表达式的参数的类型。并且这些值总是被指定,不管它们是否有默认值(这通常是合乎逻辑的)。

下面是一个代码示例。

#include <functional>
#include <iostream>

void f1(std::function<int()> lambda)
{
    if (lambda)
    {
        std::cout << lambda() << std::endl;
    }
}

void f2(std::function<int(int)> lambda)
{
    if (lambda)
    {
        std::cout << lambda(1) << std::endl;
    }
}

int main()
{
    auto lambda1 = [](int a = 3) -> int
    {
        return a;
    };

    f1(lambda1);
    f2(lambda1);

    std::function<int()> lambda2 = []()
    {
        return 1;
    };

    std::function<int(int)> lambda3 = [](int a)
    {
        return a;
    };

    f1(lambda2);
    //f2(lambda2); // Очевидно несоответствие типов

    //f1(lambda3); // Очевидно несоответствие типов
    f2(lambda3);
}

在代码示例中,类型main()::<lambda(int)>被强制转换为std::function<int()>. 我没有足够的知识来理解为什么编译器不会对类型不匹配发誓。请帮我解释一下。

以及相关问题。

我可以明确指定一种类型,比如自动推断的类型吗?

我可以告诉编译器不允许这种类型的转换吗?

c++
  • 3 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-05-05 15:48:11 +0000 UTC

通过右值参数值传递给函数

  • 2

我认为值得立即开始使用代码:

#include <iostream>

class C
{
    public:

        C(int a);

        ~C();

        C(const C &rhs);

        C& operator=(const C &rhs);

        C(C &&rhs);

        C& operator=(C &&rhs);

        int _a;
};

void func(C a)
{
    std::cout << a._a << std::endl;
}

int main()
{
    func(C{1});

    std::cout << "Exit" << std::endl;
    return 0;
}

C 类实现所有自动生成的方法(构造函数、析构函数、构造函数和用于复制和移动的赋值运算符)。

方法的调试信息输出显示,对于传递给 func 函数(主函数的第一行)的对象,仅调用简单的构造函数。

这听起来像是一个愚蠢的问题,但这对我来说是一个启示。为什么没有调用复制操作?传递给 func 的参数只是“成为”函数本身的局部参数。一直都是这样,还是现代编译器的优化?

如果有的话,我使用的是支持 11 和 14 标准的 GNU g++ 6.3.1。

c++
  • 2 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-01-23 15:19:09 +0000 UTC

在系统启动时挂载“自己的”分区而不是默认分区

  • 2

我安装系统的时候,创建了分区,生成了fstab。这是它的内容:

# /dev/sda3
UUID=abe3b587-3a5f-47d6-8f66-2df758e70665   /           ext4        rw,relatime,data=ordered    0 1
# /dev/sda1
UUID=D2C4-B10A          /boot       vfat        rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro    0 2
# /dev/sda2
UUID=23349153-86c4-495a-a78d-1034090f3cb1   none        swap        defaults    0 0

使用设备映射器,我创建了一个将所有请求转换为真实设备的虚拟设备。例如,设真实设备为/dev/sda3,虚拟设备为/dev/mapper/root_part。

我在 udev 守护进程规则中创建它。以下是规则本身:

KERNEL=="sd*",SUBSYSTEM=="block",ACTION=="add",ENV{ID_FS_UUID}=="abe3b587-3a5f-47d6-8f66-2df758e70665",RUN+="/lib/udev/create_virtual.sh %k"
KERNEL=="sd*",SUBSYSTEM=="block",ACTION=="remove",ENV{ID_FS_UUID}=="abe3b587-3a5f-47d6-8f66-2df758e70665",RUN+="/lib/udev/remove_virtual.sh"

反过来,脚本在那里执行:

创建_virtual.sh

#!/bin/bash
echo 0 32359055360 basic_target /dev/$1 0 | dmsetup create root_part
exit 0

remove_virtual.sh

#!/bin/bash
dmsetup remove root_part
exit 0

basic_target 是从本文复制(并进行了一些修改)的自写内核模块。

我的解决方案是修复 fstab,以便不挂载根分区本身,而是挂载其对应的虚拟分区。为此,我需要 udev 守护进程在处理 fstab 之前创建这个虚拟设备。但这里有问题。将规则的优先级设置得太高是行不通的,因为我后来意识到,设备会在以下规则之一中获取 UUID。逐渐降低优先级,我确保不再发生此错误,但出现了一个新错误 - 我要在其上制作虚拟机的设备进入“忙碌”状态。同时,闪存驱动器的类似技巧并没有给出这个错误:根据 fstab 中添加的行创建并挂载了一个虚拟设备。从中我得出结论 /dev/sda3 已经安装。

由于没有实现我的目标,我决定简单地从 fstab 中删除带有根部分的行,并直接从 create_virtual.sh 脚本挂载设备。但是从 fstab 中删除行没有任何作用。我什至完全清除了 fstab - 系统继续正常启动。

我的问题是如何在挂载分区时强制系统使用其他设备?

另外,如果有更好的方法来解决我的问题,那么我真的很想听听。

linux
  • 1 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-01-20 19:01:55 +0000 UTC

udev 不会在 ACTION=="add" 上触发规则

  • 0

有必要为 udev 守护程序编写一个规则,该规则将在闪存驱动器连接事件上运行脚本。

写了一个简单的规则(文件名10-alabel.rules,优先级最高):

KERNEL=="sd*", ENV{ID_FS_UUID}=="a004d31c-120d-4593-b051-6ef8951d52d0" RUN+="/lib/udev/create_virtual.sh %k"

create_virtual.sh 的内容:

#!/bin/bash

echo $1 >> /home/accumplus/1.txt

exit 0

移除闪存驱动器时会触发此规则。我需要补充。我添加动作参数:

ACTION=="add", KERNEL=="sd*", ENV{ID_FS_UUID}=="a004d31c-120d-4593-b051-6ef8951d52d0" RUN+="/lib/udev/create_virtual.sh %k"

之后,该规则原则上拒绝工作。我以为是因为 %k 参数的存在(设备很可能还没有被添加到 dev 目录,我已经提到了它的名字),但是删除这个参数并没有改变任何东西。

如何解决这个问题呢?

更新程序

如果不指定 UUID 环境变量,则会触发规则。我试图在添加闪存驱动器时运行的脚本中显示此环境变量的值:

echo $ID_FS_UUID >> /home/accumplus/1.txt

准确输出我在规则条件中指定的值:

a004d31c-120d-4593-b051-6ef8951d52d0
linux
  • 1 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-12-29 17:47:14 +0000 UTC

C引导扇区编程

  • 10

我了解引导扇区编程。我是按照这篇文章做的。一切顺利,直到对输出“Hello, World!”进行编程为止。在C中。这是文章中给出的代码(实际上,我只是复制它):

__asm__(".code16\n");
__asm__("jmpl $0x0000, $main\n");

void printString(const char* pStr) {
     while(*pStr) {
          __asm__ __volatile__ (
               "int $0x10" : : "a"(0x0e00 | *pStr), "b"(0x0007)
          );
          ++pStr;
     }
}

void main() {
     printString("Hello, World");
}

我又按照那篇文章编译、链接等:

gcc -c -g -Os -m32 -ffreestanding -Wall -Werror test.c -o test.o
ld -melf_i386 -static -Ttest.ld -nostdlib --nmagic -o test.elf test.o
objcopy -O binary test.elf test.bin
dd if=/dev/zero of=floppy.img bs=512 count=2880
dd if=test.bin of=floppy.img

为了以防万一,我给出test.ld的内容:

ENTRY(main);
SECTIONS
{
    . = 0x7C00;
    .text : AT(0x7C00)
    {
        *(.text);
    }
    .sig : AT(0x7DFE)
    {
        SHORT(0xaa55);
    }
}

我运行 bochs,但我没有打印“Hello, World”,而是只得到一个“S”字符。

将函数移至 main:

__asm__(".code16\n");
__asm__("jmpl $0x0000, $main\n");
void main()
{
    char s[] = "Hello, World";
    char *str = s;
    while (*str)
    {
        __asm__ __volatile__ (
               "int $0x10" : : "a"(0x0e00 | *str), "b"(0x0007)
          );
        ++str;
    }
}

之后,他原则上不再展示任何东西。-Os 优化标志的异常有所帮助。结论是正确的。经过一些试验,我意识到这种优化“杀死”了循环。

然而,相同的代码,但移至一个函数,仍然输出“S”字符。

我寻求帮助解决这个问题。并且,如果可能的话,解释为什么优化标志“杀死”循环。谢谢!

更新。

来自 test.bin 的十六进制:

66 EA 3A 7C 00 00 00 00 66 55 66 89 E5 EB 19 67 66 8B 45 08 67 66 0F B6 00 66 0F BE C0 80 CC 0E CD 10 67 66 83 45 08 01 67 66 8B 45 08 67 66 0F B6 00 84 C0 75 D9 90 66 5D C3 66 55 66 89 E5 66 68 4F 7C 00 00 E8 C0 FF 66 83 C4 04 90 C9 C3 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 00 14 00 00 00 00 00 00 00 01 7A 52 00 01 7C 08 01 1B 0C 04 04 88 01 00 00 1C 00 00 00 1C 00 00 00 8C FF FF FF 32 00 00 00 00 42 0E 08 85 02 43 0D 05 6C C5 0C 04 04 00 00 1C 00 00 00 3C 00 00 00 9E FF FF FF 15 00 00 00 00 42 0E 08 85 02 43 0D 05 4F C5 0C 04 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA

该文件是从以下来源获得的:

__asm__(".code16\n");
__asm__("jmpl $0x0000, $main\n");

void printString(const char* str)
{
    while (*str)
    {
        __asm__ __volatile__ (
               "int $0x10" : : "a"(0x0e00 | *str));
        ++str;
    }
}

void main()
{
    printString("Hello, World");
}

更新。

test.elf文件反汇编结果:

% objdump -d test.elf

test.elf:     file format elf32-i386

Disassembly of section .text:

00007c00 <printString-0x8>:
    7c00:   66 ea 3a 7c 00 00       ljmpw  $0x0,$0x7c3a
    ...

00007c08 <printString>:
    7c08:   66 55                   push   %bp
    7c0a:   66 89 e5                mov    %sp,%bp
    7c0d:   eb 19                   jmp    7c28 <printString+0x20>
    7c0f:   67 66 8b 45 08          mov    0x8(%di),%ax
    7c14:   67 66 0f b6 00          movzbw (%bx,%si),%ax
    7c19:   66 0f be c0             movsbw %al,%ax
    7c1d:   80 cc 0e                or     $0xe,%ah
    7c20:   cd 10                   int    $0x10
    7c22:   67 66 83 45 08 01       addw   $0x1,0x8(%di)
    7c28:   67 66 8b 45 08          mov    0x8(%di),%ax
    7c2d:   67 66 0f b6 00          movzbw (%bx,%si),%ax
    7c32:   84 c0                   test   %al,%al
    7c34:   75 d9                   jne    7c0f <printString+0x7>
    7c36:   90                      nop
    7c37:   66 5d                   pop    %bp
    7c39:   c3                      ret    

00007c3a <main>:
    7c3a:   66 55                   push   %bp
    7c3c:   66 89 e5                mov    %sp,%bp
    7c3f:   66 68 4f 7c             pushw  $0x7c4f
    7c43:   00 00                   add    %al,(%eax)
    7c45:   e8 c0 ff 66 83          call   83677c0a <main+0x8366ffd0>
    7c4a:   c4 04 90                les    (%eax,%edx,4),%eax
    7c4d:   c9                      leave  
    7c4e:   c3                      ret

更新。

这是处理器看到程序时对 hiew 的反汇编:

7c00: 66EA3A7C00000000              jmpf        00000:07C3A
7c08: 6655                         3push        ebp
7c0A: 6689E5                        mov         ebp,esp
7c0D: EB19                          jmps        000000028 --↓1
7c0F: 67668B4508                   2mov         eax,[ebp][8]
7c14: 67660FB600                    movzx       eax,b,[eax]
7c19: 660FBEC0                      movsx       eax,al
7c1D: 80CC0E                        or          ah,00E
7c20: CD10                          int         010
7c22: 676683450801                  add         d,[ebp][8],1
7c28: 67668B4508                   1mov         eax,[ebp][8]
7c2D: 67660FB600                    movzx       eax,b,[eax]
7c32: 84C0                          test        al,al
7c34: 75D9                          jnz         00000000F --↑2
7c36: 90                           nop
7c37: 665D                          pop         ebp
7c39: C3                            retn ;
7c3A: 6655                          push        ebp
7c3C: 6689E5                        mov         ebp,esp
7c3F: 66684F7C0000                  push        000007C4F ;'  |O'
7c45: E8C0FF                        call        000000008 --↑3
7c48: 6683C404                      add         esp,4
7c4C: 90                            nop
7c4C: 90                            nop
7c4D: C9                            leave
7c4E: C3                            retn ;
7c4F: 48 65 6C 6C 6F-2C 20 57 6F-72 6C 64  Hellow, World

随机地,我注意到指针确实需要移动。对于引导区,需要将代码放在磁盘的第一个扇区,偏移量为0x7C00字节。我在 test.ld 文件中指定它。我试图展示我所拥有的一切。在一堆不同的符号中,潜伏着想要的“你好,世界”。同时,更改代码需要更改偏移量,但我几乎可以肯定它总是大于 0x7C00。仍然需要了解如何正确跟踪此偏移量......

c
  • 1 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-12-08 21:40:57 +0000 UTC

构建静态链接的 GCC 编译器

  • 0

是否可以从源代码构建静态链接的 GCC 编译器?

如果是这样,应该指定什么配置/构建标志?

linux
  • 1 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-12-07 22:34:03 +0000 UTC

运行 gcc 并链接到其他库

  • 0

这个想法可能看起来很奇怪。我正在为 linux 创建一个开发环境。创建目录/home/user/myOS。它有 usr、usr/bin、usr/lib 和链接 bin->usr/bin、lib->usr/lib。我从一个操作系统中复制了必要的二进制文件和库(我们称之为 OSold,它更旧)。但是,我想在这个环境下使用新的编译器进行编译,所以我从另一个系统(我们称它为 OSnew,它是新鲜的)复制 g++ 和 gcc。(我不确定如果没有实际的 libc,我能否做点什么)。顺便说一句,环境是在 OSnew 上创建的。

我通过 chroot 进入环境。当编译器启动时,会发生以下情况:

bash-3.00# g++
g++: /lib/libc.so.6: version `GLIBC_2.11' not found (required by g++)
g++: /lib/libc.so.6: version `GLIBC_2.4' not found (required by g++)

我知道他需要这些库才能运行。我创建了一个单独的目录:/home/user/myOS/home/mylibs。我将实际的 libc 库放入其中。再次chroot,然后执行以下操作:

bash-3.00# LD_LIBRARY_PATH=/home/mylibs g++

但它仍然首先扫描标准目录并因上述错误而崩溃。尝试并通过出口 - 都一样。

告诉我如何在运行可执行文件时强制 shell 准确使用我的库?通常,LD_LIBRARY_PATH 正常工作需要什么?(然后我可以很好地复制一些重要的东西)。

关于重复的问题

这个问题是关于系统位数之间的差异。还有一个关于库版本的问题。

更新程序

很可能,在这个问题的框架内,如此强烈的变化是不可接受的。但是让版主决定。

一般来说,chroots可以忘记。在真正的旧系统上,在新系统上编译的程序使用以下命令运行:

g++ -m32 main.cpp -o Main -Wl,--hash-style=sysv

但是,当使用新的标准构造时,C++ 会生成以下内容:

./Main: /usr/lib/libstdc++.so.6: version 'GLIBC_3.4.21' not found (required by ./Main)

我试图指定新库的路径(显然是 32 位):

LD_LIBRARY_PATH="/home/temp/mylibs/" ./Main
./Main: error while loading shared libraries: /home/temp/mylibs/libstdc++.so.6: ELF file OS ABI invalid

任何想法如何解决这个问题?

linux
  • 1 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-12-03 02:56:02 +0000 UTC

确定所需的编译器版本

  • 0

正在用c++语言开发一个项目,希望能在基于Linux内核的完全不同版本的操作系统上使用。

这个问题听起来很奇怪,但是有什么方法可以确定成功构建项目所需的 g++ 编译器版本吗?

c++
  • 1 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-10-03 16:59:38 +0000 UTC

在 Python 中拦截信号

  • 7

有两个程序通过命名管道相互通信。一种在 C++ 中,一种在 Python 中。此外,第一个启动第二个(以标准方式,通过 fork + exec)。

父程序交流区(C++):

// ...
int pipeDescr;
std::string outputPipeName{"inputPipe"};
std::string inputPipeName{"outputPipe"};
char *message = new char[BUFSIZE];
// ...
while (true)
{
    int bytesNumber = 0;
    // ...
    if ((pipeDescr = open(outputPipeName.c_str(), O_WRONLY)) <= 0)
        break;

    bytesNumber = write(pipeDescr, message, strlen(message));
    if (bytesNumber <= 0)
        break;

    close(pipeDescr);

    message[0] = '\0';
    if ((pipeDescr = open(inputPipeName.c_str(), O_RDONLY)) <= 0)
        break;

    bytesNumber = read(pipeDescr, message, BUFSIZE);
    if (bytesNumber <= 0)
        break;

    close(pipeDescr);
    // ...
}

watchDog函数运行在一个单独的线程中,负责Python中子应用程序的运行。

void watchDog(int clientSocket, pid_t pid, bool &stopWatchDog)
{
    while (true)
    {
        // Дочерняя программа завершилась с ошибкой
        if (waitpid(pid, NULL, WNOHANG) != 0)
        {
            // ...
        }

        // Родительская программа закрывается
        mutexClosing.lock();
        if (closing)
        {
            mutexClosing.unlock();
            if (waitpid(pid, NULL, WNOHANG) == 0)
            {
                kill(pid, SIGTERM);
                waitpid(pid, NULL, 0);
            }
            break;
        }
        mutexClosing.unlock();

        // Программное отключение WatchDog-а
        mutexWatchDog.lock();
        if (stopWatchDog)
        {
            if (waitpid(pid, NULL, WNOHANG) == 0)
            {
                kill(pid, SIGTERM);
                waitpid(pid, NULL, 0);
            }
            mutexWatchDog.unlock();
            break;
        }
        mutexWatchDog.unlock();
    }
}

这样做有以下三种结果:

  • 子程序崩溃

  • 父程序的终止

  • 在不终止父程序的情况下终止子程序

最后两个选项要求子程序正常终止,所以我向它发送一个 SIGTERM 信号并等待它完成。

子程序通信部分(Python):

def sigterm_handler(signal, frame):
    print('\nGot sigterm!\n')
    sys.exit(0)

def main():
    input_pipe_name = "inputPipe"
    output_pipe_name = "outputPipe"
    # ...
    signal.signal(signal.SIGTERM, sigterm_handler)
    # ...
    while True:
        pipe_descr = os.open(input_pipe_name, os.O_RDONLY)
        request = os.read(pipe_descr, 10000)
        os.close(pipe_descr)

        reply = work_func(request)

        pipe_descr = os.open(output_pipe_name, os.O_WRONLY)
        os.write(pipe_descr, bytes(reply, 'UTF-8'))
        os.close(pipe_descr)

我在代码中添加了 SIGTERM 信号的处理。但是,发送此信号时,不会调用 sigterm_handler 函数。

但!如果你写这样的东西:

def main():
    signal.signal(signal.SIGTERM, sigterm_handler)

    while True:
        print('waiting...')
        time.sleep(2)

该函数将被调用。

请告诉我如何解决这个问题!

c++
  • 2 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-09-30 01:24:48 +0000 UTC

从客户端接收数据时,连接因对等错误而重置

  • 1

我正在为教育目的编写一个简单的服务器。简要程序示例:

// ...
unsigned int BUFSIZE = 0;
BUFSIZE -= 2;
// ...
int clientSocket;
// Создаём подключение
// ...
char *message = new char[BUFSIZE];
while (true)
{

    long bytesNumber = 0;
    bytesNumber = recv(clientSocket, message, BUFSIZE - 1, 0);
    if (bytesNumber <= 0)
    {
        perror("recv");
        break;
    }

    // ...
    // Получаем ответ в ту же переменную message
    // ...

    bytesNumber = send(clientSocket, message, strlen(message) + 1, 0);
    if (bytesNumber < 0)
    {
        perror("send");
        break;
    }
}
delete[] message;
message = 0;

当我向客户端发送小数据时,一切正常。当数据大小超过12510字节(selection接收),则send成功,后面的recv返回-1,对应connection reset by peer error。

请告诉我如何解决这个问题。

更新程序

我写了一个简单的客户端连接到这个服务器并在没有任何 HTTP 处理的情况下与它循环通信。接收或发送都没有问题。可能我对HTTP不是很了解。。。里面有什么限制或者特别之处吗?头条?

更新程序

一个有趣的情况。我通过在 Content-length 标头中传递一个比数据的实际大小大 1 的数字来解决这个问题。奇怪的是,为什么没有这个单元,小数据通常会被传输......

c++
  • 1 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-09-27 15:49:46 +0000 UTC

功能存在时模块的动态连接

  • 0

有一个带有“.py”扩展名文件的目录。您需要浏览文件并仅包括那些具有特定名称函数的文件。

我只得到这个(main.py 文件):

from os import listdir
from os.path import isfile, join
import importlib

filepath = './'
for f in listdir(filepath):
    if isfile(join(filepath, f)) and f != 'main.py':
        moduleloader = importlib.find_loader(f.split('.')[0])
        if moduleloader is not None:
            # check if module has function

它到达了评论的地方,但如何检查是个问题。还有一个问题,如何进一步使用这个功能?

python
  • 3 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-09-16 14:23:31 +0000 UTC

在进程之间传递和接收数据(C++ 和 Python)

  • 0

我有一个用 C++ 编写的程序。有一个用 Python 编写的脚本(使用哪种语言并不重要)。有必要将这些程序的进程之间的数据传输正式化。具有 GNU/Linux 内核的操作系统。

我看到了不同的选项,但基本上 Python 始终充当启动 C++ 程序进程的启动应用程序。C++ 进程运行 Python 脚本需要相反的过程。

希望该方法是通用的,即可以用另一种语言编写脚本并使用相同的方法与其交换数据。

c++
  • 3 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-08-31 18:59:44 +0000 UTC

将动态库链接到可执行文件

  • 3

我正在为使用第三方动态库的项目编写 Makefile。该库位于默认列表中未包含的特定目录中。

编译成功。显然,启动时出现问题 - 它找不到库。

是否可以编写一个 Makefile 来执行与 CMake 中的 link_directories 相同的功能?也就是说,库的路径被“硬连线”到可执行文件中。

unix
  • 2 个回答
  • 10 Views
Martin Hope
AccumPlus
Asked: 2020-08-23 17:30:07 +0000 UTC

LUA lib + C语言,使用模块函数返回运行时错误

  • 1

使用标准 Lua 模块的函数总是会返回运行时错误。代码示例:

//...
char script[] = "io.write(\"Hello!\n\")";
printf("%d\n", luaL_loadbuffer(L, script, strlen(script), NULL));
printf("%d\n", lua_pcall(L, 0, 0, 0));
//...

屏幕上显示:

0
2

根据lua.h中错误的定义,数字2对应的是LUA_ERRRUN。

同时,同一行在终端中工作:

$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> io.write("Hello!\n");
Hello!

使用标准的 lua 元素不会导致错误:

//...
char script[] = "print(\"Hello!\")";
printf("%d\n", luaL_loadbuffer(L, script, strlen(script), NULL));
printf("%d\n", lua_pcall(L, 0, 0, 0));
//...

输出:

0
Hello!
0

使用这些功能的正确方法是什么?谢谢!

c
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5