質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • C#

    6575questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    3461questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3256questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

c言語 マージ関数の作成について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 114

mizusato

score 1

大学のc言語の授業でマージ関数のプログラムを作っています。

コード

include <stdio.h>

include <stdlib.h>

int merge(int *array, int p, int q, int r)
{
int j, P = p, Q = q;
static int i = 0, *T;

T = ( int * ) malloc ( r-p+1 * sizeof ( int ) );
if(!T)
{
printf("メモりが確保できませんでした。\n");
return 1;
}

if(array[q] <= array[r])
{
while(p != Q+1)
{
if(array[p] <= array[q+1])
{
T[i] = array[p];
i = i + 1;
p = p + 1;
}
else if(array[p] > array[q+1])
{
T[i] = array[q+1];
i = i + 1;
q = q + 1;
}
}

while(q != r)
{
T[i] = array[q+1];
i = i + 1;
q = q + 1;
}
}

else if(array[q] > array[r])
{
while(q != r)
{
if(array[p] <= array[q+1])
{
T[i] = array[p];
i = i + 1;
p = p + 1;
}
else if(array[p] > array[q+1])
{
T[i] = array[q+1];
i = i + 1;
q = q + 1;
}
}

/*while(p != Q+1)
{
T[i] = array[p];          
i = i + 1;
p = p + 1;
}*/
printf("%d %d\n", i, Q);
}

for(j=0; j<=r-P; j++)
{
array[j+P] = T[j];
}
free(T);
return i;
}

int main()
{
int n, *array, p, q, r, i, a;

scanf("%d\n", &n);

array = ( int * ) malloc ( n * sizeof ( int ) );
if(!array)
{
printf("メモりが確保できませんでした。\n");
return 1;
}

scanf("%d %d %d\n", &p, &q, &r);

for(i=0; i<n; i++)
{
scanf("%d", &array[i]);
}

a = merge(array, p, q, r);

for(i=0; i<n-1; i++)
{
printf("%d ", array[i]);
}
printf("%d\n", array[n-1]);

printf("%d\n", a);

free(array);

return 0;
}

コンパイル中に以下のエラーメッセージが発生しました。

