はきだめC/C++下級者 ..
[2ch|▼Menu]
774:デフォルトの名無しさん
08/06/08 14:09:44
if(-1) (-1に限らず負の数)くらいを試せないのはちょっとしんどいな。
いくらでも試す方法はあるだろうに・・・

775:デフォルトの名無しさん
08/06/09 02:57:06
C++だと環境に依存するコードが多くてバグるからCで書け
といわれたんですがC++特有で環境に著しく依存する物って何でしょう
仮想関数や継承の挙動が大きく変わるとは考えにくいんですが。

776:デフォルトの名無しさん
08/06/09 09:40:29
>>775
言ったやつに聞いてくれよ。

777:デフォルトの名無しさん
08/06/09 11:43:49
>>776
いったやつが理由を知らないんだよ。
知ったかぶりだよ。


778:デフォルトの名無しさん
08/06/09 12:31:53
>>775
例外処理とか、標準ライブラリの実装とか、の話かな?

いずれにしても挙動が変わることはさすがにないでしょ。
もちろん規格に沿った範囲内の話で、未定義動作を利用した
コードなんかについては知ったこっちゃ無いけど。

779:デフォルトの名無しさん
08/06/09 13:07:23
ども。やはりそんなものですよね…
上司が自信満々に断言するので突込んで聞けなかったんです

780:デフォルトの名無しさん
08/06/09 16:17:23
vector<Hoge>::const_iterator iter = hoge.begin();
(*iter).name

で、なんでアスタリスクが必要なの?

781:デフォルトの名無しさん
08/06/09 16:41:34
iter は const_iterator であって Hoge ではないから
iter.name という表記は const_iterator のメンバ name を参照しようとしているのであって、Hoge の name を見ているのではない
iter->name ならおk

782:デフォルトの名無しさん
08/06/09 16:48:02
>>781

ポインタと同じように考えればいいのなか?

783:デフォルトの名無しさん
08/06/09 17:36:46
>>782
うん

784:デフォルトの名無しさん
08/06/09 18:27:12
>>783

アリガd

785:デフォルトの名無しさん
08/06/09 18:37:41
イテレータはポインタを模したクラスのことだからな。

786:デフォルトの名無しさん
08/06/09 22:20:01
いい野中

787:デフォルトの名無しさん
08/06/09 23:16:16
配列の要素に-1を指定した時の挙動について教えてください

char a;
char b[10];

と宣言しておいて、b[-1]を指定したら、aを意味していることになりますか?

788:デフォルトの名無しさん
08/06/09 23:17:31
なるはずがありません

789:デフォルトの名無しさん
08/06/09 23:17:37
>>787
なりません。未定義動作になります。

790:787
08/06/09 23:26:09
FreeType2という、フォントレンダラのソースを読んでいたら
配列の添字に-1を指定している箇所があり、気になって質問しました
このソフトはC言語で書かれています。
やはりこれはイレギュラーな使い方なんですね

791:デフォルトの名無しさん
08/06/09 23:36:26
ほんとに配列として宣言されてた?
mallocで確保したアドレスに+1したものを配列として使ってたりしない?

792:デフォルトの名無しさん
08/06/10 02:07:48
メンバ変数の場合は宣言順にメモリに置かれることが保証されてるので、
あとはアラインメントに関して処理系独自の定義が行われていれば
その処理系では保証されるね。

793:デフォルトの名無しさん
08/06/10 02:34:15
>>792
されません。配列の添え字演算(ポインタ演算)で配列の範囲外にアクセスしたら未定義動作です。

794:デフォルトの名無しさん
08/06/10 02:43:51
未定義動作を発生させるコードについて、ある処理系が特定の挙動を保証することがあっても構わない。

795:デフォルトの名無しさん
08/06/10 04:40:52
[-1]だけではそれが間違ってるとは言い切れない。
char a[10], *p
p = a + 1;
とすれば
p[-1] == a[0]
であり、そこにアクセスするのは何の問題もない。

796:デフォルトの名無しさん
08/06/10 07:05:10
enumは変数宣言出来るけど
enum変数自体 int型で特に特別な変数ではないし
他の変数で代用可能だから活用法が思いつかない

どういった活用法があるのですか?

797:デフォルトの名無しさん
08/06/10 07:25:06
たしかに定数宣言+typedef程度の意味しかないけど、
C++なら多重定義できるのが便利と言えば便利、特にストリーム入出力。

これも主にC++のことだけど、クラス内で定数宣言するのにも使った。
static constのおかげでこの用途からは退き気味だけど。

798:デフォルトの名無しさん
08/06/10 11:13:14
>>796
数値に特別な意味がない場合に、シンボル(名前)で記述できた方が判り易いことがしばしばあるから。
古いCだとdefineマクロしか選択肢がなかったのでデバッグ時に苦労したけれど、
enumならデバッガにシンボル情報をくれてやりさえすればシンボルのまま扱えるわけだ。

799:デフォルトの名無しさん
08/06/10 14:35:23
>>796
信号機を作るときに
enum state {
 green = 0,
 yellow,
 red,
};
と状態を宣言しておけば便利ジャン。
黄色の次は紫に変わるようにしろ、と言われたときでもyellowの次の行にpurpleを足せばいい。
static constだとredの値も変更しなくちゃならない。

800:デフォルトの名無しさん
08/06/10 15:11:52
つまり
if (yello)
とかしとけば数値を気にしないで便利

801:デフォルトの名無しさん
08/06/10 15:25:29
>>799-800
そこは理解済みです、言われている通り
#defineやconstよりはるかに便利だと思います

>>796で質問したことをコードにすると

enum タグ名 {
名前1,名前2,・・・
} 変数宣言

とした場合、宣言した変数の活用方について教えて下さい、という意味です
説明が簡単過ぎてうまく伝わっていなくて申し訳ないです

stractならデータ管理が目的なので利用法が思いつくのですが
enumの方は使いどころがいまいちピンときません

802:デフォルトの名無しさん
08/06/10 15:29:34
enumシンボルのことでなく、enum型変数ってことか?
>797とか。後は、例えばenum state conditionとか宣言しておけば
condition変数にはenum stateのシンボルしか入れない積りであることが明確になる。
コンパイラによっては、switch (condition)したときにシンボルの抜けがないかもチェックしてくれる。

803:デフォルトの名無しさん
08/06/13 01:07:53
>>801
>>2-3

804:デフォルトの名無しさん
08/06/13 21:40:38
>>801
構造体の場合
typedef struct{
int a;
double b;
}HOGE;
みたいに変数宣言するんじゃなくHOGE型として宣言しといたほうが
typedefせずグローバルで変数宣言すると何かとふべんだから
typedefして使うところで変数宣言したほうが良い

enumなら下記みたいに宣言したりする。
typedef enum {FALSE = 0,TRUE = 1} BOOL;

805:誰か一緒に考えてください
08/06/13 22:37:30
もしプロトコルを開発するならどんなプロトコルにしますか??



806:デフォルトの名無しさん
08/06/13 22:49:23
>>805
漠然としすぎ

807:デフォルトの名無しさん
08/06/14 09:59:08
>>805
>もしプロトコルを開発するならどんなプロトコルにしますか??
既存のプロトコルを利用できないか、再検討する。

808:デフォルトの名無しさん
08/06/14 16:32:10
enum の話で考えたんだけど、
enum のすべてのメンバがそのスコープで有効になるのは勘弁してほしい。
メンバが多いと名前が衝突する可能性が高くなるし、
enum Style { None, A, B }; enum ExStyle { None, C, D };
みたいに同じ名前を使えないのは痛い。

仕方ないから、
namespace Style { enum Style { None, A, B }; } namespace ExStyle { enum ExStyle { None, C, D }; }
とか宣言して、
Style::Style style = Style::None; みたいに使ってる(非標準だけど VC++ は一応通してくれる)。

俺は本質的に enum の使い方を間違えてるんだろうか?
>>802 の言うように、特定の値しか入れない場合とかに使ってるんだが。

809:デフォルトの名無しさん
08/06/14 16:41:17
>>808
class内に置く方法もあるぞ。


810:デフォルトの名無しさん
08/06/14 17:02:09
>>809
なるほど。
class Style
{
public:
enum _Style { None, A, B };
private:
_Style value;

public:
Style() : value(None) { }
Style(_Style value) : value(value) { }
Style(const Style &style) : value(style.value) { }

bool operator ==(const Style &style) { return value == style.value; }
bool operator !=(const Style &style) { return value != style.value; }
operator int() { return (int)value; }
};
みたいにすれば Java, C# の列挙型と同じように扱えるわけか。switch にも入るし。
しかも #define とかうまく使えばこれを毎回書かなくても使い回せそうだ。
すばらしい一言アドバイスをありがとう。

・・・もしかして常識ですか?

811:デフォルトの名無しさん
08/06/14 19:48:18
残念ながら

812:デフォルトの名無しさん
08/06/15 00:40:33
あの、>>808ってどこが非標準なんですか?
名前空間と列挙型が同一の名前を持っていることでしょうか。

813:808
08/06/16 00:05:50
>>812
VC++ では

>コンパイラの警告 (レベル 1) C4482
>エラー メッセージ
>非標準の拡張機能が使用されています: enum 'enum' が限定名で使用されます

>型の中の列挙型を参照するときは、列挙型の名前を指定する必要はありません。

だと。(型名)::(列挙子名) とするのは非標準らしい。

よく考えたら

#define enum_class(Type) \
class Type\
{\
private :\
int value;\
public :\
Type() : value(0) { }\
Type(int value) : value(value) { }\
operator int() const { return value; }\
operator int &() { return value; }\
enum Tag;\
};\
enum Type::Tag

とかすればほとんど C# ライクな列挙型もどきができるな。
これも非標準だし、列挙型みたいにする意義も薄れてるが。

814:デフォルトの名無しさん
08/06/16 22:51:16
C/C++のばかたれっ!!

あー すっきり!!

もやっとボール 100000000個くれ!!


815:デフォルトの名無しさん
08/06/17 03:53:38
>>813
それは >808 の namespace を使った例に対して Style::Style::None とした場合の警告じゃないか?
Style::None なら最初の Style は namespace 名だから、その警告には該当しないだろ。

816:デフォルトの名無しさん
08/06/17 11:02:38
すまぬがちょいと質問。

下記のような構造体の中に構造体の中に構造体が入ってるような形にしてるんだが、
矢印の所でエラーで止まるんだ。
ちなみに「struct FGroup *fGroup」は空のまま。(初期化も何もせず)
ほんまに原因不明なんだぜ・・・
デバッグ出来ない環境だから、エラーの原因は不明なのよおおお

// h
struct FGroup {
char strKey[40];
};
struct AInfoGroup {
struct FGroup* srcfn[10];
};
struct MatchingResultGroup {
struct AInfoGroup* aig[6];
};

// cpp
struct MResultGroup *res;
〜中略 resに色々格納〜
struct AInfoGroup *aiGroup = res->aig[0];
for(int j = 0; j < 9; j++) {
  struct FGroup *fGroup = (*aiGroup).srcfn[j];
  if((*fGroup).strKey != NULL) {
    char tmp[40];
    strcpy(tmp, (*fGroup).strKey);  ←ココでエラー
  }
}

