【初心者歓迎】C/C++室 Ver.77【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.77【環境依存OK】 - 暇つぶし2ch509:デフォルトの名無しさん
12/01/20 08:09:46.09
>>504
char hoge[10] = {}; で。

510:デフォルトの名無しさん
12/01/20 09:55:24.58
hoge[0] = '\0'ってヌル文字でしたっけ
するとstrlen(hoge) で0になっちゃいませんか?

>>509
これはどういう動作になるんでしょうか?
strlen(hoge)が9に約束されます?

511:デフォルトの名無しさん
12/01/20 10:12:30.97

template <unsigned int N> void init(char (&)[N]) {
for(unsigned int i = 0 ; i < N - 1 ; ++i) a[i] = 1;
a[N - 1] = 0 ;
}

char a[10] ;
init(a) ;

cout << strlen(a) << endl ;

512:デフォルトの名無しさん
12/01/20 10:24:30.57
>>510
???
hogeに何が入っているかに因るから
strlen(hoge)が保証される分けない。

strcpy(hoge, "a");
ってやった後に
strlen(hoge);
ってすればstrlen(hoge);は1であることが保証されるけど、

strcpy(hoge, "abcdefghi");
の後に
strlen(hoge);ならstrlen(hoge);が9であることが保証される。

hogeの定義により確保したmemoryの大きさを保証したいのなら
>>506の言うとおりsizeof(hoge)とする以外にないよ。

513:デフォルトの名無しさん
12/01/20 10:53:05.54
やはりそういういうことですよね
>>511参考にさせて頂きます

514:デフォルトの名無しさん
12/01/20 12:07:59.47
配列の長さと文字列の長さを混同しないようにな。
strlenはたんに'\0'の前までの数を数えているだけなのだから。

515:デフォルトの名無しさん
12/01/20 12:09:49.37
配列に格納できる最大長が欲しいのか。
それならそうと最初からそう言えと。

516:デフォルトの名無しさん
12/01/20 12:10:16.96
char hoge[] = "123456789";

517:デフォルトの名無しさん
12/01/20 13:00:26.21
コンパイル時に決定される配列の大きさを実行時に求めたいという要求が理解出来ない

518:デフォルトの名無しさん
12/01/21 10:41:15.47
コンパイル時に決定されるかどうかは関係なく、
ポインタから配列の大きさを求めることは出来るのか?という疑問です
もっと言えば、関数にポインタだけ渡しておけば、あとは勝手にサイズも見てもらって処理するような処理は可能か?ということです
上では一応sizeof使えとのことでしたが、ポインタの渡し方によっては
ポインタそのもののサイズを返したりするので、結局素直に初期化する関数を作るべきかなあ

519:デフォルトの名無しさん
12/01/21 11:05:15.29
>>518
vector使えでFA

520:デフォルトの名無しさん
12/01/21 11:05:33.02
vector渡せばいい

521:デフォルトの名無しさん
12/01/21 11:10:22.47
サイズ付きの構造体、クラスでPK

522:デフォルトの名無しさん
12/01/21 11:42:01.82
> ポインタから配列の大きさを求めることは出来るのか?という疑問です
これを書こうよ。。。
答え:できない

523:デフォルトの名無しさん
12/01/21 11:45:38.89
すいません、疑問がうまく文章になるまで時間がかかりまして。
vector考えてみます

524:デフォルトの名無しさん
12/01/21 12:59:38.80
// func.cpp
namespace {
template <unsigned int R> inline BigInt Factor(BigInt const & n) { return n == 0 ? 1 : n * Factor<R - 1>(n - 1); }
template <> inline BigInt Factor<0>(BigInt const & n) { return n == 0 ? 1 : n * Factor<256>(n - 1); }
}
BigInt factor(BigInt const & n) { return Factor<256>(n) ; }

// func.hpp
BigInt factor(BigInt const & n);


こんな感じのコードを見かけたんですけどこのテンプレートになにか意味あるんですか?

525:デフォルトの名無しさん
12/01/21 13:14:48.03
>>524
どこら辺を意味がないと思ったの。

526:デフォルトの名無しさん
12/01/21 13:49:19.71
>>525
なんで普通に再帰しないのかなーって

527:デフォルトの名無しさん
12/01/21 13:51:40.62
>>526
再帰の限界の数の回避とかなのかね。

