5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2006/11/24(金) 22:51:27
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.31【環境依存OK】 (重複スレ実質Ver.32)
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

2 :デフォルトの名無しさん:2006/11/24(金) 23:24:50
前スレ間違ってるぞ

【初心者歓迎】C/C++室 Ver.32【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1160893851/

3 :デフォルトの名無しさん:2006/11/24(金) 23:48:46
早速質問させてください。環境は VC++2005 を使用しています。
汎用クラスから派生したクラスで継承元のクラス関数の呼び出しについて教えて
ください。
下の child::Add() のコメントにあるように VC++2005 だと例1の記述でも問題無く
動作します。動作はするのですが出来れば C++的に正しい(移植性が高い)書き方を
知りたいのですが、どういう書き方が正しいのでしょうか?

template <class T> class base{
T i,j;
public:
base(void){ i = 1; j = 2; };
~base(void){ i = j = 0; };
virtual T Add(void){ return i+j; };
}; // class base

class child : public base<int>{
int k;
public:
child(void){ k = 3; };
~child(void){ k = 0; };
int Add(void){
return k + base::Add(); // 例1:gcc4.1ではErrorだがVC++2005だとOK
//return k + base<int>::Add(); // 例2:両方ともOK
};
}; // class child

4 :デフォルトの名無しさん:2006/11/24(金) 23:50:50
>>3
両方通る奴で何が不満だ?
gcc のエラーメッセージはなんて言ってる?

5 :デフォルトの名無しさん:2006/11/25(土) 00:03:47
>>4
"error: 'template<class T> class base' used without template parameters"

と言っています。確かに明示的に型指定したほうが安全でしょうし、両方通る方が
一般的と解釈していいんでしょうね。


6 :デフォルトの名無しさん:2006/11/25(土) 00:05:12
>>3
規格書のどっかにあると思うが、VC2005で通る方のは文法違反だと思う

7 :デフォルトの名無しさん:2006/11/25(土) 01:11:28
3次元配列の確保で質問です。
P =(double ***)calloc(ALL,sizeof(double **));
if(P ==NULL) exit(1);
for(i=0 ; i < ALL ; i++){
P[i] = (double **)calloc(NN,sizeof(double *));
if (P[i]==NULL) exit(1);
for (j=0 ; j < NN; j++){
P[i][j] = (double *)calloc(NN,sizeof(double));
if (P[i][j]==NULL) exit(1);
}
}
ALL=8760,NN=99とします。この配列確保をP,P1,P2・・・と7回繰り返そうと思うのですが、4回目になると勝手に計算が終わってしまいます。
多分、ALL=8760が大きいためと思うのですが・・・。うまく配列を確保する方法ってありますか?よろしくお願いします。
環境はWinXP,VS2005でCです。

8 :デフォルトの名無しさん:2006/11/25(土) 01:13:43
>>7
それを7回繰り返して、7つとも同時に使うの?

9 :デフォルトの名無しさん:2006/11/25(土) 01:35:15
はい、ファイル出力する際同時に使います。

10 :デフォルトの名無しさん:2006/11/25(土) 01:38:56
WinXP 64bit版でも使うしかないな。
32bit版は通常で2G、2003Serverでも3Gしか取れない

11 :デフォルトの名無しさん:2006/11/25(土) 01:45:18
そうですか・・・。何かプログラム上で上手く回避できませんかね?

12 :デフォルトの名無しさん:2006/11/25(土) 01:47:49
>>11
前スレから勝手にコピペ
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3031.c

Windowsのファイルマッピング機能を利用

13 :デフォルトの名無しさん:2006/11/25(土) 01:54:17
アホどもはどうしてなんでもかんでもメモリに展開したがるんだぜ?

14 :デフォルトの名無しさん:2006/11/25(土) 01:55:18
>>12
わざわざ有り難う御座います!
質問でのP[ALL][NN][NN]はどれに対応しているのでしょうか?
マッピング機能がちょっと分からないので見当外れな質問でスイマセン。

15 :デフォルトの名無しさん:2006/11/25(土) 01:57:06
>>14
>>12を書いたのは俺じゃないんだが、P[][]とQ[][]が該当すると思う

16 :デフォルトの名無しさん:2006/11/25(土) 02:06:26
>>13
めんどぐさがりなんだよ。

17 :デフォルトの名無しさん:2006/11/25(土) 02:09:04
でもよく考えてみたら、MapViewOfFile()はアドレス空間にファイルを
マップするだけなので、どちらにしろ32bitじゃ足りなくないか?

結局はLPVOIDのサイズ幅に制限されるはず

18 :デフォルトの名無しさん:2006/11/25(土) 02:15:10
最近勉強し始めたC++でswitch文を使ってプログラムを書いているのですが
case 1:
cout << "文字1";
cin >> a

if (a <= 15)
cout << "文字2\n";

else if (a >= 16)
cout << "文字3\n";

else
cout << "文字4\n";

break;
この記述の仕方ではコンパイルできません。。。orz

1と入力されたら文字1を出力して更に入力させて15以下なら文字2を、
16以上なら文字3をそれ以外なら文字4を表示させたいのですが
どうすれば記述できますでしょうか・・・

ちなみに他の文は問題ないようでした。
上記の部分を/*〜*/で囲ったら無事コンパイルできましたので。。。

どなたかご教授お願いします。

19 :デフォルトの名無しさん:2006/11/25(土) 02:15:36
実際に>>12のソースを書き換えて実行してみたら、マップできる
個数は32bit WindowsXPで2個だけだな。3個マップしようとすると
エラーで止まる

20 :デフォルトの名無しさん:2006/11/25(土) 02:16:36
>>18
aの型は何よ
症状が再現する最小のソースをうpしろ

21 :デフォルトの名無しさん:2006/11/25(土) 02:22:43
>>20 int型です。
ソースうpします
#include <iostream.h>
int main()
{
int b, a;
cout << "文字0\n";
cin >> b;
switch(b){
case 1:
cout << "文字1";
cin >> a
if (a <= 15)
cout << "文字2\n";
else if (a >= 16)
cout << "文字3\n";
else
cout << "文字4\n";
break;
改行が多すぎると言われたのでひっつけました。。。
みにくくてすいませんorz

default:
cout << "文字5\n";
}
}


22 :デフォルトの名無しさん:2006/11/25(土) 02:24:28
>cin >> a
にセミコロンがないとか言う落ちか?

23 :デフォルトの名無しさん:2006/11/25(土) 02:25:10
>>21
cin >> aの後にセミコロンが抜けてる

24 :デフォルトの名無しさん:2006/11/25(土) 02:26:25
>>22-23
セミコロンつけたら無事コンパイルできましたorz
板汚しすいませんでした。


25 :デフォルトの名無しさん:2006/11/25(土) 02:27:18
syntax errorを他人にデバッグさせるなと俺は言いたい

26 :デフォルトの名無しさん:2006/11/25(土) 02:30:25
>>12
う〜ん、上手くいかないです・・・。
もうちょっと試してみますが成功する気配がしない・・・

27 :デフォルトの名無しさん:2006/11/25(土) 02:32:46
>>26
配列風に扱うのは諦めて、fseek()、fread()、fwrite()で
原始的に書けよ。

28 :デフォルトの名無しさん:2006/11/25(土) 02:34:11
>>26
全部一辺にマップしようとしてるのならお門違い。
元々全部はメモリにのらないので、その時々にアクセスする必要のある
最低限の所に限定してメモリを割り当てようというのが >12 だから。

29 :デフォルトの名無しさん:2006/11/25(土) 02:36:00
家で実験したら最高2個しかマップできないので、うまく2個だけの
マップで済むようにプログラムを書くしかないな。

30 :デフォルトの名無しさん:2006/11/25(土) 02:42:51
2003Serverなら4個いけそう

31 :デフォルトの名無しさん:2006/11/25(土) 02:48:16
色々やってたらパソコンの調子が悪くなってしまいました。

32 :デフォルトの名無しさん:2006/11/25(土) 02:50:53
スワップファイルを置いてあるHDDの容量がぎりぎりなんじゃないか?

33 :デフォルトの名無しさん:2006/11/25(土) 02:55:52
結局8760*99*99を大量にって無理ですね。
配列以外に良い方法ってありませんか?

34 :デフォルトの名無しさん:2006/11/25(土) 02:58:12
どのように使うかを言わず良い方法といわれてもな
プログラマーよりまずエスパー探してきたほうがいいんじゃないか?

35 :デフォルトの名無しさん:2006/11/25(土) 03:01:07
>>33
どう考えてもファイル操作にするか64bitOSへの乗り換えるのがまともな方法。

36 :デフォルトの名無しさん:2006/11/25(土) 06:33:56
>>33
本当にいっぺんに必要なのか?
そう思い込んでるだけでは?
何をやりたいのか具体的に書いてくれると、回答者としても代替案を出しやすいと思う

37 :デフォルトの名無しさん:2006/11/25(土) 08:24:28
C machineで

float x,y;
scanf("%f",&x);
scanf("%f",&y);

としたときにxに2桁以上の数をいれると
yに何もいれずにプログラムが進むという現象が起きたんですが
どうしたらいいでしょう?
学校では、普通なんですが、家でやるとこうなります。

38 :デフォルトの名無しさん:2006/11/25(土) 08:47:39
scanf()をつかうのをやめる。

39 :デフォルトの名無しさん:2006/11/25(土) 09:22:34
つーか、C machineなんか使うからだな。

40 :デフォルトの名無しさん:2006/11/25(土) 15:39:19
>>33
内部でディスク上に展開する配列もどきクラスでも書けば?
コードの見た目は配列みたいに扱えるが。
LargeArray.get(30,5,49);
な感じで。

41 :デフォルトの名無しさん:2006/11/26(日) 00:31:41
アルゴリズムの質問なんですが、vectorで要素数で指定されてきた要素を
消したいんですが、いいやり方が思いつきません。
教えてもらえませんか?


42 :デフォルトの名無しさん:2006/11/26(日) 00:42:04
ちょっと解りにくいと思ったので追加します。。。

いくつかの要素からなるベクター配列があって、
そのX番目の要素を消したいときって、どうやるんでしょうか。
Eraseだとイテレータが必要で、でもイテレータは最初か最後、他ちょっと
くらいしか取り出せませんよね??
いま僕はX回インクリメントしてイテレータをその要素にさすようにしてますが、
もっといい方法はないでしょうか??


43 :デフォルトの名無しさん:2006/11/26(日) 00:48:19
途中にある要素を削除しなきゃならんときにvectorを使うのが間違い

44 :デフォルトの名無しさん:2006/11/26(日) 00:50:29
advance

45 :デフォルトの名無しさん:2006/11/26(日) 00:50:36
>>42
vectorはRandom Access Iteratorだから、v.begin() + n で n + 1個目の
要素を指せる

46 :デフォルトの名無しさん:2006/11/26(日) 01:21:23
>>45
おお。ほんとですか!ありがとうございます。

>>44
そういう関数があるんですか?あとで確認します。

>>43
ちょっと配列の勉強しなおそうかな・・・。

47 :デフォルトの名無しさん:2006/11/26(日) 01:36:55
消したり出したりしたいんなら普通はリストにするんじゃないの

48 :デフォルトの名無しさん:2006/11/26(日) 01:41:50
>>47
実行速度を最適にすることが普通とは限らない。

49 :デフォルトの名無しさん:2006/11/26(日) 02:22:46
>>48
いや「普通」は実行速度を最適にする方だと思うよ
頻繁に途中の要素を消したり出したりするのにvectorを使うのは普通じゃない


50 :デフォルトの名無しさん:2006/11/26(日) 02:29:27
>>49
それはオマエの「普通」。

まともな思慮のある技術者なら自分の主張の根拠に
「普通」などという主観的な根拠は使わない。

今回の場合、
「消したり出したりするなら list にしたほうが速い」
とは言える。でもそれでコンテナを切り替えるかどうかは
本人の選択。

51 :デフォルトの名無しさん:2006/11/26(日) 02:49:57
          ____
       / \  /\  キリッ
