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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.26【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1143601166/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2006/05/09(火) 23:12:10
>1
PS3高いな乙
3988:2006/05/09(火) 23:18:46
スミマセン、前スレの988です(´ヘ`;)

このプログラムで、例えばABCDEって入力して、前の3文字を消して
DEって出力させたいと思ってます。

strcpyのプロト宣言っていうのは()の中が2つともchar型ってことでいいでしょうか?
4デフォルトの名無しさん:2006/05/09(火) 23:20:53
>>3
char じゃないよ char* と char const* だよ。
5988:2006/05/09(火) 23:20:54
ちょっと直してみました。
#include <stdio.h>
#include <string.h>

int main(void)
{
int i,n;
char ss[80] , rr[80];

gets(ss);
n = strlen(ss);

for(i=3;i <= n; i++)
{
strcat(rr,ss[i]);
}

printf("%s\n",rr);

return 0;

}

出るエラーは「パラメータ '__src' は const signed char * 型として定義されているので int は渡せない(関数 main )」です。
6デフォルトの名無しさん:2006/05/09(火) 23:21:25
>>3
プロト宣言じゃないよプロトタイプ宣言だよ。
7デフォルトの名無しさん:2006/05/09(火) 23:22:43
gets(ss);
printf("%s\n", ss + 3);
8988:2006/05/09(火) 23:31:25
>>7
おお、こんなことできるんですか!?
実は「出力したい」と書きましたが、最終的にはある文字列に新しく入力した文字列を
挿入するってプログラムを作りたいんです^^;
例えばABCDEFっていうところにabcを挿入して、ABCabcDEFって出力する感じで。

また少しプログラム変えたんですが、今度は画面に@が出てきたんですけど、
どうしてでしょうか?

#include <stdio.h>
#include <string.h>

int main(void)
{
char ss[80] , rr[80];

gets(ss);

strcat(rr,ss+3);

printf("%s\n",rr);

return 0;

}
9デフォルトの名無しさん:2006/05/09(火) 23:33:27
strcpy(rr, ss + 3);
10988:2006/05/09(火) 23:35:42
>>9
いけました!ヽ(´ー`)ノ
ありがとうございます。
11デフォルトの名無しさん:2006/05/09(火) 23:37:56
>>10
sprintf も頭に入れとけ。
12デフォルトの名無しさん:2006/05/09(火) 23:45:56
っていうか、何も理解して無いだろ?
やっぱ頭が・・・
13デフォルトの名無しさん:2006/05/09(火) 23:48:02
まあ、色々いじれば分かるだろう。
14デフォルトの名無しさん:2006/05/09(火) 23:56:59
頭をな。
15デフォルトの名無しさん:2006/05/10(水) 00:52:06
初期化していない rr に対して strcat して大丈夫なんか?
16デフォルトの名無しさん:2006/05/10(水) 00:53:08
>>15 ダメです。
17デフォルトの名無しさん:2006/05/10(水) 04:07:05
そもそもgets()とか
18デフォルトの名無しさん:2006/05/10(水) 07:43:22
Cの関数について質問です。
char *hoge() {
return("うんこ");
}

int main() {
printf("%s\n",hoge());
}

だとなんのエラーも出ないけど
char *hoge() {
char str[16];
strcpy(str,"うんこ");
return(str);
}

int main() {
printf("%s\n", hoge());
}
だとローカル変数のポインタを返してると警告が出ますよね。
その通りだよなと納得はするんですがどうすればいいか思いつきません。
どうしましょう?
19デフォルトの名無しさん:2006/05/10(水) 07:48:48
>>18
hoge() は領域を引数で受け取るようにして main() で用意した配列を渡す。
または hoge() が malloc() して作成した領域を返すようにする。
20デフォルトの名無しさん:2006/05/10(水) 07:52:43
staticにするとか?
21デフォルトの名無しさん:2006/05/10(水) 07:55:03
即レスさんくす。そういうことをするのですね。
ちなみに今似たようなソースを探してたら
char str[16];を
static char str[16];
としてるやつにぶつかって、やってみたら警告も消えたんですが
これって何か問題ありますでしょか。
例は簡略化してますが、結果的にhoge()の中で文字列を操作して、
返ったあとには操作しない予定です。
22デフォルトの名無しさん:2006/05/10(水) 07:57:43
ああ、>>20の人のレス見逃してました。
いいみたいっすね。どうもでした。感謝。
23デフォルトの名無しさん:2006/05/10(水) 08:00:48
>>21
繰り返し hoge() を呼び出して複数の変数に戻り値を格納した場合でも、
指している領域が同じであるということに気をつける必要がある。
1度目の呼び出しで得た(つもりの)結果が、2回目の呼び出しで
変更されている可能性がある。

またマルチスレッド環境で同時に呼び出すと破綻する。
24デフォルトの名無しさん:2006/05/10(水) 17:24:17
BccDev.exeの環境設定がうまくいかないのですが・・・
コンパイラC:\WINDOWS\デスクトップ\niko\bcc55\Bin\bcc32.exe
デバッカC:\WINDOWS\デスクトップ\新しいフォルダ\bin\TD32.EXE

どこかおかしいですかね?
25デフォルトの名無しさん:2006/05/10(水) 17:28:35
なんでそんな面白いところに置くんだ・・・
26デフォルトの名無しさん:2006/05/10(水) 17:31:45
/*haiio.c*/

#include <stdio.h>

int main()
{
printf("Haiio word!\n");
return 0;
}


エラー E2209 c:\my documents\プロジェクト\tist\tist.c 3: インクルードファイル 'stdio.h' をオープンできない


さっきからやってるのに直らないんですが・・・
27デフォルトの名無しさん:2006/05/10(水) 18:33:18
C/C++のフリーのコンパイラ探してるんですが
BorlandC++Compiler 5.5はXPでも可能?
動作環境に入ってないんでインストールしようかどうしようかと(゜Д゜;)
28デフォルトの名無しさん:2006/05/10(水) 18:42:46
>>27
試せば?支障出るのが嫌なら仮想マシンでも出来るわけだし
29デフォルトの名無しさん:2006/05/10(水) 18:43:00
なにも問題なく動くはずだが、お前さんみたいな素人は最初の設定で躓いて上の馬鹿みたいな質問するのがオチ。
素直にVC++のフリー版使っとけ
30デフォルトの名無しさん:2006/05/10(水) 18:50:24
>27
http://www.sourcenext.com/products/trueimage_p/
せめてこれを用意しておけ。駄目だったらすぐにリカバリすればいいんだから。
#中身はソース製じゃないよ
31デフォルトの名無しさん:2006/05/10(水) 19:02:01
ここの回答者の人達ってC言語をどれくらいでマスターしたんですか?
32デフォルトの名無しさん:2006/05/10(水) 19:07:26
まだマスターしていません。
33デフォルトの名無しさん:2006/05/10(水) 19:16:02
最初の設定難しいんですか?!(゜Д゜;)ガーン
とりあえず試してみます!
無理だったら>30のお世話になってVC++のフリー版を
落としてみます。お世話になりますた(´∀`)ノン
34デフォルトの名無しさん:2006/05/10(水) 20:11:04
>>33
パス通してbcc32.cfgとilink32.cfgにインクルードファイル置き場と標準ライブラリ置き場のパス書くだけやん
35デフォルトの名無しさん:2006/05/10(水) 20:32:13
その手の質問が一番多いだろ
特に3〜5月
36デフォルトの名無しさん:2006/05/10(水) 22:20:54
gccで質問なんですが、printfで文字列リテラルだけ渡した時に
putsとリンクされてしまいます。オプションは最適化なし( -O0)で実行しています。
最適化ありだと分かるんですが、最適化なしでもこうなるものなのですか?
gccのバージョン1は4.0.2です。
37デフォルトの名無しさん:2006/05/10(水) 22:26:12
>>36
自分で
> putsとリンクされてしまいます。オプションは最適化なし( -O0)で実行しています。
と書いてんじゃねーか。それが答えだ。
38デフォルトの名無しさん:2006/05/10(水) 22:57:48
>>36
文字列リテラルの末尾を改行ではなく空白あたりにしてやるとputs()をリンクするのをやめると思うよ。
39デフォルトの名無しさん:2006/05/10(水) 23:00:56
prrintf("hoge");を
prrintf("%s","hoge");
なら置換しないんじゃね?
40デフォルトの名無しさん:2006/05/10(水) 23:02:43
いやだから、>39の例ならputs()にできないって。
4139:2006/05/10(水) 23:04:56
やべぇ
ぷりりんとエフになってた
4236:2006/05/10(水) 23:32:18
結局、最適化オプションと実際にリンクする関数は
無関係ということでいいんですね。ありがとうございました。
一応ソースさらしておきます。

#include <stdio.h>
int main ()
{
printf("hello, world\n");
}
43デフォルトの名無しさん:2006/05/10(水) 23:33:44
そうか、ぷりりんとエフが作業しててくれてるのか。
44デフォルトの名無しさん:2006/05/10(水) 23:46:26
下のようなコードでgcc4.0.2でエラーが発生するのですが、なにか根本的に間違っているのでしょうか?
gcc3.2?ではwarning: implicit typename is deprecatedという警告が出力されます。

#include <vector>

template<class A>
class Test
{
std::vector<A> vvv;

public:
void method()
{
std::vector<A>::iterator it = vvv.begin(); // ここでエラー error: expected `;' before ‘it
}
};
45デフォルトの名無しさん:2006/05/10(水) 23:55:13
>>44
deprecated だったのがが正式に削除されただけ。何も不思議なことは無いな。
46デフォルトの名無しさん:2006/05/10(水) 23:56:11
typename std::vector<A>::iterator it = vvv.begin();
47デフォルトの名無しさん:2006/05/11(木) 00:07:58
>>46
動きました!ありがとうございました。
typenameというのをはじめて知りました。もっとちゃんと勉強しないとだめですね。
48デフォルトの名無しさん:2006/05/11(木) 00:31:16
>>47
警告とエラーメッセージに出てたはずなんだが。
コンパイラからのメッセージは読んどけよ。
49デフォルトの名無しさん:2006/05/11(木) 00:45:47
>>48
すみません。。。エラーメッセージの意味がよくわからなかったというのが正直なところです。。もっと精進します。
50デフォルトの名無しさん:2006/05/11(木) 19:56:16
明解C言語入門編をやってるんですけど、演習に

3つのint型整数を昇順に並び替える関数
void sort3(int *n1,int *n2,int n3)を作成せよ。

て問題があったんです。
一応できたんですけど、もっといいソースがあるとなんとなく思うんですけど
どうですか?
#include<stdio.h>

void swap(int *x,int *y)
{
int temp;
temp=*x;
*x =*y;
*y =temp;
}

void sort3(int *x,int *y,int *z)
{
if (*y<*x)
swap(x,y);
if (*z<*y)
swap(y,z);
if (*y<*x)
swap(x,y);
}
51デフォルトの名無しさん:2006/05/11(木) 20:05:00
>>50
書き方はどうあれ、アルゴリズム的にはバブルソートみたいだな
高々要素数が3個程度ならそれが最適だろう
下手に高級なソーティングアルゴリズムを使ったところで
要素数が少ないと逆に処理時間が増えるだけだからな
5250:2006/05/11(木) 20:11:56
書き方変ですか?独学なんでその辺教えてくれませんか?
あとバブルソートってなんですか?
53デフォルトの名無しさん:2006/05/11(木) 20:13:25
書き方は別に変ではなく、
普通はループを使って書かれるバブルソートと
アルゴリズム的に同じだけど
ループを使ってはいないというだけの話。

バブルソートに関しては、そのくらいはググれ。
54デフォルトの名無しさん:2006/05/11(木) 20:25:05
>>52
例えば他のソートアルゴリズムを3値に対して適応するとこうなる。

void sort3(int * x, int * y, int * z)
{
if (* y < * x) {
swap(x, y);
}
if (* z < * y) {
swap(y, z);
if (* y < * x) {
swap(x, y);
}
}
}
55デフォルトの名無しさん:2006/05/11(木) 20:27:13
>>51,53
ありがとうございました。
自分で考えてたんですけどループは思いつかなかったです。
自分でも書いた後にググれよなって思いました。すいません。
今回のをループ使うとどんな感じになるんですか?
一回配列に入れなおすんですか?
56デフォルトの名無しさん:2006/05/11(木) 20:34:11
まあ、配列に入れないと無理ね。
57デフォルトの名無しさん:2006/05/11(木) 20:35:04
>>54
すいません。書いた後に気付きました。
それはなんてい種類のソートアルゴリズムなんですか?
僕のとの違いは *z>*y だったときに計算量が減るってことでいいですか?
58デフォルトの名無しさん:2006/05/11(木) 20:35:44
3値のソートなら最強はこうじゃないか?

void sort3(int* x, int * y, int* z)
{
    if (*x <= *y){
        if (*y <= *z){
        } else {
            if (*x <= *z){
                swap(*y, *z);
            } else {
                swap(*x, *y);
                swap(*x, *z);
            }
        }
    } else {
        if (*x <= *z){
            swap(*x, *y);
        } else {
            if (*y <= *z){
                swap(*x, *z);
                swap(*x, *y);
            } else {
                swap(*x, *z);
            }
        }
    }
}
59デフォルトの名無しさん:2006/05/11(木) 21:01:31
>>56
やっぱりですか。ありがとうございました。
>>58
最強ってなにが最強なんですか?計算量が最も少ないって事ですか?
60デフォルトの名無しさん:2006/05/11(木) 21:05:06
実際どうなんだろうね。
>>58 は意外と >>50 より遅いかもしれん。
61デフォルトの名無しさん:2006/05/11(木) 21:06:35
条件分岐のためのjmpとかで無駄な時間掛かってそうだなw
62デフォルトの名無しさん:2006/05/11(木) 21:08:40
比較と交換の回数がいずれも理論上最小で済むって事だろ。
63デフォルトの名無しさん:2006/05/11(木) 21:11:44
でも、コードが長過ぎるのと分岐箇所が多いのが
どう響いてくるかが問題だな。
最近の CPU は色々やってるからなぁ。
64デフォルトの名無しさん:2006/05/11(木) 22:22:26
検証してみたいんですが、どうやって時間考えればいいんですか?
ifの数と交換の回数数えればいいんですか?
65デフォルトの名無しさん:2006/05/11(木) 22:23:59
実際に動かして時間を計ればいい。
66デフォルトの名無しさん:2006/05/11(木) 22:25:45
>>65
どうやって計るんですか?
ストップウォッチでは計れないくらい速くないですか?
67デフォルトの名無しさん:2006/05/11(木) 22:28:56
細かく時間を計測する関数が環境依存で用意されてるから、
ループでそれぞれ何百万回と実行させて、
2つの処理での実行時間の差を見る。
68デフォルトの名無しさん:2006/05/11(木) 22:28:59
原子時計を使って測るのが一般的。普通じゃ測れない。
69デフォルトの名無しさん:2006/05/11(木) 22:32:34
おいw
70デフォルトの名無しさん:2006/05/11(木) 22:35:05
man 1 time
71デフォルトの名無しさん:2006/05/11(木) 22:42:57
>>67
時間を計測する関数教えてもらえませんか?
main関数こんなんで良いですか?
int main(void)
{
int i,x,y,z;
for(i=0;i>1000000;i++)
{
x=1;y=2;z=3;
sort3(x,y,z);

x=1;y=3;z=2;
sort3(x,y,z);

x=2;y=1;z=3;
sort3(x,y,z);

x=2;y=3;z=1;
sort3(x,y,z);

x=3;y=1;z=2;
sort3(x,y,z);

x=3;y=2;z=1;
sort3(x,y,z);
}
return 0;
}
72デフォルトの名無しさん:2006/05/11(木) 22:44:28
>>71
環境依存だと言うとるのに
環境を言わずして答えられる筈が無い。
73デフォルトの名無しさん:2006/05/11(木) 22:45:54
>>64
実際の実行時間を知りたいなら計測すればいいけど、
比較や交換の回数を知りたいなら計算すればいい。
入力の3数が全て異なるとき、大小関係は6通りあるけど、
この6通りが等確率で現れるとすると、平均で、
>>50は比較3回、交換3/2回。
>>54は比較8/3回、交換3/2回。
>>58は比較8/3回、交換7/6回。
74デフォルトの名無しさん:2006/05/11(木) 22:48:18
でも、分岐予測だとかプリフェッチだとか
条件付き演算とか色々あるからなぁ。
本当にそれだけで高速になるのかは
ちょっと計測してみないことには
何ともいえんなぁ。
75デフォルトの名無しさん:2006/05/11(木) 22:48:37
>71
>for(i=0;i>1000000;i++)
これって……
76デフォルトの名無しさん:2006/05/11(木) 22:58:10
>>75
逆でした。すいません。
>>72
環境って何を書けばいいんですか?とりあえずコンパイルするときにでるのは
Borland C++ 5.5.1 for Win32 Copyright (c) 1993,2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997,2000 Borland
ってでます。
OSはXPです。
77デフォルトの名無しさん:2006/05/11(木) 23:02:18
>>76
なら timeGetTime っつー関数がある。
使い方はググればすぐ分かる。
78デフォルトの名無しさん:2006/05/12(金) 00:01:08
>>71
処理時間を計りたいならプロファイラ使え
79デフォルトの名無しさん:2006/05/12(金) 00:10:15
#include<stdio.h>#include <windows.h>#include<mmsystem.h>

void swap(int *x,int *y)
{
  int temp=*x;
  *x =*y;
  *y =temp;
}
void sort3(int *x,int *y,int *z)
{
  if (*y<*x) swap(x,y);
  if (*z<*y) swap(y,z);
  if (*y<*x) swap(x,y);
}
int main(void)
{
  int time,i,x,y,z;
  time=timeGetTime();
  for(i=0;i>1000000;i++)
  {
    x=1;y=2;z=3; sort3(&x,&y,&z);
    x=1;y=3;z=2; sort3(&x,&y,&z);
    x=2;y=1;z=3; sort3(&x,&y,&z);
    x=2;y=3;z=1; sort3(&x,&y,&z);
    x=3;y=1;z=2; sort3(&x,&y,&z);
    x=3;y=2;z=1; sort3(&x,&y,&z);
  }
  time=timeGetTime()-time;
  printf("%d",time);
  return 0;

1時間くらい調べた結果がコレなんですがうまくいきません。ご教授願いたいです。}
80デフォルトの名無しさん:2006/05/12(金) 00:17:38
>79
>for(i=0;i>1000000;i++)
これって……
81デフォルトの名無しさん:2006/05/12(金) 00:20:50
>>80
直してなかった…OTL
すいませんでした。
82デフォルトの名無しさん:2006/05/12(金) 00:23:25
       (  _,, -''"      ',             __.__       ____
   ハ   ( l         ',____,、      (:::} l l l ,}      /      \
   ハ   ( .',         ト───‐'      l::l ̄ ̄l     l        │
   ハ   (  .',         |              l::|二二l     |  ハ こ  .|
       ( /ィ         h         , '´ ̄ ̄ ̄`ヽ   |  ハ や │
⌒⌒⌒ヽ(⌒ヽ/ ',         l.l         ,'  r──―‐tl.   |  ハ つ │
        ̄   ',       fllJ.        { r' ー-、ノ ,r‐l    |  ! め │
            ヾ     ル'ノ |ll       ,-l l ´~~ ‐ l~`ト,.  l        |
             〉vw'レハノ   l.lll       ヽl l ',   ,_ ! ,'ノ   ヽ  ____/
             l_,,, =====、_ !'lll       .ハ. l  r'"__゙,,`l|     )ノ
          _,,ノ※※※※※`ー,,,       / lヽノ ´'ー'´ハ
       -‐'"´ ヽ※※※※※_,, -''"`''ー-、 _,へ,_', ヽ,,二,,/ .l
              ̄ ̄ ̄ ̄ ̄       `''ー-、 l      ト、へ
83デフォルトの名無しさん:2006/05/12(金) 00:38:03
main関数改造して10回の平均を出すようにしました。
これで>>50,54,58実行すれば有効なデータになりますか?
int main(void)
{
  int time,sum,i,j,x,y,z;
  sum=0;
  for(j=0;j<10;j++)
  {
    time=timeGetTime();
    for(i=0;i<1000000;i++)
    {
      x=1;y=2;z=3;
      sort3(&x,&y,&z);
      x=1;y=3;z=2;
      sort3(&x,&y,&z);
      x=2;y=1;z=3;
      sort3(&x,&y,&z);
      x=2;y=3;z=1;
      sort3(&x,&y,&z);
      x=3;y=1;z=2;
      sort3(&x,&y,&z);
      x=3;y=2;z=1;
      sort3(&x,&y,&z);
    }
    time=timeGetTime()-time;
    printf("%2d回目:%d\n",j+1,time);
    sum+=time;
  }
  printf("平 均:%d",sum/10);
  return 0;
}
84デフォルトの名無しさん:2006/05/12(金) 00:47:08
そこまでしないと差がでないんだから
一つのプログラムでその関数を何十回何百回と使うなら
淫乱しちゃったほうが楽じゃないか?
85デフォルトの名無しさん:2006/05/12(金) 00:47:18
それVC++あたりで最適化するとループ全部省かれるぞ多分
86デフォルトの名無しさん:2006/05/12(金) 00:47:50
それでいいんじゃね?
あまりにも一瞬で終わってしまうようなら、
中のループ回数を増やしてみれ。
87デフォルトの名無しさん:2006/05/12(金) 00:50:16
確かに最適化したら消えそうだな。
x, y, z を volatile にして、
volatile 消して sort に渡せばいいのか?
88デフォルトの名無しさん:2006/05/12(金) 00:54:03
>>84
淫乱ってなんですか?
>>85,87
もう少し説明をしていただけると幸いです。
>>50に書いたんですが、「入門編」をやってるんで、その程度の人間です。
>>86
わかりました。やってみます。
89デフォルトの名無しさん:2006/05/12(金) 00:59:55
ごめ、うちまちがえ
インライン
90デフォルトの名無しさん:2006/05/12(金) 01:05:16
淫乱関数
91デフォルトの名無しさん:2006/05/12(金) 01:10:51
やってみました。
>>50
平均235
>>54
平均231
>>58
平均291
でした。
ところでコマンドプロンプトからコピペってできないんですか?
>>89
インラインをググって見たんですけどC++の話ができたんですが、
Cの関数形式マクロと同じことでいいんですか?

92デフォルトの名無しさん:2006/05/12(金) 01:17:10
>>91
>コマンドプロンプトからコピペ
システムメニュー(タイトルバーで右クリック)を使うか、
コマンドプロンプトについてるツールバーを使うか。
93デフォルトの名無しさん:2006/05/12(金) 01:18:07
>インラインをググって見たんですけどC++の話ができたんですが、
>Cの関数形式マクロと同じことでいいんですか?
イエス

てか、クラス作ってそのなかで関数定義すれば、インライン宣言したものとして扱われるけどね
94デフォルトの名無しさん:2006/05/12(金) 01:20:44
同じじゃないが、やりたい事は同じだな。
マクロじゃ色々危険なこともできるから
導入されたんだろう。
95デフォルトの名無しさん:2006/05/12(金) 01:25:27
>>92
コピーの所が反転しててクリックできないんですが…
>>93
クラス?ググっても何かいてるか良く分からない…OTL
言い忘れてたんですが、C以外はやったことありません。
んでCもまだ「入門編」の途中までしか言っていない人間です。
96デフォルトの名無しさん:2006/05/12(金) 01:30:59
>>95
選択範囲ボタンを押して範囲選択、
しかる後にコピーボタンでクリップボードへコピー。
97デフォルトの名無しさん:2006/05/12(金) 01:32:36
クラスってのはC++であるんだけど
んー

形としては、
・Cの構造体に、その中で通用する変数と処理関数を持たせたもの。
・「何か」についての関数群を一つにまとめたもの。
って感じかなぁ
98デフォルトの名無しさん:2006/05/12(金) 01:32:57
>>96
できました。ありがとうございます。
>>94
危険なこと?例えばどんなことですか?

そういえば>>60の通りでしたね。
99デフォルトの名無しさん:2006/05/12(金) 01:44:44
>そういえば>>60の通りでしたね。
inline void swap(int *x,int *y) にすると違う結果になるかも。
100デフォルトの名無しさん:2006/05/12(金) 01:47:53
>>60 での勘は当たってたか。
良かった良かった。

>>98
>危険なこと
よく言われることには

#define min(a, b) ((a) < (b) ? (a) : (b))

という小さい方の値を返すマクロは、
min(++x, y) とかすると
((++x) < (y) ? (++x) : (y))
と展開されて、++x < y が正しければ
++x が二回実行されていまう。

あとは引数の型チェックもない。
インライン関数を使えばこのあたりが全部解決する。
101デフォルトの名無しさん:2006/05/12(金) 02:06:45
>>96
できました。ありがとうございます。
ということでさっきのは消えてしまったのでもっかいやってみました。
>>50       >>54      >>58
1回目:239   1回目:233   1回目:287
2回目:237   2回目:233   2回目:298
3回目:236   3回目:232   3回目:286
4回目:237   4回目:233   4回目:296
5回目:237   5回目:232   5回目:293
6回目:236   6回目:235   6回目:294
7回目:237   7回目:236   7回目:296
8回目:237   8回目:236   8回目:300
9回目:236   9回目:233   9回目:280
10回目:237  10回目:233  10回目:301
平 均:236   平 均:233  平 均:293

>>97
構造体はまだ勉強してませんので、なんとなくですが
ファイルを会社とするとクラスが部で関数が課
見たいなことですか?

>>99
エラー E2141 ensyu10-2.c 5: 宣言の構文エラー
とでてコンパイルできませんでした。

>>100
へー。分かりました。ありがとうございます。
Cでもインライン関数って使えるんですか?
10299:2006/05/12(金) 02:12:23
あれ?できなかったっけ?ファイル名の拡張子を.cから.cppに変えれば多分できると思う。
103デフォルトの名無しさん:2006/05/12(金) 02:22:34
>>102
できました。
>>50      >>54       >>58
1回目:193   1回目:189   1回目:158
2回目:191   2回目:185   2回目:157
3回目:191   3回目:187   3回目:156
4回目:191   4回目:187   4回目:156
5回目:192   5回目:185   5回目:156
6回目:191   6回目:187   6回目:155
7回目:192   7回目:186   7回目:155
8回目:190   8回目:186   8回目:158
9回目:192   9回目:187   9回目:156
10回目:191  10回目:185  10回目:156
平 均:191  平 均:186   平 均:156

だいぶ違うんですね。何でこんな違う結果になるんですか?
ていうかこんな夜中まで付き合ってくれるみなさん優しいですね。
ありがとうございます。
104デフォルトの名無しさん:2006/05/12(金) 02:31:03
分岐を用意してたからかな
たとえば、ifを何個も用意するよりswitchの方が早い。

あとif文は if ( 条件 条件 条件 ) となってる時
左から判定していくから、処理を速くしたい時は
当てはまる確率がもっとも多そうなモノから書くのが良い。

だったよな?
105デフォルトの名無しさん:2006/05/12(金) 02:50:38
>>104
分岐をしっかり用意したから>>73のように平均では
処理回数が減ったからって事ですか?
inlineをつけた時とつけなかった時は結果が違うし、
なんでこんなにちがうんですか?
106デフォルトの名無しさん:2006/05/12(金) 03:02:08
実行処理をしていく時に、一文ずつ処理を読んでいくわけだけれども。
条件判定や処理を「コレが出てきた時はこうするもの」と
あらかじめインラインを使うことでメモリに覚えさせておくことによって、
( switch も case 判定でメモリを使ってる)
その関数を読みに行ったりする処理に掛かる時間(手間)を省くことができる。

間違い有ったら指摘ヨロ
107デフォルトの名無しさん:2006/05/12(金) 03:14:21
>>106
全体的に速くなる理由はそれで納得できるんですが、
>>101>>103>>58の順位が全然違うのはなぜですか?
108デフォルトの名無しさん:2006/05/12(金) 03:15:04
>>106
関数を「読みに行く」というのは実際のどうさとはかけ離れたイメージ。
命令キャッシュの話だとすればインラインは逆効果。
初心者スレで不正確な情報を書くのは罪。
109デフォルトの名無しさん:2006/05/12(金) 03:22:10
ということで108の説明に期待する俺
110デフォルトの名無しさん:2006/05/12(金) 03:26:45
結構難しい問題だな。
111デフォルトの名無しさん:2006/05/12(金) 04:19:35
スマン。
C言語スレが落ちたけど、スレ立てられんかった。
今から新テンプレ投下するから、誰か代わりに立てて。
112デフォルトの名無しさん:2006/05/12(金) 04:20:27
タイトル:【ANSI-C】 C言語なら俺に聞け!  Part 127


このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
C言語なら俺に聞け! Part 126
http://pc8.2ch.net/test/read.cgi/tech/1145799128/l50


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/l50
C/C++の宿題を片付けます 64代目
http://pc8.2ch.net/test/read.cgi/tech/1146323457/l50
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/l50
113デフォルトの名無しさん:2006/05/12(金) 04:31:48
114デフォルトの名無しさん:2006/05/12(金) 04:32:17
>>113
サンクス。
115デフォルトの名無しさん:2006/05/12(金) 07:49:16
Windows2000でVC6.0です。
メインスレッドでグローバル領域にset、複数起動する子スレッドでgetします。
get中のset、set中のgetは排他しますが、get中のgetは許可します。
(set中のsetも許可しますがsetがメインスレッドだけなのでありえない)
こういう排他の場合、クリティカルセクション、ミューテックス、セマフォ、その他のどれを用いるのがいいのでしょうか?
ちなみにクリティカルセクションの場合は二個使うことはできません。
116デフォルトの名無しさん:2006/05/12(金) 08:29:17
>>115
対象がAtomicに取り出せるのなら排他の必要がない希ガス。
そうでないならセマフォかねぇ。
117115:2006/05/12(金) 09:01:13
グローバル領域はある構造体の配列でsetのたびにソートするので、排他が必要な気がします。
セマフォですね、ありがとうございます
118デフォルトの名無しさん:2006/05/12(金) 09:27:49
下記のようなHoge内でHogeへのポインタ群を格納するクラスを作っています
template<typename T>
class Hoge{
public:
 void setHogeList(std::list<Hoge<T>*> &hoges);
private:
 std::list<Hoge<T>*> hogeList;
};

template<typename T>
void Hoge::setHoge(std::list<Hoge<T>* &hoges){
 std::list<Hoge<T>*>::iterator it;
}
error: expected `;' before "it"

std::list<Hoge<T>*> は宣言可能なのですが ::iterator をつけるとエラーを吐きます
std::list<Hoge<int>*>::iterator などは問題ないのですが…
どこを修正すればいいのでしょうか?コンパイラはMinGW3.4.2
119デフォルトの名無しさん:2006/05/12(金) 09:33:00
typename std::list<Hoge<T>*>::iterator it;
120デフォルトの名無しさん:2006/05/12(金) 09:34:30
>>119
解決しました
ありがとうございました
121デフォルトの名無しさん:2006/05/12(金) 11:55:40
すいません、VisualStudio2005 ExpressのC++での質問なのですが
class A
{
void func(A);
};
void A::func(A a)
{
//処理
}
class B:public A
{
//処理など
};
この状況でAのfuncにBのオブジェクトを引数として渡すことって可能でしょうか?
わかる方いらっしゃいましたら教えていただけないでしょうか?
122デフォルトの名無しさん:2006/05/12(金) 12:00:23
>>121
自分で試せばわかるんじゃないか?
123デフォルトの名無しさん:2006/05/12(金) 12:05:44
>>121
class B;
class A
{
void func(B);
};
class B:public A
{
//処理など
};

void A::func(B b)
{
//処理
}
124デフォルトの名無しさん:2006/05/12(金) 12:15:29
>>123
エスパー乙。
だが「この状況で」っていうことだから、状況を変えちゃダメだろう。

>>121
まず func() を public にしないと無理っぽい。
125デフォルトの名無しさん:2006/05/12(金) 14:58:19
double *p1 = new double[2];
double *p2 = new double[2];

と配列を確保して処理をした後に

delete[] p1,p2;

と解放しようとすると、p1の指す領域は解放されるのにp2のそれは
解放されないようなのですが、C++ってこういう仕様なんですか?
どんな教科書の例を見ても、配列の動的確保はひとつしかやっていないので
上のような複数の配列の確保と解放については書かれていないんです。
126デフォルトの名無しさん:2006/05/12(金) 15:01:38
>>125
その式は以下と同等。
(delete[] p1),p2;
deleteは文でなく演算子であり、コンマ演算子と共存できる。
127デフォルトの名無しさん:2006/05/12(金) 15:03:06
delete[] p1, p2; // 構文的にこんな感じの解釈 delete[] (p1, p2)
           // p1,p2はp2と等価だからp2のみ解放じゃない?
128デフォルトの名無しさん:2006/05/12(金) 15:04:43
すばやい回答ありがとうございます!納得しました。
129デフォルトの名無しさん:2006/05/12(金) 15:06:37
いや、p1だけが解放されてp2には何も起こっていませんでした。
130デフォルトの名無しさん:2006/05/12(金) 17:33:59
>>83
>for(i=0;i<1000000;i++)
こんなことせずにTSC使えば?
13150:2006/05/12(金) 19:45:22
>>108
昨日は寝てしまいましたがご説明期待してます。
よろしくおねがいします。
132デフォルトの名無しさん:2006/05/12(金) 19:46:56
質問です。
環境依存コードは使わない方向でお願いします。

openofficeなどの表計算ソフトで作られた表ファイルを
string[縦][横] みたいな領域に格納する方法はありますか?
あるとしたら、その中で最も高速な手段は何ですか?
133デフォルトの名無しさん:2006/05/12(金) 19:47:54
age忘れ・・・
134デフォルトの名無しさん:2006/05/12(金) 19:49:33
>>132
何が言いたいのかよく分からん
自分の文章読み直してみろ

それと表計算ソフトが吐くのは基本的にCSVだから
順番に読んでいけば一行ずつ読める
135デフォルトの名無しさん:2006/05/12(金) 19:59:07
>>132
諦めるのが最も高速だよ。
136デフォルトの名無しさん:2006/05/12(金) 20:00:09
#include<stdio.h>

char *str_copy(char *d,const char *s)
{
  char *t=d;
  while(*d++ = *s++)
    ;
  return (t);
}

int main(void)
{
  char s1[128]="ABCD";
  char s2[128]="EFGH";

  printf("文字列S1:");
  scanf("%s",s1);

  str_copy(s2,s1);

  puts("s1をs2にコピーしました。");
  printf("s1=%s\n",s1);
  printf("s2=%s\n",s2);

  return 0;
}
これのreturn(t)の意味が分からないので教えてもらえませんか?
何にも使われていないように思えるんですけど…
137デフォルトの名無しさん:2006/05/12(金) 20:04:15
>>136
戻り値を捨てるのは普通の事だと思うが。
例えば、printfは出力した文字数を返すけど、そのコードでは捨てられている。
138デフォルトの名無しさん:2006/05/12(金) 20:22:52
>>137
そうなんですか。したら別にvoid型でも良いと思うのは初心者の甘い考えですか?
139デフォルトの名無しさん:2006/05/12(金) 20:24:55
>>138
その例だとvoidでも問題ないと思う。
第一引数を返すようになってるのは標準ライブラリのstrcpyを模倣したからだと思う。
strcpyがなんで第一引数を返すのかは俺も知らね。
140139:2006/05/12(金) 20:26:29
あ、もしかしたら代入式a=bがaを値として持つのを模倣したのかな?
141デフォルトの名無しさん:2006/05/12(金) 20:26:46
>>138
>>137が言っているのはstr_copy(s2,s1);のここでの使い方に関して。
文字列操作関数で出力先のポインタを返すのにはちゃんとした意味がある。
142デフォルトの名無しさん:2006/05/12(金) 20:27:13
>>134
>何が言いたいのかよく分からん

[入力]
 ・ 表ファイル (例 *.xls, *.sxc )
[出力]
 ・ 二次元配列 (例 string[10][10] graph )


>表計算ソフトが吐くのは基本的にCSVだから
>順番に読んでいけば一行ずつ読める

シート名を指定するとか、連結セルを含む表とか、関数式を読み取る際には式/値のどちらを取得するのかを選択するなど、
応用的な状況にも対応したいのです。
143デフォルトの名無しさん:2006/05/12(金) 20:29:02
俺は strcpy は正直 void でも問題ないと思う。
そんな戻り値を利用するより、
別な書き方した方が読みやすいと思う。
144デフォルトの名無しさん:2006/05/12(金) 20:31:48
SQLでいいんじゃん?
145デフォルトの名無しさん:2006/05/12(金) 20:33:59
>  while(*d++ = *s++)
がスマートな書き方だと当時最も正統な解説書に書かれている時点で
凡俗が読みやすさ云々と言っても無意味。
146デフォルトの名無しさん:2006/05/12(金) 20:36:04
たしかに、
strcpy(a, strcpy(b, c));
とか、
puts(strcpy(a, b));
とか書けるな。
読みにくいとも思わんが、これが便利な状況は限られる気がする。
147136:2006/05/12(金) 20:38:43
>>140
もう少し詳しく教えていただきたいです。
>>141
ちゃんとした意味があるんですか。
そしたらその意味を教えていただきたいんですが…
>>145
たぶん僕が書いたコードについていってると思うんですが
まったく意味が分からないのですが、説明願えますか?
148デフォルトの名無しさん:2006/05/12(金) 20:50:33
>>147
>>145はどうみても>>143に対してだろ

char *pch = strcpy(hoge, (char*)malloc(strlen(hoge)+1));
こんな楽しいこともできるな(多分)
149デフォルトの名無しさん:2006/05/12(金) 20:55:18
>>148
志村ー引数逆、逆。
つーか、malloc の戻り値チェックしろよw
150デフォルトの名無しさん:2006/05/12(金) 21:04:20
C/C++ もしくはC#のプログラミングを勉強したいと思っています。
処理系というものが、必要だと聞いたんですが、
どのように用意すればいいんでしょうか?
すれ違いかもしれませんが、お教え願いますか?
151デフォルトの名無しさん:2006/05/12(金) 21:11:24
>>147
>>>140
>もう少し詳しく教えていただきたいです。

例えばa=10という式の値は、代入後のaの値と同じになる。だから、
int a, b;
a = (b = 10); /* または単に a = b = 10; */
というコードはaとbに10を代入するし、
double a;
printf("%f", a = 10);
というコードは例えば10.000000を表示する。

strcpyが第一引数を返すのは、ちょうどこれに対応する。つまり、
strcpy(a, strcpy(b, "foo"));
はaとbに"foo"をコピーするし、
printf("%s", strcpy(a, "foo"));
はfooと出力する。
152デフォルトの名無しさん:2006/05/12(金) 21:15:40
>>150
処理系っつーのは、要するにコンパイラとかそういうもの。
Windows なら今なら Visual Studio Express Editions がいい。

https://www.microsoft.com/japan/msdn/vstudio/express/

Linux や Mac なら gcc かな。
Linux なら最初から入ってるはず。
Mac なら Develper's Tools とかいうのが OS に付いてきて、
それインストールすれば使える。
XCode っていいう開発用のツールもある。
153デフォルトの名無しさん:2006/05/12(金) 21:16:01
>>149
スマン、間違ったw

char pchTemp;
char *pch = strcpy((pchTemp=(char*)malloc(strlen(hoge)+1)?pchTemp:return -1), hoge);

動くかはしらんがこれでどうよ?w
154デフォルトの名無しさん:2006/05/12(金) 21:20:10
>>153
return は式じゃねぇw 文だw
155150:2006/05/12(金) 21:21:41
>>152 どうもありがとうございました。
156136:2006/05/12(金) 21:24:21
>>151
わかりました。ありがとうございます。
引数として出力できることで
作業が同時に行えるようになるって事ですよね?
>>148の楽しさが全く分からないのでもっと勉強します。
15799:2006/05/12(金) 21:44:42
>50
>108じゃ無いけど気になったので調べてみた。
内側のループ1回のうちswap処理は>50で9回、>58で7回行われる。
という事はinlineでswap1回分の処理時間が短縮されるなら、>58に比べ>50がより処理時間が縮むはず。
しかし実際は>58がより処理時間が縮んでいる。
つまりinlineでの時間短縮以外の要因があるという事だ。
bccが出力するアセンブラコードを確認してみたところ、>58のコードでswapが2回連続して出てくる所に違いがあるようだ。
inline無しだと2回関数が呼ばれるが、inline有りだと1.5回分ぐらいのコードになっている。
つまり>58のコードは、inline付きの場合swap処理1回分の時間が短縮されている事になる。
おそらくそれが全体の時間短縮に繋がっているんじゃないか。
実際に時間を調べた訳じゃ無いが多分これで合ってると思う。
158アマグラマ:2006/05/12(金) 22:52:57
おい、char *pch = 関数とした時点で終わってるよ、もちろんクラスオブジェクトは除いて。
引数の型が参照の時にも引数として関数入れても同じことだ。
159デフォルトの名無しさん:2006/05/12(金) 23:05:40
>>157
ありがとうございます。
ということは連続すればするほどinlineの効果が高くなるってことですよね?
inline使うデメリットってあるんですか?
160デフォルトの名無しさん:2006/05/12(金) 23:08:47
>>159
inline 関数の中身が多少大きいと、
それを全箇所に埋め込むわけだから、
実行ファイルのサイズが大きくなる。

あまり大きいと、inline 展開されない可能性もあるけどね。
161デフォルトの名無しさん:2006/05/12(金) 23:30:33
>159
>連続すればするほどinlineの効果が高くなるってことですよね?
いや、今回たまたま。
swap(x,y);とswap(x,z);が並んでいたので、swap(xの部分が共通で使えたってだけみたい。
もう1つ変数zzがあってswap(x,y);とswap(zz,z);が並んでいたら多分短縮できない。
実際、swap関数を#define swap(x,y) temp=*x;*x=*y;*y=temp;に変えてみたら遅くなった。
162デフォルトの名無しさん:2006/05/12(金) 23:33:07
なんか自分が勘違いをしていそうなのですが、わかりません。

以下のコードが、Cだと通るのですが、C++だと通りません。
AllocBuffer( &pBuffer, 20 )のところで、
コメントに書いてあるコンパイルエラーが出ます。
これってキャストとアドレス演算子をどう書けばいいのでしょうか?
VC++2005です。

#include <stdafx.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void AllocBuffer( void** pBuffer, int size )
{
*pBuffer = malloc( size );
}

int main()
{
char* pBuffer = NULL;

AllocBuffer( &pBuffer, 20 );
/*ここで
error C2664: 'AllocBuffer' : 1 番目の引数を 'char **__w64 ' から 'void **' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
*/
strcpy( pBuffer, "TEST" );
printf( "[%s]n", pBuffer );
}
163デフォルトの名無しさん:2006/05/12(金) 23:38:28
エラーメッセージの通り。キャストすればいい。
164デフォルトの名無しさん:2006/05/12(金) 23:49:15
(void**)&pBuffer
165デフォルトの名無しさん:2006/05/13(土) 00:09:09
規格的には

void* vpBuffer = NULL;

AllocBuffer(&pBuffer, 20);

char* pBuffer = (char*)vpBuffer;

の方が安全?
まあ、どうでもいいんだろうけど。
166デフォルトの名無しさん:2006/05/13(土) 00:27:22
>>163
初心者に安易に無茶なキャストを勧めるのは感心しないな。
167デフォルトの名無しさん:2006/05/13(土) 00:29:33
はいはい、頭良いのは分かったから
自分で推奨できるものを書いてからにしようね
168デフォルトの名無しさん:2006/05/13(土) 01:09:56
>>167
>>165 が最も推奨されるコードだろう。

ただ、細かい話をすれば
void** なんてものは C 的に随分怪しいものになる。
C FAQ 4.9 を参照。
169デフォルトの名無しさん:2006/05/13(土) 01:32:42
>>168
C FAQ 4.9 を読んでみました。
「参照呼び出しに使うため汎用のポインターを関数に渡す」の意味がわからなかったです。
これはどういうことがしたいんでしょう?
170デフォルトの名無しさん:2006/05/13(土) 02:11:25
多分訳が変なんだろうと思う。
char* とか int* とかの変数のアドレスを
void** に渡すのがイリーガルという話だと思う。

しかし・・・どうなんだろうな。
そいつらはともかくとして、
void* 変数のアドレスを void** に渡すことは
問題ないと思うんだが、これもダメなのか?
171デフォルトの名無しさん:2006/05/13(土) 02:19:36
>>170
いや、何も問題ないだろう。
172デフォルトの名無しさん:2006/05/13(土) 02:28:20
http://c-faq.com/ptrs/genericpp.html

>>163-164
バッサリ斬られてるな。
173デフォルトの名無しさん:2006/05/13(土) 02:33:59
>>165 でおkってことだよね?
174デフォルトの名無しさん:2006/05/13(土) 02:50:37
>>173
キャストを static_cast にすると、いっそうおk
175デフォルトの名無しさん:2006/05/13(土) 03:43:11
ヘッダを見るに C の話だし。
176デフォルトの名無しさん:2006/05/13(土) 03:47:06
>>175 >>162
> 以下のコードが、Cだと通るのですが、C++だと通りません。
177デフォルトの名無しさん:2006/05/13(土) 03:47:55
うわ、すまんこ。
178デフォルトの名無しさん:2006/05/13(土) 05:33:30
windowsのSDKの中のマクロですが構造体
のメンバへの振り分けをしてるようなのですが
なんとなくでしか理解出来ないです。
どなたか教えていただけないでしょうか

typedef struct tagPOINTS
{
SHORT x;
SHORT y;

} POINTS,

#define MAKEPOINTS(l) (*((POINTS FAR *)&(l)))

上記のMAKEPOINTS(l)というマクロでマウスの現在のx軸y軸をPOINTS構造体
に振り分けてるようなのですが、どうやって振り分けてるのかがわかりません
FAR = farポインタを使ってるので上位と下位のビットでそれぞれに振り分けてるのだろう
とおもっていますが、例えば
POINTS start
start = MAKEPOINTS(0x000f000fL) として
start.xとstart.yは共に15という数字になります。
用は(*((POINTS FAR *)&(l)))の展開のされ方がさっぱりわかりません。
マクロ関数は少しだけなら理解してるつもりですが、このような式を理解
出来るレベルじゃないので、どなたか分かられる人、ご教授願いたいです。
179デフォルトの名無しさん:2006/05/13(土) 05:51:33
>>178
演算をいっこずつ分解していけばいいんじゃないか?

long l = 0x000f000fL;
long* lp = &l;
POINTS FAR* pp = (POINTS FAR*)lp;
POINTS pt = *pp;
start = pt;

さぁ、わからないのはどこかね?
180デフォルトの名無しさん:2006/05/13(土) 09:29:36
>>178
振り分けてなんかいない。2つ並んだ16bitのshortに32bitの値をそのまま上書きしてるだけ。
181デフォルトの名無しさん:2006/05/13(土) 09:38:11
上書きもしてない。解釈し直してるだけ。

typedef union tagMAKEPOINTS_UNION {
 LONG l;
 POINTS pt;
} MAKEPOINTS_UNION;

MAKEPOINTS_UNION mkpt;
mkpt = 0x000F000FL;
start = mkpt.pt;

みたいなもん。


MAKEPOINTS(0x000f000fL) は定数のアドレス取れないから失敗するけど、
まあそれは面倒だから略して書いただけと解釈しとく。
182デフォルトの名無しさん:2006/05/13(土) 09:38:53
ミスった。

× mkpt = 0x000F000FL;
○ mkpt.l = 0x000F000FL;

ね。
183デフォルトの名無しさん:2006/05/13(土) 10:12:32
>>178
そこがFARポインタかどうかは関係ない。
sizeof (POINTS)とsizeof (LONG)やその他幾つかの整数型の大きさは同じ。
だからPOINTS型の値のビットの並びをそのまま整数型のビットの並びとして扱うことができ、
そうしてウィンドウプロシージャでは整数型として送ってくることがある。
それを元々のPOINTSのビットの並びとして使えるようにするためのマクロがMAKEPOINTS。
184デフォルトの名無しさん:2006/05/13(土) 14:24:08
FARなんて(今となっては)飾りですよ
185デフォルトの名無しさん:2006/05/13(土) 17:02:21
偉い人にはそれが分からないのです
186デフォルトの名無しさん:2006/05/13(土) 23:40:39
Cにおいて、みなさん、どのような情報をヘッダにつけますか?
私は最初#defineなどヘッダに加えてインクルードしていましたが、最近になって
特定のCのソースしか#defineをつかってないならヘッダに書くのではなくソースの中で
定義したほうが、いいのではないのか?さらに特定に関数しか使用しないのなら
関数の中で#defineを定義したほうがいいのでは、と思うようになりました。

Cでカプセル化?を意識するなら、他にどのようなことを心がければいいのでしょうか?
187デフォルトの名無しさん:2006/05/13(土) 23:53:12
>>186
インターフェースは最小限で、完全なものを目指す。それだけだ。
188デフォルトの名無しさん:2006/05/14(日) 01:56:08
>>186
#define は { } のスコープに束縛されないから、
関数の中で #define したところで、
それより下全部で有効になる。
関数の最後で #undef しる。
189178:2006/05/14(日) 08:50:50
>>179>>183さんレスありがとうございました
要は、自分の知識としてこういう事が
出来ると言うことを知らなかっただけでした
自分なりに、関数に戻してみて「あってんのか、これ?」
と思い以下のようなプログラム
#include <stdio.h>
typedef struct test{
short y;
short x;
} test;
test *Point_1(long *stack){return (test *)stack;}
int main(){
long B = 0x000f000fL;
test *g;
g = Point_1(&B);
printf("%08x\n",*g);
printf("%04x\t%04x\n",g->x, g->y);
printf("%p\t%p\n",&g->x, &g->y);
return 0;
}
で試してみたら出来ました。ただ、初めてこういう事が出来る
という事をしって、Bを0x12345678としたところ>>182さんの言う
共用体のような振る舞い(リトルエディアン)もしていて、かつC++のコンストラクタ
のようにメンバ変数をこういう形でも初期化できるのかとこれまた初めて知りました。
とにかく知識が新しく増えたのと、教えてくれた方々に感謝です。
190デフォルトの名無しさん:2006/05/14(日) 08:52:10
>>189
こんな知識を使うことが無いようにな。
191デフォルトの名無しさん:2006/05/14(日) 11:02:37
しょうもない質問かもしれないですけど
VC6のrand関数使って8ビットの乱数を取得するときって
@rand() & 0xff
Arand() >> 7
のどっちが良い乱数ですか?
192デフォルトの名無しさん:2006/05/14(日) 11:16:00
>>191変わらない
193デフォルトの名無しさん:2006/05/14(日) 12:45:02
>>191
乱数の質から言えば一般的には後者。
でもRAND_MAXを32768と決め打ちにするので、
RAND_MAXを使って除算する方法を使うほうがいいと思う。(そし最適化に期待する)
194デフォルトの名無しさん:2006/05/14(日) 13:35:03
>>193そうします、ありがとう
195デフォルトの名無しさん:2006/05/14(日) 14:50:39
>#define は { } のスコープに束縛されないから、
>関数の中で #define したところで、
>それより下全部で有効になる。
>関数の最後で #undef しる。

知らなかった・・・ありがトン
・・・で結局ヘッダには何を書くのが最良?公開すべき関数の宣言や#defineのみでしょうか?
196デフォルトの名無しさん:2006/05/14(日) 15:18:48
197デフォルトの名無しさん:2006/05/14(日) 15:32:52
>>186 の考え方でやっていけばいい。
空のヘッダで足りるなら空のままにしておくぐらいの気持ちで。
198デフォルトの名無しさん:2006/05/14(日) 15:53:28
初心者です。質問させて下さい。
キーボードからscanf関数を使って整数型と文字型の変数を
入力させようと次のようにすると、文字型変数に空白が
代入されてしまいます。
int m;
char c;
printf("m=");
scanf("%d",&m);
printf("c=");
scanf("%c",&c);
整数型のmと文字型のcの順番を逆にするとうまくゆきますが、
上の書き方だと何がいけないのでしょうか。
どなたか教えてください。
199デフォルトの名無しさん:2006/05/14(日) 16:17:40
同時にやれば?
printf("m c =");
scanf("%d %c",&m,&c);
200デフォルトの名無しさん:2006/05/14(日) 16:27:33
>>199
お返事ありがとうございます。
確かにうまくゆきますが、
198で述べた書き方だとどうしていけないのでしょうか??
201デフォルトの名無しさん:2006/05/14(日) 16:38:50
>>200
最初のscanf()を成立させるために入力した改行文字が次のscanf()で拾われるため。
これがscanf()が嫌われる理由のうちの一つ。
202デフォルトの名無しさん:2006/05/14(日) 16:41:09
先のscanf()で数値[Enter]としたら、その改行文字が残ってる
次にscanf()するとその改行文字を読み出してしまう
203デフォルトの名無しさん:2006/05/14(日) 17:07:53
>>201,>>202
お返事ありがとうございます。
大変勉強になりました。
204デフォルトの名無しさん:2006/05/14(日) 17:35:17
質問です(・ω・`
無料で使えるC++のコンパイラでお勧めなのありませんか?
205デフォルトの名無しさん:2006/05/14(日) 17:37:36
g++
これ以上のC++コンパイラはない
windowsならcygwinをインストールすると勝手に入る
206デフォルトの名無しさん:2006/05/14(日) 17:42:37
>>205
cygwinをDLすればいいんでつね(・ω・`
やってみます
ありがとうございました
207デフォルトの名無しさん:2006/05/14(日) 17:45:00
dllいらない分MinGWの方がよくね?
208デフォルトの名無しさん:2006/05/14(日) 17:51:27
operator wchar_t *() が宣言されているクラスのインスタンスが operator wchar_t *() を使って返す値を
char * にキャストしたいんだけど、クラスを書きえない場合はどう書けばいい?
209デフォルトの名無しさん:2006/05/14(日) 17:55:47
>>208
(char *)(wchar_t *)x;
(char *)x.operator wchar_t *();
210デフォルトの名無しさん:2006/05/14(日) 17:59:09
俺は40代に入ったばかりのC++使いです。
うちの会社ではインターネットショップのホームページを作る仕事をしています。
使っている言語は主にC++です。
しかし最近はC#を使うこともありますよ。
だけどVBの案件が来たらC#にしてくださいと説得しますし、
Java場合もそうですね。
ですから今のところ、私のような中年はC++/SLIを使い、
若手はC#を使うという感じでやっております。
私の会社はもともとパッケージソフトを作っていたこともあって、
中年以上の社員は基本的にC++を扱えるんですね。
ブロードバンドが盛んになってきたあたりから、
思い切って方向転換をしたんです。
日本ではC#よりもVBのほうが浸透していることは知っていますが、
あえて若手にC#をやらせているのは将来のことを考えてのことです。
C#の将来性という意味ではなくC#に関する知識の将来性といいますか、
汎用性といいますか、端的に申しますと、VBの知識はVBにしか使えないが、
C#の知識はC言語系の言語ならば、十分応用が効くということですね。
211208:2006/05/14(日) 18:07:31
>>209
ありがとうございます
212デフォルトの名無しさん:2006/05/14(日) 18:37:10
VCって無料になったんじゃなかったっけ?
213デフォルトの名無しさん:2006/05/14(日) 18:48:50
214デフォルトの名無しさん:2006/05/14(日) 18:53:10
Visual Studio Express Editionsかg++のどちらかだな
コンパイラとしてはg++の方がいいと思うが、
使いやすいのはVisual Studio Express Editionsの方かもな
215デフォルトの名無しさん:2006/05/14(日) 19:27:22
gccとは違うの?>g++
216デフォルトの名無しさん:2006/05/14(日) 19:33:47
GCC: 一連のコンパイラの集合名
gcc: GCC の C コンパイラ
g++: GCC の C++ コンパイラ
217デフォルトの名無しさん:2006/05/14(日) 19:38:24
Borland C++ Compilerも忘れないで
218デフォルトの名無しさん:2006/05/14(日) 19:45:10
BCCってなにか特長ある?
219デフォルトの名無しさん:2006/05/14(日) 19:56:15
古くて C++ 準拠率が低い。
220デフォルトの名無しさん:2006/05/14(日) 20:20:42
204デス
cygwinDLしたものの使い方が分からなかったので
Visual Studio Express Editionsを使ってみたんですが

//hello.cpp
#include <iostream>
using namespace std;
int main()
{ cout << "hello" << endl;}

という簡単なソースを入力してデバックなしで開始をしたら
コンパイルしています...
hello.cpp
c:\documents and settings\名前\my documents\visual studio 2005\projects\hello\hello\hello.cpp(17)
: fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。
'#include "stdafx.h"' をソースに追加しましたか?

というものが出てきてコンパイル出来ません(´・ω・`)
よく分からないから#include "stdafx.h"を試しに先頭に付け加えても同じ結果になります。
どうすればいいんでしょうか?


221デフォルトの名無しさん:2006/05/14(日) 20:29:11
プロジェクト最初に作った時にあった
stdafx.h と stdafx.cpp を消したんじゃね?

hello.cpp の設定
(ファイルを右クリックしてメニューの一番下・・・だったっけ?)
にあるプリコンパイル済みヘッダファイルの設定で、
プリコンパイル済みヘッダファイルを使わないようにすればいい。

このあたり面倒なら、プロジェクト作る時
空のプロジェクトを作るようにすればいい。
222デフォルトの名無しさん:2006/05/14(日) 20:33:27
>>221
dクス
仰るとおり消したのがよくなかったみたいです(・ω・´
223デフォルトの名無しさん:2006/05/14(日) 22:43:24
なぜ消す?
おもしろい奴だな。
224質問者:2006/05/15(月) 01:07:25
環境はWinXPでコンパイラはVC6を使っています。
SBufと言う構造体をつくりメンバ変数として下記を持っています。
    SBuf*    m_Buf;
これをコンストラクタで下記のように実体を作成しています。
    m_Buf    = new SBuf[10];
ソースの途中でバッファが足りなくなったので、あるメンバ関数
内で下記のように記述しましたが、たまに強制終了します。
●ソース1
void C***::***(){
    SBuf*    ipBuf;
    ipBuf    = new SBuf[20];
    memcpy(ipBuf,m_Buf,sizeof(SBuf)*10);
    delete[]    m_Buf;
    m_Buf    = ipBuf;
}
上記メンバ関数を下記のように書き直したところ、強制終了が無く
なったような気がします。
225224:2006/05/15(月) 01:09:13
●ソース2
void C***::***(){
    SBuf*    ipBuf;
    ipBuf    = new SBuf[20];
    memcpy(ipBuf,m_Buf,sizeof(SBuf)*10);
    delete[]    m_Buf;
    m_Buf    = new SBuf[20];
    memcpy(m_Buf,ipBuf,sizeof(SBuf)*10);
    delete[]    ipBuf;
}
上記の「強制終了が無くなった気がする」と言うのは、
 1.ソース1は明らかに間違っており、そこをソース2に直したので
   強制終了がなくなった可能性が高い。
 2.ソース1でも問題ないので、ソース2に直したのは全く関係が無い。
   気づかないうちに他のところを一緒に修正したのか、それとも全く
   治っていないのでその内また問題出る可能性が高い。
のどちらでしょうか?
226デフォルトの名無しさん:2006/05/15(月) 01:11:38
>>224
SBufの中身を書いてクレ
227224:2006/05/15(月) 01:15:25

勘違いを招きやすい点を一点補足します。
>>224
> SBufと言う構造体をつくりメンバ変数として下記を持っています。
> SBuf* m_Buf;

m_Bufをメンバ変数に持っているのはSBufではありません。
全く別のC***というクラスが持っています。

>>226
単純なDWORDを2個持っているだけの構造体です。
メンバ関数は持っていません。
228デフォルトの名無しさん:2006/05/15(月) 01:22:50
>>225
デバッガでどこで落ちてるのか調べたか?
少なくともソース2の修正は全く無意味だぞ
229デフォルトの名無しさん:2006/05/15(月) 01:23:42
>>224
コードいじって貼ってるだろ。そのまま貼ったほうがいいだろうねぇ。

std::vector 使うと、解決しちゃうかもね。
230デフォルトの名無しさん:2006/05/15(月) 01:25:24
>>224
そのコードで気になる点を。
SBufを20個確保し、先頭10個に以前のデータを代入、ここまではいい。

ただ、残り後半の10個は未初期化のままだが、いいのか?
コンストラクタで明示的に初期化しない限り、0初期化は保証されてないぞ。
その値を別の場所で使おうとして落ちてたりはしないか?
231デフォルトの名無しさん:2006/05/15(月) 01:37:46
>>229
大元のソースはかなりでかいので、気になる点を単純化して
貼りました。

>>230
その後また代入して使いますのでこれは問題ないと思います。

>>228
> 少なくともソース2の修正は全く無意味だぞ
私の求める答えは現時点ではこれで十分です。
ソース2に修正したらとりあえず出なくなったので、「これが原因だっ
たのかなぁ?」と疑問に思ったので質問させていただきました。
根本原因がソース2に無い時点で、見直さなければならないことが
たくさんあるりますので、その辺をもう少し見直してまた追って報告
します。
232デフォルトの名無しさん:2006/05/15(月) 01:41:41
>>231
単純化したコードで問題が再現することは確かめたか?
233デフォルトの名無しさん:2006/05/15(月) 01:54:44
というかデバッガあるんだから、どこで落ちてるか確かめればいいのに
234デフォルトの名無しさん:2006/05/15(月) 06:41:50
>>233
だからここで確かようとしてるんだろ
デバッガ=ここの回答者
235デフォルトの名無しさん:2006/05/15(月) 17:56:02
配列をmemset() で初期化するとき、char型やshort型の配列に対応出来るよう
memset(array, 1, sizeof(array));
で初期化したのですが、short型で初期化した場合、
257 で初期化されてしまいます。
どうすれば1で初期化できるでしょうか?
レベルの低い質問ですみません。
236デフォルトの名無しさん:2006/05/15(月) 19:19:14
>>235
素直にforで回して1を代入
237デフォルトの名無しさん:2006/05/15(月) 19:52:29
C++ならstd::fillやstd::fill_n。
238デフォルトの名無しさん:2006/05/16(火) 16:37:48
>>236>>237
ありがとうございます
239デフォルトの名無しさん:2006/05/17(水) 10:08:52
C++のRVOについての質問です。
簡単な2次元座標を表す構造体
struct Point { int x,y; };
を計算して返す関数 GetPoint を作成する時、

Point GetPoint() {
  Point p;
  // p.x, p.yを計算するための処理
  return p;
}

と書くよりも、(PODにするのを止めて)Pointにx,yを引数に取るコンストラクタを定義し

Point GetPoint() {
  int x, y;
  // x, yに座標を計算
  return Point(x, y);
}

と書いた方が、テンポラリオブジェクトの作成を一段階減らすことができると考えてよいのでしょうか?
また、そうすべきなのでしょうか?
240デフォルトの名無しさん:2006/05/17(水) 10:26:38
GetPointがそう複雑な処理でなくてinline関数ならどう書いてあっても似たような結果になると思うが。
241デフォルトの名無しさん:2006/05/17(水) 12:06:40
>>239
リターン直後にスコープから外れてる気がするけど
242デフォルトの名無しさん:2006/05/17(水) 12:07:33
あっ、ごめんなんでもない。
実体返しだったか。
243デフォルトの名無しさん:2006/05/17(水) 18:08:30
>239
RVOなんて略語を使わずに戻り値最適化と日本語で書いて欲しい。

アセンブラコードを見るのが手っ取り早いのでは。

>240
勝手に条件を限定するのは良くないだろ。
244デフォルトの名無しさん:2006/05/17(水) 18:53:53
RVOは割と「よく通る」略語で、遠慮する必要の無い物だと俺は思うです。
245デフォルトの名無しさん:2006/05/17(水) 19:15:20
どっちも戻り値最適化できると思うわけだが。
246デフォルトの名無しさん:2006/05/17(水) 19:43:00
コンパイラがどうするか、はこの際おいといて、
規格上RVOが適用されるのは後者だろうな。
247デフォルトの名無しさん:2006/05/17(水) 19:57:00
VC++2005EE

main.cとsub.c、test.hをつくります。
test.hでグローバル変数を宣言すると1 つ以上の複数回定義されているシンボルが見つかりました。
となってしまいます・・。test.hをどう直せば?
#pragma once
void outString(void);

#ifndef TEST_H_
int Hensu = 0;
#else
extern int Hensu;
#define TEST_H_
#endif
248デフォルトの名無しさん:2006/05/17(水) 20:00:55
((main.cとsub.cからtest.hをインクルード))
249デフォルトの名無しさん:2006/05/17(水) 20:17:49
>>247
まず勘違いしてるようだけど、#defineで定義した定数・マクロは
翻訳単位(つまり各ソースファイル)をまたいで有効にはならない。

main.cでtest.hをincludeしてTEST_H_がdefineされても、
sub.cでtest.hをincludeした時には、それはdefineされていないことになっている。
だからmain.c、sub.cでそれぞれint Hensu=0;が定義されてしまい、多重定義エラー。

通常は、ヘッダファイルには
extern int Hensu;
だけ書いておき、ソースファイルのどこか(どれでもいいが、わかりやすいところ)に
int Hensu = 0;
を定義する。
250デフォルトの名無しさん:2006/05/17(水) 22:41:40
質問があるのでお願いします。

VisualStudioSpokeでc++のプログラムを作っています。
ダイアログプロシージャを使ったのですが、ダイアログプロシージャの部分で
以下のようなエラーメッセージがでて悩んでいます。
ソースは本の通り打ち込みました。

ws.cpp(141) : error C2447: '{' : 対応する関数ヘッダーがありません。旧形式の仮引
数リストの可能性があります。

コマンドラインは以下のとおりです。
rc ws.rc
cl /GX ws.cpp user32.lib gdi32.lib ws.res

何が原因か教えてください。お願いします
251デフォルトの名無しさん:2006/05/17(水) 22:47:17
>250
あいにくエスパーでないのでその本とやらの内容がわかりません
252デフォルトの名無しさん:2006/05/17(水) 22:51:55
おおかた{}の数があってないんじゃね
253デフォルトの名無しさん:2006/05/17(水) 22:52:23
}の閉じ忘れとかな
254250:2006/05/17(水) 23:08:10
>>251 252 253様 有難うございました。
どうやら、プロシージャの後に;をつけていたためエラーがでていたようです

255デフォルトの名無しさん:2006/05/17(水) 23:19:30
return に付いての質問です。以下、

#include <stdio.h>

int main( ) {
  printf("Hello World\n");
  return 0;
}


で、最後にreturn 0; って付いてるのはなんででつか?


256デフォルトの名無しさん:2006/05/17(水) 23:21:50
>>255
main関数はintを返すように決められているから
0は一般的には正常終了の意味
257デフォルトの名無しさん:2006/05/17(水) 23:37:26
どうも(^^)
でも、普通 プログラムだとfalseが0じゃなかたですっけ?

上記のmain関数は、()に0がリターンされるってことでおkでつか?
・・・なんでmainにintつけてるの・・・
258デフォルトの名無しさん:2006/05/17(水) 23:39:48
> falseが0
確かにfalseは0という値と互換性があるし、falseの代わりに0を使うことはあるけれど
0の代わりにfalseを使えるわけじゃない

> ()に0がリターンされる
意味が分からない

> なんでmainにint
そう決まっているから
259デフォルトの名無しさん:2006/05/18(木) 00:20:22
>>257
たしかにbool型を返す関数では成功したらtrueを返し、失敗したらfalseを返すのが当然けど、
mainが返す型はintであって、0の意味は>>256

このようにintか何か整数型を返し、しかも0が成功の意味とすることもそれなりにある。
こうすると、失敗時には0以外の値が全て使えるので、それを使って何か意味のあるエラー値を返すことができ、
ただ失敗したということ以上の情報を伝えることができる。

C++の中で完結するなら例外処理を使うほうがスマートになることが多いだろうけど。
260デフォルトの名無しさん:2006/05/18(木) 00:33:50
#include <stdlib.h>
EXIT_SUCCESS
EXIT_FAILURE
261デフォルトの名無しさん:2006/05/18(木) 00:35:08
もっともらしく説明するとmainの返り値はエラー情報であって、成功=エラーがないときに0になるってことだ。
262デフォルトの名無しさん:2006/05/18(木) 01:05:13
char input[100];
略〜
bin[i]=(int)input[i]-(int)('0');
略〜

という記述についてなんですが、型を()で囲んで記述するのをはじめて見ました。
これはchar型のinputという配列をint型に変換しているってことなんでしょうか?
さらに、(int)('0')というのを引いていますがこれは、何をしているのでしょか?
263デフォルトの名無しさん:2006/05/18(木) 01:11:49
>>262
(int) はキャスト。 '0' は文字リテラル。入門書なり入門サイトなりにもうちょっと目を通せ。

ただ、そのコードにあるキャストは、あってもなくても動作は変わらない。
264デフォルトの名無しさん:2006/05/18(木) 01:17:59
>>263
ヒント:char が unsigned のこともある
265デフォルトの名無しさん:2006/05/18(木) 01:23:15
>>264
いや、関係ないから。
266デフォルトの名無しさん:2006/05/18(木) 01:24:53
>>265
まあ、'0' の方のキャストだけならそうだけども。
267デフォルトの名無しさん:2006/05/18(木) 01:25:43
>>266
ちがう。ほんとに関係ないから。
http://portable-c.jugem.jp/?eid=6
268デフォルトの名無しさん:2006/05/18(木) 01:41:47
いくつかの文字コードでは、
'9' - '0' == 9
というように数字の文字から'0'を引くことで数値に変換できる。
まあ、あまり行儀のいいやりかたではないが。
269262:2006/05/18(木) 01:46:15
いろいろ検索しましたが、
キャストなどの意味はわかりましたが、
やっぱりなぜ(int)('0')を引いていかがわかりません。
270デフォルトの名無しさん:2006/05/18(木) 01:47:03
>>269
それはここで聞いてもわからない。コード書いたやつに聞け。
271262:2006/05/18(木) 01:48:47
>>268
すみません、新着レスを見ていませんでした。なるほど!

数字の文字というのは、アスキーコードの数字の文字を、
数値に変換してるってことなんですか・・?
272デフォルトの名無しさん:2006/05/18(木) 01:50:06
switch文で60<80まで見たいな比較はできないんですか?
273デフォルトの名無しさん:2006/05/18(木) 01:51:26
>>272
全部並べないとできない。 if で書いたほうがマシ。
274デフォルトの名無しさん:2006/05/18(木) 01:53:39
すみません、質問です。
構造体って、同時に変数宣言を2つ以上出来ますか??
たとえば、type型の構造体をn1とn2二つ宣言したいとして、
struct type n1,n2 ;
はOKでしょうか??

275デフォルトの名無しさん:2006/05/18(木) 01:55:41
OK
276274:2006/05/18(木) 01:58:51
>>275
どうもありがとうございます!
277デフォルトの名無しさん:2006/05/18(木) 02:01:39
>>267
C++ だと文字リテラルは char 型。
C とも C++ とも言ってない以上、
C++ の可能性も考慮する必要がある。
278デフォルトの名無しさん:2006/05/18(木) 02:03:04
>>277
そうじゃなくて、式中に出てくるcharやshortは全てintに丸められるから
キャストしてもしなくても関係ないって話だろ?
279デフォルトの名無しさん:2006/05/18(木) 02:08:09
>>278
やっと分かった。
なるほど。そういう風になってんのか。
280デフォルトの名無しさん:2006/05/18(木) 02:38:46
>60<80まで見たいな比較

関数を作れ
switch(pos(min,max)){
case 1:
 ...

 
281デフォルトの名無しさん:2006/05/18(木) 08:06:43
C言語って割り算の余りを求める%の場合、
負の数と正の数の割り算は負の数の余りが出てきちゃうけど

たとえば-5%3→-2って出るけど
普通の数学のように-5%3で1を出せるようにできないの?
282デフォルトの名無しさん:2006/05/18(木) 08:36:55
>>281
実は、C99以前のCでは環境依存だったりする。
まぁ、素直に自前で計算しとけってこった。
283デフォルトの名無しさん:2006/05/18(木) 10:12:41
>>282
標準ライブラリの div() なら決まってたりする?
284デフォルトの名無しさん:2006/05/18(木) 12:39:35
普通の数学だと1が余るの?
やべーマジでわからん。。
中学からやりなおすべき?
285デフォルトの名無しさん:2006/05/18(木) 12:59:28
x, y(y>0)が与えられたとき、
x = y * q + r
かつ
0 <= r < y
かつ
qは整数
を満たすq, rがただ一組存在するが、これをそれぞれxをyで割ったときの商、余りと呼ぶ。
この定義を使うと、-5割る3は-2余り1
286デフォルトの名無しさん:2006/05/18(木) 13:38:00
>>285
-5=3*-2+1
ということか、なるほどなー。
あ、なんかかすかに思い出した。
287デフォルトの名無しさん:2006/05/18(木) 13:58:47
ネットで調べてみたのですが、
期待する動作が得られず原因がどうしても判りません。。

Windows98、VC++ 6.0で、
Win32APIを利用してGUIアプリケーションを作っています。

Windowのタイトルバーにてマウスの左ボタンが
離された時に動作する機能を実現したいと想っています。

そこで、WM_NCLBUTTONUPメッセージが送られた時に
メッセージボックスを表示させるプログラムを書いてみたのですが、
全画面表示になっている時以外は期待する動作はせずに、
Wクリックをしなくてはメッセージボックスが表示されませんでした。
以下の様にしてみたのですが、どこが悪いのでしょうか。

どうかご教授ください。。

LRESULT CALLBACK FrameProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;

case WM_NCLBUTTONUP:
MessageBox(hWnd, "TEST!!", "debug", MB_OK);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
288デフォルトの名無しさん:2006/05/18(木) 15:05:18
教えてください。
ネットで入門的なところを見ながらやってるんですが
xのy乗を計算をしたくてpow関数を作っています。

#include<stdio.h>
#include<math.h>

int main(void)
{
char temp[256];
double x, y;

printf(" x ? ");
gets(temp);
x = atof(temp);

printf(" y ? ");
gets(temp);
y = atof(temp);

printf(" %f ^ % f = %f \n", x, y, pow(x,y));
}
で間違ってるところありますか?
intとかに変えたりもしてみたんですが
何度やっても最後のところが
0.00000 ^ 0.00000 = 1.000000ってなってしまうんです…
何がなんだか分らないです…
289デフォルトの名無しさん:2006/05/18(木) 15:12:27
>>288
仕様どおりの動作だが?
290デフォルトの名無しさん:2006/05/18(木) 15:42:42 BE:46584746-#
>>288
>0.00000 ^ 0.00000 = 1.000000ってなってしまうんです…

何か問題あるのか?
291デフォルトの名無しさん:2006/05/18(木) 15:44:58
>>288
自分も入門だから役に立たないかもしれないけど
その作ってるpow関数は?
あと0乗って1じゃなかったっけ?
292デフォルトの名無しさん:2006/05/18(木) 15:52:21
>>287
とりあえずspy++でメッセージ来てるか確認した?
293デフォルトの名無しさん:2006/05/18(木) 15:56:23
>>287
ttp://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputmessages/wm_nclbuttonup.asp
>If a window has captured the mouse, this message is not posted.

DefWindowProcはWM_NCLBUTTONDOWNでSetCaptureしているのだろう。多分。
294デフォルトの名無しさん:2006/05/18(木) 16:02:14
#include <stdlib.h> 無いからじゃね?
295288:2006/05/18(木) 16:03:27
>>289

すいません解決しました
#include<stdlib.h>
が足りなかったみたいです

>>290

何の数字を入れてもそうなってたんです。
#include<stdlib.h>
を入れたら解決しました。
296デフォルトの名無しさん:2006/05/18(木) 16:04:22
>>294

そうです。そうだったんですよ。
ありがとうございます。
297デフォルトの名無しさん:2006/05/18(木) 16:12:04
なんでstdlibの有無で動作が変わるんだろう…
馬鹿な俺にも分かるように解説キボン
298デフォルトの名無しさん:2006/05/18(木) 16:16:22 BE:93168386-#
>>297
・atdlib.hにはatofの宣言が書かれている
・宣言のない関数の戻り値はintと推定する
299デフォルトの名無しさん:2006/05/18(木) 16:18:08
>>298
完全に理解しますた。
トンクス。
なるほど…
300デフォルトの名無しさん:2006/05/18(木) 16:30:52
C++ならコンパイルエラーで終わりだが、Cは宣言のない関数が呼べちまうからな
301デフォルトの名無しさん:2006/05/18(木) 16:35:54
>291
数学的には0の0乗は不定。
C言語的にはpow(0, 0)は(double型の)1を返す。

FreeBSD上でpow(3)を引くと

>The function pow(x, 0) returns x**0 = 1 for all x including x = 0,
>infinity (not found on a VAX), and NaN (the reserved operand on a VAX).
302デフォルトの名無しさん:2006/05/18(木) 19:09:39
>>249
できた!!
ありがとうございます
303デフォルトの名無しさん:2006/05/18(木) 20:34:22
>>268
しかし標準C/C++では'0'〜'9'の文字コードがそのように連続しているので、そんなことをしてもよい。
たしかに行儀はあまりよくないかもしれないけど。
304デフォルトの名無しさん:2006/05/18(木) 20:34:56
プラットホームに依存すると指摘を受けましたのでこちらにきました

質問ですがC言語でfstatシステムコールを用いて
ファイルのサイズとか種類とか調べるにはどうしたらいいんですか?
調べてもでてこないのですが・・・
305デフォルトの名無しさん:2006/05/18(木) 20:42:46
306デフォルトの名無しさん:2006/05/18(木) 22:01:31
>>303
> 標準C/C++では'0'〜'9'の文字コードがそのように連続している
そんなこと決まってないだろ。
307デフォルトの名無しさん:2006/05/18(木) 22:08:49
あるソースで、

unsigned long aaa = NULL;
としてありました。

しかし、ITRONではNULLは
#define NULL (void *)0
で定義されていました。
そのため、そのソースでITRON.Hをインクルードする前に
#define NULL 0
としてました。

また、他のソースでは
unsigned short bbb = (short)NULL;
としてキャストして使用してました。

普通このようにNULLって使うものですか?
私はNULLはポインタなどの初期化に使うものだと思っており
変数は普通に0で初期化するものだと思っていましたが・・・
308デフォルトの名無しさん:2006/05/18(木) 22:13:56
>>307
そんな使い方しない。しちゃいけない。
↓ここ全部読んどけ。
http://www.kouno.jp/home/c_faq/c5.html
309デフォルトの名無しさん:2006/05/18(木) 22:17:44
T(int) って型変換を定義してあって、
関数 f( T t ) を f( 5 ) ってした場合、
型変換T(int)で一時オブジェクトができて、
それからコピーコンストラクタが呼ばれるのか?
それとも型変換T(int)のみで仮引数が構築されるのか?

誰か教えてくんろ
310デフォルトの名無しさん:2006/05/18(木) 22:33:17
>>309
T t = 5; の形で初期化したときと同じように初期化される。
意味上は一時オブジェクトを生成してコピーコンストラクタを使うことになるが、
この一時オブジェクトの生成は省略することが許されている。
311304:2006/05/18(木) 22:34:36
すみません・・・
int fstat(int filedes, struct stat *buf);
ってどうやって使うんですか・・・・
312デフォルトの名無しさん:2006/05/18(木) 22:42:06
>>311
まず自分でどう書いてどうなったのか言ってみろ。
313デフォルトの名無しさん:2006/05/18(木) 23:30:51
>>311
man 2 fstat
314デフォルトの名無しさん:2006/05/18(木) 23:47:13
>306
決まっている
315デフォルトの名無しさん:2006/05/19(金) 00:08:03
>>314
規格のどこか、示せる?
316デフォルトの名無しさん:2006/05/19(金) 00:11:06
>>315 atoiの中身がどうなってると思ってるんだ?
317デフォルトの名無しさん:2006/05/19(金) 00:15:09
>>315
ISO C++ 2.2.3 より
> In both the source and execution basic character sets, the value of each character
> after 0 in the above list of decimal digits shall be one greater than the value of the previous.

>>316
それは関係ない。
318デフォルトの名無しさん:2006/05/19(金) 00:20:18
>>268ができないならatoiがどうやってると思ってるんだ?
319デフォルトの名無しさん:2006/05/19(金) 00:27:31
>>318
最悪 switch でも実装できるだろ?

C++ では 2003 年の改訂で追加されたみたい。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#173
320デフォルトの名無しさん:2006/05/19(金) 00:31:17
switch以外にもメモリーコスト度外視してテーブル参照などなど。
線形時間で返そうとおもえば返せる。
321デフォルトの名無しさん:2006/05/19(金) 00:40:28
>>317,319
ありがとう。勉強になった。
322デフォルトの名無しさん:2006/05/19(金) 01:21:59
数字の文字コードが繋がってる事が
言語仕様で決まってるってのを知らないのは
まあ無理も無い話。
結構マニアックだもんな。
323デフォルトの名無しさん:2006/05/19(金) 02:14:19
アルファベットについての記述は無いの?
10進変換の c - '0' は規格に沿っていて、
16進変換の c - 'A' + 10 は規格外ってことか。
中途半端だな。
324デフォルトの名無しさん:2006/05/19(金) 02:45:05
2次方程式の解の個数について作ってるんですが、
虚数解を持つ時、「異なる2つの虚数解を持つ」
と表示させたいのですが、変な値とともに↑が表示されます。
ソース載せたので赤ペン先生してください。

#include <stdio.h>
#include <math.h>
int main(void)
{
float n1,n2,n3,n4,D;
puts(" a*x*x + b*x +c =0 を満たす 実数解xの値。");
printf("a ?:");scanf("%f" ,&n1);
printf("b ?:");scanf("%f" ,&n2);
printf("c ?:");scanf("%f" ,&n3);
n4 = (n2*n2 - 4*n1*n3 );
D = sqrt(n4);
if (n4 > 0 && n4 < 0)
printf("x =%.2f です。", (-n2 + D) / (2 * n1) );
else if (n4 > 0 )
printf("x= %.2f です。", (-n2 + D)/(2 * n1) );
printf("x= %.2f です。", (-n2 - D)/(2 * n1) );
if (n4 < 0)
printf("2つの異なる虚数解を持つ。");
getchar();
return(0);
}
325デフォルトの名無しさん:2006/05/19(金) 02:57:11
>>324
if文の有効範囲に誤解があるな。
if (・・・)
  printf("hoge");
326デフォルトの名無しさん:2006/05/19(金) 02:58:29
途中送信.・゚・(ノД`)・゚・。

if (・・・)
  printf("hoge");
  printf("sage");



if (・・・) {
  printf("hoge");
}
printf("sage");

と同じこと。n4 > 0の場合についての箇所を見直すのと、
if (n4 < 0)もelse ifにするべきでは。
というかヘタに省略せず、面倒でも最初は{}を書くようにした方がいいと思うが
327デフォルトの名無しさん:2006/05/19(金) 03:01:06
>>324
> if (n4 > 0 && n4 < 0)
これは・・・
328デフォルトの名無しさん:2006/05/19(金) 03:06:20
実行例: (環境win2k+BCC5.5)
a*x*x + b*x +c =0 を満たす 実数解xの値。
a ?:1
b ?:1
c ?:1

sqrt: DOMAIN error                    ←(1)
x= +NAN です。2つの異なる虚数解を持つ。     ←(2)

虚数解を持つ時はもちろんn4の結果は負となる。
xが負の時sqrt(x)はエラーを引き起こす。(1)はそのエラー出力。
この処理系では返り値がNaNになるので、D、そしてそれとの演算結果もNaNとなり、(2)のように表示される。

あとif(n4 > 0 && n4 < 0)の条件式がトンチキなので見直すべし
多分重解を表示させたいんだろうから(n4 == 0)だろうけど
それと>325も言ってるがif文の有効範囲ね
329デフォルトの名無しさん:2006/05/19(金) 04:31:12
C言語でHTTPクライアント作ってるのですが、
Accept-Encoding: gzip を付けたときに返って来たデータを
解凍する方法が分かりません。
どうすればデータを解凍できますか?
windows xpと、BorlandC++Compiler 5.5のコンパイラを使ってます。
330デフォルトの名無しさん:2006/05/19(金) 05:10:47
zlib使え
331デフォルトの名無しさん:2006/05/19(金) 05:12:42
>>323
実際に EBCDIC だとアルファベットは連続してない。
http://www.pleasuresky.co.jp/images/ebcdic.gif
まあ、A-F は繋がってるけど。
332デフォルトの名無しさん:2006/05/19(金) 05:16:20
a-f の方は分断されてるな。
333デフォルトの名無しさん:2006/05/19(金) 05:59:04
>>292
spy++の存在忘れていました・・・(汗
次からまず試してみます。。

>>293
>>If a window has captured the mouse, this message is not posted.
キャプチャされてるとメッセージ送られないんですね。。。
他の手段で実現することを考えてみます。。 ありがとう御座いました(><;
334デフォルトの名無しさん:2006/05/19(金) 09:58:35
>>329
学習目的でないならWinInet使ってしまえ。
335デフォルトの名無しさん:2006/05/19(金) 16:25:34
>>334
どうもです。
WinInetを調べてみます。
336デフォルトの名無しさん:2006/05/19(金) 19:21:21
ネットで調べながら表示可能文字を調べてるんですが、
どんだけ試してみても
unknown escape sequenceになってしまうんですどこかおかしいでしょうか?

#include<stdio.h>
#include<ctype.h>

int main(void)
{
char t;

while(1){
printf("一文字入力してみΣ(・Д・ノ)ノ アウッ  ");
t = getchar();

fflush(stdin);

if( t == EOF)
break;

if(isprint(t))
puts("入力された文字は表示できる");
else
puts("入力された文字は表示できね");
}
}

ちなみに行数は18と20を指しています。
337デフォルトの名無しさん:2006/05/19(金) 19:25:50
表示の「表」の字が文字コードの関係でエスケープシーケンスと被ってるからな
日本語対応に弱いコンパイラだとエラーが出るから
表示の表の字の後に\マークを入れると幸せになれるかも。
338デフォルトの名無しさん:2006/05/19(金) 19:35:04
>>337
ありがとうございます。
すごく幸せになりました!!!!!
今使ってるコンパイラは日本語対応に弱いんですね(;´∀`)
339デフォルトの名無しさん:2006/05/19(金) 19:39:02
コンパイラは何を使ってるの?
340デフォルトの名無しさん:2006/05/19(金) 19:43:17
ある目的のプログラムを2つのモジュールに分けて作成したんですが、
いざ繋げるときにどうやってやったらいいのかわかりません・・。
優しい方教えてください。
環境はVC++.net、MFC、ダイアログベースで作りました。
341デフォルトの名無しさん:2006/05/19(金) 20:02:07
>>339
コンパイラは…Cygwinなんですが…弱いですか?

後、gccを通そうとすると
/usr/lib/gcc-lib/i686-pc-cygwin/3.2/../../../../i686-pc-cygwin/ld:
cannot open output file a.exe:
Permission denied collect2: ld returned 1 exit status

ってエラーメッセージが出るんですが
このメッセージって調べてみたんですが位置がおかしい
ってことですよね?
別に変なところはいじってないつもりなんですが…
いきなりこんな風になることってありますか?
342デフォルトの名無しさん:2006/05/19(金) 20:09:01
>>341
Cygwinのgccは日本語通そうとするとよくミスるな
だから俺はどうしても日本語通す必要がある場合にはICCかVC++のコマンドラインコンパイラ使うことにしてる

ldってリンカだっけ?collect2ってののアクセス権がおかしいのかな
それはgccスレで聞いた方がより的確なアドバイスが貰えるんじゃないかと思う
343デフォルトの名無しさん:2006/05/19(金) 20:12:25
>>342
ご丁寧にありがとうございます。
gccのスレに行って聞いて見ます

そうなんですか…やっぱり弱いんですね
本当は変えたいんですが
C自体を始めたばかりなのと
本とネットので調べてやってるだけなのでいきなり変わると
全く出来なくなりそうで怖かったり(;゚д゚)
344デフォルトの名無しさん:2006/05/19(金) 21:07:41
gcc --input-charset=cp932 --exec-charset=cp932
をaliasしとけばいいのではない?
345デフォルトの名無しさん:2006/05/19(金) 21:21:23
>>344
ありがとうございます。
一応、インストールしなおしたら解決しました。
すいません。報告が遅れました。

ただ、根本的な解決ではなかったので
もし同じような症状が出たらやってみます。
346デフォルトの名無しさん:2006/05/19(金) 22:29:26
すごく初歩的なことをお聞きしたいのですが、

標準ライブラリってあるけど、あれってファイルアクセスだとか
メモリアクセスとかって最終的にはOSのAPIを呼び出すことになりますよね?

そのAPIを呼び出す部分は環境依存になってしまうと思うのですが、
その部分って、.libファイル?とかにまとめられてて、
リンカが環境に応じてリンクさせるので、
標準ライブラリのソース自体には環境依存性はないよ
・・・という考えで良いですか??
347デフォルトの名無しさん:2006/05/19(金) 22:32:52
>>346
× 標準ライブラリのソース自体には環境依存性はないよ
○ 標準ライブラリを使ったソース自体には環境依存性はないよ
348デフォルトの名無しさん:2006/05/19(金) 22:34:15
そりゃ標準ライブラリを実装する側は環境依存になる。
あくまで標準ライブラリを使う側が環境依存でなくなるというだけ。
349デフォルトの名無しさん:2006/05/19(金) 22:46:07
配列を動的に増やすにはどうすればいいの?
クラスで設計しようと思ったんだけど、うまくいかない。
元の配列を一時配列(サイズは元の配列+1)にコピーして、一時的に元の配列を消して新しく元の配列+1の配列を用意する。
この時点で、一時配列の一番後ろの所に新要素を入れて、新しい配列を作ってそこに全部コピーして最後に一時配列を削除するっていう手順を踏んだけど、
どうしても、配列のサイズが巨大になる(templateで巨大なクラスを指定したり)と相当処理が重くなる気がする。
一時配列を使わないでサイズを大きくする方法があったら教えて。
350デフォルトの名無しさん:2006/05/19(金) 22:47:45
普通にstd::vector使えばいいやん
351デフォルトの名無しさん:2006/05/19(金) 22:54:55
>>350
それを言うなw
352デフォルトの名無しさん:2006/05/19(金) 22:56:37
つーか、テンポラリの配列なんぞ作らんでも新しい配列作ってそこに元配列のデータ+新しいデータコピーして、
元配列削除したあとで元配列を保持していたポインタに新しい配列つっこめば終わるわけだが。

頻繁にサイズ拡大が起こるようならあらかじめ配列のサイズに余裕を持たせておくといい。

というようなことを勝手にやってくれるのがstd::vectorなわけだが。
場合によってはstd::dequeのようなチャンク型配列が有効な場合もある。
353デフォルトの名無しさん:2006/05/19(金) 22:58:46
質問なんですが
ファイルに"001,jpg"; と書いてある場合で

char *mojiretu;
char st[256];
fscanf(fp,"%s",st);
mojiretu = strtok( st, ";" );

と書いていますが、mojiretuの中身は""001,jpg""と前と後ろに " が
よけいに付いてしまいます。
mojiretuが"001.jpg"となるようにするには、どうすればいいですか?
354デフォルトの名無しさん:2006/05/19(金) 22:58:51
>>349
+1サイズの新規バッファにコピー>元の配列を解放>配列を格納してるポインタに新規バッファのポインタをコピーでコピー一回で済むぞ。
それと頻繁にサイズ変更するならバッファが足りなくなった時に大きめにバッファ確保すればコピーする回数は大きく減らせる。


でも俺ならstd::vector使うけど。
355デフォルトの名無しさん:2006/05/19(金) 23:01:07
>>353
mojiretu の中身はどうやって確認してる?
356デフォルトの名無しさん:2006/05/19(金) 23:03:07
>>347-348
サンクスです。
あー、なるほど。
てっきり標準ライブラリって共通のソースと
コンパイラベンダー提供の環境依存部分のソースに
分かれてるんだと思ってました。

実際には全部コンパイラベンダーさんが
がんがって作ってくれてるんですね。
357353:2006/05/19(金) 23:08:24
>>355
直後にブレークポイント設置して確認してます
mojiretu="001.jpg"
をした時は"001.jpg"となります
358デフォルトの名無しさん:2006/05/19(金) 23:13:36
int* start;
最初にstartに現在の配列を括り付けといて、新しい配列(長さは+1)を作ってその一番後ろにデータを付ける。
古い方の配列を消して、startに新しい配列を括り付けるという手順でおk?
確かに1つ配列な長くなる度に配列を解放してたら時間が掛かるなぁ...
359デフォルトの名無しさん:2006/05/19(金) 23:27:38
>>357
デバッガの表示が "" を追加してるだけじゃない?
puts(mojiretu) してみ。
360デフォルトの名無しさん:2006/05/19(金) 23:28:52
>>358
いや、重いのはメモリの解放じゃなくて配列のコピーだろ。
361デフォルトの名無しさん:2006/05/19(金) 23:57:23
最近分かったんだが、
複雑なファイルを読み込み検証したい場合fscanfだと役不足だったんだな
今はもうどんな複雑やつだろうと整理出来るから
すきなだけ楽しめる
よくあるRPGの戦闘部分再現させて楽しんでる
音声画像ないけど
362デフォルトの名無しさん:2006/05/19(金) 23:57:48
>>360
確かに、コピーですたorz
ポインタへのポインタでnewで確保したところにドンドン配列を括り付けていけないか?
363デフォルトの名無しさん:2006/05/20(土) 00:00:08
>>361
役不足の使い方が間違ってる
364デフォルトの名無しさん:2006/05/20(土) 00:06:05
K´
「アンタじゃ役不足だせ…」
これでどうだッ!
365デフォルトの名無しさん:2006/05/20(土) 00:07:57
>>362
リスト構造のことか?(「括り付ける」とかいう俺様表現やめれ)
366デフォルトの名無しさん:2006/05/20(土) 02:36:18
ついこないだまでvectorがリスト構造だと思ってますた (><)
367デフォルトの名無しさん:2006/05/20(土) 11:30:51
C言語に特化したスレってありませんか?
やっぱりCとC++って似てそうで異なる言語だからね。
私じゃスレを立てることができないので・・・すみません。
368デフォルトの名無しさん:2006/05/20(土) 11:32:20
【ANSI-C】 C言語なら俺に聞け!  Part 127
http://pc8.2ch.net/test/read.cgi/tech/1147375815/l50

これじゃ不満か?
369デフォルトの名無しさん:2006/05/20(土) 11:44:20
あのスレはやめとけ。育ちが悪いやつらが多すぎる。
370デフォルトの名無しさん:2006/05/20(土) 11:51:47
>>13
確かに、言葉でわかるより体で感じるタイプもいるからな。
ss[i]じゃダメなんだと体で覚えるわけか、先が大変そうだな
371デフォルトの名無しさん:2006/05/20(土) 14:18:56
ほんと初歩ともいえない質問すみません。
stlrenを使わずに文字配列で後ろから文字を出力する方法ってどうやるのですか?
372デフォルトの名無しさん:2006/05/20(土) 14:29:39
>>371
なんで使っちゃいけないのか知らんが
自分で先頭から順に '\0' を探して、そこから逆順に1文字ずつ出力
373デフォルトの名無しさん:2006/05/20(土) 14:32:08
うしろからって逆順で出力するのか?
374デフォルトの名無しさん:2006/05/20(土) 14:58:04
レス遅れました逆順で出力します
>>372さんの言ったようにヌル(ナル)までインクリメントしてその後
デクリメントを利用して配列を0まで出力しようとしてもなぜか成功しないので
今もいろいろ試行錯誤してます
375デフォルトの名無しさん:2006/05/20(土) 14:58:42
>>374
まあがんばれ
376デフォルトの名無しさん:2006/05/20(土) 15:34:46
試行錯誤してたらできるようになりました
すれ汚しごめんなさい
377デフォルトの名無しさん:2006/05/21(日) 00:23:22
int ********p ;

っていう変数をみました。
理解できないわけではないのですが、こういうのは仕様が悪いのですか?
378デフォルトの名無しさん:2006/05/21(日) 00:28:52
>>377
書いたやつの頭が悪い。
379デフォルトの名無しさん:2006/05/21(日) 00:31:54
>>377
ひょっとして数値計算関連のプログラム?
380デフォルトの名無しさん:2006/05/21(日) 00:37:10
まぁ最長一致について学べる機会という事で
381デフォルトの名無しさん:2006/05/21(日) 00:38:03
>>379
その通りです。
382デフォルトの名無しさん:2006/05/21(日) 00:43:20
まあ、
(*********************************puts)("Hello, world.");
が通るのに比べたらまだまだ。
383デフォルトの名無しさん:2006/05/21(日) 00:47:33
関数ポインタなんて*付け放題ですよ
384デフォルトの名無しさん:2006/05/21(日) 01:06:18
>>381
数値計算なら、まあありうるかもしれない。
ポインタテーブルでメモリを圧迫しないなら、
各要素へのアクセスの可読性が高いから
そうする手もアリだとは思う。

ただ、全要素を一列に並べて(int *p; で扱う)、
8つのインデックスから位置を計算してアクセス、
っつー方がメモリの無駄が少ないかもしれない。
「かもしれない」ってのは、うまい位置の計算法がなければ、
無駄なメモリを確保する必要があるかもしれないから。

折衷案として、int **p; として、
4インデックスごとにまとめるとか、
そういう事やった方が便利な事もあるかもしれない。
このあたりは好きにして。
385デフォルトの名無しさん:2006/05/21(日) 19:03:36
inline関数について質問です

クラス本体内で宣言されたメンバ関数は暗黙
にinline化されると本に書いてありましたが
どういうことが行われるのかイメージが湧きません
簡単なサンプルコードを示してもらえないでしょうか?
386デフォルトの名無しさん:2006/05/21(日) 19:07:59
>>385
クラス本体外で inline つけて定義したのと同じことになるってこと。
サンプルコードなんか要らない。
387デフォルトの名無しさん:2006/05/21(日) 19:13:41
>>385
サンプルを提示するのは簡単だが、それをコンパイラがどうコンパイルするかは別の問題。
どうしても違いを見たいなら、
#include <cstdio>
#include <cstdlib>
class Foo {
foo() {std::exit(1);}
};

int main()
{
Foo foo;
return 0;
}
これを最適化の指定とアセンブリ出力の指定をつけてコンパイルして、最適化しない場合と較べてみればいい。
388デフォルトの名無しさん:2006/05/21(日) 21:13:36
>>385
class Hoge
{
  void f() {/* 〜 */}
};
上は下のように書かれたものとして扱われるという決まりになっている。
class Hoge
{
  void f();
};
inline void Hoge::f() {/* 〜 */}
389デフォルトの名無しさん:2006/05/21(日) 22:36:56
演算子の定義の効率的な使い方の例を教えてください。
390デフォルトの名無しさん:2006/05/21(日) 22:42:34
>>389
std::complex
boost::quaternion
boost::octonion
391デフォルトの名無しさん:2006/05/21(日) 23:03:33
std::string
コンテナ全般


boost::spirit
#こっちはs/効率/変態/ か?
392389:2006/05/21(日) 23:21:44
>>391
!!!!!!
こりゃ便利だ!数字operator数字しか思いつかなかった…
マジ感謝
393デフォルトの名無しさん:2006/05/21(日) 23:48:01
VisualStudio.NET(スレ違い?)でC++をコーディングしておりますが
自分の環境で充分テストしてから本番機に投入したところ
いざ稼動させたらランタイムエラー(ハンドルできない例外)が発生し…
ソースを見てもなぜに例外が出るのかわからず(とうてい出るとは思えない箇所)・・・
そして、しょうがないので全く同じソースを再度コンパイルしなおしたのですが…
するとランタイムエラーは出なくなった。

絶望した!!
C++の難しさに、奥深さに、意味解らなさに、、、絶望したァッッッ!!
こんなことって、あるのだろうか。。。orz
394デフォルトの名無しさん:2006/05/21(日) 23:56:11
395デフォルトの名無しさん:2006/05/22(月) 00:03:04
template <typename T>
 typedef void (*FP_SELECT_F)(T);

みたいなことができたらいいなあ。
396デフォルトの名無しさん:2006/05/22(月) 00:23:16
>>395 貴様、誤爆だな。
397デフォルトの名無しさん:2006/05/22(月) 00:26:09
ビットフィールドに関して教えてください。
32bitのビットフィールドを以下の様に定義しました。

struct dword
{
unsigned bit0 : 1;
  ↓
unsigned bit31 : 1;
};

この状態でsizeof(dword)は4バイトになります。
このdwordを配列としてdword aaa[256]として定義した場合、
aaaはメモリ上に連続した空間として確保されるのでしょうか?

ポインタ参照でaaaにアクセスした時に大丈夫なのか考えています。
398デフォルトの名無しさん:2006/05/22(月) 00:29:46
>>397
その質問にビットフィールドがどう関係しているのか、わからない。
399デフォルトの名無しさん:2006/05/22(月) 00:46:09
確保されるかは、実行してみて確かめればいい
400デフォルトの名無しさん:2006/05/22(月) 01:18:23
>>396
今気づいたw
誤爆です。はい。
401デフォルトの名無しさん:2006/05/22(月) 17:50:24
Win32アプリケーションの例外についてなのですが、
{char t[10]; strncpy(t, "test", -1);}
というコードを実行した場合の例外は、どうやってハンドリングすればいいのでしょうか?

------------------------------------
try
{
{char t[10]; strncpy(t, "test", -1);}
}
catch(...){
MessageBox(NULL, "error", NULL, MB_OK);
}
------------------------------------
__try
{
{char t[10]; strncpy(t, "test", -1);}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
MessageBox(NULL, "error", NULL, MB_OK);
}
------------------------------------
などを試してみたのですが、
ハンドリングされない例外が発生したと言われ終了してしまいます。
http://msdn.microsoft.com/library/ja/jpdndeepc/htm/deep03162000.asp?frame=true
をそのまま使って_set_se_translatorも試してみたのですが、上手くいきませんでした。

例外処理について勉強してる最中なので
見当違いなことをしてるのかもしれませんが、ご教授下さい。
402デフォルトの名無しさん:2006/05/22(月) 19:41:12
>>401
「__try __except EXCEPTION_ACCESS_VIOLATION」でぐぐるとたくさん例が出てくるお。
403デフォルトの名無しさん:2006/05/22(月) 19:45:30
というか、
char t[10]; strncpy(t, "test", -1);
でなんら例外が発生しないんだから、別の場所で例外で出てるんでは。
404デフォルトの名無しさん:2006/05/22(月) 21:41:26
>>403
仮にsizeof(int)が4、負数を2の補数表現で表すの環境の場合、
配列tの先頭から0xFFFFFFFFバイトの領域に書き込みしようとするが、
それでもアクセス違反にならないと?

# 例外が発生するかしないかは環境依存なのかもしれないが。
405デフォルトの名無しさん:2006/05/22(月) 21:57:46
>>404
この場合、strncpy()が書き込むのは5バイト(test\0)ですよ。t[10]で
じゅうぶん足りてます。


406デフォルトの名無しさん:2006/05/22(月) 22:15:32
aまたはAがいくつ含まれているか表示するプログラム(入力は最大80文字まで)を作ったんですが、よくわからなくなりました。
#include<stdio.h>

int main(void){

char a[81];

int i,n;
n=0;

gets(a);

while(i<81){

if(a[i]=='a')
n++;
if(a[i]=='A')
n++;
if(a[i]=='0')
break;
}
これ間違ってますか??お願いします。
407デフォルトの名無しさん:2006/05/22(月) 22:25:58
>>405
strncpy()は、コピー元が指定バイトに満たない場合、コピー先の残りを'\0'で埋める。
408デフォルトの名無しさん:2006/05/22(月) 22:26:21
>>406
・iに初期値がセットされていない
・iが進んでない
・a[i]=='0'じゃなくてa[i]=='\0'またはa[i]==0だと思われ

whileよりはforでまわしたほうがわかりやすいかもね。
409デフォルトの名無しさん:2006/05/22(月) 22:29:47
質問です。
関数ポインタを要求されているところに、クラスのメンバ関数を渡すことはできないでしょうか?

DialogBox(hInstance, "IDD_DIALOG", NULL, pHoge->procMainDlg);

というようなイメージなのですが…。
静的メンバ関数じゃないとダメでしょうか?
410デフォルトの名無しさん:2006/05/22(月) 22:29:52
80までだったら
i<=80
の方が分かりやすくね?
411405:2006/05/22(月) 22:30:49
>>407
あ、ほんまや。こりゃ失礼しました。
412デフォルトの名無しさん:2006/05/22(月) 22:32:26
メンバ関数ってのはこっそりthisポインタ渡してる

413デフォルトの名無しさん:2006/05/22(月) 22:33:05
>>409
クラスのメンバ関数には、暗黙的にthisポインタがついている。
そのため、静的でないと指定出来ない。
414デフォルトの名無しさん:2006/05/22(月) 22:33:53
>>408さん
ありがとうございます!
iを進めるのはどう書いたらいいのですか?
(初歩的なこと聞いてすみません。。)
>>410さん
確かにそうですね、ありがとうございます。
415デフォルトの名無しさん:2006/05/22(月) 22:37:31
>>412
となるとここでは静的メソッドか、通常の関数を用意するしかないですね。
ありがとうございました。
416デフォルトの名無しさん:2006/05/22(月) 22:49:04
>>415
DialogBoxParamと、SetProp或いはSetWindowLongPtrを組み合わせるなどしてがんばれば、
最終的にメンバ関数でも(それどこかどんな関数オブジェクトでも)コールバックされるようにすることはできる。
417デフォルトの名無しさん:2006/05/22(月) 22:49:26
>>401
tがstrncpy後にアクセスされることなくスコープ外れて消滅するからstrncpy呼び出しを含めたブロック全体が最適化で端折られてたりせんか
418401:2006/05/22(月) 23:21:05
レスありがとうございます。

>>402
__except()で、GetExceptionCode()の値と
EXCEPTION_ACCESS_VIOLATIONを比較するという感じでしょうか。
試してみたのですが、上手くいきませんでした。

__except(EXCEPTION_EXECUTE_HANDLER)でもハンドリングできない
ということは__exceptにすらきてないということなのかな・・・。

>>417
デバッグビルドしているので、たぶん最適化はされてないと思います。
tの宣言をtryの上に持っていってみたのですが、同じでした。

>>403
うちの環境が原因なんですかね・・・。
サービスパックを一つも当ててないVS 6.0で試していたので、
SP6を当ててからまた試してみようと思います。
419デフォルトの名無しさん:2006/05/22(月) 23:59:56
そもそもVC++6.0のstrncpyって標準準拠してんのか?
420デフォルトの名無しさん:2006/05/23(火) 10:59:04
LinuxでTCP/IPでのソケット通信プログラムを書いているのですが、
connect()にタイムアウトを設定するにはconnectで使うファイルディスクリプタを
fcntl()でノンブロッキングにしてselect()に渡せばよいと聞いたのですが、うまくいきません
問題としては
select()でタイムアウトを20秒に設定したのに待っている様子は無い
connect()で正しく送信出来ている場合にも「現在進行中の作業です」とエラーが出る
write()も同じくエラーが出る
です。
connect()にタイムアウトを設定する方法を御存じの方がいらっしゃいましたらよろしくお願いします
421デフォルトの名無しさん:2006/05/23(火) 11:13:03
C++だと、普通に

class A1{ ... } ;

って書くだけで

A1 var1 ;

とか宣言で(classを前に付けずとも)使えると思うのですが、良く

typedef class B1{ ... } B2 ;

などという宣言を見かけます。structについても、デフォルトがpublicになる
以外はclassと同じだと思うのですが、もっとたくさんのtypedefがヘッダー
ファイルなどに書いてあります。

クラスや構造体の名前を、さらにtypedefするのって、どういう意味がある
のでしょうか。もしかして、何か根本的なところで勘違いしているのでしょうか ?
422405:2006/05/23(火) 11:18:56
>>421
C++だとまるで意味がないかと。自分は、ただclassをtypedefするコー
ドなんて見たことない。

423デフォルトの名無しさん:2006/05/23(火) 11:46:40
VC6.0でCのプログラム作ってます。
main関数の引数で渡された文字列argvをサブルーチンや他スレッドのルーチンで使おうとしています。
グローバルなchar*に入れて保持しようと思うのですが、
memcpyやmallocしなくてもただの代入で大丈夫ですよね?
試してみた限りでは大丈夫そうだったんですが。
424デフォルトの名無しさん:2006/05/23(火) 11:49:53
>>423
大丈夫です。
425デフォルトの名無しさん:2006/05/23(火) 12:10:16
>>423
変更する場合は注意が必要
426デフォルトの名無しさん:2006/05/23(火) 16:29:58
現在、C++のプログラミングをvisual C++で製作しています
struct VECTOR2{
double x;
double y;
}
この構造体をプログラム全体で共用したいのですが、
どのように宣言すればよろしいのでしょうか?
common.hなるものをつくってそこで構造体を宣言して
使用するクラスでヘッダを読み込んでいたのですが、
error C2011: 'VECTOR2' : 'struct' で示される型としてすでに定義されています。
と表示されます。どうしてそうなるのかが分かりません。
よろしくお願いします。
427デフォルトの名無しさん:2006/05/23(火) 16:32:14
>>426
二回includeされているんジャマイカ?
# includeされるファイル内のincludeにも注意!
428デフォルトの名無しさん:2006/05/23(火) 16:33:08
>>426
VCならcommon.hの先頭に#pragma once
429デフォルトの名無しさん:2006/05/23(火) 16:58:38
>>428
解決しました。
ヘッダファイルはどこでもここでも読ませたらいけないんですね。
ヘッダの中で同じヘッダを読み込むと問題が起こるとはじめて知りました。
#pragma once 使えますね。
ただ、他の環境だと使えないかもしれないから、
今のうちによい方法をみつけないと・・。
430デフォルトの名無しさん:2006/05/23(火) 17:00:37
>>429
インクルードガードでググれ
431デフォルトの名無しさん:2006/05/23(火) 17:08:57
borlandインストールして、
環境変数の設定でpathに数値を追加しようとしたのですが、誤って元の数値を消してしまいました・・・
どうすればいいんでしょうか・・・?
432デフォルトの名無しさん:2006/05/23(火) 17:29:34
適用押さなければおk
433431:2006/05/23(火) 21:02:03
それが・・・
既に適用は押してしまっていて・・・
これ、「>bcc32」ってコマンドプロンプトから略せ無くなる以外にも不具合出てきますよね?
434デフォルトの名無しさん:2006/05/23(火) 21:10:30
それって変えたのユーザ環境変数? システム環境変数?
435デフォルトの名無しさん:2006/05/23(火) 21:20:35
MSVC++ on Win2k でのエラーに関する質問です、

Invalid Address specified to RtlFreeHeap( 2a70000, 2c8f990 )

以下のエラーメッセージにおける括弧内の二つの引数はなにを
表しているんでしょうか?
436431:2006/05/23(火) 21:33:59
>>434
多分システム環境変数だと思います・・・
437デフォルトの名無しさん:2006/05/23(火) 21:42:38
我が仕様書は我流、我流は無形、ゆえに誰にも読めぬ。
438デフォルトの名無しさん:2006/05/23(火) 21:47:50
C++で質問です。
テキストファイルの文字列の配列をユーザーの入力した順番に出力したいのですが
まず全て読み込んでしまう途中に
while(全て読み込むまでおわらない){
他の配列[i] = 文字配列;
i++;
}
としたのですが
'char *'型は'char'型に変換できないというエラーがでました。
なんとか変換する方法はないでしょうか。
配列を配列に変換する為にはなにが必要ですか?
439デフォルトの名無しさん:2006/05/23(火) 21:51:23
>>438
strcpy()でコピーできるが、std::string使えばいいじゃん。
440デフォルトの名無しさん:2006/05/23(火) 21:52:10
>>438
ソース書いたほうがいいよ。char * と char は別物だし、どういう風に実行させたいのかも
いまいち分からないので、間違いを指摘しづらい。
441435:2006/05/23(火) 21:55:45
書き忘れましたけど、 VC++ 6.0 です。sp は当ててます。
442デフォルトの名無しさん:2006/05/23(火) 22:15:29
>>438
> なにが必要ですか?

問題を整理する頭
443デフォルトの名無しさん:2006/05/23(火) 22:23:09
全然C++じゃないな。
ただのCだ。
444デフォルトの名無しさん:2006/05/23(火) 22:31:57
標準の文字列操作関数も知らん馬鹿が=で代入しようとしてるんだろ。
445デフォルトの名無しさん:2006/05/23(火) 22:43:51
>>435
それらの値の詳しい意味は自分も知らんのだけど、
free()に変なアドレス渡したり、free()に正しい値を渡してるけどヒー
プオーバーフローとかしてない?
446デフォルトの名無しさん:2006/05/23(火) 23:01:30
>>444
それだ!
charで文字として読み込んだ数字をintの数字としてあとの計算で使いたいんだ。
charをintに変換するのはどうするのよ?
大学1年生でもわかるよう説明してもらえるとありがたいです。。。
447435:2006/05/23(火) 23:06:59
>>445
ヒープオーバーフローって言うのは、割り当てられたヒープメモリの長さ以上に
長いデータを書き込んでいるって言うことでしょうか。

今、スクリプト言語の拡張ライブラリを書いてるんですけど
ガベージコレクタが回収したメモリを開放しているせいなのかもなぁとかおもいつつも
原因が絞り込めなくて難儀しております。

free()に渡される直前には、データ自体は壊れていない模様なので、
ヒープブロックが破壊されてるってことでデバッグ進めるべきですかねぇ。
448デフォルトの名無しさん:2006/05/23(火) 23:07:24
Cなんですが、

 #include <math.h>
 #include <stdio.h>

 int main(void)
 {
  printf("%d", sqrt(25));
  return(0);
 }

出力結果は「0」…何が悪いんでしょうか。
449デフォルトの名無しさん:2006/05/23(火) 23:12:56
>>448 頭じゃない?
450448:2006/05/23(火) 23:14:01
自己解決しました。お騒がせしました。
451デフォルトの名無しさん:2006/05/23(火) 23:18:39
448みたいにたまにいるけど、リターンに括弧つけてるのはなんで?
カッコつけてるとか駄洒落はかんべん。
452デフォルトの名無しさん:2006/05/23(火) 23:22:00
かっこつけてる。
453デフォルトの名無しさん:2006/05/23(火) 23:24:30
NetBSD上でserialの入出力プログラムを作っています。
ブロッキングでopen()すると、openから返ってこないので、
ノンブロッキングのプログラムにしています。
送信はできるのですが、受信がまったくできません。
write(hSerial, "test start!\r\n", 14);
で出力して、teratermに表示されます。

read_cnt = read(hSerial, (void *)&cTmp, 1);
で受信すると返り値は-1でperrorすると"Resource temporarily unavailable"が返ってきて
errnoは0x23です。

キーを押しつづけて入力しつづけているのですが、上記エラーで受信できません。
何がいけないのでしょうか?
また、ソースも全部晒した方がよいでしょうか?
454デフォルトの名無しさん:2006/05/23(火) 23:28:08
>>451
昔は括弧を付けないといけなかったらしい。
455デフォルトの名無しさん:2006/05/23(火) 23:59:31
環境VC++6.0です。

typedef struct {
  int a;
  int b[];
} STR_TEST;

int _tmain(int argc, _TCHAR* argv[])
{
  STR_TEST foo = { 0, {1,2,3} };
  printf("STR_TEST -> %d\n" , sizeof(STR_TEST));
  printf("foo -> %d\n" , sizeof foo);

  return 0;
}

上記のように書くと、2つともサイズが4でしたが、残りはどこに・・・?
456デフォルトの名無しさん:2006/05/24(水) 00:00:49
>>455
最後の要素数を省略するのはそういう使い方のためではないと思う。
457デフォルトの名無しさん:2006/05/24(水) 00:00:52
環境VC++6.0です。

typedef struct {
  int a;
  int b[];
} STR_TEST;

int _tmain(int argc, _TCHAR* argv[])
{
  STR_TEST foo = { 0, {1,2,3} };
  printf("STR_TEST -> %d\n" , sizeof(STR_TEST));
  printf("foo -> %d\n" , sizeof foo);

  return 0;
}

上記のように書くと、2つともサイズが4でしたが、残りはどこに・・・?
458デフォルトの名無しさん:2006/05/24(水) 00:03:40
>>455
sizeof は型の情報だけでサイズを求める。
実行時に何かするわけじゃない。
459457:2006/05/24(水) 00:05:36
>>456
連続投稿スマソ。なんかPOST拒否られたので書かれていないとオモタ。

例えば、組込みなんかでROMに書き出したときにどうなるのか
考えていたんだけど、良くわからなくなってきた。

文法的に間違っている?
460457:2006/05/24(水) 00:10:10
>>458
STR_TEST foo1 = { 0, {1,2} };
STR_TEST foo2 = { 0, {1,2,3,4} };

こう書いても配列はsizeofから無視される訳か・・・。
ROM領域に取られるときに、順に12バイト、20バイトで
取られれば問題は無いんだけど・・・。
461453:2006/05/24(水) 00:11:02
送信可能で受信不可な問題は解決しました。
ケーブルを変えてみたら動きました。
ブロッキングの問題はそのままです。
462デフォルトの名無しさん:2006/05/24(水) 00:16:15
>>460
ROM領域なぞ関係ない。
根本が間違ってる。
463デフォルトの名無しさん:2006/05/24(水) 00:23:01
そもそもSTR_TEST foo = { 0, {1,2,3} };と書けることが驚き。
動的にメモリ確保するなどしないと駄目かと思っていた。
464457:2006/05/24(水) 00:24:00
>>462
いや、問題はROM領域だったりするので、大いに関係あったり(汗
すいません。

実行時にサイズを取得する必要は無くて、>>460の例だとfoo1から
連続領域に12バイト格納されていれば解決なんですけど。
465デフォルトの名無しさん:2006/05/24(水) 00:27:13
>>464
だから、そういう次元の問題じゃない。
根本の解釈が間違ってる。
466デフォルトの名無しさん:2006/05/24(水) 00:27:19
ちなみに >>455 はgccではエラー。

error: non-static initialization of a flexible array member
error: (near initialization for `foo')

staticにすれば通るけどね。
467457:2006/05/24(水) 00:27:40
>>463
VC6.0だと警告無く通ります。VC7以上だと警告でます。

ただ、作るときには商用の組込み系のコンパイラを使うので
そもそもこの書き方が許されるかも知りたいところ。
468457:2006/05/24(水) 00:30:34
>>465
すんません、他の問題は把握できてないです・・・。
どういう解釈だと筋通りますか?
469デフォルトの名無しさん:2006/05/24(水) 00:31:33
>>467
とても組み込み系をやっている/やろうとしている人の書く内容じゃないな。
辞めた方がいいんじゃないか?
470457:2006/05/24(水) 00:32:41
>>466
thanx!

実際の使用方法もstatic使用なので問題無いです。今の所は・・・。
471デフォルトの名無しさん:2006/05/24(水) 00:34:07
構造体の中のサイズなし配列は、C99より前では違反、C99から合法。
初期化方法については資料が手元にないので知らん。
472デフォルトの名無しさん:2006/05/24(水) 00:36:15
>>467
なら環境VC6とか言うなよ。

>>470
const も付けないと ROM に行かないよ。
473457:2006/05/24(水) 00:36:57
>>471
やっと解決しました。C99からだったのですね。
通るコンパイラと通らないコンパイラがあって必死で資料探っていたところです。

どうもスレ汚ししました。
474457:2006/05/24(水) 00:38:31
>>472
ゴメンス
VCだとRAMに確保されてしまいますね。
475デフォルトの名無しさん:2006/05/24(水) 00:42:35
>>472,474
普通はセクションを分ける。
476デフォルトの名無しさん:2006/05/24(水) 00:45:11
>>474
そもそもVCはパソコン用のコンパイラだから、ROM/RAMと言うこと自体がナンセンス。
477457:2006/05/24(水) 00:51:33
>>475
是非そうしたいのですが・・・。

>>476
シミュレートはVCでやる規則なんで・・・。
焼き付けた後に不具合出すとヤバイから。
478デフォルトの名無しさん:2006/05/24(水) 00:51:37
static付けても実行結果変わらないんだけど457はそれでいいのかな。
479デフォルトの名無しさん:2006/05/24(水) 00:54:28
>>477
やっぱり辞めた方がいいよ。
480457:2006/05/24(水) 00:55:11
>>478
ノー問題です。ありがとう。
481デフォルトの名無しさん:2006/05/24(水) 00:59:14
>>480
シミュレーション後、コンパイルエラーが多発したり、
結局、思った通りに動かなくて途方に暮れるに100Kペリカ。
482457:2006/05/24(水) 01:02:59
>>481
もう途方に暮れているから問題ないよ・・・。
そもそも既存のソースだから、誰も触れないし。

あなたに100Kペリカ
483デフォルトの名無しさん:2006/05/24(水) 01:07:49
>>475
組み込み向けを想定してるコンパイラなら const でセクションが分かれる。
自分で分ける必要はあんまり無い。
484デフォルトの名無しさん:2006/05/24(水) 09:22:57
>>461
クロスケーブル使っているのならケーブルによってはハードウェアハンドシェイクが使えないので要注意。
どっちみち相手側とハンドシェイク手段があっていないと伝送はできない。
詳しくは制御系スレで聞いた方がよさそう。
485デフォルトの名無しさん:2006/05/24(水) 12:26:54
printfみたいに書式設定して、その結果を画面じゃなくて戻り値か何かで変数に代入できる関数ってなんだっけ。
486デフォルトの名無しさん:2006/05/24(水) 12:52:12
>>485 snprintf
487デフォルトの名無しさん:2006/05/24(水) 12:55:05
>>486
thx
488デフォルトの名無しさん:2006/05/24(水) 13:41:35
だからsnprintfは使うなと何度(ry
489デフォルトの名無しさん:2006/05/24(水) 13:53:27
これか。
http://www.linux.or.jp/JF/JFdocs/Secure-Programs-HOWTO/dangers-c.html

環境依存おkなこのスレ的には
asprintf とか _scprintf→sprintf とかが解か?
490485:2006/05/24(水) 14:41:14
wsprintfはどうなの?
491デフォルトの名無しさん:2006/05/24(水) 16:40:38
modf関数を使った簡単なソースなんですけどmain側のcout文だと
勝手に整数部が10倍されます。なぜなんでしょう、教えて下さい。
#include <iostream>
#include <cmath>

using namespace std;

double cmath_modf_Int(double &dData)
{
double intptr, decimal;
decimal = modf(dData, &intptr);
cout << intptr <<'\n';
return intptr;
}
double cmath_modf_dble(double &dData)
{
double intptr, decimal;
decimal = modf(dData, &intptr);
return decimal;
}
int main()
{

double x;
cin >> x;

cout << cmath_modf_Int(x) ;
cout << cmath_modf_dble(x) << '\n';

return 0;
}
492デフォルトの名無しさん:2006/05/24(水) 16:45:42
long 型であることを明示するのに 0L とか書いたりするけど、
short型であるのを明示するためのサフィックスってあるんでしょうか?
493デフォルトの名無しさん:2006/05/24(水) 16:58:30
どちらかと言うとショートヘアよりロングヘアがタイプです。
0Lっていうのはポニーテールの事だと思うから、ショートなら0で良いんぢゃない?
494デフォルトの名無しさん:2006/05/24(水) 17:14:05
>>492
無い。必要ならキャストで代用しろ。
495デフォルトの名無しさん:2006/05/24(水) 17:22:35
環境:Visual Studio 2005

int WINAPI
WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
MSG msg;
HWND hWnd;

hWnd = InitWindow(hInstance);

if( hWnd = NULL){
return 0;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}

error C2731: 'WinMain' : 関数はオーバーロードできません
↑こういうエラーが出てるのですが原因が分かりません。
あと他の関数は書くと長くなるので省きました。
原因分かる方は教えてください、お願いします。
496デフォルトの名無しさん:2006/05/24(水) 17:36:14
>>493
(笑)
497デフォルトの名無しさん:2006/05/24(水) 17:46:43
>>492
shortには「(short)0」ぐらいしか書きようがないのだけど、
int16_tなら、「INT16_C(0)」ってのが標準にあります。
498デフォルトの名無しさん:2006/05/24(水) 17:56:11
>>491
先ず出力順を追ってみよう。
1)cmath_modf_Int()内の出力
2)main()の一回目の出力
3)main()の二回目の出力

これらはそれぞれ、入力したxの
1)整数部(を取り出した値)と改行文字
2)整数部(を取り出した値)
3)小数部(を取り出した値)と改行文字
である。

つまり、仮に1.2を入力した場合
1)1\n
2)1
3)0.2\n
が出力される。
これは見かけ上、
1
10.2
のように見えるわけだ。
499デフォルトの名無しさん:2006/05/24(水) 18:48:18
>>495
プロジェクトの設定がMFCアプリとかコンソールアプリになってんだろ。
500デフォルトの名無しさん:2006/05/24(水) 19:05:00
>>499
確認したらちゃんとWin32プロジェクトでした。
それと.NET 2003にコピペしてビルドしたら
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 _WinMainCRTStartup で参照されました。
↑こんな感じになりました
501デフォルトの名無しさん:2006/05/24(水) 19:08:23
「プロジェクトの設定」の意味が判っていないに一票。
502デフォルトの名無しさん:2006/05/24(水) 19:13:08
プロジェクトって初め新規作成で選ぶ奴じゃないんですか?
良く分からないです_| ̄|○
503デフォルトの名無しさん:2006/05/24(水) 19:56:59
>>492
無い。というより、汎整数拡張のせいで意味が無い。

汎整数拡張
http://portable-c.jugem.jp/?eid=6#comments
504デフォルトの名無しさん:2006/05/24(水) 20:11:58
>>495
解決法はいくつかある。
1.
#include <tchar.h>
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int);

2.
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);

