-1

診断テスト スイートの機能を維持および拡張していますが、このコードの断片が何度も表示され、何をするのかわかりません。

int ret = 0, i, *reg;
int size = sizeof(Regs)/sizof(Reg);
for(i = 0; i<size; i++) {
    reg= (uint*)Regs[i].Number;
    *reg=0;
}
return ret;

ここで、i はループ変数であり、reg は 32 ビット int へのポインターです (Number はその 32 ビット int へのアドレスです)。この特定のテストはレジスタをクリアしますが、これは ret を変更するためのものですか?

編集:私の質問は少しあいまいだったと思います。具体的には、フラグメントが何であるか疑問に思っています:

int ret = 0, i, *regs;

有効か、または有効である理由。

4

5 に答える 5

1

int ret = 0, i, *reg;

intは3 つの変数retを定義intiます。のみが初期化されます (に)。int*regret0

その理由は、宣言の文法 (少し単純化されています) が次のとおりであるためです。

declaration: 
    declaration-specifiers init-declarator-list[_opt_]
init-declarator-list:
    init-declarator
    init-declarator-list , init-declarator
init-declarator:
    declarator
    declarator = initializer

ここで、宣言指定子は だけintで、3 つの初期宣言子で構成される初期宣言子リストがあります。そのうちの 1 つには初期化子があり、他の 2 つにはありません。宣言子*regは、「宣言指定子が言うどんな型へのポインタ」を定義します。詳細については、標準の 6.7「宣言」を参照してください (および上記の文法から省略した部分)。

于 2012-07-10T19:08:57.767 に答える
1

はい、私はあなたが正しいと思います。Regs が Reg オブジェクトの配列であると仮定すると、各 Reg.Number が指しているものがゼロになり、0 が返されます。コードベースがステータス コードを返すパラダイムに従っている場合、これは合理的なことのように思えます。ほとんどの場合、成功を意味します。

于 2012-07-10T18:59:49.793 に答える
0

いいえ、ret常にゼロになります。uintこの関数は、配列内の構造体が指すいくつかの をクリアするだけRegsです。

于 2012-07-10T18:57:09.453 に答える
0

私の個人的な見解:

int ret = 0, i, *reg; 
int size = sizeof(Regs)/sizof(Reg); 
for(i = 0; i<size; i++) 
{
     reg= (uint*)Regs[i].Number;
     *reg=0;
} 
return ret; 

int ret = 0, i, *reg;は次と同等です

int ret;
ret = 0; //return value, if nothing changes it while running the sub, the return is (positive) as every C routine should do
int i; // i is what it is, no initialisation is performed
int* reg; //reg is what it is, no initialisation is performed.

