X

C言語なら俺に聞け 142 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 8a6f-bDrV)
垢版 |
2017/08/10(木) 20:21:23.44ID:hEocmkh50
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


http://mevius.2ch.net/test/read.cgi/tech/1500293207/
http://www.geocities.jp/c_cpp_cs/about_c/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2017/09/24(日) 16:59:33.91ID:gFeQddMX0
>>385
ああすまん、予測変換で間違えてたわ
で、CriticalSection について調べたのかな?
2017/09/24(日) 17:30:54.77ID:jg2xx4vD0
>The following synchronization functions use the appropriate barriers to ensure memory ordering:
>Functions that enter or leave critical sections
>Functions that signal synchronization objects
>Wait functions
>Interlocked functions
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686355(v=vs.85).aspx
調べたけどCriticalSectionだけで十分そうだよ
Internallockedとかのほうが手軽そうだけどね
2017/09/25(月) 02:44:46.68ID:glvYaQMb0
https://teratail.com/questions/39986
これの投稿 2016/07/04 10:48の例にあるように
最適化で変数の効果が消えてしまう場合でも
volatileじゃなく変数書き込みや参照の部分に
CriticalSectionでロックしておけば最適化で消える事はないということ?
2017/09/25(月) 03:09:32.37ID:eX6e3GbIr
Cのコンパイラはクリティカルセクションなんて知らない。単なる構造体かなんかのtypedefとして実直にコンパイルするだけ。
スレッド関連の関数についても単に関数の一種として扱うだけ。

従ってスレッドやクリティカルセクションを扱っているかどうかが最適化の結果に影響することはない。
一方volatile指定はコンパイラが認識するキーワードで最適化に影響する。
2017/09/25(月) 04:54:33.75ID:glvYaQMb0
ということは今回の事例だと排他制御しても不具合は解消できなかったという事かな?
volatile付けて最適化を無効にすることが正しい解決策だったということになる?
2017/09/25(月) 06:45:40.93ID:/OvZrhVRM
>>387
だからそれはメモリーバリアの話で最適化の話とは別だよ
繰り返しになるけど CriticalSection は排他制御するリソースを知ることはできないしコンパイラも CriticalSection のことを知らない
2017/09/25(月) 06:49:50.09ID:/OvZrhVRM
>>390
どう言うことをやりたいのかよく見てないけど排他制御と最適化の話は別だから必要なら両方やらないとダメ
2017/09/25(月) 08:38:06.32ID:5M6SeBxY0
eieio()
2017/09/25(月) 09:41:28.46ID:Eov43usf0
>>389
それ、スレッドまわりが規格化されてなかった C99 までの話だよね?
2017/09/25(月) 09:53:00.17ID:eS71dZMPM
最近のは規格化されてんの?
2017/09/25(月) 09:58:09.00ID:Tp6H3jwU0
規格化されてるのはPOSIXでじゃね?
2017/09/25(月) 09:59:34.82ID:Eov43usf0
こんな感じ。

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
5.1.2.4/5
"The library defines a number of atomic operations (7.17) and operations on
mutexes (7.26.4) that are specially identified as synchronization operations.
These operations play a special role in making assignments in one thread visible
to another. ..."
2017/09/25(月) 12:40:04.95ID:uoxmxxDAr
>>394
おおごめん、規格自体には詳しくない

しかし…
pthread関連の標準関数や定義を仮にコンパイラが特別扱いしたとすると、標準関数をラップしたり自作ライブラリで代替した場合に最適化の結果が変わるのかな?
そんな風にコンパイラ作るものなんだろうか。
2017/09/25(月) 20:34:55.44ID:6/+o0Gkh0
posix-thread 関係については C++11 で追加されたが,
あくまでも言語処理系の中で定義された識別子(関数とかクラスとか)を使わないと,コンパイラには分かりえないよ.
CreateThread() とか CriticalSection とかの W32API の用語を,無指定でコンパイラが理解できるわけがない.
2017/09/25(月) 20:47:31.93ID:LPAVGpvK0
>>390
コンパイラは基本的に問答無用で最適化するけど、それだとマルチスレッドではプログラマの意図しない最適化が起こってしまう
だから、メモリバリアを挟んだアクセス命令を入れ替えないことにしている
言い換えると、メモリバリア前に読み込んだ値をメモリバリア後も使うような最適化はしない
よって、バリア+ロックで十分

