小编IAE*_*IAE的帖子

如何在函数中传递函数?

这是一个奇怪的头衔.如果有人能澄清我究竟是在问什么,我会非常感激,因为我不太确定自己.

我正在观看关于编程范式的斯坦福视频(那位老师很棒),当他开始这样做的时候,我正在观看视频:

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 …

c++ pointers

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

ARM程序集 - 转换字节序

这是目前我和我的队友坚持的家庭作业项目.我们没有多少介绍大会,这应该是我们的第一个家庭作业.任务是创建一个将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; 我们真的不知道.

任何提示将不胜感激.我们再次寻求帮助,但不是寻求解决方案.

干杯!

assembly arm endianness

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

指针初始化

对不起,如果之前已经问过这个问题.在我搜索SO时,我找不到一个问我想知道什么.

基本上,当我有这个:

typedef struct node
{
    int data;
    node *node;
} *head;
Run Code Online (Sandbox Code Playgroud)

并做 node *newItem = new node;

我的印象是我正在宣布和保留空间,但没有定义,指向struct node,是正确的吗?

所以,当我这样做

newItem->data = 100newItem->next = 0

我有点迷惑不解了.newItem = 0会说出究竟是什么?两个datanext?整个对象?

当我使用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.那么我怎么能像上面这样安全地使用我上面描述的未初始化指针呢?现在是不是指向一个未初始化的指针?

c++ pointers

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

递归地将元素插入二叉树

所以我完成了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)

c++ binary-tree

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

将2D数组传递给函数

这不是一个问题,"如何将其传递给函数?" 但是,"这可以接受吗?"

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)

c++ pointers multidimensional-array

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

内存分配相同的结构

所以我正在教我的朋友指点.在这样做时,我注意到两个相同结构的地址完全背靠背.

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++ struct pointers

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

为什么Array.Length和Array.Count()不能分配给const值?

我想遵循一些优秀的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 …

c# arrays const

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

STL for_each抱怨参数列表

作为家庭作业的一部分,我们应该映射地图中每个角色的出现.我们的函数应该使用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 *

我究竟做错了什么?

c++ stl mem-fun

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

Java System.getProperty("user.home")目录缺少分隔符

每当用户输入"〜"作为参数时,我的程序将其替换为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)

java registry home-directory windows-8

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

关于我游戏中继承的一个问题

我有一个派生自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论坛中发帖之前,我想确认我的继承树是否实际上是正确的.

c++ inheritance sfml

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