RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

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

Adokenai's questions

Martin Hope
Adokenai
Asked: 2023-08-16 20:08:22 +0000 UTC

如何实现像reinterpret_cast这样的东西但不必指定所有说明符?

  • 6

厌倦了不断地编写reinterpret_cast来指定所有说明符(const、易失性)。想出了一个模板。

template<typename toT, typename T>
static inline auto toType(T val) {
  using t2 = typename cond< 
    is_const<T>,
    typename cond <
      log_and< is_pointer<T>, is_pointer<toT> >,
      const typename remove_pointer<toT>::type *,
      toT 
      >::type,
    toT
  >::type;
  return reinterpret_cast< t2 >(val);
}

正如你所看到的,结果发生了一些可怕的事情,而这只是考虑到了 const 说明符。代码不按照标准,因为一切都是自己写的,但本质没有改变。该代码有效。

有没有更简单的方法来改变数据的解释?底线是这样的:假设有一个类型为 的变量const volatile char * A,您需要将访问权限从逐字节更改为整数,即const volatile int * A。一个简单的方法reinterpret_cast<int*>(A)会同时删除const和volatile。

根据答案解决方案:

template<typename TValue>
struct remove_pointer<TValue *> {
  using type = TValue;
};

template<typename T>
auto toType(void* p) {
  return reinterpret_cast< typename remove_pointer<T>::type *>(p);
}

template<typename T>
auto toType(const void* p) {
  return reinterpret_cast<const typename remove_pointer<T>::type*>(p);
}

template<typename T>
auto toType(volatile void* p) {
  return reinterpret_cast<volatile typename remove_pointer<T>::type*>(p);
}

template<typename T>
auto toType(const volatile void* p) {
  return reinterpret_cast<const volatile typename remove_pointer<T>::type*>(p);
}
c++
  • 1 个回答
  • 60 Views
Martin Hope
Adokenai
Asked: 2020-03-22 03:04:49 +0000 UTC

如何在浏览器中从根本上禁用 Yandex Zen?

  • 0

应请求“禁用 Yandex.Zen” 互联网提示不起作用。如何永久禁用此功能?

而不是“禅” - 刺激。AdBlocker 之类的不能处理这个。Yandex 技术支持处于守势。

一种叫做 Yandex Zen 的鸟粪出现在任何地方。雅达的文章让我很烦。

我不反对广告,但我反对任何鸟粪。

яндекс
  • 2 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-01-08 15:00:27 +0000 UTC

如何将 SSD 用作 RAM?

  • 5

我将立即预订不需要 ram 磁盘,但我需要确保系统将 SSD 视为一种 RAM 内存条。没有提出关于速度和延迟的问题。

也就是我在SSD上定义了某个文件或者整个磁盘,在系统中被认为是一个内存槽。

虚拟(交换)内存不适合,因为它对软件是“透明的”或不可见的。

例如:有 4GB 的真实 RAM 和 128GB 的​​ SSD。我想将 SSD 的一部分作为 VM 和程序的 RAM。使用所需的方案,我可以为处理器提供最大容量 (64GB),而不是最大可用 RAM (4GB)

我会考虑所有选项,除了“购买 RAM 并且不交换大脑”选项。

感谢大家解释RAM的理论和内存的分页组织。

这是关于“伪造”内存的纯软件方式,这样您就可以为程序分配比板载更多的内存。VM 示例是说明性的:没有一个 VM 允许您分配比 RAM 更多的内存,即使交换文件大 16 倍也是如此。

ssd
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-01-03 13:56:49 +0000 UTC

如何为任何用户使用 ext3/ext4 闪存驱动器?

  • 2

问题是这样的:我在几台计算机上工作,我需要使用 USB 闪存驱动器将信息从一台计算机传输到另一台计算机。用户在任何地方都是不同的,但是在根目录下做所有事情,你知道的,这不是comme il faut。不断更改文件的权利和所有者太长且昂贵。

闪存驱动器还具有可执行文件、符号链接。FAT* 不适合。如果仍然可以在 fstab 中使用可执行文件,那么这不适用于 ext 上的所有者。

模式 777 也是一个坏主意。如何在保留所有用户的所有文件属性的情况下将信息写入 USB 闪存驱动器?类似于 Windows 中用于 NTFS 的“所有人”用户。

