はきだめC/C++下級者の質問箱 2
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2006/08/22(火) 09:21:31ここは、C/C++に挫折し、それにもかかわらず、C/C++やらなければならない者達がたむろするスレです。
なお、質問する人は回答はあまり期待しないでください。
前スレ:はきだめC/C++下級者の質問箱
http://pc8.2ch.net/test/read.cgi/tech/1124256027/
0002デフォルトの名無しさん
2006/08/22(火) 09:36:050003デフォルトの名無しさん
2006/08/22(火) 11:44:160004デフォルトの名無しさん
2006/08/22(火) 11:56:38C++の規格の範囲には、スレッドは無い。
そこで、外部のライブラリやOSが提供するAPIを使ってスレッドを操作する。
これ以上何か知りたければ、自分で検索するか、こっちで。
マルチスレッドプログラミング相談室 その4
http://pc8.2ch.net/test/read.cgi/tech/1130984585/
0005デフォルトの名無しさん
2006/08/22(火) 14:55:320006デフォルトの名無しさん
2006/08/25(金) 16:07:28aaa\bbb\ccc
上記のような文字列があったとします。
これを\で区切って、配列に格納したいです。
よろしくお願いします。
あっ、あとc/c++の正規表現の本って
見つけられないんですが無いんでしょうか。
0007デフォルトの名無しさん
2006/08/25(金) 16:43:46\で区切りたいだけなら、正規表現ではないけど、Boost Tokenizerが使える。
パス文字列ならそれに特化したBoost Filesystemもおもしろい。
0008デフォルトの名無しさん
2006/08/25(金) 18:16:470009デフォルトの名無しさん
2006/08/25(金) 18:53:000010デフォルトの名無しさん
2006/08/25(金) 20:43:270011デフォルトの名無しさん
2006/08/25(金) 23:22:57/**
文字列を指定の文字で分割し、単語のリストを作ります
@param text 入力文字列(","や";"を含む文字列)
@param separators 分裂文字列(",.;:","\n")
@param words 出力文字列リスト
*/
bool split(const string& text,
const string& separators,
vector<string>& words)
{
int n = text.length();
int start = text.find_first_not_of(separators);
while ((start >= 0) && (start < n))
{
int stop = text.find_first_of(separators, start);
if ((stop < 0) || (stop > n)) stop = n;
words.push_back (text.substr(start, stop-start));
start = text.find_first_not_of(separators, stop+1);
}
return true;
}
0012デフォルトの名無しさん
2006/08/26(土) 00:06:19C++ をどうにかするのが Boost の存在意義だろ。
使用制限があるわけでもないんだから、おとなしく使っとけ。
0013デフォルトの名無しさん
2006/08/26(土) 00:34:11なぜ bool ?
0014デフォルトの名無しさん
2006/08/26(土) 00:36:44#include <boost/tokenizer.hpp>
#include <boost/range_ex/algorithm.hpp>
bool split(const std::string& text,
const std::string& separators,
std::vector<std::string>& words)
{
typedef boost::char_separator<char> char_separator;
boost::copy(
boost::tokenizer<char_separator>(text, char_separator(separators.c_str())),
std::back_inserter(words));
return true;
}
>>12
むしろ9に言ってやってください。
0015デフォルトの名無しさん
2006/08/26(土) 01:00:53int に string::npos が入ったら -1 になるのって、確実?
0016デフォルトの名無しさん
2006/08/26(土) 07:02:26メモリ領域は
・プログラム領域 (ソースコードをロードする)
・静的領域 (グローバル変数など)
・スタック領域 (ローカル変数や引数などの、いわゆるワーク)
・ヒープ領域 (mallocなどで、プログラマが直接管理する)
だと理解しているのですが、この理解は正しいでしょうか。
また、正しかった場合、静的・スタック領域ではなく、
あえてヒープ領域を使ってプログラマが特にメモリを管理するのは、
どんな意図があるのでしょうか。
具体的な使い道など教えて下さい。
0017デフォルトの名無しさん
2006/08/26(土) 08:19:18>>8
アドバイスありがとうございます。
勉強してみました。
>>11
>>14
初心者、はきだめの僕としては、コードはすごい助かります。
穴があくまでじっくり読ませていただきます。
0018デフォルトの名無しさん
2006/08/26(土) 09:16:38大体あってます。
Unixの場合は、
・testセグメント(命令(コード)の領域)
・dataセグメント(グローバル変数・static変数の領域)
・bssセグメント(Block Started by Symbol)
・stackセグメント
・ヒープ領域
となります。
Windowsのことは良く知りません。
またヒープを使うのは、動的にメモリを取りたいという要求があるからです。
グローバル変数やstatic変数では、この要求は満たせません。また、ヒープ
領域はごく限られたサイズしかないため、ヒープを使います。
0019デフォルトの名無しさん
2006/08/26(土) 09:17:25testセグメント
↓
textセグメント
0020デフォルトの名無しさん
2006/08/26(土) 09:34:44餅搗け。>19以外にも間違いだらけだ。
0021デフォルトの名無しさん
2006/08/26(土) 10:15:03指摘してください。
0022デフォルトの名無しさん
2006/08/26(土) 10:22:42マゾっ娘確定
0023デフォルトの名無しさん
2006/08/26(土) 10:33:42修正:
また、ヒープ領域はごく限られたサイズしかないため、ヒープを使います。
↓
また、スタック領域はごく限られたサイズしかないため、大きなメモリを扱うためにヒープを使います。
002411
2006/08/26(土) 18:17:50バカの一つ覚えでvoidでなく、とりあえずboolやっとけってのがある。それでかも
>>15
元ネタがパクリで覚えてない
CSVとかのコンマ区切り用で実際使ってます
0025デフォルトの名無しさん
2006/08/26(土) 19:29:13間違いだらけって、どこが間違い?
いや、煽りじゃなくて、純粋に知りたい。
0026デフォルトの名無しさん
2006/08/26(土) 19:57:23>20じゃないけど気づいた点を列挙。
>>>16
>大体あってます。
そうでもないでしょ。
>Unixの場合は、
>・testセグメント(命令(コード)の領域)
これは>19だね。
>・dataセグメント(グローバル変数・static変数の領域)
明示的に初期化される場合のみ。
>・bssセグメント(Block Started by Symbol)
初期化されない静的変数などはこちら。
例えば0で初期化している場合は実装依存と思われ。
>またヒープを使うのは、動的にメモリを取りたいという要求があるからです。
表現が微妙だ。
>グローバル変数やstatic変数では、この要求は満たせません。また、ヒープ
>領域はごく限られたサイズしかないため、ヒープを使います。
>23だが「ごく限られた」が相対的だなぁ。
ついでに言えば、自動変数でも動的確保できるんだが。
0027デフォルトの名無しさん
2006/08/26(土) 20:07:04002826
2006/08/26(土) 20:14:53それと、スタックのもう一つの重要な役割も書かれていないし。
#それらは末節だと言うのなら大体あっているってことだろうけどね。
0029デフォルトの名無しさん
2006/08/26(土) 20:22:12> そうかなぁ、スタックがワークに使われている理由を理解できていない気がするんだが。
その理由とは?
> それと、スタックのもう一つの重要な役割も書かれていないし。
その役割とは?
0030デフォルトの名無しさん
2006/08/26(土) 20:33:54関数の戻り先の保存
0031デフォルトの名無しさん
2006/08/26(土) 20:37:36「〜などのいわゆるワーク」って書いてるじゃん。
明記してないから、理解してないということ?
0032デフォルトの名無しさん
2006/08/26(土) 21:42:27メモリ領域は環境によっていろいろ変わるから、それで完全に
正しいかどうかは判別できない。でも一般的な区分として
そういう領域があるというのは正しい。以下は一般的な話。
プログラム領域にロードされるのはソースじゃなくてコンパイルされた
マシンコードね。
ヒープを使うのは、他のやつらが不適切なとき。
静的領域を使うと、プログラム起動中はずっとメモリを握ったままになるので
大きな領域で、必要な場合と不要な場合が分かれるようなときは効率が悪い。
スタックを使えば要らなくなったときにすぐ解放できるけど、解放の順序が
必ず確保と逆順じゃないといけない。あとはサイズに制限がある環境がほとんど。
0033デフォルトの名無しさん
2006/08/26(土) 22:48:500034デフォルトの名無しさん
2006/08/28(月) 16:56:190035デフォルトの名無しさん
2006/08/28(月) 17:00:190036デフォルトの名無しさん
2006/08/28(月) 19:35:32どうにも割り切れない
003716
2006/08/29(火) 16:49:19メモリ領域の分類については、
現時点の自分のレベルで理解する分には
差し支えないと思いました。
malloc(ヒープ)の利用については、以下のように解釈しました。
処理中で扱う配列データの個数が不定な場合に、
その時々に応じて臨機応変に配列を用意したい。
そのためにmallocで動的に配列用のメモリを確保する。
→メモリ節約技の1つ
なるべく理解してから書こうと思ったので、
レスが遅れました。すみませんでした。
ご回答頂いた>>18、>>26、>>32さん、
その他皆様ありがとう御座います。
0038デフォルトの名無しさん
2006/09/01(金) 03:32:13ファイルを一行ずつ読んで、printfで出力したいんですが、
「メモリが"written"できませんでした」っていうエラーになります。
配列とかポインタとか良くわかってないので、その辺がおかしいんだと思います。
また、下記の場合読み込むファイルが3行だけになってるんですが、
行数が決まってないときのlist[num]を動的に処理する方法も
どうしたらいいのがわかりません。よろしくお願いします。
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <iomanip>
int main()
{
std::ifstream fin("hoge.txt");
if(!fin){
printf("エラー");
return -1;
}
const int num = 3;
char* list[num];
for(int i=0; i<num; i++){
fin >> list[i];
}
for(int j=0; j<num; j++){
printf("%s\n",list[j]);
}
fin.close();
return 0;
}
0039デフォルトの名無しさん
2006/09/01(金) 05:02:26C99とGCC以外では、配列の大きさは「定数」として、コンパイル時に決まってなければいけない。
あらかじめわからない場合は動的に確保する。(何も考えずにvectorを使うのも可)
0040デフォルトの名無しさん
2006/09/01(金) 07:48:28アドバイスありがとうございます。
vector使って書いてみました。
vectorとstringで、文字数と行数が動的できたと思うんですが、
これで大丈夫でしょうか?ちょっと心配です。
int main()
{
std::ifstream fin("hoge.txt");
if(!fin){
printf("エラー");
return -1;
}
std::vector<std::string> list;
std::string s;
while(!fin.eof()){
getline(fin,s);
list.push_back(s);
}
for(int j=0; j<list.size(); j++){
printf("%s\n",list[j]);
}
fin.close();
return 0;
}
0041デフォルトの名無しさん
2006/09/01(金) 08:46:050042デフォルトの名無しさん
2006/09/01(金) 09:25:520043デフォルトの名無しさん
2006/09/01(金) 09:46:35はたして重大なバグが潜んでいないか心配なので添削お願いできますか
ということだろ。なんでみんなギスギスしてんの?
0044デフォルトの名無しさん
2006/09/01(金) 10:53:290045デフォルトの名無しさん
2006/09/01(金) 11:16:170046デフォルトの名無しさん
2006/09/01(金) 18:55:48・while (!fin.eof()) {} というやり方は大抵望み通りの動作にはならない
・printfにstringをそのまま渡しても大抵望みどおりの動作にはならない
とだけ
0047デフォルトの名無しさん
2006/09/01(金) 21:39:21while (getline(fin, s)) {
list.push_back(s);
}
0048デフォルトの名無しさん
2006/09/01(金) 22:41:15c_str()無いですね。
正常に動いてたっぽいんですが、違うソース
貼り付けてしまったのかもしれません。
while (!fin.eof()) {} は良くないですか。
奥が深いです。
難しいので今後の課題にさせてください。
>>47
ありがとうございます。
while (getline(fin, s))というのもできるんですね。
こちらに変えてみます。
0049デフォルトの名無しさん
2006/09/01(金) 23:19:17最終行に改行だけの行(空行)がないファイルや
最後に改行がないファイルを扱ってみるとわかる。
なぜそうなるかは、feof()の仕組みを考えながら動きを追ってみるとよい。
もちろん、fin.eof()でも同じ。
0050デフォルトの名無しさん
2006/09/01(金) 23:29:51~~~~~~~~~~~~~~~~~~~~~~
BASICとは違うのです。
0051デフォルトの名無しさん
2006/09/02(土) 00:13:190052デフォルトの名無しさん
2006/09/02(土) 00:27:240053デフォルトの名無しさん
2006/09/03(日) 01:29:21>>50
詳しくありがとうございます。
こういうのって、経験して覚えていくんでしょうか。
覚えることがいっぱいあって大変です。
0054デフォルトの名無しさん
2006/09/04(月) 05:53:300はfalseでそれ以外はtrueっていうことでよかったでしょうか。
-10~10までやってみました。
自分で関数作るときに-1をfalseにしてたんですが、
ほかの人がみたら変に思われますか?
#include <stdio.h>
for(int i = -10; i<10 ; i++){
if(i){
printf("%dはtrue\n",i);
}else{
printf("%dはfalse\n",i);
}
}
0055デフォルトの名無しさん
2006/09/04(月) 05:59:34書き込まれてしまいました。
コード、段落とかint main()とか抜けててすみません。
0056デフォルトの名無しさん
2006/09/04(月) 06:09:48> すごい簡単なことなんですが、ifの条件ってintだと、
> 0はfalseでそれ以外はtrueっていうことでよかったでしょうか。
良い。
> 自分で関数作るときに-1をfalseにしてたんですが、
> ほかの人がみたら変に思われますか?
非負値を返す関数のエラーとして負値を返す事はある。
getchar の EOF とか。
真偽値しか返さない場合は、偽の場合 0 を返すのが当然。
真の方に関しては、何を返すかは case by case だが、
普通は 1 を返したのでいい。
is 系関数とか、真の時 1 以外の値も返す実装の場合もあるけど、
これは高速化の為にそうしてるだけ。
まあどちらにしろ、非 0 を返すのが当然。
C++ なら普通は bool 型にして true/false を返すけど。
0057デフォルトの名無しさん
2006/09/04(月) 06:29:01勉強始めたばかりなんですが、本でエラーのとき
return -1っていうのがあったような気がして、
-1にしてたんですが、if文書いてて「あれ」っと思いました。
いろんな種類のエラーを返す複数のエラー処理を
してたのも知れません。
0が偽で1が真ですか。了解しました。
0058デフォルトの名無しさん
2006/09/04(月) 09:44:59「エラーを返す」と「偽を返す」の違いを考えてみよう
0059デフォルトの名無しさん
2006/09/04(月) 21:24:030 を正常として、他の値をエラーとするね。
0060デフォルトの名無しさん
2006/09/04(月) 21:31:230061デフォルトの名無しさん
2006/09/04(月) 21:41:190062デフォルトの名無しさん
2006/09/04(月) 23:23:190063デフォルトの名無しさん
2006/09/04(月) 23:28:300064デフォルトの名無しさん
2006/09/04(月) 23:30:30std::vector<std::vector<int> > array;
とある場合、clearをする場合は
array.clear();
を呼ぶだけでメモリは解放されるのですか?
それともループでまわしながら解放しなければいけませんか?
0065デフォルトの名無しさん
2006/09/04(月) 23:37:51array.clear() でいいよ。ループは要らない。
006664
2006/09/04(月) 23:54:11どうもありがとうございます。
助かりました。
0067デフォルトの名無しさん
2006/09/05(火) 00:04:00入門用の本とかを見ると、C++のクラスは
Javaで言うJavaBeansみたいな使い方ばかり書いてあるけど、
関数の塊のようなクラスは、普通作らないものなのでしょうか?
単純にヘッダをインクルードして関数を呼び出すものなのか、
それとも関数群をクラスにして、そこから呼び出したほうがいいのか。
悩んでおります。
0068デフォルトの名無しさん
2006/09/05(火) 00:09:48クラスにするメリットがあるなら、そうすればいい。
Java とか関係無しに、それだけの話じゃないのか?
006967
2006/09/05(火) 00:24:16オブジェクト指向って言うから、オブジェクト的にしなきゃ
いけないのかなぁ、と思いまして。
好きにすりゃいい、ってことなんでしょうけど。
特にメリットもなく、関数全部クラスにしたようなプログラムは
クソソース扱いなんだろうかと思うと、夜も寝られません。
0070デフォルトの名無しさん
2006/09/05(火) 00:34:30何のメリットも無いのに複雑度を上げるソースは糞ソースに違いない。
0071デフォルトの名無しさん
2006/09/05(火) 00:40:54俺からすれば、これはJavaが普通の関数を持てない(全てクラス内に入れないといけない)から、
仕方なくやっているという風にしか見えない。
007267
2006/09/05(火) 00:46:56確かにそうッスね。
ライブラリとして、クラスにしてまとめるのも変?
>>71
あ、僕も最初はそう思ってたけど、だんだん麻痺して、
最初にクラスありきな頭になってたかも。
0073デフォルトの名無しさん
2006/09/05(火) 00:54:51まぁ、共通のデータ構造を持っているならネームスペースに放り込んじゃえばいいしね。
0074デフォルトの名無しさん
2006/09/05(火) 08:13:31いうアプリを作りたいのですが質問です。
複数のテキストファイルを選択して、zipなどで圧縮するというのは
できると思うんですが、新しく増えたテキストファイルを圧縮ファイルと
一緒にする方法を悩んでいます。
私の頭では、下記のような手順しかできそうにありません。
�@圧縮したファイルをフォルダに解凍
�A新しいファイルをそのフォルダにコピー
�Bまとめて圧縮
ただ、この方法だと圧縮された容量の大きいファイルを
毎回、解凍、圧縮することになります。
それで、下記のようなようなことをしたいんですが
アドバイスをお願いできないでしょうか。
新しいファイルを圧縮して、それを圧縮ファイルに追加で
書き込むっていうことができれば、負担が少なくて良いかと
思っているんですがどうなんでしょうか。
また、圧縮ファイル内でもファイル名で区切れば、
全部解凍しないでも、そのファイル名での区間を
読み取って解凍すれば部分的に取り出すことができると思います。
えっと、圧縮するときも解凍するときも毎回丸々全部を
計算しないで、加えるところだけ圧縮、
読みたいところだけ解凍って言うことがしたいです。
0075デフォルトの名無しさん
2006/09/05(火) 08:16:28やりたいことはわかった。あとは、何をやったらどんな問題が出たのかも書いてほしい。
0076デフォルトの名無しさん
2006/09/05(火) 08:18:11使ってる圧縮フォーマットは何?
ライブラリ使って操作してるんなら、どのライブラリ?
0077デフォルトの名無しさん
2006/09/05(火) 08:25:140078デフォルトの名無しさん
2006/09/05(火) 08:38:15>>76
すみません。実はこれから作ろうと思ってます。
ろくに調べないで質問してしまい
申し訳ございません。当方、初心者なのでこういうことが
実現可能かどうかわからず、それが知りたいということでした。
確かに、何が聞きたいのかわからない文章でした。
実現できそうということで、ひとつずつ調べて
書いてみます。
わからないことがあったら、また
よろしくお願いします。
時間掛かりそうですが、できたらコード書きます。
ありがとうございました。
0079デフォルトの名無しさん
2006/09/05(火) 08:45:230080デフォルトの名無しさん
2006/09/05(火) 10:02:02m9プ
0081デフォルトの名無しさん
2006/09/06(水) 11:37:38何かのライブラリ使うなら、マニュアルを百万回繰り返して読んでみてくれ。
俺なら、>>79の方法をとるが…。(でも、ZIPだけシェアウェアだったような希ガス…。)
うろ覚えですまんが、lzhだったら、全体のヘッダの後に、個数分の(ファイルごとのヘッダ+圧縮データ)が並んでるだけ。
だから、最後に単純にデータ付加すりゃヨロシ。
zipは知らないので、今、仕様を斜め読みしてみたが、最初のヘッダがなくて、個数分の(ファイルごとのヘッダ+圧縮データ)が並んで、
なんか、最後に変なデータ(ディレクトリツリーのデータ?)がついてるみたい。
(バイナリエディタで、zipファイルを覗いてみても、最後のあたりに、ファイル名のデータが入ってるね。)
まあ、それでも、たいした大きさじゃないので、どこかにデータ退避させれば、簡単にデータ付加できるだろ。
0082デフォルトの名無しさん
2006/09/07(木) 14:53:42PGM形式の画像を読み込みたいんですが、コメント行の読み飛ばしなどがよくわかりません。
どうやって読み込んだらいいのでしょうか?
0083デフォルトの名無しさん
2006/09/07(木) 15:01:05つ[libpnm]
0084デフォルトの名無しさん
2006/09/08(金) 06:22:280085デフォルトの名無しさん
2006/09/08(金) 07:46:02pngじゃないのかよワロス
テキスト形式の画像フォーマットなんだ。おもしろい。
読み込み専用でいいなら、Susieのプラグインもあるみたいだね。
コメント行の最初は#になってるんだね。(改行は\n限定(\r\n不可)で。)
じゃ、最初1バイト読んで、分岐させて、次の行に逝けばいいじゃん。
ファイルから読んでるのか、メモリから読んでるのか、
また、テキスト読み込みには、何のクラス・関数使ってるのか分からんので、
これ以上は答えられない。
>>84
基本情報技術者・ソフトウェア開発技術者は持ってるので、
別の資格が欲しいってこと?
0086デフォルトの名無しさん
2006/09/08(金) 08:55:19基本情報は取ったんだけど何とろうか迷ってる
さすがに今更サーティファイのCやJAVAなんて受ける気になれないしさ
0087デフォルトの名無しさん
2006/09/08(金) 09:14:140088デフォルトの名無しさん
2006/09/08(金) 11:27:15手元の本3冊にも全く書いてないのですが
どのように書けばよいのでしょうか。
コールバック関数は普通の関数みたいなんですが、
呼び出す側の関数がどのように書くものなのかわかりませんでした。
下記は、pro2の引数がおかしいっていうエラーがでますが
呼び出した関数が実行されて、次にコールバック関数が実行、
"hello2hello"と出力されることを期待して書きました。
ネットで関数のポインタを渡すと呼ばれるって解説があったので、
ただ、priを引数に入れただけです。
これを動くようにしたいんですが、よろしくお願いします。
簡単に説明しているページなども歓迎です。
#include<stdio.h>
int pri(){
char* str = "hello";
printf("%s",str);
return 1;
}
int pri2(pri){
char* str = "hello2";
printf("%s",str);
return 1;
}
int main()
{
pri2(pri);
return 1;
}
0089デフォルトの名無しさん
2006/09/08(金) 11:35:190090デフォルトの名無しさん
2006/09/08(金) 13:09:32関数ポインタで、ぐぐれば良かったですか。
見てみます。
ありがとうございました!
0091デフォルトの名無しさん
2006/09/08(金) 15:17:37関数ポインタのページいくと、コールバック関数について
触れているページもありました。
自分で作った関数を引数にして渡せるAPI関数(なかのコードがわからないブラックボックスの)
なんか見かけるんですが、ちゃんとその関数は、返り血の型、引数の型と個数が
定義されていて関数の中でポインタで呼び出されてるんですね。
ただ単に、引数にコールバック関数の名前だけを入れると
実行されるわけでは無いんですね。
普通に考えてもそんな意味のわからないルール作らないですよね。
見かけてもいきなり関数名だけ、引数に入れているので今まで
意味がわかりませんでした。
と思ったのですが、こういう解釈でよかったでしょうか。
0092デフォルトの名無しさん
2006/09/08(金) 18:34:13解釈と感想がごっちゃになっててよくわからん。
きっと君自身ごっちゃになっているのだろうね。
先ずは、他人にきちんと説明できるように整理してみたら?
0093デフォルトの名無しさん
2006/09/09(土) 14:09:42OS:windows2000
コンパイラ:Borland C++
プログラム中においてフォルダを作成して
その中にデータファイルの保存をしたいんですけど、
どうやればいいんですか?
0094デフォルトの名無しさん
2006/09/09(土) 15:06:52009593
2006/09/09(土) 17:31:20#include<windows.h>
int main(void)
{
system("md test");
return 0;
}
これで実現することができました。
ただこれだとフォルダ名が固定になってしまいます。
そこでフォルダ名を決めれるようにするにはどうしたらよいのでしょうか?
0096デフォルトの名無しさん
2006/09/09(土) 18:26:21mkdir()は使わんの?
どちらにしろユーザーから入力された文字列を渡せばいいじゃない。
めっちゃ基本中の基本だけど。
0097デフォルトの名無しさん
2006/09/09(土) 18:31:00つ[sprintf()]
つ[boost::format()]
つ[_mkdir()]
つ[CreateDirectory()]
つーか、調べるってことはできんもんかね。
0098デフォルトの名無しさん
2006/09/09(土) 21:32:040099デフォルトの名無しさん
2006/09/10(日) 14:20:44外で何されてもわかんないもんなー。
0100デフォルトの名無しさん
2006/09/10(日) 20:58:47tagData * EraseNext(tagData *p);
こういう文を見かけたのですが、どういう意味かわかりません
tagdata * の”*”はどういう意味でしょうか?
0101デフォルトの名無しさん
2006/09/10(日) 21:18:35仮引数と同じ、tagDataへのポインタ。としか言いようがない。
0102デフォルトの名無しさん
2006/09/11(月) 10:12:050103デフォルトの名無しさん
2006/09/11(月) 10:33:44○たった今学習を始めたところ
0104デフォルトの名無しさん
2006/09/11(月) 15:33:010105デフォルトの名無しさん
2006/09/11(月) 17:51:29telnetのクライアントの送受信の並列処理(マルチスレッド)について質問です。
telnetクライアント並列処理(親スレッドは受信、子スレッドは送信)を
実装することは、どういうことができるようになることなのでしょうか?
受信と送信のスレッドが起動していて、受信も送信もどちらでもできて、
単純な"送信→受信"だけじゃなくて、
「接続が確立したらいきなり"受信だけ"とか"受信→送信"というのもできる」ように
なることをいうのでしょうか?
サーバーの場合は、親スレッドがアクセプトして、
子スレッドを作って処理をさせることによって、
「複数のクライアントを相手することができる」というのは勉強しました。
よろしくお願いします。
0106デフォルトの名無しさん
2006/09/11(月) 18:14:08送信が連続している状況でも安定して受信できる。
telnetのプロトコルはチャットほど単純じゃないから敢えてそうすることもあるんでないかな?
0107デフォルトの名無しさん
2006/09/11(月) 21:15:07ありがとうございます。
>送信が連続している状況でも安定して受信できる。
スレッドがたくさん作られるということでしょうか?
スレッドだとちょっと複雑で自分的に難しいので、マルチプロセスで考えさせてください。
以下かなり省略した物になりますがコードです。
if(pid>0){
//親プロセス
while(1){
//受信処理
}
//シグナル送信、プロセス終了の処理
}
else if(pid=fork()){
//子プロセス
while(1){
//入力と送信処理
}
//シグナル送信、プロセス終了の処理
}
サーバーの場合、たくさんのプロセスが作られることになると思いますが、
上記のコードの場合は、親と子2つしかプロセスが作られないことになりますでしょうか?
アプリケーションを起動すると"標準入力から送信"、"受信"この2つのプロセスが起動して同時にできるだけ。
送信を連続でした場合、受信は並列ではなく、送信した命令の順番どおり受信することになるでしょうか?
長文すみません。変なところあると思いますので
ご指摘ください。補足させていただきます。
よろしくお願いします。
0108デフォルトの名無しさん
2006/09/12(火) 01:46:54いいえ。
>上記のコードの場合は、親と子2つしかプロセスが作られないことになりますでしょうか?
はい。
>送信を連続でした場合、受信は並列ではなく、送信した命令の順番どおり受信することになるでしょうか?
サーバの御心次第です。
telnetプロトコルもそうだが、例えば標準入出力をみても必ずしも対になっていないことに注意。
0109デフォルトの名無しさん
2006/09/12(火) 08:23:15ずばりの回答ありがとうございます。
すっきりできました。
0110デフォルトの名無しさん
2006/09/22(金) 03:42:09プロセス内のスレッドの数が知りたいんですが方法
ありますでしょうか。
よろしくお願いします。
0111デフォルトの名無しさん
2006/09/24(日) 01:24:23下記のコードは10回繰り返し、execvを繰り返して、
プロセスが生成できなかったときは、もう一度繰り返したいため
失敗したときに、i--;してます。
・このコードでエラーのときの処理できているか確認したいのですが、
プロセス生成をわざと失敗するようにすることできるでしょうか?
・i--で繰り返しの処理はできてるでしょうか?
for(i=0;i<10;i++){
//子プロセスの生成
if((pid=fork())==0){
execv(path,opt);
}else if(pid>0){
//親プロセス
}else{
//子プロセス生成失敗の時はiを一つ減らして繰り返し
i--;
}
}
0112デフォルトの名無しさん
2006/09/24(日) 03:10:28実験してみたいだけならこんなマクロでも用意すればよろしかろ。
#define myFork(x) (fgetc(stdin) != (x) ? fork() : -1)
#んで、fork()の代わりにmyFork('\n')とでもすればいい。
0113デフォルトの名無しさん
2006/09/24(日) 07:36:29関数のマクロ定義ってこういうふうに使えるんですね。
はじめてみました。
ど初心者なので感動しました。
どうやって勉強していけば、こういう感覚が身につくんだろう。。。
0114デフォルトの名無しさん
2006/09/24(日) 20:28:570115デフォルトの名無しさん
2006/09/25(月) 09:28:130116デフォルトの名無しさん
2006/09/26(火) 00:58:06やってることは同じでも「勉強」だと認識してやってるようなうちは芽が出ないってこと。
0117デフォルトの名無しさん
2006/09/26(火) 09:10:230118デフォルトの名無しさん
2006/09/26(火) 12:04:370119デフォルトの名無しさん
2006/09/26(火) 12:09:540120デフォルトの名無しさん
2006/09/28(木) 10:52:48ファイルディスクリプタをflockの引数に入れてロックする方法はできました。
ディスクリプタではなくて、ストリームを使って排他モードで開きたいと思ってます。
コードです。
#include <fstream>
int main(){
using namespace std;
ifstream fin;
fin.open("filepath",ios::in, filebuf::sh_none);
return 0;
}
こんなエラーが出ます。
error: `sh_none' is not a member of `std::filebuf'
tp://www.codeguru.com/forum/printthread.php?t=293846
こういうページが見つかったので、filebuf.sh_noneにしてみましたが
だめでした。
買ったばかりのlinuxのパソコン壊れて、現在の環境はcygwinです。
・filebuf::sh_noneはどのようにすればよいでしょうか。
・排他制御は、他にスマートで簡単な方法ありますでしょうか。
よろしくお願いします。
0121デフォルトの名無しさん
2006/09/28(木) 11:49:22正攻法ではファイルディスクプリタで読み書きするバッファクラスを自分で作れということになるのだが、まあ面倒。
0122デフォルトの名無しさん
2006/09/28(木) 14:42:23お返事ありがとうございます。
>filebuf.sh_noneなんて非標準だから使えないのは別に悪く無い。
非標準とかそういうこともあるんですか。知りませんでした。
tp://www.kumei.ne.jp/c_lang/cpp/cpp_38.htm
有名そうなページでもfilebufってでてきたので、エラーがでるのは、
自分の書き方が変だと思いこんでました。
いろいろ検索してみると、ifstreamで排他モードはできない
と書いてある掲示板の書き込みもありました。
windowsだとライブラリあるんですが、linuxだとそういうの
簡単にできるの無いっぽいです。
boostもちょっと見てみたんですが良くわからないし、
自分のスキル的にopen+flockじゃないとだめのようです。
0123デフォルトの名無しさん
2006/09/28(木) 15:04:290124デフォルトの名無しさん
2006/09/29(金) 00:01:02flock調べたんですが、どういうところが完全じゃないんでしょうか?
cじゃなくてperlのページなんですが、自分でファイルのある無しの
関数作るよりも、flock使うほうがいいってあったんですが。
検索していたらこういうページを発見しました。
tp://www.tietew.jp/cppll/archive/4753
[io]fstream <=> fd
こういうことできるってことしか読み取れませんでしたが、
1、[io]fstream で開く、
2、[io]fstream => fdでディスクリプタ取得
3、flockでロック
4、[io]fstreamで操作
っていうことができないでしょうか。
ストリームとディスクリプタがどんなものかわかって無いので、
並行して操作できるのかどうかわかりませんが。
4番目の操作が、ストリームで操作できないと、
はじめからディスクリプタで開くしかないですよね。
読んでもわからないので、とりあえずやってみるしか無いでしょうか。
0125デフォルトの名無しさん
2006/09/29(金) 06:50:45誰もがflock()使ってアクセスする保証があるなら問題ないが。
0126デフォルトの名無しさん
2006/09/29(金) 09:43:570127デフォルトの名無しさん
2006/09/29(金) 11:25:46>>126
お返事ありがとうございます。
>flock()は、flock()を使わないプロセスからのアクセスを制限できないんじゃないのか?
なんかひらめいたかもしれません。
はじめfdで開いてflockします。同じプロセスならそのままfstreamでファイルを
開いて操作できそうです。
違うプロセスでもflockを呼び出さなければfstreamでファイルを開いて
操作できそうですね。実験したらflockを呼び出さなければ待機しませんでした。
fstream.openって返り値ないので、ちゃんとオープン
してるのかわからないんですが。書き込みしてみて確認してみたいと思います。
なんかflockの仕組みがやっとわかってきました。
>>124みたいなややこしいこと考えなくてもよさそうです。
○自前のflockでも他のプロセスは同じ自前のflockを、
呼び出さないとだめなので、その点はシステムコールの
flockと同じということよろしかったでしょうか?
○必要なくなってしまいましたが、[io]fstream <=> fd
の関数はどれでどのような使い方かご教示
お願いできないでしょうか。
参考になるのかわからないですが
tp://www.tietew.jp/cppll/archive/4767
環境が対応していないのか、わかりませんせんがいろいろ
試しても動きませんでした。
よろしくお願いします。
0128デフォルトの名無しさん
2006/10/01(日) 13:49:36次の処理に移る、ということをしたいんですが
どのように書けばいいのでしょうか。
0129デフォルトの名無しさん
2006/10/01(日) 14:01:09関数内で、tm構造体からforかwhileで時間取ってはその時間の差分とって
条件満たせば、関数を抜け出すようにしてみれば?
0130デフォルトの名無しさん
2006/10/01(日) 14:15:22ずっと入力待ちなるんじゃなくてしばらくしたら飛ばしたいんです。
while(時間の条件){
scanfとか; ←ここでずっと止まったりしないですかね?
}
0131デフォルトの名無しさん
2006/10/01(日) 14:24:45「キーボードが押されたか」の検出は。
0132デフォルトの名無しさん
2006/10/01(日) 14:37:520133デフォルトの名無しさん
2006/10/01(日) 14:48:47WindowsならWindowsの関数、UnixならUnixの関数使えばできるよということ。
0134デフォルトの名無しさん
2006/10/01(日) 15:14:13Windowsだったら思い切ってAPIスレへ。
0135デフォルトの名無しさん
2006/10/02(月) 01:13:41今、VC++でプログラミングしてるんですが、
ダイアログボックスから変数を持って行きたい時はどうすればいいですか?
例えば
ダイアログボックスで
次の数の二乗を算出します
とか書いてユーザに入力を求めて、そしてユーザが入力したら
その値を元に計算→出力
的な感じなんですが…
0136デフォルトの名無しさん
2006/10/03(火) 03:14:220137デフォルトの名無しさん
2006/10/04(水) 22:20:22{
// コンストラクション
public:
CDSig(CWnd* pParent = NULL); // 標準のコンストラクタ
・
・
・
以下略
------------------------------------
VCでダイアログを作成しクラスCDSigを作成したところ自動で上のようなクラスが
自動で作成されました。
標準でコンストラクタが出来ているようですが、自前でクラス内の変数を初期化する
コンストラクタを作成するにはどうしたらよいのでしょう?
名前CDSigの定義を追加すると
error C2668: 'CDSig::CDSig' : オーバーロード関数の呼び出しを解決することができません。
と怒られます。
0138デフォルトの名無しさん
2006/10/05(木) 00:05:25その「標準のコンストラクタ」の定義を変更しろ。
0139デフォルトの名無しさん
2006/10/07(土) 14:42:09「変数aとbの符号が同じ場合」という条件を判断する関数があれば教えてください。
自分はif ( ( a < 0 ) == ( a < 0 ) ) と書いてるのですが、あまりに非効率な気がするので...
0140デフォルトの名無しさん
2006/10/07(土) 14:49:070142デフォルトの名無しさん
2006/10/07(土) 15:22:13有効数字15桁ってどんな型?
まぁ、何をもって効率とするかが未定義なのでそもそも答えようがないけど。
・コーディングの効率なら、テンプレート関数でそういう関数を一個作っておけばいい。
・実行効率なら、型ごとに大抵は符号ビットを持っているだろうからそれを見ればいい。
0144デフォルトの名無しさん
2006/10/07(土) 15:41:46変数(のbit)同士でxorでも取ったあと、
符号bitのみ見ればいいんじゃないかね。
0145141
2006/10/07(土) 16:00:07どうやって1bitを見ればいいのかさっぱりわかりません。
コードを書いてもらえませんか...
0146デフォルトの名無しさん
2006/10/07(土) 16:12:580147デフォルトの名無しさん
2006/10/07(土) 16:46:540148デフォルトの名無しさん
2006/10/07(土) 17:05:08これが画像処理の1ピクセルごとに繰り返されるのなら
気になるかもしれんが、そうでもないならこれで十分。
double使ってるんだからそんなにシビアなものを組んでるとも
思えんし。シビアなところならdouble使うのをやめる工夫をして、
整数タイプでxorしたらいい。
もしどうしてもって言うなら>>146だけど、エンディアンには気を
つけてね。
0149デフォルトの名無しさん
2006/10/07(土) 17:12:140150141
2006/10/07(土) 17:20:382000回ほどのループなので、計算負荷が高すぎて困っているというわけではないのですが
Cの先輩方はどのように書くのか知的好奇心から質問しました。
&も使えるように練習してみます。ありがとうございました。
0151デフォルトの名無しさん
2006/10/07(土) 17:27:28おまえが小手先でごちゃごちゃやろうとしている方法よりも
単純な>>139のままのコードの方がが、最適化されて速くなっている可能性も十分ある。
とりあえず、何か小技を使おうとする前に
必ずアセンブラ出力を見て不満があるかどうかを判断すべき。
もちろん、それ以前に、そこまで速度を求める必要があるのか
あるいは他の部分で工夫すべき点がないのか、ということをよーーく考えるべきだが。
0152デフォルトの名無しさん
2006/10/07(土) 18:14:190153デフォルトの名無しさん
2006/10/08(日) 12:42:50何に使うのか知らないけど、これじゃ、ちゃんと動かない可能性ある罠。
a<0が、1返して、b<0が2返したら、!=になるし。
また、aかbのどちらかがゼロだったらどうする?(プラス扱いするならいいけど)
おいらなら、signって関数(符号に応じて-1,0,1を返す)を作って、
sign(a)==sign(b)って書く。
おそらく関数の中でif文使うから、実行効率は最悪だけど、
実行効率より、バグ鳥する時のコードの読みやすさ考えないと。
あと、どうしても効率最優先でも、何に使うのかが分からないと、最適な判別式は決められない。
0154デフォルトの名無しさん
2006/10/08(日) 12:47:330155デフォルトの名無しさん
2006/10/08(日) 13:15:16a < 0 が0か1であることは保証されている。
0156デフォルトの名無しさん
2006/10/08(日) 13:30:28Cの比較演算の仕様を勉強しなおしてからお越しください。
0157デフォルトの名無しさん
2006/10/08(日) 14:36:37The operands shall have arithmetic, enumeration or pointer type. The operators < (less than), > (greater
than), <= (less than or equal to), and >= (greater than or equal to) all yield false or true. The type of
the result is bool.
であって,bool 同士の == が正常に動くことも保証されてるから >>153 はアホ.
0158デフォルトの名無しさん
2006/10/08(日) 23:56:38using std;;string;
struct A {
string a;
};
struct B {
string b;
B &operator=(const string &s){
b = s;
}
};
int main(void){
A a;
A aa = a; // xxx
B b;
B bb = b;
return 0;
}
---
質問なのですが、main()のxxxのところってまずいですよね?
0159デフォルトの名無しさん
2006/10/08(日) 23:59:420160デフォルトの名無しさん
2006/10/09(月) 00:00:15B &operator=(const B &b0){
b = b0.b;
}
0161デフォルトの名無しさん
2006/10/09(月) 00:02:14stringのメンバにポインタがないことは保障されているのですか?
0162デフォルトの名無しさん
2006/10/09(月) 00:09:21stringはコピーコンストラクト可能かつ代入可能。
ポインタは含まれているが、コピー時は生ポインタを明け渡すわけじゃなくって
ポインタが指し示す内容をコピーする様に作られてる。
よって何の問題も無い。
0163デフォルトの名無しさん
2006/10/09(月) 00:15:33つまり、デフォの実装が
A A::operator=(const A &a0){
memcpy(this, &a0, sizeof(A));
}
0164デフォルトの名無しさん
2006/10/09(月) 00:17:34デフォの実装が
A A::operator=(const A &a0){
memcpy(this, &a0, sizeof(A));
return *this;
}
これだと、メモリ二重開放にならないかと心配したわけです。
0165デフォルトの名無しさん
2006/10/09(月) 00:21:22たまたまPODメンバがまとまっていれば、memcpy()相当の実装をするかもしれない。
0166デフォルトの名無しさん
2006/10/09(月) 00:21:48つーかそんな馬鹿な実装はしちゃいかん。
C++におけるmemcpyは純粋に生のバイナリデータ転送用で、メンバのコピー用じゃない。
余談だけど、thisがポインタなのはthis登場時にC++がまだ参照をサポートしてなかったからで、
thisがポインタであることを副作用的に使うコード(memcpyの引数にする、this[2]とか書く、エトセトラ)は
総じて何か勘違いしている傾向。
忌避したくらいで丁度いいぞ。
0167デフォルトの名無しさん
2006/10/09(月) 00:22:32>>163-164 で心配している通り memcpy な実装になってメモリリークする。
0168デフォルトの名無しさん
2006/10/09(月) 00:27:03服脱いで正座してbasic_stringのコード読んで来い。
そんなになってたまるか。アホらしい。
0169デフォルトの名無しさん
2006/10/09(月) 00:29:57コンパイラが
A A::operator=(const A &a0){
a = a0.a;
}
と解釈してくれるものなのでしょうか?
0170デフォルトの名無しさん
2006/10/09(月) 00:36:15>165
0171デフォルトの名無しさん
2006/10/09(月) 00:37:51operator =が定義されていないときのデフォルトの実装は、
各メンバと基底クラスに代入演算子を使用したのと同じ動作をするということになっている。
また、コピーコンストラクタにも同じような規定が存在する。
162の言うとおりstd::stringが適切なコピーコンストラクタやoperator =を持っているため、
158/164の心配は杞憂だということになる。
0172デフォルトの名無しさん
2006/10/09(月) 00:38:560173デフォルトの名無しさん
2006/10/09(月) 00:41:26それ全然問題の本質じゃないから。
0174デフォルトの名無しさん
2006/10/09(月) 00:43:06>158の場合では代入演算子ではなく、コピーコンストラクタが使われる。
例が悪くてすみません、全くもってその通りでした。
>>165
これがFAでしたか。
皆様ありがとうございました。
0176デフォルトの名無しさん
2006/10/09(月) 01:56:06ちょっと説明が下手でわかりにくいかもしれませんが、
ある関数の中で、引数の配列の長さを知ることはできるでしょうか?
例えば配列の平均を求める関数averageを作りたいとき
main関数内でa[100]とかb[80]とかを定義して、average関数に引き渡すとします。
(average(a)みたいな感じで)
このとき平均を求めるには当然、配列の要素の数が必要になるわけですが、
これをaverage関数内で求めることはできるのか?という質問です。
今は配列とともに要素の数もaverage関数に渡しているのですが、他に良い方法があったらご教授ください。
0177デフォルトの名無しさん
2006/10/09(月) 02:01:26C++なら関数テンプレートにすればできんことはないよ。
多分↓こんな感じにすればおk
template<int array_size>
int average(const int array[array_size])
{
...
}
0178デフォルトの名無しさん
2006/10/09(月) 02:15:52int average(int (&array)[N])
0179デフォルトの名無しさん
2006/10/09(月) 02:16:34sizeof(array) / sizeof(array[0])
0180デフォルトの名無しさん
2006/10/09(月) 02:17:140181デフォルトの名無しさん
2006/10/09(月) 02:22:05C++なら177-178のように直接要素数をテンプレート引数にして配列への参照を引数にするのもいいが、
Boost.Rangeを使えばついでにstd::vectorなんかも渡せるようになってお得かもしれない。
ただしコードが難解になりやすいきらいがある。
#include <iostream>
#include <numeric>
#include <boost/range.hpp>
template<typename RandomAccessReadableRange>
typename boost::range_value<RandomAccessReadableRange>::type
average(RandomAccessReadableRange& r)
{
typedef typename boost::range_value<RandomAccessReadableRange>::type value_type;
return std::accumulate(boost::begin(r), boost::end(r), value_type()) / boost::size(r);
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
std::cout << average(arr) << std::endl;
}
0182176
2006/10/09(月) 12:05:08実はC++はまだ勉強してないんですが、これを機に勉強してみようと思います。
みなさんご丁寧にありがとうございました!
0183デフォルトの名無しさん
2006/10/10(火) 17:29:20Cなら配列と要素数を構造体にまとめる方法もある。
配列の要素数を知りたいという問題の解決には全くなっていないが、多少管理が楽になる?
0184デフォルトの名無しさん
2006/10/11(水) 03:17:220185デフォルトの名無しさん
2006/10/11(水) 22:40:17以下コードです。
#include <stdio.h>
#include <string>
#include <vector>
int main(){
std::vector<std::string> data;//連想配列を想定
enum key_type {name,street,tel} _key;
//name=val_name&street=val_street&tel=val_tel
//この文字列を分割して、一番目のkeyとvalueを取り出す
std::string key="name";
std::string value="val_name";
//連想配列と仮定して代入したいのですが、
//'_STL::string' から 'key_type' へのキャストはできないというエラーがでます
data[(key_type)key]=val_name;
printf("%s",data[(type)key].c_str());
return 0;
}
文字列を分割して取り出した、key値を列挙型の値にできれば
うまく連想配列に代入できるんですが、上のようなコードで
動くようにできないでしょうか。
よろしくお願いします。
0186デフォルトの名無しさん
2006/10/11(水) 22:47:07×data[(key_type)key]=val_name;
○data[(key_type)key]=value;
もうちょっとはっきり違う名前にすればよかったですが、
_keyは列挙型で、keyはstd::string型です。
よろしくお願いします。
0187デフォルトの名無しさん
2006/10/11(水) 22:55:28key_typeのname, street, telなどといった列挙子は、
コンパイル時定数で、基本的に実行時に参照する方法はない。
C++は、どちらかというと何でも静的(コンパイル時)に解決するのが特徴。
どうしても実行時に文字列から列挙子を取り出したければ、
std::map<std::string, key_type>を使えば何とかなるだろうが、
だったら、初めからそのdataをstd::map<std::string, std::string>にすればいいだろということになるわけで。
0188デフォルトの名無しさん
2006/10/11(水) 22:57:010189デフォルトの名無しさん
2006/10/11(水) 23:07:25>>188
std::map検索してみました。
連想配列みたいなことができそうですね。
ありがとうございました。
0190デフォルトの名無しさん
2006/10/11(水) 23:11:07使って、中にはstd::pair<std::string, std::string>を入れておけばそこそこの
速度は出るが。
0191デフォルトの名無しさん
2006/10/11(水) 23:34:12みたいな事じゃなくてそのまんま。
0192デフォルトの名無しさん
2006/10/11(水) 23:35:36std::search_heap()ってalgorithmにはないのね。
素直にstd::sort掛けてからstd::binary_search()使うしかないか。
0193デフォルトの名無しさん
2006/10/11(水) 23:40:220194デフォルトの名無しさん
2006/10/12(木) 00:11:20それ良さそうだね。今std::mapと、std::pairをぶち込んだstd::vectorを
作って比較したら、std::mapの方がstd::vectorのstd::lowerbound()を
使ったバージョンより2倍速かった。自分の環境でですが。
0195デフォルトの名無しさん
2006/10/12(木) 07:01:35for(double t=0;t<100;t+=0.1)
{
/////
}
このようなforループで、変数tを増加させているのですが、
途中でtの値を出力すると、
10.000000000018849
のように、小さな誤差が蓄積しています。
割り算とかはではなく、単純な足し算のみしかしていないのですが、
このような誤差はどこから来るのでしょうか?
0196デフォルトの名無しさん
2006/10/12(木) 07:15:11それにしても誤差が大きいな。こっちだと 10 に対応するのは 9.9999999999999805。
理論的には 0.1 を有限桁数の二進数で表したときの誤差が 1e-16 くらいで、
これを 10/0.1 = 100 回くらい足すから 1e-14 くらいの誤差になるはずだけど。
こっちの結果はそれに適合してるんだけどなあ。
0197デフォルトの名無しさん
2006/10/12(木) 13:15:49for(double t=0;t<1000;t+=1)
{
/////
}
とかなら、誤差が蓄積しないのでしょうか?
0198デフォルトの名無しさん
2006/10/12(木) 15:13:38基本的に浮動小数は誤差が入ると思え。
ループ回数が重要ならループ変数は必ず整数にするのが原則。
ただし、 >>197 の例だと(おそらく)誤差は全く出ない。
詳しくは浮動小数の表現(IEEE754方式)を調べるべし。
0199デフォルトの名無しさん
2006/10/15(日) 17:42:36こちらでも良かったでしょうか。
スレッドA,B,Cがあるとします。
このA,B,CをCriticalSectionクリティカルセッションを使うと
他のスレッドが処理していたらお互いに待つことになると思います。
そうじゃなくって、
Aが処理しているときはB,Cはストップ
Bが処理しているときは他のスレッドは待たない
Cが処理しているときは他のスレッドは待たない
ということがしたいです。
クリティカルセッション使うと、B,Cが処理しているときも
他のスレッドが待つことになってしまいます。
Aの排他制御する区間に入るまでに、B,Cは区切りのいいところまで処理して(ループの最後など)
待機をさせるというイメージです。
Aのスレッドだけコードのイメージです。
void thread_A(void){
//いろんな処理
//B,Cを区切りのいいところで、待機させる命令
EnterCriticalSection(§ion);
//排他制御
LeaveCriticalSection(§ion);
//いろんな処理
}
説明がくどくてすみません。
そもそもクリティカルセッションの話じゃないんでしょうか。
よろしくお願いします。
0200デフォルトの名無しさん
2006/10/15(日) 18:03:242.Win32API質問箱に行く
3.最高にド低脳な発言してください in ム板に行く
0201デフォルトの名無しさん
2006/10/15(日) 18:24:040202デフォルトの名無しさん
2006/10/15(日) 18:25:500203デフォルトの名無しさん
2006/10/15(日) 22:09:46スレッドご紹介ありがとうございます。
前に専門スレいったことあるのですが、初心者スレ行けって
いわれたこがあったりしたので難しいです。(汗
移動しようと思いましたが回答いただけたので、
今回はすみませんがよろしくお願いします。
0204デフォルトの名無しさん
2006/10/15(日) 22:10:38クリティカルセッションじゃダメですか。
セマフォじゃないのですが考えてみました。
グローバル変数flagを使います。
flagが1の時、スレッドAは実行、他B,Cは待機(Sleep)
flagが0の時、スレッドB,Cは実行、Aは実行しない(待機もしない)
void thread_A(void){
while(1){
//はじめにflagを立てる
flag=1;
//いろんな処理
//Aの処理が終わるので寝てたB,Cを起こすためflag=0
flag=0;
}
}
void thread_B(void){
while(1){
//はじめにflagをチェックして、値が1ならSleep
while(flag==1){Sleep(1000);}
//いろんな処理
}
}
//thread_Cも同様の内容です
これで実現できそうです。
セマフォについてですが、今回の処理に当てはめて考えるのが難しいのですが、
スレッドA,B,Cそれぞれ、どのような処理が必要かヒントいただけないでしょうか。
0205デフォルトの名無しさん
2006/10/15(日) 22:44:590206デフォルトの名無しさん
2006/10/15(日) 23:49:50Section
↑これなんて発音するか知ってる?
0207デフォルトの名無しさん
2006/10/16(月) 00:26:090208デフォルトの名無しさん
2006/10/16(月) 00:45:410209デフォルトの名無しさん
2006/10/16(月) 03:01:03クリティカルセッション ×
クリティカルセクション ○
でしたか。はずかしい。
ネットで検索してるときに、脳内で変換して
クリティカルセッションでもひっかかるので、
ごちゃごちゃにしてました。
>>205
お互いに排除する相互排除するサンプルとか見かけるんですが、
今回みたいにAが一方的に他を排除するっていうのが、どうなんでしょうか。
ミューテックスも勉強して考えて見ますが、掃き溜めレベルの僕としては
Sleepを使うのに気づいたのは奇跡でした。
0210デフォルトの名無しさん
2006/10/16(月) 06:04:09ミューテックス調べてみました。
一度にひとつのスレッドしか動かせないみたいなんですが、
今回の場合Aのときはひとつで動かしたいのですが、B,Cは同時に動くのちょっと
違うでしょうか。
0211デフォルトの名無しさん
2006/10/16(月) 11:29:580212デフォルトの名無しさん
2006/10/16(月) 11:46:210213デフォルトの名無しさん
2006/10/16(月) 17:03:36WaitForSingleObject(hMutex,INFINITE);
while(1){
//いろんな処理
}
ReleaseMutex(hMutex);
}
void thread_B(void){
//取ってすぐ戻す
WaitForSingleObject(hMutex,INFINITE);
ReleaseMutex(hMutex);
while(1){
//いろんな処理
}
}
//スレッドCも同様
これで大丈夫と思うのですが、きちんと処理できてますでしょうか?
linuxでいうlock,unlockでもできそうな気がしますが、同じようなものでしょうか。
0214デフォルトの名無しさん
2006/10/16(月) 17:13:38A は EntrerCriticalSection() / LeaveCriticalSection() して
B,C は TryEnterCriticalSection() しちゃダメ?
0215デフォルトの名無しさん
2006/10/16(月) 20:17:330216デフォルトの名無しさん
2006/10/16(月) 22:01:39ヒント。
最大カウント2のセマフォを作る。
A は2回待ってすることしたら2つ手放す。
B と C は1回待ってすることしたら1つ手放す。
0217デフォルトの名無しさん
2006/10/16(月) 23:44:13それだとAも待ち状態になっちゃうよ。
0218デフォルトの名無しさん
2006/10/16(月) 23:58:59C++ってオブジェクト変数の宣言だけでインスタンス化されるのが気持ち悪い。
0219デフォルトの名無しさん
2006/10/17(火) 00:35:31というか A が仕事している間 B、C を停止させる必要がある以上それは必須だろ。
0220デフォルトの名無しさん
2006/10/17(火) 00:46:14君、大丈夫?
0221デフォルトの名無しさん
2006/10/17(火) 01:05:55ありがとうございます。
なるほどです。EntrerCriticalSectionでも大丈夫な可能性があるんですか。
ただいま、セマフォでいっぱいいっぱいなのであとで必ず調べてみます。
>>216
ヒントありがとうございます。
コードはアドバイスいただいた通り、下のようにしてみました。
void thread_A(void){
//2回待つ
WaitForSingleObject;�@
WaitForSingleObject;�A
while(1){
//いろんな処理
}
//セマフォ2つ開放
ReleaseSemaphore;
}
void thread_B(void){
//1回待つ
WaitForSingleObject;
while(1){
//いろんな処理
}
//セマフォ1つ開放
ReleaseSemaphore;
}
//スレッドCも同様
処理の順番ですが、下記で当たってますでしょうか。(続く)
0222デフォルトの名無しさん
2006/10/17(火) 01:07:34・セマフォ2あるので、スレッドB,Cが実行
2順目なんですが、
・スレッドB,Cのどちらかの処理が終わって、ひとつセマフォが開放されて�@を通過。
・次に処理が遅れているB,Cのどちらかの処理が終わって、ひとつセマフォが開放されて�Aを通過。
・スレッドAが実行される。
っていうループになりますでしょうか。
セマフォの基本がまだわかっていないので、スレッドBがReleaseSemaphoreしたと
セマフォが1残っているので、またスレッドBが実行されないかとか変なこと考えてしまいます。
この辺はwaitがキューで入っているとかそういうことなのかと思って調べてみます。
>>220
違う方法もあるんでしょうか。
よかったら、アドバイスよろしくお願いします。
0223デフォルトの名無しさん
2006/10/17(火) 01:08:140224デフォルトの名無しさん
2006/10/17(火) 01:14:53たしかに、動いているの確認すればいいですが、
理解力に自身がないので、これであっているのか心配でして。。。
0225デフォルトの名無しさん
2006/10/17(火) 01:38:01かわいそう。
0226デフォルトの名無しさん
2006/10/17(火) 04:07:421sec(あるいはいくらか)のループが気に入らなければ>>213でOK。
何が気に入らんの?
0227デフォルトの名無しさん
2006/10/17(火) 05:34:19初心者なので、せっかくヒントもいただいたので、
セマフォも勉強したいと思いまして。
現状ですが悪戦苦闘中でして、下記のコードになりました。
void thread_A(){
while(1){
WaitForSingleObject(hSemaphore,INFINITE);
printf("AのWaitForSingleObject1を通過\n");
WaitForSingleObject(hSemaphore,INFINITE);
printf("AのWaitForSingleObject2を通過\n");
for(int i=0;i<5;i++){
printf("Aの処理中なのでB,C割り込んじゃダメ\n");
//Sleep(1000);
}
ReleaseSemaphore(hSemaphore,2,NULL);
}
}
void thread_B(){
while(1){
//1回待つ
WaitForSingleObject(hSemaphore,INFINITE);
printf("BのWaitForSingleObjectを通過\n");
//セマフォ1つ開放
ReleaseSemaphore(hSemaphore,1,NULL);
printf("Bのセマフォ1つ開放しました\n");
//Sleep(1000);
}
}
//Cも同様
0228デフォルトの名無しさん
2006/10/17(火) 05:35:48Sleep入れると大丈夫ですが、Sleep入れないと割り込み入ります。
できているようないないような。プログラミングがだめなので、わかりにくいです。
Sleep無いとだめということは、たぶん、だめってことですよね。
Sleepありは、出力下記のようになります。
AのWaitForSingleObject1を通過
AのWaitForSingleObject2を通過
Aの処理中なのでB,C割り込んじゃダメ
Aの処理中なのでB,C割り込んじゃダメ
Aの処理中なのでB,C割り込んじゃダメ
Aの処理中なのでB,C割り込んじゃダメ
Aの処理中なのでB,C割り込んじゃダメ
Aのセマフォ2つ開放しました
BのWaitForSingleObjectを通過
Bのセマフォ1つ開放しました
CのWaitForSingleObjectを通過
Cのセマフォ1つ開放しました
<繰り返しです。>
0229デフォルトの名無しさん
2006/10/17(火) 05:47:55ごちゃごちゃしてすみません。
printf("Aのセマフォ2つ開放しました\n");
がなたったようです。
void thread_A(){
while(1){
WaitForSingleObject(hSemaphore,INFINITE);
printf("AのWaitForSingleObject1を通過\n");
WaitForSingleObject(hSemaphore,INFINITE);
printf("AのWaitForSingleObject2を通過\n");
for(int i=0;i<5;i++){
printf("Aの処理中なのでB,C割り込んじゃダメ\n");
//Sleep(1000);
}
printf("Aのセマフォ2つ開放しました\n");
ReleaseSemaphore(hSemaphore,2,NULL);
}
}
void thread_B(){
while(1){
//1回待つ
WaitForSingleObject(hSemaphore,INFINITE);
printf("BのWaitForSingleObjectを通過\n");
//セマフォ1つ開放
printf("Bのセマフォ1つ開放しました\n");
ReleaseSemaphore(hSemaphore,1,NULL);
//Sleep(1000);
}
}
//Cも同様
0230デフォルトの名無しさん
2006/10/17(火) 06:16:11眠くてもう脳がだめみたいです。ほんとごめんなさい。
あと、割り込んでなかったみたいです。
Sleep無しの一部を切り取りましたが、
AのWaitForSingleObject1を通過後は、B,C割り込んでいいんでした。
AのWaitForSingleObject2を通過後は、B,C割り込めなければいいんですね。
ほんと、お騒がせしました。
あと<<217さんのご指摘が気になるのですが。
AのWaitForSingleObject1を通過
CのWaitForSingleObjectを通過
Cのセマフォ1つ開放しました
BのWaitForSingleObjectを通過
Bのセマフォ1つ開放しました
AのWaitForSingleObject2を通過
Aの処理中なのでB,C割り込んじゃダメ
Aの処理中なのでB,C割り込んじゃダメ
Aの処理中なのでB,C割り込んじゃダメ
Aの処理中なのでB,C割り込んじゃダメ
Aの処理中なのでB,C割り込んじゃダメ
Aのセマフォ2つ開放しました
0231デフォルトの名無しさん
2006/10/17(火) 06:21:240232デフォルトの名無しさん
2006/10/17(火) 08:55:09きみは 216 のヒントを理解する能力があった。
217 は 216 のヒントを理解する能力がなかった。
ただそれだけのことなんで気にしなくてもいい。
0233デフォルトの名無しさん
2006/10/17(火) 16:43:480234デフォルトの名無しさん
2006/10/17(火) 16:54:36・スレッドAが実行中は、B・Cは待機する
・スレッドBあるいはCが実行中は、Aは待機する
・スレッドB・Cは同時に実行できる
ってことか?
だったらカウント2のセマフォが必要だね。
0235デフォルトの名無しさん
2006/10/18(水) 01:22:24ありがとうございます。
>>233
セマフォっぽくないですが、ミューテックスのときみたいに、
取ってすぐ戻すと同じ動きになりそうですね。
って実はネットに書いてありました。
>>234
はい、やりたいことそれです。
いろんな方法一気に覚えられてよかったです。
ありがとうございました。
0236デフォルトの名無しさん
2006/10/18(水) 04:27:33>>234の仕様だとすると、>>229のコードでは駄目だよ。
Aが連続してセマフォを獲得する保証は無く、Aがひとつ、Bがひとつ獲得した状態で
Cが待ち状態になる場合もある。それでいいならいいんだけど・・・。
0237デフォルトの名無しさん
2006/10/18(水) 07:54:55Sleep無しで実行したときなのですが、
>>230の結果を見ると
Aがひとつ、Cがひとつ獲得した状態で
Bが待ち状態になっているようなんですが。
Aがひとつ、Bがひとつ、Cが待ちというのもあると思います。
>Aが連続してセマフォを獲得する保証は無く
Aが連続してセマフォを獲得する保証は、
どのようにすればよいでしょうか。
Aが連続で取れるように、B,CにSleepなど何か
処理をするということでしょうか?
0238デフォルトの名無しさん
2006/10/18(水) 14:59:52Windowsに詳しくないのでこれだという解決策は示せませんが、この問題は
「read write lock問題」として有名です。
・誰も読んでないときは書ける
・誰かが書いてるときは書き終わるまで読めない
・誰かが読んでいるときは読み終わるまで書けない
・誰かが読んでいても読める
今回の例ではAが書き込みスレッド、B,Cが読み取りスレッドとして対応させると
わかると思います。
windows read write lock
windows read write synchronization
などのkeywordで検索すれば、根本的な解決策が見つかるはずです。
0239デフォルトの名無しさん
2006/10/18(水) 18:56:53そういうことでしたか。
「Aがひとつ、Bがひとつ獲得した状態で Cが待ち状態になる場合」
はAがひとつ取っても、まだ待機している状態なので、
A,C待機、Bが実行という場合もありますね。
ただ、>>234には矛盾して無いので、
今回は、これもあって大丈夫ということにしたいと思います。
まとめますと、変更無いですが、
・スレッドAが実行中は、B・Cは待機する
・スレッドBあるいはCが実行中は、Aは待機する
・スレッドB・Cは同時に実行できる(片方だけのときもある)
ということになると思います。
「read write lock問題」さっそく勉強してみます。
ありがとうございました。
0240デフォルトの名無しさん
2006/10/19(木) 20:22:09しかし、できたexeを実行するとエラーがでます。
どうしてでしょうか?おしえてください。
ちなみにコンパイラはBCC5.5.1です。
#include <stdio.h>
#include <string.h>
struct a {
int no;
char name[64];
};
int main(void)
{
struct a data[2];
data[1].no = 1;
strcpy(data[1].name,"name1");
data[2].no = 2;
strcpy(data[2].name,"name2");
printf("No.%d\n", data[1].no);
printf("%s\n", data[1].name);
printf("No.%d\n", data[2].no);
printf("%s\n", data[2].name);
return(0);
}
0241デフォルトの名無しさん
2006/10/19(木) 20:35:090242240
2006/10/19(木) 21:13:34でも何でですか?
0243デフォルトの名無しさん
2006/10/19(木) 21:22:51struct a data[2];
data[0]: 先頭の構造体a
data[1]: 二番目の構造体a
data[2]: 三番目の構造体a <-定義されていない
0244デフォルトの名無しさん
2006/10/19(木) 21:23:280245240
2006/10/19(木) 21:28:02すいません。おさわがせしました。
0246デフォルトの名無しさん
2006/10/19(木) 21:33:29エラー E2209 test.cpp 1: インクルードファイル 'vcl.h' をオープンできない
エラー E2303 test.cpp 3: 型名が必要
エラー E2034 test.cpp 3: 'char *' 型は 'int' 型に変換できない
エラー E2303 test.cpp 4: 型名が必要
エラー E2034 test.cpp 4: 'char *' 型は 'int' 型に変換できない
エラー E2293 test.cpp 4: ) が必要
エラー E2141 test.cpp 6: 宣言の構文エラー
とでてコンパイルできません…
0247デフォルトの名無しさん
2006/10/19(木) 21:40:33ソースを見せてみ
0248デフォルトの名無しさん
2006/10/19(木) 21:46:38#include <vcl.h>
#pragma hdrstop
USERES("test.res");
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->Title = "test";
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
0249デフォルトの名無しさん
2006/10/19(木) 22:35:310250デフォルトの名無しさん
2006/10/20(金) 00:00:25半径を入力して球の体積と面積を求めるってやつなんですけど、
入力が反映されなくて。
#include <stdio.h>
#include <math.h>
void main()
{
double rad, surface, volume;
printf("\nPlease input a radius. "); scanf("%f",&rad);
printf("Radius = %f \n",rad);
surface = 4 * M_PI * rad * rad;
volume = 4 / 3 * M_PI * rad * rad * rad;
printf("S = %f V = %f \n",surface,volume);
}
0251デフォルトの名無しさん
2006/10/20(金) 00:08:38そのプログラムを動かし、たとえば1と入力するとどうなる?
0252デフォルトの名無しさん
2006/10/20(金) 00:34:470253デフォルトの名無しさん
2006/10/20(金) 00:36:250.000000 です。
0254デフォルトの名無しさん
2006/10/20(金) 00:38:37S = とか V = とか表示されねーのか。そりゃ不思議だな。
0255デフォルトの名無しさん
2006/10/20(金) 00:40:50それ以前に、勉強開始たった2時間半程度で人に聞くのはどうかと。
その時点では分からないことだらけで当然だろう。
とりあえずは参考書などで基本事項を一通り勉強したら?
%f → %lf
0256デフォルトの名無しさん
2006/10/20(金) 00:57:06どうもありがとうございます。
参考書の例題だったんですが、
書いてある通りやってもうまくいかなくて。
0257デフォルトの名無しさん
2006/10/20(金) 01:02:34階層が深くなってるとき、下のほうで起こったエラーはどこで処理するのがいいんですか。
一番下なのか…?はたまた上までエラーコード引っ張っていって一番上なのか…?
また上まで引っ張っていった場合、その途中の関数で起こったエラーコードとかぶらないようにするために
考えると、エラーコードの種類がすごく肥大化してしまったんですけど、
こういうものなんでしょうか?
0258デフォルトの名無しさん
2006/10/20(金) 01:08:04C では、そういうもの。
そういう問題への対策が、最近の言語に備わっている例外処理機構。
C++ にもある。
0259デフォルトの名無しさん
2006/10/20(金) 01:14:09なるほど。そういうものなんですか。
ありがとうございます。
後例外処理なんですが、実はあまり理解していなくて、try catchする(c++)のと、戻り値判定(c)するのと
どう違うのかと疑問に思ってました。例外処理のメリットというか。。
上記のような問題を解決する機構が例外というのはどういうことなんでしょうか。
何かキーワードだけでも教えていただけたらできるだけ自分で調べてみます。。
0260デフォルトの名無しさん
2006/10/20(金) 01:23:15C++ の例外処理機構を使えば、エラーは発生した
その場所で迷わず throw すればいい。
エラーを処理する場所や方法は使用者が選べる。
↓のスレに情報がいくらか貯まっている。
例外処理
http://pc8.2ch.net/test/read.cgi/tech/1142667446/
0261デフォルトの名無しさん
2006/10/20(金) 01:23:54func1
+func2-1
+func3 --(A)
+func2-2 --(B)
} catch (...) {
// エラーきた --(C)
}
のように奥の func3 で例外を発行すると、func1 の途中部分であっても
きれいに脱出して(デストラクタの面倒は見て) (C) に到達できる。
この例の場合、(B) は実行されない
0262デフォルトの名無しさん
2006/10/20(金) 01:33:57上まで引っ張っていかなくてもいいってこと…ですよね?
なるほどそれだとたしかにエラー処理が綺麗に書けそうな気がします。
スレのほうも熟読してみます!ありがとうございました。
>>270
なるほど!これはわかりやすいです。
これは便利なんですね…
いままでせっかくc++のコンパイラ使ってたのに全部戻り値判定で引っ張っていたのが
すごく時間と労力を無駄にしてたきがしてきました…大げさかもしれませんがw
こんな機能ならぜひ例外処理を勉強してうまく使っていくようにしたいとおもいました。
どうもありがとうございました。
0263デフォルトの名無しさん
2006/10/20(金) 02:06:14がんがん使え。
が、C++に限っては、性能を気にしだすと封印せざるを得なくなる諸刃の刃。
でもやっぱりがんがん使え。
使い慣れないとデストラクタ周りで戸惑ったりするので、経験値稼ぐためにもばんばん使え。
デメリットのことは後で考えればよい。
0264デフォルトの名無しさん
2006/10/20(金) 02:19:37何かのプログラムの本で、便利な機能は変なこだわりは捨ててどんどん使ったほうがいいって書いてたのを
読んだことがことがあります。
あとご指摘のデストラクタとの絡みのところもしっかり勉強したいと思います。
0265デフォルトの名無しさん
2006/10/20(金) 02:29:18普通は諸刃の剣だと思ってたけど。
0266デフォルトの名無しさん
2006/10/20(金) 02:29:59ケツの穴の小さいこというなよ。
刺さらないじゃないか。
0267デフォルトの名無しさん
2006/10/20(金) 02:33:31ついでに正しい知識が身についてよかった。
・・・・吉野家コピペくらいでしか使わないかもしれないが。
0268デフォルトの名無しさん
2006/10/20(金) 10:57:54剣がケツの穴に刺さったところ想像しちゃったじゃないか
0269デフォルトの名無しさん
2006/10/20(金) 19:58:590270デフォルトの名無しさん
2006/10/21(土) 00:59:540271デフォルトの名無しさん
2006/10/21(土) 01:38:49stringに入っている文字列を char* に変換したいのですが
良い知恵はありますでしょうか。
const char* では無く char* にしたいのです。
今のところ思いつくのは、自前で char* の領域を確保して
そこに c_str() の内容をコピーすれば問題は無いかと思うのですが
せっかく便利なクラスがあるのに、何だか冗長な気がします。
一応調べた限りでは const_cast という物があるようですが
const_castした文字列にアクセスした場合の動作は未定義という
記述がされていたりするのでそれはちょっと無いかな、と思います。
0272デフォルトの名無しさん
2006/10/21(土) 01:54:43std::vector<char>でも使えば?
0273デフォルトの名無しさん
2006/10/21(土) 01:59:47基本的に使っちゃ駄目。
で、const_castを止めておきながら、こんなコードを薦めるのは激しくナニなんだが、
std::stringは添え字演算子が使える。
ので、一応
std::string str = "nullpo";
char* p = &str[0];
みたいな書き方はできないわけじゃない。
やっちゃ駄目よ?
問題起こしたところも見たことは無いけど。
0274デフォルトの名無しさん
2006/10/21(土) 02:29:31>stringに入っている文字列を char* に変換したいのですが
これが何を言っているかはっきりしないんだけど、
char *型の引数を要求するけど実際には渡した領域を更新することはない、
という関数に渡すというような使い方なら、const_castで問題ないと思う。
>const_castした文字列にアクセスした場合の動作は未定義
参照するだけなら問題ないんじゃなかったっけ?
文字列を更新する目的で char*型にしたいといっているなら、
自分で更新可能な領域にコピーするしかない。
0275271
2006/10/21(土) 03:05:01参考になります。
今回の場合、実際は更新しない文字列だったので
>274さんの言う通りconst_cast使っても問題はあまり無さそうです。
ただ、更新する文字列のことも考えると
自前で確保する方法も覚えて損はなさそうですね。
std::vector はまだ使った事がありませんが覚えておきます。
ありがとうございました。
0276デフォルトの名無しさん
2006/10/21(土) 07:38:19そのうちstd::vector同様にstd::basic_stringでも認められるという噂を聞いたことがあるんだ。
0277デフォルトの名無しさん
2006/10/21(土) 10:49:27いや、あれは実際に採用されるかどうかはまだ怪しい話。
0278デフォルトの名無しさん
2006/10/21(土) 19:30:53ここ以下のおいらはどこに行けばいい?
0279デフォルトの名無しさん
2006/10/21(土) 19:39:19【初心者歓迎】C/C++室 Ver.32【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1160893851/
でも、余程頓珍漢な事を書かない限りここでもokだと個人的には思うが。
0280デフォルトの名無しさん
2006/10/21(土) 20:05:100281デフォルトの名無しさん
2006/10/23(月) 11:02:39と
int function(int x)
の違いを教えてください。
0282デフォルトの名無しさん
2006/10/23(月) 12:09:53前者はxがconstだから関数の中で代入できない
関数に渡す値は非constでもOK
0283デフォルトの名無しさん
2006/10/23(月) 17:21:12using namespace std;
//avg関数の宣言
double avg(int t[]);
int main()
{
int test[5];
cout << "5人のテストの点数を入力してください。\n";
for(int i=0; i<5; i++){
cin >> test[i];
}
double ans = avg(test);
cout << "5人の平均点は" << ans << "点です。\n";
return 0;
}
//avg関数の定義
double avg(int t[])
{
double sum = 0;
for(int i=0; i<5; i++){
sum += t[i];
}
return sum/5;
}
0284283
2006/10/23(月) 17:24:23でも配列名は先頭要素のアドレスを表しますよね。
関数のdouble avg(int t[])の仮引数、t[]に先頭要素のアドレスを渡すことで
何で上のソースが動くのですか?
もし配列の各要素の値が渡されるとしたなら納得できるのですが、
アドレスが渡されるのにこの関数が動く理由がわかりません・・・
どなたか納得できるように説明していただけませんか?
0285デフォルトの名無しさん
2006/10/23(月) 18:03:33C言語の配列がメモリにどう配置されるかを学ぶと良い
Cの配列は要素[0]を先頭に
連続したメモリ領域に配置される
例えば char s[255]; と書いた場合
s[0] のアドレスが 54322 バイト目なら
s[1] のアドレスは 54323 バイト目になる
char は1バイトだから1バイト毎
short なら2バイトだから2バイト毎な
だから配列の先頭要素のアドレスが判れば
その先の要素のアドレスも判る
0287デフォルトの名無しさん
2006/10/23(月) 21:22:18渡された立場からみると、配列の大きさがわからない。
で、範囲外のアクセスでバグる と。
0288デフォルトの名無しさん
2006/10/24(火) 04:00:100289デフォルトの名無しさん
2006/10/24(火) 08:26:57と
#include <string>
と
#include <cstring>
の違いを教えてください。
cmath等と同様、cstringが最新のC++にあっているのかと思っていたのですが、
bcc32でcstringでコンパイルできたものがvc7ではstringにしないと、
二項演算子 '!=: 型 'std::string' の左オペランドを扱う演算子が見つかりません (または変換できません)
というエラーが出てコンパイルできませんでした。時期的には、vc7の方が新しいはずなのですが・・・
0290デフォルトの名無しさん
2006/10/24(火) 08:45:25そもそも何がしたいんだ?
Cの<string.h>のC++版が<cstring>で、
strlenとかstrcpyなどの関数を使用するときにインクルードする。
C++での<string>はstd::stringという文字列クラスを扱うときに用いる。
0291デフォルトの名無しさん
2006/10/24(火) 12:15:02・C言語の "string.h"
文字列操作の為のライブラリ
・C++ の <string>
文字列クラス std::string を使う為のライブラリ
・C++ の <cstring>
C言語の "string.h" 風味のライブラリ
C言語の str〜 系の関数を使いたいなら
cstring をインクルードする
もしくは、ソースには"string.h" と書いて
大概の処理系にある
C言語としてコンパイルするオプション(や拡張子 .c)
でコンパイルすれば良い
0292デフォルトの名無しさん
2006/10/24(火) 16:58:06using namespace std;
//func関数の宣言
void func();
int a = 0;
//main関数
int main()
{
for(int i=0; i<5; i++)
func();
return 0;
}
//func関数の定義
void func()
{
int b = 0;
static int c = 0;
cout << "変数aは" << a << "変数bは" << b << "変数cは" << c << "です。\n";
a++;
b++;
c++;
}
0293292
2006/10/24(火) 17:02:11同じ記憶寿命を持っても上のコードでfunc()関数が呼び出される度にstatic int c = 0;と初期化しているのに何故実行結果では
0,1,2,3,4と増えていくのでしょうか?
staticをつけて初期化されるのは一回目だけということでしょうか?
0294デフォルトの名無しさん
2006/10/24(火) 17:48:49「初期化」は最初だけ
毎回0にしたければ「代入」をするべし
0295デフォルトの名無しさん
2006/10/24(火) 17:52:36一つ謎がとけました
ありがとうございます
0296デフォルトの名無しさん
2006/10/25(水) 05:43:46あなたを犯人です。
0297デフォルトの名無しさん
2006/10/25(水) 07:00:13中国語でおk
0298デフォルトの名無しさん
2006/10/25(水) 12:14:07普段からコンパイラにbcc5.5を使っているのですが、
今回、グラフィックスを描く必要があって、
ftp://spdg1.sci.shizuoka.ac.jp/pub/GrWinlib/index.htmlに置いてあるlGrWn0999b-f2bcc.exeでインストールして、
http://www005.upp.so-net.ne.jp/h-masuda/grwin/grwin01.htmlにある以下のサンプルを
動かしてみました。
#include <GrWin.h>
int main(void)
{
int width = 640, height = 400; /* ウィンドウサイズ640×400 */
GWopen(0); /* ウィンドウのオープン */
GWsize(-5, &width, &height); /* ウィンドウサイズ設定 */
GWsize(-3, NULL, NULL); /* フレーム(枠)サイズ設定 */
GWvport(0.0, 0.0, (float)width / (float)height, 1.0); /* ビューポート設定 */
GWindow(0.0, 0.0, (float)width - 1.0, (float)height - 1.0);
GWquit(); /* 終了処理 */ /* ↑ワールド座標系設定 */
return 0;
}
普段課題を出されたときと同じようにbcc32 sample.c のように打ち込んだのですが、
Error:外部シンボル '_GWopen'が未解決(C:\CWORK\SAMPLE.OBJが参照)
Error:外部シンボル '_GWsize'が未解決(C:\CWORK\SAMPLE.OBJが参照)
Error:外部シンボル '_GWvport'が未解決(C:\CWORK\SAMPLE.OBJが参照)
Error:外部シンボル '_GWindow'が未解決(C:\CWORK\SAMPLE.OBJが参照)
Error:外部シンボル '_GWquit'が未解決(C:\CWORK\SAMPLE.OBJが参照)
というエラーが出てしまいどうしても動いてくれません。
一度bccとGrwinをインストールし直したり、手動でインストールしようとして他のプログラムまで動かなくなったり、
あの手この手を尽くしたつもりなのですがダメでした。
googleで似たような症状を探しても見つけられないし、八方塞がりです。
どなたか解決法のわかる方、いらっしゃいませんでしょうか?
0299デフォルトの名無しさん
2006/10/25(水) 12:35:41入ってたとしたらそれをリンクすればいけるかもしれない
0300デフォルトの名無しさん
2006/10/25(水) 18:06:14ClassDef のオブジェクトを他の関数らで使いまわしたいのです。
その場合、ClassDefのオブジェクトが無ければ作り
作られていればそのオブジェクトを使いたいのです。
そこで GetObjという関数を作り、そこで上記の判断を
させようと思うのですが、どのように作れば良いのかが・・・
下記の他にも良い書き方があればご教授の程お願い致します。
ClassDef* ObjDefP = NULL;
ClassDef GetObj()
{
if( ObjDefP = NULL ){
ClassDef ObjDef;
ObjDefP = &ObjDef;
return AppObj;
}else{
//return ObjDefP//ここが良くわかりません・・・
}
}
func1() {
ClassDef Obj = GetObj();
Objに対して処理1
}
func2() {
ClassDef Obj = GetObj();
Objに対して処理2
}
0301デフォルトの名無しさん
2006/10/25(水) 18:23:11new 使わない微妙なやつだけど、参照返しで
class ClassDef {
private:
ClassDef() {} ~ClassDef() {}
public:
static ClassDef& GetObj() { static ClassDef body; return body; }
// その他公開メソッド
};
////// 利用側
func1() { ClassDef& cObj = ClassDef::GetObj(); }
func2() { ClassDef& cObj = ClassDef::GetObj(); }
0302デフォルトの名無しさん
2006/10/30(月) 03:48:35お兄ちゃんはどんな風に書く?
int main(void) {}
int main() {}
main(void) {}
main() {}
0303デフォルトの名無しさん
2006/10/30(月) 03:53:14Cならばint main(void) {}
C++ならばint main() {}
0304デフォルトの名無しさん
2006/10/30(月) 09:33:03でもある程度長くなりそうなら
値返すだけでなくコマンド引数も受け取る。
0305デフォルトの名無しさん
2006/10/30(月) 18:58:32そっか、Cではint main(void)が厳密なんですね?
C++ではvoidが省略できるみたいな?
0306デフォルトの名無しさん
2006/10/30(月) 20:55:41んで暗黙に return 0; が書かれたことになるって仕様だったような。
0307デフォルトの名無しさん
2006/10/30(月) 21:21:34暗黙のintはなくなった。2文目は正しい。
0308302
2006/10/31(火) 22:01:45ありがとうございました。
0309デフォルトの名無しさん
2006/11/02(木) 10:04:14文字列を入力するとき
string s;
cin >> s;
とすると、長さ1以上の場合は問題ないのですが
長さ0の文字列が入力できません。
エンターキーだけ押せば長さ0の文字列と見なして欲しいのですが、
どうすればいいでしょうか。
0310デフォルトの名無しさん
2006/11/02(木) 10:13:020312デフォルトの名無しさん
2006/11/13(月) 00:50:01VC.Net2005を買ってきたのですがマシンパワーが足りないのでIDEを
使いたくなくてコマンドラインコンパイラとして使用しようと思っています。
C:\Program Files\Microsft VisualStudio 8にインストールし、
C:\ComLineCode\Cpp\にソースコードを置こうと思っています。
テストという事でcpptest.cppと名前を付けたコードをコンパイルしようと
したのですが、includeファイルが見つからないといわれたので、
OS(Win2k)の環境変数にINCLUDEを作り、iostreamを検索した結果出てきた
フォルダを指定してやったのですが、
C++例外処理を使っていますが、アンワインドセマンティクスは有効にはなりません。
と出てコンパイルできません。
// cpptest.cpp
#include <iostream>
using namespace std;
void main(void)
{
cout << "表示されれば設定OK";
}
//EOF
cl cpptest.cpp
ソースは間違って居ないと思うので設定が不味いだけだとおもうのですが、
どのようにしたら上手くコンパイルできるでしょうか?
C++以前の問題ですが、どうぞアドバイスを下さい。お願いします。
0313デフォルトの名無しさん
2006/11/13(月) 01:18:59「スタート→プログラム→Visual C++ 2005 Express Edition
→Visual Studio Tools→Visual Studio 2005 コマンド プロンプト」
で必要な環境変数が設定された状態のコマンドプロンプトが起動できる。
その例外処理がなんたらというのはエラーではなく警告。一応実行ファイルは作られている。
そしてその警告文には、その後に「/EHsc を指定してください。」と書いてあるはずだ。そのとおりにしろ。
0314デフォルトの名無しさん
2006/11/13(月) 01:21:20エラーメッセージはちゃんと全部読め。
cl /? を見ろ。オンラインマニュアルを読め。
0315デフォルトの名無しさん
2006/11/13(月) 01:21:24でもってアンワイ(ryに関しては warning って書いてあるでしょ?
エラーじゃなくて警告だから気にしないのなら気にしなくていいし、
気になるんなら警告に書いてある通りにオプションつけろ。
0316デフォルトの名無しさん
2006/11/13(月) 01:22:223P汁
0317デフォルトの名無しさん
2006/11/13(月) 01:27:360318デフォルトの名無しさん
2006/11/13(月) 04:10:14SET CL=/EHsc
の行を加えておくことを推奨
0319デフォルトの名無しさん
2006/11/13(月) 10:16:37と
int *p;
って同じもの?
0320デフォルトの名無しさん
2006/11/13(月) 14:49:47同じ。だが
int *p, *q;
と
int* p, q;
は違うから初心者は注意するように。
0321デフォルトの名無しさん
2006/11/13(月) 22:05:25int *p, *q; は
int *p;
int *q;
で
int* p, q; は
int *p;
int q;
であってる?
0322デフォルトの名無しさん
2006/11/13(月) 22:15:320323デフォルトの名無しさん
2006/11/13(月) 22:16:000324デフォルトの名無しさん
2006/11/14(火) 12:49:06windowsだと
_findfirst,_findnextがあって、*を含んだ検索が出来ます。
linuxだと
opendir,readdirがありますが、*を含んだ検索が出来ません。
そこで質問なんですが、
struct dirent *dir;とすると、
readdirを読んで、dir->name比較する関数で毎回調べて、
繰り返さないといけないでしょうか?
なにか他に簡単な方法あるとよいのですが。
よろしくお願いします。
0325デフォルトの名無しさん
2006/11/14(火) 12:56:06他にやり方があるのかは知らない。
0326デフォルトの名無しさん
2006/11/14(火) 13:09:21実は、_findfirst,_findnextで作ってしまいまして。
コンパイルできないと思ったら、linuxだからということがわかりました。
似たような関数があればー。と思ったのですが。
確かに、そんなに大変ではないかもしれないです。
ありがとうございました。
0327デフォルトの名無しさん
2006/11/14(火) 23:55:59例えば
template <T>
hogehoge(T val){
0328デフォルトの名無しさん
2006/11/15(水) 00:00:53C++で型をコンパイル時に判別する方法ってどうやれば良いのでしょうか。
例えば
template <T>
void hogehoge(T val){
if(T == int) {
処理1
} else if (T == char) {
処理2
}
}
のようなことをやりたいのです。もちろん上のコードはコンパイルなどできませんが・・・。
void process(int val){...}
void process(char val){...}
....
みたいなものを型ごとにひたすら用意して、
void hogehoge(T val){
process(val);
}
とすればできますが、それだとコード量がふくらんでしまいます。他に良い方法ありますか?
0329デフォルトの名無しさん
2006/11/15(水) 00:13:53明示的特殊化を使えば?
0330デフォルトの名無しさん
2006/11/15(水) 07:29:32つ[popen("/bin/ls *", "r")]
0331デフォルトの名無しさん
2006/11/15(水) 11:58:02typeid
0332デフォルトの名無しさん
2006/11/15(水) 17:56:02BoostにMPLとかtype_traitsとかいろいろあるよ。
まあこんなところで勧めていいかわからないが。
0333デフォルトの名無しさん
2006/11/18(土) 03:34:45今までファイルからデータをストリームとして呼んでいたのですが、ファイルの内容を簡易的に隠蔽したくて、
ヘッダファイルにchar filedata[] = "(ファイルの内容)";
として、ソースに埋め込んだのですが、これをファイルからの読み込みと同じように、ストリームとして読み込み処理を行いたいのです。
char配列をストリームにする方法ってあるのでしょうか。
0334デフォルトの名無しさん
2006/11/18(土) 08:10:49iostream の実装は自分で定義することができるようになってるから、
いちおう可能なはず。簡単かどうかは知らない。
↓ここらへんから始めれ。
http://www.google.co.jp/search?q=iostream+%E5%AE%9F%E8%A3%85
0335デフォルトの名無しさん
2006/11/18(土) 09:58:120336デフォルトの名無しさん
2006/11/18(土) 22:36:06vector<float> *vec = new vector<float>(5000);
for(int i=0; i<5000; i++) {
float *tmp = (float *)&vec[i];
cout << *tmp << endl;
*tmp = 100;
}
Visual C++ 2005 でこのコードを実行するとエラーになります。
Visual C++だとメモリが連続していないのでしょうか?
0337デフォルトの名無しさん
2006/11/18(土) 22:47:32× (float *)&vec[i];
○ &(*vec)[i]
無茶なキャストした時点でなんかおかしいって気づけよ。
0338デフォルトの名無しさん
2006/11/18(土) 22:57:10gcc4.0だとこれでも上手くいくのですが・・・・。
0339デフォルトの名無しさん
2006/11/18(土) 22:59:45ttp://www.s34.co.jp/cpptechdoc/article/vectorastemp/index.html
0340デフォルトの名無しさん
2006/11/18(土) 23:03:26未定義動作。
>>339
そのページを見て vector を new するとは、本末転倒。
0341デフォルトの名無しさん
2006/11/18(土) 23:08:10間接参照のレベルが一段違うだろうが。
0342336
2006/11/18(土) 23:11:33あ、分かりました。
float *tmp = (float *)&vec[i];
でなくて
float *tmp = &(*vec)[i];
とすべきだったんですね。vec[i]ではvector<float>の配列としてi番目のvector<float>オブジェクトにアクセスする意味になってしまう・・・。
寝ぼけてました。すみません。
0343デフォルトの名無しさん
2006/11/18(土) 23:13:03vec[1]〜はメモリのどこを指しているのかわからない。
0344デフォルトの名無しさん
2006/11/18(土) 23:21:04ばかですか?
0345デフォルトの名無しさん
2006/11/18(土) 23:23:370346デフォルトの名無しさん
2006/11/18(土) 23:29:590347デフォルトの名無しさん
2006/11/18(土) 23:30:08危険いっぱいの所を指している、という事を言いたかっただけなんじゃまいか
0348デフォルトの名無しさん
2006/11/18(土) 23:35:43p[i] は (*(p+i)) と定義されているので、 vec[0] も未定義。
0349デフォルトの名無しさん
2006/11/18(土) 23:43:49何言ってんの?
0350デフォルトの名無しさん
2006/11/18(土) 23:47:44○ vec[0]は*(vec+0)
0351デフォルトの名無しさん
2006/11/18(土) 23:49:32本気で信じてるのか?規格書のどこに書いてあるか出せよ。
0352デフォルトの名無しさん
2006/11/18(土) 23:52:42NULLは0とは限らないがNULLが0でないコンパイラなんてまずない
ってのと一緒で、ほとんどのコンパイラじゃ問題にならないんだよな?
0353デフォルトの名無しさん
2006/11/18(土) 23:54:30その前に 5.7p4 で配列じゃないオブジェクトを指すポインタは
要素数1の配列と同等に扱うとなっているので、問題ない。
5.7p4 を読まずに 5.7p5 だけ読んだんだろう。
C では 6.5.6p7, p8 に同様のことが書いてある。
0354デフォルトの名無しさん
2006/11/18(土) 23:54:33出してもらえばそれで完全に決着するから。
0355348
2006/11/18(土) 23:56:460356デフォルトの名無しさん
2006/11/18(土) 23:56:540357デフォルトの名無しさん
2006/12/01(金) 12:42:11ただ単にファイルをコピーするプログラムと
lsコマンドを自作したのですが、
もし、lsコマンドするフォルダに書き込み中のファイルがあったら、
「書き込み中」を表示したり、違う処理をしたいのですが、
書き込み中か調べる方法ってありますでしょうか?
考えてみたのですが
■lsコマンド側で解決方法
sleepを入れて容量の増減を調べる。
(これだと返ってくるまで、すごい時間が掛かってしまいます。)
■書き込むプログラム側の解決方法
・元のファイルをA,コピー先のファイルをA'とすると
1、A'を作ります
2、ファイルディスクリプタ指定してA'をlockします
3、書き込みします。
4、lock解除
・何かCOPYコマンドにオプション付けるとコピーが終わるまで
読めなくなるとないでしょうか。
0358デフォルトの名無しさん
2006/12/01(金) 13:40:39357です。
なんか質問の内容がぼけてしまってますね。
ちょっと質問内容変更させてください。
書き込むプログラムは、自分で作ったもので
無い場合(lockしてない場合)でも書き込み中か
知る方法ってあるでしょうか?
sleep使って調べると時間かかってします。
0359デフォルトの名無しさん
2006/12/01(金) 14:14:40それならば、コピー完了を知る手段は一般的にはないと思う。
解決策としては、こんなもんかなぁ……
・コピー元ファイルのサイズを知り、コピー先ファイルのサイズと較べる。
・コピー対象ファイルの終端の特徴を知り、コピー先ファイルの終端がその特徴に一致するか調べる。
#汎用性はないが、コピー対象が特定のフォーマットに従っているならそれなりに実用的か。
・コピープログラムに完了を通知してもらう。
#通知方法は色々考えられる。signalでもいいし、ファイルでもipcでもいいだろう。
・コピープログラムに一旦別の名前でコピーしてもらい、コピー完了後に目的の名前に変えてもらう。
0360デフォルトの名無しさん
2006/12/01(金) 19:59:29何通りもありがとうございます!
どれもすごい参考になりました。
上2つは、初心者の僕でもすぐにできそうです。
signalも勉強してみます。
0361デフォルトの名無しさん
2006/12/11(月) 18:25:45static const int Size = 256;
int a[Size];
for (int i = 0; i < Size; ++i)
ではなく
static const std::size_t Size = 256;
int a[Size];
for (std::size_t i = 0; i < Size; ++i)
の方が正しいの?
0362デフォルトの名無しさん
2006/12/12(火) 00:34:24誰がそんなことを言ってたかは知らんが、その範囲を見ただけでは
上が間違っているとは思えないが。
下のほうは、size_tが64bitのような環境ではかえって無駄なことをしているだけのように思える。
0363デフォルトの名無しさん
2006/12/12(火) 03:39:31cppllから引っ張ってきたネタでしょ
http://www.tietew.jp/cppll/archive/12803
話題を提供しつつ小遣いを稼ぐという視点は無かったな
0364デフォルトの名無しさん
2006/12/12(火) 03:51:10C/C++ コミュニティで「昔の C コンパイラでも void を書くか書かないで・・・」に
突っ込みが入らないのは異常だろ。
0365デフォルトの名無しさん
2006/12/12(火) 05:34:30そりゃ実装依存の話であって、誰が悪いかっつったら断りなしにsize_tを64ビット化した環境のが悪い気が。
もっとも、size_tは基本sizeofの返り値用の型だし、要素数表現に使われてるのはちょっと微妙なわけだが。
0366デフォルトの名無しさん
2006/12/12(火) 17:03:25無符号というのも意味的にスッキリしてるし。
ビット長はその処理系で必要な長さになってるんだから無駄と言うのも変な話だ。
0367デフォルトの名無しさん
2006/12/14(木) 02:07:17そのままsizeof演算子の結果に配慮したからで、
これを要素数倍するのは構わないのだが、
要素数を扱う型にくくってしまうのは、少々短絡的。
文字列長に使うのは、charがなんだかんだで
バイト単位と認められてしまってるところから。
一番悪いのはlengthof演算子だのlength_tだのを
用意しなかったCそのものだと思われるが、
C++に世代が移ってループもイテレータで回す昨今、激しくどうでもいい。
俺も上のようなことは正直こじつけそのもので、自分でもまったく信じてない。
最近だとptr_diffなんかも64ビット化してるんで、
細かい目で見るとポインタの加減算もコストが嵩んでる。
無視するのがいいのだろうが、世の中ままならぬ。
0368デフォルトの名無しさん
2006/12/14(木) 11:23:590369デフォルトの名無しさん
2006/12/14(木) 19:53:080370デフォルトの名無しさん
2007/01/06(土) 18:19:480371デフォルトの名無しさん
2007/01/06(土) 19:48:590372デフォルトの名無しさん
2007/01/07(日) 08:06:00STLなら1ビット
0373デフォルトの名無しさん
2007/01/07(日) 12:43:05はぁ?
0374デフォルトの名無しさん
2007/01/07(日) 15:18:41std::vector<bool>のことを言っているんだろう
0375デフォルトの名無しさん
2007/01/07(日) 16:46:38それは 1 bit を保証するものではない。
0376デフォルトの名無しさん
2007/01/07(日) 17:15:33それって valarray<bool> のことじゃなかったっけ?
0377デフォルトの名無しさん
2007/01/08(月) 00:18:1023.2.5 Class vector<bool> [lib.vector.bool]
1 To optimize space allocation, a specialization of vector for bool elements is provided
0378デフォルトの名無しさん
2007/01/12(金) 17:01:28渡す方法を教えてください。
struct Func
{
int data;
func(int v) : data(v) {}
int operator() (int i) { return v*i; }
}
template<typename F>
int Test(F f, int i)
{
return f(i);
}
int main()
{
Func func(1);
return Test(func, 2);
}
Test<F>(Func) に一致するものが見つからないと怒られます。
struct Func
{
int operator() (int i) { return i; }
}
こうすると通ります。なぜでしょうか?
0379デフォルトの名無しさん
2007/01/12(金) 17:02:510380デフォルトの名無しさん
2007/01/12(金) 17:28:07{
int data;
Func(int v) : data(v) {}
int operator() (int i) { return data*i; }
}
まだ間違ってました。
0381デフォルトの名無しさん
2007/01/12(金) 17:33:04通るじゃないか。コンパイラ何使ってんの?
0382デフォルトの名無しさん
2007/01/12(金) 17:36:230383デフォルトの名無しさん
2007/01/12(金) 17:42:230384デフォルトの名無しさん
2007/01/12(金) 17:42:260385デフォルトの名無しさん
2007/01/12(金) 17:50:21ヘッダとの依存性とかを
0386デフォルトの名無しさん
2007/01/15(月) 22:00:14vector<counter> v(dic.begin(), dic.end());
sort(v.begin(), v.end(), cmp);
for (vector<counter>::iterator i = v.begin(); i != v.end(); ++i)
cout << i->first << ":" << i->second << endl;
return 0;
の部分の機能がわからないのでどなたか解説してください
0387デフォルトの名無しさん
2007/01/15(月) 22:50:340388デフォルトの名無しさん
2007/01/15(月) 22:52:01それをcmpを比較関数としてソート
ソート結果を表示
0389デフォルトの名無しさん
2007/03/02(金) 11:50:480390デフォルトの名無しさん
2007/03/02(金) 12:02:140391デフォルトの名無しさん
2007/03/03(土) 00:45:07char *p;
p = "ABC";
とした時の
pは"ABC"を表すのですか?
*pは何を表すのですか?
0392デフォルトの名無しさん
2007/03/03(土) 02:01:01*pは'A'を表す
0393デフォルトの名無しさん
2007/03/03(土) 03:11:04ありがとうございます!
0394デフォルトの名無しさん
2007/03/04(日) 18:58:20kitty on your lap とは何なのでしょうか?
hello worldみたいなもの?
0395デフォルトの名無しさん
2007/03/04(日) 19:08:10何番目かに引っかかる「ひざの上の同居人」ってゲームに
そういうサブタイトルがついてたんだよ。
今では陳腐に見えるけど、当時はまだまだ新鮮なコンセプトで、
一部の猫耳好きから圧倒的な支持を受けた。
0396デフォルトの名無しさん
2007/03/04(日) 19:09:230397デフォルトの名無しさん
2007/03/04(日) 19:12:020398デフォルトの名無しさん
2007/03/04(日) 19:15:57あそこは最高のサイトだと思うんだがな…
0399デフォルトの名無しさん
2007/03/04(日) 19:20:440400デフォルトの名無しさん
2007/03/04(日) 19:37:350401デフォルトの名無しさん
2007/03/05(月) 23:04:36に誤爆してしまったのでこちらに再投下します。
std::string変数を空にするのに、
var=std::string("");
とか馬鹿馬鹿しいことやってるんですが、普通はどうするんでしょうか。
0402デフォルトの名無しさん
2007/03/05(月) 23:13:33var.clear();
0403デフォルトの名無しさん
2007/03/05(月) 23:22:070404デフォルトの名無しさん
2007/04/13(金) 09:12:410405デフォルトの名無しさん
2007/04/13(金) 09:21:57その実体は必ずしもゼロではない
例えば大抵の処理系では int *p=null; と int *q=0; は等価だが、
場合によっては q はメモリの「ゼロ番地」を指しており、
実際に読み取ることができる、ということもありうる
0406デフォルトの名無しさん
2007/04/13(金) 09:33:160407デフォルトの名無しさん
2007/04/13(金) 09:48:57CにもC++にもnullなんてものはない。
NULLのことなら、NULLが0なんじゃない。0がNULLなんだ。
0408デフォルトの名無しさん
2007/04/13(金) 10:13:41いくら「はきだめ」でも、嘘はいくない。
0409デフォルトの名無しさん
2007/04/13(金) 10:58:09C言語の定義によればどんなポインターの型にも特別な値、
すなわち 「ヌルポインター」が存在する。このヌルポインターは
他のどんなポ インターの値とも区別可能で、「いかなるオブジェクトや
関数へのポ インターと比較しても等しくなることがないことを
保証されている」。 すなわちアドレス演算子&を適用した結果が
ヌルポインターとなることもない。
C言語の定義によれば、ポインターを書くべきところに現れた定数0は、
コンパイル時にヌルポインターに変換される。すなわち初期化・代入・
比較をするときに左辺/右辺のどちらかにポインター型の変数か式が
現れたときは、コンパイラはもう一方の側の定数0がヌルポインター
を要求していることを理解し、適切なデータ型のヌルポインターの値
を産み出す。
0410デフォルトの名無しさん
2007/04/14(土) 19:12:14class Vehicle{
public:
virtual void startEngine()=0;
vietual ~Vehicle();
};
Vehicle::~Vehicle(){}
「そこから導出される派生クラスではstartEngine()メンバ関数を提供してはいけない。」
とあるんですが、これは使うなって事ですか?
「提供してはいけない」っていう言葉の趣旨がわからんのですが。
0411デフォルトの名無しさん
2007/04/14(土) 19:15:40s/しては/しなくては/
ではないかと。
0412デフォルトの名無しさん
2007/04/14(土) 20:41:27定義しないとエラーになるんで、これは一体・・・と思ってた所です。
訳者が監修扱いになってるんで、誤訳かなぁと思ってた所です。
0413デフォルトの名無しさん
2007/04/14(土) 20:45:540414デフォルトの名無しさん
2007/04/14(土) 20:49:42struct Base
{
// virtual ~Base() {}
};
struct Derived : Base
{
Derived() : p(malloc(100)) {}
~Derived() { free(p); }
private:
void* p;
};
{
Base* x = new Derived;
delete x;
}
0415デフォルトの名無しさん
2007/04/14(土) 21:06:150416デフォルトの名無しさん
2007/04/15(日) 08:19:410417デフォルトの名無しさん
2007/04/15(日) 09:42:37exp(0.1*x)だとfloatなのにpow(0.1*x,2)だとdoubleになってしまうのは何故なのでしょうか?
pow(float(0.1*x),2)とすれば、floatになってくれるのですが、expとpowで何が違うのでしょうか?
0418デフォルトの名無しさん
2007/04/15(日) 09:49:12つーか、何を根拠にfloatだのdoubleだの言ってるんだ?
0419デフォルトの名無しさん
2007/04/15(日) 16:40:470420デフォルトの名無しさん
2007/04/15(日) 16:48:260421デフォルトの名無しさん
2007/04/15(日) 17:25:360422デフォルトの名無しさん
2007/04/15(日) 17:33:130423デフォルトの名無しさん
2007/04/15(日) 18:57:110424デフォルトの名無しさん
2007/04/15(日) 19:14:060425デフォルトの名無しさん
2007/04/15(日) 20:25:310426デフォルトの名無しさん
2007/04/15(日) 21:33:500.1 * xは、0.1がdouble型だからxもdouble型へ昇格され、全体としてもdouble型になる。
expもpowもdouble型の引数を取るものが呼ばれるはず。
そうでないならコンパイラがおかしいはず。
そもそも418も指摘しているとおりで、417自身がどうやって調べたのかも怪しいが。
ついでにいくつか言うが、float型リテラルを作るには0.1fのようにfを後置しろ。
そんな関数スタイルのキャストでも(勿論Cスタイルのも)使うな。
ここではstatic_castを使え(Boostのimplicit_castもありだ)。
0427デフォルトの名無しさん
2007/04/17(火) 13:06:00#include <stdio.h>
void main()
{
double a;
a = 2/6;
printf("%f\n", a);
}
VC6にて上のように単純に2÷6を計算したら0が出力されます。
0.33333・・・を出したいのですがどうすればいいのでしょうか?
0428デフォルトの名無しさん
2007/04/17(火) 13:48:59a = 2.0 / 6.0;
0429デフォルトの名無しさん
2007/04/17(火) 13:54:24ありがとー
0430デフォルトの名無しさん
2007/04/17(火) 20:52:34活用方法が見出せない。
0431デフォルトの名無しさん
2007/04/17(火) 22:11:20確かに。職業PGだが、BigEndianとLittleEndianが混在した状況で
共用体が必要な場面は少ないと思う。実際使わないし。
組み込み系ならBEかLEかははっきりしているので
union X {
long a;
char b[sizeof(long)];
};
とかやることがあるかも。
0432デフォルトの名無しさん
2007/04/17(火) 23:37:36最近はメモリに気を使う必要性が減ったから、
わざわざそういうことはしなくなったな。
0433デフォルトの名無しさん
2007/04/18(水) 01:02:36今は struct sockaddr 関係で使われてたような。
sin_addrが内部の何かのdefineだった気がする。実装依存だろうけど。
0434デフォルトの名無しさん
2007/04/18(水) 11:00:22であれば、使わなければよい。
実例としては、例えば「ICMPヘッダ union」でググるよろし。
0435デフォルトの名無しさん
2007/04/21(土) 18:03:25また、一般的な処理系ではどうなっているでしょうか。
0436デフォルトの名無しさん
2007/04/21(土) 18:24:28標準CではfreeにNULLを渡したときは何もしない(だから渡してもよい)
ことが保証されている。
0437デフォルトの名無しさん
2007/04/30(月) 09:05:06int、doubleなど同じ変数型でも変数の桁数、精度がそれぞれで違うと思いますが、
これらの違いの一覧はどこかで公開されているのでしょうか?
これらはOS依存なのでしょうか?それともコンパイラ依存なのでしょうか?
0438デフォルトの名無しさん
2007/04/30(月) 10:41:58たぶん求めてるのはこの中から見つけ出せると思う。
ttp://msdn2.microsoft.com/ja-jp/library/02c56cw3(VS.80).aspx
0439デフォルトの名無しさん
2007/04/30(月) 10:49:340440デフォルトの名無しさん
2007/04/30(月) 11:00:430441デフォルトの名無しさん
2007/04/30(月) 16:20:50char c;
if((c=getchar())==a)
と言ったものを考えたのですが、
char c;
if((c=getchar())=='a') に直すべきでしょうか。
非常に稚拙な質問ですが、よくわからないので助けてください。
0442デフォルトの名無しさん
2007/04/30(月) 16:26:29正しくコンパイルできて動くほうを選べ。
0443デフォルトの名無しさん
2007/04/30(月) 17:07:24ごめんなさい、今出先なのでコンパイルできる環境がないもので・・・。
どうか教えていただけませんか。
0444デフォルトの名無しさん
2007/04/30(月) 17:12:29教えるも何も >>441 からでは判別不能。エスパーの召喚が必要だ。
コンパイルできない環境で知る必要も無いだろう。帰ってからゆっくり試せ。
0445デフォルトの名無しさん
2007/04/30(月) 19:00:38前者は、入力した文字を 変数 a の内容と比較している。
後者は、入力した文字が a という文字かどうかを判定している。
さあ、選べ。
0446デフォルトの名無しさん
2007/05/01(火) 01:23:21トークンa
'a'という整数
0447デフォルトの名無しさん
2007/05/01(火) 07:40:59ついでにgetchar()の戻り値、文字リテラルの型はintだからchar c;ではなくint c;
とすべき
0448447
2007/05/01(火) 07:42:04Cの場合ね。
0449デフォルトの名無しさん
2007/05/06(日) 19:11:31-----
1,2,3,4
5,6,7,8
9,8,7,6
5,4,3,2
-----
数値はカンマで区切られています。
どうやったら a[0]=3, a[1]=7, a[2]=7, a[3]=3
というふうに格納できるでしょうか?
a[0][2]=3, a[1][2]=7, a[2][2]=7, a[3][2]=3
でも構いません。よろしくお願いします。
0450デフォルトの名無しさん
2007/05/06(日) 19:12:130451デフォルトの名無しさん
2007/05/06(日) 19:19:57適当でいいのなら fgets で 3 列目まで読み込んでから
sscanf(buf, "%d,%d,%d,%d", &a[0], &a[1], &a[2], &a[3]);
みたいに。
真面目にやるなら strtok とか、コンマを strchr で探して切り捨てたりしてから、
atoi とか。
0452デフォルトの名無しさん
2007/05/06(日) 19:31:52sscanf(buf, "%d,%d,%d,%d", &dummy, &dummy, &a[i], &dummy);
でいいじゃん
0453デフォルトの名無しさん
2007/05/06(日) 20:42:280454デフォルトの名無しさん
2007/05/06(日) 20:45:020455449
2007/05/06(日) 20:47:58とくに宿題ではないのでここに書かせてもらってます。
型は決まっているのでsscanfでできました。
ありがとうございました。
0456デフォルトの名無しさん
2007/05/07(月) 00:21:59すっかり忘れてたわー
0457デフォルトの名無しさん
2007/05/07(月) 11:33:22で、3カラム目だけ得る目的なのに4カラム目を空読みする理由は?
#"%*d,%*d,%d"で充分。
0458デフォルトの名無しさん
2007/05/07(月) 17:30:42上につられたってことにしといてください
0459デフォルトの名無しさん
2007/05/07(月) 23:31:13#define JIJYO(x) ((x)*(x))
main()
{
int i = 1;
while(i <= 5) {
printf("結果:%d\n", JIJYO(i++));
}
}
において、実行結果は1^2,3^2,5^2の順に表示されるのですが、
何故、1^2,2^2,3^2……とならずに、i++が2回ずつ呼びだされるのでしょうか?
0460デフォルトの名無しさん
2007/05/07(月) 23:42:30きっと仲間内では天然キャラとして愛される存在なのでしょう
0461デフォルトの名無しさん
2007/05/07(月) 23:53:10漏れも初心者なんで、あってるかどうかわからないけど。
#define JIJYO(x) ((x)*(x))
((i++)*(i++)) に展開されるんじゃないかな。
0462デフォルトの名無しさん
2007/05/07(月) 23:56:590464デフォルトの名無しさん
2007/05/08(火) 13:38:07問題文: f(x)=x^3(xの3乗)のdf(x)/dxのプログラムをC++で作れ。
(1≦x≦2、xは0.01ずつ増加<x(i+1)=x(i)+0.01>、そのときのf(x)の値も用いる。)
5月14日までに考えて来い!との事なので・・・
どうかご教授願いたく存じますm(_ _;)m
0465デフォルトの名無しさん
2007/05/08(火) 13:56:57for (int x=100;x<=200;x++)
{
cout<<(x/100.0)<<" "<<3*(x/100.0)*(x/100.0)<<"\n";
}
0466デフォルトの名無しさん
2007/05/08(火) 13:59:49宿題スレとのマルチはお勧めしない。
0467デフォルトの名無しさん
2007/05/08(火) 15:44:460468デフォルトの名無しさん
2007/05/08(火) 16:20:580469デフォルトの名無しさん
2007/05/10(木) 01:28:34丸投げしといて、回答があれば丸写ししようなどと考えてる (らしい) 奴が
>ご教授願いたく
などとふざけた台詞を吐くお陰で、この単語に脊髄反射してしまう奴が
後を絶たないんじゃないかと思うようになって来た。
0470デフォルトの名無しさん
2007/05/15(火) 23:33:14多次元配列がどうのこうのって書いてあったけど・・・
0471デフォルトの名無しさん
2007/05/16(水) 00:30:42ポインタのポインタで検索汁
0472デフォルトの名無しさん
2007/05/16(水) 00:45:130473デフォルトの名無しさん
2007/05/17(木) 19:23:250474デフォルトの名無しさん
2007/05/17(木) 23:52:420475デフォルトの名無しさん
2007/06/07(木) 11:04:30いまいち利点が分からないのですが。
0476デフォルトの名無しさん
2007/06/07(木) 11:19:39ttp://www.oopweb.com/CPP/Documents/STLGuide/Volume/Rope.html
個人的には、「非標準である」というデメリットしか思いつきません。
0477デフォルトの名無しさん
2007/06/07(木) 12:04:02リンクさせようとすると
undefined reference to ****
のようになります。
ライブラリの方はgccでしかコンパイルがうまく通らないのですが、
今後作成するプログラムはC++で書くため、gccでコンパイルしたものと
g++でコンパイルしたものをうまくリンクしたいのですが
何かよい解決策はないでしょうか?
0478デフォルトの名無しさん
2007/06/07(木) 12:17:22「名前マングル」でググるよろし。
ライブラリのヘッダに手を入れていいなら
プロトタイプ宣言の先頭に
#ifdef __cplusplus
extern "C" {
#endif
最後に
#ifdef __cplusplus
}
#endif
を入れる。
0479デフォルトの名無しさん
2007/06/07(木) 13:12:38{
scanf("%d", &a);
switch (a) {
case 1:
printf("a = 1\n");
break;
case 3:
printf("a = 3\n");
break;
case 5:
printf("a = 5\n");
break;
default:
printf("others\n");
break;
}
}
これでgとか非数値を入力するとscanfが飛ばされて
defaultの所が延々流れるのですが何故でしょうか?
0480デフォルトの名無しさん
2007/06/07(木) 13:20:522. a には何も入らないため、変数に最初に入ったゴミにより default が選択される
3. others と出力される
4. 1 に戻る
この無限ループ
0481477
2007/06/07(木) 13:22:090482デフォルトの名無しさん
2007/06/07(木) 13:51:28delete[] p;
これ、エラーも警告も何も出ないんですけど、
仕様上合法なんですか?
0483デフォルトの名無しさん
2007/06/07(木) 13:59:51なるほど、文字入力を%dの10進数指定して読み込んだら
ASCIIコードの値が格納されるかと勘違いしてました。
ていうか失敗の後再読み込みされずにgのゴミで処理されるって
scanfの仕様どうなってるんだろうかと今さらながらググってみたら
一番最初に出てくる関数だから侮っていたら書いてあることが意外と難しくてビックリでしたorz
0484デフォルトの名無しさん
2007/06/07(木) 14:15:41const int の配列を割り当てるのも、それを解放するのも
何の問題ありません。
でも p[0] = 0; なんてするとエラーになる罠。
0485デフォルトの名無しさん
2007/06/07(木) 14:26:43分かりました。
0486デフォルトの名無しさん
2007/06/07(木) 15:59:100487デフォルトの名無しさん
2007/06/07(木) 16:04:32void foo(const int* p) {
delete[] p;
}
を foo(p); って呼んで、
ああ、p は foo で何の影響も受けてないよねー、と思ったら、
delete[] されてた、なんつって。
まあ、const_cast という悪魔も確かにいるけどね。
0488デフォルトの名無しさん
2007/06/07(木) 17:36:120489デフォルトの名無しさん
2007/07/06(金) 09:47:01別の文字列 str2 に追記していく場合、
strncatを使用して
strncat(str2,&str1[i],1);
とするとstr2の内容が文字化けしてしまいます。
FedoraCore6なんですが、どうすればいいでしょうか?
0490デフォルトの名無しさん
2007/07/06(金) 09:48:110491デフォルトの名無しさん
2007/07/06(金) 10:01:41(だとか)だとかを入力後、他の文字を追記するとstr2に文字化けが生じてしまいます
0492デフォルトの名無しさん
2007/07/06(金) 10:03:31化ける前と化けた文字を見れば一発でわかるが・・・
iはちゃんと1ずつ進めてんの?
0493デフォルトの名無しさん
2007/07/06(金) 10:05:060494デフォルトの名無しさん
2007/07/06(金) 10:07:47文字列内にマルチバイト文字は入っていないと思っていたのですが・・・・
sizeof("(")でもsizeof("1")でも同じ値がかえってきたのですが、"("もマルチバイトなんでしょうか?
あらかじめstrlenで文字数を数えてからiを回しています。
0495デフォルトの名無しさん
2007/07/06(金) 10:08:40「だとか」じゃなくて、"("、")"のほうかよw
0496デフォルトの名無しさん
2007/07/06(金) 10:10:48すみません、ちゃんと""つけておいたほうが良かったですね。
0497デフォルトの名無しさん
2007/07/06(金) 10:13:540498デフォルトの名無しさん
2007/07/06(金) 10:17:24strcat は\0のとこに追加するんだぜ。
0499デフォルトの名無しさん
2007/07/06(金) 12:01:060500デフォルトの名無しさん
2007/07/06(金) 12:18:09してませんでした。
やってみます
0501デフォルトの名無しさん
2007/07/10(火) 21:31:00なるべくメンバ関数を作らないようにすべきですか?
それとも、どんどん関数を含めても良いのでしょうか?
思想的な質問ですが…
0502デフォルトの名無しさん
2007/07/10(火) 21:33:03メンバ関数・変数ともにそのクラスを表現するのに必要なものだけで良い
0503デフォルトの名無しさん
2007/07/10(火) 21:38:34そういうことで良いでしょうか。
0504デフォルトの名無しさん
2007/07/10(火) 21:59:27OOには単一責任の原則と言う物があるから
基本的にクラスが持つ責任は一つだけ。
メンバ関数をその責任に応じたもののみを付けるのが良い。
無駄に責任を負うと初心者にありがちなblobアンチパターンになる。
0505デフォルトの名無しさん
2007/07/11(水) 01:28:49{
public:
int x;
};
class B: public A
{
public:
int y;
}:
class C: public B
{
int z;
};
継承を習っているんですが、上のようなコードがあったとき、
int main()
{
C object;
}
このようにクラスCのオブジェクトを生成したとすると、
int x, yの分のメモリを保持しているクラスCのオブジェクトができるんでしょうか?
0506デフォルトの名無しさん
2007/07/11(水) 01:35:06class A
{
int x;
};
class B: public A
{
public
int y;
};
int main()
{
A* p;
p = new B;
}
このようにクラスA型のポインタでクラスBの領域を動的確保した場合、
Bのオブジェクトができるのですか?
それともAのオブジェクトができるのでしょうか?
0507デフォルトの名無しさん
2007/07/11(水) 01:35:08うん。もちろん z もね。
0508デフォルトの名無しさん
2007/07/11(水) 01:37:23ありがとうございます!!
0509デフォルトの名無しさん
2007/07/11(水) 01:38:420510デフォルトの名無しさん
2007/07/11(水) 01:40:07ありがとうございます!
これで今ある疑念が解消されました!
0511デフォルトの名無しさん
2007/07/11(水) 01:54:21>>506の場合において、生成されたクラスBのオブジェクトが持つint yにアクセスする手段ってありますか?
ポインタはクラスA型なので、アロー演算子を使っては呼び出せないですし…
もしかして不可能ですか?
0512デフォルトの名無しさん
2007/07/11(水) 02:09:52A* が指してるオブジェクトが本当に B だと確信できるなら static_cast で
B* に変換してアクセスできる。ただし、行儀のいいコードではない。
0513デフォルトの名無しさん
2007/07/11(水) 02:14:450514デフォルトの名無しさん
2007/07/11(水) 02:25:110515デフォルトの名無しさん
2007/07/11(水) 05:10:25最初のほうの計算がきれてしまいます。
0516デフォルトの名無しさん
2007/07/11(水) 05:15:38ウィンドウ名が書いてあるところ右クリック
↓
プロパティ
あとはお好きにドゾー
0517デフォルトの名無しさん
2007/07/11(水) 05:22:20そこからがわからないんですけど
バッファサイズとバッファ数を大きくすればいいのでしようか?
0518デフォルトの名無しさん
2007/07/11(水) 08:55:390519デフォルトの名無しさん
2007/07/12(木) 02:28:20あー説明不足ですまん。
> バッファサイズとバッファ数を大きくすればいいのでしようか?
おk。
0520デフォルトの名無しさん
2007/07/15(日) 18:42:34漢字かな雑じりの string を小文字にしたいんですが,以下の方法では「認.」 が化けてしまいます.
std::string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ AB確認.";//期待する変換: abcdefghijklmnopqrstuvwxyz AB確認.
std::ctype<char> c;
c.tolower( str.begin(), str.end() );//「認.」 が化ける
以下の方法で上手くいっているように思いますが問題ありますでしょうか?
また,もっと簡単な方法があれば御教示下さい.
for( int i=0; i < str.size(); i++)
{
if ( _ismbblead(str[i]) )
{
i++;
continue;
}
str[i] = tolower(str[i]);
}
0521デフォルトの名無しさん
2007/07/15(日) 21:09:48・・・
}
このときの繰り返し条件Nってどういう意味になりますか?
0522デフォルトの名無しさん
2007/07/15(日) 21:11:490523デフォルトの名無しさん
2007/07/15(日) 21:17:25どうしたらいいのでしょうか?
0524デフォルトの名無しさん
2007/07/15(日) 21:30:25まずは、パソコンの電源を入れる
0525デフォルトの名無しさん
2007/07/15(日) 23:02:52wchar_t 使えば?
0526デフォルトの名無しさん
2007/07/16(月) 00:43:590527デフォルトの名無しさん
2007/07/16(月) 00:58:23何か問題あるの?
0528デフォルトの名無しさん
2007/07/16(月) 01:47:49わざわざ文字コード変換とかするとか、
いくらなんでも無駄すぎる。
0529デフォルトの名無しさん
2007/07/16(月) 01:53:54Nがtrue(真)なら繰り返す
Nがfalse(偽)なら打ち切る
そして true とは 0 以外の値を持つ事であり、false とは 0 であることである。
0530デフォルトの名無しさん
2007/07/16(月) 02:18:50お前の言うことは分かるが、もし527に対して言っているのなら、
答えになっていないぞ。
無駄かどうかはともかく、wchar_tでも解決できるのだから。
個人的にはwchar_tを使うのはありだと思う。
確かにこの例では_ismbbleadの1つで済むが、そうでない(wchar_tにしたほうが手っ取り早い)場合は結構ある。
それ以外にも利点や必要があってwchar_tを使っていると、
522程度でもwchar_tを使えばいいと思うようになってくる。
今時変換のコストなんて微々たるもの。
なんなら元データをwchar_tと同じ文字コードにすればいい。(完全に脱線したが)
ただ、std::stringとstd::wstringとの間に簡単な変換方法が無いのは痛い。
ところで、wchar_t使う方法では、やり方次第で
全角英字まで小文字になりそうな気もする。
0531デフォルトの名無しさん
2007/07/16(月) 02:22:100532デフォルトの名無しさん
2007/07/16(月) 02:29:580533520
2007/07/16(月) 14:26:31皆さん御解答有難う御座います.
wchar_t も検討しましたが,問題なさそうなので >>520 で行きたいと思います.
有難う御座いました.
0534デフォルトの名無しさん
2007/07/19(木) 01:28:47std::cin >> x;
ってすると、xがint型であってもキーボードからWWWって文字列を入れたりすることができちゃうじゃないですか
これって防げませんか?
0535デフォルトの名無しさん
2007/07/19(木) 01:56:16入力されたらどうするかを自分で決めて好きに実装すればいい。
最悪は1文字ずつ処理。
0536デフォルトの名無しさん
2007/07/19(木) 21:54:410537デフォルトの名無しさん
2007/07/19(木) 22:57:530538デフォルトの名無しさん
2007/07/20(金) 00:55:380539デフォルトの名無しさん
2007/07/20(金) 03:37:06てか悪い。C++は良く分からなかった。
#include <stdio.h>
main() {
int a;
do {
printf("値>");
scanf("%d",&a);
while (getchar() != '\n') { }
} while((a < 1) || (a > 9999));
return 0;
}
0540デフォルトの名無しさん
2007/07/20(金) 04:07:14fail したら clear してから string へ読み捨てれば
0541デフォルトの名無しさん
2007/07/20(金) 22:37:430542デフォルトの名無しさん
2007/07/20(金) 22:52:48Cでも同じじゃね?
ってか、入力されるのは実際文字列であってたまたま数字だったら変換してくれてるってことでしょ。
Variantみたいな型が無い時点で>540のようにするしかないかと。
0543デフォルトの名無しさん
2007/07/21(土) 01:04:15どうしてもっていうならテンキー以外のキーボードをつなげるな
0544デフォルトの名無しさん
2007/07/21(土) 06:29:530545デフォルトの名無しさん
2007/07/21(土) 06:57:010546デフォルトの名無しさん
2007/07/21(土) 19:06:59地球上のキーボードが全てこれだったら、
ちっとはマシな世の中になってたかもな
0547デフォルトの名無しさん
2007/07/22(日) 07:58:57せめてリターンキーは必要だろう
CtrlとALTときたら普通はSHIFT
指五本あるのになんで三キーしかないのか
0548デフォルトの名無しさん
2007/07/22(日) 19:36:320549デフォルトの名無しさん
2007/07/23(月) 01:49:49NTのログインにも使わなくなったからな・・・
0550名無しさん@そうだ選挙に行こう
2007/07/29(日) 15:26:310551デフォルトの名無しさん
2007/07/29(日) 21:52:370552デフォルトの名無しさん
2007/07/30(月) 14:01:40その関数では使わない構造体の中の変数があった時
関数に構造体を渡した時に、
構造体の中の変数が多いとそれだけ何か、処理が増えてしまうのか
それとも「参照!」ってやったときだけ処理されるのかが知りたいです(´・ω・`)
0553デフォルトの名無しさん
2007/07/30(月) 14:08:550554デフォルトの名無しさん
2007/07/31(火) 00:41:42もう少し質問を簡潔にまとめてくれると助かる。
構造体を値渡しすれば関数内で利用されてない変数の有無に関わらずコピーの処理が発生する。
よって、構造体が大きくなればなるほど処理も大きくなる。
これを避けたいのであれば>>553のようにするか、ポインタ渡しすればいい。
0555デフォルトの名無しさん
2007/07/31(火) 10:51:52日本語の拙い>552に合わせて変な用語を使わなくていいよ。
構造体のメンバを変数と言われるとどうにも理解しにくいから。
#メンバ変数と言おうと要素と言おうとその辺は構わんが。
ついでに注釈。問題の関数がインライン展開されるような代物なら、
参照渡しでなくともコピーが発生しない可能性はある。
従って、迷ったときは値渡しで充分だ。
0556デフォルトの名無しさん
2007/07/31(火) 12:05:330557デフォルトの名無しさん
2007/08/01(水) 02:10:49ありがとう
>>554
なるほど
>>555
インラインっていうのを始めて知りました
それだとコピーされなかったりするんですね
でもとりあえず参照使っときます
0558デフォルトの名無しさん
2007/08/01(水) 02:28:350559デフォルトの名無しさん
2007/08/01(水) 11:49:120560デフォルトの名無しさん
2007/09/25(火) 00:02:25uint32_t index;
uint32_t block_size;
struct __blockData *next;
}BlockData;
struct __blockData *next;この部分なんとか
BlockData *next;って書きたいんですけど
なんとかならないっすか?
0561デフォルトの名無しさん
2007/09/25(火) 00:05:150562デフォルトの名無しさん
2007/09/25(火) 00:14:43ちょっとちょっとそんなぁ
まってくださいよ>>561さん
俺がどんな思いで12分過ごしたと思うのですか?
0563デフォルトの名無しさん
2007/09/25(火) 00:35:10最後の行のBlockData;までいったところで初めて再定義完了になるから
自分を指す場合ちゃんとstruct __blockDataと明示しないと不可。
0564デフォルトの名無しさん
2007/09/25(火) 00:39:25やけ酒するしかないな...
高校生だけどまぁいいかw
0565デフォルトの名無しさん
2007/09/25(火) 00:48:040566デフォルトの名無しさん
2007/09/25(火) 00:55:34これでいいんじゃね?
typedef struct __blockData BlockData;
struct __blockData{
uint32_t index;
uint32_t block_size;
BlockData *next;
}BlockData;
0567デフォルトの名無しさん
2007/09/25(火) 01:04:43それはCでもC++でも無理だろ。書き忘れたがC++コンパイラなら
struct BlockData;と前方宣言する事でコンパイルをパス出来た。
0568566
2007/09/25(火) 01:08:52>>567
最後の余計なやつだけ修正すればコンパイルできるよ。
C++ なら前方宣言も要らなくて struct BlockData { BlockData* ... ってできるよ。
0569デフォルトの名無しさん
2007/09/25(火) 01:13:220570デフォルトの名無しさん
2007/09/25(火) 01:17:52では・・・・だめですかそうですか。
0571デフォルトの名無しさん
2007/09/25(火) 01:18:50void *
の使いわけってどうすればいいの?
0572デフォルトの名無しさん
2007/09/25(火) 01:26:04UINT_PTRはunsigned intだった気もするけどよく覚えていない
0573デフォルトの名無しさん
2007/09/25(火) 04:52:14ってどんな意味なんでしょうか?
0574デフォルトの名無しさん
2007/09/25(火) 08:13:47a = a | b
0575デフォルトの名無しさん
2007/09/25(火) 09:29:14UINT_PTRはC99のuintptr_t相当。
0576デフォルトの名無しさん
2007/09/25(火) 23:18:36int と voidの使い分けは?
0577デフォルトの名無しさん
2007/10/18(木) 01:34:330578デフォルトの名無しさん
2007/10/18(木) 02:00:25void* はどんな型のポインタが渡されるか分らない場合に使う。
(キャストしないと参照先を見れない)
int* はポインタが指し示した先がint型であるとされる。
char a = 'a'
int* p1 = (int*)&a;
void* p2 = &a;
となっているとき*p1はエラーにならんが*p2はエラーになる。
なので関数内で使用時のキャストし忘れが防げる…のではなかったかな?
0579デフォルトの名無しさん
2007/10/18(木) 08:17:440580デフォルトの名無しさん
2007/10/18(木) 08:32:36ハード、ソフト共に同じはずなのに、別のPCではマルチプロセスのミューテックスによる排他制御が上手く働いていないみたいなのですが、
原因として何を疑えばいいのでしょうか。もう全然判んないです。
0581デフォルトの名無しさん
2007/10/18(木) 09:30:23最小限のコードを晒す
0582デフォルトの名無しさん
2007/10/19(金) 08:27:30それでは他人にはわかってもらえませんよ。
0583デフォルトの名無しさん
2007/10/19(金) 08:30:39今まで偶然動いていただけで同期処理に漏れがあったかだな
0584デフォルトの名無しさん
2007/10/19(金) 09:13:13うちでは上手く働いている
実力不足じゃね?
0585デフォルトの名無しさん
2007/10/20(土) 11:06:18高速なPCに変えたらおかしくなったとか
クアッドコアに変えたらおかしくなったとか
そういうマルチスレッドプログラムなんかもあるんだろうな。
0586デフォルトの名無しさん
2007/10/20(土) 13:03:240587デフォルトの名無しさん
2007/10/20(土) 16:34:200589デフォルトの名無しさん
2007/10/25(木) 17:57:28ってどっちが高速なの?
どっちも個数は100
0590デフォルトの名無しさん
2007/10/25(木) 21:02:400592デフォルトの名無しさん
2007/10/30(火) 01:12:14単純な例だと、2つの値(分岐先)が交互に来る場合。
こういった規則的なものなら、分岐予測はほぼ必ず成功する(ものが多い)。
最近のプロセッサなら、もっと複雑なパターンでも予測出来るものもある。
一方、テーブルジャンプだと、(普通は)前回と同じ分岐をすると仮定されるので
必ず分岐ミスとなる(ものもある)。
当然、分岐予測ミスのペナルティの大きさも含めて、プロセッサによる差が大きいけどね。
0593デフォルトの名無しさん
2007/11/16(金) 19:20:28なぜ「switch-case文より関数ポインタテーブルのが高速」だと考えるのか?
↓
条件分岐が排除できるから
↓
では、なぜ条件分岐が排除できると高速になるのか?
↓
実際に実行するコードがかなり前から分かっていれば、
CPUでコードプリフェッチやアウトオブオーダー実行などの最適化を行えるから
↓
関数ポインタテーブルを使えば実行するコードがかなり前に分かるのか?
↓
条件にもよるが、おそらくはノー
多くの場合、直前にならないと関数ポインタの値が分からない
つまり、関数ポインタテーブルを使っても、少なくともx86の場合は速くなりません。
条件分岐なら二者択一でとりあえずどちらかの分岐コードを実行するという手もありますが、
関数ポインタだとそういうこともできないので、多くの場合ストールします。
実際に実行するコードアドレスがかなり前から分かっていて、
そのアドレスを特定のレジスタ(か不変なことが保証されているメモリ)
に保存しておくことができればストールは回避できます。
0594デフォルトの名無しさん
2007/11/17(土) 15:25:530595デフォルトの名無しさん
2007/11/17(土) 19:17:040596デフォルトの名無しさん
2007/11/17(土) 23:16:36Cカス
うるさい人を黙らせる方法教えてください
なるべく合法的な方法がいいです
0597デフォルトの名無しさん
2007/11/17(土) 23:30:14全部Cで書かれてるんだぞ。
Cはすごいんだぞ。
0598デフォルトの名無しさん
2007/11/17(土) 23:35:23相手がしゃべった瞬間に大声を出すとか
0599デフォルトの名無しさん
2007/11/19(月) 07:11:07お前の耳を取ってしまえ
0600デフォルトの名無しさん
2007/11/22(木) 00:23:13テンプレート見たいに記述したいんだけど
どうしたらいいものじゃろうか?のぅ?
0601デフォルトの名無しさん
2007/11/22(木) 01:03:260602デフォルトの名無しさん
2007/11/22(木) 20:52:150603デフォルトの名無しさん
2007/11/23(金) 09:48:290604デフォルトの名無しさん
2007/11/24(土) 06:34:15generic.h
0605デフォルトの名無しさん
2007/11/27(火) 22:49:300606デフォルトの名無しさん
2007/12/01(土) 09:23:34でNULLを受け取れるようにするにはどうすればいいんでしょう...
0607デフォルトの名無しさん
2007/12/01(土) 11:57:46でないと、どの型のNULLがほしいか誰にも判らないじゃん。
0608デフォルトの名無しさん
2007/12/01(土) 13:28:57ばかじゃねーのw
0609デフォルトの名無しさん
2007/12/01(土) 23:02:23hoge<int>(0)
0610デフォルトの名無しさん
2008/01/18(金) 00:18:25char key[32]で定義しmemcpyを
必要に応じて複数回コールする方法と
struct key_data{
_u32 data;
....
};
みたいな感じで構造体を定義して
_u8 *にキャストして使うのは
どっちが速い?それとも同じ?
0611デフォルトの名無しさん
2008/01/18(金) 03:44:57実測。
0612デフォルトの名無しさん
2008/01/19(土) 00:12:37いくらここが掃き溜めだと言っても限度が・・・
0613デフォルトの名無しさん
2008/01/20(日) 21:00:38storage size of 's' isn't known
とでてきてしまいます。
これはどこを直せばいいんでしょうか?
storageって何ですか?
0614デフォルトの名無しさん
2008/01/21(月) 10:32:07辞書くらい引け。
恐らく、int s[]みたいな変数宣言でもしているんだろ。
0615デフォルトの名無しさん
2008/01/21(月) 12:37:58offsetof(s,m)マクロみたいなので
他クラスのprotectedメンバのオフセットを
取得したいんですがどうすればよいですか?
0616デフォルトの名無しさん
2008/01/21(月) 12:41:48それができたらprotectedの意味がないとは思わないかね?
0617デフォルトの名無しさん
2008/01/22(火) 23:31:19converting to ‘int’ from ‘float’
って表示されたらどこが悪いんでしょうか?
0618デフォルトの名無しさん
2008/01/22(火) 23:39:07floatからintに暗黙の変換を行っている。
明示的にキャストを書けば警告は出ない。
0619デフォルトの名無しさん
2008/01/22(火) 23:44:05>って表示されたらどこが悪いんでしょうか?
頭……というのはさておき、floatからintではオーバフローが起きる恐れがあるので
気の利いたコンパイラは警告を出すってこと。
# 勿論、出さないようにもできる。
0620デフォルトの名無しさん
2008/01/23(水) 00:29:52お陰様で解決出来ました、ありがとうございます。
0621デフォルトの名無しさん
2008/01/28(月) 20:04:43ではnewもbad_alloc投げる可能性があるのでコンストラクタでnewしてはいけないのですか?
0622デフォルトの名無しさん
2008/01/28(月) 21:45:32ダメというほどではない。
デストラクタは絶対あかんがね。
0623デフォルトの名無しさん
2008/01/29(火) 18:08:280624デフォルトの名無しさん
2008/01/30(水) 22:38:50俺は積極的に例外が発生するようにしてる。
じゃないと、不正なオブジェクトが生成されてしまうから
0625デフォルトの名無しさん
2008/02/02(土) 23:02:430626デフォルトの名無しさん
2008/02/12(火) 03:07:41~略
int servo_simple()
{
CPhidgetServoHandle servo = 0;
//create the accelerometer object
CPhidgetServo_create(&servo);
//open the LED for device connections
CPhidget_open((CPhidgetHandle)servo, 20489);
//Step 1: Position 10.00
printf("Move to position 10.00. Press any key to Continue\n");
getchar();
CPhidgetServo_setMotorPosition (servo, 1, 100.00);
return 0;
}
//int _tmain(int argc, _TCHAR* argv[])
int main(void)
{
servo_simple();
return 0;
}
0627デフォルトの名無しさん
2008/02/12(火) 03:08:03getchar();
で入力を待たずにCPhidgetServo_setMotorPosition (servo, 1, 100.00);
を実行したいのですが、getchar();を消しただけでは駄目なのでしょうか?
ド素人な質問をしていると思うのですがどうかご教示下さいませ。
0628626-627
2008/02/12(火) 07:42:400629デフォルトの名無しさん
2008/02/19(火) 23:09:36class MyClass;
って書けばいいけど、例えば
class MyClass
{
public:
class Foge
{
};
};
みたいに MyClass の中にあるクラス Foge を
前宣言したい時はどうすればいいの?
0630デフォルトの名無しさん
2008/02/20(水) 01:39:33class MyClass
{
public:
class Foge;
};
class MyClass::Foge
{
};
MyClass の定義無しでの宣言はできない。だからネストされたクラスを
インターフェースに使うと MyClass を前方宣言で済ませるのが難しくなる。
0631デフォルトの名無しさん
2008/02/20(水) 22:12:19プログラムを作ってるんですけども、こういうのってどうするのが良いですか?
交互に通信がある場合ならselect→recv→sendとかで簡単なんですけども
送信が繰り返される場合もあるので悩んでいます。
どなたか教えてください
0632デフォルトの名無しさん
2008/02/20(水) 22:58:08それについての質問ってここでしてもいいんですか?
0633デフォルトの名無しさん
2008/02/20(水) 23:35:38sendリクエストをsignalで受ければいいような。
もし必要ならネットワークスレへどうぞ。
>>632
マインスイーパー程度ならここでもいいと思いますが、
GUIライブラリの使い方なら該当GUIライブラリスレへどうぞ。
マインスイーパースレも参考にどうぞ。
0634デフォルトの名無しさん
2008/02/20(水) 23:51:14visualC++ 6.0を使って作ってるんですが
地雷の表示と踏んだ後のリセットがうまく出来ないんです
void CMine1View::DispMine()
{
CClientDC dc(this);
CBrush *oldBrush1,redBrush,*oldBrush2;
int iy,ix;
for(iy=2;iy<=Masu+1;iy++)
{
for(ix=2;ix<=Masu+1;ix++)
{
if(Mine_Position[iy][ix]==-1)
{
oldBrush1=(CBrush*)dc.SelectStockObject(WHITE_BRUSH);
dc.Rectangle(ix*Width,iy*Width,
ix*Width+Width,iy*Width+Width);
dc.SelectObject(oldBrush1);
redBrush.CreateSolidBrush(RGB(255,0,0));
oldBrush2=dc.SelectObject(&redBrush);
dc.Ellipse(ix*Width+5,iy*Width+Width+5,
ix*Width+Width-5,iy*Width+Width-5);
dc.SelectObject(oldBrush2);
redBrush.DeleteObject();
}
}
}
AfxMessageBox("地雷 踏みました!");
}
0635デフォルトの名無しさん
2008/02/21(木) 03:02:40selectが反応したときはrecvする
sendはいつでも何度でも好きなときに好きなだけ繰り返し呼んで良し
何か問題が?
0636デフォルトの名無しさん
2008/02/21(木) 03:13:070637デフォルトの名無しさん
2008/02/27(水) 01:03:33VC使ってて、あるクラスの実体を複数のスレッド内で使ってるのですが、
これって問題あるのでしょうか?
スレッド毎に異なるデータを用意してるので、
クラスのメンバ変数への排他の問題はありませんが、
クラス内にDLLクラスをメンバに作っていて、
スレッド毎に同じDLLにアクセスしています。
こんな使い方って問題ありますか?
0638デフォルトの名無しさん
2008/02/27(水) 01:08:240639デフォルトの名無しさん
2008/02/28(木) 03:27:06このとき、クラスBがクラスAのpublicな関数を呼び出すためには、
クラスBに対してクラスAの実体のポインタを渡し、そこからアクセスする以外に方法がありますか?
どのような方法があるでしょうか?
0640デフォルトの名無しさん
2008/02/28(木) 03:29:48ポインタじゃなくて参照使うとか、無理やり違う手段でっていうならグローバル変数とか、
いろいろありそうだよ。
0641デフォルトの名無しさん
2008/03/03(月) 15:37:24あんま使ったこと無いけどクラスBにクラスAのメソッドをfriendで共有すれば?
0642デフォルトの名無しさん
2008/03/03(月) 17:35:210643デフォルトの名無しさん
2008/03/03(月) 19:14:590644デフォルトの名無しさん
2008/03/04(火) 12:27:18C#でいうdelegate?
http://d.hatena.ne.jp/wata_d/20060309/1141875648
0645デフォルトの名無しさん
2008/03/04(火) 21:19:25どうあっても this は渡す必要がある。
デリゲートだって内部的に this を渡している訳で。
friend は public メンバ呼ぶのには全く関係ないな。
0646デフォルトの名無しさん
2008/03/04(火) 23:27:30もちろん、何らかの方法でthisを渡す必要はあるだろう。
でも、>>639の場面で、class Bからclass Aのメソッドを直接呼び出すには、class Bがclass Aを知らないといけない。
delegateは、メンバ関数へのproxyとして働くことで、メソッドを定義しているclassを隠すことが出来る。
>>639の場面では、class Bはclass Aを知らなくても、class Aのメソッドを呼び出すことが出来るようになる。
0647デフォルトの名無しさん
2008/03/04(火) 23:59:25結構危険な事だと思うけどね。
0648デフォルトの名無しさん
2008/03/08(土) 17:27:25コンストラクタで関数を呼ぶとは書いてないだろ
0649デフォルトの名無しさん
2008/03/13(木) 19:06:50何でstrcpy(s, NULL);は誤りなのですか?
0650デフォルトの名無しさん
2008/03/13(木) 19:26:01NULLがchar*型じゃないから
0651デフォルトの名無しさん
2008/03/13(木) 19:44:01普通は、s[0] = '\0';で十分だろ。せいぜいstrcpy(s, "");
0652デフォルトの名無しさん
2008/03/13(木) 23:19:500653デフォルトの名無しさん
2008/03/24(月) 10:47:50呼び出すためにはどうしたらいいでしょうか?
今ファイルがmain.cpp,hoge.h,hoge.cpp,hage.h,hage.cppとある時に,
全体でのメモリアクセスを調べるためにmain.cppでint型の大域変数を定義して,
hoge.cppとhage.cpp内で値をインクリメントできるようにしたいのですが・・・
0654デフォルトの名無しさん
2008/03/24(月) 10:51:040655デフォルトの名無しさん
2008/03/24(月) 11:25:16hage.h,hoge.hでexturn宣言したらエラーが出るのですが、
やり方間違ってますか?
0656デフォルトの名無しさん
2008/03/24(月) 11:26:37クラスにすることお勧め。
0657デフォルトの名無しさん
2008/03/24(月) 13:36:42>>655
ソースも見ないで間違ってるかどうか判断できるわけがない。
ソース(その変数に関係するところ)とエラー(いっぱい出てたら始めの3個くらい)を張って。
改めて打つんじゃなくてコピペで。
>hage.h,hoge.hでexturn宣言したらエラーが出るのですが、
externの綴りが間違ってる。ここに書く時に間違えただけならいいんだけど。
0658デフォルトの名無しさん
2008/03/24(月) 20:57:56原因である可能性の高いものを列挙してもらいたいんじゃない?
んで、それを一通り試して、自己解決しました!って言うの(笑)
0659デフォルトの名無しさん
2008/03/25(火) 02:29:45やりかたがまちがっている。
.h ファイルはコンパイルする必要はないよ。
0660デフォルトの名無しさん
2008/03/25(火) 03:10:31[main.cpp]
#include <stdio.h>
void hoge_inc(void);
void hage_inc(void);
int count;
int main(int argc, char *argv[]) {
count = 0;
hoge_inc();
printf("count = %d\n", count);
hage_inc();
printf("count = %d\n", count);
return 0;
}
[hoge.cpp]
extern int count;
void hoge_inc(void) {
count++;
}
[hage.cpp]
extern int count;
void hage_inc(void) {
count++;
}
0661デフォルトの名無しさん
2008/03/25(火) 11:28:05出てたエラーは
error LNK2001: 外部シンボル ""int mov_i" (?mov_i@@3HA)" は未解決です。
でファイルの依存関係が間違っていたのが原因でした。
>>656-660
有難うございました。
>>657
申し訳ないです・・・以後気をつけます
0662デフォルトの名無しさん
2008/03/26(水) 04:03:10MSDN の CallWindowProc の項目を見ると、FARPROC 型は
typedef int (FAR WINAPI *FARPROC)();
と宣言されているらしいんですが、WINAPI は __stdcall だから良いとして、FAR というのは何なんでしょうか?
MinGW だと FAR は省略されてるので、付けても付けなくても同じな気がするんですが、
とすると FARPROC=ただの関数ポインタと考えちゃって構わないんですか?
0663デフォルトの名無しさん
2008/03/26(水) 04:04:560664デフォルトの名無しさん
2008/03/26(水) 04:09:15ありがとうございます。なんかMS-DOS時代はFARとかNEARとか使ってたらしいのでそういうことなんですかね。
Windows だとこういうマクロとか typedef がやたらと多くて変な所でやたら苦労させられます(;´Д`)
0665デフォルトの名無しさん
2008/03/26(水) 11:29:57プリプロセスが終われば消えてなくなる。
0666デフォルトの名無しさん
2008/03/26(水) 19:20:320667デフォルトの名無しさん
2008/04/01(火) 23:30:29ClassA();
ClassA(int nSize);
と定義して、実体を書く時に
ClassA::ClassA(){
this->ClassA(1);
}
と言う具合に書きたいんですが
error C2273: '関数形式のキャスト' : '->' 演算子の右側で使用できません。
となって出来ません。
何とか、良い方法はありませんでしょうか?
ClassA(int nSize=1);
もあるとは思うのですが、指定した場合、もう少し細かくコードを書きたいのです。
0668デフォルトの名無しさん
2008/04/01(火) 23:35:07privateな初期化関数を作ってそれを呼ぶのが常套手段。
0669デフォルトの名無しさん
2008/04/08(火) 18:49:120670デフォルトの名無しさん
2008/04/08(火) 22:20:53ありますが、何か。
0671デフォルトの名無しさん
2008/04/08(火) 22:24:11って少佐が言ってた
0672デフォルトの名無しさん
2008/04/08(火) 22:28:060673デフォルトの名無しさん
2008/04/09(水) 04:07:450674デフォルトの名無しさん
2008/04/09(水) 06:39:060675デフォルトの名無しさん
2008/04/09(水) 07:04:280676デフォルトの名無しさん
2008/04/09(水) 08:05:200677デフォルトの名無しさん
2008/04/09(水) 08:59:32指定する時間単位と精度の違いに注意。
0678デフォルトの名無しさん
2008/04/09(水) 13:21:59ttp://www.be-interactive.org/index.php?itemid=57
にあるアクションスクリプトをC++で書き直してみたいんだけど、
辞書データのクラス化と初期化をどうやったらいいのか
分からなくて困ってます。
typedef struct { int x,y; } POINT;
class Stroke { vector<POINT> points; };
class DictItem { vector<Stroke> strokes; };
class Dictionary { vector<DictItem> items; };
と定義してはみたものの、どうデータを流し込んで
やればいいんでしょうか?
もしくはもっと効率的なクラス定義の方法があれば
教えてください。
0679デフォルトの名無しさん
2008/04/09(水) 21:09:120680デフォルトの名無しさん
2008/04/10(木) 17:44:250681デフォルトの名無しさん
2008/04/10(木) 21:40:05C/C++の質問ではありませんのでスレ違いです。
0682デフォルトの名無しさん
2008/04/16(水) 02:44:04int *p
int A[3] , B[3], C[3];
(p+0) = A;
(p+3) = B;
(p+6) = C;
0683デフォルトの名無しさん
2008/04/16(水) 02:47:570684デフォルトの名無しさん
2008/04/16(水) 13:52:330685デフォルトの名無しさん
2008/04/17(木) 02:20:38unionで配列の位置を一纏めに固定すれば可能
0686回答者も下級なのか、このスレは
2008/04/17(木) 08:15:36ほほぉ、unionでですか。具体例をどうぞ。
0687デフォルトの名無しさん
2008/04/18(金) 00:02:31パスはあってるし、DOS窓で実行ファイルと読み込みたいファイルのあるディレクトリに移動してから実行してもダメでした。
fopen_s(&fp, "a.txt","r")
fp=fopen("a.txt","r")
という書き方で間違ってないと思うのですが…
原因としてはどんなことが考えられるんでしょうか?
0688デフォルトの名無しさん
2008/04/18(金) 00:31:47a.txt.txt
0689デフォルトの名無しさん
2008/04/18(金) 22:58:27VisualC++2008 【Express Edition】
0690デフォルトの名無しさん
2008/04/19(土) 00:02:10int p[9];
int* A=p+0, *B=p+3, *C=p+6;
A[0]=(以下略
じゃだめなん?
0691デフォルトの名無しさん
2008/04/19(土) 00:25:14そうです
0692デフォルトの名無しさん
2008/04/20(日) 02:54:00union {
struct {
int A[3],B[3],C[3];
};
int D[9];
} Array;
int *p = &( Array.A[0] );
こんな風に
0693デフォルトの名無しさん
2008/04/22(火) 11:59:190694デフォルトの名無しさん
2008/04/22(火) 17:51:280695デフォルトの名無しさん
2008/04/22(火) 17:57:290696デフォルトの名無しさん
2008/04/22(火) 18:16:54a:0x8049e80 0x8049e80 0x8049e80
A:0x8049e80 0x8049e80 0x8049e80
11 12 13
4 5 6
0 0 0
のようになることを期待していますが11 12 13が1 2 3のままです。どのようにしたらよいか教えていただけると幸いです。
struct data{
double x[3],p[3],q,rm;
};
class Func{
public:
void func1(struct data []);
};
class SubFunc{
public:
void subfunc1(struct data []);
};
続く
0697デフォルトの名無しさん
2008/04/22(火) 18:17:29int main(void)
{
static data P[3];
Func FC;
FC.func1(P);
for(int i=0;i<3;i++){
cout << P[i].x[0] <<" "<< P[i].x[1] <<" "<< P[i].x[2] << endl;
}
return 0;
}
void Func::func1(struct data A[]){
SubFunc SFC;
SFC.subfunc1(A);
A[0].x[0]=1.0;
A[0].x[1]=2.0;
A[0].x[2]=3.0;
cout <<"A:"<< &A[0].x[0] <<" "<< &A[0].x[0] <<" "<< &A[0].x[0] << endl;
}
void SubFunc::subfunc1(struct data a[]){
a[0].x[0]=11.0;
a[0].x[1]=12.0;
a[0].x[2]=13.0;
cout <<"a:"<< &a[0].x[0] <<" "<< &a[0].x[0] <<" "<< &a[0].x[0] << endl;
a[1].x[0]=4.0;
a[1].x[1]=5.0;
a[1].x[2]=6.0;
}
0698デフォルトの名無しさん
2008/04/22(火) 18:27:36って書くと これどういう意味になるの?
0699デフォルトの名無しさん
2008/04/22(火) 18:29:01a[0]='1' a[1]='0' a[2]='0' a[3]='\0'
0700デフォルトの名無しさん
2008/04/22(火) 18:34:43さんきゅ!
0701デフォルトの名無しさん
2008/04/22(火) 18:36:19SFC.subfunc1(A);
A[0].x[0]=1.0;
A[0].x[1]=2.0;
A[0].x[2]=3.0;
SFC.subfunc1()呼んで11 12 13入れても、その後上書きしてるじゃん
0702デフォルトの名無しさん
2008/04/22(火) 18:55:07おっしゃるとおりです。ありがとうございました。
0703デフォルトの名無しさん
2008/04/23(水) 01:03:54ちなみに、使っている環境(って言うのかな?)はCPad for Borland C++Compilerってやつです
あんまり難しい専門用語は分からないんで、初級者でもわかるように教えてくれるとうれしいです
0704デフォルトの名無しさん
2008/04/23(水) 01:07:110705デフォルトの名無しさん
2008/04/23(水) 01:34:27それはリンカのこと?それともコンパイラのことですか?
超下級者だから全然わからん
0706デフォルトの名無しさん
2008/04/23(水) 01:35:44mingwやvcのexpress editionにすればいいのに。
0707デフォルトの名無しさん
2008/04/23(水) 01:39:430708デフォルトの名無しさん
2008/04/23(水) 02:19:31修正版の5.5.1がある。
0709デフォルトの名無しさん
2008/04/24(木) 10:33:03整数は割っても少数にならないし、小数は扱いにくいから
↓のを繰り返す。
x % 2 //2進数の一桁目がこれででる。
x /= 2 //一桁目を取り出したらずらす。
0710デフォルトの名無しさん
2008/04/24(木) 10:47:35x =>> 1
0711デフォルトの名無しさん
2008/04/24(木) 15:42:590712デフォルトの名無しさん
2008/04/24(木) 15:57:14ごめん。
>>709はマイナスのとき使えな・・くもないか。
0713デフォルトの名無しさん
2008/04/24(木) 21:56:290714デフォルトの名無しさん
2008/04/24(木) 23:44:040715デフォルトの名無しさん
2008/04/25(金) 09:16:090716デフォルトの名無しさん
2008/05/06(火) 17:33:03struct histgram{
int x;
int y[100];
};
void one(struct histgram *hist);
void two(struct histgram *hist);
int main (void){
struct histgram hist[1] ;
int z;
hist->x = 0;
for(z=0;z<100;z++){
hist->y[z]=0;
}
printf("before***%d***%d***%d***",hist->x,hist->y[0],hist->y[50]);
one(hist);
printf("before***%s***%s***%s***",hist->x,hist->y[0],hist->y[50]);
for(z=0;z<9999999999;z++);
return 0;
}
void one(struct histgram *hist)
{
two(hist);
}
void two(struct histgram *hist)
{
int z;
hist->x = 1;
for(z=0;z<100;z++){
hist->y[z]=1;}}
これで実行するとメモリのエラーが出るんですが、どうすれば解決するでしょうか
0717デフォルトの名無しさん
2008/05/06(火) 17:50:142つめのprintfは、%sじゃなくて%dを使うべし。
0718デフォルトの名無しさん
2008/05/06(火) 19:50:09○getchar();
0719デフォルトの名無しさん
2008/05/08(木) 06:03:230720デフォルトの名無しさん
2008/05/08(木) 06:44:040721デフォルトの名無しさん
2008/05/11(日) 01:10:46E2293 linearEq5.c 4:)が必要
って出ます。
#include<stdio.h>
#include<math.h>
#define MAX_DATA 1000//データ点まで想定
void read_data(double x[],double y[],int &order ,int &data_number)// データファイルの読み込み
{
FILE* ifp;
char ifile[20];
printf("Input the file name of input data:");
scanf("%s",ifile);
printf("何次近似にしますか?:");
fscanf(ifp,"%d",&order);
printf("Input a data number:");
fscanf(ifp,"%d",&data_number);
if((ifp=fopen(ifile,"rt"))==NULL){
fprintf("Can't open input file \"%s\"\n",ifile);
}
途中までです。
一様、visualではこのエラー表示は出ません。
どうしたらいいか教えてください。
0722デフォルトの名無しさん
2008/05/11(日) 01:22:34Cには参照はありません。visualとやらでエラーが出なかったとすれば、C++としてコンパイルしたのでしょう。
0723デフォルトの名無しさん
2008/05/11(日) 03:47:57参照って何ですか?
0724デフォルトの名無しさん
2008/05/11(日) 09:34:34int &
0725デフォルトの名無しさん
2008/05/11(日) 12:32:59ありがとうございます
0726デフォルトの名無しさん
2008/05/15(木) 15:59:47ヘッダのインポートセクションとかにアドレスが格納されている、という意味ですか?
0727デフォルトの名無しさん
2008/05/15(木) 16:06:350728デフォルトの名無しさん
2008/05/15(木) 17:09:060729デフォルトの名無しさん
2008/05/15(木) 17:17:010730デフォルトの名無しさん
2008/05/16(金) 01:25:27タグ打ってくれなきゃ元レスがわかんね
0731デフォルトの名無しさん
2008/05/20(火) 01:15:18c/c++じゃなくてもプロセス起動時にロードされてる?
0732デフォルトの名無しさん
2008/05/20(火) 10:18:50.dllや.soなら他のプロセスが呼び出してるかもしれん。
0733デフォルトの名無しさん
2008/05/23(金) 13:26:56言語:c++
argcに間違ったパスを入れてしまいました。
そのあと何度動かしても、動かした瞬間にargcに間違ったパスが入り
プログラム'******'を開始できません。指定したファイルがみつかりません
というエラーが出ます。
どうやったら、このエラーは出なくなるでしょうか
0734デフォルトの名無しさん
2008/05/23(金) 14:13:51argcはコマンドライン引数の数。パスなど入らない。
プロジェクトのプロパティのデバッグの動作のコマンドに間違ったものが入ってるとそうなる。
0735デフォルトの名無しさん
2008/05/23(金) 14:53:16argv にも入れてみるとか……
0736デフォルトの名無しさん
2008/05/24(土) 07:33:05プロジェクトのデバッグのタブの引数の項と間違えて、実行するプログラムのパスを書き換えたんじゃないのか?とか言ってみる。
0737733
2008/05/25(日) 11:26:100738デフォルトの名無しさん
2008/05/25(日) 19:04:50gcnewを用いてインスタンスを生成し、"->"を使用してメンバ関数を呼び出すと、メンバ関数からメンバ変数をアクセスできません。
ご回答のほど、よろしくお願いします。
0739デフォルトの名無しさん
2008/05/25(日) 22:46:160741デフォルトの名無しさん
2008/05/26(月) 00:28:280742デフォルトの名無しさん
2008/05/27(火) 23:28:52それだけじゃなんとも答えようがない。ここだとスレ違い気味だし、
コードを付けてこっちで聞きなおしてみたらいい。
C++/CLI part3
http://pc11.2ch.net/test/read.cgi/tech/1206447234/l50
0743デフォルトの名無しさん
2008/05/29(木) 15:58:07必ずC/C++ランタイムは使われていますか?
C/C++以外の言語で、C/C++ランタイムを使用している言語はありますか?
0744デフォルトの名無しさん
2008/05/29(木) 17:49:300745743
2008/05/29(木) 20:36:21C/C++ランタイムのスタートアップルーチンが呼ばれるそうですが、
まったく使わない事も出来る、とはつまり
main関数の前にスタートアップルーチンを呼ばない事が出来るということでしょうか?
0746デフォルトの名無しさん
2008/05/29(木) 21:47:150747デフォルトの名無しさん
2008/05/29(木) 22:32:17フリースタンディング環境とか
0748デフォルトの名無しさん
2008/05/29(木) 22:51:56書ける。組み込みなんか自分で書いたりするゾ
0749デフォルトの名無しさん
2008/06/05(木) 00:18:16while(fgets(str,512,fp)){
sscanf(str, "%d %d %d …, %d",
&input[0][ct], &input[1][ct], &input[2][ct], …, &input[N][ct]);
ct++;
}
とやっているのですが、Nを変数にしたい場合、どういう風にすればいいんでしょうか?
0750デフォルトの名無しさん
2008/06/05(木) 14:46:39C++ なら問題ない。
0751デフォルトの名無しさん
2008/06/06(金) 01:24:080752デフォルトの名無しさん
2008/06/06(金) 17:22:05をモジュールに引数として渡す方法を教えてください。もう3年も悩んでます。
0753デフォルトの名無しさん
2008/06/06(金) 18:57:23C++ならvectorでできる。C99なら可変長配列でそのままできる。C89だとmalloc()で確保するしかない。
入力自体は、いずれにしてもループで回すしかない。
0754デフォルトの名無しさん
2008/06/06(金) 18:58:00何をしたくて、3年間も何を無駄に調べたのか教えてください。
0755デフォルトの名無しさん
2008/06/07(土) 00:22:29多分調べればわかると思う。
0756デフォルトの名無しさん
2008/06/07(土) 23:03:18h に全部書いちゃいけないの?
(javaって1ファイルだよね?)
0757デフォルトの名無しさん
2008/06/07(土) 23:08:170758デフォルトの名無しさん
2008/06/07(土) 23:23:32データ対の大小比較を行った回数を計算し出力するプログラムなのですが
while(1){
count++
while(d[++i]<key)
count++;
count++
while(d[--j]>key
count++;
この部分は
これで合ってるのでしょうか?
0759デフォルトの名無しさん
2008/06/08(日) 00:35:08遅くなるの?
それは知らなかった。
Boostってhppだよね?
あれ、遅いのに採用してるの?
0760デフォルトの名無しさん
2008/06/08(日) 00:38:27インクルードってどういうものか分かってる?
ファイルの中身を合成するものなんだよ?
全てのコードをヘッダファイルに書いて
main のある .cpp でそれを全部インクルードしたとすると、
それら全てのファイルの中身を合成したファイルを
毎回コンパイルすることになるんだぜ。
そのファイルの中の1カ所を変更しただけでな。
0761デフォルトの名無しさん
2008/06/08(日) 00:40:13boost 全部を一気に使う訳じゃないだろ。
まあ、boost 使うとそれなりにコンパイル遅くなるけど。
そのためのプリコンパイル済みヘッダファイルだな。
0762デフォルトの名無しさん
2008/06/08(日) 00:42:53ただの宣言をするものと思ってた。
>>761
確かに、一気には使わないね。
ありがとう。
0763デフォルトの名無しさん
2008/06/08(日) 00:44:28if(整数型) ってやったときに
数字が0だと偽、符号が正だと真と聞いたのですが
ゼロ以下だとどっちになりますか?
0764デフォルトの名無しさん
2008/06/08(日) 00:45:25Boostの場合はテンプレート使っていてヘッダに書かざるを得ないという事情がある。
もちろん、ライブラリのリンクという面倒事を回避できるという点も影響を及ぼしているとは思う。
要LIBのものでも必要最低限しかLIBに入れていない。
0765デフォルトの名無しさん
2008/06/08(日) 01:02:37その説明はおかしい
0が偽で0以外が真
っていうかif(-1)とでもやって試せばどうかね
0766デフォルトの名無しさん
2008/06/08(日) 01:54:360767デフォルトの名無しさん
2008/06/08(日) 02:02:470768デフォルトの名無しさん
2008/06/08(日) 02:06:57まともな C++ の本読め。
0769デフォルトの名無しさん
2008/06/08(日) 06:58:450770デフォルトの名無しさん
2008/06/08(日) 08:51:070771デフォルトの名無しさん
2008/06/08(日) 08:57:060772デフォルトの名無しさん
2008/06/08(日) 11:56:17本ならここで聞け
ttp://pc11.2ch.net/test/read.cgi/tech/1209441159/
0773デフォルトの名無しさん
2008/06/08(日) 14:08:280774デフォルトの名無しさん
2008/06/08(日) 14:09:44いくらでも試す方法はあるだろうに・・・
0775デフォルトの名無しさん
2008/06/09(月) 02:57:06といわれたんですがC++特有で環境に著しく依存する物って何でしょう
仮想関数や継承の挙動が大きく変わるとは考えにくいんですが。
0776デフォルトの名無しさん
2008/06/09(月) 09:40:29言ったやつに聞いてくれよ。
0777デフォルトの名無しさん
2008/06/09(月) 11:43:49いったやつが理由を知らないんだよ。
知ったかぶりだよ。
0778デフォルトの名無しさん
2008/06/09(月) 12:31:53例外処理とか、標準ライブラリの実装とか、の話かな?
いずれにしても挙動が変わることはさすがにないでしょ。
もちろん規格に沿った範囲内の話で、未定義動作を利用した
コードなんかについては知ったこっちゃ無いけど。
0779デフォルトの名無しさん
2008/06/09(月) 13:07:23上司が自信満々に断言するので突込んで聞けなかったんです
0780デフォルトの名無しさん
2008/06/09(月) 16:17:23(*iter).name
で、なんでアスタリスクが必要なの?
0781デフォルトの名無しさん
2008/06/09(月) 16:41:34iter.name という表記は const_iterator のメンバ name を参照しようとしているのであって、Hoge の name を見ているのではない
iter->name ならおk
0782デフォルトの名無しさん
2008/06/09(月) 16:48:02ポインタと同じように考えればいいのなか?
0783デフォルトの名無しさん
2008/06/09(月) 17:36:46うん
0784デフォルトの名無しさん
2008/06/09(月) 18:27:12アリガ�d
0785デフォルトの名無しさん
2008/06/09(月) 18:37:410786デフォルトの名無しさん
2008/06/09(月) 22:20:010787デフォルトの名無しさん
2008/06/09(月) 23:16:16char a;
char b[10];
と宣言しておいて、b[-1]を指定したら、aを意味していることになりますか?
0788デフォルトの名無しさん
2008/06/09(月) 23:17:310789デフォルトの名無しさん
2008/06/09(月) 23:17:37なりません。未定義動作になります。
0790787
2008/06/09(月) 23:26:09配列の添字に-1を指定している箇所があり、気になって質問しました
このソフトはC言語で書かれています。
やはりこれはイレギュラーな使い方なんですね
0791デフォルトの名無しさん
2008/06/09(月) 23:36:26mallocで確保したアドレスに+1したものを配列として使ってたりしない?
0792デフォルトの名無しさん
2008/06/10(火) 02:07:48あとはアラインメントに関して処理系独自の定義が行われていれば
その処理系では保証されるね。
0793デフォルトの名無しさん
2008/06/10(火) 02:34:15されません。配列の添え字演算(ポインタ演算)で配列の範囲外にアクセスしたら未定義動作です。
0794デフォルトの名無しさん
2008/06/10(火) 02:43:510795デフォルトの名無しさん
2008/06/10(火) 04:40:52char a[10], *p
p = a + 1;
とすれば
p[-1] == a[0]
であり、そこにアクセスするのは何の問題もない。
0796デフォルトの名無しさん
2008/06/10(火) 07:05:10enum変数自体 int型で特に特別な変数ではないし
他の変数で代用可能だから活用法が思いつかない
どういった活用法があるのですか?
0797デフォルトの名無しさん
2008/06/10(火) 07:25:06C++なら多重定義できるのが便利と言えば便利、特にストリーム入出力。
これも主にC++のことだけど、クラス内で定数宣言するのにも使った。
static constのおかげでこの用途からは退き気味だけど。
0798デフォルトの名無しさん
2008/06/10(火) 11:13:14数値に特別な意味がない場合に、シンボル(名前)で記述できた方が判り易いことがしばしばあるから。
古いCだとdefineマクロしか選択肢がなかったのでデバッグ時に苦労したけれど、
enumならデバッガにシンボル情報をくれてやりさえすればシンボルのまま扱えるわけだ。
0799デフォルトの名無しさん
2008/06/10(火) 14:35:23信号機を作るときに
enum state {
green = 0,
yellow,
red,
};
と状態を宣言しておけば便利ジャン。
黄色の次は紫に変わるようにしろ、と言われたときでもyellowの次の行にpurpleを足せばいい。
static constだとredの値も変更しなくちゃならない。
0800デフォルトの名無しさん
2008/06/10(火) 15:11:52if (yello)
とかしとけば数値を気にしないで便利
0801デフォルトの名無しさん
2008/06/10(火) 15:25:29そこは理解済みです、言われている通り
#defineやconstよりはるかに便利だと思います
>>796で質問したことをコードにすると
enum タグ名 {
名前1,名前2,・・・
} 変数宣言
とした場合、宣言した変数の活用方について教えて下さい、という意味です
説明が簡単過ぎてうまく伝わっていなくて申し訳ないです
stractならデータ管理が目的なので利用法が思いつくのですが
enumの方は使いどころがいまいちピンときません
0802デフォルトの名無しさん
2008/06/10(火) 15:29:34>797とか。後は、例えばenum state conditionとか宣言しておけば
condition変数にはenum stateのシンボルしか入れない積りであることが明確になる。
コンパイラによっては、switch (condition)したときにシンボルの抜けがないかもチェックしてくれる。
0803デフォルトの名無しさん
2008/06/13(金) 01:07:53>>2-3
0804デフォルトの名無しさん
2008/06/13(金) 21:40:38構造体の場合
typedef struct{
int a;
double b;
}HOGE;
みたいに変数宣言するんじゃなくHOGE型として宣言しといたほうが
typedefせずグローバルで変数宣言すると何かとふべんだから
typedefして使うところで変数宣言したほうが良い
enumなら下記みたいに宣言したりする。
typedef enum {FALSE = 0,TRUE = 1} BOOL;
0805誰か一緒に考えてください
2008/06/13(金) 22:37:300806デフォルトの名無しさん
2008/06/13(金) 22:49:23漠然としすぎ
0807デフォルトの名無しさん
2008/06/14(土) 09:59:08>もしプロトコルを開発するならどんなプロトコルにしますか??
既存のプロトコルを利用できないか、再検討する。
0808デフォルトの名無しさん
2008/06/14(土) 16:32:10enum のすべてのメンバがそのスコープで有効になるのは勘弁してほしい。
メンバが多いと名前が衝突する可能性が高くなるし、
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 の言うように、特定の値しか入れない場合とかに使ってるんだが。
0809デフォルトの名無しさん
2008/06/14(土) 16:41:17class内に置く方法もあるぞ。
0810デフォルトの名無しさん
2008/06/14(土) 17:02:09なるほど。
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 とかうまく使えばこれを毎回書かなくても使い回せそうだ。
すばらしい一言アドバイスをありがとう。
・・・もしかして常識ですか?
0811デフォルトの名無しさん
2008/06/14(土) 19:48:180812デフォルトの名無しさん
2008/06/15(日) 00:40:33名前空間と列挙型が同一の名前を持っていることでしょうか。
0813808
2008/06/16(月) 00:05:50VC++ では
>コンパイラの警告 (レベル 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# ライクな列挙型もどきができるな。
これも非標準だし、列挙型みたいにする意義も薄れてるが。
0814デフォルトの名無しさん
2008/06/16(月) 22:51:16あー すっきり!!
もやっとボール 100000000個くれ!!
0815デフォルトの名無しさん
2008/06/17(火) 03:53:38それは >808 の namespace を使った例に対して Style::Style::None とした場合の警告じゃないか?
Style::None なら最初の Style は namespace 名だから、その警告には該当しないだろ。
0816デフォルトの名無しさん
2008/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); ←ココでエラー
}
}
0817デフォルトの名無しさん
2008/06/17(火) 11:08:24エラーメッセージぐらい貼れ。
人に原因を調べて欲しいならソースを略すな。
↓これ見ただけでポインタをよく理解していないというのがわかる。
> if((*fGroup).strKey != NULL) {
入門サイトをよく読みなおしたほうがいいかもしれない。
0818デフォルトの名無しさん
2008/06/17(火) 11:18:02MinGW 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) {
これは策がもうなくて、ものは試しにでやってみたのを削除し忘れていました。。。
0819デフォルトの名無しさん
2008/06/17(火) 11:22:13>デバッグ出来ない環境だから、エラーの原因は不明なのよおおお
それでプログラミングしようってのが無謀。
0820デフォルトの名無しさん
2008/06/17(火) 12:03:380821816
2008/06/17(火) 12:53:33無謀なのは承知です。printfにてエラー発生箇所は分かるのですが
原因を特定する為のデバッグのみが出来ない状況ですので
それで納得し、何とかやっております。
>>820
記述通り「struct FGroup」はヘッダでの宣言のみにて
中略部分ではstruct FGroupへの格納どころか、
struct FGroupの要素のstrKeyが一切記述されていなかったので中略していました。
それでも晒した方がよろしいでしょうか?
0822デフォルトの名無しさん
2008/06/17(火) 12:59:16相談したいなら晒したほうがいい。
でも、 strKey に値が設定されて無いなら strcpy でぶっ飛ぶのはあたりまえ。
0823デフォルトの名無しさん
2008/06/17(火) 13:02:48ごめん、確かに (名前空間名)::(列挙子名) は問題ないわ
どっかで Style::Style::None みたいなことしたから警告でたんだろうな
>>808 そのものは非標準ではありませんでした。
(>>813 の「列挙型の前方宣言」は非標準のはず)
0824816
2008/06/17(火) 13:07:13初期化されいてるとどこかで読んだ記憶があったので、
strcpyにて複写しても大丈夫かと思ってたのですが、、、駄目だったのですか?
0825デフォルトの名無しさん
2008/06/17(火) 13:11:13記憶があるのならどこで読んだか思い出して内容を確認してくれ。
たぶん間違いだから、 Web 上の記事なら晒して欲しい。
C言語で自動初期化(ゼロ初期化)が入るのは非ローカル変数かローカルで static な変数のみ。
0826デフォルトの名無しさん
2008/06/17(火) 13:36:190827デフォルトの名無しさん
2008/06/17(火) 13:49:180828デフォルトの名無しさん
2008/06/22(日) 00:49:36MResultGroupってMatchingResultGroupのtypedefか?
resに色々格納って言ってるけど、MResultGroupのインスタンスはちゃんと確保されてるのか?
fGroup自体が0(NULLはC++では使わない方が良い)だったりしないか?
今回のエラーには関係ないけど、j < 9 は合ってるのか?j < 10じゃねーか?
0829デフォルトの名無しさん
2008/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 ;
}
0830デフォルトの名無しさん
2008/07/06(日) 12:52:11エラーメッセージをよく読め。アドバイスしてくれてるじゃないか。
0831デフォルトの名無しさん
2008/07/06(日) 13:19:50もう一度よく調べてくる
0832デフォルトの名無しさん
2008/07/06(日) 13:35:52program still running?
program still running?
program still running?
program still running?
0833デフォルトの名無しさん
2008/07/06(日) 13:51:11って意味であってる?
0834デフォルトの名無しさん
2008/07/06(日) 13:53:050835デフォルトの名無しさん
2008/07/06(日) 14:02:450836デフォルトの名無しさん
2008/07/06(日) 14:06:460837デフォルトの名無しさん
2008/07/06(日) 17:27:220838デフォルトの名無しさん
2008/07/10(木) 17:51:51for(int n=0;n<1;n++)
func();
for(n=0;n<1;n++)
func();
みたいなfor()の括弧内での変数の宣言のスコープって括弧内とそのforループ内に限定されますよね。
これって昔のバージョンだとforのブロック内でも有効だったりしました?(下のforでも有効だった?)
0839デフォルトの名無しさん
2008/07/10(木) 18:09:24C++ の仕様決定以前に先走り実装されたコンパイラはそうなってたりする。
MS VC++ 6.0 とか。
0840デフォルトの名無しさん
2008/07/12(土) 18:13:03いちいちALT→押すのが面倒です。
0841デフォルトの名無しさん
2008/07/12(土) 19:44:330842デフォルトの名無しさん
2008/07/12(土) 20:20:190843デフォルトの名無しさん
2008/07/16(水) 15:14:24#endif
で囲まれた部分がコンパイルされたかをコンパイル時に簡単に知る方法を教えてください
0844デフォルトの名無しさん
2008/07/16(水) 15:15:06#ifdefと#endifの間に#errorと書く
0845デフォルトの名無しさん
2008/07/16(水) 15:23:22XXX_defined とか XXX_undefined ってグローバル変数を定義しておいて
オブジェクの中に該当シンボルが存在するか否かを調べる
もしくは
コンパイラにアセンブラソース吐かして眺めてみる
もしくは
出来上がったオブジェクトファイルの逆アセンブルリストを眺める
0846デフォルトの名無しさん
2008/07/16(水) 15:24:080847デフォルトの名無しさん
2008/07/18(金) 07:56:37実害のない警告が出るようにしておけばいい。たとえば
#ifdef XXX
#define XXX_DEFINED 0
#define XXX_DEFINED 1
...
#endif
0848デフォルトの名無しさん
2008/07/18(金) 08:45:390849デフォルトの名無しさん
2008/07/20(日) 16:42:29これはどのライブラリに入っていますか?
0850デフォルトの名無しさん
2008/07/20(日) 16:49:10STLport かな?
0851デフォルトの名無しさん
2008/07/20(日) 17:27:51STLportにありました。ありがとうございます。
0852デフォルトの名無しさん
2008/07/20(日) 17:30:06std::map じゃなくて unordered_map を「使わないといけない」状況って、どんなの?
0853デフォルトの名無しさん
2008/07/20(日) 17:47:57ビルドしようとしたソフトがunordered_mapを使っていたからですよ。
0854デフォルトの名無しさん
2008/07/23(水) 18:42:45c#のconsole.writelineみたいにvcのデバッガに出力する方法ってないの?
outputdebugstring()とかやっても出てこないんだけど。
0855デフォルトの名無しさん
2008/07/23(水) 20:52:35出てるよ、見てるとこが違うだけだ
0856デフォルトの名無しさん
2008/07/24(木) 08:24:23MFCを使ってるならTRACEマクロ
ATLを使ってるならATLTRACEマクロ
WIN32APIだけならOutputDebugStringをじかに使う。
C++・CLIならC#と同じのが使える。
0857デフォルトの名無しさん
2008/07/24(木) 17:21:59関数の宣言のとこで、引き値とか戻り値とかそれ自体の説明は
分かるんですけど、その使い分けの所がいまいちピンとこなくて。
例えばint main(void)とintとかその辺自体は分かるんですけど、
返り値が無いならvoidとかの説明で、じゃあなんで
このときはvoid使わないんだとか、自分が一からプログラム組むと仮定して考えた場合、
その辺の区分けと言うか、使い分けが明瞭に納得がいかなくて。
いろんな解説読み漁ったんですけど、はっきり分かんなくて。
0858デフォルトの名無しさん
2008/07/24(木) 17:57:48引数は渡すもの、戻り値は返すもの。
渡すパラメータがなければ引数は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);
0859デフォルトの名無しさん
2008/07/26(土) 01:22:48グローバル変数使えば引数で渡さなくてもいいけど、
何をする関数なのかわかりにくくなるし。
0860デフォルトの名無しさん
2008/07/26(土) 02:23:010861デフォルトの名無しさん
2008/07/26(土) 08:54:190862デフォルトの名無しさん
2008/07/26(土) 09:38:100863デフォルトの名無しさん
2008/07/26(土) 11:15:13華麗にスルーされる訳ですね。わかります。
0864デフォルトの名無しさん
2008/07/27(日) 12:19:58バッファアンダーランとかになったりするの?
0865デフォルトの名無しさん
2008/07/28(月) 12:47:370866デフォルトの名無しさん
2008/08/03(日) 13:30:11これはそのプロセスが確保していないメモリ空間から読み込もうと
したときに出るのですが?
0867デフォルトの名無しさん
2008/08/03(日) 13:38:36確保されてても読み取り専用領域に書き込もうとしたときも出る
0868デフォルトの名無しさん
2008/08/03(日) 17:05:21そんなもん、環境によって違います。そもそも出ない環境だってたくさんあります。
0869デフォルトの名無しさん
2008/08/03(日) 17:07:36comファイルって、プログラムと同一セグメント内にスタック領域を確保するから、
プログラムとデータが大きいとすぐに侵蝕しちゃうんだよね。
0870デフォルトの名無しさん
2008/08/04(月) 10:51:08日本語バージョンてないの?
0871デフォルトの名無しさん
2008/08/04(月) 10:58:38Linuxならデフォルトで入ってる
WindowsならMinGWをインストールする
Macなら知らない
0872デフォルトの名無しさん
2008/08/04(月) 10:59:390873870
2008/08/04(月) 11:04:59OSを書き忘れてましたが、WinXPです。
GCCにはいろいろ亜種があるということかな?
どれが標準てこともないの?
0874デフォルトの名無しさん
2008/08/04(月) 11:13:40MinGWはあくまでgccを簡単にインストールするためのパッケージ。
gccであることに変わりはない。
gccのバージョン違いはたくさんあるね。3.4とか4.1とか。
0875デフォルトの名無しさん
2008/08/04(月) 11:18:14擬似Unix環境ごとインストールするならcygwinという選択もある。
0876870
2008/08/04(月) 11:38:46MSYSなるものもありますね。
プログラミング目的ならMinGWとMSYSでいいのかな。
0877デフォルトの名無しさん
2008/08/04(月) 11:50:120878デフォルトの名無しさん
2008/08/04(月) 13:13:210879デフォルトの名無しさん
2008/08/04(月) 16:36:010880デフォルトの名無しさん
2008/08/04(月) 20:48:53さんくす、やってみるよ。
0881デフォルトの名無しさん
2008/08/04(月) 21:21:24MSゴシックだとうまく表示されなかった。
ぐぐってみてTerminal-14にしてみたけど、やっぱりうまく表示されなかた。
試したコマンド: ls /c/winnt
MSYS 1.0.10
rxvt 2.7.2
export LANG=ja_JP.Shift_jis とかやってもダメだった。
どうも根本的に何かを間違えてるのかなあ。
ま、いっか。
0882デフォルトの名無しさん
2008/08/04(月) 22:27:35-fn "MS ゴシック"-12
ls --show-control-chars /c/winnt
確認したら、LF改行コードのファイル~/.profile に
alias ls='ls --show-control-chars' を追加しておく
0883デフォルトの名無しさん
2008/08/05(火) 12:56:29ありがとう。
でも、俺の環境じゃ
ls --show-control-chars /c/winnt だと半角カナ混じりで化けた。
こんな具合いに: "ほげほげ.txt" → "・ル・ー・・ル・ー・.txt"
御協力感謝。
0884デフォルトの名無しさん
2008/08/06(水) 01:47:00cygtermみたいなのがmsysにあるともっといいんだけど。
0885デフォルトの名無しさん
2008/08/06(水) 02:30:38CPUのクロック数を変化させる、もっとも簡単なコードを教えてください。
0886デフォルトの名無しさん
2008/08/08(金) 00:18:33対応CPUならこれでクロック上がる
0887デフォルトの名無しさん
2008/08/08(金) 00:59:32そうか、その手があったか!
0888デフォルトの名無しさん
2008/08/08(金) 09:27:450889デフォルトの名無しさん
2008/08/08(金) 09:33:460890デフォルトの名無しさん
2008/08/08(金) 12:49:000891デフォルトの名無しさん
2008/08/08(金) 12:53:510892デフォルトの名無しさん
2008/08/11(月) 00:58:43クロックダウンのコード聞いたのですが・・・
0893デフォルトの名無しさん
2008/08/11(月) 03:01:06void main(void) { char i[256]; FILE* fp=fopen("C:\con\con","rb"); fread(&i, 1, 256, fp); fclose(fp); }
対応OSならこれでクロック下がる
0894デフォルトの名無しさん
2008/08/13(水) 21:27:50char* を バイト配列に変換するにはどうすればよいのでしょうか。
ちなみにchar*の中身は日本語文字列です。
0895デフォルトの名無しさん
2008/08/13(水) 21:44:54変換する必要はありません
0896デフォルトの名無しさん
2008/08/13(水) 22:46:39char配列とbyte配列はちがうような、、、
0897デフォルトの名無しさん
2008/08/13(水) 22:52:54charの配列は1バイト整数の配列すなわちバイト配列
何が違うというのか
0898デフォルトの名無しさん
2008/08/13(水) 22:54:40大概charをtypedefしたものなんじゃない?
0899デフォルトの名無しさん
2008/08/13(水) 23:12:14それらの言語のcharに相当するC++の型はwchar_tだ。
wchar_t配列と(それらの言語でのバイト配列に相当する)char配列との変換には
mbstowcs, wcstombs関数がまあまあ手軽に使える。
もちろんwchar_tの入出力で間に変換が噛まされるのはC++でも同じだ。
0900デフォルトの名無しさん
2008/08/13(水) 23:56:04__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です。
0901デフォルトの名無しさん
2008/08/14(木) 00:10:540902デフォルトの名無しさん
2008/08/14(木) 01:19:16なるほど・・・すばらしい。
どうもありがとうございました。
0903デフォルトの名無しさん
2008/08/14(木) 11:49:38どうもnullが入ってしまっていて、デフォルト引数が使えません。
どうすれば、デフォルト引数を使えるようになるか、教えていただけませんでしょうか。。。
int main (int argc,char *argv[])
{
abc(argv[1]);
・・・・・
void abc(char *str = "STRING")
{
・・・
0904デフォルトの名無しさん
2008/08/14(木) 11:59:59これではだめ?
if (argc >= 2)
abc(argv[1]);
else
abc();
0905903
2008/08/14(木) 12:07:56早速の回答ありがとうございます。
すいません。書くのを忘れてました。。。
main文は他の誰かが書くとかで、できたら関数(abc)の中で処理したいのですがいい方法ありませんでしょうか。
0906デフォルトの名無しさん
2008/08/14(木) 12:15:52{
if (str == NULL) str = "STRING";
...
}
0907デフォルトの名無しさん
2008/08/14(木) 12:17:480908デフォルトの名無しさん
2008/08/14(木) 12:26:000909903
2008/08/14(木) 13:05:15無事できました!ありがとうございます。
>>907
C++のデフォルト引数が便利そうだったので、使ってみたかっただけでした。。。すいません
0910デフォルトの名無しさん
2008/08/14(木) 13:09:08引数を渡さなかったときに使われるもの
argv[1]を渡せばargv[1]が渡る
0911903
2008/08/14(木) 13:12:19いろいろとありがとうございました。
0912デフォルトの名無しさん
2008/08/14(木) 15:09:44どうすればいいですか?例外をなげたほうがいいのか、
成功か失敗のフラグをクラス内部でもつのか、作成及び複製専用の
関数を用意したほうがいいのかよくわかりません。
できれば、コンストラクタで失敗したならそのインスタンスは無効であることを
戻り値で返せればいいんですが無理ですよね。
0913デフォルトの名無しさん
2008/08/14(木) 15:44:260914デフォルトの名無しさん
2008/08/14(木) 16:34:20なんでいくつも形式が存在するの?
0915デフォルトの名無しさん
2008/08/14(木) 16:36:321文字に4バイトも食うからそりゃ敬遠するでしょ
0916デフォルトの名無しさん
2008/08/14(木) 16:40:55キャラクタセットとエンコーディングは区別しろよ
0917デフォルトの名無しさん
2008/08/14(木) 17:37:50http://pc11.2ch.net/test/read.cgi/tech/1177930957/
0918デフォルトの名無しさん
2008/08/15(金) 02:44:25if(A){
if(B){
if(C){...}
}
}
これだったらどっちが高速なのですか?
0919デフォルトの名無しさん
2008/08/15(金) 02:47:050920デフォルトの名無しさん
2008/08/15(金) 02:48:390921デフォルトの名無しさん
2008/08/15(金) 02:59:55生成されるコードを見るしかない。
コンパイラによって違うかもしれない。
だが多分ショートサーキットを考慮すれば同じコードを吐くだろう。
0922デフォルトの名無しさん
2008/08/15(金) 03:11:44ありがとうございます。非常に勉強になりました。
0923デフォルトの名無しさん
2008/08/24(日) 08:19:33コールバッククラスのインスタンスでイテレータを保持するようにしたんだけど、
これってどう思う?
for (Hoge::iterator i = hoge.begin(); i != hoge.end(); ++i)
みたいな、その場のループで使い捨てする用途しか今まで見たことがなくて、ちょっと不安。
要素が増えも減りもしないことが分かっている場合は、ポインタと同じ感覚でいいのかな?
0924デフォルトの名無しさん
2008/08/24(日) 09:20:29どういうときにイテレータが無効になるかをきちんと把握して、
(ちなみにこれはコンテナの種類によって異なる)
自分も他人もそういうコードを書かないという確信があるならそれでいいんじゃない?
普通にコンテナのポインタなり参照なりを保持させればいいと思うけど、
それじゃ無理なわけ?
0925デフォルトの名無しさん
2008/08/24(日) 19:49:44コンテナの要素をどこまで処理したか覚えておきたいんだ。
wavのストリーム再生をイメージしてもらえれば近いかな。
コンテナのポインタなり参照なりを保持するとして、どうすればいいのか分からないです。
0926デフォルトの名無しさん
2008/08/24(日) 20:47:48コンテナの中身が書き換わらないならイテレータは無効にならない
0927デフォルトの名無しさん
2008/08/25(月) 01:09:12じゃぁ今回はイテレータ保持のままでいいか。どうもありがとう。
もっと色んなソース読んでみないとなぁ。自分のしていることが一般的なのか分からなくて不安。
0928デフォルトの名無しさん
2008/08/26(火) 01:02:11if(a>0xffffffff){ 命令; }
とするとコンパイラが 条件が常に真 と警告を吐きますが
普通に動作します
また -1(0xffffffff) を -2(0xfffffffe) に変えるとその警告は無くなります
変数 a はunsigned int型です
なぜこの警告は出るのでしょうか。
0929デフォルトの名無しさん
2008/08/26(火) 01:42:010930デフォルトの名無しさん
2008/08/26(火) 01:49:46でも普通にその条件式が動作するのは何でなんだぜ?
0931デフォルトの名無しさん
2008/08/26(火) 01:54:36常に真だから
0932デフォルトの名無しさん
2008/08/26(火) 01:54:52条件式の結果が真であることは誤動作じゃないだろ。
0933デフォルトの名無しさん
2008/08/26(火) 01:54:530934デフォルトの名無しさん
2008/08/26(火) 01:56:45>>928
おまえんとこのunsigned intの範囲が0から0xffffffffなんだろう。
a>0xffffffffという条件はaがどんな値でも成り立たない。
だからのその命令;は絶対に実行されない。
だったら初めからifなんて書くなよ無駄だからというのがその警告だ。
0xfffffffeにすると、aが0xffffffffの場合だけそこが実行されるという
意味のあるif文が出来上がるので、警告にならない。
あと、0xffffffffは-1ではない、4294967295だ。0xfffffffeも同様に4294967294。
0935デフォルトの名無しさん
2008/08/26(火) 01:58:41ガチですまん
俺ホント馬鹿
吊ってくる
0936デフォルトの名無しさん
2008/08/26(火) 02:03:010937デフォルトの名無しさん
2008/08/26(火) 02:22:25ばーか。コンパイラが「常に真」と言ってるんだよ。なにが「常に偽という気がする」だよ。
0938デフォルトの名無しさん
2008/08/26(火) 02:28:18いやだってa>0xffffffffが常に偽になる場合は容易に思い付いたけど、
常に真になる状態は考え付かなかったから。
常に真でも偽でも同じメッセージを使い回しているだけだろうと思うことにした。
0939デフォルトの名無しさん
2008/08/26(火) 02:33:030940デフォルトの名無しさん
2008/08/26(火) 03:03:500941デフォルトの名無しさん
2008/08/26(火) 04:21:350942デフォルトの名無しさん
2008/08/26(火) 07:40:50イヤなスレだなぁ・・・と思ったらイヤなのは俺だった
0943デフォルトの名無しさん
2008/08/27(水) 16:17:340xC0000005: 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);
}
0944デフォルトの名無しさん
2008/08/27(水) 16:58:13デバッグすればいいよ・・・・・・・・・・・・・・・・・・
0945デフォルトの名無しさん
2008/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はどう宣言されているんだ?
0946デフォルトの名無しさん
2008/08/29(金) 13:01:48一番簡単な方法はboostの変換ライブラリ使う事?
他にいい方法があれば教えてください。
0947デフォルトの名無しさん
2008/08/29(金) 14:53:32何かプロジェクトの設定とかが必要だったりします?
他のメッセージは送れるんですがこれはデータのコピーとかやってるのでその辺でこけてるのかなあと。
0948デフォルトの名無しさん
2008/08/29(金) 15:25:260949947
2008/08/29(金) 15:25:28解決しました
0950デフォルトの名無しさん
2008/08/30(土) 07:51:330951デフォルトの名無しさん
2008/08/31(日) 12:07:46とりあえずぐぐろう
0952デフォルトの名無しさん
2008/08/31(日) 12:18:42>>943ほどの低レベルなコードを書く奴ならどうせchar*tmp;と宣言していると予想
0953デフォルトの名無しさん
2008/09/01(月) 08:01:13最初の0をつけずに、.123の様になるようにするには
どのように指定したらよいのでしょうか
0954デフォルトの名無しさん
2008/09/01(月) 08:41:460955デフォルトの名無しさん
2008/09/01(月) 10:23:10文字列を入力する場合は、常に配列を使わなければならないのでしょうか。
たとえば、宣言は、 char st[100]; とかの例を見たりしますが、
char st; だけじゃ不都合があるのでしょうか。文字が一文字しか入らないとか。。。
0956デフォルトの名無しさん
2008/09/01(月) 11:15:33と思えばとりあえずなんとかなる
0957デフォルトの名無しさん
2008/09/01(月) 11:53:00Cには文字列形がないので、文字型の配列などに格納する必要がある。
文字型変数であるchar stには、当然ながら一文字しか入らない。
0958デフォルトの名無しさん
2008/09/01(月) 21:53:28C言語はソフト開発が出来るのでしょうか?(窓の杜にあるようなやつ)
回答お願いします。
0959デフォルトの名無しさん
2008/09/01(月) 21:57:300960デフォルトの名無しさん
2008/09/01(月) 22:11:12アインシュタインは紙と鉛筆で相対性理論を完成させたかもしれないが、俺にはできない。
たしかに偉大な先人達はCで作ったソフトを窓の杜に投稿したかもしれないが、
その軌跡を今の私たちが無理してなぞる必要は無いと思わないか。
ということで、もっと楽ちんな言語使おうぜ。
C++とか。
0961デフォルトの名無しさん
2008/09/01(月) 22:48:25ありがとうございます。偉大な人とはいえ結局は人ですからがんばって見ます。
0962デフォルトの名無しさん
2008/09/01(月) 23:27:030963デフォルトの名無しさん
2008/09/01(月) 23:52:14まぁ俺からのアドバイスとしては薄目にしても効果はないということだ。
0964デフォルトの名無しさん
2008/09/02(火) 10:18:530965デフォルトの名無しさん
2008/09/03(水) 22:24:55DBのコネクションは解放しなかったらいつまでも接続残って不味いとかはわかるんだけど
メモリにリソースが残ったままになるとかあるのかな?
0966デフォルトの名無しさん
2008/09/03(水) 22:36:22今は・・・無いのかな?
0967デフォルトの名無しさん
2008/09/03(水) 22:49:27exit()の中でfcloseall()している筈だから大丈夫。
0968デフォルトの名無しさん
2008/09/03(水) 23:34:41削除までは確認してませんでした。時間あるときやってみます
>>967
CreateThreadでhoge関数を別のスレッドで動かす。
hoge関数内でファイルポインタを開く。
hoge関数がファイルポインタを持った状態で、
別の関数からCloseHandleでhoge関数を終了させた場合ってどうなんでしょうか?
0969デフォルトの名無しさん
2008/09/03(水) 23:35:470970デフォルトの名無しさん
2008/09/03(水) 23:40:340971デフォルトの名無しさん
2008/09/04(木) 01:16:56レスありです
CreateThread使い出して気になったんで助かりました
0972デフォルトの名無しさん
2008/09/04(木) 07:32:360973デフォルトの名無しさん
2008/09/07(日) 23:59:50別のフォルダに移動するってどうやりますか??
MoveFileじゃできませんでした・・・
0974デフォルトの名無しさん
2008/09/08(月) 00:09:250975デフォルトの名無しさん
2008/09/08(月) 01:50:42system("move c:\\*.* d:\\*.*")
0976デフォルトの名無しさん
2008/09/10(水) 21:58:49教えてください。
0977デフォルトの名無しさん
2008/09/10(水) 22:30:43それくらいのことは、ここで聞いていないでググればもっと早く分かる。
0978デフォルトの名無しさん
2008/09/11(木) 19:06:17// データ部
msg.data[0] = cTagID[0];
msg.data[1] = cTagID[1];
msg.data[2] = cTagID[2];
msg.data[3] = cTagID[3];
msg.data[4] = cTagID[4];
msg.data[5] = cTagID[5];
msg.data[6] = cTagID[6];
msg.data[7] = cTagID[7];
msg.data[8] = cTagID[8];
msg.data[9] = cTagID[9];
msg.data[10] = cTagID[10];
msg.data[11] = cTagID[11];
msg.data[12] = cTagID[12];
msg.data[13] = cTagID[13];
msg.data[14] = cTagID[14];
msg.data[15] = cTagID[15];
わかりにくい表現だと思いますが、msg.data[0]〜msg.data[15]で何バイト使ってるのでしょう?
16byte?
0979デフォルトの名無しさん
2008/09/11(木) 22:54:45char型なら16バイト。それ以外の解釈の仕様が無い。
0980デフォルトの名無しさん
2008/09/12(金) 14:26:49sizeof(char) == 1
なら上に同じく
16バイト
0981デフォルトの名無しさん
2008/09/12(金) 15:11:19>sizeof(char) == 1
当たり前です。
0982デフォルトの名無しさん
2008/09/13(土) 01:01:350983デフォルトの名無しさん
2008/09/13(土) 03:23:41じゃ、何返すんだよ
0984デフォルトの名無しさん
2008/09/13(土) 03:42:28ただし、これは言語上での定義なので、32bitのことを言語上では「1バイト」ということもありえます。
0985デフォルトの名無しさん
2008/09/13(土) 13:34:33私はgが気に入っています。
このままずっとgを使い続けて問題ありませんか?
0986デフォルトの名無しさん
2008/09/13(土) 16:28:21私も%g推奨派ですが、出力フォーマットが仕様で決まっている場合などは%fを使うこともあります。
尤も、その場合は%9.3fなどの幅指定が入るわけで、生のままの%fを使うことは有り得ません。
そんなわけで、特に指定が無い出力に%gを使うのは蓋し妥当と言えましょう。
0987デフォルトの名無しさん
2008/09/13(土) 16:42:06ありがとうございます。
特に指定がない限り%gのままでやっていきます。
0988デフォルトの名無しさん
2008/09/13(土) 16:42:51sizeof(char)は1であり、sizeofはsizeof(char)の何倍かを返す。
単位がバイトであるとは規定されていない。
1バイトが何ビットか決められていないのとは、また、別の話。
0989デフォルトの名無しさん
2008/09/13(土) 16:50:46バイトってはっきりかいてあるだろ
ただc言語の上では1byte=8bitとは限らないってだけで
0990デフォルトの名無しさん
2008/09/13(土) 16:52:010991デフォルトの名無しさん
2008/09/13(土) 17:28:39古い規格だと、ISO 9899:1990 セクション 3.4 で "byte" が定義されている。
同 セクション6.3.3.4 に The sizeof operator yields the size (in bytes) of its operand.
とある。
sizeof(char)は1で単位はバイト。
終了。
scalaすれに誤爆しちゃった・・・(´・ω・`)
0992デフォルトの名無しさん
2008/09/13(土) 19:20:106.5.3.4の2に曰く
The sizeof operator yields the size (in bytes) of its operand,
6.5.3.4の3に曰く
When applied to an operand that has type char, unsigned char, or signed char,
(or a qualified version thereof) the result is 1.
0993978
2008/09/13(土) 21:33:38レス数が950を超えています。1000を超えると書き込みができなくなります。