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

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

新規登録して質問してみよう
ただいま回答率
85.49%
GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

Q&A

解決済

2回答

362閲覧

visual studioとUNIX gccで結果が違う

Eldritch_soul

総合スコア7

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

0グッド

0クリップ

投稿2017/10/18 08:00

###前提・実現したいこと
長さ5のキューを再現したいです。
実行後、無限ループで1でエンキュー、2でデキュー、それ以外で終了します。
エンキューのときはキューに入れるデータを入力し、配列に保存します。
デキューのときは配列の一番若いものを表示後、配列の値を一つずつ前にずらします。
エンキュー、デキュー、終了後にキューの状態を表示します。
visual studioの実行結果が実現したいものですが、gccだと違う結果が出てしまいます。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4#define QLEN 5 5#define QEMP -1 6#define QFUL -1 7 8int enq(int); 9int deq(void); 10void listq(void); 11int AHI[QLEN];/*キューの長さ*/ 12int num=0;/*現在のキューの数*/ 13 14int main() { 15 16 while (1) { 17 int x, y,HUNT; 18 printf("1 = enQ/2 = deQ/else = end ==>"); 19 scanf("%d", &x); 20 if (x == 1) { 21 printf("enQ data ==> "); 22 scanf("%d", &y); 23 HUNT=enq(y); 24 if (HUNT == QFUL)printf("Q full, you should deQ first!\n"); 25 } 26 if (x == 2) { 27 if (num == 0)printf("Q empty, you should enQ first!\n"); 28 printf("deQ data : %d\n", deq()); 29 } 30 listq(); 31 32 if (x != 1 && x != 2)break; 33 34 } 35 return 0; 36} 37 38void listq (void) { 39 int j=0; 40 if (num == 0)printf("Queue empty!\n"); 41 printf("Queue : "); 42 while (j < num) { 43 printf("%d ", AHI[j]); 44 j++; 45 } 46 printf("\n"); 47} 48 49int enq(int data) { 50 51 if (num == QLEN)return QFUL; 52 AHI[num] = data; 53 num++; 54 return 0; 55} 56 57int deq(void) { 58 int i,JY; 59 int RRM[QLEN]; 60 if (num == 0)return QEMP; 61 JY = AHI[0]; 62 for (i = num-1; i >= 0; i--) { 63 RRM[i] = AHI[i]; 64 } 65 num--; 66 for (i =num; i >= 0; i--) { 67 AHI[i-1] = RRM[i]; 68 } 69 return JY; 70}

###Visual Studio 2017での実行結果

1 = enQ/2 = deQ/else = end ==>1 enQ data ==> 2 Queue : 2 1 = enQ/2 = deQ/else = end ==>1 enQ data ==> 4 Queue : 2 4 1 = enQ/2 = deQ/else = end ==>1 enQ data ==> 6 Queue : 2 4 6 1 = enQ/2 = deQ/else = end ==>2 deQ data : 2 Queue : 4 6 1 = enQ/2 = deQ/else = end ==>2 deQ data : 4 Queue : 6 1 = enQ/2 = deQ/else = end ==>2 deQ data : 6 Queue empty! Queue : 1 = enQ/2 = deQ/else = end ==>0 Queue empty! Queue : 続行するには何かキーを押してください . . .

###UNIX gccでの実行結果

1 = enQ/2 = deQ/else = end ==>1 enQ data ==> 2 Queue : 2 1 = enQ/2 = deQ/else = end ==>1 enQ data ==> 4 Queue : 2 4 1 = enQ/2 = deQ/else = end ==>2 deQ data : 2 Queue : 4 4 1 = enQ/2 = deQ/else = end ==>6 Queue : 4 4 sshsv171:Ex02 s1250109[61]$ ./a.out 1 = enQ/2 = deQ/else = end ==>1 enQ data ==> 2 Queue : 2 1 = enQ/2 = deQ/else = end ==>1 enQ data ==> 4 Queue : 2 4 1 = enQ/2 = deQ/else = end ==>1 enQ data ==> 6 Queue : 2 4 6 1 = enQ/2 = deQ/else = end ==>2 deQ data : 2 Queue : 4 6 1 = enQ/2 = deQ/else = end ==>2 deQ data : 4 Queue : 6 6 6 0 1 = enQ/2 = deQ/else = end ==>2 deQ data : 6 Queue : 6 6 0 0 0 0 1 = enQ/2 = deQ/else = end ==>0 Queue : 6 6 0 0 0 0

###原因の可能性
UNIXのgccだとscanf_sが使えないので、scanf_sをscanfに変更しているのでそこがもしかすると関係あるのかもしれません。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

iの値が0に時でもループしている部分でしょうかね

num--; for (i =num; i >= 0; i--) { AHI[i-1] = RRM[i]; }

int配列の次のint numのエリアを壊しているみたいです。

投稿2017/10/18 09:09

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

バグがあります。deqで配列の範囲外を更新していますね。

これはメモリー破壊ですが、Cでよくやってしまう発見が困難なバグの代表的なものと思います。これをやってしまうと、結果がどうなるかは予測できません。

投稿2017/10/18 08:36

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問