以下のような構文があります。
ループ中にAに1234の値、Bに1234の値がセットされていますが、
ループを抜けません。どうしてでしょうか?
なお、データ項目A,BのサイズをX(4)にすると、抜けます。

01 A PIC X(5)
01 B PIC X(5)
   :
PERFORM UNTIL A = B
   :
END-PERFORM

A 回答 (2件)

>Aに1234の値、Bに1234の値がセット


>なお、データ項目A,BのサイズをX(4)にすると、抜けます。
>
>01 A PIC X(5)
>01 B PIC X(5)

どのような方法で、値をセットしているのでしょうかね?

たぶん、#1さんの回答のように、'1234 '、' 1234'といったように、空白が入ってしまって、その位置が違うのではないかと思います。

X(n)は、文字のデータ型ですから、数値なら9(n)で宣言すればいいのでは?

COBOLの場合、Xタイプや集団項目にMOVEすると、通常は左詰で転記され、桁数に満たない部分には空白が入ります。JUST RIGTHといった宣言があると、右詰になります。

9タイプは数値で、外部10進であれば、右詰で前方には0が入ります。数値以外を入れ、演算等を行うとデータ例外が発生します。

具体的な値のセット方法などが提示されれば、より具体的なアドバイスができるかも知れません。
    • good
    • 0

多分A,Bの内容が食い違っているからだと思います。

食い違うパターンとして
A                   B
1234△               △1234
△1234               1234△
というようなデータがはいってませんか? 
x(05)なので設定の仕方で、必ずスペースが左右どちらかに入るとおもいますが!
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

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

QExcelでヘルプファイルを作る方法

Excelでプログラムを作ったのですが、その操作方法としてヘルプファイルを作ろうと思い、質問したところ、ヘルプファイルを作成するには「ヘルプコンパイラ」というユーティリティが必要だと分かったのですがWinHelpとHtmlHelpとどちらの方がよいのでしょうか?
また、試しに無償で配布しているマイクロソフトのヘルプコンパイラ「HTML Help Workshop」をインストールしてみたのですが、「Error creating process <C:\DOCUME~1\b\LOCALS~1\Temp\xp000.TMP\setup.exe>. Reason:指定されたパスが見つかりません」というエラーが出てインストールできませんでした。この解決方法はどのようにすればよいでしょうか?
この2点の質問の回答よろしくお願いします。 

Aベストアンサー

エラーの件、半角アルファベットのユーザーじゃないとエラー。
http://www.keiyu.com/help/qa4.htm
http://okwave.jp/qa804315.html

WinHelp か HTML Help かの件、Windows 98 以降は HTML Help でしょう。
作成も HTML が書ければ簡単にできますし。

ただし Vista では HTML Help が使えない。使うためにはマイクロソフトのサイトから Vista 用の winhlp32.exe をダウンロードしてインストールするしかない。てな問題もありますがね。

Qオブジェクト指向における「クラスA have a クラスB」の関係において,クラスBからクラスAのあるメンバ変数だけを触る方法

クラス10~50個の中規模プログラミングに当たって,以下の問題がよく出てきて,
「簡潔な方法はないものか・・・」と悩んでいます.

●前提条件
【・「クラスAに持たれているクラスB( A have a B 関係)において,
  クラスBからクラスAのあるメンバ変数(プロパティ)だけを触りたい」】

この場合,私はよく以下のようにしてしまい,クラス間の独立性を無くしてしまいます.
●方法1:
・クラスBのコンストラクタに「自分の持ち主であるクラスAのオブジェクト」を引数に取り,クラスBの変数(プロパティ)usedClassAとする.

=======
C言語風に書くと,
<code>
public void クラスA{
  クラスB usingClassB = new クラスB(); // 持っているクラスB
  int commonNum = 0;
  public void AddCommonNum(){
      commonNum++;
   }
   ...
   (その他の処理)
   ...
}

