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

スレを勃てるまでもないC/C++の質問はここで 4

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/09/17(水) 15:41:48
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
0482デフォルトの名無しさん2008/12/04(木) 18:32:53
>>479-
ありがとう、また文字を表示する作業から勉強しなおしてきます
0483デフォルトの名無しさん2008/12/05(金) 09:10:33
void * (*)(void *) 型の意味を教えてください
0484デフォルトの名無しさん2008/12/05(金) 09:34:16
なんかよく解らんポインタを引数にとって、なんかよく解らんポインタを戻す関数へのポインタ
0485デフォルトの名無しさん2008/12/05(金) 09:38:40
それなりに的確な説明なのに何故か笑ってしまったw
0486デフォルトの名無しさん2008/12/05(金) 11:47:41
日本語のcdeclプログラムを作ってみないか?
0487デフォルトの名無しさん2008/12/06(土) 10:25:01
どこまでを設計と呼ぶのやら
0488デフォルトの名無しさん2008/12/06(土) 10:27:23
すっまん。誤爆だ。忘れてくれ。
0489デフォルトの名無しさん2008/12/07(日) 10:30:31
アクセス制御ってぶっちゃけあんまいらなくね?
0490デフォルトの名無しさん2008/12/07(日) 10:47:51
まぁ個人でやっている分には間違ってメンバ変数を弄って困ってしまうって状況は想像つかない。
アクセスできなくて困ることはあるが。
0491デフォルトの名無しさん2008/12/07(日) 17:10:34
ところで
int v(char *c){int i;sscanf(c,"%4d",&i);return htons(i);}
この関数をもっと短くする方法あるかな?
Code Golfの感じで。
引数のcharポインタは"YYYYMMDD"といった数字文字列の領域を指してると思いねぇ。
0492デフォルトの名無しさん2008/12/07(日) 17:32:09
>491
七行スレのログ読めば短くするノウハウが沢山あると思う
0493デフォルトの名無しさん2008/12/07(日) 18:38:38
>>491
先頭のintを省く
0494デフォルトの名無しさん2008/12/07(日) 23:11:37
charと*の間の空白も不要。
0495デフォルトの名無しさん2008/12/08(月) 08:24:27
POSIXスレッドのmutexロックって標準でデッドロックを回避してくれますか?
0496デフォルトの名無しさん2008/12/08(月) 11:20:15
>>495
いいえ
0497デフォルトの名無しさん2008/12/08(月) 11:47:46
http://www.geocities.jp/chacha_yhk1219/prog/prog001.html
↑を見てインターフェースクラスというものを知ったのですが
インターフェースクラスをスーパークラスとして実装を行った場合、
特定のサブクラスのみが持つようなメンバ関数にアクセスすることができないと思いました。
このサイトに書いてあるインターフェースクラスというものが間違いなのか、
それとも私の理解がぜんぜん足りていないのでしょうか。
どこが間違っているか、どこが理解不足かの指摘をお願いします。
0498デフォルトの名無しさん2008/12/08(月) 11:51:55
>>497
型キャストすれば特定のサブクラスのみが持つようなメンバ関数にアクセスすることができる。
reinterpret_castだったかな?
0499デフォルトの名無しさん2008/12/08(月) 11:54:55
異なるクラスを IExample として共通に扱いたいのであるから、
特定のサブクラスのみが持つ特殊なメンバ関数などには興味がないはずである
0500デフォルトの名無しさん2008/12/08(月) 11:55:17
例えばですが、
>>497のサイトでCExample3という、IExampleを継承したクラスを追加するとして、
IExampleがもしMethod2()というメンバ関数を持っていたら、
大幅な修正を加えないとMethod2を呼ぶことができないように思います。

理解が足りないのでしょうか…
C++は難しいです
0501デフォルトの名無しさん2008/12/08(月) 11:57:34
リロードせずに書き込んでしまいました。

>>498
レスをありがとうございます。
スーパークラスからサブクラスへのキャストはあまりよろしくないと聞きました。
実際は使っても良いものなのでしょうか。
それとももっと別の書き方をするのでしょうか。

