お世話になっております。
プログラミングの際に(Cに限らず)プロシージャという言葉をよく目にします。が意味が良く分からず困っておりま。

このプロシージャ、という言葉はC言語で言うと具体的にはどのようなものをさしているのでしょうか。

書物、WEB等いろいろと検索をしたのですが、
サブルーチンのようなものかな?
という理解しか出来ませんでした。
しかし、サブルーチンでしたらサブルーチンと言えば良い訳ですし、プロシージャなどという言葉は必要無いはずです。

恐れ入りますが、プロシージャとは何かについて、おわかりの方がいらっしゃいましたらご教授ください。

宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

ASCII24の記述はずい分といい加減な気がします。


私の知る限り、関数とプロシージャをそんな風に区別する
「古いBASIC」はありません。
最もはっきりしているのはPASCALで、これはまさに
ここに書かれている通り、値を返すものがfunctionで
返さないものがprocedureです。(PASCALは構造化の元祖
のように見られたりもする言語ですから、「構造化以前」
というのもおかしい。)
例えば、Integerを返す関数aと値を返さないプロシージャbは
こんな書き方をします。

function a(x:Integer):Integer
begin
 ...
end

procedure b(x:Integer)
begin
 ...
end

いずれもCでは関数として記述されるのは、leaz024さんの
書かれている通りで、間違いありません。
    • good
    • 0
この回答へのお礼

お返事が遅くなりましたが、
ご回答ありがとうございました。

常々思うのですが、コンピュータの言葉は英語なので
今回のように言葉で詰まってしまう分、日本人は不利
なのかなとも思います。
英語の勉強も、怠けず頑張りたいと思います。

どうもありがとうございました。

お礼日時:2001/10/29 16:10

「プロシージャ」は、Cでは関数になります。


意味などについては、下記サイトで調べてみて下さい。

参考URL1:情報・通信事典e-Words
参考URL2:アスキーデジタル用語辞典

参考URL:http://www.e-words.ne.jp/, http://yougo.ascii24.com/
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

e-WORDS は検索したのですが意味がわからず、ASCII24は
検索結果が多すぎて、見落としていました。

ASCII24 の解説の中に

「古いBASICでは、値を返すものが関数で、値を返さないものをプロシージャと呼んでいた記憶がある」

とありますが、ここが引っかかっていたのです。
私の同僚はプロシージャと関数の違いをまさにこのように説明してくれたのですが、
Cにおいて、ポインタで配列をサブルーチンに渡し、サブルーチン側で、配列の値を変更して、サブルーチンからは値を返さない。
となれば事実上、関数なのにプロシージャになってしまう。
というのが、今回の質問の発端でした。

これですっきりしました。
どうもありがとうございました。

お礼日時:2001/10/24 09:32

procedure(手続き、手順、手順書)のことでしょう。

この回答への補足

ご回答ありがとうございます。

重ね重ねの質問で恐縮ですが、
C言語においては、手続き、手順、手順書 はそれぞれ
何を表しているのでしょうか?

補足日時:2001/10/24 09:19
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

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

Q文字列配列をサブルーチンにアドレス渡ししてscanf入力

main関数内で
char strarray[3][21]
という文字列配列を宣言し、
サブルーチンvoid input(・・・)内でscanfを使って
strarray[0]~strarray[2]の各行に入力を行うとします。
ここでポインタを引数としてstrarrayをmainとinputで共有する場合、
strarrayに関して以下の項目はどう記述すればよいのでしょうか?

1)inputを宣言する際の仮引数の書式
2)main内でinputを呼び出す際の引数の書式
3)input内でscanfする際の引数の書式

いろいろ組み合わせを試してはみたのですが、
どうにもSegmentationFaultを回避できません。
いい加減混乱してきたので、そろそろすっきりと整理したいと思っています。
よろしくお願いします。

…まあ「構造体使えばいいじゃないか」と言われてしまえばそれまでなのですが…

Aベストアンサー

まず、配列とポインタの関係から説明します。

C 言語の場合、配列はコンパイラによって、その「先頭要素を指すポインタ」に読み替えられます。

つまり、int hoge[10]; と定義した配列に対して、式の中で hoge と書くと、これは int*型の変数として扱われて、それは &hoge[0] と同じ意味になります。
# 一部例外はあります。
# たとえば、sizeof(hoge) とした場合、ポインタサイズではなくて、配列のサイズが
# 取得できます。

で、これをそのまま配列の配列に適用してみれば良いわけです。

どうなるかというと、char piyo[3][10]; と定義した変数に対して、式の中で piyo と書けば char(*)[10]型の変数として扱われて、それは &piyo[0] と同じ意味になります。

char(*)[10] 型と書きましたが、これは「char型配列(要素数10)を指すポインタ型」のことです。
配列を指すポインタ型の変数を定義する場合には、次のように書きます。
char (*p_piyo)[10];

つまり、piyo はもともと「char型配列(要素数10)の配列(要素数5)」だったわけですよね。
これが、コンパイラによって「char型配列(要素数10)を指すポインタ」として扱われるようになるわけです。

注意点としては、この配列→ポインタの読替え規則は再帰的には行われないことですね。
どういうことかというと、配列の配列は、ポインタのポインタにはならず、配列のポインタにしかならない、ということです。

さて、前置きが長くなりましたが、話を etendard さんのご質問に戻します。

1) これまでの話で、char strarray[3][21] に対してコンパイラが読み替える等価な型が char (*str_ptr)[21] となることはおわかりいただけると思います。

関数の引数に配列を渡す場合は、必ずポインタに読みかえられますので、仮引数の宣言もポインタに読み替えられた方の型で書くことになります。
# というよりも、配列を渡すことができないので、配列の先頭要素を指すポインタを
# 渡している、という言い方のほうが正しいのですけどね。

つまり、プロトタイプは

void input( char (*str_ptr)[21] );

のようになります。
できれば、配列の要素数も一緒に渡せるようにするのが良いでしょう。

その場合は、こんな感じです。

void input( char (*str_ptr)[21], int num );

2) 関数コールする場合は次のようにします。

input( strarray );

要素数付きの場合は、次のようにします。

input( strarray, 3 );

要素数付きにしたほうが良い理由は、ポインタに読み替えられた方の配列の要素数が、関数に渡らないためです。

標準関数では、gets() なんかはその典型ですよね。
# バッファオーバーランの原因となるということで、WARNING を吐くコンパイラも
# あるとか。。。

それに対して fgets() は文字列の数も渡せるので、より安全だといえます。
要するに、それと同じことです。

3) input() の中で scanf() する場合には、次のようにすれば良いです。

for ( i=0; i<3; i++ )
{
scanf( "%s", str_ptr[i] );
}

# なぜこれで良いのかは、よく考えてみてください。

同様に、要素数付きの場合には次のようにします。

for ( i=0; i<num; i++ )
{
scanf( "%s", str_ptr[i] );
}

ちなみに、関数の仮引数の場合に限り、ポインタ宣言と配列宣言は同じ物になります。
# というよりも、いずれもポインタ宣言になります、といった方が正しいです。

つまり、以下の表記はいずれも同じ物になります。

void input( char (*array_ptr)[21] );
void input( char array_ptr[][21] );
void input( char array_ptr[3][21] );

ただし、3番目の表記をした場合であっても、[3] の部分の要素数は無視されます。
# コンパイラが勝手にポインタに読み替えてしまいますからね。

宣言や定義について、このような読替えが起こるのは関数の仮引数宣言の場合だけです。
通常の、宣言や定義ではこのような読替えは起こりませんのでご注意ください。

かなり長くなってしまいましたが、こんな感じでいかがでしょうか。

まず、配列とポインタの関係から説明します。

C 言語の場合、配列はコンパイラによって、その「先頭要素を指すポインタ」に読み替えられます。

つまり、int hoge[10]; と定義した配列に対して、式の中で hoge と書くと、これは int*型の変数として扱われて、それは &hoge[0] と同じ意味になります。
# 一部例外はあります。
# たとえば、sizeof(hoge) とした場合、ポインタサイズではなくて、配列のサイズが
# 取得できます。

で、これをそのまま配列の配列に適用してみれば良いわけです。

どうな...続きを読む

QCからFortrunサブルーチンをコールする方法

以前Fortrunで作ったサブルーチンを新たにCからコールする方法がわかりません
Cの方でFortrunのサブルーチン名を宣言すればいいと思うのですが。。。
よろしくお願いします

Aベストアンサー

一般的にCからフォトランのサブルーチンを使うことはできません。そのため無理だと思います(もしかしたらインラインフォトランに対応したCコンパイラとかあるのかもしれませんが、その可能性は低いと思います)。
普通はフォトランで作ったソースコードをC言語に変換して使います。つまりフォトランのサブルーチンを完全に書き換えることになります。例える英語から日本語に翻訳するようなものです。

Q「ルーチン」という言葉の意味

私は、C言語を勉強中のものですが、
「ルーチン」という言葉は具体的にどういう意味なのですか、
お教えください。

C言語では、「関数」と同義語でしょうか。


「新ANSI C言語辞典」(平林雅英 著、 技術評論社)の「ルーチン」の説明:

定められた処理をするためのプログラムのひとかたまり

Aベストアンサー

まず、関数と同義語ではありません。

ルーチンと言うのは主観で決まると言うのもあながち嘘ではありません。
メインルーチン、サブルーチン、~処理ルーチンなどまさに設計者の主観によります。

一つだけ言えるのは1命令でルーチンと言うことはまず無いと言うことです。
数命令以上が集まって所定の目的を果たすもの、ということで、極端な例としてはプログラム=ルーチンと言うこともあるということでしょう。

この考え方から行けば、関数の中に沢山のルーチンがあったり、ルーチンの中に関数が沢山あっても一向に不思議ではありません。

要は設計者が、どの部分をルーチン(ひとかたまりの仕事)と認識するかにかかっているわけですから。(~処理部と言う程度の意味なのですから)

Q文字コード判別ルーチンGetCodeの使用方法

文字コード判別ルーチンGetCodeの使用方法

