C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
ってか二次元配列と二重配列間違ってねーか?
それとfunc呼んでからmemsetしたらfunc呼ぶ意味あるの?
memsetもループさせるんじゃなく一回で全部fillした方がよくない?
とかとか。 >>467
1行目 イミフ
2行目 意味があるから呼んでるんだろ
3行目 明確な利点があるならそれを書け >>468
ポインタの配列と二次元配列を間違ってるのではないかってこと。
書き込んだあと空白で埋めたら意味なくないか?funcが何してるか知らんけど >>469
funcの中身を知らないのに「意味無い」とか「意味あるの?」とかっていう書き込み、意味あるの?
それを聞けば問題の解決になるの?
少なくとも空白を埋めてない部分があるし
問題が発生する範囲で簡略化したのかもしれないし
当然意味があるから呼んでるんだろうと思うのが普通 最近オブジェクト指向が入り口で、C言語がわからんっていう子が多いからなあ 再現する最小限のコードに削ってるうちに問題点を自ら発見して終了 つーかfunc()以外の部分で特に問題が見当たらないならfunc()のせいで確定という単純明快な話
自作コードならfunc()もうpできるっしょ >>470
出されたソースのコメント見ると、配列の考え方が間違ってるように感じるけどね。それを示唆したかっただけだよ。 >>462
ふと疑問に思ったんだが、
>func(charList); // charListに書き込む関数
関数を呼び出す際に、nの値を教えなくて良いのか? >>475
例外とは関係ない
合コンじゃないんだから無駄に話を広げる必要はない
問題の解決が遅くなるだけ あとはfuncの中身を見ないとなんとも
組み込みのショボい環境だとスタックオーバーフローって可能性も無いことは無いが struct I2C_MEM //構造体の型宣言
{
char DEV_ADR ;
char REG_ADR ;
char DATA[0x03] ;
};
struct I2C_MEM I2C_MEM[3] =//構造体の型宣言
{
{ 0x7C , 0x01 , 0x00000000 }
{ 0x7C , 0x01 , 0x00000000 }
{ 0x7C , 0x01 , 0x00000000 }
} ; ↑構造体の初期化で
charを連続4byte設定するときの書き方
0x00000000はたぶん違いますよね?
どう書けば良いんですか?
初心者過ぎてすいません struct I2C_MEM //構造体の型宣言
{
char DEV_ADR ;
char REG_ADR ;
char DATA[0x03] ;
};
struct I2C_MEM I2C_MEM[3] = //構造体の初期化
{
{ 0x7C , 0x01 , 0x00000000 }
{ 0x7C , 0x02 , 0x00000000 }
{ 0x7C , 0x03 , 0x00000000 }
} ; >>479
> struct I2C_MEM
> {
> char DEV_ADR ;
> char REG_ADR ;
> char DATA[0x03] ;
> };
struct I2C_MEM I2C_MEM[3] =
{
{ 0x7C , 0x01 , {0} }
{ 0x7C , 0x01 , {0} }
{ 0x7C , 0x01 , {0} }
} ; >>482
回答ありがとうございます!
ちなみにこれだったらどうかくんでしょうか?
struct I2C_MEM I2C_MEM[3] = //構造体の初期化
{
{ 0x7C , 0x01 , 0x12345678 },
{ 0x7C , 0x02 , 0x12345678 },
{ 0x7C , 0x03 , 0x12345678 },
} ; >>483
struct I2C_MEM I2C_MEM[3] =
{
#ifdef BIG_ENDIAN //ビッグエンディアンの場合
{ 0x7C , 0x01 , {0x12, 0x34, 0x56, 0x78} },
{ 0x7C , 0x02 , {0x12, 0x34, 0x56, 0x78} },
{ 0x7C , 0x03 , {0x12, 0x34, 0x56, 0x78} },
#else // リトルエンディアンの場合
{ 0x7C , 0x01 , {0x78, 0x56, 0x34, 0x12} },
{ 0x7C , 0x02 , {0x78, 0x56, 0x34, 0x12} },
{ 0x7C , 0x03 , {0x78, 0x56, 0x34, 0x12} },
#endif
} ; >>484
> char DATA[0x03] ;
おっと、これじゃあ4バイト入らないぜ。
char DATA[4];
にしないと。 全くどうでもいいことだが最近の若いモンはスマホに合わせて上矢印なのな
一つ勉強になった >>484
#ifdef BIG_ENDIAN
# define ENDIAN_FIX(a,b,c,d) a,b,c,d
#else
# define ENDIAN_FIX(a,b,c,d) d,c,b,a
#endif
struct I2C_MEM I2C_MEM[3] =
{
{ 0x7C , 0x01 , {ENDIAN_FIX(0x12, 0x34, 0x56, 0x78)} },
{ 0x7C , 0x02 , {ENDIAN_FIX(0x12, 0x34, 0x56, 0x78)} },
{ 0x7C , 0x03 , {ENDIAN_FIX(0x12, 0x34, 0x56, 0x78)} },
} ; 構造体の中身から推測すると、
書く順番はエンディアンに依存しないと思う
単純に配列の頭から1バイトずつ送信するだけ
仮にエンディアンで順番が変わるとしても
どうせガッツリ環境依存なコードなんだから
依存しちゃえばいい
環境依存が無いコードを書くつもりなら、
charが1バイトかどうかにも依存しないようにしないとね >>488みたいなマクロは最悪
エンディアンていう言葉を覚えたばっかりの初心者が作る糞コード エンディアンについて解説が必要ですか?
はい/いいえ struct I2C_MEM //構造体の型宣言
struct I2C_MEM I2C_MEM[3] =//構造体の型宣言
この手の文法で自明なことをコメントにする文化はなくならないのかな 俺のコードはその対極
大きな流れしかコメントをかかない I2Cか。データは8ビットで受けて、8ビットシフトしてビットORだな。
data = hi<<16 | mid<<8 | lo >>492
お前の糞マクロ、どの辺が糞か解説が必要? やってみなじゃない。どう動くかじゃなくてどう書くかか。
どうなって欲しいのかが書かれてないから答えられないな。 >>465
全体のコードは自作というか(自社製)ですが、funcは他社のライブラリなんです。
ソースがあればなんとかなったのかもですが・・・。
>>467
実際はfunc呼んだ後にcharListの値を呼んで色々作業しています。
>>469
普通の2次元char配列のつもりです。2次元配列というのはC言語的にはシンタックスシュガーにすぎず、
char a[m][n]もchar a[m*n]も等価なのですよね。なので、先頭ポインタから(m*n-1)個先までの
アドレスの範囲内なら範囲外アクセスエラーは起こり得ないと理解しています。
>>474の結論に至る前に、何かC言語で致命的な勘違いや思い込みをしているのかと
思って質問した次第です。今思うとエスパー回答を強いてしまって大変申し訳ありませんでした。
ひとまずはfuncを一切呼ばない形に直して事なきを得ました。
>>437で言った、「charListをプリントしたりすると何故か問題なく動く」からそれで一時凌ぎする考えも
頭をよぎりましたが、思いとどまりました。
ひとまずこれで終えます。回答くださった方々、本当にありがとうございました。 >>503
×charListの値を呼んで
○charListの内容をstringに変換して(charListは不変) >>503
>char a[m][n]もchar a[m*n]も等価なのですよね
そうだっけ? char[m][n]はchar**、char[m*n]はchar*、データ型は違う 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
「早く」の意味を調べてからほざきなさい ■ このスレッドは過去ログ倉庫に格納されています