在CoreAudioTypes.h中,有以下声明:
struct AudioBuffer
{
UInt32 mNumberChannels;
UInt32 mDataByteSize;
void* mData;
};
typedef struct AudioBuffer AudioBuffer;
/*!
@struct AudioBufferList
@abstract A variable length array of AudioBuffer structures.
@field mNumberBuffers
The number of AudioBuffers in the mBuffers array.
@field mBuffers
A variable length array of AudioBuffers.
*/
struct AudioBufferList
{
UInt32 mNumberBuffers;
AudioBuffer mBuffers[1]; // this is a variable length array of mNumberBuffers elements
} ;
typedef struct AudioBufferList AudioBufferList;
Run Code Online (Sandbox Code Playgroud)
我的问题涉及到mBuffers成员AudioBufferList.它们将它声明为一个大小为1的数组,但它的使用方式就好像是(任何大小)一样mNumberBuffers.
在C和C++中这不是非法的(代码应该兼容)吗?
这段代码:
int …Run Code Online (Sandbox Code Playgroud) std::tuple我认为通过std::make_tuplerequire 右值引用参数( type )创建一个非常有意识的设计决策T&&。
然而,这意味着对象类型的移动语义 ( std::move 只不过是 to 的强制转换T&&),而且我对构建始终需要这样做的对象感到不太舒服std::tuple。
int x = 7, y = 5;
std::tuple<int, int> fraction = make_tuple<int, int>( x, y ); // fails
Run Code Online (Sandbox Code Playgroud)
关于上述内容,编译器说:
错误 C2664: 'std::tuple<int,int> std::make_tuple<int,int>(int &&,int &&)': 无法将参数 1 从 'int' 转换为 'int &&'
message : 您无法将左值绑定到右值引用
std::tuple如果您不使用,则可以从左值制作 a没有问题make_tuple:
std::tuple<int, int> fraction = { x, y }; // ok
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是为什么?
我怎样才能使MSVC++程序和C#.NET程序产生相同的随机数序列?
可能吗?MSVC++ rand()和System.Random?之间有什么关系吗?
鉴于下面的例子,它们似乎完全不同.
#include <iostream>
using namespace std;
int main()
{
srand( 1 ) ;
cout << rand() << endl <<
rand() << endl <<
rand() << endl ;
}
Run Code Online (Sandbox Code Playgroud)
using System;
class Program
{
static void Main( string[] args )
{
Random random = new Random( 1 );
Console.WriteLine( random.Next() );
Console.WriteLine( random.Next() );
Console.WriteLine( random.Next() );
}
}
Run Code Online (Sandbox Code Playgroud) 我正在研究这个C++项目.
所有类的实现都与.h文件分开.
但是,我不确定为什么/何时需要前方声明.
例如,当我#included"ClassType.h"时,我刚刚遇到错误,编译器完全拒绝编译具有指向ClassType的指针的类,即使类ClassType 在"ClassType.h"中明确定义.
为什么编译器不能简单地看到我已经#included"ClassType.h",为什么它需要一个前向声明呢?
#include "ClassType.h"
// REFUSES TO COMPILE WITHOUT forward declaration
class ClassType;
class SomeClass
{
ClassType* instance;
};
Run Code Online (Sandbox Code Playgroud) 我在静态html文件中有一堆网址需要更改.
他们现在看起来像这样:
<img src="/foldera/folderb/folderc/images/imgxyz.jpg" />
他们需要看起来像这样:
<img src="imgxyz.jpg" />
所以,我刚写了一个php脚本,打开每个脚本并执行preg_replace().
我的正则表达式(使用双重反斜杠,是):
$regex = '/<img src="\\/foldera\\/folderb\\/folderc\\/images\\/([^"]*)" \\/>/'
$replacement = '<img src="$0" />' ;
Run Code Online (Sandbox Code Playgroud)
因此,我只会在/ images之前捕获任何内容,直到结束报价.
但我得到的是:
<img src="<img src="/foldera/folderb/folderc/images/imgxyz.jpg" />" />
似乎捕获组过于热心......或者某些东西与/ foldera/folderb部分不匹配.
这里发生了什么?
我编写了一个'构造函数'函数,它在C语言中创建一个Node,使用Visual Studio 2008,ANSI C模式编译.
#include <stdio.h>
#include <stdlib.h>
typedef struct _node
{
struct _node* next ;
char* data ;
} Node ;
Node * makeNode()
{
Node * newNode = (Node*)malloc( sizeof(Node) ) ;
// uncommenting this causes the program to fail.
//puts( "I DIDN'T RETURN ANYTHING!!" ) ;
}
int main()
{
Node * myNode = makeNode() ;
myNode->data = "Hello there" ;
// elaborate program, still works
puts( myNode->data ) ;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是:
我真的习惯于VS所有属性都在一个大对话框中很好地列出.
在Interface Builder中,我找不到这样的对话框.
如果我想将UITextField的clearsOnBeginEditing字段设置为FALSE,那么最好的位置在哪里?我刚刚缺少接口构建器中控件属性的接口吗?
例如,NSString文档有
– initWithFormat:
– initWithFormat:arguments:
– initWithFormat:locale:
– initWithFormat:locale:arguments:
– initWithData:encoding:
+ stringWithFormat:
+ localizedStringWithFormat:
+ stringWithCharacters:length:
+ stringWithString:
+ stringWithCString:encoding:
+ stringWithUTF8String:
Run Code Online (Sandbox Code Playgroud)
那么当方法名称左边有+时,它意味着什么?
我有一堆不相同的相关常量.如何命名它们更好的方法是什么?
kWalkSpeed kRunSpeed kEatSpeed kDrinkSpeed
要么,
kSpeedWalk kSpeedRun kSpeedEat kSpeedDrink
如果我们根据这些评估这些
我认为方式#1赢得了可读性,它们与可理解性相关,在自动完成列表中组织方式#2获胜,方式#1也因不容易出错而获胜.
我不确定它经常发生在其他人kSpeedEatingWhenInAHurry身上,但是当这样的变量名变长时,那么当你真正想要的时候很容易写kSpeedEatingWhenInHome,特别是当使用自动完成时.
任何观点?
在很多C++ API(基于COM的那些)中为你创造了一些东西,指向构造对象的指针通常需要作为**指针(并且函数将为你构造和初始化)
您通常会看到以下签名:
HRESULT createAnObject( int howbig, Object **objectYouWantMeToInitialize ) ;
Run Code Online (Sandbox Code Playgroud)
- 但您很少看到新对象作为返回值传递.
除了想要查看错误代码的人,这是什么原因?是否更好地使用**模式而不是返回的指针来实现更简单的操作,例如:
wchar_t* getUnicode( const char* src ) ;
Run Code Online (Sandbox Code Playgroud)
或者这更好地写成:
void getUnicode( const char* src, wchar_t** dst ) ;
Run Code Online (Sandbox Code Playgroud)
我能想到的最重要的事情就是记住释放它,并且由于**某种原因,这种方式往往会提醒我,我也必须解除它.
任何人都可以解释"arc4random()"方法如何在内部工作?
我的代码在这里:
randomDataName.derivation = [derivationArray objectAtIndex:(arc4random() %derivationCount)];
randomDataName.icon = [iconArray objectAtIndex:(arc4random() % iconCount)];
randomDataName.notes = [notesArray objectAtIndex:(arc4random() % notesCount)];
Run Code Online (Sandbox Code Playgroud) 为什么我不能抓住这个例外?
我的(客户端)代码:
Eigen::MatrixXd FFs ;
try
{
FFs.resize( NUMPATCHES, NUMPATCHES ) ;
}
catch( int e )
{
error( "Not enough memory :(" ) ;
return ;
}
Run Code Online (Sandbox Code Playgroud)
抛出异常的特征代码是向下几级.
EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
{
internal::check_rows_cols_for_overflow(rows, cols);
m_storage.resize(rows*cols, rows, cols);
}
哪个电话
void resize(DenseIndex size, DenseIndex rows, DenseIndex cols)
{
if(size != m_rows*m_cols)
{
internal::conditional_aligned_delete_auto(m_data, m_rows*m_cols);
if (size)
m_data = internal::conditional_aligned_new_auto(size);
else
m_data = 0;
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
}
m_rows = rows;
m_cols = cols;
}
粗体线是在线前被击中的线:
throw std::bad_alloc();
Run Code Online (Sandbox Code Playgroud)
被击中,这发生在internal::conditional_aligned_delete_auto(m_data, …