新人研修でAS/400のRPG3を習ってます。
現在、AMFILEとCMFILEと言うファイルをAMCUSTと言うKEYで繋ぎ、WPO001と言うファイルにアウトプットする演習問題に取り組んでいるのですが、LOOPが止まらなく、WPO001がオーバーフローしてしまいます。何方か、もしよろしければ助けてください。わたしが書いたMAIN ROUTINE のプログラムは以下です。

C READ AMFILE 70*
C *IN,70 DOWEQ*ZERO *
C AMCUST CHAINCMFILE 60 *
C N60 GOTO FND *
C FND TAG *
C WRITEWPO001R *
C ENDDO *
C SETON LR *

A 回答 (2件)

質問のあった日にちを考えるともう解決したかもしれませんが


回答してみます。

質問内容とソースを見る限りでの推測ですが、AMFILEから読み込んだキーが
CMFILEにも存在するときにWPO001Rに書き込むという流れで良いのでしょうか?
その前提で話を致します。

sugiyameさんの回答にもあった通り、VALIDであろうとINVALIDであろうと
WPO0001Rに出力をしてしまいます。
それと、DO文から抜ける条件がその中に無い為、抜けることができず
永遠に同じ内容を書き込む結果になっていると思います。(INVALIDの時
何が書き込まれるかは分からないですが....)
これがオーバーフローの原因ではと思われます。

対応としてはまず、
1.INVALIDの場合はWRITEを行わない
2.DO文から抜ける条件をその中にいれる。
修正をしてみては如何でしょうか?

大きなお世話かもしれませんが修正例を書いておきます。

C READ AMFILE 70 *
C *IN70 DOWEQ*ZERO *
C AMCUST CHAINCMFILE 60 *
C N60 WRITEWPO001R *
C READ AMFILE 70 *
C ENDDO *
C SETON LR *
    • good
    • 0

RPGはしばらくぶりなので自信はないのですが一応。



FNDのTAGの位置がおかしいので、
このプログラムだと、おそらく、
CMFILEがVALIDであろうとINVALIDであろうと
WPO0001Rに出力をしてしまいます。
それがエラーの原因ではないでしょうか?

オーバーフローというエラーだからといって、
本当にオーバーフローだとは限らないことがあります。

デバッグモードで動きを確認してみてはいかがでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qruby "\001\376".unpack("C*") => [1, 254]の意味

"\001\376".unpack("C*") => [1, 254] の
[1, 254]ってどういう数字を意味するのですか?8ビット整数なのに配列で結果が出ていることの意味がわかりません。ご教授ください。

Aベストアンサー

"\001\376"
は、バイナリ文字列で
"C*"

バイトとして数値を取り出し配列にする
ということだと思います。
\376は、8進数で、10進にすると254になります。
見当違いだったらすみません。

Qpic16f88とosl40562-lrとc言語で作るマイコン時計について質問いたします。

