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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2005/07/18(月) 12:38:31
まず問題を冷静に吟味して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/
0002デフォルトの名無しさん2005/07/18(月) 12:42:52
>>1
おつ
0003デフォルトの名無しさん2005/07/18(月) 14:19:44
>>1
乙華麗
0004デフォルトの名無しさん2005/07/18(月) 16:17:57
mallocで確保したメモリブロックをfreeした後、本当にそのメモリブロックが
解放されているのか確認する方法はありますか?
0005ヒットマン2005/07/18(月) 16:22:30
はじめまして!!まだC言語を、勉強して1ヶ月です。
ちょくちょく、質問をするのでよろしくおねがいします。
0006デフォルトの名無しさん2005/07/18(月) 16:33:14
>>4
標準Cの範囲内では無理。
0007デフォルトの名無しさん2005/07/18(月) 17:07:04
↓ビッ(ry
0008デフォルトの名無しさん2005/07/18(月) 17:59:38
>>5
初心者スレへどうぞ。
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
0009デフォルトの名無しさん2005/07/18(月) 18:15:21
>>7
ワロス
0010デフォルトの名無しさん2005/07/18(月) 18:31:07
>>5
どうぞ。
0011デフォルトの名無しさん2005/07/18(月) 18:57:16
ソース読んで勉強したいんですけど、よさげなソースを公開してるサイトみたいなのありますかね?
0012デフォルトの名無しさん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に落ちてしまいます。初期値に関わらず、です。
どうしてなのでしょうか?お願いします。
0013122005/07/18(月) 19:00:09
なんだか表現が可笑しいので追加書き込みをしておきます。
初期値を0.1や0.2などにとると、0.4 0.8 の繰り返しをするようになり、最終的に0に落ちます。
初期値を0.23423など綺麗でないものにすると、0.4 0.8 0.4 ...のような周期的な解は出てきませんが、
最終的には(いきなり)0に落ちるのです。
お願いします。
0014デフォルトの名無しさん2005/07/18(月) 19:04:19
>>12
きれいな二進数の値に書きなおせるかどうかが問題だと思うよ。
0015デフォルトの名無しさん2005/07/18(月) 19:21:15
>>12
例えば0.1は2進数では
0.0001100110011…
と循環小数になるから、正確に表すことが出来ない。
んで計算を繰り返すと誤差が積もり積もって変な値になっちゃうと
001611=122005/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に落ちてしまう。
どうでしょうか?
001711=122005/07/18(月) 19:22:38
>>15
ありがとうございます。>>16のような解釈で宜しいでしょうか?
0018デフォルトの名無しさん2005/07/18(月) 20:17:14
このプログラミングがわかりません!

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

よろしくお願いします。
001918続き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
0020152005/07/18(月) 20:24:13
>>17
多分そう。
ある数値ってのは2進数で正確に表せる数値
0021デフォルトの名無しさん2005/07/18(月) 20:24:46
そいつはC言語に限った問題じゃないし
0022152005/07/18(月) 20:44:42
あ、そうか
だから必ず0に集束するのか…

>>12ってなんか有名な問題なんですか?
出典キボンヌ
0023デフォルトの名無しさん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');
  }
}
0024172005/07/18(月) 21:36:12
>>20
ありがとうございます。
これは数学の最後の授業で「試験範囲まで終わったから」ということで教わったものです。
どのような挙動を示すのかなと、少しくらいは書けるC言語でプログラムを書いてみたところ、
初期値にかかわらず0に落ちたのです。気になって質問をしてみました。
先生は、「テント型写像」と言っていました。

「テント型写像」でググってみましたが、2件しか引っかかりませんでした。
ちゃんとした名前では無いのかもしれません。
0025デフォルトの名無しさん2005/07/18(月) 21:41:31
>>23
構造体listのnextメンバが無意味だし
0026デフォルトの名無しさん2005/07/18(月) 21:44:23
>>25
マジレスされてもな...
0027デフォルトの名無しさん2005/07/18(月) 21:51:33
>>16
減算によって有効桁数がどんどん減っていくから
という方が正しい。
0028デフォルトの名無しさん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);
}
こんなコードを書いてみると、引き算でビットが落ちる様子がよく見えるかも。
0029デフォルトの名無しさん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');
  }
}
0030デフォルトの名無しさん2005/07/18(月) 22:47:20
>>23
ありがとうございました!
以後気をつけます。
0031デフォルトの名無しさん2005/07/18(月) 22:56:11
ネットワークアプリ(TCP-IPでソケットプログラミング)についての質問なんですが、
select関数を使って、データが送信されたかどうか毎回LOOPしてチェックしている
んですが、これって、回線切断時にもselect関数の戻り値が1になって返って
来てるみたいなんですがどういう事かよくわかりません。
データが届いている時しか戻り値が1ではないんですか?
0032デフォルトの名無しさん2005/07/18(月) 23:01:12
>>31
ネットワークプログラミングのスレの>>1くらい読めよ
0033デフォルトの名無しさん2005/07/18(月) 23:03:08
>>31
スレ違い
0034デフォルトの名無しさん2005/07/18(月) 23:55:19
tolowerって文字列には使えないんですか?
0035デフォルトの名無しさん2005/07/18(月) 23:57:53
>>34
文字列に使う
0036デフォルトの名無しさん2005/07/18(月) 23:59:09
>>34
"文字"に使う
0037デフォルトの名無しさん2005/07/18(月) 23:59:20
自分は今C言語を勉強しているのですが、C言語で作ったゲームなんかは、DOS窓からしか実行することができないんですか?
コンパイルして出来たexeファイルを普通にダブルクリックして実行したいんですが、それは無理でしょうか?
変な質問ですが誰か分かる方教えてもらえませんか?お願いします。
0038デフォルトの名無しさん2005/07/19(火) 00:00:36
>>37
コンパイルして出来たexeファイルを普通にダブルクリックして実行できますよ?
0039デフォルトの名無しさん2005/07/19(火) 00:10:29
>>38
即レスありがとうございます
でもそのファイルをクリックすると一瞬DOS窓があらわれてすぐ消えるんだけで、なにも変化がないんです
0040342005/07/19(火) 00:10:54
>>35,36
えーと読み込んだ文字列を全てtolowerで返したいんですけど、どうすればいいんでしょうか?
0041デフォルトの名無しさん2005/07/19(火) 00:15:17
>>39
プログラムが正しく終了しただけです。問題無い。
0042デフォルトの名無しさん2005/07/19(火) 00:25:13
>>41
プログラム正しく終了したとゆうことは、そのゲームは実行されたとゆうことでしょうか?
もしprintfなどで何かを表示するプログラムの場合、それが実行されているとゆうことですが、どこに表示されているんですか?
0043デフォルトの名無しさん2005/07/19(火) 00:27:20
>>42
一瞬の間に出た窓に表示された
0044デフォルトの名無しさん2005/07/19(火) 00:32:21
>>43
あれは一瞬表示されていたんですか。ではそれをずっと表示させるとゆうのはできないんですか?
0045デフォルトの名無しさん2005/07/19(火) 00:36:40
>>44
ヒント:何か入力したら終了
0046デフォルトの名無しさん2005/07/19(火) 00:37:59
懐かしいな。俺にもこういう(>>39)時期があったよ。
0047デフォルトの名無しさん2005/07/19(火) 00:38:01
>>40
各々の文字にtolowerを適用したまへ
0048デフォルトの名無しさん2005/07/19(火) 00:46:30
>>46
なぜだか俺にはそういう時期がまったくありませんでした…
なぜだ
0049デフォルトの名無しさん2005/07/19(火) 00:47:35
それでは、プログラムの最後にscanfで入力を求めるようにすればいいんですか?
初心者な発想ですみません
0050デフォルトの名無しさん2005/07/19(火) 00:48:48
>>49
そんなもんで良いんじゃない?
0051デフォルトの名無しさん2005/07/19(火) 00:52:37
どうして getchar() より先に scanf() を教える人がいるんだろう?
0052デフォルトの名無しさん2005/07/19(火) 00:53:51
>>50
そうですか、ではその方法でやることにします。ありがとうございました
0053デフォルトの名無しさん2005/07/19(火) 01:00:13
>>51
「DOS窓がすぐに閉じる」って言っているレベルの人間に、新しいものを
教えてどうする?scanf知ってるならまずそっちを使わせておいて、不満を
感じ始めるくらいになったら自分で探し始めるだろうよ。
0054デフォルトの名無しさん2005/07/19(火) 01:01:45
>>48
MS-DOS時代にプログラム始めたから?
いや、俺がそうなんだけど
0055デフォルトの名無しさん2005/07/19(火) 04:26:12
変わりに答えてみる。

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

0059デフォルトの名無しさん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
0060デフォルトの名無しさん2005/07/19(火) 14:11:51
質問です。
Visual c++6.0にてc言語のプログラムを作成中です。

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

0065デフォルトの名無しさん2005/07/19(火) 15:10:37
ララァ?
00662から始まる偶数を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
と出てくるはずなのに
0067デフォルトの名無しさん2005/07/19(火) 15:18:47
そんなはずねーw

guusuuの初期値はなんだ?
00682から始まる偶数を5個出力2005/07/19(火) 15:19:47
guusuuの初期値は、2です
0069guusuuの初期値は?2005/07/19(火) 15:21:14
>>66
初心者スレへどうぞ。
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
0070デフォルトの名無しさん2005/07/19(火) 15:28:21
>>68

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

for(cnt=1;cnt<=5;++cnt)
{
printf("%d\n",cnt*2);
}
0076デフォルトの名無しさん2005/07/19(火) 18:26:57
画像処理ってやったことないけど、
全画素(要は画像全体)をビット反転させたらネガポジ変換になるんじゃないの。
0077デフォルトの名無しさん2005/07/19(火) 18:29:02
RGB
0078デフォルトの名無しさん2005/07/19(火) 18:51:17
C++で一次元静電粒子コードの作成&二流体不安定性シュミレーションの
プログラムを作成したいのですが、まったくわかりません。
だれか教えてください。
0079デフォルトの名無しさん2005/07/19(火) 19:16:39
>>78
スレ違い。
0080デフォルトの名無しさん2005/07/19(火) 19:46:51
>>78
それはもう板違いだろ。
物理板へ:http://science3.2ch.net/sci/
0081デフォルトの名無しさん2005/07/19(火) 19:57:02
具体的なアルゴリズムがわかっているなら、
それをCのソースで表現することは可能だけどね
0082デフォルトの名無しさん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の書き方を見たのですが、これは不等号を使った条件式にするとどうなるのでしょうか
0083デフォルトの名無しさん2005/07/19(火) 20:33:17
for(;a[i] < 0 || 0 < a[i];i++)
0084デフォルトの名無しさん2005/07/19(火) 20:39:50
>>83
つまりfor(;a[i] != 0 ;i++)ということですね
どうもありがとうございました
0085デフォルトの名無しさん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列の行列の値を入力して表示させるプログラムなんですが、微妙に結果が変です。直してください
0086デフォルトの名無しさん2005/07/19(火) 23:21:57
>>85
printf()の書式で9個の値を表示するよう指定しているのに、値は
i[a][b]しか渡してない。しかもaとbが配列の範囲外。

