小编Sou*_*a B的帖子

无法获取默认调试密钥库位置

我将 Android Studio 设置中的项目默认位置从 更改/Documents/Android Studio projects/Documents/AndroidProjects。然后我在文件资源管理器中将现有项目从前者移动到后者。然后我打开 Android Studio 并导入该项目。现在构建时出现此错误:

Build file 'C:\Users\Sourav Kannantha B\Documents\AndroidProjects\Skara\app\build.gradle' line: 1

A problem occurred evaluating project ':app'.
> Failed to apply plugin [id 'com.android.internal.application']
   > Failed to get default debug keystore location.
Run Code Online (Sandbox Code Playgroud)

我检查了所有的 gradle 文件,没有提到任何与路径相关的内容。所以我不知道是什么导致了这个错误。请帮我。

整个错误日志:

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\Users\Sourav Kannantha B\Documents\AndroidProjects\Skara\app\build.gradle' line: 1

* What went wrong:
A problem occurred evaluating project ':app'.
> Failed to apply plugin [id 'com.android.internal.application']
   > Failed …
Run Code Online (Sandbox Code Playgroud)

android file-move android-studio build.gradle android-gradle-plugin

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

C++标准库中哪些函数在使用时不应该带有std::前缀?

当我用 C++ 编程时,using namespace std;我通常倾向于使用std::前缀组件,例如等std::cout,而不是编写std::cin。但是后来我遇到了 ADL 以及为什么应该使用using std::swap;

标准库(在 std 内)的许多组件以不合格的方式调用交换,以允许调用非基本类型的自定义重载,而不是此通用版本:在与其所属类型相同的命名空间中声明的交换的自定义重载提供通过对此通用版本进行参数相关的查找来选择。

但在所有有关 ADL 的资料中,他们只提到std::swap. 还有其他类似的功能在使用时需要注意吗?或者对于所有其他功能,我应该使用完全限定名称吗?或者我应该为中的每个函数使用非限定名称std::

编辑:(在表达我最初的问题时,我不清楚。这是我在写问题时的确切意图。)

C++ 标准库中是否还有其他函数是基于 ADL 的自定义的热门候选函数,类似于std::swap,因此当我使用它们时,我必须谨慎使用using std::foo; foo();表单而不是std::foo();直接调用?

c++ std qualified-name argument-dependent-lookup unqualified-name

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

如何在 C++ 中通过 cin 将“无穷大”作为值加倍?

在我的程序中,我将斜率值作为用户的输入。代码片段如下所示:

double m;
std::cout << "Enter slope value:";
std::cin >> m;
Run Code Online (Sandbox Code Playgroud)

但目前我无法给出“无穷大”作为斜率值。如果输入“inf”,m 将存储 0,可能是由于解析错误。如果我输入非常大的数字,例如 1e1000,m 将存储 DBL_MAX,即 1.79769e+308。

那么我应该在控制台中输入什么,以便 m 包含“无穷大”的值?(垂直线的斜率)。

c++ double user-input cin console-application

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

JVM 如何在运行时知道行号?

编译 .java 文件时,它会生成一个包含字节码的 .class 文件。JVM 获取该字节码并执行它。这一步的字节,如果抛出异常,还会在源代码中提到这个错误发生在哪一行。但是字节码和源代码中的行号将完全不同,并且字节码在编译期间也不存储行号,因为我没有找到任何与之相关的助记符(并且存储行号只会增加代码大小)。那么有人可以告诉我 JVM 如何在抛出异常的源代码中获取确切的行号。

java line-numbers jvm-bytecode

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

为什么 C++ 不使用 Java 之类的泛型类型擦除?

虽然Java的类型擦除有明显的优势(主要是减少生成的代码)为什么C++没有这个特性?我知道这种类型的泛型有许多其他限制,比如你不能在函数内部使用泛型类型(因为它被删除了),你只能将“类”类型传递给它,而不是像 C++ 等中的原始类型等等。

但是如果需要的话,C++ 可以同时拥有......当用户想要在函数内部使用类型时,他可以使用模板样式,否则他可以在泛型类/函数的声明期间使用类型擦除样式。为什么不是这样?我不想要任何基于意见的答案.. 究竟是什么阻止了这一点?

编辑
例如,

class A {
    virtual void do_something() {}
};

class B: public A {
    virtual void do_something() {}
};

template <class T>
void call_do_something(T arg) {
    arg.do_something();
}

int main {
    A a = new A()
    call_do_something(a);
    B b = new B()
    call_do_something(b);
    retrun 0;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,编译时,这将生成两个版本的 call_do_something,一个用于 A,一个用于 B。但是 java 中的等效代码只会生成一个。这将减少使用容器时生成的代码。这是我想知道的示例用例,如何有效处理。我绝不是想说 Java 在所有情况下都比 C++ 具有更好的泛型。对困惑感到抱歉。

c++ generics templates type-erasure

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

当我们只知道操作码的十六进制时如何对指令进行编码

来源中,他们给出了 cmp r/m16/32 imm8 的十六进制为 0x837。我在哪里得到的,ebp 的十六进制是 0b0101。有了这些信息,我如何对指令进行编码cmp dword [ebp-4] 2?我已经搜索了几个小时,除了这个(第 61 页)cmpb $0xf,(%rdi)编码为 80 3f 0f 的类似指令之外,没有任何线索。但我无法理解这一点,因为我提到的前一个来源说 0x803 是针对 sbb 的。另外,rdi 是 0b0111 而不是 0b1111(实际上是 r15)。我很困惑...如果可能的话,我想要 x86-32 和 x86-64 的编码指令。

x86 assembly x86-64 instruction-encoding

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

编程语言可以有自己的调用约定吗?

Windows 和 Unix 有自己的x86-64 调用约定。但是,如果一种语言需要/从中受益,它可以有自己的调用约定供内部使用吗?例如,Swift / Python(已编译)可能会受益于拥有多个寄存器来从函数返回多个结果(因为这些语言支持这一点)。因此,保留 3 个寄存器 ( raxrcxrdx),用于其语言调用约定中的返回值,这会破坏任何内容吗?导致任何未被注意到的错误,或者在任何情况下导致未定义的行为?

另外,如果不需要遵循该约定,那么为什么他们要为用户空间定义调用约定?

assembly x86-64 calling-convention

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

如何按字典顺序按相反顺序比较两个向量?

如果我想按字典顺序比较两个向量,我可以这样做:

int main() {
    std::vector<int> a{0, 7, 8, 9};
    std::vector<int> b{1, 2, 3, 4};

    std::cout << std::boolalpha;
    std::cout << "a < b returns " << (a < b) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

但是以相反的顺序执行相同的操作无法编译:

int main() {
    std::vector<int> a{3, 2, 1};
    std::vector<int> b{9, 8, 7, 6};

    std::cout << std::boolalpha;
    std::cout << "revrese a < reverse b returns " << ((a | std::views::reverse) < (b | std::views::reverse)) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

后一个代码失败并显示:

<source>:23:81: error: no match for 'operator<' (operand types are 'std::ranges::reverse_view<std::ranges::ref_view<std::vector<int> > >' …
Run Code Online (Sandbox Code Playgroud)

c++ vector comparison-operators lexicographic-ordering std-ranges

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

是否有可能知道 git 将以编程方式使用哪个编辑器?

是否有可能以编程方式知道 git 将使用哪个编辑器?这样的事情可能吗?

$git which editor
/usr/bin/nano
Run Code Online (Sandbox Code Playgroud)

基本上,我只想为 git 提交消息调用自定义编辑器。因此,如果文件名是“.git/COMMIT_EDITMSG”,我将调用其他内容,否则我想回退到默认的 git 编辑器。

我知道 git 使用$GIT_EDITOR, core.editor, $VISUAL,$EDITOR来选择编辑器。但这一切都不存在,我不知道该怎么办。这里说,它使用vi. 但在我的机器上,它使用nano. 因此,对其进行硬编码并不真正可靠。

那么,如何知道 git 将以编程方式使用哪个编辑器呢?如果不是直接从 git 获取,还有其他解决方法吗?

git editor

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

编译器如何在 ARM 汇编中强制执行 C++ 易失性

根据 cppreference,一个volatile限定变量的存储不能重新排序为另一个volatile限定变量。换句话说,在下面的示例中,当 y 变为 20 时,可以保证 x 为 10。

volatile int x, y;
...
x = 10;
y = 20;
Run Code Online (Sandbox Code Playgroud)

根据维基百科,ARM 处理器的一个存储可以在另一个存储之后重新排序。因此,在下面的示例中,第二个存储可以在第一个存储之前执行,因为两个目的地是不相交的,因此它们可以自由地重新排序。

str     r1, [r3]
str     r2, [r3, #4]
Run Code Online (Sandbox Code Playgroud)

有了这样的理解,我写了一个玩具程序:

volatile int x, y;

int main() {
    x = 10;
    y = 20;
}
Run Code Online (Sandbox Code Playgroud)

我预计生成的程序集中会出现一些围栏,以保证 x 和 y 的存储顺序。但为 ARM生成的程序集是:

main:
        movw    r3, #:lower16:.LANCHOR0
        movt    r3, #:upper16:.LANCHOR0
        movs    r1, #10
        movs    r2, #20
        movs    r0, #0
        str     r1, [r3]
        str     r2, [r3, #4] …
Run Code Online (Sandbox Code Playgroud)

c++ assembly arm volatile memory-barriers

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

分配了多少内存给调用堆栈?

以前我见过很多C++函数的汇编。在 gcc 中,所有指令都以以下指令开头:

push    rbp
mov     rbp, rsp
sub     rsp, <X>  ; <X> is size of frame
Run Code Online (Sandbox Code Playgroud)

我知道这些指令存储前一个函数的帧指针,然后为当前函数设置一个帧。但在这里,程序集既不要求映射内存(如 malloc),也不检查所指向的内存是否rbp分配给进程。

因此它假设启动代码已经为调用堆栈的整个深度映射了足够的内存。那么到底为调用堆栈分配了多少内存呢?启动代码如何知道调用栈的最大深度?

这也意味着,我可以远距离访问越界数组,因为虽然它不在当前帧中,但它映射到进程。所以我写了这段代码:

int main() {
    int arr[3] = {};
    printf("%d", arr[900]);
}
Run Code Online (Sandbox Code Playgroud)

当索引为 900 时,它会退出。SIGSEGV但令人惊讶的是,当索引为 901 时,它不会退出。同样,SIGSEGV对于某些随机索引,它会退出,而对于某些索引则不会。在编译器资源管理器中使用 gcc-x86-64-11.2 进行编译时观察到此行为。

c++ callstack memory-management segmentation-fault

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