トップページ⇒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/
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
実行コードに差は出ないからどっちでもいいじゃん
0583デフォルトの名無しさん2008/12/11(木) 14:29:29
>>582
話題を実行コードに限定して「差は出ない」とか、どんだけ勝手なんだ。
0584デフォルトの名無しさん2008/12/11(木) 15:03:40
>>582
使ってない変数を放置とか、変数名に適当に連番つけちゃうタイプでしょ。
どうせ実行コードには関係ないしーって。
0585デフォルトの名無しさん2008/12/11(木) 15:48:09
>577
というより、初心者は条件式について誤解してるんだよな。
ifやwhileが条件式を要求してる=条件式を解釈してると思ってるみたいな。
・条件式は値を返す
・if、whileなどは値が真か偽かを見てるだけ
ということを理解出来たらそんな誤解しないんだけどね。
0586デフォルトの名無しさん2008/12/11(木) 16:00:46
俺はあえて比較することはあるな。
if((hoge=func()) != 0)

条件式の中で代入すんなって言われそうだがw
05875822008/12/11(木) 16:03:11
条件式いれた方が、万人にわかりやすいから、そうするだけ。
変数名はきちんとつけるよ
0588デフォルトの名無しさん2008/12/11(木) 16:15:01
>>586
hoge=func()がブール型でないなら、!= 0はありだと俺は思うよ。
ブール型なら、次のどっちかにするけど。
1.
hoge = func();
if (hoge)
2.
if (bool hoge = func())
0589デフォルトの名無しさん2008/12/11(木) 16:48:09
>>587
int i = 0; // iに0を代入

こんなコメント付けるタイプですね?
0590デフォルトの名無しさん2008/12/11(木) 17:10:38
>>589
いや、iを0で初期化、だよ。
0591デフォルトの名無しさん2008/12/11(木) 17:33:28
しない奴は、無い方がわかりやすいからしないんだよ。
0592デフォルトの名無しさん2008/12/11(木) 18:19:38
そうそう。余計なものは無いほうがよい


だからお前修正前のコードを#if 0で残しておくなって
0593デフォルトの名無しさん2008/12/11(木) 18:36:20
#if 0で残すことに対する常套句は
・戻したくなる時とかあるでしょ
・修正に至る経緯を知るためにも大切なんですよ
あたりかな。
0594デフォルトの名無しさん2008/12/11(木) 18:40:23
まともなVCS使え。
0595デフォルトの名無しさん2008/12/11(木) 18:53:13
ankhsvnって複数人がファイル追加などのプロジェクト変更を行うとプロジェクトファイルが
コンフリクト祭りになるんだけど、どうにかならない?
0596なめ ◆dHe9wXXwgk 2008/12/11(木) 21:44:46
>>559
ありがとうございます。
fscanf で、delimiterが、'\t'とか扱えるんですか?また、複数の' 'を1つの区切りとして扱えましたっけ?

>>560
ありがとうございます。
[1000]の部分は、可変長(極端な話、65535 とか)にしたいですが、その場合この方法だと難しいですよね

>> 562
>楽なのは stream I/O で >> 演算子。
ありがとうございます。
速度の面でどうなんでしょうか?
あと、delimiterが、TABの場合は可能でしょうか?
0597デフォルトの名無しさん2008/12/11(木) 21:48:19
なぜ、試してみないんだろう?
0598デフォルトの名無しさん2008/12/11(木) 22:12:51
まともなVCSつかえというくらいだからナイス返答を期待したんだが、だめか。
スレ違いながらもいい機会だと思ったのになー
vcprojファイル内の順番がぐちゃぐちゃにならない方法でもいいんだけど。
0599デフォルトの名無しさん2008/12/11(木) 22:36:31
任意の実数を底とする対数ってやっぱ底の変換公式を使って
double log2(double a,double b){
return log(b)/log(a);
}
とやるしかないんかのぉ。
0600デフォルトの名無しさん2008/12/11(木) 23:07:08
>>598
なんでプロジェクトファイルをみんなで弄るんだ?
つーか、Subversionスレに行けって。

>>599
ない。