528:デフォルトの名無しさん
12/01/23 12:18:57.37
こんなならループのほうがよさそうに思えるが

529:デフォルトの名無しさん
12/01/23 12:49:56.34
test

530:デフォルトの名無しさん
12/01/23 16:48:29.11
>>528
テンプレートでコンパイル時に計算させようとすると再起しかないんじゃないの。


531:デフォルトの名無しさん
12/01/23 17:21:33.84
>>530
そういう意味じゃないとおもう

532:デフォルトの名無しさん
12/01/23 17:53:13.43
テンプレート関数を特殊化したり、
テンプレート引数の代わりに関数引数で再帰している
よくわからないコード

533:デフォルトの名無しさん
12/01/23 17:53:29.35
>>528
コンパイル時定数として階乗の結果が欲しいのをループじゃ対応できないのでは?

534:デフォルトの名無しさん
12/01/23 18:03:02.90
問題は、100やそこらの再帰じゃ済まない階乗の値をBigIntで持つ必要が本当にあるのかどうか。

535:デフォルトの名無しさん
12/01/23 18:26:06.14
inline展開されてオーバーヘッドが無くなるというメリットはありそうだがこのサンプルでは無意味だろうな

536:デフォルトの名無しさん
12/01/23 20:12:08.33
>>535
コンパイル時に計算されるからインラインに展開してオーバーヘッドがなくなるとか関係ないのでは?

537:デフォルトの名無しさん
12/01/23 21:30:45.28
>>530,533,536

それはもしかしてこんなコードじゃないのかい
URLリンク(codepad.org)

538:デフォルトの名無しさん
12/01/24 10:01:51.79
質問です。

template <typename T = char>
class Hoge
{
};


void test(void)
{
  Hoge h;
}

テンプレート引数 T に対して char を与えてやってるので、
Hoge を使用する際、テンプレート引数を与えなくてもよさそうなのに、

error C2955: 'Hoge' : クラス テンプレート を使用するには テンプレート 引数リストが必要です

となります。どうしてですか?

どうぞよろしくお願いします。


VS2008 pro
Win7 pro x64


539:デフォルトの名無しさん
12/01/24 10:03:11.96
Hoge<> hoge;

540:デフォルトの名無しさん
12/01/24 11:31:02.17
つまり、class Hogeとtemplate<>class Hogeの区別がつかないんだな。

541:デフォルトの名無しさん
12/01/24 11:49:44.40
GPU計算に興味が有るんだけど、C++だとOpenCLってやつが一般的?
C++で使えて入門に向いてるのって何があるかな?

542:デフォルトの名無しさん
12/01/24 11:53:37.64
下記関数は5ms周期で実行されています。
CTMAXが200を超えたとき、例えば201に
なったとき、10ms周期の処理が5ms後に実行
されるという現象がおきます。
下記のように毎回実行される5msの処理は仕方
ありませんが、10ms以降の処理は実行タイミング
がかぶらないようになっています。この状態でさ
らに実行タイミングがずれないような処理を作りた
いのですが、思いつきません。できるものでしょうか?
void time(void){ #define CTMAX 200 static int ct;
if(++ct > CTMAX) ct = 0;
func5ms();/* 5ms処理 */
if(ct & 0x01) == 0)
func10ms();
else{ if(ct & 0x02) != 0) func20ms();
else{ switch (ct){
case 1: case 21: case 41: case 61: case 81:
case 101: case 121: case 141: case 161: case 181:
func100ms(); break;
case 13: case 53: case 93: case 133: case 173:
func200ms(); break;
case 5: case 105:
func500ms(); break;
case 9:
func1s(); break;
}}}}

543:デフォルトの名無しさん
12/01/24 12:12:36.72
よく分からんけど、

s = milisecond();
do_something();
e = milisecond();

if(e-s<200))
sleep_milisecond(200-(e-s));

ぐらい?

544:デフォルトの名無しさん
12/01/24 12:24:07.29
とりあえずこういうこと?
ctって0~200までの値、つまり
201個の値を取ることになっていたんだけど、
そこがまず問題だよね。
1005ms が 1000ms と等しいよ。

本当ならば、>= としなければならないよね?
// if(++ct >= CTMAX) ct = 0;
or
ct++;
ct %= CTMAX;


545:デフォルトの名無しさん
12/01/24 12:34:49.47
void time(void)
{
#define CTMAX 200
static int ct = 0;

// 0 <= ct <= 199
ct %= CTMAX;

mod_10 = ct % 10;
mod_100 = ct % 100;
mod_200 = ct % 200;
mod_500 = ct % 500;

if(!mod_500)
func500ms();
if(!mod_200)
func200ms();
if(!mod_100)
func100ms();
if(!mod_10)
func10ms();

ct++;
}


546:デフォルトの名無しさん
12/01/24 13:52:36.91
素直に書いた方がoptimize有利なんだから
ct = (ct + 1) % CT_MAX;


547:デフォルトの名無しさん
12/01/24 14:01:39.16
time()を初めて実行した時に困るでしょ。
ct = 1;で実行することになって起動後9ms, 19ms, 29ms, ...
で実行することになるよ。
人が書いたコードにbug入れる奴っているんだよな
迷惑なんだよな

548:デフォルトの名無しさん
12/01/24 14:06:09.81
そもそも標準関数と同じ名前の関数を作るな間抜け。

549:デフォルトの名無しさん
12/01/24 14:10:55.35
これって組み込みだから問題ないと思って特に指摘しなかったよ。
time.hなんて高尚なヘッダは存在しないんじゃないの?

550:538
12/01/24 16:33:33.09
>>539
ありがとうございます。助かりました。

551:デフォルトの名無しさん
12/01/25 07:51:50.37
結局>>542はどうなった?
自分は解決したから後はシーラないってか?

552:デフォルトの名無しさん
12/01/25 09:36:12.44
>>544
さんのいうとおり++ct >= CTMAXとしただけでとりあえず
自分の作ったやつでも正常に動くっぽいですね。

ちなみに関数名にtimeなんて使ってません。書き込むとき
面倒なんで簡単な名前に変更しただけです。

>>545
のプログラムはわかりやすいですが、0のとき全部実行され
てしまうのが難ですね。
それからmod_10で考えると10回に1回しか起動しないので、
それだと10msじゃなくて50ms周期になってしまいます。

553:デフォルトの名無しさん
12/01/25 09:43:21.64
>>552
> ちなみに関数名にtimeなんて使ってません。書き込むとき
> 面倒なんで簡単な名前に変更しただけです。

それにしても標準関数と名前がかぶるってねーだろ

554:デフォルトの名無しさん
12/01/25 09:51:57.71
まぁ549さんの言うとおり、組み込みなんでtime.hなんて
使いませんし。

555:デフォルトの名無しさん
12/01/25 10:14:03.52
>>552
bug指摘されちゃった。
static int ct = 0;
if(ct == 0){
ct = 1;
return;
}
投稿した後に、これでうまくいくって気づいてはいたんだけどね。。。
この後はctが0になることはなくて、
0と等価な200がctの値としてくるから問題ないよね。
これくらい思いついてよ。。。

> それからmod_10で考えると10回に1回しか起動しないので、
> それだと10msじゃなくて50ms周期になってしまいます。

こっちは気づかなかった。きちんとdebugしてうまい具合にしてよ。

556:デフォルトの名無しさん
12/01/25 10:19:00.51
実際に問題になるかどうかじゃなくて、そういう紛らわしいことはするなってこった。

557:デフォルトの名無しさん
12/01/25 10:24:21.70
ct += 5とするか、
time()を1ms毎に実行するようにするかして修正すれば良さそうだね。
後は任せた。

void time(void)
{
#define CTMAX 200
#define POLLING 5
static int ct = 0;
if(ct == 0){
ct = POLLING;
return;
}
// 0 <= ct <= 199
ct %= CTMAX;

mod_10 = ct % 10;
mod_100 = ct % 100;
mod_200 = ct % 200;
mod_500 = ct % 500;

if(!mod_500)
func500ms();
if(!mod_200)
func200ms();
if(!mod_100)
func100ms();
if(!mod_10)
func10ms();

ct += POLLING;
}

558:549
12/01/25 10:29:57.73
自分で実装する時はtime.hがないからっていって、
time()やらtime.hに含む関数名を使ったりしないよ。
本当は、time()なんて関数を自作するのはまずいし、
他人に披露する時に借りの名前とするのも、
あらぬ誤解を招きかねないのでまずいんだけど、
でも、2chに書き込まれるような関数名に意見するのも面倒だし、
組み込みで使っている関数だって事は一見して明らかだったので、
time.hを使うことはまずないだろうって事であえて指摘しなかったんです。

まあ、本当は>>549がおかしいんだよ。
一々指摘するのも嫌だから指摘しなかっただけでさ。

私が名付けるとすれば、polling()かなぁ

559:549
12/01/25 10:31:25.79
>>558
まあ、本当は>>549がおかしいんだよ。
は間違いで、
まあ、本当は>>542がおかしいんだよ。
が正しい。

560:デフォルトの名無しさん
12/01/25 10:47:03.80
>>542
コードを書く前にまずは何をしたいのかを正しい日本語で人に説明する訓練をしなさい

561:デフォルトの名無しさん
12/01/26 21:39:52.68
てすと

562:デフォルトの名無しさん
12/01/27 13:12:52.00
class Hogeを事前に宣言しておいて、
あとから定義したいと思うのですが、うまくできません。
何か解決方法はありますか?


// 宣言
class Hoge;
Hoge func( );


int main( )
{
Hoge h = func( );

return 0;
}


// 定義
class Hoge
{
public:
};

Hoge func( ){ return Hoge(); }

563:デフォルトの名無しさん
12/01/27 13:19:17.13
//hoge.h///////////////
// 宣言
class Hoge;
Hoge func( );
///////////////////////

//hoge.cpp/////////////
#include "hoge.h"

int main( )
{
Hoge h = func( );

return 0;
}


// hoge定義
class Hoge
{
public:
};

Hoge func( ){ return Hoge(); }
/////////////////////////////
ってことなら無理
Hoge h = func( );この時点でHogeの定義が見えてないとダメ
int main()の前に hoge定義を持ってこないと

564:デフォルトの名無しさん
12/01/27 13:21:27.99
func()がHogeではなくHoge*(またはスマートポインタ)を返すようにすれば大丈夫なはずだが、
設計を見直したほうがいいような気がする。

565:デフォルトの名無しさん
12/01/28 00:37:44.02
std::map<boost::shared_ptr<Hoge>, value_t>から要素を生ポインタで検索したいという状況に陥ったのだけど、何かいい手はないですか?
とりあえず動くコードとして、
mapの要素を巡回してshared_ptr<Hoge>::getの返り値と検索キーを比較
一致していたらそのイテレーターの指す要素をmから削除
としているのですが、これではO(N)になってしまいmapの利点を生かせません


566:デフォルトの名無しさん
12/01/28 00:44:01.91
生ポインタをキーにする。

567:デフォルトの名無しさん
12/01/28 01:03:22.81
スマポをキーにしようという発想が理解できない

568:デフォルトの名無しさん
12/01/28 01:44:20.83
検索キーになるポインタをshared_ptrに放り込む。
カスタムデリータに何もしない関数を指定してdeleteを防ぐ。
でも危険度は生ポインタをキーにするのとかわらないな。

569:デフォルトの名無しさん
12/01/28 09:47:26.46
>>568
それって別ポインタとみなされて比較うまくいかないと思うけど

570:デフォルトの名無しさん
12/01/28 14:08:13.74
コードが長くなってきたので、クラスの宣言と定義を、hとcppに分けたいのですが
下記のような場合、どう分ければいいでしょうか?

class Hoge {
private:
 const int m_x;
public:
 Hoge(int x = 3) throw() : m_x(x) {
  //do something 1
 }
 void func(int a = 5) {
  //do something 2
 }
};

571:デフォルトの名無しさん
12/01/28 14:31:36.35
// Hoge.h
struct Hoge {
Hoge(int x = 3);
void func(int a = 5);
private:
const int m_x ;
};

//Hoge.cpp
#include "Hoge.h"
Hoge(int x) : m_x(x) { do_something_1(); }
void Hoge::func(int a) { do_something_2(); }


572:デフォルトの名無しさん
12/01/28 14:46:52.59
>>571
ありがとうございます
理解できました

573:デフォルトの名無しさん
12/01/29 16:27:31.12
Cを独学で学んでいる入門者です
コンパイル→実行について教えてください

PCは富士通のノートパソコンで
OSはvista home premium
エディタはemacs
コンパイラはMinGW
です

ソースファイルをコンパイルして実行する際、
M-x compile
だと上手くいかないので、

