C言語なら俺に聞け(入門篇) Part 33
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/07/26(土) 21:01:37教えて欲しいのではなく宿題を丸投げしたいだけなら宿題スレへ行ってください。
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
0002デフォルトの名無しさん
2008/07/26(土) 21:14:32int
main
(void
){
printf
(">>1 "
"otu"
"\n");return 0;}
0003デフォルトの名無しさん
2008/07/26(土) 21:17:06IEで見たら失敗しとる><
0004デフォルトの名無しさん
2008/07/26(土) 21:50:260005デフォルトの名無しさん
2008/07/26(土) 22:01:450006デフォルトの名無しさん
2008/07/26(土) 23:17:580007デフォルトの名無しさん
2008/07/26(土) 23:54:550008デフォルトの名無しさん
2008/07/26(土) 23:57:47プログラムを作らせるのは誰でも出来るというわけではない
0009デフォルトの名無しさん
2008/07/26(土) 23:58:01ついでに言えば、社会常識のないプログラマの尻拭いや、構ってちゃんのプログラマのケアや、
使えない上司への報告や、理不尽なクライアントの交渉なども含まれますから楽だなんてとてもとても。
0010デフォルトの名無しさん
2008/07/26(土) 23:58:300011デフォルトの名無しさん
2008/07/26(土) 23:59:350012デフォルトの名無しさん
2008/07/26(土) 23:59:55そのくせ人件費が掛かるとか救えねえ
0013デフォルトの名無しさん
2008/07/27(日) 00:02:070014デフォルトの名無しさん
2008/07/27(日) 00:10:33業務のほうを一般的なものに合わせるほうが
効率がいいのにそうしないからな
0015デフォルトの名無しさん
2008/07/27(日) 00:12:000016デフォルトの名無しさん
2008/07/27(日) 00:29:05奨学金のシステムやったけど、導入の単位が市町村で、制度はほとんど同じなのに
やっぱ、自治体ごとに微妙に違うんだよな。
こんなの県や国単位で統一すれば、おんなじシステム使えて安くなるのにな。
0017デフォルトの名無しさん
2008/07/27(日) 00:34:51同じ業務パッケージでも、サイトごとに修正を入れているものがほとんど
ソースコードの管理は大変だろうなと思ってしまう
0018デフォルトの名無しさん
2008/07/27(日) 00:34:540019デフォルトの名無しさん
2008/07/27(日) 00:52:550020デフォルトの名無しさん
2008/07/27(日) 00:58:290021デフォルトの名無しさん
2008/07/27(日) 01:04:040022デフォルトの名無しさん
2008/07/27(日) 05:03:04扱える数の範囲を超えてるからでしょうか?
0023デフォルトの名無しさん
2008/07/27(日) 06:09:570024デフォルトの名無しさん
2008/07/27(日) 06:39:220025デフォルトの名無しさん
2008/07/27(日) 07:42:02p[3];
とかにアクセス出来るんですけど?
ポインタって配列なんですか?
0026デフォルトの名無しさん
2008/07/27(日) 07:46:10は
*(p+3);
だと思う。
0027デフォルトの名無しさん
2008/07/27(日) 07:47:190028デフォルトの名無しさん
2008/07/27(日) 07:59:58char*型じゃなくてもいい気がするんですけど。
str*系とかもそうですよね?
一体何に利用するんですか?
0029デフォルトの名無しさん
2008/07/27(日) 08:38:570030デフォルトの名無しさん
2008/07/27(日) 08:59:26そのまま別の関数に渡せるように。
0031デフォルトの名無しさん
2008/07/27(日) 09:42:35まあ、そうでしょうが、それって現実的に使われてますかね?
strcpy(foo, strcpy(bar, strcpy(baz, "foobarbaz"));
こういう風ですかね、例えば。
0032デフォルトの名無しさん
2008/07/27(日) 09:48:57こういうコードは稀に見かける。
0033デフォルトの名無しさん
2008/07/27(日) 10:05:070034デフォルトの名無しさん
2008/07/27(日) 10:38:58つシンタックスシュガーhttp://ja.wikipedia.org/wiki/%E7%B3%96%E8%A1%A3%E6%A7%8B%E6%96%87
0035デフォルトの名無しさん
2008/07/27(日) 12:37:31fftをつくりたいんだけど
どういう風につくればいいのかビジョンがみえない。
ビジョンがみえればスイスイかけるんだけど。
ネットにあがってるのあるけどなげーよ。
0036デフォルトの名無しさん
2008/07/27(日) 12:44:27http://ja.wikipedia.org/wiki/%E9%AB%98%E9%80%9F%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B#.E5.8E.9F.E7.90.86.E3.81.AE.E7.B0.A1.E5.8D.98.E3.81.AA.E8.AA.AC.E6.98.8E
0037デフォルトの名無しさん
2008/07/27(日) 13:58:42古い本ですが、
Cによる科学技術計算/小池慎一/CQ出版 1987
いろいろなバリエーションがソース付で紹介されています。その手の本ではわりに有名。
0038デフォルトの名無しさん
2008/07/27(日) 15:03:17abort の代わり?
0039デフォルトの名無しさん
2008/07/27(日) 15:28:260040デフォルトの名無しさん
2008/07/27(日) 15:34:47F=ma を計算する
004141
2008/07/27(日) 22:29:39このプログラムにカウントダウン機能をつけようと思っているのですが、どうもうまくいきません。
LIMIT_TIMEを60秒としてこれを常に表示したいと思ってます。
どなたかご教授ください。
0042デフォルトの名無しさん
2008/07/27(日) 22:42:220043デフォルトの名無しさん
2008/07/27(日) 22:48:15まずはTabとかで見やすくしてくれると嬉しいな。
俺Linuxなんでconio.hがないんであれなんだが、どう
上手く行かないのかざっと説明してもらえるかい?
0044デフォルトの名無しさん
2008/07/27(日) 22:59:24てかあの状態でもアジがあると思ったんだけどなあ・・・
004541
2008/07/27(日) 23:01:27すいませんTabとかよく知りませんで・・・
最初は2つ目のwhile文のch = getch();の後に
printf(" 残り%4d秒\b\b\b\b\b\b", lim-end/CLOCKS_PER_SEC);
というプログラムを打ったのですが、これだと1文字打つたびに秒数が表示されてしまいおかしなことになってしまうといった感じです。
0046デフォルトの名無しさん
2008/07/27(日) 23:07:00ex31.txtが無いので実行できません
004741
2008/07/27(日) 23:27:50やはり1文字ずつの表示だと自分のではダメだったみたいで・・・
>>46
大変申し訳ありませんでした。
ex31.txtの中身はA friend in need is a friend indeed.と書いたテキストファイルです。
0048デフォルトの名無しさん
2008/07/27(日) 23:36:36話が見えないから開発したスレも頼む
ついでにconioはこっちの方が適切だとは思う
【初心者歓迎】C/C++室 Ver.57【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1216215558/
0049デフォルトの名無しさん
2008/07/27(日) 23:44:18動くか分からんけど白根
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7518.txt
005041
2008/07/27(日) 23:48:45そちらのほうで質問してみたいと思います。
0051デフォルトの名無しさん
2008/07/27(日) 23:51:05今日の日付(具体的には年月日)を配列に格納したいのですが
たとえば「2008/07/27」のように項目ごとにスラッシュを入れて格納する方法はないでしょうか?
0052デフォルトの名無しさん
2008/07/27(日) 23:55:00strftime
0053デフォルトの名無しさん
2008/07/27(日) 23:55:560054デフォルトの名無しさん
2008/07/27(日) 23:56:12入力される度にその行を頭から書き直すのが楽かもな。
それかエスケープシーケンス使ってカーソル位置制御って手もあるし。
005641
2008/07/28(月) 00:14:12ありがとうございます。
コンパイルはできたのですが、やはりエラーが出てしまいました。
参考に出来る部分もあると思うので頑張ってみます。
>>55
色々ありがとうございます。
それらの方法も試してみます。
0057デフォルトの名無しさん
2008/07/28(月) 01:15:44自分は初めてプログラムを勉強しています。
「猫でも分かる C言語プログラミング」という本を見ていますが分からない部分があります。
char→文字
ing→整数
double→小数 というのは分かりましたが
double「pat」 =3.1415926
int「mon」=2;
float「flt」=1.2f;
「」のなかの文字は何を表しているのかが分かりません。
これは円周率についてプログラムを書いているみたいです。
もし「猫にも分かるプログラミング」の本を持ってる方いたらp51です・・・。
自分はまったく知識もないし、学校にも行っていません。
本当に初心者で恥ずかしいですがお願いします。
0058デフォルトの名無しさん
2008/07/28(月) 01:16:210059デフォルトの名無しさん
2008/07/28(月) 01:17:580060デフォルトの名無しさん
2008/07/28(月) 01:21:35何でプログラミングでも始めようと思ったん
0061デフォルトの名無しさん
2008/07/28(月) 01:23:12char→文字
int→整数
double→小数
これらは変数の型
つまり
int mon = 2;
と言うのは
int 型(整数を扱う型)の変数名 mon と言うものを宣言して
それを 2 で初期化してる
0062デフォルトの名無しさん
2008/07/28(月) 01:25:29初めてHello Worldを組んで成功して面白いと思ったのです。
しかし変数でつまずいています。
もっと言うとマイクロ社からDLする時点でつまずきました
0063デフォルトの名無しさん
2008/07/28(月) 01:28:07ネタにしかみえない
>char→文字
>ing→整数
>double→小数 というのは分かりましたが
char型ってのは文字というより1バイトで表現できる数値型だよ。
たまたま文字コードもその範囲で表現できるので文字とかいってるけど。
ingじゃなくてintね
>double「pat」 =3.1415926
>int「mon」=2;
>float「flt」=1.2f;
これもよくわかんね〜
0064デフォルトの名無しさん
2008/07/28(月) 01:29:00宣言名ということはmonでなくてもいいということですか?
それとも決まっているのですか?
0065デフォルトの名無しさん
2008/07/28(月) 01:31:03monでなくてもOK
任意で決めれます。
まー仕事でする場合は命名規則とかもあるだろうし、
0066デフォルトの名無しさん
2008/07/28(月) 01:31:32変数名として使える文字はこれだけ
・小文字と大文字のアルファベット
・数字
・_(アンダースコア)
0067デフォルトの名無しさん
2008/07/28(月) 01:33:14ネタであって欲しいぐらい初歩的なことですみませんでした・・・。
0068デフォルトの名無しさん
2008/07/28(月) 01:35:470069デフォルトの名無しさん
2008/07/28(月) 01:41:15「きつい」「帰れない」「給料が安い」で興味を持つって凄いなあんた…
http://ja.wikipedia.org/wiki/3K
もう居ないかも知れないが
一人で始めたんなら仕方ないけど身近に相談できる人を出来たら探した方が良い
深い知識があって親身に教えてくれる人な
今回みたいなので疑問に思うって事は後々でてくる
配列やポインタでも疑問点が解決できずに先に進めなくなる可能性があるから頼りになる人が必要になる
知識も無いのにネット上で情報を漁るのは危険だし
一冊読み終わるまではそいつに引っ張ってもらって分からない所をガンガン教えてもらう
ある程度まで進めれば自分で理解を試したり理解を深めていけるから
それまではそういう人に甘えてしまった方がいい
0070デフォルトの名無しさん
2008/07/28(月) 01:46:3642Kをどうぞ
http://blog.codezine.jp/editor/2007/11/3k42k.php
0071デフォルトの名無しさん
2008/07/28(月) 01:47:14近くに元プログラマーはいます。
その人に聞くことは出来ますが、出来るだけ自分でググッたり参考書をみて解決しないと自分のためにならないと思いました。
しかし、やはり一人だとすぐに分からないことが出てきて今回初めて質問してしまいました。
不快になった方もおられると思いますが温かい言葉ももらえて嬉しかったです。
0072デフォルトの名無しさん
2008/07/28(月) 01:52:130073デフォルトの名無しさん
2008/07/28(月) 01:56:53表現も微妙で分かりにくい。そんなことない?
俺は新訂新C言語入門系列を使ってた訳だが。
0074デフォルトの名無しさん
2008/07/28(月) 02:04:210075デフォルトの名無しさん
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ちゃんとアマゾンで好評だったので手に取っただけです。
初心者の自分にはどれがいい悪いが分からなかったので
0076デフォルトの名無しさん
2008/07/28(月) 02:22:10どういう形で表示するかを指定してて
%4.2f
この場合4は最大4桁
.2はそのうち小数点以下に2桁使うということです。
fは小数点を扱う変数を指定する場合に使います。
小数点がない場合はd
0077デフォルトの名無しさん
2008/07/28(月) 02:25:29double pai = 3.14159;
printf("円周率は%4.2fです。\n",pai);
↑3.14159と%4.2fは繋がっていたんですね!!
>>76さんありがとうございます!!
0078デフォルトの名無しさん
2008/07/28(月) 02:26:10%04.2f
とすると
整数部分が一桁しかない場合は開いている桁の部分を0で埋めてくれます。
0079デフォルトの名無しさん
2008/07/28(月) 02:28:49008076
2008/07/28(月) 02:28:59その辺はprintf 書式 で検索すると解説しているサイトはいっぱいでてきますので
調べてみるといいですよ。
参考に1サイト
http://cai.int-univ.com/sugsi/Lecture/c_language/Book/detail_printf.html
008176
2008/07/28(月) 02:30:33イエス
ゲームなんかでスコア表示するときに桁がわかりやすくなるように
0で埋まってたりしますよね
あんな感じです。
あと本だけで覚えようとせずプログラムを実際に書いて実行できる
環境を用意して試してみることをおススメします。
0082デフォルトの名無しさん
2008/07/28(月) 02:30:47>「%の次に-(マイナス)がないときは右つめになる」
と言うのは
printf("%10.2f", pai);
printf("%-10.2f", pai); と書いたら
結果は上から
3.14(10文字分表示出来るスペースを空けて右詰)
3.14 (10文字分表示出来るスペースを空けて左詰)
とそれぞれなる
0083デフォルトの名無しさん
2008/07/28(月) 02:38:33,、 ワカッタゾォ!!!
ヘ○ 彡
/ノヽ_
i | l |i
っぽくて懐かしんだ
008476
2008/07/28(月) 02:41:30プログラム内容によっては使わないことが多いんだよな・・・
0085デフォルトの名無しさん
2008/07/28(月) 02:42:55小数点がない場合は .0f では?
0086デフォルトの名無しさん
2008/07/28(月) 02:43:09自分はゲームまったくしたことがありません。
しいて言うならテトリスとマリオカートぐらいです。
サイト参考にします。
>>82の説明よく分かりました
一応、プログラム「書くこと」は出来ますが「理解」が出来ない部分が多いのが事実ですorz
⊃http://jp.youtube.com/watch?v=d_yOg88lb4Q&feature=related
感謝の気持ちをこめて拾ってきましたハムスターです
0087デフォルトの名無しさん
2008/07/28(月) 02:46:38っていつの時代だよ!
0089デフォルトの名無しさん
2008/07/28(月) 05:10:0810万×10の配列を取って計算したいのですが、
プログラムを実行すると動作が停止してしまいます。
100×10程度にすれば計算可能なようですが、
10万×10の配列の計算を可能にさせるような方法はありませんか?
0090デフォルトの名無しさん
2008/07/28(月) 05:12:18p = malloc
0091デフォルトの名無しさん
2008/07/28(月) 05:13:50ヒープの割り当てが少ないんじゃないの?
その二次元配列の頭にstatic つけてコンパイルしなおしてみなよ。
ちなみにint型の2次元配列?
10万x10x4バイト場所とるよ・・・
009289
2008/07/28(月) 05:30:00staticをつけてコンパイルをしてみたところ、
動作の停止は避けられたのですが、計算結果が帰ってきません。
グローバル変数にしてみても、ダメなようです。
2次元配列はdouble型です。
009391
2008/07/28(月) 05:36:31つーかそのソース晒せない?
なんか間違ってそう・・・
009489
2008/07/28(月) 05:43:29ソースは晒せますが、200行くらいあります
009591
2008/07/28(月) 05:51:48単純計算で
100,000x10x8=8,000,000byte 約8Mだからねえ
あれだねえ。
こっちの担当かも
C/C++の宿題を片付けます 114代目
http://pc11.2ch.net/test/read.cgi/tech/1216746971/
009689
2008/07/28(月) 06:00:28もう一度、よく考えてみます。
ヒープの割り当てが足りないとのことでしたが、
デスクトップアプリケーションヒープを8MBに設定するとかはダメですか?
009791
2008/07/28(月) 06:04:16でもstaticで計算失敗してるってそもそもロジックがおかしいとしか思えん。
static無しで8MBのテーブルとろうとすれば起動時のヒープだとかの設定で
回避できるだろうけどね。
009889
2008/07/28(月) 06:08:11staticで計算出来るように修正を図ってみます。
009991
2008/07/28(月) 06:13:59がんばってね
今回の問題は
・8MBの領域確保
・計算結果が思ったようにならない
で分けて考えないとね。
領域のほうは
・staticでコンパイル時にあらかじめ静的に実行ファイル内に持ってしまう。
・>>90のいうように実行時にmallocで確保する。
くらいかなあ。
サイズが小さければ一時的に使える領域(たぶんヒープ上に用意したスタック?)
に取れるんだろうけど、今回のサイズはこれを超えててstatic無しだと
バッファオーバーフロー状態になってるかと。(C言語詳しい人フォローよろ)
0100デフォルトの名無しさん
2008/07/28(月) 12:13:46前者は兎も角、後者はprintf("%4.2f", 1e10)とでもしてみれば判ることだと言うのに。
0101デフォルトの名無しさん
2008/07/28(月) 12:50:120102デフォルトの名無しさん
2008/07/28(月) 14:36:20if (foo(x) < 0) {
/* エラー処理 */
}
みたいに書いてあることが多いのですが
if (foo(x))
や
if (foo(x) == -1)
って書くのはよろしくないんですかね?
0103デフォルトの名無しさん
2008/07/28(月) 14:40:40ただ
前者はエラーの内容によって正負に分けた時に修正が必要
後者はエラーの内容によって数字を分けた時に修正が必要
0104デフォルトの名無しさん
2008/07/28(月) 14:43:11if(foo(x) != 0)
と書く
0105デフォルトの名無しさん
2008/07/28(月) 20:58:290106デフォルトの名無しさん
2008/07/28(月) 21:00:47switch(c = fork()) {
case -1: exit(1); break;
case 0: child(); _exit(0); break;
default: parent(); break;
}
0107デフォルトの名無しさん
2008/07/28(月) 21:47:12レベルの高い人たちは昇進してエロくなってしまいました
0108デフォルトの名無しさん
2008/07/29(火) 03:29:520109デフォルトの名無しさん
2008/07/29(火) 03:35:11俺も聞きたいな
staticをつけると実行ファイル内に確保されるのはわかる。
static無しの場合はコンパイルしても実行ファイルのサイズは大きくならないのに動いてる。
でも>>89のようにある一定以上の領域を使おうとすればバッファオーバーフローぽいので
おそらく本来は使えないエリアにアクセスしてこける。
まあ大きい領域を使う場合はmallocしてるから普段は気にしてないんだけど。
じゃあたとえばC言語で関数の中だけで使えるintとかって実態はどこに取られるの?
ってことだな。
まあint1つ程度だとレジスタとかで終わりそうだけど、配列とかサイズが大きくなると
とてもレジスタではまかなえない・・・じゃあどこに?・・
0110デフォルトの名無しさん
2008/07/29(火) 03:56:41スタックって知ってるか?
0111109
2008/07/29(火) 03:59:52ただ、疑問なのはシングルスレッドアプリが全盛のDOSの
ころならシステム全体で1つのスタックエリアを使ってた。
昨今のマルチスレッド全盛の場合そのスタックって
実行ファイル毎にどこに持ってることになってるの?
となる。
当然アプリ毎でないとスタックとして機能しないだろうから。
で>>100はそのスタックがヒープではないといってる。
0112デフォルトの名無しさん
2008/07/29(火) 04:20:12たとえプロセスのスタック領域がどれも同じアドレスにあったとしても問題ない
0113デフォルトの名無しさん
2008/07/29(火) 07:15:17仮想アドレスから実アドレスへのマッピングはプロセスごとに別々になってるから
別々のプロセスが同じ仮想アドレスを使っててもマップされる実アドレスは異なるので衝突しない
異なるプロセスが使ってるメモリは自プロセスの仮想アドレスにはマップされないので
基本的に覗くことも触ることもできない
それはそれとして、スタックアドレスは固定にする必然性はないよ
実行ファイルのロード時にOSが適当に確保してスタックポインタ設定すれば済むだけだし
0114デフォルトの名無しさん
2008/07/29(火) 08:54:30アドレスのどこを使うかってのはシステム(CPUやOSで決まるのが大半)が定義しているだけであって、プログラマはスタックやヒープがどのアドレスに割り振られてるかなんてシラネ、ってのがC言語。
まぁアクセスするアドレスを直に指定できるけど、組み込みぐらいしか使わんでしょ。
自動変数、関数呼び出し時の引数、戻り値、内部的には関数呼び出した後の戻り先アドレスなど、一時的に使用されて使用された順番に消えていく領域の確保先を、スタック領域と呼んでいる。
動的に確保して解放するタイミングをプログラマが指定する場合に使用する領域を、ヒープ領域と呼ぶ。
扱う性質が違うから、スタックとヒープはまったく別物。
厳密に言えば違うところも出てくるけど(ゲーム機とかは自前のmallocを持ってたりするからヒープ領域なんて概念すらなかったり)、上記の解釈で十分。
0115デフォルトの名無しさん
2008/07/29(火) 15:33:110116デフォルトの名無しさん
2008/07/29(火) 16:14:24borlandのturbo debuggerは落とせないし・・・
どれがいいのでしょうか?
0117デフォルトの名無しさん
2008/07/29(火) 16:19:380118デフォルトの名無しさん
2008/07/29(火) 23:12:22BitComet介すとダメなようで、普通にやったら普通にいけました。
ご迷惑おかけし、申し訳ありません;;
ところで、入門本で三角形の公式プログラムが載っていたので自分で
台形のを作ってみようと思い実践したのですが、何度推敲しても成功しません…
↓なのですが間違いを教えていただけないでしょうか?
0119デフォルトの名無しさん
2008/07/29(火) 23:12:55これです。
#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);
}
よろしくお願いします
0120デフォルトの名無しさん
2008/07/29(火) 23:17:040121デフォルトの名無しさん
2008/07/29(火) 23:18:27エラーメッセージを見ろ。おそらく7行目でエラーを起こしているはずだ。
0122デフォルトの名無しさん
2008/07/29(火) 23:18:54void main -> int main
int takasa: -> int takasa;
プログラミングの初歩はコンパイラが出すエラーをちゃんと理解することからです
0123119
2008/07/29(火) 23:19:00書き込み見て気付いたのですが、int takasaのよこが;ではなくて:になってましたね…
直したらいけました。スレ穢し申し訳ない・・・
0124119
2008/07/29(火) 23:21:04>>122
その「main」の部分のことなのですが、一応「void」でもやりたいことはいけるのです。
「int」との使い分けはどうなっているのでしょうか?
と、とりあえずintにしてやってみます!!!
0125デフォルトの名無しさん
2008/07/29(火) 23:21:090126デフォルトの名無しさん
2008/07/29(火) 23:21:32intにしないといけないことになってる。
0127デフォルトの名無しさん
2008/07/29(火) 23:22:46やりたいことはやれてもmain関数はintを返すのが決まりなのでvoidは間違い
0128デフォルトの名無しさん
2008/07/29(火) 23:23:42仕様で決まってることの話をしてるときに大雑把なこというな
0129デフォルトの名無しさん
2008/07/29(火) 23:26:580130デフォルトの名無しさん
2008/07/29(火) 23:35:440131デフォルトの名無しさん
2008/07/29(火) 23:37:300132デフォルトの名無しさん
2008/07/29(火) 23:38:14確かにintでやってみたところ、「警告:関数mainに整数を返せヨ〜」
と言われました。
整数を、返す?
これはいったいどういうことなのでしょうか?
返すと言ういみが分からないのです…
教えていただけませんか?
0133デフォルトの名無しさん
2008/07/29(火) 23:49:37今後も人におんぶに抱っこだぞ
0134デフォルトの名無しさん
2008/07/29(火) 23:52:23Windowsを使ってるなら今は気にしなくていい
#includeが魔法の言葉であるように
int mainと return 0がセットになってると考えておk
関数の部分に入ればちゃんと理解できるから
0135デフォルトの名無しさん
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
とするには何が間違っているのでしょうか?
じぶんで確認してるのですが何が間違っているのか分かりません。
お願いします。
0136デフォルトの名無しさん
2008/07/30(水) 02:17:570137デフォルトの名無しさん
2008/07/30(水) 02:25:33ご指摘の通り「%b」がおかしかったみたいです。
自分で「%b」と書いていたので全て=の次がbとなってしまい悩んでいました。
もう一度最初から書き直したら見事に成功しました!
0138デフォルトの名無しさん
2008/07/30(水) 09:37:39なんでそれを読んで解決しようとしないの?
ずっと人に聞きっぱなしだよそれじゃ
0139デフォルトの名無しさん
2008/07/30(水) 10:10:07残念、printf系のフォーマットを間違えた程度では警告レベルを高くしないと警告されない。
まして、言語的には何の問題もないのでエラーになりようがない。
0140デフォルトの名無しさん
2008/07/30(水) 10:25:420141デフォルトの名無しさん
2008/07/30(水) 11:01:34ウィンドウメッセージの送信元のウインドウハンドルを取得したいんですが、
どうすれば良いんでしょうか?
送信元のアプリは自分で作る訳ではないので、ウインドウメッセージ内にハンドルを格納する、というのは無理です。
自アプリに対して、誰がどのようなメッセージを送信してきているのかを把握したいんです。
Spy++等で受信しているメッセージは見れるんですが、送信元が分からないもんで・・・。
よろしくお願いいたします。
0142デフォルトの名無しさん
2008/07/30(水) 11:06:580143デフォルトの名無しさん
2008/07/30(水) 11:17:33送信するのはウインドウとは限らない
0144デフォルトの名無しさん
2008/07/30(水) 11:26:450145デフォルトの名無しさん
2008/07/30(水) 11:26:530146デフォルトの名無しさん
2008/07/30(水) 11:27:25やっぱり、無理なんですかねぇ。取得するのはプロセスIDでも構わないんです。
とにかく送信元が特定できれば問題ないです。
環境はWindowsXPです。
スレ違い、すいません・・・。
0147デフォルトの名無しさん
2008/07/30(水) 11:30:02失せろ
0148デフォルトの名無しさん
2008/07/30(水) 11:33:26ここではどう考えてもスレチです
0149デフォルトの名無しさん
2008/07/30(水) 16:17:38みたいな書き方ってどういう意図が込められてるんですかね?
if (expr)
statement
ではなくて。
0150デフォルトの名無しさん
2008/07/30(水) 16:26:08俺は改行して書くぜ
俺はいつでも中括弧を付けて書くぜ
0151デフォルトの名無しさん
2008/07/30(水) 16:31:070152デフォルトの名無しさん
2008/07/30(水) 16:49:48書かれている通りの意図だろうよ。
0153デフォルトの名無しさん
2008/07/30(水) 16:59:15逆に聞くけど、後者の書き方にはどんな意味がこめられてると思うわけ?
0154デフォルトの名無しさん
2008/07/30(水) 17:08:14読み手に与える印象を弱めるためだろう
statementが取るに足らない処理である場合そう書いたりする
0155デフォルトの名無しさん
2008/07/30(水) 17:12:47やはりそうですか。
0156デフォルトの名無しさん
2008/07/30(水) 17:13:52意図というより、人やコーディングルールによってどっちの書き方に決まっているように思う。
1人の人間が書いた1つのコードの中で両方の書き方が混ざっているのは見たことがない。
0157デフォルトの名無しさん
2008/07/30(水) 17:20:410158デフォルトの名無しさん
2008/07/30(水) 17:31:25書く量を少なくする努力よりも、誤解を生まない書き方をする努力のほうが大事だと思うし。
0159デフォルトの名無しさん
2008/07/30(水) 18:27:42if(expr1) statment1
else if(expr2) statment2
...
って書いてる
もちろんタブで揃えて
0160デフォルトの名無しさん
2008/07/30(水) 18:34:45俺は混ぜて使う場合があるよ
ifのみで一行で済む場合は一行で書くが
後のelse節が複数行になる場合は合わせて改行する
まあ好みの問題
0161デフォルトの名無しさん
2008/07/30(水) 18:40:070162デフォルトの名無しさん
2008/07/30(水) 18:41:59sprintfとsscanfってどっちを使えばいいんでしょうか。
sprintf(s, "%d", a);
sscanf(s, "%d", a);
この2つってどっちも同じ気がしますが・・・
あと、\0は入りますか?
0163デフォルトの名無しさん
2008/07/30(水) 18:43:53その2つはぜんぜん違うよ!
「配列に文字列を入れる」だったらstrcpy()だよ!
0164デフォルトの名無しさん
2008/07/30(水) 18:56:39のような場合はどう書けばいいですか?
0165デフォルトの名無しさん
2008/07/30(水) 19:00:46strcpy(s, "%d", a)ってエラーになりませんか?
0166デフォルトの名無しさん
2008/07/30(水) 19:03:00一行目で御幣が生じたんだろう
0167デフォルトの名無しさん
2008/07/30(水) 19:03:44if (fmod(num, 0.34) != 0)
しかし誤差を考慮しないとあんまり嬉しくない結果になると思う
0168デフォルトの名無しさん
2008/07/30(水) 19:06:280169デフォルトの名無しさん
2008/07/30(水) 19:18:05整数を文字列に変換したいのと文字列を文字配列に入れるのとは違うってことだろ
0170デフォルトの名無しさん
2008/07/30(水) 19:42:18キミのやりたいことは何だ?
・整数aを文字列にして文字配列sに格納したい
・文字配列sに入っている数字を表現した文字列をスキャンして、整数変
数アドレスaの指す先に格納したい
前者がsprintf()、後者がsscanf()
0171デフォルトの名無しさん
2008/07/30(水) 20:00:43ありがとうございます
if (fmod(num, 0.34) != 0)
{printf("numの倍数ではありません")
}
みたいなプログラム作ってみたんですけどnumに0.34入れても
"numの倍数ではありません"って出てきます。
なんでなんでしょう?
0172デフォルトの名無しさん
2008/07/30(水) 20:02:2210E12ですか?
0173デフォルトの名無しさん
2008/07/30(水) 20:03:03誤差を考慮しましょう。それから、レスの書き方のコツを身に着けましょう。
0174デフォルトの名無しさん
2008/07/30(水) 20:03:511E12です
0175デフォルトの名無しさん
2008/07/30(水) 20:03:58いいえ、それは記号ではありません。
所謂指数表記では、1e12と書きます。
0176デフォルトの名無しさん
2008/07/30(水) 20:04:35>>175
どうも!
0177デフォルトの名無しさん
2008/07/30(水) 20:05:29ってすると0が表示されるんですが・・・
0178デフォルトの名無しさん
2008/07/30(水) 20:05:58そのレス番は嫌味か?
0179デフォルトの名無しさん
2008/07/30(水) 20:06:46いえ、間違えました
0180デフォルトの名無しさん
2008/07/30(水) 20:07:26%dは整数型を表示するために使います。
0181デフォルトの名無しさん
2008/07/30(水) 20:07:32%f を使え
0182デフォルトの名無しさん
2008/07/30(水) 20:08:320183デフォルトの名無しさん
2008/07/30(水) 20:08:5210^12は整数だと思ってたんですが、、実数型なんですね。
0184デフォルトの名無しさん
2008/07/30(水) 21:05:48>>138さん 自分でエラーを確認したんですが問題の部分は表示されなくまったく気づきませんでした。
もちろん、このままでは成長できませんから次から気をつけます。
>>139さん>>140さん 警告レベルを高くすることなんて出来るんですね。
少しのミスでおかしくなってしまうのが悔しいですがバグを発見して正しくするのが楽しくて夢中になってしまいます。
初心者、上級者関係なく1回で完璧なプログラムを書けるひとっていないと思います。
自分も2・3回失敗しても腐らないように頑張りたいです。
ありがとうございました。
0185デフォルトの名無しさん
2008/07/30(水) 22:16:53指数表記を使って書かれた数の型は、
たとえ小数点を書かなかったとしても小数型になる。
1E2 → double 型
1E2f → float 型
0186デフォルトの名無しさん
2008/07/30(水) 22:22:05> 初心者、上級者関係なく1回で完璧なプログラムを書けるひとっていない
そだね。
プログラマは基本的にバグをつぶす日々を過ごしてる。
バグがなくなればその仕事終了だから、次の仕事のバグつぶす日々になる。
2,3回ぐらい気にしないことだよ
0187デフォルトの名無しさん
2008/07/30(水) 22:37:370188デフォルトの名無しさん
2008/07/30(水) 22:40:030189デフォルトの名無しさん
2008/07/30(水) 22:53:500190デフォルトの名無しさん
2008/07/30(水) 22:56:490191デフォルトの名無しさん
2008/07/30(水) 23:22:50double *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]);
}
}
と書いたのですが、ソートされません・・・なぜでしょうか
0192デフォルトの名無しさん
2008/07/30(水) 23:25:520193デフォルトの名無しさん
2008/07/30(水) 23:26:570194デフォルトの名無しさん
2008/07/30(水) 23:27:45c99ならどっちでもいい。
どの規格に準拠するか書いてないからどうでもいい。
0195デフォルトの名無しさん
2008/07/30(水) 23:27:50そこのキャストを取り除くか、
逆にキャストはそのままでMy_Cmp_doubleを
int My_Cmp_double(const double* a , const double* b)にするかにしてしまえ。
0196デフォルトの名無しさん
2008/07/30(水) 23:29:54int 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);
ですか?
0197デフォルトの名無しさん
2008/07/30(水) 23:30:19だめです。嘘教えるのやめてください。
qsortに渡す関数はint(const void*,const void*)以外認められません。
0198デフォルトの名無しさん
2008/07/30(水) 23:31:49http://tct.ivory.ne.jp/text/prog/C/note/qsort.htm
のサイト参考にしたんですが、間違ってるんですかね?
0199デフォルトの名無しさん
2008/07/30(水) 23:33:02仮に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とでもするのが無難かもしれない。
0200デフォルトの名無しさん
2008/07/30(水) 23:34:41return *y-*x;
↓
if(*y-*x<0)return -1;
if(*y-*x>0))return 1;
return 0;
0201デフォルトの名無しさん
2008/07/30(水) 23:35:15そんな糞みたいな説明を読むからいけないんだ。
doubleの引き算だけでなく、longの場合も引き算ではダメだぞ。
0202デフォルトの名無しさん
2008/07/30(水) 23:36:17intの場合でもダメです。
0203デフォルトの名無しさん
2008/07/30(水) 23:38:08> 同値性に誤差を許容すべき。
並び順は適当でいいから入れ替え回数少なくしたいとかならわからんでもないが、
通常のソートが目的なら、それはおかしい。
0204デフォルトの名無しさん
2008/07/30(水) 23:38:24同値性の誤差って考える必要ある?
こういうソートの場合なら別に気にしなくても問題ないと思うんだけど。
0205デフォルトの名無しさん
2008/07/30(水) 23:39:330206デフォルトの名無しさん
2008/07/30(水) 23:39:49{
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);
こうっすかね?
0207デフォルトの名無しさん
2008/07/30(水) 23:45:37それは流石に。
同値性云々は置いておくとして、せめて不等号で判断しましょうよ。
# コンパイラが警告してくるし。
となると、こんなもん。
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;
}
0208デフォルトの名無しさん
2008/07/31(木) 00:25:44double a:
double b;
}HOGE;
という構造体を配列で宣言 HOGE hoge[256] するときにaだけを0に初期化したいんですが、どうやるんですか?
hoge[i].a = 0にするということです。
0209デフォルトの名無しさん
2008/07/31(木) 00:29:21なんでbもしないの?
0210デフォルトの名無しさん
2008/07/31(木) 00:31:09なんでbはしちゃダメなの?
0211デフォルトの名無しさん
2008/07/31(木) 00:34:45bは0 1 2 3 4 5 6 ・・255って入れたいんです
hoge[0].b =0
hoge[1].b =1
ってかんじです
0212デフォルトの名無しさん
2008/07/31(木) 00:36:14int i;
for(i=0;i<256;i++) {
hoge[i].a = 0;
hoge[i].b = i;
}
0213デフォルトの名無しさん
2008/07/31(木) 00:37:36int count=0;とやるがごとく
0214デフォルトの名無しさん
2008/07/31(木) 00:39:15たいしたコストじゃないよ
0215デフォルトの名無しさん
2008/07/31(木) 00:41:52多分40000万回とかします
0216デフォルトの名無しさん
2008/07/31(木) 00:42:220217デフォルトの名無しさん
2008/07/31(木) 00:44:22ZeroMemory()
0218デフォルトの名無しさん
2008/07/31(木) 00:47:410219デフォルトの名無しさん
2008/07/31(木) 00:57:300220デフォルトの名無しさん
2008/07/31(木) 00:58:430221デフォルトの名無しさん
2008/07/31(木) 01:01:00賢い!!
0222デフォルトの名無しさん
2008/07/31(木) 01:06:49bも初期化されちゃわないか?
0223デフォルトの名無しさん
2008/07/31(木) 01:09:23ん?bも初期化したいんじゃないの?
>>211を読んでそう思ったんだが
0224デフォルトの名無しさん
2008/07/31(木) 01:18:42の一番下の答えを教えて下さい。
0225デフォルトの名無しさん
2008/07/31(木) 01:25:34後半は合ってるけどキャストは要らない。
C++だと要るけど。
0226デフォルトの名無しさん
2008/07/31(木) 01:31:00余計なものをつけると見づらくなる、って人がいるよな
0227デフォルトの名無しさん
2008/07/31(木) 01:31:51ただ、規格上は必要ない。
0228デフォルトの名無しさん
2008/07/31(木) 01:38:12文字列がNULLのとき
cがヌル文字のとき
0229デフォルトの名無しさん
2008/07/31(木) 01:54:25ありがとうございます、やっぱそれだけですかね?
>文字列がNULLのとき
これに関しては呼び出し元でチェックすべきだと思うし
>cがヌル文字のとき
これも微妙だと思ったんですよね。
変に考えすぎてるだけでしょうか?
0230デフォルトの名無しさん
2008/07/31(木) 02:07:190231デフォルトの名無しさん
2008/07/31(木) 02:08:37'A'は文字コード、値が入ってる。
"A"はアドレスが入ってる、後終端文字が後ろにくっつく
0232デフォルトの名無しさん
2008/07/31(木) 02:08:460233デフォルトの名無しさん
2008/07/31(木) 02:09:220234デフォルトの名無しさん
2008/07/31(木) 02:14:38あ、charって符号なし整数だと思ってました。
具体的にどういう入力の時に問題が起こるのでしょう?
0235デフォルトの名無しさん
2008/07/31(木) 02:24:410236デフォルトの名無しさん
2008/07/31(木) 02:27:080237デフォルトの名無しさん
2008/07/31(木) 02:33:50>>212を一回やって初期用エリアを作ってそこを毎回コピーすればいいんだろ?
0238デフォルトの名無しさん
2008/07/31(木) 02:42:20これ、ANSIのstrchr()と同じだろ?
だから、cがヌル文字だったとしても、ヌル文字チェックのif文通る前に *str != c を満たさずにループ抜けてヌル文字の位置のアドレス返すから問題ない
それよりは文字列の途中にヌル文字入ってたらそれ以降にcが入ってても見つからないっていうのを追加
"abc\0123"だと123は見つけられない、というか見つける術がない、というのはstrchr()も同じ
あと、大小比較じゃなくて等値の比較だから符号は関係ない気がする
signedかunsigned関係なくて、int c がcharの範囲を超えて与えられたらおかしくなる、ということならわかる
0239デフォルトの名無しさん
2008/07/31(木) 02:47:19なんで役に立たないと思ったのですか?
大変便利なのに。
0240デフォルトの名無しさん
2008/07/31(木) 02:52:30>>238の大小比較うんぬんは>>232宛だな
0241デフォルトの名無しさん
2008/07/31(木) 02:54:51コンピュータの電源を入れ忘れたとき。
0242デフォルトの名無しさん
2008/07/31(木) 03:05:16Cで「文字列」と言うとヌル文字までなんだから、
「途中にヌル文字が入っている」もの全体を文字列とは呼べない。
0243デフォルトの名無しさん
2008/07/31(木) 08:15:420244デフォルトの名無しさん
2008/07/31(木) 08:31:48指摘貰ったので改めて調べると、最初のヌル文字が現れるまでを文字列と呼ぶ、、、らしい
文字列リテラルは途中にヌル文字は含めてよい、文字列と文字列リテラルは別物、ということだったので、区別しなきゃいけないようだ
仕事では普通に使ってたので途中ヌル文字ありも文字列と呼んでたよ
指摘ありがとう
なので、"abc\0123"うんぬんは取り下げる
が、そうなると>>224の答えって何だ?NULLも文字列とは呼ばないけどどうなるんだろ?
なんか、「符号は関係ねー」って言ったのも自信なくなってきたorz
0245デフォルトの名無しさん
2008/07/31(木) 09:46:16aをキーにソートするので、それが何番目の奴だったか覚えておくのに必要です
bはずっと不変なんでいちいち初期化する手間ももったいないと思うんですが・・・どうしたらいいですか?
hoge[i].b=iはずっと変わりません。
0246デフォルトの名無しさん
2008/07/31(木) 09:49:45cでそういう構造を簡潔に初期化する手段は存在しない。
データ構造を変えて、
struct HOGE {
int a[MAX];
int b[MAX];
};
として、memset(hoge.a, 0, sizeof(int[MAX]));
とするくらいしかないな。
ていうか、hoge[i].b がつねに i なら、b要らなくね?
0247デフォルトの名無しさん
2008/07/31(木) 09:53:53hoge[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
という感じにソート前の番号が必要なんですが・・・
0248デフォルトの名無しさん
2008/07/31(木) 09:57:31>hoge[i].b=iはずっと変わりません。
こういう嘘を書かないように。
0249デフォルトの名無しさん
2008/07/31(木) 10:14:44char が符号付きの環境だったら
str_char("\xFF", 0xFF);
とやっても NULL が返ってくる。
str_char("\xFF", '\xFF');
とやれば問題ないんだが、それでも
for(i=0; i<=0xFF; i++){
result[i] = str_char(str, i);
}
みたいなことをしようとするとハマる。
0250デフォルトの名無しさん
2008/07/31(木) 10:26:36スマン
毎回bが違う値になるのかと勘違いしてた
0251デフォルトの名無しさん
2008/07/31(木) 12:08:46ソートするなら構造体を並べ替えるんじゃなくてそのポインタを並べ替えるのがいいと思うよ
0252デフォルトの名無しさん
2008/07/31(木) 12:08:52}
の中でif文をチェックし、真であればそれ以降のiからNまで処理Aをしたいときはどう書けばいいですか?
0253デフォルトの名無しさん
2008/07/31(木) 12:09:480254デフォルトの名無しさん
2008/07/31(木) 12:12:06僕にはできそうにないです・・・
0255デフォルトの名無しさん
2008/07/31(木) 12:12:25こうしたいの?
for(i = 0; i < N; i++ ){
for( k=i; k<=N; k++ ){
A( k );
}
}
0256デフォルトの名無しさん
2008/07/31(木) 12:14:50理由がよく分からないのですが。
別にチェックしなくてもいいですよね?
0257デフォルトの名無しさん
2008/07/31(木) 12:17:23チェックする意味はある
エラーを無視するのは自由だが
0258デフォルトの名無しさん
2008/07/31(木) 12:20:01for(i = 0; i < N; i++ ){
if(条件) ←1回真になったらそれ以降のiではチェックせずに Nまでdata[i]=0にする
っていう処理をしたいです
0259デフォルトの名無しさん
2008/07/31(木) 12:23:19こう?
for(i = 0; i < N; i++ ){
if(....)
break;
}
for( ; i < N; i++ ){
data[i]=0;
}
0260デフォルトの名無しさん
2008/07/31(木) 12:41:140261デフォルトの名無しさん
2008/07/31(木) 13:11:18お願いします。
0262デフォルトの名無しさん
2008/07/31(木) 13:11:500263デフォルトの名無しさん
2008/07/31(木) 13:12:45企業でしか使うことはないということでしょうか?
0264デフォルトの名無しさん
2008/07/31(木) 13:16:560265デフォルトの名無しさん
2008/07/31(木) 13:17:38そんなことはない
0267デフォルトの名無しさん
2008/07/31(木) 13:22:15ピンきりw
0268デフォルトの名無しさん
2008/07/31(木) 13:22:23個人のレベルによります
0270デフォルトの名無しさん
2008/07/31(木) 13:26:53Linux
0271デフォルトの名無しさん
2008/07/31(木) 13:29:20もうちょっと身近なソフトでお願いします!
0272デフォルトの名無しさん
2008/07/31(木) 13:33:31WordやExcel
0273デフォルトの名無しさん
2008/07/31(木) 13:34:27えええ、あれも個人で作られたものなんですか!
ありがとうございます!!
0274デフォルトの名無しさん
2008/07/31(木) 13:56:510275デフォルトの名無しさん
2008/07/31(木) 13:57:170276デフォルトの名無しさん
2008/07/31(木) 14:12:56プログラム内で処理する場合EOFって入ってます?
もしかして入ってないので最初にファイルのトータルサイズを調べておいて
それを超えないようにしないとだめ?
0277デフォルトの名無しさん
2008/07/31(木) 14:25:120278デフォルトの名無しさん
2008/07/31(木) 14:26:490279デフォルトの名無しさん
2008/07/31(木) 14:27:21まずここを疑ってかかること
0280デフォルトの名無しさん
2008/07/31(木) 14:32:45EOFってのはファイルの中にあるものではない。
既にEOFに達しているのになお読もうとした時に読む関数が返す値。
テキストで読もうがバイナリで読もうが、読む速度が大きく違うとは思えないが。
0281デフォルトの名無しさん
2008/07/31(木) 14:33:08EOFってのはfgetc/getcが返す特殊な値であって、freadなどには関係ない。
0282デフォルトの名無しさん
2008/07/31(木) 14:34:16ファイルの末尾にEOFという文字がついているわけじゃない
(そもそもEOFは所謂1バイトの文字の範囲外かもしれない)
Cでファイルのサイズを知る汎用の解は読めるだけ読んでその数を数えることしかない
どうしても事前にサイズを知りたいなら環境依存の関数を使うこと
0283デフォルトの名無しさん
2008/07/31(木) 14:36:090284デフォルトの名無しさん
2008/07/31(木) 15:02:27実際^Zは出てこなかっただろ、fgetcらが内部で適宜処理していたから。
0285276
2008/07/31(木) 15:07:56構造体を読み込むための汎用関数がすでにあり汎用関数が読み込む
構造体は必ずヘッダも付いててサイズもわかるようになってたので
ファイルサイズを返さない仕様になっていたので横着してテキストの中身で
判断しようとしてましたorz
横着せず汎用関数を改造してサイズも返すようにしました。
0286デフォルトの名無しさん
2008/07/31(木) 17:34:32プログラミングの学習を簡単にするためでしょうか?
0287デフォルトの名無しさん
2008/07/31(木) 17:36:400288デフォルトの名無しさん
2008/07/31(木) 17:36:420289デフォルトの名無しさん
2008/07/31(木) 17:39:550290デフォルトの名無しさん
2008/07/31(木) 17:48:490291デフォルトの名無しさん
2008/07/31(木) 17:49:410292デフォルトの名無しさん
2008/07/31(木) 17:50:430293デフォルトの名無しさん
2008/07/31(木) 18:38:220294デフォルトの名無しさん
2008/07/31(木) 20:02:01そういう理由も含む
>>290
C言語的にはどうでもいいこと
>>291
構造的にバッファがあふれる可能性のあるfgets等を除けば
どれを使っても後はプログラムする人間の問題
0295デフォルトの名無しさん
2008/07/31(木) 20:02:45×fgets
○gets
0296デフォルトの名無しさん
2008/08/01(金) 01:17:24ありがとうございます
printf("%c",' ');
printf("%s"," ");
で2つともスペース1個出力できるんですか?
0297デフォルトの名無しさん
2008/08/01(金) 01:24:01どちらもputchar(' ')と同じ出力ですね。
0298デフォルトの名無しさん
2008/08/01(金) 01:24:25これはひどい
0299デフォルトの名無しさん
2008/08/01(金) 01:27:32寝ろ
0300デフォルトの名無しさん
2008/08/01(金) 01:31:380301デフォルトの名無しさん
2008/08/01(金) 02:13:46これはひどい
0302デフォルトの名無しさん
2008/08/01(金) 03:02:02なるべくループやlogを使わない物がいいです
0303デフォルトの名無しさん
2008/08/01(金) 03:05:13http://pc11.2ch.net/test/read.cgi/tech/1158367586/
で聞くと、我先に答えが返ってきそうだな。
0304デフォルトの名無しさん
2008/08/01(金) 03:06:04case 1:return 0;
0305デフォルトの名無しさん
2008/08/01(金) 03:07:02ありがとうございます。行ってみます
0306デフォルトの名無しさん
2008/08/01(金) 03:07:234バイト整数なら高々32通り、switchで全部列挙しろ
0307デフォルトの名無しさん
2008/08/01(金) 03:41:20どうすればいいでしょう?
0308デフォルトの名無しさん
2008/08/01(金) 04:14:32f(struct A a){...}
pf(struct A *a){...}
int main()
{
struct A ma;
...
f(ma);
pf(&ma);
...
}
お好きな方をどうぞ
0309デフォルトの名無しさん
2008/08/01(金) 06:17:560310デフォルトの名無しさん
2008/08/01(金) 08:04:290311デフォルトの名無しさん
2008/08/01(金) 10:19:44データとしてUTF-8の出力や変換は分かるのですが
標準出力となるとよく分からなくなってしまって…
0312デフォルトの名無しさん
2008/08/01(金) 10:26:08そんな疑問が出るような状況で先に進めるのかな?
0313デフォルトの名無しさん
2008/08/01(金) 10:33:290314デフォルトの名無しさん
2008/08/01(金) 10:40:52なぜCで
webプログラムならPHPで十分だろ
0315デフォルトの名無しさん
2008/08/01(金) 10:44:21unicodeに対応させようと思って色々イジってみてるんです。
0316デフォルトの名無しさん
2008/08/01(金) 10:53:15ふつーに文字列を、標準出力につっこめば、文字コードは関係なくそのまま出力されるんじゃないの?
0317311
2008/08/01(金) 10:57:44データを突っ込めば勝手に解釈してくれますね。
ソースUTF-8にして"TEXT"出力しても文字化けするんで、
回りくどく、おかしなこと考え込んでました。
0318デフォルトの名無しさん
2008/08/01(金) 11:05:37文字化けは、そのまま通ってきたバイト列を端末がどう扱うかの話。
0319デフォルトの名無しさん
2008/08/01(金) 11:10:42まさにこれで勘違いしてました。
0320デフォルトの名無しさん
2008/08/01(金) 22:56:37変数に文字を代入するときって何故''で囲まないといけないんですか?
0321デフォルトの名無しさん
2008/08/01(金) 22:57:510322デフォルトの名無しさん
2008/08/01(金) 23:01:460323デフォルトの名無しさん
2008/08/01(金) 23:31:52''で囲んだものが文字なのだ
0324デフォルトの名無しさん
2008/08/02(土) 00:07:370325デフォルトの名無しさん
2008/08/02(土) 00:43:40どういう場面で使い分けるものですか?理由もお願いします。
0326デフォルトの名無しさん
2008/08/02(土) 00:49:110327デフォルトの名無しさん
2008/08/02(土) 01:29:39>>322
>>333
解りました
ありがとうございます
0328デフォルトの名無しさん
2008/08/02(土) 01:32:150329デフォルトの名無しさん
2008/08/02(土) 01:32:58これでintにはいる・・・?
0330デフォルトの名無しさん
2008/08/02(土) 01:35:230331デフォルトの名無しさん
2008/08/02(土) 01:36:48キャストするまでもなくintだったような気がする。
0332デフォルトの名無しさん
2008/08/02(土) 01:37:17ちなみに文字定数はもともとint型(unsigned charに納まる範囲の数でしかないが)
0333デフォルトの名無しさん
2008/08/02(土) 01:56:0716 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
こんな感じで表示するプログラムってどうやるんでしょうか?
0334デフォルトの名無しさん
2008/08/02(土) 02:00:17puts(
" 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;
}
0335デフォルトの名無しさん
2008/08/02(土) 02:01:01繰り返し使ってでした
0336デフォルトの名無しさん
2008/08/02(土) 02:01:31main()
{
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");
}
0337デフォルトの名無しさん
2008/08/02(土) 02:02:02初心者スレで紛らわしいこと書くな。
'\xFF'が正か負かは処理系依存(つーかコンパイラオプション次第)なんだから
わざわざ「unsigned」なんて付けずに「charに納まる範囲」でいいんだよ。
0338デフォルトの名無しさん
2008/08/02(土) 02:13:430339デフォルトの名無しさん
2008/08/02(土) 02:20:06アスキーコードで見ると7Fまでで全部できるしね。
キャラクターコードと考えると8bitいる
#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');
}
}
0341デフォルトの名無しさん
2008/08/02(土) 04:07:44マルチすんなゴミ
0342デフォルトの名無しさん
2008/08/02(土) 07:16:57としたときに、やはり丸め誤差をくらって、
数学的に期待した結果と返り値が1ずれることは想定すべきですか?
例えばa = 1.3だとして、
floor(a) => 0.99999999999999912341
int(floor(a)) => 0
になるような場合が起こってしまうのか、ということです。
実際にはa = 1.3の場合には、自分の環境ではこうなりませんが、
aが他の値のときにこのようなことが起こるかもしれません。
0343デフォルトの名無しさん
2008/08/02(土) 07:47:35ほぼすべての処理系において整数がずれることは無いと思われます
これは浮動小数点数の格納の仕方によるものです
0344デフォルトの名無しさん
2008/08/02(土) 07:53:28これは、内部的に実数と2の乗数の形で保持しているため。
ただ、C言語の規格で保証されているかは知らん。
でも、組み込みを含めても、余程マイナーなものを除き
現行で浮動小数をIEEE754以外の形式で扱うコンパイラ(プロセッサ)は
まず無いと思うし、もしそれ以外の形式であったとしても
整数を正確に保持できないということは考えられない。
0345デフォルトの名無しさん
2008/08/02(土) 08:01:500346デフォルトの名無しさん
2008/08/02(土) 08:17:53なるほど。気にしないことにします。
ありがとうございました。
色々ソースを読んでみても、特にみんな気にしていなさそうです。
0347デフォルトの名無しさん
2008/08/02(土) 09:13:30いいえ、float(IEEEでは4バイト)ではint(一般的に4バイト)より精度が低いので、全ての値を正しく保持できません。
そもそも、あなたは(int(floor(a))と書いているので)スレ違いです。
0348デフォルトの名無しさん
2008/08/02(土) 09:15:460349デフォルトの名無しさん
2008/08/02(土) 09:22:21ありがとう!よくわからない言葉あるので調べて使ってみますね!
>>341
ごめん
0350デフォルトの名無しさん
2008/08/02(土) 09:23:29確かにCには関数型キャストはない罠。でもま、趣旨からすればdoubleからの変換だからいいんでね?
0351デフォルトの名無しさん
2008/08/02(土) 09:31:54IEEEって何のことですか?
0352デフォルトの名無しさん
2008/08/02(土) 09:35:03http://ja.wikipedia.org/wiki/IEEE
日本ではJISなんてのもあるけどそれのアメリカ版
実際のところパソコン関連はかなりのものがIEEE関連だなあ
iLink -> IEEE1394a/b
とか無線LANもここの関連
0353デフォルトの名無しさん
2008/08/02(土) 09:35:460354デフォルトの名無しさん
2008/08/02(土) 09:37:42http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0#IEEE.E6.96.B9.E5.BC.8F.EF.BC.88IEEE_754_.E5.BD.A2.E5.BC.8F.EF.BC.89
0355デフォルトの名無しさん
2008/08/02(土) 09:38:58IEEEなんて曖昧なこと書かないでね。
ちゃんと>>344に書いてあるんだから。
と書いているのがわからないんですね。
0356デフォルトの名無しさん
2008/08/02(土) 09:40:52個人が理解できるまでみっちり教えるのは時給数千円の家庭教師の仕事だというのに
0357デフォルトの名無しさん
2008/08/02(土) 09:41:580358デフォルトの名無しさん
2008/08/02(土) 10:02:06JISのアメリカ版と言えるのはANSIだ。
0359デフォルトの名無しさん
2008/08/02(土) 10:25:240360デフォルトの名無しさん
2008/08/02(土) 12:38:40滅びるのを待たずとも359が避けて通ればいいだけでは
0361通りすがり
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;
}
0362デフォルトの名無しさん
2008/08/02(土) 22:24:36それ実行するなよ。
0363デフォルトの名無しさん
2008/08/02(土) 22:26:14お知りに\0いれないと
0364デフォルトの名無しさん
2008/08/02(土) 22:26:17s1を文字列の終わりまで進めてるからs1を表示しても・・・
0365デフォルトの名無しさん
2008/08/02(土) 22:26:54*s1 が '\0' だから
puts(buff1);
なら表示される
0366デフォルトの名無しさん
2008/08/02(土) 22:29:450368デフォルトの名無しさん
2008/08/02(土) 22:32:45if((strlen(s1) + strlen(s2)) < STR_LENGTH)
だろ
0369デフォルトの名無しさん
2008/08/02(土) 22:34:54#define STR_LENGTH 255 /* 文字列長さの最大値 */
char buff1[STR_LENGTH+1] ="abc";
char buff2[STR_LENGTH+1] ="xyz";
0370通りすがり
2008/08/02(土) 22:40:20無理なんですかね?
0371デフォルトの名無しさん
2008/08/02(土) 22:42:52s1を大事にとっておけば可能
0372通りすがり
2008/08/02(土) 22:50:05const char *p = s1;
の1行が、必要なんですね。
0373通りすがり
2008/08/02(土) 23:17:25\0を入れる方法は、結合した長さを調べて、最後に\0を入れるでよいですか?
0374デフォルトの名無しさん
2008/08/02(土) 23:17:35関数に入った直後のs1をコピーしておけばいいだけ
0375デフォルトの名無しさん
2008/08/03(日) 00:41:270376デフォルトの名無しさん
2008/08/03(日) 01:31:03int (*a)[3]
と
int *a[3]
って仮引数として同じ意味なんですか?
0377デフォルトの名無しさん
2008/08/03(日) 01:57:500378デフォルトの名無しさん
2008/08/03(日) 02:01:53int (*a)[3] は(*a)[3]がintだということで、*aがint[3]だということで、aはint[3]へのポインタだということ
int *a[3] は*a[3]がintだということで、a[3]がintへのポインタだということで、aはintへのポインタの配列だということ
ただし関数が実際に配列を受け取ることはないので、これは自動的に配列の先頭要素へのポインタつまりintへのポインタへのポインタになる
0379デフォルトの名無しさん
2008/08/03(日) 08:16:350380デフォルトの名無しさん
2008/08/03(日) 09:08:35型は確かに int だけど
0381デフォルトの名無しさん
2008/08/03(日) 13:02:02struct hoge{
double d;
int array[1];
};
みたいな構造体があったとき、配列arrayの要素数を動的に変化させるため
struct hoge *p = malloc(sizeof(struct hoge) + sizeof(int) * 9);
(こんな感じだったかな?)みたいなことをして、int array[10]として
使えるようにするようなコードがあったんですが、これって安全なのでしょうか?
けっこう常識的なテクニック?
0382デフォルトの名無しさん
2008/08/03(日) 13:05:290383デフォルトの名無しさん
2008/08/03(日) 13:06:55まあメモリは一応確保されてるので使えなくはないが
自分の担当でなくなった際に引継ぎできなければはまることもあるなあ。
自分で作っても時間がたつと忘れてたりするので。
0384デフォルトの名無しさん
2008/08/03(日) 13:10:24どちらもポインタであって二次元配列ではない
0385デフォルトの名無しさん
2008/08/03(日) 13:18:350386デフォルトの名無しさん
2008/08/03(日) 13:19:52構造体にポインタを持たせて普通にmallocしたほうがわかりやすくね?
0387デフォルトの名無しさん
2008/08/03(日) 13:29:00二回mallocを使うと管理領域も二つ分使われるんで、メモリも、スピードも>>381の書き方のほうが有利。
0388デフォルトの名無しさん
2008/08/03(日) 13:34:12http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
0389デフォルトの名無しさん
2008/08/03(日) 13:36:14今時そんなのどうでもいいと思うけどね。
0390381
2008/08/03(日) 13:52:08今はあんまり必要ないテクニックかもしれませんね。
0391デフォルトの名無しさん
2008/08/03(日) 14:00:35状況によるけどな。
0392デフォルトの名無しさん
2008/08/03(日) 16:13:04と宣言して
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)
ってどれも同じことを意味するんですか?
0393デフォルトの名無しさん
2008/08/03(日) 16:19:14二つが一緒
void func(int x[][3],int n)
void func(int (*x)[3],int n)
これは違う
void func(int *x[3] ,int n)
0394デフォルトの名無しさん
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とかですよね。
だとしたら全て当てはまるように思うんですが考え方が良く分かりません。
自分の拙い文章で分かりにくいと思いますがよろしくお願いします。
0395デフォルトの名無しさん
2008/08/03(日) 19:53:38aが10かつ20なんて事はありえなくね?
0396394
2008/08/03(日) 19:56:52a=20はおかしいってことですよね
0397デフォルトの名無しさん
2008/08/03(日) 19:58:100398デフォルトの名無しさん
2008/08/03(日) 20:02:52a==20は0(偽)
0399デフォルトの名無しさん
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」
ということでしょうか?
0400デフォルトの名無しさん
2008/08/03(日) 20:11:24a=10 としたんだったら
a==20 → 正しくないので 0
a!=20 → 正しいから 1
ってだけの話だろう
0401デフォルトの名無しさん
2008/08/03(日) 20:14:20aaaa
あなたの年齢は?
24
ようこそaaaaさん。
24歳ですね。
というようなプログラムを作りたいんですが、
年齢を入力する際、数字以外を入力したら
あなたのお名前は?
aaaa
あなたの年齢は?
bbb
bbbは年齢として入力できません。
あなたの年齢は?
となるようにしたいんですが、どういうふうに書けばいいんでしょうか?
Cを勉強し始めて2週間ぐらいなんですが、ちょっとつまづいています
誰か教えてください。。
0402デフォルトの名無しさん
2008/08/03(日) 20:15:21「!=」という演算子は、比較をして等しいか等しくないかのどちらかを返す。等しいなら0、等しくないなら1。
そんだけ。
>>399
(多分)合ってる。
(「(多分)」なのは、私があなたの文章をあなたの意図通りに解釈してる自信がいまいち無いから)
0403デフォルトの名無しさん
2008/08/03(日) 20:17:13「!=」は正しくないときに「1」と猫にもわかるプログラミングには書いてあるのですが・・・
その式では10=20は正しいから「1」ということですよね?
どうして20であっているのでしょうか?
最初に「10」と宣言したはず
0404デフォルトの名無しさん
2008/08/03(日) 20:22:06ノートに書いておきました・・・。
0405デフォルトの名無しさん
2008/08/03(日) 20:23:50それはともかく、「!=」は「正しくない」ではなく、「等しくない」
だから、「10!=20」→「10と20は等しくない」→正しい→1
だな。
0406デフォルトの名無しさん
2008/08/03(日) 20:26:57「数字以外である」という条件を具体的に定め、それをソースコードで書く。
一文字目が0〜9の範囲内にあればヨシ(isdigit()使って)、でいいんじゃない?
先頭の0は許さないとか細かく条件をつけるなら、いちいちそれをソースで書くしかない。
0407デフォルトの名無しさん
2008/08/03(日) 20:29:50本と同じことを皆さんおっしゃっているんだとおもうのですが自分にはこちらのほうが理解しやすく利用させてもらっていますorz
自分の文がおかしく混乱させてしまってすみませんでした。
0408デフォルトの名無しさん
2008/08/03(日) 20:32:04#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;
}
0409デフォルトの名無しさん
2008/08/03(日) 20:58:05まず根本的に、printfの%dは何かを代入するものではない
対応する引数の値を文字列に変換してその部分に表示するもの
この場合表示する値はa==10やa!=20という式が持つ値になる
0410デフォルトの名無しさん
2008/08/03(日) 21:02:12大抵の入門書じゃ説明しないけど
0411デフォルトの名無しさん
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という数値が出てきたのでしょうか?
0412デフォルトの名無しさん
2008/08/03(日) 21:13:47参考までに教えてください
0413デフォルトの名無しさん
2008/08/03(日) 21:17:34どこからきたのかは、その本(Webページ?)に書いてあると思いますよ
0414デフォルトの名無しさん
2008/08/03(日) 21:19:59あなたがキーボードから125と打ち込む。
0415デフォルトの名無しさん
2008/08/03(日) 21:25:00デパックして黒い画面のやつに数値を入れると「あなたの入力したす数値は○○ですね」
になるんですね。
この黒い画面をいじっていいのか分からなかったため理解できませんでした。
すみませんでした
0416401
2008/08/03(日) 21:31:54すいません難しすぎてわかりません。
あなたの年齢は?
24
↓
24歳ですね。
あなたの年齢は?
bbb
↓
bbbは年齢として入力できません。
あなたの年齢は?
の部分だけでかまいませんので
一番簡単なやり方で記述してもらえませんか
ホントすいません。。
0417デフォルトの名無しさん
2008/08/03(日) 21:41:10int 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);
}
0418417
2008/08/03(日) 21:42:240419デフォルトの名無しさん
2008/08/03(日) 22:02:38int 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歳ですね");
0420デフォルトの名無しさん
2008/08/03(日) 22:04:500421デフォルトの名無しさん
2008/08/03(日) 22:05:36お願いします
0422デフォルトの名無しさん
2008/08/03(日) 22:12:20ありがとうございます
今読んでる本(ぼうようのポインタの極意)には
void func(int *x[3],int n)
void func(int x[][3],int n)
が同じと書かれているんですが、これは誤植なのしょうか?
0423デフォルトの名無しさん
2008/08/03(日) 22:13:32Cはリッチーさんが作ったプログラミング言語で、
JavaはSunが作ったプログラミング言語。
0424417
2008/08/03(日) 22:15:190425デフォルトの名無しさん
2008/08/03(日) 22:15:50うん、間違ってるね
0426デフォルトの名無しさん
2008/08/03(日) 22:16:49もながいします。
0427デフォルトの名無しさん
2008/08/03(日) 22:18:02何をお願いしているのかをまず明確にしろ
0428デフォルトの名無しさん
2008/08/03(日) 22:19:000429デフォルトの名無しさん
2008/08/03(日) 22:19:13基礎は師匠に学んだがだいたいは独学
CFAQが座右の書
0430デフォルトの名無しさん
2008/08/03(日) 22:20:070431デフォルトの名無しさん
2008/08/03(日) 22:20:28old の先は天国か地獄か
0432デフォルトの名無しさん
2008/08/03(日) 22:33:04C言語とJavaの違いを教えて下さい
お願いします
0433417
2008/08/03(日) 22:41:59俗に10年一昔というが、コンピュータの世界では3年一昔
というぐらい進歩しているので、Javaの登場までには
6世代分ぐらいの技術革新が起こっている、C言語など
Javaからみれば化石のようなもの、に思えるが、
じつはそうではなく、
0434デフォルトの名無しさん
2008/08/03(日) 22:42:050435デフォルトの名無しさん
2008/08/03(日) 22:48:220436デフォルトの名無しさん
2008/08/03(日) 23:35:15/* >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;
}
0437デフォルトの名無しさん
2008/08/03(日) 23:36:53ぐぐれカス
0438デフォルトの名無しさん
2008/08/04(月) 04:26:49全てのコードを見直して所々いじったらさらに混乱し、
うんこして要素数を+1したら完璧に動きました
所要時間4時間・・・発狂しそうになりました、やっとこ就寝です
ほんとうにありがとうございました
0439デフォルトの名無しさん
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」のように使い分けるものなのでしょうか?
0440デフォルトの名無しさん
2008/08/04(月) 05:16:34ないならelse
そのプログラムだと
「ageが6未満」(これがif文の条件)だと入場料は無料
elseだとそれ以外つまりageが6以上と言う事になるんだが
しかしそれにis_seitoが1だったらと言う条件をつけたいが為に
else ifを使ってる
0441デフォルトの名無しさん
2008/08/04(月) 05:31:27頭がうまく回らなくって遅くなりました。
条件つきを書きたいとき「else if」を使うということですよね。
デパックしたら黒い画面が出てきますよね?
そのとき入力する項目は「else it」を使うと考えていればokでしょうか?
0442デフォルトの名無しさん
2008/08/04(月) 05:36:08入力受付はこのコードだと
printf("年齢を入力してくださいーーー");
scanf("%d",&age); ←
printf("「猫でも学園」の\n生徒さんですか(yes:1,no:0)---");
scanf("%d",&is_seito); ←
の二箇所だぞ?
この部分にelseも何も関係ないだろ
0443デフォルトの名無しさん
2008/08/04(月) 05:36:37俺にエスパーが足りないせいか後半部分の意味が理解できない
0444デフォルトの名無しさん
2008/08/04(月) 05:38:25>>440さんの「最初のif文の条件以外と言う条件 + さらに条件があればelse if
ないならelse 」
これが一番簡潔で一番分かりやすい考え方ですよね。
0445デフォルトの名無しさん
2008/08/04(月) 05:40:39デバッグというかコンソールアプリなんで実行したら
コンソールがでただけでしょ。
else it
じゃなくて
else if ね
で、いいたいことはわかった。
寝起きはエスパーになれる?
つまり
0446445
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;
}
0447445
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;
}
0448445
2008/08/04(月) 05:43:480449445
2008/08/04(月) 05:47:36入力は>>442の書いてくれた部分が担当
else if は単なる書き方の問題。
0450デフォルトの名無しさん
2008/08/04(月) 05:48:52どう読めばそうなるのかは分からんが当たってたらおまえのエスパーはすごいって事だな。
>個人的にはelse ifは嫌いというか使わないんだよな
俺はインデントが不必要に深くなるのが嫌いだからelse if を使うけどな、まあ好みの問題か。
0451デフォルトの名無しさん
2008/08/04(月) 05:50:01条件ということは
・6歳未満でなくても「猫でも学園」の生徒なら無料
・6歳未満ではなく「猫でも学園」の生徒でもないときは1000円
上記は条件がある」という点では一緒ですよね。
だとしたら「else」「else if」を使うのは反対でokだと思ったので使うのを反対にしてみました(自分で解決しようと思ったので
するとエラーになってしまいました。
自分の考え方が1からおかしいでしょうか?
本当に朝から付き合ってくれてありがとうございます;;
0452デフォルトの名無しさん
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は今まで出した条件以外と言う条件の時のみ使える
0453デフォルトの名無しさん
2008/08/04(月) 05:55:02今度は俺がエスパー
elseっていうのはその上にifがあり、かつそのifの下にまだelseがないときにしか使えない
これを理解してるか?
違ってたらソースをさらしてくれ
0454デフォルトの名無しさん
2008/08/04(月) 05:56:15そうかそうか!
言われた通りに処理をして区別したかったから「else」「else if」で分けていたんですね。
0455デフォルトの名無しさん
2008/08/04(月) 05:57:33>>447のように記述したほうがいいきがする
0456デフォルトの名無しさん
2008/08/04(月) 05:58:09自分理解していませんでした。
取りあえず触ってみる、プログラム書くことに重点を置いていたので
0457453
2008/08/04(月) 06:04:08いい姿勢だと思うよ、習うより慣れろっていうしね。
でも解決するときにきちんと理論を知っておかないと成長しづらいよ
>>455
さっきも書いたけど>>447の方法だと条件と処理の数が増えるとインデントが
深くなるから今回みたいに条件が少ない場合はいいけどしょうじゃないとき
極端に言えば100とか1000の時収集かなくないか?
まあこれ以上は宗教戦争になるから言わんが
0458デフォルトの名無しさん
2008/08/04(月) 06:08:51まあネストが極端に深くなる場合は関数化する必要があったりするので
それほど問題はないと思ってる。
これは個人的見解
0459417
2008/08/04(月) 06:39:28else if の教材にするには、生徒のときには入場料を 300円ぐらいにしないと
else if を使う必然性が無い。
まあ、可哀想なのは、この教材で学ぶことで || ですむところをいつでも
else if を使うようになる学習者だけなのだが。
0460デフォルトの名無しさん
2008/08/04(月) 06:44:55アセンブラレベルだと大してかわらないんだけどな〜
0461デフォルトの名無しさん
2008/08/04(月) 07:33:08if( (age<6) & (-is_seito) ) //&&じゃないよ
//無料
else
//有料
ってやったらちょっとは早くなる?
それとも遅くなる?ジャンプのコストってどんなもん?
これスレ違い?
0462デフォルトの名無しさん
2008/08/04(月) 07:36:23switch文書いても結局はif { ・・ } ・・else if
ってなるように
if { ・・・ || ・・・ } と書いてもアセンブラだと
結局条件分岐1条件分岐2と並ぶだけなので内情は変わらない。
0463デフォルトの名無しさん
2008/08/04(月) 07:41:57うん、それはそうなんだと思っていた、流れで聞いたからそういう意図だと思われても仕方ない
しかし>>461のifの中身をよく見てほしいこれなら比較は一回ですむはずなんだが余計な計算がいる、
ジャンプのコストがそれを超えるかが知りたいわけだ。でもスレ違いっぽい気がする。
0464デフォルトの名無しさん
2008/08/04(月) 07:48:08そのくらいのジャンプコストは誤差の範囲
ジャンプ命令はそれほどでもないしね。
Z80はコストの少ない相対ジャンプは+-128くらいだったかな・・・?
まあ最近のプロセッサはそんなの関係ないんだろうけど。
むしろ関数をインライン展開しない場合はたぶんコール命令になるから
そっちのほうがコストは多い。
で、結論から言うとせっかくCで書くんだからわかりやすく書けw
|| とか &&で混乱するくらいならif文の条件判定をわけるとかさ・・・
0465463
2008/08/04(月) 07:53:04(age<6) | (-is_seito)こうだな
0466デフォルトの名無しさん
2008/08/04(月) 07:58:59生半可な知識はいかがなものかと。
Z80では条件絶対ジャンプは10クロック、条件相対ジャンプは12クロックなので相対ジャンプの方が高コストということになる。
>>463
x86では条件分岐を使わずとも条件で値をセットすることもできるし、ビット演算のほうが速いとは言い切れない。
その周辺のロジックと併せて広範囲に最適化が行なわれるしね。
まぁ、ビット演算持ち出すならちゃんと実測してくれと。
0467463
2008/08/04(月) 08:02:29そうなんだ、条件分岐とかのジャンプはコストたかいイメージ有ったわ
そうだね、せっかく高級言語だからわざわざ可読性落とすなってことだね。
0468デフォルトの名無しさん
2008/08/04(月) 08:05:13いえマニアックさでいえばアセンブラと大してかわらないよな。
C言語でバリバリ書く人はどんどんマニアックな記述になるし(注:後発の言語比ね)
0469デフォルトの名無しさん
2008/08/04(月) 08:10:05そうでもない。どんどんマニアックになってその傾向が止まらないのは趣味でやっているか他人を慮らずに仕事をしている所為。
仕事で可読性や保守性を意識していると、大体一定のレベルでその傾向が止まる。
0470デフォルトの名無しさん
2008/08/04(月) 08:12:440471デフォルトの名無しさん
2008/08/04(月) 08:14:22VC++みたいなC++と同居してるコンパイラの場合、上位互換維持するために
C99なんて実装してらんないんじゃないか?
0472デフォルトの名無しさん
2008/08/04(月) 08:17:28沢山あるよ。Windowsで動く身近な例では、gccとかiccとか。
殊にiccはVisualStudioのプラグインとして使うことを想定しているから、
生半可なプログラマがc90とc99とc++を混同していると割とはまれるw
0473デフォルトの名無しさん
2008/08/04(月) 08:17:36あくまでも入門篇のスレなんだからトリッキーな方法は推奨しない方が。
書籍見れば&は「ビット単位の論理積」、|は「ビット単位の論理和」って書いてあるだろうから。
(age<6) | (-is_seito)と(age<6) || (-is_seito)は結果は同じでも副作用が違うというのを認識してればいいのかもしれないけど、|、||、&、&&が混じったときの可読性を下げる方が罪。
条件分岐のコストを話題にするのに計算のコストが話題に出ないのは話の流れ上仕方ないかもしれないけど、||で書けば比較結果のフラグを待避する必要がないのに|だと必ず待避させなければいけない。
ここまで言及して「|で繋ぐのはどうよ?」となる方が話としては自然だと思う。
0474デフォルトの名無しさん
2008/08/04(月) 08:25:570475デフォルトの名無しさん
2008/08/04(月) 08:37:350476デフォルトの名無しさん
2008/08/04(月) 09:17:240477デフォルトの名無しさん
2008/08/04(月) 09:54:140478デフォルトの名無しさん
2008/08/04(月) 10:16:50分岐で
0479デフォルトの名無しさん
2008/08/04(月) 10:31:01入門篇で扱うような話じゃないので、最適化スレなり適当なスレへどうぞ。
つーか、その辺りも先ずは可読性重視でOK。
0480デフォルトの名無しさん
2008/08/04(月) 12:04:26会社のお昼なので携帯から失礼します。猫にも分かるなら自分にも分かるだろうと思っていましたが出来ません。
0481デフォルトの名無しさん
2008/08/04(月) 12:09:55うちの猫を見る限り
不可能と考えるべきでしょう
苦沙弥先生の猫なら別でしょうが
0482デフォルトの名無しさん
2008/08/04(月) 12:13:150483デフォルトの名無しさん
2008/08/04(月) 13:03:55動物愛護団体は猫を差別から守るために、これに対して断固講義していくべきだ
0484デフォルトの名無しさん
2008/08/04(月) 13:15:13人間でもよくある事
分かるといいながら(ry
0485デフォルトの名無しさん
2008/08/04(月) 13:21:290486デフォルトの名無しさん
2008/08/04(月) 13:23:47VBとかほかの言語でelseif ってくっついてるのなかったっけ?
そういうの見てるとなんとなく本来は別なんだけどセットのように
見えて実際そう思ってる人もいそう。
0487デフォルトの名無しさん
2008/08/04(月) 13:25:15誰も>>460に突っこまないほうが問題だと思う
0488デフォルトの名無しさん
2008/08/04(月) 13:27:210489デフォルトの名無しさん
2008/08/04(月) 18:30:230490デフォルトの名無しさん
2008/08/04(月) 18:36:22日本語でOK。
自分が特許とったコードなら払う必要なんて当然ないんだが。
0491デフォルトの名無しさん
2008/08/04(月) 18:41:04書いたコードが偶々既に特許が取られてあるコードと被った場合
の扱いについてと言うことだと思うがそれってC言語関係ないよな
0492デフォルトの名無しさん
2008/08/04(月) 18:53:070493デフォルトの名無しさん
2008/08/04(月) 20:16:53お願いします
0494デフォルトの名無しさん
2008/08/04(月) 20:19:190495デフォルトの名無しさん
2008/08/04(月) 20:21:400496デフォルトの名無しさん
2008/08/04(月) 20:27:28ソースコードを保護するのは著作権。
本当に他人のソースをパクっていないなら著作権侵害にならない。
パクっていないことの証拠として開発中の状況等を細かく残すなどが
過去コンパチ機の開発で行われた。
0498デフォルトの名無しさん
2008/08/04(月) 20:35:45制御ステートメントはだいたい一緒
あとは、色々違う。
あ、あとJAVAにはポインタ無い、参照渡しになる
0499デフォルトの名無しさん
2008/08/04(月) 20:47:320500デフォルトの名無しさん
2008/08/04(月) 21:32:09犬と猫の違いを聞くようなものだ
0501デフォルトの名無しさん
2008/08/04(月) 21:38:02else〜do〜
って文は作れないの?
エラーになってしまう。
0502デフォルトの名無しさん
2008/08/04(月) 21:40:09たぶん単純な文法エラー
0503デフォルトの名無しさん
2008/08/04(月) 21:46:17お願いします
0504デフォルトの名無しさん
2008/08/04(月) 21:53:210505デフォルトの名無しさん
2008/08/04(月) 21:55:57こいつ触覚つけたらゴキブリじゃんwって奴、いやマジで。
0506デフォルトの名無しさん
2008/08/04(月) 22:23:140507デフォルトの名無しさん
2008/08/04(月) 22:28:49C
Java
見るからに違う
C は視力検査でも使われるほど汎用的
0508デフォルトの名無しさん
2008/08/04(月) 22:29:58hoge.c line(1)
ERROR1371:禁止されている文字です。
#include
^
C:¥>cl hoge.java
hoge.java line 1
ERROR D2345 無効な識別子です
import java.io.*;
^
こんな感じかな
0509デフォルトの名無しさん
2008/08/04(月) 22:30:29ん〜・・・右・・・
0510デフォルトの名無しさん
2008/08/04(月) 22:41:360511デフォルトの名無しさん
2008/08/04(月) 22:56:14まずPCを窓から投げ捨てて小学校からやり直すことをお勧めする
0512デフォルトの名無しさん
2008/08/04(月) 23:01:17言い過ぎだろ
単純にCを学んで
JAVA学べば
おのずとわかってくるもんだろ
0513デフォルトの名無しさん
2008/08/04(月) 23:20:32◎ ◎ へ
◎ /∇ )
◎ く/ //
Σ>8 - - - ◎⊃ //
Θ - - - (_ ∠(
Θ - - - ============
Θ - - -
0514デフォルトの名無しさん
2008/08/05(火) 03:15:47可愛い…
0515デフォルトの名無しさん
2008/08/05(火) 07:11:340516デフォルトの名無しさん
2008/08/05(火) 07:39:180517デフォルトの名無しさん
2008/08/05(火) 07:57:120518デフォルトの名無しさん
2008/08/05(火) 10:46:05それほどまでに違うものをどこが違うかとか聞くのは釣りかバカかキチガイのどれか
0519デフォルトの名無しさん
2008/08/05(火) 11:24:52char* hoge;
処理a
} else {
short* hoge;
処理b
}
これと同じことをswitchのcaseの中で実現する場合はどうすればいいんでしょうか?
0520519
2008/08/05(火) 11:25:54これというのは確保する名称は同じですが、ポインターの型を変えたい場合です。
0521デフォルトの名無しさん
2008/08/05(火) 11:27:22変数をローカルに宣言したいってこと?
それならこんな感じで。
switch (xxxx) {
case ...:
{
char* hoge;
処理a
}
break;
case ...:
{
short* hoge;
処理b
}
break;
default:
break;
}
0523デフォルトの名無しさん
2008/08/05(火) 11:35:15C99やC++だと途中で宣言できるけどC90だとできないから、
客先の要望でダウングレードするときなんかは常套手段。
C++でも、デストラクタの呼ばれるタイミングを調整するために使ったりもする。
0524519
2008/08/05(火) 11:39:36コンパイラがC99とかC90までとかの対応状況って明確に確認する方法ってありますかね?
まあ書いてコンパイルしてみればいいってのもありますけど、
説明する際の根拠としてはあいまいすぎるのでw
0525デフォルトの名無しさん
2008/08/05(火) 11:44:08頼むからjavaかVBで書いててくれ。
0526デフォルトの名無しさん
2008/08/05(火) 11:44:58C99とか見たことない
Cではブロックの先頭でしか宣言しない
for内でも宣言しないようにしてる
0527デフォルトの名無しさん
2008/08/05(火) 11:50:280528デフォルトの名無しさん
2008/08/05(火) 11:52:21こういう旧弊に囚われている人が如何に多いか……
まさかとは思うのですが、C++でも数百行にも亘る関数の先頭でしか関数を宣言しないタイプじゃありませんよね?
>>524
C99の変更点については取り敢えずこの辺でどうだろ。
ttp://seclan.dll.jp/c99d/
7章の辺りに文法一般の変更点が書かれている。
0529デフォルトの名無しさん
2008/08/05(火) 11:53:50switchの中は場合によってはありなんじゃね?
C->C#->Cって戻ってくるとなんとなくだけどそう思うわ。
極力使う段階で用意してってことで
0530デフォルトの名無しさん
2008/08/05(火) 11:56:59そうそう、それを書いておくのを忘れていた。
switchやgotoによるジャンプで宣言部を飛び越すのは巧くないので、
ラベルの先で宣言したいときはブロック化しないといけなくなってしまうね。
流石にこんなコードは見たくも書きたくもない。
switch (foo) {
int bar;
case 'a':
func(& bar);
otherFunc(bar);
break;
default:
func2(& bar);
otherFunc(bar);
break;
}
0531デフォルトの名無しさん
2008/08/05(火) 12:03:16int bar; //ここに書けることをはじめて知りました!!!!www
case 'a':
func(& bar);
otherFunc(bar);
break;
default:
func2(& bar);
otherFunc(bar);
break;
}
0532デフォルトの名無しさん
2008/08/05(火) 12:09:26それとも空文が真と判定されてるからですか?
一般にfor文の外でも;は0以外の値が返るのですか?
for文をif文とgoto文であらわそうと思ってるのですが空文のときがあらわせません
空文というかfor文内の;はfor文の一部なので空文とはいわないかもしれませんが
どう解釈すればいいのか教えてください
0533デフォルトの名無しさん
2008/08/05(火) 12:11:44特別措置です
0534デフォルトの名無しさん
2008/08/05(火) 12:14:52ありがとうございます。
0535デフォルトの名無しさん
2008/08/05(火) 12:17:40古いCではその特別措置がないこともあったので、無限ループはwhile (1)を使うのが一般的でした。
ansiで特別措置ができたお蔭で、コンパイラの警告を無視することなくfor (;;)を使えるようになったのです。
0537528
2008/08/05(火) 12:50:29いやさ、いるのよ。数百行の関数の、先頭数十行が変数宣言だけってコードを書く人が。
0538デフォルトの名無しさん
2008/08/05(火) 12:52:30きっとほぼ同じような処理を関数にせずに、いろんな所にハードコーディングしてるんだろうな。
または、処理を何十個も詰め込んでるとか。関数の意味ないよね。
0539デフォルトの名無しさん
2008/08/05(火) 12:52:43もっと細かくすればいいのに
0540デフォルトの名無しさん
2008/08/05(火) 12:59:26あれどうすればいい?
0541デフォルトの名無しさん
2008/08/05(火) 13:08:32なんで分けないんだろうね?
0542デフォルトの名無しさん
2008/08/05(火) 13:10:29特別措置でも何でもない。
ループ継続条件があり、それが偽でない限りループが継続
するように標準化された為。
それまではループ継続条件が無い場合はループ終了になるかならないかは
処理系依存であった。
0543デフォルトの名無しさん
2008/08/05(火) 13:14:35for(;;)は何も入れてないのに無限ループになるの?
for(;;)が許されるならwhile()も許されるんじゃないの?
0544528
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行もある。
0545デフォルトの名無しさん
2008/08/05(火) 13:27:45それこそが、特別措置。forの場合のみ、空にすることが認められていてその場合に真と言うことになっている。
0546デフォルトの名無しさん
2008/08/05(火) 13:34:17for{ }と書けば理解し易いかな
for{A;B;C} statement;は
次のコードが書かれているかのごとく扱うって感じ
A;
do{
statement;
C;
if(!B) break;
}while(1);
0547デフォルトの名無しさん
2008/08/05(火) 13:52:40A;
do{
statement;
C;
<Bが空でない場合>
if(!B) break;
}while(1);
やっぱり特別措置じゃん。
0548デフォルトの名無しさん
2008/08/05(火) 14:21:040549デフォルトの名無しさん
2008/08/05(火) 14:26:47夢中になって作って、改訂することもなく、下手に触ると動かなくなるから。
要するに、スキルが低いからだわな。
0550デフォルトの名無しさん
2008/08/05(火) 14:28:520551デフォルトの名無しさん
2008/08/05(火) 14:35:02ウインドウプロシージャは個別にハンドルする関数にしてる場合が多いよね、
標準でマクロもあったくらいだし。(今もあるのか?)
0552デフォルトの名無しさん
2008/08/05(火) 15:29:28int a;
a = sizeof(int);
これは、
int a;
a = 4;
に、置き換わってるという事でOK?
(intが4byteの時)
なんか、関数に見せかけて、関数じゃないのかな・・・?
0553デフォルトの名無しさん
2008/08/05(火) 15:31:16そそ。
コンパイル時にサイズを計算して数字に置き換わってる
0554デフォルトの名無しさん
2008/08/05(火) 15:31:470555デフォルトの名無しさん
2008/08/05(火) 15:32:39ついでにカッコも要らん
0556デフォルトの名無しさん
2008/08/05(火) 15:38:37Pythonスレの荒らし、俺の予想
2007年 6月 2ちゃんねるを本格的に始める
6月 過去ログが見れないことに腹を立て●を購入
12月 VIP初体験
2008年 8月3日 IDが簡単に変更できることを知る
同日 東方シリーズ総合スレッドを荒らす
8月4日 マクロを使って本格的に荒らす
現在 ム板で個人的に気に入らないPythonをスレを潰しにかかる
0557デフォルトの名無しさん
2008/08/05(火) 15:47:47>>552の例だとカッコ必要じゃないか?
0558デフォルトの名無しさん
2008/08/05(火) 15:50:27* オペランドは、式または括弧で括った型。
* C99だとsizeofは必ずしもコンパイル時には解決されない。
0559デフォルトの名無しさん
2008/08/05(火) 16:01:140560デフォルトの名無しさん
2008/08/05(火) 16:10:13sizeof(int);
sizeof a;
括弧はこんな感じだろ
0561デフォルトの名無しさん
2008/08/05(火) 16:18:30ほぼすべてのコンパイラがそうするってだけで
0562デフォルトの名無しさん
2008/08/05(火) 17:00:08char a[4];
char b[sizeof a];
とか不可?
0563デフォルトの名無しさん
2008/08/05(火) 17:13:550564デフォルトの名無しさん
2008/08/05(火) 17:52:260565デフォルトの名無しさん
2008/08/05(火) 18:12:52これをできればwindowsでいうフックのような形で
すでにメモリに読み込んでいるデータをアクセスさせたい場合
なにか方法はありますでしょうか?
0566デフォルトの名無しさん
2008/08/05(火) 18:26:210567デフォルトの名無しさん
2008/08/05(火) 19:46:18俺はいきなりソース書くけど。
0568デフォルトの名無しさん
2008/08/05(火) 19:59:54いや>>589はc99の話してんだろ?
0569デフォルトの名無しさん
2008/08/05(火) 20:02:150570デフォルトの名無しさん
2008/08/05(火) 20:05:470571デフォルトの名無しさん
2008/08/05(火) 20:07:42int 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の小さい方の数から大きい方の数までの整数を全部足し合わせたものを求めるやつ作ろうとしてるんだが
エラーがでてうまくいかない。たすけてくれ。
0572デフォルトの名無しさん
2008/08/05(火) 20:11:590573デフォルトの名無しさん
2008/08/05(火) 20:13:010574デフォルトの名無しさん
2008/08/05(火) 20:28:44いれたら今度は「1 つ以上の複数回定義されているシンボルが見つかりました」って出てまたエラー
何がいけないんだろ・・・
0575デフォルトの名無しさん
2008/08/05(火) 20:41:460576デフォルトの名無しさん
2008/08/05(火) 21:02:04if (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);
で普通にいけると思うんだが
0577デフォルトの名無しさん
2008/08/05(火) 21:09:18そのエラーに該当する部分はないので、コピペしてない部分に原因があると思われます
0578デフォルトの名無しさん
2008/08/05(火) 21:12:50Visual C++ 2008使ってるんだけど
なんか急に何入れても「1つ以上の複数回定義(ry」
ってエラーがでてくるようになった。
ただputs("あ");
ってプログラムでもそのエラー
0579デフォルトの名無しさん
2008/08/05(火) 21:13:440580デフォルトの名無しさん
2008/08/05(火) 21:16:13int main(void)
{
puts("あ");
return (0);
}
これですらエラーになる。
Visual C++の設定がなんか変わっちゃったのかも。
0581デフォルトの名無しさん
2008/08/05(火) 21:20:04スレ汚しすまんかった。
0582デフォルトの名無しさん
2008/08/05(火) 21:24:33そりゃぁ、古く新規作成はできないだろうさ。
0583デフォルトの名無しさん
2008/08/05(火) 21:48:430584デフォルトの名無しさん
2008/08/05(火) 23:53:340585デフォルトの名無しさん
2008/08/05(火) 23:56:36これから初めてCを学ぼうと思うのですが
C
C++
C#
のどれから始めれば良いのか
教えてください
0586デフォルトの名無しさん
2008/08/05(火) 23:58:150587デフォルトの名無しさん
2008/08/06(水) 00:01:46素早いレスどうもです
便宜上、分かり易さでもC#からの方が良いのですか?
0588デフォルトの名無しさん
2008/08/06(水) 00:02:16CとC++とC#は別物。
英語とドイツ語とフランス語の違いと同じくらい異なるもの。
0589デフォルトの名無しさん
2008/08/06(水) 00:08:53そうでしたか。
ありがとうございます。
C#から頑張ってみたいと思います。
このスレの住人の皆様の御健闘をお祈り致しまして失礼したいと思います。
それでは...
0590デフォルトの名無しさん
2008/08/06(水) 00:32:06いきなり変なのに手を出すと後々苦労すると思うよ
0591デフォルトの名無しさん
2008/08/06(水) 00:38:130592デフォルトの名無しさん
2008/08/06(水) 00:40:070593デフォルトの名無しさん
2008/08/06(水) 00:41:10今の俺だわ
0594デフォルトの名無しさん
2008/08/06(水) 00:44:06boost っておいしい?
0595デフォルトの名無しさん
2008/08/06(水) 00:47:340596デフォルトの名無しさん
2008/08/06(水) 01:05:46基本に忠実で。
0597デフォルトの名無しさん
2008/08/06(水) 01:54:120598デフォルトの名無しさん
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;
}
これの何がいけないのでしょうか?
ビルドでは問題ないようなんですか・・・・
お願いします。
0599デフォルトの名無しさん
2008/08/06(水) 03:51:18自分で解決しました。
(i>0)のぶぶんでした。
目ボケなまこでむみません
0600デフォルトの名無しさん
2008/08/06(水) 03:51:310601デフォルトの名無しさん
2008/08/06(水) 03:54:550602デフォルトの名無しさん
2008/08/06(水) 03:58:56黒い画面が「続行するには・・・」になってしまいました。
>1にしてなにしたかったのでしょうか?
自分は初心者のためよく理解できません;;;
0603デフォルトの名無しさん
2008/08/06(水) 04:03:31最初って
i>10だったの?
それともi>0だったの?
0604デフォルトの名無しさん
2008/08/06(水) 04:07:00ココの部分を0にしたらきちんと表示できました!
0605デフォルトの名無しさん
2008/08/06(水) 04:10:23と思ったら勉強中で色々試してるところなのかな?
0606デフォルトの名無しさん
2008/08/06(水) 04:16:37まったくの初心者なので,を忘れたり入力間違いという簡単なミスをしている段階です。
自分で確認しているのですが、ココに書き込みをして冷静になると問題点が分かるという大変迷惑なことをしています。
すみません・・・・。
0607デフォルトの名無しさん
2008/08/06(水) 04:24:020608デフォルトの名無しさん
2008/08/06(水) 04:30:36無限になってしまうからbreak;をつける
0609デフォルトの名無しさん
2008/08/06(水) 04:32:56最初の宣言部で i = 10 としてるのに
i > 10 つまり i が 10 より大きい時
なんて条件に当てはまらないでしょ?
つまり一度もループに入らないんだよ
0610デフォルトの名無しさん
2008/08/06(水) 04:33:01出勤までまだ時間あるので寝ます。
すみませんでした。ありがとうございます
0611デフォルトの名無しさん
2008/08/06(水) 04:40:010にしたらってもしかすると初期化がi=0;かもよw
0612デフォルトの名無しさん
2008/08/06(水) 05:19:08変数の配列の数を使用者側に入力させたいのですが、入力させる文を入れてから変数定義するとエラーがでます
どうすればいいでしょうか
こんな感じです↓
int kosu;
printf("計算する数値の個数を入力してください");
scanf("%d",&kosu);
int suchi[kosu];
double suchi2[kosu];
0613デフォルトの名無しさん
2008/08/06(水) 05:27:02無理
配列を動的に確保するか、あらかじめかなり大目に確保しておくか
0614デフォルトの名無しさん
2008/08/06(水) 05:34:34わかりました。ありがとうございます
0615デフォルトの名無しさん
2008/08/06(水) 05:41:35C99ならできるよ
0616デフォルトの名無しさん
2008/08/06(水) 05:43:260617デフォルトの名無しさん
2008/08/06(水) 06:13:18int a[val];
みたいな動的確保やると、ヒープ領域に確保されるってことだよね?
0618デフォルトの名無しさん
2008/08/06(水) 06:15:450619デフォルトの名無しさん
2008/08/06(水) 07:39:060620デフォルトの名無しさん
2008/08/06(水) 08:16:46JAVAかVBやってろ。迷惑だ。
0621デフォルトの名無しさん
2008/08/06(水) 09:19:29成りすまして評判落とそうとしてるんなら、別にいいけど
0622デフォルトの名無しさん
2008/08/06(水) 09:27:02始める始めない以前にやらなきゃならない
0623デフォルトの名無しさん
2008/08/06(水) 09:33:20仕方なしにC覚えてるやつがここへ質問に来てそうな雰囲気もある。
0624デフォルトの名無しさん
2008/08/06(水) 09:35:31入門編スレでそんな事言われても・・・
0625デフォルトの名無しさん
2008/08/06(水) 10:16:08初心者って誰のこといってんの?
てか、初心者を経ずに上級者になる方法なんてあるの?w
0626、
2008/08/06(水) 12:22:47unsignd 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です。
0627デフォルトの名無しさん
2008/08/06(水) 12:25:40???
1しか返らないと思うが
th=One;は意味がないし
0628デフォルトの名無しさん
2008/08/06(水) 12:26:37このままだと0にならない?
0629デフォルトの名無しさん
2008/08/06(水) 12:31:39char型の演算はintに変換して行うよ
オプションで変えられたようなきもするけど
0630628
2008/08/06(水) 12:33:01この間pngのパレット取り出す際にまさにそんな演算して
色情報化けまくりだった
0631デフォルトの名無しさん
2008/08/06(水) 12:33:57unsigndやMIMとかtypo多すぎ
コピペでやり直し
0632626
2008/08/06(水) 12:35:470633デフォルトの名無しさん
2008/08/06(水) 12:38:270634デフォルトの名無しさん
2008/08/06(水) 12:39:280635デフォルトの名無しさん
2008/08/06(水) 12:40:44このソースだせ
0636デフォルトの名無しさん
2008/08/06(水) 12:43:37は
if (MIN <= th && th <= MAX)
じゃないの
0637デフォルトの名無しさん
2008/08/06(水) 13:30:58「変数aは今0で、ここを抜けると10になって…」みたいな。
イメージできないなら、条件文に入る前、処理中、条件文を抜けた後、それぞれにprintf()で変数aを表示させること。
他人に聞くよりも絶対早く解決する。
0638デフォルトの名無しさん
2008/08/06(水) 15:20:380639デフォルトの名無しさん
2008/08/06(水) 15:23:290640デフォルトの名無しさん
2008/08/06(水) 15:55:00文字列を複製するんじゃなかったかな。
ググってみたら?
0642デフォルトの名無しさん
2008/08/06(水) 17:15:57char* 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;
}
0643デフォルトの名無しさん
2008/08/06(水) 17:18:280644デフォルトの名無しさん
2008/08/06(水) 17:20:000645デフォルトの名無しさん
2008/08/06(水) 17:20:030646デフォルトの名無しさん
2008/08/06(水) 17:26:01忘れてたwww
最初 malloc(strlen()+1) & strcpy() だったんだけど、どうせおまえらが「長さ2回数えるなんてアホハケーン」
とか言うだろうと思ってmemcpy()に改訂したときにミスった
というわけでアホハケーン>>643
0647デフォルトの名無しさん
2008/08/06(水) 17:35:54わざわざmemcpy使ってる意味が分からないんだが
0648デフォルトの名無しさん
2008/08/06(水) 17:37:570649デフォルトの名無しさん
2008/08/06(水) 17:38:25じゃあ、自分でサンプル書いてみ。
0650デフォルトの名無しさん
2008/08/06(水) 17:38:580651デフォルトの名無しさん
2008/08/06(水) 17:54:19char* strdup(const char* src)
{
size_t len = strlen(src);
char* ptr = malloc(len+1);
strcpy(ptr, src);
return ptr;
}
0652デフォルトの名無しさん
2008/08/06(水) 17:58:000653デフォルトの名無しさん
2008/08/06(水) 18:02:48あぁ、悪い悪い、strncpyの事言ってた
>>649
strncpy(ptr, src, len);
でどうなんだって思ったわけだが
0654デフォルトの名無しさん
2008/08/06(水) 18:09:060655デフォルトの名無しさん
2008/08/06(水) 18:22:25するよ。
>>653
2回NUL位置を調べるのは明らかに無駄。
0656デフォルトの名無しさん
2008/08/06(水) 18:22:440657デフォルトの名無しさん
2008/08/06(水) 18:26:40断定はできないが、たぶん遅い。
memcpyは機械的に指定バイトコピーするだけだから、おそらくワード単位での処理とかで効率化されてる。
strcpyは常に1バイト1バイトチェックしなけりゃならない。
でも実際にはmallocのコストのほうがでかいと思うがね。
0658デフォルトの名無しさん
2008/08/06(水) 18:28:18mallocのコストに比べたらたいしたことのない差だと思う
0659デフォルトの名無しさん
2008/08/06(水) 18:43:47変数xが aかbかcかdのいずれかなら、
ということを使いたいのですが、
その場合、
if (x == a,b,c,d)
でいいんですか?
0660デフォルトの名無しさん
2008/08/06(水) 18:47:020661デフォルトの名無しさん
2008/08/06(水) 18:47:400662デフォルトの名無しさん
2008/08/06(水) 19:10:35このEOFは整数型だから、文字型の変数には代入できないんですよね?
0663デフォルトの名無しさん
2008/08/06(水) 19:13:48だけどcharはsingnedかunsignedか決められてないので
charがunsignedでEOFが-1であることがあるからintにに入れるのが普通
0664デフォルトの名無しさん
2008/08/06(水) 19:19:03だからEOFの時の条件も書いたほうがいいね。
0665デフォルトの名無しさん
2008/08/06(水) 19:20:06嘘を教えないように。
0666デフォルトの名無しさん
2008/08/06(水) 19:24:06どのへん?
0667デフォルトの名無しさん
2008/08/06(水) 19:31:20signed char (8bit) , EOF が -1 のときなら、
char 型に入れても問題ないように読めるが、
その場合、255という文字と -1 が区別できなくなってしまう。
つまり、fgetc はちゃんとこの二つを区別してるのにそれをいったん
signed char 型に入れてしまうことで区別できなくなってしまうってこと。
この他のパターンもいろいろある。考えてみて。符号拡張には特に注意してね。
0668デフォルトの名無しさん
2008/08/06(水) 19:38:00charがsigned charである処理系の話を出しておいてなんでその状況で
255の文字とか言い出してるんだ?
0669デフォルトの名無しさん
2008/08/06(水) 19:50:360670デフォルトの名無しさん
2008/08/06(水) 20:10:27fgetcは常にバイトをunsigned charとして読み込む
charがsignedであっても、0xffを読んだときに返る値は255
0671デフォルトの名無しさん
2008/08/06(水) 20:15:25どうもありがとう
0672デフォルトの名無しさん
2008/08/06(水) 21:01:53するにはどうしたらいいでしょうか?
0673デフォルトの名無しさん
2008/08/06(水) 21:04:530674デフォルトの名無しさん
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;
}
0675デフォルトの名無しさん
2008/08/06(水) 21:36:10問題:キーボードから入力した文字列を全て大文字(小文字は大文字に
大文字はそのまま)に変換して表示するプログラムを作成しなさい。
ただし、文字を大文字に変換する関数を作成し、それを利用すること。
#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';
}
}
0676デフォルトの名無しさん
2008/08/06(水) 21:58:03後x,yが整数の範囲でくるから、yは正負で場合分けが必要
二つ目に関しては試してないから分からんがうまくいきそうな気がする、どういう失敗が起こるの?
0677デフォルトの名無しさん
2008/08/06(水) 21:59:14↓
char str[256];
とでもして置く
0678デフォルトの名無しさん
2008/08/06(水) 21:59:56{
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';
}
}
コンパイルして無いから動くか知らん
0679デフォルトの名無しさん
2008/08/06(水) 22:04:31ああ、main部分か、関数部分しか見てなかった
0680デフォルトの名無しさん
2008/08/06(水) 22:18:47一応言っておきますがASCIIはAmerican Standard Code for Information Interchangeの略ですから
「A」「S」「C」「I」「I」であって「A」「S」「C」「�U」ではありません
0681デフォルトの名無しさん
2008/08/06(水) 22:21:440682デフォルトの名無しさん
2008/08/06(水) 22:22:160683デフォルトの名無しさん
2008/08/06(水) 22:28:49C言語関係ない
base64でぐぐれ、たぶんこれのことだろう
0684デフォルトの名無しさん
2008/08/06(水) 22:31:460685デフォルトの名無しさん
2008/08/06(水) 22:33:45あれ?
0686デフォルトの名無しさん
2008/08/06(水) 22:38:55HTMLファイルをfopenしてfgetsなりなんなりで読んで解析すればいいんじゃないかな
0687デフォルトの名無しさん
2008/08/06(水) 22:39:53解答ありがとうございます。
度々申し訳無いんですが
直してコンパイルしてみたのですがエラーが出ました
どうしたらよいでしょうか
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
こんな感じです。
0688デフォルトの名無しさん
2008/08/06(水) 22:47:172の方は警告だから無視
0689デフォルトの名無しさん
2008/08/06(水) 22:53:121番目: 3行目のpowのプロトタイプ宣言にセミコロン「;」がついてない。(警告は止まらないので無視)
0690デフォルトの名無しさん
2008/08/06(水) 22:58:09まだあった、forの後の;とってあるか?それがあると空で回るぞ
0691デフォルトの名無しさん
2008/08/06(水) 23:09:31int 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;
}
今ソースはこんな感じです。
どうでしょうか?
0692デフォルトの名無しさん
2008/08/06(水) 23:14:20いや、「どうでしょうか」じゃなくて、自分でコンパイルして、実行してみるの!
0693デフォルトの名無しさん
2008/08/06(水) 23:20:360694デフォルトの名無しさん
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
0695デフォルトの名無しさん
2008/08/06(水) 23:25:31int 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;
}
0696デフォルトの名無しさん
2008/08/06(水) 23:29:190697デフォルトの名無しさん
2008/08/06(水) 23:37:18ここから自力でやってみます。
0698デフォルトの名無しさん
2008/08/06(水) 23:51:37コンパイラの警告レベルは常にmaxにし、警告とエラーは全てゼロになるコードを書くのが基本。
0699デフォルトの名無しさん
2008/08/06(水) 23:56:11せっかくだから>>687と>>694の警告の意味と対処法を教えてあげれば?
0700デフォルトの名無しさん
2008/08/07(木) 00:03:14>int pow(int x, int y)
つ;
0701デフォルトの名無しさん
2008/08/07(木) 00:05:170702デフォルトの名無しさん
2008/08/07(木) 00:09:450703デフォルトの名無しさん
2008/08/07(木) 00:11:450704デフォルトの名無しさん
2008/08/07(木) 00:25:08宿題スレで回答されたコードにシンタックスエラーを追加した改悪版だよ。
んで、VCだとpowは組み込み関数なの?math.hないのにこんなエラー出るって事はそうなんだよね
0705デフォルトの名無しさん
2008/08/07(木) 00:27:31fopenなどが非推奨となってる開発環境に旧資産を移すときは、その手の警告を抑えるスイッチをつけたいです
0706デフォルトの名無しさん
2008/08/07(木) 00:31:54横からごめん。
fopenなどが非推奨ってどういう環境? よくあるのかしら。 ちょと気になる。
0707デフォルトの名無しさん
2008/08/07(木) 00:32:57MS独自の _s 系の関数では?
0708デフォルトの名無しさん
2008/08/07(木) 00:33:19MSはfopen_sを使いなされというよ
0709デフォルトの名無しさん
2008/08/07(木) 00:33:440710デフォルトの名無しさん
2008/08/07(木) 00:34:000711デフォルトの名無しさん
2008/08/07(木) 00:36:55-pedantic
その他各種-Wなんたら
0712デフォルトの名無しさん
2008/08/07(木) 00:38:35http://www.linux.or.jp/JM/html/GNU_gcc/man1/gcc.1.html
Wallでいいと思うけど。
0714デフォルトの名無しさん
2008/08/07(木) 00:50:18-W -Wall が基本だと思ってる
0715デフォルトの名無しさん
2008/08/07(木) 18:55:55よくわからないところがあります。教えていただけると助かります。
復習問題5.6.b:
「『ファイルの終わりまで有効なスコープをもつ整数型の外部変数number』
の宣言を書け」という問題があって、その答えが
「static int number; (これは関数定義の外部で宣言すること)」なんです。
・なぜ解答では記憶クラスがstaticなんでしょう。関数定義の外部で宣言するんだから、
externでもstaticでもスコープはファイルスコープになるような。
・(上が間違っていないとして)解答でstaticが使われているのは、複数のファイルで
プログラムをつくるとき、externだと他のファイルからアクセスできるから?
でもそれは、スコープとは関係ないんですよね?
0716デフォルトの名無しさん
2008/08/07(木) 19:01:50-Wallは-Wを含むはずだが
0717デフォルトの名無しさん
2008/08/07(木) 19:40:170718デフォルトの名無しさん
2008/08/07(木) 19:41:20md5sum でググれ
0719デフォルトの名無しさん
2008/08/07(木) 19:49:07そんなことはない
0720デフォルトの名無しさん
2008/08/07(木) 19:50:51そのファイル”のみ”で有効な変数という意味だと思う
訳者が省略したんだろう
0721デフォルトの名無しさん
2008/08/07(木) 23:39:59そう言われてみると、そんな意味がありそうな訳文かも。
もともと解答があきらかに間違っているわけでもないので、
そう解釈して先へ進んでみます。
ありがとうございました!
0722デフォルトの名無しさん
2008/08/08(金) 02:10:19あるループ(do while使用)で処理をおこなったあと、Enterキーを入力した場合もう一度ループするというプログラムを作っているんですが
putchar();で受け取ると最初のみ2回ループ内の処理が行われてしまいます。
Enterを受け取る別のコマンドはないでしょうか?
また、putcharをそのまま使うならバッファをクリアすれば?
といわれたのですがやり方がわかりません。どなたかヒントいただければと思います
よろしくおねがいします
0723デフォルトの名無しさん
2008/08/08(金) 02:17:570724デフォルトの名無しさん
2008/08/08(金) 02:26:54scanfと一緒に使うな。
scanfで入力を受けたときに入力された改行が、getcharで拾われているのだろうとエスパー。
もしそうなら、例えばscanfのほうをfgets+sscanfにでもすればいい。
0725デフォルトの名無しさん
2008/08/08(金) 02:51:53設定でパソコンが壊れるって本当ですか?
0726デフォルトの名無しさん
2008/08/08(金) 02:56:25無料のもあるし無料じゃないのもある
まぁ壊れること普通ないかと
0727デフォルトの名無しさん
2008/08/08(金) 02:57:51ありがとうございます
無料の探して頑張ってやってみます
0728デフォルトの名無しさん
2008/08/08(金) 06:53:21fflush(stdin)
0729デフォルトの名無しさん
2008/08/08(金) 07:21:08int 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って表示されないんですけど。
引数経由で詰めるにはどうすればいいのですか?
0730729
2008/08/08(金) 07:24:19ではなく
struct Hoge *hoge;
でした
0731デフォルトの名無しさん
2008/08/08(金) 07:25:29int 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;
}
0732デフォルトの名無しさん
2008/08/08(金) 07:43:48struct 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;
}
0733デフォルトの名無しさん
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;
}
0734デフォルトの名無しさん
2008/08/08(金) 07:59:47お前は日本語が理解できないらしいな
まぁ確かにそっちのがいいけど
0735デフォルトの名無しさん
2008/08/08(金) 08:02:18それは関数の構造を変えてるだろ。
そのほうがいいのは確かだけど
質問者は引数でポインターを渡してそこを書き換えて戻してくれってことだろ?
まずそっちを回答してから、本当はこういうほうがいいかもね
と教えるべきだろ
0736デフォルトの名無しさん
2008/08/08(金) 08:10:38現状数が少ない配列などはコンパイル時に値を代入してくれるイニシャライザー?
で初期化していますが128x128の構造体配列(中はshortx4)を全部-1で初期化したい
場合はうまく指定する記述方法とかありますでしょうか?
0737736
2008/08/08(金) 08:12:22>128x128の構造体配列(中はshortx4)
これがさらに3つあります。
0738デフォルトの名無しさん
2008/08/08(金) 08:13:300739736
2008/08/08(金) 08:13:333では無くさらに3x3の配列になってます・・・
0740デフォルトの名無しさん
2008/08/08(金) 08:27:470xffで埋めちゃえばできるかと
0741デフォルトの名無しさん
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"
};
// 以下略
0742デフォルトの名無しさん
2008/08/08(金) 08:41:28初期化用の関数かマクロを書いたほうがマシ
0743デフォルトの名無しさん
2008/08/08(金) 08:45:090744デフォルトの名無しさん
2008/08/08(金) 08:46:55(コンパイラの設定を変えないかぎり)サイズの節約にはならないことは理解してるかい
0745デフォルトの名無しさん
2008/08/08(金) 08:49:05shortが4つ並んでも勝手にサイズ調整されるんですかね?・・・・
0746デフォルトの名無しさん
2008/08/08(金) 08:49:17黙って多重ループを使って明示的に実行時初期化する
ほかに類似の構造体配列がないならコストは別に変わらない
0747デフォルトの名無しさん
2008/08/08(金) 08:51:05まぁ、余程のことがない限り余計なアライメントは発生しないな。
0748デフォルトの名無しさん
2008/08/08(金) 08:51:090-1バイト:short 1
2-3バイト:詰め物
4-5バイト:short 1
6-7バイト:詰め物
になるからね
配列にすれば別だけど
大抵の場合は変なこと考えずにintで取るのがCの流儀
0749745
2008/08/08(金) 08:53:32さっきshortからintに変更したら実行ファイルのサイズが小さくなりましたw
0750デフォルトの名無しさん
2008/08/08(金) 08:56:31shortやcharを使うと記憶領域を節約できる場合があるけど、余計なコードが必要になることも多い
0751デフォルトの名無しさん
2008/08/08(金) 08:56:50そのコンパイラとコンパイルオプションは?
まさか、アライメント指示のコンパイルオプションをつけているとかプラグマ指定をつけているなんて言わないよな。
0752デフォルトの名無しさん
2008/08/08(金) 08:58:24実際の演算のときは、格上げに注意。C90とC99で振る舞いが変わるからね。
0753デフォルトの名無しさん
2008/08/08(金) 08:59:41朝っぱらから生半可な知識で中途半端なことを書くのはやめてくれ。フォローすんのもめんどくせぇぞ。
0754デフォルトの名無しさん
2008/08/08(金) 09:09:02Cの境界調整とは記憶領域が境界をまたいで配置されることがないようにすることであって、
記憶領域の先頭をなにがなんでも境界に合わせるわけではない。
特別な指定がないかぎり、(short が int の半分なら) short を4つ連続で配置したら詰めものが入ることはない。
0755ym
2008/08/08(金) 11:30:14文字列が全て'A'〜'Z'の文字で構成されているかをチェックする、
プログラムを教えてください。
0756デフォルトの名無しさん
2008/08/08(金) 11:33:53ならねーよ
バカ
0757デフォルトの名無しさん
2008/08/08(金) 11:41:55#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;
}
0758デフォルトの名無しさん
2008/08/08(金) 11:46:47char *hoge[5]={ "hoge","hoge2","hoge3","hoge4","hoge5"};
for(i=0;i<5;i++){
if(hoge[i] == tmp) 処理
}
hogeの文字列と引数として受け取った文字列が一致すればなにかするっていうのを書きたいんですが、
うまくコンパイルできません。どうすればいいのでしょうか?
0759デフォルトの名無しさん
2008/08/08(金) 11:49:30#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) 処理
}
0760デフォルトの名無しさん
2008/08/08(金) 12:08:300761デフォルトの名無しさん
2008/08/08(金) 12:53:37char mozi[256]にtestって入ってるとして
その後ろにhogeって追加したい場合はどうやればいいんですか?
0762デフォルトの名無しさん
2008/08/08(金) 12:54:36配列の中は
testhoge
にするってこと?
0763デフォルトの名無しさん
2008/08/08(金) 12:56:200764デフォルトの名無しさん
2008/08/08(金) 12:56:310765デフォルトの名無しさん
2008/08/08(金) 12:59:150766デフォルトの名無しさん
2008/08/08(金) 13:06:36入門者以前の、習得一週間以下くらいだぞ
0767デフォルトの名無しさん
2008/08/08(金) 13:13:380769デフォルトの名無しさん
2008/08/08(金) 14:03:450770デフォルトの名無しさん
2008/08/08(金) 15:12:37const char str[] = "hoge";
この2つは、メモリ上の確保される位置が違うのでしょうか?
前者は、読み出し専用領域なるところに確保され、他からも再利用
されるという話を聞いたのですが、後者は普通に配列を確保したような
確保のされ方なのでしょうか?
0771デフォルトの名無しさん
2008/08/08(金) 15:17:52文字列リテラル「"hoge"」はコンパイラによって確保された静的な領域に置かれる
読み出し専用であるかどうかは定まっていないが、少なくとも保証されていないので、そう見なしたほうが安全である
0772デフォルトの名無しさん
2008/08/08(金) 15:18:39保証されていないので→書き換え可能であることが保証されていないので
0773デフォルトの名無しさん
2008/08/08(金) 15:20:40"hoge"は静的領域に置かれて大抵の場合書き込み不可
再利用されるかどうかはわからないが、賢いコンパイラならたぶんやる
str[]はもちろん'h''o''g''e'\0'が格納される
0774デフォルトの名無しさん
2008/08/08(金) 15:23:43つまり2つは似て非なるものということですよね。
もし、char *タイプだった場合、賢いコンパイラが再利用してくれる
可能性があるなら、char []で確保するよりもベターということですよね。
もちろん定数文字列として使う場合。
0775デフォルトの名無しさん
2008/08/08(金) 15:28:35一方文字列定数を直接使うとアクセス速度が落ちるかもしれない
それもやっぱり気にするような差ではないかもしれない
0776デフォルトの名無しさん
2008/08/08(金) 15:32:15メモリの配置など気にしてもあまり意味ないと思うけどな。
上はconst char *、下はchar配列。別のものであることを理解してればおk。
0777デフォルトの名無しさん
2008/08/08(金) 15:35:23ありがとうございました。
0778デフォルトの名無しさん
2008/08/08(金) 15:41:38いちおう補足するけど、文字列定数を使うのは「内容が変わらないことが保障されるから」だからね。
メモリが再利用されるから使うという人はあまり見かけない。
0779デフォルトの名無しさん
2008/08/08(金) 15:47:51これだと、文字列は不変でも、ポインタ自体が入れ替わる可能性があることを
考えれば、
const char a[]
こっちの方がガードは堅い気もする…
0780デフォルトの名無しさん
2008/08/08(金) 15:49:52そこを気にするならconstもう一個つけてればいいだけじゃね?
0781デフォルトの名無しさん
2008/08/08(金) 15:52:030782デフォルトの名無しさん
2008/08/08(金) 16:01:13char buf[]="hoge";
これはアセンブラになると(古くて済まんが68000の場合)、
_ptr:
ds.l _temp
_temp:
dc.b 'hoge',0
_buf:
dc.b 'hoge',0
というふうに展開される。ptrは移動可能なポインタなのに対し(たとえばptr++ができる)、
bufは移動不能なので、ptrの方が自由度が高い分、メモリを4バイト余計に消費する。
なので原理的には buf[] 形式で宣言した方が低コストではある。
0783デフォルトの名無しさん
2008/08/08(金) 16:04:230784デフォルトの名無しさん
2008/08/08(金) 16:12:44#define HOGE "hoge"
とでもしちゃうな俺は
0785デフォルトの名無しさん
2008/08/08(金) 16:29:32const が何を修飾しているのかを考えるべき。
---------------------------------------------------------------------
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)不足に陥る場合もありますね。
0786デフォルトの名無しさん
2008/08/08(金) 16:44:28三つのうち一番上は断言できないだろ
0787デフォルトの名無しさん
2008/08/08(金) 17:08:07一体どうしたら解決できるのでしょうか
0788デフォルトの名無しさん
2008/08/08(金) 17:08:370789デフォルトの名無しさん
2008/08/08(金) 17:16:380790デフォルトの名無しさん
2008/08/08(金) 17:20:32VC++2つ開いてたりしない?
試しにクリーンからやってみ
0791デフォルトの名無しさん
2008/08/08(金) 17:30:040792デフォルトの名無しさん
2008/08/08(金) 17:35:11エクスプローラーやコマンドラインからEXE消してみてもいいし。
0793デフォルトの名無しさん
2008/08/08(金) 17:37:490794デフォルトの名無しさん
2008/08/08(金) 17:53:29デバッグ中で無けりゃ、タスクマネージャからプロセス探して殺してみそ
0795デフォルトの名無しさん
2008/08/08(金) 18:41:19できました。ご丁寧にありがとうございました
0796デフォルトの名無しさん
2008/08/08(金) 18:43:25OSごと再起動しちゃったほうが早くね?
0797デフォルトの名無しさん
2008/08/08(金) 18:50:49まずif(!(t=search_hash(ltbl, buf)))はどういう条件なんでしょうか。tは構造体ポインタ変数、ltblはポインタ配列、bufは配列です。
それと、strdup(str)という関数があるのですが、調べても出てきませんでした。別に宣言されてないので自作の関数ではないようです。
これは何の関数なんでしょうか。それと、if (ltbl[i])、if(!t)というのもあるのですが、if文の条件が式でないので意味がわからず困ってます。
よろしくお願いします。
0798デフォルトの名無しさん
2008/08/08(金) 18:55:04代入した結果のtが真なら!演算子で偽になる、そんな感じ
0799デフォルトの名無しさん
2008/08/08(金) 18:59:41C/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
0800デフォルトの名無しさん
2008/08/08(金) 19:03:18中身が良く分からないので教えてくれませんか?って言わないんだろうね
0801デフォルトの名無しさん
2008/08/08(金) 19:05:460802デフォルトの名無しさん
2008/08/08(金) 19:13:110803デフォルトの名無しさん
2008/08/08(金) 19:15:17ありがとうございました。
0804デフォルトの名無しさん
2008/08/08(金) 19:18:00宿題スレに投げてくるときでさえ、
課題を自己解釈しておかしな問に書き換えて送ってくる。
0805デフォルトの名無しさん
2008/08/08(金) 19:19:18・真偽値について勉強
・NULLの定義について勉強
・代入文それ自体も値を持つことについて勉強
・値も式であることについて勉強
・if 文の条件は式ではないことについて勉強
でいけます。
0806デフォルトの名無しさん
2008/08/08(金) 19:25:55丸投げした意味ないな
0807デフォルトの名無しさん
2008/08/08(金) 19:42:180808デフォルトの名無しさん
2008/08/08(金) 19:49:31char *p0 = "aaa"; //文字もアドレスも変数も変更可
コンパイラによっては文字変更不可
*p0 = 'A';//NG
0809デフォルトの名無しさん
2008/08/08(金) 19:51:27やつらはいろいろな手法を繰り出してくるから気を抜けない
0810デフォルトの名無しさん
2008/08/08(金) 19:55:56ユーザ定義の関数がどんな引数を受け取ってどんな戻り値を返すかなんて自由だし
グローバル変数でやりとりしてるかもしれないのに
0811デフォルトの名無しさん
2008/08/08(金) 19:58:39#include<iostream>
using namespace std;
void main(void){
for(;;){
char ToT[16]="( ゚A゚)y-・~~";
cout << ToT;
}}
こんな感じの…
0812デフォルトの名無しさん
2008/08/08(金) 19:59:070813デフォルトの名無しさん
2008/08/08(金) 20:43:47「普通の人には興味ありません!!!」
0814デフォルトの名無しさん
2008/08/08(金) 20:50:57fflush(stdin) って、一般的には環境依存ではなかったでしょうか?
0815デフォルトの名無しさん
2008/08/08(金) 21:05:37環境依存です
0816デフォルトの名無しさん
2008/08/08(金) 21:35:12現在53人のエスパーが待機してます
エスパーが質問に答えるスレ
http://pc11.2ch.net/test/read.cgi/tech/1187922645/
0817デフォルトの名無しさん
2008/08/09(土) 10:40:16{
int mojicode = data[0] << 8 | data[1];
//処理
}
S-JISのデータをintに変換している処理なんですが
思ったように動かないのでintの中身を調べたところ
ffffxxxx (xxxxはdata[0]data[1]の中身)
でした。
これはコンパイラ依存なんでしょうか?
0818デフォルトの名無しさん
2008/08/09(土) 10:42:20char が signed か unsigned かの問題
コンパイルオプションで char を unsigned 指定するか
unsigned char と明示的に指定すればおk <- こっちのほうがオススメ
0819817
2008/08/09(土) 10:42:35>でした。
>これはコンパイラ依存なんでしょうか?
でした。
期待していたのは0000xxxx だったのですが ffffxxxx となっていました。
これはコンパイラ依存なんでしょうか?
0821デフォルトの名無しさん
2008/08/09(土) 13:44:210822817
2008/08/09(土) 13:50:46charだと8bit目が符号になるのでそれをintにキャストキャストした場合
たとえばcharに0x82が入っててキャストした場合0xffffff82となる
で、0x72などであれば0x00000072となる
ということでOKですよね?
0823817
2008/08/09(土) 13:51:18charだと8bit目が符号になるのでそれをintにキャストした場合
余分に・・・orz
0824デフォルトの名無しさん
2008/08/09(土) 14:41:13いいえ、charがsignedであるという仮定をしてはいけません。つまり、
その説明だとsigned charの振る舞いを説明したことにしかなりません。
0825デフォルトの名無しさん
2008/08/09(土) 15:18:240826デフォルトの名無しさん
2008/08/09(土) 15:33:310827デフォルトの名無しさん
2008/08/09(土) 16:40:46格上げ(promotion, 暗黙の型変換)の仕様がまちまちだったからなんです。
0828デフォルトの名無しさん
2008/08/09(土) 23:48:54すでに辞書順に並んでいるリストに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);
}
}
続きます
0829デフォルトの名無しさん
2008/08/09(土) 23:49:31struct 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);
}
お願いします。
0830デフォルトの名無しさん
2008/08/09(土) 23:54:250831デフォルトの名無しさん
2008/08/09(土) 23:55:330832デフォルトの名無しさん
2008/08/10(日) 00:05:19勉強すれば習得できるものなのでしょうかね。
0833デフォルトの名無しさん
2008/08/10(日) 00:08:490834デフォルトの名無しさん
2008/08/10(日) 00:25:49一行穴埋めにしてみた
ほにゃらら=ほげほげ となる式
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;
}
0835デフォルトの名無しさん
2008/08/10(日) 00:36:090836デフォルトの名無しさん
2008/08/10(日) 00:37:13論理能が必要とかなんとか
0837デフォルトの名無しさん
2008/08/10(日) 00:43:380839デフォルトの名無しさん
2008/08/10(日) 00:47:31やってみたよ
最初に書かれてたコードにミスがあったからちょっと時間かかったけど
そこまで難しくはないと思うが。
0840デフォルトの名無しさん
2008/08/10(日) 01:04:40char name[10];
int score;
struct slist *next;
};
みたいに構造体の中で自分の型のポインタを使う事の呼び方ってありますか?
0841デフォルトの名無しさん
2008/08/10(日) 01:05:410842デフォルトの名無しさん
2008/08/10(日) 01:06:02自己参照構造体
0843デフォルトの名無しさん
2008/08/10(日) 01:07:040844840
2008/08/10(日) 01:07:590845デフォルトの名無しさん
2008/08/10(日) 15:22:420846デフォルトの名無しさん
2008/08/10(日) 17:12:41他のファイル(txtファイル)として出力するにはどうすればいいでしょうか?
fopenを使うやり方教えてください。
0847デフォルトの名無しさん
2008/08/10(日) 17:18:20fprintf(fp, "%s\n", "ある数字(1-100のランダムな数字)");
fclose(fp);
0848デフォルトの名無しさん
2008/08/10(日) 17:22:21THXTHX さっそくやってみる
これは通常のループ(forとか)にもそのままつっこめるんだよね?(2行目)
0849デフォルトの名無しさん
2008/08/10(日) 17:29:250850デフォルトの名無しさん
2008/08/10(日) 17:35:010852デフォルトの名無しさん
2008/08/10(日) 17:50:000853デフォルトの名無しさん
2008/08/10(日) 17:56:010854デフォルトの名無しさん
2008/08/10(日) 18:04:02「オーナーが決まってて公開される静的なメンバ」なんて
分かりやすいと思うけど。C++にも普通にあるし。
Cのようにプリプロセッサに頼ったりグローバル変数に
配置するよりも明確で良い。
プリプロセッサを否定する訳ではない。用途が違うので。
0855デフォルトの名無しさん
2008/08/10(日) 18:06:260856デフォルトの名無しさん
2008/08/10(日) 18:27:250857デフォルトの名無しさん
2008/08/10(日) 18:29:220858デフォルトの名無しさん
2008/08/10(日) 18:32:58リトルエンディアン、ビッグエンディアンはあくまでレジスタ以外の
メモリなんかに格納した際の状態だから。
レジスタに取り出したら基本的にはビッグエンディアン状態
0859デフォルトの名無しさん
2008/08/10(日) 18:35:29意味とかはどうでもいいんだが。
0860デフォルトの名無しさん
2008/08/10(日) 18:59:18うおーでけました!
5行目のif文は{}で囲まなくても大丈夫なんですねー
勉強になります。ありがとうございます!
0861デフォルトの名無しさん
2008/08/10(日) 19:42:13俺は1文でも{ }で囲む主義
0862デフォルトの名無しさん
2008/08/10(日) 19:56:34後から増やすとき楽だしねー
俺は気分で変える主義
0863デフォルトの名無しさん
2008/08/10(日) 20:10:42それは主義とはいわない
0864デフォルトの名無しさん
2008/08/10(日) 20:32:58混合はやめたほうがいい
0865デフォルトの名無しさん
2008/08/10(日) 20:56:470866デフォルトの名無しさん
2008/08/10(日) 20:58:130867デフォルトの名無しさん
2008/08/10(日) 22:31:400868デフォルトの名無しさん
2008/08/10(日) 22:34:04mmap VirtualAlloc 等、標準以外の方法を使えば可能
0869デフォルトの名無しさん
2008/08/10(日) 22:34:160870デフォルトの名無しさん
2008/08/10(日) 22:34:23あなたがカーネルならできます。
0871デフォルトの名無しさん
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」にするか教えてもらえないでしょうか?
0872デフォルトの名無しさん
2008/08/11(月) 00:08:45'f'と指定
0873デフォルトの名無しさん
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;
}
でした。
0874デフォルトの名無しさん
2008/08/11(月) 00:10:140875デフォルトの名無しさん
2008/08/11(月) 00:12:23>>874
0876デフォルトの名無しさん
2008/08/11(月) 00:13:00>>874
アリガトウございました。
出来ました。
0877デフォルトの名無しさん
2008/08/11(月) 00:53:530878デフォルトの名無しさん
2008/08/11(月) 01:01:29試してないけど
0879デフォルトの名無しさん
2008/08/11(月) 01:02:180880デフォルトの名無しさん
2008/08/11(月) 01:16:460881デフォルトの名無しさん
2008/08/11(月) 02:42:3010億ぐらいのコンピュータで試せば、
もしかしたらfunって動作するかもしれないよな
0882デフォルトの名無しさん
2008/08/11(月) 02:59:31アラインメントの関係で f はまず考えられない
d(0x64) とか hlptx に書き換わる可能性なら十分あるけど
0883デフォルトの名無しさん
2008/08/11(月) 03:30:13しかしその動作の結果は根本的に処理系依存であったので(「移植性のない」とはそういう意味である)、
ANSI/ISO規格は、高い移植性という目標のために、これを保証することをやめてしまった。
だから多くのコンパイラはこれに対して警告を出すし、そういうことに特にうるさいコンパイラは
よりいっそう厳しくエラーであるとみなしてコンパイルすることを拒否する、ということになる。
0884デフォルトの名無しさん
2008/08/11(月) 06:24:56あのー、ANSI/ISOでも保証されてますけど。
0885デフォルトの名無しさん
2008/08/11(月) 07:11:420886デフォルトの名無しさん
2008/08/11(月) 07:22:22任意のポインタ型は整数型に型変換できる。
バカは、整数型とint型の区別がつかないから。
0887デフォルトの名無しさん
2008/08/11(月) 07:24:440888デフォルトの名無しさん
2008/08/11(月) 07:24:47なぁintptr_tって知ってる?
0889デフォルトの名無しさん
2008/08/11(月) 07:26:335.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;
だそうです。
0890デフォルトの名無しさん
2008/08/11(月) 07:27:24で、自分がどれだけ恥の上塗りをしてるのか理解してる?
0891デフォルトの名無しさん
2008/08/11(月) 07:29:270892デフォルトの名無しさん
2008/08/11(月) 07:45:270893デフォルトの名無しさん
2008/08/11(月) 07:47:13(short*)0x12345678 = 0xFF;
0894デフォルトの名無しさん
2008/08/11(月) 07:48:500895デフォルトの名無しさん
2008/08/11(月) 07:51:10他所でやれ
0896デフォルトの名無しさん
2008/08/11(月) 08:36:16p = (int *)0x12345678;
*p = 0xFF;
0897デフォルトの名無しさん
2008/08/11(月) 08:37:380898デフォルトの名無しさん
2008/08/11(月) 13:09:290899デフォルトの名無しさん
2008/08/11(月) 13:11:02Cの標準機能ではありません
0900デフォルトの名無しさん
2008/08/11(月) 13:15:45ってのがよくあったのでできた機能だし>GC
0901デフォルトの名無しさん
2008/08/11(月) 13:17:59決められた範囲(こちらで指定する)の数字をスロットのように表示させるにはどうすればいいでしょうか?
画面はコマンドプロンプトでjpgなどは無しでおねがいします
0902デフォルトの名無しさん
2008/08/11(月) 13:19:44制御できない=新しく表示するたびにスクロールしちゃう
0903デフォルトの名無しさん
2008/08/11(月) 13:26:180904デフォルトの名無しさん
2008/08/11(月) 13:30:20MS-DOS時代の遺産command.comなら出来るかもしれない
0905901
2008/08/11(月) 13:53:55ループ処理で、printfで表示したものを消す→表示→消す→表示
みたいなやり方とかあるんでしょうか?
また後出しになって申し訳ありませんが
kbhit(),_getch() 関数を使用する
そうです。関係なかったらすみません
0906デフォルトの名無しさん
2008/08/11(月) 13:57:210907デフォルトの名無しさん
2008/08/11(月) 14:04:56GCが出来たのはもともとインタプリタで必要だったからじゃないの?
0908901
2008/08/11(月) 14:08:130909デフォルトの名無しさん
2008/08/11(月) 14:10:46いいえ違います。
GCはジョン・マッカーシーが関数型言語であるLispに使うために考え出しました。
0910デフォルトの名無しさん
2008/08/11(月) 14:26:34lisp コンパイラ? lisp インタプリタ?
まあ、lisp はつくづく偉大だと思います。
0911デフォルトの名無しさん
2008/08/11(月) 14:37:27でも、インタープリタだったから必要だったわけじゃないだろうな。
0912デフォルトの名無しさん
2008/08/11(月) 14:57:070913デフォルトの名無しさん
2008/08/11(月) 14:58:33http://pc11.2ch.net/test/read.cgi/tech/1179157784/
0914デフォルトの名無しさん
2008/08/11(月) 19:00:04cmd.exe(というよりNTのコンソール窓)はWin32 APIで好きにできるだぞ。
0915デフォルトの名無しさん
2008/08/11(月) 20:22:340916デフォルトの名無しさん
2008/08/11(月) 20:26:460917デフォルトの名無しさん
2008/08/11(月) 20:27:30すれ違いですし普通にぐぐるとでてきますよ
0918デフォルトの名無しさん
2008/08/11(月) 20:28:03ダウンロードするときC/C++つきの選べ
0919デフォルトの名無しさん
2008/08/11(月) 20:31:160920デフォルトの名無しさん
2008/08/11(月) 20:55:370921デフォルトの名無しさん
2008/08/11(月) 20:57:43OSなんてみちゃいねぇ
0922デフォルトの名無しさん
2008/08/11(月) 20:57:580923デフォルトの名無しさん
2008/08/11(月) 21:05:30NPC_2047から始まるクエストのプログラムで教えて頂きたいのです
クエストを受ける→クリアを素材、回数制限をなくしたくて
いろいろ試しているのですが
クエストが止まる、うけれなくなるの繰り返しで進めません
どうかご教授おねがいします
プログラムを書きたいのですが長すぎで省略すみません
0924デフォルトの名無しさん
2008/08/11(月) 21:12:520925デフォルトの名無しさん
2008/08/11(月) 21:38:360926デフォルトの名無しさん
2008/08/11(月) 21:39:560927デフォルトの名無しさん
2008/08/11(月) 21:44:00チートすんなゴミ
0928デフォルトの名無しさん
2008/08/11(月) 21:45:500929デフォルトの名無しさん
2008/08/11(月) 21:49:100930デフォルトの名無しさん
2008/08/11(月) 22:14:510931デフォルトの名無しさん
2008/08/11(月) 22:20:170932デフォルトの名無しさん
2008/08/11(月) 23:11:180933デフォルトの名無しさん
2008/08/11(月) 23:24:240934デフォルトの名無しさん
2008/08/11(月) 23:31:43「abc」 次はこれに「de」を足して「abcde」
さらに「fg」足して「abcdefg」って出力するにはどうすればいいですか?
足すのはループで処理しようと思っていますが、どうにも上書きになってしまいます
0935デフォルトの名無しさん
2008/08/11(月) 23:33:58つまずいていても前に進み今はポインタの一歩手前です。
sizeof演算子
ビット演算子
swichなどみなさんどのようにして自分のものに出来たのでしょうかorz
まったく使いこなせなくつまずいています・・・。
チラ裏すみません・・・。
0936デフォルトの名無しさん
2008/08/12(火) 00:13:55strcatでも使えば?
0937デフォルトの名無しさん
2008/08/12(火) 00:16:42strcpy(array, "abc");
printf("[%s]\n", array);
strcat(array, "de");
printf("[%s]\n", array);
strcat(array, "fg");
printf("[%s]\n", array);
0938デフォルトの名無しさん
2008/08/12(火) 00:18:11おお!THXTHX 配列は2個使用するワケだね?OKOK!
0939デフォルトの名無しさん
2008/08/12(火) 00:20:01{
while (* p++) ;
while (* p++ = * str++) ;
}
0940デフォルトの名無しさん
2008/08/12(火) 00:33:340941デフォルトの名無しさん
2008/08/12(火) 00:36:53あれ?null文字の一つ後ろまで飛んでね?
0942デフォルトの名無しさん
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;
}
0943デフォルトの名無しさん
2008/08/12(火) 04:49:21while (* ++p) ;
0944デフォルトの名無しさん
2008/08/12(火) 06:45:111文字目が既にNULLだったらどうすんだ
while (*p) p++;
0945デフォルトの名無しさん
2008/08/12(火) 07:16:51おまえらが言ってるのはEOSだ
0946デフォルトの名無しさん
2008/08/12(火) 07:36:24NUL じゃないのでしょうか?いや、'\0' ではいけないでしょうか?
0947デフォルトの名無しさん
2008/08/12(火) 08:10:480948デフォルトの名無しさん
2008/08/12(火) 08:24:160949デフォルトの名無しさん
2008/08/12(火) 08:25:210950934
2008/08/12(火) 09:52:110951デフォルトの名無しさん
2008/08/12(火) 09:55:26123 + 45 + 67 = 1234567 って事?
0953デフォルトの名無しさん
2008/08/12(火) 10:14:56#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;
}
こういうの?
0954デフォルトの名無しさん
2008/08/12(火) 11:09:00unsigned 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;
}
こういうことじゃね?
0955デフォルトの名無しさん
2008/08/12(火) 11:11:030956デフォルトの名無しさん
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();
}
です。
よろしくお願いします。
0957デフォルトの名無しさん
2008/08/12(火) 11:44:270958デフォルトの名無しさん
2008/08/12(火) 11:54:08私宛でしょうか?
最初はファイルのEOFというのはファイルに付加される文字コードなのでコマンドラインからは入力できないのかと思いましたが、
調べているとコマンドラインからEOFとなるデータを入力できると書いていました。(それがCtrl+Zだった訳なんですが)
ですが、自分の環境ではそれを行ってもループを抜けないので、どなたか解る方がいたら知恵を貸していただきたいなと思った訳です。
0959デフォルトの名無しさん
2008/08/12(火) 11:57:39EOFっていう制御コードはないよ
http://e-words.jp/p/r-ascii.html
これはアスキーコードだけど赤文字になってるのが制御コードと呼ばれる物
文字としては割り当てがなく、エディタなんかで改行コードなんかは独自に表示してたりする。
0960デフォルトの名無しさん
2008/08/12(火) 12:09:29コマンドプロンプトの仕様だから仕方ない
linuxのターミナルでやればctrl+Dは表示されない
0961デフォルトの名無しさん
2008/08/12(火) 12:12:22ループを抜けるには
>abcd[enter]
>Ctrl+Z[Enter]
のように単独で入力
0962デフォルトの名無しさん
2008/08/12(火) 12:26:02>>959
なるほど・・・
サイトを見ている限り、用語の説明として
「ファイルの終端を示す特殊な記号」とか
お茶を濁したような表現から何から色々あって、よくわからないんですよね・・・
ここで言われる「ファイルの終わりを示す制御コード」というのは>>959さんの言う制御コードと違うんでしょうか?
「文字コード」の中にはEOFという制御コードが無いって意味ですよね?
つまり、コマンドラインから入力出切るのは「文字コード」だからEOFを表現出来なくて当然、という認識であってるでしょうか?
ごめんなさい、自分でも理解が低くて、言いたい事が上手く伝えられて無いかもです;;
ありがとうございました。
>>960
なるほど、環境によっても変わってくるんですね・・・
K&Rで勉強するならUNIXライクな環境の方がいいのかなぁ・・・
ありがとうございました。
>>961
単独入力で出来ました!!!!
あ〜とてもスッキリしました〜。
ありがとうございます!
0963デフォルトの名無しさん
2008/08/12(火) 12:29:59"cygwin" で調べてみてください。わたしはこの上で宿題をといています。
0964デフォルトの名無しさん
2008/08/12(火) 12:34:52EOFっていうのはファイルアクセス関数が便宜上ファイル終端になったというのを
通知するためのリターンコードの一種であるだけど思っています。
ポインターの中身が割り当てられてないもしくはポインターを返す関数が
不正終了した際はNULLを返すように。
普段、中の数字は何か意識をあまりしませんが(ポインターの場合は0かな?)
実際なんでもいいのでプレーンなテキストを用意し、秀丸なんかで開くと
EOF表示がありますが、バイナリーエディタで開くとコードは何もありません。
基本的には便宜上のものです。
0965デフォルトの名無しさん
2008/08/12(火) 12:50:33Win上でUNIXぽく作業できるんですね!
使って見ます。ありがとうございました。
>>964
なるほど、テキストを扱う物なのに最初からコマンドラインでイジろうとするのが間違ってますよね。
そっちを勉強して認識を深めたいと思います。
ありがとうございました。
0966デフォルトの名無しさん
2008/08/12(火) 13:30:07テキストじゃなくてファイルストリーム
0967デフォルトの名無しさん
2008/08/12(火) 13:52:07多分、ストリームまったく理解してないです。
保存してあるデータを一繋ぎ(ストリーム)にして、作業できるようにするんですよね?
とりあえず、ファイル入出力関数を勉強してから出直してきます!
ありがとうございました。
0968デフォルトの名無しさん
2008/08/12(火) 14:02:36fopen(), fclose(), fprintf(), fscanf() の系統と、
open(), close(), read(), write() の系統があることに留意してください。
そして、両者の関係については、K&R2 8.5 をみていただければいいかと思います。
0969デフォルトの名無しさん
2008/08/12(火) 14:35:18具体的なアドバイスありがとうございます!
参考にさせてもらいます!
0970デフォルトの名無しさん
2008/08/12(火) 15:20:32ポインタをずらして、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]の値をポインタもとに
*で中身を参照したい。
}
作りがマズイですか?
0971デフォルトの名無しさん
2008/08/12(火) 15:24:46char型のポインターにいきなり文字列いれてもなあ。
char data[128] = "filename";
とか入れておいて
infT.Fname = data;
とかでないと無理よ
0972デフォルトの名無しさん
2008/08/12(火) 15:25:401.領域を確保していない
2.型を勘違いしている
何をどうしたいのか分からない
0973970
2008/08/12(火) 15:30:59すみません。スレも残り少ないので.....
strcpy()とかしてます。
次スレあるか探して、数スレになるかもだけど、再度書きます。
0974デフォルトの名無しさん
2008/08/12(火) 15:48:58そんなにすぐに使い切らないからw
それにソースが長いけど公開できるなら宿題スレのロダにでもあげて
リンクだけここにはりなよw
C/C++の宿題を片付けます 115代目
http://pc11.2ch.net/test/read.cgi/tech/1217741118/1-10
0975970
2008/08/12(火) 15:56:46ポインタをずらして、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];
}
0976970
2008/08/12(火) 15:57:38/* ファイル名を格納 */
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でファイル名が得られるようにしたい
作りがマズイですか?
0977デフォルトの名無しさん
2008/08/12(火) 16:00:20{
int n;
char *Fname[Fmax];
int flg[Fmax];
}
struct Tbl
{
char *cname[50];
InfoTable *infT[50];
}
まず質問
この構造体の中でアスタリスク(*)ついてるのはポインターであって
文字や構造体そのものの配列ではないんだけどOKなの?
0978デフォルトの名無しさん
2008/08/12(火) 16:00:520979デフォルトの名無しさん
2008/08/12(火) 16:04:16ネーミングが駄目
0980デフォルトの名無しさん
2008/08/12(火) 16:08:080981デフォルトの名無しさん
2008/08/12(火) 16:11:29やるな。お前。センスあるぜ。
0982970
2008/08/12(火) 16:14:45あれ、本当だ、nameです。
>>981
照れます。
>>977
はい。
ポインタを各配列にいれて、順に、その配列に入っている先のポインタを
参照してファイル名を取得したいです。
cname[0],cname[1]......
Fname[0],Fname[1].....
には、ポインタを格納するでOKです。
0983デフォルトの名無しさん
2008/08/12(火) 16:19:17↑
これがなんなのか良く考えろ
table.cnameはポインタの配列で
table.cname[c]はポインタだろ?
0984デフォルトの名無しさん
2008/08/12(火) 16:20:330985970
2008/08/12(火) 16:26:48printf("cname[%d] %s",c , *table.cname[c]);
printf("Fname[%d] %s",c, *table.intT.Fname[c]);
/* pB */
でOKですか?
表示させるために、pBを書いたけど、実際問題として、意図どおりのものは
既に格納されていると考えて良いですか?
0986デフォルトの名無しさん
2008/08/12(火) 16:28:24○文字へのポインタを与えるべきところに文字を与えている
0987デフォルトの名無しさん
2008/08/12(火) 16:29:18次スレよろ
0988デフォルトの名無しさん
2008/08/12(火) 16:31:04教科書読み直せ
0990デフォルトの名無しさん
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++)
これもひどい。
コンパイルも出来ないようなコードで質問されても直しようがない。
0991デフォルトの名無しさん
2008/08/12(火) 16:31:520992デフォルトの名無しさん
2008/08/12(火) 16:32:32上を全然読んでないけどとりあえず
*table.cname[c] は文字列ではない
0993デフォルトの名無しさん
2008/08/12(火) 16:33:330994デフォルトの名無しさん
2008/08/12(火) 16:34:080995デフォルトの名無しさん
2008/08/12(火) 16:34:390996970
2008/08/12(火) 16:38:17抜粋してるので、不足分はありますが、通りますよ。
と、実際にコンパイル通っているのとは、違うかも。
スマン!皆さん!!
>>993
HWって?
0997デフォルトの名無しさん
2008/08/12(火) 16:39:290998デフォルトの名無しさん
2008/08/12(火) 16:53:11getFikenamaeだろう
0999デフォルトの名無しさん
2008/08/12(火) 16:53:361000デフォルトの名無しさん
2008/08/12(火) 16:54:1410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。