C言語なら俺に聞け(入門篇) Part 33

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら宿題スレへ行ってください。
C/C++の宿題を片付けます 114代目
http://pc11.2ch.net/test/read.cgi/tech/1216746971/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 32
http://pc11.2ch.net/test/read.cgi/tech/1215568848/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
2デフォルトの名無しさん:2008/07/26(土) 21:14:32
#include<stdio.h>
int
main
(void
){
printf
(">>1 "
"otu"
"\n");return 0;}
3デフォルトの名無しさん:2008/07/26(土) 21:17:06
>>2
IEで見たら失敗しとる><
4デフォルトの名無しさん:2008/07/26(土) 21:50:26
return otu>>1
5デフォルトの名無しさん:2008/07/26(土) 22:01:45
にしたかったのか
6デフォルトの名無しさん:2008/07/26(土) 23:17:58
return 1
7デフォルトの名無しさん:2008/07/26(土) 23:54:55
なんでプログラムを作る人よりプログラムを作らせる人のほうが楽で給料もいいのはどうして?
8デフォルトの名無しさん:2008/07/26(土) 23:57:47
プログラムを作るのは誰でも出来るけど
プログラムを作らせるのは誰でも出来るというわけではない
9デフォルトの名無しさん:2008/07/26(土) 23:58:01
いいえ、思うように動いてくれないプログラマを叱咤激励するという激務が待っています。
ついでに言えば、社会常識のないプログラマの尻拭いや、構ってちゃんのプログラマのケアや、
使えない上司への報告や、理不尽なクライアントの交渉なども含まれますから楽だなんてとてもとても。
10デフォルトの名無しさん:2008/07/26(土) 23:58:30
世の中全部、どの業界でも、物を作る人間より、それを右から左に流してる人間のほうが儲かってる。
11デフォルトの名無しさん:2008/07/26(土) 23:59:35
いいえ、右から左に流している人間ではなく、右から左に流している人間が所属する会社が儲かっているのです。
12デフォルトの名無しさん:2008/07/26(土) 23:59:55
代わり映えしない物に大した価値は無いだろ
そのくせ人件費が掛かるとか救えねえ
13デフォルトの名無しさん:2008/07/27(日) 00:02:07
凄い速度でレスがついたな
14デフォルトの名無しさん:2008/07/27(日) 00:10:33
システムをカスタムメイドで作るよりは
業務のほうを一般的なものに合わせるほうが
効率がいいのにそうしないからな
15デフォルトの名無しさん:2008/07/27(日) 00:12:00
鼬害のネタはほどほどにね
16デフォルトの名無しさん:2008/07/27(日) 00:29:05
>>14
奨学金のシステムやったけど、導入の単位が市町村で、制度はほとんど同じなのに
やっぱ、自治体ごとに微妙に違うんだよな。
こんなの県や国単位で統一すれば、おんなじシステム使えて安くなるのにな。
17デフォルトの名無しさん:2008/07/27(日) 00:34:51
>>16
同じ業務パッケージでも、サイトごとに修正を入れているものがほとんど
ソースコードの管理は大変だろうなと思ってしまう
18デフォルトの名無しさん:2008/07/27(日) 00:34:54
マ板で語れアホ共
19デフォルトの名無しさん:2008/07/27(日) 00:52:55
日本では理系は軽んじられすぎる
20デフォルトの名無しさん:2008/07/27(日) 00:58:29
某国が日本を弱らせるために理系の待遇を悪くするように日本政府に干渉してきたんだよ。陰謀だよこれは
21デフォルトの名無しさん:2008/07/27(日) 01:04:04
たぶんザビエルのせいだと思うよ
22デフォルトの名無しさん:2008/07/27(日) 05:03:04
プログラム実行時に exp や pow の OVERFLOW エラーが出る原因は
扱える数の範囲を超えてるからでしょうか?
23デフォルトの名無しさん:2008/07/27(日) 06:09:57
某国の陰謀か、ザビエルのせいか、扱える数の範囲が狭すぎるか、扱える数の範囲を超えているかのいずれかだね。
24デフォルトの名無しさん:2008/07/27(日) 06:39:22
まったくザビエルのやつ・・・
25デフォルトの名無しさん:2008/07/27(日) 07:42:02
int *p;
p[3];

とかにアクセス出来るんですけど?
ポインタって配列なんですか?
26デフォルトの名無しさん:2008/07/27(日) 07:46:10
p[3];

*(p+3);
だと思う。
27デフォルトの名無しさん:2008/07/27(日) 07:47:19
3[p]でもアクセスできるから3も配列だな
28デフォルトの名無しさん:2008/07/27(日) 07:59:58
fgets()とかgets()の戻り値って何に使うんですかね?
char*型じゃなくてもいい気がするんですけど。
str*系とかもそうですよね?
一体何に利用するんですか?
29デフォルトの名無しさん:2008/07/27(日) 08:38:57
RTFM
30デフォルトの名無しさん:2008/07/27(日) 08:59:26
>>28
そのまま別の関数に渡せるように。
31デフォルトの名無しさん:2008/07/27(日) 09:42:35
>>30
まあ、そうでしょうが、それって現実的に使われてますかね?
strcpy(foo, strcpy(bar, strcpy(baz, "foobarbaz"));
こういう風ですかね、例えば。
32デフォルトの名無しさん:2008/07/27(日) 09:48:57
sprintf("foo:%s", strcpy(foo, "abc"));
こういうコードは稀に見かける。
33デフォルトの名無しさん:2008/07/27(日) 10:05:07
strcpyはいいとして、fgetsはNULLを返すことがあるから、いったんテストしてからでないと使えないことが多いし。
34デフォルトの名無しさん:2008/07/27(日) 10:38:58
35デフォルトの名無しさん:2008/07/27(日) 12:37:31
とゆーか
fftをつくりたいんだけど
どういう風につくればいいのかビジョンがみえない。
ビジョンがみえればスイスイかけるんだけど。
ネットにあがってるのあるけどなげーよ。
36デフォルトの名無しさん:2008/07/27(日) 12:44:27
37デフォルトの名無しさん:2008/07/27(日) 13:58:42
>>35
古い本ですが、
Cによる科学技術計算/小池慎一/CQ出版 1987
いろいろなバリエーションがソース付で紹介されています。その手の本ではわりに有名。
38デフォルトの名無しさん:2008/07/27(日) 15:03:17
>>32
abort の代わり?
39デフォルトの名無しさん:2008/07/27(日) 15:28:26
物理シミュレーションってどうやればいいの?
40デフォルトの名無しさん:2008/07/27(日) 15:34:47
>>39
F=ma を計算する
4141:2008/07/27(日) 22:29:39
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7515.txt
このプログラムにカウントダウン機能をつけようと思っているのですが、どうもうまくいきません。
LIMIT_TIMEを60秒としてこれを常に表示したいと思ってます。
どなたかご教授ください。
42デフォルトの名無しさん:2008/07/27(日) 22:42:22
教授を人質にするなんて卑怯だぞ
43デフォルトの名無しさん:2008/07/27(日) 22:48:15
>>41
まずはTabとかで見やすくしてくれると嬉しいな。
俺Linuxなんでconio.hがないんであれなんだが、どう
上手く行かないのかざっと説明してもらえるかい?
44デフォルトの名無しさん:2008/07/27(日) 22:59:24
私が苦肉の策を講じて作成したプログラムですね、わかります

てかあの状態でもアジがあると思ったんだけどなあ・・・
4541:2008/07/27(日) 23:01:27
>>43
すいませんTabとかよく知りませんで・・・
最初は2つ目のwhile文のch = getch();の後に
printf(" 残り%4d秒\b\b\b\b\b\b", lim-end/CLOCKS_PER_SEC);
というプログラムを打ったのですが、これだと1文字打つたびに秒数が表示されてしまいおかしなことになってしまうといった感じです。
46デフォルトの名無しさん:2008/07/27(日) 23:07:00
>>41,45
ex31.txtが無いので実行できません
4741:2008/07/27(日) 23:27:50
>>44
やはり1文字ずつの表示だと自分のではダメだったみたいで・・・

>>46
大変申し訳ありませんでした。
ex31.txtの中身はA friend in need is a friend indeed.と書いたテキストファイルです。
48デフォルトの名無しさん:2008/07/27(日) 23:36:36
>>44,47
話が見えないから開発したスレも頼む

ついでにconioはこっちの方が適切だとは思う
【初心者歓迎】C/C++室 Ver.57【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1216215558/
49デフォルトの名無しさん:2008/07/27(日) 23:44:18
5041:2008/07/27(日) 23:48:45
誘導ありがとうございます。
そちらのほうで質問してみたいと思います。
51デフォルトの名無しさん:2008/07/27(日) 23:51:05
標準ライブラリ関数のtimeを使って
今日の日付(具体的には年月日)を配列に格納したいのですが
たとえば「2008/07/27」のように項目ごとにスラッシュを入れて格納する方法はないでしょうか?
52デフォルトの名無しさん:2008/07/27(日) 23:55:00
>>51
strftime
53デフォルトの名無しさん:2008/07/27(日) 23:55:56
localtime→strftime
54デフォルトの名無しさん:2008/07/27(日) 23:56:12
そんなに環境依存な話でもなくね?conio.hが含まれてるだけで。
入力される度にその行を頭から書き直すのが楽かもな。
それかエスケープシーケンス使ってカーソル位置制御って手もあるし。
5554:2008/07/27(日) 23:57:07
>>50 へのレスね。書き忘れたスマソ。
5641:2008/07/28(月) 00:14:12
>>49
ありがとうございます。
コンパイルはできたのですが、やはりエラーが出てしまいました。
参考に出来る部分もあると思うので頑張ってみます。

>>55
色々ありがとうございます。
それらの方法も試してみます。
57デフォルトの名無しさん:2008/07/28(月) 01:15:44
初めまして。

自分は初めてプログラムを勉強しています。
「猫でも分かる C言語プログラミング」という本を見ていますが分からない部分があります。

char→文字
ing→整数
double→小数 というのは分かりましたが

double「pat」 =3.1415926
int「mon」=2;
float「flt」=1.2f;

「」のなかの文字は何を表しているのかが分かりません。
これは円周率についてプログラムを書いているみたいです。

もし「猫にも分かるプログラミング」の本を持ってる方いたらp51です・・・。

自分はまったく知識もないし、学校にも行っていません。
本当に初心者で恥ずかしいですがお願いします。
58デフォルトの名無しさん:2008/07/28(月) 01:16:21
なんの釣りだよ
59デフォルトの名無しさん:2008/07/28(月) 01:17:58
すみません自分のことを言ってると思いますが釣ってません
60デフォルトの名無しさん:2008/07/28(月) 01:21:35
>>59
何でプログラミングでも始めようと思ったん
61デフォルトの名無しさん:2008/07/28(月) 01:23:12
>>57
char→文字
int→整数
double→小数
これらは変数の型

つまり
int mon = 2;
と言うのは

int 型(整数を扱う型)の変数名 mon と言うものを宣言して
それを 2 で初期化してる
62デフォルトの名無しさん:2008/07/28(月) 01:25:29
ITの3Kを知りどんなことをやっているのか興味を持ったからです。
初めてHello Worldを組んで成功して面白いと思ったのです。
しかし変数でつまずいています。
もっと言うとマイクロ社からDLする時点でつまずきました
63デフォルトの名無しさん:2008/07/28(月) 01:28:07
>>57
ネタにしかみえない

>char→文字
>ing→整数
>double→小数 というのは分かりましたが
char型ってのは文字というより1バイトで表現できる数値型だよ。
たまたま文字コードもその範囲で表現できるので文字とかいってるけど。
ingじゃなくてintね

>double「pat」 =3.1415926
>int「mon」=2;
>float「flt」=1.2f;
これもよくわかんね〜
64デフォルトの名無しさん:2008/07/28(月) 01:29:00
>>61さん

宣言名ということはmonでなくてもいいということですか?
それとも決まっているのですか?
65デフォルトの名無しさん:2008/07/28(月) 01:31:03
>>64
monでなくてもOK

任意で決めれます。
まー仕事でする場合は命名規則とかもあるだろうし、
66デフォルトの名無しさん:2008/07/28(月) 01:31:32
monじゃなくても良いよ
変数名として使える文字はこれだけ
・小文字と大文字のアルファベット
・数字
・_(アンダースコア)
67デフォルトの名無しさん:2008/07/28(月) 01:33:14
みなさん本当にありがとうございます!!

ネタであって欲しいぐらい初歩的なことですみませんでした・・・。
68デフォルトの名無しさん:2008/07/28(月) 01:35:47
諦めずに頑張れよー
69デフォルトの名無しさん:2008/07/28(月) 01:41:15
>>62
「きつい」「帰れない」「給料が安い」で興味を持つって凄いなあんた…
http://ja.wikipedia.org/wiki/3K

もう居ないかも知れないが
一人で始めたんなら仕方ないけど身近に相談できる人を出来たら探した方が良い
深い知識があって親身に教えてくれる人な

今回みたいなので疑問に思うって事は後々でてくる
配列やポインタでも疑問点が解決できずに先に進めなくなる可能性があるから頼りになる人が必要になる
知識も無いのにネット上で情報を漁るのは危険だし
一冊読み終わるまではそいつに引っ張ってもらって分からない所をガンガン教えてもらう

ある程度まで進めれば自分で理解を試したり理解を深めていけるから
それまではそういう人に甘えてしまった方がいい
70デフォルトの名無しさん:2008/07/28(月) 01:46:36
71デフォルトの名無しさん:2008/07/28(月) 01:47:14
すいません。まだいます・・・。

近くに元プログラマーはいます。
 
その人に聞くことは出来ますが、出来るだけ自分でググッたり参考書をみて解決しないと自分のためにならないと思いました。
しかし、やはり一人だとすぐに分からないことが出てきて今回初めて質問してしまいました。
不快になった方もおられると思いますが温かい言葉ももらえて嬉しかったです。

72デフォルトの名無しさん:2008/07/28(月) 01:52:13
死肉吹いたw
73デフォルトの名無しさん:2008/07/28(月) 01:56:53
ぶっちゃけ、猫でもわかるCって嫌いなんだが。
表現も微妙で分かりにくい。そんなことない?
俺は新訂新C言語入門系列を使ってた訳だが。
74デフォルトの名無しさん:2008/07/28(月) 02:04:21
書籍スレは別にあるぞ
75デフォルトの名無しさん:2008/07/28(月) 02:18:50
すみません。
まだ起きてる方いますか?

#include<stdio.h>
int main()
{
double pai = 3.14159;
printf("円周率は%4.2fです。\n",pai);

return 0;
}

を作ると「円周率は3.14です」
となりますが「%4.2f」の部分がよく分かりません。

「猫にも分かる」p49には「%の次にーがないときは右つめになる」など色々解説してありますが理解できません。

先ほどえらそうな事言ってまた質問して情けないですがお願いします・・。
 
>>73さん
遅くなりましたがこの書籍は2ちゃんとアマゾンで好評だったので手に取っただけです。
初心者の自分にはどれがいい悪いが分からなかったので
76デフォルトの名無しさん:2008/07/28(月) 02:22:10
>>75
どういう形で表示するかを指定してて

%4.2f
この場合4は最大4桁
.2はそのうち小数点以下に2桁使うということです。
fは小数点を扱う変数を指定する場合に使います。

小数点がない場合はd
77デフォルトの名無しさん:2008/07/28(月) 02:25:29
分かった!!

double pai = 3.14159;
printf("円周率は%4.2fです。\n",pai);

↑3.14159と%4.2fは繋がっていたんですね!!

>>76さんありがとうございます!!
78デフォルトの名無しさん:2008/07/28(月) 02:26:10
補足で
%04.2f
とすると

整数部分が一桁しかない場合は開いている桁の部分を0で埋めてくれます。

79デフォルトの名無しさん:2008/07/28(月) 02:28:49
つまり03.14ってことですか?
8076:2008/07/28(月) 02:28:59
追加補足

その辺はprintf 書式 で検索すると解説しているサイトはいっぱいでてきますので
調べてみるといいですよ。
参考に1サイト
http://cai.int-univ.com/sugsi/Lecture/c_language/Book/detail_printf.html
8176:2008/07/28(月) 02:30:33
>>79
イエス

ゲームなんかでスコア表示するときに桁がわかりやすくなるように
0で埋まってたりしますよね
あんな感じです。

あと本だけで覚えようとせずプログラムを実際に書いて実行できる
環境を用意して試してみることをおススメします。

82デフォルトの名無しさん:2008/07/28(月) 02:30:47
ちなみに俺も補足すると
>「%の次に-(マイナス)がないときは右つめになる」
と言うのは

printf("%10.2f", pai);
printf("%-10.2f", pai); と書いたら

結果は上から
     3.14(10文字分表示出来るスペースを空けて右詰)
3.14     (10文字分表示出来るスペースを空けて左詰)
とそれぞれなる
83デフォルトの名無しさん:2008/07/28(月) 02:38:33
>>77の感じが機械の少年ピーノの

    ,、 ワカッタゾォ!!!
  ヘ○ 彡
  /ノヽ_
  i | l |i

っぽくて懐かしんだ
8476:2008/07/28(月) 02:41:30
とえらそうに書いてるが実際のところ書式の仕様は全部理解してなかったり・・
プログラム内容によっては使わないことが多いんだよな・・・
85デフォルトの名無しさん:2008/07/28(月) 02:42:55
>>76
小数点がない場合は .0f では?
86デフォルトの名無しさん:2008/07/28(月) 02:43:09
>>76さん>>82さんありがとうございます

自分はゲームまったくしたことがありません。
しいて言うならテトリスとマリオカートぐらいです。
サイト参考にします。
>>82の説明よく分かりました

一応、プログラム「書くこと」は出来ますが「理解」が出来ない部分が多いのが事実ですorz

http://jp.youtube.com/watch?v=d_yOg88lb4Q&feature=related
感謝の気持ちをこめて拾ってきましたハムスターです
87デフォルトの名無しさん:2008/07/28(月) 02:46:38
プログラムを「書くこと」とはキーパンチャーと見つけたり!
っていつの時代だよ!
8876:2008/07/28(月) 02:47:48
>>85
あー書き方が悪かったですね。

小数点を扱わない整数型の変数の場合は・・・ということでした
intとかshortとかね
89デフォルトの名無しさん:2008/07/28(月) 05:10:08
はじめまして。2次元配列について質問です。
10万×10の配列を取って計算したいのですが、
プログラムを実行すると動作が停止してしまいます。

100×10程度にすれば計算可能なようですが、
10万×10の配列の計算を可能にさせるような方法はありませんか?
90デフォルトの名無しさん:2008/07/28(月) 05:12:18
int *p;
p = malloc
91デフォルトの名無しさん:2008/07/28(月) 05:13:50
>>89
ヒープの割り当てが少ないんじゃないの?

その二次元配列の頭にstatic つけてコンパイルしなおしてみなよ。
ちなみにint型の2次元配列?

10万x10x4バイト場所とるよ・・・
9289:2008/07/28(月) 05:30:00
早速のアドバイスありがとうございます。
staticをつけてコンパイルをしてみたところ、
動作の停止は避けられたのですが、計算結果が帰ってきません。
グローバル変数にしてみても、ダメなようです。

2次元配列はdouble型です。
9391:2008/07/28(月) 05:36:31
でかw

つーかそのソース晒せない?
なんか間違ってそう・・・
9489:2008/07/28(月) 05:43:29
やっぱり、大きいですか…

ソースは晒せますが、200行くらいあります
9591:2008/07/28(月) 05:51:48
>>94
単純計算で
100,000x10x8=8,000,000byte 約8Mだからねえ

あれだねえ。
こっちの担当かも
C/C++の宿題を片付けます 114代目
http://pc11.2ch.net/test/read.cgi/tech/1216746971/
9689:2008/07/28(月) 06:00:28
91さん。ありがとうございます。
もう一度、よく考えてみます。

ヒープの割り当てが足りないとのことでしたが、
デスクトップアプリケーションヒープを8MBに設定するとかはダメですか?
9791:2008/07/28(月) 06:04:16
>>96
でもstaticで計算失敗してるってそもそもロジックがおかしいとしか思えん。

static無しで8MBのテーブルとろうとすれば起動時のヒープだとかの設定で
回避できるだろうけどね。
9889:2008/07/28(月) 06:08:11
91さん。了解しました。
staticで計算出来るように修正を図ってみます。
9991:2008/07/28(月) 06:13:59
>>98
がんばってね

今回の問題は
・8MBの領域確保
・計算結果が思ったようにならない
で分けて考えないとね。

領域のほうは
・staticでコンパイル時にあらかじめ静的に実行ファイル内に持ってしまう。
>>90のいうように実行時にmallocで確保する。
くらいかなあ。
サイズが小さければ一時的に使える領域(たぶんヒープ上に用意したスタック?)
に取れるんだろうけど、今回のサイズはこれを超えててstatic無しだと
バッファオーバーフロー状態になってるかと。(C言語詳しい人フォローよろ)
100デフォルトの名無しさん:2008/07/28(月) 12:13:46
このスレもレベル低いなぁ。スタックがヒープだとか、%4.2fが「最大」4桁だとか……
前者は兎も角、後者はprintf("%4.2f", 1e10)とでもしてみれば判ることだと言うのに。
101デフォルトの名無しさん:2008/07/28(月) 12:50:12
コンパイルオプションで静的メモリ確保の領域増やせたよな
102デフォルトの名無しさん:2008/07/28(月) 14:36:20
成功すると0、失敗すると-1が返る関数の場合
if (foo(x) < 0) {
    /* エラー処理 */
}
みたいに書いてあることが多いのですが
if (foo(x))

if (foo(x) == -1)
って書くのはよろしくないんですかね?
103デフォルトの名無しさん:2008/07/28(月) 14:40:40
どちらも問題ない

ただ
前者はエラーの内容によって正負に分けた時に修正が必要
後者はエラーの内容によって数字を分けた時に修正が必要
104デフォルトの名無しさん:2008/07/28(月) 14:43:11
個人的には
if(foo(x) != 0)
と書く
105デフォルトの名無しさん:2008/07/28(月) 20:58:29
BOOLに3種類の値を返すようなクソAPIに慣れ親しんだオレも>>104を推す。
106デフォルトの名無しさん:2008/07/28(月) 21:00:47
ちょっとパターンが変わるが、forkなどは、switchで書くべし。
switch(c = fork()) {
case -1: exit(1); break;
case 0: child(); _exit(0); break;
default: parent(); break;
}
107デフォルトの名無しさん:2008/07/28(月) 21:47:12
>>100
レベルの高い人たちは昇進してエロくなってしまいました
108デフォルトの名無しさん:2008/07/29(火) 03:29:52
109デフォルトの名無しさん:2008/07/29(火) 03:35:11
おー規制解けた・・・

俺も聞きたいな

staticをつけると実行ファイル内に確保されるのはわかる。
static無しの場合はコンパイルしても実行ファイルのサイズは大きくならないのに動いてる。
でも>>89のようにある一定以上の領域を使おうとすればバッファオーバーフローぽいので
おそらく本来は使えないエリアにアクセスしてこける。
まあ大きい領域を使う場合はmallocしてるから普段は気にしてないんだけど。

じゃあたとえばC言語で関数の中だけで使えるintとかって実態はどこに取られるの?
ってことだな。
まあint1つ程度だとレジスタとかで終わりそうだけど、配列とかサイズが大きくなると
とてもレジスタではまかなえない・・・じゃあどこに?・・
110デフォルトの名無しさん:2008/07/29(火) 03:56:41
>>109
スタックって知ってるか?
111109:2008/07/29(火) 03:59:52
それは知ってる。
ただ、疑問なのはシングルスレッドアプリが全盛のDOSの
ころならシステム全体で1つのスタックエリアを使ってた。

昨今のマルチスレッド全盛の場合そのスタックって
実行ファイル毎にどこに持ってることになってるの?
となる。

当然アプリ毎でないとスタックとして機能しないだろうから。

>>100はそのスタックがヒープではないといってる。
112デフォルトの名無しさん:2008/07/29(火) 04:20:12
プロセス間でメモリ空間を共有しているわけではないよ
たとえプロセスのスタック領域がどれも同じアドレスにあったとしても問題ない
113デフォルトの名無しさん:2008/07/29(火) 07:15:17
いまどきはみんな仮想アドレスで動いてて
仮想アドレスから実アドレスへのマッピングはプロセスごとに別々になってるから
別々のプロセスが同じ仮想アドレスを使っててもマップされる実アドレスは異なるので衝突しない
異なるプロセスが使ってるメモリは自プロセスの仮想アドレスにはマップされないので
基本的に覗くことも触ることもできない

それはそれとして、スタックアドレスは固定にする必然性はないよ
実行ファイルのロード時にOSが適当に確保してスタックポインタ設定すれば済むだけだし
114デフォルトの名無しさん:2008/07/29(火) 08:54:30
スタック領域やヒープ領域はプログラマに向けた用語。
アドレスのどこを使うかってのはシステム(CPUやOSで決まるのが大半)が定義しているだけであって、プログラマはスタックやヒープがどのアドレスに割り振られてるかなんてシラネ、ってのがC言語。
まぁアクセスするアドレスを直に指定できるけど、組み込みぐらいしか使わんでしょ。

自動変数、関数呼び出し時の引数、戻り値、内部的には関数呼び出した後の戻り先アドレスなど、一時的に使用されて使用された順番に消えていく領域の確保先を、スタック領域と呼んでいる。
動的に確保して解放するタイミングをプログラマが指定する場合に使用する領域を、ヒープ領域と呼ぶ。
扱う性質が違うから、スタックとヒープはまったく別物。

厳密に言えば違うところも出てくるけど(ゲーム機とかは自前のmallocを持ってたりするからヒープ領域なんて概念すらなかったり)、上記の解釈で十分。
115デフォルトの名無しさん:2008/07/29(火) 15:33:11
まあ、コンテキストスイッチで調べてみるといいんじゃないかな
116デフォルトの名無しさん:2008/07/29(火) 16:14:24
すみません入門本を買ったのですがまずコンパイラが手に入らない…

borlandのturbo debuggerは落とせないし・・・


どれがいいのでしょうか?
117デフォルトの名無しさん:2008/07/29(火) 16:19:38
VC2008EXPRESSかTURBOC++
118デフォルトの名無しさん:2008/07/29(火) 23:12:22
コンパイラいけました。
BitComet介すとダメなようで、普通にやったら普通にいけました。
ご迷惑おかけし、申し訳ありません;;

ところで、入門本で三角形の公式プログラムが載っていたので自分で
台形のを作ってみようと思い実践したのですが、何度推敲しても成功しません…

↓なのですが間違いを教えていただけないでしょうか?
119デフォルトの名無しさん:2008/07/29(火) 23:12:55
sage忘れ申し訳ない…

これです。



#include<stdio.h>
void main()
{

int joutei;
int katei;
int takasa:
int menseki;

joutei = 6;
katei = 4;
takasa = 10;

menseki=(joutei+katei)*takasa/2;


printf("台形の上底は%d\n", joutei);
printf("台形の下底は%d\n", katei);
printf("台形の高さは%d\n", takasa);
printf("よって公式より台形の面積は%d\n", menseki);

}

よろしくお願いします
120デフォルトの名無しさん:2008/07/29(火) 23:17:04
成功しないならどう成功しないのか書けよ
121デフォルトの名無しさん:2008/07/29(火) 23:18:27
>>119
エラーメッセージを見ろ。おそらく7行目でエラーを起こしているはずだ。
122デフォルトの名無しさん:2008/07/29(火) 23:18:54
>>119
void main -> int main
int takasa: -> int takasa;
プログラミングの初歩はコンパイラが出すエラーをちゃんと理解することからです
123119:2008/07/29(火) 23:19:00
すみません119です。
書き込み見て気付いたのですが、int takasaのよこが;ではなくて:になってましたね…


直したらいけました。スレ穢し申し訳ない・・・
124119:2008/07/29(火) 23:21:04
みなさんありがとうございます!

>>122
その「main」の部分のことなのですが、一応「void」でもやりたいことはいけるのです。

「int」との使い分けはどうなっているのでしょうか?




と、とりあえずintにしてやってみます!!!
125デフォルトの名無しさん:2008/07/29(火) 23:21:09
あ、int mainにしたらついでに何か整数を返すように
126デフォルトの名無しさん:2008/07/29(火) 23:21:32
>>124
intにしないといけないことになってる。
127デフォルトの名無しさん:2008/07/29(火) 23:22:46
>>124
やりたいことはやれてもmain関数はintを返すのが決まりなのでvoidは間違い
128デフォルトの名無しさん:2008/07/29(火) 23:23:42
>>125
仕様で決まってることの話をしてるときに大雑把なこというな
129デフォルトの名無しさん:2008/07/29(火) 23:26:58
つまりint main()は整数を返さなくていいということが仕様で決まっているわけですね
130デフォルトの名無しさん:2008/07/29(火) 23:35:44
C99ならおk
131デフォルトの名無しさん:2008/07/29(火) 23:37:30
C99じゃなくてもOK
132デフォルトの名無しさん:2008/07/29(火) 23:38:14
皆さんありがとうございます!

確かにintでやってみたところ、「警告:関数mainに整数を返せヨ〜」
と言われました。

整数を、返す?
これはいったいどういうことなのでしょうか?
返すと言ういみが分からないのです…

教えていただけませんか?
133デフォルトの名無しさん:2008/07/29(火) 23:49:37
それぐらいは自分で本を読んで理解しないと
今後も人におんぶに抱っこだぞ
134デフォルトの名無しさん:2008/07/29(火) 23:52:23
>>132
Windowsを使ってるなら今は気にしなくていい

#includeが魔法の言葉であるように
int mainと return 0がセットになってると考えておk

関数の部分に入ればちゃんと理解できるから
135デフォルトの名無しさん:2008/07/30(水) 02:16:20
夜遅くにすみません。

自分は今猫にも分かるプログラミングという参考書をみて勉強しています。
今「ビット演算子」のページをみて実際に組んでみました。

#include<stdio.h>
int main()
{
unsigned short a,b;

a=1;
b=3;

printf("a&b=%b\n",a&b);
printf("a|b=%b\n",a|b);
printf("a^b=%b\n",a^b);

return 0;
}


a&b=1
a|b=3
a^b=2
とするには何が間違っているのでしょうか?
じぶんで確認してるのですが何が間違っているのか分かりません。
お願いします。
136デフォルトの名無しさん:2008/07/30(水) 02:17:57
どこから%bなんてでてきたんだ? unsignedを表示するのだから%uか%xか%oだろ。まぁ、%dでもいいけど。
137デフォルトの名無しさん:2008/07/30(水) 02:25:33
すいません。
ご指摘の通り「%b」がおかしかったみたいです。
自分で「%b」と書いていたので全て=の次がbとなってしまい悩んでいました。

もう一度最初から書き直したら見事に成功しました!
138デフォルトの名無しさん:2008/07/30(水) 09:37:39
っていうかこういうの書くとエラー吐くだろ
なんでそれを読んで解決しようとしないの?
ずっと人に聞きっぱなしだよそれじゃ
139デフォルトの名無しさん:2008/07/30(水) 10:10:07
>>138
残念、printf系のフォーマットを間違えた程度では警告レベルを高くしないと警告されない。
まして、言語的には何の問題もないのでエラーになりようがない。
140デフォルトの名無しさん:2008/07/30(水) 10:25:42
a&b の&bにつられて、それ以降%bになったかw
141デフォルトの名無しさん:2008/07/30(水) 11:01:34
すいません、誰か教えてください。
ウィンドウメッセージの送信元のウインドウハンドルを取得したいんですが、
どうすれば良いんでしょうか?
送信元のアプリは自分で作る訳ではないので、ウインドウメッセージ内にハンドルを格納する、というのは無理です。
自アプリに対して、誰がどのようなメッセージを送信してきているのかを把握したいんです。
Spy++等で受信しているメッセージは見れるんですが、送信元が分からないもんで・・・。
よろしくお願いいたします。
142デフォルトの名無しさん:2008/07/30(水) 11:06:58
どんな環境か知らんが、そりゃ無理だ。つーか、WindowsならAPIスレに行けば?
143デフォルトの名無しさん:2008/07/30(水) 11:17:33
そもそもウィンドウメッセージを受け取るのはウインドウだが
送信するのはウインドウとは限らない
144デフォルトの名無しさん:2008/07/30(水) 11:26:45
ウィンドウを作成しないプログラムからも、好きに送れるしな
145デフォルトの名無しさん:2008/07/30(水) 11:26:53
今時CでWindowsアプリを作る馬鹿でもないだろうから、どう見てもスレ違い棚。
146デフォルトの名無しさん:2008/07/30(水) 11:27:25
ウインドウメッセージの質問をしたものです。
やっぱり、無理なんですかねぇ。取得するのはプロセスIDでも構わないんです。
とにかく送信元が特定できれば問題ないです。
環境はWindowsXPです。
スレ違い、すいません・・・。
147デフォルトの名無しさん:2008/07/30(水) 11:30:02
スレ違いだから失せろというだけじゃなく、あっちのほうが解答も得られやすいから移動したらどうですかといってるんだよ
失せろ
148デフォルトの名無しさん:2008/07/30(水) 11:33:26
環境依存スレならスレチじゃないが
ここではどう考えてもスレチです
149デフォルトの名無しさん:2008/07/30(水) 16:17:38
if (expr) statement
みたいな書き方ってどういう意図が込められてるんですかね?
if (expr)
    statement
ではなくて。
150デフォルトの名無しさん:2008/07/30(水) 16:26:08
俺は横に書くぜ
俺は改行して書くぜ
俺はいつでも中括弧を付けて書くぜ
151デフォルトの名無しさん:2008/07/30(水) 16:31:07
その中括弧を付ける場所にもこだわりはあるしな。
152デフォルトの名無しさん:2008/07/30(水) 16:49:48
>>149
書かれている通りの意図だろうよ。
153デフォルトの名無しさん:2008/07/30(水) 16:59:15
>>149
逆に聞くけど、後者の書き方にはどんな意味がこめられてると思うわけ?
154デフォルトの名無しさん:2008/07/30(水) 17:08:14
>>149
読み手に与える印象を弱めるためだろう
statementが取るに足らない処理である場合そう書いたりする
155デフォルトの名無しさん:2008/07/30(水) 17:12:47
>>154
やはりそうですか。
156デフォルトの名無しさん:2008/07/30(水) 17:13:52
>>149
意図というより、人やコーディングルールによってどっちの書き方に決まっているように思う。
1人の人間が書いた1つのコードの中で両方の書き方が混ざっているのは見たことがない。
157デフォルトの名無しさん:2008/07/30(水) 17:20:41
ファイルポインタって規格ではどのような定義でしたかね?
158デフォルトの名無しさん:2008/07/30(水) 17:31:25
自分は1行で済むifでも中括弧付けるよ。
書く量を少なくする努力よりも、誤解を生まない書き方をする努力のほうが大事だと思うし。
159デフォルトの名無しさん:2008/07/30(水) 18:27:42
俺は同じ変数相手にして一行で処理が終わるものは
if(expr1) statment1
else if(expr2) statment2
...
って書いてる
もちろんタブで揃えて
160デフォルトの名無しさん:2008/07/30(水) 18:34:45
>>156
俺は混ぜて使う場合があるよ
ifのみで一行で済む場合は一行で書くが
後のelse節が複数行になる場合は合わせて改行する

まあ好みの問題
161デフォルトの名無しさん:2008/07/30(水) 18:40:07
continue/return/break は1行で済ませてた時期もありました。
162デフォルトの名無しさん:2008/07/30(水) 18:41:59
char s[80];の文字配列に文字列を代入したい場合。

sprintfとsscanfってどっちを使えばいいんでしょうか。
sprintf(s, "%d", a);
sscanf(s, "%d", a);
この2つってどっちも同じ気がしますが・・・

あと、\0は入りますか?
163デフォルトの名無しさん:2008/07/30(水) 18:43:53
>>162
その2つはぜんぜん違うよ!
「配列に文字列を入れる」だったらstrcpy()だよ!
164デフォルトの名無しさん:2008/07/30(水) 18:56:39
if(numが0.34の倍数でない時)
のような場合はどう書けばいいですか?
165デフォルトの名無しさん:2008/07/30(水) 19:00:46
>>163
strcpy(s, "%d", a)ってエラーになりませんか?
166デフォルトの名無しさん:2008/07/30(水) 19:03:00
>>165
一行目で御幣が生じたんだろう
167デフォルトの名無しさん:2008/07/30(水) 19:03:44
>>164
if (fmod(num, 0.34) != 0)
しかし誤差を考慮しないとあんまり嬉しくない結果になると思う
168デフォルトの名無しさん:2008/07/30(水) 19:06:28
>>162は突っ込みどころが多すぎるな
169デフォルトの名無しさん:2008/07/30(水) 19:18:05
>>165
整数を文字列に変換したいのと文字列を文字配列に入れるのとは違うってことだろ
170デフォルトの名無しさん:2008/07/30(水) 19:42:18
>>162,165
キミのやりたいことは何だ?

・整数aを文字列にして文字配列sに格納したい
・文字配列sに入っている数字を表現した文字列をスキャンして、整数変
数アドレスaの指す先に格納したい

前者がsprintf()、後者がsscanf()

171デフォルトの名無しさん:2008/07/30(水) 20:00:43
>164
ありがとうございます
if (fmod(num, 0.34) != 0)
{printf("numの倍数ではありません")
}
みたいなプログラム作ってみたんですけどnumに0.34入れても
"numの倍数ではありません"って出てきます。
なんでなんでしょう?

172デフォルトの名無しさん:2008/07/30(水) 20:02:22
10^12とかを表す記号って


10E12ですか?
173デフォルトの名無しさん:2008/07/30(水) 20:03:03
>>171
誤差を考慮しましょう。それから、レスの書き方のコツを身に着けましょう。
174デフォルトの名無しさん:2008/07/30(水) 20:03:51
>>172
1E12です
175デフォルトの名無しさん:2008/07/30(水) 20:03:58
>>172
いいえ、それは記号ではありません。
所謂指数表記では、1e12と書きます。
176デフォルトの名無しさん:2008/07/30(水) 20:04:35
>>173
>>175

どうも!
177デフォルトの名無しさん:2008/07/30(水) 20:05:29
printf("%d\n",1E12);

ってすると0が表示されるんですが・・・
178デフォルトの名無しさん:2008/07/30(水) 20:05:58
>>176
そのレス番は嫌味か?
179デフォルトの名無しさん:2008/07/30(水) 20:06:46
>>178
いえ、間違えました
180デフォルトの名無しさん:2008/07/30(水) 20:07:26
>>177
%dは整数型を表示するために使います。
181デフォルトの名無しさん:2008/07/30(水) 20:07:32
>>177
%f を使え
182デフォルトの名無しさん:2008/07/30(水) 20:08:32
寧ろ%gを使うべき。
183デフォルトの名無しさん:2008/07/30(水) 20:08:52
>>180
10^12は整数だと思ってたんですが、、実数型なんですね。
184デフォルトの名無しさん:2008/07/30(水) 21:05:48
今会社から帰ってきてチェックするの遅くなりました。

>>138さん 自分でエラーを確認したんですが問題の部分は表示されなくまったく気づきませんでした。
もちろん、このままでは成長できませんから次から気をつけます。

>>139さん>>140さん 警告レベルを高くすることなんて出来るんですね。
少しのミスでおかしくなってしまうのが悔しいですがバグを発見して正しくするのが楽しくて夢中になってしまいます。
初心者、上級者関係なく1回で完璧なプログラムを書けるひとっていないと思います。
自分も2・3回失敗しても腐らないように頑張りたいです。

ありがとうございました。
185デフォルトの名無しさん:2008/07/30(水) 22:16:53
>>183
指数表記を使って書かれた数の型は、
たとえ小数点を書かなかったとしても小数型になる。
1E2 → double 型
1E2f → float 型
186デフォルトの名無しさん:2008/07/30(水) 22:22:05
>>184
> 初心者、上級者関係なく1回で完璧なプログラムを書けるひとっていない
そだね。
プログラマは基本的にバグをつぶす日々を過ごしてる。
バグがなくなればその仕事終了だから、次の仕事のバグつぶす日々になる。

2,3回ぐらい気にしないことだよ
187デフォルトの名無しさん:2008/07/30(水) 22:37:37
300行くらいバーっと書いて一発でコンパイル通ってテストも通った時は歓喜した
188デフォルトの名無しさん:2008/07/30(水) 22:40:03
それはかなり嬉しいな
189デフォルトの名無しさん:2008/07/30(水) 22:53:50
十数行書いただけでコンパイルが一発で通る自信すらない
190デフォルトの名無しさん:2008/07/30(水) 22:56:49
俺は最近目視デバッグ能力を磨いてる
191デフォルトの名無しさん:2008/07/30(水) 23:22:50
int My_Cmp_double(const void* a , const void* b){

double *x, *y;

x = (double*) a;

y = (double*) b;



return y - x;
}

main(){
double data[10];

データ入れる処理

qsort(data, 10, sizeof(double), (int (*)(const void*, const void*))My_Cmp_double);


printf("ソート後\n");

for(i=0;i<10;i++){

printf("%lf\n",data[i]);
}

}

と書いたのですが、ソートされません・・・なぜでしょうか
192デフォルトの名無しさん:2008/07/30(水) 23:25:52
return *y - *x;
193デフォルトの名無しさん:2008/07/30(水) 23:26:57
すっごいどーでもいいけど%lfより%fのほうがどちらかというと正しいといえなくもない
194デフォルトの名無しさん:2008/07/30(水) 23:27:45
>>193
c99ならどっちでもいい。
どの規格に準拠するか書いてないからどうでもいい。
195デフォルトの名無しさん:2008/07/30(水) 23:27:50
あと、qsortでのキャストは不要。
そこのキャストを取り除くか、
逆にキャストはそのままでMy_Cmp_doubleを
int My_Cmp_double(const double* a , const double* b)にするかにしてしまえ。
196デフォルトの名無しさん:2008/07/30(水) 23:29:54

int My_Cmp_double(const void* a , const void* b){

double *x, *y;

x = (double*) a;

y = (double*) b;



return *y - *x;
}
qsort(data, 10, sizeof(double), My_Cmp_double);

ですか?
197デフォルトの名無しさん:2008/07/30(水) 23:30:19
>>195
だめです。嘘教えるのやめてください。
qsortに渡す関数はint(const void*,const void*)以外認められません。
198デフォルトの名無しさん:2008/07/30(水) 23:31:49
>>196でもダメでした


http://tct.ivory.ne.jp/text/prog/C/note/qsort.htm

のサイト参考にしたんですが、間違ってるんですかね?

199デフォルトの名無しさん:2008/07/30(水) 23:33:02
・doubleからintへの暗黙のキャストでは、単純に切り捨てが行なわれる。
仮にy - xが0.1でも0.9でも0になってしまい、同値と判断されてしまう。
・無駄なキャストは避けるべき
qsort()の第4引き数は、キャストの必要がなさそうに見える。
・そもそも型変換がおかしくないか?
const double * px = (const double *) aとして、double x = * pxとなる筈だが。
・同値性に誤差を許容すべき。
上の例で言えば、y - x < 1e8 ? -1 : y - x > -1e8 : 0とでもするのが無難かもしれない。
200デフォルトの名無しさん:2008/07/30(水) 23:34:41
intを返してないから?

return *y-*x;

if(*y-*x<0)return -1;
if(*y-*x>0))return 1;
return 0;
201デフォルトの名無しさん:2008/07/30(水) 23:35:15
>>198
そんな糞みたいな説明を読むからいけないんだ。
doubleの引き算だけでなく、longの場合も引き算ではダメだぞ。
202デフォルトの名無しさん:2008/07/30(水) 23:36:17
>>201
intの場合でもダメです。
203デフォルトの名無しさん:2008/07/30(水) 23:38:08
>>199
> 同値性に誤差を許容すべき。
並び順は適当でいいから入れ替え回数少なくしたいとかならわからんでもないが、
通常のソートが目的なら、それはおかしい。
204デフォルトの名無しさん:2008/07/30(水) 23:38:24
>>199
同値性の誤差って考える必要ある?
こういうソートの場合なら別に気にしなくても問題ないと思うんだけど。
205デフォルトの名無しさん:2008/07/30(水) 23:39:33
気にしなくていいなら、気にしなくていいんじゃない?
206デフォルトの名無しさん:2008/07/30(水) 23:39:49
int My_Cmp_double(const void *a, const void *b)
{
if (*(double *)a < *(double *)b) return 1;
else if (*(double *)a == *(double *)b) return 0;
else return -1;
}

qsort(data, 10, sizeof(double), My_Cmp_double);

こうっすかね?
207デフォルトの名無しさん:2008/07/30(水) 23:45:37
>>206
それは流石に。
同値性云々は置いておくとして、せめて不等号で判断しましょうよ。
# コンパイラが警告してくるし。
となると、こんなもん。
int compDoulbe(const void * a, const void * b)
{
double da = *(const double *) a;
double db = *(const double *) b;
return da < db ? 1 : da > db ? -1 : 0;
}
208デフォルトの名無しさん:2008/07/31(木) 00:25:44
typedef struct{

double a:
double b;

}HOGE;


という構造体を配列で宣言 HOGE hoge[256] するときにaだけを0に初期化したいんですが、どうやるんですか?
hoge[i].a = 0にするということです。
209デフォルトの名無しさん:2008/07/31(木) 00:29:21
>>208
なんでbもしないの?
210デフォルトの名無しさん:2008/07/31(木) 00:31:09
>>208
なんでbはしちゃダメなの?
211デフォルトの名無しさん:2008/07/31(木) 00:34:45
bはdoubleじゃなくてintでした。

bは0 1 2 3 4 5 6 ・・255って入れたいんです

hoge[0].b =0
hoge[1].b =1
ってかんじです
212デフォルトの名無しさん:2008/07/31(木) 00:36:14
普通にfor文でええんとちゃうの?

int i;
for(i=0;i<256;i++) {
hoge[i].a = 0;
hoge[i].b = i;
}
213デフォルトの名無しさん:2008/07/31(木) 00:37:36
宣言時にいっぺんにできたらなぁと思って


int count=0;とやるがごとく
214デフォルトの名無しさん:2008/07/31(木) 00:39:15
何回も初期化処理が呼ばれるならあれだが、起動時に1回だけでしょ?
たいしたコストじゃないよ
215デフォルトの名無しさん:2008/07/31(木) 00:41:52
それが何回も初期化しなおします。

多分40000万回とかします
216デフォルトの名無しさん:2008/07/31(木) 00:42:22
間違えました。40万回ですw
217デフォルトの名無しさん:2008/07/31(木) 00:44:22
>>216
ZeroMemory()
218デフォルトの名無しさん:2008/07/31(木) 00:47:41
bは必要なものなの?
219デフォルトの名無しさん:2008/07/31(木) 00:57:30
hoge[256]の初期化用配列作っといてmemcpy()でいいんじゃないの?
220デフォルトの名無しさん:2008/07/31(木) 00:58:43
fflushってなんで役に立たないのに存在するの
221デフォルトの名無しさん:2008/07/31(木) 01:01:00
>>219
賢い!!
222デフォルトの名無しさん:2008/07/31(木) 01:06:49
>>219
bも初期化されちゃわないか?
223デフォルトの名無しさん:2008/07/31(木) 01:09:23
>>222
ん?bも初期化したいんじゃないの?
>>211を読んでそう思ったんだが
224デフォルトの名無しさん:2008/07/31(木) 01:18:42
http://www.bohyoh.com/Books/TokinagaraC01/RSA01chap11.pdf
の一番下の答えを教えて下さい。
225デフォルトの名無しさん:2008/07/31(木) 01:25:34
>>197
後半は合ってるけどキャストは要らない。
C++だと要るけど。
226デフォルトの名無しさん:2008/07/31(木) 01:31:00
あるに越したことはない、と思う人と
余計なものをつけると見づらくなる、って人がいるよな
227デフォルトの名無しさん:2008/07/31(木) 01:31:51
警告出すコンパイラもあるから付けた方が無難ではある。
ただ、規格上は必要ない。
228デフォルトの名無しさん:2008/07/31(木) 01:38:12
>>224
文字列がNULLのとき
cがヌル文字のとき
229デフォルトの名無しさん:2008/07/31(木) 01:54:25
>>228
ありがとうございます、やっぱそれだけですかね?
>文字列がNULLのとき
これに関しては呼び出し元でチェックすべきだと思うし
>cがヌル文字のとき
これも微妙だと思ったんですよね。

変に考えすぎてるだけでしょうか?
230デフォルトの名無しさん:2008/07/31(木) 02:07:19
'A'と"A"の違いって何ですか?
231デフォルトの名無しさん:2008/07/31(木) 02:08:37
>>230
'A'は文字コード、値が入ってる。
"A"はアドレスが入ってる、後終端文字が後ろにくっつく
232デフォルトの名無しさん:2008/07/31(木) 02:08:46
符号の問題だと思うよ。
233デフォルトの名無しさん:2008/07/31(木) 02:09:22
>>232>>229
234デフォルトの名無しさん:2008/07/31(木) 02:14:38
>>232
あ、charって符号なし整数だと思ってました。
具体的にどういう入力の時に問題が起こるのでしょう?
235デフォルトの名無しさん:2008/07/31(木) 02:24:41
charがsignedかunsignedかは環境依存
236デフォルトの名無しさん:2008/07/31(木) 02:27:08
コンパイルオプションで変えれたりすることもあるしね。
237デフォルトの名無しさん:2008/07/31(木) 02:33:50
>>222
>>212を一回やって初期用エリアを作ってそこを毎回コピーすればいいんだろ?
238デフォルトの名無しさん:2008/07/31(木) 02:42:20
>>229
これ、ANSIのstrchr()と同じだろ?
だから、cがヌル文字だったとしても、ヌル文字チェックのif文通る前に *str != c を満たさずにループ抜けてヌル文字の位置のアドレス返すから問題ない
それよりは文字列の途中にヌル文字入ってたらそれ以降にcが入ってても見つからないっていうのを追加
"abc\0123"だと123は見つけられない、というか見つける術がない、というのはstrchr()も同じ

あと、大小比較じゃなくて等値の比較だから符号は関係ない気がする
signedかunsigned関係なくて、int c がcharの範囲を超えて与えられたらおかしくなる、ということならわかる
239デフォルトの名無しさん:2008/07/31(木) 02:47:19
>>220
なんで役に立たないと思ったのですか?
大変便利なのに。
240デフォルトの名無しさん:2008/07/31(木) 02:52:30
すまん
>>238の大小比較うんぬんは>>232宛だな
241デフォルトの名無しさん:2008/07/31(木) 02:54:51
>>229
コンピュータの電源を入れ忘れたとき。
242デフォルトの名無しさん:2008/07/31(木) 03:05:16
>>238
Cで「文字列」と言うとヌル文字までなんだから、
「途中にヌル文字が入っている」もの全体を文字列とは呼べない。
243デフォルトの名無しさん:2008/07/31(木) 08:15:42
多倍長での計算ってどうやって実装するんですか?
244デフォルトの名無しさん:2008/07/31(木) 08:31:48
>>242
指摘貰ったので改めて調べると、最初のヌル文字が現れるまでを文字列と呼ぶ、、、らしい
文字列リテラルは途中にヌル文字は含めてよい、文字列と文字列リテラルは別物、ということだったので、区別しなきゃいけないようだ
仕事では普通に使ってたので途中ヌル文字ありも文字列と呼んでたよ
指摘ありがとう

なので、"abc\0123"うんぬんは取り下げる
が、そうなると>>224の答えって何だ?NULLも文字列とは呼ばないけどどうなるんだろ?
なんか、「符号は関係ねー」って言ったのも自信なくなってきたorz
245デフォルトの名無しさん:2008/07/31(木) 09:46:16
>>218

aをキーにソートするので、それが何番目の奴だったか覚えておくのに必要です



bはずっと不変なんでいちいち初期化する手間ももったいないと思うんですが・・・どうしたらいいですか?


hoge[i].b=iはずっと変わりません。
246デフォルトの名無しさん:2008/07/31(木) 09:49:45
>>245
cでそういう構造を簡潔に初期化する手段は存在しない。
データ構造を変えて、
struct HOGE {
int a[MAX];
int b[MAX];
};
として、memset(hoge.a, 0, sizeof(int[MAX]));
とするくらいしかないな。
ていうか、hoge[i].b がつねに i なら、b要らなくね?
247デフォルトの名無しさん:2008/07/31(木) 09:53:53
hoge[0].a=10
hoge[1].a=2
hoge[2].a=3
hoge[3].a=5

ってあったとしたらこれをソートして

hoge[0].a=10
hoge[1].a=5
hoge[2].a=2
hoge[3].a=3

hoge[0].b=0
hoge[0].b=3
hoge[0].b=2
hoge[0].b=1

という感じにソート前の番号が必要なんですが・・・
248デフォルトの名無しさん:2008/07/31(木) 09:57:31
じゃあ
>hoge[i].b=iはずっと変わりません。
こういう嘘を書かないように。
249デフォルトの名無しさん:2008/07/31(木) 10:14:44
>>234
char が符号付きの環境だったら

str_char("\xFF", 0xFF);

とやっても NULL が返ってくる。

str_char("\xFF", '\xFF');

とやれば問題ないんだが、それでも

for(i=0; i<=0xFF; i++){
result[i] = str_char(str, i);
}

みたいなことをしようとするとハマる。
250デフォルトの名無しさん:2008/07/31(木) 10:26:36
>>223
スマン
毎回bが違う値になるのかと勘違いしてた
251デフォルトの名無しさん:2008/07/31(木) 12:08:46
>>245
ソートするなら構造体を並べ替えるんじゃなくてそのポインタを並べ替えるのがいいと思うよ
252デフォルトの名無しさん:2008/07/31(木) 12:08:52
for(i = 0; i < N; i++ ){

}
の中でif文をチェックし、真であればそれ以降のiからNまで処理Aをしたいときはどう書けばいいですか?
253デフォルトの名無しさん:2008/07/31(木) 12:09:48
fgetc()とfputc()は関数でgetc()とputc()はマクロと決まっているのですか/
254デフォルトの名無しさん:2008/07/31(木) 12:12:06
>>251
僕にはできそうにないです・・・
255デフォルトの名無しさん:2008/07/31(木) 12:12:25
>>252
こうしたいの?
for(i = 0; i < N; i++ ){
for( k=i; k<=N; k++ ){
A( k );
}
}
256デフォルトの名無しさん:2008/07/31(木) 12:14:50
putchar(ch)の戻り値をチェックしろと本に書いてあるのですけど
理由がよく分からないのですが。
別にチェックしなくてもいいですよね?
257デフォルトの名無しさん:2008/07/31(木) 12:17:23
標準出力がファイルにリダイレクトされてて、ディスクが満杯で書き込めないかもしれない
チェックする意味はある
エラーを無視するのは自由だが
258デフォルトの名無しさん:2008/07/31(木) 12:20:01
>>255
for(i = 0; i < N; i++ ){
 
 if(条件) ←1回真になったらそれ以降のiではチェックせずに Nまでdata[i]=0にする

っていう処理をしたいです
259デフォルトの名無しさん:2008/07/31(木) 12:23:19
>>258
こう?
for(i = 0; i < N; i++ ){
if(....)
break;
}
for( ; i < N; i++ ){
data[i]=0;
}
260デフォルトの名無しさん:2008/07/31(木) 12:41:14
それでいけそうですね。どうも
261デフォルトの名無しさん:2008/07/31(木) 13:11:18
初歩的なことなのですが、C言語ってどのようなことに使えるのでしょうか?
お願いします。
262デフォルトの名無しさん:2008/07/31(木) 13:11:50
ソフトウェアを作ることに使えます
263デフォルトの名無しさん:2008/07/31(木) 13:12:45
>>262
企業でしか使うことはないということでしょうか?
264デフォルトの名無しさん:2008/07/31(木) 13:16:56
個人の作ったソフトウェアが存在しないとでも?
265デフォルトの名無しさん:2008/07/31(木) 13:17:38
>263
そんなことはない
266デフォルトの名無しさん:2008/07/31(木) 13:21:54
>>264
>>265
個人ではどんなレベルのソフトウェアがつくれるのですか?
267デフォルトの名無しさん:2008/07/31(木) 13:22:15
>>266
ピンきりw
268デフォルトの名無しさん:2008/07/31(木) 13:22:23
>>266
個人のレベルによります
269デフォルトの名無しさん:2008/07/31(木) 13:24:43
>>267
>>268
では個人で作られた相当すごいソフトウェアには、例えばどのようなもののがあるんでしょうか?
270デフォルトの名無しさん:2008/07/31(木) 13:26:53
>>269
Linux
271デフォルトの名無しさん:2008/07/31(木) 13:29:20
>>270
もうちょっと身近なソフトでお願いします!
272デフォルトの名無しさん:2008/07/31(木) 13:33:31
>>271
WordやExcel
273デフォルトの名無しさん:2008/07/31(木) 13:34:27
>>272
えええ、あれも個人で作られたものなんですか!
ありがとうございます!!
274デフォルトの名無しさん:2008/07/31(木) 13:56:51
そりゃどこの会社の製品も究極的にはそこに勤める人間が作り上げたものに違いない。
275デフォルトの名無しさん:2008/07/31(木) 13:57:17
ひどい釣りだ
276デフォルトの名無しさん:2008/07/31(木) 14:12:56
テキストを1行ごとに読むと遅いのでバイナリーで読み込んだ後
プログラム内で処理する場合EOFって入ってます?

もしかして入ってないので最初にファイルのトータルサイズを調べておいて
それを超えないようにしないとだめ?
277デフォルトの名無しさん:2008/07/31(木) 14:25:12
そのバイナリーで読み込んだときに、読み込んだサイズわかるだろ?
278デフォルトの名無しさん:2008/07/31(木) 14:26:49
fread()の戻り値を見ろとしか
279デフォルトの名無しさん:2008/07/31(木) 14:27:21
>テキストを1行ごとに読むと遅いので
まずここを疑ってかかること
280デフォルトの名無しさん:2008/07/31(木) 14:32:45
>>276
EOFってのはファイルの中にあるものではない。
既にEOFに達しているのになお読もうとした時に読む関数が返す値。

テキストで読もうがバイナリで読もうが、読む速度が大きく違うとは思えないが。
281デフォルトの名無しさん:2008/07/31(木) 14:33:08
>>276
EOFってのはfgetc/getcが返す特殊な値であって、freadなどには関係ない。
282デフォルトの名無しさん:2008/07/31(木) 14:34:16
EOFはストリームからこれ以上文字が取り出せないことを示す信号であって
ファイルの末尾にEOFという文字がついているわけじゃない
(そもそもEOFは所謂1バイトの文字の範囲外かもしれない)
Cでファイルのサイズを知る汎用の解は読めるだけ読んでその数を数えることしかない
どうしても事前にサイズを知りたいなら環境依存の関数を使うこと
283デフォルトの名無しさん:2008/07/31(木) 14:36:09
昔はテキストファイルには ^Z ついてたからなー
284デフォルトの名無しさん:2008/07/31(木) 15:02:27
まあでもstdioのテキストモードで読み取りを行っている限り、
実際^Zは出てこなかっただろ、fgetcらが内部で適宜処理していたから。
285276:2008/07/31(木) 15:07:56
お騒がせしました。
構造体を読み込むための汎用関数がすでにあり汎用関数が読み込む
構造体は必ずヘッダも付いててサイズもわかるようになってたので
ファイルサイズを返さない仕様になっていたので横着してテキストの中身で
判断しようとしてましたorz

横着せず汎用関数を改造してサイズも返すようにしました。
286デフォルトの名無しさん:2008/07/31(木) 17:34:32
gets()って関数ってなんのためにあるんですかね?
プログラミングの学習を簡単にするためでしょうか?
287デフォルトの名無しさん:2008/07/31(木) 17:36:40
昔はそれでいいと思われていたから、だろうと思う。
288デフォルトの名無しさん:2008/07/31(木) 17:36:42
ダンディ坂野のため
289デフォルトの名無しさん:2008/07/31(木) 17:39:55
scanfが駄目っていう人が居るけど、getsと似たような理由ですかね?
290デフォルトの名無しさん:2008/07/31(木) 17:48:49
カーネルのバッファリングとライブラリのバッファリングって違うものなのですか?
291デフォルトの名無しさん:2008/07/31(木) 17:49:41
一番安全な入出力方はなんなの?
292デフォルトの名無しさん:2008/07/31(木) 17:50:43
getchar
293デフォルトの名無しさん:2008/07/31(木) 18:38:22
質問しすぎ
294デフォルトの名無しさん:2008/07/31(木) 20:02:01
>>289
そういう理由も含む
>>290
C言語的にはどうでもいいこと
>>291
構造的にバッファがあふれる可能性のあるfgets等を除けば
どれを使っても後はプログラムする人間の問題
295デフォルトの名無しさん:2008/07/31(木) 20:02:45
ミス
×fgets
○gets
296デフォルトの名無しさん:2008/08/01(金) 01:17:24
>>231
ありがとうございます

printf("%c",' ');
printf("%s"," ");
で2つともスペース1個出力できるんですか?
297デフォルトの名無しさん:2008/08/01(金) 01:24:01
はい。
どちらもputchar(' ')と同じ出力ですね。
298デフォルトの名無しさん:2008/08/01(金) 01:24:25
>>297
これはひどい
299デフォルトの名無しさん:2008/08/01(金) 01:27:32
>298
寝ろ
300デフォルトの名無しさん:2008/08/01(金) 01:31:38
puts(" ")は余計な改行がつくから要注意だ。
301デフォルトの名無しさん:2008/08/01(金) 02:13:46
>>298
これはひどい
302デフォルトの名無しさん:2008/08/01(金) 03:02:02
2^a を渡されたときaを求める方法で何かいい物はありませんか?
なるべくループやlogを使わない物がいいです
303デフォルトの名無しさん:2008/08/01(金) 03:05:13
>>302
http://pc11.2ch.net/test/read.cgi/tech/1158367586/
で聞くと、我先に答えが返ってきそうだな。
304デフォルトの名無しさん:2008/08/01(金) 03:06:04
switch(x){
  case 1:return 0;
305デフォルトの名無しさん:2008/08/01(金) 03:07:02
>>303
ありがとうございます。行ってみます
306デフォルトの名無しさん:2008/08/01(金) 03:07:23
>>302
4バイト整数なら高々32通り、switchで全部列挙しろ
307デフォルトの名無しさん:2008/08/01(金) 03:41:20
任意の構造体を引数として関数に渡す場合は
どうすればいいでしょう?
308デフォルトの名無しさん:2008/08/01(金) 04:14:32
struct A {...}

f(struct A a){...}
pf(struct A *a){...}

int main()
{
struct A ma;
...
f(ma);
pf(&ma);
...
}

お好きな方をどうぞ
309デフォルトの名無しさん:2008/08/01(金) 06:17:56
atoiってもしかしてマイナス符号付きは変換できません?
310デフォルトの名無しさん:2008/08/01(金) 08:04:29
いいえ、atou()ではなくてatoi()なので大丈夫です。
311デフォルトの名無しさん:2008/08/01(金) 10:19:44
CでCGIを作ろうとしているのですが、UTF-8で標準出力ってできないのでしょうか?
データとしてUTF-8の出力や変換は分かるのですが
標準出力となるとよく分からなくなってしまって…
312デフォルトの名無しさん:2008/08/01(金) 10:26:08
できるよ。
そんな疑問が出るような状況で先に進めるのかな?
313デフォルトの名無しさん:2008/08/01(金) 10:33:29
unicodeの違いから始めて事あるごとに躓き、正直自信なくしてます。
314デフォルトの名無しさん:2008/08/01(金) 10:40:52
>>311
なぜCで
webプログラムならPHPで十分だろ
315デフォルトの名無しさん:2008/08/01(金) 10:44:21
Shift_JISでCGIは既に作ってあり(お遊びですが)
unicodeに対応させようと思って色々イジってみてるんです。
316デフォルトの名無しさん:2008/08/01(金) 10:53:15
>>315
ふつーに文字列を、標準出力につっこめば、文字コードは関係なくそのまま出力されるんじゃないの?
317311:2008/08/01(金) 10:57:44
なにか変な勘違いをしていたようです。
データを突っ込めば勝手に解釈してくれますね。
ソースUTF-8にして"TEXT"出力しても文字化けするんで、
回りくどく、おかしなこと考え込んでました。
318デフォルトの名無しさん:2008/08/01(金) 11:05:37
標準入出力はバイナリも普通に扱える。つまりどんなバイトでもそのまま通る。
文字化けは、そのまま通ってきたバイト列を端末がどう扱うかの話。
319デフォルトの名無しさん:2008/08/01(金) 11:10:42
>通ってきたバイト列を端末がどう扱うかの話。
まさにこれで勘違いしてました。
320デフォルトの名無しさん:2008/08/01(金) 22:56:37
int型に''で囲んだ文字って代入できますよね?
変数に文字を代入するときって何故''で囲まないといけないんですか?
321デフォルトの名無しさん:2008/08/01(金) 22:57:51
x = y だけじゃ y が変数なのか文字なのかわからんだろ
322デフォルトの名無しさん:2008/08/01(金) 23:01:46
変数に代入する時以外でも常に ' ' で囲むぜ
323デフォルトの名無しさん:2008/08/01(金) 23:31:52
文字を''で囲むのではない
''で囲んだものが文字なのだ
324デフォルトの名無しさん:2008/08/02(土) 00:07:37
ジョースター卿乙
325デフォルトの名無しさん:2008/08/02(土) 00:43:40
文字列検索で発見位置をintで返す関数とcharで見つかった位置へのポインタを返す関数は
どういう場面で使い分けるものですか?理由もお願いします。
326デフォルトの名無しさん:2008/08/02(土) 00:49:11
同じ
327デフォルトの名無しさん:2008/08/02(土) 01:29:39
>>321
>>322
>>333
解りました
ありがとうございます
328デフォルトの名無しさん:2008/08/02(土) 01:32:15
文字定数('A'など)を格納するのは何故char型じゃないといけないんですか?
329デフォルトの名無しさん:2008/08/02(土) 01:32:58
(int)'A'
これでintにはいる・・・?
330デフォルトの名無しさん:2008/08/02(土) 01:35:23
整数型の何にでも入れられるけど
331デフォルトの名無しさん:2008/08/02(土) 01:36:48
>>329
キャストするまでもなくintだったような気がする。
332デフォルトの名無しさん:2008/08/02(土) 01:37:17
一体誰がchar型でないといけないと言ったのか

ちなみに文字定数はもともとint型(unsigned charに納まる範囲の数でしかないが)
333デフォルトの名無しさん:2008/08/02(土) 01:56:07
   1   2   3   4   5
  16  17  18  19   6
  15  24  25  20   7
  14  23  22  21   8
  13  12  11  10   9

こんな感じで表示するプログラムってどうやるんでしょうか?
334デフォルトの名無しさん:2008/08/02(土) 02:00:17
int main(){
puts(
"   1   2   3   4   5\n"
"  16  17  18  19   6\n"
"  15  24  25  20   7\n"
"  14  23  22  21   8\n"
"  13  12  11  10   9");
return 0;
}
335デフォルトの名無しさん:2008/08/02(土) 02:01:01
>>334
繰り返し使ってでした
336デフォルトの名無しさん:2008/08/02(土) 02:01:31
>>333
main()
{
puts("   1   2   3   4   5");
puts("  16  17  18  19   6");
puts("  15  24  25  20   7");
puts("  14  23  22  21   8");
puts("  13  12  11  10   9");
}
337デフォルトの名無しさん:2008/08/02(土) 02:02:02
>>332
初心者スレで紛らわしいこと書くな。
'\xFF'が正か負かは処理系依存(つーかコンパイラオプション次第)なんだから
わざわざ「unsigned」なんて付けずに「charに納まる範囲」でいいんだよ。
338デフォルトの名無しさん:2008/08/02(土) 02:13:43
charが8bitなのにメールでは7bitしか通らない事が疑問だった
339デフォルトの名無しさん:2008/08/02(土) 02:20:06
>>338
アスキーコードで見ると7Fまでで全部できるしね。
キャラクターコードと考えると8bitいる
340 ◆GSUbB.5FpA :2008/08/02(土) 03:52:12
>>333
#include <stdio.h>
#include <math.h>
#define WIDTH 5
#define HEIGHT 5
int i, j, k, y, x, dir, max_digit, digit;
int num[HEIGHT][WIDTH];
int main(void) {
    if(WIDTH <= 0 || HEIGHT <= 0) { return; }
    for (i = 0; i < HEIGHT; i++) { for (j = 0; j < WIDTH; j++) { num[i][j] = 0; } }
    y = x = dir = 0;
    for (i = 1; ; i++) {
        num[y][x] = i;
        switch (dir) {
            case 0: { x++; if (WIDTH <= x || num[y][x] != 0) { x--; dir = 1; y++; } break; }
            case 1: { y++; if (HEIGHT <= y || num[y][x] != 0) { y--; dir = 2; x--; } break; }
            case 2: { x--; if (x < 0 || num[y][x] != 0) { x++; dir = 3; y--; } break; }
            case 3: { y--; if (y < 0 || num[y][x] != 0) { y++; dir = 0; x++; } break; }
        }
        if (x < 0 || WIDTH <= x || y < 0 || HEIGHT <= y || num[y][x] != 0) { break; }
    }
    max_digit = (int)log10(WIDTH * HEIGHT);
    for (i = 0; i < HEIGHT; i++) {
        for (j = 0; j < WIDTH; j++) {
            digit = (int)log10(num[i][j]);
            for(k = 0; k < max_digit - digit + 1; k++) { putchar(' '); }
            printf("%d", num[i][j]);
        }
        putchar('\n');
    }
}
341デフォルトの名無しさん:2008/08/02(土) 04:07:44
>>333
マルチすんなゴミ
342デフォルトの名無しさん:2008/08/02(土) 07:16:57
int(floor(a))
としたときに、やはり丸め誤差をくらって、
数学的に期待した結果と返り値が1ずれることは想定すべきですか?

例えばa = 1.3だとして、
floor(a) => 0.99999999999999912341
int(floor(a)) => 0
になるような場合が起こってしまうのか、ということです。

実際にはa = 1.3の場合には、自分の環境ではこうなりませんが、
aが他の値のときにこのようなことが起こるかもしれません。
343デフォルトの名無しさん:2008/08/02(土) 07:47:35
>>342
ほぼすべての処理系において整数がずれることは無いと思われます
これは浮動小数点数の格納の仕方によるものです
344デフォルトの名無しさん:2008/08/02(土) 07:53:28
浮動小数は、整数値を誤差無く保持することができる(有効桁数内)。
これは、内部的に実数と2の乗数の形で保持しているため。

ただ、C言語の規格で保証されているかは知らん。
でも、組み込みを含めても、余程マイナーなものを除き
現行で浮動小数をIEEE754以外の形式で扱うコンパイラ(プロセッサ)は
まず無いと思うし、もしそれ以外の形式であったとしても
整数を正確に保持できないということは考えられない。
345デフォルトの名無しさん:2008/08/02(土) 08:01:50
mathematicaとかどうなってんだろう
346デフォルトの名無しさん:2008/08/02(土) 08:17:53
>>343-344
なるほど。気にしないことにします。
ありがとうございました。
色々ソースを読んでみても、特にみんな気にしていなさそうです。
347デフォルトの名無しさん:2008/08/02(土) 09:13:30
>>346
いいえ、float(IEEEでは4バイト)ではint(一般的に4バイト)より精度が低いので、全ての値を正しく保持できません。
そもそも、あなたは(int(floor(a))と書いているので)スレ違いです。
348デフォルトの名無しさん:2008/08/02(土) 09:15:46
え?
349デフォルトの名無しさん:2008/08/02(土) 09:22:21
>>340
ありがとう!よくわからない言葉あるので調べて使ってみますね!
>>341
ごめん
350デフォルトの名無しさん:2008/08/02(土) 09:23:29
>>347
確かにCには関数型キャストはない罠。でもま、趣旨からすればdoubleからの変換だからいいんでね?
351デフォルトの名無しさん:2008/08/02(土) 09:31:54
>>347
IEEEって何のことですか?
352デフォルトの名無しさん:2008/08/02(土) 09:35:03
>>351
http://ja.wikipedia.org/wiki/IEEE

日本ではJISなんてのもあるけどそれのアメリカ版

実際のところパソコン関連はかなりのものがIEEE関連だなあ

iLink -> IEEE1394a/b
とか無線LANもここの関連
353デフォルトの名無しさん:2008/08/02(土) 09:35:46
無線LANとfloatに何の関係があるんですか?
354デフォルトの名無しさん:2008/08/02(土) 09:37:42
355デフォルトの名無しさん:2008/08/02(土) 09:38:58
floatで保持できないとかC++はスレ違いとかいうくらいなら、
IEEEなんて曖昧なこと書かないでね。
ちゃんと>>344に書いてあるんだから。


と書いているのがわからないんですね。
356デフォルトの名無しさん:2008/08/02(土) 09:40:52
IEEEすら知らんような奴によく付き合えるよな
個人が理解できるまでみっちり教えるのは時給数千円の家庭教師の仕事だというのに
357デフォルトの名無しさん:2008/08/02(土) 09:41:58
面白すぎますよね。まったく。
358デフォルトの名無しさん:2008/08/02(土) 10:02:06
>>352
JISのアメリカ版と言えるのはANSIだ。
359デフォルトの名無しさん:2008/08/02(土) 10:25:24
つまりゲームのリプレイに使いにくいx86系FPUは滅びよと
360デフォルトの名無しさん:2008/08/02(土) 12:38:40
使いにくいものをわざわざ使う必要はないのだから、
滅びるのを待たずとも359が避けて通ればいいだけでは
361通りすがり:2008/08/02(土) 22:21:40
何で、結合した後の文字列が表示されないのでしょうか?

#define STR_LENGTH 256 /* 文字列長さの最大値 */
int main(void)
{
char buff1[STR_LENGTH] ="abc";
char buff2[STR_LENGTH] ="xyz";

printf("buff1 : %s\n", buff1);
printf("buff2 : %s\n", buff2);

ketugou(buff1,buff2);

return 0;
}
/* 文字列 s1 に s2 を連結する */
int ketugou(char *s1, char *s2)
{
if((strlen(s1) + strlen(s2)) <= STR_LENGTH)
{
while( *s1 ) /* 文字列終わりまで進める */
s1++;
while(((*s1++) = (*s2++)) != '\0') /* s1 の末尾に s2 を連結 */
;
printf("結合した文字列は、%s\n",s1);
}
else
{
printf("元の文字数が多すぎます\n");
}
return 0;
}
362デフォルトの名無しさん:2008/08/02(土) 22:24:36
>>361
それ実行するなよ。
363デフォルトの名無しさん:2008/08/02(土) 22:26:14
>>361
お知りに\0いれないと
364デフォルトの名無しさん:2008/08/02(土) 22:26:17
>>361
s1を文字列の終わりまで進めてるからs1を表示しても・・・
365デフォルトの名無しさん:2008/08/02(土) 22:26:54
>>361
*s1 が '\0' だから

puts(buff1);
なら表示される
366デフォルトの名無しさん:2008/08/02(土) 22:29:45
常にs1++が実行されるから\0をコピーしたさらに後まで行ってしまう
367365:2008/08/02(土) 22:31:47
>>365 は間違いですた
368デフォルトの名無しさん:2008/08/02(土) 22:32:45
あと文字列の長さチェックもおかしい

if((strlen(s1) + strlen(s2)) < STR_LENGTH)

だろ
369デフォルトの名無しさん:2008/08/02(土) 22:34:54
もしくはこうか
#define STR_LENGTH 255 /* 文字列長さの最大値 */
char buff1[STR_LENGTH+1] ="abc";
char buff2[STR_LENGTH+1] ="xyz";
370通りすがり:2008/08/02(土) 22:40:20
ketugou関数のなかで、結合した、文字列を表示させる処理を書くのは、
無理なんですかね?
371デフォルトの名無しさん:2008/08/02(土) 22:42:52
>>370
s1を大事にとっておけば可能
372通りすがり:2008/08/02(土) 22:50:05
>>371
const char *p = s1;
の1行が、必要なんですね。
373通りすがり:2008/08/02(土) 23:17:25
>>363,366
\0を入れる方法は、結合した長さを調べて、最後に\0を入れるでよいですか?
374デフォルトの名無しさん:2008/08/02(土) 23:17:35
>>372
関数に入った直後のs1をコピーしておけばいいだけ
375デフォルトの名無しさん:2008/08/03(日) 00:41:27
ketugou関数の中で表示しなければいいのに。
376デフォルトの名無しさん:2008/08/03(日) 01:31:03
2次元配列を受け取る関数で
int (*a)[3]

int *a[3]
って仮引数として同じ意味なんですか?
377デフォルトの名無しさん:2008/08/03(日) 01:57:50
前者は配列へのポインタを渡していますが、後者はポインタのポインタを渡しています。
378デフォルトの名無しさん:2008/08/03(日) 02:01:53
むしろなぜ同じ意味だと思うのか

int (*a)[3] は(*a)[3]がintだということで、*aがint[3]だということで、aはint[3]へのポインタだということ
int *a[3] は*a[3]がintだということで、a[3]がintへのポインタだということで、aはintへのポインタの配列だということ
ただし関数が実際に配列を受け取ることはないので、これは自動的に配列の先頭要素へのポインタつまりintへのポインタへのポインタになる
379デフォルトの名無しさん:2008/08/03(日) 08:16:35
ちがうのだとしたら、少なくともどちらかは2次元配列ではないということでしょうか。
380デフォルトの名無しさん:2008/08/03(日) 09:08:35
(*a)[3] にアクセスしちゃダメ><
型は確かに int だけど
381デフォルトの名無しさん:2008/08/03(日) 13:02:02
以前に見かけたことあるコードなんですが、確か
struct hoge{
double d;
int array[1];
};
みたいな構造体があったとき、配列arrayの要素数を動的に変化させるため
struct hoge *p = malloc(sizeof(struct hoge) + sizeof(int) * 9);
(こんな感じだったかな?)みたいなことをして、int array[10]として
使えるようにするようなコードがあったんですが、これって安全なのでしょうか?
けっこう常識的なテクニック?
382デフォルトの名無しさん:2008/08/03(日) 13:05:29
規格上はアウト。でも危険を承知でしばしば使う。
383デフォルトの名無しさん:2008/08/03(日) 13:06:55
だなあ
まあメモリは一応確保されてるので使えなくはないが
自分の担当でなくなった際に引継ぎできなければはまることもあるなあ。
自分で作っても時間がたつと忘れてたりするので。
384デフォルトの名無しさん:2008/08/03(日) 13:10:24
>>379
どちらもポインタであって二次元配列ではない
385デフォルトの名無しさん:2008/08/03(日) 13:18:35
int array[10]の部分ってpと何か関係あるんですか
386デフォルトの名無しさん:2008/08/03(日) 13:19:52
>>381ってどんな利点があるの?
構造体にポインタを持たせて普通にmallocしたほうがわかりやすくね?
387デフォルトの名無しさん:2008/08/03(日) 13:29:00
>>386
二回mallocを使うと管理領域も二つ分使われるんで、メモリも、スピードも>>381の書き方のほうが有利。
388デフォルトの名無しさん:2008/08/03(日) 13:34:12
C99では、>>381 みたいな書き方をスッキリかけるように機能追加されている。
http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
389デフォルトの名無しさん:2008/08/03(日) 13:36:14
>>387
今時そんなのどうでもいいと思うけどね。
390381:2008/08/03(日) 13:52:08
レスどうもです。
今はあんまり必要ないテクニックかもしれませんね。
391デフォルトの名無しさん:2008/08/03(日) 14:00:35
>>389
状況によるけどな。
392デフォルトの名無しさん:2008/08/03(日) 16:13:04
int a[2][3]
と宣言して
func(a,2)
と関数funcが呼び出されるとき
void func(int x[][3],int n)
void func(int *x[3] ,int n)
void func(int (*x)[3],int n)
ってどれも同じことを意味するんですか?
393デフォルトの名無しさん:2008/08/03(日) 16:19:14
>>392
二つが一緒
void func(int x[][3],int n)
void func(int (*x)[3],int n)

これは違う
void func(int *x[3] ,int n)
394デフォルトの名無しさん:2008/08/03(日) 19:46:39
お恥ずかしいのですが質問させてください。
自分は今等価演算子と非等価演算子を勉強しています。

/*演算子練習だよ*/

#include<stdio.h>

int main()
{
int a=10;

printf("aの値は%dです\n,a");
printf("a==10の値は%dです\n",a==10);
printf("a==20の値は%dです\n",a==20);
printf("a!=10の値は%dです\n",a!=10);
printf("a!=20の値は%dです\n",a!=20);

return 0;
}

をデパックすると
aの値は10です
a==10の値は1です
a==20の値は0です
a!=10の値は0です
a!=20の値は1です と表示されますが
真なら「1」偽なら「0」になることは理解できるのですが、「%d」の部分に代入するものが式の一番右にあるそれぞれのa==10とかですよね。
だとしたら全て当てはまるように思うんですが考え方が良く分かりません。
自分の拙い文章で分かりにくいと思いますがよろしくお願いします。
395デフォルトの名無しさん:2008/08/03(日) 19:53:38
?別におかしくないだろ
aが10かつ20なんて事はありえなくね?
396394:2008/08/03(日) 19:56:52
int で取り込んだのがa=10なのだから

a=20はおかしいってことですよね
397デフォルトの名無しさん:2008/08/03(日) 19:58:10
当てはまるって何が何に当てはまるんだ?
398デフォルトの名無しさん:2008/08/03(日) 20:02:52
a==10は1(真)
a==20は0(偽)
399デフォルトの名無しさん:2008/08/03(日) 20:05:12
すみません・・・。

自分で解決できました。
もし考え方がおかしかったら訂正お願いします・・・。

つまりa=10と最初に宣言したから
printf("a==20の値は%dです\n",a==20); →10==20の値は20です→間違ってるよ「0」
printf("a!=20の値は%dです\n",a!=20); →10==20の値は20です→右辺と左辺が等しくないから「1」

ということでしょうか?
400デフォルトの名無しさん:2008/08/03(日) 20:11:24
何を言ってるのかよく分からんな

a=10 としたんだったら
a==20 → 正しくないので 0
a!=20 → 正しいから 1

ってだけの話だろう
401デフォルトの名無しさん:2008/08/03(日) 20:14:20
あなたのお名前は?
aaaa
あなたの年齢は?
24

ようこそaaaaさん。
24歳ですね。

というようなプログラムを作りたいんですが、
年齢を入力する際、数字以外を入力したら

あなたのお名前は?
aaaa
あなたの年齢は?
bbb

bbbは年齢として入力できません。
あなたの年齢は?

となるようにしたいんですが、どういうふうに書けばいいんでしょうか?
Cを勉強し始めて2週間ぐらいなんですが、ちょっとつまづいています
誰か教えてください。。
402デフォルトの名無しさん:2008/08/03(日) 20:15:21
「==」という演算子は、比較をして等しいか等しくないかのどちらかを返す。等しいなら1、等しくないなら0。
「!=」という演算子は、比較をして等しいか等しくないかのどちらかを返す。等しいなら0、等しくないなら1。
そんだけ。

>>399
(多分)合ってる。
(「(多分)」なのは、私があなたの文章をあなたの意図通りに解釈してる自信がいまいち無いから)
403デフォルトの名無しさん:2008/08/03(日) 20:17:13
>>400さん
「!=」は正しくないときに「1」と猫にもわかるプログラミングには書いてあるのですが・・・

その式では10=20は正しいから「1」ということですよね?
どうして20であっているのでしょうか?
最初に「10」と宣言したはず
404デフォルトの名無しさん:2008/08/03(日) 20:22:06
>>402さんありがとうございます!
ノートに書いておきました・・・。
405デフォルトの名無しさん:2008/08/03(日) 20:23:50
またネコ科。
それはともかく、「!=」は「正しくない」ではなく、「等しくない」
だから、「10!=20」→「10と20は等しくない」→正しい→1
だな。
406デフォルトの名無しさん:2008/08/03(日) 20:26:57
>>401
「数字以外である」という条件を具体的に定め、それをソースコードで書く。

一文字目が0〜9の範囲内にあればヨシ(isdigit()使って)、でいいんじゃない?
先頭の0は許さないとか細かく条件をつけるなら、いちいちそれをソースで書くしかない。
407デフォルトの名無しさん:2008/08/03(日) 20:29:50
いつもお世話になっています・・・。

本と同じことを皆さんおっしゃっているんだとおもうのですが自分にはこちらのほうが理解しやすく利用させてもらっていますorz
自分の文がおかしく混乱させてしまってすみませんでした。
408デフォルトの名無しさん:2008/08/03(日) 20:32:04
>>401
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int inputNumber(const char * prompt, const char * errorFormat)
{
for (;;) {
printf("%s", prompt);
char buf[1000];
if (fgets(buf, sizeof(buf), stdin) == NULL) return 0;
char * rest;
int rtn = strtol(buf, & rest, 0);
if (rest != buf) return rtn;
char * lf = strrchr(buf, '\n');
if (lf != NULL) * lf = '\0';
printf(errorFormat, buf);
}
}

int main()
{
printf("%d歳ですね。", inputNumber("あなたの年齢は? ", "%sは年齢として入力できません。\n"));
return 0;
}

409デフォルトの名無しさん:2008/08/03(日) 20:58:05
>>394
まず根本的に、printfの%dは何かを代入するものではない
対応する引数の値を文字列に変換してその部分に表示するもの

この場合表示する値はa==10やa!=20という式が持つ値になる
410デフォルトの名無しさん:2008/08/03(日) 21:02:12
まず式が値を持つということからわかってないと思う
大抵の入門書じゃ説明しないけど
411デフォルトの名無しさん:2008/08/03(日) 21:12:49
いま「制御文」という章に入りました。
/*scan01.c*/
#include<stdio.h>

int main()
{
int seisu;

printf("整数値を入力してください-----");
scanf("%d",&seisu);
printf("あなたの入力した数値は%dですね\n",seisu);

return 0;
}

とすると
「数値を入力してください-----125
あなたの入力した数値は125ですね」
になるはずですが「数値を入力してください-------」になってしまいます。
どこから125という数値が出てきたのでしょうか?



412デフォルトの名無しさん:2008/08/03(日) 21:13:47
>>409さん>>410さんは独学でしょうか?
参考までに教えてください
413デフォルトの名無しさん:2008/08/03(日) 21:17:34
>>411
どこからきたのかは、その本(Webページ?)に書いてあると思いますよ
414デフォルトの名無しさん:2008/08/03(日) 21:19:59
>>411
あなたがキーボードから125と打ち込む。
415デフォルトの名無しさん:2008/08/03(日) 21:25:00
わかった!!

デパックして黒い画面のやつに数値を入れると「あなたの入力したす数値は○○ですね」
になるんですね。
この黒い画面をいじっていいのか分からなかったため理解できませんでした。
すみませんでした
416401:2008/08/03(日) 21:31:54
>>408
すいません難しすぎてわかりません。

あなたの年齢は?
24

24歳ですね。

あなたの年齢は?
bbb

bbbは年齢として入力できません。
あなたの年齢は?


の部分だけでかまいませんので
一番簡単なやり方で記述してもらえませんか
ホントすいません。。
417デフォルトの名無しさん:2008/08/03(日) 21:41:10
char bur[80], *end, *p;
int age;
printf("あなたの年齢は?"), fflush(stdout);
fgets(buf, sizeof buf, stdin);
if (p = rindex(buf, '¥n')) *p = '¥0';
if (p = rindex(buf, '¥r')) *p = '¥0';
age = strtol(buf, &end, 10);
if (!(*p && !*end)) {
printf("%sは年齢として入力できません。¥n");
}
else {
printf("%d犀ですね。¥n", age);
}
418417:2008/08/03(日) 21:42:24
すまん、酔っぱらっていて、これ大嘘。
419デフォルトの名無しさん:2008/08/03(日) 22:02:38
char *old;
int i, flag;

printf("あなたの年齢は?");
scanf("%s", old);
do {
  for(i = 0, flag = 0; i < strlen(old); i++){
    if(isdigit(old[i]) != 0){
      printf("%sは年齢として入力できません", old);
      flag = 1;
    }
  }
}while(flag == 1)

printf("%s歳ですね");
420デフォルトの名無しさん:2008/08/03(日) 22:04:50
m9(^Д^)プギャーーーッ
421デフォルトの名無しさん:2008/08/03(日) 22:05:36
C言語とJavaの違いを教えて下さい
お願いします
422デフォルトの名無しさん:2008/08/03(日) 22:12:20
>>393
ありがとうございます
今読んでる本(ぼうようのポインタの極意)には
void func(int *x[3],int n)
void func(int x[][3],int n)
が同じと書かれているんですが、これは誤植なのしょうか?
423デフォルトの名無しさん:2008/08/03(日) 22:13:32
>>421
Cはリッチーさんが作ったプログラミング言語で、
JavaはSunが作ったプログラミング言語。
424417:2008/08/03(日) 22:15:19
bosticじゃなくて?
425デフォルトの名無しさん:2008/08/03(日) 22:15:50
>>422
うん、間違ってるね
426デフォルトの名無しさん:2008/08/03(日) 22:16:49
漏れも幽霊のようになることと引き換えにC言語をマスターしたいです。
もながいします。
427デフォルトの名無しさん:2008/08/03(日) 22:18:02
>426
何をお願いしているのかをまず明確にしろ
428デフォルトの名無しさん:2008/08/03(日) 22:19:00
PCの電源切って電源コードで首吊ればなれると思うよ。
429デフォルトの名無しさん:2008/08/03(日) 22:19:13
>>412
基礎は師匠に学んだがだいたいは独学
CFAQが座右の書
430デフォルトの名無しさん:2008/08/03(日) 22:20:07
よいプログラマの条件は、くどいくらい厳密に物事を説明できることだ
431デフォルトの名無しさん:2008/08/03(日) 22:20:28
>>419
old の先は天国か地獄か
432デフォルトの名無しさん:2008/08/03(日) 22:33:04
>>430
C言語とJavaの違いを教えて下さい
お願いします
433417:2008/08/03(日) 22:41:59
C言語は、Javaより20年以上も前に設計された言語で、
俗に10年一昔というが、コンピュータの世界では3年一昔
というぐらい進歩しているので、Javaの登場までには
6世代分ぐらいの技術革新が起こっている、C言語など
Javaからみれば化石のようなもの、に思えるが、
じつはそうではなく、
434デフォルトの名無しさん:2008/08/03(日) 22:42:05
スレ違いです
435デフォルトの名無しさん:2008/08/03(日) 22:48:22
もう限界だー\(^o^)/
436デフォルトの名無しさん:2008/08/03(日) 23:35:15
>>401
/* >408で難しいなら、これだけでもいいんでない? */
int main()
{
for (;;) {
printf("あなたの年齢は? ");
/* もしバッファリングされて↑が見えないようならfflush(stdout)しておけばいい */
char buf[100];
if (fgets(buf, sizeof(buf), stdin) == NULL) {
printf("入力が閉じられたかエラーを起こしたので終了しときま\n");
return 1;
}
int age = atoi(buf); /* atoi()は0を変換結果が0でも、変換に失敗しても、0を返す */
if (age == 0) {
char * p = strrchr(buf, '\n'); /* fgets()で入力した文字列には改行文字がある筈なので探して、 */
if (p != NULL) * p = '\0'; /* 見つかったら、潰しておく */
printf("%sは入力として妥当ではありません。\n", buf);
}
}
printf("%d歳ですね。", age);
return 0;
}
437デフォルトの名無しさん:2008/08/03(日) 23:36:53
>>432
ぐぐれカス
438デフォルトの名無しさん:2008/08/04(月) 04:26:49
配列の要素数が1つ足りないのに気付かず
全てのコードを見直して所々いじったらさらに混乱し、
うんこして要素数を+1したら完璧に動きました
所要時間4時間・・・発狂しそうになりました、やっとこ就寝です 
ほんとうにありがとうございました
439デフォルトの名無しさん:2008/08/04(月) 05:11:06
誰かおきている方いらっしゃいますか?
自分は今
#include<stdio.h>
int main()
{
int age;
int is_seito; /*生徒なら1、そうでないなら0*/

printf("年齢を入力してくださいーーー");
scanf("%d",&age);
printf("「猫でも学園」の\n生徒さんですか(yes:1,no:0)---");
scanf("%d",&is_seito);

if (age<6){
printf("入場料は無料です\n");
}else if(is_seito==1){
printf("入場料は無料です\n");
}else{
printf("入場料は1000円です\n");
}
return 0;
}
のプログラムを書きましたが「else」「else if」の使い分けがよく分かりません。
どのようなものに使うのでしょうか?
整数なら「%d」
不動少数なら「%f」のように使い分けるものなのでしょうか?
440デフォルトの名無しさん:2008/08/04(月) 05:16:34
最初のif文の条件以外と言う条件 + さらに条件があればelse if
ないならelse

そのプログラムだと
「ageが6未満」(これがif文の条件)だと入場料は無料
elseだとそれ以外つまりageが6以上と言う事になるんだが
しかしそれにis_seitoが1だったらと言う条件をつけたいが為に
else ifを使ってる
441デフォルトの名無しさん:2008/08/04(月) 05:31:27
ごめんなさい。
頭がうまく回らなくって遅くなりました。
条件つきを書きたいとき「else if」を使うということですよね。

デパックしたら黒い画面が出てきますよね?
そのとき入力する項目は「else it」を使うと考えていればokでしょうか?
442デフォルトの名無しさん:2008/08/04(月) 05:36:08
ん?んん?何を言っているんだ?
入力受付はこのコードだと

printf("年齢を入力してくださいーーー");
scanf("%d",&age);    ←
printf("「猫でも学園」の\n生徒さんですか(yes:1,no:0)---");
scanf("%d",&is_seito);  ←

の二箇所だぞ?
この部分にelseも何も関係ないだろ
443デフォルトの名無しさん:2008/08/04(月) 05:36:37
>>441
俺にエスパーが足りないせいか後半部分の意味が理解できない
444デフォルトの名無しさん:2008/08/04(月) 05:38:25
すみません;;;

>>440さんの「最初のif文の条件以外と言う条件 + さらに条件があればelse if
ないならelse 」

これが一番簡潔で一番分かりやすい考え方ですよね。
445デフォルトの名無しさん:2008/08/04(月) 05:40:39
>>441
デバッグというかコンソールアプリなんで実行したら
コンソールがでただけでしょ。

else it
じゃなくて
else if ね

で、いいたいことはわかった。
寝起きはエスパーになれる?

つまり
446445:2008/08/04(月) 05:41:10
これと

#include<stdio.h>
int main()
{
    int age;
    int is_seito; /*生徒なら1、そうでないなら0*/

    printf("年齢を入力してくださいーーー");
    scanf("%d",&age);
    printf("「猫でも学園」の\n生徒さんですか(yes:1,no:0)---");
    scanf("%d",&is_seito);

    if (age<6){
        printf("入場料は無料です\n");
    } else if(is_seito==1){
        printf("入場料は無料です\n");
    } else{
        printf("入場料は1000円です\n");
    }
    return 0;
}
447445:2008/08/04(月) 05:41:41
これは同じ

#include<stdio.h>
int main()
{
    int age;
    int is_seito; /*生徒なら1、そうでないなら0*/

    printf("年齢を入力してくださいーーー");
    scanf("%d",&age);
    printf("「猫でも学園」の\n生徒さんですか(yes:1,no:0)---");
    scanf("%d",&is_seito);

    if (age<6){
        printf("入場料は無料です\n");
    } else {
        if(is_seito==1){
            printf("入場料は無料です\n");
        } else {
            printf("入場料は1000円です\n");
        }
    }
    return 0;
}
448445:2008/08/04(月) 05:43:48
個人的にはelse ifは嫌いというか使わないんだよな。
449445:2008/08/04(月) 05:47:36
黒い画面がでたのはプログラムの種類がコンソールアプリなんで。

入力は>>442の書いてくれた部分が担当

else if は単なる書き方の問題。
450デフォルトの名無しさん:2008/08/04(月) 05:48:52
>>446-449
どう読めばそうなるのかは分からんが当たってたらおまえのエスパーはすごいって事だな。
>個人的にはelse ifは嫌いというか使わないんだよな
俺はインデントが不必要に深くなるのが嫌いだからelse if を使うけどな、まあ好みの問題か。
451デフォルトの名無しさん:2008/08/04(月) 05:50:01
何回もすみません。

条件ということは
・6歳未満でなくても「猫でも学園」の生徒なら無料
・6歳未満ではなく「猫でも学園」の生徒でもないときは1000円

上記は条件がある」という点では一緒ですよね。
だとしたら「else」「else if」を使うのは反対でokだと思ったので使うのを反対にしてみました(自分で解決しようと思ったので
するとエラーになってしまいました。
自分の考え方が1からおかしいでしょうか?

本当に朝から付き合ってくれてありがとうございます;;
452デフォルトの名無しさん:2008/08/04(月) 05:53:06
まあ、何でも良いけど条件別けする時に日本語でまず考えれば良いと思うよ

多分今回の話だと
「年齢が6歳未満」の場合入場料無料
「それ以外でも学園の生徒」の場合入場料無料
「それら以外」の場合は入場料1000円
と言うことになると思う

if文の構文自体が

if(条件1){
//処理1
} else if(条件2){
//処理2
} else {
//処理3
}

もし条件1に当てはまるならば処理1を実行
条件1には当てはまらないが条件2に当てはまるならば処理2を実行
上記の条件のどれにも当てはまらないなら処理3を実行

と言うものになってるからそのまま適応出来ることが分かると思う
あくまでelseは今まで出した条件以外と言う条件の時のみ使える
453デフォルトの名無しさん:2008/08/04(月) 05:55:02
>>451
今度は俺がエスパー
elseっていうのはその上にifがあり、かつそのifの下にまだelseがないときにしか使えない
これを理解してるか?
違ってたらソースをさらしてくれ
454デフォルトの名無しさん:2008/08/04(月) 05:56:15
>>452さん分かりました!!

そうかそうか!
言われた通りに処理をして区別したかったから「else」「else if」で分けていたんですね。
455デフォルトの名無しさん:2008/08/04(月) 05:57:33
つーかマジでelse if 使わないほうがいいんじゃね?

>>447のように記述したほうがいいきがする
456デフォルトの名無しさん:2008/08/04(月) 05:58:09
>>453さん 
自分理解していませんでした。
取りあえず触ってみる、プログラム書くことに重点を置いていたので
457453:2008/08/04(月) 06:04:08
>>456
いい姿勢だと思うよ、習うより慣れろっていうしね。
でも解決するときにきちんと理論を知っておかないと成長しづらいよ
>>455
さっきも書いたけど>>447の方法だと条件と処理の数が増えるとインデントが
深くなるから今回みたいに条件が少ない場合はいいけどしょうじゃないとき
極端に言えば100とか1000の時収集かなくないか?
まあこれ以上は宗教戦争になるから言わんが
458デフォルトの名無しさん:2008/08/04(月) 06:08:51
>>457
まあネストが極端に深くなる場合は関数化する必要があったりするので
それほど問題はないと思ってる。
これは個人的見解
459417:2008/08/04(月) 06:39:28
でも、これってどちらかといえば || の教材に使ってほしい。
else if の教材にするには、生徒のときには入場料を 300円ぐらいにしないと
else if を使う必然性が無い。
まあ、可哀想なのは、この教材で学ぶことで || ですむところをいつでも
else if を使うようになる学習者だけなのだが。
460デフォルトの名無しさん:2008/08/04(月) 06:44:55
>>459
アセンブラレベルだと大してかわらないんだけどな〜
461デフォルトの名無しさん:2008/08/04(月) 07:33:08
アセンブラほとんど分からんけど
if( (age<6) & (-is_seito) ) //&&じゃないよ
//無料
else
//有料
ってやったらちょっとは早くなる?
それとも遅くなる?ジャンプのコストってどんなもん?
これスレ違い?
462デフォルトの名無しさん:2008/08/04(月) 07:36:23
>>461
switch文書いても結局はif { ・・ } ・・else if
ってなるように

if { ・・・ || ・・・ } と書いてもアセンブラだと

結局条件分岐1条件分岐2と並ぶだけなので内情は変わらない。
463デフォルトの名無しさん:2008/08/04(月) 07:41:57
>>462
うん、それはそうなんだと思っていた、流れで聞いたからそういう意図だと思われても仕方ない
しかし>>461のifの中身をよく見てほしいこれなら比較は一回ですむはずなんだが余計な計算がいる、
ジャンプのコストがそれを超えるかが知りたいわけだ。でもスレ違いっぽい気がする。
464デフォルトの名無しさん:2008/08/04(月) 07:48:08
>>463
そのくらいのジャンプコストは誤差の範囲
ジャンプ命令はそれほどでもないしね。
Z80はコストの少ない相対ジャンプは+-128くらいだったかな・・・?
まあ最近のプロセッサはそんなの関係ないんだろうけど。

むしろ関数をインライン展開しない場合はたぶんコール命令になるから
そっちのほうがコストは多い。

で、結論から言うとせっかくCで書くんだからわかりやすく書けw
|| とか &&で混乱するくらいならif文の条件判定をわけるとかさ・・・
465463:2008/08/04(月) 07:53:04
と思ったらifの中身間違えた
(age<6) | (-is_seito)こうだな
466デフォルトの名無しさん:2008/08/04(月) 07:58:59
>>464
生半可な知識はいかがなものかと。
Z80では条件絶対ジャンプは10クロック、条件相対ジャンプは12クロックなので相対ジャンプの方が高コストということになる。

>>463
x86では条件分岐を使わずとも条件で値をセットすることもできるし、ビット演算のほうが速いとは言い切れない。
その周辺のロジックと併せて広範囲に最適化が行なわれるしね。

まぁ、ビット演算持ち出すならちゃんと実測してくれと。
467463:2008/08/04(月) 08:02:29
>>464
そうなんだ、条件分岐とかのジャンプはコストたかいイメージ有ったわ
そうだね、せっかく高級言語だからわざわざ可読性落とすなってことだね。
468デフォルトの名無しさん:2008/08/04(月) 08:05:13
でもやっぱりC言語自体はアセンブラより書きやすくなったとは
いえマニアックさでいえばアセンブラと大してかわらないよな。

C言語でバリバリ書く人はどんどんマニアックな記述になるし(注:後発の言語比ね)
469デフォルトの名無しさん:2008/08/04(月) 08:10:05
>>468
そうでもない。どんどんマニアックになってその傾向が止まらないのは趣味でやっているか他人を慮らずに仕事をしている所為。
仕事で可読性や保守性を意識していると、大体一定のレベルでその傾向が止まる。
470デフォルトの名無しさん:2008/08/04(月) 08:12:44
C言語の ? (演算子でしたっけ?)あれも・・・
471デフォルトの名無しさん:2008/08/04(月) 08:14:22
C99準拠のコンパイラってあるの?
VC++みたいなC++と同居してるコンパイラの場合、上位互換維持するために
C99なんて実装してらんないんじゃないか?
472デフォルトの名無しさん:2008/08/04(月) 08:17:28
>>471
沢山あるよ。Windowsで動く身近な例では、gccとかiccとか。
殊にiccはVisualStudioのプラグインとして使うことを想定しているから、
生半可なプログラマがc90とc99とc++を混同していると割とはまれるw
473デフォルトの名無しさん:2008/08/04(月) 08:17:36
ちょっと乗り遅れた感はあるが。。。
あくまでも入門篇のスレなんだからトリッキーな方法は推奨しない方が。
書籍見れば&は「ビット単位の論理積」、|は「ビット単位の論理和」って書いてあるだろうから。

(age<6) | (-is_seito)と(age<6) || (-is_seito)は結果は同じでも副作用が違うというのを認識してればいいのかもしれないけど、|、||、&、&&が混じったときの可読性を下げる方が罪。
条件分岐のコストを話題にするのに計算のコストが話題に出ないのは話の流れ上仕方ないかもしれないけど、||で書けば比較結果のフラグを待避する必要がないのに|だと必ず待避させなければいけない。
ここまで言及して「|で繋ぐのはどうよ?」となる方が話としては自然だと思う。
474デフォルトの名無しさん:2008/08/04(月) 08:25:57
それよりも「本を読めるようになれ」というのが一番近道かと
475デフォルトの名無しさん:2008/08/04(月) 08:37:35
|| を | に変えて可読性下げるくらいなら別のもっと時間のかかる処理を短縮させた方がいいな
476デフォルトの名無しさん:2008/08/04(月) 09:17:24
わざわざ短絡じゃなくすのもな
477デフォルトの名無しさん:2008/08/04(月) 09:54:14
猫でもわかるって本当ですか?
478デフォルトの名無しさん:2008/08/04(月) 10:16:50
確率がどーたらいう最適化なかったかけ?
分岐で
479デフォルトの名無しさん:2008/08/04(月) 10:31:01
>>478
入門篇で扱うような話じゃないので、最適化スレなり適当なスレへどうぞ。
つーか、その辺りも先ずは可読性重視でOK。
480デフォルトの名無しさん:2008/08/04(月) 12:04:26
>>478
会社のお昼なので携帯から失礼します。猫にも分かるなら自分にも分かるだろうと思っていましたが出来ません。
481デフォルトの名無しさん:2008/08/04(月) 12:09:55
>>477
うちの猫を見る限り
不可能と考えるべきでしょう

苦沙弥先生の猫なら別でしょうが
482デフォルトの名無しさん:2008/08/04(月) 12:13:15
論理的帰結:猫より劣っていた
483デフォルトの名無しさん:2008/08/04(月) 13:03:55
猫でもわかるという言いまわしは、暗に猫の知能を低く見ていると言っているようなものであり
動物愛護団体は猫を差別から守るために、これに対して断固講義していくべきだ
484デフォルトの名無しさん:2008/08/04(月) 13:15:13
分かるというのは口先だけのこと
人間でもよくある事
分かるといいながら(ry
485デフォルトの名無しさん:2008/08/04(月) 13:21:29
とりあえず誰もelse if節というものは存在しなくてelse節にif節を入れているだけだと説明しないのはどうかと思う
486デフォルトの名無しさん:2008/08/04(月) 13:23:47
>>485
VBとかほかの言語でelseif ってくっついてるのなかったっけ?
そういうの見てるとなんとなく本来は別なんだけどセットのように
見えて実際そう思ってる人もいそう。
487デフォルトの名無しさん:2008/08/04(月) 13:25:15
むしろ同じprintf文を2回書くか書かないかは大違いだろうがって
誰も>>460に突っこまないほうが問題だと思う
488デフォルトの名無しさん:2008/08/04(月) 13:27:21
このスレで事あるごとにアセンブラがどうこう言い出すやつは大抵どこかズレてる
489デフォルトの名無しさん:2008/08/04(月) 18:30:23
すでに特許取ってあるコードを、まったくそれに関連する知識なしに自力で到達しても特許料払わないと使っちゃだめなの?
490デフォルトの名無しさん:2008/08/04(月) 18:36:22
>>489
日本語でOK。
自分が特許とったコードなら払う必要なんて当然ないんだが。
491デフォルトの名無しさん:2008/08/04(月) 18:41:04
言いたいことは、何も参照せず自分の完全オリジナルで
書いたコードが偶々既に特許が取られてあるコードと被った場合
の扱いについてと言うことだと思うがそれってC言語関係ないよな
492デフォルトの名無しさん:2008/08/04(月) 18:53:07
この板の話題でもないよな
493デフォルトの名無しさん:2008/08/04(月) 20:16:53
C言語とJavaの違いを教えて下さい
お願いします
494デフォルトの名無しさん:2008/08/04(月) 20:19:19
あんま違わないんじゃね
495デフォルトの名無しさん:2008/08/04(月) 20:21:40
名前が違う。あとは・・・まぁ、いろいろだな
496デフォルトの名無しさん:2008/08/04(月) 20:27:28
コードは特許をとるものではない。特許とは発明。特許をとるのはアルゴリズム。

ソースコードを保護するのは著作権。
本当に他人のソースをパクっていないなら著作権侵害にならない。
パクっていないことの証拠として開発中の状況等を細かく残すなどが
過去コンパチ機の開発で行われた。
497デフォルトの名無しさん:2008/08/04(月) 20:28:27
498デフォルトの名無しさん:2008/08/04(月) 20:35:45
>>493
制御ステートメントはだいたい一緒
あとは、色々違う。
あ、あとJAVAにはポインタ無い、参照渡しになる
499デフォルトの名無しさん:2008/08/04(月) 20:47:32
参照と参照渡しを混同してる奴しねよ
500デフォルトの名無しさん:2008/08/04(月) 21:32:09
C++とならまだしもCとJAVAの違いを聞くなんて
犬と猫の違いを聞くようなものだ
501デフォルトの名無しさん:2008/08/04(月) 21:38:02
if 〜do〜
else〜do〜
って文は作れないの?
エラーになってしまう。
502デフォルトの名無しさん:2008/08/04(月) 21:40:09
>>501
たぶん単純な文法エラー
503デフォルトの名無しさん:2008/08/04(月) 21:46:17
もっと具体的にC言語とJavaの違いを教えて下さい
お願いします
504デフォルトの名無しさん:2008/08/04(月) 21:53:21
いやです
505デフォルトの名無しさん:2008/08/04(月) 21:55:57
ゴキブリのような容姿の奴って実在するよなw

こいつ触覚つけたらゴキブリじゃんwって奴、いやマジで。
506デフォルトの名無しさん:2008/08/04(月) 22:23:14
わかりません><
507デフォルトの名無しさん:2008/08/04(月) 22:28:49
>>503
C
Java
見るからに違う
C は視力検査でも使われるほど汎用的
508デフォルトの名無しさん:2008/08/04(月) 22:29:58
C::¥>javac hoge.c

hoge.c line(1)
ERROR1371:禁止されている文字です。
#include
^

C:¥>cl hoge.java

hoge.java line 1
ERROR D2345 無効な識別子です
import java.io.*;
^

こんな感じかな
509デフォルトの名無しさん:2008/08/04(月) 22:30:29
>>507
ん〜・・・右・・・
510デフォルトの名無しさん:2008/08/04(月) 22:41:36
ランドルト環はCとは違うだろw
511デフォルトの名無しさん:2008/08/04(月) 22:56:14
もし本当に君がCとJavaの違いがわからないのなら
まずPCを窓から投げ捨てて小学校からやり直すことをお勧めする
512デフォルトの名無しさん:2008/08/04(月) 23:01:17
>>511
言い過ぎだろ
単純にCを学んで
JAVA学べば
おのずとわかってくるもんだろ
513デフォルトの名無しさん:2008/08/04(月) 23:20:32
             ◎   ◎
                ◎   ◎        へ
                     ◎     /∇ )
                       ◎  く/  //
  Σ>8  - - -              ◎⊃  //
     Θ  - - -              (_ ∠(
       Θ  - - -        ============
         Θ  - - -
514デフォルトの名無しさん:2008/08/05(火) 03:15:47
>>513
可愛い…
515デフォルトの名無しさん:2008/08/05(火) 07:11:34
結局お前ら答えられないんだな
516デフォルトの名無しさん:2008/08/05(火) 07:39:18
俺らの間違いじゃないの?
517デフォルトの名無しさん:2008/08/05(火) 07:57:12
何を答えてもらっても分からないだけだろ
518デフォルトの名無しさん:2008/08/05(火) 10:46:05
CとJavaの違いなんか挙げていったらキリないわ
それほどまでに違うものをどこが違うかとか聞くのは釣りかバカかキチガイのどれか
519デフォルトの名無しさん:2008/08/05(火) 11:24:52
if (xxxx) {
char* hoge;
処理a
} else {
short* hoge;
処理b
}

これと同じことをswitchのcaseの中で実現する場合はどうすればいいんでしょうか?
520519:2008/08/05(火) 11:25:54
あーすみませんorz
これというのは確保する名称は同じですが、ポインターの型を変えたい場合です。
521デフォルトの名無しさん:2008/08/05(火) 11:27:22
>>519
変数をローカルに宣言したいってこと?
それならこんな感じで。
switch (xxxx) {
case ...:
{
char* hoge;
処理a
}
break;
case ...:
{
short* hoge;
処理b
}
break;
default:
break;
}
522519:2008/08/05(火) 11:28:54
>>521
そうです。

あーたまにネットとかで見るソースに前にif文がないのに
{ }で囲ってるのはそういう意味があるんですね。
523デフォルトの名無しさん:2008/08/05(火) 11:35:15
>>522
C99やC++だと途中で宣言できるけどC90だとできないから、
客先の要望でダウングレードするときなんかは常套手段。
C++でも、デストラクタの呼ばれるタイミングを調整するために使ったりもする。
524519:2008/08/05(火) 11:39:36
そうなんですか〜

コンパイラがC99とかC90までとかの対応状況って明確に確認する方法ってありますかね?

まあ書いてコンパイルしてみればいいってのもありますけど、
説明する際の根拠としてはあいまいすぎるのでw
525デフォルトの名無しさん:2008/08/05(火) 11:44:08
こんな程度の奴にCのコード触って欲しくない・・・・
頼むからjavaかVBで書いててくれ。
526デフォルトの名無しさん:2008/08/05(火) 11:44:58
>>524
C99とか見たことない
Cではブロックの先頭でしか宣言しない
for内でも宣言しないようにしてる
527デフォルトの名無しさん:2008/08/05(火) 11:50:28
たとえ途中で宣言できても、switch文の中はまた違うだろ
528デフォルトの名無しさん:2008/08/05(火) 11:52:21
>>526
こういう旧弊に囚われている人が如何に多いか……
まさかとは思うのですが、C++でも数百行にも亘る関数の先頭でしか関数を宣言しないタイプじゃありませんよね?

>>524
C99の変更点については取り敢えずこの辺でどうだろ。
ttp://seclan.dll.jp/c99d/
7章の辺りに文法一般の変更点が書かれている。
529デフォルトの名無しさん:2008/08/05(火) 11:53:50
ループの中で毎回宣言はあほみたいだけど
switchの中は場合によってはありなんじゃね?

C->C#->Cって戻ってくるとなんとなくだけどそう思うわ。
極力使う段階で用意してってことで
530デフォルトの名無しさん:2008/08/05(火) 11:56:59
>>527
そうそう、それを書いておくのを忘れていた。
switchやgotoによるジャンプで宣言部を飛び越すのは巧くないので、
ラベルの先で宣言したいときはブロック化しないといけなくなってしまうね。

流石にこんなコードは見たくも書きたくもない。
switch (foo) {
int bar;
case 'a':
func(& bar);
otherFunc(bar);
break;
default:
func2(& bar);
otherFunc(bar);
break;
}
531デフォルトの名無しさん:2008/08/05(火) 12:03:16
switch (foo) {
int bar;      //ここに書けることをはじめて知りました!!!!www
case 'a':
func(& bar);
otherFunc(bar);
break;
default:
func2(& bar);
otherFunc(bar);
break;
}
532デフォルトの名無しさん:2008/08/05(火) 12:09:26
for(;;);が無限ループになるのはfor文独自の定義ですか?
それとも空文が真と判定されてるからですか?
一般にfor文の外でも;は0以外の値が返るのですか?
for文をif文とgoto文であらわそうと思ってるのですが空文のときがあらわせません
空文というかfor文内の;はfor文の一部なので空文とはいわないかもしれませんが
どう解釈すればいいのか教えてください
533デフォルトの名無しさん:2008/08/05(火) 12:11:44
>>532
特別措置です
534デフォルトの名無しさん:2008/08/05(火) 12:14:52
>>533
ありがとうございます。
535デフォルトの名無しさん:2008/08/05(火) 12:17:40
>>532
古いCではその特別措置がないこともあったので、無限ループはwhile (1)を使うのが一般的でした。
ansiで特別措置ができたお蔭で、コンパイラの警告を無視することなくfor (;;)を使えるようになったのです。
536526:2008/08/05(火) 12:44:13
>>528
関数の先頭じゃなくてブロックの先頭ね
数百行の関数とか書いたことないけど
537528:2008/08/05(火) 12:50:29
おっと、for内では云々からミスリードしたみたい。失敬。

いやさ、いるのよ。数百行の関数の、先頭数十行が変数宣言だけってコードを書く人が。
538デフォルトの名無しさん:2008/08/05(火) 12:52:30
関数が数百行になっちゃう人ってどうなのよ?
きっとほぼ同じような処理を関数にせずに、いろんな所にハードコーディングしてるんだろうな。
または、処理を何十個も詰め込んでるとか。関数の意味ないよね。
539デフォルトの名無しさん:2008/08/05(火) 12:52:43
数百行ってw
もっと細かくすればいいのに
540デフォルトの名無しさん:2008/08/05(火) 12:59:26
ウィンドウプロシージャとか余裕で百行くらい超えてしまうけど・・・
あれどうすればいい?
541デフォルトの名無しさん:2008/08/05(火) 13:08:32
1万行の関数に泣かされたやつはさすがに少ないか
なんで分けないんだろうね?
542デフォルトの名無しさん:2008/08/05(火) 13:10:29
for(;;)が許される理由
特別措置でも何でもない。
ループ継続条件があり、それが偽でない限りループが継続
するように標準化された為。
それまではループ継続条件が無い場合はループ終了になるかならないかは
処理系依存であった。
543デフォルトの名無しさん:2008/08/05(火) 13:14:35
while(1)は中に1(真)を入れるのになんで
for(;;)は何も入れてないのに無限ループになるの?
for(;;)が許されるならwhile()も許されるんじゃないの?
544528:2008/08/05(火) 13:26:11
実測してみた。

関数の実行数:217

インデントレベル:0  1   2   3   4   5   6   7   8  9
行数        :4 23  60 39  25  11 11  18 12  2

インデントレベル0は{}の他にラベルがある。
従って、本来のトップレベルはインデントレベル1の23行だけ。
インデントレベル9まであったのは流石に魂消た。

もう一例。

関数の実行数:482

インデントレベル:0   1   2  3  4
行数        :22 227 114 29 37

こっちはインデントは深くないものの#if / #endifが沢山。有効な行数は3/4くらいかな。
だらだら書いている所為で、トップレベルが227行もある。
545デフォルトの名無しさん:2008/08/05(火) 13:27:45
>>543
それこそが、特別措置。forの場合のみ、空にすることが認められていてその場合に真と言うことになっている。
546デフォルトの名無しさん:2008/08/05(火) 13:34:17
for()じゃなく
for{ }と書けば理解し易いかな
for{A;B;C} statement;は
次のコードが書かれているかのごとく扱うって感じ

A;
do{
statement;
C;
if(!B) break;
}while(1);
547デフォルトの名無しさん:2008/08/05(火) 13:52:40
>>546
A;
do{
statement;
C;

<Bが空でない場合>
if(!B) break;

}while(1);

やっぱり特別措置じゃん。
548デフォルトの名無しさん:2008/08/05(火) 14:21:04
だから特別措置だっていってるじゃん
549デフォルトの名無しさん:2008/08/05(火) 14:26:47
>>541
夢中になって作って、改訂することもなく、下手に触ると動かなくなるから。
要するに、スキルが低いからだわな。
550デフォルトの名無しさん:2008/08/05(火) 14:28:52
ウィンドウプロシージャはどうしようもないじゃんとか前も話に出てたな
551デフォルトの名無しさん:2008/08/05(火) 14:35:02
まあ switch - case はどうしても長くなるけど、
ウインドウプロシージャは個別にハンドルする関数にしてる場合が多いよね、
標準でマクロもあったくらいだし。(今もあるのか?)
552デフォルトの名無しさん:2008/08/05(火) 15:29:28
sizeof()って、コンパイル時にサイズ解釈してるの?

int a;
a = sizeof(int);

これは、
int a;
a = 4;
に、置き換わってるという事でOK?
(intが4byteの時)

なんか、関数に見せかけて、関数じゃないのかな・・・?
553デフォルトの名無しさん:2008/08/05(火) 15:31:16
>>552
そそ。
コンパイル時にサイズを計算して数字に置き換わってる
554デフォルトの名無しさん:2008/08/05(火) 15:31:47
関数じゃなくてマクロね
555デフォルトの名無しさん:2008/08/05(火) 15:32:39
どっちでもねーよ演算子だぼけ
ついでにカッコも要らん
556デフォルトの名無しさん:2008/08/05(火) 15:38:37
373 :デフォルトの名無しさん [] :2008/08/05(火) 15:38:04
Pythonスレの荒らし、俺の予想
2007年 6月 2ちゃんねるを本格的に始める
     6月 過去ログが見れないことに腹を立て●を購入
     12月 VIP初体験
2008年 8月3日 IDが簡単に変更できることを知る
      同日 東方シリーズ総合スレッドを荒らす
8月4日 マクロを使って本格的に荒らす
  現在 ム板で個人的に気に入らないPythonをスレを潰しにかかる
557デフォルトの名無しさん:2008/08/05(火) 15:47:47
>>555
>>552の例だとカッコ必要じゃないか?
558デフォルトの名無しさん:2008/08/05(火) 15:50:27
* sizeofは演算子。
* オペランドは、式または括弧で括った型。
* C99だとsizeofは必ずしもコンパイル時には解決されない。
559デフォルトの名無しさん:2008/08/05(火) 16:01:14
可変長配列の長さをとったりだっけ?
560デフォルトの名無しさん:2008/08/05(火) 16:10:13
int a;

sizeof(int);
sizeof a;

括弧はこんな感じだろ
561デフォルトの名無しさん:2008/08/05(火) 16:18:30
C99以前でもべつにコンパイル時に解決されるって決まってるわけではないけどね
ほぼすべてのコンパイラがそうするってだけで
562デフォルトの名無しさん:2008/08/05(火) 17:00:08
あれ?じゃあ
char a[4];
char b[sizeof a];
とか不可?
563デフォルトの名無しさん:2008/08/05(火) 17:13:55
配列の宣言でサイズに変数を使うのは無理
564デフォルトの名無しさん:2008/08/05(火) 17:52:26
いやいや、これは [1 + 1] みたいなもんだ。
565デフォルトの名無しさん:2008/08/05(火) 18:12:52
データを読み込む際fopen freadを使っているのですが
これをできればwindowsでいうフックのような形で
すでにメモリに読み込んでいるデータをアクセスさせたい場合
なにか方法はありますでしょうか?
566デフォルトの名無しさん:2008/08/05(火) 18:26:21
ラップ関数を書く
567デフォルトの名無しさん:2008/08/05(火) 19:46:18
ソース書く前ってフローチャートとか作る?
俺はいきなりソース書くけど。
568デフォルトの名無しさん:2008/08/05(火) 19:59:54
>>563
いや>>589はc99の話してんだろ?
569デフォルトの名無しさん:2008/08/05(火) 20:02:15
589へのスルーパス?
570デフォルトの名無しさん:2008/08/05(火) 20:05:47
本人だろ
571デフォルトの名無しさん:2008/08/05(火) 20:07:42
int n1, n2;
int sum = 0;

printf("二つの整数を入力してください。\n");
printf("整数1:"); scanf("%d", &n1);
printf("整数2:"); scanf("%d", &n2);

if (n1 < n2)
printf("%dから%dの合計は", n1, n2);

do {

sum = sum + n1;
n1 = n1 + 1;

} while (n1 <= n2);

else
printf("%dから%dの合計は", n2, n1);

do {

sum = sum + n2;
n2 = n2 + 1;

} while (n2 <= n1);

printf("%dです。\n", sum);


整数n1とn2の小さい方の数から大きい方の数までの整数を全部足し合わせたものを求めるやつ作ろうとしてるんだが
エラーがでてうまくいかない。たすけてくれ。
572デフォルトの名無しさん:2008/08/05(火) 20:11:59
if else に {} 入れなさい
573デフォルトの名無しさん:2008/08/05(火) 20:13:01
ifとelseに{}が無い
574デフォルトの名無しさん:2008/08/05(火) 20:28:44
>>572-573
いれたら今度は「1 つ以上の複数回定義されているシンボルが見つかりました」って出てまたエラー
何がいけないんだろ・・・
575デフォルトの名無しさん:2008/08/05(火) 20:41:46
3000行を超えるif文はどうかと思う。
576デフォルトの名無しさん:2008/08/05(火) 21:02:04
そのままの書き方を尊重すると

if (n1 < n2) {
  printf("%dから%dの合計は", n1, n2);
  do {
    sum = sum + n1;
    n1 = n1 + 1;
  } while(n1 <= n2);
} else {
  printf("%dから%dの合計は", n2, n1);
  do {
    sum = sum + n2;
    n2 = n2 + 1;
  } while(n2 <= n1);
}

printf("%dです。\n", sum);

で普通にいけると思うんだが
577デフォルトの名無しさん:2008/08/05(火) 21:09:18
>>574
そのエラーに該当する部分はないので、コピペしてない部分に原因があると思われます
578デフォルトの名無しさん:2008/08/05(火) 21:12:50
>>576
Visual C++ 2008使ってるんだけど
なんか急に何入れても「1つ以上の複数回定義(ry」
ってエラーがでてくるようになった。
ただputs("あ");
ってプログラムでもそのエラー
579デフォルトの名無しさん:2008/08/05(火) 21:13:44
ソースを切り取らずに全部書け
580デフォルトの名無しさん:2008/08/05(火) 21:16:13
#include <stdio.h>

int main(void)
{

puts("あ");
return (0);
}

これですらエラーになる。
Visual C++の設定がなんか変わっちゃったのかも。
581デフォルトの名無しさん:2008/08/05(火) 21:20:04
なんか新しく新規作成したら直った。
スレ汚しすまんかった。
582デフォルトの名無しさん:2008/08/05(火) 21:24:33
>新しく新規作成

そりゃぁ、古く新規作成はできないだろうさ。
583デフォルトの名無しさん:2008/08/05(火) 21:48:43
古く新規作成したファイルならあるだろうがな
584デフォルトの名無しさん:2008/08/05(火) 23:53:34
黙 っ て コ ー ド を 書 け よ ハ ゲ 
585デフォルトの名無しさん:2008/08/05(火) 23:56:36
新参ですが失礼します

これから初めてCを学ぼうと思うのですが

C++
C#
のどれから始めれば良いのか
教えてください
586デフォルトの名無しさん:2008/08/05(火) 23:58:15
無論C#
587デフォルトの名無しさん:2008/08/06(水) 00:01:46
>>586
素早いレスどうもです

便宜上、分かり易さでもC#からの方が良いのですか?
588デフォルトの名無しさん:2008/08/06(水) 00:02:16
>>585
CとC++とC#は別物。
英語とドイツ語とフランス語の違いと同じくらい異なるもの。
589デフォルトの名無しさん:2008/08/06(水) 00:08:53
>>588
そうでしたか。
ありがとうございます。
C#から頑張ってみたいと思います。

このスレの住人の皆様の御健闘をお祈り致しまして失礼したいと思います。
それでは...
590デフォルトの名無しさん:2008/08/06(水) 00:32:06
Cから初めてあとは好きなのを選べばいい
いきなり変なのに手を出すと後々苦労すると思うよ
591デフォルトの名無しさん:2008/08/06(水) 00:38:13
C以外から始めて、二度とここには戻って来ないで欲しい。
592デフォルトの名無しさん:2008/08/06(水) 00:40:07
C → 他言語に浮気 → C
593デフォルトの名無しさん:2008/08/06(水) 00:41:10
>>592
今の俺だわ
594デフォルトの名無しさん:2008/08/06(水) 00:44:06
C → C++(better C + STL)
boost っておいしい?
595デフォルトの名無しさん:2008/08/06(水) 00:47:34
少なくともそれはもうC++のスレで聞くことだよね?
596デフォルトの名無しさん:2008/08/06(水) 01:05:46
Cが一番手を出しやすい気がする
基本に忠実で。
597デフォルトの名無しさん:2008/08/06(水) 01:54:12
Cが一番手を出しているとも言えるな
598デフォルトの名無しさん:2008/08/06(水) 03:49:11
おはようございます。おきてる方いらっしゃいますでしょうか?

いまwhile文というものを書いてみました。
結果が
「1回目の実行です
2回目の実行です
・・・・
10回目の実行です」
にしたいのですが「続行するのは何かキーを押してください」になってしまいます。
何か数字をいれると消えてしまいます。

#include<stdio.h>

int main()
{
int i=10;

while(i>10){
printf("%2d回目の実行です\n",11-i);
i--;
}
return 0;
}
これの何がいけないのでしょうか?
ビルドでは問題ないようなんですか・・・・
お願いします。
599デフォルトの名無しさん:2008/08/06(水) 03:51:18
すみません!
自分で解決しました。
(i>0)のぶぶんでした。
目ボケなまこでむみません
600デフォルトの名無しさん:2008/08/06(水) 03:51:31
i>0
601デフォルトの名無しさん:2008/08/06(水) 03:54:55
i<1としてみたら?
602デフォルトの名無しさん:2008/08/06(水) 03:58:56
<1にしてみました。
黒い画面が「続行するには・・・」になってしまいました。
>1にしてなにしたかったのでしょうか?
自分は初心者のためよく理解できません;;;
603デフォルトの名無しさん:2008/08/06(水) 04:03:31
あれ・・?
最初って
i>10だったの?
それともi>0だったの?

604デフォルトの名無しさん:2008/08/06(水) 04:07:00
自分が間違えて10と入力してしまったのですが本当は0です。
ココの部分を0にしたらきちんと表示できました!
605デフォルトの名無しさん:2008/08/06(水) 04:10:23
なんでもっと素直に書かないんだ?
と思ったら勉強中で色々試してるところなのかな?
606デフォルトの名無しさん:2008/08/06(水) 04:16:37
勉強中です。
まったくの初心者なので,を忘れたり入力間違いという簡単なミスをしている段階です。
自分で確認しているのですが、ココに書き込みをして冷静になると問題点が分かるという大変迷惑なことをしています。
すみません・・・・。
607デフォルトの名無しさん:2008/08/06(水) 04:24:02
ところで何で0に直したら上手く動作したのか理解してるんかいね?
608デフォルトの名無しさん:2008/08/06(水) 04:30:36
i>10が真である限り繰り返すからですよね。
無限になってしまうからbreak;をつける
609デフォルトの名無しさん:2008/08/06(水) 04:32:56
全然駄目じゃん
最初の宣言部で i = 10 としてるのに
i > 10 つまり i が 10 より大きい時
なんて条件に当てはまらないでしょ?
つまり一度もループに入らないんだよ
610デフォルトの名無しさん:2008/08/06(水) 04:33:01
今日イージーミスが多すぎorz
出勤までまだ時間あるので寝ます。
すみませんでした。ありがとうございます
611デフォルトの名無しさん:2008/08/06(水) 04:40:01
>>609
0にしたらってもしかすると初期化がi=0;かもよw
612デフォルトの名無しさん:2008/08/06(水) 05:19:08
質問させてください
変数の配列の数を使用者側に入力させたいのですが、入力させる文を入れてから変数定義するとエラーがでます
どうすればいいでしょうか

こんな感じです↓
int kosu;

printf("計算する数値の個数を入力してください");
scanf("%d",&kosu);

int suchi[kosu];
double suchi2[kosu];
613デフォルトの名無しさん:2008/08/06(水) 05:27:02
>>612
無理

配列を動的に確保するか、あらかじめかなり大目に確保しておくか
614デフォルトの名無しさん:2008/08/06(水) 05:34:34
そうでしたか^^;
わかりました。ありがとうございます
615デフォルトの名無しさん:2008/08/06(水) 05:41:35
いつものこのセリフ

C99ならできるよ
616デフォルトの名無しさん:2008/08/06(水) 05:43:26
ISO/IEC 9899:1999 - Programming Language C
617デフォルトの名無しさん:2008/08/06(水) 06:13:18
c99で
int a[val];
みたいな動的確保やると、ヒープ領域に確保されるってことだよね?
618デフォルトの名無しさん:2008/08/06(水) 06:15:45
いや、スタックか?スコープ抜けたら自動で解放されるんだよね。
619デフォルトの名無しさん:2008/08/06(水) 07:39:06
スタックだよ。ElderPGならお馴染みの、alloca()で確保される。
620デフォルトの名無しさん:2008/08/06(水) 08:16:46
初 心 者 は C に 手 を 出 す な
JAVAかVBやってろ。迷惑だ。
621デフォルトの名無しさん:2008/08/06(水) 09:19:29
じゃあ、どんな奴がC始めればいいんだよw
成りすまして評判落とそうとしてるんなら、別にいいけど
622デフォルトの名無しさん:2008/08/06(水) 09:27:02
ちゃんとした大学の理工系ならしっかりカリキュラムに入ってる
始める始めない以前にやらなきゃならない
623デフォルトの名無しさん:2008/08/06(水) 09:33:20
それにweb人気でC言語できる若いのが減ってるので就職した先とかによっては
仕方なしにC覚えてるやつがここへ質問に来てそうな雰囲気もある。
624デフォルトの名無しさん:2008/08/06(水) 09:35:31
いいじゃんそれで
入門編スレでそんな事言われても・・・
625デフォルトの名無しさん:2008/08/06(水) 10:16:08
>>620
初心者って誰のこといってんの?
てか、初心者を経ずに上級者になる方法なんてあるの?w
626:2008/08/06(水) 12:22:47
教えて下さい。
unsignd char One=0x89;
unsignd char Two=0xD4;
#define MIM (unsignd short)0x813F
#define MAX (unsignd short)0xEAA4
unsignd short th;

th=One;
th=Two<<8;
th+=Two;

if(MIN<=th&&th>=MAX){return1;}else{return1;}

この処理を行うと1が返ると思うのですが、実際は0が返ります。th>=MAXがうまくいってないみたいなのですが。環境はVC6です。
627デフォルトの名無しさん:2008/08/06(水) 12:25:40
>>626
???
1しか返らないと思うが
th=One;は意味がないし
628デフォルトの名無しさん:2008/08/06(水) 12:26:37
th=Two<<8;
このままだと0にならない?
629デフォルトの名無しさん:2008/08/06(水) 12:31:39
>>628
char型の演算はintに変換して行うよ
オプションで変えられたようなきもするけど
630628:2008/08/06(水) 12:33:01
設定とかコンパイラ依存なのかな?

この間pngのパレット取り出す際にまさにそんな演算して
色情報化けまくりだった
631デフォルトの名無しさん:2008/08/06(水) 12:33:57
>>626
unsigndやMIMとかtypo多すぎ
コピペでやり直し
632626:2008/08/06(水) 12:35:47
返事ありがとうございます。デバッグしてるんですがthは0x89D4になっています。IF条件を分割してデバッグしたところMAXの箇所がうまくいってないんです。
633デフォルトの名無しさん:2008/08/06(水) 12:38:27
thがいくらであろうが1が返るよね
634デフォルトの名無しさん:2008/08/06(水) 12:39:28
両方return 1;だからな
635デフォルトの名無しさん:2008/08/06(水) 12:40:44
>IF条件を分割してデバッグしたところ
このソースだせ
636デフォルトの名無しさん:2008/08/06(水) 12:43:37
if (MIN <= th && th >= MAX)

if (MIN <= th && th <= MAX)
じゃないの

637デフォルトの名無しさん:2008/08/06(水) 13:30:58
基本中の基本だが、条件文を作るとき、そこで扱う変数の値をイメージしてるかい?
「変数aは今0で、ここを抜けると10になって…」みたいな。
イメージできないなら、条件文に入る前、処理中、条件文を抜けた後、それぞれにprintf()で変数aを表示させること。
他人に聞くよりも絶対早く解決する。
638デフォルトの名無しさん:2008/08/06(水) 15:20:38
strdupって関数ありますか?
639デフォルトの名無しさん:2008/08/06(水) 15:23:29
あるかもしれないし、ないかもしれない
640デフォルトの名無しさん:2008/08/06(水) 15:55:00
>>623
文字列を複製するんじゃなかったかな。
ググってみたら?
641640:2008/08/06(水) 15:55:31
ミスった>>638
642デフォルトの名無しさん:2008/08/06(水) 17:15:57
つくってやんよ

char* strdup(const char* src)
{
size_t len = strlen(src);
char* ptr = malloc(len+1);
if (ptr) {
memcpy(ptr, src, len);
ptr[len] = 0;
}
return ptr;
}
643デフォルトの名無しさん:2008/08/06(水) 17:18:28
strcpyつかえよ
644デフォルトの名無しさん:2008/08/06(水) 17:20:00
もう一バイトぐらい一緒にコピーしちまえよ
645デフォルトの名無しさん:2008/08/06(水) 17:20:03
事前に長さを調べてるのにわざわざstrcpyにするのか?
646デフォルトの名無しさん:2008/08/06(水) 17:26:01
>>644
忘れてたwww
最初 malloc(strlen()+1) & strcpy() だったんだけど、どうせおまえらが「長さ2回数えるなんてアホハケーン」
とか言うだろうと思ってmemcpy()に改訂したときにミスった
というわけでアホハケーン>>643
647デフォルトの名無しさん:2008/08/06(水) 17:35:54
strlen使ってるって事はnul文字が終点として認識してるんだよな
わざわざmemcpy使ってる意味が分からないんだが
648デフォルトの名無しさん:2008/08/06(水) 17:37:57
本気で言ってるのか、C暦何ヶ月?
649デフォルトの名無しさん:2008/08/06(水) 17:38:25
>>647
じゃあ、自分でサンプル書いてみ。
650デフォルトの名無しさん:2008/08/06(水) 17:38:58
C暦2008年、世界は核の炎に包まれた
651デフォルトの名無しさん:2008/08/06(水) 17:54:19
/* こうですか?わかりません>< */

char* strdup(const char* src)
{
size_t len = strlen(src);
char* ptr = malloc(len+1);
strcpy(ptr, src);
return ptr;
}
652デフォルトの名無しさん:2008/08/06(水) 17:58:00
ついでにstrlenやstrcpyの先がどうなってるかも考えてみては。
653デフォルトの名無しさん:2008/08/06(水) 18:02:48
>>648
あぁ、悪い悪い、strncpyの事言ってた

>>649
strncpy(ptr, src, len);
でどうなんだって思ったわけだが
654デフォルトの名無しさん:2008/08/06(水) 18:09:06
strcpyは文字列の長さなんて気にしないよね
655デフォルトの名無しさん:2008/08/06(水) 18:22:25
>>654
するよ。

>>653
2回NUL位置を調べるのは明らかに無駄。
656デフォルトの名無しさん:2008/08/06(水) 18:22:44
strcpyのほうがmemcpyより遅いの?
657デフォルトの名無しさん:2008/08/06(水) 18:26:40
>>656
断定はできないが、たぶん遅い。
memcpyは機械的に指定バイトコピーするだけだから、おそらくワード単位での処理とかで効率化されてる。
strcpyは常に1バイト1バイトチェックしなけりゃならない。

でも実際にはmallocのコストのほうがでかいと思うがね。
658デフォルトの名無しさん:2008/08/06(水) 18:28:18
訂正
mallocのコストに比べたらたいしたことのない差だと思う
659デフォルトの名無しさん:2008/08/06(水) 18:43:47
if文の条件に
変数xが aかbかcかdのいずれかなら、
ということを使いたいのですが、

その場合、
if (x == a,b,c,d)
でいいんですか?
660デフォルトの名無しさん:2008/08/06(水) 18:47:02
いくない
661デフォルトの名無しさん:2008/08/06(水) 18:47:40
if(x==a || x==b || x==c || x==d)
662デフォルトの名無しさん:2008/08/06(水) 19:10:35
fgetcって、読み込めるものがなくなると、EOFを返すんですよね。
このEOFは整数型だから、文字型の変数には代入できないんですよね?
663デフォルトの名無しさん:2008/08/06(水) 19:13:48
違う、どっちも整数です
だけどcharはsingnedかunsignedか決められてないので
charがunsignedでEOFが-1であることがあるからintにに入れるのが普通
664デフォルトの名無しさん:2008/08/06(水) 19:19:03
コンパイル時に警告が出るだけで何でも入るよ。
だからEOFの時の条件も書いたほうがいいね。
665デフォルトの名無しさん:2008/08/06(水) 19:20:06
>>663
嘘を教えないように。
666デフォルトの名無しさん:2008/08/06(水) 19:24:06
>>665
どのへん?
667デフォルトの名無しさん:2008/08/06(水) 19:31:20
一例を挙げると、>>663の理屈だと
signed char (8bit) , EOF が -1 のときなら、
char 型に入れても問題ないように読めるが、
その場合、255という文字と -1 が区別できなくなってしまう。
つまり、fgetc はちゃんとこの二つを区別してるのにそれをいったん
signed char 型に入れてしまうことで区別できなくなってしまうってこと。

この他のパターンもいろいろある。考えてみて。符号拡張には特に注意してね。
668デフォルトの名無しさん:2008/08/06(水) 19:38:00
>>667
charがsigned charである処理系の話を出しておいてなんでその状況で
255の文字とか言い出してるんだ?
669デフォルトの名無しさん:2008/08/06(水) 19:50:36
'\xff'の文字のことだと思ってあげればいいじゃない。
670デフォルトの名無しさん:2008/08/06(水) 20:10:27
>>668
fgetcは常にバイトをunsigned charとして読み込む
charがsignedであっても、0xffを読んだときに返る値は255
671デフォルトの名無しさん:2008/08/06(水) 20:15:25
おおやっとわかった
どうもありがとう
672デフォルトの名無しさん:2008/08/06(水) 21:01:53
2バイトのバイナリデータを5桁のASCUコードに変換
するにはどうしたらいいでしょうか?
673デフォルトの名無しさん:2008/08/06(水) 21:04:53
そんなコードありません
674デフォルトの名無しさん:2008/08/06(水) 21:32:01
長々と失礼します
二つの問題がわかりません
どこをどう直せばいいでしょうか

問題:キーボードから入力した二つの整数値x,yのxのy乗
を計算するプログラムを作成しなさい。

#include<stdio.h>
int pow(int x, int y)
int main(void){
int x, y, z;
printf("Input two integer numbers:");
scanf("%d %d", &x, &y);
z=pow(x, y);
printf("%d", z);
}
int pow(int x, int y){
int z=1,i;
for(i=0; i<; i++);
z*=x;

return z;
}
return 0;
}
675デフォルトの名無しさん:2008/08/06(水) 21:36:10
>>674の二つめです、お願いします。

問題:キーボードから入力した文字列を全て大文字(小文字は大文字に
大文字はそのまま)に変換して表示するプログラムを作成しなさい。
ただし、文字を大文字に変換する関数を作成し、それを利用すること。

#include<stdio.h>
void smallToCapital(char* string);
int main()
{
char* str;
scanf("%s",str);
smallToCapital(str);
printf("%s",str);
}
void smallToCapital(char* string)
{
char c;
int i;
for(i=0;c=string[i];i++)
{

if('a'<=c&&c<='z')
string[i]+='A'-'a';

}
}
676デフォルトの名無しさん:2008/08/06(水) 21:58:03
一つ目は、for(i=0; i<; i++);の真ん中の部分が変このままだとコンパイルすら通らん。たぶんi<y
後x,yが整数の範囲でくるから、yは正負で場合分けが必要
二つ目に関しては試してないから分からんがうまくいきそうな気がする、どういう失敗が起こるの?
677デフォルトの名無しさん:2008/08/06(水) 21:59:14
char* str;

char str[256];

とでもして置く
678デフォルトの名無しさん:2008/08/06(水) 21:59:56
int pow(int x, int y)
{
  int z=1, i;
  for(i = 0; i < y; i++){
  z*=x;
  }
  return z;
}

void smallToCapital(char* string)
{
  char c;
  int i;
  for(i = 0; string[i] != '\0'; i++){
    c = string[i];
    if('a' <= c && c <= 'z')
      string[i]+='A'-'a';
  }
}

コンパイルして無いから動くか知らん
679デフォルトの名無しさん:2008/08/06(水) 22:04:31
>>677
ああ、main部分か、関数部分しか見てなかった
680デフォルトの名無しさん:2008/08/06(水) 22:18:47
>672
一応言っておきますがASCIIはAmerican Standard Code for Information Interchangeの略ですから
「A」「S」「C」「I」「I」であって「A」「S」「C」「U」ではありません
681デフォルトの名無しさん:2008/08/06(水) 22:21:44
あすくつー
682デフォルトの名無しさん:2008/08/06(水) 22:22:16
きっと明日が苦痛なんだよ
683デフォルトの名無しさん:2008/08/06(水) 22:28:49
>>672
C言語関係ない
base64でぐぐれ、たぶんこれのことだろう
684デフォルトの名無しさん:2008/08/06(水) 22:31:46
htmlとかの解析ってどうやるの?
685デフォルトの名無しさん:2008/08/06(水) 22:33:45
base16じゃね?2バイト→16ビット→4ビット×4→4文字

あれ?
686デフォルトの名無しさん:2008/08/06(水) 22:38:55
>>684
HTMLファイルをfopenしてfgetsなりなんなりで読んで解析すればいいんじゃないかな
687デフォルトの名無しさん:2008/08/06(水) 22:39:53
>>674-675です
解答ありがとうございます。
度々申し訳無いんですが
直してコンパイルしてみたのですがエラーが出ました
どうしたらよいでしょうか
1のエラー文
p1-q04.c:3: 警告: conflicting types for built-in function ‘pow’
p1-q04.c: In function ‘pow’:
p1-q04.c:3: error: syntax error before ‘{’ token

2のエラー文
p1-q10.c: In function ‘main’:
p1-q10.c:7: 警告: passing argument 1 of ‘smallToCapital’ from incompatible pointer type

こんな感じです。
688デフォルトの名無しさん:2008/08/06(水) 22:47:17
1の方、最後の二行、消してみ
2の方は警告だから無視
689デフォルトの名無しさん:2008/08/06(水) 22:53:12
>>687
1番目: 3行目のpowのプロトタイプ宣言にセミコロン「;」がついてない。(警告は止まらないので無視)
690デフォルトの名無しさん:2008/08/06(水) 22:58:09
>>687
まだあった、forの後の;とってあるか?それがあると空で回るぞ
691デフォルトの名無しさん:2008/08/06(水) 23:09:31
#include<stdio.h>
int pow(int x, int y)
int main(void)
{
int x, y, z;
printf("Input two integer numbers:");
scanf("%d %d", &x, &y);
z=pow(x, y);
printf("%d", z);
{
int pow(int x, int y)
}
int z=1,i;
for(i=0; i < y; i++)
{
z*=x;
}
return z;
}
今ソースはこんな感じです。
どうでしょうか?
692デフォルトの名無しさん:2008/08/06(水) 23:14:20
>>691
いや、「どうでしょうか」じゃなくて、自分でコンパイルして、実行してみるの!
693デフォルトの名無しさん:2008/08/06(水) 23:20:36
そろそろ宿題スレ行ったら?
694デフォルトの名無しさん:2008/08/06(水) 23:23:19
すみません
実行したところ以下のエラー文が出ました。
p1-q04.c:3: 警告: conflicting types for built-in function ‘pow’
p1-q04.c: In function ‘pow’:
p1-q04.c:4: error: syntax error before ‘{’ token
p1-q04.c:10: error: old-style parameter declarations in prototyped function definition
p1-q04.c: In function ‘pow’:
p1-q04.c:12: error: syntax error before ‘}’ token
695デフォルトの名無しさん:2008/08/06(水) 23:25:31
#include<stdio.h>
int pow(int x, int y)
int main(void)
{
int x, y, z;
printf("Input two integer numbers:");
scanf("%d %d", &x, &y);
z=pow(x, y);
printf("%d", z);
}
int pow(int x, int y)
{
int z=1,i;
for(i=0; i < y; i++)
{
z*=x;
}
return z;
}
696デフォルトの名無しさん:2008/08/06(水) 23:29:19
せっかくコンパイラーがエラーを出してくれているのに、何故読もうとしないのだろう?
697デフォルトの名無しさん:2008/08/06(水) 23:37:18
長々とありがとうございます。
ここから自力でやってみます。
698デフォルトの名無しさん:2008/08/06(水) 23:51:37
警告を無視しろなどというレベルの低い奴は教える資格無し。
コンパイラの警告レベルは常にmaxにし、警告とエラーは全てゼロになるコードを書くのが基本。
699デフォルトの名無しさん:2008/08/06(水) 23:56:11
>>698
せっかくだから>>687>>694の警告の意味と対処法を教えてあげれば?
700デフォルトの名無しさん:2008/08/07(木) 00:03:14
>>691
>int pow(int x, int y)
つ;
701デフォルトの名無しさん:2008/08/07(木) 00:05:17
これ宿題スレからそのまんまこっちに持ち込んでるのかよ…酷いな…
702デフォルトの名無しさん:2008/08/07(木) 00:09:45
七言語
703デフォルトの名無しさん:2008/08/07(木) 00:11:45
有資格者は何処へ
704デフォルトの名無しさん:2008/08/07(木) 00:25:08
あまいあまい。
宿題スレで回答されたコードにシンタックスエラーを追加した改悪版だよ。

んで、VCだとpowは組み込み関数なの?math.hないのにこんなエラー出るって事はそうなんだよね
705デフォルトの名無しさん:2008/08/07(木) 00:27:31
>>698
fopenなどが非推奨となってる開発環境に旧資産を移すときは、その手の警告を抑えるスイッチをつけたいです
706デフォルトの名無しさん:2008/08/07(木) 00:31:54
>>705
横からごめん。
fopenなどが非推奨ってどういう環境? よくあるのかしら。 ちょと気になる。
707デフォルトの名無しさん:2008/08/07(木) 00:32:57
>>706
MS独自の _s 系の関数では?
708デフォルトの名無しさん:2008/08/07(木) 00:33:19
>>706
MSはfopen_sを使いなされというよ
709デフォルトの名無しさん:2008/08/07(木) 00:33:44
gccのコンパイラの警告を上げるのって -Wall 以外にある?
710デフォルトの名無しさん:2008/08/07(木) 00:34:00
VC++でfopen_sを使えって警告してくるアレのことじゃ?
711デフォルトの名無しさん:2008/08/07(木) 00:36:55
>>709
-pedantic
その他各種-Wなんたら
712デフォルトの名無しさん:2008/08/07(木) 00:38:35
713706:2008/08/07(木) 00:41:23
>>707
>>708
>>710
さんきゅー 超メジャー環境でふいた
714デフォルトの名無しさん:2008/08/07(木) 00:50:18
>>712
-W -Wall が基本だと思ってる
715デフォルトの名無しさん:2008/08/07(木) 18:55:55
ダイテルの「C言語プログラミング」で独学していて、解答の理由が
よくわからないところがあります。教えていただけると助かります。
復習問題5.6.b:
「『ファイルの終わりまで有効なスコープをもつ整数型の外部変数number』
の宣言を書け」という問題があって、その答えが
「static int number; (これは関数定義の外部で宣言すること)」なんです。

・なぜ解答では記憶クラスがstaticなんでしょう。関数定義の外部で宣言するんだから、
 externでもstaticでもスコープはファイルスコープになるような。
・(上が間違っていないとして)解答でstaticが使われているのは、複数のファイルで
 プログラムをつくるとき、externだと他のファイルからアクセスできるから?
 でもそれは、スコープとは関係ないんですよね?
716デフォルトの名無しさん:2008/08/07(木) 19:01:50
>>714
-Wallは-Wを含むはずだが
717デフォルトの名無しさん:2008/08/07(木) 19:40:17
md5を計算するCコードってどんな感じ?
718デフォルトの名無しさん:2008/08/07(木) 19:41:20
>>717
md5sum でググれ
719デフォルトの名無しさん:2008/08/07(木) 19:49:07
>>716
そんなことはない
720デフォルトの名無しさん:2008/08/07(木) 19:50:51
>>715
そのファイル”のみ”で有効な変数という意味だと思う
訳者が省略したんだろう
721デフォルトの名無しさん:2008/08/07(木) 23:39:59
>>720
そう言われてみると、そんな意味がありそうな訳文かも。
もともと解答があきらかに間違っているわけでもないので、
そう解釈して先へ進んでみます。
ありがとうございました!
722デフォルトの名無しさん:2008/08/08(金) 02:10:19
深夜にすみません。
あるループ(do while使用)で処理をおこなったあと、Enterキーを入力した場合もう一度ループするというプログラムを作っているんですが
putchar();で受け取ると最初のみ2回ループ内の処理が行われてしまいます。
Enterを受け取る別のコマンドはないでしょうか?

また、putcharをそのまま使うならバッファをクリアすれば?
といわれたのですがやり方がわかりません。どなたかヒントいただければと思います

よろしくおねがいします
723デフォルトの名無しさん:2008/08/08(金) 02:17:57
ソースも出さずに質問とな
724デフォルトの名無しさん:2008/08/08(金) 02:26:54
>>722
scanfと一緒に使うな。
scanfで入力を受けたときに入力された改行が、getcharで拾われているのだろうとエスパー。
もしそうなら、例えばscanfのほうをfgets+sscanfにでもすればいい。
725デフォルトの名無しさん:2008/08/08(金) 02:51:53
超初心者ですが、コンパイラって無料なんですか?
設定でパソコンが壊れるって本当ですか?
726デフォルトの名無しさん:2008/08/08(金) 02:56:25
>>725
無料のもあるし無料じゃないのもある
まぁ壊れること普通ないかと
727デフォルトの名無しさん:2008/08/08(金) 02:57:51
>>726
ありがとうございます
無料の探して頑張ってやってみます
728デフォルトの名無しさん:2008/08/08(金) 06:53:21
>>722
fflush(stdin)
729デフォルトの名無しさん:2008/08/08(金) 07:21:08
struct Hoge {
    int n;
};

void foo(struct Hoge *hoge)
{
    hoge = malloc(sizeof(struct Hoge));
    hoge->n = 10;
}

int main(void)
{
    struct Hoge hoge;

    foo(hoge);
    printf("%d\n", hoge->n);

    return 0;
}

10って表示されないんですけど。
引数経由で詰めるにはどうすればいいのですか?
730729:2008/08/08(金) 07:24:19
struct Hoge hoge;
ではなく
struct Hoge *hoge;
でした
731デフォルトの名無しさん:2008/08/08(金) 07:25:29
struct Hoge {
    int n;
};

void foo(struct Hoge *hoge)
{
    *hoge = malloc(sizeof(struct Hoge));
    *hoge->n = 10;
}

int main(void)
{
    struct Hoge hoge;

    foo(&hoge);
    printf("%d\n", hoge->n);

    return 0;
}
732デフォルトの名無しさん:2008/08/08(金) 07:43:48
>>729
struct Hoge {
int n;
};

void foo(struct Hoge **hoge)
{
*hoge = (struct Hoge*)malloc(sizeof(struct Hoge));
(*hoge)->n = 10;
}

int main(void)
{
struct Hoge *hoge;

foo(&hoge);
printf("%d\n", hoge->n);

return 0;
}
733デフォルトの名無しさん:2008/08/08(金) 07:56:11
答える奴らも初心者かよ・・・・
お手本はこう。
struct Hoge {
    int n;
};

static struct Hoge *foo(void)
{
    struct Hoge* hoge = malloc(sizeof(struct Hoge));
    hoge->n = 10;
    return hoge;
}

int main(void)
{
    struct Hoge* hoge;

    hoge = foo();
    printf("%d\n", hoge->n);
    free(hoge);

    return 0;
}
734デフォルトの名無しさん:2008/08/08(金) 07:59:47
>>733
お前は日本語が理解できないらしいな

まぁ確かにそっちのがいいけど
735デフォルトの名無しさん:2008/08/08(金) 08:02:18
>>733
それは関数の構造を変えてるだろ。
そのほうがいいのは確かだけど
質問者は引数でポインターを渡してそこを書き換えて戻してくれってことだろ?

まずそっちを回答してから、本当はこういうほうがいいかもね
と教えるべきだろ
736デフォルトの名無しさん:2008/08/08(金) 08:10:38
配列や構造体の初期化で質問があります。

現状数が少ない配列などはコンパイル時に値を代入してくれるイニシャライザー?
で初期化していますが128x128の構造体配列(中はshortx4)を全部-1で初期化したい
場合はうまく指定する記述方法とかありますでしょうか?
737736:2008/08/08(金) 08:12:22
追記です
>128x128の構造体配列(中はshortx4)
これがさらに3つあります。
738デフォルトの名無しさん:2008/08/08(金) 08:13:30
地味に自分で代入しましょう。
739736:2008/08/08(金) 08:13:33
あ・・すみません
3では無くさらに3x3の配列になってます・・・
740デフォルトの名無しさん:2008/08/08(金) 08:27:47
-1だったらmemsetでいけるね。別におすすめはしないけど
0xffで埋めちゃえばできるかと
741デフォルトの名無しさん:2008/08/08(金) 08:28:54
代入ロジックを自分で書くのがいやなら初期化子を自動生成したら?
例えばawk 'BEGIN{for(i=0;i<128;++i)for(j=0;j<128;++j)print "{-1,-1,-1,-1},";}' > foo.iとでもして、それをインクルードすればいい。
Ex.
struct foo1[128][128] = {
#include "foo.i"
};
struct foo2[128][128] = {
#include "foo.i"
};
// 以下略
742デフォルトの名無しさん:2008/08/08(金) 08:41:28
include指令をそーゆー使い方するのはおじさん感心しないなぁ
初期化用の関数かマクロを書いたほうがマシ
743デフォルトの名無しさん:2008/08/08(金) 08:45:09
foo1[128][128] = { ... }; とかの宣言まで含めてスクリプトで生成させるのは時々やる
744デフォルトの名無しさん:2008/08/08(金) 08:46:55
あと余計なお世話かも知れんけど、intの代わりにshortを使っても
(コンパイラの設定を変えないかぎり)サイズの節約にはならないことは理解してるかい
745デフォルトの名無しさん:2008/08/08(金) 08:49:05
>>744
shortが4つ並んでも勝手にサイズ調整されるんですかね?・・・・
746デフォルトの名無しさん:2008/08/08(金) 08:49:17
>>739
黙って多重ループを使って明示的に実行時初期化する
ほかに類似の構造体配列がないならコストは別に変わらない
747デフォルトの名無しさん:2008/08/08(金) 08:51:05
>>745
まぁ、余程のことがない限り余計なアライメントは発生しないな。
748デフォルトの名無しさん:2008/08/08(金) 08:51:09
>>745
0-1バイト:short 1
2-3バイト:詰め物
4-5バイト:short 1
6-7バイト:詰め物

になるからね
配列にすれば別だけど

大抵の場合は変なこと考えずにintで取るのがCの流儀
749745:2008/08/08(金) 08:53:32
そうなんですか

さっきshortからintに変更したら実行ファイルのサイズが小さくなりましたw
750デフォルトの名無しさん:2008/08/08(金) 08:56:31
intというのはコンピュータが一番扱いやすい領域の大きさ(いわゆる1ワード)のことだからね
shortやcharを使うと記憶領域を節約できる場合があるけど、余計なコードが必要になることも多い
751デフォルトの名無しさん:2008/08/08(金) 08:56:50
>>748
そのコンパイラとコンパイルオプションは?
まさか、アライメント指示のコンパイルオプションをつけているとかプラグマ指定をつけているなんて言わないよな。
752デフォルトの名無しさん:2008/08/08(金) 08:58:24
>>749
実際の演算のときは、格上げに注意。C90とC99で振る舞いが変わるからね。
753デフォルトの名無しさん:2008/08/08(金) 08:59:41
>>750
朝っぱらから生半可な知識で中途半端なことを書くのはやめてくれ。フォローすんのもめんどくせぇぞ。
754デフォルトの名無しさん:2008/08/08(金) 09:09:02
>>748
Cの境界調整とは記憶領域が境界をまたいで配置されることがないようにすることであって、
記憶領域の先頭をなにがなんでも境界に合わせるわけではない。
特別な指定がないかぎり、(short が int の半分なら) short を4つ連続で配置したら詰めものが入ることはない。
755ym:2008/08/08(金) 11:30:14
チェック文字列で渡された
文字列が全て'A'〜'Z'の文字で構成されているかをチェックする、
プログラムを教えてください。
756デフォルトの名無しさん:2008/08/08(金) 11:33:53
>>748
ならねーよ
バカ
757デフォルトの名無しさん:2008/08/08(金) 11:41:55
>>748
#include <stdio.h>

struct ss {
short a;
short b;
};

struct si {
short a;
int b;
};

int main(void)
{
printf("short short %d\n",sizeof(struct ss));
printf("short int %d\n",sizeof(struct si));
return 0;
}
758デフォルトの名無しさん:2008/08/08(金) 11:46:47
void chk(char tmp){



char *hoge[5]={ "hoge","hoge2","hoge3","hoge4","hoge5"};

for(i=0;i<5;i++){

if(hoge[i] == tmp) 処理

}


hogeの文字列と引数として受け取った文字列が一致すればなにかするっていうのを書きたいんですが、

うまくコンパイルできません。どうすればいいのでしょうか?
759デフォルトの名無しさん:2008/08/08(金) 11:49:30
>>758
#include <string.h>

void chk(char *tmp){
char *hoge[5]={ "hoge","hoge2","hoge3","hoge4","hoge5"};
for(i=0;i<5;i++){
if(strcmp(hoge[i], tmp) == 0) 処理
}
760デフォルトの名無しさん:2008/08/08(金) 12:08:30
strcmpを使えばよかったんですね。どうも
761デフォルトの名無しさん:2008/08/08(金) 12:53:37
char mozi[256];

char mozi[256]にtestって入ってるとして
その後ろにhogeって追加したい場合はどうやればいいんですか?
762デフォルトの名無しさん:2008/08/08(金) 12:54:36
>>761

配列の中は

testhoge

にするってこと?
763デフォルトの名無しさん:2008/08/08(金) 12:56:20
そうです
764デフォルトの名無しさん:2008/08/08(金) 12:56:31
strcat(mozi, "hoge");
765デフォルトの名無しさん:2008/08/08(金) 12:59:15
入門書もヘルプ(manやMSDN)も見ずにやろうとしてるのかね・・・
766デフォルトの名無しさん:2008/08/08(金) 13:06:36
質問のレベルがひどすぎる
入門者以前の、習得一週間以下くらいだぞ
767デフォルトの名無しさん:2008/08/08(金) 13:13:38
訳:かまってほしいな
768デフォルトの名無しさん:2008/08/08(金) 13:31:58
>>724>>728
THX 無事できました
769デフォルトの名無しさん:2008/08/08(金) 14:03:45
どういたしまして
770デフォルトの名無しさん:2008/08/08(金) 15:12:37
const char *str = "hoge";
const char str[] = "hoge";

この2つは、メモリ上の確保される位置が違うのでしょうか?
前者は、読み出し専用領域なるところに確保され、他からも再利用
されるという話を聞いたのですが、後者は普通に配列を確保したような
確保のされ方なのでしょうか?
771デフォルトの名無しさん:2008/08/08(金) 15:17:52
>>770
文字列リテラル「"hoge"」はコンパイラによって確保された静的な領域に置かれる
読み出し専用であるかどうかは定まっていないが、少なくとも保証されていないので、そう見なしたほうが安全である
772デフォルトの名無しさん:2008/08/08(金) 15:18:39
訂正
保証されていないので→書き換え可能であることが保証されていないので
773デフォルトの名無しさん:2008/08/08(金) 15:20:40
>770
"hoge"は静的領域に置かれて大抵の場合書き込み不可
再利用されるかどうかはわからないが、賢いコンパイラならたぶんやる
str[]はもちろん'h''o''g''e'\0'が格納される
774デフォルトの名無しさん:2008/08/08(金) 15:23:43
レスどうもです。
つまり2つは似て非なるものということですよね。
もし、char *タイプだった場合、賢いコンパイラが再利用してくれる
可能性があるなら、char []で確保するよりもベターということですよね。
もちろん定数文字列として使う場合。
775デフォルトの名無しさん:2008/08/08(金) 15:28:35
ベターだとしても気にするような差ではないかもしれない
一方文字列定数を直接使うとアクセス速度が落ちるかもしれない
それもやっぱり気にするような差ではないかもしれない
776デフォルトの名無しさん:2008/08/08(金) 15:32:15
>>770
メモリの配置など気にしてもあまり意味ないと思うけどな。
上はconst char *、下はchar配列。別のものであることを理解してればおk。
777デフォルトの名無しさん:2008/08/08(金) 15:35:23
気にしないことにします。
ありがとうございました。
778デフォルトの名無しさん:2008/08/08(金) 15:41:38
>>774
いちおう補足するけど、文字列定数を使うのは「内容が変わらないことが保障されるから」だからね。
メモリが再利用されるから使うという人はあまり見かけない。
779デフォルトの名無しさん:2008/08/08(金) 15:47:51
const char *p
これだと、文字列は不変でも、ポインタ自体が入れ替わる可能性があることを
考えれば、
const char a[]
こっちの方がガードは堅い気もする…
780デフォルトの名無しさん:2008/08/08(金) 15:49:52
>>779
そこを気にするならconstもう一個つけてればいいだけじゃね?
781デフォルトの名無しさん:2008/08/08(金) 15:52:03
あとはタイピングの手間を気にするかどうかか…
782デフォルトの名無しさん:2008/08/08(金) 16:01:13
char *ptr="hoge";
char buf[]="hoge";

これはアセンブラになると(古くて済まんが68000の場合)、
_ptr:
ds.l _temp
_temp:
dc.b 'hoge',0

_buf:
dc.b 'hoge',0

というふうに展開される。ptrは移動可能なポインタなのに対し(たとえばptr++ができる)、
bufは移動不能なので、ptrの方が自由度が高い分、メモリを4バイト余計に消費する。
なので原理的には buf[] 形式で宣言した方が低コストではある。
783デフォルトの名無しさん:2008/08/08(金) 16:04:23
const char *const ptr = "hoge";
784デフォルトの名無しさん:2008/08/08(金) 16:12:44
そこまでやるくらいなら
#define HOGE "hoge"
とでもしちゃうな俺は
785デフォルトの名無しさん:2008/08/08(金) 16:29:32
>779
const が何を修飾しているのかを考えるべき。

---------------------------------------------------------------------
      char *       p0 = "aaa";  //文字もアドレスも変数も変更可
const char *       p1 = "bbb";  //文字はだけ変更不可
const char * const p2 = "ddd";  //全て変更不可

int main(void)
{
        p0 = "zzz";//OK constでないので変更可
        p1 = "zzz";//OK constでないので変更可
        p2 = "zzz";//NG p2 は const

        *p0 = 'A';//OK
        *p1 = 'A';//NG  型 char は const
        *p2 = 'A';//NG  型 char は const

        p0[0] = 'a';//OK *の時といっしょ
        p1[0] = 'a';//NG *の時といっしょ
        p2[0] = 'a';//NG *の時といっしょ

        return 0;
}


>784
それをソースの至る所で使った結果、コンパイラが最適化しなかった場合にROM(場合によっちゃRAM)不足に陥る場合もありますね。
786デフォルトの名無しさん:2008/08/08(金) 16:44:28
>>785
三つのうち一番上は断言できないだろ
787デフォルトの名無しさん:2008/08/08(金) 17:08:07
「LINK : fatal error LNK1168: ファイル C:\Users\user\Desktop\ノルマ\Debug\project.exe を開いて書き込むことができません。」っていうメッセージが出てビルドできないんですが、
一体どうしたら解決できるのでしょうか
788デフォルトの名無しさん:2008/08/08(金) 17:08:37
実行中とか?
789デフォルトの名無しさん:2008/08/08(金) 17:16:38
他にファイル開いてないんですけど
790デフォルトの名無しさん:2008/08/08(金) 17:20:32
デバッグ中なんじゃないの?
VC++2つ開いてたりしない?

試しにクリーンからやってみ
791デフォルトの名無しさん:2008/08/08(金) 17:30:04
クリーンとは?
792デフォルトの名無しさん:2008/08/08(金) 17:35:11
make clean つーか、ビルドメニューにクリーンって無いか?
エクスプローラーやコマンドラインからEXE消してみてもいいし。
793デフォルトの名無しさん:2008/08/08(金) 17:37:49
「このファイルが他のプロセスによって使用されていないこと、また書込み禁止になっていないことを確認してください。」と出て削除できないです
794デフォルトの名無しさん:2008/08/08(金) 17:53:29
やっぱり実行中なんだろう。
デバッグ中で無けりゃ、タスクマネージャからプロセス探して殺してみそ
795デフォルトの名無しさん:2008/08/08(金) 18:41:19
>>794
できました。ご丁寧にありがとうございました
796デフォルトの名無しさん:2008/08/08(金) 18:43:25
>>794
OSごと再起動しちゃったほうが早くね?
797デフォルトの名無しさん:2008/08/08(金) 18:50:49
質問です。今プログラムを解読しているんですが、わからない点がいくつかありますのでご教授お願いします。
まずif(!(t=search_hash(ltbl, buf)))はどういう条件なんでしょうか。tは構造体ポインタ変数、ltblはポインタ配列、bufは配列です。
それと、strdup(str)という関数があるのですが、調べても出てきませんでした。別に宣言されてないので自作の関数ではないようです。
これは何の関数なんでしょうか。それと、if (ltbl[i])、if(!t)というのもあるのですが、if文の条件が式でないので意味がわからず困ってます。
よろしくお願いします。
798デフォルトの名無しさん:2008/08/08(金) 18:55:04
>>797
代入した結果のtが真なら!演算子で偽になる、そんな感じ
799デフォルトの名無しさん:2008/08/08(金) 18:59:41
>>797 エスパー募集か?

C/C++の宿題を片付けます 114代目 http://pc11.2ch.net/test/read.cgi/tech/1216746971/

475 名前:デフォルトの名無しさん[] 投稿日:2008/07/28(月) 19:02:10
[1] 授業単元:プログラミング
[2] 問題文:以下のデータを用いてハッシュ表を構築するプログラムを作成し、ハッ
シュ法を用いた検索に関して考察せよ。
 ファイル:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7477.txt
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:2008年7月30日(水)
[5] その他の制限: 特になし

前スレでもお願いしましたが、リンク先のサイトのプログラムがよくわからなかったので、
こちらで新しく簡単なのを作ってもらいたいです。参考にしたいので、よろしくお願いします。

539 名前:デフォルトの名無しさん[sage] 投稿日:2008/07/29(火) 05:53:37
>>475>>476
考察というのがよくわからんけど一応クローズドハッシュのプログラム。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7528.txt
800デフォルトの名無しさん:2008/08/08(金) 19:03:18
何でこう言うのって最初から全部宿題スレで回答してもらったんですけど
中身が良く分からないので教えてくれませんか?って言わないんだろうね
801デフォルトの名無しさん:2008/08/08(金) 19:05:46
俺なら書いた本人に聞けって言っちゃうと思う
802デフォルトの名無しさん:2008/08/08(金) 19:13:11
単に代入文の入ったif文みたことないだけじゃないのか?
803デフォルトの名無しさん:2008/08/08(金) 19:15:17
なるほど、真偽で判断しているんですね。
ありがとうございました。
804デフォルトの名無しさん:2008/08/08(金) 19:18:00
>>800
宿題スレに投げてくるときでさえ、
課題を自己解釈しておかしな問に書き換えて送ってくる。
805デフォルトの名無しさん:2008/08/08(金) 19:19:18
>797

・真偽値について勉強
・NULLの定義について勉強
・代入文それ自体も値を持つことについて勉強
・値も式であることについて勉強
・if 文の条件は式ではないことについて勉強

でいけます。
806デフォルトの名無しさん:2008/08/08(金) 19:25:55
>>805
丸投げした意味ないな
807デフォルトの名無しさん:2008/08/08(金) 19:42:18
strdup関数ぐぐったらありました。すみません。
808デフォルトの名無しさん:2008/08/08(金) 19:49:31
>>785
char *p0 = "aaa"; //文字もアドレスも変数も変更可
コンパイラによっては文字変更不可
*p0 = 'A';//NG
809デフォルトの名無しさん:2008/08/08(金) 19:51:27
他の方に作ってもらって連絡取れないんです、とかもあるぜ。
やつらはいろいろな手法を繰り出してくるから気を抜けない
810デフォルトの名無しさん:2008/08/08(金) 19:55:56
いやいやエスパーでないと質問の意味が分からないのが問題だろ

ユーザ定義の関数がどんな引数を受け取ってどんな戻り値を返すかなんて自由だし
グローバル変数でやりとりしてるかもしれないのに
811デフォルトの名無しさん:2008/08/08(金) 19:58:39
顔文字変数名についてネタ希望

#include<iostream>
using namespace std;

void main(void){
for(;;){
char ToT[16]="( ゚A゚)y-・~~";

cout << ToT;
}}
こんな感じの…
812デフォルトの名無しさん:2008/08/08(金) 19:59:07
即レスで答えがついて終わってたのに何騒ぎ立ててんだよ
813デフォルトの名無しさん:2008/08/08(金) 20:43:47
>>810
「普通の人には興味ありません!!!」
814デフォルトの名無しさん:2008/08/08(金) 20:50:57
>>728
fflush(stdin) って、一般的には環境依存ではなかったでしょうか?
815デフォルトの名無しさん:2008/08/08(金) 21:05:37
>>814
環境依存です
816デフォルトの名無しさん:2008/08/08(金) 21:35:12
>>813
現在53人のエスパーが待機してます
エスパーが質問に答えるスレ
http://pc11.2ch.net/test/read.cgi/tech/1187922645/
817デフォルトの名無しさん:2008/08/09(土) 10:40:16
int mojichk(const char* data)
{
int mojicode = data[0] << 8 | data[1];
//処理

}

S-JISのデータをintに変換している処理なんですが
思ったように動かないのでintの中身を調べたところ
ffffxxxx (xxxxはdata[0]data[1]の中身)

でした。

これはコンパイラ依存なんでしょうか?
818デフォルトの名無しさん:2008/08/09(土) 10:42:20
>>817
char が signed か unsigned かの問題
コンパイルオプションで char を unsigned 指定するか
unsigned char と明示的に指定すればおk <- こっちのほうがオススメ
819817:2008/08/09(土) 10:42:35
記入漏れです。

>でした。
>これはコンパイラ依存なんでしょうか?

でした。
期待していたのは0000xxxx だったのですが ffffxxxx となっていました。
これはコンパイラ依存なんでしょうか?
820817:2008/08/09(土) 10:43:19
>>818
あーそういうことですか。

わかりました。
821デフォルトの名無しさん:2008/08/09(土) 13:44:21
符号拡張で調べておくといい
822817:2008/08/09(土) 13:50:46
つまり

charだと8bit目が符号になるのでそれをintにキャストキャストした場合
たとえばcharに0x82が入っててキャストした場合0xffffff82となる
で、0x72などであれば0x00000072となる

ということでOKですよね?
823817:2008/08/09(土) 13:51:18
>charだと8bit目が符号になるのでそれをintにキャストキャストした場合
charだと8bit目が符号になるのでそれをintにキャストした場合

余分に・・・orz
824デフォルトの名無しさん:2008/08/09(土) 14:41:13
>>822
いいえ、charがsignedであるという仮定をしてはいけません。つまり、
その説明だとsigned charの振る舞いを説明したことにしかなりません。
825デフォルトの名無しさん:2008/08/09(土) 15:18:24
便乗だけど、修飾なしのcharの符号が環境依存なのは何か理由があるの?
826デフォルトの名無しさん:2008/08/09(土) 15:33:31
規格が出来る前みんな好き勝手に作ってて、規格化するとき抵抗勢力に負けて統一できなかったんじゃないか、という俺の予想
827デフォルトの名無しさん:2008/08/09(土) 16:40:46
>>825
格上げ(promotion, 暗黙の型変換)の仕様がまちまちだったからなんです。
828デフォルトの名無しさん:2008/08/09(土) 23:48:54
リストに要素を辞書順に追加・更新する関数 struct slist addsort(struct slist*, char*, int)を以下を満たすように定義せよ.

すでに辞書順に並んでいるリストにaddsortして得られる結果のリストも辞書順に並んでいる.
入力の学生がすでにリストに含まれているときはその点数を更新する.
辞書順の検査は, #include <string.h>内の関数strcmp(str1,str2)で調べる.
という課題で、addsortは再帰関数になるらしいのです。でも再帰関数のやり方がわからず・・・一応ほかの部分は書いてみたので
アドバイスお願いします。

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

struct slist{
char name[10];
int score;
struct slist *next;
};

void printlist(struct slist *s){
if(s==NULL){
printf("\n");
}else{
printf("%s(%d)",s->name,s->score);
printlist(s->next);
}
}

続きます
829デフォルトの名無しさん:2008/08/09(土) 23:49:31
続きです

struct slist *addsort(struct slist *input,char *str,int x){
struct slist *output;
output=malloc(sizeof(struct slist));
if(output==NULL) exit(0);

if(strcmp(input->name,str)==0){
output->score =x;
return output;
}else{


}

}

main(){
struct slist *a;
a = addsort(NULL,"Bob",77); printlist(a);
a = addsort(a,"Alice",88); printlist(a);
a = addsort(a,"Carol",55); printlist(a);
a = addsort(a,"Bob",100); printlist(a);
}

お願いします。
830デフォルトの名無しさん:2008/08/09(土) 23:54:25
宿題スレがいいんじゃないかな
831デフォルトの名無しさん:2008/08/09(土) 23:55:33
あそこだとまるまる答えを聞く感じになってしまうと思って・・・気後れしてしまって;
832デフォルトの名無しさん:2008/08/10(日) 00:05:19
C言語できる人がうらやましい。 
勉強すれば習得できるものなのでしょうかね。 
833デフォルトの名無しさん:2008/08/10(日) 00:08:49
少なくとも勉強しなければ習得はできないな
834デフォルトの名無しさん:2008/08/10(日) 00:25:49
>>828
一行穴埋めにしてみた
ほにゃらら=ほげほげ となる式
struct slist *addsort(struct slist *input,char *str,int x){
struct slist *output;
int strcmp_result=0;

if(input!=NULL) strcmp_result=strcmp(input->name, str);

if(input==NULL || strcmp_result>0){
output=malloc(sizeof(struct slist));
if(output==NULL) exit(1);
strcpy(output->name, str);
output->score=x;
output->next=input;
return output;
}
if(strcmp_result==0){
input->score =x;
}else if(strcmp_result<0){
/* ここに一行ほげほげ 再帰ということはもちろん… */
}
return input;
}
835デフォルトの名無しさん:2008/08/10(日) 00:36:09
先超されたか
836デフォルトの名無しさん:2008/08/10(日) 00:37:13
できないやつはできないものらしい
論理能が必要とかなんとか
837デフォルトの名無しさん:2008/08/10(日) 00:43:38
再帰でできることが分かってるなら、終了条件くらいしか考えることないのにね。
838834:2008/08/10(日) 00:45:05
>>837
再帰で作るのは普通に難しかったよ
やってみるよろし
839デフォルトの名無しさん:2008/08/10(日) 00:47:31
>>838
やってみたよ
最初に書かれてたコードにミスがあったからちょっと時間かかったけど
そこまで難しくはないと思うが。
840デフォルトの名無しさん:2008/08/10(日) 01:04:40
struct slist{
char name[10];
int score;
struct slist *next;
};

みたいに構造体の中で自分の型のポインタを使う事の呼び方ってありますか?
841デフォルトの名無しさん:2008/08/10(日) 01:05:41
自己参照構造体
842デフォルトの名無しさん:2008/08/10(日) 01:06:02
>>840
自己参照構造体
843デフォルトの名無しさん:2008/08/10(日) 01:07:04
今度は私の勝利のようだな
844840:2008/08/10(日) 01:07:59
ありがとう
845デフォルトの名無しさん:2008/08/10(日) 15:22:42
アンカー分の差だなw
846デフォルトの名無しさん:2008/08/10(日) 17:12:41
ある数字(1-100のランダムな数字)を
他のファイル(txtファイル)として出力するにはどうすればいいでしょうか?
fopenを使うやり方教えてください。
847デフォルトの名無しさん:2008/08/10(日) 17:18:20
FILE * fp = fopen("他のファイル(txtファイル)", "w");
fprintf(fp, "%s\n", "ある数字(1-100のランダムな数字)");
fclose(fp);
848デフォルトの名無しさん:2008/08/10(日) 17:22:21
>>847
THXTHX さっそくやってみる
これは通常のループ(forとか)にもそのままつっこめるんだよね?(2行目)
849デフォルトの名無しさん:2008/08/10(日) 17:29:25
出力先がファイルなだけ
850デフォルトの名無しさん:2008/08/10(日) 17:35:01
CやってC#やってCに戻ってくるとextern指定って気持ち悪くないですか?
851デフォルトの名無しさん:2008/08/10(日) 17:44:46 BE:274028933-2BP(303)
CからC#とか似てる他の言語にすすむと文法が微妙に違ったりで気持ち悪い
852デフォルトの名無しさん:2008/08/10(日) 17:50:00
文法が違うならまだしも一見同じ書き方でも仕様が違うのが気持ち悪い
853デフォルトの名無しさん:2008/08/10(日) 17:56:01
javaのpublic staticがメチャクチャ気持ち悪い
854デフォルトの名無しさん:2008/08/10(日) 18:04:02
そう?

「オーナーが決まってて公開される静的なメンバ」なんて
分かりやすいと思うけど。C++にも普通にあるし。
Cのようにプリプロセッサに頼ったりグローバル変数に
配置するよりも明確で良い。

プリプロセッサを否定する訳ではない。用途が違うので。
855デフォルトの名無しさん:2008/08/10(日) 18:06:26
public static をグローバルと何が違うんだ?と考え込んだ思い出
856デフォルトの名無しさん:2008/08/10(日) 18:27:25
シフト演算子使うときってビッグエンディアンとかリトルエンディアンとか別に関係ないっすよね?
857デフォルトの名無しさん:2008/08/10(日) 18:29:22
ないよ
858デフォルトの名無しさん:2008/08/10(日) 18:32:58
>>856
リトルエンディアン、ビッグエンディアンはあくまでレジスタ以外の
メモリなんかに格納した際の状態だから。
レジスタに取り出したら基本的にはビッグエンディアン状態
859デフォルトの名無しさん:2008/08/10(日) 18:35:29
>>854
意味とかはどうでもいいんだが。
860デフォルトの名無しさん:2008/08/10(日) 18:59:18
>>834
うおーでけました!
5行目のif文は{}で囲まなくても大丈夫なんですねー
勉強になります。ありがとうございます!
861デフォルトの名無しさん:2008/08/10(日) 19:42:13
>>860
俺は1文でも{ }で囲む主義
862デフォルトの名無しさん:2008/08/10(日) 19:56:34
>>861
後から増やすとき楽だしねー
俺は気分で変える主義
863デフォルトの名無しさん:2008/08/10(日) 20:10:42
>>862
それは主義とはいわない
864デフォルトの名無しさん:2008/08/10(日) 20:32:58
1行で括弧付ける主義でも付けない主義でもいいが
混合はやめたほうがいい
865デフォルトの名無しさん:2008/08/10(日) 20:56:47
仕事でやってる人は規約もあるだろうし
866デフォルトの名無しさん:2008/08/10(日) 20:58:13
整形ツール通すことにしておけば気にならない
867デフォルトの名無しさん:2008/08/10(日) 22:31:40
任意のアドレスを指定してメモリを確保することはできるorできない?今夜のご注文はどっち?
868デフォルトの名無しさん:2008/08/10(日) 22:34:04
>>867
mmap VirtualAlloc 等、標準以外の方法を使えば可能
869デフォルトの名無しさん:2008/08/10(日) 22:34:16
普通できないので、お使いのOS、ハードのマニュアルをお読みください
870デフォルトの名無しさん:2008/08/10(日) 22:34:23
あなたがアプリならできません。
あなたがカーネルならできます。
871デフォルトの名無しさん:2008/08/11(月) 00:07:10
質問なんですけど、

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

int main(int argc, char *argv[])
{
char st[]="run";
char *p;

p=st;
*p="!";

printf("%s\n",st);

system("PAUSE");
return 0;
}

これで実行したら、
http://koideai.com/up/src/up3538.jpg
一文字目が変になってしまいます。
どうやって一文字目を「f」にするか教えてもらえないでしょうか?
872デフォルトの名無しさん:2008/08/11(月) 00:08:45
!とfは違うでしょ
'f'と指定
873デフォルトの名無しさん:2008/08/11(月) 00:09:37
連続ですいません。
間違えてました。

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

int main(int argc, char *argv[])
{
char st[]="run";
char *p;

p=st;
*p="f";

printf("%s\n",st);

system("PAUSE");
return 0;
}

でした。
874デフォルトの名無しさん:2008/08/11(月) 00:10:14
*p="f";→*p='f';
875デフォルトの名無しさん:2008/08/11(月) 00:12:23
>>
>>874
876デフォルトの名無しさん:2008/08/11(月) 00:13:00
>>872
>>874
アリガトウございました。
出来ました。
877デフォルトの名無しさん:2008/08/11(月) 00:53:53
つーかそれでコンパイル通るのかよ
878デフォルトの名無しさん:2008/08/11(月) 01:01:29
そりゃ文法的には誤ってないし通るんじゃ?
試してないけど
879デフォルトの名無しさん:2008/08/11(月) 01:02:18
const char* からcharへの変換って警告は出てるだろうけど
880デフォルトの名無しさん:2008/08/11(月) 01:16:46
「移植性のないポインタ変換」を警告で済ます環境とコンパイルエラーになる環境があるようだ
881デフォルトの名無しさん:2008/08/11(月) 02:42:30
リテラルの最初の文字を指すポインタ(ポインタ(整数)値)をchar型へ格下げしてるだけだもんな

10億ぐらいのコンピュータで試せば、
もしかしたらfunって動作するかもしれないよな
882デフォルトの名無しさん:2008/08/11(月) 02:59:31
>>881
アラインメントの関係で f はまず考えられない
d(0x64) とか hlptx に書き換わる可能性なら十分あるけど
883デフォルトの名無しさん:2008/08/11(月) 03:30:13
ずっと昔は、ポインタと(十分大きな)整数が互いに変換可能であることが保証されていた。
しかしその動作の結果は根本的に処理系依存であったので(「移植性のない」とはそういう意味である)、
ANSI/ISO規格は、高い移植性という目標のために、これを保証することをやめてしまった。
だから多くのコンパイラはこれに対して警告を出すし、そういうことに特にうるさいコンパイラは
よりいっそう厳しくエラーであるとみなしてコンパイルすることを拒否する、ということになる。
884デフォルトの名無しさん:2008/08/11(月) 06:24:56
>ポインタと(十分大きな)整数が互いに変換可能であることが保証

あのー、ANSI/ISOでも保証されてますけど。
885デフォルトの名無しさん:2008/08/11(月) 07:11:42
そう思うなら言語仕様書の該当箇所を示してごらん。
886デフォルトの名無しさん:2008/08/11(月) 07:22:22
6.3.2.3
任意のポインタ型は整数型に型変換できる。


バカは、整数型とint型の区別がつかないから。
887デフォルトの名無しさん:2008/08/11(月) 07:24:44
で、自分がどの版を見てるのか理解してるのかね。
888デフォルトの名無しさん:2008/08/11(月) 07:24:47
>>885
なぁintptr_tって知ってる?
889デフォルトの名無しさん:2008/08/11(月) 07:26:33
ちなみにC++

5.2.10.4
A pointer can be explicitly converted to any integral type large enough to hold it.
.5
A value of integral type or enumeration type can be explicitly converted to a pointer. A pointer converted to an integer of
sufficient size (if any such exists on the implementation) and back to the same pointer type will have its original value;

だそうです。
890デフォルトの名無しさん:2008/08/11(月) 07:27:24
>>887
で、自分がどれだけ恥の上塗りをしてるのか理解してる?
891デフォルトの名無しさん:2008/08/11(月) 07:29:27
C99なら、888の通りintptr_tやuintptr_tで確実に保証されてるね。
892デフォルトの名無しさん:2008/08/11(月) 07:45:27
それにしても質問の程度が入門をはるかに下回る初心者レベルばかりだな
893デフォルトの名無しさん:2008/08/11(月) 07:47:13
整数をポインタに出来ないと組み込み機械のプログラムが出来ない
(short*)0x12345678 = 0xFF;
894デフォルトの名無しさん:2008/08/11(月) 07:48:50
入門してから初心者じゃないの?
895デフォルトの名無しさん:2008/08/11(月) 07:51:10
雑談はスレ違い
他所でやれ
896デフォルトの名無しさん:2008/08/11(月) 08:36:16
int *p;
p = (int *)0x12345678;
*p = 0xFF;
897デフォルトの名無しさん:2008/08/11(月) 08:37:38
>>893はネタと思ってたのに>>896が答えちゃったよ。

898デフォルトの名無しさん:2008/08/11(月) 13:09:29
ガベージコレクションってどうなの?
899デフォルトの名無しさん:2008/08/11(月) 13:11:02
>>898
Cの標準機能ではありません
900デフォルトの名無しさん:2008/08/11(月) 13:15:45
C言語なんかでお行儀の悪いプログラム書いてメモリを開放しないで・・
ってのがよくあったのでできた機能だし>GC
901デフォルトの名無しさん:2008/08/11(月) 13:17:59
こんにちは質問です
決められた範囲(こちらで指定する)の数字をスロットのように表示させるにはどうすればいいでしょうか?
画面はコマンドプロンプトでjpgなどは無しでおねがいします
902デフォルトの名無しさん:2008/08/11(月) 13:19:44
コマンドプロンプトだと、実行環境によってはテキストの表示開始位置を
制御できない=新しく表示するたびにスクロールしちゃう
903デフォルトの名無しさん:2008/08/11(月) 13:26:18
できるとしたらたぶんキャリッジリターン('\r')を使う
904デフォルトの名無しさん:2008/08/11(月) 13:30:20
cmd.exeでは無理だな
MS-DOS時代の遺産command.comなら出来るかもしれない
905901:2008/08/11(月) 13:53:55
また、スペースキーを押した場合そのスロットが止められるように とのことなんですが・・・
ループ処理で、printfで表示したものを消す→表示→消す→表示
みたいなやり方とかあるんでしょうか?
また後出しになって申し訳ありませんが
kbhit(),_getch() 関数を使用する
そうです。関係なかったらすみません
906デフォルトの名無しさん:2008/08/11(月) 13:57:21
節子、スレ違うやん。宿題スレや
907デフォルトの名無しさん:2008/08/11(月) 14:04:56
>>900
GCが出来たのはもともとインタプリタで必要だったからじゃないの?
908901:2008/08/11(月) 14:08:13
すみませんアチラに移動します
909デフォルトの名無しさん:2008/08/11(月) 14:10:46
>>907
いいえ違います。
GCはジョン・マッカーシーが関数型言語であるLispに使うために考え出しました。
910デフォルトの名無しさん:2008/08/11(月) 14:26:34
>>909
lisp コンパイラ? lisp インタプリタ?
まあ、lisp はつくづく偉大だと思います。
911デフォルトの名無しさん:2008/08/11(月) 14:37:27
インタープリタだろ。
でも、インタープリタだったから必要だったわけじゃないだろうな。
912デフォルトの名無しさん:2008/08/11(月) 14:57:07
C言語で会話するスレとか立ててよエロい人
913デフォルトの名無しさん:2008/08/11(月) 14:58:33
プログラム言語で会話するスレ
http://pc11.2ch.net/test/read.cgi/tech/1179157784/
914デフォルトの名無しさん:2008/08/11(月) 19:00:04
>>904
cmd.exe(というよりNTのコンソール窓)はWin32 APIで好きにできるだぞ。
915デフォルトの名無しさん:2008/08/11(月) 20:22:34
eclipse上でCの開発環境を構築する方法をどなたか教えてください。
916デフォルトの名無しさん:2008/08/11(月) 20:26:46
もう出来てるじゃん。
917デフォルトの名無しさん:2008/08/11(月) 20:27:30
>>915
すれ違いですし普通にぐぐるとでてきますよ
918デフォルトの名無しさん:2008/08/11(月) 20:28:03
>>915
ダウンロードするときC/C++つきの選べ
919デフォルトの名無しさん:2008/08/11(月) 20:31:16
スレチすんませんでした
920デフォルトの名無しさん:2008/08/11(月) 20:55:37
CってLinuxとwindowsどっちにむいてるの?
921デフォルトの名無しさん:2008/08/11(月) 20:57:43
どっちにも向いてななんていない
OSなんてみちゃいねぇ
922デフォルトの名無しさん:2008/08/11(月) 20:57:58
どっちにも向いてない
923デフォルトの名無しさん:2008/08/11(月) 21:05:30
ハンゲーム − チョコットランドと言うゲームで
NPC_2047から始まるクエストのプログラムで教えて頂きたいのです
クエストを受ける→クリアを素材、回数制限をなくしたくて
いろいろ試しているのですが
クエストが止まる、うけれなくなるの繰り返しで進めません
どうかご教授おねがいします
プログラムを書きたいのですが長すぎで省略すみません
924デフォルトの名無しさん:2008/08/11(月) 21:12:52
スレチ
925デフォルトの名無しさん:2008/08/11(月) 21:38:36
頼むなら宿題スレ行けよ
926デフォルトの名無しさん:2008/08/11(月) 21:39:56
こんなの送りつけられても困ります
927デフォルトの名無しさん:2008/08/11(月) 21:44:00
>>923
チートすんなゴミ
928デフォルトの名無しさん:2008/08/11(月) 21:45:50
そもそもC言語なの?
929デフォルトの名無しさん:2008/08/11(月) 21:49:10
そもそも日本語があやしい
930デフォルトの名無しさん:2008/08/11(月) 22:14:51
ひょっとして猫なんじゃね?
931デフォルトの名無しさん:2008/08/11(月) 22:20:17
猫じゃしょうがないな
932デフォルトの名無しさん:2008/08/11(月) 23:11:18
自分はまだif文でつまずいています
933デフォルトの名無しさん:2008/08/11(月) 23:24:24
それはおめでたいですね
934デフォルトの名無しさん:2008/08/11(月) 23:31:43
配列を使用して
「abc」 次はこれに「de」を足して「abcde」
さらに「fg」足して「abcdefg」って出力するにはどうすればいいですか?

足すのはループで処理しようと思っていますが、どうにも上書きになってしまいます
935デフォルトの名無しさん:2008/08/11(月) 23:33:58
恥ずかしいです。

つまずいていても前に進み今はポインタの一歩手前です。

sizeof演算子
ビット演算子
swichなどみなさんどのようにして自分のものに出来たのでしょうかorz
まったく使いこなせなくつまずいています・・・。
チラ裏すみません・・・。
936デフォルトの名無しさん:2008/08/12(火) 00:13:55
>>934
strcatでも使えば?
937デフォルトの名無しさん:2008/08/12(火) 00:16:42
char array[100];
strcpy(array, "abc");
printf("[%s]\n", array);
strcat(array, "de");
printf("[%s]\n", array);
strcat(array, "fg");
printf("[%s]\n", array);
938デフォルトの名無しさん:2008/08/12(火) 00:18:11
>>936
おお!THXTHX 配列は2個使用するワケだね?OKOK!
939デフォルトの名無しさん:2008/08/12(火) 00:20:01
void myStrCat(char * p, const char * str)
{
while (* p++) ;
while (* p++ = * str++) ;
}
940デフォルトの名無しさん:2008/08/12(火) 00:33:34
それはcopyじゃ?
941デフォルトの名無しさん:2008/08/12(火) 00:36:53
最初に while(*p++); でnullまで進めてるから合ってるだろう

あれ?null文字の一つ後ろまで飛んでね?
942デフォルトの名無しさん:2008/08/12(火) 01:07:36
とりあえず用件を満足してみる

#include<stdio.h>
int main()
{
char arry[8];
int i;
for(i=0 ;i<7;i++)
{
arry[i]='a'+i;
arry[i+1]='\0';
if(i==2||i==4||i==6)
printf("%s\n",arry);

}
return 0;
}
943デフォルトの名無しさん:2008/08/12(火) 04:49:21
>>939
while (* ++p) ;
944デフォルトの名無しさん:2008/08/12(火) 06:45:11
>>943
1文字目が既にNULLだったらどうすんだ

while (*p) p++;
945デフォルトの名無しさん:2008/08/12(火) 07:16:51
NULLはポインタに使え
おまえらが言ってるのはEOSだ
946デフォルトの名無しさん:2008/08/12(火) 07:36:24
>>945
NUL じゃないのでしょうか?いや、'\0' ではいけないでしょうか?
947デフォルトの名無しさん:2008/08/12(火) 08:10:48
NULだとNULLと混同するから良くない。'\0'ならいいんじゃね。
948デフォルトの名無しさん:2008/08/12(火) 08:24:16
NULLPO
949デフォルトの名無しさん:2008/08/12(火) 08:25:21
GALTU
950934:2008/08/12(火) 09:52:11
すみません、文字じゃなくて数字にするにはどうすればいいですか?
951デフォルトの名無しさん:2008/08/12(火) 09:55:26
意味が分からん

123 + 45 + 67 = 1234567 って事?
952934:2008/08/12(火) 10:05:17
>>951
そうです
953デフォルトの名無しさん:2008/08/12(火) 10:14:56
とりあえず>>942のソースを借りて

#include<stdio.h>
int main()
{
char arry[8];
int i;
for (i = 0 ; i < 7; i++)
{
arry[i] = '1' + i;
arry[i+1] = '\0';
switch (i)
{
case 2:
case 4:
case 6:
printf("%s\n",arry);
}
}
return 0;
}

こういうの?
954デフォルトの名無しさん:2008/08/12(火) 11:09:00
#include <stdio.h>

unsigned long icat(unsigned long a,unsigned long b);

int main(void){
unsigned long x = 123;
x = icat(x, 4567);
x = icat(x, 89);
x = icat(x, 0);
fprintf(stdout, "%lu", x);
return 0;
}

unsigned long icat(unsigned long a, unsigned long b){
unsigned c=10;
while(c<=b) c*=10;
return a*c+b;
}

こういうことじゃね?
955デフォルトの名無しさん:2008/08/12(火) 11:11:03
まちがえた cはun・・ longで
956デフォルトの名無しさん:2008/08/12(火) 11:36:03
すいません質問です

今、K&Rを読みながら標準関数を使用したCプログラムの勉強をしています。
文字入力を出力しながら、文字数をカウントして、EOFが来たら文字数を出力するプログラムなのですが、
コマンドラインからのEOFの入力方法がわかりません。

ネットで調べた限りどこに行っても「Ctrl+Z(UNIXでのCtrl+Dに相当)」と記載されているのですが、
実際にCtrl+Zを入力した所、「 ^Z 」と出力されてしまいます。

環境は
・WindousVista
・VS2008

ソースは
void main(){
long nc;
nc = 0;
while(getchar() != EOF)
++nc;
printf("%ld\n", nc);
getchar();
}

です。

よろしくお願いします。
957デフォルトの名無しさん:2008/08/12(火) 11:44:27
それが何か問題でも?
958デフォルトの名無しさん:2008/08/12(火) 11:54:08
>>957
私宛でしょうか?

最初はファイルのEOFというのはファイルに付加される文字コードなのでコマンドラインからは入力できないのかと思いましたが、
調べているとコマンドラインからEOFとなるデータを入力できると書いていました。(それがCtrl+Zだった訳なんですが)
ですが、自分の環境ではそれを行ってもループを抜けないので、どなたか解る方がいたら知恵を貸していただきたいなと思った訳です。
959デフォルトの名無しさん:2008/08/12(火) 11:57:39
>>958
EOFっていう制御コードはないよ

http://e-words.jp/p/r-ascii.html
これはアスキーコードだけど赤文字になってるのが制御コードと呼ばれる物
文字としては割り当てがなく、エディタなんかで改行コードなんかは独自に表示してたりする。
960デフォルトの名無しさん:2008/08/12(火) 12:09:29
>>958
コマンドプロンプトの仕様だから仕方ない
linuxのターミナルでやればctrl+Dは表示されない
961デフォルトの名無しさん:2008/08/12(火) 12:12:22
>>958
ループを抜けるには
>abcd[enter]
>Ctrl+Z[Enter]
のように単独で入力
962デフォルトの名無しさん:2008/08/12(火) 12:26:02
ご回答ありがとうございます。

>>959
なるほど・・・
サイトを見ている限り、用語の説明として
「ファイルの終端を示す特殊な記号」とか
お茶を濁したような表現から何から色々あって、よくわからないんですよね・・・

ここで言われる「ファイルの終わりを示す制御コード」というのは>>959さんの言う制御コードと違うんでしょうか?
「文字コード」の中にはEOFという制御コードが無いって意味ですよね?
つまり、コマンドラインから入力出切るのは「文字コード」だからEOFを表現出来なくて当然、という認識であってるでしょうか?
ごめんなさい、自分でも理解が低くて、言いたい事が上手く伝えられて無いかもです;;
ありがとうございました。

>>960
なるほど、環境によっても変わってくるんですね・・・
K&Rで勉強するならUNIXライクな環境の方がいいのかなぁ・・・
ありがとうございました。

>>961
単独入力で出来ました!!!!
あ〜とてもスッキリしました〜。
ありがとうございます!
963デフォルトの名無しさん:2008/08/12(火) 12:29:59
>>962
"cygwin" で調べてみてください。わたしはこの上で宿題をといています。
964デフォルトの名無しさん:2008/08/12(火) 12:34:52
>>962

EOFっていうのはファイルアクセス関数が便宜上ファイル終端になったというのを
通知するためのリターンコードの一種であるだけど思っています。

ポインターの中身が割り当てられてないもしくはポインターを返す関数が
不正終了した際はNULLを返すように。

普段、中の数字は何か意識をあまりしませんが(ポインターの場合は0かな?)

実際なんでもいいのでプレーンなテキストを用意し、秀丸なんかで開くと
EOF表示がありますが、バイナリーエディタで開くとコードは何もありません。
基本的には便宜上のものです。
965デフォルトの名無しさん:2008/08/12(火) 12:50:33
>>963
Win上でUNIXぽく作業できるんですね!
使って見ます。ありがとうございました。



>>964
なるほど、テキストを扱う物なのに最初からコマンドラインでイジろうとするのが間違ってますよね。
そっちを勉強して認識を深めたいと思います。
ありがとうございました。
966デフォルトの名無しさん:2008/08/12(火) 13:30:07
わかってないなー
テキストじゃなくてファイルストリーム
967デフォルトの名無しさん:2008/08/12(火) 13:52:07
>>966
多分、ストリームまったく理解してないです。
保存してあるデータを一繋ぎ(ストリーム)にして、作業できるようにするんですよね?
とりあえず、ファイル入出力関数を勉強してから出直してきます!

ありがとうございました。
968デフォルトの名無しさん:2008/08/12(火) 14:02:36
>>967
fopen(), fclose(), fprintf(), fscanf() の系統と、
open(), close(), read(), write() の系統があることに留意してください。
そして、両者の関係については、K&R2 8.5 をみていただければいいかと思います。
969デフォルトの名無しさん:2008/08/12(火) 14:35:18
>>968
具体的なアドバイスありがとうございます!
参考にさせてもらいます!
970デフォルトの名無しさん:2008/08/12(火) 15:20:32
下のようなInfoTableに、適切にFnameとcnameを入れて
ポインタをずらして、1番目、2番目の情報を取りたい
けど、なんかうまくいってません。

#define LineNum=256 #define Fmax=16
struct InfoTable
{
  int n;
  char *Fname[Fmax]
  int flg[Fmax]
}
int main
{
InfoTable *infT[50]
struct Tbl
{
char *cname[50];
InfoTable *inf[50];
}
for(int c=0,c<10 ,c++)
{
infT.Fname="filename ";/*ここには、その都度個別のファイル名が入る*/
  cname="" /* infT.Fnameの先頭から12文字を引いた文字列 */
 }

ここで、Tbl.cname[n]と、Tbl.inf[n]の値をポインタもとに
*で中身を参照したい。
}

作りがマズイですか?
971デフォルトの名無しさん:2008/08/12(火) 15:24:46
infT.Fname="filename ";
char型のポインターにいきなり文字列いれてもなあ。

char data[128] = "filename";

とか入れておいて

infT.Fname = data;

とかでないと無理よ
972デフォルトの名無しさん:2008/08/12(火) 15:25:40
>>970
1.領域を確保していない
2.型を勘違いしている

何をどうしたいのか分からない
973970:2008/08/12(火) 15:30:59
はい、行数多すぎと怒られたので、ダイジェストにしたんですが、
すみません。スレも残り少ないので.....
strcpy()とかしてます。

次スレあるか探して、数スレになるかもだけど、再度書きます。
974デフォルトの名無しさん:2008/08/12(火) 15:48:58
つーか新スレにいくくらいならここでいいよw
そんなにすぐに使い切らないからw
それにソースが長いけど公開できるなら宿題スレのロダにでもあげて
リンクだけここにはりなよw

C/C++の宿題を片付けます 115代目
http://pc11.2ch.net/test/read.cgi/tech/1217741118/1-10
975970:2008/08/12(火) 15:56:46
下のようなInfoTableに、適切にFnameとcnameを入れて
ポインタをずらして、1番目、2番目の情報を取りたい
けど、なんかうまくいってません。

#define LineNum=256
#define Fmax=16
struct InfoTable
{
  int n;
  char *Fname[Fmax];
  int flg[Fmax];
}
int main
{
InfoTable *infT;
struct Tbl
{
char *cname[50];
InfoTable *infT[50];
}
 
976970:2008/08/12(火) 15:57:38
 Tbl   table;
/* ファイル名を格納 */
for(int c=0,c<10 ,c++)
{
GetFikeNamae (GetFname, c);/* c に対応するファイル名ゲッター */
strcpy(infT.Fname[c],GetFname);
  strncpy(table.cname[c],&GetFname[12],strlen(GetFname)-12);
  /* infT.Fnameの先頭から12文字を引いた文字列 */
 }

/* pA 0番目の変数(ファイル名)のポインタを格納したい */
infT.Fname[0]=&infT.Fname[0];

for(c=0;c<10,c++)
{
printf("cname[%d] %s",c , *table.cname[c]);
printf("Fname[%d] %s",c, *table.intT.Fname[c]);
/* pB */
}

}

pAで、一番始めのポインタを格納したら、それポインタをずらしたら、
pBでファイル名が得られるようにしたい

作りがマズイですか?

977デフォルトの名無しさん:2008/08/12(火) 16:00:20
struct InfoTable
{
  int n;
  char *Fname[Fmax];
  int flg[Fmax];
}
struct Tbl
{
char *cname[50];
InfoTable *infT[50];
}

まず質問

この構造体の中でアスタリスク(*)ついてるのはポインターであって
文字や構造体そのものの配列ではないんだけどOKなの?
978デフォルトの名無しさん:2008/08/12(火) 16:00:52
見にくいし、まず #define の時点で間違ってる
979デフォルトの名無しさん:2008/08/12(火) 16:04:16
GetFikeNamae
ネーミングが駄目
980デフォルトの名無しさん:2008/08/12(火) 16:08:08
突っ込みどころが多すぎる
981デフォルトの名無しさん:2008/08/12(火) 16:11:29
GetFikeNamae
やるな。お前。センスあるぜ。
982970:2008/08/12(火) 16:14:45
>>979
あれ、本当だ、nameです。

>>981
照れます。

>>977
はい。

ポインタを各配列にいれて、順に、その配列に入っている先のポインタを
参照してファイル名を取得したいです。

cname[0],cname[1]......
Fname[0],Fname[1].....
には、ポインタを格納するでOKです。
983デフォルトの名無しさん:2008/08/12(火) 16:19:17
*table.cname[c]

これがなんなのか良く考えろ
table.cnameはポインタの配列で
table.cname[c]はポインタだろ?
984デフォルトの名無しさん:2008/08/12(火) 16:20:33
C99で構造体タグは自動でtypedefされたっけ?
985970:2008/08/12(火) 16:26:48
すると、以下の部分はポインタであって、文字列は入っていない。

printf("cname[%d] %s",c , *table.cname[c]);
printf("Fname[%d] %s",c, *table.intT.Fname[c]);
/* pB */

でOKですか?
表示させるために、pBを書いたけど、実際問題として、意図どおりのものは
既に格納されていると考えて良いですか?
986デフォルトの名無しさん:2008/08/12(火) 16:28:24
×ポインタであって、文字列は入っていない
○文字へのポインタを与えるべきところに文字を与えている
987デフォルトの名無しさん:2008/08/12(火) 16:29:18
>>990
次スレよろ
988デフォルトの名無しさん:2008/08/12(火) 16:31:04
だからまずdefineから間違ってるって言ってるだろ
教科書読み直せ
989970:2008/08/12(火) 16:31:27
>>986
分かったような.....
はずかぴーー
990デフォルトの名無しさん:2008/08/12(火) 16:31:28
コードがメチャクチャすぎ。
>GetFikeNamae (GetFname, c);/* c に対応するファイル名ゲッター */
GetFnameがない。


>InfoTable *infT;
infTはポインタなのに
>strcpy(infT.Fname[c],GetFname);
オブジェクトでアクセスしてる。

>for(int c=0,c<10 ,c++)
これもひどい。

コンパイルも出来ないようなコードで質問されても直しようがない。
991デフォルトの名無しさん:2008/08/12(火) 16:31:52
これコンパイル通らんだろ
992デフォルトの名無しさん:2008/08/12(火) 16:32:32
>>985
上を全然読んでないけどとりあえず
*table.cname[c] は文字列ではない
993デフォルトの名無しさん:2008/08/12(火) 16:33:33
HWからやりなおせ
994デフォルトの名無しさん:2008/08/12(火) 16:34:08
ビールうめぇ
995デフォルトの名無しさん:2008/08/12(火) 16:34:39
今度から俺もgetFilenamaeにするよ。
996970:2008/08/12(火) 16:38:17
>>991
抜粋してるので、不足分はありますが、通りますよ。
と、実際にコンパイル通っているのとは、違うかも。
スマン!皆さん!!


>>993
HWって?
997デフォルトの名無しさん:2008/08/12(火) 16:39:29
このカスは何がしたいんだ
998デフォルトの名無しさん:2008/08/12(火) 16:53:11
>>995
getFikenamaeだろう
999デフォルトの名無しさん:2008/08/12(火) 16:53:36
わかんない
1000デフォルトの名無しさん:2008/08/12(火) 16:54:14
余裕で1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。