【初心者歓迎】C/C++室 Ver.102【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2017/11/04(土) 16:33:35.07ID:NYxCuvMY
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
http://codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/
2017/12/16(土) 16:18:44.15ID:2NfYNG63
#include <pshpack1.h>
...
#include <poppack.h>
2017/12/17(日) 02:47:22.67ID:T7tjmkgj
C/C++は言語自体は好きなんですが、GUIとかがプラットフォームに依存するみたいですが、そういった場合黙ってqt使うのが最善ですか?
167デフォルトの名無しさん
垢版 |
2017/12/18(月) 01:24:26.49ID:vrG0ZJDQ
>>164
そのような構造体で直接読み書きしないのがベスト
168デフォルトの名無しさん
垢版 |
2017/12/21(木) 16:50:57.91ID:FN6C0PcS
ここが適切かわかりませんが、

make の Makefile を Visual Studio や NetBeans 等の IDE の
プロジェクトファイルに変換するツールはありませんか。
2017/12/21(木) 16:54:33.43ID:fHSTQ7CK
makeにはないが、似たようなものにCMakeというものがあって、CMakeならプロジェクトファイルを生成できる。
170168
垢版 |
2017/12/21(木) 17:10:02.95ID:FN6C0PcS
>>169 そこまでは分ったのですが、
Makefile を CMakeLists.txt に変換するのはありますか?

見つけられたのは、nmake.exe 用の Makefile.mak を *.vsproj に変換する、
Python のスクリプトだけでした。。
2017/12/21(木) 17:15:07.21ID:fHSTQ7CK
>>170
ない。
172168
垢版 |
2017/12/21(木) 17:25:55.41ID:FN6C0PcS
>>171 ありがとうございました。
CMake 勉強します。
2018/01/09(火) 19:29:59.07ID:cBwAL66C
ライブラリ作成の指南書みたいな本ってありますか。
2018/01/09(火) 22:23:30.03ID:9ubHCBZ8
環境によるんじゃ?
175デフォルトの名無しさん
垢版 |
2018/01/10(水) 01:19:44.15ID:CtX3Z92R
とりあえず
c++のためのapiデザイン
でも読んでみるといいと思う
2018/01/10(水) 02:59:55.08ID:QjjLPcN0
読んでみるわ
2018/01/13(土) 06:17:45.46ID:hj3TLdcf
定数以外の名前に「 _ 」を使うのって良くないって聞いたけどどうなの?
2018/01/13(土) 09:08:14.97ID:P3TI7O0+
趣味とか宗教とかの話であって、別に使って問題ない
ただ名前の先頭だったり、2回連続で使ったりすると
予約語に引っかかることがあるので注意(定数の場合も)
2018/01/13(土) 09:13:05.82ID:M+vRxjCB
その辺有名ライブラリのルール付けとか調べてみるのもいいかもね
2018/01/13(土) 09:23:55.53ID:M+vRxjCB
GoogleがC++のスタイルガイド公開してる
これも参考になりそう
2018/01/16(火) 10:54:12.13
C++で何つくんの?
GUIプログラムならC#のほうが圧倒的に簡単だし
2018/01/16(火) 11:06:50.90ID:E1MTmeKy
CAD
2018/01/16(火) 11:07:58.52
そんな上級者にしか用途がない言語か
2018/01/16(火) 11:24:35.41ID:/aUGqjlJ
個人的にC/C++は高級なアセンブラだと思っている
C#とは存在するレイヤが違うから、比較条件として用途を挙げるのはちょっと違うかなって
2018/01/16(火) 11:25:50.16
で、何つくんの?
高級アセンブリの用途は?
2018/01/16(火) 12:09:46.86ID:J2S5K16W
画像処理
大規模ゲーム開発
2018/01/16(火) 12:32:40.41ID:6i0TmEx8
GoogleChrome
2018/01/16(火) 13:22:26.10ID:6uwiuQcq
ゲームとか速度が必要な場面でまだまだ使われてるでしょ
2018/01/16(火) 15:46:42.36ID:e8xaSAkW
CPUパワーを必要とするようなまとまった処理は
C/C++のような低級な高級言語が適している
組み込み用の小規模マイコンもCがほとんど
2018/01/16(火) 19:09:30.75ID:Vb1E5r0O
Pythonのライブラリも結局はCで作ってたりするしな。
2018/01/17(水) 00:06:48.74ID:kWLOq5lU
GUIはC#でWPFだけど、そこから使用するdllとか連携するサービスとかはc++。OSのAPIをいろいろ使う場合はC#だと面倒くさいからc++を選ぶ。
2018/01/17(水) 01:07:00.24ID:X2mlxDcY
OpenGLもC#か大変そうだな
193愛知人
垢版 |
2018/01/17(水) 09:14:59.53
Unityでいいよね
2018/01/17(水) 11:15:20.21ID:X2mlxDcY
ライセンス料が只ならいいよ
2018/01/17(水) 11:23:31.36ID:4ILD3/U5
Unityでも速度が必要な場所はC++で書いて呼び出し
196愛知人
垢版 |
2018/01/17(水) 11:48:22.30
なんでC++ってendlいるの?
2018/01/17(水) 12:24:58.46ID:/z6RTYd5
ちょっと何言ってるかわかんないです
198愛知人
垢版 |
2018/01/17(水) 13:34:56.30
なんでprintf使わないの?
2018/01/17(水) 13:41:03.90ID:lhJfQamL
浪人と引き換えに無知を手に入れた男
200愛知人
垢版 |
2018/01/17(水) 13:43:22.44
で、返答は?
2018/01/17(水) 14:07:42.46ID:l2H41H1D
>>198
<cstdio>は正しくC++だからprintf使っても構わん 味噌 よ
後々になって「iostreamはでかいし あんまりうみゃくいかないエビフリャー」いうことになった きしめん だしね
endlは、改行の無い出力と在る出力を統一的に(フォーマット使わずストリームで)扱うには必要でしょ ひつまぶし?

愛知語は詳しくないけど察し手羽先
202愛知人
垢版 |
2018/01/17(水) 14:16:18.48
どうやったらこんなつまんないレスを返せるんだよ...
重症やな w
2018/01/17(水) 14:19:41.37ID:l2H41H1D
言うな 自分でも検索履歴に「愛知 名物」って残ってるの見て
「人生を無駄にした」と真顔で後悔してるところだから
204デフォルトの名無しさん
垢版 |
2018/01/17(水) 15:03:17.62ID:MeUm47mp
何言ってんだこのバカ
205愛知人
垢版 |
2018/01/17(水) 16:08:09.91
あらら、怒っちゃった(笑)
2018/01/17(水) 17:39:52.90ID:sykUBtM3
C++でしかできないもの作りたいだけど何かいいアイデアない?
2018/01/17(水) 17:52:07.55ID:89SqY/Kf
>>206
エクセルのような操作性の、画像レイアウト印刷アプリなんてどう?
2018/01/17(水) 18:18:50.66ID:sykUBtM3
>>207
印刷はしたくないです..
2018/01/17(水) 20:00:30.20ID:W2btjMLE
おs
210デフォルトの名無しさん
垢版 |
2018/01/27(土) 06:58:59.63ID:1R9xhZBX
windowsとLinuxで動くクライアントアプリ開発してて、Linuxコンパイラは化石みたいなバージョンからgcc4.4をようやく使えるようになった
そこでC+11の一部が使えるようになったから使いたいと思ってる
ユーザにAPIを公開してるんだけど、ユーザがAPIを使うに際してはコンパイルオプションstdc++0xが必要なことにはしたくない。今までできてたのに、バージョンアップしたらコンパイルできなくなったとかいわれるからね。

ここで質問なんだけど、ユーザに公開しているヘッダファイルにC+11の記述がなければ、ユーザからの使い方は変わらないかな?手元で試してみた感じだと行けそうだって思ったけど、このへん危ないんじゃないのとか気をつけた方がいいよとかあれば意見よろしくです
2018/01/27(土) 08:45:12.76ID:x9sgfrz+
バイナリで配布するんだったらとりあえずシンボルをnmで取得して見比べてみるとか。
212デフォルトの名無しさん
垢版 |
2018/01/27(土) 10:25:52.07ID:RqfNKOXi
ユーザからクロスコンパイラ提供してもらってバイナリ配布っす
nmコマンド、試す価値はありそうだありがとう
2018/01/28(日) 06:43:38.82ID:yhuRz+yt
以下のコードをgccでコンパイルすると

#include <iostream>
#include <functional>
using namespace std;

struct functor {
int& operator()(int& i) { return ++i; }
};

int main() {
int i = 0;
cout << functor{}(i) << endl; // 関数オブジェクトは問題なし
function<int& (int&)> lambda = [] (int& i) { return ++i; }; // コンパイルエラー
cout << lambda(i) << endl;
return 0;
}