共有リソースは全部volatile付けるなんてしてたら、kernelのソースとかvolatileまみれになるでしょ
2017/09/25(月) 21:45:53.20ID:LPAVGpvK0
当然、ローカル変数とか他から変更されないことが明らかなオブジェクトであれば最適化が起こる可能性は否定しない
グローバル変数の場合は、最適化されない

やってみればわかるけど、CriticalSecltionの有無でアセンブル結果が違う
2017/09/25(月) 21:46:58.74ID:LPAVGpvK0
アホなこと書いた、コンパイル結果だな。。。
2017/09/25(月) 23:03:28.51ID:LPAVGpvK0
CriticalSectionに限らず未知の関数が呼ばれたのであれば、その中でグローバル変数やらが変更される可能性を考慮しなければならない
他にも、ある関数の引数にローカル変数のアドレスを渡すと、以降の別関数内でそのアドレス経由でローカル変数を変更される可能性がある
よって、場合によってはローカル変数であっても関数呼び出しを跨いで最適化できなくなることがある

わからないからこそ、最適化してはならないんだよ
2017/09/25(月) 23:26:04.50ID:3XblncDf0
>>390
ならない。君のソースコードだけの問題だ。同期機構の使い方が悪いだけ。

スレッドなんてここ20年間バリバリに使われてる。
VC等の小慣れているコンパイラなら、最適化ありで全く問題なく動く。
(マルチスレッド向けのデバッグは完了している)
Debugでは動くがReleaseでは動かないケースに遭遇した初心者は、君のように
「最適化の問題であり今回はDebugを使うこと」を正当化したがるが、これは間違いだ。
ただしDebugビルドでもバイナリは出来るから、問題ないのならそれを使う手もある。
405デフォルトの名無しさん (ワッチョイ 3b23-Dc1X)
垢版 |
2017/09/26(火) 00:33:15.50ID:8E9hjYW60
ちゃんと排他処理が出来ていないことに気付かず、デバッグオプション付きとか
遅いマシンとかで正常動作してしまい、何年後かに速いマシンにリプレイスしたら
丁度良くバグが顕在化するようなタイミングになってしまった、

なんてことが以前本当に起きた。

サーバ用とかでソフトが長期間使われる場合は要注意だ。
2017/09/26(火) 00:35:55.65ID:piJXswiP0
歯痛制御のバグ
珍しくない

発見しづらく、再現性も乏しく、解析に手間がかかりがち

レベルの低い開発者が混ざると大変
2017/09/26(火) 01:21:21.88ID:mvSUAuA/0
マルチスレッドは、たまたま動いているだけで、
ちょっとしたタイミングで、バグる

初心者は、たいてい、コンパイラのバグのせいにする。
それか、リリースビルドの最適化がおかしいと言う

プロは、Elixir などの関数型を使う
408デフォルトの名無しさん (ワッチョイ 3b23-Iax1)
垢版 |
2017/09/26(火) 02:12:13.37ID:8E9hjYW60
いや、ちゃんとロックすりゃなんとかなるってw
もちろん最初から考慮されてる言語は何も考える必要ないからうまく行って当然。
2017/09/26(火) 07:38:51.81ID:hxYjIs4i0
>>406
痛そうだな。
2017/09/26(火) 10:15:02.85ID:IHENDkWx0
>>406
つらそうなバグだ
2017/09/26(火) 12:32:55.96ID:Ue/ou9XsK
>>406
ウンコだなw
2017/09/27(水) 16:40:21.40ID:zCHNwx740
初心者です。エラーでまくりでコンパイルすら出来ません。アドバイスお願いします。