3.
int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int);
505495:2006/05/24(水) 20:29:45
>>504
3番をやってみたところビルド成功しました。
実行はちょっと変でしたがビルドが通ったので後は何とかします。
ウインドウクラスネームとウインドウのタイトルの配列をLPWSTRで
キャストしてたんでそれが原因なのかな?
とにかく、どうもありがとうございました。
506デフォルトの名無しさん:2006/05/24(水) 20:35:12
>>503
整数の昇格が行われない文脈もあるから(特にC++)、意味がないってのは言い過ぎだろ。
どっちかというと、どうせintの範囲に収まるんだからintリテラルをキャストすれば十分、ってのが理由だと思う。
507デフォルトの名無しさん:2006/05/24(水) 20:42:49
>>505
504はどちらかというと後の方ほどお勧めできない。
508デフォルトの名無しさん:2006/05/24(水) 20:49:10
構造体の中に変数と関数ポインタを設定し、C++っぽくしてみようと試みましたが
ある関数(変数)は外部から参照できないように、ある関数(変数)はグローバルに・・・みたいに
できませんか?

そんなに構造体を二つにすれば解決すると思うのですが、できれば一つの構造体で
構成したいのです。
仮に、構造体を二つ、公開用と非公開用をつくり、それを一つの構造体の中に格納する・・・
みたいなものってできますか?

509デフォルトの名無しさん:2006/05/24(水) 20:54:32
おとなしくC++使えよ
510デフォルトの名無しさん:2006/05/24(水) 20:59:38
>>508
変数へのアクセスは全て関数経由でも良ければ、
公開するヘッダでは不完全型のtypedefだけを書き、構造体の宣言は書かないという手もある。
511491:2006/05/24(水) 22:20:07
誰か教えて下さい
512デフォルトの名無しさん:2006/05/24(水) 22:36:18
>>511
 せめて「お願いします」の一言くらいほしいぞー。
 整数部が10倍されてるんじゃなくて、改行文字が足りないだけ。
例えば、
5.52と入力し、整数部と小数部を改行なしで出力したら、
5と0.52で50.52と表示されるわけ。

つーか、ポインタが理解できてないです…。よくこれで動くな。
513512:2006/05/24(水) 22:44:00
あれ、>>498がちゃんと答えてるじゃん…
しかもここsage??ごめんなさい。さよなら…
514デフォルトの名無しさん:2006/05/24(水) 22:58:03
しかもおかしいのはポインタじゃなくて戻り値じゃん。
511と512を消したい…
515デフォルトの名無しさん:2006/05/24(水) 23:06:55
( ´∀`)σ)A`)
516デフォルトの名無しさん:2006/05/24(水) 23:27:34
>>488-489
C99 の規格を見た限りではあんまり問題なさそうなんだけど、まずい実装が多いってこと?
517491:2006/05/25(木) 00:11:04
>>498さん
なるほど、関数がおかしいわけじゃなく
出力の仕方がわるかったのですね
非常に丁寧な説明ありがとうございました
518デフォルトの名無しさん:2006/05/25(木) 00:43:13
出来の悪い初心者と言うのは、行うべき処理をまとめようともせずに、
いきなりコーディングを行おうとするのは何故でしょうか?
519デフォルトの名無しさん:2006/05/25(木) 00:45:01
>>518
コーディングしようと思ってるからだろ。
コーディングの前に何か準備が要るということは自明ではない。
520デフォルトの名無しさん:2006/05/25(木) 01:04:00
>>518
いいじゃね別にどうでも。初心者っつても色々いるだろうし。
じっくりやるのが好きな奴もいれば、なんか動かさないと詰まんないやつも居る。
死ぬほどコーディングやってれば、その内どうやるのが効率的なのか考えるよう
になるし、その内筋肉が覚えるよ。
俺にとって気になるのは、上から見下ろしたような意見をたれる自称上級者だけ
どね・・・・
521デフォルトの名無しさん:2006/05/25(木) 06:13:45
そもそも日本語も変だしな。
あらゆる意味でハズしてるな。
522デフォルトの名無しさん:2006/05/25(木) 07:23:22
>508
無理、あきらめろ。
さらに言えば、Cでそのような考え方をするな。
523デフォルトの名無しさん:2006/05/25(木) 13:32:04
C++のクラスを形だけまねるんじゃなくて、
カプセル化とかの概念をどうCで実装するか
を考えたほうがいいと思うよ。
524デフォルトの名無しさん:2006/05/25(木) 14:10:17
>>508
C で private はこういう風にできる。
public メンバ変数は作るべきではないということで
これで問題は無いと思う。
関数のインライン化は最適化に頼ることになるけど。
継承を考えだすと厄介だね・・・。

====== hoge.h
typedef struct Hoge_ Hoge;

// public コンストラクタみたいなもの
Hoge *Hoge_new();

====== hoge.c
struct Hoge_ {
 int a; // private メンバ変数みたいなもの
};

// private メンバ関数みたいなもの
static void Hoge_init(Hoge *hoge);

Hoge *Hoge_new() {
 Hoge *hoge = malloc(sizeof (Hoge));
 Hoge_init(hoge);
 return hoge;
}

static void Hoge_init(Hoge *hoge) {
 hoge->a = 0;
}
525デフォルトの名無しさん:2006/05/25(木) 19:07:04
あげ
526デフォルトの名無しさん:2006/05/25(木) 19:35:31
#include <stdio.h>
#include <time.h>

void time1(void)
{
int y,m,d,h,n,s;
FILE *fp;

if((fp=fopen("time.dat","rb"))==NULL)puts("error1");
else{

fread(&y,sizeof(struct tm),1,fp);
fread(&m,sizeof(struct tm),1,fp);
fread(&d,sizeof(struct tm),1,fp);
fread(&h,sizeof(struct tm),1,fp);
fread(&n,sizeof(struct tm),1,fp);
fread(&s,sizeof(struct tm),1,fp);
printf("%d %d %d %d %d %d\n",y,m,d,h,n,s);
fclose(fp);
}
}
527デフォルトの名無しさん:2006/05/25(木) 19:37:43
void time2(void)
{
time_t t;
struct tm *local;
FILE *fp;

time(&t);
local=localtime(&t);

if((fp=fopen("time.dat","wb"))==NULL)puts("error2");
else{
fwrite(local->tm_year,sizeof(struct tm),1,fp);
fwrite(local->tm_mon,sizeof(struct tm),1,fp);
fwrite(local->tm_mday,sizeof(struct tm),1,fp);
fwrite(local->tm_hour,sizeof(struct tm),1,fp);
fwrite(local->tm_min,sizeof(struct tm),1,fp);
fwrite(local->tm_sec,sizeof(struct tm),1,fp);

fclose(fp);
}
return 0;
}

int main(void)
{
time1();
time2();
return 0;
}
528ソース丸投げごめんなさい:2006/05/25(木) 19:38:39
これを実行しようとしてもエラーがでます。

fwrite(local->tm_year,sizeof(struct tm),1,fp);
ここら辺がが間違っているとがわかったのですが具体的にどうしたらいいか教えてください
時刻と日付をバイナリファイルに書き込むものです
529デフォルトの名無しさん:2006/05/25(木) 19:40:12
&
530デフォルトの名無しさん:2006/05/25(木) 19:53:10
size_t fwrite(
const void *buffer,
size_t size,
size_t count,
FILE *stream
);



パラメータ
buffer
書き込むデータへのポインタ

size
項目のサイズ (バイト単位)。

count
書き込む最大項目数。

stream
FILE 構造体へのポインタ。
531デフォルトの名無しさん:2006/05/25(木) 20:04:11
>>529-530
親切丁寧なレスありがとうございました
&つけるの忘れてました
532デフォルトの名無しさん:2006/05/25(木) 20:10:50
class-name *po;
po = &obj;
の時に、メンバにアクセスする時
po->member;
て事は、
&obj->menber;
も通用するの?
533デフォルトの名無しさん:2006/05/25(木) 20:19:57
(&obj)->member;
ね。
534デフォルトの名無しさん:2006/05/25(木) 20:34:41
(&obj)->memberは通用する(&obj->memberは演算子の優先順位の問題で無理)。

でも、(*po).memberとやらないように(&obj)->memberとやることも普通はない。
535デフォルトの名無しさん:2006/05/26(金) 12:44:18
g++利用のC++なんですが、pthread_createをメンバ関数に対して行いたいのですが
pthreadはメンバ関数には適用できないのでしょうか?

わかる人いたら教えていただけませんか?
536デフォルトの名無しさん:2006/05/26(金) 12:47:05
>>535
その通りです。
537デフォルトの名無しさん :2006/05/26(金) 15:28:14
すいません教えて下さい
operatorを勉強してて、CopyConstructorとDestructorを用意しといて
動作を見ていると、例えば下のような感じで+演算子をOverLoadしたとして
ClassName ClassName::operator+(ClassName &Cobj)
{
ClassName TempObj;
TempObj.MemberValue = this->MemberValue + Cobj.MemberValue;
return TempObj;
}
動きを見てたらCopyConstructorが呼び出されDestructorが呼び出され
次にTempObjの分のDestructorが呼び出されているのですが
TempObjの分は一時的なObjectなのでCodeBlockから抜けると破棄される
のは分かるのですが、最初のCopyConstructorが呼び出されるのは
新たにCopyObjectを作って(メモリ上に新たなInstanceを作成で良い?)
そのCopyObjectのポインタが、thisである。
と解釈すれば良いのでしょうか。
そうなら、operatorを使うたびに、メモリ上にInstance作成破棄を行うのでしょうか。
だとしたら、やたらにoperatorを使うのは、OverHeadってやつが余計にかかり
実行が遅くなるので使うのは控えた方が良いのでしょうか。
それとも、ClassName &ClassName::operator=(ClassName &obj)
{ return *this;}のような感じで
他の演算子も工夫して一時的なObjectもCopyConstructerも使う必要無く
良い解決法があるのでしょうか。
長々とした疑問文すいません。勉強してて「これじゃ、重くなるんじゃないのか?」
と思って気になってしまいました。どなたか教えください、お願いしまっす。
538デフォルトの名無しさん:2006/05/26(金) 16:00:31
> そのCopyObjectのポインタが、thisである。と解釈すれば良いのでしょうか。
違います。
コピーコンストラクタで生成されたオブジェクトは、プログラマには見えない返値用のテンポラリです。

> そうなら、operatorを使うたびに、メモリ上にInstance作成破棄を行うのでしょうか。
値(オブジェクト)を返す以上、常にテンポラリが作られます。
ただ、これは演算子オーバーロード特有の問題というわけではなく、
たとえば自前でadd関数を用意したとしても、オブジェクトを返す以上は免れない問題なので
これを理由に「演算子オーバーロードを使わない」というのはナンセンス。

> 他の演算子も工夫して一時的なObjectもCopyConstructerも使う必要無く良い解決法があるのでしょうか。
ありません。
Effective C++ 第23項「オブジェクトを返さなければならないときに、リファレンスを返そうとがんばるのはやめよう」を参照。

それと返値はClassNameではなくconst ClassNameに。
operator+はメンバ関数でなく、非メンバ関数(場合によってはfriend関数)として用意し、
operator+=を使って実装するのが通例。
539デフォルトの名無しさん:2006/05/26(金) 17:34:43
>>535
staticメンバ関数(クラスメンバ関数?)なら渡せるよ
540デフォルトの名無しさん:2006/05/26(金) 21:02:16
どうしてもメンバ関数を渡したいなら
コールバックの引数にthisポインタを積んどけばいいじゃない
541デフォルトの名無しさん:2006/05/26(金) 21:20:21
俺はいつもTemplate Method使う
最初に呼び出されるクラスメソッドを親クラスに実装して、
そのクラスメソッドから呼び出される仮想メソッドをオーバーライドする感じ。
542デフォルトの名無しさん :2006/05/26(金) 21:27:17
>>538さん
レスありがとうございます
まだまだ初心者の身で独習C++で勉強してます
Effective C++ も買う事になるんでしょう
>それと返値はClassNameではなくconst ClassName
>operator+はメンバ関数でなく、非メンバ関数
>(場合によってはfriend関数)として用意し、
>operator+=を使って実装するのが通例
等、新たな知識をありがとうございます。

ちなみに、「リファレンスって・・・何だったっけ?」
と、馬鹿の極みの疑問が生じ、和英辞書で検索しても出てこず
「???」と思い、ググってるとわかりました
referenceって、カタカナで言うとレファレンス(参照でした)なんっすね。
リファレンスとレファレンスが、ごっちゃになってる日本語文。
英語で覚えていかないと、やっぱ疑問が生じたとき検索できないっすね。
543デフォルトの名無しさん:2006/05/26(金) 22:28:50
コンパイルについて聞きたいのですが、C++とCではコンパイルをするときに特別に違うことはありますか?

544デフォルトの名無しさん:2006/05/26(金) 22:39:50
>>543
特別には違わないが普通に違うな
545デフォルトの名無しさん:2006/05/26(金) 22:42:57
さっき宿題スレでも聞いたんですが、terapadて゛C言語をやりたいんですが、環境変数いじるんですか?
546デフォルトの名無しさん:2006/05/26(金) 22:44:37
>>545
使うコンパイラによる。
エディタに何を使うかはあまり関係ない。
547デフォルトの名無しさん:2006/05/26(金) 22:46:20
ソースがひとつの場合を普通な場合と思ってました。
あなたの普通に違うというところを教えてください。
548デフォルトの名無しさん:2006/05/26(金) 22:48:46
>>546

gccを使えと言われました
549デフォルトの名無しさん:2006/05/26(金) 22:53:26
とりあえず日本語をどうにかしてこい
550デフォルトの名無しさん:2006/05/26(金) 23:25:50
C++でstringクラスを使うとき、

_stprintfのような関数を使用する場合、
いったんヌル文字で終わる文字列配列に格納してから
stringのオブジェクトに代入するしか方法はないのですか?
551デフォルトの名無しさん:2006/05/26(金) 23:34:38
http://www.ijg.org/
ここのjpegライブラリを利用したプログラムをC++で使いたいのですが
コンパイルするとread_JPEG_file(char*)という関数が定義されていないとなり
コンパイルできません。どうすればこの関数が定義されるのでしょうか?
gcc でコンパイルしてます。
552デフォルトの名無しさん:2006/05/26(金) 23:36:06
>>550
俺のESPが
「可変長引数を使ってstd::stringを構築したいよドラえもん」
と翻訳しているんだが

もしそうなら
std::stringstreamを使うかboost::lexal_castだかなんだかを使えばいいんじゃね?
553デフォルトの名無しさん:2006/05/26(金) 23:38:01
>>551
read_JPEG_fileはライブラリのサンプルで定義されている関数で、
ライブラリの関数じゃないだろが。
どうしても使いたければexample.cからコピペ汁
554デフォルトの名無しさん:2006/05/26(金) 23:44:48
>>553
明日ためしてみます。
回答ありがとうございました。
555デフォルトの名無しさん:2006/05/27(土) 00:18:52
explicit(だっけ?)で暗黙の型変換を禁止することで、何か良いことある?
逆に暗黙の変換があると便利だと思うんだけど。
556デフォルトの名無しさん:2006/05/27(土) 00:22:20
EffectiveC++を嫁
557デフォルトの名無しさん:2006/05/27(土) 00:22:56
予期しない変換で訳の分からん事になるのを防げる。
整数のつもりで書いた4が4要素のstd::vector<double>に暗黙のうちに変換されたらやってられんだろ。
558デフォルトの名無しさん:2006/05/27(土) 00:23:39
>>556
了解した
559デフォルトの名無しさん:2006/05/27(土) 00:35:46
>>550
c_str()
560デフォルトの名無しさん:2006/05/27(土) 00:45:12
>>559
stringに格納したいと言っているから、それは違うと思うぞ。
561デフォルトの名無しさん:2006/05/27(土) 01:26:11
>>560
間違ってないんじゃね?
あらかじめリサイズが必要だが
562デフォルトの名無しさん:2006/05/27(土) 01:33:34
CString#Format()
みたいな事をしたいんじゃないかと思ってた
563デフォルトの名無しさん:2006/05/27(土) 01:57:28
>>561
c_str() の戻り値には const 付いてるから無理。
564デフォルトの名無しさん:2006/05/27(土) 06:14:37
>>550
つBoost.Format
565デフォルトの名無しさん:2006/05/27(土) 07:04:10
>>564
それ % で引数区切るからキモイんだが
566デフォルトの名無しさん:2006/05/27(土) 09:16:14
>>550
CString::Format
AnsiString::sprintf
567デフォルトの名無しさん:2006/05/27(土) 10:45:40
borland C++ 5.5 を使用しています。今数値計算の勉強をしているのですが、
メモ帳に値をofstream out("sample.txt");
のようにして保存はすることが出来たのですが、.txtと.cppのプログラムの区別が付きにくいので
数値計算結果をフォルダの中に入れたいのです。で試しにホームページのhtmlのように
ofstream out("sample\(/)sample.txt");
のようにやってみたのですができませんでした。
これはどうすればできるようになるのでしょうか?教えてください。よろしくお願いいたします。
568デフォルトの名無しさん:2006/05/27(土) 11:13:15
\(/) は \\ か / で十分。
フォルダが存在してない場合あらかじめ作っとかないと、エラーが起きるよ。
569デフォルトの名無しさん:2006/05/27(土) 11:22:44
>>568
ありがとうございます!!フォルダを最初に作るのを忘れてました。
どうも最近フォルダを自動的に作ってくれるソフトが多くて
コンピュータにフォルダ作成作業まで頼ってました(w
570デフォルトの名無しさん:2006/05/27(土) 11:46:30
boost::filesystemを使うと楽かも。
571デフォルトの名無しさん:2006/05/27(土) 11:49:20
>569
フォルダ作る処理はOS依存。
ある程度統一されたやり方でやりたかったらboost::filesystem使うべし。標準じゃないけど。
572デフォルトの名無しさん:2006/05/27(土) 15:01:54
環境はborland C++ 5.5です。
Win32APIのリストビューにて、
左が項目名、右がその項目の値(値の変更可能)となっているものをつくろうと思っています。

それでわからないところは、
値のところにカーソルがあたったら編集が出来るようにする方法がわかりません。
一列目はウィンドウスタイルにLVS_EDITLABELSを指定したら出来るのはわかりました。
ですけど値が二列目なのでそれだと編集が出来ません。
どのようにしたらこれは出来るのでしょうか?
573デフォルトの名無しさん:2006/05/27(土) 15:07:59
>>572
基本的にはできません。
どうしてもセルの編集をしたければ、自前のEditBoxを巧いこと生成するか、
ラベルの編集機能を制御する形で誤魔化すか、
いずれにしても結構面倒です。
574572:2006/05/27(土) 15:17:08
>>573
めんどいのかぁ。
それなら自前のEditBoxの方法にしようと思います。
それだと後からコンボボックスにすることも出来そうだと思うので・・・

お願いです!
そういったことに詳しく載っているサイトを知っていたら
教えてもらえないでしょうか?
575572:2006/05/27(土) 15:35:55
とりあえずEditBoxは表示できました。
けど文字サイズが大きすぎだよ。
リストビューのフォントを取得しなくてはだめっぽいなぁ
どのメッセージを送ったらいいのだ?
576デフォルトの名無しさん:2006/05/27(土) 15:43:41
ちょっとは自分で調べろボケ
577デフォルトの名無しさん:2006/05/27(土) 15:57:07
>>575
つ[CodeGuru]
578572:2006/05/27(土) 16:07:56
CodeGuru・・・、(検索中)
うわ、英語のサイトなのか!
ってことはこのサイトは使えるってことですね?
Excite翻訳で頑張って調べます!
579デフォルトの名無しさん:2006/05/27(土) 16:19:17
Excite翻訳掛けながら調べるぐらいなら、日本語のサイト探した方がいいと思うがな
580デフォルトの名無しさん:2006/05/27(土) 16:23:25
>572
スレ違い。Win32APIスレあたりにどうぞ。
581572:2006/05/27(土) 16:30:40
それっぽいの見つけました。
ttp://www.codeguru.com/cpp/controls/listview/editingitemsandsubitem/

>>580
わかりました。
後は自分で頑張ります。
582デフォルトの名無しさん:2006/05/27(土) 16:44:21
>>580
>1によるとWin32APIも対象にはいってるぞ。
まぁこの問題はスレタイによる【初心者歓迎】の【初心者】に入れるかどうかだが・・・
ほぼ初心者だと思う。

まぁ、どちらにしろ専門スレのほうにいったほうがいいんじゃないか?
583550:2006/05/27(土) 22:11:32
>>552
>>564
>>566
ありがとうございます。string用に書式化するのがあるんですね。
…で、またそれに関して質問なんですが、
GetPrivateProfileStringのような関数から得た結果を
また同じようにstringオブジェクトに格納する方法はありますか?

WritePrivateProfileStringならc_str()でいいんですけれども。
584デフォルトの名無しさん:2006/05/27(土) 22:17:48
>>583
君はstringについて、もっと勉強した方がいい。
585デフォルトの名無しさん:2006/05/28(日) 10:51:48
ボーランドで Cのコンパイラとデバッグをダウンロードして フリーのC環境ソフトの bcc デベロッパーをダウンロードしましたが 使えません 何回やっても Cがプログラムできる環境(状態)になりません どうしたらいいでしょうか? 教えてください!!m(_ _)m
586デフォルトの名無しさん:2006/05/28(日) 10:53:14
>>585
(今は)諦める。
587デフォルトの名無しさん:2006/05/28(日) 11:16:05
諦められないですよ〜(>_<)(>_<) ボーランドのCコンパイラを使うには Outlookとか必要なんですかね? 家のPCは office2003homeなんで Outlookは入ってないんですよね... 関係ありますかね? あとCコンパイラは ボーランドが主流ですかね? 初心者には
588デフォルトの名無しさん:2006/05/28(日) 11:22:28
VC2005EEつかっとけ
589デフォルトの名無しさん:2006/05/28(日) 11:25:47
VC2005って フリーコンパイラですか? C言語使えます? 学校で ボーランドのCコンパイラを使ってるんで 家のPCでも 同じボーランドのCコンパイラを使いたいんですけどね... ダウンロードして 解凍して使えないってのは このPCでは無理ってことですかね?
590デフォルトの名無しさん:2006/05/28(日) 11:46:44
>587
とりあえず携帯厨かつ馬鹿なのは分かったから帰れ

591デフォルトの名無しさん:2006/05/28(日) 11:56:03
2ちゃんはすぐ素人を叩きますけど すいませんが叩かないで教えてくださいm(_ _)m 確かに私は素人で馬鹿です 言うとおりです みとめます ただ 分からないんで聞いてるんで できれば教えて欲しいんですが 2ちゃんは玄人専用なのですか? 素人は入る余地はないのでしょうか?
592デフォルトの名無しさん:2006/05/28(日) 12:04:51
釣りでした。ごめんなさい><
593デフォルトの名無しさん:2006/05/28(日) 12:28:36
分かりました 諦めます... ここは初心者(素人)は入る余地はない様ですね 初心者歓迎 って書いてありましたが どうやら違う様ですね 諦めます.....
594デフォルトの名無しさん:2006/05/28(日) 12:34:38
初心者は歓迎だけど馬鹿はお断りです^^
595デフォルトの名無しさん:2006/05/28(日) 12:42:14
とりあえず馬鹿と
人に問題を説明できてない奴と
礼儀がなってない奴と
わざわざ初心者ですと名乗る奴は
叩かれます
596デフォルトの名無しさん:2006/05/28(日) 12:44:12
エスパーは居なかったようですね
597デフォルトの名無しさん:2006/05/28(日) 12:45:37
ほんと馬鹿ですみません... どうしても自宅のPCでCを書きたいんで... ボーランドのCコンパイラもデバッガーもダウンロードして bccデベロッパーもダウンロードして 解凍したのに使えません...(>_<) 何か他に特別なソフトが必要なのでしょうか?
598デフォルトの名無しさん:2006/05/28(日) 12:56:00
昔の人はいい事言った
過ちて改めざる、これを過ちと言う

とりあえず>595を10回読め
599デフォルトの名無しさん:2006/05/28(日) 12:57:38
学校でも使ってるなら友達に聞け
600デフォルトの名無しさん:2006/05/28(日) 12:59:09
601デフォルトの名無しさん:2006/05/28(日) 13:08:15
>>598
とりあえず馬鹿と → ほんと馬鹿ですみません
人に問題を説明できてない奴と → 解凍したのに使えません
礼儀がなってない奴と → ほんと馬鹿ですみません
わざわざ初心者ですと名乗る奴は → (書かなかった)
602デフォルトの名無しさん:2006/05/28(日) 13:16:00
もう来るなって事ですか?
603デフォルトの名無しさん:2006/05/28(日) 13:27:14
604デフォルトの名無しさん:2006/05/28(日) 13:32:41
質問してもよろしいでしょうか?
VCで以下のことをするとなんでこの結果になるかわからないです
「ソース」
char *s= aあ123
sizeof(s);
「結果」
4

コードの書き方がわるいんでしょうか?自分としては「6」を貰いたいの
ですが・・。
605デフォルトの名無しさん:2006/05/28(日) 13:43:23
>>597
具体的な問題も書かずに『叩かれた』と騒ぐのは何だ。
俺たちはただ、お前の書く文章が質問を形成していない事を突っ込んでいるわけで。
606デフォルトの名無しさん:2006/05/28(日) 13:44:40
>604
「charを指すポインタ」のサイズはその環境では4バイトってだけ
文字列は関係ない

というか文字列は"でくくれ
サンプルコードは一字一句完璧に書き写すかコピペしろ
あとstrlen(「あ」を一文字として数えて欲しいならwcslen等)使え
607デフォルトの名無しさん:2006/05/28(日) 13:51:31
すみませんが、質問です。
以下のようなプログラムを作ったのですが、最終行だけ2回繰り返されて
出力されてしまいます。どうしたら良いでしょうか?

#include <iostream>
#include <string>

//商品と価格のTSVデータを標準入力から受け取り、
//価格を2倍にして標準出力に送り出す。

int main()
{
  int before, after;
  std::item;

  while(!std::cin.eof()) 
    { 
      std::cin >> item >> before;
      after = before * 2;
      std::cout << item << 
608607:2006/05/28(日) 13:52:55
すみません、途中で切れてしまいました。607の最終行から続きです。

      std::cout << item << "\t" << after << std::endl
    } 
  return 0; 


--------入力データ--------------
商品A[TAB]100
商品B[TAB]150
商品C[TAB]125
--------出力データ--------------
商品A[TAB]100
商品B[TAB]150
商品C[TAB]125
商品C[TAB]125


環境は、以下のとおりです。
g++ (GCC) 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)
609デフォルトの名無しさん:2006/05/28(日) 13:53:08
>>606
アリガト!(´▽`)
\nまでの型のサイズを知ることはできないんだね。。
”がなぜか書き込み規制にかかってしまい出せませんでした

>>597
日本語を以下のように訂正してください
私の質問を早く答えてもらいたいので
「ボーランドC++無償版(DOS版)のインストール手順が書いてあるサイトを
どなたかご存知ないでしょうか?」
んで回答
http://72.14.207.104/search?q=cache:wUwc0a-qqDoJ:www.mech.titech.ac.jp/~t-souzou/jyugyou/TurboCinst.htm+boland+c+%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%80%80%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&hl=ja&gl=jp&ct=clnk&cd=3
610デフォルトの名無しさん:2006/05/28(日) 14:00:12
char *s= "aあ123"
printf("%d\n",sizeof(s));
611デフォルトの名無しさん:2006/05/28(日) 14:01:08
さっきの規制はなんだったんだろう・・・
テスト書き込みにてスレ汚しすみませんでした
612デフォルトの名無しさん:2006/05/28(日) 14:04:45
すみません、RedHat Linux EL4上のGCC(g++)で日本語処理を行うためには
どういう方法が良いのでしょうか?

ロケールの文字コードはUTF-8ですが、できればw_charを使いたいのです。
GCCのw_charは4バイトですから、外部コードをUTF-8、内部コードをUTF-32に
すれば良いのだろうと思いますが、それを解説している資料が見つからなくて
困っております。
613デフォルトの名無しさん:2006/05/28(日) 14:09:32
>>609
なぜTuboC?
BCCなんだから>>603の紹介したサイトだろ
614デフォルトの名無しさん:2006/05/28(日) 14:22:49
>>607,608
cin.eofを評価するタイミングの問題

std::cin >> item >> before;
の後で
if(std::cin.eof())break;でも入れとけ
615デフォルトの名無しさん:2006/05/28(日) 14:27:19
>>612
とくに何も考えなくていい。こんな感じで。
#include <stdio.h>
#include <locale.h>

int main (void)
{
  setlocale(LC_ALL, "");
  putwchar(L'あ');
  putwchar(L'\n');
}
616607:2006/05/28(日) 14:43:24
>>614
ありがとうございます。やっぱりそうするしかないですか…。

getline(std::cin, std::string line)あたりで一行ずつ取り込んで、
そのlineをもう一度 stream に変換したりできないでしょうか?
これも汚い書き方ですけれど、終端条件が2箇所に出現しているのは、
やっぱりつらいです。
617デフォルトの名無しさん:2006/05/28(日) 14:51:13
>>616
std::istringstreamを使うと、std::stringからstd::istreamを作れる。
618デフォルトの名無しさん:2006/05/28(日) 14:51:18
>>616
614を適用すれば、ループそのものは無限ループにできるはずだから、
終端判定は一箇所で済むはず。
619デフォルトの名無しさん:2006/05/28(日) 14:53:07
>>612>>615
ちなみにC++なら<locale>をインクルードした上で、std::locale::global(std::locale(""));とする。
そしてstd::locale::globalを呼ぶと、内部でstd::setlocale(LC_ALL, も呼ばれることになっている。
620614:2006/05/28(日) 14:58:48
>>616
で答えはでとるな。
解りやすく言うと while(1) でループに入れ。
621614:2006/05/28(日) 15:00:01
間違った>>618で答えは出てるでしたorz
622607:2006/05/28(日) 15:03:26
>>617
ありがとうございます。まさにそれが知りたかったものでした。

>>618, >>620-621
すみません、その通りでしたね。お恥ずかしい。
while (true)
{
  std::cin >> item >> before;

  if(std::cin.eof())break;

  after = before * 2; 
  std::cout << item << "\t" << after << std::endl;
}
終端条件がwhile文に明示されないのが気になりますが、stringからstreamに戻すより
効率はこの方が良いですね。ありがとうございます。

------------------------------------

それにしてもC++には、Javaに比べて気をつけなければならない点が
たくさんあると感じられます。こう書けば堅牢になる、という感覚が
なかなか獲得できません。難しいです。

堅牢なC++コードを書くためのガイドブックで、入門者におすすめの
ものはないでしょうか?
623デフォルトの名無しさん:2006/05/28(日) 15:13:22
「堅牢」の意図する所がよくわからんが
C/C++セキュアプログラミングクックブックとか。
所謂セキュリティの問題じゃないならEffectiveC++とか。
624デフォルトの名無しさん:2006/05/28(日) 15:14:16
>>622
こうすればwhileに条件書けるよ。
#include <iostream>
#include <string>

int main()
{
  int price;
  std::string item;
  while (std::cin >> item >> price)
  {
      std::cout << item << '\t' << price * 2 << std::endl;
  }
  return 0;
}
625607:2006/05/28(日) 15:22:09
>>623
ありがとうございます。堅牢というのは、明快でバグの入り込みにくい、という意味を
意図しておりました。「Effective C++」ですね。まだ私には早いかと思っておりましたが、
読んでみます。

>>624
ちょっとびっくりしました。
cin(と言うかstream全般)って、cin.eof() が true でなくても、>> price を実行した
あとは NULL になるのですか?
もしそうなら、C++って本当に難しいと改めて思います。
626607:2006/05/28(日) 15:28:36
>>625
自己訂正。後半は間違っていました。>> price を実行したあとに条件判定が
行われるから、std::cout << まで行かないだけですね。
申し訳ありません。ああ、もうなんかメタメタ…。
627デフォルトの名無しさん:2006/05/28(日) 15:32:50
>>625
cin >> item >> priceの値はcin。(だから>>をチェーンする記法が働くんだが)
std::istreamにはvoid *への暗黙の変換が定義されていて、これがwhileの条件部でテストされる。
この値の真偽はcin.fail()と同じ。
628607:2006/05/28(日) 15:42:11
>>627
ありがとうございます。大変勉強になりました。
void * への暗黙の変換ですか。知っておかねばならないことが膨大にあるなあ。
629612:2006/05/28(日) 15:50:41
>>615, >>619
ありがとうございます!
GCC は日本語処理が難しいという評判で、怖気づいていたのですが、
デフォルトのエンコーディングなら、それだけで良いのですね!
今は処理系がないので、明日試してみます。
630デフォルトの名無しさん:2006/05/28(日) 15:57:02
603さん ありがとうございます 参考にしておきます あと ダメだった時ように聞いておきたいのが VC2005EEは ただで手に入りますかね? 買わないといけませんか? すみません教えてくださいm(_ _)m
631デフォルトの名無しさん:2006/05/28(日) 16:28:02
632603:2006/05/28(日) 16:43:02
BCCはCPADで使うのが手っ取り早く楽
EXPRESSは無料、期間限定をなくしたはずなので買う必要なんかない。
ただ、BCCの環境変数の設定で困っているような状況を見るに
BCC+CPADでお気楽C++のほうが向いているように思う。

自分もヘタレなのでVC6、VC7、VC8の環境を持っていても
お気楽CPADでチョイチョイ書く場合が結構ある。
(OPENGLのGLUTとかの確認とか)

VC8のEEなんか使うぐらいなら、CD郵送代だけで使える(1600円だったかな)
VisualStudio2005 Professionalを180日間評価版のほうが便利。
(MSDNがまともに付いてる)
633デフォルトの名無しさん:2006/05/28(日) 16:44:13
全部ではないと言うと..? Visual c++ は 無料でダウンロードできるって事ですか? Visual c++以外の他のソフトは無料ではないと言う事でしょうか?
634デフォルトの名無しさん:2006/05/28(日) 17:02:17
少しは自分で調べろよ
635デフォルトの名無しさん:2006/05/28(日) 17:22:30
馬鹿みたいに教えるから教えて勲がツケアガンダヨボケ。
>>631-630とりあえずしんどけ
636631:2006/05/28(日) 17:23:15
リンク先を紹介された場合、それを一通り読むと、幸せになれると思うよ。

スラッシュドットに、「MFC/ATL は含まれない」って書いてあるでしょ。
Microsoftのリンク先のFAQにもある。
http://www.microsoft.com/japan/msdn/vstudio/express/faq/default.aspx
あとは>>632 の後半に同意。
637デフォルトの名無しさん:2006/05/28(日) 17:32:27
VC++.net2005でC言語でプログラムを作っています。

void *v;
int address = 0x008D5AC4;

v = (int *)address;


メモリアドレスを直接ユーザーに指定してもらい、それをポインタに格納するプログラムを作っているのですが、
上記のように書くとエラーは出ず、コンパイルできますが、警告が出てしまいます。
( : warning C4312: '型キャスト' : 'int' からより大きいサイズの 'int *' へ変換します。)

プログラム自体は正常に動作するようですが、警告を出さないようにするにはどう書けばよいのでしょうか?
638デフォルトの名無しさん:2006/05/28(日) 17:45:31
>>637
#include <stdint.h>
intptr_t address = ...

C99 での追加だから、 VS2005 で使えるかどうかは知らない。
639デフォルトの名無しさん:2006/05/28(日) 18:06:17
>>636
あんなやつがMFC/ATLを必要としていると思うか?
640デフォルトの名無しさん:2006/05/28(日) 18:08:39
>>637-638
VC++に<stdint.h>はまだないが(u)intptr_tは<stddef.h>などで宣言されている。
そもそもWindowsで直にメモリアドレスを扱って何がしたいのか気になる。
641デフォルトの名無しさん:2006/05/28(日) 18:09:52
>>637
/Wp64 をはずせば警告は無くなる。
メモリアドレスを直値のintで扱うとはひどいプログラムですの。
642デフォルトの名無しさん:2006/05/28(日) 18:17:38
始めまして。質問です。

以下漠然とした質問ですみません。。。
既存のC言語で作られているCGIに対して、
Oracle接続機能を追加したく、Pro*Cを使おうと思うのですが、
CGIにPro*Cは問題無く使えますでしょうか?
(Google検索したけど参考になる情報が無かったもので。。。)

あと、もしPro*Cが使えたとした場合のコンパイル方法なのですが、

現在 cc -o test.cgi test.c

と、1行コマンド打っているところを、
Pro*Cを組み込んだ場合、どの様にすれば宜しいでしょうか?
環境はSolaris(Verは忘れ;;)、Oracle8iです。

ご教授お願いますm(__)m
643デフォルトの名無しさん:2006/05/28(日) 18:28:29
>>638>>640>>641
おお、できました。
ありがとうございます!

目的は、winゲーム内の特定のアドレスの内容を参照したいからです。
ネトゲのツールを作るのに必要です。
644デフォルトの名無しさん:2006/05/28(日) 18:31:40
>>643 クラッカー視ね
645デフォルトの名無しさん:2006/05/28(日) 18:33:00
>>642
CGIは、動作させるサーバ上でコンパイルしなければならない事はよくご存じか?
646デフォルトの名無しさん:2006/05/28(日) 18:36:47
>>643
Windowsプログラムでは、仮想メモリが使われている事はご存じか?
647デフォルトの名無しさん:2006/05/28(日) 18:39:06
>645 さん
はい。
動かす環境でのコンパイルではありませんが、
動かす環境と同じ設定の環境でコンパイルしてるハズ・・です。
これじゃダメでしょうかね?
648デフォルトの名無しさん:2006/05/28(日) 18:42:51 BE:48525555-#
>>647
Pro*Cのマニュアル嫁
649デフォルトの名無しさん:2006/05/28(日) 18:44:57
>>646
はい、知ってます。
仮想メモリがどんなタイミングで物理メモリに呼び出されてまた戻っていくのかは知りません。
650デフォルトの名無しさん:2006/05/28(日) 18:47:47
>>643>>649
仮想メモリとはスワップするだけでなく、プロセス間で別アドレス空間にしていることもご存じか?
651デフォルトの名無しさん:2006/05/28(日) 18:51:21
はじめまして。
つい最近(先週土曜日から)独学でC言語の勉強を始めた者です。
この一週間のマトメとして10進数→2進数変換プログラムを作りました。
しかし、ビルドは出来ても実行すると
「Cbenkyou が原因で KERNEL32.DLLにエラーが発生しました。Cbenkyouは終了します。
 問題が解決しない場合は、コンピュータを再起動してください。」
と言われて、終了してしまいます。どうすればいいかわからなくて困っています。
下記に詳細を書きますので、どうか助けてください。
尚、私の環境はWindowsME、CPU 877Mhz、HDD 40GB(使用21GB)、メモリ 384MBで、使用コンパイラはVC++6.0です。

デバッグウィンドウの内容:
'C:\WINDOWS\SYSTEM\KERNEL32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
例外処理 (初回) は cbenkyou.exe にあります: 0xC0000005: Access Violation。(←たくさんあります)
例外処理 (初回) は cbenkyou.exe (KERNEL32.DLL) にあります: 0xC00000FD: Stack Overflow。
例外処理 (初回) は cbenkyou.exe にあります: 0xC0000005: Access Violation。(←またたくさんあります)

ソースファイルを書くと文字制限になるため一旦投稿します。
652デフォルトの名無しさん:2006/05/28(日) 18:53:15
>>650
知ってますよ。もしプロセスによってアドレス空間が独立していなければメモリを指定参照することができないので・・・。
そのプロセスで目的のデータは常に0x0075F21Aに存在するみたいに。
653651:2006/05/28(日) 18:55:03
654デフォルトの名無しさん:2006/05/28(日) 18:57:09
>>651
デバッガあるなら自分で探せるだろ。
655651:2006/05/28(日) 19:02:20
>>654
それがその、MSDNのCDをなくしてしまってVC++本体しか入っていないため、
不具合がそこで起こっている、という事はわかっても具体的にどこが悪い、というのが参照は出来ないんです。
環境にこれを書き忘れていました。すみません。
656デフォルトの名無しさん:2006/05/28(日) 19:10:41
657デフォルトの名無しさん:2006/05/28(日) 19:13:04
あるファイルに関数を複数つくり、それを別のファイルからコールする際に
サイクル数を計りました。

main.c

int main(void)
{
 aaa();
 bbb();
 ccc();

 return 0;
}

ABC.c

void aaa()
{
 /* 何かしらの処理(ループ処理) */
}
void bbb()
{
 /* 何かしらの処理(ループ処理) */
}
void ccc()
{
 /* 何かしらの処理(ループ処理) */
}

このときABC.cの関数の位置を変えるとサイクル数が変わりました。 (続きます)
658デフォルトの名無しさん:2006/05/28(日) 19:13:42
main.c

int main(void)
{
 aaa();
 bbb();
 ccc();

 return 0;
}

ABC.c

void ccc()
{
 /* 何かしらの処理(ループ処理) */
}
void aaa()
{
 /* 何かしらの処理(ループ処理) */
}
void bbb()
{
 /* 何かしらの処理(ループ処理) */
}

関数の位置とサイクル数に関係はあるのでしょうか?
アセンブラで見たところ、とくに変化は見られませんでした。

ループ処理で3サイクルの違いがありましたが、
そのループが100回、1000回と増えると結構なサイクル数の違いになり
無視できないレベルになったので、何か理由があれば教えてください。
659デフォルトの名無しさん:2006/05/28(日) 19:16:23
>>657-658
環境がわからないと、なんともいえない。
660デフォルトの名無しさん:2006/05/28(日) 19:17:37
環境は
CPU:SH-2(SH7145F)
コンパイラ:SHC ver9.0.2
です。
661デフォルトの名無しさん:2006/05/28(日) 19:28:36
>>660
バスが 32bit で命令が 16bit だから、関数それぞれのアドレスの
アライメントが関係してくるかもしれない。
関係するならコンパイラが面倒見てくれるべきなんだけど、 SHC じゃぁねぇ。
662デフォルトの名無しさん:2006/05/28(日) 19:36:21
SHCのマニュアルを見ましたがいまいちわかりません。
関数の大きさ(アセンブラコードの行数)が原因でしょうか?

・・・となると、関数を定義する際は、関数のコードの小→大の順に定義すべきでしょうか?

ちなみに他のCPUやコンパイラではどうなんでしょう・・・

しかし、同じアセンブラコードなのに、関数の配置を換えるとサイクル数が変わるなんて・・・
663デフォルトの名無しさん:2006/05/28(日) 19:38:24
>>662
さっさとアライメントを確認しろよ。
664デフォルトの名無しさん:2006/05/28(日) 20:03:44
たしかに、アライメントが影響してるみたいです。
ただ、そうなると、変更前の順番
int aaa()→4の倍数番地に配置
int bbb()→2の倍数番地に配置
int ccc()→2の倍数番地に配置
を変更後の
int ccc()→4の倍数番地に配置
int aaa()→2の倍数番地に配置
int bbb()→4の倍数番地に配置
に直すと、ccc()とbbb()が速くなりました。
なのにaaa()は速度が変わりません、アライメンとが影響するなら
ccc()とbbb()が速くなる代償としてaaa()が遅くなるはずですが・・・

それとも、メモリリードとメモリライトも影響しますか?
aaa()はループの中でメモリライトを
bbb()とccc()はループの中でメモリライトおよびリードをしています。
665デフォルトの名無しさん:2006/05/28(日) 20:10:19
>>664
関数内でループしてるんなら、関数先頭よりも
ループするときのジャンプ先が問題になるだろうなぁ。

コード以外のリードとライトはコードの位置と関係ないだろうから、
影響しないと思うよ。
666デフォルトの名無しさん:2006/05/28(日) 20:12:52 BE:19410252-#
>>652
>アドレス空間が独立していなければメモリを指定参照することができないので・・・。

意味がわかっていない予感。
667デフォルトの名無しさん:2006/05/28(日) 20:42:57
>>666
ReadProcessMemory/WriteProcessMemoryを使ったハッキングだろ。
MSもいい加減このAPIにガードをかけてもらいたいものだ。
それだけで相当の不正行為を排除できるのに。
668デフォルトの名無しさん:2006/05/28(日) 20:48:54
>>667
これはまた、えらく自分勝手な意見ですね
669デフォルトの名無しさん:2006/05/28(日) 21:29:46
フラットメモリモデルを誤解している奴がいるな。
670デフォルトの名無しさん:2006/05/28(日) 21:41:12
>>666
ええと。
指定する直アドレスというのはWindowsが作成するプロセスごとの仮想アドレスのことであって、本当の物理メモリのアドレスじゃないです。
本物の物理メモリのアドレスは私には知るよしもありませんので・・・。
671デフォルトの名無しさん:2006/05/28(日) 21:47:10
>661>665
アドバイスありがとうございます。

しかし、同じ処理(アセンブラレベルでも同じコード)なのに、配置場所によって
処理速度が変わるなんて・・・
逆に、どういうことをすれば、そのようなことを意識しなくてもいいようにできますかね・・・

これは完全に環境依存だと思いますが。
SHCだと、方法はないのかな?
672デフォルトの名無しさん:2006/05/28(日) 22:04:21
>>670
おそらくユーザにゲームのプロセスでのメモリアドレスを入力してもらって、
自分のプログラムはそのアドレスを読み書きしようというのだろうが、普通には読み書きできない。
667の言うとおりReadProcessMemory/WriteProcessMemoryを使う必要がある。

それを理解しているのか?
673デフォルトの名無しさん:2006/05/28(日) 22:13:29
>>672
はい。>>667のおっしゃる通りで、ReadProcessMemory/WriteProcessMemoryを使って他アプリのメモリの中身を覗き見ます。
実際にはユーザーに入力してもらう変わりに、プログラムが変動しない特定のバイナリ列を検索して、基点アドレスを算出し、そこから目的のアドレスを自動取得するようなプログラムになりました。
674デフォルトの名無しさん:2006/05/28(日) 22:19:30
>>673
わかっているならいいけど今までの言動からしてわかっていなさそうだった。
675デフォルトの名無しさん:2006/05/28(日) 22:20:50
なんで>>673はつまらないお節介に律義に付き合ってるんだろうw
676デフォルトの名無しさん:2006/05/28(日) 22:41:45
いちいちプログラムの配置場所まで考慮するなんて
C言語も奥深いですね。
677デフォルトの名無しさん:2006/05/28(日) 23:15:55
>>676
671 の話だと思うが、あれは SHC がタコなだけ。
678デフォルトの名無しさん:2006/05/30(火) 00:50:36
すみませんが、質問です。gdb で wstring の内容を表示するにはどうしたら良いでしょうか?print wstring型変数 だと、アドレスやら16進データやらが表示されるのみで、内容が分からないのです。
679デフォルトの名無しさん:2006/05/30(火) 01:26:09
680デフォルトの名無しさん:2006/05/30(火) 01:33:23
すいません、質問なんですがg++で

class likeIP
{
public:
unsigned int func01:6, address01:10, func02:6, address02:10;
unsigned int func03:6, address03:10, func04:6, address04:10;
unsigned int func05:6, address05:10, func06:6, address06:10;
unsigned int func07:6, address07:10, func08:6, address08:10;
}

のaddress01に任意の値を代入する方法ってあるんでしょうか?
知ってる方がいらっしゃったら教えていただけないでしょうか?
681デフォルトの名無しさん:2006/05/30(火) 01:38:13
そのまま代入すればいいと思うが?
682デフォルトの名無しさん:2006/05/30(火) 01:38:47
すいません、これからCを勉強しようと思って無償コンパイラをダウンロードしようとしたんですけどできません。

BorlandR C++Compiler 5.5
http://www.borland.com/jp/products/cbuilder/freecompiler.html

パソ歴自体は8年くらいなんで変なミスはしてないと思うんですけどなんでダウンできないんですかね?
もし誰かもってたらうpしていただけませんか?
683デフォルトの名無しさん:2006/05/30(火) 01:44:49
ダウンロードできましたよ?>>freecommandlinetools2.exe
684デフォルトの名無しさん:2006/05/30(火) 01:50:58
>>681
そのままってたとえば

likeIP ip;
ip:address01 = 0x000F;

みたいにできるんでしょうか?
これだと桁が合わないのですが、あふれた分は切り捨てになるのかな??
685デフォルトの名無しさん:2006/05/30(火) 01:51:12
すんません!
windowsUpdateしてなかったようでftpからダウンできないバグみたいな感じなってたみたいです。
ありがとうございました。
686デフォルトの名無しさん:2006/05/30(火) 01:51:57

682です。
687デフォルトの名無しさん:2006/05/30(火) 01:57:32
>>684
まず自分でやってみればいいじゃん(;´Д`)
g++の実装ではあふれた部分は切り捨てられる。
688デフォルトの名無しさん:2006/05/30(火) 02:21:27
>>687
いや、すいません。
実装してもエラーが出てしまうもので。。。
でもいろいろ試してみたらエラーは出ないようになったのですが値がちゃんと代入
されていないようなのです。これは何故なのだろう。
int main()
{
likeIP ip;
ip.func01 = 0x00;
ip.address01 = 0x0000;
ip.func02 = 0x00;
ip.address02 = 0x0000;
ip.func03 = 0x00;
ip.address03 = 0x0000;
ip.func04 = 0x00;
ip.address04 = 0x0000;
ip.func05 = 0x00;
ip.address05 = 0x0000;
ip.func06 = 0x00;
ip.address06 = 0x0000;
ip.func07 = 0x00;
ip.address07 = 0x0000;
ip.func08 = 0x00;
ip.address08 = 0xFFFF;
printf("%d\n",ip);
}

で出力が0になる。なんで?
689デフォルトの名無しさん:2006/05/30(火) 02:22:53
わかった。intの範囲を超えているからですね。ありがとうございました
。解決しました。
690678:2006/05/30(火) 02:23:30
>>679
ありがとうございました。
かなり泥臭いことが必要になるのですね。
691デフォルトの名無しさん:2006/05/30(火) 09:13:06
>>688
> likeIP ip;
> printf(
692691:2006/05/30(火) 09:14:36
キレタ…orz

>>688
> likeIP ip;
> printf("%d\n",ip);

printf()は構造体の中身なんて解析しねーよ、ボケ!
693デフォルトの名無しさん:2006/05/30(火) 16:43:07
すみませんが、質問です。
GCC で、wstring をただの string に変換するには、どうしたら良いのでしょうか?
VC++の方法ならすぐ見つかるのですが、GCC でのやり方が見つかりません。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13908&forum=7
694デフォルトの名無しさん:2006/05/30(火) 16:52:49
そもそもそれをやりたい理由が分からん
695デフォルトの名無しさん:2006/05/30(火) 16:57:25
>>693
1バイト文字限定
wstring ws = L"hello";
string str(ws.begin(), ws.end());

2バイト文字は文字コード変換をかますしかないだろ
696デフォルトの名無しさん:2006/05/30(火) 16:59:22
>>693
そのURLの話は、wstringもstringも関係ない。

それはともかく標準C/C++ではwcstombsとか、std::convertとか。
ttp://hw001.gate01.com/eggplant/tcf/cpp/strcnv.hpp
697693:2006/05/30(火) 17:01:58
すみません、おかしな質問をしてしまいました。
目的は、MeCab というライブラリを使うことなのです。
http://mecab.sourceforge.jp/libmecab.html

まだ良く分かっていないのですが、基本的にCで利用するような仕様で、元デー
タとして char * 型のデータしか与えられないようなのです。

しかし、その結果を処理するには、wstring型のほうが遥かに便利です。
そこで、MeCabとの入出力の部分で
wstring ←→ string ←→ char * という変換を行おうと思っていました。
698デフォルトの名無しさん:2006/05/30(火) 17:13:28
std::convertなんてあったっけ?
699693:2006/05/30(火) 17:39:06
ありがとうございます。std::codecvt ですね。
>>696 のリンク先は、実は見つけていたのですが、自分には分かりづらくて、
もっと単純なやり方はないものかと思っていました。
どうやら、C++ではこれが正しいやり方なのですね。気合を入れて読み込んでみます。
700デフォルトの名無しさん:2006/05/30(火) 21:41:12
すみません、一つ伺いたいのですが

void hoge(void)
{
  static aaa = 1;

  aaa++;
}
としたときに、aaa++;のところでアクセスブレークエラーなるものになりました。
なぜでしょうか?
701デフォルトの名無しさん:2006/05/30(火) 21:51:00
さあaaaの型を決める作業に戻るんだ
702デフォルトの名無しさん:2006/05/30(火) 21:51:58
すみません

void hoge(void)
{
  static int aaa = 1;

  aaa++;
}
でした。
書きミスです。
703デフォルトの名無しさん:2006/05/30(火) 21:59:31
環境も書かずに(ry
704デフォルトの名無しさん:2006/05/30(火) 22:02:48
すみません。原因はわかりました。
ただ今解決するため、修正中です。

また一つ勉強になりました。プログラム作りも大変ですね。
705デフォルトの名無しさん :2006/05/30(火) 23:52:36
すいません教えてください以下のようにソース書いてたのですが
class StrType{
char *p;
public:
StrType(){p = NULL;}
StrType(char *Array);
~StrType(){ delete p;}
StrType(const StrType &STobj);
StrType &operator=(StrType &STobj);
StrType &operator+=(StrType &STobj);
char *Get();
friend StrType operator+(StrType &STobj);
};
StrType::StrType(char *Array){・・・}
StrType::StrType(const StrType &STobj){・・・}
StrType &StrType::operator =(StrType &STobj){・・・}
StrType &StrType::operator +=(StrType &STobj){・・・}
char *StrType::Get()
{return this->p;}
StrType operator+(StrType &STobj1, StrType &STobj2)
{
StrType Temp;
Temp.Get() = new char [strlen(STobj1.Get()) + strlen(STobj2.Get()) +1];
strcpy(Temp.Get(), strcat(STobj1.Get(), STobj2.Get()));
return Temp;
}
最後のoperator+の構文がうまくいかないです。
以前ここで、四則演算の演算子のオーバーロードはフレンドが好ましいと聞いたので
フレンドでなんとかやろうとしてるんですが、上手くいかないです。
Temp.Get() = new char [s・・・の式の左のオペラントが正しくないとエラーがでます。
メンバにしてしまえばいけるんですが。
こういう場合はメンバにするしかないんでしょうか。教えてください。
706デフォルトの名無しさん:2006/05/30(火) 23:59:27
-char *StrType::Get();
+char *&StrType::Get();
707705:2006/05/31(水) 00:18:21
>>706
はー、なるほど
参照のポインタで返せば良いんですか。
そっか。ありがとうございました。また知恵つきました。
ところで、-charと+charとはいったいなんなんでしょう。
そこも教えて欲しいです。
すいませんがお願いします。
708デフォルトの名無しさん:2006/05/31(水) 00:24:31
>>707
706でないけど、
-の行を削除して+の行を追加しろという事。
正誤表みたいなもん。

しかし、friendについて、ちゃんと勉強したのかい?
わけもわからず使っても意味ないと思うのだが。
709708:2006/05/31(水) 00:32:09
突っ込み所が多いんだが、まず、

-friend StrType operator+(StrType &STobj);
+friend StrType operator+(StrType &, StrType &);


friend 宣言した関数からは、クラスのプライベートにアクセスできる。
この場合、StrType operator+(StrType &STobj1, StrType &STobj2)
だから、宣言の引数も2つないと意味がない。
710708:2006/05/31(水) 00:35:05
次に、
friend宣言したのなら、StrType クラスのpに直接アクセスできる。
だから、char *Get(); なんていらない。

-Temp.Get() = new char [strlen(STobj1.Get()) + strlen(STobj2.Get()) +1];
+Temp.p = new char [strlen(STobj1.p) + strlen(STobj2.p) +1];
711708:2006/05/31(水) 00:40:06
さらに、
strcat()の使い方を間違えてる。

strcat()は、最初の引数のメモリに文字列を追加する。
だから、
strcat(STobj1.Get(), STobj2.Get()));
だと、STobj1に充分なメモリがないとメモリ破壊が起きる。

メモリを確保したのはTempなので、以下の様にすべき。
strcpy(Temp.p, STobj1.p);
strcat(Temp.p, STobj2.p);
712708:2006/05/31(水) 00:47:39
また、
デストラクタでdelete p;としているが、これは、delete[] p; とすべき。

配列としてnewしたら、配列としてdeleteする。
↓参照
ttp://ray.sakura.ne.jp/tips/delete.html
713708:2006/05/31(水) 00:58:16
>>712 に関連するが、
デストラクタでdelete するのなら、
コンストラクタでnewした方が良い。
引数で渡されるポインタ先のメモリをどこが廃棄すべきか明確でない。
そもそも、コンストラクタのポインタがnewで確保されたかどうかわからない。

StrType(char *Array){
 p=new char[strlen(Array)+1];
 strcpy(p, Array);
};

~StrType(){ delete[] p;}
714708:2006/05/31(水) 01:06:44
根本的なつっこみとしては、

「初心者は friend なんか使うな」

friend は、オブジェクト指向の情報隠蔽を部分的に無効にする。
必要性をよく見極めて使わなくてはならない。
715705:2006/05/31(水) 01:09:29
なんかえらいつっこみますね
ええ、書いてて自分で気づきましたよ
friendの宣言と定義で引数がちがって、別物になってるって
strcat()の文も書き直し済みです
deleteもわかってます。
単に、friendしたのに上手くいかないなと思って
定義ばっかなんども書きなおして見直してそれで
わからず書き込んだら。
706さんが一発回答くださったので、それで十分です。
ソースながめて、「あ、さっき書き込んだやつ訂正しなきゃ」と思って
またソース書き込むと見るほうは大変だと思いますしね。
ですので沢山の訂正は、ありがたいですが、それらの部分は了解済みです。
716デフォルトの名無しさん:2006/05/31(水) 01:15:44
708 (´・ω・) カワイソス
717デフォルトの名無しさん:2006/05/31(水) 01:17:09
負け犬ほどよく吠えるって事か。
718デフォルトの名無しさん:2006/05/31(水) 01:54:03
現在、入門書とC言語入門 シニア編を読み終えた程度のものです。
ここからどういった参考書で勉強すればいいのかよくわかりません。
レベル的には初級〜中級くらいだと思うのですが、
みなさんならどういった参考書を買いますか?orどういった勉強をしますか?
719デフォルトの名無しさん:2006/05/31(水) 02:24:16
>>715
今度から、ほんとうに書いてて気づいた時には、書き込む前に直しましょうね。このクズが。
720デフォルトの名無しさん :2006/05/31(水) 02:32:44
>>718
逆アセンブルしてどういう風に動いているのかを見ながら、アセンブラをかじりつつ
コンソールアプリも飽きたでしょうから、WIN32apiでウィンドウズプログラミングに
挑戦しながら、C++を勉強していけば良いんじゃないっすか。
ただ、俺もシニア編持ってるけど、線形リスト、双方向リスト、環状リスト
挿入ソート、シェルソート、選択ソートにバブルソートでヒープソートに
クイックソート。検索法や、ファイル処理。
きっとまだやれることはいっぱいあるけど、まぁ、あれだ。
一気に何かやるんじゃなくて、順序よく色々勉強していけば良いんではないでしょうか。
色々なサイトを見て、「こんな事ができるんだ」と知り、宿題スレの人の宿題
解いてみたり。数独とかのパズルを解く方法考えたり(俺は思いつかないけど)。
とにかくお互いがんばろう。
721705:2006/05/31(水) 03:02:07
なんだよ、やっぱむかつてたんだ。
別にクズでいいよ。
ただ、一番意味わかんなかったのは、コンストラクタの中身
俺、書き込んで無いのに、注釈つけるし
最後には「初心者はfriendなんか使うな」だもんな〜
それって、friendに関して勉強するなって事なのか?
中級者になってはじめてfriendを使えって事なのか?
ま、良いけどさ、前にここで演算子のオーバーロードの質問
したとき四則演算はfriendを使うべきだよと言われたから
使うようにしてて、で下手くそなソースさらして、この部分が
わからないから教えてくださいと言ったら>>706さんが即答
してくれて・・・・
わけわかんねーよ。俺、それ以外質問してねーもん。
それも人を上目線からみるような書き方して
friend使うな。クズが。って書かれて感謝しろってのが無理だよ。
722デフォルトの名無しさん:2006/05/31(水) 03:39:32
>>721
わたしは >>708 ではありませんが、それぞれの指摘には
全部理由が添えてありますので、読んでやれよカス。

ちなみに >>706 みたいな解決する奴は腹を切って死ぬべきだ。
おそらく >>706 はそれを知りながら、いくばくかの悪意を込めて書いています。
723デフォルトの名無しさん:2006/05/31(水) 03:44:18
他人の指摘に謙虚でない者は成長しない。

operator+にfriendは不要。
operator+はoperator+=で実装すべき。
そしてconstはコピーコンストラクタ以外でも正しく定義せよ。

という内容のお節介を普段の俺なら書きたいところだが、
「そんなことは俺は質問してない!」
とか逆切れされそうなので詳細は書かないでおく。
724デフォルトの名無しさん:2006/05/31(水) 04:25:38
ざっと見ただけだが、721はすっげえバカで無礼な厨房だな。
721は劣等感をやばいぐらいに持ってるリアル厨房かな。
だったらああ言っちゃうのもわかるけど。俺も昔はその部類だったから。
ま、勉強してりゃ少しはマシになるだろ。でなきゃいずれ大変な思いをするだけだ。
725708:2006/05/31(水) 05:08:12
>>721
>なんだよ、やっぱむかつてたんだ。
うん、むかついた。 むかつきすぎてレスできなかったw
だから、>>719 >>717 は私のレスではないよ。

まぁ、キミが怒る理由は想像できる。
私の書き方が「人を上目線からみるような書き方」と
感じるキミの感性は正しいからね。

でもさ、書いてある内容は親切なつもりで書いているのさ。
friendの宣言とstrcat()とdeleteに関しては余計だったようだね。
ごめんよw
だけど、こっちはキミの力量なんか知りようがないからね。
726708:2006/05/31(水) 05:16:54
>>721
>ただ、一番意味わかんなかったのは、コンストラクタの中身
>俺、書き込んで無いのに、注釈つけるし

それはね。多分コンストラクタでnewしてないと思ったからさ。
コンストラクタでnewしてたかい?
もし、してたらメモリーリークを起こすよ。
キミはStrType operator+(StrType &STobj1, StrType &STobj2)で
newしたポインタをStrTypeクラスのpに代入してるよね?
デストラクタでdeleteされるのはこのメモリだ。
じゃ、コンストラクタでnewしたメモリは誰がdeleteする?

コンストラクタでnewしてデストラクタでdeleteするのは定石みたいなもんだ。
覚えといて損はないよ。
727デフォルトの名無しさん:2006/05/31(水) 05:19:49
>>715
突っ込まれるようなソース貼っておいて、随分と偉そうだねぇ。
君は「謙虚」という言葉の意味を学ぶべきだ。
728デフォルトの名無しさん:2006/05/31(水) 05:28:34
>>721
>それって、friendに関して勉強するなって事なのか?
>中級者になってはじめてfriendを使えって事なのか?

勉強するなとは言わない。でも使わない方が良い。
キミは、friend を使う段階にはいない。
まず、情報隠蔽を勉強しなさい。

まぁ、キミが趣味でプログラミングするだけなら、
余計なお世話だけどね。
これは、プロを目指す人向けの忠告。

良質なプログラムを作るつもりがないなら忘れて下さい。
729708:2006/05/31(水) 05:31:10
あっ、>>728 は私が書いたレスね。
それ以外の708と書いてないのは他の人だから、間違えないでね>>721
730708:2006/05/31(水) 06:27:33
ああ、ごめんよ〜。
Tempはデフォルトコンストラクタで生成してるから
メモリリークは起きないな。
私の勘違いだ。ゴメンよ。
731デフォルトの名無しさん:2006/05/31(水) 06:49:15
>別にクズでいいよ。
クズのままでいたいっていうなら質問するなよ。

>人を上目線からみるような書き方
実際はどうなんだ?もしかして上にいるつもりだったの?

>感謝しろってのが無理だよ。
いやいや。事実を教えてもらったんだから感謝してしかるべき。
732デフォルトの名無しさん:2006/05/31(水) 06:59:50
まあ別にfriendなんて無くても大抵は困らない。
でも、たまにあると便利なときはある。
733デフォルトの名無しさん:2006/05/31(水) 07:03:57
>702>704

原因は何だったの?
734デフォルトの名無しさん:2006/05/31(水) 10:39:50
何一つできない馬鹿が
無根拠なプライドをフルパワーで守りだすと
手が付けられないんだよね。

そんなことに頭を割いて生きてるから
いつまで経っても何一つできるようにならないってのに。
735705:2006/05/31(水) 10:54:37
>>708さん
まぁ、俺もむかついたわけ。初心者じゃなくて入門者って言えば良いのか
ようは、まだ勉強中の身だからこそ、ああいう質問したわけで、その結果
色々な、内容の最後に「初心者はfriend使うな」と書かれちゃ
「じゃぁ、勉強すんなってか?実際打ち込んで経験積まんと
知識すら身につかねーだろ」と思い
わざとらしく「要望してない不必要な注釈と講釈はいらん」と
軽くむかつくだろうなという感じの文体で書きました。
ただ、これだけは信じてくださいな。
ここにfriendの質問した後、ソースながめて「あ、バッファたりねえ」と思い
自分のアップしてしまったソースの内容を、変更して、「これでバッファは足りるは」
って思って見たらスレ見たら>>506さんの内容があって、へーなるほどなと思い
さらに質問した後に、>>708さんの書き込みがあって
そんで最後の「初心者はfriend使うな」で、「なんだこいつ」と思ったわけですわ。

ま、>>708さんが>>725で「ごめんよ」と先に謝った以上俺の方が精神的にまだガキ
って事っすね。
自分の力量が相手にわかるわけでもないのに
補足説明をしてもらっているにもかかわらず、馬鹿レスして申し訳ありませんでした。


736デフォルトの名無しさん:2006/05/31(水) 11:05:19
705は朝鮮人
737デフォルトの名無しさん:2006/05/31(水) 11:53:09
ここまで誰一人説得させられない支離滅裂な長文は
この板ではなかなか見られないよね。
738デフォルトの名無しさん:2006/05/31(水) 12:27:06
知ってたけど間違えました?
テストの点が悪い小学生の言い訳だ。
間違えたという事実があり、そしてその事実が重要だろう。
739デフォルトの名無しさん:2006/05/31(水) 13:11:11
>>705を晒しage待遇とする。
740デフォルトの名無しさん:2006/05/31(水) 13:34:46
>>735
俺も「初心者はfriend使うな」という類のお節介は嫌いだし、
おまえが腹を立てるのも理解できるが、>>715はどうかと思う。

アドバイスが自分にとって役に立たないと思うなら礼だけ言って気にしなければいいし、
それも嫌ならスルーするのもアリだと思うが、
善意の回答者に嫌味を言うのは、無闇に人を不愉快にさせるだけで、
うまくないんじゃないだろうか。
741724:2006/05/31(水) 13:36:37
>>735
親切心で教えてくれているのに、あの態度はないだろう。
言う前にどんどん吸収していけばいいのに。
以前こういう言葉を見たことがある。
「忠告ほど他人が気前よく与えるものはない」
親切心から何かをしてくれる人なんてそうそういないんだよ。
大人になれば君のことなんて誰からも相手をされないよ。
もちろん君だけじゃなくて、みんながそうだけど。
なぜなら利害の関係になってしまうから。
>そんで最後の「初心者はfriend使うな」で、「なんだこいつ」と思ったわけですわ。
うまく使えばいいテクニックでも初心者が使っていて逆に危なくなってたら
「やめろ」とも言いたくなるだろ。いつまでも気がつかずに使っていくかもしれんしな。
742デフォルトの名無しさん:2006/05/31(水) 14:01:26 BE:69877049-#
「初心者はfriend使うな」が引っかかったのなら、なぜそうなのかを論理的に突っ込んで
議論すればいいだけなんだな。
743デフォルトの名無しさん:2006/05/31(水) 14:03:15
これがかの有名な「火病」って奴ですか。
744デフォルトの名無しさん:2006/05/31(水) 14:34:18
friend が必要になるのなんて、
よっぽど結合の強いクラスだけだな。
friend なんて滅多に必要にならない。
friend を使おうとした場合は、
大抵は設計がマズいから必要になってしまうだけ。
friend を使ってしまうよりは、
friend を使わずにどう実装すればいいかを
考えたり調べたりする方がよっぽど勉強になる。
それで無理なら friend を使わざるを得ない状況なのだと思っておけばいい。

friend を使うこと自体は別に難しいもんじゃないわけだし、
特別 friend について勉強するべき事は無いな。
745デフォルトの名無しさん:2006/05/31(水) 14:54:18
friend って、publicでstaticなメソッドと大差ないと思うけど、
そっちのほうは使うなって人はいないね。

746デフォルトの名無しさん:2006/05/31(水) 15:04:07 BE:15528724-#
staticでpublicなメソッドからはメンバ変数にアクセスできませんが。
747701:2006/05/31(水) 15:08:52
>700
Cの仕様では型宣言子がないとintとみなす(参照:K&R P261)ので700でも一応間違いじゃなかった。すまん。
C++だと無効だが。
748デフォルトの名無しさん:2006/05/31(水) 15:10:35
> friend
偶々といえば偶々だけど、ここ2年くらい使ったことないや。
コード上でも実生活でも友達少ない人間ですから。
749デフォルトの名無しさん:2006/05/31(水) 15:13:06
誰が上手い事を言えと
750デフォルトの名無しさん:2006/05/31(水) 15:14:18
比較演算子のオーバーライドをする際は大抵friendなグローバル関数にするがな。
751デフォルトの名無しさん:2006/05/31(水) 15:14:18
>>746
え? アクセスできるでしょ?
752デフォルトの名無しさん:2006/05/31(水) 15:20:33
>>751
staticメンバ変数にはアクセスできる
非staticメンバ変数はダメ
thisがないのだから当たり前っちゃ当たり前
753デフォルトの名無しさん:2006/05/31(水) 15:26:57
>>752
thisが無いのはfreindも同じでしょ?
インスタンスを渡してもらえば、privateな(staticでない)メンバ変数に
アクセスできるってのも、両者同じ。

754デフォルトの名無しさん:2006/05/31(水) 15:32:49
>>750
operator<<も
755デフォルトの名無しさん:2006/05/31(水) 15:33:55
このへんについて一番簡潔な説明だと思うのは、禿本の11.5の冒頭。
756デフォルトの名無しさん:2006/05/31(水) 18:07:20
皆さんが薦める
初心者でもプログラミングがよくわかる参考書あるいはサイトを
教えていただけないでしょうか?
ちなみに↓がうちの大学で使ってる資料です。
http://www.amazon.co.jp/exec/obidos/ASIN/4274064409/
正直めちゃくちゃ分かり難く教授以外、生徒皆認めてません。

こういうのはマルチっていうのかな・・・。
そうだったら、すみません。
757デフォルトの名無しさん:2006/05/31(水) 18:47:14
>>756
推薦図書/必読書のためのスレッド PART31
http://pc8.2ch.net/test/read.cgi/tech/1146122168/
758デフォルトの名無しさん:2006/05/31(水) 20:38:35 BE:74885235-#
>>756
レビューは評価高いじゃん。
759デフォルトの名無しさん:2006/05/31(水) 20:38:41
OOPLに慣れてるなら、初心者でもかまわんだろうけど
C++が初めてのOOPなら、あんまり凝ったことしないほうがいいだろうね。
760デフォルトの名無しさん:2006/05/31(水) 20:59:06
>>756
それ俺持ってる。
わかり易いかどうかはともかくCのソースをぱっと見て
だいたいどういうプログラムか判断付くまでのレベルの本。
関数とか結構わかりやすいと思ったけど教材のせいにしてたら
いつまでたっても身につかんと思うのでとりあえずやってみれ。
761デフォルトの名無しさん:2006/06/01(木) 00:09:54
>733
答えは簡単でした。static変数はROMに割り当てられているので
ROM→RAMにコピーし忘れてました。
そのため、ROMにライトしてエラーになりました。

また、関数をROMにおき、関数ポインタを構造体の中で定義し
アクセスしようとすると、ROM→RAM展開前にその関数を呼ぶと
とんでもないことになったりします。

なかなか難しいですね。
762デフォルトの名無しさん:2006/06/01(木) 00:16:32 BE:59908526-#
staticがROMに?
763デフォルトの名無しさん:2006/06/01(木) 00:28:43
ROMが右手オナニーメンバーという訳じゃなければ認識を間違えているな。
764デフォルトの名無しさん:2006/06/01(木) 00:48:35
というかまず環境を書けと
765デフォルトの名無しさん:2006/06/01(木) 00:57:18 BE:27175027-#
定数で初期化してるからじゃね?
766デフォルトの名無しさん:2006/06/01(木) 01:06:04 BE:89861292-#
定数で初期化とどういう関係が?
767デフォルトの名無しさん:2006/06/01(木) 01:26:44
そもそも761は組み込み系じゃないの?
俺もそっちの方面だからよくわかるが、ここにいる人は
そもそも、そのような方面の人は少ないから
ROM→RAMだのいってもわからんと思うよ。

住む世界が違うんだし。
768デフォルトの名無しさん:2006/06/01(木) 01:28:58
自分でスタートアップ書かないといけない環境なんだろ。
ROM 環境ではよくあることだ。
769デフォルトの名無しさん:2006/06/01(木) 01:35:56 BE:139784674-#
いやいや、同じCの世界だもん。
とりあえず説明してみてよ。

> 関数ポインタを構造体の中で定義し
> アクセスしようとすると、ROM→RAM展開前にその関数を呼ぶと
> とんでもないことになったりします。

ここらへんとか興味ある。
「ROM→RAM展開前」って、なにを「展開」してるの?
770デフォルトの名無しさん:2006/06/01(木) 01:47:49
>>768
const でない静的変数で初期値を持つものをコピーする操作のことだろう。
この操作は main() の前に行う。 main() の前に実行されるコードを
一般的にスタートアップコードという。スタートアップはコンパイラが
自動的に提供してくれることもあるが、 ROM を意識するような環境では
プログラマが自分で書く、または書くこともできるようになっている。

参照:
http://www.google.co.jp/search?q=%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97+data+bss
771770:2006/06/01(木) 01:48:58
あれ?アンカーミスったよ。
>>770>>769 宛て。
ちなみに 770 = 768 ね。
772デフォルトの名無しさん:2006/06/01(木) 02:06:25 BE:104838473-#
>>770
> 答えは簡単でした。static変数はROMに割り当てられているので
> ROM→RAMにコピーし忘れてました。
> そのため、ROMにライトしてエラーになりました。

↑さっぱり意味がわかりません。
773デフォルトの名無しさん:2006/06/01(木) 02:19:33
>>772
あぁこれはスタートアップだけじゃわからんな。

こういう環境ではメモリの配置もリンカの引数や専用のスクリプトで制御することができる。
プログラム内でメモリを使用するものは、用途ごとにセクションと呼ばれるものに
分けられる。一般的には以下の4つ。
 text: プログラム
 rodata: 読み取り専用データ(定数)
 data: 0以外の初期値を持つ変数
 bss: 全ビット 0 で初期化される変数
C言語の要素ではだいたい以下のようにわけられる。
 int text() {}
 int const rodata = 0;
 int data = 1;
 int bss;
リンカへの指定を間違えて data を ROM に配置してしまうと、 >>761 になる。
実際に間違えてるのか意図的にやってるのかどうかはわからん。
774デフォルトの名無しさん:2006/06/01(木) 02:30:22 BE:179722894-#
リンカの指定のミスで、初期値ありのstatic変数がROMになって、
スタートアップルーチンのミスで、関数のポインタがとんでもない
ことになる?

なかなか大変ですな。
775デフォルトの名無しさん:2006/06/01(木) 02:38:38
そうなのか。
static変数自体はRAMで初期値がROMなんじゃないかとも思ったんだが。
776デフォルトの名無しさん:2006/06/01(木) 02:43:42
>>775
そうそう。そのせいで data セクションに関するリンカへの指定
および対応するスタートアップでの処理はちょっとややこしいことになる。
そんなわけで data は ROM に置いてしまって bss + 明示的な初期化で
代用してしまう方法もよく見る。
777デフォルトの名無しさん:2006/06/01(木) 08:06:05
俺のやってる環境(HEWという統合環境)

1.初期値を持つデータをまずROMセクションに配置(リンカの設定、仮にDDATAセクションとする)
2.同じようにRAMにもセクションを設定(リンカの設定、仮にRDATAセクションとする)
3.ROM→RAMセクション割り当てでDDATA→RDATAになるようにリンカを設定
4.電源投入後の処理の中でROMに割り当てられたDDATA領域をmemcpyなどでRDATA領域へコピー
5.他の関数などがstatic変数にアクセスするときはRDATAにある変数を参照する

注意1:4でコピーする前にstatic変数にアクセスするとごみを参照してしまう。
注意2:リンカで3の設定をしないと、いくらDDATA→RDATAへコピーしても
     ROMに割り当てられたDDATAを参照するため、ライトエラーになる。

そのため、関数ポインタを持つ構造体を、初期設定処理などで定義するならばともかく
最初から定義していると、ROMにおかれ、RAMへコピーする前にその構造体を使って
関数をコールすると、うまくいかなくなる。

仮に、別セクションに割り振って、ROM配置にした場合、うまくいくが、その構造体に
関数ポインタだけでなく、変数などを定義していた場合(CをC++っぽくした場合など)
は、やはりROMへライトしようとするのでエラーとなる。

ROMからRAMへコピーして実行する理由として処理速度の向上などもある。
778デフォルトの名無しさん:2006/06/01(木) 12:20:00
>>777
あー RAM に関数置いてるのね。そんなの言われないとわかんねーよ。
RAM に置きたい関数は DDATA に吐くか、 DDATA と同様に処理してやればよいと思われ。
779デフォルトの名無しさん:2006/06/01(木) 18:38:52
今までWindowsでプログラムをしていて、今回初めてLinux+gccを使っているんですが、
セグメンテーション違反は、try〜catchで捕らえられないのでしょうか?

Windowsの時と同じ感覚で、try〜catchで捕らえようとしても、
セグメンテーション違反が起きると、そこで必ず終了してしまいます。
780デフォルトの名無しさん:2006/06/01(木) 18:41:00
>>779
例外処理について勉強しなおすべし
781デフォルトの名無しさん:2006/06/01(木) 19:59:14
エクセルでVBが出来ることを知って
これは面白いと思ったんだけど
なんか似たようなおすすめのツールとかビルダーみたいな
ものはないだろうか。
782デフォルトの名無しさん:2006/06/01(木) 20:01:08
>>779
その通りです
783デフォルトの名無しさん:2006/06/01(木) 20:27:43
>>781
なんでCスレで聞くの
784デフォルトの名無しさん:2006/06/01(木) 20:32:51
>>783
あー
前々からC++やりたいなと思ってて
エクセルでプログラムの面白さを改めて知って
Cで分かりやすいソフトあったらいいなと
よく考えたら確かにおかしかったな
785デフォルトの名無しさん:2006/06/01(木) 21:24:42
>>779
むしろそれで捕まえられるWindowsの方が特殊。
例外処理をOSが支援していて、そんなこともできるようになっている。

基本的にtry 〜 catchで捕まえられるのはthrowで投げた例外だけ。
786デフォルトの名無しさん:2006/06/01(木) 21:57:51
>>782
>>785
そうでしたか。どうもtry〜catchに頼りすぎてたみたいです。
ありがとうございました。
787デフォルトの名無しさん:2006/06/02(金) 01:20:39
786(=779?)さんは納得しちゃったみたいだけど…。

じゃ、Windows以外の時、どういうコーディングしてるのか激しく疑問。
unix系の場合シグナルハンドラを定義するんだろうけど、
ちょっと調べたら、gccだと、シグナルハンドラから例外をthrowできないんだよね?
TRY/CATCHマクロがあるみたいだけど、これならシグナルをcatchできるの?
788デフォルトの名無しさん:2006/06/02(金) 06:42:34
代入演算子の多重定義で、代入演算子はフレンド関数として定義できませんが、
クラス内のメンバをコピーする際に、プライベートのメンバはどのようにしてコピーすればよいのでしょうか?

789デフォルトの名無しさん:2006/06/02(金) 06:58:55
>>788
ExceptionalC++のオーバーロードのガイドラインより

・=, (), []と->は、メンバ関数にしなければならない
790デフォルトの名無しさん:2006/06/02(金) 09:28:11
>>788
なぜメンバ関数にしない?
791デフォルトの名無しさん:2006/06/02(金) 11:05:44
そもそもセグメンテーション違反をcatchで捕らえて何をしたいんだ?
792787:2006/06/02(金) 11:53:41
>>791
フェールソフトの考えに基づく処理。
具体的にパッと思いつくのは、
例えば、大量のデータを処理している時に、
エラーの発生したデータに関してログを出力して、
次のデータから処理を続行するとかかな。
793デフォルトの名無しさん:2006/06/02(金) 11:56:18
そもそもセグメンテーションフォルトは、不正なデータが入力されたことよりも
不正なデータに対応できないプログラム側のチェック不備なんだから
そのまま処理を継続したってロクなことがないだろ
794787:2006/06/02(金) 12:14:10
>>793
まぁ、考え方はいろいろだと思いますが…。
あまり、必要性の細かい点まで議論するつもりはないので。


「unix系ではシグナルに起因するエラーをtry/catchする方法はない」
と考えて良いのでしょうか >>all
795787:2006/06/02(金) 12:19:07
質問訂正。
「try/catchする方法」
 ↓
「try/catchもしくは、代替手段」

「最初っから言ってんだろ」とか書かれそうだw
796787:2006/06/02(金) 12:30:13
longjump使えばできるのかな?
なんかめんどいコーディングになりそうだけど…。
797デフォルトの名無しさん:2006/06/02(金) 12:32:27
ふつーにシグナルハンドラで処理してログ吐いて落とすしかないと思われ。
longjmpで強制的に飛ばすことはできるけど、局所オブジェクトの解体が正常に行われないから
制御が復帰してもメモリリークしてる。
798デフォルトの名無しさん:2006/06/02(金) 12:32:34
どこまでのことをしたいのかワカランが、
とりあえず signal では無理な処理をしたいのか?
799デフォルトの名無しさん:2006/06/02(金) 12:35:42
Windowsではセグメンテーション違反をtry/catchで捕まえられたっけか?
SEH(__try/__except)を使えば可能だけど、C++標準の例外では無理だったような…
800デフォルトの名無しさん:2006/06/02(金) 12:37:45
catch(...) で捕まえられなかったっけ? >Windows
801デフォルトの名無しさん:2006/06/02(金) 12:40:53
VC++8.0では、

try {
 int m=0xDEADBEEF;
 int i = *(int *)m;
} catch(...) {
}

でUnhandled exception扱いにされたが…
Releaseビルドだと問答無用で強制終了。
802デフォルトの名無しさん:2006/06/02(金) 12:42:38
何か変わったのかな・・・。それとも別のエラーだったっけ。
803787:2006/06/02(金) 12:54:29
>>797
そうですか。ありがとうございます。
やっぱり普通はアプリを落としちゃうんですね。

>>798
いや、具体的に困ってる訳ではないです。
今後、unix系のお仕事をやる時の参考にしたかったんです。
すみません。

>>799-802
私の場合、::_set_se_translator()で組み込んだハンドラで例外をthrowしてます。
804デフォルトの名無しさん:2006/06/02(金) 13:02:57
>>803
SEHをC++の例外に関連づけるわけですね、なるほど。
移植性はないけど、リリース時に組み込むと結構使えるやも。
805デフォルトの名無しさん:2006/06/02(金) 16:33:05
>>801
2003ではキャッチできるな
806デフォルトの名無しさん:2006/06/02(金) 19:51:10
>>805
本当だ。ランタイムの仕様が変わったかな?
807デフォルトの名無しさん:2006/06/02(金) 19:54:58
VC2005では、SEHを通常の例外として扱う設定がデフォルトでオフになっている
言語仕様を尊重したのかね
808デフォルトの名無しさん:2006/06/02(金) 22:12:07
>>807
処理効率を優先したんだよ。
SEH まで考慮すると throw() が書いてあるとか C 標準関数だとか
C++ 例外が起こりえないケースを最適化できない。
809デフォルトの名無しさん:2006/06/02(金) 23:45:53
すいません質問です。

WinXPにて、Borland C++ Compiler 5.5を使っています。
あるC言語ファイルをコンパイルに際し、imagehlp.libが開けないというエラーが・・・
落として入れなおしても駄目でした。
エラーが出なくなる方法について、お知恵をお貸しください。
810デフォルトの名無しさん:2006/06/03(土) 00:08:11
>>809
implibでimagehlp.libを作ればよい。
811デフォルトの名無しさん:2006/06/03(土) 04:04:46
VisalStudio.NETでC++を書いているのですが
コンパイルする度に挙動が変わる状態に…。
一度こんな状態に陥ると、もう泥沼ですね…
参照設定しているDLLは全てC♯製なので、そもそもそれも無茶な話なのかもしれない…
みなさんはコンパイルする度に動作が変わったとき、どうやって切り抜けます?(T-T)

…すれ違いな質問でしたかね。
悲しくなって、つい聞いちゃいました。
チラシの裏スマソ。
812デフォルトの名無しさん:2006/06/03(土) 04:40:12
>>811
そもそもC++.NETからC♯を呼び出そうとする時点で
激しく危険な気がするのだが。。。。。。
813デフォルトの名無しさん:2006/06/03(土) 08:19:22
>>812
そうか?
814デフォルトの名無しさん:2006/06/03(土) 08:28:51
C#とC++.NETは競合するので無理です(笑)
815デフォルトの名無しさん:2006/06/03(土) 08:39:14
MS的には.NETなら多言語間でやりとりできる云々とか言っていなかったっけ?
816デフォルトの名無しさん:2006/06/03(土) 09:22:31
発言をよく読むと展望しか語っていないのがMSクオリティ
817デフォルトの名無しさん:2006/06/03(土) 11:45:02
すみません。分からない事があったので質問に来ました。

void mat_add2(int(*)[COL],int(*)[COL]);
といった、2次元配列を2つ引数に取る関数を使った練習問題があったので
そのmain関数に2次元動的配列を動かそうとしたのですが、
型が違うと言うエラーが出て来ました。その解決法を
伺いに参りました。

以下に、コード全文を貼り付けます
#include<stdio.h>
#include<stdlib.h>

#define ROW 3
#define COL 4

void mat_add2(int(*)[COL],int(*)[COL]);

int main()
{
int a[][COL]={01,02,03,04,11,12,13,14,21,22,23,24};
int b[][COL]={10,10,10,10,20,20,20,20,30,30,30,30};

int** c;
int i,j;

mat_add2(a,b);
818817:2006/06/03(土) 11:46:27
続きます
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
printf("%02d ",a[i][j]);
}
printf("\n");
}
c=(int**)malloc(sizeof(int**)*COL);
for(i=0;i<ROW;i++)
{
c[i]=(int*)malloc(sizeof(int)*ROW);
}
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
c[i][j]=i*j;
}
}
printf("\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
}
819817:2006/06/03(土) 11:47:34
更に続きます
mat_add2(c,a);

printf("\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
}

printf("\n%p\n",a);
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
printf("%p ",&a[i][j]);
}
printf("\n");
}

for(i=0;i<COL;i++)
{
free(c[i]);
}
free(c);
return 0;
}
820817:2006/06/03(土) 11:50:18
これで最後です

void mat_add2(int(*x)[COL],int(*y)[COL])
{
int i,j;
for(i=0;i<COL;i++)
{
for(j=0;j<ROW;j++)
{
x[i][j] += y[i][j];
}
}
}

とある書籍にあった例題をもとに、動的配列cを扱えないかと作ったのですが
エラーは「関数はint(*)[4]でないint**は取れない」というものでした。

この場合、cをどのような形式にすべきでしょうか。
あるいは関数の型自体を変える場合、どのような引数型が望ましいでしょうか。

ご指導お願いします
821デフォルトの名無しさん:2006/06/03(土) 11:52:52
cをint (*c)[COL];にして、c = malloc(sizeof (int [COL]) * ROW);でいけると思う。
(その場合、forでcの各要素(c[i])に個別にmallocする必要は無い。)
822817:2006/06/03(土) 12:09:45
ありがとうございます。早速試してみます
823デフォルトの名無しさん:2006/06/03(土) 12:31:20
>>811

そもそも、コンパイルするたびに挙動が変わるっておかしくない?
同一ソースなら何回コンパイルしても同じになるでしょ?
挙動が違うように見えるだけで、ソースどおり動いているのでは?
824デフォルトの名無しさん:2006/06/03(土) 12:35:24
GCの気まぐれでスタック領域破壊してるだけじゃないの
825デフォルトの名無しさん:2006/06/03(土) 12:57:30
C++とJavaって、オブジェクト指向という観点で比べると、どういう所が違うんですか?
よく『C++はオブジェクト指向としては不十分』と聴きますが。
826デフォルトの名無しさん:2006/06/03(土) 13:15:54
>>811
どう切り抜けるも何も、単にバグがあるだけだろってな話で。
デバッグするだけだな。
827デフォルトの名無しさん:2006/06/03(土) 13:30:01
他人が作った部分にバグがあったら悲惨だけどな
828デフォルトの名無しさん:2006/06/03(土) 13:44:20
>>824
C++.NETならGCあるから勝手にガベージコレクタしてくれるから
領域壊すってことあるの?
>>811
参照設定の参照先があっているかを確認したほうがよくないか?
829デフォルトの名無しさん:2006/06/03(土) 15:08:13
スクリプト言語のライブラリ書いてたときに、GCで解放しちゃった領域に
アクセスするというなかなか再現しないバグに出くわしたときは、
データが壊れてないかこまめにチェックして結果をログファイルに書き込んで
原因絞り込んでた。
830デフォルトの名無しさん:2006/06/03(土) 15:28:34
うん?アクセスできる手段が残ってるのにガベコレに解放されちゃうの?
831デフォルトの名無しさん:2006/06/03(土) 15:50:03
生ポインタ使ってればガベコレは追跡できないからな
832デフォルトの名無しさん:2006/06/03(土) 16:00:45

整理すると
・ポインタを使用されてしまうと、アクセスできる手段があるか否かは、ガベコレには追跡できない
 ⇒勝手にガベコレに解放されてしまう可能性がある

え、そうなの!?
自分理解足りなかったかも
@mallocしたらfreeするまで解放されない
Anewしたらdeleteするまで解放されない
Bchar*などは、mallocしていないなら、使用されなくなったら、あるタイミングでガベージコレクタされる

と思ってたんですが。。。。。。
833デフォルトの名無しさん:2006/06/03(土) 16:04:33
>>832
C/C++にはガベージコレクション機能なんてありませんが
834832:2006/06/03(土) 16:14:45
もともとの>>811の質問に
参照設定をC♯〜〜云々の話から、.NET Framework上で稼動するC++.NETの
お話だと思ってたんですが。ちがってたらスマソorz

(一応【環境依存OK】とのことだったので
 純粋なC/C++の話限定ではないと思ってたんですが…)
835デフォルトの名無しさん:2006/06/03(土) 16:17:18
>>834へ

