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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

C言語なら俺に聞け! Part 110
http://pc8.2ch.net/test/read.cgi/tech/1120596481/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:2005/07/18(月) 12:42:52
>>1
おつ
3デフォルトの名無しさん:2005/07/18(月) 14:19:44
>>1
乙華麗
4デフォルトの名無しさん:2005/07/18(月) 16:17:57
mallocで確保したメモリブロックをfreeした後、本当にそのメモリブロックが
解放されているのか確認する方法はありますか?
5ヒットマン:2005/07/18(月) 16:22:30
はじめまして!!まだC言語を、勉強して1ヶ月です。
ちょくちょく、質問をするのでよろしくおねがいします。
6デフォルトの名無しさん:2005/07/18(月) 16:33:14
>>4
標準Cの範囲内では無理。
7デフォルトの名無しさん:2005/07/18(月) 17:07:04
↓ビッ(ry
8デフォルトの名無しさん:2005/07/18(月) 17:59:38
9デフォルトの名無しさん:2005/07/18(月) 18:15:21
>>7
ワロス
10デフォルトの名無しさん:2005/07/18(月) 18:31:07
>>5
どうぞ。
11デフォルトの名無しさん:2005/07/18(月) 18:57:16
ソース読んで勉強したいんですけど、よさげなソースを公開してるサイトみたいなのありますかね?
12デフォルトの名無しさん:2005/07/18(月) 18:57:39
0<=x<=1とし、
f(x) を考えます。
f(x) は、0<=x<1/2 では2*xを返し、 1/2<=x<=1では(-2x+2)を返します。
x_n+1 = f(x_n) とし、n=0から次々と計算をさせていくプログラムをC言語で作りました。

初期値x_0 を 0<=x_0<=1 の範囲から手入力させて、適当な回数分、計算結果を出力
させています。今は100回ほど計算を行っています。

(範囲内で)どんな初期値を与えても、ある回数計算をするとxが必ず0になるのですが、
これはどうしてなのでしょうか?初期値を0.1や0.2など比較的綺麗な数値にすると、f(x)
の計算ごとに0.4と0.8の表示を繰り返します。計算回数を重ねると
0.799999、0.400002、0.800003・・・と値が崩れていき、最終的には、0.406250、0.812500、
0.375000、0.750000、0.500000、1.000000、0.000000、0.000000、...
と0に落ちてしまいます。初期値に関わらず、です。
どうしてなのでしょうか?お願いします。
1312:2005/07/18(月) 19:00:09
なんだか表現が可笑しいので追加書き込みをしておきます。
初期値を0.1や0.2などにとると、0.4 0.8 の繰り返しをするようになり、最終的に0に落ちます。
初期値を0.23423など綺麗でないものにすると、0.4 0.8 0.4 ...のような周期的な解は出てきませんが、
最終的には(いきなり)0に落ちるのです。
お願いします。
14デフォルトの名無しさん:2005/07/18(月) 19:04:19
>>12
きれいな二進数の値に書きなおせるかどうかが問題だと思うよ。
15デフォルトの名無しさん:2005/07/18(月) 19:21:15
>>12
例えば0.1は2進数では
0.0001100110011…
と循環小数になるから、正確に表すことが出来ない。
んで計算を繰り返すと誤差が積もり積もって変な値になっちゃうと
1611=12:2005/07/18(月) 19:21:55
>>14
レスありがとうございます。
計算機誤差ということですね。しかし、なぜ0に落ちてしまうのでしょうか?
今、ふと思いついたことを書きます。

f(x) = 0 となるには、 x = 0, 1
f(x) = 1 となるには、 x= 1/2
f(x) = 1/2 となるには、 x = 1/4, 3/4
f(x) = 1/4 となるには、 x = *, *
f(x) = 3/4 となるには、 x = *, *
f(x) = * となるには、 x = *, *
...

これを逆に考えると、xが「ある数値」になった途端にその解は1に集束してしまい、次いで0
に落ちてしまうことが分かります。仮に0.4 0.8 0.4 の繰り返しとなる写像であっても、計算機
の計算誤差により、上の「ある数値」になってしまい、0に落ちてしまう。
どうでしょうか?
1711=12:2005/07/18(月) 19:22:38
>>15
ありがとうございます。>>16のような解釈で宜しいでしょうか?
18デフォルトの名無しさん:2005/07/18(月) 20:17:14
このプログラミングがわかりません!

入力された順番とは逆順に線形リストに格納し、そのたびにリスト全体を印字する
プログラムを作成せよ。入力データは正の整数とし、負の数の入力により入力終了とする。
次に、再び入力を受け付け、入力されたデータと一致するデータを線形リストから取り除く
プログラムを作成せよ。

よろしくお願いします。
1918続き:2005/07/18(月) 20:22:11
実行例:
リストに追加するデータを入力して下さい:3
list = 3
リストに追加するデータを入力して下さい:2
list = 2 3
リストに追加するデータを入力して下さい:4
list = 4 2 3
リストに追加するデータを入力して下さい:1
list = 1 4 2 3
リストに追加するデータを入力して下さい:3
list = 3 1 4 2 3
リストに追加するデータを入力して下さい:-1
list = 3 1 4 2 3
リストから削除するデータを入力して下さい:4
list = 3 1 2 3
リストから削除するデータを入力して下さい:5
list = 3 1 2 3
リストから削除するデータを入力して下さい:3
list= 1 2
2015:2005/07/18(月) 20:24:13
>>17
多分そう。
ある数値ってのは2進数で正確に表せる数値
21デフォルトの名無しさん:2005/07/18(月) 20:24:46
そいつはC言語に限った問題じゃないし
2215:2005/07/18(月) 20:44:42
あ、そうか
だから必ず0に集束するのか…

>>12ってなんか有名な問題なんですか?
出典キボンヌ
23デフォルトの名無しさん:2005/07/18(月) 21:32:11
>>18-19
スレ違いだから今後は宿題スレへ行くように。今回は特別だぞ。
尚、質問は受け付けない。自分で理解してくれ。
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
  struct list { int val; struct list *next; } *head = 0;
  int len = 0;
  for (int x; printf("リストに追加するデータを入力して下さい:"), scanf("%d", &x), 0 <= x;) {
    head = realloc(head, sizeof *head * ++len);
    head[len - 1].val = x;
    for (int i = len - 1; 0 <= i; i--) {
      printf("%d ", head[i].val);
    }
    putchar('\n');
  }
  for (int x; printf("リストから削除するデータを入力して下さい:"), scanf("%d", &x), 0 <= x;) {
    for (int i = len - 1; 0 <= i; i--) {
      if (head[i].val == x) {
        head[i].val = -1;
      } else if (head[i].val != -1) {
        printf("%d ", head[i].val);
      }
    }
    putchar('\n');
  }
}
2417:2005/07/18(月) 21:36:12
>>20
ありがとうございます。
これは数学の最後の授業で「試験範囲まで終わったから」ということで教わったものです。
どのような挙動を示すのかなと、少しくらいは書けるC言語でプログラムを書いてみたところ、
初期値にかかわらず0に落ちたのです。気になって質問をしてみました。
先生は、「テント型写像」と言っていました。

「テント型写像」でググってみましたが、2件しか引っかかりませんでした。
ちゃんとした名前では無いのかもしれません。
25デフォルトの名無しさん:2005/07/18(月) 21:41:31
>>23
構造体listのnextメンバが無意味だし
26デフォルトの名無しさん:2005/07/18(月) 21:44:23
>>25
マジレスされてもな...
27デフォルトの名無しさん:2005/07/18(月) 21:51:33
>>16
減算によって有効桁数がどんどん減っていくから
という方が正しい。
28デフォルトの名無しさん:2005/07/18(月) 21:53:30
>>22
初期値に1/3(or2/3)を与えると2/3のまま誤差が拡散していく。
初期値に1/7(or2/7...)を与えると2/7, 4/7, 6/7で循環しつつ誤差が拡散していく。
for (ic = 0; va != 0; ++ic) {
int it;
va = 2 * (va < 0.5 ? va : (1 - va));
for (it = 0; it < sizeof(double); ++it) {
#if 0
printf("%02x", ((unsigned char *) & va)[7 - it]);
#else
printf("%02x", ((unsigned char *) & va)[it]);
#endif
}
printf(", %.15g\n", va);
}
こんなコードを書いてみると、引き算でビットが落ちる様子がよく見えるかも。
29デフォルトの名無しさん:2005/07/18(月) 21:56:48
>>18
#include <stdio.h>
#include <stdlib.h>
void main(void) {
  struct list { int val; struct list *next; } *head= 0,tmp=0;
  int len = 0;
  for (int x; printf("リストに追加するデータを入力して下さい:"), scanf("%d", &x), 0 <= x;) {
    tmp = malloc(sizeof(struct list));
    tmp->val = x;
    tmp->next = head;
    head = tmp;
    ++len;
    for (int i = len - 1; 0 <= i; i--) {
      printf("%d ",tmp->val);
      tmp = tmp->next;
    }
    putchar('\n');
  }
  for (int x; printf("リストから削除するデータを入力して下さい:"), scanf("%d", &x), 0 <= x;) {
    tmp = head;  
    for (int i = len - 1; 0 <= i; i--) {
      if (tmp->val == x) {
        tmp->val = -1;
      } else if (tmp->val != -1) {
        printf("%d ", tmp->val);
      }
    }
    tmp = tmp->next;
    putchar('\n');
  }
}
30デフォルトの名無しさん:2005/07/18(月) 22:47:20
>>23
ありがとうございました!
以後気をつけます。
31デフォルトの名無しさん:2005/07/18(月) 22:56:11
ネットワークアプリ(TCP-IPでソケットプログラミング)についての質問なんですが、
select関数を使って、データが送信されたかどうか毎回LOOPしてチェックしている
んですが、これって、回線切断時にもselect関数の戻り値が1になって返って
来てるみたいなんですがどういう事かよくわかりません。
データが届いている時しか戻り値が1ではないんですか?
32デフォルトの名無しさん:2005/07/18(月) 23:01:12
>>31
ネットワークプログラミングのスレの>>1くらい読めよ
33デフォルトの名無しさん:2005/07/18(月) 23:03:08
>>31
スレ違い
34デフォルトの名無しさん:2005/07/18(月) 23:55:19
tolowerって文字列には使えないんですか?
35デフォルトの名無しさん:2005/07/18(月) 23:57:53
>>34
文字列に使う
36デフォルトの名無しさん:2005/07/18(月) 23:59:09
>>34
"文字"に使う
37デフォルトの名無しさん:2005/07/18(月) 23:59:20
自分は今C言語を勉強しているのですが、C言語で作ったゲームなんかは、DOS窓からしか実行することができないんですか?
コンパイルして出来たexeファイルを普通にダブルクリックして実行したいんですが、それは無理でしょうか?
変な質問ですが誰か分かる方教えてもらえませんか?お願いします。
38デフォルトの名無しさん:2005/07/19(火) 00:00:36
>>37
コンパイルして出来たexeファイルを普通にダブルクリックして実行できますよ?
39デフォルトの名無しさん:2005/07/19(火) 00:10:29
>>38
即レスありがとうございます
でもそのファイルをクリックすると一瞬DOS窓があらわれてすぐ消えるんだけで、なにも変化がないんです
4034:2005/07/19(火) 00:10:54
>>35,36
えーと読み込んだ文字列を全てtolowerで返したいんですけど、どうすればいいんでしょうか?
41デフォルトの名無しさん:2005/07/19(火) 00:15:17
>>39
プログラムが正しく終了しただけです。問題無い。
42デフォルトの名無しさん:2005/07/19(火) 00:25:13
>>41
プログラム正しく終了したとゆうことは、そのゲームは実行されたとゆうことでしょうか?
もしprintfなどで何かを表示するプログラムの場合、それが実行されているとゆうことですが、どこに表示されているんですか?
43デフォルトの名無しさん:2005/07/19(火) 00:27:20
>>42
一瞬の間に出た窓に表示された
44デフォルトの名無しさん:2005/07/19(火) 00:32:21
>>43
あれは一瞬表示されていたんですか。ではそれをずっと表示させるとゆうのはできないんですか?
45デフォルトの名無しさん:2005/07/19(火) 00:36:40
>>44
ヒント:何か入力したら終了
46デフォルトの名無しさん:2005/07/19(火) 00:37:59
懐かしいな。俺にもこういう(>>39)時期があったよ。
47デフォルトの名無しさん:2005/07/19(火) 00:38:01
>>40
各々の文字にtolowerを適用したまへ
48デフォルトの名無しさん:2005/07/19(火) 00:46:30
>>46
なぜだか俺にはそういう時期がまったくありませんでした…
なぜだ
49デフォルトの名無しさん:2005/07/19(火) 00:47:35
それでは、プログラムの最後にscanfで入力を求めるようにすればいいんですか?
初心者な発想ですみません
50デフォルトの名無しさん:2005/07/19(火) 00:48:48
>>49
そんなもんで良いんじゃない?
51デフォルトの名無しさん:2005/07/19(火) 00:52:37
どうして getchar() より先に scanf() を教える人がいるんだろう?
52デフォルトの名無しさん:2005/07/19(火) 00:53:51
>>50
そうですか、ではその方法でやることにします。ありがとうございました
53デフォルトの名無しさん:2005/07/19(火) 01:00:13
>>51
「DOS窓がすぐに閉じる」って言っているレベルの人間に、新しいものを
教えてどうする?scanf知ってるならまずそっちを使わせておいて、不満を
感じ始めるくらいになったら自分で探し始めるだろうよ。
54デフォルトの名無しさん:2005/07/19(火) 01:01:45
>>48
MS-DOS時代にプログラム始めたから?
いや、俺がそうなんだけど
55デフォルトの名無しさん:2005/07/19(火) 04:26:12
変わりに答えてみる。

Turbo-Cで覚えたからな。
56デフォルトの名無しさん:2005/07/19(火) 08:07:59
>24
写像そのものはカオスの話で出てくると思う。
「テント写像」なら引っかかるね。
57デフォルトの名無しさん:2005/07/19(火) 12:15:39
もまいら、本当にDOS窓つかってんのか?
cmd.exeじゃねーのか?
58デフォルトの名無しさん:2005/07/19(火) 12:22:10
Turbo-C=厨房C=チューボーシー=チューボック=Tubo-C=チュボック=トゥボック

59デフォルトの名無しさん:2005/07/19(火) 13:57:38
お願いします  C言語なんですがこのプログラムの
大体の流れを教えてください。
Dim X(100)
INPUT N
For I = 1 To N
INPUT X(I)
Next I
For I=1 To N-1
For J=I+1 To N-1
If X(I)>X(J)
W=X(I)
X(I)=X(J)
X(J)=W
Next J
Next I
End
60デフォルトの名無しさん:2005/07/19(火) 14:11:51
質問です。
Visual c++6.0にてc言語のプログラムを作成中です。

検索プログラムを作成した際、最大表示件数を5件にし
↑↓キーでページスクロールさせるというのはいかにして作るのでしょうか?
教えていただけると幸いです。よろしくお願いします。
61釣られてみる:2005/07/19(火) 14:12:38
>>59
えーと、どこから突っ込んでいいやら……
・それはCではありません。
・ここはプログラムの流れを教えるスレではありません。
・要は入力数値をソートしているわけですな。
62デフォルトの名無しさん:2005/07/19(火) 14:13:05
>>59
Cじゃないし
63デフォルトの名無しさん:2005/07/19(火) 14:14:02
>>60
C言語の標準関数だけでは無理なので、該当スレへどうぞ。
・VCスレ
・初心者質問スレ
・MFCスレ
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
64デフォルトの名無しさん:2005/07/19(火) 15:09:48
ビットシフトについてお伺いしたいのですが、
ここでよろしいですか?

65デフォルトの名無しさん:2005/07/19(火) 15:10:37
ララァ?
662から始まる偶数を5個出力:2005/07/19(火) 15:16:11
#include <stdio.h>

void main(void)

{
int cnt,guusuu;

cnt=2;

  while(cnt<=5)
{
printf("%d\n",guusuu);
guusuu=guusuu*2;
cnt=cnt+1;

}

}
としたら、

-858993460
・・・(以下略)
とでてきた。

結果は
2
4
6
8
10
と出てくるはずなのに
67デフォルトの名無しさん:2005/07/19(火) 15:18:47
そんなはずねーw

guusuuの初期値はなんだ?
682から始まる偶数を5個出力:2005/07/19(火) 15:19:47
guusuuの初期値は、2です
69guusuuの初期値は?:2005/07/19(火) 15:21:14
70デフォルトの名無しさん:2005/07/19(火) 15:28:21
>>68

