トップページ⇒tech
986コメント346KB

★初心者にVisual C++を教えるスレ★ Part38

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/11/03(木) 00:54:48.61
Visual C++入門者・初心者からの質問を、
お兄ちゃんお姉ちゃん達が優しく、時には厳しく回答してくれるスレッドです。

■質問するにあたって
・エラーや警告のときはエラーメッセージを書きましょう。
・開発環境も書きましょう、特にWindowsForm、MFC、Win32アプリケーションの区別。
・できるだけ具体的に。

質問の仕方については次のページが大変参考になります。
http://www.hyuki.com/writing/techask.html

■回答するにあたって
・回答する場合はその答えに至るための「コツ」も書いてあげると良いでしょう。
 (MSDNのどの項目だとか、何のキーワードでGoogleするとか)
・ネタや煽りは軽く流しましょう。

【過去スレ】
Part37 http://hibari.2ch.net/test/read.cgi/tech/1299982561/
Part36 ttp://hibari.2ch.net/test/read.cgi/tech/1273939582/
Part35 ttp://pc12.2ch.net/test/read.cgi/tech/1256645713/
Part34 ttp://pc12.2ch.net/test/read.cgi/tech/1245382769/
Part33 ttp://pc12.2ch.net/test/read.cgi/tech/1235292263/
0472デフォルトの名無しさん2012/08/23(木) 01:33:38.73
しない
0473デフォルトの名無しさん2012/08/23(木) 17:51:53.90
そうだったんですね
ありがとうございました
0474デフォルトの名無しさん2012/08/26(日) 21:06:18.92
同じ実行ファイルを実行した時に
XP以前ならクラシックスタイル
XPならXPスタイル
VistaならVistaスタイル
7なら7スタイル
で表示するようにするにはどうすればいいですか?
それぞれ別の設定でビルドするしかないですか?
0475デフォルトの名無しさん2012/08/26(日) 21:52:41.14
GetVersionExでOSごとに描画を変える
0476デフォルトの名無しさん2012/08/26(日) 22:45:28.41
動的に確認できるんですね
ありがとうございました
0477デフォルトの名無しさん2012/08/26(日) 22:56:28.91
マニフェストファイルの以下の部分に指定した文字列は実行ファイルをメモ帳とかで開いた時しか見えませんか?
<assemblyIdentity
・・・
name="この部分"
・・・
/>
<description>この部分</description>
タスクマネージャのプロセスタブにある「説明」の欄に表示されたり
プロパティでは表示されないみたいですが
また別物なんですか?
0478デフォルトの名無しさん2012/08/26(日) 23:04:24.06
リソースのバージョンインフォじゃね
0479デフォルトの名無しさん2012/08/26(日) 23:42:01.08
ありがとうございます
内部で使用されるだけなんですね
0480デフォルトの名無しさん2012/08/27(月) 00:43:56.58
ビジュアルスタイルを適用するマニフェストファイルのprocessorArchitectureの値(x86)は
ソース上だと#defineで分岐するとビルド時のシステムに搭載されているCPUを気にしなくてもいいのですが
.xml上で自動で搭載されているCPUに合った値を使用する方法はありますか?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

またOSによってビジュアルスタイルが変わると思うのですが
dllを読み込むのだからOSが使用できるビジュアルスタイルが自動的に描画される
という認識であってますか?
0481デフォルトの名無しさん2012/09/04(火) 01:45:17.53
質問です。VC++6.0でダイアログを作成しています。
ダイアログにはリストボックスがあり、スレッドの中でリストボックスにアイテムを追加したいと考えています。
MFCを使用しています。スレッドは_beginThreadで呼び出しています。

リストボックスのオブジェクトを取得するために以下のようにして取得をしたいと考えています。
CListBox* List = (CListBox*)GetDlgItem(リストボックスのID);
この処理はダイアログ::OnInitDialog()のような継承を行った部分の中では問題なく使用できるのを確認したのですが、
これを使ってスレッド内でオブジェクトを取得するにはどうしたらいいか悩んでいます。
スレッドは以下のような関数を呼び出しています。
void Thread(void* p){
  //処理
}
スレッドの中でリストボックスのオブジェクトを取得してリストボックスにアイテムを追加する方法の知恵を授けては頂けませんでしょうか
0482デフォルトの名無しさん2012/09/04(火) 01:47:56.44
スレッドにListを渡してやればいい
0483デフォルトの名無しさん2012/09/04(火) 02:05:55.94
>>482
なるほど
先にCListBox* List = (CListBox*)GetDlgItem(リストボックスのID);として
_beginThread(Thread,0,List);のように引数にListを渡すということでしょうか?
この考え方が間違ってたら申し訳ありません。
0484デフォルトの名無しさん2012/09/04(火) 02:10:28.96
はい
0485デフォルトの名無しさん2012/09/04(火) 02:21:04.38
スレッドの中でオブジェクトが取れなければ外で取ればいいじゃないということですね。
それだと複数引数で渡したい場合は構造体にでも入れて渡せば問題なさそうです。
回答ありがとうございます。非常に助かりました。
0486デフォルトの名無しさん2012/09/04(火) 21:56:06.00
もう解決したみたいだけど。
そもそもワーカースレッドの中で画面アイテムの更新て出来たっけ?

そう言う場合、リストボックスに入れるデータを格納したバッファなりを作って、スレッドではそこにデータを格納。
続けてウィンドウメッセージかなにかでウィンドウにメッセージを送ってメインスレッド(て言うんだっけ)でリストを更新、
て流れでいつも作ってた。
0487デフォルトの名無しさん2012/09/04(火) 22:20:13.57
内部ではSendMessageしてるから大丈夫
0488デフォルトの名無しさん2012/09/05(水) 11:30:23.73
教えて下さい!
Photoshop CS5のプラグインを作りたくて
Visual Studio 2010 Express (C++)をインストールして

次に、
PhotoshopCS5 SDK(forWindows)
ttp://www.adobe.com/devnet/photoshop/sdk.html
をダウンロード

試しにサンプルでもと思い。
「\adobe_photoshop_cs5_sdk_win\pluginsdk\samplecode\selection\selectoramashape\win」内の
「SelectoramaShape.vcproj」をダブルクリック!!

VS「変換ウィザードへようこそ」???→なんか知らんが、完了!
VS「変換中にエラーがあったよ」→閉じる。。。
ソリューションファイルからならイケる!(ってどっかのサイトに書いてあった)
VS「変換ウィザード。。。。

みたいな事になってます。

環境はWindows7で
変換レポートの中のエラーは
「Converting project file '***\SelectoramaShape.vcproj'Failed to upgrade platform 'x64'. Please make sure you have it installed under '%vctargetspath%\platforms\x64'
VCWebServiceProxyGeneratorTool is no longer supported. The tool has been removed from your project settings.
Attribute 'Detect64BitPortabilityProblems' of 'VCCLCompilerTool' is not supported in this version and has been removed during conversion.
Failed to upgrade 'Debug|x64'. Please make sure you have the corresponding platform installed under '%vctargetspath%\platforms\x64'
The project configuration dimension name/value "(Platform, Win32)" was not found in the project manifest.
プロジェクトはアップグレードに失敗しました。
」です。

お願いします。助けて下さい。
0489デフォルトの名無しさん2012/09/05(水) 11:51:15.84
>>488
環境は64bit?
そのVC++はSDK追加して64bitコンパイルできるようにしてる?
0490デフォルトの名無しさん2012/09/05(水) 11:54:32.79
あとちょっと見てみたけど、変換が入るのはこれがViisualStudio2008用だからだな。
2010用に書き換えるか、とりあえず2008で試してみては
0491sage2012/09/05(水) 12:07:50.84
>>489
>>490
なるほど。そういうことだったんですね。
ちょっと2008インスコしてきます。
2008も64bitコンパイルできるように設定しないとだめっすか?
0492デフォルトの名無しさん2012/09/05(水) 12:21:23.20
他のサンプルにx64入ってないやつあるからそれ試せばいいんじゃないか?
あとx64使えるようにするのは2008は面倒だよ。
そのエラーが出てプロジェクト開けないの?
開けてるならWin32のみ使えばいいんで問題ないと思うけど。
0493デフォルトの名無しさん2012/09/05(水) 12:49:22.38
>>492
あやうく2010消すとこでした。^^;
エラーが出てプロジェクトが開けないんです。
左のソリューションエクスプローラーに
・SelectoramaShape(利用不可)
 プロジェクト ファイルはアンロードされました。
みたいな感じで表示されてます。



0494デフォルトの名無しさん2012/09/05(水) 12:52:48.98
x64は最新のSDK入れれば使えるんじゃないか?
ググって試してみりゃいい。
あとvcprojをテキストエディタで開いてx64のブロック消すとか
0495デフォルトの名無しさん2012/09/05(水) 14:00:07.48
>>493
VC++2008で64bitでビルド実行できるようになって、その後2010で使いたいなら
2008を残したまま2010インストール
→2010で64bitビルド実行できるようにする(テストプログラムでも作って確認)
→2010でSelectoramaShape?のソリューションを開く
→ウィザード変換
→プロジェクトのプロパティ->構成プロパティ->全般->プラットフォーム ツールセットv90でリビルド
→エラー無し確認後v90をv100にしてリビルド
→エラー無し確認
これで以降はVC++2010のみで管理可能になると思う
0496デフォルトの名無しさん2012/09/05(水) 16:37:05.62
struct FOO{ int a; int *b; long c; char *d; };
__declspec(noinline) void __stdcall foo1(FOO h){
printf("%d %x %d %s", h.a, h.b, h.c, h.d);
}
__declspec(noinline) void __stdcall foo2(int a, int *b, long c, char *d){
printf("%d %x %d %s", a, b, c, d);
}
typedef void (__stdcall *FOO1)(FOO);
typedef void (__stdcall *FOO2)(int, void *, long, char *);
int _tmain(int argc, _TCHAR* argv[]){
FOO h = { 6, &h.a, 8, "abc", };
foo1(h);
((FOO1)foo2)(h);
foo2(h.a, h.b, h.c, h.d);
((FOO2)foo1)(h.a, h.b, h.c, h.d);
return 0;
}

最適化するとfoo2はfoo1と同じと見なされ、消えてしまいました。
しかし、呼び出し方は全く異なります。
foo2はpushで引数を入れていますが、
foo1はスタックポインタを進めて、全部movしていました。
するとfoo1は呼び出しコストが高くなるので
FOO2にキャストしてから呼んでみたところ
foo2と同じようにpushで引数を入れてくれました。
このような、引数と構造体の置き換えは、
アライメントが違ったり、浮動小数が入っていると
できない場合もあると思いますが、他にできないパターンが
あったら教えてください。
0497デフォルトの名無しさん2012/09/06(木) 04:13:40.82
>するとfoo1は呼び出しコストが高くなるので

え? 逆じゃないの?
プッシュはmuvより複雑で面倒な命令だから、実行時間が長くなるんじゃない?

試しに何回も呼び出しを繰り返させて実行時間を計ってみ?
0498デフォルトの名無しさん2012/09/06(木) 11:03:53.54
>>するとfoo1は呼び出しコストが高くなるので
>え? 逆じゃないの?
>プッシュはmuvより複雑で面倒な命令だから、実行時間が長くなるんじゃない?

すみません、おっしゃる通りでした。
以下のようにベンチしたところ、若干foo1呼び出しの方が速かったです。
http://ideone.com/2rTrd

コードが明らかに長くなるので、それだけ見て勘違いしておりました。

となると、サイズより速度を優先する最適化で、pushをmovに置き換える
コードが生成されないのはなぜですか?

また、((FOO1)foo2)(h);の行が入っていない場合、
foo2はfoo1に統合されませんでした。

しかも、関数自体はfoo1より、統合されないfoo2の方が速かったです。

謎だらけです。
0499デフォルトの名無しさん2012/09/06(木) 14:08:24.61
>>494
>>495
ありがとうございます。
なんとかできました。
できたはできたんですが、

