在ac程序中我正在尝试以下操作(只是检查行为)
x = 5 % (-3);
y = (-5) % (3);
z = (-5) % (-3);
printf("%d ,%d ,%d", x, y, z);
Run Code Online (Sandbox Code Playgroud)
给我输出为(2, -2 , -2)
gcc.我每次都期待一个积极的结果.模数可以为负数吗?任何人都可以解释这种行为吗?
我有一个与C++中的多继承相关的基本问题.如果我有如下所示的代码:
struct base1 {
void start() { cout << "Inside base1"; }
};
struct base2 {
void start() { cout << "Inside base2"; }
};
struct derived : base1, base2 { };
int main() {
derived a;
a.start();
}
Run Code Online (Sandbox Code Playgroud)
这给出了以下编译错误:
1>c:\mytest.cpp(41): error C2385: ambiguous access of 'start'
1> could be the 'start' in base 'base1'
1> or could be the 'start' in base 'base2'
Run Code Online (Sandbox Code Playgroud)
有没有办法能够start()
使用派生类对象从特定基类调用函数?
我现在不知道用例但是..仍然!
在函数前使用虚拟词virtual的目的是什么?如果我想让子类覆盖父函数,我只需声明相同的函数,如void draw(){}
.
class Parent {
public:
void say() {
std::cout << "1";
}
};
class Child : public Parent {
public:
void say()
{
std::cout << "2";
}
};
int main()
{
Child* a = new Child();
a->say();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出为2.
那么,为什么保留字virtual
在标题中是必要的say()
呢?
谢谢一堆.
我很困惑在拥有嵌套的命名空间和对象声明时该怎么做.
我正在移植一些链接到具有一些名称空间的静态库的代码.
我在说什么的例子:
namespace ABC {
namespace XYZ {
//STUFF
}
}
Run Code Online (Sandbox Code Playgroud)
在代码中我该怎么做来声明命名空间中的对象XYZ
?
如果我尝试:
XYZ::ClassA myobject;
Run Code Online (Sandbox Code Playgroud)
要么:
ABC::XYZ::ClassA myobject;
Run Code Online (Sandbox Code Playgroud)
要么:
ABC::ClassA myobject;
Run Code Online (Sandbox Code Playgroud)
我明白了
没有命名类型
错误,即使ClassA
确实存在.
什么是合适的?
我已经阅读了Merge两个STL贴图问题,虽然它很接近,但我一直在寻找像这里描述的那样的功能.
简而言之,我想将两个std::map
实例(具有相同的键和值类型)合并为一个,但需要注意的是,如果对象存在于两个映射中,我想将这些值添加到一起.
是否存在可以执行此操作的现有boost,range-v3或std函数?如果没有,那么实现它的最佳方法是什么?
示例代码:
double mergePredicate(double lhs, double rhs)
{
return lhs + rhs;
}
int main()
{
std::map<int, double> mapA = { {0, 1.0}, {1, 2.0} };
std::map<int, double> mapB = { {1, 1.5}, {2, 2.5} };
// Merge maps in some way...
merge(mapA, mapB, mergePredicate);
// result: mapA == { {0, 1.0}, {1, 3.5}, {2, 2.5} }
for (const auto& p : mapA) { …
Run Code Online (Sandbox Code Playgroud) 我已经广泛搜索了如何做到这一点并且未能得出答案.
我的内存布局如下:
Fake Address | Section
0 | text
7 | relocate
15 | bss
23 | stack
Run Code Online (Sandbox Code Playgroud)
在堆栈的末尾我放置堆.它正在成长,堆栈是我正在使用的ARM芯片的完全下降堆栈.
现在,我想要做的是将一个部分(让我们称之为.persist
)放入我的ram内存中.我希望它驻留在RAM的最后,我想将其编程到我的链接器脚本中.但是,此.persist
部分的大小不是由我定义的,而是由编译器根据它包含的符号计算的.
到目前为止,我还没有想出一个好办法.因为我知道RAM起始地址和SIZE,如果我知道部分大小,那么计算部分需要去的位置是微不足道的.但是,根据GNU链接器文档(第74页),似乎:
SIZEOF(section)如果已分配该节,则返回指定节的大小(以字节为单位).如果在评估此部分时尚未分配该部分,则链接器将报告错误.
所以我无法计算链接器脚本中部分的大小(因为我想在放置它/分配之前计算大小).
有谁知道这样做的好方法?
我想在Linux中使用GCC 编译我的Visual Studio解决方案,有三个项目.该解决方案包含两个DLL项目和一个使用这些DLL的应用程序(.EXE)项目.源代码不包含任何Windows依赖项.
如何将解决方案(包含3个项目)转换为可以使用GCC在Linux中编译的文件.
是否有任何工具可以将Visual Studio Solution(Project)转换为make/s.
Visual Studio版本是Visual Studio 2008
我按照本教程将SVN存储库转换为Git .现在似乎无法提取此答案中建议的子存储库.
原谅长篇文章,但大部分文本都是格式良好的git输出.
操作系统:Windows 8命令行:MinGW Git版本:1.8.1.msysgit.1
除非您有一个干净的暂存区域且没有修改过的文件,否则提取子存储库的过程似乎不起作用.
git status
告诉我,我有一个修改过的文件,即使这是一个新的SVN导入.好吧,让我们试着摆脱它.
尝试并还原文件.
user$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: folder with space/folder/toolbar.png
#
no changes added to commit (use "git add" and/or "git commit -a")
user$ git checkout -- "folder with space/folder/toolbar.png"
user$ git status …
Run Code Online (Sandbox Code Playgroud) 我遇到过这个CRC32代码,很好奇为什么作者会选择使用它
crc = crc ^ ~0U;
Run Code Online (Sandbox Code Playgroud)
代替
crc = ~crc;
Run Code Online (Sandbox Code Playgroud)
据我所知,它们是等价的.
我甚至在Visual Studio 2010中反汇编了这两个版本.
未优化的构建:
crc = crc ^ ~0U;
009D13F4 mov eax,dword ptr [crc]
009D13F7 xor eax,0FFFFFFFFh
009D13FA mov dword ptr [crc],eax
crc = ~crc;
011C13F4 mov eax,dword ptr [crc]
011C13F7 not eax
011C13F9 mov dword ptr [crc],eax
Run Code Online (Sandbox Code Playgroud)
我也无法通过考虑每条指令所需的周期数来证明代码的合理性,因为两条指令都需要完成1个周期.实际上,xor可能因为必须从某处加载文字而受到惩罚,尽管我不确定这一点.
所以我认为它可能只是描述算法的首选方式,而不是优化......这是正确的吗?
编辑1:
因为我刚刚意识到crc
变量的类型可能很重要,我在这里包括整个代码(少了查找表,太大了)所以你不必关注链接.
uint32_t crc32(uint32_t crc, const void *buf, size_t size)
{
const uint8_t *p;
p = buf;
crc = crc ^ ~0U;
while …
Run Code Online (Sandbox Code Playgroud) 将我的Mac升级到Yosemite后,我在下载XCode 6.1时遇到了麻烦
我每次尝试时都会收到错误消息:
This item is temporarily unavailable. Try again later.
Run Code Online (Sandbox Code Playgroud)
我以后再试过几天,没有运气.
我发现这个Apple论坛帖子真有帮助,但我不想下载第三方工具.
我通过搜索XCode解决了这个问题:
sudo find / -name *XCode*
Run Code Online (Sandbox Code Playgroud)
返回的是:
/private/var/folders/zn/ltz89cf17wj09s3bz6rnrwyc0000gn/C/com.apple.DeveloperTools/5.0.2-5A3005/Xcode/CachedSpecifications-xcodebuild
/private/var/folders/zn/ltz89cf17wj09s3bz6rnrwyc0000gn/C/com.apple.DeveloperTools/5.1-5B130a/Xcode/CachedSpecifications-xcodebuild
/private/var/folders/zn/ltz89cf17wj09s3bz6rnrwyc0000gn/C/com.apple.DeveloperTools/5.1.1-5B1008/Xcode/CachedSpecifications-xcodebuild
/private/var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/C/com.apple.DeveloperTools/5.0.2-5A3005/Xcode/CachedSpecifications-xcodebuild
/private/var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/C/com.apple.DeveloperTools/5.1-5B130a/Xcode/CachedSpecifications-xcodebuild
/private/var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/C/com.apple.DeveloperTools/5.1.1-5B1008/Xcode/CachedSpecifications-xcodebuild
Run Code Online (Sandbox Code Playgroud)
通过重命名上面的所有com.apple.DeveloperTools
文件夹/文件,aaacom.apple.DeveloperTools
我设法让我的App Store下载新的XCode.
我想问的是,Yosemite改变了Mac缓存的工作方式吗?
我问这个是因为我注意到有些人没有通过删除通常推荐的文件夹来解决问题com.apple.appstore
.我不能说这是否会起作用/因为这是我尝试的第一件事,所以我问的是Mac缓存是否已经改变,如果是这样的话?
编辑1:
我现在才注意到Elliott Slaughter 在同一个帖子中发布了一个非常有用的命令,这个命令比我的命令更常见的缓存删除:
rm -rf "$(getconf DARWIN_USER_CACHE_DIR)/com.apple.appstore"
Run Code Online (Sandbox Code Playgroud)
在我的机器上:
...$ echo $(getconf DARWIN_USER_CACHE_DIR)
/var/folders/zn/ltz89cf17wj09s3bz6rnrwyc0000gn/C/
Run Code Online (Sandbox Code Playgroud)
编辑2:
所以我的假设是删除com.apple.appstore
不起作用,因为XCode似乎在com.apple.DeveloperTools
文件夹中被引用.我对吗?