Internet 搜索仅提供有关如何使用 Ubuntu 创建可启动 USB 闪存驱动器的建议。

ubuntu
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-12-07 19:32:24 +0000 UTC

如何在树莓派 4 上运行 UEFI?

  • 0

互联网上有关于使用 UEFI 引导 RPi 2/3+ 的信息。但是所有这些方法都不适用于 RPi4。目标:获得一个 UEFI 环境来引导和运行 UEFI 应用程序。

raspberry-pi
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-04-11 21:59:37 +0000 UTC

EFI 映像有哪些要求?

  • 0

我本着“在实践中研究”的原则,从零开始开发一个操作系统。使用 EFI 加载文件。与 EFI 的交互减少到最低限度。在 VirtualBox 中,文件每隔一次启动一次,这取决于 ld 脚本的内容,或者更确切地说,取决于图像开头的设置。

在真机上,没有任何输出,它只是返回启动菜单或报告没有可启动媒体。

很难举一个例子来说明这个问题。代码可以从链接中获得。

谷歌搜索在这方面绝对没有给出任何信息(我可能是错的)。

gcc
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-04-02 20:20:23 +0000 UTC

如何安排模板统一使用数字和指针?

  • 1

尝试次数:

  template<typename THigh, typename TLow>
    inline size_t compact(THigh hi, TLow lo){
        return (reinterpret_cast<size_t>(hi)<<32) | reinterpret_cast<size_t>(lo);
    }

Types THigh,TLow可以是数字类型或指针类型的任意组合。编译器对提议的变体发誓invalid cast。

尝试二:

  template<typename THigh, typename TLow>
    inline size_t compact(THigh hi, TLow lo){
        return (static_cast<size_t>(hi)<<32) | static_cast<size_t>(lo);
    }

编译器又在抱怨了invalid static_cast。宏中的更改绝对没有任何作用。您可以编写四个函数,但它们的代码本质上是相同的。

您可以使用已弃用的 c 样式:

template<typename THigh, typename TLow>
    inline size_t compact(THigh hi, TLow lo){
        return ((size_t)(hi)<<32) | (size_t)(lo);
    }

但是这种风格隐藏了(微妙的)类型转换。

通常,您需要组合所有选项:

void*, size_t

size_t, void*

void*, void*

需要此功能才能将具有 32 位访问权限的 MMIO 中的数据转换为 64 位系统的指针。即高位或低位部分为数字,其余为指针。数字和数字只会是一个副作用。

size_t有 64 位。指针 - 64 位。一切都是 64 位的,只有一些参数是数字,还有一些是指针。

c++
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-02-03 13:23:37 +0000 UTC

如何在中断中禁用 fpu?

  • 4

有一个带有中断处理程序的文件。所有函数都用[[gnu::interrupt]]. 如果全局禁用 fpu387 和 SSE 命令的生成,则所有内容都会被编译。如果您允许使用 fpu387 和/或 SSE,则会发生错误

抱歉,未实现:中断中不允许使用 MMX/3Dnow 指令

.

使用 SSE,问题可以通过编译指示解决:#pragma GCC target "no-mmx,no-sse" 但这不适用于 80387:

抱歉,未实现:中断服务程序中不允许使用 80387 指令

我在搜索引擎中进行了搜索,但没有找到如何指示此文件中根本没有使用实数的解决方案。在 GCC 关于禁用 fpu387 代码的说明中仅在编译器选项 ( -mno-80387) 中,即全局。

作为一个选项:全局关闭。我在通用头文件中包含了编译指示:#pragma GCC target("sse") 在我指定的文件#pragma GCC target("no-sse")中 . 结果:

抱歉,未实现:中断服务程序中不允许 SSE 指令'

也就是说,编译指示被成功忽略。

代码示例(这只是一个示例!)https://godbolt.org/z/kLVdWE

c++
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-01-06 19:39:25 +0000 UTC

如何找出usb flash的块大小?

  • 1

众所周知,闪存是按块写入的。文件系统也以块的形式写入数据。问题的本质是格式化“闪存驱动器”,其簇大小是物理内存块大小的倍数。为此,您需要知道这个尺寸。

