【初心者歓迎】C/C++室 Ver.27【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/05/09(火) 23:08:28ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.26【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1143601166/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2006/05/09(火) 23:12:10PS3高いな乙
0003988
2006/05/09(火) 23:18:46このプログラムで、例えばABCDEって入力して、前の3文字を消して
DEって出力させたいと思ってます。
strcpyのプロト宣言っていうのは()の中が2つともchar型ってことでいいでしょうか?
0004デフォルトの名無しさん
2006/05/09(火) 23:20:53char じゃないよ char* と char const* だよ。
0005988
2006/05/09(火) 23:20:54#include <stdio.h>
#include <string.h>
int main(void)
{
int i,n;
char ss[80] , rr[80];
gets(ss);
n = strlen(ss);
for(i=3;i <= n; i++)
{
strcat(rr,ss[i]);
}
printf("%s\n",rr);
return 0;
}
出るエラーは「パラメータ '__src' は const signed char * 型として定義されているので int は渡せない(関数 main )」です。
0006デフォルトの名無しさん
2006/05/09(火) 23:21:25プロト宣言じゃないよプロトタイプ宣言だよ。
0007デフォルトの名無しさん
2006/05/09(火) 23:22:43printf("%s\n", ss + 3);
0008988
2006/05/09(火) 23:31:25おお、こんなことできるんですか!?
実は「出力したい」と書きましたが、最終的にはある文字列に新しく入力した文字列を
挿入するってプログラムを作りたいんです^^;
例えばABCDEFっていうところにabcを挿入して、ABCabcDEFって出力する感じで。
また少しプログラム変えたんですが、今度は画面に@が出てきたんですけど、
どうしてでしょうか?
#include <stdio.h>
#include <string.h>
int main(void)
{
char ss[80] , rr[80];
gets(ss);
strcat(rr,ss+3);
printf("%s\n",rr);
return 0;
}
0009デフォルトの名無しさん
2006/05/09(火) 23:33:270011デフォルトの名無しさん
2006/05/09(火) 23:37:56sprintf も頭に入れとけ。
0012デフォルトの名無しさん
2006/05/09(火) 23:45:56やっぱ頭が・・・
0013デフォルトの名無しさん
2006/05/09(火) 23:48:020014デフォルトの名無しさん
2006/05/09(火) 23:56:590015デフォルトの名無しさん
2006/05/10(水) 00:52:060016デフォルトの名無しさん
2006/05/10(水) 00:53:080017デフォルトの名無しさん
2006/05/10(水) 04:07:050018デフォルトの名無しさん
2006/05/10(水) 07:43:22char *hoge() {
return("うんこ");
}
int main() {
printf("%s\n",hoge());
}
だとなんのエラーも出ないけど
char *hoge() {
char str[16];
strcpy(str,"うんこ");
return(str);
}
int main() {
printf("%s\n", hoge());
}
だとローカル変数のポインタを返してると警告が出ますよね。
その通りだよなと納得はするんですがどうすればいいか思いつきません。
どうしましょう?
0019デフォルトの名無しさん
2006/05/10(水) 07:48:48hoge() は領域を引数で受け取るようにして main() で用意した配列を渡す。
または hoge() が malloc() して作成した領域を返すようにする。
0020デフォルトの名無しさん
2006/05/10(水) 07:52:430021デフォルトの名無しさん
2006/05/10(水) 07:55:03ちなみに今似たようなソースを探してたら
char str[16];を
static char str[16];
としてるやつにぶつかって、やってみたら警告も消えたんですが
これって何か問題ありますでしょか。
例は簡略化してますが、結果的にhoge()の中で文字列を操作して、
返ったあとには操作しない予定です。
0022デフォルトの名無しさん
2006/05/10(水) 07:57:43いいみたいっすね。どうもでした。感謝。
0023デフォルトの名無しさん
2006/05/10(水) 08:00:48繰り返し hoge() を呼び出して複数の変数に戻り値を格納した場合でも、
指している領域が同じであるということに気をつける必要がある。
1度目の呼び出しで得た(つもりの)結果が、2回目の呼び出しで
変更されている可能性がある。
またマルチスレッド環境で同時に呼び出すと破綻する。
0024デフォルトの名無しさん
2006/05/10(水) 17:24:17コンパイラC:\WINDOWS\デスクトップ\niko\bcc55\Bin\bcc32.exe
デバッカC:\WINDOWS\デスクトップ\新しいフォルダ\bin\TD32.EXE
どこかおかしいですかね?
0025デフォルトの名無しさん
2006/05/10(水) 17:28:350026デフォルトの名無しさん
2006/05/10(水) 17:31:45#include <stdio.h>
int main()
{
printf("Haiio word!\n");
return 0;
}
エラー E2209 c:\my documents\プロジェクト\tist\tist.c 3: インクルードファイル 'stdio.h' をオープンできない
さっきからやってるのに直らないんですが・・・
0027デフォルトの名無しさん
2006/05/10(水) 18:33:18BorlandC++Compiler 5.5はXPでも可能?
動作環境に入ってないんでインストールしようかどうしようかと(゜Д゜;)
0028デフォルトの名無しさん
2006/05/10(水) 18:42:46試せば?支障出るのが嫌なら仮想マシンでも出来るわけだし
0029デフォルトの名無しさん
2006/05/10(水) 18:43:00素直にVC++のフリー版使っとけ
0030デフォルトの名無しさん
2006/05/10(水) 18:50:24http://www.sourcenext.com/products/trueimage_p/
せめてこれを用意しておけ。駄目だったらすぐにリカバリすればいいんだから。
#中身はソース製じゃないよ
0031デフォルトの名無しさん
2006/05/10(水) 19:02:010032デフォルトの名無しさん
2006/05/10(水) 19:07:260033デフォルトの名無しさん
2006/05/10(水) 19:16:02とりあえず試してみます!
無理だったら>30のお世話になってVC++のフリー版を
落としてみます。お世話になりますた(´∀`)ノン
0034デフォルトの名無しさん
2006/05/10(水) 20:11:04パス通してbcc32.cfgとilink32.cfgにインクルードファイル置き場と標準ライブラリ置き場のパス書くだけやん
0035デフォルトの名無しさん
2006/05/10(水) 20:32:13特に3〜5月
0036デフォルトの名無しさん
2006/05/10(水) 22:20:54putsとリンクされてしまいます。オプションは最適化なし( -O0)で実行しています。
最適化ありだと分かるんですが、最適化なしでもこうなるものなのですか?
gccのバージョン1は4.0.2です。
0037デフォルトの名無しさん
2006/05/10(水) 22:26:12自分で
> putsとリンクされてしまいます。オプションは最適化なし( -O0)で実行しています。
と書いてんじゃねーか。それが答えだ。
0038デフォルトの名無しさん
2006/05/10(水) 22:57:48文字列リテラルの末尾を改行ではなく空白あたりにしてやるとputs()をリンクするのをやめると思うよ。
0039デフォルトの名無しさん
2006/05/10(水) 23:00:56prrintf("%s","hoge");
なら置換しないんじゃね?
0040デフォルトの名無しさん
2006/05/10(水) 23:02:43004139
2006/05/10(水) 23:04:56ぷりりんとエフになってた
004236
2006/05/10(水) 23:32:18無関係ということでいいんですね。ありがとうございました。
一応ソースさらしておきます。
#include <stdio.h>
int main ()
{
printf("hello, world\n");
}
0043デフォルトの名無しさん
2006/05/10(水) 23:33:440044デフォルトの名無しさん
2006/05/10(水) 23:46:26gcc3.2?ではwarning: implicit typename is deprecatedという警告が出力されます。
#include <vector>
template<class A>
class Test
{
std::vector<A> vvv;
public:
void method()
{
std::vector<A>::iterator it = vvv.begin(); // ここでエラー error: expected `;' before ‘it
}
};
0045デフォルトの名無しさん
2006/05/10(水) 23:55:13deprecated だったのがが正式に削除されただけ。何も不思議なことは無いな。
0046デフォルトの名無しさん
2006/05/10(水) 23:56:110047デフォルトの名無しさん
2006/05/11(木) 00:07:58動きました!ありがとうございました。
typenameというのをはじめて知りました。もっとちゃんと勉強しないとだめですね。
0048デフォルトの名無しさん
2006/05/11(木) 00:31:16警告とエラーメッセージに出てたはずなんだが。
コンパイラからのメッセージは読んどけよ。
0049デフォルトの名無しさん
2006/05/11(木) 00:45:47すみません。。。エラーメッセージの意味がよくわからなかったというのが正直なところです。。もっと精進します。
0050デフォルトの名無しさん
2006/05/11(木) 19:56:163つのint型整数を昇順に並び替える関数
void sort3(int *n1,int *n2,int n3)を作成せよ。
て問題があったんです。
一応できたんですけど、もっといいソースがあるとなんとなく思うんですけど
どうですか?
#include<stdio.h>
void swap(int *x,int *y)
{
int temp;
temp=*x;
*x =*y;
*y =temp;
}
void sort3(int *x,int *y,int *z)
{
if (*y<*x)
swap(x,y);
if (*z<*y)
swap(y,z);
if (*y<*x)
swap(x,y);
}
0051デフォルトの名無しさん
2006/05/11(木) 20:05:00書き方はどうあれ、アルゴリズム的にはバブルソートみたいだな
高々要素数が3個程度ならそれが最適だろう
下手に高級なソーティングアルゴリズムを使ったところで
要素数が少ないと逆に処理時間が増えるだけだからな
005250
2006/05/11(木) 20:11:56あとバブルソートってなんですか?
0053デフォルトの名無しさん
2006/05/11(木) 20:13:25普通はループを使って書かれるバブルソートと
アルゴリズム的に同じだけど
ループを使ってはいないというだけの話。
バブルソートに関しては、そのくらいはググれ。
0054デフォルトの名無しさん
2006/05/11(木) 20:25:05例えば他のソートアルゴリズムを3値に対して適応するとこうなる。
void sort3(int * x, int * y, int * z)
{
if (* y < * x) {
swap(x, y);
}
if (* z < * y) {
swap(y, z);
if (* y < * x) {
swap(x, y);
}
}
}
0055デフォルトの名無しさん
2006/05/11(木) 20:27:13ありがとうございました。
自分で考えてたんですけどループは思いつかなかったです。
自分でも書いた後にググれよなって思いました。すいません。
今回のをループ使うとどんな感じになるんですか?
一回配列に入れなおすんですか?
0056デフォルトの名無しさん
2006/05/11(木) 20:34:110057デフォルトの名無しさん
2006/05/11(木) 20:35:04すいません。書いた後に気付きました。
それはなんてい種類のソートアルゴリズムなんですか?
僕のとの違いは *z>*y だったときに計算量が減るってことでいいですか?
0058デフォルトの名無しさん
2006/05/11(木) 20:35:44void sort3(int* x, int * y, int* z)
{
if (*x <= *y){
if (*y <= *z){
} else {
if (*x <= *z){
swap(*y, *z);
} else {
swap(*x, *y);
swap(*x, *z);
}
}
} else {
if (*x <= *z){
swap(*x, *y);
} else {
if (*y <= *z){
swap(*x, *z);
swap(*x, *y);
} else {
swap(*x, *z);
}
}
}
}
0059デフォルトの名無しさん
2006/05/11(木) 21:01:31やっぱりですか。ありがとうございました。
>>58
最強ってなにが最強なんですか?計算量が最も少ないって事ですか?
0060デフォルトの名無しさん
2006/05/11(木) 21:05:06>>58 は意外と >>50 より遅いかもしれん。
0061デフォルトの名無しさん
2006/05/11(木) 21:06:350062デフォルトの名無しさん
2006/05/11(木) 21:08:400063デフォルトの名無しさん
2006/05/11(木) 21:11:44どう響いてくるかが問題だな。
最近の CPU は色々やってるからなぁ。
0064デフォルトの名無しさん
2006/05/11(木) 22:22:26ifの数と交換の回数数えればいいんですか?
0065デフォルトの名無しさん
2006/05/11(木) 22:23:590066デフォルトの名無しさん
2006/05/11(木) 22:25:45どうやって計るんですか?
ストップウォッチでは計れないくらい速くないですか?
0067デフォルトの名無しさん
2006/05/11(木) 22:28:56ループでそれぞれ何百万回と実行させて、
2つの処理での実行時間の差を見る。
0068デフォルトの名無しさん
2006/05/11(木) 22:28:590069デフォルトの名無しさん
2006/05/11(木) 22:32:340070デフォルトの名無しさん
2006/05/11(木) 22:35:050071デフォルトの名無しさん
2006/05/11(木) 22:42:57時間を計測する関数教えてもらえませんか?
main関数こんなんで良いですか?
int main(void)
{
int i,x,y,z;
for(i=0;i>1000000;i++)
{
x=1;y=2;z=3;
sort3(x,y,z);
x=1;y=3;z=2;
sort3(x,y,z);
x=2;y=1;z=3;
sort3(x,y,z);
x=2;y=3;z=1;
sort3(x,y,z);
x=3;y=1;z=2;
sort3(x,y,z);
x=3;y=2;z=1;
sort3(x,y,z);
}
return 0;
}
0072デフォルトの名無しさん
2006/05/11(木) 22:44:28環境依存だと言うとるのに
環境を言わずして答えられる筈が無い。
0073デフォルトの名無しさん
2006/05/11(木) 22:45:54実際の実行時間を知りたいなら計測すればいいけど、
比較や交換の回数を知りたいなら計算すればいい。
入力の3数が全て異なるとき、大小関係は6通りあるけど、
この6通りが等確率で現れるとすると、平均で、
>>50は比較3回、交換3/2回。
>>54は比較8/3回、交換3/2回。
>>58は比較8/3回、交換7/6回。
0074デフォルトの名無しさん
2006/05/11(木) 22:48:18条件付き演算とか色々あるからなぁ。
本当にそれだけで高速になるのかは
ちょっと計測してみないことには
何ともいえんなぁ。
0075デフォルトの名無しさん
2006/05/11(木) 22:48:37>for(i=0;i>1000000;i++)
これって……
0076デフォルトの名無しさん
2006/05/11(木) 22:58:10逆でした。すいません。
>>72
環境って何を書けばいいんですか?とりあえずコンパイルするときにでるのは
Borland C++ 5.5.1 for Win32 Copyright (c) 1993,2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997,2000 Borland
ってでます。
OSはXPです。
0077デフォルトの名無しさん
2006/05/11(木) 23:02:18なら timeGetTime っつー関数がある。
使い方はググればすぐ分かる。
0078デフォルトの名無しさん
2006/05/12(金) 00:01:08処理時間を計りたいならプロファイラ使え
0079デフォルトの名無しさん
2006/05/12(金) 00:10:15void swap(int *x,int *y)
{
int temp=*x;
*x =*y;
*y =temp;
}
void sort3(int *x,int *y,int *z)
{
if (*y<*x) swap(x,y);
if (*z<*y) swap(y,z);
if (*y<*x) swap(x,y);
}
int main(void)
{
int time,i,x,y,z;
time=timeGetTime();
for(i=0;i>1000000;i++)
{
x=1;y=2;z=3; sort3(&x,&y,&z);
x=1;y=3;z=2; sort3(&x,&y,&z);
x=2;y=1;z=3; sort3(&x,&y,&z);
x=2;y=3;z=1; sort3(&x,&y,&z);
x=3;y=1;z=2; sort3(&x,&y,&z);
x=3;y=2;z=1; sort3(&x,&y,&z);
}
time=timeGetTime()-time;
printf("%d",time);
return 0;
1時間くらい調べた結果がコレなんですがうまくいきません。ご教授願いたいです。}
0080デフォルトの名無しさん
2006/05/12(金) 00:17:38>for(i=0;i>1000000;i++)
これって……
0081デフォルトの名無しさん
2006/05/12(金) 00:20:50直してなかった…OTL
すいませんでした。
0082デフォルトの名無しさん
2006/05/12(金) 00:23:25ハ ( l ',____,、 (:::} l l l ,} / \
ハ ( .', ト───‐' l::l ̄ ̄l l │
ハ ( .', | l::|二二l | ハ こ .|
( /ィ h , '´ ̄ ̄ ̄`ヽ | ハ や │
⌒⌒⌒ヽ(⌒ヽ/ ', l.l ,' r──―‐tl. | ハ つ │
 ̄ ', fllJ. { r' ー-、ノ ,r‐l | ! め │
ヾ ル'ノ |ll ,-l l ´~~ ‐ l~`ト,. l |
〉vw'レハノ l.lll ヽl l ', ,_ ! ,'ノ ヽ ____/
l_,,, =====、_ !'lll .ハ. l r'"__゙,,`l| )ノ
_,,ノ※※※※※`ー,,, / lヽノ ´'ー'´ハ
-‐'"´ ヽ※※※※※_,, -''"`''ー-、 _,へ,_', ヽ,,二,,/ .l
 ̄ ̄ ̄ ̄ ̄ `''ー-、 l ト、へ
0083デフォルトの名無しさん
2006/05/12(金) 00:38:03これで>>50,54,58実行すれば有効なデータになりますか?
int main(void)
{
int time,sum,i,j,x,y,z;
sum=0;
for(j=0;j<10;j++)
{
time=timeGetTime();
for(i=0;i<1000000;i++)
{
x=1;y=2;z=3;
sort3(&x,&y,&z);
x=1;y=3;z=2;
sort3(&x,&y,&z);
x=2;y=1;z=3;
sort3(&x,&y,&z);
x=2;y=3;z=1;
sort3(&x,&y,&z);
x=3;y=1;z=2;
sort3(&x,&y,&z);
x=3;y=2;z=1;
sort3(&x,&y,&z);
}
time=timeGetTime()-time;
printf("%2d回目:%d\n",j+1,time);
sum+=time;
}
printf("平 均:%d",sum/10);
return 0;
}
0084デフォルトの名無しさん
2006/05/12(金) 00:47:08一つのプログラムでその関数を何十回何百回と使うなら
淫乱しちゃったほうが楽じゃないか?
0085デフォルトの名無しさん
2006/05/12(金) 00:47:180086デフォルトの名無しさん
2006/05/12(金) 00:47:50あまりにも一瞬で終わってしまうようなら、
中のループ回数を増やしてみれ。
0087デフォルトの名無しさん
2006/05/12(金) 00:50:16x, y, z を volatile にして、
volatile 消して sort に渡せばいいのか?
0088デフォルトの名無しさん
2006/05/12(金) 00:54:03淫乱ってなんですか?
>>85,87
もう少し説明をしていただけると幸いです。
>>50に書いたんですが、「入門編」をやってるんで、その程度の人間です。
>>86
わかりました。やってみます。
0089デフォルトの名無しさん
2006/05/12(金) 00:59:55インライン
0090デフォルトの名無しさん
2006/05/12(金) 01:05:160091デフォルトの名無しさん
2006/05/12(金) 01:10:51>>50
平均235
>>54
平均231
>>58
平均291
でした。
ところでコマンドプロンプトからコピペってできないんですか?
>>89
インラインをググって見たんですけどC++の話ができたんですが、
Cの関数形式マクロと同じことでいいんですか?
0092デフォルトの名無しさん
2006/05/12(金) 01:17:10>コマンドプロンプトからコピペ
システムメニュー(タイトルバーで右クリック)を使うか、
コマンドプロンプトについてるツールバーを使うか。
0093デフォルトの名無しさん
2006/05/12(金) 01:18:07>Cの関数形式マクロと同じことでいいんですか?
イエス
てか、クラス作ってそのなかで関数定義すれば、インライン宣言したものとして扱われるけどね
0094デフォルトの名無しさん
2006/05/12(金) 01:20:44マクロじゃ色々危険なこともできるから
導入されたんだろう。
0095デフォルトの名無しさん
2006/05/12(金) 01:25:27コピーの所が反転しててクリックできないんですが…
>>93
クラス?ググっても何かいてるか良く分からない…OTL
言い忘れてたんですが、C以外はやったことありません。
んでCもまだ「入門編」の途中までしか言っていない人間です。
0096デフォルトの名無しさん
2006/05/12(金) 01:30:59選択範囲ボタンを押して範囲選択、
しかる後にコピーボタンでクリップボードへコピー。
0097デフォルトの名無しさん
2006/05/12(金) 01:32:36んー
形としては、
・Cの構造体に、その中で通用する変数と処理関数を持たせたもの。
・「何か」についての関数群を一つにまとめたもの。
って感じかなぁ
0098デフォルトの名無しさん
2006/05/12(金) 01:32:57できました。ありがとうございます。
>>94
危険なこと?例えばどんなことですか?
そういえば>>60の通りでしたね。
0099デフォルトの名無しさん
2006/05/12(金) 01:44:44inline void swap(int *x,int *y) にすると違う結果になるかも。
0100デフォルトの名無しさん
2006/05/12(金) 01:47:53良かった良かった。
>>98
>危険なこと
よく言われることには
#define min(a, b) ((a) < (b) ? (a) : (b))
という小さい方の値を返すマクロは、
min(++x, y) とかすると
((++x) < (y) ? (++x) : (y))
と展開されて、++x < y が正しければ
++x が二回実行されていまう。
あとは引数の型チェックもない。
インライン関数を使えばこのあたりが全部解決する。
0101デフォルトの名無しさん
2006/05/12(金) 02:06:45できました。ありがとうございます。
ということでさっきのは消えてしまったのでもっかいやってみました。
>>50 >>54 >>58
1回目:239 1回目:233 1回目:287
2回目:237 2回目:233 2回目:298
3回目:236 3回目:232 3回目:286
4回目:237 4回目:233 4回目:296
5回目:237 5回目:232 5回目:293
6回目:236 6回目:235 6回目:294
7回目:237 7回目:236 7回目:296
8回目:237 8回目:236 8回目:300
9回目:236 9回目:233 9回目:280
10回目:237 10回目:233 10回目:301
平 均:236 平 均:233 平 均:293
>>97
構造体はまだ勉強してませんので、なんとなくですが
ファイルを会社とするとクラスが部で関数が課
見たいなことですか?
>>99
エラー E2141 ensyu10-2.c 5: 宣言の構文エラー
とでてコンパイルできませんでした。
>>100
へー。分かりました。ありがとうございます。
Cでもインライン関数って使えるんですか?
010299
2006/05/12(金) 02:12:230103デフォルトの名無しさん
2006/05/12(金) 02:22:34できました。
>>50 >>54 >>58
1回目:193 1回目:189 1回目:158
2回目:191 2回目:185 2回目:157
3回目:191 3回目:187 3回目:156
4回目:191 4回目:187 4回目:156
5回目:192 5回目:185 5回目:156
6回目:191 6回目:187 6回目:155
7回目:192 7回目:186 7回目:155
8回目:190 8回目:186 8回目:158
9回目:192 9回目:187 9回目:156
10回目:191 10回目:185 10回目:156
平 均:191 平 均:186 平 均:156
だいぶ違うんですね。何でこんな違う結果になるんですか?
ていうかこんな夜中まで付き合ってくれるみなさん優しいですね。
ありがとうございます。
0104デフォルトの名無しさん
2006/05/12(金) 02:31:03たとえば、ifを何個も用意するよりswitchの方が早い。
あとif文は if ( 条件 条件 条件 ) となってる時
左から判定していくから、処理を速くしたい時は
当てはまる確率がもっとも多そうなモノから書くのが良い。
だったよな?
0105デフォルトの名無しさん
2006/05/12(金) 02:50:38分岐をしっかり用意したから>>73のように平均では
処理回数が減ったからって事ですか?
inlineをつけた時とつけなかった時は結果が違うし、
なんでこんなにちがうんですか?
0106デフォルトの名無しさん
2006/05/12(金) 03:02:08条件判定や処理を「コレが出てきた時はこうするもの」と
あらかじめインラインを使うことでメモリに覚えさせておくことによって、
( switch も case 判定でメモリを使ってる)
その関数を読みに行ったりする処理に掛かる時間(手間)を省くことができる。
間違い有ったら指摘ヨロ
0107デフォルトの名無しさん
2006/05/12(金) 03:14:21全体的に速くなる理由はそれで納得できるんですが、
>>101と>>103で>>58の順位が全然違うのはなぜですか?
0108デフォルトの名無しさん
2006/05/12(金) 03:15:04関数を「読みに行く」というのは実際のどうさとはかけ離れたイメージ。
命令キャッシュの話だとすればインラインは逆効果。
初心者スレで不正確な情報を書くのは罪。
0109デフォルトの名無しさん
2006/05/12(金) 03:22:100110デフォルトの名無しさん
2006/05/12(金) 03:26:450111デフォルトの名無しさん
2006/05/12(金) 04:19:35C言語スレが落ちたけど、スレ立てられんかった。
今から新テンプレ投下するから、誰か代わりに立てて。
0112デフォルトの名無しさん
2006/05/12(金) 04:20:27このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
C言語なら俺に聞け! Part 126
http://pc8.2ch.net/test/read.cgi/tech/1145799128/l50
GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/l50
C/C++の宿題を片付けます 64代目
http://pc8.2ch.net/test/read.cgi/tech/1146323457/l50
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/l50
0113デフォルトの名無しさん
2006/05/12(金) 04:31:48たてたよ
つhttp://pc8.2ch.net/test/read.cgi/tech/1147375815/
0114デフォルトの名無しさん
2006/05/12(金) 04:32:17サンクス。
0115デフォルトの名無しさん
2006/05/12(金) 07:49:16メインスレッドでグローバル領域にset、複数起動する子スレッドでgetします。
get中のset、set中のgetは排他しますが、get中のgetは許可します。
(set中のsetも許可しますがsetがメインスレッドだけなのでありえない)
こういう排他の場合、クリティカルセクション、ミューテックス、セマフォ、その他のどれを用いるのがいいのでしょうか?
ちなみにクリティカルセクションの場合は二個使うことはできません。
0116デフォルトの名無しさん
2006/05/12(金) 08:29:17対象がAtomicに取り出せるのなら排他の必要がない希ガス。
そうでないならセマフォかねぇ。
0117115
2006/05/12(金) 09:01:13セマフォですね、ありがとうございます
0118デフォルトの名無しさん
2006/05/12(金) 09:27:49template<typename T>
class Hoge{
public:
void setHogeList(std::list<Hoge<T>*> &hoges);
private:
std::list<Hoge<T>*> hogeList;
};
template<typename T>
void Hoge::setHoge(std::list<Hoge<T>* &hoges){
std::list<Hoge<T>*>::iterator it;
}
error: expected `;' before "it"
std::list<Hoge<T>*> は宣言可能なのですが ::iterator をつけるとエラーを吐きます
std::list<Hoge<int>*>::iterator などは問題ないのですが…
どこを修正すればいいのでしょうか?コンパイラはMinGW3.4.2
0119デフォルトの名無しさん
2006/05/12(金) 09:33:000120デフォルトの名無しさん
2006/05/12(金) 09:34:30解決しました
ありがとうございました
0121デフォルトの名無しさん
2006/05/12(金) 11:55:40class A
{
void func(A);
};
void A::func(A a)
{
//処理
}
class B:public A
{
//処理など
};
この状況でAのfuncにBのオブジェクトを引数として渡すことって可能でしょうか?
わかる方いらっしゃいましたら教えていただけないでしょうか?
0122デフォルトの名無しさん
2006/05/12(金) 12:00:23自分で試せばわかるんじゃないか?
0123デフォルトの名無しさん
2006/05/12(金) 12:05:44class B;
class A
{
void func(B);
};
class B:public A
{
//処理など
};
void A::func(B b)
{
//処理
}
0124デフォルトの名無しさん
2006/05/12(金) 12:15:29エスパー乙。
だが「この状況で」っていうことだから、状況を変えちゃダメだろう。
>>121
まず func() を public にしないと無理っぽい。
0125デフォルトの名無しさん
2006/05/12(金) 14:58:19double *p2 = new double[2];
と配列を確保して処理をした後に
delete[] p1,p2;
と解放しようとすると、p1の指す領域は解放されるのにp2のそれは
解放されないようなのですが、C++ってこういう仕様なんですか?
どんな教科書の例を見ても、配列の動的確保はひとつしかやっていないので
上のような複数の配列の確保と解放については書かれていないんです。
0126デフォルトの名無しさん
2006/05/12(金) 15:01:38その式は以下と同等。
(delete[] p1),p2;
deleteは文でなく演算子であり、コンマ演算子と共存できる。
0127デフォルトの名無しさん
2006/05/12(金) 15:03:06// p1,p2はp2と等価だからp2のみ解放じゃない?
0128デフォルトの名無しさん
2006/05/12(金) 15:04:430129デフォルトの名無しさん
2006/05/12(金) 15:06:370130デフォルトの名無しさん
2006/05/12(金) 17:33:59>for(i=0;i<1000000;i++)
こんなことせずにTSC使えば?
0132デフォルトの名無しさん
2006/05/12(金) 19:46:56環境依存コードは使わない方向でお願いします。
openofficeなどの表計算ソフトで作られた表ファイルを
string[縦][横] みたいな領域に格納する方法はありますか?
あるとしたら、その中で最も高速な手段は何ですか?
0133デフォルトの名無しさん
2006/05/12(金) 19:47:540134デフォルトの名無しさん
2006/05/12(金) 19:49:33何が言いたいのかよく分からん
自分の文章読み直してみろ
それと表計算ソフトが吐くのは基本的にCSVだから
順番に読んでいけば一行ずつ読める
0135デフォルトの名無しさん
2006/05/12(金) 19:59:07諦めるのが最も高速だよ。
0136デフォルトの名無しさん
2006/05/12(金) 20:00:09char *str_copy(char *d,const char *s)
{
char *t=d;
while(*d++ = *s++)
;
return (t);
}
int main(void)
{
char s1[128]="ABCD";
char s2[128]="EFGH";
printf("文字列S1:");
scanf("%s",s1);
str_copy(s2,s1);
puts("s1をs2にコピーしました。");
printf("s1=%s\n",s1);
printf("s2=%s\n",s2);
return 0;
}
これのreturn(t)の意味が分からないので教えてもらえませんか?
何にも使われていないように思えるんですけど…
0137デフォルトの名無しさん
2006/05/12(金) 20:04:15戻り値を捨てるのは普通の事だと思うが。
例えば、printfは出力した文字数を返すけど、そのコードでは捨てられている。
0138デフォルトの名無しさん
2006/05/12(金) 20:22:52そうなんですか。したら別にvoid型でも良いと思うのは初心者の甘い考えですか?
0139デフォルトの名無しさん
2006/05/12(金) 20:24:55その例だとvoidでも問題ないと思う。
第一引数を返すようになってるのは標準ライブラリのstrcpyを模倣したからだと思う。
strcpyがなんで第一引数を返すのかは俺も知らね。
0140139
2006/05/12(金) 20:26:290141デフォルトの名無しさん
2006/05/12(金) 20:26:46>>137が言っているのはstr_copy(s2,s1);のここでの使い方に関して。
文字列操作関数で出力先のポインタを返すのにはちゃんとした意味がある。
0142デフォルトの名無しさん
2006/05/12(金) 20:27:13>何が言いたいのかよく分からん
[入力]
・ 表ファイル (例 *.xls, *.sxc )
[出力]
・ 二次元配列 (例 string[10][10] graph )
>表計算ソフトが吐くのは基本的にCSVだから
>順番に読んでいけば一行ずつ読める
シート名を指定するとか、連結セルを含む表とか、関数式を読み取る際には式/値のどちらを取得するのかを選択するなど、
応用的な状況にも対応したいのです。
0143デフォルトの名無しさん
2006/05/12(金) 20:29:02そんな戻り値を利用するより、
別な書き方した方が読みやすいと思う。
0144デフォルトの名無しさん
2006/05/12(金) 20:31:480145デフォルトの名無しさん
2006/05/12(金) 20:33:59がスマートな書き方だと当時最も正統な解説書に書かれている時点で
凡俗が読みやすさ云々と言っても無意味。
0146デフォルトの名無しさん
2006/05/12(金) 20:36:04strcpy(a, strcpy(b, c));
とか、
puts(strcpy(a, b));
とか書けるな。
読みにくいとも思わんが、これが便利な状況は限られる気がする。
0147136
2006/05/12(金) 20:38:43もう少し詳しく教えていただきたいです。
>>141
ちゃんとした意味があるんですか。
そしたらその意味を教えていただきたいんですが…
>>145
たぶん僕が書いたコードについていってると思うんですが
まったく意味が分からないのですが、説明願えますか?
0148デフォルトの名無しさん
2006/05/12(金) 20:50:33>>145はどうみても>>143に対してだろ
char *pch = strcpy(hoge, (char*)malloc(strlen(hoge)+1));
こんな楽しいこともできるな(多分)
0149デフォルトの名無しさん
2006/05/12(金) 20:55:18志村ー引数逆、逆。
つーか、malloc の戻り値チェックしろよw
0150デフォルトの名無しさん
2006/05/12(金) 21:04:20処理系というものが、必要だと聞いたんですが、
どのように用意すればいいんでしょうか?
すれ違いかもしれませんが、お教え願いますか?
0151デフォルトの名無しさん
2006/05/12(金) 21:11:24>>>140
>もう少し詳しく教えていただきたいです。
例えばa=10という式の値は、代入後のaの値と同じになる。だから、
int a, b;
a = (b = 10); /* または単に a = b = 10; */
というコードはaとbに10を代入するし、
double a;
printf("%f", a = 10);
というコードは例えば10.000000を表示する。
strcpyが第一引数を返すのは、ちょうどこれに対応する。つまり、
strcpy(a, strcpy(b, "foo"));
はaとbに"foo"をコピーするし、
printf("%s", strcpy(a, "foo"));
はfooと出力する。
0152デフォルトの名無しさん
2006/05/12(金) 21:15:40処理系っつーのは、要するにコンパイラとかそういうもの。
Windows なら今なら Visual Studio Express Editions がいい。
https://www.microsoft.com/japan/msdn/vstudio/express/
Linux や Mac なら gcc かな。
Linux なら最初から入ってるはず。
Mac なら Develper's Tools とかいうのが OS に付いてきて、
それインストールすれば使える。
XCode っていいう開発用のツールもある。
0153デフォルトの名無しさん
2006/05/12(金) 21:16:01スマン、間違ったw
char pchTemp;
char *pch = strcpy((pchTemp=(char*)malloc(strlen(hoge)+1)?pchTemp:return -1), hoge);
動くかはしらんがこれでどうよ?w
0154デフォルトの名無しさん
2006/05/12(金) 21:20:10return は式じゃねぇw 文だw
0156136
2006/05/12(金) 21:24:21わかりました。ありがとうございます。
引数として出力できることで
作業が同時に行えるようになるって事ですよね?
>>148の楽しさが全く分からないのでもっと勉強します。
015799
2006/05/12(金) 21:44:42>108じゃ無いけど気になったので調べてみた。
内側のループ1回のうちswap処理は>50で9回、>58で7回行われる。
という事はinlineでswap1回分の処理時間が短縮されるなら、>58に比べ>50がより処理時間が縮むはず。
しかし実際は>58がより処理時間が縮んでいる。
つまりinlineでの時間短縮以外の要因があるという事だ。
bccが出力するアセンブラコードを確認してみたところ、>58のコードでswapが2回連続して出てくる所に違いがあるようだ。
inline無しだと2回関数が呼ばれるが、inline有りだと1.5回分ぐらいのコードになっている。
つまり>58のコードは、inline付きの場合swap処理1回分の時間が短縮されている事になる。
おそらくそれが全体の時間短縮に繋がっているんじゃないか。
実際に時間を調べた訳じゃ無いが多分これで合ってると思う。
0158アマグラマ
2006/05/12(金) 22:52:57引数の型が参照の時にも引数として関数入れても同じことだ。
0159デフォルトの名無しさん
2006/05/12(金) 23:05:40ありがとうございます。
ということは連続すればするほどinlineの効果が高くなるってことですよね?
inline使うデメリットってあるんですか?
0160デフォルトの名無しさん
2006/05/12(金) 23:08:47inline 関数の中身が多少大きいと、
それを全箇所に埋め込むわけだから、
実行ファイルのサイズが大きくなる。
あまり大きいと、inline 展開されない可能性もあるけどね。
0161デフォルトの名無しさん
2006/05/12(金) 23:30:33>連続すればするほどinlineの効果が高くなるってことですよね?
いや、今回たまたま。
swap(x,y);とswap(x,z);が並んでいたので、swap(xの部分が共通で使えたってだけみたい。
もう1つ変数zzがあってswap(x,y);とswap(zz,z);が並んでいたら多分短縮できない。
実際、swap関数を#define swap(x,y) temp=*x;*x=*y;*y=temp;に変えてみたら遅くなった。
0162デフォルトの名無しさん
2006/05/12(金) 23:33:07以下のコードが、Cだと通るのですが、C++だと通りません。
AllocBuffer( &pBuffer, 20 )のところで、
コメントに書いてあるコンパイルエラーが出ます。
これってキャストとアドレス演算子をどう書けばいいのでしょうか?
VC++2005です。
#include <stdafx.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void AllocBuffer( void** pBuffer, int size )
{
*pBuffer = malloc( size );
}
int main()
{
char* pBuffer = NULL;
AllocBuffer( &pBuffer, 20 );
/*ここで
error C2664: 'AllocBuffer' : 1 番目の引数を 'char **__w64 ' から 'void **' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
*/
strcpy( pBuffer, "TEST" );
printf( "[%s]n", pBuffer );
}
0163デフォルトの名無しさん
2006/05/12(金) 23:38:280164デフォルトの名無しさん
2006/05/12(金) 23:49:150165デフォルトの名無しさん
2006/05/13(土) 00:09:09void* vpBuffer = NULL;
AllocBuffer(&pBuffer, 20);
char* pBuffer = (char*)vpBuffer;
の方が安全?
まあ、どうでもいいんだろうけど。
0166デフォルトの名無しさん
2006/05/13(土) 00:27:22初心者に安易に無茶なキャストを勧めるのは感心しないな。
0167デフォルトの名無しさん
2006/05/13(土) 00:29:33自分で推奨できるものを書いてからにしようね
0168デフォルトの名無しさん
2006/05/13(土) 01:09:56>>165 が最も推奨されるコードだろう。
ただ、細かい話をすれば
void** なんてものは C 的に随分怪しいものになる。
C FAQ 4.9 を参照。
0169デフォルトの名無しさん
2006/05/13(土) 01:32:42C FAQ 4.9 を読んでみました。
「参照呼び出しに使うため汎用のポインターを関数に渡す」の意味がわからなかったです。
これはどういうことがしたいんでしょう?
0170デフォルトの名無しさん
2006/05/13(土) 02:11:25char* とか int* とかの変数のアドレスを
void** に渡すのがイリーガルという話だと思う。
しかし・・・どうなんだろうな。
そいつらはともかくとして、
void* 変数のアドレスを void** に渡すことは
問題ないと思うんだが、これもダメなのか?
0171デフォルトの名無しさん
2006/05/13(土) 02:19:36いや、何も問題ないだろう。
0172デフォルトの名無しさん
2006/05/13(土) 02:28:20>>163-164
バッサリ斬られてるな。
0173デフォルトの名無しさん
2006/05/13(土) 02:33:590174デフォルトの名無しさん
2006/05/13(土) 02:50:37キャストを static_cast にすると、いっそうおk
0175デフォルトの名無しさん
2006/05/13(土) 03:43:110176デフォルトの名無しさん
2006/05/13(土) 03:47:06> 以下のコードが、Cだと通るのですが、C++だと通りません。
0177デフォルトの名無しさん
2006/05/13(土) 03:47:550178デフォルトの名無しさん
2006/05/13(土) 05:33:30のメンバへの振り分けをしてるようなのですが
なんとなくでしか理解出来ないです。
どなたか教えていただけないでしょうか
typedef struct tagPOINTS
{
SHORT x;
SHORT y;
} POINTS,
#define MAKEPOINTS(l) (*((POINTS FAR *)&(l)))
上記のMAKEPOINTS(l)というマクロでマウスの現在のx軸y軸をPOINTS構造体
に振り分けてるようなのですが、どうやって振り分けてるのかがわかりません
FAR = farポインタを使ってるので上位と下位のビットでそれぞれに振り分けてるのだろう
とおもっていますが、例えば
POINTS start
start = MAKEPOINTS(0x000f000fL) として
start.xとstart.yは共に15という数字になります。
用は(*((POINTS FAR *)&(l)))の展開のされ方がさっぱりわかりません。
マクロ関数は少しだけなら理解してるつもりですが、このような式を理解
出来るレベルじゃないので、どなたか分かられる人、ご教授願いたいです。
0179デフォルトの名無しさん
2006/05/13(土) 05:51:33演算をいっこずつ分解していけばいいんじゃないか?
long l = 0x000f000fL;
long* lp = &l;
POINTS FAR* pp = (POINTS FAR*)lp;
POINTS pt = *pp;
start = pt;
さぁ、わからないのはどこかね?
0180デフォルトの名無しさん
2006/05/13(土) 09:29:36振り分けてなんかいない。2つ並んだ16bitのshortに32bitの値をそのまま上書きしてるだけ。
0181デフォルトの名無しさん
2006/05/13(土) 09:38:11typedef union tagMAKEPOINTS_UNION {
LONG l;
POINTS pt;
} MAKEPOINTS_UNION;
MAKEPOINTS_UNION mkpt;
mkpt = 0x000F000FL;
start = mkpt.pt;
みたいなもん。
MAKEPOINTS(0x000f000fL) は定数のアドレス取れないから失敗するけど、
まあそれは面倒だから略して書いただけと解釈しとく。
0182デフォルトの名無しさん
2006/05/13(土) 09:38:53× mkpt = 0x000F000FL;
○ mkpt.l = 0x000F000FL;
ね。
0183デフォルトの名無しさん
2006/05/13(土) 10:12:32そこがFARポインタかどうかは関係ない。
sizeof (POINTS)とsizeof (LONG)やその他幾つかの整数型の大きさは同じ。
だからPOINTS型の値のビットの並びをそのまま整数型のビットの並びとして扱うことができ、
そうしてウィンドウプロシージャでは整数型として送ってくることがある。
それを元々のPOINTSのビットの並びとして使えるようにするためのマクロがMAKEPOINTS。
0184デフォルトの名無しさん
2006/05/13(土) 14:24:080185デフォルトの名無しさん
2006/05/13(土) 17:02:210186デフォルトの名無しさん
2006/05/13(土) 23:40:39私は最初#defineなどヘッダに加えてインクルードしていましたが、最近になって
特定のCのソースしか#defineをつかってないならヘッダに書くのではなくソースの中で
定義したほうが、いいのではないのか?さらに特定に関数しか使用しないのなら
関数の中で#defineを定義したほうがいいのでは、と思うようになりました。
Cでカプセル化?を意識するなら、他にどのようなことを心がければいいのでしょうか?
0187デフォルトの名無しさん
2006/05/13(土) 23:53:12インターフェースは最小限で、完全なものを目指す。それだけだ。
0188デフォルトの名無しさん
2006/05/14(日) 01:56:08#define は { } のスコープに束縛されないから、
関数の中で #define したところで、
それより下全部で有効になる。
関数の最後で #undef しる。
0189178
2006/05/14(日) 08:50:50要は、自分の知識としてこういう事が
出来ると言うことを知らなかっただけでした
自分なりに、関数に戻してみて「あってんのか、これ?」
と思い以下のようなプログラム
#include <stdio.h>
typedef struct test{
short y;
short x;
} test;
test *Point_1(long *stack){return (test *)stack;}
int main(){
long B = 0x000f000fL;
test *g;
g = Point_1(&B);
printf("%08x\n",*g);
printf("%04x\t%04x\n",g->x, g->y);
printf("%p\t%p\n",&g->x, &g->y);
return 0;
}
で試してみたら出来ました。ただ、初めてこういう事が出来る
という事をしって、Bを0x12345678としたところ>>182さんの言う
共用体のような振る舞い(リトルエディアン)もしていて、かつC++のコンストラクタ
のようにメンバ変数をこういう形でも初期化できるのかとこれまた初めて知りました。
とにかく知識が新しく増えたのと、教えてくれた方々に感謝です。
0190デフォルトの名無しさん
2006/05/14(日) 08:52:10こんな知識を使うことが無いようにな。
0191デフォルトの名無しさん
2006/05/14(日) 11:02:37VC6のrand関数使って8ビットの乱数を取得するときって
�@rand() & 0xff
�Arand() >> 7
のどっちが良い乱数ですか?
0192デフォルトの名無しさん
2006/05/14(日) 11:16:000193デフォルトの名無しさん
2006/05/14(日) 12:45:02乱数の質から言えば一般的には後者。
でもRAND_MAXを32768と決め打ちにするので、
RAND_MAXを使って除算する方法を使うほうがいいと思う。(そし最適化に期待する)
0194デフォルトの名無しさん
2006/05/14(日) 13:35:030195デフォルトの名無しさん
2006/05/14(日) 14:50:39>関数の中で #define したところで、
>それより下全部で有効になる。
>関数の最後で #undef しる。
知らなかった・・・ありがトン
・・・で結局ヘッダには何を書くのが最良?公開すべき関数の宣言や#defineのみでしょうか?
0196デフォルトの名無しさん
2006/05/14(日) 15:18:48>>187
0197デフォルトの名無しさん
2006/05/14(日) 15:32:52空のヘッダで足りるなら空のままにしておくぐらいの気持ちで。
0198デフォルトの名無しさん
2006/05/14(日) 15:53:28キーボードからscanf関数を使って整数型と文字型の変数を
入力させようと次のようにすると、文字型変数に空白が
代入されてしまいます。
int m;
char c;
printf("m=");
scanf("%d",&m);
printf("c=");
scanf("%c",&c);
整数型のmと文字型のcの順番を逆にするとうまくゆきますが、
上の書き方だと何がいけないのでしょうか。
どなたか教えてください。
0199デフォルトの名無しさん
2006/05/14(日) 16:17:40printf("m c =");
scanf("%d %c",&m,&c);
0200デフォルトの名無しさん
2006/05/14(日) 16:27:33お返事ありがとうございます。
確かにうまくゆきますが、
198で述べた書き方だとどうしていけないのでしょうか??
0201デフォルトの名無しさん
2006/05/14(日) 16:38:50最初のscanf()を成立させるために入力した改行文字が次のscanf()で拾われるため。
これがscanf()が嫌われる理由のうちの一つ。
0202デフォルトの名無しさん
2006/05/14(日) 16:41:09次にscanf()するとその改行文字を読み出してしまう
0204デフォルトの名無しさん
2006/05/14(日) 17:35:17無料で使えるC++のコンパイラでお勧めなのありませんか?
0205デフォルトの名無しさん
2006/05/14(日) 17:37:36これ以上のC++コンパイラはない
windowsならcygwinをインストールすると勝手に入る
0206デフォルトの名無しさん
2006/05/14(日) 17:42:37cygwinをDLすればいいんでつね(・ω・`
やってみます
ありがとうございました
0207デフォルトの名無しさん
2006/05/14(日) 17:45:000208デフォルトの名無しさん
2006/05/14(日) 17:51:27char * にキャストしたいんだけど、クラスを書きえない場合はどう書けばいい?
0209デフォルトの名無しさん
2006/05/14(日) 17:55:47(char *)(wchar_t *)x;
(char *)x.operator wchar_t *();
0210デフォルトの名無しさん
2006/05/14(日) 17:59:09うちの会社ではインターネットショップのホームページを作る仕事をしています。
使っている言語は主にC++です。
しかし最近はC#を使うこともありますよ。
だけどVBの案件が来たらC#にしてくださいと説得しますし、
Java場合もそうですね。
ですから今のところ、私のような中年はC++/SLIを使い、
若手はC#を使うという感じでやっております。
私の会社はもともとパッケージソフトを作っていたこともあって、
中年以上の社員は基本的にC++を扱えるんですね。
ブロードバンドが盛んになってきたあたりから、
思い切って方向転換をしたんです。
日本ではC#よりもVBのほうが浸透していることは知っていますが、
あえて若手にC#をやらせているのは将来のことを考えてのことです。
C#の将来性という意味ではなくC#に関する知識の将来性といいますか、
汎用性といいますか、端的に申しますと、VBの知識はVBにしか使えないが、
C#の知識はC言語系の言語ならば、十分応用が効くということですね。
0212デフォルトの名無しさん
2006/05/14(日) 18:37:100213デフォルトの名無しさん
2006/05/14(日) 18:48:50>>152
0214デフォルトの名無しさん
2006/05/14(日) 18:53:10コンパイラとしてはg++の方がいいと思うが、
使いやすいのはVisual Studio Express Editionsの方かもな
0215デフォルトの名無しさん
2006/05/14(日) 19:27:220216デフォルトの名無しさん
2006/05/14(日) 19:33:47gcc: GCC の C コンパイラ
g++: GCC の C++ コンパイラ
0217デフォルトの名無しさん
2006/05/14(日) 19:38:240218デフォルトの名無しさん
2006/05/14(日) 19:45:100219デフォルトの名無しさん
2006/05/14(日) 19:56:150220デフォルトの名無しさん
2006/05/14(日) 20:20:42cygwinDLしたものの使い方が分からなかったので
Visual Studio Express Editionsを使ってみたんですが
//hello.cpp
#include <iostream>
using namespace std;
int main()
{ cout << "hello" << endl;}
という簡単なソースを入力してデバックなしで開始をしたら
コンパイルしています...
hello.cpp
c:\documents and settings\名前\my documents\visual studio 2005\projects\hello\hello\hello.cpp(17)
: fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。
'#include "stdafx.h"' をソースに追加しましたか?
というものが出てきてコンパイル出来ません(´・ω・`)
よく分からないから#include "stdafx.h"を試しに先頭に付け加えても同じ結果になります。
どうすればいいんでしょうか?
0221デフォルトの名無しさん
2006/05/14(日) 20:29:11stdafx.h と stdafx.cpp を消したんじゃね?
hello.cpp の設定
(ファイルを右クリックしてメニューの一番下・・・だったっけ?)
にあるプリコンパイル済みヘッダファイルの設定で、
プリコンパイル済みヘッダファイルを使わないようにすればいい。
このあたり面倒なら、プロジェクト作る時
空のプロジェクトを作るようにすればいい。
0222デフォルトの名無しさん
2006/05/14(日) 20:33:27�dクス
仰るとおり消したのがよくなかったみたいです(・ω・´
0223デフォルトの名無しさん
2006/05/14(日) 22:43:24おもしろい奴だな。
0224質問者
2006/05/15(月) 01:07:25SBufと言う構造体をつくりメンバ変数として下記を持っています。
SBuf* m_Buf;
これをコンストラクタで下記のように実体を作成しています。
m_Buf = new SBuf[10];
ソースの途中でバッファが足りなくなったので、あるメンバ関数
内で下記のように記述しましたが、たまに強制終了します。
●ソース1
void C***::***(){
SBuf* ipBuf;
ipBuf = new SBuf[20];
memcpy(ipBuf,m_Buf,sizeof(SBuf)*10);
delete[] m_Buf;
m_Buf = ipBuf;
}
上記メンバ関数を下記のように書き直したところ、強制終了が無く
なったような気がします。
0225224
2006/05/15(月) 01:09:13void C***::***(){
SBuf* ipBuf;
ipBuf = new SBuf[20];
memcpy(ipBuf,m_Buf,sizeof(SBuf)*10);
delete[] m_Buf;
m_Buf = new SBuf[20];
memcpy(m_Buf,ipBuf,sizeof(SBuf)*10);
delete[] ipBuf;
}
上記の「強制終了が無くなった気がする」と言うのは、
1.ソース1は明らかに間違っており、そこをソース2に直したので
強制終了がなくなった可能性が高い。
2.ソース1でも問題ないので、ソース2に直したのは全く関係が無い。
気づかないうちに他のところを一緒に修正したのか、それとも全く
治っていないのでその内また問題出る可能性が高い。
のどちらでしょうか?
0226デフォルトの名無しさん
2006/05/15(月) 01:11:38SBufの中身を書いてクレ
0227224
2006/05/15(月) 01:15:25勘違いを招きやすい点を一点補足します。
>>224
> SBufと言う構造体をつくりメンバ変数として下記を持っています。
> SBuf* m_Buf;
m_Bufをメンバ変数に持っているのはSBufではありません。
全く別のC***というクラスが持っています。
>>226
単純なDWORDを2個持っているだけの構造体です。
メンバ関数は持っていません。
0228デフォルトの名無しさん
2006/05/15(月) 01:22:50デバッガでどこで落ちてるのか調べたか?
少なくともソース2の修正は全く無意味だぞ
0229デフォルトの名無しさん
2006/05/15(月) 01:23:42コードいじって貼ってるだろ。そのまま貼ったほうがいいだろうねぇ。
std::vector 使うと、解決しちゃうかもね。
0230デフォルトの名無しさん
2006/05/15(月) 01:25:24そのコードで気になる点を。
SBufを20個確保し、先頭10個に以前のデータを代入、ここまではいい。
ただ、残り後半の10個は未初期化のままだが、いいのか?
コンストラクタで明示的に初期化しない限り、0初期化は保証されてないぞ。
その値を別の場所で使おうとして落ちてたりはしないか?
0231デフォルトの名無しさん
2006/05/15(月) 01:37:46大元のソースはかなりでかいので、気になる点を単純化して
貼りました。
>>230
その後また代入して使いますのでこれは問題ないと思います。
>>228
> 少なくともソース2の修正は全く無意味だぞ
私の求める答えは現時点ではこれで十分です。
ソース2に修正したらとりあえず出なくなったので、「これが原因だっ
たのかなぁ?」と疑問に思ったので質問させていただきました。
根本原因がソース2に無い時点で、見直さなければならないことが
たくさんあるりますので、その辺をもう少し見直してまた追って報告
します。
0232デフォルトの名無しさん
2006/05/15(月) 01:41:41単純化したコードで問題が再現することは確かめたか?
0233デフォルトの名無しさん
2006/05/15(月) 01:54:440234デフォルトの名無しさん
2006/05/15(月) 06:41:50だからここで確かようとしてるんだろ
デバッガ=ここの回答者
0235デフォルトの名無しさん
2006/05/15(月) 17:56:02memset(array, 1, sizeof(array));
で初期化したのですが、short型で初期化した場合、
257 で初期化されてしまいます。
どうすれば1で初期化できるでしょうか?
レベルの低い質問ですみません。
0236デフォルトの名無しさん
2006/05/15(月) 19:19:14素直にforで回して1を代入
0237デフォルトの名無しさん
2006/05/15(月) 19:52:290238デフォルトの名無しさん
2006/05/16(火) 16:37:48ありがとうございます
0239デフォルトの名無しさん
2006/05/17(水) 10:08:52簡単な2次元座標を表す構造体
struct Point { int x,y; };
を計算して返す関数 GetPoint を作成する時、
Point GetPoint() {
Point p;
// p.x, p.yを計算するための処理
return p;
}
と書くよりも、(PODにするのを止めて)Pointにx,yを引数に取るコンストラクタを定義し
Point GetPoint() {
int x, y;
// x, yに座標を計算
return Point(x, y);
}
と書いた方が、テンポラリオブジェクトの作成を一段階減らすことができると考えてよいのでしょうか?
また、そうすべきなのでしょうか?
0240デフォルトの名無しさん
2006/05/17(水) 10:26:380241デフォルトの名無しさん
2006/05/17(水) 12:06:40リターン直後にスコープから外れてる気がするけど
0242デフォルトの名無しさん
2006/05/17(水) 12:07:33実体返しだったか。
0243デフォルトの名無しさん
2006/05/17(水) 18:08:30RVOなんて略語を使わずに戻り値最適化と日本語で書いて欲しい。
アセンブラコードを見るのが手っ取り早いのでは。
>240
勝手に条件を限定するのは良くないだろ。
0244デフォルトの名無しさん
2006/05/17(水) 18:53:530245デフォルトの名無しさん
2006/05/17(水) 19:15:200246デフォルトの名無しさん
2006/05/17(水) 19:43:00規格上RVOが適用されるのは後者だろうな。
0247デフォルトの名無しさん
2006/05/17(水) 19:57:00main.cとsub.c、test.hをつくります。
test.hでグローバル変数を宣言すると1 つ以上の複数回定義されているシンボルが見つかりました。
となってしまいます・・。test.hをどう直せば?
#pragma once
void outString(void);
#ifndef TEST_H_
int Hensu = 0;
#else
extern int Hensu;
#define TEST_H_
#endif
0248デフォルトの名無しさん
2006/05/17(水) 20:00:550249デフォルトの名無しさん
2006/05/17(水) 20:17:49まず勘違いしてるようだけど、#defineで定義した定数・マクロは
翻訳単位(つまり各ソースファイル)をまたいで有効にはならない。
main.cでtest.hをincludeしてTEST_H_がdefineされても、
sub.cでtest.hをincludeした時には、それはdefineされていないことになっている。
だからmain.c、sub.cでそれぞれint Hensu=0;が定義されてしまい、多重定義エラー。
通常は、ヘッダファイルには
extern int Hensu;
だけ書いておき、ソースファイルのどこか(どれでもいいが、わかりやすいところ)に
int Hensu = 0;
を定義する。
0250デフォルトの名無しさん
2006/05/17(水) 22:41:40VisualStudioSpokeでc++のプログラムを作っています。
ダイアログプロシージャを使ったのですが、ダイアログプロシージャの部分で
以下のようなエラーメッセージがでて悩んでいます。
ソースは本の通り打ち込みました。
ws.cpp(141) : error C2447: '{' : 対応する関数ヘッダーがありません。旧形式の仮引
数リストの可能性があります。
コマンドラインは以下のとおりです。
rc ws.rc
cl /GX ws.cpp user32.lib gdi32.lib ws.res
何が原因か教えてください。お願いします
0251デフォルトの名無しさん
2006/05/17(水) 22:47:17あいにくエスパーでないのでその本とやらの内容がわかりません
0252デフォルトの名無しさん
2006/05/17(水) 22:51:550253デフォルトの名無しさん
2006/05/17(水) 22:52:230254250
2006/05/17(水) 23:08:10どうやら、プロシージャの後に;をつけていたためエラーがでていたようです
0255デフォルトの名無しさん
2006/05/17(水) 23:19:30#include <stdio.h>
int main( ) {
printf("Hello World\n");
return 0;
}
で、最後にreturn 0; って付いてるのはなんででつか?
0256デフォルトの名無しさん
2006/05/17(水) 23:21:50main関数はintを返すように決められているから
0は一般的には正常終了の意味
0257デフォルトの名無しさん
2006/05/17(水) 23:37:26でも、普通 プログラムだとfalseが0じゃなかたですっけ?
上記のmain関数は、()に0がリターンされるってことでおkでつか?
・・・なんでmainにintつけてるの・・・
0258デフォルトの名無しさん
2006/05/17(水) 23:39:48確かにfalseは0という値と互換性があるし、falseの代わりに0を使うことはあるけれど
0の代わりにfalseを使えるわけじゃない
> ()に0がリターンされる
意味が分からない
> なんでmainにint
そう決まっているから
0259デフォルトの名無しさん
2006/05/18(木) 00:20:22たしかにbool型を返す関数では成功したらtrueを返し、失敗したらfalseを返すのが当然けど、
mainが返す型はintであって、0の意味は>>256。
このようにintか何か整数型を返し、しかも0が成功の意味とすることもそれなりにある。
こうすると、失敗時には0以外の値が全て使えるので、それを使って何か意味のあるエラー値を返すことができ、
ただ失敗したということ以上の情報を伝えることができる。
C++の中で完結するなら例外処理を使うほうがスマートになることが多いだろうけど。
0260デフォルトの名無しさん
2006/05/18(木) 00:33:50EXIT_SUCCESS
EXIT_FAILURE
0261デフォルトの名無しさん
2006/05/18(木) 00:35:080262デフォルトの名無しさん
2006/05/18(木) 01:05:13略〜
bin[i]=(int)input[i]-(int)('0');
略〜
という記述についてなんですが、型を()で囲んで記述するのをはじめて見ました。
これはchar型のinputという配列をint型に変換しているってことなんでしょうか?
さらに、(int)('0')というのを引いていますがこれは、何をしているのでしょか?
0263デフォルトの名無しさん
2006/05/18(木) 01:11:49(int) はキャスト。 '0' は文字リテラル。入門書なり入門サイトなりにもうちょっと目を通せ。
ただ、そのコードにあるキャストは、あってもなくても動作は変わらない。
0264デフォルトの名無しさん
2006/05/18(木) 01:17:59ヒント:char が unsigned のこともある
0265デフォルトの名無しさん
2006/05/18(木) 01:23:15いや、関係ないから。
0266デフォルトの名無しさん
2006/05/18(木) 01:24:53まあ、'0' の方のキャストだけならそうだけども。
0267デフォルトの名無しさん
2006/05/18(木) 01:25:43ちがう。ほんとに関係ないから。
http://portable-c.jugem.jp/?eid=6
0268デフォルトの名無しさん
2006/05/18(木) 01:41:47'9' - '0' == 9
というように数字の文字から'0'を引くことで数値に変換できる。
まあ、あまり行儀のいいやりかたではないが。
0269262
2006/05/18(木) 01:46:15キャストなどの意味はわかりましたが、
やっぱりなぜ(int)('0')を引いていかがわかりません。
0270デフォルトの名無しさん
2006/05/18(木) 01:47:03それはここで聞いてもわからない。コード書いたやつに聞け。
0271262
2006/05/18(木) 01:48:47すみません、新着レスを見ていませんでした。なるほど!
数字の文字というのは、アスキーコードの数字の文字を、
数値に変換してるってことなんですか・・?
0272デフォルトの名無しさん
2006/05/18(木) 01:50:060273デフォルトの名無しさん
2006/05/18(木) 01:51:26全部並べないとできない。 if で書いたほうがマシ。
0274デフォルトの名無しさん
2006/05/18(木) 01:53:39構造体って、同時に変数宣言を2つ以上出来ますか??
たとえば、type型の構造体をn1とn2二つ宣言したいとして、
struct type n1,n2 ;
はOKでしょうか??
0275デフォルトの名無しさん
2006/05/18(木) 01:55:410277デフォルトの名無しさん
2006/05/18(木) 02:01:39C++ だと文字リテラルは char 型。
C とも C++ とも言ってない以上、
C++ の可能性も考慮する必要がある。
0278デフォルトの名無しさん
2006/05/18(木) 02:03:04そうじゃなくて、式中に出てくるcharやshortは全てintに丸められるから
キャストしてもしなくても関係ないって話だろ?
0279デフォルトの名無しさん
2006/05/18(木) 02:08:09やっと分かった。
なるほど。そういう風になってんのか。
0280デフォルトの名無しさん
2006/05/18(木) 02:38:46関数を作れ
switch(pos(min,max)){
case 1:
...
0281デフォルトの名無しさん
2006/05/18(木) 08:06:43負の数と正の数の割り算は負の数の余りが出てきちゃうけど
たとえば-5%3→-2って出るけど
普通の数学のように-5%3で1を出せるようにできないの?
0282デフォルトの名無しさん
2006/05/18(木) 08:36:55実は、C99以前のCでは環境依存だったりする。
まぁ、素直に自前で計算しとけってこった。
0283デフォルトの名無しさん
2006/05/18(木) 10:12:41標準ライブラリの div() なら決まってたりする?
0284デフォルトの名無しさん
2006/05/18(木) 12:39:35やべーマジでわからん。。
中学からやりなおすべき?
0285デフォルトの名無しさん
2006/05/18(木) 12:59:28x = y * q + r
かつ
0 <= r < y
かつ
qは整数
を満たすq, rがただ一組存在するが、これをそれぞれxをyで割ったときの商、余りと呼ぶ。
この定義を使うと、-5割る3は-2余り1
0286デフォルトの名無しさん
2006/05/18(木) 13:38:00-5=3*-2+1
ということか、なるほどなー。
あ、なんかかすかに思い出した。
0287デフォルトの名無しさん
2006/05/18(木) 13:58:47期待する動作が得られず原因がどうしても判りません。。
Windows98、VC++ 6.0で、
Win32APIを利用してGUIアプリケーションを作っています。
Windowのタイトルバーにてマウスの左ボタンが
離された時に動作する機能を実現したいと想っています。
そこで、WM_NCLBUTTONUPメッセージが送られた時に
メッセージボックスを表示させるプログラムを書いてみたのですが、
全画面表示になっている時以外は期待する動作はせずに、
Wクリックをしなくてはメッセージボックスが表示されませんでした。
以下の様にしてみたのですが、どこが悪いのでしょうか。
どうかご教授ください。。
LRESULT CALLBACK FrameProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_NCLBUTTONUP:
MessageBox(hWnd, "TEST!!", "debug", MB_OK);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
0288デフォルトの名無しさん
2006/05/18(木) 15:05:18ネットで入門的なところを見ながらやってるんですが
xのy乗を計算をしたくてpow関数を作っています。
#include<stdio.h>
#include<math.h>
int main(void)
{
char temp[256];
double x, y;
printf(" x ? ");
gets(temp);
x = atof(temp);
printf(" y ? ");
gets(temp);
y = atof(temp);
printf(" %f ^ % f = %f \n", x, y, pow(x,y));
}
で間違ってるところありますか?
intとかに変えたりもしてみたんですが
何度やっても最後のところが
0.00000 ^ 0.00000 = 1.000000ってなってしまうんです…
何がなんだか分らないです…
0289デフォルトの名無しさん
2006/05/18(木) 15:12:27仕様どおりの動作だが?
0290デフォルトの名無しさん
NGNG>0.00000 ^ 0.00000 = 1.000000ってなってしまうんです…
何か問題あるのか?
0291デフォルトの名無しさん
2006/05/18(木) 15:44:58自分も入門だから役に立たないかもしれないけど
その作ってるpow関数は?
あと0乗って1じゃなかったっけ?
0292デフォルトの名無しさん
2006/05/18(木) 15:52:21とりあえずspy++でメッセージ来てるか確認した?
0293デフォルトの名無しさん
2006/05/18(木) 15:56:23ttp://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputmessages/wm_nclbuttonup.asp
>If a window has captured the mouse, this message is not posted.
DefWindowProcはWM_NCLBUTTONDOWNでSetCaptureしているのだろう。多分。
0294デフォルトの名無しさん
2006/05/18(木) 16:02:140295288
2006/05/18(木) 16:03:27すいません解決しました
#include<stdlib.h>
が足りなかったみたいです
>>290
何の数字を入れてもそうなってたんです。
#include<stdlib.h>
を入れたら解決しました。
0296デフォルトの名無しさん
2006/05/18(木) 16:04:22そうです。そうだったんですよ。
ありがとうございます。
0297デフォルトの名無しさん
2006/05/18(木) 16:12:04馬鹿な俺にも分かるように解説キボン
0298デフォルトの名無しさん
NGNG・atdlib.hにはatofの宣言が書かれている
・宣言のない関数の戻り値はintと推定する
0299デフォルトの名無しさん
2006/05/18(木) 16:18:08完全に理解しますた。
トンクス。
なるほど…
0300デフォルトの名無しさん
2006/05/18(木) 16:30:520301デフォルトの名無しさん
2006/05/18(木) 16:35:54数学的には0の0乗は不定。
C言語的にはpow(0, 0)は(double型の)1を返す。
FreeBSD上でpow(3)を引くと
>The function pow(x, 0) returns x**0 = 1 for all x including x = 0,
>infinity (not found on a VAX), and NaN (the reserved operand on a VAX).
0302デフォルトの名無しさん
2006/05/18(木) 19:09:39できた!!
ありがとうございます
0303デフォルトの名無しさん
2006/05/18(木) 20:34:22しかし標準C/C++では'0'〜'9'の文字コードがそのように連続しているので、そんなことをしてもよい。
たしかに行儀はあまりよくないかもしれないけど。
0304デフォルトの名無しさん
2006/05/18(木) 20:34:56質問ですがC言語でfstatシステムコールを用いて
ファイルのサイズとか種類とか調べるにはどうしたらいいんですか?
調べてもでてこないのですが・・・
0305デフォルトの名無しさん
2006/05/18(木) 20:42:46ttp://www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html
0306デフォルトの名無しさん
2006/05/18(木) 22:01:31> 標準C/C++では'0'〜'9'の文字コードがそのように連続している
そんなこと決まってないだろ。
0307デフォルトの名無しさん
2006/05/18(木) 22:08:49unsigned long aaa = NULL;
としてありました。
しかし、ITRONではNULLは
#define NULL (void *)0
で定義されていました。
そのため、そのソースでITRON.Hをインクルードする前に
#define NULL 0
としてました。
また、他のソースでは
unsigned short bbb = (short)NULL;
としてキャストして使用してました。
普通このようにNULLって使うものですか?
私はNULLはポインタなどの初期化に使うものだと思っており
変数は普通に0で初期化するものだと思っていましたが・・・
0308デフォルトの名無しさん
2006/05/18(木) 22:13:56そんな使い方しない。しちゃいけない。
↓ここ全部読んどけ。
http://www.kouno.jp/home/c_faq/c5.html
0309デフォルトの名無しさん
2006/05/18(木) 22:17:44関数 f( T t ) を f( 5 ) ってした場合、
型変換T(int)で一時オブジェクトができて、
それからコピーコンストラクタが呼ばれるのか?
それとも型変換T(int)のみで仮引数が構築されるのか?
誰か教えてくんろ
0310デフォルトの名無しさん
2006/05/18(木) 22:33:17T t = 5; の形で初期化したときと同じように初期化される。
意味上は一時オブジェクトを生成してコピーコンストラクタを使うことになるが、
この一時オブジェクトの生成は省略することが許されている。
0311304
2006/05/18(木) 22:34:36int fstat(int filedes, struct stat *buf);
ってどうやって使うんですか・・・・
0312デフォルトの名無しさん
2006/05/18(木) 22:42:06まず自分でどう書いてどうなったのか言ってみろ。
0313デフォルトの名無しさん
2006/05/18(木) 23:30:51man 2 fstat
0314デフォルトの名無しさん
2006/05/18(木) 23:47:13決まっている
0315デフォルトの名無しさん
2006/05/19(金) 00:08:03規格のどこか、示せる?
0316デフォルトの名無しさん
2006/05/19(金) 00:11:060317デフォルトの名無しさん
2006/05/19(金) 00:15:09ISO C++ 2.2.3 より
> In both the source and execution basic character sets, the value of each character
> after 0 in the above list of decimal digits shall be one greater than the value of the previous.
>>316
それは関係ない。
0318デフォルトの名無しさん
2006/05/19(金) 00:20:180319デフォルトの名無しさん
2006/05/19(金) 00:27:31最悪 switch でも実装できるだろ?
C++ では 2003 年の改訂で追加されたみたい。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#173
0320デフォルトの名無しさん
2006/05/19(金) 00:31:17線形時間で返そうとおもえば返せる。
0321デフォルトの名無しさん
2006/05/19(金) 00:40:28ありがとう。勉強になった。
0322デフォルトの名無しさん
2006/05/19(金) 01:21:59言語仕様で決まってるってのを知らないのは
まあ無理も無い話。
結構マニアックだもんな。
0323デフォルトの名無しさん
2006/05/19(金) 02:14:1910進変換の c - '0' は規格に沿っていて、
16進変換の c - 'A' + 10 は規格外ってことか。
中途半端だな。
0324デフォルトの名無しさん
2006/05/19(金) 02:45:05虚数解を持つ時、「異なる2つの虚数解を持つ」
と表示させたいのですが、変な値とともに↑が表示されます。
ソース載せたので赤ペン先生してください。
#include <stdio.h>
#include <math.h>
int main(void)
{
float n1,n2,n3,n4,D;
puts(" a*x*x + b*x +c =0 を満たす 実数解xの値。");
printf("a ?:");scanf("%f" ,&n1);
printf("b ?:");scanf("%f" ,&n2);
printf("c ?:");scanf("%f" ,&n3);
n4 = (n2*n2 - 4*n1*n3 );
D = sqrt(n4);
if (n4 > 0 && n4 < 0)
printf("x =%.2f です。", (-n2 + D) / (2 * n1) );
else if (n4 > 0 )
printf("x= %.2f です。", (-n2 + D)/(2 * n1) );
printf("x= %.2f です。", (-n2 - D)/(2 * n1) );
if (n4 < 0)
printf("2つの異なる虚数解を持つ。");
getchar();
return(0);
}
0325デフォルトの名無しさん
2006/05/19(金) 02:57:11if文の有効範囲に誤解があるな。
if (・・・)
printf("hoge");
0326デフォルトの名無しさん
2006/05/19(金) 02:58:29if (・・・)
printf("hoge");
printf("sage");
は
if (・・・) {
printf("hoge");
}
printf("sage");
と同じこと。n4 > 0の場合についての箇所を見直すのと、
if (n4 < 0)もelse ifにするべきでは。
というかヘタに省略せず、面倒でも最初は{}を書くようにした方がいいと思うが
0327デフォルトの名無しさん
2006/05/19(金) 03:01:06> if (n4 > 0 && n4 < 0)
これは・・・
0328デフォルトの名無しさん
2006/05/19(金) 03:06:20a*x*x + b*x +c =0 を満たす 実数解xの値。
a ?:1
b ?:1
c ?:1
sqrt: DOMAIN error ←(1)
x= +NAN です。2つの異なる虚数解を持つ。 ←(2)
虚数解を持つ時はもちろんn4の結果は負となる。
xが負の時sqrt(x)はエラーを引き起こす。(1)はそのエラー出力。
この処理系では返り値がNaNになるので、D、そしてそれとの演算結果もNaNとなり、(2)のように表示される。
あとif(n4 > 0 && n4 < 0)の条件式がトンチキなので見直すべし
多分重解を表示させたいんだろうから(n4 == 0)だろうけど
それと>325も言ってるがif文の有効範囲ね
0329デフォルトの名無しさん
2006/05/19(金) 04:31:12Accept-Encoding: gzip を付けたときに返って来たデータを
解凍する方法が分かりません。
どうすればデータを解凍できますか?
windows xpと、BorlandC++Compiler 5.5のコンパイラを使ってます。
0330デフォルトの名無しさん
2006/05/19(金) 05:10:470331デフォルトの名無しさん
2006/05/19(金) 05:12:42実際に EBCDIC だとアルファベットは連続してない。
http://www.pleasuresky.co.jp/images/ebcdic.gif
まあ、A-F は繋がってるけど。
0332デフォルトの名無しさん
2006/05/19(金) 05:16:200333デフォルトの名無しさん
2006/05/19(金) 05:59:04spy++の存在忘れていました・・・(汗
次からまず試してみます。。
>>293
>>If a window has captured the mouse, this message is not posted.
キャプチャされてるとメッセージ送られないんですね。。。
他の手段で実現することを考えてみます。。 ありがとう御座いました(><;
0334デフォルトの名無しさん
2006/05/19(金) 09:58:35学習目的でないならWinInet使ってしまえ。
0335デフォルトの名無しさん
2006/05/19(金) 16:25:34どうもです。
WinInetを調べてみます。
0336デフォルトの名無しさん
2006/05/19(金) 19:21:21どんだけ試してみても
unknown escape sequenceになってしまうんですどこかおかしいでしょうか?
#include<stdio.h>
#include<ctype.h>
int main(void)
{
char t;
while(1){
printf("一文字入力してみΣ(・Д・ノ)ノ アウッ ");
t = getchar();
fflush(stdin);
if( t == EOF)
break;
if(isprint(t))
puts("入力された文字は表示できる");
else
puts("入力された文字は表示できね");
}
}
ちなみに行数は18と20を指しています。
0337デフォルトの名無しさん
2006/05/19(金) 19:25:50日本語対応に弱いコンパイラだとエラーが出るから
表示の表の字の後に\マークを入れると幸せになれるかも。
0338デフォルトの名無しさん
2006/05/19(金) 19:35:04ありがとうございます。
すごく幸せになりました!!!!!
今使ってるコンパイラは日本語対応に弱いんですね(;´∀`)
0339デフォルトの名無しさん
2006/05/19(金) 19:39:020340デフォルトの名無しさん
2006/05/19(金) 19:43:17いざ繋げるときにどうやってやったらいいのかわかりません・・。
優しい方教えてください。
環境はVC++.net、MFC、ダイアログベースで作りました。
0341デフォルトの名無しさん
2006/05/19(金) 20:02:07コンパイラは…Cygwinなんですが…弱いですか?
後、gccを通そうとすると
/usr/lib/gcc-lib/i686-pc-cygwin/3.2/../../../../i686-pc-cygwin/ld:
cannot open output file a.exe:
Permission denied collect2: ld returned 1 exit status
ってエラーメッセージが出るんですが
このメッセージって調べてみたんですが位置がおかしい
ってことですよね?
別に変なところはいじってないつもりなんですが…
いきなりこんな風になることってありますか?
0342デフォルトの名無しさん
2006/05/19(金) 20:09:01Cygwinのgccは日本語通そうとするとよくミスるな
だから俺はどうしても日本語通す必要がある場合にはICCかVC++のコマンドラインコンパイラ使うことにしてる
ldってリンカだっけ?collect2ってののアクセス権がおかしいのかな
それはgccスレで聞いた方がより的確なアドバイスが貰えるんじゃないかと思う
0343デフォルトの名無しさん
2006/05/19(金) 20:12:25ご丁寧にありがとうございます。
gccのスレに行って聞いて見ます
そうなんですか…やっぱり弱いんですね
本当は変えたいんですが
C自体を始めたばかりなのと
本とネットので調べてやってるだけなのでいきなり変わると
全く出来なくなりそうで怖かったり(;゚д゚)
0344デフォルトの名無しさん
2006/05/19(金) 21:07:41をaliasしとけばいいのではない?
0345デフォルトの名無しさん
2006/05/19(金) 21:21:23ありがとうございます。
一応、インストールしなおしたら解決しました。
すいません。報告が遅れました。
ただ、根本的な解決ではなかったので
もし同じような症状が出たらやってみます。
0346デフォルトの名無しさん
2006/05/19(金) 22:29:26標準ライブラリってあるけど、あれってファイルアクセスだとか
メモリアクセスとかって最終的にはOSのAPIを呼び出すことになりますよね?
そのAPIを呼び出す部分は環境依存になってしまうと思うのですが、
その部分って、.libファイル?とかにまとめられてて、
リンカが環境に応じてリンクさせるので、
標準ライブラリのソース自体には環境依存性はないよ
・・・という考えで良いですか??
0347デフォルトの名無しさん
2006/05/19(金) 22:32:52× 標準ライブラリのソース自体には環境依存性はないよ
○ 標準ライブラリを使ったソース自体には環境依存性はないよ
0348デフォルトの名無しさん
2006/05/19(金) 22:34:15あくまで標準ライブラリを使う側が環境依存でなくなるというだけ。
0349デフォルトの名無しさん
2006/05/19(金) 22:46:07クラスで設計しようと思ったんだけど、うまくいかない。
元の配列を一時配列(サイズは元の配列+1)にコピーして、一時的に元の配列を消して新しく元の配列+1の配列を用意する。
この時点で、一時配列の一番後ろの所に新要素を入れて、新しい配列を作ってそこに全部コピーして最後に一時配列を削除するっていう手順を踏んだけど、
どうしても、配列のサイズが巨大になる(templateで巨大なクラスを指定したり)と相当処理が重くなる気がする。
一時配列を使わないでサイズを大きくする方法があったら教えて。
0350デフォルトの名無しさん
2006/05/19(金) 22:47:450351デフォルトの名無しさん
2006/05/19(金) 22:54:55それを言うなw
0352デフォルトの名無しさん
2006/05/19(金) 22:56:37元配列削除したあとで元配列を保持していたポインタに新しい配列つっこめば終わるわけだが。
頻繁にサイズ拡大が起こるようならあらかじめ配列のサイズに余裕を持たせておくといい。
というようなことを勝手にやってくれるのがstd::vectorなわけだが。
場合によってはstd::dequeのようなチャンク型配列が有効な場合もある。
0353デフォルトの名無しさん
2006/05/19(金) 22:58:46ファイルに"001,jpg"; と書いてある場合で
char *mojiretu;
char st[256];
fscanf(fp,"%s",st);
mojiretu = strtok( st, ";" );
と書いていますが、mojiretuの中身は""001,jpg""と前と後ろに " が
よけいに付いてしまいます。
mojiretuが"001.jpg"となるようにするには、どうすればいいですか?
0354デフォルトの名無しさん
2006/05/19(金) 22:58:51+1サイズの新規バッファにコピー>元の配列を解放>配列を格納してるポインタに新規バッファのポインタをコピーでコピー一回で済むぞ。
それと頻繁にサイズ変更するならバッファが足りなくなった時に大きめにバッファ確保すればコピーする回数は大きく減らせる。
でも俺ならstd::vector使うけど。
0355デフォルトの名無しさん
2006/05/19(金) 23:01:07mojiretu の中身はどうやって確認してる?
0356デフォルトの名無しさん
2006/05/19(金) 23:03:07サンクスです。
あー、なるほど。
てっきり標準ライブラリって共通のソースと
コンパイラベンダー提供の環境依存部分のソースに
分かれてるんだと思ってました。
実際には全部コンパイラベンダーさんが
がんがって作ってくれてるんですね。
0358デフォルトの名無しさん
2006/05/19(金) 23:13:36最初にstartに現在の配列を括り付けといて、新しい配列(長さは+1)を作ってその一番後ろにデータを付ける。
古い方の配列を消して、startに新しい配列を括り付けるという手順でおk?
確かに1つ配列な長くなる度に配列を解放してたら時間が掛かるなぁ...
0359デフォルトの名無しさん
2006/05/19(金) 23:27:38デバッガの表示が "" を追加してるだけじゃない?
puts(mojiretu) してみ。
0360デフォルトの名無しさん
2006/05/19(金) 23:28:52いや、重いのはメモリの解放じゃなくて配列のコピーだろ。
0361デフォルトの名無しさん
2006/05/19(金) 23:57:23複雑なファイルを読み込み検証したい場合fscanfだと役不足だったんだな
今はもうどんな複雑やつだろうと整理出来るから
すきなだけ楽しめる
よくあるRPGの戦闘部分再現させて楽しんでる
音声画像ないけど
0362デフォルトの名無しさん
2006/05/19(金) 23:57:48確かに、コピーですたorz
ポインタへのポインタでnewで確保したところにドンドン配列を括り付けていけないか?
0363デフォルトの名無しさん
2006/05/20(土) 00:00:08役不足の使い方が間違ってる
0364デフォルトの名無しさん
2006/05/20(土) 00:06:05「アンタじゃ役不足だせ…」
これでどうだッ!
0365デフォルトの名無しさん
2006/05/20(土) 00:07:57リスト構造のことか?(「括り付ける」とかいう俺様表現やめれ)
0366デフォルトの名無しさん
2006/05/20(土) 02:36:180367デフォルトの名無しさん
2006/05/20(土) 11:30:51やっぱりCとC++って似てそうで異なる言語だからね。
私じゃスレを立てることができないので・・・すみません。
0368デフォルトの名無しさん
2006/05/20(土) 11:32:20http://pc8.2ch.net/test/read.cgi/tech/1147375815/l50
これじゃ不満か?
0369デフォルトの名無しさん
2006/05/20(土) 11:44:200370デフォルトの名無しさん
2006/05/20(土) 11:51:47確かに、言葉でわかるより体で感じるタイプもいるからな。
ss[i]じゃダメなんだと体で覚えるわけか、先が大変そうだな
0371デフォルトの名無しさん
2006/05/20(土) 14:18:56stlrenを使わずに文字配列で後ろから文字を出力する方法ってどうやるのですか?
0372デフォルトの名無しさん
2006/05/20(土) 14:29:39なんで使っちゃいけないのか知らんが
自分で先頭から順に '\0' を探して、そこから逆順に1文字ずつ出力
0373デフォルトの名無しさん
2006/05/20(土) 14:32:080374デフォルトの名無しさん
2006/05/20(土) 14:58:04>>372さんの言ったようにヌル(ナル)までインクリメントしてその後
デクリメントを利用して配列を0まで出力しようとしてもなぜか成功しないので
今もいろいろ試行錯誤してます
0375デフォルトの名無しさん
2006/05/20(土) 14:58:42まあがんばれ
0376デフォルトの名無しさん
2006/05/20(土) 15:34:46すれ汚しごめんなさい
0377デフォルトの名無しさん
2006/05/21(日) 00:23:22っていう変数をみました。
理解できないわけではないのですが、こういうのは仕様が悪いのですか?
0378デフォルトの名無しさん
2006/05/21(日) 00:28:52書いたやつの頭が悪い。
0379デフォルトの名無しさん
2006/05/21(日) 00:31:54ひょっとして数値計算関連のプログラム?
0380デフォルトの名無しさん
2006/05/21(日) 00:37:100381デフォルトの名無しさん
2006/05/21(日) 00:38:03その通りです。
0382デフォルトの名無しさん
2006/05/21(日) 00:43:20(*********************************puts)("Hello, world.");
が通るのに比べたらまだまだ。
0383デフォルトの名無しさん
2006/05/21(日) 00:47:330384デフォルトの名無しさん
2006/05/21(日) 01:06:18数値計算なら、まあありうるかもしれない。
ポインタテーブルでメモリを圧迫しないなら、
各要素へのアクセスの可読性が高いから
そうする手もアリだとは思う。
ただ、全要素を一列に並べて(int *p; で扱う)、
8つのインデックスから位置を計算してアクセス、
っつー方がメモリの無駄が少ないかもしれない。
「かもしれない」ってのは、うまい位置の計算法がなければ、
無駄なメモリを確保する必要があるかもしれないから。
折衷案として、int **p; として、
4インデックスごとにまとめるとか、
そういう事やった方が便利な事もあるかもしれない。
このあたりは好きにして。
0385デフォルトの名無しさん
2006/05/21(日) 19:03:36クラス本体内で宣言されたメンバ関数は暗黙
にinline化されると本に書いてありましたが
どういうことが行われるのかイメージが湧きません
簡単なサンプルコードを示してもらえないでしょうか?
0386デフォルトの名無しさん
2006/05/21(日) 19:07:59クラス本体外で inline つけて定義したのと同じことになるってこと。
サンプルコードなんか要らない。
0387デフォルトの名無しさん
2006/05/21(日) 19:13:41サンプルを提示するのは簡単だが、それをコンパイラがどうコンパイルするかは別の問題。
どうしても違いを見たいなら、
#include <cstdio>
#include <cstdlib>
class Foo {
foo() {std::exit(1);}
};
int main()
{
Foo foo;
return 0;
}
これを最適化の指定とアセンブリ出力の指定をつけてコンパイルして、最適化しない場合と較べてみればいい。
0388デフォルトの名無しさん
2006/05/21(日) 21:13:36class Hoge
{
void f() {/* 〜 */}
};
上は下のように書かれたものとして扱われるという決まりになっている。
class Hoge
{
void f();
};
inline void Hoge::f() {/* 〜 */}
0389デフォルトの名無しさん
2006/05/21(日) 22:36:560390デフォルトの名無しさん
2006/05/21(日) 22:42:34std::complex
boost::quaternion
boost::octonion
0391デフォルトの名無しさん
2006/05/21(日) 23:03:33コンテナ全般
boost::spirit
#こっちはs/効率/変態/ か?
0393デフォルトの名無しさん
2006/05/21(日) 23:48:01自分の環境で充分テストしてから本番機に投入したところ
いざ稼動させたらランタイムエラー(ハンドルできない例外)が発生し…
ソースを見てもなぜに例外が出るのかわからず(とうてい出るとは思えない箇所)・・・
そして、しょうがないので全く同じソースを再度コンパイルしなおしたのですが…
するとランタイムエラーは出なくなった。
絶望した!!
C++の難しさに、奥深さに、意味解らなさに、、、絶望したァッッッ!!
こんなことって、あるのだろうか。。。orz
0394デフォルトの名無しさん
2006/05/21(日) 23:56:11http://www.kouno.jp/home/c_faq/c16.html
0395デフォルトの名無しさん
2006/05/22(月) 00:03:04typedef void (*FP_SELECT_F)(T);
みたいなことができたらいいなあ。
0396デフォルトの名無しさん
2006/05/22(月) 00:23:160397デフォルトの名無しさん
2006/05/22(月) 00:26:0932bitのビットフィールドを以下の様に定義しました。
struct dword
{
unsigned bit0 : 1;
↓
unsigned bit31 : 1;
};
この状態でsizeof(dword)は4バイトになります。
このdwordを配列としてdword aaa[256]として定義した場合、
aaaはメモリ上に連続した空間として確保されるのでしょうか?
ポインタ参照でaaaにアクセスした時に大丈夫なのか考えています。
0398デフォルトの名無しさん
2006/05/22(月) 00:29:46その質問にビットフィールドがどう関係しているのか、わからない。
0399デフォルトの名無しさん
2006/05/22(月) 00:46:090400デフォルトの名無しさん
2006/05/22(月) 01:18:23今気づいたw
誤爆です。はい。
0401デフォルトの名無しさん
2006/05/22(月) 17:50:24{char t[10]; strncpy(t, "test", -1);}
というコードを実行した場合の例外は、どうやってハンドリングすればいいのでしょうか?
------------------------------------
try
{
{char t[10]; strncpy(t, "test", -1);}
}
catch(...){
MessageBox(NULL, "error", NULL, MB_OK);
}
------------------------------------
__try
{
{char t[10]; strncpy(t, "test", -1);}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
MessageBox(NULL, "error", NULL, MB_OK);
}
------------------------------------
などを試してみたのですが、
ハンドリングされない例外が発生したと言われ終了してしまいます。
http://msdn.microsoft.com/library/ja/jpdndeepc/htm/deep03162000.asp?frame=true
をそのまま使って_set_se_translatorも試してみたのですが、上手くいきませんでした。
例外処理について勉強してる最中なので
見当違いなことをしてるのかもしれませんが、ご教授下さい。
0402デフォルトの名無しさん
2006/05/22(月) 19:41:12「__try __except EXCEPTION_ACCESS_VIOLATION」でぐぐるとたくさん例が出てくるお。
0403デフォルトの名無しさん
2006/05/22(月) 19:45:30char t[10]; strncpy(t, "test", -1);
でなんら例外が発生しないんだから、別の場所で例外で出てるんでは。
0404デフォルトの名無しさん
2006/05/22(月) 21:41:26仮にsizeof(int)が4、負数を2の補数表現で表すの環境の場合、
配列tの先頭から0xFFFFFFFFバイトの領域に書き込みしようとするが、
それでもアクセス違反にならないと?
# 例外が発生するかしないかは環境依存なのかもしれないが。
0405デフォルトの名無しさん
2006/05/22(月) 21:57:46この場合、strncpy()が書き込むのは5バイト(test\0)ですよ。t[10]で
じゅうぶん足りてます。
0406デフォルトの名無しさん
2006/05/22(月) 22:15:32#include<stdio.h>
int main(void){
char a[81];
int i,n;
n=0;
gets(a);
while(i<81){
if(a[i]=='a')
n++;
if(a[i]=='A')
n++;
if(a[i]=='0')
break;
}
これ間違ってますか??お願いします。
0407デフォルトの名無しさん
2006/05/22(月) 22:25:58strncpy()は、コピー元が指定バイトに満たない場合、コピー先の残りを'\0'で埋める。
0408デフォルトの名無しさん
2006/05/22(月) 22:26:21・iに初期値がセットされていない
・iが進んでない
・a[i]=='0'じゃなくてa[i]=='\0'またはa[i]==0だと思われ
whileよりはforでまわしたほうがわかりやすいかもね。
0409デフォルトの名無しさん
2006/05/22(月) 22:29:47関数ポインタを要求されているところに、クラスのメンバ関数を渡すことはできないでしょうか?
DialogBox(hInstance, "IDD_DIALOG", NULL, pHoge->procMainDlg);
というようなイメージなのですが…。
静的メンバ関数じゃないとダメでしょうか?
0410デフォルトの名無しさん
2006/05/22(月) 22:29:52i<=80
の方が分かりやすくね?
0412デフォルトの名無しさん
2006/05/22(月) 22:32:260413デフォルトの名無しさん
2006/05/22(月) 22:33:05クラスのメンバ関数には、暗黙的にthisポインタがついている。
そのため、静的でないと指定出来ない。
0414デフォルトの名無しさん
2006/05/22(月) 22:33:53ありがとうございます!
iを進めるのはどう書いたらいいのですか?
(初歩的なこと聞いてすみません。。)
>>410さん
確かにそうですね、ありがとうございます。
0415デフォルトの名無しさん
2006/05/22(月) 22:37:31となるとここでは静的メソッドか、通常の関数を用意するしかないですね。
ありがとうございました。
0416デフォルトの名無しさん
2006/05/22(月) 22:49:04DialogBoxParamと、SetProp或いはSetWindowLongPtrを組み合わせるなどしてがんばれば、
最終的にメンバ関数でも(それどこかどんな関数オブジェクトでも)コールバックされるようにすることはできる。
0417デフォルトの名無しさん
2006/05/22(月) 22:49:26tがstrncpy後にアクセスされることなくスコープ外れて消滅するからstrncpy呼び出しを含めたブロック全体が最適化で端折られてたりせんか
0418401
2006/05/22(月) 23:21:05>>402
__except()で、GetExceptionCode()の値と
EXCEPTION_ACCESS_VIOLATIONを比較するという感じでしょうか。
試してみたのですが、上手くいきませんでした。
__except(EXCEPTION_EXECUTE_HANDLER)でもハンドリングできない
ということは__exceptにすらきてないということなのかな・・・。
>>417
デバッグビルドしているので、たぶん最適化はされてないと思います。
tの宣言をtryの上に持っていってみたのですが、同じでした。
>>403
うちの環境が原因なんですかね・・・。
サービスパックを一つも当ててないVS 6.0で試していたので、
SP6を当ててからまた試してみようと思います。
0419デフォルトの名無しさん
2006/05/22(月) 23:59:560420デフォルトの名無しさん
2006/05/23(火) 10:59:04connect()にタイムアウトを設定するにはconnectで使うファイルディスクリプタを
fcntl()でノンブロッキングにしてselect()に渡せばよいと聞いたのですが、うまくいきません
問題としては
select()でタイムアウトを20秒に設定したのに待っている様子は無い
connect()で正しく送信出来ている場合にも「現在進行中の作業です」とエラーが出る
write()も同じくエラーが出る
です。
connect()にタイムアウトを設定する方法を御存じの方がいらっしゃいましたらよろしくお願いします
0421デフォルトの名無しさん
2006/05/23(火) 11:13:03class A1{ ... } ;
って書くだけで
A1 var1 ;
とか宣言で(classを前に付けずとも)使えると思うのですが、良く
typedef class B1{ ... } B2 ;
などという宣言を見かけます。structについても、デフォルトがpublicになる
以外はclassと同じだと思うのですが、もっとたくさんのtypedefがヘッダー
ファイルなどに書いてあります。
クラスや構造体の名前を、さらにtypedefするのって、どういう意味がある
のでしょうか。もしかして、何か根本的なところで勘違いしているのでしょうか ?
0423デフォルトの名無しさん
2006/05/23(火) 11:46:40main関数の引数で渡された文字列argvをサブルーチンや他スレッドのルーチンで使おうとしています。
グローバルなchar*に入れて保持しようと思うのですが、
memcpyやmallocしなくてもただの代入で大丈夫ですよね?
試してみた限りでは大丈夫そうだったんですが。
0424デフォルトの名無しさん
2006/05/23(火) 11:49:53大丈夫です。
0425デフォルトの名無しさん
2006/05/23(火) 12:10:16変更する場合は注意が必要
0426デフォルトの名無しさん
2006/05/23(火) 16:29:58struct VECTOR2{
double x;
double y;
}
この構造体をプログラム全体で共用したいのですが、
どのように宣言すればよろしいのでしょうか?
common.hなるものをつくってそこで構造体を宣言して
使用するクラスでヘッダを読み込んでいたのですが、
error C2011: 'VECTOR2' : 'struct' で示される型としてすでに定義されています。
と表示されます。どうしてそうなるのかが分かりません。
よろしくお願いします。
0427デフォルトの名無しさん
2006/05/23(火) 16:32:14二回includeされているんジャマイカ?
# includeされるファイル内のincludeにも注意!
0428デフォルトの名無しさん
2006/05/23(火) 16:33:08VCならcommon.hの先頭に#pragma once
0429デフォルトの名無しさん
2006/05/23(火) 16:58:38解決しました。
ヘッダファイルはどこでもここでも読ませたらいけないんですね。
ヘッダの中で同じヘッダを読み込むと問題が起こるとはじめて知りました。
#pragma once 使えますね。
ただ、他の環境だと使えないかもしれないから、
今のうちによい方法をみつけないと・・。
0430デフォルトの名無しさん
2006/05/23(火) 17:00:37インクルードガードでググれ
0431デフォルトの名無しさん
2006/05/23(火) 17:08:57環境変数の設定でpathに数値を追加しようとしたのですが、誤って元の数値を消してしまいました・・・
どうすればいいんでしょうか・・・?
0432デフォルトの名無しさん
2006/05/23(火) 17:29:340433431
2006/05/23(火) 21:02:03既に適用は押してしまっていて・・・
これ、「>bcc32」ってコマンドプロンプトから略せ無くなる以外にも不具合出てきますよね?
0434デフォルトの名無しさん
2006/05/23(火) 21:10:300435デフォルトの名無しさん
2006/05/23(火) 21:20:35Invalid Address specified to RtlFreeHeap( 2a70000, 2c8f990 )
以下のエラーメッセージにおける括弧内の二つの引数はなにを
表しているんでしょうか?
0436431
2006/05/23(火) 21:33:59多分システム環境変数だと思います・・・
0437デフォルトの名無しさん
2006/05/23(火) 21:42:380438デフォルトの名無しさん
2006/05/23(火) 21:47:50テキストファイルの文字列の配列をユーザーの入力した順番に出力したいのですが
まず全て読み込んでしまう途中に
while(全て読み込むまでおわらない){
他の配列[i] = 文字配列;
i++;
}
としたのですが
'char *'型は'char'型に変換できないというエラーがでました。
なんとか変換する方法はないでしょうか。
配列を配列に変換する為にはなにが必要ですか?
0439デフォルトの名無しさん
2006/05/23(火) 21:51:23strcpy()でコピーできるが、std::string使えばいいじゃん。
0440デフォルトの名無しさん
2006/05/23(火) 21:52:10ソース書いたほうがいいよ。char * と char は別物だし、どういう風に実行させたいのかも
いまいち分からないので、間違いを指摘しづらい。
0441435
2006/05/23(火) 21:55:450442デフォルトの名無しさん
2006/05/23(火) 22:15:29> なにが必要ですか?
問題を整理する頭
0443デフォルトの名無しさん
2006/05/23(火) 22:23:09ただのCだ。
0444デフォルトの名無しさん
2006/05/23(火) 22:31:570445デフォルトの名無しさん
2006/05/23(火) 22:43:51それらの値の詳しい意味は自分も知らんのだけど、
free()に変なアドレス渡したり、free()に正しい値を渡してるけどヒー
プオーバーフローとかしてない?
0446デフォルトの名無しさん
2006/05/23(火) 23:01:30それだ!
charで文字として読み込んだ数字をintの数字としてあとの計算で使いたいんだ。
charをintに変換するのはどうするのよ?
大学1年生でもわかるよう説明してもらえるとありがたいです。。。
0447435
2006/05/23(火) 23:06:59ヒープオーバーフローって言うのは、割り当てられたヒープメモリの長さ以上に
長いデータを書き込んでいるって言うことでしょうか。
今、スクリプト言語の拡張ライブラリを書いてるんですけど
ガベージコレクタが回収したメモリを開放しているせいなのかもなぁとかおもいつつも
原因が絞り込めなくて難儀しております。
free()に渡される直前には、データ自体は壊れていない模様なので、
ヒープブロックが破壊されてるってことでデバッグ進めるべきですかねぇ。
0448デフォルトの名無しさん
2006/05/23(火) 23:07:24#include <math.h>
#include <stdio.h>
int main(void)
{
printf("%d", sqrt(25));
return(0);
}
出力結果は「0」…何が悪いんでしょうか。
0449デフォルトの名無しさん
2006/05/23(火) 23:12:560450448
2006/05/23(火) 23:14:010451デフォルトの名無しさん
2006/05/23(火) 23:18:39カッコつけてるとか駄洒落はかんべん。
0452デフォルトの名無しさん
2006/05/23(火) 23:22:000453デフォルトの名無しさん
2006/05/23(火) 23:24:30ブロッキングでopen()すると、openから返ってこないので、
ノンブロッキングのプログラムにしています。
送信はできるのですが、受信がまったくできません。
write(hSerial, "test start!\r\n", 14);
で出力して、teratermに表示されます。
read_cnt = read(hSerial, (void *)&cTmp, 1);
で受信すると返り値は-1でperrorすると"Resource temporarily unavailable"が返ってきて
errnoは0x23です。
キーを押しつづけて入力しつづけているのですが、上記エラーで受信できません。
何がいけないのでしょうか?
また、ソースも全部晒した方がよいでしょうか?
0454デフォルトの名無しさん
2006/05/23(火) 23:28:08昔は括弧を付けないといけなかったらしい。
0455デフォルトの名無しさん
2006/05/23(火) 23:59:31typedef struct {
int a;
int b[];
} STR_TEST;
int _tmain(int argc, _TCHAR* argv[])
{
STR_TEST foo = { 0, {1,2,3} };
printf("STR_TEST -> %d\n" , sizeof(STR_TEST));
printf("foo -> %d\n" , sizeof foo);
return 0;
}
上記のように書くと、2つともサイズが4でしたが、残りはどこに・・・?
0456デフォルトの名無しさん
2006/05/24(水) 00:00:49最後の要素数を省略するのはそういう使い方のためではないと思う。
0457デフォルトの名無しさん
2006/05/24(水) 00:00:52typedef struct {
int a;
int b[];
} STR_TEST;
int _tmain(int argc, _TCHAR* argv[])
{
STR_TEST foo = { 0, {1,2,3} };
printf("STR_TEST -> %d\n" , sizeof(STR_TEST));
printf("foo -> %d\n" , sizeof foo);
return 0;
}
上記のように書くと、2つともサイズが4でしたが、残りはどこに・・・?
0458デフォルトの名無しさん
2006/05/24(水) 00:03:40sizeof は型の情報だけでサイズを求める。
実行時に何かするわけじゃない。
0459457
2006/05/24(水) 00:05:36連続投稿スマソ。なんかPOST拒否られたので書かれていないとオモタ。
例えば、組込みなんかでROMに書き出したときにどうなるのか
考えていたんだけど、良くわからなくなってきた。
文法的に間違っている?
0460457
2006/05/24(水) 00:10:10STR_TEST foo1 = { 0, {1,2} };
STR_TEST foo2 = { 0, {1,2,3,4} };
こう書いても配列はsizeofから無視される訳か・・・。
ROM領域に取られるときに、順に12バイト、20バイトで
取られれば問題は無いんだけど・・・。
0461453
2006/05/24(水) 00:11:02ケーブルを変えてみたら動きました。
ブロッキングの問題はそのままです。
0462デフォルトの名無しさん
2006/05/24(水) 00:16:15ROM領域なぞ関係ない。
根本が間違ってる。
0463デフォルトの名無しさん
2006/05/24(水) 00:23:01動的にメモリ確保するなどしないと駄目かと思っていた。
0464457
2006/05/24(水) 00:24:00いや、問題はROM領域だったりするので、大いに関係あったり(汗
すいません。
実行時にサイズを取得する必要は無くて、>>460の例だとfoo1から
連続領域に12バイト格納されていれば解決なんですけど。
0465デフォルトの名無しさん
2006/05/24(水) 00:27:13だから、そういう次元の問題じゃない。
根本の解釈が間違ってる。
0466デフォルトの名無しさん
2006/05/24(水) 00:27:19error: non-static initialization of a flexible array member
error: (near initialization for `foo')
staticにすれば通るけどね。
0467457
2006/05/24(水) 00:27:40VC6.0だと警告無く通ります。VC7以上だと警告でます。
ただ、作るときには商用の組込み系のコンパイラを使うので
そもそもこの書き方が許されるかも知りたいところ。
0469デフォルトの名無しさん
2006/05/24(水) 00:31:33とても組み込み系をやっている/やろうとしている人の書く内容じゃないな。
辞めた方がいいんじゃないか?
0471デフォルトの名無しさん
2006/05/24(水) 00:34:07初期化方法については資料が手元にないので知らん。
0472デフォルトの名無しさん
2006/05/24(水) 00:36:15なら環境VC6とか言うなよ。
>>470
const も付けないと ROM に行かないよ。
0473457
2006/05/24(水) 00:36:57やっと解決しました。C99からだったのですね。
通るコンパイラと通らないコンパイラがあって必死で資料探っていたところです。
どうもスレ汚ししました。
0475デフォルトの名無しさん
2006/05/24(水) 00:42:35普通はセクションを分ける。
0476デフォルトの名無しさん
2006/05/24(水) 00:45:11そもそもVCはパソコン用のコンパイラだから、ROM/RAMと言うこと自体がナンセンス。
0478デフォルトの名無しさん
2006/05/24(水) 00:51:370479デフォルトの名無しさん
2006/05/24(水) 00:54:28やっぱり辞めた方がいいよ。
0481デフォルトの名無しさん
2006/05/24(水) 00:59:14シミュレーション後、コンパイルエラーが多発したり、
結局、思った通りに動かなくて途方に暮れるに100Kペリカ。
0483デフォルトの名無しさん
2006/05/24(水) 01:07:49組み込み向けを想定してるコンパイラなら const でセクションが分かれる。
自分で分ける必要はあんまり無い。
0484デフォルトの名無しさん
2006/05/24(水) 09:22:57クロスケーブル使っているのならケーブルによってはハードウェアハンドシェイクが使えないので要注意。
どっちみち相手側とハンドシェイク手段があっていないと伝送はできない。
詳しくは制御系スレで聞いた方がよさそう。
0485デフォルトの名無しさん
2006/05/24(水) 12:26:540486デフォルトの名無しさん
2006/05/24(水) 12:52:120487デフォルトの名無しさん
2006/05/24(水) 12:55:05thx
0488デフォルトの名無しさん
2006/05/24(水) 13:41:350489デフォルトの名無しさん
2006/05/24(水) 13:53:27http://www.linux.or.jp/JF/JFdocs/Secure-Programs-HOWTO/dangers-c.html
環境依存おkなこのスレ的には
asprintf とか _scprintf→sprintf とかが解か?
0490485
2006/05/24(水) 14:41:140491デフォルトの名無しさん
2006/05/24(水) 16:40:38勝手に整数部が10倍されます。なぜなんでしょう、教えて下さい。
#include <iostream>
#include <cmath>
using namespace std;
double cmath_modf_Int(double &dData)
{
double intptr, decimal;
decimal = modf(dData, &intptr);
cout << intptr <<'\n';
return intptr;
}
double cmath_modf_dble(double &dData)
{
double intptr, decimal;
decimal = modf(dData, &intptr);
return decimal;
}
int main()
{
double x;
cin >> x;
cout << cmath_modf_Int(x) ;
cout << cmath_modf_dble(x) << '\n';
return 0;
}
0492デフォルトの名無しさん
2006/05/24(水) 16:45:42short型であるのを明示するためのサフィックスってあるんでしょうか?
0493デフォルトの名無しさん
2006/05/24(水) 16:58:300Lっていうのはポニーテールの事だと思うから、ショートなら0で良いんぢゃない?
0494デフォルトの名無しさん
2006/05/24(水) 17:14:05無い。必要ならキャストで代用しろ。
0495デフォルトの名無しさん
2006/05/24(水) 17:22:35int WINAPI
WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
MSG msg;
HWND hWnd;
hWnd = InitWindow(hInstance);
if( hWnd = NULL){
return 0;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
error C2731: 'WinMain' : 関数はオーバーロードできません
↑こういうエラーが出てるのですが原因が分かりません。
あと他の関数は書くと長くなるので省きました。
原因分かる方は教えてください、お願いします。
0496デフォルトの名無しさん
2006/05/24(水) 17:36:14(笑)
0497デフォルトの名無しさん
2006/05/24(水) 17:46:43shortには「(short)0」ぐらいしか書きようがないのだけど、
int16_tなら、「INT16_C(0)」ってのが標準にあります。
0498デフォルトの名無しさん
2006/05/24(水) 17:56:11先ず出力順を追ってみよう。
1)cmath_modf_Int()内の出力
2)main()の一回目の出力
3)main()の二回目の出力
これらはそれぞれ、入力したxの
1)整数部(を取り出した値)と改行文字
2)整数部(を取り出した値)
3)小数部(を取り出した値)と改行文字
である。
つまり、仮に1.2を入力した場合
1)1\n
2)1
3)0.2\n
が出力される。
これは見かけ上、
1
10.2
のように見えるわけだ。
0499デフォルトの名無しさん
2006/05/24(水) 18:48:18プロジェクトの設定がMFCアプリとかコンソールアプリになってんだろ。
0500デフォルトの名無しさん
2006/05/24(水) 19:05:00確認したらちゃんとWin32プロジェクトでした。
それと.NET 2003にコピペしてビルドしたら
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 _WinMainCRTStartup で参照されました。
↑こんな感じになりました
0501デフォルトの名無しさん
2006/05/24(水) 19:08:230502デフォルトの名無しさん
2006/05/24(水) 19:13:08良く分からないです_| ̄|○
0503デフォルトの名無しさん
2006/05/24(水) 19:56:59無い。というより、汎整数拡張のせいで意味が無い。
汎整数拡張
http://portable-c.jugem.jp/?eid=6#comments
0504デフォルトの名無しさん
2006/05/24(水) 20:11:58解決法はいくつかある。
1.
#include <tchar.h>
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int);
2.
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
3.
int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int);
0505495
2006/05/24(水) 20:29:453番をやってみたところビルド成功しました。
実行はちょっと変でしたがビルドが通ったので後は何とかします。
ウインドウクラスネームとウインドウのタイトルの配列をLPWSTRで
キャストしてたんでそれが原因なのかな?
とにかく、どうもありがとうございました。
0506デフォルトの名無しさん
2006/05/24(水) 20:35:12整数の昇格が行われない文脈もあるから(特にC++)、意味がないってのは言い過ぎだろ。
どっちかというと、どうせintの範囲に収まるんだからintリテラルをキャストすれば十分、ってのが理由だと思う。
0507デフォルトの名無しさん
2006/05/24(水) 20:42:49504はどちらかというと後の方ほどお勧めできない。
0508デフォルトの名無しさん
2006/05/24(水) 20:49:10ある関数(変数)は外部から参照できないように、ある関数(変数)はグローバルに・・・みたいに
できませんか?
そんなに構造体を二つにすれば解決すると思うのですが、できれば一つの構造体で
構成したいのです。
仮に、構造体を二つ、公開用と非公開用をつくり、それを一つの構造体の中に格納する・・・
みたいなものってできますか?
0509デフォルトの名無しさん
2006/05/24(水) 20:54:320510デフォルトの名無しさん
2006/05/24(水) 20:59:38変数へのアクセスは全て関数経由でも良ければ、
公開するヘッダでは不完全型のtypedefだけを書き、構造体の宣言は書かないという手もある。
0511491
2006/05/24(水) 22:20:070512デフォルトの名無しさん
2006/05/24(水) 22:36:18せめて「お願いします」の一言くらいほしいぞー。
整数部が10倍されてるんじゃなくて、改行文字が足りないだけ。
例えば、
5.52と入力し、整数部と小数部を改行なしで出力したら、
5と0.52で50.52と表示されるわけ。
つーか、ポインタが理解できてないです…。よくこれで動くな。
0514デフォルトの名無しさん
2006/05/24(水) 22:58:03511と512を消したい…
0515デフォルトの名無しさん
2006/05/24(水) 23:06:550516デフォルトの名無しさん
2006/05/24(水) 23:27:34C99 の規格を見た限りではあんまり問題なさそうなんだけど、まずい実装が多いってこと?
0518デフォルトの名無しさん
2006/05/25(木) 00:43:13いきなりコーディングを行おうとするのは何故でしょうか?
0519デフォルトの名無しさん
2006/05/25(木) 00:45:01コーディングしようと思ってるからだろ。
コーディングの前に何か準備が要るということは自明ではない。
0520デフォルトの名無しさん
2006/05/25(木) 01:04:00いいじゃね別にどうでも。初心者っつても色々いるだろうし。
じっくりやるのが好きな奴もいれば、なんか動かさないと詰まんないやつも居る。
死ぬほどコーディングやってれば、その内どうやるのが効率的なのか考えるよう
になるし、その内筋肉が覚えるよ。
俺にとって気になるのは、上から見下ろしたような意見をたれる自称上級者だけ
どね・・・・
0521デフォルトの名無しさん
2006/05/25(木) 06:13:45あらゆる意味でハズしてるな。
0522デフォルトの名無しさん
2006/05/25(木) 07:23:22無理、あきらめろ。
さらに言えば、Cでそのような考え方をするな。
0523デフォルトの名無しさん
2006/05/25(木) 13:32:04カプセル化とかの概念をどうCで実装するか
を考えたほうがいいと思うよ。
0524デフォルトの名無しさん
2006/05/25(木) 14:10:17C で private はこういう風にできる。
public メンバ変数は作るべきではないということで
これで問題は無いと思う。
関数のインライン化は最適化に頼ることになるけど。
継承を考えだすと厄介だね・・・。
====== hoge.h
typedef struct Hoge_ Hoge;
// public コンストラクタみたいなもの
Hoge *Hoge_new();
====== hoge.c
struct Hoge_ {
int a; // private メンバ変数みたいなもの
};
// private メンバ関数みたいなもの
static void Hoge_init(Hoge *hoge);
Hoge *Hoge_new() {
Hoge *hoge = malloc(sizeof (Hoge));
Hoge_init(hoge);
return hoge;
}
static void Hoge_init(Hoge *hoge) {
hoge->a = 0;
}
0525デフォルトの名無しさん
2006/05/25(木) 19:07:040526デフォルトの名無しさん
2006/05/25(木) 19:35:31#include <time.h>
void time1(void)
{
int y,m,d,h,n,s;
FILE *fp;
if((fp=fopen("time.dat","rb"))==NULL)puts("error1");
else{
fread(&y,sizeof(struct tm),1,fp);
fread(&m,sizeof(struct tm),1,fp);
fread(&d,sizeof(struct tm),1,fp);
fread(&h,sizeof(struct tm),1,fp);
fread(&n,sizeof(struct tm),1,fp);
fread(&s,sizeof(struct tm),1,fp);
printf("%d %d %d %d %d %d\n",y,m,d,h,n,s);
fclose(fp);
}
}
0527デフォルトの名無しさん
2006/05/25(木) 19:37:43{
time_t t;
struct tm *local;
FILE *fp;
time(&t);
local=localtime(&t);
if((fp=fopen("time.dat","wb"))==NULL)puts("error2");
else{
fwrite(local->tm_year,sizeof(struct tm),1,fp);
fwrite(local->tm_mon,sizeof(struct tm),1,fp);
fwrite(local->tm_mday,sizeof(struct tm),1,fp);
fwrite(local->tm_hour,sizeof(struct tm),1,fp);
fwrite(local->tm_min,sizeof(struct tm),1,fp);
fwrite(local->tm_sec,sizeof(struct tm),1,fp);
fclose(fp);
}
return 0;
}
int main(void)
{
time1();
time2();
return 0;
}
0528ソース丸投げごめんなさい
2006/05/25(木) 19:38:39fwrite(local->tm_year,sizeof(struct tm),1,fp);
ここら辺がが間違っているとがわかったのですが具体的にどうしたらいいか教えてください
時刻と日付をバイナリファイルに書き込むものです
0529デフォルトの名無しさん
2006/05/25(木) 19:40:120530デフォルトの名無しさん
2006/05/25(木) 19:53:10const void *buffer,
size_t size,
size_t count,
FILE *stream
);
パラメータ
buffer
書き込むデータへのポインタ
size
項目のサイズ (バイト単位)。
count
書き込む最大項目数。
stream
FILE 構造体へのポインタ。
0531デフォルトの名無しさん
2006/05/25(木) 20:04:11親切丁寧なレスありがとうございました
&つけるの忘れてました
0532デフォルトの名無しさん
2006/05/25(木) 20:10:50po = &obj;
の時に、メンバにアクセスする時
po->member;
て事は、
&obj->menber;
も通用するの?
0533デフォルトの名無しさん
2006/05/25(木) 20:19:57ね。
0534デフォルトの名無しさん
2006/05/25(木) 20:34:41でも、(*po).memberとやらないように(&obj)->memberとやることも普通はない。
0535デフォルトの名無しさん
2006/05/26(金) 12:44:18pthreadはメンバ関数には適用できないのでしょうか?
わかる人いたら教えていただけませんか?
0536デフォルトの名無しさん
2006/05/26(金) 12:47:05その通りです。
0537デフォルトの名無しさん
2006/05/26(金) 15:28:14operatorを勉強してて、CopyConstructorとDestructorを用意しといて
動作を見ていると、例えば下のような感じで+演算子をOverLoadしたとして
ClassName ClassName::operator+(ClassName &Cobj)
{
ClassName TempObj;
TempObj.MemberValue = this->MemberValue + Cobj.MemberValue;
return TempObj;
}
動きを見てたらCopyConstructorが呼び出されDestructorが呼び出され
次にTempObjの分のDestructorが呼び出されているのですが
TempObjの分は一時的なObjectなのでCodeBlockから抜けると破棄される
のは分かるのですが、最初のCopyConstructorが呼び出されるのは
新たにCopyObjectを作って(メモリ上に新たなInstanceを作成で良い?)
そのCopyObjectのポインタが、thisである。
と解釈すれば良いのでしょうか。
そうなら、operatorを使うたびに、メモリ上にInstance作成破棄を行うのでしょうか。
だとしたら、やたらにoperatorを使うのは、OverHeadってやつが余計にかかり
実行が遅くなるので使うのは控えた方が良いのでしょうか。
それとも、ClassName &ClassName::operator=(ClassName &obj)
{ return *this;}のような感じで
他の演算子も工夫して一時的なObjectもCopyConstructerも使う必要無く
良い解決法があるのでしょうか。
長々とした疑問文すいません。勉強してて「これじゃ、重くなるんじゃないのか?」
と思って気になってしまいました。どなたか教えください、お願いしまっす。
0538デフォルトの名無しさん
2006/05/26(金) 16:00:31違います。
コピーコンストラクタで生成されたオブジェクトは、プログラマには見えない返値用のテンポラリです。
> そうなら、operatorを使うたびに、メモリ上にInstance作成破棄を行うのでしょうか。
値(オブジェクト)を返す以上、常にテンポラリが作られます。
ただ、これは演算子オーバーロード特有の問題というわけではなく、
たとえば自前でadd関数を用意したとしても、オブジェクトを返す以上は免れない問題なので
これを理由に「演算子オーバーロードを使わない」というのはナンセンス。
> 他の演算子も工夫して一時的なObjectもCopyConstructerも使う必要無く良い解決法があるのでしょうか。
ありません。
Effective C++ 第23項「オブジェクトを返さなければならないときに、リファレンスを返そうとがんばるのはやめよう」を参照。
それと返値はClassNameではなくconst ClassNameに。
operator+はメンバ関数でなく、非メンバ関数(場合によってはfriend関数)として用意し、
operator+=を使って実装するのが通例。
0539デフォルトの名無しさん
2006/05/26(金) 17:34:43staticメンバ関数(クラスメンバ関数?)なら渡せるよ
0540デフォルトの名無しさん
2006/05/26(金) 21:02:16コールバックの引数にthisポインタを積んどけばいいじゃない
0541デフォルトの名無しさん
2006/05/26(金) 21:20:21最初に呼び出されるクラスメソッドを親クラスに実装して、
そのクラスメソッドから呼び出される仮想メソッドをオーバーライドする感じ。
0542デフォルトの名無しさん
2006/05/26(金) 21:27:17レスありがとうございます
まだまだ初心者の身で独習C++で勉強してます
Effective C++ も買う事になるんでしょう
>それと返値はClassNameではなくconst ClassName
>operator+はメンバ関数でなく、非メンバ関数
>(場合によってはfriend関数)として用意し、
>operator+=を使って実装するのが通例
等、新たな知識をありがとうございます。
ちなみに、「リファレンスって・・・何だったっけ?」
と、馬鹿の極みの疑問が生じ、和英辞書で検索しても出てこず
「???」と思い、ググってるとわかりました
referenceって、カタカナで言うとレファレンス(参照でした)なんっすね。
リファレンスとレファレンスが、ごっちゃになってる日本語文。
英語で覚えていかないと、やっぱ疑問が生じたとき検索できないっすね。
0543デフォルトの名無しさん
2006/05/26(金) 22:28:500544デフォルトの名無しさん
2006/05/26(金) 22:39:50特別には違わないが普通に違うな
0545デフォルトの名無しさん
2006/05/26(金) 22:42:570546デフォルトの名無しさん
2006/05/26(金) 22:44:37使うコンパイラによる。
エディタに何を使うかはあまり関係ない。
0547デフォルトの名無しさん
2006/05/26(金) 22:46:20あなたの普通に違うというところを教えてください。
0548デフォルトの名無しさん
2006/05/26(金) 22:48:46gccを使えと言われました
0549デフォルトの名無しさん
2006/05/26(金) 22:53:260550デフォルトの名無しさん
2006/05/26(金) 23:25:50_stprintfのような関数を使用する場合、
いったんヌル文字で終わる文字列配列に格納してから
stringのオブジェクトに代入するしか方法はないのですか?
0551デフォルトの名無しさん
2006/05/26(金) 23:34:38ここのjpegライブラリを利用したプログラムをC++で使いたいのですが
コンパイルするとread_JPEG_file(char*)という関数が定義されていないとなり
コンパイルできません。どうすればこの関数が定義されるのでしょうか?
gcc でコンパイルしてます。
0552デフォルトの名無しさん
2006/05/26(金) 23:36:06俺のESPが
「可変長引数を使ってstd::stringを構築したいよドラえもん」
と翻訳しているんだが
もしそうなら
std::stringstreamを使うかboost::lexal_castだかなんだかを使えばいいんじゃね?
0553デフォルトの名無しさん
2006/05/26(金) 23:38:01read_JPEG_fileはライブラリのサンプルで定義されている関数で、
ライブラリの関数じゃないだろが。
どうしても使いたければexample.cからコピペ汁
0554デフォルトの名無しさん
2006/05/26(金) 23:44:48明日ためしてみます。
回答ありがとうございました。
0555デフォルトの名無しさん
2006/05/27(土) 00:18:52逆に暗黙の変換があると便利だと思うんだけど。
0556デフォルトの名無しさん
2006/05/27(土) 00:22:200557デフォルトの名無しさん
2006/05/27(土) 00:22:56整数のつもりで書いた4が4要素のstd::vector<double>に暗黙のうちに変換されたらやってられんだろ。
0558デフォルトの名無しさん
2006/05/27(土) 00:23:39了解した
0559デフォルトの名無しさん
2006/05/27(土) 00:35:46c_str()
0560デフォルトの名無しさん
2006/05/27(土) 00:45:12stringに格納したいと言っているから、それは違うと思うぞ。
0561デフォルトの名無しさん
2006/05/27(土) 01:26:11間違ってないんじゃね?
あらかじめリサイズが必要だが
0562デフォルトの名無しさん
2006/05/27(土) 01:33:34みたいな事をしたいんじゃないかと思ってた
0563デフォルトの名無しさん
2006/05/27(土) 01:57:28c_str() の戻り値には const 付いてるから無理。
0564デフォルトの名無しさん
2006/05/27(土) 06:14:37つBoost.Format
0565デフォルトの名無しさん
2006/05/27(土) 07:04:10それ % で引数区切るからキモイんだが
0566デフォルトの名無しさん
2006/05/27(土) 09:16:14CString::Format
AnsiString::sprintf
0567デフォルトの名無しさん
2006/05/27(土) 10:45:40メモ帳に値をofstream out("sample.txt");
のようにして保存はすることが出来たのですが、.txtと.cppのプログラムの区別が付きにくいので
数値計算結果をフォルダの中に入れたいのです。で試しにホームページのhtmlのように
ofstream out("sample\(/)sample.txt");
のようにやってみたのですができませんでした。
これはどうすればできるようになるのでしょうか?教えてください。よろしくお願いいたします。
0568デフォルトの名無しさん
2006/05/27(土) 11:13:15フォルダが存在してない場合あらかじめ作っとかないと、エラーが起きるよ。
0569デフォルトの名無しさん
2006/05/27(土) 11:22:44ありがとうございます!!フォルダを最初に作るのを忘れてました。
どうも最近フォルダを自動的に作ってくれるソフトが多くて
コンピュータにフォルダ作成作業まで頼ってました(w
0570デフォルトの名無しさん
2006/05/27(土) 11:46:300571デフォルトの名無しさん
2006/05/27(土) 11:49:20フォルダ作る処理はOS依存。
ある程度統一されたやり方でやりたかったらboost::filesystem使うべし。標準じゃないけど。
0572デフォルトの名無しさん
2006/05/27(土) 15:01:54Win32APIのリストビューにて、
左が項目名、右がその項目の値(値の変更可能)となっているものをつくろうと思っています。
それでわからないところは、
値のところにカーソルがあたったら編集が出来るようにする方法がわかりません。
一列目はウィンドウスタイルにLVS_EDITLABELSを指定したら出来るのはわかりました。
ですけど値が二列目なのでそれだと編集が出来ません。
どのようにしたらこれは出来るのでしょうか?
0573デフォルトの名無しさん
2006/05/27(土) 15:07:59基本的にはできません。
どうしてもセルの編集をしたければ、自前のEditBoxを巧いこと生成するか、
ラベルの編集機能を制御する形で誤魔化すか、
いずれにしても結構面倒です。
0574572
2006/05/27(土) 15:17:08めんどいのかぁ。
それなら自前のEditBoxの方法にしようと思います。
それだと後からコンボボックスにすることも出来そうだと思うので・・・
お願いです!
そういったことに詳しく載っているサイトを知っていたら
教えてもらえないでしょうか?
0575572
2006/05/27(土) 15:35:55けど文字サイズが大きすぎだよ。
リストビューのフォントを取得しなくてはだめっぽいなぁ
どのメッセージを送ったらいいのだ?
0576デフォルトの名無しさん
2006/05/27(土) 15:43:410577デフォルトの名無しさん
2006/05/27(土) 15:57:07つ[CodeGuru]
0578572
2006/05/27(土) 16:07:56うわ、英語のサイトなのか!
ってことはこのサイトは使えるってことですね?
Excite翻訳で頑張って調べます!
0579デフォルトの名無しさん
2006/05/27(土) 16:19:170580デフォルトの名無しさん
2006/05/27(土) 16:23:25スレ違い。Win32APIスレあたりにどうぞ。
0581572
2006/05/27(土) 16:30:40ttp://www.codeguru.com/cpp/controls/listview/editingitemsandsubitem/
>>580
わかりました。
後は自分で頑張ります。
0582デフォルトの名無しさん
2006/05/27(土) 16:44:21>1によるとWin32APIも対象にはいってるぞ。
まぁこの問題はスレタイによる【初心者歓迎】の【初心者】に入れるかどうかだが・・・
ほぼ初心者だと思う。
まぁ、どちらにしろ専門スレのほうにいったほうがいいんじゃないか?
0583550
2006/05/27(土) 22:11:32>>564
>>566
ありがとうございます。string用に書式化するのがあるんですね。
…で、またそれに関して質問なんですが、
GetPrivateProfileStringのような関数から得た結果を
また同じようにstringオブジェクトに格納する方法はありますか?
WritePrivateProfileStringならc_str()でいいんですけれども。
0584デフォルトの名無しさん
2006/05/27(土) 22:17:48君はstringについて、もっと勉強した方がいい。
0585デフォルトの名無しさん
2006/05/28(日) 10:51:480586デフォルトの名無しさん
2006/05/28(日) 10:53:14(今は)諦める。
0587デフォルトの名無しさん
2006/05/28(日) 11:16:050588デフォルトの名無しさん
2006/05/28(日) 11:22:280589デフォルトの名無しさん
2006/05/28(日) 11:25:470590デフォルトの名無しさん
2006/05/28(日) 11:46:44とりあえず携帯厨かつ馬鹿なのは分かったから帰れ
0591デフォルトの名無しさん
2006/05/28(日) 11:56:030592デフォルトの名無しさん
2006/05/28(日) 12:04:510593デフォルトの名無しさん
2006/05/28(日) 12:28:360594デフォルトの名無しさん
2006/05/28(日) 12:34:380595デフォルトの名無しさん
2006/05/28(日) 12:42:14人に問題を説明できてない奴と
礼儀がなってない奴と
わざわざ初心者ですと名乗る奴は
叩かれます
0596デフォルトの名無しさん
2006/05/28(日) 12:44:120597デフォルトの名無しさん
2006/05/28(日) 12:45:370598デフォルトの名無しさん
2006/05/28(日) 12:56:00過ちて改めざる、これを過ちと言う
とりあえず>595を10回読め
0599デフォルトの名無しさん
2006/05/28(日) 12:57:380600デフォルトの名無しさん
2006/05/28(日) 12:59:090601デフォルトの名無しさん
2006/05/28(日) 13:08:15とりあえず馬鹿と → ほんと馬鹿ですみません
人に問題を説明できてない奴と → 解凍したのに使えません
礼儀がなってない奴と → ほんと馬鹿ですみません
わざわざ初心者ですと名乗る奴は → (書かなかった)
0602デフォルトの名無しさん
2006/05/28(日) 13:16:000603デフォルトの名無しさん
2006/05/28(日) 13:27:14ttp://support.borland.com/entry.jspa?externalID=4323
ttp://www.neco.nu/gohodoji/bccfaq.html
ttp://f42.aaa.livedoor.jp/~reiji/index.php?Environment%20for%20C%2FC%2B%2B%20Programming#content_1_2
ttp://hp.vector.co.jp/authors/VA017148/
上のサイトはBCC導入の情報がごっちゃりとある
0604デフォルトの名無しさん
2006/05/28(日) 13:32:41VCで以下のことをするとなんでこの結果になるかわからないです
「ソース」
char *s= aあ123
sizeof(s);
「結果」
4
コードの書き方がわるいんでしょうか?自分としては「6」を貰いたいの
ですが・・。
0605デフォルトの名無しさん
2006/05/28(日) 13:43:23具体的な問題も書かずに『叩かれた』と騒ぐのは何だ。
俺たちはただ、お前の書く文章が質問を形成していない事を突っ込んでいるわけで。
0606デフォルトの名無しさん
2006/05/28(日) 13:44:40「charを指すポインタ」のサイズはその環境では4バイトってだけ
文字列は関係ない
というか文字列は"でくくれ
サンプルコードは一字一句完璧に書き写すかコピペしろ
あとstrlen(「あ」を一文字として数えて欲しいならwcslen等)使え
0607デフォルトの名無しさん
2006/05/28(日) 13:51:31以下のようなプログラムを作ったのですが、最終行だけ2回繰り返されて
出力されてしまいます。どうしたら良いでしょうか?
#include <iostream>
#include <string>
//商品と価格のTSVデータを標準入力から受け取り、
//価格を2倍にして標準出力に送り出す。
int main()
{
int before, after;
std::item;
while(!std::cin.eof())
{
std::cin >> item >> before;
after = before * 2;
std::cout << item <<
0608607
2006/05/28(日) 13:52:55std::cout << item << "\t" << after << std::endl
}
return 0;
}
--------入力データ--------------
商品A[TAB]100
商品B[TAB]150
商品C[TAB]125
--------出力データ--------------
商品A[TAB]100
商品B[TAB]150
商品C[TAB]125
商品C[TAB]125
環境は、以下のとおりです。
g++ (GCC) 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)
0609デフォルトの名無しさん
2006/05/28(日) 13:53:08アリガト!(´▽`)
\nまでの型のサイズを知ることはできないんだね。。
”がなぜか書き込み規制にかかってしまい出せませんでした
>>597
日本語を以下のように訂正してください
私の質問を早く答えてもらいたいので
「ボーランドC++無償版(DOS版)のインストール手順が書いてあるサイトを
どなたかご存知ないでしょうか?」
んで回答
http://72.14.207.104/search?q=cache:wUwc0a-qqDoJ:www.mech.titech.ac.jp/~t-souzou/jyugyou/TurboCinst.htm+boland+c+%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%80%80%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&hl=ja&gl=jp&ct=clnk&cd=3
0610デフォルトの名無しさん
2006/05/28(日) 14:00:12printf("%d\n",sizeof(s));
0611デフォルトの名無しさん
2006/05/28(日) 14:01:08テスト書き込みにてスレ汚しすみませんでした
0612デフォルトの名無しさん
2006/05/28(日) 14:04:45どういう方法が良いのでしょうか?
ロケールの文字コードはUTF-8ですが、できればw_charを使いたいのです。
GCCのw_charは4バイトですから、外部コードをUTF-8、内部コードをUTF-32に
すれば良いのだろうと思いますが、それを解説している資料が見つからなくて
困っております。
0613デフォルトの名無しさん
2006/05/28(日) 14:09:32なぜTuboC?
BCCなんだから>>603の紹介したサイトだろ
0614デフォルトの名無しさん
2006/05/28(日) 14:22:49cin.eofを評価するタイミングの問題
std::cin >> item >> before;
の後で
if(std::cin.eof())break;でも入れとけ
0615デフォルトの名無しさん
2006/05/28(日) 14:27:19とくに何も考えなくていい。こんな感じで。
#include <stdio.h>
#include <locale.h>
int main (void)
{
setlocale(LC_ALL, "");
putwchar(L'あ');
putwchar(L'\n');
}
0616607
2006/05/28(日) 14:43:24ありがとうございます。やっぱりそうするしかないですか…。
getline(std::cin, std::string line)あたりで一行ずつ取り込んで、
そのlineをもう一度 stream に変換したりできないでしょうか?
これも汚い書き方ですけれど、終端条件が2箇所に出現しているのは、
やっぱりつらいです。
0617デフォルトの名無しさん
2006/05/28(日) 14:51:13std::istringstreamを使うと、std::stringからstd::istreamを作れる。
0618デフォルトの名無しさん
2006/05/28(日) 14:51:18614を適用すれば、ループそのものは無限ループにできるはずだから、
終端判定は一箇所で済むはず。
0619デフォルトの名無しさん
2006/05/28(日) 14:53:07ちなみにC++なら<locale>をインクルードした上で、std::locale::global(std::locale(""));とする。
そしてstd::locale::globalを呼ぶと、内部でstd::setlocale(LC_ALL, も呼ばれることになっている。
0622607
2006/05/28(日) 15:03:26ありがとうございます。まさにそれが知りたかったものでした。
>>618, >>620-621
すみません、その通りでしたね。お恥ずかしい。
while (true)
{
std::cin >> item >> before;
if(std::cin.eof())break;
after = before * 2;
std::cout << item << "\t" << after << std::endl;
}
終端条件がwhile文に明示されないのが気になりますが、stringからstreamに戻すより
効率はこの方が良いですね。ありがとうございます。
------------------------------------
それにしてもC++には、Javaに比べて気をつけなければならない点が
たくさんあると感じられます。こう書けば堅牢になる、という感覚が
なかなか獲得できません。難しいです。
堅牢なC++コードを書くためのガイドブックで、入門者におすすめの
ものはないでしょうか?
0623デフォルトの名無しさん
2006/05/28(日) 15:13:22C/C++セキュアプログラミングクックブックとか。
所謂セキュリティの問題じゃないならEffectiveC++とか。
0624デフォルトの名無しさん
2006/05/28(日) 15:14:16こうすればwhileに条件書けるよ。
#include <iostream>
#include <string>
int main()
{
int price;
std::string item;
while (std::cin >> item >> price)
{
std::cout << item << '\t' << price * 2 << std::endl;
}
return 0;
}
0625607
2006/05/28(日) 15:22:09ありがとうございます。堅牢というのは、明快でバグの入り込みにくい、という意味を
意図しておりました。「Effective C++」ですね。まだ私には早いかと思っておりましたが、
読んでみます。
>>624
ちょっとびっくりしました。
cin(と言うかstream全般)って、cin.eof() が true でなくても、>> price を実行した
あとは NULL になるのですか?
もしそうなら、C++って本当に難しいと改めて思います。
0626607
2006/05/28(日) 15:28:36自己訂正。後半は間違っていました。>> price を実行したあとに条件判定が
行われるから、std::cout << まで行かないだけですね。
申し訳ありません。ああ、もうなんかメタメタ…。
0627デフォルトの名無しさん
2006/05/28(日) 15:32:50cin >> item >> priceの値はcin。(だから>>をチェーンする記法が働くんだが)
std::istreamにはvoid *への暗黙の変換が定義されていて、これがwhileの条件部でテストされる。
この値の真偽はcin.fail()と同じ。
0629612
2006/05/28(日) 15:50:41ありがとうございます!
GCC は日本語処理が難しいという評判で、怖気づいていたのですが、
デフォルトのエンコーディングなら、それだけで良いのですね!
今は処理系がないので、明日試してみます。
0630デフォルトの名無しさん
2006/05/28(日) 15:57:020631デフォルトの名無しさん
2006/05/28(日) 16:28:02全部ではないけど、無料みたいだね。
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
http://slashdot.jp/developers/05/11/08/1259225.shtml?tid=58
0632603
2006/05/28(日) 16:43:02EXPRESSは無料、期間限定をなくしたはずなので買う必要なんかない。
ただ、BCCの環境変数の設定で困っているような状況を見るに
BCC+CPADでお気楽C++のほうが向いているように思う。
自分もヘタレなのでVC6、VC7、VC8の環境を持っていても
お気楽CPADでチョイチョイ書く場合が結構ある。
(OPENGLのGLUTとかの確認とか)
VC8のEEなんか使うぐらいなら、CD郵送代だけで使える(1600円だったかな)
VisualStudio2005 Professionalを180日間評価版のほうが便利。
(MSDNがまともに付いてる)
0633デフォルトの名無しさん
2006/05/28(日) 16:44:130634デフォルトの名無しさん
2006/05/28(日) 17:02:170635デフォルトの名無しさん
2006/05/28(日) 17:22:30>>631-630とりあえずしんどけ
0636631
2006/05/28(日) 17:23:15スラッシュドットに、「MFC/ATL は含まれない」って書いてあるでしょ。
Microsoftのリンク先のFAQにもある。
http://www.microsoft.com/japan/msdn/vstudio/express/faq/default.aspx
あとは>>632 の後半に同意。
0637デフォルトの名無しさん
2006/05/28(日) 17:32:27void *v;
int address = 0x008D5AC4;
v = (int *)address;
メモリアドレスを直接ユーザーに指定してもらい、それをポインタに格納するプログラムを作っているのですが、
上記のように書くとエラーは出ず、コンパイルできますが、警告が出てしまいます。
( : warning C4312: '型キャスト' : 'int' からより大きいサイズの 'int *' へ変換します。)
プログラム自体は正常に動作するようですが、警告を出さないようにするにはどう書けばよいのでしょうか?
0638デフォルトの名無しさん
2006/05/28(日) 17:45:31#include <stdint.h>
intptr_t address = ...
C99 での追加だから、 VS2005 で使えるかどうかは知らない。
0639デフォルトの名無しさん
2006/05/28(日) 18:06:17あんなやつがMFC/ATLを必要としていると思うか?
0640デフォルトの名無しさん
2006/05/28(日) 18:08:39VC++に<stdint.h>はまだないが(u)intptr_tは<stddef.h>などで宣言されている。
そもそもWindowsで直にメモリアドレスを扱って何がしたいのか気になる。
0641デフォルトの名無しさん
2006/05/28(日) 18:09:52/Wp64 をはずせば警告は無くなる。
メモリアドレスを直値のintで扱うとはひどいプログラムですの。
0642デフォルトの名無しさん
2006/05/28(日) 18:17:38以下漠然とした質問ですみません。。。
既存のC言語で作られているCGIに対して、
Oracle接続機能を追加したく、Pro*Cを使おうと思うのですが、
CGIにPro*Cは問題無く使えますでしょうか?
(Google検索したけど参考になる情報が無かったもので。。。)
あと、もしPro*Cが使えたとした場合のコンパイル方法なのですが、
現在 cc -o test.cgi test.c
と、1行コマンド打っているところを、
Pro*Cを組み込んだ場合、どの様にすれば宜しいでしょうか?
環境はSolaris(Verは忘れ;;)、Oracle8iです。
ご教授お願いますm(__)m
0643デフォルトの名無しさん
2006/05/28(日) 18:28:29おお、できました。
ありがとうございます!
目的は、winゲーム内の特定のアドレスの内容を参照したいからです。
ネトゲのツールを作るのに必要です。
0644デフォルトの名無しさん
2006/05/28(日) 18:31:400645デフォルトの名無しさん
2006/05/28(日) 18:33:00CGIは、動作させるサーバ上でコンパイルしなければならない事はよくご存じか?
0646デフォルトの名無しさん
2006/05/28(日) 18:36:47Windowsプログラムでは、仮想メモリが使われている事はご存じか?
0647デフォルトの名無しさん
2006/05/28(日) 18:39:06はい。
動かす環境でのコンパイルではありませんが、
動かす環境と同じ設定の環境でコンパイルしてるハズ・・です。
これじゃダメでしょうかね?
0648デフォルトの名無しさん
NGNGPro*Cのマニュアル嫁
0649デフォルトの名無しさん
2006/05/28(日) 18:44:57はい、知ってます。
仮想メモリがどんなタイミングで物理メモリに呼び出されてまた戻っていくのかは知りません。
0650デフォルトの名無しさん
2006/05/28(日) 18:47:47仮想メモリとはスワップするだけでなく、プロセス間で別アドレス空間にしていることもご存じか?
0651デフォルトの名無しさん
2006/05/28(日) 18:51:21つい最近(先週土曜日から)独学でC言語の勉強を始めた者です。
この一週間のマトメとして10進数→2進数変換プログラムを作りました。
しかし、ビルドは出来ても実行すると
「Cbenkyou が原因で KERNEL32.DLLにエラーが発生しました。Cbenkyouは終了します。
問題が解決しない場合は、コンピュータを再起動してください。」
と言われて、終了してしまいます。どうすればいいかわからなくて困っています。
下記に詳細を書きますので、どうか助けてください。
尚、私の環境はWindowsME、CPU 877Mhz、HDD 40GB(使用21GB)、メモリ 384MBで、使用コンパイラはVC++6.0です。
デバッグウィンドウの内容:
'C:\WINDOWS\SYSTEM\KERNEL32.DLL' をロードしました、合致するシンボル情報は見つかりませんでした。
例外処理 (初回) は cbenkyou.exe にあります: 0xC0000005: Access Violation。(←たくさんあります)
例外処理 (初回) は cbenkyou.exe (KERNEL32.DLL) にあります: 0xC00000FD: Stack Overflow。
例外処理 (初回) は cbenkyou.exe にあります: 0xC0000005: Access Violation。(←またたくさんあります)
ソースファイルを書くと文字制限になるため一旦投稿します。
0652デフォルトの名無しさん
2006/05/28(日) 18:53:15知ってますよ。もしプロセスによってアドレス空間が独立していなければメモリを指定参照することができないので・・・。
そのプロセスで目的のデータは常に0x0075F21Aに存在するみたいに。
0653651
2006/05/28(日) 18:55:03ソースファイルはUPしました。
http://proxy.f2.ymdb.yahoofs.jp/bc/158842fb/bc/%a5%bd%a1%bc%a5%b9%a5%d5%a5%a1%a5%a4%a5%eb.txt?bcpoXeEBAKV02RYV
0654デフォルトの名無しさん
2006/05/28(日) 18:57:09デバッガあるなら自分で探せるだろ。
0655651
2006/05/28(日) 19:02:20それがその、MSDNのCDをなくしてしまってVC++本体しか入っていないため、
不具合がそこで起こっている、という事はわかっても具体的にどこが悪い、というのが参照は出来ないんです。
環境にこれを書き忘れていました。すみません。
0656デフォルトの名無しさん
2006/05/28(日) 19:10:410657デフォルトの名無しさん
2006/05/28(日) 19:13:04サイクル数を計りました。
main.c
int main(void)
{
aaa();
bbb();
ccc();
return 0;
}
ABC.c
void aaa()
{
/* 何かしらの処理(ループ処理) */
}
void bbb()
{
/* 何かしらの処理(ループ処理) */
}
void ccc()
{
/* 何かしらの処理(ループ処理) */
}
このときABC.cの関数の位置を変えるとサイクル数が変わりました。 (続きます)
0658デフォルトの名無しさん
2006/05/28(日) 19:13:42int main(void)
{
aaa();
bbb();
ccc();
return 0;
}
ABC.c
void ccc()
{
/* 何かしらの処理(ループ処理) */
}
void aaa()
{
/* 何かしらの処理(ループ処理) */
}
void bbb()
{
/* 何かしらの処理(ループ処理) */
}
関数の位置とサイクル数に関係はあるのでしょうか?
アセンブラで見たところ、とくに変化は見られませんでした。
ループ処理で3サイクルの違いがありましたが、
そのループが100回、1000回と増えると結構なサイクル数の違いになり
無視できないレベルになったので、何か理由があれば教えてください。
0659デフォルトの名無しさん
2006/05/28(日) 19:16:23環境がわからないと、なんともいえない。
0660デフォルトの名無しさん
2006/05/28(日) 19:17:37CPU:SH-2(SH7145F)
コンパイラ:SHC ver9.0.2
です。
0661デフォルトの名無しさん
2006/05/28(日) 19:28:36バスが 32bit で命令が 16bit だから、関数それぞれのアドレスの
アライメントが関係してくるかもしれない。
関係するならコンパイラが面倒見てくれるべきなんだけど、 SHC じゃぁねぇ。
0662デフォルトの名無しさん
2006/05/28(日) 19:36:21関数の大きさ(アセンブラコードの行数)が原因でしょうか?
・・・となると、関数を定義する際は、関数のコードの小→大の順に定義すべきでしょうか?
ちなみに他のCPUやコンパイラではどうなんでしょう・・・
しかし、同じアセンブラコードなのに、関数の配置を換えるとサイクル数が変わるなんて・・・
0663デフォルトの名無しさん
2006/05/28(日) 19:38:24さっさとアライメントを確認しろよ。
0664デフォルトの名無しさん
2006/05/28(日) 20:03:44ただ、そうなると、変更前の順番
int aaa()→4の倍数番地に配置
int bbb()→2の倍数番地に配置
int ccc()→2の倍数番地に配置
を変更後の
int ccc()→4の倍数番地に配置
int aaa()→2の倍数番地に配置
int bbb()→4の倍数番地に配置
に直すと、ccc()とbbb()が速くなりました。
なのにaaa()は速度が変わりません、アライメンとが影響するなら
ccc()とbbb()が速くなる代償としてaaa()が遅くなるはずですが・・・
それとも、メモリリードとメモリライトも影響しますか?
aaa()はループの中でメモリライトを
bbb()とccc()はループの中でメモリライトおよびリードをしています。
0665デフォルトの名無しさん
2006/05/28(日) 20:10:19関数内でループしてるんなら、関数先頭よりも
ループするときのジャンプ先が問題になるだろうなぁ。
コード以外のリードとライトはコードの位置と関係ないだろうから、
影響しないと思うよ。
0666デフォルトの名無しさん
NGNG>アドレス空間が独立していなければメモリを指定参照することができないので・・・。
意味がわかっていない予感。
0667デフォルトの名無しさん
2006/05/28(日) 20:42:57ReadProcessMemory/WriteProcessMemoryを使ったハッキングだろ。
MSもいい加減このAPIにガードをかけてもらいたいものだ。
それだけで相当の不正行為を排除できるのに。
0668デフォルトの名無しさん
2006/05/28(日) 20:48:54これはまた、えらく自分勝手な意見ですね
0669デフォルトの名無しさん
2006/05/28(日) 21:29:460670デフォルトの名無しさん
2006/05/28(日) 21:41:12ええと。
指定する直アドレスというのはWindowsが作成するプロセスごとの仮想アドレスのことであって、本当の物理メモリのアドレスじゃないです。
本物の物理メモリのアドレスは私には知るよしもありませんので・・・。
0671デフォルトの名無しさん
2006/05/28(日) 21:47:10アドバイスありがとうございます。
しかし、同じ処理(アセンブラレベルでも同じコード)なのに、配置場所によって
処理速度が変わるなんて・・・
逆に、どういうことをすれば、そのようなことを意識しなくてもいいようにできますかね・・・
これは完全に環境依存だと思いますが。
SHCだと、方法はないのかな?
0672デフォルトの名無しさん
2006/05/28(日) 22:04:21おそらくユーザにゲームのプロセスでのメモリアドレスを入力してもらって、
自分のプログラムはそのアドレスを読み書きしようというのだろうが、普通には読み書きできない。
667の言うとおりReadProcessMemory/WriteProcessMemoryを使う必要がある。
それを理解しているのか?
0673デフォルトの名無しさん
2006/05/28(日) 22:13:29はい。>>667のおっしゃる通りで、ReadProcessMemory/WriteProcessMemoryを使って他アプリのメモリの中身を覗き見ます。
実際にはユーザーに入力してもらう変わりに、プログラムが変動しない特定のバイナリ列を検索して、基点アドレスを算出し、そこから目的のアドレスを自動取得するようなプログラムになりました。
0674デフォルトの名無しさん
2006/05/28(日) 22:19:30わかっているならいいけど今までの言動からしてわかっていなさそうだった。
0675デフォルトの名無しさん
2006/05/28(日) 22:20:500676デフォルトの名無しさん
2006/05/28(日) 22:41:45C言語も奥深いですね。
0677デフォルトの名無しさん
2006/05/28(日) 23:15:55671 の話だと思うが、あれは SHC がタコなだけ。
0678デフォルトの名無しさん
2006/05/30(火) 00:50:360679デフォルトの名無しさん
2006/05/30(火) 01:26:09ttp://www.skynet.ie/~caolan/TechTexts/GdbUnicodePrinting.html
0680デフォルトの名無しさん
2006/05/30(火) 01:33:23class likeIP
{
public:
unsigned int func01:6, address01:10, func02:6, address02:10;
unsigned int func03:6, address03:10, func04:6, address04:10;
unsigned int func05:6, address05:10, func06:6, address06:10;
unsigned int func07:6, address07:10, func08:6, address08:10;
}
のaddress01に任意の値を代入する方法ってあるんでしょうか?
知ってる方がいらっしゃったら教えていただけないでしょうか?
0681デフォルトの名無しさん
2006/05/30(火) 01:38:130682デフォルトの名無しさん
2006/05/30(火) 01:38:47BorlandR C++Compiler 5.5
http://www.borland.com/jp/products/cbuilder/freecompiler.html
パソ歴自体は8年くらいなんで変なミスはしてないと思うんですけどなんでダウンできないんですかね?
もし誰かもってたらうpしていただけませんか?
0683デフォルトの名無しさん
2006/05/30(火) 01:44:490684デフォルトの名無しさん
2006/05/30(火) 01:50:58そのままってたとえば
likeIP ip;
ip:address01 = 0x000F;
みたいにできるんでしょうか?
これだと桁が合わないのですが、あふれた分は切り捨てになるのかな??
0685デフォルトの名無しさん
2006/05/30(火) 01:51:12windowsUpdateしてなかったようでftpからダウンできないバグみたいな感じなってたみたいです。
ありがとうございました。
0686デフォルトの名無しさん
2006/05/30(火) 01:51:57682です。
0687デフォルトの名無しさん
2006/05/30(火) 01:57:32まず自分でやってみればいいじゃん(;´Д`)
g++の実装ではあふれた部分は切り捨てられる。
0688デフォルトの名無しさん
2006/05/30(火) 02:21:27いや、すいません。
実装してもエラーが出てしまうもので。。。
でもいろいろ試してみたらエラーは出ないようになったのですが値がちゃんと代入
されていないようなのです。これは何故なのだろう。
int main()
{
likeIP ip;
ip.func01 = 0x00;
ip.address01 = 0x0000;
ip.func02 = 0x00;
ip.address02 = 0x0000;
ip.func03 = 0x00;
ip.address03 = 0x0000;
ip.func04 = 0x00;
ip.address04 = 0x0000;
ip.func05 = 0x00;
ip.address05 = 0x0000;
ip.func06 = 0x00;
ip.address06 = 0x0000;
ip.func07 = 0x00;
ip.address07 = 0x0000;
ip.func08 = 0x00;
ip.address08 = 0xFFFF;
printf("%d\n",ip);
}
で出力が0になる。なんで?
0689デフォルトの名無しさん
2006/05/30(火) 02:22:53。解決しました。
0691デフォルトの名無しさん
2006/05/30(火) 09:13:06> likeIP ip;
> printf(
0692691
2006/05/30(火) 09:14:36>>688
> likeIP ip;
> printf("%d\n",ip);
printf()は構造体の中身なんて解析しねーよ、ボケ!
0693デフォルトの名無しさん
2006/05/30(火) 16:43:07GCC で、wstring をただの string に変換するには、どうしたら良いのでしょうか?
VC++の方法ならすぐ見つかるのですが、GCC でのやり方が見つかりません。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13908&forum=7
0694デフォルトの名無しさん
2006/05/30(火) 16:52:490695デフォルトの名無しさん
2006/05/30(火) 16:57:251バイト文字限定
wstring ws = L"hello";
string str(ws.begin(), ws.end());
2バイト文字は文字コード変換をかますしかないだろ
0696デフォルトの名無しさん
2006/05/30(火) 16:59:22そのURLの話は、wstringもstringも関係ない。
それはともかく標準C/C++ではwcstombsとか、std::convertとか。
ttp://hw001.gate01.com/eggplant/tcf/cpp/strcnv.hpp
0697693
2006/05/30(火) 17:01:58目的は、MeCab というライブラリを使うことなのです。
http://mecab.sourceforge.jp/libmecab.html
まだ良く分かっていないのですが、基本的にCで利用するような仕様で、元デー
タとして char * 型のデータしか与えられないようなのです。
しかし、その結果を処理するには、wstring型のほうが遥かに便利です。
そこで、MeCabとの入出力の部分で
wstring ←→ string ←→ char * という変換を行おうと思っていました。
0698デフォルトの名無しさん
2006/05/30(火) 17:13:280699693
2006/05/30(火) 17:39:06>>696 のリンク先は、実は見つけていたのですが、自分には分かりづらくて、
もっと単純なやり方はないものかと思っていました。
どうやら、C++ではこれが正しいやり方なのですね。気合を入れて読み込んでみます。
0700デフォルトの名無しさん
2006/05/30(火) 21:41:12void hoge(void)
{
static aaa = 1;
aaa++;
}
としたときに、aaa++;のところでアクセスブレークエラーなるものになりました。
なぜでしょうか?
0701デフォルトの名無しさん
2006/05/30(火) 21:51:000702デフォルトの名無しさん
2006/05/30(火) 21:51:58void hoge(void)
{
static int aaa = 1;
aaa++;
}
でした。
書きミスです。
0703デフォルトの名無しさん
2006/05/30(火) 21:59:310704デフォルトの名無しさん
2006/05/30(火) 22:02:48ただ今解決するため、修正中です。
また一つ勉強になりました。プログラム作りも大変ですね。
0705デフォルトの名無しさん
2006/05/30(火) 23:52:36class StrType{
char *p;
public:
StrType(){p = NULL;}
StrType(char *Array);
~StrType(){ delete p;}
StrType(const StrType &STobj);
StrType &operator=(StrType &STobj);
StrType &operator+=(StrType &STobj);
char *Get();
friend StrType operator+(StrType &STobj);
};
StrType::StrType(char *Array){・・・}
StrType::StrType(const StrType &STobj){・・・}
StrType &StrType::operator =(StrType &STobj){・・・}
StrType &StrType::operator +=(StrType &STobj){・・・}
char *StrType::Get()
{return this->p;}
StrType operator+(StrType &STobj1, StrType &STobj2)
{
StrType Temp;
Temp.Get() = new char [strlen(STobj1.Get()) + strlen(STobj2.Get()) +1];
strcpy(Temp.Get(), strcat(STobj1.Get(), STobj2.Get()));
return Temp;
}
最後のoperator+の構文がうまくいかないです。
以前ここで、四則演算の演算子のオーバーロードはフレンドが好ましいと聞いたので
フレンドでなんとかやろうとしてるんですが、上手くいかないです。
Temp.Get() = new char [s・・・の式の左のオペラントが正しくないとエラーがでます。
メンバにしてしまえばいけるんですが。
こういう場合はメンバにするしかないんでしょうか。教えてください。
0706デフォルトの名無しさん
2006/05/30(火) 23:59:27+char *&StrType::Get();
0707705
2006/05/31(水) 00:18:21はー、なるほど
参照のポインタで返せば良いんですか。
そっか。ありがとうございました。また知恵つきました。
ところで、-charと+charとはいったいなんなんでしょう。
そこも教えて欲しいです。
すいませんがお願いします。
0708デフォルトの名無しさん
2006/05/31(水) 00:24:31706でないけど、
-の行を削除して+の行を追加しろという事。
正誤表みたいなもん。
しかし、friendについて、ちゃんと勉強したのかい?
わけもわからず使っても意味ないと思うのだが。
0709708
2006/05/31(水) 00:32:09-friend StrType operator+(StrType &STobj);
+friend StrType operator+(StrType &, StrType &);
friend 宣言した関数からは、クラスのプライベートにアクセスできる。
この場合、StrType operator+(StrType &STobj1, StrType &STobj2)
だから、宣言の引数も2つないと意味がない。
0710708
2006/05/31(水) 00:35:05friend宣言したのなら、StrType クラスのpに直接アクセスできる。
だから、char *Get(); なんていらない。
-Temp.Get() = new char [strlen(STobj1.Get()) + strlen(STobj2.Get()) +1];
+Temp.p = new char [strlen(STobj1.p) + strlen(STobj2.p) +1];
0711708
2006/05/31(水) 00:40:06strcat()の使い方を間違えてる。
strcat()は、最初の引数のメモリに文字列を追加する。
だから、
strcat(STobj1.Get(), STobj2.Get()));
だと、STobj1に充分なメモリがないとメモリ破壊が起きる。
メモリを確保したのはTempなので、以下の様にすべき。
strcpy(Temp.p, STobj1.p);
strcat(Temp.p, STobj2.p);
0712708
2006/05/31(水) 00:47:39デストラクタでdelete p;としているが、これは、delete[] p; とすべき。
配列としてnewしたら、配列としてdeleteする。
↓参照
ttp://ray.sakura.ne.jp/tips/delete.html
0713708
2006/05/31(水) 00:58:16デストラクタでdelete するのなら、
コンストラクタでnewした方が良い。
引数で渡されるポインタ先のメモリをどこが廃棄すべきか明確でない。
そもそも、コンストラクタのポインタがnewで確保されたかどうかわからない。
StrType(char *Array){
p=new char[strlen(Array)+1];
strcpy(p, Array);
};
~StrType(){ delete[] p;}
0714708
2006/05/31(水) 01:06:44「初心者は friend なんか使うな」
friend は、オブジェクト指向の情報隠蔽を部分的に無効にする。
必要性をよく見極めて使わなくてはならない。
0715705
2006/05/31(水) 01:09:29ええ、書いてて自分で気づきましたよ
friendの宣言と定義で引数がちがって、別物になってるって
strcat()の文も書き直し済みです
deleteもわかってます。
単に、friendしたのに上手くいかないなと思って
定義ばっかなんども書きなおして見直してそれで
わからず書き込んだら。
706さんが一発回答くださったので、それで十分です。
ソースながめて、「あ、さっき書き込んだやつ訂正しなきゃ」と思って
またソース書き込むと見るほうは大変だと思いますしね。
ですので沢山の訂正は、ありがたいですが、それらの部分は了解済みです。
0716デフォルトの名無しさん
2006/05/31(水) 01:15:440717デフォルトの名無しさん
2006/05/31(水) 01:17:090718デフォルトの名無しさん
2006/05/31(水) 01:54:03ここからどういった参考書で勉強すればいいのかよくわかりません。
レベル的には初級〜中級くらいだと思うのですが、
みなさんならどういった参考書を買いますか?orどういった勉強をしますか?
0719デフォルトの名無しさん
2006/05/31(水) 02:24:16今度から、ほんとうに書いてて気づいた時には、書き込む前に直しましょうね。このクズが。
0720デフォルトの名無しさん
2006/05/31(水) 02:32:44逆アセンブルしてどういう風に動いているのかを見ながら、アセンブラをかじりつつ
コンソールアプリも飽きたでしょうから、WIN32apiでウィンドウズプログラミングに
挑戦しながら、C++を勉強していけば良いんじゃないっすか。
ただ、俺もシニア編持ってるけど、線形リスト、双方向リスト、環状リスト
挿入ソート、シェルソート、選択ソートにバブルソートでヒープソートに
クイックソート。検索法や、ファイル処理。
きっとまだやれることはいっぱいあるけど、まぁ、あれだ。
一気に何かやるんじゃなくて、順序よく色々勉強していけば良いんではないでしょうか。
色々なサイトを見て、「こんな事ができるんだ」と知り、宿題スレの人の宿題
解いてみたり。数独とかのパズルを解く方法考えたり(俺は思いつかないけど)。
とにかくお互いがんばろう。
0721705
2006/05/31(水) 03:02:07別にクズでいいよ。
ただ、一番意味わかんなかったのは、コンストラクタの中身
俺、書き込んで無いのに、注釈つけるし
最後には「初心者はfriendなんか使うな」だもんな〜
それって、friendに関して勉強するなって事なのか?
中級者になってはじめてfriendを使えって事なのか?
ま、良いけどさ、前にここで演算子のオーバーロードの質問
したとき四則演算はfriendを使うべきだよと言われたから
使うようにしてて、で下手くそなソースさらして、この部分が
わからないから教えてくださいと言ったら>>706さんが即答
してくれて・・・・
わけわかんねーよ。俺、それ以外質問してねーもん。
それも人を上目線からみるような書き方して
friend使うな。クズが。って書かれて感謝しろってのが無理だよ。
0722デフォルトの名無しさん
2006/05/31(水) 03:39:32わたしは >>708 ではありませんが、それぞれの指摘には
全部理由が添えてありますので、読んでやれよカス。
ちなみに >>706 みたいな解決する奴は腹を切って死ぬべきだ。
おそらく >>706 はそれを知りながら、いくばくかの悪意を込めて書いています。
0723デフォルトの名無しさん
2006/05/31(水) 03:44:18operator+にfriendは不要。
operator+はoperator+=で実装すべき。
そしてconstはコピーコンストラクタ以外でも正しく定義せよ。
という内容のお節介を普段の俺なら書きたいところだが、
「そんなことは俺は質問してない!」
とか逆切れされそうなので詳細は書かないでおく。
0724デフォルトの名無しさん
2006/05/31(水) 04:25:38721は劣等感をやばいぐらいに持ってるリアル厨房かな。
だったらああ言っちゃうのもわかるけど。俺も昔はその部類だったから。
ま、勉強してりゃ少しはマシになるだろ。でなきゃいずれ大変な思いをするだけだ。
0725708
2006/05/31(水) 05:08:12>なんだよ、やっぱむかつてたんだ。
うん、むかついた。 むかつきすぎてレスできなかったw
だから、>>719 >>717 は私のレスではないよ。
まぁ、キミが怒る理由は想像できる。
私の書き方が「人を上目線からみるような書き方」と
感じるキミの感性は正しいからね。
でもさ、書いてある内容は親切なつもりで書いているのさ。
friendの宣言とstrcat()とdeleteに関しては余計だったようだね。
ごめんよw
だけど、こっちはキミの力量なんか知りようがないからね。
0726708
2006/05/31(水) 05:16:54>ただ、一番意味わかんなかったのは、コンストラクタの中身
>俺、書き込んで無いのに、注釈つけるし
それはね。多分コンストラクタでnewしてないと思ったからさ。
コンストラクタでnewしてたかい?
もし、してたらメモリーリークを起こすよ。
キミはStrType operator+(StrType &STobj1, StrType &STobj2)で
newしたポインタをStrTypeクラスのpに代入してるよね?
デストラクタでdeleteされるのはこのメモリだ。
じゃ、コンストラクタでnewしたメモリは誰がdeleteする?
コンストラクタでnewしてデストラクタでdeleteするのは定石みたいなもんだ。
覚えといて損はないよ。
0727デフォルトの名無しさん
2006/05/31(水) 05:19:49突っ込まれるようなソース貼っておいて、随分と偉そうだねぇ。
君は「謙虚」という言葉の意味を学ぶべきだ。
0728デフォルトの名無しさん
2006/05/31(水) 05:28:34>それって、friendに関して勉強するなって事なのか?
>中級者になってはじめてfriendを使えって事なのか?
勉強するなとは言わない。でも使わない方が良い。
キミは、friend を使う段階にはいない。
まず、情報隠蔽を勉強しなさい。
まぁ、キミが趣味でプログラミングするだけなら、
余計なお世話だけどね。
これは、プロを目指す人向けの忠告。
良質なプログラムを作るつもりがないなら忘れて下さい。
0730708
2006/05/31(水) 06:27:33Tempはデフォルトコンストラクタで生成してるから
メモリリークは起きないな。
私の勘違いだ。ゴメンよ。
0731デフォルトの名無しさん
2006/05/31(水) 06:49:15クズのままでいたいっていうなら質問するなよ。
>人を上目線からみるような書き方
実際はどうなんだ?もしかして上にいるつもりだったの?
>感謝しろってのが無理だよ。
いやいや。事実を教えてもらったんだから感謝してしかるべき。
0732デフォルトの名無しさん
2006/05/31(水) 06:59:50でも、たまにあると便利なときはある。
0733デフォルトの名無しさん
2006/05/31(水) 07:03:57原因は何だったの?
0734デフォルトの名無しさん
2006/05/31(水) 10:39:50無根拠なプライドをフルパワーで守りだすと
手が付けられないんだよね。
そんなことに頭を割いて生きてるから
いつまで経っても何一つできるようにならないってのに。
0735705
2006/05/31(水) 10:54:37まぁ、俺もむかついたわけ。初心者じゃなくて入門者って言えば良いのか
ようは、まだ勉強中の身だからこそ、ああいう質問したわけで、その結果
色々な、内容の最後に「初心者はfriend使うな」と書かれちゃ
「じゃぁ、勉強すんなってか?実際打ち込んで経験積まんと
知識すら身につかねーだろ」と思い
わざとらしく「要望してない不必要な注釈と講釈はいらん」と
軽くむかつくだろうなという感じの文体で書きました。
ただ、これだけは信じてくださいな。
ここにfriendの質問した後、ソースながめて「あ、バッファたりねえ」と思い
自分のアップしてしまったソースの内容を、変更して、「これでバッファは足りるは」
って思って見たらスレ見たら>>506さんの内容があって、へーなるほどなと思い
さらに質問した後に、>>708さんの書き込みがあって
そんで最後の「初心者はfriend使うな」で、「なんだこいつ」と思ったわけですわ。
ま、>>708さんが>>725で「ごめんよ」と先に謝った以上俺の方が精神的にまだガキ
って事っすね。
自分の力量が相手にわかるわけでもないのに
補足説明をしてもらっているにもかかわらず、馬鹿レスして申し訳ありませんでした。
0736デフォルトの名無しさん
2006/05/31(水) 11:05:190737デフォルトの名無しさん
2006/05/31(水) 11:53:09この板ではなかなか見られないよね。
0738デフォルトの名無しさん
2006/05/31(水) 12:27:06テストの点が悪い小学生の言い訳だ。
間違えたという事実があり、そしてその事実が重要だろう。
0739デフォルトの名無しさん
2006/05/31(水) 13:11:110740デフォルトの名無しさん
2006/05/31(水) 13:34:46俺も「初心者はfriend使うな」という類のお節介は嫌いだし、
おまえが腹を立てるのも理解できるが、>>715はどうかと思う。
アドバイスが自分にとって役に立たないと思うなら礼だけ言って気にしなければいいし、
それも嫌ならスルーするのもアリだと思うが、
善意の回答者に嫌味を言うのは、無闇に人を不愉快にさせるだけで、
うまくないんじゃないだろうか。
0741724
2006/05/31(水) 13:36:37親切心で教えてくれているのに、あの態度はないだろう。
言う前にどんどん吸収していけばいいのに。
以前こういう言葉を見たことがある。
「忠告ほど他人が気前よく与えるものはない」
親切心から何かをしてくれる人なんてそうそういないんだよ。
大人になれば君のことなんて誰からも相手をされないよ。
もちろん君だけじゃなくて、みんながそうだけど。
なぜなら利害の関係になってしまうから。
>そんで最後の「初心者はfriend使うな」で、「なんだこいつ」と思ったわけですわ。
うまく使えばいいテクニックでも初心者が使っていて逆に危なくなってたら
「やめろ」とも言いたくなるだろ。いつまでも気がつかずに使っていくかもしれんしな。
0742デフォルトの名無しさん
NGNG議論すればいいだけなんだな。
0743デフォルトの名無しさん
2006/05/31(水) 14:03:150744デフォルトの名無しさん
2006/05/31(水) 14:34:18よっぽど結合の強いクラスだけだな。
friend なんて滅多に必要にならない。
friend を使おうとした場合は、
大抵は設計がマズいから必要になってしまうだけ。
friend を使ってしまうよりは、
friend を使わずにどう実装すればいいかを
考えたり調べたりする方がよっぽど勉強になる。
それで無理なら friend を使わざるを得ない状況なのだと思っておけばいい。
friend を使うこと自体は別に難しいもんじゃないわけだし、
特別 friend について勉強するべき事は無いな。
0745デフォルトの名無しさん
2006/05/31(水) 14:54:18そっちのほうは使うなって人はいないね。
0746デフォルトの名無しさん
NGNG0747701
2006/05/31(水) 15:08:52Cの仕様では型宣言子がないとintとみなす(参照:K&R P261)ので700でも一応間違いじゃなかった。すまん。
C++だと無効だが。
0748デフォルトの名無しさん
2006/05/31(水) 15:10:35偶々といえば偶々だけど、ここ2年くらい使ったことないや。
コード上でも実生活でも友達少ない人間ですから。
0749デフォルトの名無しさん
2006/05/31(水) 15:13:060750デフォルトの名無しさん
2006/05/31(水) 15:14:180751デフォルトの名無しさん
2006/05/31(水) 15:14:18え? アクセスできるでしょ?
0752デフォルトの名無しさん
2006/05/31(水) 15:20:33staticメンバ変数にはアクセスできる
非staticメンバ変数はダメ
thisがないのだから当たり前っちゃ当たり前
0753デフォルトの名無しさん
2006/05/31(水) 15:26:57thisが無いのはfreindも同じでしょ?
インスタンスを渡してもらえば、privateな(staticでない)メンバ変数に
アクセスできるってのも、両者同じ。
0754デフォルトの名無しさん
2006/05/31(水) 15:32:49operator<<も
0755デフォルトの名無しさん
2006/05/31(水) 15:33:550756デフォルトの名無しさん
2006/05/31(水) 18:07:20初心者でもプログラミングがよくわかる参考書あるいはサイトを
教えていただけないでしょうか?
ちなみに↓がうちの大学で使ってる資料です。
http://www.amazon.co.jp/exec/obidos/ASIN/4274064409/
正直めちゃくちゃ分かり難く教授以外、生徒皆認めてません。
こういうのはマルチっていうのかな・・・。
そうだったら、すみません。
0757デフォルトの名無しさん
2006/05/31(水) 18:47:14推薦図書/必読書のためのスレッド PART31
http://pc8.2ch.net/test/read.cgi/tech/1146122168/
0758デフォルトの名無しさん
NGNGレビューは評価高いじゃん。
0759デフォルトの名無しさん
2006/05/31(水) 20:38:41C++が初めてのOOPなら、あんまり凝ったことしないほうがいいだろうね。
0760デフォルトの名無しさん
2006/05/31(水) 20:59:06それ俺持ってる。
わかり易いかどうかはともかくCのソースをぱっと見て
だいたいどういうプログラムか判断付くまでのレベルの本。
関数とか結構わかりやすいと思ったけど教材のせいにしてたら
いつまでたっても身につかんと思うのでとりあえずやってみれ。
0761デフォルトの名無しさん
2006/06/01(木) 00:09:54答えは簡単でした。static変数はROMに割り当てられているので
ROM→RAMにコピーし忘れてました。
そのため、ROMにライトしてエラーになりました。
また、関数をROMにおき、関数ポインタを構造体の中で定義し
アクセスしようとすると、ROM→RAM展開前にその関数を呼ぶと
とんでもないことになったりします。
なかなか難しいですね。
0762デフォルトの名無しさん
NGNG0763デフォルトの名無しさん
2006/06/01(木) 00:28:430764デフォルトの名無しさん
2006/06/01(木) 00:48:350765デフォルトの名無しさん
NGNG0766デフォルトの名無しさん
NGNG0767デフォルトの名無しさん
2006/06/01(木) 01:26:44俺もそっちの方面だからよくわかるが、ここにいる人は
そもそも、そのような方面の人は少ないから
ROM→RAMだのいってもわからんと思うよ。
住む世界が違うんだし。
0768デフォルトの名無しさん
2006/06/01(木) 01:28:58ROM 環境ではよくあることだ。
0769デフォルトの名無しさん
NGNGとりあえず説明してみてよ。
> 関数ポインタを構造体の中で定義し
> アクセスしようとすると、ROM→RAM展開前にその関数を呼ぶと
> とんでもないことになったりします。
ここらへんとか興味ある。
「ROM→RAM展開前」って、なにを「展開」してるの?
0770デフォルトの名無しさん
2006/06/01(木) 01:47:49const でない静的変数で初期値を持つものをコピーする操作のことだろう。
この操作は main() の前に行う。 main() の前に実行されるコードを
一般的にスタートアップコードという。スタートアップはコンパイラが
自動的に提供してくれることもあるが、 ROM を意識するような環境では
プログラマが自分で書く、または書くこともできるようになっている。
参照:
http://www.google.co.jp/search?q=%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97+data+bss
0772デフォルトの名無しさん
NGNG> 答えは簡単でした。static変数はROMに割り当てられているので
> ROM→RAMにコピーし忘れてました。
> そのため、ROMにライトしてエラーになりました。
↑さっぱり意味がわかりません。
0773デフォルトの名無しさん
2006/06/01(木) 02:19:33あぁこれはスタートアップだけじゃわからんな。
こういう環境ではメモリの配置もリンカの引数や専用のスクリプトで制御することができる。
プログラム内でメモリを使用するものは、用途ごとにセクションと呼ばれるものに
分けられる。一般的には以下の4つ。
text: プログラム
rodata: 読み取り専用データ(定数)
data: 0以外の初期値を持つ変数
bss: 全ビット 0 で初期化される変数
C言語の要素ではだいたい以下のようにわけられる。
int text() {}
int const rodata = 0;
int data = 1;
int bss;
リンカへの指定を間違えて data を ROM に配置してしまうと、 >>761 になる。
実際に間違えてるのか意図的にやってるのかどうかはわからん。
0774デフォルトの名無しさん
NGNGスタートアップルーチンのミスで、関数のポインタがとんでもない
ことになる?
なかなか大変ですな。
0775デフォルトの名無しさん
2006/06/01(木) 02:38:38static変数自体はRAMで初期値がROMなんじゃないかとも思ったんだが。
0776デフォルトの名無しさん
2006/06/01(木) 02:43:42そうそう。そのせいで data セクションに関するリンカへの指定
および対応するスタートアップでの処理はちょっとややこしいことになる。
そんなわけで data は ROM に置いてしまって bss + 明示的な初期化で
代用してしまう方法もよく見る。
0777デフォルトの名無しさん
2006/06/01(木) 08:06:051.初期値を持つデータをまずROMセクションに配置(リンカの設定、仮にDDATAセクションとする)
2.同じようにRAMにもセクションを設定(リンカの設定、仮にRDATAセクションとする)
3.ROM→RAMセクション割り当てでDDATA→RDATAになるようにリンカを設定
4.電源投入後の処理の中でROMに割り当てられたDDATA領域をmemcpyなどでRDATA領域へコピー
5.他の関数などがstatic変数にアクセスするときはRDATAにある変数を参照する
注意1:4でコピーする前にstatic変数にアクセスするとごみを参照してしまう。
注意2:リンカで3の設定をしないと、いくらDDATA→RDATAへコピーしても
ROMに割り当てられたDDATAを参照するため、ライトエラーになる。
そのため、関数ポインタを持つ構造体を、初期設定処理などで定義するならばともかく
最初から定義していると、ROMにおかれ、RAMへコピーする前にその構造体を使って
関数をコールすると、うまくいかなくなる。
仮に、別セクションに割り振って、ROM配置にした場合、うまくいくが、その構造体に
関数ポインタだけでなく、変数などを定義していた場合(CをC++っぽくした場合など)
は、やはりROMへライトしようとするのでエラーとなる。
ROMからRAMへコピーして実行する理由として処理速度の向上などもある。
0778デフォルトの名無しさん
2006/06/01(木) 12:20:00あー RAM に関数置いてるのね。そんなの言われないとわかんねーよ。
RAM に置きたい関数は DDATA に吐くか、 DDATA と同様に処理してやればよいと思われ。
0779デフォルトの名無しさん
2006/06/01(木) 18:38:52セグメンテーション違反は、try〜catchで捕らえられないのでしょうか?
Windowsの時と同じ感覚で、try〜catchで捕らえようとしても、
セグメンテーション違反が起きると、そこで必ず終了してしまいます。
0780デフォルトの名無しさん
2006/06/01(木) 18:41:00例外処理について勉強しなおすべし
0781デフォルトの名無しさん
2006/06/01(木) 19:59:14これは面白いと思ったんだけど
なんか似たようなおすすめのツールとかビルダーみたいな
ものはないだろうか。
0782デフォルトの名無しさん
2006/06/01(木) 20:01:08その通りです
0783デフォルトの名無しさん
2006/06/01(木) 20:27:43なんでCスレで聞くの
0784デフォルトの名無しさん
2006/06/01(木) 20:32:51あー
前々からC++やりたいなと思ってて
エクセルでプログラムの面白さを改めて知って
Cで分かりやすいソフトあったらいいなと
よく考えたら確かにおかしかったな
0785デフォルトの名無しさん
2006/06/01(木) 21:24:42むしろそれで捕まえられるWindowsの方が特殊。
例外処理をOSが支援していて、そんなこともできるようになっている。
基本的にtry 〜 catchで捕まえられるのはthrowで投げた例外だけ。
0786デフォルトの名無しさん
2006/06/01(木) 21:57:51>>785
そうでしたか。どうもtry〜catchに頼りすぎてたみたいです。
ありがとうございました。
0787デフォルトの名無しさん
2006/06/02(金) 01:20:39じゃ、Windows以外の時、どういうコーディングしてるのか激しく疑問。
unix系の場合シグナルハンドラを定義するんだろうけど、
ちょっと調べたら、gccだと、シグナルハンドラから例外をthrowできないんだよね?
TRY/CATCHマクロがあるみたいだけど、これならシグナルをcatchできるの?
0788デフォルトの名無しさん
2006/06/02(金) 06:42:34クラス内のメンバをコピーする際に、プライベートのメンバはどのようにしてコピーすればよいのでしょうか?
0789デフォルトの名無しさん
2006/06/02(金) 06:58:55ExceptionalC++のオーバーロードのガイドラインより
・=, (), []と->は、メンバ関数にしなければならない
0790デフォルトの名無しさん
2006/06/02(金) 09:28:11なぜメンバ関数にしない?
0791デフォルトの名無しさん
2006/06/02(金) 11:05:440792787
2006/06/02(金) 11:53:41フェールソフトの考えに基づく処理。
具体的にパッと思いつくのは、
例えば、大量のデータを処理している時に、
エラーの発生したデータに関してログを出力して、
次のデータから処理を続行するとかかな。
0793デフォルトの名無しさん
2006/06/02(金) 11:56:18不正なデータに対応できないプログラム側のチェック不備なんだから
そのまま処理を継続したってロクなことがないだろ
0794787
2006/06/02(金) 12:14:10まぁ、考え方はいろいろだと思いますが…。
あまり、必要性の細かい点まで議論するつもりはないので。
「unix系ではシグナルに起因するエラーをtry/catchする方法はない」
と考えて良いのでしょうか >>all
0795787
2006/06/02(金) 12:19:07「try/catchする方法」
↓
「try/catchもしくは、代替手段」
「最初っから言ってんだろ」とか書かれそうだw
0796787
2006/06/02(金) 12:30:13なんかめんどいコーディングになりそうだけど…。
0797デフォルトの名無しさん
2006/06/02(金) 12:32:27longjmpで強制的に飛ばすことはできるけど、局所オブジェクトの解体が正常に行われないから
制御が復帰してもメモリリークしてる。
0798デフォルトの名無しさん
2006/06/02(金) 12:32:34とりあえず signal では無理な処理をしたいのか?
0799デフォルトの名無しさん
2006/06/02(金) 12:35:42SEH(__try/__except)を使えば可能だけど、C++標準の例外では無理だったような…
0800デフォルトの名無しさん
2006/06/02(金) 12:37:450801デフォルトの名無しさん
2006/06/02(金) 12:40:53try {
int m=0xDEADBEEF;
int i = *(int *)m;
} catch(...) {
}
でUnhandled exception扱いにされたが…
Releaseビルドだと問答無用で強制終了。
0802デフォルトの名無しさん
2006/06/02(金) 12:42:380803787
2006/06/02(金) 12:54:29そうですか。ありがとうございます。
やっぱり普通はアプリを落としちゃうんですね。
>>798
いや、具体的に困ってる訳ではないです。
今後、unix系のお仕事をやる時の参考にしたかったんです。
すみません。
>>799-802
私の場合、::_set_se_translator()で組み込んだハンドラで例外をthrowしてます。
0804デフォルトの名無しさん
2006/06/02(金) 13:02:57SEHをC++の例外に関連づけるわけですね、なるほど。
移植性はないけど、リリース時に組み込むと結構使えるやも。
0805デフォルトの名無しさん
2006/06/02(金) 16:33:052003ではキャッチできるな
0806デフォルトの名無しさん
2006/06/02(金) 19:51:10本当だ。ランタイムの仕様が変わったかな?
0807デフォルトの名無しさん
2006/06/02(金) 19:54:58言語仕様を尊重したのかね
0808デフォルトの名無しさん
2006/06/02(金) 22:12:07処理効率を優先したんだよ。
SEH まで考慮すると throw() が書いてあるとか C 標準関数だとか
C++ 例外が起こりえないケースを最適化できない。
0809デフォルトの名無しさん
2006/06/02(金) 23:45:53WinXPにて、Borland C++ Compiler 5.5を使っています。
あるC言語ファイルをコンパイルに際し、imagehlp.libが開けないというエラーが・・・
落として入れなおしても駄目でした。
エラーが出なくなる方法について、お知恵をお貸しください。
0810デフォルトの名無しさん
2006/06/03(土) 00:08:11implibでimagehlp.libを作ればよい。
0811デフォルトの名無しさん
2006/06/03(土) 04:04:46コンパイルする度に挙動が変わる状態に…。
一度こんな状態に陥ると、もう泥沼ですね…
参照設定しているDLLは全てC♯製なので、そもそもそれも無茶な話なのかもしれない…
みなさんはコンパイルする度に動作が変わったとき、どうやって切り抜けます?(T-T)
…すれ違いな質問でしたかね。
悲しくなって、つい聞いちゃいました。
チラシの裏スマソ。
0812デフォルトの名無しさん
2006/06/03(土) 04:40:12そもそもC++.NETからC♯を呼び出そうとする時点で
激しく危険な気がするのだが。。。。。。
0813デフォルトの名無しさん
2006/06/03(土) 08:19:22そうか?
0814デフォルトの名無しさん
2006/06/03(土) 08:28:510815デフォルトの名無しさん
2006/06/03(土) 08:39:140816デフォルトの名無しさん
2006/06/03(土) 09:22:310817デフォルトの名無しさん
2006/06/03(土) 11:45:02void mat_add2(int(*)[COL],int(*)[COL]);
といった、2次元配列を2つ引数に取る関数を使った練習問題があったので
そのmain関数に2次元動的配列を動かそうとしたのですが、
型が違うと言うエラーが出て来ました。その解決法を
伺いに参りました。
以下に、コード全文を貼り付けます
#include<stdio.h>
#include<stdlib.h>
#define ROW 3
#define COL 4
void mat_add2(int(*)[COL],int(*)[COL]);
int main()
{
int a[][COL]={01,02,03,04,11,12,13,14,21,22,23,24};
int b[][COL]={10,10,10,10,20,20,20,20,30,30,30,30};
int** c;
int i,j;
mat_add2(a,b);
0818817
2006/06/03(土) 11:46:27for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
printf("%02d ",a[i][j]);
}
printf("\n");
}
c=(int**)malloc(sizeof(int**)*COL);
for(i=0;i<ROW;i++)
{
c[i]=(int*)malloc(sizeof(int)*ROW);
}
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
c[i][j]=i*j;
}
}
printf("\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
}
0819817
2006/06/03(土) 11:47:34mat_add2(c,a);
printf("\n");
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
}
printf("\n%p\n",a);
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
printf("%p ",&a[i][j]);
}
printf("\n");
}
for(i=0;i<COL;i++)
{
free(c[i]);
}
free(c);
return 0;
}
0820817
2006/06/03(土) 11:50:18void mat_add2(int(*x)[COL],int(*y)[COL])
{
int i,j;
for(i=0;i<COL;i++)
{
for(j=0;j<ROW;j++)
{
x[i][j] += y[i][j];
}
}
}
とある書籍にあった例題をもとに、動的配列cを扱えないかと作ったのですが
エラーは「関数はint(*)[4]でないint**は取れない」というものでした。
この場合、cをどのような形式にすべきでしょうか。
あるいは関数の型自体を変える場合、どのような引数型が望ましいでしょうか。
ご指導お願いします
0821デフォルトの名無しさん
2006/06/03(土) 11:52:52(その場合、forでcの各要素(c[i])に個別にmallocする必要は無い。)
0822817
2006/06/03(土) 12:09:450823デフォルトの名無しさん
2006/06/03(土) 12:31:20そもそも、コンパイルするたびに挙動が変わるっておかしくない?
同一ソースなら何回コンパイルしても同じになるでしょ?
挙動が違うように見えるだけで、ソースどおり動いているのでは?
0824デフォルトの名無しさん
2006/06/03(土) 12:35:240825デフォルトの名無しさん
2006/06/03(土) 12:57:30よく『C++はオブジェクト指向としては不十分』と聴きますが。
0826デフォルトの名無しさん
2006/06/03(土) 13:15:54どう切り抜けるも何も、単にバグがあるだけだろってな話で。
デバッグするだけだな。
0827デフォルトの名無しさん
2006/06/03(土) 13:30:010828デフォルトの名無しさん
2006/06/03(土) 13:44:20C++.NETならGCあるから勝手にガベージコレクタしてくれるから
領域壊すってことあるの?
>>811
参照設定の参照先があっているかを確認したほうがよくないか?
0829デフォルトの名無しさん
2006/06/03(土) 15:08:13アクセスするというなかなか再現しないバグに出くわしたときは、
データが壊れてないかこまめにチェックして結果をログファイルに書き込んで
原因絞り込んでた。
0830デフォルトの名無しさん
2006/06/03(土) 15:28:340831デフォルトの名無しさん
2006/06/03(土) 15:50:030832デフォルトの名無しさん
2006/06/03(土) 16:00:45整理すると
・ポインタを使用されてしまうと、アクセスできる手段があるか否かは、ガベコレには追跡できない
⇒勝手にガベコレに解放されてしまう可能性がある
え、そうなの!?
自分理解足りなかったかも
�@mallocしたらfreeするまで解放されない
�Anewしたらdeleteするまで解放されない
�Bchar*などは、mallocしていないなら、使用されなくなったら、あるタイミングでガベージコレクタされる
と思ってたんですが。。。。。。
0833デフォルトの名無しさん
2006/06/03(土) 16:04:33C/C++にはガベージコレクション機能なんてありませんが
0834832
2006/06/03(土) 16:14:45参照設定をC♯〜〜云々の話から、.NET Framework上で稼動するC++.NETの
お話だと思ってたんですが。ちがってたらスマソorz
(一応【環境依存OK】とのことだったので
純粋なC/C++の話限定ではないと思ってたんですが…)
0835デフォルトの名無しさん
2006/06/03(土) 16:17:18>>833はわかってていってんだと思うよ。
>>814、>>828の文脈見ればこの板の住人ならおおよそわかるじゃないかw
0836デフォルトの名無しさん
2006/06/03(土) 16:21:02C++/CLIを使う場合でも、ガベコレに管理させるにはgcnewを使わないといけないし
ポインタの解放忘れを追跡してくれないことには変わりないんだが
0837デフォルトの名無しさん
2006/06/03(土) 16:27:50一応わかってればいいっすけど
newしたものはdeleteするまでというより
ブロック抜けたら勝手にデストラクトしちゃうから
気をつけて(どういう構文かにもよりますが)
0838デフォルトの名無しさん
2006/06/03(土) 16:28:12�Bは漏れにはちょっとわからん(.NETでなぜC++なんか使うの?VB.NETかC#にしろよw)
�@と�Aって、まさに純粋なC/C++の話で、�BはC++.NETの話、だろ。
C++.NETでもC++準拠のソースは書けるはずだから
「おれはGC利用しなくてもきっちりコーディングできる」
自信があるのなら、�@、�Aのみで作れば問題ない。
0839デフォルトの名無しさん
2006/06/03(土) 16:34:29それは大前提がおかしい。.netで開発する以上。netの便利な機能は活用すべき。
GCに頼らず全て自力でメモリ管理するなど愚の骨頂。
(もちろん明示的にfreeするのはかまわないが。)
コード上はGCがなくても問題ないように記述し、(つまりC/C++で問題ないレベルでコーディングし)
その上で、保険の意味でgcnewを活用すれば鉄板w
0840デフォルトの名無しさん
2006/06/03(土) 16:46:13>ブロック抜けたら勝手にデストラクト
って何の話なの? C++の話じゃないってことですよね?
(C++/CLIとか知らないのでスイマセン)
0841デフォルトの名無しさん
2006/06/03(土) 16:52:21それを理由に C/C++ を選択したと考えられなくもない。
GC 外した方がいい状況ってのも確かあった気がするが、
GC のある言語をあんま使ってないのでどういう状況だったかよく覚えてない。
0842デフォルトの名無しさん
2006/06/03(土) 17:18:56いや、C++だけど
単純な事を言いたかっただけです
例えば
int main()
{
{
ClassName obj;
}←このブロック抜けたらobjが破棄される
return 0;
}
ってだけの事を言いたかっただけです。
ま、コピーコンストラクタとか普通に装備しといて(その他うんぬんのメソッドも)
いれば別に問題は無いんで、特に気にせんでください。
0843デフォルトの名無しさん
2006/06/03(土) 17:50:54コード例まで載せていただきわかりやすかったです。
例で使用しているobjはブロック内で宣言したものだから
ブロック抜けると無効になるので、freeしてなくても破棄されちゃう、ということですね。
実際にコーディングする際は、ブロック内であっても意図的に
メモリ解放したい場合、freeする、という感じでしょうか。
0844デフォルトの名無しさん
2006/06/03(土) 18:25:510845デフォルトの名無しさん
2006/06/03(土) 18:52:48C言語のプログラムですが、1000とか2000行とか書いていても
バグが出にくい書き方とか、バグを見つけやすい方法とか
ありますか?
0846デフォルトの名無しさん
2006/06/03(土) 19:01:010847デフォルトの名無しさん
2006/06/03(土) 19:02:090848デフォルトの名無しさん
2006/06/03(土) 19:08:33ともあれ、Webで無料で読める文書としては、
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/index.html
とか。
0849デフォルトの名無しさん
2006/06/03(土) 19:21:35見てみます。
0850デフォルトの名無しさん
2006/06/03(土) 19:21:47バグが出にくいかどうかは別だけど
一つの処理に対して、長くて100行ぐらいで収めておきましょう
あとは、>>848さんの言うとおり。
分割コンパイル。
ヘッダにはグローバル変数と関数の定義を忘れずにね
0851デフォルトの名無しさん
2006/06/03(土) 20:25:540852デフォルトの名無しさん
2006/06/03(土) 20:52:11どうもです。
分割コンパイルぐぐってみます。
0853デフォルトの名無しさん
2006/06/03(土) 21:09:32構造体を使った例を良く見かけるのですが、
構造体のメンバーの夫々の変数値を取得するには
ポインタ(間接参照)で取得するのでしょうか?
0854デフォルトの名無しさん
2006/06/03(土) 21:22:370855デフォルトの名無しさん
2006/06/03(土) 21:26:01夫々=それぞれ
0856デフォルトの名無しさん
2006/06/03(土) 21:27:300857デフォルトの名無しさん
2006/06/03(土) 21:37:240858デフォルトの名無しさん
2006/06/03(土) 21:44:050859デフォルトの名無しさん
2006/06/03(土) 21:46:21使ったことないから知らんけど。
0860デフォルトの名無しさん
2006/06/04(日) 10:05:33いや、全部COMメソッド呼び出しでやる。
あの構造体を間接参照しても、おそらくろくなものは得られない。
0861デフォルトの名無しさん
2006/06/04(日) 11:00:48上の>>853>>859>>860
で出てくるCOMメソッドって
アセンブラで書く.com形式のプログラム
とは別物なんですか?
0862デフォルトの名無しさん
2006/06/04(日) 11:03:52ttp://e-words.jp/w/COM.html
0863デフォルトの名無しさん
2006/06/04(日) 12:33:540864デフォルトの名無しさん
2006/06/04(日) 12:45:35BCC5.5
GCC
用途に合わせて適当に切り替え
0865デフォルトの名無しさん
2006/06/04(日) 20:36:08C++についてよく言われるのは、GCがないことや多重継承があること。
そしてオブジェクト指向プログラミングだげが全てではないこと。
0866デフォルトの名無しさん
2006/06/04(日) 21:53:28http://pc8.2ch.net/test/read.cgi/tech/1146185570/
埋まっちゃいましたが、私のホストでは次スレ立てられませんでした。
誰か宣言してスレ立てお願いします。
0867デフォルトの名無しさん
2006/06/04(日) 23:34:18http://pc8.2ch.net/test/read.cgi/tech/1149427282/
0868デフォルトの名無しさん
2006/06/04(日) 23:40:24GJ!
0869デフォルトの名無しさん
2006/06/05(月) 06:22:44ダウンサンプリングしないオプション設定はないのでしょうか?
0870デフォルトの名無しさん
2006/06/05(月) 08:17:03jpegについて勉強しましょう。
ロスレスだとサイズが大きくなるのがjpegです。
0871デフォルトの名無しさん
2006/06/05(月) 09:07:28えっとそうではなくて…。
libjpegでjpeg_set_qualityを100に指定し変換した画像のサイズが、
TOOLの「藤 -Resizer-」でJPEGダウンサンプリングにチェックを入れ
JPEG画質を100にして変換したサイズと同じになってしまったという事です。
つまり「藤 -Resizer-」で言えばJPEGダウンサンプリングに
チェックを入れなかった場合の変換をlibjpegでやりたいのです。
jpeg_set_qualityの様な非デフォルトオプションがあれば良いのですが。
0872デフォルトの名無しさん
2006/06/05(月) 13:53:34何か弊害とかあれば教えて欲しいです。
0873デフォルトの名無しさん
2006/06/05(月) 14:08:39C++の「大きさ」に頭か根性のどっちかが追いついていなかっただけ。
0874デフォルトの名無しさん
2006/06/05(月) 14:15:24それから先うまくやれるかどうかは個人の器量次第だが。
0875デフォルトの名無しさん
2006/06/05(月) 19:59:51C++はCのほぼアッパーコンパチ(若干違うらしいが)なんでCの知識は無駄にならんし、
C++の本や解説ホームページはCを知ってることが前提となってることが多いから。
0876デフォルトの名無しさん
2006/06/05(月) 20:42:470877デフォルトの名無しさん
2006/06/05(月) 21:09:29まぁそれも一理あるな。
俺のような凡人はCの知識がC++本来の使い方を阻害する面もある。
ただ、いきなりC++をやる場合は情報元を選ばんといかんね。
仕様書だけでやるって話もあるけど、俺には無理だな。
0878デフォルトの名無しさん
2006/06/05(月) 21:26:13Cに用はないな。
0879デフォルトの名無しさん
2006/06/05(月) 22:10:42for くらい覚えろ。
0880デフォルトの名無しさん
2006/06/05(月) 22:37:46何となく comp_info->h_samp_factor と comp_info->v_samp_factor を 1 にすれば
良さそうな感じはするけど・・・
0881880
2006/06/05(月) 22:40:42comp_info[1].h_samp_factor = comp_info[1].v_samp_factor = 1;
comp_info[2].h_samp_factor = comp_info[2].v_samp_factor = 1;
か。
0882デフォルトの名無しさん
NGNG0883デフォルトの名無しさん
2006/06/05(月) 23:33:36v_samp_factor と h_samp_factor ではなくて max_v_samp_factor と max_h_samp_factor ?
この二つを 1 にしてやっても結果は変わらずでした;
0884デフォルトの名無しさん
2006/06/06(火) 00:16:44{
int i;
for(i = l; i <= m || m + 1 <= r; i++){
if(a[i] > a[m+1]){
swap(i, m+1);
m++;
}
}
}
マージソートを作っていました。
swapは配列を一つずつずらす物です。
コンパイルまでは上手くいく物のエラーメッセージがでて色々あがいていたところ、
for文に論理演算使えるんかいな? と、||を&&に書き換えて試したところ、
ちゃんとソートできると言う結果に。&&がandで||がorですよね?
上手く行ったのは良いのですが理由がわかりませんorz
ご教授ください。
0885デフォルトの名無しさん
2006/06/06(火) 00:30:01行われているっていうことは、i <= m は一回成立したら以後ずっと TRUE じゃん。
iやmがどんどん大きくなってったら、a[i]、a[m+1] が確保したメモリの外側に行っちゃう。
マージソートはどんなんか忘れたけど、とにかく間違ってる。
0886デフォルトの名無しさん
2006/06/06(火) 01:22:30int a;
char b;
…と様々な変数があるとして、
fwrite(&a, sizeof(int), 1, fp);
fwrite(&b, sizeof(char), 1, fp);
…と、ファイルに順に書き込んで行くことを考えています。
頻繁にファイルアクセスをおこすのもどうかと思い、一旦メモリ内に全データを構築してから、fwrite 1回で一気に書き込もうと思いました。
全データの合計サイズは分かっていません。
Cっぽくするなら、BYTE* data に malloc で適度なサイズの領域を割り当て、
データを書き込んでいく最中にサイズが足りなくなったら realloc で領域を倍に拡大して・・・とやるところですが、
それよりはC++っぽく、STL なり boost なりを使おうと考えました。ところが、何を使うべきかというところでつまりました。
単純な vector<BYTE> などでは、要素の追加が 1BYTE ずつしか行えないため、int など、2BYTE 以上あるデータを書き込むのに不便です。
そこで、basic_string<BYTE> data とし、
int a;
char b;
data += basic_string<BYTE>((BYTE *)&a, sizeof(int));
data += basic_string<BYTE>((BYTE *)&b, sizeof(char));
…
とする方法を思いつきました。
ところが、文字列でないものに basic_string を使うのに違和感を覚えています。
basic_string は、普通こういう使い方をするのでしょうか? また、もう少しスマートな書き込み方法はないでしょうか?
よろしくお願いします。
0887デフォルトの名無しさん
2006/06/06(火) 01:28:29その程度の奴がコストなんか考え出すと無駄な努力どころか
碌な事起こらないからヤメレ。
0888デフォルトの名無しさん
NGNGMFCのCObject::Serializeの適当な実装を参考に汁。
0889デフォルトの名無しさん
2006/06/06(火) 01:50:10質問なんですが、bcc32コンパイラは
すべての文字コードに対応しているのでしょうか?
0890デフォルトの名無しさん
2006/06/06(火) 02:03:51どこまで対応すれば全てなんだ?
0891817
2006/06/06(火) 02:05:22>>821氏の指導通りにやってみて、最初上手く行かなかったものの
つまらない理由で失敗していた事が分かり、無事動くプログラムになりました
(free(c)だけで良いのに、列ごとにもやっていて実行時エラーになっていました)
お陰で他所から貰ってきたプログラムをmain関数内で呼び出して使えるようになりました。
ありがとうございました
0892デフォルトの名無しさん
2006/06/06(火) 02:07:24すいません。
では、BCC32が対応している文字コードを教えてください。
お願いします。
0893デフォルトの名無しさん
2006/06/06(火) 02:12:120894デフォルトの名無しさん
2006/06/06(火) 02:13:290895デフォルトの名無しさん
2006/06/06(火) 02:37:160896デフォルトの名無しさん
2006/06/06(火) 04:16:22大丈夫、fwrite()というかFILE系はバッファリングされるから複数回呼んでも1回に纏めたのと
そんなにパフォーマンスは変わらない。
#但し、Cygwinのようにエミュレーション環境の場合は一概には言えない。
それよりも、変数をバイナリのまま書き出すと互換性が問題になるが大丈夫なのか?
メンテナンス性も鑑み、テキストで出力した方がいいと思うのだが。
0897デフォルトの名無しさん
2006/06/06(火) 08:00:11http://pc8.2ch.net/test/read.cgi/tech/1144978008/369-376n
から、スレ違いになりそうなので移動してきました。
>悪いことは言わん
>趣味(納期なし)ならもっと時間をかけて勉強しろ
>仕事(納期あり)なら先輩なり、同僚なりに聞け
>そして設計を含めて考え直せ
とおっしゃっていたので、何かヒントをいただけませんでしょうか。
ちなみにアマグラマです。
【開発環境】
C言語前提ですが、場合によってはC++でもOK。
開発環境はWin2000 + VS.NET 2003、ターゲットマシンもWin2000あたり。
なるべく環境依存にはしたくない。
【要求】
ユーザに、「処理」内容を選択させ、かつ複数の「パラメータ」の入力を求める必要がある。
「処理内容」は、1つの関数に相当する。
内部的には、どの関数を呼び出すかを選択させているのと同じ。
「パラメータ」は、「処理」に必要なデータである。
ただし、選択された「処理」内容によって、その「パラメータ」の扱い方が変わる。
具体的には、入力が必須だったり、無効だったり、空欄時はデフォルト値を使用したりする。
同じ「処理」内容でも「パラメータ」の有無によって該当する関数を変える可能性も考えられる。
0898デフォルトの名無しさん
2006/06/06(火) 08:00:38【目的】
ユーザが選択したた「処理」により、実行する関数を変えるとき、
if (処理内容==処理1) Function01( 引数1, 引数2, 引数3 ) ;
のような条件分岐を何十個も並べるのは、あまり良くないのでは?と考えた。
ゆえに、もっとスマートな方法(for文で一括処理とか)で記述したい。
【自分の考え】
以下のような構造体を配列として用意した。
struct
{
関数ポインタ
パラメータ1の扱い方(enum)
パラメータ2の扱い方(enum)
パラメータ3の扱い方(enum)
}
「パラメータ」の扱い方について、内部で保持しておきたい。
enumで保持しておけば「パラメータ」の入力状態によって内部で関数を切り替えることができるはず。
関数ポインタと併用すれば、for文などで一括的な処理が出来るのでは?と考えた。
また、「パラメータ」の扱い方を予め内部で持っておくことにより
ユーザインターフェイスに反映させたり、「処理」の各関数を呼び出す前に「パラメータ」チェックが出来ると考えた。
0899886
2006/06/06(火) 08:21:32>>888
>>896
ありがとうございます。
確かに、計測もせず fwrite を繰り返すとパフォーマンスが下がると思い込んでいた点で、>>887 の言うとおりでした。
バイナリで吐き出す件は大丈夫です。
0900デフォルトの名無しさん
2006/06/06(火) 08:35:08具体性がなさ過ぎて、何をやりたいんだかよく分からんが
・パラメータの数が3個限定で
・パラメータの型が全ての処理で共通で
・パラメータの条件がenumで記述可能(値の範囲指定などが必要ない)
のならば、それでいいんじゃないの。
ただ、
> 空欄時はデフォルト値を使用したりする。
このデフォルト値はどこに保持しているんだ?
> enumで保持しておけば「パラメータ」の入力状態によって内部で関数を切り替えることができるはず。
enumで保持しておくことと、処理関数を切り替えることは全く関係ない気がするぞ?
0901897
2006/06/06(火) 08:54:07レスありがとうございます。
>・パラメータの数が3個限定で
>・パラメータの型が全ての処理で共通で
>・パラメータの条件がenumで記述可能(値の範囲指定などが必要ない)
これは大丈夫。
>デフォルト値
外部ファイル……と言いたいところですが、
面倒だし呼び出された関数の内部でいいかな〜とか思ってる自分が。
>enumで保持しておくことと、処理関数を切り替えることは全く関係ない
ユーザの入力(1)
処理:Hoge / パラメータ1:(空欄) / パラメータ2:foo
処理:Hoge / パラメータ1:bar / パラメータ2:foo
という2つのパターンがあったとして、
FunctionHoge01 パラメータ1:不要 パラメータ2:必要 ← パターン1で呼び出される関数
FunctionHoge02 パラメータ1:必要 パラメータ2:不要 ← パターン2で呼び出される関数
と、切り替えられたらいいなと思いました。
まあ、呼び出された関数の中で条件分岐すればいいのですが……。
0902デフォルトの名無しさん
2006/06/06(火) 08:57:252番目の入力のパラメータ2は「空欄」です。
(誤)
ユーザの入力(1)
処理:Hoge / パラメータ1:(空欄) / パラメータ2:foo
処理:Hoge / パラメータ1:bar / パラメータ2:foo
(正)
ユーザの入力(1)
パターン1 処理:Hoge / パラメータ1:(空欄) / パラメータ2:foo
パターン2 処理:Hoge / パラメータ1:bar / パラメータ2:(空欄)
0903デフォルトの名無しさん
2006/06/06(火) 08:58:17> 悪いことは言わん
> 趣味(納期なし)ならもっと時間をかけて勉強しろ
> 仕事(納期あり)なら先輩なり、同僚なりに聞け
> そして設計を含めて考え直せ
0904デフォルトの名無しさん
2006/06/06(火) 09:02:21C++を使わずに実装するなら最良の選択肢だとは思うけどな。
0905デフォルトの名無しさん
2006/06/06(火) 09:17:06つまりC++で言う関数オーバーロードのようなことがしたいわけね。
そもそも設計が間違っているのかどうかは、何に使うか分からない以上何とも言えないが、
その形で実装するなら、デフォルト値の扱いにはルールを設けるのを忘れずに。
例えば
FunctionHoge01 パラメータ1:必要 パラメータ2:省略時はデフォルト値
FunctionHoge02 パラメータ1:必要 パラメータ2:不要
という2パターンがあったとして、
ユーザーの入力が
処理:Hoge / パラメータ1:bar / パラメータ2:(入力なし)
だったら、Hoge01かHoge02、どちらも選べる可能性がある。
C++のコンパイラなら「曖昧です」でエラーを出すところだが、
実行時に曖昧になったんじゃどうしようもないから、
入力なしは「不要」とマッチさせるか、「可能であればデフォルト値のもの」とマッチさせるか決めないと。
0906デフォルトの名無しさん
2006/06/06(火) 09:18:13そんなに悪くないからとりあえずそれでやってみればいいよ
やってみたら変なとこ出てくるかもしれないし
0907880
2006/06/06(火) 15:04:31ソースがあるなら、jpeg_set_colorspace の中見てみてください。
JCS_YCbCrのトコで 4:1:1 にセットしてるんで、
これ呼んだ後にでも
cinfo->comp[0].h_sample_factor = cinfo->comp[0].v_sample_factor = 1;
とかすると良いと思います。
0908デフォルトの名無しさん
2006/06/06(火) 16:34:55配列の外側を参照してしまうためにエラーが起きてたわけですね。
0909デフォルトの名無しさん
2006/06/06(火) 17:21:35XPでVC++.NETを使ってます。
ソケットを使ってWebの情報を読むプログラムを作ろうとしているのですが、
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
MessageBox(hParent, "WSAStartupエラー", "error", MB_OK);
return -1;
}
wsprintf(szStr, "wsagetlasterror:%d", WSAGetLastError());
MessageBox(hParent, szStr, "message", MB_OK);
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET) {
wsprintf(szStr, "ソケットオープンエラー,error:%d", WSAGetLastError());
MessageBox(hParent, szStr, "error", MB_OK);
WSACleanup();
return -2;
}
のMessageBoxで出る1回目の値は0ですが、
2回目(for文)は0、次に10093と出てエラーとなってしまいます。
エラー検索をすると
「アプリケーションが WSAStartup を呼び出していないか、または WSAStartup が失敗しました。」
と出ていますが、WSAStartupは呼び出しているし、エラーは出ていないので困っています。
どなたか解決策をお願いします。
0910デフォルトの名無しさん
2006/06/06(火) 17:32:59> 2回目(for文)は
提示されたソースのどこにfor()文があるのかと(ry
# 提示したソース全体をfor()文で回している、
# と言うオチではなかろうな?
0911デフォルトの名無しさん
NGNG0912909
2006/06/06(火) 17:57:41LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
の
switch (msg)のcase内にfor文がありその中で呼び出しています。
>>911
実際には下のほうにこれがあります。
closesocket(s);
WSACleanup();
return nTotal;
}
0913880
2006/06/06(火) 18:06:33どのメッセージボックスがそのメッセージ出してるのかわかりますか(キャプションは何)?
エラーじゃないのに WSAGetLastError を呼び出して、変な数が帰ってきてるとか
いってるわけじゃないですよね。
WSAGetLastError は、直前のエラーのエラーコードを返すわけで、
エラーが無かったときの挙動は定義されていないと思いますよ。
(ちなみに年に1回くらい GetLastError で同じ質問する人もいます)
0914909
2006/06/06(火) 18:39:331回目
messageで、wsagetlasterror:0
2回目
messageで、wsagetlasterror:0
errorで、ソケットオープンエラー,error:10093
です。
ソケットが開けないのでエラーだと思うのですが…?
0915デフォルトの名無しさん
2006/06/06(火) 18:50:51普通プログラムの開始・終了時に1度だけ呼ぶものではないか。
0916909
2006/06/06(火) 19:11:01その通りにしたら読み込めました。
ありがとうございました。
0917デフォルトの名無しさん
2006/06/06(火) 20:11:50printf("そんな長くない文章\n");
printf("やっぱ長くない文章2\n");
と呼ぶのはなんのためでしょうか。
0918897
2006/06/06(火) 20:17:02>>904
今からC++に変更しても、ぶっちゃけ問題なかったりはするんですけどね(笑)
自分がやりたいのは、>>905さんもおっしゃっている通り、C++で言う関数のオーバーロードっぽいものです。
ただ、あくまでも実行時に解釈するので、C++のオーバーロードとは少しニュアンスが違うかもしれませんね。
>>905
はい、問題ありません。
どっちにするかはまだ決めてませんけど。
>>906
とりあえずこのままやってみることにします。
設計の難しさをほんの少しだけ知ったような気がします……。
0919デフォルトの名無しさん
2006/06/06(火) 20:30:28「文字列の長さが1GBとかじゃなくて普段良く使う程度の長さの文章だよ」
「上のと内容が異なるけど長さ的には同じくらいだよ」
というのを暗示したいのではなかろうか。
0920デフォルトの名無しさん
2006/06/06(火) 20:40:09なるほどサンクス 何度も関数を呼ぶ意味がワカランかった
0921デフォルトの名無しさん
2006/06/06(火) 20:49:10printf("hoge\nhage\n");じゃなくて2行に分けるのは何でって事?
それだったら単に出力時の見た目とコード上の見た目を合わせるためだと思われ
0922デフォルトの名無しさん
2006/06/06(火) 21:18:04class Object
{
float px,py;
public:
Object(int x,int y){px=x;py=y;}
void Draw(void){printf("X座標=%d\nY座標=%d\n",px,py);}
};
int main(void)
{
Object ufo(2,4);
ufo.Draw();
return 0;
}
なんか数値がおかしいのですが、どこが悪いのでしょうか
0923デフォルトの名無しさん
2006/06/06(火) 21:24:30+void Draw(void){printf("X座標=%f\nY座標=%f\n",px,py);}
0924922
2006/06/06(火) 21:32:19どういうことですか?試しにそのようにコードを修正してみましたが、エラーが出ます
0925デフォルトの名無しさん
2006/06/06(火) 21:35:32でもそれだと
printf(
"一行目の文章\n"
"二行目の文章\n");
で事足りるし。
0926デフォルトの名無しさん
2006/06/06(火) 21:38:360927デフォルトの名無しさん
2006/06/06(火) 21:39:24floatを%d(10進整数)で出力しようとするなってこと。
手元の環境(Win2k, BCC5.5)じゃ
X座標=2.000000
Y座標=4.000000
のように出力されたけど?
0928デフォルトの名無しさん
2006/06/06(火) 21:40:12コメントアウトしづらいだろ。
>>924
Cからやり直すことをお薦めする。
0929922
2006/06/06(火) 21:42:46あ、コンパイルできました。+とか-とかはいらなかったんですね
どうもありがとうございました
0930デフォルトの名無しさん
2006/06/06(火) 22:03:22じゃもう1個指摘
-#include<stdio.h>
+#include<cstdio>
+using namespace std;
922は古い書き方で最近の環境では通らなかったりする
それと
Object(int x,int y){px=x;py=y;}
のx,yの型とpx,pyの型は揃えなくて良いの?
0931デフォルトの名無しさん
2006/06/06(火) 22:10:30そんな環境あるの?
最新のC++規格にも<stdio.h>はあると思うんだが。
0933デフォルトの名無しさん
2006/06/07(水) 07:29:54#include <stdio.h>
int main(void)
{
char input_data[10];
do {
fgets(input_data, sizeof(input_data), stdin);
input_dataに入ってる文字列を処理
} while(条件);
return 0;
}
fgetsでデータを入力したいのですが、この場合もし10文字以上入力されるとエラーになって
強制終了されてしまいます。
用意した配列の大きさより大きい文字列が打ち込まれた場合の対処はどうしたらいいのでしょうか。
0934デフォルトの名無しさん
2006/06/07(水) 07:32:20fgets() にはバッファのサイズを渡してるから、強制終了はしないはず。
その後の処理のほうが間違ってるんだろ。
0935デフォルトの名無しさん
2006/06/07(水) 07:49:590936デフォルトの名無しさん
2006/06/07(水) 08:36:030937933
2006/06/07(水) 08:39:15強制終了ではなくて、配列内に収まりきらなかった分が、doループで次回のfgetsが来た時に
読み込まれてしまうのを防ぎたいのですが、どうすればよいのでしょうか。
0938デフォルトの名無しさん
2006/06/07(水) 09:03:19fgetsで'\n'を読めなかったことを確認したら、'\n'までgetcharで読み捨てれば良い。
0940デフォルトの名無しさん
2006/06/07(水) 11:45:53effectiveC++読んでる途中ですが
using namespace std;をあえて使わず
std::・・・と文法上つかってますが
using namespace std;に甘えない方が
良いのでしょうか。
(読んでる途中なので最後まで読めと言われれば
そうなんですけど)
あと、「std::stringなどは継承するな」って書いてあったの
ですが、本当にそんなトリッキーな事する奴いるんでしょうか・・・
(居たから書いてるんだろうな)
0941デフォルトの名無しさん
2006/06/07(水) 14:25:25std::stringの文字列をconst char *(またはchar *)にキャストしたいのですが、
dynamic_cast,static_cast,reinterpret_cast,const_castのいずれもダメです。
どうすればキャストできますか。
プログラム自体はキャストしなくても、最初からconst char*の文字列に
しとけばいいんですが、どうも気になって、、、
0942よろしくお願いします
2006/06/07(水) 14:26:29をC++(cin coutを使う)に直す宿題が出ましたが、自分で直してみましたがどこが悪いのかが解りません。
どなたか直してくれる方はいらっしゃいますか?(↓自分で直したがエラー続発)
#include <iostream>
void main(void)
{
int a[5]={9,5,7,2,1};
int b, i ,j, k;
cout <<"ソートするデータ" ;
for ( k=0; k<5; k++ )cout << "" << a[k] );
cout << "\n" ;
cout << "\n" ;
for ( i=0; i<4; i++ )
{
for ( j=i+1; j<5; j++ )
{
if ( a[i]>a[j] )
{
b = a[i];
a[i]=a[j];
a[j]=b;}
}
}
cout << "ソート結果\n" ;
for ( k=0; k<5; k++ )cout << "%d ", a[k] ;
cout << "\n";
}
0943デフォルトの名無しさん
2006/06/07(水) 14:30:33str.c_str();
0944デフォルトの名無しさん
2006/06/07(水) 14:30:56c_str
0945デフォルトの名無しさん
2006/06/07(水) 14:36:18944>
早い、速いッスよ。
俺も早くあんたらのようになって、この板を
sageてみせるよ、ありがとう。
0946デフォルトの名無しさん
2006/06/07(水) 14:39:12↓のスレに「誘導されたので・・・」として移動した方がいいよ。
C言語/C++言語の宿題を片付けます 65代目
http://pc8.2ch.net/test/read.cgi/tech/1147902222/
0947271
2006/06/07(水) 14:43:00宿題のサイトにはご迷惑をおかけしたので、ここで質問した所存であります。
0948デフォルトの名無しさん
2006/06/07(水) 14:55:59using namespace std;
を追加して、
これと⇒ for ( k=0; k<5; k++ )cout << "" << a[k] );
これを⇒ for ( k=0; k<5; k++ )cout << "%d ", a[k] ;
こうすれば動くんじゃない? ⇒ for ( k=0; k<5; k++ ) cout << " " << a[k] ;
>宿題のサイトにはご迷惑をおかけしたので、ここで質問した所存であります。
宿題やってくれっていうのは「C/C++ に関する質問」じゃないというのはわかりますか?
「車の整備についての質問(初心者歓迎)っていうスレ」があったとして、
「車の調子悪いが自分では整備できないから誰か整備して」
なんて書くのはスレ違いでしょ。
0949デフォルトの名無しさん
2006/06/07(水) 15:12:43>using namespace std;に甘えない方が
>良いのでしょうか。
良い
これはコンパイラのバグまで絡んでくるのでやっかい
要約すると、
ヘッダでは使うな。ただし関数内では思う存分使ってよい。
>std::stringなどは継承するな」って書いてあったの
>ですが、本当にそんなトリッキーな事する奴いるんでしょうか
template typedefがないのでそういう状況も出てくる
まあ分からないならやらない方がいい
0950デフォルトの名無しさん
2006/06/07(水) 15:15:560951デフォルトの名無しさん
2006/06/07(水) 17:18:08ファイルのコピーの命令が見当たりません。
Windows なら、CopyFile というのがあるのですが、
Linux ではどうやって書くのか教えてください。
0952sage
2006/06/07(水) 17:34:15Pythonのソース見たら、普通にファイル開いて、しこしこ書き込んでた。
便利なやつがあればと思ったけど、自作しないといけないんだな。
0953デフォルトの名無しさん
2006/06/07(水) 17:39:18Linuxのことはあまりしらないけど、
C++でもいいなら、boost::filesystem::copy_fileがあるよ。
0954デフォルトの名無しさん
2006/06/07(水) 17:40:31system("cp 元 先");
でいいんじゃね。移植性は皆無だが。
0955デフォルトの名無しさん
2006/06/07(水) 17:52:09標準で用意されてない以上移植性は期待で着ない。
0956デフォルトの名無しさん
2006/06/07(水) 21:58:23main () {
printf("C programming");
return 0;
}
というプログラムを書いてコンパイルしようとしたら
エラー E2209 sample.c 1: インクルードファイル 'stadio.h' をオープンできない
警告 W8065 sample.c 4: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
と表示されました。「オープンできない」 「プロトタイプ宣言のない」とはどういうことですか?
0957デフォルトの名無しさん
2006/06/07(水) 22:02:58> stadio.h
綴りが違う。
0958デフォルトの名無しさん
2006/06/07(水) 22:05:50見たまんまの意味だな。もっとエラーメッセージを理解する努力をしよう。
0959デフォルトの名無しさん
2006/06/07(水) 22:12:53・オープンできない
綴りが間違ってるからね。ファイルが無いから。
・プロトタイプ宣言のない
printf関数はstudio.hに入っているので。
なんの前触れも無く、コンパイラが『printf』なんて見つけても、 何なんだよ、printfって てな事になる。
0960959
2006/06/07(水) 22:14:37stdio.hね。
ちなみにstdioは、『スタンダード アイ/オー』ね。
0961デフォルトの名無しさん
2006/06/07(水) 22:23:49認識されいないと出ているんですが操作可能にするにはどうすれば?
C:\source>bcc32.sample.c
'bcc32.sample.c' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
0962デフォルトの名無しさん
2006/06/07(水) 22:32:430963デフォルトの名無しさん
2006/06/07(水) 22:50:38○bcc32 sample.c
というかもうちょっと考えてから人に聞こう
0964デフォルトの名無しさん
2006/06/07(水) 23:28:28これが無きゃネタですんだのに >>959
0965デフォルトの名無しさん
2006/06/07(水) 23:40:29objectMap.insert( pair< int , Object* >( 1 , new Object ) );
objectIterator = objectMap.find( 1 );
objectMap.erase( objectIterator );
こんな感じのソースを書いてしまったんですが、
やっぱり .erase を使うだけではオブジェクトの実体(メモリ)は開放されないですか?
0966デフォルトの名無しさん
2006/06/07(水) 23:49:020967デフォルトの名無しさん
2006/06/08(木) 00:02:24main () {
printf("C programming");
return 0;
}
綴りを直しても
エラー E2209 sample.c 1: インクルードファイル 'stdio.h' をオープンできない
警告 W8065 sample.c 4: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
のままでした
0968デフォルトの名無しさん
2006/06/08(木) 00:05:530969デフォルトの名無しさん
2006/06/08(木) 02:05:38ゼロから始めた者ですが↑のようなエラーが出て先へ進めません。どうしたらよいですか?
0970デフォルトの名無しさん
2006/06/08(木) 02:41:18Cを諦めて下さい。
0971デフォルトの名無しさん
2006/06/08(木) 03:35:37setbccでぐぐれ
0972デフォルトの名無しさん
2006/06/08(木) 03:42:42( (1)+((2+3))*(6*(8)) ) のように無駄に括弧が入りまくってても大丈夫なヤツ
を早急に作らないといけないんです。助けてください
0973デフォルトの名無しさん
2006/06/08(木) 04:19:01boost::spirit
つってもコンパイラに依存するけど
0974972
2006/06/08(木) 06:46:17boost::spirit について少し調べてみます。
というか、自力で作りました。すいません。
0975デフォルトの名無しさん
2006/06/08(木) 17:07:13ローカル定義のシンボル "_malloc" がインポートされました
というwarningがでます。
warningの内容の意味が理解できないので、これがどれくらい良くないことなのか
さっぱり分かりません。
どういう意味なのでしょうか?
0976デフォルトの名無しさん
2006/06/09(金) 01:49:21このアドレスには"テスト"の文字列が格納されてました。
がしかしtest2でのdmemの値は00913424だったのですが
このアドレスにはよくわからないデータしかなく,
"テスト"の文字列はその周辺にも見あたりませんでした。
dmemは何を指してるのでしょうか。。
int test1()
{
char* smem;
strcpy(smem, "テスト");
printf("%p",smem);
return 0;
}
int test2()
{
char* dmem = new char[8];
strcpy(dmem, "テスト");
printf("%p",dmem);
delete[] dmem;
return 0;
}
0977デフォルトの名無しさん
2006/06/09(金) 01:56:30strcpyの書き込む先は?
0978デフォルトの名無しさん
2006/06/09(金) 05:07:16fopenでよいのでしょうか?
0979デフォルトの名無しさん
2006/06/09(金) 05:13:070980デフォルトの名無しさん
2006/06/09(金) 05:29:140981デフォルトの名無しさん
2006/06/09(金) 06:45:460982デフォルトの名無しさん
2006/06/09(金) 06:57:07えーと、fopenでファイルを開いて、関数に代入すればいいんですよね?
そこから先どうすればよろしいんでしょうか
0983デフォルトの名無しさん
2006/06/09(金) 07:12:13なんてすばらしい言語なんだろう。
0984デフォルトの名無しさん
2006/06/09(金) 08:00:22ぐぐるか本買うかしてしっかり勉強すべき。
それ以上はそっちの環境がわかんないと何も言えない
0985デフォルトの名無しさん
2006/06/09(金) 10:09:43http://pc8.2ch.net/test/read.cgi/tech/1149815331/
0986デフォルトの名無しさん
2006/06/11(日) 08:37:030987デフォルトの名無しさん
2006/06/11(日) 13:23:11お姉さま、あれは何ですの?
0988デフォルトの名無しさん
2006/06/11(日) 13:32:180989デフォルトの名無しさん
2006/06/11(日) 17:53:100990デフォルトの名無しさん
2006/06/11(日) 17:57:240991デフォルトの名無しさん
2006/06/11(日) 18:02:180992デフォルトの名無しさん
2006/06/11(日) 18:04:540993デフォルトの名無しさん
2006/06/11(日) 18:06:200995デフォルトの名無しさん
2006/06/11(日) 18:07:190996デフォルトの名無しさん
2006/06/11(日) 18:07:43http://pc8.2ch.net/test/read.cgi/tech/1149815331/
0997デフォルトの名無しさん
2006/06/11(日) 18:08:510998デフォルトの名無しさん
2006/06/11(日) 18:09:580999デフォルトの名無しさん
2006/06/11(日) 18:10:101000デフォルトの名無しさん
2006/06/11(日) 18:11:0810011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。