自分が作りたかったプラグインはすでに存在してました orz
0500デフォルトの名無しさん2012/09/06(木) 15:42:04.15
構造体へのアクセスが単純変数へのアクセスよりも遅いって事だろ。

呼び出し時に構造体から変数に置き換えるか、関数内で置き換えるかの違いかと。
0501デフォルトの名無しさん2012/09/06(木) 15:59:16.26
えっ!?
0502デフォルトの名無しさん2012/09/06(木) 16:20:31.70
まあコンパイルは遅くなるかもなw
0503デフォルトの名無しさん2012/09/06(木) 21:38:56.41
構造体の変数を引数として渡して
関数内では構造体使わない方が速い

グローバル構造体宣言して使いまわすとか無しな
0504デフォルトの名無しさん2012/09/07(金) 14:46:45.00
質問ですが、VC++6.0にて
time_t time = time(NULL);
struct tm *ptime = localtime(&time);
として、YYYYMMやMM:DDのような書式にあわせた日付を取得する方法としてどのような方法があるのでしょうか?
YYYYと書式を設定したら2012、YYYY/MMと設定したら2012/09のようになるイメージです。

0505デフォルトの名無しさん2012/09/07(金) 16:52:48.33
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/strptime.3.html
0506デフォルトの名無しさん2012/09/07(金) 16:55:36.66
>504
つ ttp://msdn.microsoft.com/ja-jp/library/fe06s4ak%28v=vs.90%29.aspx
0507デフォルトの名無しさん2012/09/09(日) 04:03:06.58
どんな構成でプロジェクト作ってる?
フィルタの振り分けとか

Main
->main.cpp
->main.h

ProjectName
->ProjectName.cpp
->ProjectName.h

自作外部ファイル用
->FileName1.cpp
->FileName1.h
->etc

こんな感じ?
0508デフォルトの名無しさん2012/09/09(日) 13:41:30.09
そう
0509デフォルトの名無しさん2012/09/10(月) 09:34:58.52
遅れて申し訳ありません。規制に巻き込まれてしまいました。
>>505 >>506
こんな関数があったんですね。わざわざURLまで貼っていただいてありがとうございます。
0510デフォルトの名無しさん2012/09/11(火) 21:03:25.31
すいません。
UDP通信の簡単なアプリケーションを作成中なのですが、
recvfrom()を実行するとデータを受信するまで終了できませんです。

0511デフォルトの名無しさん2012/09/11(火) 21:09:48.75
終了するまで自分にパケット送りつける事にすればいいでしょうか?
0512デフォルトの名無しさん2012/09/11(火) 22:12:18.61
ref クラスのプロパティに構造体の配列を持ちたいのですが、
混合型はサポートされていませんと出ます。
どうすればいいですか?
0513デフォルトの名無しさん2012/09/11(火) 22:47:17.96
C++/CLIを使う->間違い
C#を使う->正解
0514デフォルトの名無しさん2012/09/13(木) 17:53:59.24
MC Vsual C++6.0 をつかっています
ソフトがクラッシュすると、デッバッグが起動するんですけど
これを解除するにはどうすればいい?
0515デフォルトの名無しさん2012/09/13(木) 21:35:37.48
>>514
標準デバッガの設定だな。
XP以前だったらDrワトソンを標準デバッガに設定し直せば良い。
drwtsn32.exe -i
だったかな。いま7だから試せんわ。

もしOSがVISTA以降だったら、そもそもDrワトソンが無いので、レジストリの
HKEY_LOCALMACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug
を弄れは良い。
見て想像は付くと思うが、解らんかったらググれ。
0516デフォルトの名無しさん2012/09/13(木) 21:40:19.12
質問です。
VC++6.0を使用してtry catchで例外処理をしているのですが、VC++6.0ではVBのようにexceptionのような色々なエラーをキャッチできて、
詳細なエラーメッセージを取得することができる手段はないのでしょうか?
0517デフォルトの名無しさん2012/09/13(木) 21:52:41.37
例外を投げる時に詳細なエラーメッセージも一緒に投げればいいんじゃないかな
0518デフォルトの名無しさん2012/09/13(木) 21:59:51.79
いまざっとググってみたけど、その exception ってのが、VC で言うところの System::Exception なんじゃねぇの?
0519デフォルトの名無しさん2012/09/13(木) 22:36:46.06
ref Class
なにこれ??使いにくいぃぃぃいいいいい!!
皆さん使ってますか??
0520デフォルトの名無しさん2012/09/13(木) 22:37:29.82
C++CLIで下記のよなプログラムを書いてます。で下のエラーメッセージが出ました。

