C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
>>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] と同じになる。 配列名は隙あらば「先頭要素へのポインタ」になりたがる。 こんな感じでよろしいか? (我ながらぎごちないけど) >>577 fprintf()で一行にカンマ区切りで名前と生年月日出した方が扱いやすいのでは? で、処理の順序としてはこうだ。 1. 名前入力。 2. 入力された名前がファイルの中にあったら一緒に入っている生年月日を出して終了。 3. 生年月日入力。 4. 名前と生年月日をファイルに追加。 5. 終了。 ファイルアクセスは2では読み出ししかせず開きっぱなしにしないでクローズする。 4では追加書き込みだけしてクローズだ。 >>579 演算の対象ではなく、特定の演算子の対象な どの演算子で&arr[0]に変換されるのか、 列挙できる知識が必要ということだ XMLで なんていうと余計にややこしくなって大変な事になるなw >>583 左辺値が変換されるのであって、特定の演算子のオペランドのとき変換されるなんて仕様はないよ? 特定の演算子のオペランドのときに変換されないって仕様はあるけどさ >>585 Cの演算子は「特定の演算子」の集合で、 そこから、ある特定の演算子を除いた残りもまた 特定の演算子だろうがよ 宣言とか、演算子出てこないことぐらいあるだろ 初期化子つきの宣言に出てくる=が代入演算子だとでも思ってんのか? >>584 C# とか C++ ならまだしも C言語だとちょっと辛いわな >>574 程度なら .ini ファイルみたいな奴でいいかと >>587 ちなみに、初期化子つきの宣言に出てくる=が代入演算子でないとすると、 その=は何と呼ばれるものです? >>587 宣言? おまえさん、int arr[10];がint *arr;に変換されるとでも思っているのか? 仮引数にint arr[10]と書くとint arr[]に読み替えられたりはするが、 そのことを言っているのなら>>562 で指摘したとおりになるな ただし>>560 にはセミコロンが付いていてそういう逃げ道は封鎖されているわけだが int arr[10]; int *p = arr; /* このときの arr の解釈 */ を指してるのだと思うの。 ここで出てくる = は代入演算子じゃないぜ って 我輩は宣言子と初期化子の間の=である。名前はまだ無い。 >>589 初期化宣言子 init-declarator >>593 なるほど、情報サンクスです。 C++だと、同じものが代入演算子と称されていて。コンストラクタ内で代入演算子をオーバーロードすべし、 のような言い方をよく見かけますので。Cでも同じ呼び方をするのかと思ってました。 いやまて init-declarator は、"宣言子"か"宣言子=初期化子"のことだぞ >>594 あー、よく見たらC++ではコピーコンストラクタと代入で明確な区別があるんですね。 もっと勉強しなきゃですわ プログラミング初心者です 車のタコメーターをフルカラーのディスプレイを使って作りたいのですが、どうすれば良いのかが全く分かりません C言語は計算機内で式の答えを演算する程度なら使えますが、ハードを制御したりはできないです(Arduinoなら少し弄りました) C言語で作れるのかも分からないので、簡単なところから教えてください エンジン回転数のパルス信号は取れてます Ardudinoを弄ったことがあってハード制御ができない? パルス信号を取れるっていうのは、オシロスコープか何かで確認できたってことか? ・・・もしかして、こういうことか? その信号をプログラムで読み取るには、どこの端子に繋ぐのかとか、 信号のレベルの合わせ方とか、そういうことがわからんのか? マイコンに表示装置とかをくっつけて デジタコを0から自作したいってことなのかな? 言語外の相談のほうが重要度高いような気もする 信号→マイコン→処理 は分かります その処理を今までPC上に表示させていた物をディスプレイに↓のようにカッコよく表示させるにはどうすれば良いのかを教えてほしいのです https://i.imgur.com/S3sahkU.jpg 何から調べていいのかも分からない状態です ど素人ですみません… そのディスプレイとやら仕様書見せてくれなきゃ なんとも答えようがなくない? >>603 ターゲットのマシンは? Windows? Linux? ていうか、C言語でやると何で動かすにしても大変面倒だと思うので何か他の言語使った方が良いと思う。 言語もバードも指定は無いです 寧ろ何を使えば良いのかを教えて欲しいです ターゲットがよく分からないのですが、コードはUNIX系のOSのemacsで書いてます Windows上で作ったプログラムを動かしたことはあまりないですね ディスプレイのつなぎ方がわからんのか? つないであるディスプレイへのコマンドの送り方がわからんのか? >>599 PCのウィンドウ環境上でウィンドウを開いてグラフィック表示って問題なら、 環境次第でここでも分かると思うけど…。 部品としての液晶やLEDのパネルのハードウェア制御ってことになると、 まずはどの部品を使うのか、って話になるな。 なにがベストかと聞かれても答えにくい質問だな。 自分ならデータを無線で飛ばしてタブレットでみれるwebシステムを検討したい案件だが。 消費電力、サイズ制限、予算諸々考えてどの程度のハードが用意出来るかって所から linuxやwinが動くようなリッチな環境が用意出来るなら GUI部はCじゃなくても良くねってのが正直な感想 BT接続できるOBD2アダプタ(点検器具端子)買ってアンドロ端末に表示するのがお手軽かも >>597 おれも少し変だとは思うけど、企画書には、宣言子単独が init-declarator に含まれてるんだよ >>608 > ターゲットがよく分からないのですが、コードはUNIX系のOSのemacsで書いてます 根本的に分かってないようだが、「ターゲット」ってのはお前が決めるんだよ。 そして既にコードを書いていて、そこにLCDを接続したいだけなら、その環境を言えよ。 >>615 初期化子なしは、不定値で初期化するって意味だと納得することにしてるわ 一応、初期化の説明に含まれてるし。。。 つーことで、>>586 とかには演算子のオペランドでないこともあるって理解してもらえたかな 良かった良かった >>603 >信号→マイコン→処理 >は分かります で、信号は取れたとか言ってるんだから対象の物理的扱いはわかっているんだろ。 それをどんなマイコンにどう繋ぐかだ。出来合いのマイコン基板を買ってきて それに繋げるのか、基板から自作するのか >>618 586だが、だから何だ? 演算子に限らずとも、Cは明確に列挙された機能の集合だ そこから特定の演算子を除いた残りは、 おまえが言うような曖昧な集合ではない ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる