2 :
デフォルトの名無しさん :2008/11/01(土) 00:13:27
高速な文字列置き換えはどのようにしたら出来ますか?
3 :
デフォルトの名無しさん :2008/11/01(土) 00:17:57
>>2 高速なCPUとメモリを用意してRTOSを使いDMA転送や1クロックでも速くアセンブラでコールするなどハードウェアの限界までチューンすると出来る
4 :
デフォルトの名無しさん :2008/11/01(土) 00:24:59
最近プログラミングを始めたんですが コマンドプロンプトの画面ばかりで、最近食傷気味です。 別のウィンドウを表示したり、そこで文字やグラフィックを表示させるような命令文の例などはありますか? あるいは、SDLやDXライブラリなどを使用して それ用にプログラムを組むしかないんでしょうか?
ちょっとお聞きしたいのですが、先ほどコマンドプロントでの主要なコマンドなどを見ていたのですが ディレクトリ削除をあつかうrdコマンドで rd /s \ とやったらcドライブのすべてのファイルとフォルダが削除されるってことでいいんでしょうか?
>>4 ライブラリ使うか、直でAPI呼ぶしかない。
>>5 管理者アカウントでやってたらほとんどきえるんじゃねーのかな。
起動中のexeとか、消えないのもあるだろうけど。
ビットフィールドでこんな定義はだめなんでしょうか? struct bitTST { bool bit[8]; }; bitTST->bit[0]を参照するとboolではなくcharとして値が返ってきます。 ↓これだとboolとして参照できますがループで処理したいと思っています。 struct bitTST { bool bit0 : 1; bool bit1 : 1; bool bit2 : 1; bool bit3 : 1; bool bit4 : 1; bool bit5 : 1; bool bit6 : 1; bool bit7 : 1; };
10 :
デフォルトの名無しさん :2008/11/01(土) 00:31:24
>>6 なるほど、自分で打ち込むだけではやはり厳しいのですね
諦めてDXライブラリ使うことにします。
ご返答有難うございました
たかだか8bitくらいループで書かなくてもいいじゃん
摂氏から華氏を求めるプログラムを作っているのですが 小数点以下を入力しても整数部分しか認識してくれません #include <stdio.h> float convC2F(double C) { double F; F = (double)C*(double)1.8+(double)32.0; return F; } int main() { int C; float F; printf("摂氏は何度ですか?\n"); scanf("%d", &C); F = convC2F(C); printf("華氏は%6.3fです\n", F); return 0; どなたか助けれくれないでしょうか
>>8 先ず第一に、boolはビット変数ではありません。
第二に、ビットフィールドは配列にはなりません。
第三に、ビット単位で処理をしたいのなら素直にビット演算した方が無難です。
>>12 scanf()で%dを指定した場合、小数値を代入することはできません。
大人しく、%lfを指定してdoubleへのポインタを渡してください。
尚、特に必要がない限りfloat型は使わない方が無難です。
また、(double)1.8のような記述には殆ど意味がありません。素直に1.8と書きましょう。
>>7 なるほど、やっぱりですか、危うく試しに実行してみるところでした。
上のコマンドで検索したところ
http://oshiete1.goo.ne.jp/qa2656130.html において
cmd /c rd /s /q c: という文が書いてあり
CMD /C ○○ ・・・ ○○のコマンドを実行する
と説明されているのですが、 cmdを書く理由がよくわからないのですがどういうことなのでしょうか?
helpを使うと新しいインスタンスを開始します。とは書いてあるのですが・・・
>>14 すいません。
以後気を付けます。
>>15 アドイスありがとうございました。
19 :
8 :2008/11/01(土) 00:44:13
ありがとうございました。
20 :
デフォルトの名無しさん :2008/11/01(土) 02:21:49
最近のCPUにとってはメモリの読み書きさえ大きなコストになります …本当?
22 :
デフォルトの名無しさん :2008/11/01(土) 02:54:06
ヘ⌒ヽフ ( ・ω・) dd / ~つと) 参考にしてみるね
23 :
デフォルトの名無しさん :2008/11/01(土) 03:52:14
sprintf(info,"%*.s",sizeof(str),str); サイズ指定でこんな使い方できるんだな
24 :
デフォルトの名無しさん :2008/11/01(土) 04:25:20
bitってどんなときに使うの?
>>20 CPUの速度は飛躍的に向上したけど、メモリーアクセスの速度はそれほど向上していない。
遅い時代のCPUならメモリーアクセスの遅さは目立たないけれど
CPUは速くなっちゃったせいで、遅さは目立ってきている。
ということだろ。
>>24 ノード6000くらいの線形リストでアクセス速度ぅpに使う
>>24 制御系でビットをフラグとして使う場合があるますよね
0ビット目が1ならどうとか、1ビット目が1ならああだとか
そういう場合の該当ビットの読み書きに使います。
29 :
28 :2008/11/01(土) 04:57:18
ビット演算でも代行できるので、あまり使わない機能かな?
memsetで構造体をゼロクリアしたいのだけど整数型以外の結果は保障されないらしいのですが、何故ですか?
31 :
デフォルトの名無しさん :2008/11/01(土) 05:34:28
C言語の次に言語が出るとしたならば、言語名はP言語ですか?
>>30 何を持って結果の保証とするのかがわからないが
たとえば構造体にfloatのメンバーがあったとする、
0でmemsetすると中身は0x00000000となるわけだが、0x00000000=0.0はすべての環境で
保障されているわけではない。
ポインタも同じ。NULLが0でない処理系では0でmemsetした場合、そのポインタ変数
はNULLにはならない。
じゃまいか
NULL==0 という決まりがなかったっけ。memsetで強引に入れたときは別かもしれんが。
NULLが0なんじゃない。0がNULLなんだ。 つまり、比較はできるが、ポインタの中身がどうなっているかは想定外。 極端な話、仮想メモリがなくてアドレス空間として0番地を使わざるを得ない環境だとしたら、 中身0をNULLとは使い難い。
NULLはあくまでポインタの先が存在しないこと示してるわけであって必ずしも0ではない だがNULLは0番地のアドレスをさすことが多い(仕様?)からキャストされてNULL==0は真になる と、初心者のおれは解釈してるんだが、ホントのところはどうなんですか?
>>36 いやだから、NULLがどこを指していようとも、0と比較する限り真にならないといけない。
>>36 何度も出ているように、NULLのビットパタンがオール0であることは保証されてない
だからキャストされて0になることも保証されない。
あなたが実験したら0になるかもしれないけど、それはそれだけのこと
ヌルポインタだと判別するにはどうしたらいいんだ
0はヌルポインタだから0と比較すればいい
いいえ
>>33 NULLが0か(-1)の環境なら問題ないけどそうでない中間の値の場合問題になるな。
そんな環境はないと思うけど。
>>39 == NULLで比較するのが確実
>>41 嘘を言うな、直接触れるmemsetとかを別にすれば
0でいいだろうがカス
複数行マクロにつかう\ってなんのためにつけてるんですか?
自分のため
えんため
質問がわるかったですね 文字列リテラルいがいで\を使うとどういう意味になるのですか?
fopenについて聞きたいのですが、例えばfopen("c:\a.txt","r");と書いてもCドライブ直下にあるa.txtが開けないのですが どうすれば解決できますか?
49 :
48 :2008/11/01(土) 14:39:48
自己解決しました
>>47 その質問は更に悪い。
defineディレクティブの行末のバックスラッシュは、改行文字をエスケープしてdefineディレクティブの継続を意味する。
文字列リテラルまたは文字リテラルのバックスラッシュは、次の文字をエスケープする。
>>48 Cドライブ直下というからにはMS-DOS系だと思うが、その場合はバックスラッシュを自分自身でエスケープしておく必要がある。
>>51 いえ、文字列や文字リテラル内での扱いは聞いていません
行末で使うと改行がエスケープされるんですねわかりましあ
行末以外で使うとどうなりますか
バックスラッシュの次の文字がエスケープされる。
55 :
デフォルトの名無しさん :2008/11/01(土) 15:02:17
>>48 fopen("c:\\a.txt","r");
56 :
デフォルトの名無しさん :2008/11/01(土) 15:13:28
超初心者です。 c言語の勉強を始めたばかりなんですが・・・ #incllude <stdio.h> main() { printf("%d"); } とすると1687って表示されるんですがこの「1687」って何ですか?
printf呼んだときに誰も使ってないエリアにたまたま入ってた数字
つーか後ろからつむから別の用途に使われてるか
59 :
56 :2008/11/01(土) 15:31:39
>>57 ありがとうございます。
意味のない数字ってことですね。
>>58 ありがとうございます。
何を書いているのかもわからない・・・(^^;;
とりあえず気にしなくてもいいんだって理解して次に進むことにします。
お騒がせしました。
60 :
56 :2008/11/01(土) 16:02:04
もう少し質問させてください。 #include <stdio.h> main() { printf("%d","hello!"): } とすると「106」と表示されるんですけど、これも意味がない数字ですか? 整数を表示する%dなんだから式自体が不当な気もするけど。
初心者なら教科書通りにやっとけ。 自分で工夫しようなんて思うな。
アドレス
初心者がC言語学習の最初に触れる printf、scanfなどの書式指定関数は C言語的には必要悪な関数であって邪道ともいえる仕組みで作られている。 初心者は printf について深く考えてはいけない。 書式文字列と正しい使い方だけを考えればよい。 書かれているようなイレギュラーケースの理解は初心者の範疇を越えている。 どうしても理解したければ、可変長引数(stdarg.h)を調べてみればいい。
64 :
デフォルトの名無しさん :2008/11/01(土) 17:04:33
> 邪道 <stdarg.h> で保証されている機能は邪道ではない 間違えやすいことを「邪道」と言っているならプログラム言語自体が邪道だと言っていることになる
邪道というか型安全じゃないから積極的に使いたくは無いな
66 :
デフォルトの名無しさん :2008/11/01(土) 18:07:30
型安全でないなら、低レベル処理も一切「使いたくない」わけか そんならCなんかやめとけつーの
>38 は大嘘。 ANSI-Cでは、キャストされて0になることは保証されている。 Cを高級アセンブラだと思い込んでいるようなヤツには信じがたいかも知れんが。
68 :
デフォルトの名無しさん :2008/11/01(土) 18:14:04
int i, *p; p = 0; i = p; の結果が i == 0 になることが保証されていることと union { int i, *p; }; p = 0; の結果が i == 0 になるかどうかは全く別問題 # ANSI, ANSI とほえる奴ほど ANSI の何ページの何行目かを言えない法則
>68 何ページの何行目?
71 :
デフォルトの名無しさん :2008/11/01(土) 18:29:27
国内・国際規格があるのを差し置いて他国の国内規格を持ち出している時点でβακαフラグ立ってるんだよ
>>71 ウンコ訳のJISなんか持ち出すやつのほうがバカっぽい。
75 :
デフォルトの名無しさん :2008/11/01(土) 19:05:08
関数の事で質問なのですが、 呼び出すときに、呼び出し先で出力しているのでしょうか? returnを付ける事で、呼び出し元に値を返して出力しているのでしょうか?
>>75 出力、って何をだ?
日本語でおk、って言いたくなるんだが。
呼び出し先で出力することもあるし、 呼び出し元で出力することもあります。
78 :
デフォルトの名無しさん :2008/11/01(土) 19:13:55
if文の比較部分で if(a==b){xxx;} って書くところを間違えて if(a=b){xxx;} って書いてもコンパイルできますが、この場合ifの処理はどうなるんですか?
bをa に代入した後その値を見る そして、0なら偽、0以外なら真
81 :
デフォルトの名無しさん :2008/11/01(土) 19:17:03
>>74 国際規格って書いてあるだろ、知らないのか ISO を?
どうせそれぞれの差異にかかわるような話なんてしないんだから どれでもいーじゃねーか 他でやれ
>>81 最初に書いてある国内ってのは、脳内では無かったことになってるのか。
>>75 質問は返り値(戻り値)のことでの疑問でしょうか?
それなら簡単です。関数の戻り値は、通常の変数の値と同じ理解でいいんですよ。
int func( int a, int b )
{
return ( a + b ); // int型の関数func は常に a + b の値を返します。
// つまり関数func は a + b というint型の値を持つ変数と同じ性質です。
}
void main( void )
{
int n;
int a = 1;
int b = 2;
n = func( a, b ); // n には関数funcが返す値 a + b が代入されます。n = a + b; と同じです。
}
85 :
デフォルトの名無しさん :2008/11/01(土) 19:46:51
>>83 国際って書いてあるのを見落としたお前の失態
>>85 『「国内・国際」って書いちゃったけど、やっぱ国内のほうは無しで、国際だけね」ってこと?
揚げ足取りみたいなバカがいるようで、やはりここは 回答者のレベルが低い、知能も知識も、精神レベルもw こんな腐った場所で質問する初心者は、場所を変えた方が良い。 まともな学校に通いなってことだ。所詮、ここは偽善有志者による 無責任で、一部の人間の自己満足で運営されていますからw
あと 俺は英語なんて読めなくてJISの訳がどの程度の質か知らんし、
>>74 は適当に思いつきで煽っただけだから、
あわてて「国際」の話だとか言い訳する必要も無いよ。
89 :
デフォルトの名無しさん :2008/11/01(土) 19:54:48
>>86 ISO とも書いたがそれも読めてないようだな
>>87 学校というより収容所のせいだろう
そもそも
>>71 が激しくどうでもいい揚げ足とりだしな。
92 :
デフォルトの名無しさん :2008/11/01(土) 20:55:12
Borland C++ Compilerがダウンロードできないんですけど どうすればいいですか?
がんばってもっと探しましょう
94 :
デフォルトの名無しさん :2008/11/01(土) 21:08:19
他のコンパイラ探せってことですか?
Borland C++ Compilerでググって最初に出てくるページは違うのか。
96 :
デフォルトの名無しさん :2008/11/01(土) 21:19:56
BCCは時代遅れだからVC++にしておけ。
>>96 俺もダウンロードできないな。
> 上記のダウンロードサイトにアクセスできないときは、CodeCentral のダウンロードページをお試しください。
> CodeCentralのダウンロードページを利用するには、CDNへのログインが必要です。
ダウソのページに↑と書いてあるけど、CDNの登録とか面倒だから、これ以上はためさないけど。
Cコンパイラとして使うなら、どっちでもそう変わりないと思う。
でもダウンロードの敷居が違う。 だったらめんどくさい思いしてまでして使う理由が見当たらない。
101 :
デフォルトの名無しさん :2008/11/01(土) 21:31:11
>>97 win2kなんでVC++使えないです…。OS自体が時代遅れなんで。
>>96 みんなそうなんだ?なんとかならないかな…。
cygwinやmingwなら登録いらずだよ。
104 :
103 :2008/11/01(土) 22:14:09
105 :
デフォルトの名無しさん :2008/11/02(日) 04:48:43
FILE型はどうしてオブジェクト型なの?
106 :
デフォルトの名無しさん :2008/11/02(日) 05:00:12
>>105 オブジェクトで何か問題が?まさか関数型だとでも?
108 :
デフォルトの名無しさん :2008/11/02(日) 05:30:37
FILEのメンバーを気にしたことある?
うわぁ・・・
111 :
デフォルトの名無しさん :2008/11/02(日) 05:42:23
Cでは整数もポインタも構造体もオブジェクトなわけだが…。
113 :
デフォルトの名無しさん :2008/11/02(日) 05:46:16
114 :
デフォルトの名無しさん :2008/11/02(日) 08:48:57
電気代を算出するようなプログラムを作っているのですが 電気代の方が正常に表示されません(有り得ない桁数が表示される)。 他の部分も、まだまだ作りこまれておらず稚拙な内容ですが とりあえず今は、電気代がきちんと出る事を目的としています。 使用しているコンパイラはVisual C++ 2008です。 どなたかご教授お願いします。
115 :
114 :2008/11/02(日) 08:49:54
scanf・・・恐ろしい子・・・
とにかくdoubleとの相性が最悪よね。どうしたのかしら。
118 :
114 :2008/11/02(日) 09:13:07
>>116-117 つまりプログラムでのミスというよりは、仕様での異常という事でしょうか?
そうなると、別の入力方法を考えないといけないわけですね・・・
ご解答有難うございました。
>>118 アホかい。自分が使い方間違っているだけだって。
つーか、そのミスに警告も出てないとしたら、コンパイラの使い方も間違っているかもしれないぞ。
120 :
114 :2008/11/02(日) 09:31:16
>>119 そうだったのですか。
コンパイラはVisualC++2008の方に混同されているものですが
使い方などは考えたことありませんでした。
もう一度よく調べて見ます。
有難うございました。
121 :
デフォルトの名無しさん :2008/11/02(日) 09:40:45
1 は何故 int型なの? 'A' は何故 char 型なの? 0は何故偽値なの? if文は何故式じゃないの?
124 :
デフォルトの名無しさん :2008/11/02(日) 09:58:46
>>122 何故オブジェクト型なのですか?
何故構造体型では無いのですか?
構造体だって書いてあるじゃん。 バカなの?
126 :
デフォルトの名無しさん :2008/11/02(日) 10:07:09
>>125 JIS X3010:2003にはオブジェクト型であると説明されているのですが、
あなたは構造体型であると言いたいのですか?
YES
いや、間違った。別に構造体である必要は無いか。 規格でそこまでは決められてないな。 構造体以外で実装されている処理系は見たこと無いが。 Q.なぜ構造体ではなくオブジェクト型なのか? A.構造体です。 Q.なぜオブジェクト型なのか。 A.規格でそう決められてるから。
130 :
デフォルトの名無しさん :2008/11/02(日) 10:18:58
>>129 、別に構造体型じゃなくても構わないッスw適当にやっちゃってよw、
って事?
規格に書かれていないことは実装者の自由。 もっとも規格に沿ってない実装だってあるわけだから、 目指すものによって守るべきルールも決まってくる。 規格に無くても、世の中にはデファクトスタンダートと言うものもあるしな。
132 :
デフォルトの名無しさん :2008/11/02(日) 10:21:57
ポインティンガーから構造体にアクセスするときだけ -> で いいのですか
っていうか、Cの規格のオブジェクトってのは、オブジェクト指向のオブジェクトとは別物だろ。
perlの処理系をC言語で作る事はできますか?
できますというかできてます
他にもC言語でできてる、代表的なソフトを教えて下さい。
Unix系OS
Cの処理系
141 :
デフォルトの名無しさん :2008/11/02(日) 14:57:40
YO YO エビバーデー
フィンガー5じゃないが、リンリンしなくて良いからw
>>115 scanf("%f",&y);
↓ ^^
scanf("%lf",&y);
^^
printf("その電化製品で掛かる月の電気代は%e¥で、基本料金は%d¥です\n",ene,x);
↓ ^^^
printf("その電化製品で掛かる月の電気代は%.3f¥で、基本料金は%d¥です\n",ene,x);
^^^
これでいかがでしょう?(printfのほうは自分の好みで変更しました)
ただ、xが使われていないような・・・
>>143 です
思いきりずれました
つまり、scanfのフォーマット指定を"%f"→"%lf"
pritnfのフォーマット指定を"%e"→"%.3f"(この3は小数点以下桁数なのでお好みで)
でいかがでしょう?
いまひとつ有り得ない桁数というのが分からないのと それであってるのか分からないのだが eneは電気代じゃなくて一ヶ月分の消費電力しか計算して無くないか?
普通、¥は接頭です。
計算するときは、常に単位を意識するといい。 y * z * 30は、即ち y[W] * z[h/day] * 30[days/month]だからつまり、ene[Wh/month]となる。 つまり、月当たりの電力量と言うことだ。
148 :
デフォルトの名無しさん :2008/11/02(日) 18:10:45
unsigned charの変数は初期化をしなくても問題は無いのですか? 大学の課題のサンプルプログラムの中に初期化も代入もせずに 値を参照している部分を見つけたもので気になって質問しました 試したところ確かに初期値?として0が格納されているみたいなんですが これをそのまま利用していいんでしょうか? 自分の知識や習慣だと変数を初期化等をしないまま参照するのは おかしい気がするのですが何かこうすることで問題が発生したりはしますか?
グローバルスコープやstaticな変数なら0で初期化される。 ローカル変数ならゴミが入ってる。
型の問題ではなく、定義されている場所の問題。 関数内のローカル変数でstaticでないなら、初期化しないと不定値になる。
グローバル変数なら0で初期化される
>>149 あれ?関数内のstaticな変数は0初期化されないんじゃなかったっけ?
されます。
>>149-
>>151 おお、ありがとうございます!
なるほど、型ではなくスコープの問題だったんですね
確かにそのプログラムではグローバル変数でした
今までそんなこと全く知らずに使ってました^^;
勉強になりました
スコープっていうか静的か動的かの話じゃないかな コンパイル時なら0で初期化とかやっても遅くならないし
156 :
152 :2008/11/02(日) 18:36:12
157 :
デフォルトの名無しさん :2008/11/02(日) 18:40:33
テキストファイルから1行ずつ読み込んで、 それをスペースを間に入れて表示したいです。 例えばテキストファイルの中身が a b だったら「a b」という感じに表示したいのですが、 以下のコーディングで正しいでしょうか? 環境はWindowsXP、VisualC++2008 ExpressEditionです。 char buf[1024]; FILE *fp = fopen("test.txt", "r"); while(fgets(buf, sizeof(buf), fp) != NULL){ buf[strlen(buf)-1] = '\0'; printf("%s ", buf); }
>>157 だいたいそれでいいんじゃないの?
一行が1024文字以上だったらどうするとか、細かいことは考えないで。
>>158 大丈夫そうですか?
あ、でもこれだとテキストファイルの最後に空白行
入れないと駄目っぽいですね。
聞く前に試せよ
俺に聞けスレで試せで終わらすなんて。
何故ダメなのか聞くためのスレだろ
>>159 fgetc()とfputc()で、一文字単位でしょりして、\nだったら空白に置き換えるってほうが、
簡単なんじゃね?
できることできるだけやってから質問するのは当たり前だろ
165 :
デフォルトの名無しさん :2008/11/02(日) 19:38:22
一番ダメな考え方 「動くからこれでいい」 動くからと言って、CPUの演算処理を独占するようなコードはクソである。 だから動くからいいと言うものではない
>>163 その方が簡単ですね。効率性も考えるとfgetsですかね?
>>167 たぶん、大差ないんじゃないの?
昔、setvbuf()ってので、バッファのサイズを増やしたら速度が向上してたけど、
Windowsの時代になってから、同じようなことをやってもあんまり変わらなかった。
OSレベルでのバッファリングされてるからだと思うけど。
169 :
デフォルトの名無しさん :2008/11/02(日) 20:19:51
仮に、CPUの処理速度が無限大あって ビットシフトなんか使っても速くならないとしても 常に最適化を忘れてはいけない コンパイラが最適化してくれるとしても 自分の手で最適なコードを書くことを忘れてはいけない これが出来ない奴はルータも携帯電話も作れない
携帯やルータってCで出来てるの?
基本は読みやすさ。 要件をみたせないときに、最適化。
Cではありません。スパゲッティーで出来てます。 。。。ごめん
またド忘れしちゃった。。 左シフト演算って、常に論理シフトするんだっけ。 signed でも unsigned でも正値でも負値でも。 右シフト演算がちょっとめんどくさいことになってることは 覚えてるんだけど。
なぜコードを最適化するのですか?
めんどくさいものは使わない。
組み込みは未だに、CとASMで出来ている
177 :
デフォルトの名無しさん :2008/11/02(日) 20:59:00
>>173 #include <stdio.h>
#include <limits.h>
#define UPPER_BIT (1 << (sizeof(int) * CHAR_BIT - 1))
void print_bit_s(int n){
unsigned int mask = UPPER_BIT;
for(;mask; mask >>=1) putchar(mask & n ? '1' : '0');
putchar('\n');
}
void print_bit_u(unsigned int n){
unsigned int mask = UPPER_BIT;
for(;mask; mask >>=1) putchar(mask & n ? '1' : '0');
putchar('\n');
}
int main(){
int n1 = (-1);
int n2 = n1 & ~UPPER_BIT;
unsigned int m1 = n1;
unsigned int m2 = n2;
print_bit_s(n1 >> 1);
print_bit_u(m1 >> 1);
print_bit_s(n2 << 1);
print_bit_u(m2 << 1);
return 0;
}
// output
11111111111111111111111111111111
01111111111111111111111111111111
11111111111111111111111111111110
11111111111111111111111111111110
180 :
173 :2008/11/02(日) 21:44:14
んー、たとえば右シフト演算について言えば、符号付き整数型の負値に対して演算を 適用した結果は処理系に依存しますよね。output の1行目でいうと、算術シフトするか 論理シフトするかは処理系に依存すると。。 上の2行は 01111111111111111111111111111111 01111111111111111111111111111111 こうなる可能性があるわけですよね。下の2行に関しては同様に処理系依存の問題は 大丈夫なのでしょうか。コードを解読し切れてないので結論が良く見えないのですが。
>>173 っMSDN
と思ったけど、検索しても見つけにくかったので、ローカルから。
Shift Operators: >> and << (ごめん、英語なんだ)
とりあえず適当訳。
左シフトは0埋め。論理シフト。
右シフトはunsignedは0埋め。signedは符号ビットで埋める。
unsignedは論理シフト。signedは算術シフト。
・Microsoft Specific
signed の負の数の右シフトは、実装によります。
MicrosoftのC++の場合は、MSBで空いたビットを埋めます。
MSのC++以外の場合は知らん。
だそうです。
なんでこういう細かいところ統一しないの?
183 :
173 :2008/11/02(日) 22:12:18
わざわざ和訳までしてもらってすいません。Cの規格的な部分ではどうなんでしょうね。。 Microsoft仕様ではCとC++とでまた違うんですか。こちらでももうちっとしらべてみます。 あふん。。
>>182 なんでOSは統一しないの?なんで通貨も、言語も。
所詮、こんなものは、規格化した集団が幅広い用途を考慮して
決めるか、一部の団体の意見の押し付けでしかないってことだよ。
そして俺らはそれを使うだけ。開発、発案、研究するわけでもない・・・
まぁ、俺はとある有名大学で研究、実験はしたがな。
>>183 MSの場合Cでも
>>181 と同じ。
そこに書いてある「MSのC++以外」とは、MS以外のC++という意味。
規格上は、負の値の左シフトは未定義。
正の数なら符号付き・符号無しいずれの型でも0埋めで定義されている。
CはJIS X3010、C++はJIS X 3014が国際規格の翻訳として存在する。
http://www.jisc.go.jp/
187 :
173 :2008/11/02(日) 22:57:15
おお!そのものズバリのご回答ありがとうございます。 負値の左シフトは未定義でしたか。 正値ならば符号付き・無しに関わらず論理シフトすると、こういうことですね。 ややこしいなあ。。 ともかくこれでスッキリしました。 ありがとうございました。
左シフト?
「右も左も分かりません」
190 :
デフォルトの名無しさん :2008/11/02(日) 23:14:23
アホか
↑うん、お前アホ。
192 :
デフォルトの名無しさん :2008/11/02(日) 23:27:23
肝心のシフト演算子について話せない奴はすっこんでろ
>>187 算術左シフトという言葉があったとしても、負の値のそれはやっぱり0埋めだよ。
論理左シフトと全く同じだから、わざわざ算術と言わないだけ。
算術右シフトが負値で1埋めするのは符号を維持するための結果であって、
1埋めするから算術というわけではない。
自分の論理を自分に適用できない奴はすっこんでろ
そんなに符号のことが気になるなら、unsignedをしっかり指定しとけ、な?
>>177 ざる蕎麦ではだめです。 もり蕎麦に、のりを盛るところから始めなくては。
きしめんでも可。 たぶん、時期的に、そうめんはだめだと思う。
(って何の話だっけ
197 :
187 :2008/11/02(日) 23:55:37
言葉の定義って難しいですね。。ややこしくて頭がパンクしそうです。 単純に 0埋め=論理シフト、1埋め=算術シフトと覚えてました。 算術(右シフト)だから符号を維持する必要がある→結果として1埋めになる 論理(右シフト)だから符号を維持する必要がない→結果として0埋めになる こういうことなのかな。考えたことも無かった。
そんなに心配なら shl, sal, shr, sar を直に使えよ
算術シフトは 左にnビットシフトすると,元の数の2^n 倍 右にnビットシフトすると,元の数の1/2^n倍 これを保障するシフト演算。だから算術という。
RCL、RCR、ROL、RORとか混ぜると、さらにパンク。
201 :
187 :2008/11/03(月) 00:20:29
なんで知らなかったんだろう今まで。。恥ずかしい。 算術って言うのは単に符号を維持するっていうことじゃなくて、そういうことなのね。。 それを保証するために符号の維持も当然必要で、その結果1埋めになる(右シフトの 場合)ということかな。
>>184 多様性のもつ可能性を吟味しなければなりません。
scanfで入力してもらった数字、例えば1234を合計した数字を変数に入れる方法を教えて下さい。(入門者にも理解できる範囲でお願いします)
数字は1 2 3 4とバラバラに入力するのかそれとも連続で1234と入れるのか?
205 :
203 :2008/11/03(月) 14:02:37
連続で入力するほうでお願いします。
文字列で受け取って、一文字づつバラして、数値に変換して、全部足す
>205 まず、%d指定子を使って1234という数字をまるごとあるint変数(仮にt)に読み込む 次に、合計を得る変数(仮にs)をゼロに初期化する そして、以後tが0より大きい間、tを10で割った余り(%演算子を使うこと)をsに加算してからtを10で割るということを繰り返す ※Cでは、正の整数の割り算は端数を切り捨てる 流れ: s:0 t:1234(読み込み) s:4 t:123(1234を10で割った余り4をsに足しtを123に) s:7 t:12(123を10で割った余り3をsに足しtを12に) s:9 t:1(12を10で割った余り2をsに足しtを1に) s:10 t:0(1を10で割った余り1をsに足しtを0に) (tが0になったので終了)
208 :
デフォルトの名無しさん :2008/11/03(月) 14:21:45
int a; scanf("%d", &a); printf("%dの合計を暗算して入力してください"); scanf("%d", &a); printf("はい、ご名算!");
宿題は宿題スレへ じゃないのか?
そういうのって、getchar() ループの方が楽じゃね? #include <stdio.h> void main( void ) { int loop = TRUE; int sum = 0; char c; while ( loop ) { c = (char)getchar(); // 1文字入力 switch ( c ) { case '0': // 0〜9が入力された場合、sumに足しこむ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': sum += (int)( c - '0' ); break; case EOF: loop = FALSE; break; } printf( "合計値は %d \nです。", sum ); } }
'0'-'9'は連続が保障されてるから、そんなことしなくても
int c, sum = 0; while (isdigit(c = getchar())) sum += c - '0'; printf("%d\n", sum); これだけでいいじゃん
0〜9以外を無視していないから却下
え?
123x4 と入力したら 10 が返ってくる仕様が求められてるのか?
>>209 丸投げでなければわからないことを聞くのは一向にかまわない
>>210-212 scanfでって言ってるのにgetcharはないだろ
こういうので、質問者にscanf()が必須条件なのか、それ以外でもいいのかって質問してもめったに返事が返ってこないよな。
218 :
210 :2008/11/03(月) 15:43:37
>>216 こういうのはふつうキーイベントループ制御だべよー。
WindowsのようなGUIでもテキストボックスに「1234」なんて連続して入力させるかぁ?
219 :
203 :2008/11/03(月) 15:49:26
みなさん、お答えいただきありがとうございます。 アドバイスを受け、色々と試してはいるのですが、一向にうまくいきません。 ここで質問なんですが、1234を char str[5]; scanf("%s",str); で文字列として受け取って atoi(str)で整数値に変換 その後に1234を一文字ずつにバラす方法がさっぱりわかりません アドバイスお願いします。
>>219 4 = 1234 % 10;
123 = 1234 / 10;
文字列入力ってテーマを見ると、すぐにgetchar()で一文字ずつ判断するロジック書く奴っているよね。 そういう奴に限ってろくでもないバグを仕込むから笑えない。
例えば、>212はまぁ無難な方で、>210なんてわざわざバグを埋め込むための無駄な努力の跡さえ見えてしまう事実。
標準入力から0xffを入力すると、EOFと誤解釈して終了してしまうね。 この程度のサンプルならどうでもいいけど、ファイルをリダイレクトして使うようなツールだと恐怖だね。
>219 ソースはれ あと、ほかに制約がないのなら、%sからatoi()なんかしないで素直に%dで読みなさい
>>224 それ、0xffイコールEOFだから誤解釈じゃないよ。それも正常系の解釈と処理。
まあサンプルプログラムだし、EOFは入力の終了条件のために設けた
だけだから、そこは削除して他の方法に置き換えても構わないし。
違います EOFは決して0xffではありません
228 :
203 :2008/11/03(月) 17:07:34
#include<stdio.h> int main() { int w,x,y,z,goukei; int w2,x2,y2,z2,goukei2; int yosou[4]; int yosou2; printf("前回の当選数字を入力:\n"); scanf("%d,%d,%d,%d",&w,&x,&y,&z); goukei = w + x + y + z; printf("前々回の当選数字を入力:\n"); scanf("%d,%d,%d,%d",&w2,&x2,&y2,&z2); goukei2 = w2 + x2 + y2 + z2; printf("今回予想した数字を入力:\n"); scanf("%d,%d,%d,%d",&yosou[0],&yosou[1],&yosou[2],&yosou[3]); yosou2 = yosou[0] + yosou[1] + yosou[2] + yosou[3]; if(goukei == yosou2 || goukei2 == yosou2){ printf("%d Is a NG\n",yosou2); }else if(yosou2 > 9 || yosou2 < 27){ printf("%d NG",yosou2); }else{ printf("%d OK\n",yosou2); } return 0; } ナンバー4の当たり数字過去2回の合計値と一致した場合、NGと出力するプログラムです。 また、予想した数字の合計値が9〜27に入ってなくてもNGと出力します。 ほんとくだらなくてすいません。
>>226 いや、大誤解だと思いますね。
>>224 ではなくて、>
>>226 が。
>>210 は getchar() の戻り値を char でうけているのが、センスがないというか、そもそも本質を理解していない、というべきか。
もしかして、いつものあなたですか?これはつり?
いつものあなたって・・ お前は誰と戦ってるんだ
231 :
デフォルトの名無しさん :2008/11/03(月) 17:22:56
非科学的=厨はマ板にまではびこっている
糖質かこいつ
233 :
デフォルトの名無しさん :2008/11/03(月) 17:33:18
どいつ?
229
>>228 scanfを使うことは必須条件?
あと入力するのは「1234」なのか「1,2,3,4」なのか
前者だったら
>>207 でできないかな
後者だったらsscanfとかを調べてみるといいかも
>>227 ですよね。というか、標準入力からの入力値が、つうつうで getchar() ≒ fgetc() の返り値になるわけではないのですが。
>>230-234 やっぱりIDをつけたほうがいいのでしょうかね。
>>228 "%d,%d,%d,%d"と書いたら、それは1,2,3,4と入力させることを意味する
1234と入力するのなら
>>207 のようにすること
fgetsじゃなくてgetsでいいよ どうせ両関数の仕様すら理解していないんだろ
239 :
203 :2008/11/03(月) 18:26:55
スレ汚しすいませんでした。
>>207 の方法で1から作り直します。
皆さんご回答本当にありがとうございます。
241 :
デフォルトの名無しさん :2008/11/03(月) 19:43:31
あっそう
242 :
240 :2008/11/03(月) 20:22:33
どこが間違ってますかね?
たぶんここだな if(bally+ball >= 500){ KillTimer(hWnd,ID_MYTIMER); bTimer = FALSE; mytime = 0; }
245 :
質問 :2008/11/03(月) 20:55:23
ファイルの直ぐ下に任意のファイルの内容を そのままコピー、連結できる関数ありますか?お願いしますm(__)m
自分でアペンドモードで開いてコピーしる
下はどっちだ?
250 :
245 :2008/11/03(月) 21:02:52
ということはファイルの内容を読み込んで fopenのaで逐一書き込んでいくのが最良の方法ですね?
system
読み込みながらの方が良いだろう。 char buf[4096]; f = fopen(path, "r"); g = fopen(paht, "a"); while (c = fread(buf, 1, sizeof buf, f)) fwrite(buf, 1, c, g)
253 :
245 :2008/11/03(月) 21:12:33
ありがとうございましたm(__)m
254 :
240 :2008/11/03(月) 21:18:46
>>244 問題ないような気が・・?すみません分からないです
>>254 診ましたよ〜。
えーと、これはですね、、、もう手遅れです。 (←うそ)
問題点はボールのY座標の扱いですね。 WndProc内の変数ballyで保持しているY座標と
WM_TIMERメッセージ内で一時的に計算しているY座標とが一致していません。
ballyはウィンドウメッセージを受けるたびに480に初期化されていますので、上に飛んでいる
ボールをクリックしても反応しなく、地面をクリックすると反応してしまうのです。
ballyはWM_CREATメッセージ内だけで初期化しましょう。
また、WM_TIMERメッセージ内では常に地面からの座標計算でボールの高さを計算して
しまっているので、上手くボールにヒットしたらballyの位置から計算しなおす様に変更する
必要があります。
ソースを読むって言うのはさ 自分とソースを一体化させる作業なんだ 「俺は今どうなっているのか」と考えながら読むんだ 無意識にみんなやってると思うぜ 他の何かがどうなってるかではない、自分がどうなってるか
258 :
質問 :2008/11/03(月) 23:27:00
下記の違いを教えていただけますでしょうか? return exit あ、あと EXIT_FAILUER ってなんですか?
259 :
デフォルトの名無しさん :2008/11/03(月) 23:28:00
FAILUARE
こういう人にはgoogleの使い方を教えたほうが親切なんでしょうか?
return は予約語 exit はライブラリ関数 EXIT_FAILURE はマクロ定数 です。
262 :
デフォルトの名無しさん :2008/11/03(月) 23:40:04
return は関数から抜ける exit はプロセスから抜ける EXIT_FAILUER は書いた者に聞け(煽り口調で)
EXIT_FAILURE はマクロ定数の意味が分りません
264 :
240 :2008/11/03(月) 23:44:28
>>255 うまくいきました!
大変わかりやすい説明ありがとうございます!
>>257 空気を読むって言うのはさ
自分と空気を一体化させる作業なんだ
「俺は今どうなっているのか」と考えながら読むんだ
無意識にみんなやってると思うぜ
他の何かがどうなってるかではない、自分がどうなってるか
しかし、鏡を見ると、場に合わない容姿・・・
int main (void){ int i; int vx[5]; for(i=0;i<5;i++){ printf("vx[%d]:",i); scanf("%d", &vx[i]); } putchar('\n'); for(i=0;i<5;i++){ printf("vx[%d]=%d\n",i,vx[i]); } return (0); } 上記の配列の要素を読み込んで表示のプログラムを実行したところ 1 2 3 4 5 vx[0]:vx[1]:vx[2]:vx[3]:vx[4]: vx[0]=1 vx[1]=2 vx[2]=3 vx[3]=4 vx[4]=5 と変な形になってしまい、試行錯誤したところどうやら実行の際に ファイル名 | more としていたのが原因のようでした。 moreはその前に書いてたプログラムの際に利用していてそのままでした。 moreは単に一画面ずつ表示するようにするだけなのになぜこのようなことが起きたのでしょうか?
>>264 乙! 面白いトレーニングプログラムだねw
わしもSetTimer、KillTimer、WM_TIMERメッセージは、テトリスを作ってみた時に使ったよ。
同じように素のWindows SDKとC言語だけでね。
>>265 大人になれば空気なんて読まなくなる。いや読む必要がなくなるのだ。
その代わり、盤面の様子や流れ、相手のニーズや考えを読むように変化する。
自分がmainになるんだよ mainになって、forなどで値の計算や操作をやっていると考えると どこがおかしいのか分かりやすい 元々俺がアセンブラ屋だったから 自分に置き換えて「イメージ」する癖がついた っていうか、みんなイメージしてると思うが!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>266 printf() の後に fflush(stdout); をおいてみるとどうなりますか?fflush(NULL); ではどうなりますか?
271 :
デフォルトの名無しさん :2008/11/04(火) 00:36:54
みなさん、Cのソースを組むとき、分かりやすく汎用的に組む為に、具体的にどういうことに気を付けてますか? たとえば、、、 僕の場合なんですが、 ・一行は80文字。 ・strcpyよりmemcpy ・独自関数ライブラリのプロトタイプは必ず書く。 ・関数の引数が多くなりすぎる時は構造対で渡す。 ・関数名はキャメル式に統一。 ・入れこは3つ以上にしない。 ・繰り返し文は使い分ける。 ・構造化プログラミング。mainは目次みたいな感じで、全体が把握でくるような作りに。 ・C言語についてのコメントは書かない。 ・インクルードヘッダはは使用するものだけ書く。(まとめたりしない) まだあると思うけど、とりあえずこれくらいかな〜 みんなのも教えてください。
>>271 > ・strcpyよりmemcpy
状況にもよりますが、これは賛同しかねます。
273 :
デフォルトの名無しさん :2008/11/04(火) 00:45:27
>>272 あ、すいません。
そうですね。\0つけたい時ありますもんね。
strcpy→strncpyに訂正します。
memcpy()でコピーしてるのに、コピーの長さをstrlen()で取ってるコードをこのまえ見たな。 strcpy()でいいじゃんって思うけど。
>>271 >一行は80文字。
まあほとんどないことですが、意味の上で 80文字を超えるようであれば、それはそれでこだわりません。
>プロトタイプは必ず書く
前方参照をほとんど行わないので、特に必要性を感じません。
>入れこは3つ以上にしない。
それはそうなんですが、まあ、ええ、ときどき、しばしばやってしまいます。
>キャメル式
初耳です。よろしければ意味を教えてください。
>・一行は80文字。 これは無い
>>277 そういうスタイルの人もいるよ。
Cだと80くらいでも十分書けるし。
いや居るのは知ってるよ
281 :
デフォルトの名無しさん :2008/11/04(火) 01:06:24
>>276 動的独自ライブラリから独自関数を使う場合、引数間違っててもコンパイルが通る。んで、実行時にコア吐いて初めて気付く事がある。プロトタイプ書いてると、コンパイルエラーでるから、書くようにしてる。好みかな。
キャメル式は、確か、ラクダみたいな意味だったかな。大文字と小文字だけでつけるやつ。こういうの。
FileCopy()
区切り方の違いかな。変数はアンダーバー使うし、マクロは大文字とか。
ああそう。
うん
>>281 下位のサブルーチンから書いていって、main()を最後に書くってスタイルの人なんじゃないの?
コーディング規約のスレがあったような ここでもいいんですよ、はい
>>281 ん、了解。たしかに分割コンパイルですすめるときは .h にプロトタイプをまとめる、というのは日常的にしますね。読みが浅かったです。
>>278 >>281 キャメル式+ハンガリアンでかいてみることもあります。気分しだいですが。
>>284 昔はそういう人も居たし俺もそうだった。技巧賞ノミネート作品のように。
でもある時から改めた。
288 :
デフォルトの名無しさん :2008/11/04(火) 01:18:18
289 :
デフォルトの名無しさん :2008/11/04(火) 01:20:25
>>288 別に責めてるわけじゃないから、気にしなくていいよ。
>>287 技巧賞っていうか、Pascalの影響も多分にあると思う。
>>287 さしつかえなければ、かえた理由を教えてください。
たしかに私も厳密な意味で下から上にかいているわけではなく、コンパイルOKれべるですので、技巧賞はむりですね。
>>292 私のはいわゆる「アプリケーションハンガリアン」ってやつですね。MicroSoft 流 pszXXX とかいうのは私も嫌いで、これはやらないです。
そもそも全部の変数をハンガリアンにするわけではありません。
節操がないといえば、それまでですが。
しかしアプリケーションハンガリアンって、あんまり使う機会がないっていうか。 システムハンガリアンはダメだって言われてるけど、Cのときは、ポインタはpをつけてる。
>>269 どちらでも実行結果は変わりませんでした。
>>296 more の内容をください。more にも fflush(NULL) をいれるとどうなりますか?
fflush(stdout); を入れるのは一つ目のprintfですよね? C:\081103>1 |more fflush(NULL) ファイル C:\081103\fflush(NULL) にアクセスできません 1 2 3 4 5 となりました。
>>298 いえいえ、more も自作しているのかな、と思って、 fflush() で more のバッファリングも殺してしまおうと思ったわけで、
コマンドラインで fflush を指定するつもりはありませんでした。
more が標準出力をバッファリングしており、自作のプログラムの出力をその都度画面に出力していないのでは?と思いますが、いかがでしょう。
ごめんなさい、何言ってるか分かりません・・・ 自分の不勉強のようなので出直してきます。
>>300 いえいえ、そんなつもりはないです。
バッファリングについてかいておきますね。
printf() で出力した時点で、それが画面にそのままでるわけではなくて、いったん別のところにたくわえられており、
ある程度たまった時点で画面に出力される、という仕組みになっているのが普通です。
たとえば、これは画面ではなくてディスクなんですが、printf()などで一文字ずつ書き込む、なんてディスクがカリカリいって
(ハードウェアの操作には時間がかかることは直感的に感じていただけるものと思います。)なんだか非効率だと思いませんか?
なにかわからないことがあれば遠慮なくきいていただいていいと思いますよ。レスポンスがあるかどうかは運まかせかもしれませんが。
strncpyは仕様が腐ってるので使うのやめとき。
どう腐ってるの?
終端文字列の扱いのこといってんだろう多分
strncpy()を使うくらいなら、spritf()を使いこなすか、いっそ自前で管理した方がいい希ガス。
つ strncat()
307 :
デフォルトの名無しさん :2008/11/04(火) 16:12:50
spritf
>305s/spritf/sprintf/
int i,j,k,count; printf("何段?"); scanf("%d",&count); for(i = 1;i <= count;i++){ for(j = 1;j <= count-i;j++){ putchar(' '); } for(k = 1;k <= i;k++);{ printf("*"); } putchar('\n'); } 上記のプログラムで右下が直角の三角形が表示されるつもりなのですが 何段?5 ----* ---* --* -* * となってしまいました(半角スペースを-としました)。kがうまくいってないような気がするのですが、ご指摘お願いします。
>for(k = 1;k <= i;k++);{ この行に注目。
>>310 printf("* %d",k);にしたところ
----*2
---* 3
--* 4
-* 5
* 6
となりました・・・なぜ毎回k=1にならないんだ。
>>312 注目したのですがとくにおかしくないような・・・
i回の繰り返し文のはずです。
やっと気付きました。 for(k = 1;k <= i;k++);←ここですね{ くだらない質問で失礼致しました。ご指摘ありがとうございました。
315 :
デフォルトの名無しさん :2008/11/05(水) 01:32:51
int k,i,j,n; printf("何段?"); scanf("%d",&n); for(k=0;k<=n;k++){ for(i=0;i<(n-k);i++){ printf(" "); } for(j=0;j<k;j++){ printf("*"); } printf("\n"); } 布団入ってから作ったから動くかどうかわからん。
316 :
デフォルトの名無しさん :2008/11/05(水) 01:42:04
do{ if(){ break; } if(){ break; } }while(0) 時々みるこれどうなのよ?テクッてて見易いとかいうやつは程がしれてるな
>>316 while (1) {if()break; if() break;}
とか
for(;;) {if () break; if () break; }
はよくみます。lint にひっかからないように for(;;) {} を使う、ていう意見も。
ループの脱出条件が2つ以上ある、というのであれば、これらのやり方もありだと思います。
大文字と小文字を区別しないコンパイラはありませんか?
そこまで大胆に規格を逸脱した実装は見たことないな。 せいぜいDOS/Windowsでヘッダ名が大文字でも行けるくらいしか知らない。
>316 どうなのよってお前の感想どおりだ
>>316 別にテクッてるとは思わないがいいんじゃないの
>>316 その書き方は嫌いだが goto 禁止なら仕方ないな
int main(){ (略) printf("test\n"); 関数(Dname); } void 関数(char *fname){ printf("2\n"); } というプログラムがあったときに、testが表示されて 2が表示されずにセグメンテーションエラーでるのはどこに原因があると考えられますか?
略されたところに魔物が棲んでいると考えられます
324ですけど解決しました 関数の中の定義した配列のサイズがおおきすぎたためでした。
>>316 美しくないとは思ってたんだがそれに近い書き方だ
0じゃなくて条件1個だけど
どう書くべきなの?
条件をいっぱい書くとして抜けるタイミングが異なる場合はどうしたらいい?
>>316 初心者なのでよくわからないのですが
これはif ・・・・・ else if ・・・
じゃだめなんですか?
>>328 それで組んでもさほど代わらないと思うよ。
むしろネストが増えるし
qsortでIPアドレスをキーにソートしたいんですが、うまくいきません。 IPアドレスとchar型の文字列を要素に持つ構造体のソートをしたいのですが 比較関数内にprintfを置いてみると、どうやら比較関数を数回参照しただけで デバッガが立ち上がってしまいます。 IPアドレスはCSVから読み込んでいますが、5MB程度のCSVなら問題なく読み込み、ソートまでできます。 全く同じフォーマットの150MBのCSVからIPアドレスを全て読み込んでソートしようとするとデバッガが立ち上がります。 比較関数内の数箇所にprintfを置いてみたところ、比較関数の先頭と最後のprintfはセットで表示されるので、 比較関数内ではデバッガは出ていません。 どうやら割り当てされていないメモリ領域を参照しているみたいなんですけど、qsortをする際に変な領域を参照することとかあるのでしょうか。
・複数プラットフォームで運用するものでない ・仮に複数プラットフォームがあるとしても、ウチは個別にソースを用意する ・社風なのか、ソースの流用は好まない なのに、「typedefで調べろよ!んったく何やってんだよもー」 とかグチグチ言い出す不満の塊 お前ストレス解消するために会社来てんのか
>>330 デバッガってのはデバッグするためのツールなんだけどね・・・
まぁたぶんスタックが足りないんだろう。どーんと増やしてみては?
>>327 ループ条件が存在するならループで書いたって問題ないだろ
while(条件式) if(){ continue; } if(){ } } 1個目のifでcontinueした場合2個目のifはとばされて、whileの頭にもどりますよね?
335 :
デフォルトの名無しさん :2008/11/05(水) 14:46:20
やってみれ
なんでその程度の規模のプログラムで聞くかね・・・ さくっとサンプル作って、どういう動きするか テストしてみればいいじゃん。
それがゆとり
何度も言うけど、Cは動作の詳細を網羅しない言語だから「やってみろ」はダメ
i=i++とか、やってみてその結果が正しいと思い込んだらどうすんの?
こういうのに素直に答える気がないなら「教科書読み直せ」でいいんだよ
>>334 そうだよ
どうもしねーよゆとり
>>338 ここで散々論争になってきたようなところは
はまったときに聞けばいいんだよ。
どうせはまるところはそういうところって大体結論でてるんだし。
>>340 いつどこでそんな結論が出たの?
むしろ最初から正しい知識を与えないからそういうところではまるんじゃないの
問題にしているのは「やってみて確かめる」という姿勢はトラブルの種を抱えているということで
後になってトラブルが起きてから解決できるかどうかではない
342 :
デフォルトの名無しさん :2008/11/05(水) 17:57:50
>>341 それを言うなら、動作保証の有無を 2ch で聞く姿勢にこそ問題があるだろう
正しい知識だ? そもそもそんなのを与える義理がない者をつかまえて何を説くやら
343 :
デフォルトの名無しさん :2008/11/05(水) 18:57:39
質問です。 プログラムの練習で数のべき乗を計算するプログラムをCで作ってみたのですが、ちゃんと計算してくれません。 出来れば、どこが間違っているか教えていただけないでしょうか? コードは下記のとおりです。 #include <stdio.h> double multi(double x,int y); int main(void){ double a,b,mul; printf("数字aを入力してください\n"); scanf("%d",&a); printf("aを何乗するか入力してください\n"); scanf("%d",&b); mul = multi(a,b); printf("%d",mul); return 0; } double multi(double x,int y) { int i; double mu; for(i=1;i<=y;i=i+1) { mu*=x ; } return mu; }
>>343 scanf("%d",&a); → scanf("%lf",&a);
scanf("%d",&b); → scanf("%lf",&b);
printf("%d",mul); → printf("%f",mul);
double mu; → double mu=1;
345 :
343 :2008/11/05(水) 19:10:21
>>344 ありがとうございました。
桶下で、ちゃんと動作するようになりました。
346 :
343 :2008/11/05(水) 19:11:26
桶下→おかげ です。 失礼しました・・・・・
%fより%gを使おう。
なんかちがうんでげすか?
if ( (a=Func()) == 8 ) aにFuncの返り値を代入しつつ比較ってできる?
できる
351 :
デフォルトの名無しさん :2008/11/05(水) 20:00:22
入門以前に、環境について質問なのですが、Microsoft Visual C++.net ExpressとBCC5.5では、どちらが使い易いですか?
どう考えても前者
IDEとコンパイラ単体では比較にすらならん
>>351 うまくいったが、その動作が保証されてるかどうかを気にしてるんじゃないの?
>>342 なぜ問題が?
ネットの情報の信用性云々言い出すならそもそもこんなスレの存在意義自体がない
あと正しい知識を与えろと言ってるのではない
答えたくないなら「やってみろ」ではなく「教科書読め」と返せと言ってるだけ
どう答えるかはその人の勝手で、お前がグダグダ言おうとかわらんけどな。 まあ、好きなだけ言っててくれw
358 :
デフォルトの名無しさん :2008/11/05(水) 20:52:58
>>355 推測なんざ聞きたかねえ
すっこんでろ
>>356 教科書じゃねえ、保証者(メーカなり規格なり)が発行する資料で確認することだろうが
だいたい回答者サマがそんなこともわかってないような 2ch で聞くことに問題がないとでも言うのか
>>358 教科書を文字通りに取られたか
そこはそういったものに読み替えてくれればいいよ
で、2chで質問することを問題視する君はなんでこのスレにいるわけ?
帰れば?むしろ帰ってくれない?邪魔だから
いつものageのバカじゃないか 相手しても無駄っていうかお前も邪魔だからやめろ
要するにこのスレを潰したいから荒らしてるんだろ?
362 :
デフォルトの名無しさん :2008/11/05(水) 21:12:26
>>359 いーや、おまえは教科書と言った
それからあんたには邪魔かも知れないが
俺はスレタイどおり参加しているだけで荒らしているわけでもない(スレは荒れているかも知れないがな)
難癖つけられる筋合いはないので勝手にするぜ
おまえこそ正義があるなら運営にでも訴えてはどうだ、あ?
printf("%d %d %d", ++i, ++i, ++i);
364 :
355 :2008/11/05(水) 21:53:55
>>358 すっこまねえよ。
要はお前が規格に沿った回答、または引用をすることができないから、
2chで質問することに意味がないと思いこんでるだけだろ?
お前が「やってみた?どうだった?」とかアホ面ひっさげたレスをしなければ
規格に沿った回答の密度があがるんだよ。
すっこんでろ。
365 :
デフォルトの名無しさん :2008/11/05(水) 22:04:15
>>364 >>351 をどう読めばそうなるのかは知らんし興味もないが
推測なんざ聞きたかねえ、と言ったはずだ
だからその部分に対しては答えない
すっこまねえのは確かにあんたの勝手だが
それはこちらにも言えることだ
同じ言葉を返しさえすれば痛烈だとでも思っていて自己矛盾に気づかないなら小学生なみだぜ
367 :
デフォルトの名無しさん :2008/11/05(水) 22:08:21
まだすっこんでないよな? Cの教科書っていったらK&Rで異論ないと思うんだが、 それで何の問題があるんだ?
369 :
デフォルトの名無しさん :2008/11/05(水) 22:23:38
>>368 甘いんだよ、後出し設定なんか聞いてやらん
>>369 お前教科書って聞いて何思い浮かべたの?
371 :
368 :2008/11/05(水) 22:42:33
後出しも何も俺
>>356 じゃねえよ?
寒くなってきたんだから布団にすっこんでぽかぽかになっとけよ
372 :
デフォルトの名無しさん :2008/11/05(水) 22:45:49
で、別人のふりくらいしかすることなくなったわけか
このスレには極端にレベルの低い小学生が二人いるのかな
よそでやれ
次の方どうぞ〜♪
376 :
デフォルトの名無しさん :2008/11/05(水) 23:53:51
>>316 それ好きな人が身近にいる。else ifだとデコボコになるからこれが好きとのこだ。
そいつは、構造対のメンバ名が長い時も、最初にそのメンバのアドレスを短くて意味のわかるポインタに移す。
最初は何でいちいちそんな事すんだよとか思ってたが、正直、そいつのソースは読みやすい。
好みだな
377 :
デフォルトの名無しさん :2008/11/05(水) 23:59:17
確かに、構造体ん中に構造体ある時とか、長くなるね。
378 :
デフォルトの名無しさん :2008/11/05(水) 23:59:33
複数ソースファイルがあるとき ソースファイルその絡みがあるじゃないですか 例えばその値がどこから来たかを見つけたいとき どうやればいいのですか。 1.c から 10000000000000.c くらいまであるとして そのうちの23460001.cにある関数から 5986293.cに渡されたとしたら わからないじゃ ないですか 5986293.cのincludeには782365.cと23435.cしかない というように、「渡りに渡って行き着いた」やつは非常に見つけにくい。
__FILE__
381 :
デフォルトの名無しさん :2008/11/06(木) 00:01:42
ゲームに限らず、携帯電話やATMなど 「仕事」のソースは例外なく大量のファイルに分かれているのに 「この値はどこから来たのか」 「それをはじき出すものはどこにあるのか」 っていうコメントがないことがほとんどです!!!!!!!!!!!!!!!!!!!!!!!!!!
382 :
デフォルトの名無しさん :2008/11/06(木) 00:04:02
今時デバッガ使えば、その時点でどの関数がどの関数を呼び出しているかなんてすぐ分かる。 それとは別に、プログラムを実行させなくても静的に解析するツールだってちらほら存在する。
384 :
デフォルトの名無しさん :2008/11/06(木) 00:06:47
研修期間中に読んだものの中で最長の渡りが 30ファイル先 まず先に値を出す1.c -> それを利用する2.c -> 2.cで出た値を利用する3.c ................................................. 30.cだけ見ると、「この値はどこから来たの」ってことしか分からず、 includeを見て追っていくと何十も何百も元のファイルから来てたとわかるのみです。 しかもそのincludeも、標準ライブラリ除いて20くらいincludeされていることもザラで それら全部調べるとなるとたいへんな時間がかかります!!!!!!!!!!! 今仕事でバリバリやってる人らはどうやって調べているの と
>>378 1.関数呼び出しの構造図を書く
func_a
func_b
func_c
func_d
2.データフローを書く
func_a - x ->func_b
386 :
デフォルトの名無しさん :2008/11/06(木) 00:08:38
関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ・・・・ きつい時あるね
>>386 でも昔のDOSのころのようなミニマムな開発じゃなければ
そういうのはざらでしょ。
保守って点から見りゃ、およそ最悪だろ。
389 :
デフォルトの名無しさん :2008/11/06(木) 00:14:51
>>386 みたいなのをどうしても調べにゃならん時に、たどり着いたソースが新規1985年だったのがある。俺産まれた年(笑)
昔の人は英語好きだよね〜JISに対応してなかったのかね〜
とりあえずincludeで追いかけるってのはありえない ライブラリならドキュメントがあるはずだし ソースがあるならgrepかければ済む
for(;;) { int d = 0; (dを用いた適当な処理) } と int d; for(;;) { d = 0; (dを用いた適当な処理) } を比べると上のほうがオーバヘッドが大きいでしょうか? dはfor文内でしか利用しませんのでスコープを限定したいのですが.
以前、関数から参照する外部変数や値の影響についてなどを関数仕様書に書いた。 すると技術の若造が「そういう事は止めてくれ。」と言われた。 「どうして?」の問いに、「そんな事を書いたら分かっちゃうだろ。」の回答。 C言語好きでNE○の系列会社に入社する奴はヲタクなお山の大将が多かった。
>>393 ドキュメントとソースの乖離が発生することを懸念して、じゃなくて、分かっちゃうからってところがwww
>>392 {
int d;
for(;;)
{
d = 0;
(dを用いた適当な処理)
}
}
とかは?
これってgccしかできなかったっけ?
>>393-394 意味がわからねえw
メーカー製の場合、見えてはいけないものが多い。 特に地上デジタル放送関連は、結局はドライバで制御している以上、 「バレるとB-CASなしでも見られてコピーし放題」って芸当も出来るようになる。
398 :
デフォルトの名無しさん :2008/11/06(木) 00:50:07
コメントなしね〜HTMLならしかたないとこあるけどね〜
>>397 外に見せる?資料と内部では違うだろ・・
内部のものまで「書かない」が徹底されてるのか?
>396 VC6なんで出来るけどステートメントが深くなるからあんまりやりたくないです. それよりfor文の中に入れたときに何度もdが宣言されるけどそのときのオーバヘッドが気になります.
オーバーヘッド気になるなら実測なりアセンブリ見るなりすればいいだろ。
for(ここにおけば?;;) vc6だとグローバルスコープだったような気がするけど でもそれはc++だったような期もするけど
>>400 宣言文は実行ステートメントではないから、
実行時のオーバヘッドにはならないだろ。
____ .ni 7 /ノ ヽ\ 内部にも見せないよ l^l | | l ,/) / /゚ヽ /゚ヾ\ .n 以前、それで営業がポカやらかしたし ', U ! レ' / / ⌒ ⌒ \ l^l.| | /) 絶対に流出させられないから / 〈 | (____人__) | | U レ'//) ヽ\ |lr┬-l| / ノ / /´ ̄ ̄ノ ゙=ニ二" \rニ | `ヽ l
406 :
デフォルトの名無しさん :2008/11/06(木) 01:41:40
B-CAS廃止されたんじゃなかったか?
まだよ
>>401 妙に納得した。
>>392 そのケースなら、コンパイラはどちらも同じようにコンパイルしてしまう。
スコープを限定してくれた方が読むにも判り易いからどんどん限定してくれたまえ。
# それこそ某N∈Sみたいな所の仕事だと全て関数の先頭で宣言しろとか言われかねないけど。
409 :
393 :2008/11/06(木) 02:10:15
>>397 そういうカッコいい理由ならまだいいんだがw
NE○の通信系には変な田舎者の高専や専卒出身の奴が多いのは確かだよ。
カモフラージュ気取りのアメージングコード、騙しの#includeなどは当たり前。
例えば、ANSIの定数をコソーリとトリッキーなビットシフトで何重にも再定義してたりで
デバッガで動かすと、EOFが5に見えたりするんだが、奴らはその自分達の技術に対する
他人の反応を見て楽しんでたんだよ。(家で人知れず独りでオナニーしてろってwww)
>>401 昔はT芝相手で設計部門向けのCADなどのソフトもやってましたよ。その他にも監査に
似た評価・検証系もしてたので、よく使うコンパイラ数本のC標準ライブラリのヘッダやソースまで
ほぼ暗記してました。
>>352 遅レスだけど、エラーの指摘はTURBO C1.0対MS-C3.0の頃からborlandの方が出来が良い。
使いやすさじゃ勝負にならないけど、学習用途なら色々動かして、気に入った物を使うといいよ。
悪いがマ板でやってくれ
>>378 やっぱ一回実行して呼び出しスタック覗くのが一番早い気が。
gdbにもあったはずなんで、大抵の環境で可能だと思う。
fnameに/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data とかはいってたとして、次のファイル操作 printf("%s",fname); if((fp = fopen(fname, "rb")) == NULL ) { fprintf(stderr,"ERR;入力ファイル error;read_inputfile\n"); exit(EXIT_FAILURE); } これをかいて実行すると開けないってエラーがでるんですけども。なぜだと 考えられますか?ちなみに、emacsから/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data だと開けます。開けるからわからないんですけど。ファイルネームにラストに改行はいってるみたいで。 ただそれでエラーがくるのかと。3.dataはバイナリのデータです。
改行入ってたら、実際のファイルの名前にも改行入ってないと開けないぞ
>ただそれでエラーがくるのかと ファイルを指す文字列をどう解決するかは当然OSに依存する あいにく君の使っている環境は、末尾の\nを排除してファイルを探すことができなかった それだけのことであって、そもそもCの話ではない
C言語を志すならばやはりK&Rは買わないとダメでしょうか?
別になくても困りはしないよ
もちろんあったほうがいいけど必須ではないよ CFAQを読んだ上で、規格合致ギリギリのラインを攻め込んだりしない限り問題ないと俺は思う
419 :
デフォルトの名無しさん :2008/11/06(木) 18:20:37
>>416 K&R自体は買わなくても他に手はいくらでもあるが
たかが3千円弱の自己投資をためらうようならお先真っ暗だ
買ったけど内容は入門書と変わらない 正直要らないよ
K&Rってのは、C言語をマスターしている人間が買う入門書。 マスターしてるなら買うわけないじゃん、と思うだろうが まさにその通り。 あの本は、読んでる人間はC言語を完全にマスターしてること前提で書いている。 辞書で言うならこんな感じだな レバレッジ 株用語のひとつ。 リスクヘッジ リスクをヘッジすること。 ってな
>>416 優れた医者は毒を薬とするという例えがあるようにその本を毒とするか薬とするかは自分次第
他人の評価を聞いて悩むより本屋でちょっと覗いてみて興味を持ったら買うのが一番
図書館で借りたって良いんだしさ
百聞は一見に如かずだよ
>>416 そうそう、積読の価値はあると思います。いつか、ふとしたときに手にとって、おもわず読みふけってしまう、ということがあると思います。
>>421 そんなことはない。
Prefaceに書いてあるとおり、他の言語は知ってるけど、C言語は
知らないって人向け
Cの文法は知ってるけど、書き方を知らないような人にも向いてると思う
でも本に書いてあるものは全部よい書き方だと思っちゃうようなひとには向いていない
426 :
デフォルトの名無しさん :2008/11/06(木) 22:04:00
「よい書き方」について論じている本ではないことくらいわかれ・・・・無理なのか?
趣味でプログラムを覚えようと思うのですが、最初はC言語でいいんですよね? おすすめの入門書、サイトがありましたら教えて下さい。
>>427 いきなりCだなんて。えっち。
それはともかく、おすすめしない。
time_t tp; time(&tp); sprintf(buf,sizeof(buf),"%Y%m%d",localtime(&tp)); ↑こんな感じのを sprintf(buf,sizeof(buf),"%Y%m%d",localtime(time(&tp)); ↑こんな感じで一行で書きたいんだけど。 もちろん、この書き方が駄目なのは分かるんだけど。 関数の戻り値のアドレスを渡したいんだよねー
はじめてのC
つーか、それstrftime()の間違いだろ。
>>427 C言語に興味があるのならC言語にすればよい。
入門書は、本屋に置いてあるのでいいと思うよ。
例えば、ポニョのとかLepton先生のとかカニハンのおっちゃんのとか。
ああ、でも『はじめての~』は買わない方がいいと思う。
厨房のとき読んでコードギアスの2ndOPになった。
あまり評価高くないけど、河西本とかもオヌヌメ。もう記述が古いけど厨房でも理解できた。
ウェブサイトは、使わない方がいいよ。コピー&ペーストで終わらせようとする衝動に負けるだろうから。
手で打って覚えるんだよ。目でコードの美しさに感動するんだよ。体でプログラミングの楽しさを感じるんだよ。
本気でC言語を使って思い通りにプログラミングできるようになりたければ、
他人の評価は気にせずに自分の直観を信じて本を読んでいった方がいいよ。
そのレビューをした人と自分の言語理解度が必ずしも同じであるわけではないのだから。
1冊読んでいい気になるなよ、そこの自称中級者。
うわっキモ。米大統領選:オバマ氏、共和党地盤・インディアナ州奪取 まで読んだ。
435 :
デフォルトの名無しさん :2008/11/07(金) 00:15:14
実行環境はMicrosoft Visual C++ 2008 Express Editionの Win32 コンソールアプリケーションです
TCP/IPのソケットを使って互いに通信するプログラムを作りたいのですが、正直さっぱりわかりません どこか詳しい説明とサンプルプログラムがあるサイトはないでしょうか?
>>435 %ld に対応するのは long 型であって、time_t 型ではありません。
long 型と time_t 型のサイズが等しい環境では上手くいくかもしれませんが、
あらゆる環境で常にそれが成立するわけではありません。
ネコなんかで勉強しようなんてするから嵌まるんだ。 long(t1)とでもすれば"%ld"で出力されるだろ。
>>440 やってみたけどダメです。。。
じっさい、t1のほうは「%ld」でちゃんと出力されてるんですが。
ブレイクポイント設定して見てみるとちゃんと変数の中身は変わってます。
なのに「"\ntime1=%ld time2=%ld\n"」で標準出力するとtime2=0 になっちゃう
>>441 64bit環境?
%ld のかわりに、%I64d でやるとどうなる?
って環境は
>>436 か
time_tは
typedef __int64 __time64_t; /* 64-bit time value */
typedef __time64_t time_t; /* time value */
だから64bit整数だな。%I64dか%lldで。
つーか、longが64bitじゃないんだから、
>>440 でいいはずだな。
>>441 はなにをやってみたんだ?
printf("\ntime1=%ld time2=%ld\n", long(t1), long(t2));だぞ?
>>444 その通りやってみたんですがダメですね・・・
printf ("time2=%ld\n",t2)
だと正常に出力されるので%ldの型指定に問題があるとは思えないのです。
なんで0が出力されるのか、全く見当が付きません・・・
本についてるプログラム(C言語を習得する類の本ではありません)で ただのint型変数にファイルから100000という値を読み込んでる ものがあったんですが、一般的に見てこのコードは正しいんでしょうか?
>>447 int型で表せる値の範囲についてです。
環境によるかもしれませんが
参考書には-32767〜32767と載っていたもので
>>445 えーとだな、まず64ビット整数はたとえば0x0000000012345678 という数値なわけだ。
これをスタックに積んで、32ビットで取り出すと、0x12345678 と 0x00000000の2つの数字がとれるわけ。
なんで2番目が0になるかわかったろ?
>>445 >printf ("time2=%ld\n",t2)
この場合も、0x0000000012345678を積んで、0x12345678だけ取り出したから
たまたまうまくいってるように見えるだけで、上位32ビットは切り捨てられている。
>>448 それは少し古い時代のint型だな
今は大抵4バイトなんで-2147483648 to 2147483647 を表せることが多い
intが16ビットなんて8ビットパソコンの時代じゃないか(80年代) 参考書が古すぎ
>>451 そうですか、分かりました。
どうもありがとうございます。
>>449-450 ありがとうございます。上手くいきました。
t1-long(t2) ってやってました。
>>445 を読むまで理屈が判りませんでした。
VC6とかだと上手くいってたのかな?サンプルコードも油断ならないですね
×
>>445 を読むまで理屈が判りませんでした。
○
>>449 を読むまで理屈が判りませんでした。
安価間違えたorz
>>454 long(t1)は、time_t型のt1の値を、long型にキャストすると言うことだ。
t1 - long(t2)では、time_t型のt1からlong型にキャストされたt2の値を引こうとしてしまうので、
time_t型の実態であるlong long型にキャストして引き算を行なってしまうので結果はlong long型のまま。
引き算する場合はlong(t1 - t2)としなくては意味がない。
そもそもtime_t型は実態が32ビット整数だった時代が長いから無理もないとは思うが、
32ビット整数である保証がないのでちゃんとキャストするべき。それをしていないサンプルは、当てにならないと言うこと。
尚、time_t型同士の引き算は本来なら、difftime()を使うべき。
>>456 結局のところ、printf("%g\n", difftime(t1, t2))ってことね。
# だからといって、printf("%g\n", difftime(t1, 0))する奴ぁいねぇと思うが。
対角要素に0があっても正しく動く逆行列を求めるソースおちてないですかね?
同じx86-64bitでも、Windows系の64と、Unix/BSD/Linux系の64アーキテクチャの違いも・・・
>>427 自分もプログラミング入門者なんだが、苦しんで覚えるC言語ってサイトがわかりやすいと思う
お互い頑張りましょう。
>>446 コードそのものは正しい
16bit環境には対応していないというだけ
>>460 俺も昔、苦しんで覚えたなw
血便、下血、終電、睡眠デバッグ・・・
>>460 「苦しんで覚えるC言語」リンク先のsetjump/longjump
>プログラムの流れをグチャグチャにする凶悪な関数であり、よほどの事情でもない限り使用してはいけない。
ワラタ
後に例外処理 try 〜 chatch に衣替えして支持を得る、元祖例外処理サポート関数のデビュー作なのに、
誰も正しい使い方を広められず、gotoと併せて鵜呑み受け売りで語り継がれて忌み嫌われたんだよね。
longjumpが悪だとは決して思わないけれど 忌み嫌われる程度には危険で使いにくいと思う
海の怖さを知って初めて一人前の猟師 そういうことさ
コードの海は俺の海
そして怖い膿を知った
まあデストラクタが呼ばれないから実際使えなかったわな。
「今は大抵○バイト」 一番ダメな考え方 こうやって決め打ちすると、そこから変わった場合に一切対処できずに泣いて誰かに助けを頼むことになる 「ママが○バイトだって言ってたから○バイトじゃなきゃダメなんだあああウワアアアアン!」
分かったからお前が解説してやってくれ
471 :
デフォルトの名無しさん :2008/11/07(金) 18:47:01
>>468 おまえC使いのくせにスタックの巻き戻し程度のものが自分で実装できんのか?
関数にn次の2次元配列を渡す場合はどう書けばいいですか? double data[n][n]とかいう配列です
void func(double **data)
>>472 void hoge(double *pData)
とか
void hoge(double Data[n][n])
じゃだめ?
>>473 渡すときは func(data)ですか?
479 :
デフォルトの名無しさん :2008/11/07(金) 19:43:19
>>473 であるべき、と強硬に言い張る奴が昔いた
一生懸命 malloc してたw
>>473 は大嘘
普通は func(double data[][n])
481 :
476 :2008/11/07(金) 19:45:25
>>477 あ、下のほうって意味だったんですが、VC++で動くけど問題なんでしょうか?
以下のソースで動きました。
void test(int data[2][2])
{
printf("%d\n", data[0][0]);
printf("%d\n", data[0][1]);
printf("%d\n", data[1][0]);
printf("%d\n", data[1][1]);
}
int main(int argc, char *argv[])
{
int data[2][2] = {0,1,2,3};
test(data);
return(0);
}
void test(int data[][2]) { printf("%d\n", data[0][0]); printf("%d\n", data[0][1]); printf("%d\n", data[1][0]); printf("%d\n", data[1][1]); } int main(int argc, char *argv[]) { int data[2][2] = {0,1,2,3}; test(data); return(0); } これでいい
483 :
476 :2008/11/07(金) 19:50:57
>>482 関数で一次限の配列の要素数を書かない理由はポインタ渡しにしたいからですか?
それとも別の理由?
484 :
デフォルトの名無しさん :2008/11/07(金) 19:50:58
K&R で書くなら ANSI 混ぜるなよ
>>472 関数に配列を渡すことはできない。渡されるのは常に配列の戦闘要素へのポインタである。
double data[X][Y] という配列があるとき、data は double の配列の配列であり、
これを関数呼び出しの引数に書くと、それは double の配列へのポインタに変換される。
実際に関数にわたるのはこのポインタで、その型は double (*)[Y] である。
だから関数の仮引数の宣言は以下のようになる。
int func(double (*data)[Y]) …@
ただし、これは次のように書いてもいい。
int func(double data[X][Y]) …A
int func(double data[][Y]) …B
Aは配列そのものを表しているが、既に述べたように関数が配列そのものを受け取ることはない。
そこで、関数の仮引数に配列が書かれたときには、配列がその先頭要素へのポインタに置き換わるのと同様に、
その配列要素へのポインタを宣言したのと同じに扱われることになっている。だからAの持つ意味は@と同じである。
ここでAがポインタに置き換わるとき、当然最初の添字Xは無視されることとなる。つまりBのように省略が可能である。
>>483 最初の添字が無意味だから
したかろうがしたくなかろうが配列を引数に書いたら 絶 対 に ポインタ渡しになる
配列を値渡ししようとしてもポインタの値渡しになるから 値そのものは渡せない
488 :
476 :2008/11/07(金) 20:09:51
>>485-487 丁寧な説明ありがとうございます。
おかげでポインタの理解が深まりました。
人の質問に答えて見るもんですね。
同様に構造体の配列も要素数書いてもポインタになるのを始めて知りました。
試してみたらアドレス一緒でビックリ!
でも、なんでdata[0]->data1じゃなくてdata[0].data1なんでしょうか?
typedef struct{
int data1;
int data2;
}TEST_TABLE;
void test(TEST_TABLE data[2])
{
printf("%d\n", data[0].data1);
printf("%d\n", data[0].data2);
printf("%d\n", data[1].data1);
printf("%d\n", data[1].data2);
}
int main(int argc, char *argv[])
{
TEST_TABLE data[2] = {0,1,2,3};
test(data);
return(0);
}
まったく理解できてねぇwwwwwww
>>429 これでいいじゃない。
struct tm *v_localtime(time_t t)
{
return localtime(&t);
}
strftime(buf, sizeof buf, "%Y%m%d", v_localtime(time(0));
>>488 dataがポインタだから
data[0]は構造体自体
>>488 []演算子に*の意味が入っているから。
1 TEST_TABLE data[10]; TEST_TABLEを要素とする配列。 2 data[0] 先頭要素。 3 &data[0] 先頭要素のポインタ。 4 data だけ書いたら↑3と同じ。 5 TEST_TABLE *p = &data[0]; 配列先頭要素へのポインタで変数 p を初期化。 6 TEST_TABLE *p = data; ↑5 と同じ。 7 p->data1 ポインタを使って要素へアクセス。 8 data->data1 ↑6,7 から、これは 7 と等価。 9 data と p は等価だから、data[0] は p[0] と等価。 10 つまり *p は p[0]。 11 (*p).data1 *演算子はポインタから実体を返す。だから要素アクセスはドット。 12 (*data).data1 上と同じ。 13 data[0].data1 ↑2で書いたように要素なのでアクセスはドット。 14 data[1] 二番目の要素。 15 &data[1] 二番目の要素のポインタ 16 以下 data[0] と同じ。 17 data[2] 三番目の要素。 18 以下↑と同じ。 19 p = dataのとき、 data[1] は *(p + 1) と同じ。 20 つまり、&data[1] は p + 1 21 data[1] は data[0] の後ろにくっついてるわけだから 22 &data[1] と &data[0] の間のアドレス距離は data[0] の大きさ分ある。 23 つまり、 p+1 と p では data[0] の大きさだけ移動してる。 24 等価等価言ってきたけど、 p++ はできて、data++ はできない。 25 以上とは関係なく、関数の仮引数では data[] は配列じゃなくポインタ。
494 :
476 :2008/11/07(金) 21:11:52
>>491-493 またまた詳しい説明、ありがとうございました。
ポインタに関して理解していないところの多さを感じました。
まだまだ勉強不足ですね。
さて、名無しに戻って元々したかった質問をします。
495 :
デフォルトの名無しさん :2008/11/07(金) 21:16:40
VC++でファイルからデータを読み込み分解するプログラムを作りたいです。 ファイルには hoge:aaa\r\n hage:bbb\r\n のように記述されていて、 hoge:に対する記述は hoge:aaa\r\n hoge:bbbb;012\r\n と";"の後にもデータが続いている場合があります。 aaaやbbbbの文字数は一定ではないです。 これを読み出すときに、 sscanf(bBuf,"hoge: %s",&data[HOGE][0]); としているのですが、";"以降がdataに入りません。 どうしたらいいでしょうか?
496 :
デフォルトの名無しさん :2008/11/07(金) 21:33:13
>>493 > 3 &data[0] 先頭要素のポインタ。
> 4 data だけ書いたら↑3と同じ。
ダウト
sizeof &data[0] != sizeof data
>>496 それは例外事項
data だけなら先頭要素のアドレスで正しい
ん?
不毛だ
うるせーな 気にしてんだよ
data と p が等価で、 sizeof data が例外なのか。 p = data ができるのが例外なのか。
502 :
デフォルトの名無しさん :2008/11/07(金) 22:40:55
すごいサイト見つけました 最新ビジネスソフトが格安でした 「格安PCサイト」で検索して 格安PCサイトってところです。 後払いで安心して買えました
504 :
デフォルトの名無しさん :2008/11/07(金) 23:29:42
すみませぬが、このコードの間違いを指摘して頂けませんか? どうにも答え通りに表示されなくて… このままだと偶数番目に数字が入力できないのです。 scanf("%1f", &weight[i]);の「%1f」を「%f」にすると入力が出来ても どうもscanfで入力した数字がweight[NUMBER]に入ってないといいますか… よろしくお願いします。 ・5人の学生の体重を読み込んで最も重い人の体重・最も軽い人の体重を表示 #include <stdio.h> #define NUMBER 5 /* 人数 */ int main(void) { int i; double weight[NUMBER]; double max, min; puts("体重を入力してください"); for (i = 0; i < NUMBER; i++) { printf("%2d番:", i + 1); scanf("%1f", &weight[i]); } min = max = weight[0]; for (i = 1; i < NUMBER; i++) { if (weight[i] > max) max = weight[i]; if (weight[i] < min) min = weight[i]; } printf("最も重い人の体重:%.1f\n", max); printf("最も軽い人の体重:%.1f\n", min); return (0); }
うぜえから宿題スレへ行け
scanfでは%lfな、エルエフ
>501 pとdataは評価したときに得られるポインタ値が同じだけで、絶対に等価ではない sizeofは配列がポインタに成り下がるという「特別な動作」に対する例外で 例外ではあるがその時の配列の扱い自体は本来的なもの p=dataが出来るのは例外ではない
509 :
デフォルトの名無しさん :2008/11/08(土) 00:07:09
data = p; ができないのも例外で片付ける気かこいつ
指すアドレスが書き込み可能でないというだけだな
ポインタってのは宣言した段階で実際の入れ物が用意されないのは なぜですか double *a なら、 「倍精度データ型のa」ちゅう入れ物が出来てていいはずや ないですか
>>511 ひとつの入れ物に対して、2つのポインターを使うこともあります。
だから、入れ物とポインターの定義は分けたのだろう。
513 :
デフォルトの名無しさん :2008/11/08(土) 02:16:13
いや、入れ物はできてるよ aの中身が無いから参照できないんだよ?
>>511 メモリの無駄だから
ポインタだけ欲しくて入れ物は要らないシチュエーションもよくある
配列の中身を順番に舐める時とか
ポインタを入れる入れ物が用意されてる。 int や double と同じように、 int* や double* もそれぞれ別の型。 int 変数を宣言すると int のサイズのメモリが確保されるのと同じように。 int* 変数を宣言すれば、 int* サイズのメモリが確保される。
>>513 中身が無いってどういう意味かわからないが、
中身の無い変数なんて C じゃ存在し得ないよ。
double *a と宣言すれば、 その時点でメモリ上に領域が確保され、
なんらかの値が入っている。無効値かもしれないが空っぽってことは無い。
NULL だって値を持っている。
doube *a; a = 1;
多くの行を含むテキストファイルを読み込む実用プログラムではscanfは使わないほうがいいんだけどな・・・ フォーマットを外れた行に遭遇すると死ぬケースもあってアンセーフだし、コメントも書けないからね。
>>517 ど・・どうぶ?
いやもういいから寝るんだ。寝た方が良い。
scanfで本当に防げないのは数値のオーバーフローだけだろ?
ポインタを入れ物として理解したつもりになってると混乱するという事例ですね。
入れ物として理解するのはいいが何を入れるための入れ物かを理解しなければ
ポインタをポインタとして使うには、 何をポインタにしたいのかを指定しないといけない *aだから、aというポインタがあるだけであって このままではaは何も指し示していない aが入れ物を指し示して初めて使える
Cって何でこんなに穴ばっかなの? ↓ よく考えないで作ったうえ、規格化もされないうちに広まりすぎたからです ↓ なんで直さないの? ↓ 直したくても、今までの資産が使えなくなるので直せないのです 混乱するし みんなで学ぼうだいじなこと(ひらがなにするとまさに官公庁発行って感じがしてムカつくのがわかるだろう) ・まず、穴がないように設計してから広めよう 穴だらけの状態でグローバル化すると 「別の言語」としてリリースするより手がなくなってしまう いい反面教師であると 俺は思う
intだって最初はどんな数値が入ってるかわからないわけだし、 ポインタだってそこらへんは一緒でしょ
>>524 その答えがC#!
熱烈なマニアに支持されたC言語はgdgdで未成熟のまま普及へ。
↓
高い移植性=実際は力技で移植w という実情からANSI標準化。
↓
多くのキボンヌ!に応えてC拡張、更にC++化で何でも許す状態に。
↓
工学系の学生・研究者援護企業であるSunによりJava言語が誕生
↓
プログラミング言語の第一人者がプロの観点で成熟させたC#を生む♪
これにより、プロフェッショナル(C#) > 廃アマチュア(Java) であることを見せ付けて今日に至る。
その情熱を仕事に活かせば?
>>520 文字列の長さもマジックナンバーで埋め込まないといけないんでイマイチ。
scanf("%10s", s);
とか。
printf()系みたいにパラメータで渡せればよかったのに。
"%10s" これをsprintfで作れば。
scanf("%*s", 10, s)
533 :
デフォルトの名無しさん :2008/11/08(土) 09:29:03
>>510 data が書き込み可能でないアドレスだというのなら、
sizeof(p + 1) == sizeof data というのだな
正常終了を知らせる返り値が0なのに どうしてif文では条件に0渡すと偽の扱いになるの? 分かりづらい
536 :
デフォルトの名無しさん :2008/11/08(土) 17:14:28
ユニックスの仕業です
>>535 関数の話であれば、異常を検出しやすくするため。
--
int func()
{
if (異常) return -1;
return 0;
}
int main()
{
if (func()) {
// ここでエラー処理
}
return 0;
}
--
シェルの場合は、ややこしいことになってしまったけどね。
負論理?
C言語の仕様策定した人間が馬鹿だったんだろうね 0=正常、真 というのが通常の考え方だから。 DBの設計でもフラグなんかは0が正常値だしね
あんまり普通じゃない。
>>540 おい、情報工学でもデジタル回路論でも、論理では真=1だろ!
真・偽の論理値と、処理結果のステータス値とは違うカテゴリだぞ。
ブーリアンとしては、0=偽が慣例的だけど、 シェルコマンドの戻り値は、エラーコードにバリエーションを持たせたかったんだろうな。 システムが正常に処理を終えたらそれでよし、エラーが起きたら何のエラーなのかを知りたい。
パソコンAで作ったソースファイルを違うパソコンBに移してコンパイラしたら 何故かchar型の変数の中にCのソースファイルが存在する場所のパス(C\なんちゃら〜)が入っちゃうんですけど・・・ パソコンAでコンパイルした時の変数の文字列は正常でした コンパイラは両方ともボーランドです・・・
初期化してないな
546 :
デフォルトの名無しさん :2008/11/08(土) 18:51:06
Borlandでか? VC6 でなく
>>546 #include<stdio.h>
int main(void){
char unknown[1024];
unknown[1024-1]='\0';
puts(unknown); // 何が出るかな?
return 0;
}
548 :
544 :2008/11/08(土) 19:01:54
>>545 トンクスです
初期化した後に文字列を渡したら正常に動きました
549 :
デフォルトの名無しさん :2008/11/08(土) 19:10:59
>>547 不定ってことだろ? それはわかってる
同じソースを同じコンパイラで翻訳してるのに結果が違うのが変だと思ったんだよ
通常ホスト環境ではコンパイラとソースが同じならバイナリも同じで、
それゆえ不定は不定なりに同じ値が出るはず
DOS だとか、VC6(と xp)みたいに特殊なケースを除いて
>>549 スタックに何が乗っているかは開発環境依存ではなく、実行環境実実行状況依存。
551 :
デフォルトの名無しさん :2008/11/08(土) 21:05:08
実行環境が
>>544 の文中のように限定されている場合、
記憶域は割付時点ではゼロ初期化されていて他のプロセスの情報が影響(露呈)することはない
0 以外の「不定」が入っているとすると、例えば
>>547 のようなケースではスタートアップの残骸くらいだろ?
>>549 分かってないようだけど、ソースとコンパイラが同一かどうかは関係ない。
バイナリが完全に同一であっても、同じ値になるかどうかはわからない。
553 :
デフォルトの名無しさん :2008/11/08(土) 21:06:03
エラーログってどこでだす?メイン?サブ?
>>551 ヒント:OSから直接mainに飛ぶわけじゃない
>記憶域は割付時点ではゼロ初期化されていて ?
おまいら、こまけえな
>>544 は初期化したらおkだったといってんだから、それでおしまい。
557 :
デフォルトの名無しさん :2008/11/08(土) 21:38:09
>>552 保証があるかどうかって話は今してないぞ
>>544 が訴えている症状から何を考えたかを言っているんだ
超素人質問で悪いんだが、ヘッダーファイルの実体(例えばstdio.h)ってどこにあるの?
>>558 環境による
もうちょっと言えば、たぶんコンパイラの手の届く場所にある
>>557 「同じになるはず」と言う時点でお前はわかってないんだって
>>558 UNIXだと /usr/include、あるいはコンパイラをインストールしたところ付近
Windows だとコンパイラをインストールしたところ付近
561 :
デフォルトの名無しさん :2008/11/08(土) 22:16:33
>>560 いいだろう、お主が「わかっている」なら、このプログラムの出力を俺以上に説明できるか?
#include <stdio.h>
int main(void)
{
int a[1], i;
for(i = -2048; i < 0; i += 16) {
int j;
printf("%p", &a[i]);
for(j = 0; j < 16; j++) {
printf(" %02x", a[i + j] & 0xff);
}
printf("\n");
}
}
「不定だから」ではなく、何の残骸かを俺以上に言い当てられるか?
俺の説は「スタートアップの残骸くらい」と述べたぞ
確か厳密には標準ライブラリのヘッダは、ファイルとして存在している必要はないんだっけ?
563 :
デフォルトの名無しさん :2008/11/08(土) 22:20:56
>>558 一般的な答えは「処理系定義である」
コンパイラの品種と、それをどこのディレクトリに(またはデフォルトで)インストールしたかを書いてくれれば
そのコンパイラを使っている人ならたいてい答えられる
まーた馬鹿が頑張ってるなあ そろそろ引き際ってものを覚えろよ
未定義釣りが始まった。
566 :
558 :2008/11/08(土) 22:27:33
>>559 >>560 >>563 ありがとうございます。ということはLinuxを使っている場合には/usr/includeになるんですね!
では、OSごとにヘッダーファイルの実装は異なるんでしょうか?CPUが違えばシステムコールの
実装もことなるのと同じなのでしょうか?
ゴハンダヨ♪|▽゜)ノ ⌒゜゜・ ゞ●)))彡
>>566 ヘッダファイルの実装、の意味がよくわからんが、
たとえばマクロやtypedefの定義の中身が違ったりするのかという意味なら、そう
569 :
デフォルトの名無しさん :2008/11/08(土) 22:35:59
>>569 はいはい、unix系でいいでちゅかー?
571 :
デフォルトの名無しさん :2008/11/08(土) 22:45:44
UNIX系つーと、また違う
どーでもいーよ。 語りたいなら該当板行けよ。
>>566 ヘッダーファイルの実相=ヘッダーファイルの中身
という意味なら、ヘッダーファイルは処理系=コンパイラによって違う。
struct test{ int **A; }; int main{ int i,j struct test *doragon; doragon->A=(int **)malloc(sizeof(int)*10); for(i=0 ; i<10 ; i++){ doragon->A[i]=(int *)malloc(sizeof(int)*10); } for(i=0 ; i<10 ; i++){ for( j=0 ; j<10 ; j++){ A[ i ][ j ]=i; } } } という風に構造体のポインタのメンバのAにintを10*10個用意して それを二次元配列として使うプログラムを作ろうとしたのですが アクセス違反が起こります。 なぜでしょうか?
doragonってw それはともかく、doragonに実体がねーよ。
ドラゴンにメモリ確保してないから 追加 doragon = (struct test *)malloc(sizeof(struct test)); 修正 doragon->A=(int **)malloc(sizeof(int *)*10);
A[i][j]はdoragon->A[i][j]のミスでいいのかな?
大きさ的にエラーの原因ではないだろうが 前者のsizeof(int)もおかしいね
>>574 doragon = malloc(sizeof(struct test)); を最初のほうに追加。
それと
doragon->a = (int **)malloc(sizeof(int*) * 10);
にしたほうがいい。
char型に入力された英文字によって処理を変えるプログラムを作りたいのですが char com; if (com == A || a) { ・・・ } などと書くとエラーが出てしまいます Aまたはaの時に処理をしたい、という場合はどのように書けばいいのでしょうか?
if (com == 'A' || com == 'a') 入門書か、そこらのサイト一通り読んだほうがいいと思う
転職で会社探してたときだけど 全ての社員がrailsしかできないベンチャー会社なら見たぜ 市販のrailsの本で勉強して会社作りましたとさ 情報工学なんかを学んでる人もいないし Javaは時代遅れだ、とおっしゃっておられました こんなんで仕事請けられる時代になったんだね
すまん。超誤爆だ
誤爆レス。 RoRが廃れたらどこいくんだろうね。 それでもRoRにしがみつくって展開になるんだろうけど。
まぁ、COBOLしかできないのを売りにしている会社もあることだし。
ファイルの名前をループして作っていくときに 001 002 ... 010 という形にしていきたいんだけどどうすればいいんですかね。
%03d
switchで処理を分岐するより関数ポインタの配列使ったほうが早いの?
>>591 ケースバイケース。そこがボトルネックになることが判っているのなら、実測してみるしか。
まぁ、大抵はそういうケースがボトルネックになることはないと思うが。
char *p = "dagane"; char *p2 = "dagane"; とした場合アドレスは同じになりますか?
どのアドレスか知らないが、 char型へのポインタpとchar型へのポインタp2のそれぞれの値および変数のアドレスなら、 いいえ、違います。それは、ペスです。 char型へのポインタpの値と代入による初期化をしているp = の右辺値の文字列リテラルである"dagane"の値('d'のアドレス)なら、 はい、同じです。p2も同様にして導かれる。 まぁ、試してみればわかることだろ。
'd'のアドレスは同じなのにp p2の値はことなるんだ
ああ、pの値と'd'のアドレスが同じって書いてたのか 読み間違いスマソ。
環境依存じゃね? 2つ作るのと1つを使うものがある
598 :
デフォルトの名無しさん :2008/11/09(日) 14:52:52
警告はでないと思うんだけどMAXNに変数つかってる
る?
>>598 要素数MAXN+10の配列へのポインタを受け取るからに決まってる
なぜ最初から10込みでMAXNを宣言しないのかは知らないけど、
バッファオーバーランに悩まされた経験のある古いタイプのプログラマで
+??というセーフマージン(と称するもの)を取る習慣がついてるタコの一派がいるので、
そのたぐいかもしれない
>>599 #define MAXN 10 みたいにやってます
警告無視して実行したら、落ちます・・・
警 告 の 内 容 ぐ ら い 読 め
>602は赤信号で道路を渡って車に轢かれて死ぬタイプ
warning C4048: 'double (*)[14]' と 'double [4][4]' で配列の添字が異なります。 警告はこうです MAXN 4としました
めんどくせーから int gauss_jordan(int n, double a[][MAXN+10], double b[]){ ↓ int gauss_jordan(int n, double a[][], double b[]){ にしとけ。
それだとコンパイルとおりません・・・
通るようにしろ。
情報が断片的過ぎてアドバイスできない。
int gauss_jordan(int n, double a[][MAXN], double b[]){ こうっすかね? でもコンパイルは通るんですが、実行すると逆行列がないってなるんですが・・・ double a[4][4]={{2,-2,4,2},{2,-1,6,3},{3,-2,12,12},{-1,3,-4,4}};とかの行列で試しました
>>610 gauss_jordan関数はそのままにして、呼び出す変数を直すべき
dobule a[MAXN][MAXN];
とかにしているなら、正しく
double a[MAXN+10][MAXN+10]:
とかにする。
int gauss_jordan(int n, double a[][MAXN+10], double b[]){ 略 } int main(){ double a[MAXN+10][MAXN+10]; double b[4]={1.0}; int n=4; a[0][0] = 2; a[0][1] = -2; a[0][2] = 4; a[0][3] = 2; a[1][0] = 2; a[1][1] = -1; a[1][2] = 6; a[1][3] = 3; a[2][0] = 3; a[2][1] = -2; a[2][2] = 12; a[2][3] = 12; a[3][0] = -1; a[3][1] = 3; a[3][2] = -4; a[3][3] = 4; if(gauss_jordan(n, a, b) == 0){ printf("singular matrix !!!\n"); exit(0); }; } うまくいきません・・・・
613 :
611 :2008/11/09(日) 17:06:03
その関数のソース見ると、配列の添え字は1からだと してるみたいなんで、データはこうなるかと a[1][1] = 2; a[1][2] = -2; a[1][3] = 4; a[1][4] = 2; a[2][1] = 2; a[2][2] = -1; a[2][3] = 6; a[2][4] = 3; a[3][1] = 3; a[3][2] = -2; a[3][3] = 12; a[3][4] = 12; a[4][1] = -1; a[4][2] = 3; a[4][3] = -4; a[4][4] = 4;
614 :
デフォルトの名無しさん :2008/11/09(日) 18:08:20
質問です。 int x; char a[64]; などとした場合に x と a[64] のアドレスが全く同じところ指してしまい aにデータを入れると内容が破損してしまうのですが原因としては何が考えられるでしょうか。 char a[64]を char a[60]などと減らすと正常に動作します。 他の変数もいくつか宣言していますが、別のプログラムを作っていても時々このような現象が起こります。
ソースを全部うpすると親切な人が教えてくれますよ
>などとした場合に x と a[64] のアドレスが全く同じところ指してしまい そんなことは有り得ません。あなた自身が何か勘違いをしているのでしょう。 必要でしたら、再現する最小限のコードを提示してみてください。
617 :
614 :2008/11/09(日) 18:19:19
>>614-616 すみません、ソースはこちらになります。
#include <stdio.h>
int main(void){
int x;
char a[64];
printf("%p\n",&x);
printf("%p\n",&a[64]);
exit(0);
}
これを実行したら下のようになります。
$ gcc -Wall hoge.c
$ ./a.out
0xbfc23df0
0xbfc23df0
619 :
デフォルトの名無しさん :2008/11/09(日) 18:22:39
アンパがいらん気がする
>>618-619 すみません、勘違いしてました。
他の原因を探してみます。
お騒がせしました。
ちょうどスタックの位置がxになってるのね
a[64]と定義したら、有効なのは a[0]〜a[63]。 最後の直後、a[64]をさすポインタは作り、比較にもちいてもいいが、 dereferenceしてはならない。
623 :
デフォルトの名無しさん :2008/11/09(日) 19:54:50
sinxの級数展開を5項まで求めるプログラムを作っているんですが、項数と角度を渡すと値を返すような定義関数って作れますか?
while(fgets(buf,sizeof(buf),fp) != NULL){ } これはどういう意味ですか?
>>591 関数ポインタを使っても、関数ポインタを選ぶのにswitch 〜 caseと等価な判定が入る。
fgetsの戻り値とNULLを比較してるだけ
>>624 fpから1行入力して、読めている間はループ。
>>624 fgets(buf,sizeof(buf),fp) != NULL が0でない間ループを繰り返すという意味
>>624 fgetsがNULLを返さないというのがループを継続する条件。
基本的に、ファイルを最後まで読みこんだときfgetsはNULLを返すので、
ようするに全部読み込むまでループを続けるということ。
>>626 それでもwhile ((c = getc(fp)) != EOF)に比べれば遥かにましだと思う。
632 :
624 :2008/11/09(日) 20:55:55
ありがとございます。そのループ内で while((cp = strtok(cp," \t\r\n")) != NULL){ tmp[cnt++] = atof(cp);//文字列cpをdouble型とする cp = NULL; } というwhile文を回したいんですが、空白の行は飛ばされますか? 横にdoubleの20個のデータがあってそれをtmpに入れています
>>631 while (fread(&c, 1, 1, fp) == 1)
// ただし、cはintではなくcharでなければならない。
634 :
624 :2008/11/09(日) 21:03:41
空白の行があると、前の行のデータがもう一度読まれる気がするんです
635 :
623 :2008/11/09(日) 21:05:00
>>630 すいません
どんな感じで作ればいいのでしょうか?
636 :
デフォルトの名無しさん :2008/11/09(日) 21:08:49
宿題ものよりひでえ質問だな
>>632 空白行を読み飛ばすのは自分でやらんとダメ。
それと、strtok()を使うくらいならsscanf()を使った方がいい。
横にデータ数が多いと sscanf(buf,"%lf %lf %lf %lf・・・・・・・・・・",&tmp[0],&tmp[1],&tmp[2],&tmp[3]・・・・・・・・・); みたいに長くなっちゃうかなぁと思ってstrtok使ったんですが・・・
switch caseって長くなるの、なんとかなんないの キーボードから入力されるアーファベットで分岐させるとしても、 小文字だけ見ても26個もcase作らないといけないじゃない これはスマートではない!
アーファベットをキーにしてジャンプテーブルを作ればいいじゃん
>>640 アルファベットごとにそれぞれ違う処理するなら、どうかいても長くなるじゃん。
C++でCの入出力使うのはダサい?
ダサいといえばダサい C++ならC++の入出力のほうがいい
まぁ好きにすればいんじゃね
646 :
デフォルトの名無しさん :2008/11/09(日) 22:19:01
>>643 ある意味 C++ らしい使い方ではある
1×4行列Aがa[4]に、4×4行列Bがb[4][4]に入っています。 このときA×Bの1×4行列をc[4]に入れたいんですが・・・ どう書けばいいんですか? for(i=0; i<4; i++){ for(j=0 ;j<4; j++){ c[j] += (a[i] * b[j][i]); } } かなと思ったんですが、なんか違うきがします
それ以前に掛け算できなくね?その組み合わせ
for(i=0; i<4; i++){ for(j=0 ;j<4; j++){ c[i] += ( a[j] * b[j][i] ); } } こうですか?
>>648 えっと
行列の掛け算が定義できないという意味ですか?
(a1 a2 a3 a4)(x11 x12 x13 x14)
(x21 x22 x23 x24)
(x31 x32 x33 x34)
(x41 x42 x43 x44)
で出来るとおもうんですが。。
if(color<=15){ newpen(win,color); color=color+1; } else{ color=1; } ↑これだと15番目?の色が連続になってしまうのですが、理由が分かりません なぜ1、2、3・・・14、15、1、2、・・・とならないのでしょうか?
日本語でおk
>>651 elseのときにnewpenしてないからじゃね?
>>647 まあ合ってそうな感じ
Bのi行j列の要素がb[i][j]で得られるとする
(逆ならiとjを入れ替えて)
まず要素一つぐらい手計算
c[0] = a[0]*b[0][0] + a[1]*b[1][0] + a[2]*b[2][0] + a[3]*b[3][0]
つまり、c[j]は
c[j] = a[0]*b[0][j] + a[1]*b[1][j] + a[2]*b[2][j] + a[3]*b[3][j]
さらにまとめるなら、ループ変数iを用いて
c[j] = a[i] * b[i][j]
>>653 すみません、elseでnewpenしなくてもいける気がするのですが。。。
あと、
if(color<=15){
color=color+1;
}
else{
color=1;
}
newpen(win,color);
↑このようにしても同じ色が連続できました。。。
なぜですか;;
変数の変化をよく考えてみれ
解決しました、ありがとう
658 :
デフォルトの名無しさん :2008/11/10(月) 04:14:00
char * disp_bn(int n) { char * c; int i; const int BS = sizeof(n)*8; c = (char*)malloc(BS); for (i=BS; i>0; i--) { if(n&(1<<(i-1))) c[abs(i-BS)]='1'; else c[abs(i-BS)]='0'; } return c; } intを2進数の文字列にする関数なんですが、もっと上手くて鮮やかな方法ってないでしょうか?
そもそも完成してなくね
動いてるのか知らんが、if-elseどけて、bit+'0'みたいな方法でいいんじゃね?
char * disp_bn(int n)
{
char * c;
int i;
const int BS = sizeof(n)*8;
c = (char*)malloc(BS);
for (i=0; i<BS; i++)
c[i] = (n&(1<<(BS-i-1))) ? '1' : '0';
return c;
}
見通し悪かったのでちょっと直しました。absとか要らなかったです。
>>660 それはどういう意味でしょうか?
こういうことじゃないか? c[i] = (n&(1<<(BS-i-1))) + '0';
>>662 はーなるほど。'0'をunsigned charとして扱うわけですね。勉強になりました。
それはいいけど、ナル文字ターミネートしてなくて使いにくくない? もう一つついでに言えば、ループ内で毎回ビットシフトするのも効率悪そうだし。 最下位ビットをチェックして後ろから詰めていけばいいじゃん。
2進文字列に変換させるだけの関数でmallocしたままメモリを放置プレーするは お勧めしないよ。 呼び出し側で char buf[sizeof(int)+1] とでもしておいて引数で渡す方がいいよ。
666 :
665 :2008/11/10(月) 06:41:02
あースマン、char buf[sizeof(int)*8+1]; に訂正だね。 char * disp_bn(int n, char *buf) { int i; for ( i = 0; i < sizeof(int)*8; i++ ) buf[i] = (n&(1<<(BS-i-1))) ? '1' : '0'; buf[i] = '\0'; return buf; } 他は特に問題になるところは無いからいいんじゃね? (個人差による手癖は気にしていない) レビュー終了。
えらそうに言うならもう少しちゃんと見ろよw
void disp_bn(unsigned n, char * buf) { char * p = buf + sizeof(int) * 8; * p = '\0'; do { * --p = (n & 1) ? '0' : '1'; n /= 2; } while (p != buf); }
669 :
665 :2008/11/10(月) 15:50:57
>>667 最近は別なところが忙しくてコードのレビュー量が減っててw スマソ
670 :
デフォルトの名無しさん :2008/11/10(月) 16:23:49
画像ファイルを読み込みたいのですが下のようにすると読み込み後のデータが減っています。 バイナリエディタで確認したところ、どうやら 00 にあたる部分が消失しているようです。 00も正常に読み込ませるにはどのようにしたら良いでしょうか? char a; while(fread(&a, 1, 1, fp){ ---処理--- }
普通に読むよ。確認のしかたが悪いんじゃない?
>>670 fread()は1,1で使っちゃダメ。それくらいなら、fgetc()を使うべき。
助けて下さい
どうしたんだい? 何でも言ってごらん
場合によっては110番を視野に入れた方がいいよ
676 :
デフォルトの名無しさん :2008/11/10(月) 17:27:41
>>671-672 ありがとうございます。
freadをfgetcに変えましたが変化はありませんでした。
画像も複数のファイルを用意して試してみたのですが
やはり 00 にあたる部分だけが消失してしまいます。
FILE *fp;
int c;
fp = fopen("ファイル", "r");
while((c = fgetc(fp)) != EOF){
---処理---
}
fclose(fp);
だからなんで00が入ってないことを判断した部分を書かないの?
678 :
デフォルトの名無しさん :2008/11/10(月) 17:40:10
>>676 ファイルのオープンモードをバイナリにするため、以下のように、fopen の第2引数を変更してみそ。
fp = fopen( "ファイル", "r" );
↓
fp = fopen( "ファイル", "rb" );
あとバイナリーデータなら "rb" で。 改行コードと同じ数値があると減るぞ。
681 :
デフォルトの名無しさん :2008/11/10(月) 17:50:34
>>677 すみません、ループ中にダンプ処理を加えて確認したところ
正常に読み込んでいましたが
ご指摘頂いたループ中の他の処理に問題があるようです。
FILE *fp;
int c;
char a[256];
char b[10240];
fp = fopen("ファイル", "r");
while((c = fgetc(fp)) != EOF){
sprintf(a,"%c",c);
strcat(b,a);
}
fclose(fp);
>>678-
>>679 バイナリモードでも結果は同じでした。
まあstrcatがあると思ったわ・・・ str系は0x00は終端扱いするからバイナリーデータに0が含まれてると扱えないぞ。 普通に配列用意してそこに入れていこう。つーか、配列用意したらfread()で一発で読めるけどな。
00は終端文字列になるからだろ
684 :
デフォルトの名無しさん :2008/11/10(月) 18:06:28
>>682-
>>683 ありがとうございます。
freadにしたところ最初の 00 の部分で終了してしまい数バイトしか読めませんでした。
a[10240]
fread(a,sizeof a,1,fp);
printf("%s",a);
count = fread(a,1,sizeof a,fp); for (i = 0; i < count; ++i) { printf("%02X", a[i]); } くらいやってみ
>>687 どこまで読み込んだか確認のために出力してるんだよな?
690 :
デフォルトの名無しさん :2008/11/10(月) 18:31:49
>>685->
>>686 すみません、正常に読み込めました。
勉強になりました。
アスキーコードに変換せずバイナリのまま配列に渡すことは不可能でしょうか?
memcpyとか
直接fread()で読めばいいじゃん。
test
まず文字列から勉強しなおせ
バイナリで扱いたいデータは、文字列を扱う関数に放り込んではいけない。 それだけのこと。
696 :
デフォルトの名無しさん :2008/11/10(月) 20:26:26
バイナリと文字列を混在させる必要がある場合は?
バイナリとして扱えば?
>>696 まず文字列がなんだかわかっているのか?
アスキーコードに変換って何のことを言ってるの? データ自体は変換なんかされないよ?
700 :
デフォルトの名無しさん :2008/11/10(月) 22:21:31
よろしくお願いします。 defineできった文字列は必ずnull保障されますでしょうか?
日本語でOKあるよ。
>defineできった 意味不明 >null保障 意味不明
703 :
デフォルトの名無しさん :2008/11/10(月) 22:59:08
>>702 これくらい察せカスwwwww
>>700 の日本語微妙だけど、まぁ言いたいことわかるよ。確かにそういう言い方するの聞いたことあるよ。
マクロ定義は型が保障されてないからね〜どうなんだろ〜
俺の認識ではNULL保障されてると思うんだが。
704 :
デフォルトの名無しさん :2008/11/10(月) 23:01:30
まぁおちつけ
NULL保障ってなんだよ。
706 :
デフォルトの名無しさん :2008/11/10(月) 23:05:59
なんだろうな 教えてエロい人
707 :
デフォルトの名無しさん :2008/11/10(月) 23:09:16
ヒント:C言語の文字列
NULLターミネートされるかどうかって事なんかなあ
709 :
デフォルトの名無しさん :2008/11/10(月) 23:25:05
ターミーネーターって
もうぬるぬるなの。
NULL保障ってどこの言語? 少なくともCではない
NULLであることを保障する意義・必要性のある言語……? わかったぞ!つまりはGCがある言語、オブジェクト指向の言語だ したがってCではないのだよ!
>>700 > defineできった文字列は必ずnull保障されますでしょうか?
#defineで定義された文字列定数の最後は
必ずヌル文字\0がついているでしょうか。
だろ?
必ずナルターミネートされるかと言う質問なら、defineを使うかどうかに関わらず、必ずされるわけではないという回答になります。 例えば、#define FOO "foo"した場合にputs(FOO FOO);という使い方もできるわけですから。
ターミネーターって何をターミネートする人なんだろ。
>>713 は、入所相談員とかで福祉施設や精神科病院にすぐにでも転職できるぞw
SCSI全盛の頃、終端の装置にアレ取り付ける際に 「ダダンダンダダン ダダンダンダダン」って言いながらつける奴が 必ずいたもんだ
それはない
>>714 それは " " でくくられた文字列が連続した場合には、連結される、という意味ですから‥‥‥。
たしかにおっしゃるとおりですね。:-)
722 :
デフォルトの名無しさん :2008/11/11(火) 01:00:03
みんなどの程度のプログラム作れるの?
hello worldとか
hello woodとか
gcc: hello.c: No such file or directory とか
coreファイル作成プログラムなら作れると思う。 あんまり自信ないけど。
読み込んだファイルがテキストかバイナリか判定するにはどうすればいいですか?
>>727 よーく考えると分かると思いますが、ファイル自体にはテキストやバイナリを区別する仕組みは無いのですよ。
あなたも、「このファイルの中身ががテキストかバイナリかどうか・・・。」を判断するには、まず拡張子などで
見当を付けていると思います。
そして、テキストエディタで開いて画面に表示された内容を見て何気なく「ああ、やっぱりテキストだな。」とか
「なんだこの変な記号や文字の羅列は! もしかしてバイナリ?」というように判断してると思います。
プログラムで判断するなら、このような仮定と推測をそのままプログラムで書くしかないです。
>>727 極端な話「ほげ」とだけ書かれたファイルがあったとします
「ほ」には今日の全為替相場の意味があり「げ」には
去年の地球の地軸の傾きの意味があるかもしれません
ビット列に割り当てる意味は無限に存在するので判定はできません
周りの情報によって推測できるだけです
730 :
729 :2008/11/11(火) 13:09:48
それでは何にも判定できないということになってしまうのでどんな推測をするかですが ビット列のパターン全てに意味を割り当てていないようなデータの場合 データのパターンに偏りが生じます 例えば奇数バイトは最下位ビットが立たないとか そいういった特徴を判定することで高確率でデータを判定できます テキストデータの場合は言語や文字コードで特徴が異なるので 判定したい文字コードの特徴を調べてみて下さい
全く、入門編スレで何を偉そうに語っているんだか。 >727が何をしたいのかにも拠るが、先頭に特徴的なヘッダがあればそのデータ、 そうでなくて非可読文字があればその他のバイナリ、そうでなければテキストってことで通常は充分だろ。
+ ; * ☆_+ : , xヾ:、__,..-‐‐:、、,へ.........._ く '´::::::::::::::::ヽ /0:::::::::::::::::::::::', テキストファイルからBOMを拾ってくるのですね = {o:::::::::(´・ω・):::} ':,:::::::::::つ:::::::つ = ヽ、__;;;;::/ し"~(__)
ってゆーかスレ違いもはなはだしいだろ
鼻肌C
perlの-Tを参考にしてみては
文字コードなんて嫌いだ
737 :
デフォルトの名無しさん :2008/11/11(火) 20:05:41
そういやLinuxはファイルの種別を拡張子で判別してないよな。
そもそも拡張子なんて窓だけのものだし
それは言いすぎだろw
下のプログラムで配列の要素がすべて0になるんだけど int_set関数で配列vc[]をすべて0にしてるけど、それがmain関数の 配列ary[]になんで反映されるの? int_set関数で何をしようがvc[]には反映されないんじゃないの? ary配列をグローバル変数?にしてなら反映されるのはわかるんだけど。 #include <stdio.h> void int_set(int vc[],int no){ int i; for(i = 0;i < no; i++) vc[i] = 0; } int main (void){ int i; int ary[] = {1,2,3,4,5}; int_set(ary,5); for(i = 0;i<5;i++) printf("ary[%d]=%d\n",i,ary[i]); return 0; }
741 :
740 :2008/11/11(火) 20:44:04
追記 ある関数内での処理をmain関数に反映させるには(返り値ではなく) ポインタを使ってやると学校では習ったんだけど・・・
引数のint vc[]はint *vcと同じだから
配列を全てコピーするのは手間なので、先頭のアドレスを渡してる
そう、逆説的に言えば、つまりそれはポインタだということ。 関数の仮引数では、最外周の配列はポインタに変えられるという決まりなので、 int *vcと書くのと同じ、関数の仮引数においてのみだが。
スレマトメテチョ
746 :
740 :2008/11/11(火) 20:57:21
なるほど、そういえば思い出しました。 学校である関数内で処理をしてもmain関数に影響しないみたいな例は 配列ではなくただのint i;とかでした。 740のプログラム例でいうと仮にint no の変数noをint_set関数内で変えても main関数には反映はされないとかいう例でした。
>最外周の配列は 正確には、Cには多次元配列というものはない(配列の要素に配列をとることができるだけ)ので、 最外周とか言わずにただ配列でいい
引数と仮引数は型が同じでないといけないんですよね?
int_set(ary,5);と書くと
aryはたしか配列の先頭の要素のアドレス(&ary[0])と習いました。
void int_set(int vc[],int no)
の int vc[]は単に配列を宣言をしているように見えるのですが、
関数の仮引数においてのみ記述形式が異なる
みたいなことを
>>744 さんは言われてるということでいいんですか?
C言語では、親分から子分へ関数の引数として配列の中身を丸ごと渡せない仕様でしたので、 親方: 「代わりに配列の先頭アドレスをポインタの値で渡してやろう。後は頼んだぞ!」 子分: 「へい、おいらはそのポインタの値を配列の先頭アドレスとして扱えばいいんですね。」 というように、ポインタ(コピー値)で渡すのです。その結果、配列データというオブジェクトの観点で 見ると、値型でなくてポインタによる参照型の振る舞いになるんです。
あーまたアレが沸くんだろうなぁw
なんとなくわかったと思います。 2次元配列に値を入力したいのですが scanf("%s",ma[i][j]); これでやるとうまくいかないのですが、 scanfで調べたところ%sのときはポインタを渡すとあったので &ma[i][j]とやったのですが、これでもうまくいきません。 どうすればいいんでしょうか?
%sは文字型配列の先頭へのポインタを要求するから maがchar ma[][][]と宣言されていないとうまくいかない
>>750 そう書いて湧くのをのを待ってんのか?w
754 :
デフォルトの名無しさん :2008/11/11(火) 21:55:06
フォントが豆腐になったのかと思った
まだ勉強し始めですが、少し不安に思うところがあります。 C#やVBには小数点数の丸め誤差がない「Decimal」や「Currency」といった型がありますが、 C言語にはfloat, double しか無いとのこと。 十進による固定小数点/浮動小数点演算をする場合どうするんですか? データに10000かけて、計算後に10000で割る、とかいうみっともない方法しかないんでしょうか
>>755 他の方法はあるけど、どのみちその型はないので自分でなんとかするかライブラリ利用するしかないね
>>755 256掛けて256でわると、ちょとカコイイよ!
2つのボールがぶつかり跳ね返る条件式が分かりません ボールA の X座標軸を xa Y座標軸を ya ボールB の X座標軸を xb Y座標軸を yb として、どのような条件でそれぞれのボールの加速度を逆にすればよいですか? 互いのボールの半径は10としてお願いいます
固定小数点も浮動小数点も、ふつーは十進じゃなけどな。
>データに10000かけて、計算後に10000で割る、とかいうみっともない方法しかないんでしょうか VBのCurrencyも内部的には同じようなことやってんじゃね?
でもVBのCurrencyは10000基準なんだな。
どこかでみっともない処理をやってるもんだよ
abcdなど?
>>758 用途によって条件式なんて変わるもんでしょ。
物理だかゲ製だかの板にでも行けば?
>>764 一番単純な方法で構いません、、、お願いします
条件そのものはCの話ではない 条件をお前が理解した上で、それをどう記述していいかわからないならともかく
>>765 接触の瞬間境界面の直線対してに線対称に速度ベクトルを変換
>>767 速さと質量一緒じゃないとそれダメじゃね?
>>758 です
それぞれの中心からの距離が20になったら加速度を逆にすればいいんですよね?
(xa-xb==10) && (ya-yb==10) の時に加速度を逆にすればいいのですか?
>(xa-xb==10) && (ya-yb==10) の時に加速度を逆にすればいいのですか? だから数学からやりなおせっての
C以前の問題
775 :
デフォルトの名無しさん :2008/11/11(火) 23:15:09
コンパイルしたら、 「配列または、ポインタでない変数に添字が使われました」って怒られました。 この場合どこを直せばいいのでしょうか?
>>775 怒られたところを見て、それに関連するところを直せばいいよ
加算 + 減算 - 乗算 * は分かるのですが、二乗とルートの記号が分かりません どなたか教えてください
そんなものありませんよ。ファンタジーやメルヘンじゃないんだから
2つの図形を同時に描写したいのですが、 1つめの図形が消えた後でないと2つめの図形が表示されません 1つめの図形が表示されてる間(sleepで止めています) 解決法をお願いします
どうしても多次元配列のイメージが出来ないのですが どうしたらいいですか。 2次元配列 縦と横 Y軸とX軸 3次元配列 x個の家の中にそれぞれ2次元配列がある 4以上は わかりもはん
>>780 知りませんでした・・・
ありがとうございました
784 :
775 :2008/11/11(火) 23:27:55
t=0.0,x[1]=2.0;x[2]=0.0;x[3]=0.0;x[4]=0.5;
>>784 x[]は配列として定義されてないからだよね。
>>755 みっともない方法が嫌な場合には、加減乗除の算術を10進で評価して
計算させるためのBCD計算ライブラリってのを自作するかサードパーティ
から購入するのが一般的です。
どんなに単純な足し算も
BCDの関数をつかえば
ちゃんとこたえがでるよ!
ハ_ハ ソースの見た目も
('(゚∀゚∩ がらっと変わるよ!
ヽ 〈
ヽヽ_)
>>779 ですが、√2 はプログラム上でどのように書けばよいですか?
できれば2の100乗などもお願いします
789 :
775 :2008/11/11(火) 23:38:57
791 :
大輔 :2008/11/11(火) 23:53:48
for文の入れ子(二重のforループ)を使って、九九の表を作成するプログラムを作りたいのですが、 どういうプログラムを組めばいいのですか? 1 2 3 4 5 6 7 8 9 1 1 2 3 4 5 6 7 8 9 2 2 4 6 8 10 12 14 16 18 3 3 6 9 12 15 18 21 24 27 4 4 8 12 16 20 24 28 32 36 5 5 10 15 20 25 30 35 40 45 6 6 12 18 24 30 36 42 48 54 7 7 14 21 28 35 42 49 56 63 8 8 16 24 32 40 48 56 64 72 9 9 18 27 36 45 54 63 72 81
int kuku[9][9]; for ( int i = 0; i < 9; i++ ) { for ( int j = 0; i < 9; i++ ) { kuku[i][j] = (i+1) * (j+1); } }
>>792 どういう環境で作ってるかもわからないし、エスパーじゃないので応えれません。
796 :
793 :2008/11/12(水) 00:06:24
for ( int i = 0; i < 9; i++ ) { for ( int j = 0; j < 9; j++ ) { ←訂正 kuku[i][j] = (i+1) * (j+1); } }
fillarcで円を描いて msleep(500)で1つめの円を止めておき またfillarcで円を描きました この2つの円を同時に描きたいのです;;
fillarcでぐぐるとJavaってでてくるけど・・・ C言語だよ、ここ
>>798 msleepで止めずに描けばいいんじゃなくて?
fillarcがスレッドセーフで尚且つマルチスレッド対応じゃなければ描画処理がロックされて 同時(描画開始→描画終了が2つ重なる)に見える描画は無理ですよ。
int *a[4]という宣言は何を指すのでしょうか?
int型のポインタの配列 長さは4 決してint型の配列のポインタではない
↑はい間違い
↑はい間違い
↑はい間違い
↑はい
>>802 int* a[4];
こうすると、、、、もう分かった?
>>782 2 100ますノートの1ページ
3 100ますノート
4 100ますノートが入ってる本棚の1段
5 100ますノートが入ってる本棚
6 100ますノートが入ってる本棚がいっぱいある図書館
マトリョーシカを想像した方が楽か?
>>782 多次元配列か。。。
縦・横とか、XYZ座標に置き換えて考えると3次元以降の壁が破れず破綻するぞw。
位置関係でイメージせず、論理的な入れ子で考えれば拡張できるよ。
グリコのポッキーを扱う配列を考えてみると → _Bool Pocky[r][q][p][o][n][m];
中袋(m本)、外箱(n袋)、ロット梱包(o箱)、ボール箱(p包)、パレット(q箱)、カーゴ(rパレット)
というように、カーゴ単位の膨大な本数のポッキー1本1本の有無を6次元で表現することも
へっちゃらです。
>>812 多次元配列がイメージしにくければ2次元配列を構造体で
くるんでその構造体をさらに2次元配列にすればいいし。
>>808 その説明はint (*a)[4]が理解できなくなるからやめとけ
>>812 1次元だろうが多次元だろうがある塊の複数形と考えれば良い訳ですね
816 :
デフォルトの名無しさん :2008/11/12(水) 16:33:34
テスト中orz 1.から100までの整数で3の倍数の整数の合計を求めるプログラムをFor文を利用して作ってください。 2.1の問題をForの変わりにWhile文で頼む
>>817 int4個の配列へのポインタである、a。
え?それって意味あるの? int *a; との違いって?
func(int(*pa)[4]){} int main() { int(*pi)[3]; func(pi); } 警告は出るけどコンパイルはできちゃった
2次元配列をまるごとmallocしたいときとかに使える。 void func(int pa[][4]){} int main() { int (*x)[4]; x = (int (*)[4])malloc(sizeof (int [10][4])); func(x); }
質問です 配列で変数を宣言したときに数値を入力しなかった変数の中身はどうなっているのでしょうか? 値を入力せずに実行すると0になったんですが 初期設定として0になってるってことですか?
宣言した場所による。 関数内の自動変数なら不定。
>>824 勝手に常に0だと思ってましたwww
助かりました。ありがとうございます
構造体の下線に続くタグ名は予約済み識別子ですか?
訂正 下線の次が大文字または下線でないかぎり、予約済みではない
そもそもCならタグ名はアンダーバーが先行しても問題ない。
830 :
デフォルトの名無しさん :2008/11/12(水) 18:44:47
DLL2を使って実行していたプログラムからDLL1を作ることってできますか?
日本語でおk
>>823-825 int a[10] = {1, 2, 3};のようにいくつかは初期化したという状況なら、
自動変数でも残りは0になるぞ。
初期化してないって書いてるじゃないか
>>833 それは
int a[10] = {1, 2, 3,0,0,0,0,0,0,0};
という意味に変換されるということですか?
837 :
デフォルトの名無しさん :2008/11/12(水) 21:31:09
838 :
812 :2008/11/12(水) 21:46:23
>>815 OK !
そう、だから2次元配列も配列であって、表(テーブル)構造ではないんだよね。
実際のメモリ上だってそうなんだから。。。
初心者にオススメのテキストってなんでしょうか?
独習C
C#ってかいてあるやつがおすすめ
独習を初心者に勧めるのはバカ もっと簡単なの教えてやれよ
>>839 『これならわかる C 入門の入門』
本当に入門だからこれやって物足りなかったら
独習でも買って頑張ってみればいい
質問があります。 あるソースコードを見ていたら、以下のような書き方で書かれていた文がありました。 文法的にどのような意味を持つのか どういった時につかえるのか など、誰か教えていただけないでしょうか? 尚、下のソースは、質問の意図を掴んで頂こうと、書き換えました。 gcc 上でコンパイルは通ります。 よろしくお願いします。 struct point2{ int x; int y; }; void doit(name) struct point2 *name; { name->x = 10; name->y = 20; } int main(){ return 0; } よろしくお願いします。
わからないところは、 void doit(name) struct point2 *name{ .... } となっている部分です。 doitとは関数名だとは思いますが、 引数が、そのまま変数のように定義され使われています。 これは、つまり、 doit(struct point2 *name){...} == doit(name) struct point2 *name{...} いう意味、認識でよいのでしょうか?
おそらく、わかんないところはコレだと思うんだが↓ void doit(name) struct point2 *name; { 以下と同じ。 void doit(struct point2 *name) { ANSI−C以前は上のようにコーディングした
ああ、そうなんですか! たしかに古い(99年)のソースコードを見てました! ありがとうございます。大変参考になりました!!
たぶん、この部分だろうけど void doit(name) struct point2 *name; { 昔の書き方だから void doit(struct point2 *name) { と同じこと
>> 848
さん。
>>846 さん
すいません。ありがとうございます。
サイトで探しても理由がわからず困惑していました。
こんな書き方があるんですね。
今ではこのような書き方をするのは良くないのでしょうか?
それとも
見習うべきですか(使い方に依ってなど)
>>845 そう、それは関数の引数リストの旧来の書き方です。
int hoge( a, s ) // ANSI以前のK&R時代
int a;
char *s;
{
:
}
↓現在はこう書いてますね
int hoge( int a, char *s )
{
:
}
>>850 さん
ありがとうございます。
では、現在の書き方で統一します。
さすがに詳しい人が多いですね。 WEB上に、こういった情報がなく、途方にくれていました。 みなさんありがとうございます。
>>840-843 お答えくださってありがとうございます。
明日、書店で『これならわかる C 入門の入門』を
購入してみようと思います
>>846 >>848 被っちゃったなw
>>849 コンパイラに、K&Rスタイルを許容するというオプションがあれば
それを使ってコンパイルを通すことができるケースが多いのですが、
ルーズなので弊害が多く、推奨はいたしません。
きょうびプログラミング学んでるやつで2chやってないのがいたら逆に尊敬する
初学者を突き放したかんじのサイト多いからね 初学者に対してK&Rが理解できないようじゃあなたはプログラミングに向いてません。やめたほうがいいです みたいなサイトどっかにあったな
int(*F)(int); int(*A)[5];
K&Rで分からなかったら、まじ向いてないよ。
プログラミング初心者にかかれたもんでもないだろあれ
K&R分からない
かにめしでも食ってろ
BM法による文字列検索で、文字列をワイド版にした場合のNext表はどうすればいいですか? 文字種分の配列を宣言するか、動的に確保するか悩んでいます。
K&Rの書は当時、Cコンパイラのルーズさ、ズボラなところをフォローするための書として 重宝だったことは確かだ。 ただし逆に解釈した人が増えたので聖書扱いとなった。
コンピュータ界にとっての1980年代は、社会文化でいえばアメリカの西部開拓時代。 今となっては物語「大草原の小さな家」と一緒だよ。後で古典書として読むならいいが 教科書にはならない。
>>865 >現在は、コンパイラの最適化によって、この程度のループプログラムなど、
>よほど変則的な書き方をしないかぎり速度差はほとんどありません。
・・・・・・最近の処理系でも、ポインタ周りの最適化は困難を極める
C99ではrestrictが導入されたぐらい
最大限のパフォーマンスを(やろうと思えば)追及できることが
場合によっては重要だし、Cはそういう局面でも使われる言語でないの
868 :
デフォルトの名無しさん :2008/11/13(木) 05:35:48
>>865 strcpy を「わけのわからない」などと書いている筆者自身が「向いていない」な
C言語はこのままでいいんじゃね? ドライバもアプリも書けるマルチパーパスなプログラミング言語は他に無く、 ミニコンのUNIX時代からの制約と理不尽さを多く引き継いでいながらも、 アセンブラと高級言語との中間に位置するから長らく生き残ってきたんだし。 今でもスループットやパフォーマンスを強く要求されるミドルウェアなどでは、 C言語が現役でバリバリ使われている。
>>865 >つまり、現在でもポインタでプログラムを書くことで高速化できるようです。
>といっても、特別高速化したい部分以外は配列で問題ないと思います。
>最近のCPUは、命令を変換し、並び替え、先読みするなど複雑な動作をしており、
>アセンブラレベルでのカスタマイズが速度差として如実に表れるわけではないので。
あの・・・たまにでいいので組み込み系のことも思い出してあげてください・・・(´;ω;`)
そのサイトも私の取り扱い注意のリストに入っている。 初心者には向かないと思うのだよね。
872 :
デフォルトの名無しさん :2008/11/13(木) 10:01:24
すみません質問です。 C言語DXライブラリという環境でアクションゲームを製作しています。 int stage1[5][15] = { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,2}, {0,0,0,0,0,0,0,0,0,0,0,5,0,0,2}, {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}, }; というのをfopenを使いtxtファイルから読み込んで配列をソースにかきこむのではなくしたいのですが、 fopenの使い方が調べてみたところうまく理解できません。 どのように使えばうまくいくのでしょうか・・・ よろしければ教えてください。
バイナリーファイルにして丸ごと読むのが楽だけど、 TEXTでもやってみりゃいい、fopen使って。 で、どんなコード書いてみたの?
FILE *fp; fp = fopen('stage.dat', "r"); for(i = 0; i < 5; i++) fgets(stage[i], sizeof(stage[i]), fp); fclose(fp);
教師の、ポインタ渡しって表現になんか違和感を覚えます。 ポインタの実体渡しじゃないんですか?結局関数の引数に渡してるの値ですよね?
実体渡しというか、ふつう値渡しという 「ポインタ渡し」は、「ポインタの値渡し」の省略としてしばしば使われる >結局関数の引数に渡してるの値ですよね? そうです
すっきりしました!
ポインタ渡し=ポインタの値渡し=ポインタの実体渡し でいいです。 ポインタ=指し示すもの≒参照情報w ですから。
わけのわからんこと書くな
>>670 亀だが、これはフォーマットが何の画像を読み込もうとしたのだろうか?
24ビットBMPか?
ちーげんごってむずかちいね。 むずかしいことやりたい人は「アセンブラ」 オブジェクトな感じでやりたい人は「Java」 オフィスをバリバリつかう人は「VB」 これで整理したらいいのに。ほかはいらない
JAVAこそいらん
C/C++ですべておk
中小規模の軽量アプリやフリーウェアはC/C++で十分。 商用・業務系アプリは.NET軍団のC#/VBで十分。 Javaは、、、、Sun系のITスクール教材として十分。
COBOLのこと、時々でいいから思い出してあげてください
スレ違いだ 失せろゴミども
質問です。 C言語においては関数の最初に変数の宣言をしなければいけないとのことですが ポインタ変数の宣言は関数の最初じゃなくてもいいのですか?
>>888 ポインタもアドレスを入れる変数です
最初じゃないとだめです
関数というより、ブロックの最初だけどな
質問なんですが switch文では表現できないif文はあるのでしょうか?
無い
複雑な条件判断?
回答ありがとうございます。
そりゃまあ、case 0: とdefault:があればすべて可能ではあるなw
897 :
892 :2008/11/13(木) 17:56:16
場合に応じて使い分けるのがいいとはわかっているのですが すべて書き換え可能なのか知りたかったのです 反例みたいなものがあればおしえていただきたかったのですが 可能なのですね ありがとうございました。
case に変数は突っ込めないこととか
899 :
デフォルトの名無しさん :2008/11/13(木) 19:31:33
初めまして。調べてみたのですが全くわからないので質問いたします。 C言語を覚えたいのですが、これは絶対知ってろ!て言う事はありますか? 調べてるとアルゴリズム言語を知らなくちゃやれないみたいで・・・ C言語を使えるようになったら、サウンドプログラムを使いたいと思っています。 関係ないとは思いますが、エクセルは基本的なことしか出来ません。 パソコンに関してもほぼ無知です。 よろしくおねがいします。
"これだけ"なんていう部分はないので普通に勉強してください
C言語以外のことで、という意味なら、 実際にプログラムを作る上ではその環境のことを知ってないと話にならない たとえばWindowsならWinAPI あとは現実に流通しているテクノロジ(画像、音声、通信、圧縮技術etc)を使いたいなら もちろんそれについても勉強しなきゃいけない
日本語(母国語)と英語(世界共通語) あとエクセルではなく基本的なコンピュータの知識 自動車の運転ではなく、飛行機の操縦並に専門知識が要る世界、Cは
903 :
899 :2008/11/13(木) 19:50:29
>901 C言語以外でって事です。 900さんの言われた通りに勉強するので、順番で一番はじめになにを覚えればいいでしょうか?
>>903 windows向けのプログラムであればコンソールアプリかそうでないか。
それ以外のマイコン上で動く物とか某メーカーのゲーム機の非公式開発
とかターゲットで導入は変わるかなあ。
どっちにしろ開発環境を整えるというのが第一関門
それが終わって初めて初歩的な文字を出すプログラムを作って・・・
と徐々にスキルアップかな。
入門書を買いなよ
doubleのNaNを表す定数は無いのでしょうか。
907 :
872 :2008/11/13(木) 20:27:57
>>873 >>875 返答ありがとうございます。
stage01.txtという
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2
0,0,0,0,1,0,0,0,0,0,0,0,0,0,2
0,0,0,0,0,0,0,0,0,0,0,5,0,0,2
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
というテキストを作成し
それをstage1[5][15]に入れたいのですが、
FILE *fp;
fp = fopen( "stage01.txt","r") ;
for(i = 0; i < 5; i++)
fgets(stage1[i], sizeof(stage1[i]), fp);
fclose( fp );
というソースにして実行したら
'fgets' : 1 番目の引数を 'int [15]' から 'char *' に変換できません
というエラーがでました・・・
何が間違って言うのでしょうか・・・
よろしければ教えてください・・・おねがします
908 :
899 :2008/11/13(木) 20:30:40
おすすめの入門書はありますか? そこら辺の本屋などで売っていますでしょうか? やはり通販で買わなければ無いものなのでしょうか? そこら辺で売っているなら明日買いに行きます。 教えてくれた方々ありがとうごさいます。
C言語は第三者から教えられて勉強したりするものじゃないので、学校の生徒のような 一方通行の教育を受けている時と同じ心構えではやっていけないよ。教科でなく学科。 どうやって学ぶか、そして何から始めればいいかは、総て自分で考えて決めなくてはならない。 学ぶ過程では何回も理解の壁にぶち当たり、試行錯誤でプログラムを組むことも多いだろう。 とにかく何が何でも理解して前に進み、一定の成果を得ようという、己の本能と信念だけが 修得の原動力であり牽引力だ。
>>908 そのへんの本屋に売ってる
本は人によって価値が変わるから立ち読みしてみて良さそうなのを買えばいい
もしそのへんの本屋に良さそうなのがなかったらAmazonでレビューを参考にしながら買えばいい
つーか初心者用質問スレってなんでこんなに語りたがりが多いんだろうな
普段下っ端だから上に立った気分を味わいたいのだろうきっと
回答者なんて基本語りたがりだろう
>>907 まずfgetsの仕様を声に出して3回読んで
その上でわからないことを他人に伝わるように書き込むこと
良く見たら>875がものすごい大嘘書いてるwwwwwwwwww
Cみたいに高級と低級の間ぐらいでCよりスマートな言語ってないの?
objcとか
D
printfでコンソール一行出力しますよね。 その一度出力した行を書き換えることってできないんでしょうか?
'\b'とかsystem("cls") とか
921 :
デフォルトの名無しさん :2008/11/14(金) 00:15:45
>>907 int stage[5][15]; としているだろう?
char stage[5][15]; にすると警告は消えるはず
ただし、整数値を読み込みたいのなら知ってのとおり char ではなく int な
入力関数は文字列を読むなら fgets、文字列を数値として読むなら fscanf だ
どこかのバカが吹聴しているように一旦 fgets してから sscanf する気なら
stage01.txt のような形式に対しては char stage[5][30]; が必要だぞ
>>920 出した文字数分printf("\b\b\b・・・・・・")
ですよね。やってみます。
for(i=0;i<N;i++){ x[i]=x[i]+a*dt y[i]=y[i]+a*dt } と struct{ double x; double y; }position[N]; for(i=0;i<N;i++){ potision[i].x+=a*dt; potision[i].y+=a*dt; } で計算時間を比べた場合、構造体の方が時間かかってしまうものですかね?
すいません positionの下のつづりが間違ってますが
>>924 実測すればいい
構造体のほうが早くなる場合が多いと思うが、環境によるんだろうな
>>924 Nが巨大だと、キャッシュの使い方が変わるので一概には言えなくなる。
要は、実測ありき。案外、大差ないかもしれないし。
同じと思っていい。分かりやすい後者を選ぶべき。 突き詰めればCPUキャッシュに乗るかどうかで大違いだが、 よっぽどのことがない限りそこまで気にすることはない。 (速さを求めるならそれ以前にやるべきことがたくさんある)
>>924 キャッシュを考慮に入れると、構造体のほうが速いかもしれない。
\rも\bも、何が起きるかは環境依存だ。 カーソル位置が戻ることについてはどちらも同程度には期待できる。
934 :
デフォルトの名無しさん :2008/11/14(金) 16:01:24
>>933 うそこけ
ISO/IEC9899 5.2.2 Character display semantics
で規定されているだろ
「90%である処理をする」という条件のif文を書きたいんですけど if (rand () % ○○){} else {} の○○の部分には何と書けばいいのでしょうか?
100 < 90
%演算子の意味わかってる?
>>935 10にすれば余りは0〜9になって、
90%で非0になるな。
気分的にはもにょるがw
>>935 正確に90%になることは保障できない
rand関数は0からRAND_MAXまでの数字を返す
つまり返される値はRAND_MAX+1通りなので、これが10の倍数でなかったらどうやっても90%にならない
近似でよいなら、if(rand()%100 < 90) を使う
ただし、下位のビットを使用するため乱数としては問題があるかもしれない
%の意味はわかっていましたが テキストのrandの例文に%があったのでそのまま載せてしまいました むしろrandの意味がわからないのですorz 回答レスくださった方々ありがとうございます とても参考になりました。 100<90でいきたいと思います 今つくっているプログラムが完成したら またrandの解説をwebで探してみます お世話になりました
941 :
デフォルトの名無しさん :2008/11/14(金) 16:33:22
失礼します、質問です。 1 2 3 4 5 3 7 5 6 のようなデータの1〜5行目を読み込んだあと、 2〜6、3〜7、4〜8・・・と連続で読み込んでいくプログラムを教えてください。 よろしくお願いいたします。
>>940 0〜RAND_MAXまでの間のランダムな数字を返すんだお
>941 「のようなデータ」の意味は? ファイルなのか?標準入力なのか?テキストなのか?バイナリなのか? 読みこむとはどのように読み込むのか? 文字?文字列?数値?
>>942 ありがとうございます
意味がわからないまま使うよりも知っていたほうがはるかにいいので助かりました。
>>941 1〜5行まで一括で読む → 配列なりにつっこむ a[0]〜a[4]
※1
(なんか知らんが やりたい処理)
先頭へ配列をシフトする a[i-1] ← a[i] : i=1→4
次の行を読む → a[4] に突っ込む
※1からループ
ところてんをイメージしてくれ
>>941 1行目を読んだあとにfgetpos()で位置を記憶して、
2〜5行目を読んでからfsetpos()で2行目に戻る
後はくりかえし
948 :
デフォルトの名無しさん :2008/11/14(金) 16:46:28
941です。 おかげさまで解決しました ありがとうございました!
ありえねえwwwwwwwwwwwwwwwww
読み込んだ行と配列のindexの関係がちょと特殊だが 上のほうで % が出ているのでついでに 1行読む a[i%5] に突っ込む i++ i が 5以上の時にやりたいことやる
>>949 宿題スレ行ったみたい 解決したのは投稿先w
952 :
デフォルトの名無しさん :2008/11/14(金) 17:11:17
?と:を使った制御文みたいなのがあるじゃないですか。 あれの使い方を詳しく説明したページないでしょうか? ?で検索しても引っかからなくて困ってます。
954 :
952 :2008/11/14(金) 17:21:44
>>953 検索できました!ありがとうございます。
C言語で、ツェラーの公式を使って、与えた年月日の曜日を判定する プログラムを作っているのですが、計算結果が負の値になることがあって そのときだけうまくいきません。 (例;2009年4月1日。関数printfを使って計算結果を出力すると-3と出てきます。) wikipediaでは、プログラミング言語上では変形式が用いられるとありましたが どのように公式を記述とうまくいくようになりますか?
956 :
デフォルトの名無しさん :2008/11/14(金) 17:46:41
デバッグの基本をやるだけじゃないか
>>956 言い方がまずかったと思うので書き直します。
今、ツェラーの公式の部分は、
h = (q + ((m + 1)*26/10) + k + (k/4) + (j/4) - 2*j) % 7
と、そのまま書いていますが、
別の記述の方法があるのですか?
ということです
958 :
デフォルトの名無しさん :2008/11/14(金) 19:16:32
C言語で配列の要素数を求める方法ってありましたっけ? 例えばPerlだと、 $cnt = @list; ってやれば、@listの要素数が$cntに代入されますけど・・。
>>958 配列のサイズを配列の1要素のサイズで割れば個数出るよ
wikiみてんならもう少し検索すればいいのにね。
どのwikiを?
>>955 が見てるのはwikipediaであってwikiじゃないのに、
このスレのどこからwikiが出てきたんだ
wikipediaをwikiと略す人たちが世の中にはいるんだよ
wikipediaなんぞwikiと同等程度の信頼性しかないって皮肉を込めてwikiって言ってんじゃないの?
965 :
デフォルトの名無しさん :2008/11/14(金) 20:52:35
>>957 期待値は何で、いつの時点から期待値から逸れるのかをはっきりしろよ
967 :
デフォルトの名無しさん :2008/11/14(金) 21:00:28
まじすか。。。 > wikipediaでは、プログラミング言語上では変形式が用いられるとありました ↓ > そのまま書いていますが、別の記述の方法があるのですか? 蒟蒻畑をそのまま飲み込むと死んじゃいます、と注意書きがありました。 ↓ 蒟蒻畑を食べさせたら死にました。そのまま飲み込ませたのですが何が悪かったのでしょうか?
969 :
デフォルトの名無しさん :2008/11/14(金) 21:17:03
カップラーメンの説明では、お湯を注いで3分待つと食べられるとありました。 ↓ お湯の注ぎ方と3分の待ち方がわかりません。だれかお湯を注いで3分待って見せてください。
>>969 みそ汁の作り方までは授業でやりました。
>>957 最後にさらに 7 足してもっかい % 7する
そして1を引きます
さらに4をかけて5で割ります
負の値に成ったら、正になるまで7を加え続ければよい。 (7を法として合同な0..6の数を見つけるということ。)
>>977 FFもファイファンもどっちも元は同じだけど
wikiとwikipediaは全然違うじゃん
ツェラーの公式を使うのが、そんなにつぇらい(辛い)のかね?
呼んだかね。
ちょっwwwwwwおまっwwwwwwwww節子、それファイ・ファンやない、 ファン・ファイや。
983 :
デフォルトの名無しさん :2008/11/15(土) 03:22:29
returnについて聞きたい事があるんだ.詳しいやつ教えてくれ.…教えてください. 以下の質問は,C90かC99に準拠した処理系での話で頼む.移植性が失われると困るんだ. 本題. 関数でreturnにはstaticな変数を用いろって話はよくわかるんだ.ローカル変数だと,関数終了時に解放さ れてしまうっていう話だって本で読んだ.引数みたいに,返値も値渡しだったらこんな心配は起きないんだ けど. staticを使うっていうと,例えば,こんな感じだよな. int func(int a) { static ret;ret = a*a*a; return ret; } (こんな関数マクロでやれよってのは無しで.あくまで例えだよ.) (1)これだとどうなるんだ?これは大丈夫なのか? int func1(int a) { static ret;ret = a; return ret*ret*ret; } (2)いっそこんなのどうだ?これは大丈夫なのか? int func2(int a) { return a*a*a; }
>>983 >関数でreturnにはstaticな変数を用いろ
そんな馬鹿なことどこで聞いたんだ?
(2)で全く問題ない、たしかに関数終了時に変数は解放されるが、値だもの
>>978 全然違うって言うほど違わないよ。
wikipediaはwikiに含まれるわけだし。
むしろstatic使わない方がいいというかその例だと必然性がないだろ
>>983 盛大に勘違いしているようだが、staticにしなければならないのはローカル変数へのポインタをreturnする場合だ
ローカル変数自体をreturnするときは常にその値のコピーが生成されて呼び出し元に戻される
int func(int a) { static int ret; ret += a; return ret; } とか int func() { static int ret; return &ret; } みたいなのとかと勘違いして無いかね
>>983 値を返すよ。
static使えよって話のはたぶんオート変数のアドレスが値になるケースかな。
はっきり言うと、君はC90だのなんだのを気にするようなレベルにはぜんぜん達してない
移植性という意味ではマルチスレッドに対応できなくなってるね
>>983 return は、続く式の値を関数の戻り値として呼び出し元に返す。
だから、戻り値として返される値そのものは、その式に使われた変数が
局所変数であるかに関わらず、常に確実であることが保障されている。
問題は、値そのものが確実であっても、それがポインタであった場合、
その値の指す先の領域が正しくアクセス可能であるとはかぎらないことにある。
自動変数のために確保された領域は関数を抜けた時点で不定となるので、
そのような領域へのポインタを返すことは安全でないということになる。
そのため、static な変数として宣言するという手法が存在する。
念のために言っておくが、static なポインタを宣言しても何の意味もない。
static な領域を宣言して、そこへのポインタを返す。
ただし、static な変数はプログラムの起動時から終了時まで、
関数の呼び出された場所や数に関わらず常に1つだけ存在するもので、
呼出しごとの独立性もなければ初期化式の意味も異なることを忘れてはいけない。
規格の互換性を気にする前に、記憶クラス指定子についてもっと理解を深めること。
994 :
デフォルトの名無しさん :2008/11/15(土) 04:14:40
(3)もしくは定数を用いて,こんなのは?これは絶対に50が帰ってくるんだろうか? int func3(void) { return 50; } (4)最後に配列で.例が酷くてすまん.いいのが思いつかなかった. 引数のnはN[]の大きさ.これは,配列N[n]の中で,a<N[i]<bを満たす,一番最初のN[i]を返す関数. int lookup(int N[],a,b,n) { int i; for(i=0;i<n;i++) { if( N[i]>a || N[i]<b ) return N[i]; } return EOF; } これだと,returnにN[i]を用いてる.N[]はポインタが渡されてるから問題ないと思うんだ. でも,iがstaticじゃないから,N[i]のiの部分に不安が残る.これちゃんと動くだろうか?
995 :
983 :2008/11/15(土) 04:16:23
10分に一回しか書き込めないから二回にわけて書き込んだらすでにレスがあった.
動く
まずは式を評価するということから理解が必要だな
値渡しだということについてだな
> 返値も値渡しだったらこんな心配は起きない 値渡しだから心配しないでね
いまだせんげっとー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。