【初心者歓迎】C/C++室 Ver.11【環境依存OK】
2 :
デフォルトの名無しさん:04/10/31 11:37:27
終了します
リクエストにお応えして新スレ立てました。
目についたところはリンクを張り替えましたが、
至らない点などございましたらご容赦ください。
>>2 再開します
要はmcが消失したテンポラリを参照しているから動作は不定
スマン
いじってるうちに勘違いしてたようだ
前スレ999と8取り消す
惑わして御免
再チャレンジ
こんな感じでx[i]がdouble *のテンポラリを作ってるような気がする
#include <iostream>
#include <iomanip>
#include <memory>
using namespace std;
template<class Container>
class Tester {
const Container& mc;
int mn;
Tester();
public:
Tester(const Container& c, int n): mc(c), mn(n) {}
void disp() {for (int i=0; i<mn; i++) cout << setw(3) << mc[i]; cout << endl;}
};
int main() {
enum { N=3, n=10 };
double x[N][n];
for (int i=0; i<N; i++) for (int j=0; j<n; j++) {x[i][j] = n*i + j;}
auto_ptr< Tester<double*> > p[N];
for (int i=0; i<N; i++) {
double *tmp (static_cast <double *> (x[i]));
p[i].reset(new Tester<double*>(tmp, n));
}
for (int i=0; i<N; i++) {cout << "Tester[" << i << "]: "; p[i]->disp();}
return 0;
}
11 :
デフォルトの名無しさん:04/11/01 15:22:54
新しく機能つけるごとにバグがでてくるな
ウインドウズなんか作ってる人ってすごいな
まともに動くだけでもすばらしい
VisualC++.net2003で作ったアプリをビルドして友達に使ってもらおうと思ったんですが
95/98/ME環境の人のみ文字化けしてしまいます。
文字コードの問題?っと思うんですが、ビルド設定に見当たらないんですが
どうしたらいいですか?
newでメモリ確保に失敗することって本当にあるんですか?
>>14 メモリがなくなったりとかしたら当然失敗するでしょ
>>10 返事が遅くなり申し訳ございません。
なるほど……。
べたで展開した場合は、コンストラクタごとに別のテンポラリ変数を作って
それへの参照をコンストラクタに渡していたわけですね。for loop で記述
した場合はテンポラリ変数を使いまわして最適化を図っていたと……。
{ // for loop を再現するよう、べたに展開
int i=0;
double *tmp;
tmp = (static_cast <double *> (x[i]));
p[i].reset(new Tester<double*>(tmp, n)); // tmpへの参照で初期化
i++;
tmp = (static_cast <double *> (x[i]));
p[i].reset(new Tester<double*>(tmp, n));
i++;
tmp = (static_cast <double *> (x[i])); // tmpへの最後の代入
p[i].reset(new Tester<double*>(tmp, n));
}
しかし勝手にこんな展開をされるのは怖いなあ…。
一時変数は式の最後(';')の時点で寿命が尽きると理解していたのですが
意識を改めなければならないようです。解決。
わかり易い解を有り難うございました。また他の方々も親身になってお答え
くださり、まことに有り難うございました。
>>16 微妙に誤解してる気がするが...
配列とポインタは型が違うのよ
例)
int array [10]; int *pointer;
cout << (typeid (array) == typeid (pointer)) << endl;
結果: 0
Tester <double *>のコンストラクタにx[i]を渡すときに
x[i]は(double [10])から(double*)に暗黙の型変換が起こり(つまり一時変数)
コンストラクタのcはこの一時変数を参照する
そしてmcがcで初期化される
>一時変数は式の最後(';')の時点で寿命が尽きると理解していたのですが
この理解はあってるでしょ
寿命の尽きた一時変数をmcが参照しているので今回のようなことになるわけで
>17
>今回のようなこと
捕捉すると
つまり動作は不定
表示されたのはたまたま
>>14 俺っちはnewでメモリ確保に失敗なんて一度も無いけどな。
失敗した時のコードを書くのはスペースの無駄。
気にすんな。
>>19 そのプログラムを動かしながら、バックで何かとてつもなくメモリを食う
プログラムが動いていたとしたら?
そうでなかったとしてもそのプログラム自体がとてつもなくメモリを食うとしたら?
仮想メモリだのがあるOSを使ってるとばかみたいにメモリ確保できるから、
メモリ確保に失敗する前にむしろOSがおかしげになりそうではある。
DOSの頃は切実だったけど。
とてつもなくメモリを食うプログラムが
動いていてもメモリ確保出来ちゃうから
特に問題無い。
なんか、Cスレでもそうなのですが、freeは要らないとか、エラーチェックは要らない
とか、なんだか将来が心配ですね。
遊び程度ならそれで無問題。
>>24 あそびならむしろプロと違って切実な納期とかあるわけじゃないんだから、
ちゃんとこだわって書いていきたいと思う。
エラーチェックはある程度までで仕方ない点はあるけど、
freeはちゃんと書こうぜ。
>>25 俺はどっちかというとnewやmallocのメモリ確保失敗チェックを
しない、delete、freeをしない奴を揶揄して書いた。
それと24の書き込みは22宛て。時間見て。
そんなのはどうでもいいけど、確保失敗チェックを行って
そのチェックに引っかかったことはあるの?
>>27 開発中は正常に動作し、テスト中も正常に動作し、一番大事な顧客の前で突然
動かなくなる。
それはメモリ確保の失敗が原因なのか、
他の原因なのか。
ユーザはそのソフトをどのように使うか解からないし、長時間かけないと
解からないこともあります。
フリーウェアであっても同じ事がいえます。
使う人間が増えればそれだけ露見することも多いでしょう。
エラーがどこかということは発生してみないとわかりません。
解からない以上、知りうる限りの対策を予め講じておかなければなりません。
エラーが発生して被害を受けるのは顧客だけでなく開発者もそうなのです。
と、言ってしまってから気づきましたが、一つのオブジェクトだけをnewする
場合は、多くの場合、エラーチェックすると「やりすぎ」かもしれません。
上述はたくさんのオブジェクトをnewする時だけの話です。
new/deleteは必ずペアで使う、というのは変わりませんが。
必死ですね。w
>>34 必死だよ
だって、おみやげの梅ケ枝餅全部食べられたんやもん。
まぁ、生でnew/deleteなんて使わないでコンストラクタでnew、デストラクタでdeleteしてれば
意識する必要もないわけだが。
#精々APIで終了してしまってデストラクタを通らないなんて事が無いよう気にするくらい。
set_new_handlerだっけか
38 :
デフォルトの名無しさん:04/11/02 12:17:39
機能追加のために数百カ所書き加えないといけないはめに…
やっぱ地道に書くしかないのかな…
最近こんなんばっか
ここはお前の日記帳じゃないんだ
愚痴をこぼす前に手を動かせ、な!
>>23 プロセス消滅前に態々 free する莫迦の存在が寧ろ心配なんですが。
Visual C++.netを使用して、
VisualC++プロジェクト→.NET→コンソールアプリケーション
で下記を作成し、ウォッチで"tmp->c"を参照しても、2次元配列
の中身が参照できません。
#include "stdafx.h"
#using <mscorlib.dll>
using namespace System;
typedef struct{
int a;
int b;
int c[5][2];
}AAA;
AAA aaa;
int _tmain()
{
AAA *tmp;
tmp = &aaa;
return 0;
}
VisualC++プロジェクト→Win32→Win32コンソールプロジェクト
で作成すると、参照できるのですが、.NETの方で参照できる
方法はあれば、教えて下さい。
>>40 なるべくプログラムを部品化して再利用した方がコストがかからなくて良い、
というのは賛成していただけるのでしょうか。
もし、賛成していただけるとしたら、その部品がなるべくどの環境でも正常な
動作を期待したいと思うでしょう?
OS任せ→環境依存→再利用が困難→一から作らないといけない→コスト増し
>>40 もちろん
>>42の意見は当然なんだけど、
それ以前に「開けたら閉める」ってのは普通の感性だと思うんだけど。
44 :
デフォルトの名無しさん:04/11/02 19:19:59
デザインパターンの勉強に、あるHPのサンプルコードを参考にさせてもらってるのだけど、
class A
{
public:
virtual void NamePuts() = 0 ;
} ;
class B
{
public:
A* m_low ;
B( A* in )
: m_low( in ) //←
{}
virtual void Puts() = 0 ;
} ;
の、
B( A* in )
: m_low( in )
ってのが、解りません。継承した基本クラスのコンストラクタに値を渡すような書式だけど、
継承してないし、メンバのAのポインタだし…。
: m_low( in )の部分を取ってコンパイルしてみてもエラーは出ませんでしたが、
実行中にエラーがでました。
値を代入しているようには思えますが、どういった意味なんでしょうか?
ちなみに、Bridgeパターンです。
サイト見る前に基礎を学べよ
class Bのメンバをコンストラクタの引数で初期化してる
つーかそれ以外にどういう解釈があるんだ
>>45 継承ではなくてコンポジション(包含)だろ。デザパタ以前にもう少しクラスの
お勉強をした方がいいね。
>>46,47
コンポジションてのは初めて聞きました。OTL
クラスの基礎、もう一度見直したいと思います。
ありがとうございました。
>>42 「プロセス消滅前」と言っている。つか、何で部品化云々の話が?
>OS任せ→環境依存
リソースをマトモに管理できない環境でメモリヒープ使う事自体が自殺行為。
>>43 malloc/calloc/realloc が「開ける」とするなら
free は「閉めた事にする」なんだが。
うわ、なんかマジでfreeネタやってやがるっ!
>>52 ごめんごめん、もう止めるから。
次回からは俺俺で。
環境:W2K VC++6.0
short型にint型を代入すると、警告レベル4だと警告出るじゃん。
その警告出さない為に、あらかじめshort型で宣言しておきたいんだけど、どうやって宣言すればいいの?
実際は、MSXMLのIXMLDOMDocument2Ptr::preserveWhiteSpaceにVARIANT_BOOL型で代入すると
警告が出るんだけど、VARIANT_BOOLのVARIANT_TRUEって(VARIANT_BOOL)0xffffでdefineされてんだよね。
んで、preserveWhiteSpaceはshort型なもんで、警告がでるの。大丈夫かMS。
この警告を巧く消す方法ってないかな?
なにが「大丈夫か」なのかな。
警告の意味ないじゃん
警告消したら警告の意味ないじゃん
>>55 別にpreserveWhiteSpaceメンバはshortである必要がないじゃん。
必要か、「VARIANT_BOOL型で代入する」必要はあるの?
>>48 topというコマンドが私のやろうとしている事を行っているみたいですね。
即レスありがとうございましたm(__)m
>>59 必要ない。
ので、別にオールビット立っている直値でも突っ込みたい気分なんだがそれをやっても警告は消えない。
short型で宣言して値を初期化しようとした段階でエラーになるんだよ・・・。
short hoge = 0xffff; <-警告発生
どうやりゃいいの?
true
C++によるプログラミングをはじめてみようと思っている者です。
手元にある書籍は、エディタにコードをうち、Borlandのコンパイラにかけてプログラムを作っていくものです。
これは覚えていくことで将来的にGUIアプリケーションは作成できるものなのでしょうか?
もしかしたらVisualC++などを買わないとGUIは作成できないのではないかと不安です。
>>64 GUIプログラミングをするのは結構ですが、何か目的あってのことですか?
とりあえずGUIであても無く何かを作りたいと思っているだけでしたら、
そういう考えは捨て、もっと有益なテーマを見つけてからプログラミング
に取り掛かることをお薦めします。
例えば、手書き文字認識に興味があって、その入力ツールを作るために
GUIがどうしても必要だ、ということになって始めてGUIの書き方を学ぶと
良いでしょう。
もっとも、GUIのしくみ自体に興味があるのでしたら、それでも構いませんが。
さて、GUIアプリケーションを作るにあたって、WindowsでしたらWin32API
を使って書けばウインドウを開いたり、一般的なGUIと言えるインターフェース
を構築することは可能です。
Win32APIを扱うためにはVC++でなければならないわけではなく、BorlandC++Compiler(以下BCC)
のような無償のコンパイラでも全く問題なくコンパイルできます。
VC++を使うことのメリットは統合開発環境としてのVC++を利用できる点で、
BCCのような多くの無償コンパイラに付属していない便利な機能が付属しています。
何が便利かというと検索していただければすぐに解かります。
BCCを使うことのメリットは統合開発環境としてのBCCを利用できる点で、
VC++のようなMSコンパイラに付属していない便利な機能が付属しています。
何が便利かというと検索していただければすぐに解かります。
ちょっと考えてみた
short hoge = ~0;
ダメだよな
72 :
デフォルトの名無しさん:04/11/02 21:57:51
#include <stdio.h>
#include <windows.h>
#include <windowsx.h>
int main()
{
int d,e,f;
bool a,b,c;
d=0,e=0,f=0;
a=(d!=0);
b=(e!=0);
c=(f!=0);
if (a||(b&&c))
{
printf("%d\n" , 777);
}
else
{
printf("%d\n" , 999);
}
}
を実行すると
error C2065: 'a' : 定義されていない識別子です。
error C2065: 'b' : 定義されていない識別子です。
error C2065: 'bool' : 定義されていない識別子です。
error C2065: 'c' : 定義されていない識別子です。
error C2143: 構文エラー : ';' が '識別子' の前にありません。
:error C2144: 構文エラー : '<不明>' は '<不明>' によって先行されなければなりません
error C2144: 構文エラー : '<不明>' は '<不明>' によって先行されなければなりません。
error C2146: 構文エラー : ';' が、識別子 'a' の前に必要です。
というエラーが出ます
なぜでしょうか?
>>73 拡張子をcppに変更したらいけました
ありがとうございました
75 :
デフォルトの名無しさん:04/11/02 22:29:14
c++ の質問です。
CString *s[] = new CString[10];
delete[] s; // 質問:どうして delete s; では駄目なの?
>>75 newならばdelete、new[]ならばdelete[]。
1つと複数では、確保の方法が違う(実装がある)場合があるから
区別が必要。考えるのが面倒臭ければ1つの領域を確保する場合に
new[1]とすることもできるけれども、あまりお勧めしない。
78 :
デフォルトの名無しさん:04/11/02 22:46:42
79 :
デフォルトの名無しさん:04/11/02 22:54:26
>>77 本当の正しい答えを知ってるけど、もったいないから教えてげないよ。
>>75 もういいから、本を買えよ。
EffectiveC++くらい持っていても存はないよ。
プログラミング言語C++に
(double(rand())/RAND_MAX)
という記述があったのですが rand() を囲っている double にはどういう意味があるんでしょうか?
C++スタイルのキャスト
気になるなら
static_cast<double>(rand())
とフィルタしとけ
83 :
マイク ◆yrBrqfF1Ew :04/11/02 23:20:27
>質問:どうして delete s; では駄目なの?
そういうものだから。
あとsの宣言・定義時の[]もいらない。
>>64 まず言語仕様を覚えることから始めないとどうしようもなかんべ。
それをきっちり身に付けてからGUIに逝け。
基本を身に付けずにVCにいくと、何か一つしようとするたびに
ここで質問にしなければ手が出ないようなことになるぞ。
>>70 統合開発環境はBCBだべ。
85 :
デフォルトの名無しさん:04/11/03 11:28:02
ある程度でかくなったプログラムはまるで生き物みたいに動き出すね
86 :
デフォルトの名無しさん:04/11/03 13:13:31
(void)(*test)->GetErrorName(&errnum_str);
C言語のサンプルコードなのですが、
visual studio.net2003で拡張子を.c -> .cppにしてコンパイルするとエラーがでてしまいます。
こういうコードはC++ではエラーになってしまって通らないのですが、どうしたらいいでしょうか?
>>86 そこ1行だけじゃ良くわからないが、どこかをキャストすればいいような気がする。
>>81 double 入れないと、常に 0 になっちゃう。C の基本だよ。
89 :
デフォルトの名無しさん:04/11/03 15:28:26
プログラム実行中にたまに
"pure virtual function called"
と言うエラーが出るのですが原因は何でしょうか?
純粋仮想関数絡みみたいですが対策がわかりません
VC6,SP5適用済みです
>>89 実装の与えられていない仮想関数が呼び出されたってこと。
purecall でウェブ検索してみるといい。
>>86 どんなエラーが出るのか書きなされ。
たぶん、その文を少し修正するだけで C++ でもとおると思われるが。
最初の (void) は不要なんでは?
ICUを利用するとブレークポイントが置けなくなるのですが
解決策しってる人 教えてください
>91
おかげさまで解決できそうです。
回答ありがとうございました
ごめんなさい開発環境書き忘れ VC6.0です。
ICUはソレ
http://oss.software.ibm.com/icu/ です。バイナリ版使うとブレークポイントが使えなくなる
ソースからBuildしてデバッグライブラリを明示的にLinkしたけどダメ
STLportとBoost使ってますが ICUのビルドではSTLportでコンパイルできなかったので
ICUのBuildには 標準のSTLを利用しました
>>96 何かプログラムを作っていて、
そこからライブラリを利用しており、
プログラムのコード上にブレークを置けない
ということですか?
#include <unicode/ucnv.h>
を書くと、プログラム上にブレークポイント置いても
ブレークポイントが無効にされてしまうんです。
>>98 原因がわからなくてすまんけど、
VC6 って、プロジェクトファイル (.dsp) が不適切だと、
デバッグビルドでもブレーク置けないことがあるよ。
そういうときは、プロジェクトを作り直すと直ることがある。
100 :
93:04/11/03 16:36:52
解決しました
原因は結局よくわかりませんでしたが
Includeの順番を入れ替えたりしているうちに直ったのですが
その後再現性が全くないのです・・・
単に運が悪かったのかもしれません お付き合いありがとうございました
(;´Д`)…
Windowsアプリケーションを作りたくてプログラミングを勉強しはじめてC++の基礎を
だいたい知ったのですがこの先APIをすっとばしてMFCから学び始めるってのはアリなんでしょうか?
103 :
モモ:04/11/03 18:56:32
>>102 API を先に勉強するほうがいいと思うよ。
MFC ってこの先将来性あるのかな。
104 :
デフォルトの名無しさん:04/11/03 19:19:04
MFCってなんですか?
MFCは使わない方がいいんじゃない?
106 :
モモ:04/11/03 19:37:49
>>105 そう?何を使うほうがいいと思う?
私は BCB が好きだが。
GTK+。
Windowsは使わない。
API->WTLが良いと思う。
Win32系は全部将来消えることが確定してるから(MFCのようにやたら無意味に)苦労して覚える必要は無いと思う。
110 :
モモ:04/11/03 19:43:39
>>108 Win32 API だけって、実際の製品開発で使われているのかな?
Win32 API だけにするぐらいなら MFC 使うほうがいくらかましじゃないかい?
>>103 105
ふむふむAPIを勉強しておいたほうがいいんですね。
APIを学ぶ前にCも勉強しておいたほうがいいでしょうか?それともC++の知識があれば十分でしょうか?
112 :
モモ:04/11/03 19:45:48
>>111 C++ は C を含んでいるから、C++ を習得したら C も習得したと思っていい。
>>110 MFCで作っているアプリケーションは手抜き
>>109 >Win32系は全部将来消えることが確定してるから
(゚Д゚)ハァ?
オンラインゲームなどにあるチャット機能を作りたいと思ってるんですが、
IME制御の方法がよくわかりません。
サンプルも見つからないし;
詳しい方教えてください
スレ違いかどうかもわからん椰子がまともなものを作れるとは思えんが…
118 :
デフォルトの名無しさん:04/11/03 22:44:55
何行くらいになったらcppファイルを分割したほうがいいですか?
今のcppファイルは10000行近くあります
分割した方がいいかな?
行数で分けるな。
機能で分けろ。
うわぁ…1関数1000行とかあったりして。
122 :
デフォルトの名無しさん:04/11/03 22:51:09
>>119 >>120 クラスは使ってないので関数単位で分けるんですかね?
関数の数も10個くらいあるので分割すると10ファイルもできちゃいそうなんですが
それでもいいのでしょうか?
124 :
デフォルトの名無しさん:04/11/03 22:52:53
>>121 一関数につき千行以上あります
一つの関数はなるべくコンパクトにまとめたほうがいいんですか?
125 :
デフォルトの名無しさん:04/11/03 22:53:38
プログラミングを捨てるか、ファイルを捨てるか
漏れは前者をお薦めする
>>124 通りすがりの俺ですら捨てることをお薦めするぜ
129 :
デフォルトの名無しさん:04/11/03 23:07:17
なんで捨てなきゃいけないんですか?
理由を教えてください
プログラミングやめる、という手もあるぞ。
さすがにつりだろうなぁ。
天然だとしたら10年ぐらい植物人間してたのかね?
132 :
デフォルトの名無しさん:04/11/03 23:10:15
マジレスお願いします
いや、でもリアルであって欲しいってちょっと期待しちゃうな('A`*)
そのソースを渡されたら即効その組織から抜けるが
134 :
デフォルトの名無しさん:04/11/03 23:12:28
それ以上縮めようのない関数が多いので1000行超えてるんです
136 :
デフォルトの名無しさん:04/11/03 23:13:30
初心者だから仕方がないです
何するプログラムなの?
縮めようが無いなら、そのままにしとけ。
139 :
デフォルトの名無しさん:04/11/03 23:15:57
1000行より縮めようの無い関数なんて有り得ないな。
初心者ならそのコードは捨てて1から勉強しなおすべきだな。
まだやり直しはできるだろう。
移動ルーチン??
データファイルにでも追い出せそうなことをずらずらハードコードしてるとか?
143 :
デフォルトの名無しさん:04/11/03 23:24:44
条件1の場合
条件2の場合
・
・
・
という風に条件文がおおいので行数が多くなるんです
一行あたりの文字数は少ないですが
(´-`).。oO( 「条件別に関数化」とかは考えないんだろうか・・・・
(´-`).。oO(そろそろ"大漁"のAA登場してもいいんじゃないかな…
まさか藤原の翁の本のネタの如く、マウス座標の条件分けしてたりしないだろうなぁ。
147 :
デフォルトの名無しさん:04/11/03 23:33:47
>>144 関数にすると引数とかプロトタイプ宣言とかしないといけないんであまりやってませんでした
条件別にしたら一関数500行程度に収まりそうです
関数が多いと関数名考えないといけないのでそれもめんどくさいです
英語での銘々は苦手です
関数1つにつき25行までとする。
149 :
デフォルトの名無しさん:04/11/03 23:36:15
>>148 まじっすか?
関数が増えすぎると逆にぶちぶち切れててわかりずらくありませんか?
>>149 おまえプログラミングに向いてないわ
プログラミングを捨てる
これが正解だな
漏れには何も見えない
透明あぼーん設定してるわけでもないのに
あれ?なんか記憶が飛んでしまってるのかな…
>>149 関数が全部自分の頭に入る程度でなくてどうやってメンテナンスするんだ?
よっぽど優秀なエディタを使っているかよっぽど非効率なことやってるかどっちかだとは思うが。
>>149 とりあえず
>>135を全部読むまでもう書き込みするな。
ってか、まともに勉強してたら「関数は一目で把握できる長さ」って
常識なのだが。
いったいどういう勉強してきたのかね。
なんか一瞬そのソースを見てみたくなったぞ
一瞬だけな
155 :
デフォルトの名無しさん:04/11/03 23:52:44
>>152 できるだけ関数化してサイズを小さくしてみます
ソース分割する際に分割したソースファイルをフォルダに分けて管理したいんですが
勝手にフォルダにファイル入れてもコンパイルしてくれるんですか?
ファイルのパスとかも指定しないといけないんですかね?
156 :
デフォルトの名無しさん:04/11/03 23:55:18
大学生で、しかも研究室に所属してると予想
もしそうなら、もうじき社会へ旅立つのか…ガクブル
どっちっつうと、WEBの入門サイト読んで我流で勉強って気がする。
研究室なら周りから教えてもらえるからここまで酷くはならないだろう。
>>155 使ってる開発環境なりコンパイラなりのヘルプ嫁。
その前にまともな入門書をきちんと読め。
forでループすりゃ済むことを延々と展開してるとかね
関数化させる意味とかが分かって無いと
本気でこれ以上プログラム書くのはやめて勉強しなおした方が良いと思う
あとmakefileの存在忘れないであげて
162 :
デフォルトの名無しさん:04/11/04 00:09:52
書籍代はケチらんようにな
未来への投資だと思えば安い安い
しかし何でこういう質問する椰子ってageるんだろね
質問のときはageろというローカルルールのあるスレが2chに存在するから
質問のときにageるのはまったく問題ない。
というよりage,sage知らないのが大半だと思う
「質問のときはageろ」と「質問者はageろ」とは違う。
誰かマジで教えて。
サンプルある場所でもいいから。
MSDNみたけど、サンプルがないんですよ
>>116
>>169 サクラエディタのソースでも参考にしたら?
この辺でぐぐれ
imm32.dll
ImmGetContext
ImmSetOptionStatus
ImmReleaseContext
IME の返信ありー
検索して調べてみます
>>17 そうか。
ということは、参照渡しで参照メンバを初期化する場合は、
暗黙の型変換が起こらないように気をつけるか、それを監視する
コードが必要なわけですね。
どうやって監視すれば良いのか、ちと考えてみます。
細部にまでわたるご指摘、ありがとうございました。
# とりあえず explicit 宣言周りから調べてみます。
# コンストラクタで size 関数を呼び出して、STL コンテナに
# 型を制限するのは簡単なのですが、静的配列にも使えるように
# するのが一応のゴールなのです。配列型を struct でラップする
# しかないのかなあ。
174 :
デフォルトの名無しさん:04/11/04 12:08:54
VC6を使って、UNICODE変数をファイル出力行いたいと思っています。
ファイル出力形式はS-JISでもUNICODEでもいいのですが
変数がUNICODEなのでその方が楽だと思ってUNICODEで出力しています
wchar_twszTest[1000];
FILE *fp = _wfopen( L"c:\\temp\\aa.txt", L"w" );
fputws( L"AAAあいうえおBBB", fp );
fclose( fp );
と実行するとファイルには "AAA" しか出力されず、全角文字以降が無視されています
何を間違えているのかわからないのです。誰か教えて下さい
たぶん
setlocale( LC_ALL, "Japanese" );
176 :
174:04/11/04 12:27:14
177 :
デフォルトの名無しさん:04/11/04 14:22:37
VC++.NETを使っています。
最初から使わないことが分かっている関数をビルド時に
無視することは可能でしょうか?
(したい処理によって#defineで定義した値Tを変えてビルドして
いますが、処理によっては使わない関数もコンパイルするのは時間が
(10秒もしないですが)掛かるような気がして…。)
VC良く知らんが、ソースファイル分けておけば変更が無い分はコンパイルされないのでは?
179 :
デフォルトの名無しさん:04/11/04 14:37:16
コンボボックスについて聞きたいのですが、何個かデータが
コンボボックスにある状態で、右の矢印を押すと今は
一つしか表示されません。それを、ずらぁーっと下に表示
させることは可能でしょうか?教えてください。
出来るぽ。
コンソールアプリをvisual C++6.0でしこしこ作ってるんですが、
よくあるiniファイルを扱うソリューションは用意されているんでしょうか?
もしなければどう扱うの一般的ですか?
そりゅーしょん?
GetProFile系のAPIでやっとれ
183 :
177:04/11/04 14:57:59
>178さん
ソースコードは分けています。
そーすか(ベタで済みません^^;)、変更はされないのですかね。
でも、ヘッダーファイルで#defineした部分は全てのファイルで
書き換えられているのかなぁという気がします。
>>183 ソースファイルを変更した場合、そのファイルのみ再コンパイルされる。
インクルードファイルを変更した場合、そのファイルをインクルードしているソースファイルが再コンパイルされる。
>>179 ダイアログエディタで▼をクリックしてから枠をドラッグしてサイズ調整。
>>182 おお、こんなんがあるんですね。ありがとう。
と、思ったのですが出来なそうですね。
CWinApp::GetProfileXXXというのがあるようですが、NT系だと
レジストリを使うようです。
?
GetPrivateProfile〜
>>186 MFCでもレジストリ使わないでiniにできるよ。
CWinApp::SetRegistryKey を呼はないようにする。
みなさんありがとう。
APIとかMFCとか使ったことないのでそれから勉強してます。
ヘルプ見ても何がなにやら・・・。
>>173 >配列型を struct でラップするしかないのかなあ。
boost::array
C++のスタイルで、みなさんはどれですかー?
1.
a void func( int a ); b void func(int a);
2.
a int GetNumber(); b bool GetNumber(int *n);
どれが一番主流なんだろう。
いや、全然わからん
何を対比させてるんだ。
>>192 1,a
2,a
1は正直どうでもいいが、
2の問いが意味不明だな。例外失敗する可能性あるなら例外飛ばせばいいんでね?
てかポインタじゃなくて参照に汁。
回答者に感謝!
さらに質問
あとできれば、回答者のプログラミングレベル教えてください。( 自己分析で )
3. (空白関係なし)
a. POINT GetNum(); b. bool GetNum(int *x, int *y);
4 戻り値がbool の関数と intなどの値を返す関数 を混同して自作する
( int などのとき、あらかじめエラー値をきめておく。正常値はプログラムで使われる )
a しない b する
なんか知障が沸いてるみたいだな
198 :
ジゴロウ:04/11/04 20:12:23
はじめまして。
質問です。
@BCB5で、WindowsXPのビジュアルスタイルにする方法はありますか?
Aあれば、どうすればできますか?
以上のこと教えてください。お願いします。
>>195 3 bool GetNum(POINT& rpt);
4 bに近い。boolとvoidとの混同になる。
201 :
ジゴロウ:04/11/04 20:34:45
>>199 早速ありがとうございます。
関係ないところばかり探していました。
スレタイに初心者歓迎って書いてたんで覗いてみたら・・。
漏れのような超初心者が来るようなところじゃ無かったよorz
別スレ探してきまつ。(´・ω・`)
ほとんど返信こなくて 全然統計取れない;;;;;;;;;;;;;;;;
そりゃあんな変なノリで聞かれちゃ
ネタにしか思えんし、答える気も失せる
そもそも質問の意図も意味も伝わっとらんしな
回りくどくいってきたんだけど、ようはC++のスタンダードなスタイルがしりたいんですよ
会社にはいって、個性あるプログラムだねぇといわれたくないもので。
>>207 正直見づらい上にバラバラに聞いてるからなぁ‥‥
せめて↓な感じで書けばまだ見やすいんだが‥‥
3. (空白関係なし)
a:. POINT GetNum();
b: bool GetNum(int *x, int *y);
>>209 おお さんきゅ〜〜〜
こんなすれがったのかーーー
まじありがとーー
>>210 おまえさん、会社に入る=就職するつもりならコーディング規約より先に
まともなコミュニケーション能力をつける必要があるぞ。
漏れも書き込んだ後にそう思った
オンラインゲームかチャットかの雰囲気そのままここに持ってきた感じだよな
>>212 あんたは、なにいまさらいってるんだよ
ここはオンラインゲームかチャットよりもひどい板だろ
214 :
デフォルトの名無しさん:04/11/05 02:51:22
プログラム中の特定の箇所に限って
open("mona/giko", O_RDONLY);
がなぜか 0 を返す・・・。
他とナニが違うから、よりによって 0 を返すのか見当も付かない・・・。
open(2) 関数@Vine Linux and Cygwin でつ。
>>214 オープンハンドル使い切ってたりしない?
216 :
214:04/11/05 07:57:35
>>215 エラーなら open() は -1 を返すはずなんですよねえ。
0 という値自体は有効なものなんだが、それは本来は標準入力を表すファイル記述子のはず・・・。
いったいどんな状況に open() がこんな値(0)を返すのか、man とか見ても
さっぱり分からない。
質問よろしいでしょうか。
For next文の実行中で
何かのキーが押された時に、
実行を中止するにはbreak以外の方法はありますか?
breakってあまり使いたくないので…。
よろしくお願いします。
For next文って…BASICか何かと勘違いしてるのか?
それはともかく、好き嫌いは知らないがほかの方法(gotoなど)を
使われても周りは読みにくくて迷惑するんじゃないのか?
longjmp
throw
後藤
exit
>>217 こいつVBの質問を誤爆してると思う。
breakってbreakキーのことじゃないのか?
if(条件式)
{
while(条件式)
{
if(条件式)
{
//正常処理
goto END;
}
}
//異常処理
return;
}
//正常処理
END:
//必要な後始末
上記の様な感じでgoto文使うのは一般的に問題があるようなgotoの使い方でしょうか?
ちなみに2箇所の正常処理部分は一部処理内容が異なります。
if(!条件式)
{
//正常処理
}
else
{
while(条件式)
{
if(条件式)
{
//正常処理
break;
}
}
//異常処理
return;
}
//必要な後始末
おいおい
「一般的」なんて曖昧な物シラネ
宗教問題起こしたいんじゃなければ、好きにしろとしか
whileの中に正常処理(1)を入れているのが変。
正常処理(1)、正常処理(2)、異常処理、後始末をそれぞれ関数にしちゃえばすっきりするだろうし。
229 :
コピペ推奨:04/11/05 10:09:34
if(条件式)
{
while(条件式)
{
if(!条件式)
{
//異常処理
return;
}
}
}
//正常処理
231 :
デフォルトの名無しさん:04/11/05 12:29:15
このスレで初めて質問させていただきます。
今後もお世話になる確率が非常に高いので宜しくお願いします。
クラスAを用意し、メンバー関数(a,b,c)を3つほど作りました。
派生クラスはありません。
そのメンバ関数aの中で、動的変数を配列で定義したのですが、
b,cで認識してくれません。
これは常識なのでしょうか。
つまらない質問だろうとは思いますが、返答をもらえれば幸いです。
追加で、クラス内で動的変数を定義する為にはどうしたらいいかも教えていただければ幸いです。
> 動的変数を配列
動的変数ってなんじゃワリャー
って、まさかと思うがメンバ関数a内の自動変数(ローカル変数)が
メンバ関数b、メンバ関数cで見えないなんて事を言ってるわけじゃないよな?
>>234 あぁ・・・まさにその通りでした。
言われて気づきました。
申し訳ないです。クラス以前の問題でしたね。ありがとうございました。
>>232さん、お騒がせしました。
そしてもう一つ問題が出てしまいました。
class A の private の中で、変数を定義し、同時に数値を代入すると
class A{
private:
int aaa=0;
関数でない識別子が純粋関数であると指定されています。とコンパイルエラーになってしまいます。
使い方がおかしいのでしょうか。
メンバ変数の初期化はコンストラクタで。
>>236 なるほど、そこでコンストラクタの出番なのですね。
ちょっと知識がつながった気がしました。
ありがとうございました。
・・・
>>238 落ち着け。
ここは初心者歓迎なスレだ。
俺最初は、こういう質問に答えようとここに来たよ。
1スレ読んだ後、質問側に回ることにしたけど。
#include <stdio.h>
int main()
{
int a,b,c;
a=b=0;
c=a+b;
a=b=1;
printf("%d\n" , c);
}
とすると0が表示されます
aとbに1を代入してるから
cは2になるはずなのになんでですか?
処理が上から下に流れるから
>>241 お前の考えだと、a=b=0; とa=b=1; が
矛盾してるというか相反すると思いませんかー
>>242 >>243 レスありがとうございました
なぜかふと、疑問に思ってしまいました
時々、基本中の基本をど忘れすることがありまして
アルツハイマーぎみですw
病院行って脳の検査しる
>>235 int aaa=0;
これは代入でなくて初期化。
そしてクラス定義内で初期化できるのはstaticな整数のみ。
↑訂正
×staticな整数
○staticなconst整数
整数?
>>248 『プログラミング言語C++第3版』 10.4.6.2
「静的な整数の定数メンバは、メンバ宣言に constant-expression 初期設定子を
追加することによって初期設定することもできる。」
同書に「浮動小数点を宣言したくなる誘惑」なんて書かれていますが。
どうしてfloatやdoubleはだめなのですか?
gcc34 (GCC) 3.4.0 (Red Hat Linux 3.4.0-1)
実践MySQL4 に書いてある Cクライアントのサンプルコードを入力してコンパイルしてみると
/usr/include/mysql.h:59:21: typelib.h: そのようなファイルやディレクトリはありません
typelib.hというインクルードファイルはどこで提供されているのでしょうか?
mysqlの方にはついてなかったと思うのですが、
一応ディスク内は検索してみましたがありませんでした。
gccの方で標準的に提供しているでしょうか?
auto_ptrについてなんですが、ちょっと気になることがあります。
auto_ptr<int> p1(new int), p2;
p1.release();
や
p2 = p1;
とするとVC6付属のSTLでは所有権のみの移動なのですが
STLPortでは所有権だけでなくp1が保持するポインタもヌルになります。
規格が新しくなってこうなったのだと思いますが
どういう意図でポインタもヌルになるようになったのでしょうか?
お返事遅れて申し訳ありません。
元々VBを使っているので間違えてしまいましたが、
意図を汲んでくださってありがとうございます。
感謝します。
C言語を勉強した中で、
breakやgotoは使ってはいけないような気になっていたのですが
色々なソースを見ているとgotoよりもbreakで抜けてしまったほうが
わかりやすいみたいですね。
longjmpも面白そうですが、初心者なのでbreakを使ってみようと思います。
どうもありがとうございました!!
また何かわからなくなったら教えてくださいー
(ゲームに挑戦中ですw)
void hoge1(int a[]);
main
{
int b[10];
hoge(b);
}
void hoge(int a[])
{
a[1]=1;
}
だと配列b[1]が1に書き換えられてしまうのですが
配列bが関数hoge内で書き換えられないようにhogeに配列bを渡すにはどうすればいいのでしょうか?
void hoge(int a[]);
main
{
int b[10];
hoge(b);
}
void hoge(int a[])
{
a[1]=1;
}
だと配列b[1]が1に書き換えられてしまうのですが
配列bが関数hoge内で書き換えられないようにhogeに配列bを渡すにはどうすればいいのでしょうか?
>>256 void hoge(const int a[])
>>257 別の場所で配列bの内容を書き換えたいのでそれはちょっと・・・
for (i=0; i<10; i++)
{
b[i] = a[i];
}
hoge内で上のようにコピーするしかないのでしょうか?
変数を関数に渡した時は元の変数が勝手に書き換えられることがなかったのでちょっと不思議です
>>258 C++ならvectorとかのコンテナを使えば可能
>>260 あんまり難しくもないんだけどね
参考までにあなたのやりたいことはこんな風に書ける(それ以外もちょっと修正したけど)
#include <vector>
using namespace std;
void hoge(vector <int> a);
int main ()
{
vector <int> b (10);
hoge(b);
return 0;
}
void hoge(vector <int> a)
{
a[1]=1;
}
>>260 俺もせっかく書いたので・・・
#include <vector> // ← STLのvectorを使うため
void hoge(std::vector<int> a);
int main()
{
std::vector<int> b(10); // ←要素数10の配列だと思ってもらっていい
hoge(b);
}
void hoge(std::vector<int> a) // ←ここの配列aは配列bのコピー
{
a[1]=1; // ← コピーなので配列aの中身を書き換えても配列bの中身は書き換わらない
}
書き換えたい場合は参照渡しにすればOK
class/structのstaticメンバの質問です。
--- aaa.hpp ---
struct AAA
{
static const int table_aaa[];
void a( )
{
//ここでtable_aaa[]にアクセス
}
};
--- aaa.cpp ---
const int AAA::table_aaa[]=
{
//色々
};
--- main.cpp ---
int main( )
{
AAA aaa;
aaa.a( ); // ※
}
※の部分に関してですが、
MinGWでは、AAA のstaticメンバ(table_aaa[])に対しての
undefined reference が発生しますが、
VCToolkit2003では、通ります。
どちらが正しいのでしょうか?
makefileを間違えていました。
申し訳ありませんでした。
>>259-262 >変数を関数に渡した時は元の変数が勝手に書き換えられることがなかったのでちょっと不思議です
>vectorは難しそうなんで
>>258の方法で地道にコピーしてみます
こんなこと言ってる奴に教えても無駄だと思われ
ソースファイルを分割した後に実行したら
hoge.exeの0x00401009でハンドルされていない例外が発生しました
0xc0000005:場所0x00030bcに書き込み中にアクセス違反が発生しました
と言うエラーが出ました
分割するのに必要なとこだけしか変更してないのになんででしょうか?
エスパーさん出番ですよ。
♪「好きよ」と言い出せないうちに、貴方のロッカー奪ったLove-letter
依頼人は嘘をつく
>>267 ワトソン博士のログファイルなんかから
場所と原因を特定してみるのも面白いぞ。
練習だと思ってやってみ。
ワトソン、インスコ直後に機能切ってるよ…('A`)
#define DEBUG TRUE
は同じファイル内だけで有効なのか・・・
ファイルごとにオンオフすんのめんどくさいな
普通、コンパイラにはコマンドラインオプションとしてマクロ定義が可能なんで、
IDEのプロジェクト設定なりmakeいじるなりすれば全ファイルのコンパイル時にマクロ定義できる。
そういうときは全てのファイルでインクルードするヘッダに#defineを書けばいい。
ソース内に埋めると消し忘れる原因になるからIDEならビルドごとに設定、
Makefileならターゲットごとに設定するのが基本。
(;´Д`)ウウ・・C++builder6を購入してやりだしたのはいいのですがイキナリ詰まりました。
とりあえず自分で関数を作ってみようと下記のようにしたのですが
どうやったらこのエラーを修正できるでしょうか。。
[リンカ エラー] 外部シンボル 'TForm1::message()' が未解決(C:\BUILDER\PRACTICE\1106\UNIT1.OBJ が参照)
ソースは下記のようにしました。
ヘッダふぁいる。
class TForm1 : public TForm
{
__published:// IDE 管理のコンポーネント
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private:// ユーザー宣言
public:// ユーザー宣言
__fastcall TForm1(TComponent* Owner);
void message();
};
cppふぁいる。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
message();
}
void message()
{
ShowMessage("通ったよ");
}
void message()
→void TForm1::message()
むしろこっちの薬缶
class TForm1 : public TForm
{
__published:// IDE 管理のコンポーネント
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private:// ユーザー宣言
public:// ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
void message();
>>278さん
(・∀・)ありがとーございます。
クラスの中に入っているときには「クラス名::関数名」ってやればいいんですね。
逆に言うとTFormのクラスの外に関数のプロトタイプ宣言を出してやれば。
関数の名前にTForm::ってつけなくてもいいみたいですね。。
(・∀・)一つ進化した気がする。
・・・(;´Д`)ウウッ… 277だった。
>>279さん
(・∀・)ありがとーございます。
後なんとなく、クラスにおけるpublicとかprivateとかイメージがつかめてきた気が。。
↑
今まで無茶苦茶曖昧だった。。
3ヶ月くらい前に、とあるスレでC++を学ぶならCをある程度理解してから、と言われました。
とりあえず猫でも分かるシリーズ3冊読みました。
そろそろC++やりたいんですけど、いい入門書あれば教えてください。
>>283 似たような質問ばかり見るんだけど、ちゃんと適当なスレを探している?
さんざん既出で、もうその質問にはうんざりなんだけど。
286 :
デフォルトの名無しさん:04/11/06 21:55:34
Windows 2000 の環境下で作成したC/C++のアプリケーションを
Windows XP や Windows 2003 Server の環境下で実行することはできますか?
簡単なテキストファイルを編集したり、ファイルを検索したりコピーしたりする
アプリケーションを作ろうと考えています。
>>287 サンキューです。
Cの経験はほとんどないですが、勉強がてら作ってみようと思います。
bmpファイルをpgm形式に変換するプログラムを作るのに参考になるサイトありますか?
www.wotsit.org
sf.net
>>291 PGM作る関数。
前に宿題スレ作った分の残りもの。
void save_pgm( char* filename, unsigned char** image, int xsize, int ysize ) {
FILE* fp;
int x, y;
fp = fopen( filename, "wb" );
fprintf( fp, "P5\n" );
fprintf( fp, "%d %d\n", xsize, ysize );
fprintf( fp, "%d\n", 255 );
for ( y = 0; y < ysize; y++ ){
for ( x = 0; x < xsize; x++ ){
fputc( image[y][x], fp );
}
}
fclose(fp);
}
>>290 そこ誤訳があるところ。
禿の文意はおそらく(かなりの意訳)
「クラス宣言内でシンボル定数が必要なら列挙を使うようにしろ。
そうすれば変数や浮動少数点数をクラス宣言内で初期化しようとする
ミスは防げる。」
295 :
デフォルトの名無しさん:04/11/07 12:53:19
2変数方程式を入力する関数どうすればいいですか?
2xyとか
>>295 // こういうこと?
double func2xy(double x, double y) {return 2 * x * y;}
方程式を入力する関数って言う意味が分からない。
>>294 結局整数しばりは禿様がなんらかの思想の元きめたことなのですかね
特に深い理由はないのかな。どうもです。
299 :
295:04/11/07 13:08:52
2xy限定じゃなくて任意に式を入力したいんだけど
つまり、2変数方程式を解きたいんですか?
まず普通の2*3^4とかを入力して、結果を表示するプログラムを作ってみれば良いのでは?
本当に聞きたいのならもう少し具体的にきちんと説明
プログラム初心者なら歓迎だが、
意思伝達の初心者だと (このスレを利用するのは) 難しい
コンパイルしてできた、実行ファイルを
バイナリエディタとかで開くと、使ったコンパイラの情報が入ってますよね?
それをなくしたいんですけど、どうやったら良いですか?
2ちゃんねるの悪体質は改善せねばなりません。
305 :
デフォルトの名無しさん:04/11/07 13:37:30
304=295
307 :
デフォルトの名無しさん:04/11/07 13:49:10
305=304=295
308 :
デフォルトの名無しさん:04/11/07 13:58:27
>>303 どんな情報が入ってるの?
シリアルナンバー、使用者の名前、とかの情報も入ってるの?
>>309 適当にバイナリエディタで見てみたら?
そんなたいしたこと書いて無いよ
>>299 式のパースをしたいならパーサを書け。lex、yaccなどについて調べよ。
>>303 gcc -S hoge.c
で出てきたアセンブリ言語のソースで気になるところをチェックして
アセンブラにかければよろし。
>>306 Cなんだから、ハンドコンパイルって言おうよ。
>>312 ライブラリの中とかに情報が入ってたりするよ。
VC6なのですが、F5の実行では出ないで、
Ctrl+F5の実行だと必ず再現するバグって何が原因か心当たりないでしょうか。
いずれもDebugモードです。
「Debugモードでは出ないで、Releaseモードでは出るエラー」だと
初期化のし忘れなどが多いですが、F5とCtrl+F5で挙動が違うのは初めてで、お手上げです。
>>315 まずその「バグ」の内容を書こうとは思わんのか?
>>316 それがこみ入ってまして、バッファがおかしいのか、
描画ライブラリの振る舞いなのか、フラグのつけ忘れか、初期化周りか…。
なので有名な「Releaseビルド時にのみ出るバグ」、みたいな常套チェック項目が
無いかなとお尋ねした次第。まぁ幾らぐぐっても無いみたいなので、総ざらいしてきます。
>>317 初期カレントディレクトリが違ったような気がした。
>>317 Debugモードは余分にメモリを確保する。
バッファ辺り調べてみるといいかも。
ちげーだろ
>>317 F5なら設定でコマンドラインの指定ができる。そこは大丈夫?
>>318-321 皆さんレスありがとうございます
まだ取れてないのですが、その線で洗い直してみます。
なにせデバッガで追えないので、手がかりは本当に助かります
323 :
デフォルトの名無しさん:04/11/08 05:41:42
(g_diMouseState.rgbButtons[0] & 0x80) ? MState.lButton = true : MState.lButton = false;
これはどういう文なんでしょうか?
?なんていう命令は見たことないのでこの文の意味を教えてください
>>323 それは三項演算子というもので、もしそれがコンパイルできるとするなら、
if (g_diMouseState.rgbButton[0] & 0x80) {
MState.lButton = ture;
} else {
MState.lButton = false;
}
と等価。
が、普通は?の後ろに式なんか書かない(書けない?)し、下の書き方の方が普通。
MState.lButton = (g_diMouseState.rgbButton[0] & 0x80) != 0;
326 :
デフォルトの名無しさん:04/11/08 06:35:05
> 普通は?の後ろに式なんか書かない(書けない?)
いや、そこは式だよ。
あー、ちょっと省略しすぎかな。そこにかけるのはleft valueだけ
なに?こいつ
「式」って何ですか?
つまり、説明できないってことですね
>>330 なにが省略だ。プッ
left value?プッ
学校池
あー、なんか俺激しく間違ってるみたいだなorz
いろいろ調べてみるよ。
初心者向けには、
カッコで囲めるものは全部文法上の「式」である
ってことでいいかい?
いいよ。
(display "Hello 式!")
if( didod[ i ].dwData & 0x80 )
_tcscat( strNewText, TEXT("U ") );
これの条件式の意味を教えてください
&が2個続いてるのしか見たことないので…
ビット演算のAND
マウスの押されていたボタンが放されたことを検出するにはどうすればいいのでしょうか?
マウスがドラッグされてるのを検出したいんです
>>345 環境は? 環境によってかなり異なるので明記されたし。
SetCapture
>>349 早速しらべてみます
ありがとうございました
typedefの構造体は普通の構造体とどう違うのでしょうか?
>>351 構造体変数を宣言するときにstructを付ける必要がなくなる。
>>352 なるほど、解決しました
ご返答ありがとうございました
>>351 typedefの構造体なんて物はない。
構造体にtypedefで型名をつけることはできるが。
即ち、次はいずれも有効。
/* 無名の構造体 */
struct {
int foo;
double bar;
} st;
/* タグ名つき構造体 */
struct foo {
int foo;
double bar;
};
struct foo st;
/* 無名の構造体に型名を宣言 */
typedef struct {
int foo;
double bar;
} st_t;
st_t st;
>352は必ずしも正解ではないので注意。
typedef struct が意味を持つのは C だけ。
C++ では付けても付けなくても違いは無い。
>>355 C99でも付けなくていいんじゃなかったっけ?
うろおぼえなので違うかもしんないけど
const RECT a;
a=0;
a=0;
a=0;
a=0;
としてもエラーが出ます
aの座標を初期設定する方法を教えてください
いろいろ死ね」「
const RECT a;
a.left=0;
a.top=0;
a.right=0;
a.bottom=0;
でした訂正します
{0, 0, 0, 0}
それがWindowsのRECT構造体のことであるとするならば、
const RECT a = {left, top, right, bottom};となる。constと指定して
いる以上は初期化以降変更できないことは分かっているんだろうな。
const RECT a = { 0 };
また少し訂正を加えました
const RECT *a={0, 0, 0, 0};
これでも
error C2078: 初期化子の数が多すぎます。
と言われます
なんだお前は。
後から色々訂正するなよ。
それではポインタに対して配列の初期化子で初期化しようと
しているのだから、文句を言われて当然だ。君はポインタに
ついて理解がない。勉強し直しなさい。
もしWindows APIにRECTへのポインタを渡したいという意図で
あるならば、const RECT a = {0, 0, 0, 0};の形式で初期化した後
&aを渡しなさい。とエスパーっぽく語ってみる。
BOOL ClipCursor(
CONST RECT *lpRect // 画面の座標
);
この関数に渡すための
CONST RECT *lpRect // 画面の座標
を設定したいのです
怖いね。
ていうか引数の型がconst RECT*として指定されている分には
渡す側はconst指定しなくていいじゃん
Cの理解が不十分にもかかわらずWindowプログラムを始めたばっかりに
挫折していった奴を何人も知ってる。
>>369もその一人になるだろう・・・
const RECT rc = {1, 2, 3, 4};
ClipCursor(&rc);
あるいは
RECT rc;
rc.left = 1;
rc.top = 2;
rc.right = 3;
rc.bottom = 4;
ClipCursor(&rc);
BOOL ClipCursor(CONST RECT *lpRect);
この場合のCONSTは関数内で変数の中身を書き換えないことを意味するのでrcにconstはなくても良い
ちなみにC99の複合リテラルを使うとClipCursor(&(RECT){1, 2, 3, 4});
>>373 そうならないためにも基礎を飛ばさずC言語からきちんと勉強しろ
C以前の問題だと思うんだが。
ΩΩ Ω<な、何だってー!?
え?僕の好みですか?やっぱ顔がかわいい子がtypedefね
typedefが流行っていますな。
382 :
デフォルトの名無しさん:04/11/09 15:07:43
struct A
{
int p : 10;
};
この「: 10」ってのはなんですか?
383 :
デフォルトの名無しさん:04/11/09 15:19:25
>>382 ビットフィールド
pに10ビット割り当てられる。
384 :
デフォルトの名無しさん:04/11/09 15:27:14
int array[] = { 1, 2, 3 };
arrayがメンバ変数の場合でも、上記の様な
要素数を省略した配列を初期化をする方法はあるのでしょうか
>>384 arrayがstaticメンバ変数なら可能だけど
>>386 ありがとうございます。やはり静的じゃないと駄目ですか。
大人しく別に用意してmemcpyでも使っておきます。
char *cpy_buff[256];//社員ID格納用ポインタ配列バッファ
char *cpy[258];
char buff[256];//社員データ読み込みバッファ用
int =i;
i=0;
while(fgets(buff,sizeof(buff),fp)!=NULL)
{
cpy_buff[i]=strtok(buff,",");
strcpy(cpy[i], cpy_buff[i]);
i++;
}
カンマ区切りのデータを一行読み込み
最初のカンマで区切りまでの文字列を
配列に代入したいと思うのですが
上記ソースで行うと
コンパイルは通るのですが
以下の文字列のコピーでエラーとなります。
strcpy(cpy[i], cpy_buff[i]);
回避方法あります?
>>389 cpy[i]はちゃんとメモリ確保してある?
それから、strtok()が返すのは常にbuffの中だからcpy_buffに格納する意味がないよ。
文字列処理とポインタについて、勉強しなおすことをお勧めしておく。
>>389 cpyの中身はどこへ行った?
strcpyは謎アドレスには書けないと仰られております。
#include <stdio.h>
#include <windows.h>// WindowsAPIを使用可能にする
#include <windowsx.h>
struct c
{
int b;
}a,*d;
void e(struct d f);
int main()
{
struct c g[10];
g[1].b=0;
e(&g[1]);
printf("%d\n" ,g[1].b );
}
void e (struct d f)
{
f->b=777;
}
だと
error C2027: 認識できない型 'd' が使われています。
error C2227: '->b' : 左側がクラス、構造体、共用体へのポインタではありません。
error C2664: 'e' : 1 番目の引数を 'c *__w64 ' から 'd' に変換できません。
というエラーが出てきます
どうしたらいいのでしょうか
ポインターを勉強中なのでお手柔らかにお願いします
struct dじゃなくてstruct cだろ。
void e(struct d f) → void e(struct c f)
単純なtypo
>>392 dは型名じゃない。aも。ポインタの問題じゃない。
#include <stdio.h>
#include <windows.h>// WindowsAPIを使用可能にする
#include <windowsx.h>
typedef struct c
{
int b;
}a,*d;
void e(d f);
int main()
{
struct c g[10];
g[1].b=0;
e(&g[1]);
printf("%d\n" ,g[1].b );
}
void e (d f)
{
f->b=777;
}
これだとちゃんとできるんですが
>>392からtypedef取ってstructを付け足したらエラーが出たので
不思議に思ってます
>>396 typedef struct c {} a, *d;
は、struct cをa という型に、struct c * をdという型に定義している。
struct c {} a, *d;
では、struct c と言う型のaと、struct c *と言う型のdを定義しているだけだ。
>>397 なるほど!!
目から鱗が落ちました
これですっきり解決しました
ありがとうございました
C++でクラスのメンバに関数ポインタ用の変数を用意して
現在の状態からswitch使って呼ぶ関数を決めるのではなくて
状態の変化があった時にその変数に関数ポインタを代入しておいて
それを呼ぶ形にしたいと思ったのですが
代入している所で
void (_cdecl クラス名::*)から(void) void (_cdecl *)(void)に変換することは〜
と言われてコンパイルが通りません
(呼び出し規約というのは調べたらすぐ出てきたので_cdeclにしました)
クラスのメンバ関数はポインタで扱えないんでしょうか?
メンバ関数へのポインタはメンバ関数ポインタにしか代入できない。
非常に初歩的な質問で申し訳ありませんが
double x = 3.14; x
>>3; と記述したところ
エラー c41.c 15: doubleの不正な使用(関数main) というエラーが出ました
シフト演算子は浮動小数には使用できないのですか?
float、double、ポインタには使用できない
>>401 ちゃんとそういうものがあったのですね
勉強に使っている本やサイトになかったもので
ありがとうございました
>>400 「関数ポインタ用の変数」の型をメンバ関数へのポインタにするべし。
そのエラーメッセージから察するに、現状はメンバではない関数へのポインタになってる。
構文キモイから覚悟して。
そこで、関数オブジェクトですよ。
そふぉで、ふぁんすうふぉふぅじぇふとでひゅよ。(おでん食いながら)
便乗して関数ポインタについてお聞きしたいのですが、関数ポインタはどんな状況で使うべきなのでしょうか?
単にswitchの代わりに使うのではあまり意味がなさそうですし、あとは引数として使うくらいしか知らないのですが
有効な使い方を教えていただけないでしょうか>
WindowClass を C++ の class で作って window procedure に
その class の member function を登録したいとき
call back function としてメンバ関数ポインタを使う
>>409 C++で仮想関数を使いたい場面をCでがんばって実装するのに使う。
POINT a;
と
struct s
{
int x;
int y;
}a;
は何が異なるんでしょうか?
POINTの定義次第じゃないか?
>>413 POINTは定義しないでも使えるんですけど
なんでですか?
定義してるヘッダをインクルードしてるんだろ
なかなか思い通りにいかないな
つぎからつぎへと細かいバグが出てくる
同じような操作の繰り返しでつかれました
製品クオリティーにはほど遠いな…
419 :
デフォルトの名無しさん:04/11/10 21:31:42
1,御kjの,女fだ,jk所
2,f打御,kもf,qjf朝
:
のように、半角全角が混じった適当なCSVファイルがあります。
それをfgetsで一行ずつ文字列配列に入れているつもりなのですが、
適当な行を取り出して中身をのぞいてみると「1,御kjの,女fだ,jk所・」
のように行末に余計な文字が出て来る場合があります。
どこがおかしいか教えてください。よろしくお願いします。
/////
char list[128][128];
int i;
for (i=0;i>128;i++)list[i][0]='\0';//初期化のつもり。正しい?
fp = fopen("test.csv","r");
i=0;
while (fgets(list[i],256,fp) != NULL){
printf("%s",list[i]);
i++;
}
fclose(fp);
× i>128
○ i<128
>>420 すいません、それはここにUPするため体裁を整えた際のミスです。
ソースではi<128となっております。
>>422 ありがとうございます。試してみたんですが、
そうかもしれません。
CSVを一行だけのファイルにして改行のない状態にしたら消えました。
そうだとしたら、本番で使うファイルは複数行あるものなので、
その改行コードというのを取り除きたいのですが
どうやって取り除けばよいのでしょうか…
>>423 strlenとかで長さ計って改行コードを\0で上書きするとか?
それはそうと128バイトのバッファに
fgets(list[i],256,fp)
していいの?
皆さんどうもありがとうございます m(_ _)m
それにしても、意外と関数ポインタを使う状況って限られているみたいですね
>>424 ありがとうございます。↓のような物をWhileの中に入れてみました。
ファイルの最後の行とかには改行がないかもしれないので、
改行がある場合のみ置き換えるようにしてみようと思ったのですが
上手く置き換わらず、そのままの状態で出力されます。
度々申し訳ないのですが、何が悪いのでしょうか。。。
if(list[i][strlen(list[i])] == '\r\n'){
list[i][strlen(list[i])-1]='\0';
}
>>426 char * p = strchr(list[i], '\0');
if (p > list[i] && p[-1] == '\n') {
p[-1] = '\0';
}
/* 或いは */
size_t l = strlen(list[i]);
if (l > 0 && list[i][l - 1] == '\n') {
list[i][l - 1] = '\0';
}
/* 或いは */
char * p = strrchr(list[i], '\n');
if (p) {
*p = '\0';
}
いずれにしても、'\r\n'は間違い。
>>427 いろいろありがとうございます。わざわざすいません。
最後の奴が分かりやすかったので使ってみたら上手くいきました。
ところで
if(list[i][strlen(list[i])] == '\n'){
list[i][strlen(list[i])-1]='\0';
}
としてもダメだったんですが、これがいけない理由が分かりません。
理屈を言葉で理解したいのですが、これはどういったことなのでしょうか。
>>428 strlenって何する関数か調べれば分かるよ
430 :
デフォルトの名無しさん:04/11/11 02:56:10
431 :
デフォルトの名無しさん:04/11/11 03:06:13
ごめん426の方のコード見てた
428は無視して
×428
○430
つまり、430-432はスルーと言うことで。
ドラグでマウスの左ボタン押してから離すまでという条件文はどうやればいいのでしょうか?
WM_LBUTTONUP
WM_MOUSEMOVE
WM_LBUTTONDOWN
上の3個のメッセージ使ってドラッグを表現できないでしょうか?
解決しました
( ゚д゚)ポカーン
力尽きました。限界であります。
VC6++のプロジェクトごと入ってますのでそのままビルドできると思います。
超単純なダイアログベースアプリでの
ファイル読み込み→リストビューに表示、という簡単なテストプログラムです。
実はこういったものを作っていたのですが、もう何がなにやらわけが分からないです。
どなたか助けていただけると助かります、、分からない事はソースにコメントしてあります。。
ttp://gamdev.org/up/img/1835.zip
ちなみにMFCとか使ってません。
リソースエディタで作ってDialogBoxしてあるだけの超単純なやつです。
ですがなににしろAPIとかの間違いじゃなくて
初歩的なCの問題のような気がします…
ウィルスが検出されたけど?
>>438 行を分解するのに自前でやるからバグに気付かない罠。
sscanf()でばらしてみ。strtok()でもいいけど。
#ヒント:行内最後のセルには','はつかない。
441 :
デフォルトの名無しさん:04/11/11 16:30:16
class CClassA;
typedef struct _tagStructB
{
CClassA::enumC en;
} StructB;
class CClassA
{
public:
enum enumC
{
ok,
err
};
StructB m_B;
};
と言う事をしたいのですが、どうしてもうまくいきません。
error C2027: 認識できない型 'CClassA' が使われています。
どうか、お慈悲を…
>>441 これくらいがせいぜいか
struct CClassA_Base
{
enum enumC
{
ok,
err
};
};
struct StructB
{
CClassA_Base::enumC en;
};
class CClassA: public CClassA_Base
{
public:
StructB m_B;
};
>>441 あとは
class StructB;
class CClassA
{
public:
enum enumC
{
ok,
err
};
StructB *m_B;
};
struct StructB
{
CClassA::enumC en;
};
444 :
441:04/11/11 17:01:13
>>442-443 THX!
スマートな書き方はないんですね…
とりあえず、意味合いは変わってきますが、こんな感じで逃げようかと思います。
class CClassA
{
public:
enum enumC
{
ok,
err
};
typedef struct _tagStructB
{
CClassA::enumC en;
} StructB;
StructB m_B;
};
>>444 ちなみにC++では構造体もクラス同様、変数宣言などのときにstructはなくても平気だからtypedefする必要はない。
この癖はもう抜けません…
typoの元だから抜いとけよ。
448 :
デフォルトの名無しさん:04/11/11 18:17:04
1380791345などの、Long型の値を、文字列に変換するには
どうしたら良いでしょうか?
gccコンパイラ使ってます。
itoa
sprintf
boost::lexical_cast
可変引数の関数を作っているのですが
bool function(int a, int b, ... );
この場合、va_startに渡す第2引数はbでいいの?
ok
初心者な質問ですみません。
C言語で標準関数を使用してBASICの様にLine見たいな感じで描画する事は可能なんでしょうか?
線や円を色などを指定して描画したいんですが。
もし不可能であればそのような事を実現するのに適したライブラリ等、お勧めな物はありますか?
書き忘れましたが、使用環境はSolaris9+gcc2.95.3
もしくは Linux(カーネル3.3.32.4)+gcc3.3.3
できるだけunix+gccで実現したいんですが、windowsのほうが手っ取り早いというならば
WindowsXP+VisualC++6.0辺りでも構いません。
456 :
デフォルトの名無しさん:04/11/11 20:43:59
質問します。
Visual Studio .net なんですが、
それにDirectXを関連付けてインストールするにはどうしたらいいんでしょうか?
>>439 マジですか?
からかいだったら氏ね。
>>440 こんな便利なものがあったとは…
なんとかsscanfを使って解決できました。
ありがとうございました。
ちと環境依存OKに甘えさせて下さい
最近のIDEだと、iteratorやクラスメンバなんかでも
入力補助(インテリセンス、メンバ表示)が効くのでしょうか?
もう5年近くVC6を使っていて、未だ買い換える気にもならないので
ちょっと物欲を刺激してみようかと
>459
普通に効きますよ
>>460 サンクスです!
あーやっぱりそろそろ買い換えよう…便利だろうなぁ
462 :
デフォルトの名無しさん:04/11/11 21:39:55
アプリケーションがやり取りしているデータを(たとえばIE)
読み取りたいんですが全く方法がわかりません。
どなたかヒント頂けないでしょうか?
言語はC++を使おうと思っています。
よろしくお願いします。
意味不明。
クリップボード、プロクシもどき、クッキー、キャッシュ、メッセージ、ちょっと考えるだけでこんなに候補がある。
464 :
462:04/11/11 21:50:28
メッセージの部類に入ると思います。
たとえばサーバにURL送る時は(おそらくURL情報、送信元IP、ブラウザ情報・・・)
IEにかかわらずたとえばアプリがやり取りしてるデータ(メッセージ?)に
アクセスしたいです。
>>464 アプリケーション間やOSとやりとりするメッセージと
IEからサーバーに送られるリクエストパケットは別物
アクセス方法も違う。
何をしたいか明確にしないと答えようがない
>>464 その前にWindowsがどういう仕組みになっているか勉強した方がいいと思います
467 :
462:04/11/11 22:06:49
>>465 勉強不足でうまく伝わらないようです・・・
アプリがやり取りしてるデータと言うのを具体的に明記すると
Windows上で動く一つのオンラインゲームがあり
そのオンラインゲームがサーバとやり取りしているデータを読み取りたいです。
オンラインゲームにかかわらずネットワーク経由でデータをやり取りしているアプリのデータを
横から読み取る方法は無いでしょうか?
>>466 お勧めの本あったら教えてください。
勉強不足のようです。。。
>>467 最初からそう言えば分かりやすいのに。
> アプリケーションがやり取りしているデータ
で分かる奴がいるか?
データの具体的な中身も種類も、やり取りしてる相手も書かれてない。
>>467 チートでもしたいのか?
自前でやるならwinsockのrecvをwrapするDLLを作るか、
外部のアプリからAPIHookをかけるのが手っ取り早いだろうけど、
ただデータを見て、ちょっとした書き換えをやりたいだけなら、WPEPro等を使うのが楽
470 :
デフォルトの名無しさん:04/11/11 22:19:58
質問です。
いまファイル読み込みをやっていて
全角文字を0x80以上として、
0x80以上の値がきたら次の文字も読み込む
としているのですが、これだと半角カナの文字を判定することができないので
困っています。
何かてっとりばやい方法はないでしょうか?
471 :
462:04/11/11 22:23:45
>>469 キーワードいくつか頂いてありがとうございます。
ぐぐって勉強して来ます。
またお世話になるときはよろしくお願いします。
>>467 横取り丸をためしてみそ。オープンソース(VC)。検索すればすぐ見つかる。
動機が不純そうだが、俺も不純な動機でいじったから許す。
訂正。
DLLサンプルがオープンソース。
httpの送受信書き換えはなんでも出来る。
476 :
462:04/11/11 22:36:05
>>473 やりたいことにかなり近い物があります。
ヒントありがとうございます。
>>475 教授ありがとうございます。
参考にさせて頂きます。
477 :
デフォルトの名無しさん:04/11/11 22:40:10
>>454 OpenGL
SDL
glut
あたりで検索されたし
Windows専用で良いなら、システムコールで直接描くのが速くていいよ。
GDIというしくみ。「猫でも」にあるよ。
ピクセル単位での計算結果の出力が主体なら、GDIはちょっと遅いかも。
WIN32SDK+DIBで検索してみては?
速度よりも汎用性なら、
>>478さんの言うとうり、OpenGLがいいね。
481 :
デフォルトの名無しさん:04/11/11 23:47:31
先日から始めたばかりでの質問ですがよろしくお願い致します。
int hensu1, hensu2;
中略
hensu1 = ( hensu2 -40 ) * 0.5;
上記の計算式で hensu2 が 40 の時に途中でエラーが出ます。
この問題の条件として演算は整数とありましたので int を使いました。
自分で考えた限りでは式を二つに分けて零に乗算をしない事はできました。
ただ、もっとスマートに解決出来ないものでしょうか?
よろしくお願い致します。
>482
お答えありがとうございます。
ただ、残念ながら変数の値はきちんと半角で受け取っております。
>481
それでは返答のしようが無いです。
ソースを省略してはいかんです。
省略しても大丈夫と思った所にバグが有るものです。
>>481 エラーの内容くらいちゃんと書け。
# あと、「希望する動作」と「現在の動作」もな。
>>457 さん
>>478 さん
>>479 さん
ありがとうございます。
やっぱり標準関数では無理そうですね。
Windowsのシステムコールですか。
UnixのシステムコールはかじってるんですがWindowsは全く
わからないですね。ちょっと勉強してみますか。
OpenGLはなんとなく手をだしたことないですね。やはり使いやすいんでしょうか?
ちょっとみなさんからもらったヒントを元にいろいろ検討してみようと思います。
ありがとうございます。
どうしてもわからないことがあるので質問させていただきます。
プログラムのリソースにexeやdllなどのバイナリを保持させた場合、
それを取り出すとバイナリリソースへのポインタが取得できますが、
このメモリ上にデータとして展開されたバイナリリソースから
インスタンスを生成する(実行する)ことは出来るでしょうか?
一旦それをファイルに書き出して実行するという手段以外で
方法がありましたらご教授願います。
リソースと実行コードではメモリ管理が異なるので不可能です。
可能にしている特殊分野もありますが、お勧めいたしかねます。
>>493 メモリに展開して、先頭アドレスにjmpする…じゃだめなの?
ローダーでぐぐれ
>>494 やはりファイルに落とすしかないのでしょうか・・・
>>495 保持しているポインタはメモリに展開された実行ファイルそのものなので
jmpだけで実行できないと思うのです。
>>496 検索ヒット数が多すぎてわかりませんでした。
自己解凍実行形式のLZHファイルとかZIPファイルとかが
事実上きみがやりたいことをやっている
>>498 レスありがとうございます。
自己解凍系もしらべましたが、あくまでデータとして扱っているので
インスタンスを生成するという主旨からはずれてしまうのです。
CreateProcessやLoadLibraryの引数がメモリに展開された実行ファイルへの
ポインタだったら楽なんですけどね・・・・
ソースはみた?
CodeGuruにあったものを見ました。
こちらはMFCでかかれていましたが、Win32sdkでも記述できるはずですので
そちらを参照しました。
セキュリティ上問題がありそう
>>496 ありがとうございます。
目を通してきますm(_ _)m
505 :
デフォルトの名無しさん:04/11/12 03:17:59
超超初心者です。申し訳ないんですが教えてください。
(重複スレで質問しちゃってマルチごめんなさい)
数値計算をしていてパラメタは全てdoubleにしているんですがこの2式
z[ 4 ] = y[ 2 ] ^2 - 2.0e2 ;
z[ 5 ] = y[ 3 ] ^2 - 20.0 ;
で 浮動小数点の不正な使用 とエラーになってしまいます。
なにがいけないんでしょうか…?
2.0e2
doubleと2でbitwise-XORをとるとはどういう了見だい?
508 :
505:04/11/12 03:33:49
よくわかんないんですけど、始め200.0にしてたんですが
それでもエラーが出たので
本見て変えてみただけです。。。
どうしたらいいんでしょうか?
この式の問題じゃないんでしょうかね?
#include <math.h>
z[4] = pow(y[2], 2) - 2.0e2;
z[5] = pow(y[3], 2) - 20.0;
>>510 おおおおお!行った!!
有難うございます!!ほんと有難うございます。・゚・(ノД`)・゚・。
^じゃダメなんですね。。。助かりました<(_ _)>
昔のBASICの人だったのかな。
いちいち関数呼び出しになるのが馬鹿馬鹿しいよね・・・。
なんだかグラフィックの話題が出てたけれど、やっぱりopenGLが主流なのかな?
DirectXでやってきたけれど仕様変更について行くのが嫌になってきて。
いまからでもopenGL覚えた方が良いんだろうか...
初心者を超えて更に超えた所には一体何があるのだろう。
初心者を超えたら只の初級者だと思うのだが。
超初心者
516 :
デフォルトの名無しさん:04/11/12 10:35:33
誰か助けてください。
次の関数で0≦x≦2の範囲で、xの値の0,1ごとに
yの値を計算するプログラムを作成せよ。画面にはx、y両方の値を表示す
るようにすること。while文を使うこと。y=x*x−3x+5/4
>>514 入門者→初心者→初級者→中級者→上級者。
初心者を超えたら初級者になる。
519 :
516:04/11/12 13:59:36
すいません。期限ギリギリだったので。反省します。
理由としてダメ人間の部類だな。
521 :
デフォルトの名無しさん:04/11/12 14:27:29
ITEM name, password;
これってどういう意味ですか?
522 :
デフォルトの名無しさん:04/11/12 14:38:39
int name, password;
これってどういう意味ですか?
523 :
デフォルトの名無しさん:04/11/12 14:43:19
たったこれだけのこともだれもおしえてくれないんですか?
524 :
にんどる:04/11/12 14:43:51
質問なんですが、
ソートされたデータの配列を対象としたとき、その中に与えられた任意のキャラクタが含まれているか否か2分探索より効率的に判断できるようにするにはどのような方法を採用すればいいんですか?
教えてください。
普通にmemchr()でいいんでね?
構造体のメンバの並べる順序って重要なんですか?
ソースを分割する際に構造体のメンバの順序変えて宣言したら
実行時にメンバが入れ替わってたんで
>>527 そりゃそうだ。
メンバはメモリ上でも宣言した順に並べられる。
Visual C++ 6 (+SP6) で setvbuf がいつもエラーを返すのですが、
どうしてでしょうか。
FILE* fp = fopen("test.txt", "w");
if (! setvbuf(fp, NULL, _IOFBF, 1024*1024)) {
printf("Failed to reserve buffer.");
}
このコードは 1MB のバッファを確保しようとしていますが、
64KB, 8KB でもだめでした。
530 :
デフォルトの名無しさん:04/11/12 20:08:31
すいません、上げるの忘れました。
>>529 > 戻り値
> 正常に終了した場合は 0 を返します。
>>531 ありゃりゃりゃー、そうでしたか。
ありがとうございます!
もう1時間ほど悩んでいました。。。
533 :
デフォルトの名無しさん:04/11/12 20:20:15
UNIX で自分のプログラムのフルパスを取得するには
どうしたらよいでしょうか。
Win32 では GetModuleFileNam() が使えるんだけど。。。
>>532 有効範囲は 2 < size < 32768
とも書いてある。MSDNよく読め。
>>534 すいません。。。よく読むようにします。
>>524 二分探索が使えるなら、それ以上に高速なものってあまり思いつかないな
むしろ二分探索が使えない時の速度の上げ方の方が悩むところだと思うけれど
>>526 memchr()は先頭から順番に探索してるだけじゃね?
一文字探すにはそれで充分かと思ってね。ソートされていることに意味はないし。
>>537 ソートされていないと2分探索は使えない
>>533 GetModuleFileNam()って機能を知らんので外してるかもしれんけど
#include <limits.h>
#include <stdlib.h>
char *realpath(const char *path, char *resolved_path);
このへんかなぁ? これにarg[0]渡せば行けそう
Linuxでproc fs使えるなら
/proc/self/cmdline
を読むのもいいかも
だから、ソートされたデータでもその中の一文字探すのに2分探索できないっしょ。
先頭の文字ならいざ知らず。
>>539 argv[0]にフルパスが入っている保証はない。
>>541 argv[0]にフルパスが入っているなら
char *realpath(const char *path, char *resolved_path);
なんて使わなくてもいいのでは?
>>542 argv[0]はコマンドラインから渡るから
入る場合もあれば入らない場合もあるということだろ
541の「フル」パスってのは誤表記ってことね
>>543 その入らない場合ってのはどんな場合を想定してる?
547 :
デフォルトの名無しさん:04/11/12 22:36:14
来たぞ来たぞ
共通ヘッダにはexternしか置いたらだめなんですか?
構造体の本体置いてもいいんですか?
本体置けたら共通ヘッダ以外に書かなくていいから楽なんだけど
当事者じゃないが揉めないうちに argv[0] についてまとめとくと、
・そもそも argv[0] に自分のプログラムのパスが入っているとは限らない。
環境によっては設定されない場合もあるし、fake することも可能。
規格上も単に program name とされており空白の環境も許容されている。
・argv[0] に自分のプログラムのパスが設定されるとしてもフルパスとは限らない。
"./a.out" のように相対パスで設定されている可能性がある他、単にコマンド名だけで
環境変数 PATH の探索によってフルパスが得られる場合もある。
この場合は、realpath だけでは解決することができない。
参考:
ttp://www.nurs.or.jp/~asada/FAQ/UNIX/section4.4.html こんなもんでどうでしょ?
>548
「構造体の本体」とは何かを述べよ。
>>549 extern付けてない構造体のことです
>>550 >本体置けたら共通ヘッダ以外に書かなくていいから楽なんだけど
その「本体」とやらは一個じゃないの?
それをも省略したいってこと?
とりあえず、本体とやらは
struct hoge{
int integer;
char character;
};
のことだよね
静的な構造体のインスタンスのことではないよね?
関数のプロトタイプ宣言と定義のこととごっちゃになってるんじゃない。
>>551 共通ヘッダにexternなしで構造体宣言書けばいいとおもったんだけど
実際やてみるとエラーがでました
共通ヘッダにexternなしの構造体書くと各ソースにexternなしの構造体書いたことになって
定義がダブることになるからエラー出たのかなと思いました
>>552 はいそのことです
ソースを分割するとソースごとに本体以外はexternを前につけて書かないといけないんで
>>553 552のことです
>>554 それは何かがおかしい。君の言っていることが正しいことになると、例えば
C++の標準ライブラリはほとんどがエラーを発することになる。
>>554 エラーが再現する最小のコードを書いて貼ってみてよ
恐らくすぐ解決するよ
>>555 >>556 最小のコード書いてエラーを再現しようとしましたけど再現できませんでした
LNK2005: "struct a b" (?b@@3Ua@@A) は既に c.obj で定義されています。
というエラーがでます
c.cppファイルには定義は書いてないので定義がだぶることはないと思うのですが・・・
後、typedefの構造体にextern付けるとなんでエラーがでるんですか?
>>557 とりあえず再現してなくていいから
その今書いたのを貼ってみて
それにある間違いを指摘するから
その知識を元に当初のコードを修正すると
問題の一つは解決すると思うよ
//mein.cpp
#include <stdio.h>
#include "common.h"
int main()
{
struct x z;
z.c=10;
hoge(z);
}
//test.cpp
#include <stdio.h>
#include "common.h"
void hoge(struct x z)
{
printf("%d\n" , z.c);
}
//common.cpp
struct x
{
int c;
};
void hoge(struct x z);
です、これだとエラーが出ないのです
common.hは?
>>561 すいません
訂正します
×common.ccp→○common.h
557の
>LNK2005: "struct a b" (?b@@3Ua@@A) は既に c.obj で定義されています。
このエラーは元のコードのか
>c.cppファイルには定義は書いてないので定義がだぶることはないと思うのですが・・・
c.cppになくてもinclude先に
struct a b;
ってない? 直接c.cppからincludeされてなくてもincludeの連鎖上に
c.cppってでかいの?
>>560 それと関係ないけど560の
void hoge(struct x z)
は参照で受けた方が良い
structも省略して
void hoge(const x &z)
>>563 元のコードのです
c.cppは140行くらいで
#include <stdio.h>
#include "common.h"
しかインクルードしていません
あとc.cppはソルーションエクスプローラ中のソースファイルホルダの最上部に位置してます
>>564 ご忠告有り難うございます
要するに、こんな事をやっちゃってるんでそ
//--- common.h
#ifndef common_h
#define common_h
struct a { int foo; } b;
#endif // common_h
//--- main.cpp
#include "common.h"
int main () {}
//--- common.cpp
#include "common.h"
これじゃ struct a 型変数 b の実体が main.obj にも common.obj にも
存在しちゃって、リンカの中の人も困る罠。
こうすれ。なぜかは自分で考えるよろし。
//--- common.h
#ifndef common_h
#define common_h
struct a {};
extern a b; // <- このプロジェクトのどこかに1つだけ b があるよ、と
// コンパイラ (やリンカ) に指導している
#endif // common_h
//--- main.cpp
#include "common.h"
int main () {} // <- ここで b を使う事は *もちろん* 可能
//--- common.cpp
#include "common.h"
a b; // <- b の実体はここにある
>566 も↑のコードも、ファイルをそれぞれ分けて保存すれば
きちんとコンパイルもリンクも通るから。試してみるべし。
(;´Д`) 何を書いてるんだ自分は。
>566 はリンクは通らない。
>557 のエラーが再現するコードな。
569 :
デフォルトの名無しさん :04/11/13 12:56:13
メンバに2次元の文字列配列str[128][128]を持ったクラスがあります。
外からこの文字列配列を丸ごと取れるようにしたいんですが、
どうやって書いたらよいのでしょうか。
文字列を返す為のメンバ関数の型とか、
もらう方の側の書き方とかがどうすればよいのか分かりません。
(もらう方法があるとしたら)もらう方の文字列をstr2[128][128]として、
サンプルを書いていただけると大変助かります。よろしくお願いします。
char const (&get_str())[128][128] const{ return str; }
char const& str2[128][128] = moge.get_str();
constの位置間違ったかもしれない。
まぁいいか。
572 :
デフォルトの名無しさん:04/11/13 13:27:28
>>570 ありがとうございます。
関数の方が初めて見る書き方でどこが切れ目か分からないので
とりあえずクラス定義の中にそのままの形で書いてみたのですが、
・const char (' は不正です
・{' の前に予期しないトークンがありました。関数の本体は無視されます
と怒られました。
できたらクラス定義の外で「戻り値 クラス名::関数名()」みたいに書く
方式で教えていただけないでしょうか…
class Hoge
{
char str[128][128];
public:
const char (&get_str())[128][128] const;
};
const char (&Hoge::get_str())[128][128] const {return str;}
でもこれぐらいインライン展開した方がいいと思うけど。
やっぱconstの位置間違ってたわ。
char const (&get_str() const)[128][128]{ return str; }
たびたびすいませんです。今度は呼ぶ側で怒られました。
こっちは変更いらないんですよね?
ちなみに環境はVC++ですが、環境のせいとかありえますかね…
: 参照の配列は宣言できません。
: 'const char [128][128]' から 'const char *[128][128]' に変換することはできません。
(新しい動作 ; ヘルプを参照)この変換が可能なコンテキストはありません。
呼ぶ側も間違った
char const (&str2)[128][128] = moge.get_str();
俺もそろそろぼけ始めたか・・・。
typedef したらどう書ける?
>>576 成功したみたいです。なんか難しいですね。
あんまり意味を理解できてないですが。。。修行します。
度々すいませんでした。ありがとうございました。
std::vector<std::string>じゃダメなのか?
>>579 参考のためにSDL(?)での書き方も教えて
頂けるとかなり嬉しいのですが。
>>567 ばっちりうまくいきました
本当にどうもありがとうございました
583 :
デフォルトの名無しさん:04/11/13 18:58:57
すいません質問があります。
strcspn関数についての質問なのですが、
文章の中で全角スペースがある場所までのバイト数を求めたいのですが、
int aNum = strcspn( "あいうえおーかきくけこ", " " );
とやると aNumに 10が入ってしまいます。
なぜか全角スペースの検査に"ー"が反応してしまうようなのですが、
これは何か使い方を間違っていますでしょうか?
例えばShift_JISにおいては、" "は0x81と0x40という二つの文字からなる文字列だから、
strcspnは0x81と0x5bからなる"ー"という文字列の文字0x81を検出した。それだけ。
>>581 STL(standard template library)な。
class hoge{
std::vector<std::string> fuga;
public:
std::vector<std::string> get_fuga(){return fuga;};
};
586 :
デフォルトの名無しさん:04/11/13 21:12:50
すいません。今勉強中の身でタダの愚痴なんですが、ポインタは、例えば
int *ptr;
とせずに
pointer int ptr;
という表現で、設計すればよかったんでは?const int a; を見て思い付きました。
なんで int *ptr; という表現になっちゃったんでしょうか??
初期の学習者は、*演算子の意味と混同しそうだし、関数へのポインタの表現も少しややこしく見えます。
ただ自分が見慣れていないせいだとは思いますけど。
関数へのポインタの表現はtypedefでもすれば、初心者でも
大丈夫だと思うんだが。
>>586 キーワードを増やしたくなかったんだろう。
>>586 template <class T> class ptr;
でも作りなされ(w
>>586 int *ptr は、ptr 変数に * をつけて逆参照すると int 型だよー、っていう意味。
pointer キーワードを使うと、そういう意味がわからなくなるね。
んじゃ、
int a;
int * ptr = & a;
* ptr = 0;
のかわりに、
int a;
pointer int ptr = enreference(a);
dereference(ptr) = 0;
とでもするかね。
>>585 ありがとうございます。
覚えたら書き方的には分かりやすそうでよいですね。
勉強になりました。ありがとうございました。
むしろ俺はなんで*なのか?なんだよな
&じゃだめだったのかな?
>>593 & をつかうんだったらさ、
int* &ptr;
は、ptr に & をつけたら int* 型だよ、となっていいけど、
int &ptr
は、ptr に & をつけたら int 型だよ、となって
これは逆参照を表す。
つまり、アドレスをとる & 演算子と、逆参照の & が混同しちゃうだろ。
単項 -> <-演算子を定義しても良かったかもね。
int i;
int<-p = ->i;
int j = <-p;
いややっぱ分かりにくいわ。
&*は一文字で適度に目立つのがいいね。
APLの悪夢の再来ですか?
みなさん愚痴を聞いて頂いてありがとうございます m(_ _)m
typedef, template はまだ到達してません…
ポインタ宣言は
>>590さんの書き込みでやっとはっきり理解できました。ありがとうございました。
最近、クラスを勉強し始めた。
でも、クラスの利点がイマイチ分からない。
サンプルを用いながら、「ほら、こんなに便利!わかったかゴルァ!!」
ってな感じにおしえて!
憂鬱本を買って読む。これ。
Delphiでもさわってみれ
クラスが分かると、世の中に出回ってるC++で書かれたライブラリを利用できるようになります。
ね、便利でしょ?w
>>598 std::stringとかstd::vectorとか便利。
面倒なメモリ管理から逃れられる。
>>598 C使いで構造化プログラミングに精通しているなら、「情報の隠蔽化」だけでも便利だと思う。
その方向でよければ具体例を挙げてみようか?
>>598 とりあえずクラスの意味を勉強しておいて、
クラスが使われているコードを数多く読むようになれば
その便利さやきれいさがわかる。
勉強してすぐによさが分かりにくいものって、よくあるよね。
そういうときはとにかく詰め込んでおけばいいと思うよ。私は。
本質的にクラスが良く分かると、世の中に出回ってるC++で書かれたライブラリを使いたくなくなります。
他人の書いたクラスはよう分からん
>>607 あなたか
その他人がクラスをあまり理解していないと思われます
最初はパターンを使ってエレガントに書いてたとしても
だんだん汚くなってきて終いには訳が分からなくなるもの
それでwindowsとかmacOSみたいな代物が世の中に出回ってるわけね
正直、継承とかってガンガン使ってる?
>>611 逆に聞こうか。
使わないでどうしてるんだ?
バカみたいに継承するのはやめてください
正直、実装含む多重継承とかってガンガン使ってる?
継承するより、直にクラス使うほうが軽いんでない?
オブジェクト指向が出て来た頃は継承はもてはやされたんだろうが、
最近では継承を出来るだけ使用しないと考え方が広まってきたんでしょ。
無駄な継承はデバッグを困難にさせ、結局は開発効率を落とすとか。
MFC使うと嫌でも継承使う羽目になるのだが、自分ではそれほど継承を使うことはない。
つーか、多段継承クラスを作ることは少ないと言うべきだったか。
つーかそれは継承以前の問題じゃ。
620 :
デフォルトの名無しさん:04/11/14 19:21:51
int a=10;
int b=10000;
a=a+a;
b=b+b;
の計算はどちらが速いのでしょうか?
桁数が多いほど計算速度も遅くなるのでしょうか?
いっしょ。
ならない。
622 :
訂正:04/11/14 19:23:20
for (i=0;i<1000;i++)
{
a=a+a;
b=b+b;
}
です
623 :
デフォルトの名無しさん:04/11/14 19:24:06
>>621 なんでですか?
桁数が多いほど遅くなりそうな感じがするのですが…
>>623 桁数の応じて遅くなったら困るだろ。
CPUの設計者がそこらへん気を使ってくれてるんだよ。
625 :
デフォルトの名無しさん:04/11/14 19:30:13
簡単なテスト用コードお願いできますか?
>>623 桁数が多いほど遅くなりそうに思うのはなぜだい?
もちろん32ビットCPUで64ビット整数の演算をさせたら大抵32ビット整数演算の2倍の時間が掛かるし、実数演算は更に時間が掛かる。
int型はそのマシンで最高速度の演算が可能な大きさであることが保障されているので
int型に入るならどんな計算も一緒
>>628 そんな保証はねーよ。
「自然な」とかいういいかげんな指定があるだけ。
では
int a = 10, b = 100000;
int c = 2, d = 997;
a = a / c;
b = b / d;
だと、どちらが速いですか?
じゃ、volatile 付けたとして。
T[1000000]に対する演算だったりするとTの型でかなり処理時間かかるけどな。
コンパイラが非常に賢ければ/2はshiftにしてくれるかもしれんが
まあ一緒だろうな
いや、どちらも最適化で割り算そのものが消える。
637 :
デフォルトの名無しさん:04/11/14 21:08:25
gcc環境でC++によるコマンドラインプログラムを作っており、悩んでいることがあります。
起動時に設定ファイル(パラメータが入っています)を読み込みたいのですが、
作ったプログラムと同じディレクトリに置いてある設定ファイルを読むためにはどのよう
に記述すれば良いしょうか?
設定ファイルをソースの中に埋め込んでも良いのですが、
ほぼ一つしか使うことが無いとはいえ2種類あり、
一つが3000行ちかくありますので
外部に出したほうがよいと自分は考えております。
FAQでしたら申し訳ありません。
639 :
デフォルトの名無しさん:04/11/14 21:13:32
C言語からORACLEのPL/SQLを呼びたいのですが
どうしたらできます?
>>630 x86アーキテクチャではこっちの方が速い
unsigned int a = 10, b = 100000;
unsigned int c = 2, d = 997;
a = a / c;
b = b / d;
>>639 OracleJapanに問い合わせる。
#そしてoo4oを使う羽目になる。
>>638 そそ、シフトがどうとかではなく、単にどちらもイミディエイトな代入になることが予想される。
9
3969
29929
1999396
299739969
2909199969
19299599929
909995799969
???????????????
なんかC言語知ってる方なら?に入る数字がわかるらしいのですが・・・
わかる方がいたなら教えてください、お願いします・・・・
>>636 a,b代入されてるじゃん多分消えないよ
>>640 ただし、最適化を一切行なわない、比較する意味のない条件においてのみ。
>>637 カレントワークディレクトリに置いていいならfopen("foo", "r")でいいだろう。
実行モジュールと同じディレクトリに置きたいなら、環境依存。
Unixなどのコマンドライン環境では、一般的には無理。
Windowsでは限定的には実行モジュールのあるディレクトリ=カレントワークディレクトリとなるが、
決定的ではない。
>>637 移植性を考慮しないならOSなどの環境を書いて再度相談すべし。
割り算が消えるというのは
掛け算に直されるという意味ですか?
>>644 > Windowsでは限定的には実行モジュールのあるディレクトリ=カレントワークディレクトリとなる
Windowsでもそんなことは期待できない。
WindowsならGetModuleFilename()が使える。
>>648 あなたの頭にある、その白地に黒っぽい丸の描かれた球状の物体はガラス細工か何かですか?
>>644 >>645 お返事ありがとうございます。
将来的にはWINDOWSでも動かしたいなとは思っています。
現時点では、UNIXで動作すればよいです。
一応自分なりの考えをまとめました。
CFLAGSで、make installで入る予定のフォルダを指定してプログラム内に埋め込む。
プログラム内で、
実行モジュールと同じディレクトリと、カレントディレクトリ
の2箇所に設定ファイルがあるかどうかを確認する。
発見できればOK、無ければエラー終了。
と考えております。
>>649 「限定的には」「決定的ではない」なんてのはちゃんと読んだ上で言ってんだよ。
644の書き方だと、UnixとWindowsでOSレベルの差が有るように読めちゃうだろ。
operator+=を書くときに
メンバとして
Hoge& operator+=(const Hoge& h)
と書くのと、グローバルに
Hoge& operator+=(Hoge& h1, const Hoge& h2)
と書くことの違いはなんですか?
特に違いは無く後者のほうはHogeと関係の無いところで演算子を定義できる便利機能ということでしょうか?
>>653 違いはメンバ関数か否か、としか言いようがないな。
大抵はprivateメンバを触る必要があるだろうからメンバになるけど、
friendにする必要がなければグローバルでも全然問題ないし。
継承とか
継承はポリモーフィズムを活用するために利用するのであって、
インタフェースが似てるからとかいう理由だけで継承するのは
間違い。
>>653の質問に関連するとおもいますが、
class Complex
{
double r, i;
public :
Complex(double r= 0.0, double i = 0.0) : r(r), i(i) {}
double real() const{return r;}
double imag() const{return i;}
Complex & operator += (const Complex & rhs) throw ()
{
r += rhs.real();
i += rhs.imag();
return *this;
}
};
上で定義した複素数クラスで複素数同士の和を計算するオペレーター
operator += (const Complex & rhs)
では、引数が1つですが、
a+=b
を計算すると、どうしてa+bが計算されるのかわからないんす。
この場合、引数はbだと思いますが、aも引数にならない(なっているのかもしれない)
んでしょうか?
どう考えたらいいんすか?
とにかく、お聞きしたいのは、引数が一つでありながら、引数が2ついるような計算が
どうやって実現されているのか、っす。。
>>658 a+=b;
は
a.operator+=(b);
>>650 UNIXだと
インストール先のパスをPREFIXとすると
その手の設定ファイル(仮にhoge.confとする)は
$PREFIX/share/hoge/hoge.conf
こんな感じに置くのが一般的な気がする
PREFIXは
$ ./configure --prefix /usr/local
こんな感じで指定
661 :
デフォルトの名無しさん:04/11/14 23:06:36
すいません初歩的な質問かもしれません。
C言語の標準命令でコンソールアプリケーションのカーソルを
移動させたり画面を消去したりする命令があれば教えてください。
printfでエスケープシーケンスを使う以外の方法が知りたいのですが‥
よろしくお願いします。
>>661 ないよ。
コンソールのカーソルなんて想定されてないし。
>>661 環境依存だけど
UNIX
system("clear");
Windows
system("cls");
>>661 #include <windows.ini>
COORDp;
p.X = x;
p.Y = y;
SetConsoleCursorPosition(h, p);
>>662-664 即レスありがとうございました。
標準命令ではないんですね。
>>664さんの方法でも調べてやってみます。
この場合コンソール画面のハンドルを取ってこないと駄目なんですね。
画面消去だけなら
>>663さんの方法でできそうなんでこちらも参考にさせていただきます。
どうもありがとうございました。
>>650 正しくないとは思いつつもbin/以下に設定ファイルを入れてました。
早速shareに変更します。
ありがとうございました。
>>653 friend関数なら多態が効く。
メンバ関数は効かない。
確かにクラスを使うと頭の整理はつくが、
デバッグは面倒になったような気がする。
hoge.exe の 0x00478bd0 でハンドルされていない例外が発生しました : 0xC00000FD: Stack overflow。
というエラーが出て
黄色い矢印がこの行を指してました
if (abs(a)==abs(b))
どうすればいいのでしょうか?
考えられる原因や対策を教えてください
>>670 >どうすればいいのでしょうか?
ソースを晒す。あと環境も。
>>668-669 いろんな力量の人が係わってるプロジェクトでは現実そうなるのでは。
スーパーハカー集団が組んでるならどんなクラスを使ってもいいんだろうけど。
>>671 ソースはサイズが大きいので無理です、すいません
環境はVC++.netです
>>672 いろんな力量の人が係わってるプロジェクトを純Cで遂行したら
その方が遥かにデバッグが面倒だと思うが?
>>673 初心者が何処で勘違いしてるかなぞソース見な誰もわからん。
ソース晒すのが嫌なら自力で解決しろ。
abs()が再帰しているか、defineマクロでaとかbとか使っているか、その辺かな?
>>667 単純ミスだとおもうのですが、メンバとfriend指定が逆ですよね。
Base*に入れた派生型のオブジェクトに対して呼ばれて欲しいoperatorが呼ばれないと。
そういうことですね。
>>659 >a.operator+=(b);
レスどうもです。
それでも、やっぱり引数が一つ(b)なのにもう一つの「a」 との和が計算できる
理由がわからんのです。。
それとも「a」も引数と考えていいんですか。。。?
679 :
デフォルトの名無しさん:04/11/15 08:20:38
char str[128]に入っている文字列を
LPSTR型に変換するにはどうしたら良いでしょうか?
>>678 > それとも「a」も引数と考えていいんですか。。。?
それが正解。
「thisポインタ」を調べれ。
>>678 そんじゃ君は
a.operator+=(b);
~
↑このaが意味ないと思ってるワケ?
C風に書くと
a->operator+=(this, b);
>>650 >CFLAGSで、make installで入る予定のフォルダを指定してプログラム内に埋め込む。
別の案としては今作っている実行ファイルは直接は呼び出さないようにして
$PREFIX/lib/hoge/hoge.real
みたいにパスの通ってないところに置いといて
hoge.realを呼び出す以下のようなhogeを$PREFIX/binに置いておくとか
$ cat hoge
#!/bin/sh
PREFIX=`which hoge | sed 's/\/bin\/hoge/ /g' | awk '{print $1}'`
$PREFIX/lib/hoge/hoge.real "$@"
exit
>>666 各ファイルの置場は
$ man hier
が参考になるよ
UNIXプログラミング質問すれの方が良いレスがつくかもね
ちょっと補足すると
hoge経由でhoge.real(当初のプログラム)を起動することで
arg[0]
からPREFIXが分かり設定ファイルの位置($PREFIX/share/hoge/hoge.conf)が特定出来ます
PREFIXの解析をダブらせたくなかったら
$ cat hoge
#!/bin/sh
PREFIX=`which hoge | sed 's/\/bin\/hoge/ /g' | awk '{print $1}'`
$PREFIX/lib/hoge/hoge.real $PREFIX "$@"
exit
みたいにしてhogeで得たPREFIXを引数に渡して起動してもいいかも
a+=b;
と
a=a+b;
は同値と形で覚えちゃえ!
a+=b;
を「aに足すのはb」と読むようになったら違和感なくなった。
fgetsでテキストファイルから読み込んだ時のストリームのフラッシュには
どのようにすればいいのでしょうか、
>>687 読み込んだときにフラッシュする必要はないと思うのだが。
再度読ませたいならシークすればいいかと。
a+=b;
は
mov eax, a;
add eax, b;
mov a, eax;
と覚えたら違和感なくなった
>>689 むしろ
lea eax, a
mov ebx, b
add [eax], ebx
の方がイメージ近くないか?
初心者にゃわからんて...orz
>>682 >a->operator+=(this, b);
なるほど。。そう見るってことっすか。
ちょっと目から鱗が落ちた感じっす。
どうもありがとうっす!
在日 +=ニューカマー
mov ニューカマー、半島人
add 密入国者、ニューカマー
mov 在日、密入国者
w
695 :
デフォルトの名無しさん:04/11/15 21:19:55
VC6 を使っているのですが、
MSDN に setvbuf で指定できるサイズの上限は 32768 未満
と書かれているのですが、1MB を指定してもエラーにならないのはどうしてでしょうか。
so-suyome
VC6 の CRT ソースコードは次のようになっていた。
#ifdef _WIN32
if ( (type != _IONBF) && ((size < 2) || (size > INT_MAX) ||
#else /* _WIN32 */
#if defined (_M_MPPC) || defined (_M_M68K)
if ( (type != _IONBF) && ((size == 0) || (size > INT_MAX) ||
#endif /* defined (_M_MPPC) || defined (_M_M68K) */
#endif /* _WIN32 */
((type != _IOFBF) && (type != _IOLBF))) )
return(-1);
MSDN のドキュメントは 16 ビット コンパイラでも
動作するように書かれているわけかな。。。
>>685 それは結城浩的には「aにbを足し込む」だな
699 :
デフォルトの名無しさん:04/11/16 20:15:47
原因不明のバグに取り憑かれてしまった
こんなのありえねーってなバグ
どんなの?
しかしこいつもしつこいな
いつまで粘着するつもりだ
とりあえず下げることを覚えろ、この池沼めが
>>698 += 足し込む
-= 引き込む
*= 駆け込む
/= 割り込む
&= 且つ込む
|= 或は込む
<<= 論理左シフト込む
>>= 論理右シフト込む
足し込む以外はちょっと不自然かな。
ちょっとどころじゃないだろw
a.func();
は、「aにfuncをどっとこむ」
a+=b 「a」に「足す」の「は」「b」
a-=b 「a」から「引く」の「は」「b」
a*=b 「a」に「掛ける」の「は」「b」
a/=b 「a」を「割る」の「は」「b」
a&=b 「a」に「andる」の「は」「b」
a|=b 「a」に「orる」の「は」「b」
a<<=b 「a」を「左シフトる」の「は」「b」
a>>=b 「a」を「右シフトる」の「は」「b」
後半の演算子を「〜る」にしたのはちょっと不自然かな。
fuck
関数内でreturn書いたらそこから呼び出し元に戻るんですよね?
関数内の途中でで処理を終了したいときはそこにreturnを書けばいいのでしょうか?
Visual C++ (Mac版)ってないんですか?
すごくやりたいです。
もうCodewarriorやProject builderから逃げ出したいんです。
でもMacからは離れたくないんです。
夜も眠れません。。
だれか助けて。。
>>710 >もうCodewarriorやProject builderから逃げ出したいんです。
その気持ちはわかる。
>でもMacからは離れたくないんです。
その気持ちがわからん。
Macだとマシンの構成からOSまで全部同じなので調べるときに迷わないで済む。
システムオタクだっていうなら好きにしてくれ。
未だにMacOS7.6.3使ってるからOSXなんてちっとも判りませんが何か。
>>709 出来るけど、returnは関数の最後にひとつだけが好ましいとされている。
これもgoto論争ほどではないにしても昔から言われている問題。
簡単に構成しなおせるなら最後にひとつだけになるようにするほうが無難だと思う。
とりあえず、喪前が書こうとしている関数をさらしてみれ
#include <stdio.h>
struct a
{
int x;
int y;
};
int main()
{
struct a b[3];
b[0]={1,2};
}
としてbに値を代入しようとするとエラーが出ます
なぜでしょうか?
718 :
デフォルトの名無しさん:04/11/17 13:41:39
charからTCHARに変換するときって何使うんですか?教えてください。
>>717 >b[0]={1,2};
これは何ですか?
>>719 b[0].xに1
b[0].yに2を代入しようとしたのです
せめて入門書くらいは読め
もし既に読んでてその程度なんだったら人間やめろ
>>717 変数宣言時にこうやって初期化するしかない。
struct a b[3] = {{1,2}, {3, 4}, {5, 6}};
これは後に改良されていてC99対応コンパイラならb[0] = (struct a){1, 2};とできる。
C99非対応コンパイラでもこういう関数を作ることもできるがおすすめしない。
struct a create_a(int a, int b)
{
struct a new_a = {a, b};
return a
}
C++ならこういうのをコンストラクタに用意するのはたまに見かける。(これは良いと思う)
>>722 お返事ありがとうございます
早速試してみます
>>723 書き忘れていたけど、当然こう書く方法もある。メンバ数が少ない物限定だが。
b[0].x = 1;
b[0].y = 2;
726 :
デフォルトの名無しさん:04/11/17 14:43:54
やさしいCにあったコードですが、
#include <stdio.h>
int main(void)
{
FILE *pf;
pf = fopen("test.txt", "w");
if (pf == NULL)
{
printf("ファイルをオープンできませんでした。\n");
return 1;
}
else {
printf("ファイルをオープンしました。\n");
}
fclose(pf);
printf("ファイルをクローズしました。\n");
return 0;
}
なぜ return 1 と return 0 を使い分けているのですか?
>>726 そのプログラム単一では意味がないけど
別のプログラム(Aとしよう)からそのプログラム(Bとしよう)を呼んだ場合に
Bの返り値(returnで返す値)によってAのその後の処理を分岐するのに使用する
プログラム終了時や関数終了時の返り値は基本的に
0が正常終了でそれ以外は異常終了ってことが多いから。
他のプログラムや関数で利用するときに便利でしょ。
729 :
デフォルトの名無しさん:04/11/17 14:56:24
>>727 なるほど、そういうことでしたか。
ありがとうございます。
732 :
デフォルトの名無しさん:04/11/17 15:37:39
C++でμs単位でプログラムの実行を待機させるいい方法ないですか?
volatile { a = a; }
>>732 マイクロ秒待機させるってどんな用途なの?
制御系だったら、チップによって違うだろうけれど内部になんらかのタイマを持っているんじゃない?
739 :
デフォルトの名無しさん:04/11/17 16:02:01
>>734 C++でネットワークのシミュレーションを行っているのですが、
その中で使いたいと考えているのです。
環境くらい書け
742 :
デフォルトの名無しさん :04/11/17 16:07:30
.NETプログラム(__gcのついたクラス内)で、STLとか、
CのファイルAPIとか(FILE*とか)使うには
どうするんですか?
String*はwchar_tに変換できるみたいですが、
デフォルトでwide characterを使用するんですかね?
743 :
デフォルトの名無しさん:04/11/17 16:07:32
>>740 違います。ms単位でのやり方はわかっていたのですが、
もっと精度の良い方法はないものかと思って質問しました。
環境くらい書け
745 :
デフォルトの名無しさん:04/11/17 16:12:21
>>743 あるにはあるけれど、マイクロ秒だと結果に誤差がありすぎて使いものになるかどうか
わからないよ
747 :
デフォルトの名無しさん:04/11/17 16:18:42
>>746 そうですか・・・
けど、一応教えていただけますか?
Windowsでμ秒を扱おうなどとは笑止。
749 :
デフォルトの名無しさん:04/11/17 16:33:02
パソコンなんぞでμ秒を扱おうなどとは笑止千万。
>>742 コピーコンストラクタを持たないGCのクラスにSTLは使えないらしい。
>>752 普通GCクラスはコンテナに入れるときもポインタ使うから
コピーコンストラクタは不要かと。
パソコンでピコ秒を扱うスレはここですか?
μ秒を扱いたいなら組み込み系
756 :
デフォルトの名無しさん:04/11/18 04:20:59
手元の本に「(デバッグが面倒でも)最低でもassert()は使え、使いまくれ!」
とあるので早速私もassert教にに入信しようと思ったのですが、
assert()ちゅうのはReleaseビルドだと完璧に無視されるのでしょうか?
ヘッダとやらを覗いてみてもプルプロセッサがゴチャゴチャしてて降参です。
はいそうです
>>757 便利なもんですなー、跡形もなくなりますか
使いまくります、レスありがとうございました
コードコンプリート?
static constなメンバ変数を初期化するのに、ヘッダにて
const int Hoge::value = 0;
と書いて複数翻訳単位からincludeするとリンカで多重定義だとおこられますよね。
しかし以下のようなtemplateクラスの場合は問題ないようですがどうしてでしょうか?
template<typename T> const T Hoge<T>::value = 0;
複数の翻訳単位でそれぞれ例えばHoge<int>を実体化させれば
valueもそれぞれに定義されそうですが。。。
ちなみに特殊化バージョンでは怒られました。
template<> const int Hage<int>::v = 0;
VC6です。
VC6を捨てるのが一番。
>>762 これは規格どおりの動作。どのコンパイラでも同じだろう。
たぶん
>>760 は
>static constなメンバ変数を初期化するのに、ヘッダにて
>const int Hoge::value = 0;
>と書いて複数翻訳単位からincludeするとリンカで多重定義だとおこられますよね。
これの理由も分かっていないと思われ
ん、わかってるけど初心者スレなんだから、理由説明したってわからんでしょ。
それはそういうものだとしとくのが一番。
あー、初心者スレじゃなかったな。スマソ。
でも理由は面倒なので説明しない。
One Definition Rule(ODR) と、キーワードを置いておこう。
>>768 ODRは
>>765に対するキーワードですよね?
>>760ではtemplateにしたところで複数翻訳単位から実体化すれば
ODRに引っかかるのではないのですか?という質問です。
main.cppでHoge<int>使用 Hoge<int>::value = 0;
sub.cppでHoge<int>使用 Hoge<int>::value = 0;
↓
リンカであぽーん
とならないのは何故ですかという質問です。
あれれれれ。そんなことを言い出すとテンプレートすべてがODR違反になりますね。
結局
>>764ということで、templateとして解決されるということか。。。
>>771 えぇぇ。まだ間違っているの?
もう頭がパンクしました
複数の翻訳単位で実体化したとしても同じ型のテンプレートクラスは
1回しか生成されない罠。
でなきゃテンプレート使ってられないだろ。
>>773 了解です。
最初におおきなかん違いをして混乱しました。
775 :
デフォルトの名無しさん:04/11/18 18:55:33
ある変数の値が真になるまで待ってから次の処理を行う、という感じの
ソフトを作ってますが、CPU 使用率が 100% になってしまいます。
(あたりまえですが )
何か良い方法ってありませんでしょうか?
776 :
デフォルトの名無しさん:04/11/18 18:56:34
待ち時間はCPUを占有するな
以上
777 :
デフォルトの名無しさん:04/11/18 19:05:46
>>776 どうすれば占有しないように出来ますか?やっぱり sleep ?
>>777 ・自分で見に行くのではなく、通知して貰えないか検討する。
・自分で見に行くなら最低限、ほんの僅かでもsleepする。
#Unixならselect()で代用化、Win32APIならSleep(1)。
779 :
デフォルトの名無しさん:04/11/18 19:40:03
>>778 ありがとうございます。
やっぱりそうですよね。Unix でネットワーク関連やったときは
select で行えたので問題なかったので、大丈夫と思ってましたが
Win では select が使えないでこういう問題になってしまいました。
通知というのは Unix でいうところの signal のようなものですね?
関数に戻り値がない時はreturnは書かなくてもいいのでしょうか?
return を値を返すもの、という考え方より
(関数に入って)戻ってくるという考え方の方がいいかと
ループ途中に一定条件で return で関数抜けるときとかによく使うしね
>>779 いや、Win32APIなら通知して貰う手段は色々あるよ。専用スレで聞いてみたら?
>>775 Windowsならある変数(boolだよな)の代わりにイベントオブジェクトを作り、待機にはWaitForSingleObject()などを使う。
785 :
デフォルトの名無しさん:04/11/18 23:10:17
ある未知のクラスに対し、何らかのイベントが発生したことを知らせたいのですが、
次の3つの方法以外に何かスマートな方法はありますでしょうか。
・(Cの)コールバック関数を接続する
・連絡用のクラスを作り、未知のクラスにこのクラスを継承させる
・externで連絡先クラスのオブジェクトを取り込む
具体的には、Qtのsignal/slotのような手法を取りたいのですが、
標準のC++でこれに似た方法は何かないですか?
786 :
785:04/11/18 23:18:29
つまり簡単に言うと、コールバック関数の接続をCの関数ではなく、
クラスのメンバ関数に行えるようにしたいわけです。
787 :
デフォルトの名無しさん:04/11/18 23:24:51
ソースに
printf(" %7.4f と %7.4f です。\n",x1,x2);
っていうのがあるんだけど、7.4って何?
789 :
デフォルトの名無しさん:04/11/18 23:25:52
>>788即レス 感謝です。
脊髄反射で間違えた(;´Д`)
全体で7桁揃えで、小数部の精度が4桁
整数→文字列への変換を行う関数ってありませんか?逆はatoi関数でできると思うのですが…
itoaか、printf系関数で%dを指定
itoaでしたか…ありがとうございます。
解説ページにitocってあったので勘違いしてましたorz
boost::lexical_cast<std::string>()が一番楽
そして一番遅い
しかし安全
そしてスマート
後からCOOL!!
そしてそのうち標準
例えばプログラムを組んでいて、クラスをほとんど構造体の代わりの
ように使いたい場合があります。
class A {
public:
int a;
int b;
};
のようなコンストラクタやデストラクタが明示的に定義されてないクラスの場合、
コンストラクタやデストラクタはデフォルトが使われるようなのですが
この場合のデフォルトコンストラクタ、デストラクタでは何が行われる
んでしょうか? a, bが0に初期化されたりするんでしょうか?
上記のような構造体代わりに使いたいクラスの例の場合、コンストラクタ
デストラクタは省略しちゃっていいんでしょうか?
>>800 デフォルトコンストラクタとデストラクタは何もしない
コピーコンストラクタは文字通りコピーする
構造体代わりに使いたいのであれば、struct使えばいいような。
違いはメンバのデフォルトがpublicかprivateかというだけな訳で。
>>800 むしろコンストラクタなしにしないと自由度が下がる。
A array[] = {
{ 10, 20, },
{ 30, 40, },
};
コンストラクタがあるとこんなことができなくなる。
構造体代わりに使いたいのであれば、構造体使えばいいような。
違いはメンバのデフォルトがpublicかprivateかというだけな訳で。
たしか継承する時にもpublicかprivateの違いでてこなかったか?
>>800 引数を必要としないコンストラクタとしての「デフォルトコンストラクタ」と紛らわしいので、
その意味では「デフォルト」と言わないほうがいい。
規格中の言葉に従って、「暗黙の」と言うのがお勧め。
暗黙のデフォルトコンストラクタは A() {} と同じ。
暗黙のデストラクタは ~A() {} と同じ。
>>805 明示的にA()呼べば、暗黙のデフォルトコンストラクタはメンバを初期化してくれる。
807 :
デフォルトの名無しさん:04/11/19 02:13:12
>>807 "butil.h"って何?これも晒してくれない事には何とも言えない。
どっかで
#include <vector>
と
using namespace std;
されちゃってるんじゃないかな。
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
この辺怪しそう。
つーか使うなこんなの。
どっちにしろvectorは紛らわしいから名前変えてみたら?
>>809 サンクス。
>>807 Number *vector(long nh);
こういう名前の関数は取りあえず名前替えれ。
813 :
デフォルトの名無しさん:04/11/19 03:37:31
namespaceについて教えてください。
以下のようなソースを書きましたが、
'hoge' : 識別子がクラス名でも名前空間名でもありません
というエラーが出てコンパイルが通りません。
ポインタしか定義してないのでTestA.hはなるべく
includeしたくないのですがこういう場合どうするのが一般的なのでしょうか?
TestB.h の方に namespace hoge{ class TestA; }
というダミーの宣言(?)をつけておけば
一応コンパイルは通りますが何か気持ち悪いです。
======================
TestA.h
namespace hoge{
class TestA
{
};
}
======================
TestB.h
class TestA;
class TestB
{
hoge::TestA* ptrA;
};
正解は
======================
Test.A_fwd.h
namespace hoge{
class TestA;
}
======================
Test.A.h
#include "TestA_fwd.h"
namespace hoge{
class TestA
{
};
}
======================
TestB.h
#include "TestA_fwd.h"
class TestB
{
hoge::TestA* ptrA;
};
815 :
デフォルトの名無しさん:04/11/19 14:02:59
以下のようなソースがうまく動かないんですけど、どこに問題があるのですか?
getcharを無視して後のコードを処理してしまいます。
do {
printf("終了しますか(Y/N)?\n");
ch = getchar();
} while (ch == 'Y' || ch == 'y' || ch == 'N' || ch == 'n');
試しに以下のように変えてみてもやはりうまくいきません。
printfが2回でてしまいます。
while (1){
printf("終了しますか(Y/N)?\n");
ch = getchar();
if (ch == 'Y' || ch == 'y' || ch == 'N' || ch == 'n'){
break;
}
}
上のコードで、whileの後の
ch == 'Y'とかは ch != 'Y'の
書き間違いです。
>>815 それは多分、そのコード以前にscanf等の関数で処理されなかった
改行コード等のゴミが標準入力に残ってるからだと思われ。
面倒なら、do {の前にfflush(stdin);を入れてみるとか
>>817 レスありがとうございます。
fflush(stdin);を入れると、while(1)のほうではうまくいきました。
do の方はどうもうまくいきません。
819 :
デフォルトの名無しさん:04/11/19 14:25:49
char *p = malloc(100);
if(p==NULL){
エラー処理
}else{
本処理
free(p);
}
Cでmallocに失敗したとき、エラー処理をしている人はいますか?
また、エラー処理にはどんなコードを書きますか?
実際に書いている人がいたら具体的に教えてください。
>>819 俺はこうしている。
if (p == NULL)
return エラー値;
失敗時に0を返す関数なら0を返すし、失敗時に1を返す関数なら1を返す。
815
doの中にも
ch = getchar();
fflush(stdin);
とすることでprintfが2回処理されるのはなくなりました。
whileの条件式も
while (ch != 'Y' && ch != 'y' && ch != 'N' && ch != 'n');
でした。
初心者に付き合っていただいてありがとうございました。
根本的に間違っているけどまぁいいか。
>>820 同一ブロック内でmalloc/freeが完結しているような処理で、
エラーを返すインターフェースのない場合のエラー処理について聞きたいのですが。
そういうのはよくない、内部でmallocしているすべての関数にエラーを返す
インターフェースを作れ。という方針でやるべきですか?
824 :
デフォルトの名無しさん:04/11/19 14:54:34
質問です。
WindowsXP 上で、VC++ 6.0 SP5 を使っています。
ある MFC プロジェクトを新規作成し、
「プロジェクト」→「プロジェクトへ追加」→「ファイル」を用いて
外部から test.cpp と test.h を追加しました。
FileView にはこの2つのファイルが、
ClassView にはこのクラス内で定義されているクラスが表示されています。
プロジェクト名を Project とすると、CProjectView というクラスが最初から定義されていますが、
そのクラスの定義部分の // アトリビュート とあるところに、
(line:22) public:
(line:23) CClass test;
と追加したところ、
〜\projectview.h(23) : error C2146: 構文エラー : ';' が、識別子 'test' の前に必要です。
と言われました。
test.cpp、test.h は書籍の付録についていたもので、
22〜23 行目(上記)はサンプルを見てコピペしたものなので、エラーはないと思います。
プロジェクトへの追加方法が間違っているのかと思うのですが……。
よろしくお願いします。
825 :
824:04/11/19 14:55:45
書き忘れました。
CClass は、test.h で定義されているクラスです。
includeしてないんちゃうんか
>>823 do{}while(failed);
を書いておく。
失敗を外部に伝える手段が無い=絶対に成功しなければいけない関数で、
万が一失敗してしまったら、その関数を終わることが出来ない。
成功するまでひたすら繰り返すしかない。
失敗したくせに何事も無かったかのように関数を抜けるのは最悪のパターン。
>>823 例えば関数内でのmalloc()で確保するメモリ量が関数内で見積もれる場合、
MBオーダーでもなければ私はエラー処理しないこともある。
#外部要因でサイズが変わる可能性がある場合、そのサイズに制限がなければエラーチェックすると。
>>823 if (p == NULL)
{
puts("スマソ\n");
abort();
}
敢えてぬるぽを起こさせるべきだろう
Cで、
typedef struct foo {
int bar;
char *baz;
int x, y, z;
} foo_t;
foo->bar = 0;
foo->baz = NULL;
foo->x = 1;
foo->y = 1;
foo->z = 1;
...のように初期化してゆくのと、
foo_t foo_static_initializer = { NULL, 0, 1, 1, 1 };
foo_t *foo = malloc(sizeof(foo_t);
*foo = foo_static_initializer;
とどちらがいいですか?
>>831 後者は冗長だし可読性も低いから嫌い。
前者は構造体が小さければ普通に代入。
大きければ初期化忘れ等を考慮してmemsetで0fillして0とNULLのセットを省略するとか。
>>832-833 ありがとうございます。本当は、
/*ヘッダファイル内で*/
typedef struct foo foo_t;
foo_t *foo_new(/*some hints*/);
/*.cソース内で*/
struct foo {
/*メンバが10-*/
};
で、そのメンバ初期化関数foo_new()のなかで
foo->member = value_such_as_0_and_NULL;
がズラズラ20行近く並んだのを見て、なんかちょっとなぁと思いどちらが好ましいか聞いてみたくなったのです。
メンバが少ない時は前者でFAなのですすがすっt。
>後者は冗長だし可読性も低い
これはfoo_static_initializer = { ... }でどの初期値がどのメンバに対応するか一目で見て分かりにくい、ということですよね?
foo_t foo_static_initializer = {
0, /*bar*/
NULL, /*baz*/
とか値毎にコメントを付けるのもなんか面倒そうなので
アドバイス通りcalloc()して必要なメンバだけfoo->member = ...と書くことにします。
ちょっと積み込めすぎの気がしてきたので、グループ化して分けた方がいい気がしてきまったたt
835 :
デフォルトの名無しさん:04/11/19 16:32:56
なぜRuby以外の言語はこんなに糞なのですか?
教えてください!!!!!!!!!!!
836 :
デフォルトの名無しさん:04/11/19 16:45:23
Rubyの為なら死ねる!!!!!!!!!!!!!!!!!!!!!!!!!!
837 :
デフォルトの名無しさん:04/11/19 16:47:11
Ruby is nanbar one!
838 :
デフォルトの名無しさん:04/11/19 16:50:42
普通のgccでメールを送受信したいんですが
プログラム例ってどんなもんでしょう?
839 :
デフォルトの名無しさん:04/11/19 16:51:34
>>838 Rubyなら簡単だよ!!!!!!!!!!!!!!!1
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> gcc
返事がな(ry
>>831 そこでC99ですよ。
foo_t *foo = malloc(sizeof(foo_t);
*foo = (struct foo) {NULL, 0, 1, 1, 1};
843 :
デフォルトの名無しさん:04/11/19 17:43:32
すみませんプログラミングではないのですが質問があります
Borland C++ Compilerとメモ帳を使って勉強しています
今までC言語の基礎をやっていたのですが
WINDOWSプログラミングの方に行こうとしたのですが
WINDOWSプログラミングをするとき
「Broland C++ Compilerの場合は-Wオプションをつけてください。」
と書いてあったのですが
Borlandのヘルプを色々検索したのですが
どこでその設定を変えるのか分からなく
解決できない状態になっています
どなたか解決方法わからないでしょうか?
宜しくお願いします
>>843 今まで:bcc32 hoge.c
この先:bcc32 -W hoge.c
>>844 すみませんでした
向こうに書こうと思ったのですが
向こう16日ぐらいから書き込みが無いので
こっちに書いてしまいました
>>845 ありがとうございます
ーWをコンパイルするとき挟んであげれば良いんですね。
スレ汚し申し訳ありませんでした
>>845 試したところ
無事出来ましたありがとうございました
848 :
デフォルトの名無しさん:04/11/19 19:07:05
struct pos{
int x;
int y;
}:
↑の構造体で定義したpをstlのvectorに入れたい場合どうしたらよいでしょうか。
練習としてVCでコンソールアプリを作ってみているのですが、書き方が分かりません。
cout<<"xの値を入力"<<endl;
cin>>p.x;///←エラー
:
のような感じで10個ほど列(要素?)を追加していって
構造体配列の様にして、最後に表示してみたいのですが。。。
>>848 最低一冊は入門書を読みましょう
エラーメッセージは?
それとposの定義の最後のコロンはセミコロンが正解だよ
それ言ったら全部それで済むやん
>>848 cin>>p.at(XX).x;
ではないのと、遠回しに言ってみるテスト
>>837 全角な上に綴り違いなのはネタ?
まぁ、漏れもRubyは使うけど、
C/C++とは比較対象にはならんな。
こんなアホ過ぎるエサで釣られる馬鹿初めて見たw
854 :
Ruby >>>>>>>>>>>>> C++:04/11/19 20:02:18
HSP 「21世紀にこんな言語はないだろう」 by まつもとゆきひろ
Perl 「Perlユーザは臭い」 by るびきち
Java 「Javaなんてうんこ」 by kitaj
C++ 「C++なぞ問題外.^^;;;」 by オフィシャルサイト
Ruby 「Rubyこそ最高言語」 by Rubyユーザ一同
http://web.archive.org/web/20000303064314/www.ruby-lang.org/en/compar.html Let's compare other languages with Ruby.
We take up Perl, Python, Tcl, Java, Eiffel and C++.
This is based on our own judgment and biased view, however, it does not intend to spread fibs.
----snip--
C++
C++ is famous OOPL in many places. Now, let's compare C++ with Ruby:
Ruby is too good to compare ;-)
ジョークですか。そうですか。
>>851 atっていうのは中身を取り出すやつじゃないんでしょうか?
調べても単純なintの場合とかしか載ってなくて構造体の場合の書き方が。。。
851だけどごめんよ良く読んでなかった。
std::vector<pos> vec;
for(…){…
vec.push_back(p);
}
for(i=0…){…
cout<<vec[i].x;
}
を求めてるのかな?ふつーに参考書に載ってると思われ
ってゆうか載ってなかったらその本捨てておしまい。
int* p;
int main (){
p = new int[1000]
for(int i=0; i<1000; i++) p[i]++;
}
とするより
int main (){
int* p = new int[1000];
for(int i=0; i<1000; i++) p[i]++;
}
としたほうが処理速度が速くなる理由はなぜでしょうか?
VCでリリースビルドした結果
mov ecx,dword ptr ds:[418C34h]
inc dword ptr [eax+ecx]
と
inc dword ptr [eax]
のようになっていましたが全然わかりません
>>858 at(n)はn番目の要素のある位置、つまりそこへの参照を返す。
>>860 pが後者ではレジスタ変数になっているように見える。
// C++のファイル入出力ストリームについてなんですが
typedf struct ABC{ char a; int b; double c; };
ABC abc;
ifstream fin;
fin.open(filename, ios::binary);
// ここでabcにfinでopenしたファイルからABC型のバイナリデータを読み込みたい
fin.close();
// どうすりゃいいんでしょうか…
// Cだとfread(&abc, sizeof(ABC), 1, fp);ですよね…
// 環境はVC++.NETです
read
やはりreadですか…ありがとうございます。
ついでで申し訳ないんですが、そいつに渡す引数はどうすればいいでしょうか、、
865 :
838:04/11/19 20:49:34
難しくてもいいからとりあえずメールを送ったりする
サンプルソースありませんか...
msdn
オープンソースのメールソフトなんかいっぱいあるだろうに
>>861 レジスタ変数をよく理解していませんが確かにレジスタ1個でアドレッシングしているようです
一方グローバル変数のほうはp+オフセットという形で行っているようです
たまたまVCがそう最適化しただけで、C++一般の常識的な問題ではないのなら気にしないでおきます
>>862の
// ここでabcにfinでopenしたファイルからABC型のバイナリデータを読み込みたい
には結局何を打ち込めばいいんでしょうか・・・
msdn開いても理解できませんでしたorz
>>865 sylpheed
kmail
辺りのソースをあたるとか
>>869 グローバル変数にすると、マルチスレッドの場合を考慮して
pを参照しようとするたびにメモリからpの値をReadするようになってる。
別のスレッドが、いつpの値を書き換えてしまうか分からないから。
関数のローカル変数ならそういう心配はないので
レジスタに割り当てることができ、処理速度が速くなる。
873 :
デフォルトの名無しさん:04/11/19 23:30:22
質問よろしいでしょうか。
キーを押し "続けて" いるにも関わらず、OnKeyDown() が何度も呼び出されます。
エディタ上などでの、文字入力中の処理を考えると自然な気もしますが、
これをやめ、キーを押し続けても、最初の1度のみ OnKeyDown() を呼び出させる方法はないでしょうか?
OnKeyUp()
875 :
デフォルトの名無しさん:04/11/19 23:53:05
OnKeyUp() で実現できるでしょうか?
キーを押し続けている間、WM_KEYUP は起きないと思うのですが……。
どんな押し方をしてもボタン押下1回につき1度呼ばれる。
駄目ですか?
>>875 初回のOnKeyDownでフラグを立て
フラグが立ってる間、OnKeyDownは無視
OnKeyUpでフラグをおろせばいいんじゃない?
押し続けると、OnKeyDown() が何度も呼ばれてしまいます。
>>877 ああ、全くその通りです(゚Д゚;)
ありがとうございます。
むしろそういう場合、非同期のキー状態取得APIを使うべきじゃないだろうか…
サブ関数内で変数を宣言し、サブ関数から抜け出した後には宣言した変数はメモリから消えてますか?それともちゃんとfree()で開放しなければいけない?
いまいち質問の意味が分からないけど…
void foo( ) {
char *p;
p = (char*)malloc(100);
}
関数 foo を抜けたとき、
p は消えるけど p が指していたメモリは消えない。
free しなきゃだめ。
883 :
デフォルトの名無しさん:04/11/20 00:44:25
VC++でもJavaやその他の言語と同様
APIなどいくつか用意されていると思いますが
どういう関数があるのとかどこで調べればいいのでしょうか?
>>872 なるほど。よくわかりましたありがとうございます!
>>882 レスありがとうございます。宣言した変数は消えるんですね。こういうメモリの動きを見るソフト・機能とかあるんでしょうか?
質問すいません。(;´Д`)
列挙型で、
enum Hoge{
Hoge1 = 0,
Hoge2,
Hoge3,
};
・・・の時、{Hoge1,Hoge2,Hoge3}を{0,1,2}という整数に変換する事はできるんですが、
その逆に{0,1,2}から{"Hoge1","Hoge2","Hoge3"}というふうに列挙子を
文字列として取得する方法はないのでしょうか?よろしくお願いします。
出来ない。
自分で関数作るなりすれ。
>>886 ローカル変数はスタック上に作られて関数を抜けた時点でなくなる
892 :
デフォルトの名無しさん:04/11/20 01:47:50
質問です。
#include <iostream>
#include <string>
int main(void){
std::string str("abcde");
const char* p=str.c_str();
int len=0;
while(p!='\0'){
p++;
len++;
}
std::cout<<len<<std::endl;
return 0;
}
このコードで、whileループが終わらないのですがどうしてなんですか?
str.c_str()は¥0で終わる文字列を返すので、ループが終わらないのは
おかしいと思ったんですが。。
コンパイラはBorland C++ compilerを使いました。
s/while(p!='\0'){/while(*p!='\0'){
895 :
892:04/11/20 01:59:54
うう、893さんありがとう
恥ずかしい限りですorz
どうでもいいがsageろと
while(p!='\0'){
p++;
len++;
}
…どうでもいいことだが格好が…
while (*p++) ++len;
898 :
デフォルトの名無しさん:04/11/20 02:11:24
C言語を始めて1ヶ月目です。よろしくお願いします。
質問です。
8bitの2進数を左右反転させたいのですが手法が分かりません。
11111101→10111111
シフトレジスタ>>,<<
論理積&
論理和|
排他的論理和^
等を使えばいいのでしょうか?
テスト中に代入文を埋め込むと読みにくいからやめれといわれますが,
皆さんはどうしてますか?
多用していますか?
なるべく排除しようとしていますか?
遠慮なしに使います
>テスト中に代入文を埋め込むと読みにくいからやめれといわれますが,
意味不明
わけわからん
>>901 hoge = function();
while (hoge != 0)
を
while ((hoge = function()) != 0)
と書くこと
>>901 補足
hoge = function();
while (hoge != 0) {
doSomething();
hoge = function();
}
を
while ((hoge = function()) != 0)
doSomething();
と書くこと
if (Base* b = dynamic_cast<Base*>(d))
とか?簡潔で分かりやすいじゃん
>903 はアフォ
>904
どー考えても 下の方が理解しやすいと思うんだが違うのか、お気の毒.
あえて上の書き方してるとしたら氏ね
while (hoge = function())
doSomething();
特に、C++ に多いと思うんだが、
if (xxx)
{
}
else
{
}
while (1)
{
}
この形のインデントが増えてないか?
俺はK&Rスタイルを貫いているが。
if (1) {
} else {
}
while (1) {
}
どっちでもいいといえば、どっちでもいいが、ちょっと疑問に思ったので。
>この形のインデントが増えてないか?
別に
俺はずっと前者。ブロックであること、オブジェクトのlifetimeが
明示しやすいから。
正直読めれば他人の書くコードはどうでもいいが。
#include <stdio.h>
void hoge(int *a);
int main()
{
int a;
hoge(&a);
printf("%d\n" , a);
}
void hoge(int *b)
{
b++;
if (b>5)
{
return;
}
hoge(b);
}
上のプログラムだと
error C2040: '>' : 'int *' は 'int' と間接操作のレベルが異なります。
error C2446: '>' : 'int' 型から 'int *' 型への変換ができません。
というエラーがでます
aの値が6になったか確認したいのですけどどうしたらいいのでしょうか?
b++ → *b++
if (b>5) → if(*b > 5)
そもそも未初期化の変数を使うなと
int a = 0; とでもしとき
(*b)++ だったorz
void hoge(int *b)
{
(*b)++;
if (*b > 5) return;
hoge(b);
}
orz
>>913 ご返答ありがとうございます
エラーはでなくなったのですけど
aの値が6になってないのですが
hoge内のbの変化がaにも適応されるようにしたいんですけど
どうしたらいいのでしょうか?
#include <stdio.h>
void hoge(POINT *b );
int main()
{
POINT a;
a.x=0;
a.y=0
hoge(&a);
printf("%d\n" , a.x);
}
void hoge(POINT *b)
{
(*b->x)++;
if (*b->x>5) return;
hoge(b);
}
でerror C2065: 'b' : 定義されていない識別子です。
と: error C2065: 'POINT' : 定義されていない識別子です。
とerror C2182: 'hoge' : 'void' 型が不適切に使用されています。
というエラーがでました
なぜでしょうか?
VC++.netです
>>919 (゚Д゚)…
一度入門書を読んで来た方がいいんじゃないか?
まずPOINTという構造体を作る必要があるのと、
(*b).x は b->x と同義であることを理解してるか?
>>922 >>919でa.まで書くと自動的にxとyの候補が表示されるので
すでにどこかでPOINTが定義されてるのかなと思ってました
>(*b).x は b->x と同義であることを理解してるか?
知りませんでした
>>923 どこかで定義されているのは正しい(windef.hだったかな?)が、
その定義をincludeしていないでしょう。
VC++は直接includeしていなくてもインテリセンスが働く悪い癖がある。
>>924 #include <stdio.h>以外インクルードしてません
>VC++は直接includeしていなくてもインテリセンスが働く悪い癖がある。
初心者にとっては便利な機能みたいですねw
>>925 初心者にとってはよくない機能だと思われ
>>898 src = 0xfd;
dst = (src & 0x80) >> 7 +
(src & 0x40) >> 5 +
(src & 0x20) >> 3 +
(src & 0x10) >> 1 +
(src & 0x08) << 1 +
(src & 0x04) << 3 +
(src & 0x02) << 5 +
(src & 0x01) << 7;
これでどうだw
inline unsigned char invert(unsigned char x)
{
x = (0xF0 & x << 4) | (0x0F & x >> 4);
x = (0xCC & x << 2) | (0x33 & x >> 2);
x = (0xAA & x << 1) | (0x55 & x >> 1);
return x;
}
だっけ。まぁ、8bit程度だとあんま意味ないが。
配列変数a[i]のiを得るにはどうすればいいですか?
たとえばa[0]〜a[9]のうちの最大のものがa[3]とするとmax=3としたいとか。
他スレに誤爆してしまった…けど一応書き
>>898 unsigned char a = 0xF2; //反転させたいビット列 (入力)
unsigned char HANTEN(unsigned char a){
unsigned char b = 0x01;
unsigned char work =0, out =0;
for(int i=0; i<=7; i++){
work = a & b;
work << (7 - i);
out = out | work;
b << 1;
}
return out;
}
下位から1bitずつ取り出してその分シフト、orで足し算、と。
取り出したビットがゼロだったら飛ばしてもいいかも。
>>987-928と比べたらメリットは、他の変数型への移植性くらいしかないけど
すまん、なんか間違えてる
b << 1;を削除して
a >> 1;で
ループなんぞするなら、
template<typename T>
inline T tinvert(T t){
T x = T();
for (T m = 1; m; m <<= 1)
x = (x << 1) + (t & m ? 1 : 0);
return x;
}
のほうがよくないか。
max=(maxの型)(&(a[3])-&(a[0]))
VC++ 6.0 で質問です。
Debug モードではコンパイルが通ったのですが、Release モードにすると、
〜\hogehoge.h(12) : fatal error C1083: インクルード ファイルがオープンできません。'aaaa.h': No such file or directory
とエラーがでました。
aaaa.h は外部から追加したヘッダファイルのため、パスが通ってないと考えたのですが、
Debug と Release でなぜ違いがでるのかが分かりませんでした。
よろしくお願いします。
>>936 プロジェクトの設定は、Debug と Release モードで別々なんだよ。
Release モードの C/C++ コンパイラ オプションでも
/I オプションを追加するといい。
ヌヌネネヌヌネノ
(中略)
(゚∀゚) ruby!!
Rubyのためなら死ねる
>>938,939
君らの行為がRubyの評価を下げている
Rubyのためにも逝ってくれ
罵倒されそうな事を質問、多分合ってはいると思うんだが自信無いので(;´Д`)
|と+の違いって、キャリーがあるかないかだよな?
1+1は2で、1|1は1?
それを利用したら、配列に入った全ての値が同じか否か検出出来る?
補足
配列の[0]に入ってた値を保存して、各値とのorをとって同一かどうかで検出出来る?
よくわからんが、2値のXOR取って0であれば同一、not 0なら違う値
>>942 できるわけない。よく考えてみよう。
単純に == で比較するのじゃ不満なのかい?
>943、944
thx、よく考えたら無理ですた。
ループで同等比較するしかないのか、めんどいナァ………。
半分どうしでstrcmpなんか使って同等比較して、
その半分の更に半分同士をstrcmpで同等比較
…の2段階じゃダメかなぁ。
どこかに違う値入ってたら引っかかると思うんだけど
思いつきなんで間違ってたら「こいつアホだ」とでも何とでも…
と、レスしたそばから…
12121212みたいに入ってると通ってしまうことに気づいた
やっぱ俺はアホだ!
おめでとう
strcmpだって内部ではループ使ってるんだから、
普通にループで書いた方が賢明な気がする。
ループを書くのはカッコワルイ、とかいう理由なら別だけど
#include <algorythm>
♪ Å
♪ / \ ランタ タン
ヽ(´Д`;)ノ ランタ タン
( へ) ランタ ランタ
く タン
♪ Å
♪ / \ ランタ ランタ
ヽ(;´Д`)ノ ランタ タン
(へ ) ランタ タンタ
> タン
と思ったけど、rhythm でもないじゃないか…
#include <algorithm>
○| ̄|_
最初は良く間違えるからキニスンナ
釣りかとしか思ってなかった
正直C++なんてなにもわかんないのに始めるんですが、stdioとiostreamどっちやろうか悩んでるので
こっちはコレ系に強い、とかありませんか?それともたいていどっちもやるとか、片方やればどっちもわかったりするんですか?
>>955 stdio.hもしくはcstdioで定義されているものはレガシー関数といわれています。
あまり使うべきではありません。
C/C++が初めてなら素直にCでprintfつかっとけ
C++ のストリームって、あんまり使い勝手いいと思わないよな。
stdio -> 拡張性無し、型非安全、熟知、早い
iostream -> 拡張性有り、型安全、stdio より遅いことがほとんど
>>960 printf()はとても重いし遅いけれど。
cout よりマシなのでは?
入力チェックができるのでscanf使うくらいならcinのほうがいいとは思うが
それ以外はどっちも同じようなものなのがなぁ・・・
iostreamで書式を指定するのは激しくめんどくさい
>>962 確かにそうだね。
昔の話だけれど、実際使うときはprintfを自作していたよ。
コンソールはほとんど使わないし
sprintfとかCString::Formatとか書式の方をよく使うから
へぇ
せめてsnprintf使えよ
なんかこの話の流れ Déjà vu?
誰もが好きなお話ってことよ
これからCかC++を学ぼうと思うんですがどちらがお勧めですか?
また、開発環境はどれが扱いやすいですか?
C++
禿も推奨
>>971 いきなり開発環境はいらんからフリーのコンパイラつかって
とりあえずCでもC++でもいいから入門書を一冊仕上げろ。
入門書は安いのは役に立たんから値は張っても定評のあるのにしろ。
C++ならダイテルかPrimerか。Cは俺は知らん。
とりあえず使うOSぐらい書かんと処理系についてはアドバイスのしようがないが。
Rubyにします。
OSはXPPROを使ってます
>>973 ありがとうございます。
アマゾンで調べたところ、いろいろ種類がありました。
基本的に、ダイテルの本を買っていって順に学んでいくのかPrimerの本を買っていって順に学んでいくかは好みで選んでも問題ないでしょうか?
977 :
デフォルトの名無しさん:04/11/22 00:25:41
あるtemplateクラスがあって、それを継承してtemplateで
ないクラスを作成することができるのでしょうか?
>>977 class A : public TemplateClass<ほげ>
{};
Ruby!
猫でもわかるのSDK編のサンプルは.NET2003だとそのままでは
動かないんすか?
著者に聞けよ
最近そういうページだけで覚えようとするヤツが多いみたいだけど
最低限の本ぐらい買って読めよ、と思う
983 :
デフォルトの名無しさん:04/11/22 09:11:26
984 :
デフォルトの名無しさん:04/11/22 13:40:40
fgetsでファイルから読み込んだ時にデータが長すぎて読みきれずに
バッファに残ってしまったデータのクリアのやり方がわかりません。
おしえてください。
やっぱネットで勉強するより本買ったほうがいいんすか?
>>984 ファイルから読み込んでるならクローズすればいい。
標準入力から読み込んでるなら読み捨てるロジックを書けばいい。
>>985 画面見ながら勉強するのは21インチモニターなどで画面分割しながら
やらないと苦しい。それかページを印刷してしまうかだね。
俺は本を買った方が絶対に良いと思う。
988 :
デフォルトの名無しさん:04/11/22 14:07:55
>fgetsでファイルから読み込んだ時にデータが長すぎて読みきれずに
>バッファに残ってしまったデータのクリアのやり方がわかりません。
読みきれなかったデータはバッファではなくファイル側にある。
>>986さん
即レスありがとうございます。
標準入力の場合はgetcharで空読みをしてできたのですが
ファイル入力の場合でも同じような事は出来ませんか?
次の行も読み込まなくてはいけないので。
>>990 fgetc()で読み捨てるか、fgets()で読み捨てる。
1〜10まで質問してもうしわけないのですが
fgetsで読み捨てるとしたら具体的にはどうしたらいいんでしょうか。
>>992 /* fgetc()を使った読み捨て関数。 */
void readAndThrow(FILE * fp)
{
int rtn;
do {
rtn = fgetc(fp);
} while (rtn != '\n' && rtn != EOF);
}
#if 0 /* 使用例 */
while (fgets(buf, sizeof(buf), fp)) {
if (strchr(buf, strchr('\n') == NULL) {
readAndThrow(fp);
}
/* ... */
}
#endif
>>993さん
ありがとうございます。できました。
...
readAndThrough ではないかと
読み捨てだから、読んで投げ捨てたんだろ。