スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net

2016/08/14(日) 00:04:05.53ID:z6U1tRVC
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
01 http://pc11.2ch.net/test/read.cgi/tech/1167476845/
02 http://pc11.2ch.net/test/read.cgi/tech/1178503366/
03 http://pc11.2ch.net/test/read.cgi/tech/1187521676/
04 http://pc11.2ch.net/test/read.cgi/tech/1221633708/
05 http://pc11.2ch.net/test/read.cgi/tech/1230516307/
06 http://pc11.2ch.net/test/read.cgi/tech/1231564903/
07 http://pc11.2ch.net/test/read.cgi/tech/1232983248/
08 http://pc12.2ch.net/test/read.cgi/tech/1235921779/
09 http://pc12.2ch.net/test/read.cgi/tech/1240022781/
10 http://pc12.2ch.net/test/read.cgi/tech/1242300936/
11 http://pc12.2ch.net/test/read.cgi/tech/1245059383/
12 http://pc12.2ch.net/test/read.cgi/tech/1248010352/
13 http://pc12.2ch.net/test/read.cgi/tech/1260842197/
14 http://pc12.2ch.net/test/read.cgi/tech/1269273471/
15 http://pc12.2ch.net/test/read.cgi/tech/1273368706/
16 http://hibari.2ch.net/test/read.cgi/tech/1279285647/
17 http://hibari.2ch.net/test/read.cgi/tech/1285115590/
18 http://hibari.2ch.net/test/read.cgi/tech/1291571263/
19 http://hibari.2ch.net/test/read.cgi/tech/1308106024/
20 http://toro.2ch.net/test/read.cgi/tech/1316013463/
21 http://toro.2ch.net/test/read.cgi/tech/1342285511/
22 http://peace.2ch.net/test/read.cgi/tech/1399911167/
23 http://peace.2ch.net/test/read.cgi/tech/1420379468/
24 http://echo.2ch.net/test/read.cgi/tech/1448685034/
165デフォルトの名無しさん
垢版 |
2017/08/09(水) 17:47:06.00ID:Nvjd+alY
もう面倒だから void *p
2017/08/11(金) 11:07:36.66ID:Ca8C76qb
>>164
アドレス、でいいと思うよ、どんなときに不正確になるの?
2017/08/11(金) 11:37:15.24ID:nYt6U0do
>>165
昔、voidっていう人いたよね
2017/08/11(金) 12:03:58.06ID:Ca8C76qb
日下部さんだね、一連の馬鹿吊り上げの手法はたいしたものだ
彼にかかると面白いように釣れるんだね
2017/08/12(土) 11:18:07.25ID:gBGehi2j
>>166
void型のポインタに関してはアドレスでいいと思うよ
170デフォルトの名無しさん
垢版 |
2017/08/22(火) 14:42:32.63ID:a5iq0eNT
>>166
++演算子使ったときとか
ヌルポインタとか
2017/09/09(土) 17:22:28.03ID:ua/r5C7o
ヌルポはアドレス0を示すポインタと区別が付かない。
ポインタ演算はアドレス計算で間違いないと思うが。
2017/09/10(日) 01:13:46.17ID:kRb3fDCd
0を示すものに1を加えたとき、1になって欲しいのがアドレス
そうとは限らないのがポインタ
2017/09/10(日) 01:41:24.87ID:ZBmzdD/d
なら、そこまで言うなら
アドレスには型が無い、あっても整数型、intptr_tとか
ポインタには型があって、*や->や()を使って指し示すものにアクセスできる
という大いなる違いがある
アドレスを静的型でラップしたものにポインターという名前を付けた、程度
2017/09/10(日) 01:52:16.37ID:tW3VD+Zp
その程度違いがあるから、アドレス≠ポインタだね
2017/09/10(日) 11:43:30.44ID:Yx0nU1n/
>>171
ヌルポしたけど sage だから失敗
2017/09/10(日) 22:38:52.49ID:6lPEiBMC
アドレス値を入れる種類の変数(の型)≡ポインタ
2017/09/17(日) 13:05:36.48ID:bgx1+MxI
アドレスとポインタは一緒だとおもうよ,ポインタに型がある,とかいうのはCコンパイラ言語仕様側の都合にすぎないし
アドレスの整数値とポインタの表現する整数値が食い違う例(ただし NULL とか far/near はわかっているから除く:−)ってそんなにないんじゃないの?
2017/09/17(日) 14:44:48.15ID:qULdwsa1
アドレスとポインタは違うと思うけどなあ
アドレスは数値そのもの、ポインタはその入れ物
だから「int型のアドレス」とは言わないし、「ポインタ0x12345678番」とは言わないし
2017/09/17(日) 15:07:54.63ID:KmM7k2LQ
>>178
これが正しい
2017/09/17(日) 15:32:04.84ID:dEX9B4aF
入れ物をインクリメントするのも変だよな。
2017/09/17(日) 15:45:07.67ID:iyMogwhx
>Cコンパイラ言語仕様側の都合にすぎないし

