1 :
デフォルトの名無しさん :
2006/08/22(火) 09:21:31
3 :
デフォルトの名無しさん :2006/08/22(火) 11:44:16
C++でスレッドってどうやんの?
適切なナビゲートに感謝します。
正規表現について教えてください。 aaa\bbb\ccc 上記のような文字列があったとします。 これを\で区切って、配列に格納したいです。 よろしくお願いします。 あっ、あとc/c++の正規表現の本って 見つけられないんですが無いんでしょうか。
>>6 \で区切りたいだけなら、正規表現ではないけど、Boost Tokenizerが使える。
パス文字列ならそれに特化したBoost Filesystemもおもしろい。
はきだめ的にはstrtokをバンバン使えというのが正しい。
boost馬鹿は死んでいいよ
Boostがないとまともに使えないC++の方こそどうにかしてください。
>>6 /**
文字列を指定の文字で分割し、単語のリストを作ります
@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;
}
>>10 C++ をどうにかするのが Boost の存在意義だろ。
使用制限があるわけでもないんだから、おとなしく使っとけ。
これで6と同じ動作をすると思う。
#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に言ってやってください。
>>11 int に string::npos が入ったら -1 になるのって、確実?
メモリ領域の質問です。 メモリ領域は ・プログラム領域 (ソースコードをロードする) ・静的領域 (グローバル変数など) ・スタック領域 (ローカル変数や引数などの、いわゆるワーク) ・ヒープ領域 (mallocなどで、プログラマが直接管理する) だと理解しているのですが、この理解は正しいでしょうか。 また、正しかった場合、静的・スタック領域ではなく、 あえてヒープ領域を使ってプログラマが特にメモリを管理するのは、 どんな意図があるのでしょうか。 具体的な使い道など教えて下さい。
>>7 >>8 アドバイスありがとうございます。
勉強してみました。
>>11 >>14 初心者、はきだめの僕としては、コードはすごい助かります。
穴があくまでじっくり読ませていただきます。
>>16 大体あってます。
Unixの場合は、
・testセグメント(命令(コード)の領域)
・dataセグメント(グローバル変数・static変数の領域)
・bssセグメント(Block Started by Symbol)
・stackセグメント
・ヒープ領域
となります。
Windowsのことは良く知りません。
またヒープを使うのは、動的にメモリを取りたいという要求があるからです。
グローバル変数やstatic変数では、この要求は満たせません。また、ヒープ
領域はごく限られたサイズしかないため、ヒープを使います。
修正: testセグメント ↓ textセグメント
>ヒープ領域はごく限られたサイズしかないため、ヒープを使います。 マゾっ娘確定
指摘サンクス。 修正: また、ヒープ領域はごく限られたサイズしかないため、ヒープを使います。 ↓ また、スタック領域はごく限られたサイズしかないため、大きなメモリを扱うためにヒープを使います。
24 :
11 :2006/08/26(土) 18:17:50
>>13 バカの一つ覚えでvoidでなく、とりあえずboolやっとけってのがある。それでかも
>>15 元ネタがパクリで覚えてない
CSVとかのコンマ区切り用で実際使ってます
>>20 間違いだらけって、どこが間違い?
いや、煽りじゃなくて、純粋に知りたい。
>>25 >20じゃないけど気づいた点を列挙。
>
>>16 >大体あってます。
そうでもないでしょ。
>Unixの場合は、
>・testセグメント(命令(コード)の領域)
これは>19だね。
>・dataセグメント(グローバル変数・static変数の領域)
明示的に初期化される場合のみ。
>・bssセグメント(Block Started by Symbol)
初期化されない静的変数などはこちら。
例えば0で初期化している場合は実装依存と思われ。
>またヒープを使うのは、動的にメモリを取りたいという要求があるからです。
表現が微妙だ。
>グローバル変数やstatic変数では、この要求は満たせません。また、ヒープ
>領域はごく限られたサイズしかないため、ヒープを使います。
>23だが「ごく限られた」が相対的だなぁ。
ついでに言えば、自動変数でも動的確保できるんだが。
大体あってるじゃん。
28 :
26 :2006/08/26(土) 20:14:53
そうかなぁ、スタックがワークに使われている理由を理解できていない気がするんだが。 それと、スタックのもう一つの重要な役割も書かれていないし。 #それらは末節だと言うのなら大体あっているってことだろうけどね。
>>28 > そうかなぁ、スタックがワークに使われている理由を理解できていない気がするんだが。
その理由とは?
> それと、スタックのもう一つの重要な役割も書かれていないし。
その役割とは?
再帰 関数の戻り先の保存
>>30 「〜などのいわゆるワーク」って書いてるじゃん。
明記してないから、理解してないということ?
>>16 メモリ領域は環境によっていろいろ変わるから、それで完全に
正しいかどうかは判別できない。でも一般的な区分として
そういう領域があるというのは正しい。以下は一般的な話。
プログラム領域にロードされるのはソースじゃなくてコンパイルされた
マシンコードね。
ヒープを使うのは、他のやつらが不適切なとき。
静的領域を使うと、プログラム起動中はずっとメモリを握ったままになるので
大きな領域で、必要な場合と不要な場合が分かれるようなときは効率が悪い。
スタックを使えば要らなくなったときにすぐ解放できるけど、解放の順序が
必ず確保と逆順じゃないといけない。あとはサイズに制限がある環境がほとんど。
つまり、大体あってるってことじゃん。
「大体」の基じゅ(ry
0 点じゃないってことじゃないの?
3点満点で1点てところだね どうにも割り切れない
37 :
16 :2006/08/29(火) 16:49:19
色々議論になってしまってすみません。
メモリ領域の分類については、
現時点の自分のレベルで理解する分には
差し支えないと思いました。
malloc(ヒープ)の利用については、以下のように解釈しました。
処理中で扱う配列データの個数が不定な場合に、
その時々に応じて臨機応変に配列を用意したい。
そのためにmallocで動的に配列用のメモリを確保する。
→メモリ節約技の1つ
なるべく理解してから書こうと思ったので、
レスが遅れました。すみませんでした。
ご回答頂いた
>>18 、
>>26 、
>>32 さん、
その他皆様ありがとう御座います。
builder使ってます。 ファイルを一行ずつ読んで、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; }
char *list[num]は、ポインタの配列だが、配列の中身(=各ポインタの値)は不定。 C99とGCC以外では、配列の大きさは「定数」として、コンパイル時に決まってなければいけない。 あらかじめわからない場合は動的に確保する。(何も考えずにvectorを使うのも可)
>>39 アドバイスありがとうございます。
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;
}
listという名前のvector...
「大丈夫でしょうか?」って・・・実行はしてみたの?
そりゃ一応動くらしきもの書いて、期待の動きはしてるようだが はたして重大なバグが潜んでいないか心配なので添削お願いできますか ということだろ。なんでみんなギスギスしてんの?
はきだめだから
だよな
まあとりあえず ・while (!fin.eof()) {} というやり方は大抵望み通りの動作にはならない ・printfにstringをそのまま渡しても大抵望みどおりの動作にはならない とだけ
これで十分だろう。 while (getline(fin, s)) { list.push_back(s); }
>>46 c_str()無いですね。
正常に動いてたっぽいんですが、違うソース
貼り付けてしまったのかもしれません。
while (!fin.eof()) {} は良くないですか。
奥が深いです。
難しいので今後の課題にさせてください。
>>47 ありがとうございます。
while (getline(fin, s))というのもできるんですね。
こちらに変えてみます。
while (!feof()) 系のやり方の駄目具合は、 最終行に改行だけの行(空行)がないファイルや 最後に改行がないファイルを扱ってみるとわかる。 なぜそうなるかは、feof()の仕組みを考えながら動きを追ってみるとよい。 もちろん、fin.eof()でも同じ。
Cのfeof()が立つのは、ファイルを読んだ後。 ~~~~~~~~~~~~~~~~~~~~~~ BASICとは違うのです。
クララが立つのはいつ?
においのいい草を食わせた後
>>49 >>50 詳しくありがとうございます。
こういうのって、経験して覚えていくんでしょうか。
覚えることがいっぱいあって大変です。
すごい簡単なことなんですが、ifの条件ってintだと、 0は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); } }
確認画面見ようと思ったら 書き込まれてしまいました。 コード、段落とかint main()とか抜けててすみません。
>>54 > すごい簡単なことなんですが、ifの条件ってintだと、
> 0はfalseでそれ以外はtrueっていうことでよかったでしょうか。
良い。
> 自分で関数作るときに-1をfalseにしてたんですが、
> ほかの人がみたら変に思われますか?
非負値を返す関数のエラーとして負値を返す事はある。
getchar の EOF とか。
真偽値しか返さない場合は、偽の場合 0 を返すのが当然。
真の方に関しては、何を返すかは case by case だが、
普通は 1 を返したのでいい。
is 系関数とか、真の時 1 以外の値も返す実装の場合もあるけど、
これは高速化の為にそうしてるだけ。
まあどちらにしろ、非 0 を返すのが当然。
C++ なら普通は bool 型にして true/false を返すけど。
さっそく、お返事ありがとうございます。 勉強始めたばかりなんですが、本でエラーのとき return -1っていうのがあったような気がして、 -1にしてたんですが、if文書いてて「あれ」っと思いました。 いろんな種類のエラーを返す複数のエラー処理を してたのも知れません。 0が偽で1が真ですか。了解しました。
>57 「エラーを返す」と「偽を返す」の違いを考えてみよう
エラーの内容が複数ある場合は、 0 を正常として、他の値をエラーとするね。
俺は0をエラー、1を正常にして、エラー番号をポインタでもらった引数に入れる。
そういう実装も見るね。
UNIX系で 0=OK、 1、2、3、4=エラーって見かける
DirectX も D3D_OK(0) が正常で他がエラーとか。
64 :
デフォルトの名無しさん :2006/09/04(月) 23:30:30
質問です。 std::vector<std::vector<int> > array; とある場合、clearをする場合は array.clear(); を呼ぶだけでメモリは解放されるのですか? それともループでまわしながら解放しなければいけませんか?
>>64 array.clear() でいいよ。ループは要らない。
66 :
64 :2006/09/04(月) 23:54:11
>65 どうもありがとうございます。 助かりました。
67 :
デフォルトの名無しさん :2006/09/05(火) 00:04:00
ちょっとクラスについて質問です。 入門用の本とかを見ると、C++のクラスは Javaで言うJavaBeansみたいな使い方ばかり書いてあるけど、 関数の塊のようなクラスは、普通作らないものなのでしょうか? 単純にヘッダをインクルードして関数を呼び出すものなのか、 それとも関数群をクラスにして、そこから呼び出したほうがいいのか。 悩んでおります。
>>67 クラスにするメリットがあるなら、そうすればいい。
Java とか関係無しに、それだけの話じゃないのか?
69 :
67 :2006/09/05(火) 00:24:16
>>68 オブジェクト指向って言うから、オブジェクト的にしなきゃ
いけないのかなぁ、と思いまして。
好きにすりゃいい、ってことなんでしょうけど。
特にメリットもなく、関数全部クラスにしたようなプログラムは
クソソース扱いなんだろうかと思うと、夜も寝られません。
>>69 何のメリットも無いのに複雑度を上げるソースは糞ソースに違いない。
> 関数の塊のようなクラス 俺からすれば、これはJavaが普通の関数を持てない(全てクラス内に入れないといけない)から、 仕方なくやっているという風にしか見えない。
72 :
67 :2006/09/05(火) 00:46:56
>>69 確かにそうッスね。
ライブラリとして、クラスにしてまとめるのも変?
>>71 あ、僕も最初はそう思ってたけど、だんだん麻痺して、
最初にクラスありきな頭になってたかも。
その関数群が共通となるデータを持たないのなら、クラスにする必要ないでしょ。 まぁ、共通のデータ構造を持っているならネームスペースに放り込んじゃえばいいしね。
あるフォルダのどんどん増えていく複数のテキストファイルを圧縮するって いうアプリを作りたいのですが質問です。 複数のテキストファイルを選択して、zipなどで圧縮するというのは できると思うんですが、新しく増えたテキストファイルを圧縮ファイルと 一緒にする方法を悩んでいます。 私の頭では、下記のような手順しかできそうにありません。 @圧縮したファイルをフォルダに解凍 A新しいファイルをそのフォルダにコピー Bまとめて圧縮 ただ、この方法だと圧縮された容量の大きいファイルを 毎回、解凍、圧縮することになります。 それで、下記のようなようなことをしたいんですが アドバイスをお願いできないでしょうか。 新しいファイルを圧縮して、それを圧縮ファイルに追加で 書き込むっていうことができれば、負担が少なくて良いかと 思っているんですがどうなんでしょうか。 また、圧縮ファイル内でもファイル名で区切れば、 全部解凍しないでも、そのファイル名での区間を 読み取って解凍すれば部分的に取り出すことができると思います。 えっと、圧縮するときも解凍するときも毎回丸々全部を 計算しないで、加えるところだけ圧縮、 読みたいところだけ解凍って言うことがしたいです。
>>74 やりたいことはわかった。あとは、何をやったらどんな問題が出たのかも書いてほしい。
>>74 使ってる圧縮フォーマットは何?
ライブラリ使って操作してるんなら、どのライブラリ?
>>75 >>76 すみません。実はこれから作ろうと思ってます。
ろくに調べないで質問してしまい
申し訳ございません。当方、初心者なのでこういうことが
実現可能かどうかわからず、それが知りたいということでした。
確かに、何が聞きたいのかわからない文章でした。
実現できそうということで、ひとつずつ調べて
書いてみます。
わからないことがあったら、また
よろしくお願いします。
時間掛かりそうですが、できたらコード書きます。
ありがとうございました。
共通アーカイブライブラリに行ってみたらどうだろう。
>77 m9プ
少なくとも、自前実装であれば、実現はできるだろう。
何かのライブラリ使うなら、マニュアルを百万回繰り返して読んでみてくれ。
俺なら、
>>79 の方法をとるが…。(でも、ZIPだけシェアウェアだったような希ガス…。)
うろ覚えですまんが、lzhだったら、全体のヘッダの後に、個数分の(ファイルごとのヘッダ+圧縮データ)が並んでるだけ。
だから、最後に単純にデータ付加すりゃヨロシ。
zipは知らないので、今、仕様を斜め読みしてみたが、最初のヘッダがなくて、個数分の(ファイルごとのヘッダ+圧縮データ)が並んで、
なんか、最後に変なデータ(ディレクトリツリーのデータ?)がついてるみたい。
(バイナリエディタで、zipファイルを覗いてみても、最後のあたりに、ファイル名のデータが入ってるね。)
まあ、それでも、たいした大きさじゃないので、どこかにデータ退避させれば、簡単にデータ付加できるだろ。
82 :
デフォルトの名無しさん :2006/09/07(木) 14:53:42
ファイルの読み込みの仕方を教えてください PGM形式の画像を読み込みたいんですが、コメント行の読み飛ばしなどがよくわかりません。 どうやって読み込んだらいいのでしょうか?
84 :
デフォルトの名無しさん :2006/09/08(金) 06:22:28
C++の資格って何かありますか?
>>82 pngじゃないのかよワロス
テキスト形式の画像フォーマットなんだ。おもしろい。
読み込み専用でいいなら、Susieのプラグインもあるみたいだね。
コメント行の最初は#になってるんだね。(改行は\n限定(\r\n不可)で。)
じゃ、最初1バイト読んで、分岐させて、次の行に逝けばいいじゃん。
ファイルから読んでるのか、メモリから読んでるのか、
また、テキスト読み込みには、何のクラス・関数使ってるのか分からんので、
これ以上は答えられない。
>>84 基本情報技術者・ソフトウェア開発技術者は持ってるので、
別の資格が欲しいってこと?
86 :
デフォルトの名無しさん :2006/09/08(金) 08:55:19
>>85 基本情報は取ったんだけど何とろうか迷ってる
さすがに今更サーティファイのCやJAVAなんて受ける気になれないしさ
87 :
デフォルトの名無しさん :2006/09/08(金) 09:14:14
資格より職務経歴
コールバックについて質問です。 手元の本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; }
>>89 関数ポインタで、ぐぐれば良かったですか。
見てみます。
ありがとうございました!
お世話になっております。 関数ポインタのページいくと、コールバック関数について 触れているページもありました。 自分で作った関数を引数にして渡せるAPI関数(なかのコードがわからないブラックボックスの) なんか見かけるんですが、ちゃんとその関数は、返り血の型、引数の型と個数が 定義されていて関数の中でポインタで呼び出されてるんですね。 ただ単に、引数にコールバック関数の名前だけを入れると 実行されるわけでは無いんですね。 普通に考えてもそんな意味のわからないルール作らないですよね。 見かけてもいきなり関数名だけ、引数に入れているので今まで 意味がわかりませんでした。 と思ったのですが、こういう解釈でよかったでしょうか。
>>91 解釈と感想がごっちゃになっててよくわからん。
きっと君自身ごっちゃになっているのだろうね。
先ずは、他人にきちんと説明できるように整理してみたら?
環境 OS:windows2000 コンパイラ:Borland C++ プログラム中においてフォルダを作成して その中にデータファイルの保存をしたいんですけど、 どうやればいいんですか?
つ[mkdir()]
95 :
93 :2006/09/09(土) 17:31:20
>>94 #include<windows.h>
int main(void)
{
system("md test");
return 0;
}
これで実現することができました。
ただこれだとフォルダ名が固定になってしまいます。
そこでフォルダ名を決めれるようにするにはどうしたらよいのでしょうか?
>>95 mkdir()は使わんの?
どちらにしろユーザーから入力された文字列を渡せばいいじゃない。
めっちゃ基本中の基本だけど。
>>95 つ[sprintf()]
つ[boost::format()]
つ[_mkdir()]
つ[CreateDirectory()]
つーか、調べるってことはできんもんかね。
systemなんて恐ろしい関数をよく使う気に
まあ確かに普通はあまり使わんかな。 外で何されてもわかんないもんなー。
現在ポインタ及びリスト構造の学習中で tagData * EraseNext(tagData *p); こういう文を見かけたのですが、どういう意味かわかりません tagdata * の”*”はどういう意味でしょうか?
>>100 仮引数と同じ、tagDataへのポインタ。としか言いようがない。
ポインタの学習中でその質問はないだろー
×学習中 ○たった今学習を始めたところ
たとえば、(tagData* p)と、(tagData *p)を別物と思ってるとか。
初心者以前のレベルの質問なのでこちらにきました。 telnetのクライアントの送受信の並列処理(マルチスレッド)について質問です。 telnetクライアント並列処理(親スレッドは受信、子スレッドは送信)を 実装することは、どういうことができるようになることなのでしょうか? 受信と送信のスレッドが起動していて、受信も送信もどちらでもできて、 単純な"送信→受信"だけじゃなくて、 「接続が確立したらいきなり"受信だけ"とか"受信→送信"というのもできる」ように なることをいうのでしょうか? サーバーの場合は、親スレッドがアクセプトして、 子スレッドを作って処理をさせることによって、 「複数のクライアントを相手することができる」というのは勉強しました。 よろしくお願いします。
>>105 送信が連続している状況でも安定して受信できる。
telnetのプロトコルはチャットほど単純じゃないから敢えてそうすることもあるんでないかな?
>>106 ありがとうございます。
>送信が連続している状況でも安定して受信できる。
スレッドがたくさん作られるということでしょうか?
スレッドだとちょっと複雑で自分的に難しいので、マルチプロセスで考えさせてください。
以下かなり省略した物になりますがコードです。
if(pid>0){
//親プロセス
while(1){
//受信処理
}
//シグナル送信、プロセス終了の処理
}
else if(pid=fork()){
//子プロセス
while(1){
//入力と送信処理
}
//シグナル送信、プロセス終了の処理
}
サーバーの場合、たくさんのプロセスが作られることになると思いますが、
上記のコードの場合は、親と子2つしかプロセスが作られないことになりますでしょうか?
アプリケーションを起動すると"標準入力から送信"、"受信"この2つのプロセスが起動して同時にできるだけ。
送信を連続でした場合、受信は並列ではなく、送信した命令の順番どおり受信することになるでしょうか?
長文すみません。変なところあると思いますので
ご指摘ください。補足させていただきます。
よろしくお願いします。
>スレッドがたくさん作られるということでしょうか? いいえ。 >上記のコードの場合は、親と子2つしかプロセスが作られないことになりますでしょうか? はい。 >送信を連続でした場合、受信は並列ではなく、送信した命令の順番どおり受信することになるでしょうか? サーバの御心次第です。 telnetプロトコルもそうだが、例えば標準入出力をみても必ずしも対になっていないことに注意。
>>108 ずばりの回答ありがとうございます。
すっきりできました。
pthread_createで複数スレッドを作ったときの プロセス内のスレッドの数が知りたいんですが方法 ありますでしょうか。 よろしくお願いします。
linuxのfork+execについて質問です。 下記のコードは10回繰り返し、execvを繰り返して、 プロセスが生成できなかったときは、もう一度繰り返したいため 失敗したときに、i--;してます。 ・このコードでエラーのときの処理できているか確認したいのですが、 プロセス生成をわざと失敗するようにすることできるでしょうか? ・i--で繰り返しの処理はできてるでしょうか? for(i=0;i<10;i++){ //子プロセスの生成 if((pid=fork())==0){ execv(path,opt); }else if(pid>0){ //親プロセス }else{ //子プロセス生成失敗の時はiを一つ減らして繰り返し i--; } }
>>111 実験してみたいだけならこんなマクロでも用意すればよろしかろ。
#define myFork(x) (fgetc(stdin) != (x) ? fork() : -1)
#んで、fork()の代わりにmyFork('\n')とでもすればいい。
>>112 関数のマクロ定義ってこういうふうに使えるんですね。
はじめてみました。
ど初心者なので感動しました。
どうやって勉強していけば、こういう感覚が身につくんだろう。。。
「勉強」しているうちは無理。
君は勉強をやめたの?
>>115 やってることは同じでも「勉強」だと認識してやってるようなうちは芽が出ないってこと。
なにその理屈w
勉強をやめてしまうことこそ芽がしぼむだろ普通に考えて。
日々是勉強
ファイルの排他制御をしたいのですが、open()関数を使って、 ファイルディスクリプタを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はどのようにすればよいでしょうか。 ・排他制御は、他にスマートで簡単な方法ありますでしょうか。 よろしくお願いします。
filebuf.sh_noneなんて非標準だから使えないのは別に悪く無い。 正攻法ではファイルディスクプリタで読み書きするバッファクラスを自分で作れということになるのだが、まあ面倒。
>>121 お返事ありがとうございます。
>filebuf.sh_noneなんて非標準だから使えないのは別に悪く無い。
非標準とかそういうこともあるんですか。知りませんでした。
tp://www.kumei.ne.jp/c_lang/cpp/cpp_38.htm
有名そうなページでもfilebufってでてきたので、エラーがでるのは、
自分の書き方が変だと思いこんでました。
いろいろ検索してみると、ifstreamで排他モードはできない
と書いてある掲示板の書き込みもありました。
windowsだとライブラリあるんですが、linuxだとそういうの
簡単にできるの無いっぽいです。
boostもちょっと見てみたんですが良くわからないし、
自分のスキル的にopen+flockじゃないとだめのようです。
実はflock()は完全ではない罠。
>>123 flock調べたんですが、どういうところが完全じゃないんでしょうか?
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番目の操作が、ストリームで操作できないと、
はじめからディスクリプタで開くしかないですよね。
読んでもわからないので、とりあえずやってみるしか無いでしょうか。
flock()は、flock()を使わないプロセスからのアクセスを制限できないんじゃないのか? 誰もがflock()使ってアクセスする保証があるなら問題ないが。
それを問題あると言っちゃうのか・・・。
>>125 >>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
環境が対応していないのか、わかりませんせんがいろいろ
試しても動きませんでした。
よろしくお願いします。
128 :
デフォルトの名無しさん :2006/10/01(日) 13:49:36
Cで、ある一定時間内に入力がなければ 次の処理に移る、ということをしたいんですが どのように書けばいいのでしょうか。
一定時間内に入力が無いってどういうこと? 関数内で、tm構造体からforかwhileで時間取ってはその時間の差分とって 条件満たせば、関数を抜け出すようにしてみれば?
キーボードからの入力のことです。 ずっと入力待ちなるんじゃなくてしばらくしたら飛ばしたいんです。 while(時間の条件){ scanfとか; ←ここでずっと止まったりしないですかね? }
標準Cでは無理だね。 「キーボードが押されたか」の検出は。
そうですか・・・。ありがとうございました。
標準Cでできないとはつまり、 WindowsならWindowsの関数、UnixならUnixの関数使えばできるよということ。
機種依存スレに行けばいいかも。 Windowsだったら思い切ってAPIスレへ。
夜遅くにすみません… 今、VC++でプログラミングしてるんですが、 ダイアログボックスから変数を持って行きたい時はどうすればいいですか? 例えば ダイアログボックスで 次の数の二乗を算出します とか書いてユーザに入力を求めて、そしてユーザが入力したら その値を元に計算→出力 的な感じなんですが…
136 :
デフォルトの名無しさん :2006/10/03(火) 03:14:22
ヘルプを見ろ。それで全てが解決する。
137 :
デフォルトの名無しさん :2006/10/04(水) 22:20:22
class CDSig : public CDialog { // コンストラクション public: CDSig(CWnd* pParent = NULL); // 標準のコンストラクタ ・ ・ ・ 以下略 ------------------------------------ VCでダイアログを作成しクラスCDSigを作成したところ自動で上のようなクラスが 自動で作成されました。 標準でコンストラクタが出来ているようですが、自前でクラス内の変数を初期化する コンストラクタを作成するにはどうしたらよいのでしょう? 名前CDSigの定義を追加すると error C2668: 'CDSig::CDSig' : オーバーロード関数の呼び出しを解決することができません。 と怒られます。
>>137 その「標準のコンストラクタ」の定義を変更しろ。
139 :
デフォルトの名無しさん :2006/10/07(土) 14:42:09
C++で 「変数aとbの符号が同じ場合」という条件を判断する関数があれば教えてください。 自分はif ( ( a < 0 ) == ( a < 0 ) ) と書いてるのですが、あまりに非効率な気がするので...
a*b > 0
141 :
139 :2006/10/07(土) 14:53:15
>>139 スミマセン
変数a,bは有効数字15ケタなんです。書き忘れました。
それでも掛け算は避けた方がいいかな〜と思ってます。
>>141 有効数字15桁ってどんな型?
まぁ、何をもって効率とするかが未定義なのでそもそも答えようがないけど。
・コーディングの効率なら、テンプレート関数でそういう関数を一個作っておけばいい。
・実行効率なら、型ごとに大抵は符号ビットを持っているだろうからそれを見ればいい。
143 :
141 :2006/10/07(土) 15:37:59
>>142 double型です。
符号ビットの見方を教えてください
IEEE754 変数(のbit)同士でxorでも取ったあと、 符号bitのみ見ればいいんじゃないかね。
145 :
141 :2006/10/07(土) 16:00:07
1bitが符号判定に割り当てられてるのは勉強しましたが、 どうやって1bitを見ればいいのかさっぱりわかりません。 コードを書いてもらえませんか...
&
( a < 0 ) == ( b < 0 )
これが画像処理の1ピクセルごとに繰り返されるのなら
気になるかもしれんが、そうでもないならこれで十分。
double使ってるんだからそんなにシビアなものを組んでるとも
思えんし。シビアなところならdouble使うのをやめる工夫をして、
整数タイプでxorしたらいい。
もしどうしてもって言うなら
>>146 だけど、エンディアンには気を
つけてね。
つーか、パフォーマンスを期待しているならそんなところよりも他にやることが山ほどありそうだが。
150 :
141 :2006/10/07(土) 17:20:38
>>146 , 147, 148, 149
2000回ほどのループなので、計算負荷が高すぎて困っているというわけではないのですが
Cの先輩方はどのように書くのか知的好奇心から質問しました。
&も使えるように練習してみます。ありがとうございました。
ひとつだけアドバイスしておくが
おまえが小手先でごちゃごちゃやろうとしている方法よりも
単純な
>>139 のままのコードの方がが、最適化されて速くなっている可能性も十分ある。
とりあえず、何か小技を使おうとする前に
必ずアセンブラ出力を見て不満があるかどうかを判断すべき。
もちろん、それ以前に、そこまで速度を求める必要があるのか
あるいは他の部分で工夫すべき点がないのか、ということをよーーく考えるべきだが。
PXOR
( a < 0 ) == ( b < 0 ) 何に使うのか知らないけど、これじゃ、ちゃんと動かない可能性ある罠。 a<0が、1返して、b<0が2返したら、!=になるし。 また、aかbのどちらかがゼロだったらどうする?(プラス扱いするならいいけど) おいらなら、signって関数(符号に応じて-1,0,1を返す)を作って、 sign(a)==sign(b)って書く。 おそらく関数の中でif文使うから、実行効率は最悪だけど、 実行効率より、バグ鳥する時のコードの読みやすさ考えないと。 あと、どうしても効率最優先でも、何に使うのかが分からないと、最適な判別式は決められない。
pugya-
>>153 a < 0 が0か1であることは保証されている。
>>153 Cの比較演算の仕様を勉強しなおしてからお越しください。
0 か 1 になるのは C.質問者は C++ で聞いている.まあそれでも
The 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 はアホ.
#include <string> using 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のところってまずいですよね?
別に。
間違えた。 B &operator=(const B &b0){ b = b0.b; }
>>159 stringのメンバにポインタがないことは保障されているのですか?
>>161 stringはコピーコンストラクト可能かつ代入可能。
ポインタは含まれているが、コピー時は生ポインタを明け渡すわけじゃなくって
ポインタが指し示す内容をコピーする様に作られてる。
よって何の問題も無い。
A のデフォ代入演算子がmemcpy() だとまずいと思ったのですが。 つまり、デフォの実装が A A::operator=(const A &a0){ memcpy(this, &a0, sizeof(A)); }
送信失敗、すみません。 デフォの実装が A A::operator=(const A &a0){ memcpy(this, &a0, sizeof(A)); return *this; } これだと、メモリ二重開放にならないかと心配したわけです。
C++のクラス(=構造体)の代入処理は、各メンバの代入処理を行なう形になる。 たまたまPODメンバがまとまっていれば、memcpy()相当の実装をするかもしれない。
なるよ。 つーかそんな馬鹿な実装はしちゃいかん。 C++におけるmemcpyは純粋に生のバイナリデータ転送用で、メンバのコピー用じゃない。 余談だけど、thisがポインタなのはthis登場時にC++がまだ参照をサポートしてなかったからで、 thisがポインタであることを副作用的に使うコード(memcpyの引数にする、this[2]とか書く、エトセトラ)は 総じて何か勘違いしている傾向。 忌避したくらいで丁度いいぞ。
>memcpy な実装になってメモリリークする。 服脱いで正座してbasic_stringのコード読んで来い。 そんなになってたまるか。アホらしい。
>>168 コンパイラが
A A::operator=(const A &a0){
a = a0.a;
}
と解釈してくれるものなのでしょうか?
158の場合では代入演算子ではなく、コピーコンストラクタが使われる。まあ話は変わらないが。 operator =が定義されていないときのデフォルトの実装は、 各メンバと基底クラスに代入演算子を使用したのと同じ動作をするということになっている。 また、コピーコンストラクタにも同じような規定が存在する。 162の言うとおりstd::stringが適切なコピーコンストラクタやoperator =を持っているため、 158/164の心配は杞憂だということになる。
ああ、ごめんみんなもう書いていたね。
>>171 >158の場合では代入演算子ではなく、コピーコンストラクタが使われる。
例が悪くてすみません、全くもってその通りでした。
>>165 これがFAでしたか。
皆様ありがとうございました。
175 :
153 :2006/10/09(月) 00:44:02
質問させてください。 ちょっと説明が下手でわかりにくいかもしれませんが、 ある関数の中で、引数の配列の長さを知ることはできるでしょうか? 例えば配列の平均を求める関数averageを作りたいとき main関数内でa[100]とかb[80]とかを定義して、average関数に引き渡すとします。 (average(a)みたいな感じで) このとき平均を求めるには当然、配列の要素の数が必要になるわけですが、 これをaverage関数内で求めることはできるのか?という質問です。 今は配列とともに要素の数もaverage関数に渡しているのですが、他に良い方法があったらご教授ください。
>>176 C++なら関数テンプレートにすればできんことはないよ。
多分↓こんな感じにすればおk
template<int array_size>
int average(const int array[array_size])
{
...
}
template <int N> int average(int (&array)[N])
で、後は要素の数は sizeof(array) / sizeof(array[0])
Nでもいいかもしれん。
Cなら要素数を別の引数で渡すこと以上の方法はないし、それが最も一般的だと思う。 C++なら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; }
182 :
176 :2006/10/09(月) 12:05:08
なるほど…Cでは引数として渡すしかないんですね。 実はC++はまだ勉強してないんですが、これを機に勉強してみようと思います。 みなさんご丁寧にありがとうございました!
>>182 Cなら配列と要素数を構造体にまとめる方法もある。
配列の要素数を知りたいという問題の解決には全くなっていないが、多少管理が楽になる?
>>151 がいいこといった。みんあ、よく聞いておけよ!
連想配列みたいなことをしたいのですが質問です。 以下コードです。 #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値を列挙型の値にできれば うまく連想配列に代入できるんですが、上のようなコードで 動くようにできないでしょうか。 よろしくお願いします。
訂正お願いします。 ×data[(key_type)key]=val_name; ○data[(key_type)key]=value; もうちょっとはっきり違う名前にすればよかったですが、 _keyは列挙型で、keyはstd::string型です。 よろしくお願いします。
>>185 key_typeのname, street, telなどといった列挙子は、
コンパイル時定数で、基本的に実行時に参照する方法はない。
C++は、どちらかというと何でも静的(コンパイル時)に解決するのが特徴。
どうしても実行時に文字列から列挙子を取り出したければ、
std::map<std::string, key_type>を使えば何とかなるだろうが、
だったら、初めからそのdataをstd::map<std::string, std::string>にすればいいだろということになるわけで。
std::map<std::string, std::string>
>>187 >>188 std::map検索してみました。
連想配列みたいなことができそうですね。
ありがとうございました。
まあvectorでも大きめに取っておいて、push_heap()などのアルゴリズムを 使って、中にはstd::pair<std::string, std::string>を入れておけばそこそこの 速度は出るが。
うわっごめん std::search_heap()ってalgorithmにはないのね。 素直にstd::sort掛けてからstd::binary_search()使うしかないか。
Loki::AssocVectorという手もある。
>>193 それ良さそうだね。今std::mapと、std::pairをぶち込んだstd::vectorを
作って比較したら、std::mapの方がstd::vectorのstd::lowerbound()を
使ったバージョンより2倍速かった。自分の環境でですが。
for(double t=0;t<100;t+=0.1) { ///// } このようなforループで、変数tを増加させているのですが、 途中でtの値を出力すると、 10.000000000018849 のように、小さな誤差が蓄積しています。 割り算とかはではなく、単純な足し算のみしかしていないのですが、 このような誤差はどこから来るのでしょうか?
0.1 を有限桁数の二進数で厳密に表現することができないから。 それにしても誤差が大きいな。こっちだと 10 に対応するのは 9.9999999999999805。 理論的には 0.1 を有限桁数の二進数で表したときの誤差が 1e-16 くらいで、 これを 10/0.1 = 100 回くらい足すから 1e-14 くらいの誤差になるはずだけど。 こっちの結果はそれに適合してるんだけどなあ。
なにか誤差を蓄積しない方法はないでしょうか? for(double t=0;t<1000;t+=1) { ///// } とかなら、誤差が蓄積しないのでしょうか?
>>197 基本的に浮動小数は誤差が入ると思え。
ループ回数が重要ならループ変数は必ず整数にするのが原則。
ただし、
>>197 の例だと(おそらく)誤差は全く出ない。
詳しくは浮動小数の表現(IEEE754方式)を調べるべし。
windowsのマルチスレッド、排他制御についてなのですが、 こちらでも良かったでしょうか。 スレッド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); //いろんな処理 } 説明がくどくてすみません。 そもそもクリティカルセッションの話じゃないんでしょうか。 よろしくお願いします。
1.マルチスレッドプログラミング相談室に行く 2.Win32API質問箱に行く 3.最高にド低脳な発言してください in ム板に行く
クリティカルセクションだし
セマフォでも使えば?
>>200 スレッドご紹介ありがとうございます。
前に専門スレいったことあるのですが、初心者スレ行けって
いわれたこがあったりしたので難しいです。(汗
移動しようと思いましたが回答いただけたので、
今回はすみませんがよろしくお願いします。
>>201 ,202
クリティカルセッションじゃダメですか。
セマフォじゃないのですが考えてみました。
グローバル変数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それぞれ、どのような処理が必要かヒントいただけないでしょうか。
セマフォが難しいなら、ミューテックスを使えばいいじゃない
>>204 Section
↑これなんて発音するか知ってる?
セッション
セシーチオン
あれれ、
クリティカルセッション ×
クリティカルセクション ○
でしたか。はずかしい。
ネットで検索してるときに、脳内で変換して
クリティカルセッションでもひっかかるので、
ごちゃごちゃにしてました。
>>205 お互いに排除する相互排除するサンプルとか見かけるんですが、
今回みたいにAが一方的に他を排除するっていうのが、どうなんでしょうか。
ミューテックスも勉強して考えて見ますが、掃き溜めレベルの僕としては
Sleepを使うのに気づいたのは奇跡でした。
>>202 ミューテックス調べてみました。
一度にひとつのスレッドしか動かせないみたいなんですが、
今回の場合Aのときはひとつで動かしたいのですが、B,Cは同時に動くのちょっと
違うでしょうか。
違います
取ってすぐ戻せ
void thread_A(void){ WaitForSingleObject(hMutex,INFINITE); while(1){ //いろんな処理 } ReleaseMutex(hMutex); } void thread_B(void){ //取ってすぐ戻す WaitForSingleObject(hMutex,INFINITE); ReleaseMutex(hMutex); while(1){ //いろんな処理 } } //スレッドCも同様 これで大丈夫と思うのですが、きちんと処理できてますでしょうか? linuxでいうlock,unlockでもできそうな気がしますが、同じようなものでしょうか。
OS限定されるけど、 A は EntrerCriticalSection() / LeaveCriticalSection() して B,C は TryEnterCriticalSection() しちゃダメ?
ひどいなそりゃ
>>204 ヒント。
最大カウント2のセマフォを作る。
A は2回待ってすることしたら2つ手放す。
B と C は1回待ってすることしたら1つ手放す。
JavaやってからC++やると C++ってオブジェクト変数の宣言だけでインスタンス化されるのが気持ち悪い。
199 の条件に A が待ち状態になってはならないという制約はない。 というか A が仕事している間 B、C を停止させる必要がある以上それは必須だろ。
>>214 ありがとうございます。
なるほどです。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も同様
処理の順番ですが、下記で当たってますでしょうか。(続く)
・セマフォは2あるので、@、Aを通ってスレッドAが実行->セマフォ2開放されます
・セマフォ2あるので、スレッドB,Cが実行
2順目なんですが、
・スレッドB,Cのどちらかの処理が終わって、ひとつセマフォが開放されて@を通過。
・次に処理が遅れているB,Cのどちらかの処理が終わって、ひとつセマフォが開放されてAを通過。
・スレッドAが実行される。
っていうループになりますでしょうか。
セマフォの基本がまだわかっていないので、スレッドBがReleaseSemaphoreしたと
セマフォが1残っているので、またスレッドBが実行されないかとか変なこと考えてしまいます。
この辺はwaitがキューで入っているとかそういうことなのかと思って調べてみます。
>>220 違う方法もあるんでしょうか。
よかったら、アドバイスよろしくお願いします。
処理の順番が「当たってる」とかいう発想が信じらられん。当てずっぽうかよ。
>>222 たしかに、動いているの確認すればいいですが、
理解力に自身がないので、これであっているのか心配でして。。。
223のようなやつが、初心者にどんどん抜かれていくんだよな。 かわいそう。
つーか、そもそも
>>204 でOK。
1sec(あるいはいくらか)のループが気に入らなければ
>>213 でOK。
何が気に入らんの?
>>226 初心者なので、せっかくヒントもいただいたので、
セマフォも勉強したいと思いまして。
現状ですが悪戦苦闘中でして、下記のコードになりました。
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も同様
>>227 の続きです。
Sleep入れると大丈夫ですが、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つ開放しました
<繰り返しです。>
すみません。コード改行入れているときに消してしまったところあります。 ごちゃごちゃしてすみません。 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も同様
thread_B()のSleepの位置が違うし、 眠くてもう脳がだめみたいです。ほんとごめんなさい。 あと、割り込んでなかったみたいです。 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つ開放しました
>>230 きみは 216 のヒントを理解する能力があった。
217 は 216 のヒントを理解する能力がなかった。
ただそれだけのことなんで気にしなくてもいい。
カウント2のセマフォを使う必然性なんてどこにもないよ。
やりたいことをまとめると、 ・スレッドAが実行中は、B・Cは待機する ・スレッドBあるいはCが実行中は、Aは待機する ・スレッドB・Cは同時に実行できる ってことか? だったらカウント2のセマフォが必要だね。
>>232 ありがとうございます。
>>233 セマフォっぽくないですが、ミューテックスのときみたいに、
取ってすぐ戻すと同じ動きになりそうですね。
って実はネットに書いてありました。
>>234 はい、やりたいことそれです。
いろんな方法一気に覚えられてよかったです。
ありがとうございました。
>>235 >>234 の仕様だとすると、
>>229 のコードでは駄目だよ。
Aが連続してセマフォを獲得する保証は無く、Aがひとつ、Bがひとつ獲得した状態で
Cが待ち状態になる場合もある。それでいいならいいんだけど・・・。
>>236 Sleep無しで実行したときなのですが、
>>230 の結果を見ると
Aがひとつ、Cがひとつ獲得した状態で
Bが待ち状態になっているようなんですが。
Aがひとつ、Bがひとつ、Cが待ちというのもあると思います。
>Aが連続してセマフォを獲得する保証は無く
Aが連続してセマフォを獲得する保証は、
どのようにすればよいでしょうか。
Aが連続で取れるように、B,CにSleepなど何か
処理をするということでしょうか?
>>237 Windowsに詳しくないのでこれだという解決策は示せませんが、この問題は
「read write lock問題」として有名です。
・誰も読んでないときは書ける
・誰かが書いてるときは書き終わるまで読めない
・誰かが読んでいるときは読み終わるまで書けない
・誰かが読んでいても読める
今回の例ではAが書き込みスレッド、B,Cが読み取りスレッドとして対応させると
わかると思います。
windows read write lock
windows read write synchronization
などのkeywordで検索すれば、根本的な解決策が見つかるはずです。
>>238 そういうことでしたか。
「Aがひとつ、Bがひとつ獲得した状態で Cが待ち状態になる場合」
はAがひとつ取っても、まだ待機している状態なので、
A,C待機、Bが実行という場合もありますね。
ただ、
>>234 には矛盾して無いので、
今回は、これもあって大丈夫ということにしたいと思います。
まとめますと、変更無いですが、
・スレッドAが実行中は、B・Cは待機する
・スレッドBあるいはCが実行中は、Aは待機する
・スレッドB・Cは同時に実行できる(片方だけのときもある)
ということになると思います。
「read write lock問題」さっそく勉強してみます。
ありがとうございました。
240 :
デフォルトの名無しさん :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); }
struct a data[3];
242 :
240 :2006/10/19(木) 21:13:34
あ、できました。ありがとうございます。 でも何でですか?
243 :
デフォルトの名無しさん :2006/10/19(木) 21:22:51
>>240 struct a data[2];
data[0]: 先頭の構造体a
data[1]: 二番目の構造体a
data[2]: 三番目の構造体a <-定義されていない
配列の章をまた初めから読み返してみろ
245 :
240 :2006/10/19(木) 21:28:02
ああ、わかりました。0から始まるんですね。 すいません。おさわがせしました。
246 :
デフォルトの名無しさん :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: 宣言の構文エラー とでてコンパイルできません…
247 :
デフォルトの名無しさん :2006/10/19(木) 21:40:33
248 :
デフォルトの名無しさん :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; }
君はVCLをもっているのか?
250 :
デフォルトの名無しさん :2006/10/20(金) 00:00:25
2時間前くらいからCを勉強し始めたんですが、うまくいきません。 半径を入力して球の体積と面積を求めるってやつなんですけど、 入力が反映されなくて。 #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); }
>>250 そのプログラムを動かし、たとえば1と入力するとどうなる?
4/3=1
253 :
デフォルトの名無しさん :2006/10/20(金) 00:36:25
>>253 S = とか V = とか表示されねーのか。そりゃ不思議だな。
うまくいかない、じゃなくて、何を期待してどういう結果になったのか書くべし。 それ以前に、勉強開始たった2時間半程度で人に聞くのはどうかと。 その時点では分からないことだらけで当然だろう。 とりあえずは参考書などで基本事項を一通り勉強したら? %f → %lf
>>255 どうもありがとうございます。
参考書の例題だったんですが、
書いてある通りやってもうまくいかなくて。
257 :
デフォルトの名無しさん :2006/10/20(金) 01:02:34
関数の中で関数別の関数呼んで、またそのなかで別の関数を…っていうふうに 階層が深くなってるとき、下のほうで起こったエラーはどこで処理するのがいいんですか。 一番下なのか…?はたまた上までエラーコード引っ張っていって一番上なのか…? また上まで引っ張っていった場合、その途中の関数で起こったエラーコードとかぶらないようにするために 考えると、エラーコードの種類がすごく肥大化してしまったんですけど、 こういうものなんでしょうか?
>>257 C では、そういうもの。
そういう問題への対策が、最近の言語に備わっている例外処理機構。
C++ にもある。
>>258 なるほど。そういうものなんですか。
ありがとうございます。
後例外処理なんですが、実はあまり理解していなくて、try catchする(c++)のと、戻り値判定(c)するのと
どう違うのかと疑問に思ってました。例外処理のメリットというか。。
上記のような問題を解決する機構が例外というのはどういうことなんでしょうか。
何かキーワードだけでも教えていただけたらできるだけ自分で調べてみます。。
try { func1 +func2-1 +func3 --(A) +func2-2 --(B) } catch (...) { // エラーきた --(C) } のように奥の func3 で例外を発行すると、func1 の途中部分であっても きれいに脱出して(デストラクタの面倒は見て) (C) に到達できる。 この例の場合、(B) は実行されない
>>260 上まで引っ張っていかなくてもいいってこと…ですよね?
なるほどそれだとたしかにエラー処理が綺麗に書けそうな気がします。
スレのほうも熟読してみます!ありがとうございました。
>>270 なるほど!これはわかりやすいです。
これは便利なんですね…
いままでせっかくc++のコンパイラ使ってたのに全部戻り値判定で引っ張っていたのが
すごく時間と労力を無駄にしてたきがしてきました…大げさかもしれませんがw
こんな機能ならぜひ例外処理を勉強してうまく使っていくようにしたいとおもいました。
どうもありがとうございました。
基本的に例外処理は便利で有意義なもの。 がんがん使え。 が、C++に限っては、性能を気にしだすと封印せざるを得なくなる諸刃の刃。 でもやっぱりがんがん使え。 使い慣れないとデストラクタ周りで戸惑ったりするので、経験値稼ぐためにもばんばん使え。 デメリットのことは後で考えればよい。
はい。ガンガン使っていくようにしたいです。 何かのプログラムの本で、便利な機能は変なこだわりは捨ててどんどん使ったほうがいいって書いてたのを 読んだことがことがあります。 あとご指摘のデストラクタとの絡みのところもしっかり勉強したいと思います。
へー、諸刃の刃なんて言葉も一応辞書に載ってるんだ。 普通は諸刃の剣だと思ってたけど。
指が滑ったんだ。 ケツの穴の小さいこというなよ。 刺さらないじゃないか。
つーか、今まで「もろはのけん」だと思ってたよ。 ついでに正しい知識が身についてよかった。 ・・・・吉野家コピペくらいでしか使わないかもしれないが。
うかつなこと書くなよ 剣がケツの穴に刺さったところ想像しちゃったじゃないか
C++で例外と入ったら、性能よりも例外安全のほうがよっぽど心配になる。
そいつもいちいちごもっとも。
質問失礼します。 stringに入っている文字列を char* に変換したいのですが 良い知恵はありますでしょうか。 const char* では無く char* にしたいのです。 今のところ思いつくのは、自前で char* の領域を確保して そこに c_str() の内容をコピーすれば問題は無いかと思うのですが せっかく便利なクラスがあるのに、何だか冗長な気がします。 一応調べた限りでは const_cast という物があるようですが const_castした文字列にアクセスした場合の動作は未定義という 記述がされていたりするのでそれはちょっと無いかな、と思います。
>>271 std::vector<char>でも使えば?
const_castは古いライブラリの機能を無理やり使いたい時とかのためだけに用意されてる様なもん。 基本的に使っちゃ駄目。 で、const_castを止めておきながら、こんなコードを薦めるのは激しくナニなんだが、 std::stringは添え字演算子が使える。 ので、一応 std::string str = "nullpo"; char* p = &str[0]; みたいな書き方はできないわけじゃない。 やっちゃ駄目よ? 問題起こしたところも見たことは無いけど。
>>271 >stringに入っている文字列を char* に変換したいのですが
これが何を言っているかはっきりしないんだけど、
char *型の引数を要求するけど実際には渡した領域を更新することはない、
という関数に渡すというような使い方なら、const_castで問題ないと思う。
>const_castした文字列にアクセスした場合の動作は未定義
参照するだけなら問題ないんじゃなかったっけ?
文字列を更新する目的で char*型にしたいといっているなら、
自分で更新可能な領域にコピーするしかない。
275 :
271 :2006/10/21(土) 03:05:01
>272-274 参考になります。 今回の場合、実際は更新しない文字列だったので >274さんの言う通りconst_cast使っても問題はあまり無さそうです。 ただ、更新する文字列のことも考えると 自前で確保する方法も覚えて損はなさそうですね。 std::vector はまだ使った事がありませんが覚えておきます。 ありがとうございました。
>>273 そのうちstd::vector同様にstd::basic_stringでも認められるという噂を聞いたことがあるんだ。
>>276 いや、あれは実際に採用されるかどうかはまだ怪しい話。
このレベルで「はきだめ」なのか…orz ここ以下のおいらはどこに行けばいい?
まぁ、ここは下級者の質問をネタに半可通が自爆するスレだからこそ掃き溜めというわけだからな。
int function(const int x) と int function(int x) の違いを教えてください。
>>281 前者はxがconstだから関数の中で代入できない
関数に渡す値は非constでもOK
#include <iostream> using 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; }
284 :
283 :2006/10/23(月) 17:24:23
配列を関数で引数として使う場合は実引数として配列名を渡しますよね でも配列名は先頭要素のアドレスを表しますよね。 関数のdouble avg(int t[])の仮引数、t[]に先頭要素のアドレスを渡すことで 何で上のソースが動くのですか? もし配列の各要素の値が渡されるとしたなら納得できるのですが、 アドレスが渡されるのにこの関数が動く理由がわかりません・・・ どなたか納得できるように説明していただけませんか?
>284 C言語の配列がメモリにどう配置されるかを学ぶと良い Cの配列は要素[0]を先頭に 連続したメモリ領域に配置される 例えば char s[255]; と書いた場合 s[0] のアドレスが 54322 バイト目なら s[1] のアドレスは 54323 バイト目になる char は1バイトだから1バイト毎 short なら2バイトだから2バイト毎な だから配列の先頭要素のアドレスが判れば その先の要素のアドレスも判る
286 :
284 :2006/10/23(月) 20:29:26
>>285 詳しい説明ありがとうございます。
何となくですが分かりました。
もうちょっと詳しく勉強してみます
関数を使う立場からすれば、大きさの分かっている配列を渡しているが 渡された立場からみると、配列の大きさがわからない。 で、範囲外のアクセスでバグる と。
そこでテンプレートです。
#include <string.h> と #include <string> と #include <cstring> の違いを教えてください。 cmath等と同様、cstringが最新のC++にあっているのかと思っていたのですが、 bcc32でcstringでコンパイルできたものがvc7ではstringにしないと、 二項演算子 '!=: 型 'std::string' の左オペランドを扱う演算子が見つかりません (または変換できません) というエラーが出てコンパイルできませんでした。時期的には、vc7の方が新しいはずなのですが・・・
>>289 そもそも何がしたいんだ?
Cの<string.h>のC++版が<cstring>で、
strlenとかstrcpyなどの関数を使用するときにインクルードする。
C++での<string>はstd::stringという文字列クラスを扱うときに用いる。
>289 ・C言語の "string.h" 文字列操作の為のライブラリ ・C++ の <string> 文字列クラス std::string を使う為のライブラリ ・C++ の <cstring> C言語の "string.h" 風味のライブラリ C言語の str〜 系の関数を使いたいなら cstring をインクルードする もしくは、ソースには"string.h" と書いて 大概の処理系にある C言語としてコンパイルするオプション(や拡張子 .c) でコンパイルすれば良い
#include <iostream> using 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++; }
293 :
292 :2006/10/24(火) 17:02:11
staticをつけると、そのローカル変数はグローバル変数と同じ記憶寿命を持つんですよね? 同じ記憶寿命を持っても上のコードでfunc()関数が呼び出される度にstatic int c = 0;と初期化しているのに何故実行結果では 0,1,2,3,4と増えていくのでしょうか? staticをつけて初期化されるのは一回目だけということでしょうか?
その通り 「初期化」は最初だけ 毎回0にしたければ「代入」をするべし
>>294 一つ謎がとけました
ありがとうございます
まだまだ謎がありそうだけど、 あなたを犯人です。
>296 中国語でおk
スレ違いかと思いますが、どこで聞けばいいのかもわからないアフォです。どうか助けてください。
普段からコンパイラに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で似たような症状を探しても見つけられないし、八方塞がりです。
どなたか解決法のわかる方、いらっしゃいませんでしょうか?
GrWinとやらはダウンロードしてないがlibファイルは入ってなかったか? 入ってたとしたらそれをリンクすればいけるかもしれない
すいません教えて下さい。 ClassDef のオブジェクトを他の関数らで使いまわしたいのです。 その場合、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 }
シングルトンパターンだな. new 使わない微妙なやつだけど、参照返しで class ClassDef { private: ClassDef() {} ~ClassDef() {} public: static ClassDef& GetObj() { static ClassDef body; return body; } // その他公開メソッド }; ////// 利用側 func1() { ClassDef& cObj = ClassDef::GetObj(); } func2() { ClassDef& cObj = ClassDef::GetObj(); }
以下で、どれが一番清く正しく美しいですか? お兄ちゃんはどんな風に書く? int main(void) {} int main() {} main(void) {} main() {}
>>302 Cならばint main(void) {}
C++ならばint main() {}
ちょっとしたテストコードは main() { で書いてる。 でもある程度長くなりそうなら 値返すだけでなくコマンド引数も受け取る。
ああ、コマンド引数は考えなくてもいいですけど。 そっか、Cではint main(void)が厳密なんですね? C++ではvoidが省略できるみたいな?
C++ は main() って書くと int main() 扱いじゃなかったか? んで暗黙に return 0; が書かれたことになるって仕様だったような。
>>306 暗黙のintはなくなった。2文目は正しい。
308 :
302 :2006/10/31(火) 22:01:45
自分の得たい答えは得られました。 ありがとうございました。
iostreamで質問があります。 文字列を入力するとき string s; cin >> s; とすると、長さ1以上の場合は問題ないのですが 長さ0の文字列が入力できません。 エンターキーだけ押せば長さ0の文字列と見なして欲しいのですが、 どうすればいいでしょうか。
getline(cin,s)
311 :
309 :2006/11/02(木) 17:12:16
312 :
デフォルトの名無しさん :2006/11/13(月) 00:50:01
初学者の下らない質問ですがお許しください。 VC.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++以前の問題ですが、どうぞアドバイスを下さい。お願いします。
>>312 「スタート→プログラム→Visual C++ 2005 Express Edition
→Visual Studio Tools→Visual Studio 2005 コマンド プロンプト」
で必要な環境変数が設定された状態のコマンドプロンプトが起動できる。
その例外処理がなんたらというのはエラーではなく警告。一応実行ファイルは作られている。
そしてその警告文には、その後に「/EHsc を指定してください。」と書いてあるはずだ。そのとおりにしろ。
>>312 エラーメッセージはちゃんと全部読め。
cl /? を見ろ。オンラインマニュアルを読め。
INCLUDEはvcvars32.batとか使えば勝手に設定されるからそっち使えよ。 でもってアンワイ(ryに関しては warning って書いてあるでしょ? エラーじゃなくて警告だから気にしないのなら気にしなくていいし、 気になるんなら警告に書いてある通りにオプションつけろ。
いまだにデフォルトになってなかったのか。なんでだろうな?
vcvars32.batに SET CL=/EHsc の行を加えておくことを推奨
int* p; と int *p; って同じもの?
>>319 同じ。だが
int *p, *q;
と
int* p, q;
は違うから初心者は注意するように。
どう違うんだろう int *p, *q; は int *p; int *q; で int* p, q; は int *p; int q; であってる?
あってる
ありがとう
ディレクトリの中を*を含んだ文字で検索するプログラム作っています。 windowsだと _findfirst,_findnextがあって、*を含んだ検索が出来ます。 linuxだと opendir,readdirがありますが、*を含んだ検索が出来ません。 そこで質問なんですが、 struct dirent *dir;とすると、 readdirを読んで、dir->name比較する関数で毎回調べて、 繰り返さないといけないでしょうか? なにか他に簡単な方法あるとよいのですが。 よろしくお願いします。
まあ普通にreaddir+fnmatchで大した手間にはならないと思うけど 他にやり方があるのかは知らない。
>>325 実は、_findfirst,_findnextで作ってしまいまして。
コンパイルできないと思ったら、linuxだからということがわかりました。
似たような関数があればー。と思ったのですが。
確かに、そんなに大変ではないかもしれないです。
ありがとうございました。
C++で型をコンパイル時に判別する方法ってどうやれば良いのでしょうか。 例えば template <T> hogehoge(T val){
すみません、途中で書き込んでしまった・・・。 C++で型をコンパイル時に判別する方法ってどうやれば良いのでしょうか。 例えば 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); } とすればできますが、それだとコード量がふくらんでしまいます。他に良い方法ありますか?
>>326 つ[popen("/bin/ls *", "r")]
>>328 BoostにMPLとかtype_traitsとかいろいろあるよ。
まあこんなところで勧めていいかわからないが。
質問です。 今までファイルからデータをストリームとして呼んでいたのですが、ファイルの内容を簡易的に隠蔽したくて、 ヘッダファイルにchar filedata[] = "(ファイルの内容)"; として、ソースに埋め込んだのですが、これをファイルからの読み込みと同じように、ストリームとして読み込み処理を行いたいのです。 char配列をストリームにする方法ってあるのでしょうか。
つstd::istringstream <sstream>
vector<T>ってTがbool型以外の時はメモリが連続していると聞いたのですが、 vector<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++だとメモリが連続していないのでしょうか?
>>336 × (float *)&vec[i];
○ &(*vec)[i]
無茶なキャストした時点でなんかおかしいって気づけよ。
>>337 gcc4.0だとこれでも上手くいくのですが・・・・。
>>338 未定義動作。
>>339 そのページを見て vector を new するとは、本末転倒。
342 :
336 :2006/11/18(土) 23:11:33
>>336 あ、分かりました。
float *tmp = (float *)&vec[i];
でなくて
float *tmp = &(*vec)[i];
とすべきだったんですね。vec[i]ではvector<float>の配列としてi番目のvector<float>オブジェクトにアクセスする意味になってしまう・・・。
寝ぼけてました。すみません。
意味を持つのはvec[0]だけ。 vec[1]〜はメモリのどこを指しているのかわからない。
どこを指してるかはわかるだろ
要するにvec[1]をアクセスした時点で未定義動作だろ
>>344 危険いっぱいの所を指している、という事を言いたかっただけなんじゃまいか
配列の要素を指していないポインタに対して +/- した時点で未定義動作。 p[i] は (*(p+i)) と定義されているので、 vec[0] も未定義。
vec[0]は*vecなので、vector<float>を指しているだろ。 何言ってんの?
× vec[0]は*vec ○ vec[0]は*(vec+0)
>>350 本気で信じてるのか?規格書のどこに書いてあるか出せよ。
>>348 の1行目が本当だとしても
NULLは0とは限らないがNULLが0でないコンパイラなんてまずない
ってのと一緒で、ほとんどのコンパイラじゃ問題にならないんだよな?
C++ では 5.7p5 に
>>348 の言ってることは書いてあるが、
その前に 5.7p4 で配列じゃないオブジェクトを指すポインタは
要素数1の配列と同等に扱うとなっているので、問題ない。
5.7p4 を読まずに 5.7p5 だけ読んだんだろう。
C では 6.5.6p7, p8 に同様のことが書いてある。
いやいや、そんな些末な納得の仕方よりも、規格書で該当する部分を 出してもらえばそれで完全に決着するから。
355 :
348 :2006/11/18(土) 23:56:46
正直スマンカッタ
linuxなんですが質問です。 ただ単にファイルをコピーするプログラムと lsコマンドを自作したのですが、 もし、lsコマンドするフォルダに書き込み中のファイルがあったら、 「書き込み中」を表示したり、違う処理をしたいのですが、 書き込み中か調べる方法ってありますでしょうか? 考えてみたのですが ■lsコマンド側で解決方法 sleepを入れて容量の増減を調べる。 (これだと返ってくるまで、すごい時間が掛かってしまいます。) ■書き込むプログラム側の解決方法 ・元のファイルをA,コピー先のファイルをA'とすると 1、A'を作ります 2、ファイルディスクリプタ指定してA'をlockします 3、書き込みします。 4、lock解除 ・何かCOPYコマンドにオプション付けるとコピーが終わるまで 読めなくなるとないでしょうか。
>>357 357です。
なんか質問の内容がぼけてしまってますね。
ちょっと質問内容変更させてください。
書き込むプログラムは、自分で作ったもので
無い場合(lockしてない場合)でも書き込み中か
知る方法ってあるでしょうか?
sleep使って調べると時間かかってします。
「書き込み中」を、「コピープログラムがコピーを完了していない」状態と考えていいのかな? それならば、コピー完了を知る手段は一般的にはないと思う。 解決策としては、こんなもんかなぁ…… ・コピー元ファイルのサイズを知り、コピー先ファイルのサイズと較べる。 ・コピー対象ファイルの終端の特徴を知り、コピー先ファイルの終端がその特徴に一致するか調べる。 #汎用性はないが、コピー対象が特定のフォーマットに従っているならそれなりに実用的か。 ・コピープログラムに完了を通知してもらう。 #通知方法は色々考えられる。signalでもいいし、ファイルでもipcでもいいだろう。 ・コピープログラムに一旦別の名前でコピーしてもらい、コピー完了後に目的の名前に変えてもらう。
>>359 何通りもありがとうございます!
どれもすごい参考になりました。
上2つは、初心者の僕でもすぐにできそうです。
signalも勉強してみます。
どうして static 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) の方が正しいの?
>>361 誰がそんなことを言ってたかは知らんが、その範囲を見ただけでは
上が間違っているとは思えないが。
下のほうは、size_tが64bitのような環境ではかえって無駄なことをしているだけのように思える。
cppll って、技術コミュニティとしてはもう崩壊してるよね。 C/C++ コミュニティで「昔の C コンパイラでも void を書くか書かないで・・・」に 突っ込みが入らないのは異常だろ。
>>362 そりゃ実装依存の話であって、誰が悪いかっつったら断りなしにsize_tを64ビット化した環境のが悪い気が。
もっとも、size_tは基本sizeofの返り値用の型だし、要素数表現に使われてるのはちょっと微妙なわけだが。
size_tを要素数や文字列長に使うのは自然だと思うけど。 無符号というのも意味的にスッキリしてるし。 ビット長はその処理系で必要な長さになってるんだから無駄と言うのも変な話だ。
例えばmallocの引数型がsize_tなのは、 そのままsizeof演算子の結果に配慮したからで、 これを要素数倍するのは構わないのだが、 要素数を扱う型にくくってしまうのは、少々短絡的。 文字列長に使うのは、charがなんだかんだで バイト単位と認められてしまってるところから。 一番悪いのはlengthof演算子だのlength_tだのを 用意しなかったCそのものだと思われるが、 C++に世代が移ってループもイテレータで回す昨今、激しくどうでもいい。 俺も上のようなことは正直こじつけそのもので、自分でもまったく信じてない。 最近だとptr_diffなんかも64ビット化してるんで、 細かい目で見るとポインタの加減算もコストが嵩んでる。 無視するのがいいのだろうが、世の中ままならぬ。
そういやC99ではどうなん?
370 :
デフォルトの名無しさん :2007/01/06(土) 18:19:48
boolは1バイト消費するのですか?
かもしれないし4バイトかもしれない
>372 はぁ?
>>373 std::vector<bool>のことを言っているんだろう
vector<bool> は領域節約のため特殊化する必要があるが それは 1 bit を保証するものではない。
>>376 23.2.5 Class vector<bool> [lib.vector.bool]
1 To optimize space allocation, a specialization of vector for bool elements is provided
378 :
デフォルトの名無しさん :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; } } こうすると通ります。なぜでしょうか?
func(int v) : data(v) {}のところはFunc(〜のtypoです
struct Func { int data; Func(int v) : data(v) {} int operator() (int i) { return data*i; } } まだ間違ってました。
うあれ?TurboC++です。もう一度やってみます
gcc3.4.2なら通るぞ。
すみません、再構築したら通りました・・・・
makefileをちゃんと書いてないんじゃないの? ヘッダとの依存性とかを
C++で vector<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; の部分の機能がわからないのでどなたか解説してください
dicというコンテナからcounter型のvectorを生成し、 それをcmpを比較関数としてソート ソート結果を表示
389 :
デフォルトの名無しさん :2007/03/02(金) 11:50:48
1.0-1.0が0にならない理由を教えてくだすれ
0になるだろ
391 :
デフォルトの名無しさん :2007/03/03(土) 00:45:07
ポインタで char *p; p = "ABC"; とした時の pは"ABC"を表すのですか? *pは何を表すのですか?
pは"ABC"の先頭アドレスをさす *pは'A'を表す
394 :
デフォルトの名無しさん :2007/03/04(日) 18:58:20
C言語系のサイトでよく見るんですが kitty on your lap とは何なのでしょうか? hello worldみたいなもの?
ぐぐっても…一番上には出てこないのか。 何番目かに引っかかる「ひざの上の同居人」ってゲームに そういうサブタイトルがついてたんだよ。 今では陳腐に見えるけど、当時はまだまだ新鮮なコンセプトで、 一部の猫耳好きから圧倒的な支持を受けた。
よく見るって…そんなの使ってるの一箇所だけだろ
さくら、ケロちゃんと同じくらいは使われてるんじゃね?
あのヲタクチックなサンプルコードさえなければ あそこは最高のサイトだと思うんだがな…
一昔前はプログラマ言ったらそんな奴らばかりだっただろ
今もだけどな
あっあありがとうございます。
404 :
デフォルトの名無しさん :2007/04/13(金) 09:12:41
nullと0の違いを教えてください
0はただのゼロだが、nullは「意味を持たない」という文脈で使われ、 その実体は必ずしもゼロではない 例えば大抵の処理系では int *p=null; と int *q=0; は等価だが、 場合によっては q はメモリの「ゼロ番地」を指しており、 実際に読み取ることができる、ということもありうる
とすると、大抵の処理系では、0番地とヌルポはどのようにして見分けているのですか?
>>404 CにもC++にもnullなんてものはない。
NULLのことなら、NULLが0なんじゃない。0がNULLなんだ。
>>405 いくら「はきだめ」でも、嘘はいくない。
>>404 C言語の定義によればどんなポインターの型にも特別な値、
すなわち 「ヌルポインター」が存在する。このヌルポインターは
他のどんなポ インターの値とも区別可能で、「いかなるオブジェクトや
関数へのポ インターと比較しても等しくなることがないことを
保証されている」。 すなわちアドレス演算子&を適用した結果が
ヌルポインターとなることもない。
C言語の定義によれば、ポインターを書くべきところに現れた定数0は、
コンパイル時にヌルポインターに変換される。すなわち初期化・代入・
比較をするときに左辺/右辺のどちらかにポインター型の変数か式が
現れたときは、コンパイラはもう一方の側の定数0がヌルポインター
を要求していることを理解し、適切なデータ型のヌルポインターの値
を産み出す。
C++Q&Aの2.24に class Vehicle{ public: virtual void startEngine()=0; vietual ~Vehicle(); }; Vehicle::~Vehicle(){} 「そこから導出される派生クラスではstartEngine()メンバ関数を提供してはいけない。」 とあるんですが、これは使うなって事ですか? 「提供してはいけない」っていう言葉の趣旨がわからんのですが。
多分 s/しては/しなくては/ ではないかと。
ですよね。 定義しないとエラーになるんで、これは一体・・・と思ってた所です。 訳者が監修扱いになってるんで、誤訳かなぁと思ってた所です。
デストラクタをvirtualにしないと駄目な理由がいまいちわかりません。
>>413 struct Base
{
// virtual ~Base() {}
};
struct Derived : Base
{
Derived() : p(malloc(100)) {}
~Derived() { free(p); }
private:
void* p;
};
{
Base* x = new Derived;
delete x;
}
そこでshared_ptrですよ、と惑わしてみる
416 :
デフォルトの名無しさん :2007/04/15(日) 08:19:41
動的束縛(アップキャスト)を使った状態でのdeleteが駄目って事ですか?
float x=0.1; exp(0.1*x)だとfloatなのにpow(0.1*x,2)だとdoubleになってしまうのは何故なのでしょうか? pow(float(0.1*x),2)とすれば、floatになってくれるのですが、expとpowで何が違うのでしょうか?
んなこたーない。 つーか、何を根拠にfloatだのdoubleだの言ってるんだ?
まずCかC++かはっきりさせろ
C++です。
で、根拠は?
cmathを使っている
ダメだこりゃ。
math.hを使え
なんでやねん。
>>417 0.1 * xは、0.1がdouble型だからxもdouble型へ昇格され、全体としてもdouble型になる。
expもpowもdouble型の引数を取るものが呼ばれるはず。
そうでないならコンパイラがおかしいはず。
そもそも418も指摘しているとおりで、417自身がどうやって調べたのかも怪しいが。
ついでにいくつか言うが、float型リテラルを作るには0.1fのようにfを後置しろ。
そんな関数スタイルのキャストでも(勿論Cスタイルのも)使うな。
ここではstatic_castを使え(Boostのimplicit_castもありだ)。
#include <windows.h> #include <stdio.h> void main() { double a; a = 2/6; printf("%f\n", a); } VC6にて上のように単純に2÷6を計算したら0が出力されます。 0.33333・・・を出したいのですがどうすればいいのでしょうか?
共用体が有効なときってあるの? 活用方法が見出せない。
>>430 確かに。職業PGだが、BigEndianとLittleEndianが混在した状況で
共用体が必要な場面は少ないと思う。実際使わないし。
組み込み系ならBEかLEかははっきりしているので
union X {
long a;
char b[sizeof(long)];
};
とかやることがあるかも。
領域をケチりたい場合にはよく使ったが、 最近はメモリに気を使う必要性が減ったから、 わざわざそういうことはしなくなったな。
union REGS は昔良く使われてたな。 今は struct sockaddr 関係で使われてたような。 sin_addrが内部の何かのdefineだった気がする。実装依存だろうけど。
>>430 であれば、使わなければよい。
実例としては、例えば「ICMPヘッダ union」でググるよろし。
435 :
デフォルトの名無しさん :2007/04/21(土) 18:03:25
freeにNULLを渡した場合の挙動は仕様として決まっていますか? また、一般的な処理系ではどうなっているでしょうか。
>435 標準CではfreeにNULLを渡したときは何もしない(だから渡してもよい) ことが保証されている。
437 :
デフォルトの名無しさん :2007/04/30(月) 09:05:06
32bit Windowsと64bit Windows両方で共通のコードを書きたいのですが、 int、doubleなど同じ変数型でも変数の桁数、精度がそれぞれで違うと思いますが、 これらの違いの一覧はどこかで公開されているのでしょうか? これらはOS依存なのでしょうか?それともコンパイラ依存なのでしょうか?
intってコンピュータが64bitなら64bitになるというものじゃないのですか?
IP64,LP64,LLP64とかでググレ
if文の条件としてキーボードでaが入力されたら〜ということを表したいのですが、 char c; if((c=getchar())==a) と言ったものを考えたのですが、 char c; if((c=getchar())=='a') に直すべきでしょうか。 非常に稚拙な質問ですが、よくわからないので助けてください。
>>441 正しくコンパイルできて動くほうを選べ。
>>442 ごめんなさい、今出先なのでコンパイルできる環境がないもので・・・。
どうか教えていただけませんか。
>>443 教えるも何も
>>441 からでは判別不能。エスパーの召喚が必要だ。
コンパイルできない環境で知る必要も無いだろう。帰ってからゆっくり試せ。
>441 前者は、入力した文字を 変数 a の内容と比較している。 後者は、入力した文字が a という文字かどうかを判定している。 さあ、選べ。
>441 ついでにgetchar()の戻り値、文字リテラルの型はintだからchar c;ではなくint c; とすべき
448 :
447 :2007/05/01(火) 07:42:04
>文字リテラルの型はint Cの場合ね。
449 :
デフォルトの名無しさん :2007/05/06(日) 19:11:31
下記のファイルの3列目を読み込んで配列に格納したいです。 ----- 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 でも構いません。よろしくお願いします。
宿題は宿題スレへ
>>449 適当でいいのなら fgets で 3 列目まで読み込んでから
sscanf(buf, "%d,%d,%d,%d", &a[0], &a[1], &a[2], &a[3]);
みたいに。
真面目にやるなら strtok とか、コンマを strchr で探して切り捨てたりしてから、
atoi とか。
一行読み込むごとに sscanf(buf, "%d,%d,%d,%d", &dummy, &dummy, &a[i], &dummy); でいいじゃん
普通に %*d つかえよw
あ、三列目ってそっちか。
455 :
449 :2007/05/06(日) 20:47:58
>>451-454 とくに宿題ではないのでここに書かせてもらってます。
型は決まっているのでsscanfでできました。
ありがとうございました。
>>452 で、3カラム目だけ得る目的なのに4カラム目を空読みする理由は?
#"%*d,%*d,%d"で充分。
>>457 上につられたってことにしといてください
459 :
デフォルトの名無しさん :2007/05/07(月) 23:31:13
#include <stdio.h> #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回ずつ呼びだされるのでしょうか?
見え見えの落とし穴にはまるあなたは きっと仲間内では天然キャラとして愛される存在なのでしょう
>>459 漏れも初心者なんで、あってるかどうかわからないけど。
#define JIJYO(x) ((x)*(x))
((i++)*(i++)) に展開されるんじゃないかな。
マクロを教える時に必ず注意される所だと思うが。
463 :
459 :2007/05/08(火) 02:02:18
>>461 なるほど……。
ありがとうございました。
C++について。 問題文: 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
>>464 for (int x=100;x<=200;x++)
{
cout<<(x/100.0)<<" "<<3*(x/100.0)*(x/100.0)<<"\n";
}
さすが掃き溜め。
C++厨死ね
>>464 丸投げしといて、回答があれば丸写ししようなどと考えてる (らしい) 奴が
>ご教授願いたく
などとふざけた台詞を吐くお陰で、この単語に脊髄反射してしまう奴が
後を絶たないんじゃないかと思うようになって来た。
すいません・・・二重ポインタ**の意味がどうしてもわかりません・・・ 多次元配列がどうのこうのって書いてあったけど・・・
ありがとうございました.二重ポインタで検索してました.
ぬるぽいんた
がっいんた
475 :
デフォルトの名無しさん :2007/06/07(木) 11:04:30
ropeってどんな時に使うのですか? いまいち利点が分からないのですが。
477 :
デフォルトの名無しさん :2007/06/07(木) 12:04:02
gccで作成した静的ライブラリとg++で作成したオブジェクトファイルを リンクさせようとすると undefined reference to **** のようになります。 ライブラリの方はgccでしかコンパイルがうまく通らないのですが、 今後作成するプログラムはC++で書くため、gccでコンパイルしたものと g++でコンパイルしたものをうまくリンクしたいのですが 何かよい解決策はないでしょうか?
>>477 「名前マングル」でググるよろし。
ライブラリのヘッダに手を入れていいなら
プロトタイプ宣言の先頭に
#ifdef __cplusplus
extern "C" {
#endif
最後に
#ifdef __cplusplus
}
#endif
を入れる。
while(1) { 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の所が延々流れるのですが何故でしょうか?
1. g の地点で scanf が失敗 2. a には何も入らないため、変数に最初に入ったゴミにより default が選択される 3. others と出力される 4. 1 に戻る この無限ループ
481 :
477 :2007/06/07(木) 13:22:09
なるほど、うまくいきました。ありがとうございます。
482 :
デフォルトの名無しさん :2007/06/07(木) 13:51:28
const int* p = new int[10]; delete[] p; これ、エラーも警告も何も出ないんですけど、 仕様上合法なんですか?
>>480 なるほど、文字入力を%dの10進数指定して読み込んだら
ASCIIコードの値が格納されるかと勘違いしてました。
ていうか失敗の後再読み込みされずにgのゴミで処理されるって
scanfの仕様どうなってるんだろうかと今さらながらググってみたら
一番最初に出てくる関数だから侮っていたら書いてあることが意外と難しくてビックリでしたorz
>>482 const int の配列を割り当てるのも、それを解放するのも
何の問題ありません。
でも p[0] = 0; なんてするとエラーになる罠。
メモリの破棄には const の力は及ばない・・・ということですか。 分かりました。
破棄そのものは内容書き換えないからな
理屈は分かるけど、それでいいんかいと思わなくはないなw void foo(const int* p) { delete[] p; } を foo(p); って呼んで、 ああ、p は foo で何の影響も受けてないよねー、と思ったら、 delete[] されてた、なんつって。 まあ、const_cast という悪魔も確かにいるけどね。
そんな気持ち悪いことはしないでくださいとしかなあ。
489 :
デフォルトの名無しさん :2007/07/06(金) 09:47:01
C言語で、文字列 str1 の先頭から1文字づつ取り出して 別の文字列 str2 に追記していく場合、 strncatを使用して strncat(str2,&str1[i],1); とするとstr2の内容が文字化けしてしまいます。 FedoraCore6なんですが、どうすればいいでしょうか?
何を入れたらどう化けたんだよ
491 :
デフォルトの名無しさん :2007/07/06(金) 10:01:41
>>490 (だとか)だとかを入力後、他の文字を追記するとstr2に文字化けが生じてしまいます
つまり、マルチバイト文字を入れたときに化けるんだな 化ける前と化けた文字を見れば一発でわかるが・・・ iはちゃんと1ずつ進めてんの?
マルチバイトはstrncpyの3番目が1の場合2回(UTF-8なら3回)実行しないとだめなのはわかってる?
494 :
デフォルトの名無しさん :2007/07/06(金) 10:07:47
半角(などを使用していたつもりだったので、 文字列内にマルチバイト文字は入っていないと思っていたのですが・・・・ sizeof("(")でもsizeof("1")でも同じ値がかえってきたのですが、"("もマルチバイトなんでしょうか? あらかじめstrlenで文字数を数えてからiを回しています。
(だとか)だとかを 「だとか」じゃなくて、"("、")"のほうかよw
496 :
デフォルトの名無しさん :2007/07/06(金) 10:10:48
>>495 すみません、ちゃんと""つけておいたほうが良かったですね。
文字化けを見てみないとわからんけど、\0終端して無いからゴミがくっついてるんじゃね
そういや、最初にstr2は0で初期化してる? strcat は\0のとこに追加するんだぜ。
str(n)cat なんていう下衆なもんは使わないことをおすすめする。
501 :
デフォルトの名無しさん :2007/07/10(火) 21:31:00
クラスにはセットとゲット以外に、 なるべくメンバ関数を作らないようにすべきですか? それとも、どんどん関数を含めても良いのでしょうか? 思想的な質問ですが…
アクセサ自体ベタベタ付ける物ではない メンバ関数・変数ともにそのクラスを表現するのに必要なものだけで良い
503 :
デフォルトの名無しさん :2007/07/10(火) 21:38:34
つまりメンバ関数にする意味があるもののみ含めるのが良いと、 そういうことで良いでしょうか。
それでおkかな。 OOには単一責任の原則と言う物があるから 基本的にクラスが持つ責任は一つだけ。 メンバ関数をその責任に応じたもののみを付けるのが良い。 無駄に責任を負うと初心者にありがちなblobアンチパターンになる。
class A { 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のオブジェクトができるんでしょうか?
もう一つ質問なんですが class A { int x; }; class B: public A { public int y; }; int main() { A* p; p = new B; } このようにクラスA型のポインタでクラスBの領域を動的確保した場合、 Bのオブジェクトができるのですか? それともAのオブジェクトができるのでしょうか?
>>509 ありがとうございます!
これで今ある疑念が解消されました!
解消されたと言った手前、いきなりですが
>>506 の場合において、生成されたクラスBのオブジェクトが持つint yにアクセスする手段ってありますか?
ポインタはクラスA型なので、アロー演算子を使っては呼び出せないですし…
もしかして不可能ですか?
>>511 A* が指してるオブジェクトが本当に B だと確信できるなら static_cast で
B* に変換してアクセスできる。ただし、行儀のいいコードではない。
いや普通ダウンキャストだろ
static_cast でダウンキャストするわけですが何か?
コマンドプロンプトの履歴?をもっと多く表示させたいんです。 最初のほうの計算がきれてしまいます。
>>515 ウィンドウ名が書いてあるところ右クリック
↓
プロパティ
あとはお好きにドゾー
>>516 そこからがわからないんですけど
バッファサイズとバッファ数を大きくすればいいのでしようか?
518 :
デフォルトの名無しさん :2007/07/11(水) 08:55:39
さいです
>>517 あー説明不足ですまん。
> バッファサイズとバッファ数を大きくすればいいのでしようか?
おk。
漢字かな雑じりの 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]); }
521 :
デフォルトの名無しさん :2007/07/15(日) 21:09:48
for(i=0; N; i++){ ・・・ } このときの繰り返し条件Nってどういう意味になりますか?
Nのところが0以外なら繰り返してください、っていう意味!!!!
共有メモリに(キューデータ構造)を構築したいのですが どうしたらいいのでしょうか?
524 :
デフォルトの名無しさん :2007/07/15(日) 21:30:25
wchar_t じゃ解決にならんと思うのだが。
>>520 で済む事なのに
わざわざ文字コード変換とかするとか、
いくらなんでも無駄すぎる。
>>521 Nがtrue(真)なら繰り返す
Nがfalse(偽)なら打ち切る
そして true とは 0 以外の値を持つ事であり、false とは 0 であることである。
>>528 お前の言うことは分かるが、もし527に対して言っているのなら、
答えになっていないぞ。
無駄かどうかはともかく、wchar_tでも解決できるのだから。
個人的にはwchar_tを使うのはありだと思う。
確かにこの例では_ismbbleadの1つで済むが、そうでない(wchar_tにしたほうが手っ取り早い)場合は結構ある。
それ以外にも利点や必要があってwchar_tを使っていると、
522程度でもwchar_tを使えばいいと思うようになってくる。
今時変換のコストなんて微々たるもの。
なんなら元データをwchar_tと同じ文字コードにすればいい。(完全に脱線したが)
ただ、std::stringとstd::wstringとの間に簡単な変換方法が無いのは痛い。
ところで、wchar_t使う方法では、やり方次第で
全角英字まで小文字になりそうな気もする。
L"" で初期化すれば変換なんて要らないんじゃないの?
wchar_t は2バイトだったり4バイトだったりするからな・・・
533 :
520 :2007/07/16(月) 14:26:31
皆さん御解答有難う御座います.
wchar_t も検討しましたが,問題なさそうなので
>>520 で行きたいと思います.
有難う御座いました.
int x; std::cin >> x; ってすると、xがint型であってもキーボードからWWWって文字列を入れたりすることができちゃうじゃないですか これって防げませんか?
>>534 入力されたらどうするかを自分で決めて好きに実装すればいい。
最悪は1文字ずつ処理。
その方法がわかりません・・・・・
一旦、文字列として読み込めばいい。
配列と、forとかの反復処理を勉強してください。
わざわざ再発明させなくてもいんじゃね?っていつも思う。 てか悪い。C++は良く分からなかった。 #include <stdio.h> main() { int a; do { printf("値>"); scanf("%d",&a); while (getchar() != '\n') { } } while((a < 1) || (a > 9999)); return 0; }
>>534 fail したら clear してから string へ読み捨てれば
じゃあC++における標準入力って何でも文字列で読み込まないとエラー処理できないわけですか…
>>541 Cでも同じじゃね?
ってか、入力されるのは実際文字列であってたまたま数字だったら変換してくれてるってことでしょ。
Variantみたいな型が無い時点で>540のようにするしかないかと。
>>541 どうしてもっていうならテンキー以外のキーボードをつなげるな
人はそれを電卓と呼ぶ。
cin.ignore 使えば
>>546 せめてリターンキーは必要だろう
CtrlとALTときたら普通はSHIFT
指五本あるのになんで三キーしかないのか
同時に全部押すことにしか使わないのさw
最近は使わないんだろうな。 NTのログインにも使わなくなったからな・・・
参照っていうのは『参照!』ってやった時にしかアクティブにならないのがファイナルアンサーですか?
ニッポンランゲージでOK
構造体を関数で参照した時に その関数では使わない構造体の中の変数があった時 関数に構造体を渡した時に、 構造体の中の変数が多いとそれだけ何か、処理が増えてしまうのか それとも「参照!」ってやったときだけ処理されるのかが知りたいです(´・ω・`)
参照渡しなら問題ない。
>>552 もう少し質問を簡潔にまとめてくれると助かる。
構造体を値渡しすれば関数内で利用されてない変数の有無に関わらずコピーの処理が発生する。
よって、構造体が大きくなればなるほど処理も大きくなる。
これを避けたいのであれば
>>553 のようにするか、ポインタ渡しすればいい。
>>554 日本語の拙い>552に合わせて変な用語を使わなくていいよ。
構造体のメンバを変数と言われるとどうにも理解しにくいから。
#メンバ変数と言おうと要素と言おうとその辺は構わんが。
ついでに注釈。問題の関数がインライン展開されるような代物なら、
参照渡しでなくともコピーが発生しない可能性はある。
従って、迷ったときは値渡しで充分だ。
謝罪を賠償しるニダ
>>553 ありがとう
>>554 なるほど
>>555 インラインっていうのを始めて知りました
それだとコピーされなかったりするんですね
でもとりあえず参照使っときます
恥ずかしい
迷ったらconst参照でいいよ。
typedef struct __blockData{ uint32_t index; uint32_t block_size; struct __blockData *next; }BlockData; struct __blockData *next;この部分なんとか BlockData *next;って書きたいんですけど なんとかならないっすか?
なんとかならないっすね
ええーーーやだやだ
ちょっとちょっとそんなぁ
まってくださいよ
>>561 さん
俺がどんな思いで12分過ごしたと思うのですか?
typedefはあくまで再定義 最後の行のBlockData;までいったところで初めて再定義完了になるから 自分を指す場合ちゃんとstruct __blockDataと明示しないと不可。
そうなのか やけ酒するしかないな... 高校生だけどまぁいいかw
通報しました
>>560 これでいいんじゃね?
typedef struct __blockData BlockData;
struct __blockData{
uint32_t index;
uint32_t block_size;
BlockData *next;
}BlockData;
>>566 それはCでもC++でも無理だろ。書き忘れたがC++コンパイラなら
struct BlockData;と前方宣言する事でコンパイルをパス出来た。
568 :
566 :2007/09/25(火) 01:08:52
あ、最後に余計な BlockData がついてた。ごめん。
>>567 最後の余計なやつだけ修正すればコンパイルできるよ。
C++ なら前方宣言も要らなくて struct BlockData { BlockData* ... ってできるよ。
569 :
デフォルトの名無しさん :2007/09/25(火) 01:13:22
うへー
void *next; では・・・・だめですかそうですか。
uint_ptrと void * の使いわけってどうすればいいの?
大文字じゃなくて小文字なの?あんま見覚えが無い・・・ UINT_PTRはunsigned intだった気もするけどよく覚えていない
a |= b ってどんな意味なんでしょうか?
>>572 UINT_PTRはC99のuintptr_t相当。
577 :
デフォルトの名無しさん :2007/10/18(木) 01:34:33
あげあげ
>>571 void* はどんな型のポインタが渡されるか分らない場合に使う。
(キャストしないと参照先を見れない)
int* はポインタが指し示した先がint型であるとされる。
char a = 'a'
int* p1 = (int*)&a;
void* p2 = &a;
となっているとき*p1はエラーにならんが*p2はエラーになる。
なので関数内で使用時のキャストし忘れが防げる…のではなかったかな?
あ
すみません。書きかけを送信してしまいました。 ハード、ソフト共に同じはずなのに、別のPCではマルチプロセスのミューテックスによる排他制御が上手く働いていないみたいなのですが、 原因として何を疑えばいいのでしょうか。もう全然判んないです。
『上手く働いていないみたい』といいたい気持ちはわかるが それでは他人にはわかってもらえませんよ。
>>580 今まで偶然動いていただけで同期処理に漏れがあったかだな
>>580 うちでは上手く働いている
実力不足じゃね?
今まで低速シングルCPUで動いていたが 高速なPCに変えたらおかしくなったとか クアッドコアに変えたらおかしくなったとか そういうマルチスレッドプログラムなんかもあるんだろうな。
機種依存ソフトなんだろう。
方角が悪い。
YES!!
関数ポインタテーブルとswitch-case文 ってどっちが高速なの? どっちも個数は100
ポインタ
>>589 一概には言えないが、テーブルの方が遅いことは多分ないと思う。
恐らくは、大差ないと思うが。
テーブルが遅くなるケースも充分考えられるよ。もちろん、メモリアクセスの速度を除いて。 単純な例だと、2つの値(分岐先)が交互に来る場合。 こういった規則的なものなら、分岐予測はほぼ必ず成功する(ものが多い)。 最近のプロセッサなら、もっと複雑なパターンでも予測出来るものもある。 一方、テーブルジャンプだと、(普通は)前回と同じ分岐をすると仮定されるので 必ず分岐ミスとなる(ものもある)。 当然、分岐予測ミスのペナルティの大きさも含めて、プロセッサによる差が大きいけどね。
>>589 なぜ「switch-case文より関数ポインタテーブルのが高速」だと考えるのか?
↓
条件分岐が排除できるから
↓
では、なぜ条件分岐が排除できると高速になるのか?
↓
実際に実行するコードがかなり前から分かっていれば、
CPUでコードプリフェッチやアウトオブオーダー実行などの最適化を行えるから
↓
関数ポインタテーブルを使えば実行するコードがかなり前に分かるのか?
↓
条件にもよるが、おそらくはノー
多くの場合、直前にならないと関数ポインタの値が分からない
つまり、関数ポインタテーブルを使っても、少なくともx86の場合は速くなりません。
条件分岐なら二者択一でとりあえずどちらかの分岐コードを実行するという手もありますが、
関数ポインタだとそういうこともできないので、多くの場合ストールします。
実際に実行するコードアドレスがかなり前から分かっていて、
そのアドレスを特定のレジスタ(か不変なことが保証されているメモリ)
に保存しておくことができればストールは回避できます。
じゃあif-elseでもいいのか
選択肢が100個もあれば、速度は分布によっていろいろだろうな。
Cカス Cカス うるさい人を黙らせる方法教えてください なるべく合法的な方法がいいです
RubyもPythonもphpもUnixも 全部Cで書かれてるんだぞ。 Cはすごいんだぞ。
C言語でC++の テンプレート見たいに記述したいんだけど どうしたらいいものじゃろうか?のぅ?
プリプロセッサを駆使する。
でどうやってかくの?
## を駆使する
C++にtemplateが実装されるまでの過程を知ってりゃ話は早いんだがな。 generic.h
そうだ、cfrontを使おう(w
template<typename T>T*hoge(T*t){return t;} でNULLを受け取れるようにするにはどうすればいいんでしょう...
(void*)NULLみたいに、型付きのNULLを渡す。 でないと、どの型のNULLがほしいか誰にも判らないじゃん。
NULLに型など付けれません ばかじゃねーのw
hashのkeyを char key[32]で定義しmemcpyを 必要に応じて複数回コールする方法と struct key_data{ _u32 data; .... }; みたいな感じで構造体を定義して _u8 *にキャストして使うのは どっちが速い?それとも同じ?
なんともいえない。 実測。
>>608 いくらここが掃き溜めだと言っても限度が・・・
613 :
デフォルトの名無しさん :2008/01/20(日) 21:00:38
コンパイルしたときのエラーに storage size of 's' isn't known とでてきてしまいます。 これはどこを直せばいいんでしょうか? storageって何ですか?
>>613 辞書くらい引け。
恐らく、int s[]みたいな変数宣言でもしているんだろ。
offsetof(s,m)マクロみたいなので 他クラスのprotectedメンバのオフセットを 取得したいんですがどうすればよいですか?
>>615 それができたらprotectedの意味がないとは思わないかね?
617 :
デフォルトの名無しさん :2008/01/22(火) 23:31:19
コンパイルをした時に converting to ‘int’ from ‘float’ って表示されたらどこが悪いんでしょうか?
>>617 floatからintに暗黙の変換を行っている。
明示的にキャストを書けば警告は出ない。
>>617 >って表示されたらどこが悪いんでしょうか?
頭……というのはさておき、floatからintではオーバフローが起きる恐れがあるので
気の利いたコンパイラは警告を出すってこと。
# 勿論、出さないようにもできる。
C++のコンストラクタの中で例外発生させるのは駄目と聞いたのですが ではnewもbad_alloc投げる可能性があるのでコンストラクタでnewしてはいけないのですか?
コンストラクタで例外はまあない方がいいのは確かだが、 ダメというほどではない。 デストラクタは絶対あかんがね。
クラスを作る側も使う側もきちんとリソースの管理ができていれば何の問題もない。
コンストラクタでの例外については、人によって意見が違うが、 俺は積極的に例外が発生するようにしてる。 じゃないと、不正なオブジェクトが生成されてしまうから
仮想コンストラクタとスマートポインタ使えば解決。
Phidgetsというハードを制御したいのですが ~略 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; }
この文で、 getchar(); で入力を待たずにCPhidgetServo_setMotorPosition (servo, 1, 100.00); を実行したいのですが、getchar();を消しただけでは駄目なのでしょうか? ド素人な質問をしていると思うのですがどうかご教示下さいませ。
自己解決しました。 getchar();で入力を待たずに実行すると、ハードを認識するのが追いつかずに実行されるようでした。
クラスを普通に前宣言する時 class MyClass; って書けばいいけど、例えば class MyClass { public: class Foge { }; }; みたいに MyClass の中にあるクラス Foge を 前宣言したい時はどうすればいいの?
>>629 class MyClass
{
public:
class Foge;
};
class MyClass::Foge
{
};
MyClass の定義無しでの宣言はできない。だからネストされたクラスを
インターフェースに使うと MyClass を前方宣言で済ませるのが難しくなる。
631 :
デフォルトの名無しさん :2008/02/20(水) 22:12:19
一つのソケットに対して送信、受信が交互ではなくて、不定期に発生するような、 プログラムを作ってるんですけども、こういうのってどうするのが良いですか? 交互に通信がある場合ならselect→recv→sendとかで簡単なんですけども 送信が繰り返される場合もあるので悩んでいます。 どなたか教えてください
632 :
デフォルトの名無しさん :2008/02/20(水) 22:58:08
今マインスイーパーを作ってるんですが それについての質問ってここでしてもいいんですか?
>>631 sendリクエストをsignalで受ければいいような。
もし必要ならネットワークスレへどうぞ。
>>632 マインスイーパー程度ならここでもいいと思いますが、
GUIライブラリの使い方なら該当GUIライブラリスレへどうぞ。
マインスイーパースレも参考にどうぞ。
634 :
デフォルトの名無しさん :2008/02/20(水) 23:51:14
>>633 visualC++ 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("地雷 踏みました!");
}
>>631 selectが反応したときはrecvする
sendはいつでも何度でも好きなときに好きなだけ繰り返し呼んで良し
何か問題が?
トランシーバーと同じ問題じゃないの?どうぞ
637 :
デフォルトの名無しさん :2008/02/27(水) 01:03:33
質問です。 VC使ってて、あるクラスの実体を複数のスレッド内で使ってるのですが、 これって問題あるのでしょうか? スレッド毎に異なるデータを用意してるので、 クラスのメンバ変数への排他の問題はありませんが、 クラス内にDLLクラスをメンバに作っていて、 スレッド毎に同じDLLにアクセスしています。 こんな使い方って問題ありますか?
DLLの提供する関数がリエントラントなら問題ないんじゃね
クラスAがあり、クラスAを実体化した際、コンストラクタでクラスBを実体化したとします。 このとき、クラスBがクラスAのpublicな関数を呼び出すためには、 クラスBに対してクラスAの実体のポインタを渡し、そこからアクセスする以外に方法がありますか? どのような方法があるでしょうか?
>>639 ポインタじゃなくて参照使うとか、無理やり違う手段でっていうならグローバル変数とか、
いろいろありそうだよ。
641 :
デフォルトの名無しさん :2008/03/03(月) 15:37:24
>>639 あんま使ったこと無いけどクラスBにクラスAのメソッドをfriendで共有すれば?
friendにしてもthisポインタ相当の何かは必要だろ。
クラスCのstatic変数に突っ込んで、クラスCの静的メンバ関数から呼んでもらう。
グローバル変数なんつー力技を除けば、 どうあっても this は渡す必要がある。 デリゲートだって内部的に this を渡している訳で。 friend は public メンバ呼ぶのには全く関係ないな。
>>645 もちろん、何らかの方法でthisを渡す必要はあるだろう。
でも、
>>639 の場面で、class Bからclass Aのメソッドを直接呼び出すには、class Bがclass Aを知らないといけない。
delegateは、メンバ関数へのproxyとして働くことで、メソッドを定義しているclassを隠すことが出来る。
>>639 の場面では、class Bはclass Aを知らなくても、class Aのメソッドを呼び出すことが出来るようになる。
そもそも、コンストラクタ内で他のクラスにメンバ関数を呼ばせる事自体 結構危険な事だと思うけどね。
コンストラクタで実体化しただけで、 コンストラクタで関数を呼ぶとは書いてないだろ
649 :
デフォルトの名無しさん :2008/03/13(木) 19:06:50
650 :
デフォルトの名無しさん :2008/03/13(木) 19:26:01
memsetは問題なく動くからまだいいけど、 普通は、s[0] = '\0';で十分だろ。せいぜいstrcpy(s, "");
NULL を脱参照して死亡
653 :
デフォルトの名無しさん :2008/03/24(月) 10:47:50
ファイルを分割したときに変数を大域変数として定義して、 呼び出すためにはどうしたらいいでしょうか? 今ファイルがmain.cpp,hoge.h,hoge.cpp,hage.h,hage.cppとある時に, 全体でのメモリアクセスを調べるためにmain.cppでint型の大域変数を定義して, hoge.cppとhage.cpp内で値をインクリメントできるようにしたいのですが・・・
どんな入門書にも書いてあるよ
655 :
デフォルトの名無しさん :2008/03/24(月) 11:25:16
main.cppで変数定義して、 hage.h,hoge.hでexturn宣言したらエラーが出るのですが、 やり方間違ってますか?
どうしてエラーをコピペしないのか。俺らをエスパーだと思ってるのか。
>>655 ソースも見ないで間違ってるかどうか判断できるわけがない。
ソース(その変数に関係するところ)とエラー(いっぱい出てたら始めの3個くらい)を張って。
改めて打つんじゃなくてコピペで。
>hage.h,hoge.hでexturn宣言したらエラーが出るのですが、
externの綴りが間違ってる。ここに書く時に間違えただけならいいんだけど。
エスパーしてもらいたいんじゃなくて 原因である可能性の高いものを列挙してもらいたいんじゃない? んで、それを一通り試して、自己解決しました!って言うの(笑)
>>655 やりかたがまちがっている。
.h ファイルはコンパイルする必要はないよ。
>>653 [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++;
}
661 :
デフォルトの名無しさん :2008/03/25(火) 11:28:05
スレの内容見ながら直したら解決できました。
出てたエラーは
error LNK2001: 外部シンボル ""int mov_i" (?mov_i@@3HA)" は未解決です。
でファイルの依存関係が間違っていたのが原因でした。
>>656-660 有難うございました。
>>657 申し訳ないです・・・以後気をつけます
Windows 限定の話題で申し訳ないんですが、FARPROC 型というのが何なのかよくわからないので質問させてください。 MSDN の CallWindowProc の項目を見ると、FARPROC 型は typedef int (FAR WINAPI *FARPROC)(); と宣言されているらしいんですが、WINAPI は __stdcall だから良いとして、FAR というのは何なんでしょうか? MinGW だと FAR は省略されてるので、付けても付けなくても同じな気がするんですが、 とすると FARPROC=ただの関数ポインタと考えちゃって構わないんですか?
16bitアドレッシング時代の残骸だろ。無視して医院で内科医。
>>663 ありがとうございます。なんかMS-DOS時代はFARとかNEARとか使ってたらしいのでそういうことなんですかね。
Windows だとこういうマクロとか typedef がやたらと多くて変な所でやたら苦労させられます(;´Д`)
どこかに#define FARと定義されているから、 プリプロセスが終われば消えてなくなる。
いい時代になったもんだ。
667 :
デフォルトの名無しさん :2008/04/01(火) 23:30:29
コンストラクタを定義しようと思っているのですが ClassA(); ClassA(int nSize); と定義して、実体を書く時に ClassA::ClassA(){ this->ClassA(1); } と言う具合に書きたいんですが error C2273: '関数形式のキャスト' : '->' 演算子の右側で使用できません。 となって出来ません。 何とか、良い方法はありませんでしょうか? ClassA(int nSize=1); もあるとは思うのですが、指定した場合、もう少し細かくコードを書きたいのです。
ほかのコンストラクタを呼ぶことは今のところ不可能だから、 privateな初期化関数を作ってそれを呼ぶのが常套手段。
669 :
デフォルトの名無しさん :2008/04/08(火) 18:49:12
nanosleepの使用例はどこかにありませんか?
nanosleepの使用例なんて腐るほどあるわよ。ネットは広大ね。 って少佐が言ってた
あんなの、man引けば使い方なんて一発だろうに。
673 :
デフォルトの名無しさん :2008/04/09(水) 04:07:45
うちのman nanosleepには使用例は載っていないな〜〜
手取り足取り教えて貰わないと書けないんですか?
676 :
デフォルトの名無しさん :2008/04/09(水) 08:05:20
Visual C++でnanosleepに当たるものを教えてください
Sleep() 指定する時間単位と精度の違いに注意。
質問。
ttp://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; };
と定義してはみたものの、どうデータを流し込んで
やればいいんでしょうか?
もしくはもっと効率的なクラス定義の方法があれば
教えてください。
std::map使えばいいんじゃね
680 :
デフォルトの名無しさん :2008/04/10(木) 17:44:25
ダイナミックライブラリとスタティックライブラリの使い分けについて教えてください
681 :
デフォルトの名無しさん :2008/04/10(木) 21:40:05
>>680 C/C++の質問ではありませんのでスレ違いです。
ポインタで複数の配列の連続的に扱うことはできますか? int *p int A[3] , B[3], C[3]; (p+0) = A; (p+3) = B; (p+6) = C;
できません
そういうコンテナ/イテレータを書くのも勉強になりそうではあるな
>>682 unionで配列の位置を一纏めに固定すれば可能
>>685 ほほぉ、unionでですか。具体例をどうぞ。
687 :
デフォルトの名無しさん :2008/04/18(金) 00:02:31
VisualC++2008でfopen_sやfopenしてもファイルを読み込んでくれません。 パスはあってるし、DOS窓で実行ファイルと読み込みたいファイルのあるディレクトリに移動してから実行してもダメでした。 fopen_s(&fp, "a.txt","r") fp=fopen("a.txt","r") という書き方で間違ってないと思うのですが… 原因としてはどんなことが考えられるんでしょうか?
もしかして: a.txt.txt
もしかして: VisualC++2008 【Express Edition】
>>682 int p[9];
int* A=p+0, *B=p+3, *C=p+6;
A[0]=(以下略
じゃだめなん?
>>686 union {
struct {
int A[3],B[3],C[3];
};
int D[9];
} Array;
int *p = &( Array.A[0] );
こんな風に
693 :
デフォルトの名無しさん :2008/04/22(火) 11:59:19
intじゃなかったら使えないな
694 :
デフォルトの名無しさん :2008/04/22(火) 17:51:28
10進数を2進数に変換する方法教えてください
2で割って少数以下切捨て、その時の余りをならべる。を繰り返す。
696 :
デフォルトの名無しさん :2008/04/22(火) 18:16:54
以下を実行して a: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 []); }; 続く
697 :
デフォルトの名無しさん :2008/04/22(火) 18:17:29
続きです int 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; }
698 :
デフォルトの名無しさん :2008/04/22(火) 18:27:36
char a[] = "100"; って書くと これどういう意味になるの?
>>698 a[0]='1' a[1]='0' a[2]='0' a[3]='\0'
700 :
デフォルトの名無しさん :2008/04/22(火) 18:34:43
>>696 SFC.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入れても、その後上書きしてるじゃん
>>701 おっしゃるとおりです。ありがとうございました。
コンパイラとリンカのバージョンってどうやって調べるか分かりますか? ちなみに、使っている環境(って言うのかな?)はCPad for Borland C++Compilerってやつです あんまり難しい専門用語は分からないんで、初級者でもわかるように教えてくれるとうれしいです
無料版の BCC のバージョンは 5.5 しか存在しない。
>>704 それはリンカのこと?それともコンパイラのことですか?
超下級者だから全然わからん
ちっとも保守される様子がないbccなんかそろそろやめて mingwやvcのexpress editionにすればいいのに。
-v
>>694-695 整数は割っても少数にならないし、小数は扱いにくいから
↓のを繰り返す。
x % 2 //2進数の一桁目がこれででる。
x /= 2 //一桁目を取り出したらずらす。
x & 1 x =>> 1
1, 2, 4, 8, 16, 32, ... とビット数の数だけ論理和とればいいだけじゃん
ごめん。
>>709 はマイナスのとき使えな・・くもないか。
まず10進数の定義からだな。
定義厨もここまできたか
パックドBCDかもしれんし、ASCZかもしれん。
#include <stdio.h> struct 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;}} これで実行するとメモリのエラーが出るんですが、どうすれば解決するでしょうか
>>716 2つめのprintfは、%sじゃなくて%dを使うべし。
×for(z=0;z<9999999999;z++); ○getchar();
それ以前に hist->x は hist[0].x じゃないのか?
どっちでもいいんじゃね?
ボーランドでコンパイルしたのですが、 E2293 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ではこのエラー表示は出ません。 どうしたらいいか教えてください。
>>721 Cには参照はありません。visualとやらでエラーが出なかったとすれば、C++としてコンパイルしたのでしょう。
”プロセスにマッピングされている”というのは具体的には ヘッダのインポートセクションとかにアドレスが格納されている、という意味ですか?
いいえ。
ではどういう意味ですか?
そのキーワードで検索すれば判る通り、状況によって意味することが違うので単純には答えられません。
c/c++ランタイムってもしかして c/c++じゃなくてもプロセス起動時にロードされてる?
そのプロセスのコードの一部がC/C++で書かれてるならロードされる場合もある。 .dllや.soなら他のプロセスが呼び出してるかもしれん。
環境:vc2007 言語:c++ argcに間違ったパスを入れてしまいました。 そのあと何度動かしても、動かした瞬間にargcに間違ったパスが入り プログラム'******'を開始できません。指定したファイルがみつかりません というエラーが出ます。 どうやったら、このエラーは出なくなるでしょうか
>>733 argcはコマンドライン引数の数。パスなど入らない。
プロジェクトのプロパティのデバッグの動作のコマンドに間違ったものが入ってるとそうなる。
>>733 プロジェクトのデバッグのタブの引数の項と間違えて、実行するプログラムのパスを書き換えたんじゃないのか?とか言ってみる。
737 :
733 :2008/05/25(日) 11:26:10
解決しました。ありがとうございます。
Visual Studio 2008 Express で VC++の勉強をはじめたばかりの超初心者です。 gcnewを用いてインスタンスを生成し、"->"を使用してメンバ関数を呼び出すと、メンバ関数からメンバ変数をアクセスできません。 ご回答のほど、よろしくお願いします。
ref class A
740 :
738 :2008/05/25(日) 23:42:33
>>739 ref にしてるんですが、ref じゃだめってことですか?!
C++/CLIではじめるならC++かC#のどちらかで始めたほうが楽じゃないかな。
C/C++言語でプログラムを書いたら、 必ずC/C++ランタイムは使われていますか? C/C++以外の言語で、C/C++ランタイムを使用している言語はありますか?
まったく使わないこともできるな。
745 :
743 :2008/05/29(木) 20:36:21
C/C++で書いたプログラムはmain関数の前に C/C++ランタイムのスタートアップルーチンが呼ばれるそうですが、 まったく使わない事も出来る、とはつまり main関数の前にスタートアップルーチンを呼ばない事が出来るということでしょうか?
空の同名のスタートアップルーチンを自作してリンクすればできるだろ
>>745 書ける。組み込みなんか自分で書いたりするゾ
ファイルからN(定数)個のスペースで区切られた値を読み込むのに while(fgets(str,512,fp)){ sscanf(str, "%d %d %d …, %d", &input[0][ct], &input[1][ct], &input[2][ct], …, &input[N][ct]); ct++; } とやっているのですが、Nを変数にしたい場合、どういう風にすればいいんでしょうか?
751 :
デフォルトの名無しさん :2008/06/06(金) 01:24:08
難しいね、C++って、、、、
vector t; をモジュールに引数として渡す方法を教えてください。もう3年も悩んでます。
>>749 C++ならvectorでできる。C99なら可変長配列でそのままできる。C89だとmalloc()で確保するしかない。
入力自体は、いずれにしてもループで回すしかない。
>>752 何をしたくて、3年間も何を無駄に調べたのか教えてください。
756 :
デフォルトの名無しさん :2008/06/07(土) 23:03:18
なんで .cpp と .h に分けるの? h に全部書いちゃいけないの? (javaって1ファイルだよね?)
コンパイル激遅でいいならやればw
759 :
デフォルトの名無しさん :2008/06/08(日) 00:35:08
>>757 遅くなるの?
それは知らなかった。
Boostってhppだよね?
あれ、遅いのに採用してるの?
>>759 インクルードってどういうものか分かってる?
ファイルの中身を合成するものなんだよ?
全てのコードをヘッダファイルに書いて
main のある .cpp でそれを全部インクルードしたとすると、
それら全てのファイルの中身を合成したファイルを
毎回コンパイルすることになるんだぜ。
そのファイルの中の1カ所を変更しただけでな。
>>759 boost 全部を一気に使う訳じゃないだろ。
まあ、boost 使うとそれなりにコンパイル遅くなるけど。
そのためのプリコンパイル済みヘッダファイルだな。
>>760 ただの宣言をするものと思ってた。
>>761 確かに、一気には使わないね。
ありがとう。
763 :
デフォルトの名無しさん :2008/06/08(日) 00:44:28
質問です。 if(整数型) ってやったときに 数字が0だと偽、符号が正だと真と聞いたのですが ゼロ以下だとどっちになりますか?
>>759 Boostの場合はテンプレート使っていてヘッダに書かざるを得ないという事情がある。
もちろん、ライブラリのリンクという面倒事を回避できるという点も影響を及ぼしているとは思う。
要LIBのものでも必要最低限しかLIBに入れていない。
>>763 その説明はおかしい
0が偽で0以外が真
っていうかif(-1)とでもやって試せばどうかね
自分で試してあやふやな結果を得るくらいならここで質問して確実な回答を求めます。
規格票をおよみください
規格以前の問題。 まともな C++ の本読め。
まともなC++の本かどうかを判断するには知識が・・・
卵が先か鶏が先か。
代理出産だー
ここでの回答なら確実だと思ってるのかな。
if(-1) (-1に限らず負の数)くらいを試せないのはちょっとしんどいな。 いくらでも試す方法はあるだろうに・・・
C++だと環境に依存するコードが多くてバグるからCで書け といわれたんですがC++特有で環境に著しく依存する物って何でしょう 仮想関数や継承の挙動が大きく変わるとは考えにくいんですが。
>>776 いったやつが理由を知らないんだよ。
知ったかぶりだよ。
>>775 例外処理とか、標準ライブラリの実装とか、の話かな?
いずれにしても挙動が変わることはさすがにないでしょ。
もちろん規格に沿った範囲内の話で、未定義動作を利用した
コードなんかについては知ったこっちゃ無いけど。
ども。やはりそんなものですよね… 上司が自信満々に断言するので突込んで聞けなかったんです
vector<Hoge>::const_iterator iter = hoge.begin(); (*iter).name で、なんでアスタリスクが必要なの?
iter は const_iterator であって Hoge ではないから iter.name という表記は const_iterator のメンバ name を参照しようとしているのであって、Hoge の name を見ているのではない iter->name ならおk
>>781 ポインタと同じように考えればいいのなか?
イテレータはポインタを模したクラスのことだからな。
いい野中
配列の要素に-1を指定した時の挙動について教えてください char a; char b[10]; と宣言しておいて、b[-1]を指定したら、aを意味していることになりますか?
なるはずがありません
790 :
787 :2008/06/09(月) 23:26:09
FreeType2という、フォントレンダラのソースを読んでいたら 配列の添字に-1を指定している箇所があり、気になって質問しました このソフトはC言語で書かれています。 やはりこれはイレギュラーな使い方なんですね
ほんとに配列として宣言されてた? mallocで確保したアドレスに+1したものを配列として使ってたりしない?
メンバ変数の場合は宣言順にメモリに置かれることが保証されてるので、 あとはアラインメントに関して処理系独自の定義が行われていれば その処理系では保証されるね。
>>792 されません。配列の添え字演算(ポインタ演算)で配列の範囲外にアクセスしたら未定義動作です。
未定義動作を発生させるコードについて、ある処理系が特定の挙動を保証することがあっても構わない。
[-1]だけではそれが間違ってるとは言い切れない。 char a[10], *p p = a + 1; とすれば p[-1] == a[0] であり、そこにアクセスするのは何の問題もない。
enumは変数宣言出来るけど enum変数自体 int型で特に特別な変数ではないし 他の変数で代用可能だから活用法が思いつかない どういった活用法があるのですか?
たしかに定数宣言+typedef程度の意味しかないけど、 C++なら多重定義できるのが便利と言えば便利、特にストリーム入出力。 これも主にC++のことだけど、クラス内で定数宣言するのにも使った。 static constのおかげでこの用途からは退き気味だけど。
>>796 数値に特別な意味がない場合に、シンボル(名前)で記述できた方が判り易いことがしばしばあるから。
古いCだとdefineマクロしか選択肢がなかったのでデバッグ時に苦労したけれど、
enumならデバッガにシンボル情報をくれてやりさえすればシンボルのまま扱えるわけだ。
>>796 信号機を作るときに
enum state {
green = 0,
yellow,
red,
};
と状態を宣言しておけば便利ジャン。
黄色の次は紫に変わるようにしろ、と言われたときでもyellowの次の行にpurpleを足せばいい。
static constだとredの値も変更しなくちゃならない。
つまり if (yello) とかしとけば数値を気にしないで便利
>>799-800 そこは理解済みです、言われている通り
#defineやconstよりはるかに便利だと思います
>>796 で質問したことをコードにすると
enum タグ名 {
名前1,名前2,・・・
} 変数宣言
とした場合、宣言した変数の活用方について教えて下さい、という意味です
説明が簡単過ぎてうまく伝わっていなくて申し訳ないです
stractならデータ管理が目的なので利用法が思いつくのですが
enumの方は使いどころがいまいちピンときません
enumシンボルのことでなく、enum型変数ってことか? >797とか。後は、例えばenum state conditionとか宣言しておけば condition変数にはenum stateのシンボルしか入れない積りであることが明確になる。 コンパイラによっては、switch (condition)したときにシンボルの抜けがないかもチェックしてくれる。
804 :
デフォルトの名無しさん :2008/06/13(金) 21:40:38
>>801 構造体の場合
typedef struct{
int a;
double b;
}HOGE;
みたいに変数宣言するんじゃなくHOGE型として宣言しといたほうが
typedefせずグローバルで変数宣言すると何かとふべんだから
typedefして使うところで変数宣言したほうが良い
enumなら下記みたいに宣言したりする。
typedef enum {FALSE = 0,TRUE = 1} BOOL;
805 :
誰か一緒に考えてください :2008/06/13(金) 22:37:30
もしプロトコルを開発するならどんなプロトコルにしますか??
806 :
デフォルトの名無しさん :2008/06/13(金) 22:49:23
>>805 >もしプロトコルを開発するならどんなプロトコルにしますか??
既存のプロトコルを利用できないか、再検討する。
enum の話で考えたんだけど、
enum のすべてのメンバがそのスコープで有効になるのは勘弁してほしい。
メンバが多いと名前が衝突する可能性が高くなるし、
enum Style { None, A, B }; enum ExStyle { None, C, D };
みたいに同じ名前を使えないのは痛い。
仕方ないから、
namespace Style { enum Style { None, A, B }; } namespace ExStyle { enum ExStyle { None, C, D }; }
とか宣言して、
Style::Style style = Style::None; みたいに使ってる(非標準だけど VC++ は一応通してくれる)。
俺は本質的に enum の使い方を間違えてるんだろうか?
>>802 の言うように、特定の値しか入れない場合とかに使ってるんだが。
>>809 なるほど。
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 とかうまく使えばこれを毎回書かなくても使い回せそうだ。
すばらしい一言アドバイスをありがとう。
・・・もしかして常識ですか?
残念ながら
あの、
>>808 ってどこが非標準なんですか?
名前空間と列挙型が同一の名前を持っていることでしょうか。
813 :
808 :2008/06/16(月) 00:05:50
>>812 VC++ では
>コンパイラの警告 (レベル 1) C4482
>エラー メッセージ
>非標準の拡張機能が使用されています: enum 'enum' が限定名で使用されます
>型の中の列挙型を参照するときは、列挙型の名前を指定する必要はありません。
だと。(型名)::(列挙子名) とするのは非標準らしい。
よく考えたら
#define enum_class(Type) \
class Type\
{\
private :\
int value;\
public :\
Type() : value(0) { }\
Type(int value) : value(value) { }\
operator int() const { return value; }\
operator int &() { return value; }\
enum Tag;\
};\
enum Type::Tag
とかすればほとんど C# ライクな列挙型もどきができるな。
これも非標準だし、列挙型みたいにする意義も薄れてるが。
814 :
デフォルトの名無しさん :2008/06/16(月) 22:51:16
C/C++のばかたれっ!! あー すっきり!! もやっとボール 100000000個くれ!!
>>813 それは >808 の namespace を使った例に対して Style::Style::None とした場合の警告じゃないか?
Style::None なら最初の Style は namespace 名だから、その警告には該当しないだろ。
816 :
デフォルトの名無しさん :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); ←ココでエラー } }
>>816 エラーメッセージぐらい貼れ。
人に原因を調べて欲しいならソースを略すな。
↓これ見ただけでポインタをよく理解していないというのがわかる。
> if((*fGroup).strKey != NULL) {
入門サイトをよく読みなおしたほうがいいかもしれない。
818 :
デフォルトの名無しさん :2008/06/17(火) 11:18:02
エラーメッセージですか。 MinGW Developer Studio にてソース作成して VC++にてDLL連携してしているので下記のようにしか表示されません。。。 ハンドルされていない例外はACMatch.exe(MSVCRT.DLL)にあります: 0xC0000005: Access Violation。 例外処理 (初回) は ACMatch.exe (MSVCRT.DLL) にあります: 0xC0000005: Access Violation。 プログラム 'ACMatch.exe' はコード 0 (0x0) で終了しました。 >if((*fGroup).strKey != NULL) { これは策がもうなくて、ものは試しにでやってみたのを削除し忘れていました。。。
>>816 >デバッグ出来ない環境だから、エラーの原因は不明なのよおおお
それでプログラミングしようってのが無謀。
中略部分を晒すつもりが無いなら、終了。
821 :
816 :2008/06/17(火) 12:53:33
>>819 無謀なのは承知です。printfにてエラー発生箇所は分かるのですが
原因を特定する為のデバッグのみが出来ない状況ですので
それで納得し、何とかやっております。
>>820 記述通り「struct FGroup」はヘッダでの宣言のみにて
中略部分ではstruct FGroupへの格納どころか、
struct FGroupの要素のstrKeyが一切記述されていなかったので中略していました。
それでも晒した方がよろしいでしょうか?
>>821 相談したいなら晒したほうがいい。
でも、 strKey に値が設定されて無いなら strcpy でぶっ飛ぶのはあたりまえ。
>>815 ごめん、確かに (名前空間名)::(列挙子名) は問題ないわ
どっかで Style::Style::None みたいなことしたから警告でたんだろうな
>>808 そのものは非標準ではありませんでした。
(
>>813 の「列挙型の前方宣言」は非標準のはず)
824 :
816 :2008/06/17(火) 13:07:13
C言語はjavaのように自分で初期化しなくても 初期化されいてるとどこかで読んだ記憶があったので、 strcpyにて複写しても大丈夫かと思ってたのですが、、、駄目だったのですか?
>>824 記憶があるのならどこで読んだか思い出して内容を確認してくれ。
たぶん間違いだから、 Web 上の記事なら晒して欲しい。
C言語で自動初期化(ゼロ初期化)が入るのは非ローカル変数かローカルで static な変数のみ。
printf分でデバッグウィンドウに情報出力とか可能ですか?
OutputDebugString関数
>>816 MResultGroupってMatchingResultGroupのtypedefか?
resに色々格納って言ってるけど、MResultGroupのインスタンスはちゃんと確保されてるのか?
fGroup自体が0(NULLはC++では使わない方が良い)だったりしないか?
今回のエラーには関係ないけど、j < 9 は合ってるのか?j < 10じゃねーか?
数分前まではちゃんと動いてたのに、 急にこんなエラーを吐き出しました。 開発ソフト: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 ; }
>>829 エラーメッセージをよく読め。アドバイスしてくれてるじゃないか。
program still running? program still running? program still running? program still running? program still running?
program still running? 訳(プログラム・動かない・見出し) って意味であってる?
つまらん
ちゃんと辞書を引こう
program still running? (訳:あなたは気が付いていないけれど プログラムは静かに動き続けているだろう。 私にその健気なプログラムを殺してしまえというのか?)
はい、もちろん幸福です、親愛なるコンピュータ。
c++で for(int n=0;n<1;n++) func(); for(n=0;n<1;n++) func(); みたいなfor()の括弧内での変数の宣言のスコープって括弧内とそのforループ内に限定されますよね。 これって昔のバージョンだとforのブロック内でも有効だったりしました?(下のforでも有効だった?)
>>838 C++ の仕様決定以前に先走り実装されたコンパイラはそうなってたりする。
MS VC++ 6.0 とか。
C++でC#同様にインテリセンスを働かせる方法ってないですか? いちいちALT→押すのが面倒です。
何を使ってるかわからんもん
プリコンパイル済みヘッダを複数指定することは出来ますか?
843 :
デフォルトの名無しさん :2008/07/16(水) 15:14:24
#ifdef XXX #endif で囲まれた部分がコンパイルされたかをコンパイル時に簡単に知る方法を教えてください
>>843 #ifdefと#endifの間に#errorと書く
>>843 XXX_defined とか XXX_undefined ってグローバル変数を定義しておいて
オブジェクの中に該当シンボルが存在するか否かを調べる
もしくは
コンパイラにアセンブラソース吐かして眺めてみる
もしくは
出来上がったオブジェクトファイルの逆アセンブルリストを眺める
>>845 すまんコンパイル時っての見てなかった。忘れてくれ
#errorだとそこでコンパイルが終了してしまうかも。 実害のない警告が出るようにしておけばいい。たとえば #ifdef XXX #define XXX_DEFINED 0 #define XXX_DEFINED 1 ... #endif
うわー、意味ねーw
std::tr1::unordered_mapを使わないといけないんですが現在の環境(gcc3)には入っていません。 これはどのライブラリに入っていますか?
>>850 STLportにありました。ありがとうございます。
>>849 std::map じゃなくて unordered_map を「使わないといけない」状況って、どんなの?
>>852 ビルドしようとしたソフトがunordered_mapを使っていたからですよ。
vc++のデバッグの仕方が分からないんだけど c#のconsole.writelineみたいにvcのデバッガに出力する方法ってないの? outputdebugstring()とかやっても出てこないんだけど。
>>854 MFCを使ってるならTRACEマクロ
ATLを使ってるならATLTRACEマクロ
WIN32APIだけならOutputDebugStringをじかに使う。
C++・CLIならC#と同じのが使える。
857 :
デフォルトの名無しさん :2008/07/24(木) 17:21:59
最近勉強始めた初心者です。すっげー初歩の質問で悪いんですけど、 関数の宣言のとこで、引き値とか戻り値とかそれ自体の説明は 分かるんですけど、その使い分けの所がいまいちピンとこなくて。 例えばint main(void)とintとかその辺自体は分かるんですけど、 返り値が無いならvoidとかの説明で、じゃあなんで このときはvoid使わないんだとか、自分が一からプログラム組むと仮定して考えた場合、 その辺の区分けと言うか、使い分けが明瞭に納得がいかなくて。 いろんな解説読み漁ったんですけど、はっきり分かんなくて。
>>857 引数は渡すもの、戻り値は返すもの。
渡すパラメータがなければ引数はvoid、返す結果がなければ戻り値はvoid、両方何もなければ両方void。
自分で1からプログラムを組む場合、関数がどのようなパラメータを取ってどのような結果を返すかは、自分の都合と独断と偏見で勝手に決める。
例えば・・・ファイルに文字列を書き込む関数を作ることにしたとすると、その関数にはたぶんファイル名と書き込む文字列を指定する必要があるだろう。
ファイル名が固定なら、書き込む文字列だけ指定すればいいかもしれない。
結果は特に何も要らないかもしれないし、書き込みに成功したか失敗したか知りたいかもしれない。
それは自分が (別の人が使う関数なら、その人が) どういった機能を必要としているかによって決める。
フルバージョンならたぶんこんな感じ
int write_text_to_file(const char *filename, const char *text);
成功/失敗といった結果は別に要らないと思ったなら、戻り値はvoidにして
void write_text_to_file(const char *filename, const char *text);
ファイル名は固定なので特に指定する必要はないと考えるなら、その部分は削って
void write_text_to_file(const char *text);
実は文字列も固定なんだ、って場合は、何も指定するものがないので
void write_text_to_file(void);
自分は引数voidの関数は滅多に作らないな。 グローバル変数使えば引数で渡さなくてもいいけど、 何をする関数なのかわかりにくくなるし。
渡す情報が要らないからvoidなんですよ。
そうそう、time()なんて愚の骨頂ですよ。
渡すものがなかったら、かわいい君に寄せる想いを僕調の曲にして渡せばいいじゃない。
>>862 華麗にスルーされる訳ですね。わかります。
cin を使った入力ってメモリからあふれる位いっぱい入力した場合 バッファアンダーランとかになったりするの?
なりません。そもそも、バッファアンダーランなんて現象自体、データストレージに関するものです。
866 :
デフォルトの名無しさん :2008/08/03(日) 13:30:11
Access Violationが出ているのですが、 これはそのプロセスが確保していないメモリ空間から読み込もうと したときに出るのですが?
確保してない領域に書き込もうとしたときも出るし 確保されてても読み取り専用領域に書き込もうとしたときも出る
>>866 そんなもん、環境によって違います。そもそも出ない環境だってたくさんあります。
いつのまにかスタック領域がプログラムやデータを侵蝕して暴走を引き起こしていたあの頃を思い出します。 comファイルって、プログラムと同一セグメント内にスタック領域を確保するから、 プログラムとデータが大きいとすぐに侵蝕しちゃうんだよね。
gccを使いたいんだけど、どれをインストールすればいいの? 日本語バージョンてないの?
>>870 Linuxならデフォルトで入ってる
WindowsならMinGWをインストールする
Macなら知らない
BSD/Solarisなどの*nix系なら標準で入ってる可能性が高い。
873 :
870 :2008/08/04(月) 11:04:59
レスどうもです。 OSを書き忘れてましたが、WinXPです。 GCCにはいろいろ亜種があるということかな? どれが標準てこともないの?
>>873 MinGWはあくまでgccを簡単にインストールするためのパッケージ。
gccであることに変わりはない。
gccのバージョン違いはたくさんあるね。3.4とか4.1とか。
>>873 擬似Unix環境ごとインストールするならcygwinという選択もある。
876 :
870 :2008/08/04(月) 11:38:46
重ね重ね、どうもです。 MSYSなるものもありますね。 プログラミング目的ならMinGWとMSYSでいいのかな。
これでMinGWとMSYSで作るものが単純なテキスト処理だったり数値処理だったりしたら大笑いだな。
MSYSって日本語表示できないんだけど、どうにかならない?
rxvt の引数を変えて、日本語フォントにすればいいのでは
経過報告 MSゴシックだとうまく表示されなかった。 ぐぐってみてTerminal-14にしてみたけど、やっぱりうまく表示されなかた。 試したコマンド: ls /c/winnt MSYS 1.0.10 rxvt 2.7.2 export LANG=ja_JP.Shift_jis とかやってもダメだった。 どうも根本的に何かを間違えてるのかなあ。 ま、いっか。
>>881 -fn "MS ゴシック"-12
ls --show-control-chars /c/winnt
確認したら、LF改行コードのファイル~/.profile に
alias ls='ls --show-control-chars' を追加しておく
>>882 ありがとう。
でも、俺の環境じゃ
ls --show-control-chars /c/winnt だと半角カナ混じりで化けた。
こんな具合いに: "ほげほげ.txt" → "・ル・ー・・ル・ー・.txt"
御協力感謝。
rxvt使わないで、コマンドプロンプト上でmsys使うと良いよ。 cygtermみたいなのがmsysにあるともっといいんだけど。
OS:Windows、コンパイラー:VC2005です。 CPUのクロック数を変化させる、もっとも簡単なコードを教えてください。
int main(void){ while(1) {} } 対応CPUならこれでクロック上がる
感動した
クロックが上がるっつーか、CPUが音を上げそうだな。
最近のだとスレッドで何本かまわさないとね
最近のは他のコアが休んでるときはクロックあがるんだぜ
なるほど!コロンブスのたまごですね。 クロックダウンのコード聞いたのですが・・・
#include <stdio.h> void main(void) { char i[256]; FILE* fp=fopen("C:\con\con","rb"); fread(&i, 1, 256, fp); fclose(fp); } 対応OSならこれでクロック下がる
C++で char* を バイト配列に変換するにはどうすればよいのでしょうか。 ちなみにchar*の中身は日本語文字列です。
char*の中身はすでにバイト配列です 変換する必要はありません
>>895 char配列とbyte配列はちがうような、、、
charは1バイトの整数 charの配列は1バイト整数の配列すなわちバイト配列 何が違うというのか
byteなんて型はないから 大概charをtypedefしたものなんじゃない?
一応言っておくが、もしC#やJavaからやってきたというのなら、 それらの言語のcharに相当するC++の型はwchar_tだ。 wchar_t配列と(それらの言語でのバイト配列に相当する)char配列との変換には mbstowcs, wcstombs関数がまあまあ手軽に使える。 もちろんwchar_tの入出力で間に変換が噛まされるのはC++でも同じだ。
900 :
デフォルトの名無しさん :2008/08/13(水) 23:56:04
C言語のマクロについて質問です、詳しい方助言ください。 __mulk(4) と記述することで、 "movl 4(%ebx),%eax \n" という文字列( " "も含む)を吐き出すマクロを作りたいのですが、 次のように考えた結果これはうまくいきませんでした。 #define LTR(STR) #STR #define COMMA , #define __mulk(A) LTR(movl A ## (%ebx) ## COMMA ## %%eax \n) カンマをそのまま書いてしまうとマクロ__mulkが2つの引数を持っていると解釈されてしまうようです。 この回避方法はあるのでしょうか?環境はLinux,gcc 4.3.1です。
#define __mulk(A) "movl " #A "(%ebx),%eax \n"
>>901 なるほど・・・すばらしい。
どうもありがとうございました。
プログラム実行時に引数を何も入力しなかった場合に、デフォルト引数を使いたいのですが、 どうもnullが入ってしまっていて、デフォルト引数が使えません。 どうすれば、デフォルト引数を使えるようになるか、教えていただけませんでしょうか。。。 int main (int argc,char *argv[]) { abc(argv[1]); ・・・・・ void abc(char *str = "STRING") { ・・・
>>903 これではだめ?
if (argc >= 2)
abc(argv[1]);
else
abc();
905 :
903 :2008/08/14(木) 12:07:56
>>904 早速の回答ありがとうございます。
すいません。書くのを忘れてました。。。
main文は他の誰かが書くとかで、できたら関数(abc)の中で処理したいのですがいい方法ありませんでしょうか。
void abc(char *str) { if (str == NULL) str = "STRING"; ... }
デフォルト引数にこだわる意味がわからん
標準C/C++に準拠したコンパイラなら argv[argc] == NULL だから
>>906 で大丈夫だな
909 :
903 :2008/08/14(木) 13:05:15
>>906 ,908
無事できました!ありがとうございます。
>>907 C++のデフォルト引数が便利そうだったので、使ってみたかっただけでした。。。すいません
デフォルト引数は、NULLのとき代わりに、という意味ではないよ 引数を渡さなかったときに使われるもの argv[1]を渡せばargv[1]が渡る
911 :
903 :2008/08/14(木) 13:12:19
なるほど、、そういう意味だったのですね いろいろとありがとうございました。
コンストラクタやコピーコンストラクタでメモリの確保に失敗したら どうすればいいですか?例外をなげたほうがいいのか、 成功か失敗のフラグをクラス内部でもつのか、作成及び複製専用の 関数を用意したほうがいいのかよくわかりません。 できれば、コンストラクタで失敗したならそのインスタンスは無効であることを 戻り値で返せればいいんですが無理ですよね。
自分で投げなくてもnewに失敗したら勝手にstd::bad_alloc投げると思うけど
unicodeって文字コード統一する目的で作られたんでしょ? なんでいくつも形式が存在するの?
>>914 1文字に4バイトも食うからそりゃ敬遠するでしょ
>>914 キャラクタセットとエンコーディングは区別しろよ
if(A&&B&&C){...} if(A){ if(B){ if(C){...} } } これだったらどっちが高速なのですか?
なんでそんなに高速性を気にする?
完全に興味本位です。
>>918 生成されるコードを見るしかない。
コンパイラによって違うかもしれない。
だが多分ショートサーキットを考慮すれば同じコードを吐くだろう。
なるほど。 ありがとうございます。非常に勉強になりました。
コンテナに入れたデータを一定の時間間隔で処理するために コールバッククラスのインスタンスでイテレータを保持するようにしたんだけど、 これってどう思う? for (Hoge::iterator i = hoge.begin(); i != hoge.end(); ++i) みたいな、その場のループで使い捨てする用途しか今まで見たことがなくて、ちょっと不安。 要素が増えも減りもしないことが分かっている場合は、ポインタと同じ感覚でいいのかな?
>>923 どういうときにイテレータが無効になるかをきちんと把握して、
(ちなみにこれはコンテナの種類によって異なる)
自分も他人もそういうコードを書かないという確信があるならそれでいいんじゃない?
普通にコンテナのポインタなり参照なりを保持させればいいと思うけど、
それじゃ無理なわけ?
>>924 コンテナの要素をどこまで処理したか覚えておきたいんだ。
wavのストリーム再生をイメージしてもらえれば近いかな。
コンテナのポインタなり参照なりを保持するとして、どうすればいいのか分からないです。
>>925 コンテナの中身が書き換わらないならイテレータは無効にならない
>>926 じゃぁ今回はイテレータ保持のままでいいか。どうもありがとう。
もっと色んなソース読んでみないとなぁ。自分のしていることが一般的なのか分からなくて不安。
Cのif文について質問です if(a>0xffffffff){ 命令; } とするとコンパイラが 条件が常に真 と警告を吐きますが 普通に動作します また -1(0xffffffff) を -2(0xfffffffe) に変えるとその警告は無くなります 変数 a はunsigned int型です なぜこの警告は出るのでしょうか。
>>929 でも普通にその条件式が動作するのは何でなんだぜ?
>>930 条件式の結果が真であることは誤動作じゃないだろ。
常に偽という気がする。
>>928 おまえんとこのunsigned intの範囲が0から0xffffffffなんだろう。
a>0xffffffffという条件はaがどんな値でも成り立たない。
だからのその命令;は絶対に実行されない。
だったら初めからifなんて書くなよ無駄だからというのがその警告だ。
0xfffffffeにすると、aが0xffffffffの場合だけそこが実行されるという
意味のあるif文が出来上がるので、警告にならない。
あと、0xffffffffは-1ではない、4294967295だ。0xfffffffeも同様に4294967294。
>>934 ガチですまん
俺ホント馬鹿
吊ってくる
無駄だからというより、なんか間違っていないかって注意を促す意味合いのほうがおっきい気がしてきた。
>>934 ばーか。コンパイラが「常に真」と言ってるんだよ。なにが「常に偽という気がする」だよ。
>>937 いやだってa>0xffffffffが常に偽になる場合は容易に思い付いたけど、
常に真になる状態は考え付かなかったから。
常に真でも偽でも同じメッセージを使い回しているだけだろうと思うことにした。
sizeof(unsigned int)よりもsizeof(unsigned long int)の方が大きい環境なら、常に真になるんだけどね。
なかなか面白いジョークだな
>>928 とりあえずコンパイラとバージョン教えて。試してみたいから。
フォントが小さいので 常に夏 に見えて仕方ない イヤなスレだなぁ・・・と思ったらイヤなのは俺だった
VCなんですが、例外処理 (初回) は test2.exe にあります: 0xC0000005: Access Violation。とでます。 ループの回数を減らせば通るのですが、ループ数を減らさずに 実行するにはどうすればよいでしょうか? iのループは60、jのループは1500程度です。 for(i=0; i < font->Tnum; i++){ // 1ブロックのフォント収録数 fontnum = font->Block[i].End - font->Block[i].Start; fputs("const char data[] = {\r\n\t", fp); for(j = 0; j < fontnum * 24; j++){ // 1ブロックのフォント分繰り返す */ dt = *p++; fputs("0x", fp); sprintf(tmp, "%02x", dt); tmp[2] = 0; fputs(tmp, fp); fputs(", ", fp); ct++; if(ct == 8){ // 改行 fputs("\r\n\t", fp); ct = 0; } } fputs("}\r\n\t", fp); }
>>943 デバッグすればいいよ・・・・・・・・・・・・・・・・・・
ソース生成しているのか。くだらんなぁ。それはさておき、こりゃ酷い。 -- fputs("0x", fp); sprintf(tmp, "%02x", dt); tmp[2] = 0; fputs(tmp, fp); fputs(", ", fp); -- fprintf(fp, "0x%02x, ", dt)で事が足りるだろうに。処で、tmpはどう宣言されているんだ?
c++使ってるといちいち型変換がめんどくさいんだけど 一番簡単な方法はboostの変換ライブラリ使う事? 他にいい方法があれば教えてください。
sendmessageでwm_copydataが送れないんですけど、 何かプロジェクトの設定とかが必要だったりします? 他のメッセージは送れるんですがこれはデータのコピーとかやってるのでその辺でこけてるのかなあと。
GetLastErrorで原因調べた?
949 :
947 :2008/08/29(金) 15:25:28
sendmessageなのにスレッドループで捕まえようとしてました 解決しました
950 :
デフォルトの名無しさん :2008/08/30(土) 07:51:33
オブジェクトのメソッドの呼び出し規約ってどうなるんですか?
951 :
デフォルトの名無しさん :2008/08/31(日) 12:07:46
>>945 >>943 ほどの低レベルなコードを書く奴ならどうせchar*tmp;と宣言していると予想
953 :
デフォルトの名無しさん :2008/09/01(月) 08:01:13
printfなどでの書式指定で、たとえば0.123の場合、 最初の0をつけずに、.123の様になるようにするには どのように指定したらよいのでしょうか
"%.3f"
文字列を入力するときの例は、配列を使うものしか見たこと無いのですが、 文字列を入力する場合は、常に配列を使わなければならないのでしょうか。 たとえば、宣言は、 char st[100]; とかの例を見たりしますが、 char st; だけじゃ不都合があるのでしょうか。文字が一文字しか入らないとか。。。
文字列 = 文字の配列 と思えばとりあえずなんとかなる
>>955 Cには文字列形がないので、文字型の配列などに格納する必要がある。
文字型変数であるchar stには、当然ながら一文字しか入らない。
958 :
デフォルトの名無しさん :2008/09/01(月) 21:53:28
どなたかこの低脳野郎に知恵を授けてください・・・。実はいまC言語を学んでいるのですが C言語はソフト開発が出来るのでしょうか?(窓の杜にあるようなやつ) 回答お願いします。
低脳にもほどがある
>>958 アインシュタインは紙と鉛筆で相対性理論を完成させたかもしれないが、俺にはできない。
たしかに偉大な先人達はCで作ったソフトを窓の杜に投稿したかもしれないが、
その軌跡を今の私たちが無理してなぞる必要は無いと思わないか。
ということで、もっと楽ちんな言語使おうぜ。
C++とか。
961 :
デフォルトの名無しさん :2008/09/01(月) 22:48:25
>>960 ありがとうございます。偉大な人とはいえ結局は人ですからがんばって見ます。
がんばって何を見るというのだろう……
そりゃあ、おい、青少年ががんばって見るといえばアレしかないだろ。 まぁ俺からのアドバイスとしては薄目にしても効果はないということだ。
fopenとかで取るファイルポインタって解放せずにプログラム終了したら不味いことある? DBのコネクションは解放しなかったらいつまでも接続残って不味いとかはわかるんだけど メモリにリソースが残ったままになるとかあるのかな?
開きっぱなしになってOSを再起動するまでファイルを削除できないってことは昔はあったwindowsの話だけど 今は・・・無いのかな?
>>965 exit()の中でfcloseall()している筈だから大丈夫。
>.>966
削除までは確認してませんでした。時間あるときやってみます
>>967 CreateThreadでhoge関数を別のスレッドで動かす。
hoge関数内でファイルポインタを開く。
hoge関数がファイルポインタを持った状態で、
別の関数からCloseHandleでhoge関数を終了させた場合ってどうなんでしょうか?
Windowsもプロセス終了時にファイルハンドルは全部閉じられるので平気。
CloseHandle()ではスレッドを強制終了させられないから大丈夫。
>>969-970 レスありです
CreateThread使い出して気になったんで助かりました
ないよ
ファイル移動で、フォルダ内の不特定多数のファイルを 別のフォルダに移動するってどうやりますか?? MoveFileじゃできませんでした・・・
掃き溜めっぽくていいね。
>>973 system("move c:\\*.* d:\\*.*")
C言語はXPのPCで勉強できますか? 教えてください。
できます。ついでに言うと、 それくらいのことは、ここで聞いていないでググればもっと早く分かる。
質問です。以下はどちらもchar型の変数です。 // データ部 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?
>>978 char型なら16バイト。それ以外の解釈の仕様が無い。
>>978 sizeof(char) == 1
なら上に同じく
16バイト
>>980 >sizeof(char) == 1
当たり前です。
sizeofはバイト数を返すと定義されてるわけではありません。
983 :
デフォルトの名無しさん :2008/09/13(土) 03:23:41
sizeofが返すのはbyte数であることと、sizeof(char)が1であることは規格で決められています。 ただし、これは言語上での定義なので、32bitのことを言語上では「1バイト」ということもありえます。
printfで浮動小数点型を表示する書式としてfとeとgがありますが、 私はgが気に入っています。 このままずっとgを使い続けて問題ありませんか?
>>985 私も%g推奨派ですが、出力フォーマットが仕様で決まっている場合などは%fを使うこともあります。
尤も、その場合は%9.3fなどの幅指定が入るわけで、生のままの%fを使うことは有り得ません。
そんなわけで、特に指定が無い出力に%gを使うのは蓋し妥当と言えましょう。
>>986 ありがとうございます。
特に指定がない限り%gのままでやっていきます。
>>983 sizeof(char)は1であり、sizeofはsizeof(char)の何倍かを返す。
単位がバイトであるとは規定されていない。
1バイトが何ビットか決められていないのとは、また、別の話。
>>988 バイトってはっきりかいてあるだろ
ただc言語の上では1byte=8bitとは限らないってだけで
C89の話じゃないのか?
991 :
デフォルトの名無しさん :2008/09/13(土) 17:28:39
>>988 古い規格だと、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すれに誤爆しちゃった・・・(´・ω・`)
別にC99でも同じ話。 6.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.
993 :
978 :
2008/09/13(土) 21:33:38 自己解決しました^^