1 :
v(^o^i)d :
05/01/31 08:37:54
ここvoidに乗っ取られたスレだろ?
こっちは本スレ?ネタスレ?
6 :
デフォルトの名無しさん :05/01/31 09:16:13
N個の点(位置は座標にあらわしてます)を一回ずつ巡回したときの最短距離を全探索するプログラムなんですが、コンパイルは出来るのに 出力したときに結果がすべて0になってしまいます。何も代入されないってのはおかしいので質問させていただきます。 以下はその探索に使用するプログラムを抜き出したものです。再帰を使ってます。 m番目にまだめぐってない点を見つけて、次に(m+1)番目に巡ってない無い点を・・・と探して行ってます。 具体的にはN*Nのます目に0(FALSE)を入れたあとで縦に点の番号、横に巡回の順番をとって、 点 n が m 番目に巡回したときに n行m列のます目に1(TURE)を入れていき、最後にその順番に従って距離計算、比較を行っています。 変数の説明ですが、s1、s2、d1、d2は大域で宣言し、 tは縦、yは横、s1は横(点側)から見たとき巡回が重複か否かを見ていて、s2はすでに回った点の番号を入れ、 d1は各点間の距離でこれはすでに計算されています。よろしくお願いします。 void search(int t){ int y,i,j; for(y = 0; y < N; y++){ if(s1[y] == FALSE){ s1[y] = TURE; s2[t] = y; if(t < N-1) search(t+1); else{ for(i = 1; i < N; i++) d2 += d1[s2[i-1]][s2[i]]; d2 += d1[s2[0]][s2[N-1]]; if(d2 < mini_d){ mini_d = d2; for(j = 0; j < N; j++) mini_s2[j] = s2[j]; d2 = 0; } } s1[y] = FALSE; } } }
7 :
デフォルトの名無しさん :05/01/31 09:20:37
書き忘れましたが、最短距離をとるときの点距離を入れる変数mini_d とmini_s2も大域でとっていて、 mainの最後にprintfでこの2つを出力しています。
>TURE
9 :
デフォルトの名無しさん :05/01/31 10:22:02
orz でもdefineでもそう定義してありました・・・ ここは直します
>>6 まさか、mini_dが初期化されてなくて0のままって落ちじゃないよな?
ぱっと見よく判らんから、私なら極力グローバル変数を無くすように書き換えて、
各変数の生存期間を制限した上でそれぞれの挙動を確かめるだろうな。
#私ゃグローバル変数の挙動を追えるほど頭良くないんでね。
11 :
デフォルトの名無しさん :05/01/31 10:36:32
>>10 mini_dは最初は0で初期化しましたけど、それじゃ比較できないよなってことで
適当に大きい数を最初に入れてます
それと自分で実験してみたんですが、大域でとった場合は関数の引数に入れなくても、
またreturnしなくても数値代入ができるようなのでそうしました。
/**/で説明入れてみます。
void search(int t){
int y,i,j;
for(y = 0; y < N; y++){
/*t番目に巡回したときにまだ回ってない点があるならそこにチェック(TRUE)を入れる*/
if(s1[y] == FALSE){
s1[y] = TURE; s2[t] = y;
/*まだ回りきってないなら次に行く点を探す*/
if(t < N-1) search(t+1);
/*回りきっていたら距離計算、比較*/
else{
for(i = 1; i < N; i++) d2 += d1[s2[i-1]][s2[i]];
d2 += d1[s2[0]][s2[N-1]];
if(d2 < mini_d){
mini_d = d2;
for(j = 0; j < N; j++) mini_s2[j] = s2[j]; d2 = 0;
}
}
/*バックトラックのために一個前に回った点の履歴を削除*/
s1[y] = FALSE;
}
}
}
>>11 大丈夫、そのコメントくらいは理解できたから。
それが正しいかどうか、グローバル変数も含めて挙動を推測するだけの頭はないがね。
で、私なりの方針を提示したわけだが、それを否定されたら私にできるアドバイスはもうないよ。
13 :
デフォルトの名無しさん :05/01/31 10:44:56
>>12 わかりました
大域変数減らしてみます、ありがとうございました
まずはd2を。
if(t < N-1) search(t+1); else{ d2 = 0; /* d2 はここで初期化しないとダメ。*/ for(i = 1; i < N; i++) d2 += d1[s2[i-1]][s2[i]];
15 :
GANMEN ◆6JRRRjFXoU :05/01/31 14:12:40
フルスクリーンのHTMLを教えてください
18 :
デフォルトの名無しさん :05/01/31 16:09:53
> mini_d とmini_s2も大域でとっていて、 で、反対語は? > 大域
20 :
デフォルトの名無しさん :05/01/31 17:37:26
Cを最近始めた者ですが、過去検索などしても分からなかった為、 質問お願いします。 文字をある長さまで指定した文字で充填することは可能でしょうか? イメージ的にはoracle SQLのRPAD関数のような事がやりたいのですが…。 よろしくお願いします。
自分で適当な仕様作って、関数書けばいいんじゃない? 別に御仕着せの関数を使わないと、Cじゃなんもできないってわけじゃないんだから。
>20様 >21様 ご回答ありがとうございます。 21様の方法で試してみます。 >22様 もしうまくいかなければ自分で作ってみます。 どうもありがとうございました。
関数の記憶クラスに関して質問です。 関数の定義で記憶クラスを省略した場合は extern 扱いになりますが、 プロトタイプ宣言の場合も省略時は extern と考えていいですか? ネットを回ってると、プロトタイプ宣言では関数の定義が外部にある場合は extern、内部の場合は記憶クラスなしと言う記述があって混乱しています。 また、関数定義では extern、そのソース内のプロトタイプ宣言は static と 指定すると外部からは static 扱いになってるのはそのように決まってるのでしょうか。 早く出た順なのかな、と extern static と同じ関数をプロトタイプ宣言させて、 関数の宣言では extern としても static 扱いだったので…。 VCとBCCのコンパイラで試しました。
俺は、関数にexternは使わんな staticは使うけど
staticが1個でもあるとstatic。 じゃなかったっけ
27 :
デフォルトの名無しさん :05/01/31 23:09:58
>外部からは static 扱いになってる 扱いはしてない
28 :
デフォルトの名無しさん :05/01/31 23:15:27
はるか遠くの関数がallocateした領域でも 領域先頭アドレスさえ間違えなければ サイズとか分からなくてもきちんとfreeできるものですか char* p = NULL; /* 4〜5層下の関数がpにmallocする */ test_func(p); /* 大きさとか知らんけど解放 */ free(p);
できるものです
>>28 test_func(&p);
か
p=test_func();
>>29-30 アリガトゴザマシタ
mallocした領域の終端には
ボクには見えない機械様用のマーキングかなんかがきっと
あるのですね。
レス感謝です。
>>25 自分も普段は関数に extern は使ってないです。
プロトタイプ宣言で static を使ってる例ってネットじゃあまりみないですね。
>>26 それだと道理があいますね。なるほど。。。
>>27 リンク時に外部参照が未解決になるので static 扱いされて参照できない
のかと思ったのですが、もっと別の理由ということでしょうか。
>>33 > プロトタイプ宣言で static を使ってる例
staticを付けると翻訳単位内でしか呼び出せなくなるのでどうせヘッダに宣言する意味がないから。
35 :
デフォルトの名無しさん :05/01/31 23:53:41
>>33 unko.c
static void unko() { /*...*/ }
manko.c
mein() { unko(); }
manko.c では unko は暗黙に extern 宣言される
だからこそリンクでずっこける
^^^^^^^^^
>>34 ヘッダに宣言しても確かに意味ないですね。
やったら各ソースで見つからないと怒られるのかな。。。後でやってみます。
関数が定義されているソース内のプロトタイプ宣言でも static は結構書いてないのが
多そうな気がするのですが、気のせいでしょうか。
>>35 記憶クラスを省略した場合は extern というのは一応分かってるつもりです。
プロトタイプ宣言の場合は、違う説明をしているサイトがあって混乱してますが。。。
自分が特に疑問に思ったのは下記のような場合です。(関数名はかえました。)
testA.c
static void testA(void); /* プロトタイプ宣言は static */
extern void testA(void) { /*...*/ } /* 関数宣言は extern */
testB.c
int main(void) { testA(); } /* 外部参照の未解決が発生。static が優先されてしまう。。。? */
extern void testA(void) { /*...*/ } /* 関数宣言は extern */ は関数宣言ではなくて、関数定義の間違いでした。
38 :
デフォルトの名無しさん :05/02/01 00:19:35
ill-formed ちゃうか?
39 :
デフォルトの名無しさん :05/02/01 01:08:46
> 関数の定義で記憶クラスを省略した場合は extern 扱いになりますが、 なりません
>>38 ill-formedtって未定義って解釈でいいでしょうか。
プロトタイプ宣言と関数定義で記憶クラスが違うというのは普通しないですもんね。
>>39 関数で使用できる記憶クラスは extern と static だけですよね。
省略時に extern でないとすると static ってことでしょうか。さすがにそれは。。。
41 :
デフォルトの名無しさん :05/02/01 08:40:45
> ill-formedtって未定義って解釈でいいでしょうか。 全然ちがいます。 > 関数で使用できる記憶クラスは extern と static だけですよね。 いいえ
42 :
デフォルトの名無しさん :05/02/01 08:44:54
知りたければ言語の規格書を読めってことか。
43 :
デフォルトの名無しさん :05/02/01 09:30:24
いいえ
「ill-formed」をどう訳したら「未定義」になったのか子一時間 教えて欲しい
externってのはリンカやローダにシンボルの解決をマル投げするっていう意味
46 :
デフォルトの名無しさん :05/02/01 11:45:54
exeファイルからソースをみるにはどうしたらいいのでしょう? なにかソフトがいるのですか?
49 :
デフォルトの名無しさん :05/02/01 12:19:35
ANATOMIZERは?
>>36 >testB.c
> int main(void) { testA(); } /* 外部参照の未解決が発生。static が優先されてしまう。。。? */
プロトタイプを省略すると、
int を返す関数と解釈される。
つまり、「testB.c」では「int testA();」がないと言われるのは当然。
51 :
デフォルトの名無しさん :05/02/01 16:20:08
#include <stdio.h> #include <stdlib.h> int main(void) { int i, r, j, c=0, n[6]; do { r=rand()%42+1; for(j=0;j<c;j++) { if(c==0) break; if(r==n[j]) break; } if(j==c) { n[c]=r; c++; } } while(c<6); printf("%d %d %d %d %d %d", n[0], n[1], n[2], n[3], n[4], n[5]); return 0; } ロト6の数字をランダムに作り出すプログラムを作ろうと思ってます。 何度やっても同じ数字しか出ないのですが、プログラム的な問題なんでしょうか?
srand
>>51 randの実装を100回くらい読んでみろ。
54 :
デフォルトの名無しさん :05/02/01 17:24:49
質問です。 malloc や calloc で cast 無しでメモリ領域を確保するとき、warning が出ないようにするには どうすればよろしいのでしょうか? コンパイラは gcc, g++ です。
>>55 すみません、意味が分からないのですが・・・
コンパイル時に Warning が出て、正常にコンパイルできないのですが・・・
>gcc, g++ どっちだよ つか C++ じゃmalloc, calloc なんて使わねーしな
>>56 mallocの返り値はvoid*型だよね。
で、君が確保したメモリ領域は何型で使うの?
例えば、int*型だったとしたら、そこにvoid*型を代入するのはおかしいよね。
いい?代入というのは左辺値も右辺値も同じ型でないといけないの。
mallocは確保したメモリ領域の先頭アドレスを返してくれるわけだけど、void*型を
int*型にキャストしてから代入しないといけないの。
warningとは、君がそういうことをしていないから警告しているわけ。
errorとは別物だよ。
誰か前スレのdatをうpしてくんないかな。
>>57 すみません、人(先生)が書いたプログラムなので。
基本的に C のプログラムなのですが、コメントに // を使ったり、
関数の途中で変数宣言したりするので、結局 g++ でコンパイルするしかないのです。
>>58 それは分かるのですが、double 型に int 型の変数を代入したときに自動的に型変換されるように、
malloc や calloc でも自動的に型変換してくれないものかと思ったのですが・・・
先生生徒揃って無能だな
>>60 うpろだ紹介しる。
誰か出してくれるだろ。
明日までに他の誰もうpしなかったら俺がやる。
>>61 > それは分かるのですが、double 型に int 型の変数を代入したときに自動的に型変換されるように、
> malloc や calloc でも自動的に型変換してくれないものかと思ったのですが・・・
暗黙の型変換は、すべきでないところで暗黙の変換が行われることがあるため、
型を意識してプログラミングしなければならない。
しばしばバグの元になる。
暗黙の型変換はCの汚点の一つ。
>>61 gccって一行コメントに未対応だったか?
俺が動かした環境だと、なぜか、Windowsからエミュレートしたら動かなかったけど
Warning出て欲しくなければ、コンパイラオプション(-?かな)をチェック。たぶん出来る。
>>58 規格ではvoid *と任意のポインタとの相互の変換は暗黙のうちにやって良いことになっているけどね。
>>66 違った。日本語のコメントがあったから動かなかっただけだったと思う。
71 :
デフォルトの名無しさん :05/02/01 19:36:04
>>56 嘘をつくな
warning はコンパイルを妨げないぞ
ある処理系では warning でもコンパイルを中止しろというオプションがあったりするが
それを自分で指定しておいて寝言ほざいてんじゃねえだろな
>>71 「正常に」ってのが、警告無しにって意味じゃない?
まぁ、ソース変えずに警告だけ無くしたいなら、警告消えても消えなくても同じだけど
(∩ ゚д゚)アーアー警告しらなーい
って感じだし。
73 :
デフォルトの名無しさん :05/02/01 20:05:47
#include <stdlib.h> 忘れてるとか
>>65 PerlやRubyなんか最悪。
Javaはキャストだらけでださい。
Cの方がよっぽどまし。
質問です int hoge; int hoge_hoge() { int geho; hoge=1; geho=1; } int main(void) { hoge_hoge(); printf("%d", hoge); } とすれば、全ての関数の中でhogeが使えますが 関数内で定義したgehoはmainの中では使えませんよね? 関数内で作った変数を他の関数からも使えるようにすることはできないのでしょうか?
本ぐらい読んでから聞けよ馬鹿
ここで聞いてもわかんねーッ だれも答える必要ねーッ
>>75 何のためにint hoge_hogeにしたの?
そういう気分だったから?
レス感謝です。
>>41 ill-formedtって翻訳かけたら不適格って出てきました。全然違いますね。すみません。
関数で使用できる記憶クラスのくだりはスコープに関連した…が抜けてました。
自信がないですが、extern, static, と関数に使用できるのはあとtypedef・・・?
typedef では関数のポインタに対してで、関数に使用できるとなると違和感があります。
すみません、自分なにかすごい勘違いしてそうです。
>>44 googleで検索かけたら、上のほうに不明瞭と出てきてたので、未定義のことなのかなと
思ってしまいました。infoseek翻訳で調べたら不適格ですね。
となると、本来はコンパイルエラーにならないといけない・・・?
>>50 36の testB.c で記述抜けがありました。試したときは extern void testA(void);
という testA.c の関数定義にそったプロトタイプ宣言を入れてました。
家と会社にある本、解説サイトもこの辺あんまり書いてませんで、
42でも言われてますけど、本当に知りたいなら規格書を読むべきですよね。うーむ。
83 :
デフォルトの名無しさん :05/02/01 21:52:32
n重のforループを書くにはどうしたらいいのでしょうか。 nについては、1〜20くらいを考えています。
85 :
デフォルトの名無しさん :05/02/01 21:57:35
>>84 roop()
{
int i;
for( i = 0; i < n; i++ )
{
}
roop()
87 :
デフォルトの名無しさん :05/02/01 22:05:40
roop() { int i; for( i = 0; i < n; i++ ) { roop(); } それで、変数ひとつ用意して、if文で規定値になるまで再帰する、みたいな条件を書いたんですが、 なにか変なことしてますか??
>>83 面倒くさいのなら、ソース生成プログラム作れば?
>81 帰ってきたら結論出てるかと思ったのにまだのようなので調べてみたよ。ISO/IEC 9899:1999 より。 > 6.9.1 Function definitions > 4 The storage-class specifier, if any, in the declaration specifiers > shall be either extern or static. となってるので、関数定義につけられる記憶クラスは extern か static だけ。 > 5 If the declaration of an identifier for a function has no storage-class > specifier, its linkage is determined exactly as if it were declared with > the storage-class specifier extern. なので、省略時は extern 扱い。 > 6.2.2 Linkages of identifiers > 4 For an identifier declared with the storage-class specifier extern > in a scope in which a prior declaration of that identifier is visible, > if the prior declaration specifies internal or external linkage, the > linkage of the identifier at the later declaration is the same as the > linkage specified at the prior declaration. (後略) となっているので、先行する宣言がある場合の extern は先行する宣言の リンケージと同じになるから、 static の後の extern は許容された上、 static が優先されると思われ。一方、 > 3 If the declaration of a file scope identifier for an object or a > function contains the storageclass specifier static, the identifier > has internal linkage. > 7 If, within a translation unit, the same identifier appears with both > internal and external linkage, the behavior is undefined. となっているので、extern の後の static は ill-formed ではないが、undefined だと思われ。gcc だと警告が出るね。
>83 再帰を使うというのもありだと思う。特に n が可変なら。
>>91 その意見は出てるんだよ!
もっと創造的なアイデアを出せよ。しねよ!
凄く基本的なことだとは思いますが質問があります AAA.hにAAAクラスを定義してあり BBB.hにBBBクラスを定義してあるとします。 AAAクラスの中でBBBクラスのポインタを宣言したかったので AAA.hでBBB.hをincludeしました。 BBBクラスでもAAAクラスのポインタが必要になった時に リンクはどのようにすれば良いんでしょうか? A→B B→Aと双方をリンクの場合です よろしくお願い致します…
ポインタなら先行宣言するだけでいい
えっと、スレ違い
>>93 Cの問題と言えばCの問題と言う気もするが、
クラスを使っているのなら素直にC++スレに逝け!
roop(int n) { int count[N] = {0に初期化}; int max[N] = {どこかで設定}; int i; for (;;) { count[0]++; for (i = 0; i < n-1 && count[i] == max[i]; i++) { count[i] = 0; count[i+1]++; } if (count[n] == max[n]) break; なんかやりたいこと; } }
loop
あー、ifの中の[n]は[n-1]のまちがい
>92 おおう、済まねぇ。ポップアップで見て間とばしてた。じゃ、こんなんでどう? int i[N], j, start[N], end[N]; /* start[], end[] は適当に設定しる */ for(j=0;j<N;j++) i[j]=start[j]; /* 初期値 */ while(1) { /* i[] を使って適当に処理 */ j=0; while(j<N&&++i[j]>=end[j]) { i[j]=start[j]; j++; } if(j==N) break; } 最後の判定を最初の while に持ってくることもできるし、中の while を for に書き直すことも できるけど、一応素直にしてみた。
被った…orz
104 :
75 :05/02/01 23:57:44
誰か教えてくれないでしょうか?
何を教えてほしいのかわからん。
106 :
デフォルトの名無しさん :05/02/02 00:01:00
>>104 =75
出来ない。
そもそも、ローカル変数はstaticを付けない限り、
関数から抜けた時点で存在がなくなるし。
107 :
75 :05/02/02 00:06:48
>>106 ありがとうございます
じゃぁ、グローバル変数として上にぞろぞろとかくしかないのですね…
ディスプレイ構造体等、増えるにつれてわけがわらなくなってきたので
ローカルで宣言したものを使えないものなのかと思いきいてみました
どうも有難うございました
グローバル変数にしなくても引数で渡すとか、いろいろ解決方法はあるだろうに。
ていうか、C言語以外でもできねえだろ 何がしたいのやら
111 :
デフォルトの名無しさん :05/02/02 00:14:25
私が引き継いだコードは 全部mallocした後に'\0'で初期化されているんですが、 これは糞コードの類に入るんでしょうか? callocでやるべき?
112 :
51 :05/02/02 00:15:34
callocのソース見たいんですが webで公開されてますか
>>111 ループで回して'\0'代入しているなら糞コード。
# 浮動小数点数の配列の確保で、
# ループで0.0を代入しているなら糞コードではないと思うが
0初期化する必然性があることはまれだけどな。
118 :
111 :05/02/02 00:24:20
malloc memset の繰り返しでした callocを使わないんですかと聞いたら 「あまりそういうソースは見ないな」 とベテランの先輩がおっしゃっていたのです
mallocした中身にcharしか入れないんだったら、 callocでやってもよいって程度。
以前、他の会社から受けた仕事で、 コーディング規約の中に、 char buf[256] = {'\0'}; 等の初期化を使わず、 char buf[256]; memset( buf, 0, sizeof(buf) ); の様にいちいち memset() しなきゃならない、 と言う糞規約があったことを思いだした。 浮動小数点数の時にどうするのか?と小一時間(ry
>>118 「メモリ確保はmalloc」のように決めといたほうが、いろいろと楽。
123 :
こもん :05/02/02 00:33:39
C++のプログラムで5教科・英語・国語・理科・社会・数学の50人分の 各個人の格教科の点数と合計データと平均データを 合計点数が大きい順で並べるプログラムを作ってくれませんか?
だからスレ違い
>>90 とても詳細に調べていただきまして、ありがとうございます。
規格の記述箇所まで教えていただきまして・・・。
辞書と翻訳サイトを使って、引用の箇所を出来るだけ読んでみました。
引用下の解釈があってやっと読めた感じです。おかげさまで24での疑問が解決しました。
また、関数で使用できる記憶クラスが extern と static だけと覚えていたのが
間違っていなくてよかったです。
細かく調べたいなら、やはり規格を参照しないと駄目ですね。
英語ですと誤読しそうなので、今度JISの規格書を図書館から借りてきたいと思います。
ありがとうございました。
JISのでも誤読する可能性大
「ストリーム」って何ですか?
130 :
デフォルトの名無しさん :05/02/02 02:00:07
榊原郁恵にきいてください。
美味しいよね
134 :
デフォルトの名無しさん :05/02/02 09:31:06
>>123 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MEMBER 50
#define COURSE 5
typedef struct {
int score[COURSE];
int total;
double average;
} DATA;
DATA r[MEMBER] = {
中略
};
135 :
デフォルトの名無しさん :05/02/02 09:34:25
int main(void) { int i,j; for (i = 0; i < MEMBER; i++) { r[i].total = 0; for (j = 0; j < COURSE; j++) r[i].total += r[i].score[j]; r[i].average = r[i].total / (double)COURSE; } qsort(r, MEMBER, sizeof(DATA), cmp); for (i = 0; i < MEMBER; i++) { for (j = 0; j < COURSE; j++) printf("%d ", r[i].score[j]); printf("%d %g\n", r[i].total, r[i].average); } return EXIT_SUCCESS; } 以下略
136 :
デフォルトの名無しさん :05/02/02 09:35:14
ここまでできればあと3行でできる。
藻前等宿題スレでやれよ。
つーか、なにこの糞コード。よくこんなもん他人に晒せるな。
自意識過剰な馬鹿相手にすんなよ
↑プッ
皆さんに質問です ファイルから設定を読みこむときって皆さんはどうやってますか? width=500 height=600 と、設定ファイルにかかれているとき Perlなら、widthを変数名に、500を値にいれていたのですが C言語ではどうするのでしょうか? もしよろしければ適当にソースを書いていただければ幸です
widthをHashキーにして500をHashに入れます。
Windowsじゃないです
C言語初心者による横レス。 もうちょっと良い方法もあるとは思うので、参考までに。 widthとかheightとかの、キーの種類や数が固定なら それに対応する専用の変数を用意しとけばいいんでない? キーが固定じゃないなら、 「キーの文字列」と「値」を両方格納できる構造体でも作っておいて 自前でそれを調べて値を返す関数を作るとか、そんな感じ。
Perlのsplitみたいな関数はありますか? 特定の値を文字列から取りだしたいです
getline(line); parseline(keyword, value); if strcmp(keyword, 'width') == 0 then width := value; else if strcmp(keyword, 'height') == 0 then height = value; else ...
150 :
デフォルトの名無しさん :05/02/02 15:39:54
関数fcloseを使用しているのですが、 //fclose(fp); のようにコメントアウトするとエラーがでないのですが、 コメントアウトを外すと free():invalid pointer 0x859b6a8 という風に実行中にエラーをはきます。 どうすれば、いいのでしょうか? それ以降ではfpは使用していないので、fcloseしても問題ないような気が・・・
>>150 同じファイルポインタを2回fcloseしてたりする?
152 :
デフォルトの名無しさん :05/02/02 15:50:23
普通、OSは無言だが、隠さずに出せよ
推薦書「OSは止まらない」
でも、個別(カスタム)は知りません。だな
>>150 似たことがあった。自分の場合、他のポインタで
メモリ破壊してるとこがあってそれを直すと解決した。
そんなことない?
158 :
デフォルトの名無しさん :05/02/02 16:13:05
void fuc(){ FILE *fp; char date[30]; strcpy(date,"a.txt"); fp=fopen(date,"r"); ・・・ fclose(fp); } なんですが、、、 ファイルポインタを作りすぎると100個くらい? エラーになるのですか?
>>157 それは、既知だよ。ここに来るやつは。知ってるよw
>>160 同じだ、何回メモリ暴走したことか、意味が無いな
>>158 ファイルポインタを作りすぎるとって、一般的に100もファイルを開けるOSは少ないと思うのだけど。
ファイルポインタがエラーでNULLになるんでない?
いや、どこまでOSを信用できるかだ、というか OSに同化できるかだ
ちなみにFOPEN_MAXなんて定数がある。
難しい、結局、メモリ上限だな、FN_MAXが意味無いと同じだ、ウワーン 好きにやれよ
167 :
デフォルトの名無しさん :05/02/02 18:01:00
念のためage
168 :
デフォルトの名無しさん :05/02/02 18:01:11
構造体で次のようにやるとエラーがでるんですけど struct A{ int a; int b; }; struct B{ A[10]; ←ここ }; こういう使い方はできないんですか?
>>168 struct B {
struct A a[10];
};
「struct A」はあくまでも型名。
struct A{ int a; int b; }; struct B{ A A[10]; ←ここ }; コレなら作れる
171 :
デフォルトの名無しさん :05/02/02 19:08:18
>>169-170 あ、そういえばそうだった・・・
なんか勘違いしてた・・・アリガトンゴザイマス
質問です。 C言語では配列の添え字を宣言する際に2のべき乗を使うと 内部演算がビットシフトで表現され、処理が高速になる。 と聞いたのですが、これを的確に実験する方法はあるでしょうか?
こんなの実験も何もないだろうが。 アセンブラに落とせ。
アセンブラに落とす、とはどういった作業のことでしょうか? 申し訳ないです。
それは「C言語では」というより、「何か特定のコンパイラでは」だな。
>>174 =176(?)
お礼を忘れていました。すいません。有難うございます。
っと、
>>176 の作業によってアセンブラソースが生成されました。
が、これのどこを見ればいいのかさっぱりわかりません。
アセンブラのソースは少しだけ意味がわかる程度でして・・・。
私が考えるに、実行速度の向上はわずかで、
非常に大きなプログラムを書いたときに影響が出てくるのかということ。
で、ちょこっとのプログラムでは向上を確認できないのではないかと。
なに言ってるかわかんなくなってきました。頭冷やしてきます。
影響が出るか出ないかは、プログラムの大きさじゃなくて、 何回その部分を実行するかで決まる。 で、興味を持ったから試してみたけど、 gccだと全部シフトと加減算にしてしまってるように見えるな。 乗算にした方が速いケースってないんだろうか。
>>178 >>176 は私ですー にゃんにゃん
つまり、別人^^;
あのですね、掛算をするときは最適化されちゃってあまり効果がないかもですが、
割算の時は効果がでるかもですー。
例えば、こういうコードをコンパイルするとどうなるでしょうか。
(やってみてくださいね)
test3とtest4では最適化されて同じ(アセンブリ)コードになってしまうかもしれませんが、
test1とtest2ではたぶんtest2の方が長いコードになってしまうとおもいますー
int test1(int a) {
return a
>>1 ;
}
int test2(int a) {
return a/2;
}
int test3(int a) {
return a<<1;
}
int test4(int a) {
return a*2;
}
181 :
デフォルトの名無しさん :05/02/02 21:51:02
#include <stdio.h> #include <stddef.h> main(){ struct station{ int bango; char *p_name; struct station *pm; }; struct station m1 = {1001, "tokyo" , NULL}; struct station m2 = {1002, "shinbashi", NULL}; struct station m3 = {1003, "shinagawa", NULL}; struct station m4 = {1004, "kawasaki" , NULL}; struct station m5 = {1005, "yokohama" , NULL}; struct staion *p_m1; m1.pm = &m2; //次のデータを指すようにポインタを設定する m2.pm = &m3; m3.pm = &m4; m4.pm = &m5; printf("bango namae\n"); for(p_m1 = &m1;p_m1 != NULL;p_m1 = p_m1->pm) //ポインタの更新 printf("%4d %s\n", p_m1->bango, p_m1->p_name); }
やってみました。 たしかに、test2のみ長いコードになりました。 シフト演算はたしかに高速であるということですよね? ・・・で、問題は配列の添え字が ・2のべき乗 ・そうでない場合 この実行速度の比較なんですが・・・どう繋がるんでしょう・・ 私はあほなんでしょーか。
183 :
181 :05/02/02 21:52:00
↑動かん 何で?
>>181 =183
コンパイルエラーがでるの?
実行時エラーが出るの?
実行時エラーは出るけどまともな結果がでないの?
185 :
デフォルトの名無しさん :05/02/02 21:56:20
エラー E2451 未定義のシンボル pm(関数 main ) エラー E2451 未定義のシンボル bango(関数 main ) エラー E2451 未定義のシンボル p_name(関数 main ) 参考書の通りにやってるんだけどなー
186 :
181 :05/02/02 21:57:06
>>182 配列の添え字って
char* p;
int i;
p[16*i] = 0;
ってのは
p+(16*i)なわけだから
p+(i << 4)
と表現できるでしょ
別のスレに池
シフト演算が高速なのは工程数より レジスタがどういう処理行うかって問題じゃないかぁ… 明らかに加算するよりbitシフトのが速そうな気がするじゃん
配列の要素をアクセスするのにシフト使う? char image[256*256]; みたいなんだったらシフト&マスクで高速化できる場面もありそうだけど。
>struct staion *p_m1;
このコードは移植性がありますか? #include <stdio.h> void f(int a); void f(int a) { printf("a = %d\n", a); } int main(void) { void (*x)(int, int); x = (void (*)(int, int))f; x(1, 2); return 0; }
ない
194 :
デフォルトの名無しさん :05/02/02 23:11:40
嘘臭えアル
例えば、二次元配列を一次元で表現するとして int a[16][16]; これを int a[256]; ってやるってことで、要素(6,8)にアクセスするときに a[6][8] ってやるところを a[0x68] ってやったりはしてます。 この辺とは関係ないんでしょうか・・・。
移植性って言っても対象が解からないと意味なし。
>>195 それは関係ありませんよー にゃんにゃん
>>181 えっと、
struct staion *p_m1;
~~~~~~~
これはstationじゃないですか?
>>195 うー。ということは配列の添え字に2のべき乗を使う意味は
無いということなんでしょうか・・・?
>>質問に答えてくれたみなさま 有難うございました!勉強になりました。 実は明日までにレポートを書き上げる必要があって、 てんやわんやです。 がんばります!それでは。
>>197 その口調、やめてくれないか?
すごく気持ち悪い
>202 確かに。 目の前にいて、かつ、不細工や奴が言ってたら、条件反射で顔面殴りそうだ。
うるさいぼけー にゃんにゃん
205 :
デフォルトの名無しさん :05/02/02 23:58:48
はきゅーん
わかりました。 次回からはにゃんにゃん抜きで書きます。
208 :
デフォルトの名無しさん :05/02/03 03:44:12
わかりました。 次回からはにゃんにゃん抜きで書きますにゃん
209 :
デフォルトの名無しさん :05/02/03 03:45:17
-gついててもオプティマイズオプションは有効なままのほうが 便利なときって、どんなとき?
>>209 デバッグが終わったことになっていて、実稼働を行なう時に、
core吐いて止まることが予想出来る場合、その時調べやすい
211 :
デフォルトの名無しさん :05/02/03 06:30:34
1次元配列と2次元配列でたとえば int a[6],b[2][3]を確保して a[0]とb[0][0]、a[1]とb[0][1]、a[2]とb[0][2]、 a[3]とb[1][0]、a[4]とb[1][1]、a[5]とb[1][2]が それぞれ同じアドレスを参照してa[0]を変えたらb[0][0]も一緒に中身が変わるようにしたいんだけど #include <stdio.h> void main(void) { int *a[2]; int b[6]; a[0]=&b[0]; a[1]=&b[3]; } って書き方でいいかな? なんか問題ある気がするんだけど他にいい方法ないかな? あとポインタにするのは2次元配列のほうにしてほしいのよ
>>211 ポインタと配列の箱の絵でも書いて、じっくり考え直した方がよい。
214 :
デフォルトの名無しさん :05/02/03 09:46:26
#include <stdio.h> int main(void) { int a = 0; switch (a) { case 0: printf("a is 0.\n");//この行をコメントにすると、コンパイルエラー int b = 2; printf("b is %d.\n", b); break; case 1: printf("a is 1.\n"); } return 0; } このソース(swtest.c)なんですが、 このままだと、問題なくコンパイル(gcc -Wall swtest.c)できるのに、 printf("a is 0.\n"); の行をコメントにしてからコンパイルしようとすると、 swtest.c: In function `main': swtest.c:9: error: parse error before "int" swtest.c:10: error: `b' undeclared (first use in this function) swtest.c:10: error: (Each undeclared identifier is reported only once swtest.c:10: error: for each function it appears in.) となって、エラーとなってしまいます,,,。 どうしてなんでしょうか?(環境はMacOSX10.3+GCC3.3です。)
どこでも宣言ってことはC99にしてるのかね。 case自体はラベルだから、gotoのラベルと一緒で 次に「文」が続く必要があるけど、宣言って、文じゃなかったかな。 覚えてないや。
216 :
デフォルトの名無しさん :05/02/03 10:11:50
>>215 ありがとうございます。
同じswitchでもJavaとは微妙に違うんですね。
勉強になりました。
217 :
デフォルトの名無しさん :05/02/03 12:54:22
かなり大きいソース公開サイトがあった気がするんですが、名前を思いだせません。 教えてください。
217がバカだと何か困ることがあるのか
>>219 ありがとうございます。
後者の存在は初めて知りました。
漏れはありがたくなかったらしい。
>>231 どんどん伝染を繰り返し、馬鹿が増える。
馬鹿が増えると文明を維持することが困難になる。
文明を維持することが困難になると人類の繁栄に影響がでる。
人類の繁栄は最優先事項なので、馬鹿が伝染すると困る。
ある可変引数関数の引数を、他の可変引数関数の引数に指定する事はできます? void pp(char *fmt, ...) { printf(fmt); } とか。
>>233 printfの場合はvprintfを使え。
自作の関数の場合は初めからprintf/vprintfの用にva_list版も作って置け。
236 :
デフォルトの名無しさん :05/02/03 22:15:39
237 :
デフォルトの名無しさん :05/02/03 22:21:23
あなたが、3つのドアの1つを選んで賞品を獲得するゲーム番組に出ているとします。 ドアの1つには賞品の車があります。残りの2つのドアはハズレでヤギがいます。 あなたがドアの1つ、たとえば1番ドアを選びます。 司会者は、それらのドアに何があるかを知っており、ヤギのドアを1つ、例えば3番ドアを開けてみせます。 そこで司会者があなたに、「2番ドアに変更してもいいですよ」といいました。 2番ドアに変えたほうがいいのでしょうか。 ↑の確率を試行回数1万回くらいで実験してみたいんですが どんな風に書けばいいの?
変えた時と変えない時? 変えた時は1/2で変えない時は1/3。以上
>>240 え”!!違うの?ずっとそうだと思ってた
3人の囚人A、B、Cがいる。三人とも処刑されることになっていたが、 王子が結婚するというので王様が一人だけ恩赦にしてやることになった。 誰が恩赦になるのか決定されたが、まだ囚人たちには知らされていない。 結果を知っている看守に、囚人Aが『BとCのうち、どちらかは必ず処刑 されるのだから、処刑される一人の名前を教えてくれても、私に情報を 与えることにはならないだろう。一人を教えてくれないか。』と頼んだ。 看守は、その言い分に納得して『囚人Bは処刑されるよ』と教えてやった。 囚人Aは、「はじめ自分の助かる確率は1/3だった。いまや助かるのは 自分とCだけになったので、助かる確率は1/2になった」と喜んだ。 さて、看守の返事を聞いた後の囚人の助かる確率はどれだけか?
243 :
デフォルトの名無しさん :05/02/03 22:58:15
スレ違い Cの話にアレンジできない低脳は氏んで
244 :
デフォルトの名無しさん :05/02/03 22:59:20
質問です。 文字列とポインタに関してです。 ポインタの文字列というものを勉強しているとき、 char *ptr = "123"; ptr = "456"; と途中で書き換えられる。 と書いてありました。 しかしもう少しよんでいくと、ポインタの文字列リテラルの中身を書き換えてはいけない と書いてありました。 いったいどういうことでしょうか? ポインタで文字列を扱った場合、書き換えてはいけないのですか?
Cスレイラネごみ
>>237 どう言う確立で司会者が変更して良いというのか。
250 :
デフォルトの名無しさん :05/02/03 23:02:42
何を書き換えた?か。
>>237 司会者がどこが当たりか知っているのか?
それによっては条件が変わってくるぞ
>>244 ソレはptrは書き換わってるが、"123"を書き換えてるわけじゃなく。
256 :
デフォルトの名無しさん :05/02/03 23:05:34
選んだ時点で1/3。 で、ハズレを教えてもらって残り2択となり、 選んだものがハズレの場合、変えた時点で 当たるわけだから、変えたときは2/3かな? 違う? 何言ってるかわからなくなった。 orz
257 :
244 :05/02/03 23:07:00
>>254 456という文字列の先頭ポインタをさしているんですよね?
それは456という文字が連続してあるからでしょうか?
これが457だとエラーになるのでしょうか?
それならなっとくが出来ます。
>>237 変えるか変えないかの二択の時1/3、
再分配すると1/2じゃないかね
>>258 御前が市ね。スレの雰囲気を崩すな。
低脳は困る。
>>244 char *ptr = "123";
ptr = "456"; /* できる */
strcpy(ptr, "456"); /* できない */
ということじゃないの。
262 :
デフォルトの名無しさん :05/02/03 23:11:28
早くアレンジしろ!! コード書けねえバカクズばっかり!!!!!!!!!!!
char *ptr = "123"; ptr = "456"; /* できる */ *ptr = '4'; /* できない */
264 :
デフォルトの名無しさん :05/02/03 23:13:18
*ptr = '456';
なるほど! よくわかりました。ありがとうございました。
char *ptr= "早くアレンジしろ!!\nコード書けねえバカクズばっかり!!!!!!!!!!!";
268 :
デフォルトの名無しさん :05/02/03 23:34:34
>>237 はじめにハズレを選んでいた場合、変えたら必ず当たる。
はじめにあたりを選んでいた場合、変えたら必ず外れる。
で、はじめにハズレを選ぶ確率は2/3なので、
変えた場合、必然的に2/3で当たることになる。
実験するまでもなくね?
【文字列リテラル】
"January" や "February" のように " " で囲んだ文字列を
「文字列リテラル」又は「文字列定数」と呼びます。
文字列リテラルは「定数」であり、本質的に値を変えないものです。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
しかし、値を変えないはずの文字列リテラルですが、この単元で説明したように
ポインタを用いて指定をした場合、その変更が可能になってしまいます。
そのため、ANSI規格では文字列リテラルを「定数」とは呼びません。
たとえば、
char *p = "ABC";
strcpy(p, "DEF");
とした場合、処理系によっては文字列の書き換えが可能になります。
(処理系によっては動作不能になります。)
文字列リテラル内の文字列を変更してよいかどうかは、処理系に依存しますが、
ANSI規格では、文字列リテラルの変更は未定義(何が起こるかわからないということ)です。
http://www9.plala.or.jp/sgwr-t/c/sec10-3.html
270 :
デフォルトの名無しさん :05/02/03 23:49:42
>>244 char *ptr = "123";
ptr = "456";
おそらくこれで、文字列が書き換わっていると勘違いしていると思われる。
char *org_ptr = "123";
char ptr = org_ptr;
ptr = "456";
printf("%p, %p\n", org_ptr, ptr);
これを試してみれ。文字列が書き換わっているんじゃなくてアドレスが
書き換わっているだけだ。
リテラルってこんな感じのことを代わりにやってもらうんだっけ? char *point; point=( char *)malloc( sizeof(char) * (strlen(str)+1) ); strcpy(point,str);
そんな風に思ってるバカはお前だけ
(´-`).。oO(どうやったらこの流れから
>>271 のような発想が出てくるんだろう……)
僕もリテラルでつくった文字列は共有される場合があるから書き換えるとまずいと聞いた時があります 結局大丈夫なんですか?
リテラルっておいしいんだよ。煮つけにしたりとか。はちみつ塗って焼いてもいいね。
>>275 ま、実際に規格を作る段階で
>>274 のような実装の処理系があるから
ということで検討がなされたんだけどね。
規格となってしまった現在ではそういうレベルの問題じゃないというのは同意。
ビットマップ画像処理プログラムで、上下反転を行うと画像によってはエラーが出てしまいます。 どうやら画像サイズに関係しているみたいです。(1024*768 160*120ならOK,800*600 1024*819ならNG) memcpyでエラーが発生してるってことはデバッガで確認しましたが、理由がわかりません。 あくまで推測ですが、ポインタが怪しいかと。 環境 OS Windows VC.NET ソース一部。 前略 typedef struct{ unsigned char b; unsigned char g; unsigned char r; }pixel; 中略 void henkan_mirrou(BITMAPINFOHEADER *bminfo, pixel *img){ int x,y; pixel cache; for(x=0;x < bminfo->biWidth;x++){ for(y=0;y < (bminfo->biHeight/2);y++){ memcpy( &cache, (img + (y*bminfo->biWidth) +x) , sizeof(pixel) );//←←←エラー(?) memcpy( (img + (y*bminfo->biWidth) +x) , (img + (bminfo->biHeight-y) * bminfo->biWidth +x) , sizeof(pixel) ); memcpy( (img + (bminfo->biHeight-y) * bminfo->biWidth +x) , &cache, sizeof(pixel) ); } } } 以上。 ご教授下さい。
>>280 エラー出してるんなら原因わかるでしょ。
>>279 レベルが違うとはどうゆう違いなのでしょうか?
244さんが言う「ポインタの文字列リテラルの中身を書き換えてはいけない」
とは
char *p = "\n";
*p = '\a';
printf("\n");
がおかしくなる処理系の場合を指しているんじゃないんですか?
おかしくならない処理系でも書き換えてはいけない。
何でこんなバカなの…
>>282 解決方法がわからないから困ってるんです。
追加
・別関数の左右反転は正常にできる。
・画像サイズが大きいと発生というわけでも、小さいから発生と言うわけでもないみたいです。
>>280 (1) y=0 の時に bminfo->biHeight-y はどこを指す?
(2) 4バイト境界の罠
>>286 エラーとは何?
memcpyの前後で書かれるべき値が書かれてないってこと?
>>287 (1)の観点で、
bminfo->biHeight-y -1
としてみました。
解決できました。ありがとうございました。
union { int a; struct { int b1; int b2; } b; }; という構造で a と b1 は同じ領域を占めることって保証されてますか?
union { struct { int a1; int a2 } a; struct { int b1; int b2 } b; }; でもこの場合a1とb1が同じ位置になることは保証されますよね どうして結果が違うんでしょう??
293 :
デフォルトの名無しさん :05/02/04 01:05:45
unchi
294 :
デフォルトの名無しさん :05/02/04 09:22:15
コンパイルした後のexeファイルからソース見ることってできるます?
295 :
デフォルトの名無しさん :05/02/04 09:23:13
コンパイルした後のexeファイルからソース見ることってできるます?
296 :
デフォルトの名無しさん :05/02/04 09:23:34
できるません。
source.c ---------------- #include <stdio.h> int main(void) { int c; FILE *fp = fopen("source.c", "rb"); while((c = fgetc(fp)) != EOF){ fputc(c, stdout); } fclose(fp); return 0; } ----------------
298 :
デフォルトの名無しさん :05/02/04 10:33:29
"b"がださすぎ。
exeって書いてあったからね
301 :
デフォルトの名無しさん :05/02/04 10:42:53
さっき人にwhile文の無限ループ時にはいる 1って何型?って聞かれたんですが・・・。 何型なんでしょう?
>>301 while 云々関係なく「1」はint型
int
実行している自分自身の絶対パスを取得する方法って何でしょう? LINUX版の「_pgmptr」とかないっすか?
お前の環境はなんなんだ
「頼むから
>>1 のFAQに一通り目を通してくれよ」と切に思う今日このごろ
>>307 それはOSに依存してるよ〜
UNIX系環境ではコマンドラインの一番目が来ちゃう
GetModuleFileNameみたいなのがあればOK UNIX系環境では知らん
もう構造体とかオブジェクト指向がどうとかポインタとか さっぱりわかりません 分けわっかんなああああああああああああああい
>>311 あなたはプログラミングに向いていません。
>>312 それを言うなぁ!!
日曜プログラマなのでちょこっとづつ理解していくさT〜T
>>311 構造体…一緒に使うデータなんかは纏めておいたほうが楽だよね?
オブジェクト指向…構造体についでにそれの処理法も纏めておくと
中でなにやってるか気にせずに済んで楽♪
ポインタ…これはC言語及びC++言語のある意味最大の特徴
俺は理論だけじゃ完全に理解できなかったので
デバッガ使って何やってるか追い駆けた
構造体とオブジェクト指向はなんとなーくわかった
クラスがどーとかうすーい記憶が。
ポインタなんて一生わかんね!
わかんなくてもAPI使えるからいいもん!
>>318 にゃん抜きな人なのね
ありがと。
>>319 ,,、,、、,,,';i;'i,}、,、
ヾ、'i,';||i !} 'i, ゙〃
゙、';|i,! 'i i"i, 、__人_从_人__/し、_人_入
`、||i |i i l|, 、_)
',||i }i | ;,〃,, _) 汚物は消毒だ〜っ!!
.}.|||| | ! l-'~、ミ `)
,<.}||| il/,‐'liヾ;;ミ '´⌒V^'^Y⌒V^V⌒W^Y⌒
.{/゙'、}|||// .i| };;;ミ
Y,;- ー、 .i|,];;彡
iil|||||liill||||||||li!=H;;;ミミ
{ く;ァソ '';;,;'' ゙};;彡ミ
゙i [`'''~ヾ. ''~ ||^!,彡ミ _,,__
゙i }~~ } ';;:;li, ゙iミミミ=三=-;;;;;;;;;''
,,,,-‐‐''''''} ̄~フハ,“二゙´ ,;/;;'_,;,7''~~,-''::;;;;;;;;;;;;;'',,=''
;;;;;;;;''''/_ / | | `ー-‐'´_,,,-',,r'~`ヽ';;:;;;;;;;, '';;;-'''
''''' ,r'~ `V ヽニニニ二、-'{ 十 )__;;;;/
>>319 オブジェクト指向の説明間違っているぞ。
>>319 すんげー噛み砕いて教えてくれた!
ありがとう!
ポインタのお勉強をしてみるかぁ
俺はi386アセンブリのソース書くようになって初めてポインタを理解した。
基本情報用にCASLIIをやってポインタがどういうものかわかった
俺の姉さんはボインだ
328 :
デフォルトの名無しさん :05/02/04 15:02:47
ポインタ関連で質問。 char *str[]={"abcdef", "ghijkl", "mnopqr"}; と定義したとき「b」だけを出力するならstr[0][1]でいいと参考書にあるのですが これだとコンパイラは通っても実行結果が出てきません。 どのようにしたら「b」だけを出力できるのですか?
>>328 どうやって出力しましたか?
ポインタはきっと関係ない。
>>328 printfで出力するのなら%sではなく%cにしろ。
>>329 pritnf("%s", str[n][1]);
です。nはint型で0が入ってます。
ちなみにstr[n]に置き換えると「abcdef」が出力できました。
・・・と書いてるうちに
>>330 が答えてくれましたね。
ちゃんとできました。ありがとうございます!
333 :
デフォルトの名無しさん :05/02/04 15:30:17
>>328 とりあえず、「文字」と「文字列」の区別は付けた方が良いよ。
↓小泉乙
336 :
デフォルトの名無しさん :05/02/04 15:33:09
私は
>>328 の質問にもれなく答えたつもりですよ?
構造体って 昔gotoでがちゃがちゃ遊んでたベーシックとは違って あぁあわかっちゃったT-T
構造改革はやくやれ!
339 :
デフォルトの名無しさん :05/02/04 19:00:18
フラグの指定を FLAG1 | FLAG2 | FLAG3 と書くのはおかしいと思います。 FLAG1とFLAG2とFLAG3という意味なんだから FLAG1 & FLAG2 & FLAG3 が正しいですよね。 C言語作った人は英語を知らなかったんでしょうか?
fool
>>339 おまえはFLAG1+FLAG2+FLAG3と書いてればよし
343 :
デフォルトの名無しさん :05/02/04 19:25:59
typedef struct tp{ unsigned int type0:1; unsigned int type1:1; unsigned int type2:1; }TYPE; 0:1の「:」って何でつか??
何でしょう、それはねー、コロン(Colon)でいいか?
>>343 虫眼鏡で拡大してよく見てみろ
ビット
フィールド
と書いてあるのが分かるから。
346 :
343 :05/02/04 19:37:25
コロンでつ。 ビットフィールド?
凄いね。絶対自分で検索なんてするものかという強烈な意思が感じられるよ。 将来大物になるよきっと。
┌type0(1ビット TYPE[][][]─type2(1ビット └type1(1ビット って書いてあるんだけど何のことか分からん
わかんないなら使うな!
350 :
デフォルトの名無しさん :05/02/04 20:00:32
2ch は、いまは google に並ぶ情報源(品質はともかく) どっちを選ぶかは個人差の影響が強く出る 2ch で聞く場合の「ぐぐれ」は google を使う場合で言えばデッドリンクに相当する承知のノイズ 言うだけ無駄だってことに気付いていないピエロは 2ch のコメディアンw
やはり、ハードウェアから見た演算装置を教えないゆとり教育の弊害だな。
ビットフィールドなんて実務じゃつかわん 覚えたてで使いたがる低スキルがいるがやめれ 制御系は使うかもしれんが
354 :
デフォルトの名無しさん :05/02/04 21:25:11
>制御系は使うかもしれんが 低スキルってオマエ・・・・w
>>353 使わんってw、32ビットを丸々フラグで良いよ
つまり、自分が使わない範囲内においては使わない。 というこった。
つまり、俺理論を勝手に一般化するのは馬鹿のやること。 というこった。
わざわざビットフィールドなんてつかわんだろ ビット演算でたりるから
だって、制御系だって、メガバイトオーダーでコンパクション 必要ないだろう?、昔は2Kバイト境界でチップが増えるし、1Mバイトとから 2Mバイトの境界は楽だよな
360 :
デフォルトの名無しさん :05/02/04 22:04:05
ttp://www.hidecnet.ne.jp/~sinzan/tips/c/c_tip03.htm このページのワイルドカードを含む文字列比較の関数なんですが、
case '*'のところがよくわかりません。
どなたか解説お願いします。
//*********************************************************
// 第1引数にワイルドカードを含む文字列を指定する。
// 2つの文字列が一致すれば真、さもなくば偽を返す。
//*********************************************************
int StrMatch( const char *ptn, const char *str )
{
switch( *ptn )
{
case '\0':
return '\0' == *str;
case '*':
return StrMatch( ptn+1, str ) || (('\0' != *str) && StrMatch( ptn, str+1 ));
case '?':
return ('\0' != *str) && StrMatch( ptn+1, str+1 );
default:
return ((unsigned char)*ptn==(unsigned char)*str) && StrMatch( ptn+1, str+1 );
}
}//StrMatch
そういうのはlispででもやってろ
多倍長の乗算を高速フーリエ(FFTとかいうやつ)で12*2=24ってやりたいんだけど
int n=4;
double theta=3.14159265358979323846*2/n;
double ar1[]={0,0,1,2};//実数
double ar2[]={0,0,0,2};
double ar3[]={0,0,0,0};
double ai1[]={0,0,0,0};//虚数
double ai2[]={0,0,0,0};
double ai3[]={0,0,0,0};
fft(n,theta,ar1,ai1);//ar1,ai1をFFT変換
fft(n,theta,ar2,ai2);//ar2,ai2をFFT変換
for(int i=0;i<n;++i)
{
ar3[i]=ar1[i]*ar2[i]/n;
ai3[i]=ai1[i]*ai2[i]/n;
}
fft(n,-theta,ar3,ai3);//FFT逆変換
ってやるとar3が{2,1,2,1}ってなってしまう。
期待してるのは{0,0,2,4}です。
単純に繰り上がりの処理とかもなしでかまいません。
どこが間違ってるのか解説してくれる方いませんか?
お願いします。
ちなみにfftって関数は
ttp://momonga.t.u-tokyo.ac.jp/%7Eooura/fftman/ftmn1_2.html#sec1_2 からコピーしたのを使っています。
fftを作った人に質問するのが道理、 もし答えられないならここに来い、かまってやる
fftつくったひとのHPみてもぜんぜん理解できなくて すごそうな人なので怖くて聞けませんorz かまってください。お願いします
>>364 J.W.CooleyとJ.W.Tukeyから派生したもの以外知らない。
だよ
>>360 *がなかなか簡潔で良いね。少し感心した。
369 :
343 :05/02/04 23:14:50
>>353 確かに漏れは低スキルだけど
基本情報の勉強中に突然出てきたから分からなかったのだ
>>369 ビットフィールドはさらっと流すだけでいいと思う。
おそらく一生使うことはない。
万が一見かけたときに「あー、こんなのがあったな」って思い出す程度で十分っす。
環境依存なのが痛い。
>>360 条件(1) StrMatch( ptn+1, str ) ptn+1 と str がマッチすれば成功。
(例)ptn:"*ABC", str:"ABC" ・・・ ptn+1:ABC, str:ABC だから成功。
条件(2) (*str!='\0') && StrMatch( ptn, str+1 ) strの最後まで、strを(再帰で)進める。
(例) ptn:"*ABC", str:"xyzABC"
・・・ str:"yzABC" --> "zABC" --> "ABC" ここで条件(1)が成立。
>>373 ありがとうございます。よくわかりました。
ビットフィールド毛嫌いする香具師って、使いこなせない怖がりなのかね。
>>375 馬鹿? 4バイトくらい使えない貧乏コンパイライラネ
>>375 確かにそれは中山道に遊女なしと言うくらいだからな。
「vectorは配列として実装され、イテレータは唯のポインタ」 これってちゃんとansiとかの規格で決まってるものなんでしょうか? ansiの公式とかいってみたんですが、英語だし、Cのページにすら辿り付けません。
スレ違い
英語も読めない、日本語も読めない、使ってる言語すら知らない。 どうしようもない
ごめんなさい。
iteratorがpointerかはわからないけど 配列なのは決まってる。 というか、きまってなくて追加だか変更されたきがする
>>378 #include <iostream>
#include <vector>
template <class T>
class Null {
template <class U> struct Po { enum { isPointer = false }; };
template <class U> struct Po<U*> { enum { isPointer = true }; };
public:
enum { isPointer = Po<T>::isPointer };
};
int main()
{
std::cout << std::boolalpha << Null<std::vector<int>::iterator>::isPointer << std::endl;
return 0;
}
だから、c、はいらない、c++もいらないでc++で十分、さようなら
387 :
デフォルトの名無しさん :05/02/05 01:16:30
Windowsでread/write lockを実現するAPIってなぬ? ソラリスのrwlockしたい。
>>388 ここじゃねぇべか?
う○こ産はどこさ行けばえぇだ?
>>389 ここはC言語のスレであって、世にあるAPIの使い方のスレではないことに注意。
>>390 別にいいじゃねえか
いちいち細かいんだよおまえ
392 :
デフォルトの名無しさん :05/02/05 01:53:41
うさこちゃん
>>391 プログラミングはもっと細かいぞ。
一字一句間違ってはいけないし、代入するとき変数の型が違ってもいけない。
しかも、1回や2回、演算回数が無駄に多いと修正すべきだと言われる。
>>362 じこれす
int n=4;
double theta=3.14159265358979323846*2/n;
double ar1[]={0,2,5,6};
double ar2[]={0,0,0,4};
double ar3[]={0,0,0,0};
double ai1[]={0,0,0,0};
double ai2[]={0,0,0,0};
double ai3[]={0,0,0,0};
fft(n,theta,ar1,ai1);
fft(n,theta,ar2,ai2);
for(int i=0;i<n;++i)
{
ar3[i]=ar1[i]*ar2[i]-ai1[i]*ai2[i];
ai3[i]=ar1[i]*ai2[i]+ai1[i]*ar2[i];
ar3[i]/=n;
ai3[i]/=n;
}
fft(n,-theta,ar3,ai3);
にしたらうごいた。でも結果が10倍されてるの
なんでだろ〜
ぎゃはは
396 :
デフォルトの名無しさん :05/02/05 02:14:36
double theta=3.14159265358979323846*2/n;
およそ3?
398 :
デフォルトの名無しさん :05/02/05 02:33:35
ゆとり教育を受けてきた私に言わせると円周率は3だ。
>>398 ゆとり教育を受けてないのがバレバレですが
およそ400げと
401 :
デフォルトの名無しさん :05/02/05 02:40:04
自作自演乙
piを実数に置き換えるなんて数学に対する冒涜だな
404 :
デフォルトの名無しさん :05/02/05 02:47:39
ぴ
K&R高杉・・・
外接、内接、無駄かもしれないが追い込め
>>394 配列サイズは桁数の2倍必要、あと数字の並びが逆だと思う。256*4なら、
int n=6;
double theta=3.14159265358979323846*2/n;
double ar1[]={6,5,2,0,0,0};
double ar2[]={4,0,0,0,0,0};
でやってみそ。
>>SIZEOF(TYPE)*KAZU 女でも分かるわ。?
409 :
デフォルトの名無しさん :05/02/05 04:00:11
>>408 SIZEOF(KASU) == 408
Strref entriesってなんですか?
誤爆?
>>394 試してみた。ごめん、そのfftは配列サイズが2のn乗でないとうまくいかない。n=6はダメ
桁あふれしなければ4のままで大丈夫だった。これで、1024が表示された。
int n=4, i;
double theta=3.14159265358979323846*2/n;
double ar1[]={6,5,2,0};
double ar2[]={4,0,0,0};
double ar3[]={0,0,0,0};
double ai1[]={0,0,0,0};
double ai2[]={0,0,0,0};
double ai3[]={0,0,0,0};
fft(n,theta,ar1,ai1);
fft(n,theta,ar2,ai2);
for(i=0;i<n;++i)
{
ar3[i]=ar1[i]*ar2[i]-ai1[i]*ai2[i];
ai3[i]=ar1[i]*ai2[i]+ai1[i]*ar2[i];
ar3[i]/=n;
ai3[i]/=n;
}
fft(n,-theta,ar3,ai3);
for(i=0;i<n-1;i++){
ar3[i+1]+=(int)ar3[i]/10;
ar3[i] = (int)ar3[i] % 10;
}
for(i=n-1; i>=0; i--) printf( "%d",(int)ar3[i]);
printf("\n");
413 :
デフォルトの名無しさん :05/02/05 10:33:36
fork()関数で生成した子プロセス内でいじった変数を 親プロセスに返したいんですけど何か良い方法はありませんか?
signal pipe socket
>>414 ありがとうございます。
調べて、適切なものを使ってみます。
>>416 それは、考えていたんですが、何度も使うので効率が悪そうだなと思いまして。
それのどこがお手軽なんだ
共有メモリでも使え。
>>382 ,384
ありがとうございます。
でも384はBCCだとコンパイルできなんだ…
>>398 因みに、今の指導要領では円周率は概念を教える時には3.14を(例に?)使って教えて、計算では適宜3を使用するっぽい
変数を覚えたら、πを使うっぽい
>418 汎用性の高さとデバッグの容易さでは?<お手軽
お前らよくこんな糞言語使ってられますね? if ( sizeof( int ) < -1 ) puts("設計したやつ馬鹿だろw");
JavaはC++はオブジェクト指向というらしいですが、 Cは何指向というのでしょうか?
425 :
デフォルトの名無しさん :05/02/05 15:17:52
手続き型
関数型
>>412 めちゃくちゃありがとう。
これで他倍数計算できそうです。感謝!
この数字の並びを逆にするのは使っているFFT関数の仕様なのかな
428 :
デフォルトの名無しさん :05/02/05 16:24:56
Cマガジン見たらjavaになってた... 今からC勉強するのはあんまりよくないの? javaの方がいい? ちなみに基本情報も受けたい。
Cなんか勉強したって全然意味ないでしょ 将来糞ほどの役にも立たないよ
Cは入門用言語 他の言語を勉強するときも、Cやっていた方が理解しやすい もっとも、Cやっている時間も他の言語につぎ込んだ方が早いだろうが
グダグダのガタガタ
せめてセキュリティくらいは勉強してくれ。
Cの案件など全然見ないのだが
業務系はしね。
440 :
デフォルトの名無しさん :05/02/05 18:38:24
質問です。 ビットとは何のことなんでしょうか。 今、ビット演算子のところを勉強しているのですが 何のことなのかよく分りません。
ググった方がいいだろ こんなとこで聞くより
c#はここでいいんですか?
443 :
デフォルトの名無しさん :05/02/05 18:46:50
444 :
440 :05/02/05 18:49:37
ビット演算子は少し分りました。 でも、どうして数値を2倍にするときに*2ではなく、<<を使うんですか? *2と記述したほうが読みやすいと思うんですけど・・・
だからせめて調べてから質問しろと
11 * 10 = 110 だろ?
>>446 どーでもいいけど、それ、10進数でも成り立つな。
だから分かりやすいんじゃん
AA+BB = BB
>>446 「基数」倍するということの本質の片鱗に触れた希ガス
452 :
440 :05/02/05 19:05:45
あー、やっぱりビット演算子が分らん。 ビット演算子って頻繁に使われるんですか?
組み込み系ではビット演算やりまくるよ〜と聞いたのですが、 どういう意味でしょうか・・・
454 :
デフォルトの名無しさん :05/02/05 19:08:32
>>444 >*2と記述したほうが読みやすい
色んなものをデバッグしてみりゃわかるけど
<<1 と *2 は両方向瞬時に連想できないと仕事にならん
456 :
440 :05/02/05 19:12:05
>>454 でも、*2のほうが直感的に分りやすいから、<<1と書く必要はないと思うんですよ。
実際に2倍や4倍にするときに<<って使われているんですか?
>>453 CPUの中ではビット演算しかしてないわけだがw
458 :
デフォルトの名無しさん :05/02/05 19:17:54
>>453 組み込みでなくても使うぞ
例えばウインドウを表示するのにこんな関数を呼び出すが、
hwnd = CreateWindow("foo", "bar",
WS_POPUP | WS_CAPTION | WS_THICKFRAME | WS_SYSMENU | WS_MAXIMIZEBOX,
0, 0, 640, 480, 0, 0, 0, 0);
複数選択のオプションを組み合わせるのにビットORを使っている
>>456 その方が高速な可能性が高いからそうやっている。しかしながら最近の
コンパイラでは自動的にそのように置き換えを行っていることが多い。
460 :
デフォルトの名無しさん :05/02/05 19:20:34
>>456 こういう出力を期待してたら
○○○●○●
↓
○○●○●○
あれ? 何で2倍になってるんだろう・・・
てなことが色んなとこで出てくるよ
>>456 <<すると2倍4倍になるのはあくまで結果の話であって、2倍4倍するために<<使うやつは今どきいない。
462 :
440 :05/02/05 19:23:50
色々答えてくれて、どうもありがとうございます。 まだよく分ってないけど、なんとか頑張って理解してみます。
463 :
デフォルトの名無しさん :05/02/05 19:27:48
>>461 おまえさん、金額に0つけたら10倍になるのもあくまで結果の話とのたまうか?
>>463 0つけたら10倍になるのは結果だが・・・。
逆に10倍にするために0つけることは日常的によく使うな。
でもそれは俺らの脳が10進法ならそれで十分なことを知ってるからであって、乗算の本来のやり方じゃない。
9倍や13倍に応用できない。
最近のコンパイラはその辺最適化してくれるし、
プログラムの場合乗数が変化する可能性も考慮したほうがいいのだから
あえて<<る必要が無い。
>>438 うちはCできる人募集中ですよ。
(実際には、最低でもCはできることが条件)
けんすい20回!まじすごです。
シフトだけでなくローテートもできる高級言語はないものか?
素朴な疑問なんだけどローテートしたらどんな実装のときに便利になるの?
>>473 俺2分… すごいな。
そういえば、ハレー彗星がやってきた時、世界中の空気が5分間だけなくなるとかいう
噂が立って、自転車のチューブがよく売れたという話が…
475 :
デフォルトの名無しさん :05/02/05 20:24:47
>>465 ちょっと待て、9進法でも13進法でも通用する話だぞ?
日常的に2進法使ってない PG がいないとは言い切らないけど
自慢するこっちゃねえぜ、少なくとも
>最近のコンパイラはその辺最適化してくれるし、
アフォなコンパイラは普通にあるよ
逃げらんない形でのご対面が怖いんだよ
>>475 ・アフォなコンパイラを使わないといけない
・シフト演算使って時間を短縮させないといけない
そんな現場に素人連れて行くのが間違い。
477 :
デフォルトの名無しさん :05/02/05 20:33:41
>最近のコンパイラはその辺最適化してくれるし、 >アフォなコンパイラは普通にあるよ 両方とも本当のことだと思う
> 日常的に2進法使ってない PG がいないとは言い切らないけど つか、最近のWeb系では2進法使えるPGの方が少数派。
bccコンパイラはアホな子ですか?
481 :
デフォルトの名無しさん :05/02/05 20:41:11
leaって安いんだよなw
どんなコンパイラがアホなの? また、それを使わなければいけない状況とは?
>>482 組み込みとかでアホなコンパイラしかない場合とかじゃない?
484 :
デフォルトの名無しさん :05/02/05 20:46:03
>>479 専門外の能力がないことを恥じることはないが自慢することでもない
> 日常的に2進法使ってない PG がいないとは言い切らないけど
> つか、最近のWeb系では2進法使えるPGの方が少数派。
>>478 っす。これも多分両方とも間違ってないとおもうけどね。
>>483 あぁ!あるあるあるあるアルマジロですよ!!
C言語でポリモルフィズムを実現するにはどうすればいいんですか?
関数ポインタは使えないの?
>>488 すべてのデータをvoid *で受け渡しして各メソッドでキャストすればOK
必ずvtblをつくるようにすれ
構造体に関数ポインタを入れておく方が楽だと思うんだが
493 :
デフォルトの名無しさん :05/02/05 21:27:04
>494 ええーまじですこ?
C言語で無理にポリモフィズムなんかしたって報われないよ それぞれの言語に合ったやり方というのがある 本当に必要なら別の言語にしなさい
ではPHPにしときます
>>496 >C言語で無理にポリモフィズムなんかしたって報われないよ
unix 系のファイルシステムは、まさに多態性を行っているように
見えるけど、やっぱりあそこら辺を実装するためには
C++ とか Java とかを使うべきだとでも?
>>497 です。べつにVFSはいらないのでPHPでいいですよね?
intの変数a,b,c,dがあって、どれか一つでも0以外だったら、というコードは 普通は if (a || b || c || d) {...} のように書くと思いますが、 これを if (a | b | c | d) {...} と書くのは、邪道ですか? ショートサーキットのルールとコンパイラの最適化を見越すと 条件が変数の読み込みだけであるなら、 大差ないとはいえ、一応後者の方が速そうですが。
邪道ではないが、速い方がいいのなら予測で書かずに実測するべき。
邪道とまでは言わないけど、式は式として書いたほうがいいよ。
いきなり失礼。いっきに質問ふたつしちゃいます。 if(!a--) と、 hoge->foo->bar こうやって書くと、いけませんか? 評価順番とか考えると。
まぁ、コメントは書いとけ。 /* どれか一つでも0でない場合 */
507 :
デフォルトの名無しさん :05/02/05 22:05:31
>505 文法的にはなんら問題なし。 漏れはそのif()見かけたら、そのソースは厄介だろうなって感覚を覚えるけどね。
hoge->foo->barって良くないの?
なんも問題ないけど?
なるほど。 ありがとうございます。 確かに、これ書いてあるソース厄介っす(w 今見てるけど。 # 関数ポインタ使うのはいいけど、まるで goto 並に処理飛びまくってます。(愚痴
> # 関数ポインタ使うのはいいけど、まるで goto 並に処理飛びまくってます。(愚痴 それは別。詳細設計がまずいだけ。
関数ポインタ使うぐらいなら素直に関数型言語使っとけって。
514 :
デフォルトの名無しさん :05/02/05 22:23:55
関数ポインタの、どこが、何が goto と似てるのか、小一時間問いつめたい!!
>>505 > if(!a--)
コレはあとで見直したとき面倒そうだな・・・
516 :
デフォルトの名無しさん :05/02/05 22:32:20
return ○○ void ○○( void ) { return △△ } void △△ こんな感じのがいっぱいあって、しかもこれがご丁寧にファイル分割してある・・・ ループの中でのこういう分岐の嵐。自分には読みにくい・・・ 素直に switch case じゃ駄目なんかなぁ、とかオモタわけです。
518 :
デフォルトの名無しさん :05/02/05 22:34:57
>void ○○( void ) >{ >return △△ アホ
void*
520 :
デフォルトの名無しさん :05/02/05 22:51:46
C言語、どれくらい出来たら上級者といえますか?!! malloc とか出来るようになったら上級者ですか?!
>>520 いろんな言語のパラダイムを学び、TuringMachineが何かということを理解し、
アルゴリズムとデータ構造の基本を学び、Cがどのようにしてアセンブリに変換される
のかということを学べば中級だろうね。
Cコンパイラが作れる程に理解したら上級。
>>517 設計した人が関数型言語の使い手なんだろうな
と、このようにCでバリバリFPやOOP的に書くと、世の中のCしか
使わない人種がコードを読めなくなるので逆に設計が悪いとか
言われる
だから
>>488 はCでポリモフィズムなんてやめときなさい
TMが何かなんて理解する必要無いだろ
>>522 > 設計した人が関数型言語の使い手なんだろうな
どう見たら関数型言語っぽいんだよ。入力引数void・返り値voidだぞ。
ある。 そうでないと計算量理論が理解できないから。
前の職場にチューリングマシンを語るのが大好きで、 スレッドを毛嫌いするおっさんがいたな
ほげほげ
>>526 低賃金労働者は口を動かさず手を動かしてなさい。
宇宙空間にはエーテルが詰まってるんだよ! voidも同じだ!
530 :
デフォルトの名無しさん :05/02/05 23:08:08
皆さんにお伺いしたいのですが、どうやって勉強してますか? (a) サイトで勉強している (b) 本を読んでいる。(その場合、一日何冊ぐらいのペースで本を読んだりしてますか?) (c) その他 軽いアンケートのようなものですが、お答えいただければ嬉しいです。
(d) プログラムを書いている
独学でいろいろ書いててわからなくなったらとりあえずぐぐってみる わからなかったらとりあえず学校の図書館に篭る
(e)教えてもらう
(e) ソースを読んでいる
とりあえず皆、型にはまらない性格だということがわかりました。
(f)天才だから勉強するまでも無い
>>530 主に本を読み、補助的にサイトを読んでいる。
セミナーにも参加している。
山にこもる
>>530 一日何冊という読み方ではなく、たくさんの本の中から必要な部分だけを抜き出して読む。
(g)日々祈る
つうかあれだCって本質はかなり単純な言語で その本質さえ感じることができれば あとはOSのシステムコールなりAPIなりを扱うだけでそこそこのものはできる つまり学ぶんじゃない!感じるんだ!
>>541 f`::'ー 、,-、-、_ _,....-- 、_ _,....-=―ヽ―-、-、_
,.r'‐'゙´ヽ,r' ヽ \ー、_:::::::::/,´:::::::::::,:::::::,::::::::ヽ::\`ー、
,〃ィ ,rヽ'-ヽ i 、 、 ヾ,、 `'y',ィ´/::::::::/|::::::ハ_::::::::ト、::::\ \ そ
r'/〃// | i! |, \、_`ー!rf.,イ-,ィ/u ノ::::/ |::::`::::|iヽ::::::ヽ ヽ.
iヾ!l i /,.=ヽ i,ケ ハ,i', Y't=ラ゙,〉'|::::r'|! 彡´ ,!--、 |i!|::|::i::::::', ', う
{ヾllッ-, 〃ノ'-'、||ii i|i| |-/! /^ヽ ´ ヾ|从ノ::i::::| ||
>|゙! 0ヽ ノ' ´ 0 レノWノi |,.、!/ 0 0 ',' レ|,イ::::i,,_ | ! だ
',i ヽ- , _, " |i| | | ´ '´ハ',Y .!
/l ` !| | i `´ r 'ー‐' u (-, ' | ! っ
/久 U |! i|'´'、u z_,ノ/ .i |
/イ |ヽ '==..‐_、 |!,'|Y´,ヽ ___ ハ_ ,/i | | た
|ト|、',::::\ _,.-‐イ//-'´::::!\'ー‐--ニュ / ト_、 _| _!,=,|
〉:ヾ_'、::::`ー‐r< //イ|::::::_、:::`7i\ __,..-‐'´ .| |`゙"::"::|-" の
'ー‐'´¨`'ー、/,rケ /,'1ノ人'-‐'`y'/::::, i| ,!, |`iiイ:::::::::|
,〃7,‐/ { ´_,-'´ ,,‐!、=,/.〃::::i i|kハ / ,ヾ、::::::|.|! か
,ッ'、_〃'f /゙-<´ r〃 〃 /イ::::,!ッ'/ ', / / |ト、:|:リ ・
rir' 〃,y'、久_,.rヽ/〃 川/iケir'〃/ ,-'水´ / 〃 \ ・
f::}'ー'〃_i| /::::f|::::', .〃 r/if |||ir' f| レ' r'o | .〃-、 〃 "i ・
,);'ーッ゙-. レ:::::/_|::::::',_,〃=_、!!|| !i/ ||:,ri !o ∨/_)_〃 |
んなこたぁない
Cプログラマが保守性の悪いコードばかり書くということを 体現しているスレだな
C言語に限らず、他人の書いたコードで保守性のいいコードなんて見たことない。
>>545 おお、あなたカワイソウなひと!
わたしのコード見なさい。
無能が80%のこの業界。汚いコードにしか出会えないのは可愛そうだ。
良いコードを見て目からウロコがおちることも楽しみなひとつ 良し悪しはその人の実力でまちまちなところもあるけど。
うpすればいいだけの話
漏れも無いけど心配すんな
見ろよ青い空白い雲
ザーメン
555 :
デフォルトの名無しさん :05/02/06 03:50:42
CあるいはC++を主体にコードを書いて ライブラリだけFortranのサブルーチンを使ったりすることってできますか? FortranのオブジェクトファイルとCのオブジェクトファイルを リンクしている簡単なサンプルを紹介しているページを探しているんですけど 見つかりません。どなたか教えていただけないでしょうか?
556 :
デフォルトの名無しさん :05/02/06 05:21:16
> ライブラリだけFortranのサブルーチンを使ったりすることってできますか できますが、最近は大概の有名なライブラリーもCで書き直されているものが多いですね。 > FortranのオブジェクトファイルとCのオブジェクトファイルを > リンクしている簡単なサンプルを紹介しているページを探しているんですけど それはコンパイラー依存。どのCとどのFortranを使うかによる。 中には相性が悪い物もあるし。
557 :
デフォルトの名無しさん :05/02/06 05:26:43
>> 501 > ショートサーキットのルールとコンパイラの最適化を見越すと こいつアホ。ショートサーキットというか「前から順番に評価して、条件を満たさなくなったら それより後ろは評価しない」が意味をもつのは、副作用のある式だけだ(関数呼び出しとか)。 だから「||」がそれをやらなきゃいけない運命の演算子だからといって、 副作用がない式ばかりのときには関係ないので、それが原因で遅くなることはあり得ない。 それぐらい考えなくてもわかるだろ ぼけ
最近のパイプラインの深いプロセッサでは 分岐命令が4つの場合と1つの場合では速度が全然変わる こんなことすら知らない化石頭のじじいはさっさと消えろボケ
>>557 そうかあ? ショートサーキットが入るって事は分岐が入るってことで、
昨今の投機実行やら分岐予測をやらかすプロセッサなら、十分性能に影響ありだぞ。
パイプラインがストールする可能性を考慮したら一本道の|と分岐ありの||を
比べることとは沈丁花にも三分の利だぞ。
予想される回答 「こいつぼけ。たかが4個の分岐で性能の大勢に影響するわけないだろあほ」 かな。
561 :
デフォルトの名無しさん :05/02/06 08:53:44
やくざ映画みたばっかりのDQN工房みたいに 人のスタイルを真似しているような奴だからな
>>560 数日間鳴りを潜めて、なに食わぬ顔で戻ってくるんじゃないの
こいつぼけ。たかが4個の分岐で性能の大勢に影響するわけないだろあほ
564 :
デフォルトの名無しさん :05/02/06 10:43:32
大勢に影響するかどうかを大勢を見ずに言うアフォハケーン
二つ以上の文をマクロにするとき do {} while(0) で囲うのが 普通と思っていたんですが、これって実は普通じゃないですか? #define (a,b,c) \ do { \ foo(a,b); \ bar(b,c); \ } while(0)
#define (a,b,c) \ { \ foo(a,b); \ bar(b,c); \ } で駄目な理由は?
>>566 すみません、マクロに名前を付け忘れましたが仮に
#define do_something(a,b,c) とすると、
if (expression)
do_something(a,b,c);
else
do_otherthing(a,b,c);
という文を考えたときに do ... while(0) じゃないと
構文エラーになります。{} だけだと
if (expression)
do_something(a,b,c)
else
do_otherthing(a,b,c);
とセミコロンを省略する必要があります。
ああ、こういうのって普通どうでもいいんですかね・・・
568 :
デフォルトの名無しさん :05/02/06 14:01:51
> 最近のパイプラインの深いプロセッサでは > 分岐命令が4つの場合と1つの場合では速度が全然変わる だーかーらー、副作用がない式ばかりなら || でも | でも最適化したら 条件判断は1個だけだといってるだろ ぼけ 逆に副作用がある式なら | にしたって1回じゃすまない
569 :
デフォルトの名無しさん :05/02/06 14:03:33
「どうでもいい」んじゃなくて「常識すぎてだれもいわない」だけ。 こうやって、話題でもないのにうれしそうに出してくるやつは、 よほど「最近知ったばかりでうれしい」馬鹿っていう証拠。
つまりマクロだと認識せずに使わせたいと? マクロである以上それを認識せずに使うとバグが発生する可能性が存在する なら;つけるとダメになるほうが認識しやすいのではないか?
>>570 >マクロである以上それを認識せずに使うとバグが発生する可能性が存在する
>なら;つけるとダメになるほうが認識しやすいのではないか?
>>570 にとっては
isalpha() なんてのも、
「悪い設計」っていう認識なんだろうな。
>>570 コンパイルエラーが起きず、通常通らないような処理だとしてもそう思う?
#やっとく方が無難だよ。
573 :
デフォルトの名無しさん :05/02/06 14:28:15
質問です。 大きなCSVのデータファイル(全て数値(整数のみ)で200MB程度)を すばやく配列に読みこむ方法に関して、教えて下さい。 データファイルをどうにかして、バイナリ化(?)しておいて、読みこめば、 早くなるかな。。。とか考えいるのですが、どんなもんでしょか?
>>573 その大きさだとどうやっても読み込みに時間が掛かる気がするが、
先ずはどうやったらどのくらい時間が掛かるのか調査するところから始めるべし。
>>573 >大きなCSVのデータファイル(全て数値(整数のみ)で200MB程度)を
>すばやく配列に読みこむ方法に関して、教えて下さい。
原理的に、回答は不可能。
しかし、もしもこの質問が
>全て数値(整数のみ)で200MB程度のデータをすばやく読み込みたいのです。
>今はCSV形式を使用しているのですが、これをバイナリ化(?)しておいて、
>読みこめば、速くなるでしょうか?
という文章だったならば、回答の余地があるけど。
>>567 #define do_something(a,b,c) \
({ \
foo(a,b); \
bar(b,c); \
})
でどう?
578 :
デフォルトの名無しさん :05/02/06 15:39:30
> マクロである以上それを認識せずに使うとバグが発生する可能性が存在する いいえ「するものもある」だけ。もちろん副作用などでないように書くのが当然。
579 :
デフォルトの名無しさん :05/02/06 15:42:04
>>salpha() なんてのも、 >>「悪い設計」っていう認識なんだろうな。 いいや。なんら問題ない。同じascii用ならば、 isalpha(*p++)ってやっても問題ないし。(中に条件文かいてるような間抜けなマクロはない!)
>>579 >中に条件文かいてるような間抜けなマクロはない!
getchar() も間抜け?
581 :
デフォルトの名無しさん :05/02/06 15:48:35
getcharは引数ないのでOK。 副作用があるやつマクロってのは、引数が2回以上展開されるようなやつだ。
0x0080,0x0010,という2進数が入ったtxtファイルから16進読み込み する方法はありますか?
0,1,8の三つの数使っといて二進数?
>>566 のやつは思いっきりバグの原因になる可能性があるわけだが…
586 :
デフォルトの名無しさん :05/02/06 16:21:07
C言語で、専用のウィンドウ(DOS窓でない)で起動するRPGを作りたいのですが、C言語を覚えた後は何をすればいいのでしょうか?
587 :
デフォルトの名無しさん :05/02/06 16:22:07
>>583 そりゃマクロ名ないからねえ。
コンパイルさえとおらん
588 :
デフォルトの名無しさん :05/02/06 16:22:53
> 今はCSV形式を使用しているのですが、これをバイナリ化(?)しておいて、 こいつまぬけ
>>586 専用のウィンドウ(DOS窓でない)で起動するRPGを作ると
よいと思う。
専用のウィンドウで起動するということは、エクスプローラーで起動できないようにするってこと?
なんかイタいスレ上げないでください
593 :
デフォルトの名無しさん :05/02/06 17:30:36
>>586 DOS窓が云々と言うあたりからゲイツ環境っぽいが
もしそうなら Win32 API を憶えればいい
ウインドウを表示するだけで 100 行くらい書くが
めげないでがんばれ
既にあるファイルをコンソールアプリへドラッグ&ドロップで開いた後に 新しく別名でファイルを作成させたいのですが、 # include <stdio.h> int main (int argc, char *argv[]) { FILE *fp; fp = fopen (argv[1], "r"); // ここには開いたファイルから文字列を取得して加工する処理が入ります fclose (fp); fp = fopen ("newfile.txt", "w"); fputs ("文字列", fp); fclose (fp); return 0; } このようにすると コマンドプロンプトから引数を付けてやれば「newfile.txt」は作成してくれるのですが、 でも何故かドラッグ&ドロップでは何の反応も無いんです。 どうにかドラッグ&ドロップでファイルを開き、 新規ファイルを作成する方法は無いのでしょうか? 環境は WinXP VC++ 6.0 です。
治んないです
スレ違いだと
>>596 ええ・・・・、そうなんですか。
Windowsアプリ覚えようかな・・
>>594 # include <stdio.h>
int main (int argc, char *argv[]) {
int cc;
printf("%s\n%s\n%s\n",argv[0],argv[1],"newfile.txt");
cc=getchar();
return 0;
}
D&Dで起動させてみ。
602 :
デフォルトの名無しさん :05/02/06 18:07:47
あるプログラムをコンパイルしたら xaaview.c:139: warning: assignment discards qualifiers from pointer target type といわれました、 そして少し改変してみたのですが xaaview.c:139: warning: assignment makes integer from pointer without a cast といわれます 具体的に、何がわるいのでしょうか?
>>602 具体的なソースなしに”具体的な回答”は出来ない。
あたま
char *s, *i; *i = "hoge"; s = i; ソースは違いますが具体的にはこのようなかんじです s = i; が139行目にあたります
*i="hoge"; これなんだ?
すいません i = "hoge"; です
全然具体的でないし、コンパイラは何を使ってるか書かないと C言語初心者の俺には全然わからんわぁ。 char *s; int i; s = "hoge"; i=s; こんな感じなコードを書いてるんじゃないかと推測。 ではお出かけ。
その部分だけでいいから実際のソース載せてみてよ。無理なの?
具体的に何が悪いかは、ソースを見ないとなんとも言えない その変数を宣言した部分とエラーが出る行の前後3行くらいだしてみ?
611 :
デフォルトの名無しさん :05/02/06 19:19:27
NDAで晒せないとか・・・
612 :
デフォルトの名無しさん :05/02/06 19:27:05
前者は const char *に char *を代入したりすると出るし、 後者は int に char *を渡したりすると出る
晒せないなら2chできくな間抜け
以下は実際のソースからの抜粋です 何度もすいません static void init_display(const char *gridarg) { char *s; if (grid == 1){ s = gridarg; while(c = *s++) { if(c<'0' || c>'9') { if (c == 'x'){ gridx = r; r = 0; } } } } } int main(const int argc, char **argv) { char *gridarg; while( getopt(argc, argv, "wz:") != -1 ){ switch( optopt ){ case 'z' : grid = 1; gridarg = optarg; break; } } このようなかんじです
すいません 抜きすぎました main のなかで init_display(gridarg); と言うかたちで呼び出しています 改行がおおいと言われたので閉括弧をすべてくっつけました すいません
他にもかなり型宣言が抜けたりしています 何か他にもありましたら指摘お願いいたします
行ナンバーを表示するエディタを使いましょう
>>614 > 以下は実際のソースからの抜粋です
> 何度もすいません
>
> static void init_display(const char *gridarg) {
> char *s;
> if (grid == 1){
> s = gridarg;
char * に consht char * を代入するな。
s の宣言を const char *s にしろ。
上記のとうり s = gridarg; の行が139行目です 138行目と、140-144行目はソースのままです
>>618 ありがとうございます
全くその通ですね・・・
だから型が違うっていわれてたのか・・・
すいません、初めからソースを書けばいいものを失礼しました
でできた・・! 新しく作成させるファイルをフルパスで指定したら言うこと聞いてくれました。。。 fp = fopen ("e:\\fullpath\\newfile.txt", "w"); DOS画面から元ファイルを引数にして起動させる時にはフルパスいらないのに、 D&Dさせるときはフルパスじゃないとだめなんて、不思議。 朝から悩んで12時間疲れたぁ
>>621 実は今までもファイルは作成されていたけど、
どこか別のディレクトリに作成されていたから気付かなかっただけじゃないか?
623 :
デフォルトの名無しさん :05/02/06 20:59:42
ちょっとスレ違いかもしれないけど、おしえてください。 int main( void ) { int a ; cout << "数字を入れる" ; scanf( "%d",&a ) ; cout << "演算結果:" << a ; getchar() ; return 0 ; } これって、なんでscanf から実行されちゃうんですか?
624 :
デフォルトの名無しさん :05/02/06 21:03:44
これはよい ゚・ 。 ・。 チャーハン! 。・゚・⌒) チャーハン! _ _ o━ヽニニフ )) (゚∀゚ )彡。・゚。・⌒) ⊂ o━ヽニニフ ) ( ⌒) ≡=− し'c ≡=− スレですね
>>621 カレントディレクトリについて勉強してきな
>>623 ちゃんと仕様通り、順番通りに実行されている
表示を思った順番で出したかったらf
C:\Documents and Settings\既定 あたりに newfile.txt が出来てそう
ここのスレとか見てると、「仕様どおり」という言葉をよく目にしますが、 それはどこを見て「仕様どおり」と分かるのですか? 何かの本でしょうか? だとしたら、自分もそれ欲しいです。 もしよろしければ、本のタイトル教えてください。 正式名称は 『ANSI C 規格書』 とかでしょうか? 馬鹿にされそうですが、よろしくです。
>>627 ひゃー!そこに見つけた。たっくさんありますがぁくぁwせdrftgyふじk
E:\しか検索してなかった。あぁなんてバカ
>>568 へえ。副作用がなければ||は最適化で条件判断一個なんだ。
void foo(int a, int b, int c, intd) {
if (a || b || c || d) {
/* do something */
}
}
このifは副作用ないんだけど、最適化で条件判断一個になるんだ…
なるんだよね?
天に臓物を捧げるようなデマ飛ばしちゃいかんよ、チミ。
>>630 >なるんだよね?
もしかしたら
if (a || b || c || d)
を
if (((a!=0)<<3) | ((b!=0)<<2) | ((c!=0)<<=1) | (d!=0))
にコード変換してくれるかも。
副作用さえ起こらなければ、
別に「評価の中断」をしようがしまいが
どちらでもかまわない筈。
>>631 おー、これは私の修行が全く足りていませんでした。
失礼いたしました。
633 :
デフォルトの名無しさん :05/02/06 21:57:07
処理系依存
ソースを見ていたら if (image->format != ZPixmap) など、 -> とあるのですが これはどういったいみなのでしょうか?
>>634 (*image).format
と同じ
つまり構造体のポインタを用いてメンバにアクセスする場合に用いる
ポインタからのメンバ変数の呼び出し
637 :
デフォルトの名無しさん :05/02/06 22:13:28
→
このスレで最適化の話で議論したり結論を求めたりするキモい人がいるんですね。
640 :
デフォルトの名無しさん :05/02/06 22:36:37
ウホかと思ったら違ったw
ワクワク
>>630-632 規格の文面は知らないけど
if (a || b || c || d)
の場合、aの条件が成立していたら、
b以降は、「評価してはいけない」んじゃないかな。
これはもちろん、関数呼び出しや変数の増減以外の、
単純な「変数の値の評価」も含めて。
というのは、極端な話、メモリマップドIOの領域だったら
読み出すだけで動作が変わるわけだし。
volatileを付けても「変数の値が前回と違うかもしれないから毎回読み出す」だけで
「最適化のためにメモリから読み出す」という動作(がもしあるならば)には影響しないはず。
実際、件のif (||)を最適化して分岐を減らすコンパイラというものを
俺は見たことはない。
(脳内コンパイラや脳内標準規格を持っている人のことは知らないが)
規格には
Unlike the bitwise binary & operator, the && operator guarantees
left-to-right evaluation; there is a sequence point after the evaluation
of the first operand. If the first operand compares equal to 0, the second
operand is not evaluated.
とある。特記されている内容もないし、
>>644 が正解では?
では今度は「評価」の定義が問題となるな。 まさに形而上学の論争だね。 「"評価" は実在するか?」 検索よろ。
「定義」とは? 「問題」とは? 「形而上学」とは? 「論争」とは? 「実在」とは?
649 :
デフォルトの名無しさん :05/02/07 09:01:30
「とは」とは?
650 :
デフォルトの名無しさん :05/02/07 09:02:12
千早の本名だ!
ム板の雑談スレはここですか?
そうです
>>568 自体が、
>>557 に矛盾しているな。
>それが原因で遅くなることはあり得ない。
と書きながら、
>最適化したら
と、暗にそのままでは遅いと認めてるし。
で、結局
>>501 は、
「極度に速度が要求される部分」に「ちゃんとコメントを付けて」
使用するのはアリ、でFA?
>>651 HSPスレにお行きなさい。みなが勇者を待ち望んでおります。
655 :
デフォルトの名無しさん :05/02/07 10:42:03
アセンブリ言語知らずにスピードを語るな。
いかにもバカっぽい書き込みでよろしい
現場の人間は「アセンブリ言語」なんて言わない
現場=低賃金労働者に聞こえる
現場の人間はアセンブラ言語。学生はアセンブル言語。
プッ 使ったこと無いくせに
プロはアッセンブラーに決まってんだろ
662 :
デフォルトの名無しさん :05/02/07 19:26:11
0.45以上1以下の実数の乱数を発生させるにはどうしたらいいですが? ググッても出てこなかったので。
日本人が片仮名語を使うな
0以上1未満の乱数をおよそ0.45以上1以下の実数の乱数として使う
>>662 0.00〜1.00までとかの乱数を、0.45〜1.00の範囲に変換すればいい
(0〜100を45〜100にするのと同じ要領)
666 :
デフォルトの名無しさん :05/02/07 19:35:36
667 :
デフォルトの名無しさん :05/02/07 19:35:44
>>665 そのargorithmが分からないから質問しているんですが
はぁ?
669 :
デフォルトの名無しさん :05/02/07 19:53:19
そんな事はどうでもいい あんたはわかったのかね、わからなかったのかね
671 :
デフォルトの名無しさん :05/02/07 19:59:29
>>666 値域0.0-1.0から値域0.45-1.0への変換
if (a == 0) b = .45;
if (a == 0.1) b = .45 + .055
if (a == 0.2) b = .45 + .11
以下同様に
if (a == 1) b = 1;
>>662 aが0.0〜1.0の範囲の乱数として、
a * (1.0-0.45) + 0.45
>>666 もう少し
1.0〜100の間の乱数を作る
2.0〜100を0〜55に変換(100→55になるようにすればOK)
3.0〜55を45〜100に変換
(・3・)
while (*expression) { if (isdigit(*expression) { m = strtol(expression, &expression); push(m); } else { switch (*expression++) { case '+': m = strtol(expression, &expression); push(m);break; case '-': m = -(strtol(expression, &expression)); push(m);break; case '*': m = strtol(expression, &expression); pop(&n); m = n * m; push(m);break; 他の演算子たち } スタックの中身を合計 これで累乗を pop(&n); if (n>0) { n = -n; m = -(pow(n, m)); } else pow(n, m); とすると式の始めがマイナスの記号の時正しくない結果になってしまいます。 なにかいい方法があれば教えてください。
(rand()%(100-45)+45)/100.0
アフォ
680 :
デフォルトの名無しさん :05/02/07 21:42:55
>>677 - の - で + にしたいのか、
絶対値部分を取り出して符号反転する気なのか、
どっちだ?
ぬるぽ
>>681 いまどきそんな事を言う人間いたんだ
恥ずかしくない?人として
うん
がるぽ
数年ぶりにC/C++触った。 動的2次元配列って、どんなんだっけ? char**pp; int x,y; int xx=9,yy=9; pp=new char*[xx]; for(x=0;x<xx;x++){ pp[x]=new char[yy]; for(y=0;y<yy;y++){ pp[x][y]=x*y; } } for(x=0;x<xx;x++){ delete [] pp[x]; } delete [] pp; こんな感じでコンパイル通っちゃったけど、だいじょうぶ?
689 :
デフォルトの名無しさん :05/02/07 22:50:08
区別ができてねえ上に構造化も OOP もカス以下だな
>688 ごめんよ。氏ぬほど頑張って思い出すよ。 >689 すまんね。リハビリ程度にmainにベタ書きしてもた。 もっと練ってから来るよ。
数年でここまで忘れられるもんじゃないだろ
>>680 nが-だったら絶対値を-符号にしてpush
+だったら絶対値をpushという風に考えてました。
上記のソースでは0-2^2だと正しい答えになりますが
-2^2だと-4になってしまうので困ってたんですが
-が式の先頭だったら単項の-として扱えば計算できますね。
簡単なことでした。ありがとうございまた。
693 :
デフォルトの名無しさん :05/02/08 00:56:06
> 改行がおおいと言われたので閉括弧をすべてくっつけました そのくせ括弧の内側をあけるぼけ。
誤爆?
695 :
デフォルトの名無しさん :05/02/08 01:00:13
> そのargorithmが分からないから質問しているんですが やーい > r
誤爆?
697 :
デフォルトの名無しさん :05/02/08 01:03:19
池沼?
時代の流れについていけない人が居る模様
700
プログラミング系の講座サイトをまわってC言語を学んでいる者ですが、 ほとんどのサイトで 『グローバル変数は有害である。使うべきではない』 と言われていますが、プロの方たちはグローバル変数をひとつも使わないのでしょうか? もし使うのなら、どういった基準で使うのでしょうか? 参考> チームではなく個人でプログラム
コード量にもよるけれども、個人でやる分にはそこまで神経質に なる必要はないんじゃないか?
704 :
デフォルトの名無しさん :05/02/08 01:55:57
>>701 グローバル変数ってどの関数からでも参照できちゃうでしょ?
だから、収集つかないの。どの関数からその変数が変更されるかっていうのを把握する
のは、とても難しいのね。
それで、グローバル変数はなるべく使わないということ。
使用するシーンの一例として、ごく小規模なプログラムで、画像処理用のバッファなど
をグローバル変数として宣言して使うことはあるかもしれません。
そういう単一の、共有するリソースならばグローバル変数として扱っても良いでしょう。
C++が使えるなら、グローバル変数を使うシーンは全くありません。
706 :
デフォルトの名無しさん :05/02/08 02:05:56
まともなデバッガのない貧弱な開発環境を使ってます。 printf()をあちこちに埋め込むようなデバッグをしているのだが、 全部の関数の開始時とリターン時にprintfを書くのが面倒でつ。 なんか良い方法ないかな? 全部の関数のin,out時にprintfできる便利な方法があったら 教えて下さいです。
プリプロセッサでやりゃいいじゃん
708 :
デフォルトの名無しさん :05/02/08 02:07:56
709 :
デフォルトの名無しさん :05/02/08 02:13:17
>>701 グローバル変数は常にメモリ領域を確保してるからメモリの無駄遣いになりやすい
711 :
デフォルトの名無しさん :05/02/08 02:17:31
笑い事じゃねえだろ
「独習Cに書いてあったw 」←受け売りを平然と書き込む自分に対する嘲笑
たくさんの方にレスしていただいてどうもです。
自身の力不足のため場面によってはグローバル変数以外の手段を見出せないことがあるのですが、
>グローバル変数を使うシーンは全くありません。(
>>705 さん)
と、グローバル変数に代わる手段があるそうなので、
これからはそういったものを勉強し、役立てたいと思います。
715 :
デフォルトの名無しさん :05/02/08 02:29:45
いや、グローバル変数バリバリ使っていいって
716 :
デフォルトの名無しさん :05/02/08 02:31:14
>>701 >と言われていますが、プロの方たちはグローバル変数をひとつも使わないのでしょうか?
翻訳単位をまたぐようなグローバル変数は使わない。
>もし使うのなら、どういった基準で使うのでしょうか?
小規模な使い捨ての個人のプログラムに使う。
他人の、結果がグローバル変数渡しの関数を使わなければならないときに渋々使う。
グローバル変数がプロセスやタスクの終了まで定数と保障されているなら使う。
717 :
デフォルトの名無しさん :05/02/08 02:37:21
話は変わるんだけどストリームってどうやって理解したらいいの? 参考書みると「C言語の定義でいう「ファイル」同士の差異を吸収してくれるもの」とかいう訳のわからない 説明が載ってるんだけど要するににBIOS=ストリームってこと?
Basic Input Output Stream
城達也
アイストリーム
>>718 サンキュ、BIOSってその略だったんだ・・・・^^;
723 :
デフォルトの名無しさん :05/02/08 02:50:48
Basic Input Output System
チッ!
725 :
デフォルトの名無しさん :05/02/08 06:52:01
Busu Inkin Omanko Seeeseee
>>717 「どんなに凝った料理を食べても、
結局、体から出てくる時は皆同じ」って事。
消化不良のときは違うぞ
>>727 そうだ、お前のうんちの中のとうもろこしの残骸を食べてやろう。
730 :
デフォルトの名無しさん :05/02/08 10:02:23
いえ、それはわたしがもらいます。 あなたは残りの部分を
731 :
デフォルトの名無しさん :05/02/08 10:25:45
ようやく俺俺が埋まったか。
で、ここがネタスレに?
もともと寝たスレみたいなもんじゃんか
734 :
デフォルトの名無しさん :05/02/08 10:53:48
vectorはC++でしか使えないんでしょうか? Cで使おうとしたんだけど動いてくれない・・・
作ればいい。
736 :
デフォルトの名無しさん :05/02/08 11:14:24
ガウス関数を乱数として用いたいのですが、 #include<math.h> int k; float a; double f[100]; for(k=1;K<100;k++){ f[k]=exp(-k*k/(s*s)); } とおいたのですが、f[k]は常に1になってしまい、乱数を発生しません。 どこが悪いのでしょうか??
適当に打ち込まずに、正確にコピペしる
738 :
デフォルトの名無しさん :05/02/08 11:21:34
Visual C++を使っています。 MFCを使わないでWin32でプログラムしてます。 画像の保存の仕方がよく分からないのですが手軽にできる方法はないでしょうか? 公開するのではなく自分で使うだけなので動けば何でもいいです。
>>705 >グローバル変数ってどの関数からでも参照できちゃうでしょ?
>だから、収集つかないの。
収集がつかなくなるような使い方、設計の方が悪いのであって、
グローバル変数自体が悪いわけではない。
そもそも、適切な設計をすれば、
グローバル変数を多用するような事にはまずならない。
自分たちの非をグローバル変数のせいにするな!
>>740 グローバル変数使わなければ自動的に回避できる問題が多いのに、
わざわざグローバル変数使ってまで注意深く設計する意図がわかりません。
グローバル変数に強い思い入れのある信者もアンチも ネットの下らない議論で時間を浪費するので生産性が低いのは羞恥の事実。
普通に作ればグローバル変数なんてそうそう使わない 昔はBASIC出身者が濫用してたらしいが それにグローバル変数使うと後から読む際読みにくくなる 自分の場合使わない一番の理由は名前考えるの面倒だからなんだけどね
さぞかし素敵なローカル変数名なんでしょうなぁ。 #iとかjとかaとかbとか? プ
flagという名前のグローバル変数よりはましかと。
昔見たコードでループに使う変数がグローバルになってた事がある。
ローカル変数でも、C言語だと最初に宣言しないといけないので、煩雑になる(C99は良いけど) 一応、互換性考えて無意味に最初に宣言する事が多いけど、変数が増えてくるとややこしい (ループ内でしか使わないようなのもあるし)
749 :
デフォルトの名無しさん :05/02/08 17:22:25
1 2 3 4 5 1 2 5 6 7 3 5 6 6 6 このようなデータのファイルを配列に入れたいのですが、うまくできません。 for(i=0;i<Num;i++){ for(j=0;j<point;j){ fscanf(fp3,"%d ",&hop[i][j]); } } このようなプログラムではだめなのでしょうか?
750 :
名無しさん@Vim%Chalice :05/02/08 17:48:39
gdbserverでリモートデバッグしたことありますか?
>>748 俺は C99 で書いちゃう。もしくは
{
int i;
for (...) {
...
}
}
…かな。
>>749 #define ROWS 5
#define COLS 3
for (i = 0 ; i < ROWS ; ++i) {
for (j = 0 ; j < COLS ; ++j) {
fscanf(fp3, "%d", &hop[i][j]);
}
}
j が増えてねーぞ。
752 :
デフォルトの名無しさん :05/02/08 18:25:05
グローバル変数なんて使ってると、構造化プログラミングに反するぞ。 関数の再利用がし難くなる。
再利用しないもん、使い捨てだもん。 新しく作ったほうが安いもん。
MSが作ったものを再利用させてもらってるんだけどね
755 :
デフォルトの名無しさん :05/02/08 19:47:54
ソース八行目です if ((y%4 == 0 && y%100 != 0 )||y%400 == 0) { Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland sample3.c: エラー E2206 sample3.c 8: 不正な文字 '|' (0x8162)(関数 main ) エラー E2206 sample3.c 8: 不正な文字 '|' (0x8162)(関数 main ) エラー E2377 sample3.c 8: If文に ) がない(関数 main ) と表示されて実行できません、何故か何処が誤ってるか解らないんです 何回か再試行していますが、こう表示されてしまいます。 間違っている所を、ご示唆お願い致します。
半角にしろ
||の間にスペースがあるからじゃないの
758 :
デフォルトの名無しさん :05/02/08 19:54:07
|| これが文字パレットからしか出せないんです・・・ どうやれば出せるのでしょうか?すみませんorz あと If文に ) がない と表示されますが、( は入れています 此は半角でないからでしょうか?
恐らく不正文字のエラーによって、if文が終了したものと見なされてエラーになったのだろう。 前者を修正しても消えなかったら再検討で。
コピペしたら ||
761 :
デフォルトの名無しさん :05/02/08 19:58:27
実行できました!!! ありがとうです!
>>758 ||
↑をコピペしてどうぞ
俺日本語キーボードじゃないんで出し方はシラネ
エラーはひとつの文法ミスだけで連鎖的に何個も出てきたりするから、 とりあえずは一番上のエラーから片付けたほうがいいよ。
764 :
デフォルトの名無しさん :05/02/08 20:01:27
#include<stdio.h> #include<stdlib.h> main() { int u,*h; for(u=60;u<=100;u=u+10) { h=(int *)malloc(sizeof(int)); h=&u; printf("%3d %10p\n",*h,h); } } このプログラムは合っていますか? (問題にはポインタ変数のみを用いて表示すること、とあるんですが…。
765 :
デフォルトの名無しさん :05/02/08 20:08:18
もう一つ質問で、すみませんが #include <stdio.h> main() {int y; for(y = 1900; y <= 2000; y++) {if ((y%4 == 0 && y%100 != 0 )||y%400 == 0) {printf("%d\n", y); } } return 0; } これのソースで 何故 forの前には { が無いのに ifの前には { があるのでしょうか? あとC言語に於ける { の意味が解らないんですが どういう意味なんでしょうか?本やググッテも意味が一向に出てきません ご教授戴けたら幸いです。
768 :
デフォルトの名無しさん :05/02/08 20:11:18
>>705 void sure_chigai_sine(std::ostream& shared = std::cout)
{
shared << "koitsu boke" << std::endl;
}
規模の小ささなんぞどうねじ曲げると
画像処理用のバッファを外部変数にする動機になるんだよ
おおかた「外部変数じゃなきゃやだやだじたばた」系の
非論理的なバイアスフィルタでも入ってるんじゃねえのかw3
>>764 main() 内に return 文がない。
>>768 C++ はスレ違い。お前もイッテヨシ。
>>764 目的が分からないのに合ってるかどうか分かるかよ、ボケ。
あと u = u + 10 じゃなくて、+= 使ってくれ。
>>765 > これのソースで 何故 forの前には { が無いのに ifの前には { があるのでしょうか?
マジレスすると入門書をキチンと理解してください。
イチから読み直せ。書いてねーわけねー。
772 :
デフォルトの名無しさん :05/02/08 20:16:29
773 :
764 :05/02/08 20:21:51
#include <stdio.h> #include <stdlib.h> main(){ int v,l,*t,*p; printf("%p\n",&l); v=1; t=&v; printf("%p\n",t); printf("%d\n",*t); p=(int *)malloc(sizeof(int)); l=2; p=&l; printf("%p\n",p); printf("%d\n",*p); } 整数型のメモリの動的確保っていうのはする必要がないのでしょうか? #include <stdio.h> #include <stdlib.h> main(){ int l,*p; l=4; printf("%p\n",p); p=(int *)malloc(sizeof(int)); *p=l; printf("%p\n",p); printf("%d\n",*p); } こうすると最初のprintfのアドレスは表示されないのですが。
>>765 for(y = 1900; y <= 2000; y++)
1) {if ((y%4 == 0 && y%100 != 0 )||y%400 == 0)
2) {printf("%d\n", y);
3) }
4) }
1)の { はfor文の始まり、4)の } はfor分の終わり。
つまり1から4までが、forの条件の下に繰り返されるということ。
2)の { はif文の始まり、3)の } はif文の終わり。
つまりifの条件が合えば2から3までが実行されるということ。
ちなみに { } の中が1つの文だけの場合、 { } はいらない。
いちおう丁寧に説明したつもりだけど、これは直感的に理解することだよ。
776 :
765 :05/02/08 20:31:23
>>771 すんみません、再度入門書を読み直してみます
>>774 ありがとうございます!! 参考にさせて戴きます。
ありがとうございました。
777 :
デフォルトの名無しさん :05/02/08 20:36:38
u =+ 10のほうがいいみたい 加算して代入
最近バカが多いな どうしようもない学生が増えたのか、 それとも一人が複数に見えるのか…
>加算して代入 ハァ?「足し込む」って言えやボケ
780 :
765 :05/02/08 20:41:06
>>774 もう一個そこで疑問に残る事があるんですが
何故、{プログラム〜〜}
例えば
{if ((y%4 == 0 && y%100 != 0 )||y%400 == 0)}
{printf("%d\n", y); }
このように{}閉じで終わらせるとエラーが出て、いけないんでしょうか?
で、{ プログラム〜〜〜
{プログラム〜〜
}
}
みたいに最後に{ を付けた分だけ、最後に括らなければいけないんでしょうか?
これが毎回、とても疑問に思います。
782 :
765 :05/02/08 20:49:30
はい・・・
>>780 サンプルを色々見てると分かると思うよ。
直感的に理解するところだから、説明がしづらい。
それに単なる文法の規則だと思うから、覚えてもらうしかない。
>>764 > h=(int *)malloc(sizeof(int));
この行は要らない。
785 :
デフォルトの名無しさん :05/02/08 20:57:57
再利用性を重視し、グローバル変数を使わずに設計した結果、 納期には間に合わず、かといって引数だらけで再利用する機会も 無いコードの残骸が残っただけであった・・・
786 :
デフォルトの名無しさん :05/02/08 20:58:11
>>783 そうなんですか。直感ですね。
やっぱしC言語は難しいです。
これからも諦めず、がんばります。
ありがとうでした。
788 :
デフォルトの名無しさん :05/02/08 21:01:38
そもそも再利用性重視ならCなんて低脳言語使うかよ
>>784 ありがとうございます。
#include <stdio.h>
#include <stdlib.h>
main(){
int *p;
printf("%p\n",p);
p=(int *)malloc(sizeof(int));
printf("%p\n",p);
}
これの実行結果が下でした
CCCCCCCC
00780EC0
知識の再利用で最新情報の学習量が0に!
>>787 オマエモナー、
グローバル毛嫌いする理由分からん。
OSのデータにアクセスできなったら困るわ
>グローバル毛嫌いする理由分からん。 >OSのデータにアクセスできなったら困るわ 真性のバカですか? >どういうわけか無能なプログラマほどグローバル変数を偏愛し,有能な人ほど避けるものです。 どうやらこれは正しかったようだ
>>792 がいじめるー、でもがんばる。
よく聞けよ。
世界はグローバルな変数で満ち溢れてるんだよ、
(・∀・)ヘイヘーイ!!
>本人の勘違い(英語で書いたらカッコいい。 >これからは国際化時代でグローバルスタンダードだもんね。みたいな),
全部英語にしちゃえばいいのに。なんでそうしないんだろう。 きっとその方が楽だよ。アメリカもイギリスも英語使っているし、後進国である日本 が白人様のご英知を存分にいただくには英語を標準語にするしかない。
>>797 うちの近所にいる白人様は「グラッチェグラッチェ、ハッハッハッ」と言ってますが、
どう扱えばいいですか?
803 :
デフォルトの名無しさん :05/02/08 22:00:53
嫌中厨を煽っていて出遅れた。
>706 C99ならいいんだけどなぁ
#include<stdio.h> #include<stdlib.h> #include<time.h> main(){ int b,c[6]; srand(time(0)); for(b=0;b<6;b++) { c[b]=rand()%(43)+1; printf("%d\n",c[b]); } 上のランダムの関数について質問なのですが、 「time()は”1970年1月1日から何秒たったか”という数を返すコマンド つまり経過時間によって返す値が変わってくる」と説明があったのですが、 上の場合1〜43の数字からランダムに数字が選択されて出力されると思うのですが、 (数字がダブルこともあるが、きちんとシャッフルされている) どれくらいシャッフルされて数字が選択されるのでしょうか?
Cの規定に「どのくらいランダムでないといけない」ってのあったっけ?
去年のCマガに、BCCとかVCでrandの実装の違いを比較してたな 立ち読みだからあんまり覚えてないけど
>>805 関数のことをコマンドってゆーな
っつうのはいいとして、rand()%43 の乱雑さは信用ならないと思え。
使うなら上位ビットの方がまし。
>>810 > rand()%43 の乱雑さは信用ならない
どこでそう決められてるの?
>>810 それ昔の実装の話か?
まあ気になるならデヴかMT使っとけ
>>810 標準Cにおいてrandの実装が上位ビットがマシという根拠は何?
ランダムはカルノーに聞け、 奏すれば平均化される、ぷ
815 :
デフォルトの名無しさん :05/02/08 23:52:58
1, 2, 3, .... って並びでも充分ランダムだよ?
大学当時から優秀な奴だったよ。整数論やってたんだけど。
#define MACRO 100 #define MACRO( a ) (100*a) 当然だが、こうやると2重定義になる。 でもどうしても同じシンボル名で関数型マクロとデータ型マクロを 混在使用したいのだが、良い方法ないかな?
無い
>>819 これで通る筈。
#define MACR0 100
#define MACRO( a ) (100*a)
ぷりぷりぷろせっさ?
824 :
デフォルトの名無しさん :05/02/09 00:55:13
マインスイーパーのプログラムが書けないので教えてください。
>>824 マインスイーパーってなに?
アルゴリズム提示しろそうすれば、NPでも解が得られるかも
知れない
はじめてのCヽ('A`)ノウンコー
827 :
デフォルトの名無しさん :05/02/09 01:10:05 ID:fXdoQ69J BE:37131089-#
C言語で、指定したディレクトリ内のファイル一覧を得るには どうすればいいですか?
831 :
デフォルトの名無しさん :05/02/09 01:20:40 ID:fXdoQ69J BE:6189326-#
>>829 探したらありました。すみませんでした。
>>827 の様な質問をするヤシは、ファイルシステムがない環境をどう考えているのだろう?
>>832 彼が使っているシステムにファイルシステムがあるから質問しているんだと思うが。
>>832 ふぁイルシステムはいらないけど、でもプログラムの
ロードストアで必要です、ごめんよ。
mallocで確保した領域は必ずfreeしないと駄目なんですか?
そう主張する馬鹿がこの世には存在するというだけ
したいときにすればいい 必ずしなきゃいけないことはない
そうですか。 ありがとうございます。
しないよりはした方が良いな
したほうが良いのは何で?
最後には必ず。 もし癖を付けておかないと、サウンドデバイスを開いた時などもきっと閉じ忘れるよ。
843 :
デフォルトの名無しさん :05/02/09 05:18:19
大きな配列をグローバル変数で宣言すると error C2078: 初期化子の数が多すぎます。 というエラーメッセージが出ます。どうすればいいでしょうか?
>>843 スレ違いではあるんだが…
処理系と定義を記してみよ。おそらくVCだと思うんだが。
845 :
デフォルトの名無しさん :05/02/09 08:45:06
> でもプログラムの ロードストアで必要です いいえ、パッチSWITCHで充分
846 :
デフォルトの名無しさん :05/02/09 08:46:06
> C言語で、指定したディレクトリ内のファイル一覧を得るには opendir system("ls")
>>843 大きい配列は関係ないと思う。
char a[3] = {1,2,3,4};
みたいになっているだろ?
>>843 せっかくエラーメッセージを日本語に翻訳したのになぜ理解できないのか。
he cannot read Janapanese.....
uho! Japanese
851 :
デフォルトの名無しさん :05/02/09 11:50:49
agemasu
omoshiroi
∧_∧ ( ;´∀`) ちんこ勃ってきた。 人 Y / ( ヽ し (_)_)
his man thing gets power
nuts ;-)
;-) ↑これ何?
西洋顔文字90度ひねる
>西洋顔文字90度ひねる 意味ワカラン
.=左目 ,=右目 -=鼻 )=口
確かに顔に見えるけど、一体何が言いたいのか良くワカラン顔だ…
:3ミ スレ違いウザいのだ
864 :
デフォルトの名無しさん :05/02/09 14:46:41
プログラムを組んでいて、出力の値で、nanって出てくるんですが、 これってなんですか?
インド人の主食 うまいな
(ーー;)
>>865 パン屋さんで売っているよね。パン屋さんに普段行かないから、最近知った。
なんだばかやろう
870 :
デフォルトの名無しさん :05/02/10 00:57:53
アジャンタで目撃したことあります > 「これはなんですか?」と質問している客
そーです ナン=ソー でカンガルーになるw
872 :
デフォルトの名無しさん :05/02/10 02:14:06
doubleの配列をがすっとインラインアセンブラのSSE2で処理させる前に、 128bitでアライメントのとれてるメモリを確保したいのですが、 いまいちきれいな手を思いつかないので、 とりあえず、手元の gcc 3.3 + glibc 2.3 な linux たと、 malloc した結果は 64bit 境界ではアライメントあってるらしいという前提のもと、 いまのところ、double 一個分多めにmallocしといて、 if( (long)v % 16 ) v++; とかいうなんだかなーってことやってます。 共用体つかうとか、ビット演算でマスクとアンドとるとか、 すれば何とかなりそうな気はするのですが、 ポインタのサイズを決めうちにしない方法がわからず... Cでアライメントとる定石とかあれば、教えてえろいひと
posix_memalignっつーのがあるらしいよ。 使ったこと無いけど。
p = _aligned_malloc(size, alignment);
アジャンタでナンだけ食べて帰ってきたことあるよ。 家から歩いて3分くらいのところだったからいつも行ってたなあ。
double array[99999999] __attribute__(aligned(16)); とグローバルに確保して自分で管理
専用関数で16バイト余分にmallocして、call元に返すのは16バイトで アライメントしたアドレスとし、そのアドレス-4に実際に捕捉した アドレスを入れる。 解放処理では-4のアドレスから本来の捕捉アドレスを取得してfree。 なんてのをSSE最適化を行っているプログラムでみたよ。
879 :
デフォルトの名無しさん :05/02/10 08:39:38
え? PentiumV Linux gccならdoubleは64bitなのでは?
880 :
デフォルトの名無しさん :05/02/10 15:44:53
大量のテキストデータを処理したいのですが、 普通の配列の宣言ではどれくらいまで確保できるでしょうか? それとも、そのような用途に使うのでれば別の手段を使った方がいいのでしょうか? allocなどは動的メモリの確保で大量確保の手段ではないですよね?
>>880 大量に取るならmalloc使っとけ。OSの許す限界まで取れる。
配列じゃサイズ固定で使いづらいし、もしローカルに取ったら一発でアボーンだぞ。
で、具体的にどのくらいの大きさなんだい?
>>880 普通の配列がどれくらいの要素数まで使えるかというのは環境依存。
少なくともmalloc/callocは普通の配列よりよっぽど多くメモリを確保できる。つまり大量確保にも使う。
mmap使え
>>880 目安として要素数10000以上の配列は宣言するな。
どういう目安だよw
>>891 よくわからん罵倒だな。
経験則はきちんと証明された理論がない限り重要だよ。
>>894 配列はスタックに取られるものじゃないの?
>>893 お前の中では重要かもしれんが
人に教えるのであれば、そんなあいまいな事言うなよ
関数外で宣言すればいいやんけ
stack overflowのエラーがでたらstatic これが俺の経験則
テキストデータだけならC使わん これが俺の経験則
結論はまだだ。
>>880 が何をやりたいか言わない限り結論は出ない
>>900 俺の経験則では複雑な文字列処理をする時はCを使うこともあるな。
例えばコンパイラとか。
「10000以上の配列は宣言するな。」 で結論でてるじゃないか。
どうもありがとうございます。 用途は仲間内で使うデータベースです。 mallocでいこうとおもいます。
>>905 まてや・・・おまえな・・・
もういい。
だったら、MSDEとかPostgreSQLとか使えよ。 自分でデータ管理するのは愚の骨頂
えと、多分既存のデータ管理ソフトでは対応できないと思います。 私がもらった時に既にテキストエディタで頭の悪い独自の記述をされていて それ専用の対応が必要なんです。 データが多いので今回なんとかしようと思いまして。 スレ違いになるのでこれで去りますね。
>>909 そのときは、移行プログラム作るべし、
幾ら変なフォーマットでも規則性はあるだろう?
後が楽だよ。
>>909 ここに質問に来る分際で、頭の悪い記述かどうかを判断できると思っているのか?
はいはい。 じゃあこれから4wayサーバとOracle買ってきますよ。 これで満足ですか? じゃあさよなら。
914 :
C初心者 :05/02/10 16:33:19
すみません、馬鹿な質問です。 ANSI Cで書かれたコマンドラインフリーウェアーをDLLに移植したいと考えているのですが、 これは可能でしょうか?また手順などがありましたらご教授願います。
>>913 うわ、逆ギレ
こういう奴が新卒で入ってくると迷惑だったりするんだよな。
別に・・・昔のOSでも動きますが・・・(´・ω・`)
>>917 あります。VC++7.0でコンパイル出来ます。
>>915 バカ、名前が今までと違うだろ。
釣られるな。
>>918 VCのDLLプロジェクト作ってソースプロジェクトに登録して
ヘッダをDLL用に書き換えてビルドするだけ。
詳細はまずはヘルプ嫁。
>>920 うーん、ヘルプへのポインターをキボンヌ。
>>914 まず、「DLLとは何か?」から勉強し直せ。
馬鹿はともかくものぐさをサポートする気はない
>>915 DB勧めたりして干渉する必要も無いと思うから、ほっとけば良いだけだと思うがな
(親切心だろうが、DB作成で本人が困ってもそれはここで議論する必要ない話だし…C言語スレなんだから)
925 :
デフォルトの名無しさん :05/02/10 19:19:33
すみませんが C言語で引数と出てきますが 意味が解りません、教本をみても意味が載っていません ご示唆、お願い致します。
int hoge(int 引数);
927 :
925 :05/02/10 19:34:21
ありがとうございます。 もし宜しければも、う少し簡単には御説明しては、戴けないでしょうか? 無理を言って、すみません。
929 :
デフォルトの名無しさん :05/02/10 20:05:16
説明する気のないor能力のない馬鹿は無理してレス付けないでいいですよ。
ムカー!!!
931 :
デフォルトの名無しさん :05/02/10 20:10:49
>>930 すぐに平静を失って無駄な発言を書く馬鹿ももレスつけないでいいですよ。
ぷんぷん!!!
ニョガニョガ
そんな事より、次スレを用意していただきたい
何か分かんなくなってきたorz VisualC++.NET(非2002) &MFC でバイナリデータ扱うPGやってるんだけど、 unsigned char a; a=0x80; ←これは出来る b=0x81; ←何故かbには0しか入らない 色々調べていると、どうやら漢字の1バイト目(0x81〜0x9f)だけは何を代入しても0になってしまうみたいで、 コンパイル警告も何も出ないしさっぱり分からん。 何か根本がおかしい気がするんだけど・・・何とかならんのこれ?
937 :
デフォルトの名無しさん :05/02/10 21:44:18
あははーーーーーー
>936 どういう事? どうやったら代入出来るのかキボンヌ
世の中にはbに0x81が入る環境もあるかもね
bの型は?
>940 同じunsigned char。 BYTEにしてもダメだった。
942 :
デフォルトの名無しさん :05/02/10 22:23:44
> 少なくともmalloc/callocは普通の配列よりよっぽど多くメモリを確保できる いいえ。同じぐらいです。
943 :
デフォルトの名無しさん :05/02/10 22:29:26
やーい > VC厨
944 :
デフォルトの名無しさん :05/02/10 22:31:03
> 例えばコンパイラとか。 ふつうlexつかうだろ ぼけ
lexも下請けにCコンパイラ使うんだが… 知ってて言ってるんだろうとは思うんだけど。
新事実発覚 ブレークポイントでウオッチしたら「中身は0」って表示されるが、 TRACEマクロで中身見たらちゃんと81〜9Fが入っとる なんだコレは・・ 一体どっちを信じれば・・・○| ̄|_
最適化切れ
>947 /Od で切ってます・・・orz
>>946 0x81〜0x90はShift JISの2バイト文字の1文字目に当たるから。
ウォッチだと続く2バイト目が無いから0と表示されているんだったはず。
ollyでデバッグしてみりゃわかると思う…
>949 感謝!!!! 悩んで眠れなくなるところでした・・・○| ̄|_ >950 試してみます。dクス。
0x81-0x9fをして「漢字の1バイトめ」と表現するセンスについていけない
誰か次スレ立てて。 漏れホスト規制で立てらんない。
955
956
957
958
0x3BF 切が悪いな