找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
感激所有對伊莉作出奉獻的人尊貴會員無限觀看附件圖片伊莉需要你的贊助和支持
julia三上悠亞fc2ntr母乳mg鬼滅之刃
nafi 004賢者之孫1646723mixcraftvocalistntr誘姦純情

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

[繁]關於我轉生變成史

[繁]魔法科高中的劣等

✡ 斗破苍穹 年番/鬥

[繁]THE NEW GATE 06-

[繁]轉生貴族憑鑑定技

華為手機 AI讓女生一
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 1898|回復: 11
打印上一主題下一主題

[問題]關於qsort的compare函數小問題[複製鏈接]

st474ddr 該用戶已被刪除
跳轉到指定樓層
樓主
發表於 2016-3-27 10:55 PM|只看該作者|倒序瀏覽
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php
本帖最後由 st474ddr 於 2016-3-27 10:56 PM 編輯

小弟資質愚鈍,腦筋很不靈光
想知道用qsort時
int compare(const void *a, const void *b)
{
    return (*(int*)a) - (*(int*)b);
}
...
瀏覽完整內容,請先 註冊登入會員
分享分享0收藏收藏0支持支持0

使用道具檢舉

  尊貴會員

Melty Snow  雪靈

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
3224
積分
24366 點
潛水值
77410 米
頭香
發表於 2016-3-28 12:15 AM|只看該作者
這兩個餵給內建的 qsort,應該沒有差別吧?
有沒有完整的程式碼?

點評

chevylin0802 一想到至少都是用2的31次方的龐大數據, 就不認為是學生作業會遇上的問題了  發表於 2016-3-29 01:47 PM
chevylin0802 一般學生的作業整數值除非是計算出來的結果, 否則哪可能會給它設定那麼大的數值  發表於 2016-3-29 01:46 PM
chevylin0802 那是部份編譯器會產生的bug, 原本我也是沒去注意到, 曾經一度以為const與non-const應該沒差, 我倒不會去認為有溢位的問題是因為integer要讓它溢位的減法數值的絕對值要很大   發表於 2016-3-29 01:43 PM
snowflying 可是 non-const 指標傳入時會被自動轉成 const ,而且那兩個函式原型也都相同,亦都是讀取並依照大於小於等於 回傳 負值正值零值,應當是無差別才對  發表於 2016-3-29 12:25 PM
chevylin0802 有可能是編譯器的編譯問題, const這個關鍵字, 在函式裏被定義, 但傳入的時候並非const  發表於 2016-3-28 07:08 AM

使用道具檢舉

inunu 該用戶已被刪除
3
發表於 2016-3-29 06:02 AM|只看該作者
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。
除了傳回值範圍之外沒有差別, 對 qsort 而言使用效果相同
建議你把能產生錯誤結果的程式碼貼上來
(通常能隔離出來的話你也抓得到問題所在了)

使用道具檢舉

帖子
100
積分
93 點
潛水值
9200 米
4
發表於 2016-3-29 12:41 PM|只看該作者
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。
差別在
  1.      return (*(int*)a) - (*(int*)b);
複製代碼
可能會溢位
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com

使用道具檢舉

inunu 該用戶已被刪除
5
發表於 2016-3-30 06:36 AM|只看該作者
gitlab 大說的沒錯
對一個比對函數而言
這的確是會影響執行結果的最大差異




使用道具檢舉

Rank: 4Rank: 4Rank: 4Rank: 4

帖子
7565
積分
4321 點
潛水值
34960 米
6
發表於 2016-3-30 09:24 AM|只看該作者
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。
本帖最後由 chevylin0802 於 2016-3-30 09:30 AM 編輯
inunu 發表於 2016-3-30 06:36 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

gitlab 大說的沒錯
對一個比對函數而言
這的確是會影響執行結果的最大差異 ...
...
瀏覽完整內容,請先 註冊登入會員
系統已重置禁訪用戶到普通用戶和密碼一次
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

帖子
100
積分
93 點
潛水值
9200 米
7
發表於 2016-3-30 02:31 PM|只看該作者
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。
本帖最後由 gitlab 於 2016-3-30 03:02 PM 編輯

