タグ

programmingとc_c++に関するpipeheadのブックマーク (129)

  • 浮動小数点演算ではまった話 - bkブログ

    浮動小数点演算ではまった話 浮動小数点演算のありがちな問題ではまりました。 いろいろ調べているうちに x86 特有のちょっとおもしろい 現象に遭遇したので紹介したいと思います。 パーセンテージの計算 簡単な C のプログラムでパーセンテージを計算しようと思い、 次のようなコードを書きました。 int x, y; ... int a = (double)x / y * 100; int a = x * 100 / y としないのは、 x が大きい場合に x * 100 が オーバーフローを起こす (INT_MAX を越える) ためです。 このコードは一見、期待通りに動いていたのですが、 しばらく使っていると、手元の環境では x = 53, y = 100 のときに a は 53 ではなく 52 になることに気づきました。 これは次の理由によります。 式の最初の (double)53 / 10

    pipehead
    pipehead 2007/02/28
    /* 変数に代入するか否かで結果が変わる */ > x86 では 浮動小数点の演算は 80 ビットのレジスタで行われます。 80ビットの計算結果を double サイズ (手元の環境では64ビット) のメモリに戻すときには 64 ビットに丸められます。
  • http://white.s151.xrea.com/wiki/index.php?memo%2Fpython%2Fpython%A4%AB%A4%E9import%BD%D0%CD%E8%A4%EBdll%A4%CE%BA%EE%C0%AE

  • Paken.NET | TCHAR型のススメ

    C/C++Windowsプログラミングをやり始めたとき、誰もが一度は嫌になるあの謎のデータ型。 "LPCTSTR"なんてのはその典型例です。 しかし、これが何かを知らぬまま放っておいてる、ということが意外とありがちなんですよね。 というわけで、一応簡単に解説しておくことにしよう、と思ったまでです。 ※ 開発環境は、Microsoft Visual C++ 2005 を想定しています。 1.UNICODE 文字コードとはつまり、数値と文字の関係を示したものです。 文字'a'は128で表し、文字'b'は129で表し・・・と文字と数値が一対一で対応して定められています。(数値は適当です) UNICODEも、その文字コードの一種で、古い文字コードのASCIIに比べて新しいものです。 NT系のWindowsには全て対応しているので、現在のほとんどの環境がUNICODE対応となっています。 だったら

  • 第1回 Windowsのプロセスを詳しく探る

    大手コンピュータ・メーカー勤務。入社以来10数年をソフトウェア開発の現場で過ごし,その後ソフトウェア品質部へ異動。現場への技術支援や品質教育開発などを主に行っている。「APIで学ぶWindows徹底理解」(日経BP社)などを執筆。 2007年1月末の一般向け出荷を控え,Windowsの世界では新バージョンVistaが注目を集めている。開発者にとってWindows Vistaの一番のポイントはと言えば, .NET Framework 3.0を標準で搭載する点を挙げる人が多いだろう。雑誌にせよWebにせよ,最近のWindowsプログラミングの記事のほとんどは .NET向けだ。マイクロソフトも,これまでネイティブ・コードでの開発が主流だったC/C++開発まで, .NETへの移行を促そうとしている。実際,マイクロソフトが無償で配布しているC/C++統合開発環境Visual C++ 2005 Exp

    第1回 Windowsのプロセスを詳しく探る
    pipehead
    pipehead 2007/01/30
    プロセスとマルチタスクの説明; CreateProcess(), WaitForSingleObject(), GetExitCodeProcess()
  • 第6回 画像の縦横比を保ったまま拡大縮小する(UsefullCode.net)

    UsefullCode.net Visual Studio 2005/2008/2010やandroid SDK/NDKでの開発者向けに便利なソースコードを提供 This site provide you with useful source codes under 'USEFULLCODE license'. 前回までにウインドウにJPEG画像を表示する処理を作成した。しかし表示される画像は縦横比に関係なく拡大縮小されてしまっている。そのため今回は縦横比を保ったまま拡大縮小させる。 ImageViewerView.hを開く。ここで赤枠内を修正する。この部分は画像表示をするクライアント領域の取得と画像の描画をしている。 DraiImage()は第一引数にImage、それ以降の4引数はそれぞれ描画開始XY位置と描画サイズを示している。 赤枠のように変更した。かなり長いソースコードになってしま

    第6回 画像の縦横比を保ったまま拡大縮小する(UsefullCode.net)
  • 真偽値比較表 - メモ帳

    C 0 のみ偽。 Perl 数値の 0、文字列の "0"、空文字列 ""、未定義値のみ偽。 Ruby false, nil のみ偽。 Python False、None、数値の 0、空文字、空のコンテナ(string、list、tuple、set、frozenset、dict など)のみ偽。 VimScript 数値の 0 のみ偽。文字列は暗黙にatoi()と同様の方法で数値に変換される。数値・文字列以外は真偽値として使えない。 VBScript Empty, Null, False, 0, "False", "0" は偽。文字列は大文字・小文字を区別しない。半角・全角も区別しない。 C (gcc -W -Wall -pedantic)では浮動小数点数を真偽値として使えた。コンパイルエラーになると思っていたのに。 printf(0.1 ? "true" : "false"); // tru

    真偽値比較表 - メモ帳
  • URLの表示回数を取得する(UsefullCode.net)

  • C++からSQLite3を使ってみる。 - seraphyの日記

    Python2.5でSQLite3を使って以来、C++でも試したいと思っていた。 Windows用のSQLite3のDLLは、msvcrt.dllのみに依存する、という手軽なものであり、DLL自体のサイズも400KB足らずと軽量である。 これを実際にプログラムに組み込んで使ってみた。 必要なもの SQLiteのページから、以下の2つをダウンロードする。 sqlitedll-3_3_8.zip sqlite-source-3_3_8.zip (sqlite3.h が必要なため) DLLは当然として、この中にはsqlite3.dllと、そのDEFファイルのみが置かれている。 ヘッダファイル等がないので、ソースを取得する必要がある。 実際に使うヘッダは、sqlite3.hだけである。 準備 DLLはあるがlibファイルがないので、 lib /def:sqlite3.def /machine:x8

    C++からSQLite3を使ってみる。 - seraphyの日記
  • いやなブログ - 文字列操作の比較表: Ruby, Python, JavaScript, P...

    文字列操作の比較表: Ruby, Python, JavaScript, Perl, C++ Ruby, Python, JavaScript, Perl, C++ の文字列操作の比較表を作りました。配列操作の比較表の続編です。間違いなどがあったらご指摘いただけると助かります。 Ruby (String) Python (str) JavaScript (String) Perl C++ (std::string)

  • Windows File Protection Hacking

    はじめに システムファイルのリバースエンジニアリングを行っていると、Windows File Protection(WFP)の存在がとても面倒に感じます。セキュリティ的観点から見ると、WFPはとても重要なシステムですが、プログラマや解析者からすると少しやっかいな存在です。よって私は、どうにかしてこのWFPを制御できないか、と考えました。このテキストは、その方法を模索した結果を書き記したものです。 私の環境は「WindowsXP SP2」であるため、このテキストは基的にその環境に従って書かれています。WFPはWindowsのバージョンによって多少の違いがあるため、もしかしたら他の環境では勝手が違うかもしれません。あらかじめご了承ください。 ./wfp.zip なお、今回作成したサンプルプログラム(./wfp.zip)をまとめてアップしました。ソースコードはこのテキスト内にも書かれてあります

  • 少し詳しい変換仕様の説明

    printf関数やscanf関数でおなじみの変換仕様ですが、実はとても奥が深いものです。特にsscanf関数では、変換仕様を使いこなすことにより様々な形での文字列の編集が行えます。ここでは、具体的な使い方を挙げながら変換仕様について説明してみようと思います。 1.出力変換仕様 printf、fprintf、sprintf などの書式出力関数で使われる変換仕様です。以下のような形式をしています。

    pipehead
    pipehead 2006/04/19
    printf(), fprintf(), sprintf() などで使われる書式指定文字列のアレ
  • 株式会社エス・スリー・フォー » Windows-API による文字列比較オブジェクト

    Windows-API による文字列比較オブジェクト やっかいな文字列処理 コンピュータが扱う文字がASCIIだけであった旧き良き時代には、プログラマはとても幸せでした。ふたつの文字列の大小を比較するには標準関数 strcmp を呼び出すだけでよかったのですから。 ところがコンピュータが日語と言うものを扱わねばならなくなってからというもの、strcmpだけでは済まなくなってしまったのです。 まず、ASCIIだけでなく、JIS,Shift-JIS,EUCなどの様々な文字セットに対して正しく処理しなければなりません。 幸いにもこれら文字セットについては内部的にはUnicode(wchar_t)に変換しておくことで文字セットによる扱いの違いを吸収することができます。 日語処理の大きな問題のひとつは文字列の比較です。 すなわち、文字列の比較の条件として、 全角/半角を区別する/しない ひらがな

    pipehead
    pipehead 2006/03/30
    CompareString()
  • Using SQLite3.DLL in Visual C++ 6.0

    SQLite Vesion 3 DLL版 を呼び出すC/C++アプリケーションの構築 SQLite Version 3 の DLL の導入と、C/C++アプリケーションからそれを使う方法を解説します。 使用する開発ツールは Visual C++ 6.0 です。 開発ターゲットは簡単なコンソールアプリケーションとします。 ビルドはコマンドライン環境で行います。統合環境上のプロジェクトで行う場合にはビルド手順を適当に読み替えてください。 Back to index Download sample-codes-using-sqliet3-dll.zip Step1. 必要なファイルをダウンロードする SQLite家サイトのダウンロードページから、次の2つのzipファイルを入手します。 ファイル名末尾の数字はリリースバージョンであり、その数字は頻繁に変わります。 3_3 以降の適切なものを選んで

  • SQLite3's C++ API 日本語

    C/C++ Interface For SQLite Version 3 [日語超訳版] 最終改訂: 2006年02月16日 10時59分54秒 原文: http://www.sqlite.org/capi3.html -- last modified on 2005/03/11 04:39:58 Back to index 1.0 Overview SQLiteバージョン3.0は、SQLiteの新バージョンであり、派生元のSQLite 2.8.13コード・ベースとは、非互換性のファイル・フォーマットおよびAPIを備えています。SQLiteバージョン3.0は次の機能要求に答えるために作成されました: UTF-16の対応 照合順序をユーザ定義可能なテキスト インデックス付カラムにBLOBを格納する能力 これらの機能を実装するためには、データベース・ファイル・フォーマットに非互換な変更が必要

  • 浮動小数点数型と誤差

    有限桁 C言語で扱える実数値は,2進数の有限小数で表された数値である.例えば次のようなものである. 1.5(10) = 1.1(2) 3.25(10) = 11.01(2) 理論的には小数が無限に続く値でも,そのうちの有限個の桁数でその値を表すしかない. 例えば,0.1 を2進数の小数で表すと 0.1(10) = 0.000110011001100110011...(2) と無限に続くが,コンピュータの内部では有限桁で丸められている. このような場合には,当の値ではなく,近似値でしか表すことができない. 指数表記(浮動小数点表記) 科学計算では非常に大きな実数値や非常に小さな実数値も扱うことがある. そのようなときには,通常の10進数の表記ではなくて,次のような指数表記で表すれば 無駄な 000...000 という桁を表記しなくてもよくなる. 1234567890000000000000

    浮動小数点数型と誤差
    pipehead
    pipehead 2006/01/18
    桁落ち, 情報落ち
  • ビットシフトの落とし穴 - 算術シフトと論理シフト - 職業としてのプログラミング

    C言語には、ビットシフト演算子というものがあります。左シフト演算子(<<)と右シフト演算子(>>)です。同じビット演算でも、ビット単位の論理和(|)や論理積(&)、NOT(~)等はの方は、フラグ型の変数の処理で使われる事が多い気がしますが、ビットシフトの方は使用されるケースはあまりないかもしれません。 さて、このビットシフト演算子で時々問題になるのが、符号ビットが立っている時の右シフト演算です。見逃されがちなポイントは、 型によって挙動(算術シフトか論理シフトか)がかわることがある C言語の規格として、算術シフトか論理シフトかは不定 Nbitの算術シフトと2のN乗での除算は等価ではない といったところにあります。 算術シフト(shift arithmetic)と論理シフト(shift logical:又は0充填シフト)という言葉をご存知ない方のためにちょっと説明を書いておくと、シフトによっ

    pipehead
    pipehead 2006/01/08
    > 挙動(signedなら算術シフト、unsignedなら論理シフト)は、gccの仕様であって、C言語の仕様ではないのです。残念なことに、C言語の規格としては、右シフト時に算術シフトになるか論理シフトになるかは規定していません。
  • いまさらのWindowsCEプログラミング(10) - システム情報の取得 - hishidaの開発blog

    今回は様々なシステム情報の取得方法を説明します。 GetVersionEx GetVersionEx()でOSのバージョンが取得できます。 OSVERSIONINFO osvi; memset(&osvi,0, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx( &osvi ); OSVERSIONINFOは次のように定義された構造体です。 typedef struct _OSVERSIONINFO{ DWORD dwOSVersionInfoSize; DWORD dwMajorVersion; DWORD dwMinorVersion; DWORD dwBuildNumber; DWORD dwPlatformId; TCHAR szCSDVersion[128]

    いまさらのWindowsCEプログラミング(10) - システム情報の取得 - hishidaの開発blog
    pipehead
    pipehead 2006/01/05
    GetVersionEx(), SystemParametersInfo(), GetSystemMetrics()
  • こんなプログラムはいやだ: 負の剰余 - bkブログ

    こんなプログラムはいやだ: 負の剰余 知人から次の式の計算結果はどうなるかという問題を出されました。 -3 % 5 3 % -5 -3 % -5 降参して答えを尋ねたところ、問題を出した方も答えを知らないことがわかりました。そこで、いくつかの言語処理系で結果を調べてみました。手元の環境 (Intel Xeon 上の Debian GNU/Linux sarge) で調べると2つのグループに分かれました。 C (GCC 3.3.5) Java (Sun JDK 1.5.0_05) PHP 4.3.10-16 Emacs 22.0.50.2 Ruby 1.8.2 Python 2.3.5 Perl 5.8.4

  • ATMARK

    133.242.243.6 / HatenaBookmark/4.0 (Hatena::Bookmark; Analyzer)

    pipehead
    pipehead 2005/11/28
    Modified キーの値について
  • 64bit OS と 32bit OS でのデータ型の相違一覧

    Perl-XS なモジュールを 64bit OS で使っていると、ごく希に変数型サイズが問題で不具合を経験することがあります。例えば、メジャーどころで言えば、日語係り受け解析器のCaboCha/南瓜を例に挙げますと、 src/common.h の103〜107行目 static inline void replaceString (std::string &s, const std::string &src, const std::string &dst) { unsigned int pos = s.find (src); if (pos != std::string::npos) s.replace (pos, src.size(), dst); } の unsigned int pos = s.find (src); の部分ですが、32bit 環境では問題は発生しませんが、64bi