1. ホーム
  2. c

[解決済み] のエラーが発生しました。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