5

関数プロトタイプについてはよく知っていますが、このエラーは関数宣言エラーのようです。つまり、なぜこの警告が表示され、エラーが発生するのか、本当に困惑しています。

gcc が私の関数プロトタイプを完全に無視しているようなものです。これはコンパイラのバグですか?

簡潔にするために、この関数を別のヘッダー ファイルで宣言しませんでしたが、違いはありません。

gcc 出力:

$ gcc -Wall -std=c99 -pedantic primefactors.c
primefactors.c: In function ‘main’:
primefactors.c:8:5: warning: implicit declaration of function ‘largestprime’ [-Wimplicit-function-declaration]
primefactors.c: At top level:
primefactors.c:12:6: error: conflicting types for ‘largestprime’
primefactors.c:8:20: note: previous implicit declaration of ‘largestprime’ was here

コード:

#include <stdio.h>
#include <math.h>

long largetsprime(long);

int main()
{
    printf("%d\n", largestprime(600851475143));
    return 0;
}

long largestprime(long num)
{
    int highest;
    int mid = sqrt(num);
    for (int i = 2; i < mid; i++) {
        if (mid % i == 0) {
            if (i % 1 == 0 && i % i == 0)
                highest = i;
        }
    }
    return highest;
}
4

4 に答える 4

12

Point-1関数名
にスペルミスがありますlargest

long largetsprime(long)
           ^
           s is wrong here 

宣言では

long largestprime(long)
          ^ before t

Point-2 のライブラリ関数
を使用している場合、次のようにプログラムをコンパイルする必要があります。sqrt()math.h-lm

gcc -Wall -std=c99 -pedantic primefactors.c -lm

Point-3
関数の 戻りint値の型が であるのに戻りますlong

Point-4 もう一つ間違いのサフィックスを追加するのprintf()を忘れていましたlong int

largestprime(600851475143)

次のようにする必要があります。

largestprime(600851475143L)
      //                 ^ added  suffix  L for long 

接尾辞がわからない場合は、以下をおL読みください:整数リテラルの末尾にある「L」は何を意味しますか?

@ Eric Postpischilに感謝:

point-5: 関数printf()内は整数型を出力していますが、フォーマット指定子を使用して出力しています: main()long%d

printf("%d\n", largestprime(600851475143));
                 ^
                 | 
                 returns long

代わりに使用%ldします。

ポイント-6:

if= (すべての数は で割り切れる) であるため、最大の素数関数の条件 はそれぞれ常に真です (ただし、がゼロi % 1 == 0 and i % i == 0の場合は未定義です)。ii % 101

于 2013-07-24T16:48:21.400 に答える
2

打ち間違え。宣言は言うlargeTSprime。それを正しいものに変更すると、機能しlargestprimeます。

プロのヒント #1:読みやすくするためにcamelCapsOnWordBoundariesorを使用under_scoresします。

プロのヒント #2:コンパイラのバグではありません。

于 2013-07-24T16:49:05.183 に答える
1

プロトタイプにタイプミスがあります。largestprimeの代わりにする必要がありlargetsprimeます。

于 2013-07-24T16:48:02.277 に答える
1

プロトタイプにタイプミスがあります:

largetsprime != largestprime
于 2013-07-24T16:48:03.137 に答える