やっべ! 2はコンパイラ用だった、、スマソ
まもなくここは 乂1000取り合戦場乂 となります。
\∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!! ,,、,、,,,
/三√ ゚Д゚) / \____________ ,,、,、,,,
/三/| ゚U゚|\ ,,、,、,,, ,,、,、,,,
,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/
//三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
∪ ∪ ( ) ( ) ( ) )
,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
,,、,、,,, ( ) ( ) ( ) ( )
http://big.freett.com/scheme_a/num1000.swf
1000!
>>5 前スレの
>>990 に「訊け」を「聞け」にしてくれと
言われたからそうしたんだが。
誰か過去スレ一覧を取得できる人がいたら載せてちょ。
>>9 =1
なにぃっ!おいっ、責任者(前スレ990)出てこいっ!
誰だよ前スレの 990 は・・・。 1 も、漢字の意味を考えてくれ。 つーか、前スレを凄い勢いで終了させたのは誰だ。
次からスレ立てる人は、
>>6 の AA デフォな。
>>14 =2
ばかもんがぁ!しかも2getするという失態までおかしおって!
そろそろC言語の話題をしよう。
>>14 は、死ね・くたばれ・消えろ・失せろ・潰れろ・馬鹿・あほ・間抜け・ドジ。
ポンコツ・トンチキ・ガラクタ・クズ・ゴミ・カス・最低以下の下劣・下等種族。
劣等種族・下衆野郎・腐れ外道・邪道・外道・非道・ウジ虫・害虫・ガン細胞。
ウィルス・ばい菌・疫病神・病原体・汚染源・公害・ダイオキシン・有毒物質。
廃棄物・発ガン物質・猛毒・毒物・アメーバ・ダニ・ゴキブリ・シラミ・ノミ。
毛虫・蠅・蚊・ボウフラ・芋虫・掃き溜め・汚物・糞・ゲロ・糞虫野郎・ほら吹き。
基地外・デタラメ・ハッタリ・穀潰し・ろくでなし・ごろつき・ヤクザ者。
社会の敵・犯罪者・反乱者・前科者・インチキ・エロ・痴漢・ゴミ・シデムシ。
ゴミ虫・毒虫・便所コオロギ・詐欺師・ペテン師・道化師・危険分子・痴呆・白痴。
魔物・妖怪・悪霊・怨霊・死神・貧乏神・奇天烈・奇人・変人・毒ガス・サリン。
ソマン・マスタードガス・イペリット・クソブタ・ブタ野郎・畜生・鬼畜・悪鬼。
邪気・邪鬼・ストーカー・クレイジー・ファッキン・サノバビッチ・シット・ガッデム。
小便・便所の落書き・不要物・障害物・邪魔者・除け者・不良品・カビ・腐ったミカン。
土左衛門・腐乱・腐臭・落伍者・犯人・ならず者・チンカス・膿・垢・フケ・化膿菌。
放射能・放射線・鬼っ子・異端者・妄想・邪宗・異教徒・恥垢・陰毛・白ブタ。
ケダモノ・ボッコ・ろくでなし・VXガス・ヒ素・青酸・監獄・獄門・さらし首。 打ち首・市中引きずり回し・戦犯・絞首刑・斬首・乞食・浮浪者・ルンペン・物乞い。 放射性廃棄物・余命1年・アク・割れたコップ・精神年齢7歳・3審は必要なし。 不良品、規格外、欠陥品、不要物、埃、掃き溜め、吹き溜まり、塵埃、インチキ、居直り。 ふてぶてしい、盗人、盗賊、残忍、残酷、冷酷、非情、薄情者、ガキ、クソガキ。 ファッキン、ガッデム、サノバビッチ、シット、ブルシット、ボロ、ボッコ、妄信。 狂信者、有害物質、毒薬、猛毒、発ガン物質、誇大妄想狂。 他人の悪口は山ほどほざくが反省は一切しないガキ根性野郎、腐れ根性。 腐って歪んだプライドの持ち主、狭量、ボケ、ボケナス、アホンダラ、たわけ。 怠け者、無能、無脳、脳軟化症、思考停止、アメーバ、単細胞、蠅、蚊、カビ。 腐敗、膿、下劣、下等生物、劣等種族、クレイジー、マッド、ストーカー。 人格障害、守銭奴、見栄っ張り、ええ格好しい、粗製濫造品、偽物、似非 イカレ、乞食、浮浪者、ルンペン、狼藉者、放蕩息子、道楽息子、極道息子。 迷惑、困りもの、厄介者、村八分、異端者、アウトサイダー 大虐殺者。ナチスドイツ、731部隊、ポルポト派らと同類。 そして、こんな悪口を言うために労力を使う価値もないクズ
>>22 まあ、お約束の AA (?) という事で。
インフォシークの国語辞典を「聞く」で調べたら (4)(「訊く」とも書く)たずねて、答えを求める。問う。 「名前を―・く」「自分の胸に―・く」 とあったぞ。 「訊く」ではヒットしなかったし、別にいいんでない?
>>24 分かっているよ。
随分とまた懐かしいコピペだ。
きく、なんてややこしい言葉使うからダメなんだ 次から 「C言語のことなら朕に尋ねよ」 にしよう
(・ロ・)ホ,('ロ')ホ--ッッ!!!… C言語質問スレ PartX これがいい。
つーか周りに合わせて、「C 相談室」 でいいやん。 元々のスレタイが、ビルジョブスの好き勝手で付けたものだし。
「C (゚д゚)ウマ-」 「C (゚Д゚)ハァ?」 「C (・∀・)イイ!!」 「C ( ´,_ゝ`)フーン」 「C ヽ(´ー`)ノ ヤレヤレ」 「C (゚∀゚) アヒャ」
いっそシンプルに「C」だけでいいんじゃない?
見つけにくいだろ
C, or not C. That's the question.
「Cと、土曜深夜の愉快な仲間たち」
20 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/04(月) 00:50 悲惨な1スレの予感…
まだ起きてるのか・・・
今は何してるんだろう・・・ 93 名前: ビル・ジョブス 投稿日: 2000/09/09(土) 16:17 >91 おぅ!そりゃ知ってるよ!おまえみたいなおバカなクソガキに 言われるまでもない。 ちなみに今は、CEがメインだからUnicodeオンリーだけどな!
誰か 35-36 のサマリー作る勇気のある奴いないか?
43 :
デフォルトの名無しさん :02/11/10 09:40
アサートすると、標準出力にメッセージを出しますよね? ね? でも、クロス環境などで、ターゲットに標準出力がないばあい、やっぱ アサートさんを書き換えないとだめ? ですよねえ、きっと....
if(BOOL)、 if(!BOOL) or if(!(BOOL)) だよ!==は絶対変だよ!
またコテハン考えなきゃだめってことか・・・
47 :
デフォルトの名無しさん :02/11/10 13:36
math.hのpow()ってどういうアルゴリズムになってるんでしょうか? ググったんですが、いいサイトが見つからなくて…
ソース見ればよい
前スレにでてたと思うが。
50 :
デフォルトの名無しさん :02/11/10 13:45
>>49 あ、そうなんですか。見てみます。
>>48 そう思ったんですが、どうやって見るのか分からなかったので…
すみません。
>>47 アホなりに考えてループ作ってその中でかけ算。
なんか色々やってみたら、gcc-3.2.tar.gzってファイルをダウンロードできたんだけど これ違う?
57 :
デフォルトの名無しさん :02/11/10 14:01
exp(y * log(x)) って感じで計算してるみたいですね。 ソースいろいろ探してみたんですが、見つかりませんでした。 VC++のMATH.H見てみましたが、意味が分からなかったです…
59 :
デフォルトの名無しさん :02/11/10 14:06
>>57 ありがとうございます。
これだけ複雑だとやっぱりpow(x,3.0)よりもx*x*xの方がアルゴリズム的に優れてそうですかね?
>>60 アルゴリズム的に、ってのが分からんが速いのは確か
>>60 乗算の繰り返しだと有効数字の大きい実数で桁落ち起こすんじゃないか?
log使うのは精度保つためだと思ったな。
スピード的にも3乗くらいならそれでもいいがな。
>>59 今BCC使ってるんだけど、gccの方がいいかなあって。
学校はGCCとVC++なんだよねー。
あー・・・
今ビット演算を勉強してるんですけど、 こんなこといったいどういう時に使うんでつか?
>>65 バイトより細かいレベルでデータを処理したいとき。
67 :
デフォルトの名無しさん :02/11/10 14:52
集合としてあつかうとき
フラグ
69 :
デフォルトの名無しさん :02/11/10 15:04
ブラクラ
通報しますた
>>63 なんで精度が良くなるの?
詳細キボンヌ
すみません。最後にひとつ。 pow(x,y)のyがdoubleの時はlog介してるため、powは遅くなりますが、 yがintの時ってどうなるんでしょうか? double ipower(double x, int n) { int abs_n; double k = 1.0; abs_n = abs(n); while(abs_n != 0){ if (abs_n & 1){ k *= x; } x *=x;abs_n >>=1: } if (n>=0) return k; else return 1/k; } って、感じだと思うんですが…やはり、直接やるよりはどっちにしても遅いですかね?
>>72 直接って何だ
ソースはglibcやBSDのを探して嫁
一般的なアルゴリズムの解析はKnuthの本とかにある
これ以上はアルゴリズムスレか数値計算スレにいくべし Cとは関係ない
それとアルゴリズム事典丸写ししたら、ひとことそう書け
>65 低位レイヤーのアプリ作るとき、回線のデータから必要なデータを 取得したりするのにマスクしたビットをシフトさせて使うよ。 マジレスしてしまった。
.NET Framework SDKをダウソしたらCコンパイラも付いてきた。 (こちらもコンパイルはコマンドラインからだが) VB、C#しかついてこないと思っていたから、ちょっとトクした気分。 160MBのダウソはつらかったが・・・。
恐れ巣だが… pow(x, y)がexp(y, log(x))を計算している理由は、 yが整数でない場合を考えれば明らかだろう。
>>65 2倍、4倍、8倍などしたいときや、1/2、1/4、1/8したいとき、
通常の掛け算/割り算命令より早くできる。
例:左に1ビットシフト:2倍
右に1ビットシフト:1/2
>>72 logはきわめて多項式で近似しやすい関数として知られている。
expもそう難しくない。
powの演算回数は、キミが書いたものより平均では少ないかも。
これ何処まちがってる? #include <stdio.h> #include <math.h> int main(void) { unsigned x; int s; printf("自然数を入力してください:"); scanf("%u",&x); printf("何ビットシフトしますか:"); scanf("%d",&s); printf("%uを左に%dビットシフトした値は%uです。\n",x,s,x<<s); printf("%uと2^%d乗の積は%uです。\n",x,s,x*(pow(2,s))); printf("%uを右に%dビットシフトした値は%uです。\n",x,s,x>>s); printf("%uを2^%d乗で割った商の整数部分は%uです。\n",x,s,x/(pow(2,s))); return(0); }
>>56 OS は?
Redhat 系 Linux だったら rpm でインストールすればいいし、
Windows なら mingw や cygwin が楽。
powはdoubleを返す。 printf("%uを左に%dビットシフトした値は%uです。\n",x,s,x<<s); printf("%uと2^%d乗の積は%uです。\n",x,s,x*(1<<s))); printf("%uを右に%dビットシフトした値は%uです。\n",x,s,x>>s); printf("%uを2^%d乗で割った商の整数部分は%uです。\n",x,s,x/(1<<s));
>>81 cygwinはインストールしたけど
意味不明
>>82 doubleか。
そうじゃなくて、ビット演算と2のべき乗で同じ値が出ることを
確かめるプログラムを作ろうとしてた
>>80 > printf("%uと2^%d乗の積は%uです。\n",x,s,x*(pow(2,s)));
> printf("%uを2^%d乗で割った商の整数部分は%uです。\n",x,s,x/(pow(2,s)));
%uじゃdoubleを正しく表示できないダロー
printf("%uと2^%d乗の積は%uです。\n",x,s,x*(int)(pow(2,s))); printf("%uを2^%d乗で割った商の整数部分は%uです。\n",x,s,x/(int)(pow(2,s)));
>>85 知らんかったから。doubleは%fだべ。
またひとつ賢くなった
>>83 インストーラ(setup.exe)に devel というカテゴリがあるので、
そこにあるのを全部選択してインストールすべし。
>>88 なんかさ、DOS窓見たいのが出てきたんだけど
それ使う?
90 :
デフォルトの名無しさん :02/11/10 18:24
同じC言語をやっている仲間としてお願いがあります。 構文解析木について教えてください。出来ればサンプルプログラムと簡単な解説もお願いします。 よろしく。
ぐぐって自分で有益な情報を探そう。
ビットシフトが2のべき乗倍になるのはあたりまえだよね。 n進法で1桁ずらせばn倍(n分の1)したことになる。 x桁ずらせばnのx乗倍(nの-x乗倍)したことになる。 10進で考えてわからんならくそして寝たほうが良い。
>>89 そ。Cygwin Bash Shell というタイトルのウインドウで作業をする。
gcc -v と打ってみな。
>>93 同じ仲間じゃあないですか。
ここに書いておけば次に同じ質問がきたらここをみろ、っていえるし。
よろしくブラザー。
96 :
デフォルトの名無しさん :02/11/10 18:32
>>92 (病理学的なぐらい)厳密には、C89 の規格ではそうとは限らない。
>>92 わからないとでも思ってんのか?
本に載ってたのをpow()を使ってやってるだけだよ
分からないやつがいるかもって思うお前のほうが寝たほうがいいよw
>>98 やってみないとわからないようなやつはくしして寝たほうが良い
すまんな、s++もわからん人が多いもんでな。
>>98 すぐ煽りにつられるようなアフォは糞して…
C++はわからない
構文解析木とは、構文を解析した結果できる木構造のこと。 これで良いだろ。
>>102 あれは覚えようとする気力をなくす言語だ。
C言語やってるだけでブラザー呼ばわりされても…
>>99 日本語理解できない香具師は死んだほうが(・∀・)イイ!
>本に載ってたのをpow()を使ってやってるだけ
>>106 DQNなプログラムをコテハンでさらす厨房のくせに態度でかいよ(w
>>107 お前も昔はこうだったんだろうが。
態度のでかさに経験なんか関係ないよ。
才能だけ。さ・い・の・う。わかる?
で、
>>80 のプログラムはちゃんと動くようになったのか?
コテハンのネタレスと厨房の煽りのみで続いてるスレはここですか?
>>108 たしかにその態度のでかさは才能だろうがウザイ。
少なくとも漏れはお前みたいな間違いをして、人に聞かないとわからない
なんて間抜けな経験はない。
次のDQNなプログラムはまだかい?
次はどんな恥さらしプログラムの相談かな?
>>109 なったよ。doubleだって知らんかったけど%fで解決した。
まあ
>>111 みたいな中途半端な煽りはつまんねーけど
またここに来てやるよ。お前らを使ってやってるんだから
ありがたく思え。
,,,,,,,,,,,,_,, ,,,, ,,、‐'"~ 'i.゙i''i,ヽ..., ,.r''' i''゙ノ ゙゙,ニ''く / r‐'''''i i, (" ヾ, ,' , ゙~´゙ー ゙´ .', ,' ,: _,/,,_:;.;l ,l i .!.l.l',.i.l:.. , l ,i,l i l l .::/.,rツ=リ,ji'!;|:.:j;rl≦ト、;' j:. lj' l,. l.l.::/-'〃i'''i, ',ソ!ンシr'i.゙'リ|/://:リ 異議あり! ,' 'ivl/" lゝ'l '"'゙ l'r'! ィンシ /' ,' :::{ r, ''゙‐゙ ..iソ {ノ" ,、‐''""''、 / .:::゙'‐-、. -- ノ ,、‐゙ ', . /,r''''''ー‐--、:'i‐ 、、,,,,,.、 -''゙ ゙、 ,、-'" j // 、 ,,,_ヾ、 ト、;;;;;::. ゙、、-'" ̄~~~゙゙゙" / // 、` ~ ~゙''''''''''"~´ ゙'ソ. ', ....::::::::::::/ . // ... ´ .::::;/ ゙、..... ........:::::::::::::::::::::/ / '、:....:::::", .:;rj゙ ゙、;;;;::::::::::::::::::;;;;、-''゙ . / ヽ;:::::"._ .:::i';/ ゙、 ゙、`~~~゙゙~‐- 、、、..,,_ . ,' .:::::ヽ、;;;;;>、:::... ::::r' ゙、 ゙、:::::: ヽ i ,: ::::::;:::::l:::',:::::::::゙i'r、;:::::::!. ヽ ゙、 .::〉::::::.... } . l i::.:::::i::::::l:::::',:: l:/;;;::゙'ーr゙、 ヽ ゙.、.:::::;/'ー 、、;;;;____;;::、-'" |l :!::::::i:::::::l:::::::}、 l:::::::~゙''''! i .........ヽ........:::::;r゙''" . l l l::::::i::::;;;、、、/. l::::::::::::::l .〉、;;;;;;::、-'rーi''゙ l,l l:::::l:::::i,:::::;;;;;ヽ,ri;;;;;;;;;;;;;j::::/;;;;;;;;ノ:.. |: j
ありがたく思うからさっさとDQNプログラムで笑わしてくれ。
ていうかよ、malloc()の仕様がよくわかんねーんだよ。 先頭のアドレスを返すってことはさ、 int *vc; vc=malloc(sizeof()int*size)ってやるとさ、vcにはsizeof()int*size分の確保された メモリの先頭アドレスが返ってくるんだろ? したらvcは配列になるってことだろ? これが可変長配列ってもんだろ?
あ、プログラムか。ちょっと待ってて。
>>119 違うけど、そう思ってプログラム書いても大丈夫といえば大丈夫。
122 :
デフォルトの名無しさん :02/11/10 18:57
vc=malloc(sizeof(int)*size)
ちょっとまて、sizeof()intってなんだ?sizeof(int)だろ
>>122 ( ̄□ ̄;)!!
DQNさらしちまった
>>123 vcはあくまでもポインタ。配列じゃない。
おkおk。間違っただけだから。 で、121よ、どこが違う?
>>119 考え方としては合ってるけど、可変長配列というと
別のものと紛らわしい。
>>128 reallocで大きさを変えられるから可変長配列でもいいんじゃない?(笑)
俺はそうは呼びたくないけど、、、
>>126 お。分かった気がする。
可変長なのはvcの先にあるものね。
vcは常に、その先にある配列の先頭のアドレスが入ってるから・・・
んー。わかったかも。
>>128 別のものってなんだあ?
ちなみに可変長配列は前橋の影響ですた。
vcの指すもの(mallocの返したメモリブロック)は 配列だといってまちがいあるまい。
前橋・・・
可変長配列って言ったら void foo(n) { int a[n]; ... みたいなやつのことだろ。
可変長って途中で長さを変えられるという意味じゃないの?
時と場合によって確保する大きさがかわる配列という意味か、、、
規格でvariable length arrayといえば
>>134 の指すようなものだな。
あとは、
void f(int m, int c[m][m])
みたいなのとか。
すみません、
>>1 さんに質問なのですが、
未定義と禿しく未定義の違いを教えてください。
あれ以来夜も眠れません。今朝だけど。
>>138 OK
そういえばint a[10]は固定長配列って言われるしね。
>>134 void foo(n)って関数でしょ。
仮引数のnの型指定しは?
そんなのみたことない・・・
はっ!またDQNだったな。 void foo(int n) { int vc[n],i; for(i=0;i<n;i++) みたいな感じか!?
>>143 いや、マジレスだった。なんだこれは!?って。
厨でスマソ。
>>141 int書き忘れただけだよ。
でもちゃんとコンパイルして動かせるけどな。
>>146 コンパイラがC99に対応していないとだめだぞ。
VC++6.0なんかは対応していない(1998年発売だから当たり前だけど)
そうかー、昔風の void foo(n) int n; { のint n;は略してもいいんだっけ。
てゆーか、
>>134 ってこういう事?
#include <stdio.h>
void foo(int n)
{
int vc[n],i;
for(i=0;i<n;i++)
vc[i]=i;
for(i=0;i<n;i++)
printf("%d\n",vc[i]);
}
int main(void)
{
int n;
scanf("%d",&n);
foo(n);
return(0);
}
コンパイル不可能なんだけど。
int *ip = malloc(sizeof(int)); *ip=100; はわかるのですが、 int *arrayp = malloc(sizeof(int)*n); arrayp[n-1]=-1; で、なぜipとarraypが同じ型なのかわかりません。 1つの変数も配列も同じものなんでしょうか?
>>151 なぜって同じint *で宣言しているじゃん
それと、mallocで得た領域を配列と見なすのならば、前者は要素1の配列、後者は要素nの配列
>>151 ipとarraypは両方ともintへのポインタ型だべ?
mallocは確保した領域のアドレスの先頭へのポインタを返すから
ポインタ型じゃないと代入できない。
>>150 それだけの問題なんすか。
ちなみにbcc5.5がどうかわからん?
>>152-153 「なぜ同じint *で宣言すべきなのか」が聞きたいのです。
片方は整数1個へのポインタ、
もう一方は整数の配列へのポインタなのに。
>>154 .cppという拡張子にすればコンパイルできるのでは。
>>155 一個でも配列は配列だ。
mallocはポインタを返す。だからポインタで受け取るべきだろ。
>>155 ひとつ聞くが、
int i[1];と宣言した場合、i=4;なんてできると思うか?
>>157 ipは配列へのポインタなのですか?intへのポインタだからint *だと思ってました。
>>158 いいえ。
>>155 どちらも整数配列へのポインタとみなしてかまわない。
ipの方は要素数=1 の配列(の先頭アドレス)とみなす。従って、
ip[0] = 100;
という操作も可能。
161 :
デフォルトの名無しさん :02/11/10 19:51
>>161 >>155 が要素数1のint配列を単なるint型変数と同じだと思っているみたいだから言ったまでですが。
なぜ「整数へのポインタ」と「整数配列へのポインタ」が 同じ型なのか、という点がまだわからないんですが…
int *ip,i,ia[1]; ip=&i; ip[0]=10; /* OK */ ip=ia; ip[0]=10; /* OK */ これが分かれば理解できると思う。
>>162 int i;は整数1個が入る変数で、配列ではありませんよね。
それは最初からわかってます。
>>164 整数と、整数1個の配列は同じということですか?
>>166 int iとint ia[1]は確保する領域の大きさは同じ。
int *はそのアドレスを入れる変数だから、、、
>>167 じゃあ、整数10個の配列へのポインタは別の型なんですか?
int *ip , i , ia[1]; ia = &i; *ia = 3; printf("%d\n",i) => 3 ってことですね。
char array[sizeof(int)]; int *ip=(int *)array; *array=10; /* こういうのもできるはず */
*array=10;じゃなくて、*ip=10;
>>170 コンパイラ依存(arrayがintと同じアドレス境界に整列されている保証はない)。
素直にmallocしろって
>>170 なんのメリットがあるか書いてください。
メリットが無いことを教えないでください。
>>173 メリットなんかねーよ。
必要な領域さえあればそれをint型とみなして扱えると言いたいだけ。
「整数へのポインタ」と「整数の配列へのポインタ」に区別がないのに、 「整数の配列の配列へのポインタ」とは違う型なのはなぜですか?
>>177 170で「できる」と書いているのは嘘だということ。
「できる環境もある」が正しい。
#sizeof(int) = 4と仮定して考える。 p = malloc(sizeof(int))では [<- 4 byte ->] というメモリが確保されるとしよう。 p = malloc(sizeof(int)*n)では [<- 4*n byte ->] というメモリが確保される。Cでは、これを配列とみなして [<- 4 byte ->][<- 4 byte ->].....[<- 4 byte ->] (=要素数n個) という「n個の要素をもつint型の配列」として使うことができる。 で、最初の例に戻ると、p = malloc(sizeof(int))で [<- 4*1 byte ->] というメモリが確保され、これは [<- 4 byte ->] (=要素数1個) と等価なので、pを「一つの要素をもつint型の配列」として使うことができる。
>>175 お前さぁ、知識はあればあるほど得なんだよ。たとえどんなものでも。
情報の取捨選択も出来ずにごちゃごちゃほざいてるお前、才能無いと思う。
>>179 なんでよ!?
sizeof(int)分配列を確保すればそこにint型の値を入れられるだろ
>>183 「アドレス境界」と「アドレスの整列」という言葉を理解しているか?
>>184 配列(mallocは除く)は連続した領域だってわかっている?
>>180 最初の質問者です。なんとなくわかってきました。
区別できないから同じ型とみなすということですね。
では
>>178 にも書きましたが、配列の配列も同じ並びかただと思うのですが
なぜ型が違うのでしょう?
>>185 あたりまえのこと聞いてごまかすな。
境界と整列について知らないなら知らないといえ。
>>184 の言うとおりだとしたらmemsetやmemcpyはどうやって実装すればいいんだろ(ワラ
言い負かされたからって荒らすなよ。 小学生か(w
このDQNぶりはどうみてもJPS
配列に詰め物があるとでも言いたいのかな。 構造体じゃあるまいし・・・
>>191 おいおい…charは整列する必要がない。
char単位でコピーなり比較なりすればよい。
たとえば1/sizeof(int)回で住むからといって
memcpyやmemchrをintを使って読み書きするように書くか?
>>197 char配列の先頭アドレスがint境界に整列してる保証があるわきゃねーだろ
ヴォケが。
自分の無知を棚に上げてよく言うよ。
>>199 memcpyは複数バイト単位で転送してると思うぞ。
いつのまにか荒れてるな… alignment bouncaryを知らない厨房が1人、大勢のふりして暴れてるのか。
>186
> では
>>178 にも書きましたが、配列の配列も同じ並びかただと思うのですが
> なぜ型が違うのでしょう?
とは・・・・
>「整数へのポインタ」と「整数の配列」
=>int a;(int a[1];)
==>int *a_p;
>「整数の配列の配列」
=>int b[10][10];
==>int **b_p;
a_pとb_pの違いのことを言っているのか??
>>202 ああ、なるほど。最初と最後の未整列のところだけcharで書けば
できるかもね。でもホントか?
数十バイト程度だと、かえって遅くなりそうな気がするが。
>>205 memcpy(or strcpy)の実装についてつい最近この板で議論されていたと思う
のだが、どこだったか見つからない。
俺じゃねーよ。
おれはちゃんと説明したし・・・
153 :JPS ◆M0LaMzf5rY :02/11/10 19:26
>>151 ipとarraypは両方ともintへのポインタ型だべ?
mallocは確保した領域のアドレスの先頭へのポインタを返すから
ポインタ型じゃないと代入できない。
しかも今ボンバーマンやってたしw
>>170 プ
char c[sizeof(int)];
がint型として扱えるだって(w
なんちゅーDQNだ(禿藁
俺もこの論争に参加していいでつか?
できるかぎりlongバイトごとコピーして、あまりを1バイトずつコピーするってものじゃなかったか?>この前のmemcpy
memcpyをインライン展開するコンパイラもあるよね。 複数バイト単位で転送してたらかなり大きいコードになりそうだが。
memcpyってなんだ? なんてヘッダで定義されてんの?
stringか・・・ これと似たやつでさ、strなんとかってなかった? どう違うの?
void func(void *p1,void *p2) { int i; long *lp1=p1,*lp2=lp2; for(i=0;i<4;i++,lp1++,lp2++) *lp1=*lp2; } きちんとコピーされる保証はない?
元データ示した方がいいか。 long = 4バイトとして、 char p1[1024],p2[]="aaaaaaaaaaaaaaa"; これでfunc(p1,p2);を呼ぶ
*lp2=lp2;のところは*lp2=p2;に修正
>>220 long=4バイトとして、p1にp2を16バイトコピー
この前のmemcpy論争はこういうものだったはずなんだが・・・
なんでvoid*? きゃらにしとけや あとなんでforの条件が<4なの? さらに*lp1++=*lp2++; これでいいんでない?
x86のglibcのmemcpyのソースを見てみた。 32バイト以下、またはsrc, dstどちらかが4バイト境界に整列して いないならば、バイト単位でコピーしてる。 32バイトより大きくて、両方が4バイト境界にそろっている場合のみ ワード単位でコピーしてる。
>>226 char配列の先頭番地が、long境界に整列しているという保証はない。
アライメント違反例外が発生してもOSが対処してくれるかもしれないが、 いずれにしても処理系依存だな。
>>229 そうだね。
あと、もし1回の読み書きごとに例外が起きてOSに落ちたら、
恐ろしく遅くなるね。
>>229 そう言う処理系ではコンパイラがwarning出すと思うよ。
ととと.
つーつーつー.
ととと.
>>231 void *との間のキャストでは警告の出しようがないだろう。
>>170 見て思ったけど、
char一文字の領域のアドレスが整列化で語アドレスになるのは分かるが
charの連続した領域はバイト単位で詰め込まれるんじゃないの?
(alignment restrictionがあったとしても。)
少なくとも俺の環境ではバイト毎だった。
そうならないアーキテクチャがあるってこと?
それとも全く別の理由で
>>170 は叩かれてるの?
ちょっと教えて欲しい。
>>236 もちろん
char array[sizeof(int)];
で、array[0], ..., array[3]は連続したアドレスに割り当てられる。
それは規格で保証されている。
問題は、たとえばintを4の倍数アドレスに置かないとロードやストアが
できないCPUで、array[0]が4の倍数アドレスに置かれる保証がないことだ。
>>238 じゃあint *ip=malloc(sizeof(int));ってやって、ipが4の倍数のアドレスじゃなかったら、*ip=1024;とかできないってこと?
そういう処理系では必ずmallocは4の倍数のアドレスを返してくれるとか?
>JPS わからないんだったら、とりあえず、見とけ。 議論をさえぎらないでくれ。 215の「燃料注入してるつもりか?」は火に油を注ぐと言う意味だ。 #・・あとで、ゆっくりググルか、落ち着いた頃にスレを読みなおせば #わかるはずです。
>>240 mallocは常に適切に整列された結果を返す。
そうでない処理系は規格違反。
こ、これが週末のCスレというものなのか・・・・!!
>>238 じゃあint iと宣言した領域をcharの配列として使うのはOK?
ということはmemcpyに与えたアドレスが4の倍数じゃなかったら、いきなりlongバイトごとコピーすることはできないってわけか。
>>244 それはOK。でないとmemcpy等にint *を渡せなくなる。
>>245 ワロタ
傍観者JPSです。すぱーーーー
>>246 できない。
x86では境界に整列していなくても読み書きできるが、激しく遅くなるので
やらないほうが良い。
volatile 大活躍。
>>249 そうか。またひとつ賢くなったよ。ありがとう。
>>170 はchar配列じゃなくてchar *にmalloc(sizeof(int))を入れるようにすればOKなんだろうな。
(ちょっと見ない間にこんなにスレが伸びてしまった。)
>>204 >>「整数へのポインタ」と「整数の配列」
>=>int a;(int a[1];)
>==>int *a_p;
>
>>「整数の配列の配列」
>=>int b[10][10];
>==>int **b_p;
>
>a_pとb_pの違いのことを言っているのか??
そうです。b_pはなぜint *じゃないのでしょう?
あれ、でもint **とするとコンパイラに怒られますが。
>>252 配列は式の中ではポインタに読み替えられる!
三つの例外を除いて・・・。
でも配列とポインタは違う・・・ ここが難しい!!
くいず: for (i=0;i<N;i++) for (j=0;j<N;j++) a[i][j]=0; こうすると、a[i][j]の全体(N*N個の整数)がきちんとクリアされるという。 なのに、a[i][N-1]とa[i+1][0]の番地は並んでいないという。 なぜか?
>>「整数の配列の配列」 >=>int b[10][10]; >==>int **b_p; bの型はint **じゃないだろう。
int **ってすると「int型へのポインタの配列」へのポインタになるの。 配列とは限らんが。
260 :
デフォルトの名無しさん :02/11/10 21:21
コンパイラじゃなかったら誰がそうするんだろ・・・・
答: int *a[N]; for (i=N-1;i>=0;i--) a[i]=calloc(N, sizeof(int));
>261 a[i]がポインタで別々のところのポインタが入っていればそうなるよ。
>>263 そのコードを実行できる形にするのはコンパイラだろ?
>>258 で合っているじゃん。まともな回答じゃないが。
えーと^_^;) 指している先が「整数の箱(1つ)」でも「整数の配列」でも int *だというのは何となくわかりました。 でも、そうすると「整数の配列の配列」も同じ理屈で int *でよいと思うんですが、なぜ違うのでしょう?
俺の環境じゃ、配列の添え字は定数でないとだめなんだよ・・
>>263 calloc使うなら0に初期化する処理は無駄だね。
>>265 コンパイラはa[i][N-1]やa[i+1][0]のメモリを割り付けていない。
整数の配列 a[N]; って宣言するの。
>>264 a[i]がポインタじゃないときってどんな時なんですか?
272 :
デフォルトの名無しさん :02/11/10 21:28
>>260 ただの仕様だろ。並べなきゃいけないってしちゃったら、メモリを連続させて確保するコストがかかるから。
>>268 途中でクリアすることもあるんでは?
…ってそういうことを問題にしたわけじゃない(w
>>272 ポインタ配列を用意して、そこにmalloc,callocで得た領域を入れるんだってさ・・・
>>271 int a[N][N];
この場合はa[i]は使えないのかな。
てかこんな話つまんないYO!
typedef int hoge[N]; hoge a[N];
int a[N][N]; と宣言したら、必ずa[i-1][N-1]の次にa[i][0]が並ぶ(i=1..N-2)。 int *a[N]; で、a[i]を動的に確保したら、a[i-1][N-1]とa[i][0]の間は (重なっていないということを除いて)どういう関係があるかわからない。 ちなみに、確保するのはcalloc(またはcallocから呼び出される下位ルーチン)だ。 コンパイラじゃない。
>>278 callocのソースをコンパイルするのはコンパイラ
まあ別にCで書かなくてもいいが
>>279 コンパイルするのはコンパイラだな。
でもコンパイラが確保するわけじゃない。
>>281 まあいいか。
ところで、さっきのクイズはオリジナル?
こんな感じの説明で、どうでしょう? 「【整数 int a 】の配列」 int a[10]; int *a_p; 「【整数の配列 int b[5] 】の配列」 int b[5][10] int *(b_p[5]); とうぜん、b_pの型は、int *だから、 int *(*b_p); ってなる。
く~いず! void mult(double a[N][N], double b[N][N], double c[N][N]) { int i, j, k; for (i = 0; i < N; i++) for (j = 0; j < N; j++) { a[i][j]=0.0; for (k = 0; k < N; k++)a[i][j] += b[i][k] * c[k][j]; } } これを速くしようと、 void mult(double a[N][N], double b[N][N], double c[N][N]) { int i, j, k; for (i = 0; i < N; i++) for (j = 0; j < N; j++) { double sum = 0.0; for (k = 0; k < N; k++) sum += b[i][k] * c[k][j]; a[i][j] = sum; } } と書き換えたら、実行結果が変わってしまったという。なぜ?
>266 です。
>>283 b_pはint [5]の大きさをもつ配列へのポインタでしょ?int **b_pにはならないでしょ。
>>283 ちょっとまて。
*b_p は整数だと思うんだが。
>>288 あー、はい。
#define N 100
くらいの適当な定数と思ってくらさい。
290 :
デフォルトの名無しさん :02/11/10 21:42
int a[N][N]; って宣言したらスタック上に確保されるだろうが。 どうしてcallocが関係あるんだ?
int *(b_p[5]);はint型のポインタの配列じゃない?
>>289 こういうところしっかりしておかないとな。つっこみ問題は。
まあ定数じゃなかったらコンパイルエラーになるが
つっこみ問題ってなんだよ。 引っかけ問題だな。
>>290 ネタなのか真正DQNなのかはっきりしる!
>>291 あーint (*b_p[5])と見間違えた。
うん、ポインタ配列だね。int **にいれられる。
ポインタ配列なら括弧をつけるなヴォケェ まぎらわしいんじゃ!
>>286 int b[5]={1,2,3,4,5};
int *b_p=b;
この時、*b_pもb_p[0]も式の中では1となるしょ?
int **b_pになるべ。あら・・・
s/int (*b_p[5])/int (*b_p)[5]/
>>299 でも
int b[5][10]
int *(b_p[5]);
とやったら
b_p=bってのはできないよ。
>>284 mult(a, a, c);ってやってたくらいしか思いつかんな。
よくわかりません。 int *ip, i; int *ap, array[10]; ip = &i; ap = array; *ipも*apも整数の値が出てきますよね。 int b[5][5]; のとき int *bp1 = b;も int **bp2 = b;もコンパイラに怒られます。 *bp1とすると整数が取り出せるんだから、int *で良いような気がするのですが。 それとも、*bp2とすると、どこかへのポインタが得られるんでしょうか?
>>302 hogeのポインタ = hogeの配列 はできると思ってくれ。
intの配列の配列 が b。
intのポインタ にも
intのポインタのポインタ にも 代入できない。
>>238 しかしどうしてそう言う風になってるんだろう。
くーーーいーーーーず! あるプログラムでは、大量のunsigned longの配列を calloc(N, sizeof(unsigned long))で確保している。 プログラマが、配列の内容は実は全てunsigned charで十分あらわせる 範囲だと気づき、unsigned longを全部unsigned charに直したが、 消費するデータ領域はちっとも減らなかったという。なぜ?
>>302 int (*bp3)[5];
一つ言えるのは、こんな重箱の隅な知識覚えても何の役にも立たないということだ。
sizeof(unsigned long) == sizeof(unsigned char)
>>305 char の配列を宣言してるからでしょ。サイズはintだけどintじゃないから
>>305 doubleとして扱われるかもしれないからって、char配列を全て
double境界に整列する仕様のほうが良いか?
「そんな使い方しないから詰めて割り当ててくれ」という人も
多いんじゃないか?
>>308 そんな処理系あんのか?charはちっちゃくしとけよ。
>>312 intは16bit以上だと規格で決まっていると言っている人が何人かいたけど、1バイト=16bitならsizeof(long)==sizeof(char)になってもおかしくはないよな。
ないと思う。規格上は可能ってだけで。
お前らの悪いところは 規格、仕様と言いながらソースを示さないこと だろうな。 おかげでアホな間違いとかも散見される。
TM320x0シリーズでは、メモリは32ビット単位でしかアクセスできない。 番地も32ビットごとについている。 なので、Cではsizeof(char) == sizeof(int) == sizeof(long)
>>317 それか!
以前charだろうがintだろうがみんな32bitの環境でプログラミングしていると言っている人がいた。
>>314 longは32bit以上じゃなかったっけ?
まちがいた ×TM320x0シリーズ ○TMS320シリーズ
みんなで64bitになって幸せになろう。
charが32ビットなら多言語対応も楽そうだ。
323 :
デフォルトの名無しさん :02/11/10 22:23
age
>>322 当面16bitでいいじゃん。どうせUnicodeは当分BMPしかつかわんでしょ。
(゜∀゜)ビトマーップ
326 :
デフォルトの名無しさん :02/11/10 22:27
(゜∀゜)ビトマーップ
>302 ①配列ってのは、アドレス順にあるもんが並んでいることを言います。 ②[整数]の配列といったら、下のようなイメージです。 a[4]={14,15,16,17}; aのアドレス->値 100 ->14 101 ->15 102 ->16 103 ->17 ③[整数の配列]の配列といったら、下のようなイメージです。 b[2][3]={{10,20}.{11,21},{12,22}}; bのアドレス->値 200 ->100 201 ->102 202 ->104 #2個飛びのアドレスが格納される。 ちなみに、次のアドレスには 100 ->10 101 ->20 102 ->11 103 ->21 104 ->12 105 ->22 ④int **というのは、ポインタの配列を表していますが、2個飛びのアドレスが 入るということまで、わからないのです。 したがって、int **bp2=bとするエラーになる。 ⑤>307のように書けば、いくつ飛びのアドレスが入るかが、わかるので、 うまくいくはず。 #手元にコンパイラが無いので、確認できん、スマソ。
>>327 まて、多次元配列はメモリー上に直行的に並ぶはずだぞ。
>>327 そんな無茶な。
いつから勝手にポインタ配列にしてくれるようになった?
なぜコテハンに限ってDQNなんだろう…
スマン、逝ってくる。
>319 そだな。 charは8bit intは16bit longは32bit が最低保証されているから CHAR_BIT = 16ならば sizeof(char) = sizeof(int) までだな。 ちなみに、charは参照可能な最小単位を定義しているので、sizeof(char)は必ず1を返す。 他の型のsizeofはcharの何倍かを返すんだとさ。
> charは8bit ダウト。
335 :
デフォルトの名無しさん :02/11/10 22:50
sizeof(char)=1って事だけだろ。
char:1バイト
>>335 SCHAR_MINは-127以下SCHAR_MAXは127以上が保証されているハズだぞ。
他の型も同様にビット数ではなくて値の範囲で定義されているのだが。
-側が128でないのは1の補数マシンへの配慮だと思われる。
338 :
デフォルトの名無しさん :02/11/10 23:10
すいませんがちょっと教えてください。 見ていたPGの中にこのような処理があったのですが、これはどのくらい値に差があるときに成り立つのでしょうか? 10倍ぐらいでしょうか? if(num >> 4) { }
2^4=16
num >> 4 は右シフト num / 16 16以上ってこと。
>>338 >>が何の演算子かまず調べたまえ。
比較演算子ではないぞ。
>>340 , 341
>>は16以上のときなのでしょうか?
300 >> 4
だったらTRUEで、
15 >> 4
だったらFALSEと考えていいのでしょうか?
>>342 だから、比較じゃないって。数学の>>とは別の意味。
手元の参考書に載ってなければ、すぐさま別の本を買ってきて読め。
>>342 比較じゃないってば。
300 >> 4 は 30/16 で
15 >> 4 は 15/16 だ。
>>338 「>>」は超比較演算子と言って上級者でも殆ど使わない演算子だから
覚えなくても良いよ。
実は2chで相手の番号をレス番号を指す時の「>>」も、この演算子が由来なんだよ。
346 :
デフォルトの名無しさん :02/11/10 23:28
338はnetaっぽいな.
処理系依存をうるさく言うやつがいるけどさ、 コンパイラが規格に準拠しているかどうかということ自体、処理系依存だよな。
>>343 , 344
わかりました。割り算ということですか?
300 >> 4 => 30 /16
15 >> 4 => 15/16
左辺は2乗したもので割ればいいのでしょうか?
右辺の法則がちょっとわからないのですが。
ビットをシフトさせるの。 11110000 >> 4 だったら 00001111 になる。 00001111 >> 4 だったら 00000000 になる。
>>348 4ビット右シフトは1/2^4
2進の環境下で4桁右にずらすんだからね。
あ、アンダーフローは考えないで
違う違う、、、 あ、アンダーフローは考えないで ←これは間違いだ
多分、348は 2進数を知らないんだと思う。
>>350 , 351
わかってきました。
右にビットをずらしていくのですね。ぜんぜんイメージと違っていました。
一番左のビットには必ず0がくると考えていいのでしょうか?
>>354 論理シフトなら0で埋められる。
算術シフトの場合は符号ビットとおなじもので埋められる
>>355 その二つで決定的な違いってある?
実際プログラムつくるときに
論理シフトって繰り返しやれば最終的に元の値は必ず0になるよね?
bit数やればなるんじゃない?
>>358 さんきゅ
>>356 例えばwhile(a<<=1) ;とかwhile(a>>=1) ;なんてやった場合、論理シフトじゃないと無限ループになる可能性がある
>>355 算術シフトと論理シフトの違いってなんでしょうか?
算術シフトが符号で埋められるというのは、
10001001 >> 2 => 11100010
00001001 >> 2 => 00000010
ってことでしょうか?
signedの右シフトは処理系定義。
算術シフトって「1の補数」をと取るんでしょ。
>>360 そう。
算術左シフトは符号ビットは変わらず他のビットが左にずれる。空いたところには0が入る。
論理左シフトは全ビット左にずれる。空いた領域には0が。
>>361 そうだね。算術シフトになるか論理シフトになるかは処理系による。
Javaだとそれぞれ別の演算子がある。
なんか変だな。 unsignedのシフトや、signedの左シフトは?
368 :
デフォルトの名無しさん :02/11/11 00:12
ビットソートについて教えてください。
>>367 > 左シフトに論理も算術もない。
???
左シフトは2の羃乗の乗算に等しい。 オーバーフローは無視。
>>369 初心者か? ならわかりやすく説明しよう。
左シフトだと右から新たなビットが入ってくる。
論理シフトだと考えれば0が入ってくる。
算術シフト(2倍)だと考えれば、正負によらず常に0が入ってくる。
どちらでも同じ。
>>371 入るのは0だが、算術か論理によって符号ビットがずれるかずれないか変わると思っていたんだけど。
>>363 やってみれば。
そういう動作は聞いたことがない。
実際、javaには>>>(算術右シフト)はあっても<<<は存在しない。
signedかつnegativeな整数に対する左シフトの振る舞いは未定義。 signedかつnegativeな整数に対する右シフトの振る舞いは実装定義。
あ、上の一行は間違い。失礼。
378 :
デフォルトの名無しさん :02/11/11 00:33
算術シフトは最上位ビットが1のとき、右シフトすると1が入ってくるよ。
#include <stdio.h> void main() { int n = 0x80ffffff; printf("%d\n", n); printf("%x\n", n); printf("%d\n", n << 4); printf("%x\n", n << 4); printf("%d\n", n >> 4); printf("%x\n", n >> 4); }
381 :
デフォルトの名無しさん :02/11/11 00:40
だからnegativeって書いてあるだろ。
>>379 その算術左シフトおかしいぞ。
8ビットの-128(10000000B)を左シフトしたら、その説明では-128のままになってしまう。
384 :
デフォルトの名無しさん :02/11/11 00:42
ああ、nativeと読み間違えてた。スマソ
>>383 0をいくらシフトしても変わらないのと同じじゃないの?
int i, a1[10], a2[10][5]; int へのポインター *(&i) = 1; *(&a1[0]) = 1; *(&a2[0][0]) = 1; int[] へのポインター *(&a1) = 1; → NG:配列に整数は代入できない *(&a2[0]) = 1; → NG:配列に整数は代入できない int[][5] へのポインター *(&a2) = 1; → NG:5つの要素を持つ配列の配列に整数は代入できない 関数呼び出しの引数に現れた場合 a2 == &a2[0][0] a1 == &a1[0]
nを4bit左シフトしたらnはn*2^4になるんだよね? 負の数の場合、符号ビットが変わったらまずいと思うんだけど。 負の数に正の数をかけても負の数のままのはずなのに、符号ビットまでうごいたら正の数になってしまう
>>363 やってみろよ?
11111111 << 1 = 1111110 だな。論理シフトでも同じだな。
10000001 << 1 = 1000010 になるとしたらこれは算術的に正しいのか?
因みにx86のアセンブラレベルでも論理左シフトと算術右シフトは同じものだぞ。
要するに負の整数にはビット演算するなって事だよね。 自分の処理系が論理か算術か確かめる方法ある?
スマン。 算術左シフトな。
あ、やってみりゃいいんだw
正の数になってしまう"ことがある"
今日で前橋歴10日だよ・・・ ぜんぜんわかんないけどさ。
皆さんすみません、何度か質問させていただいているものですが、 またひとつ質問させてください。 変数の宣言はコードブロックの先頭でできますから、たとえば int main(void) { int i; for (i = 0; i < 100; i++) { int k; <--これ 処理~; } return 0; } なんて書き方や、 int main(void) { int i; 処理~ { int k; <--これ 処理~ } return 0; } なんて書き方ができますよね。 これって、そもそも一般に通用するものなのでしょうか? 通用するとしたら、「良い書き方」「悪い書き方」なのでしょうか?教えてください。
そういやさ、Cで8進表記は012とか0をつけるんだよね? O(オウ)じゃないよね? でもprintfの型指定市は%oだよね? ちがったけ?
>>397 O12とやったら変数などと見分けがつかなくなるだろ。
>>395 余裕で通用する。でも俺はあんましない。宣言はとりあえず関数の直後でやっちゃう。
でもたとえばwhileの2重ループとかで、毎回値を初期化する必要があるときとかはやるかな。
まあそれもfor使えばいいし。
悪い書き方でしょ。 for(~){int k;~}for(~){int k;~} とプログラム書いてみ。エラー出すこともある。
算術シフトと論理シフトの勉強し直した方が良いよ!
>>395 そんなに悪いとも思わないけど。
範囲がわかるし。長いんなら別関数にすれば?
>>406 そうだったのか!なにげに英語分かったら覚えやすいよね。
おれなんかstdio.hのことステディオとか言ってたから・・・
スタンダードインプットアウトプットだよね?
基本情報処理試験のCASLIIには左シフトにも論理と算術があるな。
左シフトについて、規格を確かめたら: E1 << E2でE1がunsigned typeなら、 シフトの結果は(E1 * (2のE2乗)) mod (E1が表せる最大の値 + 1) E1がsignedかつ非負かつE1 * (2のE2乗)が元の型で表現できるならこの値。 それいがいの場合は(なんと)未定義動作だと。 よって、負の数を左シフトしたら間違い。
Standard I(input)/O(output). Octopus.(image)
>>409 まじ!?俺春受けるんだけど・・・
でも選択でCとればいいよね?
てかさ、秋用の参考書買ったんだけど、これ来春にも通用する?
すまん、やっぱこれで良い。 signed_negative左シフトは未定義 signed_negative右シフトは処理系定義
>>411 ( ̄□ ̄;)!!
俺は「スタンダード・アイ・オー」って言ってる・・・
はずかちい・・・
>>395 賛否両論あるね。というより、一長一短か。
短所は、コードを読んだ時に変数をどこで
定義しているかわかりにくい。
>>411 ていうかストゥドゥってなに?
スペルは?
>>415 > signed_negative左シフトは未定義
これホントなの?
>>410 俺も未定義って見て驚いたので間違ってないか何度も読み直したが
どうやら本当らしい。
october
>>418 でもこういう書き方しなきゃ出来ないことってある?
for使えば出来ると思うんだけど。
プログラムの中身じゃなくて、見た目の問題?
>>424 変数のスコープは最小限に絞るべきっていう考え方もあるから...
>>420 そりゃそうさ。
処理系によって
負数の表現が2の補数とは限らない。
白熱しておりますな
>>409 ゲーーーーーッ! ほんとだ!
さっきのページはシスアドだったからあれで合ってるんだ……
でも80x86もZ80もそんな動きしないよな…
430 :
デフォルトの名無しさん :02/11/11 01:06
じゃあ負数へのかけ算はシフトをつかって実現してはならないの?
>>430 俺の持ってる本にはそう書いてあるぞ。
まあ、俺の場合それ以前にシフト演算なんてしないわけだが
433 :
デフォルトの名無しさん :02/11/11 01:09
>>430 それだけじゃなくsigned使うときにはsign心の注意を払わないといけない。
436 :
デフォルトの名無しさん :02/11/11 01:10
>>431 左シフトは算術も論理も一緒になってるな。
うひゃー、未定義知らんかった~。 とりあえず左シフトはunsignedまたは定数 でしかやった覚えないけど。勉強になりますた。
掛けたあとが範囲内ならシフトしていいんじゃないの?
掛け算をシフトで? 規格準拠にしたければ、絶対値を取って正の数に対してやればよいじゃん。 2の補数を仮定してよいならunsignedにキャストしてやれば良い。
>>444 ( ̄□ ̄;)!!
( ̄□ ̄;)!!
( ̄□ ̄;)!!
>>443 unsignedにキャストしてシフト演算したらどうなるか分かる?
1の補数表現の場合、8bitだと11111111は0になるの?
皆さんレスありがとうございます。 自分もレス書きたかったのですが、 白熱した論議に割り込むこともできない未熟者ですのでご勘弁を……。 結論としては、そう書くこともできるが賛否両論(あんまりやらない)、 関数分けなどうまく使えばそうする必要もない、ということですよね? ありがとうございました。
きのうはBOOLで、今日はシフトですか?
昨日もシフトやったよ。
>>447 2の補数で(signed int)1011111111111111
これをunsigned intにキャストして
>>1 してsigned intにキャストしたら?
454 :
デフォルトの名無しさん :02/11/11 01:26
たった 1 日でレスがこんなに・・・。
でも、クイズ厨うぜぇ。
ここは基本的に質問スレなんだから別スレ立ててやってくれよ。
ところで、
>>284 のコードは、前者も後者も結局何も仕事をしないと思うのだがどうよ?
>>453 おーい… 横入りするけど右シフトは別に、未定義じゃないので、キャストしなくても、いいんじゃ、ないの。
454=284
>>457 コンパイラによっちゃ負の右シフトも未定義!?
右シフトが論理シフトになるか算術シフトになるか未定義なんじゃない?
>>458 未定義と処理系依存をごっちゃにするなよ。
処理系依存は、処理系が確定すれば必ず動作は一定。
未定義は、本当に何が起こるかわからない。
>>457 signed を unsigned にしたときにどうなるかも処理系依存でしょ?
>>460 本当に何が起こるのかわからないのは不定。
未定義はその名のとおり定義されていないだけ。
規格では定義されていないという意味ね
>>456 死ね。
どうして誰も、284 の引数が値渡しである事に気付いていないんだ。
前者と後者のコードはまったく同じ結果になるから、クイズとして成り立っていない。
>>460 なるほど。あふぉですまそ。
でも右シフトの場合、論理でも算術でも結果は一緒でない?
>>459 は?
>>462 アホ。適当な事言うな。
implementation-defined,unspecifiedは実装選択の義務がある。
undefinedは無い。
10000000 >> 4が 11111000 になるのが算術シフトで 00001000 になるのが論理シフトじゃない?
>>462 処理系依存は、動作が確かめられればいつでも用いて良い。
未定義は、絶対に用いてはならない。
>>468 クイズとして成り立っていないなら、正解もクソも無いだろうに。
ごめん、472を読み間違えてた。
>>470 ほんとだ。でもまあ
>>460 に近いし。
だいたい未定義なんてつくんなよ。規格できめろよANSI
>>472 Uncertain (不定) なんて言葉が規格書にあっただろうか。
未定義といっても処理系によっては定義されている可能性があるんじゃないの?
>>478 処理系によってはってとこが未定義なんだべ?
11111000 << 4 は 10000000 になればそれでいいのだが。
>>478 鼻から悪魔が出る処理系もあるので、うかつに使えませんが・・・
>>479 規格では未定義でも処理系によっては定義されていることもあるんじゃないかと
>>480 気持ちはわかるが、それは本論とは関係無い。
>>472 460も間違ってる?
(処理系依存=処理系定義とすると)間違ってるとは思えないんだが。
っていうかさF&Aの >未定義とは、その結果どうなるかが、言語仕様として決められていないことを意味します。 >そして、その結果がどうなっても、そのC言語の処理系はは規格に合致しているとみなされます。 ってのとさ、 >不定と未定義の最も大きな違いは、不定のコードはプログラムとしては正しいが、未定義のコードは間違いであり、 >動作する保証すらないという所にあります。 ってなんか違わない?
>>485 「動作する保証すらない」という結果になってもC言語処理系としては正しい
>>482 それは分かるけど。
結局移植性低いプログラムは書くなってことで。
>>485 規格にさえ反しなければ何をしようと規格に合致していると言えるだろ
ただそれでどうなってもしらないよ。と。
未定義とか処理系依存な命令なんか使わなきゃいいじゃん。使わないでいいし。
何だか、JPSっつー香具師=荒らし、っつー感じなんだが
シフトくらい使わせてくれ。
>>489 未定義のコードが間違いって言ってるのに、規格には準じてるって・・・
なんかすげー曖昧。これじゃ移植性がどうこうって話でなくない?
>>491 荒らしじゃねーよ!香具師だけど。
頭わるいけどがんばってるんだYO!
>>493 間違いってのはプログラマが使うことが間違っているという意味だろ。
規格に反するという意味ではなく。
>>493 逆だ。
昔のCは互換性がないほどバラバラだった。
それを無理矢理一つの企画に纏めたため、無理な動作が未定義となった。
>>493 プログラマーが使うかとコンパイラが実装してるかどうかは別ものだろ。
未定義は使えないが、処理系依存は使うわな。 特にその処理系に特化したカスタマイズしたい場合は。
> これじゃ移植性がどうこうって話でなくない? 未定義のコードを書くこと自体が間違ってるんだから。 Cではそういうコードを書いてはいけないのよ。
>>496 それもそうだし、あまりガチガチにすると様々な環境で使えなくなるんだろうね。
501 :
デフォルトの名無しさん :02/11/11 01:52
プレステ2のCPUって2の補数表現じゃないって本当?
>>498 処理系依存は使えないと、Cそのものがほとんど使えないよね。
>>495 でもしたらさ、結局処理系で定義してあったってそれ使うのは違うんじゃねーの?
ってかんじだべ?
そしたら処理系ごとでそれぞれ定義する必要ゼロじゃん?
でも定義してんのは使うからでしょ?
だったら規格でちゃんと決めろや( ゚Д゚)ゴルァ!
>>490 それは間違っている。
x86 + VC++ で、ポインタや浮動小数点数の集合を ZeroMemory() を使わないで
項目事ので移入によって初期化するのは馬鹿げている。
505 :
デフォルトの名無しさん :02/11/11 01:53
>>502 命令はいいとして、標準以外のライブラリを使えないとかなりきついね。
24時間経たずに500か・・・お前ら仕事や学校あるんだろ? 俺、今朝は5時におきなきゃならんのに、 ・・・回線切らずに氏ねそうです
>>496 そうだったんでつか。ちょっとその辺の話はまだまだなんで・・・
ってことはやっぱ負の右シフトはすんなと?
算術で。
なんか今日は低レベルで面白くないな。
>>494 つもりが無くても荒らしは荒らしだから、そこのところ理解しておいてくれ。
ちなみに、
>>491 のような煽りも荒らしに分類される。
>>506 明日は学校10時はんから・・・
今、徹夜という文字が浮かんだYO!
この論争に加わっていれてるのかな・・・おれ・・・
>>510 俺のどこが荒らしだ( ゚Д゚)ゴルァ!
>>491 が荒らしなら、おめーもだろ
煽られてるぞおれはああ
一部の環境でうまく動けばそれでいいや。 あらゆる場面で動くプログラムなんて書こうとは思わないし。
>>508 ビットシフトを使う側に論理、算術の選択の余地は無いんだよ。
>>503 なるべく処理系を殺さないという C の設計思想を理解しろ。
そうでなければ自分で言語を定義せよ。
>>516 もう寝とけ。
明日、またここに来たときには、すでに今の議論は忘れ去れているだろうから。
・・・そしてまた同じことが一から議論されているという罠
C言語って未定義の命令を使えてしかも警告すら出ないのな。 いやC言語というか処理系の問題か。ろくな処理系がないな。
>>516 516 のどこが荒らしじゃないのか説明してもらおうか。
>>518 そうだね。じゃあ負の数自体やんなってことか・・・
>>517 俺は学校でやるからそういうわけにはいかないんだYO!
>>519 激しく同意。
未定義や不定が気に入らないなら、JavaかC#を使うがいいさ。
>>516 荒らしだよ。もう寝るよおれは。おやすみ。
昨日何を議論したのかなあ。 忘れてしもうた。
>>517 こうやって糞プログラマーが大量生産されます。
>>526 NULL, bool(_Bool), 未定義, ... 最近はこのどれかだな。
531 :
デフォルトの名無しさん :02/11/11 02:02
intを文字列にしたいのですが、どうしたらいいか 分かりません。簡単にできる関数はないのでしょうか?
俺にはCしかないんだが・・・ 未定義はだめだとして、不定を使う可能性は? あり?
>>528 ポインタが渡されることを知らんのだろう。
>>528 試してみればわかるよ。
呼び出し元の配列は、決して変更されない。
>>533 int i;
printf("%d\n",i);
不定ってこういうのだろ?
>>521 それを言ったらアセンブラの立場はどうなる。
それだけ自由度が高くて実装する側に委ねられている
言語っちゅーこった。
>>533 使わざるをえない状況になってから考えろ。
ポインタの値渡しじゃん(笑) Cには参照渡しなんてないでしょ
>>536 呼び出してみたし、ちゃんと変わるが?
(ネタだとしたら地味すぎるな…)
543 :
デフォルトの名無しさん :02/11/11 02:04
香具師って何.
>>539 わかりますた。そしたらまたここでレスします。
おい、お前ら!不定と未定義って(略
Q.C言語の好きな所はなんですか? A.未定義や不定であることを知らなくても自由に使えるところです。 爆
でも
>>537 とか絶対やらんよな。
普通に書こう、ごく普通に・・・
そうして未定義を使う罠
2ちゃん語なんて恥ずかしいから使うなよ。
>>547 そしてはまると。
まあ、そういうアドベンチャーゲームも子供の遊びとしてならいいけドナー
大人ならドキュメントちゃんと読もうや。
>>549 i = i++;
お前はこれでもやっとけ。
553 :
デフォルトの名無しさん :02/11/11 02:07
宿題専門のスレってどこにあるんすか
>>551 あなたはドキュメントを全部読んで理解してから使っているのかと小(略
558 :
デフォルトの名無しさん :02/11/11 02:09
>>554 その手のスレッド、初心者板以外にもあるのか
559 :
デフォルトの名無しさん :02/11/11 02:09
香具師ってやしって読むのか.かぐしでも変換できるよ.今までかぐしって呼んでたよ.
>>552 i=i++ってさ、i=i=i++ってなって
i=iってなって、結局i++ってことで、
それが何か?
11.35: i = i++の動作が未定義だとうるさくいう人がいるけれどANSI準拠のコンパイラで試して私 が思うとおりの結果を得た。 A: 未定義の動作に出くわしたらコンパイラは好きなように振る舞う(実装が定義した動作、 あるいは未規定の振る舞いに出くわしたときにもある程度好きなように振る舞う)。その中 にはあなたが期待した結果も含む。こんなことに頼るのは馬鹿げている。質問11.32と 11.33と11.34を参照のこと。
>>561 アフォ。それは典型的な未定義動作の例だ。
1つの式の中で同じlvalueを何回も変更したら、結果は未定義。
>>561 それ昨日もやったな。
評価の順番が関係する。
>>561 i++はiに1を足して、足す前の値を返すだろ。
それをiに入れたらどうなるかわからない。
1が足されているかもしれないし足されていないかもしれない。
でもi=i++なんてなんのためにやるのかわからないよね(笑)
>>566 そんな浅はかなことは言ってはいけない。
俺はi=i++を実行したため、FreeB○D-MLから迫害された。
・・・ってなことも起きます。
>>566 そうか!後置++は評価したあとインクリメント!
じゃあi=++iは?おk?
>>568 殺されてもCに対しては文句は言えません。
ってゆうか i=i++ でいったい何がしたいのか理解できないのだが。 他の手段はいくらもあるだろうし こんな記述に固執する必要性は全くない。
>>564 の、1つの式の中で同じlvalueを何回も変更したら
ってとこがどういうことかわからんのだが。。
>>573 今もっている参考書に書いてなかったら、本屋へ行って買って来い
>>577 また引っかかった漏れは一体・・・これで7度目だよ・・・
>>572 書ける(文法違反にならない)ってだけだろうね。
i=i+2=i+3なんてやるとi+2は左辺にならないって言われるだろうし。
>>577 あぶねー578と579のおかげだ・・・
>>574 おなじlvalueってiのこと?
たとえばA=B=3はいいけどA=A=3は無理ってこと?
なんかfjに似てきたね、ここ。
っていうか式の中で++とか使うなよ。 他の手段はいくらもあるだろうし こんな記述に固執する必要性は全くない。 使うときは i++; というふうに単独で。
>>580 1 行目と 2 行目が全然繋がっててないよ。
>>580 そんなん素直に
i+=2;
i+=3;
でいいだろ。
だとしたら
>>569 はぜんぜんだめってことで
香具師扱いをうけたわけか
>>579 もう定番だから、「pa_003_a」 と出てきた時点で事前回避してくれ。
>>585 そんなん素直に
i += 2 + 3;
でいいだろ。
>>588 そんなん素直に
i += 5;
でいいだろ。
>>589 お前いい加減しつこいな。
C FAQくらい自分で読めっていってるんだよ。
>>584 そこまで禁止するのは早計。
単に、インクリメント/デクリメントを使った識別子は、副作用完了点までに
複数回使わなければいいだけ。
*p++ = ' '; とか、p[i++] = 123; とかもダメなのかい?
func(i++,i++); こういうのもどうなるかわからないんだよね。
>>590 どっちでもいいだろ。
そんなのコンパイラが最適化する。
i++;i++;i++;i++;i++; これが最強
>>591 読んでものってねーんだよ。
だいたいそんなレスつけるヒマあったら質問に答えろや。
YesかNOでいいんだからYO!
>>597 くまなく探した?
ブラウザの検索機能を使えばみつけやすいと思うんだけど
要するに同じ変数を何度も変更するなってことだ。
>>597 載ってるから言ってるんだよ。
お前の目は節穴か、ボケ!
答えは「無理ではない」
ん? i=i++のことじゃなかったか。
>>602 は違った。前置を探してたのに・・・
>>601 無理ではないってことはなんか違うってこと?
とりあえずi=++iはだめだよね?
ひとつの式で2回値を変更してるから。
a=b=3はa=(b=3)だからぜんぜんおkだべ?
>>601 どこに載ってる?
A=A=3 は、A に対する副作用がいつ発生するか決まってるの?
607 :
デフォルトの名無しさん :02/11/11 02:35
int型の変数10個,a[0]~a[9]を作ります これをそれぞれ1から10まで変化させます このとき,a[i]=a[j] (i≠j) の時を除外して 考えたいのですがどう表現すればいいでしょうか? 思いつくのはif文で || でひたすら結んでいくことですが これだとこの場合10個中2個を選ぶので 10C2=45 個も書かないといけないのは面倒です よろしくお願いします
えーと、関数の仮引数として書いたとき、 typedef double p[N]; とすると、 double a[N][N]とdouble a[][N]とp *aが全部同じだというのは わかってる?
>>606 俺が読んだ感じだと決まってないって。
だからだめなんだって。これが未定義ってやつ!?
>>607 if (a[i] == a[j]) break;とか
if (a[i] != a[j]) で処理を書くとか。
>>610 だよなあ?
わざわざ質問するということはもっと複雑なのか、、、
607 は、漏れも知りたい。 前に SEND MORE MONEY を解いた時、バカなコードしか書けなかった。
スマン。勘違いだYO。
618 :
デフォルトの名無しさん :02/11/11 02:41
>607 よく分からん.等しくなるようなpairが1つでもあったらすべての処理をShinainoka?
きっと、「10個のうちどの2個をとっても互いに異なっている」ように したいのだと思われる。 いろんなやり方があるが、10個くらいなら int a[10], flag[10], i; for (i = 0; i < 10; i++) { flag[10] = 0; } for (i = 0; i < 10; i++) { if (flag[a[i]-1]) { 重なっている } else flag[a[i]-1] = 1; } とやればよいのでは。
620 :
デフォルトの名無しさん :02/11/11 02:42
>>610 >>611 馬鹿でした.すいません
実はわかりやすくするために配列で変数を書いたのですが
実際にはわかりやすいように変数ごとに違う英単語を
使ってたので話がややこしくなってました
コード func(i++,i++); は、func() に何が渡るかわからないが i は確実に 2 つ 増分されるという事でよろしいか?
623 :
デフォルトの名無しさん :02/11/11 02:43
>>619 あ,そういうことです
まったく解決してませんでした(;´Д`)
今から解読してみます
>>624 そうか?
どちらのi++が先に実行されるかわからないけど、確実に二回i++を行うだろ?
>>619 それ、バブルソートよりももっと無駄な比較が発生しないか?
それなら素直に if をずらっと並べた方がマシだ。
>>626 もっぺんC-FAQの11.33読み直せや。
>>622 カンマで副作用完了点が発生するという考えは間違っているのか?
>>623 int *ipa[10]にその変数たちのアドレスをひとつずつ入れてゆけば?
>>631 カンマ演算子と関数のパラメータ区切りのカンマは違うぞ。
それよりも enumで名前をつらねていって、それをintの配列の添え字にした方がいいか。 比較するときは裸の数字を使って。それ以外はenumで定義した名前を使って。
おまえら、本当はCの仕様ちゃんと理解して無いだろ。
>>635 607 は、0 ~ 9 の順列を取りたいんじゃないのか?
>>636 理解していなくてもi=i++やfunc(i++,i++)なんてコードは書きませんから。
>>636 あなたが C の仕様ちゃんと理解してるのはわかったから、早く
>>631 に
答えてくれ。
640 :
デフォルトの名無しさん :02/11/11 02:51
>>619 それで比較されていますか?
a[i]とa[j] i≠j の比較なんですが・・
よくわからないです
>>632 アドレスを入れるとどうなるのですか?
>>635 よくわからないです
実際には誰も書かないような糞式をいちいち未定義ネタとして 挙げんなっつーの。
いちおう初心者スレなので理解していないヤシばかりなのだが。
>>639 がCの仕様を理解していないのが分かってしまったわけだが。
>>644 そういうのを、0、1、2、3、4、5、6、7、8、9 の順列って言わないか?
だから関数の引数のカンマはsequence pointじゃないって。
0,4,22,2,-5,.....,1000 これでもいいんだろ?順列といえる?
>>641 誰も書かないような分かりにくい書き方を好んで書くのが真のC使いだろ(藁
ん? 0から9までだっけ? じゃあループして入れればいいじゃん(笑)
651 :
デフォルトの名無しさん :02/11/11 02:55
>>644 そうです
例えば変数3個で i,j,k だとすると
for (i=0 ; i<=10 ;i++){
for (j=0 ; j<=10 ;j++){
for (k=0 ; k<=10 ;k++){
でまわして,このなかでも i≠j i≠k j≠k
の場合を考えたいのです
変数が10個だと 10C2通り必要なので
いちいち全部書くのは面倒なのです
おバカな煽り厨が1人混ざってんな。
sequence pointのカンマなんかいらんだろ。他の書き方をすれば良い訳で使う必要性なし。
えっと、配列じゃなかったんだっけ?(汗 じゃあa=0;b=1;c=2とかいちゃえ。
>>649 そう思っているのは未熟なおまえだけ。
とっとと消えろ。カス。
早く寝ろよガキども。
int strcmp(const char *p, const char *q) { if (*p != *q) return *p - *q; else if (! *p) return 0; else return strcmp(++p, ++q); } これはOK?
漏れが SEND MORE MONEY を書いた時は、 for (i=0 ; i<=10 ;i++){ for (j=0 ; j<=10 ;j++){ if(j == i) continue; for (k=0 ; k<=10 ;k++){ if(k == i || k == j) continue; と書いた。 もっとマシな方法があったらキボンヌ。
俺がしている。
>>657 お。なんかカッコいいね。実用性はともかく。
名前間違えた。
>>662 実用性って…
whileで書いてもまったく同じコードが出るが?
>>667 ,. -───-: 、
/::::::::::::::::::::::::::::::::\
/ '':::::::::::::::::::::::::::::::''''' ヽ
!::::::::::ィ::ハ:::;::::::::::::::::::::::::::!
i::|:::i::/l/ i;::ト、:、:::i:::::::::::::::i
|::i/レ'-i'' 'ヽi-ヾ,ヽ!:::::::::::::l
|::ハ -‐- -─- i::::::::::::::l
|::::::l| | | | |::::::::::::::!
|::::::ヽ | r---、! l,.!::::::::::::::l
l::::::::::::`;'-'=,‐,='r''i~!:::::::::::::::|
!:::::::l、::r'"´'. ' l ' i::::::::iヽ:::l
i:l、:::|./、_____,l::::;l:/‐'ヽ!
'!ヽ;i'>l____,.//-‐'''"ヽ
!/ |.VVVVVVVV.lV\!. i
| | | l
大阪?
670 :
デフォルトの名無しさん :02/11/11 03:03
>>667 貧乏人は低レベルなところでちょこちょこやってろ。
>>666 はあ?意味わからんよ。
コンパイラがまったく同じコードを吐くってこと?
>>672 そう。
こういう再帰はループとまったく同じコードになる。
>>657 わかりやすいコードだね。
やはり再帰はエレガントで良い
しかしなぜに前置++?
>>674 そうなんか。
ごめん。知らんかった。ちょっと自分でも試してみるわ。
ばかばっか
真のC使いは再帰とループの両方で書けるとき再帰を選びます。 難しそうに見えてかっこいいから(藁
>>657 これは俺へのレスですか?
考えてみます
>>675 二分木扱うときは再帰使うと実にうまく書けると思ったけど、strcmpは・・・
>>680 全然違うだろ(ワラ
さっきからの未定義論争だよ
激しくサンクス
再帰のほうがやさしいだろ。 qsortとか2分探索とか…
再帰は未定義です
memcpyを再帰で書くとどうなりますか?
>>685 クイックソートは分かるが、二分探索(二分木じゃないよな?)はループの方がわかりやすくないか?
678 は昨日も同じことを言ってたバカ
再帰が得意で好きな人は再帰の方がやさしいだろ。だから再帰がやさしいんだ。
まあループをわざわざ再帰にする奴はDQNってこった。
>>670 の URL のコードは、変数名が短かったりグローバル使ってたりして素敵だな。
void *bsearch(const void *key, const void *base, size_t nmembers, size_t size, int (*compar)(const void *, const void *)) { if (nmembers == 0) { return NULL; } else { size_t half = nmembers / 2; void *mid = (char *)base + size * half; int r = compar(key, mid); if (r == 0) { return mid; } else if (r < 0) { return bsearch(key, base, half, size, compar); } else { return bsearch(key, mid + size, nmembers - half - 1, size, compar); } } }
>>693 > free((char *)c)
これ変だよね。freeはvoid *を受け取るのにわざわざキャストしている。
真中より小さければ左半分を、 大きければ右半分を探す。 わかりやすいじゃないか。
俺が書いたコードなんで結構無駄なことやっているとおもう。 void *bsearch(const void *key,const void *base,size_t nmemb,size_t size,int (*compar)(const void *,const void *)) { const unsigned char *left,*middle,*right; int result; left=(const unsigned char *)base; right=left+(nmemb*size-size); while(left<=right){ middle=left+((right-left)/size/2*size); result=(*compar)(key,middle); if(result==0) return (void *)key; else if(result<0) right=middle-size; else left=middle+size; } return NULL; }
memcpyは末尾再帰じゃ書きにくい。返す値がアレだから。
>>674 試してみたけど、BCC(標準設定)では最適化されず、
再帰のままのコードを吐いたよ。
VC++(Releaseモード)では確かにループに展開された。
というわけで、再帰がループと同じになるとは
決め付けない方がいいね。
>>694 の再帰呼び出しは、
引数の代入+gotoと思って読んでね。
実際、気の利いたコンパイラならそういうコードを吐く。
もちろん再帰がいつでもループに変わるという保証はない。 ループで書くとややこしいアルゴリズムはまず再帰で書いてみる。 それで十分効率の良いコードになったなら、わざわざわかりにくいループに 書き直す必要はない。
>>699 それは最適化オプションの有無で違うんじゃないのかい?
>>702 それなら納得。
>>703 標準設定で試しただけだから何とも言えんが、どちらにしても
666の
> 実用性って…
> whileで書いてもまったく同じコードが出るが?
のように処理系に依存する話をそのように決め付けるのは
ヤバいね。
2進→10進変換も再帰で書いたほうが 簡潔だった気がする。
そう言えば、シフトの話って決着した?
そう言えば、配列の値渡しの話って決着した?
(なんでこのスレの住人は過去ログを読まないんだろう…。)
(なんでこのスレの住人は過去ログを読ますんだろう…。)
そう言えば、func(++i, ++i) の話って決着した?
>>703 引き続き最適化オプションを色々指定して試したけど、
BCCではやっぱり無理みたい。
勝手にやってろ! 俺はもう寝る。
716 :
デフォルトの名無しさん :02/11/11 03:46
結論書いとくか。 負の数をシフトしたら結果は未定義。 符号付の数を左シフトしてあふれても結果は未定義。 配列の内容をそのままコピーして関数の引数に入れるような機能は Cにはない。そういうことをしたければ、構造体で囲うなどしなければならない。 そうでもしない限り、配列の先頭アドレスのポインタ値が仮引数に(値渡しで) 渡される。 関数呼び出しの実引数を区切るカンマは、カンマ演算子ではない。 sequence pointではない。
>>716 疑問 2 点。
「負の数をシフトしたら結果は未定義」 という事は、(signed)i >> c; は OK?
「カンマ演算子ではない」 = 「sequence pointではない」 の根拠は?
失礼。 (unsigned)i >> c;、(unsigned)i << c;
>>718 unsignedにキャストすれば結果は決まっている。
「カンマ演算子でないから」というわけじゃない。
「カンマ演算子ではなく、sequence pointでもない」
ちなみに、負の数をunsignedにキャストするとどうなるかは 処理系定義。
サンクス。 で、これで済む話を、みんな延々と何やってたのだろうか。
>>716 > 「カンマ演算子ではない」 = 「sequence pointではない」 の根拠は?
719が模範解答だけど、別の答えとしては
副作用完了点の定義に含まれるのはカンマ演算子で、
関数の実引数の区切りは含まれていない。
この場合に副作用が完了するのは、実引数の評価が
すべて完了した後となる。
>>717 ちなみに負の数の右シフトは未定義ではなく、処理系定義だよ。
>>607 C++ だと、こんなに簡単なのな。
vector<int> v;
for(int i = 0; i <= 9; i++)
v.push_back(i);
while (next_permutation(v.begin(), v.end()))
{
...
}
do while じゃないとダメな事に気付いた。
726 :
デフォルトの名無しさん :02/11/11 05:37
一日で700
一晩で、だろ。
sage
#include <stdio.h>
#define first(n) ((unsigned) ((1U << (n)) - 1U))
enum{N=5,K=2};/* 0-NからK個選ぶ各組み合わせに対する全順列を表示 */
int basicnum[K];
void show_perm(int *bn){
int i,k=1,t,c[K+1];
for(i=1;i<=K;i++)c[i]=i;
while(k<K){
if(k&1) i=c[k]; else i=0; t=bn[k];bn[k]=bn[i];bn[i]=t;
for(k=0;k<K;k++)printf("%d ",bn[k]); /* ここで各場合(bn)に対する処理 */
printf("\n"); k=1; while(c[k]==0){c[k]=k;k++;} c[k]--;
}
}
unsigned nextset(unsigned x){
unsigned smallest, ripple, new_smallest, ones;
smallest = x & -x; ripple = x+smallest; new_smallest = ripple & -ripple;
ones = ((new_smallest/smallest)
>>1 )-1;
return ripple|ones;
}
void setbasicnum(unsigned s)
{int i,j=0; for (i=1; i<=N; i++) { if (s&1) basicnum[j++]=i-1; s>>=1; }}
int main(void){
int i=1; unsigned x=first(K);
while(!(x&~first(N))){setbasicnum(x);show_perm(basicnum);x=nextset(x);i++;}
return 0;
}
かき回した奴寝る→話まとまる→ログ流れる→かき回した奴起きる の繰り返しだな
アルゴリズム事典からパクって組み合わせてみました。 N(アルゴリズムの関係上sizeof(int)*8ビット以下の数),K(<N)を適当にいじって みてください。 ex.(N=5,K=2:0-4の内の2つを選んだ時の順列) $ hoge 0 1 1 0 0 2 2 0 1 2 2 1 0 3 3 0 1 3 3 1 2 3 3 2 0 4 4 0 1 4 4 1 2 4 4 2 3 4 4 3
732 :
デフォルトの名無しさん :02/11/11 11:23
お前等、いつまでくだらない無いことやってんだ? おまえらが馬鹿なのか? それともC言語の仕様が難しいのか?
中傷をすることでしか自分を保てない哀れな 732 の登場
擁護することでしか自分を保てない哀れな 733 の登場
各処理系についているヘルプが貧弱なんだろ。 まともに解説しているヘルプや本がない。
コピペでしか煽りすらできない無能な 734 の登場
>>735 それは確かに。
VC++ とかも 「ANSI 準準拠」 とか言われたら大体信じちゃうよなあ。
煽りすらまともな日本語で書けない無能な 736 の登場
736 の文章がコンパイルエラーになってしまう貧弱な日本語エンジンを持つ 737
740 :
デフォルトの名無しさん :02/11/11 12:43
線形リストは、ノードが増えるたびにmallocないしnewで領域を確保しますよね。 そしてプログラム終了時はfreeかdeleteをつかうわけですが、 ただ単にfree(node)やdelete nodeとするようにポインタ名に対して1回だけ やってやればいいのでしょうか? それとも領域を確保したすべてのポインタを指定して開放しないと いけないんでしょうか?
>>740 確保したすべてのポインタに対して開放処理が必要。
>>740 > プログラム終了時はfreeかdeleteをつかうわけですが
いいえ、まともなOSや処理系ならば、
プログラム終了時にはfreeかdeleteをつかう必要はありません。
>>740 「プログラム終了時」かどうかは置いといて、
とにかくfreeとかdeleteしたいときにどうするか
ということなら、malloc or newした回数だけ
free or deleteする必要がある。
HeapDestroy() で一発
exitで一発
>>742 プログラム側で開放しなくても終了時にOSがかってに開放してくれるんですか?
C++始めたばかりでよくしらんのですが、それはメモリリークを引き起こすんでは
ないでしょうか?
>>741 、746
助言ありがとう御座いました
>>749 引き起こさない。
スタック領域やグローバル変数領域がちゃんと解放されるのと同じこと。
>>749 引き起こす環境もあるかもしれんが、
そういう環境ではどうせまともにプログラミングなんかできない
から、解放しようとしても無駄。
>>749 少なくともUnix系OSやWindowsやMax OS Xでは大丈夫だよ。
デストラクタ呼び出されないからちゃんとdeleteしろ。 環境依存なプログラミングはできるだけするな。
だいぶ理解できました
>>751 MacOS9以下はまともにプログラミングできてましたが?
>>750 > スタック領域やグローバル変数領域がちゃんと解放されるのと同じこと。
C/C++でちゃんとやると決まっていることとOSがやってくれるに違いないは違う。
>753 プログラム終了時はデストラクタが呼ばれるんじゃないか?
742 は、メ(以下略) からしてネタなのに、何でみんなこんなに熱くなるんだ・・・。 面白すぎるぞ。
>>757 new したものを自動で解放してくれる処理系があったら知りたい。
で、スレ違い。
終了時に解放するのがめんどくさいならJavaとかC#使えよ。
>>757 簡単に試験できるんだから、まず試してみろ。
関係無いけど、メモリリークはgc持ってても起きる可能性があるよ
>>762 スレ違いだが興味ある。
GC 管轄外のメモリ機能を使う以外に、どんな可能性がある?
具体例レリーズ
( ',_`)グプ
出任せか ヽ(´ー`)ノ
762じゃないけど、たとえばリングバッファを使ってFIFOを実装したとき、dequeしたときにポインタを進めるだけじゃなくて、ちゃんと参照を消さ ないとリークする。 CやC++のプログラムを機械的にGCmalloc()を使うように書き換えたりする ときに、こういう事が起きる。
C/C++ のニセ GC を GC と言うな。
保守的GCは立派なGCだと思うが... それに、参照を消し忘れるとリークするのは どんなGCでも同じ。
VBが何?
VB.NETにはまともなGCが入っている。 それより前のVBは、Perlとかと同じ参照カウント方式の疑似GC。
参照カウンタ方式は擬似なのか。方式の違い程度のことだと思うのだが。
参照カウンタだと循環参照は回収できない。 双方向リスト作ったりすると即リーク。
776 :
デフォルトの名無しさん :02/11/11 17:39
mallocして得た領域を開放せずに終了した場合、大抵は解放されると思うけど、それってCの規格で保証されている? 開けっ放しのストリームは閉じられることが保証されていたと思うけど。
>>776 保障されてない。でも実際は開放されてるっぽい。
俺は絶対free()する派
778 :
デフォルトの名無しさん :02/11/11 18:10
>>776 終了したプロセスの資源を解放するのはOSのお仕事。言語仕様で規定しても意
味がない。
2chで誤変換をいちいち指摘するバカは2chを使う資格は無い。
>>779 たかが漢字間違いぐらいで鬼の首を取ったようなことを言うなよ
※ここから10レスくらいは罵り合いで消費されるので見なくてOK※※
>>778 それを言ったらストリームを閉じることだってOSの仕事になるんじゃ・・・
>>786 >
>>778 > それを言ったらストリームを閉じることだってOSの仕事になるんじゃ・・・
ちがう。Cで規定されているのは単にストリームを閉じるためでなく、ファイ
ル構造体のバッファをフラッシュするため。ユーザプロセスに割り当てたメモ
リにはそんな話はあてはまらない。
昔、「解放」って書いてたんだけど、 「開放」と書く人が多いんで、最近はそうするようにしてた。 結局どっちが正しいの? ぐぐってみました。 「free 解放」 約15100件 「free 開放」 約19000件
意味考えりゃ「解放」に決まってると思うが
>>788 > 結局どっちが正しいの?
「free 解放 C言語」 約1,970件
「free 開放 C言語」 約1,240件
ですが何か?
790はバッファの「フラッシュ」と「開放」の違いも理解できないと思われ。
規格書:JIS X 3010-1993 7.10.3.2 free関数の引用 free関数はptrが指す領域を解放し、その後の割付けに使用できるようにする。ptrが空ポインタ の場合、何も動作しない。それ以外の場合、実引数がcalloc関数、malloc関数若しくはrealloc関数によっ て以前に返されたポインタと一致しないとき、又はその領域がfree若しくはreallocの呼出しによって解放 されているとき、その動作は未定義とする。 ですが何か?
>>795 規格書は「解放」ですか。
それに習うことにします。
間違えました… ×習う ○倣う
やれやれ、またこの話題かYO!別のスレ立てろや、うぜーから。 何も分かってないJPSは黙ってろ。
まぁ開放だけどね
800 :
デフォルトの名無しさん :02/11/11 21:23
800age
801 :
デフォルトの名無しさん :02/11/11 21:26
char hoge[32] = ""; なんつーふうにやった場合、 最初の\0の後は0で埋められるんでしたっけ?
グローバルなら。
803 :
デフォルトの名無しさん :02/11/11 21:29
質問です。 int hairetu[MAXSIZE]; について、main()の中で宣言するよか外で宣言するほうが MAXSIZEを大きくできるのはなんでなんですか?
>>803 一般にスタックのサイズは小さいから。
関数内でもstaticつければ多く取れるけど
グローバルかどうかは関係なく0で埋まります。
ありがとさんdeath
俺は釣られたの? いいや、自分で調べま。
>>805 あーすまんそうだ。
初期値を全く与えないときは何が入るかわからないんだった。
810 :
デフォルトの名無しさん :02/11/11 21:49
すみませんが教えてください。 以下はどのようなときに成り立つのでしょうか? aが4よりとても小さいときだとは思うのですがどうなのでしょうか? if(a << 4) { }
もうネタはいいよ…
812 :
デフォルトの名無しさん :02/11/11 21:54
int Get_FileSize(char const *file) { int size = 0; struct stat st; if(!stat("file.txt",&st)) size = (int)st.st_size; return size; } は正常に値が返ってくるんですが、 "file.txt"を"../file.txt"という風に相対パスにすると、 stat("file.txt",&st)が-1になります。 ちなみに、ファイルはちゃんとあります。 どうすればいいんでしょうか?
813 :
デフォルトの名無しさん :02/11/11 21:59
>>813 ネタじゃないんですけど、、
初心者ですみません。。
>>812 struct statってなんだ?
stat("file.txt" , &st)
ってなんだ?
関数なのか構造体なのかさっぱりわからん。
これがネタでなくてなんだというんだ。
817 :
デフォルトの名無しさん :02/11/11 22:28
"./file.txt"
815は構造体のタグ名と関数名が同じものになってはならないとでも思っているのか?(ワラ
"file.txt"も相対パスだと思うのだけど
>>812 ../file.txtは親ディレクトリにあるfile.txtを指す
./file.txtでしょ
>>820 うるせーな。ネタだよネタ。おまえらは釣られたんだよ(w
824 :
デフォルトの名無しさん :02/11/11 22:35
826 :
デフォルトの名無しさん :02/11/12 00:30
stat() って非標準だろ。 ここで POSIX システムコールを扱っていいなら、Win32 API も扱っていい事に なるわけだが・・・。
829 :
デフォルトの名無しさん :02/11/12 02:06
ファイル名に変数を入れたいときってどう表記すればいいんですか? A=5; strcpy(file,"NoA.txt",A) "No5.txt"を読み込みたいのですが、↑のように書くと "NoA.txt"は見つかりません。というふうなエラーが出ます。 代入の仕方を教えてください。
>>829 sprintf()
つーか strcpy() の機能をもっとよく理解すれ。
>>829 つーか <string.h> しろ。
いや、入門書から読みなおせ。
今まで見てきたネタの中でも一番すごい
#include <string.h> しろ、だった・・・鬱
>>828 あの質問はstatがどんなものかなんて関係ないだろ。fopenでも同じことが起きるんだし。
プログラム以前の問題だからスレ違いといえばスレ違いだが。
>>829 A=5;
strcpy (file, &(((char*)"NoA.txt")[2]=A+'0')-2);
処理系によってはクラッシュします。
gccの場合は-fwritable-stringsオプションを指定する必要があります。
>>835 文字列定数を書き換えるのか(^_^;)
gccって書き換えられる領域に置くように指定することもできるんだな。
>>835 またそういうネタを・・・
そういえば、文字列リテラルって const char * なのか?
キャスト入ってるけど・・・
>>837 文字列スレッドで誰かが特に決まっていないんだねって言っていたけどどうなんだろう。
VC++6.0やBCCはchar *だけど。
char file[] = "No5.txt"; でいいじゃん。
0,1,2,3,4はどうする?
829 は 5 しか呈示してないから。 やるとしたら、 char *file[]= { "No1.txt", "No1.txt", "No2.txt", "No3.txt", "No4.txt", "No5.txt" }; つーか 830-831 でマジレス出てるし。
>>843 <string.h> がインクルードされてれば、829 のコードはそもそもコンパイル
通らないわけだが。
それで間違ってるって気付けるだろうに。
つーか 842 のどこに 「解決法」 って書いてある?
ようするに、あれだ。 ネタに飢えてるわけだな。
847 :
デフォルトの名無しさん :02/11/12 04:07
お前はオレだ。
イパーイ釣れた (・∀・)
ヽ(´ー`)ノ
855 :
デフォルトの名無しさん :02/11/12 07:44
お勧めの高橋麻奈タンの「やさしいC」について出版社から連絡ありました。Linuxでも使えないことはないし、この本をLinux用として使っている人もいるが、基本的にはWindows向きだって。 僕はVineのemacsでCをやりたいから教えてください、って言ったらこの本紹介されたのに・・・・・嘘吐き!!もうキャンセルできないよう。。。。。
856 :
デフォルトの名無しさん :02/11/12 07:52
from
>>1 > ソース丸投げ、宿題、書籍 は専門の別スレがあるからそこへ逝ってくれ。
>
> 上記を守らない書き込みをした場合、その結果は禿しく未定義とする。
857 :
デフォルトの名無しさん :02/11/12 07:56
>>855 です。実は今日買わなきゃなんです。使える本であることを希望します。
858 :
デフォルトの名無しさん :02/11/12 07:57
でもここの人っていい人ばかりですね。
もうすぐ次スレの季節だが、気が向いたら
>>35-36 を拾ってくれ。
をを。 しかし、dat 落ちのままのスレが 12 本って、このスレの回転が無駄に早い事が 分かるな (;´Д`)
>>861 やはり、Cの未定義の結果は多くの場合、coreを吐くからな。
(core = 煽り合い)
仕方がない
864 :
JPS ◆M0LaMzf5rY :02/11/12 15:58
ビット演算の勉強はかどりますた。
やべー。 860 の文字列が全部、スラッシュで区切られた 「ワラタ」 に見えたYO・・・ 眼科に逝くべきか、精神科に逝くべきか。
867 :
60cm浮き上がるストレート :02/11/12 16:42
printf等で値を外からを与えることで幅を変える事は出来ますか? うまく説明できませんが、printf("%s","%-30s","abcde");みたいに。 今は、あらかじめ幾つも作っとく方法でやっているのですが.
868 :
デフォルトの名無しさん :02/11/12 16:45
sprintfでつくってprintfかな。
>>867 マニュアルを読め、printf/scanfは奥が深い
int a = 5;
printf("%*.*s\n", a, a, "abcdefg");
a = 20;
printf("%*.*s\n", a, a, "abcdefg");
すいませんまだCを初めて間も無い厨です 質問したいんですが 文字列と文字を一緒に出力しようとすると なぜか文字だけ出力されません 具体的には #include <stdio.h> main() { char ch[100]; char c; printf("文字列:"); scanf("%s", ch); printf("文字:"); scanf("%c", &c); printf("\"%s\"\n", ch); printf("\'%c\'\n", c); return 0; } とやるとscanf("%c", &c);を読みこんでくれないようなのです ちなみに文字列なしで文字単体のプログラムをするとちゃんと出力されました どなたか知恵をお借りしください
> どなたか知恵をお借りしください ヘンナニホンゴネ
>>868-
>>869 お答えありがとうございました.
>>868 その方法は調べて勉強してみます.
>>869 あるだろうと思ってたんですが、あったんですね.文字列に割り込めるやつ.
1つ目の*は従来のスペース幅を替えるやつ。引数をマイナルにすれば左寄りになる.
2つ目の.*は始めて見たのですが、どうやら表示文字数を変えるやつみたいですね.
文字列が10文字でも.5なら先頭から5文字だけ表示する。
ただこれは文字列専用のようで、%ldとかだと効かないみたいです.
>>871 お貸し下さい
でしたすいませんm(__)m
printf("文字:"); scanf("%1s", &c);
>>870 > 文字列と文字を一緒に出力しようとすると
> なぜか文字だけ出力されません
はて、ちゃんと「改行文字」が出力されているはずだけどな。
多分
> printf("文字:"); scanf("%c", &c);
printf("文字:"); scanf(" %c", &c);
こうすれば、(%cの前にスペースを入れる)君の思ったとおりの動作をするはずだ、
なんでそうなるかはマニュアルを見ろ。
みなさんありがとうございます解決しました!
いくつかやり方があるようなのでその辺の仕組みは調べてみます
>>875 氏
まさにその通りです
文字列:hogehoge
文字:"hogehoge"
'
'
こんな感じで改行だけされてました
#include<stdio.h> #include<search.h> #include<string.h> #define MAXDATAS 20 #define MAXCHARS 20 int lencmp(char **ax,char **ay) { if(strlen(*ax)<strlen(*ay)) return(-1); if(strlen(*ax)>strlen(*ay)) return(1); return(0); } int main(void) { int i,j; char *point_date[MAXDATAS]; char buff[MAXDATAS][MAXCHARS]; for(i=0;i<MAXDATAS;++i) { printf("Input string[%02d]:",i+1); point_date[i]=&buff[i][0]; gets(point_date[i]); if(0==*point_date[i]) break; } qsort(point_date,i,sizeof(char *),lencmp); printf("\n<Sorting>\n"); for(j=0;j<i;++j) printf("%2d:%s\n",j+1,point_date[j]); } でコンパイルしようとしてもエラーが出てできません。エラーの内容も読みましたが知識?不足でよく分かりません だれか教えてください!おねがいします。
>>878 qsort()の行をこうしてみれ。
qsort(point_date,i,sizeof(char *),(int (*)(const void *, const void *))lencmp);
880 :
デフォルトの名無しさん :02/11/12 20:07
>>878 stdlib.hをインクルードしていないから
エラーじゃなくて警告じゃない?
C言語の一番大元の仕様書(ANSI?)ってどうやったら手に入れられます?
>>880 qsort()ならsearch.hをインクルードしてるから大丈夫だよ。
あとgccなんかだとimcompatible pointer typeと警告が出るかも。 消したかったらint lencmp(char **ax,char **ay)をint lencmp(const void *ax,const void *ay)とし、中で適切にキャストするとよい。
s/imcompatible/incompatible/
>>882 そうなの!?
search.hなんてしらねー(T_T)
>>878 エラーメッセージがわからなかったら、それをここに貼るといいよ。
887 :
デフォルトの名無しさん :02/11/12 20:38
Cでwindows上で動くアプリって作れるんですよね? で、今後の目標に、Cではどんなアプリが作れるのか見たいのですが Cで作られたアプリってどんなのがありますか?
888 :
デフォルトの名無しさん :02/11/12 20:40
>>887 普通のアプリなら、なんでも作れるよ。
ドライバとかは、もしかしたらアセンブラが必要かも知れないけど
>>887 > Cでwindows上で動くアプリって作れるんですよね?
C + Win32Apiを使えば大概のものは作れる。
879さんのおかげで無事コンパイルできました!サンクスです!
895 :
デフォルトの名無しさん :02/11/12 21:20
あげ
Cで子供も作れる
897 :
デフォルトの名無しさん :02/11/12 21:39
900 :
デフォルトの名無しさん :02/11/12 21:57
#include <stdio.h> main() { int dec, bin=0, bit, coef=1; char endchar; do{ scanf("%d%c",&dec,&endchar); printf("%3d\t",dec); while(dec != 0){ bit = dec % 2; dec /= 2; bin += bit*coef; coef *= 10; } printf("%10d\n", bin); }while(endchar != '*'); } 10進数→2進数のプログラム。参考書どおりに打ったのにちゃんとでてきませぬ。 13, 10, 8, 7, 5, 3*と打つと、最初の13は正しく出るのですが、10以降はボロボロ… 「おまいのここが違ってる!!」というのがあったら教えてください。 おながいします。
901 :
デフォルトの名無しさん :02/11/12 21:59
ちなみに動作環境はOSがXP、「Borland C++ Compiler 5.5.1」で「C言語を始めよう」を使ってます。
902 :
デフォルトの名無しさん :02/11/12 22:07
>>900 coefがループごとに初期化されてない。
903 :
デフォルトの名無しさん :02/11/12 22:18
char a[10] = {'\0'}; と char a[10] = {0}; はどちらも全要素0で初期化されますよね?
904 :
デフォルトの名無しさん :02/11/12 22:19
>>903 される。つーか何度もその話題は出ている
>>904 何度でたか知らんが、オレは初めて見た。
お前のために地球が回ってるんじゃねーんだよ?
>>905 わけのわからん煽りだな。
905=903に違いない。
配列の要素a[1]を1[a]と表せると聞いたんですが1という配列のa・・・? 変数名の先頭に数字は使えないはずですよね?
>>909 a[1] == 1[a] = *(a + 1) == *(1 + a)
>>910 そういうのはどこで習うんすかね。
どういう本を読めばいいんですか。
910 は意味不明 a[1] == *(a + 1) == *(1 + a) == 1[a] だろ?
回答がテンプレート化するほど既出なのはわかるが(なんせスレ41) 簡潔すぎて初心者にはわかりにくいスレになってしまったのかも
寂れたねぇ
錆レターね
だれか前40スレを読破して、FAQつくらないかなぁ。 まあFAQ作っても読まない香具師はいるだろうが、、、
俺もそういうの考えたことある。<CスレFAQ
923 :
デフォルトの名無しさん :02/11/12 23:24
>>902 binとcoefの初期値設定の場所を変えたら成功しますた。ありがとうございます。
そうですね、どんどん大きくなりっぱなしってね
早く質問こないかな
正直言ってa[1]を1[a]なんて書く必要なんてないわけで コンパイルエラーになってくれたほうが良い。
まーねー
x["0123456789abcdef"]
お前ら、何でCには真偽値型がないんだ。 if(flag==true) って書くと期待通りに動かないじゃないか、この糞言語め。
>>928 何それ?文字列の中のxの位置の文字ってこと?
932 :
デフォルトの名無しさん :02/11/12 23:50
"0123456789abcdef"[x]
933 :
デフォルトの名無しさん :02/11/12 23:53
>>929 > if(flag==true)
真偽値のある言語でも、こういう書き方してるのって素人くさいと思う。
"01234567[x]89abcdef"
これぐらいで文句をいってはいけない。 その昔、構造体のメンバのアクセス演算子が ! 立ったころ、 foo!bar を bar!foo と 書くことができたんだそうな。
>>933 真偽値のない言語を使ってるヤツからはそう見える。
いい加減釣りは余所でやってくれ。
>>937 おまいが C 言語しか触ったことないのバレバレなんだが
> if(flag==true) なぜ if ((flag == true) == true) と書かないんだ?
>>942 プ)
お前こそ C 言語しか触ったことないのバレバレ
bool 型がある言語だとこんあ漢字? if flag = true then ... if flag then ... if a = b then f := true else f := false; f := a = b;
>>942 if(flag)だけだとflagが真偽値が明確ではない。
if(flag==true)だとflag真偽値であるのが明確。
if((flag==true)==true)は既にflagが真偽値であるのが明確なので無意味。
分かると思うけど一応訂正。 × if(flag)だけだとflagが真偽値が明確ではない。 ○ if(flag)だけだとflagが真偽値であるか明確ではない。
>>945 いいから黙って if(flag) を使っとけ。これ最強。
if文が実行されれば真、されなければ偽。これほど明確なことがあるか。
>>949 ほらね。実行しなきゃわかんないんだろ。
bool flag2 = (flag==true); if(flag2==true) { } ここまでやれば完璧。誰が読んでも明白。
>>951 バカか。
if(flg==true)
と書いたって実行しなきゃわからんだろ。
#define flag true
>>953 実行しないで(ぱっと見るだけで)分かるのはflagの型。
>>952 それは結局。if(flag==true)と同じなんだけど...
>>955 見るだけで何がわかるんだよ。
flgは真偽しか返さないのにいったい他に何がわかるんだ。
>>957 flagの型って書いてあるだろ。まあコーディング規約でflagは真偽しか
返さないと決めてあるのなら別だが。
if(flag)//flag is true or false kanpeci
>>958 どうしても型が知りたいっていうなら別だが・・・
型を知ってどうするんだ?
そこで型がわかったところで意味ないと思うんだが。
#define isTrue(x) x!=0
if(flag)より if(flag==true) の方が可読性で勝ると思ってる奴は初心者。
ふむ。
gcc version 2.95.4 #include <stdio.h> #define N 4 int main(void) { int j; char a[N] = ""; for (j=0;j<N;j++) printf("%d ", (int)a[j]); return 0; } $ ./a.out 0 37 100 32 なんかゴミが入るんだよなぁ。 c99 6.7.8 12 If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
a. 明日雨が降ったら、遊びに行くよ。 b. 明日雨が降ったら、が真なら、遊びに行くよ。
>>963 反論できないから初心者ということにして誤魔化すことしかできない程度
>>966 a. 旗だったら、遊びに行くよ。
b. 旗が立ったら、遊びに行くよ。
要はflagがbool変数かどうかを知りたいってこったな。 つまりそれがC99で書かれていることが読み取れるわけだ。 (´_ゝ`)ふーん
>>968 えらく自分の都合のいいように解釈してるな(w
>>970 そう解釈できるのだから間違ってないだろ。
>>969 自分で何を言っているか分かっていますか?
ずいぶん新着レス数多いなと思ったら・・・・香ばしいな
>>973 型が知りたいんだからそういうことだろ。
flag の型が知りたいから if ( flag == true ) とするってならこんどは (flag == true) の型を知るために if ( (flag == true) == true ) こうしなければならない。さらに ((flag == true) == true) の型を知るために(略
bool型があるならまだいいけど無いならあんまり必要性感じないなぁ<true比較
C99じゃないならflagの型を知りたいと言ってもintの可能性があるんだろ? じゃあ型がわかったことにならないんじゃ。
むしろ int flg; とかやってるのに if(flg == true) を見ただけで「flgには0か1しか入っていないはず!」と勘違いする可能性が… でも実はflg=5;とかできちゃうわけで。
よし。
if(!!flag == true)
これなら一石二鳥だ。
>>972 面白いね。
> C言語のことは漏れに聞け!char *c[42];
この辺まで考えてるとは。
>>982 ちょっとわかりにくいタイトルかなとは思ったんだけど、配列のインデックスが0から始まるC
だとちょうどタイトルの番号と過去スレの番号が収まっていいかなと
>>981 intとboolを比較したら普通はエラーだろ?
>>978 if(flag)だけだとflagが真偽値であるか明確ではない。
if(flag==true)だとflag真偽値であるのが明確。
if((flag==true)==true)は既にflagが真偽値であるのが明確なので無意味。
flagなんていう抽象的な名前で考えるから分らない。 たとえば具体的に int error_occurred; のとき if (error_occurred == true) なんて書いてたらただのDQNだろ。
>>942 なぜ
if (((flag == true) == true) == true)
と書かないのかと小一時間…
988 :
デフォルトの名無しさん :02/11/13 01:15
ユーザーが指定した数をカウントする関数作り i2=3; j2=4; ij=i2*j2; if((str1=(int**)malloc(sizeof(int*)*i2))==NULL){ printf("メモリー確保の失敗:1"); exit(1); } for(i1=0;i1<i2;i1++) if((str1[i1]=(int*)malloc(sizeof(int)*j2))==NULL){ printf("メモリー確保の失敗:2"); exit(1); } for(i1=0;i1<ij;i1+=j2){ putchar('\n'); for(j1=0;j1<j2;j1++){ printf("%c",str1[i1/j2][(len++)%i2]=('A'+i1+j1)); } } putchar('\n'); for(i1=0;i1<i2;i1++){ putchar('\n'); for(j1=0;j1<j2;j1++) printf("%3d",str1[i1][j1]); }
あのーC99より前のCにtrueやfalseという予約語ありませんよね?
>>987 だから足りない情報(boolであるか)は一つ目のtrueで補えているから二つ目以降は必要ないだろ。
>>985 if ( flag == true )
だと flag が真偽値であることは明確だが
(flag == true) が真偽値であることは明確ではない。
次はあのスレ行かなきゃダメなのか・・・鬱
>>991 (flag==true)は真偽値を返すことになっているはずだが。
このユーザーが、指定した数をカウントする関数を教えて・・・・
まもなくここは 乂1000取り合戦場乂 となります。 \∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!! ,,、,、,,, /三√ ゚Д゚) / \____________ ,,、,、,,, /三/| ゚U゚|\ ,,、,、,,, ,,、,、,,, ,,、,、,,, U (:::::::::::) ,,、,、,,, \オーーーーーーーッ!!/ //三/|三|\ ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧ ∪ ∪ ( ) ( ) ( ) ) ,,、,、,,, ,,、,、,,, ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧ ,,、,、,,, ( ) ( ) ( ) ( )
if ( DQN ) abone(); もし DQN なら あぼーん if ( DQN == true ) abone(); もし DQN が 真 なら あぼーん
>>983 今回はもう手遅れっぽいけど、次のスレでは
是非この案を採用して欲しいと願ふ。
おしえて
>>1001 んなこた~わかってんだよ。いちいちウザイぞボケ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。