じゃ、その通りにしれ!
71デフォルトの名無しさん:2005/07/19(火) 15:28:24
guusuu=2;
cnt=1;
72デフォルトの名無しさん:2005/07/19(火) 18:00:36
変数の初期化しわすれたね。
でも、guusuuの初期値を2としても、結果は
2
4
6
8
10
にはなりませんよ。
73デフォルトの名無しさん:2005/07/19(火) 18:02:44
cntが2から始まってるのは直したのか?
74かあたん:2005/07/19(火) 18:20:33
画像処理の問題でC言語でネガポジ変換のプログラムを作ってもらいたいのですが。
お願いします。
75デフォルトの名無しさん:2005/07/19(火) 18:22:20
>>66
void main(void)
{
int cnt;

for(cnt=1;cnt<=5;++cnt)
{
printf("%d\n",cnt*2);
}
76デフォルトの名無しさん:2005/07/19(火) 18:26:57
画像処理ってやったことないけど、
全画素(要は画像全体)をビット反転させたらネガポジ変換になるんじゃないの。
77デフォルトの名無しさん:2005/07/19(火) 18:29:02
RGB
78デフォルトの名無しさん:2005/07/19(火) 18:51:17
C++で一次元静電粒子コードの作成&二流体不安定性シュミレーションの
プログラムを作成したいのですが、まったくわかりません。
だれか教えてください。
79デフォルトの名無しさん:2005/07/19(火) 19:16:39
>>78
スレ違い。
80デフォルトの名無しさん:2005/07/19(火) 19:46:51
>>78
それはもう板違いだろ。
物理板へ:http://science3.2ch.net/sci/
81デフォルトの名無しさん:2005/07/19(火) 19:57:02
具体的なアルゴリズムがわかっているなら、
それをCのソースで表現することは可能だけどね
82デフォルトの名無しさん:2005/07/19(火) 20:28:08
int a[10]={1,2,3,4,5,6,7,8,9,0},i=0;
for(;a[i];i++)
  printf("%d ",a[i]);

というforの書き方を見たのですが、これは不等号を使った条件式にするとどうなるのでしょうか
83デフォルトの名無しさん:2005/07/19(火) 20:33:17
for(;a[i] < 0 || 0 < a[i];i++)
84デフォルトの名無しさん:2005/07/19(火) 20:39:50
>>83
つまりfor(;a[i] != 0 ;i++)ということですね
どうもありがとうございました
85デフォルトの名無しさん:2005/07/19(火) 23:16:34
#include <stdio.h>
#define M 3
#define N 3

main(){
double i[M][N];

int a,b,c,d; /*カウンタ*/
for(a=0;a<M;a++){
for(b=0;b<N;b++){
c=a+1;
d=b+1;
printf("%d行%d列を入力",c,d);
scanf("%lf",&i[a][b]);

}
}
printf("%f %f %f\n%f %f %f\n%f %f %f\n",i[a][b]);
} 3行3列の行列の値を入力して表示させるプログラムなんですが、微妙に結果が変です。直してください
86デフォルトの名無しさん:2005/07/19(火) 23:21:57
>>85
printf()の書式で9個の値を表示するよう指定しているのに、値は
i[a][b]しか渡してない。しかもaとbが配列の範囲外。

87デフォルトの名無しさん:2005/07/19(火) 23:24:56
>>86
よく理解できないです。
88デフォルトの名無しさん:2005/07/19(火) 23:26:04
┐(´ー`)┌
89デフォルトの名無しさん:2005/07/19(火) 23:27:53
printf("%f %f %f\n%f %f %f\n%f %f %f\n"
,i[0][0],i[0][1],i[0][2],i[1][0],i[1][1],i[1][2],i[2][0],i[2][1],i[2][2]);
90デフォルトの名無しさん:2005/07/19(火) 23:28:51
>>89
もっと簡潔なかきかたはできないんですね?
91デフォルトの名無しさん:2005/07/19(火) 23:34:00
>>85
for(a=0;a<M;a++){
for(b=0;b<N;b++){
printf("%f ", i[a][b]);
}
putchar('\n');
}
92デフォルトの名無しさん:2005/07/19(火) 23:36:27
putcharとはなんでしょ?
93デフォルトの名無しさん:2005/07/19(火) 23:39:02
>>92
1文字をstdoutへ出力する。
putc(c)はprintf("%c", c);相当だと思えばいい。
94デフォルトの名無しさん:2005/07/19(火) 23:39:55
>>93
よくわかんないので89の書き方でいいや。ありがとうございます!
95デフォルトの名無しさん:2005/07/19(火) 23:45:52
ここまで馬鹿だと逆に潔くていいな。
96デフォルトの名無しさん:2005/07/19(火) 23:53:20
for(int i=0;i<100;i++)
i=i+1;

printf("%i",i);

禿藁
97デフォルトの名無しさん:2005/07/20(水) 00:13:19
C言語のコード読むときに役立つツールとか無いですか?
98デフォルトの名無しさん:2005/07/20(水) 00:17:36
>>97
GNU global
99デフォルトの名無しさん:2005/07/20(水) 00:23:03
>>96
コードの意図するところも、何がおかしいのかも判らん。
100デフォルトの名無しさん:2005/07/20(水) 08:17:58
>>99
スコープが可笑しいから、自信満々でコンパイルしたけどエラーが出たんだろうよ。
自分の馬鹿さに笑うしか無かったのさ。
101デフォルトの名無しさん:2005/07/20(水) 12:55:08
%iはいいのか?
102デフォルトの名無しさん:2005/07/20(水) 13:15:59
int ary[M][N];
int *p[M];
int i;

p[0] = (int *)malloc(sizeof(int)*M*N);
for(i=1;i<N;i++)
p[i-1]=p[i]+N;

動的に確保したメモリって二次元配列として扱うのは上の方法くらいしかないんでしょうか・・・
上の方法だとsizeof(int *)*Nバイト分メモリが無駄になるので好きではないんですが。
103デフォルトの名無しさん:2005/07/20(水) 14:07:49
それ二次元か?
104デフォルトの名無しさん:2005/07/20(水) 14:12:37
ごめん、*見えてなかった
105デフォルトの名無しさん:2005/07/20(水) 14:19:22
for(i=1;i<N;i++) p[i-1]=p[i]+N;

for(i=1;i<M;i++) p[i]=p[i-1]+N;
じゃないか
106デフォルトの名無しさん:2005/07/20(水) 14:21:06
int (*p)[N];
p = (int **)malloc(sizeof(int)*M*N);
107デフォルトの名無しさん:2005/07/20(水) 14:24:45
#define N 10
#define M 20

struct foo { int elem[N][M]; };

int* p = (int *)malloc(sizeof(int)*N*M);

((struct foo *)&p)->elem[i][j] = …

N, M がリテラルなら使えるかもしんない
108102:2005/07/20(水) 14:37:30
>105さん指摘のとおりです。
for(i=1;i<M;i++) p[i]=p[i-1]+N;
が正しいです。

>107さんそうですね。
構造体にして使えば動的メモリ確保でも二次元配列として使えますね。
ありがとうございます。構造体を利用しようと思います。
109デフォルトの名無しさん:2005/07/20(水) 14:46:07
構造体化できるのならハナッカラ動的確保できるわけでもある…
struct foo* p = (struct foo*)malloc(sizeof(struct foo));
110デフォルトの名無しさん:2005/07/20(水) 14:59:31
C言語で線とか点などのグラフィックを表示させるには、どのヘッダファイルを読み込めばいいんですか?
111デフォルトの名無しさん:2005/07/20(水) 16:41:10
>>110
標準のCではグラフィックはサポートされない。
環境依存
112デフォルトの名無しさん:2005/07/20(水) 16:48:16
if(a!=1||a!=2)

aが1または2でないときの条件の書き方はコレでOKですか?
113デフォルトの名無しさん:2005/07/20(水) 17:15:21
いきなりの書き込みお許しください
まことに申し訳ないですが、C言語で
「線形代数の方程式AX+XB=Q(すべてn×n)のx」を出力するプログラム、
もしくは
「AXA=A,XAX=X、AXの転置=AX、XAの転置=XAとなるX」を出力するプログラム
をお持ちの方はいませんか…?
いきなり書き込んで申し訳ありません。
114デフォルトの名無しさん:2005/07/20(水) 17:15:29
真にしかならねえよそれ
115デフォルトの名無しさん:2005/07/20(水) 17:28:21
>>112
ヒント:ド・モルガン
116デフォルトの名無しさん:2005/07/20(水) 17:29:06
あ、「・」はいらなかったねorz
117デフォルトの名無しさん:2005/07/20(水) 17:30:59
>113
それって一般化逆行列っていうやつかもな
118デフォルトの名無しさん:2005/07/20(水) 17:33:31
>>117
わかりますか・・・?
119デフォルトの名無しさん:2005/07/20(水) 17:36:54
>117
いや。。。
120デフォルトの名無しさん:2005/07/20(水) 17:45:31
>>119
そうですか、わかりました!またよろしくお願いします
121デフォルトの名無しさん:2005/07/20(水) 19:03:29
>>111
遅レスですみません
環境依存てことは、使っているコンパイラによって決まると言うことですか?
122デフォルトの名無しさん:2005/07/20(水) 19:05:38
>>121
違う。
123デフォルトの名無しさん:2005/07/20(水) 19:12:53
>>122
では、環境とは何の事を示すんですか?
124デフォルトの名無しさん:2005/07/20(水) 19:19:25
OSとかアーキテクトとかそれらに対応するライブラリとか、もちろんコンパイラによっても違う。
定義は知らんけど。
125デフォルトの名無しさん:2005/07/20(水) 19:28:43
ようするに、C言語ではいろいろ面倒な作業が必要ってことですかね
126デフォルトの名無しさん:2005/07/20(水) 19:35:59
>>125
そう結論付けられても困るな。
127デフォルトの名無しさん:2005/07/20(水) 19:37:01
コンパイラを動かす側と、生成された実行ファイルを実行する側とで
(OSとかが)異なる場合もあるから、さらにややこしい
128デフォルトの名無しさん:2005/07/20(水) 19:45:37
3次方程式を解くプログラム書くにはどうしたらいいでしょうか?
2次方程式は解の公式でできますけど
129デフォルトの名無しさん:2005/07/20(水) 20:16:15
>>128
4次までは公式あるよ。俺は知らんけど。
130129:2005/07/20(水) 20:20:50
3次、4次方程式の代表的な解法としてカルダノの解法、フェラリの解法がある、らしい。
131128:2005/07/20(水) 21:21:32
高校で習ったみたいに
ax^3+bx^2+cx+d=0となるxを探す方法では
かけないですかね?
132デフォルトの名無しさん:2005/07/20(水) 21:39:12
>>131
数値解析で近似解しか探せない。
つまり ax^3+bx^2+cx+d≒0 となる x は求まることもあるが
厳密に ax^3+bx^2+cx+d=0 となる x は求まらない (ことがほとんど)

# ところで数値解析法で3次方程式の実数解って有限時間内に求まる?
133デフォルトの名無しさん:2005/07/20(水) 21:48:00
>>132
解法みたけど良くわからない・・・無理だ
134デフォルトの名無しさん:2005/07/20(水) 21:50:27
まぁ、ニュートン法の出番かね。
いずれにしても、言語の話題からは逸れていくので後は
アルゴリズムスレなり数学板なりでどうぞ。
135デフォルトの名無しさん:2005/07/20(水) 22:07:25
x^(1/3)を求めさせる方法ってないんですか?算術関数sqrtは1/2乗だけですよね?
136デフォルトの名無しさん:2005/07/20(水) 22:15:33
pow
137デフォルトの名無しさん:2005/07/20(水) 22:59:15
三次方程式の解の公式はあるよ。かなりややこしいけど。
五次方程式以上の解の公式は作れないことが証明されているんだっけ?
138デフォルトの名無しさん:2005/07/20(水) 23:23:48
三次方程式 - Wikipedia
ttp://ja.wikipedia.org/wiki/%E4%B8%89%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F
カルダノの公式

四次方程式 - Wikipedia
ttp://ja.wikipedia.org/wiki/%E5%9B%9B%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F
フェラリの解法

五次方程式 - Wikipedia
ttp://ja.wikipedia.org/wiki/%E4%BA%94%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F
「5次より高次の方程式には一般には代数的解法は必ずしも存在しない。」
139デフォルトの名無しさん :2005/07/21(木) 01:58:08
2次元配列を1次元配列に直すのはどうすればいいのですか?
forを2回組むのはわかるのですが、中の処理の仕方がわかりません。
140デフォルトの名無しさん:2005/07/21(木) 02:05:27
>>139
もっと具体的に。
141デフォルトの名無しさん:2005/07/21(木) 02:23:35
int height;
int weight;
int pixels[];
int pixels2[][];
中略
for(int y=0; y<height; y++){
for(int x=0; x<width; x++){
pixels[ ]=pixels2[y][x];
} ~~~~~~~
}


となる予定なんですが、2次元配列を1次元配列に戻す式?がわからないんです。
142デフォルトの名無しさん:2005/07/21(木) 02:41:32
つpixels[ y*height+x]
143142:2005/07/21(木) 02:43:19
ボケた
つpixels[ y*width+x]
144デフォルトの名無しさん:2005/07/21(木) 02:46:51
わかりました。ありがとうございます!
145デフォルトの名無しさん:2005/07/21(木) 03:54:23
配列は連続したメモリ領域に確保される
配列は式の中ではポインタと同等である
たしかCの規約であったかと
つまり、無駄な領域使用と無駄なコピーをするのではなく

int* p_pixels = NULL;

p_pixels = *pixels2;

以降
p_pixels[y*width+x]
の様に使えば、
…これで一発ではないだろうか…
146デフォルトの名無しさん:2005/07/21(木) 05:35:24
あったっけ?そんな規約
147デフォルトの名無しさん:2005/07/21(木) 06:01:11
初心者です。失礼しますm(_ _)m
C言語で、例えば1〜5までの数字を改行ごとに

例1   |  例2
1,2,3   | 1,2
1,3,4,5 | 3,4
2,4 | 2,4,5

とこんな感じで出力したいです。
1行に出てくる数字の個数は、ランダムで(この例だと5以下ですが)、
その際、選ばれる数字もランダムで、同じ行に同じ数字は禁止。
後、同じ数字列も禁止(例:ある行が1,2,3で、それと別の行が1,2,3)。
できれば、数字の間にカンマをいれたいです。
どなたか分かる人がいれば教えて下さい。
Borland C++ 5.5.1 for Win32を使用してます。
148147:2005/07/21(木) 06:02:50
スイマセン。ずれてます_| ̄|○
例1
1,2,3
1,3,4,5
2,4

例2
1,2
3,4
2,4,5
です_| ̄|○
149デフォルトの名無しさん:2005/07/21(木) 07:53:16
初心者だろうと、否初心者だからこそ、スレ違い。
150デフォルトの名無しさん:2005/07/21(木) 07:55:49
すれ違いとかそれ以前に意味が分からないんだけどどういうことよ??
151デフォルトの名無しさん:2005/07/21(木) 13:16:02
しつもんです。
qsortをつかってソートするプログラムを作ったのですが
比較関数のなかでintを比較する場合と、floatを比較する場合では、
floatを比較するほうが時間が倍以上もかかってしまいます。
浮動小数点は==にならないということを聞いたので
int型の中身はかぶらないような数字にもしてみましたがやっぱり
floatのほうが時間がかかります。。
また比較関数が呼び出されている回数もfloatの時のほうが1.5倍くらい多いです。
理由がまったくつかめないです、どなたかお教えください。

152デフォルトの名無しさん:2005/07/21(木) 13:26:38
>>151
一般的に浮動小数点数の演算は整数型より遅い。
何故遅くなるかは環境依存。

浮動小数点数の演算をサポートしているCPU上で動作させれば速度が上がる'かも'しれない。
153デフォルトの名無しさん:2005/07/21(木) 13:30:03
浮動小数点演算をサポートしてないCPUを使う人が、
こんなとこで質問するもんかね・・・。

それはさておき、比較回数が多いってのはおかしい。
コードを見ないと何が問題なのかは分からんが。
154デフォルトの名無しさん:2005/07/21(木) 13:35:51
円周率を計算したいのですが、
#include<stdio.h>
#include <math.h>

int main(void)
{
int k;
double a,b,c,d,e,f;
a=0;b=0;c=0;d=0;e=0;f=0;


for(k=0;k<=1000000;k++)
{
f=1/pow(16,k);
b=4/(8*k+1);
c=2/(8*k+4);
d=1/(8*k+5);
e=1/(8*k+6);
a=a+f*(b-c-d-e);
}
printf("%f",a);
}
実行結果が4.0000となってしまいます。どこがおかしいかどなたか
教えていただけませんか?
155デフォルトの名無しさん:2005/07/21(木) 13:40:07
Hello, world 付近から勉強し直したら?
156デフォルトの名無しさん:2005/07/21(木) 13:46:25
英語がおかしいんですか?>>155
157デフォルトの名無しさん:2005/07/21(木) 13:47:03
>>154
計算時における情報の欠落ということに関して考えたほうがいい。
Cの四則演算は無限の精度を持っているわけではないのだが、
整数での割り算がどういう結果を招くかまったく知らないようだから、
基本がなっていないと思われます
158デフォルトの名無しさん:2005/07/21(木) 13:49:51
>>154
abcdが何になってるか一回一回printfしたら?
>>156
ハロワを知らないほどの初心者なのか?
159151:2005/07/21(木) 13:50:55
ソートの詳細は
long型の配列に、構造体のリストの先頭からアドレスを代入した配列で行っています。

qsort( Object , OBJEC_MAX , sizeof( long ) , 比較関数のアドレス );

比較関数
int compare( const void *x , const void *y ){
Count ++;
return ( ( POBJECT )( *( const long * )x ) )->a - ( ( POBJECT )( *( const long * )y ) )->a;

}
int compare2( const void *x , const void *y ){

Count ++;
return ( ( POBJECT )( *( const long * )x ) )->Length < ( ( POBJECT )( *( const long * )y ) )->Length ? -1 : ( ( POBJECT )( *( const long * )x ) )->Length > ( ( POBJECT )( *( const long * )y ) )->Length;
}
quick sort データ : 50000個 , 回数 : 10回
平均(int) 呼び出し回数 : 733630 , 時間 : 22
平均(float) 呼び出し回数 : 860843 , 時間 : 56

もう少し詳しく平均を取ってみたところ1.5倍は少し多すぎたようですがやはり
floatの比較関数のほうが呼ばれている回数は多いです。

160デフォルトの名無しさん:2005/07/21(木) 13:51:05
>>157
ホントにやり始めで基本全然なってないんです。
ごめんなさい>< 
計算の所をもっと細かく分けた方がいいのですか?
161デフォルトの名無しさん:2005/07/21(木) 13:51:58
>>156
脳みそ蛆わいてんのか?
162デフォルトの名無しさん:2005/07/21(木) 13:52:49
>>158
昔英語の教材でそれを使ってたのでそうだと思いました><
マジで初心者です・・・
163デフォルトの名無しさん:2005/07/21(木) 13:53:22
この流れで
>計算の所をもっと細かく分けた方がいいのですか?
何でこうなんのよ?
違う初級本かって勉強した方がいいよ
164デフォルトの名無しさん:2005/07/21(木) 13:56:30
>>154
#include <math.h>
4.0 * atan(1.0)
165デフォルトの名無しさん:2005/07/21(木) 13:57:46
>>159
intの方は同値のとき0を返すのに対して、
floatの方は0を返すことが無い。
166デフォルトの名無しさん:2005/07/21(木) 13:58:10
>>158
printfしたら0000000004.0000とか・・・根本的におかしそうですね・・・
>>163
ホントその通りです・・・
167151:2005/07/21(木) 13:59:23
>>165さん
それは疑ってみたのでintの値はかぶらない値にしてあります。
168デフォルトの名無しさん:2005/07/21(木) 14:01:53
>>164
一応やってみたのですが値は変わりませんでした。
ごめんなさい
4.0 * atan(1.0)
はどういう意味ですか??
169デフォルトの名無しさん:2005/07/21(木) 14:06:13
>>166
int k=1; 
double b; 
 
b=4/(8*k+1); 
printf("%f\n",b);
b=4.0/(8*k+1); 
printf("%f\n",b);

何故、答えが違うか分かったらまたおいで
170デフォルトの名無しさん:2005/07/21(木) 14:11:14
>>169
答え違いますね!?
でもなんか調べる所がわかったんで、浮動小数点の
所調べてきてみます!
親切にありがとうございました!
171デフォルトの名無しさん:2005/07/21(木) 14:37:22
>>170
自力解決しただろうけど、とりあえず。
b=4.0/(8*k+1);
c=2.0/(8*k+4);
d=1.0/(8*k+5);
e=1.0/(8*k+6);
右辺の計算で整数型しか使われてないので、除算部分で整数にまるめられてしまうわけ。
演算結果は演算に絡む型のうち、最も大きい数値を表現できる型に合わせられる。
172デフォルトの名無しさん:2005/07/21(木) 16:26:33
偶然にも質問がかぶりぎみなんですが,わからないので教えてください.


#include <stdio.h>
#include <cmath.h>

int main() {
inta = (int)(log(8.) / log(2.));

printf("%d\n", a);

return 0;
}

このプログラムを整数型へのキャストなしに実行すると,期待通り3が出ます.
ですが上のように整数型へキャストすると,2.8くらいの値になっているようなんです.
できればなぜなのか,またどうすれば期待通りに動いてくれるのかおしえてくらさい
173デフォルトの名無しさん:2005/07/21(木) 16:35:19
>>172
cmath.hじゃなくてmath.hな。C++標準ヘッダと混ざってる。
で、普通に3が出力されたが。
174デフォルトの名無しさん:2005/07/21(木) 17:50:51
>>168
> 4.0 * atan(1.0)
> はどういう意味ですか??

printf() でそのまま表示して見れ。
175デフォルトの名無しさん:2005/07/21(木) 17:57:42
整数型の2*300000の配列を用意したいんですが、
int a[2][300000]でいいですか?
この場合はmallocとかいらないですか?
176デフォルトの名無しさん:2005/07/21(木) 18:03:02
あんまり大きいサイズはそれだと確保に失敗することがあるから
mallocのほうがいい。mallocも必ず成功するわけではないが。
177デフォルトの名無しさん:2005/07/21(木) 18:05:42
スタックで2*300000っていけるのか?
うちじゃ無理だったがな。
178デフォルトの名無しさん:2005/07/21(木) 18:17:01
>>176-177
そのまま配列を宣言するとスタックに確保されるが、大きすぎるとダメ
そのときはmalloc使ってヒープにメモリ確保する、失敗する場合もある
ってことでしょうか?
179デフォルトの名無しさん:2005/07/21(木) 18:25:47
おすすめできないがコンパイラオプションでスタックサイズ変更とかの手段もある。
180デフォルトの名無しさん:2005/07/21(木) 18:27:07
たしかにそれはオススメできないな
181デフォルトの名無しさん:2005/07/21(木) 20:37:06
>>128

せっかくみんなが答えてくれたのに・・・
結局激しくマルチ、ハゲシク(・A ・)イクナイ!

計算アルゴリズム
http://pc8.2ch.net/test/read.cgi/tech/1090227743/796-803

ぼるじょあがC/C++の宿題を片づけますYO! 48代目
http://pc8.2ch.net/test/read.cgi/tech/1121471445/207
182デフォルトの名無しさん:2005/07/21(木) 22:30:06
前橋和弥のC言語ポインタ完全制覇の初版本を持っている人に聞きたいです。

85ページ
〜「関数へのポインタ」と「文字列リテラル」が、かなり近い領域にお
かれています。〜

の部分ですが、"関数へのポインタ"ではなく、"関数本体"の間違いではないで
しょうか?

知識があやふやな学生なので、正しいなら正しい、間違いならば間違いだという
知識を確定させたいので誰かお答えいただけませんか?
183デフォルトの名無しさん:2005/07/21(木) 23:05:36
メジャーな本なのか?
184デフォルトの名無しさん:2005/07/21(木) 23:07:19
>>182

関数本体とは、その関数の先頭ポインタ
つまり、関数へのポインタ
と +その関数のサイズ分のメモリ領域の事じゃないの?

84ページに"関数へのポインタ"が太字で書かれた以降に
その説明があるでしょ。
更に、86ページのFig2-3の図に"関数本体"がボリュームある四角枠で
記入されてるよね。

ポインタってのは、アドレスであって、
メモリの何処からココまでの領域って
ボリュームを示すものでは無いとおもうが…
185デフォルトの名無しさん:2005/07/21(木) 23:17:52
あー、みたみた。
「関数へのポインタ」=関数へのポインタ変数・・・では無く
「関数へのポインタ」=関数本体の先頭アドレス
と、書いてあるつもりっぽいね
186初心者:2005/07/21(木) 23:31:58
まじで初心者なんですがC言語などを機械が分かるようにするやつを何ていうんでしたっけ?_| ̄|○
187デフォルトの名無しさん:2005/07/21(木) 23:33:43
>>186
ひょっとして:コンパイラ
188初心者:2005/07/21(木) 23:35:25
そうでした_| ̄|○
windowsXPならコンパイラは何がいいですかね?
189デフォルトの名無しさん:2005/07/21(木) 23:38:13
コンパイラではないが
コンパイラを含む、総合開発環境って事で
C++.NET
190初心者:2005/07/21(木) 23:39:55
有料ですよね…。フリーソフトでありませんかね?
191デフォルトの名無しさん:2005/07/21(木) 23:41:11
検索しろよこのバカチンが!!
192初心者:2005/07/21(木) 23:42:23
すいません。プロの意見を聞きたくて…
193デフォルトの名無しさん:2005/07/21(木) 23:48:57
ちゃんと買ってきたほうがいいと思うよ。
ただで済まそうとすると、コンパイラを使えるように準備するだけで手間がかかる。
買ってくればCDを入れてインストーラの言うとおりにすればとりあえずなんとかなる。

学生ならVS spokeなんかが数千円くらいからあるはず。
194初心者:2005/07/21(木) 23:51:58
ありがとうございます!VS spoke買ってみようかな(*´∀`)
195デフォルトの名無しさん:2005/07/21(木) 23:53:27
無知で訊くと騙されますよ。なぜに、Cのスレで聞くのか。
Cを薦められるのではないですか。って、言おうとしたら
マルチだよ。上手に訊くようにしてください。
196デフォルトの名無しさん:2005/07/21(木) 23:54:33
って、あの”XP”は別人さん? もしかして
197初心者:2005/07/21(木) 23:59:56
いえ、僕ですw
何度も質問してすいませんが最後に一つ。
あとでちゃんと調べてみますけど、VS spokeはC言語ですか?
198デフォルトの名無しさん:2005/07/22(金) 00:06:21
VC++ VC# VB VJ#どれもある。
VC++はC++だけどもちろんCとしても使える。
199デフォルトの名無しさん:2005/07/22(金) 00:08:30
おまいら・・・そんなにVCスレの厨を増やしたいのか・・・
200初心者:2005/07/22(金) 00:08:56
本当にありがとうございました。今回の事を考慮してコンパイラ何にするか決めます
201デフォルトの名無しさん:2005/07/22(金) 00:25:57
spoke出たときにすぐ買ったがインスコ時間掛かるんで途中でやめた
202デフォルトの名無しさん:2005/07/22(金) 00:27:36
Cygwin入れろ
203デフォルトの名無しさん:2005/07/22(金) 00:31:25
bccが出ないのにワロタ
204デフォルトの名無しさん:2005/07/22(金) 00:35:24
char型の3次元配列 hoge[5][10][256];があった時
256入る領域が10個あってその文字配列が5つあると考えるんでしょうか?
strcpyしたときに先頭だけしかコピーがうまくいかず困っておりますだれかお助けください
while(idx<9){
strcpy(hoge[0][idx++],"ahya");
}
205デフォルトの名無しさん:2005/07/22(金) 00:53:01
>>204
どうしたいのよ?
hoge[1][][]にもコピーしたいの?
206デフォルトの名無しさん:2005/07/22(金) 00:54:45
>>175-180あたりのって簡単にいくならmallocなんかよりfopen
とか使うのが良いんじゃないか?
ランダムにアクセスしないのならそれほど速度落ちなさそう。
・・・試してないけど
207デフォルトの名無しさん:2005/07/22(金) 01:08:15
すまん、誰か>206が何を意図しているのか教えてくれまいか。
208デフォルトの名無しさん:2005/07/22(金) 01:10:53
>>207
推測だが。「データをメモリに置かずにファイルに置いておけば良い」かな
209デフォルトの名無しさん:2005/07/22(金) 01:13:03
ページファイルとごっちゃになってるに一票
210デフォルトの名無しさん:2005/07/22(金) 01:20:00
Cにtruncateという関数がありますが、
Perlのtruncateのような関数は、無いのでしょうか?

行ごとに文字長を詰めたい(余計な文字列を消したい)場合、どのように書けばよいのでしょうか?

現在は、rモードでファイルを読んで、wモードで上書きしていますが、
w+モードで開いて、書き込みまでしたいのです。
211172:2005/07/22(金) 01:27:28
>>173
まじですか?
私の環境だと2と出ます。
WinXP home+cygwin+gcc 3.3.3です。
誰か試してみてください!!
212デフォルトの名無しさん:2005/07/22(金) 01:33:34
gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)