あほだなぁと思うのは、ここで言うポインタというのは
C言語の仕様で定められたポインタのことじゃないのか?
C言語の仕様として「ポインタ」が定められていて
それに関してどうこうって時に
C言語の仕様の都合だから〜とかイミフ
C言語のポインタにC言語の仕様以外の意味なんかないだろ
2017/09/17(日) 15:50:42.26ID:53PrWSTF
>>181,178
これだなw
2017/09/17(日) 16:21:54.39ID:qULdwsa1
>>180
インクリメントしているのは入れ物の中身では?
2017/09/17(日) 16:52:30.92ID:nfmsAfUe
>>178の例えだと中身はアドレスってことになるが、ポインタのインクリメントは
アドレスのインクリメントとは違うだろう。
2017/09/17(日) 17:01:41.39ID:qULdwsa1
「アドレス0x12345678番をインクリメントする」のだから間違いでは無いと思うよ
ただ数値をいくつ増加させるかはポインタの型(つまり入れ物の型)に依存する
2017/09/17(日) 17:24:14.07ID:nfmsAfUe
だからそれがポインタのインクリメントだろう。
わざわざ入れ物だ中身だと意味がよくわからない例えは余計。
2017/09/17(日) 17:30:00.83ID:dEX9B4aF
>>185
「アドレス0x12345678番をインクリメントする」は、
a=0x12345678で、*a++ ではないか?
2017/09/17(日) 17:30:33.37ID:qULdwsa1
何が言いたいのか良く分からないんだが
アドレスとポインタは違うものでポインタはアドレスを入れるものってだけの話だよ
アドレスそのものに型はないがポインタには型がある
ポインタのインクリメントとは、ポインタの型に従ってアドレスをインクリメントする
2017/09/17(日) 17:31:34.74ID:53PrWSTF
いちゃもんレベルだなw
2017/09/17(日) 17:34:55.50ID:qULdwsa1
>>188>>186宛ね

>>187
表現が悪かったね
「アドレスが指すデータをインクリメントする」じゃなくて「アドレスそのものをインクリメントする」だよ
4バイト長のデータなら「アドレス0x12345678番を0x1234567C番にインクリメント(増加)する」
2017/09/17(日) 17:55:30.80ID:KmM7k2LQ
>>176 >>178 >>188 が正しいだろ
ポインタとアドレスをごっちゃにしてる馬鹿は入門書からやり直せ
2017/09/17(日) 18:45:32.71ID:dEX9B4aF
ポインタ型変数がポインタなのか?それに入っているのがポインタなのか?

もしかしたらポインタというのは存在しないのではないか?
2017/09/17(日) 18:58:47.30ID:iyMogwhx
何を訳の分からないことを言ってるんだ?
Cの規格書に出てくるんだからあるに決まってるだろ

当たり前だがポインタ型変数に入っているものはポインタだ
多くの処理系で機械語レベルでは単にアドレスというだけ
同じように浮動小数点型変数に入っているものは浮動小数点だ
これも多くの処理系で機械語レベルではIEEEのホゲホゲというだけ
2017/09/17(日) 20:45:56.11ID:dEX9B4aF
>>193
つまり、機械語レベルではアドレスと言うものが、Cではポインタと言われているのか?
2017/09/17(日) 21:07:31.82ID:53PrWSTF
基本的にポインタの値は低レベルではアドレス値だけど
機械語レベルではアドレスと言うものがCではポインタと言われているとは限らない
2017/09/17(日) 22:10:04.90ID:iyMogwhx
多分、根本的に、型というものが理解できてないんだと思うよ
2017/09/17(日) 22:18:43.93ID:dEX9B4aF
>>195
ちょっと待って。そこをはっきりさせてくれよ。
2017/09/17(日) 22:25:24.89ID:iyMogwhx
AならBだけど、BならAとは限らないってだけ
これぐらいは高校の数学で習うだろ
もしくはアップキャストは常に成功するけど
ダウンキャストは成功するかわからない、といったところか
2017/09/18(月) 02:34:06.85ID:5sYblZKp
char *p のとき、
p はポインタ?それともポインタ型変数?
pに入っているのはポインタ?それともアドレス?
ポインタってどれ?
2017/09/18(月) 02:55:32.19ID:dIhl3VcQ
>>199
pは(char)ポインタ型変数で、入っているのは(char)ポインタ値
ポインタ値の実態はアドレスでかつ整数値のことが多いってかそれ以外の環境は見たことも聞いたこともないな
2017/09/18(月) 03:23:36.62ID:5sYblZKp
>>200
ありがとう。
ちょっと考えてたんだけど、やっぱりchar型ポインタとかint型ポインタってのはないんじゃないのかな。
インクリメントしたときにいくつ増えるかはポインタ変数の型で決まるだけだし。
2017/09/18(月) 03:35:36.95ID:dIhl3VcQ
>>201
char型ポインタ型だとなんか被ってるから省略してるだけじゃないかな
charポインタ型でもいいと思うけど。さらに言えばcharポインタでも通じると思う
2017/09/18(月) 10:09:10.30ID:Rs/BRyvp
>ちょっと考えてたんだけど、やっぱりchar型ポインタとかint型ポインタって
>のはないんじゃないのかな。

int i; char c;
&i //int型ポインタ
&c //char型ポインタ
2017/09/18(月) 16:51:15.62ID:XDi5i+Jp
>>195
>機械語レベルではアドレスと言うものがCではポインタと言われているとは限らない
具体例は?
2017/09/18(月) 18:57:32.72ID:gSdMoaKK
jmp addr
2017/09/19(火) 12:42:20.85ID:1YUfQXAj
それは関数へのポインタじゃないの?
2017/09/19(火) 13:21:39.96ID:87FEHvFq
jmpだけ見せられたらそれはcだとgotoかな
もちろん関数ポインタもあり得るし、ほかにも逆コンパイル先はあり得る
2017/09/19(火) 18:10:22.48ID:PcYxkZC9
どーでもいい話になったら伸びるねこのスレ
2017/09/19(火) 19:47:23.33ID:ruUa1Ruj
>>206
ifとかの分岐でもjmpは生成されるだろ
2017/09/19(火) 19:52:37.77ID:87FEHvFq
jneとかじゃないか?
2017/09/20(水) 13:01:55.83ID:hO1kkbas
関数へはcallだね。Z80だと。
2017/09/30(土) 01:34:37.34ID:/jgYbdHq
関数は飛んだあと戻ってこないとだめだからね
飛ぶ前のアドレスをpushして飛ぶ
そこがjmpとの違いなんだが...
まあ高級言語しか使ったことない人にはあまりそのあたりがわからないのだろう
2017/09/30(土) 06:58:10.31ID:SQk+Dlf1
>>212
callない変態コアもあるけどなw
2017/09/30(土) 10:25:39.90ID:BYym2Kja
C/C++ とあんまり関係ない話題に乗るのは気が引けるけど…

メモリへの読み書きを避けるために
戻り先アドレスをスタックに積まないCPUもあるよね。
PCの値をレジスタにコピーしてジャンプ。
リターン時にはレジスタからPCにコピー。

ARMのサブルーチン呼び出し命令が "BL" だからって変態あつかいするな。
2017/10/01(日) 06:44:43.98ID:wTXYROVe
>>214
>戻り先アドレスをスタックに積まないCPUもあるよね。