>>499
レスをありがとうございます。
ということは、特殊なメンバ関数を使いたい場合には、
やはりどういったクラスがあるかを確認して、
そのクラスの型を持つポインタを用意する必要があるということでしょうか。
0502デフォルトの名無しさん2008/12/08(月) 11:58:37
しかも500はIExapmleがじゃなくてCExample3が、の間違いです。すみません
0503デフォルトの名無しさん2008/12/08(月) 11:59:21
なんか課題でテンプレートを使ってジェネリック関数のsearch(b,e,b2,e2)とcopy(b,e,d)と
partition(b,e,p)を定義しろってのがあったんだけどだれかおしえてくだしあ><
0504デフォルトの名無しさん2008/12/08(月) 12:00:59
なんとなくですが>>499さんの仰ることがぼんやりとわかった気がします。
頭の回転が遅いので、これをヒントにもっと考えてみます。ありがとうございます。
0505デフォルトの名無しさん2008/12/08(月) 12:03:45
>>504
Javaを学ぶと良い。言語仕様にInterfaceを含んでいる。
0506デフォルトの名無しさん2008/12/08(月) 12:04:01
>>501
特定のサブクラス固有の特殊なメンバ関数を使いたいというのは、
すべてのクラスを共通のインタフェイスで扱いたいという趣旨に反している
設計がどこかおかしい
0507デフォルトの名無しさん2008/12/08(月) 12:42:56
>>503
template<class T>void copy(T * b, T * e, T * d) {for (; b != e; ++b, ++d) *d = *b;}
他は仕様が余りに曖昧なのでパス。
0508デフォルトの名無しさん2008/12/08(月) 12:50:36
例えばこんなのとか?
template<typename FI, typename PRED>FI partition(FI b, FI e, PRED p)
{
if (b == e) return b;
while (p(* b)) if (++b == e) return b;
FI n = b;
while (++n != e) if (p(* n)) swap(* ++b, * n);
return b;
}
0509デフォルトの名無しさん2008/12/08(月) 14:05:26
p(* n)<ーどういう意味?
0510デフォルトの名無しさん2008/12/08(月) 14:11:07
イテレータbの指す値を引数にして関数オブジェクトpを呼ぶ
0511デフォルトの名無しさん2008/12/08(月) 14:11:41
すまん、イテレータnだった
0512デフォルトの名無しさん2008/12/08(月) 14:23:05
答えてくれてどうもありがとう。
でもなんか動作がほんの少しちがうようだ。原因は不明
0513デフォルトの名無しさん2008/12/08(月) 14:27:01
そりゃぁ、仕様を提示しないで動作が一致したら凄いと思うよ。
つーか、>508ってSTLの実装じゃないの?w
0514デフォルトの名無しさん2008/12/08(月) 14:33:51
virtual void UpdateMatrix( const Matrix &parent ){}

ここで「unused parameter 'parent'」のWarningが出てしまいます。

コンパイラを変える
コンパイラオプションを変える
#pragmaで抑制する
以外の簡単な解決法があれば教えてください。
0515デフォルトの名無しさん2008/12/08(月) 14:39:34
virtual void UpdateMatrix( const Matrix & ){}
0516デフォルトの名無しさん2008/12/08(月) 14:48:54
>>515
�d
なんで気付かなかったんだろ
0517デフォルトの名無しさん2008/12/08(月) 14:51:06
気付くという話じゃない。文法書読め。
0518デフォルトの名無しさん2008/12/08(月) 21:46:41
#include <stdio.h>

class   CHoge
{
    const int path; //  ここでのconstがエラー?
public:
    CHoge();
    void    Show();
};

CHoge::CHoge(){ path = 1024; }

void    CHoge::Show(){  printf( "%d\n", path ); }

void    main()
{
    CHoge   hoge;

    hoge.Show();
}
上記のソースでコンパイルするのですが
error C2758: 'path' : オブジェクト コンストラクタの初期化リストで初期化されませんでした。
とコンパイルエラーがでます
const int path を int path にするとコンパイルは通るのですが、
pathをconstにして変更不可にしたい場合どのような手段があるのでしょうか?
0519デフォルトの名無しさん2008/12/08(月) 21:53:52
CHoge::CHoge(){path=1024 ;}
↓
CHoge::CHoge() : path(1024){}

