与许多SO用户相比,我对C++相对较新.
我想知道我们是否制作了一个用户指定大小的数组.
例如:
int a;
cout<<"Enter desired size of the array";
cin>>a;
int array[a];
Run Code Online (Sandbox Code Playgroud)
但是上面的程序不会工作,因为数组大小必须是常量,但在我的情况下,它是一个变量.
那么是否可以将变量变为常量并将其指定为数组的大小?
寻找一个简单易懂的答案,感谢您的时间和精力:)
加入std::thread或std::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 也不报告问题,但我想得到标准的一些确认。
我有一个这样的方法的模拟:
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 团队是否有任何特殊原因决定不实现此类功能?
我正在尝试在Android Studio中的Android项目的单元测试中使用MockContext。问题是,包android.test.*在项目中不可见。
我不确定应该将什么添加到Gradle以便导入它。我试着com.android.support.test:rules:1.0.2和androidx.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才能访问 …
不知道为什么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)
我希望程序会询问我的输入,如果输入的类型错误,程序会重复执行
此问题的后续问题
我们有以下代码:
#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
我有以下代码片段
#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++编写了测试代码:
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) 我有这个二进制表示:
0b0110010
对于 gcc,有一个内置函数__builtin_ffs将返回 1 加最低有效 1 位的索引,在我的示例中返回 2。
我正在寻找一种有效的方法来返回 2 个连续 1 位的索引,在我的示例中为 5。语言是 C,我有 64 位数字 * 1024 需要检查。如果解决方案也能涵盖 N 个连续位的情况,那就太好了。
简单的解决方案是通过右移操作迭代位并使用掩码,但效率不高。
标题说明了一切。如何更改常数的值?这是否与更改常量数组的索引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++ ×7
android ×1
arrays ×1
c ×1
c++20 ×1
constants ×1
googlemock ×1
hardware ×1
malloc ×1
optimization ×1
performance ×1
pointers ×1
static ×1
unit-testing ×1
visual-c++ ×1