C言語なら俺に聞け! Part 115
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/09/26(月) 21:23:57質問する前には最低限検索を。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレッド
C言語なら俺に聞け! Part 114
http://pc8.2ch.net/test/read.cgi/tech/1126884418/
0232デフォルトの名無しさん
2005/10/02(日) 00:36:490233デフォルトの名無しさん
2005/10/02(日) 00:37:18system()
0234デフォルトの名無しさん
2005/10/02(日) 00:38:090235231
2005/10/02(日) 00:38:59exeファイルのあるディレクトリに移動して、system()と入力するのでしょうか?
()の中に何か入れるのでしょうか?
0236デフォルトの名無しさん
2005/10/02(日) 00:40:090237デフォルトの名無しさん
2005/10/02(日) 00:40:50お好きなエディタに移動して system(""); と書く
0238231
2005/10/02(日) 00:47:28コマンドプロンプト上で実行する命令がしりたいのですが?
cd や ls などのような命令コマンドを教えてください
0239デフォルトの名無しさん
2005/10/02(日) 00:48:36>>1
0240デフォルトの名無しさん
2005/10/02(日) 00:48:40そんなものは無い
0241デフォルトの名無しさん
2005/10/02(日) 00:58:45system("ls || dir");
とか?
0242デフォルトの名無しさん
2005/10/02(日) 01:01:370243デフォルトの名無しさん
2005/10/02(日) 01:04:10>それと2度目の while の直前で a = b してるけどこれってなんの為にしてるんですか?
>>222
>色々プログラムを書き換えた時に、消し忘れたんじゃないかな?
まず、list型データは線形リストになっている。
aは新規データ操作、リスト全体へのアクセスに使われ、bがデータを保持する。
bは最初NULLを指し、常に最後に取得したデータを指す、
先入れ後出しなデータ構造になっている。
それは理解してるようだが、
a = b; は、aを無駄に初期化せずに次の処理に入る無駄のない処理だ。
その後のループの終了条件はNULLが来ること。
これは、データ件数が0の場合でも、すべてのデータを処理し終えた場合でも
同じ条件でループを抜けることができる効率的な方法だ。
ソースコードでは malloc()に失敗した場合のコードが省かれてるが、
普通はmalloc()に失敗した場合もデータ取得の終了条件になる。
するとaはデータを正しく指さなくなる。
だから確実にデータを保持しているbを代入しなければならない。
データをどの変数が管理するのかをきちんと決めてそれを維持するようにする事が、
錯誤のない、例外が発生しないプログラミングをするために必要だ。
0244デフォルトの名無しさん
2005/10/02(日) 01:11:07そんな細かい事考えるの面倒だからC++でtry構文使っちゃダメ?
0245231
2005/10/02(日) 01:19:07はい。すみません。UNIXでの実行コマンドを教えてください。
0246デフォルトの名無しさん
2005/10/02(日) 01:20:32NULL チェックしてないから不要ジャン。
それを言うなら、普通は malloc で確保する時に使う変数を一時変数にするぜ。
0247デフォルトの名無しさん
2005/10/02(日) 01:21:39スレ違い
0248デフォルトの名無しさん
2005/10/02(日) 01:24:160249デフォルトの名無しさん
2005/10/02(日) 01:28:57for(b = NULL; ; b = a) {
これは最初の判定で break; してしまった場合、
aが指すアドレスが不定になってしまう。
そのままで free() なんかするとメモリを壊してしまう。
メモリ破壊をしないためにあえてサンプルでは free() をしてなかったりして。
>>244
C++知らないけど、tryばっかりで深すぎて全体が流れとして見えなかった。
流れで見るのが間違ってるかもしれない。
小規模のしか作ったことないし。
>>246
while (1) {
if (a == NULL)
これは僕ならこう書く
while ( a ) {
0250デフォルトの名無しさん
2005/10/02(日) 01:36:41typedef void(*Func)();
Func* f;
のFunc*をtypedefを使わずに定義したいんです。
0251デフォルトの名無しさん
2005/10/02(日) 01:52:10俺も分からん
このスレに来てる癖にUnixコマンド聞いてるしな
まぁUnixといってながらMSDOSプロンプトとか言ってる時点でお察しだが
0252デフォルトの名無しさん
2005/10/02(日) 01:59:07void (**f)();
0253デフォルトの名無しさん
2005/10/02(日) 02:41:00> これは最初の判定で break; してしまった場合、
> aが指すアドレスが不定になってしまう。
あぁ、そのための b = a; か、って、
a = b = NULL; にすればいいだけか。
0254デフォルトの名無しさん
2005/10/02(日) 02:42:070255デフォルトの名無しさん
2005/10/02(日) 02:44:21見た目優先で
Func* f;
と書くのは構わないが、基本的には
Func *f;
だということを頭に入れておく必要がある。
変数名の前に * を入れるとポインタになり、
* を増やすと深くなる。
それを踏まえれば、
void (**f)();
になることは言うまでも無い。
0256デフォルトの名無しさん
2005/10/02(日) 03:58:26popenをコンソールアプリで使いたいのだと勝手に考えとくw
DOS環境のpopenならDJGPPのソースから持ってくれば早いんだがそれじゃWindows環境じゃ動か無いな
問題はコンソールをどうやって子プロセスの入出力に対応付けるかだが、
動きそうなのはcygwinのclibのソースから持ってくるって所か?
0257デフォルトの名無しさん
2005/10/02(日) 04:10:33敢えてCから制御する意味が分からん
0258デフォルトの名無しさん
2005/10/02(日) 04:49:21{
char s[n];
}
このコードがgcc 3.3.2で問題なく通るんですが、
なんで配列を定義するときの要素数に変数が使えるんですか?
bcc 5.5ではコンパイルエラーになりましたが。
0259デフォルトの名無しさん
2005/10/02(日) 05:05:22それはC99の仕様
0260258
2005/10/02(日) 05:16:14ttp://ja.wikipedia.org/wiki/C99
解決した。
gccから取り込まれたんだと。
0261デフォルトの名無しさん
2005/10/02(日) 07:16:55エッ、そんなことできたの!!?
0262デフォルトの名無しさん
2005/10/02(日) 07:32:49C99 使いたければ -ansi の代わりに -std=c99 だ。
0263デフォルトの名無しさん
2005/10/02(日) 09:58:35以下のように役の名前を宣言するとクラスメンバーが初期化できないといわれます。
どういうことなんですか?
class Poker{
private:const char *pairName[] = {
"No Pairs",
"One Pair",
"Two Pairs",
"Three of a Kind",
"Straight",
"Flush",
"Full House",
"Four of a Kind",
"Straight Flush",
"Royal Flush",
};
:
:
0264デフォルトの名無しさん
2005/10/02(日) 10:05:340265デフォルトの名無しさん
2005/10/02(日) 10:06:100266デフォルトの名無しさん
2005/10/02(日) 10:09:43【初心者歓迎】C/C++室 Ver.21【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1125743714/l50
0267デフォルトの名無しさん
2005/10/02(日) 10:33:280268デフォルトの名無しさん
2005/10/02(日) 11:46:47#include <conio.h>
int main(void)
{
int cnt;
char m,ch;
m='z';
for (cnt=1;cnt<11;cnt++){
ch = getche();
if (m>ch)m=ch;
printf("\n\n");
}
printf("一番前の文字は%c",m);
return 0;
}
アルファべット順で一番前に来る文字を最後に表示するプログラムを作っているんですが、
独習Cの回答とほとんど同じなのに最後に正しく表示されません。どこがおかしいか教えてください。
0269デフォルトの名無しさん
2005/10/02(日) 11:50:26質問の仕方。
実行結果の例くらい示せ
0270デフォルトの名無しさん
2005/10/02(日) 11:59:230271デフォルトの名無しさん
2005/10/02(日) 12:36:00どんな文字を入力したか位のことは書くべきだとは思わないもんかねぇ。
まぁ、getche()使っているからスレ違いだな。
0272デフォルトの名無しさん
2005/10/02(日) 12:49:40「一番前の文字は」が出てるなら
printf("一番前の文字は%c(%x)です",m,m);
とでもしてやり直せ
0273デフォルトの名無しさん
2005/10/02(日) 13:29:26>>271
アルファベットを入力してます
0274デフォルトの名無しさん
2005/10/02(日) 13:39:57man printf
もう来るな、帰れ
0275デフォルトの名無しさん
2005/10/02(日) 13:45:12%x は16進数で表示するよ。
私が使ってるOS、FreeBSD では、コマンドライン上で jman 3 printf と打つことで、
printf 関数の説明が見れるんだけど、Windows を使ってる人はどこを見ればいいんだろうね。
使っているコンパイラにもよるんだろうけど。
とりあえずこれでも読んでみて。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=printf&dir=jpman-3.1.0%2Fman§=3
0276デフォルトの名無しさん
2005/10/02(日) 13:48:39ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html
printfでぐぐれば一番上にこの和訳されたManpageが出る
ついでにCygwinさえ入れてればmanコマンド使える
0277デフォルトの名無しさん
2005/10/02(日) 13:50:37文字のコードを表示するんですね。
0278デフォルトの名無しさん
2005/10/02(日) 13:51:010279デフォルトの名無しさん
2005/10/02(日) 14:00:250280デフォルトの名無しさん
2005/10/02(日) 14:05:00>>273
WinユーザさんはMSDN見とけばいいんじゃないかな。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_printf.2c_.wprintf.asp
http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_crt_printf_Type_Field_Characters.asp?frame=true
0281デフォルトの名無しさん
2005/10/02(日) 14:20:43何を見てそう思ったのかよくわからないけど飛躍しすぎだぞ
0282デフォルトの名無しさん
2005/10/02(日) 14:33:39出てくる
0283デフォルトの名無しさん
2005/10/02(日) 15:36:48何でもいいからトリッキーなコードを書いてみる遊びに教えるもクソもない
クラックやボランティアと混同しているならそれらとの区別を調べて
自分が興味を持っている分野が世間で何と呼ばれているかを知るといい
そうすれば同好の士が見つけることの能率が上がるだろう
個人的には自己満足のコードを書くだけならいちいち徒党を組む必要はないと考えるが
0284デフォルトの名無しさん
2005/10/02(日) 18:42:13だって、出力用にgnuplot使いたいと言ったらcsvとか吐き出してそれをグラフ化したいのかな?って思うのが普通じゃん
popenつかえば中間ファイル作らなくてすむから楽かなと思っただけ
0285デフォルトの名無しさん
2005/10/02(日) 20:36:05まずは、ログインしているところを肩ごしに覗き見るところから始めてみたら。
0286デフォルトの名無しさん
2005/10/02(日) 20:40:14http://briefcase.yahoo.co.jp/light_blue_8671
問題はいってます。
0287デフォルトの名無しさん
2005/10/02(日) 20:48:34スレ違い。
0288デフォルトの名無しさん
2005/10/02(日) 20:52:28以下の問題を配列を必ず使ってプログラミングしてください。
正整数を入力し、それをローマ数字で表示するプログラムを配列を使って作りなさい。
1000がM, 100がC, 10がX, 1がIであるので、たとえば、123と入力するとCXXIII、1365はMCCCXXXXXXIIIIIと出力できればよい。
<入力例>
Input: 3247
<出力結果>
MMMCCXXXXIIIIIII
Cを始めて2週間ですがわかりません。お願いします。
0289デフォルトの名無しさん
2005/10/02(日) 20:56:55あほだな、ソースが欲しいならC言語始めるぞスレで課題にしちゃえばいいんだよ
ちなみに普通4→IVとか、9→IXってするけどそれは良いの?
0290デフォルトの名無しさん
2005/10/02(日) 21:02:534とかはIIIIでいいはず。めんどくさいから5→Vってのすら無いし。
0291デフォルトの名無しさん
2005/10/03(月) 00:33:000292デフォルトの名無しさん
2005/10/03(月) 01:27:50>使用している開発環境のスレへGo! (←ここ注目)
0293デフォルトの名無しさん
2005/10/03(月) 01:37:33さんくす
環境はLinuxなんですがUNIXスレに移動した方がいいってことか。
0294デフォルトの名無しさん
2005/10/03(月) 18:01:39>scanfを暴走させるのはスキル不足
>getsを使うのは知識不足
>strtokでハマルのは理解力不足
>よって、馬鹿はscanf, gets, strtokは使わない方が良い。
9月の話に戻っちゃうけど…
scanfは分かります。改行がバッファに残って
悪戯しますよね。
getsやstrtokのどこに不具合があるのか?
教えて下さい。
0295デフォルトの名無しさん
2005/10/03(月) 18:05:22そんな質問は>>1を読んでからでもいいんじゃないか?
0296デフォルトの名無しさん
2005/10/03(月) 18:14:45http://www.linux.or.jp/JM/html/LDP_man-pages/man3/gets.3.html
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html
それぞれの「バグ」の部分を100回読め
0297デフォルトの名無しさん
2005/10/03(月) 18:24:04少なくとも、K&Rには書いてない。
0298デフォルトの名無しさん
2005/10/03(月) 18:31:38少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。
0299デフォルトの名無しさん
2005/10/03(月) 18:38:07MS信者でよかったね、報われたね
0300デフォルトの名無しさん
2005/10/03(月) 19:16:140301デフォルトの名無しさん
2005/10/03(月) 19:43:19http://www.kouno.jp/home/c_faq/c12.html#23
C FAQの12章23を200回読め
0302デフォルトの名無しさん
2005/10/03(月) 20:15:31これなにやってるかわかりますか?
おしえてください。
0303デフォルトの名無しさん
2005/10/03(月) 20:17:09dv_key[2]の内容を、新たに割り当てた128バイトの領域にコピーしている
0304デフォルトの名無しさん
2005/10/03(月) 20:24:12db[i+1] = (char*)malloc(128);
strcpy(db[i+1], dv_key[2]);
と分ければ分かるかね?
0305デフォルトの名無しさん
2005/10/03(月) 20:27:14malloc() に成功するかどうかも分からないのに馬鹿なことするなあ。
strcpy() にしても、何文字コピーするか指定できないのによく使うよなあ。
僕はstrcpyはバイト数も指定してコピーするけど、無駄ですか?
0306デフォルトの名無しさん
2005/10/03(月) 20:40:11strncpyならともかく、strcpyじゃコンパイル通らないでしょ。
0307デフォルトの名無しさん
2005/10/03(月) 21:04:59その「バイト数」とやらが簡単に変更可能ならOK
0308デフォルトの名無しさん
2005/10/03(月) 21:43:43すばらしきD言語
0309デフォルトの名無しさん
2005/10/03(月) 21:52:25ありがとうございます!
何をやっているかはわかりました。
そこでもう1つ質問です。そうしてわざわざdb[i+1]=(char*)malloc(128)
としているのですか?db[i+1]だけではだめなのでしょうか?
理由を教えていただけませんか?
0310デフォルトの名無しさん
2005/10/03(月) 21:53:19strtokの方のバグには、区切り文字が連続する状況では使えないってのが書いてないな
0311デフォルトの名無しさん
2005/10/03(月) 23:06:03mallocはメモリ領域を確保する。
それを行っているということは元のdb[i + 1]は適切なメモリ領域を指しているものでないということだろう。
だからmallocを呼んで領域を割り当てておかないとメモリのどこかわけわからない場所へ書き込もうとすることになる。
0312デフォルトの名無しさん
2005/10/03(月) 23:33:20それはバグというよりも仕様では
もっとも連続する区切り文字を一つの区切りとみなしたいケースって
空白文字を区切りとして使う場合ぐらいだけどな
0313デフォルトの名無しさん
2005/10/04(火) 00:17:540314デフォルトの名無しさん
2005/10/04(火) 00:19:39ヘッダーもいじらなきゃいけないのですが、ファイルに書き込むところで。
二次元配列に入れてピクセルデータを1/2縮小なら配列からひとつおきにファイルに書き込んで
2倍拡大なら配列のひとつの値を同じのを2つ連続でファイルに書き込んでいけばいいと思うのですが、
その書き方が解りません。お願いします。
for(i=0; i<biHeight; i++){
for(j=0; j<biWidth; j++){
fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
}
}
0315デフォルトの名無しさん
2005/10/04(火) 00:24:02これ以上はスレ違いなので
http://pc8.2ch.net/test/read.cgi/tech/1125850096/
で聞け
0316デフォルトの名無しさん
2005/10/04(火) 00:24:39XFORM
0317デフォルトの名無しさん
2005/10/04(火) 00:35:48どうもすいません。一応モジュールなどは使わないで配列などの工夫だけで出来るから
と言うことだったのでRGBなど気にしないで、配列の中身を一個おきに取り出す方法などをお聞きしたかったもので。
パズルみたいにひらめきと言われたのですが躓いてしまったもので。
0318デフォルトの名無しさん
2005/10/04(火) 00:46:081/2
for(i=0; i<biHeight; i+=2){
for(j=0; j<biWidth; j+=2){
fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
}
}
2倍
for(i=0; i<biHeight; i++){
for(j=0; j<biWidth; j++){
fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
}
for(j=0; j<biWidth; j++){
fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
}
}
0319デフォルトの名無しさん
2005/10/04(火) 00:57:53どうもありがとうございます。
答えを見てやり方を考えるとこうすれば良かったんだと思うのですが、なかなか自分では
うまく形に出来ないんで。こうすればいいなどの方向は漠然と思いつくのですが、汎用性を持たないなどの
きれいなソースがかけないので、もっと試していくようにします。
ありがとうございました。
0320デフォルトの名無しさん
2005/10/04(火) 06:38:09^^
0321デフォルトの名無しさん
2005/10/04(火) 10:33:150322デフォルトの名無しさん
2005/10/04(火) 10:41:40どうして、まずビットマップのファイル形式から調査しないのか、理解に苦しむ。
0323デフォルトの名無しさん
2005/10/04(火) 10:47:030324デフォルトの名無しさん
2005/10/04(火) 10:52:55やりたい方
細かい長所短所よりやる気が最重要
ちなみに C と C++ は可能なことと不可能なことが同じだ
0325デフォルトの名無しさん
2005/10/04(火) 12:11:50それは流石に言いすぎだろ。
>>321
「プログラムがしたい」が具体的に何をさすのか知らんが、
単にプログラミングを齧ってみたいだけならVBAでもやっとけ。
0326デフォルトの名無しさん
2005/10/04(火) 12:34:130327デフォルトの名無しさん
2005/10/04(火) 12:43:01他所でやれ。
0328デフォルトの名無しさん
2005/10/04(火) 12:45:03コンパイラその他、準備だけはC++のものを用意して、
実際にはC(相当する部分のC++)の勉強をする。
0329デフォルトの名無しさん
2005/10/04(火) 12:49:31アセンブラ
0330デフォルトの名無しさん
2005/10/04(火) 20:52:32下のプログラムを書いたのですが、思った通りに動きませんでした。
普通にダブルクリックして起動すると、test.txt が作成されるのですが、
他のファイルをドラッグドロップして起動すると、test.txt は作成されませんでした。
何が原因なのでしょうか?
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
fp = fopen("test.txt", "w");
fputc('a', fp);
fclose(fp);
return 0;
}
0331デフォルトの名無しさん
2005/10/04(火) 20:56:50要はエクスプローラの仕様。
D&Dしたらその引っ張ってきたファイルの方がカレントになる。
■ このスレッドは過去ログ倉庫に格納されています