したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

管理人の独り言(プログラミング関連)

1みみず★:2008/08/10(日) 23:28:15
あまりにもプログラミングの内容が増えすぎた。
よって隔離スレの中を更に隔離。

2439774さん:2010/07/20(火) 23:55:48
是非ともstd::vector<>,std::list<>系のSTLの.push_back()やらの要素追加系の関数は、右辺値参照(だったか?)をとるようにして欲しい、と言うかなっているだろう。
なっていなかったら幻滅である。なっていないならば、俺の予想を超越する駄目な理由があるだろう(笑)

2440774さん:2010/07/21(水) 00:13:30
仕様に当たろう。
それが一番確実である。

2441774さん:2010/07/21(水) 00:21:43
// 23.3.4.3 modifiers:
template <class... Args> void emplace_front(Args&&... args);
void pop_front();
template <class... Args> void emplace_back(Args&&... args);
void push_front(const T& x);
void push_front(T&& x);
void push_back(const T& x);
void push_back(T&& x);
void pop_back();

2442774さん:2010/07/21(水) 00:22:37
おお、直接コンストラクタまで呼び出せるemplace_back(front)まで用意されているぜ!
折角だから、俺はemplace_backを使うぜ!

2443774さん:2010/07/21(水) 00:23:50
正直、これぐらいしか、なんとかtemplateは使いどころがない。

2444774さん:2010/07/21(水) 00:24:46
つまり、>>2437は嘘である。
因みに、>>2437>>2438と同じサイト。

2445774さん:2010/07/21(水) 00:25:26
>>2444は多分。
まだ検証していない。

2446774さん:2010/07/21(水) 00:32:46
一発でコンパイルが通らなかった&長すぎで読む気にならない。

2447774さん:2010/07/21(水) 00:33:59
あ、通ったらびっくり。
多態性で遊ぼうと思ったのに、interfaceを継承していないもん。

2448774さん:2010/07/21(水) 00:37:31
__func__の定義を読んでいないので、正確にはなんとも言えないのだが、gccでは、クラス名が表示されない。
CClass::CClass(int)中で__func__とやってもCClassとしか表示されないのがgcc。
独自拡張でもいいから、CClass::CClassとだして欲しい。あわよくば、CClass::CClass(int)。
へ?__LINE__使えって?

2449774さん:2010/07/21(水) 00:41:06
デストラクタが呼ばれないと思ったら、デストラクタを仮想化してなかった。
怖い怖い。

2450774さん:2010/07/21(水) 00:43:23
あれ、純仮想デストラクタって出来ないのか・・・?
細かいところ勉強不足だなあ。

2451774さん:2010/07/21(水) 00:44:00
というか、純粋(ryなのか。

2452774さん:2010/07/21(水) 00:44:33
まあ、つまらないサンプル。
-----

#include <iostream>
#include <windows.h>
#include <list>
#include <memory>

#define nullptr NULL

class ITest{
public:
virtual auto Show()->void = 0;
virtual ~ITest(){
}
};

class CTest1 : public ITest{
private:
int m_num;

public:
CTest1(int num)
: m_num(num)
{
std::cout << "CTest1::CTest1(int)" << std::endl;
}
virtual ~CTest1(){
std::cout << "CTest1::~CTest1()" << std::endl;
}

virtual auto Show()->void{
std::cout << "CTest1," << m_num << std::endl;
}
};
class CTest2 : public ITest{
private:
double m_num;

public:
CTest2(double num)
: m_num(num)
{
std::cout << "CTest2::CTest2(double)" << std::endl;
}
virtual ~CTest2(){
std::cout << "CTest2::~CTest2()" << std::endl;
}

virtual auto Show()->void{
std::cout << "CTest2," << m_num << std::endl;
}
};

auto WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int /*nCmdShow*/)->int{
timeBeginPeriod(1);
{
std::list<std::unique_ptr<ITest>> ls;
ls.emplace_back(new CTest1(100));
ls.emplace_back(new CTest2(100.));
}
timeEndPeriod(1);
return 0;
}

2453774さん:2010/07/21(水) 00:45:40
>>2452
勿論動くサンプルです。
全然unique_prtが動かないことはないです。

2454774さん:2010/07/21(水) 00:50:13
上のサイトによれば、unique_ptrはほぼ生のポインタと同コストのようなのでこれはかなり使える。と思う。

