トップページ⇒tech
1001コメント330KB

【初心者歓迎】C/C++室 Ver.54【環境依存OK】

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2008/05/14(水) 01:00:02
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.53【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1208989385/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0809デフォルトの名無しさん2008/06/10(火) 11:46:51
DWORD foo = 1;
TCHAR bar = foo;
但し、桁あふれに注意。
0810デフォルトの名無しさん2008/06/10(火) 15:12:36
C言語で、標準出力する際のタブ(もしくはスペース)の幅を揃えることって出来ますか?
「char型データ(\t)int型データ(\t)int型データ(\t)double型データ(\n)」
この形式で、保存されている分(1件〜無制限)だけデータを表示させたいのですが、
char型データは最大で全角20文字で、この文字数によって表示が崩れてしまいます。
08118102008/06/10(火) 15:24:03
すみません、ちょっと説明が足りなかったかも。

氏名      英語  数学  平均
ほげ       20   21   20.5
名無しのごんべ 100  100  100.0

このように揃えたいのですが、現状だと

名前 英語 数学 平均
ほげ  20  21  20.5
名無しのごんべ 100 100 100.0
名無し 50  50  50.0

このように表示されてしまいます。
0812810=8112008/06/10(火) 15:24:55
ずれてたorz
0813デフォルトの名無しさん2008/06/10(火) 15:26:06
>>810
それはchar型ではなく、char配列だろ。

と言うのはさておき、printf()を使えば済む話なのか?
printf("%20.20s\t%12d\t%12d\t%24.20g\n", string, int1, int2, double1)
0814デフォルトの名無しさん2008/06/10(火) 15:49:51
>>813
そうでした、ご指摘ありがとうございます。

printf("%40.40s\t%d\t%d\t%0.1f\n",p->name,p->english,p->mathematics,p->average);
このように記述したところ、一応揃いました。
ただこの構造体は、毎回標準入力でデータを保管していくので、氏名の文字数も毎回変わります。
その都度(全データにおけるの氏名の最大文字数)に合わせて幅を変えたいのですが、可能でしょうか?
そんなのねえよ!というのであれば、ここで諦めるのですが・・・。
0815デフォルトの名無しさん2008/06/10(火) 16:05:56
>>814
printf("%*s", 40, "string")
0816デフォルトの名無しさん2008/06/10(火) 19:52:04
怖い構造体書くなぁw
0817デフォルトの名無しさん2008/06/10(火) 20:12:48
C++の頂点を極めあらゆる質問に答えて下さる皆さんに質問があります。

VS2003のVC++のGDI+なんですが、
Font font = new Font(dc, &logfont);
とするとフォントをインスタンス化できますけど、logfontのフォント名に
"@MSゴシック" のように横に傾くフォントを指定すると、うまく指定され
ないように思われます。

たとえば

LOGFONT lf1, lf2;
lf1.lfFaceName = "@MS ゴシック"
Font* font = new Font(dc, &lf1);
font->GetLogFontW(&graphics, &lf2);

というように確認してみると、lf1には確かに"@MS ゴシック"がセットされて
いるのに、lf2には"@"が外れて"MS ゴシック"がセットされてしまいます。

私は何を勘違いしてるでしょうか?
0818デフォルトの名無しさん2008/06/10(火) 20:25:33
とりあえずC++とはまったく関係ないな
08198172008/06/10(火) 20:31:54
環境依存なものでもOKじゃないんでつか…
ぷーん
それじゃ他のトコで質問してきます…
0820デフォルトの名無しさん2008/06/10(火) 21:17:12
関数ポインタの配列の様に、クラスの配列を作ってみようと思ったのですがなかなか上手く行きません。
どのように書けばいいのでしょうか

#include <iostream>
using namespace std;

class A {
public: virtual void func() { cout << "func A" << endl; }
};

class B {
public: virtual void func() { cout << "func B" << endl; }
};