constなんだから代入できるわけ無いだろカス
0520デフォルトの名無しさん2008/12/08(月) 22:10:07
ん?
ではどうしろと?
0521デフォルトの名無しさん2008/12/08(月) 22:14:11
ちゃんとどうしたらいいか書いてくれてるじゃないか
0522デフォルトの名無しさん2008/12/08(月) 22:17:27
>>521
参考書にはその書式載ってなかったんだ
ありがとう
0523デフォルトの名無しさん2008/12/08(月) 22:30:52
#include <stdio.h>

class   CHoge
{
    const int path
public:
    CHoge();
    void    Show();
};

CHoge::CHoge() : path(1024){} 

void    CHoge::Show(){
    char    lo[path];       // ここでエラー
    printf( "%d\n", path );  // ここはOK
}

void    main()
{
    CHoge   hoge;

    hoge.Show();
}
う〜ん
error C2057: 定数式が必要です。
error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。
error C2133: 'lo' : サイズが不明です。
とエラーがでるんですが、#define の変わりにはならないんでしょうか?
0524デフォルトの名無しさん2008/12/08(月) 22:34:22
C++ってconstなメンバに何の修飾もなくアクセスできるの?
CHoge::pathとかいろんな言語でありがちな書き方だと思うけど
0525デフォルトの名無しさん2008/12/08(月) 22:37:07
エラーが出た箇所よりも後ろについてここはOKと判断するのって危ないよねえ
0526デフォルトの名無しさん2008/12/08(月) 22:45:11
satic つけろ static
あとそうすると定義方法が変わるけど
0527デフォルトの名無しさん2008/12/08(月) 22:46:20
Cでは const 修飾した変数は定数として使えないけど
C++ではできるよ
0528デフォルトの名無しさん2008/12/09(火) 00:04:01
static const int path = 1024;
これ、クラス・関数外ならstaticは要らない。
0529デフォルトの名無しさん2008/12/09(火) 11:59:20
c++で例えば
while(a!=c) a++;この文ってa++だけ繰り返すんだよね?
0530デフォルトの名無しさん2008/12/09(火) 12:00:25
>>523
static ではない const は「インスタンス生成後に書き換えないよ」というだけで
コンパイル時に決定できないかも知れない。なので、
>#define の変わりにはならないんでしょうか?
ならない。ここは素直に頭に static 付けて、後ろに = 1024 付けるよろし。

但し、もし VC++ 6.0 だとこれもできないんで enum hack 使うしかない。

>>529
是。
0531デフォルトの名無しさん2008/12/09(火) 12:07:40
>>530
529だけどおkと解釈しますね
05325302008/12/09(火) 12:42:49
あああ「是」じゃわかんねーよ馬鹿>俺
そです。おk。
0533デフォルトの名無しさん2008/12/09(火) 13:02:42
>>529
a!=c も繰り返すよ、というのが正確だけどまあいいか
0534デフォルトの名無しさん2008/12/09(火) 14:23:28
>while(a!=c) a++;
なんでa=c;にしないの
0535デフォルトの名無しさん2008/12/09(火) 14:36:21
aとcの型がcopy constructibleとは限らないから他
0536デフォルトの名無しさん2008/12/09(火) 15:01:03
そこは assignment compatible というべきだな。
0537デフォルトの名無しさん2008/12/09(火) 15:43:06
オーバーロードしてて副作用があるかもしれない。
0538デフォルトの名無しさん2008/12/09(火) 16:28:47
>>536
言われてみればそうだな
指摘あんがと
0539デフォルトの名無しさん2008/12/09(火) 18:14:40
>532
大丈夫、中国語では「そう」って感じの意味だ
0540デフォルトの名無しさん2008/12/09(火) 18:43:19
是非
0541デフォルトの名無しさん2008/12/09(火) 19:59:20
宗介「肯定だ。」
0542デフォルトの名無しさん2008/12/09(火) 20:15:13
そーすけってポニョの?
0543デフォルトの名無しさん2008/12/10(水) 02:06:45
>>539
「是」は「はい」だ
「対」が「そう」に近い
0544デフォルトの名無しさん2008/12/10(水) 02:46:18
>543
対か。謝謝。
0545デフォルトの名無しさん2008/12/10(水) 08:30:11
元々、「是非」と言う言葉は「是が非でも」だ。
つまり、「「はい」ではなく「いいえ」だとしても」という意味だね。
0546デフォルトの名無しさん2008/12/10(水) 09:24:26
ここなんて中国語スレ?
0547デフォルトの名無しさん2008/12/10(水) 09:36:53
>>542
台詞からして、相良軍曹だな。
0548デフォルトの名無しさん2008/12/10(水) 12:46:39
ちょっとした疑問が浮かんだんですが、
scanf()は入力したものを受け取る関数だと思うのですが、
受け取れる箇所は1つだけなのでしょうか?

