【初心者歓迎】C/C++室 Ver.3【環境依存OK】
2 :
デフォルトの名無しさん:03/11/25 09:30
2
乙
この前はお世話になりました。
問題は解決し,,,,。
結局、エディットボックスにSendMessageを使うことにしました。
それよりもMDIなるものが存在していたんですね。
SDIでたくさん窓出して、フォトショもどきを作っているつもりに
なっていました。
>>6 あっそうとしかいえないんだがな。
だから?としかいえないんだがな。
なんていってほしいんだ?
>>7 お前みたいなつまらんレスしか書けない奴には
黙ってて欲しいんじゃないか?
「そうか。がんばれよ! 俺はお前の見方だから!
ずっと、、、ずっと応援するから!!!
わからないことがあったらなんでも聞きにこいよ。
ううん、、、遠慮なんかする事ないよ。
僕だって最初はわからないことだらけだったし、、、、。
、、、、、。
歩歩歩ならやれるわ、、。がんばって、、、、。」
とモニターの前で感情込めて言って欲しい。
最後の行はセイラさんで。
あ。「歩歩歩」と書いて「ほふあゆむ」と読んでね。
ホーホーホー
ボーボボ
fufufu(^^)
17 :
デフォルトの名無しさん:03/11/25 16:45
C++で、配列を要素とするvectorを宣言して、そのvectorに配列を追加していく
にはどうすればよいのでしょうか?
>>17 std::vector< std::vector< int> > vector_array;
std::vector< int> array0;
std::vector< int> array1;
std::vector< int> array2;
vector_array.push_back( array0 );
vector_array.push_back( array1 );
vector_array.push_back( array2 );
でいいんじゃね?
ただ、どちらかというと配列自体よりも、
配列のポインタつっこんだ方がいいような気がする。
浮動小数点型変数(double)にNaNを入れるにはどうしたらいいでしょうか?
>>19 C++的には
#include <limits>
double qnan = std::limits<double>::quiet_NaN();
double snan = std::limits<double>::signaling_NaN();
訂正
×limits<double>
○numeric_limits<double>
iteratorではまってます。
insertなどをするとiteratorが無効になることがあると聞いたのですが
もし、vector<A>の要素内にvector<B>があった場合、vector<B>にinsertで
要素を追加した場合もvector<A>のiteratorが無効になることがありますか?
>>22 >vector<A>の要素内にvector<B>があった場合
というのが、vector< vector<B> >の意味なら
影響はしない。
24 :
デフォルトの名無しさん:03/11/27 23:07
gccやbccに結果が未定義の文に対して警告を出させる方法ってありますか?
とりあえずgcc -Wallでは出なかったんですが…。
gcc -Wall -pedantic
27 :
デフォルトの名無しさん:03/11/28 07:50
>>25 それは規格に沿わないものを厳密にチェックするだけであって、未定義の文に対して警告を出させるものじゃないぞ。
28 :
デフォルトの名無しさん:03/11/28 09:18
c++で、string型の引数を渡す事ってできないんですか?
コンパイル通らないんですが・・・
void hoge(string str);
main()
{
string str;
hoge(str);
}
みたいな感じなんですが。
>>28 普通に渡せるが‥‥
最低でもエラーメッセージぐらいは書け
30 :
デフォルトの名無しさん:03/11/28 09:40
>>29 すいませんでした。正確には
void hoge(char *aaaa, string str);
main()
{
string str;
hoge("xxxxx", str);
}
エラーメッセージは
cannnot pass objects of non-POD type `struct std::string' through `...'; call will abort at runtime
となっていました。
>>30 "xxxxx"は文字列定数だからconst char*じゃないとダメじゃないのか?
32 :
デフォルトの名無しさん:03/11/28 10:21
>>31 ここ以外にも (char*)の引数に"xxxx"を渡している関数があるんですが
そっちは普通に動いてます。
確かにconst char*が正確みたいですね。どうもです。
PODがどうとか詳しくないんでアレだけど、
関数内で値を書き換えないならvoid hoge(char *aaaa, const string& str);
書き換えるならvoid hoge(char *aaaa, string& str); ってしてみたら?
>>30 printf()の引数か何かで渡しないか?
よくわからないんですが、エラーでなくなりました。
みなさんレス有難うございました。
36 :
デフォルトの名無しさん:03/11/28 11:17
>>35 チンチンしゅっっしゅっあふぇぁええふぇあ
37 :
デフォルトの名無しさん:03/11/28 14:57
Cygwin 上の GCC で cout を使うと undefined reference と怒られます。
IOストリームはインクルードしています。
何かスイッチが足りないのでしょうか?
g++
using namespace std;
39 :
デフォルトの名無しさん:03/11/28 15:10
GUIアプリから、コマンドラインプログラムを起動させるためにsysytem関数を
使っているのですが、いちいちDOS窓が開いてしまいます。
DOS窓を開かせないためにはどうすればいいですか?
環境
Win98 VC++6
コマンドラインプログラムって何?
>>39 >40も書いているが、CreateProcess()に渡す構造体に適当なパラメータをわたせばよい。
調べがつかないようなら言ってくれればサンプルを提示できるが、今はちょっとめんどい。
const LPTSTR cmdline = TEXT("c:\\windows\\notepad.exe c:\\autoexec.bat");
STARTUPINFOsi;
PROCESS_INFORMATIONpi;
ZeroMemory(&si, sizeof(STARTINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTINFO);
if (
CreateProcess(NULL, cmdline, NULL, NULL, FALSE,
(CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP),
NULL, NULL, &si, &pi);
) return 1; // failed
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
ファイルに書き出しができないです
教えてください
#include<stdio.h>
#include<stdlib.h>
main()
{
FILE *fp1;
char name[20];
int eng,math;
int i=0;
if((fp1=fopen("kekka.txt","w"))==NULL){
printf("ファイルオープンエラー\n");
exit(1);
}
printf("データを入力してください\n終了は、CTRL+Z\n");
printf(" 氏名 数学 英語\n");
while(scanf("%s %d %d",name,&eng,&math)!=EOF){
fseek(fp1,i*30L,SEEK_SET);
fprintf(fp1,"%20s%5d%5d",name,eng,math);
i++;
}
fclose(fp1);
}
fseekは不要じゃない?
fseekは必要ないですか?
47 :
デフォルトの名無しさん:03/11/29 17:41
書き込めば書き込んだ分ファイルポインタは後退する。
ありがとうございます
fseek抜きました
でも実行しても、kekka.txtには何も格納されてないのです
49 :
デフォルトの名無しさん:03/11/29 17:44
エラー E2209 b.cpp 1: インクルードファイル 'iostream' をオープンできない
エラー E2282 b.cpp 2: 名前空間名が必要
エラー E2451 b.cpp 6: 未定義のシンボル cout(関数 main() )
エラー E2451 b.cpp 6: 未定義のシンボル endl(関数 main() )
こんなんが出ますが何でオープンできないのですか?
50 :
デフォルトの名無しさん:03/11/29 17:45
char から const char に型変換できませんか?
char num[16];
fp=fopen("a.txt","w");
for( int i = 0; i < 16; ii++ ){
num[16] = (char)(rand() % 16);
}
fputs(num,fp);
numをfputsの中に入れたいのですが
numはconst char でないとダメですと怒られます
Borland C++ 5.5.1ちなみにコンパイラは左のです
fclose(fp)
が実行されていないようです・・・
処理が終了しないんです
>>49 using-namespace だっけ?
C++やったことないからわからないけど「名前空間名を使います」って宣言があったよね
>>49 もし
>>53で出来ない場合は
#inlcude <iostream.h>
これでOK
fputs(); の引数fpが変
#include <iostream>
using namespace std;
int main()
{
cout << "hello" << endl;
}
ちなみにソースはこれです
書き込みできない原因分からないですか?
#include <iostream.h>
にしてみた?
>>49 Readme.txt読め。↓の手順やってないだろ
b. bcc32.cfg ファイルを作成します。このファイルは,Include
および Lib パスのコンパイラオプション(コンパイラの -I
および -L スイッチ)を設定するものです。ファイルには次の
行を含めてください。
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
c. ilink32.cfg ファイルを作成します。このファイルは,Lib
パスのリンカオプションを設定するものです。ファイルには
次の行を含めてください。
-L"c:\Borland\Bcc55\lib"
>>58 適当なこと答えてるんじゃねぇよ。
>>51も読めよ。
>>49は、正しくセットアップがされてないとみた。
あ、書き込みエラーしている間に、
>>59に先越された。
>>61 vc使っています
何でだめなんでしょう・・・
プロジェクト win32 console application
でつくりました
>>62 scanfが満足するまでCtrl-Zを繰り返し入力するといけるかも。
>>62 直接関係はないと思うが、とりあえず最後に return 1; 追加しろ。
>>64 別にいいんでない?以上終了するわけでもないし。
66 :
デフォルトの名無しさん:03/11/29 18:32
Microsoft Visual c++何ですけど、プログラム作って「デバッグなしで開始」にすると
「デバッグを開始できません。
プログラム'z\・・・・・・・,exe''を開始できません
指示されたファイルが見つかりません」
って出るんですけど、どうしたらいいんですか?改善法求む
超初心者でスマソ
67 :
デフォルトの名無しさん:03/11/29 19:30
教えてください。
CGIを設置する時に、自分の環境に合わせて初期設定をしますよね?
その書き換え箇所とは
#============================
#CGIの設置場所(フルURL)
$cginame = '
http://lum.3nopage.com/cgi-bin/***.cgi';
#CGIの設置サーバー(ホスト名のみ)
などとあったら、CGIの設置場所(フルURL)を自分のHPに書き換えたりすればればいいんでしょうか?
>>67 激しく板違い。
ところで、それって質問に値するようなことか?
常識だと思うのは、ここがム板だからだろうか。
>>44 終了時、Ctrl+Cで終了していないか?
実際のファイルの書き出しは(そのケースでは)最後のfclose()まで行なわれないので
そこをきちんと処理されているかデバッガで確認してみるといいと思う。
>>64 なんでそこでマジックナンバーが出てくるんだ?
return EXIT_SUCCESS;或いは単純に
return 0;でいいと思うのだが。
>>68−69
すみません、プログラミング板でいいと思っていました。
いま板をちゃんと調べたらWEBプログラミング板がありました。
テンパってしまっていたみたいです。以後気をつけます。
すみませんでした。
>>71 そういう話ではなくて。。。w
cgiの作り方ではなくて使い方がわからないんだろ?
>>52 >fclose(fp)
>が実行されていないようです・・・
そりゃあ書き込まれないでしょうね。
…つか、じゃどうやって終了させてるんだっつー話ですよ。
質問です。
class CTempA{
private:
string name;
};
class CTempB{
private:
string name;
std::map<string, CTempA*> container;
};
のように、ポインタを格納するコンテナをメンバ変数でもつクラスでは、
コピーコンストラクタやoperator=(const CTempB&)でコンテナをコピーする際に、
新しくnew CTempA()でメモリを確保して、
そのアドレスを新しいインスタンスのコンテナに格納した方が良いのでしょうか。
現状ではコピーコンストラクタ内ではmapのoperator=をそのまま使っているのですが、
なんだか転けているような感じがするので。
>>74 それだけで答えられる奴はいない。
新しくも何も、元のCTempAについて何も触れられていないのに、アドバイスが出来るわけない。
ぶっちゃけ、CTempAやCtempBの話はどうでもよくって、mapの扱いの問題だよな。
newしたポインタのコンテナだと、君にはまだ無理じゃないか?
なるほど。出直してきます。
>>74 ポインタのみをコピーしたいのか、
新しいインスタンスを必要とするのか
仕様で決まる問題で「どっちがいいか」の問題じゃないぞ。
>>74 containerを破棄しただけでは、CTempAのインスタンスは破棄されないことは理解してるよな?
79 :
デフォルトの名無しさん:03/11/30 16:23
C/C++のメモリ管理について教えてほしいのですが、
通常の、int x:とか、char a[100];
とかで確保したメモリはどの時点で解放されるのでしょうか。
malloc()したメモリは、free()しない限り、プログラム終了しても
解放されないのでしょうか。
通常に宣言した変数はブロックを抜けるとスコープが抜けますね
通常OSがmalloc で確保したメモリは、
プログラムが終了した時点で破棄するはずです。
81 :
デフォルトの名無しさん:03/11/30 16:40
では、メモリリークというのは、長時間あるいはずっと起動している
プログラムに起きる問題ということでしょうか。
>>81 OSのAPIとか呼んで貰ったハンドルを解放しなかった場合とかにも起きる。
83 :
デフォルトの名無しさん:03/11/30 16:49
メモリリークはほとんどの場合、プログラムのバグで起きる。
まれに、外部からリークされることもある。
85 :
デフォルトの名無しさん:03/12/01 02:47
私もメモリリークについて質問させてください。
メモリリークを起こしたプログラムが終了すれば、問題ない
ということでしょうか?
というのは私は最近windowsXPを使ってDirectXを用いたプログラムを
組んでいます。
そこではCOMという技術を使っているらしく、サンプルのプログラムでは
終了前に必ず「->Rerease()」というような記述でインターフェースの
開放を行っています。
しかしプログラム終了時のみにメモリを開放するようなアプリケーション
を考えた場合、これは実質上、開放しないプログラムと変わらないの
ではないでしょうか?
このような理解で間違えないでしょうか?
>>85 単にプログラムが終了しても確保していたメモリーをOSが開放してくれない場合が
あるから普通はきちんと開放するのがプログラムの礼儀。
つーかCOMの場合はわりと問題になる場合がある。
>>85 一応、礼儀的には、確保したリソースはそのプロセスが
解放することが礼儀ですが、これは前時代的な手法であると
10年くらい前から常々、MSは主張してきました。(主にデビッドカトラー氏)
DirectXまわりのCOMであれば、->Release()せずとも
なんら問題ないことを確認しています。
その他、foepnで開いたリソースなども、
解放せずにプロセスを終了してしまってなんら問題ありません。
というか、問題おきるようであれば、OS側の問題であるというのが
MSを含む、あらゆる近代的なOSの設計思想です。
COMでもEXEサーバの場合確実に問題になるな。
あとC++の場合、メモリは問題なくてもデストラクタが働かないことで
問題が起きる場合もある。
90 :
デフォルトの名無しさん:03/12/01 05:00
C言語とC++で作成した複数の実行プラグラム(EXEファイル)を一つにまとめることできますか?
プログラムは、すべてファイル入出力に関するプログラムです。
main()の名前変えて引数なりに応じてそれを呼ぶmain()作れ
>>86,
>>88 そんな礼儀などありません。
プロセスの占有リソースであれば、システムが解放するのが筋であり
プロセス側で解放するのは間抜けなシステムに対する対症療法です。
>>86 ダウト。プロセスが確保した領域なら、プロセスが終了したら必ずOSに返される。
(COMはプロセスが「確保していたメモリー」ではないよね?)
Windowsはリソース・リークしたり、デバイスを握ったままになる
場合があるかもしれない。Win95とか特に。
だがこれらはメモリリークとはなんの関係ない。
リソースだってメモリ喰うんだから結局メモリリークだろ
「初心者歓迎」なんてタイトルのスレで、
んなガイシュツネタをやんなアホウ
ありがとうございました。非常に参考になりました。
基本的には、OSが開放するものなんですね。
とりあえずDirectX周りのCOMでは問題にならないことが
多いということがわかり、安心しました。
>> 95
いや、よくわからんのだが・・。
既出ならURL教えてくれと甘えてみたりして。
>>97 >>> 95
>いや、よくわからんのだが・・。
>既出ならURL教えてくれと甘えてみたりして。
とても失礼な事いってるな。
がいしゅつしか言わない
>>95も微妙かと思うが・・・まぁ
>>97はネタかと・・・
>基本的には、OSが開放するものなんですね。
>とりあえずDirectX周りのCOMでは問題にならないことが
>多いということがわかり、安心しました。
OSに依存するような事はあまりしないほうがいい。
APIを使うなとか言う意味ではなくて、OS側のプロセスは期待してはいけない
確実にプログラムで処理できる法は処理しましょう(メモリの開放など)
つーか、C++やってると全部スマートポインタに投げるから勝手に削除されるけどな。
んなもんいちいち手動でやってられるか。
newsあたりのフーレムの種>メモリ/リソースの解放云々
フーレムってなんやねん、フレーム
ゴーレムの親戚かな?<フーレム
メモリリークはプロセスが終了したらOSが処理すればいいだろうけど、
クリップボードにゴミ残したまま終了されたらお手上げだよね。
#と、フーレムの種を撒いてみるテスト
ロボットの枠組み=フレーム のことかも
この場合はフレームだろ、104が何を意図してるのか曖昧だけど。
先生方、質問です。
XP環境で複数のログオンユーザーがいる場合、
1.現在のユーザーを調べる方法
2.ログオンしている全てのユーザーを調べる方法
を教えて下さい。お願いします。
>>106 初心者が知ろうとするようなことではない。
先生方、質問です。
Windows2003環境で複数のログオンユーザーがいる場合、
1.現在のユーザーを調べる方法
2.ログオンしている全てのユーザーを調べる方法
3.アホがいる人数を調べる方法
4.初心者と名乗っていればなんでも教えてくれると
思ってる香具師の人数を調べる方法
を教えて下さい。お願いします。
int i = getAhoo();
int j = getSyoshinsya(_t("2ch"));
専門家の皆様、何卒御教授下さい。スレ違いだったらごめんなさい。
gdbで、実行ファイル中のオブジェクトについて調べるにはどうしたらよいのでしょう?
例えばstringな変数strの、
1) 中身の文字列そのもの
2) str.length()
について見たいのです。1)はprintで一応見れますが、他もズラズラ
見えるのでスマートでない気がします。2)はわからないです。
よろしくお願い致します
111 :
デフォルトの名無しさん:03/12/02 18:40
C++での二進数の表現はどうやればいいんでしょうか?
16進数の場合に0xffと書くように、2進数で0b0101011と書くことは可能でしょうか?
2をシフトするのかなぁ
OpenCVの使い方教えてくれぇー。
どのライブラリ咥えてもcv.dllエラーってなるよー。
>>111 ないんだよなぁ、表現方法が。
昔、とあるCコンパイラが拡張で0bをサポートしてたな。
>>114 ないんですか。
残念です。
ありがとうございました。
Windows付属の電卓とか2進<>16進変換できるツールつかっとけ。
117 :
デフォルトの名無しさん:03/12/02 19:23
数値の書き方はまだしも、printfに二進数での表現がないのが不思議。
八進数なんかよりよほど使うと思うんだけど。
>>117 標準ライブラリ作る人も悩んだと思うよ
2進数で表示するとすごい長くなるからねぇ・・・
とりあえず、2のn乗を10進と16進で覚えておくのかなぁ。
n=12(4096)まで覚えておけば十分ではなかろうか。
24816326412825651210242484096でつね
>>119 16進で2のn乗を覚える必要はほぼない.つーかそのための16進だ.
16=0x10, 256=0x100, 1024=0x400, 65536=0x10000, ・・・
122 :
デフォルトの名無しさん:03/12/02 22:28
new演算子を使って↓のようなことがしたいのですが
(これだとコンパイルエラー)
このようにある関数内で宣言した変数を
別の関数において宣言無しで使うようなことって
できないのでしょうか?つまりローカル変数を
一時的にグローバル変数のように扱いたいということです。
void main(void)
{
f();
cout<<*p;
delete p;
}
void f()
{
int* p;
p=new int;
}
123 :
デフォルトの名無しさん:03/12/02 22:31
>>122 > 一時的にグローバル変数のように扱いたいということです。
無理
ところで、引数や戻り値って知っている?
124 :
デフォルトの名無しさん:03/12/02 22:34
普通は
void main(void)
{
int* p = f();
cout<<*p;
delete p;
}
int* f()
{
return ( new int );
}
でしょ
125 :
デフォルトの名無しさん:03/12/02 22:42
無理なんですか。なんでこういうことを思ったかというと
今読んでる本にそういうことが可能であるかのような記述があったからです。
一部引用しますと
>・・・なかなか動的なメモリの確保の便利さは理解しにくいかもしれません。
>しかし、たくさんの関数が登場する、大規模なコードの場合を考えてみてください。
>関数の開始・終了にかかわらず、記憶しておきたい値がある場合には、ローカル
>変数は使えません。ローカル変数の寿命はその関数内だけに限られているからです。
>また、グローバル変数では、プログラムの実行中はずっと値を保持することができます。
>しかし、グローバル変数は限りあるメモリを無駄づかいすることにもなります。
>この2つの方法にくらべて、動的にメモリを確保する方法では、限りあるメモリを必要な
>ときに十分利用することができるようになります。
これはnewとdeleteの使い方の説明の後に書いてあった文章なのですが
これを読んでnewとdeleteを使って関数をまたいで変数の扱いができるように
なると思ったのです。
引数も戻り値も知っています。上の例では余分な情報はなるべく省こうと思って
ああいった書き方にしました。
126 :
デフォルトの名無しさん:03/12/02 22:45
>>125 領域の確保、解放が好きな時に出来るだけで、それを受ける変数のスコープは通常通り。
127 :
デフォルトの名無しさん:03/12/02 22:50
なるほど、そういうことだったんですね・・・
ありがとうございました。
(´-`).。oO(本当に分かっているのだろうか?…)
つーか
>>125(の本)の想定しているコードは
int* p;
void main(void)
{
f();
cout<<*p;
delete p;
}
void f()
{
p=new int;
}
でしょ。
こんなコードの場合は俺も
>>124派だが
むしろ
>>124の形式を今作ってるもので使ってる罠
ノード使ってるンだけど
CreateNode とかやんないと初期化面倒くさいからねぇ
CreateNode は関数ですよ
132 :
デフォルトの名無しさん:03/12/02 23:13
マルチバイト文字を含んだストリームから文字を「一文字」読み込みたいのですが、
一般にどのような方法があるのでしょうか。
使っているシステムは unix です。
fgetwc は環境によって挙動が違ったり、1バイトしか読みこまないかったりで、
使い物にならないような気がするのですが……どうなんでしょう。
wchar_t c;
cin >> c;
134 :
デフォルトの名無しさん:03/12/02 23:20
信用できないなら自分で書く。
>>134 OSが信用できないんですが、どうしたらいいですか?
自分が信用できないんですが
CPUが信用できないんですが
>>111 2進処理クラス作れば?
int foo = CBinary("10100101"); くらいは簡単でしょ。
>>139 窓から投げ捨てろ(俺が受け止めてやる)
環境依存でいいなら_itoaでいけるかもな。
とりあえず文字列からの変換ならbitsetを介したいところだな
伊藤あ
阿藤い
もう一度質問したいのですが
void main(void)
{
int* p;
p=new int;
*p=0;
cout<<*p;
cout<<p;
f(p);
g(p);
delete p;
}
void f(int* p)
{
cout<<*p;
cout<<p;
}
void g(int* p)
{
cout<<*p;
cout<<pl;
}
これですと、p , *p ともにきちんと表示されるのですが(どれも同じ)
void main(void)
{
int* p;
p=new int;
*p=0;
cout<<*p;
cout<<p;
p=f(p);
cout<<*p;
cout<<p;
g(p);
delete p;
}
int* f(int* p)
{
cout<<*p;
cout<<p;
int a=1;
cout<<&a;
p=&a;
cout<<*p;
return p;
}
void g(int* p)
{
cout<<p;
cout<<*p;
}
>>146のプログラムだと、最後の*p(関数gのcout<<*p)のみ表示がおかしくなります。
先ほどの例と比べて、p及び*pの扱いにおかしなとkろおがあるように思えないのですが
このプログラムだとどこがいけないのでしょうか。
×おかしなとkろおがあるように思えないのですが
○おかしなところがあるように思えないのですが
おかしいからおかしくなってるんだよ。
ポインタについてもう10ぺんほど勉強しなおせ。
>>146 int* f(int* p)
{
・・・
int a=1;
cout<<&a;
p=&a;
・・・
}//ここで a が破壊される。pのポインタは無効になる。
>>150 >p=f(p);
↑こっちだろ?
藻前はローカル変数を(ry
同じ事を指摘しているように思えるが
>>149-152 >>122にはトレースという方法とスコープという概念を学べと言った方が良いと思う
サンプルだすぞ
int *hoge()
{
int a;
return &a;
}
void main()
{
int *p = hoge();
*p = 10;
}
コレで考えてみるぞ
まず
変数の有効範囲を示すぞー
int *hoge()
{
int a; +- 変数 a の有効範囲
.|
return &a; | a のアドレスを返す
a += 1; .|まだ有効範囲だから使える(実行はされないけど
} +-関数から抜け出す時に a は破棄される(使えなくなる
void main()
{
int *p = hoge(); +- *pの有効範囲
|破棄されたはずの a のアドレスを受け取る
*p = 10; |使用不可能なのでエラー
|
} +- 破棄されるのは変数 *p
たとえば a は0xaaaaaaに合ったとすると
int *hoge()は 0xaaaaaaを返すわけで
mainのpには0xaaaaaaが入る
*p = 10; とすると、ポインタの指す先の 0xaaaaaa に 10 を入れたいんだけど
ソコはすでに破棄されているからエラーが返ってくる
というわけです。
みなさんどうもありがとうございます。
ここに書き込んだ後に以下のようにすれば良いことはわかったので
int* f(int* p) → void f(int* p)
p=f(p) → f(p)
p=&a → *p=a
やりたいことをやる分には特に支障はなくなったのですが
まだ疑問が残ります。というのも
>>146をコンパイルしたときに
表示されるものが、上から順に
0(
>>146のmain関数の中、上から6行目の*pの値←これを以下ではmain , 6 , *p と書くことにします)
アドレス1(main , 7 , p)
0(f , 3 , *p)
アドレス1(f , 4 , p)
アドレス2(f , 6 , &a)
1(f , 8 , *p)
1(main , 10 , *p)
アドレス2(main , 11 , p)
アドレス2(g , 3 , p)
滅茶苦茶な値(g , 4 , *p)
となります。つまりmainで宣言したポインタpをfに渡してアドレスを書き換えて
それをmainに返した段階(p=f(p); cout<<*p; cout<<p;)では、表示は正常のように
思えます。
>>150さんの言う「ポインタの無効」とはどういう意味合いなんでしょうか?
また関数gの表示がpは正常で*pのほうだけが滅茶苦茶になるというのも理由がよくわかりません。
両方ともおかしくなるのだったらまだわかるのですが・・・
>>154 >ソコはすでに破棄されているからエラーが返ってくる
エラーは返ってこない。
基本的には、セグメンテーションフォルトで落ちる。
運が悪ければ「10」が書き込まれ、きちんと動作したように見えてしまう。
>int *p = hoge(); +- *pの有効範囲
int *p;
とした場合の変数名は「p」で「*p」じゃない。
「*p」とした場合には変数「p」の指し示す先の内容となる。
>>153-154 ありがとうございます。
トレースという言葉は初めて聞きました。いま使っている本には
どうやら載ってないようなのでとりあえずネットで検索してみることにします。
まだC++を始めて間もない&独学なので突拍子も無いことを言うと思いますが
みなさんよろしくおねがいします。もちろんなるべく自分で解決するように努力します。
>>155 >それをmainに返した段階(p=f(p); cout<<*p; cout<<p;)では、表示は正常のように思えます。
たまたま正しい値が見えてしまっているだけ。
それが、関数g()の呼び出しで変更されたにすぎない。
# ローカル変数はたいていスタックに積まれるため、
# 関数から戻った直後はスタックの内容が変わらない場合が多い。
最近ではトレースも知らない輩がいるのか…
>>159 入門書にトレースは書いてない。
筆記試験とか(情報処理検定など)受けないとトレースは知らない存在じゃないかなぁ
ただ、トレースって言葉は知らなかったけど同じような事はみんなたぶんやってるわけで
すんなり入れると思うよ
>>158 そういうことだったんですか・・
少し状況がわかってきたような気がします。
一番勘違いしていたのは、関数fにおいてp=&a;としてpのアドレスを書き換えて
return p;としているので、書き換えられたpがmainにおいて有効だと思っていたことでしょうか。
関数fの終了は } なので、その前にreturnしてしまえば大丈夫なのかと思っていました。
しかし実際にはpにアドレスを渡す役目を果たした&aのスコープも存在も影響していた
という理解でいいのでしょうか。
実際
>>146で関数f内で宣言しているint aをグローバル変数として宣言すると
先ほどは滅茶苦茶な表示だった箇所が正常になりました。(これも結果だけ正常と
いう可能性もありますか?)
>>161 >実際
>>146で関数f内で宣言しているint aをグローバル変数として宣言すると
>先ほどは滅茶苦茶な表示だった箇所が正常になりました。(これも結果だけ正常と
>いう可能性もありますか?)
きちんと正常
うーん、わかったようなわからないような・・・
(こういう気持ちのときはようするにまだわかってないのでしょうが・・)
#include <iostream.h>
void main(void)
{
int* p;
p=new int;
*p=1;
cout<<*p<<endl<<p<<endl; //ここでのpの値をアドレス1とする
int* q;
q=p;
//int a=2; //コード1
//p=&a; //
//delete p; //コード2
cout<<*q<<endl<<q<<endl;
cout<<*p<<endl<<p<<endl;
}
このプログラムにおいて、まずコード2を有効にする(delete p;)と
cout<<*q が滅茶苦茶、cout<<qはアドレス1と表示されます。
(qの表示が正常なのは結果だけだと思いますが。)
この場合はポインタqにアドレスを渡し終えたpが破棄された影響と見る、ということ。
次にコード2は無効(コメントのまま)にして、コード1を有効にします。
そうすると今度はq , *qはそれぞれq=アドレス1 , *q=1を表示します。
つまりp=&aの影響は一切受けません。
q=pとしてpにその後何を代入してもqの値はq=pとした時点での値を守り
一方でq=pとしてもその後にp存在が消えればqにも影響が出ます。
結局のところ、q=pという代入はメモリ上で何をやっているのかよくわかりません。
結果だけ見て「pの存在が消えない限りはqはpの動向に影響を受けない。
しかしpが消えた場合はqにも影響が出る」と覚えてしまったほうが良いでしょうか。
初めて学ぶときにこういったことに深入りしないほうがいいとは思うのですが、
どうにも気になってしまって・・
一人でここまでスレを消費してしまってすいませんでした。
>>165のリンク先も含め、もっと勉強してきます。
>>163 >cout<<*q が滅茶苦茶、cout<<qはアドレス1と表示されます。
>(qの表示が正常なのは結果だけだと思いますが。)
「q」は「int の値を保持する領域へのポインタ値」と言う値、
「*q」は「qの値が指し示す領域に保持されている値」をそれぞれ取得する。
「delete p」は「p が指し示す領域」が破棄されるのであって、
「p」と言うポインタ値を破棄するものじゃない。
「q=p」では「pと言うポインタ値をqと言うポインタ変数に代入する」と言う動作をしている。
これで少しは理解出来そうか?
>>169 お前が何様だ?
っと、すまん荒らしは無視だったな
Linux環境のUDPを用いたプログラムの際、
受信したバッファをすぐにflushするような関数がありましたら
教えていただけないでしょうか?
172 :
デフォルトの名無しさん:03/12/03 14:09
throw 1;
とか書いたときは、catchで値を取れるんでしょうか。
環境は、HEW、BCBでつ。
173 :
デフォルトの名無しさん:03/12/03 14:13
>>172 とれる。例外は組込型でもヲケ。
ただしそういう使い方はあまり推奨されない。
ありがとう。
コードの取り方が分かりません。
catch(...)
では、取れないですよね。
catch(int i)
177 :
デフォルトの名無しさん:03/12/03 15:04
LPSTR lpStr = "1234";
↑をlong型の変数に突っ込むにはどうしたらいいでしょうか?
LPSTR lpStr="1234";
long b=atoi(lpStr);
ただし、以下のどれかのヘッダーファイルがいる。
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
atoiは引数にアドレス取得。
例えば、こんな使い方がある。
char a[5]="abcd";
int b=atoi(a);
179 :
デフォルトの名無しさん:03/12/03 15:34
float average(int no,G[no][kno]);
で、型名が必要というエラーがでますがどういった意味でしょう??
>>176 ありがとう。確かに戻り値と変わらなそう。だけど、throw出来ないと死にそうで。
コンストラクタ内でエラーがあった時に、
インスタンスを生成させたくない場合、
例外以外にいい方法ってある?
>>183 つーかコンストラクタが起動した時点で、インスタンスは生成されているんだが。
エラーが出るような処理をコンストラクタでするなと。
エラーというか例外ならしょっちゅうあるわな。new new new
>>187 new の失敗や malloc() の失敗などもか?
newはキライ。
int* a;
int* b;
a=new int;
b=new int;
a=b;とかやると、値の代入じゃなくてメモリの共有になる。
こんな簡単なのなら良いけど、クラスのオブジェクトでやろうものならハマル。
避けるにはクラスの宣言で=のオーバロードをoperator使て、意味を作ってやんなきゃなんないし。
間接参照も知らないのか
>>190 それはただ単に、藻前がポインタを理解してないだけだろ。
p〜->は 焼酎 使ってるよ。
a=b のオーバーロードするのは
クラスの宣言云々じゃない気もするね
Tそのものの代入ではなくT*の代入だろ
例えば
class クソNEW
{
クソNEW();//コン
char* bakudan;
~クソNEW();//デ
};
クソnew::クソnew
{
bakudan=new char
}
クソNEW kuso1,kuso2;
kuso1.bakudan="123";
kuso2.bakudan="456";
kuso1=kuso2;とかやると大ハマリ。こんな分かりやすいのは良いけれど・・・。
クソNEW *panzen1,*panzen2;
でも
CPen *oldpen,mypen;
oldpen=pDC->SelctObject(&mypen)
の典型的な例の様に動的でないならポインタの直接代入できるわけで。
>>190 どうして、自分のレベルの低さを必死になって晒しているのだ?
ほんとにクソだな(w
char* bakudan;
bakudan=new char
kuso1.bakudan="123";
何やってるのー? (・∀・)クスクス
いや、言いたいのは
>>195に更に
Yattyadame=pDC->Abunai(bakudan)//bakudanはnewで作ったもの。
とかやった時のポインタ直接代入と参照の複合使ったときにバグるわけで。
bakudanオブジェクトだけ、値の代入じゃなくメモリ共有になっちゃう。
こんなバグ採りしたくないから基本的にnewは避ける。
>>199 だから、おまえが低脳なんだてば。もういいよ、ひっこめ。
自分の考えをうまく文章化できていないか、
あるいは考え方そのものが間違っているか、
どっちにしろ勉強し直せ。
>>199 藻前はホントに1から勉強し直した方がいいぞ。
203 :
getopt:03/12/03 21:55
あのー、ここのスレで良いかわからんのですが、知ってる人教えてくれませんか?
getopt()がVisual C++(V6)になかったのですが、そんなものでしょうか?
最新のVisual C ならあるのかな?
getsockopt?
getopt()がどの言語系に有って、どんな機能か説明したんさい!
ゲラオプス
argvを解析するやつだっけ?
208 :
デフォルトの名無しさん:03/12/03 22:22
データが
0 1 1 1 2 3 4 5 6 7 8 9 10 11 11 12 12 12 12 12 12 13 ...
と並んでいるファイルから0の個数、1の個数...を表示させるプログラムを
作成してます。
データは
0から10000まで並んでいます。ある数字は複数個あります。
C++で作成しているのでC++で動作するプログラムを教えてください。
ファイル名を仮にout.txtとしておきます。
コマンド解析ならPythonに有るな、VCで使いたいなら取り込むか自分で作れよ。
>>203 そんなものです。
VC++ .net にあるかどうかは知りませんが。
GNU getopt でよければ、ソースはよく転がってますので
探してみてください。
>>208 #include <map>
#include <iostream>
#include <fstream>
main()
{
map<int, int> imap;
for(int i=0;i<10000;i++)
{
int d;
cin >> d;
++imap[d];
}
for(map<int, int>::iterator it=imap.begin(); it!=imap.end(); ++it)
cout << it->first << ":" << it->second << "個" << endl;
}
ファイルだった…
#include <map>
#include <iostream>
#include <fstream>
main()
{
map<int, int> imap;
ifstream ifs("out.txt");
for(int i=0;i<10000;i++)
{
int d;
ifs >> d;
++imap[d];
}
for(map<int, int>::iterator it=imap.begin(); it!=imap.end(); ++it)
cout << it->first << ":" << it->second << "個" << endl;
}
213 :
デフォルトの名無しさん:03/12/03 23:00
いきなりですが垂直タブってどういうふうに使うんですか?
調べても分かりません。
マジで気になります、ググってもでてこないし。
\vのことじゃないよね?
217 :
getopt:03/12/03 23:28
>210
ありがとございます。
そのことです。
私も208と同じような問題で悩んでいます。
初心者の私でもコピペで解決できるようなプログラムをお願いします。
220 :
初心者219:03/12/03 23:32
他で208は3件くらい同じ質問をしているようですね。
出力するのはprintfくらいしか知りませんです。
皆さんよろしくお願いします。
(´-`).。oO(出来の悪いがっこの出来の悪い学生が集まって来たな…)
>同じ「ような」問題
を
>コピペで解決
するのは不可能ではないのか(w
コ
ピ
ペ
で か
い
け
つ
そうか・・・
暗号だったのか
コピペ
でかいケツ
つまり大きいお尻のエロ画像を要求しているな?
222さん
そうですね。
私の場合は
キーボードから入力した数字を並びかえてその入力回数を
カウントすることをやろうとしてます。
数字ではない入力を無視するようにもする予定です。
918 :デフォルトの名無しさん :03/12/03 22:15
161辺りでデータをファイルから読み込んで個数を表示させるプログラムは
どのようにしたらいいのでしょうか?
ファイルを仮にout.txtとした場合をお願いします。
データは0から10000まで数字が並んでいてある数字は複数個あります。
例
0 1 1 1 2 3 4 4 5 6 7 8 9 10 11
924 :デフォルトの名無しさん :03/12/03 23:05
なんであちこちでこの問題解いているんだ?
925 :918 :03/12/03 23:06
短時間で解決したいんです。
どうかよろしく。
228 :
デフォルトの名無しさん:03/12/04 00:05
227は問題解けないから揚げ足とっているのか?
解いて実力示しておいたほうがいいんじゃないの?
212やその他をコピペなら笑うな
初心者なら仕方ないけどよ。
おれは勉強中。
人のこといえないが
230 :
デフォルトの名無しさん:03/12/04 00:12
私は文系の人間なのですがプログラミングに興味があるので
今日C言語の入門書を買って来てさっそくやってみたんです。
でも何回やってもコンパイルできないので間違ってるところをどなたか教えてください。
#include <stdio.h>
int main(void)
{
int dat;
int ans;
printf("Input 'dat' ... ");
scanf("%d", &dat);
ans = dat + 2;
printf("dat * 2 = %d\n", ans);
return 0;
}
こんな簡単なとこでつまずいてるようでは止めた方がいいのでしょうか_| ̄|○
printf ("Input \'dat'\'...");
かな?
エラーはきちんと書こう、そうすると答えてくれる人がでてくる
>>231 ありがとうございます。
さっそく試してみます。
エラーは
sample.c:16:2: warning: no newline at end of file
です。次質問する時は忘れないようにしますm(_ _)m
234 :
デフォルトの名無しさん:03/12/04 00:19
WIN32のプログラムを作りたいのですが、何から始めれば良いですか?
Cはある程度全部の範囲を理解していますがC++はわかりません。
235 :
デフォルトの名無しさん:03/12/04 00:20
>>233 それはエラーじゃなくて警告。
最後に改行しておけば出なくなる。
>>235 さっそくやってみましたら成功しました。
ありがとうございました。
>>234 こんな感じだから気を引き締めろよ
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp)
{
if (msg == WM_DESTROY){ PostQuitMessage(0); return 0;}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,PSTR lpCmdLine , int nCmdShow )
{
TCHAR AppName[] = TEXT("ModelApp");
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style= CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc= WndProc;
winc.cbClsExtra= winc.cbWndExtra= 0;
winc.hInstance= hInstance;
winc.hIcon= LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor= LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName= NULL;
winc.lpszClassName= AppName;
if (!RegisterClass(&winc)) return 0;
hwnd = CreateWindow(AppName, TEXT("Model Program") ,WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, (HMENU)NULL,hInstance, NULL);
if (hwnd == NULL) return 0;
while( GetMessage(&msg, NULL, 0, 0) > 0 ) DispatchMessage(&msg);
return msg.wParam;
}
>>234 いやまぁ、BCBみたいなRADを使えば
>>237みたいなのを自分で書く必要はないんだけどね。
ただし、こんどはC++の知識が必要になる。
つうわけで、使用する環境を決めるのが第一歩だな。
それで覚えなあかン事が決まってくる。
Cの道をきわめるならWindowsSDKで
>>237だわな。
>>230 がんがれ。
まともに勉強する意思があって適切な方法で質問すればたいてい誰かが教えてくれる。
240 :
デフォルトの名無しさん:03/12/04 01:16
C++ を C に変換するスイッチを教えてください。
コンパイルには GCC を使っています。
241 :
デフォルトの名無しさん:03/12/04 01:17
>>240 わけわからん。
トランスレータが欲しいのか?
gccがC専用じゃないの?
C++はg++だった希ガス
>>240 何がしたいのか意味わからん。
勘違いしてない? 逆ならあるよ。
遅レスな感想で恐縮だが、このスレに限らず初心者の質問を見ていると
スコープについて全く理解してないものが多い。
最近の入門書じゃきちんと説明してないのだろうか?
>>233 卑しくも文系を自称するならそんな簡単な警告文の意味くらい判るだろ?
初心者宣言する香具師もそうだが、卑下した積りなのかも知らんが
気持ち悪いだけだな。
#まぁ、超初心者のように言葉の意味を間違うよりはましなんだが。
>>242 g++はgccでC++のソースをコンパイルする為に設定を行うFEP、
じゃなかったっけ?
>>244 入門書には書いてないだろうね。
初心者の人が読む本を「入門書」と「初心者用」に分けるとして
入門はmainがあって #include <math.h>あたりまでしか説明しないだろうね。
変数作れる、変数使える、計算できる。
printf で出力 scanf で入力あたりしか説明してくれないんじゃないかな
main()も
void main()
とか、とんでもないサンプルソースを載せているものもあるしな。
249 :
デフォルトの名無しさん:03/12/04 17:49
俺も入門書とかの説明はかなり薄いと思います。
なぜこうなるかって言うのがぬけてると思います。(初心者な俺が言うのもなんですが・・)
で、ちょっと質問なんですが(汗
一文字表示するのにprintfじゃなくてputcharを使う利点は「メモリの節約&処理の軽減」ってことでいいんですかね?
>>249 printf ("%c",c);
って書くのが面倒くさかったからジャン?
putchar (c);
かなり楽だしねぇ
>>249 1万文字ぐらい表示して、処理時間を計ってみれば?
どっちも同じぐらいじゃないの?
結局表示する時間がかかるわけだし
すみません。
以下のようにアルファブレンドのプログラムのつもりで書いたのですが、なぜかbの内容が0になってしまいます。
BYTE* dest;//転送先ピクセル配列へのポインタ
BYTE* src//転送元のピクセル配列へのポインタ
BYTE alpha;//透明度
BYTE t = 255 - t;//
dest[ 0 ] = ( t * b[ 0 ] ) >> 8) + ( alpha * src[0] ) >> 8);
ためしにalphaに200を入れてデバッガ(VC)で( alpha * src[0] ) >> 8)の内容を見ると0ではありませんでした。
なぜ0と0ではない数値を足すと0になってしまうのでしょう?
間違えました。b[0]の部分はdest[0]です。
dest[ 0 ] = ( t * dest[ 0 ] ) >> 8 + alpha * src[0] ) >> 8;
>>255 もちつけ。かっこを間違えてる。それが原因だ。
括弧が揃ってないのはなぜ?
>>256 >>257 すみません。修正したものも間違っていました。本当に申し訳ありません。
正しくは下のコードです。
dest[ 0 ] = ( t * dest[ 0 ] ) >> 8 + ( alpha * src[0] ) >> 8 ;
>>258 こう書け。
dest[ 0 ] = (( t * dest[ 0 ] ) >> 8) + (( alpha * src[0] ) >> 8 );
>>259 あっ、そうか。<<演算子は優先順位が低いから+に結合してしまったんだ。
これがかっこを間違えてるということだったんですね。
どうもありがとうございました。
BYTE同士の乗算でオーバーフローしないかい?
>>261 ちゃんと転送されていました。大丈夫だと思います。
dest[0] + (((src[0] - dest[0]) * alpha) >> 8);
265 :
デフォルトの名無しさん:03/12/04 21:39
newを使った多元配列の確保なんですが
参考書を見るとintの[3][5]の二元配列を確保しようとすると
int (*a)[5] = new int [3][5];
となっています。
int **a = new int [3][5];
じゃなんで駄目なんですか?
型が違うから
前者は「配列の配列」
後者は「ポインタの配列」
int (*a)[5] のaはint5個配列へのポインター
ポインターのポインタ
int **a はポインターのポインタ
板違いじゃないと良いのですが(汗)
私は文系会社員です。
最近趣味でC++をはじめた・・・のは良いのですが
変数の初期化でつまずいてます。
int p[200000][2];
こんな感じで20万くらい増減させる必要のある変数を用意したいのですが
仮に一次元の場合、
int p[200000];
ではなく、
int *p;
p = (p *)malloc(sizeof(int));
if(p ==NULL)
return FALSE;
//最後に
free(p);
タスクマネージャーを見てみたところ、いきなり大きな変数を
用意するより、メモリ使用量は少なめでした。
・・・こんな感じで二次元を扱うにはどうしたら
良いのでしょうか?
int *p[2]はだめだと思いながらやったら撃沈しました。
よろしくお願いします。
>267-268
すまん
272 :
デフォルトの名無しさん:03/12/04 22:22
データ
x y z
0 20 0.50
0 19 0.333
0 19 -0.166
0 29 -0.333
1 9 0.5
1 8 0.333
1 8 0.166
2 9 0.333 続く
というようにx y zが上のように対応しています。xは0からきちんと並んでいます。(99まで)
x が同じでyが同じ場合はその数同士を足し算させます。
さらにxを一定にしてyを並べ替えたいのです。
並べかえると
x y z
0 19 0.167
0 20 0.50
0 29 -0.333
1 8 0.499
1 9 0.5
2 9 0.333
とし
配列a[100][100]、b[100][100]に数字を代入させたいと考えています。
データはfile.txtから読み取ります。配列aはyを格納、bはzを格納します。
a[0][0]=19,a[0][1]=20,a[0][2]=29, ...
0の数が未知数(最大でも100)をするのでa[0][3]からa[0][99]は0とします。
bも同様です。よろしくお願いします。
他のスレ(...17代目)で追加で質問するのが失礼に当たるためこちらに移って参りました。
天才プログラマが集まるこのスレで解決をお願いいたします。
>>269 2次元を1次元にしてもサイズは変わらない
あ、サイズは少ない方が良いと思うのですが。
for文などで
p[i][1];
p[i][2];
のような参照をしたいのです。
差し当たって
int *p;をint (*p)2;で撃沈。
p = (p *)calloc(,2sizeof(int));も撃沈しました(T_T)
すみません。意味が良く分からない日本語でした;;
サイズは少ない方が良いのですが、上記の様な参照を
行えるような初期化がしたいのですm(_ _)m
そんなことより配列で静的に確保しても
mallocで動的に確保してもメモリのサイズは同じのはずですよ
>>269 int (*p)[2];
p = malloc( sizeof(int[20000][2]) );
278 :
デフォルトの名無しさん:03/12/04 23:19
272に愛の手を
>>277 '=' : 'void *' から 'int (*)[2]' に変換することはできません。
と出てきました;;
>>269 ちょっとマテ!
何故,C++なのに,mallocを使うのじゃ?
いえ・・・・いきなり大きく初期化すると
タスクマネージャのメモリの使用量が跳ね上がったので
それでネットでいろいろ検索してたら、
上記の書き方が良いと見つけたもので(汗)
実際メモリ使用量下がったのでOKだと思ってるんですけど
もしかして盛大な勘違いしてたりします?(汗)
>>279 C++だから,型のエラーが出る。
Cなら,出ても警告まで。エラーにはならない。
C++ならnew使え。
int (*p)[2];
p = new int[20000][2];
むちゃくちゃな文法にワラタ
>>281 メモリ使用量が少なく見えるのは,OSが実際に使用されるまで物理メモリを割り当てていないだけ。
>>269 っていうかさ
> p = (p *)malloc(sizeof(int));
これってint1個分のサイズしか確保してないじゃん。
>>281=269
そもそも、
>int p[200000];
と
>p = (p *)malloc(sizeof(int));
は同じメモリ領域を確保していないわけだが。
は・・・
・・・はろ〜わーるど(死)
>>272 >配列a[100][100]、b[100][100]に数字を代入させたいと考えています。
>データはfile.txtから読み取ります。配列aはyを格納、bはzを格納します。
>a[0][0]=19,a[0][1]=20,a[0][2]=29, ...
言っている事が全然分からない・・・
一足遅かった…
_| ̄|○
int[20000][2]で160Kbyteぐらいなら、そのまま確保したらいいよ
typedef int Point[2];
int main(void){
Point *p = (Point *)malloc(sizeof(Point)*200000);
p[2][1] = 1;
return 0;
}
>>272 設計が駄目。y や z にゼロがあったらどうする?
やり直し。
皆さんのおかげで、お花畑が見えました。
昔飼ってた猫のガクラン姿を久々に見られました。
ありがとうございました。
>>272 1.ファイル容量を調べその容量分メモリを確保
2.確保したメモリに全ファイル内容を読み込む
3.strtok()でトークン分割していき、各行の先頭ポインタを別配列に記憶
4.3の配列をqsort()で x と y の数値の昇順でソート
後は、ソートされた配列を元に一行ずつ処理していけば逝けそうかと。
# ファイルサイズが極端に大きい場合はお薦め出来ないが…
>>272 >x が同じでyが同じ場合はその数同士を足し算させます。
こっちの方がもっと意味不明。
何を足し算させるんだ?
>昔飼ってた猫のガクラン姿を久々に見られました。
なめんなよ?
>>295 >何を足し算させるんだ?
データ2行目:0 19 0.333
データ3行目:0 19 -0.166
足し算の結果:0 19 0.167
だろ?
>>272 >0の数が未知数(最大でも100)をするので
「未知数をする」って何?
なんだか知らない人にも、おはようって言えそうな気分ですが
これ、とくにfreeでメモリ開放しなくても
問題なさそうですけど、大丈夫でしょうか?
>>272 を見る限り、配列a[100][100]、b[100][100]とするのは無駄な気がするのはオレだけか?
301 :
デフォルトの名無しさん:03/12/05 00:12
292さん
yやzには絶対0はこないようになっています。
297さん
297さんのおっしゃる通りです。x,yが同じところのzの値を足し算します。
xを一定にしてyを小さい方から並び替えます。
その後配列に代入していきます。
よろしくお願いします。
302 :
デフォルトの名無しさん:03/12/05 00:17
>>300さん
272です。
xが0から99まで増加することを考え行の方を100確保してます。
xが一定の時にyの個数が最大100個あることを仮定しているので列のほうも
100確保しています。
よろしく。
303 :
デフォルトの名無しさん:03/12/05 00:20
>>298さん
272です。
をするので→なので
よろしく。
>>272 こんなんじゃ駄目か?
# 以下、長いので分割する
#include <stdio.h>
typedef struct
{
double z;
char enable;
} StructXY;
int main( void )
{
/* ***** 内部変数定義 ***** */
FILE *fp;
StructXY data[101][101] = { 0 };
int x,y;
double z;
int i,j;
char buf[1024] = { '\0' };
>>305続き
fp = fopen( "file.txt", "r" );
if( fp!=NULL )
{
do /* ファイル終端までループ */
{
fgets( buf, sizeof(buf), fp );
sscanf( buf, "%d %d %lf", &x, &y, &z );
data[x][y].enable = 1;
data[x][y].z += z;
} while( !feof(fp) );
fclose( fp );
}
for( x=0; x<101; x++ )
{
for( y=0; y<101; y++ )
{
if( data[x][y].enable )
{
printf( "%d %d %f\n", x, y, data[x][y].z );
}
}
}
return 0;
}
>>274 はなぜ突然プログラミングに興味を持ったのだろう?
・・・結構いい歳みたいだが(w
う・・・また良く分からなくなってきました。<必要なのかいらないのか
とりあえずあって弊害は多分・・今のところなさそうなので
書いておきます。
そんなわけで寝ますが、みなさんどうもありがとうございましたm(_ _)m
>>301 >xを一定にしてyを小さい方から並び替えます。
普通は並べ替えるなんていう、かったるいことはしない。
typedef struct {int x, y;double z;} Data;
typedef double Tbl[100][100];
void f(Data *d,int n,Tbl t){for(;n--;d++) t[d->x][d->y]+=d->z;}
Data data[7]={
{0, 20, 0.50,}, {0, 19, 0.333,}, {0, 19, -0.166,},
{0, 29, -0.333,}, {1, 9, 0.5,}, {1, 8, 0.333,}, {1, 8, 0.166,},};
int main(void){Tbl t={0};f(data,7,t);return 0;}
311 :
デフォルトの名無しさん:03/12/05 00:51
>>300さん
貴重な回答ありがとうございました。
当方で確認をとったところエラーもなく動作しました。
312 :
デフォルトの名無しさん:03/12/05 00:53
>>311 エラーチェックはちゃんと付け加えておけよ。
314 :
デフォルトの名無しさん:03/12/05 01:04
質問があります。
fpos_t pos1,pos2;
を定義して、ファイルの位置を呼び込み格納します。
そこで
if(pos1 == pos2) と言うようにファイルの中でさしている位置が同じかどうかという
比較をした所、Unix,Windows,Macなどではエラーなくコンパイルできましたが、VineLinux
ではコンパイルエラーとなってしまいます。
Linux上で同じような演算(pos1==pos2)をしたいのですがいい解決法はないでしょうか?
>>314 たぶん構造体で定義されている環境なんだろうな。
memcmp()辺りを使ったらどうよ?
同じファイルに大して開いているという前提で
long ftell(FILE* fp)
はファイルストリームのオフセットをバイト数で返すから
fgetpos()の代わりにこの関数を試してみたらどうだろう?
317 :
デフォルトの名無しさん:03/12/05 01:16
>>300,305,306さん
配列の方はどうすればよいかも表示お願いします。
今気づきました。
つーかfpos_tって実体はlong型って聞いてたけど
構造体で定義されてたりなんかするの?
>>318 64bitにして巨大ファイルに対応しているとか。
それだとlongが32bitなら構造体にしないといけない。
>>314 つーか細かい情報が全くない上に
実際にどういう状況に依存してるかわからないから
正確な解答が返される望みは少ない。
(ソースさらせばテストしてくれる奴が出るかもしれんが)
まさかと思うがfgetposで取得した値がエラー値だったりはしないよな?
とりあえず該当部分のソースと実行結果を最低限書いてくれ。
そういえば fpos_t 同士を比較させる汎用的な方法ってないな・・・
構造体を memcmp して違うデータだとわかっても
それが必ずしも違う位置を指しているという根拠はないし。
位置を比較するつもりなら、素直に ftell を使えば?
使ってるのはgccだよな。
うろ覚えだがどっかで(2.95)あたりでfpos_tの実体が変更されていた気がする。
原因はたぶんこれじゃないかな。
解決方法はすまんが調べてくれ。俺は寝るんで……適当でスマソ
ファイルサイズが2GB以内ならftell()ってことでいいんでないかい?
324 :
デフォルトの名無しさん:03/12/05 01:40
317もよろしく
>>272 マルチ必死だな。
宿題スレ荒らしただけじゃ気がすまないってか?
327 :
デフォルトの名無しさん:03/12/05 01:52
皆さんレスポンスありがとうございまず。
今手もとにLinuxがないのですがftell()を使ってソースを書き直そうと思います。
皆さんありがとうございました。m(__)m
328 :
デフォルトの名無しさん:03/12/05 02:21
doubleへのポインタを引数にとって、ポインタを介して配列をいじる
int hoge (double *unko)
という関数があるんですが、これにvector<double>をいじらせたいんですが、
どうすればよろしいでしょうか?
stringならc_str()でポインタを返してくれますけど、
vectorだとbegin()でもポインタに変換してくれないようなのですが。
std::vector<double> moge;
hoge(&moge[0]);
うは、それでした...。気付かんかった。あほだ...
ありがとうございました!
>>330 一応注意だが、読み出すんでなくいじる場合
vectorの整合性を崩しちゃいかんぞ。
並び替えや置き換えならOKだが
size()以上の要素の追加や削除はNG
stringのc_str()はもっと問題
size()以上の追加って馬から落馬する文だ。
ただcapacity以内での追加ならOKと勝手に思わないように
強調したかったわけで……
>>331 深夜にありがとうございます。
了解しました。
>>329の形でmogeを受けとって、
各要素の中身をいじるだけ(要素の追加や削除はしない)
ならhogeから戻ったときにはmogeはまたvectorとして
機能してくれる、ということですね。
>>317 普通に配列に入れてるだろ。
っていうか、
>>272のデータ構造は訳和下欄。
その上、無駄すぎ。
設計から見直せ。
335 :
デフォルトの名無しさん:03/12/05 11:55
Cでwindowsコマンドのnetstatなどを使うにはどうしたらいいですか?
336 :
デフォルトの名無しさん:03/12/05 12:02
>>335 CreateProcess
実行結果が欲しいなら+CreatePipe
ありがとうございます
#define HOGEHOGE 10
とマクロを宣言したソース中で、数箇所だけ"HOGEHOGE"という文字列を使いたいのですが
何か方法はありませんか。
#include <iostream.h>
#define HOGEHOGE 10
int main()
{
cout << "HOGEHOGE = " << HOGEHOGE << endl;
return 0;
}
>>339 #define CodeStr(s) #s
>>339 C++なら
#defineを使うのではなく
const int HOGEHOGE = 10;
と宣言することをお勧めする。
343 :
デフォルトの名無しさん:03/12/08 07:33
配列を動的に確保するときは
int* p;
p=new int[3];
とするけど、これって多重配列では出来ないですか?
int* p;
p=new int[2][2];
みたいな感じで。(これだとダメなんだけど)
多重配列を動的に確保するのはどうしたらいいですかね
一次元配列を確保してx_size * y + xつー感じでアクセスする。
>>344 それが正論だね
>>343 一応載せと
int** p = new int*[2];
for(int i=0; i<2; ++i) p[i] = new int[2];
for(int i=0; i<2; ++i) delete[] p[i];
delete[] p;
vector<vector<int> > v(2);
for(int i=0; i<2; ++i) v.push_back(vector<int>(2));
間違えたこっちね
for(int i=0; i<2; ++i) v[i]=vector<int>(2);
STLport使いたくてコンパイルしようと思っていたのですが、
..\\stlport\ctime(25) : fatal error C1083: include ファイルを開けません。'../include/ctime': No such file or directory
とでて一向にコンパイルできません…なにか足りないのでしょうか?
環境はVC7.1です。
すいません自己解決しました。
vsvars32.batはプロンプト開くたびに一々起動しないといけないのですね。
マンドクセーならシステムかユーザの環境変数として登録しとけ
C++で、マルチプラットフォームな”これぞ定番”といえるソケットライブラリ
があれば、紹介してくれませんか?
ACEじゃないか。
>>351 ありがとうございます。ですが、URI間違っているようです。
>>352 ACEですか。もうちょっと小さなライブラリは無いものでしょうか。
354 :
デフォルトの名無しさん:03/12/09 09:54
MinGW使い始めました。_CRTIMPって何?
355 :
デフォルトの名無しさん:03/12/09 09:54
すいません、基本的なことだと思うのですが教えてください。
new で確保したメモリのポインタをキャストして
delete に渡すというのは普通にしてもよいのでしょうか?
例えばこんな感じです。
// WINAPI VC++6.0
::GetPrinter( hPrn, 2, NULL, 0, &dwNeeded );
PRINTER_INFO_2 *pPi2 = (PRINTER_INFO_2*)( new BYTE [ dwNeeded ] );
delete [] pPi; // delete [] (LPBYTE)pPi ?
コンパイル・実行してもエラーはでないので動いてはいるようですが
ちょっと気になりましたもので・・・
delete は型で開放するメモリ量を判断してるわけではなくて
new で確保したときにどこかに覚えていてくれてるんでしょうか。
>>355 #include <iostream>
using namespace std;
class ClassA
{
public:
ClassA() { cout << "ClassA Constractor" << endl; }
~ClassA() { cout << "ClassA Destractor" << endl; }
};
class ClassB
{
public:
ClassB() { cout << "ClassB Constractor" << endl; }
~ClassB() { cout << "ClassB Destractor" << endl; }
};
main()
{
ClassA *a = new ClassA();
delete (ClassB *)a;
}
>>356 実行した結果、
ClassA Constractor
ClassB Destractor
と出力されました。
ということは、やはり delete は new されたときの型に
戻してやらないと駄目なのですね。
ありがとうございました。
おいおい。その挙動あってんの。
>>357 デストラクタにはvirtualをつけましょう。
355の例はBYTE型(の配列)だがな
んー、よくわからなくなってきた。
今回の PRINTER_INFO_2 のようにsizeof でわからないものは
どうやって確保するのがよいのでしょう?
以前は HeapAlloc / HeapFree で確保していたのですが
確保したメモリを超えてアクセスしてしまっても普通にコンパイル・実行できて、
しばらく気づかなかったということがありまして
デバッグ機能が有効な new / delete に変更したらこのありさまです…
こういうときって C++ でも malloc で確保するのが正解なんでしょうか?
malloc()でもnew/deleteでも好きなように。
でもnewした結果のポインタをキャストしてdelete呼んだら駄目。
デストラクタのない型なら実害はないだろうが、
malloc/freeの方が良いような気がする
今までのを自分なりにをまとめてみて、
「new で確保したメモリのポインタをキャストすると
delete したときにメモリの解放は正しく行われるが、
デストラクタが(あるなら)正しく呼ばれない。
だからデストラクタがないものならキャストしたまま delete してもまあ実害はない。
(気持ちは悪いが…)」
ってことなのかなと思ったのですが、
google で new delete malloc free をキーワードに検索したら
どうやら結果は未定義ってことみたいですね。
>>355 に書いたものが問題なく動いてたのは
VC++6.0 が、たまたま動くコードを吐いてくれてただけのようです。
レスをくださった方々、ありがとうございました。
大変勉強になりました。
>>362 >以前は HeapAlloc / HeapFree で確保していたのですが
>確保したメモリを超えてアクセスしてしまっても普通にコンパイル・実行できて、
>しばらく気づかなかったということがありまして
確保する方法以前の問題だな。
勉強し直せ。
string型に格納されてる文字列から数値を得るのは、C++ でも atof を使うんでしょうか?
double f; string str = "123.45";
f = atof(str.c_str());
みたいに。それとも C++ らしい別な方法があるんでしょうか?
strstreamは「時代遅れ」みたいに聞いたので、上の方法しかとりあえず思いつかないです。
さらに言うと、上だともしstrに非数字の文字があった時でもf=0となるだけです。
そのエラーチェックをするには、一文字ずつ isdigit なりで調べればよいのでしょうが、
これだとなんだか C っぽくて、ええんかいなと思ってしまいます。
どなたか、こういうケースにおけるC++流の料理方法を御教授頂けないでしょうか?
>>361 完全に読み違えてた。継承関係もなかったのか…
>>367 エラーチェックもしたいなら、
C ライクに strtod() で変換かければいいのでは?
>362
>今回の PRINTER_INFO_2 のようにsizeof でわからないものは
>どうやって確保するのがよいのでしょう?
別にmalloc/freeでもいいが、
C++ではoperator new()/operator delete()を使う方が一般的。
>>367 strstreamが時代遅れってのはstd::stringstreamに取って代わられたからだ。
まぁ、諸条件考えるとstd::stringstreamも結構使いづらいが。
>>367 strstreamは時代遅れだが、stringstreamは現役。
#include <sstream>
std::istringstream str("123.45");
str >> f;
if(str.fail()) {/* error! */}
class A {};
A *p = (A *)::operator new(sizeof(A) + 必要なサイズ);
::operator delete(p);
operator deleteではなく、delete演算子を使いたいなら
placement newを使ってコンストラクタを呼んでおく
みなさま、迅速なるお返事ありがとうございます!
>>369 こういうのがあるとは気づきませんでした。これでも良いのですが、
C++流に染まってみることにします
>>371,372
なるほど、strstreamはC流文字列をストリームにするものなんですね。
さしあたりstringstreamで闘うことにしますが、手持ちの書籍には記述がなかった。。。。
当方gccで、まあきっとmanやinfoだとかがあるでしょうから、ちょっくら探しに行ってきます
376 :
デフォルトの名無しさん:03/12/10 01:25
問:1000未満の正の整数をランダムに100個生成し、それらを配列aryに代入する。
aryの中身を選択ソートにより小さい順に並べ替えて表示しなさい。
#include <stdio.h>
#include <stdlib.h>
#define N 100
void sort(int ary[], int);
int main()
{
int n, ary[N], minpos, min, pos, tmp;
for(n = 0; n < N; n++) ary[n] = rand()%1000;
sort(ary, N);
for(n = 0; n < N; n++) printf("ary[%d] = %d\n", n, ary[n]);
}
void sort(int ary[], int size)
{
int pos, min_pos = 0, min = ary[0];
for (pos = 0; pos < size; pos++)
if (ary[pos] < min) {
min_pos = pos;
min = ary[pos];
}
ary[min_pos] = ary[0];
ary[0] = min;
sort(ary+1, size-1);
}
コンパイルは通るのですが、実行しようとするとエラーになってしまいます。
どこか変なとこありますでしょうか・・・?
変なとこあったら指摘お願いします。
>>376 それでは再帰が終わらないね。
if(size==2)
return;
else
sort(ary+1, size-1);
>>377 ありがとうございます!!
単純ミスか・・・_| ̄|○
size_t とsize_typeってどう違うの?
vectorの成分を直接参照する時はsize_type型で指定すると
本には書いてあるのだが、stringのようにはいかない…
size_tならうまくいくのですが。
>>379 何がどう上手くいかないのか書かないと答えようがない。
恐らく vector<any_type>::size_type と書いていないのではないかと思うが。
376じゃないけど
>>377の
if(size==2)
return;
else
sort(ary+1, size-1);
ってどういう意味?
STLの初歩について聞きたく存じます。
valarray<double> v(100);
なvがあった時、このデータの実体はdouble型の配列なのでしょうか?
やりたいことは、このデータをdouble型配列を処理する関数でいじることです。
double a[100]; func(a);
っていうfuncに、func(v.c_array()) ?? みたいにしてvを食わせたいのです。
例えばstringだと、str.c_str() でC型文字列へのポインタが得られますよね。
これとの類似?でvalarrayにもデータ実体へのポインタを得るメンバがあったら
嬉しいな、などと思いました。改めて配列作って代入はちょいと淋しいので・・・
良い方法御存知の方おられますでしょうか?
書き忘れました。ちょこっと試してみたら
valarray<double> v(100);
double* d;
d = &v[0];
っていう方法でもいけそうなんですが、確証がないので使うのが不安なんです。
// それともこれが解なんでしょうか?
>>367 boost::lexical_cast
で、文字->数値、数値->文字変換が簡単にできる。
boost:::format あたりも使えるかも・・・。
>>383 vectorの内部構造は配列である事が保証されているので
それでいいと思う。
valarrayってvectorと同じ内部構造なのか?
STLの初歩なんて書くから、valarrayをvectorと見間違えるじゃないか。
誘導されてきました。
VC++6.0SP5のIDEで質問なんですが、
なんかいつのまにか依存関係がそのソースのみになってしまいます。
ようはそのソースファイルに依存するヘッダが変更されてもリコンパイルされません。
リビルドが長くてつらいです。
グーグルさんに聞いてみたらフォルダ構成がまずいとか
まずいファイル名があるとあかんとか、少しだけ情報があったのですが、
いつのまにか直ったみたいな結論で、どこがまずいのかわかりませんでした。
*.depファイルにはそれっぽい出力があるんですが・・・
すいませんがご存知の方がいらっしゃったら解決策を教えてください
お願いします。
>>385,386,387
先生方、お返事ありがとうございました。
おっしゃる通り、valarrayって厳密にはSTLじゃないんですね・・・
すみませんでした、以後気をつけます
そこで続きなのですが、valarrayの場合の内部構造も配列となっているのでしょうか?
御存知の方、何卒御教授をば
_Ty& operator[](size_t _I)
{return (_Ptr[_I]); }
_Ty *_Ptr;
だから配列でしょ。
特定の実装の話をしてどうする
ふむ。そうか。すまんかった。
GlobalFree(Buf);
と
if (Buf != NULL) GlobalFree(Buf);
とは、
どう違いがあるんだ?無いよな。
>>389 おとなしくイテレータを使うのがよいのでは?
boostのuBlasとかBlitz++tとか使ってみるのはいかがでしょう?
>>393 MSDNには
>If the hgblMem parameter is NULL, GlobalFree fails and the system generates an access violation exception.
と書いてある。
>>388 .pch (プリコンパイルヘッダ )もとりあえず消しとけ。
ヘッダファイルの書き方・作法・お約束などが記述されている文書などありますか?
手持ちの書籍にはとりあえず何も書いてないので、ひとつ指針をビシっと学びたいです。
書籍、Web上文書など種類は問わないので、何か御存知な偉い方、在処を教えて下され
>>397 はじめてのC++には
含めてはいけないもの
・関数定義
・変数定義
・メンバー関数の本体の定義
含めるもの
・変数のextern宣言
・関数のextern宣言
・インライン関数の宣言
・class宣言
等の機械語に変換されない宣言
と書いてあった
関数のプロトタイプ宣言だろ……externはまったく付ける意味がない。
class宣言というのも変。
classの定義(インラインでないメンバ関数は宣言のみ記す)はヘッダに含める。
static変数のメンバ関数の初期化やメンバ関数の定義は含めてはいけない。
それと、構造体の定義、列挙子やマクロもヘッダに置く。
ただしテンプレートを使う場合は、
グローバル関数もメンバ関数も定義をヘッダに置いてやらないと
たいていのコンパイラはきちんと処理してくれない。
あと含める含めないとは違うがusing宣言/指令はヘッダに置かないこと。
とりあえずこんなとこか。
あとよろしく。
……というかヘッダファイルを複数のソースファイルで
includeしてみると何が駄目かの判定は付くから試してみ。
ああクラスの宣言が変ってのは文脈上あきらかに定義の間違いだろうってことで
クラスの宣言というか前方参照宣言なるものはある。
とはいえそれを使うのはヘッダの書き方を覚えた先でいいだろう。
>>399 >static変数のメンバ関数の初期化やメンバ関数の定義は含めてはいけない。
編集ミスだな。正しくは「(クラスの)static変数の初期化や〜」
例外として、これが整数型の場合のみクラスの定義の中で初期化できる。
#include <stdio.h>
char g_str[32]="That is Great !!";
double val_1=125.23;
double val_2=75.291;
void hyozi1(void);
int main(void)
{
hyozi1();
return 0 ;
}
//////////////////
void hyozi1(void)
{
printf("%s\n"g_str);
printf("%d\n"val_1+val_2);
}
たったコレだけのプログラムなのに、コンパイルすると
エラー E2121 t1-1.c 14: 関数呼び出しに ) がない(関数 hyozi1 )
エラー E2121 t1-1.c 15: 関数呼び出しに ) がない(関数 hyozi1 )
と出てしまいます。何故か解る方いらっしゃいますか?
ちなみに//より上のは予め用意されてたソースです。
(早い話が、後半を考えろというものでした)
,
あ!そうか!
すみません、ありがとうございました。
凡ミスだったのか…_| ̄|O
っちゅーか、2行目はvalは宣言がdouble型だから
printf("%f\n",val_1+val_2);
だぞ。
printf("%.3f\n",val_1+val_2);
の方がいいか?
もう一つ指摘。
doubleの表示には%dでなく%fを使わないと期待通りの表示はでない。
というか課題なら次からは宿題スレへ
>>396 ご指摘感謝
でも.pchはつかってないんです。
もうプロジェクト作り直すの疲れました。
あたますっきりさせてからまたひとつづつ足してテストしてみます。
つかsnsysのプラグインが腐ってるのかも・・・
依存関係の解釈ってVCの中でmakefile構成してそれを実行してるんですかね?
なかでどうやってるかわからないから推測すら出来ないです・・・
409 :
デフォルトの名無しさん:03/12/12 16:03
教えてください。
なぜ、str1の末尾の文字のアドレスを取得するのに -1 をしなければいかんの?
int main(void)
{
char str1[] = "We are C fun to use.";
char str2[80], *p1, *p2;
/* pが文字列1の末尾を指すようにする */
p1 = str1 + strlen(str1) - 1; /* ここがわからん・・? なぜに -1 しないといけないんでしょうか? */
p2 = str2;
while(p1 >= str1)
*p2++ = *p1--;
*p2 = '\0';
printf("%s\n%s\n", str1, str2);
getche();
return 0;
}
str1+0は1文字目のアドレス
str1+1は2文字目のアドレス
str1+2は3文字目のアドレス
…
末尾の文字のアドレスは何になると思いまちゅか?
411 :
デフォルトの名無しさん:03/12/12 16:14
1つ目の文字はstr[0]でしょ。
412 :
デフォルトの名無しさん:03/12/12 16:35
>410
末尾のアドレスは '\0' ・・・でいいの?
str1 + strlen(str1) が指しているのも '\0' ・・・?
だから -1 して '.' を指すようにするってことでいいのかな?
>>412 紙と鉛筆使って図を書いたり計算してみればわかるじゃん
Cで文字列操作するのめんどいな・・・。
perlでやったほうがよくね〜・・・。
C++なら格段に楽だぞ。boost突っ込んであれば余計に。
まぁ、Perlが使用できるならそれもありだと思うが。TPO次第。
C++をつかえばモウマンタイ。
おれさぁ〜、プログラムはPerlから入ったのね。
で、最近Cをやり始めて、入門本見ながら四苦八苦しているとこなんだけど
なんつーかなぁ〜、いちいちデータ型を意識してやるのは、めんどくて、めんどくて・・・・・。
C++ってCあんま解ってなくても、すんなりはいれるの?
perlでも最後の文字を取り出すのに
substr('We are C fun to use.', -1, 1);
なんで-1なんですか〜?とか言いそうだが、
コイツの場合。
substr('We are Perl fun to use.', -1, 1);
だったら言い出すかも・・・
俺の場合。
420 :
デフォルトの名無しさん:03/12/12 18:11
C++で vector を引数として関数に参照渡ししたいのですが、どのようにすればいいのでしょうか?
423 :
デフォルトの名無しさん:03/12/12 18:23
>>422 普通にというのは、intなどの変数の場合と同様にすればよいということですか?
421も423もレスアンカーが一つずつずれていてワラタ
>>420 const std::vector<hoge>& func( const std::vector<hoge>& arg_ ){
//...hoge hoge huga huga...
return arg_;
}
427 :
デフォルトの名無しさん:03/12/12 18:34
今までCでコンソールアプリケーション、PerlでCGIとか組んでいた者です。
Windowsでアプリケーションが作りたくて最近VC++を買ったんですが、
高品質なWindowsアプリケーションが作れるようになることを目標にするなら、
SDK→C++→MFCって流れで勉強していった方が良いのでしょうか?
428 :
デフォルトの名無しさん:03/12/12 18:35
429 :
デフォルトの名無しさん:03/12/12 18:40
>>421,426
vector<int> vec;
と宣言して、実引数では &vec 、仮引数には *vec と通常どおり書いたのですが、
コンパイルエラーをはいてしまいます。
この書き方では無いのでしょうか?
関数宣言部と呼び出し部を晒せ、埒があかん
431 :
デフォルトの名無しさん:03/12/12 18:43
>>429 C++で参照といったらアドレス渡しじゃなくて
>>425のことだろ。
(なんでこいつ425を無視しているんだろう)
>>427 運がいいね。SDK→C++は究極の選択肢だよ。それでGO!
MFCは前2つをクリアすればおまけで使えるようになるから。
>>428
関数宣言部ぅ〜
434 :
デフォルトの名無しさん:03/12/12 18:50
>>425,429
C++を始めたばかりなので、
>>425で書かれていることがよくわからないです。
アドレス渡しではできないのでしょうか?
435 :
デフォルトの名無しさん:03/12/12 18:52
>>430 関数宣言部は、
int kansuu(vector<int> *vec)
呼出し部は、
vector<int> vec
kansuu(&vec)
のような感じです。
>>434 入門書のC++の参照とポインタに関するところを音読100回してこい。
ははあ。まだ型について理解が浅いと見える
438 :
デフォルトの名無しさん:03/12/12 18:56
>>435 それでできるが。
関数内での扱いが間違っているんじゃないの?
エラーの内容書きなさいよ。
440 :
デフォルトの名無しさん:03/12/12 19:04
PerlでCで吐いた結果を扱うことはできたのですが、
逆も可能っすか?
441 :
デフォルトの名無しさん:03/12/12 19:06
>>439 以下のようなエラーが出ます。
example_vector.cc: In function 'void kansuu(vector<int,allocator<int> > *)':
example_vector.cc:6: request for member 'size' in 'vec', which is of non-aggregate type
'vector<int,allocator<int> > *'
example_vector.cc:7: no match for '*vector<int,allocator<int> > &'
442 :
デフォルトの名無しさん:03/12/12 19:07
>>440 言っている意味がわからない。というか曖昧。
もし、環境がUNIXかつPerlが標準出力に書き出したものをCのプログラムから使いたいならpopenを使う。
443 :
デフォルトの名無しさん:03/12/12 19:09
>>441 vec->size()
こう書いている?
444 :
デフォルトの名無しさん:03/12/12 19:19
>443
vec.size() と書いてました。vec->size()に書き直したところ、エラーが次のように変わりました。
example_vector.cc: In function 'void kansuu(vector<int,allocator<int> > *)':
example_vector.cc:6: invalid type argument of 'unary *'
example_vector.cc:7: no match for '*vector<int,allocator<int> > &'
関数内で *vector[i] = 0 のように vector に値を代入している部分でエラーをはいているみたいです。
この記述方法はおかしいでしょうか?
445 :
デフォルトの名無しさん:03/12/12 19:22
>>444 演算子の優先順位表をみなおせ
(*vec)[i]
それ以前にvectorじゃなくてvecでは・・・
447 :
デフォルトの名無しさん:03/12/12 19:29
>>445 無事にエラーが無くなりました。
やっぱり関数内での記述が間違っていました。
皆さん、ありがとうございました。
448 :
デフォルトの名無しさん:03/12/12 19:30
>>446 プログラム中では vec と書いてました。
こちらに書くときに間違ってました。
449 :
デフォルトの名無しさん:03/12/12 19:32
最近 C++ を始めたのですが、おすすめの参考書を教えてもらえないでしょうか?
>>394 遅レスですみません。
私の場合、最終的にFORTRANで書かれたLAPACKという
ライブラリに配列を渡す必要があるのですよ。なのでデータ
は連続した領域に並んでいてほしいのです。
boost、Blitz++ともに非常に出来がよさそうで使ってみたいの
ですが、やはり信頼性と速度からLAPACKになってしまいます。
// いずれこれらがスタンダードとなるのでしょうかねぇ?
452 :
デフォルトの名無しさん:03/12/12 21:00
これから勉強を始めようと思い立ち、Microsoft Visual C++ 6なるソフトも買いました。
そこで、お勧めなエディタを教えてください。
453 :
デフォルトの名無しさん:03/12/12 21:02
emacs
どうやっていまさらVC++6.0を買ったのには興味があるが。
付属のIDEつかっとけ。
P2P市場にはまだ出回っているよ。
'`,、('∀`) '`,、
>>450 vector意外はほぼ連続してないと思ったほうがいいのでは?
ずっと同じコンパイラとSTL使うなら、検証して連続しているなら使ってみるのも手かもしれないけど・・・。
vectorですら、連続してないのがあるとかいう噂もあったような、感違いのような・・・。
(C#だっけ?c++じゃないからどうでもいいのか?)
プログラムを始めようとして独習Cという本を買ってきて
インストールなどをしていたんですが何度やってもMS-DOSという
のが反応しなくて色々やっていたら、間違って
Autoexec.batというファイルを消してしまったのですが
これはもうプログラミングはできないのでしょうか
ネタか?
また新しくAutoexec.batってファイル作ればいいだろ。
中身はただのテキストだぞ
質問させてください。
配列にa〜zを読み込んで、ひとつずつある16進数(鍵)とのXORをとり、それをファイルに出力して、
同じプログラムに先ほどだしたファイルを読み込ませてまた鍵とのXORをとり元に戻そうと思うのですが、
なぜかhとrだけうまく出力されません。
具体的には、最初のXORでは正常に出力されるのですが、元に戻そうとするときにhとr以降の部分が全く
出力されなくなってしまうのです。
紙に書いて考えましたけど限界っす。
プログラムは
int x;
char input[100] = {NULL};
char output[100] = {NULL};
gets(input);
for( x=0 ; input[x]!=NULL ; x++)
{
output[x] = input[x] ^ KEY;
printf("%c",output[x]);
}
ってな感じで組みました。どこかまずいところがあれば教えてください。
どーせまたバイナリモードでオープンしてないってオチだろ
リダイレクトで入出力してるんですが、バイナリモードでオープンするとはどういうことでしょうか。
ほっといてやれよ
えぇぇまじっすか・・・リダイレクトでできるはずなのに・・・
このプログラムそのものがおかしいのかな。
ありがとうございました。
ちょっとお聞きしたいのですが
C++でqsort関数を使ってstring型の配列をソートしたいのですが
比較関数はどう書くのが一般的なのでしょうか?
>>465 >えぇぇまじっすか・・・リダイレクトでできるはずなのに・・・
アフォ。初心者が人に教えを乞うのにそういう考え方をするな。
オマエがアフォで考え違いをしていたからダメだったんだ。
「嗚呼、我為錯誤哉」とすなおに過ちを認めろ。
でないと何時までたっても初心者から脱却できないぞ。
>>466 C++でstring型をソートするならすなおにSTL使え。
C言語でCPU使用率の最大を決めれますか?
>>468 ちょっとだけアドバイス。
ソートは文字コード順でいいなら配列の内容をsetに突っ込めばそれでヲケ。
ソート結果を配列として扱いたいならvectorに突っ込んでsortアルゴリズムを使う。
文字コード以外のソートをしたいならその基準をファンクタとして定義して以下同様。
>>467 ちょっと言葉が足りなかったですけど、
リダイレクトでやれという指示の元なのですよ。
じゃあsetmode(fileno(stdout),O_BINARY)でもしてみな
NULLと'\0'の区別はつけような。
>>471 そうか。それなら仕方がないな。
言い過ぎた。スマン、謝るよ。
>>459 いやネタじゃなくて素でした。
有難うございます。
あせって学校から同じファイルをフロッピーに
写すとかバカなことやってましたw
テキストの中身は何も書かなくて良いのでしょうか?
消す前に何か書いてあったような…
質問ばかりですいませんがよろしければお願いします。
>>459 いやネタじゃなくて素でした。
有難うございます。
あせって学校から同じファイルをフロッピーに
写すとかバカなことやってましたw
テキストの中身は何も書かなくて良いのでしょうか?
消す前に何か書いてあったような…
質問ばかりですいませんがよろしければお願いします。
>>459 いやネタじゃなくて素でした。
有難うございます。
あせって学校から同じファイルをフロッピーに
写すとかバカなことやってましたw
テキストの中身は何も書かなくて良いのでしょうか?
消す前に何か書いてあったような…
質問ばかりですいませんがよろしければお願いします。
ネタ決定。
>>459 いやネタじゃなくて素でした。
有難うございます。
あせって学校から同じファイルをフロッピーに
写すとかバカなことやってましたw
テキストの中身は何も書かなくて良いのでしょうか?
消す前に何か書いてあったような…
質問ばかりですいませんがよろしければお願いします。
>>459 いやネタじゃなくて素でした。
有難うございます。
あせって学校から同じファイルをフロッピーに
写すとかバカなことやってましたw
テキストの中身は何も書かなくて良いのでしょうか?
消す前に何か書いてあったような…
質問ばかりですいませんがよろしければお願いします。
よそでやってくれ
すいません。
何度も…
break;
485 :
デフォルトの名無しさん:03/12/14 16:14
#include <iostream>
using namespace std;
int main()
{
cout<<"はろーわーるど"<<endl;
}
//っていうのを作ったんだけど、何と言うかWindowでみるにはどうしたらよいの?
//DOS窓じゃなくて。
487 :
デフォルトの名無しさん:03/12/14 16:43
#include <iostream.h>
int main(void)
{
cout<<"はろーわーるど"<<endl;
return 0;
}
//わからなかったぜ
>>486。だけどありがとう。親切がうれしいぜ。
//で次の質問。なんで
>>485とこれは同じなんですか?
何度もごめん。
環境はBCCとCPadでつ。
あと、WinXPpro
>>485 #include <iostream>
#include <string.h>
#include <windows.h>
class Msgbox_streambuf : public std::streambuf
{
protected:
virtual int overflow(int c = EOF) {
const size_t strbufsize = epptr() - pbase();
char *buf = new char[strbufsize + 2];
memcpy(buf, epptr(), strbufsize);
if(c != EOF) {
buf[strbufsize] = c;
buf[strbufsize+1] = 0;
}
else
buf[strbufsize] = 0;
MessageBox(0, buf, buf, MB_OK);
delete buf;
return c;
}
};
int main() {
Msgbox_streambuf strbuf;
char buf[128];
strbuf.pubsetbuf(buf, 128);
std::ostream ost(&strbuf);
ost << "hello, world" << std::endl;
}
バッファリングがうまくいかねぇ。
>>489 ありがとです。みんなやさしいなぁ。
コピペすると
protected:の下が
virtual int overflow(int c = EOF) {
この がずらずら出ちゃうので手で打ってみます。
暫くお待ち下さい。
#include <windows.h>
#include <string>
#include <sstream>
class msgboxstream : public std::ostringstream
{
std::string title_;
public:
msgboxstream(const std::string& title = std::string()):title_(title){}
~msgboxstream()
{
MessageBox(NULL, str().c_str(), title_.c_str(), MB_OK);
}
};
int main()
{
{
msgboxstream mb("test");
mb << "Hello, world.";
}
return 0;
}
とかどうよ。
&#160;の繰り返し出てないなぁ。何でだろ?
>>489さん打ってきましたよ。
ブラクラを作らされたのかなと思いました;
すごいですね。ちっちゃいウィンドウで一文字づつOK押していくヤツですよね?
何はともあれ、C++でつくったプログラムがウィンドウで見られると言うことがわかったので
もう少し勉強してみます。
#include <windows.h>がぁゃしぃ…
>>491さん
有難うございます。
そうそう、こういうのなんですよ。
やっぱり #include<windows.h> が臭いですね。
ところで今C++はじめて2日目なんですが「ハローワールド」の次に
あなたは何歳ですか?
「入力」
そうですか。わたしは2歳のマシンです。
って言うのを勉強しているところなんですが、
>>489さんとか
>>491さんのプログラムを書けるぐらいになるには、
どのぐらいかかりますでしょうか?
>>494 どのくらいかかるとか無意味な質問してないで勉強に励め。
個人差があることぐらい分かるだろ。
一生かかってもかけない奴もいれば、1年しないうちに書けるようになる奴もいる。
時間を浪費してないで、早く
>>489や
>>491みたいなプログラムが書けるようにがんがれ。
496 :
デフォルトの名無しさん:03/12/14 17:33
>>495さん
OK
あなたのナイスなアドバイスが私の心を突き動かしました。
臭いところをついてみます。(´・ω・`)
497 :
デフォルトの名無しさん:03/12/14 20:51
すいません、Tコンポーネントの名前、例えば「Edit1」を変数を組み合わせた形で表現するのに、
以下のような書き方をみつけました。
int Number = 1;
((TEdit *)FindComponent(AnsiString("Edit")+Number)) -> Text = "ほにゃらら";
でもこれってちょっと長いというか、もうちょっと短い書き方があれば教えて頂けないでしょうか。
よろしくお願いします。
>>497 マクロ使え
#define TNumEdit(Number) ((TEdit *)FindComponent(AnsiString("Edit")+Number))
TNumEdit(1)->Text = "もにゃらら";
499 :
デフォルトの名無しさん:03/12/14 22:14
質問です。
forでループを回してTStringListの項目の中身が存在する時にだけ処理を実行したいんで
こんな感じで書いてみたんですがエラーが出てしまいます。
for( int i=0; i<=10; i++ ){
if (Slist->Strings[i]){ //ここでエラー 「不正な構造体の演算」
//処理
}
}
代わりに
if (Slist->Strings[i] != NULL){
という書き方に変えてみたんですが、項目が入ってない状態の時でも全部処理が実行されてしまいます。
こういう時ってどういう風に書けばいいんでしょうか?
>>498 ありがとうございます。
マクロって便利ですね。簡易関数みたいなもんですか。
マクロについて勉強してみます。
>>499 if ( Slist->Strings[i].IsEmpty() == false )
質問するときは環境を書くべし。
ここはBCB専用のスレでないんで、BCBなんか知らんシトもたくさん見ている。
質問させてください。
まだ、C++を勉強し始めて2ヶ月くらいなのですが
StackやVectorなどのSTL Templateとはいったい
どのようなものなのかいまいち理解できません。
色々とWebサイトもみましたがまず文法が
理解できません。std::vector<char>みたいな感じで
どこも書いてあるので・・。
こういうの見たの初めてです。どなたか簡単にでいいので
解説してくれないでしょうか?
2ヶ月くらいで音をあげるな
>>502 C++のテンプレートという機能を使って作られた標準ライブラリ
506 :
デフォルトの名無しさん:03/12/15 21:01
インラインメンバ関数についてお聞きします。
ヘッダーファイルではなく、cppファイルに、つまり
inline void Foo::Boo(void){
}
のような方法を用いたインライン関数にしたいのですが、
外部シンボルが未解決とエラーが出てしまいます。
inlineを外すか、その関数を使用しなければエラーは出ません。
関数内を空にしてもエラーが出ます。
解決策がございましたら教えていただけないでしょうか。
そもそも使い方が間違っているということでありましたら、
なぜこの方法で使用できないかを教えていただけないでしょうか。
Fooクラス内でのBooの宣言と、Booを実際に呼び出しているところの
コードも見たいでつ
それから、2つめのvoidはいらないでつ
/* main.cpp */
#include "Foo.h"
main(void){
Foo f;
f.Boo();
}
/* Foo.h */
class Foo{
public:
void Boo(void);
};
/* Foo.cpp */
#include "Foo.h"
inline void Foo::Boo(void){}
inline関数はマクロ展開とほとんど同じなので、
呼び出される前に定義されなければならないからだと思う。
ヘッダーで宣言だけすればいいというわけではないんですね…
ヘッダファイルでinline宣言してないからじゃないのだろうか?
512 :
デフォルトの名無しさん:03/12/16 01:39
void(cosnt char *str1, const char *str2)
{
string str3;
・
・
・
}
上のような関数上で、string型のstr3にstr1,str2を連結して格納したいんですが、
str3=str1+str2では出来ませんでした。
どうやればいいんでしょうか
513 :
デフォルトの名無しさん:03/12/16 01:41
>>512 str3=str1;
str3+=str2;
str1+str2ではポインタ同士の加算になってエラー。
514 :
デフォルトの名無しさん:03/12/16 01:46
string str3 = string(str1) + str2;
とかもあるが。
つーか、引数のほうを
void hoge(const std::string& str1, const std;:string& str2);
にしておけばstd::string渡してもchar*渡しても通るわけだが。
string str3(str1);
str3 += str2;
の方がコンストラクタの呼び出しが少ない。
>>501 遅くなりました。ありがとうございます。
TStringListってBCB独自のコンポーネントだったんですね。
気をつけます。BCB6です。
で、早速お答え通りやってみました。
for( int i=0; i<=10; i++ ){
if (Slist->Strings[i].IsEmpty() == false){
//処理
}
}
しかし、例えば項目が4つしか存在しなかった場合5つ目を if (Slist->Strings[i].IsEmpty() == false){
で調べようとした瞬間に「リストのインデックスが範囲を超えています(5)」といったエラーが出ます。
つまりリストを超える(項目の存在しない)インデクス値を確認することは無理っぽいですね。
存在しなければしないで別の処理を行いたかったのですが、もう一度他の方法を考える必要が
ありそうです。
ありがとうございます。
>>517 をいをい、んな無茶なことを考えてたのか(w
そら範囲外を参照したらアカンよ。
TStringList->Countで範囲が取得できる。
つか、藻前もうちょい基本の勉強しろ。ヘルプをちゃんと読め。
519 :
デフォルトの名無しさん:03/12/16 03:07
本当に素で質問include(インクルード?
読み方が分からん。
イマイチ頭に入りづらい・・・
C言語の読み仮名書いてるサイト教えてください
左辺値は一時的でないオブジェクトの事らしいんですが良く意味が分かりません。
左辺値の意味についてどなたか説明して頂けませんか?
521 :
デフォルトの名無しさん:03/12/16 03:15
522 :
デフォルトの名無しさん:03/12/16 03:18
マジでありがとう助かった
素で馬鹿な質問を真面目に答えてくれてありがとう
525 :
デフォルトの名無しさん:03/12/16 03:25
>>524 変数は代表的なものだけど、それだけじゃない。
pはポインタ、aは配列名として、*p,*(p+3),a[1],*aなども左辺値になりうる。
>>525 なるほど。二つ目の*(p+3)以外は使った事があります。
それらの左辺値と呼ばれる物の性質や特徴とはどういったものなのでしょうか?
さらに質問なのですが、今私が読んでいる本に、
「constでない参照パラメータは左辺値でなければなりません。つまり、それは一時的なオブジェクトでは無いという事です。」
このように書かれているのですが、良く意味が分かりません。
一時的では無いという事は持続的なオブジェクトと言う事でしょうか?
constでない参照パラメータは持続的なオブジェクト?
527 :
デフォルトの名無しさん:03/12/16 03:55
>>526 分かりにくい説明だね(^_^;)
そこでいう一時的なオブジェクトとは、定数や四則及び論理演算の結果のことかなぁ。
あと配列名(文字列定数を含む)も左辺値にはならない。
>>526 平たく言うと、右辺値=代入する側。左辺値=代入される側。
右辺値は一時的なオブジェクトでもかまわない。代入が終われば用なしだから。
左辺値が一時的だと、せっかく代入してもすぐに消えてしまって意味がない。
後半の質問についてはそのとおり。
constでない参照は代入される可能性が前提になっている。
だから一時的なオブジェクトでは困るということ。
>>528,527
なるほど。納得出来ました。
ありがとうございました。
コンパイルについて質問なのですが、
例えば
a+=1;
a+=1;
a+=1;
と、
a+=3;
が、コンパイルすると全く同じ物になったりするのでしょうか?
他にも、標準の関数には色々な機能が付いていて、
その関数の一部の機能のみを使って一部の機能は使わないと言う事がありますが、
必要な使いたい機能のみの関数と、必要でない(使っていない)機能を持った関数とが
コンパイル後は同じになったりするのでしょうか?
こんな便利な事はしてくれないのかな・・・。
>>511 付けてみてもダメでした(;´ρ`) …
>>530 ありえないな。
なぜなら、コンパイラベンダはそんなクソなコード書く奴のことを想定してないから。
まともなコードに対しては、さまざまな最適化の努力をしていると思うよ。
534 :
デフォルトの名無しさん:03/12/16 12:19
535 :
デフォルトの名無しさん:03/12/17 03:08
すいません、TMemoの中に入った複数の行、例えば
古池や
かわず飛び込む
水の音
というのを、
古池や<br>かわずとびこむ<br>水の音
のような形で一行にしたいと思い、次のように書きました。
AnsiString Memo1Text=StringReplace( Memo1->Text, "\\r\\n", "<br>", TReplaceFlags() << rfReplaceAll);
あるいは
AnsiString Memo1Text=StringReplace( Memo1->Text, "\\n", "<br>", TReplaceFlags() << rfReplaceAll);
しかし両方ともダメ。改行を認識してないらしく、置換が行われません。
これを実現するにはLinesの総行数をまず取得して、
ループでLinesを合体させる間に「\n」を挟んでいく、
という方法くらいしか思いつかないんですが、
他にもっと簡単な方法があれば教えていただけないでしょうか。
よろしくお願いします
BCB6でWin2kです。
536 :
デフォルトの名無しさん:03/12/17 03:24
>>535 元の文字列を「古池や\r\nかわず飛び込む\r\n水の音」にしてみて。
>>535 エスケープしてどうすんだよ。
×"\\r\\n"
○"\r\n"
しかし、最近、自分が頓珍漢なことをしているくせに開発環境の所為にするヤツが目につくな。
初心者は、うまくいかないと思ったら「自分がどこか間違っているのでは?」とまず疑えよ。
マジな話、そうでないと何時までたっても初心者から脱却できないぞ。
539 :
デフォルトの名無しさん:03/12/17 04:05
C++で、ファイルをオープンして1行ずつ読み込むのは、
string str;
ifstream if(hoge);
if >> str;
でできますが、1文ずつ読み込むためにはどうしたらいいんでしょうか?
>>539 char c;
ifstream istr(hoge);
istr >> c;
541 :
デフォルトの名無しさん:03/12/17 04:15
>>540さん
レスありがとうございます。
それだと1文じゃなくて1文字になっちゃわないでしょうか?
>>541 すまん。読みちがえた。
で、1文ってどういう意味? なんで区切るの?
>>542 テキストから1文ずつ読み込んでその内容を判断するコードを書かなければならないんです。
1行ずつ読み込んでもいいんですが、判断自体は1文単位で行わないとだめなんで。
string str;
ifstream if(hoge);
if >> str;
これで1行ずつ読み込んで、"。"の位置を探せばなんとかなりそうな気もしますが、
その判断の方法が思い浮かびません。
>>543 1文=句点"。"で区切られた文字列
ってことかな?
質問するときはこういうところを初めから明確にしてくれ。
そうすりゃ、読みちがえなくてすむ(苦笑
しかし、こら一遍読込んでから探すしかないわ。
stringに読込んだらfindつかえばいいだけ。
そういうときはgetline関数を使えばいい。
グローバルでもストリームのメンバ関数にもある。
最後の引数にデリミタを指定できる。
たとえば、
std::string str;
std::getline(std::cin,str,".");
でピリオドごとに得られる。
ああ”。”は2バイト文字だからロケールあわせないと駄目かな。
皆さん親切にありがとうございます。
なんとかやってみます。
一応注意しとくが
"。"がワイド文字だってことはわかってるよな。
もし1バイトの文字を要素としているstd::stringから
このワイド文字を検索するときは
"。"は長さ2の文字列扱いとしてfindに渡してやらないと駄目だぞ。
うーんこれでいいんでしょうか・・・。
警告:複数文字からなる文字定数
という警告が出るんですが、一応コンパイル通りました。
ifstream i_f(hoge);
char ch[xxxx];
while( !i_f.eof()){
i_f.getline(ch, xxxx-1, '。');
.
.
.
}
一応想定通りに動くみたいですが・・・。
できればchar型配列でなくstringに格納したかった。
>>548 w_charを使ってない限り、全角「。」は文字じゃ無くて文字列。→"。"
よってgetlineは不可。今はたまたま動いてるように見えるだけ。
_| ̄|○ キョウハ モウ ネヨウカナ・・・・
隊長質問です。C++でポインタ渡しと参照渡し(乃至はポインタ返しと参照返し)
とで速度の差はあるんでしょうか?
注意を聞かない奴だな……。
#include <iostream>
#include <locale>
using namespace std;
int main() {
wchar_t del;
wchar_t word[50];
wcin.unsetf(ios::skipws); //デフォルトの空白文字を飛ばさない
wcin >> del; //指定されたデリミタを受け取る
wcin.ignore(); //2byte目を捨てる
while( wcin.getline( word, sizeof(word), del ) ) {
wcin.ignore(); //同
wcout << word << "<>";
}
}
-input-
。
古池や 蛙飛び込む 水の音。などなど。
適当に書いてくれ
------
を読み込んでみ。
ファイルの先頭の文字でデリミタを渡してるのに注意。
ちなみにあらかじめstringに読み込んでstring::find("。")する場合も
2byte目があることを認識しておくようにな
単に帰ってきたpositionに+1しても"。"の2byte目に当たるだけで
次の文の先頭は出ない。
あー、やべえ複数の処理ごっちゃにしてる
上のコードは忘れてくれ。
>>551 殆ど同じじゃないかなぁ。
最適化の仕方によってはわずかに変わるかも知らんけど。
>>551 実装しだい。
だが、俺はいくつかのコンパイラで、全く同じコードを吐くことを確認している。
まあ、当然だろうな。
URLエスケープをする方法を教えてください。
>>554 >>555 隊長御指導ありがとうございました。
そうだろうなとは思いつつも確信が得られなかったもので。。。。
これですっきりしましたです
>>556 逆質問
> for(;;){
これ、どういう挙動になるんだ?
for(;1;)ならわかるんだけど。
素直に
while(1){
と書くべきじゃない?
>>556 まず、fpphotoに2回ファイルが割り当てられて、2回closeされている。
第二に、
>for (j = 0; rowsize*h/rowsize/SELL_SIZE< rowsize*(h+1)/rowsize/SELL_SIZE; j++)
>for (k = 0; columnsize*i/columnsize/SELL_SIZE < columnsize*(i+1)/columnsize/SELL_SIZE; k++)
これらのループは終了しない。
>>559 それは勉強不足。
for(;;)はかなり一般的な書き方だ。
>>561 へぇ〜、へぇ〜、へぇ〜、トリッキーと一般的は紙一重ってことか。
(いやみじゃなく、素直な「へぇー」です。)
でも、少なくとも教科書的ではないよね。
で、どういう挙動するのか詳しく教えてくれない?
むげんるーぷ。
トリッキーだと感じるのは、あまりソースを読んだことがないからじゃないかと。
別段、珍しい書き方じゃないんだから。
つーか、while (1) だと警告が出るし、
ansiでは for (;;) を推奨していたと思ったが。
私ゃ while (1) って書く奴は勉強不足だと思ってるが今までに外れたことないよ。
勉強不足は認めますし、他人のソースを読む量も全然少ないのだと思います。
が、トリッキーだと感じるのはそうではなくて、
forって;と;の間、つまり2番目の式の値が真のとき、forに続くブロックが実行される
と理解していたのだが、その肝心の式が空分というのが妙。
空文は真という規定なのか、for文のみの特別な書式なのか、そのあたりを踏まえて教えて欲しいのですが。
>>566 ありゃりゃ、推奨だったんですか。
ワーニング対策も、なるほどです。
569 :
デフォルトの名無しさん:03/12/17 19:03
テトリスを作りたいのですが、現在ブロックを落としていくところでとまっています。
アラームシグナルを自分に500m秒ごとに送り、送られるたびにブロックを落としていこうと思っているのですが、
シグナルをalarmで送ろうとすると1秒単位でしか送れず、
落としていくところでもsignalでシグナルのハンドラを変えてもメイン関数の変数を渡せないため困っています。
また、できればグローバル変数は使用したくありません。
どなたかよい方法を教えていただけないでしょうか?
環境はVineLinux2.6r3です。
文がないんだから評価なんてない、真か偽かなんて話じゃない
空の場合には終了しない、それが何故かと言うなら仕様だから
>>560 レスありがとうございます。もう一度見直して見ます。
解消したらw報告に上がります。
templateについて質問です。
//a.h
template<class T>
T add(T a, T b){return a+b;}
//main.cpp
#include "a.h"
int main()
{
add(1,2);
return 0;
}
VCなら普通にコンパイルできるのですがGCCではどのようにコンパイルすれば
いいのでしょうか、、。
main.o(.text+0x8): undefined reference to `int add<int>(int, int)'
毎回このエラーがでます、。
>>571 勉強になりますた。dクス
Cについては結構自信あったんだけど、
まだ俺の知らないことってあるのかなぁ。
K&R第2版はやっぱ読むべきですかね?
while(1)で引っかかるのは警告じゃなくてどっかの腐れlintだろ。
すいません、、自己解決しました。
どうもmakeのコンパイルし忘れかなんかだったみたいです。
お恥ずかしい、、、
>>570 レスありがとうございます。
リンク先を見てみましたが、ソースが複雑すぎて理解できませんでした。
もう少し勉強してから挑戦してみることにします。
vc++で文字列を扱う場合、とにかく全部string型で平気なんですか?
それともプロの人は全部char型で書くんでしょうか?
>>581 大人の事情でcharのみって言う事はあるけど、
大抵の人は使えるときはstd::stringを使いたくなります。
583 :
デフォルトの名無しさん:03/12/18 03:25
どなたか助けてください。
ウィンドウハンドルで指定したウィンドウのクライアント領域の
キャプチャをしたいのですが、うまくいきません。
ビットマップを取得して、対象のウィンドウがアクティブの時はできました。
隠れてる部分があるときやタスクバーに入っているときにも
ビットマップが取れる方法はあるのでしょうか?
どなたかよろしくおねがいします。
584 :
デフォルトの名無しさん:03/12/18 03:47
VC++とDirectXで3Dチャットみたいなものを作ろうと思ってるド素人なんですが、
文字入力とか漢字変換とかその辺の部分をどうやって作ればいいのか分かりません。
(予め用意した文字列を表示する、とかならできるんですが。)
検索してみたもののめぼしい情報を発見できないので、
参考になる書籍やサイトなどもありましたら教えて頂けると助かります。
3D表示の方とかはいろんなサイト回って
サンプルコピペしまくって何とかできてきたのですが、
ネットワーク部分も勉強しないといけないし、道のりは遠いな。。。
>>583 WM_PRINT
対象ウィンドウがこれに対応していなければ無理だと思う
>>581 ありがd じゃぁ気兼ねなくstringでコーディングしますです
>>585 他のウィンドウのキャプチャの話じゃないの?
>>587 WM_PAINTと勘違いしてない?
WM_PRINTをSendすると指定したDCに描いてくれる。
>>583 「表示されている」画面を取り込むからキャプチャだろ?
表示されていないものをキャプチャする、と言う事自体が間違いでは?
>>588 なるほど。
WM_PAINTと読んでしまっていた…。スマソ。
OSをシャットダウンするプログラムってかける?
c++でstd::stringの文字列にint型の数値を文字列として代入したい時,
定石としてはどのような方法があるのでしょうか?
MFCのFormatに相当する関数は無いようなのですが.
#include <string>
#include <sstream>
std::ostringstream str;
str << 65;
std::string result = str.str();
>>594 おかげ様で,うまく出来ました.
なんとお礼を申し上げたら良いのか,本当に有難うございました.
リモートで、電源をオンにするプログラムってかける?
Wake up on LAN
>>591 ms-help://MS.PSDK.1033/sysinfo/base/shutting_down.htm
>>598 それはどういう意味?
どうすれば、それ見れるの?
600 :
デフォルトの名無しさん:03/12/18 17:55
583です。みなさまありがとうございます。
まずはやってみます。
>>569 selectかpoll使え。
お前、UNIXならmanぐらい引けよ。
602 :
デフォルトの名無しさん:03/12/18 22:07
#include<stdio.h>
main()
{
int *a;
int d;
a=&d;
printf("%e%d\n",a);
}
これやったらdのアドレスが表示されるんですよね?
603 :
デフォルトの名無しさん:03/12/18 22:15
Cmachineってもう手に入る方法はないの?
605 :
デフォルトの名無しさん:03/12/18 22:47
printf("%p\n",a);
607 :
デフォルトの名無しさん:03/12/18 23:02
文字列を入力して照準に並び買えて表示するプログラムを作ってみたんですけどこれの何処がおかしいんでしょうか?
DACと入れたらACDと出るようにしたいです
#include<stdio.h>
main()
{
int moji[10],a=0,b,w;
scanf("%s",moji[0]);
for(a=0;moji[a]!=NULL;a++){
for(b=1+a;moji[b]!=NULL;b++){
if(moji[a]>moji[a])
w=moji[a];
moji[a]=moji[b];
moji[b]=w;
}
}
}
for(a=0;moji[a]!='\0';a++){
for(b=1+a;moji[b]!='\0';b++){
0.c 6: \ のあたりに構文上の誤りがある
0.c 6: 警告: 値を使っていない式がある
0.c 6: ) のあたりに構文上の誤りがある
0.c 6: ) のあたりに構文上の誤りがある
0.c 7: \ のあたりに構文上の誤りがある
0.c 7: 警告: 値を使っていない式がある
0.c 7: ) のあたりに構文上の誤りがある
0.c 7: ) のあたりに構文上の誤りがある
といわれました・・・
まずここがおかしいぞ。
int moji[10];
scanf("%s",moji[0]);
このままじゃint型を引数に渡してる。
%sにはchar*を渡さないと駄目。
char moji[10];
scanf("%s",moji);
これはコンパイル時にチェックされないからよっぽど問題。
そこを直したけど動かない・・・
Cpad for LSI C-86を使ってるんですが
そろそろ1から正しいソースを作って出そうとしている奴の数→
というか「動かない」じゃなくてエラーメッセージ書きなよ。
それとも実行時エラーなの?
lld @link.iって出るからコンパイルは成功ですよね
実行するときに abcd と入力すると
G:\DOCUME~1\HIRO\MYDOCU~1\C>0
abcd
-- Press any key to exit (Input "c" to continue) --
でるだけなんです・・・
>if(moji[a]>moji[a]) //ここの変数のところとか
> w=moji[a]; //ifの範囲がぁゃιぃな。
>moji[a]=moji[b];
>moji[b]=w;
だいたい最後に出力コードが無い。
615 :
デフォルトの名無しさん:03/12/18 23:50
linuxでマルチスレッドで動作させたいプログラムなんですが
pthread_cond_wait()で複数のスレッドを待機させといて
pthread_cond_broadcast()で一斉に起動させたいのですが、
複数のスレッドがちゃんと全部waitに入ったという確認はできないのでしょうか?
for文について質問したいんですけど
int a,b=1;
for(a=0;(a+b)!=5;a++)
のように (a+b)!=5 のような書き方をしてもいいんでしょうか?
617 :
デフォルトの名無しさん:03/12/19 00:17
>>616 void g()
{
int a, b=1;
for (a=0 ; (a+b) != 5 ; a++);
cout << a << " " << b << "\n\n";
}
(結果)
4 1
Press any key to continue
問題ないんじゃない?
要するに条件文が true の間だけ回転するわけだから。
最終的に真偽値を返せば関数呼び出しも演算もOK。
ただ副作用がある場合は注意がいる
619 :
デフォルトの名無しさん:03/12/19 00:23
C++を一通りやって、stroustrup C++3版で復習中なんですけど
6.2.1 のサンプルで質問。
int *p = &++x; // ok。*p にはインクリメントされたxが代入される。
int *q = &(x++); // エラー: x++は左辺値(xに格納されている値)ではない。
この2つで前者が問題なく、後者でエラーが起こる理由が
分からないのですが、どうしてなんでしょう?
++xが左辺値でx++が左辺値ではないという理由がわからない。
後者は
x++;
int *q = &x;
とすれば正常に通るのですが。
>>619 >*p にはインクリメントされたxが代入される。
「p は xのアドレスで初期化される」という表現が正しいですね。
>>619 インクリメント演算子は前置と後置で戻値が違うというのはおさえている?
その違いを理解していれば納得できるはず。
622 :
デフォルトの名無しさん:03/12/19 00:45
すいません、BCB使っててイベントを複数のコンポーネントで使い回す方法が
わからないので質問させてください
。
例えばTMemoのOnChangeイベントに
void __fastcall TForm1::ComboBox1Change(TObject *Sender){
Memo1->Color=clYellow; //変更があったなら自分の色を変えろ
};
みたいなことを書いたとして、10個くらいのTMemoに(Memo1〜Memo10)に同じ
イベントを使い回ししたいんですよね。いちいち10個もイベント作るのメンドーだから。
で問題は「Memo1」の部分をどう扱えばいいのかというものでして。
(このイベントを呼んだTMemo)->Color=clYellow;
みたいな形にするにはどういうふうに書いたらいいんでしょうか?
よろしくお願いします。
>>622 dynamic_cast<TMemo*>(Sender)->Color=clYellow;
キャストは別にTMemo*に限定する必要はない。
Colorプロパティを持つTControl属なら
dynamic_cast<TControl*>(Sender)->Color
で全部イベントハンドラを共有できる。
↑書き落とした。酔っぱらってるとダメだわ(w
いちおー、if ( dynamic_cast<TMemo*>(Sender) ) { }
でくくるのが正しいやり方。ま、自分でしか使わないコードなら省略しても支障ないだろうけど。
>>623 >>624 ありがとうございます!
Senderをつかうんだろうなというのはわかったんですが、
どう使えばいいのかイマイチわかりませんでした。
なのでわかってよかったです。
もうちょっと自分でもコードの意味を勉強してみます。
すいません、なぜオラだけ放置されてるのかだけでも教えてください。
悲しいので。
いろいろあるが簡潔に答えよう。
自称初心者がここで2言3言聞いたくらいで
いきなり大きなことができるようになると思っている時点で
見限られているのだよ。
自分のレベルにあった課題設定をしてから
もう一度来てみたら?
ついでに書籍探しはスレ違い。
629 :
デフォルトの名無しさん:03/12/19 05:09
setjmp&longjmpの効果的な使い方を教えてください。
>>628 あの、できることを一個ずつ順当にやっているつもりなんですが、
文字入力って結構大変な事なんでしょうか、、、
ちなみに3DのほうはDirectXを扱うのは初めてなんでてこずりましたが
以前WinAPIの自前処理でやってたことがあるので理論自体はある程度理解しているつもりです。
じゃあ次は何をやろうと思ったときに、文字入力かなと思うんですが、
なんかそんな大それた事を言ってますでしょうか。。。
まぁ、質問掲示板で「どうして私の質問にはレスがつかないんですか?」
ってごねるやつはたいていDQNだから相手にしたくない罠。
マジレスしとくと、大雑把過ぎる質問には答えようがない。
「自分で勉強しろ&調べろ&勝手にしろ」以上の回答はない。
これ以上この話題を引っ張るつもりはないからね。あなたも引き際を心得なさい。
>>631 物凄く当たり前に誰でも分かるような質問をしてしまったのか
それとも場違いな質問をしたのか、とか
それすら分らないもんで聞いてみた訳なんです。
もしくは到底素人の手に負えないような高度な事をやろうとしているのか、、とか。
あと質問内容は大雑把ですかね?
日本語入力&かな変換についてなんですが、
まさか漢字の変換候補のデータベース作ったりとか
ワープロ作るみたいな事はしないですよね。。。
なんとかキーワードだけでも教えて頂きたいです。
>これ以上この話題を引っ張るつもりはないからね。
そうですか、残念です。
他の方に教えていただける事を期待します。
独自の漢字変換システムを持たせないとダメなの??
>>632 とりあえず簡単に思いついたもんだと、
windowsのエディタコントロールウインドウ(だっけ?文字入力するやつ)を作成し、
入力する部分に貼り付け、表示したあと、カーソル移動させ、
リターン?押されるまで入力し、押されたら文字読み取って
その後、そのウインドウを破棄なり、隠すなりすればいいのでは?
うまくいくのかどうか知らんが・・・。
ちなみにネットワークは難しいぞ・・・。
自分でわからないの?
今の問題に対して知識がないのかが。質問者としての適切さがないか。
おおざっぱじゃない質問ってのは
「どういうものを作ろうとしてそれをどういう方法で実装しようとしていて
どこまでどう書いたけどこういう期待と違った結果になってしまいます」
というものを言うのだよ。
>>634くらいは(悪気はないぞ634)頭にできてた?
そうじゃなきゃものすごく詳細多岐に渡って答えないといけなくなるわけ。
参考書籍はスレ違いだと言っているな。
これで最後。
そうかどうかも自分で判断できないのならまず悪い方だって思っとけ。
逆に考えるよりは人をいらだたせん。粘着してくるのは一番駄目。
どうでもいいよ、良くそんな長文書く暇があるな。
>>584に関しては
「まずは仕様を考えろ」
の一言で十分。
>>633>>634 ありがとうございます。
特に独自なシステムでなくてもいいです。
MFCとか使ってダイアログベースのソフトのような作り方をしている場合は
おっしゃるようなテキストフィールドみたいのを配置して
そこにフォーカスすれば勝手に文字入力待機状態になったりすると思うんですが、
今は自分でウィンドウを一から作るような作り方をしてます。
普通の単発のキー入力はgetkeyとかいろいろな関数で
状態を受け取る事はできますが、漢字変換とかはどうすりゃいいのだろう、、と
ここで全く思考停止してしまいます。
その辺のAPIというか関数群みたいなものがあるんでしょうか。。。
とりあえず自前のウィンドウに、
Winアプリに良く見られるテキストフィールドみたいなのを
配置する方法を探ってみます。
>>635 なんかよくわかりませんが、実装する方法すら分からず躓いてます。
最初の取っ掛かりがわかれば調べていく事はできそうですが。
エディットボックスウインドウをSDKで利用する話なのか。
エディットボックス相当のものを自分で実装する話なのか。
>>638 ImmCreateContext
ImmSetCompositionString
ImmGetCandidateList
ImmDestroyContext
ひとつ躓くところがあると思うが、それくらいは自分で調べれ
>>639 SDKで手製のチャットウィンドウを作りたいと思ってるんですが、、
>>640 ありがとうございます。
IMEというものを使えばいいんですね!
この辺を勉強していけばかなりいろいろと自由な形で実装することができそうです。
ゆくゆくは自分のデザインしたウィンドウで入力、表示をしたいと
考えていたので、希望が見えてきました。
>>641 ありがとうございます。なんとなく二つの方法が見えてきました。
一つは貼って頂いたリンク先の内容のように、
ウィンドウズが用意してくれるテキストフィールドみたいなものを配置して
そこに入力された文字を取得する方法。
もう一つはIMEを使ってもっと根本的というか低レベルな部分から操作し
入力とか変換候補とか受け取って、自分で実装する方法。
超とんちんかんな事を言っている予感もしますが、
何とかなりそうな気はしてきました。
>>642 まあ、そう外れたことは言ってないと思うからがんばれ
たしか標準コントロールを使う方法はなんか落とし穴があったような。
FlipToGDISurfaceだっけ?そんなのをやらないとだめとか。
最近は平気なのかもしれないけど
>>IMEというものを使えばいいんですね!
ネタとしか思えんのだが。
ネタじゃないんですが、なんか変な事言いましたか。
ちなみに正確にはIMEを制御するAPI群、と言いたかったのですが、
おかしいでしょうか。
具体的になぜネタだと思ったのかお聞きしたいんですが。
関係ないが、IMEと言うよりFEPと言う方がしっくりくる。
# 厳密には同じものじゃないが…
頑張ればそう聞こえなくもない。
>>644 とりあえず素人相手にテメェが偉くなったと勘違いしてる粘着池沼は震度け。
じゃあな。
>>631 こっちがへりくだるのは当然として、答える奴が威張る事はねぇんだよ。
相対的に上になったからといってテメェが偉くなったと錯覚してんじゃねぇよ。
「〜なさい」じゃねーよ勘違い野郎。
ツマラン! お前の煽りはツマラン!!
>>652 >>こっちがへりくだるのは当然として
君はその当然の事も出来ていないじゃない。
勘違い野郎に教えてもらう気も礼儀をわきまえる気もねぇもん。
勘違い野郎に教えてやる気も礼儀をわきまえる気もねぇもん。
おめーに聞いてねぇよ池沼。
いいかげんにやめれ。
つか、お前ら本人ちゃうやろ。
最初から3Dチャットなんて風呂敷広げる前にやることはいくらでもあるってこったね。
偽者の584が言うことは至極まともだ
662 :
デフォルトの名無しさん:03/12/20 18:15
すいません、BCB6で簡易Webブラウザ(TPageControlを使ったタブブラウザ)を作ってるんですが、あまりに初心者だと感じるのでこちらで質問します。
まずエラー発生にいたる動作をなんとか確定しましたのでそちらから。
1)アプリを立ち上げる
2)CppWebBrowser内のリンク先を新規タブ(タブ2)で開く
3)タブに2入ってるCppWebBrowser内のどこかをマウスでクリックする。
(つまりタブ2のCppWebBrowserをアクティブの状態にする?)
4)タブ2を閉じる
5)元のタブのどこかをマウスでクリックする。
6)エラーが閉じても閉じても無限に出てくる
アドレス000003B8で000003B8に対する読み込み違反がおきました。
以下はニューウィンドウ作成が呼びだされた時に新規タブを作成し、中にCppWebBrowserを埋め込むコードです。
多分変なことをやってると思うので、添削していただけると幸いです。
int G_CppWB_num; //動的に生成したCppWebBrowserにユニークな名前をつけるため (エラー対策)
void __fastcall TForm1::CppWebBrowser1NewWindow2(TObject *Sender,
LPDISPATCH *ppDisp, VARIANT_BOOL *Cancel){
G_CppWB_num++;
TTabSheet *TabSheet = new TTabSheet( this );
TabSheet->PageControl = PageControl1;
PageControl1->ActivePage = TabSheet;
TCppWebBrowser *CppWebBrowser = new TCppWebBrowser(this);
CppWebBrowser->Align=alClient;
CppWebBrowser->OnNewWindow2 = CppWebBrowser1NewWindow2;
CppWebBrowser->TComponent::Name="CppWebBrowser"+G_CppWB_num;
CppWebBrowser->TOleControl::Parent = TabSheet;
*ppDisp = CppWebBrowser->Application;}
いちおうタブを削除するコード。PageControlのOnMouseDown()です。
int DelIndex = PageControl1->ActivePageIndex;
TTabSheet *TabSheet = PageControl1->Pages[DelIndex];
delete TabSheet;
あとめんどくさい方はBCBファイルまるごとあげましたのでご都合によってこちらを
ご覧になってください。。
http://no.m78.com/up/data/up071888.zip
>>662-663 突っ込みどころが満載だけど(w
とりあえず今問題になっているのはおそらく、
//削除時
TabSheet->PageControl=NULL; //追加
delete TabSheet;
これで試してみて。
あと、こういうときはデバッガ使って自分でコードを追っかけることも
覚えなあかんよ。
>>664 遅くなりましたがありがとうございます。
ご指摘の方法で上手くいきました。
TabSheetを削除する前にPageControlとの関係を断ち切ってやらないとダメなんですね。
なぜかはよくわかりませんが、その二つはセットで憶えておくことにします。
てゆうか突っ込みどころ満載ですか…。
どうりでたまに意味不明のエラーが連発したりすると思ったら。
とほほ、ありがとうございます。
>>665 いや、意味をちゃんと理解しないと。
PageControlが管理しているTabSheetをPageControlに通知せずに破棄すれば、
それを知らずにPageControlが破棄されたTabSheetを参照しようとしてエラー。
ちょっと判りにくいのはTPageControlではTTabSheetを追加/削除するためのメソッ
ドが公開されてないで、TTabSheet->PageControlへの代入でそれを行うということ。
VCLのプロパティは実際には関数の呼出しなので、TabSheet->PageControl=NULL
は単にNULLを代入しているだけでなくて、実際には呼び出された関数が
PageControlからTabSheetを削除することまでやってくれます。
その他
このコードは説明のためのデモだと思うから重箱の隅をつつく気持ちはないけど、
非常に不味いのを1つだけ指摘。
CppWebBrowser->TComponent::Name="CppWebBrowser"+G_CppWB_num;
"CppWebBrowser"+G_CppWB_num はポインタ演算になるからエラー起こすよ。
667 :
デフォルトの名無しさん:03/12/21 13:05
よく関数名とかに使われる『hoge』とか『foo』とか『bar』って一体なんなんですか?
「特に意味はない何か」
670 :
デフォルトの名無しさん:03/12/21 14:27
671 :
デフォルトの名無しさん:03/12/21 14:56
∧ ∧
(・Д・,,) { ………。 )
(u u__)〜
>>666 あ、本当だ。TabSheet->PageControl=NULLだけでもちゃんと削除してくれる。
勉強になります。
デモというか新規CppWebBr〜にOnTitleChangeをつけるくらいで
あとはそのままなんですが…。
CppWebBrowser->TComponent::Name="CppWebBrowser"+G_CppWB_num;
の部分はエラーが出なくなった今ではやっても意味なさそうなので削除しときます。
ここは書籍情報のスレじゃないんですが、この際に怖々聞かせていただくと、
こういったことってどの本を読めば書いてあるんでしょうか?
BCBのリファレンス引いてもなかなか思った情報にたどり着けなかったりするもので。
「タブシート削除時はTabSheet->PageControl=NULL; を使うこと」
とか。はじめてのC++なんかには書いてないですよね。
やっぱみなさんおそらく経験値を一杯積んで
コンポネを定義してある紙を読んでたりするんでしょうね…。
質問無かったことにしてください。
ありがとうございます。
673 :
デフォルトの名無しさん :03/12/21 16:56
#include<stdio.h>
#define MAX 3
void main(void)
{
int a,b,c,d;
int i,box[1][MAX];
printf("a=? ->");
scanf("%d",&a);
printf("b=? ->");
scanf("%d",&b);
printf("c=? ->");
scanf("%d",&c);
printf("d=? ->");
scanf("%d",&d);
for(i=1;i<=MAX;i++)
{
box[1][i] = 9999;
printf("\n%d回目\n a=%d\n b=%d\n c=%d\n d=%d\n",i,a,b,c,d);
}
}
↑
上のプログラムを実行した時、最終的に出力されるa〜dの値が、
最初に自分で入力した値にならず、繰り返し処理ごとに変化する
(c,b,aの順に9999になる)のはなぜですか?
不思議です。
box[1][i]がバッファオーバーフローして結果的にa-dに9999を代入してるから。
createDIBserectionってなんでcとc++ではちょっと違うの?
誰かC言語を入力したら自動的にフローチャート作ってくれるソフト知りませんか?
フローチャートなんて前時代的なものは捨てましょう。
書くならせめて反復指定子使ってね。
それはいいとして、
>>678はなんでそんなものを必要としているんだ?
680 :
デフォルトの名無しさん:03/12/21 19:26
VC++6を使っているのですが仮想関数のオーバーヘッドって
通常のメンバ関数に比べてどれくらいのもんなんでしょうか?
また基底クラスのポインタからの派生クラスの呼び出しのオーバーヘッド
も普通に派生クラスのポインタから呼び出すよりも時間かかるんでしょうか?
>>679 「バブルソートのフローチャートを書け。」という問題が出る。
↓
誰かがCでバブルソートのプログラムを書いたものを探す。
↓
フローチャート生成器にかける。
↓
うまーーーー
フローチャートを探せばいいじゃんと思うかもしれないけれど、フローチャートよりCプログラムの方が遙かに多いから。少なくともネットには。
C++のオブジェクトはnewしなかった場合、
スタック/ヒープのどちらに積まれるのでしょうか?
クラス内/関数内と宣言する場所によって違ったりするのでしょうか?
あぁなるほど、フローチャートを書けなんてくだらない課題が出るような
くだらない仕事/学習をしているというわけだな。
仕事なら、Cの開発支援ソフトでその手のものは探せばあるから買ってもらえ。
学習なら、それも学習の一つの手段と諦めて自分で書け。
687 :
デフォルトの名無しさん:03/12/21 21:43
>>687 言っちゃわるいがそれアルゴリズムとか云うレベルの問題じゃねぇぞ。
もうちょっとマシなアルゴリズム使えば確実に高速化できるが。
>>687 今度はエラトステネスのふるいで書いてみたら?
>>672 TabSheet->PageControl=NULL だけでは、TabSheetそのものは存在し続ける。
それでも実害はないけど、いらないものは delete しといた方がいい。
「はじめてのC++」は言語の解説書。VCLの使い方を覚えたかったらVCLの解説書を読む。
そのへんはBCBスレで聞いた方がいい。
692 :
デフォルトの名無しさん:03/12/22 01:30
Ini->WriteString( "test" , AnsiString("hoge"+n) , Str );
Ini->UpdateFile();
の形でIniファイルを上書きしてるんですが、キー名のソートの仕方というか、がよくわかりません。
[test]
hoge1=阪神
moge1=アントラーズ
上のようなIniファイルの「hoge数」タイプのキーに「広島東洋カープ」を追加して次のような状態にしたいんですが、
hoge1=広島東洋カープ
hoge2=阪神
moge1=アントラーズ
実際は次のような状態になってしまいます。
hoge1=広島東洋カープ
moge1=アントラーズ
hoge2=阪神
これってみんなどうやって見た目きれいに並べてるんでしょうか?
>>692 環境依存OKスレではあるけれど、そうであるからこそ環境を提示してくれ。
まぁ、Windowsの話なんだろうけど。
>>693 失礼しました。Windows2kです。
一応使ってるソフトも明示しておくとBorland C++ Builderのバージョン6です。
>>692 環境もだが、肝心のあなたが質問しているコンポーネントの名前も書いてないね。
まぁ、多分TIniFileを使ってるんだろうと見当はつくが、質問は最初から必要な情報を
全て明示しないとアカンよ。以後気をつけるべし。
で、回答
そのいち。
Iniファイルの中身なんてエンドユーザが見る必要ないんだから、
必要な情報が書き込まれていればソート順なんか気にしない。
そのに。
どうしてもソートしたかったらキータイプごとにセクションを分けて、なおかつ、
書き込み前に一旦セクションを全削除した上で一括してキーを書き込む。
セクション削除についてはヘルプを見れば書いてあるので自分で読む。
おすすめは、そのいち。
>>696 失礼しました。使ってるのはTMemIniFileでした。
そのいちの方向でいきたいと思います。
ありがとうございました。
ifstreamで190k程度のを読み込むのにかなり時間がかかってしまいます
高速にファイル読み込みをするにはどうしたらいいんですか?
700 :
デフォルトの名無しさん:03/12/22 18:25
整数型の配列a[i]に、文字型配列b[i]に入っている3という文字を
そのまま代入したい場合、
a[i]=b[i];
のような記述ではだめなのでしょうか?
このように記述すると数がおかしくなってしまいます。
>>700 文字を代入したら、そりゃ文字コードになるわな。基本。
703 :
デフォルトの名無しさん:03/12/22 18:30
>>701 そうですか。
やっぱり直接代入は無理っぽいですね。
どうもでした。
706 :
デフォルトの名無しさん:03/12/22 18:39
配列の内容を、ループを使わずに、一括で一つの値にすることはできますか?
std::fill()
内部的にもループを呼ばれたくないならそれは不可能。無理。
>>699 リリースモードでビルドしてみましたが変わりませんでした。
ちなみにファイル読み込みは
string FileOpen(char *Path)
{
string str1;
char Buff;
ifstream MyFile(Path);
while(MyFile.get(Buff)) str1 = str1 + Buff;
return (str1);
}
でFileOpen()として使ってます
>>706 Cなら memset 。
ただ、1バイト単位の指定になるので、 0x00 から 0xff までの値でしか一括の値にできない。
>>708 最初からそう書いてくれないと、答え様ないわな。
string str1をあらかじめ、大きいサイズでresize しておく。
理由はvectorのpush_backみたいなもん。自分で調べておくと良いかも。
str1 = str1 + Buff を str1 += Buff にする。
getをgetlineにするとか・・・。
あとは、でかい文字列を値返しするのやめるとか・・・。(return (str1);)
#include <string>
#include <fstream>
#include <iterator>
std::string FileOpen( char const Path[] )
{
std::ifstream stream( Path );
typedef std::istreambuf_iterator< char > iterator;
return std::string( iterator( stream ) , iterator() );
}
ある画像を数秒間表示し続けたい場合
Sleep()を使わないで実現するには
どうしたら良いのでしょうか?
初心者すぎてスミマセン。
__,, , , , _ 、 ,,, ... ,, _ ..,_
ー=、 、ー-、`ヽ、、ヽ`!i' , ,i",r'",-'"=ミ
`ヽ`ヾ`、 ! ヽ ! l! i! !_i_/_<'"``
`,ゝ、iliー'" "、,"、', i, リ
!/!,li ,;;-=o=-,ッィ=。ゥィ
__ i、`!', '; `ー /;;!i、''; ,!
ー''`ヽ`,ーi'`''"!、ヽ , `一'、 / __
`il `i ! ヽ、  ̄ ̄ / iヽ、/ ,.ヽ_
i! !` `ーァ、-ー' ! ノ!トi,!'",ノ-、
,..=、i! iヽ-、 rィ',;'!ヽー-、! `/_,i' _,.!'、
ーニー-、._ `ヽゞニ-、.;' i! ! , `ト_ノ`x-'" ノ
=ニヽ、 , `, /ヾ=ソ ノ !/ !、`ー`''イ、
-ー-、 `i, / / ヽ `イ_, i -'" ̄`! ! ヽ
ゝノ /-'" ` ' ! ヽ !
おまえのすきるはみきった
おれにかなうあいてではなかった
最近、setjmp/longjmpを使用して似非スレッド処理を作ってます。
使用OSはWindowsXP、コンパイラはVC++.netです。
非インテル系で以前に作ったことがあるので、多分こんな感じだろうと
jmp_buf[ESP]にstack[STACK_SIZE]-4を、jmp_buf[EIP]に実行したい関数
ポインタを代入して、そのままlongjmp( jmp_buf )しましたが、動かんのです。
インテルCPUは、SPとIPの設定だけじゃイカンのでしょうか?
>>716 EBPだのESIだのEDIだのが壊れても大丈夫なようにしてあるか?
>717
えー、正直言って『ナンですか、ソレ?』と言うくらい初耳です。
つまりSPとIPだけじゃイカン、と言う訳ですね? ちょっと調べてみようと思いま
す。アセンブラスレ逝くのが早いですかね?
今、ネットで落としてきたmicrothread.cと言うソース(URI失念、失礼)を見てるの
ですが、EBPと言うのが確かにESPと関連して設定されてました。
720 :
デフォルトの名無しさん:03/12/23 00:45
>>710 ソース書いておいた方が解答しやすいにきまってましたよね。次回からそうします。
str1 += Buffやあとtips的な指摘ありがとです!
>>711 その210-211が参考になりました、おかげでもの凄いスピードが上がりました!
>>712 試したんですがどうもエラーうんぬんでビルドできなかったので断念しました。ありがとうございます
>719事故レス
あぁ、EBPってフレームポインタとして使用されてるワケか。納得。
>717
見た感じ、ESIとEDIは壊れててもよさげな感じなんですが、駄目なんでしょうか?
>720
ありがd。VCの流儀ってよくワカランのですわ。何せVC触って2日目。
ところで、ポインタって、64bitなん? EIPに関数ポインタを、ESPに
(char *)&stack[STACK_SIZE-4]を代入してるんだけど、
warning C4311: '型キャスト' : ポインタを 'void (__cdecl *)(void)' から 'int' へ切り詰めます。
warning C4311: '型キャスト' : ポインタを 'char *' から 'int' へ切り詰めます。
こんなwarningが出てる…。
VCは64bitソフトもコンパイルできるヨ
>>716 コルーチンみたいのを実装したいのなら、Win32ではFiberを使うと良いよ。
Portable multithreading 自体が目的なら別にいいけど。
>725
Portable multithreadingの方が目的です。
LinuxではUser Level Threadというらしいですね。こっちの方が
ぐぐって沢山資料見つかりました。
>726事故レス
setjmp/longjmp/jmp_bufとかで検索するよりは、という意味で。
Portable Multithreadingだと、実装よりは利用の方が沢山出て
くるような感じ。でも、こっちも有用な情報多いな。
コマンドプロンプトに、例えばdirというコマンドを送るプログラムはできますか?
>>728 何がしたいんだ?
dirという文字列をペーストするとか、
バッチファイルでdirコマンドを実行するとか、
どちらでもないとか、
もう少し具体的に書いてくれ。
>>729 バッチファイルでdirコマンドを実行する方。
>>731 #include <stdio.h>
#include <stdlib.h>
void main(void) {
system("dir");
system("PAUSE");
}
用はこんな感じですね。
いろいろ調べてたら発見できました。
どうもありがとうございました。
733 :
デフォルトの名無しさん:03/12/23 16:50
VCでSTLを使うとものすごく遅いから止めとけと言われたのですが、実用にならないレベルなのでしょうか。使用されてる方がいらっしゃいましたらご意見を伺いたいのですが… 個人的には、自分で実装するよりひどくはないはずなので使っても良いのでは、と思っているのですが。
>>733 STLの遅さが問題になるようなクリティカルなアプリケーションは別として
普通に使う分にはまったく問題ない。 安心して使え。
STLが遅いとかいってるやつは、きっとへたくそなコーディングしてるんだろ。
なるべく、コピーがおきないように気を配るのは当然必要だ。
参照をうまく使えよ。
winmeでやっているんですが、Binというフォルダ以外の場所にプログラムを書いたものを保存しておいて、
コンパイルするにはどうしたらいいのでしょうか?
Kさん 好循環 Aさん 悪循環
(健康体) (喘息)
1.(神が喘息であるかないかを決める)
2.K 喘息でない人 A 喘息の人は
は体力がある 体力がなくなる
3.K A 行動力、
五感(嗅覚)が鈍り感性が変化する
4.K&P 神は異常な感性の人間は本来人に迷惑をかけ
るから外に出てはいけないと思っている。
5.K 変化なし A アトピーになる
6.K 正常な感性 A 外に出なくなりさらに異常な感性になる
7.K 正常な人間 A 異常な人間(レッテル)
8.K&A 死
9.K&A 来世
10.K&A 神は異常な人間は人に迷惑をかけるので行動
を抑制する必要があると思っている。
11.K&A 神が喘息であるかないかを決める
12.K 喘息でない A 喘息である
13.K&A 1.に戻る
これは事実。広めようぜ
解決法:体力をつけると感覚が正常に戻り、
アトピーも快癒に向かう。
目安としてグランドを10週くらい。
あとはウォーキング、なるべく長い間歩く
(ウインドーショッピングや散歩、五時間ぐらいを目安)。
無論最初は、無理なので徐々に体を慣らしていくといい
鼻に変な違和感があったり、頭がぼおっとする時の解決法。
口をつぐんだまま、口の中で空間を作る、すると口の中に空気がたまるのでそれを吐き出す。無論息が苦しくなったら、呼吸をして良い。
これを、100回くらい。
>>733 VCで、ではなくてVCについて来るやつの中には遅いクラスもある。
使い方の問題も大きいけど、STLPortsとかと比べての話で、問題になるほどじゃないな。
どうしても心配ならSTLPortsでも使え。
XPでエスケープシークエンスは\x1b[ でできるんですか?
コンパイルすると失敗するんですよ
○チはいらんよ
741 :
デフォルトの名無しさん:03/12/23 20:02
スキャンエフって使ったら駄目なんですか?
>>741 そんな事はありません。
どんどん使いなさい。
うっかり使うとどんな目にあうのか…
それは身を以って知るのが一番です。
>>741 ノープロブレム。
ただし、セキュリティホールを作らないように気をつけるべし。
AAA
AAB
AAC
…
AAa
AAb
…
zzz
といったように文字列を出力するにはどうすれば良いですか?
>>744 printf("AAA\n"
"AAB\n"
"AAC\n"
"…\n"
"AAa\n"
"AAb\n"
"…\n"
"zzz");
>>745 自動的に、補完して表示すると言う意味です。
だから
AAA
AAB
AAC
AAD
AAE
AAF
AAG
AAH
AAI
AAJ
AAK
AAL
AAM
AAN
AAO
AAP
AAQ
AAR
...と言ったかんじに表示したいのです。
for (int i1 = 'A'; i1 <= 'z'; i1 = i1 == 'Z' ? 'a' : i1 + 1) {
for (int i2 = 'A'; i2 <= 'z'; i2 = i2 == 'Z' ? 'a' : i2 + 1) {
for (int i3 = 'A'; i3 <= 'z'; i3 = i3 == 'Z' ? 'a' : i3 + 1) {
printf("%c%c%c\n", i1, i2, i3);
}
}
}
748 :
デフォルトの名無しさん:03/12/23 21:48
>>747 凄い。。。。。。天才だ。。。。。。。。
なんだか・・・・・物凄く低(略
別スレから移動してきました。アラインメント、構造体の配置に関する質問です。
以下の認識であってますでしょうか?
環境に依存する点がありましたらそれも指摘お願いします。
1. 「N バイトアラインメント」と言った場合、N バイト以上のスカラ型が
N バイト境界に配置されており、N バイト未満のスカラ型は自分のバイト
サイズ相当の境界に配置されている。
2. 構造体を配列で確保するときに、構造体の各要素のアラインメントを保つ
ため構造体末尾にもパディングが入る。
3. 全体のサイズが変わらない限り、パディングはできるだけ後ろ側に入る。
(アラインメントとエンディアンが確定すればメモリ上の配置が決定する)
1. について
>Nバイト境界に配置するのが「Nバイトアライメント」。
>「Nバイトアライメント」設定の時Nバイト境界で配置されないとしたら、
>それは100歩譲って処理系の仕様上の例外。
との回答をいただいたのですが、例えば 4バイトアラインメント、
char が 1 バイト、short が 2 バイト、long が 4バイトのときならば、
struct hoge {
char c; /* 後ろに 3 バイトパディング */
short s; /* 後ろに 2 バイトパディング */
long l;
};
となるのでしょうか?
なる
>>746 #include <stdio.h>
main()
{
int n,n2,n1,n0;
for ( n=0; n<=52*52*52-1; n++)
{
n2=n/(52*52)%52;
if (n2>=26) n2=n2+6;
n1=n/52%52;
if (n1>=26) n1=n1+6;
n0=n%52;
if (n0>=26) n0=n0+6;
printf ("%c%c%c\n",n2+65,n1+65,n0+65);
}
}
753 :
デフォルトの名無しさん:03/12/24 07:52
EBCDICの環境だと動かないんだけど
つか、
>>744 は自分で考えたあとが少しも見られないんだが。
丸投げするなら宿題スレとか逝ってほしいものだ。
>>753 #define DIGIT 3
const char ctbl[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
int count[DIGIT], i;
/* カウンタクリア */
for (i=0; i<DIGIT; i++)
count[i] = 0;
for (;;) {
/* 表示 */
for (i=0; i<DIGIT; i++)
putchar(ctbl[count[i]]);
putchar('\n');
/* 桁上げ */
for (i=DIGIT-1; i>=0; i--) {
if (++count[i] < sizeof(ctbl) - 1)
break; /* 桁上げなし */
count[i] = 0;
}
if (i < 0)
break; /* 最上位桁まで終了 */
}
ん?
for の前のコメント「/* 桁上げ */」は変だ。
「/* カウントアップ */」とでも読み替えて暮。
756 :
デフォルトの名無しさん:03/12/24 13:35
int x = 1 << arg1;
int y = 1 << arg2;
これはどんな操作をしてるんでしょうか?
ただの代入なら<<argXは必要無いはずだし・・。
<<の意味がわかって言ってる?
758 :
デフォルトの名無しさん:03/12/24 13:47
出力演算子だと思いますが・・・(自信ナシ)。
int x = 1 ^ arg1;
int y = 1 ^ arg2;
みたいな感じかな?
もちろんコンパイルは通らんよ
左シフト
ストリームの入出力に
"<<"/">>" なんて演算子を使いだした
糞忌々しい莫迦の所為で
今日も初学者が道を誤るのでした。
>>758 シフト演算。どんな入門書でも載っている筈なので参照汁。
>>759 それ bitwise XOR。
arg1、arg2 が整数型なら
コンパイル通るべさ。
762 :
デフォルトの名無しさん:03/12/24 14:17
ありゃ、シフト演算でしたか・・・(汗
てっきり何かに出力するのかと思ってました。
レスありがとうございます。
763 :
デフォルトの名無しさん:03/12/24 15:33
int型から文字列型にするときはどうすればいいんですか?
確かscanfでできたような気がするんですが・・・
boost::lexical_cast
>>759 それって 1×2^n とかって言いたかった?違うかな。。
死ねよ上級者
走れ正直者
>>763 sprintf
std::stringstream
boost::lexical_cast
boost::format
入門書を読み終えて、次は何をすればいいですか?
入門書を読み返す
771 :
デフォルトの名無しさん:03/12/24 16:06
>>764 >>768 sprintfで解決しました。scanfだと思いこんでたので失敗しました。ありがとうございます
せっかくだから、snprintfにしとけ。
ポインタってどこら辺が難しいんですか?
vectorなどに基底クラスのポインタを持たせて派生クラスを呼び出したいのですが
派生オブジェクトを半自動で持たせる方法がわかりません
どうすればよいでしょうか
1: no matching function call to `派生クラスを呼び出し'
2: no matching function call to `半自動で持たせる'
すんません、初心者なんで至らないところがあれば謝ります
基底クラスのポインタの配列を作って
順に派生オブジェクトの仮想関数を呼び出したいんですが
vectorなどでポインタを持たせることは出来ますが
実体は自分で管理しなければならないので
それを自動化できる方法は無いですか
boost::shared_ptr
>>778 なんとか解決できそうです
ありがとうございました
「strという文字列格納領域は500文字分しか用意されてないので、その長さを最大読み込み長として指定しないといけません。」
「ファイルの中に600文字の文字列があったら、その文字列を読み込んだ瞬間に配列オーバーを起こし、即アウトになります。」
と解説書に書かれてるのですが
例えば↓の場合、fgets関数の最大読み込み長は5以下じゃないと駄目という意味ですよね?
#include<stdio.h>
main(){
FILE * fp;
char fname[100],str[5];
char * p;
printf("ファイル名を入力してください");
gets(fname);
fp=fopen(fname,"r");
for( p=fgets(str,10,fp); p!=NULL; p=fgets(str,10,fp) )
{
printf(str);
}
}
>>751 gcc (GCC) 3.2.2 [FreeBSD] 20030205 (release) / gcc (GCC) 3.3.1 (cygming special) / Visual C++ 6.0
のいずれでも、
#pragma pack(4)
struct hoge {
char c; /* 後ろに 3 バイトパディングではなくて 1 バイトパディング */
short s; /* 後ろに 2 バイトパディングではなくてパディングなし */
long l;
};
で、構造体のサイズは 8 バイトになるんですが。
別の構造体で #pragma pack の指定によって変化がおきることは確かめてます。
#pragma pack とアラインメントとは別物なのでしょうか?
gccで#pragma pack?
使えるみたいですね。
> #pragma pack とアラインメントとは別物なのでしょうか?
pragma packの仕様を調べてみたら良いと思います。
gcc-3.1 (Mac OS X) で、これ↓
-----
#include <iostream>
using namespace std;
int main() {return(0);}
-----
をコンパイルするには、
---
$ gcc test.cpp -lstdc++
---
のようにライブラリの指定をしなければならないが、
そういうものか?
ちなみに、ライブラリを指定しなければ、
-----
ld: Undefined symbols:
std::ios_base::Init::Init[in-charge]()
std::ios_base::Init::~Init [in-charge]()
___gxx_personality_v0
-----
のようなエラーが出ます。
>>781 struct hoge {
char c;
short s;
double d;
};
でやってみれ。
#pragma pack(4) の有無で
d のオフセットだけ変わる筈。
>>788 ちょい補足します。
> 確かに、最小アラインメント(minimum alignment) = 4 なのだと考えれば
確かに、4 バイトアラインメントと言われた時に、最小アラインメント(minimum alignment) = 4 なのだと
考えれば、という意味です。
>>789 アラインメントは型ごとに違う。
そして、型Tのアラインメントはsizeof(T)以下になる。
>>789 #pragma pack(N) の挙動 = N バイトアラインメントではない
で、FA?
最小アラインメントという言葉が無いのは、
ふつうアラインメントは 2^n なので、
指定されたNより大きいアラインメントが存在しても
すべてNバイト境界だからだと思う。
たとえば4バイトアライン指定をしたときに
デフォルトで8バイトアラインを持つ型がデフォルトのまま配置されたとする。
8バイト境界=4バイト境界なので問題なし。
Char配列に、画像の画像データを持っています。
その配列を引数にして、jpg形式で保存する方法はありますか?
ありましたら詳しく教えてください。お願いします。
794 :
デフォルトの名無しさん:03/12/26 17:47
いろんなスレに自動で書き込むソフトのソースコード教えてくれませんか?
一応コンパイラーは手に入れたので。
Cはそこそこ知識があるとして
ボーランドC++やvisualC++
を扱えるようになるためには
どのくらいC++の知識が必要ですかね。
C++はすごい幅が広くて全部の範囲を
かなり大変と聞きましたのでどこらへん
を抑えておくべきでしょうか。
>>798 インストールすれば直ぐに使える。マジ
ちょっと分かったような気分になったんですが、また混乱してきました。
とりあえず、常に型か要素を特定してアラインメントを言うようにすればいいんでしょうか。
>>790 >そして、型Tのアラインメントはsizeof(T)以下になる。
これは、デフォルトの状態でってことですか?
でなければ、
struct hoge {
char c; /* 後ろに 3 バイトパディング */
short s; /* 後ろに 2 バイトパディング */
long l;
};
にならないですよね?
>>791 >#pragma pack(N) の挙動 = N バイトアラインメントではない
了解です。以後、気をつけます。
さらに質問なんですが、上の struct hoge のように配置するためには、 自前でダミーを入れるか、もしくは
各要素に Visual C++ では __declspec(align(N))、gcc では __attribute__ ((aligned (N))) のような指定を
つけるしかないでしょうか。
#pragma pack と同じように1回の指定で構造体要素全てに同一のアラインメントを強制させたりできないでしょうか?
環境としては、gcc、Visual C++、Borland C++ でお願いします。
えー、えらく亀ですが、ようやく解決しました。
こちらの望んでいたとおりの動作が出来るようになりました。
お世話になった皆さん、どうもありがとうございました。
>>750=やおい?!
union使ったら?
struct hoge {
union {
char c;
long dummy;
} c;
union {
short s;
long dummy;
} s;
long l;
};
とか。
804 :
デフォルトの名無しさん:03/12/27 08:48
すいません昨日からやさしいCを読み始めたんですが、コンパイルができません。
「lcc ソースファイル名」でEnterキーを押しても、「Bad command or file name」
と出てきます。
lccにパスが通ってない
806 :
デフォルトの名無しさん:03/12/27 09:13
ありがとうございます!ではパスについて調べてみます!
連立方程式を解くアルゴリズム(掃きだし法)のプログラムの組み方がわかりません。。。
誰かおしえてくださいm(__)m
卒論は宿題スレへ
>>801 > >そして、型Tのアラインメントはsizeof(T)以下になる。
> これは、デフォルトの状態でってことですか?
設定とかにかかわらず、常に成り立つ話。
> でなければ、
> (略)
> にならないですよね?
構造体のパディングが型のアラインメントのためであれば、ならないですね。
このヘタレに一から教えてください。
811 :
デフォルトの名無しさん:03/12/27 14:51
>>803 >>750=やおい?!
意味ねぇ〜ってことすか?
複数の処理系で構造体のメモリ配置を統一したいってことなんですが。
#pragma pack (N) を使うのが一番簡単みたいですね。
その上で N バイトアラインメントと言わないように注意する、と。
>>818 ファイルが落とせないしエラーメッセージも書いてないからわからんが
GetProcAddressしてないんじゃないのか?
>>809 809(=789?) 氏はそもそも型の限定をつけずに N バイトアラインメントと言ってはいけないという
立場だと思ってるんですが、それは正しいですか?
あと、gcc (GCC) 3.2.2 [FreeBSD] 20030205 (release) / gcc (GCC) 3.3.1 (cygming special) で
↓なコードを書くと
#include <stddef.h>
#include <stdio.h>
typedef char Char4Aligned __attribute__((aligned(4)));
typedef short Short4Aligned __attribute__((aligned(4)));
typedef long Long4Aligned __attribute__((aligned(4)));
typedef struct hoge {
Char4Aligned c;
Short4Aligned s;
Long4Aligned l;
} hoge;
int main(void)
{
printf("size: %d\nc: %d\ns: %d\nl: %d\n", sizeof(hoge), offsetof(hoge, c), offsetof(hoge, s), offsetof(hoge,l));
return 0;
}
↓な結果になりますけど、これは明示的指定してるので例外ってことですか?
size: 12
c: 0
s: 4
l: 8
815 :
nokai:03/12/27 15:28
>>814 > そもそも型の限定をつけずに N バイトアラインメントと言ってはいけないという
> 立場だと思ってるんですが、それは正しいですか?
はい。
> ↓な結果になりますけど、これは明示的指定してるので例外ってことですか?
> (略)
sizeof(Char4Aligned)が4になり、やはり「型Tのアラインメントはsizeof(T)以下」が成り立つ
と思ったのですが、現状のgccでは、sizeof(Char4Aligned)が1になってしまいます。
↓報告はされていますが、これが「バグ」であるとは確認されていません。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12435
>811
DLLにする必要はないのでは?とりあえず3ac..cppにmainを
つけたけど、引数に何を指定するのかよくわからん。
というかソースが逆汗の結果にしか見えないんだが。
818 :
デフォルトの名無しさん:03/12/27 19:24
すいません、「へんかん」ができなくなってしまいました。
MS-DOSぷろんぷとを「きどう」すると「4p4g」とでてきてしまいます。
たすけてください。
819 :
デフォルトの名無しさん:03/12/27 19:27
∧_∧
( ´∀`)
>>817 レスありがとうございます。
ソースがあるので、そのまま利用してみてもいいですね、ちょいためしてみます。
821 :
デフォルトの名無しさん:03/12/28 01:29
VBからVC++.netに移行して来たのですが、
関数を入力する際、VBの場合全部小文字で打っても、
自動的に大文字に正しく変換してくれたのですが、
C++は大文字小文字を区別するため、すべて小文字で打ってしまうと、
エラーが出てしまいます。ALT+→の入力補助機能を使うのも少々面倒です。
なにか他に良い方法がありましたら教えてください。
C++自体大小区別するもんなんだから
それくらいめんどくさがるなよ
>>822-823 ありがとうございます。
やはり慣れるしか無いのですね。
特殊文字や大文字が多くてShiftキーを多用するためか、
ミスタッチが多くて泣きそうですが頑張ります・・・
>>823 ちょとワロタ
アビバとかに湧いて出たらどーすんだろ?
826 :
就職戦線異状名無しさん :03/12/28 03:42
プログラムで使用できるメモリ領域を増やすことができますか?
realloc
828 :
デフォルトの名無しさん:03/12/28 05:17
snprintf()には前もって結果文字列の長さを計算しておく使い方が
ありますが、これってあまり可搬性が無いんですか?
Cygwinで動かないみたいなんですが・・・
// 先にサイズを計算しておく
int size = snprintf(NULL, 0, "hoge %.*s fuga", lenvar, strvar);
// サイズがわかったらバッファを確保して
char *buf = malloc(size + 1);
// 本当に書く
snprintf(buf, size + 1, "hoge %.*s fuga", lenvar, strvar);
829 :
デフォルトの名無しさん:03/12/28 05:44
BCB6使ってますがTTreeViewで質問です。
野菜
緑色
レタス
ピーマン
赤色
にんじん
トマト
プチトマト
果物
緑色
スイカ
赤色
マンゴ
オレンジ
という並びだった場合、果物カテゴリの赤色に「バナナ」を追加するのに、
TreeView1->Items->AddChild( TreeView1->Items->Item[8] , "バナナ" );
という風に書いてます。
しかし、項目が増減するため以後のItemのインデクス値もまた変動してしまいます。
そのため項目のインデクス値を取得するのにどうにかして、
「第一階層の二番目の項目」(果物) の中の 「第二階層の二番目の項目」(赤色)
みたいなことを示す方法はないでしょうか。
あるいはもっと簡単な方法があればそれに超したことはなんですが…。
よろしくお願いします。
830 :
デフォルトの名無しさん:03/12/28 10:19
831 :
デフォルトの名無しさん:03/12/28 13:11
>>830 strlenだとフォーマット文字列が違うと毎回違う計算しなくちゃ
いけないですよね。何とかひとつにまとめたかったんですが・・・
833 :
デフォルトの名無しさん:03/12/28 13:42
age忘れage
いい加減Cスタイル文字列を使うこと自体やめるべきだろ。
非効率且つ危険なんていいとこないじゃん。
835 :
デフォルトの名無しさん:03/12/28 14:22
漏れにとってはprintfの%記法の方が一ヶ所に情報が集まっていて分かり易い
cout << はパッと見て分かり難いんだよなぁ
そんな貴方にboost::format
ああもう
いやだ!
いやだ!
いやだ!
>>826 limit datasize unlimited
すいません、間違ってました。
TreeView1->Items->AddChild( TreeView1->Items->Item[8] , "バナナ" );
これではバナナの追加場所が違ってましたね。
TreeView1->Items->AddChild( TreeView1->Items->Item[11] , "バナナ" );
こっちが正解です。
ささいなことですが、混乱された方がいたらすいません。
よろしくお願いします。
>>836 そんな貴方にAnsiString::sprintf
デストラクタを明示的に呼出すことってできるんでしょうか?
例えば、あるひとつの関数内でもう不要なオブジェクトができた様な時に。
それともそんなコーディングをするべきじゃないってことなんでしょうか?
>>842 できる。
けど、
自動オブジェクトやクラスメンバに対して呼び出した場合、スコープアウトでもっかいデストラクタが呼ばれるので死亡確定。
newで生成したオブジェクトに対して呼び出した場合、通常のdelete演算子を使うとデストラクタが2回呼ばれることになるので気をつけないといけない。
>>842 そのオブジェクトが不要になるタイミングでスコープを外れるようにしてやるとか。
>>843,844
お返事ありがとうございます。
もともと844さんの御指摘の様な構成にしたかったのですが、ちょっと難しそうなので
上の疑問に行きつきました。でも、843さんがおっしゃる様に明示的に呼出したとしても
やはりスコープ外れる時の問題は何かと面倒みたいですね。
もう一度見直して、そんなトリッキーな実装が必要ない様、頑張って組んでみます。
ありがとうございました
>>845 必要なときにnewして不要になったらdeleteするんじゃダメなのか?
>>842 // 例えばこういう風にスコープを外すコーディングはするなぁ
void func()
{
foo();
{
Class CHoge hage;
hage.operation();
}
bar();
}
// cでもやる手法なんで、new/deleteするより好きでね
C++;を勉強しようかなと思っているんですが
まずclassについて思ったのが関数とやってることは
あまり変わらないと思ったのですが、全然
違うものなのでしょうか?
>>848 大雑把に言って、構造体とそれ専用の関数をまとめたものがクラスだと思っても
そんなに大間違いではない。
実際、C++において構造体とクラスは殆ど同じものとして扱うことができる。
>>849 クラスは関数も含んだ構造体のようなものですか
なるほど。
abc.exeという実行ファイルがあったとして
この実行ファイルの引数がどうなっているか調べる方法はありますでしょうか?
もしくはそれがわかるソフトでもかまいません。
よろしくお願いします。
実行ファイルそのものから判別する一般的な手段なんてあるわけない。
だいたい使用法によって引数の数なんて違うんだから
もっとも汎用性のある答えは「マニュアルやヘルプを見る」だ
実行ファイルの引数ってなんだよ。
855 :
デフォルトの名無しさん:03/12/30 03:48
コマンドラインの中に半角空白がひとつでもはいっていると、コマンドラインを使用した時うまく動作しない。
どうしたらいいか教えてくれる人がいるとうれしい。
857 :
デフォルトの名無しさん:03/12/30 03:56
おお、グッドアイディア。
……って、鼻くそかよ……。
無理にもほどがあるぞ(鬱)。
ファイル名、ディレクトリ名を空白のないやつに変えろ
859 :
デフォルトの名無しさん:03/12/30 05:40
質問です。
文字列を変数名として使うにはどうしたらいいんでしょうか。
AnsiString Hoge="こんにちは";
AnsiString Test = eval("Hoge"); //evalとかは適当です。他の言語でこういう書き方を見たもんで
これでTestの中身が「こんにちは」になる、みたいな。
簡単な質問ですいません。
「文字列を変数名」とかいろんな言葉で検索したんですが見つからなくて。
よろしくお願いします。
引数を持つコンストラクタを使用して、あるクラスの配列を作成することって無理?
862 :
デフォルトの名無しさん:03/12/30 09:02
すいません、VCLのExtractRelativePathって関数で
二つのファイル間の相対パスを調べてるんですが、
かぶった部分を知りたい時にはどうしたらいいんでしょうか?
例えば
AnsiString A = "C:\hoge\html\test\hoge.html" //という位置のhtmlファイルから
AnsiString B = "C:\hoge\img\hoge.jpg" //というファイルへの相対パスは
ExtractRelativePath(A,B); //返ってきた答えは「..\..\..\img\hoge.jpg」です
これはいいんですが。二つの文字列から
かぶった場所「C:\hoge」を探る方法はないのかなぁと。
自分で思いつくのはどっちかのファイルをExtractFileDir( )して、
もう一個のファイルとPos( )、一致してるか調べる、
一致してなかったら完全一致するまでループする、って方法ですけど。
もっと簡単に出来る方法ってありますか?関数イッパツとかで。
あればどうか教えていただけないでしょうか。
おねがいします
863 :
いなむらきよし:03/12/30 11:53
キケー!
stl::vector(deque)に
画像データを持たせるのってだめでつか?
>>865 std::vectorで画像データへのポインタを持つのが現実的じゃないかな?
まぁ、画像データが大きくないのなら直接扱えなくもないが、
サイズの問題が付き纏うしね。
>>862 単純に文字列として比較するんじゃダメかな?
>>866 レイヤー処理の関係で、画像のサイズ変更が頻繁に起こるので
vectorを使おうと思ったんですが
500*500*4 から 4000*4000*4(byte)まで500間隔で大きくしてみたところ
vector resize : 724ms
malloc realloc: 623ms
だったのでvectorでも問題ないかなと思いました。
>>867 なるほど、複数の画像じゃなくて、単一の画像の話か。
だったらそれでいいんじゃない?
class Pixelとか定義してやればなにかと便利だろうし。
#つーか、やってるなぁw
>>866 おっしゃる通り文字列として比較で結構です。
自分で考えたのがこんな感じなんですが、
AnsiString A = "C:\hoge\html\test\hoge.html";
AnsiString B = "C:\hoge\img\hoge.jpg";
do{
A=ExtractFileDir(A);
}while( ! B . Pos( A ));
ループなんかまわさなくても、もっと単純に「二つの文字列間の一致している部分を返す」、
といった関数があれば、と思ったんですが。
そんなの、ちょいちょい、と自作してしまえばええんでないの?
それはそうとして、なんで\は一つでOKなの?
int partial_strcmp(char* lhs, char* rhs) {
int ret = 0;
while( '\0' != ( lhs++ == rhs++ ) ) ++ret;
return ret;
}
みたいな比較関数を作ればいい。
先頭を指定しての部分比較。一致した文字数が返る。
ああすまん。 == の返り値を'\0'と比較してどうするんだ。
先頭から一致する部分を求めて
そこからディレクトリの区切り('\\','/')まで遡るだけだろ。
ドライブ名やらが入るとちょっと面倒くさいけど。
あまり本質とは関係ないけど
「文字列」を「文字」の「列」として扱う(比較する)のは
ほとんどのコンパイル言語に備わっている機能でしょ。
そうするのが最も効率が良いから。
それが配列なのかポインタとして扱うのかはともかく。
>>871 三行目の二重比較みたいな書き方は初めてみたのでちょっとわかりませんでした…。
レスして頂いたみなさんの話聞いてて思ったのは、結局こういう場合ってどっかでループが回って
比較してるってことですよね。
http://www.yukibow.com/bcb/B0070.html とかすでに定義済みの関数とかしか使ったことないので、
二つの文字列の一致部分を「直接」返す、といったことを求めてしまいましたが、
よくよく考えればそんな魔法のようなものはありえない、と。
ちょっと質問なんですが、
「C++の機能として提供されている関数に比べて、自分で作った関数は遅い」
という自分のイメージは間違ってますか?
なんか無茶苦茶な誤解(に次ぐ誤解)をしてるような気がするので、
意味不明な質問なら読み飛ばしていただいて結構ですが…
あ、あと\一つは単に間違いでした。すいません。
「直接」の意味がわからんが、
新たな文字列を渡されたポインタに対してコピーするのは遅いし危険もある。
元の文字列がすでにあるなら、その内での先頭位置と長さが得られれば十分。
>>871の正しい書き方は
while( ( (*lhs) != '\0' ) && ( (*lhs)++ == (* rhs)++) )
*( tmp = lhs++ ) == *rhs++
みたいな書き方はしばしばされるけど
比較演算の返り値は真偽値(int型)なんであの書き方はNG
もう一つの質問に対しては
肥大したクラスを用い汎用に作られた関数よりは
自分の求める処理に特化した最小の自作関数の方が高速にできる。
ただし基本的かつ汎用的な処理に関しては
下手に自作せず提供されているものを使った方がほとんどの場合よい。
ちなみにC++を使っているのなら場合
stringのメンバ関数は文字数を先に指定しての比較のはずなんで
一致範囲を求めるにはalgorithmにあるmismatchが適切と思われる。
AnsiStringは使ったことがないから見当違いだったらすまんが、
std::mismatchは使えないのか?
逝って来ます
クラスの宣言に関して問題にぶつかっています。
VC++.net 2002でコンパイル時、
「認識できない型 'ClassA' が使われています。」
「'ClassA' の宣言を確認してください。」
というビルドエラーが出るのですが、ClassAは明らかに
定義されており、その証拠に他のクラスではClassAを包括
して使っています。
エラー元のファイルでは次のように記述しています。
class ClassA;
class ClassB
{
ClassA* classA;
}
このClassBの中のclassAにアクセスしようとすると、
前述したエラーが出力されます。
これはどのようなの誤りが考えられるのでしょうか?
宣言してるが定義はされてない。
きちんとクラス定義をインクルードしろ
>>877 AnsiStringもレガシーAPIとの連携用にメンバ関数c_strが用意されてるから
これを経由すればSTLも利用できるよ。
でもやっぱり文字列の範囲にポインタ(イテレータ)のペアは合わないことが多いんで
可能なら用法にあうように自作した方がいい。
真偽値だけを返す比較関数は役に立たないし
>>880 インクルードすると、多重定義による大量のエラーが発生します。
そのために先行宣言で済ませているつもりなのですが・・。
なぜ済まないのでしょうか・・。
>>882 参照やポインタだけ使うのならともかく
インスタンス化したりメンバへのアクセスをする場合は定義まで必要。
少し考えれば当たり前な話だと思うがなあ。
つーか多重定義エラーが出るってのはそもそもインクルードガードを記述してないか、
ファイルの依存関係にループがあったりするんじゃないのか?
他の部分見ないとわからんがクラスの使用法以前の問題だと思う。
>>875 >>876 前半後半ともに平易で明解な説明どうもありがとうございます。
いろいろな疑問が氷解しつつ、自分の新しい課題も見えて勉強になりました。
今更だがミス発見。
( ( (*lhs) != '\0' ) && ( (*lhs)++ == (* rhs)++) ) じゃ文字型インクリメントしてるじゃん。
ポインタインクリメントするんだから
(*lhs++) == (*rhs++) じゃないとあかんがな。
まあライブラリ使えばこんな凡ミスもしないで済むという教訓が(ry
>>883 おおなんと!できました。ありがとうございました。
888 :
デフォルトの名無しさん:03/12/31 16:01
#pragma pack(8)
struct A {
char c; // サイズが 1 バイトなので、1 バイトアラインメントされる(構造体のサイズに影響する)
short s; // サイズが 2 バイトなので、2 バイトアラインメントされる
double d; // サイズが 8 バイトなので、8 バイトアラインメントされる
};
#pragma pack(4)
struct A {
char c; // サイズが 1 バイトなので、1 バイトアラインメントされる(構造体のサイズに影響する)
short s; // サイズが 2 バイトなので、2 バイトアラインメントされる
double d; // サイズが 8 バイトなので、4 バイトアラインメントされる
};
#pragma pack(1)
struct A {
char c; // サイズが 1 バイトなので、1 バイトアラインメントされる(構造体のサイズに影響する)
short s; // サイズが 2 バイトなので、1 バイトアラインメントされる
double d; // サイズが 8 バイトなので、1 バイトアラインメントされる
};
最小アラインメントというよりは、
最大アラインメントじゃない?
891 :
デフォルトの名無しさん:03/12/31 22:11
C++ではCで作った関数使えますよね?
文字配列のポインタを引数とするCの関数があるんですが
C++のString型を渡すことはできるんですか?
直接渡すのは無理だと思うんでポインタを渡したんですが駄目でした
こういう問題を解決するような機能はありますか?
892 :
デフォルトの名無しさん:03/12/31 22:18
>>891 その関数が求めるものを渡せ。
それ以外は渡せない。
Stringが何なのか、文字列へのポインタがなんなのか勉強しなおさないと
そのうちとんでもない失敗をするぞ。
893 :
デフォルトの名無しさん:03/12/31 22:24
>>892 そうなんですか
文字列へのポインタは分かるんですが(多分)
Stringがなんなのかはよく分かりません。
勉強してきます
String じゃなくて string な。
char* から string には暗黙の変換が存在するが逆はない。理由は省く。
CのレガシーAPIを利用するためには、string::c_str() を使う。
ただしこれが返すのは const char* なんで読み取り用途のみ。
それにしても何でもポインタを渡せばどうにかなるなんて不健全な発想は早く捨てた方がいい。
型に対して不真面目なヤツがC++を使うととんでもないことになる。
非constポインタを受け取る自社ライブラリとかにむりやりキャストして
突っ込んで、メモリ壊してC++分けわかんないからだめだ、とあきらめる
しょうもない質問で悪いんだが
char s[]; と
char* s; のちがいってなにさ?
よくこれでいじめられた。
>>897 C FAQ見るたびに自分の理解の浅さを思い知らされる_| ̄|○
>>890 さんくす。
次から利用させてもらいます。
900
>>889 >>788 より
>調べてみると、#pragma pack は最大アラインメント(maximum alignment)を
>指定する、と書かれています。
902 :
デフォルトの名無しさん:04/01/02 17:08
超初心者で申し訳ないのですが、
argv[1]に格納されている文字列 yymmdd を
数字yy mm dd に分けて表示させるにはどうしたらよいでしょうか。
たすけて偉い人。
argv[1] = yy
argv[2] = mm
argv[3] = dd
になるように引数を変更する
printf("%c%c %c%c %c%c", argv[1][0], argv[1][1], argv[1][2], argv[1][3], argv[1][4], argv[1][5]);
>>903 ありがとうございます。
でもでも、yymmddがいっぱい入ったファイルを読み込ませているので
それは避けたいのですが。。。だめでしょか。
>>904 あろがとうございます。
でもでも数字にしないとその後の処理が・・・。
質問悪かったです。
表示以外でもyy,mm,ddを扱いたいので。
printf("%d, %d, %d",yy,mm,dd);
でなんとかならないでしょうか。
>>902 とりあえずこんなのは。c++でわりいけどさ。
肝心なのはatoiだからね。
#include <iostream>
int main()
{
char *s="123456";
char ii[2];
while(*s){
for(int i=0; i<2; ++i) ii[i] = *s++;
cout<<atoi(ii)<<' ';
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv){
int yy,mm,dd;
if(argc!=2){puts("(・∀・)カエレ!!"); exit(1);}
sscanf(argv[1],"%2d%2d%2d",&yy,&mm,&dd);
printf("yy:%d mm:%d dd:%d",yy,mm,dd);
return 0;
}
こんなことがやりたいのか?
あと書き忘れたけど
>char ii[2]
ココの部分さ
char ii[3]; ii[2] = '\0';
に変更した方がいいかも。
そして、もうひとつargvにはファイル名だけ送ってFILEでそのファイル開いて処理した方がいいよ。
おわっ、出来ました。
>>907 様
>>908 様
お正月から幸せになれました。
ありがとうございました。
皆様にとって良い年でありますように。
911 :
デフォルトの名無しさん:04/01/02 21:53
C++の初歩的な質問なのですが、
unsigned char型の変数の値を、数値で表示するにはどうしたらいいんでしょう?
unsigned char n;
n = 100;
cout << n;
とすると、d と表示されてしまうのですが・・・。
cout << (short)n ; ならきちんと表示されますが、
他の方法があれば教えてください。
913 :
デフォルトの名無しさん:04/01/02 22:00
printf使わずに、cout使うということでお願いしますだ・・・。
C++の練習してるので・・・。
914 :
デフォルトの名無しさん:04/01/02 22:24
Javaのクラスみたいにクラスをネストさせて
内部のクラスが外側のクラスのprivateメンバを参照することってできる?
class A{
int a1;
class B{
getA1(){
return a1;
}
}
}
普通にこんな感じで書いたらコンパイル通らなかったけど、
特殊な記法とかでできたりしない?
>>913 まあキャストするかそもそも数値型変数に int などを使うのが一番簡単だと思う。
ちなみにC++の練習しているならキャストは static_cast<int> と書くようにしよう。
>>914 内部クラスだろうが
friend 宣言しない限り private メンバは参照できない。
特別扱いする必要はどこにもないし。
918 :
デフォルトの名無しさん:04/01/02 22:58
>>911 ない。強いて言えば cout << static_cast<int>(n) ;
C++では (short)n みたいな書き方は辞めれ。
static_cast<>、dynamic_cast<>、reinterpret_cast<>を使いませう。
つーか、組み込みのプログラムとか組んでるとか、バイト数の節約しなきゃいけない理由が
なければ、shortじゃなくてintでいいと思うけど?
>>912 それもあんま良い方法じゃないな。
%d使う場合はint型にキャストしたほうがいい。
かぶった。逝ってきます。
> %d使う場合はint型にキャストしたほうがいい。
可変長引数は勝手にキャストされるけどね。
>>918 > %d使う場合はint型にキャストしたほうがいい。
言語仕様として格上げされることが保障されているから、必須ではない。
そこで明示的に int つけるかどうかは宗教の範疇なので、好きにしてくれ。
この場合は元がunsigned charだからいらないな。
sizeofが返すもの(size_t)やtime_tなどは正体(?)がどんな型なのかわからないからキャストする必要があるけど。
923 :
デフォルトの名無しさん:04/01/03 09:53
C/C++言語の勉強に最適な本はここで質問してもよろしいのでしょうか。
ダメでしたら、適切なすれをお教えくださいますでしょうか?
どうかよろしくお願いします。本当に無茶苦茶初心者です。
・当方C言語の知識(勉強始めたばっかり)
人の名前、身長、体重を持つperson構造体を作る
その構造体を連結リストにするための構造体を作る
あたらしい要素が加えられたら身長順(もしくは名前順、体重順)になるように
リストの追加位置を制御することができる。
ファイルをオープンして、そこから同様に連結リストや双方向リストを作ることができる。
・javaの知識
簡単なGUIアプリケーションを組むことができる。(自作クラス5つぐらい)
イベントの制御ができる(クリックとかキーイベントだけでなく、ctrl+何かとかも)
デザパタはObserverパターンが組める。
ソケット、スレッドも簡単なものなら作れる。(スレッドの同期はまだやってない)
iアプリの簡単なゲームを作って公開したことがある。
何かの機能を実装しようと思ったとき、クラスのAPIを見れば
なんとなく使うことができる。
C、C++、C#を勉強するにあたって、メジャーな本はあるでしょうか?
925 :
デフォルトの名無しさん:04/01/03 14:36
『標準入力からテキストファイルを読み込み、単語を検出して辞書順に並べ、出現頻度を標準出力に出力しなさい。』
って宿題があるのですが分かる方お願いします。オートマトンとかそういうのを使っていたと思うのですが・・・
928 :
デフォルトの名無しさん:04/01/03 15:11
>>927 何もできないガキ厨房はすっこんでろ。さっさと、違う板に逝け。
質問です。
クラスのメソッドって引数を括弧でくくらないといけないじゃないですか。
toire.benki( "unko" );
これを括弧なしで書く方法ってないですか?
toire.benki "unko";
C/C++でクラスのメソッドってのは適切な言い方じゃない。
それはともかくあらゆる関数およびマクロの引数は () でくくらないといけない。
演算子のオペランドは必要ないけど。
>>931 マジになるのはそれほど悪いことではないと思われ。
>>930 やっぱり、そうですか。
たしかにoperatorなんたら関数は括弧必要ないんですよね。
なんとかごまかして使ってみます。
ありがとうございました。
>>931 いや、ネタじゃないし。
(´-`).o( …。 よく読み返したら toire.benki("unko"); じゃネタと思われてもしかたないよなぁ )
935 :
デフォルトの名無しさん:04/01/04 04:01
クラスのメンバ変数をstaticでプライベートに宣言した物を
ソースファイルでグローバルで使うのが何故大丈夫なのか
わかりません。具体的には
classs hoge{
private: static HHOOK m_hHook;
}
これをソースで
HHOOK hoge::m_hHook=NULL;
みたいに代入してるのがあるんです。メソッドでもないのにプライベートメンバに
何故アクセスできるのでしょうか?
staticなメンバ変数はグローバルスコープ上で一度だけ初期化する決まりになってるから。
なるほど、そういうわけだったんですね(アセアセ
C++で簡単なデータ保存、読み込み(例えば暗号化したパス、ユーザー情報など)する場合、
一般的に使われる手法はなんでしょうか?
今のところ普通にファイル読み込んでstrtokで区切ってmapに入れて検索を考えています。
もっと簡単な方法やAPIなどがあれば教えて頂きたいです。
別にそれでええんじゃね?
>>938 用途によりけりだが、
簡単に済ませたければ、構造体をそのまま fread(), fwrite()
単純なデータ構造なら CSV みたいな単純なテキストフォーマットで書き出して、自前でパース
ポータビリティ重要なら XML
処理内容に特化した記述が必要なら (マクロとか)、適当な文法を定めて lex + yacc でパース
とか、そんな感じ。
検索機能が必要なら、既存のデータベースシステムを使うのも一手。でかいシステムなら
本格的に SQL を話せるサーバを使うことになるし、単純な key, value マッピングなら
Berkeley db とか ndbm とかを使う。
件数が少なくてメモリに余裕があるなら 938 のように、いったんメモリに全部読み込んで
std::map に叩き込んでもいいけど。
>>938 つーか strtok は渡された文字列変更する上にC文字列として扱うことが前提なんで
C++ のコンテナとはちょっと相性悪いぞ。
バッファの保存先として std::string なんかは使えないんで、
std::vector<char> を使うことになるけどお尻のナル文字の管理とか結構手間取ると思う。
>>941 同意。
C++ でトークン切り出したいなら、俺は boost の正規表現ライブラリを一押ししとく。
strtok() とかに比べると処理重いけどな。
string を使った strtok と似た機能を持つ関数かクラスかを作れば
いろいろと使い回しが効いて便利。
>>940 なるほど。データベースは食わず嫌いな所があって見もしなかったんですが
ちょっと考えたらmapはメモリ食うんですよね、
それを考えたら酷い事になりそうなのでSQLも勉強してみます
>>941-
>>942 そうですそうです。ナル文字があって処理に困りまくってました。
boostはまだあんまわかんないんですが見てみます。
>>939 とりあえず今回は
WritePrivateProfileString
GetPrivateProfileString
で入出力する事にしました。
みなさん、ありがとうございました。
map<string, string> config;
string key, value;
ifstream file("hoge.dat");
getline(file, key, '=');
getline(file, value);
config[key] = value;
はあかんのん?
946 :
デフォルトの名無しさん:04/01/04 17:21
フローチャートの書き方が詳しく載っている
サイトってどなたかしっていますか?
>>944 strtok の延長のようなものとして
区切り文字指定、文字幅指定等々でのトーカナイズ用に
boost::tokenizer というそのまんまのものがある。
ちょっとしたパージングには便利。
( regex や spilit ほどのパワフルさはねえけど)
あとは
>>945 みたいなデリミタ指定を伴う getline とかかね。
std::string に対して似たようなことしたいのなら find / find_first_of を使って
オフセットを取得する。
>>946 スレ違い。それ以前に検索してから問え。
949 :
デフォルトの名無しさん:04/01/04 17:57
CFile::Openや、CreateFileでファイルをオープンしようとした時に、
すでに他のプロセスで開かれ、他のアプリでのオープンを許可していない
場合に、アクセスが拒否されますが、
どのプロセスが今使用しているかの判別方法はありますでしょうか?
よろしくお願いいたします。
>>949 それは Win32 API スレで聞いたほうがいいと思うぞ。
前々から疑問なのですが、
intやlong型はメモリを解放しなくても大丈夫なのでしょうか。
例えば int[100] とか使ってる関数を何度も呼び出すと
そのうちメモリが足りなくなるなんて事は無いのでしょうか。
>>953 非スタティックなローカル変数は
スコープに入った時点で自動的にスタックに構築され
スコープを抜けた時点で自動的に解放される。
#再帰した場合は延々スタック消費しちゃうけど
すみません。
どなたか Human Interface Device 関連のプログラム組んだ事ある方〜
何か参考になる基礎的な本ってないでしょうか?
スレ違いだったら誘導願います。
958 :
デフォルトの名無しさん:04/01/07 10:40
C++のstringクラスで
各要素にアクセスしたいのですが
str[1]="m"
(こんな風にしたいのですが、うまくいきません)
どうすればよいのでしょうか?
str[1]='m';
string云々以前の問題だな。
ですね(汗
962 :
デフォルトの名無しさん:04/01/07 13:54
質問です
2つの文字列AとBが一致しているかどうかを判定したいのですが、
「文字列Bはワイルドカード入力対応」という条件が付いています。
自前の文字列判定処理を書くしかないのでしょうか?
環境はWindows2000 VC6.0です
ワイルドカードといっても色々だが、OSなんぞ書く前にその仕様を書けよ。
ワイルドカード対応の文字列比較は
再帰関数のいい練習問題になる。
>>964 再帰ですか。思いつきませんでした。
できそうな気がしてきたので、とりあえず作ってみます。
ありがとうございました。
再帰関数といったらハノイの塔の問題が感動したな
967 :
デフォルトの名無しさん:04/01/07 18:25
std::stringの中身のアスキー文字列を全て小文字に代えたいのですが,
そのような関数って無いのでしょうか?見つけられないのですが・・・
宜しくお願いします.
>>967 #include <string>
#include <algorithm>
#include <cctype>
std::string s("Hoge");
std::transform(s.begin(), s.end(), s.begin(), std::toupper);
訂正っす。
std::toupper => std::tolower
>>968様,
>>969様,ありがとうございました.
アルゴリズムの中にあったんですね・・・
本当にありがとうございました.
デバッグでF10で進めていった場合に
実行ファイルの最後でソースファイルの検索ダイアログってのが出ます。
出さないようにできますか?
スレ間違えました。すいません。
>>973 main か WinMain かを抜ける前に
F5 で実行継続すればそのまま終わってくれる。
I'm coming!
977 :
デフォルトの名無しさん:04/01/07 21:36
string型にint型を代入したいのですが、うまくいきません
string ss;
ss=(char)10;
のようにキャストしたらうまく行くと思ったのですが・・・
>>977 いくわけないっしょ。
文字コード 10 の文字 '\n' が代入されるだけだ。
sprintf か stringstream か boost::format を使いたまへ。
>>967 std::use_facet< std::ctype< char > >( std::locale() ).tolower( &s[0] , &s[0] + s.length() );
980 :
デフォルトの名無しさん:04/01/07 22:08
char aa(string ss1, string ss2);
という関数に、
aa(___FILE__,_LINE__);
として渡したいんですが、__LINE__のところでエラーが出てしまいます
何か解決方法はあるでしょうか?
>>980 #define AA aa(__FILE__,#__LINE__)
AA;
982 :
デフォルトの名無しさん:04/01/07 22:19
>string
>>980 #define LINE_STR STR(__LINE__)
#define STR(str) STR_(str)
#define STR_(str) #str
aa(__FILE__, LINE_STR);
ごめんミスった。
やっぱりだめだった・・・
>>987 VC7.0 はこういうマクロの展開の順番に問題があって多分無理。
sprintf か stringstream か boost::format を使って文字列にするか、
int のまま受け取るかすべし。
intで受けるか可変引き数で受けるか。
普通は __FILE__ を const char* で、
__LINE__ を int で受け取ることが多いような...。
>>990 多いって言うか、普通はそうするね。
処で、そのピリオド3つはなんの意味が?
992 :
デフォルトの名無しさん:04/01/08 09:07
記念カキコ v(^-^=)
三点リーダーのつもりだろ
んじゃ、そのあとの句点は、てんではなしにならないね。
↑???