2455774さん:2010/07/21(水) 00:55:00
某所で、
std::vector<int*> vec;
vec.push_back(new int(100));//ここ危ない。
という話があった。push_back関数内で例外が投げられた時に、newで確保されたメモリが開放されないと。

2456774さん:2010/07/21(水) 00:55:32
>>2455
は違う。

2457774さん:2010/07/21(水) 00:55:59
std::shared_ptr<int> p(new int);
だよ!

2458774さん:2010/07/21(水) 00:56:48
俺が使う範囲ではshared_ptr&weak_ptrはオーバースペックだろう。

2459774さん:2010/07/21(水) 00:59:48
大体、上に書いたソースを読めば、俺がC++を使いこなしていないことが良く分かる。
普通にstd::for_each使えばいいのにね。

2460774さん:2010/07/21(水) 01:19:38
コンテナ系STLを最適化するんだったら、アロケータを自分で作ったほうがいいのか?

2461774さん:2010/07/21(水) 01:20:32
3986 :774さん:2010/07/21(水) 01:01:32
std::for_each(ls.begin(), ls.end(), [](std::unique_ptr<ITest> &p){
p->Show();
});
ん・・・。
これは普通にiteratorで書いたほうがいいか・・・

3987 :774さん:2010/07/21(水) 01:14:54
ちゃんとlist::eraseで消しても、デストラクタが呼ばれるし、他のイテレータも有効だなあ。
イテレータの件については標準なのか調べてみる。明日、テストだし寝る。
-----
#include <iostream>
#include <windows.h>
#include <list>
#include <memory>
#include <algorithm>

#define nullptr NULL

class ITest{
public:
virtual auto Show()->void = 0;
virtual auto IsEven()->bool = 0;
virtual ~ITest(){
}
};

class CTest1 : public ITest{
private:
int m_num;

public:
CTest1(int num)
: m_num(num)
{
std::cout << "CTest1::CTest1(int)" << std::endl;
}
virtual ~CTest1(){
std::cout << "CTest1::~CTest1(), m_num = " << m_num << std::endl;
}

virtual auto Show()->void{
std::cout << "CTest1::Show(), m_num = " << m_num << std::endl;
}
virtual auto IsEven()->bool{
return !static_cast<bool>(m_num & 1);
}
};
class CTest2 : public ITest{
private:
double m_num;

public:
CTest2(double num)
: m_num(num)
{
std::cout << "CTest2::CTest2(double)" << std::endl;
}
virtual ~CTest2(){
std::cout << "CTest2::~CTest2(), m_num = " << m_num << std::endl;
}

virtual auto Show()->void{
std::cout << "CTest2::Show(), m_num = " << m_num << std::endl;
}
virtual auto IsEven()->bool{
return !static_cast<bool>(static_cast<int>(m_num) & 1);
}
};

auto WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int /*nCmdShow*/)->int{
std::list<std::unique_ptr<ITest>> ls;
for(int i = 0; i < 10; ++i){
ls.emplace_back(new CTest1(i));
ls.emplace_back(new CTest2(static_cast<double>(i)));
}

for(auto itn = ls.begin(), it = itn++ , end = ls.end(); it != end; it = itn, ++itn){
if((*it)->IsEven()){
ls.erase(it);
}
}

return 0;
}

3988 :774さん:2010/07/21(水) 01:17:09
g++ main.cpp -std=c++0x -O3 -lwinmm -m32

2462774さん:2010/07/21(水) 01:25:35
C++編(標準ライブラリ) 第28章 アロケータ
http://www.geocities.jp/ky_webid/cpp/library/028.html
---
>のように書きますが、この場合、独自のアロケータCMyAllocatorが確保する型はint型な訳です。つまり、int型用 のアロケータなので、各要素を表現する構造体の型とは一致するはずがありません。従って、std::listは、プログラマ がせっかく定義したアロケータを使うことがないことになります。
>これはstd::setやstd::mapのような連想コンテナ全般にも当てはまることです。これらは、ほとんどの実装では、 木構造(アルゴリズムとデータ構造編第16章参照)を使っているので、 リスト構造の場合と同様の理由で、指定したアロケータが使用できないことになります。
-----
な、なんだってー。
まあ、詳しくは実装を見てみないと分からないが、何のために
-----
// アロケータをU型にバインドする
template <class U>
struct rebind
{
typedef allocator<U> other;
};
-----
があるのかが分からない。

2463774さん:2010/07/21(水) 01:37:55
パッと見、rebind使っているから効果はあると思う。