>>833はわかってていってんだと思うよ。
>>814>>828の文脈見ればこの板の住人ならおおよそわかるじゃないかw
836デフォルトの名無しさん:2006/06/03(土) 16:21:02
どちらにせよ832は勘違いしてないか?
C++/CLIを使う場合でも、ガベコレに管理させるにはgcnewを使わないといけないし
ポインタの解放忘れを追跡してくれないことには変わりないんだが
837デフォルトの名無しさん :2006/06/03(土) 16:27:50
>>834さん
一応わかってればいいっすけど
newしたものはdeleteするまでというより
ブロック抜けたら勝手にデストラクトしちゃうから
気をつけて(どういう構文かにもよりますが)
838デフォルトの名無しさん:2006/06/03(土) 16:28:12
@、Aはあってるよね。
Bは漏れにはちょっとわからん(.NETでなぜC++なんか使うの?VB.NETかC#にしろよw)

@とAって、まさに純粋なC/C++の話で、BはC++.NETの話、だろ。
C++.NETでもC++準拠のソースは書けるはずだから
「おれはGC利用しなくてもきっちりコーディングできる」
自信があるのなら、@、Aのみで作れば問題ない。
839デフォルトの名無しさん:2006/06/03(土) 16:34:29
>>838
それは大前提がおかしい。.netで開発する以上。netの便利な機能は活用すべき。
GCに頼らず全て自力でメモリ管理するなど愚の骨頂。
(もちろん明示的にfreeするのはかまわないが。)
コード上はGCがなくても問題ないように記述し、(つまりC/C++で問題ないレベルでコーディングし)
その上で、保険の意味でgcnewを活用すれば鉄板w
840デフォルトの名無しさん:2006/06/03(土) 16:46:13
>>837
>ブロック抜けたら勝手にデストラクト
って何の話なの? C++の話じゃないってことですよね?
(C++/CLIとか知らないのでスイマセン)
841デフォルトの名無しさん:2006/06/03(土) 16:52:21
部分的に自力でのメモリ管理をすることにメリットがあるなら、
それを理由に C/C++ を選択したと考えられなくもない。
GC 外した方がいい状況ってのも確かあった気がするが、
GC のある言語をあんま使ってないのでどういう状況だったかよく覚えてない。
842デフォルトの名無しさん :2006/06/03(土) 17:18:56
>>840
いや、C++だけど
単純な事を言いたかっただけです
例えば
int main()
{
{
ClassName obj;
}←このブロック抜けたらobjが破棄される

return 0;
}
ってだけの事を言いたかっただけです。
ま、コピーコンストラクタとか普通に装備しといて(その他うんぬんのメソッドも)
いれば別に問題は無いんで、特に気にせんでください。
843デフォルトの名無しさん:2006/06/03(土) 17:50:54
>>842
コード例まで載せていただきわかりやすかったです。

例で使用しているobjはブロック内で宣言したものだから
ブロック抜けると無効になるので、freeしてなくても破棄されちゃう、ということですね。
実際にコーディングする際は、ブロック内であっても意図的に
メモリ解放したい場合、freeする、という感じでしょうか。
844デフォルトの名無しさん:2006/06/03(土) 18:25:51
ローカルオブジェクトをfreeしちゃいかん
845デフォルトの名無しさん:2006/06/03(土) 18:52:48
質問です。
C言語のプログラムですが、1000とか2000行とか書いていても
バグが出にくい書き方とか、バグを見つけやすい方法とか
ありますか?
846デフォルトの名無しさん:2006/06/03(土) 19:01:01
あります
847デフォルトの名無しさん:2006/06/03(土) 19:02:09
どうすればいいですか?
848デフォルトの名無しさん:2006/06/03(土) 19:08:33
まずは1000行とか2000行も1個のファイルに詰め込まないことかな。

ともあれ、Webで無料で読める文書としては、
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/index.html
とか。
849デフォルトの名無しさん:2006/06/03(土) 19:21:35
どうもです。
見てみます。
850デフォルトの名無しさん :2006/06/03(土) 19:21:47
>>845さん
バグが出にくいかどうかは別だけど
一つの処理に対して、長くて100行ぐらいで収めておきましょう
あとは、>>848さんの言うとおり。
分割コンパイル。
ヘッダにはグローバル変数と関数の定義を忘れずにね
851デフォルトの名無しさん:2006/06/03(土) 20:25:54
変数の定義はインクルードファイルに書いてはいけません。
852デフォルトの名無しさん:2006/06/03(土) 20:52:11
>>850
どうもです。
分割コンパイルぐぐってみます。
853デフォルトの名無しさん:2006/06/03(土) 21:09:32
COMインターフェースを呼出す場合
構造体を使った例を良く見かけるのですが、
構造体のメンバーの夫々の変数値を取得するには
ポインタ(間接参照)で取得するのでしょうか?
854デフォルトの名無しさん:2006/06/03(土) 21:22:37
夫々?
855デフォルトの名無しさん:2006/06/03(土) 21:26:01
スマソ
夫々=それぞれ
856デフォルトの名無しさん:2006/06/03(土) 21:27:30
ホンマや・・・。よし、覚えた。
857デフォルトの名無しさん:2006/06/03(土) 21:37:24
で?答えはどうよ
858デフォルトの名無しさん:2006/06/03(土) 21:44:05
意味が微妙に分からんのでなんか例となるコードをくれ。
859デフォルトの名無しさん:2006/06/03(土) 21:46:21
COM のオブジェクトはスマートポインタかなんかじゃなかったけ?
使ったことないから知らんけど。
860デフォルトの名無しさん:2006/06/04(日) 10:05:33
>>853
いや、全部COMメソッド呼び出しでやる。
あの構造体を間接参照しても、おそらくろくなものは得られない。
861デフォルトの名無しさん :2006/06/04(日) 11:00:48
すいません初心者の質問です
上の>>853>>859>>860
で出てくるCOMメソッドって
アセンブラで書く.com形式のプログラム
とは別物なんですか?
862デフォルトの名無しさん:2006/06/04(日) 11:03:52
863デフォルトの名無しさん:2006/06/04(日) 12:33:54
コンパイラ何使ってる?
864デフォルトの名無しさん:2006/06/04(日) 12:45:35
VC++.NET2003(VC++.NET2005EE)
BCC5.5
GCC

用途に合わせて適当に切り替え
865デフォルトの名無しさん:2006/06/04(日) 20:36:08
>>825
C++についてよく言われるのは、GCがないことや多重継承があること。
そしてオブジェクト指向プログラミングだげが全てではないこと。
866デフォルトの名無しさん:2006/06/04(日) 21:53:28
C++相談室 part49
http://pc8.2ch.net/test/read.cgi/tech/1146185570/

埋まっちゃいましたが、私のホストでは次スレ立てられませんでした。
誰か宣言してスレ立てお願いします。
867デフォルトの名無しさん:2006/06/04(日) 23:34:18
868デフォルトの名無しさん:2006/06/04(日) 23:40:24
>>867
GJ!
869デフォルトの名無しさん:2006/06/05(月) 06:22:44
libjpegを使ってJPEGに変換したら画像がダウンサンプリングされていました。
ダウンサンプリングしないオプション設定はないのでしょうか?
870デフォルトの名無しさん:2006/06/05(月) 08:17:03
>>869
jpegについて勉強しましょう。
ロスレスだとサイズが大きくなるのがjpegです。
871デフォルトの名無しさん:2006/06/05(月) 09:07:28
>>870
えっとそうではなくて…。

libjpegでjpeg_set_qualityを100に指定し変換した画像のサイズが、
TOOLの「藤 -Resizer-」でJPEGダウンサンプリングにチェックを入れ
JPEG画質を100にして変換したサイズと同じになってしまったという事です。

つまり「藤 -Resizer-」で言えばJPEGダウンサンプリングに
チェックを入れなかった場合の変換をlibjpegでやりたいのです。
jpeg_set_qualityの様な非デフォルトオプションがあれば良いのですが。
872デフォルトの名無しさん:2006/06/05(月) 13:53:34
Cを覚える前にC++を覚えても問題無いですか?
何か弊害とかあれば教えて欲しいです。
873デフォルトの名無しさん:2006/06/05(月) 14:08:39
問題が発生したとしたら、それは順序のせいではなく
C++の「大きさ」に頭か根性のどっちかが追いついていなかっただけ。
874デフォルトの名無しさん:2006/06/05(月) 14:15:24
まあ、いざ「(C++でなく)Cを使わないといけない状況」に立たされた時Cの不便さに戸惑うかもわからん。
それから先うまくやれるかどうかは個人の器量次第だが。
875デフォルトの名無しさん:2006/06/05(月) 19:59:51
俺は先にC覚えることを勧めるけどね。
C++はCのほぼアッパーコンパチ(若干違うらしいが)なんでCの知識は無駄にならんし、
C++の本や解説ホームページはCを知ってることが前提となってることが多いから。
876デフォルトの名無しさん:2006/06/05(月) 20:42:47
素直にまっさらな頭でC++をやることをお勧めします。
877デフォルトの名無しさん:2006/06/05(月) 21:09:29
>>876
まぁそれも一理あるな。
俺のような凡人はCの知識がC++本来の使い方を阻害する面もある。
ただ、いきなりC++をやる場合は情報元を選ばんといかんね。
仕様書だけでやるって話もあるけど、俺には無理だな。
878デフォルトの名無しさん:2006/06/05(月) 21:26:13
ポインタとio系、標準Cライブラリにどんなものがあるかだけわかりゃ
Cに用はないな。
879デフォルトの名無しさん:2006/06/05(月) 22:10:42
友達がCの制御構文で躓いて、半年が経ちます。

for くらい覚えろ。
880デフォルトの名無しさん:2006/06/05(月) 22:37:46
>>871
何となく comp_info->h_samp_factor と comp_info->v_samp_factor を 1 にすれば
良さそうな感じはするけど・・・
881880:2006/06/05(月) 22:40:42
違った。Cb Cr 成分の分だから、
comp_info[1].h_samp_factor = comp_info[1].v_samp_factor = 1;
comp_info[2].h_samp_factor = comp_info[2].v_samp_factor = 1;
か。
882デフォルトの名無しさん:2006/06/05(月) 22:52:06 BE:17469533-#
むしろ、SmallTalkのようなピュアOOPを極めてからCへ降りてくるとか。
883デフォルトの名無しさん:2006/06/05(月) 23:33:36
>>881
v_samp_factor と h_samp_factor ではなくて max_v_samp_factor と max_h_samp_factor ?
この二つを 1 にしてやっても結果は変わらずでした;
884デフォルトの名無しさん:2006/06/06(火) 00:16:44
void msort(int l, int r, int m)
{
int i;

for(i = l; i <= m || m + 1 <= r; i++){
if(a[i] > a[m+1]){
swap(i, m+1);
m++;
}
}
}

マージソートを作っていました。
swapは配列を一つずつずらす物です。
コンパイルまでは上手くいく物のエラーメッセージがでて色々あがいていたところ、
for文に論理演算使えるんかいな? と、||を&&に書き換えて試したところ、
ちゃんとソートできると言う結果に。&&がandで||がorですよね?

上手く行ったのは良いのですが理由がわかりませんorz
ご教授ください。
885デフォルトの名無しさん:2006/06/06(火) 00:30:01
ループの開始で i = l に初期化して、ループ終端で i++, m++ が
行われているっていうことは、i <= m は一回成立したら以後ずっと TRUE じゃん。

iやmがどんどん大きくなってったら、a[i]、a[m+1] が確保したメモリの外側に行っちゃう。

マージソートはどんなんか忘れたけど、とにかく間違ってる。
886デフォルトの名無しさん:2006/06/06(火) 01:22:30
質問です。XP、.NET 2005 です。

int a;
char b;
…と様々な変数があるとして、

fwrite(&a, sizeof(int), 1, fp);
fwrite(&b, sizeof(char), 1, fp);
…と、ファイルに順に書き込んで行くことを考えています。

頻繁にファイルアクセスをおこすのもどうかと思い、一旦メモリ内に全データを構築してから、fwrite 1回で一気に書き込もうと思いました。
全データの合計サイズは分かっていません。

Cっぽくするなら、BYTE* data に malloc で適度なサイズの領域を割り当て、
データを書き込んでいく最中にサイズが足りなくなったら realloc で領域を倍に拡大して・・・とやるところですが、
それよりはC++っぽく、STL なり boost なりを使おうと考えました。ところが、何を使うべきかというところでつまりました。

単純な vector<BYTE> などでは、要素の追加が 1BYTE ずつしか行えないため、int など、2BYTE 以上あるデータを書き込むのに不便です。
そこで、basic_string<BYTE> data とし、

int a;
char b;
data += basic_string<BYTE>((BYTE *)&a, sizeof(int));
data += basic_string<BYTE>((BYTE *)&b, sizeof(char));


とする方法を思いつきました。
ところが、文字列でないものに basic_string を使うのに違和感を覚えています。
basic_string は、普通こういう使い方をするのでしょうか? また、もう少しスマートな書き込み方法はないでしょうか?

よろしくお願いします。
887デフォルトの名無しさん:2006/06/06(火) 01:28:29
>>886
その程度の奴がコストなんか考え出すと無駄な努力どころか
碌な事起こらないからヤメレ。
888デフォルトの名無しさん:2006/06/06(火) 01:44:50 BE:58230465-#
>>886
MFCのCObject::Serializeの適当な実装を参考に汁。
889デフォルトの名無しさん:2006/06/06(火) 01:50:10
初めまして。

質問なんですが、bcc32コンパイラは
すべての文字コードに対応しているのでしょうか?
890デフォルトの名無しさん:2006/06/06(火) 02:03:51
全ての文字コードというのが意味不明
どこまで対応すれば全てなんだ?
891817:2006/06/06(火) 02:05:22
>>817です。
>>821氏の指導通りにやってみて、最初上手く行かなかったものの
つまらない理由で失敗していた事が分かり、無事動くプログラムになりました
(free(c)だけで良いのに、列ごとにもやっていて実行時エラーになっていました)

お陰で他所から貰ってきたプログラムをmain関数内で呼び出して使えるようになりました。
ありがとうございました
892デフォルトの名無しさん:2006/06/06(火) 02:07:24
>>890
すいません。
では、BCC32が対応している文字コードを教えてください。
お願いします。
893デフォルトの名無しさん:2006/06/06(火) 02:12:12
使ってみて、ダメだったら、対応してない。
894デフォルトの名無しさん:2006/06/06(火) 02:13:29
そのぐらい自分で調べろ
895デフォルトの名無しさん:2006/06/06(火) 02:37:16
まぁ、そもそも何をもってその文字コードに対応しているというのかも不明だが。
896デフォルトの名無しさん:2006/06/06(火) 04:16:22
>>886
大丈夫、fwrite()というかFILE系はバッファリングされるから複数回呼んでも1回に纏めたのと
そんなにパフォーマンスは変わらない。
#但し、Cygwinのようにエミュレーション環境の場合は一概には言えない。
それよりも、変数をバイナリのまま書き出すと互換性が問題になるが大丈夫なのか?
メンテナンス性も鑑み、テキストで出力した方がいいと思うのだが。
897デフォルトの名無しさん:2006/06/06(火) 08:00:11
クラス名・変数名に迷ったら書き込むスレ。Part7
http://pc8.2ch.net/test/read.cgi/tech/1144978008/369-376n
から、スレ違いになりそうなので移動してきました。

>悪いことは言わん
>趣味(納期なし)ならもっと時間をかけて勉強しろ
>仕事(納期あり)なら先輩なり、同僚なりに聞け
>そして設計を含めて考え直せ

とおっしゃっていたので、何かヒントをいただけませんでしょうか。
ちなみにアマグラマです。

【開発環境】
C言語前提ですが、場合によってはC++でもOK。
開発環境はWin2000 + VS.NET 2003、ターゲットマシンもWin2000あたり。
なるべく環境依存にはしたくない。

【要求】
ユーザに、「処理」内容を選択させ、かつ複数の「パラメータ」の入力を求める必要がある。

「処理内容」は、1つの関数に相当する。
内部的には、どの関数を呼び出すかを選択させているのと同じ。

「パラメータ」は、「処理」に必要なデータである。
ただし、選択された「処理」内容によって、その「パラメータ」の扱い方が変わる。
具体的には、入力が必須だったり、無効だったり、空欄時はデフォルト値を使用したりする。

同じ「処理」内容でも「パラメータ」の有無によって該当する関数を変える可能性も考えられる。
898デフォルトの名無しさん:2006/06/06(火) 08:00:38

【目的】
ユーザが選択したた「処理」により、実行する関数を変えるとき、

   if (処理内容==処理1) Function01( 引数1, 引数2, 引数3 ) ;

のような条件分岐を何十個も並べるのは、あまり良くないのでは?と考えた。
ゆえに、もっとスマートな方法(for文で一括処理とか)で記述したい。

【自分の考え】
以下のような構造体を配列として用意した。

   struct
   {
     関数ポインタ
     パラメータ1の扱い方(enum)
     パラメータ2の扱い方(enum)
     パラメータ3の扱い方(enum)
   }

「パラメータ」の扱い方について、内部で保持しておきたい。
enumで保持しておけば「パラメータ」の入力状態によって内部で関数を切り替えることができるはず。
関数ポインタと併用すれば、for文などで一括的な処理が出来るのでは?と考えた。

また、「パラメータ」の扱い方を予め内部で持っておくことにより
ユーザインターフェイスに反映させたり、「処理」の各関数を呼び出す前に「パラメータ」チェックが出来ると考えた。
899886:2006/06/06(火) 08:21:32
>>887
>>888
>>896

ありがとうございます。
確かに、計測もせず fwrite を繰り返すとパフォーマンスが下がると思い込んでいた点で、>>887 の言うとおりでした。
バイナリで吐き出す件は大丈夫です。
900デフォルトの名無しさん:2006/06/06(火) 08:35:08
>>897
具体性がなさ過ぎて、何をやりたいんだかよく分からんが
・パラメータの数が3個限定で
・パラメータの型が全ての処理で共通で
・パラメータの条件がenumで記述可能(値の範囲指定などが必要ない)
のならば、それでいいんじゃないの。

ただ、
> 空欄時はデフォルト値を使用したりする。
このデフォルト値はどこに保持しているんだ?

> enumで保持しておけば「パラメータ」の入力状態によって内部で関数を切り替えることができるはず。
enumで保持しておくことと、処理関数を切り替えることは全く関係ない気がするぞ?
901897:2006/06/06(火) 08:54:07
>>900さん
レスありがとうございます。

>・パラメータの数が3個限定で
>・パラメータの型が全ての処理で共通で
>・パラメータの条件がenumで記述可能(値の範囲指定などが必要ない)

これは大丈夫。


>デフォルト値
外部ファイル……と言いたいところですが、
面倒だし呼び出された関数の内部でいいかな〜とか思ってる自分が。


>enumで保持しておくことと、処理関数を切り替えることは全く関係ない

 ユーザの入力(1)
 処理:Hoge / パラメータ1:(空欄) / パラメータ2:foo
 処理:Hoge / パラメータ1:bar / パラメータ2:foo

という2つのパターンがあったとして、

 FunctionHoge01 パラメータ1:不要 パラメータ2:必要  ← パターン1で呼び出される関数
 FunctionHoge02 パラメータ1:必要 パラメータ2:不要  ← パターン2で呼び出される関数
 
と、切り替えられたらいいなと思いました。

まあ、呼び出された関数の中で条件分岐すればいいのですが……。

902デフォルトの名無しさん:2006/06/06(火) 08:57:25
誤植発見。
2番目の入力のパラメータ2は「空欄」です。

(誤)
 ユーザの入力(1)
 処理:Hoge / パラメータ1:(空欄) / パラメータ2:foo
 処理:Hoge / パラメータ1:bar / パラメータ2:foo

(正)
 ユーザの入力(1)
   パターン1  処理:Hoge / パラメータ1:(空欄) / パラメータ2:foo
   パターン2  処理:Hoge / パラメータ1:bar / パラメータ2:(空欄)

903デフォルトの名無しさん:2006/06/06(火) 08:58:17
>>897
> 悪いことは言わん
> 趣味(納期なし)ならもっと時間をかけて勉強しろ
> 仕事(納期あり)なら先輩なり、同僚なりに聞け
> そして設計を含めて考え直せ
904デフォルトの名無しさん:2006/06/06(火) 09:02:21
まあ拡張性や汎用性を犠牲にした上で、
C++を使わずに実装するなら最良の選択肢だとは思うけどな。
905デフォルトの名無しさん:2006/06/06(火) 09:17:06
>>901
つまりC++で言う関数オーバーロードのようなことがしたいわけね。
そもそも設計が間違っているのかどうかは、何に使うか分からない以上何とも言えないが、
その形で実装するなら、デフォルト値の扱いにはルールを設けるのを忘れずに。

例えば
 FunctionHoge01 パラメータ1:必要 パラメータ2:省略時はデフォルト値
 FunctionHoge02 パラメータ1:必要 パラメータ2:不要
という2パターンがあったとして、
ユーザーの入力が
 処理:Hoge / パラメータ1:bar / パラメータ2:(入力なし)
だったら、Hoge01かHoge02、どちらも選べる可能性がある。
C++のコンパイラなら「曖昧です」でエラーを出すところだが、
実行時に曖昧になったんじゃどうしようもないから、
入力なしは「不要」とマッチさせるか、「可能であればデフォルト値のもの」とマッチさせるか決めないと。
906デフォルトの名無しさん:2006/06/06(火) 09:18:13
>>897
そんなに悪くないからとりあえずそれでやってみればいいよ
やってみたら変なとこ出てくるかもしれないし
907880:2006/06/06(火) 15:04:31
>>883
ソースがあるなら、jpeg_set_colorspace の中見てみてください。
JCS_YCbCrのトコで 4:1:1 にセットしてるんで、
これ呼んだ後にでも
cinfo->comp[0].h_sample_factor = cinfo->comp[0].v_sample_factor = 1;
とかすると良いと思います。
908デフォルトの名無しさん:2006/06/06(火) 16:34:55
>>885さん、ありがとうございました。
配列の外側を参照してしまうためにエラーが起きてたわけですね。
909デフォルトの名無しさん:2006/06/06(火) 17:21:35
質問です。
XPでVC++.NETを使ってます。
ソケットを使ってWebの情報を読むプログラムを作ろうとしているのですが、

if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
MessageBox(hParent, "WSAStartupエラー", "error", MB_OK);
return -1;
}
wsprintf(szStr, "wsagetlasterror:%d", WSAGetLastError());
MessageBox(hParent, szStr, "message", MB_OK);
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET) {
wsprintf(szStr, "ソケットオープンエラー,error:%d", WSAGetLastError());
MessageBox(hParent, szStr, "error", MB_OK);
WSACleanup();
return -2;
}

のMessageBoxで出る1回目の値は0ですが、
2回目(for文)は0、次に10093と出てエラーとなってしまいます。
エラー検索をすると
「アプリケーションが WSAStartup を呼び出していないか、または WSAStartup が失敗しました。」
と出ていますが、WSAStartupは呼び出しているし、エラーは出ていないので困っています。

どなたか解決策をお願いします。
910デフォルトの名無しさん:2006/06/06(火) 17:32:59
>>909
> 2回目(for文)は

提示されたソースのどこにfor()文があるのかと(ry


# 提示したソース全体をfor()文で回している、
# と言うオチではなかろうな?
911デフォルトの名無しさん:2006/06/06(火) 17:46:44 BE:34937892-#
開けたら閉めましょう。
912909:2006/06/06(火) 17:57:41
>>910
LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)

switch (msg)のcase内にfor文がありその中で呼び出しています。

>>911
実際には下のほうにこれがあります。
closesocket(s);
WSACleanup();
return nTotal;
}
913880:2006/06/06(火) 18:06:33
>>909
どのメッセージボックスがそのメッセージ出してるのかわかりますか(キャプションは何)?

エラーじゃないのに WSAGetLastError を呼び出して、変な数が帰ってきてるとか
いってるわけじゃないですよね。

WSAGetLastError は、直前のエラーのエラーコードを返すわけで、
エラーが無かったときの挙動は定義されていないと思いますよ。
(ちなみに年に1回くらい GetLastError で同じ質問する人もいます)
914909:2006/06/06(火) 18:39:33
>>913
1回目
messageで、wsagetlasterror:0
2回目
messageで、wsagetlasterror:0
errorで、ソケットオープンエラー,error:10093
です。

ソケットが開けないのでエラーだと思うのですが…?
915デフォルトの名無しさん:2006/06/06(火) 18:50:51
そもそもWSAStartup/WSACleanupなんてそんな頻繁に呼ぶものではないだろ。
普通プログラムの開始・終了時に1度だけ呼ぶものではないか。
916909:2006/06/06(火) 19:11:01
>>915
その通りにしたら読み込めました。
ありがとうございました。
917デフォルトの名無しさん:2006/06/06(火) 20:11:50
時々見るのですが、
printf("そんな長くない文章\n");
printf("やっぱ長くない文章2\n");

と呼ぶのはなんのためでしょうか。
918897:2006/06/06(火) 20:17:02
返信ありがとうございます。

>>904
今からC++に変更しても、ぶっちゃけ問題なかったりはするんですけどね(笑)
自分がやりたいのは、>>905さんもおっしゃっている通り、C++で言う関数のオーバーロードっぽいものです。
ただ、あくまでも実行時に解釈するので、C++のオーバーロードとは少しニュアンスが違うかもしれませんね。

>>905
はい、問題ありません。
どっちにするかはまだ決めてませんけど。

>>906
とりあえずこのままやってみることにします。
設計の難しさをほんの少しだけ知ったような気がします……。




919デフォルトの名無しさん:2006/06/06(火) 20:30:28
>917
「文字列の長さが1GBとかじゃなくて普段良く使う程度の長さの文章だよ」
「上のと内容が異なるけど長さ的には同じくらいだよ」
というのを暗示したいのではなかろうか。
920デフォルトの名無しさん:2006/06/06(火) 20:40:09
>>919
なるほどサンクス 何度も関数を呼ぶ意味がワカランかった
921デフォルトの名無しさん:2006/06/06(火) 20:49:10
>>917って
printf("hoge\nhage\n");じゃなくて2行に分けるのは何でって事?
それだったら単に出力時の見た目とコード上の見た目を合わせるためだと思われ
922デフォルトの名無しさん:2006/06/06(火) 21:18:04
#include<stdio.h>

class Object
{
float px,py;
public:
Object(int x,int y){px=x;py=y;}
void Draw(void){printf("X座標=%d\nY座標=%d\n",px,py);}
};

int main(void)
{
Object ufo(2,4);
ufo.Draw();
return 0;
}

なんか数値がおかしいのですが、どこが悪いのでしょうか
923デフォルトの名無しさん:2006/06/06(火) 21:24:30
-void Draw(void){printf("X座標=%d\nY座標=%d\n",px,py);}
+void Draw(void){printf("X座標=%f\nY座標=%f\n",px,py);}
924922:2006/06/06(火) 21:32:19
>>923
どういうことですか?試しにそのようにコードを修正してみましたが、エラーが出ます
925デフォルトの名無しさん:2006/06/06(火) 21:35:32
>921
でもそれだと
printf(
"一行目の文章\n"
"二行目の文章\n");
で事足りるし。
926デフォルトの名無しさん:2006/06/06(火) 21:38:36
コピペしやすいからに決まってるじゃないか
927デフォルトの名無しさん:2006/06/06(火) 21:39:24
>924
floatを%d(10進整数)で出力しようとするなってこと。
手元の環境(Win2k, BCC5.5)じゃ

X座標=2.000000
Y座標=4.000000

のように出力されたけど?
928デフォルトの名無しさん:2006/06/06(火) 21:40:12
>>925
コメントアウトしづらいだろ。

>>924
Cからやり直すことをお薦めする。
929922:2006/06/06(火) 21:42:46
>927
あ、コンパイルできました。+とか-とかはいらなかったんですね
どうもありがとうございました
930デフォルトの名無しさん:2006/06/06(火) 22:03:22
>>929
じゃもう1個指摘
-#include<stdio.h>
+#include<cstdio>
+using namespace std;
922は古い書き方で最近の環境では通らなかったりする

それと
Object(int x,int y){px=x;py=y;}
のx,yの型とpx,pyの型は揃えなくて良いの?
931デフォルトの名無しさん:2006/06/06(火) 22:10:30
>922は古い書き方で最近の環境では通らなかったりする
そんな環境あるの?
最新のC++規格にも<stdio.h>はあると思うんだが。
932930:2006/06/06(火) 22:22:35
>>931
「通らない」は嘘ですね
失礼
933デフォルトの名無しさん:2006/06/07(水) 07:29:54
質問です。XPで.NET Framework SDKのコンパイラ使ってます。

#include <stdio.h>

int main(void)
{
char input_data[10];

do {
fgets(input_data, sizeof(input_data), stdin);
input_dataに入ってる文字列を処理
} while(条件);

return 0;
}

fgetsでデータを入力したいのですが、この場合もし10文字以上入力されるとエラーになって
強制終了されてしまいます。
用意した配列の大きさより大きい文字列が打ち込まれた場合の対処はどうしたらいいのでしょうか。
934デフォルトの名無しさん:2006/06/07(水) 07:32:20
>>933
fgets() にはバッファのサイズを渡してるから、強制終了はしないはず。
その後の処理のほうが間違ってるんだろ。
935デフォルトの名無しさん:2006/06/07(水) 07:49:59
Ctrl + Z で逃げるような話?
936デフォルトの名無しさん:2006/06/07(水) 08:36:03
とりあえずfgetsの戻り値ぐらいは確認しとくべきちゃうか。
937933:2006/06/07(水) 08:39:15
あ、すみません、強制終了するのは後の処理が間違っていました。
強制終了ではなくて、配列内に収まりきらなかった分が、doループで次回のfgetsが来た時に
読み込まれてしまうのを防ぎたいのですが、どうすればよいのでしょうか。
938デフォルトの名無しさん:2006/06/07(水) 09:03:19
>>937
fgetsで'\n'を読めなかったことを確認したら、'\n'までgetcharで読み捨てれば良い。
939933:2006/06/07(水) 09:39:15
>>938
ああー、なるほど。ありがとうございました。
940デフォルトの名無しさん :2006/06/07(水) 11:45:53
すいません簡単な質問です
effectiveC++読んでる途中ですが
using namespace std;をあえて使わず
std::・・・と文法上つかってますが
using namespace std;に甘えない方が
良いのでしょうか。
(読んでる途中なので最後まで読めと言われれば
そうなんですけど)
あと、「std::stringなどは継承するな」って書いてあったの
ですが、本当にそんなトリッキーな事する奴いるんでしょうか・・・
(居たから書いてるんだろうな)
941デフォルトの名無しさん:2006/06/07(水) 14:25:25
初歩の質問です。
std::stringの文字列をconst char *(またはchar *)にキャストしたいのですが、
dynamic_cast,static_cast,reinterpret_cast,const_castのいずれもダメです。
どうすればキャストできますか。
プログラム自体はキャストしなくても、最初からconst char*の文字列に
しとけばいいんですが、どうも気になって、、、
942よろしくお願いします:2006/06/07(水) 14:26:29
http://www.geocities.jp/hideohara777/tec/sort2.html
をC++(cin coutを使う)に直す宿題が出ましたが、自分で直してみましたがどこが悪いのかが解りません。
どなたか直してくれる方はいらっしゃいますか?(↓自分で直したがエラー続発)
#include <iostream>
void main(void)
{
int a[5]={9,5,7,2,1};
int b, i ,j, k;

cout <<"ソートするデータ" ;
for ( k=0; k<5; k++ )cout << "" << a[k] );
cout << "\n" ;
cout << "\n" ;

for ( i=0; i<4; i++ )
{
for ( j=i+1; j<5; j++ )
{
if ( a[i]>a[j] )
{
b = a[i];
a[i]=a[j];
a[j]=b;}
}
}
cout << "ソート結果\n" ;
for ( k=0; k<5; k++ )cout << "%d ", a[k] ;
cout << "\n";
}

943デフォルトの名無しさん:2006/06/07(水) 14:30:33
>>941
str.c_str();
944デフォルトの名無しさん:2006/06/07(水) 14:30:56
>>941
c_str
945デフォルトの名無しさん:2006/06/07(水) 14:36:18
943>
944>
早い、速いッスよ。
俺も早くあんたらのようになって、この板を
sageてみせるよ、ありがとう。
946デフォルトの名無しさん:2006/06/07(水) 14:39:12
>>942
↓のスレに「誘導されたので・・・」として移動した方がいいよ。

C言語/C++言語の宿題を片付けます 65代目
http://pc8.2ch.net/test/read.cgi/tech/1147902222/
947271:2006/06/07(水) 14:43:00
>>946様 どちらに書こうか迷いましたが、このスレの初心者歓迎の文句に魅かれてしまいました。
宿題のサイトにはご迷惑をおかけしたので、ここで質問した所存であります。
948デフォルトの名無しさん:2006/06/07(水) 14:55:59
void main(void) の前に
using namespace std;
を追加して、

これと⇒ for ( k=0; k<5; k++ )cout << "" << a[k] );
これを⇒ for ( k=0; k<5; k++ )cout << "%d ", a[k] ;

こうすれば動くんじゃない? ⇒ for ( k=0; k<5; k++ ) cout << " " << a[k] ;

>宿題のサイトにはご迷惑をおかけしたので、ここで質問した所存であります。
宿題やってくれっていうのは「C/C++ に関する質問」じゃないというのはわかりますか?
「車の整備についての質問(初心者歓迎)っていうスレ」があったとして、
「車の調子悪いが自分では整備できないから誰か整備して」
なんて書くのはスレ違いでしょ。
949デフォルトの名無しさん:2006/06/07(水) 15:12:43
>>940
>using namespace std;に甘えない方が
>良いのでしょうか。
良い
これはコンパイラのバグまで絡んでくるのでやっかい
要約すると、
ヘッダでは使うな。ただし関数内では思う存分使ってよい。

>std::stringなどは継承するな」って書いてあったの
>ですが、本当にそんなトリッキーな事する奴いるんでしょうか
template typedefがないのでそういう状況も出てくる
まあ分からないならやらない方がいい
950デフォルトの名無しさん:2006/06/07(水) 15:15:56
>>948 その通りです。またご迷惑をおかけしました。
951デフォルトの名無しさん:2006/06/07(水) 17:18:08
gcc + linux でプログラムを作っているのですが、
ファイルのコピーの命令が見当たりません。
Windows なら、CopyFile というのがあるのですが、
Linux ではどうやって書くのか教えてください。
952sage:2006/06/07(水) 17:34:15
>>951
Pythonのソース見たら、普通にファイル開いて、しこしこ書き込んでた。
便利なやつがあればと思ったけど、自作しないといけないんだな。
953デフォルトの名無しさん:2006/06/07(水) 17:39:18
>>951
Linuxのことはあまりしらないけど、
C++でもいいなら、boost::filesystem::copy_fileがあるよ。
954デフォルトの名無しさん:2006/06/07(水) 17:40:31
手っ取り早くやるならUNIXコマンド直接起動で
system("cp 元 先");
でいいんじゃね。移植性は皆無だが。
955デフォルトの名無しさん:2006/06/07(水) 17:52:09
どうせ、自前でコーディングしないのであれば
標準で用意されてない以上移植性は期待で着ない。
956デフォルトの名無しさん:2006/06/07(水) 21:58:23
#include <stadio.h>

main () {
printf("C programming");
return 0;
}

というプログラムを書いてコンパイルしようとしたら


エラー E2209 sample.c 1: インクルードファイル 'stadio.h' をオープンできない
警告 W8065 sample.c 4: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)

と表示されました。「オープンできない」 「プロトタイプ宣言のない」とはどういうことですか?
957デフォルトの名無しさん:2006/06/07(水) 22:02:58
>>956
> stadio.h
綴りが違う。
958デフォルトの名無しさん:2006/06/07(水) 22:05:50
>>956
見たまんまの意味だな。もっとエラーメッセージを理解する努力をしよう。
959デフォルトの名無しさん:2006/06/07(水) 22:12:53
>>956
・オープンできない
 綴りが間違ってるからね。ファイルが無いから。
・プロトタイプ宣言のない
 printf関数はstudio.hに入っているので。
 なんの前触れも無く、コンパイラが『printf』なんて見つけても、 何なんだよ、printfって てな事になる。
960959:2006/06/07(水) 22:14:37
うほっ 間違えた。
stdio.hね。
ちなみにstdioは、『スタンダード アイ/オー』ね。
961デフォルトの名無しさん:2006/06/07(水) 22:23:49
ありがとうございます。綴りを直したんですが今度はこのメッセージが出ました。
認識されいないと出ているんですが操作可能にするにはどうすれば?

C:\source>bcc32.sample.c
'bcc32.sample.c' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
962デフォルトの名無しさん:2006/06/07(水) 22:32:43
>>961 まずは自分を疑うといいよ。
963デフォルトの名無しさん:2006/06/07(水) 22:50:38
×bcc32.sample.c
○bcc32 sample.c

というかもうちょっと考えてから人に聞こう
964デフォルトの名無しさん:2006/06/07(水) 23:28:28
>>960
これが無きゃネタですんだのに >>959
965デフォルトの名無しさん:2006/06/07(水) 23:40:29
map< int , Object* > objectMap;

objectMap.insert( pair< int , Object* >( 1 , new Object ) );

objectIterator = objectMap.find( 1 );

objectMap.erase( objectIterator );


こんな感じのソースを書いてしまったんですが、
やっぱり .erase を使うだけではオブジェクトの実体(メモリ)は開放されないですか?
966デフォルトの名無しさん:2006/06/07(水) 23:49:02
>>965 されない。
967デフォルトの名無しさん:2006/06/08(木) 00:02:24
#include <stdio.h>

main () {
printf("C programming");
return 0;
}

綴りを直しても

エラー E2209 sample.c 1: インクルードファイル 'stdio.h' をオープンできない
警告 W8065 sample.c 4: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)

のままでした
968デフォルトの名無しさん:2006/06/08(木) 00:05:53
969デフォルトの名無しさん:2006/06/08(木) 02:05:38
エラー E2209 test.c 1: インクルードファイル 'stdio.h' をオープンできない

ゼロから始めた者ですが↑のようなエラーが出て先へ進めません。どうしたらよいですか?
970デフォルトの名無しさん:2006/06/08(木) 02:41:18
>>969
Cを諦めて下さい。
971デフォルトの名無しさん:2006/06/08(木) 03:35:37
どうせbcc32.cfgでインクルードパス指定するの忘れてるってオチだろ

setbccでぐぐれ
972デフォルトの名無しさん:2006/06/08(木) 03:42:42
数式を与えたら、それを解釈して木構造を構築するようにしたいのですが・・
( (1)+((2+3))*(6*(8)) ) のように無駄に括弧が入りまくってても大丈夫なヤツ
を早急に作らないといけないんです。助けてください
973デフォルトの名無しさん:2006/06/08(木) 04:19:01
>972
boost::spirit

つってもコンパイラに依存するけど
974972:2006/06/08(木) 06:46:17
>973
boost::spirit について少し調べてみます。
というか、自力で作りました。すいません。
975デフォルトの名無しさん:2006/06/08(木) 17:07:13
VC++6.0を使っているのですが、

ローカル定義のシンボル "_malloc" がインポートされました

というwarningがでます。
warningの内容の意味が理解できないので、これがどれくらい良くないことなのか
さっぱり分かりません。

どういう意味なのでしょうか?
976デフォルトの名無しさん:2006/06/09(金) 01:49:21
test1ではsmemの値は7FFDF000で,
このアドレスには"テスト"の文字列が格納されてました。
がしかしtest2でのdmemの値は00913424だったのですが
このアドレスにはよくわからないデータしかなく,
"テスト"の文字列はその周辺にも見あたりませんでした。
dmemは何を指してるのでしょうか。。

int test1()
{
char* smem;
strcpy(smem, "テスト");
printf("%p",smem);
return 0;
}

int test2()
{
char* dmem = new char[8];
strcpy(dmem, "テスト");
printf("%p",dmem);
delete[] dmem;
return 0;
}
977デフォルトの名無しさん:2006/06/09(金) 01:56:30
いやむしろsmemはどこを指しているのさ
strcpyの書き込む先は?
978デフォルトの名無しさん:2006/06/09(金) 05:07:16
すいません、Cで画像や音声を読み込んで表示したいのですが、
fopenでよいのでしょうか?
979デフォルトの名無しさん:2006/06/09(金) 05:13:07
うん
980デフォルトの名無しさん:2006/06/09(金) 05:29:14
サンクス
981デフォルトの名無しさん:2006/06/09(金) 06:45:46
音声を表示するのか?
982デフォルトの名無しさん:2006/06/09(金) 06:57:07
いや音声は表示しなくていいです。

えーと、fopenでファイルを開いて、関数に代入すればいいんですよね?
そこから先どうすればよろしいんでしょうか
983デフォルトの名無しさん:2006/06/09(金) 07:12:13
 >fopenでファイルを開いて、関数に代入
なんてすばらしい言語なんだろう。
984デフォルトの名無しさん:2006/06/09(金) 08:00:22
画像や音声の扱いはそんな単純じゃないよ
ぐぐるか本買うかしてしっかり勉強すべき。
それ以上はそっちの環境がわかんないと何も言えない
985デフォルトの名無しさん:2006/06/09(金) 10:09:43
【初心者歓迎】C/C++室 Ver.28【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1149815331/
986デフォルトの名無しさん:2006/06/11(日) 08:37:03
まずはこっちを埋めようぜ?
987デフォルトの名無しさん:2006/06/11(日) 13:23:11
最近、std::tr1ていう名前空間をよくみかけるようになたんだけど
お姉さま、あれは何ですの?
988デフォルトの名無しさん:2006/06/11(日) 13:32:18
989デフォルトの名無しさん:2006/06/11(日) 17:53:10
ume
990デフォルトの名無しさん:2006/06/11(日) 17:57:24
990
991デフォルトの名無しさん:2006/06/11(日) 18:02:18
埋め
992デフォルトの名無しさん:2006/06/11(日) 18:04:54
993デフォルトの名無しさん:2006/06/11(日) 18:06:20
993
994994:2006/06/11(日) 18:07:11
995デフォルトの名無しさん:2006/06/11(日) 18:07:19
うめお
996デフォルトの名無しさん:2006/06/11(日) 18:07:43
【初心者歓迎】C/C++室 Ver.28【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1149815331/
997デフォルトの名無しさん:2006/06/11(日) 18:08:51
997
998デフォルトの名無しさん:2006/06/11(日) 18:09:58
998
999デフォルトの名無しさん:2006/06/11(日) 18:10:10
↓1000おめでとう
1000デフォルトの名無しさん:2006/06/11(日) 18:11:08
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。