C/C++小心者スレッドP ..
263:デフォルトの名無しさん
08/12/20 02:40:07
>>261
たぶんfprintf(fp, "%s", a[i]);とかやって、ナル文字('\0')が見付からなくてメモリの適当なところまでファイルに書き込んだためにメモ帳などでテキストファイルとして開けない。
とエスパーしてみる。書き込みがSJISっぽいから、Windowsと仮定するけど。
最初から、バイナリで書き込んでバイナリで読み込むといいかも知れない、ゲーム作ってんだろ。
fwrite(a, sizeof(a[0][0]), sizeof(a), fp); foo型配列a
fread(a, sizeof(a[0][0]), sizeof(a), fp); foo型配列a
その代わりメモ帳では開くなよ。開いてもなんとかなるかもしれないけど。
264:デフォルトの名無しさん
08/12/20 18:50:18
バイナリエディターで覗くというのも手だな。
ファイルサイズが想定以上なら263で正解だと思う。
265:250
08/12/20 19:20:53
>>262
すみません。改行が多すぎるそうで、書き込みができませんでした。
>>263
ありがとうございます。
バイナリで開いて書き込んだら、できました。
>>264
そのような確認の仕方もあるのですね。
勉強になりました。ありがとうございました。
266:デフォルトの名無しさん
08/12/24 09:35:35
ちょっと質問したいんだが
コンストラクタで例外投げるのってどういう時に使うんだ?
分岐にでも使うのか?
267:デフォルトの名無しさん
08/12/24 14:08:45
>>266
エラー通知に決まってるだろ。コンストラクタでも普通の関数でも同じ。
268:デフォルトの名無しさん
08/12/24 21:19:49
コンストラクタだとエラーを返せないから例外を使う。
269:デフォルトの名無しさん
09/02/10 18:39:30
スレリンク(bobby板)l50
168 名前:よしよし ◆2U93Cmvv1o [sage] 投稿日:2009/02/10(火) 07:02:42 ID:???
おいハゲどもポインタの質問だ
------
p は指し示す先のアドレス
&p はポインタ変数pそのもののアドレス
*p は指し示す先の値
------
だよな?なのにポインタ配列の解説のところで
------
data+i がそのもののアドレス
data[i] が指し示す先の値
*(data+i) が指し示す先のアドレス
------
ってことになってんだよ
俺は本の書き間違えだと思って実際にプログラム打ち込んで
コンパイル、実行してみたらあってるんだよ
どういうことだ説明しろ
「*」はポインタが指し示す先の値を出力するんじゃねーのかよ
270:デフォルトの名無しさん
09/02/10 18:43:21
169 :おいら名無しさんヽ(´ー`)ノ:2009/02/10(火) 09:02:32 ID:???
3番目の"*(data+i)が指し示す先のアドレス"は間違ってるな。
ハゲの理解が正しい。どこの糞入門書だ。さらせ。
171 :よしよし ◆2U93Cmvv1o :2009/02/10(火) 11:50:38 ID:???
>>169ありがとう。ハゲじゃないが言ったようにコンパイルすると
結果は入門書どおりになるんだよ。俺が何か間違っているはず。
#include <stdio.h>
int main (void){
char* data[4]={"par","birdie","eagle","albatross"};
int i;
printf("data[i] 値 アドレス :ポイント先の値\n");
for(i=0;i<4;i++){
printf("data[%d] %10d %10d %10s\n",i,*(data+i),data+i,data[i]);
}
return 0;
}
-------------------------------------
C:\Source>point.exe
data[i] 値 アドレス :ポイント先の値
data[0] 4235576 1245052 par
data[1] 4235580 1245056 birdie
data[2] 4235587 1245060 eagle
data[3] 4235593 1245064 albatross
-------------------------------------
271:デフォルトの名無しさん
09/02/10 18:44:48
スレリンク(bobby板)
177 名前:よしよし ◆2U93Cmvv1o [sage] 投稿日:2009/02/10(火) 14:48:08 ID:???
要するに
int i=5;
int *p;
とかと
char* data[4]はそもそも違うっちゅーことだな?
*pってのは「指し示す先の値」のことだけど、
* data[4] ってのは「指し示す先のポインタ」のことなんだな?
* data[4]様はポインタ様*(data + i )やdata[i]のさらに違う場所
(メモリの)にいる奴なんだな?
メモ-----------
*(data + i )とdata[i]はまだポインタなの。
「ポインタの配列」→「ポインタ」→「指し示す先の値」
* data[4]→ *(data + i )とdata[i]→ *(*(data+i))または*data[i]
char* data[4]=
--------------
272:デフォルトの名無しさん
09/02/11 08:43:54
小心者スレということなので投下してみます。
VC++ Expressでウインドウアプリを作っています。
(ファイル A.h)
class A{
public:
A();
vertial ~A();
};
(ファイル B.h)
#include ゙A.h゙
class B:public A{
public:
B();
~B();
};
(ファイル C.h)
#include ゙A.h゙
class C:public A{
public:
C();
~C();
};
この時、Aが再宣言されたとか、Aが未定義だとかでコンパイラに怒られます。なぜ
273:デフォルトの名無しさん
09/02/11 08:56:55
vertial ~A();
274:デフォルトの名無しさん
09/02/11 09:47:54
if文をやっと覚えたところでニコニコ動画のビットレート計算
というのがあったのでこれを参考に簡単なプログラムを作っていたのですが
コンパイルエラーはでないのですが、最後の部分を入力するとエラーで落ちます
何がいけないのでしょうか?
Source PW:c
URLリンク(www1.axfc.net)
275:274
09/02/11 10:01:04
最後のif文で演算子が抜けていますが
ここは >= にしていました
276:274
09/02/11 10:02:21
補足
>最後の部分を入力
プログラムを実行して順番に進んでいって最後の部分を入力
277:デフォルトの名無しさん
09/02/11 10:41:14
>>274
scanf("%d", movieb);
278:デフォルトの名無しさん
09/02/11 13:03:11
>>273
virtual A();の間違うぃ
スマネm(_ _)m
279:デフォルトの名無しさん
09/02/11 13:25:47
そういうくだらない間違いをする奴がレスに何を書こうとも、
実際のコードをきちんと再現できているとはとても思えない。
従って、再現するソースとエラーメッセージを貼るか、帰れ。
280:デフォルトの名無しさん
09/02/11 13:41:40
何を偉そうに
そっから推測できる間違いが指摘できねーんならそれこそカエレだ
281:デフォルトの名無しさん
09/02/11 13:48:51
>>280
別にあなたが指摘なさっても宜しくってよ。それとも、あなたご自身が指摘もできないで書いてらっしゃるとでも仰るのかしら?
282:デフォルトの名無しさん
09/02/11 14:15:15
はいそうです
283:デフォルトの名無しさん
09/02/11 14:17:36
知らレス
284:デフォルトの名無しさん
09/02/11 14:40:16
>>272
こうじゃね?
#ifndef _A_
#define _A_
class A{
public:
A();
virtual ~A();
};
#endif
285:デフォルトの名無しさん
09/02/11 15:15:46
>>284
神!
正直、#include ゙A.h゙してれば逝けるとおもてました。
(BCCでは#includeしてれば逝けてたから)
ありがとうございますた。
286:デフォルトの名無しさん
09/02/11 16:30:16
インクルードガードぐらい常識として知っておけ
287:デフォルトの名無しさん
09/02/11 18:54:22
>>284 予約識別子死ね。
288:デフォルトの名無しさん
09/02/11 20:22:41
>>277
scanf("%d", movieb);
という箇所が間違っているということでしょうか?
または、ある部分を上のように書き直せということでしょうか?
289:288
09/02/11 20:28:46
解決しました
&が抜けているということですね
スレ汚しすみませんでした
また、回答ありがとうございました
290:デフォルトの名無しさん
09/02/11 20:31:43
>>287
_A_ はプリプロセッサの識別子。C/C++の予約識別子には該当しないよ
291:デフォルトの名無しさん
09/02/11 20:40:50
>>290
ライブラリの実装に _A_ 使ってるところがあったらぶっ壊れるだろうが。
292:デフォルトの名無しさん
09/02/11 20:45:53
あたま悪いの?
293:デフォルトの名無しさん
09/02/11 20:54:32
>>290
何を根拠にそんなことを言うのかね。
ISO C (draft n1336)
7.1.3 Reserved identifiers p2 にはマクロ定義についても明示的に禁止されてる。
> If the program declares or defines an identifier in a
> context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved
> identifier as a macro name, the behavior is undefined.
ISO C++ にはマクロ定義について明示的な記述は無いようだけど、 >291 があるから
やっぱりダメだろう。
294:デフォルトの名無しさん
09/02/11 22:11:00
どうせ、VCかgccしかつかわないもん。
295:デフォルトの名無しさん
09/02/12 05:49:25
#ifndef _A_
#define _A_
:
#endifと、
#pragma onceは同じ意味じゃないの?
296:デフォルトの名無しさん
09/02/12 05:55:30
いいえ、後者は一部の処理系でしか使えません。
297:デフォルトの名無しさん
09/02/12 05:57:16
>>295
VC厨はこれだから・・・
298:デフォルトの名無しさん
09/02/12 07:53:33
VC厨扱いしていただけるなんて光栄でごぜえます。
299:デフォルトの名無しさん
09/02/12 09:08:54
>>297
gccでもCodeWarriorでも使えるし
PC向けのメジャーなコンパイル環境で使えないのはbccくらいなんだが
ポータビリティ意識して書くのは当然としても、
>VC厨はこれだから…
ってどういうこと?
300:デフォルトの名無しさん
09/02/12 22:48:59
>>299
CodeWarriorってタダで使えるの?
wikipediaで見たらかなりのプラットホームをサポートしてるみたいだから
使ってみたいのだが
301:デフォルトの名無しさん
09/02/13 00:16:57
>>300
コンシューマゲームの開発やってると、無料でダウンロードできる場合もある
俺が使ったのはこのパターン。
すまんが小売してるかどうかは知らん。
とりあえず使いにくいことは確か。
302:デフォルトの名無しさん
09/02/13 00:18:57
>>299
#pragma onceがおそらくVC発祥だからでしょ。
#ifdef _MSC_VER >= 1020で囲むコードを良く見かけるし、
まだまだVC限定のイメージが拭いきれていないと思う。
303:デフォルトの名無しさん
09/02/13 09:03:50
>>302
> #ifdef _MSC_VER >= 1020で囲むコードを良く見かけるし、
すまんが意味がわからない。
コンパイラによってifdefとpragma onceを切り替えるコードがあるって話?(なわけないか)
VC限定のイメージとの関係は?
304:デフォルトの名無しさん
09/02/13 09:08:11
つーか、ifdefで比較演算ってなんだよw
とは思った。
>>303
pragma onceは厳密には全く違う意味に解釈される可能性もあるから、
使えるコンパイラを限定することに意味はないわけでもない。
305:デフォルトの名無しさん
09/02/13 14:55:58
>>304
意味ないだろ
それならifdefだけで十分なんだから。
306:デフォルトの名無しさん
09/02/13 15:26:48
>>305
古い MSC には #pragma once がなかったんじゃないの?そのための比較だと思うけど。
307:デフォルトの名無しさん
09/02/13 15:59:56
>>303
ごめん間違えた。正しくはこんな感じ。見ない?
#if _MSC_VER >= 1020
#pragma once
#endif
308:デフォルトの名無しさん
09/02/13 18:14:42
>>307
全く答えになってないんだがww
309:デフォルトの名無しさん
09/02/13 22:15:10
素直にインクルードガードしとけってことだ!!
310:デフォルトの名無しさん
09/02/13 22:50:41
#ifndef _strcpy
#define _strcpy
int _strcpy(){return 0;}
#endif
311:赤西仁
09/02/13 22:57:03
1年間悩んでます。お力をお貸しください。
アークザラッドUというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッドUは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
スクリーンショットじゃ嫌なんです。どうか皆さん、お力をお貸しください。
312:デフォルトの名無しさん
09/02/13 23:44:15
マルチ失せろ。
313:デフォルトの名無しさん
09/02/14 00:00:30
>>306
コンパイラの種類/バージョンチェック云々以前の話なんだが、わかってるか?
VCでifdefやifndefが使えないわけじゃあるまいし、
あえてpragma onceを混ぜる理由が無いだろ
314:デフォルトの名無しさん
09/02/14 00:05:42
普通のインクルードガードと307みたいなVC限定でpragma onceを組み合わせて使うコードの存在が、
#pragma onceがあたかもVC限定かのように思わせるのではないかと言いたいんだけど
315:313
09/02/14 01:00:52
>>314
>>306なの?
横レスで他人へのレスをされても噛み合わないレスしか返せないぞ
316:306
09/02/14 04:46:01
>>313
マクロによるインクルードガードでは2回目もファイルを開いて少なくともインクルードガードを
読む必要がある。 #pragma once なら2回目以降ファイルを開かずにスキップするような実装が
考えられる。
そのため、インクルードガードを置いて移植性を持たせつつ、特定のコンパイラでの
コンパイル時間を短縮する目的で #pragma once を置くことが考えられる。
URLリンク(en.wikipedia.org)
317:デフォルトの名無しさん
09/02/14 12:32:24
おまいら
._,,,,,,。,,、 广'x、 ,,、._ 」'゙''i、
,,,,,_.,,,,、广゚┐ .,,,v―冖"~゛ ゙'i、 .ト ,|,_ riゃ .} .,i´ '冖i、
.] ` f゙,l° ,i´ .゙l_ .y-┐ 'や'゙"゙’ _,,,vr" .゙ト.゙'x,,,,广 ィ・'''゙~ .._,,v・゚ヒ''''・x、
入、rУ ,iレ-v,,,、 .,r°."'''l゙ ,|√゙゚'i、 匸 ._ .y・'゙゚,,,v―-, .:゚ーa .√ ._,rll_ :}
.,r''y|゛゙゙l..,i´ ,i"゙l, .゙ト ,r°,,, .., ._,,vぐ .`√ .,i´l广._,,,,,,,,i´ ,,i´ ,i´ ,「 .:| .~''''″
.r″ .|゙l、 “ .,i″.yi入-イ il∠i、.` .,メ| | 」'ト .,,i´ .,i´ ,, ̄ .[ .,i´.,,,,,,! .]_
.゙l_,i´,レ .'_,,,,レ ~''┐ .,r°.,i´.| .| ,l゙ :゙l、 ,,i´ ,i´ l゜.゚L__ .:―ヤ゚″_ :~''=、
.,r″.,x=,, .,i´ ,x'".,,x'″ .゙l、 ゙冖''″ .] | .,i´ .゙l, .~1 .゚L '゙〃 ,n, .,,}
.,l彡'''″ .゙~"''''''''''"゜ .テ''~゛ .:゚'―---―・° ―″ .~''¬―'″ .:゚=_,r
318:デフォルトの名無しさん
09/02/16 17:47:44
皆様こんばんは。
VC++ ExpressEditionでのリーソスの事について質問させてくダサイ。
(Resource.h)
#define GAZOU000 1000
#define GAZOU001 GAZOU000 + 1
: :
: :
#define GAZOU030 GAZOU001 + 030
(Resource.rc)
GAZOU000 BITMAP "bmp000.bmp"
: :
: :
GAZOU030 BITMAP "bmp030.bmp"
これでビルドしようとしたら
.\Resource.rc(5) : error RC2135 : file not foundみたいなのが
ズラズラズラ〜〜〜っと出てきました。
仕方が無いのでResource.hの、
#define GAZOU030 GAZOU000 + 30みたいに記述しているのを
全部#define GAZOU030 1030のように書き直したらビルドできました。
なぜ最初の書き方でダメだったんですか
319:デフォルトの名無しさん
09/02/16 21:07:15
最初の書き方だと、
GAZOU001 BITMAP "bmp001.bmp"
のGAZOU001をマクロ展開すると、
1000 + 1 BITMAP "bmp000.bmp"
になるだろ?リソースファイルはスペースを区切りと扱うので、正しく認識できなくなる。
320:デフォルトの名無しさん
09/02/16 21:57:46
>>319
えー!そうなんですか〜
初歩的ミスだったのですね。お恥ずかしい・・・
でも、お蔭様で、またひとつ勉強になりました。
ありがとうございました。
321:デフォルトの名無しさん
09/02/16 22:04:41
>>316
大抵の場合、フルビルドを立て続けにやることはなく、プリコンパイルヘッダの効果で意味がないと思われ
322:デフォルトの名無しさん
09/02/16 22:37:19
google C++コーディングスタイルに、
cppファイルの無名名前空間の使用は推奨されてたのですが
理由はなぜでしょうか。cppファイルは別に何をやってもいいような。
cppファイルですらusing使うのは駄目なの?
323:デフォルトの名無しさん
09/02/16 23:46:37
>>322
ほかのcppファイルから見える必要のないものを隠すために使えという意図だと思う。
同じ目的で、名前空間上のstaticも使えるけど、
一般的に、この意味ではstaticより無名名前空間のほうが推奨されている。
324:デフォルトの名無しさん
09/02/16 23:57:52
static指定のかわりですか、なるほど。
名前空間上の関数定義だったら別だけど
クラスのメンバ定義だけしか書かない分には
気にしなくてもいいのかな。
>staticより無名名前空間のほうが推奨されている。
これは等価だと理解してましたが、なぜでしょう。
どっちも他のファイルからは見えないのに?
325:デフォルトの名無しさん
09/02/17 00:39:05
>>324
もともとC/C++のstaticに静的記憶期間とファイル内って2つ意味があるのはややこしいから、
後者の意味を分離しようという動機で無名名前空間が導入されたという経緯がある。
だから大事に使ってあげてねと言うわけ。
326:デフォルトの名無しさん
09/02/17 03:30:11
>>324
C++ ではオーバーロードやテンプレートの関係で、クラス名などもグローバルな定義の
識別に使われるので、関数や変数以外に class, struct, enum も別々の .cpp で同じ
名前空間内に同じ名前のものを定義するとマズイ。これが無名名前空間で解消できる。
327:デフォルトの名無しさん
09/02/21 02:20:15
お題。
ISO/IEC 14882:2003とXLib、Win32APIの範囲内でスクラッチからエディタを作る。
Win32、XLibともに標準C++ライブラリとかぶる機能があるが、この場合
標準C++を優先して使う。
これは、少しでも移植性を高めるための努力と考えてほしい。
また、拡張性の担保ともなりうる。
これは時間かかるけど、やりがいあるよ?
328:デフォルトの名無しさん
09/02/21 02:56:40
なんだコピペだったのか。
329:デフォルトの名無しさん
09/02/21 03:02:01
まずISO/IEC 14882:2003がなんなのか調べるのめんどくせえから挫折
→XlibかWin32?どうせなら両立できるwxだろと意気込むがインストール失敗して挫折
→そもそも標準C++が分からなくて挫折
→努力なんかできなくて挫折
→わたるが死んじゃう!(自殺)
330:デフォルトの名無しさん
09/04/11 22:30:51
すいません
CとC++を実践の中で学びたいのですが
なにを作ればいいか、というよりなにをその言語で作れるのか漠然として・・・
JavaやC#のようなオブジェクト指向言語ならイメージ浮かびやすいんですけど
コンソールだとコントロール等がないのでどうしても・・・
331:デフォルトの名無しさん
09/04/12 00:19:13
C++もオブジェクト指向言語なんだが・・・
332:デフォルトの名無しさん
09/04/12 09:37:07
つーか、好きにライブラリを選べばいいのがC/C++流。
333:330
09/04/12 10:24:27
そういやC++もオブジェクト指向言語でしたw
まだイメージができないあたり、ライブラリの知識が不足しているようですね。
334:デフォルトの名無しさん
09/04/12 10:29:32
ライブラリの前にオブジェクト指向と言語仕様の知識も不足してる
335:デフォルトの名無しさん
09/04/12 11:54:22
それを言ったら情報工学の基礎から何から全部だろう
ポトペタでさくさく作っている間は必要のない知識だ
336:デフォルトの名無しさん
09/04/12 12:45:19
なんだポトペタって。
337:デフォルトの名無しさん
09/04/12 19:33:18
一覧からマウスで選択したコントロールをフォームに
ポトっと落とすとペタっと張り付く機能やそれを備えたIDEのこと
338:デフォルトの名無しさん
09/04/13 00:50:39
Stringクラス的なものを参考すればいいんじゃね?
まさにコントロールじゃない目に見えないクラスオブジェクト。
339:トミー ◆xb8eIST5.k
09/04/25 20:19:22
>>182
ぼくもそれをダウンロードして使ってみました。
うまくいきそうです。
どうもありがとうございました!
340:トミー ◆xb8eIST5.k
09/04/25 20:21:25
>>339はこのスレの>>155です。
341:デフォルトの名無しさん
09/05/10 22:02:48
ここはvc++は駄目かえ?
342:デフォルトの名無しさん
09/06/07 16:31:54
正の数であれば、小数点以下を四捨五入する場合、0.5を足して、intで切り捨てればいいのですが、
負の数も含めて、四捨五入をする場合、どのようなコードを書けばよいのでしょうか?
343:デフォルトの名無しさん
09/06/07 19:14:53
GUIアプリを作るのにC++を勉強しようと思っているのですが
VC++EEとBCCどっちが作り易いですか?
また言語自体はどちらも同じですか?
344:デフォルトの名無しさん
09/06/07 19:20:10
GUIはスクリプトで出来る
345:デフォルトの名無しさん
09/06/07 19:21:35
VC++EEとBCCで選ぶと結局は、VC++EEが簡単だろう。
ATL/WTLなどもあり対応しているライブラリも多い。
346:デフォルトの名無しさん
09/06/07 19:22:57
rubyでGUI作れなければ、C++ではもっと無理。まずこれでやってみれば
347:デフォルトの名無しさん
09/06/07 22:30:11
>>342
x=(int)(x+.5-(x<0));
でよいか?
348:デフォルトの名無しさん
09/06/07 22:35:28
>>344-346
VC++使うことにします。
ありがとうございました。
>>346
C++は以前触ったことがあります。昔すぎて何も覚えてませんが…
349:デフォルトの名無しさん
09/06/07 22:41:43
>>342
abs関数はどうですか
350:デフォルトの名無しさん
09/06/08 10:46:27
>>342 >>347
なんで cast なんか四捨五入で使うの?round とか使わない?
cast なんてそんなに無闇に振り回すものじゃないと思うけど。
351:デフォルトの名無しさん
09/06/08 11:31:01
>>350
round()なんて関数ないぞ
352:デフォルトの名無しさん
09/06/08 12:44:07
>>351
すまん。ちょっと説明不足だったかも。厳密にいえば round/lround/rint/lrint
等々は C99 の規格みたい(といっても今や 2009 だが)。
プラットフォームによってはいまだに使えないのかも。
353:デフォルトの名無しさん
09/06/08 18:55:43
castはそんなに振り回すもんじゃ無いのは同意だが
このケースは真っ当な使い方だし問題ない
が、>>350みたいにそういう判断ができないなら使うべきではないな
354:デフォルトの名無しさん
09/06/08 22:18:13
俺は cast 使わないでもサクッとできるなら使わない方を選ぶな。
355:デフォルトの名無しさん
09/06/08 22:28:06
昔からあるやり方だから、一種の慣用句。
BASICでも同じようなことしてたと思うし。
356:デフォルトの名無しさん
09/06/08 23:45:37
>>353
「これは真っ当」というけど、intでoverflowの心配はしなくていいの?
別に一般にcastが良いか悪いかは別としてこの場合の素朴な疑問。
357:デフォルトの名無しさん
09/06/09 00:33:41
それも含めて分かって使ってるかということだろう。
358:デフォルトの名無しさん
09/06/09 00:35:52
>>357
それなら今回のケースは情報不足で
> このケースは真っ当な使い方だし問題ない
と言い切る根拠は無いように思うが。
359:デフォルトの名無しさん
09/06/09 02:53:47
言い切る根拠ねぇ。。
根掘り葉掘り前提を聞かないと、うかつにコメントしちゃいけないのもどうかと思うが。
360:デフォルトの名無しさん
09/06/12 00:09:27
プログラミング言語C第2版には「A.6.3.整数と浮動小数点」の項に
>浮動型の値を整数型に変換するときには、小数部分は無視される
とあるんだけど、実数xの少数分 x-[x] なので、例えば-2.3の整数部分は-3となり、
(床関数:Wikipedia項目リンク)
結局、int a = -2.3 の結果は -3であるべきかな?かなかな?
361:デフォルトの名無しさん
09/06/12 00:34:11
>>360
いや、それは-2になる。
ここで言う小数部分を無視というやり方は、数学的定義とは関係なく
(絶対値が)0に近づく方向へ切り捨てるということ。
ここまで書いてから気付いたが、その記事の下の方にC言語の場合もきちんと書いてあるじゃないか。
362:デフォルトの名無しさん
09/06/12 00:41:50
きちんと
>『独自研究』に基づいた記述
と書かれていますね。
363:デフォルトの名無しさん
09/06/12 00:50:03
ANSI C
3.2.1.3 Floating and integral
There was strong agreement that floating values should truncate toward zero when converted to an integral type,
the specification adopted in the Standard. Although the Base Document permitted negative floating values to
truncate away from zero, no Committee member knew of current hardware that functions in such a manner.
[Footnote: We have since been informed of one such implementation.]
整数型への変換時に浮動小数点数はゼロに向かって切り捨てるように強く言われた。
規格でも標準で採用した。でも、元にしたドキュメントでは負の浮動小数点数は
ゼロから離れる方に切り捨てることを認めていた。当時の委員の誰一人として現行のハードウェアがこのように振る舞うとは知らなかった。
[注釈: 我々委員会はそのような実装を伝えられていた。]
適当に訳したので間違っているかもしれない。
元にしたドキュメントは、負数の時はどっちでも良かったけど、
この規格では、ゼロに向かって切り捨てますよん。ってことだと思われる。
364:デフォルトの名無しさん
09/06/12 01:01:57
おぉ、すばらしい!
これで安心して負数を丸められる。
365:デフォルトの名無しさん
09/06/12 01:02:05
>>362
きちんと英語版のノートでは、規格で0方向への丸めだと指摘されている。
366:デフォルトの名無しさん
09/06/14 01:49:25
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main(){
string str;
fstream file;
file.open("test.txt",ios::in);
file>>str;
file.close();
int h=str.length();
cout << h<<endl;;
const char *seq1 = new char[h];
seq1=str.data();
delete[] seq1;
}
これどこか悪いですかね?実行時に強制終了になってしまう。
削っていって原因の箇所を特定したところ、delete[] seq1; の一行が悪いみたいなんですが、正直何が悪いかが理解できんのです。
bcc5.5で作業中です。
367:デフォルトの名無しさん
09/06/14 02:04:06
seq1=str.data();
これじゃよ。data() や c_str() の仕様をみるのじゃ。
記録するな。使ったらすぐ捨てろ。わかったな、今畜生。
368:デフォルトの名無しさん
09/06/14 02:05:26
>>366
やっぱり釣りなのね?
釣りに決まってる。
釣りではないなんていわせない。
釣りでなくちゃおかしい。
釣りだよね?
釣 り だ よ ね?
369:デフォルトの名無しさん
09/06/14 02:11:52
とりあえずわかったことは私はウンコマンということでしょうか。
つまりはチンカス以下。チンチンの先っちょについたティッシュのカスを師と崇めて行けというほどの。
ちょっと出直してくる。ありがとうござました。
370:デフォルトの名無しさん
09/06/14 02:16:22
>>366
#include <algorithm>
seq1 = str.data(); → std::copy(str.begin(), str.end(), seq1);
別にmemcpyでもいいんだけど。
371:デフォルトの名無しさん
09/06/14 02:21:00
>>366
> const char *seq1 = new char[h];
配列 new なんか使うからだ。
std::vector<char> seq1(str.begin(), str.end());
にしとけば int h も delete seq1 も要らない。
372:デフォルトの名無しさん
09/06/14 02:22:41
>>371
そもそもstringのまま扱うのでいい気がしてくる。
373:デフォルトの名無しさん
09/06/14 18:57:00
int main(){
string seq1;
とすればいい。コピーする手間もない
374:デフォルトの名無しさん
09/06/14 19:40:25
すいません、質問宜しいでしょうか?
vc++なのですが、ダブルクリックするとAP画面を開きだすタイプのexe(コマンドプロンプトが開くタイプではないexe)の
ソースコード内にて『cout文』が記述されています。
コマンドプロンプト以外のどこかに内容が出力されていたりするんでしょうか?
分かりにくいと思いますが、よろしくお願いいたします。
375:デフォルトの名無しさん
09/06/15 09:27:30
>>374
恐らく、電子の藻屑と消えています。
376:374
09/06/15 22:14:59
>>375
ありがとうございました。
377:デフォルトの名無しさん
09/06/16 09:22:17
どうしても回収したいなら標準出力をリダイレクトすればファイルに落とせるんじゃないかな。
詳しくは環境依存C/C++スレかWinAPIスレ辺りで。
378:デフォルトの名無しさん
09/06/30 00:19:00
Linuxアップデートしたらatoi( )無くなって驚いた。
奴は引退したんだな。
379:デフォルトの名無しさん
09/06/30 00:43:00
そなの?
うちのLinuxはアップデートしてもいなくなってなかったよ
380:デフォルトの名無しさん
09/06/30 01:06:00
itoa()は引退するかもしれないがatoi()は標準関数でしょ
381:デフォルトの名無しさん
09/06/30 09:55:51
はい、atoi()はdeprecated3人組の筆頭ですからおいそれとはなくなりませんよ。
382:デフォルトの名無しさん
09/06/30 19:01:01
itoaを標準化しろよ
あるいは%bを
383:デフォルトの名無しさん
09/06/30 21:09:00
itoa()はやっぱし簡単にsprintf()で代用できるから標準じゃないのかなあ
それにしてはatoi()にはstrtol()という基数変換関数が用意されているし
いまいち対称性に欠けるよなあ
384:デフォルトの名無しさん
09/07/01 09:11:55
Cの標準ライブラリに関しては、対称性なんて考え出したら禿げるよw
385:デフォルトの名無しさん
09/07/01 10:38:00
ネーミングにセンスがないのは仕方ないよなあ
昔のCは昔のFORTRANと同じく識別子は先頭の6文字しか
認識しなかったからなあ
だから無秩序な切り詰めで読みにくいったらありゃしない
create()かcreat()になっているし
この当たりはK&Rのジョークにも出てくるが
386:デフォルトの名無しさん
09/07/01 11:17:53
このスレまじ勉強になりすぎワロタ
387:デフォルトの名無しさん
09/07/01 18:37:21
>>385
creatについては字数制限だという風に広まった方が彼も喜ぶか
388:デフォルトの名無しさん
09/07/01 19:48:48
winbase.hについて教えてください。
win32コンソールアプリでプロジェクトを作ると古いwinbase.hが
インクルード対象になってGetProcessHandleCountなどが
定義されていません。
プラットフォームSDKのwinbase.hだと定義されてます。
これはwin32コンソールアプリでは新しいAPIをサポートしていないと
言うことでしょうか。
無理やり古いwinbase.hに突っ込んだら動くには動いたのですが
別の方法で新しいAPI関数を、コンソールアプリで使う方法は
ないでしょうか?
389:デフォルトの名無しさん
09/07/01 22:47:35
パスの順番を変える
390:388
09/07/02 14:34:04
お返事ありがとうございます。
読み込むインクルードファイルのパスを
変えるということでしょうか。
調べてみます。
391:デフォルトの名無しさん
09/07/02 20:46:04
環境変数ならその順番、ツールなら書いた順番
VC++なら設定のとこで上下に動かして優先順位変えられるべ
392:388
09/07/03 01:03:15
バージョンは2005なのですがなかなか
設定できるところが見つかりません。
もうちょっと調べてみます。
393:デフォルトの名無しさん
09/07/03 02:09:35
インクルードパスの設定はうまくいっていて、
WINVERとかを設定していないだけということはないよな?
394:デフォルトの名無しさん
09/07/03 10:49:13
コピーしたら動いたらしいから大丈夫では?
VCの基本だが、、、ツール - オプション - プロジェクトおよびソリューション - VC++ディレクトリ
プラットフォーム[Win32] ディレクトリを表示するプロジェクト[インクルードファイル]
で該当のインクルードパスを追加、もしあるなら上に移動
395:392
09/07/03 18:24:08
色々とすみません。
みてみたのですがオプションのプロジェクトとソリューションの下に
VC++の階層がありませんでした。
なぜ出ていないのか調べてみます。
396:デフォルトの名無しさん
09/07/03 21:28:58
左の三角クリックしても出てこない?
397:395
09/07/04 01:24:57
ありがとうございます。
見当たらないです。
VBの環境設定と、もう一つなんかしかないんです。
何が悪いのやら・・・
398:デフォルトの名無しさん
09/07/04 01:38:24
VisualBasicの規定値と全般かビルド/実行あたりか。
変だなあ、、、設定のインポートとエクスポートからリセットしてみては・・・
399:397
09/07/04 11:12:02
ありがとうございます。
設定のインポートとエクスポートはありました。
それで初期化して見ます。
非常に助かります。
結果、ご報告させていただきます。
400:399
09/07/06 10:06:25
おはようございます。
設定のインポートとエクスポートで
環境の初期化ができました!
早速ディレクトリを色々いじってみます。
401:デフォルトの名無しさん
09/07/06 10:49:35
ホビープログラマさんかしら
いじる前に初期化した状態でビルドしてみたらどう?
402:400
09/07/06 15:21:49
御助言ありがとうございます。お察しのとおり自分は素人です。
設定初期化後にビルドしても識別子が見つかりませんになりました。
インクルードファイルの上位をSDKにしてもだめでした。
また、コンソールアプリのwinbaseには_WIN32_WINNTの
定数が0500までしかなかったので0501以降のAPIは事実上
未対応なのがコンソールアプリの習いなのでしょうか。
インクルードの優先設定に間違いがないか調べてみます。
403:デフォルトの名無しさん
09/07/06 16:29:59
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(VCInstallDir)PlatformSDK\include
$(FrameworkSDKDir)include
特に変更してない、うちの環境はこんな順になってる。
404:402
09/07/06 18:02:09
わざわざありがとうございます。
自分の環境も同様に無印が一番上でした。
となるとインストールパッケージのせいなんでしょうか。
自分のはプロフェッショナルのSP3でした。
405:デフォルトの名無しさん
09/07/07 01:33:09
そんで、どこにあるwinbase.hが気に入らないの?
それと、ホビープログラマさんがなんでわざわざプロフェッショナル版を買っちゃった(んだよね?)の?
406:デフォルトの名無しさん
09/07/07 01:55:39
プロフェッショナルになりたいからじゃないかな。
自分もお金合ったらプロフェッショナル版ほしかったなぁ。
あの赤いパッケージが3倍開発速度が速くなりそうな感じがしていい。
407:404
09/07/07 10:14:45
おはようございます。
visual studio 8フォルダのvcフォルダ直下のincludeフォルダ内のwinbaseです。
ファイルの日付も古いのでコンソールでは新しいAPIは対応してないのかと
思いました。
プロフェッショナルバージョンを購入したのは
おっしゃる通り目標でして。。
今は事務なのですがいつかは開発に行くのが目標なんです。
408:デフォルトの名無しさん
09/07/07 14:35:05
C:\Program Files\Microsoft Visual Studio 8\VC\include
うちはここにはwinbase.hないなあ。
ちゃんと情報出しとけば7/2ぐらいにはいろいろ解決できてただろうね。
409:407
09/07/07 22:30:29
定数「_WIN32_WINNT」の値を0x501で定義し、VCの設定を初期化し
$(VCInstallDir)includeを最上にした状態で、リビルドしたら
上手くいきました!
includeの参照がPlatformSDKに変わってました。
先達の皆様、色々とありがとうございました。
410:デフォルトの名無しさん
09/07/09 23:29:34
#include <stdio.h>
#define N 10
int main(void){
int i, j = 1, x, y;
int d[N][N]={};
/* 三角形を作成 */
for (i = 1 ; i < N ; i++, j = 1){
d[i][0] = 1;
while (j <= i - 1){
d[i][j] = d[i-1][j-1] + d[i-1][j];
j ++;
}
}
/* 三角形の表示 */
for (y = 0; y < N; y++) {
for (x = 0; x < N-y-1; x++)
printf(" ");
for (x = 0; x < y; x++)
printf("%5d ", d[y][x]);
printf("\n");
}
return 0;
}
スレリンク(tech板:835番)
スレリンク(tech板:440番)
これでどうかな?
411:デフォルトの名無しさん
09/07/12 09:10:31
なんかひどいものを見た。
412:デフォルトの名無しさん
09/07/14 23:10:33
・環境変数の設定がおかしくてヘッダファイルが見つからない
・ヘッダファイル名をタイプミスした
のどっちかじゃないかなあ?
スレリンク(tech板:957番)
スレリンク(tech板:785番)
413:デフォルトの名無しさん
09/08/14 17:15:35
新規作成→プロジェクト→Win32→Win32プロジェクト
で作成したVC++のアプリが
Net3.5を入れないと「構成が正しくない…」のエラーで
起動出来なかったのですが
ネイティブなWin32アプリのはずなのに
別途ランタイムが必要だったのはなぜでしょうか?
構成やコードを何度も見直しましたが
Win32 APIしか使用してません
414:デフォルトの名無しさん
09/08/16 18:45:59
Microsoft製品にはよくある現象。
Visual Studio 2008なんてC++しか使わない人でも
C#をインストールしなければならないという罠を実装。
415:デフォルトの名無しさん
09/08/16 20:06:29
いままでそんな事態に遭遇したことないわ
416:デフォルトの名無しさん
09/08/16 23:59:19
.NET3.5を入れるときにたまたまCランタイムのDLLもインストールされただけだろう。
/MTでやっとくと解決するかもね
417:デフォルトの名無しさん
09/08/17 13:28:48
リリースビルドにした?
418:デフォルトの名無しさん
09/08/17 20:02:59
>>416
/MTでやったらエラーは出ず
Net3.5を入れなくても動作しました
>>417
もちろんリリースビルドのexeです
VS2008で作ったのをXP SP2で確認したのだけど
特別なAPIを使った訳でもないし
ネイティブなWin32アプリが動かなかった原因は未だ分からず
419:417
09/08/18 00:27:15
>>418
状況から察するに別マシンで動かしてるんだよね
もちろんリリースビルド、というのだから、もちろんランタイムDLLも別マシンにインストールしている?
420:デフォルトの名無しさん
09/08/18 04:20:34
WIN APIのみのネイティブなアプリなら
クライアント側は他にランタイムは不要じゃないの?
自分は開発したことないから詳しくは知らないけど
421:デフォルトの名無しさん
09/08/18 09:58:07
ここでいうランタイムはC標準関数のランタイム
/MTはスタティックリンク
/MDはダイナミックリンク(DLL)
422:デフォルトの名無しさん
09/08/19 00:12:37
>>416の1行目が正解のはず。
その場合、.NET Frameworkを入れずともVisual C++ランタイムだけをインストールすればいい。
現在、最新のはこれ。
VC++ 2005
URLリンク(www.microsoft.com)
VC++ 2008
URLリンク(www.microsoft.com)
423:デフォルトの名無しさん
09/08/19 02:31:50
>>422
みんな正解を言っている。
そんで、Win32APIだけしか使っていないのにmsvcrtを入れなければならない理由は何?
というとこまで進んでたんじゃないの?
424:デフォルトの名無しさん
09/08/19 02:34:32
もちろん、>>417も、
ランタイムをインストールしたが動かない
→Debugビルド版のdllは頒布されていない
という穴にはまりやすいという点で有意義
425:デフォルトの名無しさん
09/08/19 14:26:00
つまりWin32 APIのみのソフトでも
ランタイムから何らかの機能を使っていて
単独では動作不可ということか
そのランタイムは何かと一緒にインストされる事多いし
普段は目に見えない部分だから勉強になるなぁ
426:デフォルトの名無しさん
09/08/19 17:34:19
>>425
本当にWin32 APIだけで組めばCランタイムはいらないよ。
printf()もmalloc()もスタートアップルーチンも使えないけどな。
427:デフォルトの名無しさん
09/08/19 17:39:44
マングリングの兼ね合いで同一バージョンでビルドされたDLLが必要になったりしないもんなの?
428:デフォルトの名無しさん
09/08/19 17:51:20
全てを同一バージョンでビルドするのが前提でも、extern "C"するのが普通だと思う。
429:デフォルトの名無しさん
09/08/20 21:24:16
すいません、質問させてください。
AfxBeginThreadを使ってマルチスレッド処理をおこなっているのですが、
制御関数の中でreturnして終わらせているはずなのに、
AfxBeginThreadの戻り値のCWinThread*が生きたままになっています。
そこで制御関数の中でおこなっているreturn処理に問題があるのではないかと
考えているのですが、
rerturn 0
と
return -1
ではスレッド終了の動作に何か違いがあるのでしょうか?
430:429
09/08/20 22:22:31
何度もすいません。質問を変えます。
CWinThread* th;
th = AfxBeginThread(func,this);
uint aaa::func(LPVOID lpvThis)
{
〜略〜
if(){
return 0;
}
else{
return -1;
}
}
1.AfxBeginThread内でreturnした時点でスレッド自体は終了しているが、『th』は生成されている。
(th->m_hThreadはnullだがthはnullではない)という認識でよろしいでしょうか?
2.returnされた値が0か-1で動作上違いはあるのでしょうか?
3.returnされた値が0か-1でthの中身は違うのでしょうか?
431:デフォルトの名無しさん
09/08/20 23:27:28
m_bAutoDeleteがFALSEの場合はスレッド作成側で破棄しないとダメだよ。
自動で破棄されるようにするには、サスペンド状態で開始し、m_bAutoDeleteをTRUEにし、リジュームする。
432:429
09/08/21 10:36:16
429です。
あれからいろいろ調べました。
430の問について
>>2.returnされた値が0か-1で動作上違いはあるのでしょうか?
ない。GetExitCodeThreadを使って戻り値を判別しようと思えばできる。
>>3.returnされた値が0か-1でthの中身は違うのでしょうか?
違わない。AfxBeginThreadが実行された時点でthは生成される。
制御関数内でreturnされた値によって生成される、されないが決まるものではない
(厳密に言うとreturnされた時点でth->m_hThreadの値が変わるので、違うといえば違うのだが、、、)
というところまでです。
まだ分からないのが1なのですが、
一度生成された『th』が自動的にnullになることはあるのでしょうか?
431さんの言うとおり、サスペンド状態で開始し、m_bAutoDeleteをTRUEにし、リジュームすれば
『th』は自動的にnullになるのでしょうか?
逆にサスペンド状態で開始せず、リジュームしない状態ならばth』が自動的にnullになることはありえないのでしょうか?
431さん、ありがとうございます。
m_bAutoDeleteなのですが、あれって初期値はtrueですよね。
m_bAutoDeleteがtrueの場合はサスペンド状態で開始、リジューム等の処理をおこなわなくても自動的に破棄されるのでしょうか?
433:デフォルトの名無しさん
09/08/21 13:48:43
class CTest
{
private:
int a;
public:
setValue(int val); // valをaに格納
};
CTest test;
test.setValue(10);
sprintf(buff,"%d",test);
こうやると10がbuffに出力されるんですが
これはよくないやり方ですよね (稀に不正な結果になりました)
test+=10;
if (test>=10) ...
++test;
int val=(int)test;
こういうのはoperatorを使えばaを対象にさせることができますが
sprintf(buff,"%d",test);
やはりこういうふうにtest単体だけを置いても
実際にはtest.aが返るようにするのは無理でしょうか?
何らかのoperatorが暗黙で呼ばれないかと思ったのですが
どれを使っても駄目でした
434:デフォルトの名無しさん
09/08/21 13:59:53
>>433
一応C++ではiostreamを使うべしということになっている
435:デフォルトの名無しさん
09/08/21 15:49:04
>>433
intへの変換を定義して
sprintf(buff,"%d",(int)test);
ってやるのは?
436:デフォルトの名無しさん
09/08/21 17:45:22
>>434
iostreamって<<とかするやつですよね?
これってあらゆるケースで機能するんでしょうか?
出力以外でも普通の変数のように振舞いたいんです
//void func(int);
func(test); // test.aが渡ってほしい
>>435
もちろんoperator intなどもやってます
でもこの書き方はintという型でほしいからであって
普段は型を意識しないようにしたいんです
437:デフォルトの名無しさん
09/08/21 17:58:19
>>436
> //void func(int);
> func(test); // test.aが渡ってほしい
intへの変換が定義されていれば、そのように振る舞う
> 普段は型を意識しないようにしたいんです
プログラマが型を意識せず、引数の型を意識しないprintf系関数を用い、誰が型を判断するのか。
ビャーネはそれが嫌いでiostreamを使うようにすべきと主張しているのではないか
438:デフォルトの名無しさん
09/08/21 19:34:19
>>437
>> func(test); // test.aが渡ってほしい
>intへの変換が定義されていれば、そのように振る舞う
おっとすいませんこれは問題なかったですね
型がわからないsprintfなどが問題でした
>ビャーネはそれが嫌いでiostreamを使うようにすべきと主張しているのではないか
うーんなるほど
ちょっとiostreamを考えてみます
439:デフォルトの名無しさん
09/08/22 00:12:28
関数の引数でどの型でも指定出来るようにしたいのですが
ポインターを使ってアドレス渡しをする方法以外に
何かないでしょうか?
printfの変数指定する引数のような感じです
440:デフォルトの名無しさん
09/08/22 01:15:44
>>439
printf: 可変個引数(1番目の引数、書式文字列で引数の型を判別)
iostream: 想定される型に対して全部多重定義しておく
ほか、場合によってはテンプレートやBoost.Anyという手も使える。
441:デフォルトの名無しさん
09/08/23 13:24:37
何をしようとしてるかに依るだろうね。比較的一般的な型が扱える関数
なら template が一番自然に思う。swap みたいに。ただ、swap は
定義されてるし、アドレス与えてるけど。
442:デフォルトの名無しさん
09/08/25 05:41:24
質問があります。
C++でオブジェクトを作るとき
1)MyObj = a;
2)MyObj = new MyObj();
上の違いって、1はスタック上にオブジェクトを作っている
2はヒープ上にオブジェクトを作っている
というような解釈でいいのでしょうか?
ということはJavaやC#は、基本的にプリミティブタイプ以外
オブジェクトはすべてヒープ上に作られているということですか?
443:デフォルトの名無しさん
09/08/25 07:44:10
>>442
1)と2)の例がおかしいし、C++がそうだとしてそれをJavaやC#にも当ては
めるのは論理的ではない。
444:デフォルトの名無しさん
09/08/25 12:17:33
>>443
すみません
1)MyObj a;
でした・・・
理論的ではないのでしょうか?
C++でもヒープ上で使われなくなったオブジェクトをガービッジと呼ぶと聞いたので根本的な部分は一緒なのかな、と思いまして・・・
445:デフォルトの名無しさん
09/08/25 12:37:23
>>444
・>443は「論理的ではない」と指摘している。「理論的」かどうかは言及していない。
・例がおかしいのは結局直っていない。
・「ヒープ上で使われなくなったオブジェクト」は「ガービッジ」とは呼ばれない。
・JavaやC#の実装がC++と同じである保証はない。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4854日前に更新/246 KB
担当:undef