HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0824
Uikyoモジュール内での文字列の扱い4解決


Uikyo

リンク

2007/8/24(Fri) 23:38:24|NO.10653

初めまして。
よろしくお願いします。

さて、文字列に文字列を挿入するという
結構簡単な処理が多く必要だったので
この機会にと、関数化しておこうと思ったのですが


#module ;与えられた文字列の該当部分に、与えられた文字列を挿入する関数 #defcfunc InsertString str baseString,str insertedString,int point sdim bS,strlen(baseString) sdim iS,strlen(insertedString) bS=baseString iS=insertedString ;mes命令は効く ;mes baseString return strmid(bS,0,point) + iS + strmid(bS,point,strlen(bS)) ;return strmid(baseString,0,point) + insertedString + strmid(baseString,point,strlen(baseString)) #global ;TEST mes InsertString("Uikyo","☆",2)

以上のように、文字列をコピーしないと動作しませんでした。
(エラー:変数名を指定してください がでてくる)
なお、HSP3.0を使用しています。

これは、モジュール内では引数の文字列は
他の関数に渡さないような仕様になっているのでしょうか?
ほかに方法はありませんでしょうか?
是非よろしくお願いします。



この記事に返信する


GENKI

リンク

2007/8/25(Sat) 00:27:20|NO.10655

> (エラー:変数名を指定してください がでてくる)

まさにそれが答えです。(^_^

ためしにモジュール内に

mes vartype(baseString)
を入れてみてください。意味はヘルプ参照。
「Err23:変数名が指定されていません。」が出ると思います。

mes vartype(bS)
だと文字列型なのでちゃんと2を返してくれますよね。
つまりbaseStringが変数ではないということです。

#defcfuncでstrを指定しているのでbaseStringは文字列として扱われているようです。
varを使えば変数として扱われるようになります。
しかし、関数化して記述を簡単にしようというのであればstrを使ったほうがあとあと楽ですよ。
ためしに作ってみると分かると思います。



> なお、HSP3.0を使用しています。

3.1へのバージョンアップをお勧めしておきます。



Uikyo

リンク

2007/8/25(Sat) 01:14:19|NO.10660

VersionUpしました。
3.1が出ていたんですね。
気が付きませんでした。
指摘ありがとうございます。

さて、文字列と変数の違いがよくわかりません。
>baseStringが変数ではないということです
ということがまず理解できないのです・・・。
引数として渡しているので、
baseStringに格納されてそれを使うということではないみたいですね。
ただ、strmid("HSP3.1",3,2)のような使い方も可能と言うことですし・・・。
かなり混乱しています。
(では、mes命令に指定するものはなんなのでしょうか・・・?)

>しかし、関数化して記述を簡単にしようというのであればstrを使ったほうがあとあと楽ですよ。
>ためしに作ってみると分かると思います。
なぜかも、分からないですし
どうやって、作成するのかも分かりません(コピーをとる方法でうまく行っているのですが)

不勉強で申し訳ないのですが
もう少し詳しく教えていただけ無いでしょうか。



osakana

リンク

2007/8/25(Sat) 03:06:20|NO.10663

> strmid("HSP3.1",3,2)のような使い方も可能と言うことで

可能じゃないですよ。
strmid("HSP3.1",3,2) ではエラーが出ます。


要するに、パラメータータイプに str baseString を指定し
strmid(baseString,0,point)
とすると、
strmid("Uikyo",0,point)
とするのと同じになるので駄目と言う事です。
ですので必ず変数に入れる必要があると思います。
Uikyoさんのモジュールのままでも良いんですが、
少しいじって見ました。

#module #defcfunc InsertString str baseString,str insertedString,int point ,local bS bS = baseString return strmid(bS,0,point) + insertedString + strmid(bS,point,strlen(bS)) #global mes InsertString("Uikyo","☆",2)
あとこんな風にしても面白いかもしれません(私の良くやる手)

#module #defcfunc strmid_ str s, int i, int n ,local v v = s return strmid(v, i, n) #defcfunc InsertString str baseString, str insertedString, int point return strmid_(baseString, 0, point) + insertedString + strmid_(baseString,point, strlen(baseString)-point) #global mes InsertString("Uikyo","☆",2)



Uikyo

リンク

2007/8/25(Sat) 14:32:58|NO.10674

実際に試してみたのですが
確かに、strmidは変数を指定しないと動きませんでした。
勘違いですみません。

Cとかjavaに慣れてしまうと、引数が変数であるのは当然だと思っていたので
strの意味に驚きました。これから注意して使いたいと思います。
今回はお騒がせして済みませんでした。
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.