【初心者歓迎】C/C++室 Ver.28【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/06/09(金) 10:08:51ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0655笹井奈琴
2006/06/24(土) 17:00:52struct buf_wrap {
char buf[10];
}
struct buf_wrap Hoge() {
struct buf_wrap r;
strcpy( r.buf, "hoge" );
}
int main() {
struct buf_wrap l;
l = Hoge();
printf( "%s", l.buf );
}
スタックをたくさん消費するし、
そんなに簡潔な感じもしないのであんまりお薦めしない。
0657デフォルトの名無しさん
2006/06/24(土) 17:10:57についてわからないのですが、
宣言時に初期化せずにconstした場合、そのとき
aのメモリ位置に元から入っている未知のビットが
aの定数として固定されるのではなく、
後から代入が可能なのですか?
0658デフォルトの名無しさん
2006/06/24(土) 17:22:08const char *a;
と
char * const b;
の違い。
0659@゚ν゚)ニホンゴムズカスィネー ◆FIgVQJjZb6
2006/06/24(土) 17:23:530660デフォルトの名無しさん
2006/06/24(土) 17:31:08しかし画面を最大化するとツールバーが消えてしまいます。
ウィンドウのサイズが変更になったときの処理
WM_SIZE: SendMessage(hTool、TB_AUTOSIZE、0、0)
もして、ツールバーにメッセージをおくっているのですが直りません。
どうしたらいいですか?
0661デフォルトの名無しさん
2006/06/24(土) 18:01:01初心者にもいろいろあるし好みもあるから、一概にこれというのは決められない。
自分で試して使いやすいのを選べ。
0662デフォルトの名無しさん
2006/06/24(土) 18:10:44純粋仮想関数の存在意味がわかりません。
仮想関数でも十分な気がするんですが。
0663デフォルトの名無しさん
2006/06/24(土) 18:12:23・派生クラスにオーバーライドを強制できる
・純粋仮想関数があるクラスはインスタンス化できなくなる
0664デフォルトの名無しさん
2006/06/24(土) 18:27:16gccでコンパイルしたライブラリーはiccからリンクすることは
可能なのでしょうか?
よろしくお願いします。
0665デフォルトの名無しさん
2006/06/24(土) 19:04:20Windows版iccはリンカにMSのLink.exeを使うんじゃなかったかな。gccはどうだっけ?
Linux版はgccでコンパイルしたと思われるライブラリを使っているから大丈夫っぽい。
#但し、C++は無理。
0666デフォルトの名無しさん
2006/06/24(土) 19:21:07これはどういう意味なんでしょうか
0667デフォルトの名無しさん
2006/06/24(土) 19:21:20インターフェースのみのクラスを定義できる。
派生クラスにインターフェースを確実に継承させられる
(インターフェースの保証ができる)
0668デフォルトの名無しさん
2006/06/24(土) 19:28:060669デフォルトの名無しさん
2006/06/24(土) 19:33:15スマン 訂正サンクス。
0670デフォルトの名無しさん
2006/06/24(土) 19:34:45ゼロで除算が行われた。
0671デフォルトの名無しさん
2006/06/24(土) 19:35:33ありがとうございます
0672デフォルトの名無しさん
2006/06/24(土) 19:38:15というかそのまま書いてあるんだから読めよ
0673デフォルトの名無しさん
2006/06/24(土) 20:19:560674デフォルトの名無しさん
2006/06/24(土) 21:46:27int count=0;
int main(void){
while(1){
cout<<count;
}
}
これをコンパイルしようとすると
「E2015'count'とSTL::count(略)の区別が曖昧」ってエラーでて、
countを別の変数に変えると通るのはどうして?
0675デフォルトの名無しさん
2006/06/24(土) 21:56:25obsoleteなC++コンパイラは窓から投げ捨てろ。
0676デフォルトの名無しさん
2006/06/24(土) 22:01:57よくわかんないけどBCC6ってポンコツなのか
0677デフォルトの名無しさん
2006/06/24(土) 22:09:53だとしたらBCCって超絶ウンコだな
0678デフォルトの名無しさん
2006/06/24(土) 22:12:220679デフォルトの名無しさん
2006/06/24(土) 22:14:050680デフォルトの名無しさん
2006/06/24(土) 22:18:13BCCはもう5.8.2になってるから。5.6.4とかだろ?あれは失敗作と言われている。
STLportなんぞを無理に取り込もうとするからnamespace周りでバグだらけ。
5.8.2も良いとは言えないが、Dinkumwareなので上のようなエラーにはならない。
0681デフォルトの名無しさん
2006/06/24(土) 22:23:320682674=676
2006/06/24(土) 22:26:23ちょっと勘違いしてるかもしれない。
0683デフォルトの名無しさん
2006/06/24(土) 22:39:27ネットなプログラムを書こうとしてるんだけど、お互いが固定ではないIP
の場合、相手のIPを知る必要がありますよね。手動で相手のIPを入力する
のは手間だし、メッセのデータを使えると便利かなぁとか。
0684デフォルトの名無しさん
2006/06/24(土) 22:45:230685デフォルトの名無しさん
2006/06/24(土) 23:00:39// extern unsigned int *data; // srcにdata[0]が代入される
// extern unsigned int data[]; // 意図通りに動く
void hoge()
{
void *src, *dst;
src = data;
dst = malloc(1024);
memcpy(dst, src, 1024);
}
ポインタと配列で混乱中なんだけど誰か講釈してくれ
0686デフォルトの名無しさん
2006/06/24(土) 23:05:210687デフォルトの名無しさん
2006/06/24(土) 23:09:16ネタ?
0688デフォルトの名無しさん
2006/06/24(土) 23:27:120689デフォルトの名無しさん
2006/06/24(土) 23:31:01unsigned int dataについてもっとくやしく語ってください。
0690デフォルトの名無しさん
2006/06/24(土) 23:56:23for(i=0;i<100;i++){
fprintf(stderr, "%s\n", strerror(i));
}
こんなの実行してみて出力結果を眺めていたんですけど、
strerr(17);だと
vs2005 :Block device required
cygwin :Unknown error
でエラー内容が違っていたりします。
別にエラーとして出力される内容が違っているのは問題ないんですが、
c言語では、エラーが起きるかもしれない標準関数を実行し、エラーが
起きた場合のエラー定数ってマクロ定義されていないんでしょうか?
もしも、マクロ定義されている場合、どこを調べるといいんでしょうか?
0691デフォルトの名無しさん
2006/06/25(日) 00:06:12ほんとにcygwinでerrno=17がそのエラーか?
ってのは置いといて、<errno.h>を見ればわかる。もちろんerrno.hが何かを
インクルードしてたら、それも見るんだぞ。
cygwinの場合は、/usr/include/errno.hだ。
0693デフォルトの名無しさん
2006/06/25(日) 00:13:38ANSI-CではEDOMとERANGEが決まってる
それ以外はPOSIXとかX/OPENとかなんかでも決まりがある
はっきり言って統一されていないが、過去の互換性とかあるので仕方が無い
0694デフォルトの名無しさん
2006/06/25(日) 00:17:170695689
2006/06/25(日) 00:41:59んなら挙動は同じ。
src[0]でけでなくsrc[1]も見てみな。デバガでメモリを参照するといい。
>>686の言うとおりポインタを理解していないと思われる。
「配列はポインタのシンタックスシュガーなんだよ!」
こう語れるぐらい勉強してください。
0696デフォルトの名無しさん
2006/06/25(日) 00:56:47マクロ定義だけでも統一してくれればいいのに・・・
コンパイラ屋はマクロ定義をマクロ定義すればいいだけだからそんなに手間はかからないだろうに。
エラー処理は移植性を考慮できないじゃん。
0697デフォルトの名無しさん
2006/06/25(日) 01:10:53> 「配列はポインタのシンタックスシュガーなんだよ!」
それだとポインタがあれば配列が必要ないような言い方だが、
配列なしにはメモリ上で連続したオブジェクトの集合を表現できないよ。
0698デフォルトの名無しさん
2006/06/25(日) 01:19:380699660
2006/06/25(日) 01:23:540700デフォルトの名無しさん
2006/06/25(日) 01:29:300701デフォルトの名無しさん
2006/06/25(日) 01:33:490702685
2006/06/25(日) 02:08:50int data_ary[] = {1,2,3,4};
int data_ptr[] = {5,6,7,8};
-- xyz.c ---
extern int *data_ptr;
extern int data_ary[];
int *src;
int ary[] = {9,10,11,12};
src = ary; // こういう書き方が出来るので
src = data_ptr; // これもOKだと思ってた
src = data_ary; // こっちはOK
解決できました。
みなさんありがとうございました。
0703デフォルトの名無しさん
2006/06/25(日) 03:11:35複数の戻り値を返すには仮引数を使うところは分かったんですが…。
void func(int **array, int *number);
int main(void)
{
int *array, number;
func(&array, &number);
(処理...)
return 0;
}
void func(int **array, int *number)
{
int data[50], data_number;
(処理...)
*array = data;
*number = data_number;
}
配列を返したい時に、これでいいのかちょっと自信がありません。
コンパイラは通るので間違ってはいないと思うのですが、なにか改良点などあるでしょうか?
0704デフォルトの名無しさん
2006/06/25(日) 03:19:48初心者がよくやる間違い。
関数から抜けた時点ですでに開放されている領域(スタック上に確保された配列)を
ポイントしているので、領域内のデータは保証されない。
0705703
2006/06/25(日) 03:34:55ではint data[50]をstatic変数にするか、グローバル変数にすればよいってことですか?
static変数やグローバル変数を使わずに配列を戻り値としてとる方法は無いでしょうか。
0706デフォルトの名無しさん
2006/06/25(日) 03:44:230707デフォルトの名無しさん
2006/06/25(日) 03:49:58> あー…。
> ではint data[50]をstatic変数にするか、グローバル変数にすればよいってことですか?
そうです。
> static変数やグローバル変数を使わずに配列を戻り値としてとる方法は無いでしょうか。
ある。
0708デフォルトの名無しさん
2006/06/25(日) 10:55:02と斜め上の回答もしてみる
0709デフォルトの名無しさん
2006/06/25(日) 13:23:12引き渡したバッファにデータを設定したいなら中身をコピーせんと。
0710デフォルトの名無しさん
2006/06/25(日) 15:38:00検索しても個人のサイトゆか見つからず、そのようなサイトは一部の関数等の説明が省かれてしまっています。
MSDNには英語のものしか見つかりませんでした。
0711デフォルトの名無しさん
2006/06/25(日) 15:40:42読むだけなら、JISでいけるが。
ttp://www.jisc.go.jp/
0713デフォルトの名無しさん
2006/06/25(日) 15:57:06http://pc8.2ch.net/test/read.cgi/tech/1149427282/289-290n
0714デフォルトの名無しさん
2006/06/25(日) 16:12:42API一覧ならMSDNにも日本語でついてるよ
構造体とメッセージは英語だけど
0716デフォルトの名無しさん
2006/06/25(日) 19:48:000717デフォルトの名無しさん
2006/06/25(日) 20:02:50(*array)[0] = data[0];
(*array)[1] = data[1];
以下略
0718京大生www
2006/06/26(月) 19:37:34int compare (char *s1, char *s2) {
int i;
char new_s1[20];
for (i=0; i<20; i++) {
new_s1[20] = toupper(s1[i]);
}
return strcmp(new_s1, s2);
}
strcmpの進化版みたいのを作ったつもりですがうまく作動しません。
どこが間違っているのでしょうか?
ちなみにここで使います。見てのようにどうせ小文字しかないのでstrcmpで代用したらうまく動きました。
上のはどこが間違っているのでしょうか。
void search_record(word *eng, int current_num, char *search_string){
int i;
int count=0;
for (i=0; i<current_num; i++){
if(strcmp(eng[i].spelling, search_string)==0) {
printf("%s\n", eng[i].spelling);
count += 1;
}
}
printf("以上%d件がヒットしました", count);
}
0719スミたん ◆JnsvZNFyHU
2006/06/26(月) 19:54:41環境はbcc32です。
0720デフォルトの名無しさん
2006/06/26(月) 20:05:13おそらくforの中のこれ。
> new_s1[20] = toupper(s1[i]);
new_s1[i]だろ、きっと。
けど、そのcompareではs1に19文字以上の文字列を渡せない。
ループまわして1文字ずつ比較するようにしようよ、strcmp使わないで。
もっとも、英字の大小を区別せずに比較したいだけなら、
だいたいstricmpとかstrcmpiとかそういう名前の関数が
処理系独自に用意されていることが多い。
0721京大生www
2006/06/26(月) 20:10:11ちとやってエラーでたら報告する
0722京大生www
2006/06/26(月) 20:14:34しかし直したにも関わらず
compare("unko", "unko")で-32という意味不明な値を返してきた。
鬱になる、これさえ通せば終わりなのに・・・何が間違ってるんだぁ
0723京大生www
2006/06/26(月) 20:16:00そういう便利な関数があるとは知らなかったが、使っちゃダメなんだろうな〜あくまでも課題だから
0724デフォルトの名無しさん
2006/06/26(月) 20:16:330725デフォルトの名無しさん
2006/06/26(月) 20:20:37大文字小文字区別しないなら、引数の両方を統一してやらないと意味無いのでは?
0726京大生www
2006/06/26(月) 20:44:07かけられるワード(配列)は全部小文字なのですが、課題では例えそれが大文字であってもよいようにしろという意図が含まれています。
ああああああああああああああああ
toupperじゃなくてtolowerじゃねーか。やってみよ
0727京大生www
2006/06/26(月) 20:46:57全部解決、ありがとございますた!!!!
0728デフォルトの名無しさん
2006/06/26(月) 20:59:29魔美ちゃんありがとう!
0729デフォルトの名無しさん
2006/06/26(月) 21:38:59あーなるほど。亀レスですが、ありがとうございました。
0730デフォルトの名無しさん
2006/06/26(月) 22:33:590731デフォルトの名無しさん
2006/06/26(月) 23:32:530732デフォルトの名無しさん
2006/06/26(月) 23:40:590733デフォルトの名無しさん
2006/06/27(火) 00:56:13をみなさんはどのように考えていますか?
経験不足なのか、私にはいまいちわかりません。
0734デフォルトの名無しさん
2006/06/27(火) 01:00:27それだけだ。
0735デフォルトの名無しさん
2006/06/27(火) 01:00:27質問の意味がわかりません。
0736703
2006/06/27(火) 01:28:10>>703のコードのvoid funcを
void func(int **array, int *number)
{
int data[50], data_number, i;
(処理...)
for(i = 0, i < data_number; i++) {
(*array)[i] = data[i];
}
*number = data_number;
}
に変えたり、forの部分をmemcpy(*array, data, sizeof(data));とかにしてみましたが
うまくいきませんでした(コンパイラは通る)
どう修正すればいいのでしょうか…。
0737デフォルトの名無しさん
2006/06/27(火) 01:45:35それだけじゃエスパーしかわからんから、ソース丸ごとどっかに上げてみ。
0738デフォルトの名無しさん
2006/06/27(火) 01:50:07-void func(int **array, int *number)
+void func(int *array, int *number)
-(*array)[i] = data[i];
+array[i] = data[i];
0739738
2006/06/27(火) 01:54:04int配列へのポインタなら配列の先頭アドレスを渡せば
配列全体の変更ができる。
0740738
2006/06/27(火) 02:12:35int a[50];
int *b=a;
int cnt;
func(&b, &cnt);
>>738 なら
func(a, &cnt);
で呼び出せる。
0741703=736
2006/06/27(火) 02:39:47int main(void)
{
int *array_data, number;
func(array_data, &number);
(array_dataを表示する処理など...)
return 0;
}
void func(int *array, int *number)
{
int data[50], data_number, i;
(50個以下で入力したデータをdataに格納する処理など...)
//data_numberはdataに格納されてるデータの個数です
for(i = 0, i < data_number; i++) array[i] = data[i];
*number = data_number;
}
こうすると、値が割り当てられていないローカルな変数array_dataに対して参照が行われたとエラーがでます。
func(array_data, &number);の前にmallocするとか、あらかじめarray_data[50];とかって
領域を確保しておけばエラーはでないのですが、void func()内で得たデータ分だけの領域を
確保したいのです。
0742デフォルトの名無しさん
2006/06/27(火) 02:52:07それは無理だ。
必要領域の大きさを返す関数を先に呼ぶか、
充分な領域を用意するか、
可変長の構造を持つクラスのオブジェクトを渡すか
のどれかでないと。
0743742
2006/06/27(火) 03:07:12その方式でいけば、
#define NULL 0
int main(void)
{
int *array_data, number;
func(NULL,&number);
array = (int*)malloc(number*sizeof(int));
func(array_data, &number);
(array_dataを表示する処理など...)
free(array);
return 0;
}
void func(int *array, int *number)
{
int data[50], data_number, i;
(50個以下で入力したデータをdataに格納する処理など...)
//data_numberはdataに格納されてるデータの個数です
if(array !=NULL)
for(i = 0, i < data_number; i++) array[i] = data[i];
*number = data_number;
}
0744デフォルトの名無しさん
2006/06/27(火) 10:38:54func()を二度呼んでもコストが掛からない状況にしか使えないね。
>>741
エラー処理省略でこんな感じじゃね?
int main()
{
int ** array, number;
func(& array, & number);
...;
free(array);
return 0;
}
void func(int ** array, int * number)
{
int tNumber = 件数;
int * tArrray = malloc(sizeof(int) * tNumber);
for (int i = 0; i < 件数; ++i) {
tArray[i] = データ[i];
}
* array = tArray;
* number = tNumber;
}
まぁ、件数は戻り値でもいい気がするけどね。
0745デフォルトの名無しさん
2006/06/27(火) 18:40:16ウィンドウプロシージャ関数の先頭で構造体を宣言してウィンドウプロシージャ内で構造体内のデータをセットしたら動作がおかしくなります。なにが原因なのですか?
0746デフォルトの名無しさん
2006/06/27(火) 19:01:380747デフォルトの名無しさん
2006/06/27(火) 19:05:390748デフォルトの名無しさん
2006/06/27(火) 19:10:14inline int f(int i)
{
static const int a[] = {...};
return a[i];
}
という風に書いた場合,どういう風に展開されるのでしょう?
a[]は1つだけ確保されるのでしょうか?
0749デフォルトの名無しさん
2006/06/27(火) 19:34:38賢いコンパイラなら定数に展開するかも。たぶん
0750デフォルトの名無しさん
2006/06/27(火) 19:35:080751デフォルトの名無しさん
2006/06/27(火) 19:43:53それはさておき、inline関数はstatic inlineにする方が無難だと思うのだが。
0752745
2006/06/27(火) 20:06:15すいません説明不足でした
Aという構造体とCという構造体ををウィンドウプロシージャ内の先頭で宣言して、宣言直後にAとCの構造体
に、データをセットすると、Aはのデータは正常ですがCのデータだけがおかしくなるので
参照位置はあんまり関係なあいとおもいます
0753デフォルトの名無しさん
2006/06/27(火) 20:10:42その構造体の定義とウィンドウプロシージャを晒して味噌。
#十中八九、バッファオーバランだろうけど。
0754デフォルトの名無しさん
2006/06/27(火) 20:32:11fをstaticにすべきかはfがどこでどう使われているかに拠るだろ。
そんな一概に言えることか?
■ このスレッドは過去ログ倉庫に格納されています