2016-11-10 2 views
-1
// C lang 

#include <stdio.h> 

void func (void *ptr) { 
    int *iptr = ptr; 
    printf("{%d, %d, %d}\n", iptr[0], iptr[1], iptr[2]); 
} 

int main() 
{ 
    int ary[] = {111, 222, 333}; 
    func(&ary); 
    return 0; 
} 

にボイドポインタの値を取得=>出力:{111、222、333}アレイ

// Vala 

public void func (void *ptr) { 
    int *iptr = ptr; 
    print("{%d, %d, %d}\n", iptr[0], iptr[1], iptr[2]); 
} 

void main(string[] args) { 
    int[] ary = {111, 222, 333}; 
    func(&ary); 
} 

=>出力:{155115112、155115112、3}

配列へのvoidポインタの値をvalaで取得する方法は?

void[]を使用すると、void*を使用するよりも優れていますか?これを行うことができるように

答えて

1

例Cコードでボイド*は、バイトのアレイ(メモリの一部チャンク)とほぼ同等である。

public void func (uint8[] ptr) { 
    int[] iptr = (int[]) ptr; 
    print("{%d, %d, %d}\n", iptr[0], iptr[1], iptr[2]); 
} 

void main(string[] args) { 
    int[] ary = {111, 222, 333}; 
    func ((uint8[]) ary); 
} 

これは完全しかし、安全でないタイプです。また、Valaは、長さにはバイト単位の長さではなく、要素の長さ(通常はsizeof(int) != sizeof(char))に設定された追加の隠しパラメータを使用します。

あなたの元の問題が何であれ、別のやり方を見つけるのは助けになります。

この質問は、典型的なXY problemのように聞こえます。

裸のポインタを使用することは、Vala(実際の高水準のすべての言語で)では避けてください。代わりに、コンテナ、参照、スマートポインタなどの概念を使用する必要があります。

編集:あなたの元のコードは動作しませんし、それを修正する方法をなぜはオクラホマので、ここにある:

あなたはすでにここポインタである何かのアドレスを取っている:

int[] ary = {111, 222, 333}; 
// ary is already a pointer, &ary will give you an int** 
func(&ary); 

それはどのように危険なのかを示すだけですvoid*です。

int[] ary = {111, 222, 333}; 
func(&ary[0]); 
  • ポインタに配列をキャスト:

    int[] ary = {111, 222, 333}; 
    func((void*) ary); 
    
    1. は、最初の要素のアドレスを取る:(まだvoid*使用しながら)これを修正するには、2つの方法があります。

    PS:void*は、他のコンテキストで異なる意味を持つことができます(opaqu構造体ポインタまたはref/outパラメータまたは他の醜い低レベルの構造体)。

    +0

    'void *'の値を配列に渡すことはできませんか? –

    +0

    'void *'を 'int []'にキャストできます。私はそれを示すために私の答えを編集します。 –

    +0

    JensはValaでポインタを使用しないことについて絶対に正しいです。もしあなたがValaで(libxmlのような)それらを必要とするバインディングとやりとりする以外に何かのためにポインタを使用しているのであれば、間違っているでしょう。 – nemequ