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

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

ただいまの
回答率

90.45%

  • C

    4682questions

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

  • Ubuntu

    1866questions

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

  • Emacs

    160questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 10K+
退会済みユーザー

退会済みユーザー

発生している問題・エラーメッセージ

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

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

該当のソースコード

#include<stdio.h>

void dictsort(char **,int);
int strcmp(char *,char *);

int main(void){
  int i;
  char *colors[]={"white","black","red","pink","orange","blue","yellow","green","purple","gray","brown","gold","silver"};

  dictsort(*colors[13][10],13); //ここでエラーメッセージ
  for(i=0;i<13;i++){
    printf("%s,",colors[i]);
  }
  printf("\n");
  return 0;
}


void dictsort(char **ptr,int y){

  int i=0,count=0,hako;

  while(count < y){
    while(i < y){
      if(strcmp(*(ptr+i),*(ptr+i+1)) == 1){
    **ptr=hako;
    **(ptr+1)=**ptr;
    hako=**(ptr+1);
      }
      i++;
    }
  }
}
int strcmp(char *str1,char *str2){
    int result;

    for(; *str1 == *str2; str1++,str2++){
      if(*str1 == '\0')return 0;
    }
    if(*str1-*str2 < 0){result=-1;}
    if(*str1-*str2 == 0){result=0;}
    if(*str1-*str2 > 0){result=1;}

    return result;
  }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

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

#include <stdio.h>

void dictsort(char **, int);
int xstrcmp(const char *, const char *);

int main(void) {
  char *colors[] = {
    "white", "black",  "red",   "pink",   "orange",
    "blue",  "yellow", "green", "purple", "gray",
    "brown", "gold",   "silver"};
  int num = sizeof(colors) / sizeof(char**);

  dictsort(colors, num); //ここでエラーメッセージ
  for (int i = 0; i < num; i++) {
    printf("%s, ", colors[i]);
  }
  printf("\n");
  return 0;
}

void dictsort(char **ptr, int num) {
  int count = 0;

  while (count < num) {
    int i = 0;
    while (i < num - 1) {
      if (xstrcmp(ptr[i], ptr[i + 1]) == 1) {
        // ptr[i] と ptr[i+1] を交換する
        char * tmp = ptr[i];
        ptr[i]= ptr[i + 1];
        ptr[i + 1] = tmp;
      }
      i++;
    }
    count++;
  }
}

// See http://chausson.eng.kagawa-u.ac.jp/Comp/Prog/DosC/Sec6/Note627.html
int xstrcmp(const char *str1, const char *str2) {
  //--  列長が短い方まで、文字同士の比較
  for (; *str1 != '\0' && *str2 != '\0'; str1++,str2++ ) {
    if (*str1 < *str2) { return -1; }
    if (*str1 > *str2) { return  1; }
  }
  //--  残った文字による判定
  if (*str2 != '\0' ) { return -1; }    // str1 が短いとき
  if (*str1 != '\0' ) { return +1; }    // str2 が短いとき
  return 0;                             // 一致するとき
}


実行結果例

$ gcc x.c

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/15 13:41 編集

    回答頂きありがとうございます。初歩的に過ぎるかもしれませんが、コードを拝見していて理解できなかった部分について質問させてください。

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

    キャンセル

  • 2016/07/15 20: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 18:34

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/15 01:27

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

    キャンセル

  • 2016/07/15 02:09

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

    キャンセル

  • 2016/07/15 02:47

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

    キャンセル

  • 2016/07/15 12:23

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

    キャンセル

  • 2016/07/15 13:01

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

    キャンセル

  • 2016/07/15 18:20

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

    キャンセル

  • 2016/07/17 18:10

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/15 13:44

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

    キャンセル

+1

invalid type argument of unary ‘*’

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

*colors[13][10]


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4682questions

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

  • Ubuntu

    1866questions

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

  • Emacs

    160questions

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