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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/06/03(日) 22:33:55
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.37【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1178432985/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0153デフォルトの名無しさん2007/06/07(木) 09:53:37
>>152
そんな隙だらけの説明しかできないんならヌルポインタについて語るのはやめとけ。
↓これでいいだろ。
http://www.kouno.jp/home/c_faq/c5.html
0154デフォルトの名無しさん2007/06/07(木) 09:57:54
自分の読解力の無さを人の文章力のせいにするな
0155デフォルトの名無しさん2007/06/07(木) 10:10:02
確かに隙が多かったな。

>ただ、これだけだと整数型とか小数型の値としてもとれるから、

これは、

#ただ、これだけだと「プログラムを読む人間」 が、この 0 が
#数値の 0 か、ヌルポインタの 0 かを、そこからだけでは読み取れないので、

という風な意味。
0156デフォルトの名無しさん2007/06/07(木) 10:13:43
自分の文章力の無さを人の読解力のせいにするな
0157デフォルトの名無しさん2007/06/07(木) 10:18:00
コピペうざす
0158デフォルトの名無しさん2007/06/07(木) 10:25:38
自分のうざさを人のうざさのせいにするな
0159デフォルトの名無しさん2007/06/07(木) 10:33:51
彼は分裂症で、彼の否定する自分自身とは彼自身では違う人格なのだから良いんだよ。
0160デフォルトの名無しさん2007/06/07(木) 10:54:04
何もかもみんなお前のせいだ
0161デフォルトの名無しさん2007/06/07(木) 14:32:34
for(;;)
{
struct st* a;
get(&a); /* callocで構造体配列作成しaに割り当て */
free(a);
}
これをコンパイルすると、syntax error: missing';' before 'type'
とでます。アドバイスを頂けないでしょうか。お願いします。
0162デフォルトの名無しさん2007/06/07(木) 14:36:43
申し訳ありません。161の件は宣言の前にif-break;を入れていたのが原因
のようです。しかし、freeのときにエラーが出るのがわからなく
その件について助言お願い致します。
0163デフォルトの名無しさん2007/06/07(木) 14:42:07
>>162
その原因の行も書いてよ。

自分がコンパイラになったつもりでたどればわかる
0164デフォルトの名無しさん2007/06/07(木) 14:47:38
aをNULLで初期化したらエラー消えるはず
0165デフォルトの名無しさん2007/06/07(木) 14:49:08
は関係ありませんねすいません
0166デフォルトの名無しさん2007/06/07(木) 15:18:12
161です。レスありがとうございました。自己解決しました。
if(FALSE)break;
struct st* a;
get(&a);
free(a);
だとコンパイルできなくて
struct st* a;
if(FALSE)break;
get(&a);
free(a);
だと実行時エラー。
struct st* a = NULL;
if(FALSE)break;
get(&a);
free(a);
で解決しました。C言語に慣れておらずいまいち理解できないので
すごく変な勘違いしてそうですね…。
0167デフォルトの名無しさん2007/06/07(木) 15:27:24
変数の宣言がブロックの先頭じゃなかった、という落ちか・・・
実行時エラーは何か勘違いしてる
0168デフォルトの名無しさん2007/06/07(木) 15:32:37
おそらく、get() の先のcallocで取ったポインタを * つけないで代入してるんだろうな
0169デフォルトの名無しさん2007/06/07(木) 15:32:46
実行時エラーというか実行時警告というか
あれは未初期化ポインタに対するアクセスのエラーだから
リリースビルドにすれば実行時に落ちることは無い
しかしその前にコンパイラの方で未初期化に対するどうたらこうたらっていう
警告が出るはずなんだが…
0170デフォルトの名無しさん2007/06/07(木) 15:34:10
>>169
get で &つけて呼び出してるから、警告は出ないんじゃないかな。
その関数で代入失敗してるっぽい。
0171デフォルトの名無しさん2007/06/07(木) 15:38:09
そうかごめん
試しにそうしたら確かに通っちゃったよ…
0172デフォルトの名無しさん2007/06/07(木) 15:41:04
コンパイルの段階で出てくるのが コンパイルエラー
(リンクの段階で出てくるのが リンクエラー)
出来上がった実行ファイルを実行して出てくるのが 実行時エラー

m(c)alloc で得られたポインタではない非NULL 値を realloc しようとしたんじゃねーかな?
0173デフォルトの名無しさん2007/06/07(木) 15:44:43
って calloc と書いてあったな…
get(struct st**) の実装晒したほうが早いぞ
0174デフォルトの名無しさん2007/06/07(木) 15:52:12
getの実装は既存のライブラリです。でも一応、callocの部分を
確認したところキャストはされていませんでした。
ブロックの先頭・値初期化の不備は、お恥ずかしいミスです。
ところで、C++てエラーメッセージがわかりにくくないですか?
関数や引数のクイックインフォも出なくて、難しすぎて泣けてきます。
0175デフォルトの名無しさん2007/06/07(木) 15:56:37
いや、これそのままなら初期化いらないはずなんだって。
getの仕様によるけどな。
0176デフォルトの名無しさん2007/06/07(木) 15:59:17
あ、>>168はキャストのことじゃなくて、参照を考慮にいれてないって
ことでしょうか?でも多分、get()には問題はないはずです。
たった4行のコードでここまで悩める俺みたいなバカは
プログラマに向いてないんでしょうねorz
0177デフォルトの名無しさん2007/06/07(木) 16:08:38
>>176
だったら get(arg) の仕様は?

第一引数 arg の内容を書き換えるだけ ならば、
 NULL 初期化しなくても、実行時エラーは出ないつくりになる(はず)。

第一引数 arg の内容を確認してから書き換える ならば、
 NULL 初期化が必須になるだろう。

この違いは get() を作った奴が指示すべきで、それを利用する側は、
その指示に従うしかない。 (で、その指示がない場合は作った奴を呪う)
0178デフォルトの名無しさん2007/06/07(木) 18:47:58
コマンドプロンプトで色々なコマンドが用意されていると思うのですが、
それをC言語で使用するにはどうすればいいのでしょうか?
具体的に言いますと、とりあえずexeファイルにa.txtをD&Dしたらそのディレクトリに
copy_a.txtというファイルを作成したりしたいです。コマンドプロンプトでいうとcp a.txt copy_a.txtですね。
まぁやりたいのはcpコマンドではなくて、javacコマンドとjavaコマンドなのですが・・・。
0179デフォルトの名無しさん2007/06/07(木) 18:51:14
system関数
01801782007/06/07(木) 18:51:42
まぁ、要はJAVAのコンパイルが面倒なのでドラッグするだけで出来るソフトをCで作りたいって話なんです。
01811782007/06/07(木) 18:54:29
>>179
ありがとうございます。
ちょっとやってみます。
0182デフォルトの名無しさん2007/06/07(木) 19:19:13
strcmp(buf, '\0');
でエラーが出るのですが、何か書式を間違ってるでしょうか?
文字列を最後まで1文字ずつ取得して、文字数を数えるプログラムを作ろうとしています。
最後取得したら\0がbufに入ると思うのですが、上の文でエラーが・・・
0183デフォルトの名無しさん2007/06/07(木) 19:23:49
>>182
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strcmp.3.html
引数の型が違う。(というかたぶんstrcmp()が何をする関数なのか勘違いしている)
0184デフォルトの名無しさん2007/06/07(木) 19:26:23
そもそもそんな関数呼ぶくらいならstrlenでいいじゃん
0185デフォルトの名無しさん2007/06/07(木) 19:37:02
>>183
とりあえずnullmoji[2]に'\0'を入れてstrcmpをしたら正常に動作しました。
ありがとうございました。

>>184
そういう課題なんです・・・
0186デフォルトの名無しさん2007/06/07(木) 19:42:50
C++でクラスを書くとき、Javaの書き方に合わせようと思って、

