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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0108
kamepDLLで2次以上の配列変数を書き換える7解決


kamep

リンク

2012/1/8(Sun) 00:13:25|NO.44180

DLLで2次配列変数の書き換えをしようとしています。

今までは2次配列変数の書き換え方がわからなかったので
1次配列変数しか書き換えてなかったのですが、
2次配列変数の書き換えも必要にりました。

DLL(1次配列変数の書き換え)

int* arr=(int*)code_getpval()->pt; int cnt[1]; for(cnt[0]=0;cnt[0]<5;++cnt[0]) { arr[cnt[0]]=cnt[0]; } return;
これは正常に書き換えできました。
ですが、

DLL(2次配列変数の書き換え)

int* arr=(int*)code_getpval()->pt; int cnt[2]; for(cnt[0]=0;cnt[0]<5;++cnt[0]) { for(cnt[1]=0;cnt[1]<5;++cnt[1]) { arr[cnt[0]][cnt[1]]=cnt[0]; }} return;
だと5行目にエラー(無効な間接参照)がでて書き換えできません。
どこを直せばいいのか教えてください。
(上のスクリプトは必要なところだけを載せています)



この記事に返信する


check

リンク

2012/1/8(Sun) 01:10:26|NO.44181

これはHSPの質問じゃなくてCの質問じゃね?

何がしたいのかよく分からないのだが、
arrが[5][5]分データが確保されていなかったら
アクセス違反でエラーが出るぞ。
あと、一時的なカウント変数にはiやjを使ったほうがいい。
別にiやjじゃなくてもいいんだけどな(一種の慣習見たいなもんだ)。
一次元配列なんか使うとさらにややこしくなる。



M

リンク

2012/1/8(Sun) 02:16:24|NO.44183

単純に、次のようなスクリプトではだめだろうか?

HSP側

#uselib "dimtest.dll" #func DimTest "Test" var dim BD,5,5 DimTest BD mes BD(0,2) mes BD(4,1)

DLL側(dimtest.dll。VisualC++で作成)

#include <stdio.h> #define EXPORT extern "C" __declspec (dllexport) EXPORT int Test(int arr[5][5]){ int cnt[2]; for(cnt[0]=0;cnt[0]<5;++cnt[0]) { for(cnt[1]=0;cnt[1]<5;++cnt[1]) { arr[cnt[0]][cnt[1]]=cnt[0]; } } return 0; }

難しいことを考えなくても、これで動いてしまう。
気を付けるのは、二次元以上の配列を渡すとき、添え字の順番が逆順になるということ。
HSPでarr X,Y と渡したら、Dll側では arr Y,Xと受け取る。



晩御飯

リンク

2012/1/8(Sun) 14:05:23|NO.44194

int* arr=(int*)code_getpval()->pt;

右辺はわからないけど左辺はint**になるんじゃない?



レノス

リンク

2012/1/8(Sun) 16:47:50|NO.44199

ちなみに。
Mさんの方法で十分ですが、SDKに従って書くと、配列変数への代入はこんな感じになります。

// PVal* pval; HspVarCoreReset( pval ); // 配列ポインタをリセットする exinfo->HspFunc_array( pval, idx_0 ); // 1次元目の添字 exinfo->HspFunc_array( pval, idx_1 ); // 2次元目の添字 code_setvs( pval, pval->offset, pval->flag, (代入する値へのポインタ) ); // ((int*)(pval->pt))[pval->offset] = (値);



kamep

リンク

2012/1/8(Sun) 23:45:23|NO.44213

>>checkさん
C言語の質問のところに書こうとも考えたのですが、Cの二次配列変数の扱い方は知っていて、
HSPの配列変数となると扱い方が知っているのとは違っていたので書き込ませてもらいました。
arrは[5][5]分のデータを確保されています。次からはわかるように「確保されている」と
書くようにします。
カウント変数はこれに慣れてしまっているのでcntにしてしまっています。

>>Mさん,朝御飯さん,レノスさん
ありがとうございました。
最終的にはレノスさんの方法で、無事2次元以上の配列変数に値を代入することができました。

何度も悪いのですが、2次元以上の配列変数の値を取得する方法を教えて貰えないでしょうか。
code_setvaの要領でcode_getvaもできると思ったら違うようなので

DLLの開発環境を最初に書いておくのを忘れていたので今ここに書かせてもらいます。
DLLはBorland C++で作成しています。
中身は HSP3DLL Function ではなくて、HSP3TypeFunction 用に作ってあるので、HSPでは#regcmdと#cmdで
呼び出しています。



レノス

リンク

2012/1/9(Mon) 00:25:16|NO.44214

ややこしいネーミングですが、code_getva() は引数から変数を取り出す関数の一つで、
code_setva の対となるものではありません。

値(へのポインタ)は、代入のときと同様に添字を設定してから、
変数の型に対応する HspVarProc の GetPtr() を呼び出して取得します。

HspVarProc* pHvp = exinfo->HspFunc_getproc( pval->flag ); HspVarCoreReset(pval); //... PDAT* ptrToValue = pHvp->GetPtr(pval);

# 書き忘れましたが、hsp33/hspsdk/hspdll.txt を参照。



kamep

リンク

2012/1/9(Mon) 11:51:19|NO.44219

ありがとうございます
2次元以上の配列変数から値を取得することができました。



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