.     / (ー)  (ー)\
    /   ⌒(__人__)⌒ \  それはオマエの「普通」。
    |      |r┬-|    | 
     \     `ー'´   / 
    ノ            \
  /´               ヽ
 |    l              \
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))


          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //   だっておwww
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/ 
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /
 |    |   l||l 从人 l||l      l||l 从人 l||l
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

52 :デフォルトの名無しさん:2006/11/26(日) 05:07:10
>>50
>まともな思慮のある技術者なら自分の主張の根拠に
>「普通」などという主観的な根拠は使わない。
47の「普通」って頻度で言ってんじゃないの? 十分客観的だよ


53 :デフォルトの名無しさん:2006/11/26(日) 05:09:52
選択は変えないでいいよ


54 :デフォルトの名無しさん:2006/11/26(日) 05:57:32
>>52
「47の」って言った時点で主観確定だろ。アホか。

55 :デフォルトの名無しさん:2006/11/26(日) 06:21:01
>>50
>「消したり出したりするなら list にしたほうが速い」
を認めておきながら47を48で返したり
49に50と返したり


56 :デフォルトの名無しさん:2006/11/26(日) 06:34:31
「言葉の使い方が厳格な俺」っていう設定で遊んでるんだろう。
現実の姿は単なる屁理屈中学生だけど。

57 :デフォルトの名無しさん:2006/11/26(日) 07:12:12
どこから「頻繁に要素を削除する場合」話が出てきたの?

58 :デフォルトの名無しさん:2006/11/26(日) 07:14:10
普通は頻繁に要素を削除するんじゃないの

59 :デフォルトの名無しさん:2006/11/26(日) 07:16:09
つまり普通はvector使っちゃ駄目ってことだな

60 :デフォルトの名無しさん:2006/11/26(日) 07:20:26
普通はvector使うんじゃないの

61 :デフォルトの名無しさん:2006/11/26(日) 09:03:50
配列をポインタ形式で使う。
心がければ高速になるし(ちりもつもれば何とやら、ね)これ最強

62 :デフォルトの名無しさん:2006/11/26(日) 09:26:28
STLってスレッドフリーですか?

63 :デフォルトの名無しさん:2006/11/26(日) 09:33:59
スレッドフリーってなぁに?

64 :デフォルトの名無しさん:2006/11/26(日) 12:01:19
>>63
知らないんですか・・・ハア(呆)。もうちょっとレベルの高いところで聞き直す事にします。ありがとうございました。

65 :デフォルトの名無しさん:2006/11/26(日) 12:11:21
>>64
スレッドフリーと言う言葉は存在しない。
スレッドセーフを書き間違えたのを遊ばれてるだけだろ。

66 :デフォルトの名無しさん:2006/11/26(日) 12:17:40
free((void*)Thread);

67 :デフォルトの名無しさん:2006/11/26(日) 12:34:11
質問です

#define FILENAME "f.dat"

typedef struct
{
int data[10];
int data2[10];
} HEAD;

int main(void)
{
FILE* fp;
HEAD head;

if( (fp = fopen( FILENAME ,"r") ) == NULL ) {
cout << "cannnot open." << endl;
}
fread(&head , sizeof(head) , 1 , fp);
fclose(fp);
}

というコードをC++に書き直すと、どのようになるでしょうか。
ifstream file(FILENAME);
file.read(処理略);
使ってもうまくコンパイルが通りません

68 :デフォルトの名無しさん:2006/11/26(日) 12:48:08
ふつうに動くと思うが
#include<fstream>
#include<iostream>
using namespace std;
#define FILENAME "f.dat"
struct HEAD
{
    int data[10];
    int data2[10];
};
int main(void)
{
    std::ifstream file(FILENAME);
    HEAD head;
    if(!file){
        cout << "cannnot open." << endl;
    }
    file.read(reinterpret_cast<char*>(&head),sizeof(head));
}

69 :デフォルトの名無しさん:2006/11/26(日) 14:54:43
>>68 うまく動きました
けど、そのコードを初めコンパイルしたとき

コンパイルしています...
scan.cpp
scan.cpp(48) : warning C4551: 関数呼び出しに引数リストがありません。
scan.cpp(51) : error C2228: '.read' : 左側がクラス、構造体、共用体ではありません。
型は 'overloaded-function' です。
ビルド時間 0:01

となり、一回VC終了して起動し、コンパイルしたら何事も無かったかのように動きました。
なんでだろ・・・

70 :デフォルトの名無しさん:2006/11/26(日) 15:00:50
>>69
要らないもん付けてたんだろ。 >>68 は 48 行もない。

71 :デフォルトの名無しさん:2006/11/26(日) 15:02:25
俺には>>68のコードで51行以上になる理由が分らない。
どうせ晒さなかったコードに問題があるだけなんだろ。

72 :デフォルトの名無しさん:2006/11/26(日) 15:03:25
2分も遅れてケコーンしちまったか

73 :デフォルトの名無しさん:2006/11/26(日) 15:07:07
>>70-71

すみません。struct HEADの中身は、ほんとはもっと長いコードだったもので、、、
そこは置き換えてます。

74 :68:2006/11/26(日) 17:52:32
たびたびすみません。
こんどは f.dat のデータを読み出したいのですが、うまく読んでくれません。
f.dat の容量は50Mあります。
途中までは読んでくれるのですが、途中から値が全て0になってしまいます。
この場合どのようにしたらよいのでしょうか?

75 :67:2006/11/26(日) 17:56:04
>>74 68じゃなくて67でした

76 :デフォルトの名無しさん:2006/11/26(日) 17:56:12
>>74
ここにいるのはエスパーじゃない。問題の発生するソースを貼れ。

どうせ途中で fstream がエラー起こしてるんだろうけど。

77 :67:2006/11/26(日) 17:56:36
わかりました ちょっとまってください

78 :67:2006/11/26(日) 18:06:13
#include <string>
#include <fstream>
#include <windows.h>
using namespace std;

#define FILENAME "01.dat"

typedef struct
{
struct SCAN_TIME
{
WORD Year;
WORD Month;
WORD Day;
WORD Hour;
WORD Minute;
WORD Sec;
}Time;
BYTE Sp[1024-sizeof(struct SCAN_TIME)-sizeof(struct SCAN_ETC)];
} HEAD;


79 :67:2006/11/26(日) 18:07:17
void Print_Bit(short int data)
{
int j;
int hoge;
int piyo;
char str_bit[17];

for(hoge=0,j=15;hoge<16;hoge++,data>>=1) {
if(data & 0x01)
str_bit[j--] = '1';
else
str_bit[j--] = '0';
}
for(piyo=0;piyo<=16;piyo++) {
putchar(str_bit[piyo]);
}
return;
}

80 :67:2006/11/26(日) 18:08:18
void Read_File(const char* filename , HEAD& head, short int* data)
{
ifstream file(filename);

if( !file ) {
cout << "cannot open." << endl;
}
file.read(reinterpret_cast<char*>(&head),sizeof(head));

for(int i=0 ; i <= 500000/* !file.eof()*/ ; ++i ) {
file.read(reinterpret_cast<char*>(&data[i]) , sizeof( short int ) );
Print_Bit(data[i]);
cout << endl;
}
cout << endl;
cout << "SUCCESS" << endl;
file.close();
}

int main(void)
{
HEAD head;
short int data[500000];
Read_File( FILENAME , head , data);
return 0;
}

81 :67:2006/11/26(日) 18:10:59
こんな感じです

>>78 コードの BYTE Spは気にしないで下さい
ちなみに50Mのデータにはちゃんとしたデータが入っていることが保障されています

82 :デフォルトの名無しさん:2006/11/26(日) 18:11:41
バイナリモードで開いていないに1票

83 :デフォルトの名無しさん:2006/11/26(日) 18:29:44
>>81
もしかして、ファイルサイズが 50M バイトなの?
sizeof(HEAD) + (50M * sizeof(short)) ないとおかしいんだけど、大丈夫?

84 :デフォルトの名無しさん:2006/11/26(日) 18:34:24
>>82
二俵


85 :デフォルトの名無しさん:2006/11/26(日) 18:37:14
3表

86 :67:2006/11/26(日) 18:39:53
>>83 ファイルサイズは50Mくらいで きっちり50Mではありません。
>>82 >>84 そのとおりでした。バイナリで開いたらちゃんとした値が出てきました。

すみません、最後に一つ質問です。
char buf2[4500000];
が動かないのですが、これだけ大きな配列は作れませんか?
50Mのデータが配列に入りきらなくて・・・

87 :デフォルトの名無しさん:2006/11/26(日) 18:45:41
>>86
つ[std::vector]

88 :デフォルトの名無しさん:2006/11/26(日) 18:46:58
>>86
スタックサイズが足りないからその問題は発生している。
解決策は2種類あって、
配列をスタックに取らない or スタックを大きくする

前者の方法での解決方法としては
std::vector<char>buf2(4500000);
とか
static char buf2[4500000];
とかこんな感じ。

後者の方法を取るならやりかたはコンパイラ毎に異なるので適宜調べて


89 :デフォルトの名無しさん:2006/11/26(日) 18:48:26
>>87-88
vector使ってやってみます。
どうもありがとうございました。

90 :デフォルトの名無しさん:2006/11/26(日) 19:29:54
char* buf = new char[4500000]
char* buf = (char*)HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY, sizeof(char) * 4500000);

91 :デフォルトの名無しさん:2006/11/26(日) 19:55:29
>>90
vector が出てるのに、なんでそんなの勧めるの?

92 :デフォルトの名無しさん:2006/11/26(日) 20:07:47
ただ別の手段を示してるだけのヤツになぜそんなにつっかかるの?

93 :デフォルトの名無しさん:2006/11/26(日) 20:09:39
何か嫌な思い出でもあるんだろ、そっとしといてやれ

94 :デフォルトの名無しさん:2006/11/26(日) 20:33:45
deleteし忘れたことがあるからトラウマになっちゃったんだな

95 :デフォルトの名無しさん:2006/11/26(日) 20:58:51
そこでスマートポインタ使えばもうそんな心配は無用となるわけでBoostの出番です。
boost::scoped_array<char> buf(new char[450000]);

#define BOOST_BIND_ENABLE_STDCALL 
#include <boost/bind.hpp>
boost::shared_array<char> buf(
    static_cast<char*>(HeapAlloc(GetProcessHeap(), 0, 4500000)), 
    boost::bind(HeapFree, GetProcessHeap(), 0 , _1));
率直にstd::vector使えばこんなことをする必要も無いのだがな。

96 :デフォルトの名無しさん:2006/11/27(月) 01:16:48
ベタな new / delete が使えないうちに、その辺をすすめるのもどうかと。

97 :デフォルトの名無しさん:2006/11/27(月) 16:55:12
すごく初歩的な質問ですが
変数の再定義って可能なんでしょうか?

int nNum;

//なんか処理

char nNum;

98 :デフォルトの名無しさん:2006/11/27(月) 17:11:07
>>97
スコープが変わらない限り無理。

逆に言えば、これはOK。
double foo = 1.5;
int main()
{
int foo = 5;
printf("%d\n", foo);
{
char foo = 'a';
printf("%c\n", foo);
}
return 0;
}

99 :デフォルトの名無しさん:2006/11/27(月) 18:19:35
まぁなんつーか質問する前に、

int main() {
 int nNum = 0;
 nNum += 5;

 char nNum;

 return 0;
}

とか超簡単なもん書いて自分でコンパイルしてみりゃ解ろうものを

100 :デフォルトの名無しさん:2006/11/27(月) 18:23:37
ダメな奴の3ない
・調べない
・試さない
・考えない

101 :デフォルトの名無しさん:2006/11/27(月) 18:27:55
俺なんてテストプログラムが大量にあるがなぁ

102 :デフォルトの名無しさん:2006/11/27(月) 19:41:08
俺なんてテストプログラム書いただけで終わった気になるがなぁ

103 :デフォルトの名無しさん:2006/11/27(月) 20:14:28
やってみて出来なかったで、方法があるのか聞いただけのようなきがす。

104 :デフォルトの名無しさん:2006/11/27(月) 20:31:58
>>95の内容でそりゃあ無いだろ

105 :デフォルトの名無しさん:2006/11/27(月) 20:37:35
>>97だろ

106 :デフォルトの名無しさん:2006/11/27(月) 23:37:43
C++が出来上がったのに、Cはなぜ未だ存在するのですか?
Cで作らなきゃいけないメリットでもあるんですか?

107 :デフォルトの名無しさん:2006/11/27(月) 23:38:26
あります

108 :デフォルトの名無しさん:2006/11/27(月) 23:40:02
C++を実装できないプアな環境もあるんです。

109 :デフォルトの名無しさん:2006/11/28(火) 00:14:17
既にC99で別の道を歩み始めています。

110 :デフォルトの名無しさん:2006/11/28(火) 00:20:24
Embdded C++とは別に、現在Embedded Cまで作られているそうで。

111 :デフォルトの名無しさん:2006/11/28(火) 03:33:59
C++は作者があんなくだらん言語作っちゃってごめんと公式で謝罪してるからなあw

112 :デフォルトの名無しさん:2006/11/28(火) 06:11:10
>111
どこで?

ttp://www.kh.rim.or.jp/~nagamura/misc/stroustrup-interview.html
ttp://hp.vector.co.jp/authors/VA000092/jokes/strup.html
↑のこと?

113 :デフォルトの名無しさん:2006/11/28(火) 14:50:59
質問させてださい。
文字列定数のポインタとmallocでヒープに確保した文字列ポインタが
混在した配列を解放したいのですが、配列に格納されているポインタが
ヒープポインタかどうかを判断する方法はないでしょうか?

できれば標準のCランタイムでできる方法がよいのですが、無ければ
別の方法でも構いません。よろしくお願いします。

環境は、VisualStudio2005(C++)を使っています。

114 :デフォルトの名無しさん:2006/11/28(火) 16:54:45
>>113
まぁ、環境依存しない方法では手っ取り早い方法はないな。
やるとすれば、どれかの文字列定数のポインタとの差が大きいか小さいかだけど確実性はないし。
地道にmalloc()するごとにそのアドレス範囲を保存しておいてそれと比較するとかじゃないかね。

115 :デフォルトの名無しさん:2006/11/28(火) 17:12:55
質問です。
int型やString型やその他自作オブジェクトを、
使われなくなった時点でそれらのデストラクタなりdeleteなりを
よんで片付けてくれるようなクラスを創りたいんです。
参照カウント方式で削除のタイミングをはかるようなやつです。
どんな風に実装したらいいでしょう。
どんな型の変数でも代入できるような変数を
クラス内に持って、そこにintやらstringやらなんやらを入れて、
参照カウントをチェックして、使われなくなったら削除処理を呼び出すような
入れ物みたいなクラスをイメージしてるんですけれど、
どんな型の変数でも代入できるような変数って、そんなのできますか

116 :デフォルトの名無しさん:2006/11/28(火) 17:35:48
Boostを使ってよければ、参照カウントのスマートポインタは既にある。
boost::shared_ptr<T>とboost::shared_array<T>。
それぞれT型(及びT型へ変換できる型)でnewしたもの、T型でnew []したもの用。

特にboost::shared_ptr<void>には、newしたものなら何でも入る。
それどころか削除子(削除処理する関数オブジェクト)さえ指定すれば実質的に何でも入れられる。

117 :デフォルトの名無しさん:2006/11/28(火) 18:46:30
>>116

Boostをいれられない環境で動かしたいんだけど、
同じようなものを造るのはむずかしいでしょうか

118 :デフォルトの名無しさん:2006/11/28(火) 18:49:50
Boost入れられる環境で作って入れられない環境で動かせば問題ない

119 :デフォルトの名無しさん:2006/11/28(火) 19:16:49
大学生です
これからC言語を勉強していきたいんですが
コンパイラ等のソフトをダウンロードできるサイトを教えて頂けませんか?

120 :デフォルトの名無しさん:2006/11/28(火) 19:27:49
ググれ

121 :デフォルトの名無しさん:2006/11/28(火) 20:19:34
C言語で配列をグローバル変数に使うのですが
その配列の要素数を、関数内で開いたファイルの値を元に指定したいんです。
グローバル変数は最初に指定する為、後から開くファイルの中身を
どのように反映させたら良いか困っています。
こうしたら良いと言うのがあればお願いします。

122 :デフォルトの名無しさん:2006/11/28(火) 20:38:52
一例

int *pBuf

(中略)

{
  unsigned int uCount;
  (ファイルから値取得)
  pBuf = (int*)malloc(sizeof(int) * uCount);
}



123 :デフォルトの名無しさん:2006/11/28(火) 20:39:22
やっべ、

int main()

が抜けてたわい

124 :デフォルトの名無しさん:2006/11/28(火) 20:44:16
すみません、数学的な質問なのですが、
数値の2乗を返す数式で、その答えに元の数値の符号がつくような数式を
場合分けなしで出来ましたでしょうか?

すなわち
10を渡したときには100を、-10を渡したときには-100が返るような数式です。

125 :デフォルトの名無しさん:2006/11/28(火) 20:47:59
>>122
レスありがとうございます。
mallocを使う方法でやってみます。

グローバル関数をmallocを使って動的にメモリ領域を確保すれば良いのですね。
ただ今回使う物は
float vertex[xxxx][3] ;//xxxxの部分が可変なのですが

vertex = (int*)malloc(sizeof(int) * uCount)
みたいな感じでしょうか?
それともpBufをポインタにしたのには何か意味があるんでしょうか?

126 :デフォルトの名無しさん:2006/11/28(火) 20:49:21
そんなレベルでグローバルに可変配列なんて5年早いんじゃね?

127 :デフォルトの名無しさん:2006/11/28(火) 20:51:18
ポインタにしたのには何の意味がって、mallocがどういうものなのか解ってるか?

128 :デフォルトの名無しさん:2006/11/28(火) 20:53:10
>>127
今調べてて多少は理解しました。
上の運用は根本的におかしいですね。
構造体でも使って代用します。

129 :デフォルトの名無しさん:2006/11/28(火) 20:56:24
>>124
x*abs(x)

130 :122:2006/11/28(火) 20:58:39
float型の多元配列か
vertex[x][y]のyが固定なのなら

float *vertex;

int main()
{
  unsigned int uCount;
  (取得)
  vertex = (float*)malloc(sizeof(float) * y * uCount);  //yは固定
}

でやればいい
配列への実際のアクセスは普通にvertex[x][y]でいける
あと、要らなくなったらちゃんとfree(vertex)するように

131 :デフォルトの名無しさん:2006/11/28(火) 21:04:29
>>130
ありがとうございます。
見つけたサイトの説明の関係で、yが固定なのでxとyの場所を入れ換えようか
などいろいろ考えていたのでとても助かりました。
mallocをもう少し理解してこの実装の方法で詰めていきたいと思います。


132 :デフォルトの名無しさん:2006/11/28(火) 21:07:59
>>129
サンクスです^^)

133 :デフォルトの名無しさん:2006/11/28(火) 21:17:12
フリーのCコンパイラをWinXPに入れようかと思っているのですが、
日本語のソフトで何かいいものはありませんでしょうか?

134 :デフォルトの名無しさん:2006/11/28(火) 21:44:28
ググって出てくるやつを全部入れろ

135 :デフォルトの名無しさん:2006/11/28(火) 22:42:32
1を入力すれば"1を選択"、2を入力すれば"2を選択"と表示するようにしたいのですが
どの数字を入れても"1、2、3のどれか選択してください"と表示されてしまい困ってます。
どの辺を修正するなりすればいいのでしょうか?

#include <stdio.h>
int main()
{

char aa[256];
char bb = aa;

printf("1をえらぶ\n2をえらぶ\n3をえらぶ\n");

scanf("%s", aa);

switch(bb){
case 1:
printf("1を選択\n");
break;
case 2:
printf("2を選択\n");
break;
case 3:
printf("3を選択\n");
break;
default:
printf("1、2、3のどれか選択してください\n");
break;
}

return 0;
}

136 :デフォルトの名無しさん:2006/11/28(火) 22:44:38
問題点が山積みだな。

int = aa;

printf("1をえらぶ\n2をえらぶ\n3をえらぶ\n");

scanf("%d", &aa);

switch(aa)

137 :135:2006/11/28(火) 22:59:24
>>136
うまく表示されました、ありがとうございます。

138 :デフォルトの名無しさん:2006/11/29(水) 00:06:58
boostのスマートポインタって、
スコープを抜けたかどうかをみて参照カウントをデクリメントしてるんですよね??
でも、スコープを抜けてるかどうかを、どうやって監視してるんでしょうか。
一行読むごとに、スコープが閉じられたかどうかを常時監視してるわけでもないんでしょ?
よくわからない・・・どういう仕組みなのか教えてください

139 :デフォルトの名無しさん:2006/11/29(水) 00:27:40
ヒント: デストラクタ

140 :デフォルトの名無しさん:2006/11/29(水) 16:51:49
大学生です。
家庭のノートPCでC言語を勉強したくて
坂下夕里 著 の「10日で覚えるC言語入門教室」
という参考書を買って、本に従って「Borland C++ Compiler 5.5」を
ダウンロードしてインストールしました。
bccフォルダの中にあるreadme.txtファイルに従って
まず、マイコンピュータのプロパティの環境変数のシステム環境変数
に;c:\Borland\Bcc55\binというPATHを加えて
次に、メモ帳を使って
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
という内容のファイルをbinの中にbcc32.cfgという名前で
すべてのファイルを選択して保存
次に、またメモ帳を使って
-L"c:\Borland\Bcc55\lib"
という内容のファイルをbinの中にilink32.cfgという名前で
すべてのファイルを選択して保存

最後にコマンドプロンプトを使ってbcc32と入力しましたが
参考書のようにヘルプと呼ばれる説明は出てこないで
「エラー E2266: ファイル名が指定されていない」
と出てくるのです。
自分ではどこが間違っているのか分かりません。
自分のPCはwindows XPです。
もし分かる方がいたら解決方法を教えていただけないでしょうか

141 :デフォルトの名無しさん:2006/11/29(水) 16:54:21
>>140
スレ違い

142 :デフォルトの名無しさん:2006/11/29(水) 17:01:10
140です。
どこで聞けばいいのでしょうか?

143 :デフォルトの名無しさん:2006/11/29(水) 17:01:24
暗号:

51-16-98-29-40-114-85-43-29-103-98-118-55

解けますかな?

144 :デフォルトの名無しさん:2006/11/29(水) 17:11:15
>>140
気にせず先へ進め。

そんなエラーメッセージが出てくるということは、正しく導入できたと思ってよい。
(コマンドが見つからないというようなエラーメッセージだったら良くなかった)

145 :デフォルトの名無しさん:2006/11/29(水) 17:51:13
>>140
> Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
> Try `bcc32 -h' for more information, or `bcc32 -h <OPT>' for specific help.
> エラー E2266: ファイル名が指定されていない

メッセージの2行目に書いてあるように bcc32-h と入れればいい。
でも5.5.1は引数無しだとコマンドラインオプション出たような‥‥/ ,' 3  `ヽーっ
ひそかにBCB2006の5.8にでもバージョンアップされたのかな‥‥

146 :デフォルトの名無しさん:2006/11/29(水) 22:21:48
C++で整数、文字列両方に対応している変数ってありますか?

147 :デフォルトの名無しさん:2006/11/29(水) 22:29:43
こんなところか。
積極的に勧めたくない選択肢は括弧で囲んだ。
//標準規格内
(union {int x; char *p;})
(std::stringstream)
(void*)

// boost
boost::variant<int, std::string>
boost::any
(boost::shared_ptr<void>)

// OLE
VARIANT

// (.NET)
System::Object

148 :デフォルトの名無しさん:2006/11/29(水) 22:29:51
そもそも文字列というデータ型が無いわけだが
charもwchar_tも内部的にはただの数値で、整数として扱うこともできるがな
だから、x == 'A'とかできるわけだが

149 :デフォルトの名無しさん:2006/11/29(水) 22:34:01
>>146
Discriminated Unions by Andrei Alexandrescu

150 :p2165-ipbf205kyoto.kyoto.ocn.ne.jprlo」:2006/11/29(水) 22:36:55
「SummerKitchen2004」「otzoi」

151 :p2165-ipbf205kyoto.kyoto.ocn.ne.jprlo:2006/11/29(水) 22:37:43
SummerKitchen2004otzoi

152 :p2165-ipbf205kyoto.kyoto.ocn.ne.jprlo:2006/11/29(水) 22:38:57
SummerKitchen2006otzoi

153 :デフォルトの名無しさん:2006/11/30(木) 03:43:57
>>144、特に>>145
死ぬほど感謝します!
少し先に進めました!
こんどおごらせて下さい!

154 :デフォルトの名無しさん:2006/11/30(木) 06:53:36
うむ。

155 :デフォルトの名無しさん:2006/11/30(木) 12:07:09
お前の肉棒をおごらせてくれ

156 :デフォルトの名無しさん:2006/11/30(木) 12:11:41
記述に関して質問です。
VS2005を使用してます。
構造体などでポインタを使う時
(*p_hoge).xxx = 1;

p_hoge->xxx = 1;
とも書きますが、オブジェクトのポインタと関数のポインタがある場合
int型の引数と戻り値がある関数実行
int ans = (*p_obj.*p_func)(1);
を同じように->で記述できますか?

157 :デフォルトの名無しさん:2006/11/30(木) 13:09:57
>>156
(p_obj->*p_func)(1)

158 :156:2006/11/30(木) 13:54:47
>>157
ありがとうございます。
無事動作しました。

159 :デフォルトの名無しさん:2006/11/30(木) 18:35:34
(*p_Hoge).xxxをp_Hoge->xxxとも書きますがって言うが
(*p_Hoge).xxxなんて常用するやつぁそうは居らん

160 :デフォルトの名無しさん:2006/11/30(木) 19:21:04
オーバーロードしている場合はまあそういうこともあるだろう。

161 :デフォルトの名無しさん:2006/11/30(木) 20:43:18
だったら->も多重定義しておけと。

162 :デフォルトの名無しさん:2006/11/30(木) 20:52:48
C言語でなのですが、時間差で文字が表示されていくように下の方法で作ったのですが
これ以外にも方法がありましたらお願いします。

#include<stdio.h>
int main()

{
int i;
for(i=0; i<600000001; i++){

switch(i){
case 1:
printf("3・・・");
break;
case 200000000:
printf("2・・");
break;
case 400000000:
printf("1・");
break;
case 600000000:
printf("0!\n");
break;
default:
break;
}
}
return 0;
}

163 :デフォルトの名無しさん:2006/11/30(木) 21:04:37
すごく、非現実的です

164 :デフォルトの名無しさん:2006/11/30(木) 21:08:42
>>162
OS の時間管理 API を使え。

165 :162:2006/11/30(木) 21:53:04
すみません、APIはまだ勉強していないので
使用しない方法では無いでしょうか?

166 :デフォルトの名無しさん:2006/11/30(木) 21:56:34
>>165
何がやりたいんだ?
最初のforの中にprintf書けば?

167 :デフォルトの名無しさん:2006/11/30(木) 22:03:45
windowsなら
printf("3・・・");
Sleep(1000);
printf("2・・");
Sleep(1000);
printf("1・");
Sleep(1000);
printf("0!\n");

168 :デフォルトの名無しさん:2006/11/30(木) 22:11:38
API使いたくないならforでひたすら時間取得しまるとか・・・
詳しく調べたことないからよくわからんがsignal関数とかでタイマーとか使えなかったっけ?

169 :デフォルトの名無しさん:2006/11/30(木) 22:19:05
>>165
time.h の time() と difftime() を使えばなんとかなるんじゃない?
ぐるぐるまわすことになるから CPU に優しくないけど。

170 :デフォルトの名無しさん:2006/11/30(木) 22:35:39
すみません、プログラミング超初心者なのですが、
メモ帳に作成したソースコードを
コンパイルするにはどうしたら良いでしょうか?
ちなみに言語は、Cです。

171 :デフォルトの名無しさん:2006/11/30(木) 22:37:22
>>170
ソースコードを保存して
コンパイラを手に入れて
マニュアル等に従ってコンパイル

172 :デフォルトの名無しさん:2006/11/30(木) 22:37:43
>>170
コンパイラによりますが、一般的にはファイルに保存して、
ファイル名をコンパイラに伝えればよいはずです。

173 :162:2006/11/30(木) 22:52:42
>>166
プロンプト上でアスキーアートを使った擬似的なパラパラ漫画を作ってみようと思いまして、
↓のが試しに作ってみたものなのですが他にも方法がないかなと・・・
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3060.txt

174 :デフォルトの名無しさん:2006/11/30(木) 22:58:00
>>173
>>167-169

表示したい文字列は配列にでも入れて
for(i=0; i<270000001; i++){
if(i%30000000 == 0)
printf(str[i/30000000]);
}

175 :デフォルトの名無しさん:2006/11/30(木) 23:07:07
>>173
\rのがよくね?

176 :デフォルトの名無しさん:2006/11/30(木) 23:51:44
>>171、172
ありがとうございます。

177 :デフォルトの名無しさん:2006/12/01(金) 06:20:48
ダメすぎるな

178 :デフォルトの名無しさん:2006/12/01(金) 09:01:51
>>173
だからSleep(Unixならsleep)使えと。
マルチタスクOSでfor使ったウェイトは御法度

179 :デフォルトの名無しさん:2006/12/01(金) 12:09:22
クラスのメンバに定数を入れたいのですが(const int XX=100とか)
コンパイルエラーになります、どうすればいいですか?

180 :デフォルトの名無しさん:2006/12/01(金) 12:14:24
>>179
外部で定義する

class X {
const double d;
................
};

double X::d = 1.234;

181 :デフォルトの名無しさん:2006/12/01(金) 12:15:09
あ、しまったこれはstaticの時だけね。
staticでない定数はコンストラクタの初期化リストに入れる

182 :デフォルトの名無しさん:2006/12/01(金) 12:17:03
>>181
ありがとうございます。staticにして外部で定義してみます。

183 :デフォルトの名無しさん:2006/12/01(金) 12:18:30
>>182
static const intだけは例外的にクラス内で定義できるはず

184 :デフォルトの名無しさん:2006/12/01(金) 13:56:55
>>183
VC6とeVCだけ駄目でした。

185 :デフォルトの名無しさん:2006/12/01(金) 14:01:24
>>184
古いコンパイラとサブセットはだめぽかもわからんね

186 :デフォルトの名無しさん:2006/12/01(金) 16:20:43
>>184
そういうときにはenumで代用すればよい。

187 :デフォルトの名無しさん:2006/12/01(金) 16:21:51
enumで代用かな。
その辺自動でやってくれるのが BOOST_STATIC_CONSTANT

188 :デフォルトの名無しさん:2006/12/01(金) 16:40:18
プログラミング初心者なのですが、
コマンドプロンプトの使い方でわからないことがあります。
コマンドで日本語のファイル名を入力したいときどうしたら良いでしょうか?
半角/全角キーを押しても日本語入力できない!
日本語に変換する方法があるのでしょうか?
どなたか教えてください。


189 :デフォルトの名無しさん:2006/12/01(金) 16:41:11
>>188
C/C++と何も関係ないな

190 :デフォルトの名無しさん:2006/12/01(金) 16:49:21
>>189
言語はCです。

191 :デフォルトの名無しさん:2006/12/01(金) 16:55:06
>>190
コマンドプロンプトの使い方と言語がCであることにどういう関連があるのだ?

192 :デフォルトの名無しさん:2006/12/01(金) 16:57:05
>>188
Alt押しながら半角/全角キー押してるのか?

193 :デフォルトの名無しさん:2006/12/01(金) 17:02:35
>コマンドプロンプトの使い方でわからないことがあります。
この段階で鼬害ということが判らないわけはないと考えられるので、
釣りか、さもなくば教えて君なのだろう。

194 :デフォルトの名無しさん:2006/12/01(金) 18:14:40
Windows板行け屑

195 :デフォルトの名無しさん:2006/12/01(金) 19:37:59
>>192
答えるなよ

196 :162:2006/12/02(土) 00:18:49
おくれながら色々アドバイスありがとうございます。

197 :デフォルトの名無しさん:2006/12/02(土) 03:05:28
くだらな〜いしつもんですが、
void hoge (void){
unko;
return;
}
と言う関数の戻り値って何なのですか?
void型ですか?
そもそもvoidって何なんですか?

198 :デフォルトの名無しさん:2006/12/02(土) 03:48:44
つ英和辞書

199 :デフォルトの名無しさん:2006/12/02(土) 03:50:37
ということにしたいのですね

200 :デフォルトの名無しさん:2006/12/02(土) 03:54:55
>>198
いや、もちろんvoidの日本語訳は分かりますよ。
ただ、EAXレジスタに何が代入されるのかぁと思って。

201 :デフォルトの名無しさん:2006/12/02(土) 04:08:48
入っている値が永遠に使われないとしても
レジスタに何が入っているかが重要だと思ってるわけ?

202 :デフォルトの名無しさん:2006/12/02(土) 04:24:01
なに語気を荒げて
質問に質問を返してるんだろう。

203 :デフォルトの名無しさん:2006/12/02(土) 04:28:52
おっと ここで会話が成り立たないアホが一人登場〜
質問に質問で返すとテスト0点になるの知ってたか?
マヌケ

204 :デフォルトの名無しさん:2006/12/02(土) 05:07:51
質問に質問で返されたら、最初の質問者が困るだけでしょ。

テストって何だろう?
「設問」と「質問」は全く別のものなのだけど。


これだから週末は面白いね。

205 :デフォルトの名無しさん:2006/12/02(土) 05:51:33
0じゃなくて0なのが
なぜか全てを物語ってる気がするね。

206 :デフォルトの名無しさん:2006/12/02(土) 05:56:34
0だっていいじゃない
無能なんだから
みつを

207 :デフォルトの名無しさん:2006/12/02(土) 08:58:42
>>200
んなもん、自分でコンパイラが生成したasmソース見ろよ。
gccなら-S
VC++のclなら/FA
大抵のコンパイラにはそれに類するオプションがあるはずだ。
あんまり「アセンブラならどう」という理解の仕方に偏るのは
感心せんがな。

ま、結論から言うと、何も代入しない。


208 :デフォルトの名無しさん:2006/12/02(土) 09:02:48
voidという英語の日本語訳はわかってても、「戻り値void」の意味が解って無いんだから仕方ないわな
いくらネットで色んな情報が入手できると言っても
プログラムやるなら本の1冊2冊くらい買って勉強しれ

