- ベストアンサー
スタックオーバーフロー
R32Cの回答
- R32C
- ベストアンサー率39% (115/290)
単なる用語の間違いかと思いますが 「確保する」 というのがあれば、「開放する」 がなければそのうちメモリーがなくなりますね。
関連するQ&A
- 【C++】関数ポインタの代入
C++の関数ポインタについて質問です。 下記のように関数ポインタを宣言し、3通りの代入を行ってみました。 (3)のように関数名の頭に&を付けた場合と(2)のように&を付けなかった場合で 全く動きが同じになってしまうのですが、何故なのでしょうか? ------------------------------------------ #include "stdafx.h" #include <iostream> using namespace std; void Func1(){ cout<<"Func1が呼ばれました。"<<endl; return; } int main() { //(1) void (*fp1_1)(); fp1_1 = Func1; fp1_1(); //(2) void (*fp1_2)()=Func1; fp1_2(); //(3) void (*fp1_3)()=&Func1; fp1_3(); getchar(); return 0; }
- ベストアンサー
- C・C++・C#
- コマンドライン引数argv[]について
C言語初心者です。以下のようなプログラムを書いたのですが、コンパイルで来ません。関数func1, func2を分けずに全てメインに書けば動作するのですが、なぜ関数に分けてしまうとコンパイル出来ないのかがわかりません。エラー内容は、argvが宣言されていない、といった内容です。 #include <stdio.h> void func1(void){ printf("%s\n", argv[1]); } void func2(void){ printf("%s\n", argv[2]); } int main(int argc, char *argv[]){ if(strcmp(argv[1], "abc")==0){ func1(); } else{ func2(); } }
- ベストアンサー
- C・C++・C#
- C言語での関数の引数の受け渡しについて
C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo; というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。
- ベストアンサー
- C・C++・C#
- 関数ポインタについて
C言語の関数ポインタの問題で以下のような問題で、実際に解いて、プログラムを動かしてみてみました。 正常に動作したのですが、この回答では満点はもらえませんでした。 このほかに良い解答例などありましたら、教えていただけないでしょうか。 どうかよろしくお願い致します。 [問題]次の※1・※2を埋めなさい(「func1」,「func2」は解答に含まれないように書くこと)。 #include <stdio.h> void func1() { printf("func1\n"); } void func2() { printf("func2\n"); } void func(int no) { void (*func[2])(void) = {func1, func2}; /* ※1 (*func[no])() */; } int main() { /* ※2 func(1) */; return 0; } 実行結果:func2
- 締切済み
- C・C++・C#
- signal関数の使い方
標準関数のsignal()関数についてですが void (*signal(int sig, void (*func)(int)))(int); 関数の形式からしてよくわかりません。 僕のイメージでは関数のポインタというと void (*func)(int,int) という感じですが上の場合 void (*func(int,int))(int) /*引数は仮にint型*/ という形式になってますよね。末尾の(int)は引数のはずですがどこの引数になっているのかよくわかりません。 しかも関数の使用例などをみると signal(SIGINT, func); という形で使っており末尾の(int)がどこにいったのかさっぱりわかりません。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 【C言語】別関数でポインタの値を変えたのに変わらない。
【C言語】別関数でポインタの値を変えたのに変わらない。 メイン関数のポインタの値を、別関数で書き換えるプログラムを作りました。 以下がそのプログラムになります。 そのままだと、ダブルポインタを操作する必要があるので分かり辛いです。なので、ダブルポインタをシングルポインタにしてからポインタの書き換えを行うようにしました。その結果、きちんとポインタの書き換えが出来なくなってしまいました。 なぜ出来なくなってしまったのでしょうか。 2つのプログラムの違いは、 > *pp = &dummy; が > p = *pp; // ダブルポインタをシングルポインタにした > p = &dummy; に変わっただけです。 【参考】http://www.kouno.jp/home/c_faq/c4.html#8 -----------------正しいプログラム---------------- // 以下プログラムは、正しく動作する // 実行結果は、 // p = 5 // と表示される void func( int **pp ); int main (void){ int *p; int a = 0; p = &a; func( &p ); printf("p = %d\n", *p); return 0; } void func( int **pp ){ static int dummy = 5; *pp = &dummy; } ---------------------------------------------- -----------------間違いプログラム---------------- // 以下プログラムは、正しく動作しない // 実行結果は、 // p = 0 // と表示される void func( int **pp ); int main (void){ int *p; int a = 0; p = &a; func( &p ); printf("p = %d\n", *p); return 0; } void func( int **pp ){ static int dummy = 5; int *p; p = *pp; // ダブルポインタをシングルポインタにした p = &dummy; } ----------------------------------------
- 締切済み
- C・C++・C#
- 教えてポインタ
例えば、以下のようなソース。 関数の中で、引数のポインタに値を入れてmainに戻す。 とても簡単なものです。 void func(int *N) { *N=0; } main { int *N=1; func(N); printf("%d",*N) } 疑問は、ここからです。 (1)void func(int *N) (2)void func(int* N) (3)void func(int* &N) 上記は、何が違いますか? なお、当方のVS2010で同じソースを作ると、 (1)の場合、エラーになります。(func関数の*N=0のところでダウン) (2)だと、OKになります。 (3)は、なに?
- ベストアンサー
- C・C++・C#
- HIPOについて質問です
HIPOには入力・処理・出力とありますが、入力のないHIPOはあるのでしょうか?また、以下のmain()関数、func1()関数をHIPOで記述すると、どのようになりますか? void main(void) { func1(); } void func1(void) { printf("test"); }
- ベストアンサー
- SE・インフラ・Webエンジニア
- Ardinoについて…
C言語プログラミングについて…以下の文でスイッチ「RedSwitch(赤スイッチ)」が押された回数だけ後で光るというプログラミングを「switch case」文で作ったものがある。この「switch case」文を「if」文、もしくは「if else」に変換して同じプログラミングを作りなさいという課題が出て、うまくスイッチの押した回数が読み込めません。となたか解説お願いします。 void sw_check(void) { switch(SW_RedSwitch) { case 0: if ( digitalRead(2)==SW_ON ) { SW_RedSwitch=1; } break; case 1: if ( digitalRead(2)==SW_OFF ) { SW_RedSwitch=2; } break; } } void blink(void)
- 締切済み
- C・C++・C#
- テンプレート引数の型推測
コンパイラはVC++2008です。 いろいろあって、あるクラスにおいて関数ポインタと関数オブジェクト双方を 同じように利用できないかと考えて、次のように試みました。 class Base { public: virtual void func() =0; }; template<class Func> class CFunc :public Base { private: Func m_func; public: CThreadFunc(Func func):m_func(func){} void func(){m_func();} }; class Hoge { private: Base* base; public: template<class Func> Hoge(Func func) :base(new CFunc<Func>(func)) {} ~Hoge() { delete base; } void DoSomething() { base->func(); } }; クラスをテンプレートにするといちいち指定しなければならないので、 まず基底クラスに適当な仮想関数を設け、それを継承したクラスをテンプレートにしました。 そしてコンストラクタの引数で何かしらを受け取って、オーバーライドした関数の中で 関数ポインタか関数オブジェクトだと仮定して呼び出しています。 さらに基底クラスのポインタを目的のクラスが保持してやり、 こちらはコンストラクタをテンプレートにすることで引数から型を推測してもらうことで 先ほどのテンプレートクラスのインスタンスを作成しています。 そしてポインタを介してfunc()を使ったり…、などすれば、 とりあえず引数なしの関数と関数オブジェクトを同等に扱えないかなと思ったからです。 で、このようなクラスを作成してコンパイルすると、 void func(); //何かしら処理する関数 class Function { public: void operator ()(); //何かしら処理する関数オブジェクト }; があったとして、 int main() { Function function; Hoge hoge(function); //いったん作ってから渡す Hoge hoge2(func); //関数を渡す hoge.DoSomething(); hoge2.DoSomething(); } は動きました。しかし、 int main() { Hoge hoge(Function()); //引数を初期化する } とすると次のようなエラーが出ます。 warning C4930: 'Hoge hoge(Function(__cdecl *)(void))': プロトタイプされている関数が呼び出されませんでした (変数の定義が意図されていますか?) また、 int main() { Hoge hoge(Function()); //引数を初期化する hoge.DoSomething(); //クラスにアクセス } とすると次のようなほかのエラーが出ます。 error C2228: '.DoSomething' の左側はクラス、構造体、共用体でなければなりません。 しかし、例えば関数オブジェクトのコンストラクタに引数が設定されていたとして、 class Function { public: Function(int dummy); //何か値を受け取る void operator ()(); //何かしら処理する関数オブジェクト }; となっていた時、 int main() { Hoge hoge(Function(1)); //引数を初期化する hoge.DoSomething(); //クラスにアクセス } の呼び出しは正常にコンパイルされ、想定通りの動きをします。 全く使わなくても、一つ以上の適当な引数を何でもいいからコンストラクタが持てば、 普通にコンパイルされるみたいです。ただ、デフォルト引数を与えてHoge hoge(Function())と 同じ形ですと引数があってもできないみたいです。 まったく通らないなら最初からあきらめるですが、中途半端にちゃんと動くために エラーの原因を知りたいと思っています。 テンプレートの場合には、引数に渡すタイミングで初期化はしてはいけないのでしょうか?
- ベストアンサー
- C・C++・C#