2
213デフォルトの名無しさん:2005/07/22(金) 01:37:54
>>212
ありがとん。
なんで2なのか分かりますか?
214204:2005/07/22(金) 01:55:19
hoge[1][][]にはコピーしません
この場合hoge[0][0][]〜[0][9][]にahyaが入ると思ったんですが
[0][1][]からデータが入らないんです オネガイシマス
215≠212:2005/07/22(金) 02:05:48
>>213
恐らく、2.9999...が切り捨てられて2になったのかと。
仮令doubleの精度があってもlog(8)/log(2)では理論通りに3と言う訳にはいかないのでしょう。
216173:2005/07/22(金) 02:36:58
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
(↑VCTK2003のやつね)
Metrowerks CodeWarrior for Windows v8.3
ともに3になった。
217デフォルトの名無しさん:2005/07/22(金) 02:40:47
>>214
とりあえずどこで問題が発生するのかを確かめるために、
strcpyするごとにidxとhogeの内容を表示させてみたら?
デバッガ使えるのならそれ使ったほうが早いだろうけど。
218デフォルトの名無しさん:2005/07/22(金) 02:53:33
>>204
#include <stdio.h>
#include <string.h>
char hoge[5][10][256];
int main()
{
  int idx = 0;
  while(idx<9){ 
    strcpy(hoge[0][idx++],"ahya"); 
  }
  idx = 0;
  while(idx<9){ 
    puts(hoge[0][idx++]);
  }
  return 0;
}

[動作結果]
ahya
ahya
ahya
ahya
ahya
ahya
ahya
ahya
ahya

はいってるよ?
219デフォルトの名無しさん:2005/07/22(金) 03:13:28
Shift-JISで書き込まれたtextAを読み込み、
textBへShift-JISコードで表示させるにはどうしたらいいでしょうか?
220デフォルトの名無しさん:2005/07/22(金) 03:15:01
>>219
「textBへShift-JISコードで表示させる」という部分がどういう意味か
量りかねるし、スレ違い。
221デフォルトの名無しさん:2005/07/22(金) 03:17:36
>>220
あ、16進数"%X"って意味です。・゚・(ノД`)・゚・。
222デフォルトの名無しさん:2005/07/22(金) 03:29:53
>>221
fprintf()に何かご不満でも?
223デフォルトの名無しさん:2005/07/22(金) 07:16:14
while ((A = B[0][0]) < 300.0) {…処理…}
ってのは、AにB[0][0]を代入した後、Aが300未満ならループ続行って事ですか?
224デフォルトの名無しさん:2005/07/22(金) 08:51:37
>>223
そう
225デフォルトの名無しさん:2005/07/22(金) 09:48:03
>>204
hoge[0][1]にstrcpyしようとしてバスエラーで落ちるなら、ヒントはargv。
226デフォルトの名無しさん:2005/07/22(金) 10:19:53
構造体に格納した文字列を単語に区切って単語比較したいのですが、
どうやって文字列を単語に区切ればいいですか?
227デフォルトの名無しさん:2005/07/22(金) 10:30:45
strtok
228デフォルトの名無しさん:2005/07/22(金) 11:08:34
>>227
ありがとうございます
229デフォルトの名無しさん:2005/07/22(金) 12:30:40
strtok()をわざわざこれから覚えるくらいなら
sscanf()を駆使した方が……
230デフォルトの名無しさん:2005/07/22(金) 12:44:06
例外処理をしたいのですが、scanfで整数以外を取得したらエラーがでるようにしたいのですが。
どのように書くのが一番よいのでしょうか?
231デフォルトの名無しさん:2005/07/22(金) 12:45:15
>>230
そのまんまやないけ
232デフォルトの名無しさん:2005/07/22(金) 12:47:16
>>230
fgets()で文字列入力して、sscanf()かstrtol()で変換、戻り値などで異常を検出。
例えばscanf("%d", ...)すると数字以外の文字を入れた段階で処理が止まるぞ。
233デフォルトの名無しさん:2005/07/22(金) 13:53:13
>>232
結構うまくいきました。ありがとうございました。
234デフォルトの名無しさん:2005/07/22(金) 14:31:14
getopt_longを使用する際の
long_options[]の定義方法に関して質問です。

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getopt.3.html
の例を見ると、

static struct option long_options[]

と、staticが付いていますが、
staticは必須でしょうか?
staticにする必然性がよくわからないです。
235AAA:2005/07/22(金) 14:47:07
C言語の宿題スレはどこでしたっけ?
236デフォルトの名無しさん:2005/07/22(金) 14:49:27
>>234
必須じゃないけど、付けておくと毎回初期化しなくて(・∀・)イイ!!
237ttt ◆2kifrUvNoc :2005/07/22(金) 15:02:14
こんにちは。
他のところでもお聞きしたのですが、回答をもらえなかったのでこちらで
質問させていただきます。(この問題は一般的に難しいようです)
VisualStdio.NETでC言語でシリアル通信をしたいと思っています(RS232C)。
PCとH8との通信なのですが、H8には受け取ったデータをそのまま
返すプログラムが入っています。
まずPCからデータを送信して、H8から返ってきたデータを
printf文で表示したいと思っています。
下記のように書いたのですが、実行するとデバッグエラーと出てしまいます。
------------------------------------------------------------
#include   <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main(void){
HANDLE hComm;
DCB dcb;
char* pszBuf; /* 書き込みデータバッファ */
char* pszBuf2; /* 読み込みデータバッファ */
DWORD dwWritten; /* ポートへ書き込んだバイト数 */
DWORD Event;
DWORD dwCount; /* 受信データのバイト数 */
DWORD dwRead; /* ポートから読み出したバイト数 */

hComm = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

(次に続く)  (次に続く)
238ttt ◆2kifrUvNoc :2005/07/22(金) 15:03:39
GetCommState(hComm, &dcb); /* DCB を取得 */
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = EVENPARITY;
dcb.fParity = TRUE;
dcb.StopBits = ONESTOPBIT;
SetCommState(hComm, &dcb); /* DCB を設定 */

pszBuf="abcd"; //送信するデータ
WriteFile(hComm,pszBuf, strlen(pszBuf), &dwWritten, NULL);
WaitCommEvent(hComm,&Event,NULL);
ReadFile(hComm,pszBuf2,10, &dwRead, NULL);
printf("%s\n",pszBuf2);
CloseHandle(hComm);
}
-----------------------------------------------------
バグってしまう原因は
ReadFile の行の「(読み込みデータバッファ) pszBuf2」
のところだと思います 。
また、3つ目の引数の「10」のところもどう書いていいのか
よくわかりません。
WaitCommEvent と ReadFile の使い方もよくわかりません。
このコードを正しくする具体的なコードを教えて頂けると幸いです。
239デフォルトの名無しさん:2005/07/22(金) 15:24:47
スレ違い
240ttt ◆2kifrUvNoc :2005/07/22(金) 15:29:37
>>239
え? スレ違いなんですか?
C言語の質問をしたくてカキコしたのですが・・・
241デフォルトの名無しさん:2005/07/22(金) 15:30:20
VCスレにでもいっとけ。
242デフォルトの名無しさん:2005/07/22(金) 15:52:20
226ですがsscanfを用いてスペースもしくは:で区切って
単語に分けるにはどうかけばいいのですか?
strtokだとそれなりに出来ましたがsscanfだと動かない(つД`)
243デフォルトの名無しさん:2005/07/22(金) 15:59:48
>>237
mallocする癖を付けたほうがいい。
244デフォルトの名無しさん:2005/07/22(金) 16:38:21
>>242
何を困っているのか。
どう動くことを期待してどう書いたらどうなったのか。
%nについて調べると幸せになれるかもしれないけど的外れかもしれない。
245ttt ◆2kifrUvNoc :2005/07/22(金) 17:02:57
すいません。勉強してからまた質問します。
246デフォルトの名無しさん:2005/07/22(金) 18:02:24
>>242
%[^ :]
247デフォルトの名無しさん:2005/07/22(金) 18:58:22
>>242
#include <stdio.h>

int main(void)
{
  const char    *rest = "Stereotyped phrase : Hello C-World";

  for (;;) {
    int         stride = 0;
    char        word[64] = "";

    sscanf(rest, "%*[ :]%n", &stride);
    rest += stride;
 
    sscanf(rest, "%[^ :]%n", word, &stride);
    if (word[0] == '\0')
      break;

    rest += stride;

    puts(word);
  }

  return 0;
}
248デフォルトの名無しさん:2005/07/22(金) 19:50:15
c言語ってブーリン型導入しないのかあと、 //コメントも
249デフォルトの名無しさん:2005/07/22(金) 19:53:02
>>248
ヒント:ISO/IEC 9899:1999
250デフォルトの名無しさん:2005/07/22(金) 20:08:55
Cでラベル&goto を使うのは好ましく無いのでしょうか?

確か、最初に読んだ本にCでgotoは使うべきでは無い等と書かれていて、
それを鵜呑みにし、以来一度も使って来なかったのですが、他人のソース
見ると、よくエラー処理に、 関数の尻に error: 諸々解放とかやっていて、
楽で良いなぁとか思ってるんですが、やはり使わずに済むなら使わない
方が良いのでしょうか?
251デフォルトの名無しさん:2005/07/22(金) 20:19:14
gotoを使うべきでないのは、使うとプログラムを理解しづらくなることが多いから。
そうならない使い方なら問題ない。
252226:2005/07/22(金) 20:57:02
皆さん ありがとうございます。
構造体の中の文字列データ(10個ほど)を単語に区切ろうと思い

for(i=0;i<total;i++){
    while(list[i].title!=""){
sscanf(list[i].title,"%s",text);
}

とやってみましたが動きませんでした。
とりあえず>>247を参考にいじってみます。
253kuro:2005/07/22(金) 21:55:20
#include<stdio.h>
void main(){
int i,j;
char top[2][4]={{10,0},{10.34.0}},tail[2][4]={{0},{34,44,0}};
chara [15][100]={
"#include<stdio.h>",
"void main(){",
"int i,j;",
"char top[2][4]={{10,0},{10.34.0}},tail[2][4]={{0},{34,44,0}};",
"char a[15][100]={",
"};",
"for(i=0;i<=1;i++)for(j=0;J<5;j++){",
"printf(top[i]);printf(a[j]);printf(tail[i]);",
"}",
"for(i=1;i>=0;i--)for(j=5;J<13;j++){",
"printf(top[i]);printf(a[j]);printf(tail[i]);",
"}",
"}",
};
for(i=0;i<=1;i++)for(j=0;J<5;j++){
printf(top[i]);printf(a[j]);printf(tail[i]);
}
for(i=1;i>=0;i--)for(j=5;J<13;j++){
printf(top[i]);printf(a[j]);printf(tail[i]);
}
}


という実行すると自分とまったく同じものを表示するプログラムを見たのですが…
見やすいようにこれにインデントをつけようとしてもなかなかできません;
なんかあっちをやるとこっちが…みたいになってしまって(汗
どなたか手伝っていただけないでしょうか?><
254デフォルトの名無しさん:2005/07/22(金) 22:58:44
>>249
ヒントになってない。
255デフォルトの名無しさん:2005/07/22(金) 23:03:42
C99 言語仕様か拡大されてる
批判的な人多そう by高級アセンブラ
256デフォルトの名無しさん:2005/07/23(土) 00:10:21
すみません、浮動小数点に余り算を計算したいのですがどのようにするのがいいでしょうか?

printf("%lf \n", 5.3 % 2); と書くとエラーになってしまいまして・・・。
257デフォルトの名無しさん:2005/07/23(土) 00:13:03
>>256
use fmod()
258デフォルトの名無しさん:2005/07/23(土) 00:16:13
>>257
ありがとうございます!!こんな便利な関数があったとは・・・
259デフォルトの名無しさん:2005/07/23(土) 03:45:14
C言語って、やっぱいつか絶滅するのかな・・・
260デフォルトの名無しさん:2005/07/23(土) 09:29:22
>>0x100
ついでに言うと、printfのフォーマットに%lfは(少なくともC89には)無い。
間違える人が多いので、printfの%lfは%fとして解釈するようになってる場合が多いが。
261デフォルトの名無しさん:2005/07/23(土) 10:03:29
>>255
1番の謎が<tgmath.h>。やっていることはどうみてもオーバーロード。

けど変数宣言がブロック先頭に縛られないのは良かったと思う。その他C++から取り入れたものは悪くない。
long longやstdint.hあたりも当然OK。
個人的には複合リテラルはC++にも欲しい。
262デフォルトの名無しさん:2005/07/23(土) 13:45:32
warning: passing arg 4 of `separate_arg' makes pointer from integer without a cast
と言うwarningがでるのですが
よく意味が分かりません
shortで型宣言しているのですが、いけないのですか?
263デフォルトの名無しさん:2005/07/23(土) 13:55:44
4番目のseparate_arg がキャストもせずに整数からポインタにされてるぞ、おい。
264デフォルトの名無しさん:2005/07/23(土) 13:57:39
separate_argの4番目じゃないのか?
265262:2005/07/23(土) 14:00:44
ありがとう
単に型の問題じゃなくて、代入ミスでした
お手数をお掛けしました
266デフォルトの名無しさん:2005/07/23(土) 16:42:37
ポインタを関数の引数として渡すとき、
そのポインタの値(ポインタの指した先の値ではなくて)を変更しないのに
constをつけないことが多いのは、つけないほうがいい理由があるからなのですか?
それとも面倒臭いからですか?

例:
func(const char * str) はしっかりつけてコーディングしてるのに
func(char * const str) は書かれていないのを見かけることが多い希ガス・・・

いや、まあそんなこと言ったら
func(const int n) も大概ついてないな。

なぜ!?
267デフォルトの名無しさん:2005/07/23(土) 16:47:57
func(const char *str)ならば、関数先で渡した内容は変更されない。
もしかしたらとは思うが、ポインタをコピーして渡すわけだから、関数内で
strを変更しても、渡した側には影響はない。むしろ、
func(const char * const str)と書かれると、関数内でstrを動かせなくなって
不便になる。
268デフォルトの名無しさん:2005/07/23(土) 16:50:41
const な値渡しは const をつけてもつけなくても
シグネチャは同じ。例えば
void f(char* p);
void f(char* const p); // f(char* const) の再宣言
これは使う側に混乱を招くだけ
それに char* const p; の p 事態が変更されないというのに
呼び出し側が影響を受けたり依存したりすることはないので
役に立つ保証とは言えない
269デフォルトの名無しさん:2005/07/23(土) 16:51:45
s/f(char* const) の再宣言/f(char*) の再宣言
270デフォルトの名無しさん:2005/07/23(土) 16:59:35
>>267
const付けようが付けまいが、値渡しであることには変わらないのでは?
271デフォルトの名無しさん:2005/07/23(土) 17:04:20
>>267 >>268
回答どうもです。
いや、何ていうか、f(char * const str)っていうのは一番安直なケースで言うと関数内で
str = ...
とやるのを防ぐ(=つまり関数内のスコープでstrがポイントする場所を固定)って意味だと思うわけです。
なんか言葉遣いがうまくいかないな・・・
「ポイントする場所を固定」 != 「ポイントする場所にある値を固定」
ってのはわかってもらえるでしょうか?

呼び出し側に影響与えないってのはその通りなんですが、
要は、「関数内でstr = ... なんて間違い普通しないだろ!」っていうのは、
constつけるの面倒くさいからってことになるのでは!?という気がするのです。
他にconstをつけることによる害がないなら、積極的につけるべきではないかと。
272デフォルトの名無しさん:2005/07/23(土) 17:07:32
>>271
お前一人が理解できてないだけだろ
>>267-268をよく嫁よ
273デフォルトの名無しさん:2005/07/23(土) 17:10:28
構造体やポインタの勉強も一通り終え、線形リストを勉強しているのですが、どうしてもうまく行きません。
プログラムの仕様はコメントにして書いています。指摘をお願いします。

ttp://tool-ya.ddo.jp/2ch/trash-box/file/20050723170743417.txt
274デフォルトの名無しさん:2005/07/23(土) 17:13:55
宣言と実装を分離している場合、つまり
foo.hで
void f(char *str);
foo.cで
void f(char * const str) {...}
というのなら、「やりたければ勝手にやれば?」と言えるけどね。

他に公開するインターフェース部分に意味のないconstを置くのは
混乱させるだけでただの害悪。
275デフォルトの名無しさん:2005/07/23(土) 17:17:59
>size_t はメモリのバイト数を表す型です
これの意味が分からないのですがどういう意味でしょうか?
276デフォルトの名無しさん:2005/07/23(土) 17:22:50
>>272
いや、>>267-268の論点は「呼び出し側への影響」の話だと思うのですが。
char * const str の const をつけるかどうかの問題は
「呼び出し側への影響」はないって話は双方一貫してますが、
それは質問内容ではないです。

っていうか char * を持ちだしてしまったのは、
文字列操作を彷彿させて誤解を招きやすかったかもしれませんね。
たとえば構造体へのポインタを渡すときでも同じで
return_type func(struct hoge * const x)
ってやるべきではないかと思うわけです。(そういう目的で使う場合には)
ところがこのconstは明らかにつけるべき場所でもついていないことが多い気がするわけです。
そこに何らかの難点があるからなのであれば理解しておきたいし。
面倒だからみんなつけないというのであれば自分はつけるようにしたいし。

ちなみにfuncって同じ名前使ったのは再宣言って意味じゃなくて、例を列挙したかっただけなんですが・・・orz
277デフォルトの名無しさん:2005/07/23(土) 17:25:52
あほだな
278デフォルトの名無しさん:2005/07/23(土) 17:26:49
>>274
インターフェースに書いとくと混乱招きますかね・・・?orz
まあ混乱招くにしても、実装部分だけに書くことにはマズイ点は特にないわけですよね?
むしろconst本来の意味として使う役割を果たしているなら
「やりたければ勝手にやれば?」
というより
「本当ならやるべき」
と解釈すべきでは?
279デフォルトの名無しさん:2005/07/23(土) 17:28:58
なぜ「やるべき」だと思うのだ?
280デフォルトの名無しさん:2005/07/23(土) 17:35:39
Object *p = ...
として使うものを
Object * const p = ...
とするのが、
「見やすくわかりやすい」と思うなら、「勝手にやれば」なだけ。
俺は絶対にやらないけど。
281デフォルトの名無しさん:2005/07/23(土) 17:41:30
>>278
じゃあやればいいよ。
引数だけじゃなく、変数も必要とあらば全部const付ければいいんじゃないかな。
保守や変更する人は大変だろうけど。
282デフォルトの名無しさん:2005/07/23(土) 17:48:18
べつに強制力を持たせたいわけじゃないですよ。
グローバル変数は減らせる限り減らす「べき」と同じ程度の意味の「べき」です。

int teisu = 100;

const int teisu = 100;
と書くべきでしょ?

関数の引数はローカル変数の一種であると同時にインターフェイスとして使われる点もあるから、
インターフェイス側に書くと混乱を招きやすいってのは納得のいく説明ですね。
その点さえ留意すれば、他の定数と同様にconstをつける意義があると考えただけの話です。

まあ「やるべき」かどうか云々に言及しすぎても初めに言わんとしていたこととはズレかねないので、
むしろ実装部にconstをつけて定数化することができる点に難点がないと言えるならそれでOKです。
283デフォルトの名無しさん:2005/07/23(土) 17:53:26
voidfunc1(const char *p)
{
 char a[234];
 p = a;
 p[0] = 0; // assignment of read-only location
}
voidfunc2(char *const p)
{
 char a[234];
 p = a; //assignment of read-only location
 p[0] = 0;
}
voidfunc3(const char *const p)
{
 char a[234];
 p = a; //assignment of read-only location
 p[0] = 0; //assignment of read-only location
}

int main()
{
 return(0);
}

gcc通してみたらこんな感じ。関数内でpをどう使おうが勝手だが、
オレの渡したpの中身を書き換えるなという意味でfunc1以外は
使った事がない。
284デフォルトの名無しさん:2005/07/23(土) 17:57:04
>>282
だから、難点は「読みやすさと理解しやすさを損なう」こと。
自分一人でしか読み書きしないソースであれば
ご自由に全てのローカル変数にconstを付けてくださいな。
285デフォルトの名無しさん:2005/07/23(土) 17:58:01
× ご自由に全てのローカル変数にconstを付けてくださいな。
○ ご自由に可能な限りの全てのローカル変数にconstを付けてくださいな。
286デフォルトの名無しさん:2005/07/23(土) 18:00:20
変数を定数化とはこれいかに
マクロ使え
287デフォルトの名無しさん:2005/07/23(土) 18:02:46
最初の答えからみんなが
>混乱を招く
って言ってるのに、いつまでたっても理解できないみたいだな
そんなにつけたきゃ勝手につけろと言いたい
288デフォルトの名無しさん:2005/07/23(土) 18:03:48
constつけただけで可読性が下がるってのは納得しかねる話ですが(理解不足かなにか?)、
constつけても利点が少ない割りに冗長ってのはまだ納得のいく話ですね。
ま、煽りが多いのでこの辺でお暇します。
289デフォルトの名無しさん:2005/07/23(土) 18:05:38
すいません
*( s_ol + temp) != '\0'
これはどういう意味か説明していただけ無いでしょうか?

s_ol + tempは 単に文字列のByteを足しているだけです
290デフォルトの名無しさん:2005/07/23(土) 18:05:57
>>273
head = malloc(sizeof(List));
new_node = malloc(sizeof(List));
291デフォルトの名無しさん:2005/07/23(土) 18:06:15
× constつけただけで可読性が下がる
○ 意味のないconstつけただけで可読性が下がる

全然わかってないようです。
292デフォルトの名無しさん:2005/07/23(土) 18:07:38
人の意見聞く気ないんだったら最初から来るなよヒキコモリが
293デフォルトの名無しさん:2005/07/23(土) 18:08:31
まあ、納得できないからといって、
自分以外の全ての人が述べることを
「煽り」としか受け取れないようでは
294デフォルトの名無しさん:2005/07/23(土) 18:09:11
>>290
いろんなサイトにもmallocやcallocが使われていたのですが、やはりそれを使うしかないのですね。
ありがとうございました。
295デフォルトの名無しさん:2005/07/23(土) 18:11:39
http://graph.holy.jp/prog/
プログラマーのコミュニティサイト作ってみますた
296289:2005/07/23(土) 18:12:49
すいません勘違いです
s_olは文字列のポインタで、tempが文字列のByte数でした

297デフォルトの名無しさん:2005/07/23(土) 18:15:10
>>289
それ単体か?ifかなにかに包んでなかったか?
*( s_ol + temp) != '\0'   特に意味なし
a = *( s_ol + temp) != '\0' a = true/false
if(*( s_ol + temp) != '\0') 普通に比較演算
298デフォルトの名無しさん:2005/07/23(土) 18:20:01
s_ol[temp] != '\0'
299289:2005/07/23(土) 18:20:37
すいません
forの中で比較として入れられているのですが
意味が分からないです・・・

括弧の前の*はどういういみなのでしょうか?
ポインタの何かへのキャストですか?
それと、"\0"というのがなにかわからないです・・・
300デフォルトの名無しさん:2005/07/23(土) 18:21:34
>>289
s_ol[temp] != '\0'
と同じ。
301デフォルトの名無しさん:2005/07/23(土) 18:26:30
\0は改行
302デフォルトの名無しさん:2005/07/23(土) 18:30:30
303デフォルトの名無しさん:2005/07/23(土) 18:31:24
たぶん勘違いと思われ。
\n・・・改行
\0・・・文字列終端(でいいのかな?)
304デフォルトの名無しさん:2005/07/23(土) 18:34:02
文字列の終端だから改行でいいじゃんって考えでしょ
305デフォルトの名無しさん:2005/07/23(土) 18:35:11
そんなボケな考えが出来るのは>>301=.>304だけだろ
自作自演バレバレだな
306デフォルトの名無しさん:2005/07/23(土) 18:38:19
----------- ここまでは俺の自作自演 --------------
307デフォルトの名無しさん:2005/07/23(土) 18:48:05
俺も初心者に説明するときはめんどくさいから
'\n'も'\0'も改行です。って教えてるけどな
大体聞いたらそのくらいは、想像できそうなものでしょ
>>305の思考力が少し足りてないだけでは?
まあ、肩もつ気は無いけどさ
308デフォルトの名無しさん:2005/07/23(土) 18:51:55
>>307
めんどくさいからって、そんな風に教えんな。
# 開発に入ったら、また再教育かよ...orz
309デフォルトの名無しさん:2005/07/23(土) 18:54:39
再教育しなくても、深く入って行くときにはちゃんと説明するよ
#include<stdio.h>, return 0; が、おまじないです
とかいってるのよりは、多少ましだと思うけど
310デフォルトの名無しさん:2005/07/23(土) 18:55:16
>>305
俺はさらに=>>307=>>288と予想する
311デフォルトの名無しさん:2005/07/23(土) 18:55:43
いくら面倒だからと言っても改行はまずいだろ
312デフォルトの名無しさん:2005/07/23(土) 18:58:41
思考力が足りないのは>>307のほうだと思うが
嘘教えてどーすんだよ
313デフォルトの名無しさん:2005/07/23(土) 19:00:50
改行と終端文字じゃ全然違うじゃないか。イメージも意味も。
314デフォルトの名無しさん:2005/07/23(土) 19:01:10
>>307
お前自身ホントに分かってるのか?
分かってたら絶対そんな風に教えないと思うが…
邪悪すぎる
315デフォルトの名無しさん:2005/07/23(土) 19:01:18
改行と終端を混用させるような教え方はよくなかろう。ナル文字終端なんて
C文字列の根幹をなす考え方だろうに。
316デフォルトの名無しさん:2005/07/23(土) 19:02:00
>>307
おまえは初心者の説明者
317デフォルトの名無しさん:2005/07/23(土) 19:02:35
>>301=.>304=>>307=>>288=池沼
でFA
318デフォルトの名無しさん:2005/07/23(土) 19:56:11
一人が叩くとみんなが叩く
あほの集まりだな
319デフォルトの名無しさん:2005/07/23(土) 20:07:15
うちも大体同じって教えてるよ
インストラクトしてみたら分かると思うけど、いきなり終端とかいっても
ほとんどの人が分からない、のっけからそんな惑わす必要は無いしね
徐々にいろいろなことを教えていくと、途中で終端の意味を教えたときには
最初から教えるときより理解がしやすい

どうでもいいけど、うちも「おまじない」って教えはしないけど
本とか見てるとたまにあるけど、それはひどすぎると思う
320デフォルトの名無しさん:2005/07/23(土) 20:09:47
ここはひきこもり妄想プログラマの憩の場です
インストラクターなどの職業の方はマ板へどうぞ
ここの人達は自分の意見のみが正しいと思っているので
何を言っても無駄です
お引き取り下さい
321デフォルトの名無しさん:2005/07/23(土) 20:14:00
うっせーばか
氏ねよまじで
322デフォルトの名無しさん:2005/07/23(土) 20:38:43
誰かC言語の問題を解いていただけないですか?
323デフォルトの名無しさん:2005/07/23(土) 20:39:12
断る。
324デフォルトの名無しさん:2005/07/23(土) 20:39:55
タイトルの「C言語なら俺に聞け!!」の方は??
325デフォルトの名無しさん:2005/07/23(土) 20:40:19
>>322
こっちのほうが適してるかも
http://pc8.2ch.net/test/read.cgi/tech/1121471445/
326デフォルトの名無しさん:2005/07/23(土) 20:49:19
A君 国語→83点
   数学→66点
   理科→91点
   社会→76点
   英語→80点

B君 国語→66点
   数学→59点
   理科→68点
   社会→59点
   英語→79点

C君 国語→33点
   数学→40点
   理科→48点
   社会→60点
   英語→50点

それぞれの点数を配列化し、構造体として表し、3人の平均点を計算して、さらに5教科の合計点が380点以上のものを合格とするプログラムを作っていただけないでしょうか?

327デフォルトの名無しさん:2005/07/23(土) 20:58:36
自分の宿題を人にやらすなよ
328デフォルトの名無しさん:2005/07/23(土) 20:58:45
>>326
マルチ氏ね
329デフォルトの名無しさん:2005/07/23(土) 20:58:51
>>326
作っていただけません。
330デフォルトの名無しさん:2005/07/23(土) 21:09:06
最近思うんだが
「宿題なんぞ教えるかボケ」と書くよりも
「ぼくちんそんなのわかんない」
と書いた方が早くいなくなる気がする
331デフォルトの名無しさん:2005/07/23(土) 21:09:24
>>326
作った
printf("合格者=A君\n");
printf("A君の平均=79.2\n");
printf("B君の平均=66.2\n");
printf("C君の平均=46.2\n");
332デフォルトの名無しさん:2005/07/23(土) 21:11:48
>>331
Cタンも合格だぞ
333332:2005/07/23(土) 21:12:26
メル欄に釣り宣言するの忘れたorz
334デフォルトの名無しさん:2005/07/23(土) 21:18:07
配列にするの忘れてた。これで完璧だろう

typedef struct {
 char name;
 float tensuu;
} TensuuRec;
TensuuRec table[] = {
 "A君", 79.2,
 "B君", 66.2,
 "C君", 46.2,
};
printf("合格者=A君\n");
for(i = 0; i < sizeof(table) / sizeof(TensuuRec)){
 printf("%sの平均=%f点\n", table[i].name, table[i].tensuu);
}
335デフォルトの名無しさん:2005/07/23(土) 21:19:20
>>334
>char name
336デフォルトの名無しさん:2005/07/23(土) 21:22:11
ぐは、これこそ完璧に違いない

typedef struct {
 char *name;
 float tensuu;
} TensuuRec;
TensuuRec table[] = {
 "A君", 79.2,
 "B君", 66.2,
 "C君", 46.2,
};
printf("合格者=A君\n");
for(i = 0; i < sizeof(table) / sizeof(TensuuRec)){
 printf("%sの平均=%f点\n", table[i].name, table[i].tensuu);
}
337デフォルトの名無しさん:2005/07/23(土) 21:26:12
>>336
>for(i = 0; i < sizeof(table) / sizeof(TensuuRec)){
338デフォルトの名無しさん:2005/07/23(土) 21:29:38
ありがございました☆
339デフォルトの名無しさん:2005/07/23(土) 21:30:49
さて…
340デフォルトの名無しさん:2005/07/23(土) 21:33:02
いい感じにバカが蒔けたなw
341デフォルトの名無しさん:2005/07/23(土) 21:33:51
問題:三角形の底辺Aと高さHを入力し、また円の半径Rを入力して各面積Sを求め表示しなさい。
ただし、浮動小数点を用いること。
342デフォルトの名無しさん:2005/07/23(土) 21:34:29
俺的には
for(i = 0; i < sizeof(table) / sizeof(TensuuRec)){
じゃなくて
for(i = 0; i < sizeof(table) / sizeof(table[0])){
343デフォルトの名無しさん:2005/07/23(土) 21:34:44
真実の答へは??340
344デフォルトの名無しさん:2005/07/23(土) 21:36:46
それはずるだよ
345デフォルトの名無しさん:2005/07/23(土) 21:48:18
i++抜けてた…無限ループ無限ループ・ヤッホー・ヤッホー
346デフォルトの名無しさん:2005/07/23(土) 21:50:53
☆★問題:三角形の底辺Aと高さHを入力し、また円の半径Rを入力して各面積Sを求め表示しなさい。
ただし、浮動小数点を用いること。
347デフォルトの名無しさん:2005/07/23(土) 21:57:32
問題文はなんでも「ただし」をつければいいと思っているんじゃねーよ。
そこは「なお」だろ。
348デフォルトの名無しさん:2005/07/23(土) 22:06:34
>>336
課題で本当にそんな感じで書いた奴がいて

先生「これは…寒いですね……」

ワロスwww
349デフォルトの名無しさん:2005/07/23(土) 22:20:35
C言語を学ぼうと思うのですが、おすすめの本とかありますか?
やっぱり>>1のやつがいいんですか?
350デフォルトの名無しさん:2005/07/23(土) 22:23:06
>>349
コレならCまで順番どおりに学べるはず
ttp://61.199.33.219/info/studioring/abc/sp/
351デフォルトの名無しさん:2005/07/23(土) 22:57:16
breakってどこまで飛ぶんですか?
352デフォルトの名無しさん:2005/07/23(土) 23:03:54
地球の裏側
353デフォルトの名無しさん:2005/07/23(土) 23:34:51
次のプログラムで、規定のアルファベット以外の文字を入力すると、
更に「アルファベットを入力してください」が二回出ます。なぜですか?

#include <stdio.h>

int main(void)
{
 int a,b;
 char ch;

 printf("実行したい演算は\n");
 printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか?\n");

do{
printf("アルファベットを入力してください:");
ch=getchar();

}while(ch!='A'&&ch!='S'&&ch!='M'&&ch!='D');

 printf("\n");
 printf("最初の数字を入力してください:");
 scanf("%d",&a);
 printf("二番目の数字を入力してください:");
 scanf("%d",&b);
 if(ch=='A')printf("%d",a+b);
  else if(ch=='S')printf("%d",a-b);
  else if(ch=='M')printf("%d",a*b);
  else if(ch=='D')printf("%d",a/b);
 return 0;
}
354デフォルトの名無しさん:2005/07/23(土) 23:34:54
ジンバブエまで
355デフォルトの名無しさん:2005/07/23(土) 23:37:20
>>353
お前が判定条件をそうしてるからだろ
356デフォルトの名無しさん:2005/07/23(土) 23:40:15
>>353
改行を拾ってるから。
357デフォルトの名無しさん:2005/07/24(日) 00:00:37
>>353
だから改行文字のときは、メッセージを表示しないようにすればいい。
char ch = '\0';
//略
do {
    if (ch != '\n')
        printf("アルファベットを入力してください:");
    ch = toupper(getchar());
} while(ch != 'A' && ch != 'S' && ch != 'M' && ch != 'D');
ほかにも方法はいくつかあるけど。
358デフォルトの名無しさん:2005/07/24(日) 00:14:41
scanfは怖いからなぁ。
自分はできるだけ使わないようにしてるが。
359デフォルトの名無しさん:2005/07/24(日) 00:21:28
printf("アルファベットを入力してください:");
scanf("%s", &ch);

じゃダメポ?
360デフォルトの名無しさん:2005/07/24(日) 00:31:55
>>359
%sは'\0'を書き込むからchar ch[2]にしないといけない。
そして%1sにすればとりあえず問題ないと思う。
361デフォルトの名無しさん:2005/07/24(日) 00:39:44
そこで入力バッファのフラッシュは可能ですかという質問が
362デフォルトの名無しさん:2005/07/24(日) 00:42:05
そこでscanf("%*[^\n]%*c");を使えば改行文字までを読み捨てられる、これで十分だろと返す。
363デフォルトの名無しさん:2005/07/24(日) 01:15:04
>>362
%*c って必要?
364デフォルトの名無しさん:2005/07/24(日) 08:31:45
>>363
%*[^\n]で改行文字が現れるまでということだから%*cで改行文字を拾って捨てることになる。
365デフォルトの名無しさん:2005/07/24(日) 08:43:49
>>364
改行は読もうとしない限り捨てられるから要らないんじゃないの?
366デフォルトの名無しさん:2005/07/24(日) 08:46:49
もっとも内側のforかwhileの終端まで
367デフォルトの名無しさん:2005/07/24(日) 12:51:58
if文とかの条件って、int型になるの?

float a;

if ( a ) {
;
}

とかってやると、aは、int型に勝手に変換される?

unsigned int a;
とか
char a;
とかも、みんなintになる?
368デフォルトの名無しさん:2005/07/24(日) 13:03:43
>>367
No
369デフォルトの名無しさん:2005/07/24(日) 13:05:47
関数じゃないからなぁ
370デフォルトの名無しさん:2005/07/24(日) 13:34:11
>>367
ちなみにcharは今回の場合に限らないが右辺値になるときには常にint(だめならunsigned int)に昇格される。
371デフォルトの名無しさん:2005/07/24(日) 13:39:12
>>370
今、右辺値は関係ないじゃん
372デフォルトの名無しさん:2005/07/24(日) 13:53:01
>>371
ifの条件式って右辺値じゃないの?
373デフォルトの名無しさん:2005/07/24(日) 13:53:42
ごめん
374デフォルトの名無しさん :2005/07/24(日) 14:54:53
surface,volume関数を使い、キーボードで値を入力すると表面積と体積を求めるプログラムはどう記述すればいいですか?
375デフォルトの名無しさん:2005/07/24(日) 14:58:17
>>374
キーボード使って記述すればいいと思います。
376デフォルトの名無しさん:2005/07/24(日) 15:07:59
球の?三角錐の?円筒の?
377デフォルトの名無しさん:2005/07/24(日) 15:10:45
四角形です。
378デフォルトの名無しさん:2005/07/24(日) 15:11:18
379デフォルトの名無しさん:2005/07/24(日) 15:17:52
三角錐です;;
380デフォルトの名無しさん:2005/07/24(日) 15:19:22
立方体?
scanfで表面積。。

int main()
{
 int a;
 
 scanf("%d",&a);

 printf("S=%d",surface(a));

 return 0;
}

int surface(int a)
{
return a*a*6;
}
381デフォルトの名無しさん:2005/07/24(日) 15:20:04
>>379
380使えばできる、ってか1つの数じゃ無理よな、三角錐はw
382374:2005/07/24(日) 15:26:44
ごめんなさい、球です…
383デフォルトの名無しさん:2005/07/24(日) 15:27:45
質問です。
int型の変数をsqrt()の引数にしても良いのですか?
384デフォルトの名無しさん:2005/07/24(日) 15:28:54
>>383
無問題
385デフォルトの名無しさん:2005/07/24(日) 15:33:58
>>384
基本は>380と同じ
・main()で半径を入力、surface()とvolume()の結果を出力
・surface()で表面積を計算
・volume()で体積を計算
でOK
386デフォルトの名無しさん:2005/07/24(日) 15:39:22
>>384
thx
387385:2005/07/24(日) 15:54:35
アンカー間違えてたorz
>>384じゃなくて>>374
388デフォルトの名無しさん:2005/07/24(日) 16:10:43
大丈夫とは思うが・・・表面積・・・しんぱいあーるのじじょう
             体積・・・・・みのうえにしんぱいあーるのさんじょう
389273:2005/07/24(日) 18:28:11
自分でいろいろやってみましたがどうしても表示の際、最後に余計な数字が表示されてしまいます。
mallocの使い方はこれであってますよね?

ttp://ccfa.info/cgi-bin/up/src/up14080.txt
390デフォルトの名無しさん:2005/07/24(日) 18:50:42
>>389
1個余計に表示されるのなら1つ先がNULLかどうかを見ればいい。
for(; head->next; head = head->next) {
391デフォルトの名無しさん:2005/07/24(日) 19:16:32
>>390
ありがとうございます。できました。
392デフォルトの名無しさん:2005/07/25(月) 02:22:58
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
393デフォルトの名無しさん:2005/07/25(月) 03:21:09
>>392
過去ログ参照。
394デフォルトの名無しさん:2005/07/25(月) 04:05:07
質問です。
unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)
{
unsigned long result = 0,value;

if (!base) {
base = 10;
if (*cp == '0') {
base = 8;
cp++;
if ((*cp == 'x') && isxdigit(cp[1])) {
cp++;
base = 16;
}
}
}
while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
? toupper(*cp) : *cp)-'A'+10) < base) {
result = result*base + value;
cp++;
}
if (endp)
*endp = (char *)cp;
return result;
}
某所から拾ってきたコードで、ちゃんと動作もします。
しかしながら何故これが正常に動作するのかが分かりません。
result*baseで今までのビットに重みを付けているようですが、
value=digit(*cp)で現在ビットが得られるとは思えません。
valueは何処で現在ビットを得ているのでしょうか?
日本語として破綻している箇所があればご指摘下さい。ご教授お願いします。
395394:2005/07/25(月) 04:19:30
すみません。書き込んで30秒で自己解決しました。
(value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
? toupper(*cp) : *cp)-'A'+10) < base
ではisdigit(*cp)?~~~~~~~~'A'+10)が先に評価されるのですね。
式のネストが複雑で、思い違いをしていました。
スレッドの無駄消費申し訳ありません。
失礼致しました。
396デフォルトの名無しさん:2005/07/26(火) 04:58:26
野球におけるピッチャーの防御率は,9回あたりの失点数で計算します.
なので,低い程よくなります.そこで,1試合ごとの投球回数と失点数
を入力し,「全試合を通しての防御率」と「最近5試合の防御率」を入
力するたびに計算するプログラムを作ってください.ただし,1/3 回
のようなアウトカウントによる投球回数は考えず,投球回数単位で計算
するものとします.

下の表に出ている値で正しいかどうかを確認してください.

なお,最大140試合まで入力できるようにしてください.また,
日本のプロ野球では,延長戦は12回までなので,投球回数に12より
大きい数値は入らないようにしてください.
397デフォルトの名無しさん:2005/07/26(火) 05:05:47
>>396
>>1くらい読め
398デフォルトの名無しさん:2005/07/26(火) 05:17:36
int strindex(char s[], char t[])
{
int i, j, k;

for (i = 0; s[i] != '\0'; i++) {
ここ→for (j=i, k=0; t[k]!='\0' && s{j}==t[k]; j++, k++)
;
if(k > 0 && t[k] == '\0')
returni;
}
return-1;
}

ここでエラーが出るのですが、理由が分かりません。
399デフォルトの名無しさん:2005/07/26(火) 05:19:18
そうですか。
400デフォルトの名無しさん:2005/07/26(火) 05:29:18
s{j}
401デフォルトの名無しさん:2005/07/26(火) 16:15:46
答えは出てるが一応聞いておく
どんなエラーが出てるのだ?
402デフォルトの名無しさん:2005/07/26(火) 20:34:09
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html
これらの関数は絶対に使用しないことなんて書かれていて驚いているのですが
使うことを推奨されていないならgetsに対するfgetsのように
代替となる関数があったりするのでしょうか?
それともただ単に使うときは注意しなさいという警告だけの意味合いなのでしょうか
403デフォルトの名無しさん:2005/07/26(火) 20:40:03
>>402
もし使用する場合は、以下のことに注意すること。

これらの関数はその最初の引数を変更する。
これらの関数は const な文字列では使えない。
終端文字はすべて \0 になってしまう。

strtok() 関数はパーズに静的バッファを用いるので、スレッドセーフでない。
もしこれが問題になる場合は strtok_r() を用いること。

404デフォルトの名無しさん:2005/07/27(水) 07:38:28
>>402
使わずに済むならそれに越したことはない。
少なくともCで広く使われているライブラリには代替は見当たらない。
405デフォルトの名無しさん:2005/07/27(水) 10:38:01
>>402
大抵はsscanf()で事が足りる。
それでダメならどの道strtok()だけでは済まない筈。
406デフォルトの名無しさん:2005/07/27(水) 11:04:48
>>405
トークン数が不明なときはsscanfでどう書けばいいの?
407デフォルトの名無しさん:2005/07/27(水) 12:34:21
>>406
一個ずつ取り出すループを回す。strtok()より簡単。
/* for example. */
void func(const char * foo)
{
int bar;
do {
int idx;
char buf[100];
bar = sscanf(foo, "%99[^,;:]%n", buf, & idx);
if (bar > 0) {
do_anything(buf);
}
foo += idx;
} while (bar > 0);
}
408デフォルトの名無しさん:2005/07/27(水) 16:55:29
皆さん1ヶ月にどくらいの行のコードが書けますか?
409デフォルトの名無しさん:2005/07/27(水) 17:02:10
10行から2万行くらい
410デフォルトの名無しさん:2005/07/27(水) 17:11:27
すげーなおまえ

俺は 0行からだは、
最小行で負けた・・・ orz
411デフォルトの名無しさん:2005/07/27(水) 17:14:26
>>410
定型ヘッダコメントをコピペするからな・・・
それが10行くらい
412410:2005/07/27(水) 17:18:28
この負けは譲らんぞ

ってか昔、一週間位かけて
八千ステップくらいのコード書いたわけよ
それがハカーに圧縮されて千ステップ以下になったわけよ
それから自分からコードは書かなくなった
書くとしてもパッチ位かな
413デフォルトの名無しさん:2005/07/27(水) 17:29:18
正直俺は、自分でコードを書く奴より
パッチを書ける奴の方が凄いと思う
414デフォルトの名無しさん:2005/07/27(水) 17:30:49
C経験10年というプログラマのコードを200→3に圧縮したことならある。
文字列操作をぐだらぐだらやってたからsprintf()一文で置き換えた。
415デフォルトの名無しさん:2005/07/27(水) 17:33:36
>>413
当り前、どれだけ自分でコードがかけても
他人のが読めなかったらできないのと一緒

>>414
自分から経験年数をいう奴にはまともな奴がいないのが事実
それはおいといて
>文字列操作をぐだらぐだらやってたからsprintf()一文で置き換えた。
理由は無かったのか?
なんでもかんでもsprintfで書いたらいいわけではないんだぞ
416デフォルトの名無しさん:2005/07/27(水) 17:52:47
数時間かかる処理を数分に縮めた経験は誰でもあるだろうな
417デフォルトの名無しさん:2005/07/27(水) 17:55:12
>数時間かかる処理
この時点で無い
418デフォルトの名無しさん:2005/07/27(水) 17:56:24
>>417
まあ、個人ではないだろうな
419デフォルトの名無しさん:2005/07/27(水) 18:19:16
仕事でも、「誰でも」はねーだろ
420デフォルトの名無しさん:2005/07/27(水) 18:23:25
誰でもあるよねえ。
421デフォルトの名無しさん:2005/07/27(水) 18:23:37
ないんだwww
んなやつプログラマじゃねーよ
422デフォルトの名無しさん:2005/07/27(水) 18:30:18
沸いて出てきた
423デフォルトの名無しさん:2005/07/27(水) 18:40:07
>数時間かかる処理を数分に縮めた経験は誰でもあるだろうな
自分はプログラマじゃないけどあるよ
まぁ、数時間を数十分だけど

最寄駅から電車にのって路線変えて2時間強の通勤だったけど
自転車でいったら45分で着いた
424デフォルトの名無しさん:2005/07/27(水) 18:45:01
車乗ってけよ
425デフォルトの名無しさん:2005/07/27(水) 18:46:05
エコロジーで
426 ◆i6G.jsz.NY :2005/07/27(水) 18:47:18
車は持ってない
乗って来てる人から聞いたら道込んでるから1時間強はかかるって事だった
まぁ、もう止めたからどうでもいいけど
427デフォルトの名無しさん:2005/07/27(水) 18:49:02
原付で行けよ
428デフォルトの名無しさん:2005/07/27(水) 18:57:47
坊、組み込み機器のヘボイJPEGソフトエンコーダー/デコーダーを高速化したことはある。
429 ◆i6G.jsz.NY :2005/07/27(水) 18:58:49
原付も持ってない・・・
というか、車道は込んでるから原付でもたいして変わらないかと、

だいたい、自分は車とかの間をぬっていったし
歩道も駆使したので早く付いただけですし・・・
大体アベレージが30km/h強位で走ってましたし、
信号がアホみたいに多いのでしょっちゅう止まってたので時間をだいぶ無駄にしてますが

確か、自転車でいく道だと会社まで15km位だったかな?
430414:2005/07/27(水) 19:17:49
>>415
理由? さぁ?
少なくとも想定されている入力に対しては同じ出力を返すし、
それ以上に最低限バッファオーバフローは起こさないように改善さえしたよ。
つーか、そのくらいの検証もできないほど漏れが馬鹿なら最初から手をつけないよ。

時間の方ではそうだなぁ、パターンマッチングのロジックを整理して所要時間を
半分にしたことはあったな。
431デフォルトの名無しさん:2005/07/27(水) 20:06:04
走行時のアベレージが30km/hとして
距離は15km
で、走行時間は45分というと
15分も信号待ちがあるのか
それはもったいないな
その待ち時間にコンパイルとかしたらどうだろう
432デフォルトの名無しさん:2005/07/27(水) 20:13:42
いや、サンプリング周波数が低すぎて速度データの信頼度が低すぎるだけだろ。
433 ◆i6G.jsz.NY :2005/07/27(水) 20:56:08
国道の大きな信号だと、ひっかかると3分くらい変わりませんからな・・・
コンパイルっていわれても、工場なんでそんなものありませんが・・・
434デフォルトの名無しさん:2005/07/27(水) 21:05:38
>>414
処理時間が倍以上になったんじゃないか?
435C言語初心者:2005/07/27(水) 22:23:57
BorlandのC++のフリーコンパイラをデスクトップにインストールしたんですが、
パスの設定の仕方等初めから上手く行きません。
どこでつまずいたのか分からないのでインストールしてからの手順を教えていただきたいのですが。。

お願いします。

コマンドプロンプトのエラーとして内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。

と出ます。
436デフォルトの名無しさん:2005/07/27(水) 22:27:13
>GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
437デフォルトの名無しさん:2005/07/27(水) 22:27:56
Cマガのサイトに設定ツールとかあるじゃん。
っていうかスレ違いだし。
438デフォルトの名無しさん:2005/07/27(水) 22:34:47
>>435
http://www.kumei.ne.jp/c_lang/bcc/bcc_01.htm
猫自体は良くないからここだけ読んだらほか行け。
439デフォルトの名無しさん:2005/07/27(水) 22:41:29
>>437
どこにスレがあるんですか?
440デフォルトの名無しさん:2005/07/27(水) 22:49:01
>>438
分かりやすいかといわれると疑問が残る部分もあるが、
順に読んでいけば何とか分かるし、あんだけ書いてくれ
てるんだからとても有り難い。そのコメントは少しかわい
そうだな。
まぁ、今は本の収入とかもあるんだろうけど・・・
それでも、今もwebだけで十分理解できるようにしている
姿勢は好感が持てる。
441デフォルトの名無しさん:2005/07/27(水) 22:49:01
>>439
タダで使えるBorland C++ Part4
http://pc8.2ch.net/test/read.cgi/tech/1091066805/l50

ここはC自体の話限定。
442デフォルトの名無しさん:2005/07/27(水) 23:08:05
スレも探せな(ry
443デフォルトの名無しさん:2005/07/27(水) 23:21:48
>>438
コマンドプロンプトの初期設定を努力して設定するのと、

その初期設定をやってくれるモノをインストールして使い始めるのとでは

今後PCを理解していく上でどちらのほうがいいですか?

やってくれるソフトがあるのだからわざわざ設定する必要もないのですかね?
444デフォルトの名無しさん:2005/07/27(水) 23:25:26
やってくれるソフトが無い事だってあるな。
445デフォルトの名無しさん:2005/07/27(水) 23:26:37
いいんじゃねーの? その程度の浅い知識で満足する人なら。
446デフォルトの名無しさん:2005/07/27(水) 23:46:54
>>443
どうせ苦労するのならLinuxでも入れとけ。
Windowsじゃそのへんで苦労してもあまり役に立たない。
447デフォルトの名無しさん:2005/07/27(水) 23:58:25
C言語で文字列を格納するための宣言文って何でしたっけ?
例文は、「yahoo」です。
448デフォルトの名無しさん:2005/07/28(木) 00:00:33
/* 今、私は文字列を記載することをここに誓います */
449デフォルトの名無しさん:2005/07/28(木) 00:01:51
あと
変数Aと変数Bの内容が等しい場合、変数Cに文字「E」を設定する時の
プログラム部分も教えて下さい。
450デフォルトの名無しさん:2005/07/28(木) 00:03:40
>>448
つぼった
451デフォルトの名無しさん:2005/07/28(木) 00:06:47
>>447
好きなのを選べ
const char *p = "yahoo";
char a[] = "yahoo";
static char s[] = "yahoo";

>>449
if (A == B) //AとBが文字列ならif (strcmp(A, B) == 0)
    C = 'E'; //Cはchar(char *やchar[]ではない)あるいはintだとする。
452デフォルトの名無しさん:2005/07/28(木) 00:26:11
>>451どうもです
453デフォルトの名無しさん:2005/07/28(木) 00:27:22
すいません、
[]←って何ですか?
454デフォルトの名無しさん:2005/07/28(木) 00:32:55
  _、_ 
( ,_ノ` )つc[]
455デフォルトの名無しさん:2005/07/28(木) 00:36:12
  _、_ ズズ..
( ,_ノ` )
   []E
456デフォルトの名無しさん:2005/07/28(木) 00:43:59
>>453
配列
457デフォルトの名無しさん:2005/07/28(木) 09:43:45
夏だなおい。
マジレスしちゃうほうもどうかと思うがw
458デフォルトの名無しさん:2005/07/28(木) 09:49:37
ポインタの先のサイズを知るにはどうすればいいのでしょうか?
459デフォルトの名無しさん:2005/07/28(木) 09:53:43
>>458
ポインタの先のサイズを測ればいい
sizeof(*hoge)
460デフォルトの名無しさん:2005/07/28(木) 09:55:20
>>458
要素数を知る方法はない。
関数の引数にポインタを渡すときには要素数も引数として渡すのが一般的。
461デフォルトの名無しさん:2005/07/28(木) 09:57:44
>>460
それが一般的なのか・・・

ケツに番犬貼り付けて渡すのが一般的だと思ってたよ。
文字列みたいに。
462デフォルトの名無しさん:2005/07/28(木) 09:59:58
>>460
それは配列の場合で、1要素だったり構造体1つの場合は >>459 の方法が使える。
463デフォルトの名無しさん:2005/07/28(木) 10:00:12
>>461
どうやって?
464デフォルトの名無しさん:2005/07/28(木) 10:01:41
>>463
文字列みたいに。
465デフォルトの名無しさん:2005/07/28(木) 10:03:44
>>464
だから、どうやって?
466デフォルトの名無しさん:2005/07/28(木) 10:10:22
最近は番犬って呼んでるのか。
467デフォルトの名無しさん:2005/07/28(木) 10:10:51
Sentinelを使う方法は文字列のように単純な型なら巧くいくが、
構造体の場合はSentinel確認用のメンバを用意するなど工夫が必要。
ポインタの場合はNULLをSentinelとして使う手もある。

>>466
>461だけだろ。
468デフォルトの名無しさん:2005/07/28(木) 10:14:34
番兵とも言うな
469デフォルトの名無しさん:2005/07/28(木) 10:16:59
あるいはC++のイテレータみたいに終端もペアにして渡すというのもできる。
470デフォルトの名無しさん:2005/07/28(木) 10:19:50
>>469
それも一理あるんだが、古い(頭の堅い)C屋には[from, to)であることを理解したがらない香具師がいるからねぇ。
471デフォルトの名無しさん:2005/07/28(木) 10:23:07
>>470:2: error: syntax error before ')' token
472470:2005/07/28(木) 10:30:58
>>471
いや、あの、C++のイテレータって範囲の指定がfromを含んでtoの手前までって仕様だってことで……
473470:2005/07/28(木) 10:31:29
つーか、仕事でもこういう羽目になるのが嫌なのよ。
474デフォルトの名無しさん:2005/07/28(木) 12:41:50
>>470
その辺って、途中から変わったんだっけ?
はじめから[from, to)だと思ってた(C-FAQにも載ってるし)。
475デフォルトの名無しさん:2005/07/28(木) 15:58:08
void main()
{
int n;

for (n=2; n<=100; n=n+2) {
if (n%3 == 0)
printf("%3d",n);
}
}
これは何を意味するのでしょうか?
100まで2から2を足して行き、そのかずでわったあまり???
途中まで考えたのですが…
476デフォルトの名無しさん:2005/07/28(木) 16:00:41
>>475
偶数で3で割り切れる値の列挙
つまり、6の倍数
477デフォルトの名無しさん:2005/07/28(木) 16:01:01
100までの数のうち、偶数and3の倍数を、空白をあけずに標準出力に出力している
478475:2005/07/28(木) 16:04:45
ありがとうデスm(__)m
479475:2005/07/28(木) 16:22:34
あとすいません、

変数aの内容が英大文字のとき真となる論理演算式というのは

(a>='A') && (a<='A')
で宜しいのでしょうか?
480デフォルトの名無しさん:2005/07/28(木) 16:23:06
Z?
481デフォルトの名無しさん:2005/07/28(木) 16:26:40
'A' <= a && a <= 'Z'
482デフォルトの名無しさん:2005/07/28(木) 16:33:21
⊂⊂⊂⊂(a>=^A^)⊃⊃⊃⊃ブーーーーン
483475:2005/07/28(木) 16:35:28
ありがとうございます
もちろん最初から聞いてるのではなく
考えて分からなかったところを聞いてますので
怒らないで下さい。信じてください
484デフォルトの名無しさん:2005/07/28(木) 16:39:36
>>479
使っていいなら<ctype.h>のisupper()を使え。
485デフォルトの名無しさん:2005/07/28(木) 16:43:33
isupper()とかは微妙にロケール依存なので注意
486デフォルトの名無しさん:2005/07/28(木) 16:59:49
>>479
((a >= 'A') && (a <= 'Z'))
487デフォルトの名無しさん:2005/07/28(木) 17:51:00
main()
{
int i, s=0, n=5, d[10];

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

}
printf("\n答えは%dです\n",s/n);
}


これを実行してもなぜか何も表示されないのですが…
488デフォルトの名無しさん:2005/07/28(木) 17:51:36
>>484-486ありがとうございますm(__)m
489デフォルトの名無しさん:2005/07/28(木) 18:08:39
>>487
scanfで入力待ちになってるんじゃないの?
数値を入力してリターン、を5回繰り返してみ。

scanfの前に、
printf("input[%d]:", i);
を入れるとわかりやすいかも。
490デフォルトの名無しさん:2005/07/28(木) 18:25:24
↑ありがとうございました
491デフォルトの名無しさん:2005/07/28(木) 18:30:24
@ for (a=10; a<100; a=a+5) {
i = i + 2;
}

A for (n > 0; n++) {
a = a - 2;
}

B for (i = 'a'; i < 'Y' ; ++i ) {
a = 'Z';
}

C for (n = 0; n <= 'A'; ++n) {
a = 'F' ='A' ;
}


この中で文法的に間違っているのはどれですか?
理由も教えて下さいm(__)m
492デフォルトの名無しさん:2005/07/28(木) 18:32:24
複数回答あり?
493491:2005/07/28(木) 18:39:04
う〜ん、書いてませんでした。すいません
いっしょうけんめい調べたのですが、読んでも分からなくて…
494デフォルトの名無しさん:2005/07/28(木) 18:40:55
>>491
1.
for文の初期化項目がない。
nが事前に初期化されているなら、
for ( ; n > 0; n++)
と書くべき。

4.
リテラル(この場合は’F’)に代入はできない。

というか、このレベルの話題は宿題スレの方がいんじゃない?
495491:2005/07/28(木) 18:44:39
ありがとうございます
すいません、正しく定義されているとする、と欠いてありました…

宿題すれって何処ですか?
496デフォルトの名無しさん:2005/07/28(木) 18:48:27
>>494
1→2の誤りじゃないか?
497494:2005/07/28(木) 18:59:30
1→2の誤りでしたorz

ちなみに、宿題スレってのはここ

ぼるじょあがC/C++の宿題を片づけますYO! 48代目
http://pc8.2ch.net/test/read.cgi/tech/1121471445/l50
498.491:2005/07/28(木) 19:10:40
ありがとうございました
499デフォルトの名無しさん:2005/07/28(木) 23:24:55
Fanの回転数を取得する方法ってありますか?


500デフォルトの名無しさん:2005/07/28(木) 23:25:50
>>499
処理系依存なんですれ違い。
501デフォルトの名無しさん:2005/07/28(木) 23:42:34
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
502デフォルトの名無しさん:2005/07/28(木) 23:50:51
>501
ビットごとのキュー構造、リングバッファすなはち、実用例としてはシリアル通信
503デフォルトの名無しさん:2005/07/29(金) 00:39:42
下のようなコードを書きましたが、要素を追加・削除する際に変更が一箇所で済む
上手い書き方はありませんか?

enum{
apple;
orange;
banana;
};
char *s[] = {
"apple",
"orange",
"banana"
};
puts(s[orange]);
504デフォルトの名無しさん:2005/07/29(金) 00:40:15
c言語で
char a[4];
printf("四文字入力");
scanf("%s",a);
のようにして、四文字を一文字ずつ読み込ませる方法はありますか?
超初心者に教えてください。
505503:2005/07/29(金) 00:47:21
すみません、間違ってカンマをセミコロンにしていました。
506デフォルトの名無しさん:2005/07/29(金) 00:47:47
>>504
#include <stdio.h>

int main()
{
    char a[4];
    int i;
    printf("四文字入力\n");
    for (i = 0; i < 4; ++i) scanf("%c", a + i);
    printf("\n");
    for (i = 0; i < 4; ++i) printf("%c", a[i]);
}
507デフォルトの名無しさん:2005/07/29(金) 00:56:14
>>503
puts("orange");
508デフォルトの名無しさん:2005/07/29(金) 01:03:28
>>504,506
要素数4なら'\0'が入るから入力できるのは3文字までじゃない?
509503:2005/07/29(金) 01:11:46
この役立たず!
510503(本物):2005/07/29(金) 01:12:35
>>509
あなた誰?
511503:2005/07/29(金) 01:15:45
>>509-510
ちょ、お前ら騙んなよ。

>>507
いやputsは無かった事にしてもらって、上手い宣言方法って事で。
512デフォルトの名無しさん:2005/07/29(金) 01:22:19
>>508
文字列ならそうだが文字の集まりとしてだったら4つでOK
513デフォルトの名無しさん:2005/07/29(金) 01:50:23
>>503
↓こんなふうにして追加・削除時に間違えないようにするしか無いんじゃないかなぁ・・・

enum     {  apple , orange ,  banana  };
char *s[] = { "apple", "orange", "banana" };
514デフォルトの名無しさん:2005/07/29(金) 02:04:57
>>503
めちゃ泥臭くても構わないなら

HOGE(apple),
HOGE(orange),
HOGE(banana),

ってのを fruits.list ってファイルにもでも書いて

#define HOGE(X) X
enum {
#include "fruits.list"
};
#undef HOGE
#define HOGE(X) #X
char *s[] = {
#include "fruits.list"
};
#undef HOGE

でいける。
515デフォルトの名無しさん:2005/07/29(金) 02:09:21
>>514 やるな。
こんなんしか思いつかんかった...orz
char *s[] = {
#define apple 1
"apple",
#define orange 2
"orange",
#define banana 3
"banana"
};
516515:2005/07/29(金) 02:10:39
ごめん、番号間違えた。逝ってくる。
char *s[] = {
#define apple 0
"apple",
#define orange 1
"orange",
#define banana 2
"banana"
};
517デフォルトの名無しさん:2005/07/29(金) 07:01:07
すいません。
基本情報処理試験のスレがないので
ここに書き込ませてください。

基本情報処理試験は通常どれくらいの勉強時間で受かりますか?

パソコンの能力として参考に

1週間前から猫さんのとこでc言語を学び始めました。現在制御文のところ
ワードエクセルを開いたこともありません。

現在一橋大の法の2年です。受験勉強の能力としては自身があります。
パソコンの能力に関係あるかどうか分かりませんが。
518デフォルトの名無しさん:2005/07/29(金) 07:49:17
汎用ポインタのポインタ、void **pをどんな型のポインタでも入る変数として
扱うのは無理なんでしょうか
簡単なコード書いてみたんですがエラーが。
519デフォルトの名無しさん:2005/07/29(金) 08:02:54
>>518
素直にvoid*じゃ、あかんのか?
520デフォルトの名無しさん:2005/07/29(金) 08:48:58
>>517
【ム板で】基本情報技術者試験【合格しよう】
http://pc8.2ch.net/test/read.cgi/tech/1097165080/l50
521デフォルトの名無しさん:2005/07/29(金) 08:51:23
>>518
void **へ入れるときも出すときもキャストすればいいだけ。
522デフォルトの名無しさん:2005/07/29(金) 10:32:28
質問です。
void型でboo1からboo100までを作りたいのですが、いちいち
void boo1, boo2, boo3・・・, boo100とやるのは時間が掛かるし、面倒じゃないですか。
そこでforを使って変数を作りたいのですが、どのようにすれば良いでしょうか?
523デフォルトの名無しさん:2005/07/29(金) 10:36:32
>>522
配列使えばいいだろ。
524デフォルトの名無しさん:2005/07/29(金) 10:37:24
void型の変数なんて宣言できたっけ?
宣言できても何に使うか想像できないけど
525デフォルトの名無しさん:2005/07/29(金) 10:39:14
>>519
文字列も扱いたかったんです
>>521
ありがとうございます。できました
526522:2005/07/29(金) 10:46:13
>>523配列・・・やはりそうきますか。ちょっと考えさせてください。
527デフォルトの名無しさん:2005/07/29(金) 11:08:17
>>526
   _ _
Σ( O ;)
528デフォルトの名無しさん:2005/07/29(金) 11:09:08
orz
529デフォルトの名無しさん:2005/07/29(金) 11:13:56
>>522がどこまで脳に欠損があるのか知りたい
530デフォルトの名無しさん:2005/07/29(金) 11:59:33
http://coconut.sys.eng.shizuoka.ac.jp/bmp/#lib

ここにある、bmp.h、bmp.c、test0.c(test1.c)をcygwin+gccでコンパイル+実行すると、きちんとbmpが
作成されたんですが、これを自分なりに修正していくうちにスタックオーバーフローが出るようになりました。
以下はその修正したのを省略したものです。

img.c
------------
#include "bmp.h"

int main(int argc, char** argv) {
 img tmp;
 return 0;
}
-------------
bmp.h
-------------
#define MAXWIDTH 1000
#define MAXHEIGHT 1000

typedef struct {
 unsigned char r;
 unsigned char g;
 unsigned char b;
} color;

typedef struct {
 color data[MAXHEIGHT][MAXWIDTH];
} img;
--------------
531デフォルトの名無しさん:2005/07/29(金) 12:00:39
>>526
配列にいじめられたのか?
小さい頃、配列に噛まれたとか・・・
トラウマってやつ?
532続き:2005/07/29(金) 12:01:23
これをcygwin + gccでコンパイルすると通るのですが、実行すると以下のエラーが出ました。

  5 [main] img 1980 handle_exceptions: Exception: STATUS_STACK_OVERFLOW
634 [main] img 1980 open_stackdumpfile: Dumping stack trace to img.exe.stack dump

MAXWIDTHとMAXHEIGHTをそれぞれ 590 程度にしたところ、エラーはなくなったのですが、
スタック領域2MBの制限を受けているということでしょうか?他のスレで聞いたところ、
imgは静的変数なんでスタックには配置されないらしいのですが、なぜこのようなエラーが出るのでしょうか?

# static img tmp;のようにしたところそのエラーは出なくなったのですが、staticをつける必要はあるのでしょうか?
533デフォルトの名無しさん:2005/07/29(金) 12:29:42
>imgは静的変数なんでスタックには配置されないらしいのですが
自動変数じゃん
534デフォルトの名無しさん:2005/07/29(金) 12:38:21
gccで可変長配列を使ってみていたのですが、うまく動作していません。
なぜでしょうか?
コードは以下のようなものです。

void func(int size)
{
 int i;
 int buf[size];

 for (i = 0; i < size; i++)
  buf[i] = i;
}

bufに変な数値が入ってしまってるのです。
535デフォルトの名無しさん:2005/07/29(金) 12:43:14
>>534
それをどんな風に使ってる?
536デフォルトの名無しさん:2005/07/29(金) 13:09:06
>>532
自分で改変するからバグるんだってば。
元のtest0.cでも問題なく動くよ。
つーか、スレ違いなんだから初心者スレでも環境依存OKスレにでも行ってくれ。
537デフォルトの名無しさん:2005/07/29(金) 13:18:19
ああ…、やっぱりやっちまってる…
>>533
"cygwin + mingwn + gcc 相談室" では別の質問から始まった。
基のURL上のサンプル test0.cでは静的変数だから、スタック関係ない、
と言われただけ。
つまり、スタックもローカル/グローバル変数もまるっきり解かってない。
>>530,532
おまえがいわゆる「記憶クラス」に関して何も理解しないまま、
半端な知識で、馬鹿な改悪をして質問するのが悪い。
C言語の超初心者として、勉強し直せ。教科書選びからだろうなあ。
538534:2005/07/29(金) 13:20:36
動作がおかしいんでステップ実行で見てたら、可変長配列の中身が
おかしくなってたんです。

buf[0] = -4523832
buf[1] = 1
buf[2~9] = 0
...

普通に固定長の配列として宣言したものは、当然ですがちゃんと正しい
値が代入されます。

使い方は、この後配列の中身をランダムにスワップして、ランダムな数
列として使っています。
539デフォルトの名無しさん:2005/07/29(金) 13:44:53
>>532
そもそもそのページのそのコードは、チュートリアルにはなるかも知らんが実用にはならない。
540デフォルトの名無しさん:2005/07/29(金) 14:00:45
C言語でハンゲームのIDとPWを詐取できると聞きましたが本当ですか?
541デフォルトの名無しさん:2005/07/29(金) 14:04:38
>>540
お帰り下さい。
542デフォルトの名無しさん:2005/07/29(金) 14:12:34
>>538
こちらは小さなサンプルで buf[]の内容をprintfしたのは正常だなあ。
デバッガは何をどのように使ってる?
こっちのgdbではちゃんとシンボル情報を扱えなかったようだし、
-4523832 も stack上の addr.ぽい気もするし。
とにかく step実行より確認にサンプルと実行結果を提示したほうが
よいと思われ。
そうじゃないとそちらのコードが悪いか、gccの問題か判断できないから。
543デフォルトの名無しさん:2005/07/29(金) 14:33:21
#include <stdio.h>
#include <string.h>

int main(void)
{
unsigned int i, len;
int j;
char magic[]="concatenation";
char unknown[] = "-------------";
char ch;

printf(unknown);
printf("\n");
len = strlen(magic);
for(j=0;j<15;j++){
printf("文字を入力してください\n");
ch = getchar();
for(i=0;i<len;i++){
if(ch == magic[i]){
unknown[i] = magic[i];
}
}
printf("%s\n", unknown);
if(!strcmp(magic, unknown)){
printf("Good Job!!\n");
break;
} else if(j==15){
printf("HangMan!!\n");
}
}
return 0;
}
544543:2005/07/29(金) 14:37:48
あらかじめ指定された文字列(concatenation)を当てるゲーム、ハングマンのプログラムです
これをコンパイルして実行して、たとえばcを入力すると
c--c---------
文字を入力してください
c--c---------
文字を入力してください

「文字を入力してください」の後にgetchar()があるのに2回「文字を入力してください」と表示されます
どこが間違ってるか指摘お願いします。
545デフォルトの名無しさん:2005/07/29(金) 14:43:07
>>544
'\n'も入力されるから。
546534:2005/07/29(金) 15:01:32
>>542
こちらも小さいのでテストしてみました。
printfで出力したところ、正常な数値が出力されました。
しかし、gdbで
 print buf[0]
等と確認するとめちゃくちゃな値が入ってるのですが、これはなぜでしょうか
下ので確認しました

int main(void)
{
 func(10);
 return 0;
}

void func(int size)
{
 int i;
 int buf[size];

 for (i = 0; i < size; i++) {
  buf[i] = i;
  printf("%d:%d\n", i, buf[i]);
}
}
547デフォルトの名無しさん:2005/07/29(金) 15:35:33
すげえくだらない質問なんですが、
char tex[4][4][256];
tex[1][4] = "noname";

上手くいきません。tex[1][4]に文字列を格納する方法を教えてください。
548デフォルトの名無しさん:2005/07/29(金) 15:37:10
>>547
strcpy
549デフォルトの名無しさん:2005/07/29(金) 15:39:13
>>534
じゃあ、今のところあなたのコードがおかしい「らしい」、
ということで、もとの質問に意味なくなるね。お終い。
(data sizeやら最適化やらの問題もあるかしらんが。
まあ、もともと可変長配列を使わないほうがいいだろうけど。)
550デフォルトの名無しさん:2005/07/29(金) 15:41:40
>548
そうだった。dクス
551デフォルトの名無しさん:2005/07/29(金) 15:42:18
質問です。
以下のプログラムが思うように動きません。
文字を入力してEnterを押しても何も表示されず、プログラムも終了しません。
どうすれば正常に動作するのでしょうか?

環境は、XP SP1, コンパイラはbccです。

K&R, p.22より、入力される文字をカウントするプログラム
------------
#include <stdio.h>

main()
{
long nc;

nc = 0;

while(getchar() != EOF)
++nc;

printf("%ld\n", nc);
}
---------------
552デフォルトの名無しさん:2005/07/29(金) 15:50:46
>>551
リダイレクトすればいいんじゃないの?
553デフォルトの名無しさん:2005/07/29(金) 15:55:21
質問ですが
■ ■ ■
■ ■ ■
■ ■ ■
こういう並べ方で画像など表示する時、
for (x = 0 ; x < 3 ; x++) {
 for (y = 0 ; y < 3 ; y++) {
 (描画処理)
 }
}
こんな感じだと思いますが、
   ■
  ■  ■
■  ■  ■
  ■  ■
   ■
こういう並べ方で表示する場合
どうすればいいのでしょうか?
554デフォルトの名無しさん:2005/07/29(金) 16:37:23
数字を複数入れ、その最小値はいくらです。と表示。
その時−の数字も含み、
最初に0を入れたら何もありませんでしたと表示し、途中で0を入れたら↑の最小値の表示を行うPの一例をお願いします。
555デフォルトの名無しさん:2005/07/29(金) 16:45:01
にわかにへんなのばっかわいて出てるなあ。スルー推奨。
>>1 を読んで、恥ずかしくない奴だけ質問しようよ。
556549:2005/07/29(金) 16:46:56
可変長配列にデバッガが未対応でもさほど不思議に思わぬが
(gdbなら x/3wx buf とかで済むし)ふと思い出した。
gcc -ggdb ... なら p buf[0] や p buf で大丈夫そう、だった。
(変な質問の奴ってやはり最後は挨拶無しなのね)
557デフォルトの名無しさん:2005/07/29(金) 16:58:46
>>551
EOFってCtrl+dとかじゃなかった?
558デフォルトの名無しさん:2005/07/29(金) 17:01:41
>>553
ぐちゃぐちゃ頑張るべし。

nとかで横幅を指定したいなら、
空白、黒、空白、黒、空白・・・のそれぞれの数は、
(n-1) 1 (n-1)
(n-2) 1 1 1 (n-2)
(n-3) 1 1 1 1 1 (n-3)
・・・分かりにくくてスマソ
559デフォルトの名無しさん:2005/07/29(金) 17:02:04
>>557
Win は行頭で Ctrl+Z。
560デフォルトの名無しさん:2005/07/29(金) 17:19:49
お前ら今何してる
561デフォルトの名無しさん:2005/07/29(金) 17:24:54
560の書き込みを読んでレス
562553:2005/07/29(金) 17:25:19
よく分からないけど、
綺麗なコードじゃ作れないってことですか。
サンクス。
563デフォルトの名無しさん:2005/07/29(金) 17:26:20
まあ EOFってなに? な状態だろうからなあ。
>>551
初心者が K&Rを参考にするなら、unix上でやれ。
そうでないと混乱するだろうから。
あるいは、せめて Win上での環境にも触れている副読本、
または Win上での学習書を用意しろ。目標次第だが、
そこらへんをケチれるほどの余裕はまだ無いだろうから。
564554:2005/07/29(金) 17:28:33
>>554はCですって言えばOK?>>555
565デフォルトの名無しさん:2005/07/29(金) 17:30:34
>>564
↓ここで、宿題ですって言ってこい

ぼるじょあがC/C++の宿題を片づけますYO! 48代目
http://pc8.2ch.net/test/read.cgi/tech/1121471445/l50
566デフォルトの名無しさん:2005/07/29(金) 17:30:57
>>499

#include <stdio.h>
#include <stdlib.h>

int main()
{
 char buf[10];
 int fan_no_kaitensuu;

 puts("Fanの回転数を入力して下さい。");
 fgets(buf, sizeof(buf), stdin);
 fan_no_kaitensuu = atoi(buf);
 printf("Fanの回転数は %d です。\n", fan_no_kaitensuu);

 return 0;
}
567532:2005/07/29(金) 17:35:49
関数外に書いたのはグローバル変数になるのは知っていたのですが、
staticについてはあまり知識がなかったので気づきませんでした。imgをmainの中で宣言してたから
だめだったのですね、わかりました。
568564:2005/07/29(金) 17:36:55
>>565sumaneena
569デフォルトの名無しさん:2005/07/29(金) 17:46:51
>>501
>>502さんが書かれたことと、あとは2を掛けたり2で割ったりするのが素早く
出来るというのがあります( << で2倍、 >> で 2 分の 1)。
但しそんなことは今時のPC用のプログラムではあまり考える必要はありません。
主に昔の非力な8ビットや16ビットCPU用のプログラムで多用されたワザですが、
現在では掛算割算はCPUに命令があってそれを通して行われるしCコンパイラも
最適化を行うので自分で変な最適化をしてコンパイラの最適化の邪魔をする
よりはそのまま書いちゃった方が良いと思います。(a / 2 と書くのが良いか
a >> 1 と書くのが良いかはどちらの方が見やすくて分かりやすいかという
基準で決めてよい)。
570デフォルトの名無しさん:2005/07/29(金) 17:49:09
>>567
おまえまったく駄目だよ。わかったつもりになるな。
グローバル変数になると知ってたつもりのくせに、スタックがどうこうと
言い出してたんだろ。はなからてんで理解してないじゃん。
(「記憶クラス」についてはもとより)勉強のしかた自体考え直せって。
571デフォルトの名無しさん:2005/07/29(金) 18:09:46
>>569
氏ねばいいのに。
572デフォルトの名無しさん:2005/07/29(金) 18:13:20
初心者が一時的に中途半端な(誤った)知識を持つのは
そんなにおかしいことじゃないと思うけど。
573デフォルトの名無しさん:2005/07/29(金) 18:21:24
>>566
gyahahahaha
574デフォルトの名無しさん:2005/07/29(金) 18:22:15
>>571
??
575デフォルトの名無しさん:2005/07/29(金) 18:28:30
>>574
 >>7
 >>64
 >>392
 >>501
576デフォルトの名無しさん:2005/07/29(金) 18:30:25
>>574
ビットシフト云々の質問は、最近良く見るコピペです
これにうんざりした人が、このコピペにちゃんと回答してるの見ると
過敏に反応する様です
577デフォルトの名無しさん:2005/07/29(金) 18:44:49
ビッ関連はまだ回答ネタを4,5個持ってるからな
いまくらいのペースならまだまだOK
578574:2005/07/29(金) 18:51:55
>>575
thx.
579553:2005/07/29(金) 18:56:49
>>558
スマソ。やっぱどうしても必要になるので
誰か>>553を分かりやすく解決してください。
おねがいします。
580デフォルトの名無しさん:2005/07/29(金) 19:27:27
>>579
夏休みの宿題なみだからよそでやれ。(というか消えろ)
分かりやすく言うと、
問題の法則性さえ理解しないお前には解説も無駄。
581デフォルトの名無しさん:2005/07/29(金) 19:28:21
>>579
>よく分からない
んだったら説明しても無理だろうからganngare
582デフォルトの名無しさん:2005/07/29(金) 19:29:09
>>553
おまえ、写像って学校で習った?
厨房かな
583551:2005/07/29(金) 19:45:42
ありがとうございました。解決しました。

>>552
どこでリダイレクトを使えばいいんですか?

>>557
>>559
ありがとうございます。Enterの後、Ctrl+Zでなんとか通りました。
文末に行ったらgetchar()が自動的にEOFを返すもんだと勝手に思ってたのが原因みたいです。
自分で入力しなきゃいけないんですね。
584デフォルトの名無しさん:2005/07/29(金) 20:06:59
つ>553
void func(int n)
{
int y, x, z, m, flg;
m = n / 2;
for(y=0;y<n;y++){
if(y<n/2){
m = (n / 2) - y;
}else{
m = y - (n / 2);
}
for(x=0;x<n;x++){
if(x<m){
printf("△");
}else if(x<n-m){
if((m+x)%2==0){
printf("●");
}else{
printf("○");
}
}else{
printf("□");
}
}
puts("");
}
}
585デフォルトの名無しさん:2005/07/29(金) 20:19:59
>582が何を言ってるのか一瞬分からなかったけど、
回転行列のことか、納得。

>553
>584で満足できなかったら
「行列」「行列式」「一次変換」「回転行列」
で具具って数学の勉強ガン( ゚д゚)ガレ
586デフォルトの名無しさん:2005/07/29(金) 20:23:08
>>584
>>1 読めよ。ソース丸投げな「プログラミング」の話は
スレ違いだろ。
587デフォルトの名無しさん:2005/07/29(金) 20:30:06
>>572
はあ? 誰もおかしがっとらんだろ?
おそらくは無知に気がつかないままの迷惑な半端ものや、
それこそ努力以上に理解力や論理能力の足りない人やらは、
はいて捨てる程いるので、みんなうんざりしてるだろうけど。
588デフォルトの名無しさん:2005/07/29(金) 21:40:50
>>583

>どこでリダイレクト
( ´゜д゜`)

>文末に行ったら〜EOF
( ´゜д゜`)

激しくがんがれ。

589デフォルトの名無しさん:2005/07/29(金) 23:37:28
#include <stdio.h>
typedef struct Test {
int unko;
}Test;
void hoge( void *p ){
}
main()
{
Test *baka;
hoge( &baka );
}

Test のポインタのポインタなのに、コンパイルが通ってしまうのは
問題ではないのですか? void ** 型なら納得できるけど。
Win32 SDK の話になりますが、 SelectObject( hdc, &oldpen ); なんて
やってるソースを見かけたことがあります。
590デフォルトの名無しさん:2005/07/29(金) 23:42:11
>>589
どんなポインタ型もvoid *へ変換できるし、その逆もまた可能。(さすがにC++では逆はキャストが必要になったが)
ポインタへのポインタ型もポインタ型の一種であることには間違いないのだからそんなのも問題ない。
591503:2005/07/29(金) 23:42:45
>>513-515
回答ありがとうございます。>>514の方法はすごいです。文字列化演算子なんて
ある事すら忘れていました。それから、>>514を一つのファイル内でできるようにしてみました。
ただ、要素をコメントアウトするのに // では無理で /**/ を使わなければならなくなって
しまいましたが…。

#define FRUITS_LIST {\
HOGE(apple),\
HOGE(orange),\
HOGE(banana),\
}
#define HOGE(X) X
enum FRUITS_LIST;
#undef HOGE
#define HOGE(X) #X
char *s[] = FRUITS_LIST;
592デフォルトの名無しさん:2005/07/29(金) 23:48:49
>>591
Boost Preprocesser libraryを使えばもうちょっと自然にできると思われる。
593デフォルトの名無しさん:2005/07/30(土) 03:55:11
質問です。
malloc関数でメモリを確保して配列にしたいのですが、
その配列を2次元配列として扱っていくにはどうしたらよいでしょうか?
つまり配列の縦横の大きさの定義ができればと思うのですが・・・
594デフォルトの名無しさん:2005/07/30(土) 05:25:11
例えば int hoge[x][y]の様な2次元配列として扱うときは

int (*hoge)[y] = malloc(x * y);
595593:2005/07/30(土) 06:24:10
>>594
レスありがとうございます。勉強になります。
ところでこのやり方は関数中ではできないのでしょうか?

 int   width, hight;
 char *data;
 <scanfでhight, widthを入力>
 data[width] = (char)malloc(sizeof(char) * hight*width );

とすると'data' used before setとエラーが出てしまいます。
596デフォルトの名無しさん:2005/07/30(土) 06:28:45
>>595
data = (char *)malloc(sizeof(char) * hight*width );
597593:2005/07/30(土) 06:38:34
>>596
素早いレス感謝です。
その配列を2次元配列(data[hight][width])として扱いたいというのが質問なのですが、
そのままでは1次元配列として扱われてしまいませんか?

最初に
char *data[1000][1000]
などとして十分に大きなメモリを確保すればすむ話ではあるのですが、
できれば関数中でできればと思いまして。
598デフォルトの名無しさん:2005/07/30(土) 06:49:41
>>597
たしかに一次元配列になっている。
dataにアクセスするときにはdata[y * width + x]とする。これで[y][x]相当。
599593:2005/07/30(土) 06:57:32
>>598
ありがとうございます。やはりそうするしかないですか。
そのことは知っていたのですが、扱いの利便性から2次元にできればと思ったのです。
回答ありがとうございました
600デフォルトの名無しさん:2005/07/30(土) 06:59:09
>>593
char (*data)[WIDTH];
data[i][j] は *(data + i*WIDTH + j)
宣言時にwidthが解っていないと、
データを格納するアドレスを計算できない

それから、char *data[1000][1000]
だと、charへのポインタ がたくさん確保されちゃうよ
601デフォルトの名無しさん:2005/07/30(土) 07:18:12
602デフォルトの名無しさん:2005/07/30(土) 07:31:44
C99なら可変長配列じゃないけどこんな書き方もできたような気がする。
char (*data)[width] = malloc(sizeof (char) * height * width);
603593:2005/07/30(土) 08:01:54
>>600
ありがとうございます。そのようですね。
>ポインタがたくさん
うわわ、おっしゃるとおりです。おはずかしい


>>601
参考にさせていただきます。
色々なやり方があるのですね。


>>602
ありがとうございます。
助かります
604594:2005/07/30(土) 08:50:10
>>593
ごめん、mallocの引数にsizeof(int)かけてなかった・・・orz
602の人の、レスの方が正しい書き方だね
605デフォルトの名無しさん:2005/07/30(土) 09:55:41
struct foo{
int ary[4][4];
}

struct foo *p;

p = (struct foo *)malloc(sizeof(struct foo));

p->ary[0][0] = ....;
...
606デフォルトの名無しさん:2005/07/30(土) 10:51:35
>>604
いいや、sizeof(char)なんて無駄なことをしているのは正しくない。

>>605
流れ嫁。
それではwidthとheightを可変にすると言う目的には使えないぞ。

>>593
変に凝らずに、data[x + width * y]というアクセス方法に馴れておいた方がいいぞ。
毎回書くのがいやなら、
int offset(int x, int y, unsigned width) {return x + width * y;}
なんて関数にしておくといい。
607デフォルトの名無しさん:2005/07/30(土) 12:34:25
608デフォルトの名無しさん:2005/07/30(土) 13:33:33
(int **) ary2(int y, int x)
{
int **p;
p = (int **)malloc(sizeof(int *))*y);
p[0] = (int *)malloc(sizeof(int)*x*y);
for(i=1;i<y;i++)
p[i] = p[i-1]+x;

return p;
}
609デフォルトの名無しさん:2005/07/30(土) 19:40:00
>>602
どの辺りがC99なの?
610デフォルトの名無しさん:2005/07/30(土) 20:41:10
#include <stdio.h>
#include <string.h>

void reverse(char str[]);

main()
{
int i;
char s[5];

for(i = 0; i < 5; i++)
s[i] = 'a' + i;
reverse(s);
printf("%s", s);
return 0;
}

void reverse(char s[])
{
int c, i, j;

for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
c = s[i], s[i] = s[j], s[j] = c;
}
これを実行すると"Bedcba"と表示してフリーズするんですけどどこがいけないんですか?
611デフォルトの名無しさん:2005/07/30(土) 20:42:27
5
612デフォルトの名無しさん:2005/07/30(土) 20:45:00
>611
すみません。ありがとうございます。
613デフォルトの名無しさん:2005/07/31(日) 05:15:26
>>609
(*data)[width]のwidthが定数でないところ。
614デフォルトの名無しさん:2005/07/31(日) 05:22:00
まさか可変長配列のつもりなのかっ
615デフォルトの名無しさん:2005/07/31(日) 05:53:26
>>614
だから602は可変長配列じゃないってことわっているじゃないか。
616デフォルトの名無しさん:2005/07/31(日) 06:10:51
おい!!!おれは心底、コボラーだ!!!
そんなおれは、Cとやらをサンデープログラマーしてやる!!!

さあ、何時間あれば習得でける!!!

さあ!!!

617デフォルトの名無しさん:2005/07/31(日) 06:12:46
まあ、おれのIQなら、3時間あれば、いまどきの若者の1年学習分は習得でけると思うが・・・

おおおん!!!どないやねん!!!

618デフォルトの名無しさん:2005/07/31(日) 06:48:49
http://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H15b2/pm10.html

上記問題、設問1の(b)は、
エの「++CP」が正解になっています。
ウの「cp+1」では、不正解なのでしょうか?

実行結果は同じになると思いますが、
わざわざインクリメントを使用する意味が分かりません。

よろしくお願いします。
619デフォルトの名無しさん:2005/07/31(日) 06:51:57
>>618
まずは実行してみろ。
話はそれからだ。
620デフォルトの名無しさん:2005/07/31(日) 07:11:56
>>618
うんちがしたくなってきた・・・
621デフォルトの名無しさん:2005/07/31(日) 07:38:37
>>613
それは別にANSI-Cでも認められてるけど。
622デフォルトの名無しさん:2005/07/31(日) 08:05:40
>>621
だからC99じゃないと無理だって。
試してみろよ。
623デフォルトの名無しさん:2005/07/31(日) 08:22:25
試したくないし。
624デフォルトの名無しさん:2005/07/31(日) 08:30:49
夏や
625デフォルトの名無しさん:2005/07/31(日) 08:58:17
何を今Lhasa
626618:2005/07/31(日) 09:12:43
解決しました。
長文になると、変な勘違いを起こして、
そこから抜け出れませんでした。
627デフォルトの名無しさん:2005/07/31(日) 12:51:42
20年以上のCOBOL歴あり。

ずばり、何日で習得できる!!!

※45歳毒
628デフォルトの名無しさん:2005/07/31(日) 12:54:55
>>627
COBOLを書いていたのなら数日。
書かされていたのなら無理。
629デフォルトの名無しさん:2005/07/31(日) 13:15:06
作りたいプログラムの一部がうまくいかないのでまずその一部を切り取って
簡略化して、ちゃんと動くようにしたいんですけど…

キーボードからAかBを入力しそれとその文字列の長さ
(AAABABBBA なら 9 を)出力させたいのですが。。

#include <stdio.h>

int main(void)
{
char c[256];
int t;
t=strlen(c);

printf("AかBを入力。Ctrl-zで終了します:");
scanf("%s",&c);
while((c[256] = getchar()) != EOF){
printf("%s",c);
}
printf("%d",t);
}

長さが3と出て、うまく行きません。while文がおかしそうなんですけれども。
どこがまずいんでしょうか??
630デフォルトの名無しさん:2005/07/31(日) 13:16:47
すごいな。
631デフォルトの名無しさん:2005/07/31(日) 13:22:05

つまんね
632デフォルトの名無しさん:2005/07/31(日) 13:58:45
ネタなんだろうが一応マジレスしておこう。
>t=strlen(c);
c は未初期化でまだ何も入ってない。適当な値しか返ってこない。
>scanf("%s",&c);
char * を引数にとるので、意味的には scanf("%s", c); が正しいはず。&c だと char[256] へのポインタだ。
>while((c[256] = getchar()) != EOF){
char c[256]; て宣言してるんだから有効なのは c[0]〜c[255] だ。
scanf() で読み込んでるのに何で getchar() してるの?while の意味は何?
int main(void) なんだから値を返すように。
633デフォルトの名無しさん:2005/07/31(日) 14:17:07
* 夏休みの生活
sageぐらい覚えよう/覚えてもらえ。
>>1は読もう。宿題はよそでやれ。(相手にしない。誘導)
それらはたいてい「Cの話」以前だ。
涼しい生活を
634デフォルトの名無しさん:2005/07/31(日) 15:21:02
他スレで伺っても返ってこなかったので伺いさせていただきますが(大至急なので)

VISUAL C++で
ひとつのファイルを無事成功し、
違うファイルを作り、実行しようとすると
コンパイルの時点で「_main はすでに 定義されています」
とでて、そこから先へ進めません。
成功したファイルには「プロジェクトファイル」なるものなどが勝手に作られています。
一つを実行させた後でも、何個も作業を実行するにはどうすればいいのでしょうか?
635デフォルトの名無しさん:2005/07/31(日) 15:28:18
スレ違い&マルチ開き直り
636634:2005/07/31(日) 15:35:42
すれ違いなのは承知してますし、別に開き直っていません
本当に分からないから聞いてるのです
なんでそういじめるのですか
637デフォルトの名無しさん:2005/07/31(日) 15:39:26
>すれ違いなのは承知してますし
余計たちが悪いな
638デフォルトの名無しさん:2005/07/31(日) 15:41:40
>ひとつのファイルを無事成功し、
志村ー!日本語日本語!
639デフォルトの名無しさん:2005/07/31(日) 15:42:16
> すれ違いなのは承知してますし
これを開き直りと言うのでは?
640634:2005/07/31(日) 15:43:00
いや、もちろんすいませんと思いながらですし
聞くべきところでも帰ってこなかったからお伺いしてると上で書いたのですが…
641デフォルトの名無しさん:2005/07/31(日) 15:48:32
634うざい
642デフォルトの名無しさん:2005/07/31(日) 15:59:09
>>634
言ってることがわかりません。
まずは質問の仕方から勉強してください。

>ひとつのファイルを無事成功
何が成功したの?

>違うファイルを作り、実行しようとすると
何を作って、何を実行しようとしたの?

>成功したファイルには〜
だから意味がわからん。

>一つを実行させた後でも、何個も作業を実行するには〜
何を実行するの?何個も作業を実行ってどういうこと?
643634:2005/07/31(日) 16:02:57
伺っといていうのも申し訳ありませんが、
どうしてそんなに変に細かいのですか?
普通に教えて頂ければ簡単に済む事なのに…
もういいです。失礼いたしました。
日常生活では是非お気をつけ下さい
644デフォルトの名無しさん:2005/07/31(日) 16:08:50
>>643
オマエモナー
645642:2005/07/31(日) 16:12:36
>>643
質問に答えようにも
あなたの説明では状況が全然わからないのです。
私達だって神様ではありません。
状況を理解するために適切な情報がないとどうしようもありません。

まず、質問をする際はちゃんと要点をまとめてください。
その後、自分で読み直して意味が通じるかどうか確認してください。


>日常生活では是非お気をつけ下さい
少し言い方がきつかったかもしれませんね。その点は反省します。
でも、あなたの方こそ気をつけるべきだと思いますよ。
646デフォルトの名無しさん:2005/07/31(日) 16:15:29
>>642
おまいもスレ違いって事に気付け
647642:2005/07/31(日) 16:18:41
>>646
ごめん。
648デフォルトの名無しさん:2005/07/31(日) 17:32:18
>>634
あなたが大至急だろうがなんだろうが、関係ありません。ここで
その質問はスレ違いです。以下のスレへ移動してください。
★初心者にVisual C++を教えるスレ★ Part20
http://pc8.2ch.net/test/read.cgi/tech/1120222322/
649デフォルトの名無しさん:2005/07/31(日) 17:40:08
>>648
いや、見てみればわかるが、そのスレには既にw
650デフォルトの名無しさん:2005/07/31(日) 17:44:07
>>649
見た上で言っているわけだが。
651デフォルトの名無しさん:2005/07/31(日) 17:45:57
>>648 とっくにそっちで聞いてたみたいだぞ。
単にツールの使い方をまったく知らない初心者未満だから、
教えようもないのだろうけど。使い方読めよ。
"くだすれVisual C++(超初心者用)" じゃあないのか。
652デフォルトの名無しさん:2005/07/31(日) 17:54:50
しかしこんなのが大至急ってのもな…宿題か何かか?
653デフォルトの名無しさん:2005/07/31(日) 19:50:52
0〜2の値を取り得る変数 a,b,c があります。
b!=c であることは保証されてます。

a に、 bでもcでも無い値を入れたいのですが
これを1行でかっこよく書く方法はありますか?
654デフォルトの名無しさん:2005/07/31(日) 19:57:21
3-b-c
適当なので正しく動くかどうかは知らん。
655デフォルトの名無しさん:2005/07/31(日) 19:59:40
a = 3-b-c;
っつーのはどうだろう。
656655:2005/07/31(日) 20:00:18
>654
すまん、ダブった。
657デフォルトの名無しさん:2005/07/31(日) 20:00:37
>>654
ありがとうございます(><)!
658デフォルトの名無しさん:2005/07/31(日) 20:00:58
少しひねって
a = 3 ^ b ^ c
とかどう
659デフォルトの名無しさん:2005/07/31(日) 20:01:08
#コメント書くほうが大変ねw
660デフォルトの名無しさん:2005/07/31(日) 20:03:47
(b|c)^3
661デフォルトの名無しさん:2005/07/31(日) 20:06:54
b!=c であることが保証されておらず、かつ0〜2の範囲にあるとも限らないときに
aが0〜2の範囲内でさらにa!=bかつa!=cであるようにaを決めたいときは
さすがに1行じゃあ無理だろうな
662デフォルトの名無しさん:2005/07/31(日) 20:18:36
>>661
それじゃ解が一つに定まらんだろう
663デフォルトの名無しさん:2005/07/31(日) 20:28:36
私ゃ無条件に3-b-cが無難と思ったが、b!=cのときの例外処理を考えると
3^b^cならばb==cのときに常に3になるので検出しやすいのね。
664デフォルトの名無しさん:2005/07/31(日) 20:30:44
>>662
そのときは0から順に適当な数値をaに
665デフォルトの名無しさん:2005/07/31(日) 20:52:17
>>657は実は女
666デフォルトの名無しさん:2005/07/31(日) 20:53:46
だからなに?
667デフォルトの名無しさん:2005/07/31(日) 22:40:20
>>665
a = ( (b!=0)&&(c!=0) ) ? 0 : ( (b!=1)&&(c!=1) ? 1 : 2 );
これでいいですか(><)?
668デフォルトの名無しさん:2005/07/31(日) 23:07:43
正直、関数の引数に、

char *a

って書くのと、

char a[]

って書くのの違いが分からない。

何が違うのだ?
669デフォルトの名無しさん:2005/07/31(日) 23:15:11
>>668
上はコンパイルできるが下はコンパイルできない。
670デフォルトの名無しさん:2005/07/31(日) 23:16:29
>>668
変わらない。
引数に配列を指定してもポインタ(char*)に成り下がる。

関数側と関数の呼び出し側とでsizeof(a)してみて。
671デフォルトの名無しさん:2005/07/31(日) 23:19:33
CFAQ嫁
672デフォルトの名無しさん:2005/07/31(日) 23:23:37
関数の引数にってちゃんと書いてあった・・・
673デフォルトの名無しさん:2005/07/31(日) 23:29:25
「char a[]」って書いたら「char * const a」になって欲しいと思うんだが、
そうなってないのか?
674デフォルトの名無しさん:2005/07/31(日) 23:38:10
>>673
勝手にconstになられたら、困ります(><)!
675デフォルトの名無しさん:2005/08/01(月) 00:32:59
>>674
const char*
じゃなくて
char* const
だぞ?
676デフォルトの名無しさん:2005/08/01(月) 00:41:28
またお前か
677デフォルトの名無しさん:2005/08/01(月) 00:48:10
a++したい時はあるな。
678デフォルトの名無しさん:2005/08/01(月) 01:29:18
予期しないEOFを検出しました
とはどういう意味でしょう?
679デフォルトの名無しさん:2005/08/01(月) 01:32:48
>>678
予想もしなかったEOFを食らって森崎くんが吹っ飛んだ
680デフォルトの名無しさん:2005/08/01(月) 01:37:37
>>678
予期しないEOFを検出した。

括弧の閉じ忘れやセミコロンが無かったりしてない?
681デフォルトの名無しさん:2005/08/01(月) 01:50:29
>>680みてみます
ありがとうです
682デフォルトの名無しさん:2005/08/01(月) 02:06:07
char型というのは'で囲んだ一文字ですよね?
ではなぜ '\\' や '\"' といったものが成立するのですか?
683デフォルトの名無しさん:2005/08/01(月) 02:16:27
>>682
\nとかは2文字で1文字なんだよ
北斗と南みたいなもんだな
684デフォルトの名無しさん:2005/08/01(月) 02:23:23
ありがとう
685デフォルトの名無しさん:2005/08/01(月) 02:57:46
struct A { struct B b; };
struct B { struct A a; };

という、ふたつの構造体を定義したいんだけど
どうしたらいいんだっけ
686デフォルトの名無しさん:2005/08/01(月) 03:00:16
間違えた
struct A { struct B *b; };
struct B { struct A *a; };
だった
687デフォルトの名無しさん:2005/08/01(月) 03:35:24
はーい先生質問!

穴埋め配列問題
int a[8];, int b[29]で確保した配列aを、配列bの先頭部分へコピー
************************
for(k = 0; k < 8; k++)

??? = ???;
************************
の???て何が入るのん?

変数kの処理を8回繰り返して得たデータを配列bの先頭に入れろって事?
b[0] = a[8]とか
b[8] = aとかやっても間違ってるってでるよママン。
そんなに難しい問題じゃ無いのはわかってるんだけども誰か教えて下さいまし。
。・゚・(ノД`)・゚・。
688デフォルトの名無しさん:2005/08/01(月) 03:39:51
b[k]=a[k];
689デフォルトの名無しさん:2005/08/01(月) 03:43:18
。・゚・(ノД`)・゚・。…

神様ありがとうございました。
690デフォルトの名無しさん:2005/08/01(月) 03:44:27
>>686
定石があるのかどうか知らないけど、思いついたのはこれ

typedef struct _a A;
typedef struct _b B;
struct _a { B *b; };
struct _b { A *a; };
691デフォルトの名無しさん:2005/08/01(月) 03:49:35
て言うか凄いねここの人たち!
誰かC++に詳しい人メッセ友達になって欲しい…
692デフォルトの名無しさん:2005/08/01(月) 03:50:05
うっさいはげ
693デフォルトの名無しさん:2005/08/01(月) 05:44:43
>>692
そんな気にしてることいわないでよ(ノД`)
せめてかわいらしくぱげっていって
694デフォルトの名無しさん:2005/08/01(月) 06:07:51
>>693
うるさいぞっ♪ハゲ♪
695デフォルトの名無しさん:2005/08/01(月) 07:34:27
Windowsユーザーなのですが、プログラムをDOS窓でしか動かしたことがありません。
ユーザーインターフェイス(?)を持ったプログラムを作成するにはどのようにしたら良いのでしょうか?
696デフォルトの名無しさん:2005/08/01(月) 07:45:17
DOS窓はUIを持ってないのかwwww
697デフォルトの名無しさん:2005/08/01(月) 07:52:27
BCB6を買うといいよ
698735:2005/08/01(月) 08:01:30
>>696
ええっと、ごめんなさい。おっしゃることがよく理解できません
UI=ユーザーインターフェイスかな?

たとえば
#include<stdio.h>
int main(void){
   int a;
   scanf("%d",&a);
   printf("a+1 = %d",a+1);
   return 0;
}
ではDOS窓に数字を打ち込むとそれに1足した数字が表示されるというものができますよね。
それをインターフェイスを表示して計算させるようにさせたいのですが・・・

もしかしてC以前の質問だったでしょうか
699デフォルトの名無しさん:2005/08/01(月) 08:05:08
「ユーザーインターフェース」という単語の意味を調べたことはありますか?
700デフォルトの名無しさん:2005/08/01(月) 08:06:41
もうひとつ
>>1を読んだことはありますか?
701デフォルトの名無しさん:2005/08/01(月) 08:07:19
ヒント:CUIとGUIでぐぐれ
702デフォルトの名無しさん:2005/08/01(月) 08:09:00
>>698
CUIとGUIという単語について調べてみ
703702:2005/08/01(月) 08:10:01
うは、>701とかぶったw
704695:2005/08/01(月) 08:11:44
698の名前書き間違えましたorz


>>697
ありがとうございます。
プログラミング段階の問題ではなくて開発環境の問題ということでしょうか


>>699
なるほど。自分で質問の問題を調べた時に出てきた単語を勘違いして認識していました。
DOS窓自体もユーザーインターフェイスなのですね。
質問の意図としては自分でUIの形態を設定することができないのかということになりましょうか。
705695:2005/08/01(月) 08:17:04
>>700
1はよんでいたのですがFAQのほうに注目していました。
C自身の問題とはちょっとずれてしまうようですね。
失礼しました

>>701>>702
ありがとうございます。
GUIで表示したいという質問内容でした。
もう少し調べてみたいと思います。
706デフォルトの名無しさん:2005/08/01(月) 08:18:13
>>705
そこまで解ったのなら、
自分が使ってるコンパイラもしくは統合開発環境の質問スレへGO!
707デフォルトの名無しさん:2005/08/01(月) 18:49:34
ぐいぐいぐーーーい
708デフォルトの名無しさん:2005/08/01(月) 19:04:30
ヴァカと厨房はプログラムなんか書くな
709デフォルトの名無しさん:2005/08/02(火) 02:41:06
困った・・・UNIX CでDB(Oracle)にアクセスするプログラムを組まなきゃいけなくなったんだが、
さっぱりだ・・・取っ掛かりすら・・・
何か参考になるいいサイトとかないでしょうか?
710デフォルトの名無しさん:2005/08/02(火) 07:44:11
>>709
つ[www.oracle.co.jp]
711デフォルトの名無しさん:2005/08/02(火) 10:07:51
OracleといえばPro*Cってまだ現役なの?
712デフォルトの名無しさん:2005/08/02(火) 14:15:19
>>711
少なくともウチでは現役バリバリ。
>>709 のように UNIX+C の組み合わせで
クライアント側だと他に解がないし。
713デフォルトの名無しさん:2005/08/02(火) 18:13:36
マルチスレッドプログラミングについて教えてもらいたいです。
問題は、
(1)簡単なスレッドプログラミング及びスレッドの動作について解説せよ。
(2)相互封鎖や相互実行が起こるプログラムを作成し、その動作を解説せよ。
(3)マルチスレッドで、turnやflagを使った排他制御のプログラムを作成し、その動作を解説せよ。
(4)消費者・生産者問題のプログラムを解説せよ。

です。宜しくお願いします。
714713:2005/08/02(火) 18:19:29
すみません、言語はCです。
検索しましたが、javaばかりでCが載ってないので聞いてみました。
ヒントだけでもいいのでお願いします。
715ヒント:2005/08/02(火) 18:59:15
>>713
こちらへどうぞ
マルチスレッドプログラミング相談室 その3
http://pc8.2ch.net/test/read.cgi/tech/1098268137/l50
716デフォルトの名無しさん:2005/08/02(火) 19:06:19
>>714
スレ違い。
マルチスレッドプログラミングスレなどへどうぞ。
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
717デフォルトの名無しさん:2005/08/02(火) 20:15:34
>>709
PerlでDBI、これ最強
718デフォルトの名無しさん:2005/08/02(火) 20:20:32
"あいうえお"と表示した後、"かきくけこ"と上書をしたいんですがどうしたらいいんですか?
719デフォルトの名無しさん:2005/08/02(火) 20:21:54
>>718

printf("あいうえお");
putchar('\r');
fflush(stdout);
printf("かきくけこ");
fflush(stdout);
720デフォルトの名無しさん:2005/08/02(火) 20:35:55
>>719
わかりました。ありがとうございます
721デフォルトの名無しさん:2005/08/02(火) 20:59:14
>>720
もう見てないかも知れないが注意すべき点を書いておく。

\r (CR) でカーソルが行の先頭に動くというのはそういう風に動く
端末だからであって、これは全世界の端末が必ずそう動くという
保証はない。カーソルが全く動かず無視される端末もある。
722デフォルトの名無しさん:2005/08/02(火) 21:03:24
ワイド文字列について質問です
ワイド文字は内部的にはどのエンコードで保存されているかは環境依存ということで合ってますか?
ある文字のワイド文字での値は環境ごとに異なることも十分にあり得るということでOK?
723デフォルトの名無しさん:2005/08/02(火) 21:11:54
>>722
環境ごとに違うっつーか
「ワイド文字列 (って何だ?)」 をそもそも認識しない
という素敵空間の方が世の中の8割を占めております
724デフォルトの名無しさん:2005/08/02(火) 21:17:12
>>719
\rをprintfで出力しないのはなぜ?

>>721
確かにそうかもしれないが
標準では行頭へ移動することが決められている

printf("a\n");とかも無視される処理系があるかもしれんし
「規格通りではない処理系がある」という話はキリがないぞ
(少なくともこのスレでは)ナンセンスな話だ
725デフォルトの名無しさん:2005/08/02(火) 21:32:35
>>724
どうだろうな 出力先にも寄るし
printfの出力先はコンソールだけじゃないことを
肝に銘じておいてクダサイ。
726デフォルトの名無しさん:2005/08/02(火) 21:34:06
ナンセンスでもなければ肝に銘じるほどでもないかな、
知っていて損はない程度か。
727デフォルトの名無しさん:2005/08/02(火) 21:46:05
>>724
\r を printf で出力しないのは気分の問題。

しかし \r で CR の動作をするは「標準」というよりは
デファクトスタンダードなのでは?
728デフォルトの名無しさん:2005/08/02(火) 21:49:26
>>724
そこまで規格で決められてるのか?
729デフォルトの名無しさん:2005/08/02(火) 21:54:16
そもそもキャリッジリターン、ラインフィードと言うからには
プリンタの制御コードがハシリなのかと調べてみてるけど
見つからない。
730デフォルトの名無しさん:2005/08/02(火) 21:59:23
ちょっとまて確認。
>>724
>>標準では行頭へ移動することが決められている
ここでいう「標準」って、何の事を指している?
731730:2005/08/02(火) 22:17:05
>>727
せめて、言語仕様(規格?)で '\r' が「復帰」を表す制御文字であることと、
制御文字「復帰」の振舞い(動作)の期待が何に基づいているのか、
の区別はしたほうがいいぞ。
732デフォルトの名無しさん:2005/08/02(火) 22:59:40
JISX3010
5.2.2
実行文字集合中の非図形文字を表す英字逆斜線表記は, 次に列挙する表示装置上での動作を生じることを意図する。
  :
  :
\r 復帰 (cariage return) 現表示位置をその行の最初の位置に移動する。


意図するって何だよ。ファイルに書き込む場合は別だってさ。
733デフォルトの名無しさん:2005/08/02(火) 23:04:45
>>722
合ってる。
同じエンコードの同じ文字を表現するマルチバイト文字をwchar_tにし
ても、実際Windows、glibc、NetBSDでwchar_tの値がまったく違う。
734デフォルトの名無しさん:2005/08/02(火) 23:25:35
質問1 ポインタ型変数とint型変数のビット数が同じことは保証されていますか?
 ア) 規格で保証されている。
 イ) 保証はされていないが、ほとんどの処理系でそうなってる。
 ウ) そんなことは全然無い。

質問2 1の回答がア・イの場合。(ウの場合は無視してくれい) 整数型をint型で
     宣言ていれば他の型よりも速いコードとなる確率が高い。
 エ) そう。(←この答えの場合解説をつけてくれるとありがたい)
 オ) そんなことは無い。

よろしくおねがいします。
735デフォルトの名無しさん:2005/08/02(火) 23:25:41
単純なところではUTF-16だったり32だったり。
736デフォルトの名無しさん:2005/08/02(火) 23:28:48
>>734
737デフォルトの名無しさん:2005/08/02(火) 23:30:09
>>734
1 ウ たとえばDOS/Win16ではintは16ビット、farポインタは32ビット。Win64はintは32ビット、ポインタは64ビット。
代わりにC99の<stdint.h>のintptr_t/uintptr_tがポインタと相互変換しても値不変を保証する型として存在する。
2 エ intは実行する環境で最も自然な型となっているのだから早いと言うのも期待していいだろう。
738デフォルトの名無しさん:2005/08/02(火) 23:30:37
ほとんどの処理系って言われてもな。
組み込み系まで入れればバラバラだし
739734:2005/08/02(火) 23:37:47
すばやい回答どうもです。
740730:2005/08/02(火) 23:46:47
>>732
だから、「意図している」(期待している?)だけであって、
動作が生じることを定義や決定しているわけでないよなあ。
なわけで、>>724あたりが何を言ってるのかよくわからんと。
741デフォルトの名無しさん:2005/08/03(水) 00:26:29
stdioのFILEオブジェクトに対してis_readable()のような
テストをする標準的な方法は無いんでしょうか?
filenoでディスクリプタを取り出して環境依存のpollを
するのは避けたいと思っています
742デフォルトの名無しさん:2005/08/03(水) 00:58:19
>>730
>>732のことです