この行は、 というバッファとその基本データ フィールド タイプ の間のアトミック ディメンションとしてint size = sizeof(Regs)/sizof(Reg); 定義されます。構造自体を反復処理するために使用されます (注: C では、Regs がバッファー/配列/ストリームである必要はありません。Sizeof に関して、Regs よりも大きいことが必要なだけです。sizeRegsReg

ループは、forReg 内の Number フィールドの位置から始まる各反復で n バイトをゼロにします (32Numberビット = 内のバイト 4 からバイト 7 までの 4 バイト長の整数であると仮定しますReg)。

(uint*) キャストは、より読みやすい (uint*) に関して C では正常です。これは、メモリを扱う場合、単純な (uint) では、アドレス指定可能なヒープ全体にまたがるには十分でない可能性があるためです。(int*) キャストがヒープを反復することはめったにありません。

最後に、何も失敗しなかった後 (この場合、ret が使用されていないため、コードが失敗することはありません) の戻り値は 0 = 正の戻り値です。

for ループで何が行われるかをよりよく説明するために、Regs が 4 つの Reg インスタンスを連続して含む構造体 (ある種の配列) であり、各 Reg が 32 バイト幅であり、2 番目のフィールド (4 から 7 までのバイト) が呼び出されるとします。Number(たとえば、32 ビット整数フィールド)。for ループの実行前と実行後のメモリのバイトごとの視覚化 (使いやすく読みやすいように DECIMAL 形式) は、次のようになります。

before:     111910460 §     721672678 §     1941200806 §    -1183627007 §   1586684153 §    1875498315 §    1260999030 §    1325944862 §    1065932391 §    1844134883 §    1605637187 §    -1318663956 §   233262241 §     1220589880 §    1712611369 §    -2095694326 §   -1982972241 §   1536475566 §    1550414594 §    60661453 §      1920891323 §    1052971320 §    151058183 §     -693448823 §    -763585993 §    -1546059240 §   -638901203 §    1592652624 §    -26126893 §     359938920 §     730403663 §     -2119128428 §   22506289 §      329168535 §     1888110366 §    -1324425487 §   -2128177580 §   -1447190387 §   -2102707104 §   -834692095 §    233601466 §     -2368015 §      -1247566469 §   -496146592 §    1399945760 §    -433672213 §    -1874762262 §   -240141582 §    1361991330 §    -2100310671 §   -1716316415 §   1113810979 §    837914061 §     -2004720198 §   -499664162 §    -581537344 §    -1876582939 §   -855186203 §    -477447744 §    609476093 §     -1551962613 §   1342130125 §    -1245085596 §   70042099 §      853203728 §     -1216264601 §   -821207587 §    -663767272 §    1811963624 §    -1359626002 §   587239161 §     412800157 §     1308828835 §    -484000995 §    1196157114 §    1554729984 §    -588907472 §    -862275327 §    2141670903 §    -496863553 §    -1461319540 §   2011880048 §    724185989 §     -523083707 §    535075127 §     -1252818631 §   -1535682266 §   1731550626 §    -1513281783 §   2056573089 §    542455754 §     -1663652432 §   209157746 §     -917714063 §    -62336558 §     -335893804 §    -455431912 §    -1338920623 §   966843505 §     698158966 §     -1748732016 §   -710422429 §    429351988 §     1404039358 §    1828069719 §    -1849911876 §   -1756314151 §   1046003361 §    -1124626131 §   422202 §        608265685 §     1538084062 §    -1342247255 §   1734342148 §    -2095965518 §   544674987 §     -12582890 §     1365311130 §    1104188373 §    688131395 §     -1615783097 §   755406204 §     -151161805 §    1955152994 §    -427907710 §    700996102 §    
after:  111910460 §     721672678 §     1941200806 §    -1183627007 §   0 §             0 §             0 §             0 §             1065932391 §    1844134883 §    1605637187 §    -1318663956 §   233262241 §     1220589880 §    1712611369 §    -2095694326 §   -1982972241 §   1536475566 §    1550414594 §    60661453 §      1920891323 §    1052971320 §    151058183 §     -693448823 §    -763585993 §    -1546059240 §   -638901203 §    1592652624 §    -26126893 §     359938920 §     730403663 §     -2119128428 §   22506289 §      329168535 §     1888110366 §    -1324425487 §   0 §             0 §             0 §             0 §             233601466 §     -2368015 §      -1247566469 §   -496146592 §    1399945760 §    -433672213 §    -1874762262 §   -240141582 §    1361991330 §    -2100310671 §   -1716316415 §   1113810979 §    837914061 §     -2004720198 §   -499664162 §    -581537344 §    -1876582939 §   -855186203 §    -477447744 §    609476093 §     -1551962613 §   1342130125 §    -1245085596 §   70042099 §      853203728 §     -1216264601 §   -821207587 §    -663767272 §    0 §             0 §             0 §             0 §             1308828835 §    -484000995 §    1196157114 §    1554729984 §    -588907472 §    -862275327 §    2141670903 §    -496863553 §    -1461319540 §   2011880048 §    724185989 §     -523083707 §    535075127 §     -1252818631 §   -1535682266 §   1731550626 §    -1513281783 §   2056573089 §    542455754 §     -1663652432 §   209157746 §     -917714063 §    -62336558 §     -335893804 §    -455431912 §    -1338920623 §   966843505 §     698158966 §     0 §             0 §             0 §             0 §             1828069719 §    -1849911876 §   -1756314151 §   1046003361 §    -1124626131 §   422202 §        608265685 §     1538084062 §    -1342247255 §   1734342148 §    -2095965518 §   544674987 §     -12582890 §     1365311130 §    1104188373 §    688131395 §     -1615783097 §   755406204 §     -151161805 §    1955152994 §    -427907710 §    700996102 §    
于 2012-07-10T20:10:49.633 に答える
0

常に 0 を返すように見えます。関連するコードの一部しか表示されていない場合を除きます。

于 2012-07-10T19:00:01.353 に答える