メールマガジン「.NETプログラミング研究」で紹介されている文字コード判別ルーチンGetCode(http://dobon.net/vb/dotnet/string/detectcode.html)を利用してサイトからダウンロードしたHTMLの文字コード変換をしています
思う通りに変換出来ることもありますが、目も眩むような宇宙語になってしますことも多々あります
このGetCodeルーチンは既にVB.NETでもC#でも相当な実績があると評価されています
ですから使用方法の誤りなのでしょう
ご指摘頂ければ幸いです
ソース(C#)は下記の通りです

string MyReadString; //変換後のHTML文書が格納される

using ( WebClient MyClient = new WebClient())
using ( Stream MyStream = MyClient.OpenRead(http://www.~~))
using ( MemoryStream MyMemoryStream = new MemoryStream())
{
byte[] ByteBuffer = new byte[4096]; //サイトからHTML文書を
MyMemoryStream.Seek(0, SeekOrigin.Begin); // Memory Streamに読込み
while (true)
{
int ReadByteLength = MyStream.Read(ByteBuffer, 0, ByteBuffer.Length);
if (ReadByteLength <= 0) { break; } //読込み終了
MyMemoryStream.Write(ByteBuffer, 0, ByteBuffer.Length);
}

byte[] AllHTML = new byte[MyMemoryStream.Length]; //全HTML文書を
MyMemoryStream.Seek(0, SeekOrigin.Begin); // byte配列に読込み
MyMemoryStream.Read(AllHTML, 0, AllHTML.Length);

System.Text.Encoding enc = GetCode(AllHTML); //文字コードを判定する ←←←この箇所です
MyReadString = enc.GetString(AllHTML); //判定された文字コードで
} // byte配列からstringへ変換する

文字コード判別ルーチンGetCodeの使用方法

メールマガジン「.NETプログラミング研究」で紹介されている文字コード判別ルーチンGetCode(http://dobon.net/vb/dotnet/string/detectcode.html)を利用してサイトからダウンロードしたHTMLの文字コード変換をしています
思う通りに変換出来ることもありますが、目も眩むような宇宙語になってしますことも多々あります
このGetCodeルーチンは既にVB.NETでもC#でも相当な実績があると評価されています
ですから使用方法の誤りなのでし...続きを読む

Aベストアンサー

1,文字コードの自動判定に関して
 自動化を完璧にするのは無理と思われます。
 文中のプログラムをどのように活用されるのかは分かりませんが、
 呼び出し側が自動判定以外に任意の文字コードを指定できるようにする方が個人的には良いと思います。

2,MyMemoryStream.Write(ByteBuffer, 0, ByteBuffer.Length); の部分ですが、
 MyMemoryStream.Write(ByteBuffer, 0, ReadByteLength);が正しいのではありませんか?
 ReadByteLengthが4096以下の場合に余分なゴミデータをMemoryStreamに書き込んでいると思われます。
 念のためデバッグで確認してみてください。

3,以下の部分でMemoryStream からbyte配列にコピーしているようですが、
 MemoryStream.ToArrayを使用すれば、コピーを自分で書く必要はないはずです。
//ここから
 byte[] AllHTML = new byte[MyMemoryStream.Length]; //全HTML文書を
 MyMemoryStream.Seek(0, SeekOrigin.Begin); // byte配列に読込み
 MyMemoryStream.Read(AllHTML, 0, AllHTML.Length);
//ここまでを
//下の行にする
 byte[] AllHTML = MyMemoryStream.ToArray();

□参考URL
MemoryStream.ToArray メソッド
http://msdn.microsoft.com/ja-jp/library/system.io.memorystream.toarray(v=VS.80).aspx

1,文字コードの自動判定に関して
 自動化を完璧にするのは無理と思われます。
 文中のプログラムをどのように活用されるのかは分かりませんが、
 呼び出し側が自動判定以外に任意の文字コードを指定できるようにする方が個人的には良いと思います。

2,MyMemoryStream.Write(ByteBuffer, 0, ByteBuffer.Length); の部分ですが、
 MyMemoryStream.Write(ByteBuffer, 0, ReadByteLength);が正しいのではありませんか?
 ReadByteLengthが4096以下の場合に余分なゴミデータをMemoryStreamに書き込んでいると思...続きを読む

QVC7で作成したルーチンをC++Builderで使用するには?

C++ Builder(Ver5)を使って簡単なGUIのアプリが作れるように勉強しています。
最近、あるHPでimplib.exeを使えばVC用のライブラリを取り込めることを知り、市販のライブラリで試したところ、容易に取り込むことが出来ました。

ここでご質問です。
今まで私がVC(Ver7)で作成したコンソールアプリケーションがあります。このときに作ったモジュール群をライブラリにして、BCBで使用したいのですが、VC側でどのように作ったら良いのかわかりません。
VC側でどのテンプレートを選んでどのように作ればBCBで使えるライブラリになるのか教えてください。

※私はもともと組込み用のソフト開発者なので、Windowsアプリの知識はビギナークラスです。そんな私でも分かるように配慮してもらえると助かります。

以下に示すHPが私の参考にした方法です。
http://gimite.ddo.jp/bcbqtree/qtreemain.cgi?mode=thread&thread=366

Aベストアンサー

implib.exe 自体は、dll にあるライブラリの情報から、C++ Builder 用のインポートライブラリを作成するものです。なので、dll の形で作成できて、MFC を使っていなければ、OKです。

ただし、一点だけ注意する必要があるのが、ライブラリの関数名には、 extern "C" の指定をしてください。
(ヘッダファイルの関数プロトタイプを、 extern "C" { .... } で囲ってしまえばOKです)

これを指定することで、C++の特徴である、「引数の型の異なる関数は別物」というのが使えなくなりますが。

※Visual C++ や C++ Builder では、関数名+引数の型を合成した名前を内部的に持っています(この変換で、関数名が同じでも、内部的に別の名前になっている)。この変換は、両者で異なりますので、implib を使ってもリンクできません。 extern "C" は、この変換を抑止します。


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

人気Q&Aランキング

おすすめ情報