• ベストアンサー

Pascalの手続きについて

パスカルでプログラムを書いているのですが、わからないところがあるので質問します。 プログラム中で procedure ~(a : array[1..10] of integer); などと宣言すると、この行でエラーが発生しました。 パスカルの手続きでは、配列型の仮引数は使用できないのでしょうか? わかる人がいれば教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

困ったときには JIS を見る. で実際に見ると, この場合には「型名」しか使えません. つまり procedure foo(a: array[1..10] of integer); はダメだけど, type ary = array[1..10] of integer; procedure(a: ary); は OK. なお, 大きさが可変の場合には「整合配列」というものを使うことになり, こちらの場合には procedure foo(a: array[low..high] of integer); とか procedure foo(var a: array[low..high] of integer); という書き方になります (がこれは上位水準なのでコンパイラに依存する). ちょっと見た感じだと, この low とか high を式の中で使えるんじゃないかな. なんか不思議な感じはするけど「大きさが固定された配列を仮引数にする場合には型名を使わないとだめ」「大きさが可変の配列を仮引数にする場合には型名は使えない」ということのようです (大きさが可変の場合には型名を使うことは不可能なはず).

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

program hoge; type ary = array[1..10] of integer; var x : array[1..10] of integer; procedure sub(var a: array of integer); begin writeln('sub'); writeln('lower: ', low(a)); writeln('upper: ', high(a)); end; begin sub(x); end. でも標準Pascalにはlowだのhighだのはなかったような。 どうすんだっけ?

関連するQ&A

  • Pascalで二次元配列、手続きを使ったプログラム

    Pascalで画面に円を描くプログラムを作成しています。 作成する上でいろいろ指定があって、 1.描画領域の確保 char型の二次元配列canvasを準備する  const M=20;  N=20;  var array[1..M,1..N]of char; 2.描画領域のクリア  canvasのすべてにピリオドをいれる手続きclearの作成 3.描画領域の表示  canvasの表示をする手続きdisplayを作成 4.四角を描く  canvasに*で四角を描く手続きsquareの作成  四角の一辺の長さは引数で指定する  ex) square(5); square(9);  (四角は縁を*で表示、他はピリオド なるべくcanvasの中心に) 1,2,3は出来たのですが、4がどうしてもわかりません。 教えて頂けないでしょうか。はっきりわからなければ手がかりでも構いません。

  • delphi 2次元配列がわかりません

    将棋盤の様な9×9マスの配列宣言を a1 : array[1..9, 1..9] of Integer ;とした場合、a1に値を 代入するにはどんな式が考えられますか? a1 : array [1..9] of integer = (394,448,502,556,612,664,721,774,827); みたいに直接括弧内で 代入も可能でしょうか? 超初心者で頭の中で混乱してしまいます。 どなたかお助け下さい。

  • Pascalの可変レコードをC言語で表現したい。

    Pascalの可変レコード型のプログラムをC言語で表現したいのですが 調べた所、共用体(Union)を使えばよいと見つけました。 しかし、どのように対応すればいいのかよく理解ができず困っています。 以下のプログラムをC言語で表現すると、どのようになるのか ご教授していただけないでしょうか。よろしくお願いします。 type Person = record name,firstname: alfa; birthdate: Date; marstatus: (single,married,widowed,divorced); case sex: (male,female) of male: (weight: real;   bearded: Boolean); female: (size: array[1...3] of integer) end

  • c++ セグメントエラー

    あるプログラムをつくっていて、コンパイルはできたのですが、セグメントエラーというランタイムエラーが取り除けません。 エラーの発生している行は特定できました。 その行は、以下のようなものです。 AAA aaa[4][64][4]; AAAは型名、aaaは配列名です。3次元配列の宣言でエラーが発生していました。 エラーの発生している行はこの行で、代入などを行っている部分ではありません。配列の大きさを考えてみても、メモリが足りなくなっているとは考えづらいのですが、他になにか原因はあるのでしょうか? 考えられる原因を教えてください。

  • パスカル→JAVA

    下記のパスカルからJAVAに変えるのですが、わからなくてこまってます。よろしくおねがいします。 { 宣言部 } type ZISU= array[0..99] of real; var n,k :integer; p,VALREAL,VALIMAG: ZISU; { EXTERNAL procedure EVAL ( p:ZISU; n:integer; var VALREAL,VALIMAG:ZISU ); } {$I B:EVAL.SRC} { メ イ ン プ ロ グ ラ ム } begin write(lst,'Input vector'); writeln(lst); read(n); readln; write(lst,' n=',n); writeln(lst); for k:=0 to n-1 do begin read(p[k]); readln; write(lst,p[k]); writeln(lst) end; EVAL(p,n,VALREAL,VALIMAG); writeln(lst); writeln(ist); write(lst,'Output vector [THE DISCRETE FOURIER TRANSFORM]'); writeln(lst); for k:=0 to n-1 do begin write(lst,' ',VALREAL[k],'+(',VALIMAG[k],'*i)'); writeln(lst) end end. 

  • 技術用語の翻訳

    英文マニュアルの翻訳を手伝っているのですが、専門家が日本語でどのように言うのか分からずに困っています。 プログラミングの「配列パラメータ」の説明で、 'Following used only for array parameters 'Range of array rows Dim IMAX as Integer 'Range of array cols Dim JMAX as Integer 'Range of array planes Dim KMAX as Integer 'Range of array books Dim LMAX as Integer 'Range of array shelfs Dim MMAX as Integer という部分があり、注釈行の「rows」や「cols」はそれぞれ「列」「行」と訳すのだろうな(逆でしょうか?)と想像は付くのですが、3次元以上の配列の場合、「planes」「books」「shelfs」は本当にそのまま「面」「本」「棚」と訳して通じるのだろうか? と、悩んでいます。 数学分野で教えていただけるかと一度質問をしたのですが、聞きたい内容を理解していただけるようにうまく質問できなかったため、改めてこちらで伺います。 よろしくお願いいたします。

  • Pascalにて入力した式の演算

    タイトルのとおり、Pascalにて入力した式の演算を行うプログラムを作ろうと考えています。 例えば 1 + 3 * 3 = と入力すると10と出力されるようなものです。 そこで、アルゴリズムとしては 式を全てcharとしてread 括弧があるか探し、あるなら括弧閉じるを探す 括弧内で乗除算を探す その右と左の数をintegerなりに変換して演算 以下同様に計算 …という風に考えました。 そこで質問なのですが、 式のreadをするとき、変数は配列型でいいのでしょうか 配列型だとひとつの配列に二桁以上の数ひとつだけ、という風にしか収納出来ないと思うので、これでは不可能な気もします。 また配列型では不可ならどうすればいいでしょうか。 次に、式をreadした後、そのreadをどのようにして終わらせるか 以上二点がよく分からないので、よろしければお答え願います。 また私の考えが大きく違う時等も御指示お願いします。

  • Delphiでの条件分岐について

    すいません。ちょっとわからないので、質問させて頂きます。 Delphiで下記のようにIntegerの配列を宣言したとします。 var hoge : array [1..5] of integer; この配列の全ての要素のうち、ひとつでも「1」(いち)と言う値であれば、 配列の全てを「0」(ぜろ)にすると言う条件分岐(if)を作りたいのです。 どのようにして作ればいいでしょうか? 一つずつ下記(途中までですが)のように書けば出来そうですが、配列の数が 増えた場合に大変面倒な事になりそうなので、何か良い知恵があれば よろしくお願い致します。 if( (hoge[0]=1) or (hoge[1]=1)・・・・){ //配列全てに0を代入 }

  • パスカルの三角形をRubyで作る際、2次元配列をつかって、以下のように

    パスカルの三角形をRubyで作る際、2次元配列をつかって、以下のようになりました。 ビットファイルの作成部分や、ピクセルの指定の部分は省略します。 pas = Array.new(HEIGHT) {|i| Array.new(WIDTH, 0)} pas[0][WIDTH / 2] = 1 for i in (1..HEIGHT - 1) for j in (1..WIDTH - 2) pas[i][j] = pas[i - 1][j - 1] + pas[i - 1][j + 1] end end この中で、pas[i][j] = pas[i - 1][j - 1] + pas[i - 1][j + 1]とありますが、 (i,j)=(1,1)とすると、pas[1][1] = pas[0][0] + pas[0][2]で、 (i,j)=(1,2)とすると、pas[1][2] = pas[0][1] + pas[0][3] で続いていくわけですが、これでパスカルの三角形がなぜかけるのか、非常に疑問です。 どなたか、このプログラムがどうしてパスカルの三角形が書けるのか、プログラムの流れに沿って解説できる方、いらっしゃいませんか?

    • ベストアンサー
    • Ruby
  • 関数の仮引数は宣言か式か

    ”関数の仮引数の宣言”は”変数の宣言・定義”と同じように”宣言”と明確に考えるべきなのか”関数の仮引数”を”式”と考えて良いのかという問題です。 私が迷ってしまったのは"配列を仮引数"にとった例です。 規則として ”int a[ ] が int *a と同じ意味になるのは、唯一、関数の仮引数の宣言のばあいだけである”という規則がありますが、これは”関数の仮引数の宣言”は変数の宣言・定義”と同じように”宣言”と明確に考えている例だとおもいます。 int a[ ] が int *a と型名 変数名(引数名)と宣言の形をとっているので当然だと思いますが、一方 配列は、式の中で「先頭へのポインタ」によみかえられる。               ↓ 関数の引数は式なので、配列は「先頭へのポインタ」に読み変えられる←引数部分を”宣言”ではなく”式”と捉えてる←ここが私の迷っているところ               ↓ よって、関数に渡ってくるのは、結局はつねにポインタだ。 という説明もあります。 私の今までの理解ではc言語では”宣言の部分”と”式”の部分は明確に区別されるものと考えていました。”宣言部分の初期化の="と”代入の=”とは明確に区別されていました。 それと同じように”関数の仮引数の宣言”は”宣言部分”と捕らえるのか”式”ととらえるのか ”宣言”と”式”が私の頭の中混乱しています。 宜しくお願いします。