我读到,当提供适合转换构造函数或操作数时,C++编译器能够隐式转换类型.我实际上发现了看起来像这样的示例代码:
class Dog{
private:
string name;
public:
Dog(string n):name(n){} //This as the converting constructor
}
int main(){
Dog d = "rover";
}
Run Code Online (Sandbox Code Playgroud)
每当我运行此代码时,编译器都会抛出一条错误消息:
从'const char [6]'转换为非标量类型'Dog'请求Dog d ="rover";
在编译时我添加了编译器选项-std=c++11,所以它不应该是关于C++版本的,对吧?
我在网上找到的例子(至少对我来说)看起来完全相同,所以我不知道这里出了什么问题.
我对此主题的输入来自此视频:
转换构造函数和重载运算符 - 最新的
我使用以下代码加载剪辑(javax.sound.sampled.Clip)
def createClip(file:String):Clip = {
val clip = AudioSystem.getClip()
clip.open(AudioSystem.getAudioInputStream(new File(s"sounds/$file.wav")))
clip
}
Run Code Online (Sandbox Code Playgroud)
它是用Scala编写的,但我想任何不熟悉scala的人都会看到java基本相同,就像java一样.
我的尝试是让它毫不费力地播放这样的声音
createClip("example_WAV_File").start()
Run Code Online (Sandbox Code Playgroud)
因为我将创建一个新的 Clip,每次我调用一个声音文件,我认为关于倒回剪辑等应该没有任何问题.但是在实际应用程序(游戏)中,我使用这个库来处理声音Punch和所有这些东西的结果.现在是这样的事情,当(例如)冲压几次时,有些时候我会得到
线程"Thread-58"中的异常javax.sound.sampled.LineUnavailableException:行格式为PCM_SIGNED 44100.0 Hz,16位,立体声,4字节/帧,不支持little-endian.
我曾遇到类似的错误,但这是关于比特编码超过16位.由于我的文件有16位编码,我不知道这可能是什么...
如上所述,只有在播放几个剪辑时才会出现错误.我想,这可能表明存在内存问题.我天真地想,垃圾收集器会为我做所有工作,因为剪辑在离开其范围时会失去任何参考.
我最初的解决方案是,保持对我要播放的任何声音的引用,并且只在另一个实例需要已经播放的声音时才回放它.这个解决方案永远不会破坏,但它真的不能两次播放相同的剪辑.这就是为什么我在需要时切换到多次加载剪辑的原因.
我想,我可能应该在剪辑上使用close()方法.
val clip = createClip("example_WAV_file")
clip.start()
clip.close()
Run Code Online (Sandbox Code Playgroud)
这实际上解决了我的问题,增强了我的猜测,它可能与内存有关,但是,现在剪辑会在启动后立即停止.
我真的需要为每个剪辑创建一个线程,等待clip.getMicrosecondLength()时间关闭它吗?这听起来很糟糕.
只剩下选项 - >我使用声音API确实非常错误,即使我想,我正在使用它只是一些教程给我看的方式.那我的特殊错误在哪里?或者,能够同时播放相同剪辑两次的解决方案是什么?
在malloc()用于分配内存空间之后,我很好奇指针究竟是什么?该联机帮助页告诉我calloc()初始化已分配的内存空间为零.
malloc()函数分配大小字节并返回指向已分配内存的指针. 内存未初始化.如果size为0,则malloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.
和
calloc()函数为每个大小为字节的nmemb元素数组分配内存,并返回指向已分配内存的指针. 内存设置为零.如果nmemb或size为0,则calloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.
我在C中为C(haha)创建了一个非常简短的示例程序:
int main() {
char *dynamic_chars;
unsigned amount;
printf("how much bytes you want to allocate?\n");
scanf("%d", &amount);
dynamic_chars = (char*)malloc(amount*sizeof(char));
printf("allocated:\n%s\n", dynamic_chars);
free(dynamic_chars);
return 0;
Run Code Online (Sandbox Code Playgroud)
}
但是,在执行此代码时,它只输出任何内容.如果我初始化内存,例如0xFFFF使用循环初始化每个字节,那么程序会向我显示我期望的内容.内存空间实际存在,因为我不会收到错误声称我正在尝试访问未初始化的变量.
由于内存空间通常不会被删除但被标记为可重写,我想知道如果通过执行我的程序,我是否应该能够看到以前使用的随机内存字节?但我什么都看不到,所以我真的很困惑malloc().
关于malloc()或者可能是内存使用的另一件事,关于我的程序是有趣的:如果我使用calloc(),分配内存,我可以通过例如监视来跟踪我的程序的实际内存使用情况.例如,如果我告诉我的程序,每次分配1.000.000.000字节的内存calloc()我将在我的系统监视器中看到以下内容:
c
malloc
initialization
dynamic-memory-allocation