>>596
1000が65536でも別に構わんと思うが。どっちみち、最大サイズの仮定なんだから。
0601デフォルトの名無しさん2008/12/12(金) 08:12:13
今unsigned型(10進数で最大値2,147,483,647)の変数にパスワードをユーザーから入力してもらうことを考えます。
ユーザーが入力するのは52進数か62進数のパスワードです。このとき変数がオーバーフローしないようにすることを考えると、
いちいち52進数ないし62進数の最大値を求めてそれ以上上がらないように設定するしかないでしょうか?
(例えばある桁がAで左の桁がBでさらにその左の桁がCならその桁は上げることができない)
それともif文でif(変数 + 上昇量 > 2147483647)のようにif文の中だけでオーバーフローするようなことができるのでしょうか?
0602デフォルトの名無しさん2008/12/12(金) 08:27:57
> 52進数か62進数

52進数は「A〜Z,a〜z」、62進数は「0〜9,A〜Z,a〜z」ってことか?

> if文でif(変数 + 上昇量 > 2147483647)のようにif文の中だけで
> オーバーフローするようなことができるのでしょうか?

可能かどうかと言えばできる。

環境や言語は知らんが、WindowsでVC++(MFC)なら、CEdit派生クラスで
OnCharをオーバーライドかな。

それよりも問題は、入力途中の段階で52進数か62進数かを、どうやって
判断するのかだ?

それと52進数で「A」と入力した時と、62進数で「A」と入力した時では、
数値に変換した際に値が違うのか?
0603デフォルトの名無しさん2008/12/12(金) 08:32:20
>>602
解答ありがとうございます。
52進数か62進数と言ったのは単に自分が仕様をまだ決めてないだけです。
環境はSolaris コンパイラはcc or gccです。
06046012008/12/12(金) 09:41:27
if(pass[0] * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62 +
pass[1] * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62 +
pass[2] * 62 * 62 * 62 * 62 * 62 * 62 * 62 +
pass[3] * 62 * 62 * 62 * 62 * 62 * 62 +
pass[4] * 62 * 62 * 62 * 62 * 62 +
pass[5] * 62 * 62 * 62 * 62 +
pass[6] * 62 * 62 * 62 +
pass[7] * 62 * 62 +
pass[8] * 62 +
pass[9] > 2147483647) pass[now_i]--;

実際にプログラミングしてみたらこのコードがうまく動きませんでしたどうしたらいいでしょうか?
0605デフォルトの名無しさん2008/12/12(金) 09:44:24
>>604
お馬鹿さんや、62の9乗を計算してご覧。
高高6桁で桁溢れするわけだが。
06066012008/12/12(金) 09:46:03
>>605
でもオーバーフローするif文も書けるんじゃなかったんですか?
06076012008/12/12(金) 09:50:20
あとこのプログラムのif文がうまく機能しないのはなんででしょう?
pass[10] = 60 のときでも if文がなぜか false になってしまいます。

if(pass[10] * 62 * 62 * 62 * 62 +
pass[11] * 62 * 62 * 62 +
pass[12] * 62 * 62 +
pass[13] * 62 +
pass[14] > 99999) pass[now_i]--;
0608デフォルトの名無しさん2008/12/12(金) 10:08:11
62^ 2=                3844
62^ 4=             14776336
62^ 9=      13537086546263552
62^ 13= 200028539268669788905472
0609デフォルトの名無しさん2008/12/12(金) 10:12:39
>>600
プロジェクトにファイルを追加するのが複数人いるってそんなに珍しいことか?
うちはロックするようにして回避してる。

>>607
うちではtrueになるよ。
0610デフォルトの名無しさん2008/12/12(金) 10:53:05
>>601
if((最大値-進数) < 前の桁までの合計値 ) && (新しい桁の数値 > (最大値-前の桁までの合計値))
{
 //オーバーフロー処理
}

あってるかどうかは試してないから分からんが方向性はこんなんのはず
オーバーフローする直前のタイミングを捕まえて、本当にオーバーフローするかどうかを「オーバーフローさせないで」判定する
0611デフォルトの名無しさん2008/12/12(金) 12:01:54
>>610
なるほど!!!式変形すれば良かっただけでしたか。
その方針でプログラミングしてみます。
0612デフォルトの名無しさん2008/12/12(金) 12:04:52
オーバーフローしうる桁だけやりなよ
あと、unsignedなら42億じゃないかと思う。
■ このスレッドは過去ログ倉庫に格納されています