[回到版面]
回應模式
名 稱
內 文
附加圖檔[] []
  • 可附加圖檔類型:GIF, JPG, JPEG, PNG,瀏覽器才能正常附加圖檔
  • 附加圖檔最大上傳資料量為 4096 KB。
  • 當檔案超過寬 125 像素、高 125 像素時會自動縮小尺寸顯示
  • AA可使用 [aa][/aa] 防止變形
  • 回覆時程式碼縮排會被trim消掉,請善用[code][/code]標色或貼到ideone等網站
  • LaTeX記法可以用「$$」或「\( \)」包起來,例如「$\sum_{k=1}^{k=n} k^2 = \frac{n(n+1)(n+2)}{6}$」

檔名:1503100176944.gif-(43 KB, 294x200)
43 KB
無標題無名氏17/08/19(六)07:49:36 ID:jdEJQoTENo.12425
#include
在約定習俗上是寫在標頭檔還是cpp裡面?
為什麼有人要引用標頭檔的時候
#include 要引用的東西.h
寫在cpp裡面
然後標頭檔裡面再定義一個
class 要引用的東西;
好能夠宣告一個類別
這樣寫在編譯上有什麼好處嗎

還有靜態成員初始為什麼寫在cpp裡面比較好
聽說#include用太多編譯的時候會跑很久請問大概是include多少個標頭檔才會編譯久一點
無名氏17/08/19(六)11:10:03 ID:Y6zwFC2oNo.12426
當你開發專案,要處理一堆事情的時候就很有用了。

寫一個共用的設定檔,然後程式去引用。
往後如果需要調整,更新還是維護,只要修改該設定檔,
全部都改好了。
無名氏17/08/19(六)13:22:43 ID:gBq2p1HANo.12427
檔名:1503120163804.jpg-(487 KB, 1443x1188)
487 KB
>為什麼有人要引用標頭檔的時候#include 要引用的東西.h寫在cpp裡面

compiling過程其實需要四步
第一步: C preprocessor (簡略cpp) 使用include識別在電腦中所有需要文件的位置
第二步:compiler將text文件轉換為assembly文件
第三步:assembler將assembly文件轉換為object文件
第四步:linker將所有object文件組合到可執行binary文件。
loader堆積木將binary文件放入記憶執行。

傳統的程序員認為今天的編譯器使compiling步驟變得太容易,因此新的程序員不知道如何抓錯。
無名氏17/08/19(六)17:57:36 ID:jdEJQoTENo.12428
檔名:1503136656853.jpg-(27 KB, 697x436)
27 KB
可以再問問題嗎
要是我有一串陣列代表音訊當時每個sample的level
也可以得知音訊的取樣頻率sample rate還有樣本數
做傅立葉轉換
https://tfetimes.com/c-fast-fourier-transform/
用的是這個的fft快速傅立葉轉換函式
之後得到結果是一串複數陣列
我該如何得知每個結果所對應的頻率還有振幅?
我沒學過訊號處理因為那個學期休學了下學期要再上
無名氏17/08/20(日)03:08:43 ID:W6UHxJ8sNo.12429
#開頭的東西統稱前置處理器(Preprocessor,樓上也有提到)
功能是在進入真正的C編譯器之前,先用某些粗淺的方式修改程式碼
前置處理器沒有C的文法概念,是文字對文字地做處理

#include實際運作的效果是把某個文字檔整個展開到那個位置
編譯器讀到#include的位置時,就如同讀到那個檔案裡一樣
//Header.h
int a=2;

//1.cpp
#include "Header.h"
int main()
{
cout<<a<<endl;
a=a*2+3;
cout<<a<<endl;
return 0;
}

以上這個cpp檔,在編譯器眼裡跟下面是一模一樣的
int a=2;
int main()
{
cout<<a<<endl;
a=a*2+3;
cout<<a<<endl;
return 0;
}



include沒有規定副檔名要用什麼
你要include一個cpp甚至exe都可以
不過他不會幫你做任何轉譯,你如果include一個正常的exe,編譯一定爆炸


而約定俗成的用法則是把類別、函式之類的東西的宣告放在.h裡,再include到cpp裡
這是多檔案專案(多個cpp編譯成一個exe)的做法
多檔案專案是把多個cpp各自編譯成一個暫時性的檔案稱為.o檔,內容跟exe一樣都是編譯過的機械碼,但不能執行
再用連結器(編譯器的一部份)把他們拼湊成一個exe檔

當你要使用一個類別或函式時,只要有他的宣告就能用了,不需要實作內容
如果這個cpp使用了某個他內部沒實作的類別或函式
連結器就會自動去找專案裡其他cpp的.o檔,看缺少的東西有沒有在那邊被實作,有的話就拿來用
所以你可以在很多個cpp裡都使用了某個類別或函式,但只在一個cpp裡實作,也只會被編譯一次
避免編譯器在每個cpp裡都各自編譯一次同樣的東西
無名氏17/08/22(二)01:45:01 ID:DTQFZZlkNo.12436
>>12428
若複數陣列長度為2^n,則bin的數量為2^(n-1)
用sample rate / sample size可得到resolution
每個bin所對應的頻率為 bin index * resolution
每個bin所對應的強度(magnitude)為其該複數在複數平面上的長度
無名氏17/08/28(一)15:45:51 ID:7IxIzVScNo.12456
>>12425
>>12427

編譯上 沒甚麼差
因為在編譯的時候都會先展開
你不分開寫也可以
其實就只是習慣問題

但分開寫 才會因為你程式設計所需事先去定義H檔
而不是寫到一半 要加甚麼在加
先寫H檔就是先把藍圖繪好
CPP檔去實作
而且你在看別人的code時你也會先看H檔
比較好理解別人的程式 因為H檔就是藍圖

>>還有靜態成員初始為什麼寫在cpp裡面比較好
這個沒差 習慣問題
>>聽說#include用太多編譯的時候會跑很久請問大概是include多少個標頭檔才會編譯久一點
上面說的 include越多 你再展開code的時候就越多
所以編譯時間就會變長
至於多少個你以後就知道了
沒用到的東西就不要include

>>12428
這個function 只有10行左右
先試著理解再發問吧
無名氏17/08/31(四)19:10:49 ID:NEnv82sMNo.12459
檔名:1504177849182.jpg-(76 KB, 540x405)
76 KB
>>12456
前幾天我寫東西的時候把靜態成員的初始都寫在標頭檔的時候
出現重複定義的問題之後移到cpp檔就解決了
我想應該是避免重複定義而已

>但分開寫 才會因為你程式設計所需事先去定義H檔
>而不是寫到一半 要加甚麼在加
>先寫H檔就是先把藍圖繪好
>CPP檔去實作
>而且你在看別人的code時你也會先看H檔
>比較好理解別人的程式 因為H檔就是藍圖

那可以問一下要是用JAVA的話
有辦法像C那樣先在標頭檔畫藍圖
說這個類別要可以幹嘛再到cpp實作那樣嗎

最近開始學JAVA結果東西都因為東西就都寫在類別裡面
覺得亂七八糟的不像C那樣好讀
是要先用abstract或是interface來說我打算設計一個東西他的子類別要能夠有這些函式嗎

JAVA的存取修飾字可以像C一樣寫一個public:之後就都public了嗎
無名氏17/08/31(四)20:47:24 ID:L99CZVEANo.12460
>>12459
就是用abstract跟interface
沒有辦法像C++那樣是因為java沒preprocessor

java的public很抱歉你只能慢慢一個一個寫
無名氏17/09/02(六)08:25:39 ID:AVeX7MTcNo.12462
檔名:1504311939079.png-(260 KB, 1223x332)
260 KB
>>JAVA的存取修飾字可以像C一樣寫一個public:之後就都public了嗎
A subclass inherits all of the public and protected members of its parent, no matter what package the subclass is in. If the subclass is in the same package as its parent, it also inherits the package-private members of the parent. You can use the inherited members as is, replace them, hide them, or supplement them with new members:


>>沒有辦法像C++那樣是因為java沒preprocessor
Java支援模塊化編程所以沒問題

Python不支持public和private,因為Python的用戶認為好的編程習慣更重要。
換句話說,繼承是告訴解釋器首先在子類中搜索屬性,如果沒有找到,那麼它去尋找並使用父類中的屬性。
無名氏17/09/02(六)09:44:37 ID:AVeX7MTcNo.12463
檔名:1504316677008.jpg-(545 KB, 1040x460)
545 KB
>前幾天我寫東西的時候把靜態成員的初始都寫在標頭檔的時候
>出現重複定義的問題之後移到cpp檔就解決了
#define
#ifdef
#endif
h檔的語法 如果找到重複的值,Preprocessor會退出複製、貼上。
無名氏17/09/03(日)00:07:04 ID:3IZhMqR6No.12464
>>12462
>>12463
我覺得你完全搞錯了他要問什麼...

