2017-04-03 1 views
1

Windowsの64ビット版でVisual Studioを使用して開発したC++プロジェクトでサードパーティのCライブラリを使用しようとしています。 32ビットと64ビットの両方が正常にコンパイルされました。long型への8ビットポインタのキャスト

double* foo(){ 
    double* b; long a; long i; 
    /* 
     ... do some stuff to assign values to b, a, i ... 
    */ 
    return ((long)b + a + i); 
} 
* x86アーキテクチャでは4バイトでダブル表されること

問題は(少なくともWindowsの場合)で、8:それは、以下の場合と同様に、64ビットで動作しているときしかし、私は外部のライブラリで問題を見つけましたx64のバイト数なので、returnステートメントにbのキャスティングが実行されません。

私の質問は、8ビット表現からポインタbの4バイトアドレスを "抽出"できる方法があるからです。つまり、表現を維持するためには、意味がありますか?(b+a)

おかげ

+2

ビットとバイトの違いを理解してください。効果的なアイデアの伝達には不可欠です。ポインタは、ビットではなく、4バイトまたは8バイトです。 –

+0

私は明らかに何かが間違っているかもしれませんが、問題を解決しない単純なリターンラインからの削除(長い)でしょうか? – MTilsted

+2

問題のコードは意味をなさない。それは何をするように設計されているかは不明です。したがって、適切な修正が何であるかを知ることは難しいです。それがあなたのコードなら、私のアドバイスは、すべてのキャストを避けることです。 –

答えて

3

はおそらくキャストはsizeof(double)の倍数にポインタarithmetricを行うことを避けることです。

char *ポインタでも同じことができ、サイズの問題を完全に回避できます。私はまたコードが欠落していた元のポインタ型にキャストバックを追加しました。

return (double *)((char *)b + a + i); 

注:あなたは簡単に逆参照場合未定義の動作につながることができます非整列のポインタを、作成できることに注意する必要があります。これは元のコードにも問題がありました。

注意してください。あなたのコードは非常に疑わしいと思われ、他の潜在的な鉱山を持つ可能性があります。

+0

大当たり! (long)から(char *)に変更するとそのトリックが行われました。現在、x64バージョンはx86対応バージョンとまったく同じように動作します。 – gcaglion

+0

@gcaglionうまくいきました。しかし、私が言ったように、ポインタ算術は私を少し緊張させる。好奇心から、あなたは図書館が何であるかを明らかにすることができますか? – user694733

+0

私は自分自身でポインタ演算を使用することはありませんでしたが、私が書いたように、私は既存のサードパーティの外部ライブラリを使用して時間を節約することにしました。ちなみに、外部コードはhttp://svmlight.joachimsです。org /(特に、svm_learn.cのkernel_cache_clean_and_malloc()関数 – gcaglion

関連する問題