>>740
「意図している」の定義の差ですな
「〜なければならない」とはやっぱ違うのか…
ナンセンスは言い過ぎだったかも
743デフォルトの名無しさん:2005/08/03(水) 01:44:01
ISO/IEC 9899:1999 だと intended になってる。
shall はついてないから必ずそうなるって言ってるわけじゃなさそう。
744730:2005/08/03(水) 05:50:48
各種規格書手元に無しでえらそうにするつもりではないが、
>>742 ということなら、「C言語の規格」のその部分のみ(?)を基に、
>>標準では行頭へ移動することが決められている
と言うのはナンセンス(というか間違い)だし、つぅか……、
>>「〜なければならない」とはやっぱ違うのか…
あたりまえだ。「意図している」としか読みようが無いので、
擁護しようが無い。721のほうがまだまとも。
まあ、もともと718の上書きって、どういうデバイスに対して
どうしたいのか、さっぱりだし、それはこのスレの話かと…
745デフォルトの名無しさん:2005/08/03(水) 12:46:12
最大公約数と、最小公倍数を求めるプログラムです
#include<stdio.h>

int gcd( int m, int n );
int lcm( int m, int n );

int main(void)
{

int m,n,x,y;

while(1){
printf("(実数)\n");
scanf("%d%d",&m,&n);
if(m>2000000000||n>2000000000)
printf("ERROR\n");
else
break;
}

x=gcd(m,n);
y=lcm(m,n);
printf("\n%d\n",x);
printf("%d\n",y);

return 0;
}
746デフォルトの名無しさん:2005/08/03(水) 12:46:52
//*********************************************************
// 最大公約数(Greatest Common Divisor)を返す。
//*********************************************************
int gcd( int m, int n )
{
while( m != n )
{
if ( m > n ) m = m - n;
else n = n - m;
}
return m;
}

//*********************************************************
// 最小公倍数(Least Common Multiple)を返す。
//*********************************************************
int lcm( int m, int n )
{
return ((m / gcd(m, n)) * n);
}

このプログラムを最小公倍数が20億を超えないようにするにはどうすればよろしいでしょうか??
よろしくお願いいたしますm(__)m
747デフォルトの名無しさん:2005/08/03(水) 13:04:53
>>745-746
マルチ乙
748デフォルトの名無しさん:2005/08/03(水) 13:05:52
なにこの読み込み不一致で無限ループプログラム
749デフォルトの名無しさん:2005/08/03(水) 13:59:08
>>748
そうしろって教師に言われた
750デフォルトの名無しさん:2005/08/03(水) 21:03:36
scanf()なんてC言語のエキスパートでも使いこなせない
関数を授業で使わせる教師は逝ってよしだな
751デフォルトの名無しさん:2005/08/03(水) 21:24:29
scanfを使いこなせないのは>>750だけ
752デフォルトの名無しさん:2005/08/03(水) 21:59:02
>>750
エキスパートなら使いこなせるが、使わないだけだ

クライアントに使えと指示されればきちんと問題なく使うのがプロ
753デフォルトの名無しさん:2005/08/03(水) 22:24:40
>>750
scanfを使いこなせないのは>>750だけ
754デフォルトの名無しさん:2005/08/04(木) 02:33:07
Cプログラマは char *ptr と書く
C++プログラマは char* ptr と書く
この違いはなんなんですか
755デフォルトの名無しさん:2005/08/04(木) 02:46:48
>>754
俺はC++プログラマだけど、char *ptr って書くぞ。

Cプログラマは i++ と書く
C++プログラマは ++i と書く
って話なら分かるけど。
756デフォルトの名無しさん:2005/08/04(木) 02:58:33
>>754
「char*」で1つの型だと考えるからくっ付けたくなるのでは?
757デフォルトの名無しさん:2005/08/04(木) 03:16:26
「char* ptr」派はそういう理屈でやってるみたいだけど
char* a, b; とした時に a と b が異なる型になるんで、俺は「char *ptr」派。
もっとも、一文で複数の変数宣言するようなことはやらんけど。
758デフォルトの名無しさん:2005/08/04(木) 03:39:23
参照で char &a とするのは見にくいし、
これにあわせてポインタも char *a とはしないんじゃないの?
759デフォルトの名無しさん:2005/08/04(木) 03:45:34
俺は、一文で複数の変数宣言をしないと言う前提で「char* ptr」派
760デフォルトの名無しさん:2005/08/04(木) 11:14:41
char * ptr; と書く俺は何プログラマですか?
761デフォルトの名無しさん:2005/08/04(木) 11:18:30
ただのバカだろ
762デフォルトの名無しさん:2005/08/04(木) 11:47:41
>>760
そんなんでウケ取れるとかマジで思ってんの?
763デフォルトの名無しさん:2005/08/04(木) 12:22:47
課題出たんですけどプログラミングとか苦手で全くできません
誰かお願いします

課題内容
与えられた有向グラフGに対し,強連結成分を求めるプログラムを作りなさい
ただし,Gの入力は以下の形式に記述されたテキストファイルによるものとする:

Gの頂点数
Gの隣接行列

たとえば、次は頂点数が4のグラフの例である.


 0  1 −1  0
−1  0  1 −1
 1 −1  0 −1
 0  1  1  0

また,出力は各強連結成分について,含まれる頂点を1行に書き出すこと.
たとえば,上の例のグラフの場合,出力は以下のようになる:

component 1: 4
component 2: 1 2 3
764デフォルトの名無しさん:2005/08/04(木) 12:29:00
>>763
ここは宿題を丸投げするスレじゃねえよボケ
765デフォルトの名無しさん:2005/08/04(木) 12:31:12
>>763
ぼるじょあがC/C++の宿題を片づけますYO! 48代目
http://pc8.2ch.net/test/read.cgi/tech/1121471445/
766デフォルトの名無しさん:2005/08/04(木) 12:53:14
しみません。宿題なんで他の所に行きます
767デフォルトの名無しさん:2005/08/04(木) 12:54:08
>>766
なんだその態度は
768デフォルトの名無しさん:2005/08/04(木) 13:02:37
どこに載せていいかわからなかったんで・・・すみません
769ビル・ジョブス:2005/08/04(木) 15:00:24
夏休みなんだしマターリ逝けよ。
770デフォルトの名無しさん:2005/08/04(木) 15:31:27
>>767
いや、俺は萌えた<「しみません」
771デフォルトの名無しさん:2005/08/04(木) 22:29:14
正直、

char &a

が、なんで参照になるのか、わからない・・・
aのアドレスがchar型?
772デフォルトの名無しさん:2005/08/04(木) 22:30:56
>>771
単に適当な記号を使っただけと思え。
773デフォルトの名無しさん:2005/08/04(木) 23:08:28
& 「ア」ンパーサン「ド」 →アドレス
* 「ア」ス「タ」リスク→アタイ(値)
覚えやすいように決めたんだよ...
774デフォルトの名無しさん:2005/08/04(木) 23:09:54
>>773
氏ね
775デフォルトの名無しさん:2005/08/05(金) 01:07:09
参照がスレ違いだということに気づけよ…

>>760
ナカーマ
規格書も*の両側にスペース入ってるね
776デフォルトの名無しさん:2005/08/05(金) 01:26:15
char型の配列にint型の数字を入れたいのですが(char)のキャストではうまくいきません。どうすればいいんでしょうか
char mojiretu[] = "ABC";
int suuji = 3;

strcpy(mojiretu, suuji);//×
strcpy(mojiretu, (char)suuji);//×
777デフォルトの名無しさん:2005/08/05(金) 01:32:04
>>776
がんばれ!
778デフォルトの名無しさん:2005/08/05(金) 01:45:19
>>776
sprintf(mojiretsu, "%d", suuji);
779デフォルトの名無しさん:2005/08/05(金) 01:45:21
>>776
突っ込みどころの指摘だけしておく。
環境にもよるがintは大概4バイトなので、配列の長さは4以上と明示しておくべきかな。

strcpyはコピー元がNULL終端の文字列で、コピー先に十分なサイズがあることが保障されてるときのみ有効。
安全なプログラムを組みたいならsrtncpyを使いましょう。
780デフォルトの名無しさん:2005/08/05(金) 01:47:04
> 環境にもよるがintは大概4バイトなので、配列の長さは4以上と明示しておくべきかな。
えっ
781デフォルトの名無しさん:2005/08/05(金) 01:48:52
>>778
むしろこっちがやりたいかと思った。

strncpy(mojiretu, (char *)&suuji, sizeof(int));
782デフォルトの名無しさん:2005/08/05(金) 01:50:00
>>781
数「字」を入れたいって書いてあるからなぁ。>>778じゃない?
783デフォルトの名無しさん:2005/08/05(金) 01:51:54
>>781
memcpy の方がふさわしい
784776:2005/08/05(金) 08:03:15
mojiretsu配列が"ABC3"になると嬉しい感じです
提示された方法で試してみます
785デフォルトの名無しさん:2005/08/05(金) 08:35:10
>>776
sprintf(mojiretsu, "%s%d", mojiretsu, suuji);
786デフォルトの名無しさん:2005/08/05(金) 08:38:26
元を良く見てなかった。>>785の訂正

int suuji = 3;
char mojiretu[] = "ABC";
char gousei[10];
sprintf(gousei, "%s%d", mojiretsu, suuji);
787デフォルトの名無しさん:2005/08/05(金) 08:40:44
おいおい要素数4のchar配列にsprintfは無謀だぞ

>>784

char mojiretu[80] = "ABC"; /*文字列の長さを変えたい場合は配列長は大きめにとっておけ。[]だと長さは4で、終端文字を除けば3文字しか表現できない */
int suuji = 3;
788デフォルトの名無しさん:2005/08/05(金) 08:43:22
int suuji = 3;
char mojiretu[80] = "ABC";
char tmp[10];

sprintf(tmp, "%d", suuji);
strcat(mojiretu, tmp);
789デフォルトの名無しさん:2005/08/05(金) 08:58:50
>>788
sprintf(tmp + strlen(temp), "%d", suuji);でいいだろ。
790デフォルトの名無しさん:2005/08/05(金) 09:39:08
>>789
sprintf(strchr(mojiretu, '\0'), "%d", suuji);
791デフォルトの名無しさん:2005/08/05(金) 10:37:32
>>785
> sprintf(mojiretsu, "%s%d", mojiretsu, suuji);

sprintfのパラメータは restrict ポインタなので、これはダメだろう。
792デフォルトの名無しさん:2005/08/05(金) 10:40:10
うむ。大抵の実装では巧くいくがやってはいけないコーディングの典型だ。
793デフォルトの名無しさん:2005/08/05(金) 17:09:07
行列の積を求めるプログラムを書こうとしたが、コンパイルエラーが出てしまいます。
46行目で変数宣言できないと言われ、かつ定数式が必要と6つも出てきた…
OS:XP
言語:C
コンパイラ:BCC です。
タダのコンパイラではやはり無理なのでしょうか?
アルゴリズムについてはせめないで。。
ソースはこちら:
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/843.txt
794デフォルトの名無しさん:2005/08/05(金) 17:30:42
C言語だろ?なんでそんなところで変数宣言できるんだ??
malloc-freeでも使え、自分でくぐれよ
795デフォルトの名無しさん:2005/08/05(金) 18:10:12
>>793
c99として書いている積もりならgccでも使え。

>>794
>くぐれよ
何を? リンボーダンス?
796デフォルトの名無しさん:2005/08/05(金) 19:56:24
>>793
whileの意味無いじゃん。
何が起きても一回目で外に出る。
しかも>>748じゃね?
797デフォルトの名無しさん:2005/08/05(金) 20:05:39
>>796
whileはおそらく最初はbreakで抜けるためのワザのつもりだったと思う
798デフォルトの名無しさん:2005/08/05(金) 20:27:57
restrictポインタって?
799デフォルトの名無しさん:2005/08/05(金) 20:44:28
>>798
C99で追加された奴だよな。
restrictがついたポインタは、それらが同じ領域のデータを
示すことが無いとこをコンパイラーに伝えるらしい。
同じ領域を示した時の挙動は未定義。
800デフォルトの名無しさん:2005/08/05(金) 21:28:25
未定義じゃ意味ないんとちゃう?
結局、同じ領域かどうか、プログラマが気を使わないといかんの?
801デフォルトの名無しさん:2005/08/05(金) 21:45:17
>>800
同じ領域でないことをプログラマが保証することで、
コンパイラは安全に最適化を行うことができる。

>プログラマが気を使わないといかんの?
C言語はそういうもの。
802デフォルトの名無しさん:2005/08/05(金) 21:59:26
なるほど、最適化のためか
803デフォルトの名無しさん:2005/08/05(金) 22:09:38
>>802
最適化に利用している処理系もあるというべきだろう。
あくまでコンパイラに伝えるのが主目的だから何に使うかは処理系の自由。
             ~~~~~~
他にも
void *memcpy(void * restrict s1, const void * restrict s2, size_t n);
とすることでプログラマに注意を促す用法もある。
804デフォルトの名無しさん:2005/08/05(金) 22:28:16
>>793で質問したものです。
なんで変数宣言できないのかがわからない…
変数が使われる前ならどこでもいいのでは?
805デフォルトの名無しさん:2005/08/05(金) 22:30:20
C言語の本買って来い
806デフォルトの名無しさん:2005/08/05(金) 22:37:03
>>804
決まりに従え
807デフォルトの名無しさん:2005/08/05(金) 22:37:47
>>804
ブロック内での変数宣言は使う前ならどこでもよいというのは、
最新のCの規格(通称C99)ではいいのだが、それ以前の規格では認められていなかった。
そして現在C99に対応しているコンパイラはgccくらいしか知られていない。

C++では全然問題なく行えるのだが、ここはCのスレなのでスレ違い。
(ちなみにC++でできるからC99で取り入れられた)


808デフォルトの名無しさん:2005/08/05(金) 22:41:21
初歩的な質問で申し訳ないんですけど、指定した2点間に線分を描く関数を作成するのってどうやるんですか?
引数は始点のX,Y座標、終点のX,Y座標、色番号の5つとするってきまっているんですが
あと、それを使って「H.K」という文字を線で描画したいのですが
809デフォルトの名無しさん:2005/08/05(金) 22:45:39
>>808
標準Cだけではできないから悪いけどスレ違い。
810デフォルトの名無しさん:2005/08/05(金) 22:52:38
>>808
ヒント:ブレゼンハム,pnm
811デフォルトの名無しさん:2005/08/05(金) 22:55:47
>>806
>決まりに従え

>>807
>最新のCの規格(通称C99)ではいいのだが、それ以前の規格では認められていなかった。

それ以前の決まりとは??
特にその点に触れた本を読んだことがない
812デフォルトの名無しさん:2005/08/05(金) 23:00:06
どこでも宣言できるってどこかに書いてあったのならともかく、
「そう思うから」宣言できなきゃおかしいと考えるのはウン子
813デフォルトの名無しさん:2005/08/05(金) 23:00:30
>>811
C90,C89

最近のC言語の教科書は、C99ベースで書かれているの?
へ〜。
814デフォルトの名無しさん:2005/08/05(金) 23:00:38
さすがにK&Rには書いてありそうなものだけど、どうなの?
815デフォルトの名無しさん:2005/08/05(金) 23:02:24
よほどの糞本を読んでいたようだな
816デフォルトの名無しさん:2005/08/05(金) 23:07:25
K&R第3版なんてまだ出てないだろ。
そーいやANSIで採用された関数の引数の書き方もC++(C with Classes)由来だな。
817デフォルトの名無しさん:2005/08/05(金) 23:07:33
>>814
スマソ。K&Rに載ってた。関数最初の実行可能部分…

>>793のソースで最初に scanf でm と n と l を取得して、そのサイズの配列を作るにはどうすればいいのか。。
うまい解決法はないものか?
818デフォルトの名無しさん:2005/08/05(金) 23:09:39
>>817
malloc

「麻呂ck」って読む奴が嫌いだ
819デフォルトの名無しさん:2005/08/05(金) 23:13:06
メモリーアロケート
って読まなきゃ駄目?
820デフォルトの名無しさん:2005/08/05(金) 23:14:21
「えむ、あろっく」か?
「まろっく」でいいじゃないか。
# 実際、どっちでもいい。
821デフォルトの名無しさん:2005/08/05(金) 23:14:29
エムアロックの俺は変?
822デフォルトの名無しさん:2005/08/05(金) 23:15:32
>>813
C90じゃなくてC95だろ。

>>811
ちなみにそれ以前の規格(C89)はこれのことね。
ANSI X3.159-1989
ISO/IEC 9899 : 1990
823デフォルトの名無しさん:2005/08/05(金) 23:16:28
俺はマーロック
824デフォルトの名無しさん:2005/08/05(金) 23:19:35
>>818
そんな理由で俺を嫌わないでくれ。
825デフォルトの名無しさん:2005/08/05(金) 23:20:24
>>818
malloc でビープ領域に作られた領域のアドレスが帰ってきて、
それをどうやって後で取得する l と m と n に関連付けるのか、実際の運用方法が分からない。。

malloc の引数は領域のバイトサイズだけど、配列の大きさが決まらないうちは使いようがないのでは?

Parray=malloc(sizeof(なんちゃら));
みたいにやるのか?
826デフォルトの名無しさん:2005/08/05(金) 23:21:59
>>793
頼む、このスレだとネタ扱いしかされないから初心者スレに逝ってくれ。
827813:2005/08/05(金) 23:23:58
>>822
フォロー、サンクス。

C90は、これのことです。
> ISO/IEC?9899?:?1990
# もしかして、間違ってるのか。ちょっと調べてみる
828デフォルトの名無しさん:2005/08/05(金) 23:24:01
>>825
何でお前はこんなにも定石を知らないんだ?
いったい何を読んで学んできたんだか不思議でならないんだが。
829デフォルトの名無しさん:2005/08/05(金) 23:24:28
>>825
scanf()を呼んだ後にmalloc()を呼べばいいだけだろ。
830デフォルトの名無しさん:2005/08/05(金) 23:28:05
初心者スレで逝ってきます。。
おさわがせしました
831デフォルトの名無しさん:2005/08/05(金) 23:28:15
>>827
ANSI C89とISO C90はどっちも同じ内容。
C95はAmendment1。
832デフォルトの名無しさん:2005/08/05(金) 23:34:04
俺ならこうやるかな、どうしても多次元配列として扱いたい場合。
int **matrix;
int i;

matrix = (n * sizeof(int*));
matrix[0] = (n * m * sizeof(int));
for(i = 1; i < n; i++) matrix[i] = matrix[i-1] + m ;


開放はこの順で。
free(matrix[0]);
free(matrix);

malloc一回で済ます方法もあるがあんま綺麗じゃないので。。。
この手のプログラムは自分で書く必要があったときはC++で組むからあんま困ったことは無いな。
833デフォルトの名無しさん:2005/08/05(金) 23:35:11
mallocが抜けてたorz

matrix = malloc(n * sizeof(int*));
matrix[0] = malloc(n * m * sizeof(int));
834デフォルトの名無しさん:2005/08/06(土) 06:09:34
アセンブラで
db 100h dup(-1)
などとできるわけですが、Cの場合、どうすればよいのでしょうか?
char buf[0x100] = ???
835デフォルトの名無しさん:2005/08/06(土) 08:14:08
>>834
memset(buf, -1, sizeof(buf));
836デフォルトの名無しさん:2005/08/06(土) 08:23:16
>>835
確かに普通はそう書くけど、
>>834 のアセンブラとは等価じゃないよね。
オブジェクト内に256個 -1 が埋め込まれるっていうのが>>834の目的だとしたら、
の話だけど。
837デフォルトの名無しさん:2005/08/06(土) 08:27:05
char buf[0x100] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, };
838デフォルトの名無しさん:2005/08/06(土) 15:36:26
strchrって何の略?
839デフォルトの名無しさん:2005/08/06(土) 15:48:45
stringからcharactarを探す。
840デフォルトの名無しさん:2005/08/06(土) 15:50:23
charactar あげ
841838:2005/08/06(土) 15:53:57
やっぱそれか。
ありがとう。
842デフォルトの名無しさん:2005/08/06(土) 16:36:02
環境:VS.NET2002学割
-----------------------------------------
#define STRICT

#include <windows.h>
#include <stdio.h>
#include <string.h>
int main()
{
 UINT a=0x88888888;
 BYTE b[8];
 memcpy(b+4,&a,sizeof(UINT));
 memcpy(b,&a,sizeof(UINT));

 return 0;
}
-----------------------------------------
なんでコピーされないの?bは0で埋められてしまいます。
memcpy()で、ちゃんとコピーできる(bを8で埋める)方法を教えて下さい。
843デフォルトの名無しさん:2005/08/06(土) 16:44:50
>>842
初心者は初心者スレへどうぞ。
あ、ちなみにそのコードでbにはきちんと0x88が格納されますよ。
844デフォルトの名無しさん:2005/08/06(土) 16:47:50
VC2003で同じく
845デフォルトの名無しさん
>>842 ここまで単純だと、どうやって b[] の値を確認した(つもり?)のか、
のほうが気になってくるなあ…… でもスレ違い。