X



C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©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
0379デフォルトの名無しさん (ワッチョイ 4f32-Dc1X)
垢版 |
2017/09/24(日) 10:21:22.00ID:jg2xx4vD0
はあ、そうですか
共有リソースの排他アクセスのためのAPIなのに、ロック対象がわからないからロック無視して最適化しますと
それが真実ならWinAPIとVCが腐ってるんじゃないですか
0382デフォルトの名無しさん (ワッチョイ 3b23-Dc1X)
垢版 |
2017/09/24(日) 13:57:54.86ID:c233uqnI0
腐っているのでしょう
0383デフォルトの名無しさん (ワッチョイ 4f32-Dc1X)
垢版 |
2017/09/24(日) 14:40:58.49ID:jg2xx4vD0
メモリバリアを跨いでオブジェクトへのアクセス命令を最適化するとか
そんな頓珍漢なことを言う腐った奴がいるとは思わなかったわ
volatileを何だと思ってんだか
0385デフォルトの名無しさん (ワッチョイ 4f32-Dc1X)
垢版 |
2017/09/24(日) 16:31:41.65ID:jg2xx4vD0
CriticalSectionの話のつもりだったんだけど、CreateSectionに変わったの?
それならごめんだわ、>>378で唐突に出てきて誤字だとばかり
さすがにそんなアホな話題転換があるとは思わなかった
0387デフォルトの名無しさん (ワッチョイ 4f32-Dc1X)
垢版 |
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とかのほうが手軽そうだけどね
0389デフォルトの名無しさん (オッペケ Sra3-Brv+)
垢版 |
2017/09/25(月) 03:09:32.37ID:eX6e3GbIr
Cのコンパイラはクリティカルセクションなんて知らない。単なる構造体かなんかのtypedefとして実直にコンパイルするだけ。
スレッド関連の関数についても単に関数の一種として扱うだけ。

従ってスレッドやクリティカルセクションを扱っているかどうかが最適化の結果に影響することはない。
一方volatile指定はコンパイラが認識するキーワードで最適化に影響する。
0390デフォルトの名無しさん (ワッチョイ 0f23-7Jrl)
垢版 |
2017/09/25(月) 04:54:33.75ID:glvYaQMb0
ということは今回の事例だと排他制御しても不具合は解消できなかったという事かな?
volatile付けて最適化を無効にすることが正しい解決策だったということになる?
0391デフォルトの名無しさん (ドコグロ MMb3-gXon)
垢版 |
2017/09/25(月) 06:45:40.93ID:/OvZrhVRM
>>387
だからそれはメモリーバリアの話で最適化の話とは別だよ
繰り返しになるけど CriticalSection は排他制御するリソースを知ることはできないしコンパイラも CriticalSection のことを知らない
0398デフォルトの名無しさん (オッペケ Sra3-Brv+)
垢版 |
2017/09/25(月) 12:40:04.95ID:uoxmxxDAr
>>394
おおごめん、規格自体には詳しくない

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

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

やってみればわかるけど、CriticalSecltionの有無でアセンブル結果が違う
0403デフォルトの名無しさん (ワッチョイ 4f32-Dc1X)
垢版 |
2017/09/25(月) 23:03:28.51ID:LPAVGpvK0
CriticalSectionに限らず未知の関数が呼ばれたのであれば、その中でグローバル変数やらが変更される可能性を考慮しなければならない
他にも、ある関数の引数にローカル変数のアドレスを渡すと、以降の別関数内でそのアドレス経由でローカル変数を変更される可能性がある
よって、場合によってはローカル変数であっても関数呼び出しを跨いで最適化できなくなることがある

わからないからこそ、最適化してはならないんだよ
0404デフォルトの名無しさん (ワッチョイ 2b23-PvnN)
垢版 |
2017/09/25(月) 23:26:04.50ID:3XblncDf0
>>390
ならない。君のソースコードだけの問題だ。同期機構の使い方が悪いだけ。

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

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

サーバ用とかでソフトが長期間使われる場合は要注意だ。
0407デフォルトの名無しさん (ワッチョイ 1eaa-ZPBl)
垢版 |
2017/09/26(火) 01:21:21.88ID:mvSUAuA/0
マルチスレッドは、たまたま動いているだけで、
ちょっとしたタイミングで、バグる

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

プロは、Elixir などの関数型を使う
0408デフォルトの名無しさん (ワッチョイ 3b23-Iax1)
垢版 |
2017/09/26(火) 02:12:13.37ID:8E9hjYW60
いや、ちゃんとロックすりゃなんとかなるってw
もちろん最初から考慮されてる言語は何も考える必要ないからうまく行って当然。
0412デフォルトの名無しさん (ワッチョイ 1396-Otw/)
垢版 |
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;
}

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

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

目的達成するためにどこが悪いのか教えてくださいよ
0420デフォルトの名無しさん (ワッチョイ e523-d/1N)
垢版 |
2017/09/28(木) 00:13:55.27ID:LEgoP/Tm0
>>412
本当にそれがソースの全てか?
0422デフォルトの名無しさん (ワッチョイ 23f0-IQJU)
垢版 |
2017/09/28(木) 08:22:53.76ID:veeq8lRB0
>>415
windowsプログラムでFuckファックは初心者がやるものではない
何故かと言うとFuckファックは非常に拙いからで、これはご存じの通りにFuckファックつまりはセクロスとかセックスを意味する
FuckRawInputなどと書かれると非常に面食らうので、動作には全く関係ないがFuckファックの箇所をHookフックとする
Fookという間違いならまだしもFuckが出てくるのは途轍もなく拙い

windowsプログラムは入門書を一通り終えた後にようやく手を出せる程度に面倒くさい
0426412 (ワッチョイ 9596-5hSF)
垢版 |
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);
0433デフォルトの名無しさん (ワッチョイ e523-d/1N)
垢版 |
2017/09/29(金) 01:17:32.92ID:EHQhOpQV0
>>426
本当にそれがソースの全てなのか?
0434デフォルトの名無しさん (ワッチョイ 9baa-iHa+)
垢版 |
2017/09/30(土) 05:35:50.31ID:/O3sxKWS0
これ無理だろうWindowsプログラムの言語を理解してないと直せないっしょ
0436デフォルトの名無しさん (ワッチョイ 2312-IQJU)
垢版 |
2017/10/02(月) 13:06:27.14ID:6IbuGwAs0
>16 :デフォルトの名無しさん:2006/03/10(金) 22:15:19
>>>10
>> こんな変数名があちこちに散らばっているのがPerl
>
>大学の研究室のボスは、特殊変数の表をふ〜んと2分ほど眺めて完全に暗記した。
>
>そういうレベルの人たちのための言語なんだなと思って、トイレで血の涙を流した。
0437デフォルトの名無しさん (ワッチョイ 2345-U38j)
垢版 |
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をプリントしたりすると何故か問題なく動きます。
この部分だけ切り出したテストコードでは全く再現しませんでした。
この手のエラーでよくあるのは未初期化領域へのアクセスだと思いますが、
@で領域の確保はできているからこれは原因ではないですよね?
どこがエラーの原因でしょうか・・・?
0439デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 06:57:44.74ID:ZkSEHHAS0
うん、funcが怪しい
0440デフォルトの名無しさん (ワッチョイ e59f-Txnz)
垢版 |
2017/10/03(火) 08:24:29.85ID:759fwjeu0
うん
0441デフォルトの名無しさん (ワッチョイ b5ea-asy+)
垢版 |
2017/10/03(火) 11:40:15.04ID:QFI8P6tG0
配列サイズ 32要素で 32個 空白で生めてるが
文字列 という用語を使ってるあたり func は一般の文字列操作してそうだけど
終端記号 '\0' の分の考慮が落ちてるんでないの?
0447デフォルトの名無しさん (ガックシ 06cb-huvM)
垢版 |
2017/10/03(火) 15:39:40.20ID:2Eoq+Ro56
>>446
だめ
0448デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 16:18:15.22ID:9r7sfmBO0
char charList[n+1,32]こうしないとダメだよね?なにかっこ二つ使ってんだよ読み込めねえよって昔2次元配列で怒られたな
0450デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/03(火) 16:45:08.36ID:ZkSEHHAS0
うん、今の1回生が生まれた頃から
0451デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 18:25:07.16ID:9r7sfmBO0
>>449
なったのか少しは便利になったのか
0455デフォルトの名無しさん (ワッチョイ 9be7-a1BF)
垢版 |
2017/10/03(火) 18:53:27.85ID:9r7sfmBO0
>>448
これダメだC#だった、エラーになるわ
0457デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:39:06.25ID:djTGgeKPp
iOS11にしたらまともに入力できない

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

このクソOS
0459デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:46:23.61ID:djTGgeKPp
このクソOS死ね
0460デフォルトの名無しさん (ササクッテロリ Spe1-3BEe)
垢版 |
2017/10/03(火) 22:46:56.99ID:djTGgeKPp
まともに入力できないって
0462437 (ワッチョイ 2345-IQJU)
垢版 |
2017/10/04(水) 01:30:41.39ID:+TP/cS/R0
返事が遅れてすみません。レスありがとうございます。
再現性の乏しい質問で申し訳ないです。

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

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

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

さっぱり原因が想像できないのですが、考えられる可能性としては、funcの中でメモリがずたずたに壊れたものの
偶然エラーにならずに戻ってきてmemsetでやっと死んだ、というパターンでしょうか?
0463デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/04(水) 06:19:36.24ID:Sd/env2d0
>>452
存在するだろ
char charList[32]と等価になるぞ
0467デフォルトの名無しさん (アウアウカー Sad1-pOaJ)
垢版 |
2017/10/04(水) 08:22:11.58ID:F93q6j3ba
ってか二次元配列と二重配列間違ってねーか?
それとfunc呼んでからmemsetしたらfunc呼ぶ意味あるの?
memsetもループさせるんじゃなく一回で全部fillした方がよくない?
とかとか。
0470デフォルトの名無しさん (スップ Sd03-vp8x)
垢版 |
2017/10/04(水) 13:49:31.85ID:hBVSLcAId
>>469
funcの中身を知らないのに「意味無い」とか「意味あるの?」とかっていう書き込み、意味あるの?
それを聞けば問題の解決になるの?

少なくとも空白を埋めてない部分があるし
問題が発生する範囲で簡略化したのかもしれないし
当然意味があるから呼んでるんだろうと思うのが普通
■ このスレッドは過去ログ倉庫に格納されています

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