error C4368: cannot define '_test_main' as a member of managed 'NAMAI::Form1': mixed types are not supported
error C2678: binary '=' : no operator found which takes a left-hand operand of type 'NAMAI::TEST_main' (or there is no acceptable conversion)
could be 'NAMAI::TEST_main &NAMAI::TEST_main::operator =(const NAMAI::TEST_main &)' while trying to match the argument list '(NAMAI::TEST_main, NAMAI::TEST_main *)'

別ファイルのTEST_mainをフォーム1で生成したいのですが、エラーの解決方法を教えていただけないでしょうか。
よろしくお願いします。
>>HOGE.h
namespace NAMAI
{
class TEST_main { public: void TEST(void); };
}
>>Form1.h
#pragma once
#include "HOGE.h"

namespace NAMAI {
public ref class Form1 : public System::Windows::Forms::Form
{
public:
TEST_main _test_main;

Form1(void){
InitializeComponent();
InitializeTEST();
}
void InitializeTEST() { _test_main = new TEST_main; }
};
}
0521デフォルトの名無しさん2012/09/13(木) 23:07:34.35
C++/CLIはC++じゃありません
0522デフォルトの名無しさん2012/09/17(月) 17:23:05.36
>>521
じゃあなんあのさぁああああああああああああ!!!!!
0523デフォルトの名無しさん2012/09/17(月) 17:36:08.09
C++/CLIはC++/CLIだな、うん
0524デフォルトの名無しさん2012/09/23(日) 03:01:33.57
自前で_CrtSetDbgFlagの機能を実装するのってどんな考え方したらいいかな?
malloc/freeでfree忘れを検知するだけでいい

それができたらそこにGetDC/ReleaseDCとかも判定できるようにしようと思ってんだけど
0525デフォルトの名無しさん2012/09/24(月) 18:07:31.98
VC6の質問です

彼女が出来ません、どうしたら良いですか
0526デフォルトの名無しさん2012/09/24(月) 18:17:35.73
コードをかきまくります
0527片山博文MZボット ◆0lBZNi.Q7evd 2012/09/24(月) 18:59:17.08
>>524
プリプロセッサーでフック。
#define malloc mymalloc
...
atexit関数かstaticオブジェクトのデストラクタでチェック。
0528デフォルトの名無しさん2012/09/24(月) 19:10:38.89
__FILE__ __LINE__
0529デフォルトの名無しさん2012/09/24(月) 19:56:58.97
クラス定義でメソッドをインラインで書くとき
{} の後ろに ; が要らないのはなぜですか?
たとえば
class Hoge {
  int a;
public:
  Hoge() : a(0) {};
  ~Hoge() {};
  void Hage(void);
  void Fuga(void) {a=1;};
};
みたいなとき
class Hoge {
  int a;
public:
  Hoge() : a(0) {}
  ~Hoge() {}
  void Hage(void);
  void Fuga(void) {a=1;}
};
で良いんですよね?
だとすると逆に
  void Hage(void)
