【ANSI-C】 C言語なら俺に聞け! Part 129
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/08/27(日) 15:43:44まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ANSI-C】 C言語なら俺に聞け! Part 128
http://pc8.2ch.net/test/read.cgi/tech/1151282084/
GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/
C/C++の宿題を片付けます 73代目
http://pc8.2ch.net/test/read.cgi/tech/1155355501/
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/
0655デフォルトの名無しさん
2006/09/24(日) 00:40:020656デフォルトの名無しさん
2006/09/24(日) 00:41:39Java言語とかも。
0657デフォルトの名無しさん
2006/09/24(日) 00:43:190658デフォルトの名無しさん
2006/09/24(日) 00:43:28ファイル閉じた後は必ずNULLを代入するとか、ちゃんと自分で管理してればね。
0659デフォルトの名無しさん
2006/09/24(日) 00:44:26お前はここのスレタイを3回音読した後どこかに消えろ
0660デフォルトの名無しさん
2006/09/24(日) 00:45:46そもそもお前が作っているソフトは本当にそこまで速度が大事か?
もし大事ならまずロジック面での見直しを図るべき。
あとプログラムの使用者である人間に対して、
待たされているという印象をいかに少なく見せるかも大事。
こういうことも効果は大きいと俺は思うぞ。
0661デフォルトの名無しさん
2006/09/24(日) 00:45:51スレタイのANSI-Cのハイフンも激しくダサイよな。
新スレときには外して欲しい。
0662デフォルトの名無しさん
2006/09/24(日) 00:46:46俺は656ではないが、まあCで通じるときにはCと呼んでいる。
このスレタイは検索時の都合もあるだろうと思っている。
0664デフォルトの名無しさん
2006/09/24(日) 00:48:34MC68000の美しさは究極なのだよ。
わかるかね?
0665(^-^) ◆MONSOON/qo
2006/09/24(日) 00:53:21文字列のコピーだと標準関数strcpyをつかった方がいいとか
ソートとか複雑なやつだと自作の方が速い場合もあるとおもう
0666デフォルトの名無しさん
2006/09/24(日) 00:54:54多少はCを意識してる気がする。
ちなみに32bit-x86登場以前に
68系にあった同様の命令は、0/-1をセットする、だったはず。
0667デフォルトの名無しさん
2006/09/24(日) 00:56:01C、C++の最適化について語るスレ
http://pc8.2ch.net/test/read.cgi/tech/1084676298/l50
0668デフォルトの名無しさん
2006/09/24(日) 00:57:47週末なんだから、変なのが来るのはしょうがない。
0669デフォルトの名無しさん
2006/09/24(日) 01:00:420670デフォルトの名無しさん
2006/09/24(日) 01:02:47言いたい事はわかるんだけどさ・・
0671デフォルトの名無しさん
2006/09/24(日) 02:41:10コンパイラ説得型のプログラミングは楽しいっちゃ楽しいが、楽しさが刹那的過ぎる。
0672デフォルトの名無しさん
2006/09/24(日) 04:01:03分かるよ。
俺も68000で育ったし。
でもなあ、今のパーソナルコンピューティングに68はないじゃないか。
0673デフォルトの名無しさん
2006/09/24(日) 04:30:18腐ってもライブラリなんだね(^^;
int i,j;
char*k ,*l;
clock_t s,t;
char a[100]="agregvei04b12lfknb0100122l5fgn8648bhliftbcdef",b[100];
s=clock();
/*
for(i=0;i<N;i++)
{
for(j=0;a[j]!='\0';j++) b[j]=a[j];
b[j]=a[j];
}
*/
for(i=0;i<N;i++) {for(k=a ,l=b; *k!='\0';l++,k++) *l = *k; *l = *k;}
s=clock()-s;
t=clock();
for(i=0;i<N;i++)strcpy(b,a);
t=clock()-t;
printf("関数を使った方が時間が%f倍かかる\n",(double)t/s);
printf("書き下ろした方が時間が%f倍かかる\n",(double)s/t);
getchar();
0674デフォルトの名無しさん
2006/09/24(日) 04:36:05そもそもおまいがやってるのはstrcpy()じゃなくてmemcpy()。
速度が違って当然。
strcpyのロジックは
while(*k++ = *l++){}で十分だ。
余計なことしすぎ。
テンプレート化してみろ。
組み込みランタイムとの比較もしてみろ。
その程度じゃ何も検証できてないのと同じだぞ。
出直して来い。
0675(^-^) ◆MONSOON/qo
2006/09/24(日) 05:08:16#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#define N 800000
#define M 100000
main(){
int i,j;
clock_t s,t,u;
char a[M],b[M];
for(i=0;i<M;i++)a[i]=(int)rand()*127;
s=clock();for(i=0;i<N;i++)for(j=0;a[j]!='\0';j++) b[j]=a[j];
s=clock()-s;
t=clock();for(i=0;i<N;i++)for(j=0;*(a+j)!='\0';j++)*(b+j)=*(a+j);
t=clock()-t;
u=clock();for(i=0;i<N;i++)strcpy(b,a);
u=clock()-u;
printf("%d %d %d\n",s,t,u);
}
0676(^-^) ◆MONSOON/qo
2006/09/24(日) 05:31:39特段strcpyが速くはないけど
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#define N 8000000
#define M 100
main(){
int i,j;
clock_t s,t,u,v;
char a[M],b[M],*k,*l;
for(i=0;i<M;i++)a[i]=(int)rand()*127;a[M-1]='\0';
s=clock();for(i=0;i<N;i++)for(j=0;a[j]!='\0';j++) b[j]=a[j];
s=clock()-s;
t=clock();for(i=0;i<N;i++)for(j=0;*(a+j)!='\0';j++)*(b+j)=*(a+j);
t=clock()-t;
u=clock();for(i=0;i<N;i++)strcpy(b,a);u=clock()-u;
v=clock();for(i=0;i<N;i++){k=a;l=b;while(*l++=*k++);}v=clock()-v;
printf("%d %d %d %d\n",s,t,u,v);}
0677デフォルトの名無しさん
2006/09/24(日) 06:36:29memcpy...サイズ指定などしてませんが。
>何故*l=*kが二回ある。
\0までコピーする為です。
>while(*k++ = *l++){}で十分だ。
ああなるほど、\0まで代入してループを終わるのですか。
これを見ると、本当に色々と無駄がありましたね(^^;
精進します。
0678デフォルトの名無しさん
2006/09/24(日) 06:38:230679デフォルトの名無しさん
2006/09/24(日) 07:08:31ドシロウトが。
そこはセミコロンだ。
0680デフォルトの名無しさん
2006/09/24(日) 07:21:210681デフォルトの名無しさん
2006/09/24(日) 08:59:59ウザイ。自分で試せ。
スレ違い。 >>667 の誘導に従え。
0682デフォルトの名無しさん
2006/09/24(日) 12:13:59・速い → プログラマとしての素質あり
・遅い → 凡人
0683デフォルトの名無しさん
2006/09/24(日) 12:17:32・速くてバグあり → 凡人
・遅い → 論外
0684デフォルトの名無しさん
2006/09/24(日) 12:34:13ここは初心者スレでも日記スレでも電波スレでもねーよ。
0685デフォルトの名無しさん
2006/09/24(日) 13:15:34なぜ C99 完全準拠のコンパイラが世の中には少ないのですか?
0686デフォルトの名無しさん
2006/09/24(日) 13:40:11必要性を感じない人が多いから。
0687デフォルトの名無しさん
2006/09/24(日) 13:52:41void f( int size, void *p );
のような関数があったとして、void *p にポインタのポインタを渡すと言うのはどういう意味なんでしょうか?
関数 f で渡した値は、次の関数
void t( int args, void *argp )
の argp に収納されます。
使用例:
int i = 314;
f( sizeof(int), &i );
void t( int args, void *argp )
{
int *p = (int*)argp;
}
0688デフォルトの名無しさん
2006/09/24(日) 13:57:110689デフォルトの名無しさん
2006/09/24(日) 14:08:06最初にあげてる f と引数の宣言が違うんだが・・・
0690デフォルトの名無しさん
2006/09/24(日) 14:27:36そういった質問はエスパースレへどうぞ
0691687
2006/09/24(日) 14:30:22先ほどのプログラムは、スレッド関連で利用するものでして。例えば…
static int Thread( int args, char *argp );
int main()
{
int i = 314;
// スレッド作成
// 実際の CreateThread よりもかなり引数少ないですが…
// 引数 : スレッドとして利用する関数 , 関数に渡すパラメータのサイズ , 関数に渡すパラメータ
_CreateThread( Thread, sizeof(int), &i );
// main スレッドを2秒間とめる( WINAPIの Sleep みたいな )
_DelayThread( 2000 );
i = 0;
// スレッド終了まで待つ
_WaitThreadEnd( /*中略*/ );
// スレッド削除
_DeleteThread( /* 中略 */ );
return 0;
}
static int Thread( int args, void* argp )
{
// main 関数の i をごにょごにょできる
int *p = (int*)argp;
while( *p != 0 ) { }
return 0;
}
0692687
2006/09/24(日) 14:31:55この場合、CreateThread に i のポインタを渡しているいるんですが。
このままだと main の方で i に0が代入されても、渡した引数が作成したスレッドのスタックに入ってしまって
スレッドの方で反映されないんです。
で、そのためにCreateThread の部分のパラメータにポインタのポインタを渡す必要があるのですが
その渡し方が分からないのです。。。分かりにくい説明ですみません。
0693(^-^) ◆MONSOON/qo
2006/09/24(日) 14:47:25面倒なことをせずにグローバル変数 iをつかおうぜ
0694デフォルトの名無しさん
2006/09/24(日) 14:52:02> スレッドの方で反映されないんです。
スレッド使ったこと無いから識者さん、kwskおせーて
0695デフォルトの名無しさん
2006/09/24(日) 14:55:22そ ん な 危 険 な こ と を 勧 め る な !
0696(^-^) ◆MONSOON/qo
2006/09/24(日) 15:01:50複数のスレッドに同一変数を参照渡ししようとする時点で危険だよ
スレッドが一つだけならスレッドにする必要ないし
0697デフォルトの名無しさん
2006/09/24(日) 15:05:20それは「スレッドの引数に、共有すべき変数の参照値を与える」というものが「グローバル変数」というものに置き換わっただけじゃないか?
本質的な部分は何も変わってないと思うが
0698デフォルトの名無しさん
2006/09/24(日) 15:06:21世も末だな。
0700デフォルトの名無しさん
2006/09/24(日) 15:10:35そうか・・・
どこかで「危険」という単語をみたのだが、それは幻覚だったんだな
0701デフォルトの名無しさん
2006/09/24(日) 15:11:02char の表現範囲は少なくとも -128〜+127
と決められています。ここまでは分かるのですが、
-127〜+127 の範囲については安全に変換して良いという
ことまで保証されているのでしょうか?
string -> wstring の変換を書こうと思っていて、
安全に変換できない文字が含まれていたら
例外を投げるようにしようと思っています。
本当は boost::lexical_cast が用意されていたら便利なんですが。
0702デフォルトの名無しさん
2006/09/24(日) 15:14:02なんでポインタのポインタが出てくるの?
Thread の中の int *p を int volatile *p にしてみたら、どうなる?
0703デフォルトの名無しさん
2006/09/24(日) 15:15:14ダブルスタンダード死ね。
0704デフォルトの名無しさん
2006/09/24(日) 15:16:45このスレでは C++ は扱いません。
こっち逝け。
C++相談室 part52
http://pc8.2ch.net/test/read.cgi/tech/1156525695/
0705デフォルトの名無しさん
2006/09/24(日) 15:17:390706687
2006/09/24(日) 15:18:28言葉の通りに、ポインタのポインタで渡すだけで普通に問題ありませんでした。
int i;
int *p = &i;
int **pp = &p;
// 691より
_CreateThread( Thread, sizeof(int**), pp );
>> 699
あと、結局このプログラムは C++ に直して利用する形にするので、
Cのグローバル変数として考えても問題ないと思います。
CHoge *p = new CHoge;
// ↑ CHoge *p = malloc(sizeof(CHoge));
結局みたいに利用する形になるので。。。
>> 696
生成するオブジェクトに個々にスレッドを持たせて、そのオブジェクトの持つ変数を利用する。
という事は、処理を複数に分けると言う意味でも重要なんです。
ありがとうございました。
0707デフォルトの名無しさん
2006/09/24(日) 15:26:14in meaning to the ASCII character codes. The wide character
value zero is often used to terminate a string of wide characters,
just as a single byte with value zero often terminates a string
of ordinary characters.
http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_6.html
0708デフォルトの名無しさん
2006/09/24(日) 15:34:48char の方の -128 は -127 の間違いか?
-127〜+127 なら整数としての値は保持したまま wchar_t と char を
相互変換できるだろう。同じ文字に対応するとは限らんのだろうけど。
マルチバイト文字列からワイドキャラクタ文字列への変換には、
エンコーディング(ロケール)など、別の要素が絡んでくる。
0709デフォルトの名無しさん
2006/09/24(日) 15:39:47>-127〜+127 なら整数としての値は保持したまま wchar_t と char を
-127〜+127 <- 255個
0710デフォルトの名無しさん
2006/09/24(日) 15:41:15それがどうしたの?
0711デフォルトの名無しさん
2006/09/24(日) 15:41:22ansiのcharは-127〜でおkのはず
しかしwcharが-128〜かどうかはわからん
0712デフォルトの名無しさん
2006/09/24(日) 15:41:58は GNU C Library の仕様なので、規格ではどうなっているのか知らないけど、
0 〜 128 までは保証されているみたいだね。ワイド文字列を扱うライブラリで
EOF をどう表現するのかは知らないけど、とりあえず EOF っていうマクロを
使っておけばいいんだろうな。
>>708
char って -128 まで表現できなかったっけ。
8ビット 2 の補数表現で 0xffffffff って -128 だし
0713デフォルトの名無しさん
2006/09/24(日) 15:42:45わざわざそんな実装にしないと思うけど。
0714デフォルトの名無しさん
2006/09/24(日) 15:44:07規格は符号ビットによる実装も考慮しているから、制限は -127 になってる。
0715デフォルトの名無しさん
2006/09/24(日) 15:45:47そんなん考慮したら規格として破綻しそうだ。
0716デフォルトの名無しさん
2006/09/24(日) 15:47:53自明なマッピングができるけど、文字として保証されているのは
0〜+127 だけって事?でもそれは glibc 限定か?
0717デフォルトの名無しさん
2006/09/24(日) 18:53:10c言語のプログラム組んだときに
ステートメンとにセミコロンがないとでましたどうすれば
いいんでしょうか?
0718デフォルトの名無しさん
2006/09/24(日) 18:54:350719デフォルトの名無しさん
2006/09/24(日) 19:07:16if(computer == player){
この行なんだが
if(computer == player);{
にしても同じエラーがでた
0720デフォルトの名無しさん
2006/09/24(日) 19:09:12根本的に間違ってる
0721デフォルトの名無しさん
2006/09/24(日) 19:09:48どういう意味?
0722デフォルトの名無しさん
2006/09/24(日) 19:10:49これで
0723デフォルトの名無しさん
2006/09/24(日) 19:14:20C言語の入門書どうりに書いてたのにできなかったからあせったが
できた助かったありがと
0724デフォルトの名無しさん
2006/09/24(日) 19:17:40500*500の二次元配列を作ったら何にも表示されなくなりました。
(コンパイルは通ります。実行したら音沙汰なしで終了。)
コンパイラはbolandの無償版です。
原因不明で・・・よろしくお願いします。
↓
#include<stdio.h>
#define N 500
int main(void){
double w[N][N];
printf("OK!");
}
0725デフォルトの名無しさん
2006/09/24(日) 19:20:12コピペでcygwinのgccでコンパイルしたけど別に問題なし
0726デフォルトの名無しさん
2006/09/24(日) 19:20:13何もおかしくないし俺の環境だとOK!って出るよ
0727(^-^) ◆MONSOON/qo
2006/09/24(日) 19:23:35bolandの無償版(5.51)だけど駄目だった
0728(^-^) ◆MONSOON/qo
2006/09/24(日) 19:25:11bolandの無償版(5.51)だけど
static double w[N][N];ならいけた
0729(^-^) ◆MONSOON/qo
2006/09/24(日) 19:28:52double **w = new double *[N];for (int i=0;i<N;i++)w[i]=new double [N];
でもいけた
0730(^-^) ◆MONSOON/qo
2006/09/24(日) 19:31:53#define N 5000のとき
double w[N][N];とstatic double w[N][N];は駄目だけど
double **w = new double *[N];for (int i=0;i<N;i++)w[i]=new double [N];
はいけた
0731デフォルトの名無しさん
2006/09/24(日) 19:32:54>>704
0732デフォルトの名無しさん
2006/09/24(日) 19:35:38本当は、さびしいんだよ。
そして、スキルアップしたい。
若いってことじゃないか?
0733(^-^) ◆MONSOON/qo
2006/09/24(日) 20:18:33newも mallocも callocも変わらないようです
書式が簡明なnewを使うべきかな
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 1000
main(){
int i,j,k;
clock_t s,t,u;
s=clock();for(k=0;k<200;k++){
double **w = new double *[N];for (i=0;i<N;i++)w[i]=new double [N];
for(i=0;i<N;i++)for(j=0;j<N;j++)w[i][j]=0.0;
for(i=0;i<N;i++)delete[] w[i];delete[] w;}
s=clock()-s;
t=clock();for(k=0;k<200;k++){
double **v = (double**)malloc(N * sizeof(double*));for(i=0;i<N;i++)v[i]=(double*)malloc(N * sizeof(double));
for(i=0;i<N;i++)for(j=0;j<N;j++)v[i][j]=0.0;
for(i=0;i<N;i++)free(v[i]);free(v);}
t=clock()-t;
u=clock();for(k=0;k<200;k++){
double **x = (double**)calloc(N,sizeof(double*));for(i=0;i<N;i++)x[i]=(double*)calloc(N,sizeof(double));
for(i=0;i<N;i++)free(x[i]);free(x);}
u=clock()-u;
printf("2次元配列の確保、初期化、解放にかかる時間\nnew=%d malloc=%d calloc=%d\n",s,t,u);}
0734デフォルトの名無しさん
2006/09/24(日) 20:33:200735デフォルトの名無しさん
2006/09/24(日) 20:36:41ウザイ。チラシの裏にでも書いとけ。
0736デフォルトの名無しさん
2006/09/24(日) 20:38:15Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
dqn730.c:
エラー E2451 dqn730.c 5: 未定義のシンボル new(関数 main )
エラー E2141 dqn730.c 5: 宣言の構文エラー(関数 main )
エラー E2188 dqn730.c 5: 式の構文エラー(関数 main )
エラー E2451 dqn730.c 5: 未定義のシンボル i(関数 main )
エラー E2379 dqn730.c 5: ステートメントにセミコロン(;)がない(関数 main )
警告 W8070 dqn730.c 6: 関数は値を返すべき(関数 main )
警告 W8004 dqn730.c 6: 'w' に代入した値は使われていない(関数 main )
*** 5 errors in Compile ***
↑
おまえさんの現地語ではこういうのを「簡明」と言うのか
0737デフォルトの名無しさん
2006/09/24(日) 20:39:170738デフォルトの名無しさん
2006/09/24(日) 20:40:55それすら出来ない君は。。。
0739(^-^) ◆MONSOON/qo
2006/09/24(日) 20:42:50Borland C++ 5.5.1 for Win32 はドットcとドットcppでコンパイル方法が変わりますから
ご注意を
0740デフォルトの名無しさん
2006/09/24(日) 20:48:20スレタイ嫁
0741デフォルトの名無しさん
2006/09/24(日) 20:50:24お前死んだ方がいいよ
0742(^-^) ◆MONSOON/qo
2006/09/24(日) 20:50:38巨大配列の確保という点ではcでもc++でも差がないことがわかったんだ
cのみでもなかなかやれるということだ
0743デフォルトの名無しさん
2006/09/24(日) 21:05:070744デフォルトの名無しさん
2006/09/24(日) 22:38:150745デフォルトの名無しさん
2006/09/24(日) 23:33:43差はあるよ
おまえさんがそれを確認・検証できないだけ
処理系依存な話だがいっぱしの C 使いなら
処理系依存だから知らぬ存ぜぬでは済まされないことがあるのは知っておろう
0746デフォルトの名無しさん
2006/09/24(日) 23:35:48いぢめられても投稿(登校)拒否しちゃダメよ♪
0747デフォルトの名無しさん
2006/09/24(日) 23:50:520748デフォルトの名無しさん
2006/09/24(日) 23:56:23おまえ、ここは初めてか?力抜けよ。
0749デフォルトの名無しさん
2006/09/25(月) 00:03:30望みのプログラムが書ければどうでもいいよ、そんなもん。
0750デフォルトの名無しさん
2006/09/25(月) 00:04:50望みって何だ? (答えでお里が知れる)
0751デフォルトの名無しさん
2006/09/25(月) 00:08:57「俺の書いたソースは誰にも見せないし、移植なんてしないから動けばいい」
って奴じゃねーの?
0752デフォルトの名無しさん
2006/09/25(月) 00:18:330753デフォルトの名無しさん
2006/09/25(月) 00:20:120754デフォルトの名無しさん
2006/09/25(月) 00:33:58道具を使えることを自慢する奴ほど馬鹿なやつはないんだけどね
■ このスレッドは過去ログ倉庫に格納されています