209 :デフォルトの名無しさん:2006/12/02(土) 10:17:32
現在ほどほど学んだのがC言語のみなのですが、
画面の判定を行いたいと考えております。
任意の座標(ドット?)がどうなっているか、色という情報になるのでしょうか?
どういった手順で進めていけば、その情報を得られるでしょうか?

210 :209:2006/12/02(土) 10:35:30
質問が下手だったと思いますので訂正させていただきます;
画面上の色を取得するにはどういった手順を踏めば得られるのですか?
よろしくお願いしますorz

211 :デフォルトの名無しさん:2006/12/02(土) 10:50:30
>>210
まず>>1を良く読む。

212 :デフォルトの名無しさん:2006/12/02(土) 11:23:57
ひょっとしてスレ違いだったって奴ですか・・・orz
お邪魔しました、すんませんすんません

213 :デフォルトの名無しさん:2006/12/02(土) 11:26:24
> 質問者は必ず、環境を書きましょう。

214 :デフォルトの名無しさん:2006/12/02(土) 11:36:58
そして、十中八九WinAPIスレ行きになりそうな予感

215 :デフォルトの名無しさん:2006/12/02(土) 14:09:47
WinAMPスレに見えた。

216 :197:2006/12/02(土) 14:17:53
すいません。
回答有り難うございます。

copyの戻り型はvoidになっている。
これは返される値がないことを明示するためである。

つまりvoid型というものが存在するのでしょうか?

217 :デフォルトの名無しさん:2006/12/02(土) 14:32:21
存在しなきゃコンパイルエラーになってるだろうね

218 :デフォルトの名無しさん:2006/12/02(土) 15:02:03
>>216
>>208

219 :デフォルトの名無しさん:2006/12/02(土) 16:13:38
テキストエディタで入力できるような普通の日本語全角文字ってのは
必ずchar2つ分で表現されるんでしょうか?
あと、それ以外でもchar3つ分の文字(国内外問わず)ありうるんでしょうか?