添付回路図のように回路を組み、下記プログラムをpic16f88にやきつけました。すると、3桁目の7セグメントと、RA5のSWを押した時の時分が表示されません。どこがまちがっているかご指摘下さい。
#include<xc.h>
#pragma config PWRTE=ON,WDTE=OFF,FOSC=HS,CP=OFF,LVP=OFF
void init_port();
void init_segment();
void init_timer();
void segment_set_data(short seg1, short seg2, short seg3, short seg4, short dot);
void interrupt intr();
void segment_disp();
long clock_msec;
short lock;
#define _XTAL_FREQ 8000000
#define LOCK 1
#define UNLOCK 0
void main(void){
short hh, mm, ss;
long temp;
OSCCON = 0b01110000;
ANSEL = 0b00000000;
init_port();
init_segment();
init_timer();
INTCONbits.PEIE = 1;
INTCONbits.GIE = 1;
while (1) {
temp = clock_msec / 1000;
hh = temp / 3600;
mm = (temp % 3600) / 60;
ss = temp % 60;
if (RA5 == 1) {
segment_set_data(hh / 10, hh % 10, mm / 10, mm % 10, 2);
} else {
segment_set_data(mm / 10, mm % 10, ss / 10, ss % 10, 2);
}
if (RA3 == 0) {
hh++;
ss = 0;
if (hh == 24) {hh = 0;}
lock = LOCK;
clock_msec = (((long)hh * 3600) + ((long)mm * 60) + (long)ss) * 1000;
lock = UNLOCK;
}
if (RA4 == 0) {
mm++;
ss = 0;
if (mm == 60) {mm = 0;}
lock = LOCK;
clock_msec = (((long)hh * 3600) + ((long)mm * 60) + (long)ss) * 1000;
lock = UNLOCK;
}
__delay_ms(100);
}
}
void init_segment(){
RA1 = 0;
RA0 = 0;
RA7 = 0;
RA6 = 0;
TRISB = 0b00000000;
PORTB = 0x00;
}
void init_port(){TRISA = 0b00111000;}
void init_timer(){
T2CONbits.T2CKPS0 = 0;
T2CONbits.T2CKPS1 = 0;
T2CONbits.TOUTPS3 = 1;
T2CONbits.TOUTPS2 = 1;
T2CONbits.TOUTPS1 = 1;
T2CONbits.TOUTPS0 = 1;
TMR2 = 0;
PIE1bits.TMR2IE = 1;
PIR1bits.TMR2IF = 0;
PR2 = 125;
T2CONbits.TMR2ON = 1;
}
short seg_dat[4] = {0, 0, 0, 0};
short dot_point = 0;
void segment_set_data(short seg1, short seg2, short seg3, short seg4, short dot){
seg_dat[0] = seg1;
seg_dat[1] = seg2;
seg_dat[2] = seg3;
seg_dat[3] = seg4;
dot_point = dot;
}
long clock_msec = 0;
short lock = UNLOCK;
void interrupt intr(){
if(PIR1bits.TMR2IF == 1){
PIR1bits.TMR2IF = 0;
segment_disp();
if(lock == UNLOCK){
clock_msec++;
if(clock_msec == 86400000){clock_msec = 0;}
}
}
}
short seg_tbl[10] = {0b00111111,0b00000110,0b01011011,0b01001111,0b01100110, 0b01101101,0b01111101,0b00100111,0b01111111,0b01101111};
short seg_cnt = 0;
void segment_disp(void){
switch (seg_cnt) {
case 0:
RA6 = 1;
PORTB = seg_tbl[seg_dat[0]];
if (dot_point == 1) {RB7 = 1;}
RA1 = 0;
seg_cnt = 1;
break;
case 1:
RA1 = 1;
PORTB = seg_tbl[seg_dat[1]];
if (dot_point == 2) {RB7 = 1;}
RA0 = 0;
seg_cnt = 2;
break;
case 2:
RA0 = 1;
PORTB = seg_tbl[seg_dat[2]];
if (dot_point == 3) {RB7 = 1;}
RA7 = 0;
seg_cnt = 3;
break;
case 3:
RA7 = 1;
PORTB = seg_tbl[seg_dat[3]];
if (dot_point == 4) {RB7 = 1;}
RA6 = 0;
seg_cnt = 0;
break;
}
}

添付回路図のように回路を組み、下記プログラムをpic16f88にやきつけました。すると、3桁目の7セグメントと、RA5のSWを押した時の時分が表示されません。どこがまちがっているかご指摘下さい。
#include<xc.h>
#pragma config PWRTE=ON,WDTE=OFF,FOSC=HS,CP=OFF,LVP=OFF
void init_port();
void init_segment();
void init_timer();
void segment_set_data(short seg1, short seg2, short seg3, short seg4, short dot);
void interrupt intr();
void segment_disp();
long clock_msec;
short lock;
#...続きを読む

Aベストアンサー

RA5がMCLRピンのままなので入力ピンとして機能していない。
RA6,RA7が外付け水晶用ピンの設定なので出力として機能していない。
configについて調べなおしてください。

QC言語以外ならバッファオーバーフローは起きないのでしょうか?

こんにちわ

私はつい最近プログラミング入門したばかりのものです。

いろいろな興味に実力がついていけずとんちんかんな状態です。

ところで、昨今のセキュリティ問題でよく登場するバッファーオーバーフローという
ものは何だろう、と思っていろいろ自分なりに調べてみました。

ある説明文では、C言語のメモリー格納仕様に起因する問題、と書かれていました。

・・・ということは、パスカルなどのような他の言語であれば、バッファーオーバー
フローの心配はしなくてもいいことになるでしょうか?


マック愛好家の間では、MacOSの安全性の高さを大変にアピールしていますが、これは
技術的に言うとMacがPascal言語で開発されていたから、という種明かし、と考えれば
よいことになりますでしょうか?

お暇な方がいらしてましたら、どうかおつきあい頂けましたら幸いです。

Aベストアンサー

#6です、話がそれて雑談というか余談に近づいていますが

ちょっと誤解を招く書き方がありました、コードインタープリタというのは言語ではなく、CPUの中で命令の機械語をフェッチし、インストラクションコードに基づいたアキュムレータの動作、オペランドのアドレス変換をしてデータを取り出す機構で、CPU内部で動く一種のプログラムで、ユーザがいじることは出来ません。コードインタープリタというのも正式名称かはわかりません。