железо
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-12-15 18:04:50 +0000 UTC

使用指针时如何更改 [] 运算符的行为?

  • 0

有一个给定的结构和一个指向该结构的指针类型的定义。

using MEMDESC = struct [[gnu::packed]] _mem_desc {
    _mem_desc *pmdNext; //8 //+0
    size_t ulSize; //8 //+8
    unsigned int uCUN; //4 //+16
    unsigned int uUUN; //4 //+20
    unsigned int smallData[1018]; //4n, максимум //+24
    unsigned int& operator[](unsigned int iInx){
        return smallData[iInx];
    }
};
using PMEMDESC = MEMDESC*;

PMEMDESC pmdWork;在代码中的某处定义。

我可以(*pmdWork)[0].wPrev = 0;用来访问,但记录本身看起来很草率到不可能的地步。使用时如何获得类似的功能pmdWork[0].wPrev=0?为了理解笨拙,使用指示的解决方案,我将给出一行:hhHandle=reinterpret_cast<void*>(&(*pmdWork)[sbIndex+1]);

c++
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-11-25 09:34:17 +0000 UTC

如何分配函数别名?

  • 1

共有三个功能

void operator delete(void * hPointer);
void operator delete(void * hPointer, size_t ulSize);
void operator delete[](void * hPointer, size_t ulSize);

它调用相同的代码。例如(仅举例):

{
    hPointer=nullptr;
    return;
}

可以复制每个函数的代码,但最好使用别名系统。也就是说,对于任何delete一个且相同的函数都必须被调用。预处理器指令的使用是不可能的,因为函数签名不同。

c++
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-11-20 13:09:42 +0000 UTC

使用模板时如何获取中间编译代码?

  • 3

对于预处理器有一个编译器参数-E,对于获取汇编代码有一个参数-S,但是我没有找到它来获取实例化模板函数的代码。

...

对于我自己,我找到了答案:需要一个论据-fdump-tree-original 但是这个答案被“版主”拒绝了,所以我写在这个问题中。

gcc
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-11-16 21:22:09 +0000 UTC

如何自动分配数组元素?

  • 1

宏从一开始就无法做到这一点。

const collation_t collation_ascii[256]头文件中定义了一个数组。类型

using collation_t = struct _collation {
    wchar_t l; 
    wchar_t u;
};

定义大小写字符的比例。要实际初始化数组元素,请使用模板

template<const size_t normal>
constexpr collation_t COLLATION() {
    return { normal, normal };
}
template<const size_t lower, const size_t upper>
constexpr collation_t COLLATION() {
    return { lower, upper };
}
template<const size_t number, const size_t lower, const size_t upper>
constexpr collation_t COLLATION() {
    return { lower, upper };
}

他工作。但是大多数数组元素都有内容{X, X},也就是唯一的。您需要类似 的东西COLLATION_RANGE(Begin, End),它将用值补充数组COLLATION<Current, Current, Current>,它以从 1到包含Current的步长“运行” 。在 SO 上有一个展开循环的选项(我找不到链接),或者更确切地说重复该函数一定次数(展开),但我无法调整此选项。BeginEnd

也就是说,我想要这个“糖”:

const collation_t collation_ascii[256]={
    COLLATION_RANGE<0, 64>(), 
    COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
    COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
    COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
    COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
    COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
    COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
    COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
    COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
    COLLATION<'y','Y'>(), COLLATION<'z','Z'>(),
    COLLATION_RANGE<91,60>(),
    COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
    COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
    COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
    COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
    COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
    COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
    COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
    COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
    COLLATION<'y','Y'>(), COLLATION<'z','Z'>(),
    COLLATION_RANGE<123,255>()
}

代替

