我的流程布局如下:
我需要将窗体上的所有控件居中(换句话说,假设窗体的宽度为200. btnOpt1到btnOpt4应该Left
从100减去按钮宽度的一半,而不是0.)
我在尝试使用stringstream对象时注意到了一些事情.这是一个无用的例子来解释这个:
stringstream ss ;
ss << "my string" ;
cout << ss.str() << endl ;
Run Code Online (Sandbox Code Playgroud)
不等于
cout << (stringstream() << "my string").str() << endl ;
Run Code Online (Sandbox Code Playgroud)
这会导致编译错误,抱怨'class std :: basic_ostream'没有名为'str'的成员.
我不能轻易解释这一点.这对我的应用程序并不重要,但我很确定这隐藏了一个有趣的c ++技巧.
注意:我正在使用gcc和c ++ 14
我有
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
在我的清单文件中,但是在尝试创建目录时失败了
Log.d(LOG_STRING, android.os.Environment.getExternalStorageState() );
java.io.File folder = new java.io.File(Environment.getExternalStorageDirectory() + java.io.File.separator + "test");
boolean success = true;
if (!folder.exists()) {
success = folder.mkdir();
}
if (success) {
Log.d(LOG_STRING, "Created directory");
} else {
Log.d(LOG_STRING, "FAILED WHILE CREATING DIRECTORY");
}
Run Code Online (Sandbox Code Playgroud)
外部存储的状态是"已挂载",但test
无法创建目录并且输出为"FAILED WHILE CREATING DIRECTORY"
.
在手机中浏览"应用信息",标记为我的应用程序激活"修改或删除USB存储器内容"的权限.
可能是什么原因造成的?手机的一些特殊设置?这是搭载Android 4.3(API18)的三星GT-I9506.需要注意的是,getExternalStorageDirectory
它不在SD卡上,而是在内部存储器(/storage/emulated/0/
)上.
在与同事谈话时,似乎这个设备在被植根之后经历了几次调整(允许特定应用程序直接在SD卡上写入).可能不值得进一步调查,我只需切换到另一台设备.我会保留设备一段时间,如果有人会出现答案,我会快速测试它是否解决了问题.
问题仍然没有解决,但如前所述,这很可能是这个设备非常具体的.不可能在任何路径上写入,无论是外部存储还是内部存储,甚至不能在返回的路径中写入getExternalCacheDir()
.
是否可以创建一个模板化函数来检查原始数据类型是否适合可能不同的原始数据类型的值?我们暂时将范围限制为整数类型.
更确切地说:是否有可能创建一个"一个适合所有"的模板化函数,而不会得到编译器警告(布尔表达式总是真/假,有符号/无符号比较,未使用的变量)并且不禁用编译器警告检查?这些函数还应该在运行时尽可能地限制检查(在编译时应排除所有琐碎的情况).如果可能的话,我宁愿避免使用C++ 11之类的扩展(除非存在"旧"C++的"快速"替代).
注意:"value"在编译时是未知的,只是其类型.
预期行为的示例:
int main(int argc, char** argv) {
for (int i = 1; i < argc; i++) {
const int value = atoi(argv[i]);
std::cout << value << ": ";
std::cout << CanTypeFitValue<int8_t>(value) << " ";
std::cout << CanTypeFitValue<uint8_t>(value) << " ";
std::cout << CanTypeFitValue<int16_t>(value) << " ";
std::cout << CanTypeFitValue<uint16_t>(value) << " ";
std::cout << CanTypeFitValue<int32_t>(value) << " ";
std::cout << CanTypeFitValue<uint32_t>(value) << " ";
std::cout << CanTypeFitValue<int64_t>(value) << " ";
std::cout << CanTypeFitValue<uint64_t>(value) << std::endl;
} …
Run Code Online (Sandbox Code Playgroud) 我收到一条 protobuf 消息 -
message Sample{
string field1 = 1;
string field2 = 2;
string field3 = 3;
}
Run Code Online (Sandbox Code Playgroud)
这些消息以二进制格式存储在数据存储中。因此,如果我想删除上述消息中的任何定义字段,是否会导致从数据存储区反序列化消息时出现任何问题?
serialization protocol-buffers binary-serialization deserialization protobuf-java
我们来看下面的代码:
class Foo
{
string bar;
public void Method()
{
if (!String.IsNullOrEmpty(this.bar))
{
string bar = "Hello";
Console.Write(bar);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将编译,一切都很好.但是,我们现在删除this.
前缀:
class Foo
{
string bar;
public void Method()
{
if (!String.IsNullOrEmpty(bar)) // <-- Removed "this."
{
string bar = "Hello";
Console.Write(bar);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到编译器错误.我同意这是一个错误,但是错误的位置让我感到困惑.错误发生在该行:
string bar = "Hello";
Run Code Online (Sandbox Code Playgroud)
随着消息:
名为'bar'的局部变量不能在此范围内声明,因为它会给'bar'赋予不同的含义,'bar'已在'父或当前'范围内用于表示其他内容
据我了解了关于编译器,声明bar
被悬挂在顶部Method()
的方法.但是,如果是这样的话,行:
if (!String.IsNullOrEmpty(bar))
Run Code Online (Sandbox Code Playgroud)
应该被认为是不明确的,因为它bar
可能是对实例字段或尚未声明的局部变量的引用.
对我来说,删除this.
可能会导致另一行的编译错误似乎很奇怪.换句话说,声明局部bar
变量是完全有效的,只要先前没有在范围内做出任何可能模糊的引用bar
(注意,如果我注释掉,if (!String.IsNullOrEmpty(bar)) …
假设我有一个由几个子项目A,B,C,D组成的项目 ...... 所有子项目都依赖于A,它经常变化.此外,可能有一些进一步的依赖关系:在这个例子中,d依赖于B.
现在:很多人正在研究这些项目.主CMakeLists.txt文件应包含所有目录,以便构建all构建所有目录.但人们也希望能够只在其中一个项目上工作,而不必每次都构建/安装所有项目.
如果我正在研究D,我可以通过调用轻松构建"仅"D
cmake --build . --target D -- -j7
Run Code Online (Sandbox Code Playgroud)
要么
ninja -j7 D
Run Code Online (Sandbox Code Playgroud)
如果他们的某些东西发生了变化,这也将构建A和B. 完善.
但是如何在不触发构建全部的情况下仅为D调用安装?如果我打电话,我想这样:
ninja -j7 D install
Run Code Online (Sandbox Code Playgroud)
它只构建D(和依赖项),然后只安装D 及其依赖项(A和B). 相反,它构建目标all并安装所有.
我想保持目标所有人都在继续建设.所以EXCLUDE_FROM_ALL不是一个选项.但是朝那个方向走,我找不到任何解决办法.
所以我在考虑以下策略:
它会起作用吗?有没有更好的解决方案?
我们希望避免每个人都必须编辑主CMakeLists.txt文件以排除他不感兴趣的项目.解决方案应该可以移植到不同的操作系统.
编辑:
我尝试了我提出的策略,但它不起作用:在我的情况下,为目标设置一个install语句(即使指定为OPTIONAL)也会使EXCLUDE_FROM_ALL无效.在文档中更好地阅读我发现:
Installing a target with EXCLUDE_FROM_ALL set to true has undefined behavior.
Run Code Online (Sandbox Code Playgroud)
我也收到这个警告:
Target <targetname> has EXCLUDE_FROM_ALL set and will not be built by default but an install rule has been provided for it. CMake does not define behavior for this …
Run Code Online (Sandbox Code Playgroud) 我从一个创建一个组合框List
的KeyValuePair<int, string>
.到目前为止,它一直在为用户提供描述性名称,同时返回一个数字ID.
但是,无论我尝试什么,我都无法选择最初选择的值.
public StartUpForm()
{
InitializeComponent();
FlowLayoutPanel flowLayout = new FlowLayoutPanel(); //This is necessary to protect the table, which is for some reason collapsing...
flowLayout.FlowDirection = FlowDirection.TopDown;
flowLayout.AutoSize = true;
flowLayout.AutoSizeMode = AutoSizeMode.GrowAndShrink;
var comboBox = new ComboBox();
{
var choices = new List<KeyValuePair<int, string>> ();
choices.Add(new KeyValuePair<int, string>(1, "hello"));
choices.Add(new KeyValuePair<int, string>(2, "world"));
comboBox.DataSource = choices;
comboBox.ValueMember = "Key";
comboBox.DisplayMember = "Value";
flowLayout.Controls.Add(comboBox);
}
Controls.Add(flowLayout);
//None of these work:
comboBox.SelectedValue = 2;
comboBox.SelectedValue = …
Run Code Online (Sandbox Code Playgroud) 为什么即使type_t
处理了所有可能的值,此代码也会触发"控制到达非void函数的结尾" ?处理此警告的最佳方法是什么?return -1
在切换后添加一个?
(此处测试代码)
typedef enum {
A,
B
} type_t;
int useType(type_t x) {
switch (x) {
case A:
return 0;
case B:
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法连接2个字符串文字以形成包含路径?
代码存根:
#define INCLUDE_DIR "/include"
#include INCLUDE_DIR "/dummy.h"
Run Code Online (Sandbox Code Playgroud)
看看这个问题,答案指向不同的方向(编译器命令行).它提到这里,这似乎是不可能的,但我不知道是否该主题已经挖够了.
(我确实有一个与此相关的用例,请仅关注此问题的答案/评论.)