C言語なら俺に聞け(入門篇) Part 40

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  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
2デフォルトの名無しさん:2008/11/26(水) 22:16:46

ttp://xy.yu.to/ (ここは本来のサイトではないが)
この荒れまくりカオス絵チャのminiっていう部屋の
秘密スペース(枠外)への書き込みってどうやれば
できるようになるのか解析して教えろ。

あと、1人の防衛プログラマーのクリアツールが強すぎて、
荒しプログラマーがことごとく全員返り討ちになってるから
オマエラが面白くしてみろ。

ゲハハハごめんね
3デフォルトの名無しさん:2008/11/27(木) 00:47:51
コマンドライン引数の使い方がいまいちよくわかりません。
int main(int argc, int *argv[])
とした時、プログラムを実行して何かを入力するにはどうすればよいですか。
4デフォルトの名無しさん:2008/11/27(木) 01:03:54
5 の倍数であり、かつ100 の倍数でない。
どう表記すればいいですか?
5デフォルトの名無しさん:2008/11/27(木) 01:09:11
(a%5==0 && a%100!=0)
6デフォルトの名無しさん:2008/11/27(木) 01:11:42
>>5 THX
7デフォルトの名無しさん:2008/11/27(木) 01:23:26
ごめん もう一つ
・5の倍数であり、かつ100 の倍数でない。
・500 の倍数である。
8デフォルトの名無しさん:2008/11/27(木) 01:26:03
>>7
その二つをどうつなげて一つにすればいいの?
9デフォルトの名無しさん:2008/11/27(木) 01:27:26
>>8 一つの式にしてくらはい
10デフォルトの名無しさん:2008/11/27(木) 01:31:10
>>9
だから、どういう条件で引っ付けるのさ?
11デフォルトの名無しさん:2008/11/27(木) 01:35:22
if(a[i] % 5 == 0 && a[i] % 100 != 0)
この式に500 の倍数を追加するの
12デフォルトの名無しさん:2008/11/27(木) 01:37:24
>・5の倍数であり、かつ100 の倍数でない。
或いは
>・500 の倍数である。
なにか % 5 == 0 && なにか % 100 != 0 || なにか % 500 == 0

20世紀と21世紀の閏年判定なら、
year > 1900 && year < 2100 && year % 4 == 0
13デフォルトの名無しさん:2008/11/27(木) 01:39:36
>>12ありがと
14デフォルトの名無しさん:2008/11/27(木) 02:19:44
>>3
一般的な例を挙げれば、コマンドラインから
% exename param1 param2
のように入力して実行ファイルexenameを呼び出したら、
argcは3で、argv[0]、argv[1]、argv[2]はそれぞれ
"exename"、"param1"、"param2"という文字列を指す
(ただしexenameはもしかしたら存在しないかもしれない)

一応言っておくとこれはプログラムを実行するときにコマンドを与えるだけで
実行してから入力しているわけではない

与えたコマンドをどう解釈して何をやるかはプログラムの用途による
まずは何をやりたいのかを決めること
15デフォルトの名無しさん:2008/11/27(木) 02:37:37
>12
そういう甘やかしかたはいくない
16デフォルトの名無しさん:2008/11/27(木) 08:24:06
こっちで粘着されたら困るからちゃんと宿題スレに誘導しないと
17デフォルトの名無しさん:2008/11/27(木) 13:32:31
質問です
#include <stdio.h>
int main()
{
char s;
printf("入力=?"); scanf("%c", &s); /*@*/
}

上記の@の後に、ある条件A〜Cを与えて
結果がCになるまで@に戻る、と言うプログラムを作成したいのですが、
@の後にはどのように続ければよいのでしょうか?
簡単に流れを教えていただければうれしいです。
18デフォルトの名無しさん:2008/11/27(木) 13:41:48
do{
@
A
B
}while(Cが成立しない場合繰り返す);
19デフォルトの名無しさん:2008/11/27(木) 15:56:07
AとBも条件だと書いてあるがCとの関係(AND/ORなど)が書かれていないので答えようがない

条件Aと条件Bを評価だけ行って結果を無視し、条件Cの結果だけで判定するなら
do {
@;
} while(A, B, !(C));
20デフォルトの名無しさん:2008/11/27(木) 16:00:41
>>19
> AとBも条件だと書いて
ないよ。与えて、だよ?whileで繰り返すかどうかを決定付けるのは
Cが成立するかどうか。
21デフォルトの名無しさん:2008/11/27(木) 16:03:38
>>17
条件2と3は処理の流れに影響するのか?
22デフォルトの名無しさん:2008/11/27(木) 16:04:34
>>20
少なくとも条件Aは文中にあるぞ
つーか、おまえ本人なら人のせいにしないで訂正しろよ
23デフォルトの名無しさん:2008/11/27(木) 16:11:18
最初の質問文があいまいなんだよ
2417:2008/11/27(木) 16:15:22
>>18
ありがとうございます。早速試してみたいと思います
>>19
@に何か文字を打って、AorBを評価をするプログラムにしたいのですが、
「AorBならば@に戻り、Cになったらループを終了する」
と言う感じで作成したいと思っています。
Aならば正解
Bならば不正解
Cに合致した時にループを終了させると言う感じです

初心者なので、何言ってるか分からないかもしれませんが、何かアドバイスがあればお願いします。
25デフォルトの名無しさん:2008/11/27(木) 16:19:22
do{
@
if(A||B)continue;
while(!C);
26デフォルトの名無しさん:2008/11/27(木) 16:20:31
おっとwhileの前の}が抜けた
27デフォルトの名無しさん:2008/11/27(木) 16:21:44
do{
 @;
 if(A)printf("正解");
 else if(B)printf("不正解");
}while(!C);
28デフォルトの名無しさん:2008/11/27(木) 16:24:47
>>24
処理の流れ+どういう時に何をやるかは整理をつけるクセをとけよう
漠然と提示されると答えようがないしね

>@に何か文字を打って、AorBを評価をするプログラムにしたいのですが、
>「AorBならば@に戻り、Cになったらループを終了する」
>と言う感じ

こう書いてもらえると、こちらも答えやすいし
そちらも思考の何処で詰まっているかが限定しやすいし
29デフォルトの名無しさん:2008/11/27(木) 16:28:36
>>24
> 「AorBならば@に戻り、Cになったらループを終了する」

言い換えると「AorBならば@に戻り、Cでなければ@に戻る」だな?
3017:2008/11/27(木) 16:42:58
>>28
ご指摘ありがとうございます。以後気をつけます。
>>29
その通りです。未熟で申し訳ありませんでした…
31デフォルトの名無しさん:2008/11/27(木) 18:21:12
RedHatLinux9にGCCがインストール出来ない件です。

インストールが出来なかったです。
エラーが出てしまいます。
内容を以下にコピペします。

[root@ RPMS]# rpm -ivh gcc-3.2.2-5.i386.rpm
警告: gcc-3.2.2-5.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
エラー: Failed dependencies:
binutils >= 2.12.90.0.7-1 is needed by gcc-3.2.2-5
glibc-devel >= 2.2.90-12 is needed by gcc-3.2.2-5
[root@ RPMS]#

これは何を警告しているのでしょうか?
32 :2008/11/27(木) 18:24:37
binutilsのバージョン2.12.90.0.7-1以上が必要
glibc-develも同じく2.2.90-12以上が必要

"needed by"くらい厨房でも理解できるだろ
33314、31:2008/11/27(木) 18:55:37
>>32アドバイス有難うございます。2つのファイルを探してみます。
34デフォルトの名無しさん:2008/11/27(木) 19:53:40
>>33
道のりかなり険しそう。
ここで iso 落としたほうが早いんじゃない?
ftp://ftp.riken.go.jp/pub/Linux/redhat/archive.redhat.com/redhat/linux/
35デフォルトの名無しさん:2008/11/27(木) 20:10:16
ホントにgccないのかな?
 updatedb
を実行し(少し時間かかる)、
 locate gcc | less
でそれっぽいのないか探してみたら?
もしくは
find / -name gcc -print
でも可。
36デフォルトの名無しさん:2008/11/27(木) 20:12:58
RHLだから事実だろう
37デフォルトの名無しさん:2008/11/27(木) 20:44:10
38デフォルトの名無しさん: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,
};
39デフォルトの名無しさん:2008/11/27(木) 22:14:17
int a[5][5]={
8,4,3,6,6,
1,6,5,8,4,
5,4,9,1,2,
6,9,6,1,8,
7,4,1,3,5,
};
40デフォルトの名無しさん:2008/11/27(木) 22:14:55
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}};

41デフォルトの名無しさん:2008/11/27(木) 22:36:20
>>40
上手くいきました
回答、ありがとうございました。
42デフォルトの名無しさん:2008/11/27(木) 22:46:55
3行3列の行列を1オリジンにしてそいつを表示させたいんだけど、まったくうまくいかない
誰か教えてください
43デフォルトの名無しさん:2008/11/27(木) 22:49:32
1オリジンてなんですか?
44デフォルトの名無しさん:2008/11/27(木) 22:52:51
>43
ぐぐれ

まあ>42の言ってることは意味わからんが
45デフォルトの名無しさん:2008/11/27(木) 22:53:30
>>42
うまくいかないソースくらい貼れ
46デフォルトの名無しさん:2008/11/27(木) 22:53:49
a[3]って配列を宣言した時普通ならa[0], a[1], a[2]ってなるのが0オリジン
数学とかで使う普通の配列が1オリジンでa[1], a[2], a[3]ってなるやつです
47デフォルトの名無しさん:2008/11/27(木) 22:53:57
  1 2 3
1 9 3 1
2 6 4 8
3 1 5 5

こんな感じだとエスパーしてみた。
48デフォルトの名無しさん:2008/11/27(木) 22:55:18
>>45
#include <stdio.h>
int main(void)
{
float a[3][3]={{1.0,2.0,3.0},{4.0,5.0,6.0},{7.0,8.0,9.0}};
int i, j;
float *mp;
mp = &a[0]-1;
for(i=1; i<=3; i++){
for(j=1; j<=3; j++){
printf("mp[%d][%d]=%d ", i, j, mp[i][j]);
}
printf("\n");
}
return 0;
}

あと行を1オリジンにするだけだと思うのだけど……まったくわからない
49デフォルトの名無しさん:2008/11/27(木) 22:57:52
>>48
#define ORIGIN1(matrix, row, col) matrix[row-1][col-1]
50デフォルトの名無しさん:2008/11/27(木) 22:58:30
floatを%dで吐くな
51デフォルトの名無しさん:2008/11/27(木) 22:59:46
mpの型が違う。それと、得る物が少ないからお勧めしない。
Cだとサイズを変えられないし、C++ならなんでもありだからね。
52デフォルトの名無しさん:2008/11/27(木) 23:00:03
>>46
根本的に勘違いしているようだが、Cは0オリジンであって、1オリジンの添字を使うことはできない。

単に表示を1オリジンにしたいだけなら添字に1加えること。
53デフォルトの名無しさん:2008/11/27(木) 23:02:17
>>48
言語には言語の流儀ってものがあるからバカなこと考えずに0オリジンでやれ
54デフォルトの名無しさん:2008/11/27(木) 23:05:33
1オリジンと言うと Numerical Recipes in C を思い出すな。
FORTRAN 用の本を C 用にしたものだから
1オリジンで強引にやってた気がする。
しかもいくつかバグが・・・。

まあ内部的に0オリジンで扱って、
表示する時は必要に応じて1オリジンで表示する、
ってのがC的だな。
55デフォルトの名無しさん:2008/11/27(木) 23:08:05
恣意的
56初心者:2008/11/27(木) 23:14:42
C++初心者です。
現在、独習C++で勉強しています。
中級者向けの本、お勧めの本などありましたら
教えていただければ幸いです。
57デフォルトの名無しさん:2008/11/27(木) 23:16:53
>>56
スレ違いです。つーか、マルチすんな。
58デフォルトの名無しさん:2008/11/27(木) 23:17:46
>>49
加減算より優先順位の低い演算子等が入ってくるとおかしくなるぞ。
((matrix)[(row)-1][(col)-1])
にしとけ。
59デフォルトの名無しさん:2008/11/28(金) 00:38:01
C言語を利用してモデリングの勉強したいのでつが
何かいい本ないですかね?8月に出たロボコンの本とかどうなのかな?
60デフォルトの名無しさん:2008/11/28(金) 19:31:05
実行しててエラーでたら音ならして教えてくれるシステムとかないの?
61デフォルトの名無しさん:2008/11/28(金) 19:36:17
main()から0以外を返すだけでご丁寧にエラーダイアログを出してくれる環境もあるよ。
62デフォルトの名無しさん:2008/11/28(金) 19:37:25
実行時のエラーまで面倒見てくれる人はいません。
63デフォルトの名無しさん:2008/11/28(金) 19:44:42
assertマクロをひたすら仕込むとか
エラー処理で\a出力するようにするとか
64デフォルトの名無しさん:2008/11/28(金) 19:51:20
そういうのじゃなくて。
実行時間長いプログラムだと、結構実行時間中暇で、おおまかなところでしか
表示させないから、画面みないこと多いんだよね。

画面をみるのがめんどくさいというか。
65デフォルトの名無しさん:2008/11/28(金) 19:52:46
ログ出力を付ければ?
66デフォルトの名無しさん:2008/11/28(金) 19:53:58
\aでプッっていってくれるじゃん
67デフォルトの名無しさん:2008/11/28(金) 19:59:10
CDトレイ飛び出させれば?
68デフォルトの名無しさん:2008/11/28(金) 20:07:36
CPUに負荷かけてファンを回せば
69デフォルトの名無しさん:2008/11/28(金) 20:17:30
>>64
strong_beep(); とか関数作ることで処理系依存部分を分離しといて、あとはサイレンなり爆竹なり何でも使えばええやん
いつまでも「処理系非依存」の殻に閉じこもってると、結局何も実現できない口だけ PG になっちまうぞ
70デフォルトの名無しさん:2008/11/28(金) 20:21:41
がんばればビープだけで声を再生することだってできるんだぜ・・・。
魔道物語とかを参照。
71デフォルトの名無しさん:2008/11/28(金) 20:25:59
さすがにもう無理だろw
72デフォルトの名無しさん:2008/11/28(金) 20:27:18
別に時代が関係することでもないだろ・・・。
73デフォルトの名無しさん:2008/11/28(金) 22:31:39
char *p=malloc(sizeof(wchar_t)*12);
*pにint型の整数値を代入したいのですが、やり方がわかりません。
74デフォルトの名無しさん:2008/11/28(金) 22:33:22
>>73
可搬性のある方法はありません。
75デフォルトの名無しさん:2008/11/28(金) 22:34:01
>>73
*(int*)p = 9999; とかでよさそうだけど、sizeof(wchar_t)*12 との関連がわからん。
76デフォルトの名無しさん:2008/11/28(金) 22:36:17
やりたいことは実はsprintf(p, "%d", 9999)とかだったりして。
77デフォルトの名無しさん:2008/11/29(土) 11:20:07
自分はJavaやC#でWebアプリ開発やってきた人間なんですが、C言語も
勉強しようと思って、先日までK&Rを読んでました。

具体的な実例でちょっと活用してみたいな、と思うんですけど面白いもの
ありますでしょうか。自分は上記のようにJavaのWebアプリ出身なので、ライブラリ
組み合わせてプラモデルみたいにアプリ作ってきた人間です。C言語
ならではの、低レベルな部分から何かを作る、というのをやってみたいのですが。
78デフォルトの名無しさん:2008/11/29(土) 12:03:58
2進数と10進数の相互変換
7977:2008/11/29(土) 12:17:38
>>78
あはは。いや、アルゴリズムの練習というよりは、チュートリアル形式で
手を動かしていくと、ネットワークツールが出来上がる、とか、そういう
のありませんですかね。

組み込みとかも興味あるので、そっち方面でもいいんですけど。
80前スレ931:2008/11/29(土) 12:27:06
WindowsでncursesをCygwin無しで使う方法がないか聞いた者です

前スレ992
PDCursesについては正直食わず嫌いしています
実際に使ったことはありません
81デフォルトの名無しさん:2008/11/29(土) 13:15:04
>>79
何を求めているのかよくわからない
書籍のことなら書籍スレで聞け
82デフォルトの名無しさん:2008/11/29(土) 13:20:46
>>79
ネットワークツールじゃないが、
コンピュータ対人間の双方向ヒットアンドブロー数あてゲームなんてどうよ?
83デフォルトの名無しさん:2008/11/29(土) 15:03:13
質問です。

typedef struct{
  int a;
  int b;
  char c;
} DATA_STRUCT;

DATA_STRUCT data[100] =
{ {10, 20, 'A'},
  {15, 30, 'D'},



};

と100個の構造体データを宣言します。
その100個の中から0〜100個のデータのアドレスをstaticで保存しておきたい場合、

static STRUCT_DATA *data_save[100];
と宣言し、data_save[i]に保存していけばいいでしょうか?
84デフォルトの名無しさん:2008/11/29(土) 15:10:17
*じゃコピーしたことにならないのでは?
8583:2008/11/29(土) 15:25:29
すみません、コピーはこんな感じです。
STRUCT *p = &data[0];

i = 0;
while( p->a がある値になるまで ){
  data_save[i] = p;
  i++;
  p++;
}
86デフォルトの名無しさん:2008/11/29(土) 15:31:31
それだとdataの内容が変わったら、data_saveの内容も変わるんじゃないの?
8783:2008/11/29(土) 15:38:38
dataは変更のないテーブルなので、constと思って下さい。
・変更できないテーブルから何個かデータを取り出したい
・データをそのまま保存するのは容量がもったいないので、アドレスだけ保存
このような意図で考えています
88デフォルトの名無しさん:2008/11/29(土) 15:45:42
saveって名前が誤解されちゃうね。何やりたいのか、ようわからん。
89デフォルトの名無しさん:2008/11/29(土) 15:55:24
このif文はどういう意味なんでしょうか?
if (strlen(str1) == 10 && str1[9] != '\n') {
while (getchar() != '\n');
}
90デフォルトの名無しさん:2008/11/29(土) 15:58:52
>>80
まだ導入すらしてないことに驚いた
91デフォルトの名無しさん:2008/11/29(土) 16:10:07
>>89
str1 の長さが10で、かつ str1 の最後の文字が改行で無い場合。
おそらく str1 を fgets とかで読み込んで、もし入力が想定したサイズより大きかったら、次の改行まで読み飛ばしている。
9283:2008/11/29(土) 16:17:28
拙い説明ですみません。

100個のテーブルから
Aさんが使いたいデータはメンバのcが'A'
Bさんが使いたいデータはメンバのcが'B'という感じで決まっています。

Aさんが操作を行っている時は、
for( i=0 ; i<100 ; i++ ){
  data[i].c == 'A';
}
という処理をして、毎回検索するのは面倒なので、

Aさんが操作している時はAさん用のデータを抽出し、そこを検索
Bさんが操作している時はBさん用のデータを抽出し、そこを検索
と考えています。
93デフォルトの名無しさん:2008/11/29(土) 17:33:20
面倒って言葉は機械にはないよ。
94デフォルトの名無しさん:2008/11/29(土) 17:40:20
質問の答えをいうなら
それで問題ないです
95デフォルトの名無しさん:2008/11/29(土) 18:08:09
>>77
前にもいっていたらごめんなさい。
UNIXネットワークプログラミング入門 /雪田 修一/技術評論社 2003/ISBN-10: 4774117544
前身はこの手の入門書の草分けでした。
96デフォルトの名無しさん:2008/11/29(土) 18:24:40
int a[10];
int *p = &a[5];
このように宣言して、p++やp--でポインタを操作する場合
どこまで++や--できるか、一般的にはどういった書き方をするのでしょうか?
97デフォルトの名無しさん:2008/11/29(土) 18:28:01
>>96
pはaより小さくなってはいけないし、a+10より大きくなってはいけない。
それをどうコーディングするかは、実装次第。
98デフォルトの名無しさん:2008/11/29(土) 18:31:53
>>97
a + 10 はOKでしたっけ。いや、参照しなければなんでもOKでしたっけ。
えーと、クイックソートなどで真ん中を取る、という演算を p = (a + b) / 2 として許してもらえるかどうかの話です。
99デフォルトの名無しさん:2008/11/29(土) 18:36:32
>>98
デリファレンスしない場合に限り、a+10はOK。
逆に言えば、 p = a + 10して* pしたらアウト。

bが>97の要件を満たしているなら、p = (a + b) / 2は問題ない。
100デフォルトの名無しさん:2008/11/29(土) 18:38:03
>>98
a,b が共にポインタならばコンパイラに怒られる
101デフォルトの名無しさん:2008/11/29(土) 18:45:30
例えばaが5で
p = a+10するのはOK
その時に*pするのはNG
ということはわかりましたが、
pがa[9]を越えていないかどうかは、どう判断するのでしょうか?
アドレスの大小じゃわかりませんよね・・・
102デフォルトの名無しさん:2008/11/29(土) 18:45:36
>>98
> 真ん中を取る
ポインタ同士足すのは怒られたかと。
p = a + (abs(b - a) / 2);
かな。
103デフォルトの名無しさん:2008/11/29(土) 18:49:02
>>101
> アドレスの大小
で、いけるはずだが。

あと>>102間違えた。absいらんわ。
p = a + ((b - a) / 2);
で。
104デフォルトの名無しさん:2008/11/29(土) 18:54:54
アドレスの大小でいけるのですか!?