エラーメッセージ
[sd18254@eiw03 ~]$ emacs 20.c &
[1] 17781
[sd18254@eiw03 ~]$ gcc -Wall 20.c
[1]+  終了                  emacs 20.c
[sd18254@eiw03 ~]$ ./a.out 
8
1 4 7
2 1 3 4 8 5 6 7
* Error in `./a.out': free(): invalid next size (fast): 0x00000000021e1040 *
======= Backtrace: =========
/lib64/libc.so.6(+0x7c619)[0x7f0f906a0619]
./a.out[0x4009fb]
./a.out[0x400abf]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f0f90645c05]
./a.out[0x4005b9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 00:28 1375096030                         /home/usrs/sd18254/a.out
00600000-00601000 r--p 00000000 00:28 1375096030                         /home/usrs/sd18254/a.out
00601000-00602000 rw-p 00001000 00:28 1375096030                         /home/usrs/sd18254/a.out
021e1000-02202000 rw-p 00000000 00:00 0                                  [heap]
7f0f8c000000-7f0f8c021000 rw-p 00000000 00:00 0 
7f0f8c021000-7f0f90000000 ---p 00000000 00:00 0 
7f0f9040e000-7f0f90423000 r-xp 00000000 08:02 18769                      /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f0f90423000-7f0f90622000 ---p 00015000 08:02 18769                      /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f0f90622000-7f0f90623000 r--p 00014000 08:02 18769                      /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f0f90623000-7f0f90624000 rw-p 00015000 08:02 18769                      /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f0f90624000-7f0f907dc000 r-xp 00000000 08:02 5672                       /usr/lib64/libc-2.17.so
7f0f907dc000-7f0f909dc000 ---p 001b8000 08:02 5672                       /usr/lib64/libc-2.17.so
7f0f909dc000-7f0f909e0000 r--p 001b8000 08:02 5672                       /usr/lib64/libc-2.17.so
7f0f909e0000-7f0f909e2000 rw-p 001bc000 08:02 5672                       /usr/lib64/libc-2.17.so
7f0f909e2000-7f0f909e7000 rw-p 00000000 00:00 0 
7f0f909e7000-7f0f90a08000 r-xp 00000000 08:02 2147824                    /usr/lib64/ld-2.17.so
7f0f90bde000-7f0f90be1000 rw-p 00000000 00:00 0 
7f0f90c05000-7f0f90c08000 rw-p 00000000 00:00 0 
7f0f90c08000-7f0f90c09000 r--p 00021000 08:02 2147824                    /usr/lib64/ld-2.17.so
7f0f90c09000-7f0f90c0a000 rw-p 00022000 08:02 2147824                    /usr/lib64/ld-2.17.so
7f0f90c0a000-7f0f90c0b000 rw-p 00000000 00:00 0 
7fffa2496000-7fffa24b7000 rw-p 00000000 00:00 0                          [stack]
7fffa2548000-7fffa254a000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
中止 (コアダンプ)

 試したこと

上のコード中にあるようにwhile 文を一つコメント文にしたらエラーが表示されなくなったので問題のある場所はコメント文の場所だと思います
ですがどのように対処していいかわからないのでよろしくお願いします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

コンパイル中に以下のエラーメッセージが発生しました。 

とありますが、その後の記述から、実行時エラーではありませんか?

[sd18254@eiw03 ~]$ ./a.out 

は、作成したプログラムの実行です。
で、

while 文を一つコメント文

は、

/*while(p != Q+1)

の事でしょうか? ここ、 p が Q+1 以外の時、ループします。従って、実行時エラーとしては、p==Q+1 にならない限り、ループし、多分、配列T[]が範囲外となってエラー終了すると思われます。詳細は確認していませんが、その辺の確認を。

あと、ソースコードをアップする時は、コード部分をコードしてして指定しないと見ずらいです。

[追記]
p, q, r の値を確認していないので、違っていたら、申し訳ないですが、

  • p が最初から、 Q+1 より、大きい、
  • i の値が、r-p+1 の値を越えた、
    あたりでしょうか。
    while (p != Q+1) ですが、while (p < Q+1) と書いた方が安全と思います。
    (とりあえず、動く。 本来は、どちらでも動くのが正しいのですが、、)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/10 22:03

    回答ありがとうございます!
    ごめんなさい、コンパイルと実行を勘違いしてました、実行時のエラーです。
    while 文の中身にp=p+1としてpがQ+1になるまで操作を続けたかったのですがおかしいでしょうか
    指摘もありがとうございます!

    キャンセル

  • 2018/06/10 22:06 編集

    そのwhileに入るとき、pはどういう数値なんでしょうか
    また、Qは?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    ビット構成を表示するプログラム

    すいませんputcharx>>iではなく1になっていたのが原因でした。 putchar(((x>>i)&1U)?'1':'0');の部分がよく理解できません。 例えば55という数字

  • 解決済

    【C言語】スタックをリストで実現するプログラム

    毎度お世話になっております。 高橋麻奈さんの「やさしいC アルゴリズム」をみて勉強しているのですが、リストを使ったスタックのコードで、がコンパイルエラーになってしまいました。 コ

  • 解決済

    [C言語] 2次元配列に一文字ずつ格納する方法

    前提・実現したいこと お世話になります。またしても初歩的な内容で申し訳ないのですが、現在勉強のため、入力を平面として捉え、「0」「1」に変換して位置関係を保持したまま出力する、と

  • 受付中

    初歩的なC言語のプログラムをつくったみたいのですが教えてください

    前提・実現したいこと C言語emacsをつかった授業で簡単なプログラムを作りたいと思っています。 わたしのアイデアでは、4桁の誕生日を2人分かけて、2桁の数字が出るまでわってい

  • 解決済

    キューについて

    いつもお世話になっています。キューについて質問させていただきます。 エンキューだけを考えて表示させたいのですが、listqの関数でキューの中身を表示させる方法がわかりません。引数

  • 解決済

    文字列の表示について

    身長 [cm] と体重 [kg] を標準入力して BMI を計算するプログラムを作りたいのですが BMI の値によって「やせ型」「標準型」「肥満型」の判 断と表示を行う(この部

  • 解決済

    繰り返した回数で割るには、どのように書けばよいのか、分かりません。。

    課題で、 キーボードから入力された数値の平均を計算して表示するプログラム を作ったのですが、書き方が分からなく、そのまま提出しましたが、まだ繰り返した回数で割るということをどう

  • 解決済

    文字列のなかで指定された文字を数える。

    文字列のなかで指定された文字を数えるプログラムを作りたいのですが、どのように書けばいいのかわからなくなりました。 実行例 $ ./a.out 文字列を入力してく

同じタグがついた質問を見る

  • C#

    6575questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    3461questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3256questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。