タグ

CLangとC++に関するshigiryouのブックマーク (13)

  • 【C言語/C++】関数ポインタと関数オブジェクトを使ってみる - めめんと

    関数ポインタを使う 関数ポインタはポインタの一種で文字通り関数のポインタの事で、関数を遠隔操作できるようになる文法です。たぶんほとんどの場合関数の引数として使うんじゃないかと思うのでそれだけ紹介します。 #include<stdio.h> int add(int a,int b){ return a+b; } int sub(int a,int b){ return a-b; } //関数ポインタを使っている int calc(int (*func)(int,int),int a,int b){ return func(a,b); } int main(void){ int x = 10; int y = -4; int ans1 = calc(add,x,y); //足し算をしている int ans2 = calc(sub,x,y); //引き算をしている printf("%d,%d\n

    【C言語/C++】関数ポインタと関数オブジェクトを使ってみる - めめんと
  • お手軽C言語でオブジェクト指向っぽいことに挑戦

    C言語でオブジェクト指向っぽいことに挑戦してみます。 はじめからオブジェクト指向言語を使えといわないでください(笑)。 これはTECHI Vol.15「リアルタイム/マルチタスクシステムの徹底研究」に 「Cによる抽象化プログラミング-抽象データ型の理由-」という章を読んで、 なるほどと思ったことのまとめです。この章の初出は1996年です。 といっても複雑なことをするのではなく、 「データ+手続き」をひとまとめにして取り扱いやすくするということを行います。 ところで、上記のに、 僕が、以前からおぼろげながら持っていた「オブジェクト指向」に近いものを感じました。 章のはじめにイラストが描いてあり、そこには「自分のことは自分でやろうそれがおとなだ」と いうプラカードをもったAbstractDataTypeくんがいます。プログラムの中で役にたってくれるのは、 まさに「自分のことは自分で面倒みれる

  • プログラミング演習III C++上級編

    オブジェクトの動的生成とポインタ このページでは、仮想関数を学ぶ上で必要となる基礎事項をまとめておきます。 オブジェクトのスコープとコンストラクタ・デストラクタこれまでは、クラスのインスタンスを関数の自動変数として作成して使ってきました。自動変数は、そのスコープに入った時にスタックと呼ばれる場所に自動的に作成され、処理の流れがスコープから抜けると自動的に消滅します。コンストラクタとデストラクタが定義されたクラスでは、それらも自動的に呼び出されました。 C++言語における(C言語でも同様)自動変数のスコープは、ブロックと呼ばれる単位で決定されることに注意しましょう。対応した中カッコで囲まれた範囲 {...} がブロックです。関数も一つのブロックで構成され、その内部の for ループや whileループ、if 文を実行する範囲もひとつのブロックとなります。ブロックは入れ子(ネスト)構造にするこ

    プログラミング演習III C++上級編
  • 動的メモリの割り当て

    new と delete これまでもちらほらと動的メモリの割り当てに関する話が出てきました クラスのメンバで、動的に割り当てたメモリへのポインタがあるとうんたらと言う話です しかし、具体的にまだ動的メモリの割り当ての話をしていませんでした おそらく、動的メモリの割り当てと聞くと malloc() 関数を思い出すでしょう C++はC言語を用いることができるので、当然問題はありません が、C++で malloc() を使うことはあまり推奨されません C++ では独自のメモリ割り当て演算子 new 演算子 があるからです new type; type には、割り当てるデータ型を指定します。クラス型も当然OKです new 演算子は malloc() と違って、割り当てるべきバイト数を自動で計算してくれます sizeof() 演算子を用いてこちらから指定する必要がないので、割り当てミスの原因の一つが

  • 第四回-02 : new/delete によるメモリの動的管理

    ページでは「new/delete によるメモリの動的管理」について解説する。 malloc/free によるメモリの動的管理 (C 言語) new/delete によるメモリ管理に触れる前に、 「第二回-04 : メモリとポインタ」で取り扱った malloc/free による動的メモリ管理の復習をしておこう。 この手法は C 言語で主に用いられるもので、実は C++ で使われることはあまりない。 ここでは new/delete への導入として malloc/free について触れる。 まず、char 型のポインタ *p を定義し、そのポインタの指す先に要素数 SIZE=255 個の char 型の配列を確保することを考えよう。 「第二回-04 : メモリとポインタ」で取り扱ったように、これは なる命令で実現出来る。この際、ヒープ領域というメモリ領域から領域が確保されるのであった。 なお、

    第四回-02 : new/delete によるメモリの動的管理
  • IPA ISEC セキュア・プログラミング講座:C/C++言語編 第4章 不測の事態対策:メモリリーク対策

    メモリリークとは、プログラムのロジックの中で動的に割り当てたメモリブロックが解放されずに残る問題である。この問題の発生が積み重なると次第に使えるメモリ資源が枯渇し、プログラムはサービス不能状態に陥ってしまう。 メモリリーク問題はソースコードの静的検査で見いだすことが難しいとされている。 なぜなら、メモリリークを生じるプログラムミスの箇所を見いだすことは、ソースコードの構文を把握し、プログラムの動作をシミュレートしてメモリブロックのライフサイクルをたどる必要があるからである。 しかしながら、メモリリーク対策を施す一定のプログラミングスタイルが存在し、ソースコード中でそのスタイルが用いられているか否かを機械的に検査することはそれほど複雑なことではない。 稿では、そのようなプログラミングスタイルを取り入れることを提案すると共に、そのスタイルが用いられているか否かの検査をツールによる自動化を視野

  • 文字列で学ぶC++入門 - Qiita

    C言語の知識だけを前提にC++の取っ掛かりとなることを目的とします。 ※ C++の知識は前提としません。 基的に、C++はC言語の機能を包含しています。コードの大半をC言語と同じように書いて、一部だけC++の機能を使うことも可能です。 ※ このような使い方をbetter Cと呼びます。 C++には文字列を処理するための型があります。言語組み込みの機能ではなく、ライブラリで定義された型です。同じような型を自作することも可能です。 C言語の延長線上で文字列型を自作しながら、C++がC言語をどのように拡張した言語なのか、雰囲気を感じて頂ければと思います。 文字列型 C言語とC++で文字列の結合を比較してみます。 C言語 文字列の結合 #include <stdio.h> #include <string.h> int main(void) { char buf[8]; const char *

    文字列で学ぶC++入門 - Qiita
  • もう一度基礎からC言語 第26回 データ構造(5)~ポインタを使った文字列処理関数を作る ポインタの走りすぎを回避する

    文字列をコピーするstrcpy関数と文字列を連結するstrcat関数は、仕様上大きな欠点を抱えています。それを回避することを考えてみましょう。 他の変数領域を浸する 仕様上の大きな欠点とは、受け側(strcpyでは第2引数、strcatでは第1引数)の配列に余裕がない場合、確保していた要素を超えて文字がコピーされてしまう――という点です。 例えば、要素数が10個の配列destに"Hello world!"という文字列を保持している配列srcの内容をstrcpy関数でコピーすると、"world"の"l"(小文字のL)のところでdestの余裕は尽きてしまい、"d!'\0'"の3バイト分がはみ出してしまいます。 「はみ出す」とは、確保されていた配列の最後に続くメモリ領域に値を書き込んでしまう――ということです。そこに他の変数の領域があれば、内容は勝手に変更されてしまいます。 strcat関数の

  • 配列の動的確保

    まず、動的確保ってなんなの?って人もいるかもしれないのでその説明から始めます。 C/C++ では、配列のサイズというものは必ずコンパイル時(静的)に分かってなければいけません。 double a[10]; // OK int n; cin >> n; // キーボードから入力 double b[n]; // NG コンパイルエラーになる 配列を確保するときには a[10] のようにサイズは定数でなければならず、int n のような変数をサイズに使うことはできません。 (const int は可、変数ではなく定数だから。) 配列のサイズを実行時(動的)に決めたい場合に動的確保というの行います。 #include <stdlib.h> int n; double * b; scanf( "%d", &n ); b = (double *)malloc( sizeof( double ) * n

  • Linuxをはじめよう!:C言語でオブジェクト指向してみる

    最近、"オブジェクト指向"が流行っています。 "オブジェクト指向"とは"物体指向"という言葉どおり、 あるオブジェクトを中心にプログラムを考えていく ソフトウェアの”開発手法”です。 オブジェクト指向なプログラムを作成するのであれば オブジェクト指向プログラミング言語(OOPL) を用いてコードを作成します。 オブジェクト指向プログラミング言語は、オブジェクト指向な コードを書くための様々な機能が備えられています。 C++ , JAVA といった言語で使用できる クラスなどがそうです。 一般的に、オブジェクト指向なプログラムには OPPLを使用しなければ"ならない" という誤解がされますが、そんなことはありません。 たしかに、OPPLを用いることでオブジェクト指向なコードを 作成することは非常に簡単になります。 しかし、あくまでオブジェクト”指向”は プログラミングの"考え方" です。 つ

  • 動的なオブジェクトの生成 | Programming Place Plus C++編【言語解説】 第14章

    C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 -> C++23 と更新されています。 なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。 関連する話題が、以下のページにあります。 new、delete の動作をカスタマイズする方法について。第36章 new と delete 動的にメモリ領域を割り当てたうえで、その領域にオブジェクトをインスタンス化したい場合には、std::malloc関数などのC言語から引き継いだ関数を

    動的なオブジェクトの生成 | Programming Place Plus C++編【言語解説】 第14章
  • CとC++の動的メモリ管理(1)、malloc関数とnew演算子の違いを知る

    CとC++の動的メモリ管理(1)、malloc関数とnew演算子の違いを知る:組み込み技術(1/2 ページ) C言語とC++言語では、動的にメモリを確保したり解放したりする手法が異なり、それぞれ長所と短所がある。もちろん、安全性を最重要視する組み込み機器では、動的に確保したメモリを利用すべきでないという考え方には心から賛同する。 C言語とC++言語では、動的にメモリを確保したり解放したりする手法は異なり、それぞれ長所と短所がある。もちろん、安全性を最重要視する組み込み機器では、動的に確保したメモリを利用すべきでないという考え方には心から賛同する。リスクが利点を上回ってしまうからだ。しかし場合によっては、動的なメモリを適切に管理することで改善できることも多いのではないかとも考えている。 C言語やC++言語に標準的に用意されているメモリ管理向け関数の動作が意図した通りでない場合は、メモリ管理関

    CとC++の動的メモリ管理(1)、malloc関数とnew演算子の違いを知る
  • C++/CLI ラッピング入門2 ラッピングの基礎 関数編

    C++/CLI ラッピング入門 今回は関数ラッピングについてです。 —————————————————————– 関数のラップは、 マネージドクラスのメンバ関数の中で、 ネイティブ関数を適切な引数を与えて呼び出し、 戻り値を適切にラップして返すという作業になります。 全てのマネージ関数はメンバ関数または、staticメンバ関数である必要があります。 ・引数も戻り値もない関数は普通に呼び出すだけでラップできます。 “ref class”は参照型のマネージドクラス(C#でいうクラス)で有ることを表しています。 “value class”にすると値型マネージクラス(C#で言う構造体)になりますが、 コンストラクタやデストラクタの使用などに制限があるため、アンマネージクラスのラップにはあまり使いません。 //--------------------- // ネイティブ関数宣言 void func(

    C++/CLI ラッピング入門2 ラッピングの基礎 関数編
  • 1