2464774さん:2010/07/21(水) 09:38:52
g++ main.cpp -std=c++0x -O3 -lwinmm -m32

2465774さん:2010/07/21(水) 09:46:48
何故上のようなことを調べたかというと、listの中の要素に自身のiteratorを持たせて、削除も定数時間で行えるようにしたかったからです。
ただそれだけ。
iteratorについては帰ってきてから、仕様を当たる。
そういう記述はない気がする。

2466774さん:2010/07/21(水) 10:04:34
forward_list発見・・・

2467774さん:2010/07/21(水) 10:09:09
ちゃんと前に読んだことが有るはずなのに、忘れていた。
C言語で書かれたのと同じスピードで動くように簡素化されているんだよね。

2468774さん:2010/07/21(水) 10:14:29
iterator before_begin();
const_iterator before_begin() const;
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;

2469774さん:2010/07/21(水) 10:17:13
取り敢えず、forward_listは俺の需要を満たすものではない。
list最高!

2470774さん:2010/07/21(水) 17:42:55
>listにデータ操作を加えた後は、それ以前に取得したイテレータの動作は保証
>されないと思います。
>例えば、ソートや、データの追加、削除を行った場合。
-----
一番困るのが、仕様に書かれていないということだ。
ちゃんと、保証しなければならないor保証しなくても良いと書いておくべきだ。
勿論、書いてあるかすら確認していないので変なことを俺は言っているかもしれない。
上が正しいならば、走査しながらの削除が出来ないとは困ったものだ。

2471774さん:2010/07/21(水) 17:44:12
STLはそういうことはremove_ifを使ってやれと言っているのだろうか。
分からんでもないが・・・
俺が書こうとしているソースを考えると、かなり意味論的におかしい。
実行は出来るが。

2472774さん:2010/07/21(水) 17:44:41
まあ、こっちの方がメモリを食わなくてうれしいかもしれない

2473774さん:2010/07/22(木) 03:09:06
俺はなんとアホなんだ。
自分の要求を満たすlistを作ればいいじゃないか。

2474774さん:2010/07/22(木) 03:35:38
駄目だ。
仕様がデカすぎで面倒。

2475774さん:2010/07/22(木) 05:52:15
WinGDI遅すぎ。

2476774さん:2010/07/22(木) 23:46:43
何かやらかしたいなと思うのだが、やっぱり先人には敵わない。
俺はただの凡人だなあと思う限りである。

2477774さん:2010/07/23(金) 00:14:14
Greasemonkey Script : ニコニコ動画に拡張マイリストを追加するGreasemonkeyスクリプト - 棚からパルチャギ
http://castor.s26.xrea.com/products/greasemonkey/nicovideo_additional_mylist.html
-----
のSeaHorse版が全く更新されていない。
まあ、人口が少ないので仕方ないだろう。俺も最近RSSリーダーになっているし。
早くIE9出ろ。
アレで、ようやくFx2辺りに並ぶ。

2478774さん:2010/07/23(金) 01:09:23
JS+Javaで作りたくなった。
徹夜で作ってみせる!
まあ、Javaは初めてなので、上手くいかなさそう。

2479774さん:2010/07/23(金) 01:20:55
いきなり頓挫しそうだぜ!
取り敢えず明日の朝食を食うために、寝たほうがいいかなあ

2480774さん:2010/07/23(金) 01:40:52
有限不実行、これが俺。
駄目駄目だなあ・・・

2481774さん:2010/07/23(金) 01:41:15
まあ、ゆっくりやろう。
今日はまだ二十二時間あるのだ。

2482774さん:2010/07/23(金) 10:18:32
正直、Sleipnirなんてどうでもいいので、適当にGoogle Chromeのプラグインでも作ってみたいが、ちょっと他にやりたいことが出来たのでそれをやる。

2483774さん:2010/07/23(金) 10:28:28
#include <iostream>
#include <windows.h>

#define nullptr NULL

//関数
auto WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)->int;
auto CleanMessage(int *ret)->bool;
auto CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)->LRESULT;

//実装
auto WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow)->int{
WNDCLASSEX wc = {sizeof(wc)};
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = MainWndProc;
wc.cbWndExtra = 0;
wc.cbClsExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(nullptr, IDI_WINLOGO);
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1);
wc.lpszMenuName = nullptr;
wc.lpszClassName = TEXT("AA");
wc.hIconSm = nullptr;