const collation_t collation_ascii[256]={
    COLLATION<0>(), COLLATION<1>(), COLLATION<2>(), COLLATION<3>(),
    COLLATION<4>(), COLLATION<5>(), COLLATION<6>(), COLLATION<7>(),
    COLLATION<8>(), COLLATION<9>(), COLLATION<10>(), COLLATION<11>(),
    COLLATION<12>(), COLLATION<13>(), COLLATION<14>(), COLLATION<15>(),
    COLLATION<16>(), COLLATION<17>(), COLLATION<18>(), COLLATION<19>(),
    COLLATION<20>(), COLLATION<21>(), COLLATION<22>(), COLLATION<23>(),
    COLLATION<24>(),    COLLATION<25>(), COLLATION<26>(), COLLATION<27>(),
    COLLATION<28>(), COLLATION<29>(),   COLLATION<30>(), COLLATION<31>(),
    COLLATION<' '>(), COLLATION<'!'>(), COLLATION<'"'>(),   COLLATION<'#'>(),
    COLLATION<'$'>(), COLLATION<'%'>(), COLLATION<'&'>(), COLLATION<'\''>(),
    COLLATION<'('>(), COLLATION<')'>(), COLLATION<'*'>(), COLLATION<'+'>(),
    COLLATION<','>(),   COLLATION<'-'>(), COLLATION<'.'>(), COLLATION<'/'>(),
    COLLATION<'0'>(), COLLATION<'1'>(), COLLATION<'2'>(), COLLATION<'3'>(),
    COLLATION<'4'>(), COLLATION<'5'>(), COLLATION<'6'>(),   COLLATION<'7'>(),
    COLLATION<'8'>(), COLLATION<'9'>(), COLLATION<':'>(), COLLATION<';'>(),
    COLLATION<'<'>(), COLLATION<'='>(), COLLATION<'>'>(), COLLATION<'?'>(),
    COLLATION<'@'>(),
    COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
    COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
    COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
    COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
    COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
    COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
    COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
    COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
    COLLATION<'y','Y'>(), COLLATION<'z','Z'>(), COLLATION<'['>(),
    COLLATION<'\\'>(), COLLATION<']'>(), COLLATION<'^'>(), COLLATION<'_'>(),
    COLLATION<'`'>(),
    COLLATION<'a','A'>(), COLLATION<'b','B'>(), COLLATION<'c','C'>(),
    COLLATION<'d','D'>(), COLLATION<'e','E'>(), COLLATION<'f','F'>(),
    COLLATION<'g','G'>(), COLLATION<'h','H'>(), COLLATION<'i','I'>(),
    COLLATION<'j','J'>(), COLLATION<'k','K'>(), COLLATION<'l','L'>(),
    COLLATION<'m','M'>(), COLLATION<'n','N'>(), COLLATION<'o','O'>(),
    COLLATION<'p','P'>(), COLLATION<'q','Q'>(), COLLATION<'r','R'>(),
    COLLATION<'s','S'>(), COLLATION<'t','T'>(), COLLATION<'u','U'>(),
    COLLATION<'v','V'>(), COLLATION<'w','W'>(), COLLATION<'x','X'>(),
    COLLATION<'y','Y'>(), COLLATION<'z','Z'>(), COLLATION<'{'>(),
    COLLATION<'|'>(), COLLATION<'}'>(), COLLATION<'~'>(), COLLATION<127>(),
    COLLATION<128>(), COLLATION<129>(),
    COLLATION<130>(), COLLATION<131>(), COLLATION<132>(), COLLATION<133>(),
    COLLATION<134>(), COLLATION<135>(), COLLATION<136>(), COLLATION<137>(),
    COLLATION<138>(), COLLATION<139>(),
    COLLATION<140>(), COLLATION<141>(), COLLATION<142>(), COLLATION<143>(),
    COLLATION<144>(), COLLATION<145>(), COLLATION<146>(), COLLATION<147>(),
    COLLATION<148>(), COLLATION<149>(),
    COLLATION<150>(), COLLATION<151>(), COLLATION<152>(), COLLATION<153>(),
    COLLATION<154>(), COLLATION<155>(), COLLATION<156>(), COLLATION<157>(),
    COLLATION<158>(), COLLATION<159>(),
    COLLATION<160>(), COLLATION<161>(), COLLATION<162>(), COLLATION<163>(),
    COLLATION<164>(), COLLATION<165>(), COLLATION<166>(), COLLATION<167>(),
    COLLATION<168>(), COLLATION<169>(),
    COLLATION<170>(), COLLATION<171>(), COLLATION<172>(), COLLATION<173>(),
    COLLATION<174>(), COLLATION<175>(), COLLATION<176>(), COLLATION<177>(),
    COLLATION<178>(), COLLATION<179>(),
    COLLATION<180>(), COLLATION<181>(), COLLATION<182>(), COLLATION<183>(),
    COLLATION<184>(), COLLATION<185>(), COLLATION<186>(), COLLATION<187>(),
    COLLATION<188>(), COLLATION<189>(),
    COLLATION<190>(), COLLATION<191>(), COLLATION<192>(), COLLATION<193>(),
    COLLATION<194>(), COLLATION<195>(), COLLATION<196>(), COLLATION<197>(),
    COLLATION<198>(), COLLATION<199>(),
    COLLATION<200>(), COLLATION<201>(), COLLATION<202>(), COLLATION<203>(),
    COLLATION<204>(), COLLATION<205>(), COLLATION<206>(), COLLATION<207>(),
    COLLATION<208>(), COLLATION<209>(),
    COLLATION<210>(), COLLATION<211>(), COLLATION<212>(), COLLATION<213>(),
    COLLATION<214>(), COLLATION<215>(), COLLATION<216>(), COLLATION<217>(),
    COLLATION<218>(), COLLATION<219>(),
    COLLATION<220>(), COLLATION<221>(), COLLATION<222>(), COLLATION<223>(),
    COLLATION<224>(), COLLATION<225>(), COLLATION<226>(), COLLATION<227>(),
    COLLATION<228>(), COLLATION<229>(),
    COLLATION<230>(), COLLATION<231>(), COLLATION<232>(), COLLATION<233>(),
    COLLATION<234>(), COLLATION<235>(), COLLATION<236>(), COLLATION<237>(),
    COLLATION<238>(), COLLATION<239>(),
    COLLATION<240>(), COLLATION<241>(), COLLATION<242>(), COLLATION<243>(),
    COLLATION<244>(), COLLATION<245>(), COLLATION<246>(), COLLATION<247>(),
    COLLATION<248>(), COLLATION<249>(),
    COLLATION<250>(), COLLATION<251>(), COLLATION<252>(), COLLATION<253>(),
    COLLATION<254>(), COLLATION<255>()
}

