スレを勃てるまでもないC/C++の質問はここで 10at TECH
スレを勃てるまでもないC/C++の質問はここで 10 - 暇つぶし2ch951:デフォルトの名無しさん
09/06/12 22:19:34
どっちでもいい。
どっちかが正しかったら、憶えなくちゃいけないから大変だ。

952:949
09/06/12 22:22:17
>>951
ありがとうございます。

953:デフォルトの名無しさん
09/06/12 22:23:49
>>948
つ map

mapなら、int x=-1; でも、a[x]がエラーにならない。
google製のmapもある

954:デフォルトの名無しさん
09/06/12 23:52:12
>>940
Windows環境ではsizeof(wchar_t) == 2で、UTF-16を格納している。
昔はサロゲートペアはサポートしていないと聞いたような気がするが今はどうだか知らん。

多くの*NIX系環境ではsizeof(wchar_t) == 4で、UTF-32(UCS-4)を格納している。

955:デフォルトの名無しさん
09/06/13 02:08:32
int型の配列に整数だけを代入したいときにはどうすればよいのでしょうか?
isdigitが数字かどうかの判定が出来るというので、使ってみたら、エラーが出ます。
これがソースの一部です。
for(i = 0; i < 10; i++){

while(isdigit(a[i]) == 0){
printf("%d個目の整数です。\n",i+1);
fgets(buf, 10, stdin);
sscanf_s(buf, "%d", a[i]);
}
}
whileの中身をどうにかすればうまくいくと思うんですが。

956:デフォルトの名無しさん
09/06/13 02:14:55
いろいろとだめだろ。
&がついてないし、入力後に確認すればいいものをループの上で判定するし
たとえば変数xに数字が入っていたら代入すればいいし。



957:デフォルトの名無しさん
09/06/13 02:15:07
ソースの一部を貼るのはいいが、特に初心者ならちゃんと変数宣言とかも書いてくれ。
あとエラーメッセージもちゃんと書いてくれよ。 エスパー技能を発揮できる人間はそうそういないんだから。

958:デフォルトの名無しさん
09/06/13 02:23:10
たとえば。

int inputsu(){
int x;
do{ scanf("%d", &x);
} while(x<0 || x>1000);
return x; }

int main(){
int i; int a[10];
for(i = 0; i < 10; i++){
printf("%d個目の整数です。\n", i+1);
a[i]=inputsu(); }
}

959:デフォルトの名無しさん
09/06/13 02:23:43
>>955
isdigitは、あるcharの1字が'0'から'9'までの数字に分類される文字かどうかを判定するだけ。
数値であるかどうかの判定とは違う。

a[i]に値が入るのはsscanf_sの時点。
そのsscanf_sは代入できたデータの数を戻り値にする。見るべきはこれ。

for (i = 0; i < 10; i++) {
    do {
        printf("%d個目の整数です。\n", i + 1);
        fgets(buf, 10, stdin);
    } while (sscanf_s(buf, "%d", &a[i]) != 1);
}

960:デフォルトの名無しさん
09/06/13 02:36:13
>>956
入力後に確認ですか、ありがとうございます。

>>957
すいません、次から気をつけます。
visual C++ 2008EEでやっているのですが、ビルド時にエラーは出ないんです。
コンパイルしたときに
Debug Assertion Failed!
Program:...\Visual Studio 2008\Projects\~

Line: 56
Expression: (unsigned)(c + 1) <= 256

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

っていうメッセージが出ます。

961:デフォルトの名無しさん
09/06/13 02:48:22
>>958
>>959
言われたとおりにやってみたら、
期待したとおりの出力結果が得られました。
ありがとうございます。

962:デフォルトの名無しさん
09/06/13 10:23:58
Webを参考に全ての順列を列挙するプログラムを作ったんですが、
これをnPkが列挙できるように改良するにはどうすれば良いですか
引数を一つ増やして(int k) 終了条件をt.size()==kとしてみましたが
予想よりも多く結果が出力されてしまってうまくいきません

void perm(int p,vector<int>& v,vector<int> t){
if(t.size()==v.size()){
copy(t.begin(),t.end(),ostream_iterator<int>(cout," "));cout<<endl;
}
for(int j=p;j<v.size();++j){
t.push_back(v[j]); perm(p+1,v,t); t.pop_back(); perm(p+1,v,t);
}
}

int main(){
vector<int> v(5),t;
for(int i=0;i<5;++i){v[i]=i;}
perm(0,v,t);
}

963:デフォルトの名無しさん
09/06/13 13:37:58
C言語でマイコンからLCDに文字列を出力するプログラムで

void PutString(char* point);
void PutChar(char data);

main(){
  PutString("Hello,world!");
}

void PutString(char* point){
  while(*point){
  PutChar(*point);
  ++point;
  }
}

void PutChar(char data){
  //LCDに1文字出力し、カーソルをインクリメントする
}

上記のプログラムが正常に動くのですが
PutString("Hello,world!");
文字列のリテラルとchar型ポインタは型があわないはずなのに
なぜこの行がエラーにならず正常に動のでしょうか?
マイコンというよりCの言語仕様の話だと考えたのでこっちに質問しました。

964:デフォルトの名無しさん
09/06/13 13:42:06
俺も最近マイコンのプログラムに触れて思ったけど、
マイコン向けのコンパイラってANSIとかに厳密に追従してない感じだな

ところどころ気持ち悪い