■やりたいこと。
マウス入力にrawinputを用いるアプリのWndProcをフックし、rawinput(WM_INPUT)を強制オフにし、DirectInputを使用するように指定。

↓ソース


// FuckRawInput.c

#include <windows.h>

LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg)
{
case WM_CREATE:
{
RAWINPUTDEVICE Rid[1];
Rid[0].usUsagePage = 0x01;
Rid[0].usUsage = 0x02;
Rid[0].dwFlags = RIDEV_NOLEGACY;
Rid[0].hwndTarget = hWnd;
RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])) == FALSE) ;
break;
}

-----
また、この方法が最適なのかも不明です。ほかの方法等もあったら教えてください
2017/09/27(水) 18:30:09.48ID:Ep3hxvTm0
C言語の問題?
2017/09/27(水) 21:09:13.07ID:kxaL/Pai0
初心者とは
2017/09/27(水) 21:51:08.08ID:zCHNwx740
>>414
そのままの意味でC言語初心者ですけど?
rawinputを消し去りたいがためにプログラム未経験ながらC言語入門書を読み、
Visual studio2013でハローワールドのコンパイルに成功した所です。

他スレで聞いたら、
DLLインジェクションでAPI関数を置き換えといわれたんですが、
まぁ、それと同じような事をしようとして書いたソースが>>412

目的達成するためにどこが悪いのか教えてくださいよ
2017/09/27(水) 22:01:39.03ID:htvdQyi40
日頃の行い
2017/09/27(水) 22:08:30.48ID:6Zcxzpoi0
エラーのせろハゲ!
2017/09/27(水) 22:35:55.70ID:MZoqRzWL0
どうやってWndProcをフックするつもりなのか知らんが、初心者のやることじゃない
2017/09/27(水) 22:46:41.34ID:Ep3hxvTm0
スレチ
420デフォルトの名無しさん (ワッチョイ e523-d/1N)
垢版 |
2017/09/28(木) 00:13:55.27ID:LEgoP/Tm0
>>412
本当にそれがソースの全てか?
2017/09/28(木) 06:54:14.40ID:0QfR7+YkM
>>412
とりあえず文法エラーのないソースを出せよ
2017/09/28(木) 08:22:53.76ID:veeq8lRB0
>>415
windowsプログラムでFuckファックは初心者がやるものではない
何故かと言うとFuckファックは非常に拙いからで、これはご存じの通りにFuckファックつまりはセクロスとかセックスを意味する
FuckRawInputなどと書かれると非常に面食らうので、動作には全く関係ないがFuckファックの箇所をHookフックとする
Fookという間違いならまだしもFuckが出てくるのは途轍もなく拙い

windowsプログラムは入門書を一通り終えた後にようやく手を出せる程度に面倒くさい
2017/09/28(木) 12:17:20.62ID:wLxR5weia
最近勉強始めたんだがループ動作めんどくさ
2017/09/28(木) 16:28:25.85ID:p7vLxmpX0
C++の標準でWindowsのCOMみたいなのはできるの?
モジュールがあれば動的リンクできて、向こう側の関数の形式とエントリポイントがわかるような。
2017/09/28(木) 18:20:04.96ID:klqlvKrNM
>>424
IUnknown::QueryInterfaceを実装するとかの話?
https://msdn.microsoft.com/ja-jp/library/cc351695.aspx
2017/09/28(木) 19:27:04.11ID:te0QQW2V0
>>418-422

WndProcフックでは目的の動作できなくて、APIフックしか手がないと分かりましたので、
MSのdetourとかいうの使ったAPIフックに変更されました。改めて、見てください。
@やりたいこと
Rawinputマウス関数が呼び出させられる代わりDirectInputマウス関数を呼び出し、強制的にマウス操作をDirectInputにする
ソース↓
// APIhook_RawInput.c
#include <windows.h>
#include "detours.h"
hoge target = NULL;  // ターゲットポインタ
hoge tp = NULL; //トランポリンポインタ

