質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2746閲覧

構造体のポンンタの渡し方を教えてください。

yogrt3

総合スコア14

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2016/09/19 09:41

###前提・実現したいこと
初心者です。C++で富士ゼロックスのドキュワークスでDocuWorks APIを
つかって直線アノテーションを張り付ける関数について
下記の関数の引数pInitialDataへの構造体のポンンタの渡し方を
教えていただけますか。
###発生している問題・エラーメッセージ
DocuWorks API(XDWAPI)仕様書に下記のように定義されています。

2.1 XDW_AddAnnotation
機能
アノテーションを貼り付ける
形式
int XDW_AddAnnotation ( XDW_DOCUMENT_HANDLE handle, int nAnnotationType, int nPage, int nHorPos, int nVerPos, XDW_AA_INITIAL_DATA* pInitialData, XDW_ANNOTATION_HANDLE* phNewAnnotation, void* reserved);
パラメータ
・handle DocuWorksファイルのハンドル。
・nAnnotationType アノテーションの種類。次の値のいずれかが有効。
XDW_AID_STRAIGHTLINE 直線
・nPage アノテーションを貼るページを指定する。1から始まる。
・nHorPos アノテーションのx座標。単位は1/100mm。
・nVerPos アノテーションのy座標。単位は1/100mm。
・pInitialData 初期値情報。説明参照。
・phNewAnnotation 貼り付けられたアノテーションへのハンドルが返される。
・reserved 予約引数。NULLでなければならない。

これによるとpInitialDataは構造体XDW_AA_INITIAL_DATAへのポインタを渡す
仕様になっているようです。ところが説明には下記のようにあります。

pInitialDataの説明。
次のアノテーションを作成するときは、pInitialDataにその構造体へのポインタを渡さなければならない。
直線アノテーション XDW_AA_STRAIGHTLINE_INITIAL_DATA

構造体の定義は、次の通り。
struct XDW_AA_INITIAL_DATA {
・int nSize; 構造体のバイト数。
アノテーションの種類に応じて、次の値を設定しなければならな
い。
直線: sizeof(XDW_AA_STRAIGHTLINE_INITIAL_DATA)
・int nAnnotationType; アノテーションの種類。
直線: XDW_AID_STRAIGHTLINE
・int nReserved1; 予約メンバ。0でなければならない。
・int nReserved2; 予約メンバ。0でなければならない。
};
struct XDW_AA_STRAIGHTLINE_INITIAL_DATA {
XDW_AA_INITIAL_DATA common; 共通情報。
構造体のバイト数とアノテーションの種類を指定する。
int nHorVec; 直線アノテーションの始点から終点までのx座標上の移動量。
単位は1/100mm。
最小値: -240000(=-240cm)、最大値: 240000(=240cm)
int nVerVec; 直線アノテーションの始点から終点までのy座標上の移動量。
単位は1/100mm。
最小値: -240000(=-240cm)、最大値: 240000(=240cm)
};

これで説明の通りにpInitialDataに構造体XDW_AA_INITIAL_DATA でなく
構造体XDW_AA_STRAIGHTLINE_INITIAL_DATA のポインタを引数に
入力するとエラーとなってしまいます。

C++

1"XDW_AA_STRAIGHTLINE_INITIAL_DATA *"の引数は型"XDW_AA_INITIAL_DATA*"のパラメータと互換性がありません。

###該当のソースコード

C++

1XDW_AA_INITIAL_DATA a; 2 a.nSize = sizeof(XDW_AA_STRAIGHTLINE_INITIAL_DATA); 3 a.nAnnotationType = XDW_AID_STRAIGHTLINE; 4 a.nReserved1 = 0; 5 a.nReserved2 = 0; 6 7 XDW_AA_STRAIGHTLINE_INITIAL_DATA b; 8 b.common = a; 9 b.nHorVec = 50000; 10 b.nVerVec = 50000; 11 XDW_ANNOTATION_HANDLE annoation; 12 13 api_result = XDW_AddAnnotation( 14 h, XDW_AID_STRAIGHTLINE, 1, 500, 500, &b, &annoation, NULL);; 15 if (api_result < 0) { 16 print_error(api_result); 17 18 }

###試したこと
仕様書通りに上記コードの構造体XDW_AA_INITIAL_DATA aのポインタを引数とすると
ビルドはできるのですが、関数が異常終了したときのエラーコードを返してきます。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

たぶん、pInitialDataに&(b.common)を渡せば行けるのではないかと思います。
C言語ではよく使われるテクニックです。
C++で使うのは如何なものかと感じる仕様ですので、ユーサ・アプリはC++でもDocuWorks APIはC言語で記述されているということと思います。

投稿2016/09/19 10:10

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yogrt3

2016/09/19 11:13

やってみたところ、できました!! これができなくて3日くらい費やして 意を決して質問してみてよかったです。 Chironianさん、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問