2016-11-30 7 views
-2

可変変数が簡単に使える深いPHP & BASHから来たCの新機能です。私はどのようにmain()でオブジェクトを作成するかを理解しようとしていますsecondFunction()このオブジェクトで動作し、次にmain()に戻ってこのオブジェクトをプログラムにマージします。C言語の新機能で、*、&を参照オブジェクトに使用するのに苦労しています

私はスクリプトをコンパイルすることができますが、これはをmain()マージに投げます。記事とチュートリアルの多くを読んだ後、私はmyVarを使用するとき、私はアップミキシングと思う

*myVar&myVar

scriptOne.c - >メイン()

int main(){ 
    GstElement *myPipeline; 
    GstElement *myBin; 
    doAddBin(myBin); 
    gst_bin_add (GST_BIN (myPipeline), myBin); // Segmentation Fault , main merge 

scriptOne.c - > doAddBin ()

void doAddBin(GstElement *MyBinAlpha){ 
    char *bin_name; 
    bin_name="bin_0"; 
    MyBinAlpha = gst_bin_new (bin_name); <--This is where object is produced 

    doWorkOnBin(MyBinAlpha); 

ScriptTwo.c - > doWorkOnBin()

void doAddBin(GstElement *MyBinBeta){ 
    src1 = gst_element_factory_make ("filesrc", "idFileSrc"); 
    gst_bin_add (MyBinBeta,src1); 
    return; // work now finished, return to main() 
       // where myBin now contains src1 

だから私は私が正しく*を使用していない取るとsegmentation fault

を停止するには、どこか&と交換する必要があるおかげでCで

+0

ポインタを使って作業すること(つまり、これらを呼び出すこと)は非常に混乱する可能性があります。ポインタが正確に何であるかを単に学習するのに時間を費やしてください。それは完全に把握するために大学生の学期がかかりますので、落胆してはいけません http://www.c4learn.com/c-programming/c-pointer-concept/ –

+0

[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)あなたのコードですか?また、Cコードを「スクリプト」と呼びますが、それは[間違っています](http://stackoverflow.com/questions/2286552/difference-between-a-script-and-a-program)です。 –

+0

@ j.seashell、ドキュメントのおかげで、私は近くでしたが、以前は「**」に出くわしていませんでした。これはプロセスを視覚化するのに役立ちます。 –

答えて

3

アート、すべての関数のパラメータは値渡しです。したがって、関数パラメーターの値を変更することは、関数の外部では見えません。

何ができるかが、あなたが実際に呼び出し元の関数で変数を変更しているように*演算子を使ってポインタそのデリファレンス、関数の内部で、&演算子を使用して、変数のアドレスを渡しています。

// accept the address of a pointer 
void doAddBin(GstElement **MyBinAlpha){ 
    char *bin_name; 
    bin_name="bin_0"; 
    // derefernce the pointer to assign to myBin in main 
    *MyBinAlpha = gst_bin_new (bin_name); <--This is where object is produced 

    doWorkOnBin(*MyBinAlpha); 

    ScriptTwo.c -> doWorkOnBin(); 
} 

int main(){ 
    GstElement *myPipeline; 
    GstElement *myBin; 
    // pass in the address of the pointer 
    doAddBin(&myBin); 
    // now myBin has been updated  
    gst_bin_add (GST_BIN (pipeline), myBin); 
    return 0; 
} 
+0

うわー私はそのコンビネーションを試してみましたが、 '**'は使用していませんでした。私は前に出会っていなかったので、 '**'を読まなければなりません。この概念をスレッディングに拡張する場合、ロジックは同じままですか?簡潔に答えてくれてありがとうございます。@daush –

+0

@artvanderlay '*'はオブジェクトへのポインタを作成するか、または参照を外します。 '**'はオブジェクトへのポインタへのポインタを単純に行います。変数を使用すると、別のアドレスを保持する変数のアドレスを保持する2番目の変数を作成できます。つまり、この2番目のアドレスはオブジェクトを指すアドレスを指しています。 (これは 'int ****** p;'のように間違った量の間接参照を追加する方法にも拡張できますが、良い設計では決して*必要はありません) – Toby

関連する問題