C言語なら俺に聞け( ..
[2ch|▼Menu]
596:デフォルトの名無しさん
07/04/07 23:30:20
>>595

ガッ

597:デフォルトの名無しさん
07/04/07 23:51:36
>>591
暇だったんで俺が決めといたんだ

598:デフォルトの名無しさん
07/04/08 00:09:58
>>594
'¥0'なら

599:デフォルトの名無しさん
07/04/08 00:32:27
配列の平均値を求める関数aveを作ってみたんですが
これで表示が1としか表示されないんだけどなんでですかね・・・

#include <stdio.h>
void ave(int array[]);
int main(void){
int a[5]={1,2,3,4,5},i;
ave(a);
return 0;
}
void ave(int array[]){
int sum=0,i,m;
m=sizeof(array)/sizeof(int);
for(i=0;i<m;i++){
sum+=array[i];
}
printf("平均=%d\n",sum/m);
}

調べてみたら、ave関数のm=sizeof(array)/sizeof(int)
がおかしくて、mに1が入ってみるみたいなんです。
配列aの要素数は5だから、mに5を入れたいんだけどどうすりゃいいんですかね?

600:デフォルトの名無しさん
07/04/08 00:39:08
>>599
Cでは配列を関数に渡すことはできない。素直に個数も渡すしかない。
cf.
void ave(int * array, int nOfArray) {
...;
}

601:デフォルトの名無しさん
07/04/08 00:42:02
>>599
void ave(int array[]){
これはダメだな
int *array と同じでポインタのサイズしか渡さない
int *array のポインタサイズ(4バイト) / int のサイズ(4バイト)=1

void ave(int array[],int size)
{
int sum=0,i,m;
m=size/sizeof(int);
・・・・・
}
int main()
{
・・・・
ave(a,sizeof(a));
とするとか

602:デフォルトの名無しさん
07/04/08 01:13:19
you! c++でいっChinaよ

603:デフォルトの名無しさん
07/04/08 01:21:58
C言語では、関数に配列を渡して、渡された配列の要素数を調べる関数ってのは作れないのか。。。
main関数で要素数を入れなきゃダメなんですねどうもありがとうでした

604:デフォルトの名無しさん
07/04/08 01:38:01
出来ん事も無いけど
STLとか使ったら一瞬で出来ることをなんで悩まないといけないのか
って鬱になるから普通はしない

605:デフォルトの名無しさん
07/04/08 01:39:41
課題でeggx(C言語)てので正五角形を作って来いって言われたのですが途方にくれてます。
多角形を描く関数(fillpoly)もあるようですが、頂点の座標がわからないと描けないようで困っています。

606:デフォルトの名無しさん
07/04/08 01:54:27
頂点の座標なら
円の式と、直線の式の交点を求めるとか
sin、cosを使うとか

607:デフォルトの名無しさん
07/04/08 01:57:04
プログラムと何の関係があるのか分からんが、
正五角形の頂点なら、 k=0, 1, 2, 3, 4 として

x = cos(2π/5 * k)
y = sin(2π/5 * k)

で求まるだろう



608:デフォルトの名無しさん
07/04/08 08:32:47
Cのライブラリ全てが説明されている本って無いですか?
言われて分かる人なら X680x0 libc みたいな本を探している、と言えば早いですかね。

使用する関数名が分かっていれば、man して使い方を知る事は出来るものの、
どんな関数があるのかが分からずで困ってます。

対象は Linux / FreeBSD で、ソツ無く使える本を。

609:デフォルトの名無しさん
07/04/08 09:10:47
man2とかman3のディレクトリをlsしちゃだめなのか?

610:デフォルトの名無しさん
07/04/08 09:41:14
標準Cの範囲なら規格書で充分だろ。

611:デフォルトの名無しさん
07/04/08 09:46:47
セクション2はCの規格じゃないけどな。


612:デフォルトの名無しさん
07/04/08 10:13:48
>>604
興味本位でやってみたいからヒント頼む

613:デフォルトの名無しさん
07/04/08 11:32:32
>>612
C++をやれ

614:デフォルトの名無しさん
07/04/08 12:02:01
以後、配列を扱う場合はかならず構造体の単一メンバにすること。

615:デフォルトの名無しさん
07/04/08 12:02:46
オーライリーのC Pocket Referenceに種類ごとに標準関数の説明が載ってるよ

616:デフォルトの名無しさん
07/04/08 12:46:15
>>608 は、Unixのシステムコールも含んで、載ってるやつがほしいんじゃないか?

617:デフォルトの名無しさん
07/04/08 12:58:11
>>608
あんまりない無い。
URLリンク(www.linux.or.jp) 結局これが一番いいんじゃないかと思う。

入門書としては、UNIX-Cプログラミングを唱っているもので、プロセス・スレッド、
mmap、socletなんかを扱っているものもあるが、中途半端なものばかり。
最終的にはmanみろってことなのかもしれない。

UNIX共通に通用するベース技術・仕様の本といったら、POSIXの規格書とか
解説書あたりがお望みのものに近いか?

BSD系はソースが公開されているんだからそれを読んでコミニュティで
解決しろというスタンスが濃い。
Linuxはアプリケーションソフトばかりがとりだたされる傾向にあって、
コアなライブラリ解説なんて皆無に等しい。
オライリーのカーネル本とか、デバドラ本くらいか。

618:デフォルトの名無しさん
07/04/08 13:11:02
「ふつうのLinuxプログラミング」あたりでファイルシステムとかストリーム
とかシグナルとか、考え方から理解しておいて、あとはmanなんだろうなぁ。


619:デフォルトの名無しさん
07/04/08 14:09:16
>>613
Cではできないのですか?

620:デフォルトの名無しさん
07/04/08 14:15:22
>>619
STL は C++ 標準ライブラリ

621:デフォルトの名無しさん
07/04/08 14:55:09
スティーヴンス本も知らんのか君達は

622:デフォルトの名無しさん
07/04/08 15:17:13
(´・ω・`)知らんがな

623:デフォルトの名無しさん
07/04/08 15:26:18
C言語500の極意(うろおぼえ)みたいな本で十分だろ。

624:デフォルトの名無しさん
07/04/08 18:35:41
608です。
皆様からのレスは本屋で携帯から読めて大変参考になりました。

>>615
>オーライリーのC Pocket Referenceに種類ごとに標準関数の説明が載ってるよ

C Desktop Reference なる本は見掛けたのですが、これの事?
内容は本の厚さに比例してそこそこと言う感じでした。
初めてCを使う人には良いかも。

>>623
>C言語500の極意(うろおぼえ)みたいな本で十分だろ。

これを見掛けた時は「これか!?」と思ったのですが、内容が・・・
参考になる点も多かったのですが、今求めている物とは大きくずれてました。


いざ探してみると満足の行く物は確かに無いですね。
みんなどうやってプログラミングしているんだろう?と不思議になってきました。
今にして思うと X680x0 libc は偉業と感じます。
これには標準的な関数ならバッチリ載っているので、残りは
>>617 を参考にするのがベターの様です。

本屋で探した感じでは C言語大辞典 がわりとイイ線行ってたので
今度は神保町あたりでじっくり探してみたいと思います。

レスしてくれた方々、有難う御座いました。

625:デフォルトの名無しさん
07/04/08 21:36:11
配列って、絶対アドレス順にしかできないの?
a[0]とa[1]はメモリ上となりあわせで
a[0]アドレスが100ならa[1]は99といった感じで使いづらい・・・
malloc関数を使ったら、a[0]〜a[それまで]のものが全部初期化されちゃって使いづらい。
今までの配列の要素を変化させずに動的に配列の要素数を変化させることはできないですか?

scanf関数を使うたびに配列の要素をひとつずつ増加させるのを作りたいんだけど。
int ct=0,m,*data;
data=(int*)malloc(100*sizeof(int));

while(1){
scanf("%d",&m);
if(m==0)break;
data[ct]=m;
ct++;
}

たとえばこれだと100個以上の入力されるとエラー起こすし、
5個しか入力しないと残りの95個もったいない
どうすりゃいいですかね?

626:デフォルトの名無しさん
07/04/08 21:39:05
そのための線形リストだ。

627:デフォルトの名無しさん
07/04/08 21:42:26
>>625
・realloc
・std::vector (C++ 限定)

628:デフォルトの名無しさん
07/04/08 22:09:43
ビット演算の意味がわからない。

629:デフォルトの名無しさん
07/04/08 22:11:34
#include<stdio.h>
void main(void){
int x,y;
scanf("%d,%d",&x,&y);
printf("%d",x/y);
}

5行目:0で割っています と出るんですが、何故なんでしょうか?
x,yには0以外の数字を入力しています

630:デフォルトの名無しさん
07/04/08 22:15:11
"%d,%d"のフォーマット通りに入力してる?

631:デフォルトの名無しさん
07/04/08 22:15:15
>>620
>>603
>C言語では、関数に配列を渡して、渡された配列の要素数を調べる関数ってのは作れないのか。。。
に対して
>>604
>出来ん事も無いけど
って答えているので、STLってかテンプレート使わずにC言語の機能だけでできるのかなぁと思って聞いてみたわけです。

なんか粘着みたいですいません。

632:デフォルトの名無しさん
07/04/08 22:19:44
>>624
いや"C Pocket Reference"
もれは英語版を使ってるけど一応ISBNは
0-596-00436-2

633:629
07/04/08 22:22:42
>>630
すいません、フォーマット通りとはどういうことでしょうか?

634:デフォルトの名無しさん
07/04/08 22:26:52
>>630じゃないが
たとえば
$ 4,2
にように入力してるかってこと

635:デフォルトの名無しさん
07/04/08 22:27:11
10,2
とか

636:デフォルトの名無しさん
07/04/08 22:29:00
123,456もだな

637:629
07/04/08 22:29:46
>>634-635
やってませんでした。今やったらできました。ありがとうございます!

638:デフォルトの名無しさん
07/04/08 22:36:36
>>636
いやwwwそれいったらintの範囲のその範囲乗までレスがつくぞ

639:デフォルトの名無しさん
07/04/09 07:17:09
scanfの戻り値みろよ…

640:デフォルトの名無しさん
07/04/09 10:18:00
すいません、どなたかわかる方がいれば回答お願いします
C言語のコマンドラインから引数を渡すプログラムで
ちゃんと動いてくれませんorz
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]){

FILE*fin,*fout;
char ss[256];
if(argc!=3){
printf("引数の数が違います\n");
exit(1);
}
if((fin=fopen(argv[1],"r"))==NULL)
{
printf("入力ファイルをオープンできません\n");
exit(1);
}
if((fout=fopen(argv[2],"w"))==NULL){
printf("入力ファイルをオープンできません\n");
exit(1);
}
while (fgets(ss,256,fin) !=NULL){
fputs(ss,fout);
}
fclose(fin);
fclose(fout);
return 0;


}

641:デフォルトの名無しさん
07/04/09 10:21:03
これをコマンドプロンプトやbcpadなどで実行しても最初の引数の数が違います、
としか表示されなくて・・・
色々調べて試行錯誤したのですが結局一晩かけてもわかりませんっでした
こんな自分は問題解決能力がないからPGむいてないのでしょうか(´Д`;)

642:デフォルトの名無しさん
07/04/09 10:24:50
>>641
俺の環境ではちゃんと動いたけど?

643:デフォルトの名無しさん
07/04/09 10:25:15
>>641
問題無いように見えるけど・・・

644:もしかして、コマンドライン引き数を知らないと言う落ち?
07/04/09 10:38:51
>>640
>これをコマンドプロンプトやbcpadなどで実行しても最初の引数の数が違います、
>としか表示されなくて・・・

漏れの環境では、引き数を指定しないで実行したらそうなった。
期待通りの動作じゃないのか?

645:デフォルトの名無しさん
07/04/09 10:45:37
学びたての頃一日かけてやっとセミコロンが一つ足りないことに気付いたことがある俺の勝ち

646:デフォルトの名無しさん
07/04/09 10:50:17
セミコロンが一つって思うだろうがたかが1日じゃないか
3日悩むよりずっといい
まだまだだな

647:デフォルトの名無しさん
07/04/09 11:00:17
>>640のfinの宣言部で
FILEと*finがくっついて1つの単語になってるように見えるのはオレだけ?

648:デフォルトの名無しさん
07/04/09 11:04:53
俺の三倍とはこやつやりおるわ…
hoge.exe piyo.txt
のようにコマンドプロンプトに入力すればファイルの中身を表示できるはずです。
くらい書いとけばいいのに、不親切なテキスト(かどうか知らんが)だなぁ

649:デフォルトの名無しさん
07/04/09 11:09:22
漏れなんて、ソースファイル末尾の改行がないためにNULLポン消えなくて一週間悩んだぜ。
#コンパイラが生成するアセンブリ出力の改行が足りなくなると言う素敵なバグの所為だったんだけど。

650:デフォルトの名無しさん
07/04/09 11:18:17
>>641
>これをコマンドプロンプトやbcpadなどで実行しても最初の引数の数が違います、
ってことは
printf("引数の数が違います\n");
が実行されて表示されてるってことで
それが実行される条件はプログラムに与えられた引数の数
だからtest.exe a.txt b.txtのようにプログラムに与える引数を変えればいいんじゃない

問題解決能力じゃないと思う
たとえばできるだけ客観的に説明する能力とか不足を補う理解力とか
誰もが通る道だけどな向き不向きなんてすぐにはわからん

651:デフォルトの名無しさん
07/04/09 11:21:31
>>650
お前は日本語で説明する能力を養え

652:デフォルトの名無しさん
07/04/09 11:26:54
PGに不向きな奴は1年持たない
1年持てば問題なす

653:デフォルトの名無しさん
07/04/09 12:42:16
もれなんて一切コメントがないという芸能人の浮気疑惑のようなプロジェクトを引き継いで
マイプライベートタア〜イムを返上して解読&コメントつけていったのに
1ヵ月後に会社が清算を迎えたo... rz

654:デフォルトの名無しさん
07/04/09 15:35:11
>>640
ちゃんと動くんだが?

655:デフォルトの名無しさん
07/04/09 20:53:17
フリーウェアの秀丸のサイトを教えてください

656:デフォルトの名無しさん
07/04/09 20:54:50
は?

657:デフォルトの名無しさん
07/04/09 20:55:17
URLリンク(www5.ocn.ne.jp)

658:デフォルトの名無しさん
07/04/09 21:15:23
#include <stdio.h>
int main(void) {
/*文*/
return 0;
}
入門書では上のように学んだんですが、コンパイルできれば次のような形式でも
問題ないのでしょうか?
#include <stdio.h>
main(){
/*文*/
}

659:デフォルトの名無しさん
07/04/09 21:22:17
>>658
コンパイルできても上の方が望ましい。

660:デフォルトの名無しさん
07/04/09 21:25:08
いや、下のでも問題ないよ。

661:デフォルトの名無しさん
07/04/09 21:30:00
戻り値の書かれていない関数定義はintを返すと見なされる(Cではだっけ?)
ので、いいっちゃいい。(許容されるという意味で)


662:デフォルトの名無しさん
07/04/09 21:31:27
return 0のほうか。
戻り値を使う予定がないならなんでもいいよ。
型は>>661にあるようにintになるがどんな値になるかは不明。


663:デフォルトの名無しさん
07/04/09 22:46:13
>>659->>662
レスありがとうございます。他の人のプログラム見せてもらったとき
たまたま見つけて疑問に思った程度なんです。とりあえず、
自分で書くときは習ったやりかたでやっていこうと思います。

664:デフォルトの名無しさん
07/04/09 22:58:14
>>663
たぶん書き忘れじゃないかと思ふ

665:デフォルトの名無しさん
07/04/09 22:58:37
>>662
>intになるがどんな値になるかは不明。

あれ?return書かない場合は0返すんじゃなかったか?

666:デフォルトの名無しさん
07/04/09 23:06:02
クラスのstaticで宣言したメンバー関数の関数ポインタを持つ事って可能ですか?

667:デフォルトの名無しさん
07/04/09 23:10:06
>>665
C++では前からそうだが、CではC99から

>>666
C++はスレ違いだが、静的メンバ関数は、非メンバ関数同様に扱える。
ようするに静的メンバ関数へのポインタはただの関数へのポインタで扱える。

668:デフォルトの名無しさん
07/04/09 23:11:14
>>666
可能
VCで試した
メンバーへのポインタじゃなくてC言語のように普通の関数へのポインタ

669:デフォルトの名無しさん
07/04/09 23:18:43
参考書とかネットの記事とか見てるとmain()内の最後で、

  return 0;

  return (0);

って2種類の書き方見るんだけどこれらに明確な違いってあるのか?

低レベルな質問ですまん ><

670:デフォルトの名無しさん
07/04/09 23:24:11
>>669
括弧いらない
あっても結果は変わらない

671:デフォルトの名無しさん
07/04/09 23:25:28
違いはない。ただし括弧を付けない書き方が一般的。

昔はreturnに括弧を付けなければならなかった。
現在、括弧は不要になったが、あっても式の一部として扱われるのでコンパイルは通る。

672:デフォルトの名無しさん
07/04/09 23:26:01
>>670
レスありがとう。やたら気になってたんだ

673:デフォルトの名無しさん
07/04/09 23:28:21
>>669
returnは関数じゃなくてステートメントだから付けないてよい。
付けてもエラーにはならないが a = b + c を a = (b) + (c) などと書くのと同じことで冗長。

お作法的な話で言えば、綴りを間違って retrn 0 と書けば即コンパイルエラーだが、
retrn(0) と書いてしまうとそういう関数があるものと仮定されリンク時までエラーが発覚しない。

674:デフォルトの名無しさん
07/04/09 23:29:06
>>671
いつの話だ。

675:デフォルトの名無しさん
07/04/10 01:48:13
sizeof expr はつけなくてよいと分かっていても括弧つけてしまうな…

676:デフォルトの名無しさん
07/04/10 02:36:33
これは確かに使い分けに迷う。
sizeof(型);
sizeof 変数;


677:デフォルトの名無しさん
07/04/10 02:42:05
演算子もいってみりゃ関数みたいなもんじゃん
ってことで()付けてるけどいいのか?

678:デフォルトの名無しさん
07/04/10 03:55:13
>>676
変数ではなく式

679:デフォルトの名無しさん
07/04/10 04:01:44
>>677
別に構いませんよ。
++(*(&(i)));

680:デフォルトの名無しさん
07/04/10 05:33:50
激しくうっとうしいわw

681:デフォルトの名無しさん
07/04/10 06:05:28
式だったら尚更()つけないとね

682:デフォルトの名無しさん
07/04/10 10:55:06
sizeof は、長い行の中に入ることもあって () なしだと見づらくなる場合があるからな
でもsizeof() じゃなくて、sizeof () にしてるな。

>>671
return に括弧が必要なときってあったか?

683:デフォルトの名無しさん
07/04/10 13:59:08
mem = malloc(len * sizeof * mem);

684:デフォルトの名無しさん
07/04/10 15:55:00
arrayという2次元配列にintの数値が入っています
for(i=0;i<array[0][j];i++)という風for文の条件式にしようとしても出来ませんでした
こういう場合はどうすればいいのですか

685:640
07/04/10 16:10:53
やはりちゃんと動いてくれません(´Д`;)
>>650さんの意味がよくわからないのですが
>>if((fin=fopen(argv[1],"r"))==NULL) の所のargv[]を1ではなくて他
の数値を渡せということでしょうか??



686:デフォルトの名無しさん
07/04/10 16:15:25
ちゃんと動かないって…もうちょっと他人にわかるように説明しろよ。
* どういう方法で起動していて、
* どういう挙動をして欲しいのか、
* そして実際はどういう結果になっているのか

687:362
07/04/10 16:38:24
>>363
型を見てみたらsignedcharでした。
この型しかソケット通信では送れないのでしょうか?
>>364
ぐぐってもデータの転送順がかわることしかわかんなかったです><

多くのデータを一度にsendで送るいい方法はないのですか><

688:デフォルトの名無しさん
07/04/10 17:06:16
bcpadから直接起動してるから引数渡せてないと予想

689:デフォルトの名無しさん
07/04/10 18:53:39
趣味で麻雀をやってるんだけど、自分の打ち方がどれぐらい強いのか試そうと思ってC++のコンパイラさえあればあとは言語が書ければ代打ちソフトが作れるってdllを見たんでCをしてみようと思うんですけど。
これを読めばとりあえず素人はなんとかなるとか、このコンパイラが素人向けでわかりやすいなどありましたら教えてください。

一応Delphiは触るだけ触ったことはあるので言語そのものにアレルギー反応なんかは起こしませんけど、実用的なソフトを作ったことがないのでアルゴリズムなどちんぷんかんぷんです。

690:デフォルトの名無しさん
07/04/10 19:00:07
にh

691:::
07/04/10 19:00:55
C言語習ったばかりなんですが、システムを組んでみたいと思ってます。
システムを組むための参考書や問題集は売ってますかね?自分で一から
システムを作るのはやはり難しいですか?

692:デフォルトの名無しさん
07/04/10 19:01:30
システムの定義を教えてくれ

693:デフォルトの名無しさん
07/04/10 19:03:29
>>690
わかりにくかったなら省きますけど要は、素人におすすめできるコンパイラ(いつまでも使えるのならなおいいけどわかりやすさ優先。)と素人向けの参考書を教えてくださいってことです。
OKですか?

眠いのでちょっと日本語がおかしかったのは見逃してください。

694:デフォルトの名無しさん
07/04/10 19:41:38
>>693
おまいは、>>690を見て
>にほんg(ry
って分かったのかよw
だったらなぜ、そもそも改行が出来ないんだ


WindowsならBCCでおk

695:687
07/04/10 19:58:19
キャストしてもデータが途中までしか送れません><
どうすればいいんですか

696:デフォルトの名無しさん
07/04/10 23:22:31
C言語で、char型の配列を確保する時に
領域を指定しないで宣言する方法ってありますか?

char *s[]; ←のように宣言してもsのサイズが不明、もしくはゼロとか出て
うまくいかないんですが、何かいい方法ありますか?
因みにこの問題ではmallocを使わないでやるという事が前提になってます。

697:デフォルトの名無しさん
07/04/10 23:24:37
callocもしくはreallocを使えばいい

698:デフォルトの名無しさん
07/04/10 23:28:27
>>695
じゃあ二回に分けて送れば

699:デフォルトの名無しさん
07/04/10 23:35:21
質問です

AまたはBならCをする

if( A || B )
{
  C ;
}

という条件文をA、Bわけて記述した時に、
if( A )
{
  C ;
}
else
{
  if( B )
  {
    C ;
  }
}

こう記述できると思いますが、Cを1回だけ使うような記述の方法はあるでしょうか?

700:デフォルトの名無しさん
07/04/10 23:39:14
最近、こんなトンチみたいな問題だす学校、多いのかね?

701:デフォルトの名無しさん
07/04/10 23:41:08
>>689
それはつまり1人用の麻雀ゲームを作ろうというわけですね
それなら簡単なGUIと思考ルーチンが必要です
思考ルーチンは現在の状況, つまり引いた牌と持ち牌(っていうのか?もれは麻雀やらないから言い方違うかも)
と相手の打った牌などから次にどの牌を打つかを決める一連の思考の手順のことです
これは一般的に一種類あるいは数種類の思考パターンを用意し, これらのような決まった処理のことを
アルゴリズムと言う
アルゴリズム(思考手順)そのものは言語に依存しないので(もちろん言語によって書き方は異なるかもしれないけど)
すでに知っている言語があったら新たにCとかC++を勉強しなくてもOK
思考手順そのものを研究するのが目的ならVBやJavaなどの簡単にGUIが作れる言語が(個人的には)おすすめ
これを足がかりにほかのゲームや実用ソフトを作りたいなら将来にわたって使っていけるような言語を選ぶのもあり(CとかC++)
もしLinuxなどのUNIX系OSや, プラットフォーム非依存をターゲットとするならJavaが一番手っ取り早い
GTKやwxWidgetなどのクロスプラットフォームのツールキットを使うこともできる
(こういったツールキットは大抵複数の言語に対応している)
あるいはPythonなどのスクリプト言語を使ってみるのもあり

でも, ひとこと言わせてもらうと
> 自分の打ち方がどれぐらい強いのか試そうと思って
の意図はいまいちよくわからないが
作ったプログラムと自分で対戦すると言うなら
それは一人二役でゲームをするのと同じだからちょっと無意味っぽいと(個人的に)思う
また自分の思考をプログラミングしてほかの人やプログラムと戦わせたいのなら相当の覚悟が必要
人の思考は想像以上に複雑で, 無意識や勘なども作用してくるから
完全に自分の思考回路をプログラミングすることは(現実には)不可能に近い
したがって出来上がったプログラムは君自身より弱い
また, 何手か先を読むような(ありふれた)機能を盛り込む場合でも
計算しなければいけない手数は爆発的に増えるから(計算量とメモリーの増加), それをいかにして押さえるかとか
いろいろとテクニックも必要になってくる

ここまで考えるとかなり手間がかかる
もれは大学の卒論がチェスのゲーム理論だったからよくわかる

702:デフォルトの名無しさん
07/04/10 23:44:16
>>699
do
{
    if( !A )
    {
        if( !B )
        {
            break ;
        }
    }
    C ;
}while(0);

703:デフォルトの名無しさん
07/04/10 23:48:24
>>699
なぜそうするのかはわからんが
単純にフラグをつけるのもいいんじゃない?
Aが真ならflag = TRUE;してBのところでflag == TRUE;ならCを実行しないとか?

704:デフォルトの名無しさん
07/04/10 23:49:25
>>699
if( A )
{
  C ;
}
else if( B )
{
  C ;
}

これじゃダメなのか?

705:704
07/04/10 23:52:50
>>699
あー1回だけの記述か


706:デフォルトの名無しさん
07/04/10 23:54:18
>>699
if(A) {
 goto l;
} else if(B) {
 l: C;
}

707:デフォルトの名無しさん
07/04/11 00:01:42
>>699
if(A) goto label1;
if(B) goto label1;
goto label2;
label1: C;
label2: ;

708:デフォルトの名無しさん
07/04/11 00:18:16
>>699人気だなww

709:デフォルトの名無しさん
07/04/11 00:30:03
で、本当にこれ宿題なのか?
だとしたらこんな腐った問題を出す教師ってどんなやつなんだ。

710:デフォルトの名無しさん
07/04/11 00:35:24
Q.腐った問題を出す教師自体が腐ってる確率を求めるプログラムを作りなさい

711:デフォルトの名無しさん
07/04/11 00:40:44
>>710
int main()
{
printf("腐った問題を出す教師自体が腐ってる確率=%d%%",100);
return 0;
}

712:デフォルトの名無しさん
07/04/11 01:01:48
>>701
えっとですね、あんまり必要ないかと思って省いてしまったんですけど。
東風荘っていうネット雀荘みたいなものがあるんですけど、そのゲームの画面の状況から変数を作るdllを見つけてですね。
上がりや聴牌の判断もそのdllの関数がやってくれるので私はその変数の扱いを設定するだけで麻雀の代うちソフトが作れるようになるわけなんです。
だから、相手は人だし麻雀というゲームを遊ぶための土台の部分は配布されているので単純にアルゴリズムを考えるだけでOKってことなんですよね。

テクニックとしては、プログラムのテクニックよりは麻雀のテクニックのほうが重要だとおもうので簡単という言葉を使わせてもらってます。

713:デフォルトの名無しさん
07/04/11 03:44:18
そんな面白そうなものがあるのか。
ちょっと探してこよう……と思ったら一発で見つかった。

714:701
07/04/11 05:22:28
>>712
ほほー便利だなー
それなら自分がどんな風に思考しているのかと
どうやってそれをアルゴリズムにするのかを悩むだけでいいのかw


715:デフォルトの名無しさん
07/04/11 07:56:24
if (A) {
if (B) {
C;
}
}


716:デフォルトの名無しさん
07/04/11 08:00:29
>>715
っ A==1 B==0

717:デフォルトの名無しさん
07/04/11 08:07:36
>>715
おちつけ
それは、A||Bは(又は)ではなくてA&&B(喝)だ

718:デフォルトの名無しさん
07/04/11 08:07:36
実際こういう場合はどうしたらいいの?
素直に判別式に論理演算使えってこと?

719:デフォルトの名無しさん
07/04/11 08:17:18
switch (x) {
case A:
case B:
C;
}

720:デフォルトの名無しさん
07/04/11 08:22:28
逆に論理演算を使いたくない理由ってのがわからない

721:デフォルトの名無しさん
07/04/11 08:22:53
というかその為に論理演算子があるんだから使ってやれよ…
論理演算子が泣いてるぞ。

722:デフォルトの名無しさん
07/04/11 08:23:43
>>719
なんじゃそりゃーーー!(松田優作風に

723:デフォルトの名無しさん
07/04/11 08:23:56
AまたはBならCをする。
=> AでないかつBでないならCはしない。

というド・モルガンの法則を理解するための課題であった。

なわけはないか。


724:デフォルトの名無しさん
07/04/11 09:22:50
>>719
caseは定数しかとらないので
A, Bのような式はだめ

725:デフォルトの名無しさん
07/04/11 09:23:38
>>699
void f(void){
 C;
}
int main(void){
 if(A){
  f();
 }else if(B){
  f();
 }
}

726:デフォルトの名無しさん
07/04/11 09:28:07
#define SHE C
void main(void){
 if(A){
  SHE;
 }else if(B){
  SHE;
 }
}

727:デフォルトの名無しさん
07/04/11 09:29:03
↑訂正
×void main(void){
○int main(void){

728:デフォルトの名無しさん
07/04/11 09:52:06
>>723
setjmp&longjmp関数の有用性を教えるための課題

729:デフォルトの名無しさん
07/04/11 10:08:09
invalid digit "8" in octal constant
invalid digit "9" in octal constant
このコンパイルエラーって何ですか?教えてください!

730:デフォルトの名無しさん
07/04/11 10:15:07
>>729
8進数なんだから0〜7までで表せよ、
8や9なんてねーよバーカ

っていうエラー。整数の頭に0をつけてるだろ。

731:デフォルトの名無しさん
07/04/11 10:15:55
>>729
#include<stdio.h>
int main(void){
printf("%d\n", 012); /* 数値の頭に 0 が付くと 8進数 */
printf("%d\n", 12);
return 0;
}

732:729
07/04/11 10:22:40
>730さん
>731さん
ありがとうございます!
参考になりました。

733:695
07/04/11 10:35:06
整数やら文字列が入った構造体を、ひとつの文字列にするいい方法はないですか?><

734:デフォルトの名無しさん
07/04/11 10:44:08
>>733
関数を作る

735:733
07/04/11 10:48:45
整数やら文字列が入った構造体を、ひとつの文字列にする関数を作りたいのですが、いい方法はないですか?><

736:デフォルトの名無しさん
07/04/11 10:51:23
>>735
構造体晒せ

737:デフォルトの名無しさん
07/04/11 10:52:16
いつまでこのアホタレを甘やかす気ですか?><

738:735
07/04/11 11:02:14
struct test {
 int i;
 char c[10];
  struct kouzoutai {
  int seisuu;
  double kazu;
  int suu;
  char moji[10];
 }kou;
};

739:デフォルトの名無しさん
07/04/11 11:04:39
>>738
釣り乙
死ね

740:735
07/04/11 11:04:41
全部snprintfとかstrcatで繋ぐのはめんどくさいです
要するにバイト列と文字列を相互変換できる方法が知りたいのです><

741:735
07/04/11 11:05:18
自己解決しました><

742:753
07/04/11 11:06:53
爆釣ありがとうございました><

743:740
07/04/11 11:07:14
>>741
してないです><
とりあえず16進数でずらずらと数字を並べてみることにするです><

744:743
07/04/11 11:08:48
できました><

745:743
07/04/11 11:21:14
>>744
まだやってません><

ところで、
sprintf(text, "ABC");

sscanf("ABC", "%s", text);
って
strcpy(text, "ABC");
と同じですか?

746:743
07/04/11 11:39:57
隣の後輩が教えてくれました><
ありがとうございました><

747:745
07/04/11 11:44:37
>>746
><

なんとか自分でやってみます。ありがとうございませんでした><

748:デフォルトの名無しさん
07/04/11 12:20:11
カオスすぎです><

749:747
07/04/11 12:26:13
初心者なのですいません><

750:749
07/04/11 14:57:11
構造体へのポインタをunsigned char*型にキャストして
1バイトずつ2桁の16進数に直したら
構造体と文字列の相互変換ができました><
unsigned char *p;
unsigned char text[1024], buf[1024];

strcmp(text, "");
p = (char *)&test1.kou;
for(i=0; i<sizeof(test1.kou); i++)
{
 sprintf(buf, "%02x", (unsigned char)p[i]);
 strncat(text, buf, 2);
}

751:749
07/04/11 14:59:26
p = (char *)&test2.kou;
for(i=0; i<sizeof(test2.kou); i++)
{
 strncpy(buf, &text[i*2], 2);
 sscanf(buf, "%02x", &((unsigned char)p[i]));
}

752:749
07/04/11 15:00:31
以上オナニーでしたありがとうございました><

753:749
07/04/11 15:01:26
また初心者を装った釣りに来ますのでよろしくです><

754:デフォルトの名無しさん
07/04/11 15:02:25
もうこなくていいよ

755:751
07/04/11 15:04:22
>>752-754
ほんとに初心者なのにひどいです><

756:735
07/04/11 15:06:39
すみませんなんか偽物がレスして話進んでるんですけど><
>>738から全部偽物です><

757:755
07/04/11 15:09:48
なら>>756も偽者ですね><

758:デフォルトの名無しさん
07/04/11 17:04:36
>>735
1バイトづつ16進2桁の文字列にしてしまうとか、あるいはコントロールコード
などの表示不能な文字はエスケープして表示可能な文字にして、表示可能な
文字はそのままにするとか、あるいは表示する必要が全くないのなら気にせず
全部 write() や fwrite() で出力してしまうとか、方法は色々あります。


759:757
07/04/11 17:43:19
>>758
>表示不能な文字をエスケープして表示可能な文字にして
文字列←→構造体で相互に変換したいので、文字列から戻す時に
もともと表示可能な文字だったのかエスケープして表示可能になった文字なのか
分からなくなってしまうと思うのでこの場合は使えないです><すいません

ソケットプログラムでsendするときunsigned char型を使うので、
構造体を文字列にしたかったのですが後は何とか自分でがんばってみるです><

760:デフォルトの名無しさん
07/04/11 18:01:36
バイナリを可視なASCII列にするにゃ Base64 エンコが手っ取り早いような気がしないでもない

が、構造体の中身をそのまんまエンコして送るのも抵抗があるな。
受け側のアライメントとエンディアン、基本型のサイズの全てが一致してないといけないしね。

761:デフォルトの名無しさん
07/04/11 18:01:41
>>759
エンコードした文字列は当然、デコードできる。
例えば不可読文字に遭遇したら%に引き続く二文字を16進の文字コードになるようエンコードする。
デコードするときは当然、その逆をやればいい。注意すべきは、%に遭遇した場合もエンコードしておく必要があることだけだ。
Ex.
source: SOH "abc%" LF "def" ETX 20(4バイト整数) EOT
encoded: %01abc%25%0adef%03%00%00%00%14%04


762:759
07/04/11 18:06:10
>>760-761
ありがとうございます><すごく勉強になります
%をつける方法だと文字列の長さが一定にならないから送受信のとき大変そうですけど
なんとか考えてやってみます

763:デフォルトの名無しさん
07/04/11 18:11:31
>>762
ソケットの送受信は長さ決め打ちして読むと泣きを見るわけだが…
プロトコルを自前で規定してるか?

# fgets 等を使わずに fread と fwrite で同じことを記述できるようにしてから、
# ソケットへ移行したほうが良いと思うぞ。

764:デフォルトの名無しさん
07/04/11 18:12:28
バイナリ値主体なら>760、テキスト主体なら>761だな。
#どちらも定番だね。

765:762
07/04/11 18:43:32
つい最近ソケットプログラムとかを勉強し始めたばかりなのでわからないことばかりで…。
とりあえずBase64というのをやってみることにします><;すいませんでした。

766:765
07/04/11 18:58:09
今は文字列と数値を全部snprintfでそのまま繋げてやっていますが
構造体内の変数名とかを全部書かないといけないので
ソースが汚いうえ無駄が多いです><

767:デフォルトの名無しさん
07/04/11 18:59:58
どういう風にやっているのかは知らないが、
そうやって単なる文字列にするのも一般的だと思うぞ。

768:デフォルトの名無しさん
07/04/11 19:03:30
構造体のシリアライズは一大テーマで、
ここで扱うには余白が狭すぎるとは思うんだよなあw

769:デフォルトの名無しさん
07/04/11 20:11:51
>>713-714
亀ですけど、もし興味わいたなら最強の麻雀のアルゴリズム作ろうぜスレで一緒に最強のアルゴリズムつくりませんか?


770:デフォルトの名無しさん
07/04/11 21:12:05
亀がしゃべった!

771:デフォルトの名無しさん
07/04/11 21:34:43
C始めて3日目の俺がきましたよ。
研修でダンプ出力するPGを作成する課題やってるんだけど、

ファイル開く→開いたファイルから16バイト読み込む
→読み込んだデータの16進数変換を行いHEXに格納する

までは出来たんだが、その後の置換処理がさっぱり分からん('A`)

置換処理はHEXに格納されたデータの表示できないコードを
ピリオドに置換してCHARに格納するんだが、検討もつかないし_| ̄|○

助けてくだしあ

772:デフォルトの名無しさん
07/04/11 21:40:26
>>771
isprint関数を使う

isprint(c)? c: '.';

773:デフォルトの名無しさん
07/04/11 21:43:06
>>770
亀レスって言葉をご存知?

774:デフォルトの名無しさん
07/04/11 21:44:03
>HEXに格納された
意味が不明すぎる
char配列に16進数の文字を入れてるって事?数値?

775:デフォルトの名無しさん
07/04/11 21:50:02
>>773
く、くまー
ネタにマジレ(ry

776:771
07/04/11 22:20:05
参考書片手に悩んでた。

>>772
レストンクス
ちと考えてみるわ。

>>774
HEXには
sprintf(HEX,"%X",ss)
でss内の文字列を16進表示で入れたんだが。
おそらく数値?

777:デフォルトの名無しさん
07/04/11 22:25:04
>>768
浮動小数点数を有効桁いっぱいいっぱいまで伝達しようとすると悩ましいね

778:714
07/04/11 23:14:51
>>769
いやオレはもうチェスで懲り懲りだよww
プログラム部はだいたい解決策が決まってるけど
思考の部分は定石と言えるような方法がない
(まあ思考とプログラムも明確に分けれるもんじゃないけどね)
これ以上はスレ違いなんでそのスレの住民と一緒にがんばれ!

779:771
07/04/11 23:39:22
>>774
自分でも問題の意味を分かってなかったらしい。すまぬ。

HEXDATA          CHARADATA
| ̄| ̄| ̄| ̄| ̄| ̄| ̄| ̄| | ̄| ̄| ̄| ̄| ̄| ̄| ̄| ̄|
*|54|45|53|54| | | | | *|T|E|S|T|. |. |. |. |
 ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄
見づらくてスマヌ('A`)
こんな感じで格納したいわけで。

置換処理でisprint使うっていうのは大体分かったけど、for文で回してなにかしろ
みたいなことを講師が言っていた希ガス。何回したらいいの(;´Д`)??


780:771
07/04/11 23:40:09
なんてこったい。
ステキにずれてらっしゃる_| ̄|○

781:デフォルトの名無しさん
07/04/11 23:43:15
数値をCHARADATAにそのまま書けばいいじゃん

782:デフォルトの名無しさん
07/04/11 23:52:39
回すものといえば皿ぐらいしか

783:771
07/04/12 00:06:20
レストンクス。
>>781
CHARADATAに書き込むってisprint使ってですかい?

>>782
俺の頭の中で星が回ってるよ。

784:デフォルトの名無しさん
07/04/12 00:10:22
>>783
isprintで表示できないコードを判別して表示できないのならピリオドを、
表示できるのなら、そのコードを代入

785:771
07/04/12 00:15:09
>>783
なるほど分かってきた。
isprintで表示できるって判断したときに返す値って何?
表示できないってときは多分0返してくるんだよね?

786:771
07/04/12 00:17:48
784の安価ミス

787:デフォルトの名無しさん
07/04/12 00:42:50
>>785
そこまでヒントもらってるんだからマニュアルみなよ。ぐぐってもいいしさ。

788:771
07/04/12 00:49:03
ある程度分かったから参考書片手に頑張ってみるわ。
おまいらありがとう

789:デフォルトの名無しさん
07/04/12 08:32:40
>>785
Cの真偽値の基本は、0でない=真、0=偽
真の場合、0でない値として必ず1を返すケースがいくつか定義されているが、
明言されていない場合は、0でないことだけが保証される。


790:デフォルトの名無しさん
07/04/12 11:41:47
なんで*(s+1)とs[1]の二つの書き方をつくったのよ>K&R
*s++は*にしかできない書き方だし
*(*(s+1)+2)は読みにくいからs[1][2]と書くんだけど
なんか一貫性に欠けてるぞオイ
なんでアメ人は人工言語にこんな汚い要素を持たせるのよ
完璧主義で潔癖症なオレはポインタと配列を使うとき、毎回迷うじゃん

791:デフォルトの名無しさん
07/04/12 11:53:05
>>790
*を使わなければいい。
*s++なんてロジックは却って最適化を阻害しかねない。
s[offset++]でいいジャマイカ。

792:デフォルトの名無しさん
07/04/12 11:56:03
読み込むファイルにひらがなあったら駄目だけどね
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define BUF_SIZE 16
int main()
{
FILE *fp;
char filename[1024] = {'\0'};
char buff[BUF_SIZE] = {'\0'};
char *temp = NULL;
size_t len = BUF_SIZE;
fgets(filename,sizeof(filename),stdin);
if(temp = strchr(filename, '\n'))
*temp = '\0';
fp = fopen(filename, "r+b");
while(len == BUF_SIZE){
unsigned int i;
len = fread(buff, 1,BUF_SIZE , fp);
for(i = 0; i < len; i++)
printf("%02x ",(unsigned char)buff[i]);
for(; i < BUF_SIZE; i++)
printf("-- ");
for(i = 0; i < len; i++){
int c = buff[i];
if(isspace(c)) c = ' ';
putchar(c);
} putchar('\n'); } fclose(fp);
return 0;
}

793:デフォルトの名無しさん
07/04/12 12:47:04
>>791
そうなんだけど
*s++ = *t++みたいな記述は確かに便利だし
s[i]は添え字の分のメモリーも必要だし
ちと読みにくくなるけど
*(*(s+1)+2)でいくか

794:デフォルトの名無しさん
07/04/12 13:01:03
>>793
>s[i]は添え字の分のメモリーも必要だし
ダウト。
今時のコンパイラはどっちで書いても同じコードを吐いてくれる(ことが期待できる)。

795:さいきち
07/04/12 13:05:57
教えてください。C言語を勉強し始めたひよっこです。
Cコンパイラ(Borland C++)をPCにインストールして、コンパイルしようとしたら
以下のようなエラーがでてウマく行きません。何が原因なのでしょうか?

エラー E2209 sample1.c 5: インクルードファイル 'stdio.h' をオープンできない
警告 W8065 sample1.c 10: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main )

10日でおぼえるC言語入門 という本を見て勉強を始めたのですが勉強を進めきれず
困っています。
どなたか教えてください。

796:デフォルトの名無しさん
07/04/12 13:06:10
* は直接参照する時しか使わないな。
インデックスを使うときは必ず [ ] を使う。
その方が読みやすい。

全てのループは if と goto で書けるが
そう書かないのと同じ事だ。
分かりやすく書くのが至上。
後の事は最近のカシコイコンパイラが最適化してくれる。

797:デフォルトの名無しさん
07/04/12 13:11:11
>>795
このあたりから setbcc とかを参考にしてみるといいかもしれない。
URLリンク(lacc.biz)

798:さいきち
07/04/12 13:17:18
大変申し訳ありません。795で質問しました さいきち です。
わたくしはルール違反をしてしまいました。過去ログを調べていません。調べて見ます。
795の質問は『無視』でお願いいたします。

799:デフォルトの名無しさん
07/04/12 15:49:17
>>798
つい最近まったく同じ質問があって、インストールしたbccがアップデート版だった
というのがあったな。

800:デフォルトの名無しさん
07/04/12 16:20:45
argv[1]とargv[1][0]ってどう違うのですか?
どちらも一つ目のオプションを指してると思うんですが
printf( "%p %p\n", argv[1], argv[1][0] );
で表示させると違う値になります

801:デフォルトの名無しさん
07/04/12 16:24:04
>>791>>794>>796
コンパイラがちゃんと最適化してくれるのか 知らなかった
これからは[]で統一する
やっぱ*(*(s+1)+2)なんて書かれたらウザいよねw

802:デフォルトの名無しさん
07/04/12 16:25:44
>>800
argv[1] はchar*
argv[1][0] は char

803:デフォルトの名無しさん
07/04/12 16:27:14
argv[0]は&argv[0][0]と同じってことですね

804:766
07/04/12 16:36:19
構造体のなかのintをcharに全部変えたらbase64の文字列が短くなって通信ができるようになりました
>>760さんありがとうございました。><

805:デフォルトの名無しさん
07/04/12 18:42:57
入力した数字が0ではない間ループするってやつで
int aho[100];
int i=0;
while(aho[i]!=0){
scanf("%d",&aho[i]);
i++;}
ってやると0入力してもおわらんのだけどなんでじゃ?


806:デフォルトの名無しさん
07/04/12 18:51:52
>>805
標準入力からaho[0]に数値が入力されてるのに、while文の判定ではaho[1]
見てるからじゃね?

807:デフォルトの名無しさん
07/04/12 18:54:45
>>805
「入力した数字」なのだから、入力前に検査しちゃダメだろう。
do {
scanf("%d", & aho[i]);
++i;
} while (aho[i - 1] != 0);
or
int tmp = 0;
do {
scanf("%d", & tmp);
aho[i] = tmp;
++i;
} while (tmp != 0);
いずれにしても、scanf()をそのまま使うのはお勧めできないが。

808:デフォルトの名無しさん
07/04/12 20:37:29
>>806>>807
ほんとだw
ありがとう

809:デフォルトの名無しさん
07/04/12 21:05:32
>>800
別に配列にしたからって、より最適化してくれるってわけでもないがな。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5383日前に更新/183 KB
担当:undef