ATOM aWnd = RegisterClassEx(&wc);
if(aWnd == INVALID_ATOM){
return -1;
}

//ウィンドウの大きさの計算 横:600 縦;300
const int clientwidth = 800;
const int clientheight = 600;
const int screenx = GetSystemMetrics(SM_CXSCREEN);
const int screeny = GetSystemMetrics(SM_CYSCREEN);

RECT windowRect;
windowRect.left = screenx / 2 - clientwidth / 2;
windowRect.right = screenx / 2 + clientwidth / 2;
windowRect.top = screeny / 2 - clientheight / 2;
windowRect.bottom = screeny / 2 + clientheight / 2;

AdjustWindowRectEx(&windowRect, WS_CAPTION | WS_SYSMENU, FALSE, 0);

HWND hWnd = CreateWindowEx(
0,
reinterpret_cast<LPCTSTR>(aWnd),
TEXT("WindowTitle!!"),
WS_CAPTION | WS_SYSMENU,
windowRect.left, windowRect.top,
windowRect.right - windowRect.left, windowRect.bottom - windowRect.top,
nullptr,
nullptr,
hInstance,
nullptr
);
if(hWnd == nullptr){
return -2;
}

ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);


static const DWORD waitTimes[] = {
16, 17, 17
};
int index = 0;
int retValue;
HDC hdcWin = GetDC(hWnd);
HDC hdcMem = CreateCompatibleDC(hdcWin);
HBITMAP hBitmapMem = CreateCompatibleBitmap(hdcWin, clientwidth, clientheight);
SelectObject(hdcMem, hBitmapMem);
DWORD old = timeGetTime();
int i = 0;

timeBeginPeriod(1);
for(;;){
if(CleanMessage(&retValue)){
break;
}

//ただただ面倒臭い処理
{
RECT rc;
rc.left = 0;
rc.right = clientwidth;
rc.top = 0;
rc.bottom = clientheight;
FillRect(hdcMem, &rc, reinterpret_cast<HBRUSH>(GetStockObject(WHITE_BRUSH)));
int j = 0;

BitBlt(hdcWin, 0, 0, clientwidth, clientheight, hdcMem, 0, 0, SRCCOPY);
}

std::cout << timeGetTime() - old << std::endl;

if(CleanMessage(&retValue)){
break;
}

2484774さん:2010/07/23(金) 10:28:39

//時間処理
{
DWORD now = timeGetTime();
DWORD diff = now - old;
if(diff < waitTimes[index]){
DWORD sleeptime = waitTimes[index] - diff;
if(sleeptime >= 5){
Sleep(sleeptime - 3);
}
while(timeGetTime() - old < waitTimes[index]);
}
old = timeGetTime();
if(++index >= sizeof(waitTimes) / sizeof(waitTimes[0])){
index -= sizeof(waitTimes) / sizeof(waitTimes[0]);
}
}
}
timeEndPeriod(1);

DeleteObject(hBitmapMem);
DeleteObject(hdcMem);
ReleaseDC(hWnd, hdcWin);

return retValue;
}

auto CleanMessage(int *ret)->bool{
MSG msg;
bool flag = false;
while(PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)){
if(msg.message != WM_QUIT){
TranslateMessage(&msg);
DispatchMessage(&msg);
}else{
*ret = msg.wParam;
flag = true;
}
}
return flag;
}

auto CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)->LRESULT{
switch(msg){
case WM_DESTROY:{
PostQuitMessage(0);
break;
}

default:{
return DefWindowProc(hWnd, msg, wp, lp);
}
}

return 0;
}

2485774さん:2010/07/23(金) 11:09:32
SDLが通らない。
調べたサイトの対策を講じてみても動かない。
SDLを自分でコンパイルしろということですね分かります。

2486774さん:2010/07/23(金) 11:11:30
シェルスクリプト入ってねーよwwww

2487774さん:2010/07/23(金) 11:23:11
あれ、普通に-lmingw32で通った。
さっきは通らなかった気がするのに・・・

2488774さん:2010/07/23(金) 11:29:24
37行程度のソースを一回で通せないとは・・・

2489774さん:2010/07/23(金) 11:34:27
俺が外出している間に勝手にSDL_imageがコンパイル出来てないかな?

2490774さん:2010/07/23(金) 14:20:19
勿論出来ているはずもなく。
makeが上手くいかない・・・

2491774さん:2010/07/23(金) 14:22:40
Cygwinは入れたくない。