// 関数生成
BOOL WINAPI Direct_Input(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
return tp(hWnd, Msg, wParam, lParam);
}
// user32インスタンス
HINSTANCE xxxxx;
case WM_CREATE:
//user32.DLLをロード
xxxxx = LoadLibrary("user32.dll");
//Raw Inputポインタ取得
target = (hoge) GetProcAddress(xxxxx, "WM_INPUT");
// WM_INPUTフック、"WM_INPUT"→"Direct_Input"置き換え
tp = (hoge) DetourFunction((PBYTE) target, (PBYTE) Direct_Input);
break;
// 終了時の処理
case WM_DESTROY:
// フック削除
DetourRemove((PBYTE) tp, (PBYTE) Direct_Input);
2017/09/28(木) 21:05:11.91ID:9JTfqDLya
>>426
で、お前が聞きたいのは「C言語」に関するどんな質問なんだ?
2017/09/28(木) 22:00:23.65ID:kmv+HSxh0
>>421が悪い
責任もって相手しろ
2017/09/28(木) 22:01:12.32ID:kmv+HSxh0
>>419が正しい対応
2017/09/28(木) 23:13:22.30ID:hENZyM/7a
会話にすらなってないな。
こういうのホントにいるんだよなあ。、。
2017/09/28(木) 23:59:03.21ID:mJZoGNOM0
http://mevius.2ch.net/test/read.cgi/tech/1475897582/925
2017/09/29(金) 01:12:28.71ID:tjqo0EG60
>>415
> どこが悪いのか教えてくださいよ
頭と態度。
APIスレも見たけど、君には無理。
433デフォルトの名無しさん (ワッチョイ e523-d/1N)
垢版 |
2017/09/29(金) 01:17:32.92ID:EHQhOpQV0
>>426
本当にそれがソースの全てなのか?
434デフォルトの名無しさん (ワッチョイ 9baa-iHa+)
垢版 |
2017/09/30(土) 05:35:50.31ID:/O3sxKWS0
これ無理だろうWindowsプログラムの言語を理解してないと直せないっしょ
2017/10/02(月) 09:21:38.64ID:SGi8KvwU0
勘所がすぐつかめる人ならそうでもない
知らんOS知らん言語知らん環境でもデバッグできちゃうんだぜ
あいつら宇宙人だろ
2017/10/02(月) 13:06:27.14ID:6IbuGwAs0
>16 :デフォルトの名無しさん:2006/03/10(金) 22:15:19
>>>10
>> こんな変数名があちこちに散らばっているのがPerl
>
>大学の研究室のボスは、特殊変数の表をふ〜んと2分ほど眺めて完全に暗記した。
>
>そういうレベルの人たちのための言語なんだなと思って、トイレで血の涙を流した。
2017/10/03(火) 03:00:19.61ID:TSZxzm0B0
お助けください。
自作コードにおいて、以下の部分でmemsetの際にsegmentation faultになってしまいます。

int n = 2;
char charList[n+1][32]; // 32文字の文字列をn+1確保・・・@
func(charList); // charListに書き込む関数
for (int i = 0; i < n; ++i) memset(charList[i], ' ', 32); // 空白で埋めたい

