C言語なら俺に聞け(入門篇) Part 40
レス数が1000を超えています。これ以上書き込みはできません。
教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題を片付けます 118代目
http://pc11.2ch.net/test/read.cgi/tech/1226847424/
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 39
http://pc11.2ch.net/test/read.cgi/tech/1226693085/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
0002デフォルトの名無しさん
2008/11/26(水) 22:16:46ttp://xy.yu.to/ (ここは本来のサイトではないが)
この荒れまくりカオス絵チャのminiっていう部屋の
秘密スペース(枠外)への書き込みってどうやれば
できるようになるのか解析して教えろ。
あと、1人の防衛プログラマーのクリアツールが強すぎて、
荒しプログラマーがことごとく全員返り討ちになってるから
オマエラが面白くしてみろ。
ゲハハハごめんね
0003デフォルトの名無しさん
2008/11/27(木) 00:47:51int main(int argc, int *argv[])
とした時、プログラムを実行して何かを入力するにはどうすればよいですか。
0004デフォルトの名無しさん
2008/11/27(木) 01:03:54どう表記すればいいですか?
0005デフォルトの名無しさん
2008/11/27(木) 01:09:110006デフォルトの名無しさん
2008/11/27(木) 01:11:420007デフォルトの名無しさん
2008/11/27(木) 01:23:26・5の倍数であり、かつ100 の倍数でない。
・500 の倍数である。
0008デフォルトの名無しさん
2008/11/27(木) 01:26:03その二つをどうつなげて一つにすればいいの?
0009デフォルトの名無しさん
2008/11/27(木) 01:27:260010デフォルトの名無しさん
2008/11/27(木) 01:31:10だから、どういう条件で引っ付けるのさ?
0011デフォルトの名無しさん
2008/11/27(木) 01:35:22この式に500 の倍数を追加するの
0012デフォルトの名無しさん
2008/11/27(木) 01:37:24或いは
>・500 の倍数である。
なにか % 5 == 0 && なにか % 100 != 0 || なにか % 500 == 0
20世紀と21世紀の閏年判定なら、
year > 1900 && year < 2100 && year % 4 == 0
0013デフォルトの名無しさん
2008/11/27(木) 01:39:360014デフォルトの名無しさん
2008/11/27(木) 02:19:44一般的な例を挙げれば、コマンドラインから
% exename param1 param2
のように入力して実行ファイルexenameを呼び出したら、
argcは3で、argv[0]、argv[1]、argv[2]はそれぞれ
"exename"、"param1"、"param2"という文字列を指す
(ただしexenameはもしかしたら存在しないかもしれない)
一応言っておくとこれはプログラムを実行するときにコマンドを与えるだけで
実行してから入力しているわけではない
与えたコマンドをどう解釈して何をやるかはプログラムの用途による
まずは何をやりたいのかを決めること
0015デフォルトの名無しさん
2008/11/27(木) 02:37:37そういう甘やかしかたはいくない
0016デフォルトの名無しさん
2008/11/27(木) 08:24:060017デフォルトの名無しさん
2008/11/27(木) 13:32:31#include <stdio.h>
int main()
{
char s;
printf("入力=?"); scanf("%c", &s); /*�@*/
}
上記の�@の後に、ある条件�A〜�Cを与えて
結果が�Cになるまで�@に戻る、と言うプログラムを作成したいのですが、
�@の後にはどのように続ければよいのでしょうか?
簡単に流れを教えていただければうれしいです。
0018デフォルトの名無しさん
2008/11/27(木) 13:41:48�@
�A
�B
}while(�Cが成立しない場合繰り返す);
0019デフォルトの名無しさん
2008/11/27(木) 15:56:07条件�Aと条件�Bを評価だけ行って結果を無視し、条件�Cの結果だけで判定するなら
do {
�@;
} while(�A, �B, !(�C));
0020デフォルトの名無しさん
2008/11/27(木) 16:00:41> �Aと�Bも条件だと書いて
ないよ。与えて、だよ?whileで繰り返すかどうかを決定付けるのは
�Cが成立するかどうか。
0021デフォルトの名無しさん
2008/11/27(木) 16:03:38条件2と3は処理の流れに影響するのか?
0022デフォルトの名無しさん
2008/11/27(木) 16:04:34少なくとも条件�Aは文中にあるぞ
つーか、おまえ本人なら人のせいにしないで訂正しろよ
0023デフォルトの名無しさん
2008/11/27(木) 16:11:18002417
2008/11/27(木) 16:15:22ありがとうございます。早速試してみたいと思います
>>19
�@に何か文字を打って、�Aor�Bを評価をするプログラムにしたいのですが、
「�Aor�Bならば�@に戻り、�Cになったらループを終了する」
と言う感じで作成したいと思っています。
�Aならば正解
�Bならば不正解
�Cに合致した時にループを終了させると言う感じです
初心者なので、何言ってるか分からないかもしれませんが、何かアドバイスがあればお願いします。
0025デフォルトの名無しさん
2008/11/27(木) 16:19:22�@
if(�A||�B)continue;
while(!�C);
0026デフォルトの名無しさん
2008/11/27(木) 16:20:310027デフォルトの名無しさん
2008/11/27(木) 16:21:44�@;
if(�A)printf("正解");
else if(�B)printf("不正解");
}while(!�C);
0028デフォルトの名無しさん
2008/11/27(木) 16:24:47処理の流れ+どういう時に何をやるかは整理をつけるクセをとけよう
漠然と提示されると答えようがないしね
>�@に何か文字を打って、�Aor�Bを評価をするプログラムにしたいのですが、
>「�Aor�Bならば�@に戻り、�Cになったらループを終了する」
>と言う感じ
こう書いてもらえると、こちらも答えやすいし
そちらも思考の何処で詰まっているかが限定しやすいし
0029デフォルトの名無しさん
2008/11/27(木) 16:28:36> 「�Aor�Bならば�@に戻り、�Cになったらループを終了する」
言い換えると「�Aor�Bならば�@に戻り、�Cでなければ�@に戻る」だな?
0031デフォルトの名無しさん
2008/11/27(木) 18:21:12インストールが出来なかったです。
エラーが出てしまいます。
内容を以下にコピペします。
[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]#
これは何を警告しているのでしょうか?
glibc-develも同じく2.2.90-12以上が必要
"needed by"くらい厨房でも理解できるだろ
0033314、31
2008/11/27(木) 18:55:370034デフォルトの名無しさん
2008/11/27(木) 19:53:40道のりかなり険しそう。
ここで iso 落としたほうが早いんじゃない?
ftp://ftp.riken.go.jp/pub/Linux/redhat/archive.redhat.com/redhat/linux/
0035デフォルトの名無しさん
2008/11/27(木) 20:10:16updatedb
を実行し(少し時間かかる)、
locate gcc | less
でそれっぽいのないか探してみたら?
もしくは
find / -name gcc -print
でも可。
0036デフォルトの名無しさん
2008/11/27(木) 20:12:580037デフォルトの名無しさん
2008/11/27(木) 20:44:10ttp://ftp.kddilabs.jp/Linux/packages/fedora.legacy/redhat/9/os/i386/glibc-devel-2.3.2-11.9.i386.rpm
0038デフォルトの名無しさん
2008/11/27(木) 21:53:12「`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,
};
0039デフォルトの名無しさん
2008/11/27(木) 22:14:178,4,3,6,6,
1,6,5,8,4,
5,4,9,1,2,
6,9,6,1,8,
7,4,1,3,5,
};
0040デフォルトの名無しさん
2008/11/27(木) 22:14:55{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}};
0041デフォルトの名無しさん
2008/11/27(木) 22:36:20上手くいきました
回答、ありがとうございました。
0042デフォルトの名無しさん
2008/11/27(木) 22:46:55誰か教えてください
0043デフォルトの名無しさん
2008/11/27(木) 22:49:320044デフォルトの名無しさん
2008/11/27(木) 22:52:51ぐぐれ
まあ>42の言ってることは意味わからんが
0045デフォルトの名無しさん
2008/11/27(木) 22:53:30うまくいかないソースくらい貼れ
0046デフォルトの名無しさん
2008/11/27(木) 22:53:49数学とかで使う普通の配列が1オリジンでa[1], a[2], a[3]ってなるやつです
0047デフォルトの名無しさん
2008/11/27(木) 22:53:571 9 3 1
2 6 4 8
3 1 5 5
こんな感じだとエスパーしてみた。
0048デフォルトの名無しさん
2008/11/27(木) 22:55:18#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オリジンにするだけだと思うのだけど……まったくわからない
0049デフォルトの名無しさん
2008/11/27(木) 22:57:52#define ORIGIN1(matrix, row, col) matrix[row-1][col-1]
0050デフォルトの名無しさん
2008/11/27(木) 22:58:300051デフォルトの名無しさん
2008/11/27(木) 22:59:46Cだとサイズを変えられないし、C++ならなんでもありだからね。
0052デフォルトの名無しさん
2008/11/27(木) 23:00:03根本的に勘違いしているようだが、Cは0オリジンであって、1オリジンの添字を使うことはできない。
単に表示を1オリジンにしたいだけなら添字に1加えること。
0053デフォルトの名無しさん
2008/11/27(木) 23:02:17言語には言語の流儀ってものがあるからバカなこと考えずに0オリジンでやれ
0054デフォルトの名無しさん
2008/11/27(木) 23:05:33FORTRAN 用の本を C 用にしたものだから
1オリジンで強引にやってた気がする。
しかもいくつかバグが・・・。
まあ内部的に0オリジンで扱って、
表示する時は必要に応じて1オリジンで表示する、
ってのがC的だな。
0055デフォルトの名無しさん
2008/11/27(木) 23:08:050056初心者
2008/11/27(木) 23:14:42現在、独習C++で勉強しています。
中級者向けの本、お勧めの本などありましたら
教えていただければ幸いです。
0057デフォルトの名無しさん
2008/11/27(木) 23:16:53スレ違いです。つーか、マルチすんな。
0058デフォルトの名無しさん
2008/11/27(木) 23:17:46加減算より優先順位の低い演算子等が入ってくるとおかしくなるぞ。
((matrix)[(row)-1][(col)-1])
にしとけ。
0059デフォルトの名無しさん
2008/11/28(金) 00:38:01何かいい本ないですかね?8月に出たロボコンの本とかどうなのかな?
0060デフォルトの名無しさん
2008/11/28(金) 19:31:050061デフォルトの名無しさん
2008/11/28(金) 19:36:170062デフォルトの名無しさん
2008/11/28(金) 19:37:250063デフォルトの名無しさん
2008/11/28(金) 19:44:42エラー処理で\a出力するようにするとか
0064デフォルトの名無しさん
2008/11/28(金) 19:51:20実行時間長いプログラムだと、結構実行時間中暇で、おおまかなところでしか
表示させないから、画面みないこと多いんだよね。
画面をみるのがめんどくさいというか。
0065デフォルトの名無しさん
2008/11/28(金) 19:52:460066デフォルトの名無しさん
2008/11/28(金) 19:53:580067デフォルトの名無しさん
2008/11/28(金) 19:59:100068デフォルトの名無しさん
2008/11/28(金) 20:07:360069デフォルトの名無しさん
2008/11/28(金) 20:17:30strong_beep(); とか関数作ることで処理系依存部分を分離しといて、あとはサイレンなり爆竹なり何でも使えばええやん
いつまでも「処理系非依存」の殻に閉じこもってると、結局何も実現できない口だけ PG になっちまうぞ
0070デフォルトの名無しさん
2008/11/28(金) 20:21:41魔道物語とかを参照。
0071デフォルトの名無しさん
2008/11/28(金) 20:25:590072デフォルトの名無しさん
2008/11/28(金) 20:27:180073デフォルトの名無しさん
2008/11/28(金) 22:31:39*pにint型の整数値を代入したいのですが、やり方がわかりません。
0074デフォルトの名無しさん
2008/11/28(金) 22:33:22可搬性のある方法はありません。
0075デフォルトの名無しさん
2008/11/28(金) 22:34:01*(int*)p = 9999; とかでよさそうだけど、sizeof(wchar_t)*12 との関連がわからん。
0076デフォルトの名無しさん
2008/11/28(金) 22:36:170077デフォルトの名無しさん
2008/11/29(土) 11:20:07勉強しようと思って、先日までK&Rを読んでました。
具体的な実例でちょっと活用してみたいな、と思うんですけど面白いもの
ありますでしょうか。自分は上記のようにJavaのWebアプリ出身なので、ライブラリ
組み合わせてプラモデルみたいにアプリ作ってきた人間です。C言語
ならではの、低レベルな部分から何かを作る、というのをやってみたいのですが。
0078デフォルトの名無しさん
2008/11/29(土) 12:03:58007977
2008/11/29(土) 12:17:38あはは。いや、アルゴリズムの練習というよりは、チュートリアル形式で
手を動かしていくと、ネットワークツールが出来上がる、とか、そういう
のありませんですかね。
組み込みとかも興味あるので、そっち方面でもいいんですけど。
0080前スレ931
2008/11/29(土) 12:27:06前スレ992
PDCursesについては正直食わず嫌いしています
実際に使ったことはありません
0081デフォルトの名無しさん
2008/11/29(土) 13:15:04何を求めているのかよくわからない
書籍のことなら書籍スレで聞け
0082デフォルトの名無しさん
2008/11/29(土) 13:20:46ネットワークツールじゃないが、
コンピュータ対人間の双方向ヒットアンドブロー数あてゲームなんてどうよ?
0083デフォルトの名無しさん
2008/11/29(土) 15:03:13typedef 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]に保存していけばいいでしょうか?
0084デフォルトの名無しさん
2008/11/29(土) 15:10:17008583
2008/11/29(土) 15:25:29STRUCT *p = &data[0];
i = 0;
while( p->a がある値になるまで ){
data_save[i] = p;
i++;
p++;
}
0086デフォルトの名無しさん
2008/11/29(土) 15:31:31008783
2008/11/29(土) 15:38:38・変更できないテーブルから何個かデータを取り出したい
・データをそのまま保存するのは容量がもったいないので、アドレスだけ保存
このような意図で考えています
0088デフォルトの名無しさん
2008/11/29(土) 15:45:420089デフォルトの名無しさん
2008/11/29(土) 15:55:24if (strlen(str1) == 10 && str1[9] != '\n') {
while (getchar() != '\n');
}
0090デフォルトの名無しさん
2008/11/29(土) 15:58:52まだ導入すらしてないことに驚いた
0091デフォルトの名無しさん
2008/11/29(土) 16:10:07str1 の長さが10で、かつ str1 の最後の文字が改行で無い場合。
おそらく str1 を fgets とかで読み込んで、もし入力が想定したサイズより大きかったら、次の改行まで読み飛ばしている。
009283
2008/11/29(土) 16:17:28100個のテーブルから
Aさんが使いたいデータはメンバのcが'A'
Bさんが使いたいデータはメンバのcが'B'という感じで決まっています。
Aさんが操作を行っている時は、
for( i=0 ; i<100 ; i++ ){
data[i].c == 'A';
}
という処理をして、毎回検索するのは面倒なので、
Aさんが操作している時はAさん用のデータを抽出し、そこを検索
Bさんが操作している時はBさん用のデータを抽出し、そこを検索
と考えています。
0093デフォルトの名無しさん
2008/11/29(土) 17:33:200094デフォルトの名無しさん
2008/11/29(土) 17:40:20それで問題ないです
0095デフォルトの名無しさん
2008/11/29(土) 18:08:09前にもいっていたらごめんなさい。
UNIXネットワークプログラミング入門 /雪田 修一/技術評論社 2003/ISBN-10: 4774117544
前身はこの手の入門書の草分けでした。
0096デフォルトの名無しさん
2008/11/29(土) 18:24:40int *p = &a[5];
このように宣言して、p++やp--でポインタを操作する場合
どこまで++や--できるか、一般的にはどういった書き方をするのでしょうか?
0097デフォルトの名無しさん
2008/11/29(土) 18:28:01pはaより小さくなってはいけないし、a+10より大きくなってはいけない。
それをどうコーディングするかは、実装次第。
0098デフォルトの名無しさん
2008/11/29(土) 18:31:53a + 10 はOKでしたっけ。いや、参照しなければなんでもOKでしたっけ。
えーと、クイックソートなどで真ん中を取る、という演算を p = (a + b) / 2 として許してもらえるかどうかの話です。
0099デフォルトの名無しさん
2008/11/29(土) 18:36:32デリファレンスしない場合に限り、a+10はOK。
逆に言えば、 p = a + 10して* pしたらアウト。
bが>97の要件を満たしているなら、p = (a + b) / 2は問題ない。
0100デフォルトの名無しさん
2008/11/29(土) 18:38:03a,b が共にポインタならばコンパイラに怒られる
0101デフォルトの名無しさん
2008/11/29(土) 18:45:30p = a+10するのはOK
その時に*pするのはNG
ということはわかりましたが、
pがa[9]を越えていないかどうかは、どう判断するのでしょうか?
アドレスの大小じゃわかりませんよね・・・
0102デフォルトの名無しさん
2008/11/29(土) 18:45:36> 真ん中を取る
ポインタ同士足すのは怒られたかと。
p = a + (abs(b - a) / 2);
かな。
0103デフォルトの名無しさん
2008/11/29(土) 18:49:02> アドレスの大小
で、いけるはずだが。
あと>>102間違えた。absいらんわ。
p = a + ((b - a) / 2);
で。
0104デフォルトの名無しさん
2008/11/29(土) 18:54:54それでしたら
p + 10以上 とか
p - 10以上 の場合
if( p < &a[0] ){
p = &a[0];
}
if( p > &a[9] ){
p = &a[9];
}
こんな感じで頭とお尻は守られるのでしょうか?
0105デフォルトの名無しさん
2008/11/29(土) 18:59:180106デフォルトの名無しさん
2008/11/29(土) 20:28:59いつからそんな阿呆な制限がつくようになったんでしょうね。彼らはプログラミングの経験が浅かったのではないでしょうかね。
0107デフォルトの名無しさん
2008/11/29(土) 20:35:510108デフォルトの名無しさん
2008/11/29(土) 20:39:01ポインタ+ポインタ
これがどんな型になるのが妥当だと考えているの?
0109デフォルトの名無しさん
2008/11/29(土) 20:40:22ふつーに入門書を頭から読んでいったほうが効率いいんじゃね?
って、思うような質問ってよく見るよな。
0110デフォルトの名無しさん
2008/11/29(土) 20:41:41a が 5 で、というのはちょっと意味がわかりません。それはともかく、
static char buff[100]
で、p が buff の中を指しているかどうかをみるのに、
p >= buff && p < buff + 100
とするのはありだと思います。これがわかりにくければ、p は値としてアドレスをとると考えて、べたに
p >= &buff[0] && p < &buff[100]
と書いてなんら差し支えはありません。
0111デフォルトの名無しさん
2008/11/29(土) 20:42:52なるほど。
でもポインタでいいかと。
0112デフォルトの名無しさん
2008/11/29(土) 20:44:19まあ、ほとんどの環境で問題なく動くだろうけど。
0113デフォルトの名無しさん
2008/11/29(土) 20:45:31ポインタ同士の足し算にどんな意味があるんだよ
得られるものは何?
0115デフォルトの名無しさん
2008/11/29(土) 20:49:06ありがとうございます
0116デフォルトの名無しさん
2008/11/29(土) 20:50:07可能だとしても、そういうときしか使えないような気もするが。
0117デフォルトの名無しさん
2008/11/29(土) 20:50:10buff[100] が *(buff + 100) のシンタックスシュガーならば、問題ないかと。
0119デフォルトの名無しさん
2008/11/29(土) 20:51:13*(buff + 100) ← この時点でだめじゃん。
0120デフォルトの名無しさん
2008/11/29(土) 20:51:41型を気にしないならアセンブラをすればいい
C言語にこだわるのが変
0121デフォルトの名無しさん
2008/11/29(土) 20:54:24そういういみではそうですね。&buff[100] = &*(buff + 100) という説明はありですか?
0122デフォルトの名無しさん
2008/11/29(土) 20:56:15やっぱだめなんじゃね?
char buff[100]; に対してでしょ?
0123デフォルトの名無しさん
2008/11/29(土) 20:57:43典型的な用途としてカーネルをCで書く、というかCはもともとそのように生まれてきたのでしょう?そんな記述力の高い C になんで無用な制限を課すのでしょうか?
0124デフォルトの名無しさん
2008/11/29(土) 21:00:02ポインタ同士の加算ってふつーにオーバーフローしそうだけど。
0125デフォルトの名無しさん
2008/11/29(土) 21:00:07いや、だから &*(buff + 100) とかくと、& と * が相殺されて(参照するコードがうまれることなく) buff + 100 になる、とか。これは文法書をみなくては。
0126デフォルトの名無しさん
2008/11/29(土) 21:01:52んーなるほど。値によってはアウトですかね。
0127デフォルトの名無しさん
2008/11/29(土) 21:02:32char *のときにはなんとかなっても、int *のときに破綻しないように定義することが如何に難しいかわかると思うぞ。
結論:ポインタ同士を足したものの型を適切に定義できない以上、それを整数で割った型も適切に定義できない。
予測される反論に対する自衛。
int *同士を足した型を、「int *同士を足し合わせた特殊な型」と定義すれば2で割った場合の定義も適切にできるかもしれない。
では、3で割ったら? 或いは7で割ったら? つまり、イリーガルケースの対応のためにどんどん後付の仕様を膨らませ続けなければいけなくなってしまう。
0128デフォルトの名無しさん
2008/11/29(土) 21:04:00なるほど。アラインメントがくずれるわけですね。
0129デフォルトの名無しさん
2008/11/29(土) 21:05:53同じ場所を指す保証をコンパイラにさせるのは、仮にSIZEが奇数だと酷だな。
0130デフォルトの名無しさん
2008/11/29(土) 21:06:29ぜひ規格を確認してみてください。
0132デフォルトの名無しさん
2008/11/29(土) 21:13:41↓
if( p >= &buff[0] && p <= &buff[99] )
これだったら問題はないですかね?
0133デフォルトの名無しさん
2008/11/29(土) 21:16:32え?そういう制限はないはず。p は参照さえしなければなにをさしてもいいのでは?
0134デフォルトの名無しさん
2008/11/29(土) 21:17:310135デフォルトの名無しさん
2008/11/29(土) 21:20:36&buff[100] が合法かどうかって話だろ。
0136デフォルトの名無しさん
2008/11/29(土) 21:20:590137デフォルトの名無しさん
2008/11/29(土) 21:39:49> if( p >= &buff[0] && p <= &buff[99] )
こう書く方が好き♪
if( &buff[0] <= p && p <= &buff[99] )
0138デフォルトの名無しさん
2008/11/29(土) 21:40:55ポインタの初期化宣言で通常ポインタは
int *p = NULL;
ではint型へのポインタ配列は
int *p_array[100] = { NULL, NULL, ... ,NULL };
と100個宣言する必要がある?
0139デフォルトの名無しさん
2008/11/29(土) 21:44:40int *p_array[100] = { NULL};
ってだけでのこりも全部NULLになる、配列はひとつでも初期化するとのこりは0を代入した場合の値になる
0140デフォルトの名無しさん
2008/11/29(土) 21:52:24即レスありがとう。
処理途中でNULLにするには
for(i=0;i<100;i++){
p_array[i] = NULL;
}
とする必要がありますか?
0141デフォルトの名無しさん
2008/11/29(土) 21:54:22> ポインタの足し算したがる馬鹿
相対アドレス計算なら、アセンブラから始めたおじさん達にとっては普通の発想だよ
結果のアドレスがオーバーフローしないように設計したり、わざとオーバーフローさせたり、そんなのは場合によりけり
0142デフォルトの名無しさん
2008/11/29(土) 21:58:29イメージ的には、インデックスレジスタどうしの加算みたいな感じ。
0143デフォルトの名無しさん
2008/11/29(土) 22:06:15014498
2008/11/29(土) 22:06:37まあ 8086 の near ポインタならOKですね。というか、私はその口。
でも、dos のソースが他の環境でも使えるのなら、そのほうがうれしいものです。
0145デフォルトの名無しさん
2008/11/29(土) 22:08:03Win32API なら C が標準
アセンブラや C++ でも使えるけどね
0146デフォルトの名無しさん
2008/11/29(土) 22:09:380147デフォルトの名無しさん
2008/11/29(土) 22:09:46そうです。
変数の初期値の話は、言語の話というよりは、特定の環境(dos だの elf だの)の実行ファイルの形式などを念頭に置いたほうが理解しやすいと思います。
0149デフォルトの名無しさん
2008/11/29(土) 22:13:16どうもありがとう。
0150デフォルトの名無しさん
2008/11/29(土) 22:14:25#define AB 2
#define CD 3
としたら、これらは別々のものとして判別できますか?
0151デフォルトの名無しさん
2008/11/29(土) 22:15:25できます。マクロ AB CD ABCD はべつものです。
0152150
2008/11/29(土) 22:20:290153デフォルトの名無しさん
2008/11/29(土) 23:20:08C言語で、Sjis→EUC-JP のURLエンコードの方法を教えてください。
このページみたいにしたいです。
http://home.kendomo.net/board/decode/
「ニュース速報」→%A5%CB%A5%E5%A1%BC%A5%B9%C2%AE%CA%F3
とかにしたいです。
0154デフォルトの名無しさん
2008/11/29(土) 23:24:20自分で作ったのは以下のようなプログラムなのですが, 間違いやアドバイス等があったらいただけないでしょうか?
(ピボット選択あり)
よろしくお願いします.
----------------------------------------------------------------------------------------
#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;
つづく
0155デフォルトの名無しさん
2008/11/29(土) 23:25:27for(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);}
0156デフォルトの名無しさん
2008/11/29(土) 23:25:59sjis を iconv とかで euc-jp にした後に普通にURLエンコードすれば?
0157デフォルトの名無しさん
2008/11/29(土) 23:30:17SJIS -> EUC は
http://athomejp.com/goldfish/mfc/original/sjistoeuc.asp
C++だけどわかるだろ?
0159デフォルトの名無しさん
2008/11/30(日) 01:10:36ですがスレチ気味なので宿題スレに質問し直させていただきました
お騒がせ致しまして申し訳ございませんでした
0160デフォルトの名無しさん
2008/11/30(日) 02:42:270161デフォルトの名無しさん
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;
}
つづく
0162デフォルトの名無しさん
2008/11/30(日) 03:07:20void swap(int a,int b)
{
int temp;
if(a>b)
{
temp=a;
a=b;
b=temp;
}
}
0163デフォルトの名無しさん
2008/11/30(日) 03:24:56swapの部分を別関数にしないか
swap関数には配列と二つの要素番号を渡すようにしたら
0164デフォルトの名無しさん
2008/11/30(日) 03:37:530165デフォルトの名無しさん
2008/11/30(日) 03:40:480166デフォルトの名無しさん
2008/11/30(日) 09:06:130167デフォルトの名無しさん
2008/11/30(日) 09:07:21加齢臭のするコードですね。
0169デフォルトの名無しさん
2008/11/30(日) 10:01:56そんな swap(x,x) とやると破綻するようなマクロはやめとけって
0170デフォルトの名無しさん
2008/11/30(日) 12:08:54意味不明。そんなことを言ったら、大昔からあるコードからは加齢臭がしてきますね。
C言語なんてかなり前からあるから、今頃どの教本も、加齢臭だらけだw
>>169
確かに、同じ変数同士でやってしまったら、0ですな・・・
そういう場合に使う必要はないだろうけど、別に変数を1つ用意して
やる場合、そんな結果にはならないしね。
0171デフォルトの名無しさん
2008/11/30(日) 12:15:480172デフォルトの名無しさん
2008/11/30(日) 12:26:36自分勝手な言葉で理解できないのか、なんていっている奴は
他人とまともにコミュニケーションがとれない引きこもり。
そうやって理解しないものを叩く前に、自分が意味不明な
言葉を使っていることに気づけよ、基地外
0173デフォルトの名無しさん
2008/11/30(日) 12:27:45「加齢臭」と揶揄された意味もわかってないのか・・
↑さすがにこいつ、アホだ・・・揶揄にしても表現がどうかと。
周りが見えていない奴って、本当に迷惑だな。お前こそ臭いソースでも書いてんだろw
0174デフォルトの名無しさん
2008/11/30(日) 12:31:57それすらせずに、自分が汚い表現を用いたのを指摘されて、逆に揶揄されたのに
何で分からないんだ・・・みたいなことを言われても、お前の表現がおかしい、
加齢臭がするしないはともかく、本当にそうだと言う人に対して失礼。
いずれもお前も、年をとれば嫌でも自分から漂ってくる臭いだから、せいぜい
臭わない内に思い上がってろ。
0175171
2008/11/30(日) 12:33:15くやしいのう
0176デフォルトの名無しさん
2008/11/30(日) 12:39:32頭の悪い奴ってのは、自分が低レベルだということに気づいていないから困る。
精神レベルも低い。
0177デフォルトの名無しさん
2008/11/30(日) 12:52:45頭の悪い奴ってのは、自分が低レベルだということに気づいていないから困る。
精神レベルも低い。
0178デフォルトの名無しさん
2008/11/30(日) 12:55:22配列全体をなめての値交換だと
不意にインデックスが同じところ指すかもしれないからなおさらよろしくない
別変数用意するなら、結局代入操作をそこで記述してもよいわけだしね
個人的には
引数に変化をあたえるようなマクロは好きでない というのはおおげさか?
※ とはいえ va_start() は↑のタイプだってりするけどねw
0179デフォルトの名無しさん
2008/11/30(日) 13:07:02挙句、相手の精神レベルがどうこうって自分がなんだと思っているんだろうね。
関数で事が足りることをマクロで実装するなんて今時の技術についていけていないって証明なんだから、
大人しく現場から離れて現場の人間を巧くコントロールするかお茶でも啜ってろって。
0180デフォルトの名無しさん
2008/11/30(日) 13:15:05頭の悪い奴ってのは、自分が低レベルだということに気づいていないから困る。
精神レベルも低い。
0181デフォルトの名無しさん
2008/11/30(日) 13:16:53今時のCPUだとXOR使うほうが遅くなるって話もある。
0182デフォルトの名無しさん
2008/11/30(日) 13:17:05ERROR: 精神レベルが定義されていません
0183デフォルトの名無しさん
2008/11/30(日) 13:22:14VtuneかCodeAnalystで解析かけてからもの言え
0184デフォルトの名無しさん
2008/11/30(日) 13:41:27inline 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));
最近これに近いの書いたなぁ
0185デフォルトの名無しさん
2008/11/30(日) 14:32:240186デフォルトの名無しさん
2008/11/30(日) 14:54:28ごめんなさい。ごめんなさい。
宿題スレでがんばるので許してください。
0187デフォルトの名無しさん
2008/11/30(日) 15:07:160188184
2008/11/30(日) 15:44:08>>185は、そこまでいうのなら、
>>184より、効率がよくて汎化なスワップ関数作ってくれ。
因みに、クイックソートのサブルーチンで使っています。
0189デフォルトの名無しさん
2008/11/30(日) 16:22:540190デフォルトの名無しさん
2008/11/30(日) 16:24:070191デフォルトの名無しさん
2008/11/30(日) 17:03:41アーキテクチャにはよるが、普通にテンポラリバッファとってmemmoveすればいいよ。
0192デフォルトの名無しさん
2008/11/30(日) 17:44:14type : 変数の型を指定
0193184
2008/11/30(日) 18:14:02マクロは、http://pc11.2ch.net/test/read.cgi/tech/1144824670/
こっちで頼む。
>>191
テンポラリバッファがよくわかりませんが、少なくとも改善の余地があるということですね。
ありがとうございました。
GNU C Library glibc-2.7のqsort.cでは、SWAPマクロでやっていました。
クイックソート自体の実装は、msort.cにありましたが、非再帰でさらに下請けがありました。
今からじっくり読んでみたいと思います。Knuth vol.3 (2nd ed.)買おうかな。チラ裏 1日ROMる。
0194デフォルトの名無しさん
2008/11/30(日) 18:17:15#define swap(x, y) { int tmp=(x); (x)=(y); (y)=tmp; }
ってしたくなりませんか。(なお type について突っ込むつもりはありません。)
0195デフォルトの名無しさん
2008/11/30(日) 18:18:54> (2nd ed.)
んーしらなかった。
0196デフォルトの名無しさん
2008/11/30(日) 18:28:02xとyが必ずしもint型とは限らないんで、その場で決められる仕様になっているのだが
いちいち突っ込んだり、そうではない、こうだという意見は無駄だよ。
0197デフォルトの名無しさん
2008/11/30(日) 18:28:56(x)とか、別に括弧は必要ないぞ
0198デフォルトの名無しさん
2008/11/30(日) 18:31:16swap(a=b, c); とか検出できる。
0199デフォルトの名無しさん
2008/11/30(日) 18:35:45ほら、でた、主観。お前は言葉の意味を理解して聞いているのか?
”必要”、必ず要る、その意味が分かってないから、いちいち
鬱陶しい口答えをする性格になったんだろうけど。
逆に問うぞ、”必要”があるなら、その必要性について
客観的な意見で述べよ。
0200デフォルトの名無しさん
2008/11/30(日) 18:37:26何故ならswap(a=b, c); とか検出できるからだ
これでいいの?
0201デフォルトの名無しさん
2008/11/30(日) 18:38:32誰もそんなこと聞いてはいないのに、いつの間にか直接的ではないことで
勘違いをしていることを指摘されていると気づかないんだよな。
加齢臭についても、それについて嫌な思いをした人がいるから
反論されているのではなく、表現の汚さや、揶揄にしても
あまりにも表現として相手に伝わらないから、突っ込まれているのに。
意見をする以上、それなりの覚悟をしないと、社会じゃやっていけないよ。
下手なことを言えば、立場を悪くするように。
0202デフォルトの名無しさん
2008/11/30(日) 18:38:43二行目が一行目の理由なんだけど…
0203デフォルトの名無しさん
2008/11/30(日) 18:41:340204デフォルトの名無しさん
2008/11/30(日) 18:43:55釣り釣りw
0205デフォルトの名無しさん
2008/11/30(日) 18:45:020206デフォルトの名無しさん
2008/11/30(日) 18:52:18注釈を読んでいなかったのか、理解できなかったのか?って思われるだけだぞ。
そうしたいなら、自分がすれば良いだろ?ただ、そのコードは
型を指定して、int型以外でも使えるのに、敢えて限定する意味は?
おまけに必要とされない括弧。銅説明するんだ、あんた?
意見する以上、無駄なことを言うと、逆に突っ込まれるぞ。
0207デフォルトの名無しさん
2008/11/30(日) 19:32:30いや、だからtypeを問題にしていないし、そう書いたつもりですが、なにか問題でもあるのでしょうか?
0208デフォルトの名無しさん
2008/11/30(日) 19:34:09いや、だからtypeを問題にしていないって書いたのですが、それでもあえて文句をつけるのですか?
0209デフォルトの名無しさん
2008/11/30(日) 19:35:37いや、だからtypeを問題にしていないって書いたのですが、それでもあえて文句をつけるのですか?
0210デフォルトの名無しさん
2008/11/30(日) 19:39:38意図が分散してる type→intの書き換え と マクロ引数の括弧づけ
type を問題にしていないのなら書き換えしなければ マクロ引数の括弧づけ のみのトピックだと明確にわかる
俺個人としては、マクロ引数には括弧をつけるし、
例の swap みたいなのは do { } while(0) で囲みたくなるな
0211デフォルトの名無しさん
2008/11/30(日) 19:48:28たしかに、自分の好みに忠実にしたがって type を消しましたが、ことわりは入れておきました。
でも、そんなことにも耐えられない人がいたとは驚きでした。
do { } while (0)
これは if () を { } なしで書く人のためにあるんでしたか。
0212デフォルトの名無しさん
2008/11/30(日) 19:53:07> これは if () を { } なしで書く人のためにあるんでしたか。
ちょっと違う
必ず ; を要求するかたちだね。
#define foo() { }
#define bar() do { } while(0)
foo() foo() ←文法的にセーフ { } { } で展開されるだけだし
bar() bar() ←文法的にアウト
0213デフォルトの名無しさん
2008/11/30(日) 19:54:300214デフォルトの名無しさん
2008/11/30(日) 21:49:56で、何がどううれしいんだ?
0216デフォルトの名無しさん
2008/11/30(日) 21:57:03コンマ演算子つかえば?
0218デフォルトの名無しさん
2008/11/30(日) 21:58:21ん?どのように?
0219デフォルトの名無しさん
2008/11/30(日) 22:01:43攻すれば
swap(a,b);
も
if(1){
swap(a,b);
}
つかえんじゃね
0220デフォルトの名無しさん
2008/11/30(日) 22:08:29#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;
}
になりました。
0221デフォルトの名無しさん
2008/11/30(日) 22:11:48なるほど、定石だからうれしいのか
よーくわかったよ
0222デフォルトの名無しさん
2008/11/30(日) 22:12:52if(1) swap(a,b);
だめぽ
0223デフォルトの名無しさん
2008/11/30(日) 22:12:58というより、他にいい書き方がありますか?>>216 ではうまくいかない。
0224デフォルトの名無しさん
2008/11/30(日) 22:13:58定石は大事ですよ。定石もしらないのに回答者側で書くなんて10年はやいんじゃないですか。きえてください。
0225デフォルトの名無しさん
2008/11/30(日) 22:14:40あたなことそきえたmsだあさい
0226デフォルトの名無しさん
2008/11/30(日) 22:14:53宿題スレでお待ちしています。私は「当方の環境は」云々で書いていますので、すぐわかります。叩いてもらって結構。
0227デフォルトの名無しさん
2008/11/30(日) 22:14:54C言語を馬鹿にする感じで
0228デフォルトの名無しさん
2008/11/30(日) 22:15:28日本語でいいですよ。
0229デフォルトの名無しさん
2008/11/30(日) 22:19:00結局何も自分の言葉で説明できていないのにシッタカこいてんじゃねえよ
0230デフォルトの名無しさん
2008/11/30(日) 22:35:52釣られすぎだ
0231デフォルトの名無しさん
2008/11/30(日) 22:43:58x や 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)
0232デフォルトの名無しさん
2008/11/30(日) 22:46:340233デフォルトの名無しさん
2008/11/30(日) 22:48:00でもさ、そもそもわざわざ関数じゃなくてマクロを使うのってパフォーマンスのためだよな
代入増やしたら意味なくね?
>>232
展開されねーだろw
0234デフォルトの名無しさん
2008/11/30(日) 22:49:27最適化に期待したいが、ポインタ使うとどうなるんだろうか怪しいのか?
0235デフォルトの名無しさん
2008/11/30(日) 22:50:370236デフォルトの名無しさん
2008/11/30(日) 22:58:06関数呼び出しのコストはちょっとした一時変数の確保や代入よりずっと大きい
ただし、本当にちょっとしたことをやるだけの関数なら、
コンパイラがオプション次第でインラインに展開してくれるかもしれない
0237デフォルトの名無しさん
2008/11/30(日) 23:00:50つい簡単な処理はマクロで(ポインタ使わず)書いてしまうな、俺は。
でも、関数のような形で記述しといて引数が変化してしまうってのは
ホントは良くないよねえ。
0238デフォルトの名無しさん
2008/12/01(月) 01:06:51デバッガで追えない点もマクロのダメなところ
オプション変更で可能なのかもしれんが
0239デフォルトの名無しさん
2008/12/01(月) 01:38:50宿題スレでお待ちしています。(以下略)
0240デフォルトの名無しさん
2008/12/01(月) 01:54:17帰り道にある公園のトイレでお待ちしています。(以下略)
0241デフォルトの名無しさん
2008/12/01(月) 01:55:10SWAP(++a, ++b, int);
というのを想定しているのでしょうか?でもこれでもうまくいかない。
いえ、ここまでうまくいく必要はないと思います。副作用のある表現をマクロの引数にするのは問題ですから。
きびしい言い方をすれば、このかきかたでも、なにもかわっていないから、ふつうに、
#define SWAP(x, y, type) {type tmp = (x); (x) = (y); (y) = tmp; }
でいいと思います。
0242デフォルトの名無しさん
2008/12/01(月) 02:04:380243デフォルトの名無しさん
2008/12/01(月) 04:45:02xやyのアドレスを取れない場合があるから、それはうまくない。
0244デフォルトの名無しさん
2008/12/01(月) 06:52:35結局何も自分の言葉で説明できていないのにシッタカこいてんじゃねえよ
0245デフォルトの名無しさん
2008/12/01(月) 06:55:54こいつキモイな
0246デフォルトの名無しさん
2008/12/01(月) 09:04:20使い方によっては問題が起こると。だから、コードを書く側が
適切に記述して使うべきだろ?あれこれ問題だと言い出したら、
わざと問題が起こるような状況をわかっているのに、対処しないような
人ほど、問題だろ。また、人為的でなくても問題があるなら、
最初から避ければ良いだけで、いちいちそれは問題だと
問題を敢えて起こして提起しなくて良いから。
意見するならするで、重要なことを述べな。
0247デフォルトの名無しさん
2008/12/01(月) 11:11:000248デフォルトの名無しさん
2008/12/01(月) 16:47:15WindowsネイティブなアプリケーションだとAPI呼び出しが90%を占めている感じがするし
どう思いますか?
0249デフォルトの名無しさん
2008/12/01(月) 16:48:550250デフォルトの名無しさん
2008/12/01(月) 17:11:43あなたはCでどんなプログラムを作っていますか?
0251デフォルトの名無しさん
2008/12/01(月) 20:28:43それは入門編スレで聞くべきことだと思いますか?
0252デフォルトの名無しさん
2008/12/01(月) 20:34:19入門スレ以外で聞くところがありますか?
0253デフォルトの名無しさん
2008/12/01(月) 20:40:29プログラム板以外で聞くところがあります
プログラマー
http://pc11.2ch.net/prog/
0254デフォルトの名無しさん
2008/12/01(月) 20:41:05マ板に行け
0255デフォルトの名無しさん
2008/12/01(月) 22:56:390256デフォルトの名無しさん
2008/12/01(月) 23:41:360257デフォルトの名無しさん
2008/12/01(月) 23:53:23ありがとうございます
0258デフォルトの名無しさん
2008/12/02(火) 01:43:13必要に迫られたというパターンがおおいかも。
0259デフォルトの名無しさん
2008/12/02(火) 07:56:38配列に入りきらない数値データの移動平均をしたいのですが、
やり方を教えていただきたいです。
例えば1000万個の数値データを500ずつの移動平均を行う場合を教えてください。
初心者ですいません、宜しくお願いいたします。
0260デフォルトの名無しさん
2008/12/02(火) 08:05:470261デフォルトの名無しさん
2008/12/02(火) 09:56:030262デフォルトの名無しさん
2008/12/02(火) 10:10:030263デフォルトの名無しさん
2008/12/02(火) 10:11:34>>260さんのおっしゃった方法ですが、
1~500、2~501、3~503・・・
としていくのに、1,2・・・を飛ばして100からといった感じで
大きい数いなったときの配列への格納がうまく行きません。
0264デフォルトの名無しさん
2008/12/02(火) 11:06:15配列内総和 = 前回総和 - 最古のデータ + 最新データ
配列 → 最古のデータの部分を 最新データで書き換え
500 個分の過去データがないと 最古がどれか は保持できないので
配列をなくすことはできないな
0265デフォルトの名無しさん
2008/12/02(火) 13:22:260266デフォルトの名無しさん
2008/12/02(火) 13:23:19ふぁいる(入る)だけ用意してって
0267デフォルトの名無しさん
2008/12/02(火) 14:18:390268デフォルトの名無しさん
2008/12/02(火) 14:20:03違うcppとはどういう意味ですか?
そもそもcppに変数はありません
0269デフォルトの名無しさん
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が入力されるまで繰り返す*/
「 」 /*戻り値を返す*/
0270デフォルトの名無しさん
2008/12/02(火) 15:39:34回答になってないことは十分承知ではあるが、
配列の要素数がわかっていないの場合、番兵などを決めていないとこれ以上いじりたくないソースに見えてしまう。
もしかして、疑似言語?while(ans = y || Y)とか。
構造体tmpがどのようなメンバを持っているのかわからないので、ソース全体をどこかに上げることをお薦めする。
0271269
2008/12/02(火) 15:42:30OS Vista ソフトVisual studio2005
ファイル処理、プリプロセッサ、記憶クラスなどは習ってません
0272デフォルトの名無しさん
2008/12/02(火) 15:46:54|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'と等しい」
|「 」 /*戻り値を返す*/
何の値を返すことになっているのかわからないから答えられない
問題読み直せ
あと、バッファオーバーフロ対策とか細かいことは言わないけど
{が抜けてたりシンボルが違ってたりする部分はちゃんと直しとけ
0273デフォルトの名無しさん
2008/12/02(火) 15:48:03だとすればその変数を1減らせばいいよ
0274デフォルトの名無しさん
2008/12/02(火) 15:51:12rewind(stdin)
scanf("%c",&ans);
にもつっこみたいがまあいいか
0275デフォルトの名無しさん
2008/12/02(火) 16:28:42グローバル変数ならextern
a.pp
int a;
b.cpp
extern int a;
0276デフォルトの名無しさん
2008/12/02(火) 19:10:39やりたい事は、
符号なし変数nビット内に1が一つだけあると判定して、そこから最下位ビットまでのビット長を得ることで、
2の累乗かどうか、であるならば2の何乗であるかを調べることです。ここまで教えて頂けるとより助かります。
0277デフォルトの名無しさん
2008/12/02(火) 19:18:400278デフォルトの名無しさん
2008/12/02(火) 19:36:23わかりました。ありがとうございますー
0279デフォルトの名無しさん
2008/12/02(火) 21:11:03どう書けば良いか教えて下さい。
struct hoge_t
{
unsigned poyo: 3;
} hoge;
int fuga = 4;
hoge.poyo = fuga;
キャストとか特別な処理が必要なんでしょうか?
0280デフォルトの名無しさん
2008/12/02(火) 21:15:120282デフォルトの名無しさん
2008/12/02(火) 21:29:31自動的にマスクされるよ
その例なら、hoge.puyo = fuga & 0x7; と同等になる。
0284デフォルトの名無しさん
2008/12/02(火) 23:58:050285デフォルトの名無しさん
2008/12/03(水) 00:01:420286デフォルトの名無しさん
2008/12/03(水) 00:05:120287デフォルトの名無しさん
2008/12/03(水) 00:16:590288デフォルトの名無しさん
2008/12/03(水) 00:17:160289デフォルトの名無しさん
2008/12/03(水) 00:20:23勿論、エンディアンの影響も受ける。
0290デフォルトの名無しさん
2008/12/03(水) 00:30:020291デフォルトの名無しさん
2008/12/03(水) 10:57:24C言語でゲームを作成しました。その作品のブロック図を作成したいんですが
ブロック図の書き方、又は作り方等記載してあるサイトあれば教えてください。
0292デフォルトの名無しさん
2008/12/03(水) 12:08:410293デフォルトの名無しさん
2008/12/03(水) 13:47:58Doxygenが一番ブロック図に近いんでしょうか?
0294デフォルトの名無しさん
2008/12/03(水) 16:44:16勘違いなのでは?
0295デフォルトの名無しさん
2008/12/03(水) 18:42:51Cの規格にその条項があるのは知ってるけど
実際のコンパイラで何がどちらかの表みたいなのってないのかね
0297デフォルトの名無しさん
2008/12/03(水) 22:13:31コンパイラ依存じゃないからね。。。
0298デフォルトの名無しさん
2008/12/03(水) 22:42:420299デフォルトの名無しさん
2008/12/03(水) 23:08:53どんな対処法があるのかご教示ください
0300デフォルトの名無しさん
2008/12/03(水) 23:12:35staticにするか、malloc()でとるか。
0301デフォルトの名無しさん
2008/12/03(水) 23:12:35環境によるが、普通は
グローバル変数にする
スタティック変数にする
malloc系の関数で動的に確保する
のいずれかでOK。
0302デフォルトの名無しさん
2008/12/03(水) 23:20:05ありがとうございます。
メモリの確保関連は入門書には載ってないようで
調べてみます。
0303デフォルトの名無しさん
2008/12/03(水) 23:47:490304デフォルトの名無しさん
2008/12/04(木) 09:08:53> グローバル変数にする
> スタティック変数にする
> malloc系の関数で動的に確保する
いずれもその場しのぎで拙い
どの位のサイズからその必要が出るかが処理系に依存しているので可搬性がない
プログラムの論理上 auto であるべきものを、そうでなくするのは汚いコードだ
スタックの指定を省くこと自体がそもそも「汚い」ので、そこから改めるべき
0305デフォルトの名無しさん
2008/12/04(木) 09:12:00典型的な「机上の空論」と言う奴だな。
0306デフォルトの名無しさん
2008/12/04(木) 09:21:150307デフォルトの名無しさん
2008/12/04(木) 09:41:47malloc の使い方を知っていればどうということはないだろ
理想論だけでは何もできないぞ
0308デフォルトの名無しさん
2008/12/04(木) 09:43:13メモリー量の問題は論理的な設計でなく物理的な設計の範疇になるので
「汚い」は仕方がない
0310デフォルトの名無しさん
2008/12/04(木) 09:50:32お前は何を言っているんだ。
そもそも、それだけ大きい配列の要素数が静的に決定される状況が思い浮かばん。
「動的に決定するものだけど、取り敢えず決め打ちで」
てところだろ。
0311デフォルトの名無しさん
2008/12/04(木) 09:53:560312デフォルトの名無しさん
2008/12/04(木) 09:55:390313デフォルトの名無しさん
2008/12/04(木) 09:56:21モロ物理設計だろ
0314312
2008/12/04(木) 09:56:260315デフォルトの名無しさん
2008/12/04(木) 09:56:53そのレスがなぜ俺宛になっているのかがわからない
おまえは「お門違い」という言葉を知っているか?
0316デフォルトの名無しさん
2008/12/04(木) 09:58:21配列や malloc を使ったら「汚い」という貴殿の主張には賛成しかねる
0317デフォルトの名無しさん
2008/12/04(木) 10:09:020318デフォルトの名無しさん
2008/12/04(木) 10:15:080319デフォルトの名無しさん
2008/12/04(木) 10:16:07インラインアセンブラ
もしくは加算結果をチェック
0320デフォルトの名無しさん
2008/12/04(木) 10:21:23そうなんだけど、なんかビットのシフト演算とかで出来ないかなと思って
0321デフォルトの名無しさん
2008/12/04(木) 10:36:190322デフォルトの名無しさん
2008/12/04(木) 11:39:24最上位ビットを見て、繰り上がるか判定
0323デフォルトの名無しさん
2008/12/04(木) 11:39:25オーバーフロー := 最上位ビットからの溢れ xor その下のビットからの溢れ
0324デフォルトの名無しさん
2008/12/04(木) 11:41:29if ((x^z) & (y^z) & 最上位ビット) {
// オーバーフローした
}
0325デフォルトの名無しさん
2008/12/04(木) 11:51:310326デフォルトの名無しさん
2008/12/04(木) 11:53:25Yの字の枝とゴムがあればおk
0327デフォルトの名無しさん
2008/12/04(木) 12:13:380328デフォルトの名無しさん
2008/12/04(木) 12:15:370329デフォルトの名無しさん
2008/12/04(木) 12:16:26浮動小数点数演算の例外を有効にしてtry - catch
0330デフォルトの名無しさん
2008/12/04(木) 12:48:05無限大にはなんねーだろ
0331デフォルトの名無しさん
2008/12/04(木) 13:24:270332デフォルトの名無しさん
2008/12/04(木) 13:24:49個々のコンパイラの説明書を読めば書いてあることもあるが、まとまった表はないな。
http://msdn.microsoft.com/en-us/library/9f53hsws.aspx
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Structures-unions-enumerations-and-bit_002dfields-implementation.html
0333デフォルトの名無しさん
2008/12/04(木) 14:36:24配列a[100]があるとします。
a[0]~a[50]までよみこんだあと、a[1]~a[51]、a[2]~a[52]
と連続で読み込むのは可能でしょうか?
0334デフォルトの名無しさん
2008/12/04(木) 15:03:22御自由にどうぞ
0335デフォルトの名無しさん
2008/12/04(木) 15:08:44#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;
}
0336デフォルトの名無しさん
2008/12/04(木) 15:12:38言ってる意味がわかりません
よみこむとは何を何がどのように読み込むのですか?
具体的に説明してください
0337デフォルトの名無しさん
2008/12/04(木) 16:07:410338デフォルトの名無しさん
2008/12/04(木) 16:21:420339デフォルトの名無しさん
2008/12/04(木) 16:29:15(フルサポートではないけど) VZエディタのソースとか?
0340デフォルトの名無しさん
2008/12/04(木) 16:34:09浮動小数点の丸めなどの処理系の仕様によるものか、アルゴリズムそのものの違いによるものだろう
0341デフォルトの名無しさん
2008/12/04(木) 16:34:11議論の挙げ句に低劣な罵倒語が頂けるのは名誉であることを
知ってて言っているなら、褒めてくれてありがとよ
0342デフォルトの名無しさん
2008/12/04(木) 16:42:25・
・
(以上他の入力用データ)
1 2 7 10 14 17
(以下他の入力用データ)
・
・
=== sample.def ===
上のようになっているデータを読み込んでいく中で、
真ん中に記述されているデータを読み込む際に
fgetsで取り込んだ後に読み込んだ数字を(1)(2)(7)...(17)のように
一つずつint型に変換して別の配列に格納する方法ってありますか?
0343デフォルトの名無しさん
2008/12/04(木) 16:56:450344デフォルトの名無しさん
2008/12/04(木) 17:13:31一行に何項目あるかがはっきりしているならsscanf()を使うのが早い
そうでないならstrtol()を繰り返し呼んで自前で順次値を格納すること
0345デフォルトの名無しさん
2008/12/04(木) 17:15:04ヒント:正規表現
0347デフォルトの名無しさん
2008/12/04(木) 17:24:080348デフォルトの名無しさん
2008/12/04(木) 17:27:320349デフォルトの名無しさん
2008/12/04(木) 17:33:12#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;
}
0350デフォルトの名無しさん
2008/12/04(木) 17:39:47いらない
0351デフォルトの名無しさん
2008/12/04(木) 17:51:02strtol() は、その変換を行う際、数値に先立つ空白文字を読み飛ばす。
よって以下の行は不要である。
while(*p == ' ') p++;
また、この終了条件 while(*p != 0){ では、恐らく常に1回余計に変換と格納が発生する。
取得した文字列の末尾の '\n' を取り除いていないからである。
さらに、もし何か数値として認識できない文字が入力されたとき、
p の値が変化せず、それを検出もできないために、無限ループに陥ってしまう。
strtol() で連続的に文字列を解析する場合は、第一引数に与えるポインタと
第二引数にアドレスを与えるポインタを別のものとして、呼出し後にその値を比較し、
変換が正常に行われたかどうかを確認しなければならない。
0352351
2008/12/04(木) 17:59:48'\n' を取り除かない場合も、常に無限ループとなる。
0353デフォルトの名無しさん
2008/12/04(木) 18:06:08#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;
}
こうかな?
0354デフォルトの名無しさん
2008/12/04(木) 18:06:42for(i = 0; i < 64; i++){
t = strtol(p, &n, 10);
if(p == n) break;
a[i] = t;
p = n;
}
0355342
2008/12/04(木) 19:10:59どうもありがとうございました<m(_ _)m>
0356デフォルトの名無しさん
2008/12/04(木) 22:32:39どの本を見ても、unsigned型の関数が無かったので疑問を持ちました。
unsigned型の値を返す関数って作れるのでしょうか?
int plusint(int a, int b){
return a + b;
}
0357デフォルトの名無しさん
2008/12/04(木) 22:36:55全然全く毛ほども問題ないよ。私は結構作っているけどね。
0358デフォルトの名無しさん
2008/12/04(木) 22:37:50標準関数にsize_t返すやつがあるじゃん。
0359デフォルトの名無しさん
2008/12/04(木) 22:38:160360デフォルトの名無しさん
2008/12/04(木) 22:47:530361デフォルトの名無しさん
2008/12/04(木) 23:05:22作れるか作れないかということで言えばもちろん作れる
ただし、関数というものの常として、何らかのエラーが発生したときには
それを呼び出し元に伝えなきゃいけないのだが、
戻り値をsignedにしておけばマイナスの値が使えるということがある
0362デフォルトの名無しさん
2008/12/04(木) 23:06:30return (unsigned)(a + b);
}
簡単に作れたよ
0363デフォルトの名無しさん
2008/12/04(木) 23:13:54足し算でエラーとか言われても。値域狭めるだけじゃん。
0364デフォルトの名無しさん
2008/12/04(木) 23:21:060365デフォルトの名無しさん
2008/12/04(木) 23:22:040366デフォルトの名無しさん
2008/12/04(木) 23:23:00別に足し算する関数について言ったわけではないぞ
疑問への答えと、なぜそういう関数がまれなのかの補足をしただけだ
0367デフォルトの名無しさん
2008/12/04(木) 23:24:24ご回答ありがとうございました。
おかげ様ですっきりしました。
0368デフォルトの名無しさん
2008/12/04(木) 23:25:060369デフォルトの名無しさん
2008/12/04(木) 23:25:55fgetc とか
0370デフォルトの名無しさん
2008/12/04(木) 23:26:13引数だってintばっかだし。
>>368
EOF
0371デフォルトの名無しさん
2008/12/04(木) 23:26:430372デフォルトの名無しさん
2008/12/04(木) 23:32:340373デフォルトの名無しさん
2008/12/04(木) 23:37:39signed と演算されまくりそうな関数だが。
0374デフォルトの名無しさん
2008/12/04(木) 23:41:310375デフォルトの名無しさん
2008/12/04(木) 23:43:540376デフォルトの名無しさん
2008/12/04(木) 23:44:250
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つ
だけを読み込んでしまう無限ループに陥ってしまいます。
どのようにしたらこの無限ループを回避できるでしょうか?
0377デフォルトの名無しさん
2008/12/04(木) 23:46:190378デフォルトの名無しさん
2008/12/04(木) 23:48:49%dつかった?
0379デフォルトの名無しさん
2008/12/04(木) 23:49:18全部fgets()で読み込んで、sscanf()で解釈したら?
scanf()系をほかと混ぜて使うのがダメっていうか、まぜなくても使わないほうがいい。
0380376
2008/12/04(木) 23:50:530381デフォルトの名無しさん
2008/12/04(木) 23:53:18aは16進数にしたいの?
0382デフォルトの名無しさん
2008/12/04(木) 23:53:400383デフォルトの名無しさん
2008/12/04(木) 23:54:56fgets()したものをsscanf()する方がまし。
それはさて、3行目以降は3つの数字とあるけど真ん中にアルファベットが書かれているのだが。
0384376
2008/12/04(木) 23:59:501つ目と3つ目は現在と次の状態、2つ目は入力文字を表します
0385デフォルトの名無しさん
2008/12/05(金) 00:01:41そろそろ具体的なコード出してくれんとじゃないとどうにもならんな
0387デフォルトの名無しさん
2008/12/05(金) 00:04:350388デフォルトの名無しさん
2008/12/05(金) 00:05:170389デフォルトの名無しさん
2008/12/05(金) 00:14:50文字列になるので2バイトのバッファを用意する必要があるが・・・。
0390デフォルトの名無しさん
2008/12/05(金) 00:17:580391デフォルトの名無しさん
2008/12/05(金) 00:18:590392376
2008/12/05(金) 00:18:59かなり長いので
問題の部分は区切っておきました
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8214.txt
0393デフォルトの名無しさん
2008/12/05(金) 03:23:06if( 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;
}
0394デフォルトの名無しさん
2008/12/05(金) 03:27:51while( fscanf(fp,"%d %c %d", &next, &trans, &now) == 3 ){
if( isalnum(trans) ){
でいいのか
0395デフォルトの名無しさん
2008/12/05(金) 05:12:52struct 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'を取得したいです*/
0396デフォルトの名無しさん
2008/12/05(金) 05:36:21printf("%d %d %d\n",a,b,c); って書くのと
char p[]="%d %d %d\n";
printf(p,a,b,c); って書くのがあったんですが
2つ目はなんで "p" って書かなくていいんですか? あとどっちを使うのがいいんでしょう
0397デフォルトの名無しさん
2008/12/05(金) 06:10:08p と書くと {'%', 'd', ' ', '%', 'd', ' ', '%', 'd', '\n', '\0'}
printf("%d %d %d\n", a, b, c); って書き方のほうが多く見かける
0398デフォルトの名無しさん
2008/12/05(金) 06:17:530399デフォルトの名無しさん
2008/12/05(金) 08:53:56#define hoge (1)
のように、単独の定数をカッコでくくっているのは何の意味があるのでしょうか?
#define x ((x) * (x))
とかなら意味はわかるのですが、単独の定数くくる意味ってあります?
0400デフォルトの名無しさん
2008/12/05(金) 09:09:30#define nijyo(x) ((x) * (x))
これならわかります。
0401デフォルトの名無しさん
2008/12/05(金) 10:01:17勢い。
0402デフォルトの名無しさん
2008/12/05(金) 10:03:00#defaine hoge (1)
→
#defaine hoge (1+20)
とか
0403デフォルトの名無しさん
2008/12/05(金) 10:35:16グローバル変数をint型で宣言して
0x04で初期化しようとしたら
矛盾するというようなエラーが出るのですが、
これは何のエラーなんでしょうか。
0404デフォルトの名無しさん
2008/12/05(金) 10:47:320405デフォルトの名無しさん
2008/12/05(金) 11:01:11((x) * (x))
おっぱい大好きでちゅか?
0406デフォルトの名無しさん
2008/12/05(金) 11:05:32conflicting types for '変数名'
というエラーが出ます。
天才さん
0407399
2008/12/05(金) 11:12:25あんまり意味ないってことですね。
ちなみにおっぱいは好きです。
0408376
2008/12/05(金) 11:54:592行目がいくつあっても実行できるプログラムでないといけません
0409デフォルトの名無しさん
2008/12/05(金) 11:59:29初期化関係ないんじゃ?
同じ名前で別の定義してるのでは。
0410デフォルトの名無しさん
2008/12/05(金) 12:51:230411デフォルトの名無しさん
2008/12/05(金) 13:02:380412デフォルトの名無しさん
2008/12/05(金) 13:23:23ありがとうございました。
すいませんもう一つ質問したいのですが、c言語で画像を表示することは出来ますか?
また、できるとしたらどのようにしたらよいですか?
0413406
2008/12/05(金) 13:30:51ありがとうございます。
エラー時は
int [変数名];
[変数名]=0x04;
のように書いていたところを
int [変数名] = 0x04;
にしたらエラーが消えたのですが、
これは何が違うのでしょうか。
0414デフォルトの名無しさん
2008/12/05(金) 13:40:35大抵の環境では出来ますが、方法はその環境によって異なります
0415デフォルトの名無しさん
2008/12/05(金) 13:40:55問題あるはずないと思って試したらやっぱり問題なかった。
それがソースからのコピペで変数名だけ書き換えたものだとしたら上はセミコロンが全角になってる。
そこを修正して問題が出るようならコンパイラ名を出してほしい。
0416デフォルトの名無しさん
2008/12/05(金) 13:42:17リストの先頭から何かの変数を使ってポインタを辿る回数を数えろ
もしリスト自体のノード順序が固定なら構造体のメンバに
要素数を示す変数を加えて管理することもできるが、それぐらいなら
(メモリが許すなら)配列で確保したほうが面倒がないね
>>396
いいも悪いも配列名はそのままで配列名であって
""で囲ったら配列名ではないただの文字列定数になってしまう
>>399
そのマクロがソース中で展開されるときに
絶対に数値にしかならないことを保障したい場合に使う
具体的に言うと文字列化演算子#とトークン連結演算子##を作用させないため
>>403
ソース貼れ
>>408
そういうことは先に言え
だったらfgetsを呼ぶ前に\nを読み飛ばすか、
さもなきゃfgetsを1回余分に呼ぶか、
あるいは全部fgetsしてsscanfするしかない
>>412
環境依存
0417デフォルトの名無しさん
2008/12/05(金) 13:45:24Cでは関数の外に実行文 (x = 4; のような) を書くことはできません
0418デフォルトの名無しさん
2008/12/05(金) 13:46:32考えてみると2項行がいくつあるかわかんないってことは
いつfscanfに切り替えたらいいかもわかんないんじゃないか
もう全部fgets→sscanfしろ
0419デフォルトの名無しさん
2008/12/05(金) 13:56:41これは初期化ではない。
0420406,413
2008/12/05(金) 13:57:16>>417
ありがとうございます。
実行文を関数内にも書いてみたらそちらの方は
エラーが出ませんでした。
説明不足申し訳ないです。
ありがとうございました。
0421デフォルトの名無しさん
2008/12/05(金) 13:57:460422デフォルトの名無しさん
2008/12/05(金) 14:06:49if(!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));
0423デフォルトの名無しさん
2008/12/05(金) 14:14:05それから項目毎にバラすのが定石だよなあ。
0424デフォルトの名無しさん
2008/12/05(金) 18:23:47私はexit
0425デフォルトの名無しさん
2008/12/05(金) 18:28:24エラー表示して終了
0426デフォルトの名無しさん
2008/12/05(金) 18:33:06そんなもんそのプログラムの内容によるとしか言えんだろ
0427デフォルトの名無しさん
2008/12/05(金) 18:33:090428デフォルトの名無しさん
2008/12/05(金) 18:35:240429デフォルトの名無しさん
2008/12/05(金) 18:36:540430デフォルトの名無しさん
2008/12/05(金) 18:38:25場合による。
もう一度確保を試みたり、例外処理として代行処理関数呼んだり、例外処理として関数内gotoしたり、ポインタを返す関数ならNULLを返したり、整数を返す関数ならエラーとして整数定数を返したり、続行不可能と判断してエラーを吐いてexit()を呼んだりする。
0431デフォルトの名無しさん
2008/12/05(金) 18:52:19頑張って対処します。
0432デフォルトの名無しさん
2008/12/05(金) 21:15:22プログラムが終わるまで生き続けるんですか?
0433デフォルトの名無しさん
2008/12/05(金) 21:16:30モチロンデス
0434デフォルトの名無しさん
2008/12/05(金) 21:18:55どうも
0435デフォルトの名無しさん
2008/12/05(金) 21:19:52なんかできることあるの?
0436デフォルトの名無しさん
2008/12/05(金) 21:22:160437デフォルトの名無しさん
2008/12/05(金) 21:29:330438デフォルトの名無しさん
2008/12/05(金) 21:30:30kwsk
0439デフォルトの名無しさん
2008/12/05(金) 21:40:15なんでこんなこと聞くかというと
FILE *fpとfopen fcloseを使ってファイル出力をするプログラムを作っていたとき
作成時の便宜のためfopen の後ろにfp = stdinとしていたときそう思ったんです
0440デフォルトの名無しさん
2008/12/05(金) 21:41:120441デフォルトの名無しさん
2008/12/05(金) 21:48:03malloc()はNULLを返さないらしい。
メモリ確保に失敗したって分かるのは、メモリにアクセスするとき。
0443デフォルトの名無しさん
2008/12/05(金) 22:37:32kernelに怒られて、強制終了した。
0444デフォルトの名無しさん
2008/12/05(金) 22:47:43設定で、その場で確保してみてエラーを返すようにもできるけどね。
0445デフォルトの名無しさん
2008/12/05(金) 22:54:17NULLぽが返ったらどうせ何も出来ないのだからとっとと終了
0446デフォルトの名無しさん
2008/12/05(金) 22:56:30>>430
0447デフォルトの名無しさん
2008/12/05(金) 22:58:23メモリ確保できるかどうかで使用するアルゴリズムを変えてるぜ
0448デフォルトの名無しさん
2008/12/05(金) 23:03:53それは信じられないなあ。
セグメントバイオレーションを起こすアドレスを返せば、書き込んだときに強制終了して
わかるけど。そうでないアドレスを返したら、あちこちをぶっ壊すってこと?
0449デフォルトの名無しさん
2008/12/05(金) 23:08:21Linuxの勉強してきてくれ。
簡単に言えば、malloc()は仮想メモリ空間のアドレスを返すだけ。
要は、メモリ使用の予約をしているだけだと思えばいい。
で、実際に使おうとしたときに実メモリが足りなければスワップしてメモリを空けるのだけれど、
(GUIが走っていたりして)メモリの奪い合いが頻発し始めると強制終了の憂き目に遭う訳だ。
0450デフォルトの名無しさん
2008/12/05(金) 23:08:34http://www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
このページにはバグって書いてあるけど、どっかで読んだ別の文章では、
現代的なOSはそういうもんだから、もうmalloc()のリターン値をチェックする
習慣はいらないんじゃね? みたいなことが書かれてた。
0451デフォルトの名無しさん
2008/12/05(金) 23:16:10質問: オペレーティングシステムによっては malloc したメモリを実際に確保するのを
プログラムがそのメモリを使おうとするまで先延ばしすると聞いたことがある。
これは文法上許されるのか。
回答: これは難しい。規格は、システムはこういう風に振る舞ってもよいと書いていないけれど、
こういう風に振る舞ってはいけないとはっきり書いてあるわけでもない。
こういう“先延ばしの失敗”の実装は規格が暗黙に要求しているところに
従っていないように思える。 …… こうした遅延割り付けをするシステムは通常、
特別のシグナルを使ってメモリの量が危険なほど少なくなっていることを知らせる仕組みを持つ。
しかし移植性の高いことを目指したプログラムやタコなプログラムはそういうシグナルを捕まえない。
遅延割り付けをするシステムの中にはプロセス単位かユーザ単位で遅延割り付けをやめる仕組み
(昔からの malloc の意味付けに戻る仕組み)を用意しているものもある。
しかし詳細はシステムによって異なる。
0452デフォルトの名無しさん
2008/12/05(金) 23:25:19という手を思いついたけどうまく行くかどうかは知らない
0453デフォルトの名無しさん
2008/12/05(金) 23:41:220454デフォルトの名無しさん
2008/12/06(土) 00:06:23運用テストではそういった類のテストをする
0455デフォルトの名無しさん
2008/12/06(土) 03:54:14int 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]と同じになるのですが、
どこがおかしいのでしょうか?本来ならば新しいアドレスが割り振られるはずですよね?
0456455
2008/12/06(土) 03:58:55printf("\na[3]=%d\n",a[4]);→printf("\na[3]=%d\n",a[3]);
これでも私の環境では実行結果は同じになります
0457455
2008/12/06(土) 04:04:57この辺りよく理解できていないので、
free()は何をしていてこんな結果が得られるのか、
どなたかご教授願えたらと思います・・・
0458デフォルトの名無しさん
2008/12/06(土) 04:07:32ここで、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]を開放しなければならない。
0459デフォルトの名無しさん
2008/12/06(土) 04:17:26お前がやったのはこういうこと
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は迷子になってしまったね
0460デフォルトの名無しさん
2008/12/06(土) 04:23:31a[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));)
0461デフォルトの名無しさん
2008/12/06(土) 04:46:15とても分かりやすい解説ありがとうございます
よく理解できましたー
0462デフォルトの名無しさん
2008/12/06(土) 09:59:53入門本では、
int *pA;
のように宣言すればおk と書いてあるのですが、
そこら辺に転がっているCのソースを見ると
float*
char**
のようになっているポインタがあるのですが、
いったい何がどう違うのでしょうか?
0463デフォルトの名無しさん
2008/12/06(土) 10:18:36float *p はfloat型を指すポインタ
char **p はchar*型(つまりchar型のポインタ)を指すポインタ
一口にポインタといっても、指す先の型によってポインタの型も変わってくる
0464デフォルトの名無しさん
2008/12/06(土) 12:41:18BCC Developerをインストールしたが
BCC Developerの<デバッグ>ボタンを押しても、ターボデバッガが起動しない。
ターボデバッガのインストール後のパスの設定はどうするのでしょうか。
本には「Bcc Developerの環境設定を参照」とあるが、さっぱり分かりません。
0465デフォルトの名無しさん
2008/12/06(土) 13:03:300466デフォルトの名無しさん
2008/12/06(土) 13:34:580467デフォルトの名無しさん
2008/12/06(土) 16:47:130468デフォルトの名無しさん
2008/12/06(土) 17:00:19詳しくはググるか書籍で
0469デフォルトの名無しさん
2008/12/06(土) 18:05:150470デフォルトの名無しさん
2008/12/06(土) 18:12:42釣られてる?
0471デフォルトの名無しさん
2008/12/06(土) 18:16:17メール送ったりできる
0472デフォルトの名無しさん
2008/12/06(土) 18:29:13だからアドレスを渡してやる事で処理を速くする
0473デフォルトの名無しさん
2008/12/06(土) 19:23:140474デフォルトの名無しさん
2008/12/06(土) 19:24:260475デフォルトの名無しさん
2008/12/06(土) 20:29:370476デフォルトの名無しさん
2008/12/06(土) 21:30:50のaの部分(初期なんとか部)に、何も書かずにforループさせることはできますか?
0477デフォルトの名無しさん
2008/12/06(土) 21:30:57そこをポインタがないとか言われてるJavaとかC#ではどうやってるの?
0478デフォルトの名無しさん
2008/12/06(土) 21:33:27参照型は、まあ、ポインタだよね。
0479デフォルトの名無しさん
2008/12/06(土) 21:38:01できる
0480デフォルトの名無しさん
2008/12/06(土) 21:39:37参照型はポインタだ だから、JavaやC#はポインタしかない言語だ
というのを何かの本で読んだ事あるんだけど、Cのポインタとはまたキャラが違うと思うんだ。
俺はJavaから入って、Cに挫折したけど、Javaで飯を食って行ってるヘタレPGだから、
Cを自由自在に操れる人は本気で凄いと思う。
malloc関数とかfree関数のつっこんだ操作がイミフで仕事先の先輩PGもあんなもん覚えなくていいよー と言うんだが…
これでいいんだろうか…
0481デフォルトの名無しさん
2008/12/06(土) 21:43:040482デフォルトの名無しさん
2008/12/06(土) 21:43:44徹底的に理詰めで理解しようとすることだ
0484デフォルトの名無しさん
2008/12/06(土) 21:46:300485デフォルトの名無しさん
2008/12/06(土) 21:51:44多次元配列の確保とかでわけわかんなくなる人もいるんだよ
0486デフォルトの名無しさん
2008/12/06(土) 21:52:38ATに慣れるとMTに乗れなくなる現象ですね
0487デフォルトの名無しさん
2008/12/06(土) 21:54:26と思うけど保証はしない。
0488デフォルトの名無しさん
2008/12/06(土) 21:54:59それは、基本ができてないからだろ
0489デフォルトの名無しさん
2008/12/06(土) 21:56:21誤った思い込みをしてしまう可能性もあるので一長一短
0490デフォルトの名無しさん
2008/12/06(土) 22:17:57基本の定義を教えてくれ
0491デフォルトの名無しさん
2008/12/06(土) 22:39:05・ポインタ型は、あるオブジェクトへの参照を表す値を持つオブジェクトである。
そのポインタが何を指してるのかを把握出来ることが、
ポインタを使う上での基本じゃないかね。
0492デフォルトの名無しさん
2008/12/06(土) 22:40:590493デフォルトの名無しさん
2008/12/06(土) 22:45:28(.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ!
|i i| }! }} //|
|l、{ j} /,,ィ//| 『多次元配列の確保についての基本の定義を尋ねたら
i|:!ヾ、_ノ/ u {:}//ヘ ポインタについて当たり前の事を説明された』
|リ u' } ,ノ _,!V,ハ |
/´fト、_{ル{,ィ'eラ , タ人 な… 何を言ってるのか わからねーと思うが
/' ヾ|宀| {´,)⌒`/ |<ヽトiゝ おれも何をされたのかわからなかった
,゙ / )ヽ iLレ u' | | ヾlトハ〉
|/_/ ハ !ニ⊇ '/:} V:::::ヽ 頭がどうにかなりそうだった…
// 二二二7'T'' /u' __ /:::::::/`ヽ
/'´r -―一ァ‐゙T´ '"´ /::::/-‐ \ 超スピードだとか催眠術だとか
/ // 广¨´ /' /:::::/´ ̄`ヽ ⌒ヽ そんなチャチなもんじゃあ 断じてねえ
ノ ' / ノ:::::`ー-、___/:::::// ヽ }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::... イ もっと恐ろしいものの片鱗を味わったぜ…
0494デフォルトの名無しさん
2008/12/06(土) 22:54:46本当にポインタについて当たり前のことを理解しているというのなら
頭を使えよ
0495デフォルトの名無しさん
2008/12/06(土) 22:59:1810*10*10の三次元の配列を確保するとして、
p = malloc(sizeof(int) * 10 * 10 * 10);
とかで、pの型ってどうなるんだっけ、ってちょっと考えちゃうな。
まあ、でも、そんなCの記法の問題だから調べれば分かる問題だし、
ポインタの難しさとはちょっと違うよな。
0496デフォルトの名無しさん
2008/12/06(土) 23:14:060497デフォルトの名無しさん
2008/12/06(土) 23:24:05俺にも経験がある で自動ガベコレとか始めるんだわ
0498デフォルトの名無しさん
2008/12/06(土) 23:27:230499デフォルトの名無しさん
2008/12/06(土) 23:28:060500デフォルトの名無しさん
2008/12/06(土) 23:40:010501デフォルトの名無しさん
2008/12/06(土) 23:42:30配列の配列や、配列の配列の配列があるだけ
0502デフォルトの名無しさん
2008/12/06(土) 23:58:20Cではコンパイラは高度なことは何もしてくれないしルールも少ない。
用意されているのは素材程度。
多次元配列もプログラマがそう見立ててデータ構造を解釈するしかない。
0503デフォルトの名無しさん
2008/12/07(日) 00:03:380504デフォルトの名無しさん
2008/12/07(日) 00:05:47Ultra-C Pro 2.1
http://www.runexy.co.jp/products/ultra-c/
0505デフォルトの名無しさん
2008/12/07(日) 00:16:100506デフォルトの名無しさん
2008/12/07(日) 00:27:31普通にデバッグ実行と大差無いような・・・
>>504のリンク先では
「コンパイルやリンクといった煩わしい処理を必要としない」
ってあるけど、そもそもプログラムを書くことは煩わしくないのか?w
0507デフォルトの名無しさん
2008/12/07(日) 00:36:08「プログラムを書くことに専念できる」とも書いてあったよ。
0508デフォルトの名無しさん
2008/12/07(日) 00:40:340509デフォルトの名無しさん
2008/12/07(日) 00:53:520510デフォルトの名無しさん
2008/12/07(日) 01:54:430511デフォルトの名無しさん
2008/12/07(日) 01:56:160512デフォルトの名無しさん
2008/12/07(日) 02:14:15会社から支給されたDELLのInspiron 700mってやつ
0513デフォルトの名無しさん
2008/12/07(日) 02:37:11シミュレーションやる時はちょっといいVGA入ったコンピュータ使ってるけど詳細わかんね。
0514デフォルトの名無しさん
2008/12/07(日) 02:55:51スレが立っているほどだし。まあ過疎っているけど。
http://pc11.2ch.net/test/read.cgi/tech/1114397934/l50
0515デフォルトの名無しさん
2008/12/07(日) 03:25:120516デフォルトの名無しさん
2008/12/07(日) 12:21:18http://www.orchid.co.jp/soft/products.html
0517デフォルトの名無しさん
2008/12/07(日) 12:39:51どの程度のことができるようになれば追いついたことに
なりますか?
0518デフォルトの名無しさん
2008/12/07(日) 12:47:390520デフォルトの名無しさん
2008/12/07(日) 14:31:220521デフォルトの名無しさん
2008/12/07(日) 14:35:170522デフォルトの名無しさん
2008/12/07(日) 22:14:34例外機構はCでまともに記述不可能なので
原理的に無理。
0523デフォルトの名無しさん
2008/12/07(日) 22:25:36例外機構はCでまともに記述不可能なので
例外機構はCでまともに記述不可能なので
0524デフォルトの名無しさん
2008/12/07(日) 22:44:250525デフォルトの名無しさん
2008/12/07(日) 22:46:370526デフォルトの名無しさん
2008/12/07(日) 22:48:500527デフォルトの名無しさん
2008/12/07(日) 22:49:430528デフォルトの名無しさん
2008/12/07(日) 23:09:590529デフォルトの名無しさん
2008/12/08(月) 00:13:38また、開放されたことを確認する方法はありますか?
char *p1;
int *p2;
p1 = (char*)malloc(5);
p2 = (int*)p1;
free(p2);
0530デフォルトの名無しさん
2008/12/08(月) 00:19:20問題ない
つまりはアドレスさえちゃんとmallocで帰ってきたやつならキャストしようが、代入しようがおk
以下三行は読み飛ばして結構
一応理由としては(一応環境な内部っぽい話だけど)
mallocによって確保した場合は確保した領域のすぐ手前にどれだけの量確保したかの情報が書き込まれてる
freeにアドレスを渡された場合、そのアドレスの手前を見てどれだけ解放するべきかチェックして解放を行う
0531デフォルトの名無しさん
2008/12/08(月) 00:41:23開放されることになっている
確認する必要はないし、できない
0532デフォルトの名無しさん
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を比較する場合どのように
記述すればいいでしょうか?
よろしくお願いします。
0533デフォルトの名無しさん
2008/12/08(月) 02:19:51ファイルを開くのはfopen
ファイルからの読み込みはfgets, fgetc, fread, fscanf
文字列の比較はstrcmp
を、使えばいい
ソースを丸ごと書いてほしいなら宿題スレへ
0534デフォルトの名無しさん
2008/12/08(月) 02:33:19,まで読み込みはscanf系使えばできるよ
0535デフォルトの名無しさん
2008/12/08(月) 03:08:09一般的には二つの方法がある。
一つはファイルから直接fscanfで読み込んでいく方法。
コード全体が簡素で済むのが利点だが、変なデータを投げ込まれたら
ひどい間違いが起きる可能性も高い。
ちなみにscanf系関数で項目を「読み飛ばす」には、ダミーの変数のアドレスを与えるか、
該当項目を%*dなどとする。詳しくはscanf書式指定文字列の解説を読むこと。
もう一つはfgetsで1行読み込んだ文字列をsscanf(この場合は先頭の項目なので、
strtolやstrtod、あるいはatoiやatofでもいいかもしれない)で解析して値を取り出す方法。
こちらのほうが一行ずつ確定的に処理を進められるため、間違いが置きにくいしエラーを捕まえやすい。
0536デフォルトの名無しさん
2008/12/08(月) 04:50:472000年から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;
}
ではなにを入力しても"非開催"になってしまいます。
なにがいけないのでしょうか。
回答例は渡されていて、そちらの方が優れているのもわかるのですが
それを見ずに書いた自分のソースが動かないのがなんか悔しいです。
0537536
2008/12/08(月) 05:01:16if (orin == 0){
のorinはちゃんとolynに直してます。
申し訳ありません。
0538デフォルトの名無しさん
2008/12/08(月) 05:15:570539デフォルトの名無しさん
2008/12/08(月) 05:16:07関数を正しく呼び出していないからである。
if (olyn == 0){
上の行は、決して君が期待した動作をしてくれない。
配列の名前と同様に、関数の名前はすぐに関数へのポインタに成り下がる。
そして実在する関数へのポインタは当然ヌルポインタではないので、
これを 0 と比較した結果は常に偽となる。よって if 節の処理は行われない。
正しいコードは以下のようになる。
if (olyn(year) == 0){
0540536
2008/12/08(月) 05:19:14olynの戻り値に対応させる項目が main になかったんですね。
違ったら罵倒してください。
あとolymですねすごい恥ずかしい。
0541539
2008/12/08(月) 05:21:24丸投げしたわけじゃないからこちらかと思ったのですが……
別の方がよかったですかね。気をつけます。
>>539
ありがとうございました。
お手数かけて申し訳ありません。
0542デフォルトの名無しさん
2008/12/08(月) 05:23:05違う
無いのは引数
0544デフォルトの名無しさん
2008/12/08(月) 09:26:19お勧めのサイトもしくは書籍を教えてください
0545デフォルトの名無しさん
2008/12/08(月) 10:15:17消えろカス
0546デフォルトの名無しさん
2008/12/08(月) 10:21:09C言語なんか古くてダサいしJAVAスレいってきます。
0547デフォルトの名無しさん
2008/12/08(月) 10:46:12( ・∀・ )
0548デフォルトの名無しさん
2008/12/08(月) 10:57:35int 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);
}
0549デフォルトの名無しさん
2008/12/08(月) 10:59:15正解率を入力してください 0〜100%:50
成績はFです
成績はDです
成績はCです
成績はBです
成績はAです
続行するには何かキーを押してください . . .
という結果になってしまいます。
どこがおかしいのか、全然わかりません。。
0550、
2008/12/08(月) 11:06:090551デフォルトの名無しさん
2008/12/08(月) 11:06:22こういう書き方を
if(0 <= seikai && seikai <= 60)
こうする
0552デフォルトの名無しさん
2008/12/08(月) 11:12:12素早いレスありがとうございます。
無事できました。
>if(0<=seikai<=60)
この書き方は、具体的にどこがまずいんですか?
文法的に間違っている?
0553デフォルトの名無しさん
2008/12/08(月) 11:13:48spawn関数を使え。
0554デフォルトの名無しさん
2008/12/08(月) 11:15:35文法的には間違っていないが、論理的に間違っている。
C言語の意味的には(0<=seikai)<=60と同じだから、0<=60か1<=60として評価される。
0555デフォルトの名無しさん
2008/12/08(月) 11:21:02なるほど。
わかりやすい!
解説まで、わざわざ有難うございます。
0556デフォルトの名無しさん
2008/12/08(月) 12:52:48int 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]で打ち込む個数を等しくするにはどうすればいいのでしょうか?
0557デフォルトの名無しさん
2008/12/08(月) 12:57:030558デフォルトの名無しさん
2008/12/08(月) 12:58:480559デフォルトの名無しさん
2008/12/08(月) 13:04:15お手数おかけしました。
ありがとうございます。
0560デフォルトの名無しさん
2008/12/08(月) 13:06:270561デフォルトの名無しさん
2008/12/08(月) 13:08:10ホントに初歩的な質問ですみませんでした…。
いろんなサイトを見てみます。
0562デフォルトの名無しさん
2008/12/08(月) 13:15:02だから、"%d "としてはダメ。
0563デフォルトの名無しさん
2008/12/08(月) 13:22:36こんなに見つけにくい間違いを見つけていただいて、ホントにありがとうございました!
0564562
2008/12/08(月) 13:42:12×空の入力を要求
○ダミーの入力を要求
例えば、最初の"%d "に対して
3↓(矢印でEnterキーを表わすとする)
2↓
と入力すると、「3」だけが%dで消費されて「\n」がその後の空白で消費される。
仮にこの後getchar()すれば、「2」が得られることになる。
# このscanf()の振る舞いは美しくない。やはり、fgets()してからsscanf()した方がましなようだ。
0565デフォルトの名無しさん
2008/12/08(月) 14:54:28だから次に何か打ち込んでやるまで処理が停まってしまう
0566デフォルトの名無しさん
2008/12/08(月) 15:06:11つまり、実際には一度'2'を読んでそれが「空白でない文字」と判ってから読んでなかったことにしているということかな。
0567デフォルトの名無しさん
2008/12/08(月) 15:20:02その通り
実際"%d %d"とか書く必要はないんだよね、"%d%d"でいい
空白入れる必要があるのは%cの周辺だけ
0568デフォルトの名無しさん
2008/12/08(月) 16:08:53char a[5][3]={"12","34","56","67","89"};
for (i=0 ; i<5 ; i++) printf("%s\n",a[i]);
これはちゃんと表示されるのに char を int に変えるとエラーになるんですがなんでですか?
0569デフォルトの名無しさん
2008/12/08(月) 16:15:44charをintに変えただけならそりゃエラーになるでしょう。
何がしたいのか、具体的にはっきりと。また、エラーメッセージもきちんと書きましょう。
0570デフォルトの名無しさん
2008/12/08(月) 16:23:27int配列の初期化に文字列リテラルを使うことができないから
それだけ
0571デフォルトの名無しさん
2008/12/08(月) 16:50:52ありがとうございます
0572デフォルトの名無しさん
2008/12/08(月) 17:31:071〜10までの順位を決めたい場合どうすれば良いのでしょうか
0573デフォルトの名無しさん
2008/12/08(月) 17:32:48ソートすればいいと思います。
0574デフォルトの名無しさん
2008/12/08(月) 17:44:18data[1]が先頭なので一位、
以下順番でdata[10]が十位
が簡単です。
0575デフォルトの名無しさん
2008/12/08(月) 18:39:380576デフォルトの名無しさん
2008/12/08(月) 19:03:1010個のデータを扱いたいだけなら data[0] 〜 data[9] な
C の配列は [0] から始まるんだよ
0577572
2008/12/08(月) 19:09:51data[0]には順位に関係ないデータが入っています。
0578デフォルトの名無しさん
2008/12/08(月) 19:18:10説明しなきゃわかるかボケ
ここはエスパースレじゃないんだよ
0579デフォルトの名無しさん
2008/12/08(月) 19:20:31読めてるから >>576 を書いたんだよ ぼけ
情報小出ししながら何を威張ってやがる
無 礼 な 質 問 者 め
0580デフォルトの名無しさん
2008/12/08(月) 19:25:12メ欄忘れてるぞ
0581デフォルトの名無しさん
2008/12/08(月) 19:27:01何をだ?
0582デフォルトの名無しさん
2008/12/08(月) 19:27:350583デフォルトの名無しさん
2008/12/08(月) 19:29:480584デフォルトの名無しさん
2008/12/08(月) 19:31:35謝るのか消えるのか、どっちだ?
# 煽りはスルー
0585デフォルトの名無しさん
2008/12/08(月) 19:44:36まあ、おちついて>>577の目欄を見ろよ
0586デフォルトの名無しさん
2008/12/08(月) 19:47:290587デフォルトの名無しさん
2008/12/08(月) 19:50:26>>576のような、「10個のデータを扱いたいだけなら」という妙な前提をつくって
0オリジンであることを説くこともなかったはずだよな。
>>572に対してはそういう話をするのではなく、何を以て順位を決定するのか、
また、決定した順位をどのように保持したいのか、そういう問いかけをすべきであろう。
0588デフォルトの名無しさん
2008/12/08(月) 19:51:05NULLが(void *)0として定義されていたりするから
0589デフォルトの名無しさん
2008/12/08(月) 19:54:11#define NULL 1
if(NULL == 0) goto hell;
0590デフォルトの名無しさん
2008/12/08(月) 19:57:370591デフォルトの名無しさん
2008/12/08(月) 20:03:27顔真っ赤っすね
0592デフォルトの名無しさん
2008/12/08(月) 20:34:07仕様です
0593デフォルトの名無しさん
2008/12/08(月) 20:53:07なんでもいいから適当な教科書を買って、わからないところをこちらで聞いていただければいいと思います。
辛抱強く待っておれば、かならず答えてくださる方がおられます。
大事なことは、手を動かすこと、自分の頭で考えること。
これは教えてくださる方が周りにおられるときでもいえることです。
0594デフォルトの名無しさん
2008/12/08(月) 20:55:16俺としては、そういうところではなく、索引がない本は全て投げ捨ててよいと思っている。
0595デフォルトの名無しさん
2008/12/08(月) 21:34:33for(i = 0; str[i]; i++);
と記述した場合、この条件文はどういう意味になりますか。
無限ループになってしまうと思うのですが。
0596デフォルトの名無しさん
2008/12/08(月) 21:39:01iを0に初期化し、以後str[i]が0と比較して等しくならない間、処理を実行し、iを1増やすことを繰り返す
無限ループになるかならないかはstrの指している領域に入っているデータによる
0597デフォルトの名無しさん
2008/12/08(月) 21:40:29i が増えていって、いつか str[i] が 0 になったら、終わると思うが
0598595
2008/12/08(月) 21:45:14つまりは、条件文のstr[i]はstr[i]!=0の省略ってことですか?
常識だったらすいません。
条件文をもし a としらa!=0とおなじ意味になるのでしょうか。
0599デフォルトの名無しさん
2008/12/08(月) 21:45:18きっと文字列なんだと思うんだけど、
(普通は)文字列は最後に'\0'、つまりは0が入ってるのでそこで終わる
0600デフォルトの名無しさん
2008/12/08(月) 21:46:11そうだよ
むしろ a != 0が 真なら1を返して偽なら0を返す演算子といった方が正確
0601デフォルトの名無しさん
2008/12/08(月) 21:47:26Cの条件(真偽)判定はすべて、その値を 0 と比較して等しくなければ成立する、というものである。
この場合、おそらくは char であろう str[i] が 0 ('\0')になったときに条件が不成立となり、ループが終了する。
文字列操作にかかわるコードで頻繁に見かけられるこの手のコードは、Cで言う「文字列」が必ず '\0' で終わる、ということに因っている。
str が文字列を指しているかぎり、このループは文字列内の文字をたぶん一文字ずつチェックして、終端に来た時点で終わる。
文字列以外のものを指していたら、どうなるかはわからない。
0602595
2008/12/08(月) 22:03:03どう考えてもstr[i]だけの条件文の書き方でループを抜けることが理解できませんでしたが、
そういう仕様だとわかったので、すっきりしました。
ありがとうございました。
0603デフォルトの名無しさん
2008/12/08(月) 22:51:440604デフォルトの名無しさん
2008/12/08(月) 22:57:11前者はフォーマット指定はないが改行文字が補われる。
コンパイラによっては、printf("%s\n", foo)をputs(foo)で置き換える。
0605デフォルトの名無しさん
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というように減っている辺りがさっぱりです。
どなたか分かり易く解説をして頂けませんか?
0606デフォルトの名無しさん
2008/12/08(月) 23:36:00まず
グローバル変数とローカル変数の違いはご存知でしょうか?
0607デフォルトの名無しさん
2008/12/08(月) 23:38:430608デフォルトの名無しさん
2008/12/08(月) 23:42:13func(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()へ
0609デフォルトの名無しさん
2008/12/08(月) 23:43:38暇を持て余してる人がいれば答えて欲しい。
今から、C言語を学ぼうと思ってるんだけど知識ゼロ。
今まで自分がググって調べた限りでは、
言語でプログラムを組んで、それをコンパイラでコンパイルする。
程度のものしか分からないでいます。。。
なんというか、概念自体が把握出来ていない。
大体分かってるけど、肝心な所が分かってなくてモヤモヤしてるんです。
C言語で組んだプログラムはどのように、どうやって反映されるの?また、C言語でプログラムされた代表的なソフトなんてあります?
自分でも何が分かっていないか分からないのですが、しっかり概念を把握できていない事だけは分かります。
何かに例えてでも構わないですし、C言語の利用方法といいますか…簡単な流れを分かりやすく教えてもらえると助かりますです。。。
0610デフォルトの名無しさん
2008/12/08(月) 23:44:32殆ど全部のOS
0612デフォルトの名無しさん
2008/12/08(月) 23:51:49適当な入門書でも買うか、ネットの解説サイトでも見つけて、
コードを打ち込んで実行してみればいいじゃん。
0613デフォルトの名無しさん
2008/12/08(月) 23:51:51すごくたくさんのソフトがC言語でできているので代表的なものというのは割愛するよ。
反映、というか、おおざっぱに言うと、自分で来んだプログラム(テキストファイル)を、
コンパイラというツールに食わせると、exeファイルが出来上がるの。
exeファイルはダブルクリックしたら実行できるね。
0614デフォルトの名無しさん
2008/12/08(月) 23:52:510615デフォルトの名無しさん
2008/12/08(月) 23:54:10>>609
その段階でそれだけ知っていれば十分だと思うぞ。
0616デフォルトの名無しさん
2008/12/09(火) 00:00:21>>612
>>613
>>615
みんな即レスthxです
大体のプログラムがC言語で出来ていて、代表的だという事なのかな。。。
C言語で使うstrcpy、printfなどの「単語」一覧、みたいなものが集約されたテキストやサイトが存在するのですか?
それと自分はhtmlが大体分かるのですが、C言語とそれは似ているものなのか、それとも全く異なるものと認識していた方が学び易いのでしょうか?
どうしてもhtmlの概念に当て嵌めようとする為、それが原因で分かりにくくなっているのかと思ったり。。。
無知によるスレ汚し申し訳ないです
0617デフォルトの名無しさん
2008/12/09(火) 00:04:26http://www.bohyoh.com/CandCPP/C/Library/index.html
リファレンスとか、チュートリアルとか、検索すればでてくるよ。
0618デフォルトの名無しさん
2008/12/09(火) 00:04:51プログラム自体も一つのファイルなのはわかるかな?実行ファイルと呼ばれることもあるね
そこにはコンピュータ(CPU)に対する一連の命令が書かれている
「プログラム(実行ファイル)を実行する」というのは、使っているコンピュータに対して
「このファイルを読み取って、そこに書かれているとおりのことをやりなさい」と言うことを意味する
ただし、その命令というのは、コンピュータが理解しやすい表現で書かれている
具体的に言うと数字の羅列で書かれている
これはちょっと普通の人間にはとても読めないし、
読めてもどういう働きをするのかは簡単にはわからないし、
書くとなればそれこそ容易じゃない
そこで、「人間が理解しやすい表現で書かれたファイル」を
「コンピュータが理解しやすい表現で書かれたファイル」に変換するプログラム、というものが生まれた
これがコンパイラで、人間は人間が理解しやすい表現、
いわゆるプログラミング言語と呼ばれるものでプログラムを設計することができるようになった
Cはそのプログラミング言語の一つ
「C言語でできている」というのは「C言語を使って開発した」という意味であって、
コンパイルされた実行ファイル自体には、もはやC言語は関係ない
興味があるならアセンブラやインタプリタについても調べてみること
0619デフォルトの名無しさん
2008/12/09(火) 00:07:15もちろんその手の本だってある。
自分が持っているのはちょっと古いけどANSI C言語辞典の初版。
ところでJavaScriptはやったことないの?
プログラミング言語に分類されるという点で、HTMLより遥かにCに近いんだけど。
0620デフォルトの名無しさん
2008/12/09(火) 00:09:59>html
人間が読むことができる、という点では共通しているがそれ以外ではまったくの別物
htmlはプログラミング言語ではなく記述言語で、文書の意味付けや表現方法をコンピュータに指示するためのもの
0621デフォルトの名無しさん
2008/12/09(火) 00:32:46>>619
なるほど、ではまずそれの下準備を整えてから学ぼうと思います…ありがとう!
因みにJavaは学んだ事無いです。。。
>>618
>そこで、「人間が理解しやすい表現で書かれたファイル」を
「コンピュータが理解しやすい表現で書かれたファイル」に変換するプログラム、というものが生まれた
これがコンパイラで、人間は人間が理解しやすい表現、
いわゆるプログラミング言語と呼ばれるものでプログラムを設計することができるようになった
Cはそのプログラミング言語の一つ
「C言語でできている」というのは「C言語を使って開発した」という意味であって、
コンパイルされた実行ファイル自体には、もはやC言語は関係ない
非常に分かり易い説明感謝です、
自分はそもそもの部分を履き違えていたみたいです。。。
>>620
なるほどありがとです。超簡易表現するとhtmlは表面上の見た目を弄る、C言語を始めとするプログラム言語は内部からその全てを弄るものという解釈で問題なかったです?
それと、最後に無知にご教授下さいませです。
>>618で仰っていたようにC言語を使い開発したプログラムがあるとします。
それによりコンパイルされた実行ファイルを、他の言語で添削する事は可能なのですか?
>>618でコンパイルされた実行ファイル自体には、もはやC言語は関係ないとあったのでそう解釈しました。。。
それとも、C言語で開発した実行ファイルはC言語で構成されている為、当然それを用いて添削する。が正しい認識でしょうか?
0622デフォルトの名無しさん
2008/12/09(火) 00:35:06なにしろ初心者なものでその段階まで到達できずにいますです。。。
申し訳なすです
0623デフォルトの名無しさん
2008/12/09(火) 00:58:38理解できました
ありがとうございます
0624デフォルトの名無しさん
2008/12/09(火) 01:12:33コンパイルされた実行ファイルは普通は機械語と言う言語の文になっています
この機械語がコンピュータ(CPU)が唯一理解できる言語です
これを添削するには逆アセンブルという作業をしてアセンブリ言語ですることになります
しかし普通はこんなやりかたしません
添削したいのならコンパイルされる前のC言語のプログラムを添削すればいいからです
そして修正する事があれば修正してプログラムが完成したらコンパイルして
コンピュータが実行できる機械語のプログラムに変換して、実行ファイルを作って完成です
つまり添削するのは実行ファイルではなく、コンパイルされる前の
C言語のプログラム(これをソース(原始)プログラムと言う)ファイルです
0625デフォルトの名無しさん
2008/12/09(火) 01:17:34待て、Java ≠ JavaScriptだ。似て非なるものどころか似てもいない。
>>622
なぜ試せない?
PC初心者だと思う―Yes→専門学校・大学にはPC初心者未満がごろごろしているから気にすんな
↓No
PCを持っていない―Yes→入手しろ、中古でもまあ何とかなる
↓No
やる気がない―Yes→ご冗談を、それならこのスレに来ていないだろ
↓No
おめでとう。入門する資格は十分だ。
0626デフォルトの名無しさん
2008/12/09(火) 01:49:13同意しますが、K&Rにしても索引の質はもう一つですね。これって和訳は日本独自なんでしょうかね。
0627デフォルトの名無しさん
2008/12/09(火) 02:04:11しかも中卒の中年だぜ
まだHello worldしか書けないぜ
記憶力が3日しかもたないからHello worldから抜け出せないんだぜ
0628デフォルトの名無しさん
2008/12/09(火) 02:27:510629デフォルトの名無しさん
2008/12/09(火) 03:17:580630デフォルトの名無しさん
2008/12/09(火) 03:27:0580才過ぎてから中国語を勉強して、そこそこしゃべれるようになる人もいる
から中卒だの中年だのは関係ない、記憶力が3日しか持たないのはあまり
やる気が湧いてないからだよ
プログラム言語では45歳すぎてからCOBOL覚えて社内(100人ぐらいの会社)システム作って運用
してる人(45歳までただの事務職(と言っても総務部長)でまったくのプログラム未経験者)もいる
やる気さえ持続すれば50才過ぎても覚えられるとは思う
専門書などを1回読んで分らなければ10回読む、10回でだめなら100回読む
ぐらいのやる気があって、その勢いが持続すればだけどね(ちょっとだけ極端な言い方だけど…)
0631デフォルトの名無しさん
2008/12/09(火) 03:49:52>>624
なるほど、では基本的にC言語で構築したプログラムはC言語で添削
と考えておけば問題なさげですね。詳しく、本当感謝です。
>>625
JavaScriptだね、これも同じく学んでいないです。。。
ありがとう!今から基本からしっかりと学んでいきます。
自分は時間的な猶予が限られているのでこれから独学で学ぶつもりです。
その中でまた壁にぶち当たったらここで質問させてもらうね、みんなありがとうです!
0632デフォルトの名無しさん
2008/12/09(火) 03:57:23だよな。
記憶した個々のことを頭の中で組み立てて「きっと、こうなるはずだ」と考え、
それを試して「よしよし、考えたとおりだ」とか「何がまずかったのだろうか」と
ちゃんと顛末を確認できれば年齢なんて関係ないぞ。
0633デフォルトの名無しさん
2008/12/09(火) 04:00:21俺も未だにポインタでつまずいているプログラム初学者だけど一緒に頑張ろう
いろいろな言語の事調べてきたが、C言語が一番わかりやすいと思うよ
俺もなかなか時間取れなくていっこうに上達しないけど趣味の一つとして末永くC言語と付き合っていこうと思う。
0634デフォルトの名無しさん
2008/12/09(火) 04:30:21そうそう、そういう風に出来るか否かが問題で、学歴や年齢は関係ないよね
20歳でそういう風に出来ない人と、50歳でそういう風に出来る人では
確実に50歳でそういう風に出来る人が勝つからね
俺が思うに最近の若者ってそういう風に自分で考える事ができない人が
やたら多くなって来てると思うけどどうなんだろ
まさか近い将来、若者にはプログラミングは無理とか言われるように
なったらどうしようとか心配になったりするんだよな
0635デフォルトの名無しさん
2008/12/09(火) 04:49:37これからはそういう若者にいかにわかりやすくプログラミングを教えるかが
問題になってくると思われる
中高年の人や自分で考える事が出来ない若者をうまく教育してプログラマー
に出来る会社が次の勝ち組になるだろう
プログラマー不足はまだまだ続きそうだ
0636デフォルトの名無しさん
2008/12/09(火) 04:57:21「わかりやすく教えられる」ということは、物事を順序立てて説明できることはもちろんの事、
いかに相手の理解の進度を肌で感じ取って、歩調を合わせられるかも肝心だよな。
0637デフォルトの名無しさん
2008/12/09(火) 05:33:09それが結構難しい
特にプログラマーにそれが出来る奴が少ない気がする
次の勝ち組の道はかなり険しそうだね
0638デフォルトの名無しさん
2008/12/09(火) 10:27:54unsigned 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 ←宣言部の行のエラー
というエラーが出たのですが、
何の矛盾なんでしょうか?
0639デフォルトの名無しさん
2008/12/09(火) 10:48:22自分でも組めそうな簡単な問題探してプログラミング組んだりしているんだけど
やっぱ問題集みたいな本買った方がいいんかな?
0640デフォルトの名無しさん
2008/12/09(火) 11:50:13作りたいものがあるならそれに必要な知識や技術を学べばいい。
それがないなら宿題スレの自分が組めそうに無いものを調べながら作れば上達するんじゃね?
0641デフォルトの名無しさん
2008/12/09(火) 13:02:05実際に教えた経験から言うと、言語仕様は理解しているのに要求を実現できないって奴のほうが困る
0642デフォルトの名無しさん
2008/12/09(火) 13:10:36辞書ぐらい引け
簡単に言うとPOINT1の多重定義が原因だから自分で探せ
見つけて欲しいなら全ソースを貼ること
0644デフォルトの名無しさん
2008/12/09(火) 14:02:45エラーの返し方の定石みたいなものはあるんでしょうか?
具体的には、関数を作ってエラーの種類と処理したデータを分けて
返したい場合、どちらをreturnして良いのかわかりません。
エラーの種類はグローバル変数に入れて、
処理したデータをreturnするのが良いのでしょうか?
それとも、エラーをreturnして、ポインタで渡された変数を書き換えることで、
処理したデータを返すべきなんでしょうか?
0645デフォルトの名無しさん
2008/12/09(火) 14:26:41何かの処理を行って、エラーが起きたかどうかだけわかればいい関数:成功したら0、失敗したらそれ以外の数を返す
(特にファイル操作系の関数の場合、EOFを返す)
自然数を返す関数:0以下の数をエラー値として使う
unsignedの数を返す関数:負の数をエラー値として使う
浮動小数点数を返す関数:HUGE_VALなどを使う
ポインタを返す関数:ヌルポインタを返す
上記で対応できない場合:ポインタを受け取ってそこに書き込む
基本的には標準ライブラリ関数の仕様を眺めてそれに倣うのが良い
0646デフォルトの名無しさん
2008/12/09(火) 14:53:30エラーが起きたかどうかだけわかればいいって場合は成功を非0にするだろ。
成功時に0を返すのは、具体的なエラーコードを戻り値にする場合だと思う。
0647644
2008/12/09(火) 15:10:17丁寧な解答ありがとうございます。
負の数で表すことも考えましたが、将来負の数を使う可能性が0ではないので
エラーを別けておくことにしました。
Cらしくポインタ渡しでいこうと思います。
因みにグローバル変数を使うと、スレッドセーフでなくなるのでしょうか?
0648デフォルトの名無しさん
2008/12/09(火) 15:16:23スレッドローカルな変数というのもある。
0649デフォルトの名無しさん
2008/12/09(火) 16:33:31ところがどっこい
そういう決まった処理をする関数では0は「何事もなかった」という意味なんだ
if(fonc()) /*エラー処理*/
みたいにする
0650デフォルトの名無しさん
2008/12/09(火) 16:57:110651デフォルトの名無しさん
2008/12/09(火) 16:58:27「0」と「非0」は「偽」と「真」と呼ばれることが多く、これから「失敗」と「成功」を連想する人は多い。
しかしながらCの本来的な考え方においては、これらは「無為」と「有為」を表すものである。
だから、特定の処理を行ってそれが成功か失敗かだけを戻り値として返すような
ほとんどすべてのライブラリ関数は、成功時に0を返す。手持ちのリファレンスを確認すること。
例外は、putc() / fputc() / ungetc() である。これらの関数は成功時に書き込んだ(押し戻した)文字を返す。
0652デフォルトの名無しさん
2008/12/09(火) 17:04:49「UNIXのシステムコール由来のライブラリ関数の多くは」だろ。
それだって、そんなに多くはないけど。
0653デフォルトの名無しさん
2008/12/09(火) 17:09:070654デフォルトの名無しさん
2008/12/09(火) 17:10:32そもそも成功失敗を返さないライブラリ関数が多数なわけで
0655デフォルトの名無しさん
2008/12/09(火) 17:22:15>特定の処理を行ってそれが成功か失敗かだけを戻り値として返すような
が読めないのか
0656デフォルトの名無しさん
2008/12/09(火) 17:28:210657デフォルトの名無しさん
2008/12/09(火) 17:33:54ない?
0658デフォルトの名無しさん
2008/12/09(火) 17:38:06読んでたけど、それに当てはまらないputcやらをわざわざ例外として挙げられてたから
勘違いしてたみたい。
0659デフォルトの名無しさん
2008/12/09(火) 17:38:460660デフォルトの名無しさん
2008/12/09(火) 17:40:170661デフォルトの名無しさん
2008/12/09(火) 17:42:360662デフォルトの名無しさん
2008/12/09(火) 18:10:47WinAPIは変則だらけでイヤン
0663デフォルトの名無しさん
2008/12/09(火) 18:34:560664デフォルトの名無しさん
2008/12/09(火) 19:39:13就職したとき勉強したCじゃなかったら一から勉強し直さないとだし
企業はどんな言語を使ってるのだろう・・・
0665デフォルトの名無しさん
2008/12/09(火) 19:48:460666644
2008/12/09(火) 19:49:13状況や自分の好みも踏まえて、よく考えてみます。
ありがとうございました。
0667デフォルトの名無しさん
2008/12/09(火) 20:11:09・raise()
・remove()
・rename()
・fclose()
・fflush()
・setvbuf()
・fseek()
・fsetpos()
・atexit()
エラー時EOF、成功時に文字を返す
・fputc()
・putc()
・ungetc()
エラー時EOF、成功時に0以上の値を返す
・fputs()
・puts()
処理系依存
・system()
特殊
・setjmp()
0668デフォルトの名無しさん
2008/12/09(火) 20:15:240669デフォルトの名無しさん
2008/12/09(火) 20:36:19printf("うんこ");
}
0670デフォルトの名無しさん
2008/12/09(火) 20:58:22> ``‐.`ヽ、 .|、 |
゙'. ,ト `i、 `i、 .、″
| .,.:/"" ゙‐,. ` /
` .,-''ヽ"` ヽ,,,、 !
、,、‐'゙l‐、 .丿 : ':、
、/ヽヽ‐ヽ、;,,,,,,,,,-.ッ:''` .,"-、
,r"ツぃ丶 `````` ../ `i、
,.イ:、ヽ/ー`-、-ヽヽヽ、−´ .l゙`-、
_,,l゙-:ヽ,;、、 、、丶 ゙i、,,、
,<_ l_ヽ冫`'`-、;,,,、、、、.............,,,,、.-`": │ `i、
、、::|、、、ヽ,、、. ```: : : ``` 、.、'` .|丶、
.l","ヽ、,"、,"'、ぃ、、,、、、、.、、、.、、、_、.,,.ヽ´ l゙ ゙).._
,、':゙l:、、`:ヽ、`:、 : `"```¬――'''"`゙^` : ..、丶 .l゙ `ヽ
,i´.、ヽ".、".、"'ヽヽ;,:、........、 、、...,,,、−‘` 、‐ |゙゙:‐,
,.-l,i´.、".`ヽ,,,.".` `゙゙'"`'-ー"``"``r-ー`'": _.‐′ 丿 ,!
j".、'ヽ,".、".、"`''`ー、._、、、 >>1 、._,、..-‐:'''′ .、,:" 丿
゙l,"`"`''ヽヽ"`"` ```゙'''"ヽ∠、、、、ぃ-`''''": ` 、._./` ._/`
`'i`ヽヽヽ`''ーi、、、: : 、.,-‐'` 、/`
``ヽン'`"` : `~``―ヽ::,,,,,,,,,,.....................,,,,.ー'``^ ,、‐'"`
`"'゙―-、,,,,..、、 : ..,、ー'"'`
: `‘"`―---------‐ヽ``"''''''""``
0671デフォルトの名無しさん
2008/12/09(火) 20:59:43そういうやつって暗記が得意なやつに多いよな
暗記したけど理解できてないから要求をどう実現するか分らないんだろね
想像力も低いようだし
考える力を養わないとどうにもならんだろうね
0672デフォルトの名無しさん
2008/12/09(火) 20:59:51そうだよ
ところでfputcとかはなんで書き込んだ文字を返すんだろう
0673デフォルトの名無しさん
2008/12/09(火) 21:05:300674デフォルトの名無しさん
2008/12/09(火) 21:15:05エラー検知としての意味は無いけど
0675デフォルトの名無しさん
2008/12/09(火) 21:28:53構造体のパラメータで受け取ったりで。
struct Result {
int status;
char msg[MSG_SIZE];
};
0676デフォルトの名無しさん
2008/12/09(火) 22:14:03やはりプログラマは数学が得意じゃないと駄目だな。
直接的に使わなくとも、発想力的に考えて。
0677デフォルトの名無しさん
2008/12/09(火) 22:21:40>ところでfputcとかはなんで書き込んだ文字を返すんだろう
putc, putchar がマクロだからだろう。
0678デフォルトの名無しさん
2008/12/09(火) 22:29:56mallocとか違うの?
0679デフォルトの名無しさん
2008/12/09(火) 22:32:420680デフォルトの名無しさん
2008/12/09(火) 22:34:37fputcはエラー時にはEOFが返る。
0682デフォルトの名無しさん
2008/12/09(火) 22:41:370683デフォルトの名無しさん
2008/12/09(火) 22:42:150684デフォルトの名無しさん
2008/12/09(火) 22:49:34そんなネタではもう誰も釣れないよ。
0685デフォルトの名無しさん
2008/12/09(火) 23:09:05実際の実装じゃなくて、観念的な意味でな
0686デフォルトの名無しさん
2008/12/09(火) 23:16:30なんでこの実行結果が1.000000になりますか
0687デフォルトの名無しさん
2008/12/09(火) 23:19:48その処理系だと小数点以下6桁表示がデフォだからです
0688デフォルトの名無しさん
2008/12/09(火) 23:20:53そんな小さいこと気にしてたら大人になれないよという教え
どうしても気になるなら2進数で小数をどうやって表現するかを考えるといいよ
0689デフォルトの名無しさん
2008/12/09(火) 23:25:02doubleの定数なんだからまだそれが出る精度じゃねぇだろ
0690デフォルトの名無しさん
2008/12/09(火) 23:26:15小数点以下6桁表示で7桁目が四捨五入されるから。
0691デフォルトの名無しさん
2008/12/09(火) 23:57:34数学が得意じゃなくても数学が好きなら大丈夫だと思う
数学が得意でも数学が嫌いだと無理っぽい(そんな奴いねーか)
0692デフォルトの名無しさん
2008/12/10(水) 00:07:34%fなんかを生で使うからです。
0693デフォルトの名無しさん
2008/12/10(水) 01:01:53パケット受信したら送信用のスレッドに投げてるんだが,次の受信に備えて
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);
}
0694デフォルトの名無しさん
2008/12/10(水) 01:11:37送信用のスレッドを作る理由は?
0695デフォルトの名無しさん
2008/12/10(水) 01:19:07常に受信できる環境にしたいので送/受信用のスレッドを作った
一応bufを違うところにコピーする方法で行けそうだけど,同時に受信したら動くのか?
0696デフォルトの名無しさん
2008/12/10(水) 01:22:450697デフォルトの名無しさん
2008/12/10(水) 01:28:19わざわざ別スレッドをつくるこたあない
0698693
2008/12/10(水) 01:39:56セオリー的なものがまだ身についてないな・・・
0699デフォルトの名無しさん
2008/12/10(水) 01:47:44それでもスレッド化しなければならない環境要因があるならそれはなんとか頑張るしかない
まあバッファコピー自体はたいして時間かからんだろう?
0700デフォルトの名無しさん
2008/12/10(水) 01:51:15受信スレッド何個あるんだ?1個なら同時に受信つっても同時に処理されるのは1個だけだ。
受信、送信スレッドで分けることが必要な場合もあるが、その場合は最初から送信スレッドも起動しておけば良い。受信してから作る意味がわからん。
0701デフォルトの名無しさん
2008/12/10(水) 03:25:310702デフォルトの名無しさん
2008/12/10(水) 03:27:31charが符号なしの場合、有効範囲は0から+255。
0703デフォルトの名無しさん
2008/12/10(水) 05:54:11int main(void)
{
char *str="AbcDefGHijk1234lmNOP";
while(*str!='\0'){
if(islower(*str)!=0) *str=*str-'a'+'A';
str++;
}
printf("%s\n",str);
return 0;
}
このようにプログラムしても何も文が出てこないのは何故なんでしょうか?
0704デフォルトの名無しさん
2008/12/10(水) 06:09:590705デフォルトの名無しさん
2008/12/10(水) 06:35:20>>703のように、文字型配列の一部を変換→出力という問題自体がダメという事ですか?
0706デフォルトの名無しさん
2008/12/10(水) 06:55:00char str[]="AbcDefGHijk1234lmNOP";
でなければならない.
で >>703 のコードが何も出力しない(ように見える)のは,
while() を抜けた後で str がどこを指してるのかを考えれば自ずとわかるはず
0707デフォルトの名無しさん
2008/12/10(水) 14:19:43pstructa->pstruct1->member
のような長い名前を何度も書きたくないので、
ローカルで短い名前のポインタを使いたいのですが、
&をどこに書いたら良いのかわかりません。
p = &(pstructa->pstruct1->member);
こうでしょうか?
0708デフォルトの名無しさん
2008/12/10(水) 14:22:240709デフォルトの名無しさん
2008/12/10(水) 14:29:49#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);
}
0710デフォルトの名無しさん
2008/12/10(水) 14:30:21printf("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);
}
0711デフォルトの名無しさん
2008/12/10(水) 14:31:49回答ありがとうございます。
調べてみたんですが
char *str="AbcDefGHijk1234lmNOP"; (文字列リテラル)
char str[]="AbcDefGHijk1234lmNOP"; (文字型配列)
文字列リテラルと文字型配列は似ている様で結構違うんですね。
0712デフォルトの名無しさん
2008/12/10(水) 14:32:32特に気になるのが、uruu_doshi関数内の、
uruu_result = (year/4) - (year/10);
これで、閏年の数を数えれているのかが心配です。
0713デフォルトの名無しさん
2008/12/10(水) 14:36:57閏年の年は日数 (month_dayのやつ) が2月以降1ずつ増えると思うんだが
0714デフォルトの名無しさん
2008/12/10(水) 14:39:05それを、閏年関数(int uruu_doshi)の値を合計日数に足すってことで代用しようとしてみたんですが、間違えてますか?
0715デフォルトの名無しさん
2008/12/10(水) 14:41:40いや、閏年でも1月の日数は増えないので、2月以降という条件分岐がどこかに必要なはず
0716デフォルトの名無しさん
2008/12/10(水) 14:44:190717デフォルトの名無しさん
2008/12/10(水) 15:24:21ありがとうございます!
0718デフォルトの名無しさん
2008/12/10(水) 15:24:56char *str = "abc";
とは
char str[] = "abc";
char *p;
p = str;
のpと同じになる
0719デフォルトの名無しさん
2008/12/10(水) 15:39:220720デフォルトの名無しさん
2008/12/10(水) 16:02:28なんで同じになるんだよw
0721デフォルトの名無しさん
2008/12/10(水) 16:37:47アルカリイオン水吹いたwwww
0722デフォルトの名無しさん
2008/12/10(水) 16:52:570723デフォルトの名無しさん
2008/12/10(水) 16:58:450724デフォルトの名無しさん
2008/12/10(水) 17:04:450725デフォルトの名無しさん
2008/12/10(水) 17:05:27いやたいして間違ってないぞ
おまえらはなににそんなこだわってんだ?
所詮メモリの話で
主な利用意識は同じだろ
0726デフォルトの名無しさん
2008/12/10(水) 17:09:29一から勉強してこいかす
0727デフォルトの名無しさん
2008/12/10(水) 17:11:14初心者が初心者に教えてるんだから
0728デフォルトの名無しさん
2008/12/10(水) 17:12:140729デフォルトの名無しさん
2008/12/10(水) 17:13:420730デフォルトの名無しさん
2008/12/10(水) 17:16:23けど>>718みたいに考えてると
リテラル文字列も書き換えOKと勘違いしない?
0731デフォルトの名無しさん
2008/12/10(水) 17:56:16neetでごめんね
0732デフォルトの名無しさん
2008/12/10(水) 18:11:19const char * strに代入すべきだ。
0733デフォルトの名無しさん
2008/12/10(水) 18:37:51const char * const str のほうがよくね?
0734デフォルトの名無しさん
2008/12/10(水) 19:31:47この本には「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が代入されるのですか?
私は後者だと推測しているのですがよくわからないのでご教授お願いします。
0735デフォルトの名無しさん
2008/12/10(水) 19:34:20b が 1 を返すから
0736デフォルトの名無しさん
2008/12/10(水) 19:35:030737デフォルトの名無しさん
2008/12/10(水) 19:51:40つまり前者が正しいってことですか?
>>736
後者が正しいということですか?
早くも躓いてしまいました。大変失礼ですが、
もう少しわかりやすく説明して頂けるとありがたいです。
0738デフォルトの名無しさん
2008/12/10(水) 19:56:46その次にa = bが処理される
だから前者
0739デフォルトの名無しさん
2008/12/10(水) 19:58:53そうは教わらなかったんですけど。
0740デフォルトの名無しさん
2008/12/10(水) 20:05:12いや、値は返さないと思うんだけどなぁ。
operand1 = operand2
のとき、副作用が代入で、評価値が代入後のoperand1の値になる。
a = b = 1;
の場合、仮に(a = b) = 1;という評価順となると代入後のaの値に1を代入することになるのでエラー。
つまり、a = (b = 1);の順で評価される。
ここで、b = 1の評価値が代入後のbの値(1)であるので、それがaに代入される。
代入という副作用によって評価された値が、数値の1だっただけでその評価値がまた代入に使われている。
昔は、ポインタの代入でうまくいかなかったことが、いやなんでもない。
0741デフォルトの名無しさん
2008/12/10(水) 20:09:53嘘です
0742デフォルトの名無しさん
2008/12/10(水) 20:14:46最大の数字を表示するプログラムを教えてください
do whileかfor使います
0743デフォルトの名無しさん
2008/12/10(水) 20:21:09int main(void){
}
0744デフォルトの名無しさん
2008/12/10(水) 20:21:25>>1
0745デフォルトの名無しさん
2008/12/10(水) 21:30:02ほぼ上位互換だけど、いくつも違う点がある。
C のプログラムがそのまま C++ で動くこともあるけど、
そうでないこともある。
0746デフォルトの名無しさん
2008/12/10(水) 21:43:490747デフォルトの名無しさん
2008/12/10(水) 22:44:17後者が正しい。
「式が値を持つ」というのがCの特徴の一つで、この場合の式はb=1のこと。
この式の値が1となり、さらにそれが=演算子によってaと演算される。
0748デフォルトの名無しさん
2008/12/10(水) 22:48:04代入が文でなく式である事がCの特徴。
0749デフォルトの名無しさん
2008/12/10(水) 23:17:220750デフォルトの名無しさん
2008/12/10(水) 23:19:20envpで調べるといいかも。
Windowsはどうなのか知らない
0751デフォルトの名無しさん
2008/12/10(水) 23:19:470752デフォルトの名無しさん
2008/12/10(水) 23:58:22scanf("%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つ目の入力の直後にクラッシュしてしまうんですがどうしてですか。
0753デフォルトの名無しさん
2008/12/10(水) 23:59:340754デフォルトの名無しさん
2008/12/11(木) 00:05:25>>751
トンクス
0755デフォルトの名無しさん
2008/12/11(木) 11:05:34int i, j;
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++) scanf("%lf", &a[i][j]);
0756デフォルトの名無しさん
2008/12/11(木) 11:27:270757デフォルトの名無しさん
2008/12/11(木) 11:31:160758デフォルトの名無しさん
2008/12/11(木) 11:31:23一番簡単な例を上げるとPS以降のゲームとか
0759デフォルトの名無しさん
2008/12/11(木) 11:32:490760デフォルトの名無しさん
2008/12/11(木) 12:48:53確かに大容量ゴールドカートリッジだったから
高級言語でないと開発大変だろうね
0761デフォルトの名無しさん
2008/12/11(木) 13:40:22「いくつ」?
0762デフォルトの名無しさん
2008/12/11(木) 16:53:300763デフォルトの名無しさん
2008/12/11(木) 17:50:44VS2008でC言語使うのいちいちめんどくさすぎるんだけど。
他のみたく文字列打ったとき色づけもされないし不便すぎて参ってます
0764デフォルトの名無しさん
2008/12/11(木) 18:04:25Visual Studio IDE環境
http://pc11.2ch.net/test/read.cgi/tech/1115707321/
0765デフォルトの名無しさん
2008/12/11(木) 18:38:31なんかの間違いじゃなかろうか。
にしてもVS使うのが面倒だと思うならエディタで書けばいいじゃない、と思うんだけど。
0766734
2008/12/11(木) 19:25:39>>740
>>747
>>748
結局どちらが正しいのかわからないのですが。
後者でいいんですよね?
もう一つ質問させて下さい。
printf("%f", 5.0 / 3);
この時5.0や3は何を意味していますか?
5.0はfloat型かdouble型ですか?
それとも型の概念は無く小数として扱われるのでしょうか。
小数とかいう概念も無くただ「値」として扱うのですか?
3についても同様です。
この辺わからないのでお勧めの書籍があれば教えて下さい。
今はこの本を終えた後「C実践プログラミング」を買おうと思ってます
0767デフォルトの名無しさん
2008/12/11(木) 19:42:393 はint型です
0768デフォルトの名無しさん
2008/12/11(木) 19:55:060769デフォルトの名無しさん
2008/12/11(木) 20:03:093L はlong型
0770デフォルトの名無しさん
2008/12/11(木) 20:05:39printf("%d", sizeof( 5.0f )); は4と表示されるだろう
0771デフォルトの名無しさん
2008/12/11(木) 20:06:590772766
2008/12/11(木) 20:07:23char ch;
ch = 65;
ではこのコードは代入の時に暗黙的にintからcharに変換していると
いうことなのでしょうか。そろそろ厚かましいですかね。
0773デフォルトの名無しさん
2008/12/11(木) 20:49:500774デフォルトの名無しさん
2008/12/11(木) 22:55:480775デフォルトの名無しさん
2008/12/11(木) 22:56:32プログラマは救われませんけどね
0776デフォルトの名無しさん
2008/12/11(木) 22:58:410777デフォルトの名無しさん
2008/12/11(木) 23:32:160778デフォルトの名無しさん
2008/12/11(木) 23:43:300779デフォルトの名無しさん
2008/12/11(木) 23:47:46はい。
0780デフォルトの名無しさん
2008/12/11(木) 23:52:25問題ありません
説明としてはa[2] は *(a + 2) と書き方が違うだけにすぎないからです
0781デフォルトの名無しさん
2008/12/11(木) 23:59:540782デフォルトの名無しさん
2008/12/12(金) 05:21:34int puts( const char *string );
char *gets( char *buffer );
のように関数名の前に *が付いているのと付いていないのがあるが違いが良く分かりません。
*putsやgetsではダメなんですか?
0783デフォルトの名無しさん
2008/12/12(金) 07:34:43戻り値の型が違う。puts()は整数を返すが、gets()はポインタを返す。
それはさておき、gets()は使用禁止。
0784デフォルトの名無しさん
2008/12/12(金) 09:02:51ありがとうございます
0785デフォルトの名無しさん
2008/12/12(金) 13:57:36#include<stdio.h>
int main()
{
int a;
printf("hello\n");
scanf("%d", &a);
printf("%dと入力されました\n",a);
return 0;
}
0786デフォルトの名無しさん
2008/12/12(金) 14:11:300787デフォルトの名無しさん
2008/12/12(金) 14:28:070788デフォルトの名無しさん
2008/12/12(金) 14:32:550789デフォルトの名無しさん
2008/12/12(金) 14:37:06オブジェクトの大きさの要因は多岐に渡ります。
0790デフォルトの名無しさん
2008/12/12(金) 14:40:28VC++でやると、他と比べて妙に大きいような・・・。色々とリンクされているせい?
0791デフォルトの名無しさん
2008/12/12(金) 15:08:06int puts()
これは、puts()がintであって、putsはintになる(つまり、intを返す)関数であるという意味の宣言
char *gets()
こっちは、*gets()がcharであって、gets()がcharへのポインタであって、
getsがcharへのポインタになる(charへのポインタを返す)関数だということ
0792デフォルトの名無しさん
2008/12/12(金) 15:11:15わかりやすい説明ありがとう
0793デフォルトの名無しさん
2008/12/12(金) 15:42:12void Kaiki(int n)
{
if(n>1) Kaiki(n-1); ・・・(1)
printf("%3d",n); ・・・(2)
}
(1)で引数n個分のKaiki関数を呼び出すのは分かるんですが
(2)の処理の流れがどうなっているのかが良く分かりません
何故(2)が引数の数だけ実行されるんでしょうか?
0794デフォルトの名無しさん
2008/12/12(金) 15:52:11printfにはifもelseも付いてないんだから、Kaikiが呼ばれればそれは必ず実行される
n回Kaikiが呼ばれてるのなら、printfもn回実行されてないとおかしい
0795デフォルトの名無しさん
2008/12/12(金) 16:30:04>>608
0796デフォルトの名無しさん
2008/12/12(金) 16:40:58>>795
分かりやすい解説レスを教えてくれてありがとう
0797デフォルトの名無しさん
2008/12/12(金) 18:10:48何か方法はないですか?私の書いたプログラムはこんな感じです。
#include <stdio.h>
int main(void)
{
int x,y;
scanf("%d",&x);
scanf("%d",&y);
printf("%50.49Lf",(long double)x/y);
return 0;
}
0798デフォルトの名無しさん
2008/12/12(金) 18:21:18処理系ごとの方法を使ってより精度の高い実数型を使用するか、
あるいはそのための高度数値計算用ライブラリを導入するしかない
0799デフォルトの名無しさん
2008/12/12(金) 18:25:52そもそも long double 自体がそこまでの精度を持っていなく、
あってもせいぜい 19 桁くらいなのでその方法では無理
0800デフォルトの名無しさん
2008/12/12(金) 18:29:26単なる整数の割り算でいいなら自分で計算アルゴリズムつくれば?
紙に書いてやるのと同じ
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
0802デフォルトの名無しさん
2008/12/12(金) 18:51:54http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8298.c
0803デフォルトの名無しさん
2008/12/12(金) 18:58:050805デフォルトの名無しさん
2008/12/12(金) 19:50:24入力が負数だと、あれだね
0806デフォルトの名無しさん
2008/12/12(金) 19:56:36if(y==0 && x*y<0) return 1;
0807デフォルトの名無しさん
2008/12/12(金) 19:57:38if(y==0 || x*y<0) return 1;
0808デフォルトの名無しさん
2008/12/12(金) 20:26:32freeするならする、しないなら徹底してしない。
callocは if(y==0) return 1; 後の方がいい。
一箇所で出来る処理は一箇所で行う。
for(i=0; i<n; i++) {
carry=x%y;
好みだが、最後にprintf("\n");欲しいな。
0809デフォルトの名無しさん
2008/12/12(金) 20:28:17a=calloc(n,sizeof(int));
これはなぜ?
0810デフォルトの名無しさん
2008/12/12(金) 20:35:10C給料安いwww
0811デフォルトの名無しさん
2008/12/12(金) 21:00:460812デフォルトの名無しさん
2008/12/12(金) 21:02:01>>803
0813デフォルトの名無しさん
2008/12/12(金) 23:16:47入力ファイル = ABCDEFGHIJ… とあったときに、
Dまで読み込んで出力ファイルに書き込んだとします。
その後、同一プログラム内でもういちど入力ファイルを読んだ場合、
Eから読み込むという形になりますか?それともファイルの先頭からですか?
もし後者であれば、前者で処理する方法を教えてください、お願いします。
0814デフォルトの名無しさん
2008/12/12(金) 23:20:04Eから読み込みます。
いったんファイルをクローズして再度オープンして読むと先頭から。
0815デフォルトの名無しさん
2008/12/12(金) 23:22:38入力ファイルをクローズしなかったら、続きから読み込みになるよ。
クローズして再オープンしたら先頭から読み込みになる。
ftell()とかで、読み込み位置を取得してそれを取っておいて、
再オープンしたときにfseek()で、またそこにファイルポインタを
もどせば続きから読める。
0816デフォルトの名無しさん
2008/12/12(金) 23:26:19main()
{
int number;
double f;
printf("摂氏を入力");
number = getchar();
F = (9.0/5.0) * number + 32.0;
printf("F = %d\n", F);
}
5を入れても0になったり1・・・になったり、
メチャクチャな数字が出るがどうすればいい?
0817デフォルトの名無しさん
2008/12/12(金) 23:28:520818デフォルトの名無しさん
2008/12/12(金) 23:29:25>number = getchar();
これを
fgets(s, sizeof(s), stdin);
number = atoi(s);
にする。
char s[100]; の宣言も必要。
0819デフォルトの名無しさん
2008/12/12(金) 23:30:30numberは文字の数字のままだから、それを整数値に変換する必要がある
F = (9.0/5.0) * atoi(number) + 32.0;
でいいんんじゃまいか
0820デフォルトの名無しさん
2008/12/12(金) 23:31:49それはない・・・
0821819
2008/12/12(金) 23:40:240822デフォルトの名無しさん
2008/12/12(金) 23:55:38ありがとうございます。わかりやすかったです!
ということは出力ファイルもクローズしなければ続いて書き込めると考えて大丈夫ですか?
0823デフォルトの名無しさん
2008/12/12(金) 23:57:44んで、書き込み位置を変えたければ fseek で移動すればいい。
0824デフォルトの名無しさん
2008/12/12(金) 23:59:04助かりました、どうもありがとうございました。
0825デフォルトの名無しさん
2008/12/13(土) 00:11:58「Dまで読んだ」ことをアプリケーション側で把握できているのだから、ftell()は感心しないな。
一度クローズしてしまったファイルを再度オープンしたときに全く変わっていないことを保証するのは
ロジックでは不可能だし、運用上も大きな制限となりかねない。
0827デフォルトの名無しさん
2008/12/13(土) 00:20:33あるいは strtod
0828デフォルトの名無しさん
2008/12/13(土) 00:24:40変わっているか変わっていないかってそれこそ運用の問題だろ。
fopen()でオープンしたら、閉じなくても、ファイルが変わらない保証なんてないし。
0829デフォルトの名無しさん
2008/12/13(土) 00:33:11いいえ、まともなOSならオープンしているファイルが勝手に変わらないことを保証してくれます。
尤も、ブロックデバイスであることを保証してくれるわけではないのでいつでもシークできるわけではないのですが。
0830デフォルトの名無しさん
2008/12/13(土) 00:36:47共有制御なんて fopen ごときがやってくれないぜ。
0831デフォルトの名無しさん
2008/12/13(土) 00:38:06適当なこと言うなよ。
最近、しったかで断言するやつよく見るな。
0832デフォルトの名無しさん
2008/12/13(土) 00:38:51# 見掛け上は削除されても実はドライブを占有したままになる。
0833デフォルトの名無しさん
2008/12/13(土) 00:54:43#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
0834デフォルトの名無しさん
2008/12/13(土) 00:58:14実験しました。
VCで数キロくらいのテキストファイルをオープン。
10バイトほど読み込み。(ファイルはオープンしたまま)
同じファイルをテキストエディタで開いて、内容を1バイトにして保存。
プログラムでリードを再開するとEOFが返ってきました。
変更可能ですね。
0835デフォルトの名無しさん
2008/12/13(土) 01:00:130836デフォルトの名無しさん
2008/12/13(土) 01:10:24普段使わん環境については黙ってた方が無難だったな。
0837デフォルトの名無しさん
2008/12/13(土) 01:13:30ま、そういうこともあります。話題を提供してくれてサンクス
0838デフォルトの名無しさん
2008/12/13(土) 01:22:25なるほど、hogeとbarはバッファリングされたまとめて出力されているな。
fclose()の順番を変えてしまうとhogebarになるよ。
0839デフォルトの名無しさん
2008/12/13(土) 01:24:250840デフォルトの名無しさん
2008/12/13(土) 01:54:23っても年収600万弱っていいなあとおもうよ。
0841デフォルトの名無しさん
2008/12/13(土) 02:04:26#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
0842デフォルトの名無しさん
2008/12/13(土) 02:09:37#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
0843デフォルトの名無しさん
2008/12/13(土) 02:18:10そりゃぁ、rmした段階でエントリはなくなるんだから。実体が残り続けるってだけ。
試しに、巨大なファイルをオープンしておいてからrmして、その前後のディスク容量を較べてみ。
更に、ファイルをクローズしてからdfしたら何が起きているか判ると思う。
ファイルをオープンしてから削除しておいて作業ファイルとして利用し、クローズすると同時に消えてなくなるって言うのは昔から常套手段だよ。
0844デフォルトの名無しさん
2008/12/13(土) 02:34:440845デフォルトの名無しさん
2008/12/13(土) 02:56:560846デフォルトの名無しさん
2008/12/13(土) 09:58:120847デフォルトの名無しさん
2008/12/13(土) 13:31:35そりゃC言語じゃ大したこと出来ないしな。
多層基板にLSIモジュールで組み立てる時代(.NET & C#)に、ラグ板に
ちまちまと抵抗やコンデンサを半田付け(C言語)をするようなものだし。
0848デフォルトの名無しさん
2008/12/13(土) 17:35:10作っているのですが、つまづいてしまいました。
1サンプルごとに読み込んで、先頭nサンプルまではフェードイン処理、末尾nサンプルは
フェードアウト処理を行ってファイルに書き込むところまではできました。
ただそれを重ね合わせる上手い方法が思いつきません。
何か上手い方法があれば教えてください。お願いします。
0849デフォルトの名無しさん
2008/12/13(土) 18:24:25char 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が返ってくると思うんですが・・・
0850デフォルトの名無しさん
2008/12/13(土) 18:26:03printf("sizeof(str1)=%d\n",sizeof(str1));
0851デフォルトの名無しさん
2008/12/13(土) 18:26:46sizeofだと、0まで含めてのサイズになるんじゃね?
0852デフォルトの名無しさん
2008/12/13(土) 18:33:28うお・・・
strlenですよね、この書き方なら。
ありがとうございました!
0853デフォルトの名無しさん
2008/12/13(土) 19:06:58int型ならn個まで…とかって決まってるんですか?
0854デフォルトの名無しさん
2008/12/13(土) 19:10:350855デフォルトの名無しさん
2008/12/13(土) 19:17:43あ、そうなんですか、格納できる1個あたりのサイズが違うだけなんですね
じゃあ格納できる要素数ってmallocとか使わなければメモリの許す限りなんですか?
0856デフォルトの名無しさん
2008/12/13(土) 19:24:19そうです
0857デフォルトの名無しさん
2008/12/13(土) 19:24:230858デフォルトの名無しさん
2008/12/13(土) 19:44:400859デフォルトの名無しさん
2008/12/13(土) 22:45:36tarou 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が来てしまうのでうまくいきません。
ちなみに各クラスの生徒数はファイルオープンしないと分からないものとして
うまくいく方法を教えてください。
0860デフォルトの名無しさん
2008/12/13(土) 23:28:21fgets()で1行ずつ読み込んで、適宜解析。
0861859
2008/12/14(日) 01:25:31具体的にお願いします。
それとまた質問です。
関数 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を返してくれないため
うまくいきません。
アドバイスお願いします。
0862デフォルトの名無しさん
2008/12/14(日) 01:45:58再帰にした理由を、えーと、「具体的にお願いします」。
0863デフォルトの名無しさん
2008/12/14(日) 01:56:43■#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);
}
}
0864デフォルトの名無しさん
2008/12/14(日) 02:00:52fgetss後のバッファに対し
n = sscanf(buf, "%s %s %s", s1, s2, s3)
nが1ならクラス、nが3なら生徒の身長体重データをみなす。;
0865859
2008/12/14(日) 02:18:111-1の生徒分のデータを入力し終えたら
fscanf( fp, "%s%d%d", name[i][j], &hight[i][j], &weight[i][j]) == EOF
になってwhileを抜けて再帰することで
また最初のifからクラス名と1-2の生徒分のデータを入力しようとしたため。
>>863
学校の課題なので
ファイルオープンするファイルに直接編集することが出来ないんです。
>>864
とりあえずそれでやってみます。
今日はもう眠いのでまた明日の夜くらいに現れると思いますが
その時はよろしくお願いします。
ありがとうございました。
0866デフォルトの名無しさん
2008/12/14(日) 02:41:390867デフォルトの名無しさん
2008/12/14(日) 03:06:22わざわざ再帰にする意味もないよねェ
0868デフォルトの名無しさん
2008/12/14(日) 11:24:16素人考えだけど32bitで演算するなら波を足して2で割ったらダメなん?
0869デフォルトの名無しさん
2008/12/14(日) 14:24:07波動の重ね合わせは足すだけでよい。2で割っちゃあかん。
>>848の質問はこういう物理的なことなのか、
それとももっとプログラム的なことなのかわからん。
0870デフォルトの名無しさん
2008/12/14(日) 14:49:53平均してどうする俺orz
0871デフォルトの名無しさん
2008/12/14(日) 17:16:020872デフォルトの名無しさん
2008/12/14(日) 19:44:59まあ、底が浅いので高くなっているという解釈の方が普通だが。
0873デフォルトの名無しさん
2008/12/14(日) 22:20:06while文の条件が複数ある場合、どのように書いた方が解りやすいでしょうか?
例えば、
�@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 )
と書くのかどちらがわかりやすいでしょうか。
0874デフォルトの名無しさん
2008/12/14(日) 22:25:14!の数が少ないから
0875デフォルトの名無しさん
2008/12/14(日) 22:41:26即レスありがとうございます。
0876デフォルトの名無しさん
2008/12/14(日) 22:44:36ヒント: 波は海中にも発生し海底でも反射する
0877デフォルトの名無しさん
2008/12/14(日) 23:10:24のように標準入力から入力するときに、
入力部分にあらかじめ文字列を表示させておくことは可能ですか?
たとえば
・入力部分に最初から「cd /」と表示されている
・「/」の後ろから入力することができる
・バックスペースキーを連打すれば「cd /」の部分まで消すことができる
・「cd /home」と入力すればhomeだけでなく全文(cd /home)がbufに取り込まれる
のような感じです。
0878デフォルトの名無しさん
2008/12/14(日) 23:27:350879デフォルトの名無しさん
2008/12/14(日) 23:40:50書き忘れていました、すみません。
Linuxです。
0880デフォルトの名無しさん
2008/12/14(日) 23:49:51標準関数だけではどうやってもできないから、適当なライブラリでも使ってくれ。
0881デフォルトの名無しさん
2008/12/14(日) 23:50:220882デフォルトの名無しさん
2008/12/15(月) 00:02:54ありがとうございます。
調べてみます
0883デフォルトの名無しさん
2008/12/15(月) 00:12:43Linuxならreadlineを使っとけ。
あと、getsは使うな。
0884デフォルトの名無しさん
2008/12/15(月) 00:18:400885デフォルトの名無しさん
2008/12/15(月) 00:33:080886デフォルトの名無しさん
2008/12/15(月) 00:44:13すみません、fgetsを使うようにします。
簡単に作れそうなのでreadlineを使ってみたいと思います。
ありがとうございました。
0887デフォルトの名無しさん
2008/12/15(月) 02:19:17ひんと:津波は足し合わせて高さ0になる普通の波とは違う
0888デフォルトの名無しさん
2008/12/15(月) 09:54:11ナショナルトレジャーを観て興味本位でプレイフェア暗号を作ってみたのですが
うまくいきません。
具体的にはinput1関数でセグメントエラーが出てしまいます。
getcharが問題かもです。
下手くそなプログラムですがどなたか解説お願いしたいです。
0889デフォルトの名無しさん
2008/12/15(月) 11:09:44ぱっと見た感じkeyword_editがおかしいんじゃねえの。
明らかにzの大きさ超えて書き込んでるよね。
あまりに読みづらいからもうちょっと整理したほうがいいんじゃないかと思うけど。
0890デフォルトの名無しさん
2008/12/15(月) 12:23:31地球の自転でも地震でも波は波
行き場を失った物質の移動が波となる
それは海底や入り江や空気でも反射(反発)する
狭い場所に体積が増えるから高さが増すわけだが
水が増える仕組みは反射によって起きている
入り江で海底や岸に阻まれた波の一部は反射して海面を押し上げる
岸壁でしぶきが上がるのは岩壁に阻まれた波のお釣りが
空中に向かって反射しているから
引力が無ければ雫が宇宙に向かって飛んでいくだろう
0891デフォルトの名無しさん
2008/12/15(月) 12:30:41○居場所
0892デフォルトの名無しさん
2008/12/15(月) 12:40:23つーか、いい加減に板違いだってよ。
0893デフォルトの名無しさん
2008/12/15(月) 12:43:490894デフォルトの名無しさん
2008/12/15(月) 14:28:12ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/remove.3.html
>名前がファイルへの最後のリンクであっても、どこかのプロセスがそのファイルを開いているなら、ファイルの最後のファイル記述子 (file descriptor) が閉じられるまでファイルは存在し続ける。
>名前が指しているのがソケット、fifo、デバイスなら、名前は削除されるが、そのソケットなどを開いているプロセスはそのまま使い続けることができる。
これか。
0895デフォルトの名無しさん
2008/12/15(月) 17:33:38{
char *p=str1;
while(*str1++=*str2++);
return p;
}
上の関数で(*str1++=*str2++)の演算子優先順位は調べると
(++)→(*)→(=)
になるので最初の一文字目のコピーがされないと思うんですが
何故ちゃんとコピーされるんですか?
0896デフォルトの名無しさん
2008/12/15(月) 17:44:270897デフォルトの名無しさん
2008/12/15(月) 17:47:260898デフォルトの名無しさん
2008/12/15(月) 18:16:37素早い回答ありがとうございます
優先順位ばっかり気にしていたので分からなかったorz
0899デフォルトの名無しさん
2008/12/15(月) 18:36:450900デフォルトの名無しさん
2008/12/15(月) 18:44:08Stateは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とか不正な値を入れてもエラーが出ません。
配列の外に代入していると思うのですがどうなんでしょう。
0901デフォルトの名無しさん
2008/12/15(月) 18:50:19自分で管理してください。
0902デフォルトの名無しさん
2008/12/15(月) 19:12:23右側が先に評価されてから、左側が評価されるんですよね?
0903デフォルトの名無しさん
2008/12/15(月) 19:15:39正確なタイミングは決まっていない
式が終わるまで (式の途中に副作用完了点があればそこまで) のどこか
コンパイラの気分によって決まる
0904デフォルトの名無しさん
2008/12/15(月) 19:16:27決まっていない
どちらを先に評価するかはコンパイラの気分によって決まる
0906デフォルトの名無しさん
2008/12/15(月) 20:20:04その関数をfor文などで回してランダムな文字列をたくさん発生させたいのですが、
srand(time(NULL))だと短い時間で回すと同じ乱数の種が発生してしまいますよね?
どうすれば短い時間で回しても毎回違う文字列を発生させられるでしょうか?
0907デフォルトの名無しさん
2008/12/15(月) 20:30:050908デフォルトの名無しさん
2008/12/15(月) 20:34:11間抜けな質問をしてしまいました。ありがとうございます。
0909デフォルトの名無しさん
2008/12/15(月) 20:34:58何度も呼んではいけない。まともな乱数じゃなくなる。
0910デフォルトの名無しさん
2008/12/15(月) 20:53:52もうちょっと正確に言うと、値を取り出した後だからだな
0911888
2008/12/15(月) 21:16:48keyword_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(入力)
セグメンテーション違反です
0912デフォルトの名無しさん
2008/12/15(月) 22:02:14デバッガでステップ実行すればいいだろうが
0913デフォルトの名無しさん
2008/12/15(月) 22:24:04コードが汚いのは、関心しないけど。
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
0914デフォルトの名無しさん
2008/12/16(火) 00:25:15クライアントからのメッセージに対してのレスポンスはそのソケットに対して返せばいいけど
サーバからメッセージを送りたい場合(複数の端末)はNATがなければホスト名を登録しているので
送信できるけど,NATが間にあるとポートの一致せず破棄される.
こういうサーバからメッセージを送る場合があるクライアント・サーバシステムは
クライアントから受信したソケットは接続してきた数だけ保持するやりかたをやってるの?
それとも他に方法ある?
0915デフォルトの名無しさん
2008/12/16(火) 02:22:090916デフォルトの名無しさん
2008/12/16(火) 02:34:320917デフォルトの名無しさん
2008/12/16(火) 02:35:10クライアントが、サーバに対して、俺このポート番号で待ってるから、と伝えておけば
そのポートを正しくクライアントにマップしておけば何の問題もない。
0918デフォルトの名無しさん
2008/12/16(火) 02:35:420919デフォルトの名無しさん
2008/12/16(火) 02:37:51一般的は方法はない
C言語にはソケットやポートはおろか、通信という概念すらない
要するに環境依存
0920デフォルトの名無しさん
2008/12/16(火) 07:45:24ソリトンってしらないのですか?中学生?
0922デフォルトの名無しさん
2008/12/16(火) 09:29:42それは言語に依存しない、プロトコルの話。
ネットワークプログラミング相談室 Port22
http://pc11.2ch.net/test/read.cgi/tech/1222603744/l50
0923914
2008/12/16(火) 12:41:59>>917
ポートをあけるとはNATの?
それが出来ない環境だと,定期的にクライアントがUDPパケット投げてマッピング情報を保持させながら
そのソケットを用いてサーバから送信する方法しかないか・・・
0924デフォルトの名無しさん
2008/12/16(火) 12:46:04にほんごはよめますか?
>922がゆうどうさきをしょうかいしてくれていますよ。
0925デフォルトの名無しさん
2008/12/16(火) 13:19:47いろいろ分かってないことが多そうに思う。
ネットワークの勉強してから、かな。
0926デフォルトの名無しさん
2008/12/17(水) 22:46:33漢字を書けますか?読めますか?
0927デフォルトの名無しさん
2008/12/17(水) 23:40:31皮肉という言葉の意味は知っていますか?
0928デフォルトの名無しさん
2008/12/17(水) 23:40:49struct _h
{
int id
h *next;
h *prev;
};
nextとかprev使わないでリンクリスト作る方法教えてください。
メモリが無駄なのでnextとprevを使わないでポインタのリスト作りたいです
0929デフォルトの名無しさん
2008/12/17(水) 23:41:25必死だなぁw
0930デフォルトの名無しさん
2008/12/17(水) 23:42:540931デフォルトの名無しさん
2008/12/17(水) 23:43:35prev なくしてタン方向リストにするとか。
0932デフォルトの名無しさん
2008/12/17(水) 23:48:550933デフォルトの名無しさん
2008/12/17(水) 23:48:59不可能である。糖分のない砂糖、演算装置のないコンピュータ、文法のない言語は存在しない。
0934デフォルトの名無しさん
2008/12/17(水) 23:50:16マジックリストというものがある
nextとprevが一つのポインタですむという摩訶不思議なリスト
まぁ
0935デフォルトの名無しさん
2008/12/17(水) 23:51:02代償に実行速度で物凄く損するだろうけど。
0936デフォルトの名無しさん
2008/12/17(水) 23:53:420937デフォルトの名無しさん
2008/12/17(水) 23:54:340938デフォルトの名無しさん
2008/12/17(水) 23:58:50そういうあなたのために配列があります。
0939デフォルトの名無しさん
2008/12/18(木) 00:50:050940デフォルトの名無しさん
2008/12/18(木) 01:15:08return (year % 400 == 0 || (year % 4 == 0 && year % 100));
ただ、大量の日付データを処理する上でもっと高速化できる
アルゴリズムがないだろうか
0941デフォルトの名無しさん
2008/12/18(木) 01:16:270942デフォルトの名無しさん
2008/12/18(木) 01:25:09以下、y%100!=0 または y%400==0 でおk
0943デフォルトの名無しさん
2008/12/18(木) 01:42:17http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8387.c
試しに作って見た。もし処理に時間が掛かり過ぎるようなら、TIMESの値を適当に変えて。
0944デフォルトの名無しさん
2008/12/18(木) 02:26:181901-2099年に限定した上で、4年に一度。
0945デフォルトの名無しさん
2008/12/18(木) 19:35:24今日の午前0時から、ある作業を何時間しているかを計る(経過時間)
プログラムを作りたいのですが、゙今日の午前0時〜゙を
どう、表現すればいいでしょうか?time関数を使うまでは
わかりました
0946デフォルトの名無しさん
2008/12/18(木) 19:37:47time
localtime
mktime
0947デフォルトの名無しさん
2008/12/18(木) 19:44:58あとは、自分で考えてみます
0948デフォルトの名無しさん
2008/12/18(木) 20:24:411970年の午前0時になってしまいます、今日の午前0時は
どう、求まりすでしょうか?
0949デフォルトの名無しさん
2008/12/18(木) 20:28:11どこまで考えたのか書けよ
0950デフォルトの名無しさん
2008/12/18(木) 20:46:41どうやれば教えてください
0951デフォルトの名無しさん
2008/12/18(木) 20:51:480952デフォルトの名無しさん
2008/12/18(木) 20:53:310953デフォルトの名無しさん
2008/12/18(木) 21:05:20static 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としか出てきません
どうしたらいいのでしょう
0954デフォルトの名無しさん
2008/12/18(木) 21:20:580955デフォルトの名無しさん
2008/12/18(木) 21:23:13複数の関数で同じ変数を操作するには、その変数をグローバルに宣言するか、
その変数へのポインタを関数へ与えるしかない
0956デフォルトの名無しさん
2008/12/18(木) 21:38:280.0でした。
>>955
もしかして始めの関数外の配列normalがグローバルになってるからかも知れません
0957デフォルトの名無しさん
2008/12/18(木) 21:46:22とりあえずstatic GLfloat a[6][3];はstatic GLfloat normal[6][3];の間違いでいいんだな?
で、hbの中ではどういう値を与えたんだ?
ちゃんとdpより先に呼び出したんだろうな?
0958デフォルトの名無しさん
2008/12/18(木) 21:51:41はい、aじゃなくてnormalでした。
hbの中のはnormal[6][3]と同じ場所での配列を少し弄った値を入れてます。
0959デフォルトの名無しさん
2008/12/18(木) 21:52:40色々すいませんでした。
0960デフォルトの名無しさん
2008/12/18(木) 23:20:06入力を、コマンドプロンプトで
”C:\>sample1.exe
10 40 60”
と横に空白を空ける感じでやりたいのですが
scanf("%d %d %d", n,m,l)
であっていますでしょうか?
0961デフォルトの名無しさん
2008/12/18(木) 23:22:04H8は分かりますか?
0962デフォルトの名無しさん
2008/12/18(木) 23:23:55&つけろよ、 int 型へのポインタだったりしない限りは、 あとスペースは別になくてもいい
scanf("%d%d%d", n,m,l)
0963デフォルトの名無しさん
2008/12/18(木) 23:27:40ありがとうございます。
では、こうでしょうか?
scanf("%d%d%d", &n,&m,&l) ;
0964デフォルトの名無しさん
2008/12/19(金) 00:02:50scanf("%d %d %d", &n, &m, &l);
0965デフォルトの名無しさん
2008/12/19(金) 00:21:36納得させられないよ。自分にとって「美味しい食べ物」が、必ずしも万人に共通するとは
限らないように。
0966デフォルトの名無しさん
2008/12/19(金) 00:21:47敢えて空白を空けないと言うのも一つの見識だと思う。
少なくとも、根拠も提示せずに「圧倒的」と言われても同意しかねる。
0967デフォルトの名無しさん
2008/12/19(金) 00:22:520968デフォルトの名無しさん
2008/12/19(金) 00:29:490969デフォルトの名無しさん
2008/12/19(金) 02:03:480970デフォルトの名無しさん
2008/12/19(金) 02:31:48何を基準にそう言えるのか?って思われるのだよ。自分はそう思う、けど
動作に違いは無い、そう言えば良い。本当に違いが有るなら、説明すべき。
0971デフォルトの名無しさん
2008/12/19(金) 02:58:580972デフォルトの名無しさん
2008/12/19(金) 03:03:460973デフォルトの名無しさん
2008/12/19(金) 03:20:54あと、"%d"と"%d "も違う。
C言語なら俺に聞け(入門篇) Part 41
http://pc11.2ch.net/test/read.cgi/tech/1229639514/
0975デフォルトの名無しさん
2008/12/19(金) 09:39:38乙
ポイント欲しい?
0976デフォルトの名無しさん
2008/12/19(金) 11:58:450977デフォルトの名無しさん
2008/12/19(金) 12:13:20#include<string.h>
#include<stdio.h>
char yoko[50];
char tate[50];
int main(){
strcpy(yoko,"*-----*-----*-----*-----*-----*-----*-----*-----*"); //初期化
strcpy(tate,"| | | | | | | | |"); //初期化
0978デフォルトの名無しさん
2008/12/19(金) 12:15:07printf("%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);}
これでいちお出力できましたが、あまりに強引すぎるので、もうちょっと技巧的に書けませんか?
0979デフォルトの名無しさん
2008/12/19(金) 12:26:440980デフォルトの名無しさん
2008/12/19(金) 12:27:48printf("%s\n",tate);
printf("%s\n",tate);
printf("%s\n",yoko);
このまとまりを、1つのループと考えればできそうですね。
有難うございました。
0981デフォルトの名無しさん
2008/12/19(金) 13:24:040982a
2008/12/19(金) 13:27:54for(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");
下さい
0984デフォルトの名無しさん
2008/12/19(金) 21:17:180985デフォルトの名無しさん
2008/12/20(土) 00:40:46プロ教えて?
0986デフォルトの名無しさん
2008/12/20(土) 00:44:300987デフォルトの名無しさん
2008/12/20(土) 00:52:240988デフォルトの名無しさん
2008/12/20(土) 00:52:37循環し始めたのを確認するのに、前に出た数値を記憶して、
同じのが出た時点でストップ。その区間を表示。
0989デフォルトの名無しさん
2008/12/20(土) 00:57:420990デフォルトの名無しさん
2008/12/20(土) 01:22:310991デフォルトの名無しさん
2008/12/20(土) 01:24:110992デフォルトの名無しさん
2008/12/20(土) 01:25:10埋め
0993デフォルトの名無しさん
2008/12/20(土) 01:39:58鰯がいない…
どこへいったんだよ><
0994デフォルトの名無しさん
2008/12/20(土) 02:43:59プロに頼むってことは
報酬を出すということだな
いくら出す?
0995デフォルトの名無しさん
2008/12/20(土) 02:52:36女と一発でどう?
0996デフォルトの名無しさん
2008/12/20(土) 02:55:57おまいは女なら誰でもいいのか
0997デフォルトの名無しさん
2008/12/20(土) 02:58:505000万フェザーだ
0998デフォルトの名無しさん
2008/12/20(土) 10:17:240999デフォルトの名無しさん
2008/12/20(土) 10:18:331000デフォルトの名無しさん
2008/12/20(土) 10:19:0410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。