M-x shell
から
>gcc -std=c99 ファイル.c
でコンパイルしています

ただ、毎回gcc -std=c99を書き込むのは煩わしいし、複数のソースファイルをコンパイルして実行する方法がわかりません。

Emacsで複数のソースファイルをC99で?コンパイルして、実行する効率的なやり方が知りたいです

574:デフォルトの名無しさん
12/01/29 16:40:29.72
IDE(統合開発環境) vs emacs(テキストエディタ)
スレリンク(prog板)

575:デフォルトの名無しさん
12/01/30 07:41:57.55
>>573
make
もしくはbatかシェルスクリプト

576:デフォルトの名無しさん
12/01/30 07:46:48.53
ふつうmakeだろ

577:デフォルトの名無しさん
12/01/30 08:57:23.22
GetOpenFileName/GetSaveFileNameで
lpstrFileに確保するバッファの大きさを決めるにあたって
あらかじめ受け取るファイル名の長さを取得できないでしょうか。

長さが足りない場合再起不能だし、かといって使われないのに数キロも確保したくないし
それでも足りない場合だってあるだろうし。

GetWindowTextに対するGetWindowTextLengthのような
関数があればよいのですが、この場合ユーザーからの入力なので
どうしたものやら。

578:573
12/01/30 09:04:33.22
ありがとうございます。

Makeの使い方を調べてみます。

579:デフォルトの名無しさん
12/01/30 10:32:00.09
>>577
MAX_PATH分確保しとけばいいだろ

580:デフォルトの名無しさん
12/01/30 10:36:18.61
大きなバッファを用意しても、260文字以上は格納されないんですか?

581:デフォルトの名無しさん
12/01/30 11:04:06.02
WinAPIならファイル名読むタイプのAPIは大抵バッファに読み込んだ文字数返るから
その文字数とバッファ長比べてバッファが足りてないと判断したら失敗とみなしてバッファを伸ばしてリトライすればいいよ

582:デフォルトの名無しさん
12/01/30 11:12:39.59
つーか、そもそもCommonDialogで256文字以上返せるのか?
そうでないなら260どころか、257で充分だ。

583:デフォルトの名無しさん
12/01/30 11:22:41.08
URLリンク(msdn.microsoft.com)(VS.85).aspx

584:デフォルトの名無しさん
12/01/30 21:01:42.03
仮想関数の戻り値が、継承先の型でもOK、っていうルールの名前を何ていったっけ?

585:デフォルトの名無しさん
12/01/30 21:11:23.37
共変性かな

586:584
12/01/31 07:55:25.34
>>585
それだ!ありがとー!

587:577
12/01/31 16:47:56.33
おお、ディレクトリ含めて260文字とかいれたら、無効ですって言われた・・・
ってことは、260文字以上入れたかったら、自分でダイアログ作れってことか・・・

588:デフォルトの名無しさん
12/01/31 17:03:36.11
32ビットWindowsなんだけど
アクセスして良いポインタかどうかを判定しようとしていて

ぬるぽ 0
初期化されてない有効なヒープ 0xcdcdcdcd
解放されたヒープ 0xfeeefeee

この他に、一見してアクセスできなそうなポインタって何かあるかな。

589:デフォルトの名無しさん
12/01/31 17:06:29.89
そんなんで判断するなよ

590:デフォルトの名無しさん
12/01/31 17:07:41.88
0xdeafbeef
0xdeaddead
0xbeaffeed

591:デフォルトの名無しさん
12/01/31 18:05:29.85
自分で確保してない領域にアクセスすんな。

592:デフォルトの名無しさん
12/01/31 19:51:41.31
外部から渡される未知のポインタなんよ

593:デフォルトの名無しさん
12/01/31 20:47:10.19
なにそれ怖い

594:デフォルトの名無しさん
12/01/31 20:50:48.03
悪魔召喚ポインタ

595:デフォルトの名無しさん
12/01/31 21:17:34.81
絶対に逆参照してはいけな

596:デフォルトの名無しさん
12/01/31 21:23:31.08
書き込んだ名前の人間は必ず死ぬという死神のポインタ


597:デフォルトの名無しさん
12/01/31 21:26:01.82
C系列って恐ろしい言語だったんだな

598:デフォルトの名無しさん
12/01/31 21:29:14.36
しょうもないネタには食いついてやがんの


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch