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

C言語なら俺に聞け! Part 115

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/09/26(月) 21:23:57
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

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:49
system() ?
0233デフォルトの名無しさん2005/10/02(日) 00:37:18
>>231
system()
0234デフォルトの名無しさん2005/10/02(日) 00:38:09
system()
02352312005/10/02(日) 00:38:59
>>233
exeファイルのあるディレクトリに移動して、system()と入力するのでしょうか?
()の中に何か入れるのでしょうか?
0236デフォルトの名無しさん2005/10/02(日) 00:40:09
少しは自分で調べたらどうか
0237デフォルトの名無しさん2005/10/02(日) 00:40:50
>>235
お好きなエディタに移動して system(""); と書く
02382312005/10/02(日) 00:47:28
>>237
コマンドプロンプト上で実行する命令がしりたいのですが?
cd や ls などのような命令コマンドを教えてください
0239デフォルトの名無しさん2005/10/02(日) 00:48:36
>>238
>>1
0240デフォルトの名無しさん2005/10/02(日) 00:48:40
>>238
そんなものは無い
0241デフォルトの名無しさん2005/10/02(日) 00:58:45
>>238
system("ls || dir");
とか?
0242デフォルトの名無しさん2005/10/02(日) 01:01:37
もしかしてUnixのpopenの事を言ってるのか?
0243デフォルトの名無しさん2005/10/02(日) 01:04:10
>>221
>それと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
>>243
そんな細かい事考えるの面倒だからC++でtry構文使っちゃダメ?
02452312005/10/02(日) 01:19:07
>>242
はい。すみません。UNIXでの実行コマンドを教えてください。
0246デフォルトの名無しさん2005/10/02(日) 01:20:32
>>243
NULL チェックしてないから不要ジャン。
それを言うなら、普通は malloc で確保する時に使う変数を一時変数にするぜ。
0247デフォルトの名無しさん2005/10/02(日) 01:21:39
>>245
スレ違い
0248デフォルトの名無しさん2005/10/02(日) 01:24:16
質問の意味がわからないのは俺だけ?
0249デフォルトの名無しさん2005/10/02(日) 01:28:57
>>222
 for(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:41
関数ポインタのポインタをtypedefを使わずにどのように定義したらいいんでしょうか?

typedef void(*Func)();
Func* f;

のFunc*をtypedefを使わずに定義したいんです。
0251デフォルトの名無しさん2005/10/02(日) 01:52:10
>>248
俺も分からん
このスレに来てる癖にUnixコマンド聞いてるしな

まぁUnixといってながらMSDOSプロンプトとか言ってる時点でお察しだが
0252デフォルトの名無しさん2005/10/02(日) 01:59:07
>>250
void (**f)();
0253デフォルトの名無しさん2005/10/02(日) 02:41:00
>>249
> これは最初の判定で break; してしまった場合、
> aが指すアドレスが不定になってしまう。
あぁ、そのための b = a; か、って、
a = b = NULL; にすればいいだけか。
0254デフォルトの名無しさん2005/10/02(日) 02:42:07
間違えた。a = b; だ。
0255デフォルトの名無しさん2005/10/02(日) 02:44:21
>>250
見た目優先で

 Func* f;

と書くのは構わないが、基本的には

 Func *f;

だということを頭に入れておく必要がある。
変数名の前に * を入れるとポインタになり、
* を増やすと深くなる。

それを踏まえれば、

 void (**f)();

になることは言うまでも無い。
0256デフォルトの名無しさん2005/10/02(日) 03:58:26
>>245
popenをコンソールアプリで使いたいのだと勝手に考えとくw

DOS環境のpopenならDJGPPのソースから持ってくれば早いんだがそれじゃWindows環境じゃ動か無いな
問題はコンソールをどうやって子プロセスの入出力に対応付けるかだが、
動きそうなのはcygwinのclibのソースから持ってくるって所か?
0257デフォルトの名無しさん2005/10/02(日) 04:10:33
つーか、コンソールアプリにしてパイプで繋げばいいだけだろ
敢えてCから制御する意味が分からん
0258デフォルトの名無しさん2005/10/02(日) 04:49:21
void foo(int n)
{
char s[n];
}

このコードがgcc 3.3.2で問題なく通るんですが、
なんで配列を定義するときの要素数に変数が使えるんですか?
bcc 5.5ではコンパイルエラーになりましたが。
0259デフォルトの名無しさん2005/10/02(日) 05:05:22
>>258
それはC99の仕様
02602582005/10/02(日) 05:16:14
>>259
ttp://ja.wikipedia.org/wiki/C99

解決した。
gccから取り込まれたんだと。
0261デフォルトの名無しさん2005/10/02(日) 07:16:55
>>258
エッ、そんなことできたの!!?
0262デフォルトの名無しさん2005/10/02(日) 07:32:49
環境依存なことをしない限りは、安全のため -ansi -pedantic -Wall でコンパイル。
C99 使いたければ -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:34
Cなのかそれは。
0265デフォルトの名無しさん2005/10/02(日) 10:06:10
C++はダメですか?
0266デフォルトの名無しさん2005/10/02(日) 10:09:43
>>265
【初心者歓迎】C/C++室 Ver.21【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1125743714/l50
0267デフォルトの名無しさん2005/10/02(日) 10:33:28
staticじゃないからだろ
0268デフォルトの名無しさん2005/10/02(日) 11:46:47
#include <stdio.h>
#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
>>268
質問の仕方。
実行結果の例くらい示せ
0270デフォルトの名無しさん2005/10/02(日) 11:59:23
「一番前の文字は」のあとに文字が出るはずなんですが、何もでないんです
0271デフォルトの名無しさん2005/10/02(日) 12:36:00
>>270
どんな文字を入力したか位のことは書くべきだとは思わないもんかねぇ。
まぁ、getche()使っているからスレ違いだな。
0272デフォルトの名無しさん2005/10/02(日) 12:49:40
>>270
「一番前の文字は」が出てるなら
printf("一番前の文字は%c(%x)です",m,m);
とでもしてやり直せ
0273デフォルトの名無しさん2005/10/02(日) 13:29:26
%xとは何型で表示するものなんですか?
>>271
アルファベットを入力してます
0274デフォルトの名無しさん2005/10/02(日) 13:39:57
>>273
man printf

もう来るな、帰れ
0275デフォルトの名無しさん2005/10/02(日) 13:45:12
>>273
%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:39
>>275
ttp://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:01
八ッキングおせーて
0279デフォルトの名無しさん2005/10/02(日) 14:00:25
やだよーん☆
0280デフォルトの名無しさん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
>>242
何を見てそう思ったのかよくわからないけど飛躍しすぎだぞ
0282デフォルトの名無しさん2005/10/02(日) 14:33:39
VS.NETならコードエディタで関数名タイプした時点でMSDNのオフラインドキュメントが辞書引きされて
出てくる
0283デフォルトの名無しさん2005/10/02(日) 15:36:48
>>278
何でもいいからトリッキーなコードを書いてみる遊びに教えるもクソもない
クラックやボランティアと混同しているならそれらとの区別を調べて
自分が興味を持っている分野が世間で何と呼ばれているかを知るといい
そうすれば同好の士が見つけることの能率が上がるだろう
個人的には自己満足のコードを書くだけならいちいち徒党を組む必要はないと考えるが
0284デフォルトの名無しさん2005/10/02(日) 18:42:13
>>281
だって、出力用にgnuplot使いたいと言ったらcsvとか吐き出してそれをグラフ化したいのかな?って思うのが普通じゃん
popenつかえば中間ファイル作らなくてすむから楽かなと思っただけ
0285デフォルトの名無しさん2005/10/02(日) 20:36:05
>>278
まずは、ログインしているところを肩ごしに覗き見るところから始めてみたら。
0286デフォルトの名無しさん2005/10/02(日) 20:40:14
関数化してください。

http://briefcase.yahoo.co.jp/light_blue_8671
問題はいってます。


0287デフォルトの名無しさん2005/10/02(日) 20:48:34
>>286
スレ違い。
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
>>288
あほだな、ソースが欲しいならC言語始めるぞスレで課題にしちゃえばいいんだよ
ちなみに普通4→IVとか、9→IXってするけどそれは良いの?
0290デフォルトの名無しさん2005/10/02(日) 21:02:53
そんなスレあったのか・・・。
4とかはIIIIでいいはず。めんどくさいから5→Vってのすら無いし。
0291デフォルトの名無しさん2005/10/03(月) 00:33:00
stat でファイルのアクセス権を取得したんだがこれをRWX に変換する方法はありませんか?このために関数作るのもな
0292デフォルトの名無しさん2005/10/03(月) 01:27:50
>>291
>使用している開発環境のスレへGo! (←ここ注目)
0293デフォルトの名無しさん2005/10/03(月) 01:37:33
>>292
さんくす
環境はLinuxなんですがUNIXスレに移動した方がいいってことか。
0294デフォルトの名無しさん2005/10/03(月) 18:01:39
>494<---前スレです!
>scanfを暴走させるのはスキル不足
>getsを使うのは知識不足
>strtokでハマルのは理解力不足
>よって、馬鹿はscanf, gets, strtokは使わない方が良い。

9月の話に戻っちゃうけど…
scanfは分かります。改行がバッファに残って
悪戯しますよね。
getsやstrtokのどこに不具合があるのか?
教えて下さい。
0295デフォルトの名無しさん2005/10/03(月) 18:05:22
>>294
そんな質問は>>1を読んでからでもいいんじゃないか?
0296デフォルトの名無しさん2005/10/03(月) 18:14:45
>>294
http://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
>295
少なくとも、K&Rには書いてない。
0298デフォルトの名無しさん2005/10/03(月) 18:31:38
少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。
少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。
0299デフォルトの名無しさん2005/10/03(月) 18:38:07
最後に_sをつけたら解決
MS信者でよかったね、報われたね
0300デフォルトの名無しさん2005/10/03(月) 19:16:14
>>297はK&Rにダメと書かれてなければ全ていいと思ってる馬鹿
0301デフォルトの名無しさん2005/10/03(月) 19:43:19
>>297
http://www.kouno.jp/home/c_faq/c12.html#23

C FAQの12章23を200回読め
0302デフォルトの名無しさん2005/10/03(月) 20:15:31
strcpy((db[i+1]=(char*)malloc(128)),dv_key[2]);
これなにやってるかわかりますか?
おしえてください。
0303デフォルトの名無しさん2005/10/03(月) 20:17:09
>>302
dv_key[2]の内容を、新たに割り当てた128バイトの領域にコピーしている
0304デフォルトの名無しさん2005/10/03(月) 20:24:12
>>302
db[i+1] = (char*)malloc(128);
strcpy(db[i+1], dv_key[2]);
と分ければ分かるかね?
0305デフォルトの名無しさん2005/10/03(月) 20:27:14
>>302
malloc() に成功するかどうかも分からないのに馬鹿なことするなあ。
strcpy() にしても、何文字コピーするか指定できないのによく使うよなあ。
僕はstrcpyはバイト数も指定してコピーするけど、無駄ですか?
0306デフォルトの名無しさん2005/10/03(月) 20:40:11
>>305
strncpyならともかく、strcpyじゃコンパイル通らないでしょ。
0307デフォルトの名無しさん2005/10/03(月) 21:04:59
>>305
その「バイト数」とやらが簡単に変更可能ならOK
0308デフォルトの名無しさん2005/10/03(月) 21:43:43
おれは、D言語にする。
すばらしきD言語
0309デフォルトの名無しさん2005/10/03(月) 21:52:25
>>303
ありがとうございます!
何をやっているかはわかりました。
そこでもう1つ質問です。そうしてわざわざdb[i+1]=(char*)malloc(128)
としているのですか?db[i+1]だけではだめなのでしょうか?
理由を教えていただけませんか?
0310デフォルトの名無しさん2005/10/03(月) 21:53:19
>>296
strtokの方のバグには、区切り文字が連続する状況では使えないってのが書いてないな
0311デフォルトの名無しさん2005/10/03(月) 23:06:03
>>309
mallocはメモリ領域を確保する。
それを行っているということは元のdb[i + 1]は適切なメモリ領域を指しているものでないということだろう。
だからmallocを呼んで領域を割り当てておかないとメモリのどこかわけわからない場所へ書き込もうとすることになる。
0312デフォルトの名無しさん2005/10/03(月) 23:33:20
>>310
それはバグというよりも仕様では
もっとも連続する区切り文字を一つの区切りとみなしたいケースって
空白文字を区切りとして使う場合ぐらいだけどな
0313デフォルトの名無しさん2005/10/04(火) 00:17:54
電話に電話以上の機能を求める図々しさ・・・トホホ者の天才的資質
0314デフォルトの名無しさん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
StretchBlt
これ以上はスレ違いなので
http://pc8.2ch.net/test/read.cgi/tech/1125850096/
で聞け
0316デフォルトの名無しさん2005/10/04(火) 00:24:39
>>314
XFORM
0317デフォルトの名無しさん2005/10/04(火) 00:35:48
>>315 >>314
どうもすいません。一応モジュールなどは使わないで配列などの工夫だけで出来るから
と言うことだったのでRGBなど気にしないで、配列の中身を一個おきに取り出す方法などをお聞きしたかったもので。
パズルみたいにひらめきと言われたのですが躓いてしまったもので。
0318デフォルトの名無しさん2005/10/04(火) 00:46:08
これで満足か?

1/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
>>318
どうもありがとうございます。
答えを見てやり方を考えるとこうすれば良かったんだと思うのですが、なかなか自分では
うまく形に出来ないんで。こうすればいいなどの方向は漠然と思いつくのですが、汎用性を持たないなどの
きれいなソースがかけないので、もっと試していくようにします。
ありがとうございました。
0320デフォルトの名無しさん2005/10/04(火) 06:38:09
biHeight ってことは BMP 形式か? 8bit形式は却って難しいぞ
^^
0321デフォルトの名無しさん2005/10/04(火) 10:33:15
プログラムがしたいんですけど、CとC++ならどちらを勉強した方がいいですか?
0322デフォルトの名無しさん2005/10/04(火) 10:41:40
>>314
どうして、まずビットマップのファイル形式から調査しないのか、理解に苦しむ。
0323デフォルトの名無しさん2005/10/04(火) 10:47:03
C++
0324デフォルトの名無しさん2005/10/04(火) 10:52:55
>>321
やりたい方
細かい長所短所よりやる気が最重要
ちなみに C と C++ は可能なことと不可能なことが同じだ
0325デフォルトの名無しさん2005/10/04(火) 12:11:50
>>324
それは流石に言いすぎだろ。

>>321
「プログラムがしたい」が具体的に何をさすのか知らんが、
単にプログラミングを齧ってみたいだけならVBAでもやっとけ。
0326デフォルトの名無しさん2005/10/04(火) 12:34:13
c++
0327デフォルトの名無しさん2005/10/04(火) 12:43:01
>>321, >>322-326
他所でやれ。
0328デフォルトの名無しさん2005/10/04(火) 12:45:03
>>321
コンパイラその他、準備だけは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したらその引っ張ってきたファイルの方がカレントになる。
■ このスレッドは過去ログ倉庫に格納されています