スレを勃てるまでもないC/C++の質問はここで 21
枯れ木過ぎてこのまま落ちそうだな
びよーね・すっぽすっぽ先生を讃えるスレということで
コード -1073741819 で終了してしまう
くっそー
すいません。教えてください。
入力された引数をトークンに分解するプログラムなのですが、
#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に代入する事は可能なのでしょうか?
readcmdline()のargs自体は、main()のargsへのポインタが代入されているから
* args = ... で代入することは問題がないはず。
問題なのは、その行ではなくてその一つ前の行。
>>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はどこでもポインタとして宣言していないような気がするんですが...
>int readcmdline(FILE *i, FILE *o, char ***args)
ここに書いてるやん
typedef char ** charPtrPtr;とでもして、charPtrPtr * argsとでもしたらわかるかも知れない。
12 :
デフォルトの名無しさん:2012/07/23(月) 18:34:58.44
質問です。C++の設計者はどうしてあんなに分かりにくい仕様にしたんですか?
14 :
12:2012/07/24(火) 03:10:13.53
Cとの互換性の確保と、オブジェクト指向の概念の分かりにくさは、直接関係ないような気がしますが…。
実はオブジェクト指向ってしっくりこないんです!
質問ですが
__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の整数です。
放置するかアセンブラで書くしかないのかな
18 :
16:2012/07/24(火) 13:38:32.87
>>17 すでに最適化(/O2)はかけています。
このコードではiの範囲とsetbitを指すポインタの有無を
コンパイラが分からない事が原因なのではと考えています。
ちょっと逆アセも確認してきます。
19 :
16:2012/07/24(火) 13:47:24.27
逆アセでもほぼ同様でした。
(インライン展開された関係でレジスタが変わっただけ)
Compiler Intrinsicsって割りと腐ってるのな
21 :
16:2012/07/24(火) 22:21:23.72
__int64 setbit;
setbit = 1ull << i;
だと
mov ecx, r8d
mov edx, 1
shl rdx, cl
になるのでとりあえずシフトを使うコードにしておいて
別の場所の最適化をしときます
C言語でstaticを関数に付けると外部のファイルから参照できないということですが
他にも何かの効果があった気がします。
以下のような効果があるかどうか教えてください。
・関数のアドレスが固定になる?ので関数呼び出しが高速化される
・関数内の自動変数も固定アドレスになる?(int a;がstatic int a;になる?)
以上について教えてください。
>>22 関数の所在は元々固定的なので、呼び出しが高速になるわけではありません。
但し、コンパイラによっては静的関数のみ、インライン展開するので効果がないというわけでもありません。
また、自動変数は意味的に呼び出しごとに別のものでなければならないので静的関数ないであろうと静的にはなりません。
簡潔でわかりやすい回答ありがとうございます
PeekMessageで自分で選んだメッセージだけ処理したいのですが
PeekMessageを呼んだときに、他のウィンドウのWNDPROCも
呼ばれてしまうようです。
他のウィンドウや他のメッセージを全く処理したくないわけではないので
他のウィンドウのWNDPROCを何もせずに抜けるのはNGです。
キー・マウスやペイントを優先的に処理したいだけです。
他のウィンドウのWNDPROCを呼ばずに自分の選んだメッセージだけ
処理する方法はありませんか?
Windows XP、Visual C++ 2010 Expressです。
27 :
25:2012/08/06(月) 08:59:38.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 :
デフォルトの名無しさん:2012/08/29(水) 08:12:00.30
スレを勃てる必要のある、低俗でないC/C++の質問って例えばどんなのですか?
最新の規格に関する質問
unsigned long length = 100000;
char *buff
buff = (char*)malloc(sizeof(char) * length);
strcpy_s(buff, length, ...);
略
としたい場合strcpy_sの第2引数がsize_t(unsigned int)を超えてしまうんですけど
この場合どうすればいいですか?
別に超えないけど
符号無しintは0〜65535だろ
>>34 32ビットなら0〜4,294,967,295
そうだったんですね
言い方を変えます
もしstrcpy_sの第2引数(文字列操作関数の文字数を渡す部分)が
受け取る型以上の数値を渡したい場合対応する関数って何ですか?
キャスト以外の方法聞いてんのか?
その場合32bit以上コピーしようとしてることになるってのは理解できるか?
>>36 strcpy_sの第2引数ってバッファのサイズで、size_tだったと思うけど
この型で表現できるサイズより大きいメモリは確保できないから考えるだけ無駄だと思うけど
>>37 理解できます
32bit以上の文字数を扱う場合も書いた方が安全なのかって考えすぎてました
>>38 メモリ確保できないなら詰みなので考えないようにします
ありがとうございました
Visual C++ 2010 Expressで質問です。
メンバイニシャライザで、包含しているインスタンスのメンバ変数も
初期化できますか?
error C2059: 構文エラー : '.'というエラーが出てしまいます。
無理
まじですか…ションボリ
インスタンスって参照渡しすれば使いまわせますか?
あんたの気持ちしだいだな
高潔な魂をもった人間なら使いまわせる
delete this; するまでは生きてるんじゃね
はぁ、そうですか
ありがとうございました
C言語の勉強をしているのですが、タイマーを使ったプログラムの仕組みというか概念がよくわかりません。
抽象的な質問で申し訳ないですが、わかりやすく説明して頂けないでしょうか。
もう少しわかりやすく質問文を変更して欲しい
>>47 イベントドリブン形式のプログラムを書いてみるとわかるよ
>>47 定期的に関数を呼び出してもらうための仕組み
C++で質問です。
class A;
class B;
class C;
があって、class AはpublicデータメンバとしてB obj1;を持っています。
各クラスは.cppと.hで書かれています。
class Cのメンバ関数内でobj1のpublicなメンバ関数を実行しようとすると
>error C2065: 'obj1' : 定義されていない識別子です。
というエラーが出るのですが、どこが間違っているのでしょうか
インクルードは問題無いです…
53 :
52:2012/10/08(月) 11:05:11.57
書き忘れました、クラスの前方宣言もしています
>>54さんありがとうございます
>a.obj1.funcB();
を
obj1.funcB();
としていたみたいです。
あぁ、ドット演算子じゃなくてアロー演算子の方なのですが
a->obj1.->uncB();
としてもエラーでした
error C2065: 'obj1' : 定義されていない識別子です。
error C2227: '->funcB()' : 左側がクラス、構造体、共用体、ジェネリック型へのポインターではありません。
となります。
C# expressを使用しています
フォームにTopMost=Trueを設定し、最前面に表示させながらフォームは決して
アクティブウィンドウにならないようにしたいのですが、どのような方法がスマートなのでしょうか?
マウスクリックは透過させているのですが、フォームの位置やサイズを変更すると
勝手にアクティブになってしまい困っています
誘導ありがとうございます♪
質問です
std::wstring型の文字列(reserve済)に、1文字だけ追加したい場合、
最も高速と思われる関数はどういったものになりますでしょうか。
wstr.append()では、wchar_t型の文字入力は受け入れてくれないようなので…。
おねがいします。
62 :
61:2012/11/15(木) 04:29:35.78
pushbackがあったんですね。
解決しました。失礼しました。
windowsで連続したメモリを確保するには、どの関数を使うのが一番なのでしょうか?
virtualalloc
知恵を貸してください。
gccとmakeで開発しています。C++でなくCの範囲での開発です。
適切な値が設定されないまま、関数ポインタによる呼び出しが行われてしまうのを
回避する方法を探しています。
以下に例を示します。
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)
}
問題は、handlers構造体の仕様を変更、特にメンバを追加したときです。
上記のソースコードに、(1)構造体宣言にメンバ(関数ポインタ型)を追加し、
(2)main()内に呼び出し文を追加、
するところまでは良いのですが、ここでプログラマがミスをして、
新たに追加されたメンバを初期化するコードを書き忘れたとします。
コンパイルは成功してしまい、プログラム実行時に異常が発生してしまいます。
追加メンバ分の初期化コードの書き忘れを、C言語の範囲内で、
コンパイラのエラーや警告で検出する方法はないものでしょうか?
ただし、プログラム実行時のチェックによる方法は不可とします。
長くてごめんなさい。
失敗例1
「;」をパラメータとするマクロを使ってhandlers構造体を宣言し、同じマクロで
「,」をパラメータにして、メンバ初期化関数の引数リストの部分を作れないかと
思いましたが、「,」をマクロのパラメータにできず断念。
失敗例2
メンバ初期化のための原型となるhandlers変数を1個用意して、
構造体初期化子{}を使って初期化する方法。
[{}内の項目の個数]より[構造体メンバの数]のほうが多くてもコンパイルエラーになってくれないのでNG。
70 :
66:2012/12/01(土) 15:01:37.74
補足です。
例題のソースコードでmain()内の呼び出し部分の配列添え字がおかしくなってます。
すみませんです。
最近入門してロベールの本読み終えたんだけど
テンプレートとかboostとか駆使したり、コードインジェクトとかいう謎の技術でDirectXをハックしているソース見てしまって
底の深さに愕然としてしまった
こういうバッドノウハウ的なものや、boost、C++11などの最新技術をスマートに学ぶにはどうしたらいいかね
おすすめのソースとか書籍あったら紹介してもらえると嬉しい
java屋さんの自分は、thisが大好きです。
C++でもjavaのようにthis使っていいですか?
>>72 Javaと違ってC++はポインタなんでそこだけ注意
C++の勉強の最初の一冊はロベールとC++プログラミング入門(オライリー)のどっちが
C初心者の低俗な質問ですみません。
/* foo /* bar */ baz */ のようなコメントのネストが許されない
仕様になっているのはなぜなんでしょうか。
Cコンパイラがforやifブロックのネストを解釈できるのなら /* 〜 */ のネストだって
理解可能だと思うんですが、コンパイラが混乱することでもあるんでしょうか。
/* を含む文字をコメントに入れられないから・・・と言いたいけど
*/ を含めない問題は放置なので多分関係ない
>>77 単に、処理がちょい面倒で、そんなに必要性を感じなかっただけでしょ。
まあ手抜きだな
そのせいで#if 0の方を多用しちゃう
範囲が広い場合は#if 0しかもう使わないな
逆にもし/* 〜 */ のネストが許される仕様だとコンパイラが処理(判断)に困る。。。
そんな記述の具体例ってあるでしょうかね。
自分はまったく思いつかないのですが。。。
ところで本当をいいますと、今私が使っているのはMQLって言語でして、仕様的にほとんどC言語なんですが
#ifや#ifdef系のプリプロセッサが一切ないんで、上記のワザが使えないんです。
そのくせにコメントがネストできないという負の遺産(?)はシッカリ受け継いでいるんです(>。<)
>>82 別にないでしょ、あなたの言う通りforやifブロックのネストを解釈できるのなら
/* 〜 */ のネストだって理解可能だと思うよ
本当にほんのちょっとだけコンパイラ(プリプロセッサか)の処理が面倒なだけで
たまたま不便な仕様だったと諦めるしかないね
一行コメントがあるなら、全部一行コメントでコメントアウトしてしまう手はある
エディタにその機能がなければ、マクロで機能追加したり
85 :
82:2013/02/04(月) 00:49:43.20
みなさん、レス感謝します。
ちなみに自分がやっているのは、if条件の一部を一時的に殺してテスト
…
if( /* a>b && */ c>d ) {
if( /* e>f && */ g>h ) {
if( /* i>j || */ k>l ) {
…
さらにこのif前後の処理ブロックをまとめて一時的にコメント・アウトしてテストするってことです。
行頭//は使えますが、まとめる行数が多いので、入れ子状態で大域を/* */で括れると便利なこと
この上ないんです。
でもありがとうございました。
フラグ使うと動作に影響するしねえ
ま、しゃーないんじゃない
組込みで開発環境してエラーだらけになったと思ったら、
/**/ネストできるコンパイラだった・・・
たまにそういう処理系あるよね
>>85 >さらにこのif前後の処理ブロックをまとめて一時的にコメント・アウトしてテストするってことです。
こっちは #if 0 とかで良いんじゃないの?
>#ifや#ifdef系のプリプロセッサが一切ないんで、上記のワザが使えないんです。
プリプロセッサが無いっての
行コメント使え
いちいち一行づつコメントアウトするのがめんどくさいとか言うのは無しな
そんなもん、エディタの設定(マクロとか)で、大抵なんとかなる
もしかして、行コメントもないのか?
行コメントも無いの?
俺はエディタのマクロとかで、選択行全部を行コメントアウト出来るようにしてるよ
95 :
85:2013/02/05(火) 09:14:07.22
私のせいでスレが荒れてしまったようですね。すみません。
コーディングのアイデアをお寄せいただけるのは有難いのですが、
私の質問は
・(コメントのネストを)どうやればいいのでしょうか?
ではなくて、
・(ネストできない仕様は)なぜなんでしょうか?
です。
実際は、コメントアウトしたい部分は関数の中だし、任意の文字列を埋め込みたいわけじゃないので
if(0) {
…
if( /* a>b && */ c>d ) {
if( /* e>f && */ g>h ) {
if( /* i>j || */ k>l ) {
…
}
}
}
…
}
みたいにやって一時的に実行を迂回させてます。
ありがとうございました。
>>95 多分、解析できない記述が存在するからだと思う
/*
int a=1;
int *p=&a;
int b=2/*p;
*/
その例は「コメントが閉じられていない」と正しく解析できると思うけど
そもそも外側のコメントがない状態で
コメントになってしまう問題のある記述じゃないのか?
だからこそ
>>97が正しいと思うんだけど
そうじゃないらしいな
みんな分かってるようだが俺には96が何をいいたいのかさっぱりわからん
b = 2 / (*p);
2 / 1なのかコメント最初の/*なのか
じゃないのか?
そう言いたいんだろうってのは伝わるがコメント開始なのが明白だからな・・・
107 :
106:2013/02/05(火) 23:04:10.76
途中送信してしまった。
そもそも式がどうとか解釈する前にプリプロセッサがコメントを除去するんだから
>>102みたいな曖昧性は生じないんじゃないの。
その除去でプログラマが意図しないコメント解釈されたらどうなるか
ネスト出来ない仕様 → コメントを外すと問題が起こる
ネスト出来る仕様 → コメントを外しても外さなくても問題が起こる
どちらにせよ問題があるので
無関係としか言いようが無い
2/*pの/*をコメント開始と捉えて、コメント閉じられてないからってコンパイルできなくなるのはCの規格上どうなの?
そもそも演算子をあまりくっ付けて書くべきではないってこった
字句解析的な意味で
いずれにしても混乱が起こる事がわかっているのなら、わざわざ複雑な機能はいれないだろ
費用対効果悪すぎって判断じゃね?
って言うか、D&E読む限り、行コメントの方を推奨している模様
一方D言語はネスト可能な /+ +/ を導入した
ソースにインベーダーの敵が侵入するわけか
なるほど、除算ポインタ演算子か(なんて言うんだっけ?*pの演算子)
>>110 規格上は問題なくて、単にコンパイラの不備だとおもう
ソースを読み終えた時点で「/*」に対する「*/」が見つからなければ、除算演算子とポインタ演算子の組み合わせって判断できるからね
つまり何重の入れ子コメントになっていても、一番外側の「/*」「*/」ペアが成立する限り
その中身を読み飛ばせばいいだけ。入れ子コメントの実装は可能
ちなみに入れ子コメントに意味があるか、を問題にするのはナンセンス
正しく構文が解釈できる限り、プログラマに対する制限は緩い方向(自由度が高い方向)へ仕様設計すべきだからね
メモリーやディスク容量、コンパイル時間等によって制限されるなら仕方ないと言えるが
117 :
116:2013/02/06(水) 11:05:32.14
すまん、訂正させて欲しい
誤> 規格上は問題なくて、単にコンパイラの不備だとおもう
正> 規格には問題ないのにエラーとして処理するのはコンパイラの不備だとおもう
トークン分割の妨げにならなければ空白の数は無視するんだっけ?? ※文字列中は例外だけど。
int x[2]={1,10};
int *i;
↑だとエラーが出ないのに
↓だとエラーが出ます
int x[2];
x[0] = 1;
x[1] = 10;
int *i;
error C2143: 構文エラー : ';' が '型' の前にありません。
何故こうなるのか分かりません・・・
>>119 C89規格でコンパイルしているからでしょう
int x[2];
int *i;
x[0] = 1;
x[1] = 10;
としたら大丈夫。
変数の宣言がブロックの先頭になければならない。
C++なら通るな
Cは変数宣言をブロックの先頭でしないといけないからこうだろ
int x[2];
int *i;
x[0] = 1;
x[1] = 10;
おっとリロードしてなかった、すまん
>>116 じゃあさ、やってみてよ。
gccならオープンなんだからさ。
口だけなら、誰でも言えるんだよなー。
>>116 アホか
コメントはコンパイラじゃなくプリプロセッサが処理するんだよ
演算子なんて解析しねーよ
そうか!わかった!!
ifはコンパイラが処理するからネストできるけど
コメントはプリプロセッサが処理するからネストできない
ってことですね!
>>127 わざわざありがとうございます!
コメントと間違うから/と*は離して書きましょう
ってことですね!
じゃあ 結局 コメントがネストできない理由ってなんすかねー Orz
昔の人がそう決めたから。それ以上でも以下でもない
なぜ昔の人がそう決めたかと気になるかもしれないが、たいてい当時の技術的には難しかったとかそんなもんさ
if/for → ネストできる
/* */ → ネストできない
両者を分かつ技術的困難が何なのか興味あるな。
カーニハンの存命中に尋ねてみたい。
そうそう
わざわざサポートするメリットが無いとか、どうせそんな理由だよ
そもそも、コメントはネストさせるようなものでは無いし
デバッグで一時的に〜とかは、本来の使い方ではないわな
>>130 コメントをコンパイルするとか、空間的にも時間的にも、ムダばかりでメリットがない
本当にコメントを書く事しか頭に無かったんだろうな
コメントアウトは考慮外というか
技術的な困難といえば、構文解析だろな
C++でもあったろ?テンプレート書くときの括弧が場合によって演算子に判断されるようなの
それが昨今の構文解析技術の進歩で解消されたあれ
技術の進歩というか
単にそういう仕様変更をしただけというか
>>132 >コメントをコンパイルするとか、
誰もそんなことは言ってないが?
プリプロセスでもなんでもいいから
とにかく処理したくないってことだろう
昔はコンパイル凄く遅かったから
コメントアウトするくらいなら削除したんだろうよ
ただの歴史的な理由以外に特に理由は無い
>>137 これは一理あると思う。
そうでなくともifブロックやforループの解析で
どこまでソースを読み込まなくちゃならないかわからないのに
コメントごとき(笑)でワーキングメモリを消費したくないとか。
そりゃコメントネストの方が優先順位が低いわな。
「あん時 研究所にあったマシンがPDPじゃなくてVAXだったら
ワシらもちゃんと実装しておったよ」とかw
蒸し返して悪いんだが、仕様上は/(除算)の後にスペースを入れるように規定されてるって理解すればいいのかな
今まで""の中以外ではスペースは入れても入れなくてもどちらでもいいと思っていたからこれは盲点(不勉強)だった
b=2/*p; b=2 / *p;
スペースを入れるように規定されているというか、
スペースを入れないとコメントになってしまうように規定されているんだよ
>>142 そのとおり。
JIS X 3010で「文字の並び/*は注釈の始まりを示す」
と規定されているよ(6.4.9) だからb=2/*p;をb=2/(*p);とは解釈しない。
116の間違いはこの点にあるとおもう。
除算を意図しても構文が【規格上間違っている】のだ。
これはコンパイラ(プリプロセッサを含む)のインプリの話ではなく
C言語規格の問題だ。125の揚げ足取りでは何の反論にもなっていない。
116の言う「コンパイラの不備」ではなく、規格に反した記述だったから
エラーではじかれたわけだね。
ネスティングができない理由は、当時の計算機リソースだとコンパイラ
(プリプロセッサを含む)のインプリが楽だったから…
くらいじゃないのかな。(←これはオレの想像)
あの世から「だから#ifとか用意してやってるのに 最近の若いモンは!」みたく言われちゃいそうw
#ifの方がparseしやすいってことなのか
2GBくらいまではできるはずなのですが
callocで確保できるだけ確保したら1.6GBしか確保できません
メモリは1バイト確保しようとしたら8バイトに丸められると見たので
8の倍数から確保できなくなったらマイナス8して再度確保という感じでしています
for(unSize=262144; 8<=unSize; unSize-=8) {
do {
calloc(unSize, 1);
} while(確保できる間);
}
確保部分のソースとしてはこんな感じです
実際はリスト構造を使用してそこに確保したポインタを指定しています
リスト構造自体のサイズを考慮しても2GB - 1.6GBの400MBには達しないのですが
どうすればプロセス毎の最大値2GBまで確保できるようになりますか?
> 2GBくらいまではできるはず
ただの妄想だろ
環境くらい書け
環境
OS Vista Home 32bit
メモリ3GB
メモリクリーナーでは2GB超のメモリを空きメモリにできるのですが
その後
>>146を試しても1.6GBしか確保できません
仮想と物理をごっちゃにしてるような気がする... (´・ω・`)
連続した1.6GB超えの領域がないんだろ。
>>149 物理メモリ3GB
仮想メモリ4GB
です
>>150 1度に2GBを確保しようとしているのではなくて
>>146のソースで示した通り小分けにして確保しています
32bitならそういうもんなんじゃねーの
タスクマネージャでメモリサイズ見れば?
タスクマネージャのパフォーマンスタブの空きメモリがまだあっても
プロセスタブにあるメモリ列が1.6GBになると止まってしまいます
>>147 プロセス毎に動的確保できるのは2GBまで
VC++は16バイトなんて噂もあるから、一度16バイトで試してみればいいんじゃ
メモリ関連で思い出した
mallocで小分けにして物理メモリの空き領域以上を確保したら
それ以外の既存のデータがページファイルに追いやられるよね
これで一応メモリ掃除できたとか思ってたけど
見かけ上空きメモリが増えただけで
メモリクリーナーはまた別のやり方でメモリ空けてんの?
>>154 ならWindowsはそういうものなのかもね
>>157 メモリクリーナーも一緒(mallocじゃなくて別の関数かもしれんが)
ページファイルに追いやって、すぐ使える物理メモリを確保する
こういうもんだと納得するしかないんですね
ありがとうございました
mallocやcallocで確保した領域は
プログラム終了時に明示的にfreeするべきでしょうか。
それともやるだけムダでしょうか。
終了時まで確保しっぱなしなの?
使わなくなったタイミングで解放しないの?
>>161 基本的には適切なタイミングで解放しましょう
返事ありがとうございます。
大昔、fj.comp.lang.cでこの辺りが話題になったことがありまして
上でmallocの話が出て思い出しついでにちょっと尋ねてみました。
当時、malloc/callocがメモリを確保するヒープ領域は、プログラム(正確にはプロセスだったか?)終了後に
OSが解放するんだからfreeは不要だ!と主張する人がいたことを憶えています。
プログラムを"安全側"に設計することに嫌悪する人もいたり…
私もfreeするべきだと思います。
プログラムもOSも、それぞれが自分がやったことの後始末は、基本的に
自分の中で責任持って完結するべき、と思ってます。
OSがやってくれるからサボってていいや〜みたいな考え方だと
余計なトラブルを招きかねないですよね。まぁ安全側の考え方ですが。
つまらない話、すみませんでした。
宗教論争っぽくなるからな。。。
>>164 プログラム終了時にOSなりライブラリが自動で解放してくれるのが
保証されているなら、解放処理は書かなくてもいいだろうが、
解放処理が書かれていれば
「このコードを書いた人はメモリをちゃんと把握しているな」
という示しになる。
_beginthreadex(NULL, 0, fnFunction, NULL, 0, 0);
とする場合fnFunctionを変数参照で指定する場合は変数をどう定義したらいいですか?
イメージとしては
unsigned int *sum;
sum = fnFunction;
_beginthreadex(NULL, 0, sum, NULL, 0, 0);
としたいのですがパラメーターと互換性がありませんと出てしまいます
いま手元にコンパイラがないので想像ですが、宣言を
unsigned int (*sum)(void *);
でしてみたらどうでしょうか?
ありがとうございます
unsigned int (__stdcall *sum)(void*)
としたらいけました
でもなんか今まで書いた事のない書き方なので気持ち悪いです
もっとスマートな書き方は無さそうですし慣れるしかないんでしょうか
UINT (WINAPI *sum)(VOID*)
これくらいでしょうか
>>170 typedef unsigned int (*FUNCPTR) (void *);
FUNCPTR pf;
pf = func;
pf(…);
で良いんじゃないの
__stdcallはWin32APIの独自キーワードですが、それ以外は関数のポインタを
宣言する普通の(標準規格に沿ったの意)書き方です。
下段のように書き換えても本質は同じなんで、私はそんなにスマートさは感じませんけど。。。
173 :
172:2013/02/14(木) 18:07:12.62
そこらへんは個人の好みだろ
何回も書くなら
>>171みたいにしたらいいと思う
()の位置が気持ち悪いのはわかる
>>170 >今まで書いた事のない書き方なので気持ち悪いです
関数ポインタ宣言の基本型さえ押さえときゃ気持ち悪くならないよ。
関数の返却値の型 (*変数名)(引数の宣言);
※オレの流儀は sum = &fnFunction; だなぁ。ま、好みの問題だww
>>170 > でもなんか今まで書いた事のない書き方なので気持ち悪いです
関数ポインタの記述のしかたはCの中でも特例だから、
「そういうもんなんだ」と思う以外に選択肢は無い。
__stdcallとかの呼び出し規則は独自拡張だから
括弧の位置がコンパイラによって互換性なくていちいちtypedefしてた記憶がある
>>175 typedef struct hoge {
unsigned int (__stdcall sum)(void*)
};
って事?
hoge.sum hoge->sumができなくね?
>>178 ちょっと175との絡みがわからないけど、hogeはタグ名であって構造体変数じゃないからできないんじゃないの?
こういう事もできる
typedef unsigned int FUNC(void *);
FUNC* pf;
pf = func;
pf(…);
>>179 unsigned int _(_stdcall sum)(void*)とか
hoge.sum = &fnFunction
hoge->sum = &fnFunction
できないんじゃない?
182を読んでも178と181が何を言いたいのか良くわからんなぁ
そもそもなんで関数ポインタから関数の型の宣言に話がかわったんだ?
186 :
182:2013/02/15(金) 00:56:48.43
>>181 構造体のメンバに関数ポインタを持つことは可能
#include <stdio.h>
unsigned int MyFunc( char *buf )
{
puts(buf);
return 1;
}
int main(void)
{
struct _hoge {
unsigned int (*sum)(void *);
} hoge;
hoge.sum = &MyFunc;
(*hoge.sum)("hello, world");
return 0;
}
>>187 すまん。うかつだった orz
hoge.sum = &MyFunc; は hoge.sum = &MyFunc;
unsigned int (*sum)(void *);
hoge.sum = &MyFunc;
hoge.sum = MyFunc;
&があっても無くても同じ動作するのか
てっきり前者と後者で違うから
unsigned int (**sum)(void *);
hoge.sum = &MyFunc;
unsigned int (*sum)(void *);
hoge.sum = MyFunc;
こうしないといけないと思ってた
暗黙に、関数は関数ポインタに変換される。
暗黙に、関数ポインタは関数に変換される。
謎が消えたありがとう
昨日から何を聞きたかったのか、やっとわかった… (´・ω・`)
関数呼び出しや配列要素参照の定義って
無駄が多いように思うんだけど何か理由でもあるの?
関数呼び出し
関数(引数リスト) or 関数ポインタ(引数リスト)
配列要素参照
配列[インデックス] or ポインタ[インデックス]
関数が関数ポインタに暗黙に変換されるのなら
関数ポインタ(引数リスト)の定義1つで済む気がするのだが
関数と関数ポインタは違うだろう
関数ポインタ(引数リスト) の定義だけとする
式が必要な箇所で <値 or 括弧式> '(' の並びを見つけた時点で
関数呼び出しであるという判定を行ってパースするはずだけど、
ここでこの <値 or 括弧式> が関数ポインタに変換可能なら良いとすれば
関数も関数ポインタも両方受け付けられるのではなかろうか
有り体に言えば、関数名は、その関数本体のアドレス(ポインタ)を持つということじゃないですかね。
左辺値のまま呼び出しを行いたいのだろうか
関数ポインタに暗黙変換して右辺値になって何か不都合ある?
プログラム
グローバルに下記を設定しておく。
static int WIDTH=320,HEIGHT=240;
static array<bool,2>^ pixels_new=gcnew array<bool,2>(WIDTH+2,HEIGHT+2); //一回ごとの細線化結果を入れる
static array<bool,2>^ pixels_old=gcnew array<bool,2>(WIDTH+2,HEIGHT+2); //一回ごとの細線化対象を入れる
bool change_flag;
private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
Graphics^ g=e->Graphics;
int X0=10,Y0=10;
int X1=340,Y1=10;
int UPPER_LEFT=2,LOWER_RIGHT=6,UPPER_RIGHT=0,LOWER_LEFT=4;
Color color1;
int i,j;
Bitmap^ bmap_exp=gcnew Bitmap(WIDTH+2,HEIGHT+2); //拡張画像
Bitmap^ bmap_thin=gcnew Bitmap(WIDTH,HEIGHT); //最終線画化画像
とまだまだプログラムは続くのですが
「グローバルに下記を設定しておく。」とはどこからどこまでを設定すればいいのでしょうか
そんなの他人に分かるわけないだろ
自分で決めろよ
>>199 //homepage3.nifty.com/ishidate/vcpp10_g8/vcpp10_g8.htm
こちらのHPを見て勉強しているのですが理解ががが
203 :
デフォルトの名無しさん:2013/02/21(木) 09:55:39.62
GetDiskFreeSpaceExで空き容量を取得したいんですが
今後1000000TBのHDDが出たとして
正常な空き容量を返せますか?
この関数が返す戻り値が__int64のようなので
これの最大値までは大丈夫なのでしょうか?
それともOSで最大値が制限されてたりしますか?
__int64までなら大丈夫
C言語のキャストと、reinterpret_castで違いってあるのでしょうか?
あるよ
ないだろ
あれは目印だめの存在
const void* p;
(int*)p; // できる
reinterpret_cast<int*>(p); // できない
char c;
(double)c; // できる
reinterpret_cast<double>(c); // できない
>>208 おおお。有難うございます。
後者のはstatic_castなら大丈夫なんですね。勉強になりました。
間違った勉強の仕方をしても意味ないよ?
208が紛らわしいレスしてる責任があるけど
209が仕事で恥かいても俺は知らないけど
>>208のように嘘を教える者。嘘を信じる者がいるのが悲しいですね。
int&x=a;
static_cast<unsigned long>(x) = b;
の挙動を正確に説明できる奴なんて早々居ないんじゃね
aはなんなんだよ
C++の型キャストで一番安全そうに見えるstatic_castが実は一番危険
なんで釣堀になってんの
unsigned long型の右辺値にキャストして代入なんてできるの
ばかばっかかここ
ばかばーっか
ばかという奴がバカボンド
プリプロセッサの一部適用てなんか方法あったけ?
gcc E -DPAPAN_DNA=1 maman.c > okochan1.c
gcc E -DPAPAN_DNA=2 maman.c > okochan2.c
PAPAN_DNAの部分だけ展開するような
sed -e 's/PAPAN_DNA/1/'
unifdef
ある2つのライブラリがFuncを持ってて両方リンクしなきゃならない場合ってどうするんですか?
WindowsのDLLなら
LoadLibrary と GetProcAddress で
それぞれのDLLのFuncのアドレスを取得して
別々に使う。
>>224 linuxのsoなら
dlopen と dlsym で
それぞれのsoのFuncのアドレスを取得して別々に使う。
静的libなら。。。
ラッパーdll噛ませるしかないのかな
わざわざdl作らなくとも、ラッパー関数を作れば良いだけじゃないのか?
印刷設定の用紙サイズを変更するAPIがあったら教えてください
変更したらOS上で変更しない限り永続させたいです
お願いしますm(__)m
230 :
229:2013/03/05(火) 23:09:52.51
自己解決しました
231 :
229:2013/03/07(木) 12:55:47.88
と思ったけどやっぱり分かりません
232 :
デフォルトの名無しさん:2013/03/07(木) 18:35:00.59
233 :
デフォルトの名無しさん:2013/03/07(木) 19:21:59.71
回答できないならレスするなゴミ
ゴミ質問者にはゴミ回答者がよく似合う
236 :
デフォルトの名無しさん:2013/03/08(金) 22:11:25.08
アマゾンギフト10万円で死んでやるよ
238 :
デフォルトの名無しさん:2013/03/13(水) 00:19:54.91
どんだけぇ〜!
239 :
デフォルトの名無しさん:2013/03/13(水) 01:31:36.41
STLのstringについて質問です。
char型の非constアドレスを要求するCのライブラリ関数などに
このオブジェクトの持つバッファのアドレスを渡すにはどうしたらよいでしょうか。
data()のアドレスをキャストして無理やり渡してみたら書き込む事は出来たのですが、
保証されない動作になると思われるうえ、当然length()の値との整合性が取れなくなってます。
と書いたのを読み返してみたら、関数側がlengthの仕組みを認識出来ない以上無理な気がしてきた。
char型のバッファでワンクッション置くしか無いんでしょうか…
たぶんない
保証するよ
C++11から
そうだった失礼
>>241 なるほどresize()を使って帳尻を合わせておけばいいんですね
ありがとうございます
>>242 連続性が保証されていないバージョンがあったんですね
参考になります
>>245 C++03までは規格上は保証はされていないけど、
連続性の無い実装は1つも無いよ
だからこそC++11で保証するようになったんだし
>>247 他人任せの精神異常者はさっさと消えてください
249 :
デフォルトの名無しさん:2013/03/17(日) 21:20:02.22
VC++にてBluetooth通信するプログラムを作成しているのですが、
Bluetoothデバイスをサーチするときの
BLUETOOTH_DEVICE_SEARCH_PARAMSの設定を詳しく教えてください。
fReturnAuthenticated = 以前にペアリングしたことがある
fReturnRemembered = ペアリングしたことはないが、以前検索に引っかかったことがある?
fReturnConnected = 現在接続しているデバイス
fReturnUnknown = 一度もペアリングしたことのないデバイス
fIssueInquiry = ?
他のところも間違えていたら指摘お願いします
250 :
デフォルトの名無しさん:2013/03/17(日) 23:08:05.38
251 :
デフォルトの名無しさん:2013/03/18(月) 01:09:52.09
英語を勉強しるよ
すいません、教えてください。
#include <signal.h>
void (*signal(int signum, void (*handler)(int)))(int);
は
intを引数に取り、void型の戻り値を持つ
関数ポインタの宣言。
とは、違うんですよね?
どのように解釈するのでしょうか?
この宣言から
signal( SIGINT, SIG_IGN );
がコンパイルエラーにならない理由が良く分からないです。
>>253 signal()の戻り値は関数ポインタ。
第一引き数はint。
第二引き数は関数ポインタ。
SIG_IGNは関数ポインタのはず。
typedef void (*signal_handler)(int);
signal_handler signal(int signum, signal_handler handler);
こう解釈する
K&Rですら反省しているうんこ文法なのでそういうものだと思って覚えましょう
257 :
デフォルトの名無しさん:2013/03/31(日) 01:19:26.30
C言語初めて、2ヶ月程度の初心者です。
free関数に関する質問です、よろしくおねがいします。
free関数は、どうやって、どこまでのメモリを解放するか判定しているのでしょうか?
free関数にわたすのは、先頭のポインタですよね。終了点はどこから情報を得ているのでしょうか。
int* px;
px = (int *)malloc(sizeof(int) * 10);
という感じで、メモリを動的に確保した後に、
free(px);
で普通に解放。
しかし、ためしに、
px++; /*してから*/
free(px);
解放してみると、派手にエラーを吐いたので、
実行時の解放中に気づいた?ようです。
px++;
px--;
free(px);
だと正しく解放したようです。
よろしくおねがいします。
>>257 処理系依存の話になるが、
たいていはmallocが呼ばれたときに、ポインタからサイズが得られるように
構造体を使ったヒープや配列で管理している。
>>257 _msize(px);
でサイズ得られるから
内部で管理されてる事になるね
260 :
257:2013/03/31(日) 02:06:49.02
>>258 ありがとうございます。
別のところで、管理されているのですね。
ということは、
malloc() で動的に確保したメモリのポインタに
(別のアドレスを)再代入しない方がよさそうですね。
261 :
デフォルトの名無しさん:2013/03/31(日) 02:08:47.21
>>260 当たり前だろボンクラ
どんな本で勉強してんだパーかおめ
262 :
257:2013/03/31(日) 02:15:33.97
>>259 自分の環境では、
undefined reference to '_msize'
となりましたが、たしかに、環境によってはメモリサイズが得られるようですね。
ありがとうございます。
>>260 たぶん当たり前すぎて、書いてありませんでした。。(^^;)
>malloc() で動的に確保したメモリのポインタに
>(別のアドレスを)再代入しない方がよさそうですね。
これって行った場合、
プログラム終了時に一般的なOSならfreeされますよね?
C++でguiアプリ作りたいんだけどオススメの方法おしえて
C++/CLIでCLR
C++Builder
以前は、wxWidgetsをやってたひとが、最近は、FLTKをつかってるといってた
ええとQT?
Qtがいいの?
>>263 free()していないメモリブロックは、OSなりでよきに計らわれる。
なので、生存期間の短い大量のメモリを使用しないようなプログラムでは
ポインタ変数の使い回しによるfree()の省略はしばしば行なわれる。
freeしない派ってほんとうざいわ
free必須信者ってほんとうウザい。 死ねばいいのに
くだらん宗教論争する連中が一番ウザいです
freeしたいやつは自分が担当するソースだけしとけ
freeしたくないやつは自分が担当するソース以外はfree消すな
>>274 そのうちゴチャゴチャになって
freeしたメモリブロックをべつのソースモジュール内で再度freeしてしまう罠
初心者は、
if(ptr) {
free(ptr);
ptr = NULL;
}
みたいに書くといいよ。俺はしないけど
277 :
デフォルトの名無しさん:2013/04/03(水) 19:41:42.30
うわ、変になった。
if(ptr) {
free(ptr);
ptr = NULL;
}
if(ptr) って要るのか?
free(0);
はなにもしないことが保証されている。
ISO/IEC 9899:1999 7.20.3.2.2
void free(void *ptr);
If ptr is a null pointer, no action occurs.
フリー(無職)の俺も何もしない
ptrが指してるものがなにか別のポインタを持っていて、
それを先にfreeしてからptrをfreeするという手順を取るというときに
すでにptrがfreeされたものが与えられてしまってもぬるぽにならないように。
((man *)280)->deleteThis();
∧_∧
( ・∀・) | | ガガッ!
と ) | |
Y /ノ .人
/ ) .人 < >_∧∩
_/し' < >_∧∩`Д´)/
(_フ彡 V`Д´)/ / ←
>>282 / ←
>>284
>>282 malloc〜free malloc〜free と処理が分離されててptrを使い回すならわかるけど
malloc malloc 〜 free free みたいな状態でptrを使い回すってこと?
int i;
char **ptr;
ptr = malloc(sizeof(char*) * 5);
for(i=0;i<5;i++){
ptr[i] = malloc(sizeof(char) * _MAX_PATH);
}
for(i=0;i<5;i++){
free(ptr[i]);
}
free(ptr);
こういう事じゃないの
>>279 炎上学習法で得た知識はダメだな。www
未だに生きていてNULLをfreeしても良いとしていない規格がある。でも教えてやらない。www
>>289 そんなマイナーな環境があるんだ‥‥というか、それってシステムコールを直呼びしているだけの手抜きライブラリだねえ
ま、アロケータはmalloc()/free()といえどもラッピングして使うようにしているから、問題ないけどね、1callぶんだけ手数とスタックがちょびっとだけもったいないけどね、ま、ちょびっとだけど
291 :
デフォルトの名無しさん:2013/04/05(金) 08:30:49.23
>>290 > そんなマイナーな環境があるんだ
自分の知らない規格はマイナー wwww
炎上学習法にはのらない。教えてやらない。www
> それってシステムコールを直呼びしているだけの手抜きライブラリだねえ
システムコールを知らない事を自白しちまったな。wwww
死ねよクズ
春だねぇ
HAL
2013: A 2ch odyssey
規格?
規格と実装をごっちゃにしてないか
バカはほっとけよ
列挙型enumについて質問です。
// 向き
enum MUKI {EAST,SOUTH,WEST,NORTH}は実質MUKI {0,1,2,3}とのことですが、
MUKUI muki_states;
muki_states = 1;みたいな演算って可能でしょうか?
>>297 なんでやってみないの?
これからの人生、そういうスタンスで生きていくつもりなの?
言語が書いてないし、代入は演算じゃないし、自分で試さないのはなんで
人間の屑ばっかりのスレで役に立たねぇなぁ
キャストすりゃいいんだな、調べたら分かったわ
お前らは用済み
Yahoo知恵袋で聞いて来いよ
やさしく教えてくれんだろ
>>300 これからの人生、そういうスタンスで生きていくつもりなの?
enumで列挙宣言しておきながら敢えて整数値を代入する、その意図(理由)に興味があるな
調べてわかるなら最初からそうしろと
ま、釣り針だろうけど
>>305 なるほど
ファイルにはコード化されたMUKIデータが入っていてそれを読み込むんだね
読み込んだ後に
int muki_states;
if(muki_states==1)
より
MUKI muki_states;
if(muki_states==SOUTH)
のほうが分かりやすかろうと
なるほど、なるほど。ありがとう
ファイルから読み込むと普通は文字列になるんだけど、一旦intに変換してさらにenumにするの?
>>307 > ファイルから読み込むと普通は文字列になるんだけど、
それは作り方次第(というか読み方次第?)。たとえばfscanfという関数があってだな…
>>308 いきなりfscanfしちゃうの?
データの妥当性何かのチェックとかしない派?
>>308 おいおい
文字列として読み込んで、妥当性チェックした後に変換だろ
sscanfでもstrtolでもいいが、俺はあまりsscanf の優位性を感じない
現在の議論の本質と無関係なポイントで揚げ足をとりたければ勝手にどうぞ。
揚げ足というのは誰のどの点なんだ?
ファイルから読み込むと普通は文字列になるんだけど、…
ファイルから読み込むとき、普通は(まずは)文字列として読み込むんだけど、…
前と後では質問した人の知識背景がちがうよね
というのが揚げ足取り
まぁ質問していた無能はいなくなったからもういいんじゃね
>>313 fwrite,freadは場合によっては使うけど、まさかfscanfするなんて想像もしなかったからね
iostreamの拡張?てどうやるんですか?なんのためにやるんですか?
>>316 まぁ「ファイルから読み込むと文字列になるw」という誤解をとくための例ならべつにいいんじゃん?
#define EAST 0
#define SOUTH 1
...
にして
int muki_states としとけば muki_states=1 も muki_states=SOUTH も(*^ー゚)b
これじゃダメなん?て聞こうとしたけど、PCに戻ってみたら、すでに祭りは終わっていましたとさ (゜Д゜) メデタシ メデタシ
>>318 いや…
それの例にfscanfなんて出すから、余計におかしくなっていると言う話じゃね?
fscanf が読み込むのは紛れもない文字列だと言う事に気付いて無いんじゃないかな。
%dで読み取ってint変数に入れた値も文字列というのか?
>>322 それなら直接enum変数に読めばいいよね。
態々int変数経由するまでもなく。
>>322 ファイルには文字列で書いてあるだろう?
>>323 > それなら直接enum変数に読めばいいよね。
いや、だからさ。
intでもenumでもfloatでもいいんだよ。ファイルから読み込むと文字列になる、と考えてる人に対して
文字列型以外で読み込むこともできるよ、ていう例なんだろうから。
>>324 >ファイルには文字列で書いてあるだろう?
お前は帰っていいよw
>>325 君が言ってるのは多分俺のことだろうけど、俺も別にファイルを読むと必ず文字列になるなんて思ってないし、俺の他にも誰もそんな人いないから、見えない敵と戦う必要ないよ。
俺はただ単に、ファイルからデータを読み込む文脈で、int経由でenum変数に代入するなんてシチュエーションないだろって思っただけだから。
あのぉ… 皆さん オレの書き込み(319)はスルーですか… そうですか… (ノД`)
以下、無限ループ
一体何人が参加した議論だったんだろうな
カオスになっててワロタ
>>331 自演っぽいのもいるからユニーク・ビジター数は案外少ないかもな
fscanf()するとか言っちゃった奴が暴れただけ
>>330 >
>>328 > ん?
> その
>>307が俺なんだけど。
だから自分が
>>307 で書いた文章を深呼吸して落ち着いてからよく読め って意味じゃないの?
ファイルから読み込むと文字列になるって自分で書いてんじゃんw
>>335 落ち着いて読むも何も、俺がファイルを読んだら必ず文字列になるなんて思ってないから、見えない敵と戦わなくていいんだよってことで。
コンピューター言語をいじくる前に先に日本語の読み書きを勉強した方がいろいろと捗るとおもうぞ
ま、これが落としどころ、ということで
327はタイミングが悪かったね〜 これに懲りずに、またいらっしゃい
見苦しいわ。
匿名性の面白さが出たカオスっぷりだったね。
まぁ、楽しめたんじゃないの?
さっきから一生懸命に終わらそうとしている奴はなんなの
>>340 > さっきから一生懸命に終わらそうとしている奴はなんなの
自分に不利な議論の流れだから。当然しょっw
端から見てると、どいつが終わらせようとしているかもわからんぞ
面白そうな流れだったのにリアルタイムで参加できなくて残念ですw
>>319 #defineのアイデア
ソースの可読性という点においては大差なさそうだけど、
enum型には規定された値以外の使用(代入等)をコンパイル時にチェックできる、という利点がありますね。
なのでenumのほうが多少はメリットがあるんじゃないでしょうか。
(ご本人抜きにして部外者がプログラムの仕様を語っても仕方ないですが)
>>336 > 落ち着いて読むも何も、俺がファイルを読んだら必ず文字列になるなんて思ってないから、
最初に、ファイルから読み込むと普通は文字列になる、って自分で書いてますよねw
物忘れが激しいタイプ?揮発性メモリ?
荒れた原因を作った真犯人が、見えない敵と戦わなくていい、とか、ほとんど人事不省ですかねw
その上にデータの妥当性チェックに話をすり替えるから、ますます流れがおかしくなったんですね。
>>343 普通は文字列になるということは、文字列にならない場合もあるということ。
妥当性チェックの話は、それがfscanfを使ってはいけない理由だから。内容が保証されているバイナリデータをfreadで読み込む場合以外では、普通は文字列として読み込んで、パーズしてバリデーションだよね。
テキストはダメでバイナリなら中身が保証されてる(キリッ って決めつけちゃってるところが… ま、その何というか… ええ、アレ、ですわ
>>345 バイナリなら中身が保証されているなんて言ってないよ。
内容が保証されているバイナリデータなら、freadで読む場合もあるって書いてるでしょ。
それにテキストが駄目なんて書いてないし。
テキストファイルをfscanfで読むのが駄目だって書いてるだけだし。
ちゃんと読んでくれよ。
テキストファイルをfscanfで読むのがダメなんてことはない
内容が保証されているバイナリファイルをfreadしていいなら
内容が保証されているテキストファイルもfscanfしていいよね
これで最後。
fscanf()は、scanf()とよく似た致命的な欠陥があって、「完全に正しい」とは限らないテキストファイルの読み込みには向いてないの。
で、普通はどうするかというと、1行毎あるいはファイル全体を文字列として読み込んで、parseしてvalidationしてから変数に保存する。
それが安全なやり方。
350 :
229:2013/04/08(月) 13:55:01.80
freadにも致命的な欠陥があって、
「完全に正しい」とは限らないバイナリファイルの読み込みには向いてないな。
>>350 man freadして、向いてるか向いてないか自分で考えろ
意味の無いやり取りはもうやめてくれよ。
353 :
デフォルトの名無しさん:2013/04/08(月) 16:57:55.85
object->~object()で好きなタイミングでクラスのデストラクタを呼び出せることは知っているのですが…
Destroy(object);
みたいな感じでデストラクタを好きなタイミングで呼び出す関数を定義することってできますか?
既に上記のような関数が存在してればその関数でも構わないのですが…。
すみません…質問の仕方が悪かったですorz
一旦スルーしてください…。
delete this;
delete c++;
16ビトのサイズとか具体的に決まってる場合多いじゃないですか。ハイルの形式って。
そういうハイルを読み書きするときには決まったサイズを保存する型って
どうしたらいいですか。
16ビトてきまてるなら、16ビトの変数をよういすればいいじゃないかな
>>357 short [], usort [], int16_t []など
>>359 ありがとうございまする。
後ろについているカッコはなんですか?
shortはintより短いことを保証するに過ぎませんよね。
int16_tが正解ですか?
さようならば。
>>360 []は配列。
複数の連続した16ビットのデータを読み書きすると思って配列にしただけなので、そうでなければ無視してくれ。
int16_tってどう定義されているの?
typedef select<sizeof(int) == 2, int,
select<sizeof(char) == 2, char,
select<sizeof(short) == 2, short,
select<sizeof(long) == 2, long, void>::type>::type>::type>::type int16_t;
LONG_MAX >= 2^31-1 じゃなかったっけ?
unsigned
unsigned float
unsigned double
そしてこのように話が進むと、めんどくなって「じゃーint使うのやめてshortでいいわ」って
ことにしてしまいたくなる
しかしこれはint16_tの定義だからその場合は==1か!
脊髄反射はダメだなやっぱ
まあ sizeof(T)*CHAR_BIT==16 のようにビット数で比較したとしても
>>363 じゃ不十分なんだけどね
もう環境依存の予約語でいいよ
Cからポータビリティを捨てたらゴミしか残らん
ヘッダファイルとインクルード関係の使い方がよく分かりません。
cppに関数を継ぎ足すたびにhを編集して・・・とやっていけばいいのでしょうか。ものすごく間違えそうで危ない気がするのですが。
外に公開するものはヘッダに書く
はずかしいところはcppに書く
>>373 間違えるとコンパイラが教えてくれるから危ないことなど全くない
>>373 .hは目次、.cppは本文と思えば分かりやすいんじゃないかな。
先に.hを書いて、.cppは後で書く。
逆に.cppから書く俺みたいなのもいるがね
テストまでやってから公開って考え方
公開する .h は、設計段階で決定するから、
.cpp に合わせて .h を編集ってことはあまり無いなあ
いろいろ決めてから書く人はヘッダから、具体的に処理書いてって肉付けしてく人はソースから
書くんじゃない?
いきなりコード書きだすのは良くない。
趣味のプログラムなら勝手だが。
お前らビルドはいつするんだよ
ビルドすること無しに.cppを書き続けるのか?
慣れてくるとビルドはたまにしかしないな
週一とか
コード書くの遅すぎ
最近はビルドが早いからな。
ビルドエラーや実行時エラーに頼ったコーディングスタイル、
設計や机上デバッグを軽視している輩が増えているような
気がする。
開発中は、基本今変更したファイルのみコンパイル対象になるから
もうずっと前からビルド時間なんて気にならなかったが
組み込みで特に小さいチップだと、EEPROM書き換え回数に制限があって
もったいないので無闇にビルド→書き換えをしないよう設計と机上デバッグを煮詰める。
>>386 組み込みのこと全然知らないんだけど、書き込みせずにテストは出来ないの?
フラッシュメモリも内容の保持保証が約10年だとは割りと知られてないようだな
SDカードに入れたデジカメの画像は大切ならBD-REに焼いとけよ
ROMと言えば。。。 (  ̄ー ̄)y-~~
「ROMだってランダムアクセスできるんだから、そういう意味ではRAMじゃないの?」
とのたまう、素直で内気な少年でした… 今から○十年前の話です。
>>389 その頃から既に屁理屈っぽい萌芽が育ち始めていたんだろうね
>>387 環境によるんじゃね?
だからこそ、環境がどうであろうが実施できる机上デバッグなんだと思う
390は技術屋には向かないな
>>393 >
>>389 > 律儀に RWM とか書いてたな…
初めて知ったけど、これってなんて読むの?リウォム?リワォム?
記憶があやふやだけど、素直に「アールダブルエム」とか言ってたような気がする。
「ロム」みたいな言い方ができなかったのも、流行らなかった理由かも。
398 :
396:2013/05/08(水) 00:18:54.08
>>397 たしかに、こりゃ一文字ずつ読むしかないですよねw レス、ありがとう!
なんとなく WORM (Write Once, Read Many)を思い出すなぁ。。。
名前のみが重要な#defineは全部enumでまとめた法が良いの?
ちょっとなにいっているかわかんない
つまりだな
識別子(?)として「RED」「GREEN」「BLUE」を使いたい。割り当てられる値はどうでもいいって時に
#define RED 1
#define GREEN 2
#define BLUE 3
とするより、
enum color { RED , GREEN , BLUE };
した方がいいか、って質問だろ?
答えはYES。
使い方によるがenumなら値の妥当性チェックをしてくれるから。
402 :
401:2013/05/08(水) 20:22:02.07
しまった!揚げ足とられる前に訂正しておくわ
#define RED 0
#define GREEN 1
#define BLUE 2
に差し替えてくれ
差し替えの意図がわからん。
>>401 それよりもスコープの問題の方がでかいね
405 :
399:2013/05/08(水) 21:45:52.70
>>401 ありがと
そう言いたかった
#defineは全部enumに直すよ
> enumなら値の妥当性チェックをしてくれる
どういうこと?
typedefしたときの話だろ
typedefにそんな機能ないだろ
>>408 馬鹿か
typedef enum{...} E;
void f(E e){}
f(10); // compile error
enum E{...}
void f(enum E e){}
でいいじゃんtypedef関係ないよね
そもそもCではエラーにならないし
C++でエラーになるのは「値の妥当性チェック」じゃなくて単純に型によるもの
411 :
デフォルトの名無しさん:2013/05/09(木) 12:10:36.05
enumのあとになんで名前をつける必要があるの?
この名前使うの?
グループ名
>>411 > enumのあとになんで名前をつける必要があるの?
> この名前使うの?
列挙型の定義と変数宣言を別に行う際に使える。
※この名前をタグ名と呼ぶよ。
enum ScreenColor {RED, GREEN, BLUE};
enum ScreenColor color;
定義と変数宣言を同時に行うなら省略可能だよ。
enum {RED, GREEN, BLUE} color;
ちなみに別途、
enum PrintColor {CYAN, MAGENTA, YELLOW, KEYPLATE};
という定義があっても
color = CYAN;
と代入するコーディングミスはチェックできる。
ScreenColor型変数のcolorにCYANは有効じゃないから。
415 :
デフォルトの名無しさん:2013/05/09(木) 20:03:04.58
スレチらしいのでこちらに来ました
playsound関数についてなんですが、
プログラム起動時に.wav形式のものを再生したいのです。
リソースからひっぱってきて再生する形にしたいのですが、
どうもうまくいきません。playsound関数など調べても
いまいち自分がやりたいのと大きく違って、あまり参考にはなりませんでした
そして、ON/OFFを切り替えることができるボタンなども、自分なりに探しましたが
探すのが下手らしくあまり参考にはならなかったです。
もしよろしければ、サンプルソースコードを書いていただけると嬉しいです。
もしくは、上記のヒントや方法などを教えて下さい。
(C++でフォームを使用するものです)
416 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/05/09(木) 20:20:23.96
//PlaySound.c
#include <windows.h>
int main(void){
PlaySound("SOUND1", GetModuleHandle(NULL), SND_SYNC|SND_RESOURCE);
return 0;
}
//PlaySound.rc
SOUND1 WAVE "sound1.wav"
417 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/05/09(木) 21:08:48.87
SND_RESOURCEを付けるのがポイント。
GetModuleHandle(NULL)の代わりにWinMainのhInstanceを使ってもいい。
418 :
デフォルトの名無しさん:2013/05/09(木) 21:21:46.92
>>416 >>417さん
すいません、先に言うのを忘れていましたが、私初心者に近いので
ソースコードの詳細利用方法があまりわかりませんでした。
すいません。
また別のスレに移動します。
ソースコード、情報提供 誠に感謝します。
そんなに難しい話じゃないよ。
<windows.h>をインクルードしておき、PlaySound APIを呼べば音が鳴る。フォームを使ってる場合でも同じ。
クラスのメンバ変数をconstにしたい場合
staticにしないと初期化出来ませんか?
は?
C++とは言ってないが
>>421 メンバ初期化子
でもあまりconstメンバ変数は使わない
グローバル変数は危険だと聞いて、ローカル変数のみでゲームプログラムを組む練習をしたいのですが、スコープ外に出る時に変数は消えてしまいますよね。
どうすればいいんでしょうか。
>>426 スコープ外、例えば関数を読んだ先で使いたければ、
呼び元で必要な変数群を構造体で用意しそのポインタを渡す
××は危険だと聞いてそれに向き合わず逃げるようでは
Cなんぞ使うべきではない
なぜならC言語そのものが危険だから
・・・あれ、Cの話だっけ?
グローバル変数と聞いただけで火がついたように襲い掛かってくる連中がいるから
そういう意味では確かに危険
>>424 グローバル変数とローカル変数と動的確保は適材適所。
どれがよくてどれが悪いという話ではない。
一般論としてグローバル変数は少ないほどいいというだけ。
>>429 ほかにもGOTOを諸悪の根源とする原理主義者たちとかw いそうだねぇ
gotoはだめだろ
んなことはない
C言語初心者です。
#include <stdio.h>
int main(void){
int water = 198;
int milk = 138;
double tax = 1.05;
int pay = 1000;
int change;
printf("%d", pay- (int)(tax * (water + milk * 2)));
return 0;
}
これは汚いプログラムですか?
友人に聞いたら、先に宣言をまとめてしてしまったほうがいいと言われたのですが、よくわかりません。
回答よろしくお願いします。
なんか自己解決したような気がします。
これだと見ただけでは何がしたいのか分かりづらいというか分からないですね。
全部宣言し、各商品の値段を出し、何を答えとして出すっていう分かりやすい順序を
作ったほうがいいということなんでしょうか。
一応自分で改善案をつくってみました。
#include <stdio.h>
int main(void){
int water,milk,pay,sum,change;
double tax;
water = 198;
milk = 138;
pay = 1000;
tax = 1.05;
sum = (int)((water + milk * 2)* tax);
change = pay - sum;
printf("%d",change);
}
どちらが理想に近いプログラムですか?
>>432 例えば多重ループの中から抜けたいとき
for() {
for() {
for() {
〜
if() goto LoopExit;
}
}
}
LoopExit:
gotoなしで書くとフラグと複数breakの組み合わせになると思うが
それよりもいっきにジャンプしたほうがシンプルで分かりやすくないだろうか?
「goto=悪」を金科玉条とするんじゃなくて、
要するに使い方(プログラマの思想?)次第じゃない?
>>435 考え方による。正解はない。
とにかく冗長でも分かりやすい記述を好む派と、簡潔で少ない行数であることを好む派がいる。
ちなみに前者の書き方は関数型言語に近いから前者の思考で書きたければそっちも勉強した方がいいかもしれん。
その書き方専用の定石というのも存在する。
>>435 最初にまとめて宣言するのはC89的な古くさいプログラムで、C++ではナシだな
「変数が初期化されていない」期間は
できるだけ短い方がバグが入りにくい
例外的なものは全体的に使い回す変数かな
その場合は初めて使う時に宣言すると、
その処理をやっぱ2番目に置こうと思った時に不便
>>436 基本的にそういう場合は関数に分けた方がいい
で、returnで抜ける
ただ、gotoの方がいい場合もあるので100%関数にした方がいいとは言わない
>>436 そのための大域脱出=try-catch-throw ですよと
正常系で例外使うのはgotoと変わらない
goto否定の発端ってほぼ全部gotoで書いちゃうような輩のせいだろ。
チョコチョコ使う分にはむしろ直感的で読みやすいソースになる。
>>439 >
>>436 > 基本的にそういう場合は関数に分けた方がいい
syori();
---------
void syori()
{
for() {
for() {
for() {
〜
if() return;
}
}
}
return;
}
動くだろうけど、これが基本とは思わないな
関数コールのオーバーヘッドと引き替えにどういう利点がある?
むしろループそのものをiteratorやvisitor使って抽象化する
goto を使わない馬鹿 そればかり使う馬鹿
グローバル変数 を使わない馬鹿 そればかり使う馬鹿
C言語 を使わない馬鹿 そればかり使う馬鹿
448 :
デフォルトの名無しさん:2013/05/13(月) 19:03:55.82
>C言語 を使わない馬鹿 そればかり使う馬鹿
仕事上、Cを使わざるを得ない、とか、(ほかの言語を使うから)Cを使う必要がない、って人もいるかもよw
実際の開発でGOTOなんか使うの?
>>443 ループがそれほどあるだけで
普通は結構な行数だろ
短いなら別にgotoでもいいけど、
大抵は関数に分けた方がいい場合が多い
独りよがりな考えを普遍的事実のように書く輩って自分では意識してない(できない)んだろうな (´・ω・`)
>>450 環境によっては、無駄な関数コールを減らすことを考えざるを得ないこともある。
RAMが256byteしかないとか
そんなならもうアセンブラ使えよ
多少goto使ってでも、Cだとアセンブラと比べて作業効率が桁違いなのだ
do〜while(0)でbreakしてるのをみると、
素直にgoto使ったんでいいんじゃないかと思う時はある
ただ、goto嫌いな人が無理に使うことはないよ
スキルの低いうちは封印した方がいい
俺ならbreakフラグを使う
全てのループはgotoで置き換えられる
459 :
デフォルトの名無しさん:2013/05/14(火) 12:02:47.58
gotoとifで置き換えられる
すべてのプログラムは、連接、分岐、繰り返し、の三要素で必ず表現できるんだっけ?
えーっと なんの定理だっけ?
まぁ論理的に可能というだけで、
必ずしも見通しのよいコードになるとは限らないと思うけど
フラグをいくつも使って多重ループから脱出するよりは
gotoを使ったほうが見通しが良くなる場合もある
// フラグをいくつも使って多重ループから脱出するよりは
// gotoを使ったほうが見通しが良くなる場合もあるので
というコメントを残しておけば、引き継いで保守する人も納得する。
納得されなかったらム板かマ板のコメントスレにあげられる。
ラベル名にBREAKを含めてるね
464 :
デフォルトの名無しさん:2013/05/14(火) 20:30:38.47
むかしから...
goto肯定派は、何でもかんでもgotoでやりたい、と主張している「わけではない」のに
goto否定派は、gotoなんか不要だ、使う必要は全くない、という主張になっていることが多そうな気がする
この温度差はいったい何なんだろうって思うよ
break が「一つ上のレベルに脱出する」という機能でしかないからではないか?
ラベル付き break であれば温度差は解消される
ラベル付きbreak‥‥‥これって goto?
redoはgotoでなければ実現できない
条件脱出用に関数内で1つだけの脱出ラベルに対するgotoなら
個人的には容認かな。setjmp / longjmpのほうがいやらしい。
前後を見ないとgotoによりすっ飛ばされている区間を見落としてしまうという恐れ
goto-free で縛ればそんなことを「一切」気にしなくて済む
ラベルで検索すればいいだけだから、いろんなところで
使われてそうなbreakよりもしかして見落としにくいんじゃね?
gotoは便利なんだよ。
ただ、馬鹿に使わせるととんでもないことになるから信用できない奴には使わせたくないってだけで。
471 :
デフォルトの名無しさん:2013/05/15(水) 09:13:50.45
C++の規格書って日本語版はないの?
JIS X3014(C++03)がある
C++11はまだ
ただし他のいらない規格票もたくさん入っていて分厚い本の一部
1万前後だったかなあ
473 :
デフォルトの名無しさん:2013/05/18(土) 14:13:52.83
FindFirstFileでヒットしたファイルの、タイムスタンプを取得するために、
WIN32_FIND_DATA構造体にセットされる値を読みに行っていますが、セットされる値は
キャッシュされるようでして、頻繁にファイルのタイムスタンプが更新される場合には
使えません。FindFirstFileでヒットしたファイル名を用いて、stat 関数なども使ってみましたが
状況は同じでした。このキャッシュをクリアする方法を教えてください。
Windows7上で動く、ネイティブコードのコンソールアプリです。
よろしくお願いします。
(マネージコードですと、Refresh()というメソッドが使えるようなのですが・・・)
474 :
デフォルトの名無しさん:2013/05/18(土) 14:16:23.12
上記への追加です。
デバッグビルドしました場合は、キャッシュされず、毎回最新のタイムスタンプが
取得できるのですが、リリースビルドしました場合にはキャッシュされた値しか
取得できないという状況です。
GetFileTime
477 :
474:2013/05/19(日) 21:12:18.74
>>475-476 情報ありがとうございました。キャッシュされているようだと断言して
いましたが、結局私の環境ではキャッシュが原因ではなく、FindFirstFileの
誤動作(仕様?)が原因でした。
FindFirstFileで検索するファイルが置かれているパスは、かなり深い階層の
フォルダにありまして、検索用の文字列としてとても長い文字数のものを
指定していました(恐らくMAX_PATH数を超える文字数)。その結果、ヒットした
ファイルそのもののタイムスタンプではなく、そのファイルが置かれているフォルダの
タイムスタンプがWIN32_FIND_DATA構造体にセットされていました。
教えて頂いたGetFileTimeでも、引数にファイル自体のパス名を与えているのに
フォルダのタイムスタンプが取得されました。
(ただし、デバッグビルドした場合はヒットしたファイル自体のタイムスタンプが
とれていました)
478 :
474:2013/05/19(日) 21:12:58.95
そこでためしに、ファイルを置くフォルダをもっと浅い階層にして、検索用の
文字列ももっと短くて済むようにしてみました。その結果、きちんと検索で
ヒットしたファイル自体の最新のタイムスタンプがセットされるようになりました。
(デバッグビルド、リリースビルド双方とも)
MAX_PATH数を超える文字数を引数に与えていたと思いますので、FindFirstFile
の使い方の間違いだとは思いますが、それではデバッグビルドしても同様の動きを
してくれれば、それこそもっと早くデバッグできたと思いますのに、デバッグビルドした
やつを使ったら、かえってデバッグの障害になったという顛末でした。
シングルトンの重要性を教えてほしい
普通にstaticとどう違うの?
最初に取得する時までコンストラクタが動かない
ただのstaticメンバ変数だと、複数のシングルトン間の初期化の順番が仕様で未規定
複数のシングルトン間のじゃないわ
複数のstaticメンバ変数間の、だわ
シングルトンだと初期化順は取得した順
相互に使うようなものでも、コンストラクタでお互いを使わない限りは問題ない
シングル + クルトン
484 :
デフォルトの名無しさん:2013/05/23(木) 22:29:09.40
CやC++って
Microsoftが作ったの?
ちょっとは検索してみようとか思わないのかね。
486 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/05/23(木) 22:58:12.25
「C言語 作った人」「C++ 作った人」で検索
情報系学科の出身でもない限り、最近の若いエンジニアはカーニハンやリッチーの名前を知らないんだろうな…
リッチーは故人になってしまったし、J・マッカーシーも同時期に鬼籍に入ったんだっけ。
C・シャノンなんて歴史上の人物と思っていたけど21世紀になって他界したんだよなぁ。
int i;
などで作った?定義した?変数には最初なんの数字が入っているのでしょうか?
#include<stdio.h>
int main(void){
int a;
printf("%d",a);
retrun 0;
}
を実行すると2883044という数字が出てきますが、この数字はなんなのでしょうか?
環境にもよるが、
まあ大体の環境は変数の領域を確保した際に
たまたまそのメモリに残っていた値だな
最初に何の数字が入っているか分からないからこそ何か仮の数を入れて初期化するという作法がある。
>>488 変数を作る、というのは概念的な話で
実際はメモリのどっかの部分に名前を付けただけなんだよ。
だから、たまたまその部分にあった値が入ってる。
でもコード、コンパイラ、リンカ、システム共に同じなら
毎回別の値が出たりすることはあんまり無いと思う
コンパイラやリンカ、システムごとのメモリの扱い方の癖がそこに出てくる感じ
コードをちょっと弄ると別の値が出たりするからやっぱアテにしちゃダメだけどね
>>491 このプログラムなら別の値が出る事は少ないだろうけど
現実的なプログラムだと大抵別の値が出るぞ
>>492 そうか…現実的なプログラムだとまず試さないからな…
JIS X3014が見られん(*1)ので記憶違いならすまんが
外部変数とstatic変数は初期値ゼロが保証されていて
それ以外の場合は不定じゃなかったっけ?
ちなみにauto変数は記憶域がスタック上に割り当てられるんで
そこのゴミが入ってくるような気がします。
(*1)
JISCでオンラインで規格書を閲覧しようとしたらAcrobatのバージョンを更新しろとポップアップが。
すでに最新バージョンにしとるのにどうしろと? (`へ´)凸
495 :
484:2013/05/24(金) 12:06:48.09
C言語を作った人はデニスリッチーって分かったけど
結局、C言語の権利はどこが持ってるの?
言語の権利は誰も持ってないけど
ランタイムライブラリの権利は各実装者が持ってる
>>495 権利って著作権のことか?
あるプログラム言語で書かれたプログラムは著作権の対象になるが
プログラム言語自体が著作権対象になるかは知らん
小出しに質問してるけどいったい何が聞きたいの?
商標権かね
まあまず何を聞きたいか具体的にしないといかんな
C/C++のコンパイラとライブラリなどを自作したから、これを売って儲けたいとか、か?K&Rも知らない人間がありえねーー
>>494 singletonの話なら、static変数は普通ポインタだよ。
>>487 >J・マッカーシーも
10代の頃例の言語の卓越したアイディアに神をみた、というか20年たってこの歳になっても理解がまだまだおよばない可哀相な状態です。
>C・シャノンなんて歴史上の人物と思っていたけど21世紀になって他界したんだよなぁ。
ダイクストラも。
LISPって、AIが流行った頃にもてはやされていたから
わりと近年の言語かと思っていたけど、2番目に古い高級言語だったとは (゜Д゜)ポカーン
コンピュータサイエンスが20世紀中頃から勃興した学問だから
その頃に活躍された先生や技術者が、最近になって亡くなるのは
淋しいけど歴史の流れだよね… (ノД`)
505 :
495:2013/05/25(土) 16:12:52.40
C言語の権利をどこも持っていないってどういうこと?
JavaだったらSunMicrosystemsだと思うけど
C言語は本当にどこにもないの?
むしろ Javaがおかしい
>>505 まず「C言語の権利」が何を指してるか明確にしろってば
著作権じゃないんだろ?
言語仕様は著作権ないけど、
Sunを買い取ったOracle様がJavaのAPI仕様自体(API仕様書や実装ではない)に
権利主張してたよね。Androidの仕様を訴えてたあれ。
そんなもは認められないはずだけど、まだ完全には解決していないはず。
あれは権利ゴロの嫌がらせだろ
プログラミング言語は工業規格(ネジ穴の大きさとか形とか)みたいなもんで、それそのものに権利を主張したりする性質のものじゃないよ。
強いて言えば規格を策定してるANSIのものとも言えるけど、それでも実装は個々のコンパイラ任せだし。
結局、C言語のコンパイラにはそれぞれ作者がいて権利を有してるけど、C言語そのものを持っている人は存在しない、ということになる。
基本情報やITパスポートで勉強するだろ
・言語仕様に著作権はない
・アルゴリズムに著作権はない
・コードに著作権は有る
・ドキュメントに著作権は有る
apiの仕様そのものに対する著作権はわからんが
apiのインターフェイスを記述したコードがあるならそのapiには著作権が発生する
当然第三者が勝手に利用したらアウト
>>513 GIF はアルゴリズム特許で問題が勃発したよね
著作権や特許という概念が、まず邪悪なんだよ
足し算や、足し算の記述に誰かの物なんて権利はあるか?ないだろ
それが当たり前なんだよ数学も物理もすべて神様が創造して、人間に与えたものだ
人間が新たに発明したから独占しようなどと考えるのはおこがましい
すべての知識は平等に誰からも利用されるものだ
足し算が独占できないように、少し複雑化しただけの他の知識も独占なんかしてはならないんだよ
うわぁ…
事実と理想が混同されてる
現実など糞食らえだ
R・ストールマンに傾倒されている方ですか?
ちなみに GIF の読み方は 「自負」 であって 「岐阜」 に非ず
俺は、コードが著作権で保護されて、ソフト会社がプログラムを売って金儲けするのに文句は言わないが
ソフトに欠陥があってもメーカーとして免責されるという状況には疑問だな
*PL法でカヴァーできないならソフトウェア専用の法律を整備すべきだ
メーカーとして権利(著作権)を主張するなら、メーカーとしての義務(責任)も果たせよ、と言いたい
すべてがFREEな世界に
すべてがFREE FREEな世界に
結局、彼の質問の意図は何だったんだろう
Cの参考書でも書くつもりなんかな
プログラミング言語の権利を気にする、その理由に興味があるな。 煽りじゃなくて、さ
うざいわ
法学部の学生かなんかで、ソフトウェアがらみの知財権か何かについて調べてたんじゃん?Dリッチーの名前すら知らなかったし。
>>525 俺も法学部だったけどあの訊き方じゃそれは無い。
法学部で重視するのは「誰か」じゃなく「どんな権利か」だし、C言語だけにこだわる理由もない。
>>526 > C言語だけにこだわる理由もない。
C以外のの言語には 【こだわってない】 という証拠は?
>>527 他の言語スレをひと通り見てきて同じ質問がされていたかを見てくれは済むんじゃない?
別に俺の言いたいことはそこじゃないからこだわっていようがいなかろうがどうでもいいけど。
他の言語スレを見てないのに言ってやんのwww 語るに落ちてるよw
知的財産権のばあい、権利の種類および、
誰が権利を所有しているのか、も当然、重視される事柄だが. 本当に法学部?
オマエらーー
もう許してやれ
>>530 その「誰が」ってのはあくまで概念上の話であって、具体的にCがどうのJAVAがどうのって話はしないよ。
ましてや権利の種類すら明らかにせず訊くなんてことは有り得ない。
少なくとも法学部のやる法学なら100%そう。
533 :
デフォルトの名無しさん:2013/05/27(月) 07:09:35.66
534 :
デフォルトの名無しさん:2013/05/27(月) 11:31:54.68
C言語から派生した言語はいろいろあるけと
全てデニスリッチーが作ったの?
デニスさんマジパネェッス
ケントンプソン涙目
537 :
デフォルトの名無しさん:2013/05/27(月) 12:06:56.53
デニスリッチーが作った言語のはCとC++のみ?
C++はビョーンスポッスポッ
539 :
デフォルトの名無しさん:2013/05/27(月) 12:32:26.06
デニスリッチーが作った言語は
C言語のみなの?
>>536 ケントンプソンだってチューリング賞をもらってんだ なにも泣くことはあるまいw
541 :
デフォルトの名無しさん:2013/05/27(月) 15:34:45.37
おちんぽミルク出ちゃいましゅ!
BCPL -> B -> Cだな。
543 :
デフォルトの名無しさん:2013/05/28(火) 00:40:08.35
544 :
デフォルトの名無しさん:2013/05/28(火) 01:33:38.81
C → C++ → C# → D
545 :
デフォルトの名無しさん:2013/05/28(火) 01:34:26.57
Java
546 :
デフォルトの名無しさん:2013/05/28(火) 12:28:00.68
Javaもデニスリッチーなの?
神じゃん
547 :
デフォルトの名無しさん:2013/05/28(火) 12:51:48.43
カプセル化は望ましいといわれます。
すると実務ではメンバ変数なら全てカプセル化するもんなのでしょうか?
カプセル化はメンバ一つにつき2つアクセスのためのメソッド(読みと書き)を書く必要があり、めんどくさいんですが
>>547 メンバ変数に煩雑にアクセスするんならクラスの設計を見なおした方がいいよ
読み書きするアクセサを付ける位ならクラスの意味ないじゃん
publicにしてもいいしな
でも後から泣くような気がする
>>547 メンバ変数が public/private に綺麗に分かれているという前提で
public なメンバのみアクセッサを付けるというのがポピュラー
C#とか rubyとか専用の構文を持つ言語すらある
特に setter だけでも作っておくとデバッグがもの凄く楽になる
アクセサってattr_accessorとか@propertyとか書いてパッと作れたりしないんですか?
ないよ
ヘッダファイルにプロトタイプを書いて
ソースファイルに関数実体を書くのが男の流儀だよ
ヘッダに書いてインライン関数にしたりIDEの機能で追加したりするのも邪道
おれがゆるさない
そもそも
そういう無駄な設計技法を取り入れて実行時パフォーマンスを犠牲にするやり方は
Cのお作法ではない
JavaなりC#なりに移るべき
いやむしろDに(ry
>>551 publicは自由にアクセスできるのになんでアクセッサを付ける必要があるの?
C++ならではの汚い文法だけど、特定の関数やクラスだけにfriendとして
公開する方法もある
大抵はこれで行ける
文法が汚いというか、設計が汚いね、それ
friend は公開じゃなくて
1つのクラスをやむを得ず複数に分割せざるをえないような時に使うもの
でもstd::ostresmやstd::istreamに渡す時はfriendにするしかないだろ?
<<か。上の話とはあまり関係無い気がするが。
562 :
デフォルトの名無しさん:2013/05/28(火) 19:27:32.23
まとめると
デニスリッチーが作って今使われてる言語は
C、C++、C#、Java
ってことでOK?
>>562 > デニスリッチーが作って今使われてる言語は
> C、C++、C#、Java
> ってことでOK?
その文章だと、C++もC#もJavaも、リッチーが作ったという意味になる。そう理解してるの?
人に聞くばっかりじゃなくて少しは検索しようぜ。
wikipediaとかもあるわけだし。
そろそろ目的を白状しようぜ!!!
大勢の人間がレスしてんだから、質問の意図ぐらい開示してくれてもいいだろう
白状しろとか怖い
567 :
デフォルトの名無しさん:2013/05/29(水) 05:17:42.57
/. : . : . : . : . : . : . : . : ヽ
/. : . : . : . : . : . : _,. -┐. : :| 貴
|. : 「`¨ ー-‐ j. : :!
!. : 〉 〈. : :.│ 目 様
l. :ノ-―≧从r≦=― 、ヽ、 j
「V }丞{ }气rfミ 的 の
Yハ.__ ,ノj ヾ、 ノ jら}》
ヾ {〈 r }  ̄ Lハノ は
_ ⊥ _/ゾj__ ヽ 厂
/ \辷_ヽ }l 入 何
/ ヾ-く丿j / }\
| Y´ / / ヽ だ
| ,∠ ̄ ヽ ├-ァく /
l (廴 )/ l / \
オイオイ
あまりみんなで脅すと本人が萎縮しちゃって
言いたいことも言えなくなってしまうじゃないか! もっと優しく聞けよ!
ん? 怒らないからオジさんに言ってごらん
恥ずかしがること ないんだよ
ほら もうこんなに....
だってとっくに本人いなくなってるし
570 :
デフォルトの名無しさん:2013/05/29(水) 12:40:16.35
ポインタって動的になるの?
ハイパーリンクつかないのか。チッ余計なことを
例えばmallocで帰ってくるポインタ(アドレス)は動的に変わりうるが
静的なインスタンスに対するポインタならプログラムの実行を通して不変だろう
いまいち質問の意味がわからん
最近こんなのばっかり
575 :
デフォルトの名無しさん:2013/05/29(水) 23:31:45.98
ポインタってnewみたいに
動的って解釈で良いの?
意味が分からない問いには答えられない
ポインタ自体は静的だな
char *p;
free(&p);
なんてことしないだろ?
578 :
デフォルトの名無しさん:2013/06/05(水) 02:33:43.75
SUCCEEDEDってif文の中の処理が正常に実行されたらif文実行ってことで良い?
>>578 それはWindowsプログラミングにおけるSUCCEEDED()マクロのこと?
もしそうだとしたら、HRESULTで調べてみて
>>578 自分がぷろぐらむを書くんじゃなくて読むだけならそう思っておいていい
何の関係があるのか分からん
IOCCC的なネタだな。
floatとdoubleの違いはなんですか?
mainの中のfloatの部分をdoubleにすると、変な値が表示されてしまうのですが
#include<stdio.h>
void dprint(double d){
printf("打率は%fです\n",d);
}
int main(void){
float sum;
printf("打率はいくつですか?\n");
scanf("%f",&sum);
dprint(sum);
return 0;
}
1.0*10^38 ~ 1.0*10^-37
1.0*10^308 ~ 1.0*10^-307
自己解決しました
scanfの中でdoubleで定義された文字を使う場合は%lfでないとだめなのですね
@C++
1.テキストの先頭に追記したいです
2.テキストの先頭文字を削除したいです
・やりたいこと
test.txt aaa → bbbaaa
test.txt abc → bc
・あまりやりたくないこと
バッファに文字列を一度読み込んで,同じファイルに上書き再出力
エラー耐性が高いのは、
別ファイルに出力して、元ファイルを消して、別ファイルをリネーム
エラー耐性不要なら
バッファに文字列を一度読み込んで、同じファイルに上書き再出力
一度読み込むと言っても全部読み込む必要はなくて
適宜上書き出力すれば良い
上書きしてもまだ読んでない所には上書きされないので
ありがとう
素直に読み込んどきます
仕事ではやるなよ
普通は元になるデータを保持しておいて
適宜最初から書き出すとは思う
593 :
デフォルトの名無しさん:2013/06/10(月) 12:26:28.43
intのバイト数って環境によって変わるらしいけど
何が原因でかわるの?
ハードウェアの都合で
64bit版とか32bit版とか1度くらい聞いたことあるべ
一応
short≧int≧long
ってなってるはずだけどな
逆だろう
598 :
596:2013/06/10(月) 14:52:18.76
あ、ほんとだ
あと、intはそのマシンの自然な語長にする、という規定があったような… 俺の勘違いかな??
8ビットCPU用Cのintは16ビットだった気がする
さっそくの反例 ありがとうございます。 勘違い、失礼いたしました。
#CP/Mの時代か〜 俺の産まれる前だわ (←ウソ)
いくらマシンが貧弱な時代でも
0-255 の範囲で整数型(キリッ などと考える馬鹿がいるものか
>>599 合ってるんだけど、何をもって自然とみなすかは規定されてないんだよね
多分、CPUの一番使用頻度の高いレジスタサイズで決めるんじゃない?
>>600 そりゃ規格でintは16ビット以上が
要求されてるからな
>>604 64bit機でもint=32bitが一般的
レジスタサイズなどあくまで目安にしかならない
>>606 それは win32api のソースを全面刷新させないための、つごー
ちょっと!なに言ってんのかわかんない
なにがわからないのかがわからない
gccだって32bitなのに
糞プログラマーのレベルに合わせて
互換性を優先したってことだろ
文字通りの解釈しかできないアスペか
>>607 x86 & Windows 以外の処理系もあるのに それは理由にならんだろ
>>611 > 文字通りの解釈しかできないアスペか
お前はWindows以外を知らないアスペねw
x64 なんて後ろ向きの妥協の局地で動かすんだから
互換性最優先なのは当然だろ
char=1,short=2から4を飛ばしてint=8にするのはおさまりが悪い
short=4じゃ2が空くしな
いっそ int2, int4, int8, int16 ってすればいいのに
将来 int3, int7が出てきても大丈夫w
x64が64bitならx86は86bitじゃないの?なんで32bitなの?命名者馬鹿なの?
単にCPUの名前から由来してるからしょうがない
Corei7とかもどこにも64なんてついてないだろ?
そういうことだ
x86 は 80x86 の略だからな
>>616 処理系独自の拡張は既にあるよ。たとえば
__int8、 __int16、 __int32、 __int64
文句があるなら IA64 を捨てた奴らに言え
>>616 >int3, int7ってなんだよ
もし作っても、メモリレイアウト上パディングされるだろ
C99でint8_tとかint16_tとか追加されてるね
least16みたいなのは必須でも
16丁度みたいのはオプションだね
>>616 7bitレジスタのCPUは昔存在したはず
CHAR_BITは8以上だから・・・
というかそのレスはバイト数の話だし
628 :
デフォルトの名無しさん:2013/06/11(火) 19:56:50.41
intの違いはOSの32bit64bitだけなの?
629 :
デフォルトの名無しさん:2013/06/11(火) 20:01:48.67
間違えた
intのビット数が変わる要因はOSの32bit64bitだけなの?
神様の気分次第
>>629 コンパイラーを作る人の気分による。
コンパイラーは開発プログラム動作する環境の
オペレーティングシステムを強く意識している。
むかしDECのマシンでアプリを作ってた。
VAXからAlphaにマイグレーションしたんで、intが64bitなるか、と調べてみたら32bitだった。多分コンパチのためだろうけど。
intが64bitの処理系ってあんのかな。
PA-RISCやSPARCマシンは使ったことないけど、どうだったんだろう?
ILP64は一応あるにはある
任意ビットのintが宣言でき、ビットフィールドのごとく配列にして使えるようになると便利かな
CPUの制約は、この際無視w
使いどころが無いと思う
operator 駆使して自分で実装すればいい
#pragmaのいくつかをもうちょっと標準にしてくれるとか。
#pragma onceとか#pragma pack()とか。
あとendian関係とか。
>#pragma pack()
プリプロセッサーの仕事から逸脱してるし
そもそも同等のことは既に標準化されてる
>あとendian関係
ちょっと意味わかんない
bswapは欲しい
TL/1wwww
昔のPC板かよ
そういやGAME/86ってのもあったな
記号だらけの言語
まあBASICの予約語を記号に置き換えただけなんだけど
月刊ASCII読者のOB会はココですか?
ナノピコのコンピュータ世界の最前線が面白かった
それよりbitのナノピコ教室がー
当時のCPUには当然FPUなんかなかったから浮動小数点演算は全部手書きだぞ
あれで相当勉強になった
これはアセンブラスレで書いた方がいいな
8087買う金がなかったんじゃないの? (* ̄ー ̄)y-~~~
要りもしないところに小数演算は甘え
んーー 645はアセンブリ言語を使ってたんかな?
MS-Cのばあい、FP演算には、87用、87がなくてもソフトで完全エミュレート、演算精度より速度優先、
みたいに幾つかライブラリを用意してたとおもう。
当時は(コスト的に)マシンにFPUがついてないのが当たり前だったからなぁ (遠い目…)
8bit CPU の話だろう
そういや、FACCとかいってたねえ > ROM
ふぁっく!
>>646 8087馬鹿みたいに高かっただろ
しかも遅いし
あれで大学の研究室でマンデルブロ集合の絵描いたんだぞ
FPUとは思えないほどの遅さだった
>>648 ソフトウェアエミュレーションの場合FPUの全ての命令をエミュレート
してるわけじゃないんだよな
C言語で使う物だけ最低限入ってた
coutの出力時に precisionで指定した桁数より下の桁は四捨五入されますが
四捨五入ではなく切り捨てで出力する方法はないでしょうか?
double second = 59.9999999999997;
cout.precision(8);
cout << second <<endl;
で 60 ではなく 59.999999と表示されて欲しいです。
(std::scientificではなく std::fixed で表示したいです。)
お分かりの方がいらっしゃいましたらご教授いただけますと
大変ありがたいです。何とぞよろしくお願いいたします。
>>651 stringstreamに一桁精度高く流し込んで一文字削ったら?
>>651-652 stringstreamは流し込んだ時点でどうしても四捨五入されてしまうな
double src = 59.9999999999997;
src *= std::pow(10.0, 8);
dst = std::floor(src);
dst = dst * std::pow(10.0, -8);
std::cout << std::setprecision(10) << dst << std::endl;
結局これしかうまく行かなかった
654 :
デフォルトの名無しさん:2013/09/08(日) 00:20:32.77
保守
655 :
デフォルトの名無しさん:2013/09/26(木) 01:52:08.25
レス・ハンコックの「C言語入門 改訂第3版」という少し古い本はどうですか?
使ったことある方がありましたら感想お願いします
656 :
デフォルトの名無しさん:2013/09/28(土) 20:28:28.73
揚げ物
Wikiの引数の項目で
「C言語のように明示的にアドレス演算子を使うものは参照渡しとは呼ばない」
って書いてあるけど、巷のC言語本ではこれを「参照渡し」って解説してない?
まぁWikiとしては「ポインタ渡し」と言いたいところだろうが、この機構の本質的な部分において
両者は同じ原理で動作するんだから、「参照渡しではない」と言い切るのは違和感があるな。
実際、Wikiの解説が今の時代は正しいのだろうか?
>>657 プログラミング言語を限定しない汎用的学術的な定義と、
各言語の専門用語や方言として使われる定義が一致しない…
…って事でも良い気がするのだけど。
Cのポインタは参照渡しとしても利用できるし、「ポインタと言う値」として扱う事も可能である。
参照渡しとして利用する限りは参照渡しだ.が、言語実装的にはポインタ形の値渡しである。
どう見なして扱うか。言語のパラダイムとかってのはそういうモンだよな。
オブジェクト指向の設計をアセンブリ言語で実装とかも可能なのだし。
K&Rでは参照渡しじゃないって書いてあった気もするけど
たぶん今の規格にそんな記述はないだろうな
>>657 C++ に参照渡しがある以上,C のあれは参照渡しじゃないだろう.
wikipedia の「参照渡しではない」と言い切る,あるいは「Cは参照渡しCallByReferenceを持たない」と言い切るのが正確無比といえよう.
なるほどね!すごく納得。
言語仕様として用意されてるのは値渡しだけで
プログラマが引数にポインタ演算子を使ってアドレスを突っ込むことで 『プログラマが』 参照渡しのコードを書いてる…と言える。
配列だって仮引数で*宣言するのはプログラマだしね。
俺の理解が間違っていたのか… orz
>>661 まぁ、今間違いに気付き正しく理解したのだから、一生間違ったままでいるよりよかったじゃん。
プログラム書くのには関係なさげ
664 :
デフォルトの名無しさん:2013/10/12(土) 16:40:18.70
フォームアプリケーションでの質問だけど、
テキストボックス(名前:textBox1とする)を配置すると、
textBox1->Text
でString型の文字列がとれるんだけど、これをatoiしたいがためにchar型に変換しようとして、
atoi(textBox1->Text->c_str());
って書くと、
「c_strはSystem::Stringのメンバではありません」って表示される。
c_strってメンバじゃないの?
メンバじゃないから続きはC++/CLIのスレできけ
666 :
デフォルトの名無しさん:2013/10/12(土) 19:01:21.07
six six six
>>664 c_str()はstd::string(標準C++ライブラリの文字列クラス)のメンバ。
System::Stringは標準C++ライブラリではない、別のライブラリのクラスで、そこにc_str()は無いのだろう。
668 :
デフォルトの名無しさん:2013/10/13(日) 14:19:34.42
C++でゲームを作っているのですが
ゲーム本編のクラスに細かい機能のクラスを追加したかった場合
どのように追加したクラスを本編クラスにくっつけるものなのですか?
本編クラスのメンバーでそのクラスを生成すれば良いのですか?
委譲で
委譲も一つの有効な手だけどもデリゲートコードを自動生成する機能がC++にはないので
(多重)継承を使ったミックスイン手法を使う
多重継承は基本さえ押さえていればJava陣営が喧伝するほど危険なものではない
いや、多重継承は普通に危険だろ。
一瞬一瞬は便利だけど後になればなるほど肝心な部分の変更が難しくなっていくし。
ゲーム開発はソフトウェアの中でも特にコア部分をいじりまくる分野なんだから多重継承を推奨すべきではないと思うよ。
移譲で解決を図るべきだと思う。
672 :
402:2013/10/14(月) 00:42:24.97
>>671 その点で委譲と継承に違いなんてないだろ
ミックインされるクラスがちゃんと設計されていれば
protectedメンバはあってはならない
名前欄の402は消し忘れです
>>670 まあ、gotoみたいなもんだと思う。
使う範囲を絞らないとグチャグチャになってしまう。
だからJavaなんかはgotoと同じく禁止にして
代替機能としてinterfaceを用意したんだろうね
…出来ればmixinも用意して欲しかったけれど
質問です
構造体のメンバ?の値渡しって処理に時間がかかりますか?
構造体自体を値渡しすると処理が遅くなるのはわかりますが、
メンバの値渡しも同じぐらい処理が遅くなるのでしょうか?
構造体を使うときは、基本的に値渡しは行わないものなのでしょうか
よろしくお願いします
>>675 補足します
現在販売されている一般的な家庭用パソコンでの処理速度の話です
構造体の多きさは2キロバイト程度です
処理時間よりスタックオーバーフローが怖い
スタックオーバーフローでぐぐったら
どうすべきなのか判りました。ありがとうございます
いや構造体のメンバの型次第だろ
構造体のメンバでググったらわかりました
アドレス渡しとけよ
値渡し自体は全然問題ないが、
2kはさすがに大きすぎるからポインタのがいいだろ
渡すのは構造体じゃなくて、そのメンバだろ?
構造体全体の大きさは2k Byteだけど、渡したいメンバのサイズが4 Byteだったりしてな
どうしても分からない問題が発生したので教えて下さい。
static関数を定義してるんですけど、何故かクラスファイルでエラーが発生します。
'static' can only be specified inside the class definition
と言うメッセージが出ます。
クラス内の宣言↓
static bool
Util::isEmpty(Tizen::Base::String* str) {
if (str == null || str->IsEmpty()) {
return true;
}
return false;
}
ヘッダーファイルです↓
class Util {
public:
Util();
virtual ~Util();
static bool isEmpty(Tizen::Base::String* str);
};
よろしくお願い致します。
定義にstaticはいらん
>>686 コンパイルできました!
初歩的な質問に答えて頂きありがとうございました!(´・ω・`)
人生は初めてなのですが、どうしたらいいですか?
力抜けよ
深呼吸して
うまくいかないな〜と感じたら、迷わずシャットダウン&リブート
>>691 Idle状態で放置していたら何も仕事を受け付けなくなりました
一度シャットダウンしたほうがいいですか?
その時にはリブートしても同じ現象が出るだけなので、パッチを当てるなり、ソフトをアップグレードするなり、抜本対策が必要でしょう。
シャットダウン&リブートって
リブートにシャットダウン含まれてるんじゃ
>>694 マジレスすると、(正常な)シャットダウンを含まないリブート(例えば、電源断やハードリセット、システムクラッシュetc後の再起動)もあるよ。
wikiの再起動の項を参照してみんさい。
696 :
デフォルトの名無しさん:2013/10/23(水) 15:19:42.21
auto f = std::bind(&Foo::func, &foo);
f();
698 :
デフォルトの名無しさん:2013/10/23(水) 17:58:41.32
そういえば、vtableをディスパッチテーブルとみなして、
積極的に書き換える時、きれいに書けなくて困ったことがある
vtableのサイズ、各メソッドの位置を、、
できればVCで
なんなんだそのモヤモヤしたレスは
質問ならはっきり疑問形で書け
>>697-698 d
void (&rfunc)() = func; のほうは出来ないの?ポインタだけ?
無理に決まってんだろ常識的に考えて
>>702 d
エイリアスみたいに違う名前で呼び出したりとかは出来んのか残念
704 :
デフォルトの名無しさん:2013/10/25(金) 04:07:16.54
>>704 テンプレートはコンパイル時に解決できる必要があるから、
ヘッダに中身も書いてやらないと駄目
もしくは特殊化してやる必要がある
>>704 コンパイル時に定義が見えている必要がある
707 :
704:2013/10/25(金) 05:03:55.97
>>705-706 d
つまりテンプレートで定義したクラスも関数もヘッダに全部書く必要があるってことですね
便利そうであまり便利じゃないんですねテンプレートって・・・
その程度のことでテンプレートの利便性が否定できるか
709 :
704:2013/10/25(金) 05:38:16.70
テンプレートって何でもつっこめる汎用な関数や汎用なクラスを作れるものだと勝手に勘違いしてました
テンプレートって読んで字のごとくでコンパイラにとってのテンプレートって意味だったんですね
Value<int>やValue<long>が使われてたらコンパイラがint専用やlong専用のをテンプレートに従って再定義し直してたんですね
プリプロセッサマクロが生まれ変わったようなもの
すまん、
>>705は用語を間違えてる。特殊化はオーバーロードみたいなやつのことだったな
「明示的な実体化」とかになるのかな?
cppに書いたのを定義するために、ヘッダで型をいれて宣言しておく必要がある
もう全てのコードをヘッダだけに書いてcppはコンパイル単位を分割するだけにしてOK
コンパイルエラー
定義が重複しています
リンクエラー
定義が見つかりません
for文やwhile文などでくりかえし処理をすると,繰り返しの回数が99回目までは問題ないのですが
必ず100回目で「sqrt domain error」が必ず出ます。
数値を色々変えてみても必ず起きます.
sqrt domain errorはルートの中身が負のときでるエラーだと思うのですが
それ以外に出る原因はありますか?
>>715 infとかnanとか
sqrtに渡してるのを調べればすぐに分かるだろ
高速道路が無料化するって本当ですか?
クラスの配列を返却する関数を作りたいんですが、どうすればよいですか?
関数内でクラス型のダブルポインタを作って、必要な要素数の配列ポインタをnewする。
さらに配列の要素ごとにnewして、そのポインタを返す。
これであっていますか?
関数内でnewしたら変数の寿命はどうなるんですかね?
初歩的な質問ですいません...
イメージとしては
Hoge** getHogeArr() {
Hoge** ppHoge = new Hoge*[100];
for (int i = 0; i < 100; i++) {
ppHoge[i] = new Hoge();
}
return ppHoge;
}
コンテナ使え
ありがトン。引数にArrayListのポインタを渡す事にします。
(1) //clog << ...;
(2) a.out 2>/dev/null
速いのは?
ループ回して試せ
参照変数について教えてください。
ポインタにnewした領域を参照変数に渡します。
参照変数が破棄されると、newしたポンタはどうなります?
そのまま残りますか?
また、参照変数で指したポインタを明示的に破棄することは可能ですか?
イメージとしてはこんな感じです
参照変数 = *(newしたポインタ)
delete 参照変数;
残るに決まってんだろアホか
日本語で頼む
char *str1, *str2;
str1 = new;
str2 = str1;
delete str2;
これならdelete str1と同じ
delete 参照変数;じゃなくてdelete &参照変数;じゃね
shared_ptrで包んどけ
数が少ないうちはいいけど、多くなるととても自分では管理しきれなくなる
730 :
デフォルトの名無しさん:2013/11/17(日) 02:08:52.76
コンテナを全て乱数で初期化する、最も良い方法は何ですか?
vector<int> v(100);
for(int i=0;i<v.size();i++) v[i]=乱数生成()
などとすれば可能なのはわかりますが,v(100)の時に全て0で初期化されるのは無駄が気がします。
>>730 vector<int> v;
v.reserve(100);//メモリだけ確保しておく、ただしこの時点でsize()は0
あとはpush_backを使う。
for (size_t i=0; i<100; ++i) v.push_back(rand());
or
std::generate_n(std::back_inserter(v), 100, rand);
vector内部のsizeがpush_backのたびに加算されるのでその分のコストは掛かるかもしれない。
>>731 最適化無しだとpush_backの呼び出しコストがアホみたいに掛かるし、
最適化が掛かればループ内で参照しない文のsize加算は消滅が期待できるんじゃね?
期待通りに動くと思うな
つまりcppはゴミってことさ
Dを使おうよ
安定したら教えてくれ
安定は死を意味する > D
D道に果てはない
空行はインデントする派?しない派?
空行のインデントって何?
_____int i;
_____for(i=0;i<10;i++)・・・
この場合こうするかって事?
_____int i;
_____
_____for(i=0;i<10;i++)・・・
気づいたらVSがインデント消してるから気にしない
740 :
デフォルトの名無しさん:2013/11/22(金) 23:11:43.19
ディレクトリ内の特定の拡張子のファイルを全て選択して指定のプログラムで開くプログラムを作りたいんですが使えそうな関数を教えてもらえないでしょうか?
コンテキストメニューにあるような別のプログラムで開くに相当する関数が見つけられなくて困ってます
Cには無理だからOSのAPIを使うしかない
C使いは、(Winなら)バッチ使いでもあるべき
for %s in (*.xxx) do start /w %s
みたいにもできるわけだ
最大限にエスパーして、環境はWindowsで
既にダイアログを開いて選択するところまでは作れているものとして
とりあえず ShellExecute かな
system()でもできるだろ。
COMコンポートを使うといいよ
system使うならプログラムせんでいい
>>746 シェルスクリプトやバッチファイルでエスケープされてるか気にしながら書くよりは、
systemを乱用してコード書いたほうがマシなケースも有るような気がしなくもない。
>>747 さすがC/C++厨の発想だな
おまおれ
systemじゃあ出力が取れんだろ
そこまでするか
wchar_tを使ったことはないが試しに使ってみてもうまくいかないな。
標準出力にもファイル出力にも何も出てこないぞ。
あんまりまともに説明の書いてる本とか見たことないな。
使ってる人も少ないんかいな。下のプログラムは、nsize1 == 12 と標準出力するだけ
になる。wcscpy()関数しか言うことを聞いてくれないな。
何でやねん。
#include <stdio.h>
#include <wchar.h>
#include <string.h>
#include <assert.h>
int main(void)
{
FILE *fp1;
wchar_t wcstr1[256];
size_t nsize1;
fp1 = fopen("writefile.txt", "w");
assert(fp1);
fputws(L"ワイド文字列 wchar_t型\n", fp1);
wcscpy(wcstr1, L"漢字 alphabet\n");
nsize1 = wcslen(wcstr1);
printf("nsize1 == %u\n", nsize1);
fputws(wcstr1, fp1);
fclose(fp1);
_putws(L"終了");
return 0;
}
752の問題は解決したので、次はC++の入出力ストリームやstringクラスでなくwstringクラス
で試したら、std::cout にwchar_t配列を渡しても正しく表示しないし、wstringクラスの
オブジェクトを渡すとコンパイルエラーに、困ったもんだな。
#include <iostream>
#include <string>
#include <cwchar>
#include <clocale>
#include <cassert>
int main(void)
{
const char *pc1;
wchar_t wcstr1[256] = L"漢字 Alphabet";
pc1 = setlocale( LC_ALL, "JPN" );
assert(pc1);
std::cout << wcstr1 << L'\n'; // "0018FCAC10"と表示する
std::wstring wstrobj1(wcstr1);
// std::cout << wstrobj1 << L'\n'; コンパイルエラー
return 0;
}
wcout
wcoutに変更したら解決したし、cinではなくwcinで標準入力するんだろうと思って
試すと成功しました。
それでは、ifstreamとofstreamクラスもwchar_tの対応型のクラスもあるんですか。
お前もう自力でやれ
wifstreamとwofstreamクラスでコンパイルできたけれど、下のプログラムで実行すると、
「yti0num1 == 2」を標準出力して、readfile.txtの内容が「yti0」とおかしく表示して、
writefile.txtで作成したファイルには何も出力されてません。何で?
-- readfile.txt 文字コード Unicode(LE) 改行 CR LF
ワイド文字列 wchar_t型
漢字 alphabet
-- プログラム
#include <iostream>
#include <string>
#include <cwchar>
#include <clocale>
#include <fstream>
#include <cassert>
int main(void)
{
const char *pc1;
pc1 = std::setlocale( LC_ALL, "JPN" );
assert(pc1);
std::wifstream wifs1("readfile.txt");
assert(wifs1);
std::wstring wstr1;
int num1 = 0;
-- 続き --
for (;;) {
std::getline(wifs1, wstr1);
if (wifs1.eof()) {
break;
}
std::wcout << wstr1 << L'\n';
++num1;
}
std::cout << "num1 == " << num1 << '\n';
std::wofstream wofs1("writefile.txt");
assert(wofs1);
wstr1 = L"書き込み文字列 (Write string)";
wofs1 << wstr1 << L'\n';
return 0;
}
やはりwchar_tの情報は少ないな。
本にはおまけ程度にwchar_t型を書いてるくらいで、具体的なサンプルコードまで説明
してるものを見たことがないし、C++ Builder 5のヘルプファイルもwchar_t対応版の
関数名を書いてるくらいで具体的なサンプルコードはないし、Visual Studio .NET 2003
のMSDNも同様だな。ネットも情報が少ないし。
やっぱりCやC++でUnicodeの入出力とかする人は少ないんかいな。
VB.NetやC#.NetかJavaとかで作ったほうがいいんかいな。
>>761 _wsetlocale(LC_ALL, L"JPN");とchar or wchar_tを統一するか
TCHARを使用
言語開発者自身の書いた「プログラミング言語 C++ 第3版」の本でも1ページも
書いてるページがなかっな。こんなに情報量が少なければ、知識のある人や実際
にプログラミングしてる人って、多分少ないんだろうな。
iostreamのstd定義見たら
cout, wcout, ・・・って載ってるだろ
>>761 ていうか、wcoutでもwprintfでもいいけどUnicodeにしかない文字を出力してみるといい。
WindowsならWin32API触らないとCP932の文字しか出力されない構造になってるんだよ。
cmd.exe /UみたいなのがあるくらいにはコンソールプログラムのUnicode対応はメンドイ。
cscript.exeとかもパイプに繋ぐと出力APIが切り替わってCP932に強制変換されてしまう。
WindowsならWin32API使わなきゃ駄目で、Unixは最悪ロケールCにUTF-8流し込むだけ。
UnixはUTF-8でwchar_tは使わないし、WindowsはUTF-16だけどwchar_tじゃなくWCHAR。
wchar_tでUTF-16ってのはWCHARの変わりに使える、位しか意味無いんじゃないかな。
>>761 std::locale::global(std::locale("japanese"));にしろ
766の通りにしても、ファイルから読み出して標準出力のところは、ASCII文字は
1つのスペース置きに文字が表示されて、漢字はでたらめな文字が表示され、
ファイル出力のところは、UTF16 LEではなくShift-JISで出されますが。
modeにbinaryを指定しても。
std::ios_base::openmode mode;
mode = std::ios_base::in | std::ios_base::binary;
std::wifstream wifs1("readfile.txt", mode);
mode = std::ios_base::out | std::ios_base::binary;
std::wofstream wofs1("writefile2.txt", mode);
>>767 >>759-
>>760のこれを削除
> pc1 = std::setlocale( LC_ALL, "JPN" );
> assert(pc1);
これを追加でいけるだろ
> std::locale::global(std::locale("japanese"));
---------標準出力結果
ワイド文字列 wchar_t型
漢字 alphabet
num1 == 2
---------
---------ファイル出力結果
書き込み文字列 (Write string)
---------
無理でした。
標準出力
---- Visual C++ .NET 2003
、0ノ0eW[ R w c h a r _ t 妓
"oW[ a l p h a b e t
num1 == 2
-- Borland C++ Compiler 5.5
num1 == 0
-- Digiral Mars C and C++ Compiler
d0・ W[ R w c h a r _ t ・
"oW[ a l p h a b e t
num1 == 2
---- ファイル出力結果
Visual C++ .NET 2003 - - - - Shift-JISで出力
Borland C++ Compiler 5.5 - - Shift-JISで出力
Digital Mars C and C++ Compiler - - - 不明な文字コードで出力。
SJIS, JIS, EUC, Latin1, UTF-16 LE, UTF-16 BE, UTF-8, CESU-8, UTF-7のいずれでもない。
ただし、この中でUTF-16以外でならASCIIコードの文字はそのまま表示する。
----- 以上、終了 ----
>>770 Visual C++ Express Edition 2010でやってみたらどうなる?
>>771 Visual C++ Express Edition 2010ではないが、Windows SDKでVisual C++ 2010の
64bitのコンパイルでも、2003と同じ結果だった。
773 :
デフォルトの名無しさん:2013/12/24(火) 17:31:11.42
odd-even merge ソートについての質問です。
再帰有りの処理は以下のとおりに実装しました。
http://ideone.com/F7QMld これを再帰無しの処理に実装し直したいんですが、(odd_even_mergesort関数一つにまとめたい)
いい方法が思いつきません。ヒントや方法等を教えて下さい。
>>773 コード読まずにレスするけど、まずは
関数のローカル変数としてスタックを用意する。
んで関数の引数をスタックに積む。
んでスタックが空になるまで一個ずつ取り出すループの中に処理を書く。
んで再帰する代わりにスタックに積む。
775 :
デフォルトの名無しさん:2013/12/28(土) 00:31:34.53
>>774 回答ありがとうございました。
その方法を足がかりとしてもう少し考えてみたいと思います。
ありがとうございました。
776 :
デフォルトの名無しさん:2013/12/31(火) 18:35:58.74
c++ で rubyの.send()
のように、変数に入っている関数を実行する方法は無いでしょうか??
教えていただけると嬉しいです。
777 :
776:2013/12/31(火) 18:36:52.51
すみません、変数に入っている関数というより、
変数に入っている文字列と同名の関数を実行する方法、
といった方がただしかったです
>>777 構造体やクラスメンバとしての変数名はリンク時に消えるから、構造体やクラスのメンバの状態でそのまま呼ぶのは無理。
.DLLとか.soとかデバッグ情報付きの実行ファイルとかリンク情報が残ってる場合にそれ辿る事も可能ではあるが普通はやらん。
std::map<std::string,目的の関数ポインタ>とか作って自前で関数名と関数を紐付けしとくのが正攻法、かな。
オーバーロードまで考えると型情報も要るけど。
オーバーロード考えるくらいなら
関数ポインタの仮引数に定番となる引数の他にvoid*ひとつ持たせたり…
もっと拡張性持たせるならJavaチックになるけど
共通のインタフェースを実装した関数クラスにしたりとかね
まあ、一番はsend()相当を使って何がしたいのか、だと思う
780 :
デフォルトの名無しさん:2014/01/01(水) 02:22:13.69
なるほど・・ありがとうございます。
結構色々実装しないといけない感じになるんですね。
すみませんあともう1つ質問させていただきたいのですが、
int sample1[2][2] = {{1,2}, {1,2}};
int sample2[3][2] = {{1,2}, {1,2}, {1,2}};
int* p;
if (true) {
p = sample1;
} else {
p = sample2;
}
こういったことがしたいのですが、
p = sample1;
p = sample2;
の部分で
cannot convert error のような感じになってしまいます。
sample1 と sample2 の両方が格納できるような変数を作りたいのですが、
どのような書き方をすればいいでしょうか。
アドバイスいただけると嬉しいです。
>>777 呼び出したい関数が、ただの関数なのかクラスのメンバ関数なのか、さらに
メンバ関数の場合、仮想関数(virtual)なのか、オーバーロードされているか
どうかによって多少異なる。
普通の関数なら、C言語のみの記述でも、下記のようなデータ構造で名前と
関数エントリを管理することはできる。 ただ、下記のように単純にテーブル
から関数ポインタを取得して呼び出す場合、引数の並びと、順序毎の引数の
型はすべての関数で同じでなければならない。 引数をスタックに積むのと、
スタックの解放は、呼び出し側で行うので、引数の数が多い分には構わない。
typedef struct func_info
{
char func_name[32];
void (*func_entry)();
} FUNC_INFO;
static FUNC_INFO func_table[]={{"strcpy",strcpy}
,{"strcat",strcat}
,{"strlen",strlen}};
>>780 int *p[2];
ただ、ポインタでは要素の数は管理できないし、両者の区別もできない。
782 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/01(水) 17:48:01.34
typedef int SAMPLE[2];
SAMPLE *p;
または
int (*p)[2];
784 :
776:2014/01/02(木) 22:31:43.73
>>781 >>782 なるほど・・丁寧に教えていただきありがとうございました。
C++小技みたいのがたくさんあって難しいですね・・
785 :
デフォルトの名無しさん:2014/01/02(木) 22:47:11.14
ループカウンタって何でいつもiから始まるのか?iに何か特別な意味があるのか?
integer
真のプログラミング言語FORTRANではI,J,K,L,M,Nで始まる変数は整数という決まりがあったのじゃ
789 :
デフォルトの名無しさん:2014/01/02(木) 23:02:32.34
iterator
j-k フリップフロップ
女子高生FF
793 :
デフォルトの名無しさん:2014/01/08(水) 01:10:36.47
c++を本格的に勉強しようと思ったら
n3337を読めば良いの?
794 :
デフォルトの名無しさん:2014/01/08(水) 01:21:07.00
C++を全く知らないなら規格書はオススメできないな
795 :
デフォルトの名無しさん:2014/01/08(水) 01:24:47.66
>>794 規格書を参照するクセつけといた方が良いかなと・・・
規格なんてケツ拭く紙にすらならないよ
プロに教えてほしいんでつけど、
なんで例外ってあるんでつかねぇ?
Cのときには無くてもやっていけたじゃないでつか?(´・ω・`)
便利だからじゃないでつかねー
つ setjmp/longjmp
>>795 それはその通りだと思う
でも全くの初心者が最初に読むべきものでは無いんじゃないかと
あれはそこそこ作れるようになってきた人が横に置いておくものでしょ
>>795 深く理解するのはいいことだけど、そもそも規格書を厳密に参照しなきゃいけないようなタイトなコードを書く必要がある時点で大抵何か設計を間違えてる。
あと稀なケースではあるけどコンパイラがバグ抱えてたり未実装だったりする場合、いくら規格書が正しくてもコードはコンパイラに合わせてあげないといけないわけで。
本末転倒に感じるかもしれないけど規格書が常に正しいとは限らないからあんまりその辺の原理主義者に惑わされない方がいいと思うよ。
それに肝心なのは言語そのものの文法より使いこなし方だから、C++本体の規格書とか読む暇があるんだったらBoostのドキュメント読んだ方がよっぽど有意義だと思う。
つ setjmp/longjmp
デストラクタ「」
boostなんて使わせてくれるの?
>>801 > 規格書を厳密に参照しなきゃいけないようなタイトなコードを書く必要がある時点で大抵何か設計を間違えてる
> 規格書が常に正しいとは限らない
これ、世の中の大多数のプログラマの共通認識なんですか?
>>805 時々自問するといい、コードを書くのは手段であって主目的ではない
規格書をひもとく必要があるコードってのは、誰でも読める書き方になってないことがある
もちろん、規格書が頭に入ってないといけない人ってのはいる
極端な話、コンパイラ、ライブラリ書いてる人は、そうだな
> 規格書が常に正しいとは限らない
ここだけ抜き出すと意味が変わる
処理系にバグがあると、規格書に準拠して書いてもコンパイル出来なかったり、実行時にエラーになることはある
>>806 あと、ここでバトルする場合規格書に精通していないと負ける
見識不足が原因で負けるのであって
規格に詳しいかどうかは本質的に関係ない。
勝ち負けに拘ってるうちはなんとやら
そのセリフは片山に負けたおバカさんにかけてやれ
負けるっていうか、「規格書みろ(ドヤッ」とくると、お、おう、ってことで、
そこで話が終わってしまう
正直、読めるモノなら、読んでるからねえ
boolは1/0派?true/false派?
C99以前なら
#define true 1
#define false 0
とするのが常套手段かな‥
原則にもどって 非零/零派なのは間違いないとして、心情的には -1/0 派か
==とか!とかの演算結果がとる値って決まってなかったっけ?
うろ覚えだけど1と0だったような・・・
エラー値としては結構-1が使われる事が多い気がするけど、
それは単に0を含む自然数を正常値として扱うからだろうし。
Cでプログラムしてるのに
C++のtrue falseを使用してた事もあったな
>>816 そのとおり決まっている、すなわち、出力としての比較演算子/等値演算子や論理演算子&&/|| は真のときには 1 を返すことは確約されている。
ISO/IEC 6.5.8.5, 6,5,9,3, 6.5.13.3, 6.5.14.3
しかし、<ctype.h> の諸関数(isalpha() とか)は真のときに1を返すとは限らず、あくまで非零で真、零で偽だったりする。
_Boolなら0/1で書くのはありだが
boolといいつつ0/1で書くのは
頭がおかしいのでは?
>>817 言いたいことがよく分からん。
日本語で会話しているのに
英語のyes/noを使用するような感じ?
>>820 どちらかというと
「日本語の文章なのに 銀行ATM とか NTT とかアルファベット文字使っちゃった」
というイミフなレベル
野球選手がボクサーに転向して「右手は殴る方だからグローブはしない」って言っちゃう感じ
bool型true/falseはC++じゃないのか
それTRUE/FALSEでは
>>825 ISO/IEC 9899:2011 7.18p2
『macro bool expands to _Bool』
この仕様は14年前からあったはず
仕様ならC99からあったけど実際使えるようになったの最近じゃね
と思ったけどgccなら2001年くらいから使えるようになってたのね
つまりVSが
GCCのstdbool.hは2000年直後ぐらいだが
真面目に実装されたのが2005年
>>797 プロとしてはクラッシュが一番怖い。面目丸潰れ。例外なら予想されるクラッシュに先手を打てる。
>>830 アプリケーションが動作を停止しましたってやつ?
>>797>>830 WindowsでC/C++だと、言語自体の例外処理機構使わずにSEH(構造化例外処理)使ったりもするんだけどな。
これ、C++じゃなくてC/C++。Cで普通に使える例外機能。
「クラッシュ」って大半が(特にヌルポでの)アクセス違反だから、クラッシュ避けだけならこれで十分だよ。
まぁそれは置いといて、スタック巻き戻しでデストラクタが走るからエラー処理を簡潔に書けるのがメリットかと。
IT用語集で調べて"クラッシュ"はアプリにもOSにも使われることは知ってるんだけどさ
"クラッシュ"と聞くとアプリよりもOSが落ちることを連想するんだよな
俺が育った会社や親の躾のせいかもしれないが‥
Win32のコールバック関数渡して列挙するenumhoge系のAPIでは
コールバック関数内でのエラー通知するために例外を使う
>>833 WindowsはNT系になってから落ちにくくなったからなぁ…
落ちるときはハードかドライバの故障・バグが大半だし。
9x系やDOSはアプリの暴走でOSが巻き込まれるから、
「アプリのクラッシュ≒OSもクラッシュ」だったんじゃね?
無限ループ発生→ビジー状態→うぼぁ
ヌルポ発生→一般保護例外連発→うぼぁ
そもそも「クラッシュ」はあまり使わないなあ
使うなら具体的な現象(アプリケーションエラー、ブルースクリーンなど)
を使うから
>具体的な現象(アプリケーションエラー
こんな具体性に書ける説明は信用ならない
そもそも「アプリケーションエラー、ブルースクリーンなど」を具体的とは言わない
「クラッシュ」よりは具体的ではある。
でもOS巻き込んで落ちてた時代に両者の区別ができるかって言うと・・・ねぇ・・・?
それは屁理屈
○○より××だから〜
>>836 Windows2000、XPはDirectXを入れはじめた時でもあって、GDIまでカーネルモードだと
遅くて仕方がないのでここだけユーザーモードにした
だから画面関係でトラブるとやはりOS巻き込んで落ちる
Flashの再生でよくXP固まってたでしょ
Flash再生しながらChromeで別タブで他のページ開こうとすると結構な確率で
うんともすんともいわなくなってた
Vistaからは元に戻した
ハードウェアの性能が上がってカーネルモードでも問題なくなったからだね
> 結構な確率
リソース不足でGUIが固まったことはあるが、その条件で固まった覚えは特に無いんだが・・・
個体差が有る(ハード・ハード構成・ドライバに依存している可能性がある)問題だったりしないか?それ。
そもそも固まるのと落ちるのはちと違うし、9xよりは遥かにマシなのは間違いないと思うが。
スワップ中の動作遅延を固まると勘違いしてるんじゃないのか
NRVOってstd::moveで返すよりも遅い?
コピーもムーブも起こってないのに、実測で倍くらいになって???ってなってる
ちなみにVS2013Exp
気持ち悪くてしょうがない
そもそもコピーが起こらないんだからそんなに変わらないはずなんだが
本当にNRVOされてるかアセンブリ見てみないと
DirectX かどうかは知らんがC-Media の音源ドライバ on XP でよくBoD を喰らったな
ゲームのWave 差換えしたりして対処してた
クソハード、クソドライバで落ちるのはしゃあない
どうやったって対抗しきれるもんじゃないだろうし
>>850 式に当てはめた処理の部分ですがお願いします。
double p = (27.0 * a * a * d) + (2.0 * b * b * b) - (9.0 * a * b * c) / (54.0 * a * a * a);
double q = (3.0 * a * c) - (b * b) / (9.0 * a * a);
double D = (p * p) + (q * q * q);
double kai = (-p + Math.Sqrt(D)) + (-q - Math.Sqrt(D) - b) / (3 * a);
>>851 最後の行間違えました。
double kai = (-p + Math.Sqrt(D)) + (-q - Math.Sqrt(D)) - (b / (3 * a))
です。
C++でできることは全部VBでできますか?
できません
c++はVBの様な高級言語ではありません
できません
VBはC++のような低級言語ではありません
のほうが正しいような
そうだね^^;
言語として、VBにできることは大体VCにできるように思うが、
(#import, _bstr_t, _variant_t はかなり便利)
VBランタイムに備わってるライブラリが一式VCランタイムにあるかというと
そうじゃないので、実は併用最強なんだなきっと
VBは正直食わず嫌い
簡単なものや速度要求されるもんじゃなきゃ
VBでもいいんだよね、楽だし
生産性で考えるならUIをVBにするのが一番だとは思う
アセンブリとC++でも違いありますか?
アセンブリ言語が万能ってわけじゃないんだよ
手の込んだUIをVBでやるのはかなり苦痛だぞ。ネットワークは簡単だった
古代BASICにとってつけた拡張で、超汚い構文
士ねVB
VBAのせいで生き延びてるんだな
高級言語が乱立してて困る。環境が変わらなくても高級言語を使ってる場合
言語が変わると環境も変わる。言語同士のブリッジはC++にしかできない。
WEBでは結構まとまってるようだが
・・・まとまってるか?
まとまってるっつーか最終的に吐くにも読むにもHTMLとJavascriptが必要になるからそうならざるを得ないだけじゃないか?
生産性という話をする際に
作ったものが用途に合わなくなったら捨てるという「前提」が
すっぽり頭から抜けてるやつばかりで困る
ニュートン法を使って
三次方程式の解を求めるプログラムを作りたいと思ってます。
三つの異なる解を出す場合の処理がわかりません。
その処理の部分のソースがあります。
どうすればいいかアドバイスください。
三つの内、一つだけなら今のところ求められます。
double x, h, h2;
x = 0.0;
for (int n = 1; n < 100; n++)
{
h = (i[0] * x * x * x) + (i[1] * x * x) + (i[2] * x) + i[3];
h2 = (3.0 * i[0] * x * x) + (2.0 * i[1] * x) + i[2];
h = h / h2;
if (Math.Abs(h) < 0.000000000000001) break;
x = x - h;
kaitou[0] = x;
}
複数の解を求める方法は何かないでしょうか?
3つ求まるまで初期値変更
一つ求まったら
次の初期値は前に求まった解ってことでいいんですか?
どうすればいいでしょう?
ヒントください。
>>872 山登り(または谷下り)するときに、頂上(谷底)でその斜面からより高い(低い)場所に向かって歩いて別の頂上(谷底)に到達できるの?君。
初期値よりも微分が手作業なのをなんとかしろよ
初期値はランダムでもいい
よく知らんがMathematicaやMapleをつかえば微分もプログラムでやれるんじゃね?
どんな関数を入力しても、微分も初期値も全自動でないと。
昨日ソース貼った者だけど
あれからソース変えてみました。
ここから解を3つ出力できるようにできますでしょうか?
int count = 0;
double x = 0.0;
double h, h2;
for (int n = 1; n < 100; n++)
{
h = (i[0] * x * x * x) + (i[1] * x * x) + (i[2] * x) + i[3];
h2 = (3.0 * i[0] * x * x) + (2.0 * i[1] * x) + i[2];
h = h / h2;
x = x - h;
if (Math.Abs(h) < 0.000000000000001)
{
kaitou[count] = x;
count++;
n = 1;
x++;
}
if (count > 2.0)
{
break;
}
}
自分で試してみないの?
試したけどできなかったので
何かアドバイスが欲しいのです。
・何を試したのか
・試した結果、どう上手く行かなかったのか
のリストをまとめてからどうぞ
試したのなら
>>885 > ・試した結果、どう上手く行かなかったのか
これを添えて質問するのは当たり前だろう
>>882 コード読んでないけど、x++;をx=ldexp((rand()+(rand()*1.0/RAND_MAX))/RAND_MAX , (rand()%1024)-512);
とかにでもすれば?
.outっていうファイルを解析して一部書き変えて動作を変更したいのですが
調べてみると.outはC言語の実行ファイルらしいというとこまでしかわかりませんでした
.outのファイルを開くとほとんど文字化けで見れないんですが
.outファイルを逆コンパイルして人間が読めるようなソースを作ることは可能なのでしょうか?
たすけてください
テキストファイルとして開く時点でお前には能力がない
あきらめろ
「逆コンパイルして人間可読にする」って思考してる時点で
「テキストファイルとして文字化けしてる」って認識になるはず無いんだが・・・釣りかね?
テキストとして開いてみた
→文字化けしてるからリコンパイルかな
って流れくらいわかるだろ
そもそもリバースエンジニアリングには注意が必要なわけで
流石に自分で全部調べられるレベルにないとやって欲しくないな
最近javaばっかりしてて
久々、C++でデスクトップアプリを作ろうと
思ってるんですが(何を作ろうとは考えて無いけど)
自分の持ってるVSって2005なんだけど
VSってmfc以外の利点は無いし
2005だからだからVC++も中途半端な作りだし
やっばVC++の新しいバージョンのEE入れたほうが良い?
それともマルチプラットフォームのQtが良い?
どなたか教えて!
作りたいものでてから考えろや
っgcc
>>894 VS2005に、最新のEEのコンパイラ組み合わせてはどうか
>>896 gcc, clang もたしなみ
>>888 無理
スキルがあるなら逆アセンブルしてパッチをあてるくらいだが
それすら現実的でない
助けてくださいということはクラックされて何か仕込まれた?
899 :
デフォルトの名無しさん:2014/02/23(日) 05:50:36.81
初心者ですが、文字列の比較について教えて下さい
class A {
static const char * sprit(const char* chr);
}
const char * sprit(const char* chr){
std::string str(chr);
const char subChr = substr(0,3).c_str();
return subChr;
};
という文字列を半分にするクラスを作成し、
const char * chr = A::sprit("123456");
if (!strcmp(chr,"123")){ }
という比較を行うと、真になって欲しいのですが
毎回結果が違ってしまいます。
chrの中を見ると「123」となってはいるのですが。
これは何を勘違いしているのでしょうか
環境はAndroid NDKです。
よろしくお願いします。
アドレスが異なるから違うよと言われる
値の比較をするならそうしよう
そもそも、ポインタを返す関数で整数を無理やり返してコンパイルできてるのかね。
つーか、AndroidNDKでC++なのか?
>>899 ローカル変数のポインタを返してるからじゃないの?
そこら中誤字まみれでどうしようもねぇな
文字(Chr)と文字列(Str)すらごっちゃになってるし、spritはsplitだろうし、4行目A::が抜けてるし…
static const std::string A::split(const char* str){return std::string(str).substr(0,3);};
でよくね
C++のSTLのstd::vectorのコードを見ていたら、
コンテナに格納可能な最大数を返してくれるメソッドmax_sizeが以下のようになってたんですけど、
size_t max_size() const
{ return size_t(-1) / sizeof(_Tp); }
どうしてこれで求められるかが理解できません。
教えてください。お願いします。
>>905 ・size_tはunsignedだから、-1をキャストすると最大値が出る
・sizeof(_Tp)で要素1つ辺りのサイズが算出できる
そこから、vectorの実装に明るくない俺でも
・使えるのは最大で「size_tの最大値」バイトまでなんだろう
・それを要素1つ辺りのサイズごとに区切って使うのだろう
というくらいは推測するよ
まあ、区切るも何も、C/C++の仕様考えたら
ポインタに演算や添字与えりゃ済むんだろうが…
それ以上はもっかい自分できちんと。
処理系や実装者によって多少の差異があるかも?知らんけどw
でも、どう考えてもmax_size()個行く前に仮想メモリ空間が足んなくなるよねコレ
スパコン用とかどうにかそれが出来るC++実装がどこかに存在するのかな…
メモリーをnewして失敗しなくても、実際にアクセスするまで
メモリー確保できたかどうかわからないアーキテクチャなOSがあるんでな
最大サイズも「あれば使える」程度でいいんよ
>>906 なるほど!
よくわかりました!
ありがとうございます。
あの罠仕様は実メモリ・実スワップが割り当てられないだけで仮想メモリ空間自体は割り当てされるんじゃないのか
三次方程式のプログラムを作っています。
複数解を出力する場合の処理についてです。
ニュートン法で一つ目の実数解を出力した後に
次に二つの複数解の実数解を出しました。
次に虚数部を出したいと思うんですが
どう処理すればいいのかわかりません。
その処理をしているソースを載せます。
どう処理すればいいでしょうか?
最後のelse if (hanbetu < 0.0)のところが
複素数解を出力する処理です。
変数imに虚数部を入れます。
for (int n = 1; n < 100; n++)
{
if (Math.Abs(h) < 0.000000000000001)
{
kai[count] = Math.Round(x, 13);
if (hanbetu > 0.0)
{
count++;
x = 10.0;
if (count == 2 && kai[0] == kai[1])
{
count--;
x = -10.0;
}
}
if (count > 1)
{
kai[2] = Math.Round((-(i[1] / i[0])) - (kai[0] + kai[1]), 13);
break;
}
else if (hanbetu < 0.0)
{
kai[1] = kai[2] = Math.Round((-i[1] / i[0] - kai[0]) / 2.0, 13);
im = (Math.Sqrt(3.0));
}
913 :
デフォルトの名無しさん:2014/02/28(金) 17:15:55.38
age
マルチプラットフォーム的なコードにしたいんだが
OS依存のライブラリ等に自作ラッパ噛ますのってアリ?
本当はSDLって奴使いたかったんだけど
Windows8でXAudio2のバージョンが変わったとかでビルドできない…
>>914 OS依存部分を直接自前ライブラリに実装して、プラットフォームごとに自前ライブラリ作りなおしてもええんやで
まぁあれだ、どうせ移植するときは自分でやるのが大半だろうし、自分で移植しやすいように書けばいい
>>914 車輪の再設計になってもいいなら。GPLとかでよければ誰かがやってることが多い
それだけみんなおんなじことを考える
そのへんを度外視すれば、悪いことではない
ちんこまんこにいれれば
ハッピー
ワロタ
【Z46QAlOd】の検索
PC等 [プログラム] C++相談室 part111
320 322-323
PC等 [プログラム] スレを勃てるまでもないC/C++の質問はここで 21
917
スレ勃てずに肉棒勃てろ
.cpp は .h を #include で認識してるけど
.h は .cpp をどうやって認識してるの?
地味にこれが分らないから詳しく教えて下さい
認識する必要なんてないだろ
プリプロセッサがウンタラカンタラ
>>921 .hには.cppの場所記入しないだろ?
.cppが.hを呼んでるだけだから
Visual Studio2008で作ったlibをVisual Studio2012で使うとエラーが出ます。
これをなんとかできませんか?
エラーコピペ
error LNK1120: 3 件の未解決の外部参照
error LNK2001: 外部シンボル ""public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ)" は未解決です。
error LNK2001: 外部シンボル ""public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ)" は未解決です。
error LNK2001: 外部シンボル ""public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ)" は未解決です。
error LNK2001: 外部シンボル ""public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ)" は未解決です。
error LNK2001: 外部シンボル ""public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ)" は未解決です。
error LNK2001: 外部シンボル ""public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ)" は未解決です。
error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: struct std::_Iterator_base12 * * __thiscall std::_Container_base12::
_Getpfirst(void)const " (__imp_?_Getpfirst@_Container_base12@std@@QBEPAPAU_Iterator_base12@2@XZ) が関数
"protected: void __thiscall std::deque<short *,class std::allocator<short *> >::_Orphan_off(unsigned int)const "
(?_Orphan_off@?$deque@PAFV?$allocator@PAF@std@@@std@@IBEXI@Z) で参照されました。
error LNK2019: 未解決の外部シンボル "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ)
が関数 "protected: bool __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Grow(unsigned int,bool)"
(?_Grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAE_NI_N@Z) で参照されました。
error LNK2019: 未解決の外部シンボル "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ)
が関数 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
& __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::
assign(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
const &,unsigned int,unsigned int)" (?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@II@Z) で参照されました
error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'main.obj' と一致しません。
error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'main.obj' と一致しません。
error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'main.obj' と一致しません。
error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'main.obj' と一致しません。
error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MTd_StaticDebug' が MDd_DynamicDebug の値 'main.obj' と一致しません。
ライブラリとリンクするライブラリは、ライブラリのコンパイル時に使ったヘッダファイルと互換が有る奴使え。
最低でもMTとMDのオプションぐらい合わせろ。
ていうか(恐らく)バージョンの違うテンプレートライブラリでリンクしようとすんな。
931 :
921:2014/04/23(水) 22:39:38.56 ID:qwt0uHqN
そもそも、なんで .h は必要なの?
.cpp だけじゃどんな問題があるの?
他のcppに公開する必要ないなら必要ないけど
>>931 多数の.cppを別々にコンパイルできます。
各.cppで、共通部分を.hで宣言しておけばコンパイルできます。
リンクするとき、まだコンパイルしていない.cppがあれば、エラーになります。
Cだけならわかりやすいかも
C++は、いろいろ勉強しないとなぁ
935 :
デフォルトの名無しさん:2014/04/23(水) 23:57:20.36 ID:8aJ+1hBq
C++はCより難しいですか?
>>931 ここで、他のファイルのヘッダをインクルードすると、
返り値の型 f(引数の型);
というようにヘッダの内容が展開されて、
他のファイルにある、関数の型が事前にわかる(前方宣言)
よってここで、f()の実装を知らないのに、正しい型で使える
複数のファイルによる、並行・分散、開発・コンパイル時に、
ひとまず宣言だけあれば、実装がなくてもコンパイルできる
と同時に他人が、f()の中身を作る
>>935 難しさの基準による
ちょっとしたことで低水準に踏み込まざるを得なくなるCと、ひたすら機能が多く複雑な言語であるC++
>>935 難しい
実際にC++を使ってる人間の間ですら
極端にイメージするものが違うのも一因
C++でプログラミング学んだ人は偏見に染まってる感があるね
C++こそ正当なオブジェクト指向言語だと思い込んでたり・・
>>935 本物のプログラマたちが使う唯一のプログラム言語だよ
本物のプログラマは複数使い分ける
>>939 その見解も偏見だと思うけどな
Cから入って、C++のクラスは特定の使い方を想定して砂糖まぶした構造体だと理解する人も結構居るだろ
だからと言ってオブジェクト指向の源流を辿りに行くかどうかは別問題だが…
あれだ、関数型言語を食わず嫌いしてる手続き型言語ユーザだって、そういう概念があることは知ってる的な
構造体に関数も入れれるのがクラスって感じだったな
モダンC++どころじゃないってか
むしろ例外の実現が困難ではないか
>>942 その理解だと virtual の存在意義にしばらく悩むことになる
>>945 SjLj 以外の実装を知りたいものだ
>>946 え?関数ポインタの入った構造体へのポインタを砂糖振って使いやすくした奴でしょ、あれ。
やっぱ、C++流オブジェクト指向って使い方を想定して砂糖まぶした構造体じゃないですか。
// この理屈で行くと様々なプログラミング言語の機能が〜に毛が生えただけになりますが。
948 :
デフォルトの名無しさん:2014/04/24(木) 22:43:05.57 ID:7Hb7UgBC
ある基底クラスを元に派生クラスを定義し
その派生クラスを別のクラスのメンバーとすることを継承って言うの?
>>948 派生クラスを定義する所までか派生じゃね?
ごめん
継承と委譲の違いを教えて
自分がパワーアップするか他人の力を借りるかの違い
社員を増やすかアウトソースするかの違い
>>951 継承は例えば親クラスの ret_type func(Nanka* arg) を使いたかったら
以下のようにする
class Foo : public vritual OtherClass
{//以下省略
委譲は例えば他のクラスの ret_type func(Nanka* arg) を使いたかったら
以下のようにする
class Goo
{
private:
OtherClass* m_pDelegator;
public:
ret_type func(Nanka* arg){
return m_pDelegator->func( arg );
}
};
変数や関数の名前ってどうやって決めてる?
いちいち辞書を引いて、誰も読めない正しい英語を書くのはもううんざり
しばらくやってたら、ある程度使う単語は決まってくると思う
そういうもんかな
返答ありがとう
>>954 委譲の方、Goo のコンストラクタにも何かしら要るんじゃないの
質問させてください。
以下のプログラムをグローバル変数を使わず同じ処理をさせるにはどうすればいいのでしょうか?
グローバル変数を使うのはあまり良くないと聞いたのですが、どうにもそのやり方が思い浮かびません。
簡単にでもいいので、よろしくお願いします。
#include<stdio.h>
int life=1000;
int Atk(int damageSatan){ // (勇者のライフ−被ダメ) を処理する関数
printf("魔王の攻撃。勇者は%dのダメージを受けた\n",damageSatan);
return life - damageSatan;
}
int Recover(int kaifuku){ // (勇者のライフ+回復) を処理する関数
printf("勇者は薬草を使った。%d回復した。\n",kaifuku);
return life + kaifuku;
}
void gennzai(void){ //現在のライフを書き出すだけの関数
printf("現在のライフ%d\n",life);
}
int main(void){
gennzai();
life=Atk(400);
gennzai();
life=Recover(50);
gennzai();
life=Atk(200);
gennzai();
while(1){};
}
本題と関係ないけど命名規則とコメントがクソい
>>960 その辺は初心者ということで目を瞑っていただきたいです。
コメントはつけていなかったのですが、他人が見る時に有ったほうがいいと聞いていたので
適当ではありますが急遽付け足しました。
命名規則もおいおい勉強していきたいと思います。
>>962 おお!わざわざこんなサイトまで使って直していただいてありがとうございます。
コピペしてビルドしてみたら全く同じ結果になりました。
各関数の引数にそれぞれlifeを入れたら良かったんですね!
書いていただいたソースをよく見て勉強してきます
どうもありがとうございました!
>>963 結果が全てならいいけど
スマートかどうかは別問題だからね
>>964 今のところはスマートさとか考えている余裕はありませんが、スマートな方が当然良いですよね
頑張ります