RISC CPUだとだいたいそれだな
リンクレジスタというのが用意されててサブルーチンコールの戻り値がリンクレジスタに格納される
スタックに戻り値を積みたい場合は手動でスタックに積む
MIPS、ARM、POWER、SPARCなどみんなこれ
216214
垢版 |
2017/10/01(日) 07:54:30.40ID:TsPEHv68
214 に補足。またもC/C++と無関係ですまぬ。

投稿時には意識していなかったけど、
BL命令で「さぶ」ルーチンだから辻褄は合ってる、かも。
流石ARMさんは紳士の国イギリスの会社だなぁ。
2017/10/01(日) 09:14:55.87ID:qGSPhC6b
>>216
すまんどゆこと?
2017/10/01(日) 10:08:25.18ID:9UECfosW
うん。まったくわからん。興味ないけど
2017/10/02(月) 19:28:33.83ID:ur7JCHdr
おそらく、しゃぶるーちん って事でしょ
2017/10/02(月) 19:30:14.39ID:oqL7c7am
おおさぶっ!
2017/10/04(水) 12:08:31.97ID:QGS2LkxJ
デバックの為自分の昔のコードを読むと
難しくて理解するのに時間がかかったりして
己の衰えを自覚するよな
2017/10/04(水) 12:47:05.65ID:oXiXRVKi
数年前の自分は他人みたいなもんだしな
2017/10/04(水) 17:28:18.58ID:N0mfbhbs
コーディングスタイルが変わっちゃってたり、
当時は精通していたアルゴリズムを使わないでいるうちに忘れたり、
別の場所で散々書いた注釈だからと省略した場所を直すはめになったり。
2017/10/05(木) 15:02:15.28ID:RyRWuj5i
ソース中にコメントとか入れないの?
2017/10/05(木) 15:26:29.53ID:v1JdYXKS
数年前のコメントは見ても理解できないからなw
2017/10/06(金) 16:53:07.29ID:UJYLIi2n
それは国語からやり直した方がいいのでは…
2017/10/06(金) 17:36:15.61ID:fbkgiuQU
じゃ昔のコード読めなくなったら、プログラミングの勉強からやり直しだなw
2017/10/06(金) 17:47:23.98ID:5EA0jlqJ
当たり前だろ。
2017/10/25(水) 12:32:07.75ID:RJdooZ2I
C++11なしで以下のプログラムがコンパイルできて2が出力されるようにしたいです。
どうかけばよいのでしょうか。
https://wandbox.org/permlink/NK5dYKZtrEBXN012
2017/10/25(水) 13:35:04.89ID:juMZY67C
>>229
警告がでてるけどboost::phoenixで通せた
https://wandbox.org/permlink/z1PTTryi8XubVbW7
2017/10/25(水) 13:37:35.53ID:RJdooZ2I
>>230
超ありがとうございます!(5時間悩んだ)
2017/10/25(水) 13:42:13.44ID:U6sw7DMu
解決してるようだが
>>229
for_each(vsz.begin(), vsz.end(), boost::lambda::var(misz)[boost::lambda::_1]++);
2017/10/25(水) 13:53:33.16ID:RJdooZ2I
>>232
ありがとうございます!
boost::lambda::varの方はVCコンパイラでもビルドできました。

余談ですが、operator[]の代わりにstd::map<>::atを使えないか試してみたのですが
こちらは無理そうでした。
2017/10/25(水) 21:59:33.61ID:U6sw7DMu
> 余談ですが、operator[]の代わりにstd::map<>::atを使えないか試してみたのですが
> こちらは無理そうでした。
・そもそもmap::atがあるのはc++11以降
・しかもmap::atはキーが存在しないと例外を投げるから今回みたいな[]の代わりには使えない
・それでやるとしてもboost::lambdaではbindを使わないとできない
2017/10/25(水) 23:22:00.79ID:RJdooZ2I
>>234
回答ありがとうございます。
ひそかに.atが使えないか調べていて
一日中やっても駄目だったので諦めたところでした。
自分の環境はVS2012でC++11が部分的に実装されている状況だったため
.atがないことに気づきませんでした。すみません。

bindを使う方法はboost::bindやboost::lambda::bind、boost::phoenix::bind
と、一通りやってみたのですが自分にはどうやってもコンパイル通りませんでした。
2017/10/25(水) 23:56:46.90ID:U6sw7DMu
>>235
https://wandbox.org/permlink/xnDEG9BvF91bvBW7
オーバーロードされてるメンバ関数のポインタを取得しなければなならないのがつまづきどころかな
2017/10/26(木) 00:46:41.57ID:CxNeOOyi
>>236
わざわざ調べてくださって本当にありがとうございます。
喉の魚の骨が取れた様な気分です。
キャストは思いつきませんでした。
238デフォルトの名無しさん
垢版 |
2017/10/27(金) 04:44:05.29ID:dgw8O7sr
組み込み系ってC++よりもCを使うことが多いと思うが、C++を使うと問題ある?
ROM 256Kbyte、Ram 8K位の場合だと、何か注意することある?
2017/10/27(金) 07:05:11.65ID:kl+AecdR
C使うことなんてないわ
2017/10/28(土) 00:18:19.01ID:VLfN62TL
C すらためらうレベル
2017/10/28(土) 08:50:31.24ID:5mHtwzGb
20年以上前はためらったが今はアセンブラなんてやってられんな
昔はハードに合わせて開発したが、今は開発に合わせてハード選べばいい
2017/10/28(土) 12:37:02.52ID:siUcDApP
つかC言語と言っても
直接アセンブラ・ニーモニックを埋め込める
インライン機能が用意されてる処理系あるし
243デフォルトの名無しさん
垢版 |
2017/10/28(土) 16:13:43.77ID:5T1YNIdw
普通C++だとRAMペースだろ。だから組み込みでRAMが8kとかでは使えないだろな。
2017/11/20(月) 17:48:28.20ID:HOO1fHXA
>>242
未だに半角カナ使う奴いたんだ
2017/11/20(月) 23:16:04.54ID:ste5Kj49
そりゃISO-2022-JPならともかく、Shift_JISやUnicodeでは正当な文字ですからね。
2017/11/21(火) 06:40:04.61ID:VCAIytbF
変換時の文字幅にまるで無頓着な人が増えた、という話を聞くね。
環境が全面的にプロポーショナルフォントになったことも関係あるかと。

コピーしてペーストして一部書き換え、て手順のせいで
単語中で「半角」「全角」が混在したり、それに気づかなかったり。
2017/11/21(火) 07:02:38.37ID:f5CXuOxE
半角カナに敏感なのって40代、50代以上だよね
未だに2chやってる奴いたんだ
2017/11/21(火) 07:59:10.55ID:CMMMtcpC
1月11日
みたいに一桁は全角2桁は半角ってのもあるな
2017/11/30(木) 13:01:31.93ID:D3zqdlF5
OpenMPで#pragma omp sectionsの役目って何なんでしょうか?
#pragma omp parallelで並列領域を
#pragma omp sectionでスレッド処理(スレッド割当て)単位を
指定することは理解できました。

しかし#pragma omp sectionsが必要となる理由がわかりません。
なぜ必要なんでしょうか?


#pragma omp parallel sectionsって書けるみたいですが
まぁこれは本質ではないですよね?

#include <stdio.h>
int main(void)
{
 #pragma omp parallel
 {
  #pragma omp sections // ←コンパイラに何を指示してる?
  {
   #pragma omp section
   printf("Hello 1\n");
   #pragma omp section
   printf("Hello 2\n");
   #pragma omp section
   {
    printf("Hello 3a\n");
    printf("Hello 3b\n");
   }
  }
 }
 return 0;
}
2017/11/30(木) 13:38:08.08ID:/IB/XhDr
>>249
https://www.google.com/search?q=%23pragma+omp+sections
251デフォルトの名無しさん
垢版 |
2018/01/18(木) 22:17:06.28ID:fk/Xo3MV
https://github.com/espressif/esp-idf/blob/master/examples/bluetooth/ble_spp_server/main/ble_spp_server_demo.c

の 169 行目からの記述ってどうなっているのか理解したいのですが、
どなたかヒントもらえないでしょうか?

