5

私がこれを試すたびに:

long crypt(int *integer)
{
    printf("Enter five digit integer:\n");  
    scanf("%i",integer);
    
    int digit1=integer/10000;
    int digit2=(integer%10000)/1000;
    int digit3=(integer%1000)/100;
    int digit4=(integer%100)/10;
    int digit5=(integer%10)/1;

    const char *digit1c[10];
    const char *digit2c[10];
    const char *digit3c[10];
    const char *digit4c[10];
    const char *digit5c[10];

    /...
}

(まだまだありますが、これが問題のようです。残りはリクエストに応じて追加します。)

次に、このエラーを返します。

math2.h:44:20: error: invalid operands to binary / (have ‘int *’ and ‘int’)
math2.h:45:21: error: invalid operands to binary % (have ‘int *’ and ‘int’)
math2.h:46:21: error: invalid operands to binary % (have ‘int *’ and ‘int’)
math2.h:47:21: error: invalid operands to binary % (have ‘int *’ and ‘int’)
math2.h:48:21: error: invalid operands to binary % (have ‘int *’ and ‘int’)

数字を初期化するために使用した演算子と関係があることはわかっています。その型をに変更しようとしましたint *が、うまくいきませんでした。では、ここで正確に何が起こっているのでしょうか。

4

3 に答える 3

14

integerは( )へのポインタであるため、それが指すintを使用する場合は、それを逆参照する必要があります。intint*

int digit1=(*integer)/10000; // and so on...
于 2011-12-10T23:59:49.490 に答える
4

パラメータintegerintオブジェクトではありません。それはint*オブジェクト、つまりポインタです。(integerこれは、ポインタオブジェクトの誤解を招く名前です。)

変更した場合:

int digit1=integer/10000;

int digit1 = *integer / 10000;

コードの残りの部分に対応する変更を加えると、少なくともコンパイルされます。 integerポインタです。*integerそれがint指すオブジェクトです。

(また、二項演算子の前後にスペースを入れると、コードが読みやすくなります。空白を使用するもう1つの理由は、除算が逆になっている場合、次のようになることです。

int digit1=10000/*integer;

/* ... */コメントを紹介します。)

于 2011-12-11T00:00:05.370 に答える
4

ここでの問題は、の型がinteger、とint *の演算子をサポートしないポインタであるということです。あなたの問題には2つの解決策があります。/%

  1. 逆参照、それを算術的に実行するたびに演算子integerを使用します。 例えば*
    int digit1=(*integer)/10000;

  2. integerタイプに変更しintます。関数のシグネチャを変更する必要があり、&演算子を使用するにはscanfを変更する必要があります。scanf("%i",&integer);

于 2011-12-11T00:02:09.857 に答える