トップページ⇒tech
1001コメント336KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/06/09(金) 10:08:51
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※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:52
どうしても返り値でやりたいんなら
struct 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 );
}

スタックをたくさん消費するし、
そんなに簡潔な感じもしないのであんまりお薦めしない。
06566532006/06/24(土) 17:02:23
>>654
出来ました
ありがとです。
0657デフォルトの名無しさん2006/06/24(土) 17:10:57
>>647
についてわからないのですが、
宣言時に初期化せずにconstした場合、そのとき
aのメモリ位置に元から入っている未知のビットが
aの定数として固定されるのではなく、
後から代入が可能なのですか?

0658デフォルトの名無しさん2006/06/24(土) 17:22:08
>657
const char *a;
と
char * const b;
の違い。
0659@゚ν゚)ニホンゴムズカスィネー ◆FIgVQJjZb6 2006/06/24(土) 17:23:53
コンパイラで初心者でも使いやすいのを教えてください
0660デフォルトの名無しさん2006/06/24(土) 17:31:08
質問があります。ウィンドウプログラムでツールバーを作成しました。
しかし画面を最大化するとツールバーが消えてしまいます。
ウィンドウのサイズが変更になったときの処理
 WM_SIZE: SendMessage(hTool、TB_AUTOSIZE、0、0)
もして、ツールバーにメッセージをおくっているのですが直りません。
どうしたらいいですか?
0661デフォルトの名無しさん2006/06/24(土) 18:01:01
>>659
初心者にもいろいろあるし好みもあるから、一概にこれというのは決められない。
自分で試して使いやすいのを選べ。
0662デフォルトの名無しさん2006/06/24(土) 18:10:44
初心者の質問ですいません。

純粋仮想関数の存在意味がわかりません。
仮想関数でも十分な気がするんですが。

0663デフォルトの名無しさん2006/06/24(土) 18:12:23
>>662
・派生クラスにオーバーライドを強制できる
・純粋仮想関数があるクラスはインスタンス化できなくなる
0664デフォルトの名無しさん2006/06/24(土) 18:27:16
初心者質問です。
gccでコンパイルしたライブラリーはiccからリンクすることは
可能なのでしょうか?
よろしくお願いします。
0665デフォルトの名無しさん2006/06/24(土) 19:04:20
>>664
Windows版iccはリンカにMSのLink.exeを使うんじゃなかったかな。gccはどうだっけ?
Linux版はgccでコンパイルしたと思われるライブラリを使っているから大丈夫っぽい。
#但し、C++は無理。
0666デフォルトの名無しさん2006/06/24(土) 19:21:07
LSI使ってるんですが、「Division by 0」というエラーが出ます
これはどういう意味なんでしょうか
0667デフォルトの名無しさん2006/06/24(土) 19:21:20
>>662
インターフェースのみのクラスを定義できる。
派生クラスにインターフェースを確実に継承させられる
(インターフェースの保証ができる)



0668デフォルトの名無しさん2006/06/24(土) 19:28:06
確実に実装させられる。だな。
0669デフォルトの名無しさん2006/06/24(土) 19:33:15
>>668
スマン 訂正サンクス。
0670デフォルトの名無しさん2006/06/24(土) 19:34:45
>>666
ゼロで除算が行われた。
0671デフォルトの名無しさん2006/06/24(土) 19:35:33
>>670
ありがとうございます
0672デフォルトの名無しさん2006/06/24(土) 19:38:15
>671
というかそのまま書いてあるんだから読めよ
0673デフォルトの名無しさん2006/06/24(土) 20:19:56
だから今時LSI-Cなんか使うなよ。
0674デフォルトの名無しさん2006/06/24(土) 21:46:27
#include<iostream.h>

int count=0;

int main(void){
while(1){
cout<<count;
    }
}