2492774さん:2010/07/23(金) 14:57:24
普通にVC用のlibいれたら行けた。なんぞそれ。

2493774さん:2010/07/23(金) 15:40:42
#include <iostream>
#include <list>
#include <memory>
#include <algorithm>
#include <random>
#include <ctime>
#include <cmath>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

#define nullptr NULL

class IShot{
public:
virtual bool Move() = 0;
virtual void Show(SDL_Surface *screen, SDL_Surface *image) = 0;
virtual bool HitTest() = 0;
};

class CShotLine : public IShot{
public:
virtual bool Move(){
m_x += m_v * std::sin(m_rad);
m_y += m_v * std::cos(m_rad);
if(m_x < 0 || m_x > 600 || m_y < 0 || m_y > 300){
return false;
}
return true;
}
virtual void Show(SDL_Surface *screen, SDL_Surface *image){
SDL_Rect rc;
rc.x = m_x;
rc.y = m_y;
SDL_BlitSurface(image, nullptr, screen, &rc);
}
virtual bool HitTest(){
return false;
}

CShotLine(int x, int y, int v, double rad)
: m_x(x), m_y(y), m_v(v), m_rad(rad)
{}

private:
double m_x, m_y;
int m_v;
double m_rad;
};

//関数
int main(int argc, char **argv){
if(SDL_Init(SDL_INIT_VIDEO) < 0) return -1;

SDL_WM_SetCaption("TEST", NULL);

SDL_Surface *screenSurface;
screenSurface = SDL_SetVideoMode(600, 300, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

SDL_Surface *image = IMG_Load("shot.png");
std::list<std::unique_ptr<IShot>> shots;
std::mt19937 engine(static_cast<unsigned int>(std::time(nullptr)));
unsigned int i = 0;

for(;;){
{
SDL_Rect dest;
dest.x = 0;
dest.y = 0;
dest.w = 600;
dest.h = 480;
SDL_FillRect(screenSurface, &dest, 0x00000000);
}

shots.emplace_back(new CShotLine(engine() % 600, engine() % 100, engine() % 2 + 1, (double)i++ / 200));

shots.erase(std::remove_if(shots.begin(), shots.end(), [](std::unique_ptr<IShot> &b){return !b->Move();}), shots.end());
std::for_each(shots.begin(), shots.end(), [&](std::unique_ptr<IShot> &b){b->Show(screenSurface, image);});

SDL_Flip(screenSurface);

SDL_Event ev;
while(SDL_PollEvent(&ev)){
switch(ev.type){
case SDL_QUIT:{
return 0;
}
case SDL_KEYDOWN:{
SDLKey *key = &ev.key.keysym.sym;
if(*key == 27){
return false;
}
break;
}
}
}
}

SDL_FreeSurface(image);
SDL_Quit();
return 0;
}

2494774さん:2010/07/23(金) 15:46:51
>Note: 少くとも10ミリ秒の遅延を考えて下さい。 プラットフォームによってはもっと短かい時間の場合もありますが、この値が最も一般的です。
-----
つまり、whileでループを回せということですね。分かります。

2495774さん:2010/07/23(金) 15:48:49
60fpsで動かしているのにかくかく。
スペックは余裕のはずである。

2496774さん:2010/07/23(金) 16:12:24
毎フレーム3px動くだけでかなり早い。
まあ、一秒で180pxも動くし。

2497774さん:2010/07/23(金) 16:59:09
糞ゲー出来た!

2498774さん:2010/07/23(金) 20:01:55
上手く動作しない。
繰り返しなのに、繰り返してない。
コンパイラ・・・

2499774さん:2010/07/23(金) 20:03:12
しかし、今までコンパイラのバグだと思っていたものが、やっぱり俺のミスだったので、今回もそうである気がする。

2500774さん:2010/07/23(金) 20:11:43
以下のソースが上手く動かない・・・
-----
class CShotLineSin : public IShot{
public:
virtual bool Move(){
double A = m_A * std::sin(m_frame * m_omega);
m_x += m_vx;
m_y += m_vy;
m_tx = m_x + A * m_cos;
m_ty = m_y - A * m_sin;
if(m_x < -10 - m_A || m_x > screen_width + 10 + m_A || m_y < -10 - m_A || m_y > screen_height + 10 + m_A){
return false;
}
m_frame++;
return true;
}
virtual void Show(SDL_Surface *screen){
SDL_Rect rc;
rc.x = static_cast<int>(m_tx) - 7;
rc.y = static_cast<int>(m_ty) - 7;
SDL_BlitSurface(m_image, nullptr, screen, &rc);
}
virtual bool HitTest(int x, int y){
int dif_x = m_tx - x;
int dif_y = m_ty - y;
if(dif_x * dif_x + dif_y * dif_y < 3 * 3){
return true;
}
return false;
}

CShotLineSin(int x, int y, double v, double rad, double A, double omega, SDL_Surface *image)
: m_x(x), m_y(y), m_tx(x), m_ty(y), m_sin(std::sin(rad)), m_cos(std::cos(rad)), m_vx(v * m_sin), m_vy(v * m_cos), m_A(A), m_omega(omega), m_image(image), m_frame(0)
{}

private:
double m_x, m_y;
double m_tx, m_ty;
double m_vx, m_vy;
double m_sin, m_cos;
double m_A;
double m_omega;
unsigned int m_frame;
SDL_Surface *m_image;
};

2501774さん:2010/07/23(金) 20:19:01
std::list::sizeってO(1)でいいのか?

2502774さん:2010/07/23(金) 20:20:57
でいいみたい。

2503774さん:2010/07/23(金) 23:48:44
Sleipnirオワタ。

2504774さん:2010/07/24(土) 00:07:11
Sleipnirがこの先生き残るには、少なくとも、Trident,Gecko,KHTMLのレンダリングエンジンを利用可能にし、キャッシュ、データベース、クッキーなどの情報を全てのレンダリングエンジンで共有できるようにし、Firefox,GoogleChrome,IEのプラグインをレンダリングエンジンに関係なく利用可能にし、ポータブルで完全に持ち運べるようにし、そして、ポータブル版は完全に使用したPCの環境を汚したりしなくて、他のどのブラウザよりも早い、ぐらいじゃないと使うことはないだろう。

2505774さん:2010/07/24(土) 00:23:13
Sleipnirアンインストール中・・・

2506774さん:2010/07/24(土) 00:31:18
さて、どうしようか。
GoogleChromeのプラグインの作り方でも勉強するか。

2507774さん:2010/07/24(土) 00:41:40
やりたいこと。
1.PEファイルを手動で読み込む and PEファイルにPEファイルの挿入
2.WAVを読み込んで、フーリエ級数展開 MIDI化
3.ゲーム(?) -> もうあれで満足(笑)
4.OpenCV
5.作曲
6.Webサイト制作 PHP

2508774さん:2010/07/24(土) 00:42:15
やりたいこと。
1.PEファイルを手動で読み込む and PEファイルにPEファイルの挿入
2.WAVを読み込んで、フーリエ級数展開 MIDI化
3.ゲーム(?) -> もうあれで満足(笑)
4.OpenCV
5.作曲
6.Webサイト制作 PHP
7.GoogleChrome or Firefoxのプラグインを書く。

2509774さん:2010/07/24(土) 01:02:47
俺のパソコンから、即起動可能な似非ブラウザはなくなったはずである。

2510774さん:2010/07/24(土) 16:04:02
俺が思ったことには、弾幕ゲーは、弾を飛ばすのが楽しい。

2511774さん:2010/07/24(土) 16:05:13
ちゃんとプログラミングを書くんだったら、リソース管理用のクラスとか用意して、キャラクターの情報は全て一つのクラスにまとめて(ry

2512774さん:2010/07/24(土) 16:11:53
整数の割り算が早いか、メモリ参照が早いか、doubleをintに変換するのが早いか。

2513774さん:2010/07/24(土) 16:36:49
std::list::remove_ifがあるだと!
そして、STLのページには、削除されなかったiteratorは有効であるだと!
これは良い。が、もうiteratorは使わないと思うのでどうでもいい。

2514774さん:2010/07/24(土) 16:39:08
30fpsで滑らかに動いて見えるんじゃないの?
テレビって30fpsなんでしょ?

2515774さん:2010/07/24(土) 16:59:09
1500個あたりで、60fpsでなくなるなあ。

2516774さん:2010/07/24(土) 17:01:28
間引きたいが、間引くには、ソートが必要だし、ランダムアクセス出来ないと間引く意味がないし。

2517774さん:2010/07/24(土) 17:03:11
挿入、消去、ランダムアクセス、ソートが定数時間で出来、順番は覚えて無くてもいい、そういうコンテナはないんだろうなあ

2518774さん:2010/07/24(土) 21:37:38
Windows 7の便利なキーボードショートカット15選 : ライフハッカー[日本版]
http://www.lifehacker.jp/2010/07/100722ucscopaw7.html

2519qnighy:2010/07/25(日) 13:23:11
定数時間は無理だけど、O(log n)なランダムアクセスが可能なように平衡二分木を実装することはできるはず。

ソート済みのデータ列と、未ソートのデータ列を、同時に管理するのは難しいかと。

要求仕様が曖昧なのでなんとも言えないですけど…

2520マインスイーパ:2010/07/25(日) 13:58:23
今夏、戦争にかかわる小説を書きたいのですが
戦争を経験したことがないのでどうしようかと。
祖父に聞いておけば良かったのかなと思っています。

まあ、戦争を経験していないからこそ、
こんなことを思い立つのですが。。。

2521マインスイーパ:2010/07/25(日) 13:59:27
書く場所間違えましたね。。。

2522774さん:2010/07/25(日) 17:35:48
>>2519
定数は無理ですよね・・・

元々、当たり判定を間引くためにx座標 or y座標でソートしようと思いましたが、今考えるとフレーム毎にソートをするとかどんだけ時間かかr(ry

2523774さん:2010/07/25(日) 17:37:56
>>2520
戦争とか体験したくないこと筆頭。
ネットで調べればいっぱい見つかると思いますが。

2524774さん:2010/07/25(日) 17:54:14
グレイズでも実装してみる。
仕様は、在る範囲に近づいたらフラグ立てて、その範囲から玉に当たらず出たら+1というシステムでいいだろう。

2525774さん:2010/07/26(月) 00:56:05
色々と書いてみて思ったこと。
弾のデータと軌道のデータは分けるべき。
弾の種類をランダムにすることはないと思うので、データをclassで纏めてtemplateで渡すようにするといい気がする。
ランダムに出来るような仕様も一応出来るようにはしておく。あと、リソースの管理を引き受けるクラスも勿論要る。
struct 丸いの{
static bool HitTest(RECT &rc){
//・・・
}
static bool HitTest(unsigned int x, unsigned int y){
//・・・
}
static void Show(){
CResource::getInstance()->ShowImage(/*なんとかかんとか*/); //こうはしないだろうが・・・
}
};

template<class Shot>
class CShotLine : public IShot{
virtual bool HitTest(const RECT &rc){
//・・・ (rcを座標変換して、bufへ)
return Shot::HitTest(buf);
}
//(略)
};

2526774さん:2010/07/26(月) 00:57:10
こうすれば、最適化されてそこまで酷くはならないだろう。

2527774さん:2010/07/26(月) 16:10:27
弾を回転させる時はどうしようか。
四角い弾を飛ばすんだったら、回転させたいよなあ。

まだ、double型とint型の変換スピードとか比較はしていないが、恐らくビットシフトよりは遅いので、全体の座標は2^n(2**n)倍にして保持するようにしよう。

2528774さん:2010/07/26(月) 16:55:56
大学でRubyやるし、これを機会に勉強してみるか。
簡単にサーバープログラム書けるみたいだし。
今日からやるわけではない。
なんか前も言った気がする。

2529774さん:2010/07/26(月) 17:07:29
>>2528
日本人じゃないみたい・・・

2530774さん:2010/07/26(月) 17:15:36
某所で見たが、元々何処で見たか分からないようなTips。
メンバ関数ポインタはアップキャスト可能。
-----

#include <iostream>
#include <windows.h>

class ITest{
public:
virtual double Function(unsigned int i) = 0;
};

class CDoubleTest : public ITest{
public:
virtual double Function(unsigned int i){
return static_cast<double>(i);
}
};

class CDouble2Test : public ITest{
virtual double Function(unsigned int i){
return static_cast<double>(i * 2);
}
};

int main(int argc, char **argv){
if(IsDebuggerPresent()){
DebugBreak();
}

CDoubleTest dt;
CDouble2Test dt2;
ITest *pt = &dt;
double (CDoubleTest::*pdf)(unsigned int) = &CDoubleTest::Function;
double (ITest::*pif)(unsigned int) = (double (ITest::*)(unsigned int))pdf;
std::cout << (dt.*pdf)(100) << std::endl;
std::cout << (dt.*pif)(100) << std::endl;
//std::cout << (pt->*pdf)(100) << std::endl; //暗黙の型変換は無理らしい
std::cout << (pt->*pif)(100) << std::endl;
std::cout << (dt2.*pif)(100) << std::endl; //元と型が違ってもいい
}

2531774さん:2010/07/26(月) 17:30:37
俺は参照よりポインタの方が好きだ!

2532774さん:2010/07/26(月) 17:31:29
どうせ、処理スピードは一緒です。
違う例ってなにかあるのか?

2533774さん:2010/07/26(月) 17:46:46
適当にunsigned int型をdoubleに変換するだけのソースを書いたのだが、これが32bitsと64bitsで速度が結構違う。
呼出の所で最適化が行われないようにするためにvirtual化して、TestIt関数に渡して多態性が出るようにしてある。(ソースは下)
で、測ってみたところ、64bitsの方が大体7/8の時間で終わらせるようだ。CPUの仮想化の影響?どうやって、64bitsと32bitsを切り替えているんだっけなあ。
-----
class ITest{
public:
virtual double Function(unsigned int i) = 0;
};

class CDoubleTest : public ITest{
public:
virtual double Function(unsigned int i){
return static_cast<double>(i);
}
};

void TestIt(ITest *p){
Timer t;
t.Start();
for(unsigned int i = 0; i < 1000000; ++i){
p->Function(i);
}
t.Stop();
std::cout << typeid(*p).name() << std::endl;
std::cout << t.Distance() << std::endl;
}

int main(int argc, char **argv){
if(IsDebuggerPresent()){
DebugBreak();
}

CDoubleTest dt;

TestIt(&dt);
}
-----

2534774さん:2010/07/26(月) 17:52:28
あれ・・・
回数増やすとかなり近くなる。

2535774さん:2010/07/26(月) 17:53:14
あれ、誤差の範囲内だったのか・・・?
五回ぐらいそれぞれ測定したのだが。

2536774さん:2010/07/26(月) 17:55:38
CDoubleTestは上のソース通り。CControlTestはstatic_cast<double>(0);を返すだけ。
64bistはCDoubleTestが7000000を超えることは無かった。(四回しか計ってないが・・・)

C:\Users\Owner\Desktop\projects\gcctest>g++ main.cpp -O3 -std=c++0x -m32

C:\Users\Owner\Desktop\projects\gcctest>a
QueryPerformanceFrequency=2078154
11CDoubleTest
7046745
12CControlTest
6908983

C:\Users\Owner\Desktop\projects\gcctest>g++ main.cpp -O3 -std=c++0x -m64

C:\Users\Owner\Desktop\projects\gcctest>a
QueryPerformanceFrequency=2078154
11CDoubleTest
6906016
12CControlTest
6884568

2537774さん:2010/07/26(月) 17:56:21
64bitsのプログラムをデバッグできるOllyDbgが欲しい。

2538774さん:2010/07/26(月) 18:10:10
えっ・・・。
return static_cast<double>(i) * 2;の方が、
return static_cast<double>(i * 2);より早いだと・・・

前者-----
0040DAF0 /. 55 PUSH EBP
0040DAF1 |. 89E5 MOV EBP,ESP
0040DAF3 |. 83EC 08 SUB ESP,8
0040DAF6 |. 660F6E45 0C MOVD XMM0,DWORD PTR SS:[ARG.2]
0040DAFB |. 660FD645 F8 MOVQ QWORD PTR SS:[LOCAL.2],XMM0
0040DB00 |. DF6D F8 FILD QWORD PTR SS:[LOCAL.2]
0040DB03 |. D8C0 FADD ST,ST
0040DB05 |. C9 LEAVE
0040DB06 \. C3 RETN

後者-----
0040DCE0 /. 55 PUSH EBP
0040DCE1 |. 89E5 MOV EBP,ESP
0040DCE3 |. 83EC 10 SUB ESP,10
0040DCE6 |. 8B45 0C MOV EAX,DWORD PTR SS:[ARG.2]
0040DCE9 |. 01C0 ADD EAX,EAX
0040DCEB |. 8945 F4 MOV DWORD PTR SS:[LOCAL.3],EAX
0040DCEE |. 660F6E45 F4 MOVD XMM0,DWORD PTR SS:[LOCAL.3]
0040DCF3 |. 660FD645 F8 MOVQ QWORD PTR SS:[LOCAL.2],XMM0
0040DCF8 |. DF6D F8 FILD QWORD PTR SS:[LOCAL.2]
0040DCFB |. C9 LEAVE
0040DCFC \. C3 RETN


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板