public void クラスB{
   class usedClassA;    // 持ち主のクラスA

   // コンストラクタ
   public クラスB(クラスA _usedClassA){
       usedClassA = _usedClassA;
   }
   public void AddCommonNum(){
       _usedClassA.AddCommonNum();
   }
}
<\code>
となります.

この方法の問題点は,クラスAとクラスBに<双方向の依存関係を作っている>ことで,
クラスAの設計(ここではAddCommonNum())が変更されたときに,クラスBの内容を変更しなければならない可能性があることから,拡張性に欠けると考えています.

そこで,他に何かいい実装方法が無いか,
教えていただけないでしょうか?
特に,このような前提条件に汎用的に使える方法だと尚良いです.

クラス10~50個の中規模プログラミングに当たって,以下の問題がよく出てきて,
「簡潔な方法はないものか・・・」と悩んでいます.

●前提条件
【・「クラスAに持たれているクラスB( A have a B 関係)において,
  クラスBからクラスAのあるメンバ変数(プロパティ)だけを触りたい」】

この場合,私はよく以下のようにしてしまい,クラス間の独立性を無くしてしまいます.
●方法1:
・クラスBのコンストラクタに「自分の持ち主であるクラスAのオブジェクト」を引数に取り,クラスBの変数(...続きを読む

Aベストアンサー

 こんにちは。
 簡単な話、共通のプロパティクラスを作成して、ClassAとClassBが其れを参照したり更新したりすれば、ClassAとClassBは左程依存しないのでは。
 一応C++で、其れらしき事をしてみましたので、参考程度に。

#pragma warning(disable : 4786)
#include<map>
#include<string>

//プロパティオブジェクトココから
struct IVariantHolder
{
  virtual ~IVariantHolder(){ }
};

template<class __TP>
struct CVariantHolder : public IVariantHolder
{
  typedef typename __TP variant;

  explicit CVariantHolder(const variant& val) : m_val(val){}
  ~CVariantHolder(){}

  variant& Get(){ return m_val; }
  const variant& Get() const { return m_val; }
  operator variant&(){ return m_val; }
  operator const variant&() const { return m_val; }
private:
  variant m_val;
};

struct CPropertyData
{
  typedef std::map<std::string, IVariantHolder*> map_t;
  template<class __TP>
  bool AddProperty(const __TP& tp, const std::string& sPropertyName)
  {
    if(GetProperty(sPropertyName))return false;
    return m_map.insert(std::make_pair(sPropertyName, new CVariantHolder<__TP>(tp))).second;
  }
  IVariantHolder* GetProperty(const std::string& sPropertyName)
  {
    return const_cast<IVariantHolder*>(
                static_cast<const CPropertyData&>(*this).GetProperty(sPropertyName)
                     );
  }
  const IVariantHolder* GetProperty(const std::string& sPropertyName) const
  {
    map_t::const_iterator it = m_map.find(sPropertyName);
    return it == m_map.end() ? 0 : it->second;
  }
private:
  map_t m_map;
};

template<class __TP>
static __TP* Lock(CPropertyData* property, const std::string& sPropertyName)
{
  CVariantHolder<__TP>* pVal = dynamic_cast<CVariantHolder<__TP>*>(property->GetProperty(sPropertyName));
  return pVal ? &pVal->Get() : 0;
}
//プロパティオブジェクトココまで

//テスト用の構造体
struct CommonStruct
{
  CommonStruct(long _l, short _s, char _c) : l(_l), s(_s), c(_c){}
  longl;
  shorts;
  charc;
};

//クラスAとクラスBココから
struct ClassB;
struct ClassA
{
  ClassA(ClassB* p, CPropertyData* property) : m_useClassB(p), m_property(property)
  {
    //ココでメンバ変数(プロパティ)の領域を動的に作成する
    m_property->AddProperty(int(0), "commonNum");
    m_property->AddProperty(CommonStruct(4, 2, 1), "commonStruct");
  }
  void DisplayProperty()
  {
    ::printf("%s %d %s\n", "[commonNum : ", *::Lock<int>(m_property, "commonNum"), "]");

    CommonStruct* p = ::Lock<CommonStruct>(m_property, "commonStruct");
    ::printf("%s <%d><%d><%d> %s\n", "[commonStruct <l><s><c> : ", p->l, p->s, p->c, "]");
  }
private:
  ClassB*m_useClassB;
  CPropertyData*m_property;
};

struct ClassB
{
  explicit ClassB(CPropertyData* property) : m_property(property){}
  void AddCommonNum()
  {
    int* pi = ::Lock<int>(m_property, "commonNum");
    (*pi)++;
  }
  void SetCommonStruct(long l, short s, char c)
  {
    CommonStruct* pc = ::Lock<CommonStruct>(m_property, "commonStruct");
    new (pc) CommonStruct(l, s, c);
  }
private:
  CPropertyData*m_property;
};
//クラスAとクラスBココまで

//お試し
int main()
{
  //両方に共通なプロパティオブジェクト
  CPropertyData property;

  //クラスBに渡す
  ClassB b(&property);

  //クラスAにクラスBとプロパティオブジェクトを渡す
  ClassA a(&b, &property);

  //クラスBでプロパティを操作する
  b.AddCommonNum();
  b.SetCommonStruct(10, 20, 30);

  //クラスAでプロパティを表示する
  a.DisplayProperty();
  return 0;
}

 こんにちは。
 簡単な話、共通のプロパティクラスを作成して、ClassAとClassBが其れを参照したり更新したりすれば、ClassAとClassBは左程依存しないのでは。
 一応C++で、其れらしき事をしてみましたので、参考程度に。

#pragma warning(disable : 4786)
#include<map>
#include<string>

//プロパティオブジェクトココから
struct IVariantHolder
{
  virtual ~IVariantHolder(){ }
};

template<class __TP>
struct CVariantHolder : public IVariantHolder
{
  typedef typename __T...続きを読む

QC言語のプログラミングの環境を作る

C言語のプログラミング環境でおすすめは何でしょうか?

今まではterapadを使ってプログラミングし、
borlandとTpCcでコンパイラさせていました。

それもいいのですが他にもっと便利なものがあるのでは?
と今回リカバリしたのをいい機会として考えました。

そこでみなさんのおすすめのC言語のおすすめ環境を教えて下さい。
お願いします。

Aベストアンサー

そりゃViualStudioですね。無料だし。

QCOBOL85からCOBOL2002移行

HPのOSバージョンアップして、COBOL85からCOBOL2002移行の作業をしました。再コンパイルして、生成されたモジュール(又はオブジェクトファイル.o)のサイズは元の2、3倍になってしまいましたが、どういうことですか?ご教示お願いします。

Aベストアンサー

>なぜバイナリ構造が変更したら、実行モジュール大きくなるのは
>少し、詳しく教えていただけませんか。
ちゃんと書くと長いので掻い摘んで描くと
RISCではコンパイル時点で命令を細かく分け、実行時に並列計算できるもの探して実行していましたが、
Itaniumで採用したEPICではコンパイル時点で並列部分を抽出し実行モジュールに並列情報を持たせています。
アーキテクチャが変わると実行モジュールの構成(サイズ)が変わるのは仕方がないことです。

QVC++でソースファイルに2つのデータを作る場合。

Microsoft Visual C++ 2008 Express Editionというコンパイラを使っています。

新しいプロジェクトを作成すると、ソースファイル、ヘッダーファイル、リソースファイルの3つのフォルダが作成されます。
ソースファイルのフォルダに.cppのプログラムを作成しています。
もう一つ別のプログラムを実行しようと思って、ソースファイルのフォルダにプログラムを追加して実行すると必ずエラーが出てしまいます。
エラーの内容は「1 つ以上の複数回定義されているシンボルが見つかりました。」のようです。

1つのソースファイルに2つ以上のプログラムは作れないのでしょうか?

Aベストアンサー

>もう一つ別のプログラムを実行しようと思って

だったら「今のプロジェクトをすべて閉じてから、別のプロジェクトを開く」ってやらないと駄目。

「プロジェクト1個につき、プログラム1個」と決まってます。

そして「プログラム1個につき、実行開始場所は1ヵ所」と決まっています。

さらに「実行開始場所の名前は、固定になってて変えられない」と決まっています。

そうすると「1個のプロジェクトに、2個のプログラムがあると、名前が固定になってて変えられない実行開始場所が2ヶ所」になってしまいます。

「名前が固定になってて変えられない実行開始場所が2ヶ所」あれば、当然「1 つ以上の複数回定義されているシンボルが見つかりました。」って言われて当たり前です。

1個しかあっちゃいけない物を2個にしたんですから、当然と言えば当然。

2つのプログラムを同じに開きたいなら「VCを2つ起動」しなきゃなりません。そして、それぞれのVCで、異なるプロジェクトを1個だけ開いて下さい。

QRGB値をL*a*b*に変換したい

VC++で画像処理のプログラムを組んでいます。
RGB値からL*a*b*への変換式はネット上にあるんですが、
実際コーディングして、出た値が正しいのかどうかを確かめるすべがないので困っています。
任意のRGB値を入力して、Lab値を取得する手段はないでしょうか?
ちなみに私の研究室にはフォトショとイラレはあります。
このへんのツールを使うとできたりするんでしょうか?

Aベストアンサー

バージョンによるかもしれませんが、フィトショのカラーピッカー(描画色をクリックすると出るやつ)にLabが表示されているので、RGBを入力すればLabの値が得られます。
なんらかの補正がかかっているかどうかは良くわかりません。

Qbmpファイルビューアを作るため

猫のサイトのコードを使って

void OpenImgFiles(HWND hWnd)
{
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter =
"BMP files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0";
ofn.lpstrFile = FileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST;
ofn.lpstrDefExt = "bmp";
ofn.nMaxFileTitle = 64;
ofn.lpstrFileTitle = FileTitle;
ofn.lpstrTitle = "ファイルを開く!";
if (GetOpenFileName(&ofn)) {
show = 1;
InvalidateRect(hWnd, NULL, TRUE);
}
return;
}

を呼び出してファイルを開くためのダイアログボックスを表示しようとしてのですが無応答で何も表示してくれません
コンパイラは無償Borland C++5.5です
何が悪いか教えてください

猫のサイトのコードを使って

void OpenImgFiles(HWND hWnd)
{
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter =
"BMP files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0";
ofn.lpstrFile = FileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST;
ofn.lpstrDefExt = "bmp";
ofn.nMaxFileTitle = 64;
ofn.lpstrFileTitle = FileTitle...続きを読む

Aベストアンサー

参考URLを見るべし。
「Borland C++ 5.5.1 でファイルオープンダイアログが表示されないトラブルについて。」

参考URL:http://homepage3.nifty.com/aokura/tips/trouble.html

Q最大値が0b100である3bit同士の加算の式

最大値が2進0b100の3bitと3bitの加算を最小の回数及び論理演算(or,and,xor,not)でやりたいのですが難しくていいのが思いつけません……
教えてもらえると助かります。

ちなみに、最大値が0b100というのは1bit同士を加算した2bit、その2bit同士を加算した3bitが最大値0b100の3bit同士を加算したいからです。
2bit同士は、c0 = a0^b0, c1 = (a0&b0) ^ (a1^b1), c2 = a1&b1 //a+b=c// という感じで行けました。

そしてかなりの回数一連の処理を行うので最小の回数でやりたいのです。

Aベストアンサー

キャリーアップは変数化が必要だと思います

e0 = c0 ^ d0
cf = c0 & d0
e1 = (c1 ^ d1) ^ cf
cf = (c1 & d1) | (c1 & cf) | (d1 & cf)
e2 = (c2 ^ d2) ^ cf
e3 = c2 & d2 // キャリーアップの必要なし

Qパズルを作る

先日、学校でこんな課題が出されました。

「5×5の盤面の何カ所かにライトが点灯している(下の図で黒く示した部分)。

  0 1 2 3 4
0□□□□□
1□■■□□
2□■□□□
3□□□□□
4□□□□□

ここで(x,y)=(2,2)の場所のライトを点灯させる。すると、この部分を中心に上下左右1マスのライトの点灯/消灯が反転する。斜め方向のライトは影響を受けない。

  0 1 2 3 4
0□□□□□
1□■□□□
2□□■■□
3□□■□□
4□□□□□

これを繰り返し、すべてのライトを点灯させたら終わり。

上記のプログラムを作成せよ。どの場所のライトを点灯/消灯させるかをキー入力させて盤面を更新し、終了条件(すべて点灯)を満たすまでループするようにする。最初にどこが点灯しているかという「問題」は各自で適当に作成してよい。」

というものなのですが、はっきり言って手も足も出ません。どなたか詳しい方、どうか作成方法を教えて下さい。ちなみに使っているパソコンのOSはFreeBSD 4.9-RELEASEで、コンパイラはgcc for version 2.0です。

先日、学校でこんな課題が出されました。

「5×5の盤面の何カ所かにライトが点灯している(下の図で黒く示した部分)。

  0 1 2 3 4
0□□□□□
1□■■□□
2□■□□□
3□□□□□
4□□□□□

ここで(x,y)=(2,2)の場所のライトを点灯させる。すると、この部分を中心に上下左右1マスのライトの点灯/消灯が反転する。斜め方向のライトは影響を受けない。

  0 1 2 3 4
0□□□□□
1□■□□□
2□□■■□
3□□■□□
4□□□□□

これを繰り返し、すべてのライトを点灯させたら終わり。

上記のプログラムを作成...続きを読む

Aベストアンサー

課題ということなのでヒントを出しますので
がんばりましょう。

概略のフローは次のようになると思いますが
どこがわからないのでしょうか。

1) ライトの状態を格納する5x5の二次元配列に「問題」を作る(点灯=1, 消灯=0)
2) ライトの状態を表示する
3) どのライトを点灯させるか入力させる
4) 入力された位置と上下左右に相当する値(1/0)を反転させる
5) ライトの状態を表示する
6) 配列の値をチェックしすべて1になるまで3)から繰り返す