965:デフォルトの名無しさん
09/06/13 13:47:46
標準出力? 何ソレ? みたいな環境もあるからな。
それはしゃーない。

966:デフォルトの名無しさん
09/06/13 14:05:57
>>963
"Hello,world"はchar[12]型。
それが配列からポインタへの変換でchar*になる。
型の問題はどこにもないぞ。

967:デフォルトの名無しさん
09/06/13 14:15:59
ヒント:リテラル

968:デフォルトの名無しさん
09/06/13 14:23:34
え?文字列リテラルは書き換えできなくてもchar*に変換できるだろ。

969:963
09/06/13 15:52:05
>>964-968
アドバイスサンクスです。

関数コール時に一時的にメインメモリ上にchar[12]の領域が確保され
そのポインタが渡され、型の問題が生じない。という理解で良いですか。

char[12]が一時的に確保されたなら、その領域が解放されるのは
PutString("Hello,world!");
を抜けた時でしょうか。

970:デフォルトの名無しさん
09/06/13 16:12:22
いいや、一時的な領域が作られることはないよ。
基本的に、文字列リテラルは予め用意された静的な領域に置かれるが、
そこへのポインタそのものがPutStringの引数として渡される。

971:デフォルトの名無しさん
09/06/13 16:20:01
型安全についてCよりも厳しくなったC++では
この変換を「死の変換」と呼ぶ。

972:963
09/06/13 16:26:04
>予め用意された静的な領域に置かれる
納得しました。

>>971
「死の変換」ですか・・・
関数から抜けた後は、その文字列リテラルへのポインタがわからなくなり
永遠にアクセスできない領域になってしまうためそう呼ばれるのでしょうか。

char hello[12] = "hello,world!"
と最初のほうに書いておき、
PutString(hello);
とやるほうが望ましいでしょうか。

973:デフォルトの名無しさん
09/06/13 16:28:43
C++でnamespaceの名前つけかたのルールみたいなものってあるんですか?
Javaだと全部小文字でドメイン名をひっくり返したものとか、あるけど。

大文字で始まってるのよく見る気もするし。
ドットが入ってるのあんまり見ないし

ドメイン名っていうのはかぶらないのでいい方法だと思うけど
yahoo.co.jpだったらどんなのつけます?

974:デフォルトの名無しさん
09/06/13 16:31:59
そういうのは、プロジェクトポリシーで決まるんじゃねーの

975:デフォルトの名無しさん
09/06/13 16:36:10
>>972
いや、それよりもPutStringの引数にconstつけろよ。

976:デフォルトの名無しさん
09/06/13 16:40:57
>>973
全世界にソース公開とかじゃない限り「絶対にかぶらない名前をつける」ってのは
重視しなくていいんじゃないかな。
ちなみに、自分はクラス名と同じ命名規則。

977:デフォルトの名無しさん
09/06/13 16:44:55
プログラムのわかりやすさではstringだな。
生成と動作のコストがかかるが。


978:デフォルトの名無しさん
09/06/13 16:52:01
長い文字列、データをソース内に貼り付けるとコンパイル時間かかりサイズもでかくなる。
計算や短い文から生成できるならそれ使うべき。

979:デフォルトの名無しさん
09/06/13 17:29:48
日本語の識別子を使う人なんてめったにいないだろうから
namespaceで日本語を使えば被る確立はほとんどないだろう
コンパイラ依存だけど

980:デフォルトの名無しさん
09/06/13 17:57:37
>>979
どう考えたって、
仕様違反のコンパイラ依存に確実になるくらいなら
namespaceがかぶる危険があるってだけの方が
まだマシだと考えるヤツが大半だと思うが。

ローマ字に止めるべし。

981:デフォルトの名無しさん
09/06/13 18:01:00
和製英語のローマ字読み最強

982:デフォルトの名無しさん
09/06/13 18:19:57
BOOL bBlockConnect(char * pAddr, int iPort, unsigned int uiMsg);
int iOnSocketEvent(WPARAM wParam, LPARAM lParam);
BOOL bInitBufferSize(DWORD dwBufferSize);
XSocket(HWND hWnd, int iBlockLimit);
virtual ~XSocket();

int m_WSAErr;
BOOL m_bIsAvailable;
BOOL m_bIsWriteEnabled;

void _CloseConn();

int _iSendUnsentData();
int _iRegisterUnsentData(char * cData, int iSize);
int _iSend(char * cData, int iSize, BOOL bSaveFlag);
int _iSend_ForInternalUse(char * cData, int iSize);

メンバ関数の 始まりの文字が
b -> return BOOL
i -> return int
と規則的に作られてるのですが
_ (アンダーバー)で始まるのは何の意味があるのでしょうか?

983:デフォルトの名無しさん
09/06/13 18:24:17
実装した奴が、そうしたかったから
言語仕様での意味はないはず。


984:デフォルトの名無しさん
09/06/13 18:39:53
privateなメンバとか。何か規則があると思う。
スコープがクラスだから、_[a-Z]+()なメンバ関数があっても他のスコープと識別子がかぶることはないが、
_[a-Z]+で始まる識別子は予約されているので、マクロで置き換えられたときに嵌まるおそれがある。

985:デフォルトの名無しさん
09/06/13 19:00:49
STLのmapの容量はかってみた。 
<int,int>で2の21乗個登録したら、127M使用していた。
一個あたり、64バイト。
通常の配列だと4バイト、16倍も消費量が多い。
もっと少なくなるやつある?


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