で怒られるのも謎
0530デフォルトの名無しさん2012/09/24(月) 20:02:56.43
関数の宣言と定義の違い
0531デフォルトの名無しさん2012/09/24(月) 20:04:29.16
>>529
関数書くときもいらないだろ
いつもわざわざ
void func() { };って書いてたのか?
0532デフォルトの名無しさん2012/09/24(月) 20:06:53.19
class は定義なのか宣言なのか } の後ろに ; が必要ですね。
0533デフォルトの名無しさん2012/09/24(月) 20:08:11.70
構造体には付けてただろ
0534デフォルトの名無しさん2012/09/24(月) 20:08:28.47
あれは宣言と同時にインスタンスを作れるようになってるから必要
0535デフォルトの名無しさん2012/09/25(火) 21:35:14.70
C++初心者の人はまず何から始めたほうがいいですかね?
0536デフォルトの名無しさん2012/09/25(火) 22:24:58.02
まず禊をして身を清め
断食で煩悩を断ってください
0537デフォルトの名無しさん2012/09/25(火) 23:31:20.62
>>535
興味のあるライブラリをさわってみる
サンプルをうごかしてみる
ちょっと変更してうごかしてみる
0538デフォルトの名無しさん2012/09/25(火) 23:44:32.53
>>537
やっぱり普通に言語の勉強するよりも動かしたほうがいいんですね
0539デフォルトの名無しさん2012/09/26(水) 08:21:09.71
if(hoge){huga;};
って書き方してるソースも見たことあるわ
0540デフォルトの名無しさん2012/09/26(水) 13:29:08.57
ある例外(型はポインタ)が投げられた(受け取った)とき、
そのポインタの値がNULLかどうかチェックする必要はありますか?
具体的には、
try{
  do something;
}
catch(char *hoge){
  printf("received exception: %s", hoge);
}
としたい場合、
catch(char *hoge){
  if(hoge){
    printf("received exception: %s", hoge);
  }
}
と書くべきかどうかです。
この場合は throw してる側で hoge が動的か静的かで違うと思いますが、
動的に hoge が生成されるような場合についてです。
0541デフォルトの名無しさん2012/09/26(水) 13:31:52.59

誤 received exception

正 caught exception

0542デフォルトの名無しさん2012/09/26(水) 13:55:26.10
必要ない
0543デフォルトの名無しさん2012/09/26(水) 14:03:10.45
仮にそこに渡されるポインタがNULLだとすると
既に別の例外が発生しているか
強制終了されている状況じゃないかな
0544デフォルトの名無しさん2012/09/26(水) 14:45:04.26
>>540
それよりお前
delete hoge;
し忘れてるぞ
0545デフォルトの名無しさん2012/09/26(水) 21:26:41.46
いや、それはこの際どうでもいいだろ。w

>>540
それって状況によるかも知れないから、どうしても心配ならこんな風に書いたりすることもある。
まあこれもどうでもいいかもしれんが。
printf("received exception: %s", hoge == NULL ? "NULL" : hoge );
0546デフォルトの名無しさん2012/09/26(水) 23:34:50.18
Visual C++ Expressを使用しています。64ビットでの開発をしようと
http://msdn.microsoft.com/ja-jp/library/9yb4317s.aspx
に書かれている通り行ったのですが、試しに sizeof(void*) を出力させたところ 4 となりました
これは通常だと8となるはずなのですがどうなのでしょう
0547デフォルトの名無しさん2012/09/26(水) 23:58:08.73
64bitのバイナリになってないんでしょう
0548デフォルトの名無しさん2012/09/26(水) 23:59:56.26
>>547
どうやって設定するのですか
0549デフォルトの名無しさん2012/09/27(木) 09:59:33.25
構成マネージャーでx64作成
0550デフォルトの名無しさん2012/09/28(金) 19:51:36.48
>>527,528
ありがとう
0551デフォルトの名無しさん2012/09/29(土) 10:04:12.90
ちょっと質問です。

VisualStudio 2010 で C++ を使い、Win32 アプリを作っています。
アプリ実行時に、IDE 上に任意のログを出力する機能ってありますでしょうか?

