C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
funcに与える引数の条件がちゃんと理解できてないとか char[m*n]って何?
結局ただの一次元配列でしょ? >>506
堂々と嘘つくんじゃねえ
sizeof(char[m][n]) != sizeof(char**) >>503
> 2次元配列というのはC言語的にはシンタックスシュガーにすぎず、
> char a[m][n]もchar a[m*n]も等価なのですよね。なので、先頭ポインタから(m*n-1)個先までの
> アドレスの範囲内なら範囲外アクセスエラーは起こり得ないと理解しています。
だいたいの実装では、特に char 類なら、動作上問題が起こることは考えにくいものの、
言語規格上の保証は無いよ。
https://www.jpcert.or.jp/m/sc-rules/c-arr30-c.html そういう保証は紙っきれの条文より自分で確認・検証することが最重要だ
いくら「保証されている」ことでもコンパイラがバグったり中には確信的に違反するケースまである
空想論の域を出ないくだらんことのために
現実的なアイディアを諦めていては生産性が上がらない struct I2C_MEM
{
char DEV_ADR ;
char REG_ADR ;
char DATA[4] ;
} static I2C_MEM0 ;
I2C_MEM0.DEV_ADR = 0x7C ;
I2C_MEM0.REG_ADR = 0x01 ;
I2C_MEM0.DATA[4] = { 0x11,0x12,0x13,0x14 } ; ←これはエラーになる
//I2C_MEM0.DATA[0] = 0x11 ; ←こちらのパターンはエラーにならない
//I2C_MEM0.DATA[1] = 0x12 ;
//I2C_MEM0.DATA[2] = 0x13 ;
//I2C_MEM0.DATA[3] = 0x14 ;
4バイト一気に設定の書き方はどうすればいいんでしょうか? >>512
一気に初期化する必要性がわからんが
糞コード
assert( 4 == sizeof ( unsigned long ) );
*( unsigned long* )I2C_MEM0.DATA = *( unsigned long* )"\x11\x12\x13\x14"; >>512
配列の複数の要素を一気に代入する記述はない
そういう風にひとつひとつ代入するか
memcpy使ったり構造体にして代入したりする ARMだと1バイトづつ初期化した方が小さくなるような気がする 無名配列のリテラルは初期化時には使えるけど代入には使えないってこと? HP-UX、MOTOROLA、AIX、Solaris Apple PowerPC Mac、Sun Blade、SGI O2?? ビッグエンディアンの仮想環境はQEMU以外にないから、エミュレータを作れば有名になれるよ。 >>524
ごめん、PowerPCのエミュレータにPearPCがあった。 SolarisエミュレータにCHARONがある(有料)。ビッグエンディアンの環境はお金がかかるよ。 整数の負の数に1の補数を用いる環境
整数の負の数に絶対値と符号ビットを用いる環境
整数にトラップ表現がある環境
charが8の倍数ビットでない環境
を教えてください ARMは選択出来たっけ?
まあ、みんなリトルで使ってるがな。
地味にMicroBlazeがビッグだな。 MIPSもバイ
ミドルエンディアンの環境を教えて下さい 博物館に所蔵されてるようなコンピュータ調べて何の意味があるんだろう。。。 >>528
絶滅したコンピュータアーキテクチャの話はしたくない。 6502とか、地味に生きてるやん?
あ、あれはエミュレータか。 ほとんどの環境のcharが8ビットなのは、基本ASCIIが7ビットで表現できることと、7ビットより8ビットの方が切りが良くてパリティビットなどに使えて便利だったことによる。 最近C言語ハマってる
言語がシンプルなのと直にコンピュータを操ってる感 charが7ビットだったら、パックトBCDもなかった。 7ビットだったら1バイトの16進表示で1ビット無駄になるところだった。 GCCかLLVMを使えば、適当なアーキテクチャのC言語コンパイラーを自由に作ることができるらしい。 まあ、例えばNintendo SwitchのアーキテクチャをGCCかLLVMで定義すれば、そのアーキテクチャのコンパイラーが作れる訳だ。 そういう用途なら「高位合成」でggrと幸せになれるぞ
LLVMは多分出番なしだ うん、NVIDIA Tegra のカスタムだね。例えが悪かったか。 >>536
charが16bitなら最近使ったけど >>512
strncpy(I2C_MEM0.DATA, "\x11\x12\x13\x14", 4); 実行時間の長い再帰関数(ハノイの塔)を実行しながら過程をglutというOpenGLライブラリで開いたウィンドウに描画させたいのですが方法ありませんか?
ステップ毎に再帰関数を最初から実行するしかないですか? 再帰して、関数を無限に呼ばない。
答えをメモ化しろ
「メモ化」で検索! -1.400000e+01 2.043459e+01 1.738866e-15
-1.398525e+01 2.029842e+01 3.900652e-01
-1.399008e+01 2.029842e+01 -1.300367e-01
3DデータのSTLと言う形式で使われてるこの様な数字の型は
printfで出力する場合どの型フィールドになるのでしょうか
%e %gだけでは何だか違います >>547
ハノイの塔の実行スレッド(A)と描画スレッド(B)を別にする
Bは計算過程を変数Cに書き込む
Aは画面リフレッシュのタイミングでCを描画 逆だw
Aは計算過程を変数Cに逐次書き込む
Bは画面リフレッシュのタイミングでCを描画 >>552
memcpyとか、strcpyとか、strncpyは知っているし、_s付き
なんてのも知っているけど、これは初めてかな スペルミスかと思ったけど合ってるよな
間違い探し難しい
どこが変? 検索でちゃんと 555 と 546 がヒットするし何か見間違えたんだろうか 目を細めて見るとstmcpyに… いや無理があるな 老眼がすすんで字が読めなくなったジジイだろ
>>546が本当にスペルミスだったとしても全然面白くないツッコミだし
老害は早く死ねば良いのに str[n]cpyが最後に0を書く条件は?
memcpyを使わない理由は? strncpyは0で終端される条件が毎回わからなくて敬遠していたんです。
でも、strlcpyを使うようになってから肌年齢が10歳若返りました!
今は毎日がとっても楽しいです。 >>559
おまえさんが言わなくても老いた者は死にゆくように自然はできている
それを妨げるなという主張なら医療業界に言え 何の為にサイズ指定があるか、考えりゃわかるじゃん? >>564
「早く」の意味を調べてからほざきなさい >>566
形容詞には比較をつけろ
一年目でおぼえる初歩だろうがボケ >>567
朝鮮語ではそう言うルールがあるのか?
日本語にはないぞ >>567
>>559のレスの中の「早く」の使い方は自然だと思うが…。
日本語学校の1年目に、どう教わったの? >>569
朝鮮語か日本語かには関係ない
電気屋のルールだ >>555
>>546にはそのstrncpy()が書かれているが? PHPしかできないザコだったけどC言語が楽しい
Cのスタンダードなコーディングスタイルってないですか?
インデントにタブ使ってたりifに{}使ってなかったりするコードをよく見かけますけど >>573
C言語 コーディングスタイル
でググれ
あと結果の報告は要らん
と言うか報告するな
理由は>>574に書いてある >>573
ほんまC言語楽しいよな
俺もC#かWeb系スクリプト言語しか使ったことなかったんだが >>579
いやタブ1つにして表示幅はスペース4つ分だ。 >>576
ああ。もうこのスレはスペース開けるか開けないか改行するかしないか何文字にするか中括弧はどうするか行末にバックスラッシュ入れて次行に書くか書かないかgotoどうするか等の話で延々と10年ぐらい費やされるんだろうな。
もちろんエディタの話に飛び火してviがvimがemacsがとなる。 プログラム終了前にfree()が必要かどうかを忘れちゃいかん。 ちょっと教えてくださいとあるHPから抜粋
意味が分からないので解説お願いします
私が負荷した文は<< >>で囲みます
struct Person {
char name[20];
int sex;
// char sex;
int age;
double height;
double weight;
} person_s; <<←今までの自分の認識:Person構造体のインスタンスperson_sを生成 しかしこの認識は後述@でpがインスタンスであると推定できることから間違っていると推定できる>>
<< person_sは構造体宣言の為の鋳型と推定 しかし様々なプログラムをチェックするとここでインスタンス宣言している例も見受けられる >>
<< 変数が構造体宣言の為の鋳型なのかインスタンスなのかはコンパイラが記述から自動判断???>>
person_s p; << ←pがPerson構造体のインスタンスであることは後述@のメンバ呼び出しで推定できる >>
とかけば、不要な宣言を減らすことができます。
構造体メンバの初期化
各メンバの初期化方法として次のようなものがあります
person_s p = {"Tom", 0, 20, 175.2, 66.5}; <<←構造体宣言鋳型person_sを使用しpをインスタンス宣言??>>
// または
person_s p; << 構造体宣言鋳型person_sを使用しpをインスタンス宣言?? >>
p.name = "Tom"; << この記述でpが構造体Personのインスタンスであると推定できる ・・・@ >>
p.sex = 0;
<< person_sは構造体宣言の鋳型 pはインスタンスであると推定できるが >>
<< 何故ダイレクトにPersonを使ってpを宣言しないのか? >>
<< 何故person_sなどという変数を使って間接的に宣言するのか? >>
<< うんちくきぼんぬ >> struct Person の前に typedef がありそうな雰囲気 C++ならtypedefなくても可
多分.cppでビルド通したんだろうね >>589
後の句 person_s を型名として使ってるんで typedef は必須じゃない?
(strust 省略の Person で宣言してるのとは違う) >>590
C++ではtypedefは不要だよ(別にあっても構わないけど)
structとclassはメンバーのデフォルト設定がpublicかprivateかという違いを除けば構文的には全く同じように使える
structで継承することすら出来る >>592
論点はそこじゃなくて
struct Person { };
Person p;
が C++ では文法として通るのは指摘の通り
質問元の記述では
struct Person { } person_s;
person_s p;
こうなってるから、これじゃ C++ の文法でも通らないでしょうよ ってことで 通るよ
class宣言ではいちいちtypedefなど使わないのと同じように構造体でもtypedefは省略するのが一般的
むしろ先頭の構造体テンプレート名を省略して最後の型名だけ宣言する場合も多い https://ideone.com/e1pLf2
通ったっけ? って確認コード
インスタンスとtypedef の区別つく? structが省略可能になってtypedefしなくなったのを
typedefが省略可能と間違って覚えてるんじゃないだろうか >>594
>>595 を見る限り通らないようだね 型名のエイリアス宣言と その型のインスタンスの生成
typedef を省略した場合には、全く同じ記述になるんだけど
後者のインスタンスの生成で翻訳してるぜ コーディングスタイルってたくさんあるんですね
とりあえず検索したらエリートの人達が使ってそうなものを集めてみました
C Coding Standard - CMU (ECE)
https://users.ece.cmu.edu/~eno/coding/CCodingStandard.html
GNU Coding Standards
https://www.gnu.org/prep/standards/html_node/Writing-C.html
NASA C Style Guide
http://homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
C Coding Style - GNOME Developer Center
https://developer.gnome.org/programming-guidelines/stable/c-coding-style.html.en
CERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
Linux kernel coding style
https://www.kernel.org/doc/html/v4.10/process/coding-style.html
どれも難しそうなのでコーディングスタイル見るのやめようと思います。
githubで適当に見ても全然統一されてないし
とりあえずインデントは空白8個で{}を省略しないルールだけにしたいと思います。 空白8個なのはメモ帳で見た時にこのくらいだから合わせてるだけです 書いてりゃわかると思うけど8は多すぎ
単に昔のシステムがそうだったと言うだけのことだから4とか2でいいと思う ■ このスレッドは過去ログ倉庫に格納されています