#define Public public:
#define Private private:
#define Protected protected:

って定義して、んでヘッダファイルを

Public int getNum();
Public void setNum(int num);

みたいに書いてみたんだけど、これと似たようなことをやる人は多い?
それとも明らかにC++の常識からは外れた書き方?
0187デフォルトの名無しさん2007/06/07(木) 19:46:56
他言語を真似るマクロは愚の骨頂だと俺は思う

なにより読みにくいし、なら java でかけよと言いたい
0188デフォルトの名無しさん2007/06/07(木) 19:52:34
>>186
m9( ´,_‥`)プッ
0189デフォルトの名無しさん2007/06/07(木) 19:56:46
つか
Javaってpublicだのprivateだのの先頭、いつから大文字で書くようになったんだ
0190デフォルトの名無しさん2007/06/07(木) 19:57:08
>>186
PASCAL風に
#define BEGIN }
#define END }
なんてやられたソースをおまえは許せるんだな?
0191デフォルトの名無しさん2007/06/07(木) 19:59:41
Bourne shellの作者のSteve BourneがALGOL風のトンチキなマクロを定義して
シェルを書いたのは(勿論悪い意味で)有名
0192デフォルトの名無しさん2007/06/07(木) 20:20:55
>>187
関数一覧をカテゴリ別に並べて書きたくて……

>>188
(´・ω・`)

>>189
いや先頭が小文字のpublicとかは予約語なんで

>>190
……ええと、すいません
0193デフォルトの名無しさん2007/06/07(木) 20:23:51
マクロなんだから予約語も糞もないだろ
0194デフォルトの名無しさん2007/06/07(木) 20:26:05
#define for if(0); else for

とかできるんだぜ。
0195デフォルトの名無しさん2007/06/07(木) 20:29:36
>>186
やるな。
理由は色々あるが、一番実害があるのはこんなところか。

#define public public:

としたとして、

class A {
public void foo();
void bar();
};

の bar のアクセス指定がどうなるか考えてみよう。
これは public だ。

だが、見た目から直感的に感じるのは private だろう。
こういう齟齬が発生するから、してはいけない。
0196デフォルトの名無しさん2007/06/07(木) 20:29:41
>>192
あほすぎw
0197デフォルトの名無しさん2007/06/07(木) 20:37:01
>>194
for (int i=0; ...) {
 // スコープ1
}
// スコープ2

でi がスコープ2 まで有効な特殊系(VCだなっ) を回避する常套句ですな
0198デフォルトの名無しさん2007/06/07(木) 20:41:40
ふるっ
0199デフォルトの名無しさん2007/06/07(木) 22:09:01
特殊っていうか、昔はそれで仕様通りだったと思う。
0200デフォルトの名無しさん2007/06/07(木) 23:01:19
そういえばVisual C++で.NETアプリケーションのウィザードを使うと、
public: void Hoge()なんてコードを出していた気がする
0201デフォルトの名無しさん2007/06/07(木) 23:03:36
>>199
それが仕様だったかも知れないが、規格にはなっていない罠。
0202デフォルトの名無しさん2007/06/07(木) 23:06:05
ふるーい規格の話だけど、
それでもなってないの?
0203デフォルトの名無しさん2007/06/07(木) 23:07:51
ARMやドラフトを規格だと言うのなら
規格になっていたと言うがいい
0204デフォルトの名無しさん2007/06/07(木) 23:26:13
なるほど。ドラフト段階でしかこの仕様はなかったわけか。
02051782007/06/07(木) 23:43:26
>>178です。とりあえずサンプルってことで
system("cd c:\\java");
system("java HelloWorld");
で実行したみたのですが、
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
と出てしまいます。普通にコマンドプロンプトでcd c:\javaとjava HelloWorldを打ち込んだときは
正常に動作するのですが、何かsystemでやるときに特別に何かしなければいけない事があるのでしょうか?
02061782007/06/07(木) 23:49:32
というよりも、system("cd c:\\java");のあとに
system("dir")を実行したら、javaディレクトリが表示されずに、
プロジェクトのディレクトリが表示されるのですが・・・
0207デフォルトの名無しさん2007/06/07(木) 23:52:22
system("java c:\\java\\HelloWorld");じゃ駄目なの?
0208デフォルトの名無しさん2007/06/07(木) 23:52:57
それぞれのsystem呼出は、細切れになるから
1度のsystem呼出で済ませるようにしろ
絶対パスで指定するとか、バッチファイルを作ってそれをsystemで呼ぶとか
02091782007/06/07(木) 23:56:35
一回ごとに細切れなんですか・・・。結構面倒ですねw
とりあえずsystem("java c:\\java\\HelloWorld");で実行してみたのですが、やはり
Exception in thread "main" java.lang.NoClassDefFoundError: c:\java\HelloWorld
と出てしまいます。う〜ん・・・
02101782007/06/08(金) 00:06:01
system("javac c:\\java\\HelloWorld.java");
は普通に実行できてるっぽいです。javaコマンドだけ何で出来ないのかな;;
0211デフォルトの名無しさん2007/06/08(金) 00:12:18
カレントに存在する必要があるのかな?
それとも区切り文字か。
ってことで、system("cd c:\\java; java HelloWord")とsystem("java c:/java/HelloWordl")を試して味噌。
0212デフォルトの名無しさん2007/06/08(金) 00:21:01
先にコマンドプロントにjava c:\java\HelloWorldに打ち込んでみれば?
0213デフォルトの名無しさん2007/06/08(金) 09:35:51
>>212
普通はそれを最初にやるわな
0214デフォルトの名無しさん2007/06/08(金) 10:47:42
C++の参照は、中身はポインタと同じで、参照先のアドレスがメモリに記憶されてるんですか?
(関数内で参照をいくつか用いると、それだけスタック使うことになりますか?)
0215デフォルトの名無しさん2007/06/08(金) 10:55:06
>(関数内で参照をいくつか用いると、それだけスタック使うことになりますか?)
質問の意図が読めんが…

関数の引数で
値渡しした場合には 値が持つ大きさ だけスタックに詰まれる
参照渡しした場合には ポインタが持つ大きさ だけスタックに詰まれる
0216デフォルトの名無しさん2007/06/08(金) 11:34:37
>>214
通常変数がスタックを消費する保証はない。
まして、参照変数がスタックを消費するかどうかはコンパイラ次第。
02171782007/06/08(金) 12:13:26
>>212
おぉ・・・出来ませんでした・・・。何でだろう・・・。
javaコマンドはそのカレントディレクトリにあるファイルに対してしか実行できないとか・・・?
02181782007/06/08(金) 12:19:35
>>211
system("cd c:\\java; java HelloWorld");
だと、指定されたパスが見つかりませんと出ます。
system("java c:/java/HelloWordl");
だと、Exception in thread "main" java.lang.NoClassDefFoundError: c:/java/HelloWorld
う〜ん・・・
02191782007/06/08(金) 12:23:46
system("copy c:\\java\\HelloWorld.class c:\\java\\HelloWorld2.class");
などは正常に動作するようです。やはりjavaコマンドの仕様なのでしょうか・・・;;
0220デフォルトの名無しさん2007/06/08(金) 12:32:11
javaの仕様がわかってないな。
まあカレントディレクトリの移動などは、SetCurrentDirectory() 使えばいい
02211782007/06/08(金) 12:44:54
>>220
ありがとうございます。どうやら僕の勉強不足のようですね。しかし、
SetCurrentDirectory((LPCWSTR)"c:\\JAVA");
としても、カレントディレクトリが変わったような動作はしないのですが・・・。
その後dirコマンドを打ったら、やはりプロジェクトのディレクトリが表示されます。
0222デフォルトの名無しさん2007/06/08(金) 12:48:21
まさかとは思うが、Dドライブで作業してたりして。
0223デフォルトの名無しさん2007/06/08(金) 12:49:32
>SetCurrentDirectory((LPCWSTR)"c:\\JAVA");

SetCurrentDirectory(L"c:\\JAVA");
じゃ…
02241782007/06/08(金) 12:53:25
解決する事が出来ました。
とりあえずプロジェクトのプロパティの文字設定をUnicodeから設定なしに変更しました。
その後、SetCurrentDirectory((LPCWSTR)"c:\\JAVA");をSetCurrentDirectory("c:\\JAVA");
に変更し、system("dir")をしたところ、JAVAディレクトリが表示されました。
それを確かめた上で、system("java HelloWorld");を行ったら無事実行する事が出来ました。
原因がよく理解出来ないのですが、とりあえず動作できたのでいいのかな・・・。
ありがとうございました。
0225デフォルトの名無しさん2007/06/08(金) 13:32:56
SetCurrentDirectory(_T("c:\\JAVA")) なら、unicodeでも設定無しでも動くよ
エラーが出るからってとりあえずキャストすんのはやめとけ
0226デフォルトの名無しさん2007/06/08(金) 13:42:37
あともう一つ。
system("java c:/java/HelloWordl");
これだけど、
system("java -classpath c:/java HelloWordl");

これなら動くんじゃないか?
HelloWordl の綴りが気になるが
02271782007/06/08(金) 13:54:53
>>225
丁寧にありがとうございます。キャストはあまりしないほうがいいみたいですね。
現在はchar型の変数にパスを入れて、SetCurrentDirectory(dirPass);のようにしているのですが、
やはりそれだと動作が微妙です。引数はcharじゃなくてLPCTSTR(?)じゃないといけないのかな
とか思いつつ奮闘しています。

>>226
一応-classpath(-cp)も使って実行してみたのですが、確か出来なかったです。
HelloWorldの綴りが>>211で間違ってるのにも実は気付いていて、ちゃんと綴りを直して実行しました。
0228デフォルトの名無しさん2007/06/08(金) 13:56:31
>>227
classpath の指定と HelloWordl の間にはスペースがあるんだけどわかってる?
0229デフォルトの名無しさん2007/06/08(金) 14:00:32
日本にもう一人いるのか、本人なのか。

http://www.google.co.jp/search?q=hellowordl&lr=lang_ja
02301782007/06/08(金) 14:04:28
>>228
あ、大丈夫です。ちゃんと半角スペース入れています。

あと、どうやら>>227のSetCurrentDirectory()は引数の型とかの問題じゃなかったです。
むしろ何も問題は起きてませんでした・・・(´・ω・`)
どうやらstrncat(dirPass, &argv[0][0], point);を実行した後にsystemコマンドが使えないです。
system("dir");を実行しただけでエラーが・・・。
0231デフォルトの名無しさん2007/06/08(金) 14:10:49
>>230
ちゃんとコピペしてやってみたのかよ
そもそも、これがおかしいんだよ→ c:/java/HelloWordl
ここはファイルを指定するんじゃなくてクラス名を指定するの
パス名がクラスの階層を表してはいるけどな

>system("dir");を実行しただけでエラーが・・・。
ふーん
02321782007/06/08(金) 14:18:29
>>231
ちゃんとコピペしてやりました。HelloWorldがクラス名なのも理解しています。
0233デフォルトの名無しさん2007/06/08(金) 14:32:47
わかった。もうキミには言うことは無い
うちでは動いてるけど、君のトコでは動かないんだね
0234デフォルトの名無しさん2007/06/08(金) 14:44:31
>>230
どこか壊してるんでしょう。
dirPassはちゃんと文字列を置ける所を指してる?
(argv[0]って自分の名前なんだけど、それで何するんだろ?)
02351782007/06/08(金) 15:16:42
>>233
そういう次元でもないような・・・。

>>234
dirPassをprintfで表示させたらちゃんと目的のものを表示してくれました。
とりあえず手法を変えて、argv[0][point]に\0を入れてstrcpyしてみたらsystem("dir")が正常に動作しました。
一体何だったのでしょう・・・。argv[0]は最終的にはargv[1]に置換する予定ですw
0236デフォルトの名無しさん2007/06/08(金) 15:18:42
>>233の皮肉に気づけよ
0237デフォルトの名無しさん2007/06/08(金) 15:19:58
なんかさ、やろうとしてることがショートカット作る程度でできそうな事な感じなんだが
複数コマンドだとしてもバッチファイルで済むレベルの内容じゃないのか?
無理矢理Cで作ろうとするほうが疑問なんだが・・・
02381782007/06/08(金) 15:30:47
>>236
ヤバイ・・・全然皮肉が伝わってなかったらしいです;;
言われても気付けない俺はバカかもしれない・・・
まぁ、逆に考えれば幸せな人なのかもしれないから良いか(`・ω・´)ふふふ

>>237
やろうとしていることは、D&Dで.javaを渡したらコンパイル、.classを渡したらそれを実行するプログラムです。
もしかしたらもっと簡単で楽な方法があるんですかね・・・。バッチファイルとか分からないので後でググッておきます。
JAVAを昨日から勉強しようと思ったのですが、いちいちコマンドプロンプトでディレクトリ移動したり
javaコマンド打ったりするのが面倒だと思って・・・。↑押せば前のコマンドは出てきますけど、それさえも面倒で・・・。
というか、コマンドプロンプトでコマンド打つのが嫌いなんです;;
そして、今大体プログラムは完成したっぽいです。
0239デフォルトの名無しさん2007/06/08(金) 15:32:32
strncpy()は鬼門。積極的に使う理由がないなら、sprintf()を使え。
0240デフォルトの名無しさん2007/06/08(金) 17:32:11
したのようなプログラムで、今調べている位置を出力するにはどうしたら良いですか?
printf("%d\n", Fd)としたら値が変化しません・・・


struct ffblk Fd;
findfirst("*", &Fd, 55);
do {
printf("%s\n", Fd.ff_name);
}
while(!findnext(&Fd));
0241デフォルトの名無しさん2007/06/08(金) 17:45:49
>>240
何も分からない
0242デフォルトの名無しさん2007/06/08(金) 17:48:57
>>241
再帰を使わずにディレクトリ内のファイルを出力したいのですが
ディレクトリを進めたときに上ディレクトリで何処まで読んだかを記録しておきたいんです
0243デフォルトの名無しさん2007/06/08(金) 17:50:47
A_dir
B_dir
C_dir
というディレクトリがあったとき、B_dirを調べ終わったとき
次にC_dirを検索するにはどのデータを保存しておけば良いんですか??
0244デフォルトの名無しさん2007/06/08(金) 17:59:58
>>243
関数を再帰的に書けば良いじゃん
0245デフォルトの名無しさん2007/06/08(金) 18:05:38
>>244
再帰を使いたくないんです・・・
0246デフォルトの名無しさん2007/06/08(金) 18:07:08
何故?
0247デフォルトの名無しさん2007/06/08(金) 18:09:33
Fdを保存しておけばいい
0248デフォルトの名無しさん2007/06/08(金) 18:10:05
末尾再帰型で書いてからループ化すれば?
ttp://ja.wikipedia.org/wiki/%E6%9C%AB%E5%B0%BE%E5%86%8D%E5%B8%B0
0249デフォルトの名無しさん2007/06/08(金) 18:13:57
>>246 再帰は不安定になるんですよ

>>247 struct ffblk Fd , Fe; としてFe = Fdと記録してみましたがた゛めでした
0250デフォルトの名無しさん2007/06/08(金) 18:19:05
struct ffblk[MAX_DIR_DEPTH];
0251デフォルトの名無しさん2007/06/08(金) 18:19:21
再帰が不安定とは……
0252デフォルトの名無しさん2007/06/08(金) 18:21:44
普通にスタックに積めばいいじゃん。
■ このスレッドは過去ログ倉庫に格納されています