817:デフォルトの名無しさん
08/06/17 11:08:24
>>816
エラーメッセージぐらい貼れ。
人に原因を調べて欲しいならソースを略すな。

↓これ見ただけでポインタをよく理解していないというのがわかる。
> if((*fGroup).strKey != NULL) {
入門サイトをよく読みなおしたほうがいいかもしれない。

818:デフォルトの名無しさん
08/06/17 11:18:02
エラーメッセージですか。

MinGW Developer Studio にてソース作成して
VC++にてDLL連携してしているので下記のようにしか表示されません。。。

ハンドルされていない例外はACMatch.exe(MSVCRT.DLL)にあります: 0xC0000005: Access Violation。
例外処理 (初回) は ACMatch.exe (MSVCRT.DLL) にあります: 0xC0000005: Access Violation。
プログラム 'ACMatch.exe' はコード 0 (0x0) で終了しました。

>if((*fGroup).strKey != NULL) {
これは策がもうなくて、ものは試しにでやってみたのを削除し忘れていました。。。

819:デフォルトの名無しさん
08/06/17 11:22:13
>>816
>デバッグ出来ない環境だから、エラーの原因は不明なのよおおお
それでプログラミングしようってのが無謀。

820:デフォルトの名無しさん
08/06/17 12:03:38
中略部分を晒すつもりが無いなら、終了。

821:816
08/06/17 12:53:33
>>819
無謀なのは承知です。printfにてエラー発生箇所は分かるのですが
原因を特定する為のデバッグのみが出来ない状況ですので
それで納得し、何とかやっております。

>>820
記述通り「struct FGroup」はヘッダでの宣言のみにて
中略部分ではstruct FGroupへの格納どころか、
struct FGroupの要素のstrKeyが一切記述されていなかったので中略していました。
それでも晒した方がよろしいでしょうか?

822:デフォルトの名無しさん
08/06/17 12:59:16
>>821
相談したいなら晒したほうがいい。

でも、 strKey に値が設定されて無いなら strcpy でぶっ飛ぶのはあたりまえ。

823:デフォルトの名無しさん
08/06/17 13:02:48
>>815
ごめん、確かに (名前空間名)::(列挙子名) は問題ないわ
どっかで Style::Style::None みたいなことしたから警告でたんだろうな
>>808 そのものは非標準ではありませんでした。
(>>813 の「列挙型の前方宣言」は非標準のはず)

824:816
08/06/17 13:07:13
C言語はjavaのように自分で初期化しなくても
初期化されいてるとどこかで読んだ記憶があったので、
strcpyにて複写しても大丈夫かと思ってたのですが、、、駄目だったのですか?

825:デフォルトの名無しさん
08/06/17 13:11:13
>>824
記憶があるのならどこで読んだか思い出して内容を確認してくれ。
たぶん間違いだから、 Web 上の記事なら晒して欲しい。

C言語で自動初期化(ゼロ初期化)が入るのは非ローカル変数かローカルで static な変数のみ。

826:デフォルトの名無しさん
08/06/17 13:36:19
printf分でデバッグウィンドウに情報出力とか可能ですか?



827:デフォルトの名無しさん
08/06/17 13:49:18
OutputDebugString関数

828:デフォルトの名無しさん
08/06/22 00:49:36
>>816
MResultGroupってMatchingResultGroupのtypedefか?
resに色々格納って言ってるけど、MResultGroupのインスタンスはちゃんと確保されてるのか?
fGroup自体が0(NULLはC++では使わない方が良い)だったりしないか?
今回のエラーには関係ないけど、j < 9 は合ってるのか?j < 10じゃねーか?

829:デフォルトの名無しさん
08/07/06 12:44:12
数分前まではちゃんと動いてたのに、
急にこんなエラーを吐き出しました。
開発ソフト:BCC Developer
状況:コンパイラもデバッカもライブラリも誤字脱字共に無い、
エラーの内容:
> C:\borland\bcc55\Bin\make.exe -fDebug\dxtest.mak -B TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -L..\DxLib -DDEBUG -nDebug -I..\DxLib -c C:\puroguram\dxtest\test.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
c:\puroguram\dxtest\test.cpp:
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -L..\DxLib -DDEBUG -eDebug\dxtest.exe Debug\test.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: Could not open Debug\dxtest.exe (program still running?)
** error 1 ** deleting Debug\dxtest.exe
Build End !! (Elapsed time 0:07.578)

書いた物:
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ;//ウィンドウモードに変更する関数
if( DxLib_Init() == -1 ) return -1;//初期化処理する関数
LoadGraphScreen( 0 , 0 , "char.png" , TRUE ) ;//画像を表示する関数
WaitKey() ;//何か入力があるまで待つ関数
DxLib_End() ;//終了処理をする関数
return 0 ;
}

830:デフォルトの名無しさん
08/07/06 12:52:11
>>829
エラーメッセージをよく読め。アドバイスしてくれてるじゃないか。

831:デフォルトの名無しさん
08/07/06 13:19:50
>>830
もう一度よく調べてくる

832:デフォルトの名無しさん
08/07/06 13:35:52
program still running?
program still running?
program still running?
program still running?
program still running?

833:デフォルトの名無しさん
08/07/06 13:51:11
program still running? 訳(プログラム・動かない・見出し)

って意味であってる?

834:デフォルトの名無しさん
08/07/06 13:53:05
つまらん

835:デフォルトの名無しさん
08/07/06 14:02:45
ちゃんと辞書を引こう

836:デフォルトの名無しさん
08/07/06 14:06:46
program still running? (訳:あなたは気が付いていないけれど プログラムは静かに動き続けているだろう。 私にその健気なプログラムを殺してしまえというのか?)

837:デフォルトの名無しさん
08/07/06 17:27:22
はい、もちろん幸福です、親愛なるコンピュータ。

838:デフォルトの名無しさん
08/07/10 17:51:51
c++で

for(int n=0;n<1;n++)
func();
for(n=0;n<1;n++)
func();

みたいなfor()の括弧内での変数の宣言のスコープって括弧内とそのforループ内に限定されますよね。
これって昔のバージョンだとforのブロック内でも有効だったりしました?(下のforでも有効だった?)

839:デフォルトの名無しさん
08/07/10 18:09:24
>>838
C++ の仕様決定以前に先走り実装されたコンパイラはそうなってたりする。
MS VC++ 6.0 とか。

840:デフォルトの名無しさん
08/07/12 18:13:03
C++でC#同様にインテリセンスを働かせる方法ってないですか?
いちいちALT→押すのが面倒です。

841:デフォルトの名無しさん
08/07/12 19:44:33
何を使ってるかわからんもん

842:デフォルトの名無しさん
08/07/12 20:20:19
プリコンパイル済みヘッダを複数指定することは出来ますか?

843:デフォルトの名無しさん
08/07/16 15:14:24
#ifdef XXX


#endif
で囲まれた部分がコンパイルされたかをコンパイル時に簡単に知る方法を教えてください


844:デフォルトの名無しさん
08/07/16 15:15:06
>>843
#ifdefと#endifの間に#errorと書く

845:デフォルトの名無しさん
08/07/16 15:23:22
>>843
XXX_defined とか XXX_undefined ってグローバル変数を定義しておいて
オブジェクの中に該当シンボルが存在するか否かを調べる
もしくは
コンパイラにアセンブラソース吐かして眺めてみる
もしくは
出来上がったオブジェクトファイルの逆アセンブルリストを眺める


846:デフォルトの名無しさん
08/07/16 15:24:08
>>845 すまんコンパイル時っての見てなかった。忘れてくれ


847:デフォルトの名無しさん
08/07/18 07:56:37
#errorだとそこでコンパイルが終了してしまうかも。
実害のない警告が出るようにしておけばいい。たとえば
#ifdef XXX
#define XXX_DEFINED 0
#define XXX_DEFINED 1
...
#endif

848:デフォルトの名無しさん
08/07/18 08:45:39
うわー、意味ねーw

849:デフォルトの名無しさん
08/07/20 16:42:29
std::tr1::unordered_mapを使わないといけないんですが現在の環境(gcc3)には入っていません。
これはどのライブラリに入っていますか?

850:デフォルトの名無しさん
08/07/20 16:49:10
>>849
STLport かな?

851:デフォルトの名無しさん
08/07/20 17:27:51
>>850
STLportにありました。ありがとうございます。

852:デフォルトの名無しさん
08/07/20 17:30:06
>>849
std::map じゃなくて unordered_map を「使わないといけない」状況って、どんなの?

853:デフォルトの名無しさん
08/07/20 17:47:57
>>852
ビルドしようとしたソフトがunordered_mapを使っていたからですよ。

854:デフォルトの名無しさん
08/07/23 18:42:45
vc++のデバッグの仕方が分からないんだけど
c#のconsole.writelineみたいにvcのデバッガに出力する方法ってないの?
outputdebugstring()とかやっても出てこないんだけど。

855:デフォルトの名無しさん
08/07/23 20:52:35
>>854
出てるよ、見てるとこが違うだけだ

856:デフォルトの名無しさん
08/07/24 08:24:23
>>854
MFCを使ってるならTRACEマクロ
ATLを使ってるならATLTRACEマクロ
WIN32APIだけならOutputDebugStringをじかに使う。
C++・CLIならC#と同じのが使える。

857:デフォルトの名無しさん
08/07/24 17:21:59
最近勉強始めた初心者です。すっげー初歩の質問で悪いんですけど、
関数の宣言のとこで、引き値とか戻り値とかそれ自体の説明は
分かるんですけど、その使い分けの所がいまいちピンとこなくて。

例えばint main(void)とintとかその辺自体は分かるんですけど、
返り値が無いならvoidとかの説明で、じゃあなんで
このときはvoid使わないんだとか、自分が一からプログラム組むと仮定して考えた場合、
その辺の区分けと言うか、使い分けが明瞭に納得がいかなくて。
いろんな解説読み漁ったんですけど、はっきり分かんなくて。

858:デフォルトの名無しさん
08/07/24 17:57:48
>>857
引数は渡すもの、戻り値は返すもの。
渡すパラメータがなければ引数はvoid、返す結果がなければ戻り値はvoid、両方何もなければ両方void。

自分で1からプログラムを組む場合、関数がどのようなパラメータを取ってどのような結果を返すかは、自分の都合と独断と偏見で勝手に決める。
例えば・・・ファイルに文字列を書き込む関数を作ることにしたとすると、その関数にはたぶんファイル名と書き込む文字列を指定する必要があるだろう。
ファイル名が固定なら、書き込む文字列だけ指定すればいいかもしれない。
結果は特に何も要らないかもしれないし、書き込みに成功したか失敗したか知りたいかもしれない。
それは自分が (別の人が使う関数なら、その人が) どういった機能を必要としているかによって決める。

フルバージョンならたぶんこんな感じ
int write_text_to_file(const char *filename, const char *text);
成功/失敗といった結果は別に要らないと思ったなら、戻り値はvoidにして
void write_text_to_file(const char *filename, const char *text);
ファイル名は固定なので特に指定する必要はないと考えるなら、その部分は削って
void write_text_to_file(const char *text);
実は文字列も固定なんだ、って場合は、何も指定するものがないので
void write_text_to_file(void);

859:デフォルトの名無しさん
08/07/26 01:22:48
自分は引数voidの関数は滅多に作らないな。
グローバル変数使えば引数で渡さなくてもいいけど、
何をする関数なのかわかりにくくなるし。

860:デフォルトの名無しさん
08/07/26 02:23:01
渡す情報が要らないからvoidなんですよ。

861:デフォルトの名無しさん
08/07/26 08:54:19
そうそう、time()なんて愚の骨頂ですよ。

862:デフォルトの名無しさん
08/07/26 09:38:10
渡すものがなかったら、かわいい君に寄せる想いを僕調の曲にして渡せばいいじゃない。


863:デフォルトの名無しさん
08/07/26 11:15:13
>>862
華麗にスルーされる訳ですね。わかります。

864:デフォルトの名無しさん
08/07/27 12:19:58
cin を使った入力ってメモリからあふれる位いっぱい入力した場合
バッファアンダーランとかになったりするの?

865:デフォルトの名無しさん
08/07/28 12:47:37
なりません。そもそも、バッファアンダーランなんて現象自体、データストレージに関するものです。

866:デフォルトの名無しさん
08/08/03 13:30:11
Access Violationが出ているのですが、
 これはそのプロセスが確保していないメモリ空間から読み込もうと
したときに出るのですが?

867:デフォルトの名無しさん
08/08/03 13:38:36
確保してない領域に書き込もうとしたときも出るし
確保されてても読み取り専用領域に書き込もうとしたときも出る

868:デフォルトの名無しさん
08/08/03 17:05:21
>>866
そんなもん、環境によって違います。そもそも出ない環境だってたくさんあります。

869:デフォルトの名無しさん
08/08/03 17:07:36
いつのまにかスタック領域がプログラムやデータを侵蝕して暴走を引き起こしていたあの頃を思い出します。
comファイルって、プログラムと同一セグメント内にスタック領域を確保するから、
プログラムとデータが大きいとすぐに侵蝕しちゃうんだよね。

870:デフォルトの名無しさん
08/08/04 10:51:08
gccを使いたいんだけど、どれをインストールすればいいの?
日本語バージョンてないの?

871:デフォルトの名無しさん
08/08/04 10:58:38
>>870
Linuxならデフォルトで入ってる
WindowsならMinGWをインストールする
Macなら知らない

872:デフォルトの名無しさん
08/08/04 10:59:39
BSD/Solarisなどの*nix系なら標準で入ってる可能性が高い。

873:870
08/08/04 11:04:59
レスどうもです。
OSを書き忘れてましたが、WinXPです。
GCCにはいろいろ亜種があるということかな?
どれが標準てこともないの?

874:デフォルトの名無しさん
08/08/04 11:13:40
>>873
MinGWはあくまでgccを簡単にインストールするためのパッケージ。
gccであることに変わりはない。
gccのバージョン違いはたくさんあるね。3.4とか4.1とか。

875:デフォルトの名無しさん
08/08/04 11:18:14
>>873
擬似Unix環境ごとインストールするならcygwinという選択もある。

876:870
08/08/04 11:38:46
重ね重ね、どうもです。
MSYSなるものもありますね。
プログラミング目的ならMinGWとMSYSでいいのかな。

877:デフォルトの名無しさん
08/08/04 11:50:12
これでMinGWとMSYSで作るものが単純なテキスト処理だったり数値処理だったりしたら大笑いだな。

878:デフォルトの名無しさん
08/08/04 13:13:21
MSYSって日本語表示できないんだけど、どうにかならない?

879:デフォルトの名無しさん
08/08/04 16:36:01
rxvt の引数を変えて、日本語フォントにすればいいのでは

880:デフォルトの名無しさん
08/08/04 20:48:53
>>879
さんくす、やってみるよ。

881:デフォルトの名無しさん
08/08/04 21:21:24
経過報告
MSゴシックだとうまく表示されなかった。
ぐぐってみてTerminal-14にしてみたけど、やっぱりうまく表示されなかた。

試したコマンド: ls /c/winnt
MSYS 1.0.10
rxvt 2.7.2

export LANG=ja_JP.Shift_jis とかやってもダメだった。
どうも根本的に何かを間違えてるのかなあ。
ま、いっか。

882:デフォルトの名無しさん
08/08/04 22:27:35
>>881
-fn "MS ゴシック"-12

ls --show-control-chars /c/winnt

確認したら、LF改行コードのファイル~/.profile に
alias ls='ls --show-control-chars' を追加しておく

883:デフォルトの名無しさん
08/08/05 12:56:29
>>882
ありがとう。
でも、俺の環境じゃ
ls --show-control-chars /c/winnt だと半角カナ混じりで化けた。

こんな具合いに: "ほげほげ.txt" → "・ル・ー・・ル・ー・.txt"

御協力感謝。


884:デフォルトの名無しさん
08/08/06 01:47:00
rxvt使わないで、コマンドプロンプト上でmsys使うと良いよ。
cygtermみたいなのがmsysにあるともっといいんだけど。

885:デフォルトの名無しさん
08/08/06 02:30:38
OS:Windows、コンパイラー:VC2005です。
CPUのクロック数を変化させる、もっとも簡単なコードを教えてください。

886:デフォルトの名無しさん
08/08/08 00:18:33
int main(void){ while(1) {} }

対応CPUならこれでクロック上がる

887:デフォルトの名無しさん
08/08/08 00:59:32
>>886
そうか、その手があったか!

888:デフォルトの名無しさん
08/08/08 09:27:45
感動した

889:デフォルトの名無しさん
08/08/08 09:33:46
クロックが上がるっつーか、CPUが音を上げそうだな。

890:デフォルトの名無しさん
08/08/08 12:49:00
最近のだとスレッドで何本かまわさないとね

891:デフォルトの名無しさん
08/08/08 12:53:51
最近のは他のコアが休んでるときはクロックあがるんだぜ

892:デフォルトの名無しさん
08/08/11 00:58:43
なるほど!コロンブスのたまごですね。
クロックダウンのコード聞いたのですが・・・

893:デフォルトの名無しさん
08/08/11 03:01:06
#include <stdio.h>
void main(void) { char i[256]; FILE* fp=fopen("C:\con\con","rb"); fread(&i, 1, 256, fp); fclose(fp); }

対応OSならこれでクロック下がる

894:デフォルトの名無しさん
08/08/13 21:27:50
C++で
char* を バイト配列に変換するにはどうすればよいのでしょうか。
ちなみにchar*の中身は日本語文字列です。

895:デフォルトの名無しさん
08/08/13 21:44:54
char*の中身はすでにバイト配列です
変換する必要はありません

896:デフォルトの名無しさん
08/08/13 22:46:39
>>895
char配列とbyte配列はちがうような、、、

897:デフォルトの名無しさん
08/08/13 22:52:54
charは1バイトの整数
charの配列は1バイト整数の配列すなわちバイト配列
何が違うというのか

898:デフォルトの名無しさん
08/08/13 22:54:40
byteなんて型はないから
大概charをtypedefしたものなんじゃない?

899:デフォルトの名無しさん
08/08/13 23:12:14
一応言っておくが、もしC#やJavaからやってきたというのなら、
それらの言語のcharに相当するC++の型はwchar_tだ。
wchar_t配列と(それらの言語でのバイト配列に相当する)char配列との変換には
mbstowcs, wcstombs関数がまあまあ手軽に使える。
もちろんwchar_tの入出力で間に変換が噛まされるのはC++でも同じだ。

900:デフォルトの名無しさん
08/08/13 23:56:04
C言語のマクロについて質問です、詳しい方助言ください。

__mulk(4) と記述することで、
"movl 4(%ebx),%eax \n"
という文字列( " "も含む)を吐き出すマクロを作りたいのですが、
次のように考えた結果これはうまくいきませんでした。

#define LTR(STR) #STR
#define COMMA ,

#define __mulk(A) LTR(movl A ## (%ebx) ## COMMA ## %%eax \n)

カンマをそのまま書いてしまうとマクロ__mulkが2つの引数を持っていると解釈されてしまうようです。

この回避方法はあるのでしょうか?環境はLinux,gcc 4.3.1です。

901:デフォルトの名無しさん
08/08/14 00:10:54
#define __mulk(A) "movl " #A "(%ebx),%eax \n"

902:デフォルトの名無しさん
08/08/14 01:19:16
>>901
なるほど・・・すばらしい。
どうもありがとうございました。

903:デフォルトの名無しさん
08/08/14 11:49:38
プログラム実行時に引数を何も入力しなかった場合に、デフォルト引数を使いたいのですが、
どうもnullが入ってしまっていて、デフォルト引数が使えません。

どうすれば、デフォルト引数を使えるようになるか、教えていただけませんでしょうか。。。

int main (int argc,char *argv[])
{

  abc(argv[1]);
・・・・・


void abc(char *str = "STRING")
{

・・・

904:デフォルトの名無しさん
08/08/14 11:59:59
>>903
これではだめ?
if (argc >= 2)
  abc(argv[1]);
else
  abc();


905:903
08/08/14 12:07:56
>>904

早速の回答ありがとうございます。
すいません。書くのを忘れてました。。。
main文は他の誰かが書くとかで、できたら関数(abc)の中で処理したいのですがいい方法ありませんでしょうか。

906:デフォルトの名無しさん
08/08/14 12:15:52
void abc(char *str)
{
if (str == NULL) str = "STRING";
...
}

907:デフォルトの名無しさん
08/08/14 12:17:48
デフォルト引数にこだわる意味がわからん

908:デフォルトの名無しさん
08/08/14 12:26:00
標準C/C++に準拠したコンパイラなら argv[argc] == NULL だから>>906で大丈夫だな

909:903
08/08/14 13:05:15
>>906,908

無事できました!ありがとうございます。

>>907

C++のデフォルト引数が便利そうだったので、使ってみたかっただけでした。。。すいません


910:デフォルトの名無しさん
08/08/14 13:09:08
デフォルト引数は、NULLのとき代わりに、という意味ではないよ
引数を渡さなかったときに使われるもの
argv[1]を渡せばargv[1]が渡る

911:903
08/08/14 13:12:19
なるほど、、そういう意味だったのですね
いろいろとありがとうございました。

912:デフォルトの名無しさん
08/08/14 15:09:44
コンストラクタやコピーコンストラクタでメモリの確保に失敗したら
どうすればいいですか?例外をなげたほうがいいのか、
成功か失敗のフラグをクラス内部でもつのか、作成及び複製専用の
関数を用意したほうがいいのかよくわかりません。
できれば、コンストラクタで失敗したならそのインスタンスは無効であることを
戻り値で返せればいいんですが無理ですよね。

913:デフォルトの名無しさん
08/08/14 15:44:26
自分で投げなくてもnewに失敗したら勝手にstd::bad_alloc投げると思うけど

914:デフォルトの名無しさん
08/08/14 16:34:20
unicodeって文字コード統一する目的で作られたんでしょ?
なんでいくつも形式が存在するの?

915:デフォルトの名無しさん
08/08/14 16:36:32
>>914
1文字に4バイトも食うからそりゃ敬遠するでしょ

916:デフォルトの名無しさん
08/08/14 16:40:55
>>914
キャラクタセットとエンコーディングは区別しろよ

917:デフォルトの名無しさん
08/08/14 17:37:50
UnicodeとUTF-8の違いは?
スレリンク(tech板)

918:デフォルトの名無しさん
08/08/15 02:44:25
if(A&&B&&C){...}

if(A){
 if(B){
  if(C){...}
 }
}

これだったらどっちが高速なのですか?

919:デフォルトの名無しさん
08/08/15 02:47:05
なんでそんなに高速性を気にする?

920:デフォルトの名無しさん
08/08/15 02:48:39
完全に興味本位です。


921:デフォルトの名無しさん
08/08/15 02:59:55
>>918
生成されるコードを見るしかない。
コンパイラによって違うかもしれない。

だが多分ショートサーキットを考慮すれば同じコードを吐くだろう。

922:デフォルトの名無しさん
08/08/15 03:11:44
なるほど。
ありがとうございます。非常に勉強になりました。

923:デフォルトの名無しさん
08/08/24 08:19:33
コンテナに入れたデータを一定の時間間隔で処理するために
コールバッククラスのインスタンスでイテレータを保持するようにしたんだけど、
これってどう思う?

for (Hoge::iterator i = hoge.begin(); i != hoge.end(); ++i)
みたいな、その場のループで使い捨てする用途しか今まで見たことがなくて、ちょっと不安。

要素が増えも減りもしないことが分かっている場合は、ポインタと同じ感覚でいいのかな?

924:デフォルトの名無しさん
08/08/24 09:20:29
>>923
どういうときにイテレータが無効になるかをきちんと把握して、
(ちなみにこれはコンテナの種類によって異なる)
自分も他人もそういうコードを書かないという確信があるならそれでいいんじゃない?

普通にコンテナのポインタなり参照なりを保持させればいいと思うけど、
それじゃ無理なわけ?

925:デフォルトの名無しさん
08/08/24 19:49:44
>>924
コンテナの要素をどこまで処理したか覚えておきたいんだ。
wavのストリーム再生をイメージしてもらえれば近いかな。
コンテナのポインタなり参照なりを保持するとして、どうすればいいのか分からないです。

926:デフォルトの名無しさん
08/08/24 20:47:48
>>925
コンテナの中身が書き換わらないならイテレータは無効にならない

927:デフォルトの名無しさん
08/08/25 01:09:12
>>926
じゃぁ今回はイテレータ保持のままでいいか。どうもありがとう。
もっと色んなソース読んでみないとなぁ。自分のしていることが一般的なのか分からなくて不安。

928:デフォルトの名無しさん
08/08/26 01:02:11
Cのif文について質問です

if(a>0xffffffff){ 命令; }

とするとコンパイラが 条件が常に真 と警告を吐きますが
普通に動作します

また  -1(0xffffffff) を -2(0xfffffffe) に変えるとその警告は無くなります

変数 a はunsigned int型です

なぜこの警告は出るのでしょうか。

929:デフォルトの名無しさん
08/08/26 01:42:01
>>928 条件が常に真だからだよ。

930:デフォルトの名無しさん
08/08/26 01:49:46
>>929
でも普通にその条件式が動作するのは何でなんだぜ?

931:デフォルトの名無しさん
08/08/26 01:54:36
>>930
常に真だから

932:デフォルトの名無しさん
08/08/26 01:54:52
>>930
条件式の結果が真であることは誤動作じゃないだろ。

933:デフォルトの名無しさん
08/08/26 01:54:53
>>1読まなかった俺を許してくれ

934:デフォルトの名無しさん
08/08/26 01:56:45
常に偽という気がする。
>>928
おまえんとこのunsigned intの範囲が0から0xffffffffなんだろう。
a>0xffffffffという条件はaがどんな値でも成り立たない。
だからのその命令;は絶対に実行されない。
だったら初めからifなんて書くなよ無駄だからというのがその警告だ。

0xfffffffeにすると、aが0xffffffffの場合だけそこが実行されるという
意味のあるif文が出来上がるので、警告にならない。

あと、0xffffffffは-1ではない、4294967295だ。0xfffffffeも同様に4294967294。

935:デフォルトの名無しさん
08/08/26 01:58:41
>>934
ガチですまん
俺ホント馬鹿
吊ってくる

936:デフォルトの名無しさん
08/08/26 02:03:01
無駄だからというより、なんか間違っていないかって注意を促す意味合いのほうがおっきい気がしてきた。

937:デフォルトの名無しさん
08/08/26 02:22:25
>>934
ばーか。コンパイラが「常に真」と言ってるんだよ。なにが「常に偽という気がする」だよ。

938:デフォルトの名無しさん
08/08/26 02:28:18
>>937
いやだってa>0xffffffffが常に偽になる場合は容易に思い付いたけど、
常に真になる状態は考え付かなかったから。
常に真でも偽でも同じメッセージを使い回しているだけだろうと思うことにした。

939:デフォルトの名無しさん
08/08/26 02:33:03
sizeof(unsigned int)よりもsizeof(unsigned long int)の方が大きい環境なら、常に真になるんだけどね。

940:デフォルトの名無しさん
08/08/26 03:03:50
なかなか面白いジョークだな

941:デフォルトの名無しさん
08/08/26 04:21:35
>>928 とりあえずコンパイラとバージョン教えて。試してみたいから。

942:デフォルトの名無しさん
08/08/26 07:40:50
フォントが小さいので 常に夏 に見えて仕方ない
イヤなスレだなぁ・・・と思ったらイヤなのは俺だった

943:デフォルトの名無しさん
08/08/27 16:17:34
VCなんですが、例外処理 (初回) は test2.exe にあります:
0xC0000005: Access Violation。とでます。
ループの回数を減らせば通るのですが、ループ数を減らさずに
実行するにはどうすればよいでしょうか?
iのループは60、jのループは1500程度です。

for(i=0; i < font->Tnum; i++){
// 1ブロックのフォント収録数
fontnum = font->Block[i].End - font->Block[i].Start;
fputs("const char data[] = {\r\n\t", fp);
for(j = 0; j < fontnum * 24; j++){ // 1ブロックのフォント分繰り返す */
dt = *p++;
fputs("0x", fp);
sprintf(tmp, "%02x", dt);
tmp[2] = 0;
fputs(tmp, fp);
fputs(", ", fp);
ct++;
if(ct == 8){ // 改行
fputs("\r\n\t", fp);
ct = 0;
}
}
fputs("}\r\n\t", fp);
}

944:デフォルトの名無しさん
08/08/27 16:58:13
>>943
デバッグすればいいよ・・・・・・・・・・・・・・・・・・

945:デフォルトの名無しさん
08/08/27 22:30:00
ソース生成しているのか。くだらんなぁ。それはさておき、こりゃ酷い。
--
fputs("0x", fp);
sprintf(tmp, "%02x", dt);
tmp[2] = 0;
fputs(tmp, fp);
fputs(", ", fp);
--
fprintf(fp, "0x%02x, ", dt)で事が足りるだろうに。処で、tmpはどう宣言されているんだ?

946:デフォルトの名無しさん
08/08/29 13:01:48
c++使ってるといちいち型変換がめんどくさいんだけど
一番簡単な方法はboostの変換ライブラリ使う事?
他にいい方法があれば教えてください。

947:デフォルトの名無しさん
08/08/29 14:53:32
sendmessageでwm_copydataが送れないんですけど、
何かプロジェクトの設定とかが必要だったりします?
他のメッセージは送れるんですがこれはデータのコピーとかやってるのでその辺でこけてるのかなあと。

948:デフォルトの名無しさん
08/08/29 15:25:26
GetLastErrorで原因調べた?

949:947
08/08/29 15:25:28
sendmessageなのにスレッドループで捕まえようとしてました
解決しました


950:デフォルトの名無しさん
08/08/30 07:51:33
オブジェクトのメソッドの呼び出し規約ってどうなるんですか?


951:デフォルトの名無しさん
08/08/31 12:07:46
>>950
とりあえずぐぐろう

952:デフォルトの名無しさん
08/08/31 12:18:42
>>945
>>943ほどの低レベルなコードを書く奴ならどうせchar*tmp;と宣言していると予想

953:デフォルトの名無しさん
08/09/01 08:01:13
printfなどでの書式指定で、たとえば0.123の場合、
最初の0をつけずに、.123の様になるようにするには
どのように指定したらよいのでしょうか

954:デフォルトの名無しさん
08/09/01 08:41:46
"%.3f"

955:デフォルトの名無しさん
08/09/01 10:23:10
文字列を入力するときの例は、配列を使うものしか見たこと無いのですが、 
文字列を入力する場合は、常に配列を使わなければならないのでしょうか。 

たとえば、宣言は、 char st[100]; とかの例を見たりしますが、 
char st; だけじゃ不都合があるのでしょうか。文字が一文字しか入らないとか。。。 
 


956:デフォルトの名無しさん
08/09/01 11:15:33
文字列 = 文字の配列
と思えばとりあえずなんとかなる

957:デフォルトの名無しさん
08/09/01 11:53:00
>>955
Cには文字列形がないので、文字型の配列などに格納する必要がある。
文字型変数であるchar stには、当然ながら一文字しか入らない。

958:デフォルトの名無しさん
08/09/01 21:53:28
どなたかこの低脳野郎に知恵を授けてください・・・。実はいまC言語を学んでいるのですが
C言語はソフト開発が出来るのでしょうか?(窓の杜にあるようなやつ)
回答お願いします。

959:デフォルトの名無しさん
08/09/01 21:57:30
低脳にもほどがある

960:デフォルトの名無しさん
08/09/01 22:11:12
>>958
アインシュタインは紙と鉛筆で相対性理論を完成させたかもしれないが、俺にはできない。
たしかに偉大な先人達はCで作ったソフトを窓の杜に投稿したかもしれないが、
その軌跡を今の私たちが無理してなぞる必要は無いと思わないか。

ということで、もっと楽ちんな言語使おうぜ。
C++とか。

961:デフォルトの名無しさん
08/09/01 22:48:25
>>960
ありがとうございます。偉大な人とはいえ結局は人ですからがんばって見ます。


962:デフォルトの名無しさん
08/09/01 23:27:03
がんばって何を見るというのだろう……

963:デフォルトの名無しさん
08/09/01 23:52:14
そりゃあ、おい、青少年ががんばって見るといえばアレしかないだろ。
まぁ俺からのアドバイスとしては薄目にしても効果はないということだ。


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4762日前に更新/249 KB
担当:undef