[解決済み] のエラーが発生しました。ISO Cは関数のネストを禁止しています。
2022-01-28 11:25:03
質問
このマージソートの使い方のどこが問題なのでしょうか?
main()で指定されたサイズ9の配列をソートしようとしています。
しかし、私はmerge_sortメソッドを使っているのですが、すべての関数に対して "ISO C forbids nested functions" というエラーが表示されます。
arraycpy関数を削除すると、これらのメッセージは表示されなくなるので、明らかに"arraycpy"の問題であることがわかります。
なお、この3つしかないので、string.hのライブラリは使えません。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void merge(int a[], int na, int b[], int nb, int c[])
{
int ia, ib, ic;
for(ia = ib = ic = 0; (ia < na) && (ib < nb); ic++)
{
if(a[ia] < b[ib]) {
c[ic] = a[ia];
ia++;
}
else {
c[ic] = b[ib];
ib++;
}
}
for(;ia < na; ia++, ic++) c[ic] = a[ia];
for(;ib < nb; ib++, ic++) c[ic] = b[ib];
}
void arraycpy(int *dest, int *src, int n)
{
int i;
int *src_p, *dst_p;
src_p = (int*)src;
dst_p = (int*)dest;
for (i = 0; i < n; i++) {
*(dst_p+i) = *(src_p+i);
}
void internal_msort(int a[], int n, int helper_array[])
{
int left = n/2;
int right = n/2;
if (n < 2)
return;
internal_msort(a, left, helper_array);
internal_msort(a + left, right, helper_array);
merge(a, left, a + left, right, helper_array);
arraycpy(a, helper_array, n*sizeof(int));
}
void merge_sort(int a[], int n)
{
int *tmp_array = malloc(sizeof(int) * n);
internal_msort(a, n, tmp_array);
free(tmp_array);
}
void rem_sort(int array[], int size)
{
merge_sort(array, size);
}
int main()
{
int array[] = {3,55,72,4,21,6,9,0,4};
merge_sort(array, 9);
for (int i=0;i<9;i++)
printf("%d | ", array[i]);
return 0;
}
どのように解決するのですか?
の閉じ中括弧が抜けています。
for
ループを使用します。
arraycpy
void arraycpy(int *dest, int *src, int n)
{
int i;
int *src_p, *dst_p;
src_p = (int*)src;
dst_p = (int*)dest;
for (i = 0; i < n; i++) {
*(dst_p+i) = *(src_p+i);
}
// ^^^
}
そのため、次のブレースが
for
ループの中で定義されているので、次の関数を定義すると、次の関数の中で定義されていることになります。
arraycpy
関連
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】エラー:イニシャライザー要素がロード時に計算可能でない
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み] テスト
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開