【初心者歓迎】C/C++室 Ver.27【環境依存OK】
>1 PS3高いな乙
3 :
988 :2006/05/09(火) 23:18:46
スミマセン、前スレの988です(´ヘ`;) このプログラムで、例えばABCDEって入力して、前の3文字を消して DEって出力させたいと思ってます。 strcpyのプロト宣言っていうのは()の中が2つともchar型ってことでいいでしょうか?
>>3 char じゃないよ char* と char const* だよ。
5 :
988 :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 )」です。
>>3 プロト宣言じゃないよプロトタイプ宣言だよ。
gets(ss); printf("%s\n", ss + 3);
8 :
988 :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;
}
strcpy(rr, ss + 3);
10 :
988 :2006/05/09(火) 23:35:42
>>9 いけました!ヽ(´ー`)ノ
ありがとうございます。
っていうか、何も理解して無いだろ? やっぱ頭が・・・
まあ、色々いじれば分かるだろう。
頭をな。
初期化していない rr に対して strcat して大丈夫なんか?
そもそもgets()とか
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()); } だとローカル変数のポインタを返してると警告が出ますよね。 その通りだよなと納得はするんですがどうすればいいか思いつきません。 どうしましょう?
>>18 hoge() は領域を引数で受け取るようにして main() で用意した配列を渡す。
または hoge() が malloc() して作成した領域を返すようにする。
staticにするとか?
即レスさんくす。そういうことをするのですね。 ちなみに今似たようなソースを探してたら char str[16];を static char str[16]; としてるやつにぶつかって、やってみたら警告も消えたんですが これって何か問題ありますでしょか。 例は簡略化してますが、結果的にhoge()の中で文字列を操作して、 返ったあとには操作しない予定です。
ああ、
>>20 の人のレス見逃してました。
いいみたいっすね。どうもでした。感謝。
>>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 どこかおかしいですかね?
なんでそんな面白いところに置くんだ・・・
/*haiio.c*/ #include <stdio.h> int main() { printf("Haiio word!\n"); return 0; } エラー E2209 c:\my documents\プロジェクト\tist\tist.c 3: インクルードファイル 'stdio.h' をオープンできない さっきからやってるのに直らないんですが・・・
C/C++のフリーのコンパイラ探してるんですが BorlandC++Compiler 5.5はXPでも可能? 動作環境に入ってないんでインストールしようかどうしようかと(゜Д゜;)
>>27 試せば?支障出るのが嫌なら仮想マシンでも出来るわけだし
なにも問題なく動くはずだが、お前さんみたいな素人は最初の設定で躓いて上の馬鹿みたいな質問するのがオチ。 素直にVC++のフリー版使っとけ
ここの回答者の人達ってC言語をどれくらいでマスターしたんですか?
まだマスターしていません。
最初の設定難しいんですか?!(゜Д゜;)ガーン とりあえず試してみます! 無理だったら>30のお世話になってVC++のフリー版を 落としてみます。お世話になりますた(´∀`)ノン
>>33 パス通してbcc32.cfgとilink32.cfgにインクルードファイル置き場と標準ライブラリ置き場のパス書くだけやん
その手の質問が一番多いだろ 特に3〜5月
gccで質問なんですが、printfで文字列リテラルだけ渡した時に putsとリンクされてしまいます。オプションは最適化なし( -O0)で実行しています。 最適化ありだと分かるんですが、最適化なしでもこうなるものなのですか? gccのバージョン1は4.0.2です。
>>36 自分で
> putsとリンクされてしまいます。オプションは最適化なし( -O0)で実行しています。
と書いてんじゃねーか。それが答えだ。
>>36 文字列リテラルの末尾を改行ではなく空白あたりにしてやるとputs()をリンクするのをやめると思うよ。
prrintf("hoge");を prrintf("%s","hoge"); なら置換しないんじゃね?
いやだから、>39の例ならputs()にできないって。
41 :
39 :2006/05/10(水) 23:04:56
やべぇ ぷりりんとエフになってた
42 :
36 :2006/05/10(水) 23:32:18
結局、最適化オプションと実際にリンクする関数は 無関係ということでいいんですね。ありがとうございました。 一応ソースさらしておきます。 #include <stdio.h> int main () { printf("hello, world\n"); }
そうか、ぷりりんとエフが作業しててくれてるのか。
下のようなコードで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 } };
>>44 deprecated だったのがが正式に削除されただけ。何も不思議なことは無いな。
typename std::vector<A>::iterator it = vvv.begin();
>>46 動きました!ありがとうございました。
typenameというのをはじめて知りました。もっとちゃんと勉強しないとだめですね。
>>47 警告とエラーメッセージに出てたはずなんだが。
コンパイラからのメッセージは読んどけよ。
>>48 すみません。。。エラーメッセージの意味がよくわからなかったというのが正直なところです。。もっと精進します。
明解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); }
>>50 書き方はどうあれ、アルゴリズム的にはバブルソートみたいだな
高々要素数が3個程度ならそれが最適だろう
下手に高級なソーティングアルゴリズムを使ったところで
要素数が少ないと逆に処理時間が増えるだけだからな
52 :
50 :2006/05/11(木) 20:11:56
書き方変ですか?独学なんでその辺教えてくれませんか? あとバブルソートってなんですか?
書き方は別に変ではなく、 普通はループを使って書かれるバブルソートと アルゴリズム的に同じだけど ループを使ってはいないというだけの話。 バブルソートに関しては、そのくらいはググれ。
>>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);
}
}
}
>>51 ,53
ありがとうございました。
自分で考えてたんですけどループは思いつかなかったです。
自分でも書いた後にググれよなって思いました。すいません。
今回のをループ使うとどんな感じになるんですか?
一回配列に入れなおすんですか?
まあ、配列に入れないと無理ね。
>>54 すいません。書いた後に気付きました。
それはなんてい種類のソートアルゴリズムなんですか?
僕のとの違いは *z>*y だったときに計算量が減るってことでいいですか?
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); } } } }
>>56 やっぱりですか。ありがとうございました。
>>58 最強ってなにが最強なんですか?計算量が最も少ないって事ですか?
条件分岐のためのjmpとかで無駄な時間掛かってそうだなw
比較と交換の回数がいずれも理論上最小で済むって事だろ。
でも、コードが長過ぎるのと分岐箇所が多いのが どう響いてくるかが問題だな。 最近の CPU は色々やってるからなぁ。
検証してみたいんですが、どうやって時間考えればいいんですか? ifの数と交換の回数数えればいいんですか?
実際に動かして時間を計ればいい。
>>65 どうやって計るんですか?
ストップウォッチでは計れないくらい速くないですか?
細かく時間を計測する関数が環境依存で用意されてるから、 ループでそれぞれ何百万回と実行させて、 2つの処理での実行時間の差を見る。
原子時計を使って測るのが一般的。普通じゃ測れない。
おいw
man 1 time
>>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;
}
>>71 環境依存だと言うとるのに
環境を言わずして答えられる筈が無い。
>>64 実際の実行時間を知りたいなら計測すればいいけど、
比較や交換の回数を知りたいなら計算すればいい。
入力の3数が全て異なるとき、大小関係は6通りあるけど、
この6通りが等確率で現れるとすると、平均で、
>>50 は比較3回、交換3/2回。
>>54 は比較8/3回、交換3/2回。
>>58 は比較8/3回、交換7/6回。
でも、分岐予測だとかプリフェッチだとか 条件付き演算とか色々あるからなぁ。 本当にそれだけで高速になるのかは ちょっと計測してみないことには 何ともいえんなぁ。
>71 >for(i=0;i>1000000;i++) これって……
>>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です。
>>76 なら timeGetTime っつー関数がある。
使い方はググればすぐ分かる。
#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時間くらい調べた結果がコレなんですがうまくいきません。ご教授願いたいです。}
>79 >for(i=0;i>1000000;i++) これって……
>>80 直してなかった…OTL
すいませんでした。
( _,, -''" ', __.__ ____ ハ ( 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 ト、へ
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;
}
そこまでしないと差がでないんだから 一つのプログラムでその関数を何十回何百回と使うなら 淫乱しちゃったほうが楽じゃないか?
それVC++あたりで最適化するとループ全部省かれるぞ多分
それでいいんじゃね? あまりにも一瞬で終わってしまうようなら、 中のループ回数を増やしてみれ。
確かに最適化したら消えそうだな。 x, y, z を volatile にして、 volatile 消して sort に渡せばいいのか?
>>84 淫乱ってなんですか?
>>85 ,87
もう少し説明をしていただけると幸いです。
>>50 に書いたんですが、「入門編」をやってるんで、その程度の人間です。
>>86 わかりました。やってみます。
ごめ、うちまちがえ インライン
淫乱関数
やってみました。
>>50 平均235
>>54 平均231
>>58 平均291
でした。
ところでコマンドプロンプトからコピペってできないんですか?
>>89 インラインをググって見たんですけどC++の話ができたんですが、
Cの関数形式マクロと同じことでいいんですか?
>>91 >コマンドプロンプトからコピペ
システムメニュー(タイトルバーで右クリック)を使うか、
コマンドプロンプトについてるツールバーを使うか。
>インラインをググって見たんですけどC++の話ができたんですが、 >Cの関数形式マクロと同じことでいいんですか? イエス てか、クラス作ってそのなかで関数定義すれば、インライン宣言したものとして扱われるけどね
同じじゃないが、やりたい事は同じだな。 マクロじゃ色々危険なこともできるから 導入されたんだろう。
>>92 コピーの所が反転しててクリックできないんですが…
>>93 クラス?ググっても何かいてるか良く分からない…OTL
言い忘れてたんですが、C以外はやったことありません。
んでCもまだ「入門編」の途中までしか言っていない人間です。
>>95 選択範囲ボタンを押して範囲選択、
しかる後にコピーボタンでクリップボードへコピー。
クラスってのはC++であるんだけど んー 形としては、 ・Cの構造体に、その中で通用する変数と処理関数を持たせたもの。 ・「何か」についての関数群を一つにまとめたもの。 って感じかなぁ
>>96 できました。ありがとうございます。
>>94 危険なこと?例えばどんなことですか?
そういえば
>>60 の通りでしたね。
>そういえば
>>60 の通りでしたね。
inline void swap(int *x,int *y) にすると違う結果になるかも。
>>60 での勘は当たってたか。
良かった良かった。
>>98 >危険なこと
よく言われることには
#define min(a, b) ((a) < (b) ? (a) : (b))
という小さい方の値を返すマクロは、
min(++x, y) とかすると
((++x) < (y) ? (++x) : (y))
と展開されて、++x < y が正しければ
++x が二回実行されていまう。
あとは引数の型チェックもない。
インライン関数を使えばこのあたりが全部解決する。
>>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でもインライン関数って使えるんですか?
102 :
99 :2006/05/12(金) 02:12:23
あれ?できなかったっけ?ファイル名の拡張子を.cから.cppに変えれば多分できると思う。
>>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
だいぶ違うんですね。何でこんな違う結果になるんですか?
ていうかこんな夜中まで付き合ってくれるみなさん優しいですね。
ありがとうございます。
分岐を用意してたからかな たとえば、ifを何個も用意するよりswitchの方が早い。 あとif文は if ( 条件 条件 条件 ) となってる時 左から判定していくから、処理を速くしたい時は 当てはまる確率がもっとも多そうなモノから書くのが良い。 だったよな?
>>104 分岐をしっかり用意したから
>>73 のように平均では
処理回数が減ったからって事ですか?
inlineをつけた時とつけなかった時は結果が違うし、
なんでこんなにちがうんですか?
実行処理をしていく時に、一文ずつ処理を読んでいくわけだけれども。 条件判定や処理を「コレが出てきた時はこうするもの」と あらかじめインラインを使うことでメモリに覚えさせておくことによって、 ( switch も case 判定でメモリを使ってる) その関数を読みに行ったりする処理に掛かる時間(手間)を省くことができる。 間違い有ったら指摘ヨロ
>>106 関数を「読みに行く」というのは実際のどうさとはかけ離れたイメージ。
命令キャッシュの話だとすればインラインは逆効果。
初心者スレで不正確な情報を書くのは罪。
ということで108の説明に期待する俺
結構難しい問題だな。
スマン。 C言語スレが落ちたけど、スレ立てられんかった。 今から新テンプレ投下するから、誰か代わりに立てて。
115 :
デフォルトの名無しさん :2006/05/12(金) 07:49:16
Windows2000でVC6.0です。 メインスレッドでグローバル領域にset、複数起動する子スレッドでgetします。 get中のset、set中のgetは排他しますが、get中のgetは許可します。 (set中のsetも許可しますがsetがメインスレッドだけなのでありえない) こういう排他の場合、クリティカルセクション、ミューテックス、セマフォ、その他のどれを用いるのがいいのでしょうか? ちなみにクリティカルセクションの場合は二個使うことはできません。
>>115 対象がAtomicに取り出せるのなら排他の必要がない希ガス。
そうでないならセマフォかねぇ。
117 :
115 :2006/05/12(金) 09:01:13
グローバル領域はある構造体の配列でsetのたびにソートするので、排他が必要な気がします。 セマフォですね、ありがとうございます
下記のような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
typename std::list<Hoge<T>*>::iterator it;
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のオブジェクトを引数として渡すことって可能でしょうか? わかる方いらっしゃいましたら教えていただけないでしょうか?
>>121 class B;
class A
{
void func(B);
};
class B:public A
{
//処理など
};
void A::func(B b)
{
//処理
}
>>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++ってこういう仕様なんですか? どんな教科書の例を見ても、配列の動的確保はひとつしかやっていないので 上のような複数の配列の確保と解放については書かれていないんです。
>>125 その式は以下と同等。
(delete[] p1),p2;
deleteは文でなく演算子であり、コンマ演算子と共存できる。
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には何も起こっていませんでした。
>>83 >for(i=0;i<1000000;i++)
こんなことせずにTSC使えば?
131 :
50 :2006/05/12(金) 19:45:22
>>108 昨日は寝てしまいましたがご説明期待してます。
よろしくおねがいします。
質問です。 環境依存コードは使わない方向でお願いします。 openofficeなどの表計算ソフトで作られた表ファイルを string[縦][横] みたいな領域に格納する方法はありますか? あるとしたら、その中で最も高速な手段は何ですか?
133 :
デフォルトの名無しさん :2006/05/12(金) 19:47:54
age忘れ・・・
>>132 何が言いたいのかよく分からん
自分の文章読み直してみろ
それと表計算ソフトが吐くのは基本的にCSVだから
順番に読んでいけば一行ずつ読める
#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)の意味が分からないので教えてもらえませんか? 何にも使われていないように思えるんですけど…
>>136 戻り値を捨てるのは普通の事だと思うが。
例えば、printfは出力した文字数を返すけど、そのコードでは捨てられている。
>>137 そうなんですか。したら別にvoid型でも良いと思うのは初心者の甘い考えですか?
>>138 その例だとvoidでも問題ないと思う。
第一引数を返すようになってるのは標準ライブラリのstrcpyを模倣したからだと思う。
strcpyがなんで第一引数を返すのかは俺も知らね。
140 :
139 :2006/05/12(金) 20:26:29
あ、もしかしたら代入式a=bがaを値として持つのを模倣したのかな?
>>138 >>137 が言っているのはstr_copy(s2,s1);のここでの使い方に関して。
文字列操作関数で出力先のポインタを返すのにはちゃんとした意味がある。
>>134 >何が言いたいのかよく分からん
[入力]
・ 表ファイル (例 *.xls, *.sxc )
[出力]
・ 二次元配列 (例 string[10][10] graph )
>表計算ソフトが吐くのは基本的にCSVだから
>順番に読んでいけば一行ずつ読める
シート名を指定するとか、連結セルを含む表とか、関数式を読み取る際には式/値のどちらを取得するのかを選択するなど、
応用的な状況にも対応したいのです。
俺は strcpy は正直 void でも問題ないと思う。 そんな戻り値を利用するより、 別な書き方した方が読みやすいと思う。
SQLでいいんじゃん?
> while(*d++ = *s++) がスマートな書き方だと当時最も正統な解説書に書かれている時点で 凡俗が読みやすさ云々と言っても無意味。
たしかに、 strcpy(a, strcpy(b, c)); とか、 puts(strcpy(a, b)); とか書けるな。 読みにくいとも思わんが、これが便利な状況は限られる気がする。
147 :
136 :2006/05/12(金) 20:38:43
>>140 もう少し詳しく教えていただきたいです。
>>141 ちゃんとした意味があるんですか。
そしたらその意味を教えていただきたいんですが…
>>145 たぶん僕が書いたコードについていってると思うんですが
まったく意味が分からないのですが、説明願えますか?
>>147 >>145 はどうみても
>>143 に対してだろ
char *pch = strcpy(hoge, (char*)malloc(strlen(hoge)+1));
こんな楽しいこともできるな(多分)
>>148 志村ー引数逆、逆。
つーか、malloc の戻り値チェックしろよw
C/C++ もしくはC#のプログラミングを勉強したいと思っています。 処理系というものが、必要だと聞いたんですが、 どのように用意すればいいんでしょうか? すれ違いかもしれませんが、お教え願いますか?
>>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と出力する。
>>149 スマン、間違ったw
char pchTemp;
char *pch = strcpy((pchTemp=(char*)malloc(strlen(hoge)+1)?pchTemp:return -1), hoge);
動くかはしらんがこれでどうよ?w
155 :
150 :2006/05/12(金) 21:21:41
156 :
136 :2006/05/12(金) 21:24:21
>>151 わかりました。ありがとうございます。
引数として出力できることで
作業が同時に行えるようになるって事ですよね?
>>148 の楽しさが全く分からないのでもっと勉強します。
157 :
99 :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回分の時間が短縮されている事になる。 おそらくそれが全体の時間短縮に繋がっているんじゃないか。 実際に時間を調べた訳じゃ無いが多分これで合ってると思う。
おい、char *pch = 関数とした時点で終わってるよ、もちろんクラスオブジェクトは除いて。 引数の型が参照の時にも引数として関数入れても同じことだ。
>>157 ありがとうございます。
ということは連続すればするほどinlineの効果が高くなるってことですよね?
inline使うデメリットってあるんですか?
>>159 inline 関数の中身が多少大きいと、
それを全箇所に埋め込むわけだから、
実行ファイルのサイズが大きくなる。
あまり大きいと、inline 展開されない可能性もあるけどね。
>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;に変えてみたら遅くなった。
なんか自分が勘違いをしていそうなのですが、わかりません。 以下のコードが、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 ); }
エラーメッセージの通り。キャストすればいい。
(void**)&pBuffer
規格的には void* vpBuffer = NULL; AllocBuffer(&pBuffer, 20); char* pBuffer = (char*)vpBuffer; の方が安全? まあ、どうでもいいんだろうけど。
>>163 初心者に安易に無茶なキャストを勧めるのは感心しないな。
はいはい、頭良いのは分かったから 自分で推奨できるものを書いてからにしようね
>>167 >>165 が最も推奨されるコードだろう。
ただ、細かい話をすれば
void** なんてものは C 的に随分怪しいものになる。
C FAQ 4.9 を参照。
>>168 C FAQ 4.9 を読んでみました。
「参照呼び出しに使うため汎用のポインターを関数に渡す」の意味がわからなかったです。
これはどういうことがしたいんでしょう?
多分訳が変なんだろうと思う。 char* とか int* とかの変数のアドレスを void** に渡すのがイリーガルという話だと思う。 しかし・・・どうなんだろうな。 そいつらはともかくとして、 void* 変数のアドレスを void** に渡すことは 問題ないと思うんだが、これもダメなのか?
>>173 キャストを static_cast にすると、いっそうおk
ヘッダを見るに C の話だし。
うわ、すまんこ。
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)))の展開のされ方がさっぱりわかりません。 マクロ関数は少しだけなら理解してるつもりですが、このような式を理解 出来るレベルじゃないので、どなたか分かられる人、ご教授願いたいです。
>>178 演算をいっこずつ分解していけばいいんじゃないか?
long l = 0x000f000fL;
long* lp = &l;
POINTS FAR* pp = (POINTS FAR*)lp;
POINTS pt = *pp;
start = pt;
さぁ、わからないのはどこかね?
>>178 振り分けてなんかいない。2つ並んだ16bitのshortに32bitの値をそのまま上書きしてるだけ。
上書きもしてない。解釈し直してるだけ。 typedef union tagMAKEPOINTS_UNION { LONG l; POINTS pt; } MAKEPOINTS_UNION; MAKEPOINTS_UNION mkpt; mkpt = 0x000F000FL; start = mkpt.pt; みたいなもん。 MAKEPOINTS(0x000f000fL) は定数のアドレス取れないから失敗するけど、 まあそれは面倒だから略して書いただけと解釈しとく。
ミスった。 × mkpt = 0x000F000FL; ○ mkpt.l = 0x000F000FL; ね。
>>178 そこがFARポインタかどうかは関係ない。
sizeof (POINTS)とsizeof (LONG)やその他幾つかの整数型の大きさは同じ。
だからPOINTS型の値のビットの並びをそのまま整数型のビットの並びとして扱うことができ、
そうしてウィンドウプロシージャでは整数型として送ってくることがある。
それを元々のPOINTSのビットの並びとして使えるようにするためのマクロがMAKEPOINTS。
FARなんて(今となっては)飾りですよ
偉い人にはそれが分からないのです
Cにおいて、みなさん、どのような情報をヘッダにつけますか? 私は最初#defineなどヘッダに加えてインクルードしていましたが、最近になって 特定のCのソースしか#defineをつかってないならヘッダに書くのではなくソースの中で 定義したほうが、いいのではないのか?さらに特定に関数しか使用しないのなら 関数の中で#defineを定義したほうがいいのでは、と思うようになりました。 Cでカプセル化?を意識するなら、他にどのようなことを心がければいいのでしょうか?
>>186 インターフェースは最小限で、完全なものを目指す。それだけだ。
>>186 #define は { } のスコープに束縛されないから、
関数の中で #define したところで、
それより下全部で有効になる。
関数の最後で #undef しる。
189 :
178 :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++のコンストラクタ
のようにメンバ変数をこういう形でも初期化できるのかとこれまた初めて知りました。
とにかく知識が新しく増えたのと、教えてくれた方々に感謝です。
しょうもない質問かもしれないですけど VC6のrand関数使って8ビットの乱数を取得するときって @rand() & 0xff Arand() >> 7 のどっちが良い乱数ですか?
>>191 乱数の質から言えば一般的には後者。
でもRAND_MAXを32768と決め打ちにするので、
RAND_MAXを使って除算する方法を使うほうがいいと思う。(そし最適化に期待する)
>#define は { } のスコープに束縛されないから、 >関数の中で #define したところで、 >それより下全部で有効になる。 >関数の最後で #undef しる。 知らなかった・・・ありがトン ・・・で結局ヘッダには何を書くのが最良?公開すべき関数の宣言や#defineのみでしょうか?
>>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の順番を逆にするとうまくゆきますが、 上の書き方だと何がいけないのでしょうか。 どなたか教えてください。
同時にやれば? printf("m c ="); scanf("%d %c",&m,&c);
200 :
デフォルトの名無しさん :2006/05/14(日) 16:27:33
>>199 お返事ありがとうございます。
確かにうまくゆきますが、
198で述べた書き方だとどうしていけないのでしょうか??
>>200 最初のscanf()を成立させるために入力した改行文字が次のscanf()で拾われるため。
これがscanf()が嫌われる理由のうちの一つ。
先のscanf()で数値[Enter]としたら、その改行文字が残ってる 次にscanf()するとその改行文字を読み出してしまう
203 :
デフォルトの名無しさん :2006/05/14(日) 17:07:53
質問です(・ω・` 無料で使えるC++のコンパイラでお勧めなのありませんか?
g++ これ以上のC++コンパイラはない windowsならcygwinをインストールすると勝手に入る
>>205 cygwinをDLすればいいんでつね(・ω・`
やってみます
ありがとうございました
dllいらない分MinGWの方がよくね?
208 :
デフォルトの名無しさん :2006/05/14(日) 17:51:27
operator wchar_t *() が宣言されているクラスのインスタンスが operator wchar_t *() を使って返す値を char * にキャストしたいんだけど、クラスを書きえない場合はどう書けばいい?
>>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言語系の言語ならば、十分応用が効くということですね。
211 :
208 :2006/05/14(日) 18:07:31
VCって無料になったんじゃなかったっけ?
Visual Studio Express Editionsかg++のどちらかだな コンパイラとしてはg++の方がいいと思うが、 使いやすいのはVisual Studio Express Editionsの方かもな
gccとは違うの?>g++
GCC: 一連のコンパイラの集合名 gcc: GCC の C コンパイラ g++: GCC の C++ コンパイラ
Borland C++ Compilerも忘れないで
BCCってなにか特長ある?
古くて 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"を試しに先頭に付け加えても同じ結果になります。 どうすればいいんでしょうか?
プロジェクト最初に作った時にあった stdafx.h と stdafx.cpp を消したんじゃね? hello.cpp の設定 (ファイルを右クリックしてメニューの一番下・・・だったっけ?) にあるプリコンパイル済みヘッダファイルの設定で、 プリコンパイル済みヘッダファイルを使わないようにすればいい。 このあたり面倒なら、プロジェクト作る時 空のプロジェクトを作るようにすればいい。
>>221 dクス
仰るとおり消したのがよくなかったみたいです(・ω・´
なぜ消す? おもしろい奴だな。
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; } 上記メンバ関数を下記のように書き直したところ、強制終了が無く なったような気がします。
225 :
224 :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に直したのは全く関係が無い。 気づかないうちに他のところを一緒に修正したのか、それとも全く 治っていないのでその内また問題出る可能性が高い。 のどちらでしょうか?
227 :
224 :2006/05/15(月) 01:15:25
勘違いを招きやすい点を一点補足します。
>>224 > SBufと言う構造体をつくりメンバ変数として下記を持っています。
> SBuf* m_Buf;
m_Bufをメンバ変数に持っているのはSBufではありません。
全く別のC***というクラスが持っています。
>>226 単純なDWORDを2個持っているだけの構造体です。
メンバ関数は持っていません。
>>225 デバッガでどこで落ちてるのか調べたか?
少なくともソース2の修正は全く無意味だぞ
>>224 コードいじって貼ってるだろ。そのまま貼ったほうがいいだろうねぇ。
std::vector 使うと、解決しちゃうかもね。
>>224 そのコードで気になる点を。
SBufを20個確保し、先頭10個に以前のデータを代入、ここまではいい。
ただ、残り後半の10個は未初期化のままだが、いいのか?
コンストラクタで明示的に初期化しない限り、0初期化は保証されてないぞ。
その値を別の場所で使おうとして落ちてたりはしないか?
>>229 大元のソースはかなりでかいので、気になる点を単純化して
貼りました。
>>230 その後また代入して使いますのでこれは問題ないと思います。
>>228 > 少なくともソース2の修正は全く無意味だぞ
私の求める答えは現時点ではこれで十分です。
ソース2に修正したらとりあえず出なくなったので、「これが原因だっ
たのかなぁ?」と疑問に思ったので質問させていただきました。
根本原因がソース2に無い時点で、見直さなければならないことが
たくさんあるりますので、その辺をもう少し見直してまた追って報告
します。
>>231 単純化したコードで問題が再現することは確かめたか?
というかデバッガあるんだから、どこで落ちてるか確かめればいいのに
>>233 だからここで確かようとしてるんだろ
デバッガ=ここの回答者
配列をmemset() で初期化するとき、char型やshort型の配列に対応出来るよう memset(array, 1, sizeof(array)); で初期化したのですが、short型で初期化した場合、 257 で初期化されてしまいます。 どうすれば1で初期化できるでしょうか? レベルの低い質問ですみません。
C++ならstd::fillやstd::fill_n。
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); } と書いた方が、テンポラリオブジェクトの作成を一段階減らすことができると考えてよいのでしょうか? また、そうすべきなのでしょうか?
GetPointがそう複雑な処理でなくてinline関数ならどう書いてあっても似たような結果になると思うが。
>>239 リターン直後にスコープから外れてる気がするけど
あっ、ごめんなんでもない。 実体返しだったか。
>239 RVOなんて略語を使わずに戻り値最適化と日本語で書いて欲しい。 アセンブラコードを見るのが手っ取り早いのでは。 >240 勝手に条件を限定するのは良くないだろ。
RVOは割と「よく通る」略語で、遠慮する必要の無い物だと俺は思うです。
どっちも戻り値最適化できると思うわけだが。
コンパイラがどうするか、はこの際おいといて、 規格上RVOが適用されるのは後者だろうな。
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
((main.cとsub.cからtest.hをインクルード))
>>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 何が原因か教えてください。お願いします
>250 あいにくエスパーでないのでその本とやらの内容がわかりません
おおかた{}の数があってないんじゃね
}の閉じ忘れとかな
254 :
250 :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; って付いてるのはなんででつか?
>>255 main関数はintを返すように決められているから
0は一般的には正常終了の意味
257 :
デフォルトの名無しさん :2006/05/17(水) 23:37:26
どうも(^^) でも、普通 プログラムだとfalseが0じゃなかたですっけ? 上記のmain関数は、()に0がリターンされるってことでおkでつか? ・・・なんでmainにintつけてるの・・・
> falseが0 確かにfalseは0という値と互換性があるし、falseの代わりに0を使うことはあるけれど 0の代わりにfalseを使えるわけじゃない > ()に0がリターンされる 意味が分からない > なんでmainにint そう決まっているから
>>257 たしかにbool型を返す関数では成功したらtrueを返し、失敗したらfalseを返すのが当然けど、
mainが返す型はintであって、0の意味は
>>256 。
このようにintか何か整数型を返し、しかも0が成功の意味とすることもそれなりにある。
こうすると、失敗時には0以外の値が全て使えるので、それを使って何か意味のあるエラー値を返すことができ、
ただ失敗したということ以上の情報を伝えることができる。
C++の中で完結するなら例外処理を使うほうがスマートになることが多いだろうけど。
#include <stdlib.h> EXIT_SUCCESS EXIT_FAILURE
もっともらしく説明するとmainの返り値はエラー情報であって、成功=エラーがないときに0になるってことだ。
262 :
デフォルトの名無しさん :2006/05/18(木) 01:05:13
char input[100]; 略〜 bin[i]=(int)input[i]-(int)('0'); 略〜 という記述についてなんですが、型を()で囲んで記述するのをはじめて見ました。 これはchar型のinputという配列をint型に変換しているってことなんでしょうか? さらに、(int)('0')というのを引いていますがこれは、何をしているのでしょか?
>>262 (int) はキャスト。 '0' は文字リテラル。入門書なり入門サイトなりにもうちょっと目を通せ。
ただ、そのコードにあるキャストは、あってもなくても動作は変わらない。
>>263 ヒント:char が unsigned のこともある
>>265 まあ、'0' の方のキャストだけならそうだけども。
いくつかの文字コードでは、 '9' - '0' == 9 というように数字の文字から'0'を引くことで数値に変換できる。 まあ、あまり行儀のいいやりかたではないが。
269 :
262 :2006/05/18(木) 01:46:15
いろいろ検索しましたが、 キャストなどの意味はわかりましたが、 やっぱりなぜ(int)('0')を引いていかがわかりません。
>>269 それはここで聞いてもわからない。コード書いたやつに聞け。
271 :
262 :2006/05/18(木) 01:48:47
>>268 すみません、新着レスを見ていませんでした。なるほど!
数字の文字というのは、アスキーコードの数字の文字を、
数値に変換してるってことなんですか・・?
272 :
デフォルトの名無しさん :2006/05/18(木) 01:50:06
switch文で60<80まで見たいな比較はできないんですか?
>>272 全部並べないとできない。 if で書いたほうがマシ。
274 :
デフォルトの名無しさん :2006/05/18(木) 01:53:39
すみません、質問です。 構造体って、同時に変数宣言を2つ以上出来ますか?? たとえば、type型の構造体をn1とn2二つ宣言したいとして、 struct type n1,n2 ; はOKでしょうか??
OK
276 :
274 :2006/05/18(木) 01:58:51
>>267 C++ だと文字リテラルは char 型。
C とも C++ とも言ってない以上、
C++ の可能性も考慮する必要がある。
>>277 そうじゃなくて、式中に出てくるcharやshortは全てintに丸められるから
キャストしてもしなくても関係ないって話だろ?
>>278 やっと分かった。
なるほど。そういう風になってんのか。
>60<80まで見たいな比較 関数を作れ switch(pos(min,max)){ case 1: ...
C言語って割り算の余りを求める%の場合、 負の数と正の数の割り算は負の数の余りが出てきちゃうけど たとえば-5%3→-2って出るけど 普通の数学のように-5%3で1を出せるようにできないの?
>>281 実は、C99以前のCでは環境依存だったりする。
まぁ、素直に自前で計算しとけってこった。
>>282 標準ライブラリの div() なら決まってたりする?
普通の数学だと1が余るの? やべーマジでわからん。。 中学からやりなおすべき?
x, y(y>0)が与えられたとき、 x = y * q + r かつ 0 <= r < y かつ qは整数 を満たすq, rがただ一組存在するが、これをそれぞれxをyで割ったときの商、余りと呼ぶ。 この定義を使うと、-5割る3は-2余り1
>>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); }
教えてください。 ネットで入門的なところを見ながらやってるんですが 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ってなってしまうんです… 何がなんだか分らないです…
>>288 >0.00000 ^ 0.00000 = 1.000000ってなってしまうんです…
何か問題あるのか?
>>288 自分も入門だから役に立たないかもしれないけど
その作ってるpow関数は?
あと0乗って1じゃなかったっけ?
>>287 とりあえずspy++でメッセージ来てるか確認した?
#include <stdlib.h> 無いからじゃね?
295 :
288 :2006/05/18(木) 16:03:27
>>289 すいません解決しました
#include<stdlib.h>
が足りなかったみたいです
>>290 何の数字を入れてもそうなってたんです。
#include<stdlib.h>
を入れたら解決しました。
>>294 そうです。そうだったんですよ。
ありがとうございます。
なんでstdlibの有無で動作が変わるんだろう… 馬鹿な俺にも分かるように解説キボン
>>297 ・atdlib.hにはatofの宣言が書かれている
・宣言のない関数の戻り値はintと推定する
>>298 完全に理解しますた。
トンクス。
なるほど…
C++ならコンパイルエラーで終わりだが、Cは宣言のない関数が呼べちまうからな
>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).
>>268 しかし標準C/C++では'0'〜'9'の文字コードがそのように連続しているので、そんなことをしてもよい。
たしかに行儀はあまりよくないかもしれないけど。
304 :
デフォルトの名無しさん :2006/05/18(木) 20:34:56
プラットホームに依存すると指摘を受けましたのでこちらにきました 質問ですがC言語でfstatシステムコールを用いて ファイルのサイズとか種類とか調べるにはどうしたらいいんですか? 調べてもでてこないのですが・・・
>>303 > 標準C/C++では'0'〜'9'の文字コードがそのように連続している
そんなこと決まってないだろ。
あるソースで、 unsigned long aaa = NULL; としてありました。 しかし、ITRONではNULLは #define NULL (void *)0 で定義されていました。 そのため、そのソースでITRON.Hをインクルードする前に #define NULL 0 としてました。 また、他のソースでは unsigned short bbb = (short)NULL; としてキャストして使用してました。 普通このようにNULLって使うものですか? 私はNULLはポインタなどの初期化に使うものだと思っており 変数は普通に0で初期化するものだと思っていましたが・・・
309 :
デフォルトの名無しさん :2006/05/18(木) 22:17:44
T(int) って型変換を定義してあって、 関数 f( T t ) を f( 5 ) ってした場合、 型変換T(int)で一時オブジェクトができて、 それからコピーコンストラクタが呼ばれるのか? それとも型変換T(int)のみで仮引数が構築されるのか? 誰か教えてくんろ
>>309 T t = 5; の形で初期化したときと同じように初期化される。
意味上は一時オブジェクトを生成してコピーコンストラクタを使うことになるが、
この一時オブジェクトの生成は省略することが許されている。
311 :
304 :2006/05/18(木) 22:34:36
すみません・・・ int fstat(int filedes, struct stat *buf); ってどうやって使うんですか・・・・
>>311 まず自分でどう書いてどうなったのか言ってみろ。
>306 決まっている
>>315 atoiの中身がどうなってると思ってるんだ?
>>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 それは関係ない。
>>268 ができないならatoiがどうやってると思ってるんだ?
switch以外にもメモリーコスト度外視してテーブル参照などなど。 線形時間で返そうとおもえば返せる。
数字の文字コードが繋がってる事が 言語仕様で決まってるってのを知らないのは まあ無理も無い話。 結構マニアックだもんな。
アルファベットについての記述は無いの? 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); }
>>324 if文の有効範囲に誤解があるな。
if (・・・)
printf("hoge");
途中送信.・゚・(ノД`)・゚・。 if (・・・) printf("hoge"); printf("sage"); は if (・・・) { printf("hoge"); } printf("sage"); と同じこと。n4 > 0の場合についての箇所を見直すのと、 if (n4 < 0)もelse ifにするべきでは。 というかヘタに省略せず、面倒でも最初は{}を書くようにした方がいいと思うが
>>324 > if (n4 > 0 && n4 < 0)
これは・・・
実行例: (環境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のコンパイラを使ってます。
zlib使え
a-f の方は分断されてるな。
333 :
デフォルトの名無しさん :2006/05/19(金) 05:59:04
>>292 spy++の存在忘れていました・・・(汗
次からまず試してみます。。
>>293 >>If a window has captured the mouse, this message is not posted.
キャプチャされてるとメッセージ送られないんですね。。。
他の手段で実現することを考えてみます。。 ありがとう御座いました(><;
>>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 ありがとうございます。
すごく幸せになりました!!!!!
今使ってるコンパイラは日本語対応に弱いんですね(;´∀`)
コンパイラは何を使ってるの?
340 :
デフォルトの名無しさん :2006/05/19(金) 19:43:17
ある目的のプログラムを2つのモジュールに分けて作成したんですが、 いざ繋げるときにどうやってやったらいいのかわかりません・・。 優しい方教えてください。 環境はVC++.net、MFC、ダイアログベースで作りました。
>>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
ってエラーメッセージが出るんですが
このメッセージって調べてみたんですが位置がおかしい
ってことですよね?
別に変なところはいじってないつもりなんですが…
いきなりこんな風になることってありますか?
>>341 Cygwinのgccは日本語通そうとするとよくミスるな
だから俺はどうしても日本語通す必要がある場合にはICCかVC++のコマンドラインコンパイラ使うことにしてる
ldってリンカだっけ?collect2ってののアクセス権がおかしいのかな
それはgccスレで聞いた方がより的確なアドバイスが貰えるんじゃないかと思う
343 :
デフォルトの名無しさん :2006/05/19(金) 20:12:25
>>342 ご丁寧にありがとうございます。
gccのスレに行って聞いて見ます
そうなんですか…やっぱり弱いんですね
本当は変えたいんですが
C自体を始めたばかりなのと
本とネットので調べてやってるだけなのでいきなり変わると
全く出来なくなりそうで怖かったり(;゚д゚)
gcc --input-charset=cp932 --exec-charset=cp932 をaliasしとけばいいのではない?
>>344 ありがとうございます。
一応、インストールしなおしたら解決しました。
すいません。報告が遅れました。
ただ、根本的な解決ではなかったので
もし同じような症状が出たらやってみます。
346 :
デフォルトの名無しさん :2006/05/19(金) 22:29:26
すごく初歩的なことをお聞きしたいのですが、 標準ライブラリってあるけど、あれってファイルアクセスだとか メモリアクセスとかって最終的にはOSのAPIを呼び出すことになりますよね? そのAPIを呼び出す部分は環境依存になってしまうと思うのですが、 その部分って、.libファイル?とかにまとめられてて、 リンカが環境に応じてリンクさせるので、 標準ライブラリのソース自体には環境依存性はないよ ・・・という考えで良いですか??
>>346 × 標準ライブラリのソース自体には環境依存性はないよ
○ 標準ライブラリを使ったソース自体には環境依存性はないよ
そりゃ標準ライブラリを実装する側は環境依存になる。 あくまで標準ライブラリを使う側が環境依存でなくなるというだけ。
配列を動的に増やすにはどうすればいいの? クラスで設計しようと思ったんだけど、うまくいかない。 元の配列を一時配列(サイズは元の配列+1)にコピーして、一時的に元の配列を消して新しく元の配列+1の配列を用意する。 この時点で、一時配列の一番後ろの所に新要素を入れて、新しい配列を作ってそこに全部コピーして最後に一時配列を削除するっていう手順を踏んだけど、 どうしても、配列のサイズが巨大になる(templateで巨大なクラスを指定したり)と相当処理が重くなる気がする。 一時配列を使わないでサイズを大きくする方法があったら教えて。
普通にstd::vector使えばいいやん
つーか、テンポラリの配列なんぞ作らんでも新しい配列作ってそこに元配列のデータ+新しいデータコピーして、 元配列削除したあとで元配列を保持していたポインタに新しい配列つっこめば終わるわけだが。 頻繁にサイズ拡大が起こるようならあらかじめ配列のサイズに余裕を持たせておくといい。 というようなことを勝手にやってくれるのがstd::vectorなわけだが。 場合によってはstd::dequeのようなチャンク型配列が有効な場合もある。
質問なんですが ファイルに"001,jpg"; と書いてある場合で char *mojiretu; char st[256]; fscanf(fp,"%s",st); mojiretu = strtok( st, ";" ); と書いていますが、mojiretuの中身は""001,jpg""と前と後ろに " が よけいに付いてしまいます。 mojiretuが"001.jpg"となるようにするには、どうすればいいですか?
>>349 +1サイズの新規バッファにコピー>元の配列を解放>配列を格納してるポインタに新規バッファのポインタをコピーでコピー一回で済むぞ。
それと頻繁にサイズ変更するならバッファが足りなくなった時に大きめにバッファ確保すればコピーする回数は大きく減らせる。
でも俺ならstd::vector使うけど。
>>353 mojiretu の中身はどうやって確認してる?
>>347-348 サンクスです。
あー、なるほど。
てっきり標準ライブラリって共通のソースと
コンパイラベンダー提供の環境依存部分のソースに
分かれてるんだと思ってました。
実際には全部コンパイラベンダーさんが
がんがって作ってくれてるんですね。
357 :
353 :2006/05/19(金) 23:08:24
>>355 直後にブレークポイント設置して確認してます
mojiretu="001.jpg"
をした時は"001.jpg"となります
int* start; 最初にstartに現在の配列を括り付けといて、新しい配列(長さは+1)を作ってその一番後ろにデータを付ける。 古い方の配列を消して、startに新しい配列を括り付けるという手順でおk? 確かに1つ配列な長くなる度に配列を解放してたら時間が掛かるなぁ...
>>357 デバッガの表示が "" を追加してるだけじゃない?
puts(mojiretu) してみ。
>>358 いや、重いのはメモリの解放じゃなくて配列のコピーだろ。
361 :
デフォルトの名無しさん :2006/05/19(金) 23:57:23
最近分かったんだが、 複雑なファイルを読み込み検証したい場合fscanfだと役不足だったんだな 今はもうどんな複雑やつだろうと整理出来るから すきなだけ楽しめる よくあるRPGの戦闘部分再現させて楽しんでる 音声画像ないけど
>>360 確かに、コピーですたorz
ポインタへのポインタでnewで確保したところにドンドン配列を括り付けていけないか?
364 :
デフォルトの名無しさん :2006/05/20(土) 00:06:05
K´ 「アンタじゃ役不足だせ…」 これでどうだッ!
>>362 リスト構造のことか?(「括り付ける」とかいう俺様表現やめれ)
ついこないだまでvectorがリスト構造だと思ってますた (><)
C言語に特化したスレってありませんか? やっぱりCとC++って似てそうで異なる言語だからね。 私じゃスレを立てることができないので・・・すみません。
あのスレはやめとけ。育ちが悪いやつらが多すぎる。
>>13 確かに、言葉でわかるより体で感じるタイプもいるからな。
ss[i]じゃダメなんだと体で覚えるわけか、先が大変そうだな
ほんと初歩ともいえない質問すみません。 stlrenを使わずに文字配列で後ろから文字を出力する方法ってどうやるのですか?
>>371 なんで使っちゃいけないのか知らんが
自分で先頭から順に '\0' を探して、そこから逆順に1文字ずつ出力
うしろからって逆順で出力するのか?
レス遅れました逆順で出力します
>>372 さんの言ったようにヌル(ナル)までインクリメントしてその後
デクリメントを利用して配列を0まで出力しようとしてもなぜか成功しないので
今もいろいろ試行錯誤してます
試行錯誤してたらできるようになりました すれ汚しごめんなさい
int ********p ; っていう変数をみました。 理解できないわけではないのですが、こういうのは仕様が悪いのですか?
>>377 ひょっとして数値計算関連のプログラム?
まぁ最長一致について学べる機会という事で
まあ、 (*********************************puts)("Hello, world."); が通るのに比べたらまだまだ。
関数ポインタなんて*付け放題ですよ
>>381 数値計算なら、まあありうるかもしれない。
ポインタテーブルでメモリを圧迫しないなら、
各要素へのアクセスの可読性が高いから
そうする手もアリだとは思う。
ただ、全要素を一列に並べて(int *p; で扱う)、
8つのインデックスから位置を計算してアクセス、
っつー方がメモリの無駄が少ないかもしれない。
「かもしれない」ってのは、うまい位置の計算法がなければ、
無駄なメモリを確保する必要があるかもしれないから。
折衷案として、int **p; として、
4インデックスごとにまとめるとか、
そういう事やった方が便利な事もあるかもしれない。
このあたりは好きにして。
inline関数について質問です クラス本体内で宣言されたメンバ関数は暗黙 にinline化されると本に書いてありましたが どういうことが行われるのかイメージが湧きません 簡単なサンプルコードを示してもらえないでしょうか?
>>385 クラス本体外で inline つけて定義したのと同じことになるってこと。
サンプルコードなんか要らない。
>>385 サンプルを提示するのは簡単だが、それをコンパイラがどうコンパイルするかは別の問題。
どうしても違いを見たいなら、
#include <cstdio>
#include <cstdlib>
class Foo {
foo() {std::exit(1);}
};
int main()
{
Foo foo;
return 0;
}
これを最適化の指定とアセンブリ出力の指定をつけてコンパイルして、最適化しない場合と較べてみればいい。
>>385 class Hoge
{
void f() {/* 〜 */}
};
上は下のように書かれたものとして扱われるという決まりになっている。
class Hoge
{
void f();
};
inline void Hoge::f() {/* 〜 */}
演算子の定義の効率的な使い方の例を教えてください。
>>389 std::complex
boost::quaternion
boost::octonion
std::string コンテナ全般 boost::spirit #こっちはs/効率/変態/ か?
392 :
389 :2006/05/21(日) 23:21:44
>>391 !!!!!!
こりゃ便利だ!数字operator数字しか思いつかなかった…
マジ感謝
393 :
デフォルトの名無しさん :2006/05/21(日) 23:48:01
VisualStudio.NET(スレ違い?)でC++をコーディングしておりますが 自分の環境で充分テストしてから本番機に投入したところ いざ稼動させたらランタイムエラー(ハンドルできない例外)が発生し… ソースを見てもなぜに例外が出るのかわからず(とうてい出るとは思えない箇所)・・・ そして、しょうがないので全く同じソースを再度コンパイルしなおしたのですが… するとランタイムエラーは出なくなった。 絶望した!! C++の難しさに、奥深さに、意味解らなさに、、、絶望したァッッッ!! こんなことって、あるのだろうか。。。orz
template <typename T> typedef void (*FP_SELECT_F)(T); みたいなことができたらいいなあ。
ビットフィールドに関して教えてください。 32bitのビットフィールドを以下の様に定義しました。 struct dword { unsigned bit0 : 1; ↓ unsigned bit31 : 1; }; この状態でsizeof(dword)は4バイトになります。 このdwordを配列としてdword aaa[256]として定義した場合、 aaaはメモリ上に連続した空間として確保されるのでしょうか? ポインタ参照でaaaにアクセスした時に大丈夫なのか考えています。
>>397 その質問にビットフィールドがどう関係しているのか、わからない。
確保されるかは、実行してみて確かめればいい
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も試してみたのですが、上手くいきませんでした。
例外処理について勉強してる最中なので
見当違いなことをしてるのかもしれませんが、ご教授下さい。
>>401 「__try __except EXCEPTION_ACCESS_VIOLATION」でぐぐるとたくさん例が出てくるお。
というか、 char t[10]; strncpy(t, "test", -1); でなんら例外が発生しないんだから、別の場所で例外で出てるんでは。
>>403 仮にsizeof(int)が4、負数を2の補数表現で表すの環境の場合、
配列tの先頭から0xFFFFFFFFバイトの領域に書き込みしようとするが、
それでもアクセス違反にならないと?
# 例外が発生するかしないかは環境依存なのかもしれないが。
>>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; } これ間違ってますか??お願いします。
>>405 strncpy()は、コピー元が指定バイトに満たない場合、コピー先の残りを'\0'で埋める。
>>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); というようなイメージなのですが…。 静的メンバ関数じゃないとダメでしょうか?
80までだったら i<=80 の方が分かりやすくね?
411 :
405 :2006/05/22(月) 22:30:49
メンバ関数ってのはこっそりthisポインタ渡してる
>>409 クラスのメンバ関数には、暗黙的にthisポインタがついている。
そのため、静的でないと指定出来ない。
414 :
デフォルトの名無しさん :2006/05/22(月) 22:33:53
>>408 さん
ありがとうございます!
iを進めるのはどう書いたらいいのですか?
(初歩的なこと聞いてすみません。。)
>>410 さん
確かにそうですね、ありがとうございます。
>>412 となるとここでは静的メソッドか、通常の関数を用意するしかないですね。
ありがとうございました。
>>415 DialogBoxParamと、SetProp或いはSetWindowLongPtrを組み合わせるなどしてがんばれば、
最終的にメンバ関数でも(それどこかどんな関数オブジェクトでも)コールバックされるようにすることはできる。
>>401 tがstrncpy後にアクセスされることなくスコープ外れて消滅するからstrncpy呼び出しを含めたブロック全体が最適化で端折られてたりせんか
418 :
401 :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を当ててからまた試してみようと思います。
そもそも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するのって、どういう意味がある のでしょうか。もしかして、何か根本的なところで勘違いしているのでしょうか ?
422 :
405 :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しなくてもただの代入で大丈夫ですよね? 試してみた限りでは大丈夫そうだったんですが。
426 :
デフォルトの名無しさん :2006/05/23(火) 16:29:58
現在、C++のプログラミングをvisual C++で製作しています struct VECTOR2{ double x; double y; } この構造体をプログラム全体で共用したいのですが、 どのように宣言すればよろしいのでしょうか? common.hなるものをつくってそこで構造体を宣言して 使用するクラスでヘッダを読み込んでいたのですが、 error C2011: 'VECTOR2' : 'struct' で示される型としてすでに定義されています。 と表示されます。どうしてそうなるのかが分かりません。 よろしくお願いします。
>>426 二回includeされているんジャマイカ?
# includeされるファイル内のincludeにも注意!
>>426 VCならcommon.hの先頭に#pragma once
429 :
デフォルトの名無しさん :2006/05/23(火) 16:58:38
>>428 解決しました。
ヘッダファイルはどこでもここでも読ませたらいけないんですね。
ヘッダの中で同じヘッダを読み込むと問題が起こるとはじめて知りました。
#pragma once 使えますね。
ただ、他の環境だと使えないかもしれないから、
今のうちによい方法をみつけないと・・。
431 :
デフォルトの名無しさん :2006/05/23(火) 17:08:57
borlandインストールして、 環境変数の設定でpathに数値を追加しようとしたのですが、誤って元の数値を消してしまいました・・・ どうすればいいんでしょうか・・・?
適用押さなければおk
433 :
431 :2006/05/23(火) 21:02:03
それが・・・ 既に適用は押してしまっていて・・・ これ、「>bcc32」ってコマンドプロンプトから略せ無くなる以外にも不具合出てきますよね?
それって変えたのユーザ環境変数? システム環境変数?
435 :
デフォルトの名無しさん :2006/05/23(火) 21:20:35
MSVC++ on Win2k でのエラーに関する質問です、 Invalid Address specified to RtlFreeHeap( 2a70000, 2c8f990 ) 以下のエラーメッセージにおける括弧内の二つの引数はなにを 表しているんでしょうか?
436 :
431 :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'型に変換できないというエラーがでました。 なんとか変換する方法はないでしょうか。 配列を配列に変換する為にはなにが必要ですか?
>>438 strcpy()でコピーできるが、std::string使えばいいじゃん。
>>438 ソース書いたほうがいいよ。char * と char は別物だし、どういう風に実行させたいのかも
いまいち分からないので、間違いを指摘しづらい。
441 :
435 :2006/05/23(火) 21:55:45
書き忘れましたけど、 VC++ 6.0 です。sp は当ててます。
>>438 > なにが必要ですか?
問題を整理する頭
全然C++じゃないな。 ただのCだ。
標準の文字列操作関数も知らん馬鹿が=で代入しようとしてるんだろ。
>>435 それらの値の詳しい意味は自分も知らんのだけど、
free()に変なアドレス渡したり、free()に正しい値を渡してるけどヒー
プオーバーフローとかしてない?
446 :
デフォルトの名無しさん :2006/05/23(火) 23:01:30
>>444 それだ!
charで文字として読み込んだ数字をintの数字としてあとの計算で使いたいんだ。
charをintに変換するのはどうするのよ?
大学1年生でもわかるよう説明してもらえるとありがたいです。。。
447 :
435 :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
450 :
448 :2006/05/23(火) 23:14:01
自己解決しました。お騒がせしました。
448みたいにたまにいるけど、リターンに括弧つけてるのはなんで? カッコつけてるとか駄洒落はかんべん。
452 :
デフォルトの名無しさん :2006/05/23(火) 23:22:00
かっこつけてる。
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です。 キーを押しつづけて入力しつづけているのですが、上記エラーで受信できません。 何がいけないのでしょうか? また、ソースも全部晒した方がよいでしょうか?
>>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でしたが、残りはどこに・・・?
>>455 最後の要素数を省略するのはそういう使い方のためではないと思う。
環境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でしたが、残りはどこに・・・?
>>455 sizeof は型の情報だけでサイズを求める。
実行時に何かするわけじゃない。
459 :
457 :2006/05/24(水) 00:05:36
>>456 連続投稿スマソ。なんかPOST拒否られたので書かれていないとオモタ。
例えば、組込みなんかでROMに書き出したときにどうなるのか
考えていたんだけど、良くわからなくなってきた。
文法的に間違っている?
460 :
457 :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バイトで
取られれば問題は無いんだけど・・・。
461 :
453 :2006/05/24(水) 00:11:02
送信可能で受信不可な問題は解決しました。 ケーブルを変えてみたら動きました。 ブロッキングの問題はそのままです。
>>460 ROM領域なぞ関係ない。
根本が間違ってる。
そもそもSTR_TEST foo = { 0, {1,2,3} };と書けることが驚き。 動的にメモリ確保するなどしないと駄目かと思っていた。
464 :
457 :2006/05/24(水) 00:24:00
>>462 いや、問題はROM領域だったりするので、大いに関係あったり(汗
すいません。
実行時にサイズを取得する必要は無くて、
>>460 の例だとfoo1から
連続領域に12バイト格納されていれば解決なんですけど。
>>464 だから、そういう次元の問題じゃない。
根本の解釈が間違ってる。
ちなみに
>>455 はgccではエラー。
error: non-static initialization of a flexible array member
error: (near initialization for `foo')
staticにすれば通るけどね。
467 :
457 :2006/05/24(水) 00:27:40
>>463 VC6.0だと警告無く通ります。VC7以上だと警告でます。
ただ、作るときには商用の組込み系のコンパイラを使うので
そもそもこの書き方が許されるかも知りたいところ。
468 :
457 :2006/05/24(水) 00:30:34
>>465 すんません、他の問題は把握できてないです・・・。
どういう解釈だと筋通りますか?
>>467 とても組み込み系をやっている/やろうとしている人の書く内容じゃないな。
辞めた方がいいんじゃないか?
470 :
457 :2006/05/24(水) 00:32:41
>>466 thanx!
実際の使用方法もstatic使用なので問題無いです。今の所は・・・。
構造体の中のサイズなし配列は、C99より前では違反、C99から合法。 初期化方法については資料が手元にないので知らん。
>>467 なら環境VC6とか言うなよ。
>>470 const も付けないと ROM に行かないよ。
473 :
457 :2006/05/24(水) 00:36:57
>>471 やっと解決しました。C99からだったのですね。
通るコンパイラと通らないコンパイラがあって必死で資料探っていたところです。
どうもスレ汚ししました。
474 :
457 :2006/05/24(水) 00:38:31
>>472 ゴメンス
VCだとRAMに確保されてしまいますね。
>>474 そもそもVCはパソコン用のコンパイラだから、ROM/RAMと言うこと自体がナンセンス。
477 :
457 :2006/05/24(水) 00:51:33
>>475 是非そうしたいのですが・・・。
>>476 シミュレートはVCでやる規則なんで・・・。
焼き付けた後に不具合出すとヤバイから。
static付けても実行結果変わらないんだけど457はそれでいいのかな。
480 :
457 :2006/05/24(水) 00:55:11
>>480 シミュレーション後、コンパイルエラーが多発したり、
結局、思った通りに動かなくて途方に暮れるに100Kペリカ。
482 :
457 :2006/05/24(水) 01:02:59
>>481 もう途方に暮れているから問題ないよ・・・。
そもそも既存のソースだから、誰も触れないし。
あなたに100Kペリカ
>>475 組み込み向けを想定してるコンパイラなら const でセクションが分かれる。
自分で分ける必要はあんまり無い。
>>461 クロスケーブル使っているのならケーブルによってはハードウェアハンドシェイクが使えないので要注意。
どっちみち相手側とハンドシェイク手段があっていないと伝送はできない。
詳しくは制御系スレで聞いた方がよさそう。
printfみたいに書式設定して、その結果を画面じゃなくて戻り値か何かで変数に代入できる関数ってなんだっけ。
だからsnprintfは使うなと何度(ry
490 :
485 :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; }
long 型であることを明示するのに 0L とか書いたりするけど、 short型であるのを明示するためのサフィックスってあるんでしょうか?
どちらかと言うとショートヘアよりロングヘアがタイプです。 0Lっていうのはポニーテールの事だと思うから、ショートなら0で良いんぢゃない?
環境: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' : 関数はオーバーロードできません ↑こういうエラーが出てるのですが原因が分かりません。 あと他の関数は書くと長くなるので省きました。 原因分かる方は教えてください、お願いします。
>>492 shortには「(short)0」ぐらいしか書きようがないのだけど、
int16_tなら、「INT16_C(0)」ってのが標準にあります。
>>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
のように見えるわけだ。
>>495 プロジェクトの設定がMFCアプリとかコンソールアプリになってんだろ。
>>499 確認したらちゃんとWin32プロジェクトでした。
それと.NET 2003にコピペしてビルドしたら
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 _WinMainCRTStartup で参照されました。
↑こんな感じになりました
「プロジェクトの設定」の意味が判っていないに一票。
プロジェクトって初め新規作成で選ぶ奴じゃないんですか? 良く分からないです_| ̄|○
>>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);
505 :
495 :2006/05/24(水) 20:29:45
>>504 3番をやってみたところビルド成功しました。
実行はちょっと変でしたがビルドが通ったので後は何とかします。
ウインドウクラスネームとウインドウのタイトルの配列をLPWSTRで
キャストしてたんでそれが原因なのかな?
とにかく、どうもありがとうございました。
>>503 整数の昇格が行われない文脈もあるから(特にC++)、意味がないってのは言い過ぎだろ。
どっちかというと、どうせintの範囲に収まるんだからintリテラルをキャストすれば十分、ってのが理由だと思う。
>>505 504はどちらかというと後の方ほどお勧めできない。
構造体の中に変数と関数ポインタを設定し、C++っぽくしてみようと試みましたが ある関数(変数)は外部から参照できないように、ある関数(変数)はグローバルに・・・みたいに できませんか? そんなに構造体を二つにすれば解決すると思うのですが、できれば一つの構造体で 構成したいのです。 仮に、構造体を二つ、公開用と非公開用をつくり、それを一つの構造体の中に格納する・・・ みたいなものってできますか?
おとなしくC++使えよ
>>508 変数へのアクセスは全て関数経由でも良ければ、
公開するヘッダでは不完全型のtypedefだけを書き、構造体の宣言は書かないという手もある。
511 :
491 :2006/05/24(水) 22:20:07
誰か教えて下さい
512 :
デフォルトの名無しさん :2006/05/24(水) 22:36:18
>>511 せめて「お願いします」の一言くらいほしいぞー。
整数部が10倍されてるんじゃなくて、改行文字が足りないだけ。
例えば、
5.52と入力し、整数部と小数部を改行なしで出力したら、
5と0.52で50.52と表示されるわけ。
つーか、ポインタが理解できてないです…。よくこれで動くな。
513 :
512 :2006/05/24(水) 22:44:00
あれ、
>>498 がちゃんと答えてるじゃん…
しかもここsage??ごめんなさい。さよなら…
しかもおかしいのはポインタじゃなくて戻り値じゃん。 511と512を消したい…
( ´∀`)σ)A`)
>>488-489 C99 の規格を見た限りではあんまり問題なさそうなんだけど、まずい実装が多いってこと?
517 :
491 :2006/05/25(木) 00:11:04
>>498 さん
なるほど、関数がおかしいわけじゃなく
出力の仕方がわるかったのですね
非常に丁寧な説明ありがとうございました
出来の悪い初心者と言うのは、行うべき処理をまとめようともせずに、 いきなりコーディングを行おうとするのは何故でしょうか?
>>518 コーディングしようと思ってるからだろ。
コーディングの前に何か準備が要るということは自明ではない。
>>518 いいじゃね別にどうでも。初心者っつても色々いるだろうし。
じっくりやるのが好きな奴もいれば、なんか動かさないと詰まんないやつも居る。
死ぬほどコーディングやってれば、その内どうやるのが効率的なのか考えるよう
になるし、その内筋肉が覚えるよ。
俺にとって気になるのは、上から見下ろしたような意見をたれる自称上級者だけ
どね・・・・
そもそも日本語も変だしな。 あらゆる意味でハズしてるな。
>508 無理、あきらめろ。 さらに言えば、Cでそのような考え方をするな。
C++のクラスを形だけまねるんじゃなくて、 カプセル化とかの概念をどうCで実装するか を考えたほうがいいと思うよ。
>>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
あげ
#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); } }
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; }
これを実行しようとしてもエラーがでます。 fwrite(local->tm_year,sizeof(struct tm),1,fp); ここら辺がが間違っているとがわかったのですが具体的にどうしたらいいか教えてください 時刻と日付をバイナリファイルに書き込むものです
&
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); パラメータ buffer 書き込むデータへのポインタ size 項目のサイズ (バイト単位)。 count 書き込む最大項目数。 stream FILE 構造体へのポインタ。
class-name *po; po = &obj; の時に、メンバにアクセスする時 po->member; て事は、 &obj->menber; も通用するの?
(&obj)->member; ね。
(&obj)->memberは通用する(&obj->memberは演算子の優先順位の問題で無理)。 でも、(*po).memberとやらないように(&obj)->memberとやることも普通はない。
535 :
デフォルトの名無しさん :2006/05/26(金) 12:44:18
g++利用のC++なんですが、pthread_createをメンバ関数に対して行いたいのですが pthreadはメンバ関数には適用できないのでしょうか? わかる人いたら教えていただけませんか?
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も使う必要無く 良い解決法があるのでしょうか。 長々とした疑問文すいません。勉強してて「これじゃ、重くなるんじゃないのか?」 と思って気になってしまいました。どなたか教えください、お願いしまっす。
> そのCopyObjectのポインタが、thisである。と解釈すれば良いのでしょうか。 違います。 コピーコンストラクタで生成されたオブジェクトは、プログラマには見えない返値用のテンポラリです。 > そうなら、operatorを使うたびに、メモリ上にInstance作成破棄を行うのでしょうか。 値(オブジェクト)を返す以上、常にテンポラリが作られます。 ただ、これは演算子オーバーロード特有の問題というわけではなく、 たとえば自前でadd関数を用意したとしても、オブジェクトを返す以上は免れない問題なので これを理由に「演算子オーバーロードを使わない」というのはナンセンス。 > 他の演算子も工夫して一時的なObjectもCopyConstructerも使う必要無く良い解決法があるのでしょうか。 ありません。 Effective C++ 第23項「オブジェクトを返さなければならないときに、リファレンスを返そうとがんばるのはやめよう」を参照。 それと返値はClassNameではなくconst ClassNameに。 operator+はメンバ関数でなく、非メンバ関数(場合によってはfriend関数)として用意し、 operator+=を使って実装するのが通例。
>>535 staticメンバ関数(クラスメンバ関数?)なら渡せるよ
どうしてもメンバ関数を渡したいなら コールバックの引数にthisポインタを積んどけばいいじゃない
俺はいつも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ではコンパイルをするときに特別に違うことはありますか?
545 :
デフォルトの名無しさん :2006/05/26(金) 22:42:57
さっき宿題スレでも聞いたんですが、terapadて゛C言語をやりたいんですが、環境変数いじるんですか?
>>545 使うコンパイラによる。
エディタに何を使うかはあまり関係ない。
547 :
デフォルトの名無しさん :2006/05/26(金) 22:46:20
ソースがひとつの場合を普通な場合と思ってました。 あなたの普通に違うというところを教えてください。
548 :
デフォルトの名無しさん :2006/05/26(金) 22:48:46
とりあえず日本語をどうにかしてこい
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 でコンパイルしてます。
>>550 俺のESPが
「可変長引数を使ってstd::stringを構築したいよドラえもん」
と翻訳しているんだが
もしそうなら
std::stringstreamを使うかboost::lexal_castだかなんだかを使えばいいんじゃね?
>>551 read_JPEG_fileはライブラリのサンプルで定義されている関数で、
ライブラリの関数じゃないだろが。
どうしても使いたければexample.cからコピペ汁
554 :
デフォルトの名無しさん :2006/05/26(金) 23:44:48
>>553 明日ためしてみます。
回答ありがとうございました。
explicit(だっけ?)で暗黙の型変換を禁止することで、何か良いことある? 逆に暗黙の変換があると便利だと思うんだけど。
EffectiveC++を嫁
予期しない変換で訳の分からん事になるのを防げる。 整数のつもりで書いた4が4要素のstd::vector<double>に暗黙のうちに変換されたらやってられんだろ。
>>559 stringに格納したいと言っているから、それは違うと思うぞ。
>>560 間違ってないんじゃね?
あらかじめリサイズが必要だが
CString#Format() みたいな事をしたいんじゃないかと思ってた
>>561 c_str() の戻り値には const 付いてるから無理。
>>564 それ % で引数区切るからキモイんだが
>>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"); のようにやってみたのですができませんでした。 これはどうすればできるようになるのでしょうか?教えてください。よろしくお願いいたします。
\(/) は \\ か / で十分。 フォルダが存在してない場合あらかじめ作っとかないと、エラーが起きるよ。
569 :
デフォルトの名無しさん :2006/05/27(土) 11:22:44
>>568 ありがとうございます!!フォルダを最初に作るのを忘れてました。
どうも最近フォルダを自動的に作ってくれるソフトが多くて
コンピュータにフォルダ作成作業まで頼ってました(w
boost::filesystemを使うと楽かも。
>569 フォルダ作る処理はOS依存。 ある程度統一されたやり方でやりたかったらboost::filesystem使うべし。標準じゃないけど。
環境はborland C++ 5.5です。 Win32APIのリストビューにて、 左が項目名、右がその項目の値(値の変更可能)となっているものをつくろうと思っています。 それでわからないところは、 値のところにカーソルがあたったら編集が出来るようにする方法がわかりません。 一列目はウィンドウスタイルにLVS_EDITLABELSを指定したら出来るのはわかりました。 ですけど値が二列目なのでそれだと編集が出来ません。 どのようにしたらこれは出来るのでしょうか?
>>572 基本的にはできません。
どうしてもセルの編集をしたければ、自前のEditBoxを巧いこと生成するか、
ラベルの編集機能を制御する形で誤魔化すか、
いずれにしても結構面倒です。
574 :
572 :2006/05/27(土) 15:17:08
>>573 めんどいのかぁ。
それなら自前のEditBoxの方法にしようと思います。
それだと後からコンボボックスにすることも出来そうだと思うので・・・
お願いです!
そういったことに詳しく載っているサイトを知っていたら
教えてもらえないでしょうか?
575 :
572 :2006/05/27(土) 15:35:55
とりあえずEditBoxは表示できました。 けど文字サイズが大きすぎだよ。 リストビューのフォントを取得しなくてはだめっぽいなぁ どのメッセージを送ったらいいのだ?
ちょっとは自分で調べろボケ
578 :
572 :2006/05/27(土) 16:07:56
CodeGuru・・・、(検索中) うわ、英語のサイトなのか! ってことはこのサイトは使えるってことですね? Excite翻訳で頑張って調べます!
Excite翻訳掛けながら調べるぐらいなら、日本語のサイト探した方がいいと思うがな
>572 スレ違い。Win32APIスレあたりにどうぞ。
581 :
572 :2006/05/27(土) 16:30:40
>>580 >1によるとWin32APIも対象にはいってるぞ。
まぁこの問題はスレタイによる【初心者歓迎】の【初心者】に入れるかどうかだが・・・
ほぼ初心者だと思う。
まぁ、どちらにしろ専門スレのほうにいったほうがいいんじゃないか?
583 :
550 :2006/05/27(土) 22:11:32
>>552 >>564 >>566 ありがとうございます。string用に書式化するのがあるんですね。
…で、またそれに関して質問なんですが、
GetPrivateProfileStringのような関数から得た結果を
また同じようにstringオブジェクトに格納する方法はありますか?
WritePrivateProfileStringならc_str()でいいんですけれども。
>>583 君はstringについて、もっと勉強した方がいい。
585 :
デフォルトの名無しさん :2006/05/28(日) 10:51:48
ボーランドで Cのコンパイラとデバッグをダウンロードして フリーのC環境ソフトの bcc デベロッパーをダウンロードしましたが 使えません 何回やっても Cがプログラムできる環境(状態)になりません どうしたらいいでしょうか? 教えてください!!m(_ _)m
587 :
デフォルトの名無しさん :2006/05/28(日) 11:16:05
諦められないですよ〜(>_<)(>_<) ボーランドのCコンパイラを使うには Outlookとか必要なんですかね? 家のPCは office2003homeなんで Outlookは入ってないんですよね... 関係ありますかね? あとCコンパイラは ボーランドが主流ですかね? 初心者には
VC2005EEつかっとけ
589 :
デフォルトの名無しさん :2006/05/28(日) 11:25:47
VC2005って フリーコンパイラですか? C言語使えます? 学校で ボーランドのCコンパイラを使ってるんで 家のPCでも 同じボーランドのCコンパイラを使いたいんですけどね... ダウンロードして 解凍して使えないってのは このPCでは無理ってことですかね?
>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
分かりました 諦めます... ここは初心者(素人)は入る余地はない様ですね 初心者歓迎 って書いてありましたが どうやら違う様ですね 諦めます.....
初心者は歓迎だけど馬鹿はお断りです^^
とりあえず馬鹿と 人に問題を説明できてない奴と 礼儀がなってない奴と わざわざ初心者ですと名乗る奴は 叩かれます
エスパーは居なかったようですね
597 :
デフォルトの名無しさん :2006/05/28(日) 12:45:37
ほんと馬鹿ですみません... どうしても自宅のPCでCを書きたいんで... ボーランドのCコンパイラもデバッガーもダウンロードして bccデベロッパーもダウンロードして 解凍したのに使えません...(>_<) 何か他に特別なソフトが必要なのでしょうか?
昔の人はいい事言った 過ちて改めざる、これを過ちと言う とりあえず>595を10回読め
学校でも使ってるなら友達に聞け
>>598 とりあえず馬鹿と → ほんと馬鹿ですみません
人に問題を説明できてない奴と → 解凍したのに使えません
礼儀がなってない奴と → ほんと馬鹿ですみません
わざわざ初心者ですと名乗る奴は → (書かなかった)
602 :
デフォルトの名無しさん :2006/05/28(日) 13:16:00
もう来るなって事ですか?
質問してもよろしいでしょうか? VCで以下のことをするとなんでこの結果になるかわからないです 「ソース」 char *s= aあ123 sizeof(s); 「結果」 4 コードの書き方がわるいんでしょうか?自分としては「6」を貰いたいの ですが・・。
>>597 具体的な問題も書かずに『叩かれた』と騒ぐのは何だ。
俺たちはただ、お前の書く文章が質問を形成していない事を突っ込んでいるわけで。
>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 <<
608 :
607 :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)
char *s= "aあ123" printf("%d\n",sizeof(s));
さっきの規制はなんだったんだろう・・・ テスト書き込みにてスレ汚しすみませんでした
612 :
デフォルトの名無しさん :2006/05/28(日) 14:04:45
すみません、RedHat Linux EL4上のGCC(g++)で日本語処理を行うためには どういう方法が良いのでしょうか? ロケールの文字コードはUTF-8ですが、できればw_charを使いたいのです。 GCCのw_charは4バイトですから、外部コードをUTF-8、内部コードをUTF-32に すれば良いのだろうと思いますが、それを解説している資料が見つからなくて 困っております。
>>607 ,608
cin.eofを評価するタイミングの問題
std::cin >> item >> before;
の後で
if(std::cin.eof())break;でも入れとけ
>>612 とくに何も考えなくていい。こんな感じで。
#include <stdio.h>
#include <locale.h>
int main (void)
{
setlocale(LC_ALL, "");
putwchar(L'あ');
putwchar(L'\n');
}
616 :
607 :2006/05/28(日) 14:43:24
>>614 ありがとうございます。やっぱりそうするしかないですか…。
getline(std::cin, std::string line)あたりで一行ずつ取り込んで、
そのlineをもう一度 stream に変換したりできないでしょうか?
これも汚い書き方ですけれど、終端条件が2箇所に出現しているのは、
やっぱりつらいです。
>>616 std::istringstreamを使うと、std::stringからstd::istreamを作れる。
>>616 614を適用すれば、ループそのものは無限ループにできるはずだから、
終端判定は一箇所で済むはず。
>>612 >>615 ちなみにC++なら<locale>をインクルードした上で、std::locale::global(std::locale(""));とする。
そしてstd::locale::globalを呼ぶと、内部でstd::setlocale(LC_ALL, も呼ばれることになっている。
620 :
614 :2006/05/28(日) 14:58:48
>>616 で答えはでとるな。
解りやすく言うと while(1) でループに入れ。
621 :
614 :2006/05/28(日) 15:00:01
622 :
607 :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++コードを書くためのガイドブックで、入門者におすすめの
ものはないでしょうか?
「堅牢」の意図する所がよくわからんが C/C++セキュアプログラミングクックブックとか。 所謂セキュリティの問題じゃないならEffectiveC++とか。
>>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;
}
625 :
607 :2006/05/28(日) 15:22:09
>>623 ありがとうございます。堅牢というのは、明快でバグの入り込みにくい、という意味を
意図しておりました。「Effective C++」ですね。まだ私には早いかと思っておりましたが、
読んでみます。
>>624 ちょっとびっくりしました。
cin(と言うかstream全般)って、cin.eof() が true でなくても、>> price を実行した
あとは NULL になるのですか?
もしそうなら、C++って本当に難しいと改めて思います。
626 :
607 :2006/05/28(日) 15:28:36
>>625 自己訂正。後半は間違っていました。>> price を実行したあとに条件判定が
行われるから、std::cout << まで行かないだけですね。
申し訳ありません。ああ、もうなんかメタメタ…。
>>625 cin >> item >> priceの値はcin。(だから>>をチェーンする記法が働くんだが)
std::istreamにはvoid *への暗黙の変換が定義されていて、これがwhileの条件部でテストされる。
この値の真偽はcin.fail()と同じ。
628 :
607 :2006/05/28(日) 15:42:11
>>627 ありがとうございます。大変勉強になりました。
void * への暗黙の変換ですか。知っておかねばならないことが膨大にあるなあ。
629 :
612 :2006/05/28(日) 15:50:41
>>615 ,
>>619 ありがとうございます!
GCC は日本語処理が難しいという評判で、怖気づいていたのですが、
デフォルトのエンコーディングなら、それだけで良いのですね!
今は処理系がないので、明日試してみます。
630 :
デフォルトの名無しさん :2006/05/28(日) 15:57:02
603さん ありがとうございます 参考にしておきます あと ダメだった時ように聞いておきたいのが VC2005EEは ただで手に入りますかね? 買わないといけませんか? すみません教えてくださいm(_ _)m
632 :
603 :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++以外の他のソフトは無料ではないと言う事でしょうか?
少しは自分で調べろよ
635 :
デフォルトの名無しさん :2006/05/28(日) 17:22:30
馬鹿みたいに教えるから教えて勲がツケアガンダヨボケ。
>>631-630 とりあえずしんどけ
636 :
631 :2006/05/28(日) 17:23:15
VC++.net2005でC言語でプログラムを作っています。 void *v; int address = 0x008D5AC4; v = (int *)address; メモリアドレスを直接ユーザーに指定してもらい、それをポインタに格納するプログラムを作っているのですが、 上記のように書くとエラーは出ず、コンパイルできますが、警告が出てしまいます。 ( : warning C4312: '型キャスト' : 'int' からより大きいサイズの 'int *' へ変換します。) プログラム自体は正常に動作するようですが、警告を出さないようにするにはどう書けばよいのでしょうか?
>>637 #include <stdint.h>
intptr_t address = ...
C99 での追加だから、 VS2005 で使えるかどうかは知らない。
>>636 あんなやつがMFC/ATLを必要としていると思うか?
>>637-638 VC++に<stdint.h>はまだないが(u)intptr_tは<stddef.h>などで宣言されている。
そもそもWindowsで直にメモリアドレスを扱って何がしたいのか気になる。
>>637 /Wp64 をはずせば警告は無くなる。
メモリアドレスを直値のintで扱うとはひどいプログラムですの。
始めまして。質問です。 以下漠然とした質問ですみません。。。 既存の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
>>638 >>640 >>641 おお、できました。
ありがとうございます!
目的は、winゲーム内の特定のアドレスの内容を参照したいからです。
ネトゲのツールを作るのに必要です。
>>642 CGIは、動作させるサーバ上でコンパイルしなければならない事はよくご存じか?
>>643 Windowsプログラムでは、仮想メモリが使われている事はご存じか?
>645 さん はい。 動かす環境でのコンパイルではありませんが、 動かす環境と同じ設定の環境でコンパイルしてるハズ・・です。 これじゃダメでしょうかね?
>>646 はい、知ってます。
仮想メモリがどんなタイミングで物理メモリに呼び出されてまた戻っていくのかは知りません。
>>643 >>649 仮想メモリとはスワップするだけでなく、プロセス間で別アドレス空間にしていることもご存じか?
はじめまして。 つい最近(先週土曜日から)独学で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。(←またたくさんあります) ソースファイルを書くと文字制限になるため一旦投稿します。
>>650 知ってますよ。もしプロセスによってアドレス空間が独立していなければメモリを指定参照することができないので・・・。
そのプロセスで目的のデータは常に0x0075F21Aに存在するみたいに。
653 :
651 :2006/05/28(日) 18:55:03
655 :
651 :2006/05/28(日) 19:02:20
>>654 それがその、MSDNのCDをなくしてしまってVC++本体しか入っていないため、
不具合がそこで起こっている、という事はわかっても具体的にどこが悪い、というのが参照は出来ないんです。
環境にこれを書き忘れていました。すみません。
あるファイルに関数を複数つくり、それを別のファイルからコールする際に サイクル数を計りました。 main.c int main(void) { aaa(); bbb(); ccc(); return 0; } ABC.c void aaa() { /* 何かしらの処理(ループ処理) */ } void bbb() { /* 何かしらの処理(ループ処理) */ } void ccc() { /* 何かしらの処理(ループ処理) */ } このときABC.cの関数の位置を変えるとサイクル数が変わりました。 (続きます)
main.c int main(void) { aaa(); bbb(); ccc(); return 0; } ABC.c void ccc() { /* 何かしらの処理(ループ処理) */ } void aaa() { /* 何かしらの処理(ループ処理) */ } void bbb() { /* 何かしらの処理(ループ処理) */ } 関数の位置とサイクル数に関係はあるのでしょうか? アセンブラで見たところ、とくに変化は見られませんでした。 ループ処理で3サイクルの違いがありましたが、 そのループが100回、1000回と増えると結構なサイクル数の違いになり 無視できないレベルになったので、何か理由があれば教えてください。
環境は CPU:SH-2(SH7145F) コンパイラ:SHC ver9.0.2 です。
>>660 バスが 32bit で命令が 16bit だから、関数それぞれのアドレスの
アライメントが関係してくるかもしれない。
関係するならコンパイラが面倒見てくれるべきなんだけど、 SHC じゃぁねぇ。
SHCのマニュアルを見ましたがいまいちわかりません。 関数の大きさ(アセンブラコードの行数)が原因でしょうか? ・・・となると、関数を定義する際は、関数のコードの小→大の順に定義すべきでしょうか? ちなみに他のCPUやコンパイラではどうなんでしょう・・・ しかし、同じアセンブラコードなのに、関数の配置を換えるとサイクル数が変わるなんて・・・
たしかに、アライメントが影響してるみたいです。 ただ、そうなると、変更前の順番 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()はループの中でメモリライトおよびリードをしています。
>>664 関数内でループしてるんなら、関数先頭よりも
ループするときのジャンプ先が問題になるだろうなぁ。
コード以外のリードとライトはコードの位置と関係ないだろうから、
影響しないと思うよ。
>>652 >アドレス空間が独立していなければメモリを指定参照することができないので・・・。
意味がわかっていない予感。
>>666 ReadProcessMemory/WriteProcessMemoryを使ったハッキングだろ。
MSもいい加減このAPIにガードをかけてもらいたいものだ。
それだけで相当の不正行為を排除できるのに。
>>667 これはまた、えらく自分勝手な意見ですね
フラットメモリモデルを誤解している奴がいるな。
>>666 ええと。
指定する直アドレスというのはWindowsが作成するプロセスごとの仮想アドレスのことであって、本当の物理メモリのアドレスじゃないです。
本物の物理メモリのアドレスは私には知るよしもありませんので・・・。
>661>665 アドバイスありがとうございます。 しかし、同じ処理(アセンブラレベルでも同じコード)なのに、配置場所によって 処理速度が変わるなんて・・・ 逆に、どういうことをすれば、そのようなことを意識しなくてもいいようにできますかね・・・ これは完全に環境依存だと思いますが。 SHCだと、方法はないのかな?
>>670 おそらくユーザにゲームのプロセスでのメモリアドレスを入力してもらって、
自分のプログラムはそのアドレスを読み書きしようというのだろうが、普通には読み書きできない。
667の言うとおりReadProcessMemory/WriteProcessMemoryを使う必要がある。
それを理解しているのか?
>>672 はい。
>>667 のおっしゃる通りで、ReadProcessMemory/WriteProcessMemoryを使って他アプリのメモリの中身を覗き見ます。
実際にはユーザーに入力してもらう変わりに、プログラムが変動しない特定のバイナリ列を検索して、基点アドレスを算出し、そこから目的のアドレスを自動取得するようなプログラムになりました。
>>673 わかっているならいいけど今までの言動からしてわかっていなさそうだった。
なんで
>>673 はつまらないお節介に律義に付き合ってるんだろうw
いちいちプログラムの配置場所まで考慮するなんて C言語も奥深いですね。
>>676 671 の話だと思うが、あれは SHC がタコなだけ。
678 :
デフォルトの名無しさん :2006/05/30(火) 00:50:36
すみませんが、質問です。gdb で wstring の内容を表示するにはどうしたら良いでしょうか?print wstring型変数 だと、アドレスやら16進データやらが表示されるのみで、内容が分からないのです。
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に任意の値を代入する方法ってあるんでしょうか? 知ってる方がいらっしゃったら教えていただけないでしょうか?
そのまま代入すればいいと思うが?
ダウンロードできましたよ?>>freecommandlinetools2.exe
684 :
デフォルトの名無しさん :2006/05/30(火) 01:50:58
>>681 そのままってたとえば
likeIP ip;
ip:address01 = 0x000F;
みたいにできるんでしょうか?
これだと桁が合わないのですが、あふれた分は切り捨てになるのかな??
すんません! windowsUpdateしてなかったようでftpからダウンできないバグみたいな感じなってたみたいです。 ありがとうございました。
↑ 682です。
>>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の範囲を超えているからですね。ありがとうございました 。解決しました。
690 :
678 :2006/05/30(火) 02:23:30
>>679 ありがとうございました。
かなり泥臭いことが必要になるのですね。
>>688 > likeIP ip;
> printf(
692 :
691 :2006/05/30(火) 09:14:36
キレタ…orz
>>688 > likeIP ip;
> printf("%d\n",ip);
printf()は構造体の中身なんて解析しねーよ、ボケ!
693 :
デフォルトの名無しさん :2006/05/30(火) 16:43:07
そもそもそれをやりたい理由が分からん
>>693 1バイト文字限定
wstring ws = L"hello";
string str(ws.begin(), ws.end());
2バイト文字は文字コード変換をかますしかないだろ
697 :
693 :2006/05/30(火) 17:01:58
すみません、おかしな質問をしてしまいました。
目的は、MeCab というライブラリを使うことなのです。
http://mecab.sourceforge.jp/libmecab.html まだ良く分かっていないのですが、基本的にCで利用するような仕様で、元デー
タとして char * 型のデータしか与えられないようなのです。
しかし、その結果を処理するには、wstring型のほうが遥かに便利です。
そこで、MeCabとの入出力の部分で
wstring ←→ string ←→ char * という変換を行おうと思っていました。
std::convertなんてあったっけ?
699 :
693 :2006/05/30(火) 17:39:06
ありがとうございます。std::codecvt ですね。
>>696 のリンク先は、実は見つけていたのですが、自分には分かりづらくて、
もっと単純なやり方はないものかと思っていました。
どうやら、C++ではこれが正しいやり方なのですね。気合を入れて読み込んでみます。
すみません、一つ伺いたいのですが void hoge(void) { static aaa = 1; aaa++; } としたときに、aaa++;のところでアクセスブレークエラーなるものになりました。 なぜでしょうか?
さあaaaの型を決める作業に戻るんだ
すみません void hoge(void) { static int aaa = 1; aaa++; } でした。 書きミスです。
環境も書かずに(ry
すみません。原因はわかりました。 ただ今解決するため、修正中です。 また一つ勉強になりました。プログラム作りも大変ですね。
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・・・の式の左のオペラントが正しくないとエラーがでます。 メンバにしてしまえばいけるんですが。 こういう場合はメンバにするしかないんでしょうか。教えてください。
-char *StrType::Get(); +char *&StrType::Get();
707 :
705 :2006/05/31(水) 00:18:21
>>706 はー、なるほど
参照のポインタで返せば良いんですか。
そっか。ありがとうございました。また知恵つきました。
ところで、-charと+charとはいったいなんなんでしょう。
そこも教えて欲しいです。
すいませんがお願いします。
>>707 706でないけど、
-の行を削除して+の行を追加しろという事。
正誤表みたいなもん。
しかし、friendについて、ちゃんと勉強したのかい?
わけもわからず使っても意味ないと思うのだが。
709 :
708 :2006/05/31(水) 00:32:09
突っ込み所が多いんだが、まず、 -friend StrType operator+(StrType &STobj); +friend StrType operator+(StrType &, StrType &); friend 宣言した関数からは、クラスのプライベートにアクセスできる。 この場合、StrType operator+(StrType &STobj1, StrType &STobj2) だから、宣言の引数も2つないと意味がない。
710 :
708 :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];
711 :
708 :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);
712 :
708 :2006/05/31(水) 00:47:39
713 :
708 :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;}
714 :
708 :2006/05/31(水) 01:06:44
根本的なつっこみとしては、 「初心者は friend なんか使うな」 friend は、オブジェクト指向の情報隠蔽を部分的に無効にする。 必要性をよく見極めて使わなくてはならない。
715 :
705 :2006/05/31(水) 01:09:29
なんかえらいつっこみますね ええ、書いてて自分で気づきましたよ friendの宣言と定義で引数がちがって、別物になってるって strcat()の文も書き直し済みです deleteもわかってます。 単に、friendしたのに上手くいかないなと思って 定義ばっかなんども書きなおして見直してそれで わからず書き込んだら。 706さんが一発回答くださったので、それで十分です。 ソースながめて、「あ、さっき書き込んだやつ訂正しなきゃ」と思って またソース書き込むと見るほうは大変だと思いますしね。 ですので沢山の訂正は、ありがたいですが、それらの部分は了解済みです。
708 (´・ω・) カワイソス
負け犬ほどよく吠えるって事か。
718 :
デフォルトの名無しさん :2006/05/31(水) 01:54:03
現在、入門書とC言語入門 シニア編を読み終えた程度のものです。 ここからどういった参考書で勉強すればいいのかよくわかりません。 レベル的には初級〜中級くらいだと思うのですが、 みなさんならどういった参考書を買いますか?orどういった勉強をしますか?
>>715 今度から、ほんとうに書いてて気づいた時には、書き込む前に直しましょうね。このクズが。
>>718 逆アセンブルしてどういう風に動いているのかを見ながら、アセンブラをかじりつつ
コンソールアプリも飽きたでしょうから、WIN32apiでウィンドウズプログラミングに
挑戦しながら、C++を勉強していけば良いんじゃないっすか。
ただ、俺もシニア編持ってるけど、線形リスト、双方向リスト、環状リスト
挿入ソート、シェルソート、選択ソートにバブルソートでヒープソートに
クイックソート。検索法や、ファイル処理。
きっとまだやれることはいっぱいあるけど、まぁ、あれだ。
一気に何かやるんじゃなくて、順序よく色々勉強していけば良いんではないでしょうか。
色々なサイトを見て、「こんな事ができるんだ」と知り、宿題スレの人の宿題
解いてみたり。数独とかのパズルを解く方法考えたり(俺は思いつかないけど)。
とにかくお互いがんばろう。
721 :
705 :2006/05/31(水) 03:02:07
なんだよ、やっぱむかつてたんだ。
別にクズでいいよ。
ただ、一番意味わかんなかったのは、コンストラクタの中身
俺、書き込んで無いのに、注釈つけるし
最後には「初心者はfriendなんか使うな」だもんな〜
それって、friendに関して勉強するなって事なのか?
中級者になってはじめてfriendを使えって事なのか?
ま、良いけどさ、前にここで演算子のオーバーロードの質問
したとき四則演算はfriendを使うべきだよと言われたから
使うようにしてて、で下手くそなソースさらして、この部分が
わからないから教えてくださいと言ったら
>>706 さんが即答
してくれて・・・・
わけわかんねーよ。俺、それ以外質問してねーもん。
それも人を上目線からみるような書き方して
friend使うな。クズが。って書かれて感謝しろってのが無理だよ。
>>721 わたしは
>>708 ではありませんが、それぞれの指摘には
全部理由が添えてありますので、読んでやれよカス。
ちなみに
>>706 みたいな解決する奴は腹を切って死ぬべきだ。
おそらく
>>706 はそれを知りながら、いくばくかの悪意を込めて書いています。
他人の指摘に謙虚でない者は成長しない。 operator+にfriendは不要。 operator+はoperator+=で実装すべき。 そしてconstはコピーコンストラクタ以外でも正しく定義せよ。 という内容のお節介を普段の俺なら書きたいところだが、 「そんなことは俺は質問してない!」 とか逆切れされそうなので詳細は書かないでおく。
ざっと見ただけだが、721はすっげえバカで無礼な厨房だな。 721は劣等感をやばいぐらいに持ってるリアル厨房かな。 だったらああ言っちゃうのもわかるけど。俺も昔はその部類だったから。 ま、勉強してりゃ少しはマシになるだろ。でなきゃいずれ大変な思いをするだけだ。
725 :
708 :2006/05/31(水) 05:08:12
>>721 >なんだよ、やっぱむかつてたんだ。
うん、むかついた。 むかつきすぎてレスできなかったw
だから、
>>719 >>717 は私のレスではないよ。
まぁ、キミが怒る理由は想像できる。
私の書き方が「人を上目線からみるような書き方」と
感じるキミの感性は正しいからね。
でもさ、書いてある内容は親切なつもりで書いているのさ。
friendの宣言とstrcat()とdeleteに関しては余計だったようだね。
ごめんよw
だけど、こっちはキミの力量なんか知りようがないからね。
726 :
708 :2006/05/31(水) 05:16:54
>>721 >ただ、一番意味わかんなかったのは、コンストラクタの中身
>俺、書き込んで無いのに、注釈つけるし
それはね。多分コンストラクタでnewしてないと思ったからさ。
コンストラクタでnewしてたかい?
もし、してたらメモリーリークを起こすよ。
キミはStrType operator+(StrType &STobj1, StrType &STobj2)で
newしたポインタをStrTypeクラスのpに代入してるよね?
デストラクタでdeleteされるのはこのメモリだ。
じゃ、コンストラクタでnewしたメモリは誰がdeleteする?
コンストラクタでnewしてデストラクタでdeleteするのは定石みたいなもんだ。
覚えといて損はないよ。
>>715 突っ込まれるようなソース貼っておいて、随分と偉そうだねぇ。
君は「謙虚」という言葉の意味を学ぶべきだ。
>>721 >それって、friendに関して勉強するなって事なのか?
>中級者になってはじめてfriendを使えって事なのか?
勉強するなとは言わない。でも使わない方が良い。
キミは、friend を使う段階にはいない。
まず、情報隠蔽を勉強しなさい。
まぁ、キミが趣味でプログラミングするだけなら、
余計なお世話だけどね。
これは、プロを目指す人向けの忠告。
良質なプログラムを作るつもりがないなら忘れて下さい。
729 :
708 :2006/05/31(水) 05:31:10
あっ、
>>728 は私が書いたレスね。
それ以外の708と書いてないのは他の人だから、間違えないでね
>>721
730 :
708 :2006/05/31(水) 06:27:33
ああ、ごめんよ〜。 Tempはデフォルトコンストラクタで生成してるから メモリリークは起きないな。 私の勘違いだ。ゴメンよ。
>別にクズでいいよ。 クズのままでいたいっていうなら質問するなよ。 >人を上目線からみるような書き方 実際はどうなんだ?もしかして上にいるつもりだったの? >感謝しろってのが無理だよ。 いやいや。事実を教えてもらったんだから感謝してしかるべき。
まあ別にfriendなんて無くても大抵は困らない。 でも、たまにあると便利なときはある。
>702>704 原因は何だったの?
何一つできない馬鹿が 無根拠なプライドをフルパワーで守りだすと 手が付けられないんだよね。 そんなことに頭を割いて生きてるから いつまで経っても何一つできるようにならないってのに。
735 :
705 :2006/05/31(水) 10:54:37
>>708 さん
まぁ、俺もむかついたわけ。初心者じゃなくて入門者って言えば良いのか
ようは、まだ勉強中の身だからこそ、ああいう質問したわけで、その結果
色々な、内容の最後に「初心者はfriend使うな」と書かれちゃ
「じゃぁ、勉強すんなってか?実際打ち込んで経験積まんと
知識すら身につかねーだろ」と思い
わざとらしく「要望してない不必要な注釈と講釈はいらん」と
軽くむかつくだろうなという感じの文体で書きました。
ただ、これだけは信じてくださいな。
ここにfriendの質問した後、ソースながめて「あ、バッファたりねえ」と思い
自分のアップしてしまったソースの内容を、変更して、「これでバッファは足りるは」
って思って見たらスレ見たら
>>506 さんの内容があって、へーなるほどなと思い
さらに質問した後に、
>>708 さんの書き込みがあって
そんで最後の「初心者はfriend使うな」で、「なんだこいつ」と思ったわけですわ。
ま、
>>708 さんが
>>725 で「ごめんよ」と先に謝った以上俺の方が精神的にまだガキ
って事っすね。
自分の力量が相手にわかるわけでもないのに
補足説明をしてもらっているにもかかわらず、馬鹿レスして申し訳ありませんでした。
705は朝鮮人
ここまで誰一人説得させられない支離滅裂な長文は この板ではなかなか見られないよね。
知ってたけど間違えました? テストの点が悪い小学生の言い訳だ。 間違えたという事実があり、そしてその事実が重要だろう。
739 :
デフォルトの名無しさん :2006/05/31(水) 13:11:11
>>735 俺も「初心者はfriend使うな」という類のお節介は嫌いだし、
おまえが腹を立てるのも理解できるが、
>>715 はどうかと思う。
アドバイスが自分にとって役に立たないと思うなら礼だけ言って気にしなければいいし、
それも嫌ならスルーするのもアリだと思うが、
善意の回答者に嫌味を言うのは、無闇に人を不愉快にさせるだけで、
うまくないんじゃないだろうか。
741 :
724 :2006/05/31(水) 13:36:37
>>735 親切心で教えてくれているのに、あの態度はないだろう。
言う前にどんどん吸収していけばいいのに。
以前こういう言葉を見たことがある。
「忠告ほど他人が気前よく与えるものはない」
親切心から何かをしてくれる人なんてそうそういないんだよ。
大人になれば君のことなんて誰からも相手をされないよ。
もちろん君だけじゃなくて、みんながそうだけど。
なぜなら利害の関係になってしまうから。
>そんで最後の「初心者はfriend使うな」で、「なんだこいつ」と思ったわけですわ。
うまく使えばいいテクニックでも初心者が使っていて逆に危なくなってたら
「やめろ」とも言いたくなるだろ。いつまでも気がつかずに使っていくかもしれんしな。
「初心者はfriend使うな」が引っかかったのなら、なぜそうなのかを論理的に突っ込んで 議論すればいいだけなんだな。
これがかの有名な「火病」って奴ですか。
friend が必要になるのなんて、 よっぽど結合の強いクラスだけだな。 friend なんて滅多に必要にならない。 friend を使おうとした場合は、 大抵は設計がマズいから必要になってしまうだけ。 friend を使ってしまうよりは、 friend を使わずにどう実装すればいいかを 考えたり調べたりする方がよっぽど勉強になる。 それで無理なら friend を使わざるを得ない状況なのだと思っておけばいい。 friend を使うこと自体は別に難しいもんじゃないわけだし、 特別 friend について勉強するべき事は無いな。
745 :
デフォルトの名無しさん :2006/05/31(水) 14:54:18
friend って、publicでstaticなメソッドと大差ないと思うけど、 そっちのほうは使うなって人はいないね。
staticでpublicなメソッドからはメンバ変数にアクセスできませんが。
747 :
701 :2006/05/31(水) 15:08:52
>700 Cの仕様では型宣言子がないとintとみなす(参照:K&R P261)ので700でも一応間違いじゃなかった。すまん。 C++だと無効だが。
> friend 偶々といえば偶々だけど、ここ2年くらい使ったことないや。 コード上でも実生活でも友達少ない人間ですから。
誰が上手い事を言えと
比較演算子のオーバーライドをする際は大抵friendなグローバル関数にするがな。
>>751 staticメンバ変数にはアクセスできる
非staticメンバ変数はダメ
thisがないのだから当たり前っちゃ当たり前
>>752 thisが無いのはfreindも同じでしょ?
インスタンスを渡してもらえば、privateな(staticでない)メンバ変数に
アクセスできるってのも、両者同じ。
このへんについて一番簡潔な説明だと思うのは、禿本の11.5の冒頭。
OOPLに慣れてるなら、初心者でもかまわんだろうけど C++が初めてのOOPなら、あんまり凝ったことしないほうがいいだろうね。
>>756 それ俺持ってる。
わかり易いかどうかはともかくCのソースをぱっと見て
だいたいどういうプログラムか判断付くまでのレベルの本。
関数とか結構わかりやすいと思ったけど教材のせいにしてたら
いつまでたっても身につかんと思うのでとりあえずやってみれ。
>733 答えは簡単でした。static変数はROMに割り当てられているので ROM→RAMにコピーし忘れてました。 そのため、ROMにライトしてエラーになりました。 また、関数をROMにおき、関数ポインタを構造体の中で定義し アクセスしようとすると、ROM→RAM展開前にその関数を呼ぶと とんでもないことになったりします。 なかなか難しいですね。
staticがROMに?
ROMが右手オナニーメンバーという訳じゃなければ認識を間違えているな。
というかまず環境を書けと
定数で初期化してるからじゃね?
定数で初期化とどういう関係が?
そもそも761は組み込み系じゃないの? 俺もそっちの方面だからよくわかるが、ここにいる人は そもそも、そのような方面の人は少ないから ROM→RAMだのいってもわからんと思うよ。 住む世界が違うんだし。
自分でスタートアップ書かないといけない環境なんだろ。 ROM 環境ではよくあることだ。
いやいや、同じCの世界だもん。 とりあえず説明してみてよ。 > 関数ポインタを構造体の中で定義し > アクセスしようとすると、ROM→RAM展開前にその関数を呼ぶと > とんでもないことになったりします。 ここらへんとか興味ある。 「ROM→RAM展開前」って、なにを「展開」してるの?
771 :
770 :2006/06/01(木) 01:48:58
>>770 > 答えは簡単でした。static変数はROMに割り当てられているので
> ROM→RAMにコピーし忘れてました。
> そのため、ROMにライトしてエラーになりました。
↑さっぱり意味がわかりません。
>>772 あぁこれはスタートアップだけじゃわからんな。
こういう環境ではメモリの配置もリンカの引数や専用のスクリプトで制御することができる。
プログラム内でメモリを使用するものは、用途ごとにセクションと呼ばれるものに
分けられる。一般的には以下の4つ。
text: プログラム
rodata: 読み取り専用データ(定数)
data: 0以外の初期値を持つ変数
bss: 全ビット 0 で初期化される変数
C言語の要素ではだいたい以下のようにわけられる。
int text() {}
int const rodata = 0;
int data = 1;
int bss;
リンカへの指定を間違えて data を ROM に配置してしまうと、
>>761 になる。
実際に間違えてるのか意図的にやってるのかどうかはわからん。
リンカの指定のミスで、初期値ありのstatic変数がROMになって、 スタートアップルーチンのミスで、関数のポインタがとんでもない ことになる? なかなか大変ですな。
そうなのか。 static変数自体はRAMで初期値がROMなんじゃないかとも思ったんだが。
>>775 そうそう。そのせいで data セクションに関するリンカへの指定
および対応するスタートアップでの処理はちょっとややこしいことになる。
そんなわけで data は ROM に置いてしまって bss + 明示的な初期化で
代用してしまう方法もよく見る。
俺のやってる環境(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へコピーして実行する理由として処理速度の向上などもある。
>>777 あー RAM に関数置いてるのね。そんなの言われないとわかんねーよ。
RAM に置きたい関数は DDATA に吐くか、 DDATA と同様に処理してやればよいと思われ。
今までWindowsでプログラムをしていて、今回初めてLinux+gccを使っているんですが、 セグメンテーション違反は、try〜catchで捕らえられないのでしょうか? Windowsの時と同じ感覚で、try〜catchで捕らえようとしても、 セグメンテーション違反が起きると、そこで必ず終了してしまいます。
エクセルでVBが出来ることを知って これは面白いと思ったんだけど なんか似たようなおすすめのツールとかビルダーみたいな ものはないだろうか。
>>783 あー
前々からC++やりたいなと思ってて
エクセルでプログラムの面白さを改めて知って
Cで分かりやすいソフトあったらいいなと
よく考えたら確かにおかしかったな
>>779 むしろそれで捕まえられるWindowsの方が特殊。
例外処理をOSが支援していて、そんなこともできるようになっている。
基本的にtry 〜 catchで捕まえられるのはthrowで投げた例外だけ。
>>782 >>785 そうでしたか。どうもtry〜catchに頼りすぎてたみたいです。
ありがとうございました。
786(=779?)さんは納得しちゃったみたいだけど…。 じゃ、Windows以外の時、どういうコーディングしてるのか激しく疑問。 unix系の場合シグナルハンドラを定義するんだろうけど、 ちょっと調べたら、gccだと、シグナルハンドラから例外をthrowできないんだよね? TRY/CATCHマクロがあるみたいだけど、これならシグナルをcatchできるの?
代入演算子の多重定義で、代入演算子はフレンド関数として定義できませんが、 クラス内のメンバをコピーする際に、プライベートのメンバはどのようにしてコピーすればよいのでしょうか?
>>788 ExceptionalC++のオーバーロードのガイドラインより
・=, (), []と->は、メンバ関数にしなければならない
そもそもセグメンテーション違反をcatchで捕らえて何をしたいんだ?
792 :
787 :2006/06/02(金) 11:53:41
>>791 フェールソフトの考えに基づく処理。
具体的にパッと思いつくのは、
例えば、大量のデータを処理している時に、
エラーの発生したデータに関してログを出力して、
次のデータから処理を続行するとかかな。
そもそもセグメンテーションフォルトは、不正なデータが入力されたことよりも 不正なデータに対応できないプログラム側のチェック不備なんだから そのまま処理を継続したってロクなことがないだろ
794 :
787 :2006/06/02(金) 12:14:10
>>793 まぁ、考え方はいろいろだと思いますが…。
あまり、必要性の細かい点まで議論するつもりはないので。
「unix系ではシグナルに起因するエラーをtry/catchする方法はない」
と考えて良いのでしょうか >>all
795 :
787 :2006/06/02(金) 12:19:07
質問訂正。 「try/catchする方法」 ↓ 「try/catchもしくは、代替手段」 「最初っから言ってんだろ」とか書かれそうだw
796 :
787 :2006/06/02(金) 12:30:13
longjump使えばできるのかな? なんかめんどいコーディングになりそうだけど…。
ふつーにシグナルハンドラで処理してログ吐いて落とすしかないと思われ。 longjmpで強制的に飛ばすことはできるけど、局所オブジェクトの解体が正常に行われないから 制御が復帰してもメモリリークしてる。
どこまでのことをしたいのかワカランが、 とりあえず signal では無理な処理をしたいのか?
Windowsではセグメンテーション違反をtry/catchで捕まえられたっけか? SEH(__try/__except)を使えば可能だけど、C++標準の例外では無理だったような…
catch(...) で捕まえられなかったっけ? >Windows
VC++8.0では、 try { int m=0xDEADBEEF; int i = *(int *)m; } catch(...) { } でUnhandled exception扱いにされたが… Releaseビルドだと問答無用で強制終了。
何か変わったのかな・・・。それとも別のエラーだったっけ。
803 :
787 :2006/06/02(金) 12:54:29
>>797 そうですか。ありがとうございます。
やっぱり普通はアプリを落としちゃうんですね。
>>798 いや、具体的に困ってる訳ではないです。
今後、unix系のお仕事をやる時の参考にしたかったんです。
すみません。
>>799-802 私の場合、::_set_se_translator()で組み込んだハンドラで例外をthrowしてます。
>>803 SEHをC++の例外に関連づけるわけですね、なるほど。
移植性はないけど、リリース時に組み込むと結構使えるやも。
>>805 本当だ。ランタイムの仕様が変わったかな?
VC2005では、SEHを通常の例外として扱う設定がデフォルトでオフになっている 言語仕様を尊重したのかね
>>807 処理効率を優先したんだよ。
SEH まで考慮すると throw() が書いてあるとか C 標準関数だとか
C++ 例外が起こりえないケースを最適化できない。
すいません質問です。 WinXPにて、Borland C++ Compiler 5.5を使っています。 あるC言語ファイルをコンパイルに際し、imagehlp.libが開けないというエラーが・・・ 落として入れなおしても駄目でした。 エラーが出なくなる方法について、お知恵をお貸しください。
>>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♯を呼び出そうとする時点で
激しく危険な気がするのだが。。。。。。
C#とC++.NETは競合するので無理です(笑)
MS的には.NETなら多言語間でやりとりできる云々とか言っていなかったっけ?
発言をよく読むと展望しか語っていないのが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);
818 :
817 :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"); }
819 :
817 :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; }
820 :
817 :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をどのような形式にすべきでしょうか。 あるいは関数の型自体を変える場合、どのような引数型が望ましいでしょうか。 ご指導お願いします
cをint (*c)[COL];にして、c = malloc(sizeof (int [COL]) * ROW);でいけると思う。 (その場合、forでcの各要素(c[i])に個別にmallocする必要は無い。)
822 :
817 :2006/06/03(土) 12:09:45
ありがとうございます。早速試してみます
823 :
デフォルトの名無しさん :2006/06/03(土) 12:31:20
>>811 そもそも、コンパイルするたびに挙動が変わるっておかしくない?
同一ソースなら何回コンパイルしても同じになるでしょ?
挙動が違うように見えるだけで、ソースどおり動いているのでは?
GCの気まぐれでスタック領域破壊してるだけじゃないの
C++とJavaって、オブジェクト指向という観点で比べると、どういう所が違うんですか? よく『C++はオブジェクト指向としては不十分』と聴きますが。
>>811 どう切り抜けるも何も、単にバグがあるだけだろってな話で。
デバッグするだけだな。
他人が作った部分にバグがあったら悲惨だけどな
828 :
デフォルトの名無しさん :2006/06/03(土) 13:44:20
>>824 C++.NETならGCあるから勝手にガベージコレクタしてくれるから
領域壊すってことあるの?
>>811 参照設定の参照先があっているかを確認したほうがよくないか?
スクリプト言語のライブラリ書いてたときに、GCで解放しちゃった領域に アクセスするというなかなか再現しないバグに出くわしたときは、 データが壊れてないかこまめにチェックして結果をログファイルに書き込んで 原因絞り込んでた。
うん?アクセスできる手段が残ってるのにガベコレに解放されちゃうの?
生ポインタ使ってればガベコレは追跡できないからな
832 :
デフォルトの名無しさん :2006/06/03(土) 16:00:45
整理すると ・ポインタを使用されてしまうと、アクセスできる手段があるか否かは、ガベコレには追跡できない ⇒勝手にガベコレに解放されてしまう可能性がある え、そうなの!? 自分理解足りなかったかも @mallocしたらfreeするまで解放されない Anewしたらdeleteするまで解放されない Bchar*などは、mallocしていないなら、使用されなくなったら、あるタイミングでガベージコレクタされる と思ってたんですが。。。。。。
>>832 C/C++にはガベージコレクション機能なんてありませんが
834 :
832 :2006/06/03(土) 16:14:45
もともとの
>>811 の質問に
参照設定をC♯〜〜云々の話から、.NET Framework上で稼動するC++.NETの
お話だと思ってたんですが。ちがってたらスマソorz
(一応【環境依存OK】とのことだったので
純粋なC/C++の話限定ではないと思ってたんですが…)
どちらにせよ832は勘違いしてないか? C++/CLIを使う場合でも、ガベコレに管理させるにはgcnewを使わないといけないし ポインタの解放忘れを追跡してくれないことには変わりないんだが
>>834 さん
一応わかってればいいっすけど
newしたものはdeleteするまでというより
ブロック抜けたら勝手にデストラクトしちゃうから
気をつけて(どういう構文かにもよりますが)
@、Aはあってるよね。 Bは漏れにはちょっとわからん(.NETでなぜC++なんか使うの?VB.NETかC#にしろよw) @とAって、まさに純粋なC/C++の話で、BはC++.NETの話、だろ。 C++.NETでもC++準拠のソースは書けるはずだから 「おれはGC利用しなくてもきっちりコーディングできる」 自信があるのなら、@、Aのみで作れば問題ない。
>>838 それは大前提がおかしい。.netで開発する以上。netの便利な機能は活用すべき。
GCに頼らず全て自力でメモリ管理するなど愚の骨頂。
(もちろん明示的にfreeするのはかまわないが。)
コード上はGCがなくても問題ないように記述し、(つまりC/C++で問題ないレベルでコーディングし)
その上で、保険の意味でgcnewを活用すれば鉄板w
>>837 >ブロック抜けたら勝手にデストラクト
って何の話なの? C++の話じゃないってことですよね?
(C++/CLIとか知らないのでスイマセン)
部分的に自力でのメモリ管理をすることにメリットがあるなら、 それを理由に C/C++ を選択したと考えられなくもない。 GC 外した方がいい状況ってのも確かあった気がするが、 GC のある言語をあんま使ってないのでどういう状況だったかよく覚えてない。
842 :
デフォルトの名無しさん :2006/06/03(土) 17:18:56
>>840 いや、C++だけど
単純な事を言いたかっただけです
例えば
int main()
{
{
ClassName obj;
}←このブロック抜けたらobjが破棄される
return 0;
}
ってだけの事を言いたかっただけです。
ま、コピーコンストラクタとか普通に装備しといて(その他うんぬんのメソッドも)
いれば別に問題は無いんで、特に気にせんでください。
>>842 コード例まで載せていただきわかりやすかったです。
例で使用しているobjはブロック内で宣言したものだから
ブロック抜けると無効になるので、freeしてなくても破棄されちゃう、ということですね。
実際にコーディングする際は、ブロック内であっても意図的に
メモリ解放したい場合、freeする、という感じでしょうか。
ローカルオブジェクトをfreeしちゃいかん
845 :
デフォルトの名無しさん :2006/06/03(土) 18:52:48
質問です。 C言語のプログラムですが、1000とか2000行とか書いていても バグが出にくい書き方とか、バグを見つけやすい方法とか ありますか?
あります
847 :
デフォルトの名無しさん :2006/06/03(土) 19:02:09
どうすればいいですか?
849 :
デフォルトの名無しさん :2006/06/03(土) 19:21:35
どうもです。 見てみます。
>>845 さん
バグが出にくいかどうかは別だけど
一つの処理に対して、長くて100行ぐらいで収めておきましょう
あとは、
>>848 さんの言うとおり。
分割コンパイル。
ヘッダにはグローバル変数と関数の定義を忘れずにね
変数の定義はインクルードファイルに書いてはいけません。
852 :
デフォルトの名無しさん :2006/06/03(土) 20:52:11
>>850 どうもです。
分割コンパイルぐぐってみます。
COMインターフェースを呼出す場合 構造体を使った例を良く見かけるのですが、 構造体のメンバーの夫々の変数値を取得するには ポインタ(間接参照)で取得するのでしょうか?
夫々?
スマソ 夫々=それぞれ
ホンマや・・・。よし、覚えた。
で?答えはどうよ
意味が微妙に分からんのでなんか例となるコードをくれ。
COM のオブジェクトはスマートポインタかなんかじゃなかったけ? 使ったことないから知らんけど。
>>853 いや、全部COMメソッド呼び出しでやる。
あの構造体を間接参照しても、おそらくろくなものは得られない。
861 :
デフォルトの名無しさん :2006/06/04(日) 11:00:48
すいません初心者の質問です
上の
>>853 >>859 >>860 で出てくるCOMメソッドって
アセンブラで書く.com形式のプログラム
とは別物なんですか?
コンパイラ何使ってる?
VC++.NET2003(VC++.NET2005EE) BCC5.5 GCC 用途に合わせて適当に切り替え
>>825 C++についてよく言われるのは、GCがないことや多重継承があること。
そしてオブジェクト指向プログラミングだげが全てではないこと。
866 :
デフォルトの名無しさん :2006/06/04(日) 21:53:28
libjpegを使ってJPEGに変換したら画像がダウンサンプリングされていました。 ダウンサンプリングしないオプション設定はないのでしょうか?
>>869 jpegについて勉強しましょう。
ロスレスだとサイズが大きくなるのがjpegです。
>>870 えっとそうではなくて…。
libjpegでjpeg_set_qualityを100に指定し変換した画像のサイズが、
TOOLの「藤 -Resizer-」でJPEGダウンサンプリングにチェックを入れ
JPEG画質を100にして変換したサイズと同じになってしまったという事です。
つまり「藤 -Resizer-」で言えばJPEGダウンサンプリングに
チェックを入れなかった場合の変換をlibjpegでやりたいのです。
jpeg_set_qualityの様な非デフォルトオプションがあれば良いのですが。
Cを覚える前にC++を覚えても問題無いですか? 何か弊害とかあれば教えて欲しいです。
問題が発生したとしたら、それは順序のせいではなく C++の「大きさ」に頭か根性のどっちかが追いついていなかっただけ。
まあ、いざ「(C++でなく)Cを使わないといけない状況」に立たされた時Cの不便さに戸惑うかもわからん。 それから先うまくやれるかどうかは個人の器量次第だが。
俺は先にC覚えることを勧めるけどね。 C++はCのほぼアッパーコンパチ(若干違うらしいが)なんでCの知識は無駄にならんし、 C++の本や解説ホームページはCを知ってることが前提となってることが多いから。
素直にまっさらな頭でC++をやることをお勧めします。
>>876 まぁそれも一理あるな。
俺のような凡人はCの知識がC++本来の使い方を阻害する面もある。
ただ、いきなりC++をやる場合は情報元を選ばんといかんね。
仕様書だけでやるって話もあるけど、俺には無理だな。
ポインタとio系、標準Cライブラリにどんなものがあるかだけわかりゃ Cに用はないな。
友達がCの制御構文で躓いて、半年が経ちます。 for くらい覚えろ。
880 :
デフォルトの名無しさん :2006/06/05(月) 22:37:46
>>871 何となく comp_info->h_samp_factor と comp_info->v_samp_factor を 1 にすれば
良さそうな感じはするけど・・・
881 :
880 :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; か。
むしろ、SmallTalkのようなピュアOOPを極めてからCへ降りてくるとか。
>>881 v_samp_factor と h_samp_factor ではなくて max_v_samp_factor と max_h_samp_factor ?
この二つを 1 にしてやっても結果は変わらずでした;
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 ご教授ください。
ループの開始で 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 は、普通こういう使い方をするのでしょうか? また、もう少しスマートな書き込み方法はないでしょうか? よろしくお願いします。
>>886 その程度の奴がコストなんか考え出すと無駄な努力どころか
碌な事起こらないからヤメレ。
>>886 MFCのCObject::Serializeの適当な実装を参考に汁。
889 :
デフォルトの名無しさん :2006/06/06(火) 01:50:10
初めまして。 質問なんですが、bcc32コンパイラは すべての文字コードに対応しているのでしょうか?
全ての文字コードというのが意味不明 どこまで対応すれば全てなんだ?
891 :
817 :2006/06/06(火) 02:05:22
>>817 です。
>>821 氏の指導通りにやってみて、最初上手く行かなかったものの
つまらない理由で失敗していた事が分かり、無事動くプログラムになりました
(free(c)だけで良いのに、列ごとにもやっていて実行時エラーになっていました)
お陰で他所から貰ってきたプログラムをmain関数内で呼び出して使えるようになりました。
ありがとうございました
892 :
デフォルトの名無しさん :2006/06/06(火) 02:07:24
>>890 すいません。
では、BCC32が対応している文字コードを教えてください。
お願いします。
使ってみて、ダメだったら、対応してない。
そのぐらい自分で調べろ
まぁ、そもそも何をもってその文字コードに対応しているというのかも不明だが。
>>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文などで一括的な処理が出来るのでは?と考えた。 また、「パラメータ」の扱い方を予め内部で持っておくことにより ユーザインターフェイスに反映させたり、「処理」の各関数を呼び出す前に「パラメータ」チェックが出来ると考えた。
899 :
886 :2006/06/06(火) 08:21:32
>>887 >>888 >>896 ありがとうございます。
確かに、計測もせず fwrite を繰り返すとパフォーマンスが下がると思い込んでいた点で、
>>887 の言うとおりでした。
バイナリで吐き出す件は大丈夫です。
>>897 具体性がなさ過ぎて、何をやりたいんだかよく分からんが
・パラメータの数が3個限定で
・パラメータの型が全ての処理で共通で
・パラメータの条件がenumで記述可能(値の範囲指定などが必要ない)
のならば、それでいいんじゃないの。
ただ、
> 空欄時はデフォルト値を使用したりする。
このデフォルト値はどこに保持しているんだ?
> enumで保持しておけば「パラメータ」の入力状態によって内部で関数を切り替えることができるはず。
enumで保持しておくことと、処理関数を切り替えることは全く関係ない気がするぞ?
901 :
897 :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で呼び出される関数
と、切り替えられたらいいなと思いました。
まあ、呼び出された関数の中で条件分岐すればいいのですが……。
誤植発見。 2番目の入力のパラメータ2は「空欄」です。 (誤) ユーザの入力(1) 処理:Hoge / パラメータ1:(空欄) / パラメータ2:foo 処理:Hoge / パラメータ1:bar / パラメータ2:foo (正) ユーザの入力(1) パターン1 処理:Hoge / パラメータ1:(空欄) / パラメータ2:foo パターン2 処理:Hoge / パラメータ1:bar / パラメータ2:(空欄)
>>897 > 悪いことは言わん
> 趣味(納期なし)ならもっと時間をかけて勉強しろ
> 仕事(納期あり)なら先輩なり、同僚なりに聞け
> そして設計を含めて考え直せ
まあ拡張性や汎用性を犠牲にした上で、 C++を使わずに実装するなら最良の選択肢だとは思うけどな。
>>901 つまりC++で言う関数オーバーロードのようなことがしたいわけね。
そもそも設計が間違っているのかどうかは、何に使うか分からない以上何とも言えないが、
その形で実装するなら、デフォルト値の扱いにはルールを設けるのを忘れずに。
例えば
FunctionHoge01 パラメータ1:必要 パラメータ2:省略時はデフォルト値
FunctionHoge02 パラメータ1:必要 パラメータ2:不要
という2パターンがあったとして、
ユーザーの入力が
処理:Hoge / パラメータ1:bar / パラメータ2:(入力なし)
だったら、Hoge01かHoge02、どちらも選べる可能性がある。
C++のコンパイラなら「曖昧です」でエラーを出すところだが、
実行時に曖昧になったんじゃどうしようもないから、
入力なしは「不要」とマッチさせるか、「可能であればデフォルト値のもの」とマッチさせるか決めないと。
>>897 そんなに悪くないからとりあえずそれでやってみればいいよ
やってみたら変なとこ出てくるかもしれないし
907 :
880 :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;
とかすると良いと思います。
>>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は呼び出しているし、エラーは出ていないので困っています。 どなたか解決策をお願いします。
>>909 > 2回目(for文)は
提示されたソースのどこにfor()文があるのかと(ry
# 提示したソース全体をfor()文で回している、
# と言うオチではなかろうな?
開けたら閉めましょう。
912 :
909 :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;
}
913 :
880 :2006/06/06(火) 18:06:33
>>909 どのメッセージボックスがそのメッセージ出してるのかわかりますか(キャプションは何)?
エラーじゃないのに WSAGetLastError を呼び出して、変な数が帰ってきてるとか
いってるわけじゃないですよね。
WSAGetLastError は、直前のエラーのエラーコードを返すわけで、
エラーが無かったときの挙動は定義されていないと思いますよ。
(ちなみに年に1回くらい GetLastError で同じ質問する人もいます)
914 :
909 :2006/06/06(火) 18:39:33
>>913 1回目
messageで、wsagetlasterror:0
2回目
messageで、wsagetlasterror:0
errorで、ソケットオープンエラー,error:10093
です。
ソケットが開けないのでエラーだと思うのですが…?
そもそもWSAStartup/WSACleanupなんてそんな頻繁に呼ぶものではないだろ。 普通プログラムの開始・終了時に1度だけ呼ぶものではないか。
916 :
909 :2006/06/06(火) 19:11:01
>>915 その通りにしたら読み込めました。
ありがとうございました。
時々見るのですが、 printf("そんな長くない文章\n"); printf("やっぱ長くない文章2\n"); と呼ぶのはなんのためでしょうか。
918 :
897 :2006/06/06(火) 20:17:02
返信ありがとうございます。
>>904 今からC++に変更しても、ぶっちゃけ問題なかったりはするんですけどね(笑)
自分がやりたいのは、
>>905 さんもおっしゃっている通り、C++で言う関数のオーバーロードっぽいものです。
ただ、あくまでも実行時に解釈するので、C++のオーバーロードとは少しニュアンスが違うかもしれませんね。
>>905 はい、問題ありません。
どっちにするかはまだ決めてませんけど。
>>906 とりあえずこのままやってみることにします。
設計の難しさをほんの少しだけ知ったような気がします……。
>917 「文字列の長さが1GBとかじゃなくて普段良く使う程度の長さの文章だよ」 「上のと内容が異なるけど長さ的には同じくらいだよ」 というのを暗示したいのではなかろうか。
>>919 なるほどサンクス 何度も関数を呼ぶ意味がワカランかった
>>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; } なんか数値がおかしいのですが、どこが悪いのでしょうか
-void Draw(void){printf("X座標=%d\nY座標=%d\n",px,py);} +void Draw(void){printf("X座標=%f\nY座標=%f\n",px,py);}
924 :
922 :2006/06/06(火) 21:32:19
>>923 どういうことですか?試しにそのようにコードを修正してみましたが、エラーが出ます
>921 でもそれだと printf( "一行目の文章\n" "二行目の文章\n"); で事足りるし。
コピペしやすいからに決まってるじゃないか
>924 floatを%d(10進整数)で出力しようとするなってこと。 手元の環境(Win2k, BCC5.5)じゃ X座標=2.000000 Y座標=4.000000 のように出力されたけど?
929 :
922 :2006/06/06(火) 21:42:46
>927 あ、コンパイルできました。+とか-とかはいらなかったんですね どうもありがとうございました
>>929 じゃもう1個指摘
-#include<stdio.h>
+#include<cstdio>
+using namespace std;
922は古い書き方で最近の環境では通らなかったりする
それと
Object(int x,int y){px=x;py=y;}
のx,yの型とpx,pyの型は揃えなくて良いの?
>922は古い書き方で最近の環境では通らなかったりする そんな環境あるの? 最新のC++規格にも<stdio.h>はあると思うんだが。
932 :
930 :2006/06/06(火) 22:22:35
質問です。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文字以上入力されるとエラーになって 強制終了されてしまいます。 用意した配列の大きさより大きい文字列が打ち込まれた場合の対処はどうしたらいいのでしょうか。
>>933 fgets() にはバッファのサイズを渡してるから、強制終了はしないはず。
その後の処理のほうが間違ってるんだろ。
Ctrl + Z で逃げるような話?
とりあえずfgetsの戻り値ぐらいは確認しとくべきちゃうか。
937 :
933 :2006/06/07(水) 08:39:15
あ、すみません、強制終了するのは後の処理が間違っていました。 強制終了ではなくて、配列内に収まりきらなかった分が、doループで次回のfgetsが来た時に 読み込まれてしまうのを防ぎたいのですが、どうすればよいのでしょうか。
>>937 fgetsで'\n'を読めなかったことを確認したら、'\n'までgetcharで読み捨てれば良い。
939 :
933 :2006/06/07(水) 09:39:15
>>938 ああー、なるほど。ありがとうございました。
すいません簡単な質問です 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";
}
945 :
デフォルトの名無しさん :2006/06/07(水) 14:36:18
943> 944> 早い、速いッスよ。 俺も早くあんたらのようになって、この板を sageてみせるよ、ありがとう。
947 :
271 :2006/06/07(水) 14:43:00
>>946 様 どちらに書こうか迷いましたが、このスレの初心者歓迎の文句に魅かれてしまいました。
宿題のサイトにはご迷惑をおかけしたので、ここで質問した所存であります。
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++ に関する質問」じゃないというのはわかりますか? 「車の整備についての質問(初心者歓迎)っていうスレ」があったとして、 「車の調子悪いが自分では整備できないから誰か整備して」 なんて書くのはスレ違いでしょ。
>>940 >using namespace std;に甘えない方が
>良いのでしょうか。
良い
これはコンパイラのバグまで絡んでくるのでやっかい
要約すると、
ヘッダでは使うな。ただし関数内では思う存分使ってよい。
>std::stringなどは継承するな」って書いてあったの
>ですが、本当にそんなトリッキーな事する奴いるんでしょうか
template typedefがないのでそういう状況も出てくる
まあ分からないならやらない方がいい
>>948 その通りです。またご迷惑をおかけしました。
951 :
デフォルトの名無しさん :2006/06/07(水) 17:18:08
gcc + linux でプログラムを作っているのですが、 ファイルのコピーの命令が見当たりません。 Windows なら、CopyFile というのがあるのですが、 Linux ではどうやって書くのか教えてください。
952 :
sage :2006/06/07(水) 17:34:15
>>951 Pythonのソース見たら、普通にファイル開いて、しこしこ書き込んでた。
便利なやつがあればと思ったけど、自作しないといけないんだな。
>>951 Linuxのことはあまりしらないけど、
C++でもいいなら、boost::filesystem::copy_fileがあるよ。
手っ取り早くやるならUNIXコマンド直接起動で system("cp 元 先"); でいいんじゃね。移植性は皆無だが。
どうせ、自前でコーディングしないのであれば 標準で用意されてない以上移植性は期待で着ない。
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 ) と表示されました。「オープンできない」 「プロトタイプ宣言のない」とはどういうことですか?
>>956 見たまんまの意味だな。もっとエラーメッセージを理解する努力をしよう。
>>956 ・オープンできない
綴りが間違ってるからね。ファイルが無いから。
・プロトタイプ宣言のない
printf関数はstudio.hに入っているので。
なんの前触れも無く、コンパイラが『printf』なんて見つけても、 何なんだよ、printfって てな事になる。
960 :
959 :2006/06/07(水) 22:14:37
うほっ 間違えた。 stdio.hね。 ちなみにstdioは、『スタンダード アイ/オー』ね。
961 :
デフォルトの名無しさん :2006/06/07(水) 22:23:49
ありがとうございます。綴りを直したんですが今度はこのメッセージが出ました。 認識されいないと出ているんですが操作可能にするにはどうすれば? C:\source>bcc32.sample.c 'bcc32.sample.c' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
×bcc32.sample.c ○bcc32 sample.c というかもうちょっと考えてから人に聞こう
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 を使うだけではオブジェクトの実体(メモリ)は開放されないですか?
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 ) のままでした
969 :
デフォルトの名無しさん :2006/06/08(木) 02:05:38
エラー E2209 test.c 1: インクルードファイル 'stdio.h' をオープンできない ゼロから始めた者ですが↑のようなエラーが出て先へ進めません。どうしたらよいですか?
どうせbcc32.cfgでインクルードパス指定するの忘れてるってオチだろ setbccでぐぐれ
972 :
デフォルトの名無しさん :2006/06/08(木) 03:42:42
数式を与えたら、それを解釈して木構造を構築するようにしたいのですが・・ ( (1)+((2+3))*(6*(8)) ) のように無駄に括弧が入りまくってても大丈夫なヤツ を早急に作らないといけないんです。助けてください
>972 boost::spirit つってもコンパイラに依存するけど
974 :
972 :2006/06/08(木) 06:46:17
>973 boost::spirit について少し調べてみます。 というか、自力で作りました。すいません。
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; }
いやむしろsmemはどこを指しているのさ strcpyの書き込む先は?
すいません、Cで画像や音声を読み込んで表示したいのですが、 fopenでよいのでしょうか?
うん
サンクス
音声を表示するのか?
いや音声は表示しなくていいです。 えーと、fopenでファイルを開いて、関数に代入すればいいんですよね? そこから先どうすればよろしいんでしょうか
>fopenでファイルを開いて、関数に代入 なんてすばらしい言語なんだろう。
画像や音声の扱いはそんな単純じゃないよ ぐぐるか本買うかしてしっかり勉強すべき。 それ以上はそっちの環境がわかんないと何も言えない
まずはこっちを埋めようぜ?
最近、std::tr1ていう名前空間をよくみかけるようになたんだけど お姉さま、あれは何ですの?
ume
990
埋め
梅
993
994 :
994 :2006/06/11(日) 18:07:11
うめお
997
998
999 :
デフォルトの名無しさん :2006/06/11(日) 18:10:10
↓1000おめでとう
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。