関数の戻り値

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 関数の戻り値

by イグトランス » 2006年6月10日(土) 15:44

もしかしたらIf A=B Then 100もできたかもしれません。
だいぶ前のことですからはっきりと覚えていませんが。

by konisi » 2006年6月10日(土) 15:41

省略って言えば、N88系のBASICだとIf文がThen節だけで、しかもGoto文のみの場合はGoto文を省略できましたね。

If A=B Then Goto 100

If A=B Then 100
って。


そうかー。MSX系のBASICだとThenが省略できるのかー。

by イグトランス » 2006年6月10日(土) 14:17

jneなどは"Then Goto"だと思います。

そういえばMSX-BASICではThen節がGotoのみの場合Thenを省略できる,
つまりIf ... Then Goto ~をIf ... Goto ~と書けましたね。(もちろんGoto先は行番号で指定)
ふと思い出したことです。

by konisi » 2006年6月10日(土) 10:37

>>tak
いやいや、アセンブリ言語にもちゃんと条件分岐付きジャンプがありますよ。jne(Basic言語で言うIf A<>B then~)とか。

>>イグトランス
あ、使えないんだ。

by イグトランス » 2006年6月10日(土) 09:13

Javaのgotoは予約語であるものの,使えない状態のようです。
予約語 (Java言語)#その他の予約語 - Wikipedia

by tak » 2006年6月10日(土) 02:40

ん?Java は goto ありましたっけ?
僕は記憶にないです。いや、かじっただけなのでもしかしたらあるのかも…

それにしても、ここでも goto は嫌われているみたいですね。
濫用を控えればそんなに悪い奴ではないと思うのですが…
とくに近場へのジャンプは、高度な制御構文を使うよりも goto の方がシンプルに仕上がることはよくあることです。エラーハンドリングとか。

>> konisiさん
> アセンブリ言語ならjmpとかマシン語なら0xE9~0xEBと0xFFがgoto文と同じ働きをします。
というか、アセンブリ言語のジャンプには「goto しかない」と思います。
条件分岐だって If ~ Then Goto - Else Goto … のシーケンスに他なりませんし。
loop 命令もこのシーケンスより遅いので最近のコンパイラは使用しません。
あ、procedure call は例外ですね。

by イグトランス » 2006年6月10日(土) 00:49

そんなCとかJavaとか持ち出さなくても,Goto付きのプログラミング言語なら目の前にあるでしょう,Basicが。
そういえば最近めっきりGotoを使う機会がありませんね。それでよいのでしょうけど。

PS 記念すべき400件目の投稿になりました。これからもみなさんよろしくおねがいします。

by konisi » 2006年6月09日(金) 23:19

CやJavaを始めとするほとんどの高水準言語にはスパゲッティープログラムの元になるgoto文が用意されてます。

覚えてる限りでは、COBOL(事務処理系)やForTran(科学技術系)等のやつらでgoto文あるいは同等の働きをする文が用意されていたような・・・。


低水準言語なら、アセンブリ言語ならjmpとかマシン語なら0xE9~0xEBと0xFFがgoto文と同じ働きをします。

by 卓漏 » 2006年6月08日(木) 22:50

>研究対象がスパゲッティプログラムか。どういうレポート結果になったの?

↑痛いところを衝かれました。実言うと、レポートとかは残っていません。

昔、「スパゲッティプログラム」を研究していたのですが、仕事で忙しくなり、
挫折したためです。
でも最近、プログラムの「方言」が、「スパゲッティプログラム」を生み出す原因のひとつになっていそうだな・・・・。と思ったので、また一から研究を始めたわけです。

と言うか、レポートとか文学は苦手です。

by konisi » 2006年6月08日(木) 21:29

研究対象がスパゲッティプログラムか。どういうレポート結果になったの?

by 卓漏 » 2006年6月08日(木) 19:25

> 私もどうしてポインタを返す関数を作りたいのか知りたいですね。

↑作った理由は、たいした理由では無いです。
昔、研究していた「スパゲッティプログラム」と「プログラム方言」を、もう一度、初めから研究するためです。

by NoWest » 2006年6月08日(木) 14:31

私もどうしてポインタを返す関数を作りたいのか知りたいですね。

自分だけで使う関数なら、ポインタを返す関数を作ってもよいと思いますが
他の人に公開するライブラリの一部などであれば勿論のこと
「3日も経てば他人のソース」という格言のように自分でも混乱しかねません。

文字列操作の関数であれば外部から目的の文字列バッファを引数に与えてやるのが
基本だと思います。

by イグトランス » 2006年6月07日(水) 23:02

コード: 全て選択

For I = 1 To Max
    pStr = Asc(Mid$(Str$, I, 1))
Next I

この部分はもっと簡単に,これだけで済みます。そしてこの場合callocはmallocで置き換えられます。

コード: 全て選択

memcpy(pStr, StrPtr(Str$), Max + 1)


また,callocで確保したメモリはfreeで解放すべきです。

コード: 全て選択

Print MakeStr(x)
End

これを(たとえば)こうします。

コード: 全て選択

Dim pStr As *Char
pStr = x()
Print MakeStr(pStr)
free(pStr)

End

もう1度言いますが,私なら関数xがString型を返すようにします。
こんなfreeしなければならないなんて面倒くささは受け入れられませんから。

by 卓漏 » 2006年6月07日(水) 22:35

BytePtr型を使ってもだめだったので、
「NoWest」さんのコードを参考にして、「String型」から強引に「*char型」に変換する関数(StrToChar)を作って組み込んだところ、問題が解決しました。

コード: 全て選択


Print MakeStr(x) 
End 

Function x() As *char 
    Dim Str$ As String 
    /* 何らかの処理 */ 
    Print Str$ 
     x = StrToChar(Str$)
End Function 

Function StrToChar(Str$ As String) As *char
	Dim I As Integer, Max As Long
	Dim pStr As *char

	Max = Len(Str$)

	pStr = calloc(Max + 1)

	For I = 1 To Max
		pStr = Asc(Mid$(Str$, I, 1))
	Next I
	
	StrToChar = pStr
End Function

by C1000 » 2006年6月07日(水) 20:46

自分もポカしてましたね(恥)直し方はわかりましたがわりと簡単なのでここには書きません。

ページトップ