enum COMMAND { FUNCA_CMD, FUNCB_CMD, EoC };
int main()
{
A a;
B b;
void (*f[EoC]) = { &a, &b };
//(*f[FUNCA_CMD])->func(); エラー
return 0;
}
0821デフォルトの名無しさん2008/06/10(火) 21:46:35
共通の基底クラスが必要(ほかにも方法がないわけではないが)。
class Base {
public:
  virutal void func() = 0;
}
class A : public Base {
public:
  virtual void func() { cout << "func A" << endl; }
};
class B : public Base {
public:
  virtual void func() { cout << "func B" << endl; }
};
int main()
{
A a;
B b;
Base* f[2] = {&a, &b};
f[0].func();
f[1].func();
}
0822デフォルトの名無しさん2008/06/10(火) 21:53:00
ありがとうございます。
次は示して頂いた物をテンプレートを使って再現できないか弄ってみます。
0823デフォルトの名無しさん2008/06/10(火) 22:01:45
どこをテンプレート化するか興味があるので、出来たら成果を見せてくれないか。
0824デフォルトの名無しさん2008/06/10(火) 22:28:36
あ、他にも方法があると聞いてテンプレートで出来るのかと思っただけです。
template < class _T >
sub( _T & t )
{
A aa;
B bb;
t F[2] = {&aa, &bb}; // error
}
int main()
{
A a;
sub ( a )
}
なんだか二度手間っぽくて面倒だし、型もBはAに出来ないと言われちゃいましたw
0825デフォルトの名無しさん2008/06/10(火) 22:35:02
t F[2]はおかしいだろ
0826デフォルトの名無しさん2008/06/10(火) 22:36:55
まぁ、一つずつ知識を深めていけば良いと思うよ。
0827デフォルトの名無しさん2008/06/10(火) 23:02:03
深みにはまると大変なのでテンプレートはほどほどに。
0828デフォルトの名無しさん2008/06/11(水) 01:37:31
テンプレートクラスのプライベートなメンバを <<演算子 で出力可能にするため↓

#include <iostream>

template < class T >
class test
{
friend std::ostream& operator<< ( std::ostream& os, test< T > t );
public:
void set( T val ) { x = val; }
private:
T x;
};

template < class T >
std::ostream& operator<< ( std::ostream& os, test< T > t )
{
os << t.x;
return os;
}

↑のようにfriend宣言したとき、

int main()
{
test< int > t;
t.set( 5 );
cout << t << endl;
}

とするとエラーが出るのですがなぜでしょう・・・。orz
テンプレートクラスでなければ問題なく動くのですが・・・。
0829デフォルトの名無しさん2008/06/11(水) 02:01:02
多分

template < class T >
class test
{
friend template< class U > std::ostream& operator<< ( std::ostream& os, test< U > t );
public:
void set( T val ) { x = val; }
private:
T x;
};

本当は知らない。
0830デフォルトの名無しさん2008/06/11(水) 02:02:03
>>828
エラーメッセージぐらい貼ろうぜ。

どうせ friend の <> なんだろうけど。
0831デフォルトの名無しさん2008/06/11(水) 02:08:06
初心者で、且つ馬鹿な人にとっては、
エラーメッセージは「エラー」という意味しか持たないものだから、
どういうエラーが出たかを書くという行為にまったく意味を見出せないんだろうね。

いつか胃ガンにでもなった時、「病気である」とだけ解釈してどういう病気かまったく興味を持たず、
呑気に胃薬飲み続けて死ねばいいと思うよ。
0832デフォルトの名無しさん2008/06/11(水) 04:30:56
エラーはコンパイル時エラーではなく
実行時クラッシュです・・・
0833デフォルトの名無しさん2008/06/11(水) 04:31:19
追記すると、つまりエラーはありません。
コンパイルは通るのです。
0834デフォルトの名無しさん2008/06/11(水) 04:59:21
コンパイラは何よ?
テンプレート周りにバグ抱えてる処理系はまだまだ多いぞ
0835デフォルトの名無しさん2008/06/11(水) 05:09:42
デバッグの勉強をする段階に来たって事じゃないの。
0836デフォルトの名無しさん2008/06/11(水) 07:40:39
>>832-833
実行時クラッシュでもエラーメッセージは出てるだろ?
そうじゃなけりゃ何を見て「実行時クラッシュ」だと思ったのさ?
0837デフォルトの名無しさん2008/06/11(水) 08:48:19
あのコードってコンパイル通る方がおかしくね?
どうせ答えは>>830だろうけど。
0838デフォルトの名無しさん2008/06/11(水) 17:11:00
>>829
VC9だけど通らない

Temaplate1.obj : error LNK2019: 未解決の外部シンボル "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class test<int>)"
(??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$test@H@@@Z) が関数 _main で参照されました。
C:\Documents and Settings\*****\My Documents\Visual Studio 2008\Projects\Learn1\Debug\Temaplate1.exe : fatal error LNK1120: 外部参照 1 が未解決です。
0839デフォルトの名無しさん2008/06/11(水) 17:12:52
template <class T>
class test {
 template <class U>
 friend std::ostream& operator<<(std::ostream& os, test<U> t);
public:
 void set(T val ){ x = val; }
private:
 T x;
};