これをコンパイルしようとすると
「E2015'count'とSTL::count(略)の区別が曖昧」ってエラーでて、
countを別の変数に変えると通るのはどうして?
0675デフォルトの名無しさん2006/06/24(土) 21:56:25
>>674
obsoleteなC++コンパイラは窓から投げ捨てろ。
0676デフォルトの名無しさん2006/06/24(土) 22:01:57
>>675
よくわかんないけどBCC6ってポンコツなのか
0677デフォルトの名無しさん2006/06/24(土) 22:09:53
>>676=>>674?
だとしたらBCCって超絶ウンコだな
0678デフォルトの名無しさん2006/06/24(土) 22:12:22
まて、bcc5.5.1ならエラーにならないぞ!
0679デフォルトの名無しさん2006/06/24(土) 22:14:05
iostream,h はもうやめとけよ
0680デフォルトの名無しさん2006/06/24(土) 22:18:13
>>676
BCCはもう5.8.2になってるから。5.6.4とかだろ?あれは失敗作と言われている。
STLportなんぞを無理に取り込もうとするからnamespace周りでバグだらけ。

5.8.2も良いとは言えないが、Dinkumwareなので上のようなエラーにはならない。
0681デフォルトの名無しさん2006/06/24(土) 22:23:32
BCCってSTL変わりまくってんだな。昔はRougeWaveだったと思ったが
0682674=6762006/06/24(土) 22:26:23
Borland c++ Builder6 ≠ BCC6?
ちょっと勘違いしてるかもしれない。
0683デフォルトの名無しさん2006/06/24(土) 22:39:27
MSNメッセのメンバーのIPアドレスを知る方法ってありますか?

ネットなプログラムを書こうとしてるんだけど、お互いが固定ではないIP
の場合、相手のIPを知る必要がありますよね。手動で相手のIPを入力する
のは手間だし、メッセのデータを使えると便利かなぁとか。
0684デフォルトの名無しさん2006/06/24(土) 22:45:23
あ、すみません、ネットワークのスレあったんでそっちに行きます^^;
0685デフォルトの名無しさん2006/06/24(土) 23:00:39
// gcc3.4.3arm
// 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:21
ポインタと配列ではなく、ポインタを理解していないと思われます
0687デフォルトの名無しさん2006/06/24(土) 23:09:16
>>685

ネタ?

0688デフォルトの名無しさん2006/06/24(土) 23:27:12
やりたい事は strdup() なわけ?
0689デフォルトの名無しさん2006/06/24(土) 23:31:01
>>685
unsigned int dataについてもっとくやしく語ってください。
0690デフォルトの名無しさん2006/06/24(土) 23:56:23
gccとvs2005で