>>靜態成員
靜態成員其實就是個名字冠上了class名的全域變數
在兩個不同的cpp裡各寫一次靜態成員的實作,就等於你宣告了兩個名字一樣的全域變數
會讓連結器不知道該抓哪個,所以編譯失敗
如果你把靜態成員實作寫在.h檔裡,就等於每個include了這個.h檔的cpp都各寫了一次

編譯時會把每個cpp獨立編譯成binary檔(.o檔),.o檔組合在一起就是exe檔
每個cpp裡被實作的變數都會在對應的.o檔裡佔有一塊空間
這就是為什麼靜態成員要在class宣告以外再在全域空間寫一次
因為這樣才能在某個.o檔裡生出一塊空間給那個變數,讓最後的exe裡有一個屬於他的空間
寫哪個cpp都可以,反正最後.o檔全部湊起來要剛好有一份

如果A.cpp跟B.cpp編譯出來的A.o跟B.o裡面都各有一塊空間是給同一個靜態成員的
那C.o在操作這個成員時,要用A的那份還是B的那份?
無名氏17/09/03(日)01:27:04 ID:/8deJiiQNo.12465
>>12464
在h文件中寫class靜態成員。
template< class T>struct BaseClass_statics {static std::string bstring;};

template< class T>std::string BaseClass_statics<T>::bstring = ".";

class BaseClass: public BaseClass_statics<void>{};
無名氏17/09/03(日)15:26:56 ID:0LlgnzkINo.12466
>>12459
我是No.12456
自行測試一下 多個檔案重複include Header時
static 初始化寫在 Header 確實會有link error
問題如>>12464 所說

>那可以問一下要是用JAVA的話
>有辦法像C那樣先在標頭檔畫藍圖
>說這個類別要可以幹嘛再到cpp實作那樣嗎

應該是沒辦法 如果你喜歡規劃藍圖的話
可以畫UML 未來當系統分析師 或是 PM都有幫助
無名氏17/09/05(二)00:39:36 ID:Jb7Vd7mcNo.12467
>>12466
怎麼看怎麼像interface
無名氏17/09/05(二)00:40:19 ID:Jb7Vd7mcNo.12468
>>No.12466
怎麼看怎麼像interface
無名氏17/09/07(四)08:16:30 ID:6hp8dnB2No.12474
檔名:1504743390115.gif-(400 KB, 500x275)
400 KB
>>12466
我喜歡做的是GUI程式
藍圖是因為我怕寫到後來程式碼越來越亂很難讀又很難刪改

//---
我想用JAVA獲得聲音裝置的名字
Mixer.Info[] MixerInfos = AudioSystem.getMixerInfo();
System.out.println(System.getProperty("file.encoding"));
System.out.println("中文");
for (Mixer.Info info : MixerInfos) {
System.out.println(info.getName());
}

然後控制台得到的是

UTF-8
中文
¥D­n­µ®
Bluetooth Audio (Bluetooth Audio)
³â¥z (Realtek High Definition Audi
¥D­n­µ®ÄÂ^
³gJ­· (Realtek High Definition
BluetoothAudio (Bluetooth Audio
Port Bluetooth Audio (Bluetooth Audi
Port ³â¥z (Realtek High Definition
Port BluetoothAudio (Bluetooth Audio
Port ³gJ­· (Realtek High Definit

裝置名稱(麥克風、喇叭那些)是出現亂碼
請問這該怎麼解決
明明直接print"中文"可以用但是想得到裝置名稱有中文就出現亂碼而且又好像會缺字不完整
無名氏17/09/07(四)08:20:41 ID:6hp8dnB2No.12475
>>12474
然後這是國外用同樣的程式碼跑一遍
https://www.java-forums.org/advanced-java/36242-displaying-list-audio-devices.html

他在max跟linux得到的輸出都很正常可以讀

我的程式碼只有他原來Mixer[]那邊改成Mixer.Info[]
無名氏17/09/08(五)18:09:26 ID:6Z6s6J9MNo.12480
>>12475
沒事了查了之後發現中文就會有這問題現在也沒辦法解決
還有mac打成max GGGGG

【刪除文章】[]
刪除用密碼: