我是一名C++程序员,最近加入了一家使用大量C的新公司.当他们审查我的代码时,他们认为我过度设计了一些我完全不同意的事情.该公司正在做嵌入式系统中的所有事情,因此我的代码需要内存效率,但我正在做的事情不是CPU密集型的.我想知道你们怎么想我的设计.这是清单.
我有一些需要传递的数组,最终需要传递给一些C代码.我可以在这个地方传递一个指针和一个大小.但是我选择创建一个表示它的类 - 一个具有固定大小(我们知道最大大小)缓冲区的类,以及一个长度应始终<=缓冲区的大小,否则断言.通过这种方式,我可以只使用一个变量而不是两个变量来传递数组,如果将来最大的大小发生变化,我应该可以轻松地更改它.我没有为数组使用动态分配,因为它是嵌入式系统和内存分配可能会失败,我们不使用异常.该类可能少于30行代码,我在很多地方使用它.他们说我过度设计了它.
它们在C中有自己的容器实现.我需要使用其中一个,但我想隐藏所有详细的代码,远离我的主逻辑,所以我为它创建了一个包装类.包装类类似于stl,所以我有迭代器并且它在内部管理内存分配,但与stl不同,它在无法分配更多内存时返回错误代码.他们对这个问题的论点是我是唯一一个使用它的人,因此他们不希望它存在于存储库中.说实话,我发现这很愚蠢.
编辑:下面的类或多或少是我用于第1点的.我想要做的就是有一些东西可以传递而不会一直带着长度.
class A
{
static const MAX_SIZE = 20;
int m_Array[MAX_SIZE];
size_t m_Len;
public:
A(const int* array, size_t len)
{
assert(len <= MAX_SIZE);
memcpy(m_Array, array, len);
m_Len = len;
}
size_t GetLen() const { return m_Len; }
const int* GetArray() const { return m_Array; }
};
Run Code Online (Sandbox Code Playgroud) 我正在创建一个神经网络,并希望使用hash_map来保持每个神经元的输出神经元的权重参考:
class Neuron; //forward declaration was there (sorry I forgot to show it earlier)
typedef double WEIGHT;
typedef stdext::hash_map<boost::shared_ptr<Neuron>,WEIGHT> NeuronWeightMap;
class Neuron
{
private:
NeuronWeightMap m_outputs;
//...
public:
Neuron();
~Neuron();
//...
WEIGHT GetWeight(const boost::shared_ptr<Neuron>& neuron) const
{
NeuronWeightMap::const_iterator itr = m_outputs.find(neuron);
if( itr != m_outputs.end() )
{
return itr->second;
}
return 0.0f;
}
};
Run Code Online (Sandbox Code Playgroud)
我意识到我不能使用boost :: shared_ptr作为stdext :: hash_map的键,那么另一个建议是什么呢?是否有任何解决方法或是使用不同密钥或切换到std :: map的唯一选择?谢谢!
这是错误:
1>c:\program files (x86)\microsoft visual studio 8\vc\include\xhash(61) : error C2440: 'type cast' : cannot convert from 'const boost::shared_ptr<T>' to …
Run Code Online (Sandbox Code Playgroud) 我想为迷你缓冲区完成列表设置一个特定的窗口.目前,我在此配置中有3个窗口:
______
| | |
|____| |
|____|_|
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我想使用左下角窗口显示迷你缓冲区完成列表.
目前,它似乎是一个随机的窗口,并且大多数时候它喜欢使用最右边的窗口,这个窗口太薄而不能显示完成列表而不必我水平滚动,这很烦人.
另外,我使用了一个名为口齿不清脚本revive.el以恢复从文件(〜/ .revive.el)我的窗口配置时,我打开Emacs的.
如果你有两个功能,如:
def A
def B
Run Code Online (Sandbox Code Playgroud)
和A打电话给B,你能得到谁在B里面叫B,比如:
def A () :
B ()
def B () :
this.caller.name
Run Code Online (Sandbox Code Playgroud) 在此之前的问题,我最贴出我自己的shell代码.我的下一步是实现前台和后台进程执行并正确等待它们终止,这样它们就不会像"僵尸"那样停留.
在添加在后台运行它们的可能性之前,所有进程都在前台运行.为此,我在使用execvp()执行任何进程后简单地调用wait(NULL).现在,我检查'&'字符作为最后一个参数,如果它在那里,通过不调用wait(NULL)在后台运行该进程,并且进程可以在后台运行愉快我将返回到我的shell.
这一切都正常(我认为),现在的问题是,我还需要以某种方式调用wait()(或waitpid()?),以便后台进程不会保持"僵尸".这是我的问题,我不知道该怎么做......
我相信我必须处理SIGCHLD并在那里做一些事情,但是我还没有完全理解何时发送SIGCHLD信号,因为我还试图将wait(NULL)添加到childSignalHandler()但是它不起作用因为我一旦在后台执行了一个进程,调用了childSignalHandler()函数,因此等待(NULL),这意味着在"后台"进程完成之前我无法对我的shell做任何事情.由于信号处理程序中的等待,它不再在后台运行.
我在这一切中缺少什么?
最后一件事,这个练习的一部分我还需要打印进程状态的变化,比如进程终止.因此,对此的任何见解也非常感激.
这是我目前的完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wait.h>
#include <signal.h>
#include <sys/types.h>
#include "data.h" // Boolean typedef and true/false macros
void childSignalHandler(int signum) {
//
}
int main(int argc, char **argv) {
char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr;
bool background;
ssize_t rBytes;
int aCount;
pid_t pid;
//signal(SIGINT, SIG_IGN);
signal(SIGCHLD, childSignalHandler);
while(1) {
write(1, "\e[1;31mmyBash \e[1;32m# \e[0m", 27);
rBytes = read(0, bBuffer, BUFSIZ-1);
if(rBytes == -1) {
perror("read");
exit(1); …
Run Code Online (Sandbox Code Playgroud) Foo = Class.new
Foo.class_eval do
def class_bar
"class_bar"
end
end
Foo.instance_eval do
def instance_bar
"instance_bar"
end
end
Foo.class_bar #=> undefined method ‘class_bar’ for Foo:Class
Foo.new.class_bar #=> "class_bar"
Foo.instance_bar #=> "instance_bar"
Foo.new.instance_bar #=> undefined method ‘instance_bar’ for #<Foo:0x7dce8>
Run Code Online (Sandbox Code Playgroud)
只是基于方法的名称,我希望class_eval允许你向Foo和instance_eval添加一个类方法,以允许你向Foo添加一个实例方法.但他们似乎反其道而行之.
在上面的例子中,如果你在Foo类上调用class_bar,你会得到一个未定义的方法错误,如果你在Foo.new返回的实例上调用instance_bar,你也会得到一个未定义的方法错误.这两个错误似乎都与对class_eval和instance_eval应该做什么的直观理解相矛盾.
这些方法之间有什么区别?
class_eval的文档:
mod.class_eval(string [,filename [,lineno]])=> obj
在mod的上下文中计算字符串或块.这可以用于向类添加方法.
obj.instance_eval {| | block} => obj
在接收器(obj)的上下文中计算包含Ruby源代码或给定块的字符串.为了设置上下文,在代码执行时将变量self设置为obj,使代码可以访问obj的实例变量.
python是否提供了一种检查不同类型序列"相等"的优雅方法?以下工作,但它们对于python代码看起来相当丑陋和冗长:
def comp1(a, b):
if len(a) != len(b):
return False
for i, v in enumerate(a):
if v != b[i]:
return False
return True
Run Code Online (Sandbox Code Playgroud)
由于创建了第三个序列,以下内容有点短,但效率也较低:
def comp2(a, b):
for l, r in map(None, a, b):
if l != r:
return False
return True
Run Code Online (Sandbox Code Playgroud)
将其中一个例子列入列表理解并不是我正在寻找的.
编辑:理想情况下,我正在寻找一种在比较期间不会创建另一个序列的解决方案.
我多次使用过SQLite.NET.它总是工作正常,但我有一个朋友真的纠缠我,我应该使用SQL Server Compact,所以我完全呆在Microsoft环境中.
现在,我从未与Compact合作过,他告诉我这对他来说很好,但是看到.MDF扩展给了我毛骨悚然.不开玩笑.我想要的最后一件事是我的应用程序依赖于Access数据库.
由于我从来没有真正使用它,我问这里是否有人知道它为它做凭证,如果有人能告诉我它们之间的主要区别,主要是速度,文件大小,可靠性和功能.我知道要问很多,但如果有人能帮助我,我会很感激.
我试图通过iPhone上的AVAudioPlayer播放(非常短 - 少于2秒)的音频文件来消除启动延迟.
一,代码:
NSString *audioFile = [NSString stringWithFormat:@"%@/%@.caf", [[NSBundle mainBundle] resourcePath], @"audiofile"];
NSData *audioData = [NSData dataWithContentsOfMappedFile:audioFile];
NSError *err;
AVAudioPlayer *audioPlayer = [(AVAudioPlayer*)[AVAudioPlayer alloc] initWithData:audioData error:&err];
audioPlayer.delegate = self;
[audioPlayer play];
Run Code Online (Sandbox Code Playgroud)
一旦完成,我还实现了audioPlayerDidFinishPlaying方法来释放AVAudioPlayer.
我第一次播放音频时滞后是显而易见的 - 至少2秒.然而,之后立即播放声音.我怀疑那个罪魁祸首是[NSData dataWithContentsOfMappedFile]最初从闪存中读取了很长时间,但后来读取速度很快.不过,我不确定如何测试.
是这样的吗?如果是这样,我是否应该预先缓存NSData对象并积极地在低内存条件下清除它们?
这是我正在努力工作的代码:
<?php
class database {
var $connection;
function database($host,$username,$password,$database){
$this->connection = mysql_connect($host, $username, $password);
mysql_select_db($database,$this->connection);
}
function query($query){
$query = mysql_query($query,$this->connection);
return $query;
}
}
$db = new database("localhost","root","password","database1");
$db2 = new database("SERVER2","root","password","database2");
$sql = $db->query("SELECT * FROM users WHERE name = 'Yifan' LIMIT 1");
$row = mysql_fetch_assoc($sql);
var_dump($row);
$sql = $db2->query("SELECT * FROM users WHERE name = 'Yifan' LIMIT 1");
$row = mysql_fetch_assoc($sql);
var_dump($row);
?>
Run Code Online (Sandbox Code Playgroud)
所以,如果你不明白,我希望有两个或更多的连接到mysql使用对象,但问题是,我得到"bool(false)"作为第一个结果,并对第二个结果的正确响应.对于我做错了什么,或者甚至是可能的想法?谢谢.