220 :デフォルトの名無しさん:2006/12/02(土) 16:16:54
日本語ならとりあえず、「shift_jisで」って前提を置いたほうがいいのかな
あいまいですみません('A`)

221 :デフォルトの名無しさん:2006/12/02(土) 16:29:15
utf8とかは3Byte以上になったはず

222 :デフォルトの名無しさん:2006/12/02(土) 16:32:00
中東の言語が確か3バイト
現状、一般的な日本語OSなら2バイトと思って差し支えない

223 :デフォルトの名無しさん:2006/12/02(土) 16:38:13
ありがとうございます

wcharとかcharとかutfとかeucとかいまひとつわかんないよママン…

224 :デフォルトの名無しさん:2006/12/02(土) 20:11:26
EUC-JPなら補助漢字は3バイトになる。

225 :デフォルトの名無しさん:2006/12/03(日) 15:48:20
SJIS、EUC-JP、JIS → 1〜2バイト
UTF-16、WinのWCHAR → 2バイト
UTF-8 → 1〜4バイト(日本語は3バイト)
EUC-JP(拡張版) → 1〜3バイト
UTF-32、Linuxのw_char → 4バイト

226 :デフォルトの名無しさん:2006/12/03(日) 16:03:25
>>225
UTF-16のサロゲートペアは?

227 :デフォルトの名無しさん:2006/12/03(日) 17:05:29
可変長文字コードはもういやだー

228 :デフォルトの名無しさん:2006/12/03(日) 17:23:41
>>225
生半可な知識で適当なこと書くなよな
UTF-8は6byteまでだし。

229 :デフォルトの名無しさん:2006/12/03(日) 17:24:42
>>227
UCS2でいいんなら、それが一番楽
cp932の範囲で使ってる分には特に困らないし

230 :デフォルトの名無しさん:2006/12/05(火) 17:54:09
多くのコードで
if (!変数)
ではなく
if (NULL == 変数)
を目にするんですが、どうしてでしょうか?
!変数と比べて可視性が高い事だけが理由ですか?

よろしくお願いします。

231 :デフォルトの名無しさん:2006/12/05(火) 18:10:25
好みの問題。
ただしhoge == NULLはいいとして、NULL == hogeはくだらない書き方。
http://www.kouno.jp/home/c_faq/c17.html#4

232 :デフォルトの名無しさん:2006/12/05(火) 18:13:59
>>231
勉強になりました、ありがとうございました。

233 :デフォルトの名無しさん:2006/12/05(火) 18:46:37
例えばその変数が関数の戻り値を取る場合
エラーが必ず0とは限らないということもある(特にWindows)


234 :デフォルトの名無しさん:2006/12/05(火) 21:42:13
>>231
>NULL==hogeはくだらない書き方。

リンク先も同様の主張でワラタ。
それにしても、どうして左側に定数を持ってくることにそんなに抵抗があるんだろう?
単に自分の好みじゃないって言うだけならまだ理解できるんだが、なんでそこまで否定的なんだ?

235 :デフォルトの名無しさん:2006/12/05(火) 21:53:33
否定的なのは、感覚的に「NULLが(is)hogeなら」っていう不可解な読みになっちゃうからじゃないかな?



236 :デフォルトの名無しさん:2006/12/05(火) 22:12:22
そうだな。コードが十分に分かりやすいかどうかを知るためには
電話テスト(電話の相手に音読してみせる)が有効だと
カーニハン先生も言ってるしな。

237 :デフォルトの名無しさん:2006/12/05(火) 22:49:35
>>235-236
他人にまでスタイルを押し付ける理由としては根拠が不十分だとは
思うけど、せめてそれぐらいの理屈捏ねてればまだいいのに
>>231 のリンク先みたいに逆のスタイルの利点だけあげておいて
それを否定しているのを見ると頭がおかしいようにしか見えない。

238 :デフォルトの名無しさん:2006/12/05(火) 22:53:31
math.h をインクルードして M_PI 使おうとしたけど出ません
M_PI = π では無いのですか?

WinXPのVisualStudio2005 使ってます 

239 :238:2006/12/05(火) 23:05:28
ごめんなさい、調べたら、
VisualStudioはM_PIを定義されて無いみたいですね orz
自己解決しました

#define _USE_MATH_DEFINES
#include <math.h>

使います

240 :デフォルトの名無しさん:2006/12/05(火) 23:20:25
>>234
リンク先に書いてあるとおり変数同士の比較では意味がないから。
それにどうせ今時のコンパイラなら警告を出してくれる。

241 :デフォルトの名無しさん:2006/12/05(火) 23:21:50
>>237
特定の人間を「頭がおかしい」とまで言うにしては
根拠が不十分にもほどがあると思うよ、それ。

242 :デフォルトの名無しさん:2006/12/05(火) 23:29:07
>>240
それだとどっちでもいい理由にしか過ぎなくて、否定する理由にはなってないよ。

243 :デフォルトの名無しさん:2006/12/05(火) 23:31:58
>>241
十分だろ。

244 :デフォルトの名無しさん:2006/12/05(火) 23:33:28
Boostでも読め
最高のプログラマが実にいろんなスタイルで書いている
定数==も存在する。
コードを読むこととは他人のスタイルを楽しむことだ
なんちて

245 :デフォルトの名無しさん:2006/12/05(火) 23:36:55
>>237,241
俺も if (NULL == x) 式のスタイルは嫌いだが、
CFAQのそこんとこの記述はちと偏りがあるかな、と思うね。
ま、頭おかしいとまでは思わんが。

246 :デフォルトの名無しさん:2006/12/06(水) 00:20:59
>>243
この程度で十分と思ってしまうのは頭おかしいとしか思えない。

247 :デフォルトの名無しさん:2006/12/06(水) 03:30:04
if(定数 == x)という書き方もありとは思うがな...
理由が先に来てた方がコードが読みやすい場合もあるし

まあ、NULLを先頭に持っていく意味はわかんないが...
if(ALLOC_ERROR == x)
とかだと、読みやすくて良いと思う


248 :デフォルトの名無しさん:2006/12/06(水) 03:50:06
>>247
その形が複数並んでれば見やすいと思う。
でもふつうはあまり目にしない書き方だから
見にくい場合がほとんど
実際、たまに目にするけどわかりにくい

249 :デフォルトの名無しさん:2006/12/06(水) 05:00:02
MS Excelに色んな関数が山のように入ってますけど、あれのプログラムを見る方法はないでしょうか?

250 :デフォルトの名無しさん:2006/12/06(水) 06:26:50
>>248
そういうのをフツーは慣れの問題って言うんじゃないの?

251 :デフォルトの名無しさん:2006/12/06(水) 11:25:32
俺は「定数==変数」の書き方大好きだけどな。
条件判定において、その変数が何物なのかよりも、
そこで何が判定されてるかが先に目に飛び込んでくる方が
読みやすいっていう俺理論。

NULLとの比較はそもそもやらないが。
つーかNULL書かない。

252 :デフォルトの名無しさん:2006/12/06(水) 11:48:04
>>249
逆アセンブルなりすれば見られるんだろうが…
根気と能力と刑務所に入る勇気と無謀さが必要。それぐらいだったら
自分で一から書いた方がいいとは思わないか?

253 :デフォルトの名無しさん:2006/12/06(水) 12:10:21
>>251
俺は「変数==定数」の書き方。
「何の状態」によってこの処理はされるのかを明確にしたいから
比較対象を先に書く、っていう俺理論。

254 :デフォルトの名無しさん:2006/12/06(水) 12:29:39
俺は関数の戻り値と定数を比較することが多いから「定数==変数(関数)」派。
関数の引数が沢山あるとその結果がどうっだったら条件成立なのかがそうほうが
断然わかりやすい。逆のスタイルだと最悪、定数がスクロールしなきゃ見えん
かったり、改行された位置に来たりして分かりづらい。
俺がif文を見る時の瞬間的なビジョンは↓こんな感じ。

if (定数 == 関数(ほげ, ひげ, まげ, はげ, ぬるぽ, ぬるぽ,...
if (関数(ほげ, ひげ, まげ, はげ, ぬるぽ, ぬるぽ, ぬるぽ...

前者だと俺の脳内CPUは1Clockでそのif分の大体の意味をつかめるが
後者だと同程度の理解をするのに数Clockを要する。とかそんな感じ。

255 :デフォルトの名無しさん:2006/12/06(水) 14:14:25
つまんねーネタほど人が群がる傾向は年々強まっていくな。

256 :デフォルトの名無しさん:2006/12/06(水) 14:28:52
WinでCのCUIアプリでビープ音出したいんですけど
printf("%c",0x07);
で出ませんでしたっけ?




257 :デフォルトの名無しさん:2006/12/06(水) 14:58:29
>>256
それで出るはずだと思うがな。stdoutがリダイレクトされてなければ。

258 :デフォルトの名無しさん:2006/12/06(水) 15:43:55
なんか使ってるパソのせいみたいでした。
別のでは鳴ったので。どうもおさわがせいたしました。

259 :デフォルトの名無しさん:2006/12/06(水) 16:09:58
>>255
タイトルにも【初心者歓迎】ってなってるスレでなに言ってんだ、お前?

260 :デフォルトの名無しさん:2006/12/06(水) 16:19:09
初心者≠馬鹿

261 :デフォルトの名無しさん:2006/12/06(水) 16:36:38
>>259
「群がっ」ってるレスは明らかに初心者のものではなくて
非初心者による宗教論争にも行かない自分語りなのに
なに言ってんだ、お前?

262 :デフォルトの名無しさん:2006/12/06(水) 16:38:24
今時のPCは内蔵スピーカが省略されてて'\a'でも音が出ない奴が
ちらほらあるからなぁ・・・・

圧電スピーカーはパーツ屋に行けば売ってるんだが

263 :デフォルトの名無しさん:2006/12/06(水) 18:27:06
コンパイルしてD&Dで、
『てすと.dat』という名前のファイルを開こうとしたら
エラーになります。
(半角で)『test』という名前のファイルの場合は、
正常に開けます。
『てすと.dat』の場合に開けないのは、何か問題があるのでしょうか?

#include <fstream>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
ifstream fin;
fin.open(argv[1], ios::in);
if (!fin){
cout << "以下のファイルを開けません!\n"
<< "ファイル名 : " << argv[1] << '\n';
};
}

【環境】Visual C++ 2005 Express Edition
コンソールアプリケーション

264 :デフォルトの名無しさん:2006/12/06(水) 18:34:10
>>263
こっちでは同環境(与えられた情報の範囲内では)開けるがなぁ…

265 :デフォルトの名無しさん:2006/12/06(水) 18:47:14
>>264
確認、ありがとうございます。
どうしてでしょう。何か私の環境に問題があるのでしょうか?
どうしても、if文の中に入ってしまいます。

266 :デフォルトの名無しさん:2006/12/06(水) 18:49:56
全角、半角交じりだと、入力してるファイル名がそもそも間違ってないか確認した方がいいのでは?


267 :デフォルトの名無しさん:2006/12/06(水) 19:00:03
>>266
if文の中に入って、↓のように表示されるのは確認しました。
 以下のファイルを開けません!
 ファイル名 : D:\てすと.dat
入力されているファイル名は正しいと思います。これじゃ甘いですかね?

268 :デフォルトの名無しさん:2006/12/06(水) 19:19:40
俺(EE)も以前それでつまづいたことがあるんだけど、wchar_tにして渡さないとだめみたいだった
fin.open(L"D:\\てすと.dat", ios::in);

269 :デフォルトの名無しさん:2006/12/06(水) 19:24:25
std::locale::global(std::locale("japanese"));

270 :デフォルトの名無しさん:2006/12/06(水) 19:29:02
>>268

>俺(EE)も以前それでつまづいたことがあるんだけど、wchar_tにして渡さないとだめみたいだった
>fin.open(L"D:\\てすと.dat", ios::in);

おー、開けました。
↑のL"D:\\てすと.dat"のLと\\がポイントですか?
Lと、\×2をしてopenの括弧に入れないといけないってことは、
argvから入力しても、そのまま
fin.open(argv[1], ios::in);
なんてことは無理ってことですよね?
(だとすれば、openじゃなくてfopenの方が使いやすい気がする...)

271 :268:2006/12/06(水) 19:32:32
>>270
>>269だな。
setlocale(LC_ALL, "");
とかって書こうとして開いたらすでにつっこまれてた

272 :デフォルトの名無しさん:2006/12/06(水) 19:37:56
>>270
ソース上は\\だけど、実際には\だぞ。


273 :デフォルトの名無しさん:2006/12/06(水) 19:41:12
>>269
>>271
>>272
ありがとうございます。
開けました。
ロケールって言うんですか?私は初めてです。
(>>268 のLもロケールのこと?)
急についていけなくなっちゃいました。
とりあえず、検索したら、載っていたので見てみます。
ttp://always-pg.com/c/runtime_rd/locale/setlocale.html


274 :263@質問者:2006/12/06(水) 19:49:01
std::locale::global(std::locale("japanese")
↑これを設定しないといけないのは、Visual C++ 2005 EEの場合で、
他の環境では、不要の場合もあるんでしょうか?


275 :264:2006/12/06(水) 20:10:51
同じ環境で開けてしまった俺の立場はいったいどうなるんだ?

276 :デフォルトの名無しさん:2006/12/06(水) 20:31:03
>>273
そのLはそれに続く文字or文字列がワイド文字であると知らせるためのもの

277 :デフォルトの名無しさん:2006/12/06(水) 20:46:01
Large の L じゃなかったっけ?
でっかい数値リテラルにもつけるやつと同じ意味だよね?

278 :デフォルトの名無しさん:2006/12/06(水) 20:55:59
いや、意味チャウやろ。
ていうか、数値リテラルのLはLongやろ…

279 :デフォルトの名無しさん:2006/12/06(水) 20:59:29
ついでに言うと数値リテラルのは数値の後に書く

280 :デフォルトの名無しさん:2006/12/06(水) 21:05:35
>>274
俺の環境はVS2003.NET(VC7.1)だが、別にいらん。

VS2005(VC8.0)では #define UNICODE がデフォのようだし、
デフォルト動作としてパスを勝手にUnicode変換して
CreateFileW()でファイル開こうとするのかもな。
そんなら、確かにlocale設定してエンコード指定しとく必要があるだろう。

なんか、VC8.0て、ワイド文字/locale周りの品質が聞くだに
怪しいな……
wcoutにwchar_tがちゃんと出力できないとかいう話もあったし……

SPか何かで直るのかねえ。
CランタイムのDLL自体がダメってことだと、SPで開発環境は直せても
他環境は古いままでバグってる可能性あるしキツいよな。


281 :デフォルトの名無しさん:2006/12/07(木) 04:01:31
std::locale::global() でも症状は改善するけど、数値の出力にカンマが入るようになったり、
副作用が大きい。問題が発生するのは、 fstream の open() の中で勝手に
mbstowcs() を使って変換するせいなので、 setlocale(LC_CTYPE, "") とすれば
十分だったはず。

282 :デフォルトの名無しさん:2006/12/07(木) 04:45:37
正直locale指定は死んでくれて良い。
つーか誰かアカデミック・バカどもの手から、C++を取り上げてしまってはくれまいか。
奴らはなんかもっとこうメタメタなメタ言語でも与えて延々思考ゲームで遊んでるべきで、
高度な最適化を施された生バイナリをOOPで組めるというシンプルなC++の存在意義を
脅かす以外に何一つC++に貢献してくれてくれてない気がするんだが、その辺どーですか。

283 :デフォルトの名無しさん:2006/12/07(木) 04:53:15
>>282
「あまり賢くない人は自分が理解出来ないことについては何でもけなす」 - ラ・ロシュフコー

284 :デフォルトの名無しさん:2006/12/07(木) 05:29:29
借り物の言葉なんかでなくって、あなた自信の言葉が聞きたいです。
ママ的には。

285 :デフォルトの名無しさん:2006/12/07(木) 05:38:43
こんだけシンプルな格言は、オリジナルでも細かい口調しか変えようがないな。
で、「そりゃお前があんま賢くないから、価値もわかんねーで貶してるだけだろ」
に変わった途端納得するのも変な話。

286 :デフォルトの名無しさん:2006/12/07(木) 06:01:25
std::locale::global(std::locale("japanese"));
↑設定すると、以降で↓のような全角の出力をしようとすると
難しくなります。なぜ?これって回避する方法はありますか?

 cout << "表示テスト" << '\n';

287 :デフォルトの名無しさん:2006/12/07(木) 06:54:40
なんか、↓を追記すると、std::locale::global(std::locale("japanese"));は解除されるみたいです。(解決できたかも)
std::locale::global( std::locale("C") );

288 :デフォルトの名無しさん:2006/12/07(木) 07:51:11
cout.imbueしろよ

289 :デフォルトの名無しさん:2006/12/07(木) 11:40:48
>>286-287 >>281

290 :デフォルトの名無しさん:2006/12/07(木) 11:45:15
STLportのように、locale対応すると重くなるからとばっさり切り捨てて
"C"だけ実装してあるライブラリを使えば気が楽になるよ^^

291 :デフォルトの名無しさん:2006/12/07(木) 12:19:04
>>288
>cout.imbueしろよ
imbueってどうやって使うんですか?WEBで検索してもよく分からないです。
(というか何をやるものか、わかりません。)
こんな(↓)風にすればいいんですかね?
 cout.imbue(std::locale::global(std::locale("japanese")));

>>289
@でもAでも、記述した箇所移行で、coutが日本語を
出力しなくなります。(VS EEでは、設定しないと日本語名のファイルを
オープンできなくなる...)
std::locale::global(std::locale("japanese")); ----- @
setlocale(LC_CTYPE, ""); -------------------------- A


292 :デフォルトの名無しさん:2006/12/07(木) 12:44:22
最小限に絞った setlocale(LC_CTYPE, "") でも結局副作用が許容範囲外だな。
fstream の open() する前に切り替えて、後で戻せばいいのか? MS 死ねって感じ。

293 :デフォルトの名無しさん:2006/12/07(木) 14:51:06
setlocale()は挙動がglobalだからなぁ。
もともとmain()の最初に一発 setlocale(LC_CTYPE, "") して安直にI18N/L14Nする、
という使いかた以外あんま考慮されてない気がするし。
実行時にglobalなCロケール切り替えるなんて、マルチスレッドなプログラムなら
論外だべや。

つか、このVC8.0の挙動って何なの?一応規格どおりのlocale対応だったり
するわけ?

294 :デフォルトの名無しさん:2006/12/07(木) 14:54:45
>>293
if文の中に記号をごちゃごちゃ入れられると見づらいので
よっぽどな事が無い限りは、適当な変数に値を入れ
それで比較してくれると可読性が良いので助かる。

295 :デフォルトの名無しさん:2006/12/07(木) 15:00:35
また変なコピペ厨が


>>293
しばしばそれで文句が出てるのを見かける。
俺は諦めて最初からUNIでいくかマルチでいくかしか考えてないや('A`)

296 :デフォルトの名無しさん:2006/12/07(木) 15:59:10
なんかC++ localeって小難しいんだな。
俺は手持ちにVC8.0の環境が無いので確認できんのだが、
↓みたいな方法でどうだ?

loc1はクラシックロケール(Cロケール)をベースにcodecvt<>だけを
日本語ロケールのものに置き換えてるんで、
setlocale(LC_CTYPE, "japanese") に相当すると思う。


#include <iostream>
#include <locale>

main()
{
    std::locale loc1(std::locale::classic(), "japanese", std::locale::ctype);
    std::locale loc2("japanese");

    std::cout.imbue(loc1);
    std::cout << "日本語 " <<10000 << "円" << std::endl;

    std::cout.imbue(loc2);
    std::cout << "日本語 " <<10000 << "円" << std::endl;
}


297 :デフォルトの名無しさん:2006/12/07(木) 16:24:15
>>296
動作確認

298 :デフォルトの名無しさん:2006/12/07(木) 16:48:21
結局
・locale設定しないとfstream::open()で日本語ファイル名のファイル開けない
・locale設定すると(w)coutが腐る
ってこと?

終わってるなVC2005

299 :デフォルトの名無しさん:2006/12/07(木) 17:57:43
やっぱりVC2005のライブラリもおかしいようだ。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7

300 :デフォルトの名無しさん:2006/12/07(木) 19:24:54
>>293 普通にバグ。

301 :デフォルトの名無しさん:2006/12/07(木) 23:20:18
重複組み合わせを出力していくプログラムを作っているのですが、
3H4=15としてa,b,cから4つ選ぶ場合、aaaa,aaab,aaac,aabb,aabc・・・となるのを
例えばaaaaについてaはP[0].co[0]=4、bはP[0].co[1]=0、cはP[0].co[2]=0
というように順々に格納していきたいです。
よろしくお願いします。

302 :デフォルトの名無しさん:2006/12/07(木) 23:33:23
int na, nb, nc, i;

i=0;
for (na = 4; na >= 0; na --) {
for (nb = 4 - na; nb >= 0; nb --) {
nc = 4 - na - nb;
P[i].co[0] = na;
P[i].co[1] = nb;
P[i].co[2] = nc;
i++;
}
}


303 :デフォルトの名無しさん:2006/12/08(金) 00:00:50
これだと重複組み合わせじゃなくてただの組み合わせじゃね?

304 :デフォルトの名無しさん:2006/12/08(金) 00:03:35
んなこたぁねぇよ?

305 :301:2006/12/08(金) 00:21:11
すいません、ABCの3種類だけではなくN種類とするとどうすれば良いでしょうか?
よろしくお願いします。

306 :デフォルトの名無しさん:2006/12/08(金) 00:24:09
>>305
まずは自分で書けよ。困ったら、困ってる箇所を相談してもいいからさ。

307 :デフォルトの名無しさん:2006/12/08(金) 00:42:31
>>306
どのように書いていけばいいのでしょうか?

308 :デフォルトの名無しさん:2006/12/08(金) 00:49:28
>>307
まずはメモ帳でも開け。あとは、わかるな?

309 :301:2006/12/08(金) 00:49:58
読み込みを4から40ぐらいに増やすと固まってしまいます。
年間で365日でやってみたいので3種類とすると3H365=67161ですよね?
これってintが足引っ張ってるんでしょうか?

310 :デフォルトの名無しさん:2006/12/08(金) 00:51:48
エスパーが必要だな。

311 :デフォルトの名無しさん:2006/12/08(金) 00:55:11
なんだこりゃ。
おまえさんのPCのスペックが悪いせいじゃないのか。
4ってのはna=4のこと?

312 :デフォルトの名無しさん:2006/12/08(金) 01:01:42
67161パターンも格納するからフリーズするんだよ。そんな量使うんだったら格納するな

313 :デフォルトの名無しさん:2006/12/08(金) 02:47:57
なんだかわからねーが、とりあえずPは何個用意してあるんだ。

314 :デフォルトの名無しさん:2006/12/08(金) 10:45:29
関数や変数なんかの名前で付けるべきでないとされるのって
アンダースコアで始まる、アンダースコアが2つ連続する、
ぐらいでしたっけ?

315 :デフォルトの名無しさん:2006/12/08(金) 10:52:05
>>314
そんな感じ。マクロ名でもダメだぜ。

316 :デフォルトの名無しさん:2006/12/08(金) 11:02:49
>>315
おう サンキュウ、ブラザー

317 :デフォルトの名無しさん:2006/12/08(金) 21:40:18
(メンバ関数でなくて)
普通の関数で、戻り値がstringクラスのものって宣言できますか?

↓こうすると、

string func ( char *ucAAA );

error C2146: 構文エラー : ';' が、識別子 'func' の前に必要です。

"戻り値がstringの関数の宣言"でなく、stringクラスのオブジェクトを
生成していると解釈されてしまったようです。

戻り値が、stringクラスの関数は、宣言できないのでしょうか?

318 :デフォルトの名無しさん:2006/12/08(金) 21:49:20
std::string
or
using namespace std;

319 :デフォルトの名無しさん:2006/12/08(金) 22:08:19
>>318

出来ました♪
ありがとうございます。

320 :デフォルトの名無しさん :2006/12/08(金) 23:39:11
すいませんが、教えてください。
VS2005stdで、C/C++等を勉強してるんですが
クイックソートについて質問さしてください。
クイックソートは再帰使って、文字通り早いのはわかるんですが
再帰呼び出しが多すぎるとスタックオーバーフローすると思うんです。
で、自分の環境下で、何回再帰呼び出ししたらスタックオーバーフローするのか
確かめるにはどうしたら良いんでしょうか。
配列が長くても、配列内の数値次第でソートのための再帰呼び出し回数が
変わってくるとおもうので、意味が無いと思いますし・・・
申し訳ありませんが教えてください。

321 :デフォルトの名無しさん:2006/12/08(金) 23:53:34
>>320
クイックソートは別に再帰を使わなくても実装できる。
再帰を使った方がシンプルに書けるが、繰り返しで実装することも可能だ。

322 :デフォルトの名無しさん:2006/12/09(土) 00:02:04
>>320
再帰は自前でスタックを用意すれば楽に移行できる

323 :デフォルトの名無しさん:2006/12/09(土) 00:08:01
>>320
リンカの設定あたりでスタックサイズ増やしてしまえ

324 :デフォルトの名無しさん:2006/12/09(土) 00:54:46
>>320
分割したうち短いほうを通常の再帰、長いほうを末尾再帰で書けばスタックはあふれないよ。

325 :デフォルトの名無しさん:2006/12/09(土) 01:48:17
Excel VBAで数値計算してmasu
実際計算してるのはC++で書いたdllで
エクセルがいろいろパラメータを変えてそいつを呼び出してます

それで、今性能評価をしているのですが、
特定のdllの特定の関数が呼びだされた前後でフックして
処理時間を計測することは可能でしょうか?

VBAにロジックを入れてもいいのですが、
多数のdllをいろんな場所で呼び出してるので大変です。

お願い島耕作


326 :デフォルトの名無しさん:2006/12/09(土) 02:00:13
なにこれ

327 :325:2006/12/09(土) 02:12:25
酔っ払っていたもので、失礼な書き方をして
申し訳ありませんでした

328 :デフォルトの名無しさん:2006/12/09(土) 03:18:10
普通にVBAで計測したら?
酔って下らないこと書く暇があったらそのくらいできるでしょ。

329 :デフォルトの名無しさん:2006/12/09(土) 10:05:23
>>328

あほか。それができないって書いてあんだろ
何が「できるでしょ?」だ。お前は学校の先生か。死ね!!

330 :デフォルトの名無しさん:2006/12/09(土) 10:13:14
>>328

>>329は私ではありません



でもハゲドウイ
わからないんだったらいちいちうざいレスしないでください

331 :301:2006/12/09(土) 11:36:18
>>301なのですが、C始めたばかりなので1日考えても分かりませんでした・・・。
最初の質問では重複組合せだったのですが、今回は重複順列で
for(a0=0;a0<4;a0++)for(a1=0;a1<4;a1++)for(a2=0;a2<4;a2++)for(a3=0;a3<4;a3++)for(a4=0;a4<4;a4++)for(a5=0;a5<4;a5++)printf("%d %d %d %d %d %d\n",a0,a1,a2,a3,a4,a5);
のようにforをひたすら列挙する以外の書き方はありますでしょうか?
よろしくお願いします。

332 :デフォルトの名無しさん:2006/12/09(土) 11:43:16
一晩寝ても酔いがさめてないのかよ。
知ってはいるがお前の態度が(ry

333 :デフォルトの名無しさん:2006/12/09(土) 11:47:16
質問です

if文って普通は

if(条件式){
処理
};

と書くと思うんですが、
本を読んでいたら条件式のところに変数だけのプログラムが出てきました

これって、どういう判断をしているのでしょうか?
ど素人な質問ですいません

334 :デフォルトの名無しさん:2006/12/09(土) 11:51:07
C/C++でが0が偽、0以外が真になる。

335 :301:2006/12/09(土) 11:52:25
for(j=0;j<na;j++)for(k=0;k<6;k++)for(a[k]=0;a[k]<2;a[k]++)printf("%d %d %d %d %d %d\n",a[0],a[1],a[2],a[3],a[4],a[5]);
こんな感じに書いてみたんですけどさっぱりで・・・。

336 :335:2006/12/09(土) 11:54:38
>>334
なるほど、つまりif文の中で書かれた変数がtrueかfalseかってことですね

ありがとうございました

337 :333:2006/12/09(土) 11:55:35
ごめんなさい
335は333でした

338 :デフォルトの名無しさん:2006/12/09(土) 12:01:59
>>329
>325には「大変」とは書いてあるが、どこに「できない」と書いてある?

>>330
http://pc8.2ch.net/test/read.cgi/tech/1165022193/298

339 :デフォルトの名無しさん:2006/12/09(土) 14:51:36
必死すぎて笑える

340 :デフォルトの名無しさん:2006/12/09(土) 20:13:12
笑いのツボが変だねキミ

341 :デフォルトの名無しさん:2006/12/10(日) 05:50:39
そもそも酔っぱらってて性能評価ができるのかね?
プログラムがまともに動いても、エンジニアが
壊れてるんじゃ・・・ねぇ

342 :デフォルトの名無しさん :2006/12/10(日) 21:55:10
質問さしていただきます。
Cでmalloc()を使ってヒープからメモリ借りて
realloc()でサイズを増やしたりできますが
C++では一度newしたあと、どうやって増やすんでしょうか
普通のintなりdoubleなりの配列ならstd::vectorを使って
pushbackやremoveやclearなどで増やして削除する要素を移動さし要素削除
で出来るのはわかるんですが、Cにあたるreallocはあるんでしょうか
すいませんが教えてください。お願いします。

343 :デフォルトの名無しさん:2006/12/10(日) 21:57:34
ない。
だからstd::vectorとそのメンバresizeを使え。

344 :デフォルトの名無しさん:2006/12/10(日) 21:57:47
>>342
C++にrealloc()に相当する演算子がないのは、コンストラクタや
デストラクタの絡みです。

自分で新たにnewしてコピーして面倒を見るか、コンテナを
使いましょう。

345 :デフォルトの名無しさん:2006/12/10(日) 21:57:58
>>342
reallocはない。
だからstd::vector等のresizeで代用
禿本にもそうしろと書いてある

346 :デフォルトの名無しさん:2006/12/10(日) 22:04:01
重婚にも程がある

347 :342:2006/12/10(日) 22:08:21
わかりました。
ありがとうございました。

348 :デフォルトの名無しさん:2006/12/10(日) 23:15:13
私のまったくの勘違いかもしれないのですが、BSD等なら特にヘッダーをincludeしなくても
writeやreadのシステムコールがC言語内で呼べますよね?
Windowsの場合、標準ライブラリなんかで最終的にシステムコールが出来るような
関数ってあるんでしょうか?とりあえずreadとかwriteは呼べなかったんですが・・・

349 :デフォルトの名無しさん:2006/12/10(日) 23:22:11
>>348
Windowsではシステムコール+OS提供ライブラリルーチン集に相当するものが
Windows APIと呼ばれている。

read(), write()といったAPIはWindowsには存在しない。
ReadFile(), WriteFile()ってのが、それ相当。
ただし、VC++のような開発環境は、Unixライクなread(), write()を
ライブラリレベルのエミュレーション層として提供している。

なお、「特にヘッダーをincludeしなくとも」というやり方は全く薦められん。
ANSI C以前ならあまり意味の無いこともあったかも知れんが、
今後はプロトタイプ宣言による型チェック機能を利用するためにも、
ちゃんとincludeしる。
Unixなら<unistd.h>などだ。

350 :デフォルトの名無しさん:2006/12/10(日) 23:27:33
>>349
なるほど、わかりやすい説明ありがとうございます。
ということはstdio.hなんかは内部でReadFile等の関数定義、並びにkernel32.dllなんかの
system32フォルダにあるDLLを動的(?)にリンクしてReadFile等の関数をImportしてる感じなんですかね?

ヘッダーに関しては普段はincludeしてたんですけど、少し実験したら動いちゃったもので。
気になって調べてました。

351 :デフォルトの名無しさん:2006/12/10(日) 23:41:41
>>350
Cコンパイラはヘッダの情報を見て型チェックなりを行うが、C言語において
プロトタイプ宣言は必須じゃないのよ。だから、仮にヘッダを取り込んで
いなくとも、コンパイラはコンパイルを通してしまう。
そして、リンカはシンボルの名前しか見ないから、適切なライブラリと
ちゃんとリンクされていれば、通してしまう。

この場合、コンパイラによるプロトタイプ宣言を利用した型チェックが一切
行われないし、例えば sqrt(1) みたいな呼び出し(本当はdoubleの引数が
要求されているのにintを渡している)も素通しだ。
プロトタイプ宣言があれば、int→doubleの型変換はコンパイラによって自動的に
なされる。

352 :351:2006/12/10(日) 23:48:31
あー。一応補足しとくが、
>そして、リンカはシンボルの名前しか見ないから、適切なライブラリと
>ちゃんとリンクされていれば、通してしまう。

普通リンクライブラリはリンカに対して明示的に指定してやらないといけないが、
処理系がデフォルトでリンクするライブラリも存在する。

何にも指定してないつもりでもread()やwrite()が使えたり
printf()が使えたりってのは、そのせいだ。
要するに、デフォルトでリンクされるライブラリの関数を、その本来の宣言と
無矛盾な形で利用している限りは、何もせずとも一応動作することは動作する。
ただし、それは良いやり方ではないから、今後はちゃんとヘッダを取り込むことだ。

353 :デフォルトの名無しさん:2006/12/10(日) 23:58:30
>>350
stdio.hほか殆どのヘッダが参照しているのは、
libcに当たるもの(VC++ではCRT、Cランタイムライブラリなどと呼んでいるが)。
そいつらがWindowsではWindows API、Unix/LinuxではPosix API(システムコール)を基に
Cの標準ライブラリの関数やその他独自の関数を実装している。


354 :デフォルトの名無しさん:2006/12/11(月) 00:07:05
>>350
ちょっと勘違いしてる部分もあるみたいなので補足すると。
>ということはstdio.hなんかは内部でReadFile等の関数定義、並びにkernel32.dllなんかの
>system32フォルダにあるDLLを動的(?)にリンクしてReadFile等の関数をImportしてる感じなんですかね?
ヘッダファイルは関数のプロトタイプ宣言などは書いてあるが、
ライブラリのリンクはまた別の話だ。
#includeでヘッダファイルをインクルードするとライブラリのリンクまでやってくれるというわけではない。
stdio.hが普通にテキストファイルとして存在するから中を覗いてみたら?

355 :デフォルトの名無しさん:2006/12/11(月) 00:18:23
>>354
>stdio.hが普通にテキストファイルとして存在するから中を覗いてみたら?
解説ヨロ^^;

356 :デフォルトの名無しさん:2006/12/11(月) 00:19:08
>>351
なるほど。暗黙のうちにライブラリがリンクされてしまう処理系もあるんですね。
知りませんでした・・・。丁寧にありがとうございます。

>>353
なるほど、libcなんていうライブラリがあるんですね。どこからOSのシステムコールに
入るのかずっと不思議だったのですが、解決しました。ありがとうございます。

>>354
stdio.hとか更にその中でimportされてるヘッダーを色々見てみたんですが、
VCはオープンソースじゃないせい(?)かその実装まではよくわからなかったんですよね。
まだよくリンクというものがわかってないので勉強したいと思います。
ありがとうございました。

357 :356:2006/12/11(月) 00:20:53
実装というか定義ですね。まあ>>355でいわれてるように宣言だけでも私には難解で
解説お願いしたいぐらいです・・・

358 :デフォルトの名無しさん:2006/12/11(月) 00:21:20
>>355
rm -fr stdio.h

359 :デフォルトの名無しさん:2006/12/11(月) 00:27:21
質問なんですが、gccで、
動的ライブラリのSOファイルにiostreamをインクルードすると、実行時に、
undefined symbol: __dso_handle
ってエラーがでるんですけど、なんか対処法ないですか?

$ g++ -Wall -g3 -c test.cc
$ g++ -shared -nostartfiles -o test.so test.o

こんな感じでコンパイルしてます。

360 :デフォルトの名無しさん:2006/12/11(月) 00:30:59
>>356
libcってのは、printf()のようなC言語標準関数群を含むライブラリの
伝統的な呼称。無論実際の名前は処理系によって違う。
ただし、<math.h>で宣言される数学関数等が含まれて居なかったりするが。

>>354が説明しているように、JavaやC#のような現代的な言語とCは違って、
ヘッダとリンクは明確に意味が違うものだ。importに相当する概念は
存在しない。

あくまでC言語としての宣言を取り込むのがヘッダの#include。
コンパイル後の、マシン語のレベルで実際にライブラリに実装されている
関数と結合するのがリンク。これを実行時に動的に行う仕掛けがいわゆる
DLLだ。

ちなみにVC++のように、#pragmaを利用して、ヘッダを#includeするだけで
自動的に必要なライブラリをリンクさせる実装もある。

361 :デフォルトの名無しさん:2006/12/11(月) 00:39:52
>>356
>VCはオープンソースじゃないせい(?)か
VCは標準ライブラリのソース付属してるよ。

362 :デフォルトの名無しさん:2006/12/11(月) 00:41:13
ライブラリはソースがついてこないとやってられないからな

363 :デフォルトの名無しさん:2006/12/11(月) 00:49:23
>>359
http://pc8.2ch.net/test/read.cgi/tech/1145357824/496-497

364 :デフォルトの名無しさん:2006/12/11(月) 01:31:40
>>361
Expressだと付いていない。
上の付いているエディションでも、改変したソースを人に配れるようなライセンスではないと思う。

365 :デフォルトの名無しさん:2006/12/11(月) 01:56:55
stdlibインクルードせずにmalloc使ってて「返り値intなのにポインタに格納しようとしてんな馬鹿!」
とか言われるなんてしょっちゅうですよ、ええ。

366 :デフォルトの名無しさん:2006/12/11(月) 04:32:50
>>364
Platform SDKに付いてるよ。最新のかどうかしらないけど。

367 :デフォルトの名無しさん:2006/12/11(月) 15:36:59
linux上でプロセス情報を取得するプログラムを作成したいと思っています。

検索して調べたところ
task_structという構造体にプロセス情報が格納されているということは分かったのですが、
検索したサイト先であげられているヘッダファイル "include/linux/sched.h" 内に
task_structに関する記述が無いのです。

上記構造体を利用するためには、
何か別の手段をとらないといけないのでしょうか?

OSはred hat linuxです。
分かる方いましたらよろしくお願いします。

368 :デフォルトの名無しさん:2006/12/11(月) 16:58:25
http://lxr.linux.no/ident?i=task_struct

日本語サイト見てるだけじゃ駄目だぞ。
あと、RedHatLinuxであるかどうかは全然問題ない。
カーネルのバージョン教えやがれ、GLIBのバージョン教えやがれ、
ついでにスレ違いだメーン、ですよ。

369 :デフォルトの名無しさん:2006/12/12(火) 02:30:48
ストリームを引数にしたいときって、どういう型にすればいいんでしょうか
例えば、何かを表示する関数something_dumpがあって
std::ofstream a;
//aのファイルを開く処理
something_dump(a);
あるいは
something_dump(std::cout);
みたいな使い方をしたいとき、something_dumpの型宣言はどうしたらいいんでしょうか

370 :デフォルトの名無しさん:2006/12/12(火) 02:59:00
>>369 std::ostream&

371 :369:2006/12/12(火) 03:07:41
>>370
無事動きました♪ありがとう

372 :367:2006/12/12(火) 12:14:02
>>368
スレ違いすいませんでした。
該当スレを見つけたのでそちらに逝ってきます

373 :デフォルトの名無しさん:2006/12/12(火) 13:12:54
struct name
{
unsigned name_1 : 1;
unsigned name_2 : 1;
};

こういう構文の : 1; ってどういうときに使うもんなんでしょうか?
さっき初めて見かけて、あてずっぽうでこの構造体にsizeofしたら4ってなったのですが
まったく意図というか用途がわかりません

ちなみにVC2005で試してます

374 :デフォルトの名無しさん:2006/12/12(火) 13:15:54
>>373
「ビットフィールド」


375 :デフォルトの名無しさん:2006/12/12(火) 13:22:31
>>374
びっくりするほど基本構文です
ほんとうにありがとうございました

376 :デフォルトの名無しさん:2006/12/12(火) 14:36:09
>>375
めったに使われないからね。
言葉すらひさびさに聞いた。

377 :デフォルトの名無しさん:2006/12/12(火) 15:03:06
まぁビットフィールドは色々問題多いから、自分で明示的にビット操作やる
ことのが多いかな

378 :デフォルトの名無しさん:2006/12/12(火) 16:58:17
VC++を使っています。
 市販のプログラムでフォーカスを失うとアニメーションを停止するアプリがあるのですが
バックグラウンドに押しやった状態でもアニメーションを続けてもらいたいのです。
 そこで、ON_WM_KILLFOCUSメッセージを渡さなければいいのではないかと思ったのですが、
このように、他のアプリケーションのイベントを阻止するようなプログラムを作るには
どのようにすればいいでしょうか?


379 :デフォルトの名無しさん:2006/12/12(火) 17:02:32
アプリケーションの名前は?

380 :デフォルトの名無しさん:2006/12/13(水) 01:39:50
>>378
アプローチの仕方が違う。
別スレッドで描画を回すか、別スレッドからWM_PAINTを投げるとかするのが常道。
他のプロセスの動作に干渉しようとしたり、処理を奪おうとするのは基本禁じ手。
一人和を乱す奴がいたおかげで全体が迷惑するのはよくある話。
避けるべき。

381 :デフォルトの名無しさん:2006/12/13(水) 02:00:01
>避けるべき。
これはまちがってないけど、一応技術的に回答しとくと
他プロセスのメッセージ動作にかかわるならシステムフック(グローバルフック)を使う
で、スレ違いだから以降そっちで聞くかググれ
http://pc8.2ch.net/test/read.cgi/tech/1163375772/l50

382 :デフォルトの名無しさん:2006/12/13(水) 19:26:10
場違いかもしれませんが、質問する場所が分からなかったのでここで質問させていただきます。
当方BCC Developer 1.2.21を使ってC言語の開発を始めたばかりの者ですが
例えばTest1.bdpというプロジェクトをつくってその下にsample1.c sample2.c sample3.c
といったファイルを作ったとします(ソースの中身はなんでもいい)
それで私が困っているのは、sample1.cをまず最初につくってメイクしてコンパイルして実行すればちゃんと実行できるのですが
sample2とsample3もメイク→コンパイル→実行といった順番で行うと
一番最後にコンパイルしたものしか実行できなくなります
(画面左のsample1や2を選択してメイク、コンパイル、再構築等を実行してから実行のコマンドを押してもSample3が実行される)
スレ違いかもしれませんが、解決法を教えてください。


383 :デフォルトの名無しさん:2006/12/13(水) 19:30:38
>>382
基本的にプロジェクト一つにつき実行ファイル一つだよ
(よってmain関数を持つファイルも一つだけ)
プロジェクトに複数のファイルを登録するのは分割コンパイルをするためにある


384 :382:2006/12/13(水) 22:06:34
へぇ、そうなんですか。
ありがとうございました。

385 :デフォルトの名無しさん:2006/12/13(水) 23:25:38
VC2003を使っています。
あるファイルが使用中かどうかを判断するにはどういったAPIを使えばいいでしょうか?
具体的には、監視しているWavファイルが使用されたら、
指定の動作(メールを送るとかLAN経由でファイルを実行するとか)
をするというものを作りたいのですが。


386 :デフォルトの名無しさん:2006/12/14(木) 00:39:17
#include<stdio.h>
int main(void)
{
int no;
scanf("%d",&no);
do{
if(no % 2 == 0){
1/2*no=no;
}
else{
1+3*no=no;
}
printf("%d\n",no);
}while(no != 1);
return 0;
}

左辺値が必要ってなんだよ うんこやろー('A`)

387 :デフォルトの名無しさん:2006/12/14(木) 00:43:58
>>386
もしかしたら、noにnoの半分の値を代入したいのか?
それなら、no = no / 2;だ。
そのエラーメッセージの意味は、「=の左側は代入できるものじゃないとダメ」と言う意味だね。

388 :デフォルトの名無しさん:2006/12/14(木) 01:03:39
>>387
おまい天才
ありんがちょーーーーーーー

389 :デフォルトの名無しさん:2006/12/14(木) 01:10:40
随分と安い天才だなあ。俺も欲しいぜ。

390 :デフォルトの名無しさん:2006/12/14(木) 08:32:43
C++ Win32APIです。
リソーススクリプトで作成したダイアログに、複数のエディットボックスがあります。
Tabボタンを押すと、他のエディットボックスにカーソルを持っていくようにしたいのですがどうすればいいのでしょう。


391 :デフォルトの名無しさん:2006/12/14(木) 08:43:00
メッセージループで IsDialogMessage を処理する

392 :デフォルトの名無しさん:2006/12/14(木) 10:45:16
>>390
WS_TABSTOP

393 :デフォルトの名無しさん:2006/12/14(木) 20:17:56
map<double, vector<string>> m;
が駄目なのはどうしてでしょうか?
どのように宣言すればいいのでしょうか?


394 :デフォルトの名無しさん:2006/12/14(木) 20:20:21
×map<double, vector<string>> m;
○map<double, vector<string> > m;

395 :デフォルトの名無しさん:2006/12/14(木) 20:23:17
>>394

即レスありがとうございます。
できました、ありがとうございました。


396 :デフォルトの名無しさん:2006/12/14(木) 21:11:03
>>395
そいつができるようになるにはもう少し時間がかかるぞ〜

397 :デフォルトの名無しさん:2006/12/14(木) 21:20:16
コンソールでアプリ作ってるんだけど、
printf("\x1b[1;1H");
とやってカーソル移動したり表示色変えたいんだけど、エスケープシーケンスが
うまくできない。どうやればいいかご教授ください・・・・環境はVC++2005EE、WinXPです。

398 :デフォルトの名無しさん:2006/12/14(木) 21:29:03
32bitコンソールアプリではエスケープシーケンスは使えない。
16bit DOSアプリならansi.sysを組み込めば使えるがVC++2005EEでは16bitアプリは作れない。

399 :デフォルトの名無しさん:2006/12/14(木) 22:05:36
代わりにWindows APIでカーソル移動や文字色変更の関数が用意されている。

400 :397:2006/12/14(木) 22:18:01
>>398,399
ありがと。ANSIもいいがWinAPIもやってみるよ。


401 :デフォルトの名無しさん:2006/12/14(木) 22:31:40
WinAPIがANSIじゃないというのか

402 :デフォルトの名無しさん:2006/12/14(木) 22:58:37
CってANSIで規格されてるでしょ?
でもWinAPIは環境依存だから違う・・と思ってたんだが。
WinAPIもANSIで規格されてるってこと?

403 :デフォルトの名無しさん:2006/12/15(金) 14:46:47
どこから突っ込んだものやら

404 :デフォルトの名無しさん:2006/12/15(金) 14:51:35
>>401-402
↑で言ってるANSIってのは端末制御の規格の話で、C言語の規格とは
全然別の話だよ。

405 :デフォルトの名無しさん:2006/12/15(金) 20:17:01
↓のソースコードみたいにyやnを入力してループを終了するのではなく、

 画面に
  continue finish
 のようなのを用意しておき、方向キーの「←」「→」で、
 選択した方されたほうを、括弧([ ])で
  continue [finish]
 のように表示させて、enterキーを押すと
 決定される(上の場合はループを抜ける)ようにしたいのですが、
 どうしたらいいのでしょうか?

#include <iostream>
using namespace std;

void main()
{
char cInput = 'n';
do {
cout << "終了する場合は y を入力\n";
cin >> cInput;
} while ( cInput != 'y' );
return 0;
}





406 :デフォルトの名無しさん:2006/12/15(金) 20:18:34
Visual C++ 2005 express (コンソールアプリケーションで)を使っています。


407 :デフォルトの名無しさん:2006/12/15(金) 22:47:58
>>405 Cならこれでいける
#include<stdio.h>
#include<conio.h>
#define KEYCODE_ENTER 0x0D
#define KEYCODE_EXTEND 0xE0
#define KEYCODE_RIGHT 'M'
#define KEYCODE_LEFT 'K'
void print_menu(int menu_item){
  if(!menu_item) printf("\r[continue] finish ");
  else printf("\r continue [finish]");
}
int main(void){
  int menu_item=0;
  int keycode;
  while(1){
    print_menu(menu_item);
    keycode=getch();
    if(keycode==KEYCODE_ENTER) break;
    if(keycode==KEYCODE_EXTEND){
      keycode=getch();
      switch(keycode){
        case KEYCODE_RIGHT: menu_item=1; break;
        case KEYCODE_LEFT: menu_item=0; break;
      }
    }
  }
  printf("Your choice is %d\n", menu_item);
  return 0;
}

408 :デフォルトの名無しさん:2006/12/15(金) 23:27:05
>>407

非常に助かります。
ありがとうございました。


409 :デフォルトの名無しさん:2006/12/16(土) 00:11:29
横からすまないが、誰か>>407を解説してくれないか。
一度目のkeycode=getch(); でキーボードから何か受け取りエンターキーなら
breakするよね。方向キーならmainの中の二度目のifに入れるところまでは
わかるがその下のkeycode=getch(); はMかKを受け取っているの?
方向キーって文字コードどうなってんだ?

410 :デフォルトの名無しさん:2006/12/16(土) 00:14:19
>>409
方向キーは一回押すと二つのコードがキーボードバッファに入れられます。
普通のキーとは扱いが違うので注意が必要です

411 :デフォルトの名無しさん:2006/12/16(土) 00:34:26
>>410
二つのコードだったのか!右がM、左がKみたいだけど
上下の方向キーはどうなんです?

412 :デフォルトの名無しさん:2006/12/16(土) 00:40:43
>>411
自分で試してみればいい
printf("%02X [%c]\n", keycode, (keycode<0x20 || keycode>=0x80)?'.':keycode);

413 :デフォルトの名無しさん:2006/12/16(土) 10:38:30
これからC++を学ぼうと考えています。

(プログラム自体が)初心者向けの書籍やサイトは多くありますが、
他のプログラム経験者がC++を学ぶための書籍やサイトってありませんか?

当方javaをメインでやっているので、
「"自動車"オブジェクトは"タイヤ"オブジェクトと"ハンドル"オブジェクトが云々」みたいのを
すっ飛ばした感じのがあればうれしいです。

414 :デフォルトの名無しさん:2006/12/16(土) 13:06:55
Javaやってるなら新要素はポインタくらいじゃね?

415 :デフォルトの名無しさん:2006/12/16(土) 13:12:16
java・・・w

416 :デフォルトの名無しさん:2006/12/16(土) 13:24:32
Javaで初心者じゃないなら初心者向けC/C++書籍・サイトでもいいんじゃ?
明らかに簡単なところは飛ばして読めば良いわけだし。

417 :デフォルトの名無しさん:2006/12/16(土) 13:28:17
>>414
templateを忘れるな。JavaのGenericとは異質だと思うぞ。
ようこそメタプログラミングの世界へ。

418 :デフォルトの名無しさん:2006/12/16(土) 13:59:10
質問です。
クラスのメソッドでvectorやmapなどのクラステンプレートをオーバーロードすると

error C2084: 関数 'void testDat::getUserParam(std::vector<_Ty> &)' は既に本体を持っています。

というエラーが発生します。サポートを見てみたのですがよく分かりませんでした。
どなたか初心者にも分かるように説明していただけませんか?
よろしくお願いします。

419 :デフォルトの名無しさん:2006/12/16(土) 14:26:05
>>418
それだけじゃなんとも言えないけど、クラステンプレートどうこうは関係なさそう。
testDatクラスの定義の仕方がおかしいんじゃない?

testDatクラス定義とgetUserParam関数の実装のソースを晒せば分かるかも。
(大きかったら全部載せないで、エラーが再現する必要最小限の部分にしてほしいが。)

420 :418:2006/12/16(土) 14:38:41
すみません、自己解決しました(^^;)
二回実装してしまっていました。
次回からもっとよくソース確認します。(´Д⊂グスン

421 :デフォルトの名無しさん:2006/12/16(土) 15:40:49
解答ありがとうございます。

>>414
ポインタは知識としては理解してます。
それよりも、不必要になったオブジェクトが確保したメモリは、
明示的に解放しなきゃならない(NULLを入れればいいの?)という噂を
耳にしたんですが…。GCは!?
それが本当なら恐ろしい話ですね…。

>>416
「ここは知ってるから飛ばそう」なんてうちに、重要な部分を見逃してしまう可能性があるので。
「java開発者のためのC#入門」みたいなサイトがあるんですが、そういうのがC++にもあればと。
もしなければ、初心者向けの本でも買って読もうと思います。
でもそれって中国語を学ぶために「中国の小学校に入学する」感じなんですよね…。

>>417
java1.4で開発してて、ジェネリックプログラムを知りませんでした。
java1.5のジェネリックは便利そうですね。
…でもjavaのそれとは異質なんですか('A`)

>>415
javaで悪かったなw

422 :413:2006/12/16(土) 15:41:40
失礼。↑は413です。

423 :デフォルトの名無しさん:2006/12/16(土) 16:52:28
>>421
GCは無い。が、C++的にはスマートポインタがあればそんなもの不要。
コンストラクタで初期化し、デストラクタで始末するのが全ての基本。

424 :871:2006/12/16(土) 17:00:44
http://textup.no.land.to/w/1166255748/
綺麗ですか?

425 :デフォルトの名無しさん:2006/12/16(土) 17:08:42
>>421
そもそもnewしないと使えないJavaにはGCが必要だが、
必ずしもnewする必要がないCにGCがないのは蓋し当然。
newしたものをdeleteするのが嫌ならvectorでも使いんしゃい。

426 :デフォルトの名無しさん:2006/12/16(土) 17:14:33
>>424
綺麗かどうか以前に、論外でダメすぎで阿呆。


427 :424:2006/12/16(土) 17:23:27
えーw
結構自信作なんですけど

428 :デフォルトの名無しさん:2006/12/16(土) 17:27:30
とりあえず文字列操作がうんこ。
\tがみつからない時の処理がない。
さらに後置インクリメントを始めて覚えた小学生のように無駄に使いすぎ
strcspn,strpbrkとかつかえば自前でループまわす必要ない。
グローバル変数死ね。
runのプロトタイプ定義しろボケ

結論を言えばゴミ

429 :デフォルトの名無しさん:2006/12/16(土) 17:27:40
この程度のプログラムで無駄に外部変数を使っている時点で論外。
与えるテキストファイルによっては誤動作の原因になりそうでダメすぎ。
標準関数でできることをわざわざ自分で実装している辺りは阿呆。

まぁ、いかにも初心者らしいコードで微笑ましくはあったよ。
指摘した辺りを自力で修正できたら、かなり力になると思うよ。
#これよりもっと酷いコードを書くプロがいるのも事実だけどね。

430 :デフォルトの名無しさん:2006/12/16(土) 17:42:28
これならどう?
while (fgets(buf, sizeof(buf), in))
{
scanf_ret=sscanf(buf, "%*[\t]%[^\t]%*[\t]%[^\t\n]", filename_src, filename_dest);
if(scanf_ret!=2)
continue;

rename(filename_src, filename_dest);
printf("\"%s\" -> \"%s\"\n", filename_src, filename_dest);
}

431 :デフォルトの名無しさん:2006/12/16(土) 17:42:34
return run();

この辺ががんばりを感じた

432 :デフォルトの名無しさん:2006/12/16(土) 17:48:31
>>430
横レスと書くとか >>424 と別人なら分かるようにそう書いておいてくれ

433 :デフォルトの名無しさん:2006/12/16(土) 18:07:49
>>424
ソースを隠す奴よりはずっと立派

434 :426=429:2006/12/16(土) 18:16:51
>>431
私は逆に、main()のみがコマンドインタプリタとのI/Fという考えからrun()がEXIT_*を返すのは反対。
つまり私なら、run()は処理の成否のみを返すことにして、main()でそれをどう扱うか決める。
どうせUsage表示するのもmain()だしね。

>>430
sscanf()を使う辺りは私好みw

>>433
激しく同意。

435 :デフォルトの名無しさん:2006/12/16(土) 18:23:49
>>424
sizeofの後は括弧でくくれ。
ライブラリを使え(strchr)

436 :デフォルトの名無しさん:2006/12/16(土) 18:28:23
sizeofの対象を括弧で括らないのは別にいいと俺は思うけどな。

437 :デフォルトの名無しさん:2006/12/16(土) 18:36:37
64個の整数(ピクセルの色データ)をファイルin.txtから読み込み、8×8のサイズのビットマップファイルout.bmpを生成するプログラムを作っていますが、なんだか良くわかりません。
64個の整数をすべて256にすれば青になると言われたのですが、黒になってしまいます。
一応ビルドと実行はできました。
自分で作ったソースは↓です
?http://www.geocities.jp/c_prog2011/file_2.txt?
一応問題文は↓です
?http://www.geocities.jp/c_prog2011/bitmap_1.txt?

よろしくおねがいします。

438 :デフォルトの名無しさん:2006/12/16(土) 18:39:34
>>437
オレが思うには

すべて256にすれば

すべて255にすれば

だな

439 :デフォルトの名無しさん:2006/12/16(土) 18:49:24
>>437
in.txt はテキストエディタで編集できる?できない?
出来上がりのビットマップのファイルサイズはいくら?
ビットマップのbppは32bitじゃダメ?

440 :デフォルトの名無しさん:2006/12/16(土) 19:06:16
教えてgooとおマルチ

441 :デフォルトの名無しさん:2006/12/16(土) 19:07:45
okwaveとマルチだな。

442 :デフォルトの名無しさん:2006/12/16(土) 19:08:22
被ったorz

443 :デフォルトの名無しさん:2006/12/16(土) 19:33:43
マルチポストチェッカーが欲しいな

444 :デフォルトの名無しさん:2006/12/16(土) 20:49:56
>>440>>441
どちらも同じ。

445 :デフォルトの名無しさん:2006/12/16(土) 20:54:40
>>444
>>442


446 :デフォルトの名無しさん:2006/12/16(土) 20:56:12
同じだったのか。知らなかった。
というより 教えてgoo と okwave を今知ったthx

447 :デフォルトの名無しさん:2006/12/16(土) 21:00:50
>>446
他にも、日経bpとかなんだとか、およそ20社くらいがOKのライセンスで同じことをやっている。

448 :424:2006/12/16(土) 21:06:57
ありがとう勉強する

449 :デフォルトの名無しさん:2006/12/17(日) 20:07:10
自分Visual C++ 2005EEでプログラムしてるんですが
>>407のgetch()はGCCでも使えるんでしょうか?

450 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/17(日) 21:02:13
MinGWならそのまま使えると思うが、Linuxとかなら、conioの代わりにcursesを使うことになるかも。


451 :デフォルトの名無しさん:2006/12/17(日) 21:47:10
ある数値を渡されると、その数値の 2 乗を求め、
その値を return する関数 pow を作る。

main 関数において、1 から 10 までの数値の
2 乗を pow 関数を呼び出して求め、それぞれの値とその合計を表示する。
この二つのソースコードをおしえてください。


452 :デフォルトの名無しさん:2006/12/17(日) 21:49:38
>>451
宿題スレへ

453 :デフォルトの名無しさん:2006/12/18(月) 00:11:27
>>451
マルチすんなタコ

454 :デフォルトの名無しさん:2006/12/18(月) 10:14:22
コンソール画面を表示した時に、
[alt] + [半角/全角]キーを直接たたくのでなく、
上の >>407 のような方向キーの入力で、全角 ⇔ 半角の変換を
行いたいんですが、
[alt] と [半角/全角] の文字コードが分かりません。
これは元々文字コードはないのでしょうか?

455 :デフォルトの名無しさん:2006/12/18(月) 18:29:07
>>407のソースは人気だな。
>>454
>>412のprintfで試してみるといい。

456 :デフォルトの名無しさん:2006/12/18(月) 18:50:57
とりあえずSendInputしてみたら?

457 :デフォルトの名無しさん:2006/12/18(月) 20:44:46
質問なんですけど
全角数字1と半角数字1を_wtoi()関数で数値に変換すると
両方とも1が返ってきます。全角か半角かチェックする場合
方法ってありますか?合ったら教えてください。

458 :デフォルトの名無しさん:2006/12/18(月) 20:47:51
ちょいと言葉がおかしかったです。すみません。
正しくは
>全角か半角かチェックする場合方法ってありますか?
ではなく
>全角と半角の数字を識別する方法ってありますか?
です。よろしくお願いします。

459 :デフォルトの名無しさん:2006/12/18(月) 22:44:46
文字列をぐるぐるまわして
L'0'<=ch&&ch<=L'9'と
L'0'<=ch&&ch<=L'9'をifで判定する話か?

460 :458:2006/12/18(月) 22:58:42
>>459
レスどうもです。
教えていただいた方法で判定できました。
ありがとうございますm(_ _)m

461 :test:2006/12/19(火) 02:16:06
test

462 :デフォルトの名無しさん:2006/12/19(火) 02:28:17
Cではexternの使い方としては
======file1.c======
int g_foo;

とし、
これを他のfile2.cファイルから参照する場合、
======file2.c======
extern int g_foo;

としますよね?


C++の場合、
======file1.cpp======
extern int g_foo;
とし、
======file2.cpp======
extern int g_foo;

としてもインスタンスは一個だけ作成されるのですか?
もともとc言語でも両方にexternをつけてもインスタンスは一個だけ生成されるんでしたっけ?
(VC++で試すとcファイルでも両方にexternをつけてもOKだけど、VCは拡張されているかもしれないから良くわからない。。)


463 :デフォルトの名無しさん:2006/12/19(火) 05:33:33
>>462
> ======file1.cpp======
> extern int g_foo;
> とし、
> ======file2.cpp======
> extern int g_foo;

C でもC++ でもリンクエラーが発生するはずだが。

464 :デフォルトの名無しさん:2006/12/19(火) 08:11:12
>>462
普通は
======fil1e.h======
extern int g_foo;
=====file1.cpp=====
int g_foo;

======file2.h======
extern int g_foo;

にする

465 :デフォルトの名無しさん:2006/12/19(火) 08:13:07
>>464
宣言は一つでいいだろ。なんで2つのヘッダに置くの?

466 :デフォルトの名無しさん:2006/12/19(火) 08:27:37
見えないからでは?

467 :デフォルトの名無しさん:2006/12/19(火) 08:32:33
いや、寝ぼけてただけ/ 。゚ 3  `ヽーっ

468 :デフォルトの名無しさん:2006/12/19(火) 21:12:36
というか、
#ifdef HOGE
#define EXTERN
#else
#define EXTERN extern
#endif
みたいな仕掛けを用意しておいて、
file.h : EXTERN gHoge;
file1.c : #include "file.h"
file2.c: #define HOGE #include "file.h"
みたいにしない?

469 :デフォルトの名無しさん:2006/12/19(火) 23:07:29
>>468
小手先の技巧に走ってもメリットがないので、弊社コーディング規約では不許可。
寧ろ、グローバル変数や外部変数はコスト意識を持たせる為に長い名前をつけることを規定している。

470 :デフォルトの名無しさん:2006/12/19(火) 23:23:11
すみませんが、質問です。
以下のプログラムが、RedHatだと動くのですが、Debianだと動きません。
コンパイルは通るのですが、コンソールに何も表示されないのです。
アドバイスをお願いします。

#include <iostream>
#include <locale>

int main(void)
{
  std::locale::global(std::locale("ja_JP.eucjp"));//RedHatはUTF-8
  std::wstring ws = L"これはw_char型のリテラル";
  std::wcout << ws << std::endl;
  return 0;
}


471 :470:2006/12/20(水) 00:14:48
ちなみに、charなら問題なく出力されます。

  std::wstring ws = L"これはw_char型のリテラル";
  std::wcout << ws << std::endl;
  std::string s = "これはchar型のリテラル";
  std::cout << s << std::endl;

-- 出力結果 --
これはchar型のリテラル

w_charだけうまく行かないのです。


472 :デフォルトの名無しさん:2006/12/20(水) 00:51:17
gccのバージョンは?

473 :デフォルトの名無しさん:2006/12/20(水) 01:55:44
>>470
gccの-finput-charset, -foutput-charsetオプションをちゃんと
指定してないんじゃない?

無指定だとデフォはUTF-8らしいから、たまたまそれでUTF-8環境のRedHadで
ワイド文字リテラルが上手くエンコードされただけ、に見えるよ。

後は、wcout.imbue()は呼んでおいたほうがいいかもな。
規格上はどうだかしらんが、locale::global()だけでは、既に作成されてる
ストリームオブジェクトのロケールが変わらない実装もある。

474 :473:2006/12/20(水) 01:59:20
すまん。
× -foutput-charset
○ -fexec-charset
な。

475 :470:2006/12/20(水) 02:15:38
ありがとうございます。今は環境がないので、明日試してみます。

476 :デフォルトの名無しさん:2006/12/20(水) 07:30:20
>469
その、「寧ろ」がどう繋がってるのか解らない。
468は、広域変数の宣言と定義を単一ファイルですますことで
漏れをなくす目的で、変数名の長さとは直交した概念だとおもうが。

477 :デフォルトの名無しさん:2006/12/20(水) 07:47:31
#define EXTERN派がしばしばコード量(≒タイプ量?)を問題にするからじゃないかな。

478 :デフォルトの名無しさん:2006/12/20(水) 13:03:18 ?2BP(202)
>>468
しないなぁ。
公開したくないグローバル変数もあるので、公開用のヘッダと非公開用のヘッダを
分けて作って、externは公開用だけに書く。
グローバル変数の定義はヘッダには書かない。
共通してる物を入れ子にすることはあるけど、非公開ヘッダは他のソースには
インクルードさせないし、公開ヘッダは自ソースではインクルードしない。

479 :470:2006/12/20(水) 14:19:08
ありがとうございます。Debian Sergeのg++は3.3だったので、新たにg++-3.4
を導入しました。
g++-3.4 -finput-charset=eucjp -fexec-charset=eucjp ソース 実行ファイル

これでw_charが出力されるようになりました。
しかし今度は、char が出力されなくなってしまったのです。

std::locale::global(std::locale("ja_JP.eucjp"));
std::wstring ws = L"これはw_char型のリテラル";
std::wcout << ws << std::endl;
std::string s = "これはchar型のリテラル";
std::cout << s << std::endl;
-- 実行結果 --
これはw_char型のリテラル

charをw_charの前にすると、今度はw_charが文字化けします。
std::locale::global(std::locale("ja_JP.eucjp"));
std::string s = "これはchar型のリテラル";
std::cout << s << std::endl;
std::wstring ws = L"これはw_char型のリテラル";
std::wcout << ws << std::endl;
-- 実行結果 --
これはchar型のリテラル
S\214ow_char\213n蠧蜍

これは一体なぜでしょう?どうやったら解決できるのでしょうか?
どなたかアドバイスをお願いいたします。

480 :470:2006/12/20(水) 14:21:15
補足です。
この現象は、RedHat上でもDebianと同様に起こっています。

481 :デフォルトの名無しさん:2006/12/20(水) 16:05:49
>>479
RedHadではlocale, charsetオプションはutf-8なんだよね?

基本的な前提として
Debian環境ではLC_CTYPEはja_JP.eucjpでソースのエンコーディングもそうなってる
catで文字化けせずにソースを表示できる

RedHad環境ではUTF-8であることを除き、上と同じ

と思っていいかい?

482 :470:2006/12/20(水) 16:18:31
>>481 はい、おっしゃるとおりです。

483 :デフォルトの名無しさん:2006/12/20(水) 18:15:22
>>482
それで何で動かないかは、俺にはぶっちゃけわからんなぁ。ごめん。

とりあえずstringの中身を愚直に16進でダンプしてみては?
-fexec-charset
で指定された通りにエンコーディングされてるはずではあるのだが。

後は、cout.imbue()してみるとか、ベタにstdio使って
printf()での出力をしてみるとか。

484 :470:2006/12/20(水) 19:48:35
cout.imbue()はやってみましたが、ダメでした。
いろいろ試行錯誤してみます。ありがとうございました。

485 :デフォルトの名無しさん:2006/12/20(水) 22:02:33
>>484
Linux板で聞いた方がいいかもわからんね

486 :デフォルトの名無しさん:2006/12/20(水) 22:24:50
コンパイラ:
Linux -> gcc
Windows -> Visual C++ 6.0

質問:
1. Linuxでディレクトリの存在を確認する関数を知りたい。
2. Windowsでフォルダの存在を確認する関数を知りたい。

質問は以上の2つです。
よろしくお願いしますm(_ _)m

487 :デフォルトの名無しさん:2006/12/20(水) 22:39:44
1.stat
2.FindFirstFile,FindNextFile,FindClose

488 :デフォルトの名無しさん:2006/12/20(水) 22:47:03
>>487
WindowsはGetFileAttributesでおk

489 :デフォルトの名無しさん:2006/12/20(水) 23:00:21
Winなら専用関数としてPathIsDirectoryってのもある
直感的だけど要IE

490 :デフォルトの名無しさん:2006/12/20(水) 23:16:11
CまたはC++です。
開発環境はWin2000+VS.NET2003ですが、標準関数等の出来るだけ汎用的なものを希望。

うまく説明できないのですが、プログラムの実行時オプション、要はmain関数の引数を取得したいのです。
この辺の定番作業をやってくれる関数等はありませんか?
あるとしたら、その使い勝手も添えていただければ幸いです。

別にwhileなりforなりで読み込めば済む話ですし、実際に自前で作ったものを使い回してるんですけどね。





491 :デフォルトの名無しさん:2006/12/20(水) 23:23:14
>>490
NT専用でよければCommnaLineToArgvWがある

492 :デフォルトの名無しさん:2006/12/20(水) 23:32:40
>>490
Unix系の定番はgetopt()だな。
Cランタイム(libc)の一部として提供されてることが多いが、GNUやBSDの
実装はそこらに転がってて手に入るはずだ(getopt.c, getopt1.c, getopt.h
といったファイル)。ただしライセンスには注意。

単に *.c みたいなワイルドカード展開したいという場合は、
単にsetarg.objとリンクしる。
argc, argvを展開後の形でセットされている。

493 :490:2006/12/20(水) 23:58:30
ありがとうございます。
色々と調べてみようと思います。

494 :デフォルトの名無しさん:2006/12/21(木) 00:12:19
>>490
main関数の引数でいいだろ。
別にmainから始まるプログラムでもコンソール無しにできる。

495 :490:2006/12/21(木) 00:39:18
-a とか -b とかオプションがあって、かつ -abとかもOKとかにすると実装するの面倒じゃん(ぼそ

496 :デフォルトの名無しさん:2006/12/21(木) 00:46:21
すまん、argc/argv程度のものを欲しているのかと思った。
Boost.Program_optionsなんてどうだろう?

497 :490:2006/12/21(木) 01:00:56
重ね重ね感謝デス。
getoptとBoost.Program_optionsあたりで少し遊んでみることにしますね。
納期まで時間あるし。

498 :デフォルトの名無しさん:2006/12/21(木) 11:13:21
うぇw program_options構文きもいw


499 :486:2006/12/21(木) 17:47:49
>>487-489
ありがとうございます。
おかげで、丸一日かけて調べていたことが解決しました。

ところで、このスレは、ソースをアップして評価してもらうとかできますか?


500 :デフォルトの名無しさん:2006/12/21(木) 21:47:55
できます。
そういうのが好きな奴等です。

501 :デフォルトの名無しさん:2006/12/21(木) 22:31:44
テンプレートとマクロを使った変態的なコードなら、
喜んで読む奴等がたくさんいます。

あと複雑な型の宣言を人間コンパイラよろしく読む人もいます。

502 :デフォルトの名無しさん:2006/12/22(金) 11:20:45
質問です。

DLLの遅延読み込みを使っています。
任意のタイミングで、特定の関数を呼ぶことなく、DLLの遅延読み込みを
行いたいのですが、可能でしょうか?

win xp pro
vs2005 sp1

503 :デフォルトの名無しさん:2006/12/22(金) 13:06:16
二重積分ってどうかんがえればいいの?
簡単なヒントください><
それと1週間前にC++始めました。

504 :デフォルトの名無しさん:2006/12/22(金) 13:15:01
C++と関係ない

505 :デフォルトの名無しさん:2006/12/22(金) 16:42:56
>>502
LoadLibrary使えばよいのでは?

506 :デフォルトの名無しさん:2006/12/22(金) 18:35:16
>>503
まずどの空間上での積分なのか、そしてルベーグ積分なのかリーマン積分なのか、
その辺の仮定から話してもらおうか

507 :デフォルトの名無しさん:2006/12/22(金) 19:05:55
>>506
うるせえなぁ。さっさと答えろ。

508 :デフォルトの名無しさん:2006/12/22(金) 19:13:35
君がいってるのは代数の言葉で言えば
「計算ってどう考えればいいの?」
ということと同じ。計算が和なのか積なのかそれさえはっきりしない。
仮定の曖昧な質問は答えようがない

509 :デフォルトの名無しさん:2006/12/22(金) 19:25:53
答えられない奴は書かなくていいよ。邪魔だから。

510 :デフォルトの名無しさん:2006/12/22(金) 20:04:18
注.:.私.の.有.意.義.な.発.言.に.対.し.、.自.分.の.理.解.不.足.を.棚.に.上.げ.煽.り.、.1.行.レ.ス
で.返.す.方.が.多.い.よ.う.で.す.が.、.そ.の.よ.う.な.方.は.ス.レ.の.皆.様.を.混.乱.さ.せ.る.だ.け.で.な.く
ス.レ.の.雰.囲.気.を.崩.し.か.ね.な.い.の.で.お.黙.り.下.さ.い.。
ま.た.質.問.者.は.回.答.者.に.知.識.を.披.露.す.る.場.を.与.え.る.貴.重.な.存.在.な.の.で.、
質.問.者.を.見.下.し.た.回.答.、.あ.ま.り.に.も.儀.礼.を.欠.い.た.回.答.も.厳.重.に.禁.止.い.た.し.ま.す.。
忙.し.い.中.、.少.な.い.時.間.の.合.間.を.縫.っ.て.質.問.し.に.来.て.る.わ.け.で.す.の.で.、
そ.の.辺.ご.承.知.下.さ.い.。.な.お.、.当.方.が.質.問.に.対.し.て.有.意.義.な.答.え.で.あ.る.と
判.断.し.た.方.に.は.評.価.い.た.し.ま.す.の.で.各.自.よ.く.調.べ.、.よ.く.考.え.正.確.な.回.答.を.す.る.よ.う.に.。

511 :デフォルトの名無しさん:2006/12/22(金) 20:12:43
難しい単語を並べて結局質問に答えないのは厨房

512 :デフォルトの名無しさん:2006/12/22(金) 20:15:00
>>503
スレ違いだし数値積分のアルゴリズム知りたいなら本調べろ

513 :デフォルトの名無しさん:2006/12/22(金) 20:16:17
ライブラリとソースをググレばいいだけ。
はい次。

514 :デフォルトの名無しさん:2006/12/22(金) 20:28:26
ググっても出てきません。やり方を教えてください。
知らないのなら書かなくて結構で宇。

515 :デフォルトの名無しさん:2006/12/22(金) 20:35:31
初心者です。cygwinでC++言語の勉強はじめました。
flockが今ひとつ、わからないんですが質問させてください。
下のプログラムで
1、@があると出力は、"ここ"
2、@がないと出力は "ここ:whileに入れました:hogehoge"
になります。

どちらも!finのエラーはないので、fin.open("hoge.txt");
ではオープンできてるみたいなのですが、
2、ではgetlineでなにも読めていないようで不思議です。

なんだか、自分でロックして自分が読み込めなくなってるんですが。。。
ロックしてから、読み込んで、表示ということがしたいです。
どのように修正すればよいのでしょうか。

--------------------------------------------------
#hoge.txtの内容:"hogehoge"

プログラム:
// #include <iostream> <fstream> <string>
    int n = open("hoge.txt",O_RDWR);
    flock(n,LOCK_EX |LOCK_NB);//・・・@
    std::ifstream fin;
    fin.open("hoge.txt");
     if(!fin){ printf("err:fin");}
    std::string s;
    printf("ここ");
    while(getline(fin,s)){
        printf(":whileに入れました:");
        std::cout << s << std::endl;
    }
    close(n);

516 :デフォルトの名無しさん:2006/12/22(金) 22:17:35
>>515
そら、flock()してるんだからダメだわ。

ttp://bd.tank.jp/diary/20061020.html
あたりを見てみ。

ifstreamのコンストラクタにfdやFILE*渡せる実装もあるんで、
その場合は楽なんだが、
gccの場合はその手は使えないようだな。
一般的なworkaroundはどうやら存在しないようだ。

stdioのようにfdopen()やらfileno()を使えないってのは実に不便だな。
つうか糞。

なお、できればflock()よりはlockf()使っとけ。
BSD由来のflock()よりは、後者のが標準的な関数だから。

517 :デフォルトの名無しさん:2006/12/22(金) 23:58:48
>>516
詳しく説明していただきありがとうございました。
cygwinのgcc新しくしたら、stdio_filebuf.hがありました。
それで、リンク先のようにしたら、きちんと動きました。

ほんと助かりました。
ありがとうございました。

518 :デフォルトの名無しさん:2006/12/23(土) 00:24:48
>>516
ストリームバッファクラスを自作すると言うのは、この問題に対する一般的な解法と言えるのでは?(面倒ではあるが)
ファイルディスクプリ多に限らず、究極的にはどんなものでも読み書きできるようになる。

Boost.Iostreamsを使えば多少はストリームバッファを書くのが楽になる。

519 :デフォルトの名無しさん:2006/12/23(土) 00:28:36
STLport使えばいいじゃん。

520 :デフォルトの名無しさん:2006/12/23(土) 02:03:15
インライン関数って普通ヘッダファイルに記述しますが、
他のファイルから参照されない関数(privateとか)もヘッダじゃないとダメなんですか。

521 :デフォルトの名無しさん:2006/12/23(土) 02:42:10
いいえ。

522 :デフォルトの名無しさん:2006/12/23(土) 11:22:33
printf関数で
printf("%.[precision]s", ...);
        ↑
        ここ

に変数を指定することはできないのでしょうか。
int num;
printf("%.nums", ...);

のような感じにしたいのですが・・・。

523 :デフォルトの名無しさん:2006/12/23(土) 11:29:37
>>522
printf("%*s",nums,str);

524 :デフォルトの名無しさん:2006/12/23(土) 15:28:11
プログラミング言語:C

コンパイラ:
Linux -> gcc-3.3.2
Windows -> Visual C++ 6.0

質問:
1. Perlのchompと同じ機能を持った関数を知りたい。
2. 文字列中の英大文字を英小文字に変換する関数を知りたい。

質問は以上の2つです。
LinuxとWindowsで別の場合は、両方教えて貰えると助かります。
よろしくお願いしますm(_ _)m


525 :デフォルトの名無しさん:2006/12/23(土) 15:31:18
>>524
1. 標準関数にはない
2. tolower

526 :デフォルトの名無しさん:2006/12/23(土) 17:45:45
Visual C++ 2005 express使っています。
下記のコードを実行した場合、
★印の箇所でppを設定しなおさなないで
次の行のeraseで削除しようとすると、
↓のようなダイアログが出て止まってしまいます。

この場合、vt1.insert(pp, 99); で99を挿入した後、
ppは次の要素の反復子になると思うのですが、
間違っているでしょうか?

あと、vt1.erase(pp);もppの指している要素を削除した後は、
次の要素を指すので、
 vt1.erase(pp);
 vt1.erase(pp);
と続けて削除することも出来ると思うのですが、
これも誤りでしょうか?(これも同じダイアログが出てしまいます。)

-+-+-+-+-+-+-+-+-ダイアログ内容+-+-+-+-+-+-+-+-+-+-+-+-+
Microsoft Visual C++ Debug Libraly
Debug Assertion Failed!
Program:...
File: c;\program files\microsoft visual studio 8\vc\include\vector
Line:986
Expression: vector erase iterator outside range
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+



527 :デフォルトの名無しさん:2006/12/23(土) 17:47:14
/******************プログラム*******************/
#include <iostream>
#include <vector> // for vector
using namespace std;
void disp_vec(vector<int> &obj);

int main()
{
int i;
vector<int> vt1; // 長さ0のint型のvector
vector<int>::iterator pp; // 反復子

cout << "-----サイズが拡張されることを確認\n";
for (i=0; i<5; i++) // 値を設定する
vt1.push_back(i+100);

disp_vec(vt1);//一覧表示
pp = vt1.begin();
cout << "pp = vt1.begin() -> *pp = " << *pp << '\n';
vt1.insert(pp, 99);
pp = vt1.begin()+1;// ←ココ★
vt1.erase(pp);
disp_vec(vt1);//一覧表示

return 0;
}



528 :デフォルトの名無しさん:2006/12/23(土) 17:48:55
void disp_vec(vector<int> &obj) // コンテナを出力
{
for (int i=0; i<obj.size(); i++) cout << obj[i] << " ";
cout << '\n';
}

/*****************************************************/

529 :デフォルトの名無しさん:2006/12/23(土) 18:23:38
>>526
>この場合、vt1.insert(pp, 99); で99を挿入した後、
>ppは次の要素の反復子になると思うのですが、
>間違っているでしょうか?
ええ


530 :デフォルトの名無しさん:2006/12/23(土) 18:37:02
>>526
>あと、vt1.erase(pp);もppの指している要素を削除した後は、
>次の要素を指すので、
> vt1.erase(pp);
> vt1.erase(pp);
>と続けて削除することも出来ると思うのですが、
>これも誤りでしょうか?(これも同じダイアログが出てしまいます。)
ええ


531 :デフォルトの名無しさん:2006/12/23(土) 18:44:18
>どう直せばいいのでしょうか?
ええ

532 :デフォルトの名無しさん:2006/12/23(土) 18:47:19
>>526
挿入・削除を行うと反復子は無効になる。
メンバ関数が返す新しい反復子を使え。

533 :デフォルトの名無しさん:2006/12/23(土) 19:30:50
>>532

無効になるんですね。
これは、vectorの場合に限定されているんですか?


534 :デフォルトの名無しさん:2006/12/23(土) 19:32:16
listだと、insertの場合に出来ます。★印

listだと、insertの場合に出来ます。★印

#include <iostream> // cp_list1.cpp [cpp]
#include <list> // for list
using namespace std;

void disp_list(list<int> &obj);

int main()
{
int i, idt;
list<int> tt1, tt2, tt3;// 長さ0のint型のlist
list<int>::iterator pp, p1, p2; // 反復子
list<int>::reverse_iterator rp; // 逆反復子

cout << "-----要素を後ろに入れる\n";
for (i=0; i<5; i++)
tt1.push_back(i+100);

cout << "-----要素を途中に入れる\n";
pp = tt1.begin();
for (i=1; i<=5; i++)
++pp; // ppを5つ進める

535 :デフォルトの名無しさん:2006/12/23(土) 19:32:51
for (i=0; i<5; i++){
tt1.insert(pp, i+300); // 挿入後にppは1つ進む
// ←★これは出来る!!
}

cout << "-----tt1の長さと内容\n";
cout << "tt1の長さ=" << tt1.size() << '\n';
for (pp = tt1.begin(); pp != tt1.end(); pp++) {
cout << *pp << " ";
}
cout << '\n';

return 0;
}

void disp_list(list<int> &obj)
{
list<int>::iterator wp;
for (wp = obj.begin(); wp != obj.end(); wp++) {
cout << *wp << " ";
}
cout << '\n';
}


536 :デフォルトの名無しさん:2006/12/23(土) 21:25:22
>>533
正確には、std::vectorは、
・挿入または削除を行うとそれ以降の要素を指す反復子は無効になる。
・挿入を行った場合再割り当てが起こると全ての反復子は無効になる。

よって、挿入は反復子が必ず無効になり、削除はそれ以降の反復子が
無効になると覚えておけばよい。

挿入・削除によって反復子が無効にならないのはstd::listのみ。但しerase
メンバ関数によって反復子の位置の要素を削除した場合は、その次の
要素を指す反復子を返す。insertメンバ関数は三種類あるが、その内の
一バリエーションのみが新しい要素を指す反復子を返す。

537 :デフォルトの名無しさん:2006/12/24(日) 01:10:38
c++builder環境のwinsock2でネットワークプログラミングしてます。
受信のタイムアウト処理するために、selectを使おうと下のコード
のようにしました。

//変数の値は下のようにしました。
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd,&fds);
struct timeval time;
time.tv_sec = 10;
time.tv_usec = 0;

select無い場合は普通に受信できるプログラムの中で
selectを呼び出すと必ず-1(エラー)が返ります。

ためしに、ShowMessage(select(fd + 1,&fds,NULL,NULL,time));
をいろんな場所で実行してみましたが、すぐに全部-1が表示されました。
違うselectが呼び出されたか、引数がおかしいかぐらいと思うのですが、
何かお気づきの点などありますでしょうか。
よろしくお願いします。

538 :aka ◆9S3n/gOoY. :2006/12/24(日) 01:47:34
ども。
>>524です。

>>525
回答ありがとうございます。

> 1. 標準関数にはない
ということなので、
「'\n'を'\0'で上書きする」関数overwrite_linefeedを作ってみました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3265.c

> 2. tolower
ちょっと欲しい関数とは違うので、
「文字列中の英大文字を英小文字に変換する」関数change_lowerを作ってみました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3266.c

2つの関数の評価をお願いしますm(_ _)m

539 :デフォルトの名無しさん:2006/12/24(日) 02:03:06
>>538
基本的にはバッチシおk

デバッグ用とは思うけど、printf や puts を埋め込むと使いにくくなる
isupper は必要ない

540 :デフォルトの名無しさん:2006/12/24(日) 02:06:20
>>538
大きな問題はとくにない。
強いて言うなら、関数内に表示処理を入れてるけど、汎用性がなくなるし、それはやめといたほうが無難

isupperはなくても大丈夫。ついでにdo whileを使うよりも素直に
for(;*string;++string){
    *string = tolower(*string);
}
とかのほうが読みやすい。


541 :デフォルトの名無しさん:2006/12/24(日) 02:19:41
>>538
overwrite_linefeed()がPerlのchomp()と同じかどうかっつーと微妙だな。
結局、改行が途中にあった場合にどうしたいかによるんだが。

overwrite_linefeed()は最初に見つけた改行以降を切り捨てるよな。
chomp()は文字列「末尾」が改行なら切り捨てるって仕様じゃなかったっけか?

まぁ、実際にはctime()やfgets()の返してきた文字列(改行が末尾にあることが
分かっている)に使うことが多いんだろうから、どっちでもいいっちゃ
いいんだろうが。

それと、これはささいだが、戻り型をvoidではなくchar*として、
のように、文字列の引数を戻り値としても返すように作っとくと、
printf("%s", chomp(s));
みたいなノリで使えるので、やや使い勝手が向上する。

542 :デフォルトの名無しさん:2006/12/24(日) 02:32:48
int mainって戻り値指定しなくてもいいんだな
初めて知った

543 :デフォルトの名無しさん:2006/12/24(日) 02:35:51
>>542
実装依存だけど、戻り値にゴミが入る。

544 :デフォルトの名無しさん:2006/12/24(日) 02:38:36
542の書いたことは、C99とC++だけに当てはまる。
C89なんかだと543の言うとおりごみになる。

545 :デフォルトの名無しさん:2006/12/24(日) 02:55:03
>>543-544
おう、そうなのか
基本的にC++だけど、捨てコードでも省略したことなかったから地味にうれしい発見だ

546 :デフォルトの名無しさん:2006/12/24(日) 03:06:40
>>537
WSAGetLastError

547 :デフォルトの名無しさん:2006/12/24(日) 10:40:58
>>546
ありがとうございます。
いろいろ検索したところ、下記のページが見つかりました。
ttp://forums.belution.com/ja/vc/000/254/85s.shtml

作っているのはウィンドウアプリなのですが、その場合
select()ではなく、WSAAsyncSelect()を使う必要が
あるでしょうか?

あと、エラーの内容は10022で、リンク先と同じエラーでした。
よろしくお願いします。

548 :デフォルトの名無しさん:2006/12/24(日) 11:08:55
>>547
selectでもいける
たいした手間じゃないしWSAAsyncSelectも試してみたら?

549 :デフォルトの名無しさん:2006/12/24(日) 11:31:44
お返事ありがとうございます。
ふむ〜。
selectでも大丈夫でしたか。

"hoge"って文字列を送信して、
タイムアウト受信でその文字列"hoge"を受信するだけで、
select無いときは、普通に受け取れるんですよね。
WSAAsyncSelectを試したり、
もう一回コード見直してみます。
なにかあったら、またよろしくお願いします。

550 :aka ◆9S3n/gOoY. :2006/12/24(日) 11:47:45
ども。
>>538です。

>>539-541
悪いところの指摘、アドバイスなどありがとうございます。

>デバッグ用とは思うけど
orz
そんな意図は全く無く、ただ進捗状況として出力させています。
この場合だと、main関数の方に持っていけってことでオッケーですか?

>printf や puts を埋め込むと使いにくくなる
>関数内に表示処理を入れてるけど、汎用性がなくなる
初級者にはビンとこないです。まだまだ経験が足りないということですね。


>isupper は必要ない
>isupperはなくても大丈夫。
これに関しては、手元にある参考書に
「変換できない場合、古い処理系において引数とは異なる値を返すことがある」
とあったので、isupperで英大文字かをチェックしてから、英小文字に変換する仕様にしました。
太古の事は気にすることは無いですか?

>do whileを使うよりも素直に
>for(;*string;++string){
>    *string = tolower(*string);
>}
>とかのほうが読みやすい。
個人的な好みで、for文は「初期化」、「ループの継続条件」、「カウンタ変数の更新」の
3つある場合のみ使うようにしています。
私の場合は、どれか1つでも欠けると読みにくくなるので、do while文を使っています。
あと、何かでfor文よりもwhile文の方が高速と見た覚えがあるのですが、その辺はどうなんでしょうか?

551 :aka ◆9S3n/gOoY. :2006/12/24(日) 12:09:09
ども。
>>538です。
連投すんません。

>overwrite_linefeed()がPerlのchomp()と同じかどうかっつーと微妙だな。
私もそう思ったので、Perlのchomp関数に失礼の無いように、違う関数名しました。

>overwrite_linefeed()は最初に見つけた改行以降を切り捨てるよな。
>chomp()は文字列「末尾」が改行なら切り捨てるって仕様じゃなかったっけか?
chomp関数の詳細な仕様がわからなかったので、苦し紛れでそういう仕様にしました。
>>541さんの意見を参考に、「'\0'の前にある'\n'を上書きする」というように仕様を変更しようと思います。

/* '\0'を検索 */
position = strchr(string, '\0')

if(*(--position) == '\n'){
 /* '\0'の前にある文字が'\n'の場合 */
 /* 上書き */
 *position = '\0';
}

こんな感じでどうでしょうか?

>それと、これはささいだが、戻り型をvoidではなくchar*として、
>のように、文字列の引数を戻り値としても返すように作っとく
参考に…、というよりパクらせてもらいますm(_ _)m


552 :aka ◆9S3n/gOoY. :2006/12/24(日) 12:13:39
ども。
>>538です。
さらに連投で、長々とすんません。

>>542
>int mainって戻り値指定しなくてもいいんだな
orz
コンパイラが警告さえも出してくれなかったので、すっかり忘れていました。
return EXIT_SUCCESS;
ってやるために<stdlib.h>読み込んでいたのに・・・。

>>543-545
まさに、「ひょうたんからこま」。
勉強になりましたm(_ _)m


553 :デフォルトの名無しさん:2006/12/24(日) 14:50:01
// >>551
// 単純にstrrchr(string, '\n')で見つかったところにナル文字を書けばいいじゃん。
const char * overwrite_linefeed(const char * string)
{
char * position = strrchr(string, '\n');
if (position) * position = '\0';
return string;
}
// おまけ
bool search_and_report_linefeed(const char * string)
{
bool isFound = strchr(string, '\n');
printf("`\\n'%s.\n", isFound ? "を発見しました" : "は発見できませんでした");
return isFound;
}

554 :553:2006/12/24(日) 14:51:22
いけね。overwrite_linefeed()の引き数と戻り値はconst付けじゃダメだった。

555 :デフォルトの名無しさん:2006/12/24(日) 15:53:49
char str[10] = "abcdefg";
などとしたとき、[defg]だけを出力はできないのでしょうか。
printf("%.*s",4,str[3]);
とすると動作してくれないのはなぜでしょうか。

556 :デフォルトの名無しさん:2006/12/24(日) 16:00:38
printf("%.*s",4,str+3); 


557 :デフォルトの名無しさん:2006/12/24(日) 16:30:15
printf("%.*s", 4, & str[3]);

558 :デフォルトの名無しさん:2006/12/24(日) 16:35:58
>>556-557
どうもありがとうございました。

559 :デフォルトの名無しさん:2006/12/24(日) 18:22:23
>>550
isupperの件。
今時のパソコン上ではANSI/ISOにも従っていないような実装なんて考えなくて良い。

560 :デフォルトの名無しさん:2006/12/24(日) 18:40:54
windows使ってるとやたらwchar_t出てくるんですけど、
これってlinuxでも使えるんですか?

561 :デフォルトの名無しさん:2006/12/24(日) 18:49:47
使える。
wchar_tはC/C++で(性格こそ異なれど)共に標準に含まれている。

ただし、標準では少なくともcharと同じと定められているだけで、具体的にその大きさなどは定められていない。
たとえばWindowsではUTF-16(古いものではUCS2)だが、LinuxではUCS4(もしくはUTF-32)となっている。

562 :560:2006/12/24(日) 19:33:22
>>561
なるほど、ありがとうございます。

563 :aka ◆9S3n/gOoY. :2006/12/24(日) 22:54:58
ども。
>>538です。

>>553
orz
ナル文字を検索する方法を考えているときに、前から検索するか、
後ろから検索するか迷っていたのに、改行を後ろから探すという発想が全く無かった。

ところで、ナル文字の後ろのゴミに改行が混じっている可能性はないのですか?

三項演算子使う方法は良いですね。
パクらせてもらいますm(_ _)m


564 :aka ◆9S3n/gOoY. :2006/12/24(日) 23:00:20
ども。
>>538です。

>>559
回答ありがとうございます。

>今時のパソコン上ではANSI/ISOにも従っていないような実装なんて考えなくて良い。
了解しました。


565 :aka ◆9S3n/gOoY. :2006/12/24(日) 23:51:42
プログラミング言語:C

コンパイラ:
Linux -> gcc-3.3.2

質問:
fgets(buffer, 5, stdin)で、1234567890を読み込んだ場合、
もう一度入力をさせるプログラムを作りたいのですが、
1234がbufferに読み込まれ、567890はstdinに残ったままになっているようで、
うまく処理ができません。
stdinに残っている値を処理する良い方法はないでしょうか?


566 :デフォルトの名無しさん:2006/12/24(日) 23:55:00
>>565
fflush(stdin);

567 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/25(月) 00:00:02
GCCでそれはねーだろ

一番確実なのは

while (getchar() != '\n') ;

568 :デフォルトの名無しさん:2006/12/25(月) 00:00:21
>>566
そんな鼻から悪魔が出そうなコードを注意点なしに書くのはどうかと。

569 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/25(月) 00:02:32
こうか

if (buffer[strlen(buffer)-1] != '\n') {
    while (getchar() != '\n') ;
}

570 :デフォルトの名無しさん:2006/12/25(月) 00:03:51
VS2005とかだと
strcatはセキュリティーなんのでワーニングになるので
全部strcat_sとかに変えたんですが、
これってlinuxでも通るんですか?

571 :566:2006/12/25(月) 00:05:09
すまん。コンパイラ依存なコードだったんだな。
鼻から悪魔が出てくるのは勘弁してくれ。

572 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/25(月) 00:06:04
コンパイラ依存って言うか、知る限りではLinuxじゃ無理

573 :デフォルトの名無しさん:2006/12/25(月) 00:11:26
>>570
そいつはMS独自の早漏Safer Cだからよしなさい。

574 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/25(月) 00:13:26
C++/CLIのためらしいね。C/C++標準に取り込まれるかどうかは不明。

575 :デフォルトの名無しさん:2006/12/25(月) 00:18:04
>>573
ありがとうございます。
マジすか、じゃぁwarning無視した方がいいんですね。

セキュリティーの話はよく分からないのですが、
クラックに弱くなるんでしょうか。
命令の実行権限うんぬんがどうとか・・・。
単純にバッファサイズ間違えるとメモリが破壊されてしまう
可能性があるってだけですかね?

576 :デフォルトの名無しさん:2006/12/25(月) 00:19:43
回答者の質に問題あり

577 :デフォルトの名無しさん:2006/12/25(月) 01:29:30
どういう風に問題があるのか訊ねたら
「どうすればそれを答えずに切り抜けられるか」
に必死になりそうだからやめておこう

578 :553:2006/12/25(月) 05:04:58
>>563
ナル文字の後のことなんか知ったこっちゃない。
つーか、strrchr()にしたところで文字列終端をナル文字で判断するんだから。
標準関数でナル文字の後に意味をもたせるのはstrtok()の使い方だけだ。

579 :デフォルトの名無しさん:2006/12/25(月) 08:28:54
テキストファイルから一行stringクラスへ読み込んで、
その中の半角スペースを除去する処理を組んでいるのですが、
ファイルの中ほどまで読み込んだ辺りで例外が発生してしまいます。。。
下記のようなコードで処理をしているのですが、なにか問題があるのでしょうか?




ifstream ifs;
string str;
string::iterator its;

ifs.open("file");      /* ファイルオープン */
while (!ifs.eof()) {      /* ファイルエンドまで読み込み */
  ::getline(ifs, str);    /* 一行読み込み */
    for (its = str.begin(); its != str.end(); its++) { /* 文字列終端まで */
      if (' ' == *its) {                  /* 半角スペースを検索 */
        str.erase(its);                /* 消去 */
      }
    }
  }
}

580 :デフォルトの名無しさん:2006/12/25(月) 10:54:53
>>579
eraseしたらイテレータは無効になるんじゃなかったっけ?

581 :デフォルトの名無しさん:2006/12/25(月) 11:41:51
Effective STLの9項だな。
for行の最後のits++をやめて、
if (*its == ' ')なら its = str.erase(its);、elseを用意してその中では ++its;
これでうまくいくはず。
要は、イテレータはeraseで無効になるが、新しい有効なイテレータをeraseがくれるということ。

mapにも別のやり方がある。興味があるなら自分で調べれ。

582 :デフォルトの名無しさん:2006/12/25(月) 14:45:27
str = (char *)malloc(1000)
とかで、メモリを確保をしようと思うんだけど、
↑でいう1000って、1000byte確保って事でいいの?

583 :デフォルトの名無しさん:2006/12/25(月) 14:59:28
たった今20秒という大量の時間をかけて
mallocでぐぐって一番上に出てきたページを見たところによれば
1000byte確保ってことでいいようです。

584 :デフォルトの名無しさん:2006/12/25(月) 15:45:20
すみませんが、質問です。
delete と delete[] を使い分けなければならない理由はなぜでしょうか?
単独のdeleteはポインタの指すアドレス1つ分しか解放しないそうですが、
それなら毎回delete[]を呼べば済むような気がします。
delete[]はどのようにして解放すべき領域を知るのでしょうか?


585 :デフォルトの名無しさん:2006/12/25(月) 16:54:52
非常に初歩的な質問で恐縮です。

(2行目以降の)チーム名のみstrng型で、他はint型変数に格納したいです。
しかし、106行目や114行目の
  fin >> iRank;
fin.get( chGetbyte );
で、ファイルから読み込めないのですが、
どこに誤りがあるのかがわかりません。
分かる方、ご意見、ご指摘お願いします。

順位,チーム名,試合数,勝数,引分数,敗数,得点,失点,得失点差,勝点
1,浦和レッズ,34,22,6,6,67,28,39,72
2,川崎フロンターレ,34,20,7,7,84,55,29,67
3,ガンバ大阪,34,20,6,8,80,48,32,66
17,セレッソ大阪,34,6,9,19,44,70,-26,27
18,京都パープルサンガ,34,4,10,20,38,74,-36,22

環境は、Visual Studio C++ 2005 Express editionです。
↓に現在のソースをアップしました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=3276

586 :デフォルトの名無しさん:2006/12/25(月) 17:52:46
>>584
new/deleteでは常に1つずつしかオブジェクトを生成・破棄しない。
しかしnew[]は1度に何個オブジェクトを作るかわからない。
だから、多くの実装ではnew[]のときにオブジェクトを何個作ったかを記録する分余計にメモリを確保して記録している。
delete[]はそれを読み取って消すべきオブジェクトの数を知ることになる。

そういう余分な処理を作るとき・消すときに行うかどうか有無があるので、new/deleteとnew[]/delete[]は分かれている。

587 :584:2006/12/25(月) 18:07:33
>>586
ありがとうございます。

> 多くの実装ではnew[]のときにオブジェクトを何個作ったかを記録する分余
> 計にメモリを確保して記録している。

この記録の方式は実装依存ということなのでしょうか?
『Accelerated C++』のP184に、
「(new[]で)配列が破棄されるときには、各要素が逆順に破棄されます。」
とあったので、何か決まりがあるように思ったのですが。


588 :デフォルトの名無しさん:2006/12/25(月) 18:20:08
>>587
その引用を見る限り、破棄される順番については言及されているが、個数に関しては言及されていないね。

589 :565:2006/12/25(月) 20:15:50
>>569
ありがとうございました。


590 :デフォルトの名無しさん:2006/12/25(月) 20:49:43
初歩的な質問です。
boost::split を、wstringに対して適用したいのですが、下の例の通りだと
当然うまく行きません。型変数等をどのように指定したらよいでしょうか?
http://www.boost.org/doc/html/string_algo/usage.html#id2743220


591 :デフォルトの名無しさん:2006/12/25(月) 21:00:43
げ、俺もずっと疑問系だと思ってた

592 :デフォルトの名無しさん:2006/12/25(月) 21:29:01
アレがCore2の性能が悪化する例?SSEでやれよ。

593 :デフォルトの名無しさん:2006/12/25(月) 21:29:32
誤爆したゴメ

594 :デフォルトの名無しさん:2006/12/25(月) 21:31:28
興味あるので何処の誤爆か教えてくれ

595 :デフォルトの名無しさん:2006/12/25(月) 23:12:27
>>585
直すのめんどいからとりあえず動くようにだけしとく
fin.eof()のポイントはタイミング
--- 3276.txt.orig2006-12-25 22:54:51.000000000 +0900
+++ 3276.txt2006-12-25 23:07:06.000000000 +0900
@@ -2,6 +2,7 @@
#include <string>
#include <fstream>/* ファイルの入出力 */
#include <conio.h>/* getch */
+#include <sstream>
using namespace std;
#include "Class_Club.h"
enum enTableItem { Rank, Name, Game, Win, Draw, Lose, ForGoal, AgainstGoal, DiffGoal, WinPoint ,Inbalid };
@@ -92,9 +93,11 @@
}

/* ファイルの末尾まで繰り返し */
-while ( !fin.eof() )
+string linebuf;
+while ( getline (fin, linebuf) )
{
strInLineBuf = cInLineBuf;
+istringstream fin (linebuf);

/* 1行単位で、順位,チーム名,試合数,・・・を抽出 */
for ( iItemCnt = 0 ; iItemCnt < Inbalid ; iItemCnt++ )


596 :デフォルトの名無しさん:2006/12/25(月) 23:12:57
@@ -109,12 +112,8 @@
case Name :
strName.clear();
chGetbyte = 0;
-while ( chGetbyte != ',' )
-{
-fin.get( chGetbyte );
-strName += chGetbyte;
-}
-fin >> chGetbyte;/* カンマ(',') */
+for (fin.get( chGetbyte ); chGetbyte != ','; fin.get( chGetbyte ))
+ strName += chGetbyte;
break;
case Game :
fin >> iGame;
@@ -146,7 +145,6 @@
break;
case WinPoint :
fin >> iWinPoint;
-fin >> chGetbyte;/* 改行('\n') */
break;
}
}


597 :デフォルトの名無しさん:2006/12/26(火) 01:50:42
Cで最も簡単なウィンドウ(最大化・最小化・閉じるのボタンを装備のみ)を作るのは
どうやったらできるんですか? 環境はwindows

598 :デフォルトの名無しさん:2006/12/26(火) 01:57:33
ぐぐればすぐできる。

599 :デフォルトの名無しさん:2006/12/26(火) 03:33:30
猫でもできる でググれ

600 :デフォルトの名無しさん:2006/12/26(火) 15:21:39
>>597
C++Builder起動して新規作成>アプリケーション選択してからF9

601 :585:2006/12/26(火) 16:46:59
>>595
助かりました。
ソースを変えて動作確認してから
間違っていたところとか見て勉強になりました。
感謝します!!



602 :デフォルトの名無しさん:2006/12/26(火) 17:22:37
>>601
boost::tokenizerとboost::lexical_cast使うともっと綺麗に書けるよ

string linebuf;
while ( getline (fin, linebuf) )
{
/* 1行単位で、順位,チーム名,試合数,・・・を抽出 */
typedef boost::tokenizer <> Tokenizer;
Tokenizer tokenizer (linebuf);
for (Tokenizer::const_iterator itr (tokenizer.begin ()),
last (tokenizer.end ()); itr != last;)
{
iRank = boost::lexical_cast <int> (*itr ++);
strName = *itr ++;
iGame = boost::lexical_cast <int> (*itr ++);
iWin = boost::lexical_cast <int> (*itr ++);
iDraw = boost::lexical_cast <int> (*itr ++);
iLose = boost::lexical_cast <int> (*itr ++);
iForGoal = boost::lexical_cast <int> (*itr ++);
iAgainstGoal = boost::lexical_cast <int> (*itr ++);
iDiffGoal = boost::lexical_cast <int> (*itr ++);
iWinPoint = boost::lexical_cast <int> (*itr ++);
}

/* 読み取ったものを表示 */
...
}


603 :デフォルトの名無しさん:2006/12/26(火) 17:31:05
これは酷い・・・

604 :デフォルトの名無しさん:2006/12/26(火) 19:07:23
確かに意味はすぐにくみ取れるようになってると思うが、
こうしてみると汚いにも程があるなw

605 :デフォルトの名無しさん:2006/12/26(火) 19:45:01
これだからBoost厨は……、って言われるじゃないか。

606 :579:2006/12/26(火) 19:59:08
>>580さん
>>581さん

仕事でここ見る暇もありませんでした。
お礼が遅れまして申し訳ございません。
回答ありがとうございました。
eraseの行を変更して上手く動くようになりました。

607 :デフォルトの名無しさん:2006/12/26(火) 20:24:53
オブジェクト指向を理解できてない見本みたいなプログラムだな

608 :デフォルトの名無しさん:2006/12/27(水) 17:38:18
>>603,>>604,>>605
貴方達ならどうする?

609 :デフォルトの名無しさん:2006/12/27(水) 18:27:36
Mac OS X 10.4.8を使っているのですが、
__Z11getpriorityii
__Z11setpriorityiii
なんていうC++(?)のマクロはどこにあるんでしょうか・・・?
ググっても1件も載ってなかったので・・・

610 :デフォルトの名無しさん:2006/12/27(水) 18:39:37
おそらくそれはC++コンパイラが名前変形 (name mangling)を施した後の名前。

611 :デフォルトの名無しさん:2006/12/27(水) 19:47:19
>>609
$ man setpriority
したららしきものが出てきたよ
BSDのシステムコールかこれ?


612 :デフォルトの名無しさん:2006/12/27(水) 21:04:25
>>608
俺は>>603-605ではないが、俺ならこんなのはscanf()使うな。
stdin以外を処理したけりゃfreopen()使うなりfscanf()で。

char buff[1024];
while (scanf("%d,%1023[^,],%d,%d,%d,%d,%d,%d,%d,%d",
&iRank, buff, &iGame, &iWin, &iDraw, &iLose, &iForGoal,
&iAgainstGoal, &iDiffGoal, &iWinPoint) == 10)
{
strGame = buff;
....
}


613 :デフォルトの名無しさん:2006/12/27(水) 21:13:47
>>612

でも
buffのサイズを超えるものだったらまずくない?

614 :デフォルトの名無しさん:2006/12/27(水) 21:19:00
>>613
>>585の仕様を見る限り、そこまでの汎用性はどう見ても求めてられないだろ。
>>612のコードは、一応バッファオーバーランは起きないようにしてある品。

汎用のコードにするんなら、クウォートや文字列中のカンマにも
対応すべきだろう。チーム名が1024文字以上になるよりは、カンマが
入り込んでくることの方が、ずっとありそうなことだ。

まーこんなゴミみたいな仕事はサクッと片付けるべきだと俺は思うね。
本来C++使うのも馬鹿馬鹿しい仕事だが。

615 :デフォルトの名無しさん:2006/12/27(水) 23:56:55
初歩的な質問ですいません。
そもそもC言語とC++の違いってなんですか??
こっちだとこういうメリットがあるっていうのが知りたいんですが。

616 :デフォルトの名無しさん:2006/12/28(木) 00:10:51
ソースコード全体がプログラムになっているかどうかを判定するようなプログラムって、
どうやって作るんですか?
そういうプログラムのことを何か特別な名前で呼びますか?

617 :566:2006/12/28(木) 00:12:24
>>616
コンパイラ?

618 :デフォルトの名無しさん:2006/12/28(木) 00:13:50
変なハンドル出たorz

619 :デフォルトの名無しさん:2006/12/28(木) 00:26:57
>>615
C++はCにクラスやテンプレート等、色んなものをくっつけて強化した言語。
以前はほぼCの上位互換だったが、最新のCの仕様(C99)で互換性は失われた。

特徴は
C: シンプルだが何でもプログラマ任せ
C++: 複雑だが強力
ってとこかな。


620 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/28(木) 01:07:37
FORTRANはF77準拠の処理系が現役だったりするわけで、別に最新規格じゃないといけないわけじゃないし
どうせC++も次の規格でC99を踏襲してくるだろ。



つか、仕事で未だにVC++6.0使ってるんだが

621 :デフォルトの名無しさん:2006/12/28(木) 01:09:19
>どうせC++も次の規格でC99を踏襲してくるだろ。

それは無い。進行中のドラフト見てみろ。

622 :デフォルトの名無しさん:2006/12/28(木) 01:14:51
しかしsnprintfが入るのはありがたい
・・・VCの_snprintfが空気読んでないからな

623 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/28(木) 01:16:04
無いのか。。。。
MS擁護になるけど、 _s付きの関数は標準ライブラリに取り込んで欲しいよなぁ

624 :デフォルトの名無しさん:2006/12/28(木) 01:18:08
セキュアCRTが今までなかったのに驚かされるな
けど標準入りは今のところ微妙だなぁ・・・

625 :デフォルトの名無しさん:2006/12/28(木) 01:46:34
ぶっちゃけさっさとCなんぞ捨ててC++に移行しろ、というMSの声に
聞こえなくも無いw

626 :デフォルトの名無しさん:2006/12/28(木) 01:48:49
その前にAPIをC++化しろ

627 :デフォルトの名無しさん:2006/12/28(木) 01:52:19
>>626
C++はABIが複雑すぎるからダメ(C++専用になっちゃう)
そのせいでCOMが策定されますた
今は.NETの時代です
んでも、WinFXの構想は既に半コケですネ

以上

628 :デフォルトの名無しさん:2006/12/28(木) 01:59:50
>>626
ネームマングリングされたAPIなんて嫌すぎます。

629 :デフォルトの名無しさん:2006/12/28(木) 02:01:29
>>628
想像して、飲んでる途中のホットミルクカップに戻しちまった('A`)

630 :デフォルトの名無しさん:2006/12/28(木) 02:03:40
xxxAやxxxW、xxxExAやxxxExWはおk?

631 :デフォルトの名無しさん:2006/12/28(木) 08:52:38
cygwinでC++についての質問です
以下のソースでgetでのcoutが-1になるのは何が原因なのでしょうか?

#include <iostream>
#include <fstream>

using namespace std;

void get(ifstream &is) {
 char tmp[4];
 is.read(tmp, 4);
 cout << is.tellg() << endl;
}

int main(int argc, char *argv[]) {
 ifstream ifs(argv[1], ios::binary);
 ifs.seekg(4, ios::beg);
 get(ifs);
 return 0;
}

開くファイル
53 54 42 31 EB 36 00 00

632 :デフォルトの名無しさん:2006/12/28(木) 09:28:10
>>631
std::ios::failbitが立っている時のtellg()が返す値は無意味。

633 :609:2006/12/28(木) 12:42:09
>>611
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man2/getpriority.2.html
こんな関数だそうで、BSDにもLinuxにもMac OS Xにもコマンドとしてあるようなのです
こんなマクロどこに書いてあるんでしょう・・・

time.hやsys/time.hやsys/resource.hとか、
関係ありそうなヘッダファイルやソースは見てみたのですが・・・


634 :デフォルトの名無しさん:2006/12/28(木) 12:55:48
>>633
Mac OS X のことは知らないが、
VineLinux なら /usr/include/sys/resource.h にあった。
下のコマンドうってみては?

grep priority /usr/include/*.h
grep priority /usr/include/sys/*.h

635 :デフォルトの名無しさん:2006/12/28(木) 14:21:35
>>633
find /usr/include | xargs grep priority

636 :デフォルトの名無しさん:2006/12/28(木) 14:39:49
include ファイルを調べるのではなく、
リンカへのオプションでライブラリ追加しなきゃいけない希ガス

637 :デフォルトの名無しさん:2006/12/28(木) 14:46:26
structA* a = new structA();とstructA* a = &structA();は
同じことなのでしょうか?

638 :デフォルトの名無しさん:2006/12/28(木) 14:50:06
>>637
全然違う

639 :デフォルトの名無しさん:2006/12/28(木) 15:49:05
右きめぇ

640 :デフォルトの名無しさん:2006/12/28(木) 15:55:17
>>637
右ってコンパイル通ったっけ?

641 :デフォルトの名無しさん:2006/12/28(木) 17:31:46
win32アプリケーションで作成中のエラーです

------ ビルド開始: プロジェクト: message, 構成: Debug Win32 ------
コンパイルしています...
ModelMain.cpp
c:\c++練習\sample\sec02\modelapp\modelmain.cpp(27) : error C2440: '=' : 'const char [9]' から 'LPCWSTR' に変換できません。
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
c:\c++練習\sample\sec02\modelapp\modelmain.cpp(44) : error C2664: 'CreateWindowExW' : 3 番目の引数を 'const char [24]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
c:\c++練習\sample\sec02\modelapp\modelmain.cpp(58) : warning C4244: 'return' : 'WPARAM' から 'int' への変換です。データが失われる可能性があります。
ビルドログは "file://c:\C++練習\message\Debug\BuildLog.htm" に保存されました。
message - エラー 2、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

参考書を見てまったく同じように打ったのにエラーが出てしまいます
このエラーの意味と解決方法を教えていただきたいです
コードは長いんですが張ったほうがいいんですかね・・・
78行あるので貼れないと思いますけど

642 :デフォルトの名無しさん:2006/12/28(木) 17:38:24
>>641
想像だが、多分君の環境ではUNICODEが定義されてるんだろうな。
んで、サンプルはUNICODEが定義されていないことを改定している。

本来、TCHARを使うべきところでcharなんぞを使ってる時点で
そのサンプルは糞だが、
プロジェクトのプロパティで
ユニコードではなく「マルチバイト文字セットを使用する」ように
設定してやればいいはずだ。


643 :デフォルトの名無しさん:2006/12/28(木) 17:50:33
次からテンプレにいれとくか

644 :デフォルトの名無しさん:2006/12/28(木) 17:57:24
>>642
Visual C++ 2005 Express Editionを使用しています
サンプルはプログラマ養成入門講座 Visual C++@と言う本のコードです

今書き込んだあと一度プロジェクトを削除してもう一度やろうとしてみたんですが
プロジェクトを作成しようとしてアプリケーションウィザードを開くと白くなり
その先に進めずプロジェクトが作れなくなってしまいました・・・

Platform SDKをさっき入れていろいろ設定いじったのでどこか間違えたのかもしれません・・・

645 :デフォルトの名無しさん:2006/12/28(木) 18:03:18
2005からデフォルトでUNICODEだから
とりあえずソースファイルの一番先頭(一行目)に
#undef _UNICODE
って入れてからまたコンパイルしてみ

646 :デフォルトの名無しさん:2006/12/28(木) 18:03:21
原因がわかりました

XML 解析中に次のエラーが発生しました:

ファイル: C:\Program Files\Microsoft Visual Studio 8\VC\VCProjectDefaults\CoreWin_Express.vsprops
行: 10
列: 1
エラー メッセージ:
修飾名の文字が無効です。

ファイル 'C:\Program Files\Microsoft Visual Studio 8\VC\VCProjectDefaults\CoreWin_Express.vsprops' を読み込めませんでした。

システム プロジェクトの既定のファイル 'C:\Program Files\Microsoft Visual Studio 8\VC\VCProjectDefaults\CoreWin_Express.vsprops' を読み込めませんでした。
このファイルのインストールなしでプロジェクトを読み込むことができません。
製品を再インストールしてください。

XML 解析中に次のエラーが発生しました:

ファイル: C:\Program Files\Microsoft Visual Studio 8\VC\VCProjectDefaults\CoreWin_Express.vsprops
行: 10
列: 1
エラー メッセージ:
修飾名の文字が無効です。

ちょっとサイトのほうでもう一度確認してきます。

647 :デフォルトの名無しさん:2006/12/28(木) 18:05:04
>>645
環境が明記されてるし、プロジェクトのプロパティで UNICODE のチェックを外すほうが良いのでは?

648 :デフォルトの名無しさん:2006/12/28(木) 18:26:04
CoreWin_Express.vspropsは<tool/>の/>を誤って消していたのが原因でした


ソースの1行目に#undef _UNICODEを入れて見ましたが同じくエラーが出ました・・・
>>647のチェックを外すというのは
UNICODE 応答ファイルの使用を いいえ にすると言う事ですよね?
同じくエラーが出ました


c:\c++練習\sample\sec02\modelapp\modelmain.cpp(28) : error C2440: '=' : 'const char [9]' から 'LPCWSTR' に変換できません。
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
c:\c++練習\sample\sec02\modelapp\modelmain.cpp(45) : error C2664: 'CreateWindowExW' : 3 番目の引数を 'const char [24]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
c:\c++練習\sample\sec02\modelapp\modelmain.cpp(59) : warning C4244: 'return' : 'WPARAM' から 'int' への変換です。データが失われる可能性があります。
ビルドログは "file://c:\C++練習\message\Debug\BuildLog.htm" に保存されました。
message - エラー 2、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========


649 :デフォルトの名無しさん:2006/12/28(木) 18:33:25
[全般]の文字セットだよ

650 :デフォルトの名無しさん:2006/12/28(木) 18:41:44
>>649
勘違いしていました・・・

マルチバイト文字セットを使用するを選んだところ

------ ビルド開始: プロジェクト: message, 構成: Debug Win32 ------
リンクしています...
MSVCRTD.lib(crtexe.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。
C:\C++練習\message\Debug\message.exe : fatal error LNK1120: 外部参照 1 が未解決です。
ビルドログは "file://c:\C++練習\message\Debug\BuildLog.htm" に保存されました。
message - エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

少しエラーが変わりました

設定なしでも同じでした

651 :デフォルトの名無しさん:2006/12/28(木) 18:51:28
WinMainから始まるコードなら
[リンカ]-[システム]-[サブシステム] をWindows (/SUBSYSTEM:WINDOWS)にする
そうでないならワカンネ

652 :デフォルトの名無しさん:2006/12/28(木) 19:10:24
>>651
------ ビルド開始: プロジェクト: message, 構成: Debug Win32 ------
コンパイルしています...
ModelMain.cpp
c:\c++練習\sample\sec02\modelapp\modelmain.cpp(59) : warning C4244: 'return' : 'WPARAM' から 'int' への変換です。データが失われる可能性があります。
リンクしています...
マニフェストを埋め込んでいます...
ビルドログは "file://c:\C++練習\message\Debug\BuildLog.htm" に保存されました。
message - エラー 0、警告 1
========== ビルド: 1 正常終了、0 失敗、0 更新、0 スキップ ==========

正しい値が入らないみたいですが実行可能でした
とりあえずこれで次に進めるのでこのままで行きたいと思います
ありがとうございました。

653 :デフォルトの名無しさん:2006/12/28(木) 20:34:39
>>627-628
GDI+のネイティブ版<gdiplus.h>のように、
DLLはCリンケージの関数を公開するがヘッダでC++クラスを使ったAPIを提供するという手もある。

654 : ◆usf5LDa6yg :2006/12/28(木) 21:07:22
言語:C

コンパイラ:Visual Stdio C++

状況:
PathIsDirectory関数を使うために、shlwapi.libをリンクに追加して、
#include <shlwapi.h>をソースに追加したら、
shlwapi.hに関するエラーが約200出た。

質問:
PathIsDirectory関数は、Cでは使えないってこと?


655 :デフォルトの名無しさん:2006/12/28(木) 21:51:26
プログラミング関係でファーザーっていう用語あります?
ぐぐっても出てきませんが。

656 :デフォルトの名無しさん:2006/12/28(木) 22:00:01
>>655
father?
どんな場面で出てくるの?

657 :質問1/2:2006/12/28(木) 22:27:34
超初心者的で申し訳ありませんが、質問をさせていただいてよろしいでしょうか。
質問内容は、サブクラスsubAで継承した関数subA.funcを使ったとき、
ベースクラスAでもともと定義されている関数A.funcに参照渡しされている引数class Aの代わりにサブクラスsubAを使えるかと言うことです。
簡単なコード例を書きますと、以下のような使い方はできるか、ということです。

class A
{
public:
double a;
double b;
double func( A& AObj );
};

double A::func( A& AObj )
{
double z = 0.0;
z = AObj.a + AObj.b;
return z;
}

class subA : public A
{
public:
double c;
};

int main ()
{
subA suAObj;
suAObj.a = 1.0;
suAObj.b = 2.0;
subA.func( suAObj );

658 :質問2/2:2006/12/28(木) 22:28:23
実際、VC++2005でコンパイルしてみましたところ、
error LNK2019: 未解決の外部シンボル "public: double __thiscall A::func(class A,double)"?(・・・・・・)が関数 _main で参照されました。
とのエラーメッセージが出るのでおそらくは駄目なのでしょうが、この方法の代わりにどのような方法を使えばよいでしょうか。
サブクラス一つ一つについて、定義の際、
double subfunc( subA& subAObj );
と書かなければならないのでしょうか。

最後に、クラスについては勉強し始めたばかりですので、何か間抜けなことを書いていたならすみません。

659 :デフォルトの名無しさん:2006/12/28(木) 22:35:00
ポインタで渡してみ

660 :デフォルトの名無しさん:2006/12/28(木) 22:39:39
>>657
解決方法
1.func を static にする
2.subA.func( suAObj ); を suAObj.func( suAObj ); にする
3.this を使う

661 :デフォルトの名無しさん:2006/12/28(木) 23:24:18
>>660
1については、staticにしなければならない意味がよく分かりません・・。
2については、この場合、「オーバーロードされたメンバ関数がAにありません」とエラーが出ます。

>>659>>660の3
thisポインタを使った方法でやれ、ということですね。
今まで、自身のメンバ変数を引数に指定する必要は無いことすら知りませんでした。
この方法はうまくいきました。

662 :661:2006/12/28(木) 23:25:59
>>661>>657-658の質問者です。
名前欄に明示し忘れておりました、すみません。

663 :661:2006/12/28(木) 23:34:58
すみません、2の方法を使ったコードを見直していたら、
2でエラーが出たのは、ヘッダファイルでのメンバ関数宣言で引数を書き忘れていたためエラーが出ていただけでした
2の方法でも問題なく動作しました、何度もすみません

664 :デフォルトの名無しさん:2006/12/28(木) 23:35:35
>public: double __thiscall A::func(class A,double)
なんでソースにでてこない、引数が「class A, double」なんて
メソッドについてエラーがでるんだ?

665 :661:2006/12/28(木) 23:42:26
>>664
>>647は本来もっと複雑な書きかけのプログラムでして、
もともとの関数はもっと多くの引数をもっていて
class A, double a, double b,...と続くのですが、>>647には書く必要が無いため省略しています
そのAの後のdoubleを消し忘れただけです。すみません。

666 :デフォルトの名無しさん:2006/12/29(金) 00:40:14
今Visual C++ 2005 Express Editionを使っているんですが
勉強に使っている本がVisual C++ 6.0を使用しているみたいでまったく同じコードでもエラーが出てしまいます
サンプルもよくわからないエラーで使用不可能なので勉強がまったく進められません・・・

もう配布終了になっているVisual C++ 6.0を入手する方法はないですか?
また持ってる方はいないでしょうか・・・

6.0と同じ環境にできるならそれでも構わないです
よろしくお願いします

667 :デフォルトの名無しさん:2006/12/29(金) 00:43:55
>>666
犯罪を犯すよりも本を買い換えな。

668 :デフォルトの名無しさん:2006/12/29(金) 00:55:11
>>667
その事を忘れてました・・・
本なんですが3冊セットになっててまだ1冊目の半分程度しか進めていないので買い換えるのはもったいない気がして・・・
2005をを6.0に似た環境にする設定とか無いですかね・・・

エラーの内容は>>641で質問した内容+αといった感じです
6.0のソースを使えるような設定に出来ればそれで解決なんですが・・・

669 :デフォルトの名無しさん:2006/12/29(金) 00:57:16
どうしてその本にこだわってるのか知らんが、糞みたいな方法を覚えるより本を買い換えたほうが絶対得だと思うが

670 :デフォルトの名無しさん:2006/12/29(金) 00:58:18
>>668
そんな設定はありません。残念でした。

671 :デフォルトの名無しさん:2006/12/29(金) 01:01:52
>>668
マルチバイト文字セットとforスコープのオプションで大体うまくいくと思うけどな。

672 :デフォルトの名無しさん:2006/12/29(金) 01:04:35
>>669
金銭面できついので出来るだけこの本で勉強したかったのが一番の理由です
何か2005でも動くソースでお勧めの本とかありますか?

673 :デフォルトの名無しさん:2006/12/29(金) 01:10:51
>>672
Google

674 :デフォルトの名無しさん:2006/12/29(金) 01:41:02
>>672
googleでたいてい揃う

675 :デフォルトの名無しさん:2006/12/29(金) 02:26:05
サンプルコードは何やってるかわかればいいんだから
割り切って読むだけにしとくのもひとつの手。

676 :デフォルトの名無しさん:2006/12/29(金) 02:45:15
>>672
MSのPlatform SDK(タダで落とせる)には、サンプルコード沢山着いてくるぞ
後はwww.codeguru.comとかその手のサイトが海外にいくらでもある

677 :デフォルトの名無しさん:2006/12/29(金) 08:28:58
>>671
俺はVC6しかないけど
 for (int i=0; ...) { }
 // ここで i は有効(VC6) 2005だとデフォ無効シンボル
ってことかな?

678 :デフォルトの名無しさん:2006/12/29(金) 11:01:17
俺は寧ろ VC6 の方で

#define for if(0);else for

とかやってスコープ切ってるけどな。


679 :デフォルトの名無しさん:2006/12/29(金) 11:12:04
>>677
yes
てか今のC++コンパイラではiはfor内のみ有効が普通。
VC7以降や某のコンパイラはVC6で書かれたソースの互換性維持のためにオプションでfor以降有効に変更できるけど。

680 :デフォルトの名無しさん:2006/12/29(金) 11:48:58
>>678
そういう意味だったのか
たまにそういう記述みかけるけど、なんだか解らんかったよ

681 :デフォルトの名無しさん:2006/12/29(金) 16:24:08
struct hoge
{
int i,j,k;
hoge(){}
hoge(int _i, int _j, int _k){
i = _i;j = _j;k = _k;
}
};

void func()
{
int a,b,c;
hoge* ph = 0;
〜略
for(〜){
ph[〜] = hoge(a,b,c);
}
}

上のようなプログラムを見まして
構造体をnewもせずに突然hoge(a,b,c)とか書いてるのが謎だったのですが、
これは一時オブジェクトというものであると教えていただきました。

で、それをキーワードにググって見たんですけど、
これがどういうものでどういうときに使ってnewとはどう違うか等、
私のような初心者にも分かるような説明が見当たらなかったもので、
どなたか噛み砕いて教えていただけないでしょうか。お願いします。

682 :デフォルトの名無しさん:2006/12/29(金) 16:32:21
>>681
単純に考えよう。
int * intOnHeap = new int;
intOnHeap[0] = int(10);

std::vector<int> intArray;
intArray.push_back(int(10));
なら判るのかな? それなら
hoge * hogeOnHeap = new hoge;
hoge[0] = hoge(a, b, c);

std::vector<hoge> hogeArray;
hogeArray.push_back(hoge(a, b, c));
も同じことだ。

683 :デフォルトの名無しさん:2006/12/29(金) 16:44:26
>>681
オブジェクトが置かれるメモリ空間には、スタックとフリーストア(&ヒープ)がある。
一時オブジェクトはスタックを使う他、最適化で無駄なオブジェクト構築が
省かれる可能性がある。

スタック:
普通に変数宣言したり一時オブジェクトを作成することで確保される。
確保が高速。明示的な解放が不要。
サイズが限定されているのであまり大きなメモリは確保できないが、
コンパイラのオプションで変更は出来る。

フリーストア(&ヒープ):
new(またはmalloc系関数)で確保される。newで確保されるのはフリーストア、
mallocで得られるのはヒープだが使う方としては違いは無い。
確保が低速。明示的な解放(deleteやfree)が必要。
確保サイズに上限は無いが、確保に失敗する可能性がある。
失敗すると例外std::bad_alloc送出(古いコンパイラはNULLを返す)
これで得られるのはメモリアドレスなので、ポインタや参照を通して
操作する必要がある。

684 :デフォルトの名無しさん:2006/12/29(金) 17:03:29
>>681
for(〜){
 {
  hoge tmp(a, b, c);
  ph[〜] = tmp;
 }
}

意味的にはこれと同じ

685 :デフォルトの名無しさん:2006/12/29(金) 17:12:46
C言語の質問させてもらいます
iとjの変数があって
37と入力したとき
iに3、jに7を代入する方法はありませんか?

686 :デフォルトの名無しさん:2006/12/29(金) 17:14:45
char buf[100];
int i, j;

gets(buf);

i = atoi(buf) / 10;
j = atoi(buf) - i * 10;

687 :デフォルトの名無しさん:2006/12/29(金) 17:20:30
#include <stdio.h>

main()
{
char buf[100];
int i,j;
char *buf_ = buf;

gets(buf);
i = (int)*buf_ - '0'; buf_++;
j = (int)*buf_ - '0';

printf("i: %d j: %d\n", i, j);
}

688 :デフォルトの名無しさん:2006/12/29(金) 17:20:49
>>686
×j = atoi(buf) - i * 10;
○j = atoi(buf) % 10;

689 :デフォルトの名無しさん:2006/12/29(金) 17:21:22
どっちでもいいじゃないか

690 :681:2006/12/29(金) 17:22:20
>>682-684
三つ合わせて読んだら大変よく分かりました。
かなりすっきりできました。ありがとうございました!

691 :デフォルトの名無しさん:2006/12/29(金) 17:24:33
>>688
×ではなくてせめて△にしてくれ。
間違いじゃないんだから。

692 :デフォルトの名無しさん:2006/12/29(金) 17:38:33
i = _getch();
j = _getch();

693 :デフォルトの名無しさん:2006/12/29(金) 18:10:07
>>686-688
ありがとうございました

694 :デフォルトの名無しさん:2006/12/29(金) 20:00:55
>>684
基本的には>>684だけど、オブジェクトの寿命を考えたら同じとは言えないのでは?
>>684のケースでは tmpを宣言したブロックないではtmpが存在していることを保証できるけど、
>>681の例では
> ph[〜] = hoge(a,b,c);
の行を抜けたら一時オブジェクト hoge(a,b,c) の実体はどうなるか分からないんじゃなかったっけ?
この場合はすぐに代入してph[〜]のほうしか使わないから問題ないけど、
オブジェクトのアドレスを取ったりするケースでは問題があったと思う。

間違ってるかもしれないので詳しい人フォローおねがい。


695 :デフォルトの名無しさん:2006/12/29(金) 20:03:17
一時オブジェクトはconst変数への束縛がある時を除き、
代入または初期化が済んだら即解体されると覚えておけばよい。

696 :デフォルトの名無しさん:2006/12/29(金) 20:04:17
std::string buf = "37";
int i,j;

std::string::iterator it = buf.begin();
i = *it - '0'; it++;
j = *it - '0';

697 :デフォルトの名無しさん:2006/12/29(金) 20:38:08
コンソールアプリケーションで、
ビルドして生成されるEXEファイルのアイコンを
変えたいです。
([ソリューションエクスプローラ]から[リソースファイル]-[追加]
から[既存の項目の追加]で、オリジナルのアイコンを選択して、
ビルドしましたが、アイコンは変更されませんでした)

どうやってやればいいか、教えてください。

環境ですが、私はVC++2005ExpressEditionを使っています。

698 :デフォルトの名無しさん:2006/12/29(金) 20:40:08
コンソールアプリケーションにはアイコンも糞もないと思うが。

699 :デフォルトの名無しさん:2006/12/29(金) 20:46:41
>>697
アイコンを含むリソースファイルを .exe に結合すれば Windows が勝手にアイコンを表示するはず
有力な可能性は .bmp の拡張子を .ico に変えただけのファイルなんじゃないかということ

700 :デフォルトの名無しさん:2006/12/29(金) 20:51:36
おそらくはアイコンを使えというrcファイルを書いたのではなく
ソリューションエクスプローラ(だっけな?)に表示できる状態にしているだけに俺は1票

701 :デフォルトの名無しさん:2006/12/29(金) 21:09:22
ご回答感謝します。

>>699
アイコンの作り方が間違っているんでしょうか?
ちなみに私は(彩彩畑という)ソフトを使って、*.gif画像を元に*.icoを生成
しました。

>>700
*.rcファイルって検索したらテキストファイルらしいですね。
今この種類のファイルはないんですが、これも
用意しなければ、アイコンは表示されないっていうことですか?

702 :デフォルトの名無しさん:2006/12/29(金) 21:24:23
いろいろいじってみました。
>>700 さんの仰っているいるとおりですね。
*.rcファイルを作ってみました。
rcの中身を↓のようにしました。
IDI_ICON1ICONDISCARDABLE"TEST.ico"

書いている内容は最後の" "の部分しかわかりませんが、
とりあえず、アイコンを変更できました。

ありがとうございます。

703 :デフォルトの名無しさん:2006/12/29(金) 21:27:15
>>701
アイコンファイルをバイナリエディタで開いてみて、
ファイルの先頭が BM または GIF で始まっていた場合には
アイコンを作りなおせばいいと思う。
それ以外の場合は、VC++2005ExpressEdition を持ってないのでオレには分かりません。

704 :デフォルトの名無しさん:2006/12/29(金) 23:31:37
よくC言語をマスターしたら他の言語も勉強しろって言うけど
C言語をマスターするってどの程度のレベル?
それなりのプログラムを書けたらとりあえずはマスターしたことになるのかな
それともその人の気持ち次第ってこと?

705 :デフォルトの名無しさん:2006/12/29(金) 23:59:32
規格書に書いてあることが理解できて応用できるくらい?

706 :デフォルトの名無しさん:2006/12/30(土) 00:02:09
宿題スレに出される問題がすらすら解けるぐらいじゃね?

707 :デフォルトの名無しさん:2006/12/30(土) 00:23:07
C言語ならまかせろ って言えたらマスターかな・・・1年じゃ無理だろうな・・・

195 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)