トリッキーなコード その2
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNG大体トリッキーなコードを書く奴に限って
致命的なバグを出したりするんだけど、
書きたいもんはしょうがない。
・・・らしい
前スレ http://pc3.2ch.net/test/read.cgi/tech/983191866
0002デフォルトの名無しさん
NGNG./"´:;;::;;;: ::::;::"ソヽ
/ ,ヘ〜-ー'´⌒``ヽ:ヽ
/ ノ 彡:三:三:三:ミ |: \
| |. __,,;;ィ t;;;;,,,_ :ヽ│
| |シ ,ィェァ') (.yェュ、 ミ| |
!r、| ''''''. | | '''''' Y )
ヽ{ ヽ. (r、 ,n) /:: };ノ
し} : 、___二__., ;:::::jJ
!、.:. ´ ..::::... `ノ::::ノ
_,〉、ゝ '""'ノ/:|
__,,ィ';;;;ト `ニニ: ::..ノ|ヽ、 _
-ー''''"";;;;;;;;;;;;ヽ \::::::::/ /;;;;;;;;;;;`''ー-、,,,,__
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ヽ >< /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"''
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ヽ /|;;;jヽ、/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
自由と正義の名の下に、このスレにアメリカが介入しました。
以下、大統領に従ってください。
>>1弱いくせに調子に乗るなよこのジャップ豚(プ
>>2
>>3スモウレスラーかと思ったら、ただのデブか(プ
>>4コリアもジャップも同類だろエテ公(プ
>>5米ばっか食ってんな(プ
>>6トマホークかますぞ(プ
>>7エロアニメが文化かよ(プ
>>8ロリコン必死だな(プ
>>9イラクの次はお前だな(プ
0003デフォルトの名無しさん
NGNG0004デフォルトの名無しさん
NGNG0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNG0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNGまさにトリッキー
0009デフォルトの名無しさん
NGNGTrue = Not False
証明して下さい
0010デフォルトの名無しさん
NGNG0011デフォルトの名無しさん
NGNG0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNG0014デフォルトの名無しさん
NGNG// 標準仕様には入っていない(と思う)のですが、
// 初期ccでサポートされていたこともあり、
// たいていのコンパイラで実装されている知られざる演算子をご存じですか?
int main(void)
{
int a=10,b=7;
printf("割ってかける演算子、かけて割る演算子\n");
// 3で割ってから3でかける演算子
a/*=3;
// 5でかけてから5で割る演算子
b*/=5;
printf("a=%d b=%d\n",a,b);
return 0;
}
0015デフォルトの名無しさん
NGNGint main (void)
{
printf ("( ´_ゝ`)フーン\n");
return 0;
}
0016デフォルトの名無しさん
NGNG◆ある図形内に点が含まれるかどうかを高速に判断する
という問題はどう?
図形は、n個の点(x_1,y_1)-(x_n,y_n)で与えられるとしましょう。
n>=3で、(x_n,y_n)と(x_1,y_1)は繋がっていると考えてください。
このn個の点は、隣同士を線で結んでも、線が交わることがないものとします。
高速化のために条件を付加してもOKですが、明記してください
(例えば、凹んでいる部分は絶対に無い、n==4である、とか)
難しそう
0017デフォルトの名無しさん
NGNG(x>=x1 && x<=x2 && y>=y1 && y<=y2)
でいいのかな?
0018デフォルトの名無しさん
NGNGa=5 b=7 となるだけだが ?
(なんで、b*/=10; にしないんだろう...。)
0019デフォルトの名無しさん
NGNGコンパイラバグってるよ。アセンブラ出力して確認汁。
0020デフォルトの名無しさん
NGNGそれって古典的なネタじゃん
main() {
printf("%03d\n", 001);
printf("%03d\n", 010);
printf("%03d\n", 100);
}
これといい勝負。
0021デフォルトの名無しさん
NGNGいくつになるのが正解なの ?
0022デフォルトの名無しさん
NGNG自分でソース打ち込んで試せ。
ちゃんと自分でエディタを使って打てよ。
あとメモ帳やviみたいな色分けもできんような
エディタはミスしやすいから使うなよ。
0023デフォルトの名無しさん
NGNGviは最近は色分けできるよ
0025デフォルトの名無しさん
NGNGごめん、そうだね。
0026デフォルトの名無しさん
NGNGCなら
// 3で割ってから3でかける演算子
でエラーが出るのが妥当 (でも無いかも知れない)
C++なら
a=5, b=7 ;
で>>18で正しい
0027デフォルトの名無しさん
NGNG今の時代、Cコンパイラにだって
C++のコメントを許容するオプションくらいあるでしょ
0028デフォルトの名無しさん
NGNGなんだから
a=9
じゃないの??
0029デフォルトの名無しさん
NGNG正しいC環境がインストールされていませんね。
0030デフォルトの名無しさん
NGNGだから自前で書いて試せって。
色付け可能なエディタでな。
0031デフォルトの名無しさん
NGNG/* だからネタなんだって */
0032デフォルトの名無しさん
NGNGb*/=5;
は
a
/*=3; b*/
=5;
だから
a=5;
0033デフォルトの名無しさん
NGNG(゚Д゚)ハァ?
0034デフォルトの名無しさん
NGNG(゚Д゚)ハァ?
0035デフォルトの名無しさん
NGNG初めて見ました。
0036デフォルトの名無しさん
NGNG一人ボケ一人突っ込みかよ。
0037デフォルトの名無しさん
NGNGa = 1/*p;
0038デフォルトの名無しさん
NGNGむしろ一人突っ込み一人ボケ。
0039デフォルトの名無しさん
NGNG普段から
a = 1 / *p;
のように演算子の前後に空白を開けてれば問題ない。
0040デフォルトの名無しさん
NGNG0041デフォルトの名無しさん
NGNG俺の事です
0042デフォルトの名無しさん
NGNG楽しかった。
0043デフォルトの名無しさん
NGNGトリッキーの1ってここのスレの人?
0044デフォルトの名無しさん
NGNG↓
xor eax, ebx
xor ebx, eax
xor eax, ebx
いただきました。
0045デフォルトの名無しさん
NGNG入れ替える必要は、ほとんど無いだろ
0046デフォルトの名無しさん
NGNGすげー盛り上がっててかなりいい感じだったね<前スレの最初の方。
このスレにも降臨してくれないかな・・
0047デフォルトの名無しさん
NGNG0048デフォルトの名無しさん
NGNGint main=0xc3;
0049デフォルトの名無しさん
NGNG0050デフォルトの名無しさん
NGNG最近のCPUではパイプラインが有効に働かず遅くなるだけ。
0051デフォルトの名無しさん
NGNGその言い方、ダウトっぽい
0052デフォルトの名無しさん
NGNG101 jmp 100
0053デフォルトの名無しさん
NGNGloop
0054デフォルトの名無しさん
NGNG0055デフォルトの名無しさん
NGNG$x=$_='#!/usr/bin/perl&$x=$_=";&s/\046/\n/g;s/\042/\047$x\047/;print;&';
s/\046/\n/g;s/\042/\047$x\047/;print;
0056デフォルトの名無しさん
NGNGおまいら皆アフォ?
矩形(くけい)だろ、ヴォケ
0057デフォルトの名無しさん
NGNG2ch でその突っ込み...、しかも10日も立ってから...。
はっ !! もしかして本人なのか ?
005856
NGNG今前スレ読んでるんだが面白いな
短形ってがいしゅつとかの類かね、素で間違ってそうなんだが
005956
NGNG0060デフォルトの名無しさん
NGNGいきなりキレかよ!
0061デフォルトの名無しさん
NGNG思わず短小、もとい苦笑
006256
NGNGいつも突っ込めずに居るんだ(;´д`)ストレスタマルヨー
0063デフォルトの名無しさん
NGNG006456
NGNG任意の文字列を、10進数に変換するコードを書きなさい。
char *binary = "11011100";
int decimal;
/* */
printf("%s is %d\n",binary,decimal);
0065デフォルトの名無しさん
NGNGこの文がどれだけ曖昧で意味不明か、自分でわかってる?
数値自体は2進数で「表示」しようと10進数で「表示」しようと
同じ値だから変換もなにもないし、
そもそも元の文字列が何進数を文字列にしたものなのかわからない。
多分、「任意の2進数を表す文字列を数値に直し、10進数として表示しなさい」
って意味だと思うけど。
0066デフォルトの名無しさん
NGNGuzeeeeeeeeeeeee
いつも客にうだうだ言ってそう
0067デフォルトの名無しさん
NGNG0068デフォルトの名無しさん
NGNG> 見りゃ分かるだろ、
仕様書もまともに書けない客にこう言われてカリカリしてたんじゃないですか。
0069デフォルトの名無しさん
NGNGだれも反応してくれないけど,地雷だと思った?
実行すると,自分自身を表示するperlプログラムでした.
Cで同じことするプログラム キボンヌ
0070デフォルトの名無しさん
NGNG仕様書まともに書けない客=普通
客から仕様を上手く引き出せない技術屋=無能
だと思った。
0071デフォルトの名無しさん
NGNG> 実行すると,自分自身を表示するperlプログラムでした.
それは分かるけど、
> Cで同じことするプログラム キボンヌ
そういう意図が隠されていたとは気づかなかった。
0072デフォルトの名無しさん
NGNGワインバーグの「要求仕様の探検学」でも読みましょう、ということで
http://www.amazon.co.jp/exec/obidos/ASIN/4320023528/ref=sr_aps_b_/249-2652411-1648337
>>69
前スレ見てね。不動点プログラムで検索すれば見つかるよ。
トリッキーの1によれば、
10 LIST
だそうです(笑)
>>64
まずは素直なコードから。コンパイルしてないのでエラーあったらスマソ
char* p=binary;
while(*(p++));
for(int r=0,i=0;p!=binary;--p,++i) r+=(1<<i)*(*p-'0');
0073デフォルトの名無しさん
NGNG> 客から仕様を上手く引き出せない技術屋=無能
技術屋つってもいろいろあるわけだが、「客から仕様を引き出す」ってのがSE
の仕事だから、それがうまくできないSEなら無能だな。
0074デフォルトの名無しさん
NGNG自己レスすまそ。バグ内包してますな。
でもまぁトリッキーでないコードなので修正はやめておきます
0075デフォルトの名無しさん
NGNGうちはいつまでたっても ひとりXP ですよ
0076デフォルトの名無しさん
NGNG「もしかしてクケイの事?(笑)」ぐらいにして
0077デフォルトの名無しさん
NGNGこのスレに限らずこの板の全体的な(技術or人間)レベルが落ちている
可能性が高いな
0078デフォルトの名無しさん
NGNG0079デフォルトの名無しさん
NGNGどうでしょ?
char *p = binary;
decinal = 0;
while (*p) decimal = (decimal << 1) | (*p++ - '0');
008079
NGNG0082デフォルトの名無しさん
NGNGお前さぁ、それに"10"を渡したらなんて表示されるか考えてみたか?
0083デフォルトの名無しさん
NGNG多分最速ではないかと
unsigned int d=0,i=sizeof(int)*8;
char *p=binary;
while(*p!='\0') (*(p++)-'0')?d+=(1<<(--i)):i--;
d>>=i;
0084デフォルトの名無しさん
NGNG文字列→変数のマップを用意して(以下略)
0085デフォルトの名無しさん
NGNGchar *p="任意の文字列";
long num = (int)p;
「任意の文字列を10進数に変換しろ」だけではこーいう解釈も(無理矢理)成り立つ罠。
元の文字列の条件と、読み取りルールをきちんと書け。
ex.
「'0'と'1'からなる任意の文字列を2進数として読み取り、
結果を数値型変数に格納せよ」
0086デフォルトの名無しさん
NGNGいや、もうその話題は終わったから
つーか何でそんなに粘着なの?
0087デフォルトの名無しさん
NGNG何処からどう見ても2
0088デフォルトの名無しさん
NGNG#include <limits.h>
char *p=binary;
unsigned int c,d=0,i=sizeof(int)*CHAR_BIT+1;
while(((c=*p++-'0')>>1)==0&&--i)d=(d<<1)+c;
0089デフォルトの名無しさん
NGNG0090デフォルトの名無しさん
NGNG0091デフォルトの名無しさん
NGNGwhile(--i&&((c=*p++-'0')>>1)==0)d+=d+c;
0092デフォルトの名無しさん
NGNG七行かぶれで短くしてるだけやん
0093デフォルトの名無しさん
NGNG0094デフォルトの名無しさん
NGNG0095デフォルトの名無しさん
NGNGなにせ「ファイルを自動で開く」という至極基本的な動作を行う
プラグインが簡単に作れない。
0096デフォルトの名無しさん
NGNGよー知らんけど、それはお前の技術力がないからということはないのか ?
0097デフォルトの名無しさん
NGNG漏れに技術力があるかどうかは知らんが、
そのソフトのAPIだけでは実現できず(どーやっても選択ダイアログが出る)、
キーストロークのエミュレートしたり、DDEコマンド投げたりせんと実現できん
というのはどう考えても変だと思うんだよ…
ちなみにマニュアルには「スクリプトを実行しる!」みたいな事が書いてあった。
しかも上記の手を使ってもプラグイン実行中に開けない。
(本体がコマンド受付状態になってからでないと開かない)
0098デフォルトの名無しさん
NGNG0099デフォルトの名無しさん
NGNG禿同、回避方法がトリッキーだったりするけど。
0100デフォルトの名無しさん
NGNG100get
010195
NGNGオブジェクトGetした後の開放手段がバラバラ
(free、delete、独自関数、開放不要のごちゃ混ぜ)
とかいった話はマ板でネタにしてきます。
これで業界トップのシェア持ってるというから、驚きなんだよなぁ…
0102デフォルトの名無しさん
NGNG最初からそうなの?
Windowsにもメモリ管理のAPIが何種類あることか…
0103デフォルトの名無しさん
NGNG0104デフォルトの名無しさん
NGNGいいと思うけど、例えば 下位6bitだけ交換したいような場合に応用出来るのは >.44
0105デフォルトの名無しさん
NGNG44 でそんなことができるの?
0106デフォルトの名無しさん
NGNG> xchg 命令は遅いのだよ
0107デフォルトの名無しさん
NGNG0108デフォルトの名無しさん
NGNG0109デフォルトの名無しさん
NGNGマルチプロセッサ環境ではlockが入るので、
タイトなループでやらかすと酷いことになる。
シングルプロセッサで遅いという話は知らない。
0110デフォルトの名無しさん
NGNGレジスタ同士でも?
0111デフォルトの名無しさん
NGNG実際のコード書いてみて。
0113107
NGNGmov ebx,eax
xor ebx,edx
and ebx,63
xor edx,ebx
xor eax,ebx
>>110 たぶん 勘違いしてると思う P2かP3かで XCHG は >>44 の3命令と同じ負荷の筈
0114デフォルトの名無しさん
NGNGなるほどー。
さんくす。
0115デフォルトの名無しさん
NGNG>>113 は嘘を仕込むなよ。
0116!113
NGNGマニュアルには
XCHG命令には自動的にLOCKプリフィックスが付くものと想定されている
と書かれているが、前後の文意から
LOCKが必要なものは、自分でLOCKしてね♪
と言う意味で、常にLOCK#信号を出す訳では無いに100カノッサ
0117デフォルトの名無しさん
NGNG> mov 3回よりも速いみたいだが
> push/popは勿論論外(w
なの?xchgはパイプライン崩すとかあった気がしたが。
クロック計算は486時代以来してないので最近のは知らんのだが。
0118デフォルトの名無しさん
NGNG0119107
NGNG>XCHG 命令は、LOCK プリフィックスの有無に関係なく、常にLOCK# 信号をアサートする。
これを読んで勘違いしたんだな。でも、
>メモリ・オペランドが参照されていると、
>LOCK プリフィックスの有無、あるいはIOPL の値に関係なく、プロセッサのロッキング・プ
>ロトコルが交換操作が持続している間自動的にインプリメントされる。
だから、これは対メモリに関する項だと思うよ。
それに、
>NOP 命令は、XCHG (E)AX, (E)AX 命令の別名ニーモニックである。
だから もし必ず XCHG が LOCK#アサートだとすると NOPでも同じ事になる。
確認したら XCHG eAX,r16/32 uOP数は3みたい
0120デフォルトの名無しさん
NGNGP5ではペアリング不可。
P6以降はu-opに分解される?
でもリネーミングならOP数1のような。
0121デフォルトの名無しさん
NGNGスコープ解決演算子の無い(ANSI準拠)Cで
グローバル変数を使うときに
struct{
int a; //・・・
・
・
・
FILE in; //・・・
}global;
と定義して、使うときにわざわざglobal.aとかやってるんですけど
同じ方法とってる人や、もっといい方法を知ってる方いませんかー?
0122デフォルトの名無しさん
NGNG0123デフォルトの名無しさん
NGNG{
char *p = strcpy((char*)malloc(strlen("hello,world\h")+1), "hello,world\n");
printf(*p)
}
0124デフォルトの名無しさん
NGNG似たようなことを偶にやります。
オレの場合、globalでなく、そのソースのファイル名にちなんだ名前を付けます。
static付けるとマップファイルに出てこなくなるから、
ユニークな名前を付けるために、ファイル名を頭に付けるようにした。
関連するグローバル変数を構造体にまとめるようにし始めた。
そうこうしているうちに全部構造体に押し込むようになってしまいました。
0125デフォルトの名無しさん
NGNG0126デフォルトの名無しさん
NGNG0127デフォルトの名無しさん
NGNG後ろから見たケツ?
0128デフォルトの名無しさん
NGNGそれで何か困るの?
まぁ、あとは命名規則などをしっかりとすれば、
グローバル変数との衝突なんてそう簡単には起こらないと思うけれど、
規模によってはあり得るだろうな。
0129デフォルトの名無しさん
NGNGいまさらだが試してみたガッテン。
改行が多いと怒られたので以下、分割。
#include <windows.h>
#include <stdio.h>
#defineLOOP500000
#define_ALIGN_//align 2
func1()
{
_asm
{
movecx, LOOP
_ALIGN_
f1:movedx, eax
moveax, ebx
movebx, edx
dececx
jnzf1
}
}
0130129
NGNG{
_asm
{
movecx, LOOP
_ALIGN_
f2:xoreax, ebx
xorebx, eax
xoreax, ebx
dececx
jnzf2
}
}
func3()
{
_asm
{
movecx, LOOP
_ALIGN_
f3:xchgeax, ebx
dececx
jnzf3
}
}
0131129
NGNG{
_asm
{
movecx, LOOP
_ALIGN_
f4:pusheax
pushebx
popeax
popebx
dececx
jnzf4
}
}
int prof(void (func)())
{
__int64start, end, freq;
HANDLEhprocess;
DWORDoldclass;
hprocess = GetCurrentProcess();
oldclass = GetPriorityClass(hprocess);
0132129
NGNGSleep(10);
SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);
func();
QueryPerformanceCounter((LARGE_INTEGER*)&end);
SetPriorityClass(hprocess, oldclass);
return (int)(end-start);
}
main()
{
printf("func1 = %d\n", prof(func1));
printf("func2 = %d\n", prof(func2));
printf("func3 = %d\n", prof(func3));
printf("func4 = %d\n", prof(func4));
}
結果
func1 = 6685
func2 = 9706
func3 = 6426
func4 = 10277
xchg が一番早い。xorが一番遅い。
0133デフォルトの名無しさん
NGNG0134デフォルトの名無しさん
NGNG実行環境は?
0135デフォルトの名無しさん
NGNG>>134 Pen3 のノートPCでつ。ほかの石だとどうなんでしょう?
0136デフォルトの名無しさん
NGNGしかも一番遅いのはpush/popだった。鬱
0137デフォルトの名無しさん
NGNGOSやCPUの周波数も書いてくれ。
0138デフォルトの名無しさん
NGNG比率の問題だろ。周波数は関係ないだろ。
それよりもCPUの世代だろ。
OSもあまり関係ないと思うがな。
0139デフォルトの名無しさん
NGNG知ったか君は黙っといたほうがいい。
0140デフォルトの名無しさん
NGNG0144デフォルトの名無しさん
NGNG環境は関係なさそうでも書いとくのが普通では?
そんな基本も知らないアホがこの板の多数なのか?
0145デフォルトの名無しさん
NGNG0146デフォルトの名無しさん
NGNGまあ、この場合はベンチマークプログラムそのものが無意味っぽいですが。
0147デフォルトの名無しさん
NGNG0148デフォルトの名無しさん
NGNG1クロックで1μopの命令が、あと2つ同時に実行出来るはず
( 1クロックで4μopが1つと1μopが2つ同時に実行できる )
他の命令では少なくとも3命令になってしまうので
OSに関係なくP6系ではxchgが1番早い
0149デフォルトの名無しさん
NGNG0150デフォルトの名無しさん
NGNG環境書きたくない理由があるのか?
0151107
NGNGprocedure SwapXCHG(var a,b:Integer) ;
asm
xchg eax, edx
end;
procedure SwapXOR(var a,b:Integer);
asm
xor eax, edx
xor edx, eax
xor eax, edx
end;
function RDTSC:Integer;
asm
RDTSC
end;
var cXCHG,cXOR,c0,c1,i,j:Integer;
var a,b:Integer;
begin
a:=1; b:=2; cXCHG:=0;cXOR:=0;
c0:=RDTSC;
for j:=0 to 9 do begin
for i:=0 to 9 do SwapXCHG(a,b);
c1:=RDTSC;inc(cXCHG,c1-c0);c0:=c1;
for i:=0 to 9 do SwapXOR(a,b);
c1:=RDTSC;inc(cXOR,c1-c0);c0:=c1;
end;
Memo1.Lines.Add(Format('XOR=%5d XCHG=%5d',[cXOR,cXCHG]));
end;
Athron 800M での結果 XOR= 1424 XCHG= 1481
順番を逆転したら逆の結果が出たから、ほぼ同じなんでしょ
0152デフォルトの名無しさん
NGNG残りもマネをするんだなあ。
0153デフォルトの名無しさん
NGNG151を良く見ろ、コードが全く違うぞ。
それ以前の問題だ。
0154107
NGNGまあ、時間測るだけだからいいか
0155デフォルトの名無しさん
NGNGfor や func call やタスクスイッチのオーバーヘッドの方が
大きかったりしないか?
>>129 の方がまだ信憑性ありそうだな。
お前ら >>129 のコード実行してOS、CPU(ステップ&周波数含む)と共に報告スレ。
漏れはスペースが全部なくなってて挫折しますた。(w
0156デフォルトの名無しさん
NGNGpush/pop での交換は確実に遅い。スタック操作を伴なうから
プロテクトモードでならメモリ保護チェックが必ず発生してしまう。
#コンパイラの最適化レベルを上げるとcall/retを減らすように
#アセンブルコードを出力しようとするのもこの理由による。
xor他による交換の場合は、二つ目、三つ目の演算命令は
その前の演算命令によってレジスタ内容が完全確定していないと
演算自体することが出来ないわけだから、それぞれの命令間で
パイプラインストールが発生する可能性が非常に高い。
#それぞれの命令間にNOPを挟んでも実行時間に大差なければほぼ間違いない
xchg の場合、厳密にはレジスタの内容を交換しているのではなくて、
現在ではレジスタの名前のほうを(CPU内部的に)交換していると思っていい。
なので交換対象レジスタの組み合わせによってはストールしにくい(またはしない)
#むかしのCPUでは確かにレジスタ内容自体を交換していた。(RISC系は現在でもそう)
#けど多段パイプラインやコード予測機能の絡みもあるので、
#CISC系ではそういうのに影響を与えにくい設計に進化してきている(はず)
まあ、純粋培養のソフト屋さんにハード依存の話をしても、
なかなか想像力が付いて来ないだろうとは思うけどね…。
0157デフォルトの名無しさん
NGNGマジレスカコワルイ
push/popはメモリアクセスする時点で遅いのは確定。
俺の興味はどっちかというとどれ位遅いかだな。
xorやmovによる交換も実質レジスタリネーミングされると
考えればパイプラインストールはほぼ発生してないはず。
129の結果どおりだとすれば、156のとは正反対の
mov/xor 3回よりは xchg の方が早いが、
xchg単体は mov/xor単体よりもずっと遅い
という結果が出てくる。
0158デフォルトの名無しさん
NGNGここの住民はそのうちメモリ容量とかHDD容量とかビデオチップとか
言い出す予感。
0159デフォルトの名無しさん
NGNG0160107
NGNG負荷を測るなら for や call の時間込みで測定するのがホントじゃないの?
まあ、ループした方がいいっていうなら
procedure TForm1.Button1Click(Sender: TObject);
procedure SwapXCHG;
var i:Integer;
begin for i:=0 to 100-1 do asm xchg eax, edx end;
end;
procedure SwapXOR;
var i:Integer;
begin for i:=0 to 100-1 do asm
xor eax, edx
xor edx, eax
xor eax, edx
end;
end;
function RDTSC:Integer;
asm RDTSC
end;
var cXCHG,cXOR,c0,c1,i,j:Integer;
var a,b:Integer;
begin
a:=1; b:=2; cXCHG:=0;cXOR:=0;
c0:=RDTSC;
for j:=0 to 9 do begin
SwapXCHG; c1:=RDTSC;inc(cXCHG,c1-c0);c0:=c1;
SwapXOR; c1:=RDTSC;inc(cXOR,c1-c0);c0:=c1;
end;
Memo1.Lines.Add(Format('XOR=%5d XCHG=%5d',[cXOR,cXCHG]));
end;
これでも 結果は XOR= 3589 XCHG= 3631 でAthronでは同じって結論でいいんじゃないの
0161107
NGNGXOR= 4044 XCHG= 3756
って事で、若干 XCHG 命令が速いね。
まあ当然の結果だけど。
0162107
NGNGabs(x) を CDQ /XOR /SUB で書けるように
max(a,b) を書くのに分岐無しで書くのに応用出来る
0163デフォルトの名無しさん
NGNG何を言っているのかわからないんだけど・・・。
> xorやmovによる交換も実質レジスタリネーミングされると
> 考えればパイプラインストールはほぼ発生してないはず。
そうなの??
mov はわからんでもないけど、xor が?
> xchg単体は mov/xor単体よりもずっと遅い
> という結果が出てくる。
単体で比較して何か意味あるの?
mov や xor に xchg 相当の事をやらせて初めて比較の意味があるんだけど。
0164デフォルトの名無しさん
NGNGアセンブラの話よりも、本格的にトリッキーなコードキボンヌ
0165デフォルトの名無しさん
NGNG0166デフォルトの名無しさん
NGNGprintf("VOYAGER マンセー\n");
return 0;
}
0167デフォルトの名無しさん
NGNGシフトJISの1バイト目か判定(コピペ
外出だったらスマソ。
新年もトリッキーなコードが飛び交いますよう
0168デフォルトの名無しさん
NGNG0x05, 0x0000ffff ;add eax, 0000ffff
}
機械語直打ちキター
0169デフォルトの名無しさん
NGNG大晦日に萎えるソースコード持ってくるな・・・
前スレ嫁、そして初日の出を見ることなく氏ね
0170デフォルトの名無しさん
NGNG0xff, 0xf1 ;push ecx
0xe8, 0x40229833 ;call 40229833
}
(´∀`)あはは
0171デフォルトの名無しさん
NGNG0x90
}
( ゚∀゚ )あっひゃっひゃっひゃ
0172デフォルトの名無しさん
NGNGそれは前スレで外出だったと思う。
どこからのコピペ?
0173デフォルトの名無しさん
NGNGhttp://www.st.rim.or.jp/~phinloda/phin/phin9509.html
0174デフォルトの名無しさん
NGNGNIFTYのどこかだと思ってたけど、元はFCだったか。
0175デフォルトの名無しさん
NGNGマシン語の世界ではごくごく普通に使ってた計算式であり、
アルゴリズムなんだけど、高級言語に浸かってくると
やっぱり忘れてしまうわな、そういうの…。
#CMP一発で5分岐するとかって、あったなぁ。
0176ツッコミ初め
NGNG別にマシン語の世界じゃなくたって、一般的では。
境界線は自前で書いてるか、ライブラリ使ってるか、じゃないの?
0177デフォルトの名無しさん
NGNG大小によって -1,0,1を返す関数
type TValueSign = -1..1;
function CompSign(A,B:Integer):TValueSign;
asm
CMP EAX,EDX; //A-B
SETGE CL
ADD CL,CL
DEC CL
CMP EAX,EDX; //A-B
SETZ AL
DEC AL
AND AL,CL
CBW
CWDE
end;
0178デフォルトの名無しさん
NGNG0179デフォルトの名無しさん
NGNGvoid SwapXCHG(int& a, int& b)
{
asm {
mov eax, [a]
mov ebx, [b]
xchg eax, ebx
mov [a], eax
mov [b], ebx
}
}
void SwapXOR(int& a, int& b)
{
asm {
mov eax, [a]
mov ebx, [b]
xor eax, ebx
xor ebx, eax
xor eax, ebx
mov [a], eax
mov [b], ebx
}
}
0180デフォルトの名無しさん
NGNG{
int i;
asm {
RDTSC
mov [i], eax
}
return i;
}
int main()
{
int a = 1, b = 2;
int c0, c1, cXCHG = 0, cXOR = 0;
for (int j = 0; j < 10; j++) {
c0 = RDTSC();
for (int i = 0; i < 1000; i++) SwapXCHG(a, b);
c1 = RDTSC();
cXCHG += c1 - c0;
c0 = RDTSC();
for (int i = 0; i < 1000; i++) SwapXOR(a, b);
c1 = RDTSC();
cXOR += c1 - c0;
}
std::cout << "XCHG = " << cXCHG << std::endl;
std::cout << "XOR = " << cXOR << std::endl;
}
0181デフォルトの名無しさん
NGNG両者の関数のクロック数にほとんど差がない。
>>177の比較関数もC++化して実行してみたが、単純なif文の方が約40%ほど
速かった。アセンブラによるトリッキーな書き方にはクロックの上でのアドバン
テージはないのだろうか。
0182デフォルトの名無しさん
NGNG比較の場合はランダムデータですか?
最近のCPUは分岐予測が余程優れているのかな…。
0183デフォルトの名無しさん
NGNGランダムデータではないです。変数に値を入れておいて比較しました。
こんな感じ。
int main()
{
int c0, c1, cSETCC = 0, cIF = 0;
int a = 1, b = 2;
for (int j = 0; j < 10; j++) {
c0 = RDTSC();
for (int i = 0; i < 1000; i++) {
cmp1(a, b);
cmp1(b, a);
cmp1(a, a);
}
c1 = RDTSC();
cSETCC += c1 - c0;
c0 = RDTSC();
for (int i = 0; i < 1000; i++) {
cmp2(a, b);
cmp2(b, a);
cmp2(a, a);
}
c1 = RDTSC();
cIF += c1 - c0;
}
std::cout << "setcc = " << cSETCC << std::endl;
std::cout << "if = " << cIF << std::endl;
}
0184デフォルトの名無しさん
NGNG分岐予測が働きにくくなるからでしょうね。
0185デフォルトの名無しさん
NGNGどれらいのランダムネス(?)が境界になるのか知りたいところ
0186デフォルトの名無しさん
NGNGP4だと、40個毎に乱数の系列を戻した時にほぼ同じタイムになるみたい。
const int N = 1000;
int cmp1(int& a, int& b)
{
int i;
asm {
MOV EAX,[a]
MOV EBX,[b]
CMP EAX,EBX; //A-B
SETGE CL
ADD CL,CL
DEC CL
CMP EAX,EBX; //A-B
SETZ AL
DEC AL
AND AL,CL
CBW
CWDE
MOV [i],EAX
}
return i;
}
int cmp2(int& a, int& b)
{
if (a < b) return -1;
else if (a > b) return 1;
return 0;
}
0187デフォルトの名無しさん
NGNG{
int i;
asm {
RDTSC
mov [i], eax
}
return i;
}
int main()
{
int c0, c1, cSETCC = 0, cIF = 0;
int a[N], b[N];
for (int i = 0; i < N; i++) {
a[i] = std::rand(); // ここで比較用データをセットする
b[i] = std::rand(); //
if (i % 40 == 0) std::srand(0); // 乱数系列初期化用
}
0188デフォルトの名無しさん
NGNGc0 = RDTSC();
for (int i = 0; i < 1000; i++) cmp1(a[i], b[i]);
c1 = RDTSC();
cSETCC += c1 - c0;
c0 = RDTSC();
for (int i = 0; i < 1000; i++) cmp2(a[i], b[i]);
c1 = RDTSC();
cIF += c1 - c0;
}
std::cout << "setcc = " << cSETCC << std::endl;
std::cout << "if = " << cIF << std::endl;
}
長文スマソ
0189デフォルトの名無しさん
NGNG少し前まで、分岐予測ミスのペナルティは大きくて 分岐なしが平均的には余程速かったのになあ
0190デフォルトの名無しさん
NGNGしかしこの比率ってCPUの世代で変わったりするのかな・・・
0191デフォルトの名無しさん
NGNG分岐履歴バッファがCPU内部にはあって、何重もの入れ子になった
ループの分岐を予測できるらしいですね。
P4のような深いパイプラインを持つCPUでは不可欠の機構なので
相当念入りに作ってあるようです。
P3やAthlonの結果も知りたいのですが、どなたか試してみていただ
けませんか?
0192デフォルトの名無しさん
NGNG概ねcmp1のほうが速いですが、評価順や最適化の有り無しでも
結果が変わるようです。(i % 40)の部分はほぼ影響なかった。
正確に測るには関数内に_asmでRDTSC入れてDWORD境界の
対策をしないと駄目かも知れず。
あ、最適化するとcmp2(if 〜 else if 〜)の関数内にあるジャンプ
命令は1個ですたw
0193デフォルトの名無しさん
NGNG0194デフォルトの名無しさん
NGNGこんな小さなコードだと少しはロスがあると思うわけ。
(フルアセンブラや、gccやbccのようにレジスタを直接返せれば別だけど)
ってゆーかさ、"トリッキーなコード"を名乗るんだったら、
せめてこの程度までは最適化してから比較しようよ。
と言ったものの、あまり詳しくないんで、
見た目が最適化されただけで、内部的なクロック数は増えてるしれない。
int cmp1(int a, int b)
{
asm {
mov eax, a // 引数をレジスタ渡しだと・・・
cmp eax, b //
setl al
setg cl
neg al
xor al, cl
cbw
cwde
mov a, eax // <-これがじゃま
}
return a;
}
0195デフォルトの名無しさん
NGNGSETxx はフラグに影響を与えなかったっけ?
0196デフォルトの名無しさん
NGNGコンパイラはフラグを「比較直後」以外に使うのがうまくないんだよね。
その後で並べ替えることはあっても。
だから、アセンブラレベルでなら、add/subの代わりにleaを用いてフラグを維持し、
それから条件を調べる(jmp等)って方法なんかもでてくるわけさ。
もちろん、よほどクリティカルな部分でない限り、意味は無いけどね。
よく考えたら、>>194はxorではなくorを使ってもいいんだけど、
xorの方が意味が分かりにくい==トリッキーってことで許して。
で、ほぼ同じロジックでCで書くとしたら
int cmp2(int a, int b)
{
return (a < b) | -(a > b);
}
だね。
0197デフォルトの名無しさん
NGNG持ってた本に実行後にフラグが変更されてるような用例載ってたから勘違いしてた。
じゃあ1ステップ短く出来るよ
type TValueSign = -1..1;
function CompSign(A,B:Integer):TValueSign;
asm
CMP EAX,EDX; //A-B
SETLE AH
SETGE AL
SUB AL,AH
CBW
CWDE
end;
0198デフォルトの名無しさん
NGNG194から急に厨臭くなった・・・
0199デフォルトの名無しさん
NGNGと>>197を読んで思い出したけど、
似たようなロジックは半年くらい前にC言語スレで見た(書いた)気がする。
減算結果の最上位bitをシフトしてxorとるやつ。
とここまで書いて、その時見たのは「aとbの符号が一致しているかを返す」
だったのを思い出した。
そういうのがあったからxor使っちゃったんだな(もちろん、subの方が良いけど)
0200デフォルトの名無しさん
NGNGん?ベンチマーク続けてかまわないんじゃないの?
一つのスレッドで複数の話題が進行するなんてよくあることだし。
要は、分岐予測があたることに期待した単純なコードと
分岐予測がはずれる可能性に備えて少し複雑なコードで
CPUやデータのばらつきによって、どちらが良いか、どのあたりが分岐点になるのかでしょ?
実際、現在のCPUでは分岐予測ミスやメモリアクセスなどの
ペナルティを減らす方がはるかに重要だし。
0201デフォルトの名無しさん
NGNGそういうのが当てにならないにもかかわらず
アナクロな方向になってあきれただけ
0202デフォルトの名無しさん
NGNG・メモリアクセスがない
・分岐がない
・複雑な命令がない
・依存関係のある命令が少ない
場合ならば、充分意味があるよ。
少なくとも俺は、
「両方Cで書いて分岐の有無によるテスト」か
「両方アセンブラで書いて分岐の有無によるテスト」
にしないなら、
「片方をC、片方をアセンブラで書いてどちらも分岐命令を使う」
「片方をC、片方をアセンブラで書いてどちらも分岐命令を使わない」
でなければ、あまり意味はないと思っているけどね。
出来れば、全てアセンブラでアラインも揃え、
分岐の有無による差を見たいけどね。
0203デフォルトの名無しさん
NGNG単なる思い込みコードをベンチマーク結果なしにみせつけられてもねえ。
0204デフォルトの名無しさん
NGNGこのスレに書く"トリッキーなコード"はベンチマークがなきゃ意味無いよね。
0205デフォルトの名無しさん
NGNGコード量削減のためならバイト数の計測。
他人を驚かすのが目的なら・・・どうしよう
0206デフォルトの名無しさん
NGNGあ! 忘れてた。 MOVSX があったんだ。
そりゃMOVSX1命令の方が短いでしょ
type TValueSign = -1..1;
function CompSign(A,B:Integer):TValueSign;
asm
CMP EAX,EDX; //A-B
SETLE AH
SETGE AL
SUB AL,AH
MOVSX AX,AL
end;
0207デフォルトの名無しさん
NGNGベンチマーク取りましたよ。
test1が>>183の外ループを10倍したもの
test2が>>187-188の外ループを10倍したもの
cmp1が>>197の前後にロードとストアを入れたもの
cmp2が>>186のcmp1の引数を参照にしなかったもの
呼び出し規約はcdeclで。
test1
cmp1 = 4943201
cmp2 = 7133229
test2
cmp1 = 1677185
cmp2 = 2230045
ま、こんなもんでしょ。
ロード/ストア/スタックフレーム操作/callが入るからそうそう極端な差はつかないね。
0208207
NGNG0209デフォルトの名無しさん
NGNG0210デフォルトの名無しさん
NGNG「明らか」な結果をわざわざ測定するのは今回だけ。学生実験とは違うから。
まあ雪で出かけられない中、良い暇つぶしになったよ。
0211デフォルトの名無しさん
NGNGんなアホな
0212デフォルトの名無しさん
NGNGもちろん、何十年後かのアーキテクチャでもそうだとは言い切らないけど、
今後10年の間は明らか。
逆転するようなことがあっても、その時代にはx86(IA-32)は寿命を終えている。
0213デフォルトの名無しさん
NGNG0214デフォルトの名無しさん
NGNG残念。
0215デフォルトの名無しさん
NGNG0216デフォルトの名無しさん
NGNG煽りにも精一杯反応しちゃうよ。
ねー、ぼくちゃんは厨房じゃないんでしょ?
煽りに反応しちゃだめでしょ。
0217デフォルトの名無しさん
NGNG0218デフォルトの名無しさん
NGNG単なる指摘でしょう。
そういやIA-32って今年で18周年だね。
0219デフォルトの名無しさん
NGNG0220デフォルトの名無しさん
NGNG0221デフォルトの名無しさん
NGNG有意義な時間を過ごせました
0222デフォルトの名無しさん
NGNG俺が>>202の後半で指摘した「ベンチマークは測定条件を揃えて」ってのは
放置しちゃったのかな?
>>198で、すごくベンチマークが楽しみそうだったのに。
0223デフォルトの名無しさん
NGNG>>188まででわかったんだから
AthlonもP3も関係ないし、どちらが何%速いとか
どこで逆転するとかの報告は必要ないな。
確かに、アセンブラの方を最適化したから厨房臭かったかもね。
むしろ、「これ↓の結果を比較しろ」と書いた方が良かったか?
int cmp1(int a, int b) {
return (a > b) - (a < b);
}
int cmp2(int a, int b){
if (a < b) return -1;
else if (a > b) return 1;
return 0;
}
最後に付け加えとこ。
>>177(以降)はSETccを使って分岐をなくしているけど、
CMOVでも同じ結果が出てる。
少なくとも、現存のx86アーキテクチャは
分岐予測成功 > CMOV >>> 分岐予測失敗
になってる。
0224デフォルトの名無しさん
NGNG> 分岐予測成功 > CMOV >>> 分岐予測失敗
>になってる。
P3からP4になって、さらに強まった気がするんだけどどうかなあ
0225デフォルトの名無しさん
NGNGがんばれ!
0226デフォルトの名無しさん
NGNG0227デフォルトの名無しさん
NGNGステップ数が少ないので、if文では完全な規則性のある数を比較した場合
以外ほとんどかなわない。
CMOVを使ったプログラムでも検証してみます。
0228デフォルトの名無しさん
NGNGをロードできると思ってたけど、だめなのね。
int cmp1(int& a, int& b)
{
static int one = 1, mone = -1;
int i;
asm {
MOV ESI,a
MOV EDI,b
MOV EAX,0
CMP ESI,EDI;
CMOVL EAX,mone
CMOVG EAX,one
MOV i,EAX
}
return i;
}
0229デフォルトの名無しさん
NGNGCMP じゃなlくて SUB にすれば 引算結果のゼロを使えるから1ステップ短くなるよ
0230デフォルトの名無しさん
NGNGMOV ESI,a
MOV EDI,b
int&a, int& bとなっているので、aとbはポインタを与えてしまう。だからこれは
MOV ESI,a
MOV ESI,[ESI]
MOV EDI,b
MOV EDI,[EDI]
と書かなければならない。このような不都合を避けるため、intの参照ではなく
値で渡す事にした。if文の方も値で渡すようにしたのだが、意外とif文が速くなっ
た。乱数の発生系列の初期化を70個毎にしないとCMOVccやSETccが負けて
しまう。
0231デフォルトの名無しさん
NGNGそれはなかなかトリッキーですね!早速やってみます!
0232デフォルトの名無しさん
NGNGこのようにしてみました。規則的なifの速度にはかなわないけど、不規則な
ifに対しては、乱数の初期化を10個毎にしても勝てます!(Pentium4)
asm {
MOV EAX,a
MOV EBX,b
SUB EAX,EBX;
CMOVL EAX,mone
CMOVG EAX,one
MOV i,EAX
}
0233デフォルトの名無しさん
NGNG分岐なしに書けるなら、多少冗長に見えても、使った方が全体のパフォーマンスが上がる事がおおいよ。
年々大きくはなっても、分岐ターゲット・バッファ(BTB)はやっぱり有限だからさ。
0234デフォルトの名無しさん
NGNG大規模なプログラムだと、分岐の過程は一般的にランダムだから、分岐フロー
を無くすようなプログラムが効果的でしょうね。ただ、短いコードでないと、分岐
無しで動作するようなプログラムを書く事は非常に難しいでしょうけど。
0235デフォルトの名無しさん
NGNGいやそうじゃなくて、再利用度の高い一部の関数とかを分岐無しが可能なら、出来る時に書いておけば
全体のパフォーマンスが上がるだろうって事。
たとえ、その関数だけ評価して if 文よりパフォーマンスが悪くても、
もちろん重い処理の内側のループを書くような場合は別だけどさ
0236デフォルトの名無しさん
NGNGああなるほど、BTBをなるべく消費しない関数が書けるなら書いておこうって
事ですね。納得。その分別の箇所でBTBが有効活用できるって事か。
0237デフォルトの名無しさん
NGNG0238デフォルトの名無しさん
NGNG0239デフォルトの名無しさん
NGNG0240デフォルトの名無しさん
NGNGキャッシュにヒットしないと遅い予感
って、そんな場合は、ほとんど意味が無いから置いといて
Pen4はCMOVccのレイテンシがマニュアルに見当たらないので
知らなかったけど結構早かったんですね…
でも、おそらくP6系ではSETccの方が早いはずので
P6系を持ってる方はレッツチャレンジ♪
(と言っても、あまり差は出ないと思うけど…)
ついでに両方の値をレジスタに入れる必要は…
asm {
MOV EAX,a
SUB EAX,b
CMOVL EAX,mone
:
}
0241デフォルトの名無しさん
NGNGSEにプログラム作らせる事自体がトリッキー
0242デフォルトの名無しさん
NGNG年齢もしりたいw
0243デフォルトの名無しさん
NGNG2年間、もってくれるかなと思ってたけど、
それまでに落ちちゃうかなぁ。
0244IP記録実験
NGNGhttp://qb.2ch.net/test/read.cgi/accuse/1042013605/
1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
0245デフォルトの名無しさん
NGNG0246デフォルトの名無しさん
NGNG0247デフォルトの名無しさん
NGNG>>10
0248デフォルトの名無しさん
NGNGllllllllllll lllll
lllllll lllll
lllll llllll
lllll llllllllll llllllllll lllll
lllll lllll llllllllll lllllllllllllllllllllllllllllllllll lllllll
lllll llllllllll llllllllll lllllllllllllll lllll
llllllllll llllllllll llllllllll lllll lllll lllllllll
llllllllll lllll llllllll
∧_∧ ∧_∧ ∧_∧ ∧_∧
( ´_ゝ`) ( ´_ゝ`) ( ´_ゝ`) ( ´_ゝ`)
∧_∧ ) ∧_∧ )∧_∧ )∧_∧ )
( ´_ゝ`) ( ´_ゝ`) ( ´_ゝ`) ( ´_ゝ`)
∧_∧ ) ∧_∧ ) ∧_∧ )∧_∧ )
( ´_ゝ`) ( ´_ゝ`) ( ´_ゝ`) ( ´_ゝ`)/|
(____) (____) (____) (____)
/ ./|./ /|./ /|/ /|
| ̄ ̄ ̄|/| ̄ ̄ ̄|/| ̄ ̄ ̄|/| ̄ ̄ ̄|/|
|| ̄ ̄ ̄|| || ̄ ̄ ̄|| || ̄ ̄ ̄|| || ̄ ̄ ̄||
0249デフォルトの名無しさん
NGNG0250デフォルトの名無しさん
NGNGひろしま必死だなっと・・・
0251デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNG0253デフォルトの名無しさん
NGNG244 からの惨状はお前のせいだ。
0254デフォルトの名無しさん
NGNGほかのところいこーぜ
0255デフォルトの名無しさん
NGNGIPとられるとられないにかかわらず、重大な決意で告発する人はいると思うけど。
そういうひとが保護されるかどうかが問題だわなー。
ウソ書いてひとに迷惑かける奴は保護される価値がないと思うけれども。
0256デフォルトの名無しさん
NGNG0257デフォルトの名無しさん
NGNG2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
0258デフォルトの名無しさん
NGNG0259デフォルトの名無しさん
NGNG事が原因の1つとなって潰れたが、いまの2chは「誹謗・中傷・密告お断り」というのを出したのと
同じ事なんだよなあ、、、
0260デフォルトの名無しさん
NGNGこの判決文のなかに「内容証明がなんとか」ってのは書いてあるかってことだな
0261デフォルトの名無しさん
NGNG訴状だろうと内容証明だろうと、
問題は「掲示板に名誉毀損が書いてあると知りえた時点で、
削除する義務がある」ってことなんじゃないすか?
0262デフォルトの名無しさん
NGNGhttp://qb.2ch.net/test/read.cgi/accuse/1041540580/11n
11 :心得をよく読みましょう :03/01/03 05:56 ID:hY/1UvLC
438 名前:名無しさん@お腹いっぱい。 投稿日:03/01/03 05:29 ID:uI8o9EyD
http://pink.bbspink.com/test/read.cgi/ascii2d/1039712295/
このスレは危険。 開くと無限にIEが開くよ。
レスの本文中にJavaScriptが書ける技術があるらしいね。
とりあえず2ch側で対策がとられるまでの間は
kageのngword.txtに <script language="JavaScript">
をNGワードとして登録しておいた方がいいかも。
0263デフォルトの名無しさん
NGNG>>228-230>>246-247
>>255>>261-262>>264-265>>271>>274-275
>>295-296>>306-307>>309>>318-321>>323
0264デフォルトの名無しさん
NGNG匿名性が失われ自分に反対する者が誰かは
わかるのに小数派には反論さえ許されない
最悪のシステム!!
もしも常に特定の人物と
意見が対立し 常に片方だけが意思を
抹殺されたら…
それが続けば必ず集団は決裂する!!
0265デフォルトの名無しさん
NGNG0266デフォルトの名無しさん
NGNG女子大生カエレ!は心情的に言いにくいじゃないのぅ!
(`ε´)プー
0267デフォルトの名無しさん
NGNG荒しのヤシは別に困らないだろ?
それよりも貴重な情報が流れなくなる気が、、、
ネタでした と言ってほしいぃ
0268デフォルトの名無しさん
NGNGだったら、全板強制IDにして暗号キーだけ保存しておけばいいんじゃないの?
0269デフォルトの名無しさん
NGNGま、ひろゆきは何も悪いことはしないわけだが
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNGIDにIPを出すことを要求します
ってスレ立てておながい
0272デフォルトの名無しさん
NGNG( ´∀`) < なんでだろ〜!
⊂⌒ て) \_____
( 、___つ
) )
し' ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´∀` ) < なんでだろ〜♪
/ ̄ヽ/,― 、\ o。。。\_______
| ||三∪●)三mΕ∃.
\_,へ--イ | ゚ ゚ ゚
(_)(_)
0273デフォルトの名無しさん
NGNG2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNG0276デフォルトの名無しさん
NGNG鯖をクラックするだろう
0277デフォルトの名無しさん
NGNG0278デフォルトの名無しさん
NGNG「ひろゆきよ ラウンジが重いんだが・・・と電話しまくって即閉鎖」
が一番早そうだな(藁
0279デフォルトの名無しさん
NGNG発信元がわかるんで、告発された側が「よーし金でねじ伏せちゃうぞー」
とか言って裁判でも起こしまくって。
そんな状況はガクブルだから、面白そうな(真実である事が前提の)投稿は、減る?のかな?
考え過ぎ?って言うか見当違い?どうだ?どうなんだ?
0280デフォルトの名無しさん
NGNG,,--―'''""`ヽ'  ̄`ヽ、
/ ヾ / ~`ヽ
/ ヽ;:/""""ヾ ミ ヽ
/ ;:;;:::''''"""" \ i
/ / ヽ ヾヽ
/ / / ;/ ヾ ヽ
/ ;:;:ヽ ,,,,;;::'''''ヽ ;:|
i / ,,,,;;::::::::::::::: ヽ ヽ
| | | " :::: /\ ヾ ヽ
| | ヾ | /\ ::::::. : | ;:|
| ;:| : ::::::: : .、 | :|
| ヽ ( ,--、 ,:"' | /|!
| ヽ ヾ |;:/
| | __,-'ニニニヽ /|
|| `、ヽ ヾニ二ン" /;:|
| ヽ \ /ノ
| i `ー-::、_ ,,..-'|ヽ
ヽ;:;:;:;: ;:人 `ー――'''''"~ / ヽ
\;:;:;:;:/ `ー-、 ,.-'" \ー-、
,.-'" :/ \ ,.-''" |
/ ! ~>、,.-''" |
,,..-‐'''"" ヾ ,.-''"――――-、 /
(^^)は山崎渉であると見抜ける人でないと
(掲示板を使うのは)難しい(^^)
0281デフォルトの名無しさん
NGNG0282デフォルトの名無しさん
NGNGグモッチュチュイチュイチュイーーーーーーーーーーーーーーーーーーーんチュイチュイチュイチュイ――ン
罵ッゴんばっこんばっ婆ッゴんばぎゅブギュ罵ぎゅぎゅきゅ ぼごんぼごんぼごんぼごん
跋扈ン跋扈ン跋扈ンバッカンバッカン馬鹿馬鹿婆きゅうううーー
ギュ気ギュ気ギュ気いい疑義一ギいいっ ギュぎゅうぎゅううう ぶじゅぶじゅぶじゅ
ききっーーぃ きい ゴットン
となって、ミンチ轢肉になって成仏してしまったそうです。
尚、貨物はフルパワー・全快で走行していた長い編成だったので、凄まじい勢い
で轢断・繊断(物性物理学の運動エネルギー・車輪とレールの轢断機により)され
15歳の中3は、肉片と化したそうです。
お気の毒ですが、この肉片は荼毘に附して、灰にし、土に帰します。あしからず
ご了承くだされい。
0283デフォルトの名無しさん
NGNG0284デフォルトの名無しさん
NGNG今なら勝つ確率高いしね。
しかも何百ももらえるしw
0286デフォルトの名無しさん
NGNGややこしいからそのトリップ使うな。
今回の裁判の話と今後起こりうる訴訟は全然別の話になるだろうから、
(プロバイダ責任制限法と削除システムの変更がある)
ごっちゃにして話をするのは無意味。
0287デフォルトの名無しさん
NGNG0288山崎渉
NGNG0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNG(a|b)^(a|c)^(b|c)
0291山崎渉
NGNG0292デフォルトの名無しさん
NGNGアセンブラネタきぼん。実験しますので
0293デフォルトの名無しさん
NGNGPentium4 2.53GHz + DDRSDRAM(PC2100)
func1 = 1286
func2 = 1286
func3 = 1287
func4 = 2568
mov, xor, xchg はほとんど差がありませんでした。Pentium3とは
傾向が違うようです。
0294デフォルトの名無しさん
NGNG#define LOOP 500000
を
#define LOOP 50000000
でキボンヌ。
0295デフォルトの名無しさん
NGNGどうぞ。
func1 = 128540
func2 = 128966
func3 = 128906
func4 = 306264
0296デフォルトの名無しさん
NGNG誤差はあるかも知れないけど・・・。
P3 では xchg > mov >> xor >>>> pop だった気がする。
0297デフォルトの名無しさん
NGNG0298デフォルトの名無しさん
NGNG#define LOOP 4000000000
でキボンヌ。
0299デフォルトの名無しさん
NGNGどぞ。
push/popだけ異常に遅いですな。
func1 = 10361072
func2 = 10327317
func3 = 10335487
func4 = 27160516
0300デフォルトの名無しさん
NGNG0301129-132
NGNG長時間かかるとOSのタイムスライスなども気になるので
LOOP回数はそれほど長くないほうがいい。
PerfomanceCounterの制度は十分に高かったはず。。。
func1 = func2 = func3 > func4
と考えて
mov*3 = xor*3 = xchg*1 = (push*2/pop*2)*2
かな?
ちなみに最初は dec ecx & jnz の代わりに loop を
使ってみたんだが loop はかなり遅かった…。びっくり。
Athlon系やCrusoe系の結果も興味あるところ…。
0302デフォルトの名無しさん
NGNGPentium4はALUがPentium3と違うアーキテクチャのようだし、
トレースキャッシュとかいうよく分からない機構を使っていたりで、
単純ループには強いみたい。
loop命令使って書いてみましょうか。そしたらmovのセクションを
dec & jnz と loopにしたものとで比較。
0303デフォルトの名無しさん
NGNGが発生する命令はOSの影響があって遅くなると聞いたことがあるのです
が本当でしょうか?
0304デフォルトの名無しさん
NGNG確かに遅いですね。
func1 = 1354
func11 = 1927
何かこのスレトリッキーなコードでなくてアセンブラの最適化スレ
見たいになってきたね(w
0305デフォルトの名無しさん
NGNGpush/popなどのスタックをアクセスする命令は、
スタックセグメント経由で行われるため、OSの設定によっては
遅くなる可能性がある。
嘘だけど。
0306デフォルトの名無しさん
NGNGWindowsNTの古いバージョンでは、スタックアクセスが発生すると
いちいち割り込みがかかってすごく遅くなってたようですよ。
WindowsXPもNT系なので、push/popの速度が95系とは違うのではない
かと思ったのです。でもPentium4でMeとか使ってる人はさすがに少ない
だろうな。
0307デフォルトの名無しさん
NGNG一度ページインしたら関係ないような・・・古いって3以前?
0308デフォルトの名無しさん
NGNGそれ以外を使え、ってことですね。
ベンチマークするといろいろ分かって面白い。
0309デフォルトの名無しさん
NGNGNT2だったかも。それでCALL命令とかも異常に遅くて、NT3で直された
というような話をどこかで聞いた。
>>308
Athlonではどうなんでしょう?かなり優れたアーキテクチャらしいけど。
Pen4はALUが倍速動作しているので、メモリアクセスがないと強いみたい。
0310デフォルトの名無しさん
NGNGメモリ/キャッシュのインターフェースが異常に賢くないかぎり
同じぐらいの結果じゃないの。
NT2か・・・ネタにしては陳腐だったな。
0311デフォルトの名無しさん
NGNG0312デフォルトの名無しさん
NGNGありません。
0314山崎渉
NGNG0315デフォルトの名無しさん
NGNGXOR は両辺が同値だったら 0 になってしまうぞ。
そのチェックはどうするんだ?
0316デフォルトの名無しさん
NGNG>>106だけ読んでも何の話かよく分からないので
少し詳しくお願いします
0317デフォルトの名無しさん
NGNG「から引きずってる」 って書いたんだから、それより後ろも読んでくれよ・・・。
要約すると、2 つのレジスタの値を交換するには何が最も速いかという話。
候補としては、
1. 別のレジスタを介して MOV で交換。
2. XOR A, B、XOR B, A、XOR A, B で交換。
3. XCHG で交換。
4. スタックを介して POP と PUSH で交換。
で、スタックを使う 4 は論外に遅く、他は CPU 等によって変動するが
僅差という結論だった。
んでもって、2 の XOR は実は問題あるんじゃないかと 315 に書いたの。
0318デフォルトの名無しさん
NGNGネタでしょ
アセンブラ(じゃなくても良いけど)でeaxとebxの値を入れかえる時に
↓のようにしてeaxとebxの値を入れかえる
xor eax, ebx; eax = (eax^ebx)
xor ebx, eax; ebx = ebx^(eax^ebx) → eax^ebx^ebx → eax^0 → eax
xor eax, ebx; eax = (eax^ebx)^eax → eax^eax^ebx → 0^ebx → ebx
この時eaxとebxが同じ値だと一度0になってしまうので
>>315の主張が正しいように見えるが、それに同意すると
最終的には、↓のように問題無く入れ替わる事を指摘される罠
xor eax, ebx; eax = 0
xor ebx, eax; ebx = ebx^0 → ebx(=eax)
xor eax, ebx; eax = 0^ebx → ebx(=eax)
0319デフォルトの名無しさん
NGNG理解した。すまそ
0320デフォルトの名無しさん
NGNG内部で三命令に分解されちゃってるということなんでしょーか。
0321デフォルトの名無しさん
NGNGC言語でスワップを XOR で書くとまずいを引きずってるのかな。
あれは同じ値ではなくて同じアドレスの時まずいってやつだから。
>>320
P6以降は内部でMicroコードに分解されているので有り得るかもしれませんね。
0322デフォルトの名無しさん
NGNGhttp://www.agner.org/assem/pentopt.zip
によると、レジスタ-レジスタ間のXCHGはμOPSが3つに分解される
とあるから(PentiumIII系)計算が合いますね。
Pentium�WはALUが倍速になっているものの、ポートの数が減って
いるため、事情は異なるかと思いますが。
0323vc,bcc,dmc,gcc2.95 で確認
NGNG{
int k;
for( k=0; k<n; ++k )
putchar( "****|"[k%5] );
putchar('\n');
}
0324デフォルトの名無しさん
NGNG0325デフォルトの名無しさん
NGNG"****|"の文字の並びに何か意味があるの?
0326デフォルトの名無しさん
NGNG****|****|***
というように5文字ごとに|を入れたいってことだろう。
0327デフォルトの名無しさん
NGNG0328デフォルトの名無しさん
NGNG0329デフォルトの名無しさん
NGNGRODE 社の非常に優秀な製品です。
http://www.rodemic.com/specsnt2/
0330デフォルトの名無しさん
NGNGDim buf As String * 260
hoge=Left$(buf, GetWindowsDirectory(buf, 260))
0331デフォルトの名無しさん
NGNGどこがトリッキーなのかわからん。解説希望。
0332デフォルトの名無しさん
NGNG0333872
NGNGbufの値が空白に見えるうちにLeft関数に渡すところじゃない?
ついでにGetWindowsDirectoryが取得した文字数を返すから不要なスペースを除去できる。
(ディレクトリ名に2バイト文字が入ると破綻しそうな気もするけど)
0334デフォルトの名無しさん
NGNG0335デフォルトの名無しさん
NGNGRIGHT$("00"+HEX$(n),2)
Cのsprintf(s,"%02X",n)相当。
0336デフォルトの名無しさん
NGNGRIGHT$(HEX$(256+n),2)
こっちが少しだけトリッキーかも 速度も速いし
0337BASICうろおぼえ
NGNGRIGHT$(HEX$(256 OR n),2)
0338デフォルトの名無しさん
NGNGのところに、4byteまとめて平均値を出す方法が
> unsigned long v0, v1, v2;
> // v0, v1 にはキャストするなり、あらかじめデータを入れておく
> v2 = (v0 & v1) + (((v0 ^ v1) & 0xfefefefe) >> 1);
のようにのっているんだけど…
どうしてこうなるの?
がんばっても理解できないので
解説してほしいのですが…
0339デフォルトの名無しさん
NGNG0340338
NGNG最初の v0 & v1 は、足したらケタがあがるところで、
次の v0 ^ v1 は、足すところで、
次の & と >> は半分にするところでしょうか?
なんで
( ((v0 & v1) + (v0 ^ v1)) & 0xfefefefe ) >> 1
ではないの?
0341デフォルトの名無しさん
NGNG0342338
NGNGどうもありがとうございました。
0343デフォルトの名無しさん
NGNG現在のCPUが、どうやって加減算をしてるか勉強すれば
一発で理解出来るようになるよ
0344デフォルトの名無しさん
NGNG#define rem cat(/, /)
はがいしゅつですか?
0345デフォルトの名無しさん
NGNG0346デフォルトの名無しさん
NGNG0347デフォルトの名無しさん
NGNG0348デフォルトの名無しさん
NGNG前スレの138にて。意味違う(?)けど。
ってこれ副作用あるね・・・
0349デフォルトの名無しさん
NGNG0350デフォルトの名無しさん
NGNG0351デフォルトの名無しさん
NGNG0353デフォルトの名無しさん
NGNGCDxxxx call DIVIHD##;HL/DE-->DE=余り、HL=商
; 除算を実行した直後は上位ワード=余り,下位ワード=商、が標準的手法。
C1 pop B ;リターンアドレス pop
F1 pop PSW
F1 pop PSW ;SPを返却値のアドレスまでpop
D5 push D ;余りpush
E5 push H ;商をpush
C5 push B ;リターンアドレスpushでcall時点の状態
C9 ret ;リターンアドレスpop, 分岐
; 1バイト命令だけでよく書けてると思います。んで、この結果を
sprintf(wk,"・・・%d %d",div(int,10)で0.1単位の整数の編集に使い、
割り算を1回ですませた。3MのCPUでシビアな処理の所、ウマーでした。
0354デフォルトの名無しさん
NGNGシビアな処理でsprintfってあんた、、、
目の付け処がピンボケです。
0355デフォルトの名無しさん
NGNG0356デフォルトの名無しさん
NGNG0357355
NGNG昔みたいに盛り上がらないかなぁ。
0358デフォルトの名無しさん
NGNG0359353
NGNG出力する仕事だったので、ASMで変に固定長の出力とかは不自然に見える。
10で割った商と余りを編集するのに、353のやり方を使わないと/で除算、
%でまた除算てことになるのですね。だからこれは当たりと思った手法です。
私もASMで商と余りを使う手法を考えたら結局これに行ったのです。
0360デフォルトの名無しさん
NGNGprintfのコストを考えれば2度の割り算なんてないのと同じということだとおもわれ。
割り算1つ減らすよりもほかに最適化する方法はありそうだしな。
0361デフォルトの名無しさん
NGNG定数 10 による除算は、勝手に最適化されるぞ。
0362デフォルトの名無しさん
NGNG最適化はされませんでしたね。いちいちどんなASMコードが出るか見ながら
c表現を手動最適化でした。sprintf系も「実数ハンドリング機能を省いた
コンパクト版」というのが付いていてデフォールトはそちらを使うように
なってました。
0363デフォルトの名無しさん
NGNG効率を見ることができないヤシってことでFA?
0364デフォルトの名無しさん
NGNGそれは最適化コンパイラなのか?
余ってるショップ行けばタダでもらえる
0366デフォルトの名無しさん
NGNG何をだよ…
0367362
NGNG>>363 んじゃ全体を通しての効率の噺ね。ROM32K,RAM8K,3Mの8085A,8251が4CH
皆4.8K,8,1,N。1,2CHからバイナリ13バイトで位置・速度・移動方向等の情報が最大
60個ブロッキングされて3秒毎に送られてくる。それを3,4CHにASCII文字列にして
送信する。1個を編集した文字列は55バイト前後になる。旧systemはASM5K行位
あったが、有効レコードが30個あたりから出力が止まるから何とかしてくれと
いう問題でした。
0368362
NGNGのが判りますね。そのときもう次の入力が入って来るわけで、この事態に対し
旧systemは脆弱だったわけです。もともと6秒間隔で作って、後から勝手に
3秒間隔で使い始めたので、作った奴にバグだ直せと言えなかったようです。
実装RAM条件から、60個出力が2度続くように耐えられるだけ送信リングバッファ
を確保できないことが判ります。皆さんならどう解決しますか?
あ、割り算の話は、バイナリ値が0.1単位の整数表現だからです。
0369デフォルトの名無しさん
NGNGもういいよ。この話題あきたよ。読みにくいし。
0370デフォルトの名無しさん
NGNGbtst d0,#$90
Shift_JIS の1バイト目判別。
(0x80 とか 0xfd 以降にも機種依存文字が割り当てられてた環境だった)
0371デフォルトの名無しさん
NGNG何のアセンブラだか分からんので、Cで書いてくれない?
0372デフォルトの名無しさん
NGNGcはunsigned char
(1<<(c>>5))&0x90
しかしこのコードの一番のポイントはbtst命令のオペランドなのだが…
0373デフォルトの名無しさん
NGNG「何のアセンブラだか分からん」 と言う人に、「ポイントはbtst命令」 と返すのは
いかがなものかと。
0374デフォルトの名無しさん
NGNG> (0x80 とか 0xfd 以降にも機種依存文字が割り当てられてた環境だった)
理由が苦しいな、、、
といいつつ、同じく0x80,0xFC-を無視していいときは
0xE0とtesttして、サインフラグとパリティ Oddを見てたよ。
結局のところ>>370と発想は同じかもしれん。
0375デフォルトの名無しさん
NGNGごめん、、、でもうまく説明できない・・・
0376デフォルトの名無しさん
NGNG0377デフォルトの名無しさん
NGNGHTTP リクエストとブラウザ上の JavaScript のみを使って、
なにか適当な2つのブラウザ同士が通信する事って出来るかな?
俺の結論は「出来ない」なんだけれど…。
どうあがいてもブラウザで Listen 出来ないよね?
間に中継サーバを立てればもちろん出来るとは思うけど、どうでしょう?
0378デフォルトの名無しさん
NGNGブラウザが JavaScript で Listen 出来ちゃったら
そのコード埋め込んであるページを開いた時点で・・・(((;゚Д゚))ガクガクブルブル
0379デフォルトの名無しさん
NGNG0380デフォルトの名無しさん
NGNGJavaアプレット経由でできるかも。
通信用のアプレットを作って、staticな変数とかでやりとり...
ちょっとトリッキーだな。
0381デフォルトの名無しさん
NGNG具体的にアプレットを使ってどうやるんだ?
中継サーバなしでは無理だろう、たぶん。
中継サーバの負荷をどれだけ小さくできるか、という方がトリッキーっぽい
0382山崎渉
NGNG0383デフォルトの名無しさん
NGNG間のサーバがあったところで、転送量を分散するシステムが必須だな
0384デフォルトの名無しさん
NGNGIEだったらセキュリティーホール突けば…
0385山崎渉
NGNG( ^^ )< ぬるぽ(^^)
0386山崎渉
NGNG( ^^ )< ぬるぽ(^^)
0387デフォルトの名無しさん
NGNG思いつきで言うな
0388デフォルトの名無しさん
NGNGかなり前作った矩形同士の当たり判定ルーチン。(VisualC)
[ ]が付いたり付かなかったりしてて気持ち悪い。(苦笑)
__asm{
mov eax, left2;
mov edi, top2;
sub eax, [left1];
sub edi, [top1];
mov esi, [right1];
mov edx, [bottom1];
sub esi, right2;
sub edx, bottom2;
or eax, edi;
or esi, edx;
xor ebx, ebx;
or eax, esi;
setge bl;
0389388続き
NGNGshl ebx, 1;
mov edi, left2;
sub eax, right2;
sub edi, [right1];
mov esi, [top1];
mov edx, top2;
sub esi, bottom2;
sub edx, [bottom1];
and edi, eax;
and esi, edx;
xor eax, eax;
xor ecx, ecx;
sub eax, ebx;
and edi, esi;
sets cl;
sub eax, ecx;
}
0390388
NGNGなんか前スレに似たようなものが…!?(ガーソ!)
よく見ておけばこんなクソコードを晒すこともなかったのにィ!(笑)
0391デフォルトの名無しさん
NGNG0392デフォルトの名無しさん
NGNG/* invariant in modulo 1<<31 */
#define EXTEND32(x) (((1<<31)-1-(x))^~(~0<<31))
0394デフォルトの名無しさん
NGNG0395デフォルトの名無しさん
NGNG0396デフォルトの名無しさん
NGNG0397デフォルトの名無しさん
NGNGintが32ビット以上なら大丈夫。
0398デフォルトの名無しさん
NGNGそれでも未定義?
つーか、このコードが意図してること分かる?
0399山崎渉
NGNGピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0400デフォルトの名無しさん
NGNG0401デフォルトの名無しさん
NGNGもう2週間くらい粘ってほしかった
0402デフォルトの名無しさん
NGNG0403デフォルトの名無しさん
NGNG(i!=j==i) /* i=j=0 なら真 */
0404403
NGNG(i==j==i) /* i=j=1 なら真 */
(i==j==!i) /* i=j=0 なら真 */
0405403
NGNG(i==j==!i) /* i=j=0 なら真 */
も、ダメぽ…
誰か考えてぽ
0406デフォルトの名無しさん
NGNGも、ダメぽ…
ダメダメぽ…
首吊ってくるぽ…
0407デフォルトの名無しさん
NGNG( !( i | j )) /* i=j=0なら真 */
とかは?前者はいまいち出てこないな。
0408デフォルトの名無しさん
NGNGちょっと変形すりゃできないか?
!((i-1)|(j-1))
0409デフォルトの名無しさん
NGNG解説しているサイトがあったらそれでもいいです。
環境はWindows2kです。
処理系はmingwでもvcでもC系ならなんでもいいです。
ちなみに32bitの固定小数点とfloat型は、
一般的にどっちが速いんでしょうか?
0410デフォルトの名無しさん
NGNG0411デフォルトの名無しさん
NGNG今時のCPUなら下手するとfloatのほうが速かったりするが
0412デフォルトの名無しさん
NGNG0413デフォルトの名無しさん
NGNGsrc と dst が int なら最後に変換がない分固定小数点の方が速い
src と dst が float なら最後に変換がない分浮動小数点の方が速い
それくらい速度差って余りないよね。
ただ、掛け算、割り算が shift や lea に置き換え出来たりするとまた話が違ったり。
つーか、スレ違いだ。
0414デフォルトの名無しさん
NGNGそうですね、スレ違いっぽいと自分でも思ってました。
(固定少数点はトリッキーぽいかなと思ったけど)
とりあえずfloatで満足する速度が出るか試してから
また考えます。
0415デフォルトの名無しさん
NGNG#define STATIC_REAL_VAR(var) (var)
C++なら演算子のオーバーライドとかできるから固定少数点にした方がいいとおもったのを
それにしておいて、不満があったら作るのも手。
0416デフォルトの名無しさん
NGNGfoo.h:
typedef struct foo *FooP;
void
foo_afo(FooP p, 略);
foo.c:
struct foo {
略
};
void
foo_afo(FooP p, 略) {
}
メンバ変数の情報隠蔽のみだが、一部の同僚には非常に不評であった。
0417デフォルトの名無しさん
NGNG0418デフォルトの名無しさん
NGNGchar *p = NULL;
printf("p = %s\n", p ?: "<NULL>");
0419デフォルトの名無しさん
NGNGprintf("p = %s\n", p ?p: "<NULL>"); の間違いか?
0420あぼーん
NGNG0421デフォルトの名無しさん
NGNGぶー、C言語的には間違えていません。
結構知られてないのね。
0422デフォルトの名無しさん
NGNG0423デフォルトの名無しさん
NGNGPerl / Java だと出来ないみたい…
C言語ってトリッキーだねえ
0424デフォルトの名無しさん
NGNGANSI Cでは許さないとgccが言ってきたぞ。警告ではあるが。
0425デフォルトの名無しさん
NGNG調べるのが面倒臭くなった…。
0426デフォルトの名無しさん
NGNGここまでやらないと言ってこないけどね。
0427デフォルトの名無しさん
NGNGint A;//Aは任意の数
A%4; は
A&3; に等しい。
以外に知らない奴多いが「割る数」が2^n(n=整数)なら
2^n-1で&したのと同じになる。
50倍ほど速くなったから、知っとけ。
0428デフォルトの名無しさん
NGNGそれって基本中のキホンだぞ。
ホンキで知らないヤシが多いなんて思ってるのか?
0429デフォルトの名無しさん
NGNGそれくらい最近のコンパイラなら最適化でやってくれると思うけど。
0431デフォルトの名無しさん
NGNG多分どんな型でもOKなSwapマクロ
#include <stdio.h>
#define Swap(a,b) \
{\
char static_assert[sizeof(a)==sizeof(b)];\
typedef struct { char buf[sizeof(a)]; } temp;\
temp t=*(temp *)&a;\
a=b;\
*(temp *)&b=t;\
}
int main(){
int a=0,b=1;
Swap(a,b);
printf("a=%d,b=%d\n",a,b);
}
0432デフォルトの名無しさん
NGNG構造体を作るよりも配列にmemcpyした方がいいと思うけど
0433デフォルトの名無しさん
NGNGうち、某大手ゲーム会社だけど、メインプログラマでも
それ知らない奴いるんだよね・・・・
まあ、そいつはメインとは言っても、他のチームのコピペ改造だけで
作ってる奴だけど。
0435デフォルトの名無しさん
NGNGうーん、それはちょっといただけないNa-。
0436デフォルトの名無しさん
NGNGC++ならテンプレートで済む話だね。
昔はsizeof()使うマクロとかよくやったけど。
0437デフォルトの名無しさん
NGNG&は使わずいつも%を使ってます。
ですが変数の型はちゃんとunsignedにしてますから
最適化により同等のコードが生成されているはずです。
だから俺のコードで&使えるところで%使っている場合でも見下さないで下さい。
可読性とかを優先しているだけです。
0438デフォルトの名無しさん
NGNGゲームプログラマーは見下します。
0439デフォルトの名無しさん
NGNG0440デフォルトの名無しさん
NGNGスレ違い
0441デフォルトの名無しさん
NGNGどんなコードがよく最適化されるかを精査した上で書くと
見た目素直なコードばっかりになるね。
0442デフォルトの名無しさん
NGNG揚げ足取りだが
Swap(a, b);
最後のセミコロンはいらん
0443デフォルトの名無しさん
NGNGないと言われて作ってあげた関数だが↓
int CLine::GetIndex(CDoc *doc)
{
int iRet = int(this - doc->m_lines.GetData());
return iRet;
}
・・・別にトリッキーじゃないよな。「thisからCArray.GetData()を
引けばいいだけじゃん」と何度教えても、VBメインの香具師には
伝わらないかと思った。
0444デフォルトの名無しさん
NGNG結局人によるのかなー
0445デフォルトの名無しさん
NGNGそういう式も「ポインタの概念の理解」の範疇なのかな・・
ひっかかる人は大変そうだ。
ところで、そこではintへキャスト(というか明示的型変換)する必要ないよね。
ただ引くだけで結果型はintだし。
(キャストは書き間違えるとつらいので)
0446デフォルトの名無しさん
NGNG0447デフォルトの名無しさん
NGNG0448443
NGNGtypedef _W64 int ptrdiff_t;
なんでワーニングが出るんだ。
0449デフォルトの名無しさん
NGNGああ、Win64版コンパイラを使うときは問題が起こるぞっていう予告警告か。
0450デフォルトの名無しさん
NGNG0451427
NGNG遅レスだが、
Borland C++ Compilerは、
%4のアセンブラコードを出すよ。
あと、マジで知らん奴はいるから。
0452デフォルトの名無しさん
NGNG0453デフォルトの名無しさん
NGNG% は副産物として商も求められているかも…です。
0454デフォルトの名無しさん
NGNG0455デフォルトの名無しさん
NGNG-5 % 3 とか
9 % -7 とか
?
0456デフォルトの名無しさん
NGNGC99では決まってるんだっけか。
0457デフォルトの名無しさん
NGNG0458デフォルトの名無しさん
NGNG最適化レベルをあげても?
もしそうならそのコンパイラをつくった人たちも「それ」を知らなかったりして。
0459デフォルトの名無しさん
NGNG0460デフォルトの名無しさん
NGNGunsignedならちゃんと最適化したと思ったが。
>>431
{}で囲むよりdo {} while(0)が良いかも。
0461デフォルトの名無しさん
NGNGMACRO;
else
MACRO2;
MACROの後ろの ; 対策ですね。
0462デフォルトの名無しさん
NGNGchar static_assert[...];
より
typedef char static_assert[...];
の方が良い。
0463431
NGNG#include <memory.h>
#define Swap(a,b) \
do{\
typedef char static_assert[sizeof(a)==sizeof(b)];\
char temp[sizeof(a)];\
memcpy(temp,&a,sizeof(a));\
memcpy(&a,&b,sizeof(a));\
memcpy(&b,temp,sizeof(a));\
}while(0)
0464デフォルトの名無しさん
NGNG0465デフォルトの名無しさん
NGNG型定義なら実際に領域が取られることはない。ということか。考えたなぁ。
0467デフォルトの名無しさん
NGNG改良されてる?
0468デフォルトの名無しさん
NGNG改良というより仕様変更だな。
0469デフォルトの名無しさん
NGNGそのstatic_assertの使い方は_AC_COMPUTE_INTのに似てるな。
あっちは[1-2*(sizeof(a)!=sizeof(b))]で負になるようにしてるけど。
0470デフォルトの名無しさん
NGNG{
case 0:;
case sizeof(a)==sizeof(b):;
}
メリットなし。
0472山崎 渉
NGNG__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0473デフォルトの名無しさん
NGNGtemplate <>static_assert<true>{};
#define STATIC_ASSERT(expr) typedef static_assert<( expr )> static_assert_tmp##__LINE__;
BOOSTのヘッダー見たところ、こんな感じだった気がする
0474431
NGNGC++版はそう。俺が書いたのはC版。
0475デフォルトの名無しさん
NGNGchar dummy[(expr)?1:-1];\
} static_asserttmp##__LINE__;
#define STATIC_ASSERT2(expr) typedef struct static_asserttmp_2_##LINE__ {\
char dummy[(expr)?1:-1];\
} static_asserttmp##__LINE__;
単体で使えるC版を考えるとこうかな
追記:1行で2つ使うと悲惨なことになるかも。
プリプロセッサ内部で使う場合は要注意
0476デフォルトの名無しさん
NGNG零除(ry
0477デフォルトの名無しさん
NGNGそれってエラーになるって決まってるんだっけ?
0478デフォルトの名無しさん
NGNG0479デフォルトの名無しさん
NGNGwhile(((op=C_ADD,opl=6,len=1,*p=='+') ||
(op=C_SUB,opl=6,len=1,*p=='-') ||
(op=C_MUL,opl=7,len=1,*p=='*') ||
(op=C_DIV,opl=7,len=1,*p=='/') ||
(op=C_MOD,opl=7,len=1,*p=='%') ||
(op=C_FUNC,opl=8,len=1,*p=='(') ||
(op=C_LAND,opl=1,len=2,*p=='&' && p[1]=='&') ||
(op=C_AND,opl=5,len=1,*p=='&') ||
(op=C_LOR,opl=0,len=2,*p=='|' && p[1]=='|') ||
(op=C_OR,opl=4,len=1,*p=='|') ||
(op=C_XOR,opl=3,len=1,*p=='^') ||
(op=C_EQ,opl=2,len=2,*p=='=' && p[1]=='=') ||
(op=C_NE,opl=2,len=2,*p=='!' && p[1]=='=') ||
(op=C_GE,opl=2,len=2,*p=='>' && p[1]=='=') ||
(op=C_GT,opl=2,len=1,*p=='>') ||
(op=C_LE,opl=2,len=2,*p=='<' && p[1]=='=') ||
(op=C_LT,opl=2,len=1,*p=='<')) && opl>limit){
// 演算子がある間継続
}
0480デフォルトの名無しさん
NGNGどうせならこう書くな。
while((*p=='+') ? (op=C_ADD,opl=6,len=1) :
(*p=='-') ? (op=C_SUB,opl=6,len=1) :
…
0481デフォルトの名無しさん
NGNGじゃあどういうコードが良いんだろう、と言われると迷うな。考えてみよう
0482デフォルトの名無しさん
NGNGとりあえず毎回op, opl. lenに代入する必要はないから
480に一票。
デバッグ楽にするために俺なら*pのswich文かな。
全くトリッキーではなくなるが、タイプミスが減る。w
0483デフォルトの名無しさん
NGNG> 実行速度の面で無駄が多い。
479も480も最適化される可能性が他界
0484デフォルトの名無しさん
NGNGは、*p=='+'の結果によらず、
op=C_ADD,opl=6,len=1が実行されるよね?
だったら、>>479と>>480が同じような最適化されるとは思えないなぁ
って、試せよ>>ワシ
0485デフォルトの名無しさん
NGNG逆に、>>480のコードが再配置されて>>479みたいになることもある。
0486デフォルトの名無しさん
NGNG書いてない処理、コンパイラが足す訳ないじゃん。あほか。
0487デフォルトの名無しさん
NGNG0488デフォルトの名無しさん
NGNG*p=='+'が
真なら上書き
偽ならそのまま
代入が1回は行われるから、同じにはならんが近いのは
出してくれるかもしれん
でも、最適化を期待して、読みにくいコードを書くのはどうかと。
普通、最適化を期待して、読みやすいコードを書くものではないかと。
0490486
NGNG479が最適化されて480になることはあっても
逆はないだろと言いたかった。
479は変数代入後に*pを評価しろとコンパイラに
指示している。480は*pを評価してから代入だろ。
「書いてない処理」とは評価前の代入のことだ。
488も同じ話をしていると思うが.
0491デフォルトの名無しさん
NGNG0492デフォルトの名無しさん
NGNG一度アセンブラコード読んでみろ。
0493デフォルトの名無しさん
NGNG藻前が読め
0494490 != 493
NGNG漏れは479でも480でもないが、480の方が速いだろうと思う。
その点は譲りたくないな。w
スマンカッタ
0495デフォルトの名無しさん
NGNG0496山崎 渉
NGNG0497デフォルトの名無しさん
NGNG0498デフォルトの名無しさん
NGNGより速くなることはたしかに考えにくいがな。
0499デフォルトの名無しさん
NGNG356テトリススレで話題になってたので気になった。
0500デフォルトの名無しさん
NGNG0501デフォルトの名無しさん
NGNG0502デフォルトの名無しさん
NGNGexeファイルならシンボル解決だけで辛そう。
ExitProcess、という文字列だけで10byteだし
0503もしかすると最小(12byte)
NGNGWScript.Echo
0504デフォルトの名無しさん
NGNG>>503
それは却下でそ(笑)。多分MessageBoxも却下だと思われ。
ウィンドウプロシージャを呼び出すのを前提にするといいかもね。
ところで、このスレでこのOS依存の話題を続けてもいいのかなぁ?
0505デフォルトの名無しさん
NGNGfRet = FALSE;
while(1) {
// 中略
if (GetAttribute(pNode, FROMY, strFromY) == FALSE){
TRACE("Not found %s Attr\r\n", FROMY);
strFromY = "0";
break;
}
if (GetAttribute(pNode, TOY, strToY) == FALSE){
TRACE("Not found %s Attr\r\n", TOY);
strToY = "0";
break;
}
fRet = TRUE;
break;
}
何がトリッキーかというと、この香具師の組織では「複数return禁止」「goto禁止」だったんだ。
だからってこれならいいのかと小一時間・・・
「頼むからgoto使ってくれ」と言いたくなったよ。
0506デフォルトの名無しさん
NGNG複数リターンは下手するとメモリリークの原因にもなりかねんから
なるべく使わないようにしてるけど。
while(1) { break; } や do { } while (0);
もいいか悪いかは別としてgotoの代わりとしては
よく使われてるんじゃないの?
0507デフォルトの名無しさん
NGNGすまん、あおりではなく素でどこが問題なのかわからないんだけど
0508デフォルトの名無しさん
NGNGしかしgotoなんか使う場面とは思えんなあ。
一般的にgoto禁止でも普通ぜんぜん困らんが、複数returnはむしろリファクタリングで
積極的に使うべきものだから禁止ってのは辛いな。
0509デフォルトの名無しさん
NGNG今時はスマートポインタなどで確実にデストラクタでガードするようにするので
複数returnは基本
0510デフォルトの名無しさん
NGNGtrueやfalseではなく1とFALSEを使っているところから、C++ではなくCだろうと思われ。
0511デフォルトの名無しさん
NGNGこれはそんなにトリッキーでは無いんじゃないかな?
一般的なスタイルなら、do...while(0) だから、そちらの方が読みやすいけど。
0512505
NGNG漏れはループでないシーケンシャルな処理には「決して」while/do/forは使わん
主義なのだが(言ってることおかしいか?)、どうやら世間ではそうでもないのかな?
特に、whileブロックの最終行にbreak;は生涯で一度も書いたことが無い。
少しは自分の社会勉強になったかな。w
0513デフォルトの名無しさん
NGNG0514505
NGNG最新のスタイルならきれいにスマートポインタで開放・復旧できるもんなのかな?
漏れの知識は少し古いので分からん。ので、古典的だがgotoでexitラベルに飛ばして、そこで
finally()処理をしてからreturnというルールにした(かった)。
0515505
NGNG0516デフォルトの名無しさん
NGNG0517通りすがり
NGNGgoto使えとは思わんかったけど、do{}while(0); 使えよとは思った。
…更にその後 do{}while(0); は使うなと言われて唖然。
0519505
NGNG1) 「プログラミング言語C第二版」(K&R)には、
「(gotoの)最も一般的な使用は、深く入れ子になった構造での処理を中断させる場合である」
とある。
2) 「プログラミング言語C++第三版」(Stroustrup)には、
「gotoを使ってもよいまれなケースのひとつは、入れ子状のループ、switch文からの脱出である」
とある。
3) C/C++の子孫であるJavaおよびC#には、finally{}節が存在する。
・・・以上のことから漏れ個人は、C/C++においては、たとえループやswitch文がネストしていない
場合でも、goto finally;型の用法は良性と見ていたりする。
Java/C#との論理的互換性・移植性を考えても、その使い方は悪性ではない。というか、見かけ
上のgotoや複数returnを回避するためにループ構文を使うのはよくないんではないか、とか思う。
(gotoスレにいくべきだったかも知れんな)
0520デフォルトの名無しさん
NGNGGDIだろうがなんだろうが出来るし、例外処理対策を考える場合
デストラクタでやる以外にない。
0521デフォルトの名無しさん
NGNG0522山崎 渉
NGNG│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
0523デフォルトの名無しさん
NGNGケースバイケース。
漏れは↓のようなコードのデバッグで詰まったことがある。
・関数仕様:
「ある条件」を満たすまで待つスレッド。
・症状:
「ある条件」を満たすのを待たない
・実装:
DWORD hoge_thread()
{
:
while(1){
int flg = hoge(); // 実際はこの中でループ。判定式が間違っていた。
if( flg == ERROR_HOGE ){
break;
}
break; // ←バグだと思って消した
}
:
}
break のせいでループしないと思い込み、
消したら今度はフリーズしたもんで
小一時間考え込んでしまったよ…
0524デフォルトの名無しさん
NGNGまあ始めてみたらそう思うだろうけど、
小一時間考え込むのはデバッグのセンス悪杉
がんばれ
0525523
NGNG漏れのセンスが悪いと決め付けるんじゃなくて、
hogeの中身が小一時間悩むに相応しい内容だったとか、
"小一時間"に誇張が含まれてるとか、もっと想像力働かせて欲しい…
…などと書くと「コイツはダメな仕様書書く奴」とか言われそうだな。
0526デフォルトの名無しさん
NGNGそういうのは織り込み済みで、センスが悪いんだろう(藁
0527デフォルトの名無しさん
NGNGいい事いった
0528デフォルトの名無しさん
NGNG{
:
while(1){
int flg = hoge(); // 実際はこの中でループ。判定式が間違っていた。
if( flg == ERROR_HOGE ){
break;
}
break; // ←バグだと思って消した
}
:
}
そもそもこんな関数作るやつのセンスが無いんだけどな
0529505@休み明け
NGNG引っかかる香具師も俺だけじゃないらしい。
トレースに費やした時間よりは、書いた香具師に
問いただした時間のほうが長かったよ。そいつが
別の仕事入ってたんで、同じ形式のコードを5箇所
位自分で改善しないといけないのが一番の苦痛だった。
0530デフォルトの名無しさん
NGNGswitch(...) {
case LABEL_A: {
...
} if(false)
case LABEL_B: {
...
} if(false)
case LABEL_C: {
...
}
...(共通処理)
}
というコードがあったけど、このコードはまず所見では理解されないだろうなぁ。
書きたくなる気持ちは非常によくわかってしまうが、インライン関数化すべきか。
0531デフォルトの名無しさん
NGNGそういうときは共通処理を関数化するか、
switchをもう一段入れてる。gotoでまとめることもあるけど。
switch(X) {
case LABEL_A:
case LABEL_B:
case LABEL_C:
switch(X) { // Xは上と同じ式
case LABEL_A:
...
break;
case LABEL_B:
...
break;
case LABEL_C:
...
break;
}
...(共通処理)
break;
....
}
0532デフォルトの名無しさん
NGNG(あくまでも個人的にだが)美しくない気がする。自分では書きたくない。
530の方がトリッキーな分まだ美しいが可読性は著しく落ちるな。
しかし難しいよな。たとえば共通処理が2〜3行程度だった場合
わざわざインライン関数を書くのもなんだか美しくないし、
かといってcaseの中身を別々の関数にしようと考えてしまうと
2〜3行のcaseが10個くらいあった場合に悶え死にしそう。
どこかの組織で書く場合ならば、やっぱり531を選択せざるをえないけれど、
その場合でも可能であれば下のようにして書きたいな。
switch(...) {
case LABEL_A: ...; break;
case LABEL_B: ...; break;
case LABEL_C: ...; break;
...
}
switch(...) {
case LABEL_A:
case LABEL_B:
case LABEL_C:
...(共通処理)
break;
}
自分がメンテナンスするコードなら喜び勇んで530と書くけどな
0533デフォルトの名無しさん
NGNGswitch( X ) {
case A: ...; break;
case B: ...; X = A; break;
case C: ...; X = A; break;
}
if( X==A ){
(共通処理)
}
0534デフォルトの名無しさん
NGNGあまり素直ではないと思うぞ。それに532の方が読みやすい。
0535532
NGNGXを再利用するならXのコピーを作る。
各処理を関数化するか否か迷う程度の大きさなら、
変数増やしてもさほど可読性は落ちないだろうし。
共通処理が1つでなく、組み合わせが多ければ>>534と書くけど、
switchは別々の関数に分ける。
0536デフォルトの名無しさん
NGNG・533はソースを読む人の意識からすれば、たとえばswitch文をあまり詳しく読まずに
下のif文まで読んでしまった場合に、そのif文が実行されるのがX==Aの場合だけだと
誤解される可能性が高い。532であれば、矛盾せずに読める。
・その後Xを用いた処理がある場合は変数をひとつ増やす必然性があるが、
ただ条件分岐のためだけにflag変数をひとつ増やしてしまうと、
同じ関数内で同じ意味の変数が出来ることになり、後のメンテナンスで問題を誘発しやすい
(間違えてXを使ってしまった、というバグが出ることは十分にありうる)
という意味で、533は美しくないと言える。
グループでのプログラミングの場合は可読性の低いプログラムを書くべきではないし、
自分さえわかればいいというのであれば530だな(笑)
0537デフォルトの名無しさん
NGNG普通に531-532かな。言い方を変えれば533も「トリッキー」だろう。
前スレ読んでなかったんで、530は初めて見た。いろいろあるもんだな。
0538デフォルトの名無しさん
NGNGif (a == b == 0)
// something;
って書いちまってたよ。当然、
if ( (a == b) == FALSE)
// something;
と解釈されるよな。もうだめぽ現役引退か・・・
0539デフォルトの名無しさん
NGNG0540デフォルトの名無しさん
NGNGconstをswitchに入れることなど普通です
ex:
int function(const int mode) { switch(mode)...
0541デフォルトの名無しさん
NGNGint型引数を const にする意味があるのかと小一時間。
参照なら分かりますが。
フラグを使う点や、ここがトリッキースレであることに目を瞑れば
↓が一番素直で簡潔だと思いますが。
フラグで可読性が落ちるほど大規模なら、素直に関数化すべきだし。
関数コールに比べりゃ、bool値の演算の方がコスト安いし。
bool flg = true;
switch( X ) {
case A: ...; break;
case B: ...; ; break;
case C: ...; ; break;
default:
flg = false;
}
if( flg ){
(共通処理)
}
(処理)
if( flg ){ // 再度分岐が必要な場合に有利
(共通処理)
}
0542デフォルトの名無しさん
NGNGフラグを使うと美しさが無いなぁ
0543デフォルトの名無しさん
NGNG批判しているよね。
0544デフォルトの名無しさん
NGNGswitch(...) {
case LABEL_A: ...; break;
case LABEL_B: ...; break;
case LABEL_C: ...; break;
default:
goto no_exec_common;
}
...; /* 共通処理 */
no_exec_common:
0545デフォルトの名無しさん
NGNG0546デフォルトの名無しさん
NGNG>無条件に野蛮人扱い
こういう香具師が野蛮人だと思いますw
0547デフォルトの名無しさん
NGNGgotoや中途returnの方がよっぽどましってマジで思う。
0548デフォルトの名無しさん
NGNGマ逆なスレに見える漏れは逝ってヨシですかね?
0549デフォルトの名無しさん
NGNG参考になった。
gotoを使う発想は、日頃から使っていないと出ないのかも。
>>548
マ逆?
0550デフォルトの名無しさん
NGNG0551デフォルトの名無しさん
NGNG0552デフォルトの名無しさん
NGNG共通処理自体もswitchの中に書くなあ。
外に書くとなんか気持ち悪い。
0553デフォルトの名無しさん
NGNG普通、ビジネスアプリのデータフォーマットが変わるメジャーバージョンアップの場合は、旧データ変換専用のコードを書くと思う(漏れはな)。
特に複数の過去バージョンに対し読み書き双方向をサポートする場合は、ターゲット毎にコンバータを書いたりするのが一般的ではないかな。
漏れが見た某「割と有名」アプリはレイヤ方式というか、
V5フォーマット(最新)
↑ ↓
V4フォーマット
↑ ↓
V3フォーマット
↑ ↓
V2フォーマット
↑ ↓
V1フォーマット
と連続的に世代変換する方法で、例えば「V2形式を読んでV4形式で保存する」というような事を可能にしていた。
まだメモリやディスクの制約が厳しい時代に書かれたコードで、場所を食わない上に最新バージョンに対しては高速に動作する。
知られたテクニックなのかも知れんが、個人的には面白いな〜と思った。
0554デフォルトの名無しさん
NGNG上から下への矢印はなんかおかしい気がする。
フォーマットを変えるからには、下のフォーマットでは実現できない
何らかの付加情報があるはずだが。
0555デフォルトの名無しさん
NGNG単に情報切り捨ててるんじゃねーの?
0556デフォルトの名無しさん
NGNGもちろん切り捨てるしかない。例えばAdobe Illustratorは業界標準だが新版の普及に
何年もかかるため、納品先の都合で2バージョン前のファイルを書く必要性も生まれる。
0557デフォルトの名無しさん
NGNG0558デフォルトの名無しさん
NGNG本来切り捨てる必要の無い情報を切り捨てたりしてしまうのが問題か?
しかしそんな事態はまず起こらないだろうけれど。
それと、データサイズが膨大だった場合は処理が冗長になりよろしくないね。
0559デフォルトの名無しさん
NGNGトリッキーなコンパイラを作るとか
0560デフォルトの名無しさん
NGNG0561デフォルトの名無しさん
NGNGかと言って自分が上げるのもなあ・・・
0562デフォルトの名無しさん
NGNG最終書き込み日時が考慮される。
0563デフォルトの名無しさん
NGNG0564デフォルトの名無しさん
NGNG0565デフォルトの名無しさん
NGNG#define END }
トリッキーというよか、こんなの書いたら終わりだな(藁
0566デフォルトの名無しさん
NGNGとりあえずsage進行で行こう。
昔、VC++でTODOにタグジャンプを付けたいときに、
ものすごくトリッキーなコードを書いた記憶があるな。
コンパイルエラーとかが出ると、VCでは、
C:\project\foo\foo.c(123) error C4001: 何らかのエラー。
C:\project\foo\foo.c(123) warning C4002 : 何らかのワーニング。
という形になるのですが、それと同様に
C:\project\foo\foo.c(123) message : TODOなどのメッセージ
という出力をするマクロを書いた。
これをやると、便利なことにF4でタグジャンプできるので、
TODOメッセージや連絡事項などを忘れることなくソース中に書ける。
完全な処理系依存だとおもうけど、発掘したら公開します。
0568デフォルトの名無しさん
NGNGttp://www.microsoft.com/japan/developer/library/vccore/_predir_message.htm
なんてものが一発で見つかったと、検証コードも書かずにカキコしてみるテスト。
0569566
NGNG>>568
もちろんそれを使うのだが、このプラグマはメッセージを純粋に表示するだけで、
ファイル名や行番号は出してくれないのだ。
で、自分で出力しようと思って、
#define TODO(x) message( __FILE__ "(" __LINE__ ") message: " x )
という定義を書いてみるわけだが(#pragma TODO(...) という使い方を想定)、
__LINE__ が文字列ではなくて数値だということでコンパイルエラーが出る。
そこで、文字列化マクロを使用して
#define _TOSTRING(x) (#x)
#define TODO(x) message( __FILE__ "(" _TOSTRING(__LINE__) ") message: " x )
のように書いてみることを大抵思いつくと思うけど、この出力結果は
C:\project\foo\foo.c(__LINE__) message : メッセージ
となってしまう。__LINE__ が展開されないまま文字列化されてしまうんですよ。
0570566
NGNG#define _TOSTRING(x) (#x)
#define _THRU(x) _TOSTRING(x)
#define TODO(x) message( __FILE__ "(" _THRU(__LINE__) ") message: " x )
間に一つ何もしないマクロをはさむことにより数値展開された上で文字列化されます。
コンパイラのプリプロセッサ内部で構文解析木を作るときに、一度記号表へ入れられるか
直接処理されるか、その内部構造の隙間を利用したトリックですね。
種明かししてしまうと簡単なんだけど、このコードはそこそこ気に入っています。
(ただ手元にソースが無いので、思い出しながら書いているので間違っていたらごめんなさい)
0571デフォルトの名無しさん
NGNG#error ほげほげ
とか書けるのは知ってるよな? エラーになるので、ワーニングには使えないが。
0572デフォルトの名無しさん
NGNGコンパイルエラー出したくないから TODO なんだと思うが・・・
0573デフォルトの名無しさん
NGNGエラーになったらビルドが止まりますから、それはいやですよね。
面白いことに、出力の"message"のところを"error"や"warning"に変えると
なぜかエラーやワーニングのカウントに入れられてしまう罠@VC
0574デフォルトの名無しさん
NGNGたいけど我慢してsage!
0575デフォルトの名無しさん
NGNG実際に VC でやってみた。
_TOSTRINGマクロは ()でくくるとコンパイルエラーになりまつ。
#define _TOSTRING(x) #x
それから、埋め込むときは
#pragma TODO("さっさと実装しろ。")
のように書く必要あり。
#pragma もマクロに埋め込めるとさらにウマーだが。。。
0576デフォルトの名無しさん
NGNGサンキュー。やっぱうろ覚えじゃダメだな。
今自分の環境(.NET)でやってみたら、タスク一覧に出てこないから
F4ジャンプなどが出来なくなっている。出力からのタグジャンプは使えるから
使いにくくなったわけじゃないけど、.NETになってしまったら
出力をチェックする人は少ないかもしれないね。
で、相変わらず、自分で#pragma messageを使って出した偽のエラーメッセージに
統合環境は律儀に反応してくれます。
IDEとコンパイラは、標準入出力のみで繋がっているんだね(笑)
>#pragma もマクロに埋め込めるとさらにウマーだが。。。
それ、できるのかなぁ?出来たらかなりトリッキーぽ
0577デフォルトの名無しさん
NGNG#define TODO(x) message( __FILE__ "(" _THRU(__LINE__) ") : warning : " x )
を使えばタスク一覧にTODOメッセージが出ます(ついでにコンパイラが警告を勘違いして加算します)。
これで.NET環境でも便利に使えるかもしれない
# けど.NETなら標準でこういうツールを用意してそうな気もする。調べてないけど
0578デフォルトの名無しさん
NGNG_Pragma…
残念ながらVCじゃ使えないね。
0579デフォルトの名無しさん
NGNG0580デフォルトの名無しさん
NGNG#define TODO(x) message( __FILE__ "(" _THRU(__LINE__) ") : ToDo : " x )
0581デフォルトの名無しさん
NGNG0582デフォルトの名無しさん
NGNGvoid *operator new ( size_t Size , int lib);
void __cdecl operator delete(void* p, size_t Size);
#define new new(1)
#include "a_lib.h"
#undef new
#define new new(2)
#incluede "b_lib.h"
ヘッダファイルによってメモリ管理方法を変更したい場合のコードです。
しかしこの場合、deleteがうまく出来ないので、なんとか解決する方法を模索しましょー
0583デフォルトの名無しさん
NGNG0584デフォルトの名無しさん
NGNG0585デフォルトの名無しさん
NGNG0586デフォルトの名無しさん
NGNGなんにせよ厨房のいないスレってことか。すばらしい
誰かテンプレートを使ったトリッキーなコード知らない?
0587デフォルトの名無しさん
NGNG0588デフォルトの名無しさん
NGNGsageでもちゃんと定期的に書き込んでいれば、消されないはずじゃなかったっけ?
正直、厨房が紛れ込まない今のスタイルがかなり気に入っているので
0589デフォルトの名無しさん
NGNGまぁ大丈夫だろう。
ただ、レスがあっても最下層にいていると落ちそうなので怖いなと。
糞スレに紛れて厨房がこない雰囲気は俺も好きだが。
0590デフォルトの名無しさん
NGNGそれよりトリッキーなコードキボンヌ
0591デフォルトの名無しさん
NGNG0592デフォルトの名無しさん
NGNG0593デフォルトの名無しさん
NGNG2:テンプレートによる可変個引数
どちらを書くか考えながら寝る
0594デフォルトの名無しさん
NGNG0595デフォルトの名無しさん
NGNGどっちも面白そうだな。
誰かトリッキーなコードを書いてくれることを楽しみにしてるぜ(゚∀゚)b
いや、俺はそんな実力無い…スマソ_| ̄|○
0596デフォルトの名無しさん
NGNGどうでもいいがVS.NETは結構重い気がする。
昔どこかのスレで見たんだけれど、調べてみたけれどどこかわからなかった。
間違いなく倉庫に行っているとは思うんだけれど、作者の人パクってすまん。
VC++のみでしか使えないのが残念だが、Windowsでのアンチデバッグコード。
デバッグ状態で実行すると異常終了するように出来ている。
bool flag=true;
__try {
__try {
DebugBreak();
}
__except(GetExceptionCode() == STATUS_BREAKPOINT) {
flag = false;
}
}
__finally {
if(flag) exit(EXIT_FAILURE);
}
// normally execution
これでも十分きついが、さらにわかりにくくするためには
一見何気ないコードの中に動的ランダムにint 3hを入れることにより
ブレークポイント例外を飛ばせばいいんじゃないだろうか。
自分がクラックするときのことを考えると本気で萎えそう。
ちょっと有用なトリッキーコードでした。
今度はかなりトリビアなトリッキーコード行きます。
0597デフォルトの名無しさん
NGNGと書いておいて、デバッグ状態で走らされたら
全HDフォーマット&ネットワークファイル全削除するとか。
自分がクラックするときのことを考えると本気で泣きそう。
0598デフォルトの名無しさん
NGNGトリッキーというか…トリッキーなのかなあ(苦笑
まあもっとも法のほうは多分そんなデバッグしてはいけないというのを
守ってくれるようなのは、少なくとも現行日本には無い希ガス。
実際にそんなことしたら負ける雰囲気。
どうせならもっとはっきりと、
「絶対にデバッグしないでください。
もしした場合ハードディスクのデータ及びネットワークファイルを消去します。
同意いただけない場合は使用してはいけません」
と利用規約に書く。
まあ、それでも裁判したらどうなるか怪しいけどナ
0599デフォルトの名無しさん
NGNGint ( int, int ) のような関数型を受け取って、引数タイプリストを返すもの。
タイプリストは、Loki のやつ。
template< typename R > struct RaramList { typedef Loki::NullType Result; };
template< typename R, typename P1 >
struct ParamList< R ( P1 ) > { typedef TYPELIST_1( P1 ) Result; };
template< typename R, typename P1, typename P2 >
struct ParamList< R ( P1, P2 ) >
{ typedef TYPELIST_2( P1, P2 ) Result; };
....
と、必要な分だけ特殊化させておく。そうすると、
ParamList< string >::Result; // NullType
ParamList< void ( int, int ) >::Result; // TYPELIST_2( int, int )
ParamList< int ( char*, int, int ) >::Result; // TYPELIST_3( char*, int, int )
で、引数リストが完成。
これを利用して、Loki の Functor を書き換えると、
Loki::Functor< int, TYPELIST_1( char*, int ) > と、
Loki::Functor< int ( char*, int ) > で同じ動きをさせることも出来る。
0600599
NGNG>>599
×> Loki::Functor< int, TYPELIST_1( char*, int ) > と、
○> Loki::Functor< int, TYPELIST_2( char*, int ) > と、
0601デフォルトの名無しさん
NGNGもちろんネタだけどね。
>>599
Lokiについて知らないので良くわからないが面白そう。
差し支えなければ少し解説してもらえると
0602599
NGNGint foo( char*, int ); という関数があったとき、
&foo の型は 「 int (*)( char*, int ) 」、*foo の型は、「 int ( char*, int ) 」
(違っていたら、指摘よろ)
boost::function だと、この関数型(?)で関数オブジェクトを実体化できるが、
Loki のファンクタは、以下のような定義になっていて、対応していない。
template
<
typename R,
class TList = NullType,
class ThreadingModel = DEFAULT_THREADING
>
class Functor;
第一テンプレートパラメータに戻り値の型、第二テンプレートパラメータに、
引数の型を入れたタイプリストを指定するようになっている。
(つづく)
0603601
NGNG0604599
NGNG関数の型でファンクタを実体化できるようになると、
以下のようなことが出来てちょっとうれしい。
typedef int ( func_type )( char* , int );
boost::function< func_type > fn( foo );
0605599
NGNG結局、関数型と、タイプリストの間を自在に行き来できるコード
template< class R > struct Conv;
template< class FR > struct Conv< FR () >
{
typedef TYPELIST_1( FR ) Result;
};
template< class TR > struct Conv< TYPELIST_1( TR ) >
{
typedef TR ( Result )();
};
あとは、ParamList と同じで特殊化をどんどんしていくだけ。
で、何に使うかは不明(w
0606599
NGNG意味もなく調子に乗りすぎたので、回線きって首(ry)
0607デフォルトの名無しさん
NGNGイ�`
0608デフォルトの名無しさん
NGNG0609デフォルトの名無しさん
NGNG112ページからの記事はどう思う?
引数については、Argumentという型の引数を
1つ受け取る形式のテンプレートクラスのようだけど
0610デフォルトの名無しさん
NGNG読んでいて途中で眠くなったので要約希望
0611609
NGNG今回は、関数の呼び出しに使うコールバクについて、
ベースクラスの実装からコールバックの集合体へと
解説していきます。
[はじめに]
ノートPCを2度目の修理に出した。
液晶パネルが割れたのだが、見積もりが十数万円と
いわれた。液晶パネルだけでなくHDやバッテリー
などにも異変があるそうだ。
懐に余裕がないので液晶パネルだけ直してもらった。
修理後にHDの検査をしたら欠陥クラスタがたくさん
見つかった。おどろいた。
デスクトップPCなら自分で部品交換するのだが、
ノートPCでそうするのは怖い。開けたフタが
閉じなくなったりネジが余ったりしたらと思うと…
0612609
NGNGC/C++では関数ポインタはかなりの頻度で使われる。
例えば、(マルチスレッドで)スレッド生成関数へ
スレッド関数を引数として渡されたり、qsortへ
比較関数を引数として渡したりしている。
関数へのポインタをほかの関数に与えておき、
必要に応じてそのポインタを介して関数が呼び出される
ことを「コールバック(call back)」と呼ぶ。
「メンバ関数へのポインタ」と「関数へのポインタ」は
違うものである。(staticでない)通常のメンバ関数は
インスタンスに対して適用される。例えば以下のとおり。
Foo f;
f.print();
Foo::print(); // エラー!インスタンスがない
メンバ関数には、インスタンスが暗黙の引数として
与えられることに注意すること。
メンバ関数は、通常の関数とは異なる宣言をする。
「クラス名::」で修飾されなければならない。
また、使用時には(暗黙の引数となる)インスタンスを
介して呼び出さなければならない。
関数へのポインタも、ポインタである。
コンテナへ格納した後に、格納順に呼び出したり
位置を指定して呼び出したりすることができる。
「メンバ関数へのポインタ」と「関数へのポインタ」は
違うと説明したが、混在してコンテナへ格納する方法を
以降で示す。
0613609
NGNG前提(or仮定or条件)として、呼び出す関数を
Result function(const Argument&);
とする。
コールバッククラスの仕組みは、3つのクラスで
構成される。
Callback ← FunctionCallback
← MethodCallback
以下に、クラスの抜粋を示す。
template<typename Argument, typename Resurt =void>
class Callback {
public:
virtual Result operator()(const Argument& a) = 0;
};
0614609
NGNGpublic:
typedef Result (*func_type)(const Argument&);
Result operator()(const Argument& a) { return (*func_)(a); }
private:
func_type func_;
};
class MethodCallback : Callback {
public:
typedef Result (T::*method_type)(const Argument&);
Result operator()(const Argument& a) { return (t->*method_)(a); }
private:
method_type method_;
T *t;
};
FunctionCallbackは関数へのポインタを保持するが、
MethodCallbackはそれに加えてインスタンスへの
ポインタも保持していることに注意すること。
0615609
NGNGコールバックを複数個まとめ、一気に呼び出す
CallbackChainを以下に(一部)示す。
class CallbackChain {
public:
void execute(const Argument& a);
private:
typedef vector<Callback*> chain_type;
chain_type chain_;
};
CallbackChainにはCallbackを追加/削除でき、
登録されたコールバックをexecute()で一気に
呼び出せる。ただ残念ながら、このように
複数のコールバックを行ったとき、戻り値を
無視している。どうするかさんざん迷った。
いい方法があればぜひご一報を。
vectorでポインタを管理しているので、
ポインタ先のCallbackオブジェクトを
~CallbackChain()で正しくdeleteする
必要があることに注意すること。
この際、vector::erase()の扱いにも
あわせて注意すること。
CallbackChainには基底クラスがないが、
これをCallbackから導出することも
考えられる。そうすればCallbackを
ツリー状につなぐことが可能であろう。
0616609
NGNGこれらのクラスをどう使うのか、使用例と
して整数の10/16/8進数表記を示す。
コールされる関数は
void print_dec(const int& n) {
cout << dec << n << endl;
}
の形式である。メンバ関数も似た形式である。
これらの関数はdec以外にhex/oct版がある。
本連載の第1回は「イベント駆動」という
タイトルでObserverパターンを紹介した。
紹介したクラスには更に手を加えたバージョンが
あるのだが、第1回ではそこまで紹介せずに終えた。
今回のCallbackはその解の1つである。
長い間待たせて正直スマンカッタ。
0617609
NGNG引数については、Argumentという型の引数を
1つ受け取る形式のテンプレートクラスのようだけど
そこのところはどうなの?
ところで、この記事の中で、CallbackChainのexecute()の
戻り値をどうするか迷ったということは明記しているが
(いい方法があったら教えてとも書いてある)
引数(の個数)をどう考えたのかについては何も書いてないのよ。
どう考えたのだろう。
「Modern C++ Design」では、ここでさっそく(?)
タイプリストがでてきたのだが。
0618デフォルトの名無しさん
NGNG0619デフォルトの名無しさん
NGNG> 引数については、Argumentという型の引数を
> 1つ受け取る形式のテンプレートクラスのようだけど
> そこのところはどうなの?
漠然としすぎていて質問の意図がよくわからない。
どう問題だと思ってるの?
0620デフォルトの名無しさん
NGNG0621デフォルトの名無しさん
NGNGint func1(int);
を使いたくて、また(同じプログラムの)別の場所では
double func2(double, double);
を使いたい時は、どのような解法を示すのか興味があった
他にもCallbackChainで、関数の型が単一でなく、
func1とfunc2を混在して追加/削除したいときとか
0622デフォルトの名無しさん
NGNGboost:::function + boost::bind + boost::signals を使えば解決じゃない?
そういう話じゃないのか……?
0623デフォルトの名無しさん
NGNGboost:::function → いわゆるファンクタ
boost::bind → いわゆるバインダ
boost::signals → これが何か予想つかない
最後がわからない…ので、どう解決されるかわからない
あと、この記事にのっているCallback って、俺には
説明が簡素に感じたんだ。たぶんこの記事を書いた人は
自分の中では解決できているのだろうけど、記事を
読んだ俺には「汎用」関数オブジェクトって気が
しなかったのよ。「引数が1つ」専用関数オブジェクトと
感じたんだ。少なくとも、このままではfunc1とfunc2を
混在してChainすることができるとは俺には思えない。
それで、個数が変わった場合にこの記事を書いた人は
どうしているのか興味があった。
0624デフォルトの名無しさん
NGNGここ見ればわかると思うー
ttp://www.kmonos.net/alang/boost/function.html
0625デフォルトの名無しさん
NGNGなんてトリッキーなんだ。しかも美しい。
0626デフォルトの名無しさん
NGNG…でも漏れ理解度25%未満だよ_no
修行してきます
0627デフォルトの名無しさん
NGNGhttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=84&fi=no
最後のところは、以下の用に修正しておいてくれ。
typedef typename::FunctorImplDef<R, TList, ThreadingModel>::Type Impl;
0628デフォルトの名無しさん
NGNGhttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=86&fi=no
0629デフォルトの名無しさん
NGNGリンク巡って勉強するよ
そしてboostも勉強するよ
長々とスレを汚してすまんかった
0630デフォルトの名無しさん
NGNG0631デフォルトの名無しさん
NGNGA< C1, C2, C3 > a1; // (1)
A< C2, C3, C1 > a2; // (2)
A< C3, C1, C2 > a3; // (3)
いずれの書き方をしても、必ずC1 だけ継承するようなコード。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=92
0632デフォルトの名無しさん
NGNGこのスレはsage進行だよ
0633デフォルトの名無しさん
NGNGゴメン
0635デフォルトの名無しさん
NGNG0636デフォルトの名無しさん
NGNGで、それは何の役にたつの?
0637デフォルトの名無しさん
NGNGここでは役に立つ、役にたたないをあまり問わない方向で。
テンプレートといえば、テンプレートプログラミングが熱かった。
まったく役に立たないけど、そこそこいろいろなことが出来るよね。
0638デフォルトの名無しさん
NGNGchar read(char*);
void write(char*);
main()
{
char moji1[21];
read(moji1);
write(moji1);
}
char read(char *x)
{
printf("文字を入れる!\n");
scanf("%s",x);
return *x;
}
void write(char *x)
{
printf("%s",x);
}
0639デフォルトの名無しさん
NGNGchar read(void);
void write(char*);
main()
{
write(read());
}
char read(void)
{
char moji[21];
printf("文字を入れる!\n");
scanf("%s",moji);
return *moji;
}
void write(char *x)
{
printf("%s",x);
}
0640デフォルトの名無しさん
NGNG・・・・で、このプログラムのどこがトリッキーなのか説明をお願いします。
0641デフォルトの名無しさん
NGNGmoji[]はread()を抜けた時点で消滅するからアウト。
0642デフォルトの名無しさん
NGNGこのスレが良スレの理由
・理解できないものには決して突っ込まない
・煽りや荒らしに一切反応しない
・sage進行
0643デフォルトの名無しさん
NGNGと思ったが、よく見るとこれ何?char *read()ならわかるが。
これの返り値をwrite(char *)で受けられるわけないだろ。
0644デフォルトの名無しさん
NGNG了解。多分ポインタ覚えたてホヤホヤで何か書き込みしたくて
仕方ない時期なんだろうと見た。
0645デフォルトの名無しさん
NGNG煽りもいれないように。空気のごとくスルーする事を期待。レス不要
0646デフォルトの名無しさん
NGNGやっぱり訳分からん。
0647デフォルトの名無しさん
NGNGv.push_back()....
std::for_each( v.begin() , v.end, boost::bind(printf,"%d",_1));
0648デフォルトの名無しさん
NGNG例えば、Loki::SmartPtr は、StoragePolicy がテンプレートパラメータの
一番最後にきているけど、この技術を応用すると、StoragePolicy を
4つあるテンプレートパラメータのどこに書いても
きちんと StoragePolicy として継承するようになるわけだ。
SmartPtr< MyClass, MyStorage<_> > sp1;
SmartPtr< MyClass, MyOwnership<_>, MyStorage<_> > sp2;
SmartPtr< MyClass, MyConversion, MyStorage<_> > sp3;
( 「_」 は、継承時に、正しい型に置き換わる。ダミー )
で、実際にそれをやっちゃったのが、
http://www.cuj.com/documents/s=8890/cujexp0310alexandr/
0649デフォルトの名無しさん
NGNG目から鱗!
テンプレートによるポリシーの分割は後ろの方に持ってったポリシーのカスタマイズが面倒なのが欠点だったけど、
それだとStorageだけ自分で用意して後デフォルトが全部省略出来るってのはおいし過ぎ。
0650デフォルトの名無しさん
NGNGこれはタモリも20へぇレベルだな
0651デフォルトの名無しさん
NGNGhttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=98&fi=no
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=99&fi=no
0652デフォルトの名無しさん
NGNG0653保守&
NGNG0654デフォルトの名無しさん
NGNG0655デフォルトの名無しさん
NGNG0656デフォルトの名無しさん
NGNG静的フラグ。
struct Flag1{}; struct Flag2{}; struct Flag3{};
void foo( Flag1, int value ) { /* 処理1 */ }
void foo( Flag2, int value ) { /* 処理2 */ }
void foo( Flag3, int value ) { /* 処理3 */ }
使い方
foo( Flag1(), 12 );
0657デフォルトの名無しさん
NGNGトリッキーかどうかはともかく。
ttp://www.kmonos.net/alang/boost/classes/mpl.html
のcreate_implが近いかも。
template<int no>
struct Flag{
enum{value=no};
};
void foo(const Flag<1> &,int value);
void foo(const Flag<2> &,int value);
void foo(const Flag<3> &,int value);
class Flag1Alias:public Flag<1>{};
typedef Flag<1> Flag1Alias2;
foo(Flag<1>(),12);
foo(Flag1Alias(),12);
foo(Flag1Alias2(),12);
というかLoki::Int2Typeでいいのでは、と思ったり。この場合。
まあ識別子名が使えるからいいかなと思うけど。
0658デフォルトの名無しさん
NGNG656だとtemplateを使わずにすむ、というよりCで出来るのが凄いのでは?
0659デフォルトの名無しさん
NGNGしかし、テンプレートは処理系によっては使いづらいから、まぁ許して
0660デフォルトの名無しさん
NGNGstruct static_cast_tag{};
struct dynamic_cast_tag{};
template< typename T >
class smart_ptr
{
T * p_;
...
template< typename U > smart_ptr( smart_ptr<U> const & rhs, static_cast_tag )
: p_( static_cast< T >( p ) ), ...
{}
template< typename U > smart_ptr( smart_ptr<U> const & rhs, dynamic_cast_tag )
: p_( dynamic_cast< T >( p ) ), ...
{}
...
};
template< typename T, typename S >
smart_ptr< T > static_pointer_cast< smart_ptr< S > const & src )
{
return smart_ptr< T >( src, static_cast_tag() );
}
template< typename T, typename S >
smart_ptr< T > dynamic_pointer_cast< smart_ptr< S > const & src )
{
return smart_ptr< T >( src, dynamic_cast_tag() );
}
Boost っぽく。
0661デフォルトの名無しさん
NGNG0662デフォルトの名無しさん
NGNGまた地下でにぎわう良スレになりそうで嬉しい
0663デフォルトの名無しさん
NGNG↓
if(a?b:c)
0664デフォルトの名無しさん
NGNG0665デフォルトの名無しさん
NGNG0666デフォルトの名無しさん
NGNGふつーにみんな使いまくってると思うが。
0667デフォルトの名無しさん
NGNG>>666
うちの会社は小規模なので、Lokiとかのtemplateをがりがり使っても
みんなついてきてくれるだけの技術を前提に出来るので平気なんだけど、
一般的な会社の場合はどの程度C++を使ってもいいのかな?
それと、C++を使った仕事ってどんなの?
うちはWindowsのクライアント開発(WTLベースなのとMFCベースなの)と、
組み込み系OSの開発に使っているけれど、最近Javaの方が多いな。
0668デフォルトの名無しさん
NGNGスピード重視なんで抽象度を上げる方向には行かない.
でもスピード重視じゃないやつに使ってやろうと,今何とか画策中.
0669デフォルトの名無しさん
NGNGWinアプリ、組み込み(ネットワーク・カーナビ・医療・携帯)
スレ違いなのでこの辺で。
0670デフォルトの名無しさん
NGNGクラス程度ならバシバシ使われてる。
ただtemplateまで使ってるのはほとんど見た事ない。
つーか漏れがほぼそのまま使えるサンプルを、vector使って1〜3日で書いたら、
設計と違うとの理由で却下し、設計通り配列使って1週間もかけて書いたりするし。
不定サイズのファイルを一括読み込みして処理するのに、それでええんかと。
0671デフォルトの名無しさん
NGNGいるいる。
そういう自分が書いたのはスバラシイのにって勘違いして
設計通り書けないヤシ。
スバラシイと思うなら設計を変えるよう努力シレ。
0672デフォルトの名無しさん
NGNGC++でスピードが犠牲になることってあるのかな?
アセンブラレベルまでカスタマイズが必要なら話は別だけど、
設計さえしっかりすれば組み込みでも十分威力を発揮できると思うけど。
>>670
671ほど口は悪くないが同意。正しいと思うことは主張するべし。
設計と違うコーディングをするのはどんな状況であれ言い訳できないかと。
0673デフォルトの名無しさん
NGNGまぁ、このスレは地下でマターリ技術的な話題で進行するスレだから
あながちスレ違いとも言えないかと
0674デフォルトの名無しさん
NGNG仮想関数を使ったC++のコードであれば、
vtbl参照してアドレス解決するために仮想関数の呼び出し
=関数のアドレス解決に単純に考えて1クロック余計に時間がかかる
vtblを全く参照する必要のないコードであれば、
実行速度で差が出ることは普通ないと思う
0675665=668
NGNGうちでLokiとか言っても誰もついてこないよ(泣
>672
うちはアセンブラレベルでカスタマったりしてるんでちと厳しい
>設計さえしっかりすれば組み込みでも十分威力を発揮できると思うけど
ですよね.スピードを追求するもの以外ならC++でいいと思うんだけど
いやむしろC++で
>674
どうせC++使うならvtbl使いたい.デザパタ使いたい.抽象度を高めたい.
template使いたい.ジェネリックにしたい.トリッキーにしたい?(wじゃないですか
C++のクラスを使ったbetterCでも悪くはないけど
ということで啓蒙活動してます.次のプロジェクトあたりC++導入を...
まあ組み込みでtemplateは厳しいが.
ってことですれ違いなのでこのあたりで失礼します.Thanks>all
0676デフォルトの名無しさん
NGNGC++でテンプレート使ってもそれなりにタイトなコードを書けるのなら組み込みに使えるんでない?
演算子オーバーロードとインライン関数の組み合わせでCよりタイトに書けた例もあることだし。
0677デフォルトの名無しさん
NGNGコンパイル時に解決できるコードであれば
オーバーヘッドは無いんじゃないかな?
0678670
NGNG>設計と違うコーディングをするのはどんな状況であれ言い訳できないかと。
設計変更を提案するためのサンプルを組む時でもダメなのかと。
あと主張は一応した。
配列じゃバッファオーバーフローの危険があると説明したんだよ。
だが上司からは「客に設計見せたからもう変えられん。」と訳の分からん返答が。
それでも食い下がると、上司は諦めたのか客に電話をし始めた。
しかし会話を聞いてると、なぜか扱うファイルの最大サイズなんぞを質問してやがる。
そして電話を切った上司はにっこりと、「バッファオーバーフローの心配は不要だ。」
('A`)
…スレ違いなのでここまでにしとく。
後は好きに想像してくれ。
もちろん漏れを厨扱いするのも自由だ。
0679デフォルトの名無しさん
NGNGなるほど670は「設計に異議あり」というコードだったのか。
その却下の理由が「設計と違う」って意味不明だな
すれちがいだから俺もここまで
0680デフォルトの名無しさん
NGNGbufferOverflowして何か不具合が出た場合、全ての責任は上司が被る事にしないとマズイよ
0681671
NGNGあのね、お客と仕様を決めてしまったものに対して
おいそれと勝手に変更することは出来ないの。
もう少し大人になれ!
どうして、設計通りじゃだめで書いたサンプルがいいか
お客に説明して納得してもらわなければ主張したとは言わないの。
がんばれ!
0682デフォルトの名無しさん
NGNG0683デフォルトの名無しさん
NGNGで、インライン展開されるC++コードならばvtblの影響も受けないわけで、
うまく設計すれば呼び出しオーバーヘッドもなくすことが出来るのでは?
もっともよほどうまく設計して、コンパイル時にほとんどすべてが計算できるような
複雑なテンプレートを必要とするだろうから、一般企業では向かないと思うけど。
0684デフォルトの名無しさん
NGNGコンパイラがインライン展開してくれたり、オーバーヘッドの
少ないバイナリを吐いてくれる保証など無い。
どーいうコードに対しどーいうバイナリ吐くか分ってるコンパイラで、
そのコンパイラに特化したコードを書くのなら保証はあるだろうが、
アセンブラの知識が必要だし、だったらアセンブラで直接書いた方が
早いのではなかろーか。
#それでもあえてC++で書けば、このスレに相応しいコードになるかも知れんが。
0685デフォルトの名無しさん
NGNGvtbl使わず、再帰テンプレートやインライン展開させる目的で
テンプレートを使うのは有効だと思うよ
ただ、やっぱり仕事で使うのはチームのテンプレートに対する知識レベルや
後々のこと考えると難しいんじゃないかな
あと、テンプレートの痛いとこはコンパイラによって
激しく対応が異なる場合があるのがね・・
>684
煽りですか?
0686デフォルトの名無しさん
NGNG0687デフォルトの名無しさん
NGNGC++についてはもう少し勉強したほうがいいね。
アセンブラできちんと管理できるプロジェクトであれば、アセンブラでやればいいんじゃない?
0688684
NGNG何を勉強しろと。
インライン化やテンプレートの使用によって、>>683の期待通りの効果が
あるかどうかはコンパイラ次第でしょ。
まぁ最近のコンパイラなら、普通の期待には答えてくれるだろけど、
アセンブラレベルでカスタマってるようなヤシの期待に答えられるとは思わんね。
0689デフォルトの名無しさん
NGNG煽りだな
0690デフォルトの名無しさん
NGNG#内容的には面白いんだが続けると荒れそう
0691デフォルトの名無しさん
NGNG0692デフォルトの名無しさん
NGNG0693デフォルトの名無しさん
NGNG漏れ gas の文法が今ひとつわかんなくて。。
せっかくの煽りだから関連したネタ持ち出すんだけど、昔 EPOC32、今 Symbian OS って
いう ARM OS で携帯電話や PDA 向けのがあるんだけど、これは API が全部 C++。
Cygnus で Win32 なんかでクロス開発する。
一方、非常に COM っぽい感じの携帯電話AP開発用の BREW ってな規格の方は、
なぜか gcc で hoge->aho(a) みたいなのを Hoge_Aho(hoge, a) って書かないとダメ。
開発元の Qualcomm はそのうち g++ 使えるようにします、って言ってるんだけど。
大企業なんだから、おとなしく Cygnus にお金払って開発環境整備すればいいのに。。
0694デフォルトの名無しさん
NGNGint func1( int val ) { return val; } // int ( int ) な関数
...
Loki::Functor< void, TYPELIST_1( int ) > fun( &func1 );
などとしようモノならば、fun(12); などとやった時点でコンパイルエラーが
起きるわけだけれど、VC++ 7.1 ならば、
template< typename R > structretval
{
template< typename T > static R r( T val ) { return val; }
};
template<> struct retval< void >
{
typedef void r;
};
みたいなモノを用意して、FunctorHandler の operator() の内容を、
ResultType operator()( ... )
{
return retval< result_type >::r( f_( ... ) );
}
と書き換えてやるだけで、boost::function でいうところの互換性のある
ファンクタが実現できる。つまり、int func( long ) な関数を、
Functor< void, TYPELIST_1( short ) > に渡して、実行することができるわけだ。
0695694
NGNGつーか、retval クラスは、
template< typename R > struct retval{ typedef R r; };
だけでよさそうだ。
0696684
NGNG追記。VC++ では以下のコードが普通に通るので、
>>694-695 のような変なことをしなくてもいいらしい。
int show_int( int val ) { std::cout << val << std::endl; return val; }
template< typename T > void call( T fn )
{
return void( fn( 10 ) ); // !
}
int main() { func( show_int ); return 0; }
0697デフォルトの名無しさん
NGNG多分VC++7.1だと思うけど。
買うかなぁ、VC
0698デフォルトの名無しさん
NGNG0699デフォルトの名無しさん
NGNGデバッガ無しだと例外が投げられるが
デバッガが付いてるとデバッガに落ちる(例外は投げられない)
0700デフォルトの名無しさん
NGNGだから良いんじゃん。
0701デフォルトの名無しさん
NGNG?
意味分からんというから説明しただけだが
0702デフォルトの名無しさん
NGNG0703デフォルトの名無しさん
NGNG/* コメントをネストできない場合 */
} else {
/* コメントをネストできる場合 */
}
0704デフォルトの名無しさん
NGNG0705デフォルトの名無しさん
NGNGint i;
/* */
printf("%c", i["test"]);
既出?
0706デフォルトの名無しさん
NGNG>>327
0707デフォルトの名無しさん
NGNG今年になって発見したんだからしょうがないじゃんかよう
0708703
NGNGこっちが本命。
if(/*/*/0*/**/1) {
/* ネストがあるとき */
} else {
/* ネストが無いとき */
}
0709デフォルトの名無しさん
NGNGコンパイラ警告対策で、マクロ化したくなるなー。
#if /*/*/0*/**/1
#define HAVE_NESTED_COMMENT 1
#endif
#if HAVE_NESTED_COMMENT
/* ネストがあるとき */
#else
/* ネストが無いとき */
#endif
0710デフォルトの名無しさん
NGNG........=.......(........);
0711デフォルトの名無しさん
NGNGputs("ラデツキー");
return 0;
}
0712デフォルトの名無しさん
NGNG_PP_CLASS_NAME() { ... }
_PP_CLASS_NAME & operator=( _PP_CLASS_NAME const & rhs ){ ... }
... /* いろいろな共通関数とか */
-----------------------------------------
/* classes.h */
class myclass_1
{
#define _PP_CLASS_NAME myclass_1
#include "procedure.h"
#undef _PP_CLASS_NAME
...
};
class myclass_2
{
#define _PP_CLASS_NAME myclass_2
#include "procedure.h"
#undef _PP_CLASS_NAME
...
};
0713デフォルトの名無しさん
NGNGmix-in みたいなもんっすね。
0714デフォルトの名無しさん
NGNG0715デフォルトの名無しさん
NGNGinterface + mix-in の強力さを知れば
君も気が変わるだろう。
0716デフォルトの名無しさん
NGNGこれ面白いね。低級な記述で mix-in ベースの OO ができる。
デバイスドライバとか書くときに使えそう。
0717デフォルトの名無しさん
NGNGclassname() { ... } \
classname & operator=(classname const & rhs){ ... }\
.../* いろいろな共通関数とか */ \
/**/
class myclass
{
PROCEDURE(myclass)
...
};
これでも同じだよな?
0718デフォルトの名無しさん
NGNG0719デフォルトの名無しさん
NGNG0720デフォルトの名無しさん
NGNGマナー的には数段マシだけど、実用的には何十行も \ つけるの面倒なのと、
デバッグ時に欝になること必須なのがまずそう。。
0721デフォルトの名無しさん
NGNG必須⇒必至
0722デフォルトの名無しさん
NGNGエラー行が全部一緒になるぜ(w
0723デフォルトの名無しさん
NGNGなかなかおもしろいから、一度読んでおくといいかも。
0724デフォルトの名無しさん
NGNGあとmix-inって簡単に言うとどんなの?
0725デフォルトの名無しさん
NGNG実装を継承するんじゃなくて、埋め込む。
インターフェイス以外の多重継承を回避しつつ
実装を使いまわしたいときに有効。
0726デフォルトの名無しさん
NGNG突き詰めるならboost/preprocessorという手もあるよ。
あれだと数値とか変数扱えるし。
BOOST_PP_WHILEのようにループもあったし。ループというよりstlのfor_eachのように関数渡すような感じだが。
プリプロセッサのみなんでたぶんCからでも使える
0727デフォルトの名無しさん
NGNG説明ありがとう。そこそこ理解できたけど、まだちょっとわからないな・・・
templateでは出来なくてmix-inだと出来る場面ってどういうのだろう?
0728デフォルトの名無しさん
NGNGたとえば Microsoft の ATL なんかでは template を使って mix-in を実現している。
template なしの普通の多重継承でも mix-in は実現できなくもないけど、
あらかじめアレコレ virtual にしておかなきゃならない辺りが絶望的にドンくさい。
0729デフォルトの名無しさん
NGNGいろいろと教えてくれてありがとう
0730デフォルトの名無しさん
NGNG0731デフォルトの名無しさん
NGNGthx。早速
0732デフォルトの名無しさん
NGNG#include "B.h"
class A
{
void hogeA(){
pB->hoge();
};
void hoge(){};
protected:
B *pB;
}
//B.cpp
#include "A.h"
class B
{
void hogeB(){
pA->hoge();
}
void hoge(){};
A *pA;
}
見たいなのを上手いことコンパイルするにはどうしたらいいでしょうか?
*注*
コンストラクタ、デストラクタ、
pA,pBを設定する部分については省略しています
0733デフォルトの名無しさん
NGNGA::pBだけprotectedになっている意味は?
セミコロン不足してない?
> 見たいなのを
コードで語れないなら、せめて日本語でちゃんと書けよ。
0734デフォルトの名無しさん
NGNG0735732
NGNG//A.cpp
と
//B.cppの部分は両方とも .h の間違いです。
すいません
言いたかったのは
2つのクラスがあってお互いがお互いのポインタを持つ
という関係をどうやったら書けるかということです
乱筆ですいませんでした。
0736デフォルトの名無しさん
NGNGclass A { B *p; }
・・・何故このスレなんだ?
0737デフォルトの名無しさん
NGNGためしに書いてみたら
void classA::hogeA()
{
pB->hoge();
};
のところでエラーが出ますた。
0738デフォルトの名無しさん
NGNGclass A;
// B_fwd.h
class B;
// A.h
#include "A_fwd.h"
#include "B_fwd.h"
class A
{
void hogeA();
void hoge() {}
protected:
B *pb;
};
// B.h
#include "A_fwd.h"
#include "B_fwd.h"
class B
{
void hogeB();
void hoge() {}
A *pA;
};
// A.cpp
#include "A.h"
void A::hogeA() {pB->hoge();}
// B.cpp
#include "B.h"
void B::hogeB() {pA->hoge();}
0739デフォルトの名無しさん
NGNG// A.h
class B;
class A { public:
void hogeA();
void hoge() {}
protected:
B *pB;
};
// B.h
class A;
class B { public:
void hogeB();
void hoge() {}
protected:
A *pA;
};
// A.cpp
#include "A.h"
#include "B.h"
void A::hogeA() { pB->hogeB(); }
// B.cpp
#include "B.h"
#include "A.h"
void B::hogeB() { pA->hoge();}
0740デフォルトの名無しさん
NGNGAとBを別のヘッダで定義してるなら
それぞれinline-impl.hが必要かもね。
0741デフォルトの名無しさん
NGNGclass B;
class A {
public:
void hogeA();
void hoge() { }
protected:
B *pB;
};
#include "B.h"
inline void A::hogeA() { pB->hogeB(); }
// B.h
class A;
class B {
public:
void hogeB();
void hoge() { }
protected:
A *pA;
};
#include "A.h"
inline void B::hogeB() { pA->hogeB(); }
0742デフォルトの名無しさん
NGNGトリッキーな結果になるプログラム。
long main(long argc, char **argv) {
long i;
double x1,x2,x3,x;
x = atof(argv[1]);
if (x <= 0.0 || x >= 1.0) return 0;
x1 = x - 0.000001;
x2 = x;
x3 = x + 0.000001;
for (i=0; i<=100; i++) {
x1 = A * x1 *(1 - x1);
x2 = A * x2 *(1 - x2);
x3 = A * x3 *(1 - x3);
printf("%12.10f %12.10f %12.10f\n", x1, x2, x3);
}
return 0;
}
これ↑を0〜1の範囲の数値をパラメータにして実行してみて。
(ただし0.5、0.25、0.125等はつまらん結果になるので0.3とか0.6あたりで。)
で、Aの定義を3.2、3.5でも試してみて、次に3.8にしたときにどうなるか予想した上で
A=3.8で実行してみて。
カラクリ知らないとこの結果は結構ビックリすると思います。
0743742
NGNG>>742の最初の方に↓入れといて。
const double A = 2.8;
//const double A = 3.2;
//const double A = 3.5;
//const double A = 3.8;
0744デフォルトの名無しさん
NGNGニュートン法かオイラー法に相当するのかなあ。
0745デフォルトの名無しさん
NGNG0746デフォルトの名無しさん
NGNG初期値の違いで結果が大きく変わるって言うような。
0747デフォルトの名無しさん
NGNG0748デフォルトの名無しさん
NGNGカオスですな。兵站函数でよろしい?
0749デフォルトの名無しさん
NGNG[必要ページ数] = -Int(-( [全行数] / [ページ内行数] ))
0750デフォルトの名無しさん
NGNGVBのIntって常に負の無限大方向への丸め?
0751デフォルトの名無しさん
NGNGperl -pi.bak -e 's/aaa/bbb/g' *.cpp
他言語やシェルで同じこと1行でできるかな?
0752デフォルトの名無しさん
NGNG最近のFreeBSDやRedHat Linuxとかのsedなら
sed -i.bak -e 's/aaa/bbb/g' *.cpp
でOK
0753デフォルトの名無しさん
NGNGhttp://www.cppll.jp/upload/sid=40/bind.lzh
function fun( a, b, c ) { return a + b + c; }
bind( fun, _1, _2, 10 )( 1, 2 ) // = 13
bind( fun, _1, _1, _1 )( 100 ) // = 300
bind( fun, _4, _3, _5 )( 1, 2, 3, 4, 5 ) // = 12
0754デフォルトの名無しさん
NGNGためしてみたけど、組み込みオブジェクトのメソッドはだめだね。
ユーザ定義オブジェクトのメソッドはOKっぽい
function proxy_str( s )
{
this.replace = function( e, r ){ return s.replace( e, r ); }
}
bind( new proxy_str("test ok?").replace, /\?/, _1 )( "!" ); // = "test ok!"
0755デフォルトの名無しさん
NGNGスレ違い気味すまそ
0756デフォルトの名無しさん
NGNGこことか。
ttp://boost.cppll.jp/
0757デフォルトの名無しさん
NGNG0758デフォルトの名無しさん
NGNGメモリを割り当てて全部va_listの内容をコピーとか出来ればいいんだろうけど。
0759デフォルトの名無しさん
NGNGva_list は大抵、単なるポインタなんだけど…
0760デフォルトの名無しさん
NGNGあったあった。ATL学習する時、忌々しい思いをして読んでいた。
プリプロとテンプレートの集合体で場合分けの塊って感じだったな。
0761デフォルトの名無しさん
NGNGva_listの生成自体が定義されてないから無理。
そもそも本当にva_listである必要があるのか?
0762デフォルトの名無しさん
NGNGclass hoge_impl
{
friend Derived;
hoge_impl() { ... }
hoge_impl( int val ) { ... }
int do_1() { ... }
int do_2() { ... }
};
class hoge : public hoge_impl< hoge >
{
hoge() : hoge_impl(){}
hoge( int val ) : hoge_impl( val ){}
int do() { return hoge_impl::do_1(); }
};
まぁ、一種の mixin と言えない事も無い
0763デフォルトの名無しさん
NGNG下の class hoge は、struct hoge に変換して。
0764デフォルトの名無しさん
NGNG0765デフォルトの名無しさん
NGNGunsigned int bitreverse(unsigned int n) {
n = ((n & 0x55555555) << 1) | ((n >> 1) & 0x55555555) ;
n = ((n & 0x33333333) << 2) | ((n >> 2) & 0x33333333) ;
n = ((n & 0x0F0F0F0F) << 4) | ((n >> 4) & 0x0F0F0F0F) ;
n = ((n & 0x00FF00FF) << 8) | ((n >> 8) & 0x00FF00FF) ;
return (n << 16) | (n >> 16) ;
}
0766デフォルトの名無しさん
NGNGtemplate< typename L, typename R >
struct 2uni_to_bin
{
2uni_to_bin( L l, R r ) : l_(l), r_(r) {}
template< typename A1, typename A2 >
void operator()( A1 a1, A2 a2 )
{
l_( a1 );
r_( a2 );
}
L l_; R r_;
};
0767デフォルトの名無しさん
NGNGどこらへんがトリッキー?
0768デフォルトの名無しさん
NGNG0769デフォルトの名無しさん
NGNG関数型プログラミングは気持ちいいぞ
0770デフォルトの名無しさん
NGNGテストコード1
/*/
テストコード2
//*/
このままだとテストコード2がコメントアウトされ、
最初のコメント行を /* に変えるとテストコード1がコメントアウト。
#ifdefを使うべきだけど、エディタで色変わんないからテスト中紛らわしい。
0771デフォルトの名無しさん
NGNG0772デフォルトの名無しさん
NGNG0773デフォルトの名無しさん
NGNGint x = 1;
x = *(char*)&x; // 0:ビッグエンディアン/1:リトルエンディアン
0774デフォルトの名無しさん
NGNG0775デフォルトの名無しさん
NGNG0776デフォルトの名無しさん
NGNG0777デフォルトの名無しさん
NGNG0778デフォルトの名無しさん
NGNGx = y = z
if x then
て書いたら嫌われた
トリッキーじゃないのに
0779デフォルトの名無しさん
NGNGCやってる人から見ると嫌だなw
0780デフォルトの名無しさん
NGNGせめてカッコ付けてくれ(w
0781デフォルトの名無しさん
NGNGその方が危ないような気が。
0782デフォルトの名無しさん
NGNGC++メインでやってるけど別に普通だと思うんだが、どのへんが嫌?
>781
禿同。
結合規則くらいは覚えておけ、と。
0783780
NGNGif( y == z ){
x = TRUE
}else{
x = FALSE
}
if( x ){ …
なコードなんだけど、C/C++だと
y = z;
x = y;
なコードっぽくて気持ち悪いでしょ?
演算子の優先順位があっても括弧を付けるのがスマートなコードだと思ってるんだけど。
0784デフォルトの名無しさん
NGNG>演算子の優先順位があっても括弧を付けるのがスマートなコード
x = ( y = z );
0785デフォルトの名無しさん
NGNG0786780
NGNG頭丸めて修行の旅にでてくる
0787デフォルトの名無しさん
NGNG意気揚々と揚げ足取り
0788デフォルトの名無しさん
NGNGa,bの入れ替え。こんなのどうでしょう。
0789デフォルトの名無しさん
NGNG0790デフォルトの名無しさん
NGNG0791790
NGNG0792デフォルトの名無しさん
NGNGa,bの入れ替え。こんなのどうでしょう。
0793デフォルトの名無しさん
NGNG前スレの>>1-5を参照。
http://pc3.2ch.net/tech/kako/983/983191866.html
0794デフォルトの名無しさん
NGNG0795デフォルトの名無しさん
NGNGなんて使い方しなければ、整数相手なら問題ないけどな
遅いけど
0796デフォルトの名無しさん
NGNG0797デフォルトの名無しさん
NGNG速くはないけど決して遅いという訳では。
俺は楽に書けるという理由でよく使う。
0798デフォルトの名無しさん
NGNG読んでみたけど、「変数はスタックに置かれる」という前提が
スッポリと抜けて議論されてるのに少し違和感を覚えた。
mov eax, [esp+n]
mov ebx, [esp+m]
mov [esp+m], eax
mov [esp+n], ebx
こうかな?
0799デフォルトの名無しさん
NGNG0800キリ番ゲッター ◆Q5W244LhJU
NGNG0801デフォルトの名無しさん
NGNG0802デフォルトの名無しさん
NGNGhttp://tinyurl.com/7yej9
0803デフォルトの名無しさん
NGNG0804デフォルトの名無しさん
NGNGchar ary[10];
5[ary]=100; /* 普通の書き方 ary[5]=100; */
printf("%d\n", 5[ary]);
0805デフォルトの名無しさん
NGNG0806デフォルトの名無しさん
NGNG0807デフォルトの名無しさん
NGNGそれは
for (int i=0; i<10; i++)
printf("%c", i["abcdefghij"]);
みたいな有名なコードがあるじゃないか
0808デフォルトの名無しさん
NGNG文字列を入力すると、その文字列が回文(右から読んでも左から読んでも一緒)
であるかどうかを判別するプログラムのコードだれかわかりませんか?
0809デフォルトの名無しさん
NGNGスレ違い
0810デフォルトの名無しさん
NGNGputs s == s.reverse
0811デフォルトの名無しさん
NGNGstd::list<CClass>::iterator it=obj.begin();
CClass *pClass = &(*it);
0812デフォルトの名無しさん
NGNG0813デフォルトの名無しさん
NGNG変数をスタックに確保することを前提としていることに違和感を覚えた。
インラインアセンブラとかの話かな?
それにしたってルーチンの入り口と出口以外では可能な限りレジスタを使いまわすものだよ。
0814デフォルトの名無しさん
NGNGVC はこう http://www.microsoft.com/japan/developer/library/vccore/_core_optimizing_inline_assembly.htm
gcc はインラインアセンブラの部分も含めて最適化されるみたいだから、>>798 みたいな書き方はせずに
変数を参照しておいてあげた方がコンパイラに優しいと思う。
0815デフォルトの名無しさん
NGNG前スレ読んでから出直して来い。
0816デフォルトの名無しさん
NGNG0817デフォルトの名無しさん
05/02/07 04:28:18あけおめ。
0818デフォルトの名無しさん
05/02/16 13:15:140819デフォルトの名無しさん
05/02/16 21:51:570820デフォルトの名無しさん
05/02/17 00:37:520821デフォルトの名無しさん
05/02/27 23:15:180822デフォルトの名無しさん
05/03/14 04:08:070823デフォルトの名無しさん
2005/04/03(日) 21:47:03#include<stdlib>
class New
{
void *p;size_t sizel,size;
public:
template<class type> New(type value)
{
p = malloc(sizeof(type));
(*(type*)p) = value;
size = sizeof(type);
}
template<class type> operator type*()
{
type *damy = (type*)malloc(sizel),*copy = damy;
do*damy++ = *(type*)p;while(0 < (sizel -= size));
free(p);
return copy;
}
New &operator [](unsigned size)
{
sizel = New::size * size;
return *this;
}
};
class demo{int value;public:demo(Value):value(Value){}int out(){return value;}};
int main()
{
demo *ary = New(demo(20))[8];
delete ary;
}
0824デフォルトの名無しさん
2005/04/03(日) 22:07:110825823
2005/04/03(日) 22:17:29いやべつに
それと、#define new New
としとくとなおエレガント
0826デフォルトの名無しさん
2005/04/03(日) 22:44:04mallocしたものをdeleteしていいのかとか、
char *ary = New(demo(20))[8]; が普通にできてしまうがいいのかとか、
damyってのはどうなのかとか、いろいろあるのだが、
そもそもVC++でもg++でもコンパイルが通らないのだが。
0827デフォルトの名無しさん
2005/04/03(日) 22:45:08わかって書いてんのかな…。
>#define new New
そりは最悪なんでやめてくだしあ。
0828デフォルトの名無しさん
2005/04/03(日) 22:49:10お前C++をちゃんと勉強すれ
>(*(type*)p) = value;
クラッシュする
>do*damy++ = *(type*)p;while(0 < (sizel -= size));
同様にここも
>いやべつに
全然「べつに」じゃねーよ。deleteしたらマズイ
>それと、#define new New
>としとくとなおエレガント
どこがや。
new int;
ってコードもかけなくなるウンコ手法じゃねーか
0829デフォルトの名無しさん
2005/04/03(日) 22:49:45newの中でmalloc使われてるんだけどねぇ。
(callocだっけまぁいいや…。)
0830823
2005/04/03(日) 22:50:40BCCなら通ったよ。
0831デフォルトの名無しさん
2005/04/03(日) 22:56:06どこがや。
new int;
ってコードもかけなくなるウンコ手法じゃねーか。
ネタのつもりだったが…。
0832デフォルトの名無しさん
2005/04/03(日) 23:07:21>823のコードがあまりにアレなんで本気にしちゃったよ。
ごめんね。
0833デフォルトの名無しさん
2005/04/03(日) 23:19:15>クラッシュする
この場合、テンプレート展開?後の状態にすると
p = malloc(sizel);//4バイトメモリーを確保
(*(demo*)p) = value;//
demo型にdemo型を代入しているしだけなんだがなぜ?
(まともにコピーコンストラクタを設定してなかったらするかもしれないが…。)
>>そもそもVC++でもg++でもコンパイルが通らないのだが。
VC++持ってないんだけど、どんなエラー出るのかキボンヌ。
(もしかすると、行が多すぎたんで添削したせいかも。)
0834デフォルトの名無しさん
2005/04/03(日) 23:20:39いつの間にそういう規格になったの?
そのような実装もあるという話ではないのか?
0835デフォルトの名無しさん
2005/04/03(日) 23:24:02デバッガ起動してアセンブリで見てみ。
0836デフォルトの名無しさん
2005/04/03(日) 23:26:12> (まともにコピーコンストラクタを設定してなかったらするかもしれないが…。)
逆。まともなコピーコンストラクタがあればクラッシュする
可能性が高い。
> VC++持ってないんだけど、どんなエラー出るのかキボンヌ。
New::operator [] が曖昧。
0837デフォルトの名無しさん
2005/04/03(日) 23:26:34スマン見落とした。
0838デフォルトの名無しさん
2005/04/03(日) 23:30:18エラー報告tenx。
やっぱり処理系によるんだろうねぇ。
0839デフォルトの名無しさん
2005/04/03(日) 23:36:50>>836
コピーコンストラクタは>823のコードでは一切呼ばれない
>(*(type*)p) = value;
これだとコンストラクタも何も呼ばれてない状態なのにいきなり代入演算子が呼ばれる。
指定したメモリ上でオブジェクトをコンストラクトするには、次のように配置newを使う
p=malloc(sizel)
new(p) demo(value);
それとdeleteは最初のオブジェクト以外のデストラクタが呼ばれない欠陥もある。
0840デフォルトの名無しさん
2005/04/03(日) 23:47:08#include<vector>
class demo{int value;public:demo(Value):value(Value){}int out(){return value;}};
int main()
{
std::vector<demo> array(8,demo(20));
}
0841デフォルトの名無しさん
2005/04/03(日) 23:58:10>コピーコンストラクタは>823のコードでは一切呼ばれない
ホンとだ、何でだろ?
0842デフォルトの名無しさん
2005/04/04(月) 06:08:08damy,tenxからして全てネタ?
0843デフォルトの名無しさん
2005/04/04(月) 16:43:57>tenxからして全てネタ?
Thankからthanxと打ったつもりだったんだけど、疲れかな…。
それから、damyはdummyのことじゃないよ。個人的なfoo見たいなもん。
0844デフォルトの名無しさん
2005/04/04(月) 20:46:51というか「コンストラクタ」の意味を考えれ。
>>823は「C++」を勉強しなおす必要があるとわかっただけでももうけものじゃないかな。
0845デフォルトの名無しさん
2005/04/14(木) 21:11:010846デフォルトの名無しさん
2005/04/17(日) 08:40:21すげー遅レス&すれ違いだが、凄く感心したので使ってみた。
で、ググってみた。
VS.NETで確認したんだけど
// TODO ほにゃらら
ってコメント書けば、普通に「タスク一覧」に表示されるのな orz
便利になったもんだ
0847デフォルトの名無しさん
2005/04/21(木) 05:06:12ってあったな確か。
0848デフォルトの名無しさん
2005/04/29(金) 00:18:51int is_sip_message( const char* buf ) {
return *(uint64_t*)buf == *(uint64_t*)"SIP/2.0 ";
}
これってアリ?普通?常套手段?
0849デフォルトの名無しさん
2005/04/29(金) 07:19:280850デフォルトの名無しさん
2005/04/29(金) 08:46:17最適化の類いじゃないのか?
0851デフォルトの名無しさん
2005/04/29(金) 13:45:210852デフォルトの名無しさん
2005/04/29(金) 15:15:51>>848
普通。
0853デフォルトの名無しさん
2005/04/29(金) 16:51:410854デフォルトの名無しさん
2005/04/29(金) 16:57:440855デフォルトの名無しさん
2005/04/29(金) 18:04:020856デフォルトの名無しさん
2005/04/30(土) 13:51:26じゃあ、おれも個人的なtinpoとかmankouとか使いたい
月曜の朝一、コード規約にかいとけよ
0857デフォルトの名無しさん
2005/04/30(土) 13:52:22残念
0858デフォルトの名無しさん
2005/04/30(土) 14:28:07来いよ
0859デフォルトの名無しさん
2005/04/30(土) 20:06:10typedef int HARDGAY ;
0860デフォルトの名無しさん
2005/04/30(土) 22:40:28イギナワクゥン〜ベルホ〜オ〜♪
0861デフォルトの名無しさん
2005/04/30(土) 22:51:14や
0862デフォルトの名無しさん
2005/05/01(日) 10:06:06{
int a=10,b=7;
printf("割ってかける演算子、かけて割る演算子\n");
// 3で割ってから3でかける演算子
a/*=3;
// 5でかけてから5で割る演算子
b*/=9;
printf("a=%d b=%d\n",a,b);
getchar();
return 0;
}
0863デフォルトの名無しさん
2005/05/01(日) 11:43:53コメント
トリッキーっていうか、
コメントで嘘ついてるだけじゃねーか
0864デフォルトの名無しさん
2005/05/01(日) 13:10:550865デフォルトの名無しさん
2005/05/01(日) 13:15:450866デフォルトの名無しさん
2005/05/01(日) 13:23:25いや、俺のときは丸2日悩んだよ
気付いたときはプログラマ辞めようかと思った
0867
2005/05/01(日) 13:25:180868デフォルトの名無しさん
2005/05/01(日) 13:29:10Windowsでやってるのかな?ということぐらいしかおもいつかんかった
0869デフォルトの名無しさん
2005/05/18(水) 17:30:480870デフォルトの名無しさん
2005/06/04(土) 13:25:37今更だけど。面白い。
コメント色分けするエディタに貼るまで気付けなかった……。
>>863を見てすら意味が分からんかった俺って一体。orz
0871デフォルトの名無しさん
2005/06/04(土) 16:34:50BEQ ?0001
JSR func
INC R6
RTS
?0001: SUB R6,R6
RTS
これは何をする関数でしょう?
0872デフォルトの名無しさん
2005/06/04(土) 16:38:00func: MOV @R6+,R5L
BNE func
?0001: SUB R6,R6
RTS
これでいいかな?
0873デフォルトの名無しさん
2005/06/09(木) 06:06:560874デフォルトの名無しさん
2005/06/13(月) 06:45:15R6で与えられた位置から最初にゼロが見つかるまでの個数を
スタックがその深さあるならR6で返すみたいね。
素直に、
func:
PUSH R6
?0001:
MOV @R6+,R5L
BNE ?0001
POP R5
SUB R5,R6
RTS
みたいに書いた方が短いし、実行速度も早いし、
0875デフォルトの名無しさん
2005/06/13(月) 06:55:17strlen()関数をこともあろうに再帰で実現するというアホらしい手法に呆れたので覚えてた。
0876デフォルトの名無しさん
2005/07/12(火) 10:38:400877デフォルトの名無しさん
2005/07/13(水) 05:15:390878デフォルトの名無しさん
2005/11/21(月) 15:36:080879デフォルトの名無しさん
2006/01/05(木) 19:18:090880デフォルトの名無しさん
2006/01/05(木) 22:16:25public static void main(String[] args) {
if (0 == args.length) {
// 処理
}
}
}
0881デフォルトの名無しさん
2006/01/13(金) 08:08:27if( ( 'A`)<mandokuse ){...}
とかしようとしたら普通にゴルァされた('A')
0882デフォルトの名無しさん
2006/01/22(日) 15:19:150883デフォルトの名無しさん
2006/01/22(日) 15:21:500884デフォルトの名無しさん
2006/01/22(日) 16:30:38main(){char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";printf(a,34,a,34);}
0885デフォルトの名無しさん
2006/01/22(日) 23:37:410886デフォルトの名無しさん
2006/01/23(月) 00:05:31世の中全てがASCIIとは限らないんだなー。
0887デフォルトの名無しさん
2006/01/28(土) 00:18:45なんか気持ち悪い
0888デフォルトの名無しさん
2006/02/08(水) 13:36:460889デフォルトの名無しさん
2006/02/26(日) 00:11:07サインテーブルジェネレータだって
int cos_table[1024] = {1<<24,16776900};
void build_table() {
__int64 a;
int b;
a = b = cos_table[1];
for( int i=2;i<1024;i++ )
cos_table[i] = b = ((a*b)>>23) - cos_table[i-2];
}
0890デフォルトの名無しさん
2006/02/26(日) 20:45:03コサインにしか見えない件について
0891デフォルトの名無しさん
2006/02/27(月) 03:41:05きっとそこがトリッキーなんだよ!!
な、なんだtt
0892デフォルトの名無しさん
2006/02/27(月) 22:28:51int a[100];
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
...
}
0893デフォルトの名無しさん
2006/02/27(月) 23:31:140894デフォルトの名無しさん
2006/02/28(火) 01:24:50// 整数→文字列変換
const char* convert( int id )
{
const char* p = "";
switch( id ){
case HOGE: p="hoge"; break;
case MOGE: p="moge"; break;
:
}
return p;
}
0895デフォルトの名無しさん
2006/02/28(火) 01:31:34俺ならこう書くけど。
enum{HOGE,MOGE,HOGE_MAX};
const char* convert( unsigned id ){
static const char*id_txt[HOGE_MAX]={"hoge","moge"};
return id < HOGE_MAX ? id_txt[id] : "";
}
0896デフォルトの名無しさん
2006/02/28(火) 09:02:46頭悪いコードだなwwwwww
0897デフォルトの名無しさん
2006/02/28(火) 09:14:01別ファイルから読むかヘッダで定義したい。すげー気持ち悪い。
0898デフォルトの名無しさん
2006/02/28(火) 12:07:56>sizeof(a)/sizeof(a[0])
C標準でマクロ定義されていないのが不思議なほど
スタンダード。
>>894
文字列ベタ書きでいいなら
何の問題もない。
0899デフォルトの名無しさん
2006/02/28(火) 12:52:13そんなわけのわからんマジックコードとの変換がソース中に散らばってたら
三日前の自分に対してでも殺意を抱く
0900デフォルトの名無しさん
2006/02/28(火) 13:00:04C/C++ で enum から文字列への変換はどう書いてるの?
毎回 def ファイルみたいなの用意すんの?
0901デフォルトの名無しさん
2006/02/28(火) 14:04:020902デフォルトの名無しさん
2006/02/28(火) 15:06:00elements.txt
HOGE, HAGE, HIGE
hoge.h
enum{
#include "elements.txt"
}
hoge.c
const char *hoge[] = {
#include "elements.txt"
}
0903デフォルトの名無しさん
2006/02/28(火) 15:31:41それって実行するたびにメモリが1byteずつ漏れない?
0904デフォルトの名無しさん
2006/02/28(火) 15:36:11リークはないが、処理系によってはひどいことになる。
0905デフォルトの名無しさん
2006/02/28(火) 16:12:37はぁ?なんでそう思ったんだ?
>>904
どんなひどいことか、具体的に言ってみ。どうせ言えない知ったか乙
0906デフォルトの名無しさん
2006/02/28(火) 16:13:59…コンパイルできないその糞コードをどうしろと?
0907デフォルトの名無しさん
2006/02/28(火) 16:38:57スレ趣旨からすると
elements.txt
VAL(HOGE), VAL(HAGE), VAL(HIGE)
hoge.h
#define VAL(v) v
enum {
#include "elements.txt"
};
#undef VAL
hoge.c
#define VAL(v) #v
const char* hoge[] = {
#include "elements.txt"
};
#undef VAL
>>903
もう帰ってくれ。
0908デフォルトの名無しさん
2006/02/28(火) 16:42:13まだまだだな。
return id < HOGE_MAX? "hoge\0moge"[id*5]: "";
0909デフォルトの名無しさん
2006/02/28(火) 17:11:310910デフォルトの名無しさん
2006/02/28(火) 18:22:22return id < HOGE_MAX? "hogehoge\0moge\0\0\0\0"[id*9]: "";
0911デフォルトの名無しさん
2006/02/28(火) 18:50:220912910
2006/02/28(火) 19:35:250913911
2006/02/28(火) 19:45:140914デフォルトの名無しさん
2006/03/01(水) 02:15:41idはintだから、負値が放り込まれたら…
あと
・idが連番じゃないケース
・idに負値があるケース
・idを追加削除する時の手間
も考えませう。
0915910
2006/03/01(水) 02:33:57>idはintだから、負値が放り込まれたら…
idはunsingedにしてあるだろアホ!
>あと
>・idが連番じゃないケース
>・idに負値があるケース
>・idを追加削除する時の手間
>も考えませう。
何小学校の先生ヅラしてんだお前?
どっちかっつーと、生徒はお前の方だ。お前が考えろボケ!
どうせお前の脳味噌じゃ思いつかないだろうがな。
0916デフォルトの名無しさん
2006/03/01(水) 02:37:16生徒に話しかける時はもっと優しく語りかけてやれよw
0917デフォルトの名無しさん
2006/03/01(水) 09:41:52それを何に使ってるか、全体が何をしたいのか、によるから一概には言えない。
例えば負数が与えられる可能性について考慮してないコードであっても
絶対に負数が与えられないならば
それは最適化された良いプログラムと言えるし
逆に、ループ最深部で鬼のように呼ばれるのに
負数チェックをしているようであればそのコーダを無能と言わざるを得ない。
最適化を考えるなら関数コールなんてアホの極みという意見もあるし
他の非ループ場所からも呼ばれる上にインライン展開されるから問題ないので
可読性や保守性との兼ね合いでそうしてるという可能性もある
結論として、一概には言えない。
0919デフォルトの名無しさん
2006/03/01(水) 20:31:310920デフォルトの名無しさん
2006/03/01(水) 20:34:090921914
2006/03/01(水) 23:20:22>idはunsingedにしてあるだろアホ!
寝ぼけてた。orz
あと諭すような書き方したのは、>894の冗長さの意味も考えては?
っつーのをやんわり指摘したかっただけなんだ。
>914に挙げた点を考慮すれば、それなりに妥当なコードだと
思うんだが。
0922デフォルトの名無しさん
2006/03/04(土) 17:50:21unsigned にしたとこで解決はしないけど。
まあ言ったらきりないし。
0923デフォルトの名無しさん
2006/03/04(土) 20:39:15負数なんぞ適当に算術演算して正数の範囲に収まるように変形すれば良いだけ
負数が含まれているのなら
id+HOGE_MIN <= HOGE_MAX-HOGE_MIN ? id_txt[id+HOGE_MIN] : "";
にすれば良いだろ(idは当然unsigned型)。
0924デフォルトの名無しさん
2006/03/05(日) 22:55:12char *p = "";
if(( -NUMOF(id_txt1)<id )&&( id<NUMOF(id_txt2) ))
p = id<0 ? id_txt1[-id]: id_txt2[id];
idの型をenumにすれば、if文をassertで置き換えても
良いんじゃないだろうか。
0925デフォルトの名無しさん
2006/03/05(日) 23:20:530926デフォルトの名無しさん
2006/03/06(月) 00:45:04何の何処がどうウンコなのかきちんと説明してくれないと
どう反応すりゃいいのか分かりません。
#スレのお題がお題だけに、全部糞といえば糞だしねぇ。
0927デフォルトの名無しさん
2006/03/28(火) 22:37:21出てこない件について。
数が多ければ907だろうけど。
というか894は文字列定数を返したから変な顔をされたという、
低レベルな話ではないだろうか。
0928デフォルトの名無しさん
2006/03/29(水) 12:10:43>出てこない件について。
スレタイ100回音読の刑
0929デフォルトの名無しさん
2006/04/03(月) 22:33:45を引数にとってその最大値を返すマクロ書いて。
0930デフォルトの名無しさん
2006/04/03(月) 22:41:26これじゃあトリッキーでも何でもないよな
0931デフォルトの名無しさん
2006/04/03(月) 23:24:55それではダメなんか?
0932デフォルトの名無しさん
2006/04/03(月) 23:31:18こんなんできましたけどー。
0933デフォルトの名無しさん
2006/04/03(月) 23:33:570934デフォルトの名無しさん
2006/04/03(月) 23:36:56ウンコ
0935デフォルトの名無しさん
2006/04/03(月) 23:39:53嫌ならちゃんとlimits.hかなんかを使いなさい。
0936デフォルトの名無しさん
2006/04/03(月) 23:41:510937デフォルトの名無しさん
2006/04/03(月) 23:43:070938デフォルトの名無しさん
2006/04/03(月) 23:44:590939デフォルトの名無しさん
2006/04/04(火) 00:01:06が
ULONG_MAX
に展開されるようなマクロを頑張って書いた俺は莫迦だったのか…
0940デフォルトの名無しさん
2006/04/04(火) 00:12:260941デフォルトの名無しさん
2006/04/04(火) 00:28:390942デフォルトの名無しさん
2006/04/04(火) 08:28:350943デフォルトの名無しさん
2006/04/04(火) 19:42:00せっかくだから晒して。
0944936
2006/04/04(火) 19:52:59でもいいね。まあ即値ならなんでもいいと思うけど。
0945デフォルトの名無しさん
2006/04/04(火) 21:15:26一レスに収まらないので分割で。
# define CAT_I(x, y) x ## y
# define CAT(x, y) CAT_I(x, y)
# define IF(c) CAT_I(IF_, c)
# define IF_true(t, _) t
# define IF_false(_, f) f
# define PREFIX_IF(c, p, b) IF(c)(CAT_I(p, b), b)
# define SEP(f, a) f a
/* トークン取得 */
# define TOK(ts) (CAT_I(TOK_, ts))
# define TOK_signed signed, false,
# define TOK_unsigned unsigned, false,
# define TOK_char char, false,
# define TOK_short short, false,
# define TOK_int int, false,
# define TOK_long long, false,
# define TOK_END !, true, !
# define IS_NIL(head, null, rest) null
# define HEAD(head, null, rest) head
# define TAIL(head, null, rest) TOK(rest)
# define FOLDR_0(list, f, z) IF(IS_NIL list)(z, f(HEAD list, FOLDR_1(TAIL list, f, z)))
# define FOLDR_1(list, f, z) IF(IS_NIL list)(z, f(HEAD list, FOLDR_2(TAIL list, f, z)))
# define FOLDR_2(list, f, z) IF(IS_NIL list)(z, f(HEAD list, FOLDR_3(TAIL list, f, z)))
# define FOLDR_3(list, f, z) IF(IS_NIL list)(z, f(HEAD list, z))
0946続き
2006/04/04(火) 21:16:34# define TYPE_INFO(ts) FOLDR_0(TOK(ts END), ADD, (false, false, false, false, false, int))
# define ADD(type, attr) CAT_I(ADD_, type) attr
# define ADD_signed(sig, un, l, ll, s, b) (true, un, l, ll, s, b)
# define ADD_unsigned(sig, un, l, ll, s, b) (sig, true, l, ll, s, b)
# define ADD_char(sig, un, l, ll, s, b) (sig, un, l, ll, s, char)
# define ADD_short(sig, un, l, ll, s, b) (sig, un, l, ll, true, b)
# define ADD_long(sig, un, l, ll, s, b) IF(l)((sig, un, l, true, s, b), (sig, un, true, ll, s, b))
# define ADD_int(sig, un, l, ll, s, b) (sig, un, l, ll, s, b)
/* シンボル生成 */
# define TYPE_SYM(sig, un, l, ll, s, b) TYPE_SYM_ ## b(sig, un, l, ll, s)
# define TYPE_SYM_int(sig, un, l, ll, s) PREFIX_IF(un, U, IF(ll)(LLONG, IF(l)(LONG, IF(s)(SHRT, INT))))
# define TYPE_SYM_char(sig, un, l, ll, s) IF(sig)(SCHAR, IF(un)(UCHAR, CHAR))
# define TYPE_MAX(ts) CAT(SEP(TYPE_SYM, TYPE_INFO(ts)), _MAX)
TYPE_MAX(signed char) /* SCHAR_MAX */
TYPE_MAX(long long int) /* LLONG_MAX */
TYPE_MAX(signed) /* INT_MAX */
0947デフォルトの名無しさん
2006/04/04(火) 21:20:010948デフォルトの名無しさん
2006/04/04(火) 21:39:29BOOST::PREPROCESSORを思い出した…
0949デフォルトの名無しさん
2006/04/04(火) 22:25:42実に興味深い。
0950デフォルトの名無しさん
2006/04/04(火) 23:47:38・cppのマクロ展開の詳細
http://lists.boost.org/Archives/boost/2006/02/100820.php
の添付部分("Regards"を検索すると見付かる)に解説がある。
・cppメタプログラミングのテクニック
Boost.PP, order-ppのドキュメントとか、ソースとか。完結したコードとしては、
http://lists.boost.org/Archives/boost/att-46646/lambda.cpp
のλ計算器もある。
0951デフォルトの名無しさん
2006/04/05(水) 01:05:440952デフォルトの名無しさん
2006/04/05(水) 21:22:58そのコードはVC6だとコンパイル不可?
こんな↓WARNING&エラーが出てしまいました。
warning C4003: マクロ 'IS_NIL' に指定された実引数の数が少なすぎます。
warning C4003: マクロ 'CAT_I' に指定された実引数の数が少なすぎます。
warning C4003: マクロ 'HEAD' に指定された実引数の数が少なすぎます。
・・・ (略) ・・・
error C2065: 'TYPE_SYM' : 定義されていない識別子です。
error C2146: 構文エラー : ';' が、識別子 'IF_' の前に必要です。
error C2065: 'IF_' : 定義されていない識別子です。
error C2062: 型 'int' は不要です。
0953デフォルトの名無しさん
2006/04/05(水) 22:11:43ごめん。書き忘れてた。
>>945はgccとBoost.waveで通ることを確認した。
試してないけど、DigitalMarsの最近のバージョンでも通るかも知れない。
それ以外のプリプロセッサだとたぶん通らない。
0954デフォルトの名無しさん
2006/04/05(水) 22:18:370955デフォルトの名無しさん
2006/04/05(水) 22:53:590956デフォルトの名無しさん
2006/04/05(水) 23:23:450957デフォルトの名無しさん
2006/04/05(水) 23:38:46マクロ展開できる深さに制限があるとかならともかく、そもそも展開方法が違うとは。
プリプロセッサなんてC言語のときから変わってないものと思ってた。
0958デフォルトの名無しさん
2006/04/06(木) 07:26:090959デフォルトの名無しさん
2006/04/07(金) 23:49:22#define TYPE_MAX(type) (\
strcmp(#type,"char")==0?CHAR_MAX:\
strcmp(#type,"short")==0?SHRT_MAX:\
strcmp(#type,"int")==0?INT_MAX:\
strcmp(#type,"long long")==0?LONG_LONG_MAX:\
strcmp(#type,"unsigned char")==0?UCHAR_MAX:\
strcmp(#type,"unsigned short")==0?USHRT_MAX:\
strcmp(#type,"unsigned int")==0?UINT_MAX:\
strcmp(#type,"unsigned long long")==0?ULONG_LONG_MAX:0)
0960デフォルトの名無しさん
2006/04/08(土) 01:27:160961デフォルトの名無しさん
2006/04/08(土) 02:44:170962デフォルトの名無しさん
2006/04/08(土) 05:14:44例えば a = strlen("ABC") を a = 3 にしてしまうとか。
0963デフォルトの名無しさん
2006/04/08(土) 05:49:290964デフォルトの名無しさん
2006/04/08(土) 12:46:37はぁ?だから何?
0965デフォルトの名無しさん
2006/04/09(日) 00:46:200966デフォルトの名無しさん
2006/04/09(日) 02:27:260967デフォルトの名無しさん
2006/04/09(日) 02:29:190968デフォルトの名無しさん
2006/04/09(日) 12:49:53で、それが何?
0969デフォルトの名無しさん
2006/04/09(日) 12:56:090970デフォルトの名無しさん
2006/04/09(日) 13:14:480971デフォルトの名無しさん
2006/04/09(日) 14:47:03きみは>>962の前半を読んでいるのか?
0972デフォルトの名無しさん
2006/04/10(月) 11:48:200973デフォルトの名無しさん
2006/04/11(火) 20:45:14>gccは翻訳時に
プリプロセスの時点ではまだ即値になってないんだろ。
0974デフォルトの名無しさん
2006/04/12(水) 00:58:45コンパイラがstrcmpの仕様を知っていれば最適化できる、ということかな。
関数を実際に実行するというのは無理だもんね。
0975デフォルトの名無しさん
2006/04/12(水) 04:16:000976デフォルトの名無しさん
2006/04/12(水) 09:35:10で、それが何?
0977デフォルトの名無しさん
2006/04/12(水) 11:37:05事前にコンパイルされている関数なら実際に実行するのは無理ではないだろうね
static/グロバーバルな変数を使わずハードも叩かない関数については
純粋関数としてマークしておいて、
コンパイル時に呼び出して即値入力をさせて結果を出すとかさ
OCXとかDelphiなんかはコンパイル時ではなく設計時にコンパイル済のモジュールを実際に動かしてるよね
0978デフォルトの名無しさん
2006/04/12(水) 18:17:57gccのドキュメントは読んだのか?
ぐぐったらstrcmpの最適化については書いてあったぞ。
0979デフォルトの名無しさん
2006/04/12(水) 18:19:350980デフォルトの名無しさん
2006/04/12(水) 19:27:32話が噛み合ってない理由がわかった希ガス
0981デフォルトの名無しさん
2006/04/12(水) 19:35:23純粋な関数なら入力に対して出力は必ず一意に定まるのだから
純粋な関数に定数の入力があれば、コンパイル時にその関数を実行させて
結果を定数化する事は可能だろうという事。
純粋な関数≒状態を保持しない で
状態を保持しないかどうかはコンパイル時に判るのだから
0982デフォルトの名無しさん
2006/04/12(水) 21:59:080983デフォルトの名無しさん
2006/04/12(水) 23:20:310984デフォルトの名無しさん
2006/04/13(木) 05:32:43外部にあるライブラリ関数だから純粋関数の判定はそう簡単ではない
やるとすればいくつかの関数を決め打ちにするしかなさそうだ
0985デフォルトの名無しさん
2006/04/13(木) 19:32:180986デフォルトの名無しさん
2006/04/13(木) 19:44:420987デフォルトの名無しさん
2006/04/13(木) 23:55:31gcc固有の動作ならそういうスレがあんだろが。
0988デフォルトの名無しさん
2006/04/17(月) 21:33:340989デフォルトの名無しさん
2006/04/21(金) 05:18:260990デフォルトの名無しさん
2006/04/22(土) 12:05:380991デフォルトの名無しさん
2006/04/22(土) 22:32:270992デフォルトの名無しさん
2006/04/24(月) 09:58:050993デフォルトの名無しさん
2006/04/24(月) 18:35:520994デフォルトの名無しさん
2006/04/24(月) 22:18:050995デフォルトの名無しさん
2006/04/24(月) 22:59:170996デフォルトの名無しさん
2006/04/24(月) 23:20:140997デフォルトの名無しさん
2006/04/25(火) 00:20:200998デフォルトの名無しさん
2006/04/25(火) 21:35:510999デフォルトの名無しさん
2006/04/25(火) 22:04:461000デフォルトの名無しさん
2006/04/25(火) 22:16:14http://pc8.2ch.net/test/read.cgi/tech/1038215563/l50
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。