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

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

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

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

4回答

31009閲覧

エラーメッセージの意味が分からない

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2016/07/14 16:00

###発生している問題・エラーメッセージ
文字列配列を辞書順にソートしてから表示するプログラムです。エラーメッセージは恐らく、無効な引数(型がint) のような内容が書いてあると思うのですが、何故intが出てくるのかが特に分かりません。

invalid type argument of unary ‘*’ (have ‘int’)

###該当のソースコード

C

1#include<stdio.h> 2 3void dictsort(char **,int); 4int strcmp(char *,char *); 5 6int main(void){ 7 int i; 8 char *colors[]={"white","black","red","pink","orange","blue","yellow","green","purple","gray","brown","gold","silver"}; 9 10 dictsort(*colors[13][10],13); //ここでエラーメッセージ 11 for(i=0;i<13;i++){ 12 printf("%s,",colors[i]); 13 } 14 printf("\n"); 15 return 0; 16} 17 18 19void dictsort(char **ptr,int y){ 20 21 int i=0,count=0,hako; 22 23 while(count < y){ 24 while(i < y){ 25 if(strcmp(*(ptr+i),*(ptr+i+1)) == 1){ 26 **ptr=hako; 27 **(ptr+1)=**ptr; 28 hako=**(ptr+1); 29 } 30 i++; 31 } 32 } 33} 34int strcmp(char *str1,char *str2){ 35 int result; 36 37 for(; *str1 == *str2; str1++,str2++){ 38 if(*str1 == '\0')return 0; 39 } 40 if(*str1-*str2 < 0){result=-1;} 41 if(*str1-*str2 == 0){result=0;} 42 if(*str1-*str2 > 0){result=1;} 43 44 return result; 45 } 46 47

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

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

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

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

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

guest

回答4

0

invalid type argument of unary ‘*’

は、直訳すると「単一''の無効な引数」となり、
意訳すると「'
'を単一では用いることはできない」となります。
'*'は、文字リテラル以外は、掛け算としての演算子もしくはポインター演算子のどちらかしか無いので

C

1*colors[13][10]

はどちらでもない単一の使い方と解釈されてエラーになっています。

投稿2016/07/15 15:53

PineMatsu

総合スコア3579

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

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

0

char *colors[]={"white","black","red",... };

であるから、
colors[i] の型は char*
colors[i][j] の型は char
*colors[i][j] の型は...ありえへん! と言うてはります。

投稿2016/07/15 03:19

episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2016/07/15 04:44

大変明快で分かりやすいです。回答いただきありがとうございます。
guest

0

ベストアンサー

質問文のコードを元に書きなおしてみました。

c

1#include <stdio.h> 2 3void dictsort(char **, int); 4int xstrcmp(const char *, const char *); 5 6int main(void) { 7 char *colors[] = { 8 "white", "black", "red", "pink", "orange", 9 "blue", "yellow", "green", "purple", "gray", 10 "brown", "gold", "silver"}; 11 int num = sizeof(colors) / sizeof(char**); 12 13 dictsort(colors, num); //ここでエラーメッセージ 14 for (int i = 0; i < num; i++) { 15 printf("%s, ", colors[i]); 16 } 17 printf("\n"); 18 return 0; 19} 20 21void dictsort(char **ptr, int num) { 22 int count = 0; 23 24 while (count < num) { 25 int i = 0; 26 while (i < num - 1) { 27 if (xstrcmp(ptr[i], ptr[i + 1]) == 1) { 28 // ptr[i] と ptr[i+1] を交換する 29 char * tmp = ptr[i]; 30 ptr[i]= ptr[i + 1]; 31 ptr[i + 1] = tmp; 32 } 33 i++; 34 } 35 count++; 36 } 37} 38 39// See http://chausson.eng.kagawa-u.ac.jp/Comp/Prog/DosC/Sec6/Note627.html 40int xstrcmp(const char *str1, const char *str2) { 41 //-- 列長が短い方まで、文字同士の比較 42 for (; *str1 != '\0' && *str2 != '\0'; str1++,str2++ ) { 43 if (*str1 < *str2) { return -1; } 44 if (*str1 > *str2) { return 1; } 45 } 46 //-- 残った文字による判定 47 if (*str2 != '\0' ) { return -1; } // str1 が短いとき 48 if (*str1 != '\0' ) { return +1; } // str2 が短いとき 49 return 0; // 一致するとき 50}

実行結果例

$ gcc x.c $ ./a.out black, blue, brown, gold, gray, green, orange, pink, purple, red, silver, white, yellow,

投稿2016/07/14 22:37

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2016/07/15 05:15 編集

回答頂きありがとうございます。初歩的に過ぎるかもしれませんが、コードを拝見していて理解できなかった部分について質問させてください。 1. 11行目 'int num = sizeof(colors) / sizeof(char**);' の部分なのですが、sizeof演算子というものを初めて見ました。調べたところ、「指定した型や変数名で利用されるメモリのサイズ」とありました。"sizeof(colors)"は104となるようですが、これは一体どう数えて104になっているのでしょうか。'char **'のメモリサイズについてもイメージが掴めません。 2. 13行目 dictsort関数の第一引数は'char **'型なのに、'colors'という表記でコンパイルが通る理由が分かりません。 3. 13行目 私が書いたコードの該当部分を'colors'表記に直したのですが、コンパイルは通るようになったものの実行結果がコアダンプとなってしまいます。これはおそらく、'dictsort'関数を呼び出した際に文字列で確保されていないメモリを参照する箇所があるからだと思うのですが、この認識は正しいでしょうか。
katoy

2016/07/15 11:40

sizeof(colors) / sizeof(char**);'は sizeof(colors) / sizeof(char*);' の間違いです。 たまたま sizeof(char**) = 8, sizeof(char*) = 8 なにで、 colors の配列数を 13 ともとめられています。 1. sizeof(xxx) は xxx のバイト数を求めるものです。 参考: http://www.kis-lab.com/serikashiki/C/C03.html > sizeof演算子 http://www.bohyoh.com/CandCPP/FAQ/FAQ00012.html > 配列の要素数を取得するにはどうすればよいでしょうか。 2. color にデータ型は cjar** と同じなのです。 char *foo[] と char ** foo はデータ型とは同じなのです... ポインターについて理解をしているひつゆがあります。わからなければ、書籍でしらべるか、別途 質問を投稿してください。 3 質問にあるコードでは ptr+i+1 にアクセスしています。そして、i は最大で 12 まで変化します。 i が 12 になったときに ptr + 13 となり、color の領域を超えてしまいます。 私の回答のコードでは i は最大で 11 までしか変化しないようにしています。
退会済みユーザー

退会済みユーザー

2016/07/17 09:34

丁寧にご回答頂き感謝致します。
guest

0

単項演算子*はポインタに付けるものですが、colors[13][10]というint型の値に付いているので、エラーになっています。
(注:char型変数の値を参照すると値はint型になります)

投稿2016/07/14 16:13

otn

総合スコア84499

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

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

退会済みユーザー

退会済みユーザー

2016/07/14 16:27

回答頂きありがとうございます。 であれば、char **型の引数としては '** colors'のように書くのが正しいのでしょうか。
otn

2016/07/14 17:09

そもそも、*colors[13][10] という記述は何を意味していると理解していますか? 何のつもりでそう書いたのでしょうか?
退会済みユーザー

退会済みユーザー

2016/07/14 17:47

「文字列配列colorsの13番目の文字列の10番目の文字」ですか...? 確かに何故こんなことを書いているのか分かりませんね...
otn

2016/07/15 03:23

> 確かに何故こんなことを書いているのか分かりませんね... 自分で書いたのに忘れたと言うことですか? あるいは、自分で書いたのでないのなら、プログラムごと捨てるのか良いかと思います。
退会済みユーザー

退会済みユーザー

2016/07/15 04:01

もちろん自分で書いたものです。恥ずかしながらコンパイラのエラーを減らそうと躍起になって的外れな「修正」を行ってしまったようです。ところで↑の私の認識は正しいのでしょうか。
otn

2016/07/15 09:20

「文字列配列colorsの12番目の文字列の9番目の文字」ですね。先頭が1番目としての話ですが。 先頭を0番目と呼ぶのならお書きの通りです。 > コンパイラのエラーを減らそうと躍起になって的外れな「修正」を行ってしまったようです。 プログラムは「考えて」書きましょう。
退会済みユーザー

退会済みユーザー

2016/07/17 09:10

肝に銘じておきます。貴重なお時間割いていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問