亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 有多少C程序員認(rèn)為這是錯誤的寫法 [打印本頁]

作者: pmerofc    時間: 2012-05-11 20:11
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: OwnWaterloo    時間: 2012-05-11 20:23
投票被標(biāo)題出賣了……


這樣沒問題吧?

  1. float* matrix = (float*)malloc(n*m);
  2. int i,j;
  3. for (i=0; i<n; ++i)
  4.       for (j=0; j<m; ++j)
  5.             USE(matrix + i*m + j);
復(fù)制代碼

作者: pmerofc    時間: 2012-05-11 20:28
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: wolf5729    時間: 2012-05-11 20:38
程序的思想,用一個float遍歷一個二維的數(shù)據(jù),我認(rèn)為這塊是對的。
只不過,遍歷時的下標(biāo)換算有問題,pscore + 5 * i + j 改成 pscore + 4 * i + j 才對吧?




------------------------------------
歡迎光臨我的博客:www.danoking.com [DNK的博客]


作者: pmerofc    時間: 2012-05-11 20:42
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: folklore    時間: 2012-05-11 20:45
一般用:
  for( i = 0 ; i < sizeof(score)/sizeof(score[0]) ; i++ )
   {
     for( j = 0 ; j < sizeof(score[0])/sizeof(score[0][0]) ; j ++ )
       scanf("%f", pscore + 5 * i + j );
   }

作者: pmerofc    時間: 2012-05-11 20:47
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: wolf5729    時間: 2012-05-11 20:53
回復(fù) 5# pmerofc


    哈哈,多謝提醒,我頭腦發(fā)熱,搞錯了。
作者: folklore    時間: 2012-05-11 20:57
本帖最后由 folklore 于 2012-05-11 20:58 編輯

從C角度是沒問題的,從C++的角度有問題,因?yàn)閟core是一個數(shù)組
兩都都沒問題的寫法是:

  1.   for( i = 0 ; i < sizeof(score)/sizeof(score[0]) ; i++ )
  2.     {
  3.       for( j = 0 ; j < sizeof(score[0])/sizeof(score[0][0]) ; j ++ )
  4.         scanf("%f", &pscore[i][j]);
  5.     }
復(fù)制代碼

作者: pmerofc    時間: 2012-05-11 21:01
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 21:02
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: folklore    時間: 2012-05-11 21:05
pmerofc 發(fā)表于 2012-05-11 21:01
回復(fù) 9# folklore


明知故問
你想說的是:
struct{
   int score1[2];
   int score2[2];
};

score1+1==score2吧(C++)

作者: pmerofc    時間: 2012-05-11 21:11
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 21:12
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: OwnWaterloo    時間: 2012-05-11 21:22
回復(fù) 14# pmerofc

因?yàn)闃O少用多維數(shù)組嘛…… 于是不敢妄言……

這東西很難用……
以前我也提到過,K&R中某一個人吐槽pascal的數(shù)組在類型中混入了維度,所以很難寫通用的代碼;而C解決了這個問題。
其實(shí)沒有…… C也只是一維數(shù)組解決了這個問題,多維時一樣將維度混入了類型……


既然你都說到這份上了……  我就投一個……
理由是: T a[N]; sizeof(a) == sizeof(T*N);
那么一維數(shù)組是若干個float的連續(xù)緊密堆積 —— 中間沒縫的 —— 同理,二維數(shù)組又是若干一維數(shù)組的緊密堆積
自然就可以將二維數(shù)組N*M的內(nèi)存空間當(dāng)作長度為N*M的一維數(shù)組來使用。

作者: pmerofc    時間: 2012-05-11 21:33
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: OwnWaterloo    時間: 2012-05-11 21:35
回復(fù) 16# pmerofc

愿聞其詳

不過如果你打算再等等,再多釣幾只魚,我表示沒意見,等得起~
不必急著回也沒問題~
作者: pmerofc    時間: 2012-05-11 21:36
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: Sevk    時間: 2012-05-11 21:37
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 21:41
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: folklore    時間: 2012-05-11 21:49
pmerofc 發(fā)表于 2012-05-11 21:36
回復(fù) 15# OwnWaterloo

我覺得構(gòu)成一維數(shù)組的元素是float


我支持OwnWaterloo

我認(rèn)為C++中,
int a[2][3];
則a[0]+1=a[1];
故沒有所謂的越界問題。

就算是:
(&a[0][2])+1,也就是“越界”
將指向a[1][0];也是符合數(shù)組定義的,只要標(biāo)準(zhǔn)許可的都可以做吧,算是C/C++有別于其它語言的特點(diǎn)之一。

