return 0;
int main() {
4 :
デフォルトの名無しさん :2007/04/17(火) 19:04:24
社会人新人研修でcやってるんだけどよー なんか、配列だのループだので サインコサインだの、配列の並べ替えだとかやってるわけよ。 要するに9割ぐらいの内容が数学の知識。 そんなの3問やって1日終わり。 おれがそこに行く前にOJTでやってた内容とはマーーったく違うし業務内容からもかけ離れてるわけ。 資格試験のための勉強みてーなかんじ。 おまえ、そんなのわかったら仕様書が書けるのか。仕様書が理解できるようになるのか。 きょうびC使うのか。 第一プログラマー自体大手電機メーカーは中国インドに外注が主流らしいってのに。 こんなわっかり難い書き方のソース出してたら上司に怒られるだろ。 第一! 並べ替えなんか関数があるじゃないいくらでも。。 サインコサインなんか関数があるじゃない。。 って思うのですがCではこんな小難しいのが大事なことなんでしょうか。('A`) しかもVBみてーに順次デバッグデキネーシうぇうぇwwww むりwwどこまでいったかわかんえwwwwww
派遣?
外部新人研修中の正社
> 並べ替えなんか関数があるじゃないいくらでも。。 > サインコサインなんか関数があるじゃない。。 実務ではそれを使えばいいんだけど、裏でどうやっているのか知っておくことは悪くない。 特に並べ替えなんて様々な方法がそれぞれ一長一短あり、それを理解するのには自分で書いてみるのも一助になる。
空缶回収師にでも転職汁
プログラマに必要なのは忍耐力だから、その篩にかけられてるとでも思って我慢しろよ。 しっかし、役に立たない勉強に文句言っていいのはリア中までだぞ
うちの大学のある教授がswich-case文を忌み嫌ってて、 if-elseif-else...じゃないとダメって言ってた。 なんか、最適化できないとかなんとか言ってたけど、 swich-case文って良くないの?
>>4 >要するに9割ぐらいの内容が数学の知識。
どこが「要するに9割」なのか解らん。
>なんか、配列だのループだの
が数学だと思っちゃうほど算数弱いのか、と思ったが
スレタイが読めないくらいだから国語も弱いんだろうな。
>>10 default があるとジャンプテーブル化できないとか聞いたことはあるが、ホンマかいな?
というか、if-else if-else ってそんなに最適化されるのかな?
VCならdefault: __assume(0);で基本的にジャンプテーブル化するはず。
15 :
デフォルトの名無しさん :2007/04/17(火) 19:33:58
C言語でRPG作りたいんですが、正直難しいと思います。 でもやりたいんです!!僕はHSPでブロック崩し(アルカノイド) ぐらいなら作ったことあります。 今のところ、オープニングまで作ったのですが、どなたか僕に C言語の基礎からすべてを叩き込んでくれませんか?? お願いします。
16 :
10 :2007/04/17(火) 19:34:20
初心者はよくbreak文を忘れて バグに悩むから、みたいなことも言ってた
>>15 RPGにも色々あるけど
どんなのがいいの?
><DOS画面でもいいですか?
18 :
デフォルトの名無しさん :2007/04/17(火) 19:52:10
>>15 HSPは触ったことないけど、ブロック崩し作れるってことは
HSPってどんなかしらないけどwin32apiの知識もあるって
ことでしょ?違うか?
とりあえず、C言語の基礎なら、WisdomSoftで勉強したら?
そして、まぁとりあえずポインタと配列、構造体、関数ポインタ、etc
を勉強しつつ、win32apiもさわっていじってみる。
そんである程度いじれるようになったら
winprocのメッセージ毎の処理を嫌になるほど処理する。
成す者は常に成り行く者は常に至る!!
ま、気長にね
19 :
デフォルトの名無しさん :2007/04/17(火) 19:57:54
Cなんか消えろ( ´Д` )
20 :
デフォルトの名無しさん :2007/04/17(火) 20:35:39
いやいや、俺が
>>18 HSPはapi呼ばなくても、ブロック崩しくらい作れるんじゃね?
char *a[10], b[10]; で、aに"あいうえお"、bに"かきくけこ"と入ってる時に、 bの内容をaに代入することはできるのでしょうか? strcpy(a, b); だと上手くいかないのですが・・・。 ポインタが・・・ややこしいです
char *a[10]; これはchar型へのポインタ配列なので入れられない char a[10], b[10]; こうすれば両方、char型配列なのでコピーできる
>>23 つまり、char *a[10]で定義されるaは、
ポインタの指すアドレスを(違う文字が入ってるアドレスに)変えることでしか、
文字を変えれないということでしょうか?
char *a[10], b[10];で宣言した場合は
strcpy使わないで
a = b;
で単純にコピーしたような感じになるんですかね?
頭がショートしそうなんですが・・・
そもそも char* a[10] に "あいうえお"は入らない
a は charへのポインタの配列[10] b は charの配列[10] コピーできるわけがない。
あえて入れるならa[0] = b;とでもしとけ
#include <stdio.h> int main() { int array[3][2]; array[0][0] = 10; printf("%d\n"); return 0; } ミスって↑みたいに書いたんだけど何故かコンパイル通った。 しかも実行結果は普通に 10 って表示されたんだが・・・。理由分かる人いたら教えてくれ。 フォーマット指定子の%dに対応する変数や式が無いと、 無意味な整数が生成されるんじゃなかったっけ? 試しに3行目と4行目を消してみたらそんな感じだった。 しょーもない質問で申し訳ない。
フォーマット指定子と引数の数が食い違った場合の動作は未定義だから、 その結果として10が出力されたに過ぎない。理由を問うのはナンセンス。
未定義って言うのは、結果はなんでもあり、たまたまあなたが期待していた 動作をするかもしれないが、実行したとたんにあなたの鼻から悪魔が出てき てもそれはそれでOK。
>>28 うちの環境でも、array[0][0]の中身が出力された。(数値変えても出る
アセンブラとか良く分からんけど、
たまたまイバチン最後にアクセスしたナントカメモリの中身を吐いたとか、そういう理由では?
どっちにしろ何かを意図してすべきことじゃないし。
もし勘違いだったら、詳しい人フォロー頼みます
>>28 一番最後に宣言した配列の先頭を読むみたいだな
理由は知らないけど。
偶然スタックが重なっただけだろ。
いや、単にスタックに詰まれてただけじゃないの?
35 :
28 :2007/04/17(火) 23:39:50
最後にアクセスしたメモリ?スタック? に10が入っててそれを吐き出した~って感じなのかな。 何となく疑問は解消した気がする。 みんな色々とレスしてくれてサンクス
スタックに入ってるのはarray[0][0]へのアドレスで、 それを参照したら10が入ってたって感じじゃないかな?
>>36 いいえ。
printf()が期待したスタック領域が実際に呼び出し側で用意されていなかったので、
呼び出し側のローカル変数が参照されただけのことです。
ローカル変数がどうスタックに積まれるか、想像すればピンと来そうだよな。 世の中には変わった積み方もあるんだろうけど。
バッファーオーバランによる脆弱性を突いた、クラッキングの
一番初歩的な技につながるのだよね。これって
>>28 は参照だけど、アドレスをぶっこめば、クラック用の関数にぶっ飛ばせるよね
void world(char *flag2[]); int main(void) { char flag[3][]; world(&flag[0]); } なぜエラーなのか分からない。
>>41 ポインタの記述が間違ってるとは分かってるんだが
どうやっても分からない・・・orz
char flag[3][]; /* ^ */
仮に char flag[3][5]; としたとすると、 仮引数: char*[] 実引数: char(*)[5]
>>44 正しい記述方法はどうすればいいんでしょうか(orz
何をしたいのか
>>40 のコードだけからは読み取れない。
配列のポインタとポインタの配列のどっちを渡したいんだ?
47 :
40 :2007/04/18(水) 00:33:47
void world(char (*flag2)[]); じゃね?
49 :
デフォルトの名無しさん :2007/04/18(水) 14:40:45
キーボードから身長を入力し、 0以外なら2倍の数を表示し繰り返し、 0だったらば処理を終わらせる これを教えてください
>>49 int height;
while(1) {
scanf("%d", &height);
if(height==0) break;
printf("%d", height * 2);
}
>>40 まず char flag[3][]; の箇所でコンパイルエラーが出るな。
何でかというと、一番下のレベルの配列の要素数が抜けてるからだ。
char flag[3][5]; とかなら問題ない。但しこの場合は char 型5要素の
配列が3要素あるという意味になる。(つまり「char ポインタ」の
配列ではない。「char 型 5 要素」の配列だ)。
これを「char ポインタの配列」にしたい場合は
char *flagp[3];
int i;
for (i = 0; i < 3; i++) flagp[i] = &flag[i][0];
のようなことをする必要がある (但し代入する側の &flag[i][0] は
flag[i] と省略して書くことも可能。C言語では配列全体を表す名前は
配列の先頭要素へのポインタになるため)。
>>40 もう一つ書いておこう。
char flag[3][5]; と宣言された配列をそのまま func(flag) のようにして
他の関数の引数で渡したい場合は void func(char flag2[][5]); または
void func(char (*flag2)[5]); になる。つまり下のレベルの要素数が
5であることは省略できない。というか、省略可能なのは一番上のレベル
だけだ。
文字の配列から、ある文字の場所を探してくれるstrchr関数みたいに、 int型の1次元配列から、ある数値を探してくれる関数ってある?
では、for文でぐるぐる回してifで同値breakしますね int a[]={4,1,0,2,3}; みたいに(0~(要素数ー1))各数字が順番バラバラに入ってる状態で、 例えばこの配列で値cが入っているのは何番目か求めたい場合は for(i=0;i<5;i++){ if(a[i]==c){ break; } } で良いのかな。 それとも int b[]={2,1,3,4,0}; みたいに逆に求められる配列を用意しておくべき?
>>54 これでもおk
int *arrint(int *arr, size_t arr_size, int value){
size_t i;
for(i=0;i<arr_size;i++)
if(arr[i]==value)
return &arr[i];
return NULL;
}
>>54 ソート列なら bsearch があるけど。
59 :
デフォルトの名無しさん :2007/04/18(水) 22:35:06
質問です。 gcc4.1.2を使用しています。 以下のようなコード switch(i){ case 100: int a=10; printf("%d\n",a); break; } をコンパイルすると "expected expression before 'int'" とエラーが出ます。 caseの直後に変数宣言があるためのようです。 コードには問題ないように思うのですがこれはなぜでしょうか? よろしくお願いします。
>>59 Cではブロックの先頭でしか変数宣言は出来ない
ラベルもおけなかったのか。これは知らなかった。
62 :
59 :2007/04/18(水) 22:46:05
>60 これだったら問題なくコンパイルできます。 switch(i){ case 100: printf("yes\n"); int a; printf("%d\n",a); break; } これはC++的な解釈をしているせいですか? どちらにしても>59がエラーになる理由を知りたいです。
switch(i){ case 100: { int a=10; printf("%d\n",a); } break; }
ラベルは構文上「ラベル付き文」という文の一種の一部。 ラベル付き文は、ラベルとその直後に続く文からなっている。
>>62 それはgcc拡張。
C99でもブロック先頭以外でも変数を宣言できるが、
変数宣言は文ではないからラベルをつけることは出来ない。
66 :
デフォルトの名無しさん :2007/04/18(水) 22:52:40
以下2つは問題ありませんでした。 switch(i){ int a; case 100: printf("%d\n",a); break; } switch(i){ printf("yes\n"); int a; case 100: printf("%d\n",a); break; } とにかくcaseの直後の変数宣言が問題のように思います。 不思議だ・・・
67 :
デフォルトの名無しさん :2007/04/18(水) 22:58:30
終了条件が"end"を入力したら終了ってプログラムつくりたいんですが strcmp()関数つかう以外に方法ってないですかね?
68 :
デフォルトの名無しさん :2007/04/18(水) 23:02:55
>64,65 なるほど、そういうことでしたか。 以下でもエラーになることを確認しました。 a100: int a; printf("%d\n",a); goto a100; >63 エラーが発生しないことを確認しました。 これはブロックに対してラベルを張るって感じなんですかね。 >60-65 納得できました。 大変勉強になりました。ありがとうございました。
-ansi -pedantic -Wall あたりをつけてコンパイルしとけよ
>>67 char buf[6];
memset(buf, 0, sizeof buf);
fgets(buf, sizeof buf - 1, stdin);
if (buf[0]=='e' && buf[1]=='n' && buf[2]=='d' && (buf[3]=='\n' || buf[3]=='\r')) {
exit(0);
}
buf[3]=='\r'もmemsetも余計
73 :
Cくん :2007/04/18(水) 23:32:51
柴田望洋の明快C言語と解きながら学ぶC言語を終了しました。 ほぼ理解はできました。 次の勉強本としてはどのようなものがお勧めですか? 一応、明解C言語実践編を買ったのですが、 そろそろなにか作りながら学びたいと思ってます。 お勧めの本はありますでしょうか?
>>73 作りたいものを決めてから、どの本を買うかきめたら?
75 :
Cくん :2007/04/18(水) 23:36:31
時計とか身近な物が作りたいです
PICに関する本がオススメだ
77 :
Cくん :2007/04/18(水) 23:39:47
ぬおーーがんばる!!
>>75 OSがWindowsなら、プログラミングWindowsとか。
高いけど、CでWindowsの本って、ほかにはあんまりなさそうな気がする。
C++なら「インサイドVisualC++」と「MFCによるWindows95プログラミング」だけど、新しいバージョンに対応した本がでてるか分からない。
>Cくん まずはWindowsの画面をCで表示してみ。 それができんと時計作れんし Win32API SDK とかで検索してみ。
82 :
sage :2007/04/19(木) 02:18:22
よろしくお願いします。 cで作ったDLLをVB.netで呼び出すにはどのようにしたらいいのでしょうか 教えて下さい
82です すみません、名前にsageって入れちゃいました
>>82 VB.netのスレで聞け
VB.netで呼び出せるDLLの呼び出し方法はその製作言語に依存しない
呼び出す方法は呼び出す側の問題
実数の割り算をするときって 分母がぴったり0.0かどうかを判定すればいいんですか? それとも±0.00001以内とかのほうがいいんですかね?
close_at_toleranceでググれ
実数の0除算なら正負の無限大かNaNになるだろ。
NaNを検出するような関数ないですか・
isnan()
_isnan(d) math.hかfloat.hをインクルード
dってなんだ doubleね
C99でisnanがマクロとして追加されてたんだね
93 :
ど素人 :2007/04/20(金) 01:13:07
29歳ひきこもり、資格・職歴無しです。 就職のこと考えたのですが、プログラムとか知識あれば、食っていけますか? 今の生活だと、パソコンくらいしか触れて無いので。 プログラムの勉強始めようかな?とか思って。
ひきこもるような人間がプログラムに限らずなにかを勉強してものにすることなんかできないよ。 どうせ途中で投げ出すことになるんだから、はじめからやらないほうがましだろ。
おれもド素人の24歳資格なしバイト生活 プログラム歴は1ヶ月でなんとか理解してきて やっと「3+5は8です」って表示できるようになったよ 自分ではすごく感動したんだけどやっぱりまわりと比較するとセンスなくてだめみたいだね でもこのスレ見ながらなんとかついていこうとしてる おれにとってはレベル高いけど少しずつ理解できるようになってきたように感じる… 食っていけるかわからないけど努力すればできるようになるとは思う
96 :
85 :2007/04/20(金) 01:34:47
isnan()なんてものがあったんですね。 ぴったり0で除算した場合の結果がINFになるのはわかるのですが、 限りなく0に近い値で割った場合の結果というのは 誤差というか精度的には問題ないんですか?
>>93 あなたには、農村などでの自給自足の生活が適していると思われます
プログラムだけで生きていくことはできませんが、
食べ物を自給自足できるなら生きて行くことはできるでしょう
農協はある程度の常識と交渉スキルが無いと食い物にされますので
あなたは農協とは間違っても関わりを持たないように気をつけて!
(プログラムはそれ自体では何の役にも立ちません
あなたの作るプログラムを使うことによって何らかの価値を生み出すことができるかどうかが問題です)
>>96 そりゃ除数がDBL_MINとかなら0で除算しなくてもINFになる可能性は高い。
でもINFになった時に元の除数を見てそれが0でなければ0除算による結果ではないと分かるじゃないか。
演算の結果だけでなくその演算のオペランドも確認していけばどこで精度が落ちたか分かる。
あと、isnanつながりでfpclassifyがあるのでINFやNaNや非正規化数、0なんかを区別できるようになる。
文字列の配列を動的に作る関数(javaのsplitみたいなやつ)を作ったのですが、 その関数で作られた配列の長さってどうやって求めればいいのでしょうか?
>>99 char**を返す関数ってことだよね?
文字列配列を作った関数しかそれを知らないから、
配列とその要素数を返すようにしてやるか(関数は配列を返して、要素数は引数で返してもらう等)、
配列の最後にNULLを入れた要素を追加して返してやり、NULLが出るまで配列を走査するか。
>>93-95 人月単価安ければ、コミュニケーション能力に問題ありでも仕事あるんじゃない?
おいらのプロジェクトでも
日本語ほとんどしゃべれない中国人 人月単価40万円でいるから
(日本語できる優秀な中国人との抱き合わせでだけど・・・)」
でも日本人で、プロジェクトを取り纏めれるようになれば人月100万ぐらいはいけるよ
そういう話はマ板でやれ
103 :
デフォルトの名無しさん :2007/04/20(金) 10:36:36
猫でもわかるプログラミングで勉強しています。 C言語編第1部13章で経過時間の表示がうまくいきません。 #include <stdio.h> #include <time.h> void main(){ int i=0; time_t t1, t2; time(&t1); while(i<=50000) printf("%d,",i++); time(&t2); printf("\ntime1=%ld time2=%ld\n",t1,t2); printf("かかった時間は%d秒です。\n",t2-t1); } がソースなんですが 実行するとtime2=0になります。 何が悪いでしょうか。 VC++2005ExpressEditionを使っています。
>>103 time_t が64bitだから
%ld を %lld にしてみ
105 :
103 :2007/04/20(金) 11:22:20
>>104 0ではなくなりました。
ありがとうございました。
106 :
デフォルトの名無しさん :2007/04/20(金) 12:47:15
質問です。 VC6.0でC言語で一個DOS上で動くアプリケーション作ったんだが これデータベース接続するにはどうしたらいい? 使うのはOracleで、 とりあえずSQL文書く知識だけはあるんですが。 OO4Oとかいうのを使ってみたいんだがググってかなり調べてみたんだがもうちんぷんかんぷん まず何をすればいいんだ…
>>106 こんにちは。
そりゃDOSで動かそうとするとちんぷんかんぷんだろう。
OO4OはActiveXだから、さくさく作るならVBの参照設定にチェックを入れて
ADO経由で画面に貼り付ける(だったかな?うろ覚え)
DOSからやろうとすると素人では先ず無理。ActiveXの仕組みを全部C/C++で書かなくちゃいけない。
もちろん、OO4Oはインストールしてあるんだよね。
レスありがとうございます!!(ノД`) OO4Oはインストールしてあります。 ActiveXですか。あんま知識ないんでよくわからないですが、 VBの参照設定にチェックとはどういうことでしょう? C言語で作成したのですがVBも関係あるのでしょうか。 幼稚な質問で申し訳ないです;
>>108 OO4Oは
・VB用のタイプライブラリ
・C++用のクラスライブラリ
の2種類あるが、どちらもCから呼び出すようにはできていない。
なので
・C++ で、クラスライブラリを使用する関数を作成し
C のコードから呼び出す。
ことになる。
どうしても C だけで、ということであれば、
OO4Oを捨てて Pro*C を使う手もある。
Pro*Cは使いこなすのが難しいときいたのでOO4Oにしようと思ったのですが。 >・C++ で、クラスライブラリを使用する関数を作成し > C のコードから呼び出す。 クラスとかそういうのを使うのはJavaで少しかじった程度ですが、 とりあえずこれに挑戦してみます。 ありがとうございます。
111 :
デフォルトの名無しさん :2007/04/20(金) 14:31:09
Cを勉強し始めて簡単なものなら作れるようになったのですが、 ソースがどうしても長く汚くなってしまいます。 文法の入門書とかではなくて、見やすいソースにしたり、綺麗に書くこつとか 業界のスタンダードな書き方みたいなそういう本や解説しているサイトありませんか? 例えば私がある関数を作ると void SetCol(St **st, Col **col) { int i; swtich(col->type){ case 0: SetBg(st,col->bg,0,0,col->width,1); SetBg(st,col->bg,0,0,col->width,1); SetBg(st,col->bg,0,0,col->width,1); SetBg(st,col->bg,0,0,col->width,1); break; } case 1: for(i=0;i<col->width,i++){ if(i%4 == 0){ SetBg(st,col->bg,i,0,col->width,1); } } //似たようなforが3つ続く break; case 2; .... } } このようにめちゃめちゃ長くなってしまいます。 大体一つの関数が30~200行くらいです。上記の関数だと350行でした。
>>111 気にスンナ
switch ~ case はどうしても長くなる。
なんでもかんでもswitch ~ caseにしてしまうのなら
そっちを気にしてみれば
>>111 可能なら、caseごとの処理を別の関数にすればいい。
ポイントは、引き数を極力少なくできるポイントで分けること。
#具体例を書こうと思ったが、余りにやっつけなコピペなんで断念。
114 :
デフォルトの名無しさん :2007/04/20(金) 14:57:03
>>112 if elseよりはまだ短くできるかなと思ったのですが、確かに乱用してる感はあります。
そのあたり気をつけてみます。ありがとうございました。
>>113 なるほど、さらに細かくしちゃうんですね。名前考えるのが大変ですね・・・
あまり再利用しないものは関数にしてなかったんですが、試してみます。
ありがとうございました。
もしくは#defineでまとめとくのもあり
実用プログラムはソースの大半が退屈なエラー処理の連続だ。 教科書の例題はそれを省いてるから短く見通し良く見えるだけの話で。
>>100 そうです。今は仰るように引数で返してもらうようにしてたのですが、
ちょっと強引かと思うんで、走査の方も試してみます。
ありがとうございました。
走査のが強引な気がするが。 構造体にしちゃいかんの?
学校の宿題でむずそうな課題が出たのですが 誰か相談に乗ってくれませんか。ヒントとか教えていただけたらうれしいのですが j4tyf89reyr@yahoo.co.jpへお願いします
それはむずそうだな
>>118 なるほど。頭固かったです。
構造体でも全く問題ないです。
ありがとうございました。
ソースを細分化して見やすくしたいんだけど、 よくつかう処理なら2、3行のものでも関数にすべき?
>>123 そのほうが楽じゃない?
仮になんらかの問題で修正するとき関数にしてなかったらすべてを修正しなきゃいけないし
#define 使うって手もあるけど
>>124 >#define 使うって手もあるけど
勘弁してくれ。
#defineつかう手はねーな
#define で、fore だなw
ccmathのdeqsy関数の引数の意味って分かりますか? マニュアル読んでもちっとも理解できません。 お願いします。
#defineの何が悪い!
決まった長文(ヘルプとか)しか表示しないprintfなんかはよく#defineで短くしちゃうんだけどなあ
最近の最適化コンパイラはstatic関数を積極的にインライン化しようとするから、 マクロでなければならない場所以外は関数でかいときゃいいだろ。
133 :
デフォルトの名無しさん :2007/04/20(金) 22:20:42
オライリーのC実践プログラミングという本で一通り勉強したんですが 少し消化不良な感じがします。 入門書とその次に読む本でお勧めのがありましたら教えてください。
134 :
デフォルトの名無しさん :2007/04/20(金) 22:27:43
Visual C++.net Version2003 で実行した瞬間画面が消えるのを 防ぐにはどうしたらよいのでしょうか?
たとえばデバッグなしで開始を使用するなど
>>134 情報が少ないな
コンソールとかコマンドプロンプトとかは分かるレベル?
それとも窓作ってるのに一瞬で終了?
main.c内部 LIST *head; … head = NULL; … addUser(head, name, age, specialty); list.c内部 int addUser(LIST *head, char *name, int age, char *specialty) { LIST *current; LIST *addlist; addlist = (LIST *)malloc(sizeof(LIST)); … if(head == NULL){ head = addlist; head->next = NULL; } else{ current = head; while(current->next != NULL){ current = current->next; } addlist->next = NULL; } return 0; }
>>134 たしか、どっかに消えないようにするオプションがあったよ。
設定関係を探しまくれば見つかるんじゃね?
139 :
137 :2007/04/20(金) 22:44:08
ソースのように線形リストを追加するプログラムを書いたのですが、 addUser関数から戻ってきた後、headのアドレスがNULLに戻ってしまいます。 head = addlistでアドレスを書き換えたと思うのですが、 なぜNULLに戻ってしまうのでしょうか? ちなみにaddUser関数はmain関数内部から呼び出しています。
140 :
デフォルトの名無しさん :2007/04/20(金) 22:46:20
134ですが・・ printf("hllo"); を実行すると消えます。
141 :
85 :2007/04/20(金) 22:50:33
>98 INFやNaNの発生に関して認識が間違ってるかもしれませんが、考えるに 非常に大きい分子に対して分母が0に近いような場合でも、 結果が与えられたビットで表せなければ、ぴったり0でなくてもINFになる、ということですね。 これまではあまり考えず、割り算の前に分母が0に近くないかをチェックしていたのですが、 ふと、ぴったり0かどうかをみるだけでいいんじゃないか?って気がしてきたので質問させてもらいました。 おっしゃるようにisnan()とかを使って問題が発生した場合のみ処理を変えたほうが、 計算精度という意味では良さそうですね。 勉強になりました。どうもありがとん。
>>140 1. コマンドプロンプトから実行する
2. main の return の前に、 getchar() とか入れる
>>142 最後の行にブレイクポイント入れるのが簡単じゃね?
144 :
デフォルトの名無しさん :2007/04/20(金) 23:06:13
getchar() 入れると消えないですね。 ありがとうございました。
145 :
デフォルトの名無しさん :2007/04/21(土) 01:08:55
領域の確保と解放の仕方は下記の通りで正しいですか? char **table = (char **)malloc(256); free(table);
>>145 正しいと言えば正しいけど、微妙に間違っていると言えば間違っている。
取り敢えずmallocとfreeの使い方は間違いではない。
が、mallocに渡している256って何? って話にはなる。
そこにはsizeof(char*)の整数倍の値が入らなければならないのではないのか。
147 :
デフォルトの名無しさん :2007/04/21(土) 01:17:08
>>146 やはりこの辺りの理解が足らないみたいです。
ちなみにリスト構造のダブルポインタでも同じように
領域確保するのでしょうか?
typedef struct{
int a;
char b;
} LIST;
LIST **list = (LIST **)malloc(sizeof(LIST *) * 256);
とりあえずリスト構造について勉強してからの方が・・・
/* 2次方程式 a * x^2 + b * x + c = 0 の解を求めるプログラム */ #include <stdio.h> #include <math.h> int main(int argc, char* argv[]) { float a, b, c;/* 係数a,b,c */ float x1, x2; float d;/* 判別式D */ puts("二次方程式 a*x*x + b*x + c =0 の解を求めます。 "); printf("係数 a ="); scanf("%f",&a); printf("係数 b ="); scanf("%f", &b); printf("係数 c ="); scanf("%f", &c); d =(b*b - 4*a*c);/* 判別式Dの計算式 */ printf("二次方程式 %f*x*x + %f*x + %f = 0 の解は\n ", a, b, c); 次レスへ
if (d > 0.0)/* 判別式D>0 */ { x1 = (-b + sqrt(d))/(2 * a); x2 = (-b - sqrt(d))/(2 * a); printf("実数解 x = %f , %f です。\n", x1, x2); } else if (d == 0.0)/* 判別式D=0 */ { x1 = -b / (2 * a); printf("重解 x = %f です。\n", x1); } else/* 判別式D<0 */ { x1 = -b / (2 *a); x2 = sqrt(-d)/(2 * a); printf("虚数解 x = %f + %fi , %f - %fi です。\n", x1, x2, x1, x2); } return 0; } このようなプログラムを書いてみたのですがもうちょっとすっきりさせることは可能でしょうか? 個人的には無駄に長いなあと思ってしまうのですが。
何をどうすっきりさせたいのかわからないけど、 判別式を計算する関数 解を導く関数 に分ければ少なくともmainはスッキリ
>>137 int a=0;
hoge(a);
void hoge(int a){
a=1;
}
ってやっても呼び出し元のaは変化しないのはわかるよな。
で、137のソースを↓を使って書き換えてみて。多分これでわかると思う。
typedef LIST* PLIST;
153 :
137 :2007/04/21(土) 03:24:44
>>152 ありがとうございます。変数headはポインタですが、
この場合addUser関数に対して参照渡しとならないのでしょうか?
cには参照渡しがないので、ポインタだろうと値渡しされる。
156 :
137 :2007/04/21(土) 03:45:51
>>154 参照渡しまでも勘違いしているかも…。
headにはアドレスが渡り、そのアドレスが
NULLから別のアドレスに変わると思っていました。
値渡し…よく分からなくなってきました。
いんや、元のよりはずっとわかりやすいよ。 ただし else if (d == 0.0) /* 判別式D=0 */ と else if (pSolutions->d == 0.0) /* 判別式D=0 */ はいただけない。とは思うものの宿題レベルだからこれでいいのかな…。
>>156 先ずは>152で指摘されたことをやってみよう。
>>158 >いんや、元のよりはずっとわかりやすいよ。
だから「ように見える」と言ったわけで。
「無駄に長い」という言葉から察するに
おそらく
>>150 の期待していたすっきり感には当てはまらないだろうが、
可読性はそういう初心者の主観的直観的なものとは別のところにあるということを匂わせたつもり。
161 :
デフォルトの名無しさん :2007/04/21(土) 15:52:00
線形リストを再帰関数を使って全削除するプログラムを考えているのですが、 currentの直前のリストのnextにNULLが入ってくれません。(①の処理) どうすればNULLを入れられるでしょうか? void deleteAllList(LIST *node) { LIST *current; current = node; if(current != NULL){ deleteAllList(current->next); free(current->name); free(current->specialty); free(current); current = NULL; … ① } else{ return; } }
>>161 えーと
void foo(int bar) {bar = 1;}
があったときに
int baz = 10;
foo(baz);
printf("%d", baz); // 10が出る
のと同じ理由でそれでは直前のnextにNULLは入りません。
多分、deleteAllList(baka->next);って呼んでるんだよね。
LIST型が双方向リストじゃない限りその関数の中から直前の
ポインタを求めることはできないから(始点を別に持ってたら別だけど)、
ひとつまえのポインタを渡すようにしてやればいいんじゃないかな。
こんな感じ。関数の冒頭で current = nodeとなっているのをcurrent = node->next;に書き換え、 current = NULL;とやっているところを、node->next = NULL; に書き換えればいい。 もちろんdeleteAllListを呼んでいるところは全部ひとつ前のポインタを 渡すように書き換える必要がある。deleteAllList(baka->next);とやっていたとしたら、 deleteAllList(baka);のように。
164 :
デフォルトの名無しさん :2007/04/21(土) 20:17:49
質問です。 このc言語のプログラムを動かしたいのですが、うまく動きません。 プログラミングは初めてで、あまり詳しく分からないです・・・。 pastとnowとfutureとdvとvfという小数の変数を使ってfutureを求めたいです。 コンパイルしようとすると変数のtypeが違うかconflictingがどうとかでます。あと、main関数の返り値がint型でないと 言われるのですが・・・。 どう改善したらうまくいくのか教えて頂ければうれしいです。 よろしくお願いします #include <stdio.h> float past,now,future,dt,vf; vf=1; dt=0.01; now=vf*dt-1; past=-1; float verlet(void) { 2*now-past-4*now*(now*now-1)*dt*dt;}; float main(void) { printf("past=%f,now=%f",past,now); future=verlet(void); printf("future=%f",future); }
>>164 >コンパイルしようとすると変数のtypeが違うかconflictingがどうとかでます
せっかくコンパイラが親切に、エラー内容を教えてくれてるのに
無視しないで具体的に書いてよ
>>164 ついでに言うと、どう直せばいいのか以前に無茶苦茶すぎる
おとなしく基本から順にやった方がいいよ
・main の戻り値を float じゃなくて int にする
・verlet の定義の最後の } の後の ; はいらない
・verlet に return がない
・以下の部分は main の中に移動
>vf=1;
>dt=0.01;
>now=vf*dt-1;
>past=-1;
などなど
どこ直すとかっていうレベルじゃねーっていうか、ほぼ全行に突っ込み所あるのって珍しいぞ。 とりあえず数時間まともに入門サイトでも読んできたら?
>>163 指摘の通り、前のリストのnextを持たせてやる事で
NULLを入れてやることができました。
ありがとうございました。
>>164 これは釣りか?釣りなのか?
マジなら、まず人のソースを読め。
#include <stdio.h>
float past, now, future, dt, vf;
float varlet(void)
{
return 2.0f*now-past-4.0f*now*(now*now-1.0f)*dt*dt; /* 戻り値がvoid以外ならreturn書け!*/
}
int main(void) /* mainは、今のうちは呪文のように←のように書け */
{
vf = 1.0f; /* 代入と計算は関数の中でしろ。少なくとも今のうちは */
dt = 0.01f;
now = vf * dt - 1.0f; /* vf * dt - 1; でも悪くも無いが、今のうちは型を統一しとけ! */
past = -1.0f; /* これも! */
printf("past=%f,now=%f\n",past, now); /* \nは要らないけど次の文字列とくっついちゃうだろ */
future = verlet();
printf("future=%f",future);
return 0; /* 今のうちは付けとけ */
}
>>169 の本人です。このたびは偉そうにソースを晒してすみません。
元はといえば、甘やかして育てた母が悪いのです。
でも、立派な社会人で幸せな家庭を築いていますので、許してやってください。
こういうレベルでCを使うならなら、 浮動小数点数は常にdoubleを使っておけばよいと思う。
172 :
デフォルトの名無しさん :2007/04/22(日) 00:02:11
変数名ってもしかして頭文字が数字だったらダメなの?
当然
174 :
172 :2007/04/22(日) 00:08:19
/(^o^)\ナンテコッタイ
>>173 即レスアリガトン
------------------ a.txt **A** **B** **C** ・ ・ ・ ------------------- b.txt A B C ・ ・ ・ ------------------- b.txtのAをa.txtのAに挿入 b.txtのBをa.txtのBに挿入 b.txtのCをa.txtのcに挿入 するプログラムのソース作れる方いますか?
176 :
かなり初心者 :2007/04/22(日) 00:35:00
#include <stdio.h>#include <stdlib.h> void moji (int);int heikin(int,int); int main(int argc, char *argv[]) { int kazu; int x,y; while(1){ printf("値1を入力:"); scanf("%d",&x);moji(x); if (x<0){break;} printf("値2を入力:"); scanf("%d",&y);moji(y); kazu=heikin(x,y); printf("平均%d\n",kazu); moji(kazu);} system("PAUSE"); return 0;} int heikin(int a,int b){ int hei; hei=(a+b)/2; return hei; } void moji (int a){ if (a>=60){ printf("合格%d\n",a); }else{ printf("不合格%d\n",a); }} このプログラムで終了時「不合格-1」と表示されないようにしたいです。 どなたか教えてください。
>moji(x); と >if (x<0){break;} を入れ替えたらいいんじゃね?
178 :
164 :2007/04/22(日) 02:01:56
>>165 >>166 >>167 >>169 ありがとうございます。ホンマすいません。今大学4回生で研究室配属になって
同級生たちは皆プログラムできるから基礎の説明とばされて、課題だされてちょっと勉強してやってみたんですが
こんなアリサマでした・・・。提出火曜で(出題は金曜)土日は研究室にだれもいなくてきけなくて困ってたのです。。。
returnの使い方がいまいち分からないのですがあとは分かった気がします。returnは数学でいうところの
f(x)=の部分ってことで、プログラムの関数のカッコの中が数学でいうところの関数の中身って感じでいいんですかね。。。
つっこみたいけどまぁいいや
まあ、似たようなもんだ。
即席で使えるレベルまで覚えさせるつもりだった言語がCってまたハードだな
春休みの内に何とかしておくべきだったな
183 :
デフォルトの名無しさん :2007/04/22(日) 03:06:53
2147483647+1 = -2147483648 このようになる理由がわからない。教えてください。
7fffffff+1 = 80000000
>>183 2^31=2147483648
2^32(値の上限は2^32-1)を2進数で表して、先頭の32桁目を1か0で符号として扱い
+-で半分に分けて使っていることに関して理解していりゃ、あとは
>>184 の理屈で16進数に置き換えて -2^31 が 80000000
FFFFFFFF が-1というのが分かれば良いかと。
すいません 3×3のマスでたとえば 111 1□□□ 1□□□ 1□□□ となっていればこれの条件を満たすのは 111 1■□□ 1□■□ 1□□■ 111 1□□■ 1□■□ 1■□□ となりますがこのように縦横彫るマスの数だけを与えて それを満たすすべてのパターンを出力ってできますか
4×4など大きくなっても対応できるように、お願いします ピクロスではありません。
枝刈りのない全数探索ならそんなに難しくはないと思うが。 その横軸と縦軸に並んでいる数字も変化するんだよな?
ちょっとやってみてるけどややこしいwww
191 :
189 :2007/04/22(日) 07:54:14
>>190 速いなー。なんかおれ、気づいたらビールを飲み始めてしまっていてリタイアw
てかなんかおれの書きかけのコードよりはるかに短い…。
192 :
デフォルトの名無しさん :2007/04/22(日) 18:01:32
#include <stdio.h> int func(void){ static int a=0; return ++a; } main(){ int b,i; for(i=0;i<3;++i) b=func(); printf("%d",b); } 何故これの結果が3になるのかがわからりません。 2回目,3回目のfunc関数呼び出しでは、static変数になっててもa=0になるから returnはずっと1だと思ったんですが違うようで・・お願いします
>>192 static int a=0;は一度しか初期化されない
2回目以降は前回の値を保持している
194 :
デフォルトの名無しさん :2007/04/22(日) 18:04:33
>>193 一度しか初期化されないんですか。謎が解けました!。ありがとうございました
>>194 static変数とグローバル変数だけだぞ。
int func(void){
int a=0;
return ++a;
}
だと、関数が呼び出される度にa=0で初期化されるからな。念のため
196 :
デフォルトの名無しさん :2007/04/22(日) 18:48:25
>>195 了解しました。auto変数は毎回初期化されるんですね
正確には「自動で初期化はされないから自分でやれ」
関数内のstatic変数は、スコープ(可視範囲)が関数内であるだけで、外にあると 思うと分かりやすいかな。 その関数専用で外部に見せる必要がない管理データを持つのに使ったりする。
199 :
かなり初心者(176) :2007/04/22(日) 22:35:34
>>177 さんありがとうございました
しかし、どうして入れ替えただけでいいんでしょう?
まったく基礎ができてないやつです。
>>199 プログラムは基本、上から順に実行されるんだから
上から順に追っていってみなよ
201 :
199 :2007/04/22(日) 23:12:41
>>200 さんありがとうございます。かなり基本的なこと聞きます。
int mainの中に入れないといけないプログラムと
{}の外に書くプログラムの違いってなんですか?
参考書見てまんま書き写しているだけなんで、教えてください。
一般的には特定の処理をする部分を分けて書いた方が見通しがいいから 別の関数に書き出してそれをmain関数から呼び出すことで特定の処理をmain関数から追い出す 後で再利用することもできるので何度も書く手間も省ける
>>201 教えようにも、君に分かるように教えるのはたぶん無理
足し算引き算すら知らない幼稚園児に、高校数学の微積を教えることが出来るか?
そーいうことだ
>>202 うちじゃへぼSEのせいで1プロジェクトが終わっても再利用できるものは何もないという有様w
>201 >int mainの中に入れないといけないプログラムと >{}の外に書くプログラムの違いってなんですか? main関数とは限らないけどソースに直接書くのは 宣言か関数定義だけ。 関数の外に文を書くことはできない。 行頭が#で始まる。プリプロセッサ命令はC言語の文法とは全く別。
お前らの突っ込みはもっともだけど、多少はエスパーしてあげようよ…
だがこの辺を説明しようとすると、うぜえ、よそへいけ、 って一斉につっこみが入るくらい長文かつややこしい説明になるんじゃないかなあ…
そんなコードが参考書に載ってるとはとても思えんな。。。
多分、参考書はソース全体を書いてあるんじゃなくて 一部を抜粋してるだけなんじゃないかな それをmainの外だと勘違いしてるのだと思う
質問です 戻り値がint*型の関数は *を付ければ代入式の左辺にしてもいいですか? struct p{ a[10]; b[10]; }; int *f(struct p *x, int i){ if(i<10){ return x->a[i]; }else{ return x->b[i-10]; } } int main(void){ int i; struct p *x; for(i=0;i<20;i++){ *f(i)=i; } return 0; }
211 :
210 :2007/04/23(月) 13:00:39
f(x,i)
>>210 一概には言えない。そのコードの場合は、それ以前の段階でダメ。
メモリ確保せずに構造体の中身弄るなんてなかなか感じさせてくれるじゃない
215 :
デフォルトの名無しさん :2007/04/23(月) 15:24:23
オマイ等のお陰で、C言語の基礎が概ね理解できた。 今、専門学校でデータベースやXMLやっててCやったせいか理解しやすい 皆、ちんぷんかんぷだ。俺はすんなり入る。 オマイ等、サンクス!オマイ等に光あれ!
おれアンデッドだから、光はちょっと勘弁。
217 :
デフォルトの名無しさん :2007/04/23(月) 16:10:44
>>215 それはお前が頑張った証拠だ
感謝するなら自分のやる気に感謝しとけw
質問ですが このプログラムを起動して最初に58を入力したらいきなり画面が黒くなってオーバーなんとか って表示されてPCがうんとも寸ともいわなくなって強制終了したんですが そうなった原因は何かわかりますか? #include <stdio.h> void sa(int *ko); int main(void) { int i,te[10]; for(i=0;te[i]!=-1;i++){ printf("数字を入力(100以内)\n"); scanf("%d",&te[i]); while(te[i]>100){ printf("やり直し\n"); scanf("%d",&te[i]);}} sa(te); return 0; } void sa(int *ko) { int i=0; while(ko[i]!=-1){ printf("%d\n",ko[i]); i++;}}
>>218 色々と突っ込みどころだらけで恐らくは期待した通りには動かないだろうとは思うけど、
いきなり画面が黒くなったりうんともすんとも言わなくなるとは思えないな。
te[i]に何も入っていない段階で-1と比較しているからだと思うが。
>>219 scanf の落とし穴に引っかかっても
画面が(ry になるような感じじゃないものな
そうか、teの初期値によってはスタックオーバフローするのか。
再帰じゃないし、スタックオーバーすることある? # 不正アクセスはあるけど
スタックオーバーフローはしないんじゃね?
条件がそれば&te[i]が進みすぎて、9x系ならアクセスバイオレーションでBSoD出たりするんじゃね?
scanf でどこかのメモリが破壊されて、 それがスタートアップルーチン用の何かの情報を壊して その影響で再帰呼び出しか巨大なスタック領域の確保が 行われたりとか?
Cコンパイラの評価について質問です。 if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) > 0) の文の場合、socket(PF_INET, SOCK_STREAM, 0)が評価され、 次にsockfd = socket()の代入文が評価されるのは理解しています。 その次にif((代入文) > 0)の評価なのですが、どのように評価されるのでしょうか? 代入文で代入された値と0が評価されるのでしょうか? また別の質問なのですが、 if((int_a = funcA()) > (int_b = funcB())) の文は何から評価されるのでしょうか? funcAかfuncBのどちらが先に評価されるのでしょうか?
権限ないところに書き込もうとしたらそれだけで青画面出たりするだろ。
>>227 socket() の戻り値が0を超えるかという評価
231 :
210 :2007/04/23(月) 18:46:58
携帯で書いてる途中で休み時間が終わってしまったので 慌てて見直さずカキコしちゃいました(汗 mallocを書き忘れましたけど、 *をつけて左辺に置いてはいけない例を お願いします
232 :
210 :2007/04/23(月) 18:50:37
aとbにintつけるのも忘れてたorz
>>232 何を知りたいのかよく判らんから、具体的な質問にしてくれ。
char str[] この[]の中に数字が入るときがありますよね。char str[20]とか。 この数字の意味が分からないのです。いやなんとなく分かるんですが、バシっと分かりません。 しかも[]の中の数字なんて無くても良いと思うのですが。 どんな時に使うのですか? すいません、基本的なことで。 お願いします。
235 :
232 :2007/04/23(月) 19:24:18
>>233 >>213 さんに、一概には言えない、と言われたから、どんなときに
戻り値がint*型の関数を代入式の左辺に
*をつけて使ってはいけないのか
教えてください(--;)
その戻り値が指す先が合法ではないとき。
>>234 確保する領域の大きさを自分で決めたいときにつかいますよー
scanfで文字列を読み込んだり
文字列をstrcatで繋げたり
sprintfで文字列を作るときに
領域が用意されてないと大変になります(--;)
>>234 char を20個確保
int a[15] なら int を15個確保
>>234 宣言するときに
char a[]="text";
のように初期化する文字列があれば
括弧のなかには数字は無くても
文字数+1の領域が用意されます。
char a[];
だけだと領域の大きさが分からないからダメです。
関数の引数で
char a[]
と書かれてるときはポインタとして扱われて
char *a
となります。
多分こんなかんじだと思う(--;)
>>235 関数がNULLを返すとき。
関数が無効なポインタを返すとき。
変更不能なオブジェクトを指しているポインタを返すとき。
241 :
227 :2007/04/23(月) 19:41:51
つまり条件分岐文は左から右に評価されるのが決まりであるという事ですよね。 参考になるページを貼っていただいて助かりました。 なんとか理解できそうです。
>>241 条件分岐文ってのが何を意味してるのか今ひとつわからんが、
一般的には左から右に評価されるわけじゃないぞ
>>237 ,
>>238 ,
>>239 ありがとうございます!
バッチリ理解できました。
調べても答えが見つからなくて困ってました。
本当に助かりました。ありがとうございます。
これで先に進めます♪
文字列じゃなくてchar型の配列として考えるなら char a[16]="0123456789abcdef"; printf("%1s\n",a[i]) みたいに文字数ぴったりで宣言することもある (--;)と思う
245 :
235 :2007/04/23(月) 19:49:56
>>240 つまり普通にポインタを扱うときと同じ注意をすればいいんですね。(--;)
あと関数内の静的じゃない変数のポインタもダメですね
ありがとうございました
>>246 演算子の優先順位とオペランドの評価順序は別物
何もそんな怪しげなサイトから優先順位表を探してこなくても……
>>247 質問者はオペランドの評価順は聞いていないと思うけど
質問の内容からも ( )、=、>、< の評価順位を聞いていると思うんだけど違うの?
いや、どう見ても評価順序の質問だと思うが・・・
>>249 お前さん、評価順序と優先順位を混同してるんじゃない?
3項演算子やビット関係の演算子でよくミスするなぁ… a = 0x01; x = 0x01 + a & 0x01 == 0x00 ? 0x01 : 0x10; わけわかんない(--;)
不安になったらすぐに括弧使え
(--;) <- これ目障りなんだが
すいません(i--;)
文は括弧でくくれないんじゃないのか。
258 :
201 :2007/04/23(月) 23:17:49
基礎的な質問にお答えありがとうございました。 単語の意味もわからず文法習っている感じなんですよね。 ただいま配列変数やっております。
式はくくってもいいが文(式文)はくくっちゃダメだろと重箱の隅突付き
重箱の隅、って事はない。 その辺りの区別を「どうでもいいや~」とか思ってると いつまでたっても初心者を脱することはできない。
262 :
デフォルトの名無しさん :2007/04/23(月) 23:42:49
ポインタについてなんですが、 char *str; str="ABC"; は可能で scanf("%s",str); がダメな理由がわかりません。お願いします
>>262 前者はただのポインタ変数へのポインタの代入。
後者はscanf()がポイント先を変更する前提としてのポインタの引き渡し。
従って、文法上は何ら問題がない。
ただ、scanf()の仕様上そのポインタのポイント先が代入可能領域でないといけないだけ。
ポインタは矢印。 str → (どこも指していない) >str = "ABC"; str → "ABC" str は "ABC" を指す。OK >scanf("%s",str); str → ここに何かを書き込もうとする どこも指していない場所に書き込もうとしているのでアウト
どこも指していない、だとデフォでヌルポインタと 言っているみたいで誤解が生じないか?
266 :
デフォルトの名無しさん :2007/04/23(月) 23:58:55
>>263-264 ありがとうございます。なんとなくわかりました。ポインタ変数には代入できないということですね
>ポインタ変数には代入できないということですね 何でだよwww
指している先がハッキリしていようと 書き込み可能領域じゃないといけないわけで
おまいら頼むから俺にもわかるようにインダス語で文明してくれ
>266 ポインタ変数に代入はできるぞ。代入できない変数に意味はないだろう。 char *str; scanf("%s" str); はstrに代入するのではなくstrが指している先にchar(の配列)を設定しようと している(この辺の表現は微妙だけど、、、) しかしこの場合strはでたらめなところを指しているのででたらめなところに 文字列を設定しようとする。たまたま動くかもしれないし、動かないかもしれない。 char *strの替わりにchar str[1024];とかするととりあえずは動くだろう (バッファオーバーフローのことは目をつぶる) int n; scanf("%d" &n); この場合に&nが指しているさき(すなわちnであるのだが)に数値を設定する。 この&nと上記のstrが同じような意味合い。
楔形文字使うんだっけ? そういえばUNICODEにもあったハズ・・・
>273 そう?わかってるつもりだけど。 微妙な表現があるのはわかってるけどこかまちがってるか?
あ、インダス語は理解があやふやっていうかわかりませぬ。
おまいら頼むから喪れにもわかるようにカードダスで印刷してくれ
277 :
デフォルトの名無しさん :2007/04/24(火) 02:20:57
私の勉強中の本ではscanfを使わずに、 初心者はfgetsしてからsscanfを 使うようにと書いてあります。 なぜですか??
>>277 scanf()は癖があって使いにくいから。
例えばscanf("%d", ...)がループの中にあったとして、うっかり数字以外の文字を入れてしまうと泣ける。
Cでソケットプログラミングをしているのですが、どうしても分からない事があります。 ↓はデータ受信側のソースの一部なのですが、 n = connect(sock, (struct sockaddr *)&server, sizeof(server)); while(n==SOCKET_ERROR){ n = connect(sock, (struct sockaddr *)&server, sizeof(server)); } このconnect()を抜けた直後に、recv()でデータを受信するというプログラムになっています。 一方送信側は、accept()の直後にsend()によってデータを送信するようになっています。 しかし、send()を実行したところ、SOCKET_ERRORが返ってきてしまいます。 コネクションが確立した直後にsend()を実行してSOCKET_ERRORが返ってくることなんてあるのでしょうか?
280 :
279 :2007/04/24(火) 04:22:57
調べたところ、connectのループを、接続を確立せずに抜けてるみたいなのですが・・・ SOCKET_ERRORである限り、永遠にconnectするように設計しているのですが、 何故(コネクションを確立せずに)ループを抜けてしまうのでしょうか?
WSAGetLastError
>>262 ポインタを通して読み書きするには、ポインタが適切なメモリ領域を指し示していなければならない。
ポインタが他の変数が適切なメモリ領域を指し示すようにするには、適切なメモリ領域へのポインタを代入すればよい。
その適切なメモリ領域へのポインタを得る方法には、
変数に&演算子を使用する、配列(先頭要素へのポインタへ変換される規則)、mallocなどといった方法がある。
"ABC"のような文字列リテラルは、自身のメモリ領域を伴った配列という扱いで、
ポインタ型の変数に書き込めば、その変数は文字列リテラルのメモリを指し示すようになる。
一方scanfでは、既に適切な(つまり読み書きできる)メモリ領域を指し示した状態のポインタを引数に取ることが
前提とされており、そこへ入力されたデータを書き込むという動作を行っているので、
適切なメモリ領域を指し示していないポインタを渡してはならないのだ。
>小数部のないdoubleをlongに代入しても問題はない これは間違いだよ、ととある所に書いてあったのだけど、別に それほど問題にはならないんじゃ、とか思った漏れは逝って 良しですか?
>>283 そこだけ抜き出されても、書かれた趣旨は判らない。
敢えて言うならdouble値はlong値よりもはるかに広い数を扱えるので、
単純に代入はできない。また、精度の問題で単純な代入では問題がある。
>>283 それは暗黙的にlong intにキャストされる際に小数部を切り捨てられるから
小数部を使わないdoubleなら(表現幅がlongの範囲内であれば)実質的な
データの欠損は無いから大丈夫って意味じゃない?別に問題無い気がする。
284が言ってるようにlongの範囲外のデータが入ってるdoubleはアウアウだけど。
>>285 単なる代入(暗黙のキャストによる切り捨て)でいいか、丸めを必要とするかは検討すべきだけどね。
とりあえず初心者には配列=ポインタ+書き換え可能メモリーと教えた方がよくないか?
>>285 >>286 浮動小数点型の内部表現では、
小数部のない数値の表現は頭の1ビットが
…(省略されました。各自ググって下さい)
って事じゃねーかな?
いや、ググるもなにも、あんたが何を言いたいのか判らんのだが。 そもそも、小数部の有無と内部表現には関連が無いぞ。
290 :
288 :2007/04/24(火) 12:12:42
>>289 関連はあります
仮数部に注目して下さい
2の補数表現で巡回少数形の値への危惧?
うーん、小数部があろうがなかろうが最初の1ビットは記録されないのだけれど、 この自己主張の下手な困ったチャンは一体何が言いたいのだろう…… #まさかとは思うけど、IEEE前提だよね?
c 入門の入門って本で勉強してます。 今日、ちょっとだけ他の本を立ち読みしたら・・・。 まだこんなに難しいのあるのかいな!ってな感じでショックを受けましたw 歳も30後半だし、中卒だしw超初心者だし。 c勉強してなんになるんだろうと思いながら毎日勉強してます。 ちょっと小言を言いたかっただけです。すっきり。 すみませんでした。
じゃVB.NETかJavaをやれw その歳でCをはじめても仕事ができるレベルになるまで時間がかかりすぎるだろ
295 :
279 :2007/04/24(火) 16:03:32
>>279 です
WSAGetLastErrorで調べたところ、connect直後の値は0でした。
しかし、相手側のacceptはずっと接続待ちの状態でした。
なんか違うアドレスに接続してるのかと思って、アドレスを確かめましたが、
間違ってはいませんでした。というか、接続が確立される時とそうでない時があるのが不思議です。
もうダメぽ・・・
30後半の人が、未成年でもできるようなことを 身につけてもどーしようもないだろ。
>>296 それを言ったらプログラミングそのものが
>>218 ですが
#include <stdio.h>
void sa(int *ko);
int main(void)
{
int i=0,te[10];
do {
printf("数字を入力(100以内)\n");
scanf("%d",&te[i]);
while(te[i]>100){
printf("やり直し\n");
scanf("%d",&te[i]);}
i++;
}while(te[i-1]!=-1);
sa(te);
return 0;
}
void sa(int *ko){
int i=0;
while(ko[i]!=-1){
printf("%d\n",ko[i]);
i++;}}
でまともにうごいたんですが
画面が暗くなった原因がいまだわからん!
>>298 どの段階で暗くなったかを言わないと誰もわからないと思う
5つ目を入力中だったとか14個目を入力中だったとか
まぁ考えられるのは11個以上入力したときのデータ破壊だけど
このプログラムもまともに動いたかもしれないがte[]が入力個数のチェックしてないのは危ない
せめてdo{}while(); のwhile(te[i-1]!=-1); を while(i<10&&te[i-1]!=-1); にしたほうがいいよ
300 :
デフォルトの名無しさん :2007/04/24(火) 20:16:22
質問なのですが、 #include<stdio.h> #define LOOPS 3 main(){ int i ; for(i = 0; i < LOOPS; i++) printf("%d\n", i+1); return 0; } を使って結果を以下のようにしたいのですが、 どう変えれば良いでしょうか? 1:叫ぶ 2:寝る 3:起きる
#include<stdio.h> #define LOOPS 3 main(){ /*int i ; for(i = 0; i < LOOPS; i++) printf("%d\n", i+1);*/ puts("1:叫ぶ"); puts("2:寝る"); puts("3:起きる"); return 0; }
#include<stdio.h> #define LOOPS 3 char *msg[]={"叫ぶ","寝る","起きる"}; main(){ int i ; for(i = 0; i < LOOPS; i++) printf("%d:%s\n", i+1,msg[i]); return 0; }
303 :
300 :2007/04/24(火) 20:29:03
>>301-
>>302 サンクスです!!
>>301 この文法はまだ、教本で習っていないのですが
>>printf("%d\n", i+1);*/
puts("1:叫ぶ");
puts("2:寝る");
puts("3:起きる");
*/ の解説を宜しくお願いします、教本にも載っていません・・・・。
>>302 char *msg[]={"叫ぶ","寝る","起きる"}; は
どうして、char msg[]={"叫ぶ","寝る","起きる"}; では
いけないのでしょうか?
教本の説明でもダメ、これは入れられなく
ポインタを使い先頭のアドレス云々と解説してありますが
いまいち、どうしていけないのかわかりません。
>>303 文字列リテラルの型は char* (charへのポインタ)であるから、
それの配列なら char *[] (charへのポインタの配列)だろう。
>>303 "叫ぶ","寝る","起きる"ってのは文字列なので、要はアドレス。
だから、char型ではダメ。
ポインタを使わない方法として char msg[][10]={"叫ぶ","寝る","起きる"}; これならいけるんじゃないか
308 :
300 :2007/04/24(火) 20:46:13
ありがとうございます。
>>304 よく見たら、コメントでした。
/*int i ;
for(i = 0; i < LOOPS; i++)
printf("%d\n", i+1);*/
puts("1:叫ぶ");
puts("2:寝る");
puts("3:起きる");
は
int i;
for(i = 0; i < LOOPS; i++){
printf("%d\n", i+1);
puts("1:叫ぶ");
puts("2:寝る");
puts("3:起きる");
}
ではいけないのでしょうか?
どうして、putを使えば順番に出力されるのでしょうか?"%s"は使っていませんよね。
/**/が関係してるからでしょうか?
>>305-
>>306 わかりました!charだと一文文字列や文字型だけですから。
ポインタを使いcharへアドレスを入れていく感じででしょうか?
>>306 それでは初心者への答えとしても知ってる人への説明としても間違ってる
>>303 "叫ぶ""寝る""起きる"はどれも文字配列
変数msgが1つの配列なら、"叫ぶ""寝る""起きる"の3つの配列がいれられないってのはわかるだろ
そこで二次元配列という配列を入れる配列を使うが、ややこしいのでポインタとあわせてじっくり理解汁
>>308 いけないと思うのなら、試しにそれでコンパイル・実行してみろ。
311 :
300 :2007/04/24(火) 21:02:06
>>309 難しいですね・・・・
>>310 Borlandがコンパイラるエラーを起こしてしまいます。
>>308 printf("%d\n", i+1); これも実行される
求めている出力結果と違ってくるジャン
313 :
300 :2007/04/24(火) 21:03:39
もう一つ最後に質問ですが #include<stdio.h> #define LOOPS 3 char *msg[]={"叫ぶ","寝る","起きる"}; main(){ int i ; for(i = 0; i < LOOPS; i++) printf("%d:%s\n", i+1,msg[i]); return 0; } でなく #include<stdio.h> #define LOOPS 3 main(){ int i ; char *msg[]={"叫ぶ","寝る","起きる"}; for(i = 0; i < LOOPS; i++) printf("%d:%s\n", i+1,msg[i]); return 0; } とグローバル関数として定義しなくてもいいのでしょか?
314 :
300 :2007/04/24(火) 21:11:04
ちょっと、混乱してきたので出直してきます。 サンクスですた。
316 :
デフォルトの名無しさん :2007/04/24(火) 21:59:08
マージソートでは、ソートしたい配列を2つに分けますが、 2つに分ける際に、片方は順番に、もう片方は逆順にして分けていくソースが見られます 逆順にする利点に関して教えてください よろしくお願いします
#include<stdio.h> int main (void) { int a; printf("%p\n",a); /*その1*/ printf("%p\n", &a); /*その2*/ return 0; } その1とその2で なんで違うんだろう。 誰か教えてくれ
318 :
デフォルトの名無しさん :2007/04/24(火) 23:10:20
逆順ってなに?
319 :
デフォルトの名無しさん :2007/04/24(火) 23:12:14
>>317 %pはアドレスを表示する。
だからその2の使い方があってる。
その1は使い方自体が誤り。
なんか宿題っぽい質問が続くな。
答えがわからない度にいちいち聞くつもりか。 っていうかこういうのは言わば確認問題なのであって、 問題の前に書いてあることをちゃんと読んでいればわかるはずなんだが。
>>320 「宿題っぽい質問」つーよりは、「人に訊く以前のレベルの質問」だろう。
324 :
デフォルトの名無しさん :2007/04/25(水) 00:54:06
自分で考えたのかよ
ループけちってるだけだろ
%pとかなんて 「C言語 %p」でググればいくらでも出てくるでしょ
unsigned long int と unsigned long の違いを教えて欲しい intを省略しているところが結構あるんだが。
同じ。違いは字面だけ。
なんだと! ありがと
331 :
デフォルトの名無しさん :2007/04/25(水) 23:33:04
配列とポインタの関係についてなんですが、 char a[]="abc"; において'b'を表す方法として、a[1]はわかるんですが、何故*(a+1)としてもいいのかわかりません。 *(a+1)のaが先頭アドレスで、そこから1つ先の中身を指さすという意味合いはわかるのですが、 ポインタ変数を宣言してないのに、配列を*で表せるという事がわかりません
>>331 意味合いが分かっているなら、
そう定義してあるから、としか答えようがないな
式のp[i]は*(p + (i))と等価 添え字演算子はそうなるように定義されている
334 :
デフォルトの名無しさん :2007/04/25(水) 23:41:50
>>332-333 ポインタはchar *pのような宣言をしないと使えないと思っていたので、
頭がこんがらがってるだけかもしれないんですが、
配列を宣言するとポインタを宣言しなくても*で表せるという決まりということなんでしょうか・・。
上の例だと、適当なアドレスに'a','b','c'が連続で割り当てられ、
a[0],a[1],a[2]がそれぞれを表していますが、
この時同時に、*(a+1),*(a+2)のようなポインタが適当な場所に作られるということでいいんでしょうか?
>>334 式の中において、配列は、その配列の先頭要素を指すポインタに変換されるという規則がある。
概念的には配列aは式の中だと&a[0]として扱われるという感じ。
336 :
デフォルトの名無しさん :2007/04/25(水) 23:54:30
>>335 わかるようなわからない感じなんですが、
配列a[]が宣言された時点でaがポインタに変換されるという事で、
>>334 に書いたようにポインタが別の領域につくられるという事ではないんでしょうか・・
つーかポインタ宣言の*と参照の*は別物と考えればノープロブレム
>>336 「ポインタ」と「ポインタ変数」の区別がついてない気がする。
>>339 それを言うならアドレスとポインタじゃないのか?
>>340 「アドレス」の話など、誰もしていません。
>>336 コンパイラが同じと解釈するので
出てくるコードが同じになる、と思えばいいかと
>>342 ポインタわかってないならコンパイラなんか意識してないだろうから
余計分かりづらいんじゃないか。
link reverse(link x){ link t, y= x, r= NULL; while( y!=NULL ){ t= y->next; y->next= r; r= y; y= t; } return r; } これってさlink xを辿っていった最後のlinkを返すだけのプログラム? だったらもwhile(y!=NULL)y=y->next; return y;で済むはずなんだけど 本当はrがどうなってるの?リストを反転させるためのメソッドらしい
>>344 自分で答え書いているよ。文字通り、linkedListを反転させている。
こんなイメージを手で追ってけば理解できるっしょ。
与えるリスト
x
next→?1
next→?2
next→NULL
関数entry
y = x
loop1
t = ?1
x->next = NULL
r = x
y = ?1
loop2
t = ?2
x->next = x
r = ?1
y = ?2
loop3
...
xが NULL→4→6→3→8→2とリンクしていたら return rのrは 2→8→3→6→4→NULLとなっているのですか?
どっちかと言うと、 x ↓ 4→6→3→8→2→NULL を r ↓ NULL←4←6←3←8←2 にしてrを返しているイメージだな。 つまり、ターミネータつき可変長配列ではターミネータの検索と入れ替えの2フェーズ掛かる処理が リストだと繋ぎ替えの1フェーズでできるって好例だね。
開いたファイルを表示させてからもう一度その同じファイルを 読み込もうとすると、中身が読み込めなくなってしまいました。 同じファイルをまた使うにはどうしたら良いでしょうか? 使用したソースとテキストの内容は以下のものになります。 #include <stdio.h> void fd(FILE *fp) { int ch; printf("\n- - - - - START - - - - - -\n"); while( (ch=fgetc(fp)) != EOF) { printf("%c",ch); } printf("\n- - - - - E N D - - - - - -\n"); } int main(void) { FILE *fp; char *fname="aaa.txt"; if( (fp=fopen(fname,"r")) == NULL) return 1; else { fd(fp); fd(fp); } fclose(fp); return 0; } - - - - - - - - - - - - - - - - - - - - - - - - aaa.txt の中は以下のものを書いたものを使用してみました。 abcdefghijklmnopqrstuvwxyz 012345678901234567890123456789 - - - - - - - - - - - - - - - - - - - - - - - - ファイルの中を表示するfd()の2回目の実行ではファイルの中身が表示されません。
>>348 if文のtrue節で脱出しているのにelse節で処理を書くのはよくない。
一行に二文突っ込むのもよくない。
ってことで、
if( (fp=fopen(fname,"r")) == NULL)
return 1;
else { fd(fp); fd(fp); }
を
fp=fopen(fname,"r");
if(fp == NULL) {
return 1;
}
fd(fp);
rewind(fp);
fd(fp);
にして味噌。
>>349 できました、お早い返答、ありがとうございました。
ついでに言えば、printf("%c",ch)もputchar(ch)で充分だな。
速度的にputcharの方が早いってどっかで聞いたんだけど、ほんと?
>>352 大丈夫、賢いコンパイラならprintf("%c",ch)をputchar(ch)同等に最適化してしまうから。
354 :
662 :2007/04/26(木) 13:33:30
#include <stdio.h> #include <stdlib.h> typedef struct node *link; struct node heada; struct node { int item; link next; }; main(int argc, char *argv[]){ int i; link t=malloc(sizeof *t),a=&heada; t=a; for(i=1;i<=8;i++){ t=t->next; t->item=atoi(argv[i]); } t->next=NULL; t=a; t=reverse(t); for(i=1;i<=8;i++){ printf("%d\n",t->item); t=t->next; } } link reverse(link x){ ←ここで'reverse' の再宣言で型が一致していない、とエラーが出るのですがどうしてですか? link t, y= x, r= NULL; while( y!=NULL ){ t= y->next; y->next= r; r= y; y= t; } return r; }
main()の中でreverse()を宣言なしで使用したため、暗黙のプロトタイプ宣言が為されたと見なされてしまったため。
>>351 目的次第ではないでしょうか?あまり余計なことを言うとボロが出て逆に突っ込まれますよ?w
書式指定で表示する必要があればputcharで充分にはなりませんので、あしからず。
>>349 > if文のtrue節で脱出しているのにelse節で処理を書くのはよくない
なんで?
> fp=fopen(fname,"r");
別にifの外に書かなくても問題ないよ。知ったか乙
357 :
デフォルトの名無しさん :2007/04/26(木) 13:37:25
>>353 はい、知ったか乙w 脳内妄想じゃなくて証拠を提示してくれよ
>>356 突っ込みご苦労。一応フォロー。
>書式指定で表示する必要があればputcharで充分にはなりませんので、あしからず。
コンパイラと同じ最適化をしただけ。勿論、「この場合は充分だ」と言う意味だ。
>> if文のtrue節で脱出しているのにelse節で処理を書くのはよくない
>なんで?
単純に見通しが悪くなる。どうせやるなら、その後のfclose()まで全て含めるべき。
>> fp=fopen(fname,"r");
>別にifの外に書かなくても問題ないよ。知ったか乙
別に問題ないね。それについては私の趣味だ。ついでに言えば、それについて何も言及していないので知ったかも何も無い。
突っ込みすることだけを目的にスレを曲解した(或いはそのようにしか読めない)のだろうけれど、見苦しいよ。
359 :
デフォルトの名無しさん :2007/04/26(木) 13:46:09
>>358 > 単純に見通しが悪くなる。どうせやるなら、その後のfclose()まで全て含めるべき。
ほら、でた、お前の「主観」。様々なソースを見てみればわかるが、ifの中に入れても問題はないよ。
ありもしない問題を自分の主観で問題視しないように。ここはソースの記述内容を
お前の主観で評価するところじゃない。質問の要点に答えるだけにしないと、関係ないことでトラブルになるぞ。
それから、putcharについては完全にお前の主観だから黙ってろ。
>>357 はいよ。ちなみにこれは、foo.cとgcc -S -O3 foo.cした結果ね。
--
#include <stdio.h>
int main(int argc, char ** argv)
{
int ch = getchar();
putchar(ch);
return 0;
}
--
.file "foo.c"
.def ___main; .scl 2; .type 32; .endef
.text
.p2align 4,,15
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
--
一部省略
--
movl 4(%eax), %edx
movl %edx, (%esp)
call _getc
--
ここも省略
--
movl 8(%eax), %eax
movl %ebx, (%esp)
movl %eax, 4(%esp)
call _putc
--
以下も省略
>>359 puthchar()についてはコンパイラの最適化でさえ主観と申されるかw
主観だから黙ってろと言うことなので以下割愛。
362 :
デフォルトの名無しさん :2007/04/26(木) 13:50:05
はいはい、ピーコの辛口ソースチェックは良いから、問題の「要点」に答えるように。 そのソースは自分スタイルじゃないって評価はいらねーってw
rewind だけをこそっと教えるより、fseek の存在を教えたほうがためになる希ガス
364 :
360 :2007/04/26(木) 13:51:42
いけね、間違えちった。こっちが問題の証拠の方。 -- #include <stdio.h> int main(int argc, char ** argv) { int ch = getchar(); printf("%c", ch); return 0; } -- .file "foo.c" .def ___main; .scl 2; .type 32; .endef .text .p2align 4,,15 .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl $16, %eax movl %esp, %ebp subl $8, %esp andl $-16, %esp call __alloca call ___main call ___getreent movl 4(%eax), %eax movl %eax, (%esp) call _getc movl %eax, (%esp) call _putchar -- 以下省略。下手に対照実験なんかするもんじゃないなw
>356 "書式指定してない"んだからputchar()でいいじゃん。 何が気に入らないの?
>>365 知ったかなんて言ったら失礼だよ。>357は偶偶知らなかっただけでしょ。
368 :
デフォルトの名無しさん :2007/04/26(木) 14:00:23
>>366 =
>>367 しつこい、ここはお前スタイルでソースを評価するスレじゃないんだよ。
どこを見てもif()の中にfp=fopenを書いてはいけないという制約はないよw
ほらほら、熱くなって読解力が落ちていますよ。 >366と>367は同一人物じゃありませんからね。
370 :
デフォルトの名無しさん :2007/04/26(木) 14:03:13
>>358 > 別に問題ないね。
> それについて何も言及していないので
とか言っているが
>>349 に
> 一行に二文突っ込むのもよくない。
自分で良くないと言及しているのに問題ないと?w
所詮お前の主観、問題のない部分に対する突っ込みはトラブルになるんでご注意を。
ちうかこいつなんだ?プロ気取りか?w
>>370 思いっきり勘違いしていないか?
> 一行に二文突っ込むのもよくない。
は、
>else { fd(fp); fd(fp); }
のことだぞ。
372 :
デフォルトの名無しさん :2007/04/26(木) 14:06:46
俺のポリシーだと 「一行に二文突っ込むのもよくない。」 だっておーーー(バンバン)(巨大VIPPERのAA略)
373 :
348 :2007/04/26(木) 14:21:42
>>348 ですが、printf("%c",ch); の書式を%dにして文字コードを表示する当てがありましたので
printfを使って書いていました。いずれこれを、ファイルのダンプと文字コードを16進数で表示させる
プログラムに発展させるつもりでしたので・・・
>368 俺は366なんだが367じゃないし、そもそも349でも351でもないんだが。 っていうかputchar()についてしか言ってないのにifの中がどうとか言われても…・・・
375 :
348 :2007/04/26(木) 14:23:34
>>371 それについてはここに書き込む際に行数を減らすために書き直しただけです。
手元にあるソースにはそのようには書いてないです。
黙っちゃったな。やっと自分の主張も主観に過ぎないと気づいたか。
377 :
デフォルトの名無しさん :2007/04/26(木) 16:11:12
実数を入力し小数点以下第1位で四捨五入し整数部を表示しなさい 実行画面 実数入力==>10.4 四捨五入:10 実数入力==>10.5 四捨五入後: 11 になるプログラムを作成しなさい この問題わかる方がいましたら教えてください(T_T)
>>377 四捨五入したい値に0.5をどうにかして整数部だけ表示すればいいと思うよ
ちゃんとした回答が欲しかったら宿題スレにどうぞ
>>377 ただし、1.4999999999とかやると2進数の小数点以下の精度の問題上、正確に結果がでませんのであしからず。
#include <stdio.h>
int main(void) {
double x;
printf("実数入力==>");
scanf("%lf",&x);
if( x-(int)x >= 0.5 ) x=(int)x+1;
else x=(int)x;
printf("%0.lf",x);
return 0; }
俺んとこの環境じゃ1.4999999999999999でやったら2になってもうた
>>381 printf("%d", (int) (x + .5))だとどうなる?
どうもscanf()では、精度的に1.499999999999999(9が14個)が限界のようだ。 しかしこれを"%.20g"で出力すると1.499999999999998になる。 実際に内部形式から逆算すると1.4999999999999998が限界だ。
まぁ、
>>377 は小数点第1位で四捨五入って書いてあるから
その範囲内でなら問題ないんだけどね。
要するに、1.4999999・・・限りなく1.5に近い値ではなくそれを1.4で換算すればね。
385 :
デフォルトの名無しさん :2007/04/26(木) 17:56:18
現在日本電子専門学校の情報処理科に通ってる者ですがC言語の授業の進み具合が遅いため独学でC言語を勉強したいのですがオススメの参考書ってありませんか? なにぶん始めたばっかしなので解りやすいやつでお願いします
専門学校の教科書で独習すれば?
387 :
デフォルトの名無しさん :2007/04/26(木) 18:16:18
自己課題として、52枚のトランプ(ジョーカー含まず)を使って ブラックジャックを遊ぶプログラムをつくってたのですが 分からない点がでてきてしまいました。 52枚のカードの作成方法は(私が思うに) 文字型のポインタ char *card[]; を定義して for文の二重ループの方法でマークと数字を書き込むんじゃないか…… と検討は付いたのですが char型のポインタに"マーク"(文字列)と"数字"(整数値)の二つを 書き込む方法が見当たりません。。。 いったんは、書き込む数字を整数値から文字列に変えて再試行しましたが for文の式(各マークに数字書き込む段階)で整数値を使っている以上 文字列への変更はできないように思われて・・・ どなたか 文字列のポインタに 文字列と整数値の相違種を書き込むをする方法を教えてくださいm(_ _)m
>>387 取り敢えず、char *card[]ではダメだね。
こんな手はある。
char cards[52][4] = {"S A", "S 2", "S 3", /* 途中省略 */ "S10", "S J", "S Q", "S K", "H A", /* 省略 */ "D K"};
動的にやるより自由度は高いよ。
動的にやりたいなら、char cards[52][4]を用意して
for (int ic = 0; ic < 52; ++ic) sprintf(cards[ic], "%c%2d", "SHCD"[ic / 13], ic % 13 + 1)かな。
数字の配列でいいじゃん。 card / 13 でスートが出るし card % 13 + 1で数字が出る
390 :
388 :2007/04/26(木) 18:48:17
表示用じゃないの? てっきりそうとばかりw
質問が意味不明
>>388 これなら自由だべ。
static char const suits[] = "SHCD";
static char const numbers[] = " A 2 3 4 5 6 7 8 910 J Q K";
char cards[52][4];
for (int sc = 0; sc < 4; ++sc) {
for (int nc = 0; nc < 13; ++nc) {
sprintf(cards[sc * 13 + nc], "%c%2.2s", suits[sc], numbers + nc * 2);
}
}
2次元配列を使う上で 配列名sのs[2][2]に2つの文字列を表示させたい時は どうすることが考えられますかね? 1つの文字列 japan korea eng NULL eng/fra bra NULL NULL arg このeng/fraみたいな表示したいんだけど。
394 :
393 :2007/04/26(木) 19:29:27
ですけど2行目は無しで考えてください。
396 :
393 :2007/04/26(木) 19:30:49
engは最初からはいってるとします。 その次に/fraをいれたい
strcat
まだわからん データ構造がどうなってて、どうしたいのか
399 :
デフォルトの名無しさん :2007/04/26(木) 19:34:41
8桁の数字がタブで区切られながら書いてあるデータから、8桁の数字ごとに配列に入れていきたいのですが、どのようにすればよいでしょうか。なにぶんC言語に不慣れなため分かりません。 誰か教えていただけるとありがたいです・・・。
破壊していいなら strtok で切り出す。 sscanf で抜き出してもいいし、固定桁ならstrncpyしてもいいし 1文字ずつ読んで1つ1つコピーしてもいいし
401 :
デフォルトの名無しさん :2007/04/26(木) 19:41:04
>>400 ありがとうございます!
がんばってみます。
402 :
393 :2007/04/26(木) 19:42:16
今おもうと 表示するときだけ2つ表示させて プログラム内ではその場所に2つめが入ってるようにしたいんですけど。 japan korea eng NULL eng/fra bra NULL NULL arg でいうとeng/fraと表示させたいけど s[1][1]の中にはfraがはいってる感じに。
日本語でおk
>>399 #include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 10
int main(void){
char *filename="8桁の数字がタブで区切られながら書いてあるデータ";
FILE *fp;
long array[ARRAY_SIZE];
int i;
fp=fopen(filename, "r");
if(fp==NULL){
fprintf(stderr, "\nError: %s file cannot open.\n", filename);
exit(1);
}
for(i=0;i<ARRAY_SIZE;i++) fscanf(fp, "%ld", &array[i]);
for(i=0;i<ARRAY_SIZE;i++) printf("%3d : %ld\n", i, array[i]);
fclose(fp);
return 0;
}
405 :
393 :2007/04/26(木) 19:48:23
リストつかわないとだめかなあ やっぱり。 s[1][1]に文字列engがはいってるとする。 この文字列を違う領域にコピーして 次の文字列fraをs[1][1]にいれ fraをその違う領域にstrcatでつなげてその違う領域を表示 がベストかな?
>>405 独り言ならよそでやって欲しい。
そうでないなら他人にも理解できる文章を書いてくれ。
407 :
393 :2007/04/26(木) 19:57:49
まあありがとうございます。 大体できそうだ プログラムが。 2次元配列2つ使わないといけないのかめんどくさ
struct a{ unsigned int b[8]; }; struct a f(void); int main(void){ int i; struct a p; p=f(); for(i=0;i<=7;i++) if(p.b[i]==1){ printf("?"); } } return 0; } のようなプログラムで、 構造体の要素の配列bには0か1しかいれないので、 ビットフィールドかビットフラグを使って書き換えたいのですが、 添字が使えないのでfor文が使いにくいです。 どうすればいいでしょうか。
ビットフラグならシフトすればいいだけだろ
412 :
デフォルトの名無しさん :2007/04/26(木) 21:15:12
>>388 ,389,392
ありがとうございます!
ポインタではなく、二次元配列だったんですね
引き続き頑張ってみます、ありがとうございました
>>413 コラ!409=393なんだから触っちゃいけません!!
>>387 もう見てないかも知れないが、俺は
>>389 の方法が良いと思うんだがなあ。
表示するときだけ文字列に変換すればいいだけなんだし。内部では 0 ~ 51
の数値で扱えば良いじゃん。で、表示の時に printf("%c%d", "SCHD"[n / 4], n % 13);
みたいにする(AJQKも変換したければする)。というか、数値から文字列に
計算して変換する関数を一つ作れば良い。
0~51で扱うと数値から種類や値を出すのに面倒な計算が必要でデバッグの
時に楽じゃないと思うなら 4 ビットづつに分ければ良い。それなら16進
出力させれば桁で分かれるから分かり易い。
いまどきの環境なら絵柄と数字で構造体にするほうがわかりやすいんじゃね?
>>347 rは毎回書き換えられていてr->nextが作られていないようですが、どこでr->nextを作っていますか?
>>417 作っていない作っていない。リンクの繋ぎ替えだけで中身を作り直しているわけじゃないよ。
>>411 シフトして論理積をそのままつかうと表記が長くて汚いので
マクロを使いますがこのように書けば良いでしょうか
#define x(s,t) (((s)>>(t))&1)
意味わからん for (int n = 0; n < 16; ++n) printf("%c", a & (1<<n) ? 'o':'x'); でいいじゃん。 コンパイラによっては警告が出て嫌なら (a & (1<<n)) != 0 でいいし、 nの代わりにenumなりの定数にして特定のフラグにすることも出来るし。
macro使うくらいなら関数にしちゃえばいいのに。
柴田望洋の本(たのしいC)に載ってるプログラムが、うまく動きません。 3つランダムに選ばれた3つの整数a,b,cの和を、人間に求めさせて、計算にかかった時間(秒)を表示するプログラムなんですが、 実行すると、どれだけ計算に時間を使っても「0.0秒」と表示されちゃいます。 以下のようなソースなんですが、どこかおかしいところがあるでしょうか? ちなみに、Mac OS Xのターミナル & CotEditor を使っています。 教えてエロい人...。
423 :
422 :2007/04/27(金) 11:21:15
#include <time.h> #include <stdio.h> #include <stdlib.h> int main(void) { int a,b,c; /*加算する数値*/ int x; /*読み込んだ値*/ clock_t start,end; /*開始時刻,終了時刻*/ srand(time(NULL)); /*乱数の種を初期化*/ a = 100+rand()%900; /*100~999の乱数を生成*/ b = 100+rand()%900; /*100~999の乱数を生成*/ c = 100+rand()%900; /*100~999の乱数を生成*/ printf("%d+%d+%dは何ですか?: ",a,b,c); start=clock(); /*計測開始*/ while (1) { scanf("%d",&x); if (x==a+b+c) break; printf("\a違いますよ!!\n再入力して下さい: "); } end=clock(); /*計測終了*/ printf("%.1f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC); return (0); }
void sample(){ exit(0) } int main(){ char *c; c=(char *)calloc(10,sizeof(char)); sample(); free(c); return 0; } 上記のように、mainで確保した領域を開放するには、mainの最後にfreeを行うだけでいいのでしょうか? それとも、exitがある関数にも、引数を参照渡しにして、exitの直前にfreeを行わなければならないのでしょうか?
>>424 教条主義的に必ず解放したいのならexit()する関数でもfree()するべき
……というよりは、exit()を使わないようにするべき。
>>423 clock()は環境依存な関数なので、OS Xの該当関数のマニュアルページを見て味噌。
或いは、CLOCK_PER_SECの値も確認して味噌。
それよりは、time()を使って秒単位の計測で済ませる方が入門者にはいいと思うが。
#つーか、某洋は何考えてclock()なんか使ってるんだ?
>>423 それ、本のままなのか?
典型的なscanf()の使い方の悪い例だぜ・・・
ためしに実行したがWindowsでは経過時間みたいでちゃんと出たが
SolarisでgccだとCPU時間だから0.0しかでないな。
428 :
422 :2007/04/27(金) 12:01:31
>>426 なるほど。clock()は環境依存な関数なんですね。
Windowsではうまく動作しても、OS Xじゃダメと...。
>>427 本のままのソースでつ。
この本、分かりやすいんだけど、
MacやUnix使用者のことあんまり考えてないのかな...。
429 :
419 :2007/04/27(金) 12:24:39
1行だけの場合でもマクロより関数にしたほうが良いのですか? あと、代入式の左辺にしたり、関数にポインタを渡したり できないのはどうにかできないでしょうか
430 :
デフォルトの名無しさん :2007/04/27(金) 12:41:08
ハイビジョンの画像を取り込みたいんですが、配列よりポインタを使った方がいいんでしょうか? どうか知恵をください。
>>430 日本語で頼む。
配列とポインタの間にパフォーマンスの違いは無い。
432 :
デフォルトの名無しさん :2007/04/27(金) 13:06:09
>>432 配列かポインタか以前に何をしたくて何を聞きたいのか不明だな。
>>429 凝ったマクロを作るよりも、関数にしておけばデバッグの助けになるし型チェックはコンパイラがやってくれる。
ついでに、代入関数も作ってしまえばいい。
>>428 >MacやUnix使用者のことあんまり考えてないのかな...。
つーか、発想が古いんでしょ。
434 :
430 :2007/04/27(金) 13:28:11
言葉足らずでどうもすいません! ハイビジョンの画像を処理するために、一度読み込んで、回転かけたりしたいんです。 どういう風に読み込んで、どんな形式に納めればいいか教えて欲しいです。
>>434 ・ハイビジョンの画像とはなにか
・何から読むのか
・どう処理したいのか
・処理した結果をどうしたいのか
>>434 bmpなら構造単純だから直で読み込めるけど
jpgとかpngなら自分でローダ作るよりライブラリ使ったほうが良い。
フォーマットの事書いてないからわからないけど何から読み込むの?
というか前準備として画像処理よりCの勉強した方が…
誤解なら申し訳ないけど文面から察するにポインタを十分に理解してると思えない。
437 :
デフォルトの名無しさん :2007/04/27(金) 13:39:49
>>435 たびたびすいません。
画像は1920×1080画素のビットマップです。
これを読み込んで、回転行列をかけたりしたいです。
計算後はビットマップとして書き出したいです。
よろしくお願いします。
単純にやるなら、ただ普通にw*h*dのメモリ確保すりゃいいだけだろ。 何も難しいことはない
>>437 「ビットマップ」のフォーマットを読む適当なライブラリを拾ってきて、その形式にあわせればいいよ。
>>437 そんなもん自作せんでも ImageMagick とか色々なのが・・・宿題か?
char buf[256]; read(socket_fp,buf,256*sizeof(char)) ソケットから読み出した文字列はbufに格納されるのですが、 この時、\0文字の扱いはどうなるのでしょうか? socketの内容をそのままコピーしてくれるのでしょうか? それとも格納した文字列の最後に\0文字を付けてくれるのでしょうか?
>>441 >それとも格納した文字列の最後に\0文字を付けてくれるのでしょうか?
そんな余計なことはしません。
>>441 >ソケットから読み出した文字列はbufに格納されるのですが、
>この時、\0文字の扱いはどうなるのでしょうか?
バイト列に文字列なんて概念も無ければ特殊な文字もありません。
>socketの内容をそのままコピーしてくれるのでしょうか?
読み取ったものを読み取ったまま格納します。
>それとも格納した文字列の最後に\0文字を付けてくれるのでしょうか?
上2点から容易に導けるように、なんら余計なことはしません。
そもそも256バイト読めと言われても読める分しか読みません。
従って戻り値は必ず確認して、不足があるようなら再度呼び出してください。
444 :
441 :2007/04/27(金) 16:06:57
ありがとうございます ついでにもう2つ質問があるのですが、 ソケットから読み取ったバイト列が256個未満だった場合、 のこりの空きはどうなるのでしょうか? 0で埋められるのでしょうか? またこのようなシステムコールについて、 OSが異なれば副作用の完了点等の挙動は異なるモノなのでしょうか?
>>444 >のこりの空きはどうなるのでしょうか?
どうもならない。
>0で埋められるのでしょうか?
だから余計なことはしないんだってば。しつこいな。
>またこのようなシステムコールについて、
>OSが異なれば副作用の完了点等の挙動は異なるモノなのでしょうか?
システムコールに副作用完了点はありません。
呼び出し時の問題なら、コンパイラ依存です。
ttp://www.ncad.co.jp/~komata/c-kouza19.htm このページの
sigpause(SIGALRM);
は、設定されたタイマーが0秒になるまで全ての処理を停止するってことですか?
また上の方のタイマーの時間を比較するところで
else{
val.it_value=oval.it_value;
oval.it_value.tv_sec=1;
oval.it_value.tv_usec=0;
}
としてるのは再設定されたタイマーの時間が元から設定されていたタイマーの時間より短い場合
元のタイマー設定時間をそのまま流用して、0秒になったら前のタイマーは1秒だけ待つってことですよね
>>446 勉強するのは勝手なんで止めないけれど、現在のUnixでは押し並べてsigpause()は使用禁止になっているから要注意で。
また、秒単位より細かい精度のsleepをしたいだけなのなら、nanosleep()がある筈だからそれを使うこと。
#nanosleep()がない場合はusleep()で。
448 :
446 :2007/04/27(金) 18:50:42
>>447 いえ、signal関数の使い方を調べていました
Manpage見てもsigpause使用するなとなっていて詳しい解説なくて
自分の環境では試せないので両方ともいまいちどういうことをしているのか掴めなかったんです
data[]={1,2,3,4,5,6,7} と置いたときに、data内にいくつ数値が記憶されてるかカウントする関数ない?
sizeof(data) / sizeof(dataの型)
>>449 sizeof(data) / sizeof(* data)
#define lengthof(a) (sizeof(a) / sizeof*(a)) とかよくやるが
453 :
446 :2007/04/28(土) 15:48:32
あ、oval.it_value.tv_sec=1としているのは丁度0秒だと先に元のタイマーが切れてしまうからで 処理が先に進まないようにwhileを使って、ついでにsigpauseを使うと 引数にしたシグナルが割り込むまでnopのような処理をするってことですかね
454 :
デフォルトの名無しさん :2007/04/28(土) 17:42:31
C言語でphoebeというのを使ってるのですが、 #include <stdio.h> int main(void) { printf("Hello world\n"); } エラー E2209 借金大王.c 1: インクルードファイル 'stdio.h' を オープンできない というメッセージが出て困ってます。
そうですか。
つ眼鏡
>454 それコンパイラの設定やってないでしょ。 ヘルプみてちゃんと設定して再チャレンジ。 コンパイラをインストールしていない悪寒がするが、、、、。
さすがにコンパイラ入れてなかったエラーメッセージもでないんでは phoebeなんて使ったことないから知らないけれど
char c; c=fgetc(stdin); c=fgetc(stdin); c=fgetc(stdin); と記述し、実行時に"a"と入力した場合、最後のcに格納されるのは何なのでしょうか? fgetcをするごとにprintfをしてみると、改行(?)が表示されたのですが、その様に定義されているのでしょうか?
printf("%d", c); とでもしてみればわかると思うが… ところで、fgetcの戻り値はcharではなくintだよ。
462 :
460 :2007/04/29(日) 00:40:16
>>461 考えてみたら、2回目のcに'\n'が格納された後は入力待ちになりますよね。
意味不明なことを質問していました。すみません。
>fgetcの戻り値はcharではなくint
今までずっとcharだと思ってました…
今C言語を勉強しているのですが、.hや.cppがどのような構造で動いてるのか さっぱりわかりません・・・ 教えていたたけませんでしょうか?
あ・・・C++でした。 プラプラ入れ忘れです( ´・ω・)
ダブルクォーテーションを早く入力する方法ないでしょうか?
今はどうやって入力してるの?
int num = load_ini; char http_send_text[][] = {if(num && 1){"GET "},if(num && 2){"/ "}}; という感じで、char配列の宣言時に内部で条件分岐使った初期化をさせたいんですけど、 無理っぽいのでしょうか? ポインタ使って動的にメモリ確保して文字列を格納する方法が一番最初に思い浮かぶのですが、 他に上のような単文で実現できるような上手い方法はありませんか? コンパイラの機能特有のものでも構いませんので、詳細をおねがいします。
素直に条件分岐でstrcpyじゃ駄目なの? なんでも単文にすればいいってもんでもないだろうに。
472 :
デフォルトの名無しさん :2007/04/29(日) 10:20:35
c言語でジョンソン法を使って、2工程のフローショップ問題を解くという課題が出されました。 誰かわかる人いたら、教えてください。
何を聞きたいのか要点を絞れ cの質問なのか? ジョンソン法の質問なのか?
474 :
デフォルトの名無しさん :2007/04/29(日) 11:18:04
すいません。 ジョンソン法をCではどのように作ればいいのか、ってことなんですけど。。。
【奨学金の返済もせずに毎日ゲーム配信するニートに法的措置を】
赤影
Peercastの配信者。32歳職歴無しニート。
奨学金の返済約620万を返済せずに毎日ネトゲをプレイしPeercastで配信している。
更に自分を批判してる人は無職だと決めつけ、批判より働くことの良さを教えろと言い出す。
こんな屑を許していいのか。許せるはずが無い。
日本学生支援機構に通報しよう。
現行スレ
http://yy33.kakiko.com/test/read.cgi/peercast/1177501343/ 他はまとめサイト、ブログを参照
ニートでありながら奨学金の返済もせず出所不明の金で以下の構成のPCを組んでいます
CPU:Intel Core2Duo E4300 (2.61Ghz)
メモリ:Team 1024MB (DDR400)
HDD: Hitachi Western Digital WD2500BB(250GB) Maxtor 6Y120L0(120GB) Seagate ST330621A(30GB) HDT725032VLA36(320GB) 計720GB
グラフィックカード:GeForce 6600GT VRAM 128.0MB
サウンドカード:Sound Blaster Audigy2 Value
キャプチャーカード:SAA7130TVPCI(玄人志向)
ウェブカメラ:Qcam Starter(Logicool)10万画素、アイトーイカメラ30万画素、
Quickcam Communicate STX(Logicool)30万画素,LifeCam NX-6000(Microsoft) 200万画素
テレビ:28F-401S(MITSUBISHI)
UWSCのような、自動でキーボード入力してくれる プログラムをC言語で作りたいのですが、 参考になるサイトとかあれば教えてください。 具体的には、制御したいアプリケーションに対して、 ・Alt+Kのようなショートカット入力 ・ファイル名を自動でyymmdd形式で入力 を自動で行わせたいです。
>>474 いくらなんでも漠然としすぎ
何が聞きたいかを整理してから来てくれんか
Visual C++ 6.0でプロジェクト内の違うソースコード内に、違う型の同じ名前のグローバル変数がある場合に、 コンパイル時にエラーとする方法はないでしょうか? ソースコードa.cppにSHORT i; ソースコードb.cppにINT i; と宣言した場合、コンパイル時にエラーを出力といった具合です。
a.h と b.h にそれぞれ extern SHORT i; と extern INT i; があれば、 それを同時にインクルードするソースがあればエラーになる。 そうでなければ、リンク時にしかエラーは出ない。
C++ ならグローバル変数使わずに シングルトンパターン使おうぜ。
482 :
デフォルトの名無しさん :2007/04/29(日) 16:29:29
Cなんだがどうもエラーが出るんだ elseが悪いらしいんでけどさっぱり 教えてください。 #include<stdio.h> int main(void) { int a,b,c; prrintf("A="); scanf("%d",&a); prrintf("B="); scanf("%d",&b); if(a > b) a = a * 2; b = b * 2; printf("A=%d B=%d",a,b); else if(a < b) c = a; a = b; b = c; printf("A=%d B=%d",a,b); else printf("A=%d B=%d",a,b); return(0); }
483 :
デフォルトの名無しさん :2007/04/29(日) 16:33:19
多分そうだね。 誰か、ジョンソン法作ってあげなよw
>>482 elseが悪いらしいので
elseを直してください
>>482 は現状こうなってる。
...
if(a > b) {
a = a * 2;
}
b = b * 2;
printf("A=%d B=%d",a,b);
else if(a < b) {
c = a;
}
a = b;
b = c;
printf("A=%d B=%d",a,b);
else {
printf("A=%d B=%d",a,b);
}
...
486 :
482 :2007/04/29(日) 17:20:06
>>485 そんな事はわかっています。エラーを出なくしたいのです。
487 :
デフォルトの名無しさん :2007/04/29(日) 17:30:23
>>485 なんとなく分かったような
分からないような。。
488 :
デフォルトの名無しさん :2007/04/29(日) 17:44:05
プリントエフカンマで区切り忘れてるよ
489 :
デフォルトの名無しさん :2007/04/29(日) 17:47:36
パソコンから書き込めないので携帯からですが 単純なミスだったようです ありがとうございました。
今、独学の勉強のため簡易インターネットブラウザを組んでいるのですが、 接続先のホストネームしか知らない場合、 どのように相手先のIPアドレスを得れば良いのでしょうか? 具体的にはどのような関数を使えばいいのでしょうか?
getaddrinfoは何に使うのでしょうか?
getmankosmell
getaddrinfoはIPv6でもイケル次世代版。
IPv6なんて必要ない 鯖のIPアドレス覚えられん
>>495 あんたにとって必要か不必要かで、全世界レベルの規格や規定を覆すことは出来ないのさ・・・
>>496 でも実際にぜんぜん普及してないじゃん
Sunあたりがすべてのマシンをネットに繋げと叫ばない限りあと30年くらいIPv4でもおk
いや、IPアドレスが不足するギリギリになってからじゃ遅いってw 徐々に移行しないと、俺らも困る羽目になるぞ。
実際に不足するとしてだ。不足して困る前に以降が始まると思う? 不足して大混乱になったあげくに「こんなこともあろうかと」と いいつつIPv6が出てきて段々と混乱が収束ってパターンじゃないのかなあ。
500 :
デフォルトの名無しさん :2007/04/30(月) 02:48:27
> 不足して困る前に以降が始まると思う
当たり前じゃん。っつーかお前無知だな。知ったかぶったり自分都合で考えない方が良いぞ。
不足すると分かっているから32bitから増やしてんだがw
そもそも32bitで約43億通りだろ?実際にはそれだけ固有のものは出来ないが
地球上の人口とユーザを考えたら絶対に今世紀中に不足するよ。
http://ja.wikipedia.org/wiki/IPv6
>>497 vistaって、v6対応でしょ?
ISPの機材の変更に金がかかるらしいけど、あと10年かからんで移行しそうな気が。
対応というならXPで既に対応してた。デフォルトがOFFだったが。
動的に確保したメモリの開放作業を一括して管理したのですが、 どうしたらいいでしょうか? どこかにリストを作っておいて開放作業が必要なリソースを登録しておき、 最後になったらリストを参照して開放させるで良いでしょうか? この他にみなさんおオススメの方法はありませんか?
>>503 それでいいと思うよ
その一括開放作業をさせたいメモリを確保する関数に登録作業も行わせればok
505 :
デフォルトの名無しさん :2007/04/30(月) 11:59:29
ldコマンド使って連結処理する際にファイル名の順番が違うと 実行ファイルは生成されるのにコアダンプすることがあるんですが なぜなのでしょうか? 結構調べたんですがよくわかりませんでした--; ↓だと動くんですが ld -o a.out /usr/lib/crt1.o /usr/lib/crti.o /usr/ccs/lib/values-Xa.o\ /usr/local/lib/gcc/i386-pc-solaris2.10/3.4.6/crtbegin.o main.o sub.o\ /usr/local/lib/gcc/i386-pc-solaris2.10/3.4.6/crtend.o /usr/lib/crtn.o -lc
sscanf使って [test] って文字列から testだけ抜き出したいんですけどどうすればいいんでしょうか? sscanf( "[test]" , "[%s]" , str ); と書いても test] が抜き出されるんです。
事故解決島っ差多々 sscanf( "[test]" , "[%[^]\n]]" , str ); うーんマンダム
\nいらんな [test\n までひろっちまう
sscanfすげえ
>>505 関数名が同じものがどこかに含まれてない?
リンクの順番を変えると有効になる関数が交換して、
結果として変なことになるよ。
たとえばパラメータにポインタを期待している関数に
整数を渡したら惨事が起こるでしょ。それと同じことがおきているんじゃないの。
>>505 同じ名前の関数が複数箇所に入ってるんじゃね?
プログラムの途中でメモリ(ヒープ領域)の断片化を解消したいのですが、 C言語で可能でしょうか? また、可能な場合に具体的にはどのような処理を行うのでしょうか?
自分ででかいブロック取ってきて切り分けて使え。 再配置は不可能だから。
515 :
505 :2007/04/30(月) 21:19:16
>>515 自分でいじれる部分なら、バッティングしている関数をstaticに
して回避できるけど、いじれなかったり、他のファイルから呼ん
でたら無理だな。
518 :
513 :2007/04/30(月) 23:27:09
マツリプロセスかマルチスレッドのメモリ管理を実現したいのですが、 格納する対象がどのくらいの大きさになるか、 またどのくらいの数量の処理になるのか予測できない状態なので、 各処理単位に動的にメモリを確保させて使わせるように考えています。 この場合は元になるプロセスでメモリのリロケーションとか 行わなければならないのでしょうか? 一番簡単にメモリ管理を行う方法は他にありませんか?
マツリプロセスって?お祭り騒ぎ?
今日のNHKラジオみたいなもんか
521 :
デフォルトの名無しさん :2007/05/01(火) 00:54:50
#include <stdio.h> #define MAX 1000000 int main(void) { int a[MAX],i; printf("実行されました\n"); return 0; } 上記のプログラムについてですが、MAXの0を1つ消して10万にすると実行されますが 100万にすると自分の環境では実行されませんでした。使用しているのはBCCで OSはWinXPです。配列の要素に上限ってありますか?
使用可能なスタック領域には限度がある
>>521 static int a[MAX];
にするか、コンパイラのオプションでスタックサイズを大きくするか。
intが1つで4バイト、これが1,000,000個で4,000,000バイト(約4MB)。a[]が自動変数で あるためにこの領域はスタック上に確保されることになる。ということでリンカオプションで これ以上の値をスタックサイズに指定していれば実行可能になる。しかしこのように 大きい領域を必要とする場合はmallocでヒープから取得して使用するのがフツー。
でかいサイズだとmalloc()が普通なのか?
>>526 それを防ぐには、イメージそのものをなることはできないのだ。
少なくとも今の技術では無理だ。
サイズ固定なら配列でいいだろ。
>>528 抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、
実在するものそのものではなく、人が考えたものであるために、このイメージは
非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が
持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に
よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る
まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる
べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響
を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。
仮想化とは対象物を不完全ながらもその性質や姿を模倣し現出させることだ。
対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。
仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。
コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する
ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形
を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー
タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想
マシン、仮想キーボードといったものだ。
>>529 > 小振りながら彼女の肢体はしなやかに、
まで読んだ。
そういや高校の頃SF研で馬鹿みたいな小説書いたら 部長からラブコメ禁止令くらって後半2割くらい検閲削除されたことがある。
>>531 ラブコメってどうせ男同士だったりすんじゃねぇのか?
検閲削除で、正解だ。部長、GJ!
仮想化とは対象物を不完全ながらもその性質や姿を模倣し現出させることだ。 対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。 仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。 コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形 を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想 マシン、仮想キーボードといったものだ。 抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、 実在するものそのものではなく、人が考えたものであるために、このイメージは 非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が 持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響 を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。
GET /b/src/1177951924420.png HTTP/1.1 Accept: */* Accept-Language: ja Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Host: jun.2chan.net Connection: Keep-Alive
wavファイルを連結するプログラムってのを見て そんなんできんの?と実行したら本当にできた 600行ぐらいだったが感動した どれぐらい勉強すればこんなの作れるようになるの
wav ファイルの構造を知れば それなりの初心者にも簡単に作れるかと。
537 :
534 :2007/05/01(火) 04:56:01
途中で送信してしまいましたすみません。 TCPソケットで簡易ブラウザを作ってる者ですが、 jpegをhttpプロトコルでダウンロードし、ヘッダとボディ部に分ける所まで出来ました。 ここで質問があるのですが、httpプロトコルのボディ部はそのままjpegフォーマットになっているのでしょうか? 手を加えなくても表示させたり、ディスクに保存できるのでしょうか? 転送コーデックが設定されていた場合、C言語でつかえるライブラリなどはありませんか?
RFC2616嫁
>>537 基本的には
>>538 です。
簡単に言うと、ボディ部がそのまま JPEG にできることもあるし、gzip
で圧縮されていることもあるし、chunked encoding になってて途中に
何かが挟まってることもある。そういうのをヘッダで判断する。
符号なし整数型の変数 n が、4の倍数であれば、"n is ROUND(4)"、 >> 4の倍数で無ければ、"n is not ROUND(4)" を出力するプログラムを教えてください
541 :
デフォルトの名無しさん :2007/05/01(火) 13:50:53
#include <stdio.h> void main (void) { int kaz,cnt; char hantei; printf("数字を入力\n"); scanf("%d",&kaz); printf("計算する?(Y/N)\n"); scanf("%c",&hantei); if(hantei=Y){ for(cnt=0;cnt<5;cnt++){ kaz=kaz*kaz; } printf("計算結果:%d"); } else { printf("入力結果:%d"); } } どうしてもあと一つ、エラーが出てしまう。 if文の最初のところがおかしいのではないかと・・・ エラー E2451 sukyanf.c 12: 未定義のシンボル Y(関数 main )
× if(hantei=Y){ ○ if(hantei='Y'){ シングルクォートでかこまにゃ
代入してどうすんだよ
545 :
デフォルトの名無しさん :2007/05/01(火) 13:56:42
代入とシングルなおしたら一応動いた。 しかし、判定の前に結果が出てしまう
>>545 scanf()が%dで数字を変換したあとに食い残した改行文字を、
次のscanf()が食っちまうから。
そこで%cの前にスペースを一個入れる だっけ?
548 :
デフォルトの名無しさん :2007/05/01(火) 14:26:25
>>541 printf("計算結果:%d");
いったい何を出力させるつもりだ?
>>541 scanf("%d",&kaz);
fflush(stdin);
標準入力のフラッシュは・・・
552 :
デフォルトの名無しさん :2007/05/01(火) 14:39:20
rewind(stdin);
>>553 問題はないよ。何の足しにもならない環境があるだけで。
>>554 だったらその 環境 をあげてみたら?古いものだったら却下な。
逐一古い発展途上のものを使ってたらやってられない業界だから
んじゃfflushを使わないやり方を提案したらぁ?w ごちゃごちゃうるせーんだよ、実例を挙げないバカほどうぜぇ役立たずなクズはいねーもんだなぁをいっw
>>555 Cygwinはフラッシュきかなかったよ。
560 :
こいつら無知のくせしてだめなことしか覚えないバカwwww :2007/05/01(火) 14:47:03
550 名前:デフォルトの名無しさん 投稿日:2007/05/01(火) 14:38:43
標準入力のフラッシュは・・・
554 名前:デフォルトの名無しさん 投稿日:2007/05/01(火) 14:44:09
>>553 問題はないよ。何の足しにもならない環境があるだけで。
556 名前:デフォルトの名無しさん 投稿日:2007/05/01(火) 14:45:06
>>553 環境依存だってことだろ。
こ と だ ろ ? その証拠を提示してくれ。勝手にそういうことにしないでくれよw
>>549 だいたい、どういう意図で、その位置にfflush()入れてるのか分からない。
何キレてんだ? 入力バッファをクリアする標準的な手段は無いよ
環境依存しないでクリアするコードも簡単だし、あえて依存するコードを書く必要ないよな。 scanf()使ってると、クリアもいろいろ面倒な部分があるけど。
scanfなんて最初の勉強のときくらいしか使わないからなあ
一部省略、追加ヘッダ、定義したライブラリあり #include <ctype.h> int gtc(void) { int ch; while( isspace(ch=getchar()) && ch!=EOF ); return ch; } scanf("%d",&kaz); printf("計算する?(Y/N)\n"); ch=gtc(); if(ch=='Y' || ch=='y'){
>>565 のchはmain関数の中に int ch; を宣言して、char hantei は使用していない
for(cnt=0;cnt<5;cnt++) kaz=kaz*kaz; っつーか、この計算って、2を入力してcnt<4にしたら値は表示されたけど それ以上になると2^32を超えてダメなんじゃね?
あと
>>565 は最初の数字の入力の後に余計な文字(空白とか)入れずに
数字[改行]した場合有効だが、余計なことをするとやはり使えないから。
要するにscanf("%d",&kaz);のところも変えるべきだな
でも結局
>>567 の指摘の通り、入力する数字は1しかまともに動かない罠w
古い環境を扱い続けなきゃいけない場合もあるのになあ。
環境?処理系依存だべ
>>570 そういう場合はその環境では出来ないことは出来ないで通すハメになるんだが?
そんなもののために詰まらん手間や時間のロスがあって済むならやれば良い
要件による。 以上。
古い新しいの問題じゃないだろ。
USBが実装されていない環境じゃUSB接続のデバイスは使えない
だったら実装されているもので使えるものを使って対処する、そんなもんだろ?
出来ないなら出来ないなりに頭を使えYO!
>>565 みたく実装されている範囲内で自分で作って実装とかな
問題は、fflush(stdin); が当然と思ってたら、 そうでないところで動かす必要性が出た場合に混乱するということ。 その知識を持っておくに越したことは無い。
いや、話の論点はfflushだけでなく、使えないものは使えない、それじゃ使えるものを 実装されている範囲内で用意しようってことなんだが?出来ないものは出来ない たとえそれが新しくても。だから幅広く共通するものを使う、そうだろ?
scanf()なんて使わないで、行単位で処理すればいいじゃん。
>>577 限られた範囲内でしか使わない事が確定してる場合は
処理速度とか確実性とかの高いものを採用するのは悪い事ではない。
いくら危ないコードでも十分に分かって使う分には問題ないわけだから、 初心者に注意書きなしで変なことを教えなければ大丈夫だろ。
入力を読み飛ばすコードを書けばいいじゃん。 fflush(stdin)とかrewind(stdin)とか、ちょっとコードが短くなるけどさ。
fflush(stdin)とかrewind(stdin)とか、リダイレクトされたときの動作がわからん。
stdinが端末につながっているときにrewind(stdin)とかされたら、 画面に「もう一度最初から打ち直してください」って出るようにしたらいいんじゃね?
リダイレクトされた時としない時とで動作の違うコマンドとかよくある話だし。
紙テープにつながってたら巻き戻すだけでいいしな
scanf("%*[^\n]%*c"); これじゃダメかい?
while(getchar() != '\n'); とかやっちゃう俺チキン
getchar じゃなくて fgets したい場合は 最初の一文字だけ getchar して、 それが改行かどうか注意しつつ fgets していくことになるのか?
うはw 入門篇なのにぜんぜんついていけないorz マジで入門なんですかね?
stdinの掃除の決定版っていまだに見たことがないな。 fflush(stdin); はダメって話はよくきくんだが。
某MLのfor novicesよりは入門らしいと思う
foo.cとbar.cがあります。 foo.cにはfunc1()とfunc2()が含まれていて、 #include "foo.c" とすることで、bar.cのmainからfunc1()を呼び出したい。 void func1() { … func2(); ・・・・(a) … } のような中身だとして、 func2の挙動だけ変更したい。 ただし、foo.c自体は改変してはいけないとします。
595 :
594 :2007/05/01(火) 22:27:22
(続き) bar.cの中で、 #define func1 func1_org #include "foo.c" #undef func1 void func2() { … } void main() { func1(); } のようにしたんだけども、 (a)のところもfunc2_org()に置き換わってしまうので、 元と同じ挙動になってしまう。 foo.cを書き換えずにfunc2()の中身だけ変更することは可能ですか?
ソースファイルを#includeするのってよくあることですか?
>>595 #define func2() func2_org()
#include "foo.c"
#undef func2
void func2_org() { ... }
でいけると思う。
func2() という関数とマクロが両方ある場合は、
func2() はマクロの (func2)() が関数の呼び出しになる。
600 :
594 :2007/05/01(火) 22:33:20
>>596 , 598
いや、こんなことするの自分でも初めてなんですが、
foo.cのほうは変なライセンスなので弄ってはいけない。
だけど、そこにある関数を部分的に使用したいんです。
>>589 あれ、入力吐き捨てるだけでも必要?
どうでもいいけど^Zの後に入力を続けちゃうと入力待ちのままになるのね…
602 :
594 :2007/05/01(火) 22:42:30
>>599 これって、func2が
void func2(int i)
とか、引数があってもOK?
func2の引数の数にあわせてdefineを書き換えるべし
604 :
594 :2007/05/01(火) 22:46:41
>>595 >#define func1 func1_org
>#include "foo.c"
>#undef func1
ここ書き間違いでした。
#define func2 func2_org
#include "foo.c"
#undef func2
605 :
594 :2007/05/01(火) 22:52:46
bar.c:507: error: redefinition of 'func2_org' foo.c:2292: error: previous definition of 'func2_org' was here のようになってしまいます。
>>592 決定版って、普通に読み捨てればいいだけじゃん。
>>592 scanf("%*[^\n]%*c");
これでいいだろ
>>605 bar.c で foo.c をインクルードしてるのに
何で foo.c をまた単独でコンパイルしてるんだぜ?
『1から入力した数値までの合計を算出する』、ってプログラムなんですけど、 どうしても「1から~までの」の数の表示が0になってしまいます。 (「合計は~です」は正常に作動) (例:10を入力→「1から0までの合計は55です」) よろしくお願いします。 #include <stdio.h> void main(void) { int total; /*合計*/ int n; /*入力数*/ scanf("%d", &n); total = 0; while(n > 0){ total = total + n; n = n - 1; } printf("1から%dまでの合計は%dです\n", n, total); }
まず、何を質問したいのか言うべきではないのかね?
while(n > 0) が偽になった時点でどう考えてもnは0以下
どこまでの知識があるのかが分からないと どこまでの事を使っていいのか分からない
613 :
609 :2007/05/02(水) 00:55:56
すいません、テキストの次ページに解決方法が載ってました。 お騒がせしました。
ゴールデンウィークだなあ・・・
>>615 もちつけw
なんてたってゴールデンウィークだからな
まあそんなオレは新入社員がぶっ壊した鯖2つを復旧中で休みなし
なんで新入社員に鯖管やらせるんだよ
新鮮な方がいいんだよ、鯖だけに
おいおまいら 人の宿題をやってあげるときは ソースを全角で書け
全角を半角にするくらい、どうってことないよな・・・選択して>変換キーでもイケるし
どこぞのスレよろしく2進数に変換するとか
そんな意地悪しても文句言われたりしてうざいだけだから、やんないほうがいいよ。
そうかバイナリーを貼りつければいいのか
そんなやつはバカナリ(コロスケ風に)
勉三さんがつんつるてん! 勉三さんがつんつるてん!(壊れたコロスケ風に)
だれかうまい棒
626 :
デフォルトの名無しさん :2007/05/02(水) 10:57:33
#include <stdio.h> int main () { char *gyaku (char *a) ; char *string ; string = "taro" ; printf ("%s\n", gyaku(string)) ; return (0) ; } char *gyaku (char *a) { char *b ; *b = *(a+3) ; *(b+1) = *(a+2) ; *(b+2) = *(a+1) ; *(b+3) = *a ; *(b+4) = '\0'; return (b) ; } taroをoratにしたいんですけどうまくいかないです。 だれかたすけてください。
char *gyaku(char *a) { static char b[5]; b[0] = a[3]; b[1] = a[2]; b[2] = a[1]; b[3] = a[0]; b[4] = '\0'; return b }
>>626 文字列リテラルは初期化の時しか使っちゃらめぇ…
プロトタイプ宣言をmainに入れちゃらめぇ…
629 :
デフォルトの名無しさん :2007/05/02(水) 11:06:46
>>627 ありがとうございます。
ポインタを戻り値にはできないのでしょうか??
>626 つっこみどころはいろいろあるが根本的にまずいのは ローカルの自動変数のポインタを返すのがまずい。 渡された配列の内容が変わってもいいのならaを直接 いじればいいのでは?
>>629 関数gyakuの戻り値の型はchar*で、間違いなくポインタだが。
>ローカルの自動変数のポインタを返すのがまずい。 ここだけ的外れ。
>>630 >ローカルの自動変数のポインタを返すのがまずい。
これは別にいいのよ。Cは値渡しだから。
634 :
デフォルトの名無しさん :2007/05/02(水) 11:18:43
#include <stdio.h> #include <stdlib.h> char* gyaku (char *a,int size) ; int main () { char *string ; char *b; string = "taro" ; b=gyaku(string,4); printf("%s",b); free(b); return (0) ; } char* gyaku (char *a,int size) { char *b = (char*)malloc(size+1); for(int i=0;i<size;i++){ b[i] = a[size-(i+1)]; } b[size] = '\0'; return b; }
635 :
449 :2007/05/02(水) 11:19:40
相当な遅レスすまん。
>>450 ,451,452
回答㌧クス。
助かりました。
>>634 文字列なんだから、strlen使えばいいだろと思う。
637 :
デフォルトの名無しさん :2007/05/02(水) 11:30:58
626です。 みなさんありがとうございます。 勉強続けてみます。
638 :
デフォルトの名無しさん :2007/05/02(水) 11:31:01
( ゚Д゚)ハッ!
>633 ああ、ごめ。配列と勘違いしてた。 話は変わってプロトタイプ宣言をmainの中でしてもいいでしょ。ふつうはしないけどね。
元の文字列が変わってもいいのならこっちの方が楽じゃない? #include <stdio.h> int main () { char *gyaku (char *a) ; char string[] = "taro"; printf ("%s\n", gyaku(string)) ; return 0; } char *gyaku (char *a) { char *head, *tail; char tmp; head = tail = a; while (*tail != '\0'){ tail++; } tail--; while (head < tail) { tmp = *head; *head = *tail; *tail = tmp; head++; tail--; } return a ; }
>>639 プロトタイプ宣言が有効となるスコープが main() 内のみ ってやつか
あんまり見ないねー
でも実際のところ、スコープお構いなしに宣言した場所から下、 翻訳単位の残りの部分ずっとその宣言が有効になる独自拡張を施した処理系は結構ある。
共用体はどういうときに使われますか? 入門書に出てきたんですが、利用する状況をイメージできませんでした。
enum Type {Integer, Real}; struct Data { enum Type type; union { int integer; double real; } d; }; 例えばこうして時と場合に応じて整数と実数のどちらの形でも保持できるデータ構造とか
>>639 プロトタイプ宣言を関数ブロックの先頭に書いておいたソースが、新しい
gcc でコンパイルエラーになってびっくりしたのを思い出した。
(外に出したら出来たけど、うーむ・・・)
>>641 main() だとまずないけど、2つの関数を呼び合って再帰させる
ようなのだと書くこともある。
>>626 *(b+1)って書いてるけど
その分のメモリーを確保してないでしょ
char * b;でchar型のメモリーアドレスを保持するメモリーを1つ確保しただけだから
>>646 で、
>>642 ,645 のような処理系で跳ねられることもありうると…
プロトタイプ宣言の有効範囲をスコープで制御するのはマイナーな部類なんかな
関数自体がグローバルスコープだから、ローカルスコープで宣言しても意味がないからね。
>>643 普通はライブラリに丸投げすりゃ良いことだけど
例えば自分でTCPプロトコル叩きたいとかって場合に
共用体使うことでTCPヘッダのパースを行うなんてやり方もある
651 :
デフォルトの名無しさん :2007/05/02(水) 15:02:35
ttp://homepage3.nifty.com/mmgames/c_guide/17-03.htmlを参考にして #include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
FILE *file1;
FILE *file2;
char drag[255];
int cnta,cnti;
cnti=0;cnta=0;
while(*(argv[1]+cnta)){
if(*(argv[1]+cnta)=='\\'){inp[cnti]='\\';cnti++;inp[cnti]='\\';}
else {inp[cnti]=*(argv[1]+cnta);}
cnti++;cnta++;}
inp[cnti]='\0';
file1 = fopen(drag, "rb");
file2 = fopen("test.txt", "w");
/*ファイル変換処理は省略*/
fclose(file1);
fclose(file2);
return 0;}
ドラッグ対応のファイルコンバータを作りたいのですが、
exeファイルに任意ファイルをドラッグして実行⇒txt生成せず←これがやりたい!のですがどうすればいいのでしょうか。
コマンドプロンプト窓にexeファイル名とスペースを入力後任意のファイルをドラッグして実行⇒txt生成となります。
652 :
デフォルトの名無しさん :2007/05/02(水) 15:11:18
ごめんなさい、こうです #include <stdio.h> #include <string.h> int main(int argc, char *argv[]){ FILE *file1; FILE *file2; char inp[255]; int cnta,cnti; cnti=0;cnta=0; while(*(argv[1]+cnta)){ if(*(argv[1]+cnta)=='\\'){inp[cnti]='\\';cnti++;inp[cnti]='\\';} else {inp[cnti]=*(argv[1]+cnta);} cnti++;cnta++;} inp[cnti]='\0'; file1 = fopen(inp, "rb"); file2 = fopen("test.txt", "w"); /*ファイル変換処理は省略*/ fclose(file1); fclose(file2); return 0;}
>>652 そのサイトには「できない」と書いてあるようだが。
>>652 デバッグしてください。
デバッガで変数の値を見ながらステップ実行するとか、要所要所でprintfするとかで、
どこまで思った通りに動いているのか確認しましょう。
そのwhileは\を\\に変換してるようだけど、そんなことしなくていいよ。
>>652 Win32APIじゃないんだからわざわざ\を\\にしなくていい
>651の紹介しているサイトも酷い内容だなぁ。
>>651 問題があるようなら、その生成したファイル名(inp)を出力してみましょう。
657 :
652 :2007/05/02(水) 15:41:33
レスどうもありがとうございます できない、ことをやっているのか、それも問題ですね。 拾い読みのみでなんとかしようとしてるど素人なので時間はかかりますが アドバイス試していこうと思います。 コマンドプロンプトとかかなり無縁そうな人に多少の需要があるようなので、なるべく簡単なUIにしたいんですよね。
658 :
652 :2007/05/02(水) 15:53:52
>>656 printf("%s\n",inp);
fflush(stdin);
getchar();
(やめたほうがいいんでしょうか)だと
C:\\Documents and Settings\\All Users\\デスクトップ\\Norton AntiVirus 2003.lnk
と意図した結果にはなりました
getchar()の前にstdinフラッシュって意味ないだろ。
>>659 既にstdinに何かあった場合用じゃね?
まぁそもそも入力ストリームに対するfflushの動作は未定義なんだが
>>660 もとのページ見たら、なんの意味も無く入れてあるぞ。
ロックマン2のフラッシュマンにお仕置きしてもらうべ~~~
>>658 要求されているわけでもないのにディレクトリ区切り文字が\\になっているわけで、
>654や>655が指摘している通りその余計な処理が原因だと言うことがよく判るね。
結論:fopen()に渡す文字列はバックスラッシュをダブらせる必要は無い。
665 :
デフォルトの名無しさん :2007/05/02(水) 16:59:28
>>664 それ直してもexeにファイルをドラッグしたら出来ない。
コマンドからだとおk。
試しにfcloseでtest.txtへの書き込みを終えてから、
test.txtをfopenして中身を取り出してみたら出来た。
しかしプログラムが終わったあとtest.txtはどこにもなかった。
何故だろう・・・
D&Dで駆動した時、アプリケーションから見たカレントディレクトリは何処でしょうね
>>665 その実行モジュールのワークディレクトリを指定していないから、デフォルトのワークディレクトリに書かれているんじゃね?
#もしかして、My Documentsとかか?w
668 :
デフォルトの名無しさん :2007/05/02(水) 17:07:37
>>667 それを考えて今ローカルディスク全体に検索かけてます。
669 :
652 :2007/05/02(水) 17:25:41
>>669 "%s\n"では末尾に空白(や改行などの制御文字)がついていても見えないから、"[%s]\n"などとしてみるといいよ。
#この場合がそれかどうかは知らんが。
671 :
? :2007/05/02(水) 18:42:10
1000個までの整数あるいは小数を打ち込んで,その平均と標準偏差を表示することのできるプログラムを作成せよ. っていう内容の課題がでてるんですけど まだ初心者レベルなんでわかりません; 教えてください!!
>>671 float n[1000],heikin=0,hensa;
int i;
for(i=0;i<1000;i++){
scanf("%f",n[i]);
heikin+=n[i];
}
heikin/=1000;//←heikinに平均が入る
偏差ってどうやって出すんだっけ?
平均との差の二乗を、どうのこうのってやるんだよな、確か。
673 :
668 :2007/05/02(水) 19:00:11
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]){ FILE *file1; FILE *file2; char inp[255]; if(argc > 1){ file1 = fopen(argv[1], "rb"); if(!file1)return 0; strcpy(inp,argv[0]); for(int i=strlen(inp)-1 ;i>=0;i--){ if(inp[i] == '\\') break; else inp[i] = '\0'; } strcat(inp,"test.txt"); file2 = fopen(inp, "w"); if(!file2)return -1; //ここ適当↓ while( (fgets(inp,sizeof(inp),file1)) ){ fprintf(file2,inp); } fclose(file1);fclose(file2); } else{ printf("引数が足らん"); } return 0; } 結局ディスクを検索しても出てこなかったので、argv[0]のパスからexeのディレクトリを取り出して出力してみた。 変数とかファイル出力は適当。一応これでドラッグ&ドロップでファイル作れた。
674 :
? :2007/05/02(水) 19:06:43
こんな難しいんですか!? まだ基本的なことしかしてないのにこんな難しいやり方の課題を出されてたんですね↓ びっくりです;
1000個入力するのが一番大変だけどなw 問題の方は1000個固定じゃなくて、最大1000個なんだろうけど。
676 :
デフォルトの名無しさん :2007/05/02(水) 19:13:10
人のソースは難しそうに見えるんだよ。何十回も読んで少しずつ解釈していけばいいよ。
この問題って前にも見た気がするんだが
680 :
? :2007/05/02(水) 19:21:29
はいっありがとうございます!!
>>677 そうなんですか!?
きっとみんなできないのかも;
>>678 ええ!?
別のですか?
すみません;
>>679 ありがとうございます!!!!
同一人物ではないです;
まじ助かりました☆
このスレとかでいろいろと勉強したら 雑なソースがかなりすっきりしました 文字列のポインタ配列って便利ですね
682 :
? :2007/05/02(水) 20:08:29
>>679 ↑の読み込んでくれなくて実行できません;
なんででしょうか???泣
#include <stdio.h> int main(void) { int i, j = 0; printf("i: %d, j: %d", i, j); return (0); } これをコンパイルして実行すると # i: 134513638, j: 0 と表示されるのですか、なぜiの値が0ではなく134513638のような値になるのでしょうか。 この134513638というのは何に由来しているのですか。 教えてください。
>>683 i が何か適当な数値で初期化されていないから
ちなみに、表示された数値は、iが割り当てられたメモリのアドレスの番地を
10進数で表示したものになっているらしい。検証してみたら俺の環境ではそうだった。
まあそんな検証に大した意味はないけどな
>>683 int i = 0, j = 0;
だな。
その数字はたまたまそこにあったゴミ
int i = j = 0; でもいいや
690 :
デフォルトの名無しさん :2007/05/02(水) 20:22:42
>>687 それはお前の浅はかな考え。低レベルな低学歴バカは貧弱な知識や考えしかもっていないと
バレないように黙っていた方が身のためだぞw 以外にお前が起こしているトラブルは
おまえ自身のおろかさにあるようだな。まぁ、バカには何を言ってもダメだから馬鹿にされるんだよねw
お前の価値観で大した意味とか決められるわけねーだろw
ちゃんと検証してみろ。どういう値が入ったのかってな。自分が予期しなかったことを言われると
そんなことはとか言い出す奴ほど、路上では予期しなかったトラブルを他人のせいにして逃げようとするんだよなw
お前みたいなクズは路上に出てくるなよ、迷惑だ
687 名前:デフォルトの名無しさん 投稿日:2007/05/02(水) 20:20:01 まあそんな検証に大した意味はないけどな まあそんな検証に大した意味はないけどな まあそんな検証に大した意味はないけどな まあそんな検証に大した意味はないけどな まあそんな検証に大した意味はないけどな まあそんな検証に大した意味はないけどな まあそんな検証に大した意味はないけどな まあそんな検証に大した意味はないけどな まあそんな検証に大した意味はないけどな 自分基準にもほどがある大ボケw そんなこといったら世の中お前にとって意味の無い検証なんて いくらでもあるわ。それが重要になることも知らずにな、クーーーックックック(ケロロ軍曹のクルル曹長風に)
#include <stdio.h> int main(void) { int i, j = 0; printf("i: %d, j: %d \n", i, j); printf("%d / %X / %p \n",i,i,i); return (0); } ↑でやってみるとアドレスの番地がそのまま値として入ってしまっていることが分かるよ。 誰かさんにとっては重要ではないにしろ、何でそういう値になったかくらい、アドレスの番地を 調べてみて気づくこともあるもんだよ。あっ、バカはアドレスの番地すら理解していないだろうね。 こいつじゃポインタとかぜんぜんわかっていなさそうだから以後放置よろw
.| | | | | | | | | | || | |
.| | | レ | | | | | J || | |
∩___∩ | | | J | | | し || | |
| ノ\ ,_ ヽ .| レ | | レ| || J |
/ ●゛ ● | .J し | | || J
| ∪ ( _●_) ミ .| し J|
彡、 |∪| | .J レ
/ ∩ノ ⊃ ヽ
>>692 ( \ / _ノ | |
\ " / | |
\ / ̄ ̄ ̄ /
 ̄ ̄ ̄ ̄
未初期化だと、その変数のアドレス入れる処理系なんてあるんだ。 どういう意図でやってるんだろうな。 デバッグだと「フフフフ・・・」が入ってたりするけど。
>>697 明示的に初期化されないメモリが確保されたとき
自動で0x00を入れるより0xCCみたいな適当な値で埋めといたほうが
バグが見つかりやすいからそうしてる処理系もあるみたいよ。
134513638 == 0x080483E6 は値の感じからしてアドレスではあるようだが、
>>692 みたいな笑えるコードが検証コードのつもりだったのなら、
多分変数自身のアドレスではないだろうな。
たまたま昔の処理でアドレスを入れる為に使われた領域に
たまたま i が確保されただけだろう。
さすがに692は釣りだよな?
>>682 読み込んだくれないとは?
コンパイルできないってこと?
>>690 ならば、Cを学ぶにあたってどんな意味があるのか、低脳な俺にわかるように教えてください。
704 :
? :2007/05/02(水) 20:51:58
コンパイルはできるようになったんですが、 打った数字も結果も表示されないのですが・・・ なぜですかぁ????
なぜでしょうね????
706 :
デフォルトの名無しさん :2007/05/02(水) 20:58:18
>>692 はあうあう。
初期化されていないから値は不定。&付けろ初心者
>>692 >アドレスの番地を調べてみて気づくこともある
このソースのどこで調べているの?
708 :
? :2007/05/02(水) 21:00:37
やっぱりわかんないですよね↓ すみません
>>704 ソースうp
長いようならあぷろだ使ってね
710 :
652 :2007/05/02(水) 21:15:12
>>668 ありがとうございました
file1 = fopen(argv[1], "rb");でこけてるとばかり思ってましたがちがうようですね
file2 = fopen("test.txt", "w");との兼ね合いですかね。アイデアがあれば打開できるものですね
711 :
? :2007/05/02(水) 21:15:24
>>711 リロードするの忘れた
ソースを変更した?してないならこの人は1000分のデータを乱数から取得している
とりあえず
>>712 に作ったので見てみて
714 :
713 :2007/05/02(水) 21:18:51
あっソースは250の人の流用だからね 俺が作ったわけじゃないよ
715 :
? :2007/05/02(水) 21:24:33
ありがとうございます!! やっと解決しました☆ でも数字を打ったあと結果がでなくて ソース名を打ったら表示されました・・ なんでですか??? こういうもんなのですか?
>>715 >でも数字を打ったあと結果がでなくて
>ソース名を打ったら表示されました・・
数字って何?ソース名って何?実行中の話だよね?
717 :
? :2007/05/02(水) 21:34:21
実行中です 1000個の数字を入力してみたんです ソース名はファイルの名前です わかりにくくてすみません;
718 :
? :2007/05/02(水) 21:37:10
あと結果に #QNANOe+0000ってでるのですがこれは何を意味するのですか?
>>718 非数。
結果が未定義の計算をしたらそうなるはず。
720 :
? :2007/05/02(水) 21:40:56
あ~なるほどっ なにからなにまですみません; ありがとうございます
721 :
デフォルトの名無しさん :2007/05/02(水) 21:41:15
>>669 は俺も不思議に思ってやってみた。
fopenとprintfどちらかでやってみて。
注目は、立ち上がり時のargv。まあやってみてくれ、そうすりゃ分かる。
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
FILE *file1;
int i=0;
if (argc > 1) {
file1 = fopen(argv[2], "rbx");
// printf("%s\n",argv[1]);
}
while(i!=argc){
printf("%s\n",argv[i]);
i++;
}
fflush(stdin);
getchar();
return 0;
}
憶測に過ぎないが、どうも、fopenの方は、
stdin<=>システムバッファ<=>ファイルで一枚間に噛んでる故の、
立ち上がり時の引数にDOSプロ自体のみ(argv[0])渡されるっぽい。
NAN = Not A Number な。
723 :
683 :2007/05/02(水) 21:58:33
情報提供ありがとうございます。 宣言さえすれば、明示的に初期化しなくても0で初期化されるのかと思い込んで いましたが、そうではないんですね。 お礼が遅くなってすみません。レスをくれた方、どうもありがとうございました。
>>721 > 立ち上がり時の引数にDOSプロ自体のみ(argv[0])渡されるっぽい。
ドロップ起動時とコマンドライン引数明示の差?
ドロップ起動時って (Win32)GetCommandLine のみ生きてて
CRT は argc/argv を埋めないのかな
>>721 どう違うの?俺の環境で試しても違いは現れなかったが
構造体とポインタを使って複素数の除算を求める的なプログラムを作ったんですが、 2通り作ってみたところ片方が動いてくれません。 Cdivって関数はちゃんとできてるみたいなんですが、Ctesで「rが定義されてない」とかいわれてしまいます。 どこがおかしいんでしょうか?
お前はその質問の仕方でまともな答えが得られるとでも思ってるのか
#include <stdio.h> #include <math.h> typedef struct Complex_tag{ double r,i; } Cmplx; void Cdiv(Cmplx *x,Cmplx *y,Cmplx *ans){ double a; if(fabs(y->r)>=fabs(y->i)){ a = y->i / y->r; ans->r = (x->r + x->i * a) / (y->r + y->i * a); ans->i = (x->i - x->r * a) / (y->r + y->i * a); } else{ a = y->r / y->i; ans->r = (x->r * a + x->i) / (y->r * a + y->i); ans->i = (x->i * a - x->r) / (y->r * a + y->i); } } void Ctes(Cmplx *x,Cmplx *y,Cmplx *ans){ ans->r = (x->r * y->r + x->i * y->i) / (y->r * y->r + r->i * y->i); ans->i = (x->i * y->r - x->r * y->i) / (y->r * y->r + r->i * y->i); } void main(){ Cmplx x,y,ans,*px,*py,*pans; px = &x; py = &y; pans = &ans; printf("x(r,i) = "); scanf("%lf,%lf",&px->r,&px->i); printf("y(r,i) = "); scanf("%lf,%lf",&py->r,&py->i); Cdiv(px,py,pans); printf("x / y = (%f , %f)\n",pans->r,pans->i); Ctes(px,py,pans); printf("x / y = (%f , %f)\n",pans->r,pans->i); }
>>726 いや、どこがって言われても
君さ、見もしないもののどこがおかしいかなって言われて分かる?
せめてソースを...
730 :
726 :2007/05/02(水) 22:34:49
731 :
729 :2007/05/02(水) 22:35:48
と思ったらソース来た
ゴメンね
>>726 void Ctes(Cmplx *x,Cmplx *y,Cmplx *ans){
ans->r = (x->r * y->r + x->i * y->i) / (y->r * y->r + r->i * y->i);
ans->i = (x->i * y->r - x->r * y->i) / (y->r * y->r + r->i * y->i);
} ↑
ここ
732 :
729 :2007/05/02(水) 22:36:59
ずれた void Ctes(Cmplx *x,Cmplx *y,Cmplx *ans){ ans->r = (x->r * y->r + x->i * y->i) / (y->r * y->r + r->i * y->i); ans->i = (x->i * y->r - x->r * y->i) / (y->r * y->r + r->i * y->i); } ↑ ここ 右から2つ目 r->i になってる
733 :
726 :2007/05/02(水) 22:39:04
>>731-732 即答ありがとうございます!
こんなもん自分で気付けって話ですよね・・・
お騒がせしました&ありがとうございました。
よくこんなんすぐ分かるな・・・
>Ctesで「rが定義されてない」とかいわれてしまいます これを見てすぐわからないようじゃヤバいだろ。
ソケットディスクリプタから一度読み込んだデータを もう一度読み込むことはできませんか? TCPプロトコルで受信したデータはプログラムから読み込まれると消去されるのでしょうか?
>>736 一旦readした時点でバッファから消されるはずだから、普通に考えれば無理だろう
バッファから「消される」訳じゃないけど再利用は不可と言うことで一つ。
そもそも、ソケットから読み込んだらバイト数確認して再読み込みしたりするんだから 読み込んだものは自分で管理するしかないだろ。
プロトコルスタックを直接触ればいいじゃない
741 :
デフォルトの名無しさん :2007/05/03(木) 06:59:58
>>647 ありがとうございました。
イメージがわきました。
Windowsにgccコンパイラ入れたいんだけどどこからダウンロードすればどいいか分からないです どなたか教えてください
>>742 「windows gcc インストール」でググって、最初のページを見てみるとか。
745 :
デフォルトの名無しさん :2007/05/03(木) 12:28:32
cの練習みたいなんするソフト?ってどこにあるかわからない からおしえてください!!
日本語がわからない。 サンプル集が欲しいのか 手軽に試せる実行環境が欲しいのか 入門用のテキストなり学習ソフトが欲しいのか。
>>500 世の中のRFIDが全部ネットに繋がる世の中を想像してみ?
IPv6でも足りない可能性があるよ
>>745 たしかゲーム風に進めていく学習ソフトがあったはず
749 :
デフォルトの名無しさん :2007/05/03(木) 12:57:14
>>747 IPv6は79228162500000000000000000000通り
7,9228,1625,0000,0000,0000,0000,0000
7穣9228予1625垓通り
使いきれるかなぁー
>>749 じゃ、じゃあ砂粒一つ一つが繋がったらどうかしらっ
じきに攻殻機動隊の世界がやってくるのさ
配列の要素数(添字)を取得するのってどうやるんですか? いろいろ調べたけどわからなくて。
>>753 配列と同じスコープ内なら、sizeof(配列) / sizeof(配列[0])
>>753 ローカルで確保してるなら
sizeof(array)/sizeof(array[0])
で取得できる。関数引数として受け取った配列のという事なら仕様上不可能
別の引数として要素数渡せ
ネットは広大だわ
>>754 >>755 どもっす
>同じスコープ内
>ローカルで確保
>関数引数
からしてわかってませんがヒントになりますた。ありがとう。
グローバル変数でもサイズは取れるから、>754で正解。 尤も、配列は関数の引き数にできないから(ポインタになってしまう)同じことだけど。
unsigned char XXX [] ={1,2,3,4,… の時はsizeof(array)/sizeof(array[0]) 使えないんですかね…。 要素数を宣言してないからこそ使いたいのに…。
何でやってみようとしないのか理解できない。
いやすんまそん、C初めて4日目なんで、いろいろ理解するのに手一杯。 用語がわかってないから意味が通じてないみたいです。精進します。
>>762 >unsigned char XXX [] ={1,2,3,4,…
>の時はsizeof(array)/sizeof(array[0]) 使えないんですかね…。
>要素数を宣言してないからこそ使いたいのに…。
できるかできないかは、やってみれば分かる事。
ということだ。
>>743-744 亀レスで申し訳ありません
無事インストールできました
ありがとうございました
765 :
デフォルトの名無しさん :2007/05/03(木) 20:29:22
携帯電話でCのコンパイルってできるんですか?
766 :
デフォルトの名無しさん :2007/05/03(木) 20:44:12
ほかの言語はあった気が。アプリゲットで探してみましたが。
Cコンパイラがあれば、そりゃコンパイルは出来る。 それがその携帯で動くかどうかは別問題。
とりあえず俺はJavaバイトコードを出力するCコンパイラというのは見たこと無い。 探せばあるかもしれんが。
BREWじゃねぇの
最近の大学生は携帯電話でレポート書くという話を聞くし、
携帯でプログラムの実習やアプリの開発が出来きるようにしたら
結構受けそうだな。と考えていた矢先、
>>765 の書き込みを発見、
これは、携帯で動く開発環境を作れと言う神の思召しか?
携帯で書く気にはならないな。
BASICくらい動けば便利かも
773 :
デフォルトの名無しさん :2007/05/03(木) 21:17:28
確かに。。イーモバイルとかなら既存のケータイより打ちやすそうですし、それならわかりますが、、
そこでWZEROですよwillcomですよ
最近の若者ってのは親指が発達してるのか?
>>776 若いやつの携帯にメールを送ったら返信が異常に早くて、メールを打つところを実際にみてたら、
電光石火の親指だった。
778 :
デフォルトの名無しさん :2007/05/03(木) 21:41:12
>>777 そうか・・・。
キーボードに慣れていると何が哀しくて親指打ちしなけりゃならないんだと思ってしまうけど、
訓練次第でなんとでもなるんだな。
人間てすごいわ。
aa = strlen(buff); aa はint 型で、buffはchar型配列で、適当な文字列が入っています。 これをコンパイルすると、VCコンパイラだとうまく行きますが、 GCCコンパイラでコンパイルすると、↓以下の警告がでます。 incompatable implicit declaration of bilt-in function 'strlen' 何がいけないのでしょうか。 もちろん、stdlib.hはインクルード宣言をしています。
strlenの戻り値の型はintじゃないよ
>>779 strlenがstdlib.hで宣言されてるなんて初耳だな
そうか、<string.h>だったのか・・・・orz
最近Cを勉強し始めた者です。 scanfを使うとコンパイラが"scanfではなくscanf_sを使え"と警告を出してきます。 同様の警告はgetsを使ったときにも出ます。 警告なので実行しても特に問題はないみたいなんですが、 scanfとscanf_sにはどのような違いがあるのでしょうか? コンパイラはVsualC++2005ExpressEditionです。
>>783 scanfだけじゃないが、VC++2005で○○_sというセキュアなバージョンが追加されてる関数がある
違いはバッファとして指定した引数のサイズが指定できるようになってる事
gccとかへの移植性を考えると使わない方がいい
VC++2005でしか使わないならどっちでもいい
>>783 scanfは入力するデータのサイズを制限出来ない為にデータが溢れたりしてえらい事になる可能性がある。
>>780 size_t型はなのは知ってるけど、
>>779 みたいに、
int型にそのままぶち込んでは何か問題でも生じるのですか?
>>786 size_tの最大値が、intの最大値より大きかったら、問題が起きる場合が。
気にしなくていいかな?
ほとんどの処理系においてtypedef unsigned size_tとされてるはずだから 特に気にする必要は無いと思うが、typedef unsigned long size_tとなってるような 処理系が無いとは言えないから出来ることならsize_tを使った方がいいだろうな
最近の VC++ は size_t が 8 ビットだった気がするよ。
strlenは本当はptrdiff_tと同サイズを返さなければいけないしな。 まあ、可能性としてあるだけで 実際に64bit環境だからといって2G/4G以上の文字列長を 必要とすることはまず無いだろうが。 それ以前にファイルサイズ等でコーディング上の無理が出て どこか修正する必要が出てくるだろうし。
手元のVC++2005のライブラリだとこうなってるな #ifdef _WIN64 typedef unsigned __int64 size_t; #else typedef _W64 unsigned int size_t; #endif
2002 あたりどうだっけ?
VC++.netも一緒だた
>>788 >ほとんどの処理系においてtypedef unsigned size_tとされてるはずだから
longじゃなくても、その時点で、intより最大値が大きいじゃん。
最近になって、close()関数がintを返すことを知ったのだが close()がもし失敗したら~、hoge hoge~ なんて処理を、 丁寧に書いているプログラムなんて、今まで見た事がない件。 いい例とか、どっかにありますか?
798 :
デフォルトの名無しさん :2007/05/04(金) 14:17:02
2000*2000*2000のボクセルを持つ3次元の立体を表すために、 2000*2000*2000*3の配列を作って、そこに色情報を入れようとしたのですが データ量が多過ぎてプログラムが動きません。 ポインタを使うのがいいのか、他にもっといい方法があるのか、是非教えてください! お願いします!
>>797 closeの失敗なんて意識したことないなぁ。
やってもログを出力させるだけとか・・・
そもそもcloseに失敗したからといって何かできる訳でもないしな
>>798 てきとーなハッシュ関数を定義するとか。
>>801 バッファをフラッシュしてファイルを閉じてるから、close()失敗したら、write()のエラー処理と同じことをすればいいよ。
小さいファイルの読み書きだと、write,readではエラーがでなくて、close()ではじめてエラーがでるとか、すごいありそう。
あーそうか。フラッシュに失敗することがあるんだな。
>>798 オンメモリで処理するのはあきらめてファイルにしたら。
それでもとてつもなくでかいファイルになってしまうが。
あとはデータの性質に合わせて省メモリ化するように工夫する。
例えば配列の全要素に必ずしもデータが詰まっていないなら「疎な配列」を使ってみる。
そもそも、バッファがあったとしても読み込み後のクローズで失敗することは有り得ないわけだが。
808 :
デフォルトの名無しさん :2007/05/04(金) 21:59:07
相互リンクリストについて教えていただきたいのですが、 struct man{ struct man *prev; char name[20]; int score; struct man *next; }; が相互リンクリストでつながっていて、これをスコア順に並べなおしたいのです。 直接選択法を使ってやりたいのですが、ポインタのつなぎかえが分からずできません。 どうすればよいかどなたか教えてください。お願いします。
>>808 直接選択法のソート自体は出来る?int配列とかで。
aとbを交換する場合は、 swap(struct man *a, struct man *b) { struct man* a_prev = a->prev; struct man* a_next = a->next; struct man* b_prev = b->prev; struct man* b_next = a->next; a_prev->next = b; b->next = a_next; b_prev->next = a; a->next = b_next; b->prev = a_prev; a_next->prev = b; a->prev = b_prev; b_next->prev = a; } じゃね? 加えて実際には、端にあるノードの場合の処理が必要だが。
811 :
デフォルトの名無しさん :2007/05/04(金) 22:47:26
>>809 できます。数列の最初の項を最小と仮定してほかの項と比べていって
より小さいときは交換するってやつですよね。
>>810 ありがとうございます。やってみます。
813 :
デフォルトの名無しさん :2007/05/04(金) 23:20:52
本は #include<stdio.h> int main(void) { int n1,n2,n3,max; puts("三つの整数を入力してください。"); printf("整数1;") scanf("%d",&n1); printf("整数2;") scanf("%d",&n2); printf("整数3;") scanf("%d",&n3); max=n1; if(n2>max) max=n2; if(n3>max) max=n3; printf("最大値は%dです。\n",max); return(0); } でビルドするとほとんどエラーになるので自分なりに試して
814 :
デフォルトの名無しさん :2007/05/04(金) 23:21:34
#include<stdio.h> int main(void) { "int n1,n2,n3,max"; puts("三つの整数を入力してください。"); printf("整数1;") scanf("%d",&n1); printf("整数2;") scanf("%d",&n2); printf("整数3;") scanf("%d",&n3); "max=n3"; "if(n2>max) max==n2"; "if(n3>max) max==n3"; printf("最大値は%dです。\n,max"); return(0); } でビルドすると上手くいくのですが デバックなしで開始すると 三つの整数を入力してください。 整数1;n1 続行するには何かキーを押して下さいとなり この先にいけないのですが何がいけないのでしょうか? 完成型は 三つの整数を入力してください。 整数1;n1 整数2;n2 整数3;n3 最大値はn3です という形にしたいのです
「n1」は整数じゃないだろ
816 :
デフォルトの名無しさん :2007/05/04(金) 23:27:50
>814がまともに動くはずはないんだが
>>814 {→{
printfとscanf以外の"は不要
printf("整数1;")→printf("整数1;");
max=n3→max=n1;
max==n2→max=n2;
max==n3→max=n3;
printf("最大値は%dです。\n,max");→printf("最大値は%dです。\n",max);
}→}
修正点はこんなところか?
819 :
デフォルトの名無しさん :2007/05/04(金) 23:36:48
IT関連の専門に通ってる者ですが 自宅でC言語の勉強をしたいのですがLINUXじゃないとC言語ってできないんですか? ウィンドウズ上でできるソフトウェアなんか知ってるよって方が居ましたら教えてください
>>819 VisualStudioっていう非常に有名なソフトがあるよ
821 :
デフォルトの名無しさん :2007/05/04(金) 23:45:01
820>情報あり!さっそくダウンロードして試してみます(´д`)
>>814 #include<stdio.h>
int main(void)
{
int n1,n2,n3,max;
puts("三つの整数を入力してください。");
printf("整数1;"); scanf("%d",&n1);
printf("整数2;"); scanf("%d",&n2);
printf("整数3;"); scanf("%d",&n3);
max=n3;
if(n2>max) max==n2;
if(n3>max) max==n3;
printf("最大値は%dです。\n",max);
return(0);
}
C言語で、数字以外弾くのはどないしたらいいんですか? aとかで無限ループしてしまってうざいんですけど。
scanf使うのをやめろ
ん?
> if(n2>max) max==n2;
> if(n3>max) max==n3;
`='が1個多くないか?
まあ文字判定できないのはそれが原因じゃないけど つ
>>824 あるいはis系の関数を使うか
そりゃぁそうですけどね。 うぃ~気合入れてスキルアップします。
827 :
825 :2007/05/05(土) 01:04:10
つatoi つatof
>>825 >>827 いや、別人
>>814 のソースをコピペしてちょっといじっただけでそこまで見てなかったんだ
max=n3;
if(n2>max) max=n2;
if(n3>max) max=n3;
が正解だね
830 :
829 :2007/05/05(土) 01:16:30
って違う max=n1; if(n2>max) max=n2; if(n3>max) max=n3; だな
scanfが危険でsscanfが安全っていうのは sscanfをfgetsと組み合わせて使っている限りは 毎回fgetsで入力を受けるchar配列の中身が更新されるからだよね?
>>828 atoiとかは文字列"100"をint型の100に変換するだけ
文字'a'を数字に変換することはできないでしょ
>>823 は数字かどうかを判別したいんじゃないの?
>>832 scanf()を単にfgets()+sscanf()にしただけでは万事解決とはいかない。
scanf()が数字以外の文字を喰い残すという悪癖を回避できるだけだ。
>>500 番台あたりをみてて思ったのですが、
fgetc(stdin)と
getchar()は、入力バッファに何も無かった場合、どちらも入力待ちになるのでしょうか?
>>834 よくその悪癖があるからfgets+sscanfにしろって言われるけど
それくらいならそのことを考慮してscanf呼び出した後は
入力を吐き捨てるようにすればいいんじゃないかなと思うんですが、どうなんでしょ?
キーバッファはなかなか思い通りに弄れない
>>835 そうよ
入力がないんだから次には進まないでしょ
そんなことよりもおまいは
>>500 を読んでそんなことを思いついたのか
その発想力に嫉妬だわw
>838 500番台と500の区別もつかないの?
>>838 ありがとうございます。
正確には550のあたりです。すみません
scanfを使っても、ちゃんと戻り値を確認したり読み捨て処理を入れたりすれば 普通に問題なく動作させることは出来る。 ただ、そこまでしてscanfを使う必要があるのかというのが疑問。 「fgets+sscanfを使えばいい」とだけ聞いて sscanfの戻り値を確認しない奴も結構居る(もちろん必要ない場合もある)。
>> ややこしいならいったん変数に格納して、 文字コードで条件判断させればインじゃないか?
おいらは、fgets+strtoul使うことが多いかな 複雑な構文解析が必要なときは、yacc+lexとか
Cって入力が100バイトでも10000バイトでもきっちり破綻なく動くようにすると 途端に糞めんどくさくなるから嫌なんだよ。
それは頭が悪いだけ
847 :
デフォルトの名無しさん :2007/05/05(土) 11:28:03
>>814 ですが
int n1,n2,n3,max;
→;が型の前にありません
printf("整数1;"); scanf("%d",&n1);
printf("整数2;"); scanf("%d",&n2);
printf("整数3;"); scanf("%d",&n3);
→n1,n2,n3 定義されていない職別子です
printf("最大値は%dです。\n",max);
→max 定義されていない職別子です
とエラーになります
>>847 max()がマクロもしくは関数として既に定義されていてコンパイルが
思うようにいかないのだろう。
maxnとか名前を適当に変えてやってみれ。
max()がマクロでもぶつからないと思うがなあ・・・ >int n1,n2,n3,max; >→;が型の前にありません この、int の前はどうなってんのさ
850 :
デフォルトの名無しさん :2007/05/05(土) 12:19:52
>>849 本には
int n1,n2,n3 max;
と書いてあります
#include<stdio.h> int main(void) { int n1,n2,n3,max; puts("三つの整数を入力してください。"); printf("整数1;"); scanf("%d",&n1); printf("整数2;"); scanf("%d",&n2); printf("整数3;"); scanf("%d",&n3); max=n1; if(n2>max) max=n2; if(n3>max) max=n3; printf("最大値は%dです。\n",max); return(0); }
windowsでC言語でmakefile使いたいんだけど どうやってつくるんですか? 全部txtがはいってしまうんだけど
拡張子くらい変えればいいじゃん
メモ帳じゃなくてちゃんとしたエディタ使えよ
"makefile" と""で囲む
Winの場合はprojectname.mak とか拡張子つけておくと何かと便利だけどな。 makeするときはmake -fprojectname.mak
保存するときに「ファイルの種類」っていうプルダウンメニューがあるだろ。 そこがおそらくデフォルトで「テキスト文書」となっているんじゃないかな。 だから後ろに .txt の拡張子がつく。そこを「すべてのファイル」に変えて、 拡張子を自分でファイル名の最後に付けて保存すればいい。
>>858 Borland C++のmakeだとmakefileとmakefile.makの両方を受け付けてくれるのが便利だった
862 :
デフォルトの名無しさん :2007/05/05(土) 18:56:07
すごくくだらない質問かもしれませんが疑問が解消されないので質問します。 #include <stdio.h> int main(void) { int a=5; int *b=&a; printf("%d%p",*b,&a); return 0; } このプログラムをコンパイルすると*aと&bの値が全く違うのはなぜでしょうか? #include <stdio.h> int main(void) { int a=5; int *b; b=&a; printf("%d%p",*b,&a); return 0; } これが違う値になるのは普通に理解できるのですが。。
863 :
デフォルトの名無しさん :2007/05/05(土) 18:58:47
このプログラムをコンパイルすると*aと&bの値が全く違うのはなぜでしょうか? ↓ このプログラムをコンパイルすると*bと&aの値が全く違うのはなぜでしょうか? の間違いでした、
a==5 &a==0x12345678 // aのアドレス b==0x12345678 // aのアドレス *b==5 // ポインタのデリファレンス(ポインタbから参照先の値を得る) *bと&aの値が異なるのは当たり前
こういう場合は int* b=&a; と書いた方が分かりやすいかもね。 どっちでも動作は一緒なんだが。
int*b; b=&a; に分解するとわかるぞ。 つまり b==&a
んなことしたら int* a, b; でドツボにはまるだけだから素直に int *a, b; とかくのがお約束。このレベルのわかりやすさが必要な人間はそもそもCなんて使えない。
一度に2つの変数を宣言しなければいい。
>>464-465 回答ありがとうございます。
つまりint *b=&a; では*b(bが指しているアドレスにあるint型のデータ)に&a(aのアドレス)を代入するわけでなく
int型を指し示すポインタbにaのアドレスを代入する
つまり僕が示した前者と後者ではコンパイラさんにとって全く一緒のものとして扱うということですか?
とりあえずこういうことで理解しましたが問題ないでしょうか?
問題ない。
代入と初期化は厳密には文法的に違うものだが、 b に a のアドレスが入るという点においては一応問題はない。
定義と初期化をわけて考えるべし。
定義に注目すれば int *b = &a; のイメージで 初期化に注目すれば int* b = &a; のイメージと言いたいわけか?
C言語はそういう言語仕様に設計にされただけだって 丸暗記してしまっていいよ。理屈で考えても不満が出てくるだけだ。
間を取って int * b = &a; にしようぜ。
このブラウザ、&a;が、&だけになっとる・・ 何の話かよくわからなかったぜ・・・
実体参照にバグのあるブラウザ(藁
ソースで &a; になってる以上、ブラウザのバグだな。
sage
htc(WindowsMobile)で2ちゃんブラウザの2++です 今はauの携帯から書いてます、ここソフトバンク入りにくい
携帯ブラウザか
1から、2の30乗までの数値を全て2進法で表示するプログラムを作りたいんだけど、 これをなるべく早く実行したいんだ。実際の表示は行わなくていいらしい。
ビットシフトを使うんだ!
885 :
883 :2007/05/06(日) 13:59:12
でけました main(){}
「表示するプログラム」で「表示しなくて良い」とはこれいかに? まあ要するに、2^30までのどんな数字でも2進表示できるプログラム、だろうけど。 宿題スレに行ってね。&
888 :
883 :2007/05/06(日) 15:11:04
>>887 人づてに投稿した問題文なので、乱文になってしまいました。
スレ汚し申し訳ないです。宿題スレ行ってきます。
分かっちゃいたがインラインアセンブラより素直にコーディングした方が速かった、かなしーねー しっかし2^30まで表示するのは難儀だな
スレ違いかもしれませんがですが、C++で組みました どれぐらい遅いか比べてくださいお願いします #include <bitset> #include <iostream> // 10進法→2進法 std::bitset<32> dec2bin(int _int) { std::bitset<32> ret; for(unsigned int i = 0; i < 32; ++i) ret[i] = (_int & ( 1 << ((sizeof(int)*8-1)-i ) ) ) !=0; return ret; } // 表示 int out(const std::bitset<32>& s) { for (unsigned int i = 0; i < 32; ++i) std::cout << s[i]; std::cout << std::endl; return 0; } // main int main() { std::bitset<32> d = dec2bin(32); for (unsigned int i = 1; i < 2<<30; i<<=1) out(dec2bin(i)); return 0; }
>>890 ありがとうございます。
bcc32にてコンパイル致しましたがエラーが出てしまいます。
コンパイラは何を使われていますか?
892 :
883 :2007/05/06(日) 16:19:45
宿題スレにて、要求を満たすプログラムを頂きました。 お騒がせ致しました。
893 :
デフォルトの名無しさん :2007/05/06(日) 16:25:55
1~999であれば(゚-゚)を表示 それ以外ならば(゚⊿゚)を表示 って言うのを組みたいんですが、こんな感じですかね? #include <stdio.h> #include <stdlib.h> int main (void) { int ran; srand (time(0)); ran = rand () % 1000 + 1; if (ran < 999) { printf ("(゚-゚)"); } else { printf ("(゚⊿゚)"); } return 0; }
>>893 if (ran < 999) {
printf ("(゚-゚)");
}
↓
if (ran <= 999) {
printf ("(゚-゚)");
}
999の時どうなるのか見直せ。
>>893 いやまて
ran = rand () % 1000 + 1;
1~999 なら (゚-゚)
1000 なら (゚⊿゚)
でいいんだな?
(゚⊿゚)が出る確率1/1000だけどいいんだな?
897 :
デフォルトの名無しさん :2007/05/06(日) 16:37:06
898 :
デフォルトの名無しさん :2007/05/06(日) 16:39:04
つまり、これなら大丈夫ですか? #include <stdio.h> #include <stdlib.h> int main (void) { int ran; srand (time(0)); ran = rand () % 1000 + 1; //1~1000の擬似乱数を出力 if (ran <= 999) { //ranが999以下の時に(゚-゚)を表示 printf ("(゚-゚)"); } else { // ranが999以下の時意外に(゚⊿゚)を表示 printf ("(゚⊿゚)"); } return 0; }
900 :
デフォルトの名無しさん :2007/05/06(日) 16:42:57
time.hは取り込まなくても動くの? うちのVC.NET2003はtimeが見つからないって言ってるんだけど
902 :
デフォルトの名無しさん :2007/05/06(日) 16:49:52
>>901 BCC55だと問題なく動きますよ
まぁ一応、チェックしてて気付いたんでtime.hをincludeして置きましたけど
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main (void) {
int ran;
srand (time(0));
ran = rand () % 1000 + 1; // 1~1000の擬似乱数を出力
if (ran <= 999) { // ranが999以下の時に(゚-゚)を表示
printf ("(゚-゚)\n"
" %d"
,ran);
}
else { // ranが999以下の時以外に(゚⊿゚)を表示
printf ("(゚⊿゚)\n"
"%d"
,ran);
}
return 0;
}
Cだとプロトタイプなくても呼べるからね。
VC++は、プロジェクトを作ると何でもC++でコンパイルするコンパイラオプションを付けてくるからね
プリコンパイルヘッダーを使うからだ
>>903 Cでもプロトタイプ宣言は要るでしょう…
>>904 cl.exeでCでコンパイルするようにするオプションってありますか?
>>905 プリコンパイルヘッダなんて使ってません
>>906 無くても呼べるってのと、あったほうがいいってのは別の話。
無くてもエラーにならずに呼べる。
>>906 /TC
つかcl.exe 使ってんなら -?でわかるだろ
>>906 は典型的な頭が固いくせに自分は頭がいいと思ってる近づきたくないやつだな
>>907 無くても呼べるんですか
コンパイラの型チェックができないと、宣言のときの型の意味無いじゃんとか思って
Cでも必須って思ってました
>>908 ㌧クス
/TCオプション付けたら難なく通りました
>>909 おっしゃるとおり頭が悪い上に固くさらに怠け者の駄目人間です
最近いまいち何がしたいのかよくわからん質問が多いなあ まあ入門書に載ってるソースがクソだからだけど
エスパー能力を磨くんだ。
>>910 プロトタイプや関数の定義がファイルスコープに無いときは、引数は呼び出し側にあわせて、戻り値はintが仮定される。
実際の呼び出し時には、intまたはdoubleへの格上げがあるけど。
ただ、この話は歴史の話になるので・・・
915 :
デフォルトの名無しさん :2007/05/07(月) 14:25:31
>>914 まず入門サイトをはしごしてからでもいいと思うよ。金かけるのは。
職場で原書持ち歩いてる奴なんて見たことないな。 アメリカから来た日本人グラマもいたけど訳書持ってた。 特に意味不明な訳はないし 英語の勉強も同時にやりたいんでもないなら日本語版買っとけ。
>>914 原書をそのまま読めるなら翻訳を読む必要は無い。
しかしそれ以前に、K&Rはプログラミング従事者で最近の言語に縁が無い人向けの本だ。
すべてを無料かつオンラインで済まそうとする奴にろくな奴はいないとだけ言っておく。 特にFAQ&Tips、リファレンスの検索ではなく網羅的な知識が必要とされる入門書においては。
でもK&Rから始めるというのもな。 本は目的の言語で記述してあるアルゴリズムの本から入るのがいいと思うなあ
出来る限りgetcharでやってこうってスタイルは好き
922 :
914 :2007/05/07(月) 16:46:59
皆様いろいろとレスありがとうございます^^ 普段は原書(英語しか読めませんがorz)か訳書の選択は 価格が同じで内容が同じ(追加や大きな訂正が無かったり) なら原書を選ぶことにしています が 買うとするとK&Rはちょっと値段差が大きいので・・・ あとプログラミング関係で英書はあまり読んだことがなく専門用語がちと不安です >猫でもわかるプログラミング これは良いですね ありがとうございます ぬこかわいいよぬこ マクローリン展開を高校で教えられたというのはいいなぁ・・・ けどマクローリン展開と呼ぶ人はいまやほとんどいない (たぶん)はずなのでテイラー展開と書いてほしかったような気もw あとぱらぱらと眺めてみましたがこの説明だと ポインタの理解が僕には辛いような気もします 配列とポインタの違いがよくわかりませんorz >すべてを無料かつオンラインで済まそうとする奴にろくな奴はいない アドバイスありがとうございます 入門書は大事だと思いますし良いものにお金を払うという スタンスは大事だと思います とはいえお金が無くて 学習ができない人や国もいたりあったりするわけでそういう意味では 良い入門書ほどオンラインで無料公開されるべきなのかなとも思ったり >アルゴリズムの本から入るのがいいと思うなあ どちらかというとアルゴリズムの本は辞書的に使いたいと 思っていたのですがやっぱそれじゃ駄目ですか?w
923 :
デフォルトの名無しさん :2007/05/07(月) 16:51:23
マクローリン展開は普通に使ってるが。
こいつやる前からウダウダ言って時間つぶして こんなんじゃ結局身に付かなそうだな。
口を動かす前に手を動かせってやつだな。
K&Rは下手に装飾してないおかげで内容の割りに小ぶりで軽いし紙も柔らかいから 物理的に読みやすくて出かけの暇つぶしで勉強するには丁度いい
>>922 >917にも書いてあるけど、K&Rはプログラミング初心者向けではないよ。
プログラマー目指して今日からC言語を独学で学ぼうと思うんですが テキストエディタは何がお勧めですか?
>>929 環境による。大抵の環境で使えるvi(及びその派生品)はお勧め。
>>929 VisualC++ 2005 Express Edition
本についての質問の次は エディタについての質問かよ。
サクラエディタはないだろ。さすがに
937 :
914 :2007/05/07(月) 21:59:34
おk とりあえず買って目を通してみます >マクローリン展開は普通に使ってるが それは失礼しました けれど用語を使い分けるメリットが それほどあるとは思えなかったりもします マクローリンさんの世に広めた功績は大きいとは思いますが・・・ そんなこと言い出すとローラン展開と呼べなんて話になるかw ご紹介いただいた学習帳や独習Cも見てみます 皆様レスありがとうございましたノシ
マクローリン展開 = 0 の周りのテイラー展開 「マクローリン」の方が「0 の周りのテイラー」より短いからメリットはある。
Viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
vi、および、viクローンに1票 どんな言語でも、スクラッチで書くときや、機械的な整形するときとかはviかな。 コメントは英文で・・ そのあとは、いまどきの各種IDEのエディタでマウスつかってデバッグかなぁ
うまくいかないってのは何をしたらどうなる予定がどうなったんだ? PATHが通ってないだけな気がするが
LSICはやめとけ。 古いとか16bitとかってことだけじゃなく NT系のOS(XPとか)と相性がイマイチで、不具合が出る可能性がある。 まあ、マニュアルは手元に置いて参照するのに便利だけど。
>>942 "3.下図のように、著作権などの文字列が出力されればインストール完了です。"
がうまくいきません。文字列が何も出てきません。
何度かインスコしなおしてみたりもしましたが、改善されませんでした。
>>943 他にお勧めのコンパイラを紹介していただけないでしょうか?
>>944 他にも、LSICはC89の規格にさえ準拠していない点が多々あるので、
今となっては歴史的な価値しかない。入門で使わない方がいい。混乱する。
他にお薦めというと、Cygwinでgccか、Borlandがタダで配ってるやつか、
MSがタダで配ってるやつになるかな。
VC++ が一番楽じゃね?
'lcc' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 も出ないのか?そりゃ変だな まあWin使ってんならVC++入れてみ
つーか、今時LSI-Cなんかを使わせるそのページ自体が糞以下なんだがな。
性能最強 gcc 使いやすい VC++
gcc 性能最強って、昔はそうだったかもしれんが、最近はあり得ないな。 Intel > VC++ > gcc じゃね?
VTuneが最強なのかね、やっぱり。 ところで、実際VC++の性能ってどうなのよ
>>951 初心者はまだ速度なんて気にしなくていいから。
LSICのエラー文が日本語にできると知った時にはすでにさよならしてました
それはキミがおかしい
てか
>>941 はまずパーソナルコンピュータの基礎から勉強したほうがいいよ
今まで生きてきてhrefから貼ってるやつ見たのはじめてだよ
>>955 みんな恋愛の初心者のボクにアドバイスください> <
958 :
957 :2007/05/08(火) 12:26:31
orz X みんな恋愛の初心者のボクにアドバイスください> < O 恋愛の初心者のボクにアドバイスください> < いみわかんねー
自己主張の激しい無能ほど始末におえないものはないな。
PATHの設定もできないのにgccか まあいいけど、まずはコードを書いて動かしてみるってとこから 始めるならIDEがいいけどね。コマンドラインは別に覚えればよし
>>962 巨大で複雑なソフトの作成に有効とのことなので、そこまでできる技術を身につけたら使ってみようと思います。
逆だろ。最初のうちはあの親切すぎるくらいのデバッガ使って勉強したほうがいい。 つっても初心者質問見てるとまともにデバッガ使ってないようなのばかりだけどな。
>>965 IDE=統合開発環境ですよね?
もしよろしければ、お勧めを教えていただいてよろしいでしょうか?
ヒント:VC++はIDEか否か?
VS2003入れてるけど使ってないなー .NET以降から内部エディタをVimにできなくなって使うのやめた
とりあえず今はフリーでいくつも試せるんだから LSI-Cを入れたくらいなんだし片っ端から入れてみては この板でもVC++とbcc++はスレもあるくらいだし
ifでループ処理をしてみたいのですが、可能でしょうか? // ソース #include <stdio.h> #include <stdlib.h> // srandやrandが含まれる #include <time.h> main () { int ran; // 乱数変数ranを定義 int kai = 0; // 回数変数kaiを初期化 srand (time(0)); ran = rand () %300 + 1; // 1~300の間の擬似乱数を出力 kai = kai + 1; // kaiは1回毎に1増えるようにする(whileでの回数制御用) if (kai == 10) { // kaiが10の時、Endと表示し、処理を停止 printf ("End"); } else { // kaiが10でない時、ranとkaiを表示 printf ("%d\t%d\n",ran,kai); }
>>970 13行目のコメントは無視してください
while練習につかったソースの使いまわしなんですorz
っ goto
よく考えたら kai = kai + 1; に戻って来れないので無理ですね・・・ お目汚し失礼しました。。。
何か珍妙な事をしようとしている気がして怖い。 こうだな。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int kai; srand((unsigned)time(NULL)); for(kai = 0; kai < 10; ++kai) { int ran = rand() % 300 + 1; printf("%d\t%d\n", ran, kai); } puts("End"); return 0; }
975 :
デフォルトの名無しさん :2007/05/08(火) 17:42:47
gotoが上手く動かないのですが・・・ 何処が問題なのでしょうか? #include <stdio.h> #include <stdlib.h> // srandやrandが含まれる #include <time.h> main () { int ran; // 乱数変数ranを定義 int kai = 0; // 回数変数kaiを初期化 srand (time(0)); ran = rand () %300 + 1; // 1~300の間の擬似乱数を出力 loop: // ラベル名
976 :
デフォルトの名無しさん :2007/05/08(火) 17:43:27
kai = kai + 1; // kaiは1回毎に1増えるようにする(whileでの回数制御用) if (kai == 10) { printf ("End"); goto end; // 対応したラベル名に移動 } else { printf ("%d\t%d\n",ran,kai); goto loop; // 対応したラベル名に移動 } end: // ラベル名 return 0; }
977 :
デフォルトの名無しさん :2007/05/08(火) 17:51:55
>>974 珍妙な事は大好きです
因みにCははじめたばかりなので、まだよく解かってません
(専門学校で習ってるんですよ、一年生です)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int kai;
srand((unsigned)time(NULL)); // なんですかこれ><
for(kai = 0; kai < 10; ++kai) { // kaiを初期化、kaiは10より少ない、++kai??
int ran = rand() % 300 + 1; // ranは1~300の整数乱数
printf("%d\t%d\n", ran, kai); // 変数ranとkaiを表示
}
puts("End"); // Endを吐く
return 0;
}
ラベルの位置がおかしくね? loop:はran = rand() %300 + 1;の前じゃないと。
>>975 そのコードは書いてある通りに動く。
きっとloop:の位置があなたの想定と違うのだろうけど。
要所要所にprintf()を置く(動きがわからないならもう1行毎でも置く)とか、
デバッガでステップ実行するとかで、自分の思っている通りに動作しているのか確認しましょう。
これを「デバッグ」と言います。
980 :
デフォルトの名無しさん :2007/05/08(火) 18:24:51
>>978 ran = rand () %300 + 1;の前にloop:を配置してみましたが、動作は何一つ変わりません
srand (time(0));の前にも置いてみましたが、やはり変わりませんでした
意表をついてint ran;の前に置いたら、予想通りコンパイルエラーが出ました
(´・ω・`)・・・
>>979 確かに書いてある通りに動くのは解かるんです
(というか、書いていない通りに動くプログラムなんてないでしょうし・・・)
Windows Vistaなので、デバッガなんてありませんです
そもそも、このOS、プログラミングをまともに出来ませんから・・・
(学校の指定なので、仕方がないんです
将来的にはVistaが蔓延するよ、何て先生たちは言ってますけど、ありえないですよね
アメリカやEUの事情をきっと知らないんですよ)
取り敢えずprintfで色々やってみようと思います
>980 動作が何一つ変わらないってことはありえないんだけど。
Visual Studio が Vista でまともに動くようになれば変わってくるよ。
コンパイルし忘れてるだけだろう
984 :
デフォルトの名無しさん :2007/05/08(火) 18:49:39
>>981 こうですよね?
#include <stdio.h>
#include <stdlib.h> // srandやrandが含まれる
#include <time.h>
main () {
int ran; // 乱数変数ranを定義
int kai = 0; // 回数変数kaiを初期化
srand (time(0));
loop: // ラベル名
あたらしい名前でファイルを作ってコンパイルした→実行したのは古いほう→動作変わんねー とかじゃね?
986 :
デフォルトの名無しさん :2007/05/08(火) 18:50:52
ran = rand () %300 + 1; // 1~300の間の擬似乱数を出力
kai = kai + 1; // kaiは1回毎に1増えるようにする(whileでの回数制御用)
if (kai == 10) {
printf ("End");
goto end; // 対応したラベルに移動
}
else {
printf ("%d\t%d\n",ran,kai);
goto loop; // 対応したラベルに移動
}
end: // ラベル名
return 0;
}
>>982 VS入ってるけど、BCCでコンパイルしてます
VSエラーはきまくるから嫌い・・・
clにPATH通らないし
>>983 コンパイルはしてあります
ファイルも保存できてます
その辺りに抜かりはないです
987 :
デフォルトの名無しさん :2007/05/08(火) 18:52:32
>>985 ファイル名を確認してみましたが、特にそういうことはなかったです
ファイルパスも同じですし間違いないです
なんでだろ・・・
要するに、まだ for 習ってないのか。 流れを掴むのに if-goto で書いてみるのは悪い事ではないけど、 とりあえず先に進んだんでもいいと思うぞ。
>clにPATH通らないし つvcvars32.bat
990 :
デフォルトの名無しさん :2007/05/08(火) 19:06:02
>>988 forやってもいいんですけど
その前にifを、もう少しやりたいんですよね
学校では
printf → int → float → char → if → whileの流れなんですけどね
仰るとおりforは、まだです
因みに、どれも中途半端に習わされているので、色々微妙です
(charがポインタだなんて教えてくれなかったし・・・
int main (void)すら教えてくれなかったから、int main(void)の意味すら解からない
つか、printfよりputsの方がよさそうな気もするし・・・
ifだって&&や||等の符号は教えてくれませんでした)
>>989 まさか、それをPATHに通すんですか?
char は整数でポインタじゃねーぞw
そんなラベルでgotoなんて・・・
もとへ、レベル
>>990 vcvars32.batはPATHを通すコマンドも含まれてるから、それをパスの通ったとこに置いて
コマンドプロンプト起動時に実行すればよし。
もしかしてexeをダブルクリックしてるとか?
996 :
デフォルトの名無しさん :2007/05/08(火) 19:23:27
>>991 そうなんですか?
なんか手元の入門書にはcharはポインタとか書いてるんですが・・・
>>992 どの辺りが駄目なんでしょうか?
>>994 ちょっと見てみます
>>995 流石にそれはないです・・・
>>995 それじゃ cl.exe 呼んで終了だから、コンパイルすらできない予感
>>990 コマンドプロンプト開く →
vcvars32.bat をコマンドプロンプト窓へドラッグ&ドロップ →
コマンドプロンプトで [Enter]
あとは コマンドたたけ
>>996 そんな本があるはずない。いや、あって欲しくない
おまえさんの誤読じゃねえのか?
もっと俺様の役に立つレスをしろや
1000 :
デフォルトの名無しさん :2007/05/08(火) 19:32:33
>>997 因みに
>>986 にも書きましたが、コンパイラはBCCをつかっているので
問題なくコンパイルは出来ていますし
CL.EXEを直に動かしたり、ソースファイルをクリックしたり
コンパイルされたexeファイルをクリックしたりはしていません
全部cmdからbcc32 ソース名でコンパイルし
コンパイルされたプログラム名で実行しています
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。