【初心者歓迎】C/C++室 Ver.49【環境依存OK】
at TECH
[前50を表示]
100:デフォルトの名無しさん
08/02/21 21:50:15
>>98
パソコンから取り外せば全容量使えるよ。
101:デフォルトの名無しさん
08/02/21 21:50:59
WindowsXPです
102:デフォルトの名無しさん
08/02/21 21:53:40
じゃあタスクマネージャだな
103:デフォルトの名無しさん
08/02/21 21:54:02
>>101
毒餃子を食わす国の人ですか?
104:デフォルトの名無しさん
08/02/21 21:54:36
>>101
GlobalMemoryStatus で調べろ
105:デフォルトの名無しさん
08/02/21 21:57:57
サンクス
106:デフォルトの名無しさん
08/02/21 22:27:36
newやvectorで確保が失敗したかチェックするにはどうすればいいですか?
107:デフォルトの名無しさん
08/02/21 22:31:16
あとメモリが少なくて、確保に時間がかかる場合、途中で止めるか、かかる時間を予測できますか?
108:デフォルトの名無しさん
08/02/21 22:32:24
VC9なのですが、SHA-256の定番なライブラリってないでしょうか?
JpegのIJGライブラリみたいなものがあると嬉しいのですが
109:デフォルトの名無しさん
08/02/21 22:32:32
>>106
長い思考の旅の後には、失敗しないからチェックは不要という結論になるよ。
110:デフォルトの名無しさん
08/02/21 22:43:28
>>106
bad_alloc 例外をつかまえる。
111:デフォルトの名無しさん
08/02/21 22:45:29
bad_alloc例外が必ず捕まえられる保障はないそうだよ。
by Sutter
112:デフォルトの名無しさん
08/02/21 22:48:48
set_new_handler
113:デフォルトの名無しさん
08/02/21 22:52:19
>>106
たくさんのレスが付くと思う。
そして、>>109にたどり着くと思う。
114:デフォルトの名無しさん
08/02/21 22:56:42
メモリ確保できなきゃ
大抵はそのまま異常終了するしかない事が多い。
ダウンするとマズいシステムの場合は
そうも言ってられないが。
115:デフォルトの名無しさん
08/02/21 23:19:36
ビルドのエラーについて質問です。
timeGetTime関数を呼ぶだけの関数を作成したのですが、
ビルドで以下のエラーになりました。
LNK2019: 未解決の外部シンボル __imp__timeGetTime@0 が関数 "int __cdecl MainRoutine(void)" (?MainRoutine@@YAHXZ) で参照されました。
ソースは以下になります。
#include <windows.h>
#include <mmsystem.h>
int MainRoutine()
{
DWORD dwTime;
dwTime = timeGetTime();
return 0;
}
VC2008 Express Editionを使用しています。
他に何か設定が必要なのでしょうか?
116:デフォルトの名無しさん
08/02/21 23:20:20
ライブラリのリンクが必要。
117:デフォルトの名無しさん
08/02/21 23:29:07
>115です。
すいません。記述漏れです。
以下の設定はすでにしていました。
「ツール」-「オプション」-「プロジェクトおよび〜」-
「VC++ディレクトリ」-「ライブラリリンク」にて、
C:\Program Files\Microsoft Platform SDK\Lib
ほかのライブラリのリンクが必要なのですか?
必要な場合、どこのライブラリをリンクすればいいでしょうか?
118:デフォルトの名無しさん
08/02/21 23:30:16
それはライブラリを検索するディレクトリを指定しているだけで
リンクするライブラリを選択するオプションではない。
何をリンクすればいいかはググれ。
119:デフォルトの名無しさん
08/02/21 23:38:58
>115です。
今は、ライブラリのリンクが出来てなかったと言うことなんで、
リンクの方法、リンクするライブラリについては、また調べてみます。
回答ありがとうございました。
120:デフォルトの名無しさん
08/02/21 23:46:57
ifやswitchってこんな風に書くのあり?
if(i==(1||2||3||4||5))
switch(i){
case (1||2||3||4||5):
break;
}
121:デフォルトの名無しさん
08/02/21 23:48:33
おかしくね
122:デフォルトの名無しさん
08/02/21 23:49:51
>>120
C++ で operator をオーバーライドすれば可能かもしれませんね
123:デフォルトの名無しさん
08/02/21 23:54:50
>>120
caseの中身は定数でよろしく
124:デフォルトの名無しさん
08/02/22 00:01:36
>>120
switch(i){
case 1: case 2: case 3: case 4: case 5:
break;
}
125:デフォルトの名無しさん
08/02/22 00:02:21
d caseの方は間違ってるのね
ifの方も駄目?
126:デフォルトの名無しさん
08/02/22 00:03:55
>>124
ああ、caseでbreak書かなかったらそのまま下までいくからそういう風に書いたらいいのか
127:デフォルトの名無しさん
08/02/22 00:06:12
C#では見事に禁止だな
128:デフォルトの名無しさん
08/02/22 00:07:40
>>125
文法的に間違いではないが、お前の期待する動作はしないと思う
(1||2||3||4||5)は常に真となり、それとiの値が等しいかどうか
だよ?これ
129:デフォルトの名無しさん
08/02/22 00:08:18
>>125
ifの方も意図しているであろう動作はしない。
ただしコンパイルは通る。警告くらい出してくれるかも知れんが・・・
130:デフォルトの名無しさん
08/02/22 00:11:14
ありがとうございます。自分でもためしてみたけど無理だった
コンパイル通ってたから上手く動いてると思ってそのままつかってたよ…
131:デフォルトの名無しさん
08/02/22 00:19:40
>>127
C#も124みたいにcaseラベルを並べるのはありだと聞いた。
132:デフォルトの名無しさん
08/02/22 00:22:16
並べさせるくらいなら、コンマ区切りで書かせてくれてもいいのにね。
133:デフォルトの名無しさん
08/02/22 00:27:11
クラスの定義と代入を同時にやるにはどうやればいいですか?
int a=10; のようにです
134:デフォルトの名無しさん
08/02/22 00:28:19
「代入」 は既に宣言されている変数に対して行う操作なので
同時に出来る訳が無い。
初期化なら別だが。
135:デフォルトの名無しさん
08/02/22 00:30:45
operator を使おう
136:デフォルトの名無しさん
08/02/22 00:30:52
事故解決しました
137:デフォルトの名無しさん
08/02/22 00:32:34
これでできました
int main() {
class Test{
int x;
public:
Test (int y) {x=y;}
print(){ cout<<x<<endl; } };
Test a=10;
a.print();
return 0;
}
138:デフォルトの名無しさん
08/02/22 00:35:31
Test a=10;
a.print();
a=20;
a.print();
もできるんですね C++はすごいですね
139:デフォルトの名無しさん
08/02/22 00:37:27
往々にして望まない機能だけどな。
基本的に引数1つのコンストラクタには explicit つけとけ。
140:デフォルトの名無しさん
08/02/22 00:42:12
それよりも、構造体って感じの型でないクラスなのに
コピーコンストラクタとoperator =をコンパイラ任せにしているのが嫌だね。
141:デフォルトの名無しさん
08/02/22 00:43:15
コンパイラ任せに出来る時は
コンパイラ任せでいいよ。
142:デフォルトの名無しさん
08/02/22 00:48:46
138じゃないですが、
>>139
なんでですか?
(本当に理由を知りたいです。)
143:デフォルトの名無しさん
08/02/22 00:59:34
#include <iostream>
#include <vector>
class Vector {
public:
Vector(size_t size) : m_array(size) { }
void output() const {
for(std::vector<int>::const_iterator it = m_array.begin();
it != m_array.end(); ++it)
{
std::cout << *it << ' ';
}
std::cout << std::endl;
}
private:
std::vector<int> m_array;
};
void Foo(const Vector& v) {
v.output();
}
int main() {
Foo(5); ←←←←←←←
}
これが直感的な挙動ではないことは分かってもらえると思う。
でも、コンパイル通るし、正常に動く。
explicit つけるとこういう時にコンパイルエラーにできる。
それでも Foo(Vector(5)); なら可だが、これは問題ないと感じてくれると思う。
144:デフォルトの名無しさん
08/02/22 00:59:53
>>91
どんなバグがでるのですか?
呼び出し側なにか影響でうるのですか?
145:デフォルトの名無しさん
08/02/22 01:01:23
input を変更した後に、
input が変更されていない事を前提とした処理を書いてしまうかもしれない。
あるいは、そういう処理があるにも関わらず、
それより前の地点で input を変更してしまうかもしれない。
そうなっていないか注意して探すよりは、
引数をいじらない方が良い。
146:デフォルトの名無しさん
08/02/22 01:08:46
みんな仮引数にconstって使わないんだよね。
147:デフォルトの名無しさん
08/02/22 01:09:55
一時期付けてみたけど、
あんま意味ないと思ってやめた。
148:デフォルトの名無しさん
08/02/22 01:12:29
>>145
なるほど
別にいじること自体がやばいわけじゃなくて
いじると間違い起こす原因となる可能性があるわけですね
ありがとうございました
149:デフォルトの名無しさん
08/02/22 01:14:13
だって関数の定義では付けてもいいけど、宣言では付けたくないので、
コピペじゃ済まなくなる。
150:デフォルトの名無しさん
08/02/22 01:14:45
>>131
fall throughは禁止じゃなかったっけ
何かキーワードがあったと思う
情報が古いかもしれんが
151:デフォルトの名無しさん
08/02/22 01:19:06
>>150
caseが連続する場合のみOK。その他は禁止。スレ違い。
152:デフォルトの名無しさん
08/02/22 01:19:25
>>143
ありがとうございます。
explicitは、暗黙の変換を抑制する機能なのですね。
しかしなんか上の例のコードは、すごくC++書き慣れた人な感じがしました。
153:デフォルトの名無しさん
08/02/22 01:20:21
>>150
>>124のように空のcaseラベルを並べたときはフォールスルーできる。
URLリンク(msdn2.microsoft.com)
スレ違いすまん。
154:133
08/02/22 02:00:16
関数の引数にクラスを使いたいのですが、クラスの宣言と代入を同時にするにはどうやればいいですか
intのようにコンストラクタではできませんでした
test y = f( x );
のようにです fはクラスを返します intではないです
155:デフォルトの名無しさん
08/02/22 02:11:42
>>154
testというのがクラスなら、testにconst test&型の引数を1つ取るコピーコンストラクタを作るんだ。
156:デフォルトの名無しさん
08/02/22 02:14:25
サンクス
157:デフォルトの名無しさん
08/02/22 07:02:49
>>154
何度も言うが、それは代入じゃない。
初期化だ。
初期化の場合、= を使っていても
test y = f(x); は test y(f(x)); と同義。
158:デフォルトの名無しさん
08/02/22 07:24:55
まったくのプログラム初心者です。
はじめににインストールする言語?をどれにするかがわかりません。
どういう意味かというと
ボーランド、とかマイクロソフトのvisual studioとかどれにすればいいのかです。
有料とか無料とかいろいろありますね。
できたら将来有料ソフトを販売可能なものがいいです。
今考えているのはマイクロソフトのVC++を考えているのですが、
C++とVC++は違うとか
どっかで聞いたりもしたので
初心者にはちんぷんかんぷんでわかりません。
よろしくお願いします
159:デフォルトの名無しさん
08/02/22 07:30:50
C++ は言語名。
VC++ は C++ を使って開発を行うためのツールの名前。
160:デフォルトの名無しさん
08/02/22 08:05:40
>>159
ありがとうございます。
161:デフォルトの名無しさん
08/02/22 11:08:37
VC++ はMSがWindows用ソフトを開発するために拡張した言語ともいえる
VC++のコードはほかのものでは動かせないものが多い
162:デフォルトの名無しさん
08/02/22 11:42:07
URLリンク(www.xlsoft.com)
このソフトを使えばJavaでもネイティブアプリケーションが作れると書いてあるのですが、そんなうまい話があるんですか?
もし本当ならJavaのパフォーマンス面での不利がだいぶ改善されると思うのですが
163:デフォルトの名無しさん
08/02/22 11:45:45
ここはC/C++スレですが
164:デフォルトの名無しさん
08/02/22 11:57:29
システム構築売るならまだしもソフト売るのにJavaはないだろ。
VCにしとけ。
165:デフォルトの名無しさん
08/02/22 11:59:00
perl2exeみたいなやつでは? 実行環境を圧縮してexeに詰め込む
利点としてはランタイムとかの導入がいらないだけで
166:デフォルトの名無しさん
08/02/22 12:21:11
スレ違い。ここでやれ
gcjって使ってる人います?
スレリンク(tech板)l50
167:デフォルトの名無しさん
08/02/22 12:31:13
この直し方教えてください!
IEBrowser->Document.charset="shift_jis";
error C2039: 'charset' : '_com_ptr_t<class _com_IIID<struct IDispatch,&struct __s_GUID _GUID_****> >' のメンバではありません。
168:167
08/02/22 12:35:30
文字コードの変換をしたいのですが・・・
この様に定義してあります
SHDocVw::IWebBrowser2Ptr IEBrowser;
IEBrowser.CreateInstance( __uuidof( SHDocVw::InternetExplorer ) );
169:デフォルトの名無しさん
08/02/22 12:51:05
>>167
こうでは?
IEBrowser->Document->charset= L"shift_jis";
170:167
08/02/22 12:55:40
>>169
error C2039: 'charset' : 'IDispatch' のメンバではありません。
になりました・・・
171:167
08/02/22 13:05:44
文字コードの変更方法わかったら教えてもらいたいですけど
そこだけVBAスクリプトを呼び出す事にします
172:デフォルトの名無しさん
08/02/22 13:08:27
>>170
じゃあこれはどう?
SHDocVw::IHTMLDocument2Ptr document = IEBrowser->Document;
docment->charset = L"shift_jis";
173:167
08/02/22 13:13:13
だめでした
174:デフォルトの名無しさん
08/02/22 13:23:38
QueryInterface
175:デフォルトの名無しさん
08/02/22 13:33:26
適当に書いたらやっぱダメだったか、すまん。
#import <mshtml.tlb>した上で、MSHTML::IHTMLDocument2Ptrだ。
176:デフォルトの名無しさん
08/02/22 13:34:40
>>174
ナントカPtr(の実態_com_ptr_t<>)のコンストラクタや代入演算子の中でQueryIntefaceが行われている。
177:デフォルトの名無しさん
08/02/22 14:08:38
πの値は、自分で3.1415926535...とかって書くしかないでしょうか。
numeric_limits<int>::max()とか、そういう書き方はないですか?
178:デフォルトの名無しさん
08/02/22 14:13:43
#ifndef M_PI
# define M_PI 3.1415926535
#endif
179:デフォルトの名無しさん
08/02/22 14:30:07
math.hをインクルードしたらM_PIとしてdefineされてる。
計算して出したいなら4*atan(1.0);
180:デフォルトの名無しさん
08/02/22 14:32:27
標準ではないのが玉に瑕。
181:デフォルトの名無しさん
08/02/22 15:02:49
>>178-180
ありがとうございます。
#include <cmath>
としてたのですが、M_PIでコンパイル通りました。
182:デフォルトの名無しさん
08/02/22 15:58:04
C初心者です。
実数→整数変換ですが、
double dval;
char buf[80];
int ival;
dval = -19.99; /* -19.99〜19.99 */
dval = dval * 100.0;
sprintf(buf,"%.0f",dval);
ival = atoi(buf);
printf( "%f %d %d\n",dval,ival,(int)dval);
/* printf( "%f %d %d\n",dval,ival,(int)ceil(dval)); */
ivalを求める場合、上記の方法が一番精度が良いのですが
これ以外に方法はありますでしょうか?
ceil() や floor() 使っても誤差が出てしまいます。
183:デフォルトの名無しさん
08/02/22 16:05:51
>sprintf(buf,"%.0f",dval);
それ四捨五入してるだけだぞ
そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい
元々 -19.99 という値自体が誤差を持ってるから、これを無くすことは出来ない
printf("%.20f\n", -19.99); とかやってみればわかる
本当に誤差が嫌なら、浮動小数点を使わない、という方法しかない
184:182
08/02/22 16:12:26
>>183
早速のRESありがとう御座います。
>そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい
了解です。これで行きたいと思います。
どうもありがとう御座いました。
185:デフォルトの名無しさん
08/02/22 16:53:31
char []型の要素を破棄して動的確保できませんか? 消せなくてもいいので別のアドレスに確保できませんか?
f(char *ch){
delete ch;
ch=new char[10];
strcpy(ch,"ssssssss");
}
main(){
char *ce=new char[2];
f(ce); cout<<ce<<endl;
char ch[]="test";
f(ch); cout<<ch<<endl;
}
186:デフォルトの名無しさん
08/02/22 16:55:19
もしくは、char *型とchar []型を判別して、書き換えられないなら始めにエラーにするのでもいいです
187:デフォルトの名無しさん
08/02/22 16:59:46
>>185
ごめんfで何がしたいのか分からない。
まぁ俺の第六感で回答すると、ポインタのポインタ使えばいいんじゃね
188:デフォルトの名無しさん
08/02/22 17:05:10
char a[10];
をコード内で書き換えてたとえば100個まで使えるようにしたいんです
はじめのaは破棄できなくてもいいので、a[50]とかにアクセスできるようになりませんか
189:デフォルトの名無しさん
08/02/22 17:07:46
Stringクラスの使い方でも覚えるとか
190:デフォルトの名無しさん
08/02/22 17:08:43
>>188
設計が間違ってるよ
>>185 みたいにすると激しく管理が難しい事になる
191:デフォルトの名無しさん
08/02/22 17:12:10
ポインタで文字列のアドレスが渡されたら、それが[]なのか*なのか渡された側にはわかりません
どうしたらいいですか
192:デフォルトの名無しさん
08/02/22 17:14:17
配列サイズも渡す
193:デフォルトの名無しさん
08/02/22 17:17:53
閃いたw
初めから1000個くらい確保しとけばいいじゃん
194:デフォルトの名無しさん
08/02/22 17:21:28
無理か
main(){
char ch[]="test";
char *ce=new char[20];
strcpy(ce,"ssss");
ch=ce; //ここでエラー
cout<<ch<<endl;
}
195:デフォルトの名無しさん
08/02/22 17:22:10
あほすぎ
196:デフォルトの名無しさん
08/02/22 17:29:05
>>191
呼び出し側で呼び出す関数を変える
>>194
なにがしたいの?
197:デフォルトの名無しさん
08/02/22 18:10:41
>>194
こうすれば?
main(){
char chx[]="test";
char *ch = chx;
char *ce=new char[20];
strcpy(ce,"ssss");
ch=ce; //エラーなし
cout<<ch<<endl;
}
198:デフォルトの名無しさん
08/02/22 18:36:59
>>185
恐らく、引数でもらった文字列を元に新な文字列を返そうと考えてるんだろうけど、
そうしたいのなら、
char* func(const char* str)
{
char* s = new char[ほにゃらら];
ほげほげ
return s;
}
とした方が良い。
そもそも
char ch[] = "test";
の ch は配列の先頭のアドレスを返す「定数」なんだから、newで確保した領域を割り当てられるわけないよ。
199:デフォルトの名無しさん
08/02/22 19:05:33
レスありがとうございます
同じような質問なんですが、*chが確保されていてもいなくても、deleteするにはどうすればいいですか?
確保していないと実行時にエラーになります
200:デフォルトの名無しさん
08/02/22 19:08:14
言ってる事がよく分からんが、こういうこと?
if( ch )delete ch;
201:デフォルトの名無しさん
08/02/22 19:15:06
まともに動くのはaだけなんです どれでも動くようになりますか?
f(char *ch){ delete ch; ch=new char[10]; strcpy(ch,"ssssssss"); }
main(){
char *a=new char[1]; f(a); cout<<a<<endl;
char *b=NULL; f(b); cout<<b<<endl;
// char *c; f(c); cout<<c<<endl;
}
202:デフォルトの名無しさん
08/02/22 19:16:31
>>200 ifを組み込んでも動作しませんでした
203:デフォルトの名無しさん
08/02/22 19:16:40
void f(char*& ch)
204:デフォルトの名無しさん
08/02/22 19:17:29
つーか、大人しく std::string 使え
205:デフォルトの名無しさん
08/02/22 19:18:15
>>201
fの中でchに代入してもmainの方はaもbもcも変わらないよ?
f(int x){
x = 2;
}
main() {
int a = 1;
f(a);
cout << a << endl; // 2ではなく1と表示される
}
↑これ解ってる?
206:デフォルトの名無しさん
08/02/22 19:19:04
>>203 それを組み込んだらbも動作しました! でもcが実行時にエラー出ます >>200も同時にやってもだめです
207:デフォルトの名無しさん
08/02/22 19:20:20
>>205 char* や配列は参照渡しだとききました
208:デフォルトの名無しさん
08/02/22 19:20:23
初期化してねえのに delete できるわけねえだろ
209:デフォルトの名無しさん
08/02/22 19:20:49
>>207
ポインタは値渡し。
210:デフォルトの名無しさん
08/02/22 19:21:59
>>209 わかりました >>208 初期化していないことを調べる方法ないですか
211:デフォルトの名無しさん
08/02/22 19:23:11
aは配列と見なされて参照渡しになってるんですね
212:デフォルトの名無しさん
08/02/22 19:25:03
用語の部分で思考停止してるな。
何が起こってるのか考えた事無いだろう。
213:デフォルトの名無しさん
08/02/22 19:25:43
>>210
初期化されてるポインタと、
初期化してないけど偶然たまたま同じ値が入ってるポインタを、
見分ける方法が物理的にあると思うか?
214:デフォルトの名無しさん
08/02/22 19:26:39
deleteした瞬間に落ちます tryも無理です
f(char*& ch){
try{ delete ch; }
catch(...){cerr << "例外を受け取りました。" << endl;}
ch=new char[10]; strcpy(ch,"ssssssss"); }
main(){
char *a=new char[1]; f(a); cout<<a<<endl;
char *b=NULL; f(b); cout<<b<<endl;
char *c; f(c); cout<<c<<endl;
}
215:デフォルトの名無しさん
08/02/22 19:31:57
>>214
いい方法を教えてあげよう
関数 f の前にこれを書くんだ
/* この関数に初期化してないポインタを渡してはいけません */
216:デフォルトの名無しさん
08/02/22 19:43:25
基礎からやり直せよ
217:デフォルトの名無しさん
08/02/22 19:45:15
>>214
だーかーらーnewで確保したメモリを指してるポインタと、未初期化のポインタを見分け
る方法なんて存在しないんだってば。
ポインタ使うときは初期化しろって何で言われてるのか考えたことあるか?
218:デフォルトの名無しさん
08/02/22 19:49:31
#define HOGE int
void f(HOGE x) { cout << '(' << x << ')' << endl; x = 42; }
int main() {
HOGE a = 10; f(a); cout << '(' << a << ')' << endl;
HOGE b = 0; f(b); cout << '(' << b << ')' << endl;
HOGE c; f(c); cout << '(' << c << ')' << endl;
}
これの挙動は分かるか?
#define HOGE char*
void f(HOGE x) { cout << '(' << x << ')' << endl; x = "f"; }
int main() {
HOGE a = "a"; f(a); cout << '(' << a << ')' << endl;
HOGE b = NULL; f(b); cout << '(' << b << ')' << endl;
HOGE c; f(c); cout << '(' << c << ')' << endl;
}
んで、これの挙動は分かるか?
219:デフォルトの名無しさん
08/02/22 20:17:15
質問ですが、stringの参照で値を受け取るとき
memcpy(str, ch,10000);
のようにできますか?
220:デフォルトの名無しさん
08/02/22 20:37:35
お願いだから str.assign(10000, ch); としてください。
頼みますから。
221:デフォルトの名無しさん
08/02/22 20:45:34
>>220
strがchar*の予感
222:デフォルトの名無しさん
08/02/22 21:09:01
凄く無駄なレス消費してんなw
223:デフォルトの名無しさん
08/02/22 21:15:15
昔ならともかく惜しむもんではないが無駄感は否めないなwww
224:デフォルトの名無しさん
08/02/22 21:43:42
プログラムを1から始めようと思うのですが、まずは本でも買って読むべきですか?
それともネットで調べるべきですか?
225:デフォルトの名無しさん
08/02/22 21:45:59
何をやりたいか目標を立てることから始めるべき。
226:デフォルトの名無しさん
08/02/22 22:16:13
文字列sに含まれる先頭のcの添字を表示させる関数を作れ
cが無い場合は、-1を表示
という問題で詰まってます
文字列の中のcを認識させるにはどうすればよいのでしょうか
227:デフォルトの名無しさん
08/02/22 22:22:42
strchr
228:デフォルトの名無しさん
08/02/22 22:24:16
マルチで申し訳ないですが
グローバルな共用体の変数に、関数からメンバーに代入したらセグメントエラーを吐いたのですが、これは許されないのでしょうか?
229:デフォルトの名無しさん
08/02/22 22:29:20
マルチしないでください^^;
230:デフォルトの名無しさん
08/02/22 22:46:54
火星人で申し訳ないのですが
グローバルな共用体の変数に、関数からメンバーに代入してもセグメントエラーを吐かないのですが、
嫁は許してくれるでしょうか?
231:デフォルトの名無しさん
08/02/22 22:48:12
こんがらがっちゃったんで、聞きたいんですが・・・
今こんなテンプレートクラスがあったとして
template<typename T>
class Array{
T *array;
size_t length;
public:
Array(size_t n = 0){...}
~Array(){...}
T& operator [](size_t n){...}
}
これを
typedef Array<myclass> MyArray; //myclassは適当なクラスということで
Array<MyArray> MyArray2(2);
と使う時、MyArray2は与えた引数で初期化できますが
MyArrayの方にコンストラクタの引数を与える場合はどうすればいいですか?
ちなみにこれは、配列クラスなんでできれば、MyArray2が持つそれぞれのArray<myclass>に
別々の初期化パラメータを与えたいんですが・・・。
232:デフォルトの名無しさん
08/02/22 22:49:58
>>255
何ができるかを伝えてあげるべき。
ようこそプログラムの世界へ。
233:デフォルトの名無しさん
08/02/22 22:50:25
>>225だったorz
234:デフォルトの名無しさん
08/02/22 22:51:22
>>227
それは関数そのものではないでしょうか
わざわざ教えたいただいたのですが、伝達不足でした、すみません
int strch_idx(const char* s, char c);
という関数の雛形が与えられて、この中身を作るのに、cを認識する必要があると判断したのですが、間違っているでしょうか
235:デフォルトの名無しさん
08/02/22 22:54:41
>>231
今のC++では無理だね。だからSTLコンテナではreserveしてpush_backしたり、
組込の配列からコピー初期化したりする。
236:デフォルトの名無しさん
08/02/22 22:56:20
>>234
cを認識の意味がわかりません
s内からcを検索したいってこと?
237:デフォルトの名無しさん
08/02/22 23:17:22
>>235もしやと思ったらやっぱりですか・・・
この場合大人しくループまわして作ることになるんでしょうね。
ありがとうございました。
238:デフォルトの名無しさん
08/02/22 23:34:21
>>236
例えば、sという文字列にcincoと入力すると、1を
sという文字列にiicicoと入力すると3を
sという文字列にnorioと入力すると-1をreturnで返却する
こういう関数を作ろうと思うと、sという文字列の中身について、
s[0]に格納されているのはcかどうか、s[1]に格納されてるのはcかどうか、s[2]に格納されているのは…
と、ひたすら繰り返して行く必要があると考えました
そのためには、s[n]について、cなのかどうか判定する必要があるのではないかと
この判定というのが、認識と同じ意味のつもりで使いました
239:デフォルトの名無しさん
08/02/22 23:40:52
strchrのソース読めよ。
検索すればいくらでも出るだろ
240:デフォルトの名無しさん
08/02/22 23:45:33
>>238
if (s[0] == 'c') return 1;
if (s[1] == 'c') return 2;
if (s[2] == 'c') return 3;
...and so on.
241:デフォルトの名無しさん
08/02/22 23:50:48
>>234
学校の宿題は自分でやれよ。屑
242:デフォルトの名無しさん
08/02/23 00:02:06
>>238
それ以外に方法はstrchrを使用するぐらいしか思いつかない
(strchrもおそらくは、中で同じようなことしてると思うけど)
なにが疑問なのかよくわからないので、とりえあず2通りソースを貼り付けときます
@
int i;
for(i=0; s[i] != '\0' && s[i] != c; i++);
return s[i] != '\0' ? i : -1;
A
char *p;
return (p=strchr(s, c)) != NULL ? (int)(p-s) : -1;
返ってくるのは配列の添え字ですのであしからず
243:デフォルトの名無しさん
08/02/23 00:06:01
>>239 >>240
どうも、理解できました
>>242
ご丁寧にどうもありがとうございました
244:デフォルトの名無しさん
08/02/23 03:34:24
全くコードの書き方が分からないので質問させて下さい。
C++ VS2005
略)
printf("Got: %02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);
※
buf[0]には01
buf[1]には06
buf[2]には17
buf[3]にはf3
buf[4]には34
が入る。
を文字列"0106171f34"に置き換えたい。
1.このbuf[]の中(16進数)を文字列に変換したい。
2.文字列に変換した後に、buf[0]〜buf[5]を繋げたい。
sprintとかを使えば良いみたいなのですが、どのようにやってよいか分からずに困っています。
どうかよろしくお願いします。
245:デフォルトの名無しさん
08/02/23 03:35:36
>>244
課題を丸投げしたいなら宿題スレにいけ
246:デフォルトの名無しさん
08/02/23 03:37:49
>>244
いや一応答えると
sprintじゃなくてsprintfだな
sprintfで連結もできます
247:244
08/02/23 03:51:48
>>245-246
ありがとう。もうちょい試して無理だったら、宿題ではないんだけど、宿題スレで質問してみたいと思います。
248:デフォルトの名無しさん
08/02/23 03:54:12
sprintf のヘルプ見るだけで解決だろ
249:244
08/02/23 08:58:16
>>248
なんとか解決しました。時間かかった>< やってみれば、なんと簡単なコードって感じですけど。
ヘルプのみかたってイマイチわからないんですけど、ヘルプの見方の解説サイトとかってありませんでしょうか?
250:デフォルトの名無しさん
08/02/23 09:49:02
>>249
manコマンドのことなら、man manでOK。
251:デフォルトの名無しさん
08/02/23 10:05:35
Cをずっとやってたのですが、
VC++6.0でデバッグしてると、関数に入るだけでESPが100バイトくらい進みます
C++だとモジュール毎にスタックをこんなに食うものなのでしょうか?
デバッグ情報か何かで食ってるのですか?
252:デフォルトの名無しさん
08/02/23 10:06:37
ローカル変数たくさん使ってるんじゃないの
253:デフォルトの名無しさん
08/02/23 10:06:52
>>251
ローカル変数が100バイトほどあるんじゃなくて?
254:251
08/02/23 11:07:16
いやひとつもないのだが・・・
家のPCでためしたけど、
関数にステップインするときはESPは4バイトしか進まないが、
そこから1step進めて、{から関数内の1行目に入るときに、
80バイトも食う
char a[100];と宣言を入れると、これが180バイトになるから、やり方は間違ってないはず
この80バイトが何なのかわからん
255:デフォルトの名無しさん
08/02/23 11:21:13
メンバ関数とかじゃなくて?
256:デフォルトの名無しさん
08/02/23 11:22:06
>>254
一時オブジェクトの置き場になってるとか?
関数の戻り値のオブジェクトを別の関数に直接渡してる場合とか・・・
アセンブラコード出させて見ても使われてなさげ?
257:要は、ソースも出さずにあれこれ言われてもしらねーよっと
08/02/23 11:24:15
まさかとは思うが、スタックオーバフローのチェックコードが入っているとか。
さもなければalloca()相当のコードが入っているとか。
あーそうそう、この場合のローカル変数は、Cのコード上現れるものに限らず
コンパイラが必要とした一時変数も含めてってことね。
例えば、構造体を値渡ししていたりreturnで戻していると作られるかもね。
258:251
08/02/23 11:32:53
void test()
{
char a[100];
printf ("test");
}
int main(int argc, char* argv[])
{
test();
return 0;
}
コードはこれだけなんだけど。C++じゃねーな。
混合モードで見ると、これが原因らしいが、何でこんなことしてるのかな。
アセンブラわからん。
sub esp,0A4h
259:デフォルトの名無しさん
08/02/23 12:57:17
>>249
VC++ なら sprintf とか入力して F1 推せば見れるだろ。
260:デフォルトの名無しさん
08/02/23 12:58:29
>>258
デバッグ用じゃなくてもそうなら、
例外用のコードなのかもしれないな。
261:デフォルトの名無しさん
08/02/23 13:01:09
>>258
手元の2005EEで試したが、リリースビルドの規定値では該当のコードは生成されない。
デバッグビルドだと生成されるが、「基本ランタイムチェック」を無効にしたら配列分だけになった。
つまり、>257の1行目だね。
262:デフォルトの名無しさん
08/02/23 13:23:22
C言語でポインタを値渡しするにはどうすればいいですか?
263:デフォルトの名無しさん
08/02/23 13:24:01
訂正
C言語でポインタを参照渡しするにはどうすればいいですか?
264:デフォルトの名無しさん
08/02/23 13:25:31
>>263
ポインタのポインタを使う
int **p;みたいなの
265:デフォルトの名無しさん
08/02/23 13:25:41
C言語には参照渡しの機能はありません。
ポインタを渡すことで参照渡し「っぽいこと」はできるので、
ポインタのポインタを渡せばポインタの参照渡し「っぽいこと」はできます。
266:デフォルトの名無しさん
08/02/23 13:26:02
参照渡しだって結局アドレス渡しの糖衣みたいなもんなんじゃねえの
267:デフォルトの名無しさん
08/02/23 13:32:22
文脈で「参照」の意味の違いを読み取れよ
268:デフォルトの名無しさん
08/02/23 13:32:28
サンクス
269:デフォルトの名無しさん
08/02/23 13:37:01
C++じゃなくてCならアドレス渡しと参照渡しは同義で通じるだろ
270:デフォルトの名無しさん
08/02/23 13:38:30
結局やってることは同じじゃねえの
271:243
08/02/23 13:45:44
やっぱりうまくいきませんでした
何が間違っているのか、理解できません
添削をお願いしたいです
c++、Borland C++5.5.1 for win32でやっています
int strch_idx(const char* s, char c)
{
int i = 0;
while(s[i])
{
if(s[i] == 'c') goto end;
else if(s[i] == 0)
{
i = -1;
goto end;
}
i++;
}
end:
return i;
}
272:デフォルトの名無しさん
08/02/23 13:50:02
最近はソフトウェア工学も学ばないのか
273:デフォルトの名無しさん
08/02/23 13:51:13
>>271
>if(s[i] == 'c') goto end;
'c' じゃなくて c では?
あと、else if (s[i] == 0) の判定をする前に while の条件で抜けてしまうかと
274:デフォルトの名無しさん
08/02/23 13:55:02
>>266>>269>>270
そういう不正確な事やってると
>>207 みたいな奴が出てくるんだよ。
275:デフォルトの名無しさん
08/02/23 14:11:18
>>274
俺はCでの話を言ってるんだぞ?
アドレス渡ししかないんだからないんだから、不正確もなにもねぇだろうが
276:デフォルトの名無しさん
08/02/23 14:12:17
Cには参照なんてないんだからそんな言葉つかうなよ。
277:デフォルトの名無しさん
08/02/23 14:13:07
え?マクロは参照じゃないの?
278:デフォルトの名無しさん
08/02/23 14:15:15
C言語は基本的にすべてコピーで渡す
ポインタもコピー
279:デフォルトの名無しさん
08/02/23 14:15:51
>>275
C には参照渡しなんてないんだよ。
280:デフォルトの名無しさん
08/02/23 14:18:09
参照渡しがアドレス渡しの糖衣ってのは正しい
どっちかだけ知らずに語ると馬鹿なことになるけど、どっちもしっかり理解してるなら別に問題ないでしょう
281:デフォルトの名無しさん
08/02/23 14:20:52
static_castと(int)みたいなキャストってなにかなにか違うんですか?
282:デフォルトの名無しさん
08/02/23 14:24:24
>>281
static_castの方が用途が限定される
283:デフォルトの名無しさん
08/02/23 14:24:35
>>280
個人がそう理解するのはかまわんけど、初心者への説明としては不親切じゃね?
284:デフォルトの名無しさん
08/02/23 14:25:07
>>281
Cとの互換性を大事にしたいなら後者、意味をはっきりさせたいのなら前者を使うといいでしょう。
285:デフォルトの名無しさん
08/02/23 14:26:18
>>273
実際やってみると
cuで2が、gguで3が、ijcoで4が返ってきます
これは、s[i] == cと、s[i] == 0の判定が成されていないという事ですよね?
しかし、while関数自体は終わってるので、s[i]は判定されている
どういうことなんでしょうか?
また、ご指摘を受けて、whileをdo-whileに変更しました、ありがとうございます
286:デフォルトの名無しさん
08/02/23 14:27:11
なんでそんな単純な構造でgotoを使う必要があるのか解らん。
287:デフォルトの名無しさん
08/02/23 14:30:00
gotoは怖くて使えない・・・
てか絶対使わないようにしてるんだが、違うのか
288:デフォルトの名無しさん
08/02/23 14:31:58
>>280
単なる構文糖衣じゃない。
参照の参照というのは存在しないが、
ポインタのポインタというのは存在する。
これは大きな違いで、適当な教え方してると >>207 みたいなやつが出てくる。
289:デフォルトの名無しさん
08/02/23 14:33:55
>>287
むしろ使った方が綺麗になる状況では使う。
でも、上のは break; 使えば解決できることで、
goto を使って解決すべきじゃない。
290:デフォルトの名無しさん
08/02/23 14:37:52
>>282
>>284
当面はあまり気にしなくてよさそうですね
どうもありがとうございました
291:デフォルトの名無しさん
08/02/23 14:39:03
>>290
いいや、気にしろ。
292:デフォルトの名無しさん
08/02/23 14:42:06
普通は C 風のキャストは使うべきじゃない。
せいぜいクラスのテンポラリオブジェクトを作るのに関数風のキャストを使うくらい。
293:デフォルトの名無しさん
08/02/23 14:47:55
>>292
それはキャストよりもコンストラクタ呼び出しのほうがしっくりくる
294:デフォルトの名無しさん
08/02/23 14:49:30
昨日質問したものですが、char * 型とchar []を判別する方法はありませんか?
295:デフォルトの名無しさん
08/02/23 14:52:19
ソースコードを読みましょう。
296:デフォルトの名無しさん
08/02/23 14:54:36
>>291
すいません
気にしろとだけ言われましてもなにに気を使えばいいのかわかりません
まずい点でもでてくるのか
だとかを教えていただけませんか
297:デフォルトの名無しさん
08/02/23 14:58:13
キャストには色々意味があって、C言語風キャストだとそれらをすべて内包してしまって意図が掴みにくい
298:デフォルトの名無しさん
08/02/23 14:58:20
メインウインドウにBUTTONを作成するときなどで使う、
CreateWindowとCreateControlWindowはどう違いますか?
299:デフォルトの名無しさん
08/02/23 15:00:58
>>296
C風のキャストはなんでもかんでもキャストできてしまうので、
プログラマの意図と違ってても警告が出ない
const void *p = 〜;
char *q = (char*)p; // charにキャスト・・・あれ? constも外しちゃったよ! でも警告は出ない
char *r = static_cast<char*>(p); // コンパイルエラー: static_castでconstは外せない
char *s = const_cast<char*>(static_cast<const char*>(p)); // constも外したい意図の場合はこう書く
300:デフォルトの名無しさん
08/02/23 15:03:54
>>286-287
gotoのほうが行き先が明確になるので、理解しやすかったので、用いていますが
なぜ怖いのでしょうか
それと、「これは、s[i] == cと、s[i] == 0の判定が成されていないという事ですよね?
しかし、while関数自体は終わってるので、s[i]は判定されている
どういうことなんでしょうか? 」
これにも答えていただけると非常にありがたいです
301:デフォルトの名無しさん
08/02/23 15:04:05
>>296
キャストというのは基本的にマズい処理。
アップキャストだけは例外的に安全だが、
それ以外は基本的にはあまりやるべきではない。
でも、実際にはどうしてもやる必要が出てくる事もある。
こればっかりは仕方が無い。
そういう時、C 風のキャストを使ってしまうと色々と問題が発生する。
・ 間違って危険なキャストをしてしまうかもしれない。
例えば、const を付けるべきところで const を付け忘れたり。
こういう時、static_cast なら危険な const の付け忘れがあるとコンパイルエラーになる。
C 風キャストだと問答無用でキャストされてしまう。
これが一番の問題。
・ キャストが原因っぽいバグが見つかった時、どこにキャストがあるのか探すのが面倒。
C++ のキャストだと検索でキャストを行っている箇所を簡単に見つけられる。
・ キャストがあまり目立たない。
危険な処理を行っている箇所が目立たないのは危険。
C++ のキャストは非常に目立つ。
・ 打鍵数が少ないので気軽にキャストをしてしまう。
C++ のキャストは打ち込むのが面倒で、キャストを本当に使うべきなのか
立ち止まって考えるよう思考を誘導してくれるかもしれない。
・ 今行おうとしているキャストはどういうものかをあまり意識しないかもしれない。
キャストという処理を軽く見ているのはよろしくない。
302:デフォルトの名無しさん
08/02/23 15:06:01
>>300
gotoが必要になるのは言語の構造化能力を超えた構造が必要になる場合であって、
この場合はそういう場合でない。
303:デフォルトの名無しさん
08/02/23 15:06:12
>>300
論理的に記述しようぜ。
「while を終了する」 と 「指定位置に移動する」 では
前者の方がより論理的だ。
論理的なコードは、一般に変更に強く、バグが出にくい。
まあ、break すらみだりに使うべきじゃないという人もいるけどね。
304:デフォルトの名無しさん
08/02/23 15:07:50
関数の引数で、char * 型とchar []型を判別する方法ありますか?
305:デフォルトの名無しさん
08/02/23 15:09:39
>>304
不可能
306:デフォルトの名無しさん
08/02/23 15:10:05
void foo(char* const& hoge);
template <size_t N> void foo(char (&hoge)[N]);
と区別できなくはない。
307:デフォルトの名無しさん
08/02/23 15:12:02
char[N]とchar[]は別物だと思うよ。
308:デフォルトの名無しさん
08/02/23 15:12:33
void foo(char* hoge, size_t size);
template <size_t N> inline void foo(char (&hoge)[N]) { foo(hoge, N); }
もちろん、こう実装するんだぜ。
309:デフォルトの名無しさん
08/02/23 15:13:12
そう言う意味での char [] 型なんてそもそも存在しないが。
310:デフォルトの名無しさん
08/02/23 15:13:14
>>285
>cuで2が、gguで3が、ijcoで4が返ってきます
その書き方はおかしい
strch_idxには引数が2つあるので、cuとかgguだけでは結果は決まらないはずだ
311:デフォルトの名無しさん
08/02/23 15:13:24
>>300
逆。
gotoの方がどこにでも飛ばせるせいで行き先が不明確になる。
自分の書いたコードを他人に読ませることを想像してごらん。
breakならどこに飛ぶのか一目瞭然だけど、gotoだといちいちラベルを検索しないといけない。
しかもbreakなら「ループの終了」という意図が一目瞭然だけど、
gotoだとどういう意図で飛ばしたのかを考えないといけない。
そういう理由でgotoは避けられるため、安易にgotoが入っているとさらに、
「gotoを使わなければいけないどんな理由があったのか?」と考えさせることになる。
312:デフォルトの名無しさん
08/02/23 15:14:13
int⇔floatの変換だけでも、毎回static_cast使う?
あと、コンテナの最後の要素以外を処理する時、
std::vector<T> container;
for (int n = 0; n < static_cast<int>(container.size()) - 1; ++n) container[n] = ...;
ってやる?
313:デフォルトの名無しさん
08/02/23 15:23:01
>>312
俺はstatic_castを使う
コンテナの方は
for (size_t n = 0; 〜
って書けばいいのでは
本当は std::vector<T>::size_type の方が適切なのかもしれんが
314:デフォルトの名無しさん
08/02/23 15:23:54
>>312
>int⇔floatの変換
うん。
>最後の要素以外を処理
unsigned使う。
315:デフォルトの名無しさん
08/02/23 15:31:10
>int⇔floatの変換だけでも、毎回static_cast使う?
使う。
>コンテナの最後の・・・
for (std::vector<T>::size_type n = 0, size = container.size(); n + 1 < size; ++n) container[n] = ...;
ってやると思う。
符号無しの値を符号付きにキャストするのは基本的に危険だと思う。
316:デフォルトの名無しさん
08/02/23 15:32:52
後者の場合、
if( !c.empty() )
for( size_t n=0; n<c.size()-1; ++n)
で何か問題あるのか?
317:デフォルトの名無しさん
08/02/23 15:34:18
>>316
n + 1 < c.size() で判定すれば empty チェックは要らない。
318:デフォルトの名無しさん
08/02/23 15:36:12
typename 忘れてた。
まあ T をそういう意味で使ってるとは限らないが。
319:デフォルトの名無しさん
08/02/23 15:39:01
>>302 >>303
>>311での説明とほぼ同じという理解でよろしいでしょうか
>>311
gotoよりbreakを使うべきというのは、よく理解でき、納得できました
しかし、怖いというのは一体
>>310
すみませんが、もうすこし噛み砕いて説明願えないでしょうか
const char* sには、任意の文字列が入って、char cで、検索する文字を固定という事ではないんですか?
そのconst char* sにcuですとか、gguですとかが入っているので、これで十分だと考えているのですが
320:デフォルトの名無しさん
08/02/23 15:43:08
>>319
goto はまず特定の状況でしか使われない。
それ以外で使われると混乱するし、
何のために使われているかすぐに分からないので不気味で怖い。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4987日前に更新/243 KB
担当:undef