需要注意的是,对于位置 'a' 和 'A' 的数组值是相同的。根据答案,我为自己准备了一个解决方案https://godbolt.org/z/7h2XNi 也许它会对某人有所帮助。

c++
  • 2 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-11-11 12:10:05 +0000 UTC

如何使用 C++ 工具触发中断?

  • 1

现在我使用:

#define int86(int) { asm volatile ("int $"#int ::: "memory"); }

它有效,但在不同的设计中constexpr,inline这种设计看起来不合时宜。
我假设您需要一个视图模板template< int I >void int86(){ asm volatile ( "int $???что здесь???":::"memory") },但我不明白如何构建它。

c++
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-09-15 00:22:10 +0000 UTC

如何强制使用32位访问结构?

  • 4

具有一定的位域结构。比方说

struct _example{ 
  unsigned f10:1;
  unsigned f11:1;
  unsigned f2:2;
  unsigned f4:4;
  unsigned f8:8;
  unsigned f16:16;
};

当以 a10|=1 的形式访问 f10 时,代码是orb $1,(%rcx),但是orl $1,(%rcx). 例如,%rcx 寄存器包含结构开头的地址。

您可以将相应的变量声明为 volatile,但此解决方案适用于第一个字段。

仔细想想,编译器无法确定结构中 32 位字的边界,所以它指的是字节。https://gcc.godbolt.org/z/17JQWM

c++
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-09-11 08:21:24 +0000 UTC

hlt 和 pause 命令有什么区别?用什么比较好?

  • 4

hlt 在中断到达之前“停止”处理器,从而减少负载。pause 也“停止”,但我找不到具体的描述。他们有不同的代码。

ассемблер
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-09-03 12:58:10 +0000 UTC

如何告诉编译器用相同的非空值填充静态数组?

  • 2

一种基本的方法:在初始化期间填充数组。但是该数组是静态的,并且已经占用了图像中的空间。您需要以某种方式告诉编译器用特定值填充数组的区域。代码static int arr[5]={1}填写为{1, 0, 0, 0, 0},但需要{1, 1, 1, 1, 1}

