这是一个奇怪的头衔.如果有人能澄清我究竟是在问什么,我会非常感激,因为我不太确定自己.
我正在观看关于编程范式的斯坦福视频(那位老师很棒),当他开始这样做的时候,我正在观看视频:
void *lSearch( void* key, void* base, int elemSize, int n, int (*cmpFn)(void*, void*))
Run Code Online (Sandbox Code Playgroud)
当然,我心想,"我,我不知道你可以宣布一个功能并在以后定义它!".所以我创建了自己的C++测试版.
int foo(int (*bar)(void*, void*));
int bar(void* a, void* b);
int main(int argc, char** argv)
{
int *func = 0;
foo(bar);
cin.get();
return 0;
}
int foo(int (*bar)(void*, void*))
{
int c(10), d(15);
int *a = &c;
int *b = &d;
bar(a, b);
return 0;
}
int bar(void* a, void* b)
{
cout << "Why hello there." << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
关于代码的问题是这样的:如果我将函数声明int *bar …
这是目前我和我的队友坚持的家庭作业项目.我们没有多少介绍大会,这应该是我们的第一个家庭作业.任务是创建一个将0xAABBCCDD转换为0xDDCCBBAA的程序.
我不是在寻找答案,因为这会破坏目的,但我们对这个愚蠢的事情的困难感到非常沮丧.我们认为我们在创建可行的解决方案方面有一个良好的开端,但我们无法提出其余的计划.
首先,我们将每个tupel(aa),(bb),(cc),(dd)掩盖到一个不同的寄存器中:
LDR R0, LittleEndian // 0xAABBCCDD
AND R1, R0, #0xFF000000 // 0xAA
AND R2, R0, #0x00FF0000 // 0xBB
AND R3, R0, #0x0000FF00 // 0xCC
AND R4, R0, #0x000000FF // 0xDD
Run Code Online (Sandbox Code Playgroud)
然后我们尝试将它们重新对齐到R0寄存器中,但是如果我们能够提出一个好的解决方案呢......
我们的最大努力来自:
ORR R0, R1, LSL #24
ORR R0, R2, LSL #8
ORR R0, R3, LSR #8
ORR R0, R4, LSR #24
Run Code Online (Sandbox Code Playgroud)
因某些奇怪的原因产生0xBBBBCCDD; 我们真的不知道.
任何提示将不胜感激.我们再次寻求帮助,但不是寻求解决方案.
干杯!
对不起,如果之前已经问过这个问题.在我搜索SO时,我找不到一个问我想知道什么.
基本上,当我有这个:
typedef struct node
{
int data;
node *node;
} *head;
Run Code Online (Sandbox Code Playgroud)
并做 node *newItem = new node;
我的印象是我正在宣布和保留空间,但没有定义,指向struct node,是正确的吗?
所以,当我这样做
newItem->data = 100 和 newItem->next = 0
我有点迷惑不解了.newItem = 0会说出究竟是什么?两个data和next?整个对象?
当我使用typedef时,我特别困惑.哪个部分是宏?我假设节点,因为我就是这样称呼它,但为什么我需要它呢?
最后,当我这样做时会发生什么:
node *temp;
temp = new node;
temp = head->next;
head->next = newItem;
newItem->next = temp;
Run Code Online (Sandbox Code Playgroud)
我的意思是,head-> next是一个指向对象newItem的指针,所以我假设不是newItem.data或者是next.那么我怎么能像上面这样安全地使用我上面描述的未初始化指针呢?现在是不是指向一个未初始化的指针?
所以我完成了List练习并继续使用Binary Trees.我的代码到目前为止:
tree.h中
#include "Node.h"
class Tree
{
private:
int mCount;
Node *root;
public:
Tree();
~Tree();
void insert(int, Node *);
};
Run Code Online (Sandbox Code Playgroud)
Tree.cpp
void Tree::insert(int data, Node *node)
{
if( root == 0 )
{
Node *temp = new Node;
temp->setData(100);
temp->setRight(0);
temp->setLeft(0);
root = temp;
}
else
{
if( data > root->getData() )
return insert( data, root->getRight() );
else
return insert( data, root->getLeft() );
}
}
Run Code Online (Sandbox Code Playgroud)
main.cpp中
int main(int argc, char** argv)
{
Tree *tree = new Tree;
tree->insert( 100, …Run Code Online (Sandbox Code Playgroud) 这不是一个问题,"如何将其传递给函数?" 但是,"这可以接受吗?"
void func( int **ptr );
int main( int argc, char* argv[] )
{
int arr[][3] = {{1, 2,}, {3, 4}, {5, 6}};
int *pArr = *arr;
(&pArr[0])[1] = 3;
func(&pArr);
cin.get();
return 0;
}
void func( int **ptr )
{
cout << "In func()" << endl;
ptr[0][1] = 5;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这是有效的.它对我来说并不是很安全,但我更喜欢将2D数组传递给函数.而是一个为我工作的指针.
对于那些必须阅读我的代码的人来说,这会非常混乱吗?我应该使用其他方法吗?使用指向数组的指针是一个坏主意吗?
另外,质疑一点偏离主题.我为什么要写:
int arr[] = { 1, 2, 3, 4, 5 };
int *pArr = *arr;
Run Code Online (Sandbox Code Playgroud)
但为什么我不能写
int arr[][3] = {{1, 2,}, {3, 4}, {5, 6}};
int …Run Code Online (Sandbox Code Playgroud) 所以我正在教我的朋友指点.在这样做时,我注意到两个相同结构的地址完全背靠背.
struct Foo
{
int a;
};
struct Bar
{
int b;
};
Run Code Online (Sandbox Code Playgroud)
这让我这样做:
Foo foo; foo.a = 100;
Bar bar; bar.b = 100;
Foo *pFoo = &foo;
Bar *pBar = &bar;
(pFoo+1)->a = 200;
Run Code Online (Sandbox Code Playgroud)
这将覆盖bar.b中的值并将其设置为200.
现在,我并没有质疑做这样的事情的优点 - 它可能永远不会在真正的节目中看到光明.我只是想知道,操作系统是否总是背靠背地分配相同的结构?只要给定区域有足够的可用内存空间.
我想遵循一些优秀的C++建议来计算一次数组长度,然后使用一个值,而不必像这样调用一个函数:
代替:
for( int i = 0; i < arr.length; ++i )
Run Code Online (Sandbox Code Playgroud)
我写
const int size = arr.length; // or arr.Count()
for( int i = 0; i < size; ++i )
Run Code Online (Sandbox Code Playgroud)
在阅读了另一个线程(在循环中执行array.length或list.count是否代价高昂)之后,我注意到性能增益没有实际意义,而且这是C#而不是C++.
第二个原因是使用值初始化我的数组:
const int size = arr.Length;
int[] primes_ = new int[size];
所以我的问题是:
为什么我不能宣布这个呢?它吐了我的错误:
Error 2 The expression being assigned to 'length' must be constant
这是非常令人困惑的,因为我的价值是不变的.但是,当我删除它时const,poof会消息....什么?
Length读取的初始化:
public int Length {get;}来自MSDN.这是特别令人困惑的,因为我的上一个问题(Get-Set Accessor功能因get-set关键字的存在而不同)明确地给了我答案"不可能只声明get和leave set缺席."
我不清楚为什么我可以宣布int size = arr.Length,但不是const int size …
作为家庭作业的一部分,我们应该映射地图中每个角色的出现.我们的函数应该使用std :: for_each并传入要计算的字符.
我的功能是:
std::for_each(document_.begin(),
document_.end(),
std::mem_fun(&CharStatistics::fillMap));
Run Code Online (Sandbox Code Playgroud)
document_是一个string,并且fillMap函数定义为
void CharStatistics::fillMap(char ch)
{
ch = tolower(ch);
++chars_.find(ch)->second;
}
Run Code Online (Sandbox Code Playgroud)
chars_被宣布为std::map<char, unsigned int> chars_;.
我认为这应该有效,但编译器抱怨
error C2064: term does not evaluate to a function taking 1 arguments
Run Code Online (Sandbox Code Playgroud)
这让我感到困惑,因为当我查看参数列表时
_Fn1=std::mem_fun1_t<void,CharStatistics,char>,
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>,
1> _Result=void,
1> _Ty=CharStatistics,
1> _Arg=char,
1> _InIt=std::_String_iterator<char,std::char_traits<char>,std::allocator<char>>
Run Code Online (Sandbox Code Playgroud)
它对我来说很好看._Elem是一个char,我的函数接受一个char.迭代器只不过是一个char *
我究竟做错了什么?
每当用户输入"〜"作为参数时,我的程序将其替换为System.getProperty("user.home").
调试后,我看到这用"C:UsersSoulBeaver"而不是"C:/ Users/SoulBeaver"替换"〜".
通过以前关于不正确的user.home文件夹的问题,我发现Java试图从中获取路径
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\
但是,我正在使用Windows 8,似乎没有错:

在这一点上,我假设Java"吃掉"反斜杠...所以我该如何防止这种情况发生呢?
更新
由于代码是被请求的,所以在这里.这取自Allen Holub 解决Java的配置问题
/**
* For every enum element in the array, treat keys[i].name() as a key
* and load the associated value from the following places (in order):
*
* <ol>
* <li>a -D command-line switch (in System properties)</li>
* <li>if no -D value found, an environment variable with the same name as the key</li>
* <li>if no environment found, the default stored in the Enum element …Run Code Online (Sandbox Code Playgroud) 我有一个派生自Humanoid和Humanoid的Player类派生自Sprite
Sprite -> Humanoid -> Player
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.Sprite有虚方法
virtual sf::Sprite getSprite() { return sprite_; }
Run Code Online (Sandbox Code Playgroud)
sprite是一个可以绘制到屏幕上的图像对象.
人形机器人宣称 virtual sf::Sprite getSprite();
玩家定义 virtual sf::Sprite getSprite() { return sprite_; }
雪碧有一个成员sprite_; 这就是我想要做的:
1)在传递精灵的同时创建一个玩家类
Player::Player(sf::Image image)
: Humanoid()
{
sprite_.SetImage(image); // Converts sf::Image to sf::Sprite
}
Run Code Online (Sandbox Code Playgroud)
2)从我的Game类中将它绘制在屏幕上
sf::Image playerImage;
if(!playerImage.LoadFromFile("Link/Link.png"))
std::cin.get();
Player *player = new Player(playerImage);
/* ... */
App.Draw(player->GetSprite());
Run Code Online (Sandbox Code Playgroud)
测试程序,我发现该player->getSprite()方法确实被调用,但我担心我可能隐藏了该Sprite::getSprite()方法而不是实际导出和使用它.由于Sprite类有一个受保护的sprite_成员,我很困惑在调用函数时我实际返回的是哪个sprite_对象.
此外,似乎图像文件在该行的某处丢失,在我在SFML论坛中发帖之前,我想确认我的继承树是否实际上是正确的.