それが、次の実行命令として、インストラクションポインタで指定されたアドレスに格納されているバイト群を取り出すわけですが、このとき、それが、コードかデータかを判断できないと言うことです。

ノイマン型コンピュータでは、アドレス空間はリニアに実装され、そこを適当にコードとデータで分割して使います。この方法にはある程度のルール(低いアドレスは割り込み等のシステムコールに使うなど)はありますが、基本的にはフリーです。データがコードの前にあっても後ろにあっても構わないわけです。


Pascalも、Wirthが考えたPureなパスカルであれば別ですが、現在出回っているPascalは使いやすく(Cと対峙する為もあり)するために拡張が施されているし、実際に使うとなると、すべてを値渡しというわけにも行かず、システムとのインターフェースでは、アドレス渡しをせざるを得ません、で、ここが大きな穴になってしまいます。まあ、BASICだって、ダートマスのPureなBASICは今のBASICとは似ても似つかないものですから仕方ないでしょうけど。


ところで、バッファオーバーフローに限れば、おそらく、プログラムではライブラリで処理しているでしょうから、そのライブラリのコードに問題がある、ところが、そこを書いた人間が退社してしまってわからない。ソースが見つからないなんて事もこの業界ではざらにありますから、おそらく、そんなところではないかと思います。これを書いたプログラマは気が気じゃないだろうなあ(人ごとじゃなく、心臓が縮む思い)。

#6です、話がそれて雑談というか余談に近づいていますが

ちょっと誤解を招く書き方がありました、コードインタープリタというのは言語ではなく、CPUの中で命令の機械語をフェッチし、インストラクションコードに基づいたアキュムレータの動作、オペランドのアドレス変換をしてデータを取り出す機構で、CPU内部で動く一種のプログラムで、ユーザがいじることは出来ません。コードインタープリタというのも正式名称かはわかりません。

それが、次の実行命令として、インストラクションポインタで指定されたア...続きを読む

QC#の演算でオーバーフローしてるみたいなのですが....

C#の演算でオーバーフローしてるみたいなのですが....

8行8列の逆行列を計算するために
C#で逆行列を掃き出し法を使って計算するプログラムを作ったんですが,どうやら,途中でオーバーフローしているみたいで困っています.
行列の各成分はdouble型で保持しています.


今まで,オーバーフローするような桁数の計算を
プログラムで扱ったことがないので,対策方法がわかりません.
みなさんは,オーバーフローにはどのような対策をしているのでしょうか?


どなたか,知恵を貸していただけないでしょうか?
よろしくお願いします.

Aベストアンサー

演算でオーバーフローになるのは、0に限りなく近い値で除算している場合がほとんどです。

例えば、
1-0.1×10
の計算をしたとき、0になるとは限りません。
処理系によっては、0ではなく、10^(-50)のようなの0に限りなく近い値になる場合があります。
それで除算をするとオーバーフローすることがあります。

対策としては、
0に限りなく近い値は0にする
という処理をします。

(0除算のチェックは当然していますよね)

Qバッチファイル goto前の表示のクリア

バッチファイルでgoto前の表示のクリアしたいです。
どうしたらよいでしょうか?
●記述:
:Select
echo 選択_______
echo 1 --- 1です
echo 2 --- 2です
echo 0 --- 終了
set /P Res="入力 >>>>>>> "
if "%Res%"=="1" goto 1
if "%Res%"=="2" goto 2
if "%Res%"=="0" goto END
goto Select
:1
echo.
echo 111
echo.
goto SELECT
:2
echo.
echo 222
goto SELECT
●結果:
選択_______
1 --- 1です
2 --- 2です
0 --- 終了
入力 >>>>>>>1

111

選択_______
1 --- 1です
2 --- 2です
0 --- 終了
入力 >>>>>>>
●入力後表示したい文字列(以下だけ):
選択_______
1 --- 1です
2 --- 2です
0 --- 終了
入力 >>>>>>>

バッチファイルでgoto前の表示のクリアしたいです。
どうしたらよいでしょうか?
●記述:
:Select
echo 選択_______
echo 1 --- 1です
echo 2 --- 2です
echo 0 --- 終了
set /P Res="入力 >>>>>>> "
if "%Res%"=="1" goto 1
if "%Res%"=="2" goto 2
if "%Res%"=="0" goto END
goto Select
:1
echo.
echo 111
echo.
goto SELECT
:2
echo.
echo 222
goto SELECT
●結果:
選択_______
1 --- 1です
2 --- 2です
0 --- 終了
入力 >>>>>>>1

111

選択_______
1 --- 1です
2 --- 2で...続きを読む

Aベストアンサー

clsコマンドでよいですね。
参考
http://hisa-net.ddo.jp/php/dos/dos_command.php


人気Q&Aランキング

おすすめ情報