funcを省いたりmemsetの前に適当にcharListをプリントしたりすると何故か問題なく動きます。
この部分だけ切り出したテストコードでは全く再現しませんでした。
この手のエラーでよくあるのは未初期化領域へのアクセスだと思いますが、
@で領域の確保はできているからこれは原因ではないですよね?
どこがエラーの原因でしょうか・・・?
2017/10/03(火) 06:29:26.41ID:TvjHrbVD0
funcがnを壊してる
とか
439デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 06:57:44.74ID:ZkSEHHAS0
うん、funcが怪しい
440デフォルトの名無しさん (ワッチョイ e59f-Txnz)
垢版 |
2017/10/03(火) 08:24:29.85ID:759fwjeu0
うん
2017/10/03(火) 11:40:15.04ID:QFI8P6tG0
配列サイズ 32要素で 32個 空白で生めてるが
文字列 という用語を使ってるあたり func は一般の文字列操作してそうだけど
終端記号 '\0' の分の考慮が落ちてるんでないの?
2017/10/03(火) 11:59:57.12ID:QFI8P6tG0
「文字列」で32文字を取り扱いたいのなら 33要素の器が必要ってことで
文字の配列なら問題ないけどねー
2017/10/03(火) 12:44:46.02ID:mP+8qDfMd
そもそも再現しないコードを提示されてもなあ
2017/10/03(火) 14:52:11.00ID:YUFfLdQY0
>>437
処理系は何じゃらほい
2017/10/03(火) 15:25:21.73ID:rugh+s9w0
>>437
>char charList[10000][10000]; // 32文字の文字列をn+1確保・・・@
くらい確保して実行すれば動くだろ
2017/10/03(火) 15:27:20.07ID:xmgx6pPY0
int n = 2;
char charList[n+1][32];

C言語的に、これってOKだっけ?
447デフォルトの名無しさん (ガックシ 06cb-huvM)
垢版 |
2017/10/03(火) 15:39:40.20ID:2Eoq+Ro56
>>446
だめ
448デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 16:18:15.22ID:9r7sfmBO0
char charList[n+1,32]こうしないとダメだよね?なにかっこ二つ使ってんだよ読み込めねえよって昔2次元配列で怒られたな
2017/10/03(火) 16:39:41.13ID:uTLw0mNj0
>>446
最近は大丈夫になった
450デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 16:45:08.36ID:ZkSEHHAS0
うん、今の1回生が生まれた頃から
451デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 18:25:07.16ID:9r7sfmBO0
>>449
なったのか少しは便利になったのか
2017/10/03(火) 18:27:21.85ID:eHwxQvGT0
最近どころか、20年近く前からだし
>>448みたいな文法は存在しないんだけど、どこの世界のC言語なんだろ
2017/10/03(火) 18:32:06.89ID:HgW0fxVo6
>>448みたいな文法欲しかった
2017/10/03(火) 18:48:25.91ID:9KgPFlPY0
>>449
最近、ダメかもしれなくなったんだが
455デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 18:53:27.85ID:9r7sfmBO0
>>448
これダメだC#だった、エラーになるわ
2017/10/03(火) 19:11:20.28ID:XytTuyvU0
LLVMの作者に物凄い勢いで嫌われたから…
457デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:39:06.25ID:djTGgeKPp
iOS11にしたらまともに入力できない

このクソOS
458デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:39:07.29ID:djTGgeKPp
iOS11にしたらまともに入力できない

このクソOS
459デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:46:23.61ID:djTGgeKPp
このクソOS死ね
460デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:46:56.99ID:djTGgeKPp
まともに入力できないって
461デフォルトの名無しさん (ワッチョイ e59f-d/1N)
垢版 |
2017/10/04(水) 00:38:32.06ID:JPTWWYYO0
>>446
http://www.buildinsider.net/language/clang/01
2017/10/04(水) 01:30:41.39ID:+TP/cS/R0
返事が遅れてすみません。レスありがとうございます。
再現性の乏しい質問で申し訳ないです。

>>438
nは変わらないです。

>>441
文字列操作ではあるんですが終端記号は書き込みません(全部文字だけ)

>>444
OSはCentOS 6.9、言語はc++、コンパイラはgcc7.1.0です。