例:scanf("%d",&a)は10進数で受け取り、aに保存?すると思いますが
  scanf("%d",&a,&b)のように複数に保存できるようにはできないでしょうか?

変な質問でスマソ、意味がわからなかったら軽くスルーしてください orz
0549デフォルトの名無しさん2008/12/10(水) 12:48:08
//空白区切り
scanf("%d %d", &a, &b);
//コンマ区切り
scanf("%d,%d", &a, &b);
0550デフォルトの名無しさん2008/12/10(水) 17:40:07
scanf("%d",&a);
b=a;
とするしか。
0551デフォルトの名無しさん2008/12/10(水) 18:09:08
なるほど、一つの入力を「複数に保存」と捉えたのか。

馬鹿だな。
0552デフォルトの名無しさん2008/12/10(水) 21:41:53
Visual C++を使用していて、ちょっと困ってしまったので助けてください。
下記画像のようにスペース部分に色つき矢印やらドットやらが表示されて消えなくなってしまいました。
どこかでキーボード押し違えたみたいで・・
この設定の解除の仕方を分かる方いたら教えてください><
   ↓
http://imepita.jp/20081210/770880
0553デフォルトの名無しさん2008/12/10(水) 21:42:55
MAKEFILEでどうしても分からない事がありますので、 お教え願いたいのですが。
#-------------------------------------- リンカ(GUI)
linkexe = $(linkopt) -Tpe -aa
#-------------------------------------- リンカ(CONSOLE)
linkcon = $(linkopt) -Tpe -ap
#-------------------------------------- リンカ(DLL)
linkdll = $(linkopt) -Tpd -aa

linkconとlinkdllのマクロが使用されている箇所が、
この行以下にはありません。
しかし、linkconとlinkdllの記載を削除すると、リンク時にエラーが出ます。

$(name)T.EXE: FOO1.OBJ $(sobj) $(name)T.RES
$(linkexe) @&&|
$(C0GUI) FOO1 $(sobj)
$(linkout)$.
!if $(UseBCC)
$&
$(DebugLib) NOEH32 IMPORT32 CW32
!endif
$&.RES
|

質問
�@リンクエラーでは、 $(linkexe) @&&| という部分に関係がしていると思われるのですが、
@&&| の意味が分かりません。この意味について教えて頂けませんでしょうか。
または参考になるサイトがあれば、そちらを教えて頂きたいです。

�A$(linkout)$.
$. の意味も分かりません。
0554デフォルトの名無しさん2008/12/10(水) 21:46:49
>>553
Make専用スレへどうぞ。

>>552
VisualStudio専用スレへどうぞ。

どちらもC/C++の質問ではありませんね。
05555522008/12/10(水) 22:31:10
失礼しました。移動します。
またよろしくお願いします。
05565532008/12/10(水) 22:32:45
失礼しました。移動します。
またよろしくお願いします。
0557なめ2008/12/10(水) 22:39:29
ID 名前 性別

というフォーマットのファイルがあるとします。
これを、それぞれを文字列として、構造体に格納するとします。
構造体の例:
struct{
std::string a; // IDを格納
std::string b; // 名前を格納
std::string c; // 性別を格納
}_dataType;

各行には、上記の3つのレコードだけだとして、
区切り文字は、半角空白か、Tab('\t')
行末には空白文字は許容するけど、それは、構造体の「性別」を格納する変数には
含まない

てな条件で、データファイルを読み込む場合、
std::stringで、std::getline() を使う
char * で、fstream::getline()をつかう
char * で、fgets()を使う
その他
どれが一番楽なのか教えてほしいっす。できれば、切り分けするところのサンプルなんかも。。。

