1 :
v(^o^i)d :
03/12/24 05:46
2 :
デフォルトの名無しさん :03/12/24 05:52
3 :
デフォルトの名無しさん :03/12/24 05:57
コンパイラーはどうやって使うんですか? readmi見ても分かりませぬ。。
readme を見れ。
LSI C-86 Ver 3.30 試食版 をWindowsXPで使ってるのですが(cmdでなく、Command.comでlcc~と打ってコンパイル) コンパイルしたexeファイルの実行結果を画面に全て表示するにはどうすればよいですか? Command.comだと実行結果の一部(最後の部分)しか見れません。
実行したいファイルが a.exe なら a.exe > out.txt とか…
a.exe | more
( ’ ⊇’)つ旦
基礎には時間を掛けるべきですか?
>>10 「基礎」といわれても範囲が決まっているわけではないから、
答えづらい。
12 :
デフォルトの名無しさん :03/12/24 19:47
コンパイラって普通は買うもの(オペレーティングシステムのように)なのですか?
密かにIntelのコンパイラを追加しておいた。
可変長引数を持つ関数では、va_start()~va_arg()~va_end()を用いることによって 引数を受け取ることができますね。つまり引数を受け取る側ではva_list型を使って 簡単に引数を受け取れるわけです。 では逆に、これらの関数を*呼び出す側*で必要に応じて引数の数を*動的*に変化させる マクロなり関数はありますか? 要はva_list型に任意の数の引数を積み込み込んで関数を呼び出したいのです。 #大抵の場合、可変長引数の関数を呼び出す側はソースコードとして引数の数が固定 #されているわけで、呼び出す側にとっては固定の引数の関数を呼び出しているのと #同じなわけです。 なんとなくアセンブラの力を借りないと引数をスタックに積めなさそうですが、簡単に できるでしょうか?
配列なり、ハッシュなりに詰め込んで渡せば?
可変個数の引数をもつ関数の呼び出し側が
>>15 の求めているものだと思うんだが、違うのか?
>>15 まずは例となるソースコードを書いてみな。
特に引数を渡す変数を生成しているところ
(別にコンパイラに通らなくてもいいからさ)。
どうやって書くつもり?
>>17 コンパイル時ではなく、実行時に引数の個数を決定したい、ということかと。
…ふつー、配列とその要素数を渡すよなぁ。
>>15 こんな感じ?
int c;
parameter p;<- 引数型の変数 p
for(c=0;c<256;c++)
if(isdisit(c))
push(p,c); <- p に引数 c を1個積む
func(p); <- 可変個の引数を渡す
だったら配列を使えば済むと思うが。
もし、積む数が余りにばらついているのなら、alloca() か・・・
>>20 可変個と言っているくらいだから型が様々なんじゃねーの。
>>20 のいう通り、配列とか構造体のポインタでいいと思うが。
mainのargc, argvみたいじゃ駄目なの?
>>22 レスサンクス
少なくとも単純な配列はダメですね。与える型が一定ではないので。
まぁ各変数へのポインタの配列を渡すというやり方はあるでしょうけど。
このスタックの中身をprintf関連に与えて呼び出したいときもあるので、
できればva_arg()で受けられる形で引数をやり取りしたいのです。
でも、こんな使い方はめったにしないでしょうね。
型情報を一緒に渡してやるのが普通じゃない? typedef enum A_TYPE_ { A_INT, A_CHAR, A_DOUBLE } A_TYPE; typedef struct A_ { A_TYPE type; union { int i; char c; double d; }; } A; で、A の配列を渡す、と。
解説サイトを見ると作業フォルダようにc:\workというフォルダを作って そこにファイルを作ってgccすると書いてあって、そのとおりやってもできないんですが、 どうすればいいのでしょうか? ほかのスレで聞いたらスレ違いといわれました。おねがいします。
>>26 レスサンクス。
でもそうじゃないのさ。va_list型が良いのです。
環境依存な気はするが、va_listってvoid*の配列だった気がするので 適当に放り込んで投げればいいんじゃないのかなぁ。
#include <stdio.h> int a[2000],n,m,i,t,q,e; main() { printf("エラトステネスのふるいを利用して素数表を作ります。\n"); printf("1から1000までの素数を書き出します。\n"); q=1; for (i=2; i<1001; i++){ if ( (i%2)==0||(i%3)==0||(i%5)==0||(i%7)==0||(i%11)==0||(i%13)==0 ) {e+1;} else {a[q]=i;q++;t++;} } q=1; printf(" 2 3 5 7 11"); for (n=1;n=(t/7); n++){ printf("\n"); for (m=1; m<8 ; m++){ printf(" %d",a[q]); q++; } } セグメントエラーがでてまともに動いてくれないんですが どうすればいいんでしょうか? 「エラトステネスのふるい」という 1から1000までの素数を書き出すプログラムを作らないと行けないんですが、、、
括弧の対応が取れてないし、動かしてもループが止まんね。
>>29 何でそんなに va_list 型にこだわってるの?
探してみたのですが見つかりませんでした。 すみません。
>>32 エラトステネスはよくわからんが…
…
> {e+1;}
意味わからんです。
…
> for(n=1;n=(t/7); n++)
条件ブロックが代入文になってます。
37 :
デフォルトの名無しさん :03/12/25 00:09
へへーんだ リスト構造わかんねーよ けけけけ
>32 ふるい作成はしていないので1000迄固定です。 #include <stdio.h> main() { int i,q; int a[2000] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97}; printf("エラトステネスのふるいを利用して素数表を作ります。\n"); printf("1から1000までの素数を書き出します。\n"); q = 25; for(i=100; i<1001; i++){ if ( (i% 2)==0||(i% 3)==0||(i% 5)==0||(i% 7)==0||(i%11)==0||(i%13)==0|| (i%17)==0||(i%19)==0||(i%23)==0||(i%29)==0||(i%31)==0||(i%37)==0|| (i%41)==0||(i%43)==0||(i%47)==0||(i%53)==0||(i%59)==0||(i%61)==0|| (i%67)==0||(i%71)==0||(i%73)==0||(i%79)==0||(i%83)==0||(i%89)==0|| (i%97)==0 ){ }else{ a[q] = i; q++; } } for(i=0; i<q; i++){ if(!(i%10)) printf("\n"); printf(" %3d", a[i]); } }
(((( ;゚Д゚)))ガクガクブルブル
キタワァ.*・゜゚・*:.。..。.:*・゜(n‘∀‘)η゚・*:.。. .。.:*・゜゚・*!!!!!
>39 かなり力業っす(^^ >32の作りかけのプログラムを見るに、力業でやりたいようだったので
今まで見つけた素数を利用してちょんまげ。
>>34 宗教上の理由と思われる。
仮にその引数が渡せたとして、関数の中でどうやって
引数のバイトの列の実体(型とか)が何であるか、を知るのかな?
何番目の引数の型が何であるかがわからなければ
どうやってva_argで処理するのだろう。
たとえば、f(4.1, 3); とあれば、
最初の引数の型はfloat? double? 次の型は何?
と破綻すると思うのですが…。
大丈夫、floatは有り得ない。
ちゃんとうごきました!!代入文でh無く不等号にしたら動きました。 ありがとうございました>
for文とかでprintfとかを何回も実行させたら同じ文がスクロールされてでてきますよねー? それをスクロールさせずに同じ場所で文字だけを変えていくということはできないんですかー? for(i=0;i<=100;i++){ printf("今の数は%dです",i); } これを一行で%dのとこだけを変更させていきたいんですけど、C言語でできますかー? やりかた知ってるひとおしえてください
\b (バックスペース) を使えば何とかなることもある。
printf("今の数は%dです\r",i);
わぉー!両方ともうまいこといきました! ほんとありがとぉー!
50 :
デフォルトの名無しさん :03/12/25 04:13
char temp[256]; FILE *fp; printf("programtext2.cへの上書きを行います\n"); printf("文字列を入力してください: "); scanf("%s", temp); if(NULL == (fp = fopen("programtext2.c", "w"))) printf("ファイルのオープンに失敗\n"); else fprintf(fp, "%s", temp); fclose(fp) を実行して例えば「abc def」と入力するとprogramtext2ファイルには「abc」しか出力されません。 何故なのでしょうか、親切な人説明よかったらお願いします。 スペースまでを一つの文字列と認識しているからかなと予想したのですが違いますか? 後、これをうまく動作させるにはどうしたら良いのでしょうか
>>50 scanf()のフォーマット指定の%sとはそうしたもの。
空白を含む文字列を取り込みたい場合は%[^\n]で改行直前まで取り込むか、
scanf()以外の方法を検討する。
#例えばfgets()でも同じように改行まで取り込むことができる。
52 :
デフォルトの名無しさん :03/12/25 04:28
ftpコマンドで質問です。 ①同一ホストの他のユーザに対しFTPログイン ②パーミッション無しのファイルに対しdeleteコマンド実施 ③ファイル削除されますた なんででつか? deleteのオプションとか必要なんでしょうか? おながいします。教えて下さい。 理想は、消したいけど消えないのがいいですね。
55 :
デフォルトの名無しさん :03/12/25 04:55
>53 Cで書いてるから >54 さんくす
>>31 もちろん環境によるけど、配列じゃなくてcharポインタじゃない?
三項演算子のネストはやめて(ToT)
>>31 > 環境依存な気はするが、va_listってvoid*の配列だった気がするので
アラインメントとかちゃんと考えないとダメだが、
まぁ少なくともANSI Cの範疇では不可能。あり得ない。
>>57 a = c == 4 ? 5 :
c == 5 ? 8 :
c == 9 ? 10 : 18;
分かりやすいと思うけどな。
>>15 vfprintf() みたいな形にして、
引数を自分でアライメント等も考慮して設定すればいけそうな気がする。
# ANCI C の範疇ではないだろうが(w
64 :
デフォルトの名無しさん :03/12/25 12:58
質問です。 #include<stdlib.h> int main(void){ char a[64],b[64]; realloc(a,sizeof(char)*65); if(a==NULL){ printf("a確保エラー\n"); exit(EXIT_FAILURE); } realloc(b,sizeof(char)*66); if(b==NULL){ printf("b確保エラー\n"); exit(EXIT_FAILURE); } printf("メモリ確保\n"); free(a); free(b); return 0; } このソースを実行すると、「~確保エラー」というメッセージを出力することなくコアダンプしてしまいます。 char a[64],b[64];でメモリを確保しているので、使うのはmallocでなくreallocだと思ったのですが…。 どうすればコアダンプすることなく確保出来るでしょうか? ご指導お願いします。
配列を伸ばすことはできない。
>>64 >char a[64],b[64];でメモリを確保しているので
1. a, b は配列であって、ポインタではない。
2. 配列に割り当てられるメモリと、malloc/realloc で扱えるメモリとは別モノ。
そうなのですか?初めて知りました。 ありがとうございます。勉強になりました。 では、free(配列定義された変数のアドレス)という文法も間違っているのでしょうか? char *a; a=malloc(sizeof(char)*64); free(a); という書き方が許されるのであれば、 char a[64]; freea(a); という書き方も許される気がするのですが。 知識が浅はかなもので申し訳ありません。高なもので。
あ、67の書き込みは66さんの書き込み見てない状態で書き込んだものです。 なるほど。頭の中で配列とポインタがごた混ぜになっていました。 少し正しい理解に近づけたかと思います。ご教授下さったお2方様、どうもありがとうございました。
今ざっとこのスレの過去ログ見てるんですけど(現在Part15) これってCの勉強において効率的ですかね?
あまり効率的じゃないだろー ループしてるし煽りも入るし
たまーに良い議論もあったりするが・・・ C FAQを読んだほうが効率いいと思う
>>67 文法上は間違っていない。しかし、freeにはmalloc系関数が返したものしか渡してはいけないからダメ。
>>69 効率はよくないと思う。
>>51 なるほどよく判りました。ありがとうございました
>>72 ご回答どうもありがとうございます。勉強になりました。
すみません。また質問させて下さい。
ファイルから文字列を取り出して、変数に格納したいのですが、うまくいきません。
例えば、
//取り込むファイル(helloworld.txt)
Hello,World
//ここまで
//プログラム本体
char a[64],b[64];
FILE *fin=fopen("helloworld.txt","r");
while(!feof(fin)&&!ferror(fin) )
fscanf(fin,"%s,%s",a,b);
printf("%s,%s\n",a,b);
//ここまで
これでaに"Hello"、bに"World"が入ると思ったのですが、
うまく格納できてません。
これはどうしてなのでしょうか?
また、正しくaに"Hello"、bに"World"を入れる方法を教えて下さると幸いです。
ご教授お願いします。
>>74 %sは','で区切らない。
やるなら"%[^,],%s"かな。
>>75 すみません。よく辞典で探したら載っていました。
走査文字の並びやらと難しい言葉が連ねてありますが、
[^,]というのは","の直前まで文字列を取得するという意味ですよね?
なら別の方法で、
aとbに格納したい場合はhelloworld.txtを
Hello,World,
と直してから、
fscanf(fin,"%[^,],%[^,]",a,b);
でも可でしょうか?
未熟ゆえ、何でも質問して申し訳ありません。
質問の前に自分でやってみるという選択肢はないものか
>>77 試してみてはいたのですが、何でも訊いてみるという悪い癖が出てしまって。
fscanf(fin,"%[^,],%s",a,b);
だと、bには"World"が入っているのですが、aは空白が二行分入っているだけでした。
fscanf(fin,"%[^,],%[^,]",a,b);
では、プログラムを実行しても停止したまま動きませんでした。
前者のやり方でもうまく格納されなかったので、理解が及ばないのですが…、
申し訳ありません。ご解説をお願いできるでしょうか?
追加です。 後者のやり方でも fscanf(fin,"%[^,],%[^,],",a,b); にすれば前者と同じ結果になりました。しかしaには相変わらず空行が2行入っているだけです。 第二引数のフォーマット指定のやり方が悪いのだと思うのですが、いかかでしょうか?
81 :
デフォルトの名無しさん :03/12/25 17:08
doubleとfloatってどう違うのですか? 自分で調べてみてもよく解りません。 バカな質問でほんとに申し訳ありませんが、 わかりやすくよろしこお願いします。
83 :
デフォルトの名無しさん :03/12/25 17:18
>>82 そこの辺りをもう少しお願いします。ほんとすいません。
>>81 精度、表現可能な値の範囲、サイズ、全てが違う。
doubleはfloatの2倍 バイト数は処理系によって違う。 4 8 が一般的か。
たいていの場合、doubleの方がfloatより たくさんの桁数を覚えられると思っておけばよい。 それ以上知りたくなると、実装依存の話が出てくる。 doubleの方が本当にfloatより精度が高いかどうかも実装依存。
87 :
デフォルトの名無しさん :03/12/25 17:28
それでへぇボタン作ったことあるんですが 同じ日本語プログラミングのTTSの方が使いやすかったです。 (私の場合)
>>84 >>85 >>86 どうもありがとうございます。
自分のフリーのbccだとあんまり変わらないような気がしていて、
はっきりいってどこが違うのかよく解らなかったのですが、
処理系によってはあんまり変わらないこともあるあると思って
おいてもイイのでしょうか?
90 :
デフォルトの名無しさん :03/12/25 18:09
>>89 float.hを見ればどれくらい違うか分かる。
>>89 float は 3D ゲーム作るときくらいしか使うことは無い。
>57の「ネスト」って何ですか? 2典にも載ってないし・・・ マジです。意味を教えて下さい。 よろしくお願いします。
>>92 2ちゃん語じゃないよ!
入れ子構造のことだよ。
>皆さん。ありがとうってか、 「C言語で学ぶプログラミング基礎の基礎」という本の7日目で、全230ペ-ジ中118ペ-ジぐらいまで来ました。 でした。恥、、、
>>93 ネタニマジレスカコワルイ
ひねりが足りんぞ
そんなんじゃ「ワラタ」評価はやれん
誰か優しい人分かりやすくリスト構造を教えて
{{{{}}}}
単方向リスト A→B→C 双方向リスト A←→B←→C
リングリスト 好き Aさん←Dくん 好き↓ ↑好き Bくん→Cさん 好き
>>102 >>103 オマイラいい奴だな ほんといい奴だよ
一応ググッてサイト見て回ったからそういう考え方はなんとなくわかった。
例えばAを入力、Bを入力、Cを入力してそれをリストで表すという場合
typedef struct list{
char name[10];
struct list *next;
}LIST;
main(){
LIST *test;
*test = NULL;
ここまでしかわかんない。
つまりあれだ
もうちょい勉強してからもっかい聞く
今多分聞いてもわからん事に気づいたから
わかったら聞かないで済むけど
>>102 >>103 多分同一人物だと思うけどありがとな
>>105 同一人物じゃないけど、まぁいいや。
test に何が入ってるか分からんときに
*test に代入するのはどうかと、ということだけ
とりあえず言っとく。
LIST top; top.next = NULL; まずココカラ
ルートも全部動的にした方がいろいろと使いまわしきいて楽。
109 :
デフォルトの名無しさん :03/12/26 11:50
質問です パソコンでしかテレビ見ていないんですが やっぱり線を使ってるからということで NHK料金を払わなくてはならないのでしょうか?
ここはプログラム板のC言語スレなんだけど…
>>109 テレビがおいてあるかないかだと思われ。
ちなみに漏れはそんな輩はいつも
追い返しているがね。
あっちゃあ・・払いつづけてました(泣 もうちょっと調べてみてから問い合わせてみます、ありがとうございました。
払え。「テレビ放送を受信できる装置」を持つ者の義務だ。
違った。「NHKを受像できる設備」だ。
その義務を破るとどうにかなるのでしょうか?
>>109 そんなバカ正直に払う必要ないぞw どうせ集金やってる低脳なんて パソコンでテレビ見るなんて知らないよw
117 :
デフォルトの名無しさん :03/12/26 13:31
関数の戻り値を配列で指定したいのですがどのようにしたらいいでしょうか? 例えば int main(){ ans=avg(test); } double avg(int t[]){ sum+=t[1]+t[2]; sans[1]=sum; sans[2]=sum/t return sans; } のような感じにしたいのですが、エラーが出てうまく行きません。よろしくお願いします。
119 :
デフォルトの名無しさん :03/12/26 13:40
いえ、マジなんです。
Char配列に、画像の画素データを持っています。 その配列を引数にして、jpg形式で保存する方法はありますか? ありましたら詳しく教えてください。お願いします。
122 :
デフォルトの名無しさん :03/12/26 13:57
>>115 罰則規定なし。だから
>>111 や
>>116 みたいなのがいる。
>>117 1. 呼び出し側で配列として確保する。
int test[20];
double sans[2];
avg(test, sans);
}
void avg(int t[], ans[]) {
2. 呼び出された側で malloc/calloc 等で確保する。
double *avg(int t[]) {
double *sans = malloc(sizeof(double) * 2);
:
:
return sans;
}
オススメは、メモリリークの発生し得ない 1。
>>123 1.の場合、受け取る時は、
ans=avg(test,ans);
のままで、sumとsum/Tを受け取ることが出来るのでしょうか?
sans[2]=sum/t ↑ 何がしたいんだこれは
>>125 合計値と、平均値を配列に格納して配列ごと返したいのです。
ややこしくてすいませんです。
sum[2]=sum/t ってtは配列の一つめの要素のアドレスがはいってるのに それで割っても意味ないぞ。 というかエラーになるはず。
tに入っているというか tとかくとそういう意味に受け取られる のほうが正しいか。
>>126 =117
「t」は「int *」型な訳だが
#include<stdio.h> void avg(double s[],int t[],int n){ int i; int sum = 0; double ave; for(i= 0 ;i < n;i++) sum += t[i]; ave = (double)sum / n ; s[0] = sum; s[1] = ave; } int main(void){ int test[5]={3,5,7,9,10}; double ans[2]; avg(ans,test,5); printf("ans[0]=%f ans[1]=%f",ans[0],ans[1]); return 0; } こんな感じか?
>>130 どうもです。
合計値と平均値の二つの値を配列に入れて返すというのは難しいのでしょうか?
どうしても配列を返したければ、構造体に詰め込んで返すという手もある。 struct foo { double array[20]; } struct array f(int t[]) { struct foo ret_val; /* ... ret_val.array[n] に計算の結果を代入 ... */ return ret_val; } 2種類の値を計算して返すのなら、それと判る様な変数名の付いた構造体を返すのがいいと思うが。 struct bar { double sum; double average; }; struct foo f(int t[]) { struct bar ret_val; /* ... ret_val.sum, ret_val.average に計算の結果を代入 ... */ return ret_val; } こんな感じで。
配列に入れて返すってのがよくわからんな。 そもそCでは a[100] ,b[100]とあったとして a=b; としても配列のコピーはできないのは わかってるか?
>>133 そうなんですか。
グローバルで配列を定義しておけば配列に返せるってことになりますか?
というか、それが一番楽ですか?
すまん。struct fooの定義のあとにセミコロンが抜けていた。 struct foo { double array[20]; }の後ろに ; を付けないとコンパイルエラーになるな。 それと、配列を構造体に詰め込んで返すのは、多少効率の面から言って問題があるので 多用しない方がいいと思う。
>>134 行列の計算をしていて、別々の2つの値をどうしても配列に入れて返したいんです。
これって普通は無理ですか?
>>147 >行列の計算をしていて、別々の2つの値をどうしても配列に入れて返したいんです。
それだと
>>130 のやり方で問題あるのか?
>>138 基本的なことが解ってなかったかもしれません。
サブの中でのs[]を加工すると、メインのans[]の値を加工するのと
同じ事になってるんですか?ポインタみないな物ですか?
だとすると、
>>130 でよかったかもしれません。ほんとすいません。
>>139 そうだな
もとのansのアドレスを関数にわたして
関数はそのアドレスのとこに合計を書き込んでいる。
142 :
デフォルトの名無しさん :03/12/26 16:01
ポインターってムズイん?
ans[0] = sum( values, count ); ans[1] = ans[1] / count; で十分だと思うのはオレだけか?
144 :
デフォルトの名無しさん :03/12/26 18:09
#include<stdio.h> main() { char aaa[2][3][4][5]; aaa[0][0][0][1]=100; printf("%d\n",sizeof(aaa)); }
>>142 やってることは至極単純、メモリに番号をつけてるだけ
悩む人が多いのは下手にオブラートに包むからだ
ぶっちゃけて言うと俺が実感持てたのはアセンブラ使うようになってからだ
どんな入門書より易しいのがダンプリスト
プリンタで印刷してここが何とか赤鉛筆でメモするのが一番
146 :
デフォルトの名無しさん :03/12/26 19:42
すみません。質問させてください。 mem.hとmem.cppを静的ライブラリとして作成した後に、 ライブラリにある方のmallocを使用しようとしているのですが、 main.cppの方をコンパイルすると、 'malloc' : 定義されていない識別子です。 と、表示されてしまうのですが、どうしたらよいのでしょうか? main.cppの方に、 extern void *malloc(int size); と宣言を追加すれば、 "mallocです" というメッセージは表示されるのですが、main.cppの方には手を加えないで、 ライブラリをリンクするだけでmallocの上書きを実現することは可能でしょうか? プロジェクト→設定→リンクに、作成したライブラリを書いておいても、上記のエラーが出てしまいます。 VC6で作っています。 ---------------------------mem.h #ifdef malloc #undef malloc #endif extern void *malloc(int size); ---------------------------mem.cpp #include <stdio.h> #include "mem.h" extern void* malloc(int size) { printf("mallocです\n"); } ---------------------------main.cpp main() { malloc(1); }
>>146 何のため mem.h を作ったのかと小一時間...。
>>147 そういう問題じゃないだろ
mem.objをリンクしてないんじゃないか?
したらしたで_mallocが重複と言われそうだが
>>148 mem.objをリンクしたとしてもmem.h はコンパイルに必要だろ
>>150 よく見たらC++だな、だったら必要か
こりゃ失礼
>>146 おまえさん、Cを勉強中なら拡張子は.cにしたほうがいい
CのつもりでC++使ってると嘘を教え込まれるぞ
>>146 extern はあっても無くても同じだね。
面倒っちぃんで、普通は書かない。
>>152 普通って何だよ。お前のローカルルールを普通と称して押し付けるな。
unionがいいと思います。
158 :
デフォルトの名無しさん :03/12/27 16:01
memmoveとmemcpyについて質問です。 memcpyはその名のとおりメモリ領域をコピーするようですが、 memmoveは移動するということは、元の領域を削除してくれるんでしょうか。 それとも元の領域が不要な時はfreeを使わねばならないんでしょうか。 マニュアルだとどちらもコピーすると書かれているんですが。
159 :
デフォルトの名無しさん :03/12/27 16:06
>>158 どっちもコピーします。ただし、コピー元とコピー先の領域が重なってるときは
memcpyは使ってはいけません。そういう仕様です。
たとえば
char a[8], b[8];
memcpy(a, b, 8);
memmove(a, b, 8);
はどっちもOKですが、
char a[9], *b;
b = a + 1;
memcpy(a, b, 8);
memmove(a, b, 8);
なんていうふうに領域が重なってるときはmemcpyは使えません。
>>160 あっと追加。memmoveは元の領域を削除しません。
領域が重なってるとき以外はコピー元に何も影響を及ぼしません。
162 :
nokai :03/12/27 16:16
memmoveはmemcpyの亜種みたいなもん
164 :
デフォルトの名無しさん :03/12/27 17:20
棒人間くんがトコトコ歩くプログラムを作ってます 質問ですが、歩くところを3行で表現したいんですがうまくできません どうすればいいかおしえて下さい、お願いします #include <stdio.h> #include <string.h> main(){ int c=0; int k=0; while(1){ for(;c!=0;--c) {printf(" ");} c=k; printf(" ●\n"); for(;c!=0;--c) {printf(" ");} c=k; printf(" /|ヽ\n"); for(;c!=0;--c) {printf(" ");} c=k; printf(" ノ\\n"); getchar(); for(;c!=0;--c) {printf(" ");} c=k; printf(" ●\n"); for(;c!=0;--c) {printf(" ");} c=k; printf(" /|ヽ\n"); for(;c!=0;--c) {printf(" ");} c=k; printf(" /¬\n"); getchar(); k++; c=k; }
3行で、の意味が分からんのだ 表示を3行で、か? 単純なのは 画面のクリア(clsとか) コードを3行で、か?
本当は判断できるくせに何言ってんだか
マジレスするなら、画面制御が必要になるし、 それはこのスレの範疇ではないのだ。 スクロールで消しちゃうという手もあるけど、 歩いてるようにはなかなか見えないだろうな。 DOSプロンプトなのか何らかのターミナルなのかはしらんが、 行数を調節できるのなら3行に狭めてやってみるとかな(w
length = mystrlen(str); printf("%d\n", length); /*ここまでメイン関数内から抜粋*/ int mystrlen(char *sent) { int count = 0; while(*sent){ count++; sent++; } return count; } メイン関数内にあるstrという文字列の文字数を数える関数なんですが、 下のほうのmystrlenについて、質問があります。 sentをインクリメントする際に、 sent++; ってやるのと *sent++; ってやるのに、差はありませんでした。 もしかして、これはどっちでも同じでしょうか?今回の場合。
行数指定があるのは、ひょっとして宿題だからじゃ…
というか、*sent++ が *(sent++)なのは理解しているよね。
#include<stdio.h> void func(int arg[]){ arg[0]=10; } main() { int a[]={0,1,2,3,4,5}; int i; for(i=0;i<5;i++){ printf("%d",a[i]); } printf("\n"); func(a); printf("%d",a[0]); } なぜa[0]の値が変化するのですか?
>>172 ほんとにわかんないの(藁
arg[0] = 10
してるからだろうが(藁
>171 じゃ、*sent;という文が基本的に無意味なのも判るよネ
>>166 char *ptn[2][3]={{" ●"," /|ヽ"," ノ\"},{" ●"," /|ヽ"," /¬"}};
#define PRINT {int c; for(c=0; c<3; ++c) printf("%*c%s\n",k,' ',ptn[k%2][c]);}
{int k; for(k=0; ; ++k){ PRINT; getchar();}}
3行でつが、何か?
コード3行で書けとは言わないが
>>164 は冗長すぎる。
#include <stdio.h>
int main(void){
int k;
char white[256];
for(k=0;k<255;k++){
white[k] = ' ';
white[k+1] = '\0';
printf("%s ●\n",white);
printf("%s /|ヽ\n",white);
if(k%2==0) printf("%s ノ\\n",white);
else printf("%s /¬\n",white);
(void)getchar();
}
return 0;
}
お世話になってます。先日はネスト感謝でした(2チャン語かと思った恥)。「C言語で学ぶプログラミング基礎の基礎」全230ペ-ジ中130ペ-ジ(9日目)まで来ました。
>>164 がおもしろそうでやってみました。終了方法がわかりません。右上の×では「プログラムの終了コマンドを使ってください。」と警告されます。
このような時の終了方法を教えて戴けないでしょうか。どなたか宜しく御願い致します。環境はwindows98のMS-DOSプロンプトから入る LSI C-86 Ver.3.30です。
もひとつ。秀丸ですが行番号を表示できませんか?コンパイルエラーの時、行を数えるのが苦痛です。
181 :
デフォルトの名無しさん :03/12/27 21:06
windowsのchimes.wavを%xで表示すると 52 49 46 46 ffffffd8ffffffd920 20 57 41 56 45 66 6d 74 20 10 20 20 20 1 20 2 20 22 56 20 20 ffffff8145 1 20 4 20 10 20 64 61 74 61 ffffff8145 20 20 2 20 3 20 9 20 6 20 7 20 2 20 5 20 20 20 3 20 3 20 1 20 2 20 ffffffff となります。もっと続きがあるはずですよね・・・? 全部表示するにはどうすればいいでしょうか? 配列は1024と十分なのですが。 サンプル数も6サンプル半?になり、わけわかりません。 よろしくおながいします。
そーすうぷしる
> 配列は1024と十分なのですが。 わけわかりません。
>windowsのchimes.wavを%xで表示すると プログラムを載せろよ。どーせ"rb"でなく"r"でfopenしてたとかいう オチなんだろうけど。
ぱくられるからソース晒したくない
レスTHXです。 >182 わけわからん操作してるかもしれませんが、内容は間違ってないはず・・・ int DisplayWave(FILE *fp) { char content[MAX]; int flg; //ファイルの終わり int i=0; int j=0; int n=0; //iを記憶 /*WAVEを数値で出力*/ for(i = 0; i < MAX; i++) { content[i] = getc(fp); //ファイルから1文字ずつ if (content[i] == EOF) { n = i; break; } } /*WAVE情報を出力*/ for (i = 0; i <= n; i++) { printf("%-8x", content[i]); j++; if (j == 10) j = 0; } puts("\n"); }
>183 ファイルポインタから読み取ってデータを溜めた配列です。 >184 rbでもrでも結果は変わりませんですた・・・
>>181 getcの戻り値をcharに入れてからEOFと比較してはいけない。
>>179 さん。
ありがとうございました。
>>180 さん。
ver3.19の秀丸ですが行番号表示されません。窓の杜から持ってきたばかりです。?
>188 THXです。 EOFを感知して処理を止めないとfff…∞となるんですが、どういう手法にしたらいいでしょか? また、これが原因なんでしょか?
getcの戻り値はintだよ
>>189 今手元に無いが
たしかステータスバーあたりにカレントの行番号が出ていなかったか?
>>178 ファイルタイプ別の設定→全般→詳細
行番号表示にチェック。
これでいけると思うよ。
>>186 それは本当に問題となっている動きをするソースか?
取り敢えず n = i; の場所が悪いから MAX より大きなファイルでNGだが。
>>179 さん。
あった。時計かと、、、ありがとうございました。
>>193 さん。
イイ!ありがとうございました。
初級プログラミングで足し算専用の電卓を作ります。 =を入力するまで計算し続ける、というものです。 int s,i; char enzansi; printf("整数専用の足し算電卓のプログラムです\n"); s=0; while(enzansi!='='){ printf("整数値を入力してください\n"); scanf("%d",&i); printf("+か=を してください\n"); scanf("%s",&enzansi); s=s+i; } printf("%d",s); } としたのですが、Sが正しく表示できません。 どなたかご教授お願いします。
>>198 具体的にどうすればどうなるのか教えれ
ちなみに=を入力する前には数値0を入れるんだよな?
>199 まず整数値を入力させ、次に演算子を入力させます。 それで演算子が+だったら足し算をして繰り返し、 =だったら計算を終了して答えを表示させる、というものです。 分かりにくい書き方ですいません。 >=を入力する前には数値0を入れるんだよな? なぜそういうことをするのかが分かりません。無学ですいません。
> Sが正しく表示できません。 なにが「正しい表示」なのですか?
>>200 >なぜそういうことをするのかが分かりません
(0以外を入れると s=s+i; が実行されてしまうので)
答えが期待しているもんと違ってる、ってオチかと思ったわけだが
>201 正しい計算結果という意味でです。 0としか表示されないのです。分かりにくくてすいません。
char enzansi; scanf("%s",&enzansi);
>>203 char enzansi[2]; として scanf("%s",enzansi); だ!
while(enzansi!='='){ printf("整数値を入力してください\n"); scanf("%d",&i); s=s+i; printf("+か=を入力してください\n"); scanf("%s",&enzansi); } このように s=s+i; の位置を変えたらできました。まだ原因とかは分かりませんが・・・ とにかく、こんな時期にわざわざレス下さった方たちに 早急にお礼を言いたいと思います。ありがとうございました。
int main(void) { int s,i; int enzansi='\0'; printf("整数専用の足し算電卓のプログラムです\n"); s = 0; while(enzansi != '=') { printf("整数値を入力してください\n"); scanf("%d", &i); printf("+か=を入力してください\n"); scanf("%s", &enzansi); if(enzansi=='+' || enzansi=='=') s = s + i; } printf("%d",s); }
ホンマに出来たんか・・・・? 定義されてへんで!って出るはず。enzansiの初期値無し。
>207 交差レスになっちゃってすいません。 この課題の続きとして、足し算専用でない、(-、*)の 計算も行えるものを作れ、とあるので大変参考になります。 ありがとうございます。 ほんとにこのスレの住人の方々は親切ですね。感謝です。
>208 BORLANDのコンパイラ使ってますが問題なしのようです。 もうちょっと考えてみますね。わざわざありがとうございます。
みなさんTHXです。 >195 はい、このソースで合ってます。 windowsのchimes.wavは0.6secくらいなんで1024で十分だと思いました。 >188 >191 intcontent = getc(fp); //ファイルから1文字ずつ itoa(intcontent, content[i], 10); としてみましたが、メモリ参照エラーが起きますた。 使い方合ってませんか? たびたび寸ませんです。
>>206 分からんか...
scanf("%s",&enzansi);
これがダメなんだがな
もまえの直しかただと「偶然うまく動く」という奴だ
>>205 とか嫁
214 :
デフォルトの名無しさん :03/12/28 01:33
>>206 %sは文字列を読み込むものだから
=\0が読み込まれる訳だ
char enzansi;だとサイズが足りずに
int sの部分に上書きされるわけだ
ということを
>>204 >>205 >>213 が散々言ってるわけだが
>>214 12歳でここまでしっかり意見が書けるのはすごい。
ちょっと考えが極端だけど。winnyなんて一部の人だろうし。
しかし目がちかちかする。
>212 THX! それはfff・・・∞に対する事で そのファイルサイズに対応した領域を確保しろということでっか? いろんなファイルに対して領域を確保したいのですが・・・
>181です。今、シンプルに { int c; FILE *fp; fp = fopen("c:\\winnt\\media\\chimes.wav", "rb"); c=getc(fp); printf("%3x", c); while (c!=EOF) { c=getc(fp); printf("%3x", c); } } を書いて動かしたら相当長い(正しそうな)数値がザーッと出てきました。 ただ、始まりが 1 f2 1 48 1 a6 1 e0 0 4c 1 79 0 e3 0 7 0 61 となっており今までの 52 49 46 46すなわちR I F Fと違うので解析できません・・・ これはどんな文字コードなんでしょ・・・? また、これで正しいんでしょか? たびたびになりますが、宜しくおながいします。
220 :
デフォルトの名無しさん :03/12/28 10:52
221 :
デフォルトの名無しさん :03/12/28 11:03
>>220 そんなところ。
要素数を1ではなく巨大なものにするのも同じ。
>>221 サンクス。納得しやした。
人のプログラム見てると、自分の知らんやりかたが出てきたり
して関心すること多い。
>>219 chimes.wavは55KBもあるらしいから長いのはいいとして、
先頭はRIFFのはず。
もしかして、スクロールアウトしてるのに気付かず途中のコードを見ているって落ち?
リダイレクトするなりして、先頭を確認してみたら?
それと、"%3x"は見難いから" %02x"にするといいよ。
225 :
デフォルトの名無しさん :03/12/28 12:46
行列の掛け算なのですが、 main(){ int a[2]; int b[2][2]; int c[2]; for(i=0;i<T;i++){ for(j=0;j<T;i++){ c[i]=c[i]+a[i][j]*b[j]; } } } として行うと、強制終了されてしまいます。インクリメントのしかたなどがおかしいのでしょうか?よろしくお願いします。
T=2です。よろしくお願いします。
すいません。間違ってたみたいなので書き直します。 main(){ int a[2]; int b[2][2]; int c[2]; for(i=0;i<2;i++){ for(j=0;j<2;i++){ c[i]=c[i]+b[i][j]*a[j]; } } } でした。よろしくお願いします。
ループの中でiとjの値がどうなっているのかチェックしてみましょう。
何度もすいませんまた間違ってたみたいなので書き直します。 main(){ int a[2]; int b[2][2]; int c[2]; for(i=0;i<2;i++){ for(j=0;j<2;j++){ c[i]=c[i]+b[i][j]*a[j]; } } } でした。またまたよろしくお願いします。
その書き直したやつで実行するか、 でなけりゃ本当に実行してるソースを貼り付けてくれ。
>>229 配列の要素が初期化されていない。エラーは兎も角、なにがしたいんだ?
#include<stdio.h> int main(void){ int i,j; int a[2]={5,6}; int b[2][2]={{1,2},{3,4}}; int c[2]={0,0}; for(i=0;i<2;i++){ for(j=0;j<2;j++){ c[i]=c[i]+b[i][j]*a[j]; } } for(i=0;i<2;i++){ printf("c[%d]=%d",i,c[i]); } return 0; } この形でやってみたら実行可能になってしまいました。関数内でのことなので、ほかにおかしな所があるようです。すいませんでした。おかしそうな所をがわかったらまたお願いしたいと思います。ほんとにすいませんでした。またお願いします。
整数変数名はi,j…を使えと教えられたのか?
確保する領域はMAXSIZEより小さくし 添え字でアクセスするときに(気休め程度に)安心感を得る
「可変長データを扱う変数でも領域さえ大きくとっておけば固定長の変数でもかまわないよ」ってこと? 何が言いたいんだかよくわからんが、 なんかの翻訳みたいだから原書の方を読んでみたら意図がつかめるかもしれん。
237 :
デフォルトの名無しさん :03/12/28 14:21
MAXSIZEをとてつもなく大きくしても、実際に構造体変数をつくらなければメモリを消費しないでしょ。 だから要素数を1として、それを越えてアクセスする(前者の方法)よりはいいってこと。
> char namestr[1]; として malloc() で広げるというのは分かるのですが, 後者はmalloc()で縮めると考えればいい。少なく取ると言った方がいいか。
>>225 なんか微妙だなー。宿題?
for(i=0;i<n;i++){
for(j=0;j<n;j++){
for(k=0;k<n;k++){
c[i][j]=c[i][j]+a[i][k]*b[k][j]
}
}
}
みたいにしちゃえばよくない?
みなさん, レスありがとう.
>>235 >>237 後者の方法を好む人達は, 「char namestr[1]; と取って広げるより,
char namestr[MAXSIZE]; と取って縮める方がより安全だろう」と
思っているということですね.
でも, 規格外だということは置いておくとしても, 私にはこの 2 つは同じように
思えるのですが, どうなんでしょうか. どちらも malloc() で確保された領域で,
ポインタ経由でしか使わないんですよね ?
>>224 その通りのオチですた。
THXです!!
今、続き進めてます。
また詰まったら質問させていただきます。
では。
242 :
デフォルトの名無しさん :03/12/28 16:54
>>240 C FAQにも書いてあるけれど、a.namestr[10]='A';とすると、配列の境界を注意深くチェックするコンパイラは警告を出すかもしれないから。
243 :
デフォルトの名無しさん :03/12/28 17:18
"2003年12月28日" という文字列から2003,12,28をint型の値として取り出したいのですが、 何かいい方法ありませんか? 試しに下記のようにしてみたのですがうまく取れませんでした(文字コードはSHIFT_JIS)。 int year, month, day; sscanf("2003年12月28日", "%d[^年]年%d[^月]月%d[^日]日", &year, &month, &day);
>どちらも malloc() で確保された領域で,ポインタ経由でしか使わないんですよね ? 後者は普通の変数のように定義して使こともよくある。
>>243 scanfのスキャン集合の使い方が間違っている。
それにこの場合、スキャン集合は必要ない。
sscanf("2003年12月28日", "%d年%d月%d日"...
で良いはず。
>181です。 getcの戻り値はint型ということで、char型の配列に変換したいのですが、 char content[MAX]; content=itoa(int n); のどこが間違ってるでしょうか? itoaの書式はググってみたのですが・・・ おながいします。
>>243 #include<stdio.h>
int main(void){
char buf[] = "2003年22月28日";
int year,month,day;
sscanf(buf,"%d%*2s%d%*2s%d%*2s",&year,&month,&day);
printf("year:%d,month:%d,day:%d",year,month,day);
return 0;
}
こんなのはどうだろう。
>>245 難しく考えすぎてました。(^-^;
これでできました。
>>247 マニュアル読んでみました。
* --- 引数への代入を抑止する。
*2 --- 2バイト分変換して捨てる、要するに今の場合「年」「月」「日」を捨てる。
ということでこちらでもできました。
大変勉強になりました。ありがとうございました。
配列は最大何個まで作れるのでしょうか?どなたか親切な方よろしくお願いします
>>249 規格では制限していない
処理系の性能による
>>249 自分で実験してメモを取りながら確かめるのが上達の一歩。
>>252 簡単かつ確実かもしれませんが、手間が・・・
>>250-253 これほど配列を使う自分のソースが悪いと思って、ソースを考え直します
htmlもコンパイルしたいのですが・・・
>>255 ここは C 言語スレなので、スレ違い。
いつのまにかIMEがONになってて 「春夫ワールド!」になってたけど、何か?
>>256 いいえ、スレにあった内容です。
私が言いたいのはhtmlをコンパイルする
コンパイラ、インタプリタを他ならぬ
C言語で作ってもらいたいのです。
確かにhtmlのコンパイラってないな。
#include <stdio.h> main(){ printf("春夫ワールド!\n"); return 0; }
あるってば。chmの正式名称を言ってみな。
結局htmlのコンパイラで何したいんだ。 パーサー作りたいのか?
なーるふぉどざっわーるど
何か一匹変なのがいるな。
htmlのコンパイラがあればなんでもできるような気があるのです。
これは、javascript perl cssなど他の
言語の統合、消滅を意味します。
これは大変素晴らしいことです。
>>266 もしそれが私のことであるなら大変心外です。
>>267 違うよ。
春夫がどうとかってわめいてるやつのこと。
#include<stdio.h> #include"my.h" int main(int argc,char **argv){ FILE *f; //ここにhtmlをコンパイルするコードを記述 return 0; } 現在ここまで完成しているのですが・・・・
(゚ Д゚)??
HTMLコンパイラで何を生成するのか分かりません
>>267 でも全くわからんなぁ
>>267 html形式のファイルをコンパイルする。
↓
exeファイルが生成する。
これでわかってもらえると思います。
>>269 これ見てまだ釣りじゃないと思う奴がいるのか。
じゃあ変やつ2匹に訂正しておこう。
275 :
デフォルトの名無しさん :03/12/28 20:51
こんな質問して笑われるかもしれないんですが、 stdoutやstdinって行バッファリングしてるんですか? 例えば、 main() { int c; while((c = fgetc(stdin)) != EOF) { if(c =='\n'){ fputc(c,stdout); fputc('@', stdout); sleep(3); } fputc(c, stdout); sleep(1); } } とかってやったら行バッファリングしてるのかな~って思えるんですが、間違いでしょうか?
どうやらみな、私を侮辱しているのですね。 そうですね、いつの時代も、進みすぎた考え方 は受け入れられないのですね。 そう、まさしく私は地動説を唱え受け入れられなかった ガリレオその人ですよ。私がもう少し後になって生まれてきた ならば、きっとみなさんの見る目も違ったでしょう。 そのことが残念でなりません。
277 :
デフォルトの名無しさん :03/12/28 21:10
>>275 デフォルトでどうなっているかは環境によるんじゃないかなぁ。
例えば俺の環境だと、stdoutが端末を指していれば行バッファリング、それ以外ならブロックバッファリング。stderrは常にバッファリング無し。
ブロックバッファリングなんて言わないな・・・フルバッファリング
279 :
デフォルトの名無しさん :03/12/28 21:21
たとえば、LZHファイルに自爆展開コードを加えて exeにすることを、「LZHをコンパイルする」などとは ふつーは、言わない。
端末=ターミナルでは。
>>258 >C言語で作ってもらいたいのです。
ご予算は? 納期は?
用件に対する話し方に最低限の常識がないから
みんなあんたをバカにしてるんだよ。
283 :
デフォルトの名無しさん :03/12/28 21:32
>>281 ということは、stdinは\nで入力、stdoutはループで次のstdinのバッファへの入力のために、
の入力があるためフラッシュされるため画面に表示されてるのでしょうか?
JISの規格書には↓こう書いてあった。なんかわかりにくい。 それら(stdin,stdout,stderr)がオープンされる時、標準エラーストリームを完全バッファリングしない。 ストリームが対話型装置を参照していない場合、しかもその場合に限り、標準入力ストリーム及び標準出力ストリームを完全バッファリングする。 stderrはバッファリング無しにしてはいけない。stdin,stdoutは端末を指していなければ完全バッファリングするということか。
×バッファリング無しにしてはいけない。 ○完全バッファリングしてはいけない。
286 :
デフォルトの名無しさん :03/12/28 21:36
exitやstdinへの入力でstdoutは上の場合フラッシュされ、画面に表示されるのでしょうか?
287 :
デフォルトの名無しさん :03/12/28 21:42
変なのが居たのか?
255の事ね。(プゲラ
沢村の中の人も大変だね
>>288 めちゃくちゃ釣られている気がするんだが。
Cの基礎的なことはだいたいできている人にとって C++の良い入門書は?
293 :
246=181 :03/12/29 14:29
>181です。 itoaを理解するのために↓を作りましたが、メモリ参照エラーになります。 どこを直せばいいでしょうか? #include <stdio.h> #include <stdlib.h> int main(void) { int c; int i=0; char cnt[500]; FILE *fp; fp = fopen("c:\\winnt\\media\\chimes.wav", "rb"); while (c!=EOF) { c=getc(fp); itoa(c,cnt[i],10); i++; } while (i!=EOF) { printf("%x", cnt[i]); i++; } } おながいします。
あ、二つのwhile文の間でi=0;をしても同様ですた。 たびたびすんまそん。
itoa をつかうこと自体がおかしい。 while の終了条件が(ふたつとも)おかしい。
別に cnt[i] = c;でええのでは。 int, char , char配列を使った文字列 の区別をつけないとあかんよ。 あと、chimes.wavの500Byte以上の部分にさしかかるとあぼ~ん。
297 :
293=181 :03/12/29 14:38
えと、ファイルからgetcで読んだのをまとめて配列に保存したくて int型→char型の変換にitoaかな・・・と思ったのですが・・・
ハッ )AArya なるほど、そうか・・・やってみます! 500に関してはテキトーに置いてみたものですた。
>>297 君はメモリの内容と型が理解出来てる?
char a;
int c;
a = '1';// '1' = 0x31
c = a;// c = 0x00000031
要はgetcはint型に受け取っているが、内容はbyte(char)単位。
キャストみたいな物と思えば理解出きるかな…
c = ( int )a;
itoaは
1(0x00000001) -> '1'(0x31)だよ。
それと普通はfilesizeを調べ、そのsizeでメモリを動的確保して
freadで一発で取得、でメモリ上で文字列扱いするなら最後を'\0'に
そうで無いならsize以上は参照しないってやる
初歩的質問がこのスレでいいのか分かりませんが質問します。 縦一列、カンマ区切りで100行ほどのCSVファイルがあるのですが それを配列に読み込む方法はどうすればいいのでしょうか。 fp1=fopen("data.csv","r"): for(i=0; i<100; i++) { fscan(fp1,"%d","&x[i]"); } fclose(fp1); まずこのように考えました。 初歩的すぎるとは思いますがよろしくお願いします。
301 :
297=181 :03/12/29 15:11
>299さん 詳しくありがとうございます。 そこら辺苦手なのでがんがってみます。
>>300 fscanf(stdin,"%d,",&x[i]);
こうじゃねーか。
fscanf(fp1,"%d,",&x[i]);
>181でもあるんですが、はじめの 52 49 46 46 ffffffd8 ffffffd9・・・ の[5][2]は2進数の[0101][0010]ですよね? [ffff][ffd8]も2進数!?16進数ですよね? ここわかりません、おながいします。
>300 fscan()のフォーマットには、区切文字(CSVの場合はカンマ)も使えるよ。"%d,"みたいに。 あと、100個じゃなかった時に備えて、fscan()の戻り値をチェックするのが普通だね。
fscan ってなに?
標準ライブラリのfscanf()と同じ。<fscan()
ありがとうございます。 早速試してみたのですが、fscanf行の '[' の演算項が不当 というエラーが出てしまいます。 どこが問題あるでしょうか? FILE *fp1; main() { int x, i; fp1=fopen("data1.csv","r"); for(i=0; i<5; i++) { fscanf(fp1,"%d,",&x[i]); } fclose(fp1); }
int x[5],i;
すみません、for分の数が先ほどと違いますが 今回は100個のデータの場合ということでお願いします
int x[100],i;
入れ違いでレスが・・・ そのように試したのですが、同じfscanf行で ファイルポインタ値が不当 となりました。 無駄にレス消費してすみません
>304 フォーマットが"%x"だから、すべて16進数。 *進数というのは表記方法であって、すべての数は2進数でも16進数でも100進数でも書ける。 想像するに、char(8bit)とint(多くは32bit)の違いの事で混乱してるのでは?
fp1がNULLになってない?
if((fp=fopen("data1.csv","r")) == NULL) printf( "Can't open" ); としてみては?
>>304 0x52は2進では01010010で、10進なら82、文字で表せば'R'。
0xffffffd8は負数になってしまっているが1バイトのみに着目すれば
2進では11011000で、10進なら216となる。
>>315 試してみたのですが、全く同じ
関数 'fscanf' のファイルポインタ値が不当
というエラーが出ます。
プログラムとしてはこれで問題ないのでしょうか?
data.csvをcドライヴのルートに置いて、 fp=fopen("c:\\data1.csv","r") でやってみそ
エラーは実行時です。 ファイルは開けてるとは思うのですが・・・
>>320 その方法を試したところ、エラーが出なかったので
数値を出力したところ無事に出力できました。
たくだんレス頂きありがとうございました。
>>300 >>315 は実施済とのことなので、次は、
if(!fscanf(fp1,"%d,",&x[i])) printf("Error on i=%d",i);
を試してみなされ。
324 :
304=181 :03/12/29 16:38
>313 >316 THXです。 混乱が解けますた!
325 :
デフォルトの名無しさん :03/12/29 18:19
関数内で確保した領域のポインタをその関数から返した場合、 関数を抜けると確保した領域はどうなるのでしょうか? 元のデータがそのままのこっているんでしょうか?
普通残らないので、static宣言します。
また、戻り値を何回も使用するような場合は、 引数としてポインタを渡す方が自然です。
329 :
デフォルトの名無しさん :03/12/29 19:01
FILE *からそのファイル名やパスを取得するのは無理な話なの? 何がしたいかというと、FILE *だけを手がかりにファイルを削除したいのです。
>>329 そりゃ無理だろ
FILE*が有効ってことはオープン中のファイルやん
331 :
デフォルトの名無しさん :03/12/29 19:22
C++って何?
>>332 C++は、はーげんご
C は、ひーげんご
>>332 #include<stdio.h>
int main(void){
int C;
C=0;
printf("C:%d\n",C);
C++;
printf("C:%d\n"C);
return 0;
}
これをコンパイルして実行すればわかるよ。
>>331 ポインタと配列の操作と宣言方法の基本は暗記するしかない。
だが、例えば、data[0][0]と**dataが同じだということは、
添え字記法の意味が解っていれば自然にわかる。
ちなみに、そのページには誤りがあって、お勧めできない。
>>334 正確にはこうだ。
#include<stdio.h>
int main(void){
int C;
C=0;
printf("C:%d\n",C);
printf("C++:%d\n",C++);
return 0;
}
「多元配列の添字は、最も右の添字を1変えるとポインタが1変わる」 これは、普通の感覚とは逆だが、そういうものだと諦めるしかない。
>>337 そうでもない。
int data[5][10];
という宣言は、data[5][10]の型がint(範囲外アクセスだが)であると同時に、
data[5]の型がint[10]であるとも読める。
結局、添え字演算子の左結合性さえ知っていれば良いんだ。
>339 わかるんだけど、 int data[5] がintの配列なら、 int data[5][10]はint data[5]の配列のように感じるのよ。
341 :
デフォルトの名無しさん :03/12/29 20:37
このスレの回答野郎の平均年齢は?
ジジイばかりだよ
20前半ってとこじゃない?
後半だ。
345 :
デフォルトの名無しさん :03/12/29 20:44
やっぱりゆじゅねがいてなんぼってことか・・・
>>340 普通に行列で考えれば簡単だろ
[5][10]なら5x10で5行10列
int[5]int(data)[10]ってことだ
C#ならint[5,10]だからわかりやすいのかな?
やべえ、なんかおかしいと思ったらこんなとこに 誤爆してた。
349 :
撲滅委員会 たかし :03/12/29 22:23
http://nichsine.hp.infoseek.co.jp/ どっかの馬鹿のハッキング(とても低レベルな)を受けしばらく更新できませんでしたが、復活しました。 あなた方の馬鹿さ加減にはもう開いた口が塞がらない思いです。
体は大人でも、精神は幼稚園以下、いや、胎児以下の奴ばかりですね。 どいつもこいつも「2ちゃんねらーは、普通の人の方が多い。
弁護士や医者だって見てるんだぞ。」とかを一生懸命に説明します。 だが胎児並みの脳みそをフル回転して考えろボケ共。
弁護士や医者やプログラマーが2ちゃんねるで「なんとかかんとかでつ~。なんとかなんとかでマスタ。」とか言っているんじゃ普通どころか異常なんだっつーの。 2ちゃんねらーは所詮クズ。
何にも出来ないくせに偉そうなことばっかいっている。
どっかの馬鹿がこのHPの場所をばらしました。掲示板の荒らしは全員2ちゃんねらーの仕業です。でも、私に賛同してくれる人の方が多いので安心しました。これからも頑張ります。
http://nichsine.hp.infoseek.co.jp/
自分で管理できんなら人雇え
>>340 int data[5][10];という宣言があれば、array[5] of array[10] of intと読めるだろ。
識別子に近いものから順に読んで、intとかcharは一番最後に読めばいい。
二次元配列a[5][10]においてa+1がa[0][1]でなくa[1][0]のアドレスになるのか? なぜ*(a+1)としてもa[1][0]にアクセスできないのか? こういうのを分かりやすく解説してるサイトないですか?
353 :
デフォルトの名無しさん :03/12/29 23:45
a[5]でa+1とやるとa[1]のアドレスが得られるのと同じだが。 下も同じ。*(a+1)==a[1]だからa[1][0]にはならない。
補足 a[1][0]のアドレスではなくa[1]のアドレスと考えればいい。 &a[1]と&a[1][0]は同じになるからa[1][0]のアドレスと考えがちだけど。
355 :
デフォルトの名無しさん :03/12/30 00:15
400 326 122 368 133 457 といった感じで、数字を羅列したファイルがあり、 この左の数字から256を引き、右の数字は-1をかけて256を加えて、 同じような形でファイルに出力する、というプログラムを作りたいのですが どうやって作ったらよろしいでしょうか? 猫でもわかるプログラミングを見て、文字を出力したりはできたのですが、計算のさせ方がわかりません。 よろしくお願いします。
void ProcessLines(FILE* fin, FILE* fout) { int x, y; while (fscanf(fin, "%d %d", &x, &y) == 2) { fprintf(fout, "%d\t%d\n", x - 256, 256 - y); } }
while(fscanf(fp,"%d %d",i,j)){ i-=256; j=256-j; fprintf(fp2,"%d %d",i,j); }
fscanf(fp,"%d %d",&i,&j) スマソ
#include<stdio.h> #include<process.h> void main(FILE* fp1, FILE* fp2) { int i,j; fp1 = fopen("test.txt","w"); if(fp1 == NULL) { printf("error\n"); exit(-1); } while(fscanf(fp1,"%d %d",&i,&j)==2) { fprintf(fp2,"%d\t%d",i-256,256-j); fprintf(fp2,"%c",'\n'); } fclose(fp1); fclose(fp2); } こんなかんじで作ってみました。 コンパイルして、実行してみたところ、エラーはなかったのですが 出力されたファイルが空っぽでした・・・。 どこが悪いのかご指摘お願いします。
362 :
デフォルトの名無しさん :03/12/30 01:21
361必死だな
#include<stdio.h> #include<process.h> void main(FILE* fp1, FILE* fp2) { int i,j; fp1 = fopen("test.txt","w"); if(fp1 == NULL) { printf("error\n"); exit(-1); } while(fscanf(fp1,"%d %d",&i,&j)==2) { fprintf(fp2,"%d\t%d",i-256,256-j); fprintf(fp2,"%c",'\n'); } fclose(fp1); fclose(fp2); } fp2が意味不明、というかfp1はもっと意味不明
#include<stdio.h>
#include<process.h>
void main(FILE* fin, FILE* fout)
{
int x, y;
fin = fopen("test.txt","w");
if(fin == NULL)
{
printf("error\n");
exit(-1);
}
while (fscanf(fin, "%d %d", &x, &y) == 2)
{
fprintf(fout, "%d\t%d\n", x - 256, 256 - y);
}
}
ちょっと変えてみたんですが、これでもダメでした・・・。
>>363 どういった所が意味不明か教えていただけないでしょうか?
いったいどうしたらよろしいのでしょう・・・。
>>361 main()は特別な関数だよ。
fopen()とfclose()は対にすると良いよ。
main()じゃなくして、fin=fopen()ならfclose(fin)ということでよろしいのでしょうか?
おれの書くことをそのままCにしろ ファイルポインタ宣言*2 ファイルオープン*2 入力ファイルから読み込み 出力ファイルに書き込み 上2つを繰り返し ファイルクローズ*2 OK?
問題は、foutがfopen()された痕跡が無い事。 関数の引数になってて、呼び出し側でfopen()してる場合は、 fopen()とfclose()が対になってないこと。 (fin==NULLの時foutがcloseされない。exit()にfclose()を期待するのは危険。)
とりあえず、これをコードにしてからコードの悪いところを教えてやるよ 初めからコードにするのはやめた方がいい
みなさんありがとうございます! がんばってみます。
#include<stdio.h> #include<process.h> void main() { FILE *fin; FILE *fout; int x,y; fin = fopen("test.txt","w"); fout = fopen("test.txt","w"); if(fin == NULL || fout == NULL) { printf("error\n"); exit(-1); } while (fscanf(fin, "%d %d", &x, &y) == 2) { fprintf(fout, "%d\t%d\n", x - 256, 256 - y); } fclose(fin); fclose(fout); } 上の二つを繰り返し、が良く分からなかったのですが、書いてみました。よろしくお願いします。
(´-`).。oO(久々に見たなぁvoid main
finが"w"なのと、finとfoutが同じファイルなのはご愛嬌として、 if((fin = fopen("test.txt","r")) == NULL) { printf("error\n"); exit(-1); } if((fout = fopen("testout.txt","w")) == NULL) { fclose(fin); printf("error\n"); exit(-1); } 以下OK
>>374 ありがとうございます!やってみます!!
376 :
デフォルトの名無しさん :03/12/30 02:17
全角文字列を、ある長さで分割したいのですが、文字化けしないように分割するのはどうすればいいでしょうか? ヘルプもWEBも使えない環境にいます。 助けてください。
>>372 fopenの第一引数はファイル名、第二引数は読み込み型
上の場合、入力ファイル名と出力ファイル名が同じなのが問題
さらに両方とも書き込み型で開いているのも問題
r:読み込み専用
w:書き込み専用
a:追記専用
r+:前の内容を消さずに読み書き
w+:前の内容を消してから読み書き
a+:前の内容の終わりの位置から読み書き開始
あとwhileでの繰り返しはfgetsならNULL、fscanfならEOFで判断した方がいい
378 :
デフォルトの名無しさん :03/12/30 02:18
>>376 全角文字かどうか判断するルーティンを書けば。
>>377 =367ね
>>376 wchar使うとかかな?
あとは文字コードによる
unicodeなら単純に2byteずつ読み込めばいいし
>376 多バイト文字と1バイト文字が混在してるのなら、 文字セットの仕様を知らないと無理。 文字セットの仕様はシンプルだから、ぜひこの機会に調べてみなされ。
>>378 全角文字の判定の仕方がわかりません。
どうすれば判定できるのでしょうか?
>>376 先ず、文字コードは何をお使いか?
文字化けとは、
FirstByteとSecondByteの組み合わせの問題か
表示環境の問題かを示せ。
#include<stdio.h> #include<process.h> void main() { FILE *fin; FILE *fout; int x,y; if((fin = fopen("test.txt","r")) == NULL) { printf("error\n"); exit(-1); } if((fout = fopen("testout.txt","w")) == NULL) { fclose(fin); printf("error\n"); exit(-1); } while (fscanf(fin, "%d %d", &x, &y)==2) { fprintf(fout, "%d\t%d\n", x - 256, 256 - y); } fclose(fin); fclose(fout); } できました!!!ありがとうございました!!!
>>377 >>あとwhileでの繰り返しはfgetsならNULL、fscanfならEOFで判断した方がいい
というのは
while (fscanf(fin, "%d %d", &x, &y)==2)
{
fprintf(fout, "%d\t%d\n", x - 256, 256 - y);
}
を
while (fscanf(fin, "%d %d", &x, &y)!=EOF)
{
fprintf(fout, "%d\t%d\n", x - 256, 256 - y);
}
ということでしょうか?
Visual Studioを使用しています。 全角の2バイト目で分割してしまい、1バイト目が文字化けしています。
>>385 ありがとうございます。
でも結局の所、自力では何も出来なかったです・・・。
もっと勉強してがんばります。
>>386 ありがとうございます。修正しておきます。
390 :
デフォルトの名無しさん :03/12/30 02:29
>>387 文字コードを聞いているんだよ・・・
まあShift JISだと思うが。
// Shift-JIS code // blockupper BYTEcontent // 00x00 - 20Control , space & \0 /BYTE // 10x21 - 7eASCII /BYTE // 20xa1 - dfkana /BYTE // 30x81 - 9fblock-1 followed by 0x40 - 7e 0x80 - fc // 40xe0 - efblock-2 followed by 0x40 - 7e 0x80 - fc // 50xf0 - fcblock-3 followed by 0x40 - 7e 0x80 - fc JIS X 0213
392 :
デフォルトの名無しさん :03/12/30 02:31
半角カタカナのことを考えなければ1バイト目の最上位ビットが0なら半角、1なら全角。
すまそ // Shift-JIS code // blockupper BYTE Content // 0 0x00 - 20 Control , space & \0 /BYTE // 1 0x21 - 7e ASCII /BYTE // 2 0xa1 - df kana /BYTE // 3 0x81 - 9f block-1 followed by 0x40 - 7e 0x80 - fc // 4 0xe0 - ef block-2 followed by 0x40 - 7e 0x80 - fc // 5 0xf0 - fc block-3 followed by 0x40 - 7e 0x80 - fc JIS X 0213
すみません。 レスつけていただいてるのに、まだどうやったらできるのか見当もつきません。 勉強して出直してきた方がよさそうですね。
char *sjisplit(char *str , int n) { int i,ch=0; static unsigned char *p=(unsigned char*)str; for(i=0;i<strlen(str);i++){ if( (*p>0x80 && *p<0xa1) || *p>0xe0 ){ p++; i++; } ch++; if(ch>=n) break; } return p; }
ch++; の後に p++; が必要だった。 あと、実際にはキャストが必要。
>>395 それだと、2byte目で延々止まる場合がない?
すいません。
>>395 まず、名前が変
sjissplitだろうが
厳しいな・・・
401 :
デフォルトの名無しさん :03/12/30 03:29
いきなりコードから入るからわけわからなくなる (1)メイン 文字列入力 (2)分割関数に渡す 戻りポインタを文字列の先頭にして繰り返し (2)分割関数(入力:文字列&分割後の文字列、分割文字数 出力:分割後の残り文字列の先頭ポインタ) 入力文字列の先頭ポインタを変数に代入し実際に使う (3)を行い、1byteならポインタを1進める、2byteならポインタを2進める 分割文字数分繰り返し、それ以降のあまり文字列を出力にコピー 入力の最後にナル文字を入れる (3)文字判断関数(入力:文字のポインタ 出力:1byteなら0、2byteなら1) 与えられたポインタの文字コードを見て2byteなら1を、それ以外なら0を返す 普通にやるならこんな感じだよ 無理にまとめるとおかしくなる 力があるならもう少し改良して分割関数の戻りを文字列の配列にしても面白いかも
>>384 嘘をつくな。
fscanf は入力した個数を返すから、それが期待した値と異なる場合には
なんらかの処理が必要だ。
EOFとだけ比較していると、入力ファイルに誤ってごみが入っている場合に
無限ループになってしまう。
>>395 意味も無く、p を static にするな。 リエントラントじゃなくなるじゃないか。
マルチスレッド環境では使えないぞ。
>>405 意味も無くマルチスレッド対応にするな。
資源の浪費だ。
マルチスレッドとシングルスレッドはライブラリを作り分けろ。
>>403 ゴミが入ったら(ゴミの種類によっては)個数を判断しようが
なんだろうがだめだろ
ファイルの整合性の問題はプログラムとは関係ない
まぁ、個数を入れた方がより安全ではあるがEOFでも問題ないし
より一般的というのもあってると思うが
>>402 他人のプログラムに突っ込む気は無いが
p,i,chと無駄が多すぎる
それに
>>401 が言ってるのはコードとしてのシンプルさではなく
ロジックとしてのシンプルさだろ
文字列を分割するのと文字がマルチバイトか判断するのは
別ロジックだということだ
そっちの方が再利用しやすいし
まぁ、
>>401 にしても分割関数の戻り値がよくわからんがね
>>407 私ならこのケースの場合は個数チェックにしておくね。
一般的かどうかよりも適材適所ってことで。
>>395 戻り値のポインタは呼出側で確保された領域内を指すからstatic宣言は要らんな。
>>405-406 場合によるが、特別な理由がない限りエントラントにするのでは?
>>408 3変数使わないと、別途領域チェックが必要になるから遅くなる気がする。多少ね。
>>411 速度よりも寧ろ、読み易さを重視するべきではないか?
#そして>395は必ずしも読み易いとは思えない。
読み易いコードキボン
>>407 >ファイルの整合性の問題はプログラムとは関係ない
じゃさ、常に正しい物しか渡されない前提のプログラムを組むわけ?
普通はエラー処理くらいは作るでしょ。
ファイルの整合性ではなく、ファイルの整合性が取れてない物を受け取った処理って
意味で言われている様なきがしまっせ?
プログラミングって、やっぱ数学出来る人の方が有利なんですか?
416 :
デフォルトの名無しさん :03/12/30 13:25
C言語だけでOSってつくれますか?
>>414 データが範囲内かどうかは調べるが、データがちゃんとそろってるかは調べない
そもそもscanfを使ってる時点でデータがそろってることは期待しているわけだろ?
>>355 を見てもファイルの中身は正しいのが前提なわけだし
スレ違いすまそ
>415 出来ないよりは出来るに越したことは無い >416 初期のunixはマシンに依存する部分はマシン語で書かれている 今はクロスコンパイル環境さえ十分に整っていれば C言語だけで書くことも可能だろね
419 :
デフォルトの名無しさん :03/12/30 13:32
OSをつくるにはどのような手順を踏めばいいのでしょうか?
>>412 個人的には
>>395 みたいなのアリだと思った。
別にトリッキーな事はやってないし。
読み易い15行のコードと、読みづらい5行のコードのどちらがいいかは、好みの問題だろう?
数行で済むアルゴリズムをわざわざ分割して再利用するのは几帳面過ぎないか?
システムコールは厳密にはCだけでは作れない。
エミュレータを使えば開発しやすいか。
425 :
デフォルトの名無しさん :03/12/30 14:11
printfとか使えないんだよね!!
使えなければ作れ。
>>423 標準ライブラリが使えるのか。
すげーな。
てか、FreeBSDのベアボーンだな。
428 :
デフォルトの名無しさん :03/12/30 14:22
10行でOS(^o^;) VM Wareがあればやってみたいもんだ。
>>420 私も読み易いコードなら長くてもいいとおもうよ。
尤も、読み易くてもより処理がシンプルになる選択肢があるならそのほうが尚いいと思うがね。
>>417 喩え正しいデータを受け取ることを前提とできるとしても、
コストを掛けずに汎用性を上げられるのならばその方がいいとは思わんか?
#さて、そろそろ読み易いコードの実例を書いてみろと言われそうだな……
431 :
デフォルトの名無しさん :03/12/30 15:17
関数に値を変更しないと分かっているポインタを渡す際、 仮引数宣言でconstを付け加えるのは、常識ですか?好みの問題ですか?
Shift-JIS自体、
>>395 のように処理される
事を想定して制定されたコードだろう?
綺麗さを捨てて、効率を取った。
私のコードに擁護レスがw わかりにくいという指摘はごもっとも。 staticは不要でconstが必要というのも 勉強になりました。感謝。
ASCIIはビットのON/OFFで大文字/小文字の変換が出来るように並べたらしいね。
誰もマルチバイト文字列関数に触れないところが冬休み…なのか?
437 :
デフォルトの名無しさん :03/12/30 17:56
いつの間にかJISで読める規格書がC99のものになっとる。 つい最近までは古い規格のものだったのに。
>>436 アレはちょっとなぁ、と思ってる人が多いんでないかい?
どちらかというと、VCとかDelphiとか、手軽に購入出来る 処理系で素早く整備されたと思うが?<マルチバイト対応
>>401 も前は間違っている
文字列をn文字で分割したいが、そこが2バイト文字の1バイト目だったらn-1かn+1にしる!
ってのがやりたい事だろ?
だいたい「入力の最後にナル文字を入れる」って元文字列をどーするつもりだ
○ |\ /| ̄|○  ̄
冬休み、早く終わんねーかな。
夏休みはよこねーかな
必死に考えた切り返しがそれか、程度が知れるなw > 447
449 :
デフォルトの名無しさん :03/12/31 16:38
・・・お前らに聞いてもだめそうだな。
ポインタってどこまで掘り下げて勉強すればいいの? 例えば、2次元配列がややこしいから、ゴリ押しで一次元でやっているのは やり方としてはどうなんでしょうか?
>>450 二次元配列は1次元配列の1次元配列だから
大した変わらな(・∀・)イイ!!
多元配列を一次元で考えるのがポインタじゃぁー。
多次元配列意味不明いってよし
>>543 C++使えば?
クラス化すれば多少分かりやすいし。
多次元配列って、配列の配列ってやつだっけ。 それよりもポインタのポインタってどういう時に何のために使うのかイマイチ分からん。 誰か教えて偉い人。
>455 質問の中に答えがあるのも珍しい・・・
2次元以上ってマスターする必要ありますか? 2次元ならなんとかOK。
次元が上がるほど、ポインタを用いた時との 速度差が拡がるからあまり使われない。 科学技術計算でよく使われるけど、一般に 説明は配列でも実装はポインタ。
メモリ上にどのようにして確保、アクセスされているか理解すればいいんだよ
頑張ります。
童貞プログラマーが使ってそうな言語NO.1
俺も28歳童貞ですが何か?
俺はC一筋の20歳童貞
なーんだ。みんなそうだったのか。 C好きだが最近Javaもやる25歳童貞
ごめむ。俺も童貞…。 ってなんだよこの流れヽ(`Д´)ノ
Cしかわからない童貞22歳
>>457 3次元まではマスターする必要がある。 なぜなら、3次元までは可視だが 4次元からは抽象的なものになるから。 (例:時間とか) だからそれを理解するには人間では限界 がある。進化論を勉強したほうがいい。
色々使ったがC/C++が一番性に合う非童貞独身30代ですがなにか。
このまま童貞だと妖精になれる。
ループも配列も三重以上はやだー
>>471 わがまま言うならもうC言語やんなくていいよ。
たとえば、ビットマップは{a,r,g,b}の色配列が xyの2次元に並んでる3次元配列と言えるね。 で、作業用にビットマップをもう一枚続けて 確保する事がよくある。これで4次元配列。
>>473 typedef unsigned char byte;
typedef struct {byte a, r, g, b;} Color;
typedef struct {int width, height; Color** pixel} Bitmap;
Bitmap bitmaps[N];
っていう風にしる。
変換行列で平行移動も行うには4次元必要だし、 色もα透過含めるなら4次元必要だし。
bitmaps[i].pixel[y][x].b bitmaps[i][y][x][BLUE] …好みの問題だな。
>474 さっそくのご指摘感謝です、が、4次元配列の例を示したまでで、 実際にはrgbはint/32bitで、あとはポインタでやっとります。 あ、最後のindex(作業用バッファ)は使うかな。
479 :
デフォルトの名無しさん :03/12/31 20:13
助けてください。疑問が解けません。 main関数を int main( int argc, char *argv[] ) として、プロトタイプ宣言が void hoge( int argc, const char *argv[] ); の関数を、mainの中で、 hoge( argc, argv ); で呼んだら、コンパイル時に、 passing arg 2 of `checking_arguments' from incompatible pointer type と警告されたんですが、何が悪いんでしょうか? hogeでは配列の内容を書き換えないから、読み取り専用にしてしまえと constを付けてみたんですが、警告される理由がわかりません。 読み書き用から、読み取り用に代入(?)はOKだと思ってたんですが…
sageるの忘れてしまったんですが、まずかったかな…? スミマセン。
(const char **) キャストしなされ。
レスthx
>>481 。
まず、イロイロ試したら判ったんですが、
>>479 はconstの位置が悪かったようで、
void hoge( int argc, char *const argv[] )
が自分のやりたかったことでした。
>>479 のだとargv[0]=NULL;とか普通に出来た… つД`) そんなこと、どーでもよいですね…
…やっぱり、(const 何々)なキャストしないと駄目なのが理解できません、ママン
char c=0;
char *cp;
const char *const_cp;
で、
cp = &c;
const_cp = cp;
は、普通に出来るのに…何でぇ…
配列a[0]とa[1]の数値をそれぞれ0100,0011としたとき、 それをbに01000011(繋げたもの)としてやりたい場合、 どうすればいいでしょうか?よろしくおながいします。
argvのポインタは二重になっていることに気づいているか? 仮引数における char *argv[] は char** argv と同じ。 T から const T の変換は暗黙にできるがそれとは話が違う。
>>483 その数値のスペックによるがかによるが、n 進数 m 桁としたとき、
c = a * ( n ^ m ) + b
という処理をしたいのか?
C言語でやる場合
n が 2 ならば a << m 、それ以外なら a * pow( n, m) とすることになる。
他のも文字列を経由する方法もある。
char s[BUFSIZE];
sprintf( s, "%d%d", a, b);
c = atoi(s);
まわりくどいが柔軟性はこうしたやり方の方が上だし制御もしやすい。
b=(a[0]<<16)+a[1];
>>483 百と十一を繋げて、百万十一にしたいんだな。
b=(a[0]<<12)+a[1]; すまそ。
>>486 atoi()よりsscanf()の方がいいんじゃないかな?
>>484 T*からconst T*の変換は暗黙にはできないのか?
ここではT==char*になるわけだろ
492 :
483=181 :03/12/31 21:24
みなさんthxです。 頂いたレスを参考にやってみます。
普段8進数なんて使わないもんねー。
>>491 だいじょうぶか? 全然話が通じていないようだが。
今は T** から const T**の変換の話をしていて、これはできない。
さらに突っ込むと T が char* なら const T は char* const なんだが
>>479 型宣言をする事と、実際に値を代入するのは違うということでは?
ちゃうって。暗黙の変換が可能か試してみればわかる。 char -> const char ... OK char* -> char* const ... OK char* -> const char* ... OK char** -> char** const ... OK char** -> char* const * ... OK char** -> char const ** ... NG
const/volatileはかなり嫌らしい修飾するよなぁ。 右でも左でも良いという規則からしていいかげんつうか。
激しくthx
>>496 >>497 >>498 言われて、試して、それなりに納得。感謝。
何故、 char** -> char const ** だけ出来ないんでしょうか?
暗黙で const に変換できるのはポインタ一個分までと偉い人が決めたからとか?
なんかの本に載ってますかね?
ついでにもう1個質問。
上で出たし、普段同じように使うのですが、
**argv と *argv[] は関数の引数で使うときは
プリプロセッサは全く同じ変換をしますよね?
501 :
デフォルトの名無しさん :03/12/31 23:44
>>499 プリプロセッサはCの構文に関しては関知しないはずだが。
変換というかその二つを同じものとして扱うのはコンパイラ。
ちょっと概念の分化が不十分だなあ。 二重のポインタに対して 大元のポイントされる型を const 修飾した型ってのは二通りある。 すなわち T const** と T const * const* だな。 基本ルールとして T* -> const T* ( = T const* ) の変換は安全にできる。 ここから T** -> T* const* -> T const * const* といった変換可能性が導出される。 論理的にこの変換は基本ルールに則った安全な変換だ。 しかし、 T** -> T const ** はさっきの前提からはどうあがいても導出できない。 逆にいえば基本ルールの安全性が得られていない変換ということになる。
nRESET
504 :
デフォルトの名無しさん :04/01/01 02:59
C言語のプロの皆様に質問です。 char* c; c = (char *)malloc(110); long l = (long)&c; ←A Aの部分の様な使い方は誤りでしょうか? 要は、メモリのアドレスを格納しておきたいだけなのですが、 何型で管理すればいいのかなと思って。
505 :
C言語のアマ :04/01/01 03:11
>>long l = (long)&c; アンパンサンドいらないんじゃないの?
>>504 c=のような代入文の後ろにlong lのような定義が書けるコンパイラならlong longじゃないか?
>>504 アドレス格納しておきたいだけならポインタ型で充分。
わざわざlong型にする必要性は皆無。
大昔に、malloc()の返す型が char*からvoid*に変わったのは何故だろう
とすると、 void* のまま管理していけば良いと言う事でしょうか?
何の為に管理したいのか知らんが freeだけに必要ならそれでもいい。
なるほどー アロケートした時のアドレスと、解放したときのアドレスが 同じかどうかをチェックしようとしてたのです。 ありがとうございます。
void* ならキャストしなくても代入できるから。
K&Rを買う前までは、
>>513 と同じ理由で、
>>508 の言う変更になったと思ったのだが、
K&R(の第2版288刷のP204)において、(他の刷でも近い場所と思う、)
「mallocあるいはcallocから返されるポインタは問題のオブジェクトに合わせて整合されるが、
以下のようにそれは適当な型に変換しなければならない。
int *ip;
ip = (int *)calloc(n,sizeof(int));」
とあり、これは、( type*->void* は暗黙の変換が許されているがしかし、)
その逆の void*->type* は型変換が必要である、と読める。
しかし、私の環境では、実際プログラムを組むにあたって、
キャストが無くても警告すらされない。
実際のところはどうなのだろうか?
質問があります。猫でもわかるプログラミング 第25章で static char s[] = "ABCDE"; char *ptr; ptr = s; while(1) { putchar(*ptr++); if(*ptr == '\0'); break; } というコードがあるのですが、うまく動きません。 コマンドプロンプトに「ABCDE」と表示されるはずが 「A」と表示されるだけです。 なぜでしょうか、bccを使っているのですが、 これが処理系による動作の違いというものですか? ちなみにwhileの部分を下のように書き換えると、 「ABCDE」ときちんと表示されます。 while(*ptr) putchar(*ptr++) 教えていただけないでしょうか? よろしくお願いします。
>if(*ptr == '\0'); >break; if(*ptr == '\0') break;
>>500 >>501 >>502 、とにかく相談に乗ってくれた人ありがとうございました。
const の疑問は、
「
暗黙の const へのキャストは、
type -> type const
type * -> type const *
が基本ルールとしてある。
」
これを知らないことが原因でした。
>>514 古いコンパイラとの互換性のためじゃないか?
VC++ とかって、拡張子 c にして(C言語として)コンパイルかけると
現在の標準に準拠してるかよりも、互換性優先な感じがするし。
拡張子 cpp (C++)だとちゃんと警告出るはず。
>>518 C++ではill-formed、つまりエラー。警告ではない。
Cでは合法。警告は、処理系提供者の任意。
520 :
デフォルトの名無しさん :04/01/01 14:56
ファイルサイズを取得する方法を教えてください。 DOSやWindowsではfilelengthという関数があるのですが これは移植性が低いので、UNIXでも使える方法で何かないですか?
EOFが返ってくるまでfgetc
522 :
デフォルトの名無しさん :04/01/01 15:02
>>520 longであらわせる範囲までなら、ファイルの末尾にfseekしてftellで得る。
fgetpos の fpos_t から fpos_t の実装方法ごとに #if で分岐して 64 ビット値を得るとか。
#define HIST 10 int index double do_index; int hist[HIST]; scanf("%d", &n); srand((unsigned)time(NULL)); for (i = 0; i < n; i++) { do_index = (double)rand() / (0x7FFFFFFF / (HIST-1)); printf("do_index = %g\n", do_index); index = (int)do_index; printf("index = %d\n", index); hist[index]++; } ある本に載っていたものなので少し変えました indexが必ず0になってしまいます どうすれば良いですか?
525 :
デフォルトの名無しさん :04/01/01 16:56
>>524 do_index=index=rand();じゃだめなの?
あら、、、/以降がコメントだと勘違いした。スマソ
× do_index = (double)rand() / (0x7FFFFFFF / (HIST-1)); ○ do_index = (double)rand() / (0x7FFFFFFF / (HIST-1.0)); ○ do_index = (double)rand() / (0x7FFFFFFF / (double)(HIST-1));
RAND_MAXの値を調べてみるといいよ。 ものによっては0x7FFFとかだったりするから。 そうすると常にdo_indexは1未満になってしまう。
>>524 そりゃ do_index が常に 0 以上 1 未満の数になるから
int にキャストすれば 0 になるやろ。
まぁ、厳密には RAND_MAX の値に依存するけど。
0x7FFFFFFFがどこからきたのか分からないけど、それをRAND_MAXにすれば解決しそうな予感。
>>520 longサイズ以下なら
>>522 が最も確実。
ただ、現実的にはstat()が使えることがほとんど。
それ以上のサイズ(通常2G/4G)を得るには
各OS固有のAPIを使う必要がある。
ありがとうございました。RAND_MAXにしたらできました
fgetpos 使えば一応 64 ビット値でも得られるけど、 fpos_t がどう定義されてるかは実装依存なんだよな。
>>533 fpos_tは構造体でもかまわないしな
まぁ、そんなでかいファイルなんぞ、 巨大データベースや巨大科学計算、 そしてマルチメディア関連でしか使わんだろうがな。
マルチメディアでも動画くらいか?
DVD
>>516 ありがとうございます。
ただのタイプミスでした。
ちゃんと動きました。ありがとうございました。
質問です。 scanf()って必ず入力が要る関数ではないんですか? ショボいプログラム作って、間違った値を入力した時にエラーを返す所だったんですが、 ループで戻してやったら、scanf()全部吹っ飛ばしてプログラムがクラッシュしました・・・・ 何故・・・・・ 確かにscanf()の所は通ってるんです。 でも入力もしてないのに、勝手に突っ走ってしまうんです。 具体的には、数字を入力する所で、英文字を入力すると、こういう症状が見られました。
>>539 「クラッシュ」っていうのはどういう現象を言っていますか。
マイクロソフトに連絡しますかっていうダイアログが表示されたとか
ディスクが勝手にフォーマットされたとか、そういうことですか。
>>539 scanf()とはそうしたもの。
回避するには使わないのが一番。
#つーか、判らないのに使うなよ。
>>515 「猫」ってコードが汚いって感想をよく見たけど、
確かにひどいサンプルですなぁ。
関係ないのでsage。
俺も猫のコードには異論を持っている部分はあるが、 わかってからきれいに書けというポリシーには賛同している。 同じポリシーで俺が書くと違うってだけで。
547 :
デフォルトの名無しさん :04/01/02 02:28
age
548 :
デフォルトの名無しさん :04/01/02 03:04
>>545 君ならドウ書くのか書かないといかんですな。
549 :
デフォルトの名無しさん :04/01/02 03:43
>>545 あのベージ初心者にやさしいようなやさしくないようところですからね。
550 :
デフォルトの名無しさん :04/01/02 04:23
ちょと思ったんだけど、 一つのアプリが起動している最中に、 mallocして、例えば0001番目を確保して、 その後freeして解放するじゃない。 んで、アプリは起動したままで、別のルーチンで、 またmallocした場合、0001番目のアドレスを使う事ってあるの? 一度freeしてるから、使わなくも無いような気もするけど、 どうなのかな?
>550 プロセスのメモリ空間は互いに独立している
>>551 別のルーチンでとなっているから、同じプロセスと思いますが…。
>>550 使われるかもしれない。
>>551 それは多重仮想記憶の場合のみ
単一仮想記憶やあえて実記憶というシステムには当てはまらない
>>550 使ってもよいし使わなくてもよい
mallocは関数なので自分で実装してもよい
その場合に守るべき基準がISO/IEC9899もしくはJIS X3010あたりの
規格票に書いてあるわけだが、まずそれを読まないことには議論もクソない
21世紀にMS-DOSの話かよ(藁
555 :
デフォルトの名無しさん :04/01/02 05:45
う~ん。 使う事もあるって事ですね。 わかりました。 ありがとうございまし。
Kさん 好循環 Aさん 悪循環 (健康体) (喘息) 1.(神が喘息であるかないかを決める) 2.K 喘息でない人 A 喘息の人は は体力がある 体力がなくなる 3.K A 行動力、 五感(嗅覚)が鈍り感性が変化する 4.K&A 神は異常な感性の人間は本来人に迷惑をかけ るから外に出てはいけないと思っている。 5.K 変化なし A アトピーになる 6.K 正常な感性 A 外に出なくなりさらに異常な感性になる 7.K 正常な人間 A 異常な人間(レッテル) 8.K&A 死 9.K&A 来世 10.K&A 神は異常な人間は人に迷惑をかけるので行動 を抑制する必要があると思っている。 11.K&A 神が喘息であるかないかを決める 12.K 喘息でない A 喘息である 13.K&A 1.に戻る これは事実。広めようぜ 解決法: 体力をつけると感覚が正常に戻り、 アトピーも快癒に向かう。 目安としてグランドを10週くらい。 あとはウォーキング 2.3時間を目安にウインドーショッピングや本屋めぐり 寝て起きて、やな気分でも、続けるけること。
557 :
デフォルトの名無しさん :04/01/02 05:54
やっと構造体までたどり着きますた。 でも構造体と関数とポインタが混ざり合ったものなんかわけわかめ・・。 参照渡し、アロー演算子 わけわかめ。 この先長いなぁー。 (-_-)ハ~ 誰かなぐさめてくりくり。
558 :
デフォルトの名無しさん :04/01/02 06:46
初心者です。習いたてです。 %d \n %s %c などの記号には正式な読み方があるのでしょうか? 手持ちのテキストには書いてありません。 自分流にパーセントディー、エンエスと言う風に読めばいいんでしょうか? また記号には意味があるのでしょうか? 例えばHTML言語なら、 BR=BREAK=改行 と言ったように、意味のある言葉の省略系だった りしますね。 意味を理解できると憶え易いんですが、単に記号を当てはめている だけなんでしょうか? また、関連事項について説明してあるサイトなぞ教えていただけると ありがたいです。
>>557 がんばれ。エベレスト登山一合目だがその調子で登りつめていけば頂上には
いつか辿り着けるぞ。
>>558 %d : decimal「10進」
%c : character「文字」
%s : string「文字列」
\n : new line「改行」
だと思うぞ。関連は分らないです。
560 :
デフォルトの名無しさん :04/01/02 07:54
あの~ちょっと質問なのですが、 デバッグのときに、エラーが発生したら、 どのファイルのどのラインで発生したのかを知りたいのですが、 どうすれば、ファイル名とラインを取得できるのでしょうか? すみませんがお願いします。
えっ。デバッグで分らない。一行づつ追えば分るはずだよ
>>560 __FILE__マクロや__LINE__マクロを使え。
>>558 \nは「バックスラッシュ・エヌ」だ。
それと、エスケープ文字とフォーマット指定子をごっちゃにするような覚え方はよくない。
>>557 大丈夫、そのうち慣れるさ。
#慣れなきゃ諦めるだけ。
>>558 みなさん、ありがとうございます。%d
の%はパーセントと呼べばよろしいのでしょうか?
また%d : decimal「10進」ということですが、テキストでは
整数を表すと説明されています。よろしいでしょうか?
%f( 数字を小数点付きで表示します) の方も宜しくお願いします。
>>560 ∧_∧
( ´∀`) <assertモナー
( )
| | |
(__)_)
>>563 %dは整数を10進数で、という意味で頭文字dにはintegerまでは含まれていない。
どうしてかって?
printfはもともとC言語の前身であるB言語にあったものでB言語には型がなかった。
いわばintしかない言語だったのでいちいち断る必要もなかったわけだ。
%fはfloatだろう。しかし、現実にはdoubleだよな。これは格上げと言って
float型の実引数を可変個数引数に渡すとdouble型への変換が起き、
関数が受け取る仮引数はdouble型だったりするからだ。
しかし格上げが起きるのはprintfだけでscanfでは格上げが起こらない。
このため、scanfではdoubleが%lfとなっていたりする。long floatだろう。
(さっきから「だろう」と言っているのは、ソースを示せないからだ)
特定の型、float に限定せず、floating point number(浮動小数点数)と解釈すればいいかもね。
567 :
デフォルトの名無しさん :04/01/02 14:09
>>565 一口に整数を表示といっても、8進や16進もあるからかと。
568 :
デフォルトの名無しさん :04/01/02 18:00
入力の後改行せずに表示するにはどうすればいいですか?
569 :
デフォルトの名無しさん :04/01/02 18:24
すいません、C言語の超初心者です。
エクリプスのスレの
>>5 の
『●プラグイン解説
Eclipse with CDT
http://www.lares.dti.ne.jp/~sakaki/eclipse/EclipseFirst.html Sysdeo Eclipse Tomcat Launcherの解説ページの対訳 』
を実行し、エクリプスでC言語を組めるようにしたつもりなのですが、
ここで詰まってます。
プログラムはprintfとscanfを用いた簡単なものなのですが、
scanfをどこに配置しても、すべてのscanfが最初に動きます。
つまり、プログラム中にあるscanfの数だけ入力して初めて
scanf以外のプログラムが動くのです。
これの原因がわかるかた、どうかお教えください。
バッファリング
540と、その他scanfにまつわる危険性をグーグルでそこそこ見ましたが、 それでも解決策が見つかりません。 例えば printf("hoge\n"); scanf("%d",&a); printf("hogehoge\n"); scanf("%d",&a); のように、scanfを要所要所にちりばめても、 プログラム実行時、一番最初に全てのscanfが実行されて、 その後にscanfを抜いた全プログラムが実行されてしまうのです。 どうか、これについてヒントでもいいのでお教えください。
>>576 > 540と、その他scanfにまつわる危険性をグーグルでそこそこ見ましたが、
> それでも解決策が見つかりません。
じっくり読めば解決策が書いてある。
578 :
デフォルトの名無しさん :04/01/02 19:14
>>576 570のお年玉大サービスをスルーしている限りお主に出口はないと予言する。
scanfを使うときは戻り値を必ずチェックしろ。当然ながら意味をよく調べたうえで。
別におかしな動作はしてない。 コンソール出力のタイミングを指示したい場合は stdout を明示的にフラッシュしないといけないだけ。
/* * バッファですかなるほど、とてもいいことを聞きました。 */ #include <stdio.h> #include <time.h> #include <stdlib.h> #include <string.h> int main(void) { char ojikan[26]; time_t *t = calloc(1, sizeof(time_t)); struct timespec *timeout = calloc(1, sizeof(struct timespec)); timeout->tv_sec = 3; while(1){ time(t); strcpy(ojikan,ctime(t)); ojikan[24] = '\0'; printf("%s\r",ojikan); #ifndef __BUG fflush(stdout); #endif nanosleep(timeout, NULL); } /* NOT REACHED */ }
583 :
デフォルトの名無しさん :04/01/02 21:50
typedef struct{ char name[16]; int age;; char pop; }HOGE; static HOGE p[MAX_COUNTS]; こんなのがあって、 p[i].nameの値が分かってる場合 iを出すにはどうすれば良いのでしょうか? 下手な質問でスマソ
for( i=0; i < MAX_COUNTS; i++) { if(strcmp(p[i].name, value) == 0 ) { result = i; break; } }
構文が変なところはさておき。 双方向マッピングの仕組みを構造体に追加するんでなければ ループをまわして検索するしかない。 char name[] = "I am the target string."; int i; for(i=0;i<MAX_COUNTS;++i) if( !strcmp( p[i].name, name ) ) break; if( i != MAX_COUNTS ) printf("%d th element has name \"%s\".", i, name ); else printf("no element has name \"%s\".", name );
>>585 ありがとうございます。
早速やってみます。
>>583 pがnameをキーとしてソートされているならbsearch()が使えると思う。
589 :
デフォルトの名無しさん :04/01/02 22:12
『標準入力からテキストファイルを読み込み、単語を検出して辞書順に並べ、出現頻度を標準出力に出力しなさい。』 って宿題があるのですが分かる方お願いします。オートマトンとかそういうのを使っていたと思うのですが・・・
>>589 宿題丸投げは別スレって
>>1 に書いてあるのだが、
その内容は間が悪いな。
なぜ次のコードは#include~なしで動くのか? int printf(const char *,...); void main(void) { printf("ああああ\n"); };
printfの入っているライブラリ(例えばlibc.soとかlibc.a)とlinkするから。 コンパイラは何もしなくても-lcとしてくれる。
動くとは限らんけどな。
>>ゴクミ?w 一応マジレスしておくと、 既存のライブラリを利用する場合は規定のインクルードファイルをincludeするのが常道だ。
アセンブラ読むときなんぞ、あえてextern printf();とかすることはあるが 本ちゃんで使うときは、そいつのマニュアルに書いてある方法をなるべく遵守するよな
>>593 最後のセミコロンが気になってしかたがない
関数はプロトタイプ宣言さえあれば呼び出しても問題はない(コンパイルまでは)。 が、他に実体がある関数を使う場合は 該当関数の仕様が知らぬ間に変更されたり プラットフォームごとに微妙に異なる可能性もあるんで 対応するプロトタイプ宣言の書かれたヘッダをインクルードしないとあかんよ。 あとCでは main の戻り値は int だ。
>> Cでは ハァ?
>>600 残念なことに JAVA では void
「ANSI Cでは、main関数の型はintです」って書けやゴルァ
ひっしだな
599が?
K&Rでも(ry
>>604 >>1 ここは基本的に標準C前提だったと思うが?
少なくとも「ハァ?」という返答を受ける覚えはない。
ひっしだな
みんなな。
*すれ立てるまでもない質問はここで 第48刷* でダメみたいなんで、ごめんなさい。 InternetExplorerの履歴やお気に入り、 マウス無しのキーボード操作だけで、 幅の調整をできませんでしょうか?
>>540 のリンクで一番初めに出てくる「scanfの利用にはご注意を!」で、
「最後の文字が二重に読まれる!」の、どこが問題なのか良く分かりませんです。
むしろ、
「尚,以下のOSではこれが起こりません.
Linux 2.0.36 #4 i686 unknown(plamo-1.4.1), gcc version 2.7.2.3 」
が普通でない(定義されてなくて自由なのかな?)動きのような気がするんですが。
feof()は指定したFILE型構造体の中身(状態?)を見るもので、
ストリーム(の今指しているところ)が、EOFかチェックするんでないと思うんですが…
それとも私(↑)が、勘違いしてますか?
feof()はscanf()が失敗した理由を調べるために使え >615は勘違いしてない [もれの意見だが] Linux 2.0.36 #4 i686 unknown(plamo-1.4.1), gcc version 2.7.2.3 は読めなかった時にNUL文字にしているのであろう
thx,>616 >[もれの意見だが]… 私もそう思いました。 つまり、>615で挙げているページは検討の仕方に問題があった、 ということで問題ないですね? [yes] -> 終了。ありがとう御座いました。 [no] -> 突っ込みをお願いします。
char *my_strstr(char *s,char *p){ char *cs=s,*cp=p; while(*s){ while((*cs==*cp)){ cs++; cp++; } if(*cp=='\0') return s; s++; cs = s; cp = p; } return NULL; } char *my_strrstr(char *s, char *p){ char *cs=s,*cp=p; char *save=NULL; while(*s){ while((*cs==*cp)){ cs++; cp++; } if(*cp=='\0') save = s; s++; cs = s; cp = p; } return save; }
620 :
デフォルトの名無しさん :04/01/03 23:53
callocってどんな時使うの?
>>620 メモリ確保。
mallocと違うのはこっちは初期化をするということ。
もしかして
>>620 はmalloc(とmemset)あればcallocいらないんじゃないのかって言ってる?
そこは宗教論争になるんで返答不可ってことにしたい。
callocのcは何の意味なの? すこし気になるんだけど・・
もしかして
>>620 はシーアロックではなくカロックと呼びたいし
strtokもストリトークンではなくスタートオーケー
って呼びたいとか、そういうことを言いたいの?
putchar→プッチャー
C言語のCだが、漏れはcellだと思う。
627 :
デフォルトの名無しさん :04/01/04 01:04
Cell? Clear? どっち?両方かな?
違うな clean (メモリ) の C だ
C辞典にはCell/Clear Allocate と中途半端に書いてあって よくわからない罠。
C言語のCはComputerのC
ComputerのCはcallocのC
6文字制限の名残だな。
>>634 8文字じゃなくて?
6文字じゃfgetposとかでひっかかるよ。
strncpyも
>>622 やれやれ、また宗教論争かよ
# 批判に耳をふさいでるヒヨッ子こそ、こっちから願い下げだ
C マガジンの C は Computer の C
C is next to B.
>>638 おいおい
ここは質問スレなんで議論は余所でやってくれ。
scanfで、でたらめを入力すると、あとの処理が... というのが話題になってましたが、 hell: if( scanf("%d", &n ) < 1 ){ fseek(stdin, 0, SEEK_SET); goto hell; } というようにすると、うまくいくような気がしました。 これでいいのでしょうか?
>>642 永久ループすると思うのだが
関係ないが巻き戻すならfseek()よりrewind()使え
>>642 scanf の戻り値の 0 と -1 を区別しろよ。
-1 は EOFなんだから、それ以上読もうとするなよ。
変換したかった個数と、実際に変換された個数が異なるときは
入力の誤りだから適当にリカバーすべし。
>>642 自分で書いてる「でたらめを入力すると、あとの処理が...」の意味が分かってンのかと
>>643 標準入力をrewind()するな。それがブロックデバイスの場合、
再入力することになる。
素直にfgets+sscanf使えや
fseek(stdin,0,SEEK_SET);とrewind(stdin);はエラーをクリアするかしないかの違いだけじゃないの?
C言語で大学とかで出る 問題ってどんなの?
652 :
デフォルトの名無しさん :04/01/04 17:07
>>651 『標準入力からテキストファイルを読み込み、単語を検出して辞書順に並べ、出現頻度を標準出力に出力しなさい。』
って宿題があるのですが分かる方お願いします。オートマトンとかそういうのを使っていたと思うのですが・・・
うわらば
画像をx、y、z軸に対して任意の角度で回転させるプログラムを 作らなくてはなんですが、どなたか教えてください。 画像の中心がx、y、z軸の原点になります。
Cと関係ないような・・ アフィン変換でもしてください
>>655 >>1 明らかにC言語の問題じゃないわけだが。
しかも画像なのに何で3次元で回転してるんだ。
まあ1つだけ言ってあげるとアフィン変換かクォータニアンでぐぐれ。
長くてすみません。gccで以下のソースをコンパイルするとき -I./include をつけると構文解析 エラーが出てしまいます。(以下のソースではヘッダファイルを必要とする部分が端折ってあるので 付ける必要はありませんが、本当は独自のヘッダをインクルードしています。ただし、エラーが出 るのはどちらも一緒) man gcc を見ると -Iオプションは指定されたディレクトリをヘッダファイルの検索パスに追加 するとありますが、これを指定すると既存の検索パスを無視するかのように振舞います。 -I./includeなんて単純な指定はMakefileで一般的だと思うのですが、何か対策はありませんか? test.c #include <string.h> /* stdio.hをincludeしても変化なし。 */ #ifndef __USE_XOPEN /* unistd.hの直前で定義しないとundefされ crypt()で警告がでる */ #define __USE_XOPEN #endif #include <unistd.h> #include <pthread.h> /* */ pthread_mutex_t _passwd_t = PTHREAD_MUTEX_INITIALIZER; int is_match_passwd(char *usrnamesrc, char *usrnamedst, char *passwdsrc, char *passwddst) { char salt[3], passwd[80], *passwd_encoded; salt[0] = passwddst[0]; salt[1] = passwddst[1]; salt[2] = 0; pthread_mutex_lock(&_passwd_t); /* OSの領域?なのでロックしてみる */ passwd_encoded = crypt(passwdsrc, salt); strncpy(passwd, passwd_encoded, 76); passwd[79] = 0; pthread_mutex_unlock(&_passwd_t); /* アンロック */ if ( (strcmp(passwd, passwddst) == 0) && (strcmp(usrnamesrc, usrnamedst) == 0) ){ return 0; } return -1; }
続き $ gcc test.c -I./include -c In file included from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/include/pthread.h:664, from test.c:6: /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/include/bits/sigthread.h:41: error: 構文解析エラー before '*' token ちなみに、gcc -v はこうなってます。 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/specs から spec を読み込み中 コンフィグオプション: ../configure --prefix=/usr --enable-threads=posix --enable-languages=c,c++,java スレッドモデル: posix gcc バージョン 3.3.1
>>648 >標準入力をrewind()するな。
誰も「標準入力」をrewind()しろなどと言ってない。
661 :
デフォルトの名無しさん :04/01/04 17:40
「関係ないが」 これがくせ者か(藁
>>660 詭弁だね
scanfとfseek(stdinを使っている642に対するレスでrewind()使えと言ったあんたが
他にどんな解釈を期待していたんだよ
間違いを指摘されたときの態度としては最も見苦しい定型レスだ
バカは放置
>>662 巻き戻すならfseekを使わずrewindを使えと言っているだけだ馬鹿。
>>655 Bresenham (もしくはブレゼンハム) と 回転 でも検索してみれ。
>>657 クォータニアンの方が英語の発音に近いけど、
クォータニオンじゃないとろくに引っかからないと思われ。
クォータニエン
クォータニエンに該当するページが見つかりませんでした。
問題なんか教えて
>>665 (゚Д゚)ハァ?
そんなら642は巻き戻すとは言ってないだろ
見苦しいっつってんだよ、いい加減にしろ
int f(int k[30],int i){ int i; for(i=0; i<=29; i++){ k[i]*=10; } return k[i]; }
ネタか? マジレスするとループが終わった時点で i > 29 なんで k[i] はアクセスしちゃいかんよ。
int f(int k[30],int num){ int i; for(i=0; i<=29; i++){ k[i]*=10; } return k[num]; }
こんな感じでどうかしらん。 int koma_serch(int i,int j){//指定マスの駒情報 if((i<0)||(i>7)||(j<0)||(j>7) ){ printf("table number error_s\n"); return -1; } switch(osero_table[i][j]){ case WHITE: return WHITE; case BLACK: return BLACK; case EMPTY: return EMPTY; } return(-1); } int set_check(int i,int j,int turn){ //駒を置けるか確認 int l,m,komar; int r,s; komar = color_change(turn); if(koma_serch(i,j) != EMPTY) return -1; for(r=-1;r<2;r++){ for(s=-1;s<2;s++){ l = i; m = j; l += r; m += s; while((osero_table[l][m]==komar)&&(l>=0)&&(m>=0) &&(l<=7)&&(m<=7)){ l += r; m += s; if((osero_table[l][m]==turn)&&(l>=0)&&(m>=0) &&(l<=7)&&(m<=7)){ return 0; }}}} return -1; }
678 :
デフォルトの名無しさん :04/01/04 18:55
んー、質問が長かったようで短くします。linuxでのお話です。(TurboLinus8WS) pthread.hをインクルードしているソースをコンパイルするとき gcc foo.c -c -I./include を実行すると、既存のヘッダファイルの検索に失敗 するようです。man gcc をみると、-Iオプションは指定ディレクトリを検索パスに 追加するとあるのですが、指定したパス以外を探さなくなりました。 何が問題なのでしょうか。setとかexportとか見ても問題はありませんでした。 どこのソフトも-I./とか-I../includeとかいう指定はやってるはずなのに何故か うまくいきません。 In file included from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/include/pthread.h:664, from foo.c:6: /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/include/bits/sigthread.h:41: error: 構文解析エラー before '*' token
>>679 GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
GCC スレがあるはずなのでそっちに行ってちょ。
681 :
デフォルトの名無しさん :04/01/04 23:39
コードが長くなりすぎて、メモ帳ではメモリ不足になってしまっているようなのですが、 フリーコンパイラーを使っているために、ファイルの分割などが上手く出来ないようです。 このような時の、うまい回避方法はないでしょうか? よろしくお願いします。
682 :
v(^o^i)d :04/01/04 23:45
>>681 そのコンパイラにmakeとかそれに近いプログラムはついていないの?
>>681 大きなファイルも扱えるまともなテキストエディタを使う。他に答えようがないと思うけど。
それと何使ってるか知らないけど
分割コンパイルができないのはたぶんコンパイラのせいじゃない。
フリーじゃないコンパイラで分割コンパイルは成功させられたの?
>>681 大きなファイルも扱えるまともなテキストエディタを使う。他に答えようがないと思うけど。
それと何使ってるか知らないけど
分割コンパイルが出来ないのはたぶんコンパイラのせいじゃない。
フリーじゃないコンパイラで分割コンパイルは成功させられたの?
Cソースを#includeしてみては?
>>666 四元数とかハミルトニアンで調べるのも良いんじゃ?
>>681 1.コードを短くしる
2.ソースを分割してコンパイルしる(何のコンパイラか知らんができるはず)
3.長いテキストを扱えるエディタを使う
>>682 ボーランドのフリーなんですけど、makeとかいうのはよく解らないんです。
>>683 メモ帳以外でも使えるのでしょうか?
ワードとか使っても結局は.Cにしなければいけないわけですが、それでもいいものなのでしょうか
他のコンパイラはあまり使った事はないんです。
689 :
デフォルトの名無しさん :04/01/05 00:07
685に一票 ファイルをそのまま分割して#includeで連結
>>685 >>689 すいません意味がよく解らないのですが、
のようにすればいいということなのでしょうか?
#include "test.c"
のようにして、あまったソースをtest.cファイルに書き込めばいいということなのでしょうか?
ほんとすいません。お願いします。
ボーランドのフリーって bcc32.exe の事か? >bcc32 *.c でいけるぞい(w
692 :
デフォルトの名無しさん :04/01/05 00:14
693 :
デフォルトの名無しさん :04/01/05 00:16
>>690 容量オーバーで書けなくなったところでファイルを新規作成
その先頭で#include "前のファイルの名前"
でも
>>691 がいいぞw 手っ取り早いし
>>691 そうなんです。bcc32なんです。
>bcc32 *.c
すいません。この意味がわかりません。
*にファイル名でいいんでしょうか?それをどうやって連結すればいいんでしょうか?
関数で分けて、#include"ファイルネーム.h"
にして、ファイルの中に関数定義をし、定義した関数をはのファイルに作成したのですが、
「外部シンボルの未解決」というメッセージが表示されてしまうのです。
ほんとにすいませんが、もう少し解説をお願いします。
>>693 新しく作ったファイルの名前はどのようにしたらよいのでしょうか?
それと、コンパイルは始めのファイルだけやればいいものなのでしょうか?
>>694 そのままやるんだよそのまま。
bcc32 *.cとすると、main.c you.c me.cの三つがあればbcc32 main.c you.c me.cと展開して実行してくれる。
ネタ? 例えば、ソースを 111.c, 222.c, 333.c に分けて作ったとすると >bcc32 *.c で 111.exe ができるって事だYo
>>696 mian.cとyou.cとme.cを関数別に分けて、bcc32 main.cでいいのでしょうか?
ヘッダーファイルとかも無しでいいのでしょうか?
>>697 すいません。ほんとに解らないんです。お願いします。
>>681 -
お前らまとめてスレ違い。bccスレもあっただろ?
>>701 そうだな。最後に一つ言っとくと、単純にファイルを分けただけではコンパイルできない。
それは関数のプロトタイプ宣言とかの話か? だったら必ずできない訳ではなかろう?
Windows98のMS-DOSプロンプトだと展開しないな・・・
age
706 :
デフォルトの名無しさん :04/01/05 02:04
きゃっ!(///▽///)
707 :
デフォルトの名無しさん :04/01/05 02:26
printf("%p\n",&mo); とかやって得られるアドレス値っていうのは リニアアドレスのことですか?
708 :
デフォルトの名無しさん :04/01/05 02:29
セグメント:オフセットでも合法ですヨ
|||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||| ||||||@||||||||||||||||||@|||||||||||||| ||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||▽|||||||||||||||||||| <<ぬるぽ |||||||||||||||||||||||||||||||||| |||||||||\|||||||||||||||||||||||||
C言語の関数のコードとかを調べるには、どうすればいいのでしょうか?
>>711 VC++ ならデバッグ実行中にブレークポイントで止めて、
ステップインすればいい。
多分アセンブリ言語だと思うけどね...。
GCC なら GCC のソースコードを読めばいけると思う。
713 :
デフォルトの名無しさん :04/01/05 08:48
基本情報の資格をとるにはC言語をどのぐらいのレベルまで マスターすればいいのですか
>>713 マスターなんかする必要ない。用語を覚えてひたすら問題集をやる。
資格とはそういうものだ。
>>713 それの何処が C に関する話題なんだよ…
なにこいつ
どいつ?
どどいつ?
720 :
デフォルトの名無しさん :04/01/05 13:37
すいませんつぎの演習問題がわからないので教えてください。 以下のプログラムを作成、テストして下さい。 ・入力された受験者の氏名と性別テストの得点を読み込み構造体に格納する。 ・男女別の平均点をだし、その平均点を基準とした合格、不合格のデータを各人の構造体に格納する。 ・男女別に合格者の氏名と合格点をコンソールにひょうじする。 出力イメージ %goukaku please input name & sei(f or m) & score tomoko f 80 yuko f 65 takuya m 55 kohoru f 70 satoshi m 60 masaki m 95 mina m 50 CTL+D ***goukaku ( male )*** masaki 95 ***goukaku ( femail )*** tomoko 80 kahoru 70 % 出力イメージとまったく同じにしなくてもよい 以上夜しくお願いします。
頼むからローカルルールと1くらい読んできてくれ。
標準ライブラリ関数のみを使って、 ディレクトリが書き込み可能であるか調べる方法はありますか? ディレクトリ名に任意のファイル名を繋げて、 hoge = fopen( 何たら, "w" ); でhogeを調べればほぼOKなんですけど、 もし、自分よりエライ権限を持った人が、 パーミッション000等でファイルを置いていれば、 上記の方法では、間違った結果を返すことになってしまいます。
それだと、ディレクトリが書き込み禁止で、 書き込み可のファイルがあるだけでも破綻する。 ディレクトリの概念は本来OS依存なので、 その属性チェックもOSごとに必要だろう。
724の言う通りだな
726 :
デフォルトの名無しさん :04/01/05 18:03
void* v = malloc(100); v = realloc(v, 50); とした場合、vのブロックの残り50バイトのメモリ領域は開放された状態になっているのでしょうか?
残り? 元の領域と重なっているかどうかは不定だぞい
>>726 内部でどういう扱いになってるかは分からんが、
free しなくてもいい状態になっていることだけは確かだ。
729 :
デフォルトの名無しさん :04/01/05 18:07
げ、そうなんですか? てっきり同じかと・・・・・。
>>727 の質問と
>>728 の回答を待っていました。
K&Rのreallocの説明を見ると
古いサイズおよび新しいサイズの新しいところまでは不変である
と書いてあるが、他の書籍では
>>727 の言うように書いてあったりする。
どちらが正しいのでしょうか?それとも未定義ナのでしょうか?
あと、仮に「領域は重なる」と定義されていない場合、
reallocの存在意義はなんなのでしょうか?
free -> mallocと同じでは?
731 :
デフォルトの名無しさん :04/01/05 18:21
>>730 「領域が重なる」と「中身が同じ」はイコールじゃない。
重ならなくても50バイトまでコピーすれば中身は同じ
"新旧のサイズのうち、小さいほうのブロックに含まれる内容は変更されない。"だけです。 領域が同じとは限らない
あぁ間違えた…
>>730 において、
一行目は「
>>726 の質問と」
二行目は「
>>727 の回答を待っていました。」
の書き間違いです。
どーでもいいですが、
名前も「not726」の書き間違いです。
とすると、 malloc で確保したメモリを realloc した場合は、malloc で確保したメモリ領域のサイズに かかわらず、reallocした方のメモリを解放する事だけ意識すればよい。と、いう事ですね。
理解しました。ありがとう御座いました。 ( つД`) >730は四行目も何か変だったし、あぁ頭悪い…)
736 :
デフォルトの名無しさん :04/01/05 20:31
int x; printf("input number X=>"); scanf("%d",&x); int *a=(int *)calloc(x, sizeof(int)); とコーディングしたのですがエラーが出てしまいます。 原因がわかりません。。・゚・(ノД`) どこをどうすれば良いでしょうか?
int *a=calloc(x * sizeof(int));
>>737 void *calloc(size_t n, size_t size);
だが。
int x;printf("input number X=>");scanf("%d",&x); { int *a=(int *)calloc(x, sizeof(int)); } にしなはれ。
737,738,739さんどうもありがとうございました。 試してみたところ動いたのでとてもびっくりしています? この{}は何故必要なのでしょうか? 作成したメモリ領域の解放のためのfree(a);も{}の中に入れなければエラーが出てしまうのですが、何か関係があるのでしょうか?
>>739 単純に int *a;をブロックの先頭で宣言すればいいだけの話では。
>741 本当だ! int *a; int x; printf("input number X=>"); scanf("%d",&x); a = (int *)calloc(x, sizeof(int)); free(a); でコンパイルできました! あぁ~!そうか先頭で!! こんな基本的なことも忘れてたなんて。 どうも本当にご迷惑をかけました。m(_ _;)m
726とそれに答えてる連中は学生なのか… reallocは確保し直すのであって、 つまりmallocした領域を再確保したならばそれは、mallocの領域は開放不可(上書きされてる) つまりメモリリークだ。 上手く動いてるのは偶然だ。
>>743 学生を差別するの(・A・)イクナイ!!
おまいらいちばん肝心なことをサボんな 規格票よめ、規格票!!
>つまりメモリリークだ。 ( ´∀`)お前ガナー
一応マヂレスしておくと realloc() は
新たに確保 & コピー & 元の解放 だ
但し ptr=realloc(ptr, サイズ) ってな感じで使っていると
"新たに確保"に失敗した場合 ptr==NULL になっているので
そういった意味では前に確保した領域の解放ができないが
>>743 が言っている事は意味不明
上手く動いてるのは偶然な
>>743 がいるスレはここでつか(w
750 :
デフォルトの名無しさん :04/01/06 10:11
初心者です。%e これはなんと読むんでしょうか? eは何の頭文字で、どのような意味なのか教えてくださいませ。
普通に読めばいい。 eは、恐らくexponentの略だと思われ。意味は辞書でも引いてください。
exponent 意味くらい自分で調べてくれ
さまよう目
万国博覧会だっけ
そうか、floating eye と floating point をかけているのか!
ファイルサイズを取得する関数はありますか?
>>748 ありがとうございました。
理解できました。
qsort()の使い方を勉強してるのですが、うまく動き ません、まちがっているところを指摘していただきたいのですが。 #include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b){ if((int*)a > (int*)b)return -1; else if((int*)a <= (int*)b)return 1; return 0; } int main(void){ int i; int s[]={3,5,3,6,4,5,2,8,55,}; qsort(s,9,sizeof(s[0]),cmp); for(i=0;i < 9;i++) printf("s[%d]=%d \n",i,s[i]); return 0; }
>>758 ポインタを比較してどうするよ。ついでに、降順だけどいいのか?
if(int(*a) > int(*b))return 1; や if(a > b)return 1; で試してみたけれどできませんでした。 こうしてみたけどだめでした。・。゚(゚´Д`゚)゜。 正しい書き方を教えてもらえませんか?
*(int *)a
>>761 あっなるほど。。。
(int*)はあくまで(void*)のものを
キャストしているだけで・・・
その後に実体を操作しなければいけないってことですね。
くだらない質問で悪いんだけどさ、 int i; i = atoi((char *)getchar()); みたいなことできないの? セグメントエラーでんだけど
できない。
>>765 できないって言ってもはじまらない。
あきらめないでできる方法を探すんだw
一文字なら'0'を引けばいいじゃん。 '0'から'9'までは必ず連続しているし。
>>794 getchar()はintを返す。
i = getchar() - '0';としとけ。
atoi((char []){(char)getchar(), '\0'}); だれかテストしてくれ。
770 :
デフォルトの名無しさん :04/01/06 18:16
コンパウンドリテラルキターーーーーーーーーーーーーーーーーー!!!!!!
772 :
デフォルトの名無しさん :04/01/06 18:19
レスたくさんさんくす。
>>767 と8のでよかったよ。
getchar()が文字コード返すからatoi使おうと思ったけど、'0'ひきゃあいいのね。
漏れ頭悪かった。
773 :
デフォルトの名無しさん :04/01/06 18:23
>>769 gcc3.3.2で通った。
(char)へのキャストは不要っぽい。
もちろん-std=c99 -pedanticはつけて
>>773 サンクス。
でもEOF返ったらいやだよな。
EOF というか、数字以外のがきても嫌だぜ。
>>776 嫌って?
printf("%s","??-"); ↑ こう書くとチルダ1文字が表示されてしまいます。 ??-って表示したいんですけど。
trigraphかよ。
あのー、 int i,a[7] = { 0045,0071,1001,2003,4005,6001,0564 }; for(i=0;i<7;i++) printf("%d\n",a[i]); なんだか数字が違うんですけど。
へー、英語ではそう言うのか。
8進
似たような質問なんだけど、 i = getchar() - '0'; printf("ok%d\n",i); i = getchar() - '0'; printf("ok%d\n",i); i = getchar() - '0'; printf("ok%d\n",i); ってコードで、 3 ok3 4 ok4 5 ok5 という出力を期待してるんだけど、 3を入力した後リターンキー押さないと ok3 て出てくれない。つまり次に進んでくれない。 しかもバッファにリターンが残ってるから、 次が ok-38 てなことになっちまう。 なにかいい方法ないですか?
kbhitも使え
getch で解決。
#include<stdio.h> #include<stdlib.h> struct list{ int num; struct list *next; }LIST; main(){ struct LIST *base, *pi; FILE *fp; fp=fopen("a.txt","r"); /*a.txtには1~5の数字があるとする */ base=(struct LIST*)malloc(sizeof(struct LIST)); base->next=NULL; while((fscanf(fp,"%d",&base->num)) != EOF){ p=(struct LIST*)malloc(sizeof(struct LIST)); base->next = p; base=p; } while(base->next != NULL){ printf("逆順表示%d\n",base->next); base=base->next; } }
>>783 getchar の戻り値チェックして、改行を飛ばせ。
>>787 struct LIST {
int num;
struct LIST *next;
};
>>787 printf("逆順表示%d\n",base->next);
・・・・・
間違いまくり。
void*の使い方についてお聞きしたいのですが。 bsearchやqsortなどの関数で探したい値の型は何でも探せる ようになってますが、その際にサイズとしてsize_t型を引数として 与えていますよね。 で、探したい値や探す配列はvoid*型の引数として 受け取っているので、size_tで受け取った型にキャストしないと使えない と思うんですよ。 その時size_t型でバイト数はわかるけれども実際にint型なのかlong型 なのかって判らないと思うのですが、どんなふうにしてキャストしてるんでしょうか? 知っている方が居ればご指導下さい。よろしくお願いします。
>>791 bsearchやqsortで、「探したい値や探す配列」の値について意識するのは、
bsearchやqsortを使用するプログラム側であって、
bsearchやqsortは単にメモリブロックとして扱ってるだけ。
だから、比較関数を自前でかく必要があるし、自前で書くなら、
int型だろうがlong型だろうが構造体型だろうが、解ってるだろ、ってこった。
memcpyはvoid*, const void*, size_tだよな。 それと同じで、移動するだけなら、その型が実際は 何であるのかは問題ではない。(unsigned char*)にでも キャストしておけばよろしい。 実際にその型が何であるか問題になるのは、比較関数であり、 それはユーザが作るわけで型を渡す必要はない。
struct LIST{ int num; struct LIST *prev; struct LIST *next; }; struct LIST *base, *p; FILE *fp; fp=fopen("a.txt","r"); /*a.txtには1~5の数字があるとする */ base=(struct LIST*)malloc(sizeof(struct LIST)); base->prev=base->next=NULL; while((fscanf(fp,"%d",&base->num)) != EOF){ printf("%d\n",base->num); p=(struct LIST*)malloc(sizeof(struct LIST)); p->prev=base; base->next = p; base=p; base->next=NULL; } while(base->prev != NULL){ base=base->prev; printf("逆順表示%d\n",base->num); }
>>791 >で、探したい値や探す配列はvoid*型の引数として
>受け取っているので、size_tで受け取った型にキャストしないと使えない
言ってる事が意味不明。
796 :
デフォルトの名無しさん :04/01/07 14:06
cで空白のTrimをしたいときはどうしたらよいでしょうか?
>>796 /* 先頭の空白を除去し、別領域にコピー */
char *ltrim_withcopy(char *dst, const char *src) {
while (*src && isspace(*src))
src++;
return strcpy(dst, src);
}
/* 後続の空白を除去し、別領域にコピー */
char *rtrim_withcopy(char *dst, const char *src) {
size_t t = strlen(src) - 1;
while (t>=0 && isspace(src[t]))
t--;
strncpy(dst, src, t + 1)[t + 1] = '\0';
return dst;
}
/* src と dst が指す領域が等しい、あるいは重なっているときは
使用できない。 */
798 :
デフォルトの名無しさん ◆93GCE9hnmM :04/01/07 17:21
BCCで本格的にソフトを製作している強者会社はありませんか?
質問。 getc(),fgetc(),getchar()で一文字読み込んで、 読み込んだストリームに対して、 ungetc()をするとき、失敗することはありえますか? getcして、文字の確認をして、ungetcした後に、 ungetcが成功したか調べるのは、冗長なのかしりたかったのですが。
CPU:Celeron2.40GHz メモリ:512MB HDD:120GB OS:WindowsXP テレビチューナー DVDマルチドライブ (DVD-RAM/R/RW) 以上のスペックのデスクトップパソコンを無料で2台譲ります。 欲しい方居ましたら貰ってやって下さい。 副収入徹底攻略まにゅある と検索してサイトへアクセスお願いします。
>>794 なるほど!助かりました。
レス有難う御座いました。
>803 ばーか。
C言語で32bit(4,294,967,295)を超える計算はできないのでしょうか? 例えば if( y*y = x*x*x*x ){ {処理} } てなことで、x^4の値が256を超える(=4,294,967,295)と、オーバーフローしてしまって 正しい処理ができないので あと64bitの環境(Linux+gcc+Athlon64)では↑のようなことはおきないのかな・・・。
>>806 >C言語で32bit(4,294,967,295)を超える計算はできないのでしょうか?
質問がおかしいね。そういうのがない環境に作り込むための言語だよ。
long long を使え。 64bitでも足りないなら GNU MP でも使え。
>>806 C の新しい規格 C99 では long long int 型があって、
それを使えば 64 bits (厳密には 64 bits 以上)で計算できる。
C99 でなくてもコンパイラごとに拡張してある場合があるので
(VC++ だと __int64 、GCC だと long long だったはず)、
#if でコンパイラごとに分岐して、
64 bits 型を typedef してから使うと良い。
>>807 日本語がおかしいね。
多倍長演算すれば?
>>806 なら、
if(y == x * x) {
{処理}
}
でいけるけどね。
というか、= と == を間違えてるぞ。
>>809 説明のないあんたの日本語よりおかしい例が見当たらない。
藻前らけんかなんてするなよ 平和が一番(・∀・)イイ!! 漏れは平和主義者兼プログラマ だからそういうとこには煩いなんだよね。 毎日糞コードに埋もれて生きて そりゃあストレスも溜まるだろうさ。 だけど、そんなストレス カフェオレでも飲みんがらエロ画像 でも見てマターリすれば、そんな いがみ合いなんてきっとなくなるさ それでみんな幸せになって(・∀・)イイ!!
>>809 文句あんのに表記できねえ知障はだまってろ
アホ! カス!!
学生の頃、20桁の四則演算をするプログラムした記憶がある。 少数点も可で。 なんか丸めに死ぬ程詰まった覚えが…
藻前らの才能に正直むかつくんでつよ。
ワイド文字はUnicodeですか?
NO
必要条件
>>796 元の文字列 src 加工して良いなら
int i;
char *p;
for(i=0; *(src+i)==' '; ++i)
;
p=strchar(src+i,' ');
if(p) *p='\0';
ってすると src+i からが前後の空白を抜かした文字列だ
/* dst のサイズは src のサイズ以上であるのが望ましい */ char* trim(char* dst, const char* src) { int offs, i, end = -1; char c; for(offs = 0; src[offs] == ' '; ++offs) { } for(i = 0, c = src[offs]; c != '\0'; ++i, c = src[offs + i]) { if(c != ' ') { end = i; } dst[i] = c; } dst[end + 1] = '\0'; return dst; } char* trim_self(char* str) { return trim(str, str); }
あの、誰か助けてください。 int i; ... printf( "%c : %d\n", i, i ); fputc( i, stdout ); putc( i, stdout ); putchar( i ); puts( "hoge" ); ... で、printf()の%cで出た文字と同じ文字が続く三行で出ると思っていたら、 なにも出力されずに「hoge」が出てしまいます。 何が問題として考えられるでしょうか? ...の位置で何かをするとまずいことになる。とか、いってもらえると非常に助かります。。。
お騒がせしました。自己解決(?)しました。 わからなくて、嫌になって、シェルを落として、少し休憩して、 シェルを起動して、試したら、うまく動きました。 なんだったんだろう…
シェルが不安定になってたんじゃない?
すんません日本語確かにおかしいですね・・・・。
>>811 ミスでした。今気づきました。
ありがとございましたー
826 :
デフォルトの名無しさん :04/01/08 10:03
初心者です。%e このeはなんという英単語 の頭文字なのでしょうか?
827 :
デフォルトの名無しさん :04/01/08 10:04
exponent
828 :
デフォルトの名無しさん :04/01/08 10:13
すいません。間違えてしまいました。 初心者です。%g このgはなんという英単語 の頭文字なのでしょうか? m(__)m
829 :
デフォルトの名無しさん :04/01/08 10:20
すいません。ファイルへの出力についての質問です。以下のような構造体を ファイルに書き込みたいときどうする方法が一般的なのでしょうか。 struct kouzoutai{ int a; int b; } struct kouzoutai2{ int d; struct kouzoutai *KOUZOU; } fwriteを使うとは思うのですが、二層構造体のときはどうすればいいのかと思いまして。
>>828 Gに語源はないらしい。EFGのG。
B言語とC言語,PerlとRubyの命名も同種。
訂正
>>830 B言語に対するC言語、Perlに対するRubyの命名も同類。
>>829 kouzoutai2のdとKOUZOUのポインター先を書き込むしか手はない。
>>829 ファイルに構造体を意識して書き込もうとする事が間違い。
ファイルのフォーマットを設計し、そのフォーマットに合わせて出力するものだ。
>>829 CFAQ にもあったような気がするが
fwrite でバイナリのまま書こうとしてもパディングが邪魔だし、
可搬性がないし、ポインタの値もそのまま書いてしまうんで
ふつうはテキストで独自のフォーマット(つってもカンマか空白で区切るだけで十分)を定めて
専用の入出力関数を書く。
まぁ、その方がデバッグも楽だし移植も楽だからな。 某社の某プロジェクトでは10年の歳月を経て やっとテキストで保存することになったが。
今だとXMLで保存って感じっすかねえ。 ライブラリが整備されてるし扱いが楽そう(使ったことないっす)。
XMLもパージング部分をCのみで書くのはライブラリ使っても結構厄介だったり。 CならCSVみたいなシンプルなフォーマットで取り込んだ方が圧倒的に楽だよ。 俺なら詳細なフォーマットの入力は テキスト処理が得意な Perl スクリプトかなんかに事前処理させる。 そこで問題なければより原始的な形に変換してCプログラムに引き渡すやり方を勧めるな。
838 :
デフォルトの名無しさん :04/01/08 19:54
>>829 に関連して教えてください.
例えば, ビットマップファイルのヘッダのように構造体として定義されているようなものを
読み書きする場合でも, 最初の 2 バイトはマジックナンバー, 次の 4 バイトはサイズと,
(ファイルを一括でメモリ上に読み込むにしても, その後は)要素を一つ一つ
自分で取得するしか, 構造体のパディングをかわす方法はない,
という理解で正しいでしょうか ?
>>838 コンパイラ依存になるけど、
パディングを操作する #pragma を使えばいい。
ただし、CPU によってはアラインメントがくずれると
バスエラー吐くので注意。
まぁ、Windows 専用アプリなら気にする事はないかと。
>>839 あぁ ...
pragma はちょっと抵抗あるかも.
>>840 だったら、unsigned char の配列でも定義して、そこへちまちま入れてからファイルに吐き出せ。
c言語において、 char型は、1バイト、 short int型は、2バイト、 long int型は、4バイト、 long long int型は、8バイト、 float型は、4バイト、 double型は、8バイト、 は常に正しいですか?
>>842 正しくない。
規格ではそれぞれの型に要求される最低の大きさと型間の大小関係のみが定められている。
むろん規格に従っていない処理系もある。
補足するとcharだけは1バイトと決まっている
>>837 > XMLもパージング部分をCのみで書くのはライブラリ使っても結構厄介だったり。
> CならCSVみたいなシンプルなフォーマットで取り込んだ方が圧倒的に楽だよ。
どっちも大差ないと思うが。
まさか DOM や SAX を素のまま使って厄介とか言ってないだろうな。
>>847 × char = 1バイト
○ sizeof(char) = 1
>>849 は何をいいたいんだ?
まさか
"char"は1バイトではないってこと?
昨年はお世話になりました。やっと超初級本「C言語で学ぶプログラミング基礎の基礎」を終わり、
来週から標準を目指してK&Rに挑戦しようと思ってます。
そこでコンパイラも本についてた「LSI C-86 Ver.3.30」から「gcc」にと、
>>2 の
ttp://gcc.gnu.org/に行ったのですが英語で解かりませんでした 。
大変面倒だとは思いますが、どなたか「gcc」のダウンロード方法を教えて戴けませんでしょうか。
宜しく御願い致します。
>>852 辞書ひけ。で、慣れとく。
gcc のマニュアルも gnu C ライブラリーのドキュメントも英語だぞ。
>>849 そうするんなら sizeof (char) == 1 では。
borland C++で(・∀・)イイ!!じゃないの。
charが9bitの場合もあるから、1バイト(=8bit)ではないと考えていた。 しかしそもそも昔は1バイト=8bitとは限らなかったし、 規格ではsizeof演算子の結果、オペランドのバイト数を返すと書いてるな。 その表現で間違いなかった。すまんかった。
>>856 さん。ありがとうございます。
けど、、、超初級本あがりの超初心者の私にはファイル名とかで必要な物を判別する事ができませんでした。
昨年末ココに出た「ネスト」を超初級本の索引に無かったので2典で調べても無くてココで聞いてあきれられた程です。
英語力も用語の知識もありません。
大変面倒なのでしょうが、どなた様か「gcc」のダウンロード方法を教えて戴けませんでしょうか。宜しく御願い致します。
>>858 gccに手を出す前に、やるべきことがあるんじゃないかと思うわけだが。
>>858 Cygwin 入れる時に gcc にチェックいれとけば OK 。
>>858 つまりだね、gccとかそういうレベルじゃないんだよ。gccをや
りたいなら、もっと基本的なことをマスターしろといいたい、これ
は、物事を勉強する基本的な態度でもある。
かならずと言っていいほど、基礎がないやつはのびない。おま
えも、同じこと。まあとにかく、基礎からや
れ
>>860 ,862さん。ありがとうございました。どうにかMinGWでダウンロードできそうって後2時間ほどかかるらしく(ADSLでないので)コレも携帯からです。非難の中の御指導、本当に感謝です。おかげで私もgcc+K&Rで頑張れそうです。皆様も今年1年良い年でありますように。
>>860 ,862さん。ありがとうございました。どうにかMinGWでダウンロードできそうって後2時間ほどかかるらしく(ADSLでないので)コレも携帯からです。非難の中の御指導、本当に感謝です。おかげで私もgcc+K&Rで頑張れそうです。皆様も今年1年良い年でありますように。
>>865 つまり、861の内容については文句ないんだよな?
らんぼーな表現だが、gccうんぬんよりも大事なことだと思わないか?
れっきとしたアドバイスだと思うぞ。
なかなか、こんなくだらんことでアドバイスをする人はいないぞ。
いても、そのアドバイスが的はずれだったりすることはよくあることだしな。
ぞっとするような解答を見たこと無いか?
866の方がうわて
>>866 >>865 ではないが、
俺が質問者だったら、
>>861 のようなアドバイスは必要としていないね。
確かに
>>861 の言っているは正しいけど、質問者の求めていた物ではない。
だから俺は聞かれた事だけを答えるようにしている。
薄情だと思うかも知れんが、質問者の将来は質問者が考えるべきことだと思うからな。
もちろん
>>861 のようなレスをするのは悪いことではないと思うよ。
868の方がうわて
すまんが、その文章のどこを縦読みするんだ?教えてくれ
おーい山田君、他でやってくれ
874 :
デフォルトの名無しさん :04/01/11 01:08
保守するならついでにageろ
875 :
デフォルトの名無しさん :04/01/11 02:28
以下のプログラムで.cppでは大丈夫ですが、.cだとエラーになってしまいます。 どう直せばよいのでしょう。 struct Kouzoutai { int hoge; }; int sub(void) { Kouzoutai kouzoutai; } int main(void) { Kouzoutai kouzoutai; return 0; }
struct Kouzoutai kouzoutai; or typedef struct Kouzoutai_ { int hoge; } Kouzoutai;
878 :
デフォルトの名無しさん :04/01/11 02:33
日立ソフトには、四天王と呼ばれている部署が4つある。 特殊開発事業本部の配下の (1)S風俗(風俗店シテスム部) 名前のとうり、風俗店むけのシステム開発を行う。景気に左右されず、売り価の高い。 さらに、ネットや携帯から風俗嬢さんの出勤情報や予約をとるシステム開発もさかん。 ただ、新人の女性は不可となっている。 しかし、今年度は吉原の大型案件をやるので、新人たち挑戦してみる価値あり。 ただ、顧客事情で昼から0時までの(社内ではE変と言う)勤務となってしまう。 (2)s仁義(旧s暴力) これも、「暴力団」向けのシステム開発を行う。そして顧客が半端じゃないので能力が自然に身につく ただ、ちょっとでもミスをすれば顧客から「わいらは、かたぎ衆に指つめろとはいえへん。けどこの責任どうとってくれねん」 なんて言われてしまう。関西や広島への出張が多い。 (3)s政団(旧s右翼) これも、右翼団体向けのシステム開発を行う。小泉首相の靖国参拝いらい案件がどんどん来る状態だ さらに政治向けアピールが必要ゆえ、違法行為すれすれのHP作成を依頼されたりして大変だ (4)s(宗教) ここまでくれば何にも説明は不要だろう。そう宗教団体向けのシステム開発を行う。 ただ、配属されるのは「無宗教」の人に限られる。 この4部署は競合他社がほとんど居ないので市場を独占状態にでき、非常に会社に貢献している、部署だ
880 :
デフォルトの名無しさん :04/01/11 05:41
881 :
デフォルトの名無しさん :04/01/11 17:34
以下の関数で\nを<br>に置き換え\nは除去したいのですが置き換えは 成功して改行の除去に失敗してしまいます。 どうしてなんでしょうか?宜しくお願いします。 API_EXPORT(char *) ap_escape_html2(pool *p, const char *s) { int i, j; char *x; /* first, count the number of extra characters */ for (i = 0, j = 0; s[i] != '\0'; i++) if (s[i] == '<' || s[i] == '>' || s[i] == '\n') j += 3; else if (s[i] == '&') j += 4;
882 :
デフォルトの名無しさん :04/01/11 17:35
if (j == 0) return ap_pstrndup(p, s, i); x = ap_palloc(p, i + j + 1); for (i = 0, j = 0; s[i] != '\0'; i++, j++) if (s[i] == '<') { memcpy(&x[j], "<", 4); j += 3; } else if (s[i] == '>') { memcpy(&x[j], ">", 4); j += 3; } else if (s[i] == '\n') { memcpy(&x[j], "<br>", 4); j += 3; } else if (s[i] == '&') { memcpy(&x[j], "&", 5); j += 4; } else x[j] = s[i]; x[j] = '\0'; return x; }
改行が \n の環境で改行が \r\n な文をそう処理したら、 \n は \r<br> に置き換わる。 ブラウザにとっては \r, \n, \r\n は全て改行とみなされるので(以下略
884 :
デフォルトの名無しさん :04/01/11 18:16
>>883 ありがとうございます。
\nの置き換え部のすぐ手前に
else if (s[i] == '\r') {
j--;
}
を付け足したらうまくいきました。
元/新文字列へのオフセット変数jをデクリメントする事で\rが存在する
場所に<br>を置くように動作するっていう解釈であってますでしょうか?
'\r' があれば、次が '\n' なら '\r\n' をまとめて <br> に置換 次に '\n' がないなら '\r' のみを <br> に置換 '\r' が現れないのに '\n' が現れたら '\n' を <br> に置換
\nはすべて<br>に置換 \rは単独で現れた場合のみ置換とした方が処理が多少単純かな。 好きな方でいいと思うけど。
またバッファか? fgetsでわざわざ墓穴掘ってる悪寒
888 :
デフォルトの名無しさん :04/01/11 23:09
888
889 :
デフォルトの名無しさん :04/01/11 23:45
gotoで他の関数に飛べません。コンパイラのバグですか?
バグではなくて仕様です。
ゆじゅねさんが小学生の頃の話だ。 ある女の子が具合が悪くなってさ、授業中突然吐いちゃったんだって。 周りにいたやつらがさ、泣いてるその子を汚いとか、気持ち悪いとか言って 目を背ける中で、ゆじゅねさんだけは、すぐにその子の元に駆けつけて 泣かなくてもイイアル( ^┏Д┓^)っていって、素手で吐瀉物を処理して あげたらしいよ。 本当、ゆじゅねさんって美談が尽きない人だよw
やべえ、激しく誤爆した。
893 :
デフォルトの名無しさん :04/01/12 00:02
>>886 ありがとうございます。
色々試して勉強させて頂きますわ。
「猫でもわかる」のC言語の 第12章(ttp://www.kumei.ne.jp/c_lang/intro/no_12.htm)のプログラム実行時、 数字(九九の答え)入力の所に’w’などの文字を入力すると以降勝手に処理を繰り返します。なぜでしょうか? プログラムの修正ではなく、こうなる理由を教えてもらえませんでしょうか。 ↓ソースです。
#include<stdio.h> #include<stdlib.h> #include<process.h> #include<time.h> void sakusei(void); void input_answer(void); void hantei(void); int a, b, c; void main() { srand(clock()); while(1) { sakusei(); input_answer(); hantei(); } return; }
void sakusei(void) { printf("STOP = 99\n"); a = rand() % 10 ; b = rand() % 10 ; printf("%d×%d=", a, b); return; } void input_answer(void) { scanf("%d", &c); if (c == 99) exit(0); return; } void hantei(void) { if (c == a * b) printf("○\n\n"); else printf("×\n\n"); return; }
ストップウォッチが動かず。 使用環境redhat8 C++コンパイルはうまく行ったのですが..... 時間の取得がうまく行きません。 (start , stopが0のまま) どのあたり、探ればいいのか教えてください。 start = stop =0 start = (double) clock() / CLOCKS_PER_SEC; stop = (double) clock() / CLOCKS_PER_SEC;
898です。 補足 >ここの"ストップウオッチもどき"をそのままコンパイルしても動きませんでした。 動かないじゃなく、時間が取得できないので何もせずに終了の間違いです。
実行結果を細大漏らさず書いてくれ。 自分が想定しているものと、実際のものとを
898です。 #include <iostream> #include <ctime> using namespace std; int main() { clock_t start, stop; int i; start = clock(); for(i=0; i<320000; i++); stop = clock(); cout << "開始時間取得: " << start << "\n"; cout << "終了時間取得: " << stop << "\n"; return 0; } 実行結果 開始時間取得: 0 終了時間取得: 0
898です。 自分が想定しているもは?? 同じサーバ上でPHPでは <?php echo date("Y/m/d H:i:s (D)", time()) ?> 実行結果 2004/01/11 13:07:57 (Sun) 時間取得できてました。
PHPの例なんて出されてもな。 clock() の仕様きちんと見てあるか? clock_t は(通常) long 型だ。文字列が入るわけはない。 初期化してない clock_t 変数に 0 が入ってるってことは 関数はきちんと値を返している。 問題は、 その値がきちんと初期化/更新されていないか 計算速度が速すぎて値が変化していないかだ。 start = clock(); とした後に while( clock() < 1000 ); みたいな処理を入れてループを抜けられるか確認してみるとかしてみろ
>>902 意図がよくわからんが、
for(i=0; i<320000; i++);
のループの時間を計測しようとしてるか?
ひょっとするとコンパイラが最適化で、
意味のないループだと判断してまるごとループを取り除いてるかもしらんぞ。
コンパイラがなんだかわからんが(gccだろうと思うが)
最適化しないオプションつけてコンパイルしてみれ。
gccなら-O0(大文字のオーに数字のゼロ)だ。
898です。 >計算速度が速すぎて値が変化していないかだ。 こちらでした。 for(i=0; i<320000; i++); → for(i=0; i<32000000; i++); 実行結果 開始時間取得: 0 終了時間取得: 450000 になりました。 ありがとうございます。
>>894 scanf の戻り値を確認していないから。
double timp[250][5500] = { 0 }; なる宣言があると、実行時にエラーでとまってしまいます。 [250][50]くらいだと止まりません。 うまいこと[250][5500]でできないでしょうか?
記憶クラスをstaticに汁
そんなでかい配列を作らない、ってのが定石。
>>908 あと、static記憶クラスの変数は、自動的に0で初期化されるから、
static double timp[250][5500] = { 0 };
なんて書くなよ。
>>909 ,913
ありがとうございます。
これから試してみます。
別に書いたっていいだろ。意味ないけど
コマンドプロンプトで program source(.exe) みたいな形でCのexeファイルを実行出来るprogramって ボーランドCコンパイラかWindowsに含まれてませんか? 何をしたいかと言うと、TeraPadでなるだけ外部ツールを使わずに 拡張子無しファイル名を渡して実行させたいのですが。
意味不明
少なくともCの話じゃない。 ソフトウェア板向きだな。
どこで聞いても意味不明
>916 理解しようと努力したけどだめでした。 Cインタプリタか?
>>922 単にTeraPadの外部ツール作りたいだけだらう。
924 :
デフォルトの名無しさん :04/01/13 17:41
容量の小さいプログラムを作りたいとき どんなことに気をつければいいのでしょうか。 色んな注意点を教えてください。お願いします。
無駄なコードを減らす。 まとめられる処理はまとめる。
928 :
デフォルトの名無しさん :04/01/13 19:43
>>927 BCCで作ったプログラムがUPXできないのってなぜでしょう?
__ / _∀\ @《 ゚Д ゚) (( つコ= -=三(◎) ∧人/ | .. (_) /_) ┏━━━━━━━━━━━━━━━━━┓ ┃エックス「 だいさんには シグマ いじょうの┃ ┃ あくを かんじるんだ!!」 ┃ ┗━━━━━━━━━━━━━━━━━┛
930 :
デフォルトの名無しさん :04/01/13 22:23
すいません、間違えました。メモリの確保です。 メモリをなるべく無駄遣いしないようにするには どういうプログラムを組めばいいのでしょうか。
インラインアセンブリで書く (一応Cだからなぁ)
再利用できるものは再利用する。
934 :
デフォルトの名無しさん :04/01/14 00:06
毎回free()関数で開放するといいんでしょうか。 何回も使う関数内でのデータの開放は無駄なんでしょうか.
mallocでちまちまと領域を取らないというのがいいかと。 取るならドーンと取って(できればmallocじゃなくsbrkで)、 自分でセコく管理。 あとは、構造体のpaddingに注意して、 フラグを構造体に入れたければビットフィールドにするとか。 これ以上の個別ノウハウは、 メモリの絶対量が少ないから節約したいのか、 扱うデータが多すぎるから節約したいのか、 どんなデータかとか、もっと情報がないと。
保存せずに毎回再計算する。
>>934 一般にはなんともいえない。
多くの実装においてmalloc族で確保したメモリは、
プロセスが生きている限りOSに返されることはない。
だから一般にプロセス生成から時間が経つにつれて
ワーキングセットが拡大することになる。
freeした領域は次回mallocしたときに再利用されることを期待してもいいが、
それとて様々な理由により再利用されないこともありうる。
こまめにmalloc、freeを繰り返すとブロックが分断化されていって、
結局OSからフリーストアを貰うことになるかもしれない。
まあなんだ。君がどの程度の制約でどれくらいの大きさのものを
扱おうとしているかわからんのだが、まずはできるだけ綺麗に、
ワーキングセットのことは考えずに書いてみてそれから
そのプログラムの挙動を観察し、ネックになりそうな部分を書き換えていけばよいと思う。
細かいメモリブロックをいちいちmallocしていくと、mallocその物が使う管理領域も
バカにならなくなるので、でかい領域を確保しちゃって自分でその中身を
やりくりするという手法もある。というかメモリに厳しいというのならそうすべき。
でもまず最初はその辺をmalloc/freeに任せて様子を見たほうがいいと思うね。
>>937 いいたいことはあってるけど、
ワーキングセットの用語の使いかたがちがっとる。
つーか、sbrkなんか使うな
ふつー mmap
>>930 メモリにデータを書かずにHDにデータを書く。
mmapのないSunOSで育ったんだYO! [ウァァァンのAA]
typedef struct _STRUCTSUB{ void (*OnSub1[])( void * ); void (*OnSub2[])( void * ); } STRUCTSUB; 上のような構造体定義は無理なのでしょうか? 「サイズが0の配列があります」 というエラーが出ます。
サイズが0の配列=サイズ未指定の配列 int a[]; と同じ
>>946 早いレスありがとうございます。
しかし、
typedef struct _STRUCTSUB{
void (*OnSub1[])( void * );
} STRUCTSUB;
こうするとエラーが消えるんですが、
2つのサブルーチンポインタの定義は出来ないということでしょうか?
一部のコンパイラは、可変長構造体をサポートするための独自拡張で 「構造体の最後のメンバーに限り」配列のサイズを0にすることを認めている。 strut s1 { int a[]; }; と strut s2 { int a[]; int b[]; }; で確かめてみるとよい。
>>948 なるほど、そんな機能があった訳ですか。
勉強になりました。
結論は、
>>945 は無理ということですか。
ありがとうございました。
950 :
デフォルトの名無しさん :
04/01/14 08:24 フラグとして変数を使いたいとき、 1ビットだけでいいのですが、 1ビットだけ確保して使うというのはできないのでしょうか。