C言語なら、俺に聞け! <27>

このエントリーをはてなブックマークに追加
C言語質問スレッド Part 26

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART4
http://pc.2ch.net/test/read.cgi/tech/1022961238/l50

・前スレ

<26> http://pc3.2ch.net/test/read.cgi/tech/1026048820/
<25> http://pc.2ch.net/test/read.cgi/tech/1024918442/
<24> http://pc.2ch.net/test/read.cgi/tech/1024033400/
<23> http://pc.2ch.net/test/read.cgi/tech/1023024817/

コンパイラなどのリンクは>>2-3 あたり
void日下部氏の激動の半生は過去スレを参照
2デフォルトの名無しさん:02/07/20 19:20
3デフォルトの名無しさん:02/07/20 19:21
今から考えると、僕の人生はvoidだった。
そう、何も作り出すことは出来なかった。
しかし、僕の中のstatic変数にはいろんな思い出がつまってる。
でももうダメだ。
いつの日からか発生したループは、スタックを食いつぶしながら
僕のメモリ領域をどんどん蝕んでいく。

もうダメだ・・・。

僕は決心して窓を開けた。

「このプログラムは不正な処理を行ったため・・・」
4デフォルトの名無しさん:02/07/20 19:22
乙ー
>>1おつ〜。ん〜いい感じやね。
6ていのー:02/07/20 19:28
セグメンテーション違反UZEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE!!!!!!!!!!!!!
むしろ>>3におつかれ。。。
namespace {
>>3; //翻訳単位に隔離しますた
}
9デフォルトの名無しさん:02/07/20 20:03
10デフォルトの名無しさん:02/07/20 20:04
>>3
auto変数の方が、後に何も残らなくてよいかと。
新スレオメオツ
C言語なら、俺に聞け! <27>

navi2ch ではこんな風に見えているのですが気のせいですか?
&lt;27&gt;

失敗。↑こんな風に。
く27ゝ

失敗。↑こんな風に。
16名無しさん@Vim%Chalice:02/07/20 23:06
Chalice なら問題なく表示されています。
>>13-15
済みません、意味がわかりません。
18デフォルトの名無しさん:02/07/21 03:12
>>1
ちょっと!あなた余計なことしないでよ!!
19デフォルトの名無しさん:02/07/21 03:13
>>18
むむっ。俺的には何の問題もないと思うが。
20デフォルトの名無しさん:02/07/21 03:14
>>19
>>18は同人板から来たんだ。
1000を踏んだ奴だけ新スレをつくる権利がある。
それを知らない厨房がたたかれてた。
21ピラコウ:02/07/21 03:24
コンパイラー使わしてくれるサイトってないの?
うっさい
>>21
CでCGIを組みたいのか?
26デフォルトの名無しさん:02/07/21 06:06
>>21
お前にはない。
27デフォルトの名無しさん:02/07/21 06:07
>>21
127..0.0.1
28デフォルトの名無しさん:02/07/21 06:20
>>27
ネタを噛んでしまうと、見ていてとても痛いのですが…
29デフォルトの名無しさん:02/07/21 09:47
>>21
どこか適当にハックしろ。
toktokかxreaは使わせてくれただろ。確か。
if( a(&num) == TRUE && b(num) == TRUE )

これって可能?
ちゃんと動作するかな?
>>31
TRUEの定義とその怪しげな関数たちによる。
a(&num),b(num)の順に実行されていくんですよね?
>>33
それは確実だったかと
35デフォルトの名無しさん:02/07/21 10:49
>>31
キモイ
36デフォルトの名無しさん:02/07/21 10:52
>>31
そんなソースは読みたくありません。
37デフォルトの名無しさん:02/07/21 11:29
ハノイの塔のプログラムが理解できん
助けてくれ〜
>>34
順序は合ってるけど、常に b() が実行されるとは限らない。
バビル2世を呼んで来い
>>39
ビッグファイア様ですな。
41デフォルトの名無しさん:02/07/21 11:47
>>37
君は無理
42デフォルトの名無しさん:02/07/21 11:48
>>39
バビル二世をよぶCのソースはどういうかんじですか?
>>39

extern void Babel_II();

int main()
{
 Babel_II();
 return 0;
}
44デフォルトの名無しさん:02/07/21 12:21
#include <stdio.h>
void hanoi(int n,int a,int b){
 int c = 6-a-b;
 if(n>1)hanoi(n-1,a,c);
printf("disk %d : %d -> %d\n",n,a,b);
 if(n>1)hanoi(n-1,c,b);
}

main(){
 hanoi(3, 1,2);
}
参考
ttp://web2.incl.ne.jp/yaoki/hanoi.htm
>>44
で、ロデムはどこに?
46デフォルトの名無しさん:02/07/21 12:35
>>45
変身してるから見つけにくいと思うよ。
歩性丼は?
>47
それは海鮮丼とは違うのか?
(゚Д゚)鰻丼ウマーカッタ
(゚*゚)梅干しスッパー
ポセイドンもある意味海の幸
{ ←ロプロス
こ こ は ネ タ ス レ で す か ?
は い  そ う で す 。
54デフォルトの名無しさん:02/07/21 19:17
とりあえず前スレより下にあるのはまずいだろ。
>51
(゚д゚)ウマー
ワラタ
56デフォルトの名無しさん:02/07/21 21:27
変数の内容が整数かどうか確認するにはどうすればいいか教えてくだされ。
is***** ってな感じで関数があるの?
>>56
int char long shortとそのunsignedは整数。
58デフォルトの名無しさん:02/07/21 21:34
>>56
なぜわざわざ確認する必要が?
>>58
Perl上がりなのでは?
6056:02/07/21 21:40
すみません、重要なところを書き忘れてました。
実数型変数の内容が整数かどうかを確認する方法です。
たとえば、3.1415と3.0000を振り分けるようなものがあるとありがたいんですが。
>>60
無い。 %すれば?
if (val == (int)val)
63デフォルトの名無しさん:02/07/21 21:44
>>61
あるでしょ。
>>63
あったか?
if( num == ((double)((int)num)) )
とかダメかな?。。。ダメか。
>>65
つぅか比較ってできたっけ過?
6760:02/07/21 21:49
>66
いや、intにキャストしたら、小数点以下捨てられるから、それをdoubleに戻して。。。
最適化とかされるとマズいけど
6865:02/07/21 21:50
あ。。。67は65の間違いです。ゴメンナサイ
69デフォルトの名無しさん:02/07/21 21:50
>>64
小数部だけ取り出す関数とかあるじゃん。
7062:02/07/21 21:50
(*´д`) 漏れのは議論の余地無しってこと?
7165:02/07/21 21:53
>62
やってることは一緒ですね。でも、警告でるかも?大丈夫かな?
>>69
さっさと関数名挙げな。
>>60
(val<ceil(val+0.5)+ε)&&(val>ceil(val+0.5)-ε)
>>73
何言語よ?
7556:02/07/21 22:00
>>62さん、>>65さん
ありがとうございます、どちらの方法でも期待した結果が得られました。
ちなみにMS-Cです(警告が出るかもとのことでしたので…)。
7665:02/07/21 22:01
>62
あ、大丈夫でした。アセンブリ見てみたけど何やってるかわかりません。
以下
int foo(double a) { return a == (int)a; }
を gcc -O2 -Wall -S foo.c でコンパイルしたもの。
誰か解読して!
_foo:
    pushl %ebp
    movl %esp,%ebp
    subl $24,%esp
    fldl 8(%ebp)
    fnstcw -2(%ebp)
    movw -2(%ebp),%dx
    orw $3072,%dx
    movw %dx,-4(%ebp)
    fldcw -4(%ebp)
    fistl -8(%ebp)
    movl -8(%ebp),%eax
    fldcw -2(%ebp)
    movl %eax,-8(%ebp)
    fildl -8(%ebp)
    fucompp
    fnstsw %ax
    andb $69,%ah
    cmpb $64,%ah
    sete %al
    movzbl %al,%eax
    movl %ebp,%esp
    popl %ebp
    ret
なんで、こんな複雑になるんだろ?(アセンブラスレ逝けっていわれそうw)
>>76
オペランドの意味わかれば猿でもわかるだろ。
7865:02/07/21 22:05
>77
キャストするアセンブリ(機械語)命令って無いみたいですね(あたりまえ?)。
アセンブリ言語は浮動小数点数つかったことないのでサッパリです。
>>74
εは適当な誤差精度の意

ていうか有理数を実装したほうがよい
typedef struct { int nume, int deno } rational ;
>>75 遅レスですが
double x,temp;
x=3.141592;
if(modf(x,&temp)==0)...
8165:02/07/21 22:11
>80
そんな関数あったんだ。。。用意されてるならそれ使ったほうがよさそう
。。。てか、勉強不足。。。鬱氏
82デフォルトの名無しさん:02/07/21 22:12
>>72
土下座したら、教えてやるよ。
>>82
煽りはスピードが命。
もう終わってたか…
8580:02/07/21 22:20
蛇足ですが、単純に小数点以下の数値が0か非0かを
調べたい場合は、if(x == (double)(int)x) の方が速いです。
また、0か非0かではなく、73氏のようにイプシロン以下であるか
判定するのであれば、
if( fabs(fmod(x,&temp)) < e)...
になるでしょう。
>>85
>if(x == (double)(int)x)
は、xがintの範囲外の時おかしくなりません?
8773==79:02/07/21 22:24
相手にされなかった…
っていうかいいのかそれで?
0.1を十回足しても1にはならんのだぞ
>>87
実際引っかからんしな。
8980:02/07/21 22:34
>>86
スマソ、見落とし。
60での前提により、せいぜい int の範囲内と思いこんでました。
9065:02/07/21 22:35
>86
そんなでっかい値だったら、そもそも小数点以下まで保持されてないんじゃない?
>>90
だから、小数点以下はゼロと判定されるようでないとまずい
わけです。
9265:02/07/21 22:38
あ、手元の資料によるとdoubleの仮数部は52ビット。
32ビットマシンだとlong使わないとダメか。謝罪m(__)m
9365:02/07/21 22:48
えーと、だから、doubleに
11111....111(1が54個。2進数表現で)
という数字を入れようとしても
11111....11(1が53個)×2 = 11111....110
という値に丸められてしまうということです。
つまり、doubleだからといって必ずしも小数点以下まで保持されてるわけじゃないですよね?
>>87
浮動小数点数でも整数を表すときは
誤差は生まれないと思うんだけど、どうなんだろう。

if (x == (int)x)

は、xが整数で有効桁数内に収まっていれば必ず成立するんじゃないかと。
そもそも誤差って、小数点以下を2^-1, 2^-2, ... で表すから生まれるんだよね?
誰か詳しく知ってる人がいたら教えてください。
>>94
有効桁数におさまるなら当然誤差はない

int i;double sum=0;
for(i=0;i<10;i++)sum+=0.1;
ならばおそらくsum!=1というような話
>>95
誤差は無いですか。
ありがとうございます。
誤差はないといっても非常に近い実数とそれを区別する方法はないけどね
98デフォルトの名無しさん:02/07/21 23:52
固定小数で以下略
99 :02/07/22 00:52
>>98
固定小数でどうすれば誤差がなくなるのですか?
10進数の0.1を、16進で表すと、0.199999...になる。
(0.1 = 1/16+9/256+9/4096+9/65536...)
そのため、浮動小数点では、0.1を近似値としてしか表現できない。
固定少数点は、小数部に必要な桁数だけ下駄をはかせて、
整数であるかのように扱うため、上記の誤差は発生しない。

しかし、一般的に誤差といっても、浮動小数点形式に固有の誤差、
乗除算に伴う誤差、加減算に伴う誤差など多々あるので、
固定小数点を使えばすべての誤差がなくなるわけではない。
101デフォルトの名無しさん:02/07/22 01:34
fflushがいまいちよくわかりません。
何かfflushの効果を一目で確認できるようなサンプルプログラムはありませんか?
102 :02/07/22 01:45
>>101
main()
{
 FILE *fp = fopen("xxx", "w");
 fprintf(fp, "xxx");
 fflush(fp);
 *(char *)0 = 0;
}
>>100
おかしいぞ
>>100
オレもおかしいと思う。
>101
これでどう?
fflushなし
#include <stdio.h>
int main(void) {
  printf( "Hello, World!" );
  sleep( 5 );
  return 0;
}

fflushあり
#include <stdio.h>
int main(void) {
  printf( "Hello, World!" );
  fflush( stdout );
  sleep( 5 );
  return 0;
}
>100
ワタシもおかしいと思いますわ
つーか浮動小数点誤差についてうんぬんいうまえに情報処理技術者試験の勉強をして下さい。
>>102
いくらなんでも例外で落とすのは(w

#include <stdio.h>
int main(int argc, char * argv[])
{
FILE *pf = fopen("tmp", "w");
fprintf(pf, "abc");
getchar(); /* ここで^Cをおすとfflushされないで終了する */
fflush(pf);
return 0;
}


^Cしたとき(実行を中断してfflushしなかったとき)と
enterをおしたとき(fflushして正常終了したとき)とでtmpの中身を比べてみよう。
abortすれ
>>110
始めはabortでいいんじゃないかと思った。けど、手元のabort(3)では、

>DESCRIPTION
>   The abort() function causes abnormal program termination to occur, unless
>   the signal SIGABRT is being caught and the signal handler does not
>   return.
>
>   Any open streams are flushed and closed.

てなってる。最後の行ね。
質問です。
値の連続入力するときに入力するたびに画面のクリアをしたいんですが
そういった関数ってあるんですか?あったら教えてください。お願いします。

OSはWindows2000でコンパイラはVisual C++です。
>>112
意味がいまいちわからんな。
Editダイアログに文字が入力された時に飛んでくるメッセージを
捕まえればいいだろ。
>>112
コンソールアプリケーションなら、エスケープシーケンスを使ってみるとか。
115112:02/07/22 15:20
>>113
すいません、書き方が悪かったですね。

while(1){

printf("データ入力せよ");
scanf("%d",&a);
}
と書くと

実行時に

データを入力せよ 1
データを入力せよ 2
データを入力せよ 3
データを入力せよ 4

こうなるじゃないですか?
これをひとつ入力するたびに画面をクリアしたいんです。
それと、エスケープシーケンスはだめでした。

これで意味通じたでしょうか?

お願いします。
cls
>>115
ない。
改行25回でもしとくよろし
systemコールでclsでも呼ぶ。
119115:02/07/22 16:05
>>116
>>118
ありがとうございました解決しました。
120101:02/07/22 17:02
みなさんありがとうございました。
おかげでfflushの効果が分かりました。出力バッファについてもきちんと理解できた気がします(setvbufの効果も確認できました)。

setvbufで_IONBFに設定されている時はバッファリングしない(すぐに書き込まれる)から、そのストリームに対してはfflushする必要性が生じることはないんですよね?
>115
printf("\rデータ入力せよ");
scanf("%d",&a);;
>>120
_IONBFに関してはそのとおり。
ただし、性能が著しく落ちるのでバッファリングしないことは、普通はやらない。
たくさん出力するプログラムを作ってバッファリングしたときと
しなかったときとの差を比べてみるとよいと思うよ。
123デフォルトの名無しさん:02/07/22 19:26
stddef.hって標準ヘッダーですよね?
私が借りているサーバー(OSはLinux)には入っていないんですけど・・・
もちろんstdio.hやstring.hなどはあります。
>>123
/usr/includeの中を調べたんだと思うけど、Linuxではgcc自身が提供する
ヘッダファイルが別ディレクトリに置いてあるみたい。
Vine Linux2.5では/usr/lib/gcc-lib/i386-redhat-linux/2.95.3/include/
にstddef.hがあった。

#includeのサーチパスには上の二つのディレクトリが両方とも含まれるので、
#include <stddef.h>は問題なく通るよ。
125デフォルトの名無しさん:02/07/22 20:40
>>124
なるほど。そういうことでしたか。ありがとうございます。

> /usr/includeの中を調べたんだと思うけど
まさにそうです。他のディレクトリにあるとは思わなかったので・・・
> Linuxではgcc自身が提供する
ということは他のはgccが提供しているわけじゃないのか・・・OS自信が提供しているのかな。
126デフォルトの名無しさん:02/07/22 20:44
fopenとopenの動作的な違いを教えてください
127デフォルトの名無しさん:02/07/22 20:46
>>126
「動作的な」と言いますと?
>>126
fopenはファイルポインタを返すが、(POSIXの)openはファイルディスクリプタを返す。
129デフォルトの名無しさん:02/07/22 20:52
>>127さん
すみませんUNIXのシステムコールの違いを評価するために
openとfopenで同じファイルを開いてread,fscanfで読み込み
closeとfloseで閉じる一連の動作に掛かる時間を比較しました
その結果ファイル容量が大きくなればなるほど
fopenは時間がかかるのですが
openは依存しないようです
この違いが何故なのか知りたいので「動作的な」と
表記してしまいました

>>128さん
すみませんファイルディスクリプタって何ですか?
>>129
readとfscanfじゃなくて、readとfreadで比べろよ。

> ファイルディスクリプタって何ですか?
そのプロセス内でストリームにつけられた番号みたいなもの。
fopenも内部的にはopenを使っているよね?
open -> fdopenみたいな感じで。
132126:02/07/22 21:03
>>130さん
わかりますた。
あとは何とかがんばってみます
ありがとうございました
133デフォルトの名無しさん:02/07/22 21:41
>>129
システムコールの違い?
open はシステムコールだけど
fopen はライブラリ関数なのではないかしら。
134デフォルトの名無しさん:02/07/22 22:15
C言語のアプリ(Windows版)で一定期間を過ぎたら起動しないように
したいのですが、どのようにレジストリを追加したらいいのでしょうか?

また、インストール時にシリアルを入力しないと先に進めないように認証
するには、どうするのでしょうか?

参考になる、URL等ご存知でしたらお願いします。
>>134
まさかその程度のことも自力で解決できずに
金を取ろうとしてるとか(呆)

しかもスレ違い。それはCの話題じゃなくてWindowsの話題だ。
ゴキブリを一匹見たら三十匹居ると思えというように、
>>134みたいなのが少なくとも30人はいるんだろうな。
>>135
>それはCの話題じゃなくてWindowsの話題だ
これも違うだろw

>>134
正直、才能無い。
別の趣味なり仕事なり探した方が人生充実すると思う。
>>134
Winのレジストリの話ならこの辺り。
http://pc3.2ch.net/test/read.cgi/tech/1023361418/l50
キーワードをググルでひいてみる。
http://www.google.com/search?hl=ja&ie=Shift_JIS&q=%83V%83F%83A%83E%83F%83A+%88%EA%92%E8%8A%FA%8A%D4+%83%8C%83W%83X%83g%83%8A&lr=
目的のページにたどり着けるかは分からぬが。
140デフォルトの名無しさん:02/07/22 23:40
C言語の入門書には
ほーら簡単でしょみたいにMS-DOSに"hello world"と表示させているのに
ボクだけどうしても"hello world"ができませんもう死にたいです
Cコンパイラのインストールの仕方や動かし方がよくわかりません
>>140
それぐらいで死にたいと思ったら人生生きていけませんよ.
まずはCコンパイラのインストールに命を懸けてみよう>>140
>>134
ぴったりなのがあった。いずれにせよ思いついたように作ればいい。
http://www.asahi-net.or.jp/~GV4J-SGUR/narik/susucyu.htm
そこにあったサンプルプログラム
http://www.asahi-net.or.jp/~GV4J-SGUR/narik/compo.htm#TrialCheck

>>135
ベータテストかもしれんだろ
>>136
お前のように口だけの奴が少なくとも30人はいるんだろうな
>>137
別の趣味なり仕事なり探した方が人生充実すると思う。
>>143
ふぅん。
>>143
自分で物考えられない奴がプログラムやっても伸びんだろ。
146デフォルトの名無しさん:02/07/23 01:10
変数を2進数で表示するにはどうすれば言いの?
>>146
コード書いてね。
148デフォルトの名無しさん:02/07/23 01:15
>>147
普通に、int型を画面に二進数で表示する方法がしりたいです
>>146
&演算子とシフト演算子を使う。
>>149
俺、原始的に2で割っていくな・・・。
itoa(i,buf,2);
>>151
昔と仕様変わった?その関数。
昔の仕様ってなんだ?
(value, string, radix)じゃないの?
154デフォルトの名無しさん:02/07/23 01:23
>>151
いけました、ありがトン
155デフォルトの名無しさん:02/07/23 01:24
int i;
char buf[20];

     for(i=0;;i++){
itoa(i,buf,2);
printf("%s\n",buf);
      }
buf[20]はまずいだろ
char* buf;
for(i=0;;i++) {
 buf = malloc((int)(log(i)/log(10))+1);
 itoa(i,buf,2);
 printf("%s\n",buf);
 free(buf);
}
s/malloc((int)(log(i)/log(10))+1)/calloc((int)(log(i)/log(10))+2,1)/
>>156
これくらいのことでmalloc使うな
buf[20]はすぐにオーバーフローしちゃうが
>>159
fuyasebaiidaro
161デフォルトの名無しさん:02/07/23 01:49
32ビット想定で[33]だな
あと0をつめるのとかどうすれば・・・
buf[CHAR_BIT*sizeof(long)+1]
>>161
signedでやってもまともな答え出る?
>>163
何を言いたいのかわからんが、32bitなら32桁を越えることはないだろ。
165デフォルトの名無しさん:02/07/23 01:53
>>163
言いたいことはわかるが・・・
char buf[33] = {};
atoi(i,buf,2);
167デフォルトの名無しさん:02/07/23 01:53
atoi
>>156 をいかにも初心者がやりがちな
頭でっかちなコーディングだと笑ったら
まずいですか?
>>168
まずい
170デフォルトの名無しさん:02/07/23 01:59
itoaってVC++のみ?BCBにもある?
あるよ
>>171
そっか。
2〜36進数まで扱えるstrtolの逆みたいな関数を標準関数にしてくれればよかったのに。
173デフォルトの名無しさん:02/07/23 05:04
FILE *outfile;
outfile = fopen(〜〜〜);
・・・
if (baff != 'ここを数字ならば,としたい' ) putc(baff, outfile);
上記のように,
if ( baff != '0' ) putc(baff, outfile);
とすれば,baffが0以外だった場合にputするのはわかるんですが,
これが,0〜9の数字以外なら.としたいのですが,どのようにすればよいでしょうか?
また,正規表現(\d や[0-9]といったやつ)は使えないのでしょうか?
baff・・・・

正規表現は使えない。
char *nstr="0123456789";
if(!strchr(nstr,baff))とでもして。
175174:02/07/23 05:09
string.hをインクルードしてネ
176デフォルトの名無しさん:02/07/23 05:16
forってなんですか?
177 :02/07/23 05:19
int (*n)[3];

n=(int(*)[3])calloc(5*3,sizeof(int));

free(n);

free後のnって,(*n)[3]の状態に戻っているの?
178 :02/07/23 05:21
>>176
forは
for(i=0;i<5;i++)
 printf("i=%d\n",i);
とやると同じことを5回繰り返す
(`_ゝ´)フォォー
180デフォルトの名無しさん:02/07/23 05:24
whileが正統でforは異端だと聞いたのですが、本当ですか?
int (*n)[3];

n=(int(*)[3])calloc(5*3,sizeof(int));

free(n);

free後のnって,(*n)[3]の状態に戻っているの?
>>174
ふつーisdigit()使わんか?
>>181
%pを使って表示してみそ。
>>182
そうだごめん(汗

>>173
isdigitを使って。0-7とかだったら>>174
>>180
私は聞いたことがありません。
個人的にはC言語のforは自由度があり過ぎるとは思っていますが。
>>185
でも、Perl使いとかみたいに妙な使い方を追い求めたりはしてないな。
>>183
それで、どーゆーことがわかるんでしょうか??
188183:02/07/23 07:41
>>187
printf("%p", n);
とすればポインタ n の値を表示してくれる。
callocとfreeの前後に入れてみれば、nの値の変化がわかる。

(*n)[3]の状態ってぇのがよくわからないんで、
当てずっぽうに答えただけ。
189185:02/07/23 07:44
>>186
意図不明。
私はPerlわからないんで更に不明。
190185:02/07/23 08:34
>>186
あ、ごめんなんとなくわかった。
>>188
free(n); しても、nの値が変わるかどうかはわからないでしょ。nの指す
ヒープ領域は解放されるでしょうけど。
192187:02/07/23 09:24
>>188
なるほど、さんきゅ。
193デフォルトの名無しさん:02/07/23 09:29
>>181
状態って、何?
194183:02/07/23 09:40
>>191
変わるかどうかわからないなら、試して表示してみればいいのでは?
 
>>195
田部はfjに帰れ。
fjにもこないで欲しいよ。
あのおっさん。
>>191
nが変わるわけは無いじゃん。
ポインタ自体はコピー渡しされてるんだから
>>198
う゛ぁか、せっかく自分で調べさせようとゆうどうしてるのに
200デフォルトの名無しさん:02/07/23 14:09
structのなかで関数を定義しそれを使いたいのですがどうすればいいですか?
typedef struct{
int i;
void show(char n); これはなぜつかえないのか
}Myclass;
main()
{
Myclass x;
x.show;
}
みたいな感じでつかいたいのですが・・・無理ですか?
>>200
そろそろC++を使う時期だね

どうしてもというなら関数ポインタにすれば?
>>200
> structのなかで関数を定義しそれを使いたいのですがどうすればいいですか?
Cでは無理です。
ただし、関数へのポインタを使用することはできます。
もちろんポインタなので使用する前に何かの関数を設定しておく必要があります。

typedef struct{
  int i;
  void (*func)(char n); これはなぜつかえないのか
}Myclass;

int main(void)
{
  Myclass x;
  char c = '?';
  x.showp = show;  // void show(char); へのポインタを設定
  x.showp(c);    // 設定された関数の呼び出し
  retrun 0;
}
203デフォルトの名無しさん:02/07/23 14:20
そうですか・・・わかりました。あと二次配列を関数に渡すとき
int calc(int *x[]);
main()
{
int z;
int a[2][2] = {{1,2},{3,4}};
z = calc(a);
}
これでやった場合calc(a)がうまくいかない(aの二次配列がうまくわたせない)
のですがどうしたらいいですか?
charの場合の2次配列はうまくいくのですが・・・
int calc(int (*x)[2]);
int calc(int x[][2]);
int calc(int x[2][2]);
どれでも同等。配列の要素数は必要。
それから"int *x[]"だとint*を保持する配列になるはず
205デフォルトの名無しさん:02/07/23 14:38
ありがとうございます。たすかりました。
/*
*/
#if 0
#endif
210デフォルトの名無しさん:02/07/23 18:49
やっぱりC++の方が便利なのか。
211デフォルトの名無しさん:02/07/23 19:06
Cでオブジェクト指向は無理ですか?
212デフォルトの名無しさん:02/07/23 19:09
>211
メモリをケチらざるを得ない状況で無い限りC++に移行したほうがメリット多いかと
>201
関数ポインタでがんがれ!
でもCでクラスの実装は無謀だよ、と予め逝っておくテスト。
214デフォルトの名無しさん:02/07/23 20:33
>>213
publicとprivateはexternとstaticで真似できる?クラスごとにファイルを作成しないといけないけど・・・
215214:02/07/23 20:34
でも広域変数になっちゃうか・・・
staticじゃ複数のインスタンスが作れないじゃん
うるせーばか
むむ。externとかstaticって関数の可視性のことだと思ってたけど。
変数なの?

大域変数はクラス変数になると思ったけど。
>>218
変数にも使えるけど・・・・
>>218
/* 関数外 */
static int i; /* このファイルのみ */
int i; /* 他のファイルからも */
extern int i; /* いずれかのファイルで宣言されているものを参照 */
221218:02/07/23 23:23
>>220
無論わかってる。短すぎたな。こんなことを考えてるのかなあということ。
---myclass.h
typedef struct _myclass MyClass;
struct _myclass {
  MyClass *(* set)(MyClass *this, char *str);
  MyClass *(* display)(MyClass *this);
  void (* destroy)(MyClass *this);
  char *str;
};
MyClass *MyClassNew(void);
---myclass.c
#include <stdio.h>
#include <stdlib.h>
#include "myclass.h"
static int count_instance = 0;  /* クラス変数、ただしプライベート */
static MyClass *set(MyClass *this, char *str)
{
  this->str = str;
  return this;
}
static MyClass *display(MyClass *this)
{
  if (this->str) {
    puts(this->str);
  }
  return this;
}
void destroy(MyClass *this)
{
  count_instance--;
  free(this);
}
MyClass *MyClassNew(void)
{
  MyClass *instance = malloc(sizeof(MyClass));

  if (!instance) {
    return NULL;
  }
  count_instance++;
  instance->set = set;
  instance->display = display;
  instance->destroy = destroy;
  instance->str = NULL;
  return instance;
}
222218:02/07/23 23:28
---使い方
#include "myclass.h"
int main(int argc, char * argv[])
{
  MyClass *c;

  c = MyClassNew();
  if (!c) {
    return 3;
  }
  c->set(c, "氏ね");
  c->display(c);
  c->destroy(c);
  return 0;
}
---

要するにCで無理やりクラスっぽいことをやらせようということで、
大域変数をstaticにするってのは、count_instanceみたいにクラス変数的な
使い方を想定してるってことなのかなあ、なんて考えてた。

にしても、C++ならthisポインタを暗黙のうちに渡してくれるのに、
Cだと明示的に自分自身を渡してやらなければならないから、
やっぱC++使ったほうがいいかもね。少なくともこの点は楽できる。
223デフォルトの名無しさん:02/07/23 23:36
>>222
漏れもCで暮らすとか創ってみたことあったけど、
どうしてもthisが自前になってしまってかっこわるいのであきらめた。
CはCらしくが一番
自然が一番
225デフォルトの名無しさん:02/07/23 23:47
無理しないのが一番。
226218:02/07/23 23:59
>>223
うん、かっこ悪いんだよね。

さすがに構造体に関数へのポインタ埋め込むことはやったことないけど、
構造体の実体を隠して全部関数でやり取りさせるってライブラリは何度も作ったことある。
オブジェクト指向にかぶれたばかりのときにね、やってみた(w

stdioのFILE*をやり取りする関数群はそういう作りだということに後で気づいた(w

あ、ちなみに>>221-222はコンパイルできて実行できることをgccで確認してある(w
>>226
FILEはオブジェクト指向だね。
228デフォルトの名無しさん:02/07/24 00:04
確実に一つしか作られないクラスなら(藁

static MyClass *this;

とかでもいいんだけど、あんま意味ないし。
それじゃ、インスタンスが1こしか…
>>229
Singltonか。

C で は デ ザ イ ン パ タ ー ン も 思 い の ま ま で す 。
libjpegのソースがけっこう面白いYO
(Cでオブジェクト指向)
>>231
どこにあるん?
www.ijg.org
234デフォルトの名無しさん:02/07/24 12:05
a.c
------
static charfoo[1000] = "HOEHOE";





b.c
------
extern char foo[1000];



そしてソース内部の色々な個所で参照


コンパイルして出来たオブジェクトをリンクさせる。→Warning発生


開発者 「ワーニングが出ることもあるが、プログラムとしては何の問題もない」



俺の今まで学んできたC言語では、a.cでstatic宣言している以上、他のモジュールからは
参照できないはずなんだが、開発者は「これでテストもした、正常に動作している」と
言い張る。

さて、間違っているのはどっち?
ウォーニング
>234
a.c の static char foo[] は実は参照されていないという罠。
> static charfoo[1000] = "HOEHOE";
え、コンパイルエラーにならない?
charfoo
239234:02/07/24 12:41
>>237
ならない。ワーニングになる。何故ならんのかわからんが。

>>236
だよな。一瞬俺の記憶が狂ってるのかと思ったのだよ
240234:02/07/24 12:59
ついでにもひとつ質問


グローバル宣言で

extern int inted;
extern int wnted;




int inted;

と記述した場合、コンパイラはどう解釈するんだ?
これもエラーが出ないらしい。ワーニングさえ。問題ないってことか・・・?
241234:02/07/24 13:06
↑は
 ・ppp.hというヘッダでextern宣言されている
 ・ppp.cで実体宣言されている
 ・ppp.cで最初にppp.hをインクルードしているため、展開後の解釈が↑のようになる

という意味です。
242デフォルトの名無しさん:02/07/24 13:25
コンパイラを手に入れたいのですが
ここ→http://gcc.gnu.org/からどうやって手に入れるのか
英語ちゃんができなくて分かりません
どうか教えて下さい
>>240
特に問題はないと思うが?
もしかしてwntedが宣言だけされていて定義されていないことか?

wntedがプログラム中に使用されていなければ、エラーにはならない。
使用されていればエラーになる。
>英語ちゃんができなくて分かりません
英語の前に日本語を勉強しろ。
あと、英語がわからないなら、日本製だけ使っとけ。
>>242
少なくともOSくらいは書こうよ。
246242:02/07/24 13:48
すいません
OSはwindows98SEを使ってます
それと英語ができなくてもつかえる日本製というのがあれば
教えていただけますか
247とし:02/07/24 13:50
しぬ?
>>246
コンピュータ英語出来ないのはプログラマとして致命的。

ああ、日本語LOGOとかめじろとかは国産だ。
>>246
Borland C++でも使え。入手方法からインストール方法まで書かれている。
http://homepage1.nifty.com/tyuuki/old/cc/bcc_install.html

gccの場合、コンパイルエラーなどのエラーメッセージは全て英語だ。
英語ができない奴に使いこなすことは難しいだろう。
>>249
> gccの場合、コンパイルエラーなどのエラーメッセージは全て英語だ。

いつの時代の話だ?gcc 3.1 は日本語がうざすぎるくらいだが。
>>237
なる。型名もしくは配列名が指定されていない。
俺の使っている2.9xは英語だが。
>>250
> いつの時代の話だ?
では、Cで可変長配列が使えないことも「いつの時代の話だ?」
と煽っていいんですね?
>>253
語尾に:)がついていない。8点減点。
255240-241:02/07/24 14:23
>>243
ん、問題なかったっけ。さんくす。
問題定義しているのは、

・externで外部参照宣言した後に、実体を宣言しても問題ないのか

ということね
256デフォルトの名無しさん:02/07/24 14:28
>>255
外部参照宣言はどこかのファイルに存在するものを参照する。そのどこかには自らのファイルも含まれる。
257256:02/07/24 14:29
s/参照する/参照することを宣言する/
>>253
でもそれってブロックの最初でしか・・・。
>>234
> static charfoo[1000] = "HOEHOE";

コンパイルしたら、エラーになったよ。

a.c:3: invalid initializer

まぁこれはミスなんだろうが…

実は更にc.cというファイルがあって、そこに実体があるという罠。
それでもwarningがでるのはおかしいけど…
これ以上はwarningを貼ってもらうしかないね。
260242:02/07/24 14:59
>>249
ありがとうございます
チャレンジしてみます
261デフォルトの名無しさん:02/07/24 15:03
くだらないことですいません。C言語っていくらですか?
262デフォルトの名無しさん:02/07/24 15:03
>>261
\0,000-
>>261
社会・世評
http://natto.2ch.net/soc/

が詳しい。
>>261 void流煽り
> C言語っていくらですか?

いいえ、いくらではありません。:)
>>259
恐ろしいことに、昔のCとの互換性のために「型を省略したらint」が
適用されてしまって、static charfoo は static int charfoo と同じ
意味になってしまう。

invalid initializerになるのは、型が書いてないからじゃなくて、
intの変数を文字列で初期化しようとしたから。だから、
static charfoo[1000];
これはエラーにならなかったりする(warningくらいは出るが)。
もっと極端な話、
foo;
これだけでもint foo;と解釈されてエラーにならないんだよね。
266251:02/07/24 15:12
>>265
ああそうだった。longがlong intと見なされると同じだね。
foo;
これだけでもint foo;と解釈されてエラーにならないんだよね。

これはウソ
>>267
gccではエラーにならないんだけど、コンパイラによるのかも。
const/static等を付けた場合のみ暗黙でintになるんじゃないの?
gcc2.9.4/gcc3.1/vc6/bcc5.5.1で通らなかったよ
関数の中だと式文と解釈されてしまってだめだね。
関数の外なら行けますた。

% cc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
% cat foo.c
foo;
% cc -c foo.c
foo.c:1: warning: data definition has no type or storage class
% nm foo.o
00000004 C foo
00000000 t gcc2_compiled.
%
271タイピング初心者:02/07/24 17:24
Cでタイピングソフトを作ろうと思うんですけど、
どっかにお手本になるソースファイルはありませんか?
いろいろ探したんですけど、なかなか見つからなくて・・・
それくらい考えてみろよ
>>271
考える力のないものは再開発しかできないのか?
>>271
どんな環境でも使えるものを作るのは、Cだけでは大変だよ。
>>274
標準入出力が使えればそれが使える環境ではまぁ使えるか。
>>275
リターンキー押すまで入力されないタイピングソフトとかはつらかろう
>>276
一文字ずつ取得すればよかろう。
>>277
どうやって?
Cの標準関数ではできないよ。
んなもん
Java中間コードを出力するCコンパイラを作れば解決

Javaを使えというまっとうな意見は却下
>262
そうか?ANSIとかJISとか行って、
「Cの規格表ください」って言っても、
ロハではもらえないとおもうぞ。
C言語はロハ
規格書は有料
漏れも規格は有料だと思ってたけど、 JISは無料で閲覧できるように
なってるみたい。

http://www.jisc.go.jp/
ここからデータベース→JISとたどっていって規格番号を指定すれば、
PDFで見ることができる。ちなみにC言語はJIS X3010だ。
>>282
死ぬほど遅いんだけど...
PDFをダウンロードするのはマズイのかなぁ。
そうかな? サイトが重いとかそういうことはないみたいだけど。
ファイルはそれなりにでかいですよ。X3010は13MBくらい。
つまらんことなんだが、このスレ参考になるなぁ・・・と思ってる俺は知識不足?
>>284
ファイルgetした(w
やっちゃまずいんだろうけども、トラフィック浪費しちゃまずいと思ってさ。
287専門学校1年生:02/07/24 20:36
10進→16進変換のプログラムなんですが、うまく結果が表示されません。
変な記号がまじります。
添削お願いできませんでしょうか。

#include<stdio.h>

void main()
{
char code[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

char hex[4];
int i,data;

for(i=0;i<4;i++)
hex[i]='0';
printf("データ入力:");
scanf("%d",&data);

for(i=0;data>=16;i++){
hex[i]=code[data%16];
data/=16;
}
hex[i]=data;
for(i=3;i>=0;i--)
printf("%c",hex[i]);
}
宿題?
>>287
俺は天才なので教える。

printf("%x",data);
>>287
後ろから4行目
> hex[i]=data;
hex[i]=code[data%16];
>>290
素敵
292専門学校1年生:02/07/24 21:01
>>288
宿題です。

>>289
すみません。そこの部分はプリントではデフォルト部分で・・
出題部分ではないのでかえられませんのです。

>>290
出来ました!♪
ありがとうございました(涙)
また教えてくださいませ。

293専門学校1年生:02/07/24 21:01
sage忘れすいません。
294デフォルトの名無しさん:02/07/24 21:06
 
295284:02/07/24 21:14
書いた後で思ったけど、13MBっていまどきなら別にでかくないか。
>>286
IEだとダウンロードしながら表示できたと思ったけど、Linux上でMozillaだと
全部ダウンロードしてからAcrobatReaderが起動するんで、結局ファイルgetと
同じになっちゃうんだけど(w

いちおー、
http://www.jisc.go.jp/jis-act/reading.html
によると「入手」は有料で購入、「閲覧」はご自由にという感じなんで
(その二つの差に意味があるのかという話はさておき)、それなりに節度を守って
利用しましょということで。
>>295
WindowsのNetscapeCommunicator4.78でみたらTEMPフォルダに残っていた。
297専門学校1年生:02/07/24 21:49
またきました。
文字列のmojiaの12文字をmojibにコピーする作業なんですが、
またしても壁にぶつかっております。
おねがいします。

#include<stdio.h>

void main()
{
char mojia[]="syunka syuutou haru itiban";
char mojib[13];
int i;

for(i=0;i<12;i++);
mojib[i]=mojia[i]; /*←これでは代入されてませんか?*/
mojib[12]='\0';
printf("コピーされた文字列は%sです。\n",mojib);
printf("%c\n",mojib[1]);
}
298ほらよ:02/07/24 21:56
for(i=0;i<=12;i++)
memcpy(mojib+i,mojia[i],1);
for文の末尾をよーく見てみなされ。
あと、宿題は別スレがあるのでそっちの方を推奨しとく。

宿題とか手伝えます
http://pc3.2ch.net/test/read.cgi/tech/1026138039/
300298:02/07/24 21:58
for(i=0;i<12;i++)
に訂正
>>295
あああ。Mozilla使えばよかったのか。
IEで見てみたら変な小細工がしてあったんで、
ソース読んでこっちもいろいろ変な小細工してgetしちゃったよ。
302専門学校1年生:02/07/24 22:08
恥ずかしい!(>_<;

出直してきます。

ありがとうございました。
>>282
フォントが腐ってて見れたもんじゃない
IE(5.5)でも小細工するまでもなくGetできるじゃん・・・・
でも、これってわざと画質落としているのかな?
それとも印刷物をスキャナーにとおしたのか?
有料で購入した物がこのレベルならマジシャレにならないな・・・・・
305デフォルトの名無しさん:02/07/25 01:21
DOS7.0からMS-CでTCP/IP通信やりたいのです。
VC++やUNIXでなら、Winsockや標準のソケット関
数使って組んだことあるのですが、DOSは初めて
です。MS-Cってソケット関数あるんでしょうか?
MSのLANMANとか入れると使えるようになるとか
なのでしょうか? 厨な質問ですみません。
IBMのWebBoyだっけ?
それくらい自分でつくれ
>>304
売ってる規格票はさすがにちゃんとした印刷になってるよ。
スキャンする際にかなり画質を落としてるんじゃないかな。
309305:02/07/25 07:46
>> 306
あとPC/TCPとかパッケージはいくつか知っているのですが、それらを使わずに
何とかしてみたいのです。市販されているってことは(売り物になっていると
いうことは)やはり技術的に難しいのですかね・・・。(T_T)
まずは、ブルーブック読む。
311sx:02/07/25 11:38
データのバイト数を調べるプログラムってどうかきますか?
どんなデータ?
313sx:02/07/25 11:41
追加です
データを標準入力から読み込むプログラムと
データをコマンドラインから読み込むプログラムはどう書きますか?
コマンドラインから読み込む程度の量のデータのバイト数を調べるの?
>>313
本買って読めよ…
316デフォルトの名無しさん:02/07/25 13:31
C言語で、スクリーンセイバーを作れといわれました、
当方VB・ASP・JAVAしかやったことがありません。
参考になるページか本ありませんか?
>>316
スレ違いぽいなぁ
318デフォルトの名無しさん:02/07/25 13:59
>>313
int main(void)
{
if(EOF == getc(stdin)) print("0\n"), return 0;
if(EOF == getc(stdin)) print("1\n"), return 0;
if(EOF == getc(stdin)) print("2\n"), return 0;
if(EOF == getc(stdin)) print("3\n"), return 0;
以下、調べたいデータの最大まで書いていく、
319あや:02/07/25 18:44
1行に書かれた2桁の2つの数の四則演算の式の値を求めることができるプログラムを作る。
というのなんですがCで作るのですがさっぱりわかりません。
だれか知識のある方作っていただけませんか?
おねがいします。
320デフォルトの名無しさん:02/07/25 18:45
>>319
マルチ氏ね。
>>320
お疲れ様です
322あや:02/07/25 19:01
>>321
お疲れ様です。Cしてあげます。
>>322
はーい、あやちゃん。しーしましょうね。しー。
>>319
値を求めるだけなら。
int main(void)
{
  int a = 10 + 20;
  return 0;
}
四則演算って、和差積商全部求めるん?
式は標準入力から入るとして、
OSはgccのあるUnix系と仮定
バッファあふれとかはとりあえず無視。

int main(void)
{
char buf[80];
FILE *fp;
gets(buf);

fp = fopen("tmp.c", w);
fprintf(fp, "#include <stdio.h>\nint main(void){printf(\"%d\n\", buf);return 0}");
fclose(fp);
system("gcc tmp.c");
system("./a.out");
return 0;
}


327デフォルトの名無しさん:02/07/25 22:52
sample.cが大きくなったので,関数の部分を分けようと思い,foo.hとfoo.cを作って関数と
大域変数を以下のように書いたのですが,(A)の場所で「error C2159: 2 つ以上の記憶
クラスが指定されています。」というエラーがでてしまいます.
extern を消すとコンパイルされるのですが,dictionaryの値がちゃんと保持されません.
どうしたらよういのでしょうか.
Windows2000でVC++6.0を使用しています.

○sample.c
#include "foo.h"

static int dictionary[200][100];
int WINAPI WinMain ( 略)

○foo.c
#include "foo.h"
extern static int dictionary[200][100];  <---(A)

int WriteClip(HWND hwnd, int *Data)
{
(略)

○foo.h
int WriteClip(HWND hwnd, int *Data);
とりあえずstaticをとったら?
>>327
staticは変数のスコープを現在の翻訳単位に制限してしまうので、
この場合はまずい。
330デフォルトの名無しさん:02/07/25 23:02
>>327
意味もわからずにstaticなんてつけんじゃねーよヴォケ
>>330
まあまあ。
staticには二つの意味があるし許そうよ
332デフォルトの名無しさん:02/07/25 23:16
extern static
333327:02/07/25 23:38
もうしわけありません...プログラムを見直していたら気が付きました...
最初,関数内でdic配列を定義.大きな配列を指定するとスタックオーバーフロー
をおこすので,static宣言をしました.その後,dicをローカル変数からグローバル変数に
したが,staticを外すのを忘れておりました.そのため,dic配列がそのファイルに
ローカルになっているのに気が付きませんでした...
いかん、long short とか unsigned signed とか試したくなってきた。
335デフォルトの名無しさん:02/07/25 23:50
extern static unsigned signed near far huge long short i = 0;
336あや:02/07/26 00:39
なんか偽者がいますね・・・
返事遅れましたがありがとうございました。
偽名もいるな。
338デフォルトの名無しさん:02/07/26 00:45
return(age);
本名はいないな
340デフォルトの名無しさん:02/07/26 00:49
MOV 2CH , age
POP 2CH
RET
341デフォルトの名無しさん:02/07/26 01:04
#include<2CH>
main()
{
for(スレ=1;スレ <=500; スレ++){
printf("(・∀・)イィ");
}}


342デフォルトの名無しさん:02/07/26 01:35
 すいませーーん!C勉強中のものなんですがポインタが
わかりません!!
 どうすりゃいい??配列もちょいと微妙な感じ・・・。
ちなみに独学でやっとります!
じゃ、人に教えてもらわないで自分で解決するんだな
>342
速やかに入門書を購入してください
>>342
実際にプログラムを組むのが一番だよ
>>342
ポインタは指す物だ。
何かがあって、そのありかを指している、それがポインタだ。
ただそれだけのことだ。精進せよ、若人よ。
347342:02/07/26 01:55
ポインタの仕組み自体はわかるんですけど、いざ演習問題で
プログラムを組むときに手が止まってしまいます
 やっぱアルゴリズムがわかってないのかなぁ?
それとも才能がない??
>>347
演習問題くらいだったら、才能より慣れだよ。
数学とプログラムは数こなした奴が勝つ
そうでもないよ
351デフォルトの名無しさん:02/07/26 09:44
                          ┗0=============0┛
               \===========[_|_|_|_|_|_|_|_|_|_|_|_|_|_]===========/
            /三三三三三三三三三三三三三三三三三三三三\
                  0 │ |∞∞∞ |::|∞∞田田∞∞|::|∞∞∞ | ::|  0
            [二] | ::|       |::|┏━━━━┓|::|       | ::l [二]
◎○@※◎○@※. |□|.│ |┌┬┐ |::|┃/  C  \┃|::| ┌┬┐| ::|. |□| ◎○@※◎○@※
ii|iiii|iiii|iiii|iiii|iiii|iiii|iiii| `)三(´| ::|├┼┤ |::|┃ ∧_∧ ┃|::| ├┼┤| ::|`)三(´il|iiii|iiii|iiii|iiii|iiii|iiii|iiii|
@※◎○@※◎○ | ::| | ::|└┴┘ |::|┃(´∀` ) ┃|::| └┴┘| ::| | ::|  @※◎○@※◎○
ii|iiii|iiii|iiii|iiii|iiii|iiii|iiii|li┏━━━━━┓|::|┃(.    つ┃|::|┏━━━━━┓ li|iiii|iiii|iiii|iiii|iiii|iiii|iiii|l
◎○@iiii※◎○@ ┣┳┳┳┳┳┫|::|┗━━━━┛|::|┣┳┳┳┳┳┫ ◎○@iiii※◎○@
ii|iiii|iiii|iiii|iiii|iiii|iiii|iiii|l ○    ●        ∫∬∫∬        ●    ○ ii|iiii|iiii|iiii|iiii|iiii|iiii|iiii|li
               ○○  ●●      iiiii iii ii iiii       ●●  ○○
           [ ̄ ̄] [ ̄ ̄]   ( ̄ ̄ ̄ ̄ ̄)    [ ̄ ̄] [ ̄ ̄]
                |_○_|  .|_○_|     |_____|     |_○_|  .|_○_|

    ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧
    (    )(    )(,    )(,,    )    ,,)(    )(    )(,    )(   ;)
   やっぱり糞言語だったんだ……  モナモナ  ザワザワ  可哀想に ナモナモ...
>351
前から思っていたんだけど。
専門学校って「自力で勉強できない”ボクも〜ができたらイイなぁ〜”」って人が行くところ・・・で
間違ってないよね。
>>353
行ったこと無いから知らんが、そうでもないんじゃない?
>>353
そう言うつまらんことばっかり言ってるからろくな人間になれない。
>>355
文章読解能力レベル1
>>353
行ったことあるけど、そうでもない。
けど、そういうのが多すぎて、そう見えても仕方がない。

>>357
バカを認識する能力よりそこ中のきらりとしたものを見つけ出す能力の方が有用だと思う。
>>353
学校とはそういうところ。
優秀なやつもいるね。俺なんか負けっぱなし。
学校なんて関係ないな、と思わされた。
BOOL a( int num )
{
  int i;

  for(i=0;i<num;i++){
     if( box[i] >= 1000 )
     return TRUE;
  }

  return FALSE;
}

これは,ちゃんとTRUEが帰りますか?
for分の中でreturnしても関数を抜けますよね?
362デフォルトの名無しさん:02/07/27 11:15
>>361
なんだBOOLとかFALSEって・・・・

抜ける。試せ。
ところで、box[]はグローバル変数?
実はbox[]はchar box[]という罠
>>362
ありがとん。
>>363
・・・
tempx=-5;
tempy=10;
kyori=abs(tempx)+abs(tempy);
ちゃんと15になるかな?
>>365
なぜそれがkyoriなんだい?
マンハッタン距離?
>>365
> ちゃんと15になるかな?

何が?と意地悪を言ってみる。
tempx=-5;
tempy=10;
num=abs(tempx)+abs(tempy);
ちゃんと15になるかな?
370デフォルトの名無しさん:02/07/27 17:33
Cの中級者っていったら
どんくらいのことできたら言えますか。
当方まだCをはじめて1ヶ月の厨房でござる。

あと、
#include <stdio.h>
#define num 8

int main(void)
{
FILE *fp;
int test[num];
int max,min;
int i,j;

fp = fopen("test3.txt","r");

if(fp==NULL){
printf("ファイルはオープンできませんでした\n");
return 1;
↑のreturn 1の意味がわかりませぬ。
これはなにしてんの?
>>370
まぁ、使えと言われて使えない機能はないってとこじゃないの?

後、OSにエラーであることを教えてるんだろ。
エラー終了じゃないの?
373デフォルトの名無しさん:02/07/27 17:36
なるほど、ありがとうございます。
精進します。
374あぼーん:あぼーん
あぼーん
376デフォルトの名無しさん:02/07/27 18:21
000 001 002・・・と桁指定の連番書式はprintfにはないのですか?
"000"+"%d"で右から抜き取る?
mainの戻り値はプログラムを呼び出したOSに渡されます(一般に0が正常を指すことが多いです)。
>>376
"%.3d"
379376:02/07/27 18:36
%3dだと"003"になりません" 3"になりますた
%03d
>>379
>>378のドットを見逃しているね。
382376:02/07/27 18:48
>>378さん>>380さん>>381さんどうもです
どちらでも逝けました
17インチに1280*1024なんで見逃していました
>>382
コピペしなされ。
384初心者:02/07/27 23:10
画面をクリアするにはどうしたらいいんでしょうか
つまらん質問でスミマセン
385デフォルトの名無しさん:02/07/27 23:21
>>384
どうしようもない。
>>384
printf("\n\n\n・・・・・\n");
387Rina ◆tI333vNE :02/07/27 23:30
clearのソースでも読んだらいいのでは?
エスケープシーケンス一覧の方が早いかと。
構造体同士で,

kouzoutai a,b;

いろいろな処理

a=b;

と,代入をしたいのですが,memcpyの方がいいでしょうか?
こっちの方が,速度的に早くて,安全なんでしょうか?
390デフォルトの名無しさん:02/07/27 23:51
>>389
構造体のメンバによる。
>>384
エイリアンを全部穴に埋めればクリアだよ
>>389
構造体のコピーでmemcpyなぞ使う奴は今の時代にいない(といいなぁ)。
typedef struct{
char a;
char b;
int num;
BOOL b;
}kouzoutai;

です
>>389
読みやすさが重要
>>393
ポインタがないなら、直接代入するよろし。安全確実。
>>395が胡散臭い
>>395
ハァ?構造体のメンバにポインタがあると危険なの?
おまえダラ決定
memcpy使う奴はもっとダラ
>>392
ネットでたまに見かけるよ…
>>397
シャローコピーして、片方の知らないところで、
片方だけfreeする馬鹿がいるんでしょ。
>>399
同意。
少なくとも同じものを指す構造体が2つできる。
ってことはそれらの排他処理なども考えなければ。
以前に不本意なコピーになることの方が多い。
>>395
構造体のメンバにポインタがあること自体が危険などと誰もいっていない
402デフォルトの名無しさん:02/07/28 00:34
>>397が初心者ということを晒しますた。
ダラってなんだ?
ごめん、401は>>397
405デフォルトの名無しさん:02/07/28 00:38
>>401も初心者ということを晒しますた。
ダラ・・・○○地方の方言。
memcpy か代入文かって話で、>>395はおかしいだろ。
>>401
かなりダラだな。
「代入すると危険か?」って聞いてるくらい雰囲気で分かれ。
ポインタあると代入だと危険でmemcpyだと安全な理由教えてごせや。
409デフォルトの名無しさん:02/07/28 00:54
>>408
>>407だな。

きっと、>>395はコピー自体が危険だっていっているんだろ。
でも質問には合わない答えだ。
必死のジエン
411409:02/07/28 00:59
>>410
俺のことか?(ワラ
まあいえることは、memcpyなんか使うより代入しちゃったほうが
一般的に速いコードになるし、読みやすくもなるんだから
積極的に代入すれ、memcpyなんか使うなということだな。

あと違う話だが、memcpyなんか使わんでmemmove使えという話もある。
413デフォルトの名無しさん:02/07/28 01:01
>>412
同じ変数でなければ領域が重なることなんてないだろ?
ディープコピーしませう。
>>413
一般論としてだ。
>>412
話、違い過ぎ。
>>416
違う話ではあるけどね。

どんなときでもmemmoveをつかえ、memcpyなんか使うな、って話はしてもいいと思うけど。
>>412も違う話だと断ってるんだし。
尽き果てぬ、自尊心
419デフォルトの名無しさん:02/07/28 02:41
int cmp_line(int *line1, int *line2, int size)
{
int i;

for ( i = 0; i < size; i++ ) {
if ( line1[i] != line2[i] ) {
//printf("%d, %d\n", line1[i], line2[i]);
return line1[i] - line2[i];

}
}
return 0;
}
というコードがあって、printf文のコメントをはずしたときと
つけているときで戻り値が変わってしまいます。
(出力内容は関係ないみたいです、printf("")
 としても結果が変わってしまいました。)
このコードだけ見てもなんともいえないかも知れませんが、
何か考えられる原因はありますか?
420デフォルトの名無しさん:02/07/28 02:44
>>419
スタックの馬鹿消費
>>417
>どんなときでもmemmoveをつかえ
わかってなさ過。
>>421
どの辺が?

領域が重なってるか重なってないか考えなくてもいいのは大いに利点だよ。
逆に、memcpyはそういう判断をプログラマにさせるわけで、
速いコードになるけど現状の処理能力考えたらそんなもん誤差誤差。
むしろバグを入れる可能性を考えたら使う利点はないと考えてる。

という考えでmemmoveをいつも使えと言ってんだけどおかしいかな。
何か見落としてる?
>>419
本題とは関係ないんだけど、line1[i] の方が大きいときに正の
値を返したいの?だったらおかしいよ。そうでなかったらすまん。
>>423
どうおかしいの?
>>419
貼り付けてあるコード自体は悪くなさそう。
なので、呼び出し側がおかしそうだけど。

面倒くさがらずにline1[i]とline2[i]を全部表示してみればいいと思うよ。
sizeがあまり大きくなければだけど。
>419
size が line1[],line2[]の要素数を越えているんじゃ?
>memcpyはそういう判断をプログラマにさせるわけで

そういう判断をした上でmemcpyを使うんだから問題ないでしょ。
コピーするときって領域が重ならない場面の方が多いと思うし。
なんでもかんでも馬鹿に合わせる必要はない。

まあ、memcpy/memmove/bcopy の中身が全部同じなんてことも
あるわけだけれども。
人にはmemmoveを薦めておき、自分はmemcpyを使うのが基本ですか?
429421:02/07/28 04:36
「どんなときでもmemmoveをつかえ」

「バグはすべてアドホックな対応で良い」
って言ってるようなもんだ。

こわっ…
>>427
馬鹿に合わせるようなコードを書くのが基本だと思ってたけど。
誤解して欲しくないけど、馬鹿が書くようなコードじゃないよ(w

領域が重なるか重ならないか、それは当然コードを書いているときには判別がつくだろう。
だが後にメンテするとき、他人がそのコードを読んだとき、果たしてそれが明らかかどうか。
自分よりも優秀なやつがそのコードを読むかどうか。
デバッグしてるときに「どうもメモリブロックが壊されてる、ひょっとしてmemcpyの使い方が変?」
なんて心配するよりもmemmoveを使っておいたほうがはるかに楽になる。
ま、ライブラリのバグってのもありえないとはいえないけど、まず考えなくてもいいわな(w

その辺も含めてプログラマが判断しなくちゃならないと書いたつもりだ。
そのコストは、memcpyを使って得られるささやかな利点を補って余りあると思うよ。

無論絶対使うな、とまで言い切るつもりはないけどね。多分使うべき場合もあるだろう。
ただおれの経験ではmemmoveが使えない状況だと、memcpyさえも使えない、
性能に重大な問題がある場合だけだったけどもね。
だからmemcpyを使うべき状況というのはおれにはちょっと想像がつかない。
>>430
賛同
領域が重なっている時の動作が不安なので
strcpyは使わずに、常に自作関数を使っています。



ってか。
ちょっと違ったな。

領域が重なっている時の動作が未定義なので
strcpyは使うべきではありません。
領域が重なっていても正常に動作する自作の同等関数を作成し
常にそちらを用いるようにすべきです。
>>430
なるほどね。430はそう考えるか。
うーん。俺は逆だな・・。
memmove 使うのは転送領域が重なるからだろう、
fixする時には注意が必要かもしれない。と考える。

まぁ・・どっちにしてもコメントをいれてもらえると助かるかな。
 
 
    自 己 防 衛 に 必 死 だ な
>「どうもメモリブロックが壊されてる、ひょっとしてmemcpyの使い方が変?」
はじめから領域が重なる可能性があるならmemmoveを使う必要があるんだし、
重なる可能性が(設計上)無いんなら、memmoveを使うと本当のバグの原因が
奥深く潜り込んでしまう罠。

「memmoveを使ってるけど、領域が重なる可能性があるのか?」なんて心配
するよりも(以下略
>>433
それ、最後に「ってか」がつくんだよね?
strmove()
printfは誤った引数を渡してしまう可能性があるので(以下略
440430:02/07/28 05:22
>>434
このあたりは評価とかポリシーの差になるんで議論になるとは思ってた。

関数マクロの是非とか、構造化プログラミングって効率悪そうとか、
C++なんて無駄なコード吐くからCの方がよいとか、
いやそれならいっそアセンブラで書けとか。
そういう議論は過去に山ほどあったけど大抵は「馬鹿にわかるようなコードをかけ」という
ポリシーが大抵生き残っていると思う。勿論場合によるというエクスキューズがつくけど。

丁度今現在の性能を持つシステムでmemmoveとmemcpyを使うか使わないかというあたりは
議論が分かれそうだと思ってた。で、仕掛けてみた(w

>memmove 使うのは転送領域が重なるからだろう、
>fixする時には注意が必要かもしれない。と考える。

という視点はおれにとっても他人のコードを読むときに常に意識していることだったりする。
当然「そんなこと意識させんなよ」とかいらいらする自分もそこにいる(w

コメントについては賛成。

>>436
そういう視点があるとは思わなかった。
ちょっと自信が揺らいできたよ。
>>438
char *strmove(char *dst, const char *src)
{
return memmove(dst, src, strlen(src) + 1);
}
442436:02/07/28 05:59
>>440
領域が重なっちゃったら絶対バグになるような場面でmemmoveは、やっぱり
使いたくない。
だって、積極的に「ここは重なってもいいようになってます」ってコメント
入れてるようなもんだから。
「領域が重なるのが仕様上ありえること」なのか、
「重なったとしたら、領域の計算にバグがある」のかが選択の基準。
重なることがありえないはずなら、好きなほう。
おれはそういうスタンスで指導してるよ。

memmoveとmemcpyの場合は微妙だけど、こういう時の考え方って、
もっとクリティカルな場面に生きてくるから。
>>440
C++は似非とはいえOOPを実現するためにやっていることで
programmerに新しいパラダイムを与える。
その議論はパラダイムレベルで投資するコストと対効果の話で
memcpyとmemmoveのようにシンプルな関数でその次元で
語るのはいささか微妙かと思われ。

そういう懐疑を持つことはいいと思うが・・memcpyを全部memmove
に置きかえるほど一般的かというと。
俺的にはコメントしてあればどちらでもいいけど
ひとつ覚えれば済むことなんで、どちらが良いかとかはわからないなぁ・・
444436:02/07/28 06:04
(十分なテストが期待できなくて、バグがあっても、memmoveにしとけば、
 とりあえずバグが表面化しない、って時に、後ろめたさを感じながら
 memmoveにすることは、たまにあるけど、ナイショ)
同じような文字列の時は領域が重なるんだったよね?
数字もそうでしたっけ?
int型とか
446sage:02/07/28 21:04
誰か突っ込んでやれよ
>>445
んなわきゃないでしょっ びしっ。
>>445
文字列リテラルの最適化のことか?
449二つ目のお気に入りとして:02/07/28 21:40
このサイトは世界一リンクの多い総合リンク
サイトを目指しています。しかも総合リンク
サイトとしては日本初のナビゲーションリン
ク機能を搭載して、全てのサイトを右フレー
ムに表示できるようにしてあり、あらゆるサ
イトをさくさく表示することができます。是
非ブックマークに登録して活用してください。

http://home9.highway.ne.jp/cym10262/
450デフォルトの名無しさん:02/07/28 23:08
構造体のコピーがa=bで良しとして、比較はどうする?
if(a!=b)とか考えたことないや。出来るのかな?
>>450
まずは比較する際の「意味」を考えれ。

struct Proc p, q; // プロセス構造体
if( p < q ) ・・・

もしこんな風に書けたとしても、
結局の所「何を」比較しているのか意味分かるか?
>>451
a==b・・・aとbが同じ
a!=b・・・aとbは違う。
>>451
レコードの比較。
違いがあるのかないのか。
等等の用途に。

比較したい時ってない?
メンバがいっぱいある時、一つずつ比較するのは面倒だろ。

1byte境界にしてmemcmpか? ちと嫌だ。鬱だ。
>>453
そろそろC++の時期
455デフォルトの名無しさん:02/07/28 23:46
比較用の関数作れ。
>>454
C++で万事解決?
解説本でスパッと説明されているのを見たことないなあ。
入門編しか読んだことないからかな。
解説してくれるとうれしいです。

>>455
多種多様な構造体ごとに作るのは鬱にならないか?
指定された構造体が記録されているメモリブロックをユニークに
参照して、パディング位置が判別出来れば比較用関数1つで済むだろうが。
>>456
>指定された構造体が記録されているメモリブロックをユニークに
>参照して、パディング位置が判別出来れば比較用関数1つで済むだろうが。
そんな無茶苦茶な。アラインメントによる隙間だってあるかも知れんし
ポインタの参照先がデータ本体かも知れんし、上にもあったが
意味上の問題もあるし(リストの連結に利用するポインタの値が
違うからといって意味的に同値で無いとは限らんだろう?)

C++では演算子のオーバーロードが出来るし、ポリモーフィズムも
可能だから456の意向に近いことは出来ると思うがな
458デフォルトの名無しさん:02/07/29 00:25
C++でもクラスごとにオーバーロード関数を自分で実装しないといけない罠。
459デフォルトの名無しさん:02/07/29 02:22
ヘッダファイル内で関数定義をするにはどうすればいいのでしょうか。
普通に定義したら、複数のCファイルでそのヘッダファイルをinclude
しているので、multiple definitionと言われる。
460デフォルトの名無しさん:02/07/29 02:23
461デフォルトの名無しさん:02/07/29 02:32
>>459
ヘッダファイルに関数定義を入れないといけない理由は?
462名無しさん@XEmacs:02/07/29 02:38
>459

#ifdef xxxxx_h

とかやって、回避してください。

具体的な方法は、標準的なヘッダファイルに同じことが
普通はかいてあります。
たとえは、stdio.h などにも、ちゃんと多重定義しないように
そういう処理がかいてあるので参考にしてください


>462
459の犯してる誤ちはそういうことじゃない
>>461に同意

単に外部参照したいだけ?
externで解決か?
465495:02/07/29 02:46
>>461
ANSI Cの時間計測関数より正確に時間計測できる
関数ってOSによって異なってますよね。
それをラッピングするマクロがヘッダファイルに書いてあったんです。
しかし、そのままではどうしてもコンパイルが通らないんです。
よくよく調べてみたらマクロで定義できるほど単純ではないことに
気がついて、マクロではなく関数で定義しようとしたんです。
466463:02/07/29 02:48
>495
未来からのメッセージですか?
もう一度ヘッダファイルのなんたるかを再考してみよ
467デフォルトの名無しさん:02/07/29 02:50

>465
とりあえず、問題のソースをはってみそ

468459(=465):02/07/29 02:54
>>466
そうします。
469デフォルトの名無しさん:02/07/29 02:57
>>465
ヘッダでは関数宣言、別途.cファイルで定義を記述。
がベストだろ。

#ifdef HOGE
関数定義
#else
関数宣言
#endif

として、どこか1つのソースだけで、このヘッダを読み込む前に
#define HOGE
する手もあるが、お勧めできない。
470459:02/07/29 02:59
>>467
すいません、他人のソースなんで・・・
冷静に考えてみたら、素直な方法を
考え付きました。
アンニュイな午前3時。。
>>470
まさか、おれの知ってるやつじゃあるまいな。
そいつ、ヘッダに関数を定義するの得意だった。
473デフォルトの名無しさん:02/07/29 04:00
テスト期間でこの宿題に時間をかけたくありません。助けてください!解けますか?問題の意味もいまいちわからないし。
3×3のマスの中にチェスのナイトが置かれている。
(1) 3×3の配列aを定義して、すべての要素を0に初期化。ナイトの位置は1で、空欄は0で配列に記録。
スクリーン上には、□で空欄を、★でナイトの現在位置を表示する。(ナイトの最初の位置はプログラマーが選択してよい)
(2) チェスのナイトは、将棋の桂馬と同じ動きをするが、前だけでなく左右や後ろにも桂馬飛びができる。
そこで、3×3の配列bとcを宣言して、それぞれに現在位置(i,j)から移動できるマスの番号を2桁の整数で入力する。
移動できるマスが(3,1)ならば31と入力する。(この問題では移動できるマスは常に2つなので配列bとcを使います。)
(3) 現在のナイトがいる配列bの要素を10で割った商と余りを利用して、移動できるマスを(i,j)の形でプリントする。
同様に、配列cの要素をプリントする。
(4) ユーザーからの入力を読み、上の(3)で求めた(i,j)のどちらかならばナイトを移動して、新しい状態をプリントする。
入力が-1,-1ならばプログラムを終了する。
(5) 上の(3)と(4)を繰りかえす。
条件:配列aを引数として、現在ナイトがいる場所をプリントする関数を作製すること。
なんか宿題スレに答えらしきもの(内容見てない)
があったけど。
475デフォルトの名無しさん:02/07/29 05:11
誰も解いてくれません^^;解いてくださいお願いします!
476デフォルトの名無しさん:02/07/29 05:35
Pythonでなら、かいてあげるよ
477デフォルトの名無しさん:02/07/29 05:58
> テスト期間でこの宿題に時間をかけたくありません。
こういう人のために時間をかけるのはどうなのだろうか。
というよりは普段勉強をしていないだけ。
問題を解くより、問題の正しい解釈を見つけるほうが時間かかりそう。
>>473
>問題の意味もいまいちわからないし。

つまり、俺らがめちゃくちゃな解答をしてあげても先生に
 「できました!かんっぺきです!ボクは天才ですから!いやーハハハハ」
とかいって提出する可能性があるわけだな
482おしえて〜:02/07/29 16:07
質問!!

a=2.0;
b=3.0;
c=5.0;
c[0]=a+b+c;
c[1]=a+b-c;
c[2]=a+b*c;
c[3]=a+b/c;
c[3]=a-b+c;




数値は同じで演算子だけを+、-、*、/の全ての組み合わせで計算したいのですが、全て書くのは大変です。
何とかこのソースを簡単に出来きませんか?
教えて下さい。

483おしえて〜:02/07/29 16:10
ソース間違えました
a=2.0;
b=3.0;
c=5.0;
d[0]=a+b+c;
d[1]=a+b-c;
d[2]=a+b*c;
d[3]=a+b/c;
d[4]=a-b+c;



>>483
そういうコードを生成するコードを書きなさい
485おしえて〜:02/07/29 16:31
>>484
すいません具体的にお願いします。
>>458
#include <stdio.h>

int main()
{
int i;
const char op[] = "+-*/";

for(i = 0; i < 16; ++i) printf("d[%d]=a%cb%cc;\n", i, op[i/4], op[i%4]);

return 0;
}
487おしえて〜:02/07/29 16:40
ありがとうございました。
>>487
ここまで出たんだから、ソース吐かせずに
プログラム中で計算する方法を考えるべし
489おしえて〜:02/07/29 17:18
>>488
たびたびすいません。やっぱり分かりません。
486のソースをどお変えればよいのでしょうか?
初心者なので教えて頂けないでしょうか。
お願いします。
>>488
演算子の順位がめんどくさそう
>>489
こんなもんかな。ただし演算子の優先順位は考慮してないよ。

#include <stdio.h> 

static double add(double a, double b)
{
  return a + b;
}
static double sub(double a, double b)
{
  return a - b;
}
static double mul(double a, double b)
{
  return a * b;
}
static double div(double a, double b)
{
  return a / b;
}

int main() 

  int i; 
  double (* op[])(double, double) = {add, sub, mu\
l, div};
  double d[16], a = 2.0, b = 3.0, c =&n\
bsp;5.0;

  for(i = 0; i < 16; ++i)
    d[i] = op[i/4](a, op[i%4](b, c));
  return 0; 
}
492491:02/07/29 17:27
ごめん、ターミナルからコピペしたら折り返しのところに\が入った。スマソ
こっちが正しい。

#include <stdio.h> 

static double add(double a, double b)
{
  return a + b;
}
static double sub(double a, double b)
{
  return a - b;
}
static double mul(double a, double b)
{
  return a * b;
}
static double div(double a, double b)
{
  return a / b;
}

int main() 

  int i; 
  double (* op[])(double, double) = {add, sub, mul, div};
  double d[16], a = 2.0, b = 3.0, c = 5.0;

  for(i = 0; i < 16; ++i)
    d[i] = op[i/4](a, op[i%4](b, c));
  return 0; 
}
>>491
どうでもいいが、なんでそんなにエディタの幅がせまいの?
494493:02/07/29 17:29
リロードしてなかった。すまそ
495おしえて〜:02/07/29 17:32
>>491
すいません。実行できないんですが・・
496491:02/07/29 17:34
>>493
インデントがちゃんと見えるようにスペースを&nbsp;に置換してる。
んで、面倒なんで行頭のスペースだけじゃなくてソースにあるスペースを全部
&nbsp;に置換してるから、やたら幅を食う(笑)

ちなみにエディタというかターミナルの幅は95にしてる。
おしえて君、ここまでしてもらっているんだから
ちょっとはその足りない脳みそ使ってみろよ
498491:02/07/29 17:38
>>495
ありゃあ。一応こっちではコンパイル/実行してみてるんだけど。
実行できないというのはどのレベル?
・コンパイルできない
・コンパイルできたけど実行したら保護違反とかなんとか言われてしまう
・結果が表示されない

多分、結果の表示がなされてないとかいうことかな。してないな(w

mainのreturn 0;の前に

for (i = 0; i < 16; i++)
  printf("d[%d] = %f\n", i, d[i]);

と入れてみてくれ。
499おしえて〜:02/07/29 17:46
>>498
実行すると、
『実行時エラー:不正なアドレス参照』とだけでます。
演算子の優先順位も考慮してみた
#include <stdio.h>

static double add(double a, double b) {
 return a + b;
}
static double sub(double a, double b) {
 return a - b;
}
static double mul(double a, double b) {
 return a * b;
}
static double div(double a, double b) {
 return a / b;
}
int main() {
 int i;
 double (* op[])(double, double) = {add, sub, mul, div};
 char str[] = "+-*/";
 double d[16], a = 2.0, b = 3.0, c = 5.0;

 for(i = 0; i < 16; ++i)
  if ( i/4 < 2 && i%4 > 1 )
   d[i] = op[i/4](a, op[i%4](b, c));
  else
   d[i] = op[i%4](op[i/4](a,b),c);

 for( i = 0; i < 16; i++ )
  printf( "%f %c %f %c %f = %f\n", a, str[i/4], b, str[i%4], c, d[i] );
 return 0;
}
>>500
おおすばらしい。
でもこれなら、結局普通に式を16個書いたほうがいいね。
ぐふっ
502おしえて〜:02/07/29 17:59
>>500
実行すると
エラー:無題:4行目:パーサーエラー、・E は間違っています。
と出るんですが。
503おしえて〜:02/07/29 18:00
なかなかうまくできないですね〜
>>502
全角スペースをなおしたか?
>>502
「コンパイル」と「実行」という言葉を使い分けよう
506デフォルトの名無しさん:02/07/29 18:21
>>505
ツッコミにワロタ
507おしえて〜:02/07/29 18:22
>>504
直しましたが、やはりできません。
508おしえて〜:02/07/29 18:24
どうせ教えるなら、ちゃんと動くものを教えてください。
こっちも忙しいんです。
>>507
コンパイルエラーの出た行を貼ってくれ。(ソースの)
510おしえて〜:02/07/29 18:27
人を引き止めといて、、、
>>508
ごめんね。
error C2018: 文字 '0x81' は認識できません。
error C2018: 文字 '0x40' は認識できません。
がいくつか出てくるのだが・・・
なんか親切な人がいるなぁ

マターリイイ!
514おしえて〜:02/07/29 18:33
>>509
Cmachineが原因でKERNEL32.DLLにエラーが発生しました。Cmachineは終了します。
と出てCmachine強制終了してしまいます。
>>512
それおもいっきり全角スペースじゃん
>>512
全角スペースを除去しろよタコ
>>515-516
スマソ
忘れてた(w
518おしえて〜:02/07/29 18:51
しっかりしてください。 >>517
519おしえて〜:02/07/29 19:09
>>503>>508>>510>>518
やめてください。寂しい人ですね。
>>519
みんな分かっているから気にするな。
対象のソースを丸ごと貼ってくれい
521おしえて〜:02/07/29 19:14
>>520
すいません。ソース待ちだったんですか。
#include<stdio.h>
static double add(double a,double b){
return a+b;
}
static double sub(double a, double b){
return a-b;
}
static double mul(double a, double b){
return a*b;
}
static double div(double a, double b){
return a/b;
}
int main(){
int i;
double(* op[])(double,double)={add,sub,mul,div};
char str[]="+-*/";
double d[16],a=2.0,b=3.0,c=5.0;
for(i=0;i <16;i++)
if (i/4<2&&i%4>1)
d[i]=op[i/4](a,op[i%4](b,c));
else
d[i]=op[i%4](op[i/4](a,b),c);
for(i=0;i<16;i++)
printf("%f %c %f %c %f=%f\n",a,str[i/4],b,str[i%4],c,d[i]);
return 0;
}
522おしえて〜:02/07/29 19:17
521をやると、>>514になります。
>>521
まったくもんだいない。
Cmachineとやらの問題じゃないの?
>>522
Cmachineを使うのは初めてかい?
以前に違うソースは実行できた?
526おしえて〜:02/07/29 19:24
>>523
そうですか。どうしてもできません。プログラムを動かす基の部分が原因だと思うので諦めます。
ありがとうございました。
ひょっとして、Cmachineとやらって関数ポインタをうまく扱えないんじゃ。
バグ多そうだよ、Cmachine。初心者にはお(略)
あれは標準関数すらまともにサポートしていないよ。
printfとかstrcpy程度。
530デフォルトの名無しさん:02/07/30 02:00
Cmachineってなに?
531デフォルトの名無しさん:02/07/30 02:01
ミーンマシーンと関係ありますか?
>>528
やっぱりw

>>530
初心者向けCエディタとでも言えばよいのかな?
ちなみにフリー。
533デフォルトの名無しさん:02/07/30 02:34
質問です。
Cでは以下のように複数のファイルで
同一名のグローバル変数を定義しても
C++とは違い、エラーになりませんが、
これは言語仕様でしょうか?

file1.c
int foo=3;

file2.c
int foo=7;
yes
file1.cの中でfooを参照すると3になり、
file2.cの中でfooを参照すると7になります。
staticを付けてないので両方のfooは外部リンケージ
を持つのに 「外部リンケージを持つ変数はプログラム
の中でただ一つの定義を持たなければならない」という
規則に違反しないんでしょうか?
>>535
externしなけりゃ外部リンケージ持たないとか?
staticにすると、externができなくなる、と。
>>521
解決できたのかな。とりあえず、そのCmachineとやらいう変な処理系捨てて、
まともな処理系、たとえばgccなりbccなりを使ってほしい。
じゃないと変な癖つくよ。まかり間違って職業プログラマになってしまって、
しかもCを書くようになったら、かなりの困ったチャンになってしまうよ。

http://pc.2ch.net/test/read.cgi/prog/1021560641/l50
このスレで晒されるような存在になってしまうこと必至(w

で、Cmachineを使わざるを得ないというのであれば、ちょっとだけヒントを。
ただ、これでも動くかどうかはわかんないけど、トリッキーなことやってないので、
多分動くのではないかと。

以下の関数をop[なんちゃら](かんちゃら, どうした)って呼んでる部分で
置き換えてみるとよい。evalの引数opはどうやって得るかは考えてね。

double eval(char op, double a, double b)
{
  switch (op) {
  case '+':
    return a + b;
    break;
  case '-':
    return a - b;
    break;
  case '*':
    return a * b;
    break;
  case '/':
    return a / b;
    break;
  }
}
538デフォルトの名無しさん:02/07/30 08:46
>>533
リンクエラーになる。
>>538
Cではリンクエラーにならんそうです
gccでもVC++6.0(もちろんCとしてコンパイル)でもリンクエラーになるぞ。
Σ(゚Д゚) が、ガセなの?信じたのに
542API学くん:02/07/30 11:09
すみません質問です。
void *HENSU
という表現があったのですが、意味がわかりません。
ボイドへのポインタの意味を教えていただけないでしょうか。

voidは関数に付けて返り値のないものという認識だったのですが、
変数に付いてさらにポインタというところがわかりません。
543デフォルトの名無しさん:02/07/30 11:18
vectorで文字列の配列を扱うときの宣言は
どうしたらいいのでしょう?
vector<char []> list;
vector<char [256]> list;
いずれもだめなようで
vector<char *> list;
とするとOKなのですが
while (inifile.getline(ss,256)){
CorpusList.push_back(ss);
AfxMessageBox(ss) //この段階では表示される
}
AfxMessageBox(CorpusList[0]);//あれれ・・・表示されない

するとAfxMessageBox(MFCのダイアログ表示命令)
になにも表示されません・・・
>>543
スレ違い
>>536
static指定されてない外部宣言は外部リンケージをもつ。

>>538 >>540
VC++6.0だとエラーと出るが実行できるぞ。(SPあててない)
BCC5.5.1だとエラーにならずに実行できるね。
gccは試してないけど、これが正しいのか?
546デフォルトの名無しさん:02/07/30 11:26
>>542
指す型のない汎用ポインタ
547デフォルトの名無しさん:02/07/30 11:29
>>545
VC++6.0でどんなオプションをつければ実行ファイルが作成されるの?
548デフォルトの名無しさん:02/07/30 11:30
マウス・キーボードが動いたときの判定に
if (message == WM_MOUSEMOVE || pMsg->message == WM_KEYDOWN 〜
こんな感じで、書いたんですが、マウスを動かして無くても
if内に入ってしまいます。正しいマウスの判定の方法を教えてください。

549デフォルトの名無しさん:02/07/30 11:31
>>548
スレ違い
550 ◆JAPH9PWA :02/07/30 11:33
>>542
void*ってのはvoidとは無関係で「任意のポインタ」って意味だよ。
malloc()の戻り値の型などがそうだね。

>>543
そりゃssは単なる「ポインタ値」だから、配列の要素は全て同じオブジェクトを指してるよ。
そういう場合はstd::stringを使っ他方がいいと思うよ。
あと、このスレは「C言語なら、俺に聞け!」だから、今後はC++スレで聞いてね。
>>548

if (0) {
 if (message == WM_MOUSEMOVE || pMsg->message == WM_KEYDOWN 〜
}
>>549
スレよごし、すいませんでした。
553547:02/07/30 11:35
あ、勘違いしないでよ。エラーが出ても実行ファイルが作成されるオプションという意味だよ。
554デフォルトの名無しさん:02/07/30 11:39
>>533

初期化しないとエラーにならないね
>>542
汎用ポインタのことじゃないの?
malloc()なんかはvoid型のポインタを返してくるよ
>>551
すれ違いにレスすいません。
さっそく試してみます。
>>556
マジデスカ( ゚Д゚)...
558API学くん :02/07/30 11:51
>>546
>>550
どうも有り難うございます。なるほどvoidとは無関係だったのですか。
>>558
そもそもvoidは関数の戻り値がないという意味じゃないぞ。
型がないという意味。無効にすると言った方がいいか。
C言語だからDOS-Cじゃなくても
C++でもちょっとした質問くらいならいいと思うのは折れだけか・・・
C言語(C,C++)でしょ?
こんな事書くと糞レス扱いされるんだよな・・・
C++==C言語 説急浮上
>>554
それは当り前。
>>560
それよりも、
> C言語だからDOS-Cじゃなくても
C言語==DOS-C説には突っ込まないのか?
そんなこと言い出したらJAVAだって・・・
if('C' && "C++" && 'JAVA')
{
printf("もうわけわかんねえや");
}

else
{
   printf("そりゃあそうだね");
{

return ;
>>533
Cマガ見たけど、これ恐らくgccだからだよ。
つまり実装依存。本文にはC++では多重定義エラーに
なるが、Cではエラーにならんと書いてあるけど、
Cの規格ではエラーだよ。というのはね、外部リンケージ
を持つ外部変数の記憶割り当てには幾つかのモデルがあって、
Unix系統のものは、それ独自のモデルを採用している。
詳しくは、C Rationalの3.1.2.2に書いてある。
http://www.lysator.liu.se/c/rat/c1.html#3-1-2-4
なので、例えば以下のように、初期値がなくても各ファイル
のfooは定義であり、宣言ではない。-->リンクエラー
file1.c int foo;
file2.c int foo;
これはK&R Second Editionの付録を読めばリンクエラー
になることが理解できる。邦訳版 A10.2
567533:02/07/30 13:57
>>566
なるほど、見てみます。

失礼。Cマガでは初期値なしでした。
file1.c
int foo;
file2.c
int foo;
初期値があってもBCC5.5.1ではリンクエラーとならずに
実行できてしまいます。
568566:02/07/30 14:06
初期値なしだと、VC6.0でも通りますな。でも、やっぱ
規格には反してると思う。
569デフォルトの名無しさん:02/07/30 14:12
#include <stdio.h>
#include <math.h>

main()
{
double x;
x = log(64)/log(2);

printf("%d \n", (int)x);
}

答えが変になります。どのように訂正すればいいのでしょうか?
答えは整数で出したいです。
main関数を使って、変数を取って来たいのですが、
int main(int argc , char **argv){
int x;
char name;
x = atoi(argv[1]);
name = argv[2];

とすると、int型はOKなのですが、char型がエラーになってしまいます。
char型の変数の保持方法を教えていただけないでしょうか?
*argv[2]
>>570
> char name;
char *name;
>569
別に何も変にはならんかったが?

>570
argv[2] は char * 型だ。先頭の1文字でよいなら
name = argv[2][0];
574569:02/07/30 14:34
>>573
説明不足でした。
正確な答えは6ですが、プログラムの実行結果は5になるんです。
>>568
こういうときのためのMAPファイルだと思うんだが。

ちなみに両方とも初期値なしの場合、VC6.0では

Address Publics by Value Rva+Base Lib:Object
0003:0000266c _foo 0040866c <common>

という感じで共有の領域に取られるみたい。
>>574 キャスト後+1する。それで常に問題は起きない
>>574
四捨五入したら?
578573:02/07/30 14:48
>569
うちでは6になったが?コンパイラはgccだ
ハードウェアや浮動小数点ライブラリの関係で誤差が出て
log(64)/log(2) が 5.999... あたりになっているのではないかと思うのだが。
一度 double のまま printf させてみることをすすめるよ。
VCだと
doubleのまま6.0000...
intにキャスト5
581573:02/07/30 14:55
じゃ(int)(x + 0.5)しろ(正数のばあい)
>>580
それは表示の仕方の問題だと。
>>581
四捨五入するとおかしくなるよ。
切り捨て+1が正しい
>>583
答えが整数にならんときに破綻するんじゃない?
>580
何桁で表示させた?
桁数が少なかったら意味ないんじゃない?

表示だけ整数になればいいのならキャストせず %0f ではどうだろう。
>>585
それがいいと思う。かってにまるめてくれるっぽいし
587569:02/07/30 15:02
5.999999....になりますね。
結局、どうすればいいんでしょう?
588573:02/07/30 15:03
>583
アフォか?それじゃgccな環境だと7になるぞ?
589569:02/07/30 15:03
>>585
結果を整数のまま利用したいんです。
int main(int argc, char** argv)
{
int x;
char name;
if( argv[1]!=NULL) x = atoi(argv[1]);
if( argv[2]!=NULL) strcpy(&name, argv[2]);
strcpyでコピー
+.5だと63の時も6になっちゃうじゃん
>>591スタック破壊
594573:02/07/30 15:10
>592
(゚д゚)ハァ?
>>592
いけないの?
log(x)/log(2) の x が整数に限定される条件のもとでは、
log なんか使わない方が簡単確実かもしれん。




と、言ってみるテスト。
>>596
xが整数かどうかは関係ないでしょ?
式全体が整数になるかならわかるがと言ってみるテスト
598569:02/07/30 15:43
結局、64とか128が2の何乗かを計算できて、
計算結果が整数であればいいんです。

みなさん、どうもありがとうございました。
>>598
2のべきだけだけだったらlog使うまでも無いけどね。
600デフォルトの名無しさん:02/07/30 15:51
>>598
 ああ それなら前にトリッキースレかどこかで書いたと思う

 ( n and (n-1) )=0 なら 2のベキ乗だから
(n-1) を2進で表現した時の1の個数を数えるんだ

数え方はビットをシフトしながら加算する

601569:02/07/30 16:02
>>599
ちと、わからないです。
そのプログラムをコピペして
いただけませんか?
>601
はいよ。xが2の何乗かを調べる関数。2のべき乗以外の数入れると-1かえす。

int log_2( int x ) {
int ans = 0;
if ( (x & x-1) != 0 ) return -1;
--x;
while ( x ) x >>= 1, ++ans;
return ans;
}
603デフォルトの名無しさん:02/07/30 17:26
その whileの部分は
  x = (x & 0x55555555) + (x >> 1 & 0x55555555);
  x = (x & 0x33333333) + (x >> 2 & 0x33333333);
  x = (x & 0x0f0f0f0f) + (x >> 4 & 0x0f0f0f0f);
  x = (x & 0x00ff00ff) + (x >> 8 & 0x00ff00ff);
ans  = (x & 0x0000ffff) + (x >>16 & 0x0000ffff);

が格好いいぞ
>>603あんた勘違いしてる
>>603
あんたツッコミどころ満載
>603
それ何するプログラム?
607603:02/07/30 17:37
何って だから

int log_2( int x ) {
if ( (x & x-1) != 0 ) return -1;
--x;
x = (x & 0x55555555) + (x >> 1 & 0x55555555);
x = (x & 0x33333333) + (x >> 2 & 0x33333333);
x = (x & 0x0f0f0f0f) + (x >> 4 & 0x0f0f0f0f);
x = (x & 0x00ff00ff) + (x >> 8 & 0x00ff00ff);
return (x & 0x0000ffff) + (x >>16 & 0x0000ffff);
}

でしょ? 実行してみて 問題ある?
608ぺーぺー:02/07/30 17:38
あのさ、おまえらよ
Cで作ったコンソールアプリを
実行してDOS窓がすぐ消える
のを直す方法ってしってて言っ
てるの?
>>602のほうがよっぽどかっこいい
・「>>16
>>608 NT系? 95系ならPIFを弄ればOK
611603:02/07/30 17:40
ああホントだ unsigned にしないと駄目だな
>>608
win2kでのやり方しか知らん
>608
???DOS窓開いてその上で実行したら大丈夫じゃない???よく知らんけど
614569:02/07/30 17:48
>>602
ありがとうございました。
>>611 この場合は 最初にマスクしてるから大丈夫
>603
ほよよ。そんなやり方知らんかったよ。どういう原理?
それ使ったらなんかいいことある?
それはビット数を数える有名なテクニック >>616

一時、ループ使うと、最後に予測分岐が外れて大きなペナルティを払ってたから
ループ使わないテクニックがいろいろ作られたんだ

どうせやるなら、(x & x-1)の結果で0/-1を作って (ただ要アセンブラか)
最後にor して return すれば 完全な定クロックルーチンに出来るぞ >>607
>>617 は?
signedにはどっちにしろ適用できないじゃん
619デフォルトの名無しさん:02/07/30 18:36
> どうせやるなら、(x & x-1)の結果で0/-1を作って (ただ要アセンブラか)
2の補数表現なら、 -!!(x & x-1) とか。
2の-n乗について誤解してないか?
>>620
??
622デフォルトの名無しさん:02/07/30 18:50
2out-of5符号による表示。5ビットからなる符合で、その中の2ビットが1である
符号を2out-of5符号という。この条件を満足する符号語はちょうど10個存在するので、
0から9までの10種類の数字を表すことができる。たとえば数と符号を次のように対応
させる。
0=00011 1=00101 2=01001 3=10001 4=00110
5=01010 6=10010 7=01100 8=10100 9=11000
(1)ユーザーに、整数を2out-of5符号に変換するか、逆変換するかを尋ねる。(入力
が1ならば変換、2ならば逆変換とする。)
(2)変換の場合:3桁の整数をユーザーに入力させて、それを変数xに代入します。
(3)10で割った商と余りを利用して、xを3つの整数に分離します。
(4)それぞれの整数を2out-of5符号に変換して表示する。ヒント:2次元配列
a[10][5]の中にそれぞれの数の2out-of5符号を0や1で0入れておくと便利です。
(5)逆変換の場合:5桁の2進数を読み込んで、配列yに代入する。(1桁ずつよんでよい。)
(6)yの値を上の表と比較して、同じものがあればその数字をプリントする。該当する
ものがなければ「2out-of5符号ではありません。」とプリントする。
条件
1.配列yを2out-of5符号の配列と比較する部分を関数にする。

上の文章が問題です。自分で考えても全然わかりません。
お願いします。
>622
マルチかよ!ゴルァ!
待ってろ、今書いてやるから
>622
これでええか?

#include <stdio.h>

static int a[][5] = {
 { 0, 0, 0, 1, 1 },
 { 0, 0, 1, 0, 1 },
 { 0, 1, 0, 0, 1 },
 { 1, 0, 0, 0, 1 },
 { 0, 0, 1, 1, 0 },
 { 0, 1, 0, 1, 0 },
 { 1, 0, 0, 1, 0 },
 { 0, 1, 1, 0, 0 },
 { 1, 0, 1, 0, 0 },
 { 1, 1, 0, 0, 0 }
};

void henkan( void ) {
 int x;
 int z[3];
 int i;
 printf( "3桁の数を入力してください: " );
 scanf( "%d", &x );
 for ( i = 0; i < 3; i++ )
  z[i] = x % 10, x /= 10;
 for ( i = 2; i >= 0; i-- ) {
  int j;
  printf( "%d:", z[i] );
  for ( j = 0; j < 5; j++ )
  printf( " %d", a[z[i]][j] );
  putchar( '\n' );
 }
}
625624(続き):02/07/30 19:37
int hikaku( int y[] ) {
 int i;
 for ( i = 0; i < 10; i++ ) {
  int j;
  int match = 1;
  for ( j = 0; j < 5; j++ )
   if ( y[j] != a[i][j] ) match = 0;
  if ( match == 1 ) return i;
 }
 return -1;
}

void gyakuhenkan( void ) {
 int i;
 int y[5];
 int x;
 printf( "2out-of5符号を入力してください: " );
 for ( i = 0; i < 5; i++ ) {
  y[i] = getchar() - '0';
  printf( "%d", y[i] );
 }
 printf( ": " );
 x = hikaku( y );
 if ( x == -1 )
  puts( "2out-of5符号ではありません。" );
 else
  printf( "%d\n", x );
}

int main( void ) {
 int x;
 do {
  printf( "変換(1) 逆変換(2)?: " );
  scanf( "%d", &x );
 } while ( x != 1 && x != 2 );
 getchar();
 if ( x == 1 )
  henkan();
 else
  gyakuhenkan();
 return 0;
}
626デフォルトの名無しさん:02/07/30 20:22
わかりません。誰か、プログラム作成してください!!
『4000未満の4桁のアラビア数字を読み込んでローマ数字に変換せよ。
入力された数字を10で割った時の商と余りを利用せよ。
尚、アラビア数字、ローマ数字は、順に1=T、5=X、10=]、50=L、100=C、500=D、1000=Mとなる。
たとえば、MMDCL]XTT=1000+1000+500+100+50+10+5+1+1=2667です。
また、桁の数が4、9の場合は、引き算を適用します。たとえば、TX=5−1=4、T]=10−1=9です。
対話的に入力しますので、その入力誤りに対しては、再度入力するように表示して再入力させます。     』


宿題は友達と一緒にやれよ。
このスレで簡単に答えられるようなレベルの質問じゃないだろ。
main()
{
int a;
scanf("%d",&a);
printf("\n%d,%d",(a/10),(a%10));
}
>>626
宿題スレへ戻ってください。
630622:02/07/30 20:44
>>624
ありがとうございます!実行してみます.
631622:02/07/30 20:54
>>624
実行してみたんですが4行目に使用できない文字がある、と出てきてコンパイル
できませんでした。どこが間違っているかわかりません。お願いします。
>>631
全角スペースを半角スペースに置換せよ。
633デフォルトの名無しさん:02/07/30 21:05
複素数行列の積を求める関数と動作を確認するプログラムを作成せよ
行列積は、N*M行列とM*L行列の積を計算し、N*L行列を求める
ものである。
複素数は次の構造体型定義したcomplex型を用いる。また、複素数の和
、積を求める関数を作成し、それらを用いること。
typedef struct{
double re; /*実数部*/
double im; /*虚数部*/
}complex;
この問題がわかりません。よろしくお願いします。
後半はできた。

complex add(complex alpha, complex beta)
{
complex gamma;
gamma.re = alpha.re + beta.re;
gamma.im = alpha.im + beta.im;
return gamma;
}

complex mul(complex alpha, complex beta)
{
complex gamma;
gamma.re = alpha.re*beta.re - alpha.im*beta.im;
gamma.im = alpha.im*beta.re + alpha.re*beta.im;
return gamma;
}
ちなみに 634 では効率のことはまるで考えてない。

ところで、こっち↓のスレの方が向いていると思うのだが、どうよ?

宿題手伝います
http://pc3.2ch.net/test/read.cgi/tech/1027756023/l50
636633:02/07/30 21:23
どうもありがとうございます。まだ、c言語初心者なので、できれば
プログラム全部おしえていただけるとありがたいです。よろしく
お願いします。
637633:02/07/30 21:32
>>635
あまりいろいろな所で聞くとわけがわからなくなりそうなので、
できればここで教えてもらいたいのですが
こっちもいろいろなところで答えたくないので
「宿題」スレへ来てもらえると助かります。
話題的にもスレ違いなのは明らかだし。
今アドバイスしてくれそうな人が複数いるので、どうぞ。
639デフォルトの名無しさん:02/07/30 21:46
わかりました。そちらへ行きます。
>>637
教えてもらう立場なのに、すげーわがまま。
641622:02/07/30 22:05
>>632
ありがとうございました!無事に実行することができました。本当に助かりました。
宿題スレで冷たくするからこっちに流れてくるのか・・・
>>642
だからって、ここに書かれてもねえ。
関数に引数を一つだけ渡したい時と,3つ渡したい時があるのですが,
どのようにすればいいでしょうか?
引数を使って,一つだけの種類を調べたり,3つ調べたりしたいのです
645デフォルトの名無しさん:02/07/31 00:27
>>644
A. 同じ型なら配列にする。
B. 二つ関数を作る。それぞれで同じような処理をするのなら
 その処理を行うもう一つの関数を作ってそれぞれから呼び出す。
C. 3つ+1つの引数を受け取る関数を作って一つの引数でどちらの
 処理を行うか場合分けする。

お勧めはAかB。
646デフォルトの名無しさん:02/07/31 00:30
>>644
D.関数ポインタを使用
>>644 こんなのは?
enum arg_type
{
 type_nil = 0, type_int, type_charp
};

void func(enum arg_type a_type, ...)
{
 arg_type type;
 va_list v;
 va_start(v, a_type);
 while ((type = va_arg(v, arg_type)) != type_nil) {
  switch (type) {
  case type_int:
   ...; break;
  case type_charp:
   ...; break;
  }
 }
 va_end(v);
}

func(type_int, 0, type_charp, "test", type_nil);
>>644
printf の宣言(がどうなっているのか)を調べれ。
649 :02/07/31 00:32
void kan(int kan_a,int kan_b,int kan_c);
マクロで
a 1,0,0
b 1,2,3
とやろうかと思っているのですが,どうでしょうか?
これは楽な方に逃げてるだけ?
D. 最初の引数で引数の個数を指定するような可変長引数の関数を作る。
 int func(int n, ...) {
  /* 実装 */
 }

素人にはお勧めできない。
651デフォルトの名無しさん:02/07/31 00:35
E. C++使う。
>>651
that's right
653デフォルトの名無しさん:02/07/31 01:21
すみません。誰か教えてください。お願いします。いちを少し自分でといてみました。できれば続きからお願いします。
データが0と1しか含まないと仮定して、以下の方法でプログラムを作成してください。
getcharコマンドで、入力データの1行目を読み取り、配列aに代入(1行に38文字あるが、最後の1文字は改行文字と仮定)してカウンターの値を1に初期化する。
<最初に読んだ文字(a[0]の値)が続いている間は、カウンターの値輪1ずつ増やして読んだ文字が今までと違った(文字の連続が終わっ
た)時点でカウンターの値をプリントして1の場合にはそのまま数字をプリ
ントして0の場合には、符号をマイナスにしてプリントする。カウンター
の値を1に再初期化>して<>の間を繰り返す。2行目以降を同時に処理し
てください。
条 件:・配列aを引数として、0または1の数をプリントする関数を作成してください。
・サンプルデータは
 0000000000000000111100000000000000000
 0000000000011111111111111000000000000
 0000000000001100000000110000000000000
 0000000000000111000011100000000000000
 0000000000000011100111000000000000000
 0000000000000011100111000000000000000
 0000000000000001111110000000000000000
 0000000000000001111110000000000000000
 0000000000000111111111100000000000000
 0000000000011111000011111000000000000
 0000000001111000000000011110000000000
 0000000011100000000000000111000000000
 0000001110000000000000000001110000000
 0000111100000000000000000000111100000
 0001111000000000000000000000011110000
 0001111000000000000000000000011110000
 0000111100000000000000000000111100000
 0000001110000000000000000001110000000
 0000000001111111111111111111000000000
 0000000000000111111111100000000000000
 0000000000000000000000000000000000000

#include<stdio.h>
int main(void)
{
int i, j ,counter;
int a[20][38];
char ch;

for(i=0; i<21; i++){
for(j=0; j<38; j++){
a[i][j]=getchar();
}}
for(i=0; i<21; i++){
for(j=0; j<38; j++){
printf("%c",a[i][j]);
}}}

このプログラムの後に1行目は0が16個、1が4個、0が17個であるので16,4,17というように表示したいのですがで
きません。
16,4,17
11,14,12
:
:
:
:
と表示したいのです。どうぞお願いします。
>>653
いい加減にしとけよ。
宿題スレに(・∀・)カエレ!
655デフォルトの名無しさん:02/07/31 02:01
次のプログラムを関数で表したいのですがコンパイルできません。訂正をお願いします!
#include<stdio.h>

int main(void){
int i,j,x,y,next;

int a[3][3]={{1,0,0},
{0,0,0},
{0,0,0}};
int b[3][3]={{12,20,10},
{2,-1, 0},
{2, 0, 1}};
int c[3][3]={{21,22,21},
{22,-1,20},
{12, 2,10}};

while(1){
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(a[i][j]==0){ printf("□"); }
else{
x=i;
y=j;
printf("★");}
}
printf("\n");
}

for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(a[i][j]==1) printf("(%d,%d)",b[i][j]/10,b[i][j]%10);
}
}
printf("\n");

for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(a[i][j]==1) printf("(%d,%d)",c[i][j]/10,c[i][j]%10);
}
}
printf("\n next : ");

scanf("%d",&next);

if(next==b[x][y]){
a[x][y]=0;
a[b[x][y]/10][b[x][y]%10]=1;
}else if(next==c[x][y]){
a[x][y]=0;
a[c[x][y]/10][c[x][y]%10]=1;
}else if(next==-1)break;
}
return 0;
}
656デフォルトの名無しさん:02/07/31 02:04
関数で表したものが次のです。(655つづき)
void naito(int z[3][3])
{
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(z[i][j]==0){ printf("□"); }
else{
printf("★");}
}
printf("\n");
}
}
657デフォルトの名無しさん:02/07/31 02:12
今ある関数をつくっているのですが、エラー値を返すようにしたいんです。
でも戻り値は他のもっと大事なことに使うので使えません。
そこで広域変数にセットするかint *を渡してそこにセットする(0の場合はセットしない)かのどちらかにしようと思っています。
どちらがいいですかね?
ちなみにエラーチェックはプログラムの中で一度すればOKなのでint *を渡す方法を使うのは気が引けるんです。
658657:02/07/31 02:14
それと、その関数はメインルーティンとは別のファイルに書くのでstaticな広域変数は使えません。
>>655
できますが、なにか?
660デフォルトの名無しさん:02/07/31 02:22
どこがおかしいですか?訂正をお願いします!(655つづき)
661デフォルトの名無しさん:02/07/31 02:23
>>660
VC++6.0でコンパイルできちゃうんだけど
662デフォルトの名無しさん:02/07/31 02:25
>>657
本当に一度しかチェックしないのなら、エラーチェックする関数を別に作って
今ある関数を呼ぶ前に実行する。
663デフォルトの名無しさん:02/07/31 02:27
えっ…Cマシーンじゃできないんですかね?
664デフォルトの名無しさん:02/07/31 02:28
>>663
またしてもCMachineのバグ発覚か!?

ちなみにエラーメッセージは何?
665デフォルトの名無しさん:02/07/31 02:29
3余り符号は、2進化10進符号に3を加えて得られる符号である。各符号は、次のような値をとる。

0=0011  1=0100  2=0101  3=0110  4=0111
5=1000  6=1001  7=1010  8=1011  9=1100

この符号を用いると、各桁の1と0を入れ替えたものが9の補数になる。
そこで、3桁の整数を読み込んで、3余り符号とその補数をプリントするプログラムを以下の方法で作製せよ。

(1)3桁の整数をユーザーに入力させて、それを変数xに代入します。

(2)10で割った商と余りを利用して、xを3つの整数に分離します。

(3)それぞれの整数を3余り符号変換して表示せよ。2次元配列a[10][4]の中に
   それぞれの数の3余り符号符号を0や1で0入れておくと便利です。

(4)9の補数を求めたい数字と配列を引数として、9の補数をプリントする関数
   を作製せよ。たとえば1の補数は8で、各桁の1と0を入れ替えた数になって
   います。

(5)上の(4)で作製した関数を用いて、3余り符号の補数を2進数でプリントせよ。

条件
 1.9の補数を求めたい数字と配列を引数として、9の補数をプリントする部分を関数に
   すること。

友達に聞いても誰もわかりませんでした。どうかこの問題を解いてください。お願いします。
>>665
氏ね
667デフォルトの名無しさん:02/07/31 02:35
エラーメッセージ?
とにかくコンパイルができずに終了しなければいけなくなる^^;
668デフォルトの名無しさん:02/07/31 02:39
>>667
これこれこうだからコンパイルできません。と出ない?
例えば変数iは宣言されていませんとか。
669デフォルトの名無しさん:02/07/31 02:44
でません^^;エラーを送信するかしないか、デバックとかいうのが表示されます^^;
>>669
もしかしてOSはXP?
671デフォルトの名無しさん:02/07/31 02:57
XPです!
Cマシンとかいうの使ったこと無いけど、プログラムが落ちてるんじゃない?
とりあえず、違うコンパイラに変えることをすすめとく。
673デフォルトの名無しさん:02/07/31 03:01
助言ありがとうございました^^
674Rina ◆tI333vNE :02/07/31 03:02
Win上ならBorlandのコンパイラがお勧め.
>>671
今落としてきて試したけど、ちゃんとコンパイルできるよ。
バージョンは何?こっちは2.02だが。
676デフォルトの名無しさん:02/07/31 03:02
Rolandがいい
677デフォルトの名無しさん:02/07/31 03:04
ファイルバージョン1.0.0.1です!
>>677
とりあえず新しいの落としてきたら?
XP+Cmachine2.02で実行できてる。

でも、できれば他のコンパイラに変えた方がいいと思うけど。
XPいいよなーVC.NETが動くもんなー
>>677
ごめん。ファイルバージョンは1.0.0.1で同じだった。
やっぱりBCCでもダウンロードしてみて。
C Machineなんか使わない方がいいと思うけどな。
ヘッダーファイルをみるとよくわかる。
682 :02/07/31 03:19
Cでべき乗の計算をしたいのですが、
MSVC6.0では
2^5=7とでます。
2^5=2*2*2*2*2 ではないのですか?
お願いします。
683デフォルトの名無しさん:02/07/31 03:20
>>682
2^5は2と5のビットごとの排他的論理和
ベキ乗はmath.hをインクルードしてpow()を使って。
double pow(double x,double y);
684 :02/07/31 03:24
>>683
できました!
デフォルトの名無しさん、
本当にありがとうございました。
>>684
チョトワラターヨ
686Rina ◆tI333vNE :02/07/31 03:47
>>685
デフォルトの名無しさん,の部分なら私もワラタ.
C machineは動作保証できません。
とでもテンプレに入れとくかぁ。
>>687
おれはここや宿題スレにコードを貼る前に必ずgccでチェックしてるんだけど、
こっちでうまく実行できてるのにあっち(質問者)の環境だとうまく動かないというのは
例外なくCmachineで動かしてる場合だけだったな。
「またかよ」って何度も思ったもの。

だから動作保証できないって1もしくは2あたりに入れるのは賛成だな。

Cmachineってそんなにいいものなんだろうか。どういったところがいいんだろう。
使ったことないし使う気もないんだけど、どうなんですか、使ってる諸氏?
689685:02/07/31 04:23
>>686
それです(w
690デフォルトの名無しさん:02/07/31 07:02
漏れ、Cしか使ったことがないので、
C++やC#の存在が気になります。
Cと比べて、どういった利点や欠点があるかおせーてください。
C#はCの子孫じゃないぞ。
>>690
C++はいい匂いがするよ。
>>688
ソースコードを書いた後スタートボタンを押すだけでコンパイルと実行を行えるところじゃない?
VC++でも似たようなことができるけれど高いし。

俺は使っていないけど・・・
>>693
スタートボタンを押しても、メニューしか出てこないのですが・・・?
>>694
つまらん逝ってよし!
gcc-2.95.4@Linuxな環境です。

#include<stdio.h>

int main()
{
char* p;

fgets(p, 10, stdin);
printf("p=%s\n", p);

return 0;
}

これって普通に実行できるもんでしたっけ?
segmentation fault させるつもりだったんですが普通に動いてしまって
「あれ?」という感じなんですが。
697デフォルトの名無しさん:02/07/31 13:15
>>696
たまたま運がよかっただけ。
もう少し長く読み込んでみて。
期待通りに動くだろうから( ̄ー ̄)ニヤリ
698697:02/07/31 13:16
長く読み込む必要はないか。
pの値は不定(なはず)なんだから。
>>696
> これって普通に実行できるもんでしたっけ?
「未定義」では普通に実行できても良いし、 segmentation faultしても良いし、
鼻から悪魔が出てきても良いです。
700696:02/07/31 13:32
>>697-699
なるほど。ある程度長く読まないといけないんでしょうか。
fgets で読む量を増やしてみたら期待通りになりました。
ありがとうございました。
あんまり鼻から悪魔って言葉を使ってるとお里が知れるぞ(w
>>696
「未定義」の場合、ある1つを除いた、あらゆる動作に可能性があります。
「ある1つ」とは、もちろん、あなたの期待した動作です。
>>702
それは間違いです。
たまたま期待したように動作したとしてもいっこうにかまいません。
もちろん期待したとおりに動作しなくてもかまわないわけですが
まあ、パルプンテみたいナモのだと思えばいい。
質問です。
OSをMeから2000に変えてから
system("cls");
による画面クリアができないんですがなぜでしょう?

エスケープシーケンスでの画面クリアもできないしど
うしたらいいんでしょうか?
706デフォルトの名無しさん:02/07/31 15:49
それはCの話題なのだろうか。
それはageるほどのことなのだろうか
へきへき
709デフォルトの名無しさん:02/07/31 16:24
演算子の優先順位について教えてください
下記を動かすと"123"と出力されます
&&の法が優先順位が高く、||,&&とも左から結合なので、
"231"と出力されると思っていたのですが、
なにか見落としがあるのでしょうか?

printf("1")<0||printf("2")&&printf("3")<0;

環境:SunOS5.7+gcc3.0
<より||のほうが強いとか?
711710:02/07/31 16:27
んなわきゃないね。
うちのmingwのgcc(3)とVC6なら123になったよ
>>709
ショートカット?
>>709
演算子の優先順位と結合方向は、評価の順番とは関係ありません。
>>709
適当に答えとくと、実行結果が演算されてるからなんじゃねーの?
716709:02/07/31 16:52
>>714
この形で順序依存の副作用を期待する式は使用できないのですね
ありがとうございました

試しにやった四則演算も"123"となりました
printf("1")+printf("2")*printf("3");
717709:02/07/31 16:53
言い訳しとくと7行スレチャレンジ厨です
フツーに使う気はありませんです
718714:02/07/31 17:01
>>716
ついでにいうと、&&、||、? :は、シーケンスポイントを作り、かつ、左が先に評価されることが保障されてる。
それから a が偽なら、b、c は評価されない。
優先順位とは a || b && c が a || (b && c) と評価されるってこと。
コンパイル後にする「リンク」とは何者なのでしょうか…あれこれ調べましたが今ひとつよくわかりません 誰か解説していただけないでしょうか
720718:02/07/31 17:04
>それから a が偽なら、b、c は評価されない。
うそかいちった。
b が偽なら、c は評価されない。
です。
>>718
シーケンスポイントって副作用終了点?
>>719
> コンパイル後にする「リンク」とは何者なのでしょうか
オブジェクトファイルをつなげて実行ファイルを作成する作業
>>721
これくと。
724719:02/07/31 17:38
>>722
つまり、ネイティブコードの群れをまとめ上げてヘッダをくっつけて実行可能にするる作業、と考えてよいのでしょうか
725デフォルトの名無しさん:02/07/31 17:39
>>719
どの辺のアドレスにどう配置するかを決定する作業。
>>725
それはリロケーションと呼ばれる、リンク作業の一部。
>>725
なんか、それだけ読むとローダーの仕事の感じもする。
728デフォルトの名無しさん:02/07/31 17:53
関数へのポインタ宣言で質問です
#include <stdio.h>

int num(int,int);

int main()
{
int (*p)();
int a=1,b=2;
p=num;
a=(*p)(a,b);
}
本ではこれで成り立つはずなんですが
VC++でコンパイルするとエラーになります
変数宣言の部分で
int (*p)(int,int)
と引数の型と数を指定すればエラーにはならないのですが
これは本が間違っているのかVC++の仕様なのかわかりません
どなたか教えてください。
本がCとか?
730 ◆JAPH9PWA :02/07/31 17:57
>>728
C++としてコンパイルしているに一票
>>728
正確にはVC++の仕様ではなくC++の仕様
Cの場合、func()はint func(...)と同じ意味だが、
C++の場合、func()はvoid func(void)と同じ意味
732728:02/07/31 18:00
なるほどC++の仕様でコンパイルされているんですね
VC++で完全にC言語の仕様でコンパイルする方法はありますでしょうか?
拡張子は今cpp?
734728:02/07/31 18:02
ちなみに本はC言語の本です
735728:02/07/31 18:02
CPPです
>>735
.cにせい
737728:02/07/31 18:07
ありがとうございます
コンパイルできました!!
738 ◆JAPH9PWA :02/07/31 18:27
>>728
ちなみにその本の名前は?
int (*)()にint (*)(int, in)を代入するなんて事を教えるのはおかしいよ。
739デフォルトの名無しさん:02/07/31 18:53
C言語の名前の由来って、ナニ?
B言語を知らない世代が登場!
>739
Computer Language
Assembly
B
BCPL
C
743739:02/07/31 20:06
>>740-742
ホントにそうなの!?
もしかして単なる当て字!?
おぉ、懐かしい
BCPL = BasiC Precompile Langageのことだよね
要するにBasicのソースコードを生成するプリコンパイル言語
昔はこれであの面倒なN88-Basicの行数を意識せずにBasicを作っていたものだ
>>744
は?脳内プログラマ?
BCPLとBasicは別物だよ
746!744:02/07/31 20:26
>>745
ネタだろ
747739:02/07/31 20:36
ってか、>>740-742は鵜呑みにしていい話なの?
>>747
googleでも見てな!。
749739:02/07/31 20:55
>>748
あ、分からない人に教えろとは言わないから
大丈夫。(プッ
750748:02/07/31 21:39
面倒だな。煽りに乗ってやるか。
これでもみな。
http://www.visti.net/~dwl/ci/intro.htm
分かったか丸禿。
>>750
すごく分かりやすかった。
Введение
>>746
744-745メアド見てみろ
でもLangageまでネタかどうかは微妙
755デフォルトの名無しさん:02/07/31 22:38
int a=3;
float b=3.0;
のとき、
(a == (int)b)
は常に真ですか?

さっき調べたら、0〜16777216(floatの最大)までは真
だったんだけど、どうも自信がなくて。
>>755
自信が無かったらやめなよ。多分大丈夫だとは思うけど保証はない。
757デフォルトの名無しさん:02/07/31 22:44
マイナスはどうなる?
7581:02/07/31 22:46
printf("俺も最近c始めたんだけどむずいですね");
>>755
別に16777215がfloatの最大じゃないぞ。
たしか、そのくらいで精度が1.0f超えた気がしたが
760755:02/08/01 00:26
型をdoubleにして 300 000 000 までやってみた。
全部真だった。
でもやっぱり自信がない。
>>755
IEEE754(現在のほとんどのCPUで採用されている浮動小数点フォーマット)
について調べてみるといいと思われ。

単精度(float)の仮数部は23bit、正規化されてるので事実上24bitあって、
2^24=1677216だから、>>759の言うとおり1677215までの整数なら
誤差なく表現できる。
>>760
倍精度(double)の仮数部は52bit(同様に正規化により事実上53bit)なので、
32bitの整数なら誤差なく表現可能。
763 :02/08/01 00:43
>>761
正規化しただけで、1ビット増えるわけではないのだが。
>>763
761じゃないけど、正規化で1ビット省略されてる分
> 事実上24bit
というのは正しいと思ったんだけど違うの?
765764:02/08/01 01:11
あ、意味わかりました。

         ∧_∧
         (´Д` ) 切腹しますた
         /  y/  ヽ
    Σ(m)二フ ⊂[_ノ
        (ノノノ | | | l )
    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
766755:02/08/01 01:22
うちの環境(x86 + gcc + linux)ではfloatは16777216が上限っぽい、
なぜだ?
>>766
>>761、762見た?
768 :02/08/01 01:40
>>766
16777216と16777217.0Fも一致してないか?
769デフォルトの名無しさん:02/08/01 04:45
すみません質問です。
ポインタのキャストの意味が良くわからないのですが、実際のプログラムでポインタのキャストなんて使うことはありますか?

int dt[10];
char *p;
p=(char *)dt;

ポインタは先頭アドレスだけを指すんですよね? だったらこんな一時的にポインタをキャストしても仕方がないと思うのですが・・・
厨房の質問ですみません。 どなたか返事をお願いします。
>>769
いろいろとキャストなんて使うことはあります
>>769
次のプログラムを試してみそ。(実行する前に結果を予想してみること。)

int dt[10];
char * p;
p = (char *)dt;

*dt = 1234;
printf("%d %d\n",*p, *(int*)p);
>>769
一番ポピュラーな使い方はmallocでメモリを確保するとき。
mallocはvoid*を返すので、たとえば

char *cp;
cp = (char *)malloc(16); // キャストする

というふうにキャストが必要になる。
他にも使わざるを得ない局面はあるんだけど、
説明するのが面倒なんで略する。
773デフォルトの名無しさん:02/08/01 05:40
>770 >771 >772
レスありがとうございます。
>771
実行結果は -46 1234 でした。 *(int*)p の意味が良くわからなかったので
(int*)p でやって見たら -46 1245016 という良くわからない結果が出ました。 
予想と全然違いました。 もうちょっと悩んでみます。

>772
そっちも頑張ってやって見ます。 ありがとうございます。
774:02/08/01 06:26
エディターでソースを書いた後それの
拡張子を.cにしたいのですがどうすればよいのでしょうか
775デフォルトの名無しさん:02/08/01 06:58
>774
右クリックで名前の変更。
776:02/08/01 07:52
>>775
そうやってみたんですけど
「ファイル名.c.txt」になってしまいます
777デフォルトの名無しさん:02/08/01 07:59
じゃあ、Dosでやってみて。
rename file1 file2 で。
「"」でくくって
"test.c"
で保存してみそ
>>774-778
C言語と関係ない
#define MACRO(x) \
do { \
... \
... \
} while (0)

マクロで上のようなことをしているものを時々見るのですが、
これってどんな意味があるのですか?

マクロで関係ない変数を書き換えてしまったりするのを防ぐためなのかな、、
とか思うのですが外してるかも。
781780:02/08/01 14:12
あ、すみません。ブラウザだとバッククォートが消えてしまいますね。
navi2ch だと見えるんですが。
782780:02/08/01 14:13
s/バッククォート/バックスラッシュ/ (恥
MACROが関数のように使えて便利。
whileの後に";"が必要だったりするし。
>>780
if (test)
 MACRO(x);
って書いたときのことを考えてみな。
do〜whileでくくってある場合とそうじゃない場合と。
>>783
ステートメント使ってるから関数のようには使えないじゃん

>>784
それなら{〜}でいいじゃん
なんでdo{〜}while(0)
786780:02/08/01 14:49
>>784
あ、なるほど。
くくってないと意味が変わってしまいますね。
すごくすっきりしました。ありがとうございます。
787784:02/08/01 14:50
>>785
だめよん。

if (test)
 MACRO(x);
else
 foo();

なんてやったときに、{}でくくってあったらどうなる?
788785:02/08/01 15:14
なかなかやるな
そこまでしてマクロにする理由は何なんだ?
>>788
・マクロが好き
・本物の関数にするオーバーヘッドがもったいない
・それ以外

かなあ。一番目の理由でやってるやつには氏ねと言ってやるが。

こういったことが気になり始めたら
ttp://www.bk1.co.jp/cgi-bin/srch/srch_detail.cgi/3d48d6aa9290b01024e6?aid=&bibid=01331295&volno=0000
をよむよろし。面白いよ。do〜whileでくくったマクロの話も出てくる、と思った。
今手元にないので確認できん。
790デフォルトの名無しさん:02/08/01 15:44
structの使い方についての質問です。例えば、
struct A { int i; float f; };のようなstructを定義して、
これをmain()の中で、A *a=new a[10];(あるいは、A a[10];)
として、他の関数の中で使うには、その関数はどう定義
すればよいのでしょうか?void func(A* a[]){}ではダメでした。
ここでいうfunc()の中で、a[5]->iを使いたいのです。
よろしくお願いします。
>>789
> ・それ以外
関数で渡せる「値」以外のものを扱いたい場合は、マクロにせざるを得ないな。
名前とか、型とか、角度とか。
>>790
void func(A* a)
void func(A a[])
793785:02/08/01 15:52
>>789
>言語の規格書をおもちゃにしながら
なるほどおもしろそうじゃん

>>791
そこまでやるか
794デフォルトの名無しさん:02/08/01 16:02
typedef struct { int i; float f; } A;
795:02/08/01 17:58
>>777-778
できました
ありがとうございました
796デフォルトの名無しさん:02/08/01 23:49
goto文についてですが

/*ここから*/
if(処理A) {
  後始末;
  return FALSE;
}
/*ここまでが何回か続く*/

後始末;
return TRUE;

な場合、

/*ここから*/
if(処理A)
  goto LABEL;
/*ここまでが何回か続く*/

後始末;
return TRUE;

LABEL:
後始末;
return FALSE;

のようにgoto文使った方がいいのでしょうか?
それとも他に方法があるでしょうか?
(要は何度も後始末の処理を書きたくない。(後始末は関数化するようなものでもない))
ちなみに、マクロはあとあと読みにくいので却下の方向で。
797デフォルトの名無しさん:02/08/01 23:59
>>796
意味不明。
おまえはとりあえずCはやめておいたほうがイイゾと、忠告しておく。
>>796
C++で例外でも書くか
>>796
そういうケースでgotoを使った方が分かりやすくなるなら、無理な書き方を
してまでgotoを避ける必要はないと思うよ。

>>797
意味不明かなあ? 言いたいことは一応理解できたが…。
800!797:02/08/02 00:07
>799
俺も意味不明なんだが?結局「後始末」2回書いてるし、前半と後半でどこが違うんだ?
801デフォルトの名無しさん:02/08/02 00:12
>>796

if(.....) return TRUE;
else return FALSE;



if(......) return TRUE;
return FALSE;

をgotoをつかって悩むというつわものと見た。
802796:02/08/02 00:35
おとなしくtry〜catch使いまつ‥‥
803799:02/08/02 01:27
>>800
あー、確かにそう言われると例が変か。

int result = FALSE;
初期化A
if (初期化A失敗) goto fail_A;
初期化B
if (初期化B失敗) goto fail_B;
初期化C
if (初期化C失敗) goto fail_C;

何かの処理
result = TRUE:

Cの後始末
fail_C:
Bの後始末
fail_B:
Aの後始末
fail_A:
return result;

gotoを使った方がシンプルに済む例。

>>796
ヲイ。C++でいいのかよ(笑)。
C言語スレだからCの文法の範囲で解決する必要があるのかと思ったら。
804799:02/08/02 01:28
間違えた>>796じゃない>>802だ。鬱。
>803
俺は↓こうするけどなあ。

初期化A
if(初期化A成功) {
初期化B
if(初期化B成功) {
初期化C
if(初期化C成功) {
何かの処理
result = TRUE;
}
Cの後始末
}
Bの後始末
}
Aの後始末
return result;
>803
俺だったらこうだな。

int function(void) {
 初期化A;
 if( !(初期化A成功?)) {
  Aの後始末;
  return FALSE;
 }

 初期化B;
 if( !(初期化B成功?)) {
  Bの後始末;
  return FALSE;
 }

 初期化C;
 if( !(初期化C成功?)) {
  Cの後始末;
  return FALSE;
 }
 
 何かの処理;
 
 return TRUE;
}

>805
処理Zぐらいまであったら26重ネストになってまともにコード見れないじゃん。
807805:02/08/02 02:04
>806
完全に勘違いしてると思われ

>>処理Zぐらいまであったら26重ネストになってまともにコード見れないじゃん。
それはまあ確かにそうなんだが、
そもそもそんなコードはgoto使ったって読みにくいし、他に解決策を探すべきだろう
>806
てゆうか「何かの処理」にAもBもCも必要なんだろ?
と一応つっ込んでおいてやる
>806
一瞬、みかかのソースかと思った(汗)
↓こんなの


int function(void) {
 int status;
 int ret;


 status = TRUE;

 ret = 関数A;
 if(ret != FALSE) {
  Aの後始末;
  status = FALSE;
 }

 if (status != FALSE) {
  ret = 関数B;
  if(ret != FALSE) {
   Aの後始末;
   Bの後始末;
   status = FALSE;
  }
 }

 if (status != FALSE) {
  ret = 関数C;
  if(ret != FALSE) {
   Aの後始末;
   Bの後始末;
   Cの後始末;
   status = FALSE;
  }

  なんかの処理;

  if (status != FALSE) {
   ret = 関数D;
   if(ret != FALSE) {
    Aの後始末;
    Bの後始末;
    Cの後始末;
    Dの後始末;
    status = FALSE;
   }
  }
 }


 return status;
}


実際はステータスが10個以上あるから、どこで何してるかサッパリ。
810809:02/08/02 02:16
あう。

× if(ret != FALSE) {
○ if(ret == FALSE) {


普通、エラーチェックは
 if(ret != TRUE) {
だろっ!っていうのも今回のツッコミどころです。
>809
まあ絶対マネしてはいけない例としてはよかったよ
812806:02/08/02 02:28
>805
確かに完全に勘違いしてた。スマソ。
で、代わりにこんなの考えて見たけど
typedef struct {
 void (init*)(void);
 void (after*)(void);
} FUNCS;

void init_a(void) {
 初期化A;
 return Aの初期化成功?;
}

void after_a(void) {
 Aの後始末;
}

// 以下B,Cも同様に関数を定義

int function(void) {
 FUNCS f[]= {
  {NULL, NULL},
  {init_a, after_a},
  {init_b, after_b},
  {init_c, after_c},
  {NULL, NULL},
 };

 for(f++; f.init!= NULL; f++) {
  if(!f.init()) {
   for(;init!= NULL; f--) {
f.after();
   }
   return FALSE;
  }
 }

 何かの処理;

 return TRUE;
}

・・・変に関数大量に作らないといけないし、だめっぽいな。

俺は>803の方が良いと思う。
つーか元の話とずれて来るな。鬱。
813806:02/08/02 02:31
ぅぁ、typoだ。

× >805
○ >805=>807

× void (init*)(void);
○ int (init*)(void);

× void init_a(void) {
○ int init_a(void) {

スマソ。
814 :02/08/02 02:33
>>810
> 普通、エラーチェックは
>  if(ret != TRUE) {
> だろっ!っていうのも今回のツッコミどころです。

とか言っちゃうような香具師に文句言われたくないな。
815デフォルトの名無しさん:02/08/02 02:36
ウェイトをかけるときにはどうすればいいのでしょうか?
あと、関数表をダウンロードできるサイトがあったら教えてください。
816805:02/08/02 02:36
>812==806
>>・・・変に関数大量に作らないといけないし、だめっぽいな。
うむ。しかも質問者は「後始末」は関数にしたくないと言うておるのに(^^;;;
>815
>>ウェイト
sleep()またはusleep()
>>関数表
知らん
>>815
ここでも見ればどう?
http://www.linux.or.jp/JM/INDEX/ldp.html
819Rina ◆tI333vNE :02/08/02 02:49
>関数表
表…というわけではないが、お金に余裕があるなら↓を買ってみる
(もしくは図書館などから借りてくる)ことをお勧めします.
http://www.amazon.co.jp/exec/obidos/ASIN/4774104329/ref=pd_bxgy_text_1/249-7034174-2719549

/*
* やっとデスマーチがおわりますた.
*/
820デフォルトの名無しさん:02/08/02 02:55
>>817
ありがとうございます。sleep使ってもエラーが出ていたので聞いたのですが、コンパイラが悪かっただけのようです。

>>818
ありがとうございます。勉強します。
821デフォルトの名無しさん:02/08/02 02:57
>>819
お金に余裕なんてありません(;´Д`)
>>819
せっかくコテハンやってるんだからもっとレアな本紹介してくれよ
期待して見ちゃったじゃねーか。
823Rina ◆tI333vNE :02/08/02 03:04
>>822
そう言われると辛い…w 入門用にはいいかと思って紹介したのですが.
>>815
標準的な方法はループとclock()を組み合わせる方法だけど、UNIX系ならsleepを、WindowsならSleepを使った方がよい。
>>820
sleepじゃなくてSleepにしてみたら?あ、windows.hをインクルードしてね。

 ウィン厨の夏

   2chの夏
827今更:02/08/02 04:31
DATA*p= 初期化();
if (p) {
処理(p);
後始末(p);
}
828デフォルトの名無しさん:02/08/02 10:35
typedef struct hoehoe {
struct hoehoe *mode1;
struct hoehoe *mode2;
} STRUCT_HOEHOE;

typedef struct hoge {
STRUCT_HOEHOE hoe;
long flg;
intfrag;
} STRUCT_HOGE;

と宣言して、

STRUCT_HOGE ahya;

というグローバル変数を確保して、

ahya.hoe->mode1 とか ahya.hoe->mode2 を参照した場合、何を参照していることになるの?
829:02/08/02 10:38
間違い。

struct hoehoe {
struct hoehoe *mode1;
struct hoehoe *mode2;
} STRUCT_HOEHOE;

typedef struct hoge {
STRUCT_HOEHOE hoe;
long flg;
intfrag;
} STRUCT_HOGE;

と宣言して、

STRUCT_HOGE ahya;

というグローバル変数を確保して、


((STRUCT_HOEHOE *)(ahya.flg))->mode1 とか
((STRUCT_HOEHOE *)(ahya.flg))->mode2 という記述をした場合、何を参照していることになるの?

先輩のソースなんだけど何やってんのかさっぱりわからない
コンパイル通るしワーニング出てないので正しいんだろうけどわからない
>>829
そりゃ、キャストすれば何でも通るよ。
コンパイラにもよるが、この場合flgやfragがmode1やmode2の
代わりに使われる*かもしれない*ね。
831829:02/08/02 11:00
そうなのか。で、

typedef struct hoehoe {
  struct hoehoe *mode1;
  struct hoehoe *mode2;
} STRUCT_HOEHOE;

ここのmode1とmode2は何を指すの?
あ、さっきはtypedef忘れてたんだけどね。



>>829
printf("%p\n", &(((STRUCT_HOEHOE *)(ahya.flg))->mode1));
ってな感じに片っ端からアドレスを表示してみたら。
typedef struct hoge {
STRUCT_HOEHOE hoe;  ←おそらくここのmode1,2を参照してるつもり
long flg;
intfrag;
} STRUCT_HOGE;
fragなの?
その先輩はつるし上げたほうがいい。
>>834
fragなんじゃない。一応そういう単語あるみたいだし…
端数ということか
>>824
どこが標準的だ。どあほ。
839fish:02/08/02 15:20
blowfishっていう暗号をC言語でしたいんですが
>>839
暗号スレで聞いたら?
gcc-cygwinとgcc-mingwはどっちの方が優れてる?
実行速度やコンパイルされたファイルのサイズで。
同じ翻訳エンジンを使って居るんだから差はない。
cygwinのランタイムより速い物を自前で書けるなら、
mingwの方がいいかもしれない。
843デフォルトの名無しさん:02/08/02 17:27
すみません。

char a[]="なんらかの文字列";
という長さ・内容不定の文字列があり、始めから1文字づつTextOutでウインドウに表示したいのですが、
たとえば”あ”と”a”ではバイト数がちがうので、
int i=0;///グローバル

mainloop(){

TextOut(hdc,0,0,a,i);
i++;
}

なんてやるとローマ字はちゃんと表示されますが”あ”などの日本語になるとゴミになってしまいます。
かといってi+=2とやると今度はローマ字のところがおかしくなります。
この違いを自動認識するにはどうすればよいのでしょう。
>>843
環境依存の質問は各スレ屁。
>>843
全然関係ないが
> int i=0;///グローバル
> mainloop(){
> TextOut(hdc,0,0,a,i);
> i++;
>}
なんで
mainloop(){
  static int i=0;
  TextOut(hdc,0,0,a,i);
  i++;
}
にしない理由を小一時間問いただしたい。
>>845
おそらく先頭から出力しなおすとかやるんだろうが、それなら普通

struct hoge {
int i;
char *a;
};

struct hoge x = {0, "なんらかの文字列"};
mainloop(&x);

としそうなもんだが、なんせ3年間文字種判別をやったことがないという御仁
だから、構造体も使ったことがないのだろう。
847843:02/08/02 19:45
すみません。
サンプルの関数は本モノを最小限に縮めて書いたものです。
ですから本来はあるクラスに
DrawText(int dx,int dy,char* str,int n)というメソッドがあり、nに何文字出力するか指定します。
848fish:02/08/02 21:43
>>840
ありがと、逝ってきます
849デフォルトの名無しさん:02/08/03 10:26
ある変数が整数型であるか、実数型であるかを
判別する標準ライブラリ関数ってありますか?
>>849
C++でtypeid使うしかないな。
>>849
なにをするのか気になる。
852デフォルトの名無しさん:02/08/03 11:51
遅スレ(Aの初期化とかがメモリ確保とかなら)

---

if(A初期化失敗 || B初期化失敗 || C初期化失敗){
if(Aが初期化されてる){
Aの後始末;
}
if(Bが初期化されてる){
Bの後始末;
}
if(Cが初期化されてる){
Cの後始末;
}
return FALSE;
}

何らかの処理;
ABCの後始末;
return TRUE;

---

で良いのではないのか?
メモリ確保じゃなければ、
ABCそれぞれに初期化実施チェックフラグ
作ってチェックすればよいし。

後始末は関数に分けた方が、綺麗だと思うが。
激しく勘違いしてたらスマソ
853しー…ぷらぷら:02/08/03 12:42
質問です。
C言語ではDOSアプリケーションしか作れないのですか?
私はWin用のアプリケーションを作ろうと考えているのですが…
どうでしょう?やはりC++じゃないとだめですか?

それから、C言語でRPGを作ることは出来ますか?
854デフォルトの名無しさん:02/08/03 12:45
Windowsの.iniファイルのようなフォーマットに
もうすこし行順の制約や可変個数のパラメータを
持ち込んだようなファイルがあるのですが、

+SectionA
arg1:param1
arg2:param2a,param2b,param2c

+SectionB
:
:

このファイルの読み込みに、lex/yaccを使うのは
変ですか? 或いは無理ですか?
それとも、いたって普通の有りがちな実装方法ですか?
>>853
両方可能

>>854
やりすぎ
856親切な人:02/08/03 12:54

ヤフーオークションで、凄い人気商品、発見!!!

プランテック製の「 RX-2000V 」を改造済み
にした、アイティーエス製の「 RX-2000V 」↓
http://user.auctions.yahoo.co.jp/jp/user/NEO_UURONNTYA#.2ch.net/

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。

ヤフー ID の無い方は、下記のホームページから、
購入出来る様です↓
http://www.h4.dion.ne.jp/~gekiyasu/#.2ch.net/
857しー…ぷらぷら:02/08/03 12:54
どうやればいいのですか?
>857
win32api
あたりでぐーぐれば吉
859しー…ぷらぷら:02/08/03 13:05
>>858
ど、どういうこと?win32apiって何ですか?
860858:02/08/03 13:18
>859
C言語でWindowsアプリ作りたいんでしょ?
Windowsアプリの入門者は "猫でもわかる" で検索しなさい。
862デフォルトの名無しさん:02/08/03 14:50
ASPみたいなものをつくりたいです。
>859
あのね、
>858を解説するとね、
グーグルで「WIN32API  解説」という
キーワードで検索してみれば?
ということなのね。
>863
某ダウソ住人ハケーン
865デフォルトの名無しさん:02/08/03 23:20
>>859
Win32APIとはマイクロソフトが開発している
XBOXと次期Windowsの共通開発言語です。
866 :02/08/03 23:26
char (*h)[50];

h=(char(*)[50])calloc(10*50,sizeof(char));

hという配列を,関数にポインタで渡して使いたいのですが,

void kan(char *hairetu[50])
{
 for(int i=0;i<10;i++)
  h[0][i]=5;
}

ではおかしいですよね

どのようにすればいいのか教えてください
>>863 つぶやきシロー
>>866
void kan(char (*hairetu)[50]) または void kan(char hairetu[][50])
>>866
void kan(char (*hairetu)[50])
kan(&h[0][0]);

っていうふうに渡すのでしょうか?
871デフォルトの名無しさん:02/08/03 23:31
>>866
そういうソースをかくひととは仲良くなりたくありません。
こたえるのはイヤ。
>>870
kan(h) または kan(&h[0])
873デフォルトの名無しさん:02/08/03 23:41
>>870
ちがう。
866ですけど・・・>>871タンに教えて欲しいです(*´-`*)
>>870
ポインタについて修業し直せ。
C言語はポインタに始まりポインタに終わる
仮引数の型が分からないっていうのは
char (*h)[50];

h=(char(*)[50])calloc(10*50,sizeof(char));

これ自体理解してないのではない?
877デフォルトの名無しさん:02/08/04 00:30
とりあえずキモイコードである事には違いない。
別にキモクはないだろ。あるとすれば
char (*h)[50];
h=(char(*)[50])calloc(10,sizeof(char[50]));
のほうがよい
879通行人M:02/08/04 01:46
ポインタが理解できない初心者です。

char *strcpy(char *dest,const char *src)

  の↑にどうして*がないとだめなんですか?
  なんとなく配列はかえせないからポインタをかえすんだろうな
  というきはするんですが。 どなたかご教授お願いします。
880デフォルトの名無しさん:02/08/04 01:52
>>879君が思っているとおりですよ。
881通行人M:02/08/04 02:01
>>880

ありがとうございます。

なかなか独学だと2,3回本呼んだだけで理解できないですね。

・・・・・がんばります。
>>879
厳密には配列というデータは存在しないという事は覚えておくといい。
このへん書いてある本少ないからしゃあないが。
「配列というデータ」?????????
ポインタ:データを置いてる場所を示す(ポイントする)

char型のポインタ:char型のデータを置いている場所を示す
この場合、char型のポインタとわかっていなければ該当アドレスにあるデータが何なのか分からないんでしょうか、
それとも何型のポインタとして用いるかはプログラマに任せられているのでしょうか

char *chptr;
chptr = "stringA";
int num;

num = *chptr + *(chptr + 1);
このようにすれば*chptrの指すデータ(s)と*(chptr + 1)の指すデータ(t)をint型と解釈して(それぞれ115,116)足すことになり、
numの値は231となるわけで…

こう見ると後者(何型のポインタとして用いるかはプログラマに任せられている)が正しいように思えるのですが、どうなんでしょうか
>num = *chptr + *(chptr + 1);
これはchar型で加算を行なって、その結果をintにキャストしています。
ので、charがsignedな環境では結果は負数になるはず。

>何型のポインタとして用いるかはプログラマに任せられている
これは正しい
chptr が char* から int* になるわけではないよ。
> *chptr + *(chptr + 1)
この両オペランドが演算時に char 型 から int 型に変換されるだけ。
887884:02/08/04 05:03
>>885-886
ありがとうございました
ディレクトリを作る関数って何でしたっけ?
system()を使うのは不可。
>>888
OSによる。
>>889
Linux(gcc), Win(Visual C)共に、mkdir(dir,attribute)で出来ました。
891デフォルトの名無しさん:02/08/04 11:27
>>890
Windowsでは引数はひとつだぞ。direct.hをインクルードしないと文句言ってこないけど。
>>890
WinはAPIレベルではCreateDirectory。
>884
>ポインタ:データを置いてる場所を示す(ポイントする)
データってなに?この考え方だと関数ポインタが説明できないよ。
関数がデータだっていうのならこれでもいいかもしれないが。
場所って言う言葉がでるあたりが理解してないんじゃないかなと感じるところ。

ポインタ:オブジェクトを指すオブジェクト。
ここでいうオブジェクトは名前付きのメモリ領域のこと。
質問です。
その1、clsを使うにはどのヘッダーファイルをインクルードすればよいのですか?
その2、sleep()を使うにはどのヘッダーファイルをインクルードすればよいのですか?
その3、DOS画面の背景の色を変えることは出来ますか?
1.外部コマンドならstdlib.hのsystem()を使って呼び出す
2.Unix?Windows(windows.h)のSleep()しかしらない。
3.MS-DOSならANSIエスケープシーケンスをサポートしてるから
それでできるけども、Windowsのコンソールはどうだったか
>>895
ありがとうございます。
>>895
って、出来ませんでした;

#include<stdlib.h>
main(){
system();
}

こういうことですか?
system("cls") ;
>>898
やった!できました!どうもありがとうございます!
900デフォルトの名無しさん:02/08/04 15:57
 Cをタダで手に入れる方法はありませんか?もし無いなら一番安い入手方を
教えてください
901デフォルトの名無しさん:02/08/04 16:01
あります。
また質問です。
文字を画面の中心に表示させるにはどうすればいいのでしょうか。
>>894
>>902
OSは何?
>>903
windowsです。
>>902
油性マジック(OS非依存)
>>905
ってことは…できないのですか。
908デフォルトの名無しさん:02/08/04 16:12
コンソールプログラムをつくってるんだったら
(80-半角で数えた文字列の長さ)/2個のスペースを入れればいいんじゃないの
また質問です。
文字の大きさを大きくすることは出来ますか?
>904
めんどい
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE) ;
COORD cPos = {30, 12} ;
DWORD x ;
system("cls") ;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE) ;
SetConsoleCursorPosition(hConsole, cPos) ;
printf("abcdf") ;
WriteConsole(hConsole, "ghijk",5, &x, NULL) ;/*Win32API*/
return 0 ;
}
>>909
環境に依存します。
>>909
おおきく・・・ですか?(*´Д`)はぁはぁ
913デフォルトの名無しさん:02/08/04 17:08
えーっと、その…
アプリケーションをですね…あのですね、
終了させるにはですね、あの、
えーっと…どうすれば、いいのだったかな?
右上のばってんをおせばいいんじゃないのかな?
>>914
いや、そう言う意味じゃなくて…;
>>913
exit();
917デフォルトの名無しさん:02/08/04 17:35
>>913
abort();
コンセント・・(以下略
原子力発電所・・(以下略
質問です。
midファイルを再生させることは可能ですか。
もし可能なら、どうやるのですか。
>>920
ネタは別のところでおながいします
>>913
配線ごと引き千切る。
(ヤマトの真田さん直伝)
>>921
え、できないのですか?
次スレの1は圭子タン、キボンヌ
>923
自分ができないことを棚に上げて、他人に「できないのですか?」なんて言うなYO!
>920
検索するとできるようになるよ。
927デフォルトの名無しさん:02/08/04 20:48
√を使おうとして
#include <math.h>
を使ったのですが
コンパイルしようとすると

ファイル名.obj(ファイル名): Undefined symbol :sqrt_

というエラーメッセージが出てプログラムがうまく動きません
これはどうすればいいのでしょうか
928no name:02/08/04 20:49
#include<stdio.h>

int yukuri(int,int);
main(){
int m,n;

printf("???ツ?フ?????????ヘ?ケ?? ?,?");
scanf("%d,%d",&m,&n);

printf("?ナ?????????ヘ%d?ナ?キ\n",yukuri(m,n));
}

int yukuri(int m1,int n1){ /*???[?N???b?h?ン???@(???ォ?Z)*/
if(m1=n1){
return m1;
}
else if(m1>n1){
return yukuri(m1-n1,n1);
}
else{
return yukuri(m1,n1-m1);
}
}

/*?P?Q?W?ニ?V?Q?ナ???チ?ト?ン?ス???セ?ッ?ヌ?、?ワ?ュ?「?ゥ?ネ?「???ナ?キ.HELP me!!*/



>>927
コンパイラ書かないバカには教えない。 -m
>>929
親切だなw
>>930が今いい事言った!
932no name:02/08/04 21:01
#include<stdio.h>

int yukuri(int,int);
main(){
int m,n;

printf("??ツ?フ???????ヘ?ケ???,?");
scanf("%d,%d",&m,&n);

printf("?ナ??????ヘ%d?ナ?キ\n",yukuri(m,n));
}

int yukuri(int m1,int n1){ /*???[?N???b?h?ン???@(??ォ?Z)*/
if(m1==n1){
return m1;
}
else if(m1>n1){
return yukuri(m1-n1,n1);
}
else{
return yukuri(m1,n1-m1);
}
}

/*finish!!*/
>>932
いい加減SJISで書こうな。

man nkf

とかやってみ?
>>923
「C言語」にはMIDI再生機能はないよ
できるのはMIDIデバイスへデータを送信するくらいかなw
>>934
妙に簡単だけどね。タイミング考えないなら。
936no name:02/08/04 21:07
nkf -sやってみました。
すんまそん
937デフォルトの名無しさん:02/08/04 21:18
>>929
-lmじゃなくて?
938927:02/08/04 21:20
すいません>>927です
コンパイラは「lsic試食版」を使ってます
どうすればいいんでしょうか
>>937
言わない約束。
>>938
もしかして

★C言語で遊ぼう!★
http://pc3.2ch.net/test/read.cgi/tech/1028269762/l50

の人?
>>938
-lmath かな? いや、知らないけど
942927:02/08/04 21:33
>>940
違います
>>941
なんなんですかそれは
>>942
> lcc aaa.c -lmath
というように、オプションをつけてみろってことでは?
944927:02/08/04 21:56
>>943
こんどは

llb @link.i
llb: math.lib: No such file or directory

とつっぱねてきました
>>944
ちゃんと設定ファイルに LIBRARY のパスを設定してる?
>>944
ヘルプぐらい読もうね馬鹿チン
-lmathlib
947927:02/08/04 22:08
>>946
おお!!
来ました!
ありがとうございました

ど素人なものでヘルプを読むとかそういう
考え方ができませんでした
すいません
今度からヘルプを参照してみます
948デフォルトの名無しさん:02/08/04 22:08
今のレス見て思ったんですが、こんなに必要になる math.h が、
標準ライブラリに入っていない理由って、何でしょう。
外部の数値演算ライブラリをいろいろ使いたいからでしょうか?

コンパイラによってオプション指定がばらばらだから、
>>944のような質問が後を絶たない気がします。
>>948
普段使わないからだろ。
950デフォルトの名無しさん:02/08/04 22:20
あんまり使わないよね
>>948
入っているぞ。
>>948
そりゃ、実行ファイルのサイズが大きくなるからだろ。
(´-`).。oO(つーか、今更LSI-Cかよ‥‥)
>>952
使う関数だけリンクすればいいじゃん。
LSI-Cって何?
957デフォルトの名無しさん:02/08/04 23:06
>>950
新スレよろ
958ななし:02/08/04 23:25
>>900 'C'
959デフォルトの名無しさん:02/08/05 00:24
C言語
ファイルポインタを使って円の面積を計算するプログラム、教えてください。
ファイルポインタには半径1から10の数値があります。
出力結果は次のようになるようにして下さい
半径 面積





10
960デフォルトの名無しさん:02/08/05 00:26
なんでファイルポインタを使うのか良く分からん。
「ファイル上の10個の数値を使って・・・・」ならまだしも。
961959:02/08/05 00:28
ファイル上の10個の数値を使って・・・・ということです。
962デフォルトの名無しさん:02/08/05 00:28
それに数値の型も必要だ
963959:02/08/05 00:30
数値はdouble型で
964959:02/08/05 00:32
floatがいい
>>964
なぜわざわざC言語でfloatを使おうとするのか小一時間(略
floatの代わりにfroat使ってはいかが?

typedef float froat;
ワラタ。不毛すぎw
968デフォルトの名無しさん:02/08/05 01:03
>>959
結果的にはマルチ
969デフォルトの名無しさん:02/08/05 01:07
ネタっぽいが
ファイルの入出力、円周率の計算、表示
の全てを聞いているなら以下様々な洗礼を受けると思われ。
970959:02/08/05 01:11
#include <stdio.h>

#define PI 3.14 /* 円周率 */

main()
{
float r, S;

scanf("%g", &r);
S = r * r * PI; /* 円の面積 */
printf("%g\n", S);
}

こんな感じのを
*fp使って、ファイルには1から10の数字は与えられている場合どうするの?
971959:02/08/05 01:12
FILE *fp;
を使いたいんだが
972デフォルトの名無しさん:02/08/05 01:15
const charfilename[] = "ten_floats.dat";
float ten_float_ctrl[10] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0},ten_float[10];
FILE*stream = NULL;

stream = fopen( filename, "a+" );

if(stream){
//fwrite((void*)&ten_float_ctrl[0],sizeof (float),10,stream);
fread((void*)&ten_float[0],sizeof (float),10,stream);
fclose( stream );
}

あとはデバッガで追っていじってちょ。
973959:02/08/05 01:19
もう少しシンプルにならない?
#include <stdio.h>

main()
{
 float r,s
FILE *fp
みたいな形で
974959:02/08/05 01:20
もう少しシンプルにならない?
#include <stdio.h>

main()
{
 float r,s
 FILE *fp
みたいな形で
975デフォルトの名無しさん:02/08/05 01:23
>>974
お前は数値を一個づつファイルから読ませたいのかと。
・・・以下略
main(){
FILE *fp=fopen("num-list","rt");
float r; char s[80];

fgets(s,78,fp);
sscanf(s,"%f\n",&f);
printf("%f\n",r*r*PI);
}
>974
天然君? 972のプログラムが理解できないならプログラムしないほうがいいよたぶん。
978 :02/08/05 02:26
>>970
1から10まで与えられていることが分かっているのであれば、
こうでいいんじゃないか?

#include <stdio.h>
main()
{
FILE *fp = stdout;
fprintf(fp, "1 3.14\n2 12.56\n3 28.26\n4 50.24\n5 78.5\n6 113.04\n7 153.86\n8 200.96\n9 254.34\n10 314.0\n");
}
979通行人M:02/08/05 04:59
ついでにどなたかご教授お願いします。

#include <stdio.h>
main()
{
FILE *fp;
char buf[100];

printf("ファイル名を入力しなさい");
gets(buf);

  /*  getsならファイルに書き込みできるけど
   *  fgets(buf,100,stdin)ならファイルに書き込みできません。
   */
fp=fopen(buf,"w");


 if(fp == NULL)
 {
fprintf(stderr,"エラーです");
 }

fprintf(fp,"123");
fclose(fp);

}

(getsのbuf)と(fgetsのbuf)は、何がどう違うのですか?
980260:02/08/05 05:16
#include <stdio.h>

#define PI 3.14 /* 円周率 */

main()
{
float r, S;

scanf("%g", &r);
S = r * r * PI;
printf("%g\n", S);
}

こんな感じのを
*fp使って、ファイルには1から10の数字は与えられている場合どうするの?

981260:02/08/05 05:17
面積計算は必要です。
982260:02/08/05 05:18
出力は
1  3.14






な感じになるようにお願いします
>>979
getsとfgetsの仕様の違いに引掛ってるな。
getsは末尾の'\n'を取り除くが、fgetsは取り除かない。

だから、たとえば
fgets(buf, sizeof(buf));
の入力待ちで
hoge[cr]
したとき、bufに入ってる文字列は"hoge\n"だ。
"hoge\n"なんてファイル名は普通ないから、それで開けないのだろう。
末尾の\nを取り除くべし。
984983:02/08/05 06:04
すまん、細かいところ間違えた。
fgets(buf, sizeof(buf)); /* × */
fgets(buf, sizeof(buf), stdin); /* ○ */
だったな。
985983 ◆HIHn86y. :02/08/05 06:14
この時間だと人少ないし、次スレ立てておくかね。
986983 ◆HIHn86y. :02/08/05 06:19
立てますた

http://pc3.2ch.net/test/read.cgi/tech/1028495798/

2にCmachineについての記述を追加してみました。
ただ、省略されちゃった。
987通行人M:02/08/05 11:25
>>983

そうか!!
それを忘れてた!!!
ありがとうございます。
かれこれ5時間位なやんでました。
C言語なら、俺に聞け! <28>
http://pc3.2ch.net/test/read.cgi/tech/1028495798/l50






C言語なら、俺に聞け! <28>
http://pc3.2ch.net/test/read.cgi/tech/1028495798/l50


C言語なら、俺に聞け! <28>
http://pc3.2ch.net/test/read.cgi/tech/1028495798/l50

C言語なら、俺に聞け! <28>
http://pc3.2ch.net/test/read.cgi/tech/1028495798/l50




991 :02/08/06 21:43
ん?
C言語なら、俺に聞け! <28>
http://pc3.2ch.net/test/read.cgi/tech/1028495798/
ん?
埋め立て
DigDug
埋め立て〜
埋めるずら
ぺったんぺったんお餅つき
                           ,,,,;;;;;;;;;;;;;;;;;;;;,,,,,,
                         ,,;;;;;;;;;;;;;;;;;;;;;;---、;:;:;:;:;:,,,
                       /;;;;;;;;;;,-'''"     ゙'''ヽ;;;;;;ヽ
                       /;;;;;;;;;'''           ヽ;;;;l
                      /;;;;;;;;;'"             _ヽ、
             r‐、'" )    i';;;;;;;;;;;            ,,;;;;;;-=ヽ、
            /  / /     |;;;;;;;;;;|  ,,,,,;;;;;;;;;-、    ‐'"゙_,,,,,,,_\
          r‐、' ヽ/ヽ/゙l    |;;;;;;;;/ /-─'''''''"ヽ   "‐=二 ̄ヽ、  い〜ち
         /  ノ / /、ノ     |;;;;;;|  '",,,-==‐ ヽ  " 、      ヽ   に〜い
        /ヽ、/ヽ/ヽ/ /    ,┴、;|  ==ニ-‐'" ,    ヽ、     ゙i   せんげっと
       /ヽ、/  / /、_/     |l |ヽl        /l      .)\    i
      /   /--/、/_ /     \|lノl       /└-‐ヽ-‐'    ヽ   i
     / ─'''"    ''、/       l、 ゙|      /   ,,---'ニ=メ i  .|
    /          /        ヽ-i      i'  /-l「ヽ┼+// ;;  /
   ./ ─-、__,,-- /          ヽ、    ヽ=ヽ─++-''ノ    /、
  /        / ̄ヽ          ,,,,\    ヽ  ゙‐─''''''"~    / ヾヽ、
 /        /    ゙\____,,-''''"   \               / ) 
./        /     l'"      ヽ、    \ヽ、           / /
        l      l    __,,,,ノ      \ ゙''ヽ 、,,,__,,;-'" /
        l      ,,,-─''"             ヽ、,,,       ,,‐"
       人 ,,,,,,─''"                    ゙゙゙'''''''''''''''"~
     -‐''''"/
またーりげとー
999 :02/08/06 22:16
( ´∀`)取ろうかなぁ
げげ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。