やりたいのは、Eclipse / Android 開発で、Log.e を Logcat で捕まえるようなものです。
リアルタイムで実行状況を確認したいときに使いたいです。
0552デフォルトの名無しさん2012/09/29(土) 10:17:37.47
OutputDebugString
05535512012/09/29(土) 10:47:50.91
いけました!ありがとうございます!
0554デフォルトの名無しさん2012/10/01(月) 02:46:20.20
SDKプログラムで、ボタンをオーナードローを使って描画しているのですが
Vistaや7のAeroのGUIで、ボタンにカーソルを合わせると徐々に青っぽくなって
カーソルをはずすと、また元に戻っていくようなアニメーションっぽいのを
やりたいんですが、この処理は自分でタイマー使ってやる以外に方法はありますか?
0555デフォルトの名無しさん2012/10/01(月) 04:51:11.16
自分でタイマー使ってやる
0556デフォルトの名無しさん2012/10/05(金) 12:04:40.08
printf の "%.*s" ってどういう意味ですか?
0557片山博文MZボット ◆0lBZNi.Q7evd 2012/10/05(金) 16:16:50.27
>>556 引数で最大表示文字数を指定する。
printf("%.*s\n", 4, "TESTTEST"); // TESTと表示。
0558デフォルトの名無しさん2012/10/05(金) 19:29:48.17
>>557
やさしさ乙
0559デフォルトの名無しさん2012/10/05(金) 20:13:25.32
thx!
0560デフォルトの名無しさん2012/10/05(金) 20:17:05.38
fgets() はどうして取得出来た文字数を返さないのでしょう?
0561デフォルトの名無しさん2012/10/05(金) 20:37:52.16
while(fgets(buffer, sizeof(buffer), fp) != NULL){
  hogehoge;
}
これだとバグ出るよね
0562デフォルトの名無しさん2012/10/05(金) 21:19:10.75
bufferの型によるな
sizeof(buffer) / sizeof(buffer[0])かポインタでなければ_countof(buffer)がいい
0563デフォルトの名無しさん2012/10/06(土) 16:03:54.56
> sizeof(buffer) / sizeof(buffer[0])

これって buffer が配列じゃなくてポインタのときは駄目じゃない?
0564デフォルトの名無しさん2012/10/06(土) 16:48:03.89
_countofなら大丈夫
0565デフォルトの名無しさん2012/10/06(土) 16:52:19.50
char *buffer = (char *)malloc(sizeof(char) * N);
printf("%d", _countof(buffer));
0566デフォルトの名無しさん2012/10/06(土) 16:58:29.23
>>565
ちゃんとコンパイルエラーになるから大丈夫
0567デフォルトの名無しさん2012/10/06(土) 17:14:27.83
char buffer[N];
○ sizeof(buffer) / sizeof(buffer[0])
○ _countof(buffer)

char *buffer = (char*)malloc(sizeof(char) * N);
× sizeof(buffer) / sizeof(buffer[0])
× _countof(buffer)
○ int size = sizeof(char) * N;
0568デフォルトの名無しさん2012/10/06(土) 17:17:14.26
ああ
コンパイルエラー出すための仕組みなんか
誤解してたわ
0569デフォルトの名無しさん2012/10/06(土) 17:25:52.36
char *buffer = (char*)malloc(sizeof(char) * N);
× sizeof(buffer) / sizeof(buffer[0]) // コンパイルエラーにならなくて実行時誤動作
× _countof(buffer) // コンパイルエラーになるから大丈夫
0570デフォルトの名無しさん2012/10/07(日) 01:23:43.90
visual studioの仕様に慣れない初心者です・・・

次のエラーが解決できず、かなり苦労しています

LINK : fatal error LNK1104: ファイル 'glut32.lib' を開くことができません。

調べてでてきた
・glut32.dllを"C:\Windows\System32"に入れる
・glut32.dllを"〜〜.vcproj"と同じフォルダに入れる
・プロジェクト→既存項目を追加→glut32.dllを選択
をすべて試してみたのですが、エラーが消えません・・・

環境はVisual C++ 2008、Windows7の64bit、プロジェクト自体は"Win32"です。
どうかよろしくお願いします・・・
0571デフォルトの名無しさん2012/10/07(日) 01:56:52.25
glut32.lib
0572デフォルトの名無しさん2012/10/07(日) 01:59:53.67
glut.libの指定してる所はどう書いてる?
■ このスレッドは過去ログ倉庫に格納されています