さっぱり原因が想像できないのですが、考えられる可能性としては、funcの中でメモリがずたずたに壊れたものの
偶然エラーにならずに戻ってきてmemsetでやっと死んだ、というパターンでしょうか?
463デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/04(水) 06:19:36.24ID:Sd/env2d0
>>452
存在するだろ
char charList[32]と等価になるぞ
2017/10/04(水) 06:24:24.64ID:dCjKMF950
二次元配列の宣言についての話で合って
コンパイルが通るかどうかだけの話なんてしてねーぞ
2017/10/04(水) 07:22:39.57ID:zhlDARQmM
>>462
func何やってんの?
2017/10/04(水) 08:10:59.64ID:F93q6j3ba
*charList=0とかやってんじゃない?
2017/10/04(水) 08:22:11.58ID:F93q6j3ba
ってか二次元配列と二重配列間違ってねーか?
それとfunc呼んでからmemsetしたらfunc呼ぶ意味あるの?
memsetもループさせるんじゃなく一回で全部fillした方がよくない?
とかとか。
2017/10/04(水) 11:24:36.83ID:hBVSLcAId
>>467
1行目 イミフ
2行目 意味があるから呼んでるんだろ
3行目 明確な利点があるならそれを書け
2017/10/04(水) 13:29:31.00ID:ugGBRoRga
>>468
ポインタの配列と二次元配列を間違ってるのではないかってこと。
書き込んだあと空白で埋めたら意味なくないか?funcが何してるか知らんけど
2017/10/04(水) 13:49:31.85ID:hBVSLcAId
>>469
funcの中身を知らないのに「意味無い」とか「意味あるの?」とかっていう書き込み、意味あるの?
それを聞けば問題の解決になるの?

少なくとも空白を埋めてない部分があるし
問題が発生する範囲で簡略化したのかもしれないし
当然意味があるから呼んでるんだろうと思うのが普通
2017/10/04(水) 14:20:16.63ID:Ot6iICCz0
C言語は俺に訊くなスレになってるな
2017/10/04(水) 14:30:40.85ID:eeE5kOTG0
最近オブジェクト指向が入り口で、C言語がわからんっていう子が多いからなあ
2017/10/04(水) 14:50:53.16ID:38WTG0/g0
再現する最小限のコードに削ってるうちに問題点を自ら発見して終了
2017/10/04(水) 14:54:54.68ID:PNa+p1hk0
つーかfunc()以外の部分で特に問題が見当たらないならfunc()のせいで確定という単純明快な話
自作コードならfunc()もうpできるっしょ
2017/10/04(水) 14:56:07.21ID:6Zs0a9ZSa
>>470
出されたソースのコメント見ると、配列の考え方が間違ってるように感じるけどね。それを示唆したかっただけだよ。
2017/10/04(水) 15:12:09.84ID:f7rOF4qk0
>>462
ふと疑問に思ったんだが、

>func(charList); // charListに書き込む関数

関数を呼び出す際に、nの値を教えなくて良いのか?
2017/10/04(水) 16:34:23.23ID:hBVSLcAId
>>475
例外とは関係ない
合コンじゃないんだから無駄に話を広げる必要はない
問題の解決が遅くなるだけ
2017/10/04(水) 16:35:46.39ID:hBVSLcAId
あとはfuncの中身を見ないとなんとも

組み込みのショボい環境だとスタックオーバーフローって可能性も無いことは無いが
479デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 16:51:26.35ID:+admsRHQ0
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 }
} ;
480デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 16:56:16.34ID:+admsRHQ0
↑構造体の初期化で
charを連続4byte設定するときの書き方
0x00000000はたぶん違いますよね?
どう書けば良いんですか?

初心者過ぎてすいません
481デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 16:59:03.20ID:+admsRHQ0
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 }
} ;
2017/10/04(水) 17:01:20.64ID:HMkkIXOid
>>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} }
} ;
483デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 17:04:07.51ID:+admsRHQ0
>>482

回答ありがとうございます!
ちなみにこれだったらどうかくんでしょうか?



struct I2C_MEM I2C_MEM[3] =     //構造体の初期化
{
{ 0x7C , 0x01 , 0x12345678 },
{ 0x7C , 0x02 , 0x12345678 },
{ 0x7C , 0x03 , 0x12345678 },
} ;
2017/10/04(水) 17:19:18.44ID:HMkkIXOid
>>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
} ;
2017/10/04(水) 17:21:40.35ID:HMkkIXOid
>>484
> char DATA[0x03] ;
おっと、これじゃあ4バイト入らないぜ。
char DATA[4];
にしないと。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況