はじめまして。どうぞよろしくお願いいたします。
C言語を学習中の者ですが、質問があります。
コードは平成24年秋季 基本情報技術者の午後にあるC言語問題なのですが、
そのプログラムの動きをVisualStudioExpressで再現しようとした際に、タイトルの疑問に当りました。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2012h24_2/2012h24a_fe_pm_qs.pdf
問題内に、以下の関数があります。
void check_winning_lot(char *lots[],char **win_list[LOT_GNUM],int winner[LOT_GNUM]) {
int i, j, k;
for (i = 0; i < LOT_GNUM; i++) { winner[i] = 0; for (j = 0; lots[j] != NULL; j++) { for (k = 0; win_list[i][k] != NULL; k++) { winner[i] += check_lot(lots[j], win_list[i][k]); } } }
}
この関数内で win_list[i][k] が使われている為、win_list[][] の形になるような配列を自作したシンプルなmain関数から投げて試しているのですが、上手く受取ってくれません。
check_winning_lot(char *win_list[6]){
printf("win_list[0][0] = %s \n", win_list[0][0]); / エラーで読み込めない */
printf("win_list[1][0] = %s \n", win_list[1][0]);
printf("win_list[1][1] = %s \n", win_list[1][1]);
}
void main(){
char *list1[2] = { "123456", };
char *list2[3] = { "102030", "987654" };
char **win_list[6][4];
/* 間違いがありましたので修正しました 2/17 */ win_list[0][0] = &list1[0]; win_list[1][0] = &list2[0]; win_list[1][1] = &list2[1]; check_winning_lot(win_list);
}
そもそも、問題文の関数が受け取れるのはchar **win_list[LOT_GNUM]の形になっており、添字の数が足りてないように見えました。
ポインタが2つ指定されていることはそれに関係あるのかもしれないという気はするのですが、どう考えて組んでいけばいいのか分かりませんでした。
ご回答のほど、よろしくお願いいたします。
2/17 kozuchiさんご指摘により以前のコードを修正しました。plistはこちらで実験をしていた時の配列名でしたのでwin_listに変更しました。
list1とlist2は受取り先の**win_listがポインタを2つ使用していたため、
ポインタのポインタを指摘するよう、一度list1とlist2でポインタの文字列を作成した後に、**win_listの配列へそれらを入れたイメージです。
また、Chironianさんの回答を参考にして、自作した方の関数を修正し、受取った先での関数が動作することを確認することができました。
#include <stdio.h>
check_winning_lot(char **win_list[]){
printf("win_list[0][0] = %s \n", win_list[0][0]);
printf("win_list[1][0] = %s \n", win_list[1][0]);
printf("win_list[1][1] = %s \n", win_list[1][1]);
}
void main(){
char *list1[] = { "123456", NULL };
char *list2[] = { "102030", "987654" , NULL };
char **win_list[] = { list1, list2 };
check_winning_lot(win_list);
}
回答1件
あなたの回答
tips
プレビュー