1 :
デフォルトの名無しさん :
2008/11/26(水) 22:13:31 BE:236678055-PLT(31170)
ttp://xy.yu.to/ (ここは本来のサイトではないが)
この荒れまくりカオス絵チャのminiっていう部屋の
秘密スペース(枠外)への書き込みってどうやれば
できるようになるのか解析して教えろ。
あと、1人の防衛プログラマーのクリアツールが強すぎて、
荒しプログラマーがことごとく全員返り討ちになってるから
オマエラが面白くしてみろ。
ゲハハハごめんね
3 :
デフォルトの名無しさん :2008/11/27(木) 00:47:51
コマンドライン引数の使い方がいまいちよくわかりません。 int main(int argc, int *argv[]) とした時、プログラムを実行して何かを入力するにはどうすればよいですか。
5 の倍数であり、かつ100 の倍数でない。 どう表記すればいいですか?
(a%5==0 && a%100!=0)
ごめん もう一つ ・5の倍数であり、かつ100 の倍数でない。 ・500 の倍数である。
>>7 その二つをどうつなげて一つにすればいいの?
if(a[i] % 5 == 0 && a[i] % 100 != 0) この式に500 の倍数を追加するの
>・5の倍数であり、かつ100 の倍数でない。 或いは >・500 の倍数である。 なにか % 5 == 0 && なにか % 100 != 0 || なにか % 500 == 0 20世紀と21世紀の閏年判定なら、 year > 1900 && year < 2100 && year % 4 == 0
>>3 一般的な例を挙げれば、コマンドラインから
% exename param1 param2
のように入力して実行ファイルexenameを呼び出したら、
argcは3で、argv[0]、argv[1]、argv[2]はそれぞれ
"exename"、"param1"、"param2"という文字列を指す
(ただしexenameはもしかしたら存在しないかもしれない)
一応言っておくとこれはプログラムを実行するときにコマンドを与えるだけで
実行してから入力しているわけではない
与えたコマンドをどう解釈して何をやるかはプログラムの用途による
まずは何をやりたいのかを決めること
>12 そういう甘やかしかたはいくない
こっちで粘着されたら困るからちゃんと宿題スレに誘導しないと
質問です #include <stdio.h> int main() { char s; printf("入力=?"); scanf("%c", &s); /*@*/ } 上記の@の後に、ある条件A〜Cを与えて 結果がCになるまで@に戻る、と言うプログラムを作成したいのですが、 @の後にはどのように続ければよいのでしょうか? 簡単に流れを教えていただければうれしいです。
do{ @ A B }while(Cが成立しない場合繰り返す);
19 :
デフォルトの名無しさん :2008/11/27(木) 15:56:07
AとBも条件だと書いてあるがCとの関係(AND/ORなど)が書かれていないので答えようがない 条件Aと条件Bを評価だけ行って結果を無視し、条件Cの結果だけで判定するなら do { @; } while(A, B, !(C));
>>19 > AとBも条件だと書いて
ないよ。与えて、だよ?whileで繰り返すかどうかを決定付けるのは
Cが成立するかどうか。
22 :
デフォルトの名無しさん :2008/11/27(木) 16:04:34
>>20 少なくとも条件Aは文中にあるぞ
つーか、おまえ本人なら人のせいにしないで訂正しろよ
最初の質問文があいまいなんだよ
24 :
17 :2008/11/27(木) 16:15:22
>>18 ありがとうございます。早速試してみたいと思います
>>19 @に何か文字を打って、AorBを評価をするプログラムにしたいのですが、
「AorBならば@に戻り、Cになったらループを終了する」
と言う感じで作成したいと思っています。
Aならば正解
Bならば不正解
Cに合致した時にループを終了させると言う感じです
初心者なので、何言ってるか分からないかもしれませんが、何かアドバイスがあればお願いします。
do{ @ if(A||B)continue; while(!C);
おっとwhileの前の}が抜けた
do{ @; if(A)printf("正解"); else if(B)printf("不正解"); }while(!C);
>>24 処理の流れ+どういう時に何をやるかは整理をつけるクセをとけよう
漠然と提示されると答えようがないしね
>@に何か文字を打って、AorBを評価をするプログラムにしたいのですが、
>「AorBならば@に戻り、Cになったらループを終了する」
>と言う感じ
こう書いてもらえると、こちらも答えやすいし
そちらも思考の何処で詰まっているかが限定しやすいし
29 :
デフォルトの名無しさん :2008/11/27(木) 16:28:36
>>24 > 「AorBならば@に戻り、Cになったらループを終了する」
言い換えると「AorBならば@に戻り、Cでなければ@に戻る」だな?
30 :
17 :2008/11/27(木) 16:42:58
>>28 ご指摘ありがとうございます。以後気をつけます。
>>29 その通りです。未熟で申し訳ありませんでした…
31 :
デフォルトの名無しさん :2008/11/27(木) 18:21:12
RedHatLinux9にGCCがインストール出来ない件です。 インストールが出来なかったです。 エラーが出てしまいます。 内容を以下にコピペします。 [root@ RPMS]# rpm -ivh gcc-3.2.2-5.i386.rpm 警告: gcc-3.2.2-5.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e エラー: Failed dependencies: binutils >= 2.12.90.0.7-1 is needed by gcc-3.2.2-5 glibc-devel >= 2.2.90-12 is needed by gcc-3.2.2-5 [root@ RPMS]# これは何を警告しているのでしょうか?
32 :
:2008/11/27(木) 18:24:37
binutilsのバージョン2.12.90.0.7-1以上が必要 glibc-develも同じく2.2.90-12以上が必要 "needed by"くらい厨房でも理解できるだろ
33 :
314、31 :2008/11/27(木) 18:55:37
>>32 アドバイス有難うございます。2つのファイルを探してみます。
ホントにgccないのかな? updatedb を実行し(少し時間かかる)、 locate gcc | less でそれっぽいのないか探してみたら? もしくは find / -name gcc -print でも可。
RHLだから事実だろう
下の宣言に対してコンパイルで警告が出るんですが 「`a[0]' の初期化は不完全です」 「初期化子のまわりのブレースを欠いています」 この警告文どうすれば消えるのでしょうか? int a[5][5]={ 8,4,3,6,6, 1,6,5,8,4, 5,4,9,1,2, 6,9,6,1,8, 7,4,1,3,5, };
int a[5][5]={ 8,4,3,6,6, 1,6,5,8,4, 5,4,9,1,2, 6,9,6,1,8, 7,4,1,3,5, };
int a[5][5]={ {8,4,3,6,6}, {1,6,5,8,4}, {5,4,9,1,2}, {6,9,6,1,8}, {7,4,1,3,5}};
>>40 上手くいきました
回答、ありがとうございました。
3行3列の行列を1オリジンにしてそいつを表示させたいんだけど、まったくうまくいかない 誰か教えてください
1オリジンてなんですか?
>43 ぐぐれ まあ>42の言ってることは意味わからんが
a[3]って配列を宣言した時普通ならa[0], a[1], a[2]ってなるのが0オリジン 数学とかで使う普通の配列が1オリジンでa[1], a[2], a[3]ってなるやつです
1 2 3 1 9 3 1 2 6 4 8 3 1 5 5 こんな感じだとエスパーしてみた。
>>45 #include <stdio.h>
int main(void)
{
float a[3][3]={{1.0,2.0,3.0},{4.0,5.0,6.0},{7.0,8.0,9.0}};
int i, j;
float *mp;
mp = &a[0]-1;
for(i=1; i<=3; i++){
for(j=1; j<=3; j++){
printf("mp[%d][%d]=%d ", i, j, mp[i][j]);
}
printf("\n");
}
return 0;
}
あと行を1オリジンにするだけだと思うのだけど……まったくわからない
>>48 #define ORIGIN1(matrix, row, col) matrix[row-1][col-1]
floatを%dで吐くな
mpの型が違う。それと、得る物が少ないからお勧めしない。 Cだとサイズを変えられないし、C++ならなんでもありだからね。
>>46 根本的に勘違いしているようだが、Cは0オリジンであって、1オリジンの添字を使うことはできない。
単に表示を1オリジンにしたいだけなら添字に1加えること。
>>48 言語には言語の流儀ってものがあるからバカなこと考えずに0オリジンでやれ
1オリジンと言うと Numerical Recipes in C を思い出すな。 FORTRAN 用の本を C 用にしたものだから 1オリジンで強引にやってた気がする。 しかもいくつかバグが・・・。 まあ内部的に0オリジンで扱って、 表示する時は必要に応じて1オリジンで表示する、 ってのがC的だな。
55 :
デフォルトの名無しさん :2008/11/27(木) 23:08:05
恣意的
56 :
初心者 :2008/11/27(木) 23:14:42
C++初心者です。 現在、独習C++で勉強しています。 中級者向けの本、お勧めの本などありましたら 教えていただければ幸いです。
>>49 加減算より優先順位の低い演算子等が入ってくるとおかしくなるぞ。
((matrix)[(row)-1][(col)-1])
にしとけ。
C言語を利用してモデリングの勉強したいのでつが 何かいい本ないですかね?8月に出たロボコンの本とかどうなのかな?
実行しててエラーでたら音ならして教えてくれるシステムとかないの?
main()から0以外を返すだけでご丁寧にエラーダイアログを出してくれる環境もあるよ。
実行時のエラーまで面倒見てくれる人はいません。
assertマクロをひたすら仕込むとか エラー処理で\a出力するようにするとか
そういうのじゃなくて。 実行時間長いプログラムだと、結構実行時間中暇で、おおまかなところでしか 表示させないから、画面みないこと多いんだよね。 画面をみるのがめんどくさいというか。
ログ出力を付ければ?
\aでプッっていってくれるじゃん
CDトレイ飛び出させれば?
CPUに負荷かけてファンを回せば
69 :
デフォルトの名無しさん :2008/11/28(金) 20:17:30
>>64 strong_beep(); とか関数作ることで処理系依存部分を分離しといて、あとはサイレンなり爆竹なり何でも使えばええやん
いつまでも「処理系非依存」の殻に閉じこもってると、結局何も実現できない口だけ PG になっちまうぞ
がんばればビープだけで声を再生することだってできるんだぜ・・・。 魔道物語とかを参照。
さすがにもう無理だろw
別に時代が関係することでもないだろ・・・。
73 :
デフォルトの名無しさん :2008/11/28(金) 22:31:39
char *p=malloc(sizeof(wchar_t)*12); *pにint型の整数値を代入したいのですが、やり方がわかりません。
>>73 *(int*)p = 9999; とかでよさそうだけど、sizeof(wchar_t)*12 との関連がわからん。
やりたいことは実はsprintf(p, "%d", 9999)とかだったりして。
自分はJavaやC#でWebアプリ開発やってきた人間なんですが、C言語も 勉強しようと思って、先日までK&Rを読んでました。 具体的な実例でちょっと活用してみたいな、と思うんですけど面白いもの ありますでしょうか。自分は上記のようにJavaのWebアプリ出身なので、ライブラリ 組み合わせてプラモデルみたいにアプリ作ってきた人間です。C言語 ならではの、低レベルな部分から何かを作る、というのをやってみたいのですが。
2進数と10進数の相互変換
79 :
77 :2008/11/29(土) 12:17:38
>>78 あはは。いや、アルゴリズムの練習というよりは、チュートリアル形式で
手を動かしていくと、ネットワークツールが出来上がる、とか、そういう
のありませんですかね。
組み込みとかも興味あるので、そっち方面でもいいんですけど。
WindowsでncursesをCygwin無しで使う方法がないか聞いた者です 前スレ992 PDCursesについては正直食わず嫌いしています 実際に使ったことはありません
>>79 何を求めているのかよくわからない
書籍のことなら書籍スレで聞け
>>79 ネットワークツールじゃないが、
コンピュータ対人間の双方向ヒットアンドブロー数あてゲームなんてどうよ?
質問です。 typedef struct{ int a; int b; char c; } DATA_STRUCT; DATA_STRUCT data[100] = { {10, 20, 'A'}, {15, 30, 'D'}, ・ ・ ・ }; と100個の構造体データを宣言します。 その100個の中から0〜100個のデータのアドレスをstaticで保存しておきたい場合、 static STRUCT_DATA *data_save[100]; と宣言し、data_save[i]に保存していけばいいでしょうか?
*じゃコピーしたことにならないのでは?
85 :
83 :2008/11/29(土) 15:25:29
すみません、コピーはこんな感じです。 STRUCT *p = &data[0]; i = 0; while( p->a がある値になるまで ){ data_save[i] = p; i++; p++; }
それだとdataの内容が変わったら、data_saveの内容も変わるんじゃないの?
87 :
83 :2008/11/29(土) 15:38:38
dataは変更のないテーブルなので、constと思って下さい。 ・変更できないテーブルから何個かデータを取り出したい ・データをそのまま保存するのは容量がもったいないので、アドレスだけ保存 このような意図で考えています
saveって名前が誤解されちゃうね。何やりたいのか、ようわからん。
このif文はどういう意味なんでしょうか? if (strlen(str1) == 10 && str1[9] != '\n') { while (getchar() != '\n'); }
>>89 str1 の長さが10で、かつ str1 の最後の文字が改行で無い場合。
おそらく str1 を fgets とかで読み込んで、もし入力が想定したサイズより大きかったら、次の改行まで読み飛ばしている。
92 :
83 :2008/11/29(土) 16:17:28
拙い説明ですみません。 100個のテーブルから Aさんが使いたいデータはメンバのcが'A' Bさんが使いたいデータはメンバのcが'B'という感じで決まっています。 Aさんが操作を行っている時は、 for( i=0 ; i<100 ; i++ ){ data[i].c == 'A'; } という処理をして、毎回検索するのは面倒なので、 Aさんが操作している時はAさん用のデータを抽出し、そこを検索 Bさんが操作している時はBさん用のデータを抽出し、そこを検索 と考えています。
面倒って言葉は機械にはないよ。
質問の答えをいうなら それで問題ないです
>>77 前にもいっていたらごめんなさい。
UNIXネットワークプログラミング入門 /雪田 修一/技術評論社 2003/ISBN-10: 4774117544
前身はこの手の入門書の草分けでした。
int a[10]; int *p = &a[5]; このように宣言して、p++やp--でポインタを操作する場合 どこまで++や--できるか、一般的にはどういった書き方をするのでしょうか?
>>96 pはaより小さくなってはいけないし、a+10より大きくなってはいけない。
それをどうコーディングするかは、実装次第。
>>97 a + 10 はOKでしたっけ。いや、参照しなければなんでもOKでしたっけ。
えーと、クイックソートなどで真ん中を取る、という演算を p = (a + b) / 2 として許してもらえるかどうかの話です。
>>98 デリファレンスしない場合に限り、a+10はOK。
逆に言えば、 p = a + 10して* pしたらアウト。
bが>97の要件を満たしているなら、p = (a + b) / 2は問題ない。
>>98 a,b が共にポインタならばコンパイラに怒られる
例えばaが5で p = a+10するのはOK その時に*pするのはNG ということはわかりましたが、 pがa[9]を越えていないかどうかは、どう判断するのでしょうか? アドレスの大小じゃわかりませんよね・・・
>>98 > 真ん中を取る
ポインタ同士足すのは怒られたかと。
p = a + (abs(b - a) / 2);
かな。
>>101 > アドレスの大小
で、いけるはずだが。
あと
>>102 間違えた。absいらんわ。
p = a + ((b - a) / 2);
で。
アドレスの大小でいけるのですか!? それでしたら p + 10以上 とか p - 10以上 の場合 if( p < &a[0] ){ p = &a[0]; } if( p > &a[9] ){ p = &a[9]; } こんな感じで頭とお尻は守られるのでしょうか?
もう配列で処理したら?
>>100 ,
>>102 ,
>>103 いつからそんな阿呆な制限がつくようになったんでしょうね。彼らはプログラミングの経験が浅かったのではないでしょうかね。
横から質問して悪いんだけどオーバーフローしないの?
>>106 ポインタ+ポインタ
これがどんな型になるのが妥当だと考えているの?
そんなことを疑問に思ってネットでいちいち質問してるより、 ふつーに入門書を頭から読んでいったほうが効率いいんじゃね? って、思うような質問ってよく見るよな。
>>101 a が 5 で、というのはちょっと意味がわかりません。それはともかく、
static char buff[100]
で、p が buff の中を指しているかどうかをみるのに、
p >= buff && p < buff + 100
とするのはありだと思います。これがわかりにくければ、p は値としてアドレスをとると考えて、べたに
p >= &buff[0] && p < &buff[100]
と書いてなんら差し支えはありません。
char buf[100]; で &buf[100] って大丈夫なの? まあ、ほとんどの環境で問題なく動くだろうけど。
>>111 ポインタ同士の足し算にどんな意味があるんだよ
得られるものは何?
114 :
111 :2008/11/29(土) 20:48:19
>>113 そんなことにことだわるのが変。(a + b) / 2 は非常によくあらわれる手法。
>>114 可能だとしても、そういうときしか使えないような気もするが。
>>112 buff[100] が *(buff + 100) のシンタックスシュガーならば、問題ないかと。
118 :
98 :2008/11/29(土) 20:50:42
>>117 *(buff + 100) ← この時点でだめじゃん。
>>114 型を気にしないならアセンブラをすればいい
C言語にこだわるのが変
>>119 そういういみではそうですね。&buff[100] = &*(buff + 100) という説明はありですか?
>>121 やっぱだめなんじゃね?
char buff[100]; に対してでしょ?
>>120 典型的な用途としてカーネルをCで書く、というかCはもともとそのように生まれてきたのでしょう?そんな記述力の高い C になんで無用な制限を課すのでしょうか?
>>123 ポインタ同士の加算ってふつーにオーバーフローしそうだけど。
>>122 いや、だから &*(buff + 100) とかくと、& と * が相殺されて(参照するコードがうまれることなく) buff + 100 になる、とか。これは文法書をみなくては。
>>124 んーなるほど。値によってはアウトですかね。
ポインタの足し算したがる馬鹿は、足した結果を2で割ったときの振る舞いを定義してみろよ。 char *のときにはなんとかなっても、int *のときに破綻しないように定義することが如何に難しいかわかると思うぞ。 結論:ポインタ同士を足したものの型を適切に定義できない以上、それを整数で割った型も適切に定義できない。 予測される反論に対する自衛。 int *同士を足した型を、「int *同士を足し合わせた特殊な型」と定義すれば2で割った場合の定義も適切にできるかもしれない。 では、3で割ったら? 或いは7で割ったら? つまり、イリーガルケースの対応のためにどんどん後付の仕様を膨らませ続けなければいけなくなってしまう。
>>127 なるほど。アラインメントがくずれるわけですね。
そうだね、int a[SIZE]; int * b = a + SIZE;としたときに(a+b)/2がきちんとa+(b-a)/2と 同じ場所を指す保証をコンパイラにさせるのは、仮にSIZEが奇数だと酷だな。
131 :
98 :2008/11/29(土) 21:06:52
>>129 納得しました。いろいろコメントいただきありがとうございました。
if( p >= &buff[0] && p < &buff[100] ) ↓ if( p >= &buff[0] && p <= &buff[99] ) これだったら問題はないですかね?
>>132 え?そういう制限はないはず。p は参照さえしなければなにをさしてもいいのでは?
訂正。配列が定義された範囲の一つ後ろだけOKだった、だったかな。
>>133 &buff[100] が合法かどうかって話だろ。
そういうこと。p == buf + 100はOKだけどp == &buf[100]は巧くない。
>>132 > if( p >= &buff[0] && p <= &buff[99] )
こう書く方が好き♪
if( &buff[0] <= p && p <= &buff[99] )
流れを切って申し訳ないが質問 ポインタの初期化宣言で通常ポインタは int *p = NULL; ではint型へのポインタ配列は int *p_array[100] = { NULL, NULL, ... ,NULL }; と100個宣言する必要がある?
>>138 int *p_array[100] = { NULL};
ってだけでのこりも全部NULLになる、配列はひとつでも初期化するとのこりは0を代入した場合の値になる
>>139 即レスありがとう。
処理途中でNULLにするには
for(i=0;i<100;i++){
p_array[i] = NULL;
}
とする必要がありますか?
141 :
デフォルトの名無しさん :2008/11/29(土) 21:54:22
>>127 > ポインタの足し算したがる馬鹿
相対アドレス計算なら、アセンブラから始めたおじさん達にとっては普通の発想だよ
結果のアドレスがオーバーフローしないように設計したり、わざとオーバーフローさせたり、そんなのは場合によりけり
相対アドレスの相対の部分なら、Cのポインタと整数の演算の整数部分だけど、ポインタ同士の足し算って、 イメージ的には、インデックスレジスタどうしの加算みたいな感じ。
143 :
デフォルトの名無しさん :2008/11/29(土) 22:06:15
Cでウィンドウの作成ってできるの?
144 :
98 :2008/11/29(土) 22:06:37
>>141 まあ 8086 の near ポインタならOKですね。というか、私はその口。
でも、dos のソースが他の環境でも使えるのなら、そのほうがうれしいものです。
145 :
デフォルトの名無しさん :2008/11/29(土) 22:08:03
>>143 Win32API なら C が標準
アセンブラや C++ でも使えるけどね
いや、ニアポインタだって、状況は同じじゃ?
>>140 そうです。
変数の初期値の話は、言語の話というよりは、特定の環境(dos だの elf だの)の実行ファイルの形式などを念頭に置いたほうが理解しやすいと思います。
148 :
98 :2008/11/29(土) 22:10:37
>>146 ああ、そうですね。
なんだか今日は調子悪いですね。
#define ABCD 1 #define AB 2 #define CD 3 としたら、これらは別々のものとして判別できますか?
>>150 できます。マクロ AB CD ABCD はべつものです。
152 :
150 :2008/11/29(土) 22:20:29
どうもありがとうございます。
153 :
デフォルトの名無しさん :2008/11/29(土) 23:20:08
154 :
デフォルトの名無しさん :2008/11/29(土) 23:24:20
『ガウス ザイデル法』 を用いて最低4元以上の一次連立方程式をとけ 自分で作ったのは以下のようなプログラムなのですが, 間違いやアドバイス等があったらいただけないでしょうか? (ピボット選択あり) よろしくお願いします. ---------------------------------------------------------------------------------------- #include<stdio.h> #include<math.h> #define NN 5 #define EPS 1.0e-5 void gauss(double a[NN][NN], double x[NN], double b[NN], int n){ int i, j, k, l; double p, q, s; double error, aa; int d; double g, h, w; for(k=1; k<=n-1; ++k){ d = k; g = fabs(a[k][k]); for(i=k+1; i<=n; ++i){ h = fabs(a[i][k]); if(h > g){ d = i; g = h;}} for(j=k; j<=n; ++j){ w = a[k][j]; a[k][j]=a[d][j]; a[d][j]=w;} w = b[k]; b[k]=b[d]; b[d]=w; つづく
155 :
デフォルトの名無しさん :2008/11/29(土) 23:25:27
つづき for(i = 1 ; i <= n; i++) x[i] = 0.0;} for(i = 1 ; i <n; i++){ error = 0; for(j = 1; j <= n; j++) { aa = b[j]; for(k = 1; k <= n; k++) if(k != j) aa-= a[j][k] * x[k]; aa/= a[j][j]; error+= fabs(aa - x[j]); x[j] = aa;} if(error < EPS) break; }} int main(void){ int i, j, n; double a[NN][NN], x[NN], b[NN]; printf("n="); scanf("%d",&n); for(i=1; i<=n; ++i){ for(j=1; j<=n; ++j){ printf("a[%d][%d]=",i,j); scanf("%lf",&a[i][j]);} printf("b[%d]=",i); scanf("%lf",&b[i]);} gauss(a, x, b, n); printf("\n---ガウス・ザイデル法による計算結果mx--------\n\n"); for(i=1; i<=n; i++) { printf(" x[%d] = %lf\n", i , x[i]);} return(0);}
>>153 sjis を iconv とかで euc-jp にした後に普通にURLエンコードすれば?
158 :
デフォルトの名無しさん :2008/11/29(土) 23:50:19
159 :
デフォルトの名無しさん :2008/11/30(日) 01:10:36
>>154 ですがスレチ気味なので宿題スレに質問し直させていただきました
お騒がせ致しまして申し訳ございませんでした
160 :
デフォルトの名無しさん :2008/11/30(日) 02:42:27
何故コードを最適化するのですか?
161 :
デフォルトの名無しさん :2008/11/30(日) 03:05:35
ソートするプログラムを作ろうとしたのですが出来ません。どこがおかしいのでしょうか? ---------------------------------------------------------------------------- #include <stdio.h> void swap(int a,int b); int main(void) { int x[5]={32,57,21,43,19}; int i=0; int j; while(i<=3) { j=i+1; while(j<=4) { swap(x[i],x[j]); j++; } i++; } for(i=0;i<5;i++) { printf("%d\n",x[i]); } return 0; } つづく
162 :
デフォルトの名無しさん :2008/11/30(日) 03:07:20
つづき void swap(int a,int b) { int temp; if(a>b) { temp=a; a=b; b=temp; } }
値渡しだからswapされてないんじゃないの swapの部分を別関数にしないか swap関数には配列と二つの要素番号を渡すようにしたら
素直にポインタ渡しを勧めてやれよw
#define swap(x,y) { x^=y; y^=x; x^=y; }
まだこんなコードおっさんがいるのか
168 :
77 :2008/11/30(日) 09:57:34
>>95 ありがとうございます!ちょっと見てみます。
>>165 そんな swap(x,x) とやると破綻するようなマクロはやめとけって
>>167 意味不明。そんなことを言ったら、大昔からあるコードからは加齢臭がしてきますね。
C言語なんてかなり前からあるから、今頃どの教本も、加齢臭だらけだw
>>169 確かに、同じ変数同士でやってしまったら、0ですな・・・
そういう場合に使う必要はないだろうけど、別に変数を1つ用意して
やる場合、そんな結果にはならないしね。
「加齢臭」と揶揄された意味もわかってないのか・・
>>171 自分勝手な言葉で理解できないのか、なんていっている奴は
他人とまともにコミュニケーションがとれない引きこもり。
そうやって理解しないものを叩く前に、自分が意味不明な
言葉を使っていることに気づけよ、基地外
173 :
デフォルトの名無しさん :2008/11/30(日) 12:27:45
171 名前:デフォルトの名無しさん 投稿日:2008/11/30(日) 12:15:48 「加齢臭」と揶揄された意味もわかってないのか・・ ↑さすがにこいつ、アホだ・・・揶揄にしても表現がどうかと。 周りが見えていない奴って、本当に迷惑だな。お前こそ臭いソースでも書いてんだろw
そんなコードはどうとか言うにしても、
>>169 みたいに問題点を指摘すべきだろ。
それすらせずに、自分が汚い表現を用いたのを指摘されて、逆に揶揄されたのに
何で分からないんだ・・・みたいなことを言われても、お前の表現がおかしい、
加齢臭がするしないはともかく、本当にそうだと言う人に対して失礼。
いずれもお前も、年をとれば嫌でも自分から漂ってくる臭いだから、せいぜい
臭わない内に思い上がってろ。
175 :
171 :2008/11/30(日) 12:33:15
加齢臭と書いたのは俺じゃないわけだが くやしいのう
176 :
デフォルトの名無しさん :2008/11/30(日) 12:39:32
>>175 お前キモイ、自分の性格が悪いことに気づくべきだよ。
頭の悪い奴ってのは、自分が低レベルだということに気づいていないから困る。
精神レベルも低い。
>>176 お前キモイ、自分の性格が悪いことに気づくべきだよ。
頭の悪い奴ってのは、自分が低レベルだということに気づいていないから困る。
精神レベルも低い。
>>170 配列全体をなめての値交換だと
不意にインデックスが同じところ指すかもしれないからなおさらよろしくない
別変数用意するなら、結局代入操作をそこで記述してもよいわけだしね
個人的には
引数に変化をあたえるようなマクロは好きでない というのはおおげさか?
※ とはいえ va_start() は↑のタイプだってりするけどねw
なんだか「加齢臭」に過剰に反応しているロートル(らしき)が多くて笑える。 挙句、相手の精神レベルがどうこうって自分がなんだと思っているんだろうね。 関数で事が足りることをマクロで実装するなんて今時の技術についていけていないって証明なんだから、 大人しく現場から離れて現場の人間を巧くコントロールするかお茶でも啜ってろって。
>>179 お前キモイ、自分の性格が悪いことに気づくべきだよ。
頭の悪い奴ってのは、自分が低レベルだということに気づいていないから困る。
精神レベルも低い。
ERROR: 低レベルが定義されていません ERROR: 精神レベルが定義されていません
>>181 VtuneかCodeAnalystで解析かけてからもの言え
#if (__STDC_VERSION__ >= 199901L) inline void #else void #endif /* __STDC_VERSION__ >= 199901L */ Swap( void * x, void * y, register size_t size, ) { register char tmp; char * s = (char *)x; char * t = (char *)y; register size_t i; for ( i = 0; i < size; ++i ) { tmp = *(s + i); *(s + i) = *(t + i); *(t + i) = tmp; } } Swap(&a, &b, sizeof(a)); 最近これに近いの書いたなぁ
かなり効率悪いよね。
>>175 ごめんなさい。ごめんなさい。
宿題スレでがんばるので許してください。
188 :
184 :2008/11/30(日) 15:44:08
ごめん、
>>185 は、
>>184 へのレスポンスと仮定するが、
>>185 は、そこまでいうのなら、
>>184 より、効率がよくて汎化なスワップ関数作ってくれ。
因みに、クイックソートのサブルーチンで使っています。
memmove
効率悪いって言うか、書き方が時代錯誤。それに、もし本当に効率(≒速度として)を重視するなら「汎用なんて糞喰らえ」で書くべきだ。
>>188 アーキテクチャにはよるが、普通にテンポラリバッファとってmemmoveすればいいよ。
#define swap(type , x , y) { type tmp=x; x=y; y=tmp; } type : 変数の型を指定
193 :
184 :2008/11/30(日) 18:14:02
>>192 #define swap(x, y) { int tmp=(x); (x)=(y); (y)=tmp; }
ってしたくなりませんか。(なお type について突っ込むつもりはありません。)
>>193 > (2nd ed.)
んーしらなかった。
>>194 xとyが必ずしもint型とは限らないんで、その場で決められる仕様になっているのだが
いちいち突っ込んだり、そうではない、こうだという意見は無駄だよ。
括弧はあったほうがいい。 swap(a=b, c); とか検出できる。
> あったほうがいい ほら、でた、主観。お前は言葉の意味を理解して聞いているのか? ”必要”、必ず要る、その意味が分かってないから、いちいち 鬱陶しい口答えをする性格になったんだろうけど。 逆に問うぞ、”必要”があるなら、その必要性について 客観的な意見で述べよ。
括弧は必要だ 何故ならswap(a=b, c); とか検出できるからだ これでいいの?
意見をすればするほど、自分の意見の欠陥が露呈されていくだろ? 誰もそんなこと聞いてはいないのに、いつの間にか直接的ではないことで 勘違いをしていることを指摘されていると気づかないんだよな。 加齢臭についても、それについて嫌な思いをした人がいるから 反論されているのではなく、表現の汚さや、揶揄にしても あまりにも表現として相手に伝わらないから、突っ込まれているのに。 意見をする以上、それなりの覚悟をしないと、社会じゃやっていけないよ。 下手なことを言えば、立場を悪くするように。
知性に欠陥のあるやつは放っておけよ。
これはwww 釣り釣りw
まだおっさんいるのかよwwww
intと敢えて書き換えて、したくなりませんかとか、typeに対する 注釈を読んでいなかったのか、理解できなかったのか?って思われるだけだぞ。 そうしたいなら、自分がすれば良いだろ?ただ、そのコードは 型を指定して、int型以外でも使えるのに、敢えて限定する意味は? おまけに必要とされない括弧。銅説明するんだ、あんた? 意見する以上、無駄なことを言うと、逆に突っ込まれるぞ。
>>196 いや、だからtypeを問題にしていないし、そう書いたつもりですが、なにか問題でもあるのでしょうか?
>>206 いや、だからtypeを問題にしていないって書いたのですが、それでもあえて文句をつけるのですか?
>>208 いや、だからtypeを問題にしていないって書いたのですが、それでもあえて文句をつけるのですか?
>>207 意図が分散してる type→intの書き換え と マクロ引数の括弧づけ
type を問題にしていないのなら書き換えしなければ マクロ引数の括弧づけ のみのトピックだと明確にわかる
俺個人としては、マクロ引数には括弧をつけるし、
例の swap みたいなのは do { } while(0) で囲みたくなるな
>>210 たしかに、自分の好みに忠実にしたがって type を消しましたが、ことわりは入れておきました。
でも、そんなことにも耐えられない人がいたとは驚きでした。
do { } while (0)
これは if () を { } なしで書く人のためにあるんでしたか。
>>211 > これは if () を { } なしで書く人のためにあるんでしたか。
ちょっと違う
必ず ; を要求するかたちだね。
#define foo() { }
#define bar() do { } while(0)
foo() foo() ←文法的にセーフ { } { } で展開されるだけだし
bar() bar() ←文法的にアウト
はいはい
214 :
デフォルトの名無しさん :2008/11/30(日) 21:49:56
215 :
211 :2008/11/30(日) 21:56:25
>>214 あのう、こんなのは定石なんですが。ググればわかります。
だったら コンマ演算子つかえば?
217 :
211 :2008/11/30(日) 21:57:44
#define swap(x, y) int tmp=(x), (x)=(y), (y)=tmp 攻すれば swap(a,b); も if(1){ swap(a,b); } つかえんじゃね
>>219 #include <stdio.h>
#define swap(x, y) int tmp=(x), (x)=(y), (y)=tmp
int main()
{
int a, b;
a = 1;
b = 2;
swap(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
をcppにくわせたところ、問題の部分は
int main()
{
int a, b;
a = 1, b = 2;
int tmp=(a), (a)=(b), (b)=tmp;
printf("a = %d, b = %d\n", a, b);
return 0;
}
になりました。
221 :
デフォルトの名無しさん :2008/11/30(日) 22:11:48
>>215 なるほど、定石だからうれしいのか
よーくわかったよ
>>219 if(1) swap(a,b);
だめぽ
>>221 定石は大事ですよ。定石もしらないのに回答者側で書くなんて10年はやいんじゃないですか。きえてください。
>>221 宿題スレでお待ちしています。私は「当方の環境は」云々で書いていますので、すぐわかります。叩いてもらって結構。
229 :
デフォルトの名無しさん :2008/11/30(日) 22:19:00
>>224 結局何も自分の言葉で説明できていないのにシッタカこいてんじゃねえよ
またいつものバカか 釣られすぎだ
これなら x や y に副作用があっても大丈夫。 x や y に代入式を入れる事はできなくなるが、 swap でそんなもの入れれる方が問題だと思うので これで問題は無かろう。 #define SWAP(x, y, type) \ do { \ type *SWAP_TMP_X = &(x); \ type *SWAP_TMP_Y = &(y); \ type SWAP_TMP = *SWAP_TMP_X; \ *SWAP_TMP_X = *SWAP_TMP_Y; \ *SWAP_TMP_Y = SWAP_TMP; \ } while(0)
一方、ロシアはC++ templateを使った。
>>231 でもさ、そもそもわざわざ関数じゃなくてマクロを使うのってパフォーマンスのためだよな
代入増やしたら意味なくね?
>>232 展開されねーだろw
>>233 最適化に期待したいが、ポインタ使うとどうなるんだろうか怪しいのか?
テンプレートみたく、型を引数にとりたい場合にもマクロを使う。
>>233 関数呼び出しのコストはちょっとした一時変数の確保や代入よりずっと大きい
ただし、本当にちょっとしたことをやるだけの関数なら、
コンパイラがオプション次第でインラインに展開してくれるかもしれない
変数を変化させる場合は関数だとポインタ渡しにしなきゃならんので つい簡単な処理はマクロで(ポインタ使わず)書いてしまうな、俺は。 でも、関数のような形で記述しといて引数が変化してしまうってのは ホントは良くないよねえ。
ああそれは良くないね デバッガで追えない点もマクロのダメなところ オプション変更で可能なのかもしれんが
>>229 宿題スレでお待ちしています。(以下略)
>>239 帰り道にある公園のトイレでお待ちしています。(以下略)
>>231 SWAP(++a, ++b, int);
というのを想定しているのでしょうか?でもこれでもうまくいかない。
いえ、ここまでうまくいく必要はないと思います。副作用のある表現をマクロの引数にするのは問題ですから。
きびしい言い方をすれば、このかきかたでも、なにもかわっていないから、ふつうに、
#define SWAP(x, y, type) {type tmp = (x); (x) = (y); (y) = tmp; }
でいいと思います。
c言語 覚えただけで 使わない
>>231 xやyのアドレスを取れない場合があるから、それはうまくない。
>>241 結局何も自分の言葉で説明できていないのにシッタカこいてんじゃねえよ
マクロについては、それ専用のスレで。言われているように、 使い方によっては問題が起こると。だから、コードを書く側が 適切に記述して使うべきだろ?あれこれ問題だと言い出したら、 わざと問題が起こるような状況をわかっているのに、対処しないような 人ほど、問題だろ。また、人為的でなくても問題があるなら、 最初から避ければ良いだけで、いちいちそれは問題だと 問題を敢えて起こして提起しなくて良いから。 意見するならするで、重要なことを述べな。
バカに付き合ってると自分もバカになるぞ(・3・)
Cを本当に活かせるのは組み込みなんじゃないかって思うのですが、 WindowsネイティブなアプリケーションだとAPI呼び出しが90%を占めている感じがするし どう思いますか?
それは入門編スレで聞くべきことだと思いますか?
>>249 あなたはCでどんなプログラムを作っていますか?
>>250 それは入門編スレで聞くべきことだと思いますか?
>>251 入門スレ以外で聞くところがありますか?
ファイルから一文字ずつ入力するにはどうしたらいいのか教えてください。
fgetc
組み込みとは縁遠いんだけど、C使う時はグルー的なところが満足な速度を出せなくなった時に 必要に迫られたというパターンがおおいかも。
259 :
デフォルトの名無しさん :2008/12/02(火) 07:56:38
すいません、質問があります。 配列に入りきらない数値データの移動平均をしたいのですが、 やり方を教えていただきたいです。 例えば1000万個の数値データを500ずつの移動平均を行う場合を教えてください。 初心者ですいません、宜しくお願いいたします。
500個ずつ配列に入れておけばいいじゃん。
261 :
デフォルトの名無しさん :2008/12/02(火) 09:56:03
違うcppで使われてる変数を変えるのってどうやるの?
合計とデータ数があれば平均は出せる、と小学校で習いませんでしたか?
263 :
デフォルトの名無しさん :2008/12/02(火) 10:11:34
>>259 です。
>>260 さんのおっしゃった方法ですが、
1~500、2~501、3~503・・・
としていくのに、1,2・・・を飛ばして100からといった感じで
大きい数いなったときの配列への格納がうまく行きません。
移動平均なら buf[i % 500] に代入でいいんじゃね 配列内総和 = 前回総和 - 最古のデータ + 最新データ 配列 → 最古のデータの部分を 最新データで書き換え 500 個分の過去データがないと 最古がどれか は保持できないので 配列をなくすことはできないな
ファイルでも使えば?
文房具のCMの駄洒落でもあるじゃん、ファイルを ふぁいる(入る)だけ用意してって
はっきり言ってしまうとC言語関係ない
>>261 違うcppとはどういう意味ですか?
そもそもcppに変数はありません
269 :
デフォルトの名無しさん :2008/12/02(火) 15:22:33
すいません、構造体の配列を使って住所録を作るプログラムを作成しています。 住所などのデータは最初は無く起動してから入力するプログラムなのですが。 住所録のデータを消す関数が全く分かりません・・・。 (後は下の空欄に文字を入れるだけなのですがお手上げですorz) int sakujo(struct tmp data[]) { int i,j; char name[20]; char ans; do{ printf("削除するデータの氏名―>"); scanf("%s",name); for( )/* データ数分だけ繰り返す*/ if( ) break;/*削除データが見つかったら繰り返しを抜ける*/ } if(i< ){ /*削除データがあった*/ for( ) dt[j-1]=dt[j];/*データを前詰め*/ 「 」 /*データ件数-1*/ } else printf("その氏名のデータはありません\n"); print("データの削除を続けますか?(y/n)"); rewind(stdin) scanf("%c",&ans); }while(ans=y||Y)/*yかYが入力されるまで繰り返す*/ 「 」 /*戻り値を返す*/
>>269 回答になってないことは十分承知ではあるが、
配列の要素数がわかっていないの場合、番兵などを決めていないとこれ以上いじりたくないソースに見えてしまう。
もしかして、疑似言語?while(ans = y || Y)とか。
構造体tmpがどのようなメンバを持っているのかわからないので、ソース全体をどこかに上げることをお薦めする。
271 :
269 :2008/12/02(火) 15:42:30
すいません書き忘れました! OS Vista ソフトVisual studio2005 ファイル処理、プリプロセッサ、記憶クラスなどは習ってません
>>269 |for( )/* データ数分だけ繰り返す*/
|if( ) break;/*削除データが見つかったら繰り返しを抜ける*/
データ件数がいくつなのかわからないからここだけでは答えようがないが、
data[]の添字を0からデータ数-1まで変化させながら
目的のデータを(おそらくstrcmp()で)探すような処理を書くこと
|if(i< ){ /*削除データがあった*/
削除データが見つからなかったとき、iがどんな値になるかを考える
|for( )
|dt[j-1]=dt[j];/*データを前詰め*/
前詰めするデータの添字は、iを使って表すとどんな範囲の値になるか?
その範囲でjを変化させて処理すること
|「 」 /*データ件数-1*/
データ件数を示す変数がわからないと答えられないし
それが何か知ってるならこれくらいは基礎の基礎、自分で考えろ
|}while(ans=y||Y)/*yかYが入力されるまで繰り返す*/
大間違い
正しい条件は「ansが'y'と等しい、または、ansが'Y'と等しい」
|「 」 /*戻り値を返す*/
何の値を返すことになっているのかわからないから答えられない
問題読み直せ
あと、バッファオーバーフロ対策とか細かいことは言わないけど
{が抜けてたりシンボルが違ってたりする部分はちゃんと直しとけ
グローバル変数でデータ数管理してんのかな? だとすればその変数を1減らせばいいよ
本当は rewind(stdin) scanf("%c",&ans); にもつっこみたいがまあいいか
>>261 グローバル変数ならextern
a.pp
int a;
b.cpp
extern int a;
C言語である番地が0か1か知るにはどうしたら良いですか? やりたい事は、 符号なし変数nビット内に1が一つだけあると判定して、そこから最下位ビットまでのビット長を得ることで、 2の累乗かどうか、であるならば2の何乗であるかを調べることです。ここまで教えて頂けるとより助かります。
val >> pos & 1
279 :
デフォルトの名無しさん :2008/12/02(火) 21:11:03
ビットで幅を指定した構造体のメンバに、幅が広い型の値を代入するには どう書けば良いか教えて下さい。 struct hoge_t { unsigned poyo: 3; } hoge; int fuga = 4; hoge.poyo = fuga; キャストとか特別な処理が必要なんでしょうか?
いらない
281 :
279 :2008/12/02(火) 21:28:10
>>280 そうなんですか。
そういうゆるさがハードいじるのに向いてるんですかね。
ありがとうございました。
>>279 自動的にマスクされるよ
その例なら、hoge.puyo = fuga & 0x7; と同等になる。
283 :
279 :2008/12/02(火) 21:47:29
>>282 上位ビットどうなるんだとか心配になってましたが
そういうことなんですね。
ありがとうございました。
但し、puyoが最下位に配置されるか最上位に配置されるかは環境依存。
お前はいったいなにをいっているんだ
しまった、puyoじゃなくてpoyoだった。
エンディアン?
うそつかない?
エンディアンに関係なく、ビットフィールドを上から詰める環境と下から詰める環境がある。 勿論、エンディアンの影響も受ける。
i386は最長ビットフィールドが収まる2の倍数バイト単位で反転した気がする。
291 :
デフォルトの名無しさん :2008/12/03(水) 10:57:24
スレ違いかもしれませんが・・・。 C言語でゲームを作成しました。その作品のブロック図を作成したいんですが ブロック図の書き方、又は作り方等記載してあるサイトあれば教えてください。
Doxygenとかじゃだめか
>>292 Doxygenが一番ブロック図に近いんでしょうか?
>>289 Cの規格にその条項があるのは知ってるけど
実際のコンパイラで何がどちらかの表みたいなのってないのかね
296 :
279 :2008/12/03(水) 18:44:06
迷った時はビットフィールドのテストプログラムを書いて、チェックするのがいいのでは?
一万を超える要素の配列を使うと強制終了してしまうんですが どんな対処法があるのかご教示ください
>>299 staticにするか、malloc()でとるか。
>>299 環境によるが、普通は
グローバル変数にする
スタティック変数にする
malloc系の関数で動的に確保する
のいずれかでOK。
>>300 >>301 ありがとうございます。
メモリの確保関連は入門書には載ってないようで
調べてみます。
メモリの確保が載ってない入門書ってあんのか。
304 :
デフォルトの名無しさん :2008/12/04(木) 09:08:53
>>299 > グローバル変数にする
> スタティック変数にする
> malloc系の関数で動的に確保する
いずれもその場しのぎで拙い
どの位のサイズからその必要が出るかが処理系に依存しているので可搬性がない
プログラムの論理上 auto であるべきものを、そうでなくするのは汚いコードだ
スタックの指定を省くこと自体がそもそも「汚い」ので、そこから改めるべき
処理系に依存せずにスタック容量を指定する方法があればね。 典型的な「机上の空論」と言う奴だな。
306 :
デフォルトの名無しさん :2008/12/04(木) 09:21:15
ほう、では処理系に依存せずに翻訳してみろ
>>304 malloc の使い方を知っていればどうということはないだろ
理想論だけでは何もできないぞ
>>304 メモリー量の問題は論理的な設計でなく物理的な設計の範疇になるので
「汚い」は仕方がない
309 :
デフォルトの名無しさん :2008/12/04(木) 09:49:46
>>307 理想論であることは認めるのだな?
>>308 配列のサイズや malloc の引数は物理的な設計ではないのか
>>304 お前は何を言っているんだ。
そもそも、それだけ大きい配列の要素数が静的に決定される状況が思い浮かばん。
「動的に決定するものだけど、取り敢えず決め打ちで」
てところだろ。
スタックサイズを動的に大きくできる子がいると聞いてやってきました
つalloca
314 :
312 :2008/12/04(木) 09:56:26
いや違う。スタックフレームは変更不可だ。
315 :
デフォルトの名無しさん :2008/12/04(木) 09:56:53
>>310 そのレスがなぜ俺宛になっているのかがわからない
おまえは「お門違い」という言葉を知っているか?
316 :
デフォルトの名無しさん :2008/12/04(木) 09:58:21
>>313 配列や malloc を使ったら「汚い」という貴殿の主張には賛成しかねる
malloc が気に入らなければ C++ で STL vector でも使えばいい話
足し算した時に、それがオーバーフローしたかどうかをビットで簡単に検出する方法無い?
>>318 インラインアセンブラ
もしくは加算結果をチェック
>>319 そうなんだけど、なんかビットのシフト演算とかで出来ないかなと思って
アセンブラでフラグ判定付きのJMP命令を入れる
>>320 オーバーフロー := 最上位ビットからの溢れ xor その下のビットからの溢れ
z = x + y; if ((x^z) & (y^z) & 最上位ビット) { // オーバーフローした }
325 :
デフォルトの名無しさん :2008/12/04(木) 11:51:31
パチンコを作るためにC言語はどの程度できないといけないのですか?
floatとdoubleのオーバフロー判定はどうするの?
オーバーフローしたら無限大になる
>>327 浮動小数点数演算の例外を有効にしてtry - catch
330 :
デフォルトの名無しさん :2008/12/04(木) 12:48:05
あいかわらずageのバカは言うことが支離滅裂だな
333 :
デフォルトの名無しさん :2008/12/04(木) 14:36:24
ご教授お願いいたします。 配列a[100]があるとします。 a[0]~a[50]までよみこんだあと、a[1]~a[51]、a[2]~a[52] と連続で読み込むのは可能でしょうか?
>>333 #include <stdio.h>
int main(void) {
int a[100],i,j,a_sz=sizeof(a)/sizeof(a[0]),step=50;
for(i=0; i<a_sz; i++) a[i]=i;
for(i=step; i<a_sz; i++) {
for(j=i-step; j<=i; j++) printf("%d ",a[j]);
printf("\n");
}
return 0;
}
>>333 言ってる意味がわかりません
よみこむとは何を何がどのように読み込むのですか?
具体的に説明してください
337 :
デフォルトの名無しさん :2008/12/04(木) 16:07:41
c言語のfftとmatlabのfftの出力結果が違うのはなぜですか?
338 :
デフォルトの名無しさん :2008/12/04(木) 16:21:42
printfの実体を作成したいのですが、何か参考になるサイトやソースないでしょうか?
VCランタイムのソースとか? (フルサポートではないけど) VZエディタのソースとか?
>>337 浮動小数点の丸めなどの処理系の仕様によるものか、アルゴリズムそのものの違いによるものだろう
341 :
デフォルトの名無しさん :2008/12/04(木) 16:34:11
>>331 議論の挙げ句に低劣な罵倒語が頂けるのは名誉であることを
知ってて言っているなら、褒めてくれてありがとよ
=== 読み込みデータ === ・ ・ (以上他の入力用データ) 1 2 7 10 14 17 (以下他の入力用データ) ・ ・ === sample.def === 上のようになっているデータを読み込んでいく中で、 真ん中に記述されているデータを読み込む際に fgetsで取り込んだ後に読み込んだ数字を(1)(2)(7)...(17)のように 一つずつint型に変換して別の配列に格納する方法ってありますか?
はい、あります。
>>342 一行に何項目あるかがはっきりしているならsscanf()を使うのが早い
そうでないならstrtol()を繰り返し呼んで自前で順次値を格納すること
346 :
342 :2008/12/04(木) 17:16:38
>>343 どのようにすればいいか教えていただけませんか?
まず、解析する文字列のアドレスを調べます
sscanfより自前でやった方がいい気もするな
349 :
デフォルトの名無しさん :2008/12/04(木) 17:33:12
>>346 #include <stdlib.h>
#include <stdio.h>
int main(void)
{
FILE *fin;
char buf[1024];
char *p;
int i, c;
int a[64];
fin = fopen("test.txt", "r");
fgets(buf, 1024, fin);
fclose(fin);
p = buf;
i = 0;
while(*p != 0){
a[i++] = strtol(p, &p, 10);
while(*p == ' ') p++;
}
c = i;
for(i = 0; i < c; i++) printf("%d,", a[i]);
return 0;
}
>while(*p == ' ') p++; いらない
>>349 strtol() は、その変換を行う際、数値に先立つ空白文字を読み飛ばす。
よって以下の行は不要である。
while(*p == ' ') p++;
また、この終了条件 while(*p != 0){ では、恐らく常に1回余計に変換と格納が発生する。
取得した文字列の末尾の '\n' を取り除いていないからである。
さらに、もし何か数値として認識できない文字が入力されたとき、
p の値が変化せず、それを検出もできないために、無限ループに陥ってしまう。
strtol() で連続的に文字列を解析する場合は、第一引数に与えるポインタと
第二引数にアドレスを与えるポインタを別のものとして、呼出し後にその値を比較し、
変換が正常に行われたかどうかを確認しなければならない。
352 :
351 :2008/12/04(木) 17:59:48
訂正 '\n' を取り除かない場合も、常に無限ループとなる。
#include <stdlib.h> #include <stdio.h> int main(void) { FILE *fin; char buf[1024]; char *p, *n; int i, c; int a[64], t; fin = fopen("test.txt", "r"); fgets(buf, 1024, fin); fclose(fin); p = buf; for(i = 0; i < 64; i++){ t = strtol(p, &n, 10); if(p == n) break; a[i] = t; } for(c = 0; c < i; c++) printf("%d,", a[c]); return 0; } こうかな?
おっとミス for(i = 0; i < 64; i++){ t = strtol(p, &n, 10); if(p == n) break; a[i] = t; p = n; }
355 :
342 :2008/12/04(木) 19:10:59
解決しました どうもありがとうございました<m(_ _)m>
356 :
デフォルトの名無しさん :2008/12/04(木) 22:32:39
質問です。 どの本を見ても、unsigned型の関数が無かったので疑問を持ちました。 unsigned型の値を返す関数って作れるのでしょうか? int plusint(int a, int b){ return a + b; }
>>356 全然全く毛ほども問題ないよ。私は結構作っているけどね。
>>356 標準関数にsize_t返すやつがあるじゃん。
大概size_tだから見かけないのかなぁ
引数なら srand があるね。
>>356 作れるか作れないかということで言えばもちろん作れる
ただし、関数というものの常として、何らかのエラーが発生したときには
それを呼び出し元に伝えなきゃいけないのだが、
戻り値をsignedにしておけばマイナスの値が使えるということがある
unsigned plusint(int a, int b){ return (unsigned)(a + b); } 簡単に作れたよ
>>361 足し算でエラーとか言われても。値域狭めるだけじゃん。
引数がintなら結果がマイナスもありうるじゃん
つまりprintf見たいな感じっていいたかったんだtoi
>>363 別に足し算する関数について言ったわけではないぞ
疑問への答えと、なぜそういう関数がまれなのかの補足をしただけだ
367 :
デフォルトの名無しさん :2008/12/04(木) 23:24:24
マイナスでエラー返すのってunixのシステムコールくらいだろ。
Cでintが多いのは別にエラーのためじゃないと思うけど。
引数だってintばっかだし。
>>368 EOF
EOFがあったな。
あと、うっかりsignedと演算してえらいことになるかもしれないってのもある
size_t strlen(const char*); signed と演算されまくりそうな関数だが。
だからなんだよ
根拠も無く適当なことをいってるんじゃねえよって意味じゃね?
=== data.def === 0 1 2 0 a 1 0 b 1 1 a 2 1 b 1 2 a 0 === data.def === このように定義されたファイルで1行目をfscanfで読み込み、 2行目をfgetsで読み込んだあとで、 第3行以降をfscanfで1回につき3つの数字を読み込ませたいのですが、 これだと3行目を読み込むfscanfで === data.def === 0 1 2 <= 2行目のの2つの数字と 0 a 1 <= 3行目の左の数字1つ だけを読み込んでしまう無限ループに陥ってしまいます。 どのようにしたらこの無限ループを回避できるでしょうか?
fgets で読み込まれるのは1行目の0の後ろの改行だけ。
>>376 全部fgets()で読み込んで、sscanf()で解釈したら?
scanf()系をほかと混ぜて使うのがダメっていうか、まぜなくても使わないほうがいい。
380 :
376 :2008/12/04(木) 23:50:53
fscanfのみ%d使ってます
a を読み込めないからそこで無限ループだろうな aは16進数にしたいの?
%x だな
fscanf()をfgets()と組み合わせるのは禁じ手。 fgets()したものをsscanf()する方がまし。 それはさて、3行目以降は3つの数字とあるけど真ん中にアルファベットが書かれているのだが。
384 :
376 :2008/12/04(木) 23:59:50
3行目以降は有限オートマトンの情報を作るためのデータで 1つ目と3つ目は現在と次の状態、2つ目は入力文字を表します
いやそんなことはどうでもいいんだが、 そろそろ具体的なコード出してくれんとじゃないとどうにもならんな
386 :
376 :2008/12/05(金) 00:01:52
>>381 a,bなどの2つ目の文字はchar型で読み込ませたいです
fscanfが返す値に注意かね。
%cでスペース読み込んでaが残っちゃってるとかかなぁ?
%c じゃなくて %1s なら大丈夫だろう。 文字列になるので2バイトのバッファを用意する必要があるが・・・。
ん? %d %c %d でうまくいくんじゃないの?
%d %c%dでいいんじゃね。
392 :
376 :2008/12/05(金) 00:18:59
====================== ここから =========================== if( fscanf(fp,"%d %d", lastState, lastState+1) != 2 ){ printf("不正なデータです.強制終了します.\n"); return -1; } ====================== ここまで =========================== makeDFAlist(first, curState); while( (n = fscanf(fp,"%d %c %d", &next, &trans, &now)) != EOF ){ if( n == 3 && isalnum(trans) ){ mTrans = trans; }else{ printf("不正なデータです.強制終了します.\n"); return -1; }
っとまてよ while( fscanf(fp,"%d %c %d", &next, &trans, &now) == 3 ){ if( isalnum(trans) ){ でいいのか
構造体配列のリストで、ある要素が持つノードの配列番号を知るにはどうしたらいいですか? struct foo{ struct foo *bar[5]; }; struct foo *create(){ int i; struct foo *n; n = (struct foo *)malloc(sizeof(struct foo)); for(i=0;i<5;i++)n->bar[i] = NULL; return n; } int main(void){ struct foo *foobar[10]; int i; for(i=0;i<10;i++)foobar[i] = create(); foobar[0]->bar[0] = foobar[1]; /*ここでfoobar[0]からbar[0]を辿り、その要素がboobar[1]、ここで'1'を取得したいです*/
本やで立ち読みしてて見かけたんですが printf("%d %d %d\n",a,b,c); って書くのと char p[]="%d %d %d\n"; printf(p,a,b,c); って書くのがあったんですが 2つ目はなんで "p" って書かなくていいんですか? あとどっちを使うのがいいんでしょう
"p" と書くと {'p', '\0'} p と書くと {'%', 'd', ' ', '%', 'd', ' ', '%', 'd', '\n', '\0'} printf("%d %d %d\n", a, b, c); って書き方のほうが多く見かける
ありがとうございます
よく見かけるのですが #define hoge (1) のように、単独の定数をカッコでくくっているのは何の意味があるのでしょうか? #define x ((x) * (x)) とかなら意味はわかるのですが、単独の定数くくる意味ってあります?
あ、例を間違えた #define nijyo(x) ((x) * (x)) これならわかります。
値を修正するときに 元の値が残せるところ #defaine hoge (1) → #defaine hoge (1+20) とか
教えてください グローバル変数をint型で宣言して 0x04で初期化しようとしたら 矛盾するというようなエラーが出るのですが、 これは何のエラーなんでしょうか。
ような、じゃなくてちゃんと書けバカ
>>400 ((x) * (x))
おっぱい大好きでちゅか?
>>403 conflicting types for '変数名'
というエラーが出ます。
天才さん
407 :
399 :2008/12/05(金) 11:12:25
レスどうもです。 あんまり意味ないってことですね。 ちなみにおっぱいは好きです。
408 :
376 :2008/12/05(金) 11:54:59
付け加えますが、最終状態に関してはいくつあるかが決まっていないため 2行目がいくつあっても実行できるプログラムでないといけません
>>406 初期化関係ないんじゃ?
同じ名前で別の定義してるのでは。
410 :
デフォルトの名無しさん :2008/12/05(金) 12:51:23
unicode文字表示するにはどうしたらいいですか?
環境によって異なります
412 :
デフォルトの名無しさん :2008/12/05(金) 13:23:23
>>411 ありがとうございました。
すいませんもう一つ質問したいのですが、c言語で画像を表示することは出来ますか?
また、できるとしたらどのようにしたらよいですか?
413 :
406 :2008/12/05(金) 13:30:51
>>409 ありがとうございます。
エラー時は
int [変数名];
[変数名]=0x04;
のように書いていたところを
int [変数名] = 0x04;
にしたらエラーが消えたのですが、
これは何が違うのでしょうか。
>>412 大抵の環境では出来ますが、方法はその環境によって異なります
>>413 問題あるはずないと思って試したらやっぱり問題なかった。
それがソースからのコピペで変数名だけ書き換えたものだとしたら上はセミコロンが全角になってる。
そこを修正して問題が出るようならコンパイラ名を出してほしい。
>>395 リストの先頭から何かの変数を使ってポインタを辿る回数を数えろ
もしリスト自体のノード順序が固定なら構造体のメンバに
要素数を示す変数を加えて管理することもできるが、それぐらいなら
(メモリが許すなら)配列で確保したほうが面倒がないね
>>396 いいも悪いも配列名はそのままで配列名であって
""で囲ったら配列名ではないただの文字列定数になってしまう
>>399 そのマクロがソース中で展開されるときに
絶対に数値にしかならないことを保障したい場合に使う
具体的に言うと文字列化演算子#とトークン連結演算子##を作用させないため
>>403 ソース貼れ
>>408 そういうことは先に言え
だったらfgetsを呼ぶ前に\nを読み飛ばすか、
さもなきゃfgetsを1回余分に呼ぶか、
あるいは全部fgetsしてsscanfするしかない
>>412 環境依存
>>413 Cでは関数の外に実行文 (x = 4; のような) を書くことはできません
>>408 考えてみると2項行がいくつあるかわかんないってことは
いつfscanfに切り替えたらいいかもわかんないんじゃないか
もう全部fgets→sscanfしろ
>[変数名]=0x04; これは初期化ではない。
>>415 >>417 ありがとうございます。
実行文を関数内にも書いてみたらそちらの方は
エラーが出ませんでした。
説明不足申し訳ないです。
ありがとうございました。
もうパーサ書いた方が早いんじゃ
>>408 if(!fgets(buf,BUF_SIZE,fp) || sscanf(buf,"%d",&n0)!=1){
return -1;
}
while(fgets(buf,BUF_SIZE,fp)){
r=sscanf(buf,"%d %d",&n0,&n1);
if(r==1) break;
if(r!=2) return -1;
}
do{
if(sscanf(buf,"%d %c %d",&n0,&c,&n1)!=3) break;
}while(fgets(buf,BUF_SIZE,fp));
とにかく常にfgetsで改行含めて読み込んで それから項目毎にバラすのが定石だよなあ。
mallocでNULLが返ったら、あなたならどう対処しますか? 私はexit
>>424 そんなもんそのプログラムの内容によるとしか言えんだろ
男ならチェックしない
常にexitはないわー
アンケートがやりたいならマ板でやれ
>>424 場合による。
もう一度確保を試みたり、例外処理として代行処理関数呼んだり、例外処理として関数内gotoしたり、ポインタを返す関数ならNULLを返したり、整数を返す関数ならエラーとして整数定数を返したり、続行不可能と判断してエラーを吐いてexit()を呼んだりする。
static変数ってユーザー定義関数の中で定義しても プログラムが終わるまで生き続けるんですか?
ぬるぽとか?
linuxとかだと、リターン値を調べるだけムダって話もあるな > malloc()
fclose(stdin)って合法? なんでこんなこと聞くかというと FILE *fpとfopen fcloseを使ってファイル出力をするプログラムを作っていたとき 作成時の便宜のためfopen の後ろにfp = stdinとしていたときそう思ったんです
stdoutでした
>>438 malloc()はNULLを返さないらしい。
メモリ確保に失敗したって分かるのは、メモリにアクセスするとき。
442 :
395 :2008/12/05(金) 21:50:09
>>416 レス遅くなりましたが、ありがとうございます
sizeofで出来そうな気がしてきたので試みてみます
>>441 kernelに怒られて、強制終了した。
>>441 設定で、その場で確保してみてエラーを返すようにもできるけどね。
>>428 NULLぽが返ったらどうせ何も出来ないのだからとっとと終了
>>445 メモリ確保できるかどうかで使用するアルゴリズムを変えてるぜ
>>441 それは信じられないなあ。
セグメントバイオレーションを起こすアドレスを返せば、書き込んだときに強制終了して
わかるけど。そうでないアドレスを返したら、あちこちをぶっ壊すってこと?
>>448 Linuxの勉強してきてくれ。
簡単に言えば、malloc()は仮想メモリ空間のアドレスを返すだけ。
要は、メモリ使用の予約をしているだけだと思えばいい。
で、実際に使おうとしたときに実メモリが足りなければスワップしてメモリを空けるのだけれど、
(GUIが走っていたりして)メモリの奪い合いが頻発し始めると強制終了の憂き目に遭う訳だ。
CFAQ 7.14 質問: オペレーティングシステムによっては malloc したメモリを実際に確保するのを プログラムがそのメモリを使おうとするまで先延ばしすると聞いたことがある。 これは文法上許されるのか。 回答: これは難しい。規格は、システムはこういう風に振る舞ってもよいと書いていないけれど、 こういう風に振る舞ってはいけないとはっきり書いてあるわけでもない。 こういう“先延ばしの失敗”の実装は規格が暗黙に要求しているところに 従っていないように思える。 …… こうした遅延割り付けをするシステムは通常、 特別のシグナルを使ってメモリの量が危険なほど少なくなっていることを知らせる仕組みを持つ。 しかし移植性の高いことを目指したプログラムやタコなプログラムはそういうシグナルを捕まえない。 遅延割り付けをするシステムの中にはプロセス単位かユーザ単位で遅延割り付けをやめる仕組み (昔からの malloc の意味付けに戻る仕組み)を用意しているものもある。 しかし詳細はシステムによって異なる。
malloc呼んだらすぐにチョイと何かテスト書き込みしてみる という手を思いついたけどうまく行くかどうかは知らない
余り意味はないな。それが有効な状況では既に破綻は目の前だ。
メモリー不足は個々のプログラムの問題でなくて、運用管理の問題 運用テストではそういった類のテストをする
すみませんmalloc絡みでちょいと質問です。 int main(void){ int *a[5]; int i; for(i=0;i<5;i++){ a[i]=(int *)malloc(sizeof(int)); printf("a[%d]=%d\n",i,a[i]); } a[3]=a[4]; free(a[4]); a[4]=(int *)malloc(sizeof(int)); printf("\na[3]=%d\n",a[4]); printf("a[4]=%d\n",a[4]); return 0; } <実行結果(bcc5.5.1)> a[0]=9447640 a[1]=9447656 a[2]=9447672 a[3]=9447688 a[4]=9447704 a[3]=9447704 a[4]=9447704 a[3]が不要になったのでa[4]のアドレスをa[3]にコピーして空きができないように詰め、 新しいaが必要になったのでa[4]に再度領域を確保しようという意図です すると何故かa[4]のアドレスがa[3]と同じになるのですが、 どこがおかしいのでしょうか?本来ならば新しいアドレスが割り振られるはずですよね?
456 :
455 :2008/12/06(土) 03:58:55
すみません11行目ミスです printf("\na[3]=%d\n",a[4]);→printf("\na[3]=%d\n",a[3]); これでも私の環境では実行結果は同じになります
457 :
455 :2008/12/06(土) 04:04:57
free(a[4])でなくa[4]=NULLを使ったらできました・・・ この辺りよく理解できていないので、 free()は何をしていてこんな結果が得られるのか、 どなたかご教授願えたらと思います・・・
a[3]=a[4]; ここで、a[3]にa[4]をコピーした。 free(a[4]); そして、a[4]の指している領域を開放した。 a[4]=(int *)malloc(sizeof(int)); それから、新しい領域を確保して、a[4]にそのアドレスを得た。 このとき、a[3]に入っているアドレス(既に一度開放した領域のアドレス)に再度領域が割り付けられた。 だからa[3]とa[4]は同じアドレスになった。何もおかしいことはない。 おかしいのは、君がa[4]を開放していることである。 a[3]が不要になったのならa[3]を開放しなければならない。
>>455 お前がやったのはこういうこと
a[3] → int3
a[4] → int4
↓
a[3] ┐ int3
a[4] ┴→ int4 (a[3]=a[4];)
↓
a[3] ┐ int3
a[4] ┴→ (free(a[4]);)
↓
a[3] ┐ int3
a[4] ┴→ int5 (a[4]=(int *)malloc(sizeof(int));)
int3は迷子になってしまったね
正しくはこうやる a[3] → int3 a[4] → int4 ↓ a[3] → (free(a[3]);) a[4] → int4 ↓ a[3] ┐ a[4] ┴→ int4 (a[3]=a[4];) ↓ a[3] ─┐ a[4] ┐└→ int4 └─→ int5 (a[4]=(int *)malloc(sizeof(int));)
462 :
デフォルトの名無しさん :2008/12/06(土) 09:59:53
ポインタの書き方で質問があります。 入門本では、 int *pA; のように宣言すればおk と書いてあるのですが、 そこら辺に転がっているCのソースを見ると float* char** のようになっているポインタがあるのですが、 いったい何がどう違うのでしょうか?
int *p はint型を指すポインタ float *p はfloat型を指すポインタ char **p はchar*型(つまりchar型のポインタ)を指すポインタ 一口にポインタといっても、指す先の型によってポインタの型も変わってくる
464 :
デフォルトの名無しさん :2008/12/06(土) 12:41:18
(CDから)ターボデバッガをインストールした後 BCC Developerをインストールしたが BCC Developerの<デバッグ>ボタンを押しても、ターボデバッガが起動しない。 ターボデバッガのインストール後のパスの設定はどうするのでしょうか。 本には「Bcc Developerの環境設定を参照」とあるが、さっぱり分かりません。
スレ違いなので該当スレにどうぞ
rubyスクリプトをCソースに変換するソフトはありますか?
ポインタってなんすか?
アドレスを入れる変数 詳しくはググるか書籍で
アドレスいれてなににつかうんすか?
そのアドレスにある情報を読んだり書いたり。 釣られてる?
配列や構造体を関数に渡すときに値を全てコピーするのは大変な手間になる だからアドレスを渡してやる事で処理を速くする
釣りに使う
474 :
デフォルトの名無しさん :2008/12/06(土) 19:24:26
必要性を感じるまでは無理に使わなくてよい
Cのレイヤーでの回答とASMのレイヤーでの回答には違いがありますから、ね?
for(a;b;c) のaの部分(初期なんとか部)に、何も書かずにforループさせることはできますか?
>>472 そこをポインタがないとか言われてるJavaとかC#ではどうやってるの?
>>478 参照型はポインタだ だから、JavaやC#はポインタしかない言語だ
というのを何かの本で読んだ事あるんだけど、Cのポインタとはまたキャラが違うと思うんだ。
俺はJavaから入って、Cに挫折したけど、Javaで飯を食って行ってるヘタレPGだから、
Cを自由自在に操れる人は本気で凄いと思う。
malloc関数とかfree関数のつっこんだ操作がイミフで仕事先の先輩PGもあんなもん覚えなくていいよー と言うんだが…
これでいいんだろうか…
for( ; ; ) にすることすらできる
Cを使うコツは「なんとなく」わかった気になるというのを排除して 徹底的に理詰めで理解しようとすることだ
483 :
デフォルトの名無しさん :2008/12/06(土) 21:45:32
malloc()やfree()は難しい要素はないと思うが…
>>484 多次元配列の確保とかでわけわかんなくなる人もいるんだよ
メモリの確保?あーめんどくせー 勝手にやってくれよ ATに慣れるとMTに乗れなくなる現象ですね
アセンブラで「CPUの動き」に触れてみるといいんじゃない? と思うけど保証はしない。
アセンブラを学ぶことはより深くCを理解できる可能性がある反面 誤った思い込みをしてしまう可能性もあるので一長一短
>>490 ・ポインタ型は、あるオブジェクトへの参照を表す値を持つオブジェクトである。
そのポインタが何を指してるのかを把握出来ることが、
ポインタを使う上での基本じゃないかね。
定義は?
,. -‐'''''""¨¨¨ヽ (.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ! |i i| }! }} //| |l、{ j} /,,ィ//| 『多次元配列の確保についての基本の定義を尋ねたら i|:!ヾ、_ノ/ u {:}//ヘ ポインタについて当たり前の事を説明された』 |リ u' } ,ノ _,!V,ハ | /´fト、_{ル{,ィ'eラ , タ人 な… 何を言ってるのか わからねーと思うが /' ヾ|宀| {´,)⌒`/ |<ヽトiゝ おれも何をされたのかわからなかった ,゙ / )ヽ iLレ u' | | ヾlトハ〉 |/_/ ハ !ニ⊇ '/:} V:::::ヽ 頭がどうにかなりそうだった… // 二二二7'T'' /u' __ /:::::::/`ヽ /'´r -―一ァ‐゙T´ '"´ /::::/-‐ \ 超スピードだとか催眠術だとか / // 广¨´ /' /:::::/´ ̄`ヽ ⌒ヽ そんなチャチなもんじゃあ 断じてねえ ノ ' / ノ:::::`ー-、___/:::::// ヽ } _/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::... イ もっと恐ろしいものの片鱗を味わったぜ…
>>493 本当にポインタについて当たり前のことを理解しているというのなら
頭を使えよ
まあ、たしかに多次元配列をmalloc()で確保することってあんまりないから、 10*10*10の三次元の配列を確保するとして、 p = malloc(sizeof(int) * 10 * 10 * 10); とかで、pの型ってどうなるんだっけ、ってちょっと考えちゃうな。 まあ、でも、そんなCの記法の問題だから調べれば分かる問題だし、 ポインタの難しさとはちょっと違うよな。
確かにそういうコードだとJavaやC#にはないCのポインタの特徴が出てくるね。
Cやりだして最初に罹るのはmalloc()作りたい病 俺にも経験がある で自動ガベコレとか始めるんだわ
C#にはない?
やっぱり配列でしょ
Cは型情報をいじりやすくしてほしい
まず、Cには本当の意味での多次元配列などないことを理解すべき 配列の配列や、配列の配列の配列があるだけ
>>501 Cではコンパイラは高度なことは何もしてくれないしルールも少ない。
用意されているのは素材程度。
多次元配列もプログラマがそう見立ててデータ構造を解釈するしかない。
C言語ソースを解釈できるインタプリタって存在しますか?
フリーのはないんでしょうか?
C言語のインタプリタ環境のメリットって何だろう?
普通にデバッグ実行と大差無いような・・・
>>504 のリンク先では
「コンパイルやリンクといった煩わしい処理を必要としない」
ってあるけど、そもそもプログラムを書くことは煩わしくないのか?w
>>506 「プログラムを書くことに専念できる」とも書いてあったよ。
毎回コンパイルがしんどかった大昔の遺物じゃね?
そんな大昔にこのインタプリタがまともに動くのだろうか・・・
みんな、どんなPC環境でプログラム作ってるの?
ひとそれぞれです
>>510 会社から支給されたDELLのInspiron 700mってやつ
俺はレッツノートのCF-R3DってやつとMacBookだな。 シミュレーションやる時はちょっといいVGA入ったコンピュータ使ってるけど詳細わかんね。
プログラマに対するアンケートはマ板でやってください
516 :
デフォルトの名無しさん :2008/12/07(日) 12:21:18
独学でやってますが専門学校二年分の授業には どの程度のことができるようになれば追いついたことに なりますか?
マ板に行け
519 :
517 :2008/12/07(日) 13:49:23
専門の2年分なんか社会に出てしまえば誤差みたいなもん
独学でどんどんやってしまう人が一番役に立つ。
>>466 例外機構はCでまともに記述不可能なので
原理的に無理。
523 :
デフォルトの名無しさん :2008/12/07(日) 22:25:36
例外機構はCでまともに記述不可能なので 例外機構はCでまともに記述不可能なので 例外機構はCでまともに記述不可能なので
こうやって無知をさらす人がなぜ後を絶たないのかね
>>523
例外以外でも、rubyをCにコンバートって無理そう。
_asm 使っていいならできるだろうけどねぇ
setjump/longjmpでどこまでやれるかだね。
下記のコードでchar×5のメモリは正しくfreeされますか? また、開放されたことを確認する方法はありますか? char *p1; int *p2; p1 = (char*)malloc(5); p2 = (int*)p1; free(p2);
>>529 問題ない
つまりはアドレスさえちゃんとmallocで帰ってきたやつならキャストしようが、代入しようがおk
以下三行は読み飛ばして結構
一応理由としては(一応環境な内部っぽい話だけど)
mallocによって確保した場合は確保した領域のすぐ手前にどれだけの量確保したかの情報が書き込まれてる
freeにアドレスを渡された場合、そのアドレスの手前を見てどれだけ解放するべきかチェックして解放を行う
>>529 開放されることになっている
確認する必要はないし、できない
532 :
デフォルトの名無しさん :2008/12/08(月) 01:56:40
質問です。 ファイルから1行ずつ文字列を読み込んで 変数に格納して比較したい場合どのように したらよろしいでしょうか? 例えば"FILE.txt"の中身が AAA,BBB,CCCCC DDD,EEE,FFFFFF GGG,HHH,GGGGG ・・・・ ・・・・・ といったようになっていて 1行目のAAA,BBB,CCCCCを AAAまで読み込んで変数1に格納して 2行目のDDDを変数2に格納して 変数1と変数2を比較する場合どのように 記述すればいいでしょうか? よろしくお願いします。
何が分からないのか分からないが ファイルを開くのはfopen ファイルからの読み込みはfgets, fgetc, fread, fscanf 文字列の比較はstrcmp を、使えばいい ソースを丸ごと書いてほしいなら宿題スレへ
>>532 ,まで読み込みはscanf系使えばできるよ
>>532 一般的には二つの方法がある。
一つはファイルから直接fscanfで読み込んでいく方法。
コード全体が簡素で済むのが利点だが、変なデータを投げ込まれたら
ひどい間違いが起きる可能性も高い。
ちなみにscanf系関数で項目を「読み飛ばす」には、ダミーの変数のアドレスを与えるか、
該当項目を%*dなどとする。詳しくはscanf書式指定文字列の解説を読むこと。
もう一つはfgetsで1行読み込んだ文字列をsscanf(この場合は先頭の項目なので、
strtolやstrtod、あるいはatoiやatofでもいいかもしれない)で解析して値を取り出す方法。
こちらのほうが一行ずつ確定的に処理を進められるため、間違いが置きにくいしエラーを捕まえやすい。
宿題ですがよければ解説お願いします。 2000年から2年ごとに開催されているオリンピックで、 西暦を入力するとその年に開催されるかどうかを表示するソースなんですが #include <stdio.h> int olyn(int); int main(void) { int year; scanf("%d",&year); if (orin == 0){ printf("開催\n"); } else{ printf("非開催\n"); } return 0; } int olyn(int year) { return year % 2; } ではなにを入力しても"非開催"になってしまいます。 なにがいけないのでしょうか。 回答例は渡されていて、そちらの方が優れているのもわかるのですが それを見ずに書いた自分のソースが動かないのがなんか悔しいです。
537 :
536 :2008/12/08(月) 05:01:16
間違えて修正前のを貼ってしまいました。 if (orin == 0){ のorinはちゃんとolynに直してます。 申し訳ありません。
スレ違い
>>536 関数を正しく呼び出していないからである。
if (olyn == 0){
上の行は、決して君が期待した動作をしてくれない。
配列の名前と同様に、関数の名前はすぐに関数へのポインタに成り下がる。
そして実在する関数へのポインタは当然ヌルポインタではないので、
これを 0 と比較した結果は常に偽となる。よって if 節の処理は行われない。
正しいコードは以下のようになる。
if (olyn(year) == 0){
540 :
536 :2008/12/08(月) 05:19:14
あーすいませんわかりました。 olynの戻り値に対応させる項目が main になかったんですね。 違ったら罵倒してください。 あとolymですねすごい恥ずかしい。
541 :
539 :2008/12/08(月) 05:21:24
>>538 丸投げしたわけじゃないからこちらかと思ったのですが……
別の方がよかったですかね。気をつけます。
>>539 ありがとうございました。
お手数かけて申し訳ありません。
>olynの戻り値に対応させる項目が main になかったんですね。 違う 無いのは引数
543 :
539 :2008/12/08(月) 05:24:54
>>542 ありがとうございます。
なるほどです。
544 :
デフォルトの名無しさん :2008/12/08(月) 09:26:19
スレ違いかも知れませんがC言語の基礎から覚えたいと思います お勧めのサイトもしくは書籍を教えてください
546 :
デフォルトの名無しさん :2008/12/08(月) 10:21:09
入門者に冷たいスレですねw C言語なんか古くてダサいしJAVAスレいってきます。
#include<stdio.h> int seikai;//正解率 char line[10]; int main(){ printf("正解率を入力してください 0〜100%%:"); fgets(line,sizeof(line),stdin); sscanf(line,"%d",&seikai); if(0<=seikai<=60){ printf("成績は""F""です\n"); } if(61<=seikai<=70){ printf("成績は""D""です\n"); } if(71<=seikai<=80){ printf("成績は""C""です\n"); } if(81<=seikai<=90){ printf("成績は""B""です\n"); } if(91<=seikai<=100){ printf("成績は""A""です\n"); } return(0); }
>>548 でビルドすると、
正解率を入力してください 0〜100%:50
成績はFです
成績はDです
成績はCです
成績はBです
成績はAです
続行するには何かキーを押してください . . .
という結果になってしまいます。
どこがおかしいのか、全然わかりません。。
550 :
、 :2008/12/08(月) 11:06:09
教えて欲しいです。VC.exe起動、mslog.exe起動、プログラム実行、自作printf、mslog.exeにて出力。という流れを作りたいですが、mslog.exe起動、mslog.exeにて出力という箇所をどう作成すればよいかわかりません。よろしくお願いします。
>if(0<=seikai<=60) こういう書き方を if(0 <= seikai && seikai <= 60) こうする
>>551 素早いレスありがとうございます。
無事できました。
>if(0<=seikai<=60)
この書き方は、具体的にどこがまずいんですか?
文法的に間違っている?
553 :
デフォルトの名無しさん :2008/12/08(月) 11:13:48
554 :
デフォルトの名無しさん :2008/12/08(月) 11:15:35
>>552 文法的には間違っていないが、論理的に間違っている。
C言語の意味的には(0<=seikai)<=60と同じだから、0<=60か1<=60として評価される。
>>554 なるほど。
わかりやすい!
解説まで、わざわざ有難うございます。
556 :
デフォルトの名無しさん :2008/12/08(月) 12:52:48
#include <stdio.h> int main(void) { int n; int w; int v[100]; int i = 1; int j = 1; scanf("%d %d", &n, &w); for(i=0; i<n; i++) scanf("%d ", &v[i]); } 上記のようなプログラムを実行すると、scanfでたとえばn=4を入力したときに for以下のscanfでのv[i]の入力が5個になってしまいます。 nとv[i]で打ち込む個数を等しくするにはどうすればいいのでしょうか?
意味が分からん
wの入力を忘れていて、一回入力要求が多いと思い込んでいるに一票。
wは入れていたんですが、for以下のi=0をi=1に変えたら解決しました。 お手数おかけしました。 ありがとうございます。
それは絶対何かがおかしい。
本当ですか… ホントに初歩的な質問ですみませんでした…。 いろんなサイトを見てみます。
あ、判った。scanf()のフォーマット指定の後の空白は、何かしら空の入力を要求してしまう。 だから、"%d "としてはダメ。
やってみたら直りました! こんなに見つけにくい間違いを見つけていただいて、ホントにありがとうございました!
564 :
562 :2008/12/08(月) 13:42:12
どうでもいい訂正を一つ。 ×空の入力を要求 ○ダミーの入力を要求 例えば、最初の"%d "に対して 3↓(矢印でEnterキーを表わすとする) 2↓ と入力すると、「3」だけが%dで消費されて「\n」がその後の空白で消費される。 仮にこの後getchar()すれば、「2」が得られることになる。 # このscanf()の振る舞いは美しくない。やはり、fgets()してからsscanf()した方がましなようだ。
もうちょっと正確に言えば、「空白文字でない文字が現れるまで読み飛ばし続ける」の意味 だから次に何か打ち込んでやるまで処理が停まってしまう
>>565 つまり、実際には一度'2'を読んでそれが「空白でない文字」と判ってから読んでなかったことにしているということかな。
>>566 その通り
実際"%d %d"とか書く必要はないんだよね、"%d%d"でいい
空白入れる必要があるのは%cの周辺だけ
int i; char a[5][3]={"12","34","56","67","89"}; for (i=0 ; i<5 ; i++) printf("%s\n",a[i]); これはちゃんと表示されるのに char を int に変えるとエラーになるんですがなんでですか?
>>568 charをintに変えただけならそりゃエラーになるでしょう。
何がしたいのか、具体的にはっきりと。また、エラーメッセージもきちんと書きましょう。
>>568 int配列の初期化に文字列リテラルを使うことができないから
それだけ
配列data[1]〜data[10]に格納されているランダムな数値に 1〜10までの順位を決めたい場合どうすれば良いのでしょうか
>>572 data[1]が先頭なので一位、
以下順番でdata[10]が十位
が簡単です。
qsortを使えばいいと思いますよ
576 :
デフォルトの名無しさん :2008/12/08(月) 19:03:10
>>572 10個のデータを扱いたいだけなら data[0] 〜 data[9] な
C の配列は [0] から始まるんだよ
577 :
572 :2008/12/08(月) 19:09:51
配列data[1]〜data[10]って書いてあるのが読めないんですか? data[0]には順位に関係ないデータが入っています。
>>572 説明しなきゃわかるかボケ
ここはエスパースレじゃないんだよ
579 :
デフォルトの名無しさん :2008/12/08(月) 19:20:31
>>577 読めてるから
>>576 を書いたんだよ ぼけ
情報小出ししながら何を威張ってやがる
無 礼 な 質 問 者 め
2chは初めてか?力抜けよ
ム板変なの増えたな
584 :
デフォルトの名無しさん :2008/12/08(月) 19:31:35
>>577 謝るのか消えるのか、どっちだ?
# 煽りはスルー
NULL == 0が真になるのは何でですか?
質問が例えば、data[101]〜data[110]に入っている10個のデータ、と書かれていたなら
>>576 のような、「10個のデータを扱いたいだけなら」という妙な前提をつくって
0オリジンであることを説くこともなかったはずだよな。
>>572 に対してはそういう話をするのではなく、何を以て順位を決定するのか、
また、決定した順位をどのように保持したいのか、そういう問いかけをすべきであろう。
>>586 NULLが(void *)0として定義されていたりするから
589 :
デフォルトの名無しさん :2008/12/08(月) 19:54:11
#undef NULL #define NULL 1 if(NULL == 0) goto hell;
590 :
デフォルトの名無しさん :2008/12/08(月) 19:57:37
>>544 なんでもいいから適当な教科書を買って、わからないところをこちらで聞いていただければいいと思います。
辛抱強く待っておれば、かならず答えてくださる方がおられます。
大事なことは、手を動かすこと、自分の頭で考えること。
これは教えてくださる方が周りにおられるときでもいえることです。
int mainじゃない本は投げ捨てろとかいろんな意見があるとは思うが、 俺としては、そういうところではなく、索引がない本は全て投げ捨ててよいと思っている。
質問です。 for(i = 0; str[i]; i++); と記述した場合、この条件文はどういう意味になりますか。 無限ループになってしまうと思うのですが。
>>595 iを0に初期化し、以後str[i]が0と比較して等しくならない間、処理を実行し、iを1増やすことを繰り返す
無限ループになるかならないかはstrの指している領域に入っているデータによる
>>595 i が増えていって、いつか str[i] が 0 になったら、終わると思うが
598 :
595 :2008/12/08(月) 21:45:14
丁寧な回答ありがとうございます。 つまりは、条件文のstr[i]はstr[i]!=0の省略ってことですか? 常識だったらすいません。 条件文をもし a としらa!=0とおなじ意味になるのでしょうか。
>>595 きっと文字列なんだと思うんだけど、
(普通は)文字列は最後に'\0'、つまりは0が入ってるのでそこで終わる
>>598 そうだよ
むしろ a != 0が 真なら1を返して偽なら0を返す演算子といった方が正確
>>595 Cの条件(真偽)判定はすべて、その値を 0 と比較して等しくなければ成立する、というものである。
この場合、おそらくは char であろう str[i] が 0 ('\0')になったときに条件が不成立となり、ループが終了する。
文字列操作にかかわるコードで頻繁に見かけられるこの手のコードは、Cで言う「文字列」が必ず '\0' で終わる、ということに因っている。
str が文字列を指しているかぎり、このループは文字列内の文字をたぶん一文字ずつチェックして、終端に来た時点で終わる。
文字列以外のものを指していたら、どうなるかはわからない。
602 :
595 :2008/12/08(月) 22:03:03
理解しました。 どう考えてもstr[i]だけの条件文の書き方でループを抜けることが理解できませんでしたが、 そういう仕様だとわかったので、すっきりしました。 ありがとうございました。
603 :
デフォルトの名無しさん :2008/12/08(月) 22:51:44
putsとprintfの違いってどこですか?
>>603 前者はフォーマット指定はないが改行文字が補われる。
コンパイラによっては、printf("%s\n", foo)をputs(foo)で置き換える。
605 :
デフォルトの名無しさん :2008/12/08(月) 23:34:10
質問です #include <stdio.h> int iGrobal = 0; int func (int iLocal) { iLocal++; iGrobal++; if (4 < iLocal) { return iLocal; } func(iLocal); printf("iGrobal=%d, iLocal=%d\n", iGrobal, iLocal); return iLocal; } int main() { int iData = 0; func(iData); return 0; } このプログラムなのですが、どういう動き方をしているかが理解できません。 特にiLocalの出力結果が4,3,2,1というように減っている辺りがさっぱりです。 どなたか分かり易く解説をして頂けませんか?
>>605 まず
グローバル変数とローカル変数の違いはご存知でしょうか?
funcの中でfuncを呼び出しているところがポイントだよ
func()内のiLocalの振る舞いに注目。 func(0) ↓ここからfunc(0) func(1) ↓ここからfunc(1) func(2) ↓ここからfunc(2) func(3) ↓ここからfunc(3) func(4) ↓ここからfunc(4) func(5) ↓4を超えているので即終了 ↓func(4)の残りの処理 printf("%d\n", 4); ↓func(3)の残りの処理 printf("%d\n", 3); ↓func(2)の残りの処理 printf("%d\n", 2); ↓func(1)の残りの処理 printf("%d\n", 1); ↓func(0)の残りの処理 printf("%d\n", 0); ↓main()へ
609 :
デフォルトの名無しさん :2008/12/08(月) 23:43:38
最初に言っておきますが超初心者でありますので暇な人以外はヌルー推奨です。。。 暇を持て余してる人がいれば答えて欲しい。 今から、C言語を学ぼうと思ってるんだけど知識ゼロ。 今まで自分がググって調べた限りでは、 言語でプログラムを組んで、それをコンパイラでコンパイルする。 程度のものしか分からないでいます。。。 なんというか、概念自体が把握出来ていない。 大体分かってるけど、肝心な所が分かってなくてモヤモヤしてるんです。 C言語で組んだプログラムはどのように、どうやって反映されるの?また、C言語でプログラムされた代表的なソフトなんてあります? 自分でも何が分かっていないか分からないのですが、しっかり概念を把握できていない事だけは分かります。 何かに例えてでも構わないですし、C言語の利用方法といいますか…簡単な流れを分かりやすく教えてもらえると助かりますです。。。
611 :
605 :2008/12/08(月) 23:50:39
>>609 適当な入門書でも買うか、ネットの解説サイトでも見つけて、
コードを打ち込んで実行してみればいいじゃん。
>>609 すごくたくさんのソフトがC言語でできているので代表的なものというのは割愛するよ。
反映、というか、おおざっぱに言うと、自分で来んだプログラム(テキストファイル)を、
コンパイラというツールに食わせると、exeファイルが出来上がるの。
exeファイルはダブルクリックしたら実行できるね。
まずコンピュータというもの自体がわかってないだろう
そこらへんのTV、洗濯機、携帯、車、自販機、ATMなどおよそ機械と言えるものの9割くらい。
>>609 その段階でそれだけ知っていれば十分だと思うぞ。
616 :
デフォルトの名無しさん :2008/12/09(火) 00:00:21
>>610 >>612 >>613 >>615 みんな即レスthxです
大体のプログラムがC言語で出来ていて、代表的だという事なのかな。。。
C言語で使うstrcpy、printfなどの「単語」一覧、みたいなものが集約されたテキストやサイトが存在するのですか?
それと自分はhtmlが大体分かるのですが、C言語とそれは似ているものなのか、それとも全く異なるものと認識していた方が学び易いのでしょうか?
どうしてもhtmlの概念に当て嵌めようとする為、それが原因で分かりにくくなっているのかと思ったり。。。
無知によるスレ汚し申し訳ないです
>>609 プログラム自体も一つのファイルなのはわかるかな?実行ファイルと呼ばれることもあるね
そこにはコンピュータ(CPU)に対する一連の命令が書かれている
「プログラム(実行ファイル)を実行する」というのは、使っているコンピュータに対して
「このファイルを読み取って、そこに書かれているとおりのことをやりなさい」と言うことを意味する
ただし、その命令というのは、コンピュータが理解しやすい表現で書かれている
具体的に言うと数字の羅列で書かれている
これはちょっと普通の人間にはとても読めないし、
読めてもどういう働きをするのかは簡単にはわからないし、
書くとなればそれこそ容易じゃない
そこで、「人間が理解しやすい表現で書かれたファイル」を
「コンピュータが理解しやすい表現で書かれたファイル」に変換するプログラム、というものが生まれた
これがコンパイラで、人間は人間が理解しやすい表現、
いわゆるプログラミング言語と呼ばれるものでプログラムを設計することができるようになった
Cはそのプログラミング言語の一つ
「C言語でできている」というのは「C言語を使って開発した」という意味であって、
コンパイルされた実行ファイル自体には、もはやC言語は関係ない
興味があるならアセンブラやインタプリタについても調べてみること
>>616 もちろんその手の本だってある。
自分が持っているのはちょっと古いけどANSI C言語辞典の初版。
ところでJavaScriptはやったことないの?
プログラミング言語に分類されるという点で、HTMLより遥かにCに近いんだけど。
>>616 >html
人間が読むことができる、という点では共通しているがそれ以外ではまったくの別物
htmlはプログラミング言語ではなく記述言語で、文書の意味付けや表現方法をコンピュータに指示するためのもの
621 :
デフォルトの名無しさん :2008/12/09(火) 00:32:46
>>617 >>619 なるほど、ではまずそれの下準備を整えてから学ぼうと思います…ありがとう!
因みにJavaは学んだ事無いです。。。
>>618 >そこで、「人間が理解しやすい表現で書かれたファイル」を
「コンピュータが理解しやすい表現で書かれたファイル」に変換するプログラム、というものが生まれた
これがコンパイラで、人間は人間が理解しやすい表現、
いわゆるプログラミング言語と呼ばれるものでプログラムを設計することができるようになった
Cはそのプログラミング言語の一つ
「C言語でできている」というのは「C言語を使って開発した」という意味であって、
コンパイルされた実行ファイル自体には、もはやC言語は関係ない
非常に分かり易い説明感謝です、
自分はそもそもの部分を履き違えていたみたいです。。。
>>620 なるほどありがとです。超簡易表現するとhtmlは表面上の見た目を弄る、C言語を始めとするプログラム言語は内部からその全てを弄るものという解釈で問題なかったです?
それと、最後に無知にご教授下さいませです。
>>618 で仰っていたようにC言語を使い開発したプログラムがあるとします。
それによりコンパイルされた実行ファイルを、他の言語で添削する事は可能なのですか?
>>618 でコンパイルされた実行ファイル自体には、もはやC言語は関係ないとあったのでそう解釈しました。。。
それとも、C言語で開発した実行ファイルはC言語で構成されている為、当然それを用いて添削する。が正しい認識でしょうか?
622 :
デフォルトの名無しさん :2008/12/09(火) 00:35:06
自分で試せ、と自分でも強く思うのですが なにしろ初心者なものでその段階まで到達できずにいますです。。。 申し訳なすです
623 :
デフォルトの名無しさん :2008/12/09(火) 00:58:38
>>621 コンパイルされた実行ファイルは普通は機械語と言う言語の文になっています
この機械語がコンピュータ(CPU)が唯一理解できる言語です
これを添削するには逆アセンブルという作業をしてアセンブリ言語ですることになります
しかし普通はこんなやりかたしません
添削したいのならコンパイルされる前のC言語のプログラムを添削すればいいからです
そして修正する事があれば修正してプログラムが完成したらコンパイルして
コンピュータが実行できる機械語のプログラムに変換して、実行ファイルを作って完成です
つまり添削するのは実行ファイルではなく、コンパイルされる前の
C言語のプログラム(これをソース(原始)プログラムと言う)ファイルです
>>621 待て、Java ≠ JavaScriptだ。似て非なるものどころか似てもいない。
>>622 なぜ試せない?
PC初心者だと思う―Yes→専門学校・大学にはPC初心者未満がごろごろしているから気にすんな
↓No
PCを持っていない―Yes→入手しろ、中古でもまあ何とかなる
↓No
やる気がない―Yes→ご冗談を、それならこのスレに来ていないだろ
↓No
おめでとう。入門する資格は十分だ。
>>594 同意しますが、K&Rにしても索引の質はもう一つですね。これって和訳は日本独自なんでしょうかね。
627 :
デフォルトの名無しさん :2008/12/09(火) 02:04:11
俺も初心者だぜ しかも中卒の中年だぜ まだHello worldしか書けないぜ 記憶力が3日しかもたないからHello worldから抜け出せないんだぜ
さすがにそれはあきらめろ
Good night world. に進んでみるのはどう?
>>627 80才過ぎてから中国語を勉強して、そこそこしゃべれるようになる人もいる
から中卒だの中年だのは関係ない、記憶力が3日しか持たないのはあまり
やる気が湧いてないからだよ
プログラム言語では45歳すぎてからCOBOL覚えて社内(100人ぐらいの会社)システム作って運用
してる人(45歳までただの事務職(と言っても総務部長)でまったくのプログラム未経験者)もいる
やる気さえ持続すれば50才過ぎても覚えられるとは思う
専門書などを1回読んで分らなければ10回読む、10回でだめなら100回読む
ぐらいのやる気があって、その勢いが持続すればだけどね(ちょっとだけ極端な言い方だけど…)
631 :
デフォルトの名無しさん :2008/12/09(火) 03:49:52
質問しておいて亀レスごめん。。。
>>624 なるほど、では基本的にC言語で構築したプログラムはC言語で添削
と考えておけば問題なさげですね。詳しく、本当感謝です。
>>625 JavaScriptだね、これも同じく学んでいないです。。。
ありがとう!今から基本からしっかりと学んでいきます。
自分は時間的な猶予が限られているのでこれから独学で学ぶつもりです。
その中でまた壁にぶち当たったらここで質問させてもらうね、みんなありがとうです!
>>630 だよな。
記憶した個々のことを頭の中で組み立てて「きっと、こうなるはずだ」と考え、
それを試して「よしよし、考えたとおりだ」とか「何がまずかったのだろうか」と
ちゃんと顛末を確認できれば年齢なんて関係ないぞ。
>>631 俺も未だにポインタでつまずいているプログラム初学者だけど一緒に頑張ろう
いろいろな言語の事調べてきたが、C言語が一番わかりやすいと思うよ
俺もなかなか時間取れなくていっこうに上達しないけど趣味の一つとして末永くC言語と付き合っていこうと思う。
634 :
デフォルトの名無しさん :2008/12/09(火) 04:30:21
>>632 そうそう、そういう風に出来るか否かが問題で、学歴や年齢は関係ないよね
20歳でそういう風に出来ない人と、50歳でそういう風に出来る人では
確実に50歳でそういう風に出来る人が勝つからね
俺が思うに最近の若者ってそういう風に自分で考える事ができない人が
やたら多くなって来てると思うけどどうなんだろ
まさか近い将来、若者にはプログラミングは無理とか言われるように
なったらどうしようとか心配になったりするんだよな
>>634 これからはそういう若者にいかにわかりやすくプログラミングを教えるかが
問題になってくると思われる
中高年の人や自分で考える事が出来ない若者をうまく教育してプログラマー
に出来る会社が次の勝ち組になるだろう
プログラマー不足はまだまだ続きそうだ
>>635 「わかりやすく教えられる」ということは、物事を順序立てて説明できることはもちろんの事、
いかに相手の理解の進度を肌で感じ取って、歩調を合わせられるかも肝心だよな。
>>636 それが結構難しい
特にプログラマーにそれが出来る奴が少ない気がする
次の勝ち組の道はかなり険しそうだね
教えてください unsigned int POINT1=0; unsigned int POINT2=0; unsigned int POINT3=0; unsigned int POINT4=0; unsigned a,b,c,d,e,f; と宣言部で宣言して、 if(e==1 && d==0){ a++; POINT1 = a; e=d; if(a==0x0a){ a=0;b++; POINT2 = b; } if(b==0x06){ b=0;c++; POINT3 = c;} if(c==0x0a) c=0;f++; POINT4 = f;} if(f==0x06) f=0; } と、割り込みの関数内で記述したところ warning: type defaults to 'int' in declaration of 'POINT1' error: conflicting types for 'POINT1' error: previous definition of 'POINT1' was here ←宣言部の行のエラー というエラーが出たのですが、 何の矛盾なんでしょうか?
とりあえずネットサーフィンの独学二週間で「宿題スレ」にある問題とかで 自分でも組めそうな簡単な問題探してプログラミング組んだりしているんだけど やっぱ問題集みたいな本買った方がいいんかな?
問題集は正直要らないと思う。 作りたいものがあるならそれに必要な知識や技術を学べばいい。 それがないなら宿題スレの自分が組めそうに無いものを調べながら作れば上達するんじゃね?
>>635 実際に教えた経験から言うと、言語仕様は理解しているのに要求を実現できないって奴のほうが困る
>>638 辞書ぐらい引け
簡単に言うとPOINT1の多重定義が原因だから自分で探せ
見つけて欲しいなら全ソースを貼ること
643 :
638 :2008/12/09(火) 13:32:50
>>642 ありがとうございます。
代入しているつもりが定義になっていました
初歩的な質問で申し訳ないです。
644 :
デフォルトの名無しさん :2008/12/09(火) 14:02:45
Cに限らないかもしれませんが、 エラーの返し方の定石みたいなものはあるんでしょうか? 具体的には、関数を作ってエラーの種類と処理したデータを分けて 返したい場合、どちらをreturnして良いのかわかりません。 エラーの種類はグローバル変数に入れて、 処理したデータをreturnするのが良いのでしょうか? それとも、エラーをreturnして、ポインタで渡された変数を書き換えることで、 処理したデータを返すべきなんでしょうか?
真偽を判定する関数:真なら1、偽なら0を返す 何かの処理を行って、エラーが起きたかどうかだけわかればいい関数:成功したら0、失敗したらそれ以外の数を返す (特にファイル操作系の関数の場合、EOFを返す) 自然数を返す関数:0以下の数をエラー値として使う unsignedの数を返す関数:負の数をエラー値として使う 浮動小数点数を返す関数:HUGE_VALなどを使う ポインタを返す関数:ヌルポインタを返す 上記で対応できない場合:ポインタを受け取ってそこに書き込む 基本的には標準ライブラリ関数の仕様を眺めてそれに倣うのが良い
>>645 エラーが起きたかどうかだけわかればいいって場合は成功を非0にするだろ。
成功時に0を返すのは、具体的なエラーコードを戻り値にする場合だと思う。
647 :
644 :2008/12/09(火) 15:10:17
>>645-646 丁寧な解答ありがとうございます。
負の数で表すことも考えましたが、将来負の数を使う可能性が0ではないので
エラーを別けておくことにしました。
Cらしくポインタ渡しでいこうと思います。
因みにグローバル変数を使うと、スレッドセーフでなくなるのでしょうか?
そりゃどっちのスレッドのエラーかわからなくなるからな。 スレッドローカルな変数というのもある。
>>646 ところがどっこい
そういう決まった処理をする関数では0は「何事もなかった」という意味なんだ
if(fonc()) /*エラー処理*/
みたいにする
一方 Windows は成功時に TRUE を、失敗時に FALSE を戻す関数を作った。
>>646 「0」と「非0」は「偽」と「真」と呼ばれることが多く、これから「失敗」と「成功」を連想する人は多い。
しかしながらCの本来的な考え方においては、これらは「無為」と「有為」を表すものである。
だから、特定の処理を行ってそれが成功か失敗かだけを戻り値として返すような
ほとんどすべてのライブラリ関数は、成功時に0を返す。手持ちのリファレンスを確認すること。
例外は、putc() / fputc() / ungetc() である。これらの関数は成功時に書き込んだ(押し戻した)文字を返す。
>ほとんどすべてのライブラリ関数は、成功時に0を返す。手持ちのリファレンスを確認すること。 「UNIXのシステムコール由来のライブラリ関数の多くは」だろ。 それだって、そんなに多くはないけど。
成功時に1帰す標準ライブラリ関数って何があったっけ
>>651 そもそも成功失敗を返さないライブラリ関数が多数なわけで
>654 >特定の処理を行ってそれが成功か失敗かだけを戻り値として返すような が読めないのか
remove(), rename() ぐらいしか該当するものが無いんだけど。
>エラーの返し方の定石みたいなものはあるんでしょうか? ない?
>>655 読んでたけど、それに当てはまらないputcやらをわざわざ例外として挙げられてたから
勘違いしてたみたい。
バカがいるな
mainの成功は0返すからそれに合わせてる
自分でつくる場合は成功時0、失敗時-1 が多いかな WinAPIは変則だらけでイヤン
エラーチェックなんてしないのが最近のトレンド
Cの次に勉強するとしたら言語は何がオススメ? 就職したとき勉強したCじゃなかったら一から勉強し直さないとだし 企業はどんな言語を使ってるのだろう・・・
気にしなくて良いよ、それでも気になるならマ板に消えろクズ
666 :
644 :2008/12/09(火) 19:49:13
むぅ〜臨機応変に考えないと駄目なんですかね。 状況や自分の好みも踏まえて、よく考えてみます。 ありがとうございました。
成功時0、エラー時非0を返す ・raise() ・remove() ・rename() ・fclose() ・fflush() ・setvbuf() ・fseek() ・fsetpos() ・atexit() エラー時EOF、成功時に文字を返す ・fputc() ・putc() ・ungetc() エラー時EOF、成功時に0以上の値を返す ・fputs() ・puts() 処理系依存 ・system() 特殊 ・setjmp()
-1じゃなくて非0なの?
while(-1 != 0){ printf("うんこ"); }
| 丶 _ .,! ヽ
> ``‐.`ヽ、 .|、 |
゙'. ,ト `i、 `i、 .、″
| .,.:/"" ゙‐,. ` /
` .,-''ヽ"` ヽ,,,、 !
、,、‐'゙l‐、 .丿 : ':、
、/ヽヽ‐ヽ、;,,,,,,,,,-.ッ:''` .,"-、
,r"ツぃ丶 `````` ../ `i、
,.イ:、ヽ/ー`-、-ヽヽヽ、−´ .l゙`-、
_,,l゙-:ヽ,;、、 、、丶 ゙i、,,、
,<_ l_ヽ冫`'`-、;,,,、、、、.............,,,,、.-`": │ `i、
、、::|、、、ヽ,、、. ```: : : ``` 、.、'` .|丶、
.l","ヽ、,"、,"'、ぃ、、,、、、、.、、、.、、、_、.,,.ヽ´ l゙ ゙).._
,、':゙l:、、`:ヽ、`:、 : `"```¬――'''"`゙^` : ..、丶 .l゙ `ヽ
,i´.、ヽ".、".、"'ヽヽ;,:、........、 、、...,,,、−‘` 、‐ |゙゙:‐,
,.-l,i´.、".`ヽ,,,.".` `゙゙'"`'-ー"``"``r-ー`'": _.‐′ 丿 ,!
j".、'ヽ,".、".、"`''`ー、._、、、
>>1 、._,、..-‐:'''′ .、,:" 丿
゙l,"`"`''ヽヽ"`"` ```゙'''"ヽ∠、、、、ぃ-`''''": ` 、._./` ._/`
`'i`ヽヽヽ`''ーi、、、: : 、.,-‐'` 、/`
``ヽン'`"` : `~``―ヽ::,,,,,,,,,,.....................,,,,.ー'``^ ,、‐'"`
`"'゙―-、,,,,..、、 : ..,、ー'"'`
: `‘"`―---------‐ヽ``"''''''""``
>>641 そういうやつって暗記が得意なやつに多いよな
暗記したけど理解できてないから要求をどう実現するか分らないんだろね
想像力も低いようだし
考える力を養わないとどうにもならんだろうね
>>668 そうだよ
ところでfputcとかはなんで書き込んだ文字を返すんだろう
エラー時0というのが無いのだけははっきりしてるな
atoiは不正入力の時0を返すぜ! エラー検知としての意味は無いけど
関数の戻り値も、業務アプリの実務だと単純じゃないよな。 構造体のパラメータで受け取ったりで。 struct Result { int status; char msg[MSG_SIZE]; };
>>671 やはりプログラマは数学が得意じゃないと駄目だな。
直接的に使わなくとも、発想力的に考えて。
>>672 >ところでfputcとかはなんで書き込んだ文字を返すんだろう
putc, putchar がマクロだからだろう。
NULLを返すのは、0と区別していいんじゃない?
mallocはエラー時にはNULLが返るからな。 fputcはエラー時にはEOFが返る。
681 :
680 :2008/12/09(火) 22:35:12
NULLも0だろ実際
0だがfalseとしての0じゃない
>>682 実際の実装じゃなくて、観念的な意味でな
printf("%f\n", 0.9999999); なんでこの実行結果が1.000000になりますか
>>686 その処理系だと小数点以下6桁表示がデフォだからです
>>686 そんな小さいこと気にしてたら大人になれないよという教え
どうしても気になるなら2進数で小数をどうやって表現するかを考えるといいよ
>>688 doubleの定数なんだからまだそれが出る精度じゃねぇだろ
>>686 小数点以下6桁表示で7桁目が四捨五入されるから。
>>676 数学が得意じゃなくても数学が好きなら大丈夫だと思う
数学が得意でも数学が嫌いだと無理っぽい(そんな奴いねーか)
データ受信専用のスレッドを作って以下のループを動かしてる環境で パケット受信したら送信用のスレッドに投げてるんだが,次の受信に備えて bufを0で初期化したいんだけど,pthread_createした後に初期化すると スレッド内のデータも0になってしまうんだけど良い方法ない? while ((n = recvfrom(recv_sock, buf, sizeof(buf) - 1, 0, (struct sockaddr *)&client, &size))) { pthread_create(&send_thread, NULL, (void *)send, buf); }
>>694 常に受信できる環境にしたいので送/受信用のスレッドを作った
一応bufを違うところにコピーする方法で行けそうだけど,同時に受信したら動くのか?
送受信の対応がとれないと違うところがいっぱい必要になるのでは?
送信なんかあっというまだって わざわざ別スレッドをつくるこたあない
698 :
693 :2008/12/10(水) 01:39:56
こいういのってスレッド化しないものなのか? セオリー的なものがまだ身についてないな・・・
受信と送信が完璧に同期する必要があるならスレッド化しないほうが楽だろ それでもスレッド化しなければならない環境要因があるならそれはなんとか頑張るしかない まあバッファコピー自体はたいして時間かからんだろう?
>>695 受信スレッド何個あるんだ?1個なら同時に受信つっても同時に処理されるのは1個だけだ。
受信、送信スレッドで分けることが必要な場合もあるが、その場合は最初から送信スレッドも起動しておけば良い。受信してから作る意味がわからん。
701 :
デフォルトの名無しさん :2008/12/10(水) 03:25:31
-128〜127の範囲の計算ならchar型の変数に数値代入してもいいのですか?
charが符号ありの場合、有効範囲は-127から+127、 charが符号なしの場合、有効範囲は0から+255。
小文字を大文字に変換して出力するという問題で int main(void) { char *str="AbcDefGHijk1234lmNOP"; while(*str!='\0'){ if(islower(*str)!=0) *str=*str-'a'+'A'; str++; } printf("%s\n",str); return 0; } このようにプログラムしても何も文が出てこないのは何故なんでしょうか?
文字列リテラルを書き換えるな
書き換えるのがダメなら
>>703 のように、文字型配列の一部を変換→出力という問題自体がダメという事ですか?
文字型配列の一部を変換なら
char str[]="AbcDefGHijk1234lmNOP";
でなければならない.
で
>>703 のコードが何も出力しない(ように見える)のは,
while() を抜けた後で str がどこを指してるのかを考えれば自ずとわかるはず
707 :
デフォルトの名無しさん :2008/12/10(水) 14:19:43
複雑な構造体のメンバのアドレスを取得するには、どう書けば良いのですか? pstructa->pstruct1->member のような長い名前を何度も書きたくないので、 ローカルで短い名前のポインタを使いたいのですが、 &をどこに書いたら良いのかわかりません。 p = &(pstructa->pstruct1->member); こうでしょうか?
うん
すみません、プログラムは正常に動作するのですが、答えがこれで本当に合っているのか(計算がややこしい・・・)不安なので質問させてください。 #include<stdio.h> int uruu_doshi(int year);//関数プロトタイプ int xyear,xmonth,xday; //一方の日付 int yyear,ymonth,yday; //もう片方 int x_total,y_total; //それぞれの合計日数 char month_day[100] = {31,59,90,120,151,181,212,243,273,304,334,365};//1月〜12月までの日数 char line[100]; //入力行 int uruu_doshi(int year){ int uruu_result; //計算した閏年の数 uruu_result = (year/4) - (year/10); return(uruu_result); }
int main(){ printf("1つめの日付を入力してください。例:1995年6月10日半角スペースで区切る 1995 6 10\n"); fgets(line,sizeof(line),stdin); sscanf(line,"%d %d %d",&xyear,&xmonth,&xday); printf("2つめの日付を入力してください。ただし、1つめの日付よりも後の日付にしてください。"); fgets(line,sizeof(line),stdin); sscanf(line,"%d %d %d",&yyear,&ymonth,&yday); /* 年合計+month_day[]から日にち合計を取り出す+日 */ x_total = ((xyear * 365) + month_day[xmonth - 1] + xday); y_total = ((yyear * 365) + month_day[ymonth - 1] + yday); /* 閏年関数からの返り値を、各_total変数に代入 */ x_total += uruu_doshi(xyear); y_total += uruu_doshi(yyear); /* ・出力 ・printf内で合計日数の差を求めている */ printf("%d年%d月%d日と%d年%d月%d日の日数の差は%d日です\n",xyear,xmonth,xday,yyear,ymonth,yday,y_total - x_total); return(0); }
>>706 回答ありがとうございます。
調べてみたんですが
char *str="AbcDefGHijk1234lmNOP"; (文字列リテラル)
char str[]="AbcDefGHijk1234lmNOP"; (文字型配列)
文字列リテラルと文字型配列は似ている様で結構違うんですね。
>>709-710 特に気になるのが、uruu_doshi関数内の、
uruu_result = (year/4) - (year/10);
これで、閏年の数を数えれているのかが心配です。
>>709 閏年の年は日数 (month_dayのやつ) が2月以降1ずつ増えると思うんだが
>>713 それを、閏年関数(int uruu_doshi)の値を合計日数に足すってことで代用しようとしてみたんですが、間違えてますか?
>>714 いや、閏年でも1月の日数は増えないので、2月以降という条件分岐がどこかに必要なはず
3月以降だろう
>>711 char *str = "abc";
とは
char str[] = "abc";
char *p;
p = str;
のpと同じになる
ならねーよ.
>>711 も文字列リテラルと文字型配列は違うと理解したのに
なんで同じになるんだよw
wwwww草
"AbcDefGHijk1234lmNOP"が文字列リテラルじゃないのか?
>>718 いやたいして間違ってないぞ
おまえらはなににそんなこだわってんだ?
所詮メモリの話で
主な利用意識は同じだろ
>>文字列リテラルと文字型配列は違う 一から勉強してこいかす
ここにいるやつらに細かいこといってもしょうがないだろjk・・・ 初心者が初心者に教えてるんだから
上級者でごめんね
中級者でごめんね
勘違いするってのはそもそもc言語の仕様をわかってない初級者でだな・・・ neetでごめんね
そもそも文字列リテラル(へのポインタ)をchar * strに代入すべきじゃない。 const char * strに代入すべきだ。
>>732 const char * const str のほうがよくね?
やさしいC第3版という本で勉強していますが代入演算子について質問です。 この本には「a = b = 1と記述した際はa = (b = 1)の順番で評価され、 まずbに1が代入され、続いてaにも1が代入されます。」とありますが b = 1 で b に 1 が代入され a = b で bが1を返すから a = 1 となって aに1が代入されるのですか? それとも、=演算子が右のオペランドを返すから(b = 1)という式が 1を返し、a = 1となってaに1が代入されるのですか? 私は後者だと推測しているのですがよくわからないのでご教授お願いします。
b = 1 が b の値を返すからだよ
>>735 つまり前者が正しいってことですか?
>>736 後者が正しいということですか?
早くも躓いてしまいました。大変失礼ですが、
もう少しわかりやすく説明して頂けるとありがたいです。
まずb = 1が処理される その次にa = bが処理される だから前者
ITProに書いてあったんですが、C++はCの上位互換って本当ですか? そうは教わらなかったんですけど。
釣れますか、釣られますか。 いや、値は返さないと思うんだけどなぁ。 operand1 = operand2 のとき、副作用が代入で、評価値が代入後のoperand1の値になる。 a = b = 1; の場合、仮に(a = b) = 1;という評価順となると代入後のaの値に1を代入することになるのでエラー。 つまり、a = (b = 1);の順で評価される。 ここで、b = 1の評価値が代入後のbの値(1)であるので、それがaに代入される。 代入という副作用によって評価された値が、数値の1だっただけでその評価値がまた代入に使われている。 昔は、ポインタの代入でうまくいかなかったことが、いやなんでもない。
742 :
デフォルトの名無しさん :2008/12/10(水) 20:14:46
数字を何個か入力して 最大の数字を表示するプログラムを教えてください do whileかfor使います
#include <stdio.h> int main(void){ }
>>739 ほぼ上位互換だけど、いくつも違う点がある。
C のプログラムがそのまま C++ で動くこともあるけど、
そうでないこともある。
CはC++の上位互換
>>734 後者が正しい。
「式が値を持つ」というのがCの特徴の一つで、この場合の式はb=1のこと。
この式の値が1となり、さらにそれが=演算子によってaと演算される。
式が値を持つのはC以外の言語でも普通の事だな。 代入が文でなく式である事がCの特徴。
環境変数を取得するにはどうすればおk?
int main(int argc, char **argv, char **envp) envpで調べるといいかも。 Windowsはどうなのか知らない
752 :
デフォルトの名無しさん :2008/12/10(水) 23:58:22
double型でa[3][3]を定義して、 scanf("%lf", a[0][0]); scanf("%lf", a[0][1]); scanf("%lf", a[0][2]); scanf("%lf", a[1][0]); scanf("%lf", a[1][1]); scanf("%lf", a[1][2]); scanf("%lf", a[2][0]); scanf("%lf", a[2][1]); scanf("%lf", a[2][2]); ってしたものをコンパイルした後、 1つ目の入力の直後にクラッシュしてしまうんですがどうしてですか。
&a[0][0]
755 :
デフォルトの名無しさん :2008/12/11(木) 11:05:34
>>752 int i, j;
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++) scanf("%lf", &a[i][j]);
C言語ってどこで使われてるの?
世界中で
>>756 一番簡単な例を上げるとPS以降のゲームとか
windowsはいくつぐらいまでC言語で出来てたの?
ファンタシ-シタ-はマークIII版? 確かに大容量ゴールドカートリッジだったから 高級言語でないと開発大変だろうね
10才ぐらいじゃね
763 :
デフォルトの名無しさん :2008/12/11(木) 17:50:44
C言語の開発環境何使ってる? VS2008でC言語使うのいちいちめんどくさすぎるんだけど。 他のみたく文字列打ったとき色づけもされないし不便すぎて参ってます
お?VS2008ってCのシンタックスハイライトされないの? なんかの間違いじゃなかろうか。 にしてもVS使うのが面倒だと思うならエディタで書けばいいじゃない、と思うんだけど。
766 :
734 :2008/12/11(木) 19:25:39
>>738 >>740 >>747 >>748 結局どちらが正しいのかわからないのですが。
後者でいいんですよね?
もう一つ質問させて下さい。
printf("%f", 5.0 / 3);
この時5.0や3は何を意味していますか?
5.0はfloat型かdouble型ですか?
それとも型の概念は無く小数として扱われるのでしょうか。
小数とかいう概念も無くただ「値」として扱うのですか?
3についても同様です。
この辺わからないのでお勧めの書籍があれば教えて下さい。
今はこの本を終えた後「C実践プログラミング」を買おうと思ってます
5.0 はdouble型です 3 はint型です
'\0' もint型です
5.0f はfloat型 3L はlong型
printf("%d", sizeof( 5.0 )); は8と表示されるだろう printf("%d", sizeof( 5.0f )); は4と表示されるだろう
NULLはint型かもしれません、違うかもしれません
772 :
766 :2008/12/11(木) 20:07:23
ちゃんと決っていたのですね。ありがとうございました。 char ch; ch = 65; ではこのコードは代入の時に暗黙的にintからcharに変換していると いうことなのでしょうか。そろそろ厚かましいですかね。
Cで人を救えますか
救えますよ プログラマは救われませんけどね
やっぱりプログラマは人じゃなかったんだ
士農工商犬プログラマ、って言葉を聞いたのは何時だったか……。
778 :
デフォルトの名無しさん :2008/12/11(木) 23:43:30
ポインタpが配列要素a[2]をさすようにした場合p[-2]みたいに添え字の中身をマイナスにしてもいいのですか?
>>778 問題ありません
説明としてはa[2] は *(a + 2) と書き方が違うだけにすぎないからです
781 :
デフォルトの名無しさん :2008/12/11(木) 23:59:54
ありがとうございます
標準ライブラリ関数の書式で int puts( const char *string ); char *gets( char *buffer ); のように関数名の前に *が付いているのと付いていないのがあるが違いが良く分かりません。 *putsやgetsではダメなんですか?
>>782 戻り値の型が違う。puts()は整数を返すが、gets()はポインタを返す。
それはさておき、gets()は使用禁止。
これをコンパイルしたEXEファイルが120KBくらいになったんだけど何故? #include<stdio.h> int main() { int a; printf("hello\n"); scanf("%d", &a); printf("%dと入力されました\n",a); return 0; }
BCCで65KBなんだけど、なぜ?
↓以下、Win32 や Mac OS X での報告が続く。
VC++6.0です
コンパイラの性能やリンクするライブラリ、ファイル形式、OS、CPUなどなど オブジェクトの大きさの要因は多岐に渡ります。
開発環境によって、生成されるバイナリーデータのファイルサイズに差はあるよね。 VC++でやると、他と比べて妙に大きいような・・・。色々とリンクされているせい?
>>782 int puts()
これは、puts()がintであって、putsはintになる(つまり、intを返す)関数であるという意味の宣言
char *gets()
こっちは、*gets()がcharであって、gets()がcharへのポインタであって、
getsがcharへのポインタになる(charへのポインタを返す)関数だということ
関数の再帰呼出しで void Kaiki(int n) { if(n>1) Kaiki(n-1); ・・・(1) printf("%3d",n); ・・・(2) } (1)で引数n個分のKaiki関数を呼び出すのは分かるんですが (2)の処理の流れがどうなっているのかが良く分かりません 何故(2)が引数の数だけ実行されるんでしょうか?
呼び出した後、帰ってきたら、printfが実行されるだろ printfにはifもelseも付いてないんだから、Kaikiが呼ばれればそれは必ず実行される n回Kaikiが呼ばれてるのなら、printfもn回実行されてないとおかしい
ちょっと前に同じ様な質問あったんですね。失礼しました
>>795 分かりやすい解説レスを教えてくれてありがとう
割り算の結果を小数点以下50くらいまで表示したいのですがlong doubleを用いても途中で切り上げられてしまいます。 何か方法はないですか?私の書いたプログラムはこんな感じです。 #include <stdio.h> int main(void) { int x,y; scanf("%d",&x); scanf("%d",&y); printf("%50.49Lf",(long double)x/y); return 0; }
デフォルトの浮動小数点数精度を上回る精度を出したいなら、 処理系ごとの方法を使ってより精度の高い実数型を使用するか、 あるいはそのための高度数値計算用ライブラリを導入するしかない
>>797 そもそも long double 自体がそこまでの精度を持っていなく、
あってもせいぜい 19 桁くらいなのでその方法では無理
>>797 単なる整数の割り算でいいなら自分で計算アルゴリズムつくれば?
紙に書いてやるのと同じ
printf("%d.", a/b);
for(i=0; i<50; i++){
a = 10*(a%b);
if(a == 0) break;
printf("%d.", a/b);
}
putchar('\n');
そういう手間がいやなら
>>798
801 :
797 :2008/12/12(金) 18:34:14
やべっ、charにsizeof(int)にしちゃったw
804 :
797 :2008/12/12(金) 18:59:26
>>802 すばらしい。
私もこんな完璧なプログラムをかけるように頑張ります。
>>805 if(y==0 && x*y<0) return 1;
if(n<1) return 1; if(y==0 || x*y<0) return 1;
一貫性を持つようにしたい。 freeするならする、しないなら徹底してしない。 callocは if(y==0) return 1; 後の方がいい。 一箇所で出来る処理は一箇所で行う。 for(i=0; i<n; i++) { carry=x%y; 好みだが、最後にprintf("\n");欲しいな。
char *a; a=calloc(n,sizeof(int)); これはなぜ?
ファイルの読み書きで、 入力ファイル = ABCDEFGHIJ… とあったときに、 Dまで読み込んで出力ファイルに書き込んだとします。 その後、同一プログラム内でもういちど入力ファイルを読んだ場合、 Eから読み込むという形になりますか?それともファイルの先頭からですか? もし後者であれば、前者で処理する方法を教えてください、お願いします。
>>813 Eから読み込みます。
いったんファイルをクローズして再度オープンして読むと先頭から。
>>813 入力ファイルをクローズしなかったら、続きから読み込みになるよ。
クローズして再オープンしたら先頭から読み込みになる。
ftell()とかで、読み込み位置を取得してそれを取っておいて、
再オープンしたときにfseek()で、またそこにファイルポインタを
もどせば続きから読める。
課題で摂氏で入力して華氏に変換して表示するプログラム作ったんだが main() { int number; double f; printf("摂氏を入力"); number = getchar(); F = (9.0/5.0) * number + 32.0; printf("F = %d\n", F); } 5を入れても0になったり1・・・になったり、 メチャクチャな数字が出るがどうすればいい?
getchar が何をする関数か調べるといい
>>816 >number = getchar();
これを
fgets(s, sizeof(s), stdin);
number = atoi(s);
にする。
char s[100]; の宣言も必要。
>>816 numberは文字の数字のままだから、それを整数値に変換する必要がある
F = (9.0/5.0) * atoi(number) + 32.0;
でいいんんじゃまいか
821 :
819 :2008/12/12(金) 23:40:24
たしかにorz
>>814 ,815
ありがとうございます。わかりやすかったです!
ということは出力ファイルもクローズしなければ続いて書き込めると考えて大丈夫ですか?
うい。 んで、書き込み位置を変えたければ fseek で移動すればいい。
>>823 助かりました、どうもありがとうございました。
>>815 「Dまで読んだ」ことをアプリケーション側で把握できているのだから、ftell()は感心しないな。
一度クローズしてしまったファイルを再度オープンしたときに全く変わっていないことを保証するのは
ロジックでは不可能だし、運用上も大きな制限となりかねない。
826 :
816 :2008/12/13(土) 00:19:14
sscanf を調べれ あるいは strtod
>>825 変わっているか変わっていないかってそれこそ運用の問題だろ。
fopen()でオープンしたら、閉じなくても、ファイルが変わらない保証なんてないし。
>>828 いいえ、まともなOSならオープンしているファイルが勝手に変わらないことを保証してくれます。
尤も、ブロックデバイスであることを保証してくれるわけではないのでいつでもシークできるわけではないのですが。
いやいやいやいや。 共有制御なんて fopen ごときがやってくれないぜ。
>>829 適当なこと言うなよ。
最近、しったかで断言するやつよく見るな。
いやいや、VCならロックオープンが基本だし、Unixはオープン中のファイルは削除されないから。 # 見掛け上は削除されても実はドライブを占有したままになる。
適当なことをいうもんじゃないよ・・・ #include <cstdio> int main() { FILE* file1 = fopen("hoge.txt", "w"); FILE* file2 = fopen("hoge.txt", "w"); printf("%p %p\n", file1, file2); if(file1) fprintf(file1, "hoge"); if(file2) fprintf(file2, "foo"); if(file1) fprintf(file1, "bar"); if(file1) fclose(file1); if(file2) fclose(file2); } 出力 10311448 10311468 hoge.txt の中身 fooebar コンパイラ VC++2008EE
>>832 実験しました。
VCで数キロくらいのテキストファイルをオープン。
10バイトほど読み込み。(ファイルはオープンしたまま)
同じファイルをテキストエディタで開いて、内容を1バイトにして保存。
プログラムでリードを再開するとEOFが返ってきました。
変更可能ですね。
突然 「fopen_s のことに決まってるだろ」 とか言い出すに一票
これは失礼。fopen()でロックが掛かると思っていたのが間違いだったようだ。 普段使わん環境については黙ってた方が無難だったな。
>>836 ま、そういうこともあります。話題を提供してくれてサンクス
>>833 なるほど、hogeとbarはバッファリングされたまとめて出力されているな。
fclose()の順番を変えてしまうとhogebarになるよ。
fopen_s のことに決まってるだろ
>>810 っても年収600万弱っていいなあとおもうよ。
便乗して、適当なこといわないでよ。。。 #include <stdio.h> int main() { FILE* file1 = fopen("hoge.txt", "w"); FILE* file2 = fopen("hoge.txt", "w"); printf("%p %p\n", file1, file2); if(file1) fprintf(file1, "hoge"); if(file2) fprintf(file2, "foo"); if(file1) fprintf(file1, "bar"); if(file1) fclose(file1); if(file2) fclose(file2); } 出力 0x9845008 0x9845170 hoge.txt の中身 fooebar OS CentOS release 5.2 (Final) コンパイラ gcc4.1.2
もういっこ。 #include <stdio.h> int main() { FILE* file1 = fopen("hoge.txt", "w"); if(file1) fprintf(file1, "foo"); system("rm hoge.txt"); if(file1) fprintf(file1, "bar"); if(file1) fclose(file1); } 実行後、hoge.txtはなかったよ。 OS CentOS release 5.2 (Final) コンパイラ gcc4.1.2
>>842 そりゃぁ、rmした段階でエントリはなくなるんだから。実体が残り続けるってだけ。
試しに、巨大なファイルをオープンしておいてからrmして、その前後のディスク容量を較べてみ。
更に、ファイルをクローズしてからdfしたら何が起きているか判ると思う。
ファイルをオープンしてから削除しておいて作業ファイルとして利用し、クローズすると同時に消えてなくなるって言うのは昔から常套手段だよ。
fopenするだけでロックかかるのってどの環境?
Cの給料安いなオイwww
>>846 そりゃC言語じゃ大したこと出来ないしな。
多層基板にLSIモジュールで組み立てる時代(.NET & C#)に、ラグ板に
ちまちまと抵抗やコンデンサを半田付け(C言語)をするようなものだし。
848 :
デフォルトの名無しさん :2008/12/13(土) 17:35:10
ファイルから16bitモノラルのWAV音声データを読み込んでクロスフェードをかけるプログラムを 作っているのですが、つまづいてしまいました。 1サンプルごとに読み込んで、先頭nサンプルまではフェードイン処理、末尾nサンプルは フェードアウト処理を行ってファイルに書き込むところまではできました。 ただそれを重ね合わせる上手い方法が思いつきません。 何か上手い方法があれば教えてください。お願いします。
char str1[] = "mctest"; char str2[] = "mctest"; char str3[] = "a"; printf("memcmp() = %d\n", memcmp(str1, str2, sizeof(str1)+1)); とすると-1がプリントされました。 str3の宣言をコメントアウトすると0がプリントされました。 これはどういうことなんですかね? char example[] = "name"; こういう宣言の仕方したら最後に'\0'が入りますよね? だとしたらsizeof(str1)+1までstr1, str2を比較すると0が返ってくると思うんですが・・・
>>849 printf("sizeof(str1)=%d\n",sizeof(str1));
>>849 sizeofだと、0まで含めてのサイズになるんじゃね?
>>845-851 うお・・・
strlenですよね、この書き方なら。
ありがとうございました!
配列って型ごとに格納できる要素数って違いますよね? int型ならn個まで…とかって決まってるんですか?
違いませんよ
>>854 あ、そうなんですか、格納できる1個あたりのサイズが違うだけなんですね
じゃあ格納できる要素数ってmallocとか使わなければメモリの許す限りなんですか?
ha?
メモリが許しても、コンパイラや OS が許さないかもしれない。
1-1 tarou 170.1 63.0 hanako 158.2 52.1 ・ ・ ・ 1-2 zirou 173.2 72.1 ・ ・ ・ のような内容が書かれてあるテキストファイルがあるとします。 このとき最初のクラス(1-1とか1-2)をある変数に代入した後に 生徒それぞれをデータを取り出したいのですがどのようにすればいいのですか? 最初にクラスのデータ(1-1)を取り出した後に while( fscanf( fp, "%lf%lf", &hight, &weight ) != EOF ){〜 としても次の1-2が来てしまうのでうまくいきません。 ちなみに各クラスの生徒数はファイルオープンしないと分からないものとして うまくいく方法を教えてください。
>>859 fgets()で1行ずつ読み込んで、適宜解析。
861 :
859 :2008/12/14(日) 01:25:31
>>860 具体的にお願いします。
それとまた質問です。
関数 read_fp(FILE fp, int i) 内で
if( fscanf( fp, "%s", class[i]) != EOF ){
while(fscanf( fp, "%s%d%d", name[i][j], &hight[i][j], &weight[i][j]) != EOF){
j++;
}
read_fp(fp, i++);
}
のように再帰的な感じでデータを入力しようとしてるんですが
>>859 の例だと
文字リテラル、"1-2"の順番になっても
while内のfscanfがエラーとしてEOFを返してくれないため
うまくいきません。
アドバイスお願いします。
>>861 再帰にした理由を、えーと、「具体的にお願いします」。
>>859 ■#classタグをつける
#class 1-1
tarou 170.1 63.0
hanako 158.2 52.1
・
・
・
#class1-2
zirou 173.2 72.1
・
・
・
■読み方
strcpy(class, "");
while (fgets(buf, BUFSIZE, fp) != NULL) {
if (strncmp(buf, "#class", 6) == 0) {
sscanf(buf, "%s %s", classtag, class);
} else {
sscanf(buf, "%s %s %s", name, height_s, weight_s);
height = atof(height_s);
weight = atof(weight_s);
printf("%s %s %g %g\n", class, name, height, weight);
}
}
タグ#classをつけないなら fgetss後のバッファに対し n = sscanf(buf, "%s %s %s", s1, s2, s3) nが1ならクラス、nが3なら生徒の身長体重データをみなす。;
865 :
859 :2008/12/14(日) 02:18:11
>>862 1-1の生徒分のデータを入力し終えたら
fscanf( fp, "%s%d%d", name[i][j], &hight[i][j], &weight[i][j]) == EOF
になってwhileを抜けて再帰することで
また最初のifからクラス名と1-2の生徒分のデータを入力しようとしたため。
>>863 学校の課題なので
ファイルオープンするファイルに直接編集することが出来ないんです。
>>864 とりあえずそれでやってみます。
今日はもう眠いのでまた明日の夜くらいに現れると思いますが
その時はよろしくお願いします。
ありがとうございました。
普通は再帰を使うよりもループを使った方がいいケースだな。
まあクラスの数がとんでもないことになったりはしないだろうけど わざわざ再帰にする意味もないよねェ
>>848 素人考えだけど32bitで演算するなら波を足して2で割ったらダメなん?
>>868 波動の重ね合わせは足すだけでよい。2で割っちゃあかん。
>>848 の質問はこういう物理的なことなのか、
それとももっとプログラム的なことなのかわからん。
あぁ〜津波が入り江で高くなるんですもんね 平均してどうする俺orz
津波は関係ないと思うが
海岸が開放端で、反射波との重ね合わせで高くなっているという解釈もできるな。 まあ、底が浅いので高くなっているという解釈の方が普通だが。
質問です while文の条件が複数ある場合、どのように書いた方が解りやすいでしょうか? 例えば、 @aが3かつbが3 Acが5かつdが5 Beが10 @〜Bのいずれかの時while終了 の場合、 while( !((a==3 && b==3) || (c==5 && d==5) || e==10) ) と書くのか while( !(a==3 && b==3) && !(c==5 && d==5) && e!=10 ) と書くのかどちらがわかりやすいでしょうか。
上のほうがわかりやすいと思う !の数が少ないから
gets(buf) のように標準入力から入力するときに、 入力部分にあらかじめ文字列を表示させておくことは可能ですか? たとえば ・入力部分に最初から「cd /」と表示されている ・「/」の後ろから入力することができる ・バックスペースキーを連打すれば「cd /」の部分まで消すことができる ・「cd /home」と入力すればhomeだけでなく全文(cd /home)がbufに取り込まれる のような感じです。
環境依存の方法になるな
>>878 書き忘れていました、すみません。
Linuxです。
>>879 標準関数だけではどうやってもできないから、適当なライブラリでも使ってくれ。
curses だかncursesかねぇ
>>880 ,881
ありがとうございます。
調べてみます
>>877 Linuxならreadlineを使っとけ。
あと、getsは使うな。
cursesってそういうのもできるんだ
できるのかはともかくこのケースで勧めるのは間違ってるよな
>>883 すみません、fgetsを使うようにします。
簡単に作れそうなのでreadlineを使ってみたいと思います。
ありがとうございました。
>>876 ひんと:津波は足し合わせて高さ0になる普通の波とは違う
手元にコンパイラないからあれだけど、 ぱっと見た感じkeyword_editがおかしいんじゃねえの。 明らかにzの大きさ超えて書き込んでるよね。 あまりに読みづらいからもうちょっと整理したほうがいいんじゃないかと思うけど。
>>887 地球の自転でも地震でも波は波
行き場を失った物質の移動が波となる
それは海底や入り江や空気でも反射(反発)する
狭い場所に体積が増えるから高さが増すわけだが
水が増える仕組みは反射によって起きている
入り江で海底や岸に阻まれた波の一部は反射して海面を押し上げる
岸壁でしぶきが上がるのは岩壁に阻まれた波のお釣りが
空中に向かって反射しているから
引力が無ければ雫が宇宙に向かって飛んでいくだろう
×行き場 ○居場所
引力がなければそもそも海が存在できない罠。 つーか、いい加減に板違いだってよ。
理解できたようで何より
char *Strcpy(char *str1,const char *str2) { char *p=str1; while(*str1++=*str2++); return p; } 上の関数で(*str1++=*str2++)の演算子優先順位は調べると (++)→(*)→(=) になるので最初の一文字目のコピーがされないと思うんですが 何故ちゃんとコピーされるんですか?
++が後置だから
演算子の結合順はそれでいいんだけど、++がされるのはそれらの後なので
>>896-897 素早い回答ありがとうございます
優先順位ばっかり気にしていたので分からなかったorz
++が評価されるタイミングって正確にはどのへんなの?
オセロのプログラムを作ろうと思っています。 StateはEMPTY, BLACK, WHITEの列挙体、 盤面には大域変数State Brd[8][8];を用意しています。 ポインタを勉強中なのでポインタを使って盤面の初期化をしたいのですが、 State *p; for(p = Brd; p <= &Brd[Y][X]; p++) *p = EMPTY; このときX, Yには7を入れるつもりだったのですが、 X, Yに12とか不正な値を入れてもエラーが出ません。 配列の外に代入していると思うのですがどうなんでしょう。
Cでは配列外にアクセスしてもコンパイル時にはエラーが出ません。 自分で管理してください。
代入演算子って 右側が先に評価されてから、左側が評価されるんですよね?
>>899 正確なタイミングは決まっていない
式が終わるまで (式の途中に副作用完了点があればそこまで) のどこか
コンパイラの気分によって決まる
>>902 決まっていない
どちらを先に評価するかはコンパイラの気分によって決まる
905 :
900 :2008/12/15(月) 19:20:19
srand(time(NULL))とrand()を使ってランダムな文字列を発生させる関数を作り、 その関数をfor文などで回してランダムな文字列をたくさん発生させたいのですが、 srand(time(NULL))だと短い時間で回すと同じ乱数の種が発生してしまいますよね? どうすれば短い時間で回しても毎回違う文字列を発生させられるでしょうか?
毎回種作らなければいいよ。というか普通は1回しか作らない
あああああそうか!そういわれればその通りですね。 間抜けな質問をしてしまいました。ありがとうございます。
srand は main の最初に1度呼ぶだけのもの。 何度も呼んではいけない。まともな乱数じゃなくなる。
>>897 もうちょっと正確に言うと、値を取り出した後だからだな
911 :
888 :2008/12/15(月) 21:16:48
>>889 keyword_editは問題ないかと、、、
実行するとこんな感じなんですが
Please input keyword
playfair(入力)
p l a y f
i r b c d
e g h k m
n o q s t
u v w x z
Please input sentence
Abandonhopeallyewhoenterhere(入力)
セグメンテーション違反です
>>911 デバッガでステップ実行すればいいだろうが
>>911 コードが汚いのは、関心しないけど。
code1内で初期化されていない変数によってjumpしてるとか愛用のコマンドが言ってくれたので、見てみたら
goto使っているところのif () を{ }で囲っていないみたい。
それをやって、入力文字列を全て小文字にしたら以下のようになると思うよ。
please input keyword
playfair
p l a y f
i r b c d
e g h k m
n o q s t
u v w x z
Please input sentences.
abandonhopeallyewhoenterhere
bhpqrtqenlhpyvaphugqnpnmbggiku
ちょっと聞きたいんだが,クライアント・サーバでUDPでソケット通信を行う場合 クライアントからのメッセージに対してのレスポンスはそのソケットに対して返せばいいけど サーバからメッセージを送りたい場合(複数の端末)はNATがなければホスト名を登録しているので 送信できるけど,NATが間にあるとポートの一致せず破棄される. こういうサーバからメッセージを送る場合があるクライアント・サーバシステムは クライアントから受信したソケットは接続してきた数だけ保持するやりかたをやってるの? それとも他に方法ある?
スレタイを256回音読してください
C言語でやる方法が聞きたいんです
そういうクライアントの例を挙げればいいと思うが、ポートを開けた経験はないの? クライアントが、サーバに対して、俺このポート番号で待ってるから、と伝えておけば そのポートを正しくクライアントにマップしておけば何の問題もない。
(入門篇)という部分に注目すべきなんだろうけど、返事した手前どうしたものやら。
>>916 一般的は方法はない
C言語にはソケットやポートはおろか、通信という概念すらない
要するに環境依存
>>890 ソリトンってしらないのですか?中学生?
921 :
888 :2008/12/16(火) 09:07:44
923 :
914 :2008/12/16(火) 12:41:59
あーちなみに916ではないんで・・・
>>917 ポートをあけるとはNATの?
それが出来ない環境だと,定期的にクライアントがUDPパケット投げてマッピング情報を保持させながら
そのソケットを用いてサーバから送信する方法しかないか・・・
>>923 にほんごはよめますか?
>922がゆうどうさきをしょうかいしてくれていますよ。
>>923 いろいろ分かってないことが多そうに思う。
ネットワークの勉強してから、かな。
>>926 皮肉という言葉の意味は知っていますか?
typedef struct _h h; struct _h { int id h *next; h *prev; }; nextとかprev使わないでリンクリスト作る方法教えてください。 メモリが無駄なのでnextとprevを使わないでポインタのリスト作りたいです
リンクのないリンクドリストって・・・
>>928 prev なくしてタン方向リストにするとか。
きっと、ハイラル各地を冒険しているんだよ
>>928 不可能である。糖分のない砂糖、演算装置のないコンピュータ、文法のない言語は存在しない。
>>928 マジックリストというものがある
nextとprevが一つのポインタですむという摩訶不思議なリスト
まぁ
XOR連結リストの出番だな。 代償に実行速度で物凄く損するだろうけど。
プッチンプリンのプリンがじゃまなので無くしてくださいとグリコに
効率悪いが、値とアドレス等でハッシュ生成
>>928 そういうあなたのために配列があります。
ハイレーツオブ初心者
うるう年の判定でオーソドックスに考えると下のようになると思う return (year % 400 == 0 || (year % 4 == 0 && year % 100)); ただ、大量の日付データを処理する上でもっと高速化できる アルゴリズムがないだろうか
テーブルを使う
y%4!=0 の時点で弾く 以下、y%100!=0 または y%400==0 でおk
>>940 1901-2099年に限定した上で、4年に一度。
945 :
デフォルトの名無しさん :2008/12/18(木) 19:35:24
質問なのですが、 今日の午前0時から、ある作業を何時間しているかを計る(経過時間) プログラムを作りたいのですが、゙今日の午前0時〜゙を どう、表現すればいいでしょうか?time関数を使うまでは わかりました
>>945 time
localtime
mktime
947 :
デフォルトの名無しさん :2008/12/18(木) 19:44:58
サンクスです あとは、自分で考えてみます
948 :
デフォルトの名無しさん :2008/12/18(木) 20:24:41
やはり、わかりません… 1970年の午前0時になってしまいます、今日の午前0時は どう、求まりすでしょうか?
なんかうまく言葉にできないけど、ある程度は考えました どうやれば教えてください
うまく言葉にできないなら1970年の午前0時になってしまったコードを書きなよ
すいませんそれは無理なんです
スイマセン、かなり初歩的な質問だと思いますが、宜しくお願いします。 static GLfloat a[6][3]; void hb(void){ for(m=0;m<6;m++){ normal[m][0]=???; normal[m][1]=???; normal[m][2]=???; } } void dp(void){ //ここにhbの配列normal[][]を使いたいんです。 } でも、普通に「normal[0]」と使っても0.0としか出てきません どうしたらいいのでしょう
いろいろ気になる点は多いが、normal[0][0]と使ってみたらどうなるのか、と聞きたい。
>>953 複数の関数で同じ変数を操作するには、その変数をグローバルに宣言するか、
その変数へのポインタを関数へ与えるしかない
>>954 0.0でした。
>>955 もしかして始めの関数外の配列normalがグローバルになってるからかも知れません
わけわからん とりあえずstatic GLfloat a[6][3];はstatic GLfloat normal[6][3];の間違いでいいんだな? で、hbの中ではどういう値を与えたんだ? ちゃんとdpより先に呼び出したんだろうな?
>>956 はい、aじゃなくてnormalでした。
hbの中のはnormal[6][3]と同じ場所での配列を少し弄った値を入れてます。
今一状況をうまく説明できないのでもうちょっと自分でやってみます 色々すいませんでした。
960 :
デフォルトの名無しさん :2008/12/18(木) 23:20:06
質問です。 入力を、コマンドプロンプトで ”C:\>sample1.exe 10 40 60” と横に空白を空ける感じでやりたいのですが scanf("%d %d %d", n,m,l) であっていますでしょうか?
961 :
デフォルトの名無しさん :2008/12/18(木) 23:22:04
>>960 &つけろよ、 int 型へのポインタだったりしない限りは、 あとスペースは別になくてもいい
scanf("%d%d%d", n,m,l)
963 :
デフォルトの名無しさん :2008/12/18(木) 23:27:40
>>962 ありがとうございます。
では、こうでしょうか?
scanf("%d%d%d", &n,&m,&l) ;
scanfの書式指定にはスペースを入れたほうが圧倒的に良い。 scanf("%d %d %d", &n, &m, &l);
圧倒的とか、良いとか、動作に直接影響がないのに、個人的な主観を言われても 納得させられないよ。自分にとって「美味しい食べ物」が、必ずしも万人に共通するとは 限らないように。
scanf()系の書式は元々空白文字(スペース、タブ、改行)で区切られると言う側面を持っているので 敢えて空白を空けないと言うのも一つの見識だと思う。 少なくとも、根拠も提示せずに「圧倒的」と言われても同意しかねる。
そう、最終的には処理結果が物をいう。
scanf("%d%d%d", &n, &m, &l)とscanf("%d %d %d", &n, &m, &l)のちがいは?
無い
無い。だから、個人的な主観で、圧倒的だの良いって話が、 何を基準にそう言えるのか?って思われるのだよ。自分はそう思う、けど 動作に違いは無い、そう言えば良い。本当に違いが有るなら、説明すべき。
scanf("%s%s%s", a, b, c)とscanf("%s %s %s", a, b, c)でも挙動同じ?
空白文字に対する挙動が違うのは%cだけ
いや、"%[...]"の前後でも違ってくるよ。 あと、"%d"と"%d "も違う。
あ?
8*8の升目を出力するプログラムなんですが、 #include<string.h> #include<stdio.h> char yoko[50]; char tate[50]; int main(){ strcpy(yoko,"*-----*-----*-----*-----*-----*-----*-----*-----*"); //初期化 strcpy(tate,"| | | | | | | | |"); //初期化
/*すごく強引な方法*/ printf("%s\n",yoko); printf("%s\n",tate); printf("%s\n",tate); printf("%s\n",tate); printf("%s\n",yoko); //1 printf("%s\n",tate); printf("%s\n",tate); printf("%s\n",tate); printf("%s\n",yoko); //2 ・ ・ ・ 8まで続く return(0);} これでいちお出力できましたが、あまりに強引すぎるので、もうちょっと技巧的に書けませんか?
繰り返しの処理にはwhileかforを使うといい
printf("%s\n",tate); printf("%s\n",tate); printf("%s\n",tate); printf("%s\n",yoko); このまとまりを、1つのループと考えればできそうですね。 有難うございました。
ああ、次は横方向のループだ・・・
982 :
a :2008/12/19(金) 13:27:54
int i, j, k; for(j = 0; j < 8; j++) { for(i = 0; i < 8; i++) printf("*-----"); printf("*\n"); for(k = 0; k < 3; k++) { for(i = 0; i < 8; i++) printf("| "); printf("|\n"); } } for(i = 0; i < 8; i++) printf("*-----"); printf("*\n");
少数が循環小数だとみわけるにはどうやって判定するん? プロ教えて?
マルチおつ
ウメ
なんか、求めるコードが前に出たような。宿題スレだったかな? 循環し始めたのを確認するのに、前に出た数値を記憶して、 同じのが出た時点でストップ。その区間を表示。
埋め
紀州梅
家の冷蔵庫にあるのは、南甲梅ですが、何か?
平安京エイリアン 埋め
鰯の梅肉煮がたべたいが 鰯がいない… どこへいったんだよ><
>>985 プロに頼むってことは
報酬を出すということだな
いくら出す?
相手を見て言葉を選びなお嬢ちゃん 5000万フェザーだ
ume
ガンガンいこうぜ
いのちだいじに
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。