「[SPP_IDX_SVC] = ...」 となっているのが分かりません。
2018/01/18(木) 22:58:14.15ID:7tNMQ3qD
>>251
C99 の「指示付きの初期化指定子」かな?
253デフォルトの名無しさん
垢版 |
2018/01/18(木) 23:17:40.59ID:fk/Xo3MV
>>252
ありがとうございます。理解できました。
2018/01/19(金) 10:36:40.61ID:dM64lXT0
シングルトンにするのと、全部クラス変数、クラスメソッドで実装するのと
目的はあまり違わないような気がするんですけど、あえてシングルトンにする意味があれば
教えて頂けないでしょうか?
255デフォルトの名無しさん
垢版 |
2018/01/25(木) 15:00:52.20ID:uboI0CmN
質問の意味がわからないが、シングルトンというのはインスタンスを一つしか持たない
ということ。クラス変数のようにインスタンスがいくつも作れると誤って2つインスタンス
を作ってしまう可能性がある。そうすると本来とは違う変数にアクセスしてしまう恐れが
ある。これをさけるんが目的。
2018/01/25(木) 15:45:13.06ID:O5EWej8a
>>255
レス有難うございます。
それは、インスタンス変数じゃないでしょうか?
クラス変数は同一クラスで共有される静的な変数なのでいくつも作れるものではないと理解しているのですが...
2018/01/25(木) 16:16:27.35ID:6NNXd/EM
微妙に違うけど例えば自分の体重管理アプリを作るとする。「自分」は一人しかいないから、体重を格納する変数だかクラスは1つあればいい
家族の体重管理アプリなら、「家族」は複数だから体重の格納も複数になる
こうしたときに自分アプリはシングルトン設計、家族アプリはシングルトンでない設計と「呼んでるだけ」。元々みんなやってたことに専門用語っぽくネーミングしただけだよw
2018/01/25(木) 16:36:48.08ID:O5EWej8a
>>257
それ、クラスがシングルトンじゃなくて、データが個人用(単一データ)か複数人用(配列/ディクショナリ)かって話だから、シングルトンとは違うような...
2018/01/25(木) 21:57:47.77ID:8MUKcewe
抽象メソッドにできるというのが一番の利点じゃないかな。
260デフォルトの名無しさん
垢版 |
2018/01/25(木) 22:18:47.51ID:9MCrLTCo
組み込み環境に C++ のコードを移植しようとしているんだけど、質問ってここでしていいのかな。

RAM の容量が厳しいので、 Flash にデータを持つように改造したいと思っている。
で、これは、C++ 的には定数でデータを持つだけで実現できるらしい。幸い組み込み環境ではリードオンリーでよい。

普段 PC 環境なら計算量の多いコンストラクタを経て初期化しているあるクラスのインスタンス群を、
PC 環境上で初期化して各フィールドの値をダンプしておいて、
組み込み環境では各フィールドが const になるようにクラスを改造したうえで
何かの方法でコンストラクタをスキップしてやりたい。これでRAMも計算量も減らせたらいい。

思いついた方法は、シリアライザというかコードジェネレーターを用意してソースコード上に定数群をたくさん定義して、
MyType i { cDataA, cDataB, ... }, j { cDataO, cDataP, ... }; のような記述ができるようにする、という感じのもの。
ほかによく使われている方法はある? あるいは、アドレスのキャストか何かでインスタンスの初期化を完了できる黒魔法っぽい方法もあったりする?
2018/01/25(木) 22:22:11.16ID:9MCrLTCo
って隔離スレなのか。まあ過去レス見た限りでは答えてくれているようなので… よろしくお願いします。
2018/01/25(木) 22:42:32.30ID:4TKaBAL2
static char buf[sizeof(MyData)] = { ... };
MyData& data = reinterpret_cast<MyData&>(buf);
2018/01/25(木) 22:43:32.46ID:4TKaBAL2
static char buf[sizeof(MyData)] = { ... };
MyData& data = *reinterpret_cast<MyData*>(buf);
2018/01/25(木) 23:23:09.67ID:9MCrLTCo
ありがとう
{ ... } の部分をプログラムからうまく生成する方法はなにかあるだろうか?
2018/01/25(木) 23:28:29.97ID:9MCrLTCo
キャストで済んでいるのはとてもよさそうだけど、
PC 環境でのメモリ上での表現と組み込み環境でのメモリ上の表現は完全に一致するのだろうか。
アライメントというものがあるんだったような
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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