0087デフォルトの名無しさん2005/07/19(火) 23:24:56
>>86
よく理解できないです。
0088デフォルトの名無しさん2005/07/19(火) 23:26:04
┐(´ー`)┌
0089デフォルトの名無しさん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]);
0090デフォルトの名無しさん2005/07/19(火) 23:28:51
>>89
もっと簡潔なかきかたはできないんですね?
0091デフォルトの名無しさん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');
}
0092デフォルトの名無しさん2005/07/19(火) 23:36:27
putcharとはなんでしょ?
0093デフォルトの名無しさん2005/07/19(火) 23:39:02
>>92
1文字をstdoutへ出力する。
putc(c)はprintf("%c", c);相当だと思えばいい。
0094デフォルトの名無しさん2005/07/19(火) 23:39:55
>>93
よくわかんないので89の書き方でいいや。ありがとうございます!
0095デフォルトの名無しさん2005/07/19(火) 23:45:52
ここまで馬鹿だと逆に潔くていいな。
0096デフォルトの名無しさん2005/07/19(火) 23:53:20
for(int i=0;i<100;i++)
i=i+1;

printf("%i",i);

禿藁
0097デフォルトの名無しさん2005/07/20(水) 00:13:19
C言語のコード読むときに役立つツールとか無いですか?
0098デフォルトの名無しさん2005/07/20(水) 00:17:36
>>97
GNU global
0099デフォルトの名無しさん2005/07/20(水) 00:23:03
>>96
コードの意図するところも、何がおかしいのかも判らん。
0100デフォルトの名無しさん2005/07/20(水) 08:17:58
>>99
スコープが可笑しいから、自信満々でコンパイルしたけどエラーが出たんだろうよ。
自分の馬鹿さに笑うしか無かったのさ。
0101デフォルトの名無しさん2005/07/20(水) 12:55:08
%iはいいのか?
0102デフォルトの名無しさん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バイト分メモリが無駄になるので好きではないんですが。
0103デフォルトの名無しさん2005/07/20(水) 14:07:49
それ二次元か?
0104デフォルトの名無しさん2005/07/20(水) 14:12:37
ごめん、*見えてなかった
0105デフォルトの名無しさん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;
じゃないか
0106デフォルトの名無しさん2005/07/20(水) 14:21:06
int (*p)[N];
p = (int **)malloc(sizeof(int)*M*N);
0107デフォルトの名無しさん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 がリテラルなら使えるかもしんない
01081022005/07/20(水) 14:37:30
>105さん指摘のとおりです。
for(i=1;i<M;i++) p[i]=p[i-1]+N;
が正しいです。

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

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

# ところで数値解析法で3次方程式の実数解って有限時間内に求まる?
0133デフォルトの名無しさん2005/07/20(水) 21:48:00
>>132
解法みたけど良くわからない・・・無理だ
0134デフォルトの名無しさん2005/07/20(水) 21:50:27
まぁ、ニュートン法の出番かね。
いずれにしても、言語の話題からは逸れていくので後は
アルゴリズムスレなり数学板なりでどうぞ。
0135デフォルトの名無しさん2005/07/20(水) 22:07:25
x^(1/3)を求めさせる方法ってないんですか?算術関数sqrtは1/2乗だけですよね?
0136デフォルトの名無しさん2005/07/20(水) 22:15:33
pow
0137デフォルトの名無しさん2005/07/20(水) 22:59:15
三次方程式の解の公式はあるよ。かなりややこしいけど。
五次方程式以上の解の公式は作れないことが証明されているんだっけ?
0138デフォルトの名無しさん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次より高次の方程式には一般には代数的解法は必ずしも存在しない。」
0139デフォルトの名無しさん 2005/07/21(木) 01:58:08
2次元配列を1次元配列に直すのはどうすればいいのですか?
forを2回組むのはわかるのですが、中の処理の仕方がわかりません。
0140デフォルトの名無しさん2005/07/21(木) 02:05:27
>>139
もっと具体的に。
0141デフォルトの名無しさん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次元配列に戻す式?がわからないんです。
0142デフォルトの名無しさん2005/07/21(木) 02:41:32
つpixels[ y*height+x]
01431422005/07/21(木) 02:43:19
ボケた
つpixels[ y*width+x]
0144デフォルトの名無しさん2005/07/21(木) 02:46:51
わかりました。ありがとうございます!
0145デフォルトの名無しさん2005/07/21(木) 03:54:23
配列は連続したメモリ領域に確保される
配列は式の中ではポインタと同等である
たしかCの規約であったかと
つまり、無駄な領域使用と無駄なコピーをするのではなく

int* p_pixels = NULL;

p_pixels = *pixels2;

以降
p_pixels[y*width+x]
の様に使えば、
…これで一発ではないだろうか…
0146デフォルトの名無しさん2005/07/21(木) 05:35:24
あったっけ?そんな規約
0147デフォルトの名無しさん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を使用してます。
01481472005/07/21(木) 06:02:50
スイマセン。ずれてます_| ̄|○
例1
1,2,3
1,3,4,5
2,4

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

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

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

それはさておき、比較回数が多いってのはおかしい。
コードを見ないと何が問題なのかは分からんが。
0154デフォルトの名無しさん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となってしまいます。どこがおかしいかどなたか
教えていただけませんか?
0155デフォルトの名無しさん2005/07/21(木) 13:40:07
Hello, world 付近から勉強し直したら?
0156デフォルトの名無しさん2005/07/21(木) 13:46:25
英語がおかしいんですか?>>155
0157デフォルトの名無しさん2005/07/21(木) 13:47:03
>>154
計算時における情報の欠落ということに関して考えたほうがいい。
Cの四則演算は無限の精度を持っているわけではないのだが、
整数での割り算がどういう結果を招くかまったく知らないようだから、
基本がなっていないと思われます
0158デフォルトの名無しさん2005/07/21(木) 13:49:51
>>154
abcdが何になってるか一回一回printfしたら?
>>156
ハロワを知らないほどの初心者なのか?
01591512005/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の比較関数のほうが呼ばれている回数は多いです。

0160デフォルトの名無しさん2005/07/21(木) 13:51:05
>>157
ホントにやり始めで基本全然なってないんです。
ごめんなさい>< 
計算の所をもっと細かく分けた方がいいのですか?
0161デフォルトの名無しさん2005/07/21(木) 13:51:58
>>156
脳みそ蛆わいてんのか?
0162デフォルトの名無しさん2005/07/21(木) 13:52:49
>>158
昔英語の教材でそれを使ってたのでそうだと思いました><
マジで初心者です・・・
0163デフォルトの名無しさん2005/07/21(木) 13:53:22
この流れで
>計算の所をもっと細かく分けた方がいいのですか?
何でこうなんのよ?
違う初級本かって勉強した方がいいよ
0164デフォルトの名無しさん2005/07/21(木) 13:56:30
>>154
#include <math.h>
4.0 * atan(1.0)
0165デフォルトの名無しさん2005/07/21(木) 13:57:46
>>159
intの方は同値のとき0を返すのに対して、
floatの方は0を返すことが無い。
0166デフォルトの名無しさん2005/07/21(木) 13:58:10
>>158
printfしたら0000000004.0000とか・・・根本的におかしそうですね・・・
>>163
ホントその通りです・・・
01671512005/07/21(木) 13:59:23
>>165さん
それは疑ってみたのでintの値はかぶらない値にしてあります。
0168デフォルトの名無しさん2005/07/21(木) 14:01:53
>>164
一応やってみたのですが値は変わりませんでした。
ごめんなさい
4.0 * atan(1.0)
はどういう意味ですか??
0169デフォルトの名無しさん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);

何故、答えが違うか分かったらまたおいで
0170デフォルトの名無しさん2005/07/21(木) 14:11:14
>>169
答え違いますね!?
でもなんか調べる所がわかったんで、浮動小数点の
所調べてきてみます!
親切にありがとうございました!
0171デフォルトの名無しさん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);
右辺の計算で整数型しか使われてないので、除算部分で整数にまるめられてしまうわけ。
演算結果は演算に絡む型のうち、最も大きい数値を表現できる型に合わせられる。
0172デフォルトの名無しさん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くらいの値になっているようなんです.
できればなぜなのか,またどうすれば期待通りに動いてくれるのかおしえてくらさい
0173デフォルトの名無しさん2005/07/21(木) 16:35:19
>>172
cmath.hじゃなくてmath.hな。C++標準ヘッダと混ざってる。
で、普通に3が出力されたが。
0174デフォルトの名無しさん2005/07/21(木) 17:50:51
>>168
> 4.0 * atan(1.0)
> はどういう意味ですか??

printf() でそのまま表示して見れ。
0175デフォルトの名無しさん2005/07/21(木) 17:57:42
整数型の2*300000の配列を用意したいんですが、
int a[2][300000]でいいですか?
この場合はmallocとかいらないですか?
0176デフォルトの名無しさん2005/07/21(木) 18:03:02
あんまり大きいサイズはそれだと確保に失敗することがあるから
mallocのほうがいい。mallocも必ず成功するわけではないが。
0177デフォルトの名無しさん2005/07/21(木) 18:05:42
スタックで2*300000っていけるのか?
うちじゃ無理だったがな。
0178デフォルトの名無しさん2005/07/21(木) 18:17:01
>>176-177
そのまま配列を宣言するとスタックに確保されるが、大きすぎるとダメ
そのときはmalloc使ってヒープにメモリ確保する、失敗する場合もある
ってことでしょうか?
0179デフォルトの名無しさん2005/07/21(木) 18:25:47
おすすめできないがコンパイラオプションでスタックサイズ変更とかの手段もある。
0180デフォルトの名無しさん2005/07/21(木) 18:27:07
たしかにそれはオススメできないな
0181デフォルトの名無しさん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
0182デフォルトの名無しさん2005/07/21(木) 22:30:06
前橋和弥のC言語ポインタ完全制覇の初版本を持っている人に聞きたいです。

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

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

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

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

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

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

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

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

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

2
0213デフォルトの名無しさん2005/07/22(金) 01:37:54
>>212
ありがとん。
なんで2なのか分かりますか?
02142042005/07/22(金) 01:55:19
hoge[1][][]にはコピーしません
この場合hoge[0][0][]〜[0][9][]にahyaが入ると思ったんですが
[0][1][]からデータが入らないんです オネガイシマス
0215≠2122005/07/22(金) 02:05:48
>>213
恐らく、2.9999...が切り捨てられて2になったのかと。
仮令doubleの精度があってもlog(8)/log(2)では理論通りに3と言う訳にはいかないのでしょう。
02161732005/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になった。
0217デフォルトの名無しさん2005/07/22(金) 02:40:47
>>214
とりあえずどこで問題が発生するのかを確かめるために、
strcpyするごとにidxとhogeの内容を表示させてみたら?
デバッガ使えるのならそれ使ったほうが早いだろうけど。
0218デフォルトの名無しさん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

はいってるよ?
0219デフォルトの名無しさん2005/07/22(金) 03:13:28
Shift-JISで書き込まれたtextAを読み込み、
textBへShift-JISコードで表示させるにはどうしたらいいでしょうか?
0220デフォルトの名無しさん2005/07/22(金) 03:15:01
>>219
「textBへShift-JISコードで表示させる」という部分がどういう意味か
量りかねるし、スレ違い。
0221デフォルトの名無しさん2005/07/22(金) 03:17:36
>>220
あ、16進数"%X"って意味です。・゚・(ノД`)・゚・。
0222デフォルトの名無しさん2005/07/22(金) 03:29:53
>>221
fprintf()に何かご不満でも?
0223デフォルトの名無しさん2005/07/22(金) 07:16:14
while ((A = B[0][0]) < 300.0) {…処理…}
ってのは、AにB[0][0]を代入した後、Aが300未満ならループ続行って事ですか?
0224デフォルトの名無しさん2005/07/22(金) 08:51:37
>>223
そう
0225デフォルトの名無しさん2005/07/22(金) 09:48:03
>>204
hoge[0][1]にstrcpyしようとしてバスエラーで落ちるなら、ヒントはargv。
0226デフォルトの名無しさん2005/07/22(金) 10:19:53
構造体に格納した文字列を単語に区切って単語比較したいのですが、
どうやって文字列を単語に区切ればいいですか?
0227デフォルトの名無しさん2005/07/22(金) 10:30:45
strtok
0228デフォルトの名無しさん2005/07/22(金) 11:08:34
>>227
ありがとうございます
0229デフォルトの名無しさん2005/07/22(金) 12:30:40
strtok()をわざわざこれから覚えるくらいなら
sscanf()を駆使した方が……
0230デフォルトの名無しさん2005/07/22(金) 12:44:06
例外処理をしたいのですが、scanfで整数以外を取得したらエラーがでるようにしたいのですが。
どのように書くのが一番よいのでしょうか?
0231デフォルトの名無しさん2005/07/22(金) 12:45:15
>>230
そのまんまやないけ
0232デフォルトの名無しさん2005/07/22(金) 12:47:16
>>230
fgets()で文字列入力して、sscanf()かstrtol()で変換、戻り値などで異常を検出。
例えばscanf("%d", ...)すると数字以外の文字を入れた段階で処理が止まるぞ。
0233デフォルトの名無しさん2005/07/22(金) 13:53:13
>>232
結構うまくいきました。ありがとうございました。
0234デフォルトの名無しさん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にする必然性がよくわからないです。
0235AAA2005/07/22(金) 14:47:07
C言語の宿題スレはどこでしたっけ?
0236デフォルトの名無しさん2005/07/22(金) 14:49:27
>>234
必須じゃないけど、付けておくと毎回初期化しなくて(・∀・)イイ!!
0237ttt ◆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);

(次に続く)  (次に続く)
0238ttt ◆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 の使い方もよくわかりません。
このコードを正しくする具体的なコードを教えて頂けると幸いです。
0239デフォルトの名無しさん2005/07/22(金) 15:24:47
スレ違い
0240ttt ◆2kifrUvNoc 2005/07/22(金) 15:29:37
>>239
え? スレ違いなんですか?
C言語の質問をしたくてカキコしたのですが・・・
0241デフォルトの名無しさん2005/07/22(金) 15:30:20
VCスレにでもいっとけ。
0242デフォルトの名無しさん2005/07/22(金) 15:52:20
226ですがsscanfを用いてスペースもしくは:で区切って
単語に分けるにはどうかけばいいのですか?
strtokだとそれなりに出来ましたがsscanfだと動かない(つД`)
0243デフォルトの名無しさん2005/07/22(金) 15:59:48
>>237
mallocする癖を付けたほうがいい。
0244デフォルトの名無しさん2005/07/22(金) 16:38:21
>>242
何を困っているのか。
どう動くことを期待してどう書いたらどうなったのか。
%nについて調べると幸せになれるかもしれないけど的外れかもしれない。
0245ttt ◆2kifrUvNoc 2005/07/22(金) 17:02:57
すいません。勉強してからまた質問します。
0246デフォルトの名無しさん2005/07/22(金) 18:02:24
>>242
%[^ :]
0247デフォルトの名無しさん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;
}
0248デフォルトの名無しさん2005/07/22(金) 19:50:15
c言語ってブーリン型導入しないのかあと、 //コメントも
0249デフォルトの名無しさん2005/07/22(金) 19:53:02
>>248
ヒント:ISO/IEC 9899:1999
0250デフォルトの名無しさん2005/07/22(金) 20:08:55
Cでラベル&goto を使うのは好ましく無いのでしょうか?

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

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

とやってみましたが動きませんでした。
とりあえず>>247を参考にいじってみます。
0253kuro2005/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]);
}
}


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

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

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

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

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

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

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

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

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

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

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

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

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

まあ「やるべき」かどうか云々に言及しすぎても初めに言わんとしていたこととはズレかねないので、
むしろ実装部にconstをつけて定数化することができる点に難点がないと言えるならそれでOKです。
0283デフォルトの名無しさん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以外は
使った事がない。
0284デフォルトの名無しさん2005/07/23(土) 17:57:04
>>282
だから、難点は「読みやすさと理解しやすさを損なう」こと。
自分一人でしか読み書きしないソースであれば
ご自由に全てのローカル変数にconstを付けてくださいな。
0285デフォルトの名無しさん2005/07/23(土) 17:58:01
× ご自由に全てのローカル変数にconstを付けてくださいな。
○ ご自由に可能な限りの全てのローカル変数にconstを付けてくださいな。
0286デフォルトの名無しさん2005/07/23(土) 18:00:20
変数を定数化とはこれいかに
マクロ使え
0287デフォルトの名無しさん2005/07/23(土) 18:02:46
最初の答えからみんなが
>混乱を招く
って言ってるのに、いつまでたっても理解できないみたいだな
そんなにつけたきゃ勝手につけろと言いたい
0288デフォルトの名無しさん2005/07/23(土) 18:03:48
constつけただけで可読性が下がるってのは納得しかねる話ですが(理解不足かなにか?)、
constつけても利点が少ない割りに冗長ってのはまだ納得のいく話ですね。
ま、煽りが多いのでこの辺でお暇します。
0289デフォルトの名無しさん2005/07/23(土) 18:05:38
すいません
*( s_ol + temp) != '\0'
これはどういう意味か説明していただけ無いでしょうか?

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

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

0297デフォルトの名無しさん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') 普通に比較演算
0298デフォルトの名無しさん2005/07/23(土) 18:20:01
s_ol[temp] != '\0'
02992892005/07/23(土) 18:20:37
すいません
forの中で比較として入れられているのですが
意味が分からないです・・・

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

どうでもいいけど、うちも「おまじない」って教えはしないけど
本とか見てるとたまにあるけど、それはひどすぎると思う
0320デフォルトの名無しさん2005/07/23(土) 20:09:47
ここはひきこもり妄想プログラマの憩の場です
インストラクターなどの職業の方はマ板へどうぞ
ここの人達は自分の意見のみが正しいと思っているので
何を言っても無駄です
お引き取り下さい
0321デフォルトの名無しさん2005/07/23(土) 20:14:00
うっせーばか
氏ねよまじで
0322デフォルトの名無しさん2005/07/23(土) 20:38:43
誰かC言語の問題を解いていただけないですか?
0323デフォルトの名無しさん2005/07/23(土) 20:39:12
断る。
0324デフォルトの名無しさん2005/07/23(土) 20:39:55
タイトルの「C言語なら俺に聞け!!」の方は??
0325デフォルトの名無しさん2005/07/23(土) 20:40:19
>>322
こっちのほうが適してるかも
http://pc8.2ch.net/test/read.cgi/tech/1121471445/
0326デフォルトの名無しさん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点以上のものを合格とするプログラムを作っていただけないでしょうか?

0327デフォルトの名無しさん2005/07/23(土) 20:58:36
自分の宿題を人にやらすなよ
0328デフォルトの名無しさん2005/07/23(土) 20:58:45
>>326
マルチ氏ね
0329デフォルトの名無しさん2005/07/23(土) 20:58:51
>>326
作っていただけません。
0330デフォルトの名無しさん2005/07/23(土) 21:09:06
最近思うんだが
「宿題なんぞ教えるかボケ」と書くよりも
「ぼくちんそんなのわかんない」
と書いた方が早くいなくなる気がする
0331デフォルトの名無しさん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");
0332デフォルトの名無しさん2005/07/23(土) 21:11:48
>>331
Cタンも合格だぞ
03333322005/07/23(土) 21:12:26
メル欄に釣り宣言するの忘れたorz
0334デフォルトの名無しさん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);
}
0335デフォルトの名無しさん2005/07/23(土) 21:19:20
>>334
>char name
0336デフォルトの名無しさん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);
}
0337デフォルトの名無しさん2005/07/23(土) 21:26:12
>>336
>for(i = 0; i < sizeof(table) / sizeof(TensuuRec)){
0338デフォルトの名無しさん2005/07/23(土) 21:29:38
ありがございました☆
0339デフォルトの名無しさん2005/07/23(土) 21:30:49
さて…
0340デフォルトの名無しさん2005/07/23(土) 21:33:02
いい感じにバカが蒔けたなw
0341デフォルトの名無しさん2005/07/23(土) 21:33:51
問題:三角形の底辺Aと高さHを入力し、また円の半径Rを入力して各面積Sを求め表示しなさい。
ただし、浮動小数点を用いること。
0342デフォルトの名無しさん2005/07/23(土) 21:34:29
俺的には
for(i = 0; i < sizeof(table) / sizeof(TensuuRec)){
じゃなくて
for(i = 0; i < sizeof(table) / sizeof(table[0])){
0343デフォルトの名無しさん2005/07/23(土) 21:34:44
真実の答へは??340
0344デフォルトの名無しさん2005/07/23(土) 21:36:46
それはずるだよ
0345デフォルトの名無しさん2005/07/23(土) 21:48:18
i++抜けてた…無限ループ無限ループ・ヤッホー・ヤッホー
0346デフォルトの名無しさん2005/07/23(土) 21:50:53
☆★問題:三角形の底辺Aと高さHを入力し、また円の半径Rを入力して各面積Sを求め表示しなさい。
ただし、浮動小数点を用いること。
0347デフォルトの名無しさん2005/07/23(土) 21:57:32
問題文はなんでも「ただし」をつければいいと思っているんじゃねーよ。
そこは「なお」だろ。
0348デフォルトの名無しさん2005/07/23(土) 22:06:34
>>336
課題で本当にそんな感じで書いた奴がいて

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

ワロスwww
0349デフォルトの名無しさん2005/07/23(土) 22:20:35
C言語を学ぼうと思うのですが、おすすめの本とかありますか?
やっぱり>>1のやつがいいんですか?
0350デフォルトの名無しさん2005/07/23(土) 22:23:06
>>349
コレならCまで順番どおりに学べるはず
ttp://61.199.33.219/info/studioring/abc/sp/
0351デフォルトの名無しさん2005/07/23(土) 22:57:16
breakってどこまで飛ぶんですか?
0352デフォルトの名無しさん2005/07/23(土) 23:03:54
地球の裏側
0353デフォルトの名無しさん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;
}
0354デフォルトの名無しさん2005/07/23(土) 23:34:54
ジンバブエまで
0355デフォルトの名無しさん2005/07/23(土) 23:37:20
>>353
お前が判定条件をそうしてるからだろ
0356デフォルトの名無しさん2005/07/23(土) 23:40:15
>>353
改行を拾ってるから。
0357デフォルトの名無しさん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');
ほかにも方法はいくつかあるけど。
0358デフォルトの名無しさん2005/07/24(日) 00:14:41
scanfは怖いからなぁ。
自分はできるだけ使わないようにしてるが。
0359デフォルトの名無しさん2005/07/24(日) 00:21:28
printf("アルファベットを入力してください:");
scanf("%s", &ch);

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

float a;

if ( a ) {
;
}

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

unsigned int a;
とか
char a;
とかも、みんなintになる?
0368デフォルトの名無しさん2005/07/24(日) 13:03:43
>>367
No
0369デフォルトの名無しさん2005/07/24(日) 13:05:47
関数じゃないからなぁ
0370デフォルトの名無しさん2005/07/24(日) 13:34:11
>>367
ちなみにcharは今回の場合に限らないが右辺値になるときには常にint(だめならunsigned int)に昇格される。
0371デフォルトの名無しさん2005/07/24(日) 13:39:12
>>370
今、右辺値は関係ないじゃん
0372デフォルトの名無しさん2005/07/24(日) 13:53:01
>>371
ifの条件式って右辺値じゃないの?
0373デフォルトの名無しさん2005/07/24(日) 13:53:42
ごめん
0374デフォルトの名無しさん 2005/07/24(日) 14:54:53
surface,volume関数を使い、キーボードで値を入力すると表面積と体積を求めるプログラムはどう記述すればいいですか?
0375デフォルトの名無しさん2005/07/24(日) 14:58:17
>>374
キーボード使って記述すればいいと思います。
0376デフォルトの名無しさん2005/07/24(日) 15:07:59
球の?三角錐の?円筒の?
0377デフォルトの名無しさん2005/07/24(日) 15:10:45
四角形です。
0378デフォルトの名無しさん2005/07/24(日) 15:11:18
w
0379デフォルトの名無しさん2005/07/24(日) 15:17:52
三角錐です;;
0380デフォルトの名無しさん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;
}
0381デフォルトの名無しさん2005/07/24(日) 15:20:04
>>379
380使えばできる、ってか1つの数じゃ無理よな、三角錐はw
03823742005/07/24(日) 15:26:44
ごめんなさい、球です…
0383デフォルトの名無しさん2005/07/24(日) 15:27:45
質問です。
int型の変数をsqrt()の引数にしても良いのですか?
0384デフォルトの名無しさん2005/07/24(日) 15:28:54
>>383
無問題
0385デフォルトの名無しさん2005/07/24(日) 15:33:58
>>384
基本は>380と同じ
・main()で半径を入力、surface()とvolume()の結果を出力
・surface()で表面積を計算
・volume()で体積を計算
でOK
0386デフォルトの名無しさん2005/07/24(日) 15:39:22
>>384
thx
03873852005/07/24(日) 15:54:35
アンカー間違えてたorz
>>384じゃなくて>>374ね
0388デフォルトの名無しさん2005/07/24(日) 16:10:43
大丈夫とは思うが・・・表面積・・・しんぱいあーるのじじょう
             体積・・・・・みのうえにしんぱいあーるのさんじょう
03892732005/07/24(日) 18:28:11
自分でいろいろやってみましたがどうしても表示の際、最後に余計な数字が表示されてしまいます。
mallocの使い方はこれであってますよね?

ttp://ccfa.info/cgi-bin/up/src/up14080.txt
0390デフォルトの名無しさん2005/07/24(日) 18:50:42
>>389
1個余計に表示されるのなら1つ先がNULLかどうかを見ればいい。
for(; head->next; head = head->next) {
0391デフォルトの名無しさん2005/07/24(日) 19:16:32
>>390
ありがとうございます。できました。
0392デフォルトの名無しさん2005/07/25(月) 02:22:58
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
0393デフォルトの名無しさん2005/07/25(月) 03:21:09
>>392
過去ログ参照。
0394デフォルトの名無しさん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は何処で現在ビットを得ているのでしょうか?
日本語として破綻している箇所があればご指摘下さい。ご教授お願いします。
03953942005/07/25(月) 04:19:30
すみません。書き込んで30秒で自己解決しました。
(value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
? toupper(*cp) : *cp)-'A'+10) < base
ではisdigit(*cp)?~~~~~~~~'A'+10)が先に評価されるのですね。
式のネストが複雑で、思い違いをしていました。
スレッドの無駄消費申し訳ありません。
失礼致しました。
0396デフォルトの名無しさん2005/07/26(火) 04:58:26
野球におけるピッチャーの防御率は,9回あたりの失点数で計算します.
なので,低い程よくなります.そこで,1試合ごとの投球回数と失点数
を入力し,「全試合を通しての防御率」と「最近5試合の防御率」を入
力するたびに計算するプログラムを作ってください.ただし,1/3 回
のようなアウトカウントによる投球回数は考えず,投球回数単位で計算
するものとします.

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

なお,最大140試合まで入力できるようにしてください.また,
日本のプロ野球では,延長戦は12回までなので,投球回数に12より
大きい数値は入らないようにしてください.
0397デフォルトの名無しさん2005/07/26(火) 05:05:47
>>396
>>1くらい読め
0398デフォルトの名無しさん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;
}

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

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

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

0404デフォルトの名無しさん2005/07/27(水) 07:38:28
>>402
使わずに済むならそれに越したことはない。
少なくともCで広く使われているライブラリには代替は見当たらない。
0405デフォルトの名無しさん2005/07/27(水) 10:38:01
>>402
大抵はsscanf()で事が足りる。
それでダメならどの道strtok()だけでは済まない筈。
0406デフォルトの名無しさん2005/07/27(水) 11:04:48
>>405
トークン数が不明なときはsscanfでどう書けばいいの?
0407デフォルトの名無しさん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);
}
0408デフォルトの名無しさん2005/07/27(水) 16:55:29
皆さん1ヶ月にどくらいの行のコードが書けますか?
0409デフォルトの名無しさん2005/07/27(水) 17:02:10
10行から2万行くらい
0410デフォルトの名無しさん2005/07/27(水) 17:11:27
すげーなおまえ

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

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

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

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

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

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

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

お願いします。

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

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

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

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

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

やってくれるソフトがあるのだからわざわざ設定する必要もないのですかね?
0444デフォルトの名無しさん2005/07/27(水) 23:25:26
やってくれるソフトが無い事だってあるな。
0445デフォルトの名無しさん2005/07/27(水) 23:26:37
いいんじゃねーの? その程度の浅い知識で満足する人なら。
0446デフォルトの名無しさん2005/07/27(水) 23:46:54
>>443
どうせ苦労するのならLinuxでも入れとけ。
Windowsじゃそのへんで苦労してもあまり役に立たない。
0447デフォルトの名無しさん2005/07/27(水) 23:58:25
C言語で文字列を格納するための宣言文って何でしたっけ?
例文は、「yahoo」です。
0448デフォルトの名無しさん2005/07/28(木) 00:00:33
/* 今、私は文字列を記載することをここに誓います */
0449デフォルトの名無しさん2005/07/28(木) 00:01:51
あと
変数Aと変数Bの内容が等しい場合、変数Cに文字「E」を設定する時の
プログラム部分も教えて下さい。
0450デフォルトの名無しさん2005/07/28(木) 00:03:40
>>448
つぼった
0451デフォルトの名無しさん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だとする。
0452デフォルトの名無しさん2005/07/28(木) 00:26:11
>>451どうもです
0453デフォルトの名無しさん2005/07/28(木) 00:27:22
すいません、
[]←って何ですか?
0454デフォルトの名無しさん2005/07/28(木) 00:32:55
  _、_ 
( ,_ノ` )つc[]
0455デフォルトの名無しさん2005/07/28(木) 00:36:12
  _、_ ズズ..
( ,_ノ` )
   []E
0456デフォルトの名無しさん2005/07/28(木) 00:43:59
>>453
配列
0457デフォルトの名無しさん2005/07/28(木) 09:43:45
夏だなおい。
マジレスしちゃうほうもどうかと思うがw
0458デフォルトの名無しさん2005/07/28(木) 09:49:37
ポインタの先のサイズを知るにはどうすればいいのでしょうか?
0459デフォルトの名無しさん2005/07/28(木) 09:53:43
>>458
ポインタの先のサイズを測ればいい
sizeof(*hoge)
0460デフォルトの名無しさん2005/07/28(木) 09:55:20
>>458
要素数を知る方法はない。
関数の引数にポインタを渡すときには要素数も引数として渡すのが一般的。
0461デフォルトの名無しさん2005/07/28(木) 09:57:44
>>460
それが一般的なのか・・・

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

>>466
>461だけだろ。
0468デフォルトの名無しさん2005/07/28(木) 10:14:34
番兵とも言うな
0469デフォルトの名無しさん2005/07/28(木) 10:16:59
あるいはC++のイテレータみたいに終端もペアにして渡すというのもできる。
0470デフォルトの名無しさん2005/07/28(木) 10:19:50
>>469
それも一理あるんだが、古い(頭の堅い)C屋には[from, to)であることを理解したがらない香具師がいるからねぇ。
0471デフォルトの名無しさん2005/07/28(木) 10:23:07
>>470:2: error: syntax error before ')' token
04724702005/07/28(木) 10:30:58
>>471
いや、あの、C++のイテレータって範囲の指定がfromを含んでtoの手前までって仕様だってことで……
04734702005/07/28(木) 10:31:29
つーか、仕事でもこういう羽目になるのが嫌なのよ。
0474デフォルトの名無しさん2005/07/28(木) 12:41:50
>>470
その辺って、途中から変わったんだっけ?
はじめから[from, to)だと思ってた(C-FAQにも載ってるし)。
0475デフォルトの名無しさん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を足して行き、そのかずでわったあまり???
途中まで考えたのですが…
0476デフォルトの名無しさん2005/07/28(木) 16:00:41
>>475
偶数で3で割り切れる値の列挙
つまり、6の倍数
0477デフォルトの名無しさん2005/07/28(木) 16:01:01
100までの数のうち、偶数and3の倍数を、空白をあけずに標準出力に出力している
04784752005/07/28(木) 16:04:45
ありがとうデスm(__)m
04794752005/07/28(木) 16:22:34
あとすいません、

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

(a>='A') && (a<='A')
で宜しいのでしょうか?
0480デフォルトの名無しさん2005/07/28(木) 16:23:06
Z?
0481デフォルトの名無しさん2005/07/28(木) 16:26:40
'A' <= a && a <= 'Z'
0482デフォルトの名無しさん2005/07/28(木) 16:33:21
⊂⊂⊂⊂(a>=^A^)⊃⊃⊃⊃ブーーーーン
04834752005/07/28(木) 16:35:28
ありがとうございます
もちろん最初から聞いてるのではなく
考えて分からなかったところを聞いてますので
怒らないで下さい。信じてください
0484デフォルトの名無しさん2005/07/28(木) 16:39:36
>>479
使っていいなら<ctype.h>のisupper()を使え。
0485デフォルトの名無しさん2005/07/28(木) 16:43:33
isupper()とかは微妙にロケール依存なので注意
0486デフォルトの名無しさん2005/07/28(木) 16:59:49
>>479
((a >= 'A') && (a <= 'Z'))
0487デフォルトの名無しさん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);
}


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

scanfの前に、
printf("input[%d]:", i);
を入れるとわかりやすいかも。
0490デフォルトの名無しさん2005/07/28(木) 18:25:24
↑ありがとうございました
0491デフォルトの名無しさん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
0492デフォルトの名無しさん2005/07/28(木) 18:32:24
複数回答あり?
04934912005/07/28(木) 18:39:04
う〜ん、書いてませんでした。すいません
いっしょうけんめい調べたのですが、読んでも分からなくて…
0494デフォルトの名無しさん2005/07/28(木) 18:40:55
>>491
1.
for文の初期化項目がない。
nが事前に初期化されているなら、
for ( ; n > 0; n++)
と書くべき。

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

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

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

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

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


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

enum{
apple;
orange;
banana;
};
char *s[] = {
"apple",
"orange",
"banana"
};
puts(s[orange]);
0504デフォルトの名無しさん2005/07/29(金) 00:40:15
c言語で
char a[4];
printf("四文字入力");
scanf("%s",a);
のようにして、四文字を一文字ずつ読み込ませる方法はありますか?
超初心者に教えてください。
05055032005/07/29(金) 00:47:21
すみません、間違ってカンマをセミコロンにしていました。
0506デフォルトの名無しさん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]);
}
0507デフォルトの名無しさん2005/07/29(金) 00:56:14
>>503
puts("orange");
0508デフォルトの名無しさん2005/07/29(金) 01:03:28
>>504,506
要素数4なら'\0'が入るから入力できるのは3文字までじゃない?
05095032005/07/29(金) 01:11:46
この役立たず!
0510503(本物)2005/07/29(金) 01:12:35
>>509
あなた誰?
05115032005/07/29(金) 01:15:45
>>509-510
ちょ、お前ら騙んなよ。

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

enum     {  apple , orange ,  banana  };
char *s[] = { "apple", "orange", "banana" };
0514デフォルトの名無しさん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

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

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

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

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

現在一橋大の法の2年です。受験勉強の能力としては自身があります。
パソコンの能力に関係あるかどうか分かりませんが。
0518デフォルトの名無しさん2005/07/29(金) 07:49:17
汎用ポインタのポインタ、void **pをどんな型のポインタでも入る変数として
扱うのは無理なんでしょうか
簡単なコード書いてみたんですがエラーが。
0519デフォルトの名無しさん2005/07/29(金) 08:02:54
>>518
素直にvoid*じゃ、あかんのか?
0520デフォルトの名無しさん2005/07/29(金) 08:48:58
>>517
【ム板で】基本情報技術者試験【合格しよう】
http://pc8.2ch.net/test/read.cgi/tech/1097165080/l50
0521デフォルトの名無しさん2005/07/29(金) 08:51:23
>>518
void **へ入れるときも出すときもキャストすればいいだけ。
0522デフォルトの名無しさん2005/07/29(金) 10:32:28
質問です。
void型でboo1からboo100までを作りたいのですが、いちいち
void boo1, boo2, boo3・・・, boo100とやるのは時間が掛かるし、面倒じゃないですか。
そこでforを使って変数を作りたいのですが、どのようにすれば良いでしょうか?
0523デフォルトの名無しさん2005/07/29(金) 10:36:32
>>522
配列使えばいいだろ。
0524デフォルトの名無しさん2005/07/29(金) 10:37:24
void型の変数なんて宣言できたっけ?
宣言できても何に使うか想像できないけど
0525デフォルトの名無しさん2005/07/29(金) 10:39:14
>>519
文字列も扱いたかったんです
>>521
ありがとうございます。できました
05265222005/07/29(金) 10:46:13
>>523配列・・・やはりそうきますか。ちょっと考えさせてください。
0527デフォルトの名無しさん2005/07/29(金) 11:08:17
>>526
   _ _
Σ( O ;)
0528デフォルトの名無しさん2005/07/29(金) 11:09:08
orz
0529デフォルトの名無しさん2005/07/29(金) 11:13:56
>>522がどこまで脳に欠損があるのか知りたい
0530デフォルトの名無しさん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;
--------------
0531デフォルトの名無しさん2005/07/29(金) 12:00:39
>>526
配列にいじめられたのか?
小さい頃、配列に噛まれたとか・・・
トラウマってやつ?
0532続き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をつける必要はあるのでしょうか?
0533デフォルトの名無しさん2005/07/29(金) 12:29:42
>imgは静的変数なんでスタックには配置されないらしいのですが
自動変数じゃん
0534デフォルトの名無しさん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に変な数値が入ってしまってるのです。
0535デフォルトの名無しさん2005/07/29(金) 12:43:14
>>534
それをどんな風に使ってる?
0536デフォルトの名無しさん2005/07/29(金) 13:09:06
>>532
自分で改変するからバグるんだってば。
元のtest0.cでも問題なく動くよ。
つーか、スレ違いなんだから初心者スレでも環境依存OKスレにでも行ってくれ。
0537デフォルトの名無しさん2005/07/29(金) 13:18:19
ああ…、やっぱりやっちまってる…
>>533
"cygwin + mingwn + gcc 相談室" では別の質問から始まった。
基のURL上のサンプル test0.cでは静的変数だから、スタック関係ない、
と言われただけ。
つまり、スタックもローカル/グローバル変数もまるっきり解かってない。
>>530,532
おまえがいわゆる「記憶クラス」に関して何も理解しないまま、
半端な知識で、馬鹿な改悪をして質問するのが悪い。
C言語の超初心者として、勉強し直せ。教科書選びからだろうなあ。
05385342005/07/29(金) 13:20:36
動作がおかしいんでステップ実行で見てたら、可変長配列の中身が
おかしくなってたんです。

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

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

使い方は、この後配列の中身をランダムにスワップして、ランダムな数
列として使っています。
0539デフォルトの名無しさん2005/07/29(金) 13:44:53
>>532
そもそもそのページのそのコードは、チュートリアルにはなるかも知らんが実用にはならない。
0540デフォルトの名無しさん2005/07/29(金) 14:00:45
C言語でハンゲームのIDとPWを詐取できると聞きましたが本当ですか?
0541デフォルトの名無しさん2005/07/29(金) 14:04:38
>>540
お帰り下さい。
0542デフォルトの名無しさん2005/07/29(金) 14:12:34
>>538
こちらは小さなサンプルで buf[]の内容をprintfしたのは正常だなあ。
デバッガは何をどのように使ってる?
こっちのgdbではちゃんとシンボル情報を扱えなかったようだし、
-4523832 も stack上の addr.ぽい気もするし。
とにかく step実行より確認にサンプルと実行結果を提示したほうが
よいと思われ。
そうじゃないとそちらのコードが悪いか、gccの問題か判断できないから。
0543デフォルトの名無しさん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;
}
05445432005/07/29(金) 14:37:48
あらかじめ指定された文字列(concatenation)を当てるゲーム、ハングマンのプログラムです
これをコンパイルして実行して、たとえばcを入力すると
c--c---------
文字を入力してください
c--c---------
文字を入力してください

「文字を入力してください」の後にgetchar()があるのに2回「文字を入力してください」と表示されます
どこが間違ってるか指摘お願いします。
0545デフォルトの名無しさん2005/07/29(金) 14:43:07
>>544
'\n'も入力されるから。
05465342005/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]);
}
}
0547デフォルトの名無しさん2005/07/29(金) 15:35:33
すげえくだらない質問なんですが、
char tex[4][4][256];
tex[1][4] = "noname";

上手くいきません。tex[1][4]に文字列を格納する方法を教えてください。
0548デフォルトの名無しさん2005/07/29(金) 15:37:10
>>547
strcpy
0549デフォルトの名無しさん2005/07/29(金) 15:39:13
>>534
じゃあ、今のところあなたのコードがおかしい「らしい」、
ということで、もとの質問に意味なくなるね。お終い。
(data sizeやら最適化やらの問題もあるかしらんが。
まあ、もともと可変長配列を使わないほうがいいだろうけど。)
0550デフォルトの名無しさん2005/07/29(金) 15:41:40
>548
そうだった。�dクス
0551デフォルトの名無しさん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);
}
---------------
0552デフォルトの名無しさん2005/07/29(金) 15:50:46
>>551
リダイレクトすればいいんじゃないの?
0553デフォルトの名無しさん2005/07/29(金) 15:55:21
質問ですが
■ ■ ■
■ ■ ■
■ ■ ■
こういう並べ方で画像など表示する時、
for (x = 0 ; x < 3 ; x++) {
 for (y = 0 ; y < 3 ; y++) {
 (描画処理)
 }
}
こんな感じだと思いますが、
   ■
  ■  ■
■  ■  ■
  ■  ■
   ■
こういう並べ方で表示する場合
どうすればいいのでしょうか?
0554デフォルトの名無しさん2005/07/29(金) 16:37:23
数字を複数入れ、その最小値はいくらです。と表示。
その時−の数字も含み、
最初に0を入れたら何もありませんでしたと表示し、途中で0を入れたら↑の最小値の表示を行うPの一例をお願いします。
0555デフォルトの名無しさん2005/07/29(金) 16:45:01
にわかにへんなのばっかわいて出てるなあ。スルー推奨。
>>1 を読んで、恥ずかしくない奴だけ質問しようよ。
05565492005/07/29(金) 16:46:56
可変長配列にデバッガが未対応でもさほど不思議に思わぬが
(gdbなら x/3wx buf とかで済むし)ふと思い出した。
gcc -ggdb ... なら p buf[0] や p buf で大丈夫そう、だった。
(変な質問の奴ってやはり最後は挨拶無しなのね)
0557デフォルトの名無しさん2005/07/29(金) 16:58:46
>>551
EOFってCtrl+dとかじゃなかった?
0558デフォルトの名無しさん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)
・・・分かりにくくてスマソ
0559デフォルトの名無しさん2005/07/29(金) 17:02:04
>>557
Win は行頭で Ctrl+Z。
0560デフォルトの名無しさん2005/07/29(金) 17:19:49
お前ら今何してる
0561デフォルトの名無しさん2005/07/29(金) 17:24:54
560の書き込みを読んでレス
05625532005/07/29(金) 17:25:19
よく分からないけど、
綺麗なコードじゃ作れないってことですか。
サンクス。
0563デフォルトの名無しさん2005/07/29(金) 17:26:20
まあ EOFってなに? な状態だろうからなあ。
>>551
初心者が K&Rを参考にするなら、unix上でやれ。
そうでないと混乱するだろうから。
あるいは、せめて Win上での環境にも触れている副読本、
または Win上での学習書を用意しろ。目標次第だが、
そこらへんをケチれるほどの余裕はまだ無いだろうから。
05645542005/07/29(金) 17:28:33
>>554はCですって言えばOK?>>555
0565デフォルトの名無しさん2005/07/29(金) 17:30:34
>>564
↓ここで、宿題ですって言ってこい

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

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

>>557
>>559
ありがとうございます。Enterの後、Ctrl+Zでなんとか通りました。
文末に行ったらgetchar()が自動的にEOFを返すもんだと勝手に思ってたのが原因みたいです。
自分で入力しなきゃいけないんですね。
0584デフォルトの名無しさん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("");
}
}
0585デフォルトの名無しさん2005/07/29(金) 20:19:59
>582が何を言ってるのか一瞬分からなかったけど、
回転行列のことか、納得。

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

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

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

激しくがんがれ。

0589デフォルトの名無しさん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 ); なんて
やってるソースを見かけたことがあります。
0590デフォルトの名無しさん2005/07/29(金) 23:42:11
>>589
どんなポインタ型もvoid *へ変換できるし、その逆もまた可能。(さすがにC++では逆はキャストが必要になったが)
ポインタへのポインタ型もポインタ型の一種であることには間違いないのだからそんなのも問題ない。
05915032005/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;
0592デフォルトの名無しさん2005/07/29(金) 23:48:49
>>591
Boost Preprocesser libraryを使えばもうちょっと自然にできると思われる。
0593デフォルトの名無しさん2005/07/30(土) 03:55:11
質問です。
malloc関数でメモリを確保して配列にしたいのですが、
その配列を2次元配列として扱っていくにはどうしたらよいでしょうか?
つまり配列の縦横の大きさの定義ができればと思うのですが・・・
0594デフォルトの名無しさん2005/07/30(土) 05:25:11
例えば int hoge[x][y]の様な2次元配列として扱うときは

int (*hoge)[y] = malloc(x * y);
05955932005/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とエラーが出てしまいます。
0596デフォルトの名無しさん2005/07/30(土) 06:28:45
>>595
data = (char *)malloc(sizeof(char) * hight*width );
05975932005/07/30(土) 06:38:34
>>596
素早いレス感謝です。
その配列を2次元配列(data[hight][width])として扱いたいというのが質問なのですが、
そのままでは1次元配列として扱われてしまいませんか?

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

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


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


>>602
ありがとうございます。
助かります
06045942005/07/30(土) 08:50:10
>>593
ごめん、mallocの引数にsizeof(int)かけてなかった・・・orz
602の人の、レスの方が正しい書き方だね
0605デフォルトの名無しさん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] = ....;
...
0606デフォルトの名無しさん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;}
なんて関数にしておくといい。
0607デフォルトの名無しさん2005/07/30(土) 12:34:25
>>599
http://www.geocities.jp/ky_webid/c/055ans.html
0608デフォルトの名無しさん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;
}
0609デフォルトの名無しさん2005/07/30(土) 19:40:00
>>602
どの辺りがC99なの?
0610デフォルトの名無しさん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"と表示してフリーズするんですけどどこがいけないんですか?
0611デフォルトの名無しさん2005/07/30(土) 20:42:27
5
0612デフォルトの名無しさん2005/07/30(土) 20:45:00
>611
すみません。ありがとうございます。
0613デフォルトの名無しさん2005/07/31(日) 05:15:26
>>609
(*data)[width]のwidthが定数でないところ。
0614デフォルトの名無しさん2005/07/31(日) 05:22:00
まさか可変長配列のつもりなのかっ
0615デフォルトの名無しさん2005/07/31(日) 05:53:26
>>614
だから602は可変長配列じゃないってことわっているじゃないか。
0616デフォルトの名無しさん2005/07/31(日) 06:10:51
おい!!!おれは心底、コボラーだ!!!
そんなおれは、Cとやらをサンデープログラマーしてやる!!!

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

さあ!!!

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

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

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

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

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

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

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

※45歳毒
0628デフォルトの名無しさん2005/07/31(日) 12:54:55
>>627
COBOLを書いていたのなら数日。
書かされていたのなら無理。
0629デフォルトの名無しさん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文がおかしそうなんですけれども。
どこがまずいんでしょうか??
0630デフォルトの名無しさん2005/07/31(日) 13:16:47
すごいな。
0631デフォルトの名無しさん2005/07/31(日) 13:22:05

つまんね
0632デフォルトの名無しさん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) なんだから値を返すように。
0633デフォルトの名無しさん2005/07/31(日) 14:17:07
* 夏休みの生活
sageぐらい覚えよう/覚えてもらえ。
>>1は読もう。宿題はよそでやれ。(相手にしない。誘導)
それらはたいてい「Cの話」以前だ。
涼しい生活を
0634デフォルトの名無しさん2005/07/31(日) 15:21:02
他スレで伺っても返ってこなかったので伺いさせていただきますが(大至急なので)

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

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

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

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

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

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


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

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

char *a

って書くのと、

char a[]

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

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

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

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

という、ふたつの構造体を定義したいんだけど
どうしたらいいんだっけ
0686デフォルトの名無しさん2005/08/01(月) 03:00:16
間違えた
struct A { struct B *b; };
struct B { struct A *a; };
だった
0687デフォルトの名無しさん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とかやっても間違ってるってでるよママン。
そんなに難しい問題じゃ無いのはわかってるんだけども誰か教えて下さいまし。
。・゚・(ノД`)・゚・。
0688デフォルトの名無しさん2005/08/01(月) 03:39:51
b[k]=a[k];
0689デフォルトの名無しさん2005/08/01(月) 03:43:18
。・゚・(ノД`)・゚・。…

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

typedef struct _a A;
typedef struct _b B;
struct _a { B *b; };
struct _b { A *a; };
0691デフォルトの名無しさん2005/08/01(月) 03:49:35
て言うか凄いねここの人たち!
誰かC++に詳しい人メッセ友達になって欲しい…
0692デフォルトの名無しさん2005/08/01(月) 03:50:05
うっさいはげ
0693デフォルトの名無しさん2005/08/01(月) 05:44:43
>>692
そんな気にしてることいわないでよ(ノД`)
せめてかわいらしくぱげっていって
0694デフォルトの名無しさん2005/08/01(月) 06:07:51
>>693
うるさいぞっ♪ハゲ♪
0695デフォルトの名無しさん2005/08/01(月) 07:34:27
Windowsユーザーなのですが、プログラムをDOS窓でしか動かしたことがありません。
ユーザーインターフェイス(?)を持ったプログラムを作成するにはどのようにしたら良いのでしょうか?
0696デフォルトの名無しさん2005/08/01(月) 07:45:17
DOS窓はUIを持ってないのかwwww
0697デフォルトの名無しさん2005/08/01(月) 07:52:27
BCB6を買うといいよ
06987352005/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以前の質問だったでしょうか
0699デフォルトの名無しさん2005/08/01(月) 08:05:08
「ユーザーインターフェース」という単語の意味を調べたことはありますか?
0700デフォルトの名無しさん2005/08/01(月) 08:06:41
もうひとつ
>>1を読んだことはありますか?
0701デフォルトの名無しさん2005/08/01(月) 08:07:19
ヒント:CUIとGUIでぐぐれ
0702デフォルトの名無しさん2005/08/01(月) 08:09:00
>>698
CUIとGUIという単語について調べてみ
07037022005/08/01(月) 08:10:01
うは、>701とかぶったw
07046952005/08/01(月) 08:11:44
698の名前書き間違えましたorz


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


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

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

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

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

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

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

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

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


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

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

よろしくおねがいします。
0735デフォルトの名無しさん2005/08/02(火) 23:25:41
単純なところではUTF-16だったり32だったり。
0736デフォルトの名無しさん2005/08/02(火) 23:28:48
>>734
ウ
0737デフォルトの名無しさん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は実行する環境で最も自然な型となっているのだから早いと言うのも期待していいだろう。
0738デフォルトの名無しさん2005/08/02(火) 23:30:37
ほとんどの処理系って言われてもな。
組み込み系まで入れればバラバラだし
07397342005/08/02(火) 23:37:47
すばやい回答どうもです。
07407302005/08/02(火) 23:46:47
>>732
だから、「意図している」(期待している?)だけであって、
動作が生じることを定義や決定しているわけでないよなあ。
なわけで、>>724あたりが何を言ってるのかよくわからんと。
0741デフォルトの名無しさん2005/08/03(水) 00:26:29
stdioのFILEオブジェクトに対してis_readable()のような
テストをする標準的な方法は無いんでしょうか?
filenoでディスクリプタを取り出して環境依存のpollを
するのは避けたいと思っています
0742デフォルトの名無しさん2005/08/03(水) 00:58:19
>>730
>>732のことです

>>740
「意図している」の定義の差ですな
「〜なければならない」とはやっぱ違うのか…
ナンセンスは言い過ぎだったかも
0743デフォルトの名無しさん2005/08/03(水) 01:44:01
ISO/IEC 9899:1999 だと intended になってる。
shall はついてないから必ずそうなるって言ってるわけじゃなさそう。
07447302005/08/03(水) 05:50:48
各種規格書手元に無しでえらそうにするつもりではないが、
>>742 ということなら、「C言語の規格」のその部分のみ(?)を基に、
>>標準では行頭へ移動することが決められている
と言うのはナンセンス(というか間違い)だし、つぅか……、
>>「〜なければならない」とはやっぱ違うのか…
あたりまえだ。「意図している」としか読みようが無いので、
擁護しようが無い。721のほうがまだまとも。
まあ、もともと718の上書きって、どういうデバイスに対して
どうしたいのか、さっぱりだし、それはこのスレの話かと…
0745デフォルトの名無しさん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;
}
0746デフォルトの名無しさん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
0747デフォルトの名無しさん2005/08/03(水) 13:04:53
>>745-746
マルチ乙
0748デフォルトの名無しさん2005/08/03(水) 13:05:52
なにこの読み込み不一致で無限ループプログラム
0749デフォルトの名無しさん2005/08/03(水) 13:59:08
>>748
そうしろって教師に言われた
0750デフォルトの名無しさん2005/08/03(水) 21:03:36
scanf()なんてC言語のエキスパートでも使いこなせない
関数を授業で使わせる教師は逝ってよしだな
0751デフォルトの名無しさん2005/08/03(水) 21:24:29
scanfを使いこなせないのは>>750だけ
0752デフォルトの名無しさん2005/08/03(水) 21:59:02
>>750
エキスパートなら使いこなせるが、使わないだけだ

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

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

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

Gの頂点数
Gの隣接行列

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

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

char &a

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

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

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

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

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

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

>>784

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

C90は、これのことです。
> ISO/IEC?9899?:?1990
# もしかして、間違ってるのか。ちょっと調べてみる
0828デフォルトの名無しさん2005/08/05(金) 23:24:01
>>825
何でお前はこんなにも定石を知らないんだ?
いったい何を読んで学んできたんだか不思議でならないんだが。
0829デフォルトの名無しさん2005/08/05(金) 23:24:28
>>825
scanf()を呼んだ後にmalloc()を呼べばいいだけだろ。
0830デフォルトの名無しさん2005/08/05(金) 23:28:05
初心者スレで逝ってきます。。
おさわがせしました
0831デフォルトの名無しさん2005/08/05(金) 23:28:15
>>827
ANSI C89とISO C90はどっちも同じ内容。
C95はAmendment1。
0832デフォルトの名無しさん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++で組むからあんま困ったことは無いな。
0833デフォルトの名無しさん2005/08/05(金) 23:35:11
mallocが抜けてたorz

matrix = malloc(n * sizeof(int*));
matrix[0] = malloc(n * m * sizeof(int));
0834デフォルトの名無しさん2005/08/06(土) 06:09:34
アセンブラで
db 100h dup(-1)
などとできるわけですが、Cの場合、どうすればよいのでしょうか?
char buf[0x100] = ???
0835デフォルトの名無しさん2005/08/06(土) 08:14:08
>>834
memset(buf, -1, sizeof(buf));
0836デフォルトの名無しさん2005/08/06(土) 08:23:16
>>835
確かに普通はそう書くけど、
>>834 のアセンブラとは等価じゃないよね。
オブジェクト内に256個 -1 が埋め込まれるっていうのが>>834の目的だとしたら、
の話だけど。
0837デフォルトの名無しさん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, };
0838デフォルトの名無しさん2005/08/06(土) 15:36:26
strchrって何の略?
0839デフォルトの名無しさん2005/08/06(土) 15:48:45
stringからcharactarを探す。
0840デフォルトの名無しさん2005/08/06(土) 15:50:23
charactar あげ
08418382005/08/06(土) 15:53:57
やっぱそれか。
ありがとう。
0842デフォルトの名無しさん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で埋める)方法を教えて下さい。
0843デフォルトの名無しさん2005/08/06(土) 16:44:50
>>842
初心者は初心者スレへどうぞ。
あ、ちなみにそのコードでbにはきちんと0x88が格納されますよ。
0844デフォルトの名無しさん2005/08/06(土) 16:47:50
VC2003で同じく
0845デフォルトの名無しさん2005/08/06(土) 17:00:59
>>842 ここまで単純だと、どうやって b[] の値を確認した(つもり?)のか、
のほうが気になってくるなあ…… でもスレ違い。
0846デフォルトの名無しさん2005/08/06(土) 18:03:20
CにUINTやBYTEなんていう型はありません
0847デフォルトの名無しさん2005/08/06(土) 18:12:04
てかDWORD単位でコピーするならmemcpyなんて使う必要ないわけで

* (unsigned int*)(b+4) = a;
* (unsigned int*)(b) = a;
0848デフォルトの名無しさん2005/08/06(土) 18:16:12
>>842
もしかして:
BYTE b[9];
sprintf(b, "%x", a);
0849デフォルトの名無しさん2005/08/06(土) 18:16:22
>>846
windows.hでtypedefされてる。
0850デフォルトの名無しさん2005/08/06(土) 18:18:13
>>849
3年ROMってろボケ
0851デフォルトの名無しさん2005/08/06(土) 18:29:26
API関数使ってるならまだしも、ただの汎用型のtypedefごときでひねた態度取るヴァカの居るスレはここですか?
0852デフォルトの名無しさん2005/08/06(土) 18:33:34
>>851
3年ROMってろボケ
0853デフォルトの名無しさん2005/08/06(土) 18:37:05
↑帰っていいよ。
0854デフォルトの名無しさん2005/08/06(土) 18:39:48
>>847
> てかDWORD単位でコピーするならmemcpyなんて使う必要ないわけで
>
> * (unsigned int*)(b+4) = a;
> * (unsigned int*)(b) = a;

こういうことすると環境によってはアクセス違反でプログラムが落ちますよ
0855デフォルトの名無しさん2005/08/06(土) 18:41:16
>>854
どんな環境で落ちるの?それはmemcpyで解決するの?
0856デフォルトの名無しさん2005/08/06(土) 18:41:36
俺はWindows on 32bit Intelでしかプログラムしないから
環境によってはとかくだらないこと考える必要は無い
0857デフォルトの名無しさん2005/08/06(土) 18:47:06
>>854
エンディアンの違いとか?
この手のテクってMMXやSSE使う場面では常套手段だし
そもそもWindowsのヘッダなんて使ってる時点でおもっきし環境依存だから問題茄子
0858デフォルトの名無しさん2005/08/06(土) 18:47:34
uint32_t つかえよ。
0859デフォルトの名無しさん2005/08/06(土) 18:49:03
てかDWORDつってんだから *(DWORD*)b = a; だろ。
0860デフォルトの名無しさん2005/08/06(土) 18:50:46
あくまでIntel流のデータサイズの呼び方に合わせてるだけで
キャストでデータ構造さえ変わらない限り型のサイズさえあってればなんでもいいと思う
0861デフォルトの名無しさん2005/08/06(土) 18:50:56
>>855
4バイト境界以外での、DWORDアクセスや、
奇数番地へのWORDアクセスを許さないプロセッサもある

そういうプロセッサ用のライブラリでは、
memcpy内でコピー開始アドレスを判定して、
BYTE, WORD, DWORD を使い分けて書き込む用になってる
0862デフォルトの名無しさん2005/08/06(土) 18:55:05
あるな、確かに。
使ったことないけど。
0863デフォルトの名無しさん2005/08/06(土) 18:56:52
int *a[10]; と、 int (*a)[10]; の違いが分からん。
0864デフォルトの名無しさん2005/08/06(土) 19:00:57
>>861
普通はそういうプロセッサ向けのコンパイラならバイト配列変数の先頭をアラインメント合わせると思うけど。。。

ま、パフォーマンスが重要な部分では基本的にデータを16バイト境界で合わせてmovdqa使えるように
してるけどね。
0865デフォルトの名無しさん2005/08/06(土) 19:12:20
>>863
前者のaは配列。後者のaはポインタ。
0866デフォルトの名無しさん2005/08/06(土) 19:17:33
より厳密には

前者は int型に対するアドレスの配列(要素数10)

と、

後者はint型配列(要素数10)に対するポインタ
0867デフォルトの名無しさん2005/08/06(土) 20:04:41
>>864
それは知っている世間が狭すぎ。
例えばSunOSでお馴染みのSparcでは、charの配列は隙間無しに詰め込む実装もある。
4バイト境界をはみ出すintアクセスがcoreを吐くにも関わらず、ね。
あー、intは4バイト境界だけどdoubleに至っては8バイト境界になるからもっとややこしいな。
0868デフォルトの名無しさん2005/08/06(土) 20:37:05
そういう実装もどうかと思うがな。
まぁ、あるんだから仕方ない。
0869デフォルトの名無しさん2005/08/06(土) 20:39:55
まぁSPARC版のWindowsなんて出ないから問題ないな
SunOS&SPARCは利用頻度の低い命令はCPUには実装せず例外をトラップしてOSが提供するって実装じゃなかたっけ?
0870デフォルトの名無しさん2005/08/06(土) 20:49:31
狭い世間でやってる人は静かにしてくれないかな
0871デフォルトの名無しさん2005/08/06(土) 20:55:01
そうだな、Wintelの圧倒的なシェアに比べればSunなんて風前の灯火だしな。
ローエンドサーバはOpteronベースに差し替えてるし、そのうち終わるよ。
0872デフォルトの名無しさん2005/08/06(土) 20:55:03
狭い了見しか持ってない人は静かにしてくれないかな
0873デフォルトの名無しさん2005/08/06(土) 21:01:13
スレ違いな話をしたい奴はよそでやってくれないかな
0874デフォルトの名無しさん2005/08/06(土) 21:17:50
そういえばx86はアライメントまたぎのワードアクセスでも
落ちたりしないんだよな
でもメモリアクセスが無意味に2倍になるから
気をつけて書いたほうがスピードは上がるな。
0875デフォルトの名無しさん2005/08/06(土) 21:19:56
どっちかっていうと、落ちないほうが主流
0876デフォルトの名無しさん2005/08/06(土) 21:31:07
考えようにSSEは今までのIntelの命令セットからすればある意味掟りな実装だな
まあアラインメントが保障されない場合向けのロードストアの手段も提供されてるからいいが

キャッシュラインのこともあるし、どちらにしろアラインメントはきちんと合わせるので
落とし穴にははまることはまず無いと思うが
0877デフォルトの名無しさん2005/08/06(土) 22:21:10
○×ゲームのプログラムを作っているのですが、com2関数の部分が上手く行きません。
他にも冗長な部分があれば指摘していただけるとありがたいです。
プログラムの説明は↓に上げたソース内にコメントとして書いたのですが、足りないところがありましたら
お手数ですが逐次聞いてください。

ttp://oekaki.s56.xrea.com/x/uploader/src/oe2312.txt
0878デフォルトの名無しさん2005/08/06(土) 22:24:42
>>877
詩ね
0879デフォルトの名無しさん2005/08/06(土) 22:25:18
>>877
ゲーム作成板もしくは宿題スレへどうぞ
0880デフォルトの名無しさん2005/08/06(土) 22:33:07
昨日ここで質問したものですが、やっぱりこれではだめなんでしょうか??
コンパイルはできるけど実行途中でエラーがでる。。

/* int a[l][m],b[m][n],p[l][n]; が使いたい */

a=malloc(l*sizeof(int*));
a[0]=malloc(l*m*sizeof(int));
for(h=1;h<l;h++) a[h]=a[h-1]+m*sizeof(int);

b=malloc(m*sizeof(int*));
b[0]=malloc(m*n*sizeof(int));
for(h=1;h<l;h++) b[h]=b[h-1]+n*sizeof(int);

p=malloc(l*sizeof(int*));
p[0]=malloc(l*n*sizeof(int));
for(h=1;h<l;h++) p[h]=p[h-1]+n*sizeof(int);

 :

free(a[0]); free(a);
free(b[0]); free(b);
free(p[0]); free(p);

あと、次の質問に部分的でもいいので答えてくれたらとても助かる…
配列とポインタは表現形式が違うだけで本質的には全く同じものなのですか?違うとしたら、どこあたりなんですか?
int **aa;int *a[];int aa[][]; と宣言するのは全く同じこと?

0881デフォルトの名無しさん2005/08/06(土) 22:34:12
>>879
誘導ありがとうございます。
宿題ではないのでゲーム製作板に行ってみます
0882デフォルトの名無しさん2005/08/06(土) 22:37:41
>>880
ダメ。

本質的に違う。
0883デフォルトの名無しさん2005/08/06(土) 22:38:04
× for(h=1;h<l;h++) p[h]=p[h-1]+n*sizeof(int)
○ for(h=1;h<l;h++) p[h]=p[h-1]+n

int型へのポインタに対する足し算引き算は、デフォでint型のサイズ単位なのでsizeof(int)をかけてやる必要は無い
0884デフォルトの名無しさん2005/08/06(土) 22:43:51
>>880
http://pc8.2ch.net/test/read.cgi/tech/1121644782/258n

配列とポインタは別物。だけど同じような感覚で使えるようになっているからややこしい。
配列変数は要素数分格納できるだけのメモリが用意される。
ポインタ変数は単に他のメモリを指せるだけのメモリしか持たない。
0885デフォルトの名無しさん2005/08/06(土) 22:44:16
ポインタと配列が同じものに見えるのはいくつかの「例外的な暗黙の変換」が働いているから。

(1)ポインタに対して[] 演算子を使える。 int *p; p[0] = 100;
(2)配列の識別名は、単独で使うと先頭要素へのポインタとなる。
(3)関数の引数に配列表現を使用するとそれはポインタとまったく同じ。void for(int a[]);

これら3点はあくまでも例外的な用法。
本来ポインタと配列ははまったくの別物。
0886デフォルトの名無しさん2005/08/06(土) 22:44:45
>>883

sizeof 消しても Windows が怒ってくる。マ社に報告しますか。。と
0887デフォルトの名無しさん2005/08/06(土) 22:47:28
スマソ。あげてしまった。。orz
0888デフォルトの名無しさん2005/08/06(土) 22:48:13
念のためにいうが、mallocの中のsizeofを消してはいかんぞ。
0889デフォルトの名無しさん2005/08/06(土) 22:52:26
てか、上のでやってることはこれとおなじことなんだが
p=malloc(l*sizeof(int*));
p[0]=malloc(l*n*sizeof(int));
for(h=1;h<l;h++) p[h]= &p[h-1][n];


配列サイズをちゃんと記憶しておけるならトリッキーな方法を用いる必要はない。
したがって別にこれでも構わないし

p=malloc(l*sizeof(int*));
for(h=0;h<l;h++) p[h]=malloc(n*sizeof(int));
0890デフォルトの名無しさん2005/08/06(土) 22:52:46
>>>888
malloc の中身はそのまま。ソースしうpしたので。。goto については今日は見逃すということで…(汗)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/847.txt
0891デフォルトの名無しさん2005/08/06(土) 23:01:32
C言語の基礎を勉強しています。配列についてお聞きしたいのですが、
「9人が数学のテストを受けその結果が それぞれ 50,78,91,61,42,77,82,33,84,点だった。
この平均を求め、60点を超えた人が何人いるか求めるプログラムを書け。」
という問題で、
#include <stdio.h>
main(){
int a[]={50,78,91,61,42,77,82,33,84};
int t=0,i,c=0,n=9;
double ave;
for(i=0;i<n;i++){
t += a[i];
ave = t/n;
if(a[i] > 60){
c++;}}
printf("avelage : %f\n",ave);
printf("over 60 : %d\n",c);
return 0;}

としたのですが、n=9といちいちテストを受けた人数を代入しなければならないんでしょうか?
配列の中の数値の個数をnの代わりに使えるような表し方はありませんか?
よろしくお願いします。
0892デフォルトの名無しさん2005/08/06(土) 23:02:44
>891
n = sizeof(a)/sizeof(a[0])
0893デフォルトの名無しさん2005/08/06(土) 23:03:43
>>892
その括弧は不要。
0894デフォルトの名無しさん2005/08/06(土) 23:04:52
sizeofa/sizeofa[0]
0895デフォルトの名無しさん2005/08/06(土) 23:06:56
[]も括弧のうちだろ
かっこで漢字変換するといっぱいでてくるからな
08968912005/08/06(土) 23:08:03
sizeofa/sizeofa0はコンパイル通りませんでした
0897デフォルトの名無しさん2005/08/06(土) 23:14:59
で、どの括弧が不要なんだ
0898デフォルトの名無しさん2005/08/06(土) 23:16:26
あってもいいだろ
0899デフォルトの名無しさん2005/08/06(土) 23:19:12
ありがとうございます!!
0900デフォルトの名無しさん2005/08/06(土) 23:19:51
いるんだよな。規格上「必要ない」がコーディングポリシーで括弧つけてる奴に対して
「あったらいけない」とかって強弁するのが
0901デフォルトの名無しさん2005/08/06(土) 23:21:00
ところで、ビットシフトはどうした?
0902デフォルトの名無しさん2005/08/06(土) 23:23:57
>>896
sizeof a / sizeof a[0]
0903デフォルトの名無しさん2005/08/06(土) 23:25:21
nまで消すなよ
0904デフォルトの名無しさん2005/08/06(土) 23:26:04
>>902
見にくくて吐きそう
0905デフォルトの名無しさん2005/08/06(土) 23:30:22
>>880  こんなんでました。
#include <stdlib.h>
int **alloc_array2(int n, int m)
{
  int i;
  int pp_size = n * sizeof(int**);  /* ポインタ配列のサイズ */
  int p_size = n * m * sizeof(int); /* データエリアのサイズ */
  /* ポインタ配列+データ格納エリアをまとめて確保*/
  char *p = malloc(pp_size + p_size);
  int **pp = (int**)p;  /* 割り当てエリアの頭はポインタ配列用とする */
  p += pp_size;         /* データエリア先頭まで移動 */
  pp[0] = (int*)p;
  for(i = 1; i < n; ++i) pp[i] = pp[i-1] + m;
  return pp;
}

void free_array2(int **pp){ free(pp[0]);}

int main()
{
  /* int a[l][m],b[m][n],p[l][n]; が使いたい */
  int l = 10, m = 20, n = 30;
  int **a = alloc_array2(l,m);
  int **b = alloc_array2(m,n);
  int **c = alloc_array2(l,n);
  /* a[1][2] = 100; みたいに使う。*/
  free_array2(a);
  free_array2(b);
  free_array2(c);
  return 0;
}
09069052005/08/06(土) 23:32:37
解放がまちがってた。

void free_array2(int **pp){ free((char*)pp);}

こうかな。キャストいらないか?
0907デフォルトの名無しさん2005/08/06(土) 23:35:15
>>906
むしろキャストするなら void*
0908デフォルトの名無しさん2005/08/06(土) 23:35:26
>>905-906
外出>>884
0909デフォルトの名無しさん2005/08/06(土) 23:41:11
どうしてエラーが出るのかがわからない。
環境依存なのか?それとも、コーディングが間違っているのか。。

A(1,1)? : 1
A(1,2)? : 5
A(1,3)? : 3 ここで 3 を入力してやると強制的に問題発生になる。

C:\…>
0910デフォルトの名無しさん2005/08/06(土) 23:46:35
後者
09119052005/08/06(土) 23:47:34
>>908
ほんとや。失礼。

ま、こういうのは実用化を考えたら、バッファとバッファサイズとディメンション情報を
まとめて情報管理構造体にして、各種処理関数を実装するのがいいだろうな。
0912デフォルトの名無しさん2005/08/06(土) 23:58:14
>>911
C++のが楽。vectorやvalarrayから派生すればいいし。
0913デフォルトの名無しさん2005/08/07(日) 00:30:07
CとC++って進化するうちにいつの間にか互換性取りにくくなったな
C++のおいしいとこだけ使いたいんだけど難しいわ・・・
0914デフォルトの名無しさん2005/08/07(日) 00:30:42
素直にC++へ移行しろ
0915デフォルトの名無しさん2005/08/07(日) 00:40:46
CとC++の目指すところが違うからな
0916デフォルトの名無しさん2005/08/07(日) 02:34:59
printfで
int a
の数値が正負それぞれの場合
02
-02
の様に表示したいのですが、
%02d
を指定しても、正の場合は02と表示されるのですが、負の場合は-2と表示されてしまいます。
どのような書式指定子を書けばよいのでしょうか。
0917デフォルトの名無しさん2005/08/07(日) 02:55:12
"%-02.2d"かな?
0918デフォルトの名無しさん2005/08/07(日) 13:32:44
%-
は左寄せだろ
0919デフォルトの名無しさん2005/08/07(日) 15:30:37
>>916
+だな
0920デフォルトの名無しさん2005/08/07(日) 17:17:15
他人が書いたソースに、こういう感じの構文が出てきました。

#define MACRO(X) = {X, #X};
struct STRUCT{ int, char[10] };
struct STRUCT = MACRO(name);

char[]に、#nameが代入されているように見えるんですが、どういう意味でしょう?
0921デフォルトの名無しさん2005/08/07(日) 17:27:00
君の見ている本が悪い
0922デフォルトの名無しさん2005/08/07(日) 17:34:29
>>920
#defineなどの中での#は続く字句を文字列リテラル化する効果がある。
つまりMACRO(name)は{name, "name"}と展開される。
0923デフォルトの名無しさん2005/08/07(日) 17:45:21
漏れもINIファイルの読み書きのためにそんなマクロ作った覚えがある。
変数名をそのままキー名にすんの。

最終的には、めんどくさくなったのでPerlでコードジェネレータ書いたww
0924デフォルトの名無しさん2005/08/07(日) 17:59:42
>>920の見ている本は>>923の書いた本
0925デフォルトの名無しさん2005/08/07(日) 18:04:20
林晴比古あたりなら書きそうだけど俺は中の人じゃねーぞ
0926デフォルトの名無しさん2005/08/07(日) 18:46:11
質問です。ファイルを読み込むプログラムで
それまでの読み込んだ文字をカンマでひとつずつ区切り変数に格納し、
スペース文字がきたらスルーする様な
細かい作業が必要なとき、
fgetcで一文字ずつ判別する方法は分かったのですが
fgetsでまとめて読み込んで変数に格納し、その内容を
編集する方法の方が効率がよく早いらしいので、
その方法を教えてください。お願いします。
0927デフォルトの名無しさん2005/08/07(日) 18:56:35
>>926
> fgetsでまとめて読み込んで変数に格納し、その内容を
> 編集する方法の方が効率がよく早いらしいので、

それは幻想です
0928デフォルトの名無しさん2005/08/07(日) 18:57:08
FILE *fileptr
char buf[1024];
int i;
(略)

fgets(buf, sizeof buf, fileptr);
buflen = strlen(buf);
for (i = 0; i < buflen; i++) {
//ここで buf[i] について何かの操作
}


効率云々って、単純に毎回呼ぶと関数コールの展開のオーバーヘッドの問題かと思う
0929デフォルトの名無しさん2005/08/07(日) 19:09:02
いまどきのCPUがスタック操作や関数コールでオーバーヘッド出るとは思えん。
むしろ下手なコードで無駄に分岐を増やす方がとろくなる。
0930デフォルトの名無しさん2005/08/07(日) 19:09:13
fgetcなんか使わずに、statでファイルサイズ取得して、mallocして、readで全部読み込んでしまえよ
あとはchar*を駆使してがんがれ
もしくはflex/bison(LEX/YACC)使うかだな
flexも-f/-Fオプション使うとread使うコード吐く
0931デフォルトの名無しさん2005/08/07(日) 19:12:24
>>929
スタック操作のオーバーヘッド軽減する機構付いてるってPentium Mくらいだけど?

単純なループならそれこそ分岐予測は当てやすい。
0932デフォルトの名無しさん2005/08/07(日) 19:16:45
>>927
入力元のデバイスや、ドライバ、OSなどによっては、ありうるとおもうけど。
なにも、ハイエンドなCPUやOS使ってる人ばかりじゃないだろう。
特に、今時純粋なC言語でアプリを組む必要が多いのは。
0933デフォルトの名無しさん2005/08/07(日) 19:17:44
>>929
本当にそう思うならコード書いて証明してみろ。話はそれからだ。
0934デフォルトの名無しさん2005/08/07(日) 19:18:34
>>929
(関数コール+分岐)*ループ回数よりも
関数コール+分岐*ループ回数のほうが速かろう。
0935デフォルトの名無しさん2005/08/07(日) 19:20:33
>>934
最適化されれば同じだっていってるんだろ。
本当かどうかはしらないが。
0936デフォルトの名無しさん2005/08/07(日) 19:23:04
>>929
いまどきも、ふるどきもスタック操作や関数コールでオーバーヘッドがでるのは変わらんがな。
いつからフォンノイマン型じゃなくなったんだ?
0937デフォルトの名無しさん2005/08/07(日) 19:23:15
はぁ・・・
夏だな
0938デフォルトの名無しさん2005/08/07(日) 19:23:54
今時のコンパイラは複数回の関数呼び出しをまとめて、
別の関数呼び出し一つに変換するような機能がついているのか?
0939デフォルトの名無しさん2005/08/07(日) 19:24:28
>>931
じゃあ単純なループとやらを書いてくれ

>>934
ディスクアクセスを伴うプログラムの速度が単純にコードだけで議論できると?
0940デフォルトの名無しさん2005/08/07(日) 19:24:56
>>938
ICC9ですらそんなのは無いな。
0941デフォルトの名無しさん2005/08/07(日) 19:28:07
>>939
だからコード書いて検証してみろ。おまえのちんけな仮説など聞きたくない。
0942デフォルトの名無しさん2005/08/07(日) 19:30:01
>>922-923
ありがとうございます。

>>924
本ではないです。
>>923は会社の先輩かもしれません。
0943デフォルトの名無しさん2005/08/07(日) 19:30:58
>>939
ディスクアクセスの低減は、fgetcを使おうがfgetsを使おうが
ライブラリが行うことでは?

fgetcだけディスクアクセス低減の機能が入っていると仮定するのは
ちょっと無理が無いか?
0944デフォルトの名無しさん2005/08/07(日) 19:40:16
1バイト読み込むだけで関数コールして逐次処理するよりは、一度に複数バイト読み込んで纏めて処理したほうが
それこそベクトル化などのアグレッシブな最適化も使える罠(そこまで速度に拘る処理じゃないと思うが)

てか、CPU-メモリ間のバスに限って言えば、1バイトずつ転送するより8バイトなり16バイトなりブロック単位で
転送したほうが効率がいい筈だが。
0945デフォルトの名無しさん2005/08/07(日) 19:43:31
>>942
会社で最年少だけど。。。>>923は学生のときに書いたやつ。
0946デフォルトの名無しさん2005/08/07(日) 19:49:17
fgetcはずっとマクロだと思ってたよ。
0947デフォルトの名無しさん2005/08/07(日) 19:51:24
>>946
マクロ(かもしれない)のはgetcの方
0948デフォルトの名無しさん2005/08/07(日) 20:02:18
mmapするのが一番速い。
09499262005/08/07(日) 20:05:30
>927-
みんなありが�d
0950デフォルトの名無しさん2005/08/07(日) 20:18:28
>>935
同じにはならないよ
最適化処理さんが、その関数について
一回呼べばあとは毎回同じ結果を得るものか
それとも毎回結果が違うものか判断は出来ない
その判断ができるのはプログラマだけ
0951デフォルトの名無しさん2005/08/07(日) 20:20:27
>>939
int i;
for (i=0; i<1000000; i++) {
関数コール;
}
の場合、今時のCPUが分岐ミスするのはおそらく100万回に1回だが、
関数コールのオーバーヘッドはおそらく100万回発生する
0952デフォルトの名無しさん2005/08/07(日) 20:21:25
まぁなんだ、fgetc()使ったほうがメモリ確保のコストは低いな。
少なくとも>930みたいなアプローチをするよりは。
0953デフォルトの名無しさん2005/08/07(日) 20:51:36
premature optimization
0954デフォルトの名無しさん2005/08/07(日) 20:52:43
強いて言えば改行コード自前で加工するならバイナリモードのほうが速い
0955デフォルトの名無しさん2005/08/07(日) 21:10:00
バイナリモード?


プッ
0956デフォルトの名無しさん2005/08/07(日) 21:15:06
UNIXではファイルストリームがテキストモードだろうがバイナリモードだろうが変わらないが
MS系の改行コードはCR+LF、MacはCRだから話がメンドイのよ。
0957デフォルトの名無しさん2005/08/07(日) 21:45:03
配列のポインタがイマイチ分からないので教えて下さい。
初心者なので上手く説明できないかもしれませんが、許して…

こんな配列があったとして、

Test[4] = ' ABC ';

Testは配列の先頭要素のアドレスを指しているのは分かったんですが、

*Test

で呼び出した時っていうのは、
配列の先頭要素のAだけを指すのか、
配列全体のABCを指すのかが、はっきりしません。

教えて下さい。
0958デフォルトの名無しさん2005/08/07(日) 21:46:59
>>957
その文章の中に「配列のポインタ」は一つも出てきていない。
Test はあくまでも、先頭要素へのポインタで。*Test は先頭要素のポインタ解決。つまり先頭要素の値。
0959デフォルトの名無しさん2005/08/07(日) 21:51:05
char Test[4];       /* 配列。*/
char *p1 = Test;     /* 先頭要素へのポインタ */
char (*p2)[4] = &Test; /* 配列へのポインタ */
0960デフォルトの名無しさん2005/08/07(日) 21:52:05
>>957
Aだけ。


余談だがポインタ Test[0] と *(Test + 0) は等価で
0[Test] でも参照できる。




配列へのポインタの場合、その値に1を足すと、アドレスは、配列の要素単体のサイズではなく
配列自体のサイズ分だけ増加することに注意。
0961デフォルトの名無しさん2005/08/07(日) 21:57:52
余談だがポインタ Test[0] と *(Test + 0) は等価で
交換法則により、*(Test + 0) は *(0 + Test) と等価。
したがって、 Test[0] も 0[Test] と等価である。

といわないと、わかんないだろ。
0962デフォルトの名無しさん2005/08/07(日) 22:03:36
>>960-961
ムダに知識をひけらかすのはよせって。
Test[0] == 0[Test]な話なんて知ってる必要全然ないし、混乱させるだけだって。
0963デフォルトの名無しさん2005/08/07(日) 22:05:27
まさにトリビアだなぁ。
09649572005/08/07(日) 22:08:04
皆さんありがとうございます。

>>960を読んで「え?(;´д`)」って混乱しました…。
>>961さん助かりました。なんとなくですが、賢くなった気がします。

しかし余計に分からなくなってしまった部分も…。

配列の要素全部を読み込ませたい時はどうすればよいのでしょうか。
for文使って1個ずつ要素を抜き出すしかないのでしょうか?
0965デフォルトの名無しさん2005/08/07(日) 22:10:37
ポインタは、アドレスを保存すると同時に、その指し示す変数の大きさも表現している。
だからアドレスが同じでも char *p; と int *p; は同じではない。
0966デフォルトの名無しさん2005/08/07(日) 22:12:22
>>964
>配列の要素全部を読み込ませたい時はどうすればよいのでしょうか。
>for文使って1個ずつ要素を抜き出すしかないのでしょうか

YES
0967デフォルトの名無しさん2005/08/07(日) 22:14:40
配列の範囲コピーは、memcpy / memmove を使うことが多いな。

構造体の代入が出来ることを利用して。

struct A { char data[100]; };

struct A a;
struct A b;

a = b;

というテクニックはあるが、あまり使われない。
0968デフォルトの名無しさん2005/08/07(日) 22:15:50
>>964
> 配列の要素全部を読み込ませたい
というのがよくわからんが、他の配列にコピーしたいというような話なら
> for文使って1個ずつ要素を抜き出す
というのが一番わかりやすいのではないかと。
配列の内容が保持されているメモリ領域を指定して(memcpyなどで)丸ごと
コピーするというのもありだが。
0969デフォルトの名無しさん2005/08/07(日) 22:17:27
>>965
ポインタは、アドレスを保存すると同時に、その指し示す変数の型も表現している。
だからアドレスとサイズが同じでも float *p; と long*p; は同じではない。
0970デフォルトの名無しさん2005/08/07(日) 22:22:39
>>967
ものすごい冗長なコードが吐かれる罠。

普段組むときは配列は大抵STLから派生するのでそれに任せるし
タイムクリティカルな部分ならそれこそMOVQとかMOVDQAかな。
0971デフォルトの名無しさん2005/08/07(日) 22:23:55
STLってCに移植されてるの?
0972デフォルトの名無しさん2005/08/07(日) 22:32:15
971じゃないけど、
C言語ってテンプレート使えるの?
#define マクロ駆使すれば、擬似的なこと可能?
0973デフォルトの名無しさん2005/08/07(日) 22:33:22
>>971
混じれ酢するとされてないよ。

テンプレートくらいは移植されてもいい気がするんだけどね。あと無名関数とかも欲しい。
マクロは使い難す。
0974デフォルトの名無しさん2005/08/07(日) 22:37:28
メモリエラーを扱う適切な方法が無いから移植できない
0975デフォルトの名無しさん2005/08/07(日) 22:38:05
>>972
再帰みたいなことは無理だけど、もともとマクロの機能を整理したのがインライン関数だったり
テンプレートだったりする。

もちろん真似事程度には使える。
てかWin32のメッセージマップマクロまわりが結構それっぽいんだけど、MSにはできればアレをうまくテンプレート化してほしいと思っている。
0976デフォルトの名無しさん2005/08/07(日) 22:43:02
LCC-Win32だっけな。C99対応したはいいがなぜかCコンパイラなのにiostreamとか使える代物
0977デフォルトの名無しさん2005/08/07(日) 22:45:41
#include <stdio.h>
#include <string.h>

#define ARRAY_SIZE(a)  (sizeof(a)/sizeof(*(a)))
#define ARRAY_BEGIN(a) (a)
#define ARRAY_END(a)   (ARRAY_BEGIN(a) + ARRAY_SIZE(a))
#define COPY_ARRAY_N(src,dst,n) memmove((dst), (src), (n)*sizeof(*(src)))
#define COPY_ARRAY(src_begin, src_end, dst) \
  COPY_ARRAY_N(src_begin, dst, (src_end)-(src_begin))

int main()
{
  int src[10],dst[10];
  
  COPY_ARRAY_N(ARRAY_BEGIN(src), ARRAY_BEGIN(dst), ARRAY_SIZE(src));
  COPY_ARRAY(ARRAY_BEGIN(src), ARRAY_END(src), ARRAY_BEGIN(dst));

  return 0;
}
0978デフォルトの名無しさん2005/08/07(日) 22:59:13
そのARRAY_SIZE意味無いじゃん
0979デフォルトの名無しさん2005/08/07(日) 23:09:58
標準入出力から、入力と出力を同時に、うまくやる方法は無いでしょうか?
入力:
標準入力から入力待ちをする
出力:
他プロセスから標準出力へ。入力待ち中でも、同じところに出力される
ので、混ざってしまって表示が変。
この出力だけを別の行に表示するようには出来ないでしょうか?
0980デフォルトの名無しさん2005/08/07(日) 23:16:05
>>979
標準関数だけでやる方法は知らないが、環境依存の方法ならいくらでもやり方はある。
0981デフォルトの名無しさん2005/08/07(日) 23:21:33
>>979
窓(or term) を入力用、出力用に二つ開いてプロセス間通信使えば?
0982デフォルトの名無しさん2005/08/07(日) 23:27:16
>>980
今はLinuxのbashでやっていますが、どんな方法があるのか検索のヒント
なりないでしょうか?

>>981
二つの窓でやるのは考えてもいませんでした。
Linux関係の知識は全くないのですが、一つ目のプロセスから別窓で
プロセスを実行させる方法があるのでしょうか?
0983デフォルトの名無しさん2005/08/07(日) 23:28:44
>>982
適したスレへ行け
0984デフォルトの名無しさん2005/08/07(日) 23:30:03
>>982
あんまいい方法じゃないけど、入力の画面エコーを抑止して、自分の都合のいいタイミングでstderrかなんかに
そのまんま吐かせる方法とか。
0985デフォルトの名無しさん2005/08/07(日) 23:39:22
>>983
プロセス云々にするときはLinux関係のとこに行って来ます。

>>984
出来れば入力してる内容はリアルタイムで見られるようにしたいと思っ
ています。注文ばっかりですみません。
これはなかなか難しいのでしょうか……
0986デフォルトの名無しさん2005/08/07(日) 23:43:29
>>985
お前は標準Cにこだわってるのか?
0987デフォルトの名無しさん2005/08/07(日) 23:45:50
>>986
最近のCに標準的に用意されてるようなライブラリ関数なら全く抵抗はないです。
0988デフォルトの名無しさん2005/08/07(日) 23:48:50
標準でやるなら、ファイルを介したプロセス間通信かね。

>>982
2つの窓を開いて、一方では入力用のプログラムを手動
で起動、もう一方で出力用のプログラムを手動で起動。
そして二つのプログラム間で通信をさせる、というアイデア。

他方のプロセス起動まで自動でやるのはめんどくさいし、
やるとしてもそれは次の段階だろ。
0989デフォルトの名無しさん2005/08/07(日) 23:57:15
>>988
了解です、その方向で試してみます。
素早い反応ありがとうございました。
0990デフォルトの名無しさん2005/08/08(月) 00:04:48
Linuxなら出力側はわざわざプログラムしなくても tailコマンドとかで充分だな。
0991デフォルトの名無しさん2005/08/08(月) 00:18:12
どう見てもCの話題じゃないんだが・・・
0992デフォルトの名無しさん2005/08/08(月) 01:24:04
>972
## を使えば単純な generic programming はできるはず。
#define define_list(type) struct list_##type { struct list_##type *next; type value; }; \
void init_list_##type(struct list_##type*) { /* ... */ } /*... */
使う側では
define_define(int)
struct list_int hoge;
init_list_int(&hoge); みたいな感じで。
二重定義とか考えると declare と define に分けた方がいいと思うけど。

>975
Boost::Preprocessor 使えばかなり無茶なことをかなり無茶に実現可能かと。
ttp://www.boost.org/libs/preprocessor/doc/examples/linear_fib.c
フィボナッチ数列の計算してるみたい。
0993デフォルトの名無しさん2005/08/08(月) 01:32:50
次スレ立てたよー

C言語なら俺に聞け! Part 112
http://pc8.2ch.net/test/read.cgi/tech/1123432321/
0994デフォルトの名無しさん2005/08/08(月) 08:28:01
(゚д゚)ウメー
0995デフォルトの名無しさん2005/08/08(月) 08:30:30
(゚д゚)ウメー
0996デフォルトの名無しさん2005/08/08(月) 08:34:29
(゚д゚)ウメー
0997デフォルトの名無しさん2005/08/08(月) 08:40:54
(゚д゚)ウメー
0998デフォルトの名無しさん2005/08/08(月) 08:48:48
(゚д゚)ウメー
0999デフォルトの名無しさん2005/08/08(月) 08:56:32
(゚д゚)ウメー
1000デフォルトの名無しさん2005/08/08(月) 08:56:55
(゚д゚)ウメー
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。