PS:以前看過你和其它人的討論,你應(yīng)該不是那種死板的人,但太書呆子氣了。
言者之所以在意,得意而忘言。不要執(zhí)著于一辭,死鉆牛角尖,不然就成為為討論而討論,沒有實(shí)際意義。
作者: pmerofc    時間: 2012-05-11 21:53
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: hbmhalley    時間: 2012-05-11 21:56

  1. int (*arr)[4][5] = calloc (3*4*5 , sizeof(int)) ;
  2. a[1][2][3] = 4 ;
復(fù)制代碼
個人覺得問題不大
作者: pmerofc    時間: 2012-05-11 21:58
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 22:02
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 22:07
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: folklore    時間: 2012-05-11 22:08
pmerofc 發(fā)表于 2012-05-11 21:53
回復(fù) 21# folklore


用手頭的VS2010,
a[0]的確是int *類型的,
但事實(shí)上它應(yīng)該是:        int (*)[2]類型的
也就是int (*pA)[2]=(int (*)[2])a[0];
所以,在C++中應(yīng)當(dāng)避免這種扯不清的寫法,使用數(shù)組的時候用下標(biāo)而不是地址加減
作者: pmerofc    時間: 2012-05-11 22:17
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: hbmhalley    時間: 2012-05-11 22:23
回復(fù) 25# pmerofc


    ..原版的是這樣:

  1. pascal : var arr : array [1..3 , 2..4 , 3..5] of integer ;
  2. c      : int (*arr)[3][3] = (void*)&((int(*)[3][3])(calloc (3*3*3 , sizeof(int))))[-1][-2][-3] ;
復(fù)制代碼

作者: pmerofc    時間: 2012-05-11 22:27
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: hbmhalley    時間: 2012-05-11 22:32
回復(fù) 30# pmerofc


    一同學(xué)從 pascal 轉(zhuǎn) c 發(fā)現(xiàn)不允許偏移很不爽 遂發(fā)明此寫法 ..
作者: OwnWaterloo    時間: 2012-05-11 22:38
回復(fù) 31# hbmhalley

這都什么人……
拖出去糟踏了
作者: pmerofc    時間: 2012-05-11 22:39
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 22:40
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: OwnWaterloo    時間: 2012-05-11 22:58
回復(fù) 18# pmerofc

姑且就先算它越界吧……


但這其實(shí),就和C89里使用:

  1. struct T {
  2.       ...
  3.       char s[1];
  4. };
復(fù)制代碼
差不多……  K&R是怎么評論來著?與C親密接觸?


還有hbmhalley提到的pascal的問題。
有一本叫《數(shù)值算法》的書的C版本,就用過類似的技巧:

  1. T* p = (T*)malloc(n * sizeof *p);
  2. --p;
復(fù)制代碼
然后就可以用1作為其實(shí)下標(biāo)了……  全書的代碼都是這么搞的……

并且,好像是在附錄里作者也提到了這事。
1. 這肯定是違法C語言的
2. 但這技巧在他測試過的平臺(記得不少)都沒出過問題……


還有前段時間,就在CU論壇里有一個帖。
我搜了半天無果,但內(nèi)容大致是:

  1. typedef struct {
  2.       U first[N];
  3.       ...
  4. } T;

  5. T* p = 0;
  6. if (p.first) { ... } else { ... }
復(fù)制代碼
其實(shí)這題目相對那些腦殘面試題來說還挺好的;居质且恢荒_踩在C的鋼絲上,另一只腳懸空的狀態(tài)……



也就是說,即使它們違反了某些規(guī)定,但實(shí)在也想不出會有什么危害 —— 除非編譯器故意整人。

比如二維數(shù)組,還有C89里模仿flexible的技巧,它們確實(shí)是一整塊continuous storage,即使越界了,后面空間肯定有,指針也不會溢出。
除非編譯器要去加上邊界檢查,那就……

BTW: 整個二維數(shù)組(甚至任何object)都可以取地址再轉(zhuǎn)換為char*最后一個一個訪問。 你說這數(shù)組的長度是多少呢?
我覺得在連續(xù)存儲的問題上,C語言有時候用的the same array這一術(shù)語其實(shí)是想指一塊連續(xù)內(nèi)存,而不是真的指它是某種類型的某長度的數(shù)組。
這塊內(nèi)存可以當(dāng)作任何類型來解釋,只要大小、對齊滿足需要即可。
再比如malloc( N*M*sizeof(float) ) 又該怎么解釋呢? 將它解釋為一個N*M的二維數(shù)組也行, 解釋為一個長度是N*M的一維數(shù)組也可以。 為什么對自動變量就不行了呢?

