-3

C言語は初めてです。ポインターを使用してコード (インデックスを使用) を作成する方法を知りたいです。私が正しく理解していれば、変更は「if」と配列を決定するときにのみ必要です。私は正しいですか?

int poz_ind(int masivs[row][col], int r, int c,int rinda)
{
    rinda=-1;
    int i,j;


    for(i=0; i<r; i++)
    {
        fail=0;

        for(j=0; j<c; j++)
        {
            if(masivs[i][j]<=0)
            {
                fail=1;
                break;
            }
        }

        if(fail==0)
        {
            rinda=(i);
            break;
        }
    }

    if (rinda>-1)
    {
        rinda++;
    }
    else
    {
        rinda=0 ;
    }

    printf("Pirma rinda ar tikai pozitiviem elementiem ir rinda Nr:  %d\n",rinda);
}
4

2 に答える 2

1

すべてを書き直すつもりはありませんが、ポインターに変換する理由は、オプティマイザーがそれを行っていないときの速度です。最も単純なアプローチは、行列の行構造に従います。「ポインタ化」する意味があるのは内側のループだけですが、2D の例が誰かの役に立つ場合に備えて、両方を行います。

int[col] *prow, *plastrow; /* current row and (last+1) row pointers */
int rinda = -1;            /* row number with first negative entry */

for (prow=masivs, plastrow=prow+r; prow<plastrow; ++prow)
{
    int *pval, *plast;
    int fail = 0;
    for (pval = *prow, plast=pval+c; pval<plast; ++pval)
    {
        fail = (*prow < 0);
        if (fail) break;
    }
    if (!fail)
    {
        rinda = prow - masivs;
        break;
    }
}

これで、必要な結果が得られました。rindaすべての行に負のエントリがある場合は -1、または負のエントリが見つからない最初の行のインデックスです。あとで追加しますが、お任せします。

単純ではない方法では、配列を単一の int[row*col] 配列として扱いますが、r==row と c==col を使用するのが本当に良いだけなので、考え直しません。

注意が必要な別の問題があります。引数変数rindaをローカル変数として使用しており、その値を呼び出し元に返すことを意図しているようです。C は非配列データを値で渡すため、この名前rindaは、関数が戻るとすぐに破棄される呼び出し元の引数値のコピーを参照します。引数を使用して結果を返すには、より通常のポインターの使用が必要です。試す:

int poz_ind(int masivs[row][col], int r, int c,int *prinda)
{
     int  rinda = -1; /* as in the above snippet */

...最後に、rinda の最終的な正しい値を計算すると、次のようになります。

    *prinda = rinda;

poz_ind(masivs, r, c, &rinda)呼び出しは、 という名前の呼び出し元の変数に格納されている値を取得するために呼び出す必要がありますrindarinda何も返していないように見えるので、引数を完全に削除して、見つかった値を関数の結果として返す方が簡単です。

この最後のビットが本当にポインターに変換しようとしていたものである場合、長い応答をお詫びします。

于 2013-10-03T00:00:47.990 に答える
1

a[b]と同じです*(a + b)。C11、6.5.2.1 Array subscripting、段落 2 から:

添え字演算子の定義[]E1[E2](*((E1)+(E2)))

したがって、あなたの場合、masivs[i][j]は と同等*(*(masivs + i) + j)です。

しかし、なぜあなたが後者を選ぶのか、私の人生では想像できません.

于 2013-10-02T22:46:41.240 に答える