環境:gcc + cygwin
できれば、Linuxにも流用したいので、Win系のライブライは使いたくないです。
0558デフォルトの名無しさん2008/12/10(水) 22:45:46
>>557
http://pc11.2ch.net/test/read.cgi/tech/1226229627/57,60-61
0559デフォルトの名無しさん2008/12/10(水) 22:51:07
>>557
短絡的な意味で最も簡単なのはfscanfだろうね
0560デフォルトの名無しさん2008/12/10(水) 22:55:56
FILE * fp = fopen("foo", fp);
char tId[1000];
char tName[1000];
char tGener[1000];
fscanf(fp, "%999s%999s%999s", tId, tName, tGender);
fclose(fp);
_dataType foo = {tId, tName, tGender};
0561デフォルトの名無しさん2008/12/10(水) 23:16:19
>>551
え?
0562デフォルトの名無しさん2008/12/11(木) 09:02:29
>>551
そういう質問みたいだが。
>>548
>scanf("%d",&a,&b)のように複数に保存できるようにはできないでしょうか?

>>557
楽なのは stream I/O で >> 演算子。

>>560
無根拠に1000とか。
0563デフォルトの名無しさん2008/12/11(木) 10:21:06
scanf("%d %d",&a, &b)
としたいだけだろ。b)を全角で書くような奴の質問だぞ。
0564デフォルトの名無しさん2008/12/11(木) 10:41:12
scanf()使うなら戻り値もみとけ。
0565デフォルトの名無しさん2008/12/11(木) 11:56:03
bool型のフラグの状態を判定させるのって簡単になにかないですか?
if elseで場合わけしてっていうのならわかりますが
0566デフォルトの名無しさん2008/12/11(木) 12:09:06
「判定」と「場合わけ」の違いを定義してくれたまえ。
0567デフォルトの名無しさん2008/12/11(木) 12:13:53
場合分け: (p→r)∧(q→r)→(p∨q→r)
判定: (true→true)∨(false→false)
0568デフォルトの名無しさん2008/12/11(木) 12:18:57
bool で if/else より簡単な場合分けの方法があるのか・・・?
言いたいことがよくわからん。

複数のフラグをint型の変数に保存していて、その簡単な取り出し方法
ということなら (質問の意味は) わかるが。
0569デフォルトの名無しさん2008/12/11(木) 12:19:38
フラグの状態を判定じゃなくて"反転"でした・・・
すいません
0570デフォルトの名無しさん2008/12/11(木) 12:21:34
当然 ! よりも簡単な方法を求めているんだよね。
0571デフォルトの名無しさん2008/12/11(木) 12:22:20
if(flag == true) flag= false;
else flag = true;

これを一発でかけないものかと思ったんです
0572デフォルトの名無しさん2008/12/11(木) 12:33:14
flag=!flag;
0573デフォルトの名無しさん2008/12/11(木) 12:40:45
flag ^= true;

flagがtrue, 0以外の値を取るときはだめ
0574デフォルトの名無しさん2008/12/11(木) 12:49:02
まさしく flag = !flag; だな
0575デフォルトの名無しさん2008/12/11(木) 12:49:12
flag = (flag == true)? false: true; なんて書くなよ。
0576デフォルトの名無しさん2008/12/11(木) 12:55:36
そもそもif(flag==true)とか書いちゃう辺りが初心者だなあ
真偽値が入った変数ならif(flag)で良いのに
0577デフォルトの名無しさん2008/12/11(木) 13:42:55
>>576
if や while の条件式には比較演算子がないといけない、と
思い込む人が多いね。
0578デフォルトの名無しさん2008/12/11(木) 13:57:10
>>576
そうしたほうがわかりやすいから、わざわざそうしてるよ
0579デフォルトの名無しさん2008/12/11(木) 14:02:25
logical equalの単位元がtrueだからp==trueなんていうのはp*1とか書いてるのと同じぐらい冗長
0580デフォルトの名無しさん2008/12/11(木) 14:05:13
というお話だったのさ…
0581デフォルトの名無しさん2008/12/11(木) 14:05:36
心配症なもんで、 if ((flag==true) == true) と書かないと気が済まない。
0582デフォルトの名無しさん2008/12/11(木) 14:09:26
>>579
実行コードに差は出ないからどっちでもいいじゃん
■ このスレッドは過去ログ倉庫に格納されています