前提・実現したいこと
C言語でマージソートを行うプログラムを書いています。
以下に書いたプログラムを示します。
#include <stdio.h> #define N 8 void show_addr(int X[], int n) /*アドレスを表示*/ { int i; for(i = 0; i < n; i++) printf("%p ", X + i); puts(""); } void show(int X[], int n) /*配列内容を表示*/ { int i; for(i = 0; i < n; i++) printf("%d ", X[i]); puts(""); } void merge(int Y1[], int n1, int Y2[], int n2, int Y[]) /*整列済みの二つの配列を併合*/ { int i = 0, j = 0, k = 0; while(j < n1 && k < n2){ if(Y1[j] <= Y2[k]) Y[i++] = Y1[j++]; else Y[i++] = Y2[k++]; } if(j == n1){ while(k < n2) Y[i++] = Y2[k++]; } else{ while(j < n1) Y[i++] = Y2[j++]; } } void msort(int X[], int n, int Y[]) /*マージソート*/ { int n1 = n / 2, n2 = n - n1, i = 0; int X1[n1], X2[n2], Y1[n1], Y2[n2]; if(n == 1) Y[0] = X[0]; else{ while(i < n1) X1[i] = X[i++]; while(i < n) X2[i] = X[i++]; msort(X1, n1, Y1); msort(X2, n2, Y2); merge(Y1, n1, Y2, n2, Y); } } int main() { int X[N] = {18, 37, 21, 14, 7, 12, 19, 6}, Y[N]; show_addr(X, N); show_addr(Y, N); show(X, N); msort(X, N, Y); show(Y, N); return 0; }
関数msortは引数にソートする配列、配列の大きさ、ソート済みの格納先を受け取ります。
(大きさnの配列X[]をソートしてY[]に格納します。)
発生している問題・エラーメッセージ
上のプログラムを実行すると以下のようなエラーメッセージが出力されます。
gcc -Wall -pedantic -o mergesort.out mergesort.c mergesort.c: 関数 ‘show_addr’ 内: mergesort.c:9:5: 警告: 書式 ‘%p’ は引数の型が ‘void *’ であると予期されますが、第 2 引数の型は ‘int *’ です [-Wformat=] printf("%p ", X + i); ^ mergesort.c: 関数 ‘msort’ 内: mergesort.c:45:3: 警告: ISO C90 は可変長の配列 ‘X1’ を禁止しています [-Wvla] int X1[n1], X2[n2], Y1[n1], Y2[n2]; ^ mergesort.c:45:3: 警告: ISO C90 は可変長の配列 ‘X2’ を禁止しています [-Wvla] mergesort.c:45:3: 警告: ISO C90 は可変長の配列 ‘Y1’ を禁止しています [-Wvla] mergesort.c:45:3: 警告: ISO C90 は可変長の配列 ‘Y2’ を禁止しています [-Wvla] mergesort.c:52:18: 警告: ‘i’ に関する演算は定義されていません [-Wsequence-point] X1[i] = X[i++]; ^ mergesort.c:54:18: 警告: ‘i’ に関する演算は定義されていません [-Wsequence-point] X2[i] = X[i++]; ^
まず、アドレスの表示について、手元の参考書ではこのプログラムと同じく『%p』を用いているのですが、なぜうまくいかないのでしょうか。
『printf("%p ", X + i);』を『printf("%p ", (void *)(X + i));』とキャストするとエラーメッセージは消えましたが、前者ではダメな理由がわかりません。
二つ目に、関数msort内の作業用配列についてエラーメッセージが出ていますが、ここでの宣言は可変長配列なのでしょうか。
n1、n2は定数だと思います。(これらをNにするとエラーメッセージは消えました)
最後に『‘i’ に関する演算は定義されていません』というエラーメッセージがありますが、これについては全くわかりません。
iを宣言し忘れではありませんし、どう変更すればよいのでしょうか。
これらを部分的に修正していきたいと思っておりますので、プログラム全体の方針等は目を瞑っていただければと思います。
ご回答よろしくお願いします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/15 07:22
2019/07/15 19:32