照標準 const void* 轉成 int* 是 undefined behavior

應該寫成
const int b = *(const int*) a

"實務上" int* 去掉 const 會有問題的"機率" ....幾乎是0
而且這也不是兩個函式的差別

碼農不要以管窺天,在任何情況下溢位都是嚴重錯誤,
況且32-bit int 要溢位滿容易的啊,隨便想想就一堆例子
- 學校作業、OJ、競賽一定會有的corner case
- 遊戲的經驗值、金幣、存款
- 不小心把 unsigned 當 signed 使用的時候,例如 timestamp 、ip、buffer 長度
- 矩陣乘法或指數運算
更別說其實 int 可能只有 16-bit 了

話說回來, compare function 這個寫法

  1. int cmp( const void *lhs, const void *rhs){
  2.   const int left   = *(const int*) lhs;
  3.   const int right = *(const int*) rhs;
  4.   return left - right;
  5. }
複製代碼
非常簡單漂亮,可以說是人人皆知的idiom,
但因為他有溢位風險,其實是不安全的炫技寫法,知道即可,不太建議使用。

要嘛老老實實的寫
  1. if( left < right ) return -1;
  2. if( left > right ) return 1;
  3. return 0;
複製代碼
或是更簡潔地:
  1. return (left>right) - (left<right);
複製代碼
...
瀏覽完整內容,請先 註冊登入會員
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com

使用道具檢舉

inunu 該用戶已被刪除
8
發表於 2016-3-31 04:42 AM|只看該作者
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。
我是覺得一般數值運算不包含 CF OF (借位溢位) 等 flags 的變化可能是教學重點
if() 最後會編譯成 jl je jg 這些指令, 在條件判斷時會帶入 flags, 產生正確的結果
平時使用任何運算都要處理溢位借位的確不太實際
只是這習題本身很可能是已經針對這問題所設計的
因此再去討論發生機率似乎有些離題
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。

使用道具檢舉

Rank: 4Rank: 4Rank: 4Rank: 4

帖子
7565
積分
4321 點
潛水值
34960 米
9
發表於 2016-3-31 09:47 AM|只看該作者
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。
gitlab 發表於 2016-3-30 02:31 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

照標準 const void* 轉成 int* 是 undefined behavior

應該寫成

如果你講的是DOS時代的C編譯器
確實還是有16位元整數
...
瀏覽完整內容,請先 註冊登入會員
系統已重置禁訪用戶到普通用戶和密碼一次
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。

使用道具檢舉

Rank: 4Rank: 4Rank: 4Rank: 4

帖子
7565
積分
4321 點
潛水值
34960 米
10
發表於 2016-3-31 09:52 AM|只看該作者
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。
inunu 發表於 2016-3-31 04:42 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

我是覺得一般數值運算不包含 CF OF (借位溢位) 等 flags 的變化可能是教學重點
if() 最後會編譯成 jl je jg ...

致使程式發生錯誤
...
瀏覽完整內容,請先 註冊登入會員





系統已重置禁訪用戶到普通用戶和密碼一次
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。

使用道具檢舉

帖子
100
積分
93 點
潛水值
9200 米
11
發表於 2016-3-31 02:10 PM|只看該作者
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。
本帖最後由 gitlab 於 2016-3-31 02:11 PM 編輯
chevylin0802 發表於 2016-3-31 09:47 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

如果你講的是DOS時代的C編譯器
確實還是有16位元整數
不過現在還剩下誰在用
...
瀏覽完整內容,請先 註冊登入會員
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。

使用道具檢舉

inunu 該用戶已被刪除
12
發表於 2016-4-1 03:53 AM|只看該作者
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。
本帖最後由 inunu 於 2016-4-1 03:53 AM 編輯
萬一他每一個傳入的數值本身都是錯的數值的時候呢?
還需要去管它溢位還是不溢位嗎?

這篇討論串一開始就明白指出在比較兩個 compare 函數的差異
Input validation 在實作上很重要沒錯, 但明顯離題, 恕不繼續討論
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部