それでしたら
p + 10以上 とか
p - 10以上 の場合
if( p < &a[0] ){
  p = &a[0];
}
if( p > &a[9] ){
  p = &a[9];
}
こんな感じで頭とお尻は守られるのでしょうか?
105デフォルトの名無しさん:2008/11/29(土) 18:59:18
もう配列で処理したら?
106デフォルトの名無しさん:2008/11/29(土) 20:28:59
>>100, >>102, >>103
いつからそんな阿呆な制限がつくようになったんでしょうね。彼らはプログラミングの経験が浅かったのではないでしょうかね。
107デフォルトの名無しさん:2008/11/29(土) 20:35:51
横から質問して悪いんだけどオーバーフローしないの?
108デフォルトの名無しさん:2008/11/29(土) 20:39:01
>>106
ポインタ+ポインタ
これがどんな型になるのが妥当だと考えているの?
109デフォルトの名無しさん:2008/11/29(土) 20:40:22
そんなことを疑問に思ってネットでいちいち質問してるより、
ふつーに入門書を頭から読んでいったほうが効率いいんじゃね?
って、思うような質問ってよく見るよな。
110デフォルトの名無しさん:2008/11/29(土) 20:41:41
>>101
a が 5 で、というのはちょっと意味がわかりません。それはともかく、
static char buff[100]
で、p が buff の中を指しているかどうかをみるのに、
p >= buff && p < buff + 100
とするのはありだと思います。これがわかりにくければ、p は値としてアドレスをとると考えて、べたに
p >= &buff[0] && p < &buff[100]
と書いてなんら差し支えはありません。
111デフォルトの名無しさん:2008/11/29(土) 20:42:52
>>108
なるほど。
でもポインタでいいかと。
112デフォルトの名無しさん:2008/11/29(土) 20:44:19
char buf[100]; で &buf[100] って大丈夫なの?
まあ、ほとんどの環境で問題なく動くだろうけど。
113デフォルトの名無しさん:2008/11/29(土) 20:45:31
>>111
ポインタ同士の足し算にどんな意味があるんだよ
得られるものは何?
114111:2008/11/29(土) 20:48:19
>>113
そんなことにことだわるのが変。(a + b) / 2 は非常によくあらわれる手法。
115デフォルトの名無しさん:2008/11/29(土) 20:49:06
>>110
ありがとうございます
116デフォルトの名無しさん:2008/11/29(土) 20:50:07
>>114
可能だとしても、そういうときしか使えないような気もするが。
117デフォルトの名無しさん:2008/11/29(土) 20:50:10
>>112
buff[100] が *(buff + 100) のシンタックスシュガーならば、問題ないかと。
11898:2008/11/29(土) 20:50:42
>>116
(^^;;;;;;;;;;
119デフォルトの名無しさん:2008/11/29(土) 20:51:13
>>117
*(buff + 100) ← この時点でだめじゃん。
120デフォルトの名無しさん:2008/11/29(土) 20:51:41
>>114
型を気にしないならアセンブラをすればいい
C言語にこだわるのが変
121デフォルトの名無しさん:2008/11/29(土) 20:54:24
>>119
そういういみではそうですね。&buff[100] = &*(buff + 100) という説明はありですか?
122デフォルトの名無しさん:2008/11/29(土) 20:56:15
>>121
やっぱだめなんじゃね?
char buff[100]; に対してでしょ?
123デフォルトの名無しさん:2008/11/29(土) 20:57:43
>>120
典型的な用途としてカーネルをCで書く、というかCはもともとそのように生まれてきたのでしょう?そんな記述力の高い C になんで無用な制限を課すのでしょうか?
124デフォルトの名無しさん:2008/11/29(土) 21:00:02
>>123
ポインタ同士の加算ってふつーにオーバーフローしそうだけど。
125デフォルトの名無しさん:2008/11/29(土) 21:00:07
>>122
いや、だから &*(buff + 100) とかくと、& と * が相殺されて(参照するコードがうまれることなく) buff + 100 になる、とか。これは文法書をみなくては。
126デフォルトの名無しさん:2008/11/29(土) 21:01:52
>>124
んーなるほど。値によってはアウトですかね。
127デフォルトの名無しさん:2008/11/29(土) 21:02:32
ポインタの足し算したがる馬鹿は、足した結果を2で割ったときの振る舞いを定義してみろよ。
char *のときにはなんとかなっても、int *のときに破綻しないように定義することが如何に難しいかわかると思うぞ。
結論:ポインタ同士を足したものの型を適切に定義できない以上、それを整数で割った型も適切に定義できない。

予測される反論に対する自衛。
int *同士を足した型を、「int *同士を足し合わせた特殊な型」と定義すれば2で割った場合の定義も適切にできるかもしれない。
では、3で割ったら? 或いは7で割ったら? つまり、イリーガルケースの対応のためにどんどん後付の仕様を膨らませ続けなければいけなくなってしまう。
128デフォルトの名無しさん:2008/11/29(土) 21:04:00
>>127
なるほど。アラインメントがくずれるわけですね。
129デフォルトの名無しさん:2008/11/29(土) 21:05:53
そうだね、int a[SIZE]; int * b = a + SIZE;としたときに(a+b)/2がきちんとa+(b-a)/2と
同じ場所を指す保証をコンパイラにさせるのは、仮にSIZEが奇数だと酷だな。
130デフォルトの名無しさん:2008/11/29(土) 21:06:29
>>125
ぜひ規格を確認してみてください。
13198:2008/11/29(土) 21:06:52
>>129
納得しました。いろいろコメントいただきありがとうございました。
132デフォルトの名無しさん:2008/11/29(土) 21:13:41
if( p >= &buff[0] && p < &buff[100] )

if( p >= &buff[0] && p <= &buff[99] )
これだったら問題はないですかね?
133デフォルトの名無しさん:2008/11/29(土) 21:16:32
>>132
え?そういう制限はないはず。p は参照さえしなければなにをさしてもいいのでは?
134デフォルトの名無しさん:2008/11/29(土) 21:17:31
訂正。配列が定義された範囲の一つ後ろだけOKだった、だったかな。
135デフォルトの名無しさん:2008/11/29(土) 21:20:36
>>133
&buff[100] が合法かどうかって話だろ。
136デフォルトの名無しさん:2008/11/29(土) 21:20:59
そういうこと。p == buf + 100はOKだけどp == &buf[100]は巧くない。
137デフォルトの名無しさん:2008/11/29(土) 21:39:49
>>132
> if( p >= &buff[0] && p <= &buff[99] )
こう書く方が好き♪
if( &buff[0] <= p && p <= &buff[99] )
138デフォルトの名無しさん:2008/11/29(土) 21:40:55
流れを切って申し訳ないが質問

ポインタの初期化宣言で通常ポインタは
int *p = NULL;
ではint型へのポインタ配列は
int *p_array[100] = { NULL, NULL, ... ,NULL };
と100個宣言する必要がある?
139デフォルトの名無しさん:2008/11/29(土) 21:44:40
>>138
int *p_array[100] = { NULL};
ってだけでのこりも全部NULLになる、配列はひとつでも初期化するとのこりは0を代入した場合の値になる
140デフォルトの名無しさん:2008/11/29(土) 21:52:24
>>139
即レスありがとう。
処理途中でNULLにするには
for(i=0;i<100;i++){
 p_array[i] = NULL;
}
とする必要がありますか?
141デフォルトの名無しさん:2008/11/29(土) 21:54:22
>>127
> ポインタの足し算したがる馬鹿

相対アドレス計算なら、アセンブラから始めたおじさん達にとっては普通の発想だよ
結果のアドレスがオーバーフローしないように設計したり、わざとオーバーフローさせたり、そんなのは場合によりけり
142デフォルトの名無しさん:2008/11/29(土) 21:58:29
相対アドレスの相対の部分なら、Cのポインタと整数の演算の整数部分だけど、ポインタ同士の足し算って、
イメージ的には、インデックスレジスタどうしの加算みたいな感じ。
143デフォルトの名無しさん:2008/11/29(土) 22:06:15
Cでウィンドウの作成ってできるの?
14498:2008/11/29(土) 22:06:37
>>141
まあ 8086 の near ポインタならOKですね。というか、私はその口。
でも、dos のソースが他の環境でも使えるのなら、そのほうがうれしいものです。
145デフォルトの名無しさん:2008/11/29(土) 22:08:03
>>143
Win32API なら C が標準
アセンブラや C++ でも使えるけどね
146デフォルトの名無しさん:2008/11/29(土) 22:09:38
いや、ニアポインタだって、状況は同じじゃ?
147デフォルトの名無しさん:2008/11/29(土) 22:09:46
>>140
そうです。
変数の初期値の話は、言語の話というよりは、特定の環境(dos だの elf だの)の実行ファイルの形式などを念頭に置いたほうが理解しやすいと思います。
14898:2008/11/29(土) 22:10:37
>>146
ああ、そうですね。
なんだか今日は調子悪いですね。
149デフォルトの名無しさん:2008/11/29(土) 22:13:16
>>147
どうもありがとう。
150デフォルトの名無しさん:2008/11/29(土) 22:14:25
#define ABCD 1
#define AB 2
#define CD 3

としたら、これらは別々のものとして判別できますか?
151デフォルトの名無しさん:2008/11/29(土) 22:15:25
>>150
できます。マクロ AB CD ABCD はべつものです。
152150:2008/11/29(土) 22:20:29
どうもありがとうございます。
153デフォルトの名無しさん:2008/11/29(土) 23:20:08
質問です。

C言語で、Sjis→EUC-JP のURLエンコードの方法を教えてください。
このページみたいにしたいです。
http://home.kendomo.net/board/decode/

「ニュース速報」→%A5%CB%A5%E5%A1%BC%A5%B9%C2%AE%CA%F3
とかにしたいです。
154デフォルトの名無しさん:2008/11/29(土) 23:24:20
『ガウス ザイデル法』 を用いて最低4元以上の一次連立方程式をとけ
自分で作ったのは以下のようなプログラムなのですが, 間違いやアドバイス等があったらいただけないでしょうか?
(ピボット選択あり)
よろしくお願いします.
----------------------------------------------------------------------------------------
#include<stdio.h>
#include<math.h>
#define NN 5
#define EPS 1.0e-5
void gauss(double a[NN][NN], double x[NN], double b[NN], int n){
int i, j, k, l;
double p, q, s;
double error, aa;
int d;
double g, h, w;
for(k=1; k<=n-1; ++k){
d = k;
g = fabs(a[k][k]);
for(i=k+1; i<=n; ++i){
h = fabs(a[i][k]);
if(h > g){
d = i;
g = h;}}
for(j=k; j<=n; ++j){
w = a[k][j];
a[k][j]=a[d][j];
a[d][j]=w;}
w = b[k];
b[k]=b[d];
b[d]=w;
つづく
155デフォルトの名無しさん:2008/11/29(土) 23:25:27
つづき
for(i = 1 ; i <= n; i++)
x[i] = 0.0;}
for(i = 1 ; i <n; i++){
error = 0;
for(j = 1; j <= n; j++) {
aa = b[j];
for(k = 1; k <= n; k++)
if(k != j) aa-= a[j][k] * x[k];
aa/= a[j][j];
error+= fabs(aa - x[j]);
x[j] = aa;}
if(error < EPS) break;
}}
int main(void){
int i, j, n;
double a[NN][NN], x[NN], b[NN];
printf("n=");
scanf("%d",&n);
for(i=1; i<=n; ++i){
for(j=1; j<=n; ++j){
printf("a[%d][%d]=",i,j);
scanf("%lf",&a[i][j]);}
printf("b[%d]=",i);
scanf("%lf",&b[i]);}
gauss(a, x, b, n);
printf("\n---ガウス・ザイデル法による計算結果mx--------\n\n");
for(i=1; i<=n; i++) {
printf(" x[%d] = %lf\n", i , x[i]);}
return(0);}
156デフォルトの名無しさん:2008/11/29(土) 23:25:59
>>153
sjis を iconv とかで euc-jp にした後に普通にURLエンコードすれば?
157デフォルトの名無しさん:2008/11/29(土) 23:30:17
>>153
SJIS -> EUC は
http://athomejp.com/goldfish/mfc/original/sjistoeuc.asp

C++だけどわかるだろ?
158デフォルトの名無しさん:2008/11/29(土) 23:50:19
>>156
>>157
ありがとうございます。
157さんの方法でうまくいきそうです。
159デフォルトの名無しさん:2008/11/30(日) 01:10:36
>>154
ですがスレチ気味なので宿題スレに質問し直させていただきました
お騒がせ致しまして申し訳ございませんでした
160デフォルトの名無しさん:2008/11/30(日) 02:42:27
何故コードを最適化するのですか?
161デフォルトの名無しさん:2008/11/30(日) 03:05:35
ソートするプログラムを作ろうとしたのですが出来ません。どこがおかしいのでしょうか?
----------------------------------------------------------------------------
#include <stdio.h>
void swap(int a,int b);
int main(void)
{
int x[5]={32,57,21,43,19};
int i=0;
int j;
while(i<=3)
{
j=i+1;
while(j<=4)
{
swap(x[i],x[j]);
j++;
}
i++;
}
for(i=0;i<5;i++)
{
printf("%d\n",x[i]);
}
return 0;
}
つづく
162デフォルトの名無しさん:2008/11/30(日) 03:07:20
つづき
void swap(int a,int b)
{
int temp;
if(a>b)
{
temp=a;
a=b;
b=temp;
}
}
163デフォルトの名無しさん:2008/11/30(日) 03:24:56
値渡しだからswapされてないんじゃないの
swapの部分を別関数にしないか
swap関数には配列と二つの要素番号を渡すようにしたら
164デフォルトの名無しさん:2008/11/30(日) 03:37:53
素直にポインタ渡しを勧めてやれよw
165デフォルトの名無しさん:2008/11/30(日) 03:40:48
#define swap(x,y) { x^=y; y^=x; x^=y; }
166デフォルトの名無しさん:2008/11/30(日) 09:06:13
まだこんなコードおっさんがいるのか
167デフォルトの名無しさん:2008/11/30(日) 09:07:21
>>165
加齢臭のするコードですね。
16877:2008/11/30(日) 09:57:34
>>95
ありがとうございます!ちょっと見てみます。
169デフォルトの名無しさん:2008/11/30(日) 10:01:56
>>165
そんな swap(x,x) とやると破綻するようなマクロはやめとけって
170デフォルトの名無しさん:2008/11/30(日) 12:08:54
>>167
意味不明。そんなことを言ったら、大昔からあるコードからは加齢臭がしてきますね。
C言語なんてかなり前からあるから、今頃どの教本も、加齢臭だらけだw

>>169
確かに、同じ変数同士でやってしまったら、0ですな・・・
そういう場合に使う必要はないだろうけど、別に変数を1つ用意して
やる場合、そんな結果にはならないしね。
171デフォルトの名無しさん:2008/11/30(日) 12:15:48
「加齢臭」と揶揄された意味もわかってないのか・・
172デフォルトの名無しさん:2008/11/30(日) 12:26:36
>>171
自分勝手な言葉で理解できないのか、なんていっている奴は
他人とまともにコミュニケーションがとれない引きこもり。
そうやって理解しないものを叩く前に、自分が意味不明な
言葉を使っていることに気づけよ、基地外
173デフォルトの名無しさん:2008/11/30(日) 12:27:45
171 名前:デフォルトの名無しさん 投稿日:2008/11/30(日) 12:15:48
「加齢臭」と揶揄された意味もわかってないのか・・

↑さすがにこいつ、アホだ・・・揶揄にしても表現がどうかと。
周りが見えていない奴って、本当に迷惑だな。お前こそ臭いソースでも書いてんだろw
174デフォルトの名無しさん:2008/11/30(日) 12:31:57
そんなコードはどうとか言うにしても、>>169みたいに問題点を指摘すべきだろ。
それすらせずに、自分が汚い表現を用いたのを指摘されて、逆に揶揄されたのに
何で分からないんだ・・・みたいなことを言われても、お前の表現がおかしい、
加齢臭がするしないはともかく、本当にそうだと言う人に対して失礼。
いずれもお前も、年をとれば嫌でも自分から漂ってくる臭いだから、せいぜい
臭わない内に思い上がってろ。
175171:2008/11/30(日) 12:33:15
加齢臭と書いたのは俺じゃないわけだが
くやしいのう
176デフォルトの名無しさん:2008/11/30(日) 12:39:32
>>175 お前キモイ、自分の性格が悪いことに気づくべきだよ。
頭の悪い奴ってのは、自分が低レベルだということに気づいていないから困る。
精神レベルも低い。
177デフォルトの名無しさん:2008/11/30(日) 12:52:45
>>176 お前キモイ、自分の性格が悪いことに気づくべきだよ。
頭の悪い奴ってのは、自分が低レベルだということに気づいていないから困る。
精神レベルも低い。
178デフォルトの名無しさん:2008/11/30(日) 12:55:22
>>170
配列全体をなめての値交換だと
不意にインデックスが同じところ指すかもしれないからなおさらよろしくない
別変数用意するなら、結局代入操作をそこで記述してもよいわけだしね

個人的には
引数に変化をあたえるようなマクロは好きでない というのはおおげさか?
※ とはいえ va_start() は↑のタイプだってりするけどねw
179デフォルトの名無しさん:2008/11/30(日) 13:07:02
なんだか「加齢臭」に過剰に反応しているロートル(らしき)が多くて笑える。
挙句、相手の精神レベルがどうこうって自分がなんだと思っているんだろうね。
関数で事が足りることをマクロで実装するなんて今時の技術についていけていないって証明なんだから、
大人しく現場から離れて現場の人間を巧くコントロールするかお茶でも啜ってろって。
180デフォルトの名無しさん:2008/11/30(日) 13:15:05
>>179 お前キモイ、自分の性格が悪いことに気づくべきだよ。
頭の悪い奴ってのは、自分が低レベルだということに気づいていないから困る。
精神レベルも低い。
181デフォルトの名無しさん:2008/11/30(日) 13:16:53
http://www.dd.iij4u.or.jp/~okuyamak/Information/xor_fixed_swapping.html
今時のCPUだとXOR使うほうが遅くなるって話もある。
182デフォルトの名無しさん:2008/11/30(日) 13:17:05
ERROR: 低レベルが定義されていません
ERROR: 精神レベルが定義されていません
183デフォルトの名無しさん:2008/11/30(日) 13:22:14
>>181
VtuneかCodeAnalystで解析かけてからもの言え
184デフォルトの名無しさん:2008/11/30(日) 13:41:27
#if (__STDC_VERSION__ >= 199901L)
inline void
#else
void
#endif /* __STDC_VERSION__ >= 199901L */
Swap(
void * x,
void * y,
register size_t size,
) {
register char tmp;
char * s = (char *)x;
char * t = (char *)y;
register size_t i;

for ( i = 0; i < size; ++i ) {
tmp = *(s + i);
*(s + i) = *(t + i);
*(t + i) = tmp;
}
}
Swap(&a, &b, sizeof(a));
最近これに近いの書いたなぁ
185デフォルトの名無しさん:2008/11/30(日) 14:32:24
かなり効率悪いよね。
186デフォルトの名無しさん:2008/11/30(日) 14:54:28
>>175
ごめんなさい。ごめんなさい。
宿題スレでがんばるので許してください。
187デフォルトの名無しさん:2008/11/30(日) 15:07:16
188184:2008/11/30(日) 15:44:08
 ごめん、>>185は、>>184へのレスポンスと仮定するが、
>>185は、そこまでいうのなら、
>>184より、効率がよくて汎化なスワップ関数作ってくれ。
 因みに、クイックソートのサブルーチンで使っています。
189デフォルトの名無しさん:2008/11/30(日) 16:22:54
memmove
190デフォルトの名無しさん:2008/11/30(日) 16:24:07
効率悪いって言うか、書き方が時代錯誤。それに、もし本当に効率(≒速度として)を重視するなら「汎用なんて糞喰らえ」で書くべきだ。
191デフォルトの名無しさん:2008/11/30(日) 17:03:41
>>188
アーキテクチャにはよるが、普通にテンポラリバッファとってmemmoveすればいいよ。
192デフォルトの名無しさん:2008/11/30(日) 17:44:14
#define swap(type , x , y) { type tmp=x; x=y; y=tmp; }
type : 変数の型を指定
193184:2008/11/30(日) 18:14:02
>>192
マクロは、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る。
194デフォルトの名無しさん:2008/11/30(日) 18:17:15
>>192
#define swap(x, y) { int tmp=(x); (x)=(y); (y)=tmp; }
ってしたくなりませんか。(なお type について突っ込むつもりはありません。)
195デフォルトの名無しさん:2008/11/30(日) 18:18:54
>>193
> (2nd ed.)
んーしらなかった。
196デフォルトの名無しさん:2008/11/30(日) 18:28:02
>>194
xとyが必ずしもint型とは限らないんで、その場で決められる仕様になっているのだが
いちいち突っ込んだり、そうではない、こうだという意見は無駄だよ。
197デフォルトの名無しさん:2008/11/30(日) 18:28:56
>>194
(x)とか、別に括弧は必要ないぞ
198デフォルトの名無しさん:2008/11/30(日) 18:31:16
括弧はあったほうがいい。
swap(a=b, c); とか検出できる。
199デフォルトの名無しさん:2008/11/30(日) 18:35:45
> あったほうがいい
ほら、でた、主観。お前は言葉の意味を理解して聞いているのか?
”必要”、必ず要る、その意味が分かってないから、いちいち
鬱陶しい口答えをする性格になったんだろうけど。
逆に問うぞ、”必要”があるなら、その必要性について
客観的な意見で述べよ。
200デフォルトの名無しさん:2008/11/30(日) 18:37:26
括弧は必要だ
何故ならswap(a=b, c); とか検出できるからだ

これでいいの?
201デフォルトの名無しさん:2008/11/30(日) 18:38:32
意見をすればするほど、自分の意見の欠陥が露呈されていくだろ?
誰もそんなこと聞いてはいないのに、いつの間にか直接的ではないことで
勘違いをしていることを指摘されていると気づかないんだよな。

加齢臭についても、それについて嫌な思いをした人がいるから
反論されているのではなく、表現の汚さや、揶揄にしても
あまりにも表現として相手に伝わらないから、突っ込まれているのに。
意見をする以上、それなりの覚悟をしないと、社会じゃやっていけないよ。
下手なことを言えば、立場を悪くするように。
202デフォルトの名無しさん:2008/11/30(日) 18:38:43
>>199
二行目が一行目の理由なんだけど…
203デフォルトの名無しさん:2008/11/30(日) 18:41:34
知性に欠陥のあるやつは放っておけよ。
204デフォルトの名無しさん:2008/11/30(日) 18:43:55
これはwww
釣り釣りw
205デフォルトの名無しさん:2008/11/30(日) 18:45:02
まだおっさんいるのかよwwww
206デフォルトの名無しさん:2008/11/30(日) 18:52:18
intと敢えて書き換えて、したくなりませんかとか、typeに対する
注釈を読んでいなかったのか、理解できなかったのか?って思われるだけだぞ。
そうしたいなら、自分がすれば良いだろ?ただ、そのコードは
型を指定して、int型以外でも使えるのに、敢えて限定する意味は?
おまけに必要とされない括弧。銅説明するんだ、あんた?
意見する以上、無駄なことを言うと、逆に突っ込まれるぞ。
207デフォルトの名無しさん:2008/11/30(日) 19:32:30
>>196
いや、だからtypeを問題にしていないし、そう書いたつもりですが、なにか問題でもあるのでしょうか?
208デフォルトの名無しさん:2008/11/30(日) 19:34:09
>>206
いや、だからtypeを問題にしていないって書いたのですが、それでもあえて文句をつけるのですか?
209デフォルトの名無しさん:2008/11/30(日) 19:35:37
>>208
いや、だからtypeを問題にしていないって書いたのですが、それでもあえて文句をつけるのですか?
210デフォルトの名無しさん:2008/11/30(日) 19:39:38
>>207
意図が分散してる type→intの書き換え と マクロ引数の括弧づけ
type を問題にしていないのなら書き換えしなければ マクロ引数の括弧づけ のみのトピックだと明確にわかる

俺個人としては、マクロ引数には括弧をつけるし、
例の swap みたいなのは do { } while(0) で囲みたくなるな
211デフォルトの名無しさん:2008/11/30(日) 19:48:28
>>210
たしかに、自分の好みに忠実にしたがって type を消しましたが、ことわりは入れておきました。
でも、そんなことにも耐えられない人がいたとは驚きでした。

do { } while (0)
これは if () を { } なしで書く人のためにあるんでしたか。
212デフォルトの名無しさん:2008/11/30(日) 19:53:07
>>211
> これは if () を { } なしで書く人のためにあるんでしたか。
ちょっと違う
必ず ; を要求するかたちだね。

#define foo() { }
#define bar() do { } while(0)

foo() foo() ←文法的にセーフ { } { } で展開されるだけだし
bar() bar() ←文法的にアウト
213デフォルトの名無しさん:2008/11/30(日) 19:54:30
はいはい
214デフォルトの名無しさん:2008/11/30(日) 21:49:56
>>212
で、何がどううれしいんだ?
215211:2008/11/30(日) 21:56:25
>>214
あのう、こんなのは定石なんですが。ググればわかります。
216デフォルトの名無しさん:2008/11/30(日) 21:57:03
だったら
コンマ演算子つかえば?
217211:2008/11/30(日) 21:57:44
>>214
だいたい、なぜageるのですか?
218デフォルトの名無しさん:2008/11/30(日) 21:58:21
>>216
ん?どのように?
219デフォルトの名無しさん:2008/11/30(日) 22:01:43
#define swap(x, y) int tmp=(x), (x)=(y), (y)=tmp

攻すれば
swap(a,b);

if(1){
swap(a,b);
}
つかえんじゃね
220デフォルトの名無しさん:2008/11/30(日) 22:08:29
>>219
#include <stdio.h>
#define swap(x, y) int tmp=(x), (x)=(y), (y)=tmp
int main()
{
int a, b;
a = 1;
b = 2;
swap(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
をcppにくわせたところ、問題の部分は
int main()
{
int a, b;
a = 1, b = 2;
int tmp=(a), (a)=(b), (b)=tmp;
printf("a = %d, b = %d\n", a, b);
return 0;
}
になりました。
221デフォルトの名無しさん:2008/11/30(日) 22:11:48
>>215
なるほど、定石だからうれしいのか
よーくわかったよ
222デフォルトの名無しさん:2008/11/30(日) 22:12:52
>>219
if(1) swap(a,b);

だめぽ
223デフォルトの名無しさん:2008/11/30(日) 22:12:58
>>221
というより、他にいい書き方がありますか?>>216 ではうまくいかない。
224デフォルトの名無しさん:2008/11/30(日) 22:13:58
>>221
定石は大事ですよ。定石もしらないのに回答者側で書くなんて10年はやいんじゃないですか。きえてください。
225デフォルトの名無しさん:2008/11/30(日) 22:14:40
>>224
あたなことそきえたmsだあさい
226デフォルトの名無しさん:2008/11/30(日) 22:14:53
>>221
宿題スレでお待ちしています。私は「当方の環境は」云々で書いていますので、すぐわかります。叩いてもらって結構。
227デフォルトの名無しさん:2008/11/30(日) 22:14:54
http://pc11.2ch.net/test/read.cgi/tech/1227705211/
C言語を馬鹿にする感じで
228デフォルトの名無しさん:2008/11/30(日) 22:15:28
>>225
日本語でいいですよ。
229デフォルトの名無しさん:2008/11/30(日) 22:19:00
>>224
結局何も自分の言葉で説明できていないのにシッタカこいてんじゃねえよ
230デフォルトの名無しさん:2008/11/30(日) 22:35:52
またいつものバカか
釣られすぎだ
231デフォルトの名無しさん:2008/11/30(日) 22:43:58
これなら x や y に副作用があっても大丈夫。
x や y に代入式を入れる事はできなくなるが、
swap でそんなもの入れれる方が問題だと思うので
これで問題は無かろう。

#define SWAP(x, y, type) \
 do { \
  type *SWAP_TMP_X = &(x); \
  type *SWAP_TMP_Y = &(y); \
  type SWAP_TMP = *SWAP_TMP_X; \
  *SWAP_TMP_X = *SWAP_TMP_Y; \
  *SWAP_TMP_Y = SWAP_TMP; \
 } while(0)
232デフォルトの名無しさん:2008/11/30(日) 22:46:34
一方、ロシアはC++ templateを使った。
233デフォルトの名無しさん:2008/11/30(日) 22:48:00
>>231
でもさ、そもそもわざわざ関数じゃなくてマクロを使うのってパフォーマンスのためだよな
代入増やしたら意味なくね?

>>232
展開されねーだろw
234デフォルトの名無しさん:2008/11/30(日) 22:49:27
>>233
最適化に期待したいが、ポインタ使うとどうなるんだろうか怪しいのか?
235デフォルトの名無しさん:2008/11/30(日) 22:50:37
テンプレートみたく、型を引数にとりたい場合にもマクロを使う。
236デフォルトの名無しさん:2008/11/30(日) 22:58:06
>>233
関数呼び出しのコストはちょっとした一時変数の確保や代入よりずっと大きい
ただし、本当にちょっとしたことをやるだけの関数なら、
コンパイラがオプション次第でインラインに展開してくれるかもしれない
237デフォルトの名無しさん:2008/11/30(日) 23:00:50
変数を変化させる場合は関数だとポインタ渡しにしなきゃならんので
つい簡単な処理はマクロで(ポインタ使わず)書いてしまうな、俺は。
でも、関数のような形で記述しといて引数が変化してしまうってのは
ホントは良くないよねえ。
238デフォルトの名無しさん:2008/12/01(月) 01:06:51
ああそれは良くないね
デバッガで追えない点もマクロのダメなところ
オプション変更で可能なのかもしれんが
239デフォルトの名無しさん:2008/12/01(月) 01:38:50
>>229
宿題スレでお待ちしています。(以下略)
240デフォルトの名無しさん:2008/12/01(月) 01:54:17
>>239
帰り道にある公園のトイレでお待ちしています。(以下略)
241デフォルトの名無しさん:2008/12/01(月) 01:55:10
>>231
SWAP(++a, ++b, int);
というのを想定しているのでしょうか?でもこれでもうまくいかない。
いえ、ここまでうまくいく必要はないと思います。副作用のある表現をマクロの引数にするのは問題ですから。

きびしい言い方をすれば、このかきかたでも、なにもかわっていないから、ふつうに、
#define SWAP(x, y, type) {type tmp = (x); (x) = (y); (y) = tmp; }
でいいと思います。
242デフォルトの名無しさん:2008/12/01(月) 02:04:38
c言語 覚えただけで 使わない
243デフォルトの名無しさん:2008/12/01(月) 04:45:02
>>231
xやyのアドレスを取れない場合があるから、それはうまくない。
244デフォルトの名無しさん:2008/12/01(月) 06:52:35
>>241
結局何も自分の言葉で説明できていないのにシッタカこいてんじゃねえよ
245デフォルトの名無しさん:2008/12/01(月) 06:55:54
>>211
こいつキモイな
246デフォルトの名無しさん:2008/12/01(月) 09:04:20
マクロについては、それ専用のスレで。言われているように、
使い方によっては問題が起こると。だから、コードを書く側が
適切に記述して使うべきだろ?あれこれ問題だと言い出したら、
わざと問題が起こるような状況をわかっているのに、対処しないような
人ほど、問題だろ。また、人為的でなくても問題があるなら、
最初から避ければ良いだけで、いちいちそれは問題だと
問題を敢えて起こして提起しなくて良いから。
意見するならするで、重要なことを述べな。
247デフォルトの名無しさん:2008/12/01(月) 11:11:00
バカに付き合ってると自分もバカになるぞ(・3・)
248デフォルトの名無しさん:2008/12/01(月) 16:47:15
Cを本当に活かせるのは組み込みなんじゃないかって思うのですが、
WindowsネイティブなアプリケーションだとAPI呼び出しが90%を占めている感じがするし
どう思いますか?
249デフォルトの名無しさん:2008/12/01(月) 16:48:55
それは入門編スレで聞くべきことだと思いますか?
250デフォルトの名無しさん:2008/12/01(月) 17:11:43
>>249
あなたはCでどんなプログラムを作っていますか?
251デフォルトの名無しさん:2008/12/01(月) 20:28:43
>>250
それは入門編スレで聞くべきことだと思いますか?
252デフォルトの名無しさん:2008/12/01(月) 20:34:19
>>251
入門スレ以外で聞くところがありますか?
253デフォルトの名無しさん:2008/12/01(月) 20:40:29
>>252
プログラム板以外で聞くところがあります

プログラマー
http://pc11.2ch.net/prog/
254デフォルトの名無しさん:2008/12/01(月) 20:41:05
>>252
マ板に行け
255デフォルトの名無しさん:2008/12/01(月) 22:56:39
ファイルから一文字ずつ入力するにはどうしたらいいのか教えてください。
256デフォルトの名無しさん:2008/12/01(月) 23:41:36
fgetc
257デフォルトの名無しさん:2008/12/01(月) 23:53:23
>>256
ありがとうございます
258デフォルトの名無しさん:2008/12/02(火) 01:43:13
組み込みとは縁遠いんだけど、C使う時はグルー的なところが満足な速度を出せなくなった時に
必要に迫られたというパターンがおおいかも。
259デフォルトの名無しさん:2008/12/02(火) 07:56:38
すいません、質問があります。
配列に入りきらない数値データの移動平均をしたいのですが、
やり方を教えていただきたいです。
例えば1000万個の数値データを500ずつの移動平均を行う場合を教えてください。
初心者ですいません、宜しくお願いいたします。
260デフォルトの名無しさん:2008/12/02(火) 08:05:47
500個ずつ配列に入れておけばいいじゃん。
261デフォルトの名無しさん:2008/12/02(火) 09:56:03
違うcppで使われてる変数を変えるのってどうやるの?
262デフォルトの名無しさん:2008/12/02(火) 10:10:03
合計とデータ数があれば平均は出せる、と小学校で習いませんでしたか?
263デフォルトの名無しさん:2008/12/02(火) 10:11:34
>>259です。
>>260さんのおっしゃった方法ですが、
1~500、2~501、3~503・・・
としていくのに、1,2・・・を飛ばして100からといった感じで
大きい数いなったときの配列への格納がうまく行きません。
264デフォルトの名無しさん:2008/12/02(火) 11:06:15
移動平均なら buf[i % 500] に代入でいいんじゃね

配列内総和 = 前回総和 - 最古のデータ + 最新データ
配列 → 最古のデータの部分を 最新データで書き換え

500 個分の過去データがないと 最古がどれか は保持できないので
配列をなくすことはできないな
265デフォルトの名無しさん:2008/12/02(火) 13:22:26
ファイルでも使えば?
266デフォルトの名無しさん:2008/12/02(火) 13:23:19
文房具のCMの駄洒落でもあるじゃん、ファイルを
ふぁいる(入る)だけ用意してって
267デフォルトの名無しさん:2008/12/02(火) 14:18:39
はっきり言ってしまうとC言語関係ない
268デフォルトの名無しさん:2008/12/02(火) 14:20:03
>>261
違うcppとはどういう意味ですか?
そもそもcppに変数はありません
269デフォルトの名無しさん:2008/12/02(火) 15:22:33
すいません、構造体の配列を使って住所録を作るプログラムを作成しています。
住所などのデータは最初は無く起動してから入力するプログラムなのですが。
住所録のデータを消す関数が全く分かりません・・・。
(後は下の空欄に文字を入れるだけなのですがお手上げですorz)
int sakujo(struct tmp data[])
{
int i,j;
char name[20];
char ans;
do{
printf("削除するデータの氏名―>");
scanf("%s",name);
for( )/* データ数分だけ繰り返す*/
if( ) break;/*削除データが見つかったら繰り返しを抜ける*/
}
if(i< ){ /*削除データがあった*/
for( )
dt[j-1]=dt[j];/*データを前詰め*/
「       」 /*データ件数-1*/
}
else
printf("その氏名のデータはありません\n");
print("データの削除を続けますか?(y/n)");
rewind(stdin)
scanf("%c",&ans);
}while(ans=y||Y)/*yかYが入力されるまで繰り返す*/
「    」 /*戻り値を返す*/
270デフォルトの名無しさん:2008/12/02(火) 15:39:34
>>269
 回答になってないことは十分承知ではあるが、
配列の要素数がわかっていないの場合、番兵などを決めていないとこれ以上いじりたくないソースに見えてしまう。
 もしかして、疑似言語?while(ans = y || Y)とか。

 構造体tmpがどのようなメンバを持っているのかわからないので、ソース全体をどこかに上げることをお薦めする。
271269:2008/12/02(火) 15:42:30
すいません書き忘れました!
OS Vista ソフトVisual studio2005
ファイル処理、プリプロセッサ、記憶クラスなどは習ってません
272デフォルトの名無しさん:2008/12/02(火) 15:46:54
>>269
|for( )/* データ数分だけ繰り返す*/
|if( ) break;/*削除データが見つかったら繰り返しを抜ける*/
データ件数がいくつなのかわからないからここだけでは答えようがないが、
data[]の添字を0からデータ数-1まで変化させながら
目的のデータを(おそらくstrcmp()で)探すような処理を書くこと

|if(i< ){ /*削除データがあった*/
削除データが見つからなかったとき、iがどんな値になるかを考える

|for( )
|dt[j-1]=dt[j];/*データを前詰め*/
前詰めするデータの添字は、iを使って表すとどんな範囲の値になるか?
その範囲でjを変化させて処理すること

|「       」 /*データ件数-1*/
データ件数を示す変数がわからないと答えられないし
それが何か知ってるならこれくらいは基礎の基礎、自分で考えろ

|}while(ans=y||Y)/*yかYが入力されるまで繰り返す*/
大間違い
正しい条件は「ansが'y'と等しい、または、ansが'Y'と等しい」

|「    」 /*戻り値を返す*/
何の値を返すことになっているのかわからないから答えられない
問題読み直せ

あと、バッファオーバーフロ対策とか細かいことは言わないけど
{が抜けてたりシンボルが違ってたりする部分はちゃんと直しとけ
273デフォルトの名無しさん:2008/12/02(火) 15:48:03
グローバル変数でデータ数管理してんのかな?
だとすればその変数を1減らせばいいよ
274デフォルトの名無しさん:2008/12/02(火) 15:51:12
本当は
rewind(stdin)
scanf("%c",&ans);
にもつっこみたいがまあいいか
275デフォルトの名無しさん:2008/12/02(火) 16:28:42
>>261
グローバル変数ならextern
a.pp
int a;

b.cpp
extern int a;
276デフォルトの名無しさん:2008/12/02(火) 19:10:39
C言語である番地が0か1か知るにはどうしたら良いですか?
やりたい事は、
符号なし変数nビット内に1が一つだけあると判定して、そこから最下位ビットまでのビット長を得ることで、
2の累乗かどうか、であるならば2の何乗であるかを調べることです。ここまで教えて頂けるとより助かります。
277デフォルトの名無しさん:2008/12/02(火) 19:18:40
val >> pos & 1
278デフォルトの名無しさん:2008/12/02(火) 19:36:23
>>277
わかりました。ありがとうございますー
279デフォルトの名無しさん:2008/12/02(火) 21:11:03
ビットで幅を指定した構造体のメンバに、幅が広い型の値を代入するには
どう書けば良いか教えて下さい。
struct hoge_t
{
unsigned poyo: 3;
} hoge;
int fuga = 4;
hoge.poyo = fuga;
キャストとか特別な処理が必要なんでしょうか?
280デフォルトの名無しさん:2008/12/02(火) 21:15:12
いらない
281279:2008/12/02(火) 21:28:10
>>280
そうなんですか。
そういうゆるさがハードいじるのに向いてるんですかね。
ありがとうございました。
282デフォルトの名無しさん:2008/12/02(火) 21:29:31
>>279
自動的にマスクされるよ
その例なら、hoge.puyo = fuga & 0x7; と同等になる。
283279:2008/12/02(火) 21:47:29
>>282
上位ビットどうなるんだとか心配になってましたが
そういうことなんですね。
ありがとうございました。
284デフォルトの名無しさん:2008/12/02(火) 23:58:05
但し、puyoが最下位に配置されるか最上位に配置されるかは環境依存。
285デフォルトの名無しさん:2008/12/03(水) 00:01:42
お前はいったいなにをいっているんだ
286デフォルトの名無しさん:2008/12/03(水) 00:05:12
しまった、puyoじゃなくてpoyoだった。
287デフォルトの名無しさん:2008/12/03(水) 00:16:59
エンディアン?
288デフォルトの名無しさん:2008/12/03(水) 00:17:16
うそつかない?
289デフォルトの名無しさん:2008/12/03(水) 00:20:23
エンディアンに関係なく、ビットフィールドを上から詰める環境と下から詰める環境がある。
勿論、エンディアンの影響も受ける。
290デフォルトの名無しさん:2008/12/03(水) 00:30:02
i386は最長ビットフィールドが収まる2の倍数バイト単位で反転した気がする。
291デフォルトの名無しさん:2008/12/03(水) 10:57:24
スレ違いかもしれませんが・・・。
C言語でゲームを作成しました。その作品のブロック図を作成したいんですが
ブロック図の書き方、又は作り方等記載してあるサイトあれば教えてください。
292デフォルトの名無しさん:2008/12/03(水) 12:08:41
Doxygenとかじゃだめか
293デフォルトの名無しさん:2008/12/03(水) 13:47:58
>>292
Doxygenが一番ブロック図に近いんでしょうか?
294デフォルトの名無しさん:2008/12/03(水) 16:44:16
>>290
勘違いなのでは?
295デフォルトの名無しさん:2008/12/03(水) 18:42:51
>>289
Cの規格にその条項があるのは知ってるけど
実際のコンパイラで何がどちらかの表みたいなのってないのかね
296279:2008/12/03(水) 18:44:06
>>284-290
ありがとうございます。
注意して使います。
297デフォルトの名無しさん:2008/12/03(水) 22:13:31
>>295
コンパイラ依存じゃないからね。。。
298デフォルトの名無しさん:2008/12/03(水) 22:42:42
迷った時はビットフィールドのテストプログラムを書いて、チェックするのがいいのでは?
299デフォルトの名無しさん:2008/12/03(水) 23:08:53
一万を超える要素の配列を使うと強制終了してしまうんですが
どんな対処法があるのかご教示ください
300デフォルトの名無しさん:2008/12/03(水) 23:12:35
>>299
staticにするか、malloc()でとるか。
301デフォルトの名無しさん:2008/12/03(水) 23:12:35
>>299
環境によるが、普通は
 グローバル変数にする
 スタティック変数にする
 malloc系の関数で動的に確保する
のいずれかでOK。
302デフォルトの名無しさん:2008/12/03(水) 23:20:05
>>300>>301
ありがとうございます。
メモリの確保関連は入門書には載ってないようで
調べてみます。
303デフォルトの名無しさん:2008/12/03(水) 23:47:49
メモリの確保が載ってない入門書ってあんのか。
304デフォルトの名無しさん:2008/12/04(木) 09:08:53
>>299
> グローバル変数にする
> スタティック変数にする
> malloc系の関数で動的に確保する

いずれもその場しのぎで拙い
どの位のサイズからその必要が出るかが処理系に依存しているので可搬性がない

プログラムの論理上 auto であるべきものを、そうでなくするのは汚いコードだ
スタックの指定を省くこと自体がそもそも「汚い」ので、そこから改めるべき
305デフォルトの名無しさん:2008/12/04(木) 09:12:00
処理系に依存せずにスタック容量を指定する方法があればね。
典型的な「机上の空論」と言う奴だな。
306デフォルトの名無しさん:2008/12/04(木) 09:21:15
ほう、では処理系に依存せずに翻訳してみろ
307デフォルトの名無しさん:2008/12/04(木) 09:41:47
>>304
malloc の使い方を知っていればどうということはないだろ
理想論だけでは何もできないぞ
308デフォルトの名無しさん:2008/12/04(木) 09:43:13
>>304
メモリー量の問題は論理的な設計でなく物理的な設計の範疇になるので
「汚い」は仕方がない
309デフォルトの名無しさん:2008/12/04(木) 09:49:46
>>307
理想論であることは認めるのだな?

>>308
配列のサイズや malloc の引数は物理的な設計ではないのか
310デフォルトの名無しさん:2008/12/04(木) 09:50:32
>>304
お前は何を言っているんだ。

そもそも、それだけ大きい配列の要素数が静的に決定される状況が思い浮かばん。
「動的に決定するものだけど、取り敢えず決め打ちで」
てところだろ。
311デフォルトの名無しさん:2008/12/04(木) 09:53:56
スタックサイズを動的に大きくできる子がいると聞いてやってきました
312デフォルトの名無しさん:2008/12/04(木) 09:55:39
つalloca
313デフォルトの名無しさん:2008/12/04(木) 09:56:21
>>309
モロ物理設計だろ
314312:2008/12/04(木) 09:56:26
いや違う。スタックフレームは変更不可だ。
315デフォルトの名無しさん:2008/12/04(木) 09:56:53
>>310
そのレスがなぜ俺宛になっているのかがわからない
おまえは「お門違い」という言葉を知っているか?
316デフォルトの名無しさん:2008/12/04(木) 09:58:21
>>313
配列や malloc を使ったら「汚い」という貴殿の主張には賛成しかねる
317デフォルトの名無しさん:2008/12/04(木) 10:09:02
malloc が気に入らなければ C++ で STL vector でも使えばいい話
318デフォルトの名無しさん:2008/12/04(木) 10:15:08
足し算した時に、それがオーバーフローしたかどうかをビットで簡単に検出する方法無い?
319デフォルトの名無しさん:2008/12/04(木) 10:16:07
>>318
インラインアセンブラ
もしくは加算結果をチェック
320デフォルトの名無しさん:2008/12/04(木) 10:21:23
>>319
そうなんだけど、なんかビットのシフト演算とかで出来ないかなと思って
321デフォルトの名無しさん:2008/12/04(木) 10:36:19
アセンブラでフラグ判定付きのJMP命令を入れる
322デフォルトの名無しさん:2008/12/04(木) 11:39:24
>>320
最上位ビットを見て、繰り上がるか判定
323デフォルトの名無しさん:2008/12/04(木) 11:39:25
>>320
オーバーフロー := 最上位ビットからの溢れ xor その下のビットからの溢れ
324デフォルトの名無しさん:2008/12/04(木) 11:41:29
z = x + y;
if ((x^z) & (y^z) & 最上位ビット) {
// オーバーフローした
}
325デフォルトの名無しさん:2008/12/04(木) 11:51:31
パチンコを作るためにC言語はどの程度できないといけないのですか?
326デフォルトの名無しさん:2008/12/04(木) 11:53:25
>>325
Yの字の枝とゴムがあればおk
327デフォルトの名無しさん:2008/12/04(木) 12:13:38
floatとdoubleのオーバフロー判定はどうするの?
328デフォルトの名無しさん:2008/12/04(木) 12:15:37
オーバーフローしたら無限大になる
329デフォルトの名無しさん:2008/12/04(木) 12:16:26
>>327
浮動小数点数演算の例外を有効にしてtry - catch
330デフォルトの名無しさん:2008/12/04(木) 12:48:05
>>328
無限大にはなんねーだろ
331デフォルトの名無しさん:2008/12/04(木) 13:24:27
あいかわらずageのバカは言うことが支離滅裂だな
332デフォルトの名無しさん:2008/12/04(木) 13:24:49
>>295
個々のコンパイラの説明書を読めば書いてあることもあるが、まとまった表はないな。
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
333デフォルトの名無しさん:2008/12/04(木) 14:36:24
ご教授お願いいたします。
配列a[100]があるとします。
a[0]~a[50]までよみこんだあと、a[1]~a[51]、a[2]~a[52]
と連続で読み込むのは可能でしょうか?
334デフォルトの名無しさん:2008/12/04(木) 15:03:22
>>333
御自由にどうぞ
335デフォルトの名無しさん:2008/12/04(木) 15:08:44
>>333
#include <stdio.h>
int main(void) {
int a[100],i,j,a_sz=sizeof(a)/sizeof(a[0]),step=50;
for(i=0; i<a_sz; i++) a[i]=i;
for(i=step; i<a_sz; i++) {
for(j=i-step; j<=i; j++) printf("%d ",a[j]);
printf("\n");
}
return 0;
}
336デフォルトの名無しさん:2008/12/04(木) 15:12:38
>>333
言ってる意味がわかりません
よみこむとは何を何がどのように読み込むのですか?
具体的に説明してください
337デフォルトの名無しさん:2008/12/04(木) 16:07:41
c言語のfftとmatlabのfftの出力結果が違うのはなぜですか?
338デフォルトの名無しさん:2008/12/04(木) 16:21:42
printfの実体を作成したいのですが、何か参考になるサイトやソースないでしょうか?
339デフォルトの名無しさん:2008/12/04(木) 16:29:15
VCランタイムのソースとか?
(フルサポートではないけど) VZエディタのソースとか?
340デフォルトの名無しさん:2008/12/04(木) 16:34:09
>>337
浮動小数点の丸めなどの処理系の仕様によるものか、アルゴリズムそのものの違いによるものだろう
341デフォルトの名無しさん:2008/12/04(木) 16:34:11
>>331
議論の挙げ句に低劣な罵倒語が頂けるのは名誉であることを
知ってて言っているなら、褒めてくれてありがとよ
342デフォルトの名無しさん:2008/12/04(木) 16:42:25
=== 読み込みデータ ===


(以上他の入力用データ)
1 2 7 10 14 17
(以下他の入力用データ)


=== sample.def ===

上のようになっているデータを読み込んでいく中で、
真ん中に記述されているデータを読み込む際に
fgetsで取り込んだ後に読み込んだ数字を(1)(2)(7)...(17)のように
一つずつint型に変換して別の配列に格納する方法ってありますか?
343デフォルトの名無しさん:2008/12/04(木) 16:56:45
はい、あります。
344デフォルトの名無しさん:2008/12/04(木) 17:13:31
>>342
一行に何項目あるかがはっきりしているならsscanf()を使うのが早い
そうでないならstrtol()を繰り返し呼んで自前で順次値を格納すること
345デフォルトの名無しさん:2008/12/04(木) 17:15:04
>>342
ヒント:正規表現
346342:2008/12/04(木) 17:16:38
>>343
どのようにすればいいか教えていただけませんか?
347デフォルトの名無しさん:2008/12/04(木) 17:24:08
まず、解析する文字列のアドレスを調べます
348デフォルトの名無しさん:2008/12/04(木) 17:27:32
sscanfより自前でやった方がいい気もするな
349デフォルトの名無しさん:2008/12/04(木) 17:33:12
>>346
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
FILE *fin;
char buf[1024];
char *p;
int i, c;
int a[64];
fin = fopen("test.txt", "r");
fgets(buf, 1024, fin);
fclose(fin);
p = buf;
i = 0;
while(*p != 0){
a[i++] = strtol(p, &p, 10);
while(*p == ' ') p++;
}
c = i;
for(i = 0; i < c; i++) printf("%d,", a[i]);
return 0;
}
350デフォルトの名無しさん:2008/12/04(木) 17:39:47
>while(*p == ' ') p++;
いらない
351デフォルトの名無しさん:2008/12/04(木) 17:51:02
>>349
strtol() は、その変換を行う際、数値に先立つ空白文字を読み飛ばす。
よって以下の行は不要である。

while(*p == ' ') p++;

また、この終了条件 while(*p != 0){ では、恐らく常に1回余計に変換と格納が発生する。
取得した文字列の末尾の '\n' を取り除いていないからである。
さらに、もし何か数値として認識できない文字が入力されたとき、
p の値が変化せず、それを検出もできないために、無限ループに陥ってしまう。
strtol() で連続的に文字列を解析する場合は、第一引数に与えるポインタと
第二引数にアドレスを与えるポインタを別のものとして、呼出し後にその値を比較し、
変換が正常に行われたかどうかを確認しなければならない。
352351:2008/12/04(木) 17:59:48
訂正

'\n' を取り除かない場合も、常に無限ループとなる。
353デフォルトの名無しさん:2008/12/04(木) 18:06:08
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
  FILE *fin;
  char buf[1024];
  char *p, *n;
  int i, c;
  int a[64], t;
  fin = fopen("test.txt", "r");
  fgets(buf, 1024, fin);
  fclose(fin);
  p = buf;
  for(i = 0; i < 64; i++){
    t = strtol(p, &n, 10);
    if(p == n) break;
    a[i] = t;
  }
  for(c = 0; c < i; c++) printf("%d,", a[c]);
  return 0;
}

こうかな?
354デフォルトの名無しさん:2008/12/04(木) 18:06:42
おっとミス
  for(i = 0; i < 64; i++){
    t = strtol(p, &n, 10);
    if(p == n) break;
    a[i] = t;
    p = n;
  }
355342:2008/12/04(木) 19:10:59
解決しました
どうもありがとうございました<m(_ _)m>
356デフォルトの名無しさん:2008/12/04(木) 22:32:39
質問です。

どの本を見ても、unsigned型の関数が無かったので疑問を持ちました。
unsigned型の値を返す関数って作れるのでしょうか?

int plusint(int a, int b){
return a + b;
}



357デフォルトの名無しさん:2008/12/04(木) 22:36:55
>>356
全然全く毛ほども問題ないよ。私は結構作っているけどね。
358デフォルトの名無しさん:2008/12/04(木) 22:37:50
>>356
標準関数にsize_t返すやつがあるじゃん。
359デフォルトの名無しさん:2008/12/04(木) 22:38:16
大概size_tだから見かけないのかなぁ
360デフォルトの名無しさん:2008/12/04(木) 22:47:53
引数なら srand があるね。
361デフォルトの名無しさん:2008/12/04(木) 23:05:22
>>356
作れるか作れないかということで言えばもちろん作れる
ただし、関数というものの常として、何らかのエラーが発生したときには
それを呼び出し元に伝えなきゃいけないのだが、
戻り値をsignedにしておけばマイナスの値が使えるということがある
362デフォルトの名無しさん:2008/12/04(木) 23:06:30
unsigned plusint(int a, int b){
return (unsigned)(a + b);
}
簡単に作れたよ
363デフォルトの名無しさん:2008/12/04(木) 23:13:54
>>361
足し算でエラーとか言われても。値域狭めるだけじゃん。
364デフォルトの名無しさん:2008/12/04(木) 23:21:06
引数がintなら結果がマイナスもありうるじゃん
365デフォルトの名無しさん:2008/12/04(木) 23:22:04
つまりprintf見たいな感じっていいたかったんだtoi
366デフォルトの名無しさん:2008/12/04(木) 23:23:00
>>363
別に足し算する関数について言ったわけではないぞ
疑問への答えと、なぜそういう関数がまれなのかの補足をしただけだ
367デフォルトの名無しさん:2008/12/04(木) 23:24:24
>>357-363
ご回答ありがとうございました。
おかげ様ですっきりしました。
368デフォルトの名無しさん:2008/12/04(木) 23:25:06
マイナスでエラー返すのってunixのシステムコールくらいだろ。
369デフォルトの名無しさん:2008/12/04(木) 23:25:55
>>368
fgetc とか
370デフォルトの名無しさん:2008/12/04(木) 23:26:13
Cでintが多いのは別にエラーのためじゃないと思うけど。
引数だってintばっかだし。

>>368
EOF
371デフォルトの名無しさん:2008/12/04(木) 23:26:43
EOFがあったな。
372デフォルトの名無しさん:2008/12/04(木) 23:32:34
あと、うっかりsignedと演算してえらいことになるかもしれないってのもある
373デフォルトの名無しさん:2008/12/04(木) 23:37:39
size_t strlen(const char*);

signed と演算されまくりそうな関数だが。
374デフォルトの名無しさん:2008/12/04(木) 23:41:31
だからなんだよ
375デフォルトの名無しさん:2008/12/04(木) 23:43:54
根拠も無く適当なことをいってるんじゃねえよって意味じゃね?
376デフォルトの名無しさん:2008/12/04(木) 23:44:25
=== data.def ===
0
1 2
0 a 1
0 b 1
1 a 2
1 b 1
2 a 0
=== data.def ===

このように定義されたファイルで1行目をfscanfで読み込み、
2行目をfgetsで読み込んだあとで、
第3行以降をfscanfで1回につき3つの数字を読み込ませたいのですが、
これだと3行目を読み込むfscanfで

=== data.def ===
0
1 2    <= 2行目のの2つの数字と
0 a 1   <= 3行目の左の数字1つ

だけを読み込んでしまう無限ループに陥ってしまいます。
どのようにしたらこの無限ループを回避できるでしょうか?

377デフォルトの名無しさん:2008/12/04(木) 23:46:19
fgets で読み込まれるのは1行目の0の後ろの改行だけ。
378デフォルトの名無しさん:2008/12/04(木) 23:48:49
>>376
%dつかった?
379デフォルトの名無しさん:2008/12/04(木) 23:49:18
>>376
全部fgets()で読み込んで、sscanf()で解釈したら?
scanf()系をほかと混ぜて使うのがダメっていうか、まぜなくても使わないほうがいい。
380376:2008/12/04(木) 23:50:53
fscanfのみ%d使ってます
381デフォルトの名無しさん:2008/12/04(木) 23:53:18
a を読み込めないからそこで無限ループだろうな
aは16進数にしたいの?
382デフォルトの名無しさん:2008/12/04(木) 23:53:40
%x だな
383デフォルトの名無しさん:2008/12/04(木) 23:54:56
fscanf()をfgets()と組み合わせるのは禁じ手。
fgets()したものをsscanf()する方がまし。

それはさて、3行目以降は3つの数字とあるけど真ん中にアルファベットが書かれているのだが。
384376:2008/12/04(木) 23:59:50
3行目以降は有限オートマトンの情報を作るためのデータで
1つ目と3つ目は現在と次の状態、2つ目は入力文字を表します
385デフォルトの名無しさん:2008/12/05(金) 00:01:41
いやそんなことはどうでもいいんだが、

そろそろ具体的なコード出してくれんとじゃないとどうにもならんな
386376:2008/12/05(金) 00:01:52
>>381
a,bなどの2つ目の文字はchar型で読み込ませたいです
387デフォルトの名無しさん:2008/12/05(金) 00:04:35
fscanfが返す値に注意かね。
388デフォルトの名無しさん:2008/12/05(金) 00:05:17
%cでスペース読み込んでaが残っちゃってるとかかなぁ?
389デフォルトの名無しさん:2008/12/05(金) 00:14:50
%c じゃなくて %1s なら大丈夫だろう。
文字列になるので2バイトのバッファを用意する必要があるが・・・。
390デフォルトの名無しさん:2008/12/05(金) 00:17:58
ん? %d %c %d でうまくいくんじゃないの?
391デフォルトの名無しさん:2008/12/05(金) 00:18:59
%d %c%dでいいんじゃね。
392376:2008/12/05(金) 00:18:59
>>385
かなり長いので
問題の部分は区切っておきました

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8214.txt

393デフォルトの名無しさん:2008/12/05(金) 03:23:06
====================== ここから ===========================
    if( fscanf(fp,"%d %d", lastState, lastState+1) != 2 ){
        printf("不正なデータです.強制終了します.\n");
        return -1;
    }
====================== ここまで ===========================
    makeDFAlist(first, curState);

    while( (n = fscanf(fp,"%d %c %d", &next, &trans, &now)) != EOF ){
        if( n == 3 && isalnum(trans) ){
            mTrans = trans;
        }else{
            printf("不正なデータです.強制終了します.\n");
            return -1;
        }
394デフォルトの名無しさん:2008/12/05(金) 03:27:51
っとまてよ

    while( fscanf(fp,"%d %c %d", &next, &trans, &now) == 3 ){
        if( isalnum(trans) ){

でいいのか
395デフォルトの名無しさん:2008/12/05(金) 05:12:52
構造体配列のリストで、ある要素が持つノードの配列番号を知るにはどうしたらいいですか?
struct foo{
struct foo *bar[5];
};

struct foo *create(){
int i;
struct foo *n;
n = (struct foo *)malloc(sizeof(struct foo));
for(i=0;i<5;i++)n->bar[i] = NULL;
return n;
}

int main(void){
struct foo *foobar[10];
int i;
for(i=0;i<10;i++)foobar[i] = create();
foobar[0]->bar[0] = foobar[1];
/*ここでfoobar[0]からbar[0]を辿り、その要素がboobar[1]、ここで'1'を取得したいです*/
396デフォルトの名無しさん:2008/12/05(金) 05:36:21
本やで立ち読みしてて見かけたんですが

printf("%d %d %d\n",a,b,c); って書くのと

char p[]="%d %d %d\n";
printf(p,a,b,c); って書くのがあったんですが

2つ目はなんで "p" って書かなくていいんですか? あとどっちを使うのがいいんでしょう
397デフォルトの名無しさん:2008/12/05(金) 06:10:08
"p" と書くと {'p', '\0'}
p と書くと {'%', 'd', ' ', '%', 'd', ' ', '%', 'd', '\n', '\0'}

printf("%d %d %d\n", a, b, c); って書き方のほうが多く見かける
398デフォルトの名無しさん:2008/12/05(金) 06:17:53
ありがとうございます
399デフォルトの名無しさん:2008/12/05(金) 08:53:56
よく見かけるのですが

#define  hoge  (1)

のように、単独の定数をカッコでくくっているのは何の意味があるのでしょうか?

#define   x  ((x) * (x))

とかなら意味はわかるのですが、単独の定数くくる意味ってあります?
400デフォルトの名無しさん:2008/12/05(金) 09:09:30
あ、例を間違えた

#define   nijyo(x)  ((x) * (x))

これならわかります。
401デフォルトの名無しさん:2008/12/05(金) 10:01:17
>>399
勢い。
402デフォルトの名無しさん:2008/12/05(金) 10:03:00
値を修正するときに 元の値が残せるところ

#defaine hoge (1)

#defaine hoge (1+20)
とか
403デフォルトの名無しさん:2008/12/05(金) 10:35:16
教えてください

グローバル変数をint型で宣言して
0x04で初期化しようとしたら
矛盾するというようなエラーが出るのですが、
これは何のエラーなんでしょうか。
404デフォルトの名無しさん:2008/12/05(金) 10:47:32
ような、じゃなくてちゃんと書けバカ
405デフォルトの名無しさん:2008/12/05(金) 11:01:11
>>400
((x) * (x))
おっぱい大好きでちゅか?
406デフォルトの名無しさん:2008/12/05(金) 11:05:32
>>403
conflicting types for '変数名'

というエラーが出ます。
天才さん
407399:2008/12/05(金) 11:12:25
レスどうもです。
あんまり意味ないってことですね。

ちなみにおっぱいは好きです。
408376:2008/12/05(金) 11:54:59
付け加えますが、最終状態に関してはいくつあるかが決まっていないため
2行目がいくつあっても実行できるプログラムでないといけません
409デフォルトの名無しさん:2008/12/05(金) 11:59:29
>>406
初期化関係ないんじゃ?
同じ名前で別の定義してるのでは。
410デフォルトの名無しさん:2008/12/05(金) 12:51:23
unicode文字表示するにはどうしたらいいですか?
411デフォルトの名無しさん:2008/12/05(金) 13:02:38
環境によって異なります
412デフォルトの名無しさん:2008/12/05(金) 13:23:23
>>411
ありがとうございました。
すいませんもう一つ質問したいのですが、c言語で画像を表示することは出来ますか?
また、できるとしたらどのようにしたらよいですか?
413406:2008/12/05(金) 13:30:51
>>409
ありがとうございます。

エラー時は

int [変数名];
[変数名]=0x04;

のように書いていたところを

int [変数名] = 0x04;

にしたらエラーが消えたのですが、
これは何が違うのでしょうか。
414デフォルトの名無しさん:2008/12/05(金) 13:40:35
>>412
大抵の環境では出来ますが、方法はその環境によって異なります
415デフォルトの名無しさん:2008/12/05(金) 13:40:55
>>413
問題あるはずないと思って試したらやっぱり問題なかった。
それがソースからのコピペで変数名だけ書き換えたものだとしたら上はセミコロンが全角になってる。
そこを修正して問題が出るようならコンパイラ名を出してほしい。
416デフォルトの名無しさん:2008/12/05(金) 13:42:17
>>395
リストの先頭から何かの変数を使ってポインタを辿る回数を数えろ
もしリスト自体のノード順序が固定なら構造体のメンバに
要素数を示す変数を加えて管理することもできるが、それぐらいなら
(メモリが許すなら)配列で確保したほうが面倒がないね

>>396
いいも悪いも配列名はそのままで配列名であって
""で囲ったら配列名ではないただの文字列定数になってしまう


>>399
そのマクロがソース中で展開されるときに
絶対に数値にしかならないことを保障したい場合に使う
具体的に言うと文字列化演算子#とトークン連結演算子##を作用させないため

>>403
ソース貼れ

>>408
そういうことは先に言え
だったらfgetsを呼ぶ前に\nを読み飛ばすか、
さもなきゃfgetsを1回余分に呼ぶか、
あるいは全部fgetsしてsscanfするしかない

>>412
環境依存
417デフォルトの名無しさん:2008/12/05(金) 13:45:24
>>413
Cでは関数の外に実行文 (x = 4; のような) を書くことはできません
418デフォルトの名無しさん:2008/12/05(金) 13:46:32
>>408
考えてみると2項行がいくつあるかわかんないってことは
いつfscanfに切り替えたらいいかもわかんないんじゃないか
もう全部fgets→sscanfしろ
419デフォルトの名無しさん:2008/12/05(金) 13:56:41
>[変数名]=0x04;

これは初期化ではない。
420406,413:2008/12/05(金) 13:57:16
>>415
>>417
ありがとうございます。
実行文を関数内にも書いてみたらそちらの方は
エラーが出ませんでした。

説明不足申し訳ないです。

ありがとうございました。
421デフォルトの名無しさん:2008/12/05(金) 13:57:46
もうパーサ書いた方が早いんじゃ
422デフォルトの名無しさん:2008/12/05(金) 14:06:49
>>408

if(!fgets(buf,BUF_SIZE,fp) || sscanf(buf,"%d",&n0)!=1){
 return -1;
}
while(fgets(buf,BUF_SIZE,fp)){
 r=sscanf(buf,"%d %d",&n0,&n1);
 if(r==1) break;
 if(r!=2) return -1;
}
do{
 if(sscanf(buf,"%d %c %d",&n0,&c,&n1)!=3) break;
}while(fgets(buf,BUF_SIZE,fp));
423デフォルトの名無しさん:2008/12/05(金) 14:14:05
とにかく常にfgetsで改行含めて読み込んで
それから項目毎にバラすのが定石だよなあ。
424デフォルトの名無しさん:2008/12/05(金) 18:23:47
mallocでNULLが返ったら、あなたならどう対処しますか?
私はexit
425デフォルトの名無しさん:2008/12/05(金) 18:28:24
>>424
エラー表示して終了
426デフォルトの名無しさん:2008/12/05(金) 18:33:06
>>424
そんなもんそのプログラムの内容によるとしか言えんだろ
427デフォルトの名無しさん:2008/12/05(金) 18:33:09
男ならチェックしない
428デフォルトの名無しさん:2008/12/05(金) 18:35:24
常にexitはないわー
429デフォルトの名無しさん:2008/12/05(金) 18:36:54
アンケートがやりたいならマ板でやれ
430デフォルトの名無しさん:2008/12/05(金) 18:38:25
>>424
 場合による。
もう一度確保を試みたり、例外処理として代行処理関数呼んだり、例外処理として関数内gotoしたり、ポインタを返す関数ならNULLを返したり、整数を返す関数ならエラーとして整数定数を返したり、続行不可能と判断してエラーを吐いてexit()を呼んだりする。
431デフォルトの名無しさん:2008/12/05(金) 18:52:19
>>424
頑張って対処します。
432デフォルトの名無しさん:2008/12/05(金) 21:15:22
static変数ってユーザー定義関数の中で定義しても
プログラムが終わるまで生き続けるんですか?
433デフォルトの名無しさん:2008/12/05(金) 21:16:30
>>432
モチロンデス
434デフォルトの名無しさん:2008/12/05(金) 21:18:55
>>433
どうも
435デフォルトの名無しさん:2008/12/05(金) 21:19:52
>>431
なんかできることあるの?
436デフォルトの名無しさん:2008/12/05(金) 21:22:16
ぬるぽとか?
437デフォルトの名無しさん:2008/12/05(金) 21:29:33
linuxとかだと、リターン値を調べるだけムダって話もあるな > malloc()
438デフォルトの名無しさん:2008/12/05(金) 21:30:30
>>437
kwsk
439デフォルトの名無しさん:2008/12/05(金) 21:40:15
fclose(stdin)って合法?

なんでこんなこと聞くかというと
FILE *fpとfopen fcloseを使ってファイル出力をするプログラムを作っていたとき
作成時の便宜のためfopen の後ろにfp = stdinとしていたときそう思ったんです
440デフォルトの名無しさん:2008/12/05(金) 21:41:12
stdoutでした
441デフォルトの名無しさん:2008/12/05(金) 21:48:03
>>438
malloc()はNULLを返さないらしい。
メモリ確保に失敗したって分かるのは、メモリにアクセスするとき。
442395:2008/12/05(金) 21:50:09
>>416
レス遅くなりましたが、ありがとうございます
sizeofで出来そうな気がしてきたので試みてみます
443デフォルトの名無しさん:2008/12/05(金) 22:37:32
>>441
kernelに怒られて、強制終了した。
444デフォルトの名無しさん:2008/12/05(金) 22:47:43
>>441
設定で、その場で確保してみてエラーを返すようにもできるけどね。
445デフォルトの名無しさん:2008/12/05(金) 22:54:17
>>428
NULLぽが返ったらどうせ何も出来ないのだからとっとと終了
446デフォルトの名無しさん:2008/12/05(金) 22:56:30
447デフォルトの名無しさん:2008/12/05(金) 22:58:23
>>445
メモリ確保できるかどうかで使用するアルゴリズムを変えてるぜ
448デフォルトの名無しさん:2008/12/05(金) 23:03:53
>>441
それは信じられないなあ。
セグメントバイオレーションを起こすアドレスを返せば、書き込んだときに強制終了して
わかるけど。そうでないアドレスを返したら、あちこちをぶっ壊すってこと?
449デフォルトの名無しさん:2008/12/05(金) 23:08:21
>>448
Linuxの勉強してきてくれ。
簡単に言えば、malloc()は仮想メモリ空間のアドレスを返すだけ。
要は、メモリ使用の予約をしているだけだと思えばいい。
で、実際に使おうとしたときに実メモリが足りなければスワップしてメモリを空けるのだけれど、
(GUIが走っていたりして)メモリの奪い合いが頻発し始めると強制終了の憂き目に遭う訳だ。
450デフォルトの名無しさん:2008/12/05(金) 23:08:34
>>448
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
このページにはバグって書いてあるけど、どっかで読んだ別の文章では、
現代的なOSはそういうもんだから、もうmalloc()のリターン値をチェックする
習慣はいらないんじゃね? みたいなことが書かれてた。
451デフォルトの名無しさん:2008/12/05(金) 23:16:10
CFAQ 7.14

質問: オペレーティングシステムによっては malloc したメモリを実際に確保するのを
プログラムがそのメモリを使おうとするまで先延ばしすると聞いたことがある。
これは文法上許されるのか。

回答: これは難しい。規格は、システムはこういう風に振る舞ってもよいと書いていないけれど、
こういう風に振る舞ってはいけないとはっきり書いてあるわけでもない。
こういう“先延ばしの失敗”の実装は規格が暗黙に要求しているところに
従っていないように思える。 …… こうした遅延割り付けをするシステムは通常、
特別のシグナルを使ってメモリの量が危険なほど少なくなっていることを知らせる仕組みを持つ。
しかし移植性の高いことを目指したプログラムやタコなプログラムはそういうシグナルを捕まえない。
遅延割り付けをするシステムの中にはプロセス単位かユーザ単位で遅延割り付けをやめる仕組み
(昔からの malloc の意味付けに戻る仕組み)を用意しているものもある。
しかし詳細はシステムによって異なる。

452デフォルトの名無しさん:2008/12/05(金) 23:25:19
malloc呼んだらすぐにチョイと何かテスト書き込みしてみる
という手を思いついたけどうまく行くかどうかは知らない
453デフォルトの名無しさん:2008/12/05(金) 23:41:22
余り意味はないな。それが有効な状況では既に破綻は目の前だ。
454デフォルトの名無しさん:2008/12/06(土) 00:06:23
メモリー不足は個々のプログラムの問題でなくて、運用管理の問題
運用テストではそういった類のテストをする
455デフォルトの名無しさん:2008/12/06(土) 03:54:14
すみませんmalloc絡みでちょいと質問です。
int main(void){
int *a[5];
int i;
for(i=0;i<5;i++){
a[i]=(int *)malloc(sizeof(int));
printf("a[%d]=%d\n",i,a[i]);
}
a[3]=a[4];
free(a[4]);
a[4]=(int *)malloc(sizeof(int));
printf("\na[3]=%d\n",a[4]);
printf("a[4]=%d\n",a[4]);
return 0;
}
<実行結果(bcc5.5.1)>
a[0]=9447640
a[1]=9447656
a[2]=9447672
a[3]=9447688
a[4]=9447704

a[3]=9447704
a[4]=9447704
a[3]が不要になったのでa[4]のアドレスをa[3]にコピーして空きができないように詰め、
新しいaが必要になったのでa[4]に再度領域を確保しようという意図です
すると何故かa[4]のアドレスがa[3]と同じになるのですが、
どこがおかしいのでしょうか?本来ならば新しいアドレスが割り振られるはずですよね?
456455:2008/12/06(土) 03:58:55
すみません11行目ミスです
printf("\na[3]=%d\n",a[4]);→printf("\na[3]=%d\n",a[3]);
これでも私の環境では実行結果は同じになります
457455:2008/12/06(土) 04:04:57
free(a[4])でなくa[4]=NULLを使ったらできました・・・
この辺りよく理解できていないので、
free()は何をしていてこんな結果が得られるのか、
どなたかご教授願えたらと思います・・・
458デフォルトの名無しさん:2008/12/06(土) 04:07:32
a[3]=a[4];
ここで、a[3]にa[4]をコピーした。

free(a[4]);
そして、a[4]の指している領域を開放した。

a[4]=(int *)malloc(sizeof(int));
それから、新しい領域を確保して、a[4]にそのアドレスを得た。
このとき、a[3]に入っているアドレス(既に一度開放した領域のアドレス)に再度領域が割り付けられた。
だからa[3]とa[4]は同じアドレスになった。何もおかしいことはない。
おかしいのは、君がa[4]を開放していることである。
a[3]が不要になったのならa[3]を開放しなければならない。
459デフォルトの名無しさん:2008/12/06(土) 04:17:26
>>455
お前がやったのはこういうこと

a[3] → int3
a[4] → int4

  ↓

a[3] ┐   int3
a[4] ┴→ int4  (a[3]=a[4];)

  ↓

a[3] ┐   int3
a[4] ┴→     (free(a[4]);)

  ↓

a[3] ┐   int3
a[4] ┴→ int5  (a[4]=(int *)malloc(sizeof(int));)

int3は迷子になってしまったね
460デフォルトの名無しさん:2008/12/06(土) 04:23:31
正しくはこうやる

a[3] → int3
a[4] → int4

  ↓

a[3] →     (free(a[3]);)
a[4] → int4

  ↓

a[3] ┐
a[4] ┴→ int4  (a[3]=a[4];)

  ↓

a[3] ─┐
a[4] ┐└→ int4
     └─→ int5  (a[4]=(int *)malloc(sizeof(int));)
461デフォルトの名無しさん:2008/12/06(土) 04:46:15
>>458-460
とても分かりやすい解説ありがとうございます
よく理解できましたー
462デフォルトの名無しさん:2008/12/06(土) 09:59:53
ポインタの書き方で質問があります。

入門本では、

int *pA;

のように宣言すればおk と書いてあるのですが、
そこら辺に転がっているCのソースを見ると

float*
char**

のようになっているポインタがあるのですが、
いったい何がどう違うのでしょうか?
463デフォルトの名無しさん:2008/12/06(土) 10:18:36
int *p はint型を指すポインタ
float *p はfloat型を指すポインタ
char **p はchar*型(つまりchar型のポインタ)を指すポインタ

一口にポインタといっても、指す先の型によってポインタの型も変わってくる
464デフォルトの名無しさん:2008/12/06(土) 12:41:18
(CDから)ターボデバッガをインストールした後
BCC Developerをインストールしたが
BCC Developerの<デバッグ>ボタンを押しても、ターボデバッガが起動しない。

ターボデバッガのインストール後のパスの設定はどうするのでしょうか。
本には「Bcc Developerの環境設定を参照」とあるが、さっぱり分かりません。
465デフォルトの名無しさん:2008/12/06(土) 13:03:30
スレ違いなので該当スレにどうぞ
466デフォルトの名無しさん:2008/12/06(土) 13:34:58
rubyスクリプトをCソースに変換するソフトはありますか?
467デフォルトの名無しさん:2008/12/06(土) 16:47:13
ポインタってなんすか?
468デフォルトの名無しさん:2008/12/06(土) 17:00:19
アドレスを入れる変数
詳しくはググるか書籍で
469デフォルトの名無しさん:2008/12/06(土) 18:05:15
アドレスいれてなににつかうんすか?
470デフォルトの名無しさん:2008/12/06(土) 18:12:42
そのアドレスにある情報を読んだり書いたり。

釣られてる?
471デフォルトの名無しさん:2008/12/06(土) 18:16:17
>>469
メール送ったりできる
472デフォルトの名無しさん:2008/12/06(土) 18:29:13
配列や構造体を関数に渡すときに値を全てコピーするのは大変な手間になる
だからアドレスを渡してやる事で処理を速くする
473デフォルトの名無しさん:2008/12/06(土) 19:23:14
釣りに使う
474デフォルトの名無しさん:2008/12/06(土) 19:24:26
必要性を感じるまでは無理に使わなくてよい
475デフォルトの名無しさん:2008/12/06(土) 20:29:37
Cのレイヤーでの回答とASMのレイヤーでの回答には違いがありますから、ね?
476デフォルトの名無しさん:2008/12/06(土) 21:30:50
for(a;b;c)

のaの部分(初期なんとか部)に、何も書かずにforループさせることはできますか?
477デフォルトの名無しさん:2008/12/06(土) 21:30:57
>>472
そこをポインタがないとか言われてるJavaとかC#ではどうやってるの?
478デフォルトの名無しさん:2008/12/06(土) 21:33:27
>>477
参照型は、まあ、ポインタだよね。
479デフォルトの名無しさん:2008/12/06(土) 21:38:01
>>476
できる
480デフォルトの名無しさん:2008/12/06(土) 21:39:37
>>478
参照型はポインタだ だから、JavaやC#はポインタしかない言語だ

というのを何かの本で読んだ事あるんだけど、Cのポインタとはまたキャラが違うと思うんだ。
俺はJavaから入って、Cに挫折したけど、Javaで飯を食って行ってるヘタレPGだから、
Cを自由自在に操れる人は本気で凄いと思う。
malloc関数とかfree関数のつっこんだ操作がイミフで仕事先の先輩PGもあんなもん覚えなくていいよー と言うんだが…
これでいいんだろうか…
481デフォルトの名無しさん:2008/12/06(土) 21:43:04
for( ; ; ) にすることすらできる
482デフォルトの名無しさん:2008/12/06(土) 21:43:44
Cを使うコツは「なんとなく」わかった気になるというのを排除して
徹底的に理詰めで理解しようとすることだ
483デフォルトの名無しさん:2008/12/06(土) 21:45:32
484デフォルトの名無しさん:2008/12/06(土) 21:46:30
malloc()やfree()は難しい要素はないと思うが…
485デフォルトの名無しさん:2008/12/06(土) 21:51:44
>>484
多次元配列の確保とかでわけわかんなくなる人もいるんだよ
486デフォルトの名無しさん:2008/12/06(土) 21:52:38
メモリの確保?あーめんどくせー 勝手にやってくれよ

ATに慣れるとMTに乗れなくなる現象ですね
487デフォルトの名無しさん:2008/12/06(土) 21:54:26
アセンブラで「CPUの動き」に触れてみるといいんじゃない?
と思うけど保証はしない。
488デフォルトの名無しさん:2008/12/06(土) 21:54:59
>>485
それは、基本ができてないからだろ
489デフォルトの名無しさん:2008/12/06(土) 21:56:21
アセンブラを学ぶことはより深くCを理解できる可能性がある反面
誤った思い込みをしてしまう可能性もあるので一長一短
490デフォルトの名無しさん:2008/12/06(土) 22:17:57
>>488
基本の定義を教えてくれ
491デフォルトの名無しさん:2008/12/06(土) 22:39:05
>>490
・ポインタ型は、あるオブジェクトへの参照を表す値を持つオブジェクトである。

そのポインタが何を指してるのかを把握出来ることが、
ポインタを使う上での基本じゃないかね。
492デフォルトの名無しさん:2008/12/06(土) 22:40:59
定義は?
493デフォルトの名無しさん: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´ '"´ /::::/-‐  \    超スピードだとか催眠術だとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ    そんなチャチなもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ  もっと恐ろしいものの片鱗を味わったぜ…
494デフォルトの名無しさん:2008/12/06(土) 22:54:46
>>493
本当にポインタについて当たり前のことを理解しているというのなら
頭を使えよ
495デフォルトの名無しさん:2008/12/06(土) 22:59:18
まあ、たしかに多次元配列をmalloc()で確保することってあんまりないから、
10*10*10の三次元の配列を確保するとして、

p = malloc(sizeof(int) * 10 * 10 * 10);

とかで、pの型ってどうなるんだっけ、ってちょっと考えちゃうな。

まあ、でも、そんなCの記法の問題だから調べれば分かる問題だし、
ポインタの難しさとはちょっと違うよな。
496デフォルトの名無しさん:2008/12/06(土) 23:14:06
確かにそういうコードだとJavaやC#にはないCのポインタの特徴が出てくるね。
497デフォルトの名無しさん:2008/12/06(土) 23:24:05
Cやりだして最初に罹るのはmalloc()作りたい病
俺にも経験がある で自動ガベコレとか始めるんだわ
498デフォルトの名無しさん:2008/12/06(土) 23:27:23
C#にはない?
499デフォルトの名無しさん:2008/12/06(土) 23:28:06
やっぱり配列でしょ
500デフォルトの名無しさん:2008/12/06(土) 23:40:01
Cは型情報をいじりやすくしてほしい
501デフォルトの名無しさん:2008/12/06(土) 23:42:30
まず、Cには本当の意味での多次元配列などないことを理解すべき
配列の配列や、配列の配列の配列があるだけ
502デフォルトの名無しさん:2008/12/06(土) 23:58:20
>>501
Cではコンパイラは高度なことは何もしてくれないしルールも少ない。
用意されているのは素材程度。
多次元配列もプログラマがそう見立ててデータ構造を解釈するしかない。
503デフォルトの名無しさん:2008/12/07(日) 00:03:38
C言語ソースを解釈できるインタプリタって存在しますか?
504デフォルトの名無しさん:2008/12/07(日) 00:05:47
505デフォルトの名無しさん:2008/12/07(日) 00:16:10
フリーのはないんでしょうか?
506デフォルトの名無しさん:2008/12/07(日) 00:27:31
C言語のインタプリタ環境のメリットって何だろう?
普通にデバッグ実行と大差無いような・・・

>>504のリンク先では
「コンパイルやリンクといった煩わしい処理を必要としない」
ってあるけど、そもそもプログラムを書くことは煩わしくないのか?w
507デフォルトの名無しさん:2008/12/07(日) 00:36:08
>>506
「プログラムを書くことに専念できる」とも書いてあったよ。
508デフォルトの名無しさん:2008/12/07(日) 00:40:34
毎回コンパイルがしんどかった大昔の遺物じゃね?
509デフォルトの名無しさん:2008/12/07(日) 00:53:52
そんな大昔にこのインタプリタがまともに動くのだろうか・・・
510デフォルトの名無しさん:2008/12/07(日) 01:54:43
みんな、どんなPC環境でプログラム作ってるの?
511デフォルトの名無しさん:2008/12/07(日) 01:56:16
ひとそれぞれです
512デフォルトの名無しさん:2008/12/07(日) 02:14:15
>>510
会社から支給されたDELLのInspiron 700mってやつ
513デフォルトの名無しさん:2008/12/07(日) 02:37:11
俺はレッツノートのCF-R3DってやつとMacBookだな。
シミュレーションやる時はちょっといいVGA入ったコンピュータ使ってるけど詳細わかんね。
514デフォルトの名無しさん:2008/12/07(日) 02:55:51
CINTも有名だと思う。
スレが立っているほどだし。まあ過疎っているけど。
http://pc11.2ch.net/test/read.cgi/tech/1114397934/l50
515デフォルトの名無しさん:2008/12/07(日) 03:25:12
プログラマに対するアンケートはマ板でやってください
516デフォルトの名無しさん:2008/12/07(日) 12:21:18
517デフォルトの名無しさん:2008/12/07(日) 12:39:51
独学でやってますが専門学校二年分の授業には
どの程度のことができるようになれば追いついたことに
なりますか?
518デフォルトの名無しさん:2008/12/07(日) 12:47:39
マ板に行け
519517:2008/12/07(日) 13:49:23
>>518
回答どうもです
行ってきます
520デフォルトの名無しさん:2008/12/07(日) 14:31:22
専門の2年分なんか社会に出てしまえば誤差みたいなもん
521デフォルトの名無しさん:2008/12/07(日) 14:35:17
独学でどんどんやってしまう人が一番役に立つ。
522デフォルトの名無しさん:2008/12/07(日) 22:14:34
>>466
例外機構はCでまともに記述不可能なので
原理的に無理。
523デフォルトの名無しさん:2008/12/07(日) 22:25:36
例外機構はCでまともに記述不可能なので
例外機構はCでまともに記述不可能なので
例外機構はCでまともに記述不可能なので
524デフォルトの名無しさん:2008/12/07(日) 22:44:25
>>517 一ヶ月
525デフォルトの名無しさん:2008/12/07(日) 22:46:37
こうやって無知をさらす人がなぜ後を絶たないのかね >>523
526デフォルトの名無しさん:2008/12/07(日) 22:48:50
例外以外でも、rubyをCにコンバートって無理そう。
527デフォルトの名無しさん:2008/12/07(日) 22:49:43
_asm 使っていいならできるだろうけどねぇ
528デフォルトの名無しさん:2008/12/07(日) 23:09:59
setjump/longjmpでどこまでやれるかだね。
529デフォルトの名無しさん:2008/12/08(月) 00:13:38
下記のコードでchar×5のメモリは正しくfreeされますか?
また、開放されたことを確認する方法はありますか?
char *p1;
int *p2;
p1 = (char*)malloc(5);
p2 = (int*)p1;
free(p2);
530デフォルトの名無しさん:2008/12/08(月) 00:19:20
>>529
問題ない
つまりはアドレスさえちゃんとmallocで帰ってきたやつならキャストしようが、代入しようがおk

以下三行は読み飛ばして結構
一応理由としては(一応環境な内部っぽい話だけど)
mallocによって確保した場合は確保した領域のすぐ手前にどれだけの量確保したかの情報が書き込まれてる
freeにアドレスを渡された場合、そのアドレスの手前を見てどれだけ解放するべきかチェックして解放を行う


531デフォルトの名無しさん:2008/12/08(月) 00:41:23
>>529
開放されることになっている
確認する必要はないし、できない
532デフォルトの名無しさん:2008/12/08(月) 01:56:40
質問です。
ファイルから1行ずつ文字列を読み込んで
変数に格納して比較したい場合どのように
したらよろしいでしょうか?

例えば"FILE.txt"の中身が
AAA,BBB,CCCCC
DDD,EEE,FFFFFF
GGG,HHH,GGGGG
・・・・
・・・・・
といったようになっていて


1行目のAAA,BBB,CCCCCを
AAAまで読み込んで変数1に格納して
2行目のDDDを変数2に格納して
変数1と変数2を比較する場合どのように
記述すればいいでしょうか?

よろしくお願いします。

533デフォルトの名無しさん:2008/12/08(月) 02:19:51
何が分からないのか分からないが
ファイルを開くのはfopen
ファイルからの読み込みはfgets, fgetc, fread, fscanf
文字列の比較はstrcmp
を、使えばいい

ソースを丸ごと書いてほしいなら宿題スレへ
534デフォルトの名無しさん:2008/12/08(月) 02:33:19
>>532
,まで読み込みはscanf系使えばできるよ
535デフォルトの名無しさん:2008/12/08(月) 03:08:09
>>532
一般的には二つの方法がある。

一つはファイルから直接fscanfで読み込んでいく方法。
コード全体が簡素で済むのが利点だが、変なデータを投げ込まれたら
ひどい間違いが起きる可能性も高い。
ちなみにscanf系関数で項目を「読み飛ばす」には、ダミーの変数のアドレスを与えるか、
該当項目を%*dなどとする。詳しくはscanf書式指定文字列の解説を読むこと。

もう一つはfgetsで1行読み込んだ文字列をsscanf(この場合は先頭の項目なので、
strtolやstrtod、あるいはatoiやatofでもいいかもしれない)で解析して値を取り出す方法。
こちらのほうが一行ずつ確定的に処理を進められるため、間違いが置きにくいしエラーを捕まえやすい。

536デフォルトの名無しさん:2008/12/08(月) 04:50:47
宿題ですがよければ解説お願いします。
2000年から2年ごとに開催されているオリンピックで、
西暦を入力するとその年に開催されるかどうかを表示するソースなんですが

#include <stdio.h>

int olyn(int);

int main(void)
{
int year;
scanf("%d",&year);
if (orin == 0){
printf("開催\n");
}
else{
printf("非開催\n");
}
return 0;
}


int olyn(int year)
{
return year % 2;
}

ではなにを入力しても"非開催"になってしまいます。
なにがいけないのでしょうか。

回答例は渡されていて、そちらの方が優れているのもわかるのですが
それを見ずに書いた自分のソースが動かないのがなんか悔しいです。
537536:2008/12/08(月) 05:01:16
間違えて修正前のを貼ってしまいました。

if (orin == 0){

のorinはちゃんとolynに直してます。
申し訳ありません。
538デフォルトの名無しさん:2008/12/08(月) 05:15:57
スレ違い
539デフォルトの名無しさん:2008/12/08(月) 05:16:07
>>536
関数を正しく呼び出していないからである。

if (olyn == 0){

上の行は、決して君が期待した動作をしてくれない。
配列の名前と同様に、関数の名前はすぐに関数へのポインタに成り下がる。
そして実在する関数へのポインタは当然ヌルポインタではないので、
これを 0 と比較した結果は常に偽となる。よって if 節の処理は行われない。

正しいコードは以下のようになる。

if (olyn(year) == 0){
540536:2008/12/08(月) 05:19:14
あーすいませんわかりました。
olynの戻り値に対応させる項目が main になかったんですね。
違ったら罵倒してください。

あとolymですねすごい恥ずかしい。
541539:2008/12/08(月) 05:21:24
>>538
丸投げしたわけじゃないからこちらかと思ったのですが……
別の方がよかったですかね。気をつけます。

>>539
ありがとうございました。
お手数かけて申し訳ありません。
542デフォルトの名無しさん:2008/12/08(月) 05:23:05
>olynの戻り値に対応させる項目が main になかったんですね。
違う
無いのは引数
543539:2008/12/08(月) 05:24:54
>>542
ありがとうございます。
なるほどです。
544デフォルトの名無しさん:2008/12/08(月) 09:26:19
スレ違いかも知れませんがC言語の基礎から覚えたいと思います
お勧めのサイトもしくは書籍を教えてください
545デフォルトの名無しさん:2008/12/08(月) 10:15:17
>>544
消えろカス
546デフォルトの名無しさん:2008/12/08(月) 10:21:09
入門者に冷たいスレですねw
C言語なんか古くてダサいしJAVAスレいってきます。
547デフォルトの名無しさん:2008/12/08(月) 10:46:12
>>544-546
( ・∀・ )
548デフォルトの名無しさん:2008/12/08(月) 10:57:35
#include<stdio.h>
int seikai;//正解率
char line[10];
int main(){
printf("正解率を入力してください 0〜100%%:");
fgets(line,sizeof(line),stdin);
sscanf(line,"%d",&seikai);
if(0<=seikai<=60){
printf("成績は""F""です\n");
}
if(61<=seikai<=70){
printf("成績は""D""です\n");
}
if(71<=seikai<=80){
printf("成績は""C""です\n");
}
if(81<=seikai<=90){
printf("成績は""B""です\n");
}
if(91<=seikai<=100){
printf("成績は""A""です\n");
}

return(0);
}
549デフォルトの名無しさん:2008/12/08(月) 10:59:15
>>548でビルドすると、

正解率を入力してください 0〜100%:50
成績はFです
成績はDです
成績はCです
成績はBです
成績はAです
続行するには何かキーを押してください . . .

という結果になってしまいます。
どこがおかしいのか、全然わかりません。。
550:2008/12/08(月) 11:06:09
教えて欲しいです。VC.exe起動、mslog.exe起動、プログラム実行、自作printf、mslog.exeにて出力。という流れを作りたいですが、mslog.exe起動、mslog.exeにて出力という箇所をどう作成すればよいかわかりません。よろしくお願いします。
551デフォルトの名無しさん:2008/12/08(月) 11:06:22
>if(0<=seikai<=60)
こういう書き方を
if(0 <= seikai && seikai <= 60)
こうする
552デフォルトの名無しさん:2008/12/08(月) 11:12:12
>>551
素早いレスありがとうございます。
無事できました。
>if(0<=seikai<=60)
この書き方は、具体的にどこがまずいんですか?
文法的に間違っている?
553デフォルトの名無しさん:2008/12/08(月) 11:13:48
>>550
spawn関数を使え。
554デフォルトの名無しさん:2008/12/08(月) 11:15:35
>>552
文法的には間違っていないが、論理的に間違っている。
C言語の意味的には(0<=seikai)<=60と同じだから、0<=60か1<=60として評価される。
555デフォルトの名無しさん:2008/12/08(月) 11:21:02
>>554
なるほど。
わかりやすい!
解説まで、わざわざ有難うございます。
556デフォルトの名無しさん:2008/12/08(月) 12:52:48
#include <stdio.h>


int main(void)
{
int n;
int w;
int v[100];
int i = 1;
int j = 1;

scanf("%d %d", &n, &w);
for(i=0; i<n; i++) scanf("%d ", &v[i]);

}
上記のようなプログラムを実行すると、scanfでたとえばn=4を入力したときに
for以下のscanfでのv[i]の入力が5個になってしまいます。
nとv[i]で打ち込む個数を等しくするにはどうすればいいのでしょうか?
557デフォルトの名無しさん:2008/12/08(月) 12:57:03
意味が分からん
558デフォルトの名無しさん:2008/12/08(月) 12:58:48
wの入力を忘れていて、一回入力要求が多いと思い込んでいるに一票。
559デフォルトの名無しさん:2008/12/08(月) 13:04:15
wは入れていたんですが、for以下のi=0をi=1に変えたら解決しました。
お手数おかけしました。
ありがとうございます。
560デフォルトの名無しさん:2008/12/08(月) 13:06:27
それは絶対何かがおかしい。
561デフォルトの名無しさん:2008/12/08(月) 13:08:10
本当ですか…
ホントに初歩的な質問ですみませんでした…。
いろんなサイトを見てみます。
562デフォルトの名無しさん:2008/12/08(月) 13:15:02
あ、判った。scanf()のフォーマット指定の後の空白は、何かしら空の入力を要求してしまう。
だから、"%d "としてはダメ。
563デフォルトの名無しさん:2008/12/08(月) 13:22:36
やってみたら直りました!
こんなに見つけにくい間違いを見つけていただいて、ホントにありがとうございました!
564562:2008/12/08(月) 13:42:12
どうでもいい訂正を一つ。
×空の入力を要求
○ダミーの入力を要求

例えば、最初の"%d "に対して
3↓(矢印でEnterキーを表わすとする)
2↓
と入力すると、「3」だけが%dで消費されて「\n」がその後の空白で消費される。
仮にこの後getchar()すれば、「2」が得られることになる。
# このscanf()の振る舞いは美しくない。やはり、fgets()してからsscanf()した方がましなようだ。
565デフォルトの名無しさん:2008/12/08(月) 14:54:28
もうちょっと正確に言えば、「空白文字でない文字が現れるまで読み飛ばし続ける」の意味
だから次に何か打ち込んでやるまで処理が停まってしまう
566デフォルトの名無しさん:2008/12/08(月) 15:06:11
>>565
つまり、実際には一度'2'を読んでそれが「空白でない文字」と判ってから読んでなかったことにしているということかな。
567デフォルトの名無しさん:2008/12/08(月) 15:20:02
>>566
その通り
実際"%d %d"とか書く必要はないんだよね、"%d%d"でいい
空白入れる必要があるのは%cの周辺だけ
568デフォルトの名無しさん:2008/12/08(月) 16:08:53
int i;
char a[5][3]={"12","34","56","67","89"};
for (i=0 ; i<5 ; i++) printf("%s\n",a[i]);

これはちゃんと表示されるのに char を int に変えるとエラーになるんですがなんでですか?
569デフォルトの名無しさん:2008/12/08(月) 16:15:44
>>568
charをintに変えただけならそりゃエラーになるでしょう。
何がしたいのか、具体的にはっきりと。また、エラーメッセージもきちんと書きましょう。
570デフォルトの名無しさん:2008/12/08(月) 16:23:27
>>568
int配列の初期化に文字列リテラルを使うことができないから
それだけ
571デフォルトの名無しさん:2008/12/08(月) 16:50:52
>>570
ありがとうございます
572デフォルトの名無しさん:2008/12/08(月) 17:31:07
配列data[1]〜data[10]に格納されているランダムな数値に
1〜10までの順位を決めたい場合どうすれば良いのでしょうか
573デフォルトの名無しさん:2008/12/08(月) 17:32:48
>>572
ソートすればいいと思います。
574デフォルトの名無しさん:2008/12/08(月) 17:44:18
>>572
data[1]が先頭なので一位、
以下順番でdata[10]が十位
が簡単です。
575デフォルトの名無しさん:2008/12/08(月) 18:39:38
qsortを使えばいいと思いますよ
576デフォルトの名無しさん:2008/12/08(月) 19:03:10
>>572
10個のデータを扱いたいだけなら data[0] 〜 data[9] な
C の配列は [0] から始まるんだよ
577572:2008/12/08(月) 19:09:51
配列data[1]〜data[10]って書いてあるのが読めないんですか?
data[0]には順位に関係ないデータが入っています。
578デフォルトの名無しさん:2008/12/08(月) 19:18:10
>>572
説明しなきゃわかるかボケ

ここはエスパースレじゃないんだよ
579デフォルトの名無しさん:2008/12/08(月) 19:20:31
>>577
読めてるから >>576 を書いたんだよ ぼけ
情報小出ししながら何を威張ってやがる

 無 礼 な 質 問 者 め
580デフォルトの名無しさん:2008/12/08(月) 19:25:12
>>579
メ欄忘れてるぞ
581デフォルトの名無しさん:2008/12/08(月) 19:27:01
>>580
何をだ?
582デフォルトの名無しさん:2008/12/08(月) 19:27:35
2chは初めてか?力抜けよ
583デフォルトの名無しさん:2008/12/08(月) 19:29:48
ム板変なの増えたな
584デフォルトの名無しさん:2008/12/08(月) 19:31:35
>>577
謝るのか消えるのか、どっちだ?

# 煽りはスルー
585デフォルトの名無しさん:2008/12/08(月) 19:44:36
>>584
まあ、おちついて>>577の目欄を見ろよ
586デフォルトの名無しさん:2008/12/08(月) 19:47:29
NULL == 0が真になるのは何でですか?
587デフォルトの名無しさん:2008/12/08(月) 19:50:26
質問が例えば、data[101]〜data[110]に入っている10個のデータ、と書かれていたなら
>>576のような、「10個のデータを扱いたいだけなら」という妙な前提をつくって
0オリジンであることを説くこともなかったはずだよな。

>>572に対してはそういう話をするのではなく、何を以て順位を決定するのか、
また、決定した順位をどのように保持したいのか、そういう問いかけをすべきであろう。
588デフォルトの名無しさん:2008/12/08(月) 19:51:05
>>586
NULLが(void *)0として定義されていたりするから
589デフォルトの名無しさん:2008/12/08(月) 19:54:11
#undef NULL
#define NULL 1

if(NULL == 0) goto hell;
590デフォルトの名無しさん:2008/12/08(月) 19:57:37
>>587=577
591デフォルトの名無しさん:2008/12/08(月) 20:03:27
>>590
顔真っ赤っすね
592デフォルトの名無しさん:2008/12/08(月) 20:34:07
>>586
仕様です
593デフォルトの名無しさん:2008/12/08(月) 20:53:07
>>544
なんでもいいから適当な教科書を買って、わからないところをこちらで聞いていただければいいと思います。
辛抱強く待っておれば、かならず答えてくださる方がおられます。
大事なことは、手を動かすこと、自分の頭で考えること。
これは教えてくださる方が周りにおられるときでもいえることです。
594デフォルトの名無しさん:2008/12/08(月) 20:55:16
int mainじゃない本は投げ捨てろとかいろんな意見があるとは思うが、
俺としては、そういうところではなく、索引がない本は全て投げ捨ててよいと思っている。
595デフォルトの名無しさん:2008/12/08(月) 21:34:33
質問です。
for(i = 0; str[i]; i++);
と記述した場合、この条件文はどういう意味になりますか。
無限ループになってしまうと思うのですが。
596デフォルトの名無しさん:2008/12/08(月) 21:39:01
>>595
iを0に初期化し、以後str[i]が0と比較して等しくならない間、処理を実行し、iを1増やすことを繰り返す
無限ループになるかならないかはstrの指している領域に入っているデータによる
597デフォルトの名無しさん:2008/12/08(月) 21:40:29
>>595
i が増えていって、いつか str[i] が 0 になったら、終わると思うが
598595:2008/12/08(月) 21:45:14
丁寧な回答ありがとうございます。
つまりは、条件文のstr[i]はstr[i]!=0の省略ってことですか?
常識だったらすいません。
条件文をもし a としらa!=0とおなじ意味になるのでしょうか。
599デフォルトの名無しさん:2008/12/08(月) 21:45:18
>>595
きっと文字列なんだと思うんだけど、
(普通は)文字列は最後に'\0'、つまりは0が入ってるのでそこで終わる
600デフォルトの名無しさん:2008/12/08(月) 21:46:11
>>598
そうだよ
むしろ a != 0が 真なら1を返して偽なら0を返す演算子といった方が正確
601デフォルトの名無しさん:2008/12/08(月) 21:47:26
>>595
Cの条件(真偽)判定はすべて、その値を 0 と比較して等しくなければ成立する、というものである。
この場合、おそらくは char であろう str[i] が 0 ('\0')になったときに条件が不成立となり、ループが終了する。

文字列操作にかかわるコードで頻繁に見かけられるこの手のコードは、Cで言う「文字列」が必ず '\0' で終わる、ということに因っている。
str が文字列を指しているかぎり、このループは文字列内の文字をたぶん一文字ずつチェックして、終端に来た時点で終わる。
文字列以外のものを指していたら、どうなるかはわからない。
602595:2008/12/08(月) 22:03:03
理解しました。
どう考えてもstr[i]だけの条件文の書き方でループを抜けることが理解できませんでしたが、
そういう仕様だとわかったので、すっきりしました。
ありがとうございました。
603デフォルトの名無しさん:2008/12/08(月) 22:51:44
putsとprintfの違いってどこですか?
604デフォルトの名無しさん:2008/12/08(月) 22:57:11
>>603
前者はフォーマット指定はないが改行文字が補われる。
コンパイラによっては、printf("%s\n", foo)をputs(foo)で置き換える。
605デフォルトの名無しさん:2008/12/08(月) 23:34:10
質問です

#include <stdio.h>

int iGrobal = 0;

int func (int iLocal)
{
iLocal++;
iGrobal++;
if (4 < iLocal) {
return iLocal;
}
func(iLocal);
printf("iGrobal=%d, iLocal=%d\n", iGrobal, iLocal);
return iLocal;
}

int main()
{
int iData = 0;

func(iData);
return 0;
}

このプログラムなのですが、どういう動き方をしているかが理解できません。
特にiLocalの出力結果が4,3,2,1というように減っている辺りがさっぱりです。

どなたか分かり易く解説をして頂けませんか?
606デフォルトの名無しさん:2008/12/08(月) 23:36:00
>>605
まず
グローバル変数とローカル変数の違いはご存知でしょうか?
607デフォルトの名無しさん:2008/12/08(月) 23:38:43
funcの中でfuncを呼び出しているところがポイントだよ
608デフォルトの名無しさん:2008/12/08(月) 23:42:13
func()内のiLocalの振る舞いに注目。

func(0)
 ↓ここからfunc(0)
 func(1)
  ↓ここからfunc(1)
  func(2)
   ↓ここからfunc(2)
   func(3)
    ↓ここからfunc(3)
    func(4)
     ↓ここからfunc(4)
     func(5)
      ↓4を超えているので即終了
     ↓func(4)の残りの処理
     printf("%d\n", 4);
    ↓func(3)の残りの処理
    printf("%d\n", 3);
   ↓func(2)の残りの処理
   printf("%d\n", 2);
  ↓func(1)の残りの処理
  printf("%d\n", 1);
 ↓func(0)の残りの処理
 printf("%d\n", 0);
↓main()へ
609デフォルトの名無しさん:2008/12/08(月) 23:43:38
最初に言っておきますが超初心者でありますので暇な人以外はヌルー推奨です。。。
暇を持て余してる人がいれば答えて欲しい。


今から、C言語を学ぼうと思ってるんだけど知識ゼロ。
今まで自分がググって調べた限りでは、
言語でプログラムを組んで、それをコンパイラでコンパイルする。
程度のものしか分からないでいます。。。
なんというか、概念自体が把握出来ていない。
大体分かってるけど、肝心な所が分かってなくてモヤモヤしてるんです。
C言語で組んだプログラムはどのように、どうやって反映されるの?また、C言語でプログラムされた代表的なソフトなんてあります?
自分でも何が分かっていないか分からないのですが、しっかり概念を把握できていない事だけは分かります。

何かに例えてでも構わないですし、C言語の利用方法といいますか…簡単な流れを分かりやすく教えてもらえると助かりますです。。。
610デフォルトの名無しさん:2008/12/08(月) 23:44:32
>>609
殆ど全部のOS
611605:2008/12/08(月) 23:50:39
>>608
すげーー!
一発で理解できましたありがとうございます

>>606-607
ありがとうございます
612デフォルトの名無しさん:2008/12/08(月) 23:51:49
>>609
適当な入門書でも買うか、ネットの解説サイトでも見つけて、
コードを打ち込んで実行してみればいいじゃん。
613デフォルトの名無しさん:2008/12/08(月) 23:51:51
>>609
すごくたくさんのソフトがC言語でできているので代表的なものというのは割愛するよ。
反映、というか、おおざっぱに言うと、自分で来んだプログラム(テキストファイル)を、
コンパイラというツールに食わせると、exeファイルが出来上がるの。
exeファイルはダブルクリックしたら実行できるね。
614デフォルトの名無しさん:2008/12/08(月) 23:52:51
まずコンピュータというもの自体がわかってないだろう
615デフォルトの名無しさん:2008/12/08(月) 23:54:10
そこらへんのTV、洗濯機、携帯、車、自販機、ATMなどおよそ機械と言えるものの9割くらい。

>>609
その段階でそれだけ知っていれば十分だと思うぞ。
616デフォルトの名無しさん:2008/12/09(火) 00:00:21
>>610
>>612
>>613
>>615
みんな即レスthxです
大体のプログラムがC言語で出来ていて、代表的だという事なのかな。。。


C言語で使うstrcpy、printfなどの「単語」一覧、みたいなものが集約されたテキストやサイトが存在するのですか?

それと自分はhtmlが大体分かるのですが、C言語とそれは似ているものなのか、それとも全く異なるものと認識していた方が学び易いのでしょうか?
どうしてもhtmlの概念に当て嵌めようとする為、それが原因で分かりにくくなっているのかと思ったり。。。

無知によるスレ汚し申し訳ないです
617デフォルトの名無しさん:2008/12/09(火) 00:04:26
>>616
http://www.bohyoh.com/CandCPP/C/Library/index.html
リファレンスとか、チュートリアルとか、検索すればでてくるよ。
618デフォルトの名無しさん:2008/12/09(火) 00:04:51
>>609
プログラム自体も一つのファイルなのはわかるかな?実行ファイルと呼ばれることもあるね
そこにはコンピュータ(CPU)に対する一連の命令が書かれている
「プログラム(実行ファイル)を実行する」というのは、使っているコンピュータに対して
「このファイルを読み取って、そこに書かれているとおりのことをやりなさい」と言うことを意味する

ただし、その命令というのは、コンピュータが理解しやすい表現で書かれている
具体的に言うと数字の羅列で書かれている
これはちょっと普通の人間にはとても読めないし、
読めてもどういう働きをするのかは簡単にはわからないし、
書くとなればそれこそ容易じゃない

そこで、「人間が理解しやすい表現で書かれたファイル」を
「コンピュータが理解しやすい表現で書かれたファイル」に変換するプログラム、というものが生まれた
これがコンパイラで、人間は人間が理解しやすい表現、
いわゆるプログラミング言語と呼ばれるものでプログラムを設計することができるようになった
Cはそのプログラミング言語の一つ
「C言語でできている」というのは「C言語を使って開発した」という意味であって、
コンパイルされた実行ファイル自体には、もはやC言語は関係ない

興味があるならアセンブラやインタプリタについても調べてみること
619デフォルトの名無しさん:2008/12/09(火) 00:07:15
>>616
もちろんその手の本だってある。
自分が持っているのはちょっと古いけどANSI C言語辞典の初版。

ところでJavaScriptはやったことないの?
プログラミング言語に分類されるという点で、HTMLより遥かにCに近いんだけど。
620デフォルトの名無しさん:2008/12/09(火) 00:09:59
>>616
>html
人間が読むことができる、という点では共通しているがそれ以外ではまったくの別物
htmlはプログラミング言語ではなく記述言語で、文書の意味付けや表現方法をコンピュータに指示するためのもの
621デフォルトの名無しさん:2008/12/09(火) 00:32:46
>>617
>>619
なるほど、ではまずそれの下準備を整えてから学ぼうと思います…ありがとう!
因みにJavaは学んだ事無いです。。。

>>618
>そこで、「人間が理解しやすい表現で書かれたファイル」を
「コンピュータが理解しやすい表現で書かれたファイル」に変換するプログラム、というものが生まれた
これがコンパイラで、人間は人間が理解しやすい表現、
いわゆるプログラミング言語と呼ばれるものでプログラムを設計することができるようになった
Cはそのプログラミング言語の一つ
「C言語でできている」というのは「C言語を使って開発した」という意味であって、
コンパイルされた実行ファイル自体には、もはやC言語は関係ない

非常に分かり易い説明感謝です、
自分はそもそもの部分を履き違えていたみたいです。。。

>>620
なるほどありがとです。超簡易表現するとhtmlは表面上の見た目を弄る、C言語を始めとするプログラム言語は内部からその全てを弄るものという解釈で問題なかったです?

それと、最後に無知にご教授下さいませです。

>>618で仰っていたようにC言語を使い開発したプログラムがあるとします。
それによりコンパイルされた実行ファイルを、他の言語で添削する事は可能なのですか?
>>618でコンパイルされた実行ファイル自体には、もはやC言語は関係ないとあったのでそう解釈しました。。。
それとも、C言語で開発した実行ファイルはC言語で構成されている為、当然それを用いて添削する。が正しい認識でしょうか?
622デフォルトの名無しさん:2008/12/09(火) 00:35:06
自分で試せ、と自分でも強く思うのですが
なにしろ初心者なものでその段階まで到達できずにいますです。。。

申し訳なすです
623デフォルトの名無しさん:2008/12/09(火) 00:58:38
>>604
理解できました
ありがとうございます
624デフォルトの名無しさん:2008/12/09(火) 01:12:33
>>621
コンパイルされた実行ファイルは普通は機械語と言う言語の文になっています
この機械語がコンピュータ(CPU)が唯一理解できる言語です
これを添削するには逆アセンブルという作業をしてアセンブリ言語ですることになります
しかし普通はこんなやりかたしません
添削したいのならコンパイルされる前のC言語のプログラムを添削すればいいからです
そして修正する事があれば修正してプログラムが完成したらコンパイルして
コンピュータが実行できる機械語のプログラムに変換して、実行ファイルを作って完成です

つまり添削するのは実行ファイルではなく、コンパイルされる前の
C言語のプログラム(これをソース(原始)プログラムと言う)ファイルです
625デフォルトの名無しさん:2008/12/09(火) 01:17:34
>>621
待て、Java ≠ JavaScriptだ。似て非なるものどころか似てもいない。

>>622
なぜ試せない?

PC初心者だと思う―Yes→専門学校・大学にはPC初心者未満がごろごろしているから気にすんな
↓No
PCを持っていない―Yes→入手しろ、中古でもまあ何とかなる
↓No
やる気がない―Yes→ご冗談を、それならこのスレに来ていないだろ
↓No
おめでとう。入門する資格は十分だ。
626デフォルトの名無しさん:2008/12/09(火) 01:49:13
>>594
同意しますが、K&Rにしても索引の質はもう一つですね。これって和訳は日本独自なんでしょうかね。
627デフォルトの名無しさん:2008/12/09(火) 02:04:11
俺も初心者だぜ
しかも中卒の中年だぜ
まだHello worldしか書けないぜ
記憶力が3日しかもたないからHello worldから抜け出せないんだぜ
628デフォルトの名無しさん:2008/12/09(火) 02:27:51
さすがにそれはあきらめろ
629デフォルトの名無しさん:2008/12/09(火) 03:17:58
Good night world. に進んでみるのはどう?
630デフォルトの名無しさん:2008/12/09(火) 03:27:05
>>627
80才過ぎてから中国語を勉強して、そこそこしゃべれるようになる人もいる
から中卒だの中年だのは関係ない、記憶力が3日しか持たないのはあまり
やる気が湧いてないからだよ

プログラム言語では45歳すぎてからCOBOL覚えて社内(100人ぐらいの会社)システム作って運用
してる人(45歳までただの事務職(と言っても総務部長)でまったくのプログラム未経験者)もいる

やる気さえ持続すれば50才過ぎても覚えられるとは思う
専門書などを1回読んで分らなければ10回読む、10回でだめなら100回読む
ぐらいのやる気があって、その勢いが持続すればだけどね(ちょっとだけ極端な言い方だけど…)
631デフォルトの名無しさん:2008/12/09(火) 03:49:52
質問しておいて亀レスごめん。。。

>>624
なるほど、では基本的にC言語で構築したプログラムはC言語で添削
と考えておけば問題なさげですね。詳しく、本当感謝です。

>>625
JavaScriptだね、これも同じく学んでいないです。。。
ありがとう!今から基本からしっかりと学んでいきます。
自分は時間的な猶予が限られているのでこれから独学で学ぶつもりです。
その中でまた壁にぶち当たったらここで質問させてもらうね、みんなありがとうです!
632デフォルトの名無しさん:2008/12/09(火) 03:57:23
>>630
だよな。
記憶した個々のことを頭の中で組み立てて「きっと、こうなるはずだ」と考え、
それを試して「よしよし、考えたとおりだ」とか「何がまずかったのだろうか」と
ちゃんと顛末を確認できれば年齢なんて関係ないぞ。
633デフォルトの名無しさん:2008/12/09(火) 04:00:21
>>631
俺も未だにポインタでつまずいているプログラム初学者だけど一緒に頑張ろう
いろいろな言語の事調べてきたが、C言語が一番わかりやすいと思うよ
俺もなかなか時間取れなくていっこうに上達しないけど趣味の一つとして末永くC言語と付き合っていこうと思う。


634デフォルトの名無しさん:2008/12/09(火) 04:30:21
>>632
そうそう、そういう風に出来るか否かが問題で、学歴や年齢は関係ないよね
20歳でそういう風に出来ない人と、50歳でそういう風に出来る人では
確実に50歳でそういう風に出来る人が勝つからね

俺が思うに最近の若者ってそういう風に自分で考える事ができない人が
やたら多くなって来てると思うけどどうなんだろ
まさか近い将来、若者にはプログラミングは無理とか言われるように
なったらどうしようとか心配になったりするんだよな
635デフォルトの名無しさん:2008/12/09(火) 04:49:37
>>634
これからはそういう若者にいかにわかりやすくプログラミングを教えるかが
問題になってくると思われる

中高年の人や自分で考える事が出来ない若者をうまく教育してプログラマー
に出来る会社が次の勝ち組になるだろう

プログラマー不足はまだまだ続きそうだ
636デフォルトの名無しさん:2008/12/09(火) 04:57:21
>>635
「わかりやすく教えられる」ということは、物事を順序立てて説明できることはもちろんの事、
いかに相手の理解の進度を肌で感じ取って、歩調を合わせられるかも肝心だよな。
637デフォルトの名無しさん:2008/12/09(火) 05:33:09
>>636
それが結構難しい
特にプログラマーにそれが出来る奴が少ない気がする
次の勝ち組の道はかなり険しそうだね
638デフォルトの名無しさん:2008/12/09(火) 10:27:54
教えてください

unsigned int POINT1=0;
unsigned int POINT2=0;
unsigned int POINT3=0;
unsigned int POINT4=0;
unsigned a,b,c,d,e,f;

と宣言部で宣言して、
if(e==1 && d==0){
a++;
POINT1 = a;
e=d;
if(a==0x0a){
a=0;b++;
POINT2 = b; }
if(b==0x06){
b=0;c++;
POINT3 = c;}
if(c==0x0a)
c=0;f++;
POINT4 = f;}
if(f==0x06)
f=0;
}
と、割り込みの関数内で記述したところ
warning: type defaults to 'int' in declaration of 'POINT1'
error: conflicting types for 'POINT1'
error: previous definition of 'POINT1' was here  ←宣言部の行のエラー
というエラーが出たのですが、
何の矛盾なんでしょうか?
639デフォルトの名無しさん:2008/12/09(火) 10:48:22
とりあえずネットサーフィンの独学二週間で「宿題スレ」にある問題とかで
自分でも組めそうな簡単な問題探してプログラミング組んだりしているんだけど
やっぱ問題集みたいな本買った方がいいんかな?
640デフォルトの名無しさん:2008/12/09(火) 11:50:13
問題集は正直要らないと思う。
作りたいものがあるならそれに必要な知識や技術を学べばいい。
それがないなら宿題スレの自分が組めそうに無いものを調べながら作れば上達するんじゃね?
641デフォルトの名無しさん:2008/12/09(火) 13:02:05
>>635
実際に教えた経験から言うと、言語仕様は理解しているのに要求を実現できないって奴のほうが困る
642デフォルトの名無しさん:2008/12/09(火) 13:10:36
>>638
辞書ぐらい引け
簡単に言うとPOINT1の多重定義が原因だから自分で探せ
見つけて欲しいなら全ソースを貼ること
643638:2008/12/09(火) 13:32:50
>>642
ありがとうございます。
代入しているつもりが定義になっていました
初歩的な質問で申し訳ないです。
644デフォルトの名無しさん:2008/12/09(火) 14:02:45
Cに限らないかもしれませんが、
エラーの返し方の定石みたいなものはあるんでしょうか?

具体的には、関数を作ってエラーの種類と処理したデータを分けて
返したい場合、どちらをreturnして良いのかわかりません。
エラーの種類はグローバル変数に入れて、
処理したデータをreturnするのが良いのでしょうか?
それとも、エラーをreturnして、ポインタで渡された変数を書き換えることで、
処理したデータを返すべきなんでしょうか?
645デフォルトの名無しさん:2008/12/09(火) 14:26:41
真偽を判定する関数:真なら1、偽なら0を返す

何かの処理を行って、エラーが起きたかどうかだけわかればいい関数:成功したら0、失敗したらそれ以外の数を返す
(特にファイル操作系の関数の場合、EOFを返す)

自然数を返す関数:0以下の数をエラー値として使う

unsignedの数を返す関数:負の数をエラー値として使う

浮動小数点数を返す関数:HUGE_VALなどを使う

ポインタを返す関数:ヌルポインタを返す

上記で対応できない場合:ポインタを受け取ってそこに書き込む

基本的には標準ライブラリ関数の仕様を眺めてそれに倣うのが良い
646デフォルトの名無しさん:2008/12/09(火) 14:53:30
>>645
エラーが起きたかどうかだけわかればいいって場合は成功を非0にするだろ。
成功時に0を返すのは、具体的なエラーコードを戻り値にする場合だと思う。
647644:2008/12/09(火) 15:10:17
>>645-646
丁寧な解答ありがとうございます。
負の数で表すことも考えましたが、将来負の数を使う可能性が0ではないので
エラーを別けておくことにしました。
Cらしくポインタ渡しでいこうと思います。
因みにグローバル変数を使うと、スレッドセーフでなくなるのでしょうか?
648デフォルトの名無しさん:2008/12/09(火) 15:16:23
そりゃどっちのスレッドのエラーかわからなくなるからな。
スレッドローカルな変数というのもある。
649デフォルトの名無しさん:2008/12/09(火) 16:33:31
>>646
ところがどっこい
そういう決まった処理をする関数では0は「何事もなかった」という意味なんだ
if(fonc()) /*エラー処理*/
みたいにする
650デフォルトの名無しさん:2008/12/09(火) 16:57:11
一方 Windows は成功時に TRUE を、失敗時に FALSE を戻す関数を作った。
651デフォルトの名無しさん:2008/12/09(火) 16:58:27
>>646
「0」と「非0」は「偽」と「真」と呼ばれることが多く、これから「失敗」と「成功」を連想する人は多い。
しかしながらCの本来的な考え方においては、これらは「無為」と「有為」を表すものである。
だから、特定の処理を行ってそれが成功か失敗かだけを戻り値として返すような
ほとんどすべてのライブラリ関数は、成功時に0を返す。手持ちのリファレンスを確認すること。

例外は、putc() / fputc() / ungetc() である。これらの関数は成功時に書き込んだ(押し戻した)文字を返す。


652デフォルトの名無しさん:2008/12/09(火) 17:04:49
>ほとんどすべてのライブラリ関数は、成功時に0を返す。手持ちのリファレンスを確認すること。
「UNIXのシステムコール由来のライブラリ関数の多くは」だろ。
それだって、そんなに多くはないけど。
653デフォルトの名無しさん:2008/12/09(火) 17:09:07
成功時に1帰す標準ライブラリ関数って何があったっけ
654デフォルトの名無しさん:2008/12/09(火) 17:10:32
>>651
そもそも成功失敗を返さないライブラリ関数が多数なわけで
655デフォルトの名無しさん:2008/12/09(火) 17:22:15
>654
>特定の処理を行ってそれが成功か失敗かだけを戻り値として返すような
が読めないのか
656デフォルトの名無しさん:2008/12/09(火) 17:28:21
remove(), rename() ぐらいしか該当するものが無いんだけど。
657デフォルトの名無しさん:2008/12/09(火) 17:33:54
>エラーの返し方の定石みたいなものはあるんでしょうか?
ない?
658デフォルトの名無しさん:2008/12/09(火) 17:38:06
>>655
読んでたけど、それに当てはまらないputcやらをわざわざ例外として挙げられてたから
勘違いしてたみたい。
659デフォルトの名無しさん:2008/12/09(火) 17:38:46
バカがいるな
660デフォルトの名無しさん:2008/12/09(火) 17:40:17
>>651か、または>>659あたりが当てはまるかな
661デフォルトの名無しさん:2008/12/09(火) 17:42:36
mainの成功は0返すからそれに合わせてる
662デフォルトの名無しさん:2008/12/09(火) 18:10:47
自分でつくる場合は成功時0、失敗時-1 が多いかな
WinAPIは変則だらけでイヤン
663デフォルトの名無しさん:2008/12/09(火) 18:34:56
エラーチェックなんてしないのが最近のトレンド
664デフォルトの名無しさん:2008/12/09(火) 19:39:13
Cの次に勉強するとしたら言語は何がオススメ?
就職したとき勉強したCじゃなかったら一から勉強し直さないとだし
企業はどんな言語を使ってるのだろう・・・
665デフォルトの名無しさん:2008/12/09(火) 19:48:46
気にしなくて良いよ、それでも気になるならマ板に消えろクズ
666644:2008/12/09(火) 19:49:13
むぅ〜臨機応変に考えないと駄目なんですかね。
状況や自分の好みも踏まえて、よく考えてみます。
ありがとうございました。
667デフォルトの名無しさん:2008/12/09(火) 20:11:09
成功時0、エラー時非0を返す
・raise()
・remove()
・rename()
・fclose()
・fflush()
・setvbuf()
・fseek()
・fsetpos()
・atexit()

エラー時EOF、成功時に文字を返す
・fputc()
・putc()
・ungetc()

エラー時EOF、成功時に0以上の値を返す
・fputs()
・puts()

処理系依存
・system()

特殊
・setjmp()
668デフォルトの名無しさん:2008/12/09(火) 20:15:24
-1じゃなくて非0なの?
669デフォルトの名無しさん:2008/12/09(火) 20:36:19
while(-1 != 0){
printf("うんこ");
}
670デフォルトの名無しさん: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、、、: :                   、.,-‐'`   、/`
   ``ヽン'`"`  : `~``―ヽ::,,,,,,,,,,.....................,,,,.ー'``^    ,、‐'"`
      `"'゙―-、,,,,..、、                 : ..,、ー'"'`
           : `‘"`―---------‐ヽ``"''''''""``
671デフォルトの名無しさん:2008/12/09(火) 20:59:43
>>641
そういうやつって暗記が得意なやつに多いよな
暗記したけど理解できてないから要求をどう実現するか分らないんだろね
想像力も低いようだし
考える力を養わないとどうにもならんだろうね
672デフォルトの名無しさん:2008/12/09(火) 20:59:51
>>668
そうだよ

ところでfputcとかはなんで書き込んだ文字を返すんだろう
673デフォルトの名無しさん:2008/12/09(火) 21:05:30
エラー時0というのが無いのだけははっきりしてるな
674デフォルトの名無しさん:2008/12/09(火) 21:15:05
atoiは不正入力の時0を返すぜ!

エラー検知としての意味は無いけど
675デフォルトの名無しさん:2008/12/09(火) 21:28:53
関数の戻り値も、業務アプリの実務だと単純じゃないよな。
構造体のパラメータで受け取ったりで。

struct Result {
  int status;
  char msg[MSG_SIZE];
};
676デフォルトの名無しさん:2008/12/09(火) 22:14:03
>>671
やはりプログラマは数学が得意じゃないと駄目だな。
直接的に使わなくとも、発想力的に考えて。
677デフォルトの名無しさん:2008/12/09(火) 22:21:40
>>672
>ところでfputcとかはなんで書き込んだ文字を返すんだろう
putc, putchar がマクロだからだろう。
678デフォルトの名無しさん:2008/12/09(火) 22:29:56
>>673
mallocとか違うの?
679デフォルトの名無しさん:2008/12/09(火) 22:32:42
NULLを返すのは、0と区別していいんじゃない?
680デフォルトの名無しさん:2008/12/09(火) 22:34:37
mallocはエラー時にはNULLが返るからな。
fputcはエラー時にはEOFが返る。
681680:2008/12/09(火) 22:35:12
>>679
ああ、そういうことか。
682デフォルトの名無しさん:2008/12/09(火) 22:41:37
NULLも0だろ実際
683デフォルトの名無しさん:2008/12/09(火) 22:42:15
0だがfalseとしての0じゃない
684デフォルトの名無しさん:2008/12/09(火) 22:49:34
>>682
そんなネタではもう誰も釣れないよ。
685デフォルトの名無しさん:2008/12/09(火) 23:09:05
>>682
実際の実装じゃなくて、観念的な意味でな
686デフォルトの名無しさん:2008/12/09(火) 23:16:30
printf("%f\n", 0.9999999);
なんでこの実行結果が1.000000になりますか
687デフォルトの名無しさん:2008/12/09(火) 23:19:48
>>686
その処理系だと小数点以下6桁表示がデフォだからです
688デフォルトの名無しさん:2008/12/09(火) 23:20:53
>>686
そんな小さいこと気にしてたら大人になれないよという教え

どうしても気になるなら2進数で小数をどうやって表現するかを考えるといいよ
689デフォルトの名無しさん:2008/12/09(火) 23:25:02
>>688
doubleの定数なんだからまだそれが出る精度じゃねぇだろ
690デフォルトの名無しさん:2008/12/09(火) 23:26:15
>>686
小数点以下6桁表示で7桁目が四捨五入されるから。
691デフォルトの名無しさん:2008/12/09(火) 23:57:34
>>676
数学が得意じゃなくても数学が好きなら大丈夫だと思う

数学が得意でも数学が嫌いだと無理っぽい(そんな奴いねーか)
692デフォルトの名無しさん:2008/12/10(水) 00:07:34
>>686
%fなんかを生で使うからです。
693デフォルトの名無しさん: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);
}
694デフォルトの名無しさん:2008/12/10(水) 01:11:37
>>693
送信用のスレッドを作る理由は?
695デフォルトの名無しさん:2008/12/10(水) 01:19:07
>>694
常に受信できる環境にしたいので送/受信用のスレッドを作った

一応bufを違うところにコピーする方法で行けそうだけど,同時に受信したら動くのか?
696デフォルトの名無しさん:2008/12/10(水) 01:22:45
送受信の対応がとれないと違うところがいっぱい必要になるのでは?
697デフォルトの名無しさん:2008/12/10(水) 01:28:19
送信なんかあっというまだって
わざわざ別スレッドをつくるこたあない
698693:2008/12/10(水) 01:39:56
こいういのってスレッド化しないものなのか?
セオリー的なものがまだ身についてないな・・・
699デフォルトの名無しさん:2008/12/10(水) 01:47:44
受信と送信が完璧に同期する必要があるならスレッド化しないほうが楽だろ
それでもスレッド化しなければならない環境要因があるならそれはなんとか頑張るしかない
まあバッファコピー自体はたいして時間かからんだろう?
700デフォルトの名無しさん:2008/12/10(水) 01:51:15
>>695
受信スレッド何個あるんだ?1個なら同時に受信つっても同時に処理されるのは1個だけだ。
受信、送信スレッドで分けることが必要な場合もあるが、その場合は最初から送信スレッドも起動しておけば良い。受信してから作る意味がわからん。
701デフォルトの名無しさん:2008/12/10(水) 03:25:31
-128〜127の範囲の計算ならchar型の変数に数値代入してもいいのですか?
702デフォルトの名無しさん:2008/12/10(水) 03:27:31
charが符号ありの場合、有効範囲は-127から+127、
charが符号なしの場合、有効範囲は0から+255。
703デフォルトの名無しさん:2008/12/10(水) 05:54:11
小文字を大文字に変換して出力するという問題で

int main(void)
{
char *str="AbcDefGHijk1234lmNOP";
while(*str!='\0'){
if(islower(*str)!=0) *str=*str-'a'+'A';
str++;
}
printf("%s\n",str);
return 0;
}

このようにプログラムしても何も文が出てこないのは何故なんでしょうか?
704デフォルトの名無しさん:2008/12/10(水) 06:09:59
文字列リテラルを書き換えるな
705デフォルトの名無しさん:2008/12/10(水) 06:35:20
書き換えるのがダメなら
>>703のように、文字型配列の一部を変換→出力という問題自体がダメという事ですか?
706デフォルトの名無しさん:2008/12/10(水) 06:55:00
文字型配列の一部を変換なら
char str[]="AbcDefGHijk1234lmNOP";
でなければならない.

>>703 のコードが何も出力しない(ように見える)のは,
while() を抜けた後で str がどこを指してるのかを考えれば自ずとわかるはず
707デフォルトの名無しさん:2008/12/10(水) 14:19:43
複雑な構造体のメンバのアドレスを取得するには、どう書けば良いのですか?

pstructa->pstruct1->member

のような長い名前を何度も書きたくないので、
ローカルで短い名前のポインタを使いたいのですが、
&をどこに書いたら良いのかわかりません。

p = &(pstructa->pstruct1->member);

こうでしょうか?
708デフォルトの名無しさん:2008/12/10(水) 14:22:24
うん
709デフォルトの名無しさん: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);
}
710デフォルトの名無しさん:2008/12/10(水) 14:30:21
int main(){
printf("1つめの日付を入力してください。例:1995年6月10日半角スペースで区切る 1995 6 10\n");
fgets(line,sizeof(line),stdin);
sscanf(line,"%d %d %d",&xyear,&xmonth,&xday);
printf("2つめの日付を入力してください。ただし、1つめの日付よりも後の日付にしてください。");
fgets(line,sizeof(line),stdin);
sscanf(line,"%d %d %d",&yyear,&ymonth,&yday);

/* 年合計+month_day[]から日にち合計を取り出す+日 */
x_total = ((xyear * 365) + month_day[xmonth - 1] + xday);
y_total = ((yyear * 365) + month_day[ymonth - 1] + yday);

/* 閏年関数からの返り値を、各_total変数に代入 */
x_total += uruu_doshi(xyear);
y_total += uruu_doshi(yyear);

/* ・出力 ・printf内で合計日数の差を求めている */
printf("%d年%d月%d日と%d年%d月%d日の日数の差は%d日です\n",xyear,xmonth,xday,yyear,ymonth,yday,y_total - x_total);

return(0);
}
711デフォルトの名無しさん:2008/12/10(水) 14:31:49
>>706
回答ありがとうございます。
調べてみたんですが

char *str="AbcDefGHijk1234lmNOP"; (文字列リテラル)
char str[]="AbcDefGHijk1234lmNOP"; (文字型配列)

文字列リテラルと文字型配列は似ている様で結構違うんですね。
712デフォルトの名無しさん:2008/12/10(水) 14:32:32
>>709-710
特に気になるのが、uruu_doshi関数内の、

uruu_result = (year/4) - (year/10);

これで、閏年の数を数えれているのかが心配です。
713デフォルトの名無しさん:2008/12/10(水) 14:36:57
>>709
閏年の年は日数 (month_dayのやつ) が2月以降1ずつ増えると思うんだが
714デフォルトの名無しさん:2008/12/10(水) 14:39:05
>>713
それを、閏年関数(int uruu_doshi)の値を合計日数に足すってことで代用しようとしてみたんですが、間違えてますか?
715デフォルトの名無しさん:2008/12/10(水) 14:41:40
>>714
いや、閏年でも1月の日数は増えないので、2月以降という条件分岐がどこかに必要なはず
716デフォルトの名無しさん:2008/12/10(水) 14:44:19
3月以降だろう
717デフォルトの名無しさん:2008/12/10(水) 15:24:21
>>708
ありがとうございます!
718デフォルトの名無しさん:2008/12/10(水) 15:24:56
>>711

char *str = "abc";
とは
char str[] = "abc";
char *p;

p = str;

のpと同じになる

719デフォルトの名無しさん:2008/12/10(水) 15:39:22
ならねーよ.
720デフォルトの名無しさん:2008/12/10(水) 16:02:28
>>711も文字列リテラルと文字型配列は違うと理解したのに
なんで同じになるんだよw
721デフォルトの名無しさん:2008/12/10(水) 16:37:47
>>718
アルカリイオン水吹いたwwww
722デフォルトの名無しさん:2008/12/10(水) 16:52:57
とりあえず>>718より>>711の方が賢いというのはわかった
723デフォルトの名無しさん:2008/12/10(水) 16:58:45
wwwww草
724デフォルトの名無しさん:2008/12/10(水) 17:04:45
"AbcDefGHijk1234lmNOP"が文字列リテラルじゃないのか?
725デフォルトの名無しさん:2008/12/10(水) 17:05:27
>>718

いやたいして間違ってないぞ

おまえらはなににそんなこだわってんだ?
所詮メモリの話で

主な利用意識は同じだろ
726デフォルトの名無しさん:2008/12/10(水) 17:09:29
>>文字列リテラルと文字型配列は違う

一から勉強してこいかす
727デフォルトの名無しさん:2008/12/10(水) 17:11:14
ここにいるやつらに細かいこといってもしょうがないだろjk・・・

初心者が初心者に教えてるんだから
728デフォルトの名無しさん:2008/12/10(水) 17:12:14
上級者でごめんね
729デフォルトの名無しさん:2008/12/10(水) 17:13:42
中級者でごめんね
730デフォルトの名無しさん:2008/12/10(水) 17:16:23
>>725
けど>>718みたいに考えてると
リテラル文字列も書き換えOKと勘違いしない?
731デフォルトの名無しさん:2008/12/10(水) 17:56:16
勘違いするってのはそもそもc言語の仕様をわかってない初級者でだな・・・


neetでごめんね
732デフォルトの名無しさん:2008/12/10(水) 18:11:19
そもそも文字列リテラル(へのポインタ)をchar * strに代入すべきじゃない。
const char * strに代入すべきだ。
733デフォルトの名無しさん:2008/12/10(水) 18:37:51
>>732
const char * const str のほうがよくね?
734デフォルトの名無しさん:2008/12/10(水) 19:31:47
やさしいC第3版という本で勉強していますが代入演算子について質問です。
この本には「a = b = 1と記述した際はa = (b = 1)の順番で評価され、
まずbに1が代入され、続いてaにも1が代入されます。」とありますが
b = 1 で b に 1 が代入され a = b で bが1を返すから a = 1 となって
aに1が代入されるのですか?
それとも、=演算子が右のオペランドを返すから(b = 1)という式が
1を返し、a = 1となってaに1が代入されるのですか?
私は後者だと推測しているのですがよくわからないのでご教授お願いします。
735デフォルトの名無しさん:2008/12/10(水) 19:34:20
>>734
b が 1 を返すから
736デフォルトの名無しさん:2008/12/10(水) 19:35:03
b = 1 が b の値を返すからだよ
737デフォルトの名無しさん:2008/12/10(水) 19:51:40
>>735
つまり前者が正しいってことですか?

>>736
後者が正しいということですか?

早くも躓いてしまいました。大変失礼ですが、
もう少しわかりやすく説明して頂けるとありがたいです。
738デフォルトの名無しさん:2008/12/10(水) 19:56:46
まずb = 1が処理される
その次にa = bが処理される
だから前者
739デフォルトの名無しさん:2008/12/10(水) 19:58:53
ITProに書いてあったんですが、C++はCの上位互換って本当ですか?
そうは教わらなかったんですけど。
740デフォルトの名無しさん: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だっただけでその評価値がまた代入に使われている。

昔は、ポインタの代入でうまくいかなかったことが、いやなんでもない。
741デフォルトの名無しさん:2008/12/10(水) 20:09:53
>>739
嘘です
742デフォルトの名無しさん:2008/12/10(水) 20:14:46
数字を何個か入力して
最大の数字を表示するプログラムを教えてください
do whileかfor使います
743デフォルトの名無しさん:2008/12/10(水) 20:21:09
#include <stdio.h>
int main(void){


}
744デフォルトの名無しさん:2008/12/10(水) 20:21:25
745デフォルトの名無しさん:2008/12/10(水) 21:30:02
>>739
ほぼ上位互換だけど、いくつも違う点がある。
C のプログラムがそのまま C++ で動くこともあるけど、
そうでないこともある。
746デフォルトの名無しさん:2008/12/10(水) 21:43:49
CはC++の上位互換
747デフォルトの名無しさん:2008/12/10(水) 22:44:17
>>734
後者が正しい。
「式が値を持つ」というのがCの特徴の一つで、この場合の式はb=1のこと。
この式の値が1となり、さらにそれが=演算子によってaと演算される。
748デフォルトの名無しさん:2008/12/10(水) 22:48:04
式が値を持つのはC以外の言語でも普通の事だな。
代入が文でなく式である事がCの特徴。
749デフォルトの名無しさん:2008/12/10(水) 23:17:22
環境変数を取得するにはどうすればおk?
750デフォルトの名無しさん:2008/12/10(水) 23:19:20
int main(int argc, char **argv, char **envp)
envpで調べるといいかも。

Windowsはどうなのか知らない
751デフォルトの名無しさん:2008/12/10(水) 23:19:47
>>749 getenv関数
752デフォルトの名無しさん:2008/12/10(水) 23:58:22
double型でa[3][3]を定義して、

scanf("%lf", a[0][0]);
scanf("%lf", a[0][1]);
scanf("%lf", a[0][2]);
scanf("%lf", a[1][0]);
scanf("%lf", a[1][1]);
scanf("%lf", a[1][2]);
scanf("%lf", a[2][0]);
scanf("%lf", a[2][1]);
scanf("%lf", a[2][2]);

ってしたものをコンパイルした後、
1つ目の入力の直後にクラッシュしてしまうんですがどうしてですか。
753デフォルトの名無しさん:2008/12/10(水) 23:59:34
&a[0][0]
754デフォルトの名無しさん:2008/12/11(木) 00:05:25
>>750
>>751
トンクス
755デフォルトの名無しさん:2008/12/11(木) 11:05:34
>>752
int i, j;
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++) scanf("%lf", &a[i][j]);
756デフォルトの名無しさん:2008/12/11(木) 11:27:27
C言語ってどこで使われてるの?
757デフォルトの名無しさん:2008/12/11(木) 11:31:16
世界中で
758デフォルトの名無しさん:2008/12/11(木) 11:31:23
>>756
一番簡単な例を上げるとPS以降のゲームとか
759デフォルトの名無しさん:2008/12/11(木) 11:32:49
windowsはいくつぐらいまでC言語で出来てたの?
760デフォルトの名無しさん:2008/12/11(木) 12:48:53
ファンタシ-シタ-はマークIII版?
確かに大容量ゴールドカートリッジだったから
高級言語でないと開発大変だろうね
761デフォルトの名無しさん:2008/12/11(木) 13:40:22
>>759
「いくつ」?
762デフォルトの名無しさん:2008/12/11(木) 16:53:30
10才ぐらいじゃね
763デフォルトの名無しさん:2008/12/11(木) 17:50:44
C言語の開発環境何使ってる?
VS2008でC言語使うのいちいちめんどくさすぎるんだけど。
他のみたく文字列打ったとき色づけもされないし不便すぎて参ってます
764デフォルトの名無しさん:2008/12/11(木) 18:04:25
765デフォルトの名無しさん:2008/12/11(木) 18:38:31
お?VS2008ってCのシンタックスハイライトされないの?
なんかの間違いじゃなかろうか。

にしてもVS使うのが面倒だと思うならエディタで書けばいいじゃない、と思うんだけど。
766734:2008/12/11(木) 19:25:39
>>738
>>740
>>747
>>748
結局どちらが正しいのかわからないのですが。
後者でいいんですよね?

もう一つ質問させて下さい。
printf("%f", 5.0 / 3);
この時5.0や3は何を意味していますか?
5.0はfloat型かdouble型ですか?
それとも型の概念は無く小数として扱われるのでしょうか。
小数とかいう概念も無くただ「値」として扱うのですか?
3についても同様です。
この辺わからないのでお勧めの書籍があれば教えて下さい。
今はこの本を終えた後「C実践プログラミング」を買おうと思ってます
767デフォルトの名無しさん:2008/12/11(木) 19:42:39
5.0 はdouble型です
3 はint型です
768デフォルトの名無しさん:2008/12/11(木) 19:55:06
'\0' もint型です
769デフォルトの名無しさん:2008/12/11(木) 20:03:09
5.0f はfloat型
3L はlong型
770デフォルトの名無しさん:2008/12/11(木) 20:05:39
printf("%d", sizeof( 5.0 )); は8と表示されるだろう
printf("%d", sizeof( 5.0f )); は4と表示されるだろう
771デフォルトの名無しさん:2008/12/11(木) 20:06:59
NULLはint型かもしれません、違うかもしれません
772766:2008/12/11(木) 20:07:23
ちゃんと決っていたのですね。ありがとうございました。
char ch;
ch = 65;
ではこのコードは代入の時に暗黙的にintからcharに変換していると
いうことなのでしょうか。そろそろ厚かましいですかね。
773デフォルトの名無しさん:2008/12/11(木) 20:49:50
>>772 そのとおり
774デフォルトの名無しさん:2008/12/11(木) 22:55:48
Cで人を救えますか
775デフォルトの名無しさん:2008/12/11(木) 22:56:32
救えますよ
プログラマは救われませんけどね
776デフォルトの名無しさん:2008/12/11(木) 22:58:41
やっぱりプログラマは人じゃなかったんだ
777デフォルトの名無しさん:2008/12/11(木) 23:32:16
士農工商犬プログラマ、って言葉を聞いたのは何時だったか……。
778デフォルトの名無しさん:2008/12/11(木) 23:43:30
ポインタpが配列要素a[2]をさすようにした場合p[-2]みたいに添え字の中身をマイナスにしてもいいのですか?
779デフォルトの名無しさん:2008/12/11(木) 23:47:46
>>778
はい。
780デフォルトの名無しさん:2008/12/11(木) 23:52:25
>>778
問題ありません
説明としてはa[2] は *(a + 2) と書き方が違うだけにすぎないからです
781デフォルトの名無しさん:2008/12/11(木) 23:59:54
ありがとうございます
782デフォルトの名無しさん:2008/12/12(金) 05:21:34
標準ライブラリ関数の書式で

int puts( const char *string );
char *gets( char *buffer );

のように関数名の前に *が付いているのと付いていないのがあるが違いが良く分かりません。
*putsやgetsではダメなんですか?
783デフォルトの名無しさん:2008/12/12(金) 07:34:43
>>782
戻り値の型が違う。puts()は整数を返すが、gets()はポインタを返す。
それはさておき、gets()は使用禁止。
784デフォルトの名無しさん:2008/12/12(金) 09:02:51
>>783
ありがとうございます
785デフォルトの名無しさん:2008/12/12(金) 13:57:36
これをコンパイルしたEXEファイルが120KBくらいになったんだけど何故?

#include<stdio.h>

int main()
{
int a;
printf("hello\n");
scanf("%d", &a);
printf("%dと入力されました\n",a);
return 0;
}
786デフォルトの名無しさん:2008/12/12(金) 14:11:30
BCCで65KBなんだけど、なぜ?
787デフォルトの名無しさん:2008/12/12(金) 14:28:07
↓以下、Win32 や Mac OS X での報告が続く。
788デフォルトの名無しさん:2008/12/12(金) 14:32:55
VC++6.0です
789デフォルトの名無しさん:2008/12/12(金) 14:37:06
コンパイラの性能やリンクするライブラリ、ファイル形式、OS、CPUなどなど
オブジェクトの大きさの要因は多岐に渡ります。
790デフォルトの名無しさん:2008/12/12(金) 14:40:28
開発環境によって、生成されるバイナリーデータのファイルサイズに差はあるよね。
VC++でやると、他と比べて妙に大きいような・・・。色々とリンクされているせい?
791デフォルトの名無しさん:2008/12/12(金) 15:08:06
>>782
int puts()
これは、puts()がintであって、putsはintになる(つまり、intを返す)関数であるという意味の宣言

char *gets()
こっちは、*gets()がcharであって、gets()がcharへのポインタであって、
getsがcharへのポインタになる(charへのポインタを返す)関数だということ
792デフォルトの名無しさん:2008/12/12(金) 15:11:15
>>791
わかりやすい説明ありがとう
793デフォルトの名無しさん:2008/12/12(金) 15:42:12
関数の再帰呼出しで
void Kaiki(int n)
{
if(n>1) Kaiki(n-1); ・・・(1)
printf("%3d",n);   ・・・(2)
}

(1)で引数n個分のKaiki関数を呼び出すのは分かるんですが
(2)の処理の流れがどうなっているのかが良く分かりません
何故(2)が引数の数だけ実行されるんでしょうか?
794デフォルトの名無しさん:2008/12/12(金) 15:52:11
呼び出した後、帰ってきたら、printfが実行されるだろ
printfにはifもelseも付いてないんだから、Kaikiが呼ばれればそれは必ず実行される
n回Kaikiが呼ばれてるのなら、printfもn回実行されてないとおかしい
795デフォルトの名無しさん:2008/12/12(金) 16:30:04
796デフォルトの名無しさん:2008/12/12(金) 16:40:58
ちょっと前に同じ様な質問あったんですね。失礼しました

>>795
分かりやすい解説レスを教えてくれてありがとう
797デフォルトの名無しさん:2008/12/12(金) 18:10:48
割り算の結果を小数点以下50くらいまで表示したいのですがlong doubleを用いても途中で切り上げられてしまいます。
何か方法はないですか?私の書いたプログラムはこんな感じです。
#include <stdio.h>

int main(void)
{
int x,y;
scanf("%d",&x);
scanf("%d",&y);

printf("%50.49Lf",(long double)x/y);



return 0;
}
798デフォルトの名無しさん:2008/12/12(金) 18:21:18
デフォルトの浮動小数点数精度を上回る精度を出したいなら、
処理系ごとの方法を使ってより精度の高い実数型を使用するか、
あるいはそのための高度数値計算用ライブラリを導入するしかない
799デフォルトの名無しさん:2008/12/12(金) 18:25:52
>>797
そもそも long double 自体がそこまでの精度を持っていなく、
あってもせいぜい 19 桁くらいなのでその方法では無理
800デフォルトの名無しさん:2008/12/12(金) 18:29:26
>>797
単なる整数の割り算でいいなら自分で計算アルゴリズムつくれば?
紙に書いてやるのと同じ

printf("%d.", a/b);
for(i=0; i<50; i++){
a = 10*(a%b);
if(a == 0) break;
printf("%d.", a/b);
}
putchar('\n');

そういう手間がいやなら>>798
801797:2008/12/12(金) 18:34:14
>>798
>>799
>>800

アドバイスありがとうございます。
試してみます。
802デフォルトの名無しさん:2008/12/12(金) 18:51:54
803デフォルトの名無しさん:2008/12/12(金) 18:58:05
やべっ、charにsizeof(int)にしちゃったw
804797:2008/12/12(金) 18:59:26
>>802

すばらしい。
私もこんな完璧なプログラムをかけるように頑張ります。
805デフォルトの名無しさん:2008/12/12(金) 19:50:24
>>802
入力が負数だと、あれだね
806デフォルトの名無しさん:2008/12/12(金) 19:56:36
>>805
if(y==0 && x*y<0) return 1;
807デフォルトの名無しさん:2008/12/12(金) 19:57:38
if(n<1) return 1;
if(y==0 || x*y<0) return 1;
808デフォルトの名無しさん:2008/12/12(金) 20:26:32
一貫性を持つようにしたい。
freeするならする、しないなら徹底してしない。
callocは if(y==0) return 1; 後の方がいい。

一箇所で出来る処理は一箇所で行う。
 for(i=0; i<n; i++) {
  carry=x%y;

好みだが、最後にprintf("\n");欲しいな。
809デフォルトの名無しさん:2008/12/12(金) 20:28:17
 char *a;
 a=calloc(n,sizeof(int));
これはなぜ?
810デフォルトの名無しさん:2008/12/12(金) 20:35:10
811デフォルトの名無しさん:2008/12/12(金) 21:00:46
812デフォルトの名無しさん:2008/12/12(金) 21:02:01
813デフォルトの名無しさん:2008/12/12(金) 23:16:47
ファイルの読み書きで、
入力ファイル = ABCDEFGHIJ… とあったときに、
Dまで読み込んで出力ファイルに書き込んだとします。
その後、同一プログラム内でもういちど入力ファイルを読んだ場合、
Eから読み込むという形になりますか?それともファイルの先頭からですか?
もし後者であれば、前者で処理する方法を教えてください、お願いします。
814デフォルトの名無しさん:2008/12/12(金) 23:20:04
>>813
Eから読み込みます。
いったんファイルをクローズして再度オープンして読むと先頭から。
815デフォルトの名無しさん:2008/12/12(金) 23:22:38
>>813
入力ファイルをクローズしなかったら、続きから読み込みになるよ。
クローズして再オープンしたら先頭から読み込みになる。

ftell()とかで、読み込み位置を取得してそれを取っておいて、
再オープンしたときにfseek()で、またそこにファイルポインタを
もどせば続きから読める。
816デフォルトの名無しさん:2008/12/12(金) 23:26:19
課題で摂氏で入力して華氏に変換して表示するプログラム作ったんだが

main()
{
int number;
double f;
printf("摂氏を入力");
number = getchar();
F = (9.0/5.0) * number + 32.0;
printf("F = %d\n", F);
}
5を入れても0になったり1・・・になったり、
メチャクチャな数字が出るがどうすればいい?
817デフォルトの名無しさん:2008/12/12(金) 23:28:52
getchar が何をする関数か調べるといい
818デフォルトの名無しさん:2008/12/12(金) 23:29:25
>>816
>number = getchar();
これを
fgets(s, sizeof(s), stdin);
number = atoi(s);
にする。

char s[100]; の宣言も必要。
819デフォルトの名無しさん:2008/12/12(金) 23:30:30
>>816
numberは文字の数字のままだから、それを整数値に変換する必要がある

F = (9.0/5.0) * atoi(number) + 32.0;

でいいんんじゃまいか
820デフォルトの名無しさん:2008/12/12(金) 23:31:49
>>819
それはない・・・
821819:2008/12/12(金) 23:40:24
たしかにorz
822デフォルトの名無しさん:2008/12/12(金) 23:55:38
>>814,815
ありがとうございます。わかりやすかったです!
ということは出力ファイルもクローズしなければ続いて書き込めると考えて大丈夫ですか?
823デフォルトの名無しさん:2008/12/12(金) 23:57:44
うい。
んで、書き込み位置を変えたければ fseek で移動すればいい。
824デフォルトの名無しさん:2008/12/12(金) 23:59:04
>>823
助かりました、どうもありがとうございました。
825デフォルトの名無しさん:2008/12/13(土) 00:11:58
>>815
「Dまで読んだ」ことをアプリケーション側で把握できているのだから、ftell()は感心しないな。
一度クローズしてしまったファイルを再度オープンしたときに全く変わっていないことを保証するのは
ロジックでは不可能だし、運用上も大きな制限となりかねない。
826816:2008/12/13(土) 00:19:14
>>818>>819
一応温度なので出力は実数で測るそうなのですがそちらの方は?
827デフォルトの名無しさん:2008/12/13(土) 00:20:33
sscanf を調べれ
あるいは strtod
828デフォルトの名無しさん:2008/12/13(土) 00:24:40
>>825
変わっているか変わっていないかってそれこそ運用の問題だろ。
fopen()でオープンしたら、閉じなくても、ファイルが変わらない保証なんてないし。
829デフォルトの名無しさん:2008/12/13(土) 00:33:11
>>828
いいえ、まともなOSならオープンしているファイルが勝手に変わらないことを保証してくれます。
尤も、ブロックデバイスであることを保証してくれるわけではないのでいつでもシークできるわけではないのですが。
830デフォルトの名無しさん:2008/12/13(土) 00:36:47
いやいやいやいや。
共有制御なんて fopen ごときがやってくれないぜ。
831デフォルトの名無しさん:2008/12/13(土) 00:38:06
>>829
適当なこと言うなよ。
最近、しったかで断言するやつよく見るな。
832デフォルトの名無しさん:2008/12/13(土) 00:38:51
いやいや、VCならロックオープンが基本だし、Unixはオープン中のファイルは削除されないから。
# 見掛け上は削除されても実はドライブを占有したままになる。
833デフォルトの名無しさん: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
834デフォルトの名無しさん:2008/12/13(土) 00:58:14
>>832
実験しました。
VCで数キロくらいのテキストファイルをオープン。
10バイトほど読み込み。(ファイルはオープンしたまま)
同じファイルをテキストエディタで開いて、内容を1バイトにして保存。
プログラムでリードを再開するとEOFが返ってきました。

変更可能ですね。
835デフォルトの名無しさん:2008/12/13(土) 01:00:13
突然 「fopen_s のことに決まってるだろ」 とか言い出すに一票
836デフォルトの名無しさん:2008/12/13(土) 01:10:24
これは失礼。fopen()でロックが掛かると思っていたのが間違いだったようだ。
普段使わん環境については黙ってた方が無難だったな。
837デフォルトの名無しさん:2008/12/13(土) 01:13:30
>>836
ま、そういうこともあります。話題を提供してくれてサンクス
838デフォルトの名無しさん:2008/12/13(土) 01:22:25
>>833
なるほど、hogeとbarはバッファリングされたまとめて出力されているな。
fclose()の順番を変えてしまうとhogebarになるよ。
839デフォルトの名無しさん:2008/12/13(土) 01:24:25
fopen_s のことに決まってるだろ
840デフォルトの名無しさん:2008/12/13(土) 01:54:23
>>810
っても年収600万弱っていいなあとおもうよ。
841デフォルトの名無しさん: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
842デフォルトの名無しさん: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
843デフォルトの名無しさん:2008/12/13(土) 02:18:10
>>842
そりゃぁ、rmした段階でエントリはなくなるんだから。実体が残り続けるってだけ。
試しに、巨大なファイルをオープンしておいてからrmして、その前後のディスク容量を較べてみ。
更に、ファイルをクローズしてからdfしたら何が起きているか判ると思う。
ファイルをオープンしてから削除しておいて作業ファイルとして利用し、クローズすると同時に消えてなくなるって言うのは昔から常套手段だよ。
844デフォルトの名無しさん:2008/12/13(土) 02:34:44
fopenするだけでロックかかるのってどの環境?
845デフォルトの名無しさん:2008/12/13(土) 02:56:56
>>844 しつこい
846デフォルトの名無しさん:2008/12/13(土) 09:58:12
Cの給料安いなオイwww
847デフォルトの名無しさん:2008/12/13(土) 13:31:35
>>846
そりゃC言語じゃ大したこと出来ないしな。

多層基板にLSIモジュールで組み立てる時代(.NET & C#)に、ラグ板に
ちまちまと抵抗やコンデンサを半田付け(C言語)をするようなものだし。
848デフォルトの名無しさん:2008/12/13(土) 17:35:10
ファイルから16bitモノラルのWAV音声データを読み込んでクロスフェードをかけるプログラムを
作っているのですが、つまづいてしまいました。
1サンプルごとに読み込んで、先頭nサンプルまではフェードイン処理、末尾nサンプルは
フェードアウト処理を行ってファイルに書き込むところまではできました。
ただそれを重ね合わせる上手い方法が思いつきません。
何か上手い方法があれば教えてください。お願いします。
849デフォルトの名無しさん:2008/12/13(土) 18:24:25
char str1[] = "mctest";
char str2[] = "mctest";
char str3[] = "a";
printf("memcmp() = %d\n", memcmp(str1, str2, sizeof(str1)+1));

とすると-1がプリントされました。
str3の宣言をコメントアウトすると0がプリントされました。
これはどういうことなんですかね?
char example[] = "name";
こういう宣言の仕方したら最後に'\0'が入りますよね?
だとしたらsizeof(str1)+1までstr1, str2を比較すると0が返ってくると思うんですが・・・
850デフォルトの名無しさん:2008/12/13(土) 18:26:03
>>849
printf("sizeof(str1)=%d\n",sizeof(str1));
851デフォルトの名無しさん:2008/12/13(土) 18:26:46
>>849
sizeofだと、0まで含めてのサイズになるんじゃね?
852デフォルトの名無しさん:2008/12/13(土) 18:33:28
>>845-851
うお・・・
strlenですよね、この書き方なら。

ありがとうございました!
853デフォルトの名無しさん:2008/12/13(土) 19:06:58
配列って型ごとに格納できる要素数って違いますよね?
int型ならn個まで…とかって決まってるんですか?
854デフォルトの名無しさん:2008/12/13(土) 19:10:35
違いませんよ
855デフォルトの名無しさん:2008/12/13(土) 19:17:43
>>854
あ、そうなんですか、格納できる1個あたりのサイズが違うだけなんですね
じゃあ格納できる要素数ってmallocとか使わなければメモリの許す限りなんですか?
856デフォルトの名無しさん:2008/12/13(土) 19:24:19
>>855
そうです
857デフォルトの名無しさん:2008/12/13(土) 19:24:23
ha?
858デフォルトの名無しさん:2008/12/13(土) 19:44:40
メモリが許しても、コンパイラや OS が許さないかもしれない。
859デフォルトの名無しさん:2008/12/13(土) 22:45:36
1-1
tarou 170.1 63.0
hanako 158.2 52.1




1-2
zirou 173.2 72.1




のような内容が書かれてあるテキストファイルがあるとします。
このとき最初のクラス(1-1とか1-2)をある変数に代入した後に
生徒それぞれをデータを取り出したいのですがどのようにすればいいのですか?
最初にクラスのデータ(1-1)を取り出した後に
while( fscanf( fp, "%lf%lf", &hight, &weight ) != EOF ){〜
としても次の1-2が来てしまうのでうまくいきません。

ちなみに各クラスの生徒数はファイルオープンしないと分からないものとして
うまくいく方法を教えてください。
860デフォルトの名無しさん:2008/12/13(土) 23:28:21
>>859
fgets()で1行ずつ読み込んで、適宜解析。
861859:2008/12/14(日) 01:25:31
>>860
具体的にお願いします。

それとまた質問です。
関数 read_fp(FILE fp, int i) 内で
if( fscanf( fp, "%s", class[i]) != EOF ){
while(fscanf( fp, "%s%d%d", name[i][j], &hight[i][j], &weight[i][j]) != EOF){
j++;
}
read_fp(fp, i++);
}
のように再帰的な感じでデータを入力しようとしてるんですが
>>859の例だと
文字リテラル、"1-2"の順番になっても
while内のfscanfがエラーとしてEOFを返してくれないため
うまくいきません。
アドバイスお願いします。
862デフォルトの名無しさん:2008/12/14(日) 01:45:58
>>861
再帰にした理由を、えーと、「具体的にお願いします」。
863デフォルトの名無しさん:2008/12/14(日) 01:56:43
>>859
■#classタグをつける

#class 1-1
tarou 170.1 63.0
hanako 158.2 52.1




#class1-2
zirou 173.2 72.1




■読み方
strcpy(class, "");
while (fgets(buf, BUFSIZE, fp) != NULL) {
if (strncmp(buf, "#class", 6) == 0) {
sscanf(buf, "%s %s", classtag, class);
} else {
sscanf(buf, "%s %s %s", name, height_s, weight_s);
height = atof(height_s);
weight = atof(weight_s);
printf("%s %s %g %g\n", class, name, height, weight);
}
}

864デフォルトの名無しさん:2008/12/14(日) 02:00:52
タグ#classをつけないなら
fgetss後のバッファに対し
n = sscanf(buf, "%s %s %s", s1, s2, s3)

nが1ならクラス、nが3なら生徒の身長体重データをみなす。;
865859:2008/12/14(日) 02:18:11
>>862
1-1の生徒分のデータを入力し終えたら
fscanf( fp, "%s%d%d", name[i][j], &hight[i][j], &weight[i][j]) == EOF
になってwhileを抜けて再帰することで
また最初のifからクラス名と1-2の生徒分のデータを入力しようとしたため。

>>863
学校の課題なので
ファイルオープンするファイルに直接編集することが出来ないんです。

>>864
とりあえずそれでやってみます。
今日はもう眠いのでまた明日の夜くらいに現れると思いますが
その時はよろしくお願いします。
ありがとうございました。
866デフォルトの名無しさん:2008/12/14(日) 02:41:39
普通は再帰を使うよりもループを使った方がいいケースだな。
867デフォルトの名無しさん:2008/12/14(日) 03:06:22
まあクラスの数がとんでもないことになったりはしないだろうけど
わざわざ再帰にする意味もないよねェ
868デフォルトの名無しさん:2008/12/14(日) 11:24:16
>>848
素人考えだけど32bitで演算するなら波を足して2で割ったらダメなん?
869デフォルトの名無しさん:2008/12/14(日) 14:24:07
>>868
波動の重ね合わせは足すだけでよい。2で割っちゃあかん。
>>848の質問はこういう物理的なことなのか、
それとももっとプログラム的なことなのかわからん。
870デフォルトの名無しさん:2008/12/14(日) 14:49:53
あぁ〜津波が入り江で高くなるんですもんね
平均してどうする俺orz
871デフォルトの名無しさん:2008/12/14(日) 17:16:02
津波は関係ないと思うが
872デフォルトの名無しさん:2008/12/14(日) 19:44:59
海岸が開放端で、反射波との重ね合わせで高くなっているという解釈もできるな。
まあ、底が浅いので高くなっているという解釈の方が普通だが。
873デフォルトの名無しさん:2008/12/14(日) 22:20:06
質問です
while文の条件が複数ある場合、どのように書いた方が解りやすいでしょうか?

例えば、
@aが3かつbが3
Acが5かつdが5
Beが10
@〜Bのいずれかの時while終了
の場合、

while( !((a==3 && b==3) || (c==5 && d==5) || e==10) )
と書くのか
while( !(a==3 && b==3) && !(c==5 && d==5) && e!=10 )
と書くのかどちらがわかりやすいでしょうか。
874デフォルトの名無しさん:2008/12/14(日) 22:25:14
上のほうがわかりやすいと思う
!の数が少ないから
875デフォルトの名無しさん:2008/12/14(日) 22:41:26
>>874
即レスありがとうございます。
876デフォルトの名無しさん:2008/12/14(日) 22:44:36
>>871>>872
ヒント: 波は海中にも発生し海底でも反射する
877デフォルトの名無しさん:2008/12/14(日) 23:10:24
gets(buf)
のように標準入力から入力するときに、
入力部分にあらかじめ文字列を表示させておくことは可能ですか?
たとえば
・入力部分に最初から「cd /」と表示されている
・「/」の後ろから入力することができる
・バックスペースキーを連打すれば「cd /」の部分まで消すことができる
・「cd /home」と入力すればhomeだけでなく全文(cd /home)がbufに取り込まれる
のような感じです。
878デフォルトの名無しさん:2008/12/14(日) 23:27:35
環境依存の方法になるな
879デフォルトの名無しさん:2008/12/14(日) 23:40:50
>>878
書き忘れていました、すみません。
Linuxです。
880デフォルトの名無しさん:2008/12/14(日) 23:49:51
>>879
標準関数だけではどうやってもできないから、適当なライブラリでも使ってくれ。
881デフォルトの名無しさん:2008/12/14(日) 23:50:22
curses だかncursesかねぇ
882デフォルトの名無しさん:2008/12/15(月) 00:02:54
>>880,881
ありがとうございます。
調べてみます
883デフォルトの名無しさん:2008/12/15(月) 00:12:43
>>877
Linuxならreadlineを使っとけ。
あと、getsは使うな。
884デフォルトの名無しさん:2008/12/15(月) 00:18:40
cursesってそういうのもできるんだ
885デフォルトの名無しさん:2008/12/15(月) 00:33:08
できるのかはともかくこのケースで勧めるのは間違ってるよな
886デフォルトの名無しさん:2008/12/15(月) 00:44:13
>>883
すみません、fgetsを使うようにします。
簡単に作れそうなのでreadlineを使ってみたいと思います。
ありがとうございました。
887デフォルトの名無しさん:2008/12/15(月) 02:19:17
>>876
ひんと:津波は足し合わせて高さ0になる普通の波とは違う
888デフォルトの名無しさん:2008/12/15(月) 09:54:11
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8321.c
ナショナルトレジャーを観て興味本位でプレイフェア暗号を作ってみたのですが
うまくいきません。
具体的にはinput1関数でセグメントエラーが出てしまいます。
getcharが問題かもです。
下手くそなプログラムですがどなたか解説お願いしたいです。
889デフォルトの名無しさん:2008/12/15(月) 11:09:44
手元にコンパイラないからあれだけど、
ぱっと見た感じkeyword_editがおかしいんじゃねえの。
明らかにzの大きさ超えて書き込んでるよね。
あまりに読みづらいからもうちょっと整理したほうがいいんじゃないかと思うけど。
890デフォルトの名無しさん:2008/12/15(月) 12:23:31
>>887
地球の自転でも地震でも波は波
行き場を失った物質の移動が波となる
それは海底や入り江や空気でも反射(反発)する
狭い場所に体積が増えるから高さが増すわけだが
水が増える仕組みは反射によって起きている
入り江で海底や岸に阻まれた波の一部は反射して海面を押し上げる
岸壁でしぶきが上がるのは岩壁に阻まれた波のお釣りが
空中に向かって反射しているから
引力が無ければ雫が宇宙に向かって飛んでいくだろう
891デフォルトの名無しさん:2008/12/15(月) 12:30:41
×行き場
○居場所
892デフォルトの名無しさん:2008/12/15(月) 12:40:23
引力がなければそもそも海が存在できない罠。
つーか、いい加減に板違いだってよ。
893デフォルトの名無しさん:2008/12/15(月) 12:43:49
理解できたようで何より
894デフォルトの名無しさん:2008/12/15(月) 14:28:12
>>843
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/remove.3.html
>名前がファイルへの最後のリンクであっても、どこかのプロセスがそのファイルを開いているなら、ファイルの最後のファイル記述子 (file descriptor) が閉じられるまでファイルは存在し続ける。

>名前が指しているのがソケット、fifo、デバイスなら、名前は削除されるが、そのソケットなどを開いているプロセスはそのまま使い続けることができる。

これか。
895デフォルトの名無しさん:2008/12/15(月) 17:33:38
char *Strcpy(char *str1,const char *str2)
{
char *p=str1;
while(*str1++=*str2++);
return p;
}

上の関数で(*str1++=*str2++)の演算子優先順位は調べると
(++)→(*)→(=)
になるので最初の一文字目のコピーがされないと思うんですが
何故ちゃんとコピーされるんですか?
896デフォルトの名無しさん:2008/12/15(月) 17:44:27
++が後置だから
897デフォルトの名無しさん:2008/12/15(月) 17:47:26
演算子の結合順はそれでいいんだけど、++がされるのはそれらの後なので
898デフォルトの名無しさん:2008/12/15(月) 18:16:37
>>896-897
素早い回答ありがとうございます
優先順位ばっかり気にしていたので分からなかったorz
899デフォルトの名無しさん:2008/12/15(月) 18:36:45
++が評価されるタイミングって正確にはどのへんなの?
900デフォルトの名無しさん:2008/12/15(月) 18:44:08
オセロのプログラムを作ろうと思っています。
StateはEMPTY, BLACK, WHITEの列挙体、
盤面には大域変数State Brd[8][8];を用意しています。
ポインタを勉強中なのでポインタを使って盤面の初期化をしたいのですが、
        State *p;
        for(p = Brd; p <= &Brd[Y][X]; p++)
                *p = EMPTY;
このときX, Yには7を入れるつもりだったのですが、
X, Yに12とか不正な値を入れてもエラーが出ません。
配列の外に代入していると思うのですがどうなんでしょう。
901デフォルトの名無しさん:2008/12/15(月) 18:50:19
Cでは配列外にアクセスしてもコンパイル時にはエラーが出ません。
自分で管理してください。
902デフォルトの名無しさん:2008/12/15(月) 19:12:23
代入演算子って

右側が先に評価されてから、左側が評価されるんですよね?
903デフォルトの名無しさん:2008/12/15(月) 19:15:39
>>899
正確なタイミングは決まっていない
式が終わるまで (式の途中に副作用完了点があればそこまで) のどこか
コンパイラの気分によって決まる
904デフォルトの名無しさん:2008/12/15(月) 19:16:27
>>902
決まっていない
どちらを先に評価するかはコンパイラの気分によって決まる
905900:2008/12/15(月) 19:20:19
>>901
わかりました
回答ありがとう
906デフォルトの名無しさん:2008/12/15(月) 20:20:04
srand(time(NULL))とrand()を使ってランダムな文字列を発生させる関数を作り、
その関数をfor文などで回してランダムな文字列をたくさん発生させたいのですが、
srand(time(NULL))だと短い時間で回すと同じ乱数の種が発生してしまいますよね?
どうすれば短い時間で回しても毎回違う文字列を発生させられるでしょうか?
907デフォルトの名無しさん:2008/12/15(月) 20:30:05
毎回種作らなければいいよ。というか普通は1回しか作らない
908デフォルトの名無しさん:2008/12/15(月) 20:34:11
あああああそうか!そういわれればその通りですね。
間抜けな質問をしてしまいました。ありがとうございます。
909デフォルトの名無しさん:2008/12/15(月) 20:34:58
srand は main の最初に1度呼ぶだけのもの。
何度も呼んではいけない。まともな乱数じゃなくなる。
910デフォルトの名無しさん:2008/12/15(月) 20:53:52
>>897
もうちょっと正確に言うと、値を取り出した後だからだな
911888:2008/12/15(月) 21:16:48
>>889
keyword_editは問題ないかと、、、

実行するとこんな感じなんですが
Please input keyword
playfair(入力)
p l a y f
i r b c d
e g h k m
n o q s t
u v w x z
Please input sentence
Abandonhopeallyewhoenterhere(入力)
セグメンテーション違反です
912デフォルトの名無しさん:2008/12/15(月) 22:02:14
>>911
デバッガでステップ実行すればいいだろうが
913デフォルトの名無しさん:2008/12/15(月) 22:24:04
>>911
 コードが汚いのは、関心しないけど。
code1内で初期化されていない変数によってjumpしてるとか愛用のコマンドが言ってくれたので、見てみたら
goto使っているところのif () を{ }で囲っていないみたい。
それをやって、入力文字列を全て小文字にしたら以下のようになると思うよ。

please input keyword
playfair
p l a y f
i r b c d
e g h k m
n o q s t
u v w x z

Please input sentences.
abandonhopeallyewhoenterhere
bhpqrtqenlhpyvaphugqnpnmbggiku
914デフォルトの名無しさん:2008/12/16(火) 00:25:15
ちょっと聞きたいんだが,クライアント・サーバでUDPでソケット通信を行う場合
クライアントからのメッセージに対してのレスポンスはそのソケットに対して返せばいいけど
サーバからメッセージを送りたい場合(複数の端末)はNATがなければホスト名を登録しているので
送信できるけど,NATが間にあるとポートの一致せず破棄される.

こういうサーバからメッセージを送る場合があるクライアント・サーバシステムは
クライアントから受信したソケットは接続してきた数だけ保持するやりかたをやってるの?
それとも他に方法ある?
915デフォルトの名無しさん:2008/12/16(火) 02:22:09
スレタイを256回音読してください
916デフォルトの名無しさん:2008/12/16(火) 02:34:32
C言語でやる方法が聞きたいんです
917デフォルトの名無しさん:2008/12/16(火) 02:35:10
そういうクライアントの例を挙げればいいと思うが、ポートを開けた経験はないの?

クライアントが、サーバに対して、俺このポート番号で待ってるから、と伝えておけば
そのポートを正しくクライアントにマップしておけば何の問題もない。
918デフォルトの名無しさん:2008/12/16(火) 02:35:42
(入門篇)という部分に注目すべきなんだろうけど、返事した手前どうしたものやら。
919デフォルトの名無しさん:2008/12/16(火) 02:37:51
>>916
一般的は方法はない
C言語にはソケットやポートはおろか、通信という概念すらない
要するに環境依存
920デフォルトの名無しさん:2008/12/16(火) 07:45:24
>>890
ソリトンってしらないのですか?中学生?
921888:2008/12/16(火) 09:07:44
>>912
>>913
ありがとうございます。
なんとか動作するようになりました。
922デフォルトの名無しさん:2008/12/16(火) 09:29:42
>>914
それは言語に依存しない、プロトコルの話。
ネットワークプログラミング相談室 Port22
http://pc11.2ch.net/test/read.cgi/tech/1222603744/l50
923914:2008/12/16(火) 12:41:59
あーちなみに916ではないんで・・・

>>917
ポートをあけるとはNATの?
それが出来ない環境だと,定期的にクライアントがUDPパケット投げてマッピング情報を保持させながら
そのソケットを用いてサーバから送信する方法しかないか・・・
924デフォルトの名無しさん:2008/12/16(火) 12:46:04
>>923
にほんごはよめますか?
>922がゆうどうさきをしょうかいしてくれていますよ。
925デフォルトの名無しさん:2008/12/16(火) 13:19:47
>>923
いろいろ分かってないことが多そうに思う。
ネットワークの勉強してから、かな。
926デフォルトの名無しさん:2008/12/17(水) 22:46:33
>>924
漢字を書けますか?読めますか?
927デフォルトの名無しさん:2008/12/17(水) 23:40:31
>>926
皮肉という言葉の意味は知っていますか?
928デフォルトの名無しさん:2008/12/17(水) 23:40:49
typedef struct _h h;
struct _h
{
int id
h *next;
h *prev;
};

nextとかprev使わないでリンクリスト作る方法教えてください。
メモリが無駄なのでnextとprevを使わないでポインタのリスト作りたいです
929デフォルトの名無しさん:2008/12/17(水) 23:41:25
>>927
必死だなぁw
930デフォルトの名無しさん:2008/12/17(水) 23:42:54
リンクのないリンクドリストって・・・
931デフォルトの名無しさん:2008/12/17(水) 23:43:35
>>928
prev なくしてタン方向リストにするとか。
932デフォルトの名無しさん:2008/12/17(水) 23:48:55
きっと、ハイラル各地を冒険しているんだよ
933デフォルトの名無しさん:2008/12/17(水) 23:48:59
>>928
不可能である。糖分のない砂糖、演算装置のないコンピュータ、文法のない言語は存在しない。
934デフォルトの名無しさん:2008/12/17(水) 23:50:16
>>928
マジックリストというものがある
nextとprevが一つのポインタですむという摩訶不思議なリスト

まぁ
935デフォルトの名無しさん:2008/12/17(水) 23:51:02
XOR連結リストの出番だな。
代償に実行速度で物凄く損するだろうけど。
936デフォルトの名無しさん:2008/12/17(水) 23:53:42
プッチンプリンのプリンがじゃまなので無くしてくださいとグリコに
937デフォルトの名無しさん:2008/12/17(水) 23:54:34
効率悪いが、値とアドレス等でハッシュ生成
938デフォルトの名無しさん:2008/12/17(水) 23:58:50
>>928
そういうあなたのために配列があります。
939デフォルトの名無しさん:2008/12/18(木) 00:50:05
ハイレーツオブ初心者
940デフォルトの名無しさん:2008/12/18(木) 01:15:08
うるう年の判定でオーソドックスに考えると下のようになると思う
return (year % 400 == 0 || (year % 4 == 0 && year % 100));

ただ、大量の日付データを処理する上でもっと高速化できる
アルゴリズムがないだろうか
941デフォルトの名無しさん:2008/12/18(木) 01:16:27
テーブルを使う
942デフォルトの名無しさん:2008/12/18(木) 01:25:09
y%4!=0 の時点で弾く
以下、y%100!=0 または y%400==0 でおk
943デフォルトの名無しさん:2008/12/18(木) 01:42:17
>>940
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8387.c

試しに作って見た。もし処理に時間が掛かり過ぎるようなら、TIMESの値を適当に変えて。
944デフォルトの名無しさん:2008/12/18(木) 02:26:18
>>940
1901-2099年に限定した上で、4年に一度。
945デフォルトの名無しさん:2008/12/18(木) 19:35:24
質問なのですが、
今日の午前0時から、ある作業を何時間しているかを計る(経過時間)
プログラムを作りたいのですが、゙今日の午前0時〜゙を
どう、表現すればいいでしょうか?time関数を使うまでは
わかりました
946デフォルトの名無しさん:2008/12/18(木) 19:37:47
>>945
time
localtime
mktime
947デフォルトの名無しさん:2008/12/18(木) 19:44:58
サンクスです

あとは、自分で考えてみます
948デフォルトの名無しさん:2008/12/18(木) 20:24:41
やはり、わかりません…
1970年の午前0時になってしまいます、今日の午前0時は
どう、求まりすでしょうか?
949デフォルトの名無しさん:2008/12/18(木) 20:28:11
>>948
どこまで考えたのか書けよ
950デフォルトの名無しさん:2008/12/18(木) 20:46:41
なんかうまく言葉にできないけど、ある程度は考えました
どうやれば教えてください
951デフォルトの名無しさん:2008/12/18(木) 20:51:48
うまく言葉にできないなら1970年の午前0時になってしまったコードを書きなよ
952デフォルトの名無しさん:2008/12/18(木) 20:53:31
すいませんそれは無理なんです
953デフォルトの名無しさん:2008/12/18(木) 21:05:20
スイマセン、かなり初歩的な質問だと思いますが、宜しくお願いします。
static GLfloat a[6][3];

void hb(void){
for(m=0;m<6;m++){
normal[m][0]=???;
normal[m][1]=???;
normal[m][2]=???;
}
}
void dp(void){
//ここにhbの配列normal[][]を使いたいんです。
}

でも、普通に「normal[0]」と使っても0.0としか出てきません
どうしたらいいのでしょう
954デフォルトの名無しさん:2008/12/18(木) 21:20:58
いろいろ気になる点は多いが、normal[0][0]と使ってみたらどうなるのか、と聞きたい。
955デフォルトの名無しさん:2008/12/18(木) 21:23:13
>>953
複数の関数で同じ変数を操作するには、その変数をグローバルに宣言するか、
その変数へのポインタを関数へ与えるしかない
956デフォルトの名無しさん:2008/12/18(木) 21:38:28
>>954
0.0でした。
>>955
もしかして始めの関数外の配列normalがグローバルになってるからかも知れません
957デフォルトの名無しさん:2008/12/18(木) 21:46:22
わけわからん
とりあえずstatic GLfloat a[6][3];はstatic GLfloat normal[6][3];の間違いでいいんだな?
で、hbの中ではどういう値を与えたんだ?
ちゃんとdpより先に呼び出したんだろうな?
958デフォルトの名無しさん:2008/12/18(木) 21:51:41
>>956
はい、aじゃなくてnormalでした。
hbの中のはnormal[6][3]と同じ場所での配列を少し弄った値を入れてます。
959デフォルトの名無しさん:2008/12/18(木) 21:52:40
今一状況をうまく説明できないのでもうちょっと自分でやってみます
色々すいませんでした。
960デフォルトの名無しさん:2008/12/18(木) 23:20:06
質問です。

入力を、コマンドプロンプトで


”C:\>sample1.exe
10 40 60”
と横に空白を空ける感じでやりたいのですが

scanf("%d %d %d", n,m,l)

であっていますでしょうか?
961デフォルトの名無しさん:2008/12/18(木) 23:22:04
>>1
H8は分かりますか?
962デフォルトの名無しさん:2008/12/18(木) 23:23:55
>>960
&つけろよ、 int 型へのポインタだったりしない限りは、 あとスペースは別になくてもいい
scanf("%d%d%d", n,m,l)
963デフォルトの名無しさん:2008/12/18(木) 23:27:40
>>962
ありがとうございます。

では、こうでしょうか?
scanf("%d%d%d", &n,&m,&l) ;
964デフォルトの名無しさん:2008/12/19(金) 00:02:50
scanfの書式指定にはスペースを入れたほうが圧倒的に良い。
scanf("%d %d %d", &n, &m, &l);
965デフォルトの名無しさん:2008/12/19(金) 00:21:36
圧倒的とか、良いとか、動作に直接影響がないのに、個人的な主観を言われても
納得させられないよ。自分にとって「美味しい食べ物」が、必ずしも万人に共通するとは
限らないように。
966デフォルトの名無しさん:2008/12/19(金) 00:21:47
scanf()系の書式は元々空白文字(スペース、タブ、改行)で区切られると言う側面を持っているので
敢えて空白を空けないと言うのも一つの見識だと思う。
少なくとも、根拠も提示せずに「圧倒的」と言われても同意しかねる。
967デフォルトの名無しさん:2008/12/19(金) 00:22:52
そう、最終的には処理結果が物をいう。
968デフォルトの名無しさん:2008/12/19(金) 00:29:49
scanf("%d%d%d", &n, &m, &l)とscanf("%d %d %d", &n, &m, &l)のちがいは?
969デフォルトの名無しさん:2008/12/19(金) 02:03:48
無い
970デフォルトの名無しさん:2008/12/19(金) 02:31:48
無い。だから、個人的な主観で、圧倒的だの良いって話が、
何を基準にそう言えるのか?って思われるのだよ。自分はそう思う、けど
動作に違いは無い、そう言えば良い。本当に違いが有るなら、説明すべき。
971デフォルトの名無しさん:2008/12/19(金) 02:58:58
scanf("%s%s%s", a, b, c)とscanf("%s %s %s", a, b, c)でも挙動同じ?
972デフォルトの名無しさん:2008/12/19(金) 03:03:46
空白文字に対する挙動が違うのは%cだけ
973デフォルトの名無しさん:2008/12/19(金) 03:20:54
いや、"%[...]"の前後でも違ってくるよ。
あと、"%d"と"%d "も違う。
974デフォルトの名無しさん:2008/12/19(金) 07:32:17 BE:198810037-PLT(40040)
次スレ立てました
C言語なら俺に聞け(入門篇) Part 41
http://pc11.2ch.net/test/read.cgi/tech/1229639514/
975デフォルトの名無しさん:2008/12/19(金) 09:39:38
>>974

ポイント欲しい?
976デフォルトの名無しさん:2008/12/19(金) 11:58:45
あ?
977デフォルトの名無しさん:2008/12/19(金) 12:13:20
8*8の升目を出力するプログラムなんですが、
#include<string.h>
#include<stdio.h>
char yoko[50];
char tate[50];
int main(){
strcpy(yoko,"*-----*-----*-----*-----*-----*-----*-----*-----*"); //初期化
strcpy(tate,"| | | | | | | | |"); //初期化
978デフォルトの名無しさん:2008/12/19(金) 12:15:07
/*すごく強引な方法*/
printf("%s\n",yoko);
printf("%s\n",tate);
printf("%s\n",tate);
printf("%s\n",tate);
printf("%s\n",yoko); //1
printf("%s\n",tate);
printf("%s\n",tate);
printf("%s\n",tate);
printf("%s\n",yoko); //2
    ・
           ・
           ・
       8まで続く
return(0);}

これでいちお出力できましたが、あまりに強引すぎるので、もうちょっと技巧的に書けませんか?
979デフォルトの名無しさん:2008/12/19(金) 12:26:44
繰り返しの処理にはwhileかforを使うといい
980デフォルトの名無しさん:2008/12/19(金) 12:27:48
printf("%s\n",tate);
printf("%s\n",tate);
printf("%s\n",tate);
printf("%s\n",yoko);

このまとまりを、1つのループと考えればできそうですね。
有難うございました。
981デフォルトの名無しさん:2008/12/19(金) 13:24:04
ああ、次は横方向のループだ・・・
982a:2008/12/19(金) 13:27:54
int i, j, k;
for(j = 0; j < 8; j++) {
for(i = 0; i < 8; i++) printf("*-----");
printf("*\n");
for(k = 0; k < 3; k++) {
for(i = 0; i < 8; i++) printf("|   ");
printf("|\n");
}
}
for(i = 0; i < 8; i++) printf("*-----");
printf("*\n");
983デフォルトの名無しさん:2008/12/19(金) 20:13:05 BE:340815694-PLT(40070)
>>975
下さい
984デフォルトの名無しさん:2008/12/19(金) 21:17:18
985デフォルトの名無しさん:2008/12/20(土) 00:40:46
少数が循環小数だとみわけるにはどうやって判定するん?
プロ教えて?
986デフォルトの名無しさん:2008/12/20(土) 00:44:30
マルチおつ
987デフォルトの名無しさん:2008/12/20(土) 00:52:24
ウメ
988デフォルトの名無しさん:2008/12/20(土) 00:52:37
なんか、求めるコードが前に出たような。宿題スレだったかな?
循環し始めたのを確認するのに、前に出た数値を記憶して、
同じのが出た時点でストップ。その区間を表示。
989デフォルトの名無しさん:2008/12/20(土) 00:57:42
埋め
990デフォルトの名無しさん:2008/12/20(土) 01:22:31
紀州梅
991デフォルトの名無しさん:2008/12/20(土) 01:24:11
家の冷蔵庫にあるのは、南甲梅ですが、何か?
992デフォルトの名無しさん:2008/12/20(土) 01:25:10
平安京エイリアン
埋め
993デフォルトの名無しさん:2008/12/20(土) 01:39:58
鰯の梅肉煮がたべたいが
鰯がいない…
どこへいったんだよ><
994デフォルトの名無しさん:2008/12/20(土) 02:43:59
>>985
プロに頼むってことは
報酬を出すということだな

いくら出す?
995デフォルトの名無しさん:2008/12/20(土) 02:52:36
>>994
女と一発でどう?
996デフォルトの名無しさん:2008/12/20(土) 02:55:57
>>995
おまいは女なら誰でもいいのか
997デフォルトの名無しさん:2008/12/20(土) 02:58:50
相手を見て言葉を選びなお嬢ちゃん
5000万フェザーだ
998デフォルトの名無しさん:2008/12/20(土) 10:17:24
ume
999デフォルトの名無しさん:2008/12/20(土) 10:18:33
ガンガンいこうぜ
1000デフォルトの名無しさん:2008/12/20(土) 10:19:04
いのちだいじに
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。