Re: [心得] 程式設計師應該懂多少?
※ 引述《xsion (Xsion)》之銘言:
: 標題: [心得] 程式設計師應該懂多少?
: Q: 下面這段程式有沒有什麼問題?
: void fun(int* ptr)
: {
: ptr = new int[2];
: }
: int main()
: {
: int *ptr = NULL;
: fun(ptr);
: ptr[1] = 1;
: ptr[2] = 2;
: printf("%d %d", ptr[1], ptr[2]);
: return 0;
: }
:
: 我期待中的出淺的Programmer起碼會看出「有使用new配置記憶體,卻沒delete釋放」
: 「C語言是base-0陣列宣告大小為2的不能索引到[2]」,我想有點程度的應該還能回答
: C語言都是傳值呼叫,所以配置好的指標空間無法回傳。
: 我還想看得出錯誤的人還可以討論怎麼修改會比較好...
:
: 好吧,或許你們都用C++ Builder或.Net,有好用的data structure class可以用,
: 所以我改問...
: Q:當有不定資料長度的資料要儲存時,你會使用什麼方法。
: A:不定長度?
: Q 補充道:就是一開始不知道需要多大空間,要動態配置的啊。
: A:不是寫程式時就知道大小了嗎?
: Q又補充道:很多狀況要等執行時期,資料讀入或使用者輸入後才知道會有幾筆資料啊。
: 這些是編譯時期不會知道的啊。
: A:不會啊,都可以知道啊。
:
: 同上題,另一位回答道。
: A:方法? Q補充道:對,就是你會用哪一種資料結構或者是哪些現成的Class?
: A:用陣列啊。 Q可是陣列不能動態大小耶。
: A:是喔?......(沉默) Q:你都宣告一個很大的陣列來存放嗎?
: A:這也是個方法啦......(已經恍神中)
:
=========================================================================
: void fun(int* ptr)
: {
: ptr = new int[2];
: }
基本上出現這種用法, 或者說這個需求是所謂 variable size array 的問題.
我猜, 學校教的通常會強調使用已知固定大小的 n-dimension array 來事先
聲明, 這是因為不同語言對 n-維陣列 排法不同, 最安全辦法就是在 main
program 與 sub-program 間均宣告相同大小與型態的 n-維陣列, 使得下標
(index)的位址換算可以一致. 但做練習這樣是簡單可以的, 但要寫一個通用
讓別的 main program 都可以隨 varible size variable dimension 調用的
function sub-program 就有麻煩了.
老式的 FORTRAN 是在主程式預留最大的 array space , 讓 sub-program 用
call by address/reference 根據傳入的 dimension 自行換算成 one-dim
去取用.
在網路 message passing 時代, 使用 pointer 就比較麻煩一點, 但 c 語言
的低階功能就是能用 pointer 操控 address of mnemonic name , 所以多數
的花樣跟此有關.
如果照以前的 FORTRAN function 定義, function 帶入的參數, 依照數學習
慣是不可以在 function 處理時受到更動的, FORTRAN 因之也沒有調用自己的
recursive function 功能. function sub-program 如果用 stack space 暫
存 local variable 與傳遞參數, 上述問題就能一併提供, 但離開 function
sub-program 那些 function 內部的 local variable 就隨 return 可能就讓
stack 的再用增長而消失了, 因此一個臨時的 heap space 隨 malloc 動態配
置而來. 但要個空間並非就照那個大小剛好的給, 通常是有個基本最小單位,
常常是超用了, 或用了不收回也沒怎樣, 這就會養成壞習慣, 對分工發展各自
的 sub-program 帶來危害.
這種問題應該是給個範例, 每個要點都提到, 學習的人一次也就全通了.
不過, 讓 sub-program 來要求一個主程式也要使用到的 memory space , 在
可讀性與維護上是不好的示範.
: 面試到此已經快要升天了,針對一位強調自己會C++和物件導向的人再問道。
: Q:Class宣告中,你是如何決定成員的存取等級?
: A:存取等級?
: Q:就是 public, protected和private那三個啊,你宣告的變數或函式要放在哪一段裡面?
: A:喔,那個喔。那些比較理論的東西,我比較沒在注意(心虛中)
: Q:小姐,這些不是理論,這是物件導向最基本的精神,封裝。
: A:喔~那個喔,我都是改人家程式的,都是放在public。
: Q:所以你都不知道為甚麼要放在public嗎?
: A:恩......(無言)
:
: 另一位面試者,強調用MFC寫過Windows Application,所以問道。
: Q:你知道Windows Message的架構嗎?
: A:不知道(這個倒爽快)
: Q:你知道Procress和Thread的差異嗎?
: A:...(沉默是金)
: Q:在Windows裡面,不同Procress間要如何溝通?(我承認我蠢,連上一題都無法
: 回答的人,我還找死問這題!)
: A:阿!我有寫過,用CreatThread......
: Q:那是Thread,Thread和Process共用資料段,不需要啥特別的方法溝通。
: A:喔~(沉默)
======================
這一題的題例要扯 local/public 宣告還可, 但扯 multi-thread 就遠了一點 !
#include <stdio.h>
int * fun(int * ptr, int dim)
{
ptr = new int[dim + 1]; /* C array count from zero */
ptr[0] = ptr[0] + 100; /* 每次叫用 是否歸零或累加 */
ptr[3] = 3;
ptr[dim] = dim;
printf("%d %d %d %d %d\n",ptr[0],ptr[1],ptr[2],ptr[3],ptr[dim]);
return ptr ;
}
int void main() /* 新規範 結束時帶回shell是否正常結束指示,DOS 是 register A */
{
int * ptr, * temp1;
int asize, i ,j ;
asize = 12;
ptr = fun(ptr, asize);
ptr[1] = 1;
ptr[2] = 2;
for (i=0; i < asize - 5 ; i=i+5)
printf("%d %d %d %d %d\n", ptr[i],ptr[i+1],ptr[i+2],ptr[i+3],ptr[i+4]);
for (j=i; j <= asize; j++)
printf("%d ",ptr[j]);
printf("\n");
temp1 = ptr;
/* 老式的 gcc 2.X delete 又再 new 使用 data array 時,不會全 init to 0 */
// delete []ptr; /* delete ptr ; delete pointer with full array */
ptr = fun(ptr, 18);
delete []temp1; /*先要下一個 new array , 再清除舊的, 就不會用到舊的 */
printf("What happen ? ptr[0]= %d \n", ptr[0]);
return 0; /* depend on program exit for cli */
}
動態使用記憶體, 如果反覆 new delete 一個 array , delete 的反應
因效率的考慮, 隨下一個需求空間的大小會對宣稱該回收的資料有不同
的處理, delete 資料空間的回收反應, 在實作上跟語意有點差距.
◆ From: 140.115.4.12
推
06/05 10:47, , 1F
06/05 10:47, 1F
推
06/05 10:56, , 2F
06/05 10:56, 2F
推
06/05 11:03, , 3F
06/05 11:03, 3F
→
06/05 11:05, , 4F
06/05 11:05, 4F
推
06/05 11:09, , 5F
06/05 11:09, 5F
→
06/05 11:10, , 6F
06/05 11:10, 6F
→
06/05 11:12, , 7F
06/05 11:12, 7F
推
06/05 13:00, , 8F
06/05 13:00, 8F
推
06/05 13:39, , 9F
06/05 13:39, 9F
推
06/05 20:16, , 10F
06/05 20:16, 10F
→
06/05 20:23, , 11F
06/05 20:23, 11F
推
06/05 20:30, , 12F
06/05 20:30, 12F
推
06/05 20:37, , 13F
06/05 20:37, 13F
※ 編輯: ggg12345 來自: 140.115.4.12 (06/06 13:22)
推
06/06 20:21, , 14F
06/06 20:21, 14F
推
06/06 22:45, , 15F
06/06 22:45, 15F
推
06/06 22:57, , 16F
06/06 22:57, 16F
推
06/07 03:26, , 17F
06/07 03:26, 17F
推
06/07 03:33, , 18F
06/07 03:33, 18F
推
06/07 04:23, , 19F
06/07 04:23, 19F
→
06/07 04:23, , 20F
06/07 04:23, 20F
推
06/07 08:07, , 21F
06/07 08:07, 21F
→
06/07 08:07, , 22F
06/07 08:07, 22F
推
06/07 08:22, , 23F
06/07 08:22, 23F
※ 編輯: ggg12345 來自: 140.115.4.12 (06/07 08:51)
推
06/07 08:45, , 24F
06/07 08:45, 24F
推
06/07 08:49, , 25F
06/07 08:49, 25F
推
06/07 14:57, , 26F
06/07 14:57, 26F
→
06/07 14:59, , 27F
06/07 14:59, 27F
→
06/10 09:46, , 28F
06/10 09:46, 28F
→
06/10 09:50, , 29F
06/10 09:50, 29F
討論串 (同標題文章)
Soft_Job 近期熱門文章
26
60
PTT職涯區 即時熱門文章