「'main()::<ラムダ(int&)>' から非スカラ型 'std::function<int&(int&)>' への変換が要求されました」
というエラーになるのですが、どうしてでしょうか?
そもそもラムダ式は関数オブジェクトのシンタックシュガー、つまり等価なのではないんでしょうか?
2018/01/28(日) 07:45:35.06ID:kxFN6buW
>>213
戻り値がintになってる
戻り値の型を後置で書いてやればいいかな
function<int& (int&)> lambda = [] (int& i) -> int& { return ++i; };
2018/01/28(日) 22:25:05.79ID:yhuRz+yt
>>214
ありがとうございます。
戻り値の型を明示してあげないと値渡しになってしまうということですね。
勉強になりました。
216デフォルトの名無しさん
垢版 |
2018/02/06(火) 23:57:09.32ID:ZZWnbRb2
typedef int myTypeA;
typedef int myTypeB;

class Test {
void set(myTypeA a);
void set(myTypeB b);
priate:
int A;
int B;
};

のような事例で、引数に応じて専用のセッターを用意したいのですが、
int型の2種類の引数に対して、上記のように書くとコンパイルエラーになってしまいます。
どのようにするのが良いでしょうか?
2018/02/07(水) 00:04:25.80ID:k5RJAFTX
structを使う?
struct my_TypeA{ int v;};
2018/02/07(水) 00:18:25.18ID:yuAfwWTK
なるほど、、、確かにtypedefだと別名になるだけですね
structかclassで別の型にしないとダメですね
ありがとうございます!
2018/02/07(水) 03:43:04.13ID:LQaGrglb
オブジェクト指向では、型による分岐処理は無くなる。
汎化

f(親型)

ここに、親型の子型であるA型・B型が入っても、正常に動くのが、オブジェクト指向
2018/02/09(金) 15:21:46.70ID:+q9wZMZv
などと訳のわからないこと(でもないが)を供述しており
2018/02/11(日) 04:59:49.56ID:9irhhPDg
C++には強いエイリアスが無いからなあ
2018/02/23(金) 16:21:25.57ID:UAqVoMsi
C++じvtable参照することになるから遅いだろ
2018/02/25(日) 04:05:35.43ID:Zrtx8k52
>>216
セットする値の名称にする
例えば三角形を表すオブジェクトで底辺と高さをセットするのであれば、base()とheight()になる
プロパティとして使うのだから、setXXX()みたいに書かなくてもいい

setter単独で存在することはありえないからgetterも設けること
setterって余り必要ない
コンストラクタからの初期化で十分の場合が多い
2018/02/25(日) 14:23:16.60ID:8l5JrV0a
>>219
だぶるでぃすぱっち
225デフォルトの名無しさん
垢版 |
2018/03/03(土) 13:43:59.95ID:Vl4EAVf3
2の累乗でないときのmod演算の高速化の方法、何かありませんか?
そこらへんはコンパイラで最適化されるんですかね
2018/03/03(土) 14:09:48.07ID:xC+xvi0u
>>225
法を2進数にしたときほとんど1かほとんど0なら手間の少ない方法はある。
法が固定で何度も剰余を取るならモンゴメリリダクションがある。
どちらも乗算はそれなりに必要。
227デフォルトの名無しさん
垢版 |
2018/03/03(土) 14:14:16.62ID:Vl4EAVf3
>>226
ありがとう
ちょっと調べてくる
228デフォルトの名無しさん
垢版 |
2018/03/06(火) 00:16:25.34ID:EXuXevGu
ユニークポインターにキャラの可変配列をヒープからとってリセットしたはいいけど、デリーターって簡単に実装/定義できる?例が欲しい。
2018/03/06(火) 00:47:05.22ID:yCnPPW+5
mutex g_Mtx;

int g_Val = 0;

int Func( int A, int B )
{
  int Val = A * B;

  lock_guard<mutex> Lock( g_Mtx );

  return g_Val = Val;
}

void ThreadFunc0()
{

}
2018/03/06(火) 00:55:45.44ID:yCnPPW+5
mutex g_Mtx;
すみません、途中で送信してしまいました。

int g_Val = 0;

int Func( int A, int B )
{
  int Val = A * B;

  lock_guard<mutex> Lock( g_Mtx );

  return g_Val = Val;
}

void ThreadFunc0()
{
  int Val = Func( 2, 3 );

  // Valを参照する処理
}

void ThreadFunc1()
{
  lock_guard<mutex> Lock( g_Mtx );

  // g_Valを参照する処理
}

上記のようなスレッド関数が非同期に実行されるとき、
Func()はスレッドセーフ(g_Val書き換え中に参照されない)でしょうか?