至于 p.first , 即使違反了C的規(guī)定, 也想不出會產(chǎn)生錯誤的情況。

只有那個 --p 讓下標(biāo)從1開始, 也許會產(chǎn)生溢出問題。

作者: 變異老鼠    時間: 2012-05-11 23:03
void *p = malloc(4 * 5 * sizeof(int));
int *arr1 = (int*)p;    // 這時候當(dāng)成 int [20] 來用
int (*arr2)[5] = (int(*)[5])p;  // 這時候當(dāng)成 int [4][5] 來用

問題:
同樣大小、同樣是連續(xù)分配、都滿足對齊要求的兩塊內(nèi)存,憑什么 malloc 的結(jié)果就能看成任意類型的 object,而 int arr[4][5] 就只能看成它聲明時候指定的 int[4][5] 類型的 object?
作者: 東方云濱    時間: 2012-05-11 23:05
有點(diǎn)搞不懂,哪位大蝦幫我解釋解釋吧,那個pscore是行指針嗎?而且,scanf("%f", pscore + 5 * i + j );
這樣寫的話,得到的是是每個元素的地址吧,怎么會得到每個元素的值呢?還求高人給解答一下哈,在此先謝過了
作者: pmerofc    時間: 2012-05-11 23:12
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 23:13
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 23:21
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 23:22
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 23:24
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 23:25
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-11 23:31
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: 變異老鼠    時間: 2012-05-11 23:33
pmerofc 發(fā)表于 2012-05-11 23:12
回復(fù) 36# 變異老鼠


這個還真是對的。

C99 7.20.3/1
... The pointer returned if the allocation
succeeds is suitably aligned so that it may be assigned to a pointer to any type of object
and then used to access such an object or an array of such objects in the space allocated
(until the space is explicitly deallocated). ...
作者: OwnWaterloo    時間: 2012-05-11 23:49
回復(fù) 41# pmerofc

比如:

  1. /* C89 */
  2. typedef struct {
  3.       ...
  4.       char s[1];
  5. } T;

  6. size_t l = strlen(argv[0]);
  7. T* p = (T*)malloc( l + sizeof *p);
  8. strcpy(p->s, argv[0]);
  9. ...
復(fù)制代碼
當(dāng)然,這技巧是飽受爭議的……
作者: OwnWaterloo    時間: 2012-05-12 00:10
回復(fù) 42# pmerofc

原文:
在實(shí)際中并不考慮這類少見的問題。我們不認(rèn)為在任何編譯器和機(jī)器上,對于小整數(shù)n, b=(b-n)+n 確實(shí)會失敗。
即使在分段式機(jī)器中,發(fā)生了編譯器存儲了某些b-n的表達(dá)式(也許是違法規(guī)則的),那么,當(dāng)表達(dá)式加上n后,b就恢復(fù)正常。
本書中的這些內(nèi)存分配程序,從1988年第一版發(fā)表以后就已廣泛應(yīng)用,當(dāng)然也存在著同樣的問題。
但是我們從未收到過在這方面失敗的報(bào)告,哪怕是一份簡單的報(bào)告(盡管有許多讀者指出在理論上它確實(shí)可能失。
我們也曾與C語言標(biāo)準(zhǔn)團(tuán)體通信,希望在將來的標(biāo)準(zhǔn)中能夠允許這個需要“b=(b-n)+n”(至少對n的某些范圍,并設(shè)n為短型數(shù)據(jù)類型)。
因?yàn)檫@樣做,看起來與現(xiàn)有的一些編譯器并沒有什么沖突。

《C數(shù)值算法》 B.1.2 單位偏移量

b在上下文中是指針類型。"短型數(shù)據(jù)類型"確實(shí)是譯文原文…… 英文原文我也不知道是什么……


很少有non-trivial的程序可以用純ISO C寫成。
看trivial怎么定義吧,如果嚴(yán)格到cp都算是trivial的話,那基本可以說:non-trivial程序不可能由ISO C寫成。
問題的關(guān)鍵不在于程序是否是100%純ISC C,而是 1) 超出是否值得 2) 超出部分比重多大


陳同學(xué)的問題就是: 1) 為了一點(diǎn)莫須有的可讀性而超出C范圍 —— 我認(rèn)為不值得  2) 這不是他的什么個人項(xiàng)目,而是傳道授業(yè)的書,不應(yīng)該這么亂來。
而數(shù)值算法為了下標(biāo)問題超出C范圍我認(rèn)為也不值得, C程序員寫C程序時就應(yīng)該從0開始數(shù)數(shù)…… 而不是和語言對著干……
不過這書重點(diǎn)是算法而非C語言(第1版是Fortran,也許是固守1下標(biāo)的理由之一……)。

作者: 東方云濱    時間: 2012-05-12 00:12
回復(fù) 39# pmerofc


   行指針也就是 在數(shù)組里那樣通俗的叫法,其實(shí)就是一維數(shù)組指針
作者: OwnWaterloo    時間: 2012-05-12 00:37
回復(fù) 45# 變異老鼠

1下標(biāo)在35樓就說了,它超出C的范圍了,而且都能設(shè)想出一種可能性。記得以前有過p[-1]的帖子,這里就不重復(fù)了。


但其他兩個(連續(xù)內(nèi)存、首成員地址)要說超出C范圍了吧,也許確實(shí)超了;但想不出會產(chǎn)生什么問題。
pmerofc 發(fā)表于 2012-05-11 23:21
回復(fù) 35# OwnWaterloo

C99和C11都特意指出了這是一種未定義行為(附錄)
究竟是出于什么深刻的原因
我也不太明白

也許只是有罪推定呢? 制定標(biāo)準(zhǔn)時覺得這沒用 —— 都給我用flexible去…… —— 但又是確實(shí)他們的失誤呢?


為什么是失誤?將malloc得到的內(nèi)存當(dāng)作二維又或是一維顯然必須是對的……
那么問題就來了,就是35樓與36樓的。這問題還可以反問44樓的cfaq:為什么malloc就可以,而自動變量就不行?

比如44樓的cfaq的代碼:

  1. f2(&array[0][0], NROWS, NCOLUMNS);
復(fù)制代碼
如果改為:

  1. void* p = malloc(NROWS * NCOLUMNS* sizeof(int));
  2. f2(p, NROWS, NCOLUMNS);
復(fù)制代碼
內(nèi)存大小相同 —— sizeof(array)==NROWS * NCOLUMNS* sizeof(int) —— ,對齊都合乎要求, 就完全沒問題。
為什么一個可以,另一個就不可以?

甚至依然用自動變量,但用一個union:

  1. union {
  2.       int a1[N*M];
  3.       int a2[N][M];
  4. } u;
復(fù)制代碼
又該怎么解釋?


能想到可能的回答是 —— 就像35樓說的 —— 編譯器進(jìn)行一些邊界檢查。對a[N],超出[(char*)a,(char*)a+sizeof a)就報(bào)錯。
而對b[N][M],超出[(char*)b, (char*)b+sizeof b) 的訪問報(bào)錯我覺得可以做到。
但對中間的訪問,編譯器還能夠區(qū)分出是通過二維還是一維訪問,并且真的這么干了…… 那也管太寬了……
如果這編譯器還不提供命令行選項(xiàng)去掉這種功能,至少這編譯器我不會去用……
作者: OwnWaterloo    時間: 2012-05-12 00:38
回復(fù) 45# 變異老鼠

我回復(fù)錯人了……  是準(zhǔn)備回復(fù)pmerofc的……
你倆頭像太一致了
作者: 幻の上帝    時間: 2012-05-12 00:39
回復(fù) 48# 東方云濱

不是指向多維數(shù)組的(直接的)元素的指針么。
作者: 幻の上帝    時間: 2012-05-12 01:06
看起來ISO C還是有點(diǎn)語焉不詳。
找到了點(diǎn)有趣的東西:
http://stackoverflow.com/questio ... -behavior-2d-arrays
http://stackoverflow.com/questio ... script-legal-by-the
作者: 幻の上帝    時間: 2012-05-12 01:36
另外一個問題:
ISO C規(guī)定數(shù)組的元素占據(jù)連續(xù)的存儲,但有說不準(zhǔn)有trailing padding么?
作者: OwnWaterloo    時間: 2012-05-12 01:44
回復(fù) 53# 幻の上帝

見15樓:T a[N]; sizeof a == sizeof(T)*N。
該規(guī)則分別應(yīng)用到一維與二維數(shù)組,至少[(char*)a, (char*)a+sizeof a)之間是沒有padding的。
之外 —— 其實(shí)也不是a了 —— 就無從知曉了。

總之,數(shù)組本身無padding。trailing padding被計(jì)算到每個T當(dāng)中了233{:3_191:}
作者: chinesedragon    時間: 2012-05-12 08:21
本帖最后由 chinesedragon 于 2012-05-12 08:37 編輯
pmerofc 發(fā)表于 2012-05-11 20:11
  1. #include <stdio.h>                              
  2. int main( void )
  3. {
  4.   float score[4][5],*pscore = *score ;
  5.   for( i = 0 ; i < 4 ; i++ )
  6.   {
  7.     for( j = 0 ; j < 5 ; j ++ )
  8.       scanf("%f", pscore + 5 * i + j );
  9.   }
  10.   /*
  11.     其他代碼
  12. */
  13.   return 0;
  14. }
復(fù)制代碼


這個我明白,相當(dāng)于score[ i ][j];
作者: pmerofc    時間: 2012-05-12 08:30
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-12 08:32
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: chinesedragon    時間: 2012-05-12 08:38
愿聞其詳~~~~~~~~~
pmerofc 發(fā)表于 2012-05-12 08:32
回復(fù) 55# chinesedragon 問題在于這個“相當(dāng)于”可能很成問題

作者: 變異老鼠    時間: 2012-05-12 08:57
回復(fù) 56# pmerofc


這幾個寫法有什么區(qū)別么?除了可讀性以外。sizeof(int[4 * 5]) == sizeof(int[4][5]) == sizeof(int) * 4 * 5
作者: 變異老鼠    時間: 2012-05-12 08:58
回復(fù) 50# OwnWaterloo


    不行,我得換個頭像去……{:3_188:}
作者: pmerofc    時間: 2012-05-12 09:10
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-12 09:11
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: 變異老鼠    時間: 2012-05-12 09:22
回復(fù) 61# pmerofc

1. malloc 只接受一個 size_t 參數(shù),它并不知道這個參數(shù)是怎么計(jì)算得到的。

2. 還是那段話,紅字部分:
變異老鼠 發(fā)表于 2012-05-11 23:33
C99 7.20.3/1
... The pointer returned if the allocation
succeeds is suitably aligned so that it may be assigned to a pointer to any type of object
and then used to access such an object or an array of such objects in the space allocated
(until the space is explicitly deallocated). ...

作者: pmerofc    時間: 2012-05-12 09:34
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-12 09:41
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: 變異老鼠    時間: 2012-05-12 10:44
回復(fù) 65# pmerofc


好吧……就算這樣,那第一點(diǎn)呢?數(shù)組也是 object 類型,而且作為 malloc 的參數(shù),sizeof(int[4*5])、sizeof(int[4][5]) 和 sizeof(int) * 4 * 5 沒有任何區(qū)別。
作者: lizhengqian02    時間: 2012-05-12 10:54
  1. 1 #include <stdio.h>
  2.   2
  3.   3 int main()
  4.   4 {
  5.   5    int  score[4][5];
  6.   6    int  (*pscore)[5] = score;//聲明一個指針,使其指向一個二維數(shù)組
  7.   7    int i,j;
  8.   8    for(i = 0 ;i < 4; i++)//循環(huán)將輸入數(shù)據(jù)存入數(shù)組中
  9.   9    {
  10. 10       for(j = 0;j < 5;j++)
  11. 11       {
  12. 12          scanf("%d",*(pscore + i) +j); //循環(huán)將輸入數(shù)據(jù)存入數(shù)組中
  13. 13       }
  14. 14    printf("\n");     
  15. 15    }
  16. 16    for(i = 0 ;i < 4; i++)
  17. 17    {
  18. 18       for(j = 0;j < 5;j++)
  19. 19       {
  20. 20          printf("%4d",*(*(pscore + i) +j));
  21. 21       }
  22. 22    }
  23. 23 }
復(fù)制代碼

作者: walleeee    時間: 2012-05-12 11:01
這些都是障眼法,數(shù)組是一個平坦結(jié)構(gòu),可以通過下標(biāo)方式訪問。
作者: pmerofc    時間: 2012-05-12 11:43
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-12 11:44
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-12 11:46
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-12 11:57
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-12 12:00
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-12 12:05
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-12 12:09
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: OwnWaterloo    時間: 2012-05-12 14:49
回復(fù) 72# pmerofc

"作者是否懂C"不敢評論。就當(dāng)他不懂吧,反正也不是教C的書。

但數(shù)學(xué)里的數(shù)與計(jì)算機(jī)里的數(shù)不是一回事,尤其是浮點(diǎn)數(shù),稍不注意就會被坑……
而作者會講如何分析這其中的差異 —— 當(dāng)然,這些分析難免會超出C語言就是了。