for(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
>>690
ほんとにcygwinでerrno=17がそのエラーか?
ってのは置いといて、<errno.h>を見ればわかる。もちろんerrno.hが何かを
インクルードしてたら、それも見るんだぞ。
cygwinの場合は、/usr/include/errno.hだ。
06926852006/06/25(日) 00:13:27
>>689
別ファイルでグローバル変数として初期化してます。
unsigned int data[] = {1,2,3,4,以下省略};
0693デフォルトの名無しさん2006/06/25(日) 00:13:38
>>690
ANSI-CではEDOMとERANGEが決まってる

それ以外はPOSIXとかX/OPENとかなんかでも決まりがある
はっきり言って統一されていないが、過去の互換性とかあるので仕方が無い
0694デフォルトの名無しさん2006/06/25(日) 00:17:17
ポインタは配列じゃないもんよ。
06956892006/06/25(日) 00:41:59
>>685
んなら挙動は同じ。
src[0]でけでなくsrc[1]も見てみな。デバガでメモリを参照するといい。
>>686の言うとおりポインタを理解していないと思われる。

「配列はポインタのシンタックスシュガーなんだよ!」
こう語れるぐらい勉強してください。
0696デフォルトの名無しさん2006/06/25(日) 00:56:47
error = 15でした。

マクロ定義だけでも統一してくれればいいのに・・・
コンパイラ屋はマクロ定義をマクロ定義すればいいだけだからそんなに手間はかからないだろうに。

エラー処理は移植性を考慮できないじゃん。
0697デフォルトの名無しさん2006/06/25(日) 01:10:53
>>695
> 「配列はポインタのシンタックスシュガーなんだよ!」

それだとポインタがあれば配列が必要ないような言い方だが、
配列なしにはメモリ上で連続したオブジェクトの集合を表現できないよ。
0698デフォルトの名無しさん2006/06/25(日) 01:19:38
シューガーベーィビらーぶ
06996602006/06/25(日) 01:23:54
事故解決しました。
0700デフォルトの名無しさん2006/06/25(日) 01:29:30
配列があればポインタは必要ない
0701デフォルトの名無しさん2006/06/25(日) 01:33:49
どっちもイラネ
07026852006/06/25(日) 02:08:50
-- abc.c --
int 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
>>703
初心者がよくやる間違い。
関数から抜けた時点ですでに開放されている領域(スタック上に確保された配列)を
ポイントしているので、領域内のデータは保証されない。
07057032006/06/25(日) 03:34:55
あー…。
ではint data[50]をstatic変数にするか、グローバル変数にすればよいってことですか?
static変数やグローバル変数を使わずに配列を戻り値としてとる方法は無いでしょうか。
0706デフォルトの名無しさん2006/06/25(日) 03:44:23
C++でstd::vectorを使う。
0707デフォルトの名無しさん2006/06/25(日) 03:49:58
>>705
> あー…。
> では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
C言語とC++の日本語リファレンス(JavaのAPIリファレンスやPHPのPHPマニュアルのような、関数やクラスの一覧など)はどこで読めますか?
検索しても個人のサイトゆか見つからず、そのようなサイトは一部の関数等の説明が省かれてしまっています。
MSDNには英語のものしか見つかりませんでした。
0711デフォルトの名無しさん2006/06/25(日) 15:40:42
>>710
読むだけなら、JISでいけるが。
ttp://www.jisc.go.jp/
07127112006/06/25(日) 15:43:33
でも正直言って、英語読みたくねー日本語よこせとかいうレベルで、
規格書はお勧めしないが。
>>710が規格書を必要としているとは思えない。
0713デフォルトの名無しさん2006/06/25(日) 15:57:06
これもまた完璧ではないけれど。
http://pc8.2ch.net/test/read.cgi/tech/1149427282/289-290n
0714デフォルトの名無しさん2006/06/25(日) 16:12:42
>>710
API一覧ならMSDNにも日本語でついてるよ
構造体とメッセージは英語だけど
07157032006/06/25(日) 19:46:28
>>709
中身をコピーするにはどうしたらいいのでしょうか?
0716デフォルトの名無しさん2006/06/25(日) 19:48:00
memcpy strcpy
0717デフォルトの名無しさん2006/06/25(日) 20:02:50
>>715
(*array)[0] = data[0];
(*array)[1] = data[1];
以下略
0718京大生www2006/06/26(月) 19:37:34
課題をやってる途中です。

int 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
>>718
おそらくforの中のこれ。
> new_s1[20] = toupper(s1[i]);
new_s1[i]だろ、きっと。
けど、そのcompareではs1に19文字以上の文字列を渡せない。
ループまわして1文字ずつ比較するようにしようよ、strcmp使わないで。

もっとも、英字の大小を区別せずに比較したいだけなら、
だいたいstricmpとかstrcmpiとかそういう名前の関数が
処理系独自に用意されていることが多い。
0721京大生www2006/06/26(月) 20:10:11
本当だ、ありがとう。
ちとやってエラーでたら報告する
0722京大生www2006/06/26(月) 20:14:34
えっと比べる先がchar [20]だから問題がない。
しかし直したにも関わらず
compare("unko", "unko")で-32という意味不明な値を返してきた。
鬱になる、これさえ通せば終わりなのに・・・何が間違ってるんだぁ
0723京大生www2006/06/26(月) 20:16:00
あと、課題なので小文字で比較する関数を作りやがれと申しております。
そういう便利な関数があるとは知らなかったが、使っちゃダメなんだろうな〜あくまでも課題だから
0724デフォルトの名無しさん2006/06/26(月) 20:16:33
man strcmp
0725デフォルトの名無しさん2006/06/26(月) 20:20:37
小文字でなのにtoupperか!
大文字小文字区別しないなら、引数の両方を統一してやらないと意味無いのでは?
0726京大生www2006/06/26(月) 20:44:07
検索にかけるワードは小文字で打てといってあります。
かけられるワード(配列)は全部小文字なのですが、課題では例えそれが大文字であってもよいようにしろという意図が含まれています。

ああああああああああああああああ
toupperじゃなくてtolowerじゃねーか。やってみよ
0727京大生www2006/06/26(月) 20:46:57
ビンゴー!!!!!
全部解決、ありがとございますた!!!!
0728デフォルトの名無しさん2006/06/26(月) 20:59:29
>>551
魔美ちゃんありがとう!
0729デフォルトの名無しさん2006/06/26(月) 21:38:59
>>716-717
あーなるほど。亀レスですが、ありがとうございました。
0730デフォルトの名無しさん2006/06/26(月) 22:33:59
京大生の評判を落とそうとしているやつがいる…
0731デフォルトの名無しさん2006/06/26(月) 23:32:53
ギャングスター大学というイメージしかないんですが
0732デフォルトの名無しさん2006/06/26(月) 23:40:59
それはそれは貧困なイマジネーションだこと
0733デフォルトの名無しさん2006/06/27(火) 00:56:13
純粋仮想関数をつける/つけない
をみなさんはどのように考えていますか?

経験不足なのか、私にはいまいちわかりません。
0734デフォルトの名無しさん2006/06/27(火) 01:00:27
どのように考えるも何も、必要なら付ける・必要ないなら付けない
それだけだ。
0735デフォルトの名無しさん2006/06/27(火) 01:00:27
>>733
質問の意味がわかりません。
07367032006/06/27(火) 01:28:10
>>716-717の方法でやってみたのですが、どうもうまくいきません。
>>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
>>736
それだけじゃエスパーしかわからんから、ソース丸ごとどっかに上げてみ。
0738デフォルトの名無しさん2006/06/27(火) 01:50:07
>>736
-void func(int **array, int *number)
+void func(int *array, int *number)

-(*array)[i] = data[i];
+array[i] = data[i];
07397382006/06/27(火) 01:54:04
int **array だと、int へのポインタへのポインタになる。
int配列へのポインタなら配列の先頭アドレスを渡せば
配列全体の変更ができる。
07407382006/06/27(火) 02:12:35
>>736 のままでも以下の様に呼び出せば、OKだが、無駄。

int a[50];
int *b=a;
int cnt;
func(&b, &cnt);


>>738 なら
func(a, &cnt);
で呼び出せる。
0741703=7362006/06/27(火) 02:39:47
void func(int *array, int *number);

int 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
>>741
それは無理だ。
必要領域の大きさを返す関数を先に呼ぶか、
充分な領域を用意するか、
可変長の構造を持つクラスのオブジェクトを渡すか
のどれかでないと。
07437422006/06/27(火) 03:07:12
WinAPIなんかだと、NULLを渡すとsizeだけ返すのがあるから、
その方式でいけば、

#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:54
>>743
func()を二度呼んでもコストが掛からない状況にしか使えないね。
>>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:38
スタックヤバスな予感
0747デフォルトの名無しさん2006/06/27(火) 19:05:39
その構造体の参照位置によるんじゃないかな
0748デフォルトの名無しさん2006/06/27(火) 19:10:14
質問です
inline 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:08
定数はさすがに無理か
0751デフォルトの名無しさん2006/06/27(火) 19:43:53
iの範囲チェックを厳密に行なっていれば定数になる可能性はあるよ。
それはさておき、inline関数はstatic inlineにする方が無難だと思うのだが。
07527452006/06/27(火) 20:06:15
>>747


すいません説明不足でした

Aという構造体とCという構造体ををウィンドウプロシージャ内の先頭で宣言して、宣言直後にAとCの構造体

に、データをセットすると、Aはのデータは正常ですがCのデータだけがおかしくなるので

参照位置はあんまり関係なあいとおもいます

0753デフォルトの名無しさん2006/06/27(火) 20:10:42
>>752
その構造体の定義とウィンドウプロシージャを晒して味噌。
#十中八九、バッファオーバランだろうけど。
0754デフォルトの名無しさん2006/06/27(火) 20:32:11
>>751
fをstaticにすべきかはfがどこでどう使われているかに拠るだろ。
そんな一概に言えることか?
■ このスレッドは過去ログ倉庫に格納されています