質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

2回答

4198閲覧

自分の環境では動くコードがatcoderでコンパイルエラーになってしまいます。

Missingnoleader

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2021/04/24 05:20

編集2021/04/24 10:48

自分の使っているコンパイラーはgcc9.2です。

AtCoderの問題

https://atcoder.jp/contests/past201912-open/tasks/past201912_d
「長さ Nの整数列がサーバーに保管されている。つい先ほどまで、この列には 1から Nまでの整数が1個ずつ含まれていた。しかし、たった今発生したトラブルにより、列のいずれか 1個の要素が別の 1以上 N以下の整数に書き換えられた可能性がある。あるいは、何の書き換えも発生しなかったかもしれない。

トラブル発生後の整数列 A[1],…,A[N] が与えられる。これを読み込み、書き換えが発生していたかを判定し、発生していた場合にはどの整数がどの整数に書き換えられたかを報告するプログラムを作成せよ。」(詳しくはリンクから参照していただけると幸いです。)

この問題のコードを書いて、自分の環境ではうまく動いているのですが、提出するとコンパイルエラーが出てきてしまいます。

それがこれです。

<追記>(これはAtCoderの提出結果欄のコンパイルエラーコードであって、これ以上のエラーコードはないはずです。(<追記>これが警告文であり、エラーコードではないという事を初めて知りました。故に誤解を招いてしまい大変申し訳ありませんでした。))

./Main.c: In function ‘main’: ./Main.c:5:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] 5 | scanf("%d",&N); | ^ ./Main.c:10:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] 10 | scanf("%d",&tmp); | ^~

ソースコードはこちらです。

C

1#include<stdio.h> 2#include<string.h> 3int main(){ 4 int N; 5 scanf("%d",&N); 6 //int Ans[N],A,B;<---ここが問題の箇所でした。 7 int Ans[N],A=0,B=0; 8 memset(Ans,0,sizeof(Ans)); 9 for(int i=0;i<N;i++){ 10 int tmp; 11 scanf("%d",&tmp); 12 Ans[tmp-1]++; 13 tmp=0; 14 } 15 for(int i=0;i<N;i++){ 16 if(Ans[i]==2){A=i+1;} 17 if(Ans[i]==0){B=i+1;}} 18 if(A==0){printf("Correct\n");return 0;}else{printf("%d %d\n",A,B);} 19 20 return 0; 21}

なにがいけなかったのでしょうか。それともこれはgccのバージョンの違いによるものなのでしょうか。(AtCoderはGCC9.2.1)
<追記>
私はまだC言語を勉強し始めただけの初心者なので、できる限りのことはしたつもりなのです。例えば、scanf()が0を返してきた場合には終了させるように書き換えてみたり、GCCのバージョンの問題かと思いバージョン7.5.0でも試してみましたが問題なし(つまり、AtCoderでの提出の際にのみエラーが出てしまう)、という感じで試行錯誤しましたが、私が持っている、もしくは調べてわかる情報では解決できなかったので、こちらで質問させていただきました。頂いたご指摘はできる範囲内で極力対処していきたい所存ではありますが、何分知識がないものですから、お手柔らかにお願い致します。
<追記>
指摘していだたいた、問題のサンプルインプット2を試したところ、上手く動作しなかったので、問題点を探しました。
結局、A,Bの値を初期化していなかったことが原因でした。しかし、A,Bの値を初期化せずともサンプルインプット1のケースは上手く動作した点については未だに理解はできていません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/04/24 05:33

エラー文を追記していただけませんか。
hoshi-takanori

2021/04/24 07:05 編集

警告が出るのは、OS によって標準ヘッダーが違ってて、Linux (glibc) では scanf に __wur というのが付いていて、これが __attribute__ ((__warn_unused_result__)) に展開されるからで、gcc -O2 だと警告が出ますね。macOS (brew で入れた gcc) のヘッダーにはそんなものは付いてないために、警告も出ませんでした。 とはいえ、あくまで警告なので、プログラムは実行されて、テストに通ってないのでは。問題ページの Sample Input 2 は試しましたか?
Missingnoleader

2021/04/24 10:18 編集

エラー文はこちらが全てのはずです。
Missingnoleader

2021/04/24 10:49 編集

to hoshi-takanori 申し訳ございません。そちら確認不足だったようです。改めて報告させていただきます。
Missingnoleader

2021/04/24 10:49

to cateye 削除依頼のご指摘有り難うございました。
guest

回答2

0

それはwarningであってコンパイルエラーではありません。

あなたの環境でも、-O2をつけてコンパイルすれば、同じwarningが出るのではないでしょうか。

なお、AtCoderにおけるコンパイルオプションは、こちらを参照してください。
Language Test 202001

投稿2021/04/24 06:12

actorbug

総合スコア2224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Missingnoleader

2021/04/25 14:48

申し訳ありませんでした。まだまだ未熟者でその違いを知りませんでした。以後はその点に注意していきたいと思います。 確認いたしましたところ、確かに同じ警告文が出ました。ご指摘有難うございます。 コンパイルオプションの参照元を教えていただき誠に有難うございます。是非参考にさせていただきます。
guest

0

ベストアンサー

自分の環境ですべてのテストケースでためしましたか?
おそらくこのままだとCorrectの場合、Aの値が定義されていないので、最後のif文が使えません。
この場合だったら、A=-1として宣言し、if(A==-1) printf("Correct\n");とすれば通ると思います。
変数には常に初期値を代入しておきましょう。

ちなみにAtcoderのジャッジで、答えが間違っているときにCEを吐くのはよくあることで、単純な文法ミスでなかったら、答えが間違っていることが多いです。

追記:以下のコードで通りましたよ

C++

1#include<stdio.h> 2#include<string.h> 3int main(){ 4 int N; 5 scanf("%d",&N); 6 int Ans[N],A=-1,B=-1; 7 memset(Ans,0,sizeof(Ans)); 8 for(int i=0;i<N;i++){ 9 int tmp; 10 scanf("%d",&tmp); 11 Ans[tmp-1]++; 12 tmp=0; 13 } 14 for(int i=0;i<N;i++){ 15 if(Ans[i]==2){A=i+1;} 16 if(Ans[i]==0){B=i+1;}} 17 if(A==-1){printf("Correct\n");return 0;}else{printf("%d %d\n",A,B);} 18 19 return 0; 20}

投稿2021/04/24 06:04

編集2021/04/24 08:24
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Missingnoleader

2021/04/25 14:45

ご指摘有り難うございます。 確かに私のソースコードでは変数を初期化していませんでした。実際にその点を改善した場合には、警告文は出るものの、しっかりと通りました。ご丁寧にソースコードの提示もしていただき有難うございました。 直接的なご指摘をしていただきましたのでベストアンサーに選ばさせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問