QCOBOL97,Power-COBOLでの効率の良い書き方

汎用機のCOBOLでは添字にはCOMP-1を使うと効率が良いとか、ベースレジスタ削減のために 01レベルのワーク領域の数を減らす(少数の01レベルの配下にワーク領域を定義する)などがマニュアルに記載されていました。
ところがパソコン/サーバ上で動くCOBOLの場合は、計算用にCOMP-3を使うと処理効率が悪い、計算用ではCOMP-3よりはDISPLAY項目、さらに良いのはCOMP-5である、などと言う記事もあり汎用機COBOLとはずいぶん違うようです。実際のところ、パソコン/サーバ上で動くCOBOLで実行時の効率が良いプログラムを書くためには、どのような事に注意すれば良いのでしょうか?

Aベストアンサー

以下が参考になるのでは?

http://q.hatena.ne.jp/1171405263

>>実際のところ、パソコン/サーバ上で動くCOBOLで実行時の効率が良いプログラムを書くためには、どのような事に注意すれば良いのでしょうか?

昔は、汎用機やオフコン、パソコンでCOBOLのアプリを書いていました。ハードレベルのことは、よくわかりませんが、記載されていたとおりだという気がしますね。でも、メモリーや処理効率が悪とはいっても、人間のレベルからしたら、気にしないでもいい程度だと思いますよ。

個人的には、メモリ効率等よりも汎用機・オフコンなどとソースの共用ができるほうが良いと思うので、汎用機に合わせたいところですが、汎用機で使う予定が無いならパソコン・サーバ上でベストな指定でもいいかもしれませんね。

そして、数値計算(特にお金の計算)では、10進で行われるCOMP-3が計算誤差やデバッグの容易さで有利だと思えます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報