これは少し長いことは承知していますが、難しい問題です。ご覧いただきありがとうございます。私はこれにあまりにも長い間取り組んできました。私は多くの調査を行い、多くのことを試しました。誰かが説明を手伝ってくれることを願っています.
概要:
C で書いています。計測器からデータの配列を取得する必要があります。配列のサイズは、収集されるデータの量によって異なります。データポイントの数を照会できます。データを収集する関数を作成しました (以下を参照)。これは、関数が main() で直接呼び出されたときに機能します。テストに使用します。ただし、この関数は dll であり、上位の dll 内の関数から呼び出されます。これは動作しません。可変サイズのためだと思います。
変数のサイズとポインタの詳細に迷っています。どんな助けでも大歓迎です。
main() から呼び出される機能コード
*Note - Below ViInt16 is a signed short type specific to VISA (communication protocol for instrument). Function returns an int as the status/error (set in other code).
header:
int GetSamples (ViInt16 *DataArray, int DataSize);
function:
int GetSamples (ViInt16 *DataArray, int DataSize)
{
ViUInt16 N=0;
ViInt16 Datatemp[DataSize];
viMoveIn (Handle, N, 0, DataSize, Datatemp);
memcpy (DataArray, Datatemp, sizeof(Datatemp);
}
main:
int totalsamples = (PreTrigPts() + AcqPts())
ViInt16 Data [totalsamples];
GetSamples (Data, totalsamples);
This works! I think, only because I can get the total size and then allocate the ViInt16 array from main(). Truthfully, not sure what I'm doing with the pointers, etc. in passing around arrays
The problem is, I'm not sure what to do when it's a function calling a function because, I think, the array needs to be allocated at the top, before I've queried the size. Here is how I am trying to do it (that's not working)
Problem Code
Low level "driver" (called as a dll):
Header and function definition from above.
Functions_header: (what calls the low level driver as dll)
void AutoSample(void); //No returns. Writes to UI in Functions_list.c
Function_list.c:
void AutoSample ()
{
int PreTriggerPts = 0; //Declare all variables at top, or won't compile
int Points = 0;
int TotalSamples = 0
ViInt16 MyData [5] = {0}; //arbitrary since don't know size yet
TotalSamples = (PreTrigPts() + AcqPts());
ViInt16 MyData[TotalSamples]; //Trying to size by reinitializing?
GetSamples (MyData, TotalSamples);
//...calls another function to write MyData to UI...etc. etc.
Main.c:
AutoSample();
Errors
いろいろ試したのでエラーが多発しました。必要に応じて、より具体的にすることもできますが、変数のサイズがわかった後で (作業コードで行ったように) 変数を初期化しようとすると、それは違法であることがわかります。宣言を一番上に置くと、それが修正されます。初期化するサイズがわかりません。ここから、私はハッキングしてきました。具体的なことはありません。ポインターとメモリでやらなければならないことがありますが、何がわかりません。どうぞ、どんな助けでも大歓迎です!