還是那句話:對很多問題,固守ISO C根本無法解決,必須下降到更低的層次才行。
難道ISO C無法解決的問題就是不應(yīng)該解決的問題么?


關(guān)于0-based…… Lua作者有一句話:許多語言使用0-based但卻沒有享受到0-based的一絲好處。
當(dāng)然…… sw也說過,Lua作者以前貌似用Fortran的,所以這句話雖然沒錯,但有馬后炮的嫌疑……

至于多維數(shù)組……  這東西又難用,還各種毛病一大堆……
所以我一開始就問了你那個問題……  反正我不用它,手工計(jì)算index…… 惹不起我總躲得起……

作者: OwnWaterloo    時間: 2012-05-12 14:58
回復(fù) 64# pmerofc

至于這個能用了做什么嘛……
它就是用來表達(dá)這樣一種memory layout:
從base開始,有若干固定數(shù)據(jù)(不同數(shù)據(jù)直接長度可能不同,但數(shù)據(jù)的數(shù)目與順序是固定的),之后緊跟長度固定但個數(shù)未知的數(shù)據(jù)。

作者: OwnWaterloo    時間: 2012-05-12 15:13
這3帖:
pmerofc 發(fā)表于 2012-05-12 09:10
回復(fù) 59# 變異老鼠

    malloc()應(yīng)是為一個對象分配內(nèi)存。
   前者是為一個int [20]分配,后者是為一個int [4][5]分配

pmerofc 發(fā)表于 2012-05-12 09:41
回復(fù) 63# 變異老鼠

    但是你引用的這段話是關(guān)于“calloc,malloc, and realloc”三個函數(shù)的,而非僅關(guān)于malloc的
   所以我覺得是否存在這種可能,就是such an object(malloc) or an array of such objects(calloc)

pmerofc 發(fā)表于 2012-05-12 11:43
怎么說呢
sizeof(unsigned char)和sizeof(signed char)也沒有區(qū)別
我嘴有些笨
但我想你能明白我的意思


一起回了……