(1)lock_guard<mutex>によるミューテックスロック
(2)g_Valの書き換え
(3)戻り値を読み出し元スレッドにコピー(あるいはムーブ)
(4)lock_guard<mutex>がスコープから外れアンロック

というシーケンスを期待しています。
231230
垢版 |
2018/03/06(火) 00:58:37.27ID:yCnPPW+5
誤:読み出し元スレッド
正:呼び出し元スレッド
232230
垢版 |
2018/03/07(水) 00:28:47.80ID:+JS1hm36
すみません、他スレで聞きます。
2018/03/07(水) 19:00:17.77ID:BpTZedcA
事情があって下記の型の関数を、
void Func1(char a);

下記の型の関数ポインタに代入して呼びたいと思っています。
int*(*p)(int*);
p = (int*(*)(int*))Func1;
p((int*)123);

動作としてはFunc1(123)と呼んだときと同じものを期待しており、
試したところそれっぽく動作しているのですが、
致命的な問題等あります?
"暴走の危険あり"など。
2018/03/07(水) 19:20:05.55ID:/Jrz1mw6
スタックに積むサイズは通常int
long longとかで無ければ実害は無い
2018/03/07(水) 19:29:05.35ID:iizJnzkK
>>233
C11の6.3.2.3の8によると、the behavior is undefinedだ。
たとえばcharが4バイトに自動昇格して、ポインタが8バイトだったりすると、
どうなるかわかったもんじゃない。鼻からなんちゃらだ。
C++は知らん。
2018/03/07(水) 19:29:59.98ID:Ssa+vNsg
sizeof(int) != sizeof(int*)の場合(例えばx64)、どうなるかな?
2018/03/07(水) 19:34:38.56ID:iizJnzkK
そうそう、undefinedのあとはほんとに何が起きるかわからんよ。
コンパイラが何をしでかしても文句言えない。
たまたま今の環境で動いても、明日コンパイラを更新したら挙動が変わりうる。
2018/03/07(水) 20:01:22.38ID:MtWgjxh8
「事情があって」の事情を解消する方が安全だと思うけど…。
void Func1(char a); を呼び出すラッパ関数を使うのはどうだろ?

int* Func1_wrapper(int *p)
{
 uintptr_t arg = (uintptr_t)p;
 Func1((char)arg); // 縮小変換が危険
 return NULL;
}

int* (*p)(int*);
p = Func1_wrapper;
p((int*)123); // 明らかに不正アラインメントだが
2018/03/07(水) 20:34:34.64ID:TWOfgg7C
>>233
関数ポインタ同士は互換で、お互いにキャストすることは許される。
が、呼ぶときは元の型にキャストしなおしてからじゃないとあかん。
2018/03/10(土) 22:50:07.25ID:tBgkA+tH
C++で窓出してプログラム組みたい時ってどういう風にするもんなんでしょうか
windows.hで一つ一つボタンの位置を設定してハンドルやらコールバックと格闘するもんなんでしょうか
それとも何か気の利いた便利なライブラリとかがあるんでしょうか

というかこの手のライブラリやフレームワーク的なものを探したりしたい場合はどういう場所から情報を集めるものなんでしょうか
それっぽいキーワードでgoogleで検索して探そうとしても上手く情報を見つけられないのですが、根気よくページを確認していくしかないのでしょうか
2018/03/10(土) 23:05:33.56ID:+Ww908Qw
>>240
基本的には win32api を使うことになり、私は C++ からwin32api( ::DefWindowProc() とか)を個別呼び出している
気の利いたライブラリのことはよく知らない
2018/03/10(土) 23:18:25.22ID:tBgkA+tH
やっぱりそういう感じになるんですね
頑張って勉強します
2018/03/10(土) 23:42:00.51ID:4x8PIJN4
>>240
Windowsに特化するなら Win32APIのほかにMFCやWTLや.NET framework(C++/CLIで良ければ)などのライブラリを使う
サードパーティならC++ BuilderのVCLとかあとはクロスプラットホームのQtとかGtk+とかwxWidgetsとか他にもあると思うけど
最近はデスクトップアプリが落ち目なのでこれという定番はなくて目的に応じて分散しているのでは?
自力で情報が集められない程度ならC++でGUIなんて止めとけという気がしないでもない
2018/03/11(日) 00:23:13.22ID:5+tjHPTy
ありがとうございます。それぞれ見てみます
2018/03/11(日) 00:43:28.70ID:QedwXA9H
vs2010以降ならWIN32SDKベースでも雛型吐いてくれるだろうに
2018/03/11(日) 03:53:08.43ID:4ez4tjCr
>>240
ボタンの配置などは、リソースエディタでダイアログテンプレートを作ってDialogBox関数を呼べば、細かい調整ができる。
イベント駆動やメッセージ送信などについては、<windowsx.h>で提供されるメッセージクラッカーやマクロを使えば便利になる。
私が複雑なことをする場合は、MZC4という自作のクラスライブラリを使ってる。
2018/03/11(日) 03:59:42.40ID:4ez4tjCr
HANDLE_MSGマクロによるメッセージクラッカーという仕組みを使えば、ウィンドウプロシージャやダイアログプロシージャの記述が楽になる。
私はさらに、HANDLE_MSGの呼び出し先の関数の入力を楽にする自作のMsgCrackというツールを使っている。
2018/03/11(日) 04:12:58.32ID:f5R2yX0u
WinRT が綺麗にまとまってると思う。
https://github.com/Microsoft/cppwinrt
Windows API を現代的な C++ に合わせて整理したものなので、
C++ 的にある程度まともな感じがする。