これなら通るし正常に動く
0840デフォルトの名無しさん2008/06/11(水) 18:19:36
クラス型のvectorからfindしたい場合で上手くいかないケースがあります。
class Hoge{
 int nhoge;
public:
 operator==(Hoge hoge){
  if(this->nhoge == hoge.nhoge){ return true;
  }else{ return false; }
 }
 hoge(int nhoge){ this->nhoge = nhoge; }
}

class Hogehoge{
 std::vector<Hoge> vHoge;
public:
 std::vector<Hoge> getVhoge(){return vhoge;}
 void push_back(Hoge hoge){vHoge.push_back(hoge);}
}
main関数以下次レス。
08418402008/06/11(水) 18:20:13
>>840の続きです。

int main(){
 Hoge hoge1(1), hoge2(2), hoge3(3), hoge4(4);

 Hogehoge hogehoge;
 hogehoge.push_back(hoge1);
 hogehoge.push_back(hoge2);
 hogehoge.push_back(hoge3);

 std::vector<Hoge>::iterator itrHoge;
 itrHoge = std::find(hogehoge.getVhoge().begin(), <-ここがおかしい
 hogehoge.getVhoge().end(),hoge2);
 hogehoge.insert(itrHoge,hoge4);
 return 0;
}
とかいう感じでやりたいんですが、findのところで上手くイテレータを返してくれません。
hogehoge.getVhoge()を一時変数std::vector<hoge> tmpVhogeなどに格納してから
std::find(tmpVhoge.begin(),tmpVhoge.end(),hoge2)
などとやれば動くのですが、一時変数ではなく実体を直接いじりたいのでこれだと上手くないです。
原因がおわかりになるでしょうか?また、解決策はありますでしょうか。
コンパイラはcygwinのg++です。よろしくお願いします。
0842デフォルトの名無しさん2008/06/11(水) 18:24:35
>>840
getVhogeがvHoge自身ではなくvHogeのコピーを返してるから
実体を直接いじりたいなら
std::vector<Hoge> &getVhoge(){return vhoge;}
08438402008/06/11(水) 18:43:31
>>842
それでしたorz
とても助かりました。ありがとうございます。
Effective C++にも似たようなことが書いてあったので読んで修行します。
0844デフォルトの名無しさん2008/06/11(水) 20:03:13
C++覚えたての初心者です。

ベンチマークソフトと言ったら大袈裟ですが
HDDの単純な読み書き性能テストを行える
ソフトを作ろうかと思ってます。

単純にファイルの読み書きを100回位やった
ラップタイムを計測しようと思っています。

ベンチマークソフトのHDD性能計測ってなんか
凄いロジックとか使ってるんでしょうか?
C++じゃダメで何か他の言語じゃないと
いけないとかあるんでしょうか?

アドバイスをお願いします。
0845デフォルトの名無しさん2008/06/11(水) 20:34:25
だいたいそういうベンチは、OSのキャッシュにやられて、
メモリ/CPUの速度を測るオチになる
0846デフォルトの名無しさん2008/06/11(水) 20:52:02
OSのAPIを叩いてCPUのキャッシュサイズを評価してスコアを出す≒HDDのベンチマークソフト
0847デフォルトの名無しさん2008/06/11(水) 21:55:06
vectorを指すイテレータを使ってinsertしたとき、
挿入が終わったあとにイテレータが指している要素が
場合によって変わってしまう現象が起こります。

具体的には
vector:12345 iterator:3 vector.insert(iterator,6)
をやったときに
vector:126345 iterator:6
となる場合と
vector:126345 iterator:3
となる場合があります。
ちなみに前者は大きめのコードを書いてcygwin g++でコンパイル、
後者は検証用に仮想マシンのvine Linux上で書いてg++でコンパイルしてます。
原因等わかりますでしょうか。
0848デフォルトの名無しさん2008/06/11(水) 21:58:56
>>847
変わるのは仕様
メモリ確保しなおすからアドレスが変わるの

