C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
確かにエラー出るんだけど、できないってことでいいの? 外のスコープで定義されたものと名前が衝突した場合は内側の方が有効になり 同じスコープで衝突した場合はエラーになる int* ptの意味は意味int *ptだよ。 ptをデリファレンス演算子で評価したらint型になるよという宣言だよ。 変数名が型ごとに独立した名前空間に属する、という言語があるのかな。 原理的には可能だと思うけど、えらく組みにくそうな気がする。 「型だけが異なる同名の変数を使わない」みたいなコーディング規約を強制されそう。 構造体のネームスペースみたいに 全部の変数に型名をつけるようになるだろうな。 リーダブルコーディングとeffective以外に本を探してるのだけど他にあるかな? 組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、2006 >>488 perlは$aと@aと%aが違うけどな。型と言うよりはスカラか配列かハッシュかの違いだな。 >>493 ネットで MISRA の詳しい解説はありませんか? 処理重視なら毎回毎回変数宣言って処理が鈍くなるよな? C++でもないのでコンストラクタ走るわけでもないです スタック操作なんか関数呼び出し時にまとめてやってるから、どこで宣言しようが処理速度は変わらないけどな。 >>499 その程度ならコンパイラが良きに計らってくれますよ for文の中の変数宣言って外で行うよりオーバーヘッド大きいの? >>504 言語上ブロック内で有効なだけで、 他の自動変数同様スタックに余分にとられるだけだからまず変わらない。 >>499 宣言だけ?メモリ確保とかは自分でやらずに? だったら最初に確保する一回分だけの時間しか掛からないと思うぞ。 あ、C++みたいな言語でクラスの中でメモリ確保してデストラクタで解放やってるような場合は ループするブロックの中で宣言したら最低でもメモリ確保と解放でループの回数分時間 掛かっちゃうだろうけど、C言語にはそういうのはないので掛からない。 動的に確保というのはあるだろうが、 俺を意識した使い方するだろうし >>506 for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた そのレベルの理解なら気にする必要はない そもそもCを使う必要もない >>511 > for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった よほどショボいコンパイラでない限り気にする必要はない > なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた そう言うアホな本は窓から捨てるべき >>513 それは中の処理が大量になっても大丈夫なのか? 20行、30行ぐらい長い処理でも? 宣言と長い処理って何処に関連が? 初期化の右辺がすんげー長いというのは 変数宣言がループの中にあろうが変数宣言をループの外に追い出しても 同じで必須コストだしそこは論点じゃないよね >>516 全部ヒントに「コンパイラが最適化でやる」って書いてあるし 逆にそのコストが重いようならもっと根本的な手入れ(アルゴリズムの見直しとか)が必要だし >>514 測定して本当にそれが問題になってるとわかった時に考えればいい >>516 「実際のところ」と書いてある所をよく読むべき。 コードとは直接関係はないけどメモリリークのテストってlinuxだとどうやるのだろう? >>522 valgrind か LeakSanitizer 脳内ループ最適化かー。結構良く目にするのは int i; for(i = rows; 0 < i; i―) Hoge; だったりするけど 組み込みでも、このくらい最適化かかるのにねぇ >>523 >>524 ありがとう調べてみる 別件なのだけど、systemの子プロセス戻り値をみるときって ret=system(コマンド) if(wifexisted(ret)) { wexitstatus(ret) } これだけで良い?エラー処理ってほかにいるかね? wifsignaledとかwtermsigとかいるのかね?ってなってるんだ その他のマクロについても.... >>526 systemって-1返す事なかったっけ? >>522 オレは単純にpsコマンドで、vszとszの推移を見てるだけだなー 確保の仕方にもよるだろうけど。。。 >>529 メモリマップとかは見てると分かった気になれるし、仕事してる感も出るからおすすめ >>528 うおおおおお たしかにあった >>527 -1は素で忘れてた >>443 見てみたけど最後if elseで終わってるからその後がどうなんの?って気になる if elseってことは他もあるじゃん?ってなるのだがいかんせんman理解できない... >>531 https://linuxjm.osdn.jp/html/LDP_man-pages/man2/wait.2.html Linux の場合大きく分けて WIFEXITED と WIFSIGNALED 以外があるのかというと今のところない。 しかし将来的に増えないとも限らないので念のため if で分岐させておいた方が良いと思う。 >>533 3点ほど 配列使う必要ある?保持したいのは最大値だけなんだよね?入力ループ内で最大値判定までやったら? ローカル変数名は input_num とか分かる名前つけようか main の戻り値 C99以降だっけ? 省略された int main() の返り値として自動的に return 0; が補われる、 という仕様があるはずだけど、それに積極的に依存するよりも return 0; と1行書く方が良い習慣だわね。 >>532 さんくす これ読みにくいよなぁ.... 子プロセスの配送が停止したとき 具体的に言うとwifstoppedの時は別なのかな? stdlib.hのSUCCESSなんちゃらをほんにゃら >>536 試してみればわかると思うけど system() で動かされた子プロセスは SIGSTOP 受け取っても 停止するだけで親プロセスには帰らないよ。system() 内でやってる waitpid() は WUNTRACED や WCONTINUED オプション使ってないってことだと思う。なので STOP や CONT に関係する WIF... はやる必要がない。 char str1[10]="AAAAAA"; char str2[10]="BBBBBB"; char str3[10]="CCCCCC"; があって、これをそれぞれ char strh[0][10]〜char strh[2][10]に代入する方法を教えてください。 strcpy(strh[0],str1); strcpy(strh[1],str2); strcpy(strh[2],str3); と適当に書いてみる。 ポインターのコピーじゃダメなんですか? なんで中身をわざわざ複製して、処理時間を無駄に消費するんですか? >>538 ありがとうありがとう そうすることにする stat関数でのファイル存在確認って破損していたファイルだとエラー返ってくる? 仕様を調べていたけどそのような記載がなかった >>541 ポインタのコピーだとコピー元の配列(str1[],str2[],str3[])の中身を変更するとコピー先(*strh[0]〜*strh[2])の内容まで変わる 値のコピー(strcpy()など)だとコピー元の配列の中身が変わってもコピー先の配列(strh[0][]〜strh[2][])の内容は変化しない 配列とポインタでは挙動が違う 初期化でやってしまう話じゃないんだろうな。 多分 char strh[3][10] = { "AAAAAA", "BBBBBB", "CCCCCC" }; 配列変数はただのポインタ変数じゃないってマジ? arr==&arrになるんやが。 arrがポインタなら&arrはポインタのポインタだからこれはおかしい。 int a[10]; int *p; p++; 問題なし a++; エラー 配列は配列 ポインタはポインタ arrと&arrじゃ型違うし、比較結果が一致する保証もないけど? >>545 ポインタの変数はポインタを入れとくための変数だ。 配列変数はポインタを入れとく変数ではなく、単に配列の先頭を表すラベルでしかない。 >>545 int arr[10]; みたいに配列を定義して if (arr == &arr) {...} てな具合に比較する話かな。 配列名 arr は &arr[0] (先頭の要素へのポインタ) 配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ …と解釈される、とANSIで決まった、と望洋さんの本に載ってる。 『秘伝C言語問答 ポインタ編』p.25 Column1-2 「配列名に&をつけると……」 >>548 型が違うのは間違いないけど、値が一致しない場合ってあるのかな? それとも型の異なるポインタ同士での値の比較って未定義動作なんだっけ? >配列名 arr は &arr[0] (先頭の要素へのポインタ) >配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ >…と解釈される、とANSIで決まった、と望洋さんの本に載ってる。 なるほどな >>552 >6.5.9 等価演算子 >(中略) >制約??次のいずれかの条件を満たさなければならない。 >(中略) >-両オペランドとも適合する型の修飾版又は非修飾版へのポインタである。 「〜型」と「〜型の配列型」は適合しないから、ポインタの比較は未定義 >>552 型が異なったら、比較できない 例えば、アドレス100番地から10バイトと、 アドレス100番地から20バイトでは、全然違う 仮に、同じバイト数だとしても、中身・内容が異なるし、比較する事に意味がない >>542 ファイルの破損というのがファイルの中身の論理レベルの話なら正常なファイルとみなされるはずだし、ファイルシステムレベルの破損やメディアの物理的破損なら実装依存じゃないかな。 >>555 いま話題にしているのはarrと&arr[0]の比較であって、これらはどちらも比較演算子のオペランドとしてはint*型として評価されて型も値も一致すると思ってたけど、どうだろう。 >>557 間違えた。arrと&arrね。&arrもint*型のはず、だと思う。 実際にコンパイルすれば型不一致のwarning出るのに、なんでそういう発想になるんだろう 不思議だわ >>557-558 int arr[10]; と定義されてる場合、 arr の型は int* &arr の型は int (*)[10] つまり arr と &arr は型が違う というのが >>552 の「&arr は配列全体へのポインタ」の意味。 「引数として『10個のintを要素とする配列』のみを受け入れる関数」 (要素数が違うとコンパイルエラー)みたいのを書ける。 もちろん、それが目的で存在する書式じゃないだろうけど。 それにしても &arr の型の書き方は分かりにくいな。 理屈は多次元配列を仮引数にとる関数プロトタイプと同じ、 だと思うんだが。 >>560 arrの型はint[10]だボケ &arr[0]がint*だ おまえさんの、その理解では&arrがint**になっちまうだろうが arrは&arr[0]の糖衣構文なので型は同じint*だろ 代入左辺の int* に渡す右辺 関数引数の int* に渡す引数 ここに渡す際に先頭要素へのポインタを与えてるだけで 変数そのものはポインタにはなっていなくて配列のまま arrは要素10持つ配列の先頭アドレスを返す、サイズはint 10個分 &arr[0]は、配列要素0番目のアドレスを返す、サイズはint 1個分 先頭アドレスが欲しいだけなら型キャストして使えばいい。 代入に使うならサイズが違うから上手く行かない。 arr = &arr[0] ≠ &arr sizeof(&arr) = sizeof(&arr[0]) ≠ sizeof(arr) >>563 いーや違う §6.3.2 Other operands Except when it is the operand of the sizeof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type'' is converted to an expression with type ‘‘pointer to type ' that points to the initial element of the array object and is not an lvalue. あくまで配列からポインタへconvertedつまり元の型int[10]とは違う型int*への変換だ C言語は覚えることが少ないので初心者にお勧めです👈 氏名、生年月日を入力させて、年齢を出力する。(ここまではいい) 再度起動時に、同一氏名入力時は生年月日と年齢を出力する(これがわからん) 方向性がさっぱり見えない、どうすりゃいいの? http://codepad.org/BVM0iMi4 入力された氏名のファイルを探す 無い→ファイル作って 入力した生年月日を書き出すとともに変数に覚えておく 有る→ファイルから生年月日を変数に読み込む ↑の処理で変数で覚えている生年月日から年齢を求め表示する if文&fread,fwriteでなんとかなります? あと出来ればリンク先のソースコードにダメだし貰えると嬉しい ファイルが一個しか使えないんなら、 その中に何の情報をどんなフォーマットで入れるか先に設計しろ。 >>562 言葉は悪いけど言う通りだね。 俺が書いたのは arr て名前が演算の対象として単独に現れたときに 自動的にポインタの値に変換される場合の値と型のことだった。 arr 自体はあくまで配列だから int[10] この名前が関数の引数とかで使われた場合 &arr[0] と同じになる。 配列名は隙あらば「先頭要素へのポインタ」になりたがる。 こんな感じでよろしいか? (我ながらぎごちないけど) ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる