• ベストアンサー

C言語 ポインタの課題について

プログラミング初心者です プログラミングの課題でI 番目のポケモンを得る 関数get_pokemonを実装し返り値の値は*charとする という課題が出たのですが画像の通りに書いた結果 segmentation faultというエラー文が出てきました 良ければこのエラーが出てきた理由とどうすればちゃんと表示されるか教えてくれると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

次回はコピペ用に、文字でコードをお願いしますね。 関数プロトタイプが int (*func)(char *p[]) ですが、 使う実態が v[][MAX_LENGTH]; ですので、 func(v[i]); ->これは、v[MAX_LENGTH]つまり、char *飲みになってます。受け側のポインタ「配列」にはなっていないのです、 なので、 渡すとき、func(v,i)として 受け側は、 int (*func)(char *p[],int index) ですが、 とした方がいいでしょう。 基準ポインタがないためです。 または、受け側をchar *pとしてもよい

MAPILONN
質問者

お礼

アドバイスありがとうございます! 言われた通りにやってみたらしっかり実行できたしそれを元に理解することが出来ました! 次回からコピペ用に文字でコードを貼り付けます 質問してる側なのにわざわざコードを打たせるのは失礼でしたね…

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 ポインタを使用した問題について

    プログラミング初心者です #include <stdio.h> #define MAX_LENGTH 10 int main(void) { int n = 4; // ポケモンの数 char pokemons[][MAX_LENGTH] = { "Eevee", "Vaporeon", "Jolteon", "Flareon", "Mew"}; char* p = pokemons[n - 1]; // 最後のポケモンを得る p = move_address(p); // メモリを移動する print_pokemon(p); // 得たポケモンを表示する } 実行結果 Mew 上の雛形に従い、関数move_addressを実装しMewを表示せよとの問題があったのですがよくわからないので教えて頂けると幸いです。

  • C言語の関数について。

    学校の課題がわからないので教えてください。 1. 次の関数recfunc()は関数内で自分自身を呼び出す再起関数である。 int recfunc(int x){ if(x<=0)return -1; else if(x==1) return 3; else return 3*recfunc(x-1)-2; } 引数に1,2,3,4,5,...を与えたときの返り値を求めよ。その結果から、一般に 整数値nが与えられたとき、どのような値が計算されるか推測せよ。 一体何を返す関数だろうか?またどのようにその計算が実現されているか を簡潔に述べよ。 2.どのような再帰関数も、再帰を用いない関数に書き換えることができる。 問題1の関数recfunc()と同じ引数、同じ返り値をもつ再帰を用いない関数 func()を作成せよ。 2問も質問してすみません。 このプログラミングのレポートを提出しなくてはならないので困ってます。 何卒よろしくお願いします。

  • C言語の課題がわからないです。

    課題がわからないので質問します。 問題は 以前作成したグラフィックスインタプリタ cg.c を元にして,画像ファイルを貼り付ける機能を実装せよ.ただし,次の関数を定義すること. 画像のサイズを調べるためのアクセス関数 int PbmGetWidth(Pbm *pbm) および int PbmGetHeight(Pbm *pbm): pbm->width,pbm->height を返す. 画像を貼り付けるための関数 void PutImage(Pbm *pbm, int x, int y, char *filename):画像(ファイル名 filename )を座標(x,y)に貼り付ける. 以前作成したグラフィックスインタプリタ cg.c を元にして,画像ファイルを貼り付ける機能を実装せよ.ただし,次の関数を定義すること. 画像のサイズを調べるためのアクセス関数 int PbmGetWidth(Pbm *pbm) および int PbmGetHeight(Pbm *pbm): pbm->width,pbm->height を返す. 画像を貼り付けるための関数 void PutImage(Pbm *pbm, int x, int y, char *filename):画像(ファイル名 filename )を座標(x,y)に貼り付ける. 命令ファイルはこんな感じです。 clear 0 line 60 120 260 120 1 line 160 20 160 220 1 circle 110 70 40 1 circle 210 170 40 1 image 180 50 c.pbm image 210 30 c.pbm image 210 70 sign.pbm image 240 50 sign.pbm 貼り付けられる画像 c.pbm P1 10 11 0000000000 0001111000 0011111100 0111001110 0110000110 0110000000 0110000110 0111001110 0011111100 0001111000 0000000000 プログラムを書いたのですが、間違ってるところをお願いします。

  • C言語について

    #include <stdio.h> struct syoukai{ int no; char name[5]; }; int main(void) { struct syoukai mine = {3, "aaaaa"}; int cmdID ; printf("コマンドを入力してください\n"); scanf("%d\n",cmdID); if(cmdID == 1) printf("%d\n",syoukai.no, syoukai.name); } これをコンパイルして実行すると Segmentation fault とエラーになってしまい原因がわかりません 教えていただけますか?

  • C言語の課題について

    C言語の会員名簿処理問題の課題をしています。 次の条件でC言語で会員番号を入力するとその会員番号を持つ会員名を表示する プログラミングを組んでいますが、コンパイルに失敗してしまいます。 何度も見直して修正を施してみたのですが、うまくいきません。 是非お力添えをお願いします。 <条件> (1)会員番号と会員名は構造型でグローバル変数として宣言する。 (2)データ件数は10件とする。 (3)サブ関数で線形探索するプログラムを組み(my_search関数とする)、メイン関数で呼び出す。 (4)my_search関数の型はchar*とする。 (5)探索に成功したらmy_search関数の戻り値は該当会員の氏名とする。 (6)探索に失敗したらmy_search関数の戻り値はNULLとする。 (7)main関数では,関数my_searchの戻り値がNULLなら該当データがないことを 伝えるメッセージを出力して終了させる. そうでなければ,該当の氏名を出力して終了させる. 下に組んだプログラムとコンパイル結果を貼り付けます。 /* z:\情報システム論_2013>cl js010703_a106906.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. js010703_a106906.c js010703_a106906.c(48) : warning C4047: '==' : 間接参照のレベルが 'int' と 'void *' で異なっています。 js010703_a106906.c(58) : error C2040: 'my_search' : 'char *(int)' は 'int ()' と 間接操作のレベルが異なります。 z:\情報システム論_2013> */ #include <stdio.h> #define N 10 #define MAX 20 struct Mystruct{ int number; char name[MAX]; }; struct Mystruct meibo[N] = { {10, "asaoka"}, {20, "ito"}, {23, "kawano"}, {25, "shimizu"}, {31, "setoguchi"}, {34, "tomiyama"}, {37, "murakami"}, {38, "yasuda"}, {46, "yoshino"}, {49, "yoshikawa"} }; int main() { int x; char p; printf("会員番号を入力してください。\n"); printf("会員番号:"); scanf("%d", &x); printf("入力された会員番号の会員は"); p = my_search(x); if(p==NULL){ printf("存在しません。"); }else{ printf("%s", p); } return 0; } char * my_search(int a) { int j = 0; while(j<N){ if(a==meibo[j].number){ return meibo[j].name; break; }else{ ++j; } return NULL; } } どうしても、この2つのエラーが消えません。 修正点を詳しく教えていただけないでしょうか。 よろしくお願いします。

  • 構造体へのポインタの動的確保について

    構造体へのポインタを動的確保しようとmalloc関数を使用すると segmentation faultが起きます。 typedef struct cell{ char *word; int count; struct cell *next; }node_t; という構造体で node_t *ptr=(node_t*)malloc(sizeof(node_t)*num); という風に動的確保しようとするとsegmentation faultが起きました。 gdbを使って調べると Starting program: /home/programII/week05/a.out file1 file2 Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7b4ce36 in ?? () from /lib/x86_64-linux-gnu/libc.so.6 というメッセージが返ってきます。 これはライブラリとのリンクが正しく行われていないということでしょうか? しかし、ポインタの動的確保以外でmalloc関数を使用すると 正常に動作するのでライブラリ自体が無いわけではないようです。 ptr[2]といった風にポインタを参照したいのですが上手くいきません。 よろしくお願いします。

  • c言語プログラミングでの質問?です。

    学校でc言語プログラミングを使って簡単なゲームを作りなさい。 という課題が出ました。 下記の条件に沿って作れとのことです。 なかなかいいアイデアが浮かばないんですが、なにかちょうどいいものないですかね? ・scanf文を使うこと。。 ・if文を使うこと。 ・for文(while文)を使うこと。 ・rand関数を使うこと。 ・自分で定義した関数を使うこと。 ・配列または文字列を使うこと。

  • C言語 プログラミングの問題 エラーの理由

    C言語のプログラミングの問題です。 以下の文を実行したところ、「segmentation fault」というエラーが表示された。 想定される原因を答えなさい。 ただし書式に対応する、integer_dat(非ポインタ整数変数)と、string_dat(文字列配列変数)の宣言は正しいものとする。 scanf("%d%s", integer_dat, string_dat); 答えとして、 「integer_datに&がついていないのでアドレスで渡せないため。」 と書いてありました。 しかし採点は△でした。 正直非ポインタ整数変数という言葉がわかりません。 他にどのような答えがあるのでしょうか?

  • エラー C2664

    プログラミングの初心者です. 「error C2664: 'fclose' : 1 番目の引数を 'const char [14]' から 'FILE *' に変換できません。 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。」 以上のエラー文がでてきて, http://tipstips.client.jp/ugopen/UfuncErrorW32.html ↑の操作をしても消えませんでした. エラー文の出てきたのは fclose("sikisaizu.csv"); というところです. よければヒント等を教えていただけると嬉しく思います. よろしくお願い致します.

  • 【C言語】戻り値が構造体の関数

    こんにちは。 授業でC原語を習っており、その課題で詰まった所についての質問です。 ※以下の関数については可能な限り簡略化しています。 typedef struct {   char name[10];   int height; } Person; Person *bin_search( const Person *key) {   return (&key); } 以上のような構造体と関数があった場合、bin_searchでkeyを返したいのですが、 return (&key); では、コンパイルするとその行について return from incompatible pointer type warning: function returns address of local variable とエラーが出てしまいます。 return (key); return (*key); などとりあえず試してはみたのですがどれも上手くいきません。 そもそも関数名の前に*(間接演算子?)があること自体がよくわかっていないです…… なので、返り値をどうすれば正しく機能してくれるのか教えていただけるとありがたいです。 ※課題で指定されているので、関数頭部については変更しないとします。

このQ&Aのポイント
  • 筆まめVer.29の差出人名前の隙間について解説します。名字と名前の間の隙間が大きい場合、隙間を縮める方法をご紹介します。お詳しい方はぜひご参考にしてください。
  • 名前の一文字一文字の隙間が大きい筆まめVer.29の差出人名前の問題について解決方法をご紹介します。名字と名前の間の隙間を縮める方法を詳しく解説しています。
  • 筆まめVer.29において、名前の一文字一文字の隙間が大きいという問題が発生しています。本記事では、名字と名前の間の隙間を縮める方法をご紹介します。お困りの方はぜひご参考にしてください。
回答を見る