#include<stdio.h>
int
main
(void
){
printf
("
>>1 "
"otu"
"\n");return 0;}
5 :
デフォルトの名無しさん :2008/07/26(土) 22:01:45
にしたかったのか
return 1
なんでプログラムを作る人よりプログラムを作らせる人のほうが楽で給料もいいのはどうして?
プログラムを作るのは誰でも出来るけど プログラムを作らせるのは誰でも出来るというわけではない
いいえ、思うように動いてくれないプログラマを叱咤激励するという激務が待っています。 ついでに言えば、社会常識のないプログラマの尻拭いや、構ってちゃんのプログラマのケアや、 使えない上司への報告や、理不尽なクライアントの交渉なども含まれますから楽だなんてとてもとても。
世の中全部、どの業界でも、物を作る人間より、それを右から左に流してる人間のほうが儲かってる。
いいえ、右から左に流している人間ではなく、右から左に流している人間が所属する会社が儲かっているのです。
代わり映えしない物に大した価値は無いだろ そのくせ人件費が掛かるとか救えねえ
凄い速度でレスがついたな
システムをカスタムメイドで作るよりは 業務のほうを一般的なものに合わせるほうが 効率がいいのにそうしないからな
鼬害のネタはほどほどにね
>>14 奨学金のシステムやったけど、導入の単位が市町村で、制度はほとんど同じなのに
やっぱ、自治体ごとに微妙に違うんだよな。
こんなの県や国単位で統一すれば、おんなじシステム使えて安くなるのにな。
>>16 同じ業務パッケージでも、サイトごとに修正を入れているものがほとんど
ソースコードの管理は大変だろうなと思ってしまう
マ板で語れアホ共
日本では理系は軽んじられすぎる
某国が日本を弱らせるために理系の待遇を悪くするように日本政府に干渉してきたんだよ。陰謀だよこれは
たぶんザビエルのせいだと思うよ
プログラム実行時に exp や pow の OVERFLOW エラーが出る原因は 扱える数の範囲を超えてるからでしょうか?
某国の陰謀か、ザビエルのせいか、扱える数の範囲が狭すぎるか、扱える数の範囲を超えているかのいずれかだね。
まったくザビエルのやつ・・・
int *p; p[3]; とかにアクセス出来るんですけど? ポインタって配列なんですか?
p[3]; は *(p+3); だと思う。
3[p]でもアクセスできるから3も配列だな
fgets()とかgets()の戻り値って何に使うんですかね? char*型じゃなくてもいい気がするんですけど。 str*系とかもそうですよね? 一体何に利用するんですか?
RTFM
>>30 まあ、そうでしょうが、それって現実的に使われてますかね?
strcpy(foo, strcpy(bar, strcpy(baz, "foobarbaz"));
こういう風ですかね、例えば。
sprintf("foo:%s", strcpy(foo, "abc")); こういうコードは稀に見かける。
strcpyはいいとして、fgetsはNULLを返すことがあるから、いったんテストしてからでないと使えないことが多いし。
とゆーか fftをつくりたいんだけど どういう風につくればいいのかビジョンがみえない。 ビジョンがみえればスイスイかけるんだけど。 ネットにあがってるのあるけどなげーよ。
>>35 古い本ですが、
Cによる科学技術計算/小池慎一/CQ出版 1987
いろいろなバリエーションがソース付で紹介されています。その手の本ではわりに有名。
物理シミュレーションってどうやればいいの?
41 :
41 :2008/07/27(日) 22:29:39
教授を人質にするなんて卑怯だぞ
>>41 まずはTabとかで見やすくしてくれると嬉しいな。
俺Linuxなんでconio.hがないんであれなんだが、どう
上手く行かないのかざっと説明してもらえるかい?
私が苦肉の策を講じて作成したプログラムですね、わかります てかあの状態でもアジがあると思ったんだけどなあ・・・
45 :
41 :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文字打つたびに秒数が表示されてしまいおかしなことになってしまうといった感じです。
>>41 ,45
ex31.txtが無いので実行できません
47 :
41 :2008/07/27(日) 23:27:50
>>44 やはり1文字ずつの表示だと自分のではダメだったみたいで・・・
>>46 大変申し訳ありませんでした。
ex31.txtの中身はA friend in need is a friend indeed.と書いたテキストファイルです。
50 :
41 :2008/07/27(日) 23:48:45
誘導ありがとうございます。 そちらのほうで質問してみたいと思います。
51 :
デフォルトの名無しさん :2008/07/27(日) 23:51:05
標準ライブラリ関数のtimeを使って 今日の日付(具体的には年月日)を配列に格納したいのですが たとえば「2008/07/27」のように項目ごとにスラッシュを入れて格納する方法はないでしょうか?
localtime→strftime
そんなに環境依存な話でもなくね?conio.hが含まれてるだけで。 入力される度にその行を頭から書き直すのが楽かもな。 それかエスケープシーケンス使ってカーソル位置制御って手もあるし。
55 :
54 :2008/07/27(日) 23:57:07
56 :
41 :2008/07/28(月) 00:14:12
>>49 ありがとうございます。
コンパイルはできたのですが、やはりエラーが出てしまいました。
参考に出来る部分もあると思うので頑張ってみます。
>>55 色々ありがとうございます。
それらの方法も試してみます。
初めまして。 自分は初めてプログラムを勉強しています。 「猫でも分かる C言語プログラミング」という本を見ていますが分からない部分があります。 char→文字 ing→整数 double→小数 というのは分かりましたが double「pat」 =3.1415926 int「mon」=2; float「flt」=1.2f; 「」のなかの文字は何を表しているのかが分かりません。 これは円周率についてプログラムを書いているみたいです。 もし「猫にも分かるプログラミング」の本を持ってる方いたらp51です・・・。 自分はまったく知識もないし、学校にも行っていません。 本当に初心者で恥ずかしいですがお願いします。
なんの釣りだよ
すみません自分のことを言ってると思いますが釣ってません
>>59 何でプログラミングでも始めようと思ったん
>>57 char→文字
int→整数
double→小数
これらは変数の型
つまり
int mon = 2;
と言うのは
int 型(整数を扱う型)の変数名 mon と言うものを宣言して
それを 2 で初期化してる
ITの3Kを知りどんなことをやっているのか興味を持ったからです。 初めてHello Worldを組んで成功して面白いと思ったのです。 しかし変数でつまずいています。 もっと言うとマイクロ社からDLする時点でつまずきました
>>57 ネタにしかみえない
>char→文字
>ing→整数
>double→小数 というのは分かりましたが
char型ってのは文字というより1バイトで表現できる数値型だよ。
たまたま文字コードもその範囲で表現できるので文字とかいってるけど。
ingじゃなくてintね
>double「pat」 =3.1415926
>int「mon」=2;
>float「flt」=1.2f;
これもよくわかんね〜
>>61 さん
宣言名ということはmonでなくてもいいということですか?
それとも決まっているのですか?
>>64 monでなくてもOK
任意で決めれます。
まー仕事でする場合は命名規則とかもあるだろうし、
monじゃなくても良いよ 変数名として使える文字はこれだけ ・小文字と大文字のアルファベット ・数字 ・_(アンダースコア)
みなさん本当にありがとうございます!! ネタであって欲しいぐらい初歩的なことですみませんでした・・・。
諦めずに頑張れよー
>>62 「きつい」「帰れない」「給料が安い」で興味を持つって凄いなあんた…
http://ja.wikipedia.org/wiki/3K もう居ないかも知れないが
一人で始めたんなら仕方ないけど身近に相談できる人を出来たら探した方が良い
深い知識があって親身に教えてくれる人な
今回みたいなので疑問に思うって事は後々でてくる
配列やポインタでも疑問点が解決できずに先に進めなくなる可能性があるから頼りになる人が必要になる
知識も無いのにネット上で情報を漁るのは危険だし
一冊読み終わるまではそいつに引っ張ってもらって分からない所をガンガン教えてもらう
ある程度まで進めれば自分で理解を試したり理解を深めていけるから
それまではそういう人に甘えてしまった方がいい
すいません。まだいます・・・。 近くに元プログラマーはいます。 その人に聞くことは出来ますが、出来るだけ自分でググッたり参考書をみて解決しないと自分のためにならないと思いました。 しかし、やはり一人だとすぐに分からないことが出てきて今回初めて質問してしまいました。 不快になった方もおられると思いますが温かい言葉ももらえて嬉しかったです。
死肉吹いたw
ぶっちゃけ、猫でもわかるCって嫌いなんだが。 表現も微妙で分かりにくい。そんなことない? 俺は新訂新C言語入門系列を使ってた訳だが。
書籍スレは別にあるぞ
すみません。
まだ起きてる方いますか?
#include<stdio.h>
int main()
{
double pai = 3.14159;
printf("円周率は%4.2fです。\n",pai);
return 0;
}
を作ると「円周率は3.14です」
となりますが「%4.2f」の部分がよく分かりません。
「猫にも分かる」p49には「%の次にーがないときは右つめになる」など色々解説してありますが理解できません。
先ほどえらそうな事言ってまた質問して情けないですがお願いします・・。
>>73 さん
遅くなりましたがこの書籍は2ちゃんとアマゾンで好評だったので手に取っただけです。
初心者の自分にはどれがいい悪いが分からなかったので
>>75 どういう形で表示するかを指定してて
%4.2f
この場合4は最大4桁
.2はそのうち小数点以下に2桁使うということです。
fは小数点を扱う変数を指定する場合に使います。
小数点がない場合はd
分かった!!
double pai = 3.14159;
printf("円周率は%4.2fです。\n",pai);
↑3.14159と%4.2fは繋がっていたんですね!!
>>76 さんありがとうございます!!
補足で %04.2f とすると 整数部分が一桁しかない場合は開いている桁の部分を0で埋めてくれます。
つまり03.14ってことですか?
80 :
76 :2008/07/28(月) 02:28:59
81 :
76 :2008/07/28(月) 02:30:33
>>79 イエス
ゲームなんかでスコア表示するときに桁がわかりやすくなるように
0で埋まってたりしますよね
あんな感じです。
あと本だけで覚えようとせずプログラムを実際に書いて実行できる
環境を用意して試してみることをおススメします。
ちなみに俺も補足すると >「%の次に-(マイナス)がないときは右つめになる」 と言うのは printf("%10.2f", pai); printf("%-10.2f", pai); と書いたら 結果は上から 3.14(10文字分表示出来るスペースを空けて右詰) 3.14 (10文字分表示出来るスペースを空けて左詰) とそれぞれなる
>>77 の感じが機械の少年ピーノの
,、 ワカッタゾォ!!!
ヘ○ 彡
/ノヽ_
i | l |i
っぽくて懐かしんだ
84 :
76 :2008/07/28(月) 02:41:30
とえらそうに書いてるが実際のところ書式の仕様は全部理解してなかったり・・ プログラム内容によっては使わないことが多いんだよな・・・
プログラムを「書くこと」とはキーパンチャーと見つけたり! っていつの時代だよ!
88 :
76 :2008/07/28(月) 02:47:48
>>85 あー書き方が悪かったですね。
小数点を扱わない整数型の変数の場合は・・・ということでした
intとかshortとかね
89 :
デフォルトの名無しさん :2008/07/28(月) 05:10:08
はじめまして。2次元配列について質問です。 10万×10の配列を取って計算したいのですが、 プログラムを実行すると動作が停止してしまいます。 100×10程度にすれば計算可能なようですが、 10万×10の配列の計算を可能にさせるような方法はありませんか?
int *p; p = malloc
>>89 ヒープの割り当てが少ないんじゃないの?
その二次元配列の頭にstatic つけてコンパイルしなおしてみなよ。
ちなみにint型の2次元配列?
10万x10x4バイト場所とるよ・・・
92 :
89 :2008/07/28(月) 05:30:00
早速のアドバイスありがとうございます。 staticをつけてコンパイルをしてみたところ、 動作の停止は避けられたのですが、計算結果が帰ってきません。 グローバル変数にしてみても、ダメなようです。 2次元配列はdouble型です。
93 :
91 :2008/07/28(月) 05:36:31
でかw つーかそのソース晒せない? なんか間違ってそう・・・
94 :
89 :2008/07/28(月) 05:43:29
やっぱり、大きいですか… ソースは晒せますが、200行くらいあります
95 :
91 :2008/07/28(月) 05:51:48
96 :
89 :2008/07/28(月) 06:00:28
91さん。ありがとうございます。 もう一度、よく考えてみます。 ヒープの割り当てが足りないとのことでしたが、 デスクトップアプリケーションヒープを8MBに設定するとかはダメですか?
97 :
91 :2008/07/28(月) 06:04:16
>>96 でもstaticで計算失敗してるってそもそもロジックがおかしいとしか思えん。
static無しで8MBのテーブルとろうとすれば起動時のヒープだとかの設定で
回避できるだろうけどね。
98 :
89 :2008/07/28(月) 06:08:11
91さん。了解しました。 staticで計算出来るように修正を図ってみます。
99 :
91 :2008/07/28(月) 06:13:59
>>98 がんばってね
今回の問題は
・8MBの領域確保
・計算結果が思ったようにならない
で分けて考えないとね。
領域のほうは
・staticでコンパイル時にあらかじめ静的に実行ファイル内に持ってしまう。
・
>>90 のいうように実行時にmallocで確保する。
くらいかなあ。
サイズが小さければ一時的に使える領域(たぶんヒープ上に用意したスタック?)
に取れるんだろうけど、今回のサイズはこれを超えててstatic無しだと
バッファオーバーフロー状態になってるかと。(C言語詳しい人フォローよろ)
このスレもレベル低いなぁ。スタックがヒープだとか、%4.2fが「最大」4桁だとか…… 前者は兎も角、後者はprintf("%4.2f", 1e10)とでもしてみれば判ることだと言うのに。
コンパイルオプションで静的メモリ確保の領域増やせたよな
成功すると0、失敗すると-1が返る関数の場合 if (foo(x) < 0) { /* エラー処理 */ } みたいに書いてあることが多いのですが if (foo(x)) や if (foo(x) == -1) って書くのはよろしくないんですかね?
どちらも問題ない ただ 前者はエラーの内容によって正負に分けた時に修正が必要 後者はエラーの内容によって数字を分けた時に修正が必要
個人的には if(foo(x) != 0) と書く
BOOLに3種類の値を返すようなクソAPIに慣れ親しんだオレも
>>104 を推す。
ちょっとパターンが変わるが、forkなどは、switchで書くべし。 switch(c = fork()) { case -1: exit(1); break; case 0: child(); _exit(0); break; default: parent(); break; }
>>100 レベルの高い人たちは昇進してエロくなってしまいました
おー規制解けた・・・
俺も聞きたいな
staticをつけると実行ファイル内に確保されるのはわかる。
static無しの場合はコンパイルしても実行ファイルのサイズは大きくならないのに動いてる。
でも
>>89 のようにある一定以上の領域を使おうとすればバッファオーバーフローぽいので
おそらく本来は使えないエリアにアクセスしてこける。
まあ大きい領域を使う場合はmallocしてるから普段は気にしてないんだけど。
じゃあたとえばC言語で関数の中だけで使えるintとかって実態はどこに取られるの?
ってことだな。
まあint1つ程度だとレジスタとかで終わりそうだけど、配列とかサイズが大きくなると
とてもレジスタではまかなえない・・・じゃあどこに?・・
110 :
デフォルトの名無しさん :2008/07/29(火) 03:56:41
111 :
109 :2008/07/29(火) 03:59:52
それは知ってる。
ただ、疑問なのはシングルスレッドアプリが全盛のDOSの
ころならシステム全体で1つのスタックエリアを使ってた。
昨今のマルチスレッド全盛の場合そのスタックって
実行ファイル毎にどこに持ってることになってるの?
となる。
当然アプリ毎でないとスタックとして機能しないだろうから。
で
>>100 はそのスタックがヒープではないといってる。
プロセス間でメモリ空間を共有しているわけではないよ たとえプロセスのスタック領域がどれも同じアドレスにあったとしても問題ない
いまどきはみんな仮想アドレスで動いてて 仮想アドレスから実アドレスへのマッピングはプロセスごとに別々になってるから 別々のプロセスが同じ仮想アドレスを使っててもマップされる実アドレスは異なるので衝突しない 異なるプロセスが使ってるメモリは自プロセスの仮想アドレスにはマップされないので 基本的に覗くことも触ることもできない それはそれとして、スタックアドレスは固定にする必然性はないよ 実行ファイルのロード時にOSが適当に確保してスタックポインタ設定すれば済むだけだし
スタック領域やヒープ領域はプログラマに向けた用語。 アドレスのどこを使うかってのはシステム(CPUやOSで決まるのが大半)が定義しているだけであって、プログラマはスタックやヒープがどのアドレスに割り振られてるかなんてシラネ、ってのがC言語。 まぁアクセスするアドレスを直に指定できるけど、組み込みぐらいしか使わんでしょ。 自動変数、関数呼び出し時の引数、戻り値、内部的には関数呼び出した後の戻り先アドレスなど、一時的に使用されて使用された順番に消えていく領域の確保先を、スタック領域と呼んでいる。 動的に確保して解放するタイミングをプログラマが指定する場合に使用する領域を、ヒープ領域と呼ぶ。 扱う性質が違うから、スタックとヒープはまったく別物。 厳密に言えば違うところも出てくるけど(ゲーム機とかは自前のmallocを持ってたりするからヒープ領域なんて概念すらなかったり)、上記の解釈で十分。
まあ、コンテキストスイッチで調べてみるといいんじゃないかな
すみません入門本を買ったのですがまずコンパイラが手に入らない… borlandのturbo debuggerは落とせないし・・・ どれがいいのでしょうか?
117 :
デフォルトの名無しさん :2008/07/29(火) 16:19:38
VC2008EXPRESSかTURBOC++
118 :
デフォルトの名無しさん :2008/07/29(火) 23:12:22
コンパイラいけました。 BitComet介すとダメなようで、普通にやったら普通にいけました。 ご迷惑おかけし、申し訳ありません;; ところで、入門本で三角形の公式プログラムが載っていたので自分で 台形のを作ってみようと思い実践したのですが、何度推敲しても成功しません… ↓なのですが間違いを教えていただけないでしょうか?
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); } よろしくお願いします
成功しないならどう成功しないのか書けよ
>>119 エラーメッセージを見ろ。おそらく7行目でエラーを起こしているはずだ。
>>119 void main -> int main
int takasa: -> int takasa;
プログラミングの初歩はコンパイラが出すエラーをちゃんと理解することからです
123 :
119 :2008/07/29(火) 23:19:00
すみません119です。 書き込み見て気付いたのですが、int takasaのよこが;ではなくて:になってましたね… 直したらいけました。スレ穢し申し訳ない・・・
124 :
119 :2008/07/29(火) 23:21:04
みなさんありがとうございます!
>>122 その「main」の部分のことなのですが、一応「void」でもやりたいことはいけるのです。
「int」との使い分けはどうなっているのでしょうか?
と、とりあえずintにしてやってみます!!!
あ、int mainにしたらついでに何か整数を返すように
>>124 intにしないといけないことになってる。
>>124 やりたいことはやれてもmain関数はintを返すのが決まりなのでvoidは間違い
128 :
デフォルトの名無しさん :2008/07/29(火) 23:23:42
>>125 仕様で決まってることの話をしてるときに大雑把なこというな
つまりint main()は整数を返さなくていいということが仕様で決まっているわけですね
C99ならおk
C99じゃなくてもOK
皆さんありがとうございます! 確かにintでやってみたところ、「警告:関数mainに整数を返せヨ〜」 と言われました。 整数を、返す? これはいったいどういうことなのでしょうか? 返すと言ういみが分からないのです… 教えていただけませんか?
それぐらいは自分で本を読んで理解しないと 今後も人におんぶに抱っこだぞ
>>132 Windowsを使ってるなら今は気にしなくていい
#includeが魔法の言葉であるように
int mainと return 0がセットになってると考えておk
関数の部分に入ればちゃんと理解できるから
夜遅くにすみません。 自分は今猫にも分かるプログラミングという参考書をみて勉強しています。 今「ビット演算子」のページをみて実際に組んでみました。 #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 とするには何が間違っているのでしょうか? じぶんで確認してるのですが何が間違っているのか分かりません。 お願いします。
どこから%bなんてでてきたんだ? unsignedを表示するのだから%uか%xか%oだろ。まぁ、%dでもいいけど。
すいません。 ご指摘の通り「%b」がおかしかったみたいです。 自分で「%b」と書いていたので全て=の次がbとなってしまい悩んでいました。 もう一度最初から書き直したら見事に成功しました!
っていうかこういうの書くとエラー吐くだろ なんでそれを読んで解決しようとしないの? ずっと人に聞きっぱなしだよそれじゃ
>>138 残念、printf系のフォーマットを間違えた程度では警告レベルを高くしないと警告されない。
まして、言語的には何の問題もないのでエラーになりようがない。
a&b の&bにつられて、それ以降%bになったかw
141 :
デフォルトの名無しさん :2008/07/30(水) 11:01:34
すいません、誰か教えてください。 ウィンドウメッセージの送信元のウインドウハンドルを取得したいんですが、 どうすれば良いんでしょうか? 送信元のアプリは自分で作る訳ではないので、ウインドウメッセージ内にハンドルを格納する、というのは無理です。 自アプリに対して、誰がどのようなメッセージを送信してきているのかを把握したいんです。 Spy++等で受信しているメッセージは見れるんですが、送信元が分からないもんで・・・。 よろしくお願いいたします。
どんな環境か知らんが、そりゃ無理だ。つーか、WindowsならAPIスレに行けば?
そもそもウィンドウメッセージを受け取るのはウインドウだが 送信するのはウインドウとは限らない
ウィンドウを作成しないプログラムからも、好きに送れるしな
今時CでWindowsアプリを作る馬鹿でもないだろうから、どう見てもスレ違い棚。
146 :
デフォルトの名無しさん :2008/07/30(水) 11:27:25
ウインドウメッセージの質問をしたものです。 やっぱり、無理なんですかねぇ。取得するのはプロセスIDでも構わないんです。 とにかく送信元が特定できれば問題ないです。 環境はWindowsXPです。 スレ違い、すいません・・・。
147 :
デフォルトの名無しさん :2008/07/30(水) 11:30:02
スレ違いだから失せろというだけじゃなく、あっちのほうが解答も得られやすいから移動したらどうですかといってるんだよ 失せろ
環境依存スレならスレチじゃないが ここではどう考えてもスレチです
if (expr) statement みたいな書き方ってどういう意図が込められてるんですかね? if (expr) statement ではなくて。
俺は横に書くぜ 俺は改行して書くぜ 俺はいつでも中括弧を付けて書くぜ
その中括弧を付ける場所にもこだわりはあるしな。
>>149 逆に聞くけど、後者の書き方にはどんな意味がこめられてると思うわけ?
>>149 読み手に与える印象を弱めるためだろう
statementが取るに足らない処理である場合そう書いたりする
>>149 意図というより、人やコーディングルールによってどっちの書き方に決まっているように思う。
1人の人間が書いた1つのコードの中で両方の書き方が混ざっているのは見たことがない。
ファイルポインタって規格ではどのような定義でしたかね?
自分は1行で済むifでも中括弧付けるよ。 書く量を少なくする努力よりも、誤解を生まない書き方をする努力のほうが大事だと思うし。
俺は同じ変数相手にして一行で処理が終わるものは if(expr1) statment1 else if(expr2) statment2 ... って書いてる もちろんタブで揃えて
>>156 俺は混ぜて使う場合があるよ
ifのみで一行で済む場合は一行で書くが
後のelse節が複数行になる場合は合わせて改行する
まあ好みの問題
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は入りますか?
>>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)ってエラーになりませんか?
>>164 if (fmod(num, 0.34) != 0)
しかし誤差を考慮しないとあんまり嬉しくない結果になると思う
>>165 整数を文字列に変換したいのと文字列を文字配列に入れるのとは違うってことだろ
>>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の倍数ではありません"って出てきます。 なんでなんでしょう?
10^12とかを表す記号って 10E12ですか?
>>171 誤差を考慮しましょう。それから、レスの書き方のコツを身に着けましょう。
>>172 いいえ、それは記号ではありません。
所謂指数表記では、1e12と書きます。
printf("%d\n",1E12); ってすると0が表示されるんですが・・・
>>177 %dは整数型を表示するために使います。
寧ろ%gを使うべき。
>>180 10^12は整数だと思ってたんですが、、実数型なんですね。
今会社から帰ってきてチェックするの遅くなりました。
>>138 さん 自分でエラーを確認したんですが問題の部分は表示されなくまったく気づきませんでした。
もちろん、このままでは成長できませんから次から気をつけます。
>>139 さん
>>140 さん 警告レベルを高くすることなんて出来るんですね。
少しのミスでおかしくなってしまうのが悔しいですがバグを発見して正しくするのが楽しくて夢中になってしまいます。
初心者、上級者関係なく1回で完璧なプログラムを書けるひとっていないと思います。
自分も2・3回失敗しても腐らないように頑張りたいです。
ありがとうございました。
>>183 指数表記を使って書かれた数の型は、
たとえ小数点を書かなかったとしても小数型になる。
1E2 → double 型
1E2f → float 型
>>184 > 初心者、上級者関係なく1回で完璧なプログラムを書けるひとっていない
そだね。
プログラマは基本的にバグをつぶす日々を過ごしてる。
バグがなくなればその仕事終了だから、次の仕事のバグつぶす日々になる。
2,3回ぐらい気にしないことだよ
300行くらいバーっと書いて一発でコンパイル通ってテストも通った時は歓喜した
それはかなり嬉しいな
十数行書いただけでコンパイルが一発で通る自信すらない
俺は最近目視デバッグ能力を磨いてる
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]); } } と書いたのですが、ソートされません・・・なぜでしょうか
return *y - *x;
193 :
デフォルトの名無しさん :2008/07/30(水) 23:26:57
すっごいどーでもいいけど%lfより%fのほうがどちらかというと正しいといえなくもない
>>193 c99ならどっちでもいい。
どの規格に準拠するか書いてないからどうでもいい。
あと、qsortでのキャストは不要。 そこのキャストを取り除くか、 逆にキャストはそのままでMy_Cmp_doubleを int My_Cmp_double(const double* a , const double* b)にするかにしてしまえ。
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); ですか?
>>195 だめです。嘘教えるのやめてください。
qsortに渡す関数はint(const void*,const void*)以外認められません。
・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とでもするのが無難かもしれない。
intを返してないから? return *y-*x; ↓ if(*y-*x<0)return -1; if(*y-*x>0))return 1; return 0;
>>198 そんな糞みたいな説明を読むからいけないんだ。
doubleの引き算だけでなく、longの場合も引き算ではダメだぞ。
>>199 > 同値性に誤差を許容すべき。
並び順は適当でいいから入れ替え回数少なくしたいとかならわからんでもないが、
通常のソートが目的なら、それはおかしい。
>>199 同値性の誤差って考える必要ある?
こういうソートの場合なら別に気にしなくても問題ないと思うんだけど。
気にしなくていいなら、気にしなくていいんじゃない?
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); こうっすかね?
>>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;
}
typedef struct{ double a: double b; }HOGE; という構造体を配列で宣言 HOGE hoge[256] するときにaだけを0に初期化したいんですが、どうやるんですか? hoge[i].a = 0にするということです。
bはdoubleじゃなくてintでした。 bは0 1 2 3 4 5 6 ・・255って入れたいんです hoge[0].b =0 hoge[1].b =1 ってかんじです
普通にfor文でええんとちゃうの? int i; for(i=0;i<256;i++) { hoge[i].a = 0; hoge[i].b = i; }
宣言時にいっぺんにできたらなぁと思って int count=0;とやるがごとく
何回も初期化処理が呼ばれるならあれだが、起動時に1回だけでしょ? たいしたコストじゃないよ
それが何回も初期化しなおします。 多分40000万回とかします
間違えました。40万回ですw
bは必要なものなの?
hoge[256]の初期化用配列作っといてmemcpy()でいいんじゃないの?
220 :
デフォルトの名無しさん :2008/07/31(木) 00:58:43
fflushってなんで役に立たないのに存在するの
>>197 後半は合ってるけどキャストは要らない。
C++だと要るけど。
あるに越したことはない、と思う人と 余計なものをつけると見づらくなる、って人がいるよな
警告出すコンパイラもあるから付けた方が無難ではある。 ただ、規格上は必要ない。
>>224 文字列がNULLのとき
cがヌル文字のとき
229 :
デフォルトの名無しさん :2008/07/31(木) 01:54:25
>>228 ありがとうございます、やっぱそれだけですかね?
>文字列がNULLのとき
これに関しては呼び出し元でチェックすべきだと思うし
>cがヌル文字のとき
これも微妙だと思ったんですよね。
変に考えすぎてるだけでしょうか?
'A'と"A"の違いって何ですか?
>>230 'A'は文字コード、値が入ってる。
"A"はアドレスが入ってる、後終端文字が後ろにくっつく
符号の問題だと思うよ。
>>232 あ、charって符号なし整数だと思ってました。
具体的にどういう入力の時に問題が起こるのでしょう?
charがsignedかunsignedかは環境依存
コンパイルオプションで変えれたりすることもあるしね。
>>229 これ、ANSIのstrchr()と同じだろ?
だから、cがヌル文字だったとしても、ヌル文字チェックのif文通る前に *str != c を満たさずにループ抜けてヌル文字の位置のアドレス返すから問題ない
それよりは文字列の途中にヌル文字入ってたらそれ以降にcが入ってても見つからないっていうのを追加
"abc\0123"だと123は見つけられない、というか見つける術がない、というのはstrchr()も同じ
あと、大小比較じゃなくて等値の比較だから符号は関係ない気がする
signedかunsigned関係なくて、int c がcharの範囲を超えて与えられたらおかしくなる、ということならわかる
>>220 なんで役に立たないと思ったのですか?
大変便利なのに。
>>238 Cで「文字列」と言うとヌル文字までなんだから、
「途中にヌル文字が入っている」もの全体を文字列とは呼べない。
多倍長での計算ってどうやって実装するんですか?
>>242 指摘貰ったので改めて調べると、最初のヌル文字が現れるまでを文字列と呼ぶ、、、らしい
文字列リテラルは途中にヌル文字は含めてよい、文字列と文字列リテラルは別物、ということだったので、区別しなきゃいけないようだ
仕事では普通に使ってたので途中ヌル文字ありも文字列と呼んでたよ
指摘ありがとう
なので、"abc\0123"うんぬんは取り下げる
が、そうなると
>>224 の答えって何だ?NULLも文字列とは呼ばないけどどうなるんだろ?
なんか、「符号は関係ねー」って言ったのも自信なくなってきたorz
>>218 aをキーにソートするので、それが何番目の奴だったか覚えておくのに必要です
bはずっと不変なんでいちいち初期化する手間ももったいないと思うんですが・・・どうしたらいいですか?
hoge[i].b=iはずっと変わりません。
>>245 cでそういう構造を簡潔に初期化する手段は存在しない。
データ構造を変えて、
struct HOGE {
int a[MAX];
int b[MAX];
};
として、memset(hoge.a, 0, sizeof(int[MAX]));
とするくらいしかないな。
ていうか、hoge[i].b がつねに i なら、b要らなくね?
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 という感じにソート前の番号が必要なんですが・・・
じゃあ >hoge[i].b=iはずっと変わりません。 こういう嘘を書かないように。
>>234 char が符号付きの環境だったら
str_char("\xFF", 0xFF);
とやっても NULL が返ってくる。
str_char("\xFF", '\xFF');
とやれば問題ないんだが、それでも
for(i=0; i<=0xFF; i++){
result[i] = str_char(str, i);
}
みたいなことをしようとするとハマる。
>>223 スマン
毎回bが違う値になるのかと勘違いしてた
>>245 ソートするなら構造体を並べ替えるんじゃなくてそのポインタを並べ替えるのがいいと思うよ
for(i = 0; i < N; i++ ){ } の中でif文をチェックし、真であればそれ以降のiからNまで処理Aをしたいときはどう書けばいいですか?
fgetc()とfputc()は関数でgetc()とputc()はマクロと決まっているのですか/
>>252 こうしたいの?
for(i = 0; i < N; i++ ){
for( k=i; k<=N; k++ ){
A( k );
}
}
putchar(ch)の戻り値をチェックしろと本に書いてあるのですけど 理由がよく分からないのですが。 別にチェックしなくてもいいですよね?
標準出力がファイルにリダイレクトされてて、ディスクが満杯で書き込めないかもしれない チェックする意味はある エラーを無視するのは自由だが
>>255 for(i = 0; i < N; i++ ){
if(条件) ←1回真になったらそれ以降のiではチェックせずに Nまでdata[i]=0にする
っていう処理をしたいです
>>258 こう?
for(i = 0; i < N; i++ ){
if(....)
break;
}
for( ; i < N; i++ ){
data[i]=0;
}
それでいけそうですね。どうも
261 :
デフォルトの名無しさん :2008/07/31(木) 13:11:18
初歩的なことなのですが、C言語ってどのようなことに使えるのでしょうか? お願いします。
ソフトウェアを作ることに使えます
263 :
デフォルトの名無しさん :2008/07/31(木) 13:12:45
>>262 企業でしか使うことはないということでしょうか?
個人の作ったソフトウェアが存在しないとでも?
>263 そんなことはない
266 :
デフォルトの名無しさん :2008/07/31(木) 13:21:54
269 :
デフォルトの名無しさん :2008/07/31(木) 13:24:43
>>267 >>268 では個人で作られた相当すごいソフトウェアには、例えばどのようなもののがあるんでしょうか?
271 :
デフォルトの名無しさん :2008/07/31(木) 13:29:20
>>270 もうちょっと身近なソフトでお願いします!
273 :
デフォルトの名無しさん :2008/07/31(木) 13:34:27
>>272 えええ、あれも個人で作られたものなんですか!
ありがとうございます!!
そりゃどこの会社の製品も究極的にはそこに勤める人間が作り上げたものに違いない。
ひどい釣りだ
テキストを1行ごとに読むと遅いのでバイナリーで読み込んだ後 プログラム内で処理する場合EOFって入ってます? もしかして入ってないので最初にファイルのトータルサイズを調べておいて それを超えないようにしないとだめ?
そのバイナリーで読み込んだときに、読み込んだサイズわかるだろ?
fread()の戻り値を見ろとしか
>テキストを1行ごとに読むと遅いので まずここを疑ってかかること
>>276 EOFってのはファイルの中にあるものではない。
既にEOFに達しているのになお読もうとした時に読む関数が返す値。
テキストで読もうがバイナリで読もうが、読む速度が大きく違うとは思えないが。
>>276 EOFってのはfgetc/getcが返す特殊な値であって、freadなどには関係ない。
EOFはストリームからこれ以上文字が取り出せないことを示す信号であって ファイルの末尾にEOFという文字がついているわけじゃない (そもそもEOFは所謂1バイトの文字の範囲外かもしれない) Cでファイルのサイズを知る汎用の解は読めるだけ読んでその数を数えることしかない どうしても事前にサイズを知りたいなら環境依存の関数を使うこと
昔はテキストファイルには ^Z ついてたからなー
まあでもstdioのテキストモードで読み取りを行っている限り、 実際^Zは出てこなかっただろ、fgetcらが内部で適宜処理していたから。
285 :
276 :2008/07/31(木) 15:07:56
お騒がせしました。 構造体を読み込むための汎用関数がすでにあり汎用関数が読み込む 構造体は必ずヘッダも付いててサイズもわかるようになってたので ファイルサイズを返さない仕様になっていたので横着してテキストの中身で 判断しようとしてましたorz 横着せず汎用関数を改造してサイズも返すようにしました。
gets()って関数ってなんのためにあるんですかね? プログラミングの学習を簡単にするためでしょうか?
昔はそれでいいと思われていたから、だろうと思う。
ダンディ坂野のため
scanfが駄目っていう人が居るけど、getsと似たような理由ですかね?
カーネルのバッファリングとライブラリのバッファリングって違うものなのですか?
一番安全な入出力方はなんなの?
getchar
質問しすぎ
>>289 そういう理由も含む
>>290 C言語的にはどうでもいいこと
>>291 構造的にバッファがあふれる可能性のあるfgets等を除けば
どれを使っても後はプログラムする人間の問題
ミス ×fgets ○gets
>>231 ありがとうございます
printf("%c",' ');
printf("%s"," ");
で2つともスペース1個出力できるんですか?
はい。 どちらもputchar(' ')と同じ出力ですね。
>298 寝ろ
puts(" ")は余計な改行がつくから要注意だ。
2^a を渡されたときaを求める方法で何かいい物はありませんか? なるべくループやlogを使わない物がいいです
303 :
デフォルトの名無しさん :2008/08/01(金) 03:05:13
switch(x){ case 1:return 0;
>>302 4バイト整数なら高々32通り、switchで全部列挙しろ
任意の構造体を引数として関数に渡す場合は どうすればいいでしょう?
struct A {...} f(struct A a){...} pf(struct A *a){...} int main() { struct A ma; ... f(ma); pf(&ma); ... } お好きな方をどうぞ
atoiってもしかしてマイナス符号付きは変換できません?
いいえ、atou()ではなくてatoi()なので大丈夫です。
CでCGIを作ろうとしているのですが、UTF-8で標準出力ってできないのでしょうか? データとしてUTF-8の出力や変換は分かるのですが 標準出力となるとよく分からなくなってしまって…
できるよ。 そんな疑問が出るような状況で先に進めるのかな?
unicodeの違いから始めて事あるごとに躓き、正直自信なくしてます。
>>311 なぜCで
webプログラムならPHPで十分だろ
Shift_JISでCGIは既に作ってあり(お遊びですが) unicodeに対応させようと思って色々イジってみてるんです。
>>315 ふつーに文字列を、標準出力につっこめば、文字コードは関係なくそのまま出力されるんじゃないの?
317 :
311 :2008/08/01(金) 10:57:44
なにか変な勘違いをしていたようです。 データを突っ込めば勝手に解釈してくれますね。 ソースUTF-8にして"TEXT"出力しても文字化けするんで、 回りくどく、おかしなこと考え込んでました。
標準入出力はバイナリも普通に扱える。つまりどんなバイトでもそのまま通る。 文字化けは、そのまま通ってきたバイト列を端末がどう扱うかの話。
>通ってきたバイト列を端末がどう扱うかの話。 まさにこれで勘違いしてました。
int型に''で囲んだ文字って代入できますよね? 変数に文字を代入するときって何故''で囲まないといけないんですか?
x = y だけじゃ y が変数なのか文字なのかわからんだろ
変数に代入する時以外でも常に ' ' で囲むぜ
文字を''で囲むのではない ''で囲んだものが文字なのだ
ジョースター卿乙
325 :
デフォルトの名無しさん :2008/08/02(土) 00:43:40
文字列検索で発見位置をintで返す関数とcharで見つかった位置へのポインタを返す関数は どういう場面で使い分けるものですか?理由もお願いします。
同じ
文字定数('A'など)を格納するのは何故char型じゃないといけないんですか?
(int)'A' これでintにはいる・・・?
整数型の何にでも入れられるけど
>>329 キャストするまでもなくintだったような気がする。
一体誰がchar型でないといけないと言ったのか ちなみに文字定数はもともとint型(unsigned charに納まる範囲の数でしかないが)
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 こんな感じで表示するプログラムってどうやるんでしょうか?
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; }
>>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");
}
>>332 初心者スレで紛らわしいこと書くな。
'\xFF'が正か負かは処理系依存(つーかコンパイラオプション次第)なんだから
わざわざ「unsigned」なんて付けずに「charに納まる範囲」でいいんだよ。
charが8bitなのにメールでは7bitしか通らない事が疑問だった
>>338 アスキーコードで見ると7Fまでで全部できるしね。
キャラクターコードと考えると8bitいる
>>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');
}
}
int(floor(a)) としたときに、やはり丸め誤差をくらって、 数学的に期待した結果と返り値が1ずれることは想定すべきですか? 例えばa = 1.3だとして、 floor(a) => 0.99999999999999912341 int(floor(a)) => 0 になるような場合が起こってしまうのか、ということです。 実際にはa = 1.3の場合には、自分の環境ではこうなりませんが、 aが他の値のときにこのようなことが起こるかもしれません。
>>342 ほぼすべての処理系において整数がずれることは無いと思われます
これは浮動小数点数の格納の仕方によるものです
浮動小数は、整数値を誤差無く保持することができる(有効桁数内)。 これは、内部的に実数と2の乗数の形で保持しているため。 ただ、C言語の規格で保証されているかは知らん。 でも、組み込みを含めても、余程マイナーなものを除き 現行で浮動小数をIEEE754以外の形式で扱うコンパイラ(プロセッサ)は まず無いと思うし、もしそれ以外の形式であったとしても 整数を正確に保持できないということは考えられない。
mathematicaとかどうなってんだろう
>>343-344 なるほど。気にしないことにします。
ありがとうございました。
色々ソースを読んでみても、特にみんな気にしていなさそうです。
>>346 いいえ、float(IEEEでは4バイト)ではint(一般的に4バイト)より精度が低いので、全ての値を正しく保持できません。
そもそも、あなたは(int(floor(a))と書いているので)スレ違いです。
え?
>>347 確かにCには関数型キャストはない罠。でもま、趣旨からすればdoubleからの変換だからいいんでね?
無線LANとfloatに何の関係があるんですか?
floatで保持できないとかC++はスレ違いとかいうくらいなら、
IEEEなんて曖昧なこと書かないでね。
ちゃんと
>>344 に書いてあるんだから。
と書いているのがわからないんですね。
IEEEすら知らんような奴によく付き合えるよな 個人が理解できるまでみっちり教えるのは時給数千円の家庭教師の仕事だというのに
面白すぎますよね。まったく。
>>352 JISのアメリカ版と言えるのはANSIだ。
つまりゲームのリプレイに使いにくいx86系FPUは滅びよと
使いにくいものをわざわざ使う必要はないのだから、 滅びるのを待たずとも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; }
363 :
デフォルトの名無しさん :2008/08/02(土) 22:26:14
>>361 s1を文字列の終わりまで進めてるからs1を表示しても・・・
>>361 *s1 が '\0' だから
puts(buff1);
なら表示される
常にs1++が実行されるから\0をコピーしたさらに後まで行ってしまう
367 :
365 :2008/08/02(土) 22:31:47
あと文字列の長さチェックもおかしい if((strlen(s1) + strlen(s2)) < STR_LENGTH) だろ
もしくはこうか #define STR_LENGTH 255 /* 文字列長さの最大値 */ char buff1[STR_LENGTH+1] ="abc"; char buff2[STR_LENGTH+1] ="xyz";
370 :
通りすがり :2008/08/02(土) 22:40:20
ketugou関数のなかで、結合した、文字列を表示させる処理を書くのは、 無理なんですかね?
372 :
通りすがり :2008/08/02(土) 22:50:05
>>371 const char *p = s1;
の1行が、必要なんですね。
373 :
通りすがり :2008/08/02(土) 23:17:25
>>363 ,366
\0を入れる方法は、結合した長さを調べて、最後に\0を入れるでよいですか?
>>372 関数に入った直後のs1をコピーしておけばいいだけ
ketugou関数の中で表示しなければいいのに。
2次元配列を受け取る関数で int (*a)[3] と int *a[3] って仮引数として同じ意味なんですか?
前者は配列へのポインタを渡していますが、後者はポインタのポインタを渡しています。
むしろなぜ同じ意味だと思うのか 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次元配列ではないということでしょうか。
(*a)[3] にアクセスしちゃダメ>< 型は確かに int だけど
以前に見かけたことあるコードなんですが、確か 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
規格上はアウト。でも危険を承知でしばしば使う。
だなあ まあメモリは一応確保されてるので使えなくはないが 自分の担当でなくなった際に引継ぎできなければはまることもあるなあ。 自分で作っても時間がたつと忘れてたりするので。
>>379 どちらもポインタであって二次元配列ではない
int array[10]の部分ってpと何か関係あるんですか
>>381 ってどんな利点があるの?
構造体にポインタを持たせて普通にmallocしたほうがわかりやすくね?
>>386 二回mallocを使うと管理領域も二つ分使われるんで、メモリも、スピードも
>>381 の書き方のほうが有利。
>>387 今時そんなのどうでもいいと思うけどね。
390 :
381 :2008/08/03(日) 13:52:08
レスどうもです。 今はあんまり必要ないテクニックかもしれませんね。
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) ってどれも同じことを意味するんですか?
>>392 二つが一緒
void func(int x[][3],int n)
void func(int (*x)[3],int n)
これは違う
void func(int *x[3] ,int n)
お恥ずかしいのですが質問させてください。 自分は今等価演算子と非等価演算子を勉強しています。 /*演算子練習だよ*/ #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とかですよね。 だとしたら全て当てはまるように思うんですが考え方が良く分かりません。 自分の拙い文章で分かりにくいと思いますがよろしくお願いします。
?別におかしくないだろ aが10かつ20なんて事はありえなくね?
396 :
394 :2008/08/03(日) 19:56:52
int で取り込んだのがa=10なのだから a=20はおかしいってことですよね
当てはまるって何が何に当てはまるんだ?
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」 ということでしょうか?
何を言ってるのかよく分からんな a=10 としたんだったら a==20 → 正しくないので 0 a!=20 → 正しいから 1 ってだけの話だろう
あなたのお名前は? aaaa あなたの年齢は? 24 ようこそaaaaさん。 24歳ですね。 というようなプログラムを作りたいんですが、 年齢を入力する際、数字以外を入力したら あなたのお名前は? aaaa あなたの年齢は? bbb bbbは年齢として入力できません。 あなたの年齢は? となるようにしたいんですが、どういうふうに書けばいいんでしょうか? Cを勉強し始めて2週間ぐらいなんですが、ちょっとつまづいています 誰か教えてください。。
「==」という演算子は、比較をして等しいか等しくないかのどちらかを返す。等しいなら1、等しくないなら0。
「!=」という演算子は、比較をして等しいか等しくないかのどちらかを返す。等しいなら0、等しくないなら1。
そんだけ。
>>399 (多分)合ってる。
(「(多分)」なのは、私があなたの文章をあなたの意図通りに解釈してる自信がいまいち無いから)
>>400 さん
「!=」は正しくないときに「1」と猫にもわかるプログラミングには書いてあるのですが・・・
その式では10=20は正しいから「1」ということですよね?
どうして20であっているのでしょうか?
最初に「10」と宣言したはず
>>402 さんありがとうございます!
ノートに書いておきました・・・。
405 :
デフォルトの名無しさん :2008/08/03(日) 20:23:50
またネコ科。 それはともかく、「!=」は「正しくない」ではなく、「等しくない」 だから、「10!=20」→「10と20は等しくない」→正しい→1 だな。
>>401 「数字以外である」という条件を具体的に定め、それをソースコードで書く。
一文字目が0〜9の範囲内にあればヨシ(isdigit()使って)、でいいんじゃない?
先頭の0は許さないとか細かく条件をつけるなら、いちいちそれをソースで書くしかない。
いつもお世話になっています・・・。 本と同じことを皆さんおっしゃっているんだとおもうのですが自分にはこちらのほうが理解しやすく利用させてもらっていますorz 自分の文がおかしく混乱させてしまってすみませんでした。
>>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;
}
>>394 まず根本的に、printfの%dは何かを代入するものではない
対応する引数の値を文字列に変換してその部分に表示するもの
この場合表示する値はa==10やa!=20という式が持つ値になる
まず式が値を持つということからわかってないと思う 大抵の入門書じゃ説明しないけど
いま「制御文」という章に入りました。 /*scan01.c*/ #include<stdio.h> int main() { int seisu; printf("整数値を入力してください-----"); scanf("%d",&seisu); printf("あなたの入力した数値は%dですね\n",seisu); return 0; } とすると 「数値を入力してください-----125 あなたの入力した数値は125ですね」 になるはずですが「数値を入力してください-------」になってしまいます。 どこから125という数値が出てきたのでしょうか?
>>411 どこからきたのかは、その本(Webページ?)に書いてあると思いますよ
>>411 あなたがキーボードから125と打ち込む。
わかった!! デパックして黒い画面のやつに数値を入れると「あなたの入力したす数値は○○ですね」 になるんですね。 この黒い画面をいじっていいのか分からなかったため理解できませんでした。 すみませんでした
416 :
401 :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); }
418 :
417 :2008/08/03(日) 21:42:24
すまん、酔っぱらっていて、これ大嘘。
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歳ですね");
m9(^Д^)プギャーーーッ
421 :
デフォルトの名無しさん :2008/08/03(日) 22:05:36
C言語とJavaの違いを教えて下さい お願いします
>>393 ありがとうございます
今読んでる本(ぼうようのポインタの極意)には
void func(int *x[3],int n)
void func(int x[][3],int n)
が同じと書かれているんですが、これは誤植なのしょうか?
>>421 Cはリッチーさんが作ったプログラミング言語で、
JavaはSunが作ったプログラミング言語。
424 :
417 :2008/08/03(日) 22:15:19
bosticじゃなくて?
漏れも幽霊のようになることと引き換えにC言語をマスターしたいです。 もながいします。
>426 何をお願いしているのかをまず明確にしろ
PCの電源切って電源コードで首吊ればなれると思うよ。
>>412 基礎は師匠に学んだがだいたいは独学
CFAQが座右の書
よいプログラマの条件は、くどいくらい厳密に物事を説明できることだ
432 :
デフォルトの名無しさん :2008/08/03(日) 22:33:04
>>430 C言語とJavaの違いを教えて下さい
お願いします
433 :
417 :2008/08/03(日) 22:41:59
C言語は、Javaより20年以上も前に設計された言語で、 俗に10年一昔というが、コンピュータの世界では3年一昔 というぐらい進歩しているので、Javaの登場までには 6世代分ぐらいの技術革新が起こっている、C言語など Javaからみれば化石のようなもの、に思えるが、 じつはそうではなく、
スレ違いです
もう限界だー\(^o^)/
>>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;
}
配列の要素数が1つ足りないのに気付かず 全てのコードを見直して所々いじったらさらに混乱し、 うんこして要素数を+1したら完璧に動きました 所要時間4時間・・・発狂しそうになりました、やっとこ就寝です ほんとうにありがとうございました
誰かおきている方いらっしゃいますか? 自分は今 #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」のように使い分けるものなのでしょうか?
最初のif文の条件以外と言う条件 + さらに条件があればelse if ないならelse そのプログラムだと 「ageが6未満」(これがif文の条件)だと入場料は無料 elseだとそれ以外つまりageが6以上と言う事になるんだが しかしそれにis_seitoが1だったらと言う条件をつけたいが為に else ifを使ってる
ごめんなさい。 頭がうまく回らなくって遅くなりました。 条件つきを書きたいとき「else if」を使うということですよね。 デパックしたら黒い画面が出てきますよね? そのとき入力する項目は「else it」を使うと考えていればokでしょうか?
ん?んん?何を言っているんだ? 入力受付はこのコードだと printf("年齢を入力してくださいーーー"); scanf("%d",&age); ← printf("「猫でも学園」の\n生徒さんですか(yes:1,no:0)---"); scanf("%d",&is_seito); ← の二箇所だぞ? この部分にelseも何も関係ないだろ
>>441 俺にエスパーが足りないせいか後半部分の意味が理解できない
すみません;;;
>>440 さんの「最初のif文の条件以外と言う条件 + さらに条件があればelse if
ないならelse 」
これが一番簡潔で一番分かりやすい考え方ですよね。
>>441 デバッグというかコンソールアプリなんで実行したら
コンソールがでただけでしょ。
else it
じゃなくて
else if ね
で、いいたいことはわかった。
寝起きはエスパーになれる?
つまり
446 :
445 :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; }
447 :
445 :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; }
448 :
445 :2008/08/04(月) 05:43:48
個人的にはelse ifは嫌いというか使わないんだよな。
449 :
445 :2008/08/04(月) 05:47:36
黒い画面がでたのはプログラムの種類がコンソールアプリなんで。
入力は
>>442 の書いてくれた部分が担当
else if は単なる書き方の問題。
>>446-449 どう読めばそうなるのかは分からんが当たってたらおまえのエスパーはすごいって事だな。
>個人的にはelse ifは嫌いというか使わないんだよな
俺はインデントが不必要に深くなるのが嫌いだからelse if を使うけどな、まあ好みの問題か。
何回もすみません。 条件ということは ・6歳未満でなくても「猫でも学園」の生徒なら無料 ・6歳未満ではなく「猫でも学園」の生徒でもないときは1000円 上記は条件がある」という点では一緒ですよね。 だとしたら「else」「else if」を使うのは反対でokだと思ったので使うのを反対にしてみました(自分で解決しようと思ったので するとエラーになってしまいました。 自分の考え方が1からおかしいでしょうか? 本当に朝から付き合ってくれてありがとうございます;;
まあ、何でも良いけど条件別けする時に日本語でまず考えれば良いと思うよ 多分今回の話だと 「年齢が6歳未満」の場合入場料無料 「それ以外でも学園の生徒」の場合入場料無料 「それら以外」の場合は入場料1000円 と言うことになると思う if文の構文自体が if(条件1){ //処理1 } else if(条件2){ //処理2 } else { //処理3 } もし条件1に当てはまるならば処理1を実行 条件1には当てはまらないが条件2に当てはまるならば処理2を実行 上記の条件のどれにも当てはまらないなら処理3を実行 と言うものになってるからそのまま適応出来ることが分かると思う あくまでelseは今まで出した条件以外と言う条件の時のみ使える
>>451 今度は俺がエスパー
elseっていうのはその上にifがあり、かつそのifの下にまだelseがないときにしか使えない
これを理解してるか?
違ってたらソースをさらしてくれ
454 :
デフォルトの名無しさん :2008/08/04(月) 05:56:15
>>452 さん分かりました!!
そうかそうか!
言われた通りに処理をして区別したかったから「else」「else if」で分けていたんですね。
つーかマジでelse if 使わないほうがいいんじゃね?
>>447 のように記述したほうがいいきがする
456 :
デフォルトの名無しさん :2008/08/04(月) 05:58:09
>>453 さん
自分理解していませんでした。
取りあえず触ってみる、プログラム書くことに重点を置いていたので
457 :
453 :2008/08/04(月) 06:04:08
>>456 いい姿勢だと思うよ、習うより慣れろっていうしね。
でも解決するときにきちんと理論を知っておかないと成長しづらいよ
>>455 さっきも書いたけど
>>447 の方法だと条件と処理の数が増えるとインデントが
深くなるから今回みたいに条件が少ない場合はいいけどしょうじゃないとき
極端に言えば100とか1000の時収集かなくないか?
まあこれ以上は宗教戦争になるから言わんが
>>457 まあネストが極端に深くなる場合は関数化する必要があったりするので
それほど問題はないと思ってる。
これは個人的見解
459 :
417 :2008/08/04(月) 06:39:28
でも、これってどちらかといえば || の教材に使ってほしい。 else if の教材にするには、生徒のときには入場料を 300円ぐらいにしないと else if を使う必然性が無い。 まあ、可哀想なのは、この教材で学ぶことで || ですむところをいつでも else if を使うようになる学習者だけなのだが。
>>459 アセンブラレベルだと大してかわらないんだけどな〜
アセンブラほとんど分からんけど if( (age<6) & (-is_seito) ) //&&じゃないよ //無料 else //有料 ってやったらちょっとは早くなる? それとも遅くなる?ジャンプのコストってどんなもん? これスレ違い?
>>461 switch文書いても結局はif { ・・ } ・・else if
ってなるように
if { ・・・ || ・・・ } と書いてもアセンブラだと
結局条件分岐1条件分岐2と並ぶだけなので内情は変わらない。
>>462 うん、それはそうなんだと思っていた、流れで聞いたからそういう意図だと思われても仕方ない
しかし
>>461 のifの中身をよく見てほしいこれなら比較は一回ですむはずなんだが余計な計算がいる、
ジャンプのコストがそれを超えるかが知りたいわけだ。でもスレ違いっぽい気がする。
>>463 そのくらいのジャンプコストは誤差の範囲
ジャンプ命令はそれほどでもないしね。
Z80はコストの少ない相対ジャンプは+-128くらいだったかな・・・?
まあ最近のプロセッサはそんなの関係ないんだろうけど。
むしろ関数をインライン展開しない場合はたぶんコール命令になるから
そっちのほうがコストは多い。
で、結論から言うとせっかくCで書くんだからわかりやすく書けw
|| とか &&で混乱するくらいならif文の条件判定をわけるとかさ・・・
465 :
463 :2008/08/04(月) 07:53:04
と思ったらifの中身間違えた (age<6) | (-is_seito)こうだな
>>464 生半可な知識はいかがなものかと。
Z80では条件絶対ジャンプは10クロック、条件相対ジャンプは12クロックなので相対ジャンプの方が高コストということになる。
>>463 x86では条件分岐を使わずとも条件で値をセットすることもできるし、ビット演算のほうが速いとは言い切れない。
その周辺のロジックと併せて広範囲に最適化が行なわれるしね。
まぁ、ビット演算持ち出すならちゃんと実測してくれと。
467 :
463 :2008/08/04(月) 08:02:29
>>464 そうなんだ、条件分岐とかのジャンプはコストたかいイメージ有ったわ
そうだね、せっかく高級言語だからわざわざ可読性落とすなってことだね。
でもやっぱりC言語自体はアセンブラより書きやすくなったとは いえマニアックさでいえばアセンブラと大してかわらないよな。 C言語でバリバリ書く人はどんどんマニアックな記述になるし(注:後発の言語比ね)
>>468 そうでもない。どんどんマニアックになってその傾向が止まらないのは趣味でやっているか他人を慮らずに仕事をしている所為。
仕事で可読性や保守性を意識していると、大体一定のレベルでその傾向が止まる。
C言語の ? (演算子でしたっけ?)あれも・・・
C99準拠のコンパイラってあるの? VC++みたいなC++と同居してるコンパイラの場合、上位互換維持するために C99なんて実装してらんないんじゃないか?
>>471 沢山あるよ。Windowsで動く身近な例では、gccとかiccとか。
殊にiccはVisualStudioのプラグインとして使うことを想定しているから、
生半可なプログラマがc90とc99とc++を混同していると割とはまれるw
ちょっと乗り遅れた感はあるが。。。 あくまでも入門篇のスレなんだからトリッキーな方法は推奨しない方が。 書籍見れば&は「ビット単位の論理積」、|は「ビット単位の論理和」って書いてあるだろうから。 (age<6) | (-is_seito)と(age<6) || (-is_seito)は結果は同じでも副作用が違うというのを認識してればいいのかもしれないけど、|、||、&、&&が混じったときの可読性を下げる方が罪。 条件分岐のコストを話題にするのに計算のコストが話題に出ないのは話の流れ上仕方ないかもしれないけど、||で書けば比較結果のフラグを待避する必要がないのに|だと必ず待避させなければいけない。 ここまで言及して「|で繋ぐのはどうよ?」となる方が話としては自然だと思う。
それよりも「本を読めるようになれ」というのが一番近道かと
|| を | に変えて可読性下げるくらいなら別のもっと時間のかかる処理を短縮させた方がいいな
わざわざ短絡じゃなくすのもな
猫でもわかるって本当ですか?
確率がどーたらいう最適化なかったかけ? 分岐で
>>478 入門篇で扱うような話じゃないので、最適化スレなり適当なスレへどうぞ。
つーか、その辺りも先ずは可読性重視でOK。
>>478 会社のお昼なので携帯から失礼します。猫にも分かるなら自分にも分かるだろうと思っていましたが出来ません。
>>477 うちの猫を見る限り
不可能と考えるべきでしょう
苦沙弥先生の猫なら別でしょうが
論理的帰結:猫より劣っていた
猫でもわかるという言いまわしは、暗に猫の知能を低く見ていると言っているようなものであり 動物愛護団体は猫を差別から守るために、これに対して断固講義していくべきだ
分かるというのは口先だけのこと 人間でもよくある事 分かるといいながら(ry
とりあえず誰もelse if節というものは存在しなくてelse節にif節を入れているだけだと説明しないのはどうかと思う
>>485 VBとかほかの言語でelseif ってくっついてるのなかったっけ?
そういうの見てるとなんとなく本来は別なんだけどセットのように
見えて実際そう思ってる人もいそう。
むしろ同じprintf文を2回書くか書かないかは大違いだろうがって
誰も
>>460 に突っこまないほうが問題だと思う
このスレで事あるごとにアセンブラがどうこう言い出すやつは大抵どこかズレてる
すでに特許取ってあるコードを、まったくそれに関連する知識なしに自力で到達しても特許料払わないと使っちゃだめなの?
>>489 日本語でOK。
自分が特許とったコードなら払う必要なんて当然ないんだが。
言いたいことは、何も参照せず自分の完全オリジナルで 書いたコードが偶々既に特許が取られてあるコードと被った場合 の扱いについてと言うことだと思うがそれってC言語関係ないよな
この板の話題でもないよな
493 :
デフォルトの名無しさん :2008/08/04(月) 20:16:53
C言語とJavaの違いを教えて下さい お願いします
あんま違わないんじゃね
名前が違う。あとは・・・まぁ、いろいろだな
コードは特許をとるものではない。特許とは発明。特許をとるのはアルゴリズム。 ソースコードを保護するのは著作権。 本当に他人のソースをパクっていないなら著作権侵害にならない。 パクっていないことの証拠として開発中の状況等を細かく残すなどが 過去コンパチ機の開発で行われた。
497 :
デフォルトの名無しさん :2008/08/04(月) 20:28:27
>>493 制御ステートメントはだいたい一緒
あとは、色々違う。
あ、あとJAVAにはポインタ無い、参照渡しになる
参照と参照渡しを混同してる奴しねよ
C++とならまだしもCとJAVAの違いを聞くなんて 犬と猫の違いを聞くようなものだ
if 〜do〜 else〜do〜 って文は作れないの? エラーになってしまう。
502 :
デフォルトの名無しさん :2008/08/04(月) 21:40:09
503 :
デフォルトの名無しさん :2008/08/04(月) 21:46:17
もっと具体的にC言語とJavaの違いを教えて下さい お願いします
いやです
505 :
デフォルトの名無しさん :2008/08/04(月) 21:55:57
ゴキブリのような容姿の奴って実在するよなw こいつ触覚つけたらゴキブリじゃんwって奴、いやマジで。
わかりません><
>>503 C
Java
見るからに違う
C は視力検査でも使われるほど汎用的
C::¥>javac hoge.c hoge.c line(1) ERROR1371:禁止されている文字です。 #include ^ C:¥>cl hoge.java hoge.java line 1 ERROR D2345 無効な識別子です import java.io.*; ^ こんな感じかな
ランドルト環はCとは違うだろw
もし本当に君がCとJavaの違いがわからないのなら まずPCを窓から投げ捨てて小学校からやり直すことをお勧めする
512 :
デフォルトの名無しさん :2008/08/04(月) 23:01:17
>>511 言い過ぎだろ
単純にCを学んで
JAVA学べば
おのずとわかってくるもんだろ
◎ ◎ ◎ ◎ へ ◎ /∇ ) ◎ く/ // Σ>8 - - - ◎⊃ // Θ - - - (_ ∠( Θ - - - ============ Θ - - -
結局お前ら答えられないんだな
俺らの間違いじゃないの?
何を答えてもらっても分からないだけだろ
CとJavaの違いなんか挙げていったらキリないわ それほどまでに違うものをどこが違うかとか聞くのは釣りかバカかキチガイのどれか
if (xxxx) { char* hoge; 処理a } else { short* hoge; 処理b } これと同じことをswitchのcaseの中で実現する場合はどうすればいいんでしょうか?
520 :
519 :2008/08/05(火) 11:25:54
あーすみませんorz これというのは確保する名称は同じですが、ポインターの型を変えたい場合です。
>>519 変数をローカルに宣言したいってこと?
それならこんな感じで。
switch (xxxx) {
case ...:
{
char* hoge;
処理a
}
break;
case ...:
{
short* hoge;
処理b
}
break;
default:
break;
}
522 :
519 :2008/08/05(火) 11:28:54
>>521 そうです。
あーたまにネットとかで見るソースに前にif文がないのに
{ }で囲ってるのはそういう意味があるんですね。
>>522 C99やC++だと途中で宣言できるけどC90だとできないから、
客先の要望でダウングレードするときなんかは常套手段。
C++でも、デストラクタの呼ばれるタイミングを調整するために使ったりもする。
524 :
519 :2008/08/05(火) 11:39:36
そうなんですか〜 コンパイラがC99とかC90までとかの対応状況って明確に確認する方法ってありますかね? まあ書いてコンパイルしてみればいいってのもありますけど、 説明する際の根拠としてはあいまいすぎるのでw
こんな程度の奴にCのコード触って欲しくない・・・・ 頼むからjavaかVBで書いててくれ。
>>524 C99とか見たことない
Cではブロックの先頭でしか宣言しない
for内でも宣言しないようにしてる
たとえ途中で宣言できても、switch文の中はまた違うだろ
ループの中で毎回宣言はあほみたいだけど switchの中は場合によってはありなんじゃね? C->C#->Cって戻ってくるとなんとなくだけどそう思うわ。 極力使う段階で用意してってことで
>>527 そうそう、それを書いておくのを忘れていた。
switchやgotoによるジャンプで宣言部を飛び越すのは巧くないので、
ラベルの先で宣言したいときはブロック化しないといけなくなってしまうね。
流石にこんなコードは見たくも書きたくもない。
switch (foo) {
int bar;
case 'a':
func(& bar);
otherFunc(bar);
break;
default:
func2(& bar);
otherFunc(bar);
break;
}
switch (foo) { int bar; //ここに書けることをはじめて知りました!!!!www case 'a': func(& bar); otherFunc(bar); break; default: func2(& bar); otherFunc(bar); break; }
for(;;);が無限ループになるのはfor文独自の定義ですか? それとも空文が真と判定されてるからですか? 一般にfor文の外でも;は0以外の値が返るのですか? for文をif文とgoto文であらわそうと思ってるのですが空文のときがあらわせません 空文というかfor文内の;はfor文の一部なので空文とはいわないかもしれませんが どう解釈すればいいのか教えてください
>>532 古いCではその特別措置がないこともあったので、無限ループはwhile (1)を使うのが一般的でした。
ansiで特別措置ができたお蔭で、コンパイラの警告を無視することなくfor (;;)を使えるようになったのです。
536 :
526 :2008/08/05(火) 12:44:13
>>528 関数の先頭じゃなくてブロックの先頭ね
数百行の関数とか書いたことないけど
537 :
528 :2008/08/05(火) 12:50:29
おっと、for内では云々からミスリードしたみたい。失敬。 いやさ、いるのよ。数百行の関数の、先頭数十行が変数宣言だけってコードを書く人が。
関数が数百行になっちゃう人ってどうなのよ? きっとほぼ同じような処理を関数にせずに、いろんな所にハードコーディングしてるんだろうな。 または、処理を何十個も詰め込んでるとか。関数の意味ないよね。
数百行ってw もっと細かくすればいいのに
ウィンドウプロシージャとか余裕で百行くらい超えてしまうけど・・・ あれどうすればいい?
1万行の関数に泣かされたやつはさすがに少ないか なんで分けないんだろうね?
for(;;)が許される理由 特別措置でも何でもない。 ループ継続条件があり、それが偽でない限りループが継続 するように標準化された為。 それまではループ継続条件が無い場合はループ終了になるかならないかは 処理系依存であった。
while(1)は中に1(真)を入れるのになんで for(;;)は何も入れてないのに無限ループになるの? for(;;)が許されるならwhile()も許されるんじゃないの?
544 :
528 :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行もある。
>>543 それこそが、特別措置。forの場合のみ、空にすることが認められていてその場合に真と言うことになっている。
for()じゃなく for{ }と書けば理解し易いかな for{A;B;C} statement;は 次のコードが書かれているかのごとく扱うって感じ A; do{ statement; C; if(!B) break; }while(1);
>>546 A;
do{
statement;
C;
<Bが空でない場合>
if(!B) break;
}while(1);
やっぱり特別措置じゃん。
だから特別措置だっていってるじゃん
>>541 夢中になって作って、改訂することもなく、下手に触ると動かなくなるから。
要するに、スキルが低いからだわな。
ウィンドウプロシージャはどうしようもないじゃんとか前も話に出てたな
まあ switch - case はどうしても長くなるけど、 ウインドウプロシージャは個別にハンドルする関数にしてる場合が多いよね、 標準でマクロもあったくらいだし。(今もあるのか?)
552 :
デフォルトの名無しさん :2008/08/05(火) 15:29:28
sizeof()って、コンパイル時にサイズ解釈してるの? int a; a = sizeof(int); これは、 int a; a = 4; に、置き換わってるという事でOK? (intが4byteの時) なんか、関数に見せかけて、関数じゃないのかな・・・?
>>552 そそ。
コンパイル時にサイズを計算して数字に置き換わってる
関数じゃなくてマクロね
どっちでもねーよ演算子だぼけ ついでにカッコも要らん
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をスレを潰しにかかる
* sizeofは演算子。 * オペランドは、式または括弧で括った型。 * C99だとsizeofは必ずしもコンパイル時には解決されない。
可変長配列の長さをとったりだっけ?
int a; sizeof(int); sizeof a; 括弧はこんな感じだろ
C99以前でもべつにコンパイル時に解決されるって決まってるわけではないけどね ほぼすべてのコンパイラがそうするってだけで
あれ?じゃあ char a[4]; char b[sizeof a]; とか不可?
配列の宣言でサイズに変数を使うのは無理
いやいや、これは [1 + 1] みたいなもんだ。
データを読み込む際fopen freadを使っているのですが これをできればwindowsでいうフックのような形で すでにメモリに読み込んでいるデータをアクセスさせたい場合 なにか方法はありますでしょうか?
ラップ関数を書く
ソース書く前ってフローチャートとか作る? 俺はいきなりソース書くけど。
569 :
デフォルトの名無しさん :2008/08/05(火) 20:02:15
589へのスルーパス?
本人だろ
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の小さい方の数から大きい方の数までの整数を全部足し合わせたものを求めるやつ作ろうとしてるんだが エラーがでてうまくいかない。たすけてくれ。
if else に {} 入れなさい
ifとelseに{}が無い
>>572-573 いれたら今度は「1 つ以上の複数回定義されているシンボルが見つかりました」って出てまたエラー
何がいけないんだろ・・・
3000行を超えるif文はどうかと思う。
そのままの書き方を尊重すると 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); で普通にいけると思うんだが
>>574 そのエラーに該当する部分はないので、コピペしてない部分に原因があると思われます
>>576 Visual C++ 2008使ってるんだけど
なんか急に何入れても「1つ以上の複数回定義(ry」
ってエラーがでてくるようになった。
ただputs("あ");
ってプログラムでもそのエラー
ソースを切り取らずに全部書け
#include <stdio.h> int main(void) { puts("あ"); return (0); } これですらエラーになる。 Visual C++の設定がなんか変わっちゃったのかも。
なんか新しく新規作成したら直った。 スレ汚しすまんかった。
>新しく新規作成 そりゃぁ、古く新規作成はできないだろうさ。
古く新規作成したファイルならあるだろうがな
584 :
デフォルトの名無しさん :2008/08/05(火) 23:53:34
黙 っ て コ ー ド を 書 け よ ハ ゲ
585 :
デフォルトの名無しさん :2008/08/05(火) 23:56:36
新参ですが失礼します これから初めてCを学ぼうと思うのですが C C++ C# のどれから始めれば良いのか 教えてください
無論C#
587 :
デフォルトの名無しさん :2008/08/06(水) 00:01:46
>>586 素早いレスどうもです
便宜上、分かり易さでもC#からの方が良いのですか?
>>585 CとC++とC#は別物。
英語とドイツ語とフランス語の違いと同じくらい異なるもの。
589 :
デフォルトの名無しさん :2008/08/06(水) 00:08:53
>>588 そうでしたか。
ありがとうございます。
C#から頑張ってみたいと思います。
このスレの住人の皆様の御健闘をお祈り致しまして失礼したいと思います。
それでは...
Cから初めてあとは好きなのを選べばいい いきなり変なのに手を出すと後々苦労すると思うよ
591 :
デフォルトの名無しさん :2008/08/06(水) 00:38:13
C以外から始めて、二度とここには戻って来ないで欲しい。
C → 他言語に浮気 → C
C → C++(better C + STL) boost っておいしい?
少なくともそれはもうC++のスレで聞くことだよね?
Cが一番手を出しやすい気がする 基本に忠実で。
Cが一番手を出しているとも言えるな
おはようございます。おきてる方いらっしゃいますでしょうか? いまwhile文というものを書いてみました。 結果が 「1回目の実行です 2回目の実行です ・・・・ 10回目の実行です」 にしたいのですが「続行するのは何かキーを押してください」になってしまいます。 何か数字をいれると消えてしまいます。 #include<stdio.h> int main() { int i=10; while(i>10){ printf("%2d回目の実行です\n",11-i); i--; } return 0; } これの何がいけないのでしょうか? ビルドでは問題ないようなんですか・・・・ お願いします。
すみません! 自分で解決しました。 (i>0)のぶぶんでした。 目ボケなまこでむみません
i>0
i<1としてみたら?
<1にしてみました。 黒い画面が「続行するには・・・」になってしまいました。 >1にしてなにしたかったのでしょうか? 自分は初心者のためよく理解できません;;;
あれ・・? 最初って i>10だったの? それともi>0だったの?
自分が間違えて10と入力してしまったのですが本当は0です。 ココの部分を0にしたらきちんと表示できました!
なんでもっと素直に書かないんだ? と思ったら勉強中で色々試してるところなのかな?
勉強中です。 まったくの初心者なので,を忘れたり入力間違いという簡単なミスをしている段階です。 自分で確認しているのですが、ココに書き込みをして冷静になると問題点が分かるという大変迷惑なことをしています。 すみません・・・・。
ところで何で0に直したら上手く動作したのか理解してるんかいね?
i>10が真である限り繰り返すからですよね。 無限になってしまうからbreak;をつける
全然駄目じゃん 最初の宣言部で i = 10 としてるのに i > 10 つまり i が 10 より大きい時 なんて条件に当てはまらないでしょ? つまり一度もループに入らないんだよ
今日イージーミスが多すぎorz 出勤までまだ時間あるので寝ます。 すみませんでした。ありがとうございます
>>609 0にしたらってもしかすると初期化がi=0;かもよw
質問させてください 変数の配列の数を使用者側に入力させたいのですが、入力させる文を入れてから変数定義するとエラーがでます どうすればいいでしょうか こんな感じです↓ int kosu; printf("計算する数値の個数を入力してください"); scanf("%d",&kosu); int suchi[kosu]; double suchi2[kosu];
>>612 無理
配列を動的に確保するか、あらかじめかなり大目に確保しておくか
そうでしたか^^; わかりました。ありがとうございます
いつものこのセリフ C99ならできるよ
ISO/IEC 9899:1999 - Programming Language C
c99で int a[val]; みたいな動的確保やると、ヒープ領域に確保されるってことだよね?
いや、スタックか?スコープ抜けたら自動で解放されるんだよね。
スタックだよ。ElderPGならお馴染みの、alloca()で確保される。
初 心 者 は C に 手 を 出 す な JAVAかVBやってろ。迷惑だ。
じゃあ、どんな奴がC始めればいいんだよw 成りすまして評判落とそうとしてるんなら、別にいいけど
ちゃんとした大学の理工系ならしっかりカリキュラムに入ってる 始める始めない以前にやらなきゃならない
それにweb人気でC言語できる若いのが減ってるので就職した先とかによっては 仕方なしにC覚えてるやつがここへ質問に来てそうな雰囲気もある。
いいじゃんそれで 入門編スレでそんな事言われても・・・
>>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です。
>>626 ???
1しか返らないと思うが
th=One;は意味がないし
th=Two<<8; このままだと0にならない?
>>628 char型の演算はintに変換して行うよ
オプションで変えられたようなきもするけど
630 :
628 :2008/08/06(水) 12:33:01
設定とかコンパイラ依存なのかな? この間pngのパレット取り出す際にまさにそんな演算して 色情報化けまくりだった
>>626 unsigndやMIMとかtypo多すぎ
コピペでやり直し
632 :
626 :2008/08/06(水) 12:35:47
返事ありがとうございます。デバッグしてるんですがthは0x89D4になっています。IF条件を分割してデバッグしたところMAXの箇所がうまくいってないんです。
thがいくらであろうが1が返るよね
両方return 1;だからな
>IF条件を分割してデバッグしたところ このソースだせ
if (MIN <= th && th >= MAX) は if (MIN <= th && th <= MAX) じゃないの
基本中の基本だが、条件文を作るとき、そこで扱う変数の値をイメージしてるかい? 「変数aは今0で、ここを抜けると10になって…」みたいな。 イメージできないなら、条件文に入る前、処理中、条件文を抜けた後、それぞれにprintf()で変数aを表示させること。 他人に聞くよりも絶対早く解決する。
638 :
デフォルトの名無しさん :2008/08/06(水) 15:20:38
strdupって関数ありますか?
あるかもしれないし、ないかもしれない
>>623 文字列を複製するんじゃなかったかな。
ググってみたら?
641 :
640 :2008/08/06(水) 15:55:31
つくってやんよ 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; }
strcpyつかえよ
もう一バイトぐらい一緒にコピーしちまえよ
事前に長さを調べてるのにわざわざstrcpyにするのか?
>>644 忘れてたwww
最初 malloc(strlen()+1) & strcpy() だったんだけど、どうせおまえらが「長さ2回数えるなんてアホハケーン」
とか言うだろうと思ってmemcpy()に改訂したときにミスった
というわけでアホハケーン
>>643
strlen使ってるって事はnul文字が終点として認識してるんだよな わざわざmemcpy使ってる意味が分からないんだが
本気で言ってるのか、C暦何ヶ月?
C暦2008年、世界は核の炎に包まれた
/* こうですか?わかりません>< */ char* strdup(const char* src) { size_t len = strlen(src); char* ptr = malloc(len+1); strcpy(ptr, src); return ptr; }
ついでにstrlenやstrcpyの先がどうなってるかも考えてみては。
>>648 あぁ、悪い悪い、strncpyの事言ってた
>>649 strncpy(ptr, src, len);
でどうなんだって思ったわけだが
strcpyは文字列の長さなんて気にしないよね
strcpyのほうがmemcpyより遅いの?
>>656 断定はできないが、たぶん遅い。
memcpyは機械的に指定バイトコピーするだけだから、おそらくワード単位での処理とかで効率化されてる。
strcpyは常に1バイト1バイトチェックしなけりゃならない。
でも実際にはmallocのコストのほうがでかいと思うがね。
訂正 mallocのコストに比べたらたいしたことのない差だと思う
659 :
デフォルトの名無しさん :2008/08/06(水) 18:43:47
if文の条件に 変数xが aかbかcかdのいずれかなら、 ということを使いたいのですが、 その場合、 if (x == a,b,c,d) でいいんですか?
いくない
if(x==a || x==b || x==c || x==d)
662 :
デフォルトの名無しさん :2008/08/06(水) 19:10:35
fgetcって、読み込めるものがなくなると、EOFを返すんですよね。 このEOFは整数型だから、文字型の変数には代入できないんですよね?
違う、どっちも整数です だけどcharはsingnedかunsignedか決められてないので charがunsignedでEOFが-1であることがあるからintにに入れるのが普通
コンパイル時に警告が出るだけで何でも入るよ。 だからEOFの時の条件も書いたほうがいいね。
665 :
デフォルトの名無しさん :2008/08/06(水) 19:20:06
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の文字とか言い出してるんだ?
'\xff'の文字のことだと思ってあげればいいじゃない。
>>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コードに変換 するにはどうしたらいいでしょうか?
そんなコードありません
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は正負で場合分けが必要 二つ目に関しては試してないから分からんがうまくいきそうな気がする、どういう失敗が起こるの?
char* str; ↓ char str[256]; とでもして置く
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'; } } コンパイルして無いから動くか知らん
>>677 ああ、main部分か、関数部分しか見てなかった
>672 一応言っておきますがASCIIはAmerican Standard Code for Information Interchangeの略ですから 「A」「S」「C」「I」「I」であって「A」「S」「C」「U」ではありません
あすくつー
きっと明日が苦痛なんだよ
>>672 C言語関係ない
base64でぐぐれ、たぶんこれのことだろう
htmlとかの解析ってどうやるの?
base16じゃね?2バイト→16ビット→4ビット×4→4文字 あれ?
>>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
こんな感じです。
1の方、最後の二行、消してみ 2の方は警告だから無視
>>687 1番目: 3行目のpowのプロトタイプ宣言にセミコロン「;」がついてない。(警告は止まらないので無視)
>>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; } 今ソースはこんな感じです。 どうでしょうか?
>>691 いや、「どうでしょうか」じゃなくて、自分でコンパイルして、実行してみるの!
そろそろ宿題スレ行ったら?
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
#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; }
せっかくコンパイラーがエラーを出してくれているのに、何故読もうとしないのだろう?
697 :
デフォルトの名無しさん :2008/08/06(水) 23:37:18
長々とありがとうございます。 ここから自力でやってみます。
警告を無視しろなどというレベルの低い奴は教える資格無し。 コンパイラの警告レベルは常にmaxにし、警告とエラーは全てゼロになるコードを書くのが基本。
>>691 >int pow(int x, int y)
つ;
これ宿題スレからそのまんまこっちに持ち込んでるのかよ…酷いな…
七言語
有資格者は何処へ
あまいあまい。 宿題スレで回答されたコードにシンタックスエラーを追加した改悪版だよ。 んで、VCだとpowは組み込み関数なの?math.hないのにこんなエラー出るって事はそうなんだよね
>>698 fopenなどが非推奨となってる開発環境に旧資産を移すときは、その手の警告を抑えるスイッチをつけたいです
>>705 横からごめん。
fopenなどが非推奨ってどういう環境? よくあるのかしら。 ちょと気になる。
>>706 MSはfopen_sを使いなされというよ
gccのコンパイラの警告を上げるのって -Wall 以外にある?
VC++でfopen_sを使えって警告してくるアレのことじゃ?
>>709 -pedantic
その他各種-Wなんたら
713 :
706 :2008/08/07(木) 00:41:23
ダイテルの「C言語プログラミング」で独学していて、解答の理由が よくわからないところがあります。教えていただけると助かります。 復習問題5.6.b: 「『ファイルの終わりまで有効なスコープをもつ整数型の外部変数number』 の宣言を書け」という問題があって、その答えが 「static int number; (これは関数定義の外部で宣言すること)」なんです。 ・なぜ解答では記憶クラスがstaticなんでしょう。関数定義の外部で宣言するんだから、 externでもstaticでもスコープはファイルスコープになるような。 ・(上が間違っていないとして)解答でstaticが使われているのは、複数のファイルで プログラムをつくるとき、externだと他のファイルからアクセスできるから? でもそれは、スコープとは関係ないんですよね?
md5を計算するCコードってどんな感じ?
719 :
デフォルトの名無しさん :2008/08/07(木) 19:49:07
>>715 そのファイル”のみ”で有効な変数という意味だと思う
訳者が省略したんだろう
>>720 そう言われてみると、そんな意味がありそうな訳文かも。
もともと解答があきらかに間違っているわけでもないので、
そう解釈して先へ進んでみます。
ありがとうございました!
深夜にすみません。 あるループ(do while使用)で処理をおこなったあと、Enterキーを入力した場合もう一度ループするというプログラムを作っているんですが putchar();で受け取ると最初のみ2回ループ内の処理が行われてしまいます。 Enterを受け取る別のコマンドはないでしょうか? また、putcharをそのまま使うならバッファをクリアすれば? といわれたのですがやり方がわかりません。どなたかヒントいただければと思います よろしくおねがいします
ソースも出さずに質問とな
>>722 scanfと一緒に使うな。
scanfで入力を受けたときに入力された改行が、getcharで拾われているのだろうとエスパー。
もしそうなら、例えばscanfのほうをfgets+sscanfにでもすればいい。
超初心者ですが、コンパイラって無料なんですか? 設定でパソコンが壊れるって本当ですか?
>>725 無料のもあるし無料じゃないのもある
まぁ壊れること普通ないかと
>>726 ありがとうございます
無料の探して頑張ってやってみます
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って表示されないんですけど。 引数経由で詰めるにはどうすればいいのですか?
730 :
729 :2008/08/08(金) 07:24:19
struct Hoge hoge; ではなく struct Hoge *hoge; でした
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; }
>>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;
}
答える奴らも初心者かよ・・・・ お手本はこう。 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; }
>>733 お前は日本語が理解できないらしいな
まぁ確かにそっちのがいいけど
>>733 それは関数の構造を変えてるだろ。
そのほうがいいのは確かだけど
質問者は引数でポインターを渡してそこを書き換えて戻してくれってことだろ?
まずそっちを回答してから、本当はこういうほうがいいかもね
と教えるべきだろ
配列や構造体の初期化で質問があります。 現状数が少ない配列などはコンパイル時に値を代入してくれるイニシャライザー? で初期化していますが128x128の構造体配列(中はshortx4)を全部-1で初期化したい 場合はうまく指定する記述方法とかありますでしょうか?
737 :
736 :2008/08/08(金) 08:12:22
追記です >128x128の構造体配列(中はshortx4) これがさらに3つあります。
地味に自分で代入しましょう。
739 :
736 :2008/08/08(金) 08:13:33
あ・・すみません 3では無くさらに3x3の配列になってます・・・
-1だったらmemsetでいけるね。別におすすめはしないけど 0xffで埋めちゃえばできるかと
代入ロジックを自分で書くのがいやなら初期化子を自動生成したら? 例えば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" }; // 以下略
include指令をそーゆー使い方するのはおじさん感心しないなぁ 初期化用の関数かマクロを書いたほうがマシ
foo1[128][128] = { ... }; とかの宣言まで含めてスクリプトで生成させるのは時々やる
あと余計なお世話かも知れんけど、intの代わりにshortを使っても (コンパイラの設定を変えないかぎり)サイズの節約にはならないことは理解してるかい
>>744 shortが4つ並んでも勝手にサイズ調整されるんですかね?・・・・
>>739 黙って多重ループを使って明示的に実行時初期化する
ほかに類似の構造体配列がないならコストは別に変わらない
>>745 まぁ、余程のことがない限り余計なアライメントは発生しないな。
>>745 0-1バイト:short 1
2-3バイト:詰め物
4-5バイト:short 1
6-7バイト:詰め物
になるからね
配列にすれば別だけど
大抵の場合は変なこと考えずにintで取るのがCの流儀
749 :
745 :2008/08/08(金) 08:53:32
そうなんですか さっきshortからintに変更したら実行ファイルのサイズが小さくなりましたw
intというのはコンピュータが一番扱いやすい領域の大きさ(いわゆる1ワード)のことだからね shortやcharを使うと記憶領域を節約できる場合があるけど、余計なコードが必要になることも多い
>>748 そのコンパイラとコンパイルオプションは?
まさか、アライメント指示のコンパイルオプションをつけているとかプラグマ指定をつけているなんて言わないよな。
>>749 実際の演算のときは、格上げに注意。C90とC99で振る舞いが変わるからね。
>>750 朝っぱらから生半可な知識で中途半端なことを書くのはやめてくれ。フォローすんのもめんどくせぇぞ。
>>748 Cの境界調整とは記憶領域が境界をまたいで配置されることがないようにすることであって、
記憶領域の先頭をなにがなんでも境界に合わせるわけではない。
特別な指定がないかぎり、(short が int の半分なら) short を4つ連続で配置したら詰めものが入ることはない。
755 :
ym :2008/08/08(金) 11:30:14
チェック文字列で渡された 文字列が全て'A'〜'Z'の文字で構成されているかをチェックする、 プログラムを教えてください。
>>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;
}
void chk(char tmp){ char *hoge[5]={ "hoge","hoge2","hoge3","hoge4","hoge5"}; for(i=0;i<5;i++){ if(hoge[i] == tmp) 処理 } hogeの文字列と引数として受け取った文字列が一致すればなにかするっていうのを書きたいんですが、 うまくコンパイルできません。どうすればいいのでしょうか?
>>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) 処理
}
strcmpを使えばよかったんですね。どうも
char mozi[256]; char mozi[256]にtestって入ってるとして その後ろにhogeって追加したい場合はどうやればいいんですか?
>>761 配列の中は
testhoge
にするってこと?
そうです
strcat(mozi, "hoge");
入門書もヘルプ(manやMSDN)も見ずにやろうとしてるのかね・・・
質問のレベルがひどすぎる 入門者以前の、習得一週間以下くらいだぞ
訳:かまってほしいな
768 :
デフォルトの名無しさん :2008/08/08(金) 13:31:58
どういたしまして
const char *str = "hoge"; const char str[] = "hoge"; この2つは、メモリ上の確保される位置が違うのでしょうか? 前者は、読み出し専用領域なるところに確保され、他からも再利用 されるという話を聞いたのですが、後者は普通に配列を確保したような 確保のされ方なのでしょうか?
>>770 文字列リテラル「"hoge"」はコンパイラによって確保された静的な領域に置かれる
読み出し専用であるかどうかは定まっていないが、少なくとも保証されていないので、そう見なしたほうが安全である
訂正 保証されていないので→書き換え可能であることが保証されていないので
>770 "hoge"は静的領域に置かれて大抵の場合書き込み不可 再利用されるかどうかはわからないが、賢いコンパイラならたぶんやる str[]はもちろん'h''o''g''e'\0'が格納される
レスどうもです。 つまり2つは似て非なるものということですよね。 もし、char *タイプだった場合、賢いコンパイラが再利用してくれる 可能性があるなら、char []で確保するよりもベターということですよね。 もちろん定数文字列として使う場合。
ベターだとしても気にするような差ではないかもしれない 一方文字列定数を直接使うとアクセス速度が落ちるかもしれない それもやっぱり気にするような差ではないかもしれない
>>770 メモリの配置など気にしてもあまり意味ないと思うけどな。
上はconst char *、下はchar配列。別のものであることを理解してればおk。
気にしないことにします。 ありがとうございました。
>>774 いちおう補足するけど、文字列定数を使うのは「内容が変わらないことが保障されるから」だからね。
メモリが再利用されるから使うという人はあまり見かけない。
const char *p これだと、文字列は不変でも、ポインタ自体が入れ替わる可能性があることを 考えれば、 const char a[] こっちの方がガードは堅い気もする…
>>779 そこを気にするならconstもう一個つけてればいいだけじゃね?
あとはタイピングの手間を気にするかどうかか…
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[] 形式で宣言した方が低コストではある。
const char *const ptr = "hoge";
そこまでやるくらいなら #define HOGE "hoge" とでもしちゃうな俺は
>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
「LINK : fatal error LNK1168: ファイル C:\Users\user\Desktop\ノルマ\Debug\project.exe を開いて書き込むことができません。」っていうメッセージが出てビルドできないんですが、 一体どうしたら解決できるのでしょうか
実行中とか?
他にファイル開いてないんですけど
デバッグ中なんじゃないの? VC++2つ開いてたりしない? 試しにクリーンからやってみ
クリーンとは?
make clean つーか、ビルドメニューにクリーンって無いか? エクスプローラーやコマンドラインからEXE消してみてもいいし。
「このファイルが他のプロセスによって使用されていないこと、また書込み禁止になっていないことを確認してください。」と出て削除できないです
やっぱり実行中なんだろう。 デバッグ中で無けりゃ、タスクマネージャからプロセス探して殺してみそ
>>794 できました。ご丁寧にありがとうございました
>>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文の条件が式でないので意味がわからず困ってます。 よろしくお願いします。
>>797 代入した結果のtが真なら!演算子で偽になる、そんな感じ
何でこう言うのって最初から全部宿題スレで回答してもらったんですけど 中身が良く分からないので教えてくれませんか?って言わないんだろうね
俺なら書いた本人に聞けって言っちゃうと思う
単に代入文の入ったif文みたことないだけじゃないのか?
803 :
デフォルトの名無しさん :2008/08/08(金) 19:15:17
なるほど、真偽で判断しているんですね。 ありがとうございました。
>>800 宿題スレに投げてくるときでさえ、
課題を自己解釈しておかしな問に書き換えて送ってくる。
>797 ・真偽値について勉強 ・NULLの定義について勉強 ・代入文それ自体も値を持つことについて勉強 ・値も式であることについて勉強 ・if 文の条件は式ではないことについて勉強 でいけます。
807 :
デフォルトの名無しさん :2008/08/08(金) 19:42:18
strdup関数ぐぐったらありました。すみません。
>>785 char *p0 = "aaa"; //文字もアドレスも変数も変更可
コンパイラによっては文字変更不可
*p0 = 'A';//NG
他の方に作ってもらって連絡取れないんです、とかもあるぜ。 やつらはいろいろな手法を繰り出してくるから気を抜けない
いやいやエスパーでないと質問の意味が分からないのが問題だろ ユーザ定義の関数がどんな引数を受け取ってどんな戻り値を返すかなんて自由だし グローバル変数でやりとりしてるかもしれないのに
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
即レスで答えがついて終わってたのに何騒ぎ立ててんだよ
>>728 fflush(stdin) って、一般的には環境依存ではなかったでしょうか?
int mojichk(const char* data) { int mojicode = data[0] << 8 | data[1]; //処理 } S-JISのデータをintに変換している処理なんですが 思ったように動かないのでintの中身を調べたところ ffffxxxx (xxxxはdata[0]data[1]の中身) でした。 これはコンパイラ依存なんでしょうか?
>>817 char が signed か unsigned かの問題
コンパイルオプションで char を unsigned 指定するか
unsigned char と明示的に指定すればおk <- こっちのほうがオススメ
819 :
817 :2008/08/09(土) 10:42:35
記入漏れです。 >でした。 >これはコンパイラ依存なんでしょうか? でした。 期待していたのは0000xxxx だったのですが ffffxxxx となっていました。 これはコンパイラ依存なんでしょうか?
820 :
817 :2008/08/09(土) 10:43:19
>>818 あーそういうことですか。
わかりました。
符号拡張で調べておくといい
822 :
817 :2008/08/09(土) 13:50:46
つまり charだと8bit目が符号になるのでそれをintにキャストキャストした場合 たとえばcharに0x82が入っててキャストした場合0xffffff82となる で、0x72などであれば0x00000072となる ということでOKですよね?
823 :
817 :2008/08/09(土) 13:51:18
>charだと8bit目が符号になるのでそれをintにキャストキャストした場合 charだと8bit目が符号になるのでそれをintにキャストした場合 余分に・・・orz
>>822 いいえ、charがsignedであるという仮定をしてはいけません。つまり、
その説明だとsigned charの振る舞いを説明したことにしかなりません。
便乗だけど、修飾なしのcharの符号が環境依存なのは何か理由があるの?
規格が出来る前みんな好き勝手に作ってて、規格化するとき抵抗勢力に負けて統一できなかったんじゃないか、という俺の予想
>>825 格上げ(promotion, 暗黙の型変換)の仕様がまちまちだったからなんです。
リストに要素を辞書順に追加・更新する関数 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); } お願いします。
宿題スレがいいんじゃないかな
あそこだとまるまる答えを聞く感じになってしまうと思って・・・気後れしてしまって;
C言語できる人がうらやましい。 勉強すれば習得できるものなのでしょうかね。
少なくとも勉強しなければ習得はできないな
>>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;
}
先超されたか
できないやつはできないものらしい 論理能が必要とかなんとか
再帰でできることが分かってるなら、終了条件くらいしか考えることないのにね。
838 :
834 :2008/08/10(日) 00:45:05
>>837 再帰で作るのは普通に難しかったよ
やってみるよろし
>>838 やってみたよ
最初に書かれてたコードにミスがあったからちょっと時間かかったけど
そこまで難しくはないと思うが。
struct slist{ char name[10]; int score; struct slist *next; }; みたいに構造体の中で自分の型のポインタを使う事の呼び方ってありますか?
自己参照構造体
今度は私の勝利のようだな
844 :
840 :2008/08/10(日) 01:07:59
ありがとう
アンカー分の差だなw
ある数字(1-100のランダムな数字)を 他のファイル(txtファイル)として出力するにはどうすればいいでしょうか? fopenを使うやり方教えてください。
FILE * fp = fopen("他のファイル(txtファイル)", "w"); fprintf(fp, "%s\n", "ある数字(1-100のランダムな数字)"); fclose(fp);
>>847 THXTHX さっそくやってみる
これは通常のループ(forとか)にもそのままつっこめるんだよね?(2行目)
出力先がファイルなだけ
CやってC#やってCに戻ってくるとextern指定って気持ち悪くないですか?
CからC#とか似てる他の言語にすすむと文法が微妙に違ったりで気持ち悪い
文法が違うならまだしも一見同じ書き方でも仕様が違うのが気持ち悪い
javaのpublic staticがメチャクチャ気持ち悪い
そう? 「オーナーが決まってて公開される静的なメンバ」なんて 分かりやすいと思うけど。C++にも普通にあるし。 Cのようにプリプロセッサに頼ったりグローバル変数に 配置するよりも明確で良い。 プリプロセッサを否定する訳ではない。用途が違うので。
public static をグローバルと何が違うんだ?と考え込んだ思い出
シフト演算子使うときってビッグエンディアンとかリトルエンディアンとか別に関係ないっすよね?
ないよ
>>856 リトルエンディアン、ビッグエンディアンはあくまでレジスタ以外の
メモリなんかに格納した際の状態だから。
レジスタに取り出したら基本的にはビッグエンディアン状態
>>834 うおーでけました!
5行目のif文は{}で囲まなくても大丈夫なんですねー
勉強になります。ありがとうございます!
>>861 後から増やすとき楽だしねー
俺は気分で変える主義
1行で括弧付ける主義でも付けない主義でもいいが 混合はやめたほうがいい
仕事でやってる人は規約もあるだろうし
整形ツール通すことにしておけば気にならない
任意のアドレスを指定してメモリを確保することはできるorできない?今夜のご注文はどっち?
>>867 mmap VirtualAlloc 等、標準以外の方法を使えば可能
普通できないので、お使いのOS、ハードのマニュアルをお読みください
あなたがアプリならできません。 あなたがカーネルならできます。
質問なんですけど、
#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」にするか教えてもらえないでしょうか?
!とfは違うでしょ 'f'と指定
連続ですいません。 間違えてました。 #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; } でした。
*p="f";→*p='f';
つーかそれでコンパイル通るのかよ
そりゃ文法的には誤ってないし通るんじゃ? 試してないけど
const char* からcharへの変換って警告は出てるだろうけど
「移植性のないポインタ変換」を警告で済ます環境とコンパイルエラーになる環境があるようだ
リテラルの最初の文字を指すポインタ(ポインタ(整数)値)をchar型へ格下げしてるだけだもんな 10億ぐらいのコンピュータで試せば、 もしかしたらfunって動作するかもしれないよな
>>881 アラインメントの関係で f はまず考えられない
d(0x64) とか hlptx に書き換わる可能性なら十分あるけど
ずっと昔は、ポインタと(十分大きな)整数が互いに変換可能であることが保証されていた。 しかしその動作の結果は根本的に処理系依存であったので(「移植性のない」とはそういう意味である)、 ANSI/ISO規格は、高い移植性という目標のために、これを保証することをやめてしまった。 だから多くのコンパイラはこれに対して警告を出すし、そういうことに特にうるさいコンパイラは よりいっそう厳しくエラーであるとみなしてコンパイルすることを拒否する、ということになる。
>ポインタと(十分大きな)整数が互いに変換可能であることが保証 あのー、ANSI/ISOでも保証されてますけど。
そう思うなら言語仕様書の該当箇所を示してごらん。
6.3.2.3 任意のポインタ型は整数型に型変換できる。 バカは、整数型とint型の区別がつかないから。
で、自分がどの版を見てるのか理解してるのかね。
ちなみに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; だそうです。
>>887 で、自分がどれだけ恥の上塗りをしてるのか理解してる?
C99なら、888の通りintptr_tやuintptr_tで確実に保証されてるね。
それにしても質問の程度が入門をはるかに下回る初心者レベルばかりだな
整数をポインタに出来ないと組み込み機械のプログラムが出来ない (short*)0x12345678 = 0xFF;
入門してから初心者じゃないの?
雑談はスレ違い 他所でやれ
int *p; p = (int *)0x12345678; *p = 0xFF;
ガベージコレクションってどうなの?
C言語なんかでお行儀の悪いプログラム書いてメモリを開放しないで・・ ってのがよくあったのでできた機能だし>GC
901 :
デフォルトの名無しさん :2008/08/11(月) 13:17:59
こんにちは質問です 決められた範囲(こちらで指定する)の数字をスロットのように表示させるにはどうすればいいでしょうか? 画面はコマンドプロンプトでjpgなどは無しでおねがいします
コマンドプロンプトだと、実行環境によってはテキストの表示開始位置を 制御できない=新しく表示するたびにスクロールしちゃう
できるとしたらたぶんキャリッジリターン('\r')を使う
cmd.exeでは無理だな MS-DOS時代の遺産command.comなら出来るかもしれない
905 :
901 :2008/08/11(月) 13:53:55
また、スペースキーを押した場合そのスロットが止められるように とのことなんですが・・・ ループ処理で、printfで表示したものを消す→表示→消す→表示 みたいなやり方とかあるんでしょうか? また後出しになって申し訳ありませんが kbhit(),_getch() 関数を使用する そうです。関係なかったらすみません
節子、スレ違うやん。宿題スレや
>>900 GCが出来たのはもともとインタプリタで必要だったからじゃないの?
908 :
901 :2008/08/11(月) 14:08:13
すみませんアチラに移動します
>>907 いいえ違います。
GCはジョン・マッカーシーが関数型言語であるLispに使うために考え出しました。
>>909 lisp コンパイラ? lisp インタプリタ?
まあ、lisp はつくづく偉大だと思います。
インタープリタだろ。 でも、インタープリタだったから必要だったわけじゃないだろうな。
912 :
デフォルトの名無しさん :2008/08/11(月) 14:57:07
C言語で会話するスレとか立ててよエロい人
>>904 cmd.exe(というよりNTのコンソール窓)はWin32 APIで好きにできるだぞ。
eclipse上でCの開発環境を構築する方法をどなたか教えてください。
もう出来てるじゃん。
>>915 すれ違いですし普通にぐぐるとでてきますよ
>>915 ダウンロードするときC/C++つきの選べ
スレチすんませんでした
CってLinuxとwindowsどっちにむいてるの?
どっちにも向いてななんていない OSなんてみちゃいねぇ
どっちにも向いてない
ハンゲーム − チョコットランドと言うゲームで NPC_2047から始まるクエストのプログラムで教えて頂きたいのです クエストを受ける→クリアを素材、回数制限をなくしたくて いろいろ試しているのですが クエストが止まる、うけれなくなるの繰り返しで進めません どうかご教授おねがいします プログラムを書きたいのですが長すぎで省略すみません
スレチ
頼むなら宿題スレ行けよ
こんなの送りつけられても困ります
そもそもC言語なの?
そもそも日本語があやしい
ひょっとして猫なんじゃね?
猫じゃしょうがないな
自分はまだif文でつまずいています
それはおめでたいですね
配列を使用して 「abc」 次はこれに「de」を足して「abcde」 さらに「fg」足して「abcdefg」って出力するにはどうすればいいですか? 足すのはループで処理しようと思っていますが、どうにも上書きになってしまいます
恥ずかしいです。 つまずいていても前に進み今はポインタの一歩手前です。 sizeof演算子 ビット演算子 swichなどみなさんどのようにして自分のものに出来たのでしょうかorz まったく使いこなせなくつまずいています・・・。 チラ裏すみません・・・。
char array[100]; strcpy(array, "abc"); printf("[%s]\n", array); strcat(array, "de"); printf("[%s]\n", array); strcat(array, "fg"); printf("[%s]\n", array);
>>936 おお!THXTHX 配列は2個使用するワケだね?OKOK!
void myStrCat(char * p, const char * str) { while (* p++) ; while (* p++ = * str++) ; }
それはcopyじゃ?
最初に while(*p++); でnullまで進めてるから合ってるだろう あれ?null文字の一つ後ろまで飛んでね?
とりあえず用件を満足してみる #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 1文字目が既にNULLだったらどうすんだ
while (*p) p++;
NULLはポインタに使え おまえらが言ってるのはEOSだ
>>945 NUL じゃないのでしょうか?いや、'\0' ではいけないでしょうか?
NULだとNULLと混同するから良くない。'\0'ならいいんじゃね。
NULLPO
GALTU
950 :
934 :2008/08/12(火) 09:52:11
すみません、文字じゃなくて数字にするにはどうすればいいですか?
意味が分からん 123 + 45 + 67 = 1234567 って事?
952 :
934 :2008/08/12(火) 10:05:17
とりあえず
>>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;
}
こういうの?
#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; } こういうことじゃね?
まちがえた cはun・・ longで
すいません質問です 今、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 私宛でしょうか?
最初はファイルのEOFというのはファイルに付加される文字コードなのでコマンドラインからは入力できないのかと思いましたが、
調べているとコマンドラインからEOFとなるデータを入力できると書いていました。(それがCtrl+Zだった訳なんですが)
ですが、自分の環境ではそれを行ってもループを抜けないので、どなたか解る方がいたら知恵を貸していただきたいなと思った訳です。
>>958 コマンドプロンプトの仕様だから仕方ない
linuxのターミナルでやればctrl+Dは表示されない
>>958 ループを抜けるには
>abcd[enter]
>Ctrl+Z[Enter]
のように単独で入力
ご回答ありがとうございます。
>>959 なるほど・・・
サイトを見ている限り、用語の説明として
「ファイルの終端を示す特殊な記号」とか
お茶を濁したような表現から何から色々あって、よくわからないんですよね・・・
ここで言われる「ファイルの終わりを示す制御コード」というのは
>>959 さんの言う制御コードと違うんでしょうか?
「文字コード」の中にはEOFという制御コードが無いって意味ですよね?
つまり、コマンドラインから入力出切るのは「文字コード」だからEOFを表現出来なくて当然、という認識であってるでしょうか?
ごめんなさい、自分でも理解が低くて、言いたい事が上手く伝えられて無いかもです;;
ありがとうございました。
>>960 なるほど、環境によっても変わってくるんですね・・・
K&Rで勉強するならUNIXライクな環境の方がいいのかなぁ・・・
ありがとうございました。
>>961 単独入力で出来ました!!!!
あ〜とてもスッキリしました〜。
ありがとうございます!
>>962 "cygwin" で調べてみてください。わたしはこの上で宿題をといています。
>>962 EOFっていうのはファイルアクセス関数が便宜上ファイル終端になったというのを
通知するためのリターンコードの一種であるだけど思っています。
ポインターの中身が割り当てられてないもしくはポインターを返す関数が
不正終了した際はNULLを返すように。
普段、中の数字は何か意識をあまりしませんが(ポインターの場合は0かな?)
実際なんでもいいのでプレーンなテキストを用意し、秀丸なんかで開くと
EOF表示がありますが、バイナリーエディタで開くとコードは何もありません。
基本的には便宜上のものです。
>>963 Win上でUNIXぽく作業できるんですね!
使って見ます。ありがとうございました。
>>964 なるほど、テキストを扱う物なのに最初からコマンドラインでイジろうとするのが間違ってますよね。
そっちを勉強して認識を深めたいと思います。
ありがとうございました。
わかってないなー テキストじゃなくてファイルストリーム
>>966 多分、ストリームまったく理解してないです。
保存してあるデータを一繋ぎ(ストリーム)にして、作業できるようにするんですよね?
とりあえず、ファイル入出力関数を勉強してから出直してきます!
ありがとうございました。
>>967 fopen(), fclose(), fprintf(), fscanf() の系統と、
open(), close(), read(), write() の系統があることに留意してください。
そして、両者の関係については、K&R2 8.5 をみていただければいいかと思います。
>>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]の値をポインタもとに *で中身を参照したい。 } 作りがマズイですか?
infT.Fname="filename "; char型のポインターにいきなり文字列いれてもなあ。 char data[128] = "filename"; とか入れておいて infT.Fname = data; とかでないと無理よ
>>970 1.領域を確保していない
2.型を勘違いしている
何をどうしたいのか分からない
973 :
970 :2008/08/12(火) 15:30:59
はい、行数多すぎと怒られたので、ダイジェストにしたんですが、 すみません。スレも残り少ないので..... strcpy()とかしてます。 次スレあるか探して、数スレになるかもだけど、再度書きます。
975 :
970 :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]; }
976 :
970 :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でファイル名が得られるようにしたい 作りがマズイですか?
struct InfoTable { int n; char *Fname[Fmax]; int flg[Fmax]; } struct Tbl { char *cname[50]; InfoTable *infT[50]; } まず質問 この構造体の中でアスタリスク(*)ついてるのはポインターであって 文字や構造体そのものの配列ではないんだけどOKなの?
見にくいし、まず #define の時点で間違ってる
GetFikeNamae ネーミングが駄目
突っ込みどころが多すぎる
GetFikeNamae やるな。お前。センスあるぜ。
982 :
970 :2008/08/12(火) 16:14:45
>>979 あれ、本当だ、nameです。
>>981 照れます。
>>977 はい。
ポインタを各配列にいれて、順に、その配列に入っている先のポインタを
参照してファイル名を取得したいです。
cname[0],cname[1]......
Fname[0],Fname[1].....
には、ポインタを格納するでOKです。
*table.cname[c] ↑ これがなんなのか良く考えろ table.cnameはポインタの配列で table.cname[c]はポインタだろ?
C99で構造体タグは自動でtypedefされたっけ?
985 :
970 :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を書いたけど、実際問題として、意図どおりのものは 既に格納されていると考えて良いですか?
×ポインタであって、文字列は入っていない ○文字へのポインタを与えるべきところに文字を与えている
だからまずdefineから間違ってるって言ってるだろ 教科書読み直せ
989 :
970 :2008/08/12(火) 16:31:27
>>986 分かったような.....
はずかぴーー
コードがメチャクチャすぎ。 >GetFikeNamae (GetFname, c);/* c に対応するファイル名ゲッター */ GetFnameがない。 >InfoTable *infT; infTはポインタなのに >strcpy(infT.Fname[c],GetFname); オブジェクトでアクセスしてる。 >for(int c=0,c<10 ,c++) これもひどい。 コンパイルも出来ないようなコードで質問されても直しようがない。
これコンパイル通らんだろ
>>985 上を全然読んでないけどとりあえず
*table.cname[c] は文字列ではない
HWからやりなおせ
ビールうめぇ
今度から俺もgetFilenamaeにするよ。
996 :
970 :2008/08/12(火) 16:38:17
>>991 抜粋してるので、不足分はありますが、通りますよ。
と、実際にコンパイル通っているのとは、違うかも。
スマン!皆さん!!
>>993 HWって?
このカスは何がしたいんだ
わかんない
余裕で1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。