1read 100read
2013年17プログラム129: スレを勃てるまでもないC/C++の質問はここで 21 (654) TOP カテ一覧 スレ一覧 2ch元 削除依頼
[an error occurred while processing this directive]

スレを勃てるまでもないC/C++の質問はここで 21


1 :2012/07/15 〜 最終レス :2013/09/08
スレを勃てるまでもない低俗な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/

2 :
>>1
これは乙じゃなくてポニーテールがうんたら

3 :
枯れ木過ぎてこのまま落ちそうだな

4 :
びよーね・すっぽすっぽ先生を讃えるスレということで

5 :
コード -1073741819 で終了してしまう
くっそー

6 :
すいません。教えてください。
入力された引数をトークンに分解するプログラムなのですが、
#define MAXARGS 1024
#define CHUNK 1024
int main(int argc, char *argv[])
{
char **args;
int err;
while ((err = readcmdline(stdin, stdout, &args)) > 0) {
if (strcmp("cd", args[0]) == 0) {
chdir(args[1]);
...
int readcmdline(FILE *i, FILE *o, char ***args)
{
char *prompt = getenv("PS1");
char *buf, *lasts, *token;
int argc;
/* メモリの割当 */
if ((buf = malloc(CHUNK)) = NULL ||
(*args = (char **)malloc(sizeof(char **) * MAXARGS)) == NULL) {
perror("malloc");
exit(1);
}
....
をコンパイルすると、
In function `readcmdline':
invalid lvalue in assignment
と*args = (char **)malloc(sizeof(char **) * MAXARGS)) == NULL
の所で怒られます。
本に書いてあったソースなのですが、そもそも宣言していない*argsに代入する事は可能なのでしょうか?

7 :
readcmdline()のargs自体は、main()のargsへのポインタが代入されているから
* args = ... で代入することは問題がないはず。
問題なのは、その行ではなくてその一つ前の行。

8 :
>>7
buf = malloc(CHUNK)) = NULL

buf = (char *)malloc(CHUNK)) == NULL
にしたらOKでした。すいません。
教えてほしいんですが、
main関数内で
ポインタのポインタとして、
char **args;を宣言して、
そのアドレスを、
int readcmdline(FILE *i, FILE *o, char ***args)
で受けて、
char ***argsに入っている事は解るんですが、
(*args = (char **)malloc(sizeof(char **) * MAXARGS)
の場合、
*argsは何を示してるんでしょうか?
*argsはどこでもポインタとして宣言していないような気がするんですが...

9 :
>int readcmdline(FILE *i, FILE *o, char ***args)
ここに書いてるやん

10 :
typedef char ** charPtrPtr;とでもして、charPtrPtr * argsとでもしたらわかるかも知れない。

11 :
う〜ん、
http://www.nurs.or.jp/~sug/soft/tora/index.htm
あたりを読んで勉強してきます。

12 :
質問です。C++の設計者はどうしてあんなに分かりにくい仕様にしたんですか?

13 :
>>12
Cのコードを使えるようにするため

14 :
Cとの互換性の確保と、オブジェクト指向の概念の分かりにくさは、直接関係ないような気がしますが…。

15 :
実はオブジェクト指向ってしっくりこないんです!

16 :
質問ですが
__int64 bit;
//setbit = 1ull << i;
setbit = 0;
_bittestandset64(&setbit,i);
のアセンブリコード出力が
lea rcx, QWORD PTR setbit$87411[rsp]
mov QWORD PTR setbit$87411[rsp], 0
bts QWORD PTR [rcx], rax
mov rcx, QWORD PTR setbit$87411[rsp]
となるんだが
xor ecx, ecx
bts rcx, rax
となるようなソースコードを教えていただけませんか?
環境はVC2010、ターゲットCPUはSandy Bridgeです。
またiは0〜63の整数です。
放置するかアセンブラで書くしかないのかな

17 :
>>16
最適化したらどうなる?

18 :
>>17
すでに最適化(/O2)はかけています。
このコードではiの範囲とsetbitを指すポインタの有無を
コンパイラが分からない事が原因なのではと考えています。
ちょっと逆アセも確認してきます。

19 :
逆アセでもほぼ同様でした。
(インライン展開された関係でレジスタが変わっただけ)

20 :
Compiler Intrinsicsって割りと腐ってるのな

21 :
__int64 setbit;
setbit = 1ull << i;
だと
mov ecx, r8d
mov edx, 1
shl rdx, cl
になるのでとりあえずシフトを使うコードにしておいて
別の場所の最適化をしときます

22 :
C言語でstaticを関数に付けると外部のファイルから参照できないということですが
他にも何かの効果があった気がします。
以下のような効果があるかどうか教えてください。
・関数のアドレスが固定になる?ので関数呼び出しが高速化される
・関数内の自動変数も固定アドレスになる?(int a;がstatic int a;になる?)
以上について教えてください。

23 :
>>22
関数の所在は元々固定的なので、呼び出しが高速になるわけではありません。
但し、コンパイラによっては静的関数のみ、インライン展開するので効果がないというわけでもありません。
また、自動変数は意味的に呼び出しごとに別のものでなければならないので静的関数ないであろうと静的にはなりません。

24 :
簡潔でわかりやすい回答ありがとうございます

25 :
PeekMessageで自分で選んだメッセージだけ処理したいのですが
PeekMessageを呼んだときに、他のウィンドウのWNDPROCも
呼ばれてしまうようです。
他のウィンドウや他のメッセージを全く処理したくないわけではないので
他のウィンドウのWNDPROCを何もせずに抜けるのはNGです。
キー・マウスやペイントを優先的に処理したいだけです。
他のウィンドウのWNDPROCを呼ばずに自分の選んだメッセージだけ
処理する方法はありませんか?
Windows XP、Visual C++ 2010 Expressです。

26 :
>>25
ttp://msdn.microsoft.com/ja-jp/library/cc410948.aspx
他のウィンドウのWNDPROCも呼ばれてしまうようです。の意味がわからない
PeekMessageはあくまでスレッドに関連付けられたメッセージキューからメッセージを取ってくるだけ
メッセージのディスパッチはしない

27 :
0: hoge.dll!WndProc(HWND__ * hwnd, unsigned int msg, unsigned int wparam, long lparam) 行 181 + 0x1c バイト C++
1: user32.dll!77cf8734()
2: user32.dll!77cf8816()
3: user32.dll!77d08ea0()
4: user32.dll!77d08eec()
5: ntdll.dll!7c94e473()
6: user32.dll!77cf93e9()
7: user32.dll!77cf93a8()
8: user32.dll!77cf9402()
9: hoge.dll!DoEvent(unsigned int wMsgFilterMin, unsigned int wMsgFilterMax) 行 17 + 0x1d バイト C++
10: hoge.dll!WndProc(HWND__ * hwnd, unsigned int msg, unsigned int wparam, long lparam) 行 181 + 0x1c バイト C++
11:…
DoEventはPeek/Translate/Dispatchする関数ですが、コールスタックはPeekMessageの行になっています。
ただし、PeekMessageには10:WndProcのHWNDとは別のHWNDを渡しています。
PeekMessageの中でごちゃごちゃ回って、0:WndProcにたどり着いています。
0:WndProcのHWNDは10:WndProcと同じハンドルです。
「PeekMessage 関数を呼び出すと、呼び出し側スレッドが所有しているウィンドウへ送信されたメッセージのうち、保留されていたものを取得できます。
SendMessage、SendMessageCallback、SendMessageTimeout、SendNotifyMessage の各関数を使って送信されたメッセージが、これに該当します。
システムは、内部イベントを処理することもあります。メッセージは、次の順序で処理されます。」
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
これでしょうか?

28 :
スレを勃てる必要のある、低俗でないC/C++の質問って例えばどんなのですか?

29 :
最新の規格に関する質問

30 :
>>28
最新の規格に関する質問
C++11/C++1y 15
http://toro.2ch.net/test/read.cgi/tech/1333433900

31 :
>>28
【C++】高速化手法【SSE】
http://toro.2ch.net/test/read.cgi/tech/1130349336/

32 :
unsigned long length = 100000;
char *buff
buff = (char*)malloc(sizeof(char) * length);
strcpy_s(buff, length, ...);

としたい場合strcpy_sの第2引数がsize_t(unsigned int)を超えてしまうんですけど
この場合どうすればいいですか?

33 :
別に超えないけど

34 :
符号無しintは0〜65535だろ

35 :
>>34
32ビットなら0〜4,294,967,295

36 :
そうだったんですね
言い方を変えます
もしstrcpy_sの第2引数(文字列操作関数の文字数を渡す部分)が
受け取る型以上の数値を渡したい場合対応する関数って何ですか?

37 :
キャスト以外の方法聞いてんのか?
その場合32bit以上コピーしようとしてることになるってのは理解できるか?

38 :
>>36
strcpy_sの第2引数ってバッファのサイズで、size_tだったと思うけど
この型で表現できるサイズより大きいメモリは確保できないから考えるだけ無駄だと思うけど

39 :
>>37
理解できます
32bit以上の文字数を扱う場合も書いた方が安全なのかって考えすぎてました
>>38
メモリ確保できないなら詰みなので考えないようにします
ありがとうございました

40 :
Visual C++ 2010 Expressで質問です。
メンバイニシャライザで、包含しているインスタンスのメンバ変数も
初期化できますか?
error C2059: 構文エラー : '.'というエラーが出てしまいます。

41 :
無理

42 :
まじですか…ションボリ

43 :
インスタンスって参照渡しすれば使いまわせますか?

44 :
あんたの気持ちしだいだな
高潔な魂をもった人間なら使いまわせる

45 :
delete this; するまでは生きてるんじゃね

46 :
はぁ、そうですか
ありがとうございました

47 :
C言語の勉強をしているのですが、タイマーを使ったプログラムの仕組みというか概念がよくわかりません。
抽象的な質問で申し訳ないですが、わかりやすく説明して頂けないでしょうか。

48 :
もう少しわかりやすく質問文を変更して欲しい

49 :
>>47
イベントドリブン形式のプログラムを書いてみるとわかるよ

50 :
>>47
割り込み を検索すればいい。

51 :
>>47
定期的に関数を呼び出してもらうための仕組み

52 :
C++で質問です。
class A;
class B;
class C;
があって、class AはpublicデータメンバとしてB obj1;を持っています。
各クラスは.cppと.hで書かれています。
class Cのメンバ関数内でobj1のpublicなメンバ関数を実行しようとすると
>error C2065: 'obj1' : 定義されていない識別子です。
というエラーが出るのですが、どこが間違っているのでしょうか
インクルードは問題無いです…

53 :
書き忘れました、クラスの前方宣言もしています

54 :
ttp://ideone.com/oDblr
もっと詳しく書かないと
何が問題になってるのかわからんぞ

55 :
>>54さんありがとうございます
>a.obj1.funcB();

obj1.funcB();
としていたみたいです。

56 :
あぁ、ドット演算子じゃなくてアロー演算子の方なのですが
a->obj1.->uncB();
としてもエラーでした
error C2065: 'obj1' : 定義されていない識別子です。
error C2227: '->funcB()' : 左側がクラス、構造体、共用体、ジェネリック型へのポインターではありません。
となります。

57 :
>>56
ttp://ideone.com/rRd0H
前方宣言だけでそのクラスのメンバ変数を使おうとしてないか?

58 :
C# expressを使用しています
フォームにTopMost=Trueを設定し、最前面に表示させながらフォームは決して
アクティブウィンドウにならないようにしたいのですが、どのような方法がスマートなのでしょうか?
マウスクリックは透過させているのですが、フォームの位置やサイズを変更すると
勝手にアクティブになってしまい困っています

59 :
ふらっとVisual C#,C♯,C#(初心者用) Part98
http://toro.2ch.net/test/read.cgi/tech/1349163087/

60 :
誘導ありがとうございます♪

61 :
質問です
std::wstring型の文字列(reserve済)に、1文字だけ追加したい場合、
最も高速と思われる関数はどういったものになりますでしょうか。
wstr.append()では、wchar_t型の文字入力は受け入れてくれないようなので…。
おねがいします。

62 :
pushbackがあったんですね。
解決しました。失礼しました。

63 :
windowsで連続したメモリを確保するには、どの関数を使うのが一番なのでしょうか?

64 :
virtualalloc

65 :
>>64
ありがとう

66 :
知恵を貸してください。
gccとmakeで開発しています。C++でなくCの範囲での開発です。
適切な値が設定されないまま、関数ポインタによる呼び出しが行われてしまうのを
回避する方法を探しています。
以下に例を示します。

67 :
struct handlers {
 void (*handler_1)(int);
 void (*handler_2)(int, char);
 // ここに追加(1)
};
int main()
{
 struct handlers obj[10];
 //何らかの構造体メンバ初期化←ここの修正をし忘れる
 (*obj.handler_1[10])(0);
 (*obj.handler_2[10])(0, '1');
 // ここに追加(2)
}

68 :
問題は、handlers構造体の仕様を変更、特にメンバを追加したときです。
上記のソースコードに、(1)構造体宣言にメンバ(関数ポインタ型)を追加し、
(2)main()内に呼び出し文を追加、
するところまでは良いのですが、ここでプログラマがミスをして、
新たに追加されたメンバを初期化するコードを書き忘れたとします。
コンパイルは成功してしまい、プログラム実行時に異常が発生してしまいます。
追加メンバ分の初期化コードの書き忘れを、C言語の範囲内で、
コンパイラのエラーや警告で検出する方法はないものでしょうか?
ただし、プログラム実行時のチェックによる方法は不可とします。

69 :
長くてごめんなさい。
失敗例1
「;」をパラメータとするマクロを使ってhandlers構造体を宣言し、同じマクロで
「,」をパラメータにして、メンバ初期化関数の引数リストの部分を作れないかと
思いましたが、「,」をマクロのパラメータにできず断念。
失敗例2
メンバ初期化のための原型となるhandlers変数を1個用意して、
構造体初期化子{}を使って初期化する方法。
[{}内の項目の個数]より[構造体メンバの数]のほうが多くてもコンパイルエラーになってくれないのでNG。

70 :
補足です。
例題のソースコードでmain()内の呼び出し部分の配列添え字がおかしくなってます。
すみませんです。

71 :
最近入門してロベールの本読み終えたんだけど
テンプレートとかboostとか駆使したり、コードインジェクトとかいう謎の技術でDirectXをハックしているソース見てしまって
底の深さに愕然としてしまった
こういうバッドノウハウ的なものや、boost、C++11などの最新技術をスマートに学ぶにはどうしたらいいかね
おすすめのソースとか書籍あったら紹介してもらえると嬉しい

72 :
java屋さんの自分は、thisが大好きです。
C++でもjavaのようにthis使っていいですか?

73 :
>>72
Javaと違ってC++はポインタなんでそこだけ注意

74 :
C++の勉強の最初の一冊はロベールとC++プログラミング入門(オライリー)のどっちが

75 :
C初心者の低俗な質問ですみません。
/* foo /* bar */ baz */ のようなコメントのネストが許されない
仕様になっているのはなぜなんでしょうか。
Cコンパイラがforやifブロックのネストを解釈できるのなら /* 〜 */ のネストだって
理解可能だと思うんですが、コンパイラが混乱することでもあるんでしょうか。

76 :
>>75
http://www.kouno.jp/home/c_faq/c20.html#20
> Cのコメントが入れ子にできないのは、PL/Iのコメントが入れ子にで きないからである。CはPL/Iからコメントについてのアイデアを借用 している。
PL/Iのコメントがネストできない理由は知らん。

77 :
/* を含む文字をコメントに入れられないから・・・と言いたいけど
*/ を含めない問題は放置なので多分関係ない

78 :
>>77
単に、処理がちょい面倒で、そんなに必要性を感じなかっただけでしょ。

79 :
まあ手抜きだな

80 :
そのせいで#if 0の方を多用しちゃう

81 :
範囲が広い場合は#if 0しかもう使わないな

82 :
逆にもし/* 〜 */ のネストが許される仕様だとコンパイラが処理(判断)に困る。。。
そんな記述の具体例ってあるでしょうかね。
自分はまったく思いつかないのですが。。。
ところで本当をいいますと、今私が使っているのはMQLって言語でして、仕様的にほとんどC言語なんですが
#ifや#ifdef系のプリプロセッサが一切ないんで、上記のワザが使えないんです。
そのくせにコメントがネストできないという負の遺産(?)はシッカリ受け継いでいるんです(>。<)

83 :
>>82
別にないでしょ、あなたの言う通りforやifブロックのネストを解釈できるのなら
/* 〜 */ のネストだって理解可能だと思うよ
本当にほんのちょっとだけコンパイラ(プリプロセッサか)の処理が面倒なだけで
たまたま不便な仕様だったと諦めるしかないね

84 :
一行コメントがあるなら、全部一行コメントでコメントアウトしてしまう手はある
エディタにその機能がなければ、マクロで機能追加したり

85 :
みなさん、レス感謝します。
ちなみに自分がやっているのは、if条件の一部を一時的に殺してテスト

if( /* a>b && */ c>d ) {
 if( /* e>f && */ g>h ) {
  if( /* i>j || */ k>l ) {

さらにこのif前後の処理ブロックをまとめて一時的にコメント・アウトしてテストするってことです。
行頭//は使えますが、まとめる行数が多いので、入れ子状態で大域を/* */で括れると便利なこと
この上ないんです。
でもありがとうございました。

86 :
フラグ使うと動作に影響するしねえ
ま、しゃーないんじゃない

87 :
組込みで開発環境してエラーだらけになったと思ったら、
/**/ネストできるコンパイラだった・・・

88 :
たまにそういう処理系あるよね

89 :
>>85
>さらにこのif前後の処理ブロックをまとめて一時的にコメント・アウトしてテストするってことです。
こっちは #if 0 とかで良いんじゃないの?

90 :
>#ifや#ifdef系のプリプロセッサが一切ないんで、上記のワザが使えないんです。

91 :
プリプロセッサが無いっての

92 :
行コメント使え
いちいち一行づつコメントアウトするのがめんどくさいとか言うのは無しな
そんなもん、エディタの設定(マクロとか)で、大抵なんとかなる
もしかして、行コメントもないのか?

93 :
行コメントも無いの?
俺はエディタのマクロとかで、選択行全部を行コメントアウト出来るようにしてるよ

94 :
お前ら>>85も読めよ・・・

95 :
私のせいでスレが荒れてしまったようですね。すみません。
コーディングのアイデアをお寄せいただけるのは有難いのですが、
私の質問は
・(コメントのネストを)どうやればいいのでしょうか?
ではなくて、
・(ネストできない仕様は)なぜなんでしょうか?
です。
実際は、コメントアウトしたい部分は関数の中だし、任意の文字列を埋め込みたいわけじゃないので
if(0) {

if( /* a>b && */ c>d ) {
 if( /* e>f && */ g>h ) {
  if( /* i>j || */ k>l ) {
   …
  }
 }
}

}
みたいにやって一時的に実行を迂回させてます。
ありがとうございました。

96 :
>>95
多分、解析できない記述が存在するからだと思う
/*
int a=1;
int *p=&a;
int b=2/*p;
*/

97 :
その例は「コメントが閉じられていない」と正しく解析できると思うけど

98 :
>>97
それは正しくない

99 :
そもそも外側のコメントがない状態で
コメントになってしまう問題のある記述じゃないのか?

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
[an error occurred while processing this directive]