小编Yks*_*nen的帖子

C++:创建一个用户输入大小的数组

与许多SO用户相比,我对C++相对较新.

我想知道我们是否制作了一个用户指定大小的数组.

例如:

int a;
cout<<"Enter desired size of the array";
cin>>a;
int array[a];
Run Code Online (Sandbox Code Playgroud)

但是上面的程序不会工作,因为数组大小必须是常量,但在我的情况下,它是一个变量.

那么是否可以将变量变为常量并将其指定为数组的大小?

寻找一个简单易懂的答案,感谢您的时间和精力:)

c++ arrays

3
推荐指数
2
解决办法
9904
查看次数

std::thread/jthread 可以退出而不执行传递的函数吗?

加入std::threadstd::jthread太快(在操作系统中实际启动线程之前)是否有可能导致线程根本不执行?或者是否保证它会简单地阻塞父线程,直到子线程启动、执行和完成?

std::stop_source我认为它应该执行是很明显的,但我的同事说如果在调用回调之前已经在 jthread 上触发了它就不必发生,因此我很困惑。

例子:

#include <thread>
#include <iostream>

void foo()
{
    std::cout << "foo()" << std::endl;
}

int main()
{
    std::jthread{foo};
    std::thread{foo}.join();
}
Run Code Online (Sandbox Code Playgroud)

这输出:

foo()
foo()
Run Code Online (Sandbox Code Playgroud)

ThreadSanitizer 也不报告问题,但我想得到标准的一些确认。

c++ multithreading language-lawyer c++20

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

使用变量 SetArgPointee

我有一个这样的方法的模拟:

MOCK_METHOD2(setValue, int(int notImportant, unsigned int value));
MOCK_METHOD2(getValue, int(int notImportant, unsigned int *value));
Run Code Online (Sandbox Code Playgroud)

在整个测试过程中可以多次调用方法,因此存储所设置的值(并在请求时传递最新的值)非常重要。

然后我尝试嘲笑这种行为:

unsigned int myStoredValue;
ON_CALL(ddalCpriLink, setValue(_, _))
    .WillByDefault(DoAll(SaveArg<1>(&myStoredValue),
        Return(RETURN_OK)));
ON_CALL(ddalCpriLink, GetValue(_, _))
    .WillByDefault(DoAll(SetArgPointee<1>(myStoredValue),
        Return(RETURN_OK)));
Run Code Online (Sandbox Code Playgroud)

这就是问题所在。SetArgPointee<> 不会传递 myStoredValue 中存储的值,它只是将给定变量设置为 0。理论上,可以使用直接值,但这使得测试不合理(如果没有正确调用 set 怎么办?)。另一种选择是仅传递一个使用 Invoke() 执行此操作的函数,但如果可能的话,我宁愿坚持使用 gmock 解决方案。

我的问题是:是否可以将变量的值传递给 SetArgPointee<>?如果没有,googletest 团队是否有任何特殊原因决定不实现此类功能?

googlemock

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

如何在Android Studio中使用android.test.mock

我正在尝试在Android Studio中的Android项目的单元测试中使用MockContext。问题是,包android.test.*在项目中不可见。

我不确定应该将什么添加到Gradle以便导入它。我试着com.android.support.test:rules:1.0.2androidx.test:rules:1.1.1(由IDE提出的建议之一),但是这不是我要找的人。

build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.myApp"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.google.firebase:firebase-core:16.0.8'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    testImplementation 'com.android.support.test:rules:1.0.2'
}

apply plugin: 'com.google.gms.google-services'
Run Code Online (Sandbox Code Playgroud)

编译时出现错误信息:

错误:程序包android.test.mock不存在

我应该添加什么到gradle才能访问 …

android unit-testing

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

在while语句(第40行)中出错,其中“未在此范围内声明输入” C ++

不知道为什么while循环不起作用,尽管我认为我指定了代码中先前输入的内容。

#include <iostream>

using namespace std;