__attribute__((fillupper(1)))被 gcc 忽略。

该数组是非常量的。一个有 5 个元素的数组就是一个例子。您需要填充 4096 个元素的数组。STL 功能的使用受到严格限制,包括衍生产品。它们都有第一句话中指出的基本解决方案。

编辑答案:

template <typename type, type v>
struct IArray {
  type val = v;
  IArray& operator=(type n){
    val=n;
    return *this;
  }
  IArray& operator|=(type n){
    val|=n;
    return *this;
  }
};

您需要为所需的转换添加/更改运算符。

c++
  • 5 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-06-18 19:26:13 +0000 UTC

如何调用全局对象构造函数?

  • 0

有一个模板

    template<class TValue>
    class CDynList{
  public:
    CDynList(char className[]="");
  private:
    char name[32];

在另一个文件中,创建了该类的全局对象

CDynList<int> intList("intList");

编译、链接、运行。构造函数必须将字节从 className 复制到对象的 name 字段中。但这不会发生。汇编代码的分析包含必要的操作,但构造函数本身并没有在任何地方调用。

在定义对象变量的同一文件中,有一个向对象添加数据的函数。

   bool AppendInt(int i){
      return intList.append(i);
    }

该函数有效,但类名不可用。构造函数的描述。它在包含文件中。

template<class TValue>
CDynList<TValue>::CDynList(char *className){
      bzero(this->name, 32);
      mcopy(this->name, className, strlen(className)%31);
};

“找到”解决方案。这是一个链接描述文件和一个过程调用。脚本:

SECTIONS {
  PROVIDE (__base = .);
  .text : { *(.text) }
  .data : { *(.data) }
  .bss : { *(.bss) }
  .init_array     :
  {
    PROVIDE (__init_array_start = .);
    *(.init_array);
    PROVIDE (__init_array_end = .);
  }
}

程序:

extern "C"
{
    extern size_t __init_array_start;
    extern size_t __init_array_end;
    extern size_t __base;

    inline void static_init()
    {
        for (void (**p)() = reinterpret_cast<void(**)()>(__init_array_start); p < reinterpret_cast<void(**)()>(__init_array_end); ++p)
            (*reinterpret_cast<void(**)()>(reinterpret_cast<size_t>(p)+__base))();
    }
};

但是当我尝试加载已编译的 UEFI 文件时,我收到“未找到”错误。

c++
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-05-29 19:55:04 +0000 UTC

在 x64_32 下编译时应该怎么做才能传递函数引用?

  • 1
void main_loop(const CMsg); //прототип функции
typedef void (*HPROC)(const CMsg); //тип-функция
bool MessageSubscribe(HPROC hCallback, uint32_t uEvent); //прототип функции, в которую нужно передать указатель функции.

调用 MessageSubscribe 时,hCallback 传递的是 main_loop 函数代码的一部分,而不是指针。将 HPROC 更改为 void* 不会改变任何内容。使用 & 符号 (&main_loop) 根本不会影响任何事情。如果 main_loop 位于单独的文件中,则会出现问题。

IDT表中描述的“骑士的举动”,而不是指针,而是输入了一部分代码。错误在哪里?不能应用。

我在启用调试的情况下检查 VirtualBox 中的工作。并且调用调用获取的不是函数的地址,而是函数代码的开头。

变量中确认的内部输出。我特别介绍了调试行(kprint 是 printf 的类似物,不支持格式化,第二个参数是换行):

  kprint((HANDLE)*main_loop, true);
  kprint((HANDLE)main_loop, true);
  kprint((HANDLE)&main_loop, true);
  MessageSubscribe(&main_loop, EV_SYS);
  MessageSubscribe(&main_loop, EV_KBD);

0x400000...0x4FFFFF 内的普通代码地址

kpint 命令输出

as的输出:kmmain.oS和main_loop.oS

c++
  • 1 个回答
  • 10 Views
Martin Hope
Adokenai
Asked: 2020-05-20 07:18:06 +0000 UTC

如何将类型 bool 转换为枚举?

  • 0

有一个枚举:

enum {
 FALSE=0,
 TRUE=1
}BOOL;

BOOL var=true; 形式的赋值是必要的。是合法的。

c++
  • 2 个回答
  • 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