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

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

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

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

Q&A

解決済

3回答

2685閲覧

配列の重複を削除する方法

Merrifield

総合スコア31

C

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

0グッド

1クリップ

投稿2020/09/11 02:27

下の例のよう整数のリストが与えられ、重複を一番左の要素から消して、それをreturnする関数を作成しようと思っています。(codewarsのこの問題ですhttps://www.codewars.com/kata/5ba38ba180824a86850000f7/train/c)

solve [3, 4, 4, 3, 6, 3]-- => [4, 6, 3] -- Remove the 3's at indices 0 and 3 -- followed by removing a 4 at index 1 [1, 2, 1, 2, 1, 2, 3] → [1, 2, 3] [1, 1, 4, 5, 1, 2, 1] → [4, 5, 2, 1]

コード

c

1#include <stdlib.h> 2#include <stddef.h> 3 4int* solve(const int* arrin, size_t szin, size_t *szout) { 5 6 size_t i, j, size = 0; 7 int* arrout = (int*) malloc(sizeof(int) * szin); 8 arrout[0] = arrin[szin - 1]; //一番最後の数字は残ることが確定しているから とりあえず先頭から詰めていく 9 10 for(i = szin - 2; i >= 0; i--)//最後から2番目の数字から 11 { 12 int count = 0; 13 for(j = i + 1; j < szin; j--) 14 { 15 if(arrin[i] == arrin[j])count++; //重複があるかどうか 16 } 17 18 if(count != 0)//重複がなければ順に詰めていく 19 { 20 size++; 21 arrout[size] = arrin[i]; 22 } 23 24 25 26 } 27 28 for(i = 0, j = size; i <= size, j >= 0; i++, j--) //反転するため 29 { 30 31 arrout[i] = arrout[j]; 32 33 } 34 *szout = (size + 1); 35 return arrout; 36} 37 38// NB: assign the length of your return array to the provided *szout

エラー

fixture.c:49:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:49:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ fixture.c:59:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:59:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ fixture.c:70:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:70:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ fixture.c:80:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:80:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ 8 warnings generated. Execution Timed Out (12000 ms)

エラーコードの意味が分からないので、教えていただけないでしょうか?また、タイムアウトになるのですが、どの部分が問題でしょうか?
テストコードは文字数の関係で、ここに貼れなかったのですが、URL先にあります。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/09/11 05:44

> また、タイムアウトになるのですが、どの部分が問題でしょうか? codewars使うって事は学習目的だと思うんですけど、それを自分で調べたり検証しないと勉強にならないのではないですか? 期待通り処理が流れているかprintfで変数値を出力したり、clockでどこで時間掛かってるか調べるとよいかと思いますけど。
guest

回答3

0

キャストや余計な malloc なしにできますよ。

C

1#include <stdio.h> 2#include <stdlib.h> // malloc 3 4int *solve(const int *arrin, size_t szin, size_t *szout) 5{ 6 int *arrout = malloc(sizeof(int) * szin); 7 size_t i = szin, size = szin; 8 while (i--) { 9 size_t j = i; 10 while (++j < szin && arrin[j] != arrin[i]) ; 11 if (j == szin) arrout[--size] = arrin[i]; 12 } 13 *szout = szin - size; 14 i = 0; 15 while (size < szin) arrout[i++] = arrout[size++]; 16 return arrout; 17} 18 19int main(void) 20{ 21 int a[6] = { 3, 4, 4, 3, 6, 3 }; 22 size_t n; 23 int *b = solve(a, 6, &n); 24 for (size_t i = 0; i < n; i++) printf(" %d", b[i]); 25 putchar('\n'); 26 free(b); 27}

投稿2020/09/11 07:06

kazuma-s

総合スコア8224

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

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

Merrifield

2020/09/11 07:15

ありがとうございます。参考になります。
guest

0

自己解決

警告文については、Zuishinさんに教えていただいた通りで、タイムアウトについては下記のように直して解決しました。

c

1#include <stdlib.h> 2#include <stddef.h> 3 4int* solve(const int* arrin, size_t szin, size_t *szout) { 5// NB: assign the length of your return array to the provided *szout 6 size_t i, j, size = 0; 7 8 int* arrout = calloc(szin, sizeof(int)); 9 if(arrout == NULL) return NULL; 10 11 arrout[0] = arrin[szin - 1]; //一番最後の数字は残ることが確定しているから とりあえず先頭から詰めていく 12 13 for((int)(i = szin - 2); (int)i >= 0; (int)i--)//最後から2番目の数字から //iがマイナスになるので(int)をつけた 14 { 15 int count = 0; 16 17 for(j = i + 1; j < szin; j++) 18 { 19 if(arrin[i] == arrin[j])count++; //重複があるかどうか 20 } 21 22 if(count == 0)//重複がなければ順に詰めていく 23 { 24 size++; 25 arrout[size] = arrin[i]; 26 } 27 28 29 30 } 31 32 33 int* arrout2 = calloc(size + 1, sizeof(int)); 34 if(arrout2 == NULL) return NULL; 35 36 for( i = 0, j = size; i <= size; i++, j--) arrout2[i] = arrout[j]; //逆に詰めたので反転するため 37 38 free(arrout); 39 40 *szout = (size + 1); 41 return arrout2; 42}

投稿2020/09/11 06:23

Merrifield

総合スコア31

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

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

0

format specifies type 'int' but the argument has type 'size_t' そのままをキーワードにしてググると結構いろいろヒットすると思いますが、そのいくつかを読んでみてもわからない、ということですか?

書式指定子%iが要求する型と、それに与えている引数の方が違う、という「警告」です。
(error/誤りとwarning/警告は原因も対処も違うことが多いので、ちゃんと区別しましょう。)

投稿2020/09/11 02:55

thkana

総合スコア7703

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

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

Merrifield

2020/09/11 03:00

その警告文が分からないというより、警告文がテストコード側から出ているので、自分のコードのどの部分にあたるのかが分かりづらいという感じですね。
Zuishin

2020/09/11 03:02

前に同じようなこと聞きませんでしたっけ? その時は確かテストがそもそも警告の出るようなコードで、不正解の時に表示されるから正解すれば出なくなるようなものだったと思います。
Merrifield

2020/09/11 03:17 編集

>>その時は確かテストがそもそも警告の出るようなコードで、不正解の時に表示されるから正解すれば出なくなるようなものだったと思います テスト部分が警告が出るようになっていた(今は直っている)というのはそうですけど、正解だと出なくなるようなものというのはよくわからないですね。 コードを最初から書き直したので、同じ問題ですけど、違うエラーが出ていると思います。
Zuishin

2020/09/11 03:21 編集

それはそもそもそのサイトの実装次第なので。正解の時に警告を表示しないよう作るのは何も難しくありません。 あと、エラーと警告は違います。今回のは警告です。エラーが出る時と同じには考えられないでしょう。
Merrifield

2020/09/11 03:32

おっしゃっている意味がよくわからないのですが、違う人と勘違いしていませんか?なぜ「不正解の時に表示されるから正解すれば出なくなるようなものだったと思います」という言葉がでてきたのかも分かりませんが、これは違うと思いますよ。そもそもコード事態に問題があるからエラーや警告が出ているわけで、コードが機能するのであれば、不正解であっても実行結果は出るので。
Zuishin

2020/09/11 03:34

その「コード」に、あなたの書いたものとテストコードの二種類あることは気づいていますか?
Zuishin

2020/09/11 03:44

不正解になる次のコードで同じ警告が出ました。 int* solve(const int* arrin, size_t szin, size_t *szout) { int result = 100; *szout = 1; return &result; }
Merrifield

2020/09/11 04:38 編集

前は、テスト側にconstが付いていないみたいな話があったのですが、それとは別にテスト側に問題があるということでしょうか? Zuishinさんの例だと、返り値が配列ではないのが警告の原因になっているのではないでしょうか? ちゃんとした形式で返すと、不正解が出るので。 #include <stdlib.h> #include <stddef.h> int* solve(const int* arrin, size_t szin, size_t *szout) { int* result = malloc(3); *szout = 3; result[0] = 1; result[1] = 2; return result; } だと Expected {4, 6, 3} Submitted {1, 2, 0}
Merrifield

2020/09/11 04:39

結局、自分で書いたコードに問題があることは変わりないですが。
Zuishin

2020/09/11 04:45

その不正解の下をよく見てください。そのコードで試しましたが、同じ警告が出ています。
Merrifield

2020/09/11 04:52

確かに同じ警告が出ますね。
Zuishin

2020/09/11 04:59 編集

つまり、元々警告の出るテストコードを使っていると考えるのが自然ではありませんか? 正解で試してはいませんが、もし正解でこれが出ないのであれば、正解の時だけ表示しないようにしているんではないでしょうか。 そもそもユーザーは与えられた引数の型以外に size_t を使っていません。これを使っているのはテストコードのみです。
Merrifield

2020/09/11 04:58

おっしゃっていることが分かりました。間違えていたらこの警告文が出るようなコードの作りになっているんだろうなと思います。
thkana

2020/09/11 12:36

なんか片付いたみたいですが... https://teratail.com/questions/290039 の例もありますし、つまりそのcodewarsってサイトが信用ならない、というのが結論になったりしませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問