int main()
{
    do
    {
        cout<<"1. \tOpen File"<<endl;
        cout<<"2. \tClose File"<<endl;
        cout<<"3. \tExit"<<endl;

        int input;
        cin >> input;

        cout<<"Select and option:   "<<endl;

        switch(input)
        {
        case 1:
            cout<<"Opening File"<<endl;
            break;
        case 2:
            cout<<"Closing File"<<endl;
            break;
        case 3:
            cout<<"Exiting..."<<endl;
            break;
        default:
            cout<<"Invalid Entry"<<endl;
        }
    }
    while (input < 1 || input > 3);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望程序会询问我的输入,如果输入的类型错误,程序会重复执行

c++ visual-c++

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

通过统一指针UB访问静态类成员吗?

问题的后续问题

我们有以下代码:

#include <iostream>

struct A 
{
    static int n;
};

int A::n = 5;

int main() 
{
    A* a; //uninitialized on purpose
    std::cout << a->n; //UB?
}
Run Code Online (Sandbox Code Playgroud)

这样的访问是否为未定义行为?一方面,不需要对象来访问静态类成员,另一方面,operator->在未初始化的指针正在请求麻烦的情况下。

注意:GCC和MSVC会在没有任何警告的情况下编译此代码,Clang抱怨未初始化的用法。https://godbolt.org/z/Gy5fR2

c++ static undefined-behavior language-lawyer

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

为什么复制构造函数被调用两次?

我有以下代码片段

#include <iostream>
#include <vector> 

class Move {
    private:
        int* data;
         
    public: 
        void set_data_value(int d) {
            *data = d; 
        }
        int get_data_value(){
            return *data; 
        }

        Move(int d);
        Move(const Move &source);
        ~Move();
};

Move::Move(int d) {
    std::cout << "ctor being called" << std::endl; 
    data = new int; 
    *data = d; 
}

Move::Move(const Move& source) {
    std::cout << "copy ctor being called" << std::endl;
    data = new int; 
    *data = *source.data;
}

Move::~Move() {
    std::cout << "deleting Move" << std::endl; 
    delete data; …
Run Code Online (Sandbox Code Playgroud)

c++ copy-constructor

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

C++ 大内存分配

我用C++编写了测试代码:

void handler()
{
    std::cout << "allocation failed" << std::endl;
    std::set_new_handler(nullptr);
}

int main()
{
    size_t allocations_count = 0u;
    std::set_new_handler(handler);

    try {
    
        while (true) {
        new char[1024u * 1024u * 1024u];
           ++allocations_count;
        }
    } catch (const std::bad_alloc& e) {
        std::cout << e.what() << '\n';
    }

    std::cout << "allocated " << allocations_count << " GB" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在我的 8GB RAM 机器上,我得到了输出:

BigAllocations(5125,0x1050e7d40) malloc: can't allocate region
:*** mach_vm_map(size=1073741824, flags: 100) failed (error code=3)
BigAllocations(5125,0x1050e7d40) malloc: *** set a breakpoint in …
Run Code Online (Sandbox Code Playgroud)

c++ hardware malloc operating-system

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

获取前2个连续1位索引的有效方法

我有这个二进制表示: 0b0110010

对于 gcc,有一个内置函数__builtin_ffs将返回 1 加最低有效 1 位的索引,在我的示例中返回 2。

我正在寻找一种有效的方法来返回 2 个连续 1 位的索引,在我的示例中为 5。语言是 C,我有 64 位数字 * 1024 需要检查。如果解决方案也能涵盖 N 个连续位的情况,那就太好了。

简单的解决方案是通过右移操作迭代位并使用掩码,但效率不高。

c optimization performance bit-manipulation

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

为什么我可以通过指针更改常量(const char *)的值?

标题说明了一切。如何更改常数的值?这是否与更改常量数组的索引X处的元素的值相同?

    #include<iostream>
    int main(){
        const char* y = "original";
        auto *p = &y;
        *p = "modified";
        std::cout<<y<<"\n";
        //outputs modified
        system("pause");
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

c++ pointers constants

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