unsigned char與signed char有區(qū)別, 但sizeof(unsigned char)與sizeof(signed char)兩表達(dá)式的值就沒區(qū)別了。
或者這么說, f(sizeof(unsigned char))對比f(sizeof(signed char), f只能接收到1這個值,但這個值的來源,這個值是如何計(jì)算得到的,它已經(jīng)無從知曉了。

這種抹去類型的技巧在malloc系列,以及許多callback比如qsort里都有使用。
malloc內(nèi)部不知道類型,它只知道大小這一值。只有malloc的調(diào)用者才知道。
qsort將地址傳遞給cmp時也不知道類型 —— 傳遞的是void* —— 同樣只有qsort的調(diào)用者知道,是調(diào)用者傳入的base與cmp。

對malloc來說, malloc( sizeof(int) * 20 ) 與 malloc( sizeof(int[20]) ) 的區(qū)別只有調(diào)用者才知道, malloc不可能知道。
它只負(fù)責(zé)分配出sizeof(int)*20 == sizeof(int[20]) 大小的內(nèi)存。
而這塊內(nèi)存, 無論將它解釋為1個數(shù)組,還是20個int, 都是可以的。

同理,calloc與malloc的真正區(qū)別并不是array與single object,而只在于清0。
作者: 三月廿七    時間: 2012-05-12 15:14
pmerofc 發(fā)表于 2012-05-11 20:47
三月廿七呢?
@三月廿七

寫這種代碼的都是腦殘, 我從來只用數(shù)組索引
作者: 三月廿七    時間: 2012-05-12 15:18
pmerofc 發(fā)表于 2012-05-11 20:47
三月廿七呢?
@三月廿七

這種寫法,正確與否我不關(guān)心,

既然你問了, 我感覺有問題, 又說不出來**問題

作者: OwnWaterloo    時間: 2012-05-12 15:20
本帖最后由 OwnWaterloo 于 2012-05-12 15:22 編輯

回復(fù) 74# pmerofc

假設(shè)SIZEOF(T)是一個T對象需要的空間最少空間,ALIGNOF(T)是對齊需求。
sizeof(T) == ceil( SIZEOF(T), ALIGNOF(T) ) >= SIZEOF(T) 。
C/C++的sizeof(T) 其實(shí)是 STRIDEOF(T) —— 相鄰的兩個T對象之間的最小距離。

所以對齊的賬早就算在每個對象的尾填充里了。對象數(shù)組只要首元素滿足對齊需要,并且所有元素緊密排列就夠了。
所以對齊的賬早就算在每個對象的尾填充里了。對象數(shù)組只要首元素滿足對齊需要,并且所有元素緊密排列就夠了。
對T a[N]; 大小依然是sizeof(a) == sizeof(T)*N; alignof(a) == alignof(T)。

作者: pmerofc    時間: 2012-05-12 15:40
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: 三月廿七    時間: 2012-05-12 15:45
for( i = 0 ; i < 4 ; i++ )
{
     for( j = 0 ; j < 5 ; j ++ )
     {
          scanf("%f", pscore[j]);
     }
}
作者: pmerofc    時間: 2012-05-12 15:46
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: pmerofc    時間: 2012-05-12 15:47
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: 三月廿七    時間: 2012-05-12 15:51
本帖最后由 三月廿七 于 2012-05-12 15:57 編輯

void print2D(float pscore[][5])
{
      for( i = 0 ; i < 4 ; i++ )
      {
           for( j = 0 ; j < 5 ; j ++ )
           {
                 scanf("%f", pscore[j][]);
           }
      }
}

在任何地方, 我都不會用指針去訪問數(shù)組,我只用數(shù)組索引,即使是動態(tài)分配的內(nèi)存也一樣

下面2句不是針對你說的
別人喜歡一維數(shù)組、喜歡指針我不干涉,
別人也別干涉我,不要自討沒趣

作者: pmerofc    時間: 2012-05-12 15:55
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: OwnWaterloo    時間: 2012-05-12 16:14
回復(fù) 84# pmerofc

單看T a[M][N];確實(shí)有這種可能性:
T* p = &a[0][0];
通過 p (類型為T*)的計(jì)算只能保證正確 &a[0][0] 到 &a[0][N] 之間的元素,對超過&a[0][N]的部分(并不一定恰好在&a[0][N],也許在之后的某個點(diǎn))可能會發(fā)生回繞。于是結(jié)果就亂七八糟。
而T* q = &a[1][0]; 通過q,才能保證正確訪問 &a[1][0] 到 &a[1][N]之間的元素。


但結(jié)合malloc(還有union等東西),如果編譯器敢這么設(shè)計(jì)T* p的指針格式,那么:
T* p = (T*)malloc(M * N * sizeof(T) ); // 或者按你在56樓的寫法, p = (T*)malloc(sizeof(T[N*M])) 或calloc
p 也無法訪問被分配出來的所有空間。



我不知道怎么準(zhǔn)確的描述……總之,可能存在單個object大小(也許是一個數(shù)組object)遠(yuǎn)小于地址空間的情況。
也存在字長不能尋址整個地址空間,于是編譯器只能用兩個機(jī)器字來拼出一個指針。
在這種情況下,對指針運(yùn)算,編譯器為了效率,只改這兩個機(jī)器字中的一個而忽略另一個也是合乎C規(guī)范的。這種實(shí)現(xiàn)的可能性也是存在的。

但這單個object,可以被解釋為任意類型(包括某種結(jié)構(gòu)體,包括解釋為一維/多維數(shù)組對象)。
編譯器為了效率,在節(jié)省了一個機(jī)器字改動的情況下,應(yīng)該會盡量寬松,盡量讓另一個能尋址這單個object的任意位置。
而不會更嚴(yán)格不會為了檢查出更多不合乎C規(guī)范的錯誤,做出更多限制。

作者: OwnWaterloo    時間: 2012-05-12 16:23
三月廿七 發(fā)表于 2012-05-12 15:51
void print2D(float pscore[][5])
{
      for( i = 0 ; i < 4 ; i++ )
      {
           for( j = 0 ; j < 5 ; j ++ )
           {
                 scanf("%f", pscore[j][]);
           }
      }
}

在任何地方, 我都不會用指針去訪問數(shù)組,我只用數(shù)組索引,即使是動態(tài)分配的內(nèi)存也一樣

下面2句不是針對你說的
別人喜歡一維數(shù)組、喜歡指針我不干涉,
別人也別干涉我,不要自討沒趣


我不知道你是不是針對我?
但論壇不是你開的,是不是干涉,是不是自討沒趣不是由你說了算。

你自己上一段代碼,還假惺惺的寫個標(biāo)題大家評評,被噴了究竟是誰自討沒趣?
既然你又上代碼了,我又可以發(fā)問了: 你這print2D函數(shù)就只處理 float a[?][5]嗎? float a[?][13]呢?

我可沒干涉你。
我只是在這樓里指出這函數(shù)不通用,在那樓里指出混用char*/string混用A/T版本函數(shù)很喜感。
而你要不要這么寫根本不關(guān)我的事。而且我還希望你繼續(xù)這么寫,否則以后沒樂子了
作者: 三月廿七    時間: 2012-05-12 17:36
OwnWaterloo 發(fā)表于 2012-05-12 16:23
我不知道你是不是針對我?
但論壇不是你開的,是不是干涉,是不是自討沒趣不是由你說了算。

// 你這print2D函數(shù)就只處理 float a[?][5]嗎? float a[?][13]呢?
這個我真想請教一下, float a[?][13] 你怎么辦

其實(shí),我想針對狗氣球,
以及我先前用2維數(shù)組解析 Excel的時候,某個指手畫腳的2B,

還有,我也感覺你挺樂的,
還有,你怎么樂也不能讓我的產(chǎn)品異常中斷
作者: 三月廿七    時間: 2012-05-12 17:50
c 語言在這一點(diǎn)上是有缺陷的, 我到現(xiàn)在也不知道怎么寫個通用的,
希望, 不吝賜教
作者: 三月廿七    時間: 2012-05-12 18:12
本帖最后由 三月廿七 于 2012-05-12 18:59 編輯

你不是說不通用嗎?
我請教你, 怎么到現(xiàn)在還沒有回復(fù)? 是不屑回復(fù)嗎?
怎么感覺像蔫了似的

我剛才試驗(yàn)了一下, 用一維數(shù)組在這個地方確實(shí)有優(yōu)勢,
我錯...

但是這種做法很蹩腳,不自然,就像 C89 必須要在行首聲明變量一樣
希望c12 能夠有所改觀

還有一種更自然的方式, 就是在堆中分配2維數(shù)組內(nèi)存...
作者: walleeee    時間: 2012-05-12 20:02
回復(fù) 70# pmerofc


C這種低級語言,數(shù)組就是一個連續(xù)地址空間,所以我所平坦,下標(biāo)千遍萬遍,都是一個地址計(jì)算

你1唯2唯還是幾唯,不過是個空間量。
作者: walleeee    時間: 2012-05-12 20:03
回復(fù) 78# OwnWaterloo


盡說白話,有意思么?
作者: walleeee    時間: 2012-05-12 20:06
回復(fù) 79# 三月廿七


智慧

只是你也不該說別人腦殘,比如以前就有

p[x]
*(p+x)

這2個性能的比較,第二個要稍微快一些,這個在深入理解計(jì)算機(jī)系統(tǒng)里面有提到,但是對于現(xiàn)在的編譯器優(yōu)化和體系結(jié)構(gòu)而言,這已經(jīng)過時了。

作者: OwnWaterloo    時間: 2012-05-12 21:04
三月廿七 發(fā)表于 2012-05-12 18:12
你不是說不通用嗎?
我請教你, 怎么到現(xiàn)在還沒有回復(fù)? 是不屑回復(fù)嗎?
怎么感覺像蔫了似的

我剛才試驗(yàn)了一下, 用一維數(shù)組在這個地方確實(shí)有優(yōu)勢,
我錯...

但是這種做法很蹩腳,不自然,就像 C89 必須要在行首聲明變量一樣
希望c12 能夠有所改觀

還有一種更自然的方式, 就是在堆中分配2維數(shù)組內(nèi)存...


我應(yīng)該成天泡在CU上,等待你的疑問并回復(fù)?

至于怎么才能通用,貌似你也知道了,直接用一維,手工計(jì)算下標(biāo)。
無論是用一維還是用多維,處理多維都不好用。相比下,我更習(xí)慣用一維。

作者: OwnWaterloo    時間: 2012-05-12 21:05
回復(fù) 94# walleeee

這是回復(fù)你的嗎?你認(rèn)為是白話,大可不看。

作者: walleeee    時間: 2012-05-12 21:08
回復(fù) 97# OwnWaterloo


我不看怎么鑒定你是不是又在放屁?
作者: OwnWaterloo    時間: 2012-05-12 21:08
回復(fù) 95# walleeee

p[x]與*(p+x)?還性能比較? 它們是等價的,知道嗎?
少年, 將p[x] vs *(p+x) 與 ++i,p[ i ] vs ++p,*p 記混了。

作者: OwnWaterloo    時間: 2012-05-12 21:09
walleeee 發(fā)表于 2012-05-12 21:08
回復(fù) 97# OwnWaterloo

我不看怎么鑒定你是不是又在放屁?


口無遮攔,又想被關(guān)?





歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2