イテレータセットしなおすかlist使うとかしてください
08498482008/06/11(水) 21:59:43
すいません見なかったことにしてください
08508472008/06/11(水) 22:05:19
すんません書き方が分かりづらかったです。
イテレータの位置が変わるのはいいのですが、
・insertした要素を指すように変わる
・insert前に指していた要素を指すように変わる
場合が発生して、どちらかに統一されていないので困るという話です。
insert後のイテレータの位置は保障されないってだけの気もしてきました。
だとしたらなんて不便なんだvector…
0851デフォルトの名無しさん2008/06/11(水) 22:06:34
google: iterator 無効化
0852デフォルトの名無しさん2008/06/11(水) 22:10:53
>>850
単独ならinsertの戻り値
08538472008/06/11(水) 22:11:03
>>851
orz
ありがとうございます。

ランダムアクセスイテレータを前提にしたコードなので今更listにするわけにもいかず…。
いちいちinsertする度にfindするしかなさそうですね。遅くなりそうだ…。
08548472008/06/11(水) 22:15:22
>>852
それだ(;´Д`)上手く行きました!どうもありがとうございます!
0855デフォルトの名無しさん2008/06/11(水) 22:38:55
struct na *ni();

って関数があったとき、

void mein() {
  struct na = *ni();
}

って呼び方あってる?
0856デフォルトの名無しさん2008/06/11(水) 22:41:39
main(){
  printf("A");
  sleep(1);
  printf("B");
}
としてもABが同時に表示されるのは何故ですか?
sleep(1) を system("sleep 1") としても同じです。
コンパイラは gcc version 4.1.2 20061021 prerelease (NetBSD nb3 20061125) です。
0857デフォルトの名無しさん2008/06/11(水) 22:44:13
同時って意味わからん。AとBが同じ行に出るのは\nが不足しているから。
AとBが重なって出るようなら端末がしぼん
0858デフォルトの名無しさん2008/06/11(水) 22:45:17
>>856
setvbuf でググるよろし
0859デフォルトの名無しさん2008/06/11(水) 22:45:26
あ、判った。stdioのバッファリングの事を言ってるんだな。
切ってしまうか必要に応じてfflushするか、stderrに出力するか
0860デフォルトの名無しさん2008/06/11(水) 22:45:32
>>856
バッファの問題じゃないかな
printf("A");
fflush(stdout);
sleep(1);
printf("B");

ってやってみては?
0861デフォルトの名無しさん2008/06/11(水) 22:45:40
>>855
ni()の仕様による。mein()ので正しい場合もある。

>>856
printf()の出力がバッファリングされているから。間にfflush(stdout)
とか入れると意図どおりになるかと。

0862デフォルトの名無しさん2008/06/11(水) 23:05:25
>>858-861
ありがとうございます。
最近の悩みが解消した気がします。
0863デフォルトの名無しさん2008/06/11(水) 23:16:04
while(1){
fgets(buff,sizeof(buff),stdin);
if(!strcmp(buff, "A\n")){
.....
}
上のプログラムで、何故かループ2週目からのfgetsでキーボードからの入力を待機せずにそのままif文に入ってしまいます。
どなたか原因を教えていただけないでしょうか(´・ω・)
0864デフォルトの名無しさん2008/06/11(水) 23:17:01
>>863
buff が小さすぎるんじゃね?
0865デフォルトの名無しさん2008/06/11(水) 23:17:37
VisualStudio2005 core2duoマシンで
win32API勉強中なんですが、

CreateProcess("hoge.exe",..., pInfo);
WaitForSingleObject(pInfo.hProcess, INFINITE);
DeleteFile("hoge.exe");

とやると たまに DeleteFileが失敗するときがあります。
アクセス拒否 5 を返してるようです。
まだプロセスが終了していないということなのでしょうか。
0866デフォルトの名無しさん2008/06/11(水) 23:18:19
入力がバッファに残ってるから

移植性のある解決方法としては空読みして捨てるしかない
08678632008/06/11(水) 23:18:34
buffは256とってあるのですが、足りないですかね
08688632008/06/11(水) 23:22:19
>>864
更にbuffを増やしてみたら解決しました。アドバイスありがとうございます!
0869デフォルトの名無しさん2008/06/12(木) 00:42:08
typedef struct tagSerialParam {
DWORD dwBaudRate; // 取り得る値 9600/19200/38400
BYTE byByteSize; // 取り得る値 4/5/6/7/8
・・・ // 上記以外の5個ほどの変数
}SERIAL_PARAM;

CSerialCom::Open(SERIAL_PARAM *pParam)
{
// 引数チェック {・・・}
// dcb構造体に代入
GetCommState(hComm, &dcb);
}

上記のような型が違う可変の引数を複数チェックをする場合、
みなさんならどのように実装しますか?
ケースバイケースと言われそうな気もしてますが、
ソースコードの可読性を優先して実装案をお願い致します。
0870デフォルトの名無しさん2008/06/12(木) 06:05:43
int sum(int min,int max){
int num;
num = min + max;
return num;
}

例えばこれだったら

int sum(int min,int max){
return min + max;
}

でもいいと思うんだけど
そうしないのが慣習なのは見やすくするため?
0871デフォルトの名無しさん2008/06/12(木) 07:42:18
>>869
構造体チェック用の関数を作る
さらに構造体メンバそれぞれについてチェック用の関数を作る

構造体自身を隠蔽して(不完全型)セッターでのアクセスしかできないようにする

C++ならセッターで制限する
0872デフォルトの名無しさん2008/06/12(木) 08:52:53
>>870
そこまで短いコードだったら下1択でいいと思うよ。
0873デフォルトの名無しさん2008/06/12(木) 12:44:49
>>870
書き方がまちまちだと気持ち悪いから統一する
自分のルールに則ってるだけ
自分ルールでOKなら下でいいんじゃないかな

複数人開発なら気持ち悪いの度合いが違うからルールを統一する
このときはルールを厳しくした方が例外出にくいから上の書き方に統一したりする
0874デフォルトの名無しさん2008/06/12(木) 13:25:05
>>870
そんな慣習無いだろ。無駄だよ。
0875デフォルトの名無しさん2008/06/12(木) 13:39:26
デバッガで止めたい時もあるからなあ
0876デフォルトの名無しさん2008/06/12(木) 14:09:45
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6880.txt
これを実行して
性別のとこで1と入力しても結果が「性別不明」になってしまいます
どうしてですか?
0877デフォルトの名無しさん2008/06/12(木) 14:11:05
>>872-875
ありがとうございます
もし誰かと何か作ることになったら周りの人に合わせる感じでいきます
0878デフォルトの名無しさん2008/06/12(木) 14:17:42
>>876
最初の if 文の条件が成立してもしなくても、2番目の if 文が実行されるから
0879デフォルトの名無しさん2008/06/12(木) 14:21:32
>>878
解決しました
ありがとうございます
0880デフォルトの名無しさん2008/06/12(木) 14:24:49
std::stringって、何でvectorとかと同じメソッドがついてるの?
0881デフォルトの名無しさん2008/06/12(木) 14:30:58
>>880
「コンテナ」として同様に扱うことができるようにするため。
このための要件はコンセプトとして定義されている。
http://www.sgi.com/tech/stl/Container.html
0882デフォルトの名無しさん2008/06/12(木) 14:31:49
何を訊きたいのかが不明瞭だなぁ。
「vectorとかと同じメソッド」というのは「コンテナと同じメンバ関数」という意味だろうけど、
「同じ」というのは関数名のこと? 機能まで含めてのこと?
0883デフォルトの名無しさん2008/06/12(木) 16:35:31
グローバル変数をstaticつけて宣言するのって、つけない場合とで何らかの違いが現れますか?
どちらの場合も同じような寿命を持つ気がするのですが、区別するべきですか?
0884デフォルトの名無しさん2008/06/12(木) 16:38:36
別のファイルで同じ名前付けたやつ作ってもだいじょぶ
0885デフォルトの名無しさん2008/06/12(木) 16:45:22
そういった効用があるのですね、ありがとうございます。
0886デフォルトの名無しさん2008/06/12(木) 16:51:23
無名名前空間を使うほうがオススメだと聞いた。
0887デフォルトの名無しさん2008/06/12(木) 18:28:04
どなたか、お暇な方いましたら教えて下さい。

ある処理の実行時間を計測しようと思い、次のようなコードを書いたのですが、うまく動きません。

int main()
{
s=GetTickCount();
{ // 処理 }
e=GetTickCount();
cout << s; cout << e; cout << e-t << endl;
return 0;
}

このようなコードをコンパイル、実行すると、sとeが一致してしまいます。
一体なぜなのでしょうか?
どなたか、ご回答よろしくお願いします。
0888デフォルトの名無しさん2008/06/12(木) 18:42:37
分解能より短い時間で処理終わってるんじゃね?
試しに処理のとこにSleep()入れてみては
08898872008/06/12(木) 19:21:15
sleep入れたら、計測できました。
GetTickCountで時間を取得するタイミングをずらしても計測できました。
でも、

s=GetTickCount();
{ // 処理 }
e=GetTickCount();

みたいにすると、計測できません。
一体なぜ?
極端に短い時間で処理が終了した?
うーん…。

とにかく、ご回答下さった皆さん、ありがとうございました。
0890デフォルトの名無しさん2008/06/12(木) 19:27:02
>>888が書いてくれた内容まともに読んでいないようだな…。
0891デフォルトの名無しさん2008/06/12(木) 21:10:50
>>886
明確なメリットってあるの?
0892デフォルトの名無しさん2008/06/12(木) 21:19:50
staticをつけての内部リンケ−ジは
C++的には「非推奨」なんで将来なくなるかも知れない
現実にはありえないだろうけど
0893デフォルトの名無しさん2008/06/12(木) 21:29:44
>>889
最適化で、無意味処理として削られたんじゃないの?
ちなみにSleep()は削られないから測定可能。
0894デフォルトの名無しさん2008/06/12(木) 21:55:04
GetTickCount()の替わりにQueryPerformanceCounter()
使ったらいいんじゃね?

SetPriorityClass()で他のプロセスの影響を最小限に
抑えておかないと測定の度にバラツキが出やすいけど
0895デフォルトの名無しさん2008/06/12(木) 23:39:48
(質問)
C++です。プリプロセッサでsizeof(int)に応じて新しい型を定義したいのですが、
こういうことって不可能なんでしょうか?
0896デフォルトの名無しさん2008/06/12(木) 23:41:13
>>891
クラスなど、無名名前空間にできてstaticでは不可能な
ものがあるということが大きな違いだと俺は思っている。

もともとの趣旨はstaticを静的確保の意味だけにする
(可視性制御の意味をなくす)ということだったと思うけど。
0897デフォルトの名無しさん2008/06/12(木) 23:43:06
>>895
struct hoge;に対してsizeof(hoge)の結果を任意に決めたいってこと?
08988952008/06/12(木) 23:48:34
>>897
いえ、例えば
#if sizeof(int) == 4
#define int32 int
#elif sizeof(int) == 8
#define int64 int
#else
#error("unsupported")
#endif
といったような感じです。通りませんけど。
0899デフォルトの名無しさん2008/06/12(木) 23:51:08
>>898
目的がよく分からないんだけど
int と書いたほうが処理速度が速くなるんじゃなくて
処理速度が速いものが int だと思ったほうがいいよ
0900デフォルトの名無しさん2008/06/12(木) 23:51:40
それを自分でやりたい理由が分からんが。
intのサイズは処理系依存で、大抵はその処理系のヘッダファイルにサイズ保証の整数型がtypedefされている。
09018952008/06/12(木) 23:54:58
>>899-900
まあ上の例はただの例なんですけど、
やっぱりできないみたいなのでまた別の方法を考えてみます。
どうもありがとうございました。
0902デフォルトの名無しさん2008/06/12(木) 23:56:06
sizeofの結果が得られるタイミングって、コンパイラによって違うんだっけ
0903デフォルトの名無しさん2008/06/12(木) 23:56:40
C99だと場合によっては実行時だしな。
0904デフォルトの名無しさん2008/06/12(木) 23:58:34
じゃあ必然的にプリプロセッサには使えないな
0905デフォルトの名無しさん2008/06/13(金) 00:00:49
>>871
レスありがとうございます。
以下の認識でOKですか?

>構造体チェック用の関数を作る
>さらに構造体メンバそれぞれについてチェック用の関数を作る
→bool CSerialCom::CheckParam(SERIAL_PARAM *pParam) { bool ret = checkBaud(pParam->dwBaudRate); ...}

>構造体自身を隠蔽して(不完全型)セッターでのアクセスしかできないようにする
>C++ならセッターで制限する
→bool CSerialCom::Open() {}
bool CSerialCom::SetParam(void *pParam) {... m_Param = *(SERIAL_PARAM *)pParam) ...}
0906デフォルトの名無しさん2008/06/13(金) 00:04:33
>>898の例は意味わからんけど、
型のサイズに応じて別な型をtypedefするってことなら
まさにテンプレートの領域じゃないか?
selector<sizeof(hoge)>::fuga_type fuga; // hogeのサイズによってfugaの型が変わる
0907デフォルトの名無しさん2008/06/13(金) 00:45:05
指定ビット数の整数型が欲しいなら、<stdint.h>使えばいいよ。
0908デフォルトの名無しさん2008/06/13(金) 00:54:36
結局何をやりたいのか言わずに去ったからな。
レス数が900を超えています。1000を超えると表示できなくなるよ。