昔は仕方がなかったんだろうけど、
今にしてみればメッセージクラッカーっていかにもクソダサい方法だよな〜。
249デフォルトの名無しさん
垢版 |
2018/03/11(日) 10:27:16.51ID:zWe+i43K
>>240
tcl/tkが一番手軽
2018/03/11(日) 10:40:38.07ID:1J69PCFW
Win32プログラミングスレあったっけ
2018/03/11(日) 10:51:25.22ID:QedwXA9H
Win32API質問箱 Build124
http://mevius.5ch.net/test/read.cgi/tech/1510395780/
252デフォルトの名無しさん
垢版 |
2018/03/11(日) 10:55:00.37ID:zWe+i43K
Win32APIスレは限定的だからGUI一般スレみたいなのの方を紹介しようと思ったが面倒なので
次の方どうぞ
2018/03/11(日) 11:28:30.29ID:1J69PCFW
>>251
どうも
2018/03/12(月) 02:15:34.18ID:Cvix3isA
何度も呼ばれる関数内ではローカル変数をstaticにした方が速いのですか?
2018/03/12(月) 02:19:53.88ID:9vbtopii
>>254
誤差だ、
プログラミングスタイルを曲げてまですることではない
2018/03/12(月) 02:23:59.34ID:Cvix3isA
>>255
さいですか ありがとうございました
2018/03/12(月) 02:50:45.99ID:SGROmA8V
皆様はプログラムを遅くし過ぎない為に気をつけている事などありますか?
速さを突き詰める為の工夫というより、誤って異常に処理時間のかかるようなプログラムを作らないようにする為にはどのような事を意識すると良いのでしょうか
2018/03/12(月) 03:02:50.40ID:9wDOvV2B
staticの方が速い理由なんて一つも無いような
あまり呼ばれない場合はstaticの方が遅いよね、キャッシュ的に
マルチスレッドで邪魔だし、必要がある時以外は使うもんじゃないよ
2018/03/12(月) 03:20:38.17ID:IdW8RVi3
>>257
メモリアクセスのコストだあ
2018/03/12(月) 03:57:56.72ID:SGROmA8V
>>258
多分、メモリを毎回確保し直す事や、コンストラクタを何度も呼ぶ事により処理が遅くなると考えたのではないでしょうか
2018/03/12(月) 04:48:35.89ID:Ajs1ZroQ
>>257
実行速度は推測ではなく測定することが鉄則だから
出来ることは気になったときに正しく測定出来るようにすることくらいだ
2018/03/12(月) 08:13:41.87ID:0T8K0H1S
>>257
ファイルアクセスのような重い処理とか深いループの中の計算処理とかは必要に応じて適切なデータ構造やアルゴリズムをあらかじめ検討しておくけど、頻度が少なく問題にならない箇所は分かりやすさ実装しやすさ優先で無理に速度は追求しないかな。
あとは将来的に性能改善が必要になることもあり得るから基本的には柔軟性のある変更に強い設計を普段から意識しておくとか。
2018/03/12(月) 12:47:06.75ID:wZFlYBXj
計算量とかメモリ使用量のオーダーは気にするけど、オーダーが変わらないレベルの差はそんなに気にしてもしょうがない。
2018/03/12(月) 16:25:47.91ID:JoWTM6VO
>>262
>>263
ほんこれ
2018/03/12(月) 17:58:03.22ID:WDt4qsqW
待て待て、>>257は速度追求の話ではないだろう
無駄なループを通らせないとかそういう話でしょ?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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