1 :
ジョブス2世 :
2001/01/15(月) 12:38
もういいや
3 :
デフォルトの名無しさん :2001/01/15(月) 12:51
int a, b, c; extern int table1[32][64]; extern int table2[30][60]; a = table1[b][c]; a = table2[b][c]; パフォーマンスの差があるか考察せよ。
>>3 「配列の要素数により、値を取得する時間に変化があるか」
ってことならば、答えは
「パフォーマンスには差がでない」
と思う。
をぃをぃ。「一般的には差がある」が正解だと思うが? もちろん、「一般的には有意な差では無い」が。 理由1 配列要素ののアドレス計算が、 2のシフト演算で行える場合と行えない場合の差。 コンパイラがアドレス計算をシフト演算に最適化し、 乗算とシフト演算に要する時間に差がある場合、差がつく。 理由2 キャッシュのアラインや配列のサイズにより、 差が出る場合がある。 これは、キャッシュのアルゴリズムやアクセスの仕方により異なるので、 どちらが速いかは場合による。
って、この辺は、 「構造体の配列」や「配列の配列」にアクセスするコードの アセンブラ出力を見れば一目瞭然な気が。
>>5 -6
ぴんこーん!
でも理由1に関してはx86系のCPUで乗算とシフトのレイテンシーの差、
実行ポートの差、コード依存性によって一概にシフトが速いとは言えないらしいです。
理由2に関してはまぁ、このぐらいの小さいテーブルなら大丈夫でしょう。
アラインは合わせればいいだけだしね。
下手にcharとかにしてテーブルを圧縮してもパーシャルレジスタストールが起こるし。
まっ、どっちにしろアセンブラレベルの話ですね。
8 :
ジョブス2世 :2001/01/15(月) 15:49
>>3 -7
完敗です、C言語なら誰にも負けないというのは言い過ぎでした...
C言語しか知らんので、アセンブラは知らないっていう言い訳は
見苦しいので言わない事にします
ところで、
extern int table3[32][60];
a = table3[b][c];
の場合、
> 配列要素ののアドレス計算が、2のシフト演算で行える
のでtable1と同等のパフォーマンスが出るっていうことでいいのでしょうか?
extern int table3[32][60]; int *table = (int *)table3; a = table[60*b+c]; // a = table3[b][c]と同値 ですね。アセンブラはともかく、2次元配列のメモリー上での 連続性は分かってないと、ど初心者ですよ。。
1 は質問スレッドと化した前スレを引きついだだけのようだから, そんなにムキになって挑まなくてもいいと思うのだが。
>>9 うっ、そうですね
# なにを血迷っていたんだろう
訂正します
extern int table4[30][64];
int *table = &table4[0][0];
a = table[(b<<6)+c]; // a = table[64*b+c]と同値
のでtable1と同等のパフォーマンスが出るっていうことでいいのでしょうか?
12 :
3 :2001/01/15(月) 17:13
>>11 ピンコーン!
まぁ、5さんも言ってる通り、どの程度パフォーマンスに差が出るかは
分かりませんがね。。ちょっとした盲点でしょ?
>>10 一応Cについては自信があったので挑んでみましたが
結果は惨敗でした。精進したいと思います。
>>12 ええ、盲点でした。勉強になりました。
やはりCしか知らないでC言語で負けないことは難しそうですね。
14 :
デフォルトの名無しさん :2001/01/15(月) 17:51
include <stdio.h> #define MAX 10000 main(int argc,char *argv[]) { int i, j, numCol, noMax =0; char tmp[MAX + 1], strForm[16]; /* Input Check */ if(argc>1){ noMax = atoi(argv[1]); } while(noMax < 2 || MAX < noMax){ printf("いくつ以下(但し 2 以上 %d 以下)の素数を求めるのですか?> ", MAX); fgets(tmp, MAX, stdin); tmp[MAX] = 0; noMax = atoi(tmp); } /* MAX って何桁? そんなら、横は何列に? */ sprintf(strForm, "%d", noMax); i = strlen(strForm); numCol = 79 / (i + 1); /* ならば、出力の書式指定フォーマットは次の通り */ sprintf(strForm, " %%%dd", i); /* 素数探し(表を書いて素数じゃない数を消して行く方法で) */ for(i = 0; i <= MAX; i++) tmp[i]=1; for(i = 2; i <= MAX; i++){ if(tmp[i] == 1){ j = i << 1; /* j = i * 2 */ while (j <= MAX){ tmp[j] = 0; j += i; } } } /* 以下が結果 */ printf ("◆◆◆ %d までの素数一覧 ◆◆◆\n", noMax); for(i = 2, j = 0; i <= noMax; i++){ if(tmp[i]){ printf(strForm, i); if(++j % numCol == 0){ putchar('\n'); } } } printf("\n◆◆◆ 全部で %d 個 ◆◆◆\n", j); } ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ fgets(tmp, MAX, stdin); tmp[MAX] = 0; noMax = atoi(tmp); これが何をしているのかがわかりません。 そもそも 素数でないってどの段階でどうやって識別してるのですか? 大学でのこの半年間しかC言語にふれてなくて超初心者です・・・・
>>14 > fgets(tmp, MAX, stdin);
> tmp[MAX] = 0;
> noMax = atoi(tmp);
> これが何をしているのかがわかりません。
fgetsで標準入力から入力された文字列ををtmpに格納して、
atoiでtmpに格納された文字列を数値に変換し、noMaxに格納しています
# tmp[MAX] = 0;はちょっと何を意図しているかは不明です。
# これが無くても問題ないでしょう。
> そもそも
> 素数でないってどの段階でどうやって識別してるのですか?
以下で行なっています、
# 確か「何とかのふるい」っていうアルゴリズムのはず...
>/* 素数探し(表を書いて素数じゃない数を消して行く方法で) */
>for(i = 0; i <= MAX; i++) tmp[i]=1;
>for(i = 2; i <= MAX; i++){
> if(tmp[i] == 1){
> j = i << 1; /* j = i * 2 */
> while (j <= MAX){
> tmp[j] = 0;
> j += i;
> }
> }
>}
ただ、繰り返しはMAXまで行なう必要があるかどうか疑問です
>for(i = 0; i <= MAX; i++) tmp[i]=1;
>for(i = 2; i <= MAX; i++){
> while (j <= MAX){
はそれぞれ
for(i = 0; i <= noMax; i++) tmp[i]=1;
for(i = 2; i <= noMax; i++){
while (j <= noMax){
で十分のような気がします
16 :
14 :2001/01/16(火) 00:58
ありがとうジョブス・ザ・セカンドさん
17 :
名無しさん@お腹いっぱい。 :2001/01/16(火) 02:44
>ジョブス2世さん エラトステネスのふるいですよ。 このスレッドいきなりためになったわ。感動。 3にありがとう
>>2 -17
パフォーマンス厨房どもはアルゴリズムとデータ構造の本でも読んでから出直してきなさい。
>18 10年以上前から読んでるけど?何回も読み返してるし。
というより、18は日本語に不自由しているんだろ。
>>5 >もちろん、「一般的には有意な差では無い」が。
>>12 >どの程度パフォーマンスに差が出るかは分かりませんがね。。
の意味がわからないらしいから。
>>20 18の意図すら分からんのか?
3の質問なんてナンセンスだし、考察する価値も無い。
そんなことやってる暇があったら、アルゴリズムとデータ構造
でも勉強せい、っつーことだろ。
俺も同感だね。
22 :
21 :2001/01/16(火) 10:55
んで、 18=21の自作自演とか書こうとしてる、おまえ。 マジ、病院行った方がいいぞ。
>>18 >>21 なんだあんた。あんたに何で議論の内容決める権利があんだよ。
あんたが勉強中だからって、みんな勉強中だと思うなよ。
24 :
20 :2001/01/16(火) 11:18
>>20 >そんなことやってる暇があったら、アルゴリズムとデータ構造
>でも勉強せい、っつーことだろ。
これには完全に同意するが、おまえも
>>5 >もちろん、「一般的には有意な差では無い」が。
の意味が読めてない。
有意ではない=他にもっと重視すべき事柄があるから、気にするな
と言ってるんだろうが。
>3の質問なんてナンセンスだし、考察する価値も無い。
普通はな。
18は意図を汲み取っていないと思っただけで電波は感じなかったが
>んで、
>18=21の自作自演とか書こうとしてる、おまえ。
>マジ、病院行った方がいいぞ。
これには電波を感じたよ。
すまん、24は
>>21 だ。
「車輪の再発明〜」を繰り返す奴と同じ香りを感じるな。
26 :
3 :2001/01/16(火) 11:41
>>3 の質問なんてナンセンスだし、考察する価値も無い。
簡単なクイズを出しただけなんだからさぁ。そんな噛み付かなくてもいいじゃん。
簡単なクイズ出してジョブス2世氏に解かせるぐらいやってよ。。ヽ(´Д`)ノ
27 :
20 :2001/01/16(火) 13:07
>
>>5 >もちろん、「一般的には有意な差では無い」が。
> の意味が読めてない。
> 有意ではない=他にもっと重視すべき事柄があるから、気にするな
> と言ってるんだろうが。
言ってないよ。優位は「差」に係る。
つーか、そんなことどうでもよい。俺がいいたいのは、そんなことじゃ
ないのも読めないのか?
28 :
20 :2001/01/16(火) 13:09
>>24 > >んで、
> >18=21の自作自演とか書こうとしてる、おまえ。
> >マジ、病院行った方がいいぞ。
> これには電波を感じたよ。
感じる方の受信機が壊れてるんじゃねーの?
俺がそう書いた意図は分かるだろーが。
29 :
20 :2001/01/16(火) 13:42
>俺がいいたいのは、そんなことじゃ ないのも読めないのか? 何が言いたいんだ?俺の読解力では理解できない。説明してくれ。 >優位は「差」に係る。 その通りだ。「有意」な「差」はない。したがって、 「実際には差が出ないから重視するな」 と読んだ。もちろん、重視すべきはアルゴリズムとデータ構造だ。 2-17はそんな当たり前の事は前提として、 予備知識だと理解した上で話と、俺は解釈した。 もちろん俺と違ってすばらしい読解力を持つ21なら、 2-17がもっと深遠な意味で話していたという事を 根拠と共に示してくれるよな。 >俺がそう書いた意図は分かるだろーが。 「アルゴリズムとデータ構造のほうがずっとずっと重要だ」か? それならわかってるさ。その上で 「そんな事は、わざわざ指摘しなくてもみんなわかって話してるんだろ」と と俺は20と24で書いたつもりだがね。 で、電波君、それ以外に言いたい事とは何だ? 「話をするな」 とでも言いたいのか? 電波なのは、意味も無く「自作自演」とか言い出すからだよ。 よっぽど普段、自作自演の多数多数派工作をやってるんだろうね。
18=24の自作自演うz、は!
31 :
20 :2001/01/16(火) 14:10
誤解があるとまずいから、補足しておくよ。
今度は一応推敲したからね。
・俺の捉えた流れ
3-13
予備知識として、アセンブラレベルの話があった。
「予備知識」の根拠は
>>20 の通り。
18
「アルゴリズムとデータ構造のほうが重要だ」
20(俺)
「そんな事はみんなわかって話してるんだから、わざわざ指摘するな」
21
「18の意図すらわからんのか」
#ここに書いた以上の意味があるのか、未だ俺にはわからんね。
22
「自作自演だいすき」
24(俺)
「有意差がない=重要ではない=予備知識である」を繰り返した。
27-28
繰り返し。
少なくとも、俺が20に書いた意図は、
>「そんな事はみんなわかって話してるんだから、わざわざ指摘するな」
だ。それに対して、
>18の意図すら分からんのか?
>マジ、病院行った方がいいぞ。
と返す理由がわからないね。
18の意図とは何だ?
そして俺が病院に行ったほうがいい理由は何だ?
>マジ、病院行った方がいいぞ。
こんな言い方をされて「電波だ」と反論するのは当然だろう。
32 :
21 :2001/01/16(火) 15:09
どーでもいいけど、20はそうとう粘着君だな。 もーいーじゃん。
33 :
21 :2001/01/16(火) 15:10
価値観が対立してんだからさ、その価値観をくつがえすようなこと書いてくれよ。
34 :
21 :2001/01/16(火) 15:13
20は「日本語に不自由しているんだろ。 」と書いた自分を正当化しようと あがいているだけ。 # 俺も粘着君(藁
35 :
20 :2001/01/16(火) 15:30
てめーがつっかかってきたんだろうがよ。 詫びる気は全然ねーんだな。 俺は、18の言い方ににあわせた言い方をしたんだよ。 それをてめーが理解できずに、俺につっかかってきたんだろ。 読解力が足りてねえ、電波なのはてめーなんだよ。 連続して書きこむところなんざ、 他のスレで大暴れしていた奴を思い出すね。 詫びの言葉とかはねーのか? 俺は18が俺の言葉遣いの悪さを指摘したら謝るつもりだがね。
36 :
20 :2001/01/16(火) 15:32
で、説明してくれよ。 18の意図と21-22の意図とやらを。
37 :
20 :2001/01/16(火) 15:34
>価値観が対立してんだからさ、 どこが対立してんだよ。説明してくれよ。 俺は、てめーがつけてきた言いがかりに反論してんだよ。
このスレは,毎回先頭の方で一悶着無いとダメなのかのう。
どーでもいいが話題に関係ないレスはsageでやって欲しい
判定: 20と21、両方バカ
名無しさん@優しい人が混じっているような。
42 :
20 :2001/01/16(火) 16:11
ごめんなさい。>他の人達 28でageられたからageにしたんだけど、やっぱよくなかった。 というより、相手にした俺が悪かったって反省してます。 もう、この件での書きこみはやめます。
このスレ いきなり荒れたね
44 :
初心者 :2001/01/16(火) 17:21
キーボードから入力した任意の10進数を16進数、8進数に 直して画面に表示するプログラムを作成しなさい。 という、問題かなり簡単らしいんですがCに関しては まったくの初心者です。誰か教えてくれる人いませんか?
45 :
デフォルトの名無しさん :2001/01/16(火) 17:24
46 :
初心者 :2001/01/16(火) 17:28
itoa関数ですか。ありがとうございます。 さっそく調べてみます。
47 :
デフォルトの名無しさん :2001/01/16(火) 17:33
>>45 あれ?なんでitoa??
printfのフォーマットの問題じゃないんですか?(^^;
入力したものをprintfで%x,%oで出力すりゃ良いんじゃない? char strings[131]; gets( strings ); num = atoi( strings ); // メニュー番号取得 printf( "元=%d 16進=%x 8進=%o\n", num );
49 :
48 :2001/01/16(火) 17:39
げっ・・・メニュー番号取得て・・・ウチのプログラムコピペモロバレ。 染んで詫びよう・・・。
>>48 ってゆーか、それってまともに動いてるの?
>printf( "元=%d 16進=%x 8進=%o\n", num );
printf( "元=%d 16進=%x 8進=%o\n", num, num, num );
なら話は分かるが...
たぶん int i; scanf("%d"&i); printf( "元=%d 16進=%x 8進=%o\n", i ); だけで充分だと思う もちろん、48のが安全だけどね
52 :
48 :2001/01/16(火) 17:45
53 :
21 :2001/01/16(火) 17:45
いまいち食いたりんが、ま、相手をキレさせたっつーことで満足しよう(藁
54 :
51 :2001/01/16(火) 17:45
げ、コピったら馬鹿さらした・・・ 逝って来ます・・・
55 :
デフォルトの名無しさん :2001/01/16(火) 17:48
>>44 #include<stdio.h>
#include<stdlib.h>
int main(){
char s[10];
int i;
printf("\x1b[2J\x1b[3;3HInsert int No : ");
gets(s);
i=atoi(s);
printf("\x1b[4;4H 10 : %d",i);
printf("\x1b[5;4H 16 : %x",i);
printf("\x1b[6;4H 8 : %o",i);
printf("\x1b[10;8HHit Enter. Then Exit.");
gets(s);
printf("\x1b[2J\x1b[1;1H");
return 0;
}
こんな糞プログラムはいいから
Cで作った共有メモリにFortranからアクセス
する方法教えてちょ。
56 :
21 :2001/01/16(火) 17:50
>>29 > 俺は18が俺の言葉遣いの悪さを指摘したら謝るつもりだがね。
ほー、やはり、俺の予想の
> 20は「日本語に不自由しているんだろ。 」と書いた自分を正当化しようと
> あがいているだけ。
は、正解みたいだったな。
# で、何をあやまれって言ってるの?妄想君。
57 :
初心者 :2001/01/16(火) 17:53
ちょっとの間にこんなに・・・ みなさん本当にありがとうございます。 嬉しいです。(;o;)
>21 質問者の邪魔になるから消えろ。
59 :
問題の18登場 :2001/01/17(水) 00:49
あーあ。 俺の一言で随分ともめてた様だな。 それにしても3の言うパフォーマンスって何だろ。 結局こんなのアセンブラ出力と実行結果を確認すりゃおしまい。 それに大方コンパイラやプロセッサの環境依存っぽい。 だいたい2次元配列なんてそうそう使わないしね。 あのコードだけでプログラム組むわけでも無いのに。 まあ、レスも増えてここの1も少し得した気分だろう。 それとも余計なことしたかなあ?
あ。 いちおう3に対しての俺の考察結果は、 「環境による」 ね。 ここはVisualC++専用スレってわけじゃないから。 これ以上発展しそうにない話題なのでsage
どっちでもいいんじゃないですか。 アセンブラ出力の質にこだわれば生産性は落ちるものですし 質と生産性はなかなか比例しませんから それぞれの道を信じていけばいいのでは。
62 :
ななし :2001/01/17(水) 09:31
>それとも余計なことしたかなあ? いや、余計な存在であるかと。。
>いちおう3に対しての俺の考察結果は、「環境による」ね。 うわっ。あたまわりぃ〜 「なんでこんな事件が起きたのでしょうか?」 「社会が悪いんです」 って受け答えぐらい頭が悪い返答ですねぇ。。
ところでジョブス2精子はしっぽをまいて逃げちゃったのでしょうか。。?
65 :
ジョブス2世 :2001/01/17(水) 10:16
>>55 > Cで作った共有メモリにFortranからアクセス
> する方法教えてちょ。
すみません。Cか知らないので、私にはわかりません。
誰か知っている人いますか?
パフォーマンス厨房に関する俺の考察: 最近のプログラマはほとんどがアセンブラをやらないし、 読めない。 また、CPUのアーキテクチャに詳しい奴も少ない。 よって、彼らはお互いに議論できる場を通常持つことが 出来ない。それで、その手の話題が出て来ると、嬉々として 自分の知識をひけらかす。周りはついてこれないし、 興味も無い。 これがウザがられる原因。
67 :
66 :2001/01/17(水) 13:05
俺としては、fjなんかでやれば、議論も発展するだろうし、 ウザがる奴もいないから、いいんではと思うのだが。
68 :
名無しさん :2001/01/17(水) 13:06
69 :
デフォルトの名無しさん :2001/01/17(水) 14:01
セキュリティ関係なら、 大丈夫なんじゃない?
>>67 ウザがる奴もいないから、いいんではと思うのだが。
いや、君みたいな存在が一番うざいと思うぞ。
71 :
66 :2001/01/17(水) 17:31
俺みたいなヘタレはfjにはいないから大丈夫だぞ。
72 :
初心者@2回目 :2001/01/17(水) 17:31
キーボードから入力した任意の10進数を16進数、8進数に 直して画面に表示するプログラムを作成しなさい。 という、問題で%x、%oを使わないプログラムの書き方 を誰か教えていただきませんか?2回目で大変恐縮なのですが お願いします。
73 :
デフォルトの名無しさん :2001/01/17(水) 17:35
そういう問題ね
じゃあ、itoa()の出番です
まず調べてみてください
>>45 申し訳ない、あなたが正解だったようです・・・
74 :
初心者@2回目 :2001/01/17(水) 17:41
>>73 itoa関数、ヘルプで見てもないんです・・・。
ちなみに私が使っているCはウルトラCです。
では、本で調べてみますね。
75 :
デフォルトの名無しさん :2001/01/17(水) 17:46
>>74 何なら自分で同等関数つくってもいいですよ
てか、それが正解なのかも
1番下の桁を取り出して、基数で割る
これを繰り返せば・・・
76 :
初心者@2回目 :2001/01/17(水) 18:01
>>75 う〜ん・・・教えてくれて嬉しいんですが
やっぱり書き方が解りません。すみません
本当初心者なんです・・・
77 :
デフォルトの名無しさん :2001/01/17(水) 18:16
Plan9とInfernoどうよ?
78 :
初心者@2回目 :2001/01/17(水) 18:45
>>77 それは関数ですか?ちょっと解らないです・・。
79 :
55 :2001/01/17(水) 18:47
>>68 ありがとうございます。
早速、見に行きます。
80 :
デフォルトの名無しさん :2001/01/17(水) 19:06
初めまして。今卒研に四苦八苦しているアホな大学4年です。 今CのプログラムをCGI化しようとしています。 でも、このプログラム(他の人が作成)ってのが5つの.cファイルで できていてコンパイル(makeコマンド使用)すると実行ファイルが できるのですが、これをCGIとして動かすにはどうしたらいいのか わかりません。 ちょっと分野が外れているかもしれないのですが知っていれば アドバイスいただけるとうれしいです。
81 :
デフォルトの名無しさん :2001/01/17(水) 19:08
>>76 >int i,j,k,l,m[100];
>i=(取ってきた整数);
>k=i;
>for(l=1;;l++){
> j=k%16;
> m[l]=j;
> k=(k-j)/16;
> if(k==0)break;
>}
こんなとこじゃないですか?
出力とデバッグは自分でやって下さい。
>>80 そこまで出来てるなら板違いと思われる。
CGI板で訊いた方がいいんじゃ?
83 :
デフォルトの名無しさん :2001/01/17(水) 19:15
>80 perlと同じ要領で chmodでパーミッションを実行許可して、 まずprintfで"Content-type: text/html\n\n" を出力していけばふつーにできるぞ。 ただし、サーバでコンパイルしないと 機種依存ではねられるので、サーバ側がターミナルを許していて、 かつgcc,cc,g++なんかのコンパイラが使えるようになってないと だめっすよ。(蛇足でしたね。)
84 :
デフォルトの名無しさん :2001/01/18(木) 00:21
C言語のバイブルといわれている本があると聞いたのですが題名が思い出せません。 著者が外人さんの名前で2人だったのは覚えているんですが... どなたか教えてください。それと、C初心者でもこの本は読んでも理解できるのでしょうか?
85 :
>84 :2001/01/18(木) 00:27
カーニバルでリッチな衣装 とか言わなかった?
86 :
デフォルトの名無しさん :2001/01/18(木) 01:42
折れはカニチャーハンと覚えた
87 :
>84 :2001/01/18(木) 01:42
ネタにマジレスかも知れんけど、「プログラミング言語C 第2版」。 Cプログラマでこの本もってないのはキリスト教の信者が聖書を持っていないのと 同じです。絶対買うべし。
88 :
デフォルトの名無しさん :2001/01/18(木) 02:27
84はPC初心者板でおんなじこと訊いてたね。 ネタでないみたい。 それはさておき、実行時間を測定したいので、CPU時間を計りたいの ですが、どうやればいいんでしょう? 今は単に経過時間を測定してるだけなんです。
89 :
デフォルトの名無しさん :2001/01/18(木) 03:00
>88 clock()。これはネタですか?
90 :
デフォルトの名無しさん :2001/01/18(木) 03:14
>89 threadのCPU消費時間のことじゃないかな。 WinならAPIにあったような気がするけど、忘れた。
くえり〜ぱふぉ〜まんす と くえり〜ふりくえんしぃー のことかなぁ
92 :
デフォルトの名無しさん :2001/01/18(木) 10:26
Cってさー標準仕様で書けば、コンパイラや環境に依存しないで どの環境でも動くんかな?? 今VCでCGI作ろうと思って勉強中なんだけど UNIX系OSのCコンパイラでコンパイルしても動くかな? ってか、どんな風にすると他の環境で動かなくなるん?
93 :
デフォルトの名無しさん :2001/01/18(木) 10:58
>>92 ANSIで定められていないライブラリーの関数を使うとダメだと思う。
>>92 char ってsined charと断定したり
sizeof(int)が4バイトと信じてたりすると
痛い失敗をすることがあるらしい
処理系依存しないとたいした物が作れないのは一つの真理だと思う。。
96 :
デフォルトの名無しさん :2001/01/18(木) 12:27
>>92 非常に抽象的なプログラムを書けばどこでも動く。
i
>>4 ;なんてのは間違っても書いちゃダメよん
97 :
96 :2001/01/18(木) 12:34
スマソ ビットずらしを書いたらDLになっちまったい。
98 :
デフォルトの名無しさん :2001/01/18(木) 12:46
行列A(n×n)をLD(L^t) (tはトランス)にするプログラムを教えてください Lは下三角行列で対角成分が全て1 Dは対角成分が全て整数でそれ以外が全て0 となるようにするプログラムです お願いします
99 :
初心者@2回目 :2001/01/18(木) 13:04
>>81 >遅れてすいません。
81さんありがとうございました。
これで単位がもらえそうです(^0^)
100 :
デフォルトの名無しさん :2001/01/18(木) 13:09
標準入力から任意の長さの文字列を読み込む時ってどうすればいいんでしょう?
101 :
デフォルトの名無しさん :2001/01/18(木) 13:27
>>100 100バイトずつでもメモリ取って、リストにでもしたらどうかな。
char buff[10*1024*1024]; // 標準入力から任意の文字列を入れるバッファ こんだけありゃー足りるだろ(藁
103 :
デフォルトの名無しさん :2001/01/18(木) 13:38
(x=2,x)+(x=3,x) の計算結果が6になるのは VC++コンパイラの仕様ですか?バグですか? ほかのコンパイラでもそうなりますか?
104 :
デフォルトの名無しさん :2001/01/18(木) 14:18
>>102 いや・・・その程度気合でオーバーしてくるツワモノも
結構居るもんだぜ・・。藁
105 :
デフォルトの名無しさん :2001/01/18(木) 14:45
>>103 > VC++コンパイラの仕様ですか?バグですか?
式の評価によってオブジェクトに格納された値を変更する回数は
高々一度だけでなければならない為、
(x=2,x)+(x=3,x) の計算結果は「未定義」です。
> ほかのコンパイラでもそうなりますか?
なるかも知れませんし、ならないかも知れません。
一番いいのはそんな式にしないことです。
107 :
デフォルトの名無しさん :2001/01/18(木) 15:07
>>100 stdinのバッファサイズ見てから考えれば?
getcharするなら
プログラム内で擬似的にバッファリングして
reallocするのが簡単か?死ぬほど重いけど・・・
108 :
秀樹 :2001/01/18(木) 15:16
虚数の入った行列計算をしてるんですけど jをどのように扱えばよいのでしょうか?教えて下さい。
109 :
103 :2001/01/18(木) 15:17
extern void Func(int input, struct HOGE *output);
static struct HOGE hoge;
#define GetValue(x) (Func(x, &hoge), hoge.value)
という感じのマクロがあって、
GetValue(a)+GetValue(b)
とか計算したときに、期待通りの結果が得られなかったので
調べてみたら、
>>103 に書いたようなことが原因でした。
こういうマクロを使うときには気をつけなければならないってことですね。
106さん、ありがとうございました。
110 :
デフォルトの名無しさん :2001/01/18(木) 18:00
>108 C++でまずcomplexクラスを作る。+-*/=等を多重定義で作っておく。 FORTRANで書く(complex型) 根性でカバー このへんじゃないでしょうか?
111 :
デフォルトの名無しさん :2001/01/18(木) 19:17
>>110 >C++でまずcomplexクラスを作る。+-*/=等を多重定義で作っておく。
作らなくても、普通、あると思う。
112 :
初心者 :2001/01/20(土) 14:49
c言語でjavaアプレットのようにマウスでクリックして操作をしたり ウインドウをだしたりできるプログラムを作りたいのですが、 どのように勉強すればいいのでしょうか?本などを探しても乗っていないし、 よくわかりません。 よろしくお願いします。
113 :
第三者 :2001/01/20(土) 15:04
| 112 C言語の標準機能ではマウス操作やウインドウは出したりできない。 標準外ライブラリ使用で実現はできる。 しかし、特定のコンパイラでコンパイルできても他のCコンパイラ ではコンパイルできない。 なぜかというとC言語の標準外のライブラリを使っているから。
114 :
デフォルトの名無しさん :2001/01/20(土) 15:19
116 :
3 :2001/01/23(火) 15:53
普通に if(0==strcmp(str1,str2)) とか if(!strcmp(str1,str2)) ってやるからなぁ。。 う〜ん。マクロはあまり好まない性格だからなぁ。 >どう思う? 嫌いだなぁ。
117 :
3 :2001/01/23(火) 16:08
メリット感じないなぁ。。
118 :
デフォルトの名無しさん :2001/01/23(火) 16:56
サブルーチンの引数として渡された配列のサイズをsizeof()で計算すると サブルーチンが実際に受け取ったポインタパラメータのサイズを返してきますよね。 では、どうしたら正しいサイズを求められますか?
119 :
デフォルトの名無しさん :2001/01/23(火) 17:00
>>118 君は根本的な間違いを犯している。
sizeof()は関数ではない。コンパイル時に変数なり構造体なりの
サイズを求めて、その値に置き換えてるだけ。
だから、サブルーチンには配列と配列のサイズを渡さなきゃならない。
Do you understand?
120 :
3 :2001/01/23(火) 17:02
求めることは出来ない。
>>118 無理です。
引数で受け取るときに配列は配列の先頭アドレスを
指し示すポインタに格下げされてしまうので、
配列のサイズは受け取れません。
配列サイズを引数に追加するか
配列をメンバとした構造体を定義し、構造体を引き渡すようにすれば
構造体の配列のメンバサイズは計算できます。
124 :
デフォルトの名無しさん :2001/01/31(水) 12:37
UNIXでのuniqってコマンドと同じ働きをするものを プログラムで作れって・・・3ヶ月細細と学んだ人にできるものなんですかね!???
>>124 できる。以下の手順で行なえばよい
1. Cygwinのソースをdownloadする。
2. uniqコマンドを見つける
3. こっそりコピる。
system("uniq");
127 :
切れそうなほど困ってる男 :2001/01/31(水) 13:24
以下のようなアルゴリズムで0〜chrom_sizeまでの 数字をそれぞれ一つずつ配列chromに格納のしたいのですが 実行してみるとすべて0が格納されてしまいます。どこが悪いのでしょうか? ちなみに巡回セール問題を遺伝的アルゴリズムで解こうとしています。 よろしくお願いします。
128 :
切れそうなほど困ってる男 :2001/01/31(水) 13:24
* 染色体上にランダムな順で巡回路を形成する */ void gen_root(chrom,chrom_size) allele chrom[]; int chrom_size; { double random(); int no,okflag,i,j; chrom[0]=chrom_size*random(); for(i=1;i<chrom_size;i++){ do{ no=chrom_size*random();okflag=1; for(j=0;j<i;j++) if(chrom[j]=no) okflag=0; }while(!okflag); chrom[i]=no; } } /* 0以上、1未満の乱数を発生させる */ double random() { double r; int i; i=rand(); if(i!=0) i--; r=(double)i/0x7fff; return(r); }
>>128 /* 0 以上、1 未満の乱数を発生させる */
double hoge()
{
r = (double)(rand()) / (double)(RAND_MAX);
return r;
}
昔のCの書式で書くなよ。。
131 :
切れそうなほど困ってる男 :2001/01/31(水) 14:32
>129 ありがとうございます。 >130 実は本に載っているプログラムを参考にしたので。 よろしかったらどの辺が昔の書式なのか教えてくれませんか? 初心者なのでよくわかりません。 面倒かもしれませんがよろしくお願いします。
132 :
デフォルトの名無しさん :2001/01/31(水) 14:36
133 :
切れそうなほど困ってる男 :2001/01/31(水) 14:38
>129 すみません。やっぱり0しか入らないのですが。 ちなみにchrom[]はunsigned int です。 doubleからintになるので0になってしまうのでしょうか?
>>133 > /* 0 以上、1 未満の乱数を発生させる */
Cでは0以上、1未満を整数に入力すると0になります。
(小数点以下切り捨てになる)
0以上、2未満の乱数を返すようにした方がいいと思う。
135 :
デフォルトの名無しさん :2001/01/31(水) 16:03
C++が使えるなら、 for (int i = 0; i < chrom_size; i++) { chrom[i] = i; } random_shuffle(&chrom[0], &chrom[chrom_size]); とかは?外してたらスマソ。
136 :
切れそうなほど困ってる男 :2001/01/31(水) 16:04
>134 やってみましたがそれでも全て0になってしまいます。
137 :
デフォルトの名無しさん :2001/01/31(水) 16:17
>>136 そのプログラムは何をやりたいの?
0以上1未満の乱数の生成?
0以上1未満のユニーク(他と同じでない)乱数の生成?
138 :
切れそうなほど困ってる男 :2001/01/31(水) 16:21
random()関数は0以上1未満の乱数の生成が目的で他の部分にも使います。 gen_root関数はrandom()関数を利用して、0〜chrom_sizeまでの ユニークな整数をchrom[chrom_size]に格納するのが目的です。
139 :
恥さら137 :2001/01/31(水) 16:27
ユニーク乱数って何だろ(ワラ よく読むと > 以下のようなアルゴリズムで0〜chrom_sizeまでの > 数字をそれぞれ一つずつ配列chromに格納のしたいのですが つまりchrom_size=10だと chromの中身が{9,4,7,8,2,1,6,5,3,0}な感じになりゃいいの?
140 :
恥さら137 :2001/01/31(水) 16:29
上のリストの if(chrom[j]=no) は if(chrom[j]==no) だったり・・・。
141 :
切れそうなほど困ってる男 :2001/01/31(水) 16:37
>139 はい。そうです。
142 :
切れそうなほど困ってる男 :2001/01/31(水) 16:40
>140 あっ、気づきませんでした。 やってみたら解決できました。 僕かなりあほですね。すみませんでした。 こんな初歩的なミスするなんて・・・ みなさんありがとうございました。
143 :
脱恥さら139 :2001/01/31(水) 16:47
>>141 これじゃダメ?
void gen_root(int *chrom, int chrom_size)
{
int no, okflag, i, j;
for(i=0;i<chrom_size;i++){
do{
no = rand % chrom_size
okflag = 1;
for(j=0;j<i;j++)
if(chrom[j]==no)
okflag = 0;
}while(!okflag);
chrom[i] = no;
}
}
144 :
デフォルトの名無しさん :2001/01/31(水) 16:48
145 :
デフォルトの名無しさん :2001/02/01(木) 22:23
(配列の)最大値を求める関数はなんですか? fortranでいうmaxみたいなものです。 mfc使っても構いません。VC++6.0使ってます。 すみません、fortranしか知らないもので。よろしくお願いします。
146 :
デフォルトの名無しさん :2001/02/01(木) 22:25
147 :
145 :2001/02/01(木) 22:58
>>146 マジっすか、、、C++の方がfortranよりいろいろありそうなのに。
しょーがないから自分で作ります。
ありがとうございました。
>147 STLとかのコレクションライブラリ使ったら? vectorとかには、自分が所有するリンクリスト内の要素数返す 関数とか有ると思うが。 C++はそもそも殆ど配列使わないで集合を扱えるよ。 配列を使うのは速度上の理由とかでどうしても必要なときだけ にするくらいのほうがいいと思うよ。
149 :
145 :2001/02/01(木) 23:33
>>148 ありがとうございました。
STLは初耳なので、MSDNをみてみました。
ざっとしかみていないので最大値を返す関数はまだ見つかってませんが探してみます。
集合はよくわかりませんでした。配列とかリストのことを集合ってゆーんじゃないですか?
勉強してきます。
150 :
デフォルトの名無しさん :2001/02/01(木) 23:35
>147 #include <algorithm> int maxval(const int tbl[], size_t n) { return *std::max_element(tbl, tbl + n); }
151 :
145 :2001/02/02(金) 00:02
>>150 おお、ありがとうございます。MSDNみたらありました。探し不足でした。
さっそく利用させていただきます。
MSDNでみた述語バージョンと非述語バージョンというのがよくわかりませんが、
わかんなくとも利用できそうなので気にせずやります。
(150さんのは非述語バージョンなんですよね?)
MSDNなんかでSTLが理解できるわけない つーかテンプレート知らなきゃ理解できない つーかC++知らなきゃ理解できない
153 :
デフォルトの名無しさん :2001/02/03(土) 07:57
あげ
154 :
名無しさん@お腹いっぱい。 :2001/02/04(日) 10:38
char a[256][10000]; としたら、コンパイルはできたのですが、実行時にエラーになりました。 配列が大きすぎると思うのですが、配列の最大値はどこで規定されてるのですか? 環境はDOS/V,Win98,Borland C/C++です。
155 :
デフォルトの名無しさん :2001/02/04(日) 12:26
>>154 わりとFAQな質問です。
スタックに確保するからだめなんです。
とりあえず、
static char a[256][10000];
とやってみよう。。。
156 :
デフォルトの名無しさん :2001/02/04(日) 16:20
char name[1]; これ、何か良いことがあるんですか?
>>156 char jittai;
char* name = &jittai;
の変わりになって1ステップすくない。。。かな。
>>156 -157
そのために配列宣言するってのはなんだか、イヤだねぇ…
159 :
デフォルトの名無しさん :2001/02/05(月) 00:40
fopen()で同じファイルを複数回開き、それぞれのファイルポインタを使って同じファイルを読み書きするのは、ANSIの規格上許されているのでしょうか?頻繁にfseekをする必要があるデータを扱いたく、そうする方がプログラムがわかりやすくなるのですが、コードに互換性があるかが気になっています。
160 :
デフォルトの名無しさん :2001/02/05(月) 00:42
161 :
デフォルトの名無しさん :2001/02/05(月) 00:49
>159 環境や条件によって開けない場合があると思うが。 おそらく読込み専用モードで開けば大丈夫だと思うけどね。 書き込みもする場合は諦らめた方が良い。 あと、ファイルハンドルの制限もあるから、やたら開く物では無いよ。 ちなみにANSI-Cで規定されてはいない筈。 メモリマップドファイルが使える環境なら、 そのアドレスを取得して共有させた方が効率も良い。
162 :
161 :2001/02/05(月) 00:56
メモリマップドファイルについては、 環境がWindows9X/NT/2000なら「CreateFileMapping」、UNIX系なら「mmap」で検索して。
>157 >char* name = &jittai; の変わりになって1ステップすくない。。。かな。 へ〜、そうなんだ。 シリアル通信の構造体に多く見られるから、これナンダ?? と疑問に思ってた。サンクス。
>163 シリアル通信の構造体のは、メッセージのサイズを構造体の 宣言で明示したいという意図があるんじゃないの。 キャラ「一個」分の電文長だよん、という意味。
165 :
159 :2001/02/05(月) 01:15
>>161 丁寧な回答をありがとうございます。
環境は主にMacですが、unix系やWindows系でも動作するようにしたいと考えています。
もしあれば、メモリマップドファイルによる解決がお薦めなんですね。
166 :
161 :2001/02/05(月) 01:20
>>156 -158,163
全員で勘違いしてるみたいだけど。
単体の、
char name[1];
の話題とはなんの関係も無い。
構造体の末尾メンバを可変長として使いたいって事でしょ。
struct s {
int hoge;
char name[1]; //最後のメンバ
};
struct s*p = (struct s *)malloc(sizeof(struct s) + namelen);
として、動的に確保して使う。nameが可変って事ね。
静的にスタック等には置けない。
ANSI-Cでの移植性は無いと言われているが、良く使われる。
ごめん、クソかぶり。
169 :
デフォルトの名無しさん :2001/02/05(月) 01:22
>166 VC++以外だと char name[0]; が多いと思う。
170 :
161 :2001/02/05(月) 01:24
>>165 MACは…知らないです。
Linuxが動作するぐらいだから、似たような方法があると思います。
Cだとname[1]じゃないとまずいけど、 C++だとname[0]が通るような気もする。 標準C/C++だとどうなんだろ?<コンパイル
C++はおもしれーな
173 :
デフォルトの名無しさん :2001/02/05(月) 01:45
> struct s*p = (struct s *)malloc(sizeof(struct s) + namelen); のsizeof(struct s)ってのも続くのがまた構造体だったりすると、 結構危険と思う。
174 :
161 :2001/02/05(月) 01:51
>171 name[0]は、通らないコンパイラ(特に昔の)多そうだね。警告で済むかな? >172 わらっちゃう、ってか。何が? >173 意味がわからなかった。
>174 ごめんname[1]の場合多分問題ないです。 name[0]とかだと処理系とかアラインがずれてきてよくバグをだした経験が... お詫びに関係ネタを: #define FIELD_OFFSET(type, field) \ ((LONG)(LONG_PTR)&(((type *)0)->field)) #define CONTAINING_RECORD(address, type, field) \ ((type *)( \ (PCHAR)(address) - \ (ULONG_PTR)(&((type *)0)->field)))
176 :
デフォルトの名無しさん :2001/02/05(月) 03:32
char name[0]; は、逆にむかしの compilerでは通ったけど ANSIで禁止されたんじゃなかった? #gccでは通るようだ。うん。
177 :
デフォルトの名無しさん :2001/02/05(月) 18:38
>>175 stddef.h に offsetof() っていうマクロがあるよ。
178 :
デフォルトの名無しさん :2001/02/05(月) 23:19
char name[0];は gccとかで使える拡張機能ですね。 ちなみに、C99では char name[];という書き方ができるよ。
179 :
C言語独習3ヶ月目 :2001/02/06(火) 00:33
次の問題のプログラミングが全然できません。助けてください。 A*A−sinA=0 の実数解を以下の5通りの方法で、 小数点第7位が一致する精度で解き、 その精度が得られる計算回数とともに示す。 ただし初期値 A1=1 (1)ニュートン法 (2)ベイリー法 (3)二分法 (4)10等分法(区間縮小法) (5)逐次代入法(反復法)
180 :
かなり昔 :2001/02/06(火) 02:27
uniqコマンドと同じ働きをするCプログラムですが、 なんとかもうちょっとのところまできて止まってます!! 考えかたが間違っているのかもしれないのですが・・・ ちなみにuniqは 文字列がソートされていることを条件に、 同じ文字列を二度表示しないこと以外は、catコマンドと同じです
181 :
デフォルトの名無しさん :2001/02/06(火) 03:22
直前の行を保管しておいて現在行と比べればいいじゃん。 まあ、行頭・行末のスペースをどう考えるか とか、行中でも複数スペースが連なっている部分の スペースの個数だけが違うやつをどう考えるか とかあるけど。
182 :
デフォルトの名無しさん :2001/02/06(火) 03:50
最近、やっとオブジェクト指向ってやつを触りました。 いやぁ、クラスって便利ですね。 でも、あまりに簡単過ぎると無駄な 行数稼いでないか不安になりますね。 これって自分だけ?
183 :
デフォルトの名無しさん :2001/02/06(火) 04:20
C言語でフォルダの外のファイルをいじることはできないのですか? ちなみにwindowsプログラムはやりたくありません ms-dosだけで何とかしたいのですが.. fopenとかで開く場合同じフォルダ内でしか開けないですよね(当然ですが) ファイル名と場所で指定して開く方法は無いのでしょうか? fp = fopen( "c:\windows\foruda\file.jpg", "rb" ); みたいな感じで
184 :
>183 :2001/02/06(火) 04:32
fp = fopen( "c:\\windows\\foruda\\file.jpg", "rb" );
185 :
デフォルトの名無しさん :2001/02/06(火) 04:34
>>183 >fopenとかで開く場合同じフォルダ内でしか開けないですよね(当然ですが)
そんなわけありません。開けます。
"c:\\windows\\foruda\\file.jpg"にしてみてください。
186 :
183 :2001/02/06(火) 04:49
し、知りませんでした.. これでレジストリとかいじれますよね?
ここはネタスレ?
>>186 レジストリってファイルじゃないぞ
APIを使えよ
189 :
デフォルトの名無しさん :2001/02/06(火) 13:18
c++のメインで、 int main(string args[])はできないのかな?
190 :
デフォルトの名無しさん :2001/02/06(火) 13:26
mainって、マングリングされない等、いろいろ他の関数と違うんだよね。 詳しくは知らないけど。
193 :
デフォルトの名無しさん :2001/02/07(水) 03:02
mainCRTStartupを自分で書けば?
194 :
デフォルトの名無しさん :2001/02/07(水) 12:04
エディターの置換のような機能の 関数ってありますか? あったら、教えて下さい 例えばファイルのなかのある文字列を置換するとか 文字列の中の、ある文字列を置換する なんて事がしたいです。
195 :
デフォルトの名無しさん :2001/02/07(水) 12:47
本を見ながら勉強していたら、↓×4のことが書かれていました。 意味がわかりません。 あたしにもわかるように教えていただけませんか。 半角カタカナ(シフトJISコードとする)の文字定数を処理するときは注意が必要で す。例えば、 int ch; ch = 'カ'; /* ch は -74 になる */ if (ch >= 128) 〜 はうまくいきません。 文字 'カ' は 0xB6 という値ですが、これはchar型変数(-128 〜 127) なので、 処理の過程で 0xFFB6 と判断され、変数 ch の値は -74 になります。 これを処理するためには、 ch = (unsigned char) 'カ'; /* ch は182 になる */ とキャスト処理されます。
>あたしにもわかるように教えていただけませんか。 あなたの理解力、知識量がわかりません。 私にもわかるように教えていただけませんか? そうしたらあなたにわかるように教える事ができるかもしれません。
197 :
デフォルトの名無しさん :2001/02/07(水) 16:39
・文字定数はchar型として扱われることになっている。 ・なので、'カ' は、char型の範囲( -128〜127)の値、つまり -74。 ・-74は、unsigned char にキャストすれば、( 0〜255 )の範囲の値として扱われる。 ・つまり、182として処理される。
199 :
名無しさん@LV2001 :2001/02/07(水) 21:14
Part1の222番から始まってるオセロと思しきCのプログラムですが、 Win98SE+Borland C++ Compiler でコンパイルできません。 Cは勉強し始めたばかりでまだ呪文のようですが、とりあえず動かして みたいのでだれかバグを教えてくださいませんでしょうか。
あー、あれねー、それぞれのレスの最後にゴミがついてる。 2行くらいカットしたり、1文字カットしたりするとコンパイルは通るよ。 警告は消えなかったかもしれん。 中身は良く見てねーや。
195です。 書き方が悪かったです。ゴメンナサイ。 >198さん 理解できました。 ありがとうございます。
202 :
デフォルトの名無しさん :2001/02/08(木) 05:07
変な質問ですがファイル名の解らないファイルを開く方法はありますか? どれを開くかという指定はフォルダの中の上から何番目とか... ダウンロ−ドしたファイルに一括して名前の先頭に ある文字を入れてやることをしたいのですが
203 :
デフォルトの名無しさん :2001/02/08(木) 05:18
>202 ファイル検索系の関数ではだめか。 _dos_findfirst()とかFindFirstFile()
204 :
デフォルトの名無しさん :2001/02/08(木) 19:38
Yahoo見てて思ったんですが、Cに「ポインタ渡し」という テクニカルタームはありましたっけ?
205 :
202 :2001/02/08(木) 19:52
解りました、ありがとうございます でも構造体の中が読めない.. c++のcout使ったのが悪かったのかな??
206 :
デフォルトの名無しさん :2001/02/08(木) 20:07
Terminal Emulatorの作り方を詳しく解説しているサイトがあったら 教えて下さい。ptyを開いてpipeして、、、というのは大体理解して いるのですが、vt100対応や日本語入力の扱いなど込み入った事が よく分かりません。 英語でもかまいません。どなたか御存じの方、是非お願いします。
208 :
デフォルトの名無しさん :2001/02/09(金) 21:31
初代ジョブスは史んだのですか? それとも心に深い傷を負って人前には出られなくなってしまったのですか?
飽きたんだろ
210 :
名無しさん@LV2001 :2001/02/09(金) 22:36
独習C改訂版を自習しています。156ページの中断で、2次元配列 float balance[10][5]; に対して float *p; を当てはめるときに p=balance; ではだめで、キャスト p=(float *) balance; が要る理由が今ひとつわかりません。 これと関係するのかもわかりませんが、ポインタの定義って float *P; <===> *pがfloat型の値を持つようなポインタp と言う理解をしてたのですが、どちらかというと float* p; <===> float*(=float型ポインタ)であるp と読んだ方がいいのでしょうか。でも float* p,1,r... とはできないでしょうし。
話題ずれてたら陳謝ですが、 皆さん、Cプログラムの仕様書作成ツールで お奨めのものってあります?
212 :
デフォルトの名無しさん :2001/02/09(金) 23:28
これはC言語ではもっともややこしい所なのですが float balance[ 10 ][ 5 ]の場合 balance[ n ][ m ] はfloat型のデ−タ balance[ n ] はfloat型の要素を持つ配列へのポインタ( balance[ n ][ 0 ]へのポインタ )指すサイズsezeof(float)バイト balance はfloat *型の要素を持つ配列へのポインタ( balance[ 0 ]へのポインタ)指すサイズsezeof(float)*mバイト 配列とポインタの関係は理解していますよね? 理解していないのならそこの部分をしっかり予習してください 理解できましたか? おそらく難しいでしょう、しかし何度も考えながら そして誰かに聞いたりしてがんばって理解してください ここがC言語最大の難関なのですから
213 :
デフォルトの名無しさん :2001/02/09(金) 23:30
すまそ!! >>balance はfloat *型の要素を持つ配列へのポインタ( balance[ 0 ]へのポインタ)指すサイズsezeof(float)*mバイト ここの指すさいず間違い、正しくはsezeof(float)*10バイトでした
214 :
デフォルトの名無しさん :2001/02/09(金) 23:33
windowsのシステムに自分のプログラムを駐留させるにはどうすれば よいのですか?やっぱwindowsプログラムやんないとダメですか?
215 :
210 :2001/02/10(土) 00:14
>>212 ありがとうございます。ただ、古いコンパイラだと
p=balance
でも通ったりするんですよね。
私も212さんのような理解をして、それを確かめるために
float balance[10][5], *p, *q;
p=balance[0];
q=balance;
printf("%p %p \n",p, p+1);
printf("%p %p \n",q, q+1);
としたとき、上の行ではその差がsizeof(float)、
下の行ではその差がsizeof(float)*5
だと思ったのですが、ポインタの変換で警告が出ます。
float **r; r=balance;
でも警告が出ますね。で、いずれの場合もその差はsizeof(float)
なのです。
216 :
デフォルトの名無しさん :2001/02/10(土) 00:31
配列へのポインタって知ってますか? float balance[10][5]*,p; float (*q)[ 5 ]; //5つのfloat型要素を持つ配列へのポインタ p=balance[0]; q=balance; printf("%p %p \n",p, p+1); printf("%p %p \n",q, q+1); こうかくとエラ−はでません
217 :
デフォルトの名無しさん :2001/02/10(土) 00:47
>>215 この書き方でキャストなしでエラ−が出ないのは問題だね
218 :
>214 :2001/02/10(土) 01:09
sezeofって何なの?sizeofの間違いじゃないの? どうやったらこんな間違い出来るの?すげー。
219 :
デフォルトの名無しさん :2001/02/10(土) 01:23
これ試してみそ。 float balance[10][5]; float(*q)[5]; q=balance; printf("%p %p \n",q ,q+1 );
220 :
219 :2001/02/10(土) 01:24
既出スマソ。
>>218 ああまちがいだな..でも貴様のその調子こいた書き方なんとかしろ
お前って人の揚げ足ばっか取ってて自分はなんにもしないタイプだろ
222 :
デフォルトの名無しさん :2001/02/10(土) 02:54
>>219 balance[0]-[10]をさすポインタはどうかくんだい?
バカに突っ込むなら、
>218 名前:>214投稿日:2001/02/10(土) 01:09
>sezeofって何なの?sizeofの間違いじゃないの?
>どうやったらこんな間違い出来るの?すげー。
>>214 のどこにもsezeofなんて書いてないぞ?
どうやったらこんな間違い出来るの?すげー。
の方が良くないか?
224 :
デフォルトの名無しさん :2001/02/11(日) 03:19
ジョブス万世ぇ〜〜〜〜〜
225 :
デフォルトの名無しさん :2001/02/11(日) 07:41
ファイル入出力について質問です。 aaaa bbbb cccc dddd [EOF] となっているテキストファイルの2行目を削除して aaaa cccc dddd [EOF] にしたいのですか、どうすればいいのですか? 新しくファイルを作って書き込んで行く方法もあるのですが、それだと1行消すのにわざわざ全行を読み込まなくてはいけません。 ほかの方法を知っている方は教えてください。
226 :
名無しさん@お腹いっぱい。 :2001/02/11(日) 07:47
227 :
デフォルトの名無しさん :2001/02/11(日) 09:42
>225 データーベース使えや。ゴルァ!!
228 :
デフォルトの名無しさん :2001/02/11(日) 13:07
>>225 少なくともANSI-Cの標準関数だけではできなかったはず。
OSのAPIにファイルをカットしたり短くしたりする
機能が在れば可能かも。
実行したいOSや環境を限定してその辺の関連スレで聞けば?
229 :
1さんHELPME! :2001/02/11(日) 16:24
nethackのようなアスキーグラフィックスでのゲームを 作りたいのですが、 BASICのlocate(だったかな?)OR Textout関数(あんまり知りまへん)のような関数ありますかぁぁぁ?? え?意味がわかりません? ようは、自由に位置を決めて文字を表示する関数のことです。
230 :
デフォルトの名無しさん :2001/02/11(日) 17:32
ごめん、ちょっと教えて。 intとかの数値を文字列に変換する関数って何だっけ? 逆ならatoiとかだけど。
231 :
デフォルトの名無しさん :2001/02/11(日) 18:34
>>230 int i=100;
char buf[20];
sprintf(buf,"%d",i);
234 :
デフォルトの名無しさん :2001/02/11(日) 18:48
237 :
1さんHELPME! :2001/02/11(日) 20:17
>232さん ありがとうございまっす これWindows、VC++でも使えます??インクルードできませんでした。 なんだか検索で調べてみると、どれもこれもUNIXばっかりで。 もう一度、この初心者によきアドバイスお願いいたします。
>>234 -236
モサモサのツルツルだゴルァ
>>237 わかんなかったらcygwinのcurses関係のソース見ろやゴルァ。
とりあえずgoogleとかで検索だゴルァ
Linux-JFマニュアルも参考になりそうだゴルァ
>>237 それと、(j)nethackや(j)angbandはWin32にも移植されてるぞゴルァ
rogueとかでも検索だゴルァ
UNIXで動かす必要が無いんならcurses使う事も無いかもなゴルァ
240 :
デフォルトの名無しさん :2001/02/11(日) 23:19
241 :
デフォルトの名無しさん :2001/02/15(木) 06:23
VC++6.0,win98使ってます。C初心者です。 処理時間を計りたいんですけど、どうやって計れば良いのですか? できればミリ秒で計りたいです。 Win32ConsoleApplicationでやってます。(Fortranみたいなドス窓のやつ) だからmfc使ってません。 time_t start,end,time; time(&start); 〜計りたい処理〜 time(&end); time=start-end; でやろうとしたら、引数が違うって最初のtime関数とこでエラーが来ました。 他の関数でも構いません。教えてください。 よろしくお願いします
242 :
>>241 :2001/02/15(木) 07:01
#include <stdio.h> #include <time.h> int main() { int i, j; clock_t start, end; printf( ">>" ); scanf( "%d", &j ); start = clock(); for( i = 0; i < j * 100; i++ ) putchar( '*' ); end = clock(); printf( "経過時間は%.2fです。\n", ( end - start ) / (float)CLOCKS_PER_SEC ); return 0; }
243 :
デフォルトの名無しさん :2001/02/15(木) 07:56
>>242 すばやいお返事ありがとうごあいます。
さっそく使わせていただきます
244 :
デフォルトの名無しさん :2001/02/15(木) 14:52
「アカウント名とパスワードを入力してもらってサービスへ登録する」 っていうプログラムを作ってるんだけど、 Admini権限がないとCreateServiceができない!! そこでCreateServiceする前に入力してもらったアカウント名が Admini権限を持っているかどうか調べて 持っていなければ、再入力を促す。っていうふうに作りたいんだけど どうすれば 「入力してもらったアカウントがAdmini権限を持っているかいないか」 って分かるの?
245 :
デフォルトの名無しさん :2001/02/15(木) 18:41
246 :
デフォルトの名無しさん :2001/02/15(木) 18:44
248 :
デフォルトの名無しさん :2001/02/15(木) 23:00
>>229 DOS窓か?
エスケープシーケンスでも使っとき。
//検索 #include <stdio.h> #include <string.h> int find(void) { char mstr[256], fstr[64]; char *main_p, *find_p; char *mp,*fp; int flag=0;//フラグ unsigned int i,j; strcpy(mstr,"あいうえお"); strcpy(fstr,"いうえお"); main_p=mstr; find_p=fstr; for(i=0;i<=strlen(mstr)-strlen(fstr);i++){ if(*main_p++==*find_p){ mp=--main_p; fp=find_p; flag=1; for(j=0;j<strlen(fstr);j++){ if(*mp++!=*fp++){ flag=0; break; } } } } return flag; } void main(void) { if(find()) printf("見つかりました\n"); else printf("見つかりませんでした\n"); } 上のプログラムのどこが悪いんでしょうか? strcpy(mstr,"aiueo"); strcpy(fstr,"iueo"); だとなるみたいなんですが。 アドバイスをよろしくお願いします。 学校の先生もわからなかったようなので。。(^^;
ちなみに strcmp関数はつかいたくないです(^^;
しっかし、ツッコミ所満載で読みにくいったらありゃしねえ。 添削する気もうせる。自分で最初から作ったほうが100倍早い。 まぁ、いいや。 mp = --main_p; を mp = main_p - 1; に直せ。
>>250 学校の先生は、「わからなかった」のではなく、
「読む気も起こらなかった」だけだと思うぞ。
勘違いして先生をバカにしないようにな。
253 :
デフォルトの名無しさん :2001/02/16(金) 17:41
COMポートを使ってパソコンから 相手の機器へデータを転送するには、 以下のコードでいいでしょうか? (常に4バイト送ってくれるか心配なんだけど…。 改良点があれば教えて下さい。) // 送り先のクリエート handle = CreateFile("COM1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if(handle == INVALID_HANDLE_VALUE){ // クリエート時エラー } // 初期設定の取得 GetCommState(handle, &lpdcb); // 必要に応じてここでlpdcb構造体のメンバを変更 // COMポートの設定をセット SetCommState(handle, &lpdcb); // 送り先へデータの送信 bRetW = WriteFile(handle, &iData, sizeof(iData), &dwNumber, NULL); if(bRetW == 0){ // データ送信時エラー } // ハンドルのクローズ bRetC = CloseHandle(handle); if(bRetC == 0){ // ハンドルクローズ時エラー }
>>249 よーするに学校の課題でstrstrを自作したの?
255 :
デフォルトの名無しさん :2001/02/16(金) 18:13
bind関数でローカルのポート番号を0で指定したときに システムが自動的に割り当てたポート番号を知る方法を 教えてください。
256 :
ド素人さん :2001/02/17(土) 01:04
すみません、Borland C++(フリー)でツールを作っているのですが fwrite()の動作が、良くわかりません。 static char Test[1] = { 0xa }; ...... ~~~~0xaに限る。 ...... fwrite( Test, 1, 1, outfp ); とかすると、出来たファイルには何故か 0x0d, 0x0a とどっからか0x0dが 出てきて、勝手に2バイト書きこまれます。 0x0aのときだけ起きます。 例えば { 9, 10, 11 } を fwrite すると、 09 0d 0a 0b になる感じです。 なんででしょう?
257 :
凍結C人類 :2001/02/17(土) 01:16
>>256 fopenでバイナリモードとかでファイルオープンするんじゃなかったか?
なんか = fopen("いれもん","wb")
なんてなかったっけ?
258 :
ド素人さん :2001/02/17(土) 01:19
>>257 試してみました。
あっ。解決しました。
大感謝です。ありがとうございました!
>>256 -258
テキストモードだと自動的に改行コードにされちゃう、ってことなのかな?
260 :
デフォルトの名無しさん :2001/02/17(土) 06:59
>259 テキストモードで\n(0x0A)を書き込もうとすると、自動的に\r(0x0D)が頭に追加されて、実際は\r\nを書き込むんだよ。
>自分で最初から作ったほうが100倍早い。 その考えよくわかる(^^; タメしに[251]が作ったプログラムを見せていただけないですか? まぁ、暇があったらでいいですから。>251 えぇまぁ。。>254
//試しに"aiueokakikukeko"と"iueo"でやってみな。 //ロジックの間違いは直す気は無かったからね。 int/*bool*/ match(const char *text, const char *str) { for (; *str; ++text, ++str) { if (*text != *str) return 0/*false*/; } return 1/*true*/; } int/*bool*/ find(const char *text, const char *str) { for (; *text; ++text) { if (*text == *str) { if (match(text, str)) return 1/*true*/; } } return 0/*false*/; } void test(const char *text, const char *str) { printf("[%s][%s]\n", text, str); if(find(text, str)) printf("見つかりました\n"); else printf("見つかりませんでした\n"); } int main(void) { test("aiueo","iueo"); test("あいうえお","いうえお"); test("あいうえお","いうあ"); test("aiueokakikukeko","iueo"); return 0; }
..早いですね(^^) ありがとございまし。 さっそく試してきます。 を〜、これが一流のプログラムというものなのか。。 自分のプログラムが恥ずかしく見える。。;;
単純なワイルドカード含まない検索なら普通はこうやる。 でもこんなに提出したら絶対自分でやってないのばれる。 >#include <stdio.h> >#include <stdlib.h> >#include <string.h> > > >int find(const char *text, const char *str) >{ > int BMTable[256]; > int i, Index; > int bFound; > > for (i = 0; i < 256; i++) > BMTable[i] = 0; > > for (i = 0; i < (int)strlen(str); i++) { > BMTable[(unsigned char)str[i]] = i + 1; > } > > Index = 0; > bFound = 0; > > do { > for (i = strlen(str) - 1; i >= 0; i--) { > if (text[Index + i ] != str[i]) > break; > } > > if (i == -1) { > printf("%s\n", text); > for (i = 0; i < Index; i++) { > printf(" "); > } > printf("^\n"); > Index++; > bFound = 1; > } else { > Index += i - BMTable[(unsigned char)text[Index + i]] + 1; > } > > } while (Index <= (int)strlen(text) - (int)strlen(str)); > > return bFound; >} > >void test(const char *text, const char *str) >{ > printf("[%s][%s]\n", text, str); > if(find(text, str)) > printf("見つかりました\n"); > else > printf("見つかりませんでした\n"); >} > >int main(void) >{ > test("aiueo","iueo"); > test("あいうえお","いうえお"); > test("あいうえお","いうあ"); > test("aiueokakikukeko","iueo"); > > return 0; >}
265 :
デフォルトの名無しさん :2001/02/18(日) 22:38
これってエラーな筈だと思うんですけど動いちゃうんですけど。 どうしてなんでしょ。(VC++6.0) #include <stdio.h> char* my_strcat(char *cp_alpha, const char *cp_beta); main() { char str[5] = "ABC"; my_strcat(str, "DEF"); printf("%s\n", str); } char* my_strcat(char *cp_alpha, const char *cp_beta) { char *cp_head = cp_alpha; while(*cp_alpha) cp_alpha++; while(*cp_beta) *cp_alpha++ = *cp_beta++; *cp_alpha = 0x00; return (cp_head); }
266 :
デフォルトの名無しさん :2001/02/18(日) 23:28
>265 多分、境界整列の関係でstrは8バイト分確保されているのでは? my_strcat(str, "DEFGH"); にすると退避しているフレームポインタが壊れておかしくなると思いますが?
267 :
デフォルトの名無しさん :2001/02/18(日) 23:29
たまたま。
268 :
デフォルトの名無しさん :2001/02/18(日) 23:31
なんでダメなのかを考えれば なんで動くのかの予想も立てられる。
269 :
デフォルトの名無しさん :2001/02/19(月) 04:57
printf("%d %.*s %d文字\n",i+1, (pt+i)->na,(pt+i)->pa,(pt+i)->na); とあるウェブ見ていて思ったんですが、2番目の%.*sって何のことですか。 あと、右と左の変換数が違うのはどうしてですか。
270 :
デフォルトの名無しさん :2001/02/19(月) 05:12
指定したファイルを読みこんで、スペースや,で区切って 何回出てきたか単語を数えるプログラムを作りたいんですが、 よくわかりません。 ファイルをwhile(fscanf(fp,"%s",str)で 読みこんだ後、strをどうすればいいですか。
271 :
デフォルトの名無しさん :2001/02/19(月) 05:56
272 :
デフォルトの名無しさん :2001/02/19(月) 09:36
>>269 printf("%.6s\n", "1234567890");
printf("%.*s\n", 6, "1234567890");
2つのprintfはを標準出力に"123456"を出力する
詳しいことはリファレンスマニュアル参照。
275 :
デフォルトの名無しさん :2001/02/19(月) 13:19
276 :
入社前研修中 :2001/02/20(火) 19:21
プログラミング言語Cで勉強中なのですが #include <stdio.h> int main() { int c,ct=0; while((c = getchar()) != EOF){ if(c=='\n') ct++; } printf("%d=\n",ct); return 0; } EOFは何を入力すればいいの?
277 :
デフォルトの名無しさん :2001/02/20(火) 19:25
>>276 環境を書いてくれ
winならctrl+z
unixならctrl+d
>>277 ctrl+cはwin, unix共にプログラム中断だ
# CNTLは置いとくとしても
280 :
入社前研修中 :2001/02/20(火) 23:43
どうもありがとうぞざいます。276です。環境は家ではVC、会社でUNIXです。 どころで、推薦書ってありますか。どうもK&Rは色数少ないし、表もあんまりないので 別の参考書も買おうとしていますが、どれも難しいですか。
281 :
入社前研修中 :2001/02/21(水) 00:01
動かしてみたら、うまく動いてくれないんですが。 C−Zのあと表示されないです。しくしく。 どこがダメなのか教えてプリーズ。
282 :
デフォルトの名無しさん :2001/02/21(水) 00:26
>>280 色数少ないとか言ってる時点で、もうダメダメ
まぁ、そんなに甘くないよ、もっとがんばんな
283 :
デフォルトの名無しさん :2001/02/21(水) 00:44
>入社前研修中 DOSプログラムの勉強しても役に立たないよ。 Windows系の勉強しなよ。 はっきりいってDOSよりもWindowsの方が簡単。 今どき getchar() なんて使わないよ。 ツインファミコンみたいなもん。
んー。 でも、起動時引数や標準入力を食って、標準出力に吐き出す フィルター系ソフトくらいは組めた方がいいぞ。 OSのcopyコマンドはこんなふうにして作られてるって感じのことを 知っていれば、OSをことさら神聖視しなくなる。 それは正しい理解につながるような気がする。
285 :
269 :2001/02/21(水) 01:39
どもありがと269です。リファレンスもってねっす。 まだまだ未熟っす。
286 :
入社前研修中 :2001/02/21(水) 01:44
あの〜VCは凶悪なほどむずかしいんですが。 関数見ただけで貧血。一応、CのあとC++、VCと続くみたいです。 いきなりVCでも大丈夫なの?合間にVBもやるらしい。
287 :
>283 :2001/02/21(水) 01:45
簡単という意見には異論あり。 Windowsは泥沼にはまる。 OSの仕組みの理解すらともするとままならん。 まぁ、役にたつし、Windowsの方が便利なことはわかるけど。
288 :
>286 :2001/02/21(水) 02:32
VCとC,C++を同列に考えないでください。 もし、そう教え込まれたなら教え込んでいる方が 問題ですが、まあ勘違いでしょう。 C,C++は開発言語 VC++はWindows用の開発環境です。 VC++はC,C++によるWindowsアプリの開発を「凶悪」に 支援するためのツールです。 C,C++より百倍「貧血」を催させるCOMや、 わけのわからない独自のクラス(マクロ)ライブラリを インストールしてすぐに提供してくれます。 けれど、初めて覚える言語としてC言語はお勧めです。 VBやPerlなどからはじめた場合、 初心者の方は変なクセがつきがちです。 Cが気に入った場合、合間に入るVBは極力無視しましょう。 (断っておきますが、VBが気に入った場合はVBしてください。 人が勧めないからといって便利なツールを使わないのは間違い です) またC言語を覚えたら、すぐにC++に行けるとは考えな いでください。C言語はカンの有るかたなら一週間くらい で仕様が理解できますが、C++を覚えるのは無理です。 じっくりやりましょう。
289 :
入社前研修中 :2001/02/21(水) 23:26
ふ〜〜、一通り終了。ポインタむずい。今度はデータ構造、アルゴリズムか。 こっちの方もむずかしい。来週はJAVAの社外研修。 社会人って大変なのね。すでに挫折気味です。しくしく。
290 :
デフォルトの名無しさん :2001/02/26(月) 15:00
Windows2000でC言語やるにはどうしたらいいの?
292 :
デフォルトの名無しさん :2001/02/26(月) 15:15
VC++はMSの商品名です。
293 :
デフォルトの名無しさん :2001/02/26(月) 20:06
カーニハンの「プログラミング作法」に、整数定数はマクロ(#define) ではなくenumを使ったほうがよい、と書いてあって、たしかにその通り だなと思ったんだけど、実際にはenumを使ってるコードをほとんど見た ことない。enumを使ってる人いる? [マクロ] #define NUM_FIELD 20 #define NUM_RECORD 16 [enum] enum { NUM_FIELD = 20, NUM_RECORD = 16 };
294 :
デフォルトの名無しさん :2001/02/26(月) 20:20
295 :
デフォルトの名無しさん :2001/02/26(月) 20:23
>>289 その会社むちゃくちゃやな。(笑)
結局なにもものにならず終了。って感じだね。
296 :
293 :2001/02/26(月) 21:37
>>294 このページ知らなかった。ありがとう。
「列挙型の有効範囲がブロックであること」っていうのは、
ひとつの関数でしか使われない整定数があるときとかに便利だね。
「C++になったときいいことがあるかも」っていうのが分からない
んだけど、どういうこと?
C++だと定数はconstを使うのがベストなんだよね。
297 :
デフォルトの名無しさん :2001/02/26(月) 23:46
>>296 C++になると、そのfaqでCコミュニティーの多くが望んでいた
という、チェックが仕様になった。
(のだったと思う)
constはチェックされないね。
よくある例として
enum bool(TRUE,FALSE);
298 :
デフォルトの名無しさん :2001/02/27(火) 00:01
>297 falseがサキだね。false == 0。 enum定数はデバッガ内でつかえるので、#defineより断然良い。
>>298 デバッガ内で使えるってところ、ステキ
そうか、その手があったか・・・
300 :
デフォルトの名無しさん :2001/02/27(火) 03:15
SUMの値が1000000くらいあって、 target = rand()%SUM; と書き(もちろんsrand済み)、1000000内の値をランダムに出そうとしているのですが、どうやら上限がかなり低いみたいなので小さな数字(30000くらいまで)しかでません。 どうやったらうまくいくでしょうか?
ちなみにSUMの値は通常はランダムです。
302 :
デフォルトの名無しさん :2001/02/27(火) 03:51
>>300 rand関数は0からstdlib.hのRAND_MAXまでの値を返すみたいだから
それをチェックしてみるとか。。。
303 :
300 :2001/02/27(火) 06:16
とりあえず某サイトに書いてあったのを利用しました。 int N = 32768,n1,n2,result; n1 = rand(); n2 = N*rand(); result = n1 + n2; return result; しかし何か値の偏りがあるような気がします・・・
>>302 SUM>RAND_MAXなら
target=rand()+RAND_MAX*rand()%(SUM/RAND_MAX);
こんな感じ?
でも、うちのお婆ちゃんが
「randはなるべく上位ビットをつかうんじゃよ・・・」
と遺言を残してた気がするけど
intって30000ぐらいが限界ってどっかで聞いたことあるよ
>>305 君はまだ16ビットの世界でプログラムしてるのか?
307 :
デフォルトの名無しさん :2001/02/27(火) 21:23
初心者なんですが、質問があります。 int i[]={5,5,5,5,5,5,5}; もし、こういうのがあって個数を調べたい プログラムを書くにはどうすればいいのですか? よろしくお願いします。
308 :
デフォルトの名無しさん :2001/02/27(火) 21:32
>>307 えーっと、配列の要素数をCで調べたいって事なら無理です。
javaだとi.lengthで調べられます。
309 :
デフォルトの名無しさん :2001/02/27(火) 21:42
そうなんですか? どうやっても出来ないから、自分ってめちゃあほやなって 思ってたんでなんとか救われました。 あなたは神様ですか? ありがとうございました。
310 :
SAGE :2001/02/27(火) 21:56
配列なら sizeof でいいんでないの?
>>307
311 :
デフォルトの名無しさん :2001/02/27(火) 22:26
>>307 そのi自体の型はint(*)[7]ですな。
sizeof(i)=sizeof(int)*7
になってるはずですよん。
関数のint*型引数とかにiをわたすと、関数内部では
int*型にキャストされてしまうので、そこでは
sizeof(i)=sizeof(int*)
だ・・・でいいんだよね?>詳しいひと誰か
配列とポインタの互換周りって、なんだかなあ、と思う。
この辺のややこしさが「ポインタ難カシヤ」と言わしめる
元なんだろね。おいらも、いまだに「難しい」というか
「胡散臭い」とおもうじょ。Javaのやり方が楽でいいよね。
(配列型の内部に、長さを示す変数領域持ってるっす)
312 :
デフォルトの名無しさん :2001/02/28(水) 00:47
>>308 >えーっと、配列の要素数をCで調べたいって事なら無理です。
え?
(sizeof(i)/sizeof(i[0]))で出来ますが?
313 :
デフォルトの名無しさん :2001/02/28(水) 01:15
>>300 標準rand以外の乱数生成ルーチン(MTとか)を使うべき。
>>307 ポインタになったときでも使えるように、
・要素の最後に終端子(-1とか)を入れて、strlenと同じ方式で逝け。
・構造体にしてint lengthとかを追加しろ
314 :
308 :2001/02/28(水) 02:02
>>312 えーっと、そんなに自身有り気に言われるとちょっと自信ないけど、
sizeof(i)ってのは311氏の書くようにsizeof(int*)なんじゃ無いかな?
そうするとintのポインタの(大体のOS上で32bitとかかな?)大きさを
返すような気がするだけど・・・。
Cは大して知識が無いんで、もし間違ってたら詳しいこと解説希望&307さん
ゴメン。
315 :
312 :2001/02/28(水) 02:26
>>314 >えーっと、そんなに自身有り気に言われるとちょっと自信ないけど
いえ、私も詳しくないので質問の意味で書きました。
もっとマシな書き方をするべきでした。
あれはあるページで見つけたんですが、これじゃ駄目なのかな?と。
313さんが書いてる方法が多分良いんでしょうね、スキル有りそうだし、
出来たらコードで教えて欲しいんですけど・・・
って、こんなこと書いちゃ駄目ですよね・・・。すみません。
なんだこのスレの厨房さは・・ java 屋は知らんのなら黙ってろ
>316 あんたも知らんようだから黙ってれば(w
オマエモナー >317
319 :
デフォルトの名無しさん :2001/02/28(水) 05:14
320 :
デフォルトの名無しさん :2001/02/28(水) 09:41
>>311 iの型はint[7]になります。int(*)[7]になるのは &iとした場合です。
sizeof(i)はsizeof(int)*7になります。ちなみにsizeof(&i)はポインタのサイズに
なります。
結論としては312氏のやり方でOKです。
C99なら、関数に渡すときの仮引数をint a[*]としておけば同じやり方ができるみたい。
321 :
デフォルトの名無しさん :2001/02/28(水) 10:09
確かに312でいいんだけど、307のような質問の場合、まず絶対と言っていいほどに、 「i を関数に渡したとき、その関数の中で i の要素数を知るには?」 なんだよね。 もしそうなら無理。要素数を別に渡すか313のやり方しかない。
322 :
デフォルトの名無しさん :2001/02/28(水) 13:50
>>321 関数に渡したときポインタに成り下がるんだから、その仕組みが
わかっているなら 関数に渡して要素数を知ることがナンセンスだって
わかるはずだけどな。
ついでにいえば、Cは要素数を知る仕組みを配列に入れることを
スペースの無駄、作業の無駄だと考えたんだよ。
C Trusts the programmer.
C keeps the language small and simple.
C makes it faster, even if it is not easy for novice programmer.
それくらい自分で管理しろということだ。
323 :
デフォルトの名無しさん :2001/02/28(水) 14:56
配列のサイズは#define切った方がよくないかい? for文とかでも使えるし。 もしくはターミネートしておく(307と同じ)。
>>323 #defineするくらいならtypedefする
325 :
デフォルトの名無しさん :2001/02/28(水) 15:18
cc870 ってコンパイラのリンクの時↓のようなエラーがでるんだけど。。。 TULINK-Error-209: Reference made to unresolved external symbol "__FP_STACK"
326 :
デフォルトの名無しさん :2001/02/28(水) 15:44
>>325 cc870って、TLCS-870用のコンパイラですよね。
ランタイムライブラリをリンクしないと__FP_STACKがないので怒られますよ。
cc870はフレームポインタを__FP_STACKというtiny領域のグローバル変数に持たせて
いるので、絶対必要です。他にランタイムライブラリをリンクしないと、c870_fin
とか c870_foutのような関数の最初と最後で行うスタックフレーム操作のサブルーチン
や乗除算ルーチンもリンクされません。
327 :
325 :2001/02/28(水) 16:01
>>326 ありがとうございます!やってみるです。
(C言語スレで聞いていいか解んなかったけど、聞いてよかった)
328 :
デフォルトの名無しさん :2001/02/28(水) 16:19
>>322 その含蓄の深い三行の出典をキボンヌ。
(K&R?)
GCCとかでコンパイルすると、 構造体はバウンだリーとかを考慮した最適化がかけられてしまい ますが、 どのように最適化されたかを簡単に調べる方法を教えてください。 ちなみに私の場合、面倒くさいのですが gdb上で各要素の分かりやすい値を突っ込んでダンプ、 などと幼稚な方法でちまちま調べててもう疲れました・・・
アセンブラの出力を見なさい。>329
-S をつけてコンパイルして、hoge.s を眺めたのですが さっぱりです・・・ どこから手をつければよいのやら・・・ アセンブラの知識はX1の頃でストップしています
アセンブラを学習しなさい。>331
struct tester { char c1; int i1; double d1; char c2; double d2; }; printf("%d\n", offsetof(struct tester, i1)); printf("%d\n", offsetof(struct tester, d2));
>>333 結局ひとつひとつ書き出すことには変わりないけど
gdb使うよりは早くできるかも
>>332 勉強中
335 :
デフォルトの名無しさん :2001/03/01(木) 14:56
passing by reference じゃなく passing by name の規則によると変数はどう変わっていくんでしょうか? 説明するためのいい例はないでしょうか?
>>335 static void swap(int a, int b)
{
int tmp;
printf("a = %d, b = %d\n", a, b);
tmp = a;
a = b;
b = tmp;
printf("a = %d, b = %d\n", a, b); // ←a = 20, b = 10になるが
}
int main(void)
{
int a = 10, b = 10;
printf("a = %d, b = %d\n", a, b);
swap(a, b);
printf("a = %d, b = %d\n", a, b); // ←a = 20, b = 10にはならない
return 0;
}
337 :
デフォルトの名無しさん :2001/03/01(木) 15:36
すばやいアドバイスほんとにありがとうございます。 でも上の例って、、、 passing by value − サブファンクションにコピーを作る のと同じではないでしょうか?
338 :
デフォルトの名無しさん :2001/03/01(木) 21:46
C言語(C++でもよいですが)で全角の文字列の中にある 全角のスペースを削除したいのです。 例えばchar line[256]の中に次の一行のような文字列 C言語も VC++も 両方とも、 中途半端 なのです。 が入っていて それをを次の一行のように変換したいのです C言語もVC++も両方とも、中途半端なのです。 できれば半角のスペースがあっても削除してくれるほうがよいのですが 今は全角スペースだけということでよいので教えてください。 全角(漢字)のアスキーコードとかさっぱりわからず、混乱中です。
339 :
デフォルトの名無しさん :2001/03/01(木) 21:57
>>338 ・・・PerlとかAWKとかで十分ッス。
つうか、そんなもんエディタの”一括変換”ででもできるだろ。
340 :
デフォルトの名無しさん :2001/03/01(木) 22:00
>>338 プログラム内でそういう処理をしたいということでは?
とは言え…。
341 :
338 :2001/03/01(木) 22:10
>>340 そのとおりです。元のデータがCDの中に入っているのですが
そこから取り出したデータにたまに全角スペースが入っているのです。
見栄えが悪いので削除したいのです。
342 :
ぴよこ :2001/03/01(木) 22:28
初めまして。現在、WCHAR型について調べており実際にVC++6でこのようなコードを組んでみました。 -------------------------------------------------------- #include <stdio.h> #include <string.h> #include <wchar.h> #include <windows.h> void main() { char buf[256]; wchar_t wbuf[256]; FILE* fp; if ((fp=fopen("test.txt", "r"))==NULL) return; else{ while ((fgetws(wbuf,256,fp))!= NULL){ wsprintf(buf,"%ls",wbuf); printf("%s",buf); } fclose(fp); } } -------------------------------------------------------- test.txt は 「abcあいう」 という文字列を記しています。 このしかし、このプログラムでは 「abc___」 というように 2バイト文字である日本語部分が潰れてしまいます。 原因、解決方法を教えて下さい。長文失礼しました。
動くかどーか保証せんが。
>>338 static const char* zs = " "; // ←全角スペース
void rmvZenSpace( char* src, char* dst )
{
while( *src )
{
if( !is_lead_byte(*src) ) // ←is_lead_byteは適当に何とかしろ
*dst++ = *src++;
else if( *src!=*zs || *(src+1)!=*(zs+1) )
*dst++ = *src++, *dst++ = *src++;
}
}
>>342 printf とかも全部 w な方を使わないとダメじゃないのん?
344 :
デフォルトの名無しさん :2001/03/01(木) 22:43
>>338 const unsigned char space[] = "(ここ)";
printf( "%u,%u\n", space[ 0 ], space[ 1 ] );
"(ここ)"には全角スペースを入れて試そう。
345 :
338 :2001/03/01(木) 23:12
>>343 ありがとうございます。実行しようとしてるのですが
そのまえにis_lead_byteをどうすればいいかで悩んでます。
>>344 実行してみました、129,64と出てくるだけです
カンマをはずしても12964になるだけです。
ちなみに
printf( "--%c%c--\n", 0x81,0x40 );
とやると--と--の間が全角のスペースになるのですが、
それでいろいろやろうとしてもうまくいかなかったのです。
>>343 wsprintf(buf,"%ls",wbuf); で WCHAR型からchar型にして
printf()で出力するというふうにしてみたのですが、
wsprintfの過程で既に文字は潰れていたのでしょうか?
347 :
デフォルトの名無しさん :2001/03/02(金) 00:31
>>342 試してみれ。
#include <stdio.h>
#include <locale.h>
int main()
{
wchar_t wb[255];
setlocale(LC_CTYPE, "jpn");
FILE *fp = fopen( "test.txt" ,"r");
fgetws(wb,255,fp);
printf("%S",wb);
fclose(fp);
return 0;
}
348 :
ぴよこ :2001/03/02(金) 01:01
>347 !! setlocale() という関数があるとは知りませんでした。勉強不足でした・・・。 大変たすかりました。ありがとうございます!
349 :
デフォルトの名無しさん :2001/03/04(日) 15:26
\ ←コレの半角ってどうやって出すんですか?
\
あげ
352 :
デフォルトの名無しさん :2001/03/04(日) 19:01
char main=-61; これでコンパイル通ってしまうんですが、 これに関する詳しい説明をお願いします。 あと、エントリーポイントについても宜しく
>>352 アセンブラまででコンパイル止めてhoge.sを見ればわかるぴょん
>>352 うそつきました。それでは分かりませんでしたぴょん。
でも、gdb上でmainをダンプすれば一目瞭然だぴょん
またも失礼。ダンプは間違い。disasだぴょん
>>352 コンパイルが出来てもリンカ通るとは限らない。
実際VCでは通らないし。関数や変数の修飾子の問題だと思うけど。
>>356 VCのことは分かりません。申し訳ないぴょん。
gccならx86系のマシンなら通ると思うぴょん。
つーか、実際動くコードだぴょん。
358 :
デフォルトの名無しさん :2001/03/05(月) 17:27
24Bit色のビットマップを2値化するにはどうすればいいのでしょうか? 24Bit→256色→閾値より大きいと1、小さいと0という風に考えたのですが もしこうなら、この時に24Bit色から256色への変換する方法を教えてくれませんか?
359 :
デフォルトの名無しさん :2001/03/05(月) 17:47
360 :
デフォルトの名無しさん :2001/03/05(月) 23:53
352です int main=37059; といれてみて、よーやくわかりました。 ぴょんさんありがとう mainてこんな動き方するんですね ほかの関数でも使えるのかな。 アセンブラの本を引っ張り出して マシン語プログラミングをはじめてしまいました process_startupとかについて教えてください
>>360 Instruction OpCode表があれば文字列としても書けるね。
んでその文字列を実行・・・
結構面白いぞ。
>>358 RGBたしていきなり2値化するのがいいかと。
363 :
デフォルトの名無しさん :2001/03/06(火) 10:55
>>358 RGB→YCbCrに変換してください。
その後、Yだけ見て2値化すればOKです。
364 :
358 :2001/03/06(火) 12:06
test
366 :
デフォルトの名無しさん :2001/03/09(金) 12:56
ラプラシアンの輪郭抽出ってどうやるんですか?
>>366 隣接画素同士の差をとる演算で微分を近似する。
L(x,y)=4*f(x,y)-{f(x,y-1)+f(x,y+1)+f(x-1,y)+f(x+1,y)}
みたいにする。
368 :
366 :2001/03/09(金) 13:40
どうもありがとう、もう一つ(二つ?)いいですか? 16777215色の場合その式でf(x,y)に当たる値はどう表すんですか? 例えば(200,100,120)という色が合った場合それを一つの値とする時 はこの200と100と120をどう計算すればいいんでしょうか? そしてその処理が終わった後にまた3ビットのRGBに値を入れる場合は その一つの値をどう分けるのですか? もう一つは一番外枠のピクセルの場合は内側にないので f(x-1,y-1)の時はどの値を使えばいいのですか? よろしくお願いします。
>>368 > 16777215色の場合その式でf(x,y)に当たる値はどう表すんですか?
> 例えば(200,100,120)という色が合った場合それを一つの値とする時
> はこの200と100と120をどう計算すればいいんでしょうか?
> そしてその処理が終わった後にまた3ビットのRGBに値を入れる場合は
> その一つの値をどう分けるのですか?
Cならば構造体のメンバとして、C++ならクラスの属性として表現できる
なんかC/C++の参考書よんでみそ
一応、Cの場合の例を示す
struct Coler {
int Red; // 0-255までなのでunsigned charでも良い
int Green;
int Brue;
}; // 画素の定義
struct Coler x = { 200, 100, 120 }; // ある点x
> もう一つは一番外枠のピクセルの場合は内側にないので
> f(x-1,y-1)の時はどの値を使えばいいのですか?
適当な値でいいんじゃないの?(白とか黒とか)
370 :
368 :2001/03/09(金) 14:19
>>369 ありがとうございます。
なんとなくわかったので後は参考書を読んでみます。
本当にありがとうございました。
371 :
デフォルトの名無しさん :2001/03/09(金) 14:55
>>364 参照先のプログラムで大丈夫ですよ。
このプログラムでは、RGB->YCbCrのYだけ計算していますね。
372 :
デフォルトの名無しさん :2001/03/09(金) 15:00
>>370 本当にわかったんでしょうか。
ラプラシアンフィルタを何にかけたいんですか?
RGBデータにじかにかけてもどうしようもないような気がするんですが。
ラプラシアンをかける目的はなんですか?
輪郭強調なら元のデータに足さないとだめだし、輪郭抽出なら2値化が
はいるでしょ?
何がしたいの?
373 :
デフォルトの名無しさん :2001/03/09(金) 15:07
C言語もC++も知らないのですがやってみたいです。 で、本探しているのですがVBのグラフィックスプログラミング の本は有るのですが、VC++のグラフィックスプログラミング の本が無いのでどなたか知っておられる方がいらっしゃいましたら 教えてください。
374 :
368 :2001/03/09(金) 15:58
>>372 自分でわかった気になってたものよりも複雑そうですね。
ラプラシアン(2次微分)の輪郭抽出をしたいんですが、
自分にはまだ手におえなさそうです、
よろしければ教えていただけないですか?
(質問ばかりですみません)
375 :
デフォルトの名無しさん :2001/03/09(金) 16:13
画素の値はRGBの3値で現されるのと同様、3x3行列の演算で、他の 座標系に変換できるんだよ。代表的なのにYCbCr、XYZ、Labなんかが ある。 で、YCbCrとLabでは、YとLが色を含まない輝度成分、CbCrとabが 色情報になる。 だから、カラー画像からモノクロ濃淡画像をつくるにはYやLを計算して、 やればよく、そのモノクロ画像の輪郭抽出をするには、Y成分やL成分に ラプラシアンフィルタを施し、必要ならある値以上を1、それ以外を0に ニ値化すればいいわけ。
376 :
デフォルトの名無しさん :2001/03/09(金) 16:20
ここで問題になるのは色の輪郭。これは知らないので、 適当なこと書いてたらごめんね。 まず、変化の一様性が問題になるよ。 たとえば128から138に10変わった時と、230から240に10変わった時で、変化 の大きさがあまりに違えば、値の差から輪郭を得る時に問題になるよね。 これをなるべく一様にしたのがLab表色系だよ。 だから色の輪郭を抽出するには、Labを使うべきだと僕は思う。 簡易的なものだったら、YCbCrでも良いかもしれないし、ひょっとしたら R、G、Bそれぞれに使っても良いかもしれない。
377 :
デフォルトの名無しさん :2001/03/09(金) 16:22
378 :
368 :2001/03/09(金) 16:25
>>375 ありがとうございます。
ということは16777215色の画像をモノクロ濃淡画像へ変換し、
YCbCrのYの値にフィルタをかけて必要ならば
2値化するという流れでいいんでしょうか?
私は輪郭抽出はカラーで表示されるものだと思っていたので
その点から間違えていました。
364さんが書かれたリンク先の物を見たのですが
a = 0.3*image[y][x][0] + 0.59*image[y][x][1] + 0.11*image[y][x][2];
これがYCbCrのYを計算する公式だということでしょうか?
本当に度々すいません。
379 :
デフォルトの名無しさん :2001/03/09(金) 16:37
380 :
デフォルトの名無しさん :2001/03/09(金) 17:02
>>378 とりあえずその流れでいいんじゃないかな。
まずやってみるといいよ。
その後で、同じ明るさで色違いの輪郭を出すのに頑張るとか、
斜めの輪郭と縦横の輪郭の出方が違うからフィルタを考えるとか、
色々やってみるといいよ。
381 :
デフォルトの名無しさん :2001/03/09(金) 17:10
382 :
368 :2001/03/09(金) 17:40
ご親切にありがとうございます。 まず、作ってから色々試してみようと思います。 本当にありがとうございました。
383 :
デフォルトの名無しさん :2001/03/09(金) 21:10
すいません。 今、Cのプログラムを作っているのですがコンビネーション(nCrってやつです)の結果を出すプログラムを作りたいのです。 例)5C3なら 1 2 3,1 2 4,1 2 5,1 3 4,1 3 5,1 4 5, 2 3 4,2 3 5,2 4 5, 3 4 5 のようにです。 普通にプログラムを書けばfor文を何回か組み合わせたらできるのですがnCrのrの値が大きくなればfor文の回数が増えてプログラムが汚くなってきます。 そこで、一般的にnとrの値を入力すれば全ての組み合わせが表示されるプログラムをつくりたいわけです。 しかし、いくら考えてもうまくいきません。 どうやったらいいか教えてください!
>383 キーワードは「再帰」。 ( ……もっと簡単に出来るかもしらんけどネ )
385 :
デフォルトの名無しさん :2001/03/11(日) 20:59
C++やりたいんですけど、C言語知らないと C++の入門書読んでもだめですか??
>>385 FAQですよね。C知らない人向けのC++の入門書を読めばいい、というのが大抵の答えですが、
実際の所どうなんでしょう。
どちらにしろC++をマスターするということは、C言語も同時にマスターすることですので
(どの機能がC++特有なのかわからない、という問題は起こりそうだけれど)
本質的な問題では無いかもしれません。
387 :
デフォルトの名無しさん :2001/03/13(火) 20:35
ポインタと配列で聞きたいんだけど、このソートで #include <stdio.h> #include <string.h> #include<conio.h> char *sort(char *, int); void main() { char str[20]; char *ptr; int n; ptr = str; printf("ソートする文字列を入力してください(20文字以下) :"); gets(ptr); n = strlen(ptr); printf("-----Result-----\n"); printf("%s\n",sort(ptr,n)); getch(); return 0; } わざわざポインタ使わなくても、gets(str);n=strlen(str); sort(str,n)でいいと思うし、この場合ポインタ使うメリットって あるんですか?
388 :
デフォルトの名無しさん :2001/03/13(火) 22:33
389 :
387 :2001/03/14(水) 23:44
やっぱ意味ないのね。 ども。
>>387 どうでもいいが、19文字までじゃねえの?それだと
>390 全くもってどうでも良いサゲ
392 :
デフォルトの名無しさん :2001/03/19(月) 01:59
リスト構造になってるデータをソートしたいんだけど、 終わりのデータNULLから一つ前はどうやってみるの? NULL−1は出来るの?リストの入れ替えしかないの? おねがい。 #include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #define WORDLEN 50 struct wd { struct wd *next; char *str; int count; }; typedef struct wd WORD; WORD *word = NULL; WORD *add_word(char *); int main(int argc, char *argv[]) { FILE *fp; char bunkatu[10] = " ,\t\n"; char *tokun; char w[WORDLEN]; WORD *p; fp = fopen(argv[1],"rb"); if(fp == NULL){ fprintf(stderr,"ERROR"); exit(1); } while (fgets(w, WORDLEN,fp) != NULL) { tokun = strtok(w,bunkatu); while(tokun!=NULL){ p = add_word(tokun); if (p == NULL){ fprintf(stderr, "Too many words\n"); exit(1); } tokun = strtok(NULL,bunkatu); p->count++; } } for (p = word; p != NULL; p = p->next) { printf("%d %s\n", p->count, p->str); } fclose(fp); return 0; } WORD *add_word(char *w) { char *s; WORD *p; for (p = word; p != NULL; p = p->next) { if (strcmp(w, p->str) == 0) return p; } s = (char *)malloc(strlen(w) + 1); if (s == NULL) return NULL; strcpy(s, w); p = (WORD *)malloc(sizeof(WORD)); if (p == NULL) return NULL; p->str = s; p->count = 0; p->next = word; word = p; return p; }
再帰のソートアルゴリズムつかえば可能 クイックソートかマージソートあたりでいいんじゃねえか? (リストでクイックソートすると比較用の代表値に扱ってるリストの 頭の値しか使えないのがアレだけど) コードは眠いんでパス
394 :
デフォルトの名無しさん :2001/03/22(木) 22:18
CとC++ってどう違うんですか? Cで出来ることは、C++でも出来るんでしょうか? ついでにC++はなんて読むんですか?
395 :
超初心者です。 :2001/03/22(木) 23:04
現在C言語を勉強中なのですが #include <stdio.h> int main() { int a[5]; int i; for(i=0;i<5;i++){ printf("%d人目の点数を入力して下さい。->\n",i+1); scanf("%d",&a[i]); } for(i=0;i<5;i++){ printf("%d番目の人の点数は%dです。\n",i+1,a[i]); } return 0; } これを点数の高い順(と低い順)にソートして出力せよ というのですが全く分かりません。 学校の先生から明日までにと言われてしまいました。 本当に困っています。誰か分かる方いましたら答えを教えて下さい。
396 :
デフォルトの名無しさん :2001/03/22(木) 23:08
>>394 しーぷらすぷらす
CでできることはC++でもできます。
というか、Cだけの機能で書いてもコンパイルできます。
397 :
( ´∀`)さん :2001/03/22(木) 23:10
下の宣言が理解できず困ってます。どう読めばいいの(@@;)? void (*spoint(int spx,void (*func)(int)))(int);
398 :
通りすがり :2001/03/22(木) 23:16
>>397 typedef void function(int);
funtion *spoint(int spx, function *func);
とすれば簡単。
399 :
( ´∀`)さん :2001/03/22(木) 23:21
即レスありがとうございます。でも、 考える時間を時間を下さい。 あほ>俺
5枚の皿に、それぞれりんごが乗っています。 りんごを大きい順に並べ替えなさい。しかし、りんごは一つしか持ち上げられません。 もしその約束を破ったなら、魔人が彼方と彼方の家族を殺します。 並べ替えるための道具として、九谷焼の皿を一枚貸してあげます。 という状況をどうやって乗り切るかを試行錯誤すれば解ると思います。 int kutani; kutani = a[i]; a[i] = kutani; aはりんごのaです。
>395 に対してね。
>>396 どうもです。
「しーぷらぷら」だと思ってたよ・・・。
>>402 日本ではそれでいーんじゃない?
便乗だけど、C#ってなんて読むの?
シーイゲタ?
しーしゃーぷ。ファックMSな人なら、しーはっしゅ。
405 :
デフォルトの名無しさん :2001/03/24(土) 12:49
C言語学習ソフトのstudyCってどうなんですか? 無料でコンパイル要らずで使いやすいと思うのですが お勧めできますか?
406 :
nanacy :2001/03/24(土) 16:21
>>397 -398
void (*spoint())(int); で spoint が戻り値として
返す関数へのポインタを使って関数をコールするってこ
とですよね? でもプロトタイプってことは、どういう
意味だろう? 関数へのポインタを返す場合は、
void (*func()) (int); と宣言するのかな? 戻り値
void で引数に int を取る関数へのポインタという意味で。
>>398 の方の意味がわからない・・(^-^;
407 :
デフォルトの名無しさん :2001/03/24(土) 16:28
>>404 ごめん。しーはっしゅってどういう意味があるのか教えて。
408 :
デフォルトの名無しさん :2001/03/24(土) 16:31
>>405 今時のパソコンは超速いから小さなプログラムならコンパイルも一瞬。
そんな訳で、インタプリタで即実行というのは今時あまり利点ではないかも。
BCCとか色々本格的なフリーのコンパイラも今はある事だし。
使ったこと無いから使い勝手は判らないけど…。
409 :
デフォルトの名無しさん :2001/03/24(土) 16:50
>>407 #はハッシュマーク(hash mark)と呼ばれる事もあるです。で、hashを
辞書で引いてみると・・・(むしろC++の方に当てはまりそうな意味です)
410 :
通りすがり :2001/03/24(土) 21:33
>>406 signal関数の仕様を調べてみてください。
411 :
( ´∀`)さん :2001/03/24(土) 22:56
>398 ごめん、考えても分からない。 もう少し分かりやすくならないでしょうか?
412 :
通りすがり :2001/03/24(土) 23:02
>>411 406と同じで、signal関数の仕様を調べてみましょう。
関数名以外、全く同じ形式になっていますから。
413 :
これ :2001/03/24(土) 23:40
__try __export ってどこのヘッダで実装されてるか誰か知らない? つかってるのはmingw(gcc2.92.2)。
414 :
通りすがり :2001/03/24(土) 23:47
>>413 /usr/include/w32api/excpt.h
415 :
通りすがり :2001/03/24(土) 23:51
>>413 /usr/include/w32api/excpt.h
416 :
414〜415 :2001/03/24(土) 23:53
ごめん2回送ってしまった。
>>409 なるほろ〜。個人的には、構造化以降のオブジェクト指向なんかの
考えは、全部hashしている気もする。厨房でスマソ。
418 :
413 :2001/03/25(日) 00:18
>>414 -416
なんて早すぎ。ありがとう。
__exportでなくて__exceptだったりして。
419 :
デフォルトの名無しさん :2001/03/26(月) 11:47
struct ABC{ int aaa; int bbb; int ccc; }; って構造体と文字列char sz[10]があって、 szが"aaa"のときはABCのメンバaaaを処理 szが"bbb"のときはABCのメンバbbbを処理 szが"ccc"のときはABCのメンバcccを処理 みたいに、その文字列が表している構造体のメンバを参照したいのですが、可能でしょうか?
>>419 これじゃ駄目?
/* szの文字列より、abcのメンバのポインタを返す */
/* szの文字列が不正の場合、NULLを返す */
int *func(const char *sz, const struct ABC *abc)
{
if(strcmp(sz, "aaa") != 0){
return &abc->aaa;
} else if(strcmp(sz, "bbb") != 0){
return &abc->bbb;
} else if(strcmp(sz, "ccc") != 0){
return &abc->ccc;
}
return NULL;
}
怪しげなマクロを駆使すれば可能かもしれないが、
szに"ddd"とか入れられた場合、どうする?
>420 説明不足だったのが悪いのですが、実際はその構造体のメンバは50個ぐらいありまして、さらに今後、メンバが追加されたり、削除されたりするかもしれないんです。 それでコード上にif文をたくさん書いて処理を分岐させるのは面倒ですし、構造体の仕様が変わるたびにコードを変更しなければなりません。 幸い構造体のメンバの一覧はテキストファイルの中の文字列から拾えるので、できればその文字列をもとに構造体のメンバにアクセスしたかったのです。
422 :
デフォルトの名無しさん :2001/03/26(月) 12:51
>>421 こんなのは?
typedef struct _dat{char[4] key, int val} DAT;
DAT[] = {
{"aaa", 1},
{"bbb", 1},
{"ccc", 1},
{"ddd", 1},
{"eee", 1},
{"fff", 1},
};
423 :
422 :2001/03/26(月) 12:53
あうぅ、エラってる。 てきとーに書くといかんな、やっぱ。 まぁ、でも言いたい事はわかるよね。
424 :
デフォルトの名無しさん :2001/03/26(月) 13:47
>>422 -423
文字列を添字にした配列、いわゆる『連想配列』だね。
と言うことで、419はサーチエンジンとか参考書とかで調べるべし。
でも、その様子だとそもそもの設計に問題がありそうな気がするなぁ
425 :
デフォルトの名無しさん :2001/03/26(月) 13:49
>>419 こんなのは?
struct XYZ{
char *szpName;
size_t nOfst;
VARTYPE type;
size_t nSize; //要素数
};
struct XYZ table[]=
{
{"aaa",offsetof(struct ABC,aaa),VT_UI4,1},
{"bbb",offsetof(struct ABC,bbb),VT_UI4,1},
{"ccc",offsetof(struct ABC,ccc),VT_UI4,1},
{},
{NULL,0}
};
VARIANT v;
for( int n=0;NULL!=table[n].szpName;n++){
v.vt = VT_EMPTY;
switch( table[n].type ){
case VT_I4:
v.lVal = *((DWORD*)&buff[table[n].nOfst]);
v.vt = table[n].type;
break;
case ....
}
if( VT_EMPTY != v.vt ) break;
}
return v;
}
インデントつぶれると思うけど勘弁。
426 :
デフォルトの名無しさん :2001/03/26(月) 20:01
>>419 >構造体の仕様が変わるたびにコードを変更しなければなりません。
>幸い構造体のメンバの一覧はテキストファイルの中の文字列から拾えるので
テキストファイルだって変更する必要があるんじゃないの?
427 :
デフォルトの名無しさん :2001/03/27(火) 00:42
条件付きコンパイルって実際使うの? やっぱりやっといた方がいいかなぁ
428 :
デフォルトの名無しさん :2001/03/27(火) 00:47
(1)「氏名をローマ字で入力し、アルファベット順に出力する。 なお、氏名は14文字以内、忍従は50人以内とする」 (2)この名簿の作成をリスト構造を用いた処理に変更せよ っと言う問題が解けません・・・・ お願いします
429 :
デフォルトの名無しさん :2001/03/27(火) 12:28
>>428 (2)で“変更せよ”っていってるくらいだから
(1)はリスト構造を使わずに書けってことなのかよ
430 :
デフォルトの名無しさん :2001/03/27(火) 12:38
>>429 だから、50人以内ってあいてあんじゃん
432 :
デフォルトの名無しさん :2001/03/27(火) 12:52
>>421 make時にソースをテキストから生成すりゃ良いだけでしょ?
awk '$1 ~ /^[a-z]+$/ {print "if(!memcmp(sz,\""$1"\"))return &abc."$1";"}' foo.txt
ってな感じで
433 :
デフォルトの名無しさん :2001/03/27(火) 13:07
>>428 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
char name[50][15];
int n = 0;
main()
{
int i;
while( strlen(gets(name[n]))>0 ) n++;
qsort( name, n, 15, strcmp );
for( i=0; i<n; i++ ) printf( "%d %s\n", i+1, name[i] );
}
434 :
デフォルトの名無しさん :2001/03/27(火) 13:40
>>428 ではありませんが、課題をやってみました。
しかし、並び替えが正常に行われません。
qsortへの引数が間違っているように思われますが正しい引数の渡し方がわかりません。
ご教示下さい。また、おかしなところの指摘も歓迎します。
以下に課題のソースを示します。
(main部分のエラーチェックはやっていません)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME 14
#define MAX_MEMBER 50
static char *list[MAX_MEMBER];
static int listcnt = 0;
static int addlist(const char *);
int main(void)
{
char buf[MAX_NAME + 2]; /* '\n' + '\0' */
int i, sts;
/* 名前の追加 */
for(i = 0; i < MAX_MEMBER; i++)
{
(void)fgets(buf, sizeof buf, stdin);
if(buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = '\0';
if(strlen(buf) <= 0)
break;
(void)addlist(buf);
}
/* 並び替え */
qsort(list, listcnt, sizeof list[0], strcmp);
/* 名前の出力 */
for(i = 0; i < listcnt; i++)
{
printf("[%2d][%p][%-*s]\n", i, list[i], MAX_NAME, list[i]);
free(list[i]);
}
return EXIT_SUCCESS;
}
/* listに文字列の追加を行う */
/* 正常終了時0, 異常終了時-1を返す */
static int addlist(const char *value)
{
char *buf;
buf = malloc(strlen(value) + 1);
if(buf == NULL)
return -1;
(void)strcpy(&buf[0], value);
if(listcnt >= MAX_MEMBER)
return -1;
list[listcnt++] = buf;
return 0;
}
435 :
428 :2001/03/27(火) 14:20
読めないプログラムがあります(434とか・・・)
これってC言語じゃなくて、C++ですか?
>>433 ありがとうございます
とりあえず、もう一度これを見ずに自分でやってみます
それでも分からなかったら写させて貰います・・・・
436 :
デフォルトの名無しさん :2001/03/27(火) 14:32
438 :
428 :2001/03/27(火) 14:48
staticって僕ほとんど知らなくて・・・・
>>433 のプログラム何ですが、psortってのは、これで
いいんですか? 僕の参考書二冊にはこれ載っていなくて分かりません
後、stlenってのも、使い方が良く分からないです
439 :
デフォルトの名無しさん :2001/03/27(火) 14:53
>>438 ネタじゃないなら、プログラム作っている場合じゃないぞ
眼科に逝け!
440 :
428 :2001/03/27(火) 14:54
課題で10問出されたのですが、その内8問は僕の力でも 何とか出来るような難易度だったんですが、残りの二問が 考えても良く分かりませんでした 上記がその内の一問です 次の問題も・・・・すいません・・・・ 次の形式で売上データを登録した売上ファイルを作成する データは営業所コード順にソートして出力する 売上コード 営業所コード 商品コード 売上数量 売上単価 数字三桁 数字五桁 五桁 四桁 (2)上記で作った売上ファイルを読んで営業所別売上金額、 および合計金額を出力する です。厚かましくてすいません・・・・追い込まれているもので・・・
psort → qsort stlen → strlen 参考書には載っていないよな...
なに誤字のまんまのコピペで質問しまくっとんじゃゴルァ!
443 :
428 :2001/03/27(火) 15:00
すいません・・・・ 追い込まれているので・・・・
444 :
428 :2001/03/27(火) 15:03
qsortでも、載っていませんでした 一冊にはクイックソート自体は載っていたのですが 分かり易い僕が良く見ている本には載っていません・・・・ strlenはどうやって使うのかイマイチ分かりません
>>440 どこが分からない?
ソートして出力は
>>433 の応用でできないか?
つーかそれは応用してやれ
2) 営業所別売上金額を計算するのは、営業コードでソートしてあるんだから
営業コードが変化したタイミングで出力すればいいんじゃい?
446 :
428 :2001/03/27(火) 15:11
これは構造体を使うのですか?
>>446 yes
使わなくともできるけど、使った方が奇麗だな
struct 売上データ {
int 営業所コード;
int 商品コード;
int 売上数量;
};
みたいにな。
で、売り上げデータの配列を処理すればいい
448 :
428 :2001/03/27(火) 15:28
なるほどです 構造体最近勉強したので、まだ完全に理解していません 今日一日二問考えてみます 夜になっても出来なかったらまた来ます・・・・ こんな僕でももう直ぐプログラマーです・・・・ すいません 足手まといで
449 :
デフォルトの名無しさん :2001/03/27(火) 16:16
strlenについて ---------------- #include <stdio.h> char line[100]; int str_len; main(){ printf("文字入力してちょ\n"); fgets(line,sizeof(line),stdin); line[strlen(line)-1] = '\0'; str_len = strlen(line); printf("文字列の長さは%dだぴょーん",str_len); return 0; } ------------------------------- strlenは文字列の長さを扱う文字列関数。
>>448 理解していないなら使わないこと。
これが動くプログラム作成の基本です。
今回のケースでなら使わないほうが見通しが良いくらいだし。
>>450 新しいことには手を出すな、と言っているみたいで気に入らないのですが
452 :
デフォルトの名無しさん :2001/03/27(火) 17:18
血尿出してでも理解しろヤ、ゴルァ っつーことでは??451
453 :
デフォルトの名無しさん :2001/03/27(火) 17:26
>>451 428さんが
>>443 で書いた「追いこまれている」を、
時間的に追いこまれているととったのでは?
454 :
428 :2001/03/27(火) 17:36
はい 時間的にです
時間的に追い込まれる原因を作ったのは誰なんでしょうね。 まるで質問者には責任はないかのような言い訳っぷりですね。 にちゃんを見る時間を勉強にかけるという選択肢はないんですかね。 きっとまた言い訳の書き込みがあるんでしょうね。 プログラマ以外にもたくさん仕事はありますよね。
456 :
433 :2001/03/27(火) 20:23
>>434 char name[50][15]; と char *list[50]; ではデータ構造がまるっきり違います。
後者をソートしたい場合は
int comp ( void *p1, void *p2 )
{
return strcmp( *((char**)p1), *((char**)p2) );
}
とかして、qsort( list, n, sizeof(char*), comp ); とします。
457 :
428 :2001/03/27(火) 21:31
>>455 確かにその通りですね
返す言葉も無いです
458 :
428 :2001/03/27(火) 21:35
strlenの仕様についてさきほど少し理解しました 教えて頂いたみなさんありがとうございます 少し考え方を変えて、多次元ではなく1次元配列で 上記の最初のプログラムもう一度考えてみました とりあえず、qsortの使い方を知らないので、そこだけは 写させて貰おうかと思っています 後はもう少しで出来そうです
459 :
428 :2001/03/27(火) 23:06
データの入れ替えの仕方がやっぱり分かりません・・・・ 僕の書いたプログラムを一度見て下さい 見難いかも知れませんがお許しを #include <stdio.h> #include <string.h> main() { char name[50]; int i=0,s,n=0; do{ printf("氏名を入力して下さい\n"); gets(name); s=strlen(name); if(s>14) printf("14字以内の名前を入力して下さい\n"); i++; }while(i<50&&*name!='0' ); return(0); }
>>459 どあぁ。お前プログラマ板でも質問してたやつだな?
あれだけみんな親切に教えてくれてたのに、まだ
こんなことやってるのか?
かわいそうだけど、才能ないよ、多分。
もうすぐソフト会社(?)に就職決まってるらしいけど、
早めに違う職探したほうが身の為…。
>>460 何事も経験だよ。
会社に入って扱き使われたら、イヤでもうまくなっていくだろ。
多分。
462 :
459 :2001/03/28(水) 00:08
はい。すいません・・・・ 勉強し始めて4ヶ月経つんですが、どうも駄目です 自分でも才能無いって思うんですが 頑張らないとって思ってます・・・・
463 :
459 :2001/03/28(水) 00:15
周りに聞く人がいないんです。どうしたらいいのか分からなくて・・・
>>459 のプログラムに交換の仕方を付け加えたいのですが
どうしたらいいのか分からなくて・・・・
プログラム云々の前に常識を身につけてちょーだい 無理だと思ったらさっさと首吊れやゴルァ!
465 :
463 :2001/03/28(水) 00:49
常識無いですかね・・・・ もし気を悪くしたのなら謝ります すいませんでした
>>459 慰めにもならんと思うが
新入社員が即戦力になるとは誰も思っていないから
会社入れば新入社員研修とかで基礎くらいはやるかもしれないし
仕事はじまってもしばらくは先輩の下で教えてもらえるだろうし
会社だって仕事してんだからサンプルになるソースは山ほどあるし
そんなに追い詰められる必要は無いと思うよ
努力するのは良いことだけどね
467 :
465 :2001/03/28(水) 01:06
>>466 はい 凄い心から嬉しいです
別に感謝されたくないだろうですけど、ありがとうございます
これ、会社に提出する宿題なんですね
誰かのプログラム写して出すのも変だと思ったのですが
やらないよりはましかと思いまして・・・・
468 :
デフォルトの名無しさん :2001/03/28(水) 01:34
コードまで落とせる落とせないはともかく、ソートのアルゴリズム の名前も知らないの?もし知らなかったとして、宿題出されてから いままでの間にそれを調べる事も出来なかったの? コードまで作れないにしても、そこへいたる中途段階にさえ至って いないとしたら、俺が上司なら「こいつはダメだ」と思うと思う じょ… 「解法」を世の中から探し出して覚える作業が、来年からの 仕事の中心になるんだよん。がんばりや。 …最近の学生ってみんなこんなのばっかりなのか? うちにももうすぐくるんだろうな。鬱だ…
469 :
467 :2001/03/28(水) 01:41
いえ、知ってます・・・・ psortってのは、単に打ち間違えでクイックソートですよね・・・・ まぁそんなフォローしても現状は変わりないです・・・・
470 :
デフォルトの名無しさん :2001/03/28(水) 01:54
int hoge[4]={2,4,5,3};を昇順に出力せよってのは出来るよね?
471 :
デフォルトの名無しさん :2001/03/28(水) 01:57
>>470 が出来ないのなら、アルゴリズムの本を買って読みましょう。
アルゴリズムを知ってて出来ないのなら違う仕事を探しましょう。
472 :
469 :2001/03/28(水) 02:01
#include <stdio.h> main() { int hoge[4]={2,4,5,3}; int i,j,k; int tmp; for(i=4-2;i>=0;i--){ for(j=0;j<=i;j++){ if(hoge[j]>hoge[j+1]){ tmp=hoge[j]; hoge[j]=hoge[j+1]; hoge[j+1]=tmp; } } } for(k=0;k<4;k++) printf(" %d",hoge[k]); } 一応今動きました・・・・
473 :
デフォルトの名無しさん :2001/03/28(水) 02:15
>472
ごめん。
>>459 をよく読んでなかった。
char name[50]; だとおかしい。使う配列は14*50の2次元の配列。
50人分配列に貯めて、その50の部分を並び替える。
これが分かれば出来るんじゃない?
あともう一つ。
if(s>14)
printf("14字以内の名前を入力して下さい\n");
i++;
もおかしい。50回連続で20文字の名前が入力されるとどうなる?
474 :
デフォルトの名無しさん :2001/03/28(水) 02:22
オレのチームの新人だったら、入社前でもこんなレベルだったら切るね。 向いてない仕事やっても、お互い不幸になるだけだから。 ま、うちは中小だからかもしんないな。大手はきちんと教育してくれるのかね。
475 :
472 :2001/03/28(水) 02:23
所々気にかかる部分はあるのですが、一応動いたので・・・・ 少しだけみなさんのを見て写させて貰った部分もあるのですが・・・#include <stdio.h> #include <string.h> #include <stdlib.h> main() { char name[50][15]; int i=0,j,s,n=0; printf("氏名を入力して下さい\n"); do{ gets(name[i]); s=strlen(name[i]); if(s>14) printf("14字以内の名前を入力して下さい\n"); qsort( name, n, 15, strcmp ); i++; n++; }while(s!=0); n++; for( j=0; j<n; j++ ) printf( "%d %s\n", j+1, name[j] ); return(0); } 実行結果少し変です・・・・
476 :
472 :2001/03/28(水) 02:26
>>474 いや、自分でも自分が嫌になります・・・・
これから頑張っていこうかと思ってます・・・・
>>472 大丈夫さ。
俺も最初はそうだった・・・・・。
特にポインタ勉強してる時ね。一日中鬱だ氏のう状態だったからな。
まさか、ドキュソ高校に逝ってた俺がCを理解できるとはな。
神が俺に与えた唯一の恩恵。ありがとう神様。
このまま童貞捨てさせてください。
478 :
デフォルトの名無しさん :2001/03/28(水) 02:56
少しは近づいたね。 do whileの中でqsortやってるのが変。全部入力した後に整列すればよし。 配列の添字は最初の内は、てきとーにやって実行結果みてから修正って かんじで良いけど、出来ればきちんと考えてからやるようにしよーね。 50人までしか入力出来ない様にするのは? 今のままだと長い名前が入っちゃう。 この二つはCでやりがちなミスだから、暇があるならよく考えてみると良いよ。 例えば1番目に1234567890123456って入れてから2番目に123って 入れるとどうなるでしょう? これは余裕が無ければ後で考えれば良いよ。
479 :
デフォルトの名無しさん :2001/03/28(水) 03:03
リストは分かるの?
480 :
472 :2001/03/28(水) 03:32
あっ50人までってのやってないですね・・・・ 本当だ。長い名前も入ってる・・・・ う〜ん また明日考えてみます ってもう時間無い・・・・どしよ・・・ リスト構造はほとんど分かりません 読めって言われれば簡単なのなら読めますがリスト構造を使って プログラムは作った事無いです
481 :
472 :2001/03/28(水) 03:35
qsort外に出したんですけど、中のときもそうだったんですが 数字がどうも上手い事揃わないんです・・・・ 明日また少し考えてみます・・・・ はぁ・・・・
>>434 です
>>456 なるほど! ポインタ配列の比較関数はstrcmpをそのまま渡しちゃ駄目で
こうすれば良かったんですね。勉強になりました。
ありがとうございます。
483 :
481 :2001/03/28(水) 18:11
#include <stdio.h> #include <string.h> #include <stdlib.h> main() { char name[50][15]; int i=0,j,s,n=0; printf("氏名を入力して下さい\n"); do{ gets(name[i]); s=strlen(name[i]); if(s>14) printf("14字以内の名前を入力して下さい\n"); else i++; n++; if(s==0) break; }while(i<=50); qsort( name, n, 15, strcmp ); printf("\n"); for( j=0; j<n; j++ ) printf("%s\n",name[j] ); return(0); } 一応こうなって動きました 構造体ほとんど分からないかも・・・・ どなたか作って下さい・・・・
484 :
デフォルトの名無しさん :2001/03/28(水) 19:35
i++;n++;って意味無いよ。iってループ中のインクリメント以外で書き換えてないでしょ。 それと else i++; n++; って else{ i++; n++; } って書きたいんでしょ? 最後に入力する"\0"もqsortで整列しちゃってる。先頭に入るゴミはこれ。 ゴミが出ちゃうから printf( "%d %s\n", j+1, name[j] ); ってコードをやめにしたでしょ。 そーゆー姿勢は駄目。なんでかちゃんと考えようね。 hoge[4]={4,2,6,3}; ってのを昇順にリストに繋ぐって出来る? やってみましょ。 この程度のやつなら、そのまんまのサンプルコードあるでしょ?
485 :
デフォルトの名無しさん :2001/03/28(水) 19:54
ループカウンタが変なときは、きっちりトレースして何が変だったか 理解してから修正しよーね。 ↑は慣れちゃえば別に構わんけど、最初の内はきっちりやろーね。 ちゅーか慣れれば、考えるまでもなく分かるよーになる。
486 :
デフォルトの名無しさん :2001/03/28(水) 21:36
487 :
481 :2001/03/28(水) 23:29
>>484 はい・・・まさにその通りです・・・・・
後三問もあるので、時間が無いからいいやって甘い考えが出てしまって・・・・
上記のhoge[4]={4,2,6,3}ってのは、違うスレでもあったのですが
そこで一応答え書きました
みんな親切なのはいいけど、どんどんこの学生を ダメにしてやってる気もするぞ。
>>488 失礼なんですが、どんな点ででしょうか?
気になったので・・・すいません
490 :
デフォルトの名無しさん :2001/03/29(木) 00:15
a->b ってどういう意味よ
491 :
デフォルトの名無しさん :2001/03/29(木) 00:19
aをbに代入。
492 :
デフォルトの名無しさん :2001/03/29(木) 00:21
そうだったのか!
493 :
デフォルトの名無しさん :2001/03/29(木) 00:26
>>489 自分で調べたほうが身につくよってこと
聞いてばかりじゃだめよ
494 :
デフォルトの名無しさん :2001/03/29(木) 01:01
>>488 あれ、そういう趣旨でみんな答えを教えてるんだと思ってたよ。違ったの?
みんな残酷なことしてるなぁと思いながらニヤニヤしながらみてたんだけど?
495 :
デフォルトの名無しさん :2001/03/29(木) 10:00
文字配列を文字列、整数、ビットに分解したいのですが、スマートな方法が分かりません。どなたか、ご教授ください。 例えば、 char buf[8]; として、データが 0x3031 1234 5678 9ABC のときに、 3031 を char c[3] に 1234 を int i に 5678 9ABC を long l に代入するにはどうすれば良いのでしょうか?(ビッグエンディアン)
496 :
デフォルトの名無しさん :2001/03/29(木) 11:59
497 :
デフォルトの名無しさん :2001/03/29(木) 12:16
>>495 まず君が思うところのスマートでない方法を書いてみなさい。
>>498 移植性のあるコードに出きるけど?
どこが拙いのやら
500 :
495 :2001/03/29(木) 15:38
>>496 構造体を用いる場合、型キャストはどうやるのでしょうか?いろいろ試しましたが、上手くいきませんでした。また、一文字ずつコピーしたら、何故か途中にゴミが混ざりました。
>>497 とりあえず、シフト、AND、OR演算を使って一文字ずつコピってます。
501 :
デフォルトの名無しさん :2001/03/29(木) 15:58
>>499 おまえは仕事をするな。
alignmentの問題で正常にできるかどうかは処理系依存
502 :
デフォルトの名無しさん :2001/03/29(木) 16:20
>>498 -499,501
構造体を定義しないうちに、できるできないを言い争うのはヴァカ
503 :
デフォルトの名無しさん :2001/03/29(木) 16:24
>>501 alignment って #pragmaで 間を空けないように指定出来なかったけか?
つか、出来ない処理系もあるの?かな
504 :
デフォルトの名無しさん :2001/03/29(木) 16:28
>>503 知ってるシステムの中でできないシステムはなかったけど
標準でもないはず。
コレが放置プレイってやつか...(;´Д`) かあさん、もうすぐ4月だというのに都会は寒くて凍えそうだ... 田舎に帰ろう...
506 :
デフォルトの名無しさん :2001/03/29(木) 17:08
>>495 strncpy(c,&buf[0],2);
i = *((short*)&buf[2]);
l = *((long*)&buf[4]);
507 :
495 :2001/03/30(金) 02:04
>>506 どうも有り難うございました。m(_ _)m
非常にすっきりしたコードになりました。
495はかしこさが2あがった!
508 :
デフォルトの名無しさん :2001/03/30(金) 02:14
char buf[] = {0x12, 0x34, 0x56, 0x78}; のとき、 long l = *((long*)&buf[0]); でlが0x12345678になるか0x56781234になるかは機種依存なんじゃないでしたっけ?
509 :
ちゃちゃ :2001/03/30(金) 02:22
>>508 0x56781234になる機種なんてあんの?
510 :
デフォルトの名無しさん :2001/03/30(金) 03:42
>>508 リトルエンディアンなら 0x78563412 だね。確かに機種依
存な方法だけど、元の質問者がビッグエンディアンと限定し
てるから、これでも良いんじゃない。
ただ、私だったら、Perl の pack, unpack みたいな関数
を実装して使う。似たような処理が出てきたときに使いまわ
せるし、コードの見通しも良くなるからね。
たとえば、こんな感じ。エラーチェックとか甘々だけど、骨
子は分かるよね?
#include <assert.h>
#include <stdio.h>
#include <stdarg.h>
char
ntoc(const int n)
{
static const char tbl[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
};
assert(0 <= n && n <= 0xf);
return (tbl[n]);
};
void
unpack(const unsigned char *dat, const char *fmt, ...)
{
char *cp;
int *np;
long *lp;
int i;
unsigned int n;
va_list ap;
va_start(ap, fmt);
for (; *fmt != '\0'; ++fmt)
switch (*fmt) {
case 'c':
cp = va_arg(ap, char *);
for (i = *++fmt - '0'; i > 0; i -= 2) {
n = *dat++;
*cp++ = ntoc(n >> 4);
*cp++ = ntoc(n & 0xf);
}
break;
case 'd':
np = va_arg(ap, int *);
*np = 0;
for (i = 0; i < 2; ++i) {
*np <<= 8;
*np |= *dat++;
}
break;
case 'l':
lp = va_arg(ap, long *);
*lp = 0;
for (i = 0; i < 4; ++i) {
*lp <<= 8;
*lp |= *dat++;
}
break;
}
va_end(ap);
}
int
main(void)
{
char buf[] = { 0x30, 0x31, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc };
char c[4];
int i;
long l;
unpack(buf, "c4dl", &c[0], &i, &l);
printf("c = %.4s, i = %X, l = %lX\n", &c[0], i, l);
return (0);
}
511 :
498 :2001/03/30(金) 07:54
じゃ構造体を使う移植性のあるやつを。 #include <limits.h> struct T { char c[2]; char i[2]; char l[4]; }; long getint(const char* p, int n) { long x = (signed char)p[0]; int i; for (i = 1; i < n; ++i) { x = (x << CHAR_BIT) | (unsigned char)p[i]; } return x; } #define intof(x) getint((x), sizeof(x)) int main(void) { static const char buf[] = {0x30, 0x31, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc}; const struct T* t = (const struct T *)buf; printf("c = %.*s, i = %X, l = %lX\n", sizeof(t->c), t->c, intof(t->i), intof(t->l)); return 0; }
すまぬ。sizeof(long) > sizeof(int) な処理系でまずかったかも。 --- a.c~ Fri Mar 30 07:52:31 2001 +++ a.c Fri Mar 30 07:56:43 2001 @@ -16,12 +16,13 @@ return x; } -#define intof(x) getint((x), sizeof(x)) +#define intof(x) (int)getint((x), sizeof(x)) +#define longof(x) getint((x), sizeof(x)) int main(void) { static const char buf[] = {0x30, 0x31, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc}; const struct T* t = (const struct T *)buf; - printf("c = %.*s, i = %X, l = %lX\n", sizeof(t->c), t->c, intof(t->i), intof(t->l)); + printf("c = %.*s, i = %X, l = %lX\n", sizeof(t->c), t->c, intof(t->i), longof(t->l)); return 0; }
513 :
デフォルトの名無しさん :2001/03/30(金) 09:51
>static const char buf[] = {0x30, 0x31, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc}; >const struct T* t = (const struct T *)buf; どこに移植性があるんだよ? 4バイト境界にそろえられる処理系だとうまくいかないだろ
514 :
デフォルトの名無しさん :2001/03/30(金) 10:05
>>511 CHAR_BITなんか使ったら、逆に移植性落ちるんじゃないか?
元のデータはオクテットだろ?
515 :
デフォルトの名無しさん :2001/03/30(金) 11:40
>>513 構造体のパディングのサイズは、次のメンバのアラインメントサイズ未満になる。
アラインメントサイズは:
* 組み込み型の場合はその型のサイズ未満(enumもこれに準ずる)。
* 配列の場合は要素のそれに等しい。
* 構造体/共用体の場合は各メンバのアラインメントサイズの最大値。
アラインメントサイズってのは正式な用語じゃないかもしれんが、このルールは
規定されてなかったっけ。
>>514 char としか書いてないような気がするが。
518 :
495 :2001/03/30(金) 17:34
>>510 -512
勉強になります。
ありがとうございます。
519 :
デフォルトの名無しさん :2001/04/01(日) 01:53
Cの初心者なんですけど、*を使ってひし形を表示するにはどうしたらよいのでしょうか? 例えば・・ ひし形の大きさ: 3 (’は無視して下さい。) ’* *** ’* ひし形の大きさ: 4 ’** **** ’**
520 :
デフォルトの名無しさん :2001/04/01(日) 02:05
5の場合は3-5-3? 2-5-2? 1-3-5-3-1?
521 :
519 :2001/04/01(日) 02:08
5の場合は (_は無視して下さい) __* _*** ***** _*** __* 1−3−5−3−1 です。
522 :
デフォルトの名無しさん :2001/04/01(日) 02:12
念のために聞くけど、6だと2-4-6-4-2でいいか?
523 :
519 :2001/04/01(日) 02:15
はい、6ですと、 __** _**** ****** _**** __** 2−4−6−4−2になります。 ちなみに2だと ** ** 四角になってしまいます。
524 :
デフォルトの名無しさん :2001/04/01(日) 02:18
大きさが2増えると一段増える。ループ2重にしてやれ。 (2*x-1)/2段になる。 こんだけで分かるでしょ?
525 :
デフォルトの名無しさん :2001/04/01(日) 02:20
2だと四画になるんか・・
526 :
519 :2001/04/01(日) 02:22
>>524 ありがとうございます。
早速試してみます♪
527 :
デフォルトの名無しさん :2001/04/01(日) 02:23
>525 2だと**になるのが妥当だと思うんだが。 高さは全部奇数になってるから。
529 :
デフォルトの名無しさん@524 :2001/04/01(日) 02:27
>>519 -523の仕様で2を例外処理しないでやるアルゴリズムってどうやる?
530 :
519 :2001/04/01(日) 02:30
ごめんなさい。 2だと四角にならないかも知れません。 でも確かひし形ではなくて、 四角か長方形だったと思います。 ** または * *
531 :
デフォルトの名無しさん :2001/04/01(日) 03:16
>519 int width = 6; // 大きさ int height; // 高さ int space; // " " の数 int kome; // "*" の数 int i,j; //for文のため height = width % 2 ? width : width-1; for(i=0;i<height;i++){ space = i-height/2; space = space > 0 ? space: -space; kome = width - 2 * space; for(j=0;j<space;j++) printf(" "); for(j=0;j<kome;j++) printf("*"); printf("\n"); } width の値をいろいろ変化させてみてくれ。 それにしても読みにくいな。
>>509 0x78563412だろうけど、
0x56781234になる処理系は未来永劫存在しないとは言い切れない。
>>532 往年の名プロセッサ PDP-11 だと 34 12 78 56 だし、ね。
# 古すぎて、知らんか……
パックマンのような迷路マップを作ったとき 敵の追尾アルゴリズムはどういうふうに組めば 良いのでしょうか? C言語できぼん。
535 :
デフォルトのアホ :2001/04/01(日) 13:55
どーも、アホです。アホに免じて質問させてください。 どうしても下記のようにするとコンパイルエラーとなります。 何故だかわかりません。 char str[4]; str="abc"; <=ここでエラー 要素数4の配列をまず宣言し、次行で"abc"の先頭要素への ポインタをstrに代入したいのですが、出来ないのです。 式中なのでエラー箇所の str は配列の先頭要素へのポインタ つまり &str[0] に読み替えられているはずなのですが、 なぜエラーになるのでしょうか。 エキスパートの先輩方、よろしくお願い致します。
536 :
しろうと :2001/04/01(日) 14:05
>>535 なぜ、strcpy()を使わない???
537 :
デフォルトのアホ :2001/04/01(日) 14:11
いま学習中なので、これを理解する必要があるのです。 まだ仕事につかうレベルではありません。 >536 アホに免じて許してください。 どなたか、お願いします。不思議でしょうがありません。
538 :
デフォルトの名無しさん :2001/04/01(日) 14:12
>535 エラーの理由は配列名は左辺値にならないから。 簡単に言うと、配列名に直接代入することはできんのよ。 strcpy(str,"abc")かsprintf(str,"abc")でコピーできる。 その前に、BASICみたいな str = "abcde"みたいな代入はCだと使えない。 理由はポインタを勉強すればわかるぞ。
539 :
デフォルトのアホ :2001/04/01(日) 16:01
なんとか以下のコードで文字列の代入が出来ました。 #include "stdafx.h" #include <stdio.h> int main(int argc, char* argv[]) { char str[4]; char *str_p; int i; str_p=str; for(i=0;i<sizeof"abc";i++) { *(str_p+i)=*("abc"+i); } printf("str-->%s\n",str);第2引数のstrはポインタですよね? return 0; }
>>535 ,
>>539 > 式中なのでエラー箇所の str は配列の先頭要素へのポインタ
> つまり &str[0] に読み替えられているはずなのですが、
void func( int* ptr ) {
int x;
&x = ptr;
}
がエラーになるってのはOK?全く同じで、
&( str[0] ) = "abc";
もダメになる気がせんか?
まー、ポインタと配列の理解が中途半端って事だな。 (間違っても三田本は参考にするなよ) 大まかに言えば「配列名は定数」「ポインタ変数は変数」
542 :
B.W.カーニハン_with_D.M.リッチィ :2001/04/02(月) 02:28
ビット演算教えやがれ!ゴルァΨ(`▽´)Ψ
死ねんこ野郎!
544 :
539 :2001/04/02(月) 02:33
別スレの立ってる「C言語ポインタ完全制覇」ってので勉強してるんですけど。 ヤバイでしょうか?
その本は知らないが ポインタ辺りでつまずいてるならアセンブラでもかじってみたら? 一見遠回りにみえるが一番の近道
それからCのコンパイラならアセンブラコードを出力する('-S'とか) オプションが多分あるのでそれで確認するのもいい。
547 :
539 :2001/04/02(月) 02:45
548 :
539 :2001/04/02(月) 02:47
恐る恐るお聞きしますが、アセンブラが出来ないと まともなC使いにはなれませんか?アホでスマソ。
549 :
名無しさん :2001/04/02(月) 02:51
>539
配列の宣言は連続したメモリの確保だよ、知ってる?
>>547 しかし例外があるとちゃんと書いてたと思うが。
著者は知らないが、技術評論社から出版されてるから悪くはないんじゃない? (ここの出版社からはあんまり悪い本引いたことないんで)
C使いこなす奴は大抵アセンブラも知ってるな
552 :
539=547 :2001/04/02(月) 02:58
現在2回目読んでます(上の本)。 >しかし例外があるとちゃんと書いてたと思うが。 もっと本が破れるほど読みます。アホはつらい。
553 :
539=547=548 :2001/04/02(月) 03:04
ほほう、そーですか。そういえば大学時代の友人も 1年のころCASL、2年でCがカリキュラムに組み込 まれていたような気がします。 しかしめちゃくちゃ難しそうだ。私は学生時代は 工学部だったものの情報・電子・電気とは無縁でした から。アセンブラの入門に最適な本とかお勧めとか ありますか? 「てめえで探せ!」ってご意見も歓迎です。
556 :
名無しさん :2001/04/02(月) 09:24
557 :
>542 :2001/04/02(月) 12:19
ビット演算など厨房のやることだ! あんなのはしなくて結構。実際使わないし★★
>>557 > 実際使わないし
オマエハナー
# ビットフィールドの方が実際使わない
ネタなのに・・・・・・
560 :
デフォルトの名無しさん :2001/04/02(月) 15:53
>>539 今回の件に関しては、アセンブラを詳しく知らなくても、
きちんと説明すれば理解できると思う。アセンブラの
インストラクションまで知らなくても、基本的な仕組み
と、実行形式ファイルの中でどういう風に配置されてい
るかがイメージできれば、ポインタは大丈夫じゃないのかな?
>>560 ほぼ同意。
出来れば、メモリーイメージ想像出来るように理解できた方がいいと思うの。
>>562 他人を罵倒するのは止めた方がいいと思うの。
566 :
aho :2001/04/04(水) 08:02
自分もアホです。低次元な質問につきあってやって下さい。"C for Dummies"っちゅう入門書を読み始めんですけど、"DOS"だの "DOS at prompt"だのに苦しめられてて、C言語習得のスタートラインにすら立てません。DOSとはいったいなんのことですか?これ知ってないと話になんないの?よきアドバイスを。
567 :
デフォルトの名無しさん :2001/04/04(水) 08:19
>>566 OSのInstallしたことある?
MS-DOS プロンプトって知ってる?
”C言語”を学校で最近知った用語?
普通の男なのに... 羽津打紙野宇。
569 :
デフォルトの名無しさん :2001/04/04(水) 16:12
>>569 つーかいきなりGUIから入らないといけない今時のヤツは逆に可愛そうな気もするんだが。
キャラクタベースのほうが最初の1歩は100倍くらいやさしいと思う。
今時の本て
GUIのスケルトンをイキナリ数ページにわたってポンと渡されて
「とりあえずこれはこーいうもんだとおもって納得しとけ!
やってればそのうちわかる!」
ってなふうに始まるのかね。
571 :
参議院 :2001/04/04(水) 17:14
柏村武昭の○○○宣言
572 :
デフォルトの名無しさん :2001/04/04(水) 17:24
ふつーC言語ならコンソールから始めるだろ。
573 :
名無しさん@LV2001 :2001/04/04(水) 17:30
574 :
デフォルトの名無しさん :2001/04/04(水) 18:21
575 :
デフォルトの名無しさん :2001/04/04(水) 18:38
>>570 普通にコンパイルしたらコンソールアプリにしか
ならないから、とりあえずそれでやりますよ。
でもWindowsってDOSと比較すると「お約束」が
すごく多いですね・・・
576 :
デフォルトの名無しさん :2001/04/05(木) 11:23
プログラマにとってポインタは一つの山だよね〜。
577 :
デフォルトの名無しさん :2001/04/05(木) 11:39
常套句のことを「おまじない」とか書いてある本はなんかイヤ おまじないの中身が最後まで説明されてない本は最低
578 :
デフォルトの名無しさん :2001/04/05(木) 12:39
ソフトで“おまじない”とかハードで“相性”とか言うのは 説明が面倒で避けたいからか、判ってなくて説明できないからだよな。
>>578 そうだな。
例えば、Hello, Worldプログラムの説明で
#include <stdio.h> の説明は避けたいな
でも、いつかは説明しないと駄目だ。
580 :
デフォルトの名無しさん :2001/04/05(木) 13:32
初心者向けの本なんて大して詳しくない人手もかけると思ってる人(もしくは出版社) が多いのじゃないかなぁ。 初心者に的確に簡単に教えることは、上級者に教えるより、深く正確な知識が必要。 つまり、とても難しい。 「おまじない」なんて言葉で逃げている本は、腐ってると判断して正解。
581 :
五番・サード・名無し :2001/04/05(木) 13:35
K&R一冊で十分でござい。
実際素人相手の商売っておいしそうだよな。 ジャパネットの番組とか見てるとホントそう思うよ。
じゃーぱねっとじゃーぱねっと 夢のじゃぱねっとたかた〜
584 :
名無しさん@LV2001 :2001/04/05(木) 14:18
585 :
デフォルトの名無しさん :2001/04/05(木) 19:09
誤爆か?
587 :
デフォルトの名無しさん :2001/04/05(木) 20:20
なんか同じ書きこみがあちこちにある
588 :
デフォルトの名無しさん :2001/04/06(金) 06:40
(゚Д゚)ハァ?
589 :
2ch :2001/04/06(金) 10:01
教えてください。 C言語はなんでC言語と言うの? AとBはどっかいったの? なんで?
590 :
SAGE :2001/04/06(金) 10:05
591 :
2ch :2001/04/06(金) 10:14
返事が早いなぁ わかった ありがと
592 :
デフォルトの名無しさん :2001/04/06(金) 12:03
A、B、そして・・・Cまでいくって聞いたことあるでしょ? そういう由来かと・・・ボソッ
593 :
いつでもどこでも名無しさん :2001/04/06(金) 15:14
@
ヽlノ / ♪
.〆⌒ ⌒\
/ lノノ)ノ|.ノ
http://www.hayariki.com/ | | | UU|| \
((◯ |. | |'__▽.ソ| .◯)) シ
□|| ̄ ̄||~'†~|| ̄ ̄||□ ャ シ
゚ . ̄| ̄)|\/| |~ ̄ .゚ . カ ャ
\/ミ ミY カ
.| | | |
./ | | \
. \|__|/
| | \_\ ))
⊂二l (/
594 :
デフォルトの名無しさん :2001/04/06(金) 20:42
596 :
デフォルトの名無しさん :2001/04/06(金) 22:17
以下のソースでforkした後、全ての子プロセスを待つには、どう記述すれば良いのでしょうか? waitpidというのがあるのは知っていますが、使い方がいまいち解りません。 教えて下さい。 int main(){ int ret,ct1; char cmd[256]; for( ct1 = 0 ; ct1 <= 2 ; ct1++ ){ ret = fork(); switch (ret ){ case -1: printf("失敗\n"); exit(1); break; case 0: printf("子プロセス\n"); sprintf(cmd,"echo '%d'",ct1); system(cmd); exit(1); break; default: printf("親プロセス\n"); break; } } wait(); printf("END\n"); return(1); }
597 :
596 :2001/04/06(金) 22:20
すいません。TABを使ったら変になってしまいました。
mainはなんで関数なの?
599 :
デフォルトの名無しさん :2001/04/06(金) 22:50
600 :
デフォルトの名無しさん :2001/04/07(土) 01:21
>>596 signal(child signal, proc);? --or-- sigaction?
601 :
名無しサンプリング@48kHz :2001/04/07(土) 01:27
scanfとかgetcharとかいまだによくわかりません。
602 :
デフォルトの名無しさん :2001/04/07(土) 03:15
scanfとgetcharの違いは,scanfは1行を得るのに対し, getcharは1 文字のみ得ること
604 :
デフォルトの名無しさん :2001/04/07(土) 08:44
>>599 スーバーメインの関数だからでいいのかな?
605 :
デフォルトの名無しさん :2001/04/08(日) 02:23
printf("数値1 ="); scanf("%d", &i); printf("文字 ="); scanf("%*c%c", &a); ←%*cは改行読み捨てってどうして printf("数値2 ="); これがそうなるのですか?解りません。 scanf("%d",&j); よろしくお願いします。
606 :
baka :2001/04/08(日) 02:25
a.out とelf の違いてなに?
607 :
デフォルトの名無しさん :2001/04/08(日) 06:37
gcc とかがどのようにローカル変数にメモリを割り当てるか知るにはどうしたらいいのでしょう? モノの本とかでは、char a[5]とやっても、アライメントの関係で通常は8バイトとかとられる、 とか書いてあるのですが、gcc -S でアセンブリ調べてみると実際にはそうなっていません。 コンパイラ依存なので当然本とおりにならなくてもいいのですが、興味があります。 実際にどのようにメモリを割り当てるか、ではなく、 どういう方針でメモリを割り当てているのかを知りたいわけです。 識者のかた、よろしくお願い申し上げます。
>>607 gccのソースを読む、ってんじゃダメなの?
609 :
デフォルトの名無しさん :2001/04/08(日) 14:21
>>608 できればそれは避けたい・・
ついでにいうと、スタックポインタの動き、とか興味あるのですが、
コンパイルのソースを読む以外、どういう情報へのポインタがありますでしょうか?
例えば、X86系で
function(1,2,3)
とかを呼び出すコードをgcc -Sで生成してみると
subl $8,%esp
addl $-4,%esp
pushl $3
pushl $2
pushl $1
call function
addl $16,%esp
とかなるのですが、なんでaddl $16になってしまうのかとかが知りタイのです。
610 :
デフォルトの名無しさん :2001/04/08(日) 14:24
>>607 ターゲットによって違うよ。
手持ちのgccでちょっと確認してみたが、ディフォルトだと
i386用は4バイトアラインメントで8バイト取られたが
H8用は2バイトアラインメントで6バイト取られた。
611 :
デフォルトの名無しさん :2001/04/08(日) 14:57
>>609 -mpreferred-stack-boundary=4 (16バイト) にしてるから
じゃないの。
612 :
デフォルトの名無しさん :2001/04/08(日) 16:47
最後のaddは呼んだ関数の実引数を消してます。 本来は12を足せばいいんだけど、最適化の関係かな? i386系の呼び出し規約は、Visual C++の__cdeclと 同じ(浮動小数点の扱いは知らない)だったはずだから、 MSDNライブラリに書いてありますよ。
613 :
607です :2001/04/08(日) 19:00
みなさま、わけのわからない質問に答えてくださってありがとうさまです。
>>610 それはわかるのですが、単にアライメントだけの問題ではないようなのです。
char buf[5]
とかの配列の大きさを変えていって調べてみたのですが、うちのlinuxでは
char[x]の場合-> 16*(x /16)+24 とかいったわけの判らない増え方をしています。
配列が複数になると妙な相互作用をして関係式調べるのが大変みたいです。
やはり最適化が絡んでるんでしょうか?
>>611 試してみます。gccのオプションはたくさんありすぎてワケわからないのでした。
前にgccのオプション本買ってみたけどオプション羅列してるだけで全然わからんかったです。
>>612 素直に考えると、スタックを戻してるわけで、addl $12,%spcのはずですよね。
最適化というのは、効率のよいアセンブリを生成するように捉えていたのですが、
アセンブラはアセンブリ命令を機械的に実行するわけで、齟齬はおきないものでしょうか?
どうせ破棄されるスタックだから、多少計算が合わなくても速度を優先する・・てなことなのかしらん?
614 :
デフォルトの名無しさん :2001/04/08(日) 19:57
>>613 アライメントによってサイズが変わるのではなく、配置アドレスが
変わるのだと考えましょう。例えば8バイトアライメントでは
bufのアドレスは常に8の倍数になるように配置されます。
ところで
>>609 のコードはcallする前にスタックポインタが
16バイト動いているから addl $16,%esp で正しいんじゃないの?
615 :
611 :2001/04/09(月) 03:32
>>612 スタックに引数を積む前に addl $-4,%esp してるのを見落
としてますね? これと pushl * 3 で合わせて 16 バイト
スタックに積んでいるので、関数呼び出しから戻った直後に
addl $16,%esp して辻褄が合います。
わざわざ addl $-4,%esp してるのは、スタック変数を 16
バイト境界 (-mpreferred-stack-boundary で変更可能)
にアライメントするため (*1) でしょう。gcc 2.95.2 でた
めしに
-mpreferred-stack-boundary=2
でコンパイルしてみましたが、これだとスタックトップが
4 バイト単位でアライメントされるため addl $-4,%esp
が無くなりました。
---
(*1)
ただし gcc-2.95.2 (mingw) 版はスタートアップルーチ
ンがアライメントを考慮していないので、結局 16 バイト
境界にアライメントされないんだけど。
616 :
デフォルトの名無しさん :2001/04/10(火) 01:13
こんにちは。 一つ知りたいことがあるのですが、例えば下のような変数と値があった場合、 int a,b,c; a = 123; なんとかして、最初の一数字(この場合1)だけを取って、それを他の変数(例えばb)の値にして、 さらに、残りの数字(この場合23)をまた違う変数(例えばc)の値にしたいのですが、 a = 123 b = 1 c = 23 ↑ こんな感じに分けたいっす。 どうすれば宜しいのでしょうか?
617 :
デフォルトの名無しさん :2001/04/10(火) 01:26
>>616 char buffer[16];
sprintf( buffer, "%+d", a);
c = strtol( buffer + 2, NULL, 10); buffer[2] = '\0';
b = strtol( buffer, NULL, 10);
君も何か面白いコードを書いてくれ 質問だけじゃあきるから
int a,b,c; a=123; b= a / 100; // 小数点以下 切り捨てだからね c= a % 100; // 0〜99 まで有効だからね。 こんなんでええんかなぁ。
i = 1; while(a >= i * 10) { i *= 10; } b = a / i; c = a % i;
620 :
616 :2001/04/10(火) 02:29
>617、618、619 返信ありがとう御座います。 さっそく試してみます。 がむばっておもしろいコードが書れるように修行するっす。
うっ。 トリッキーなコードの方が良かったのかな?。
>>605 > scanf("%*c%c", &a); ←%*cは改行読み捨てってどうして
> printf("数値2 ="); これがそうなるのですか?解りません。
> scanf("%d",&j); よろしくお願いします。
man scanfと言いたいとこだけど....間違いだけは訂正します。
"%*c"は1文字読み飛ばす制御文字列であり、改行読み捨てではありません。
623 :
なまえをいれてください :2001/04/10(火) 16:39
ノートパソコンでC言語のプログラミングってできるんですか?
プログラム書くだけならノートでも何でも… エディタくらいは動くでしょう。 気合いが入れば、携帯のメールでもコード書くだけはできる。とか言ってみる…
625 :
623 :2001/04/10(火) 17:07
プログラムはかけるけどそれを実行とかできるかわかんないんです。 実行の仕方も… エディタってなんでしょうか?
テキストファイルを編集するためのツール<エディタ 使ったこと無いか?Windowsのメモ帳とか。 実行するにはまずコンパイルという作業が必要。 その作業のためにはコンパイラというツールが必要。 種々あるが、コマンドラインで動くコンパイラもあるから、容量やスペックが劣るマシンでも 何とかなるだろう。
627 :
623 :2001/04/10(火) 17:18
コンパイラはどこで手に入れるのですか。
>>623 逆に質問したいんだけど
ノートパソコンだとどうして障害になると思ったの?
液晶ディスプレイだったりキーボードが本体についてたりすると
何が違ってくるとでも思ったの?
630 :
623 :2001/04/10(火) 17:37
ノートパソコンでやった事がなかったからです。 いつも使ってたのはWINDOWSじゃなかったし。 どこでプログラミングするのかとかどうやって実行するのかさえ 分かりませんでした。
631 :
デフォルトの名無しさん :2001/04/10(火) 17:39
スーパーなプログラマはあまりハードウェアにこだわらない。 様な気がする。
632 :
623 :2001/04/10(火) 17:42
633 :
デフォルトのC厨房 :2001/04/10(火) 18:03
質問です。「12.ABC」という文字列から「ABC」だけを 取得したい場合、Delphiだと... Copy('12.ABC',4,3) で可能ですが、C++の場合、スマートに取得するには どうしたらよいのでしょうか?
634 :
デフォルトの名無しさん :2001/04/10(火) 18:34
C++ の場合、クラスライブラリがあるから、 XString str = "12.ABC"; XString strAbc = str.Mid( 3); C++ の場合、XString のようなものを最初に作ってスマートにする。 で、このようなクラスライブラリは、出来合いのものがたくさんある。 MFCが数的にはもっとも使われているでしょう。
635 :
デフォルトの名無しさん :2001/04/10(火) 21:54
愚痴なんだけど聞いてくれるかな。 K&Rの演習1−20から1−24・・・・・。 出来ねえよ!!第一章「やさしい入門」でこの演習かよ! ここでつまずいた厨房は俺だけじゃないはず・・・・・・。
636 :
デフォルトの名無しさん :2001/04/10(火) 22:40
>>635 難しいけど、第1章を何度も読み返せばできる。
根性で頑張れ。
637 :
デフォルトの名無しさん :2001/04/10(火) 22:44
>>635 K&R は「C言語の入門書」であって「プログラミングの
入門書」じゃないから、そんなもんだよ。
昔なら K&R を読むなら「ソフトウェア作法」と「UNIX
プログラミング環境」を併読と言うところだけど、さす
がに内容が古いことは否めず。
638 :
デフォルトの名無しさん :2001/04/11(水) 00:41
>>635 激しく同意!!
たしかにプログラミング初心者が読む本ではないな。
それなのに初心者にK&R勧める馬鹿の多いこと多いこと。
挫折しろっていってるようなもんだ。
639 :
デフォルトの名無しさん :2001/04/11(水) 00:45
つうかさ俺はアマグラマーだからよく知らないんだけど、 いまどきC言語のみを使う開発ってあるの? C++やJavaがあるのに・・・ なんかCから始める人はすっごく遠回りになるような 気がするんだけど。 素直に最近の言語学んだほうがいいと思うんだけどな。
>>638 K&Rに限らず、この世界の学習法の第一の基本を忘れないようにしよう。
第一の基本:どうにもわからないことは、ほっとけ。時間の無駄。
別の必要な知識が揃うと、わかるようになるから。
641 :
デフォルト名無し :2001/04/11(水) 00:57
>>635 うちも1-20、1-21分からんかった。
というか、タブストップって、何だ?
そこが一番のネックだった。。。
あとで答え立読みしたけど、結局わからんかったし…
642 :
デフォルトの名無しさん :2001/04/11(水) 01:01
K&Rが自力で理解できない上に質問できる人が 回りにいない人は独学しちゃ駄目よ。
643 :
デフォルトの名無しさん :2001/04/11(水) 01:34
>641 1-20はタブをスペースに置き換えろってことだろ。 こんな簡単なことをよくあんなに難しく書けると感心。
644 :
デフォルト名無し :2001/04/11(水) 01:55
>>643 しかし、後半のn文字云々の所はタブストップの意味を理解していないと実装できないっす。
タブ→スペースは分かったけどね・・・
>>642 独学しちゃ駄目なんじゃなくてK&Rが初心者には
完全な独学には向かないって事だろ。
646 :
デフォルトの名無しさん :2001/04/11(水) 09:40
647 :
デフォルトの名無しさん :2001/04/11(水) 11:35
カーネルはともかくとして、on UNIXなプログラムもCが多いような気がする・・。
648 :
デフォルトの名無しさん :2001/04/12(木) 10:09
>>640 第二の基本:とにかく書く。そして実行しろ。
体が覚えるから。
>>649 偽者とは思うけど、このページは有害度がかなり高いので注意。
数年前にfj.comp.lang.cとかでさんざん叩かれた厨房のページだ。
>650 まだいったことないんですけど、どんな風に有害なんですか?
いろいろ嘘が書いてあったりとか、仕様と実装を完全に混同している記述が あったりとか。
>>651 件のページから引用。
> 漢字は種類が多いのでcharでは256とおりしか指定できず、
> その倍のサイズを持つ shortでないと表現できません。
これ読んだだけでも、全然ダメ。
- char で 256 通りの数値を表せるとは限らない。
- sizeof(short) == 2 * sizeof(char) とも限らない。
- 文字列を MBCS で扱うときには、あくまでバイト列とし
て扱うし (short なんか使わん)、UNICODE で扱うとき
には、ASCII だろうが日本語だろうが wchar_t で処理
する。wchar_t が short と同一かどうかは、処理系に
よる。
前後を読むと、画面出力時の文字の幅とバイト表現時のサ
イズを混同していたりして、もう何が何だが。読んでも間
違った知識が身につくだけ。
654 :
通りすがり :2001/04/15(日) 22:03
ちょっと一言。
>>653 >- char で 256 通りの数値を表せるとは限らない。
符号無しの場合は256通り以上の数値を表せることが保証されます。
符号付きの場合-127〜+127なので255種類以上ですが、現実には整数の負値の内部表現に
二の補数を使わない処理系はほとんど存在しないので、256種類以上と考えても問題ない
でしょう。
>- sizeof(short) == 2 * sizeof(char) とも限らない。
確かにそうですが、short型が16ビット以上の純二進基数表現であることは保証されます。
すなわち256通りを表現するのに必要な8ビットの倍以上のサイズを持つことが保証されて
います。
>- 文字列を MBCS で扱うときには、あくまでバイト列とし
> て扱うし (short なんか使わん)、UNICODE で扱うとき
> には、ASCII だろうが日本語だろうが wchar_t で処理
> する。
wchar_t型の内部表現がUNICODEかどうかは処理系依存です。しかも、UNICODEを使う
際になぜASCIIが出てくるのか不明です。
>wchar_t が short と同一かどうかは、処理系に
>よる。
そのとおりです。wchar_t = charの可能性もあり、wchar_t型を使って漢字が表現できる
という保証はどこにもありません。
wchar_t の内部エンコーディングに関しては何も書いてないと 思うんだが? 文脈からして、ASCII は ASCII コードセットではなく、ASCII 文字 (iswascii() が真になる範囲) の意味だろ。
656 :
通りすがり :2001/04/16(月) 21:18
>UNICODE で扱うとき >には、ASCII だろうが日本語だろうが wchar_t で処理 >する。 これは何度読み返してもwchar_tの内部表現がUNICODEで あることを期待しているとしか思えませんが。 >文脈からして、ASCII は ASCII コードセットではなく、ASCII >文字 (iswascii() が真になる範囲) の意味だろ。 好意的に見ればね。けど、好意的に見続ければ、C言語会話入門も それほど悪くないかも。
657 :
通りすがりII :2001/04/16(月) 23:02
>>656 >>UNICODE で扱うとき
>>には、ASCII だろうが日本語だろうが wchar_t で処理
>>する。
>
>これは何度読み返してもwchar_tの内部表現がUNICODEで
>あることを期待しているとしか思えませんが。
UNICODEの表現にはwchar_tが必要である、
つまりUNICODE⊂wchar_tを意図してるとしか読めないが。
まぁ処理系によってはwchar_t==charだったりというのはその通り。
658 :
通りすがり :2001/04/17(火) 21:53
>>657 >UNICODEの表現にはwchar_tが必要である、
>つまりUNICODE⊂wchar_tを意図してるとしか読めないが。
単にUNICODEを数値として格納できるというだけなら、普通の数値型を使うはず。
敢えてwchar_t型にしているのは、やはりワイド文字定数やwchar.hなどにある関数を
使うことを想定しているのでは?
659 :
通りすがりII :2001/04/18(水) 00:44
>単にUNICODEを数値として格納できるというだけなら、普通の数値型を使うはず。 それこそ移植性をまったく無視したソースになりそうだけど。 「UNICODEならばwchar_t」だからといってその逆や裏が必ずしも真じゃないことは いうまでもないし。
660 :
デフォルトの名無しさん :2001/04/18(水) 05:21
超漢字なんかのCとかって、文字型に何使ってるのかな。
661 :
デフォルトの名無しさん :2001/04/18(水) 09:16
>>660 TRON code。
たぶん上位16ビットで文字セットを指定して、下位16ビットで文字を指定する、
みたいなのだと思うけど、鵜呑みにしないように。
662 :
通りすがり :2001/04/18(水) 12:45
>>単にUNICODEを数値として格納できるというだけなら、普通の数値型を使うはず。 >それこそ移植性をまったく無視したソースになりそうだけど。 単なる数値として扱って、ワイド文字定数も既製の関数も使わなければ、処理系 への依存性はまったくなし。 wchar_tは、実行文字集合に依存しない処理に使うもので、処理系に依存しない UNICODEの処理に使うのは見当違い。 >「UNICODEならばwchar_t」だからといってその逆や裏が必ずしも真じゃないことは >いうまでもないし。 対偶である「wchar_tでなければUNICODEでない」は、他の数値型でもUNICODEが 使えるので偽。故に元の命題も偽。
663 :
通りすがりII :2001/04/18(水) 14:19
>>662 > wchar_tは、実行文字集合に依存しない処理に使うもので、
これは逆じゃない? wchar_tって処理系定義だし、実行文字集合に依存
しないワイド文字定数とかっておかしな気がする。
>>662 > 処理系に依存しないUNICODEの処理に使うのは見当違い。
# UNICODEってバリバリに依存してるじゃん。ってのはさておき。
処理系定義の文字集合用のwchar_tとUNICODEという特定の文字集合を
混同するなっつーことね?
>>658 > 単にUNICODEを数値として格納できるというだけなら、普通の数値型を使うはず。
>>662 > 単なる数値として扱って、ワイド文字定数も既製の関数も使わなければ、処理系
>>662 > への依存性はまったくなし。
たとえばunicode_tとかキチンと分けて、必要ならそれ用のライブラリ
を用意すべしと。
# そういえばUNICODEライブラリなんてのはないのかな。
まぁ
>>653 はそういうところまでは意図せずに、単にcharでは足りない
文字集合の例としてUNICODEを挙げただけのような気もするけど。
664 :
通りすがり :2001/04/18(水) 17:30
>> wchar_tは、実行文字集合に依存しない処理に使うもので、
>これは逆じゃない? wchar_tって処理系定義だし、実行文字集合に依存
>しないワイド文字定数とかっておかしな気がする。
L'あ'と書けば、内部表現がシフトJISだろうが、EUCだろうが、UNICODEだろうが、もっと
独自の文字集合だろうが、コンパイラとライブラリが吸収してくれるということ。
wchar_tのサイズが足りなくて表現できない場合は致し方ないけど
>> 処理系に依存しないUNICODEの処理に使うのは見当違い。
># UNICODEってバリバリに依存してるじゃん。ってのはさておき。
それはフォントのマッピングや他の文字集合に変換する際の話で、数値そのものの話では
ないでしょう。
>たとえばunicode_tとかキチンと分けて、必要ならそれ用のライブラリ
>を用意すべしと。
そうですね。
unicode_t, shiftjis_t, euc_tとかいう感じで。
そこまでする気がないなら、unsigned intやlongを使う方が、むしろ混乱が少ないのでは?
># そういえばUNICODEライブラリなんてのはないのかな。
Tcl APIの中にはUNICODEとUTF-8用のライブラリが結構そろってるけどね。
>まぁ
>>653 はそういうところまでは意図せずに、単にcharでは足りない
>文字集合の例としてUNICODEを挙げただけのような気もするけど。
好意的に見ればね。前にも言ったけど、好意的に見続けるのであれば「C言語会話入門」
もそれほど悪いとはいえない。
665 :
デフォルトの名無しさん :2001/04/18(水) 17:56
ポインターのレベルは規格上どこまで許されるのでしょうか? たとえばchar *********pは使っていいのでしょうか?
>>665 特に決まってないし、使っても構わんが、
ポインタポインタ以上データ構造の場合、
データ構造を再考するか、typedefで読みやすくする事をお勧めする。
667 :
106 :2001/04/18(水) 23:47
長文失礼します。C言語はじめたVB厨房です。 エディタみたいなの作ろうとして早くも挫折モードです。 下方向はうまくいくのですが上とエスケープが効きません。 ちなみに上方向はとりあえずは行数だけ出して古いの押し出す てな感じでやってるとこです。C言語のプロよろしく #include<stdio.h> #include<stdlib.h> #define Up 0x6b #define Down 0x6a #define ESC 0x1b #define MAX 24 main(int argc,char *argv[]) { FILE *fp; char buf[256][256]; int fin=0,fmax=0; int i,c; /*引き数無し*/ if(argc!=2){ printf("usage:a filename"); exit(1); } /*ファイルオープン失敗*/ if((fp=fopen(argv[1],"r"))==NULL){ printf("can't open"); exit(1); } /*全文をbufに代入*/ while(fgets(buf[fmax++],sizeof(buf[fmax++]),fp)!=NULL){ } /*初期画面*/ for(i=0;i<MAX;i++) printf("%s",buf[fin++]); /*ESCが押されるまでループ*/ while((c=getch())!=ESC){ /* j(下)を押した時*/ if(c==Down && fin<fmax){ printf("%s",buf[fin++]); } /* k(上)を押した時*/ if(c==Up && fin>MAX+1){ for(i=0;i<MAX;i++) printf("%s",buf[i+fin-MAX]); } } fclose(fp); }
> while(fgets(buf[fmax++],sizeof(buf[fmax++]),fp)!=NULL){ > } ここ、動作は未定義だと思うよ。 つまり、fmaxが2つ増やされる場合もあるだろうし、 buf[0]に何も入らないかもしれない。 while (fget(buff[fmax], sizeof(buff[0]), fp) != NULL) { fmax++; //サイズチェックもしたほうがいい } kを押した時にfinが減らされてないから、期待した通りには動かないね。 ESCは効くと思うけど。
669 :
デフォルトの名無しさん :2001/04/19(木) 10:51
あの〜いつも疑問に思うのですが、 printfのように不特定数の引数をとる関数って どうやって定義すればよいのでしょうか? C#ではたしかparamが使えたと思うのですが それが通用しません だれか分かる方がいましたら教えていただけませんか?
671 :
デフォルトの名無しさん :2001/04/19(木) 12:02
こういうwsprintfの使い方って大丈夫でしょうか? ------------- char cAftBuf[10]; char cBefBuf[10]; long lData = 0; // '0'でクリア memset( cBefBuf, '0', sizeof(cBefBuf) ); // 4バイト分コピー wsprintf( cAftBuf, "%04d%4.4s", lData, cBefBuf );
672 :
通りすがり :2001/04/19(木) 12:38
673 :
デフォルトの名無しさん :2001/04/19(木) 12:39
674 :
デフォルトの名無しさん :2001/04/19(木) 12:47
どっちが正解?
675 :
669 :2001/04/19(木) 13:11
670さん ありがとうございました。 これで127個も引数をつかわなくてすみそうです。
676 :
デフォルトの名無しさん :2001/04/19(木) 13:22
トップですね。(^^
677 :
通りすがり :2001/04/19(木) 14:43
>>671 中途半端。
TCHAR にして wsprintf 使いな。
char なら sprintf 使っとけ。
679 :
デフォルトの名無しさん :2001/04/19(木) 21:32
sprintf のほうがアクセス遅くない?
だったら TCHAR 使えば? アクセスってブラウザ作ってる会社?
681 :
新入社員研修中 :2001/04/19(木) 22:52
UNIX上でCSVファイルを SJISで吐き出させるにはどうしたらいいんですか? C++禁止です・・・。
682 :
デフォルトの名無しさん :2001/04/19(木) 23:34
>>681 nkf -s じゃだめか?もしかしたら"nfk"かもしれん。そういうコマンドが
あるはずだが?
683 :
新入社員研修中 :2001/04/19(木) 23:42
>>678 >TCHAR にして wsprintf 使いな。
WCHARだろ
685 :
デフォルトの名無しさん :2001/04/20(金) 12:32
結局671のような事してたらまずいってこと?
wsprintfは重宝するなぁ。
687 :
デフォルトの名無しさん :2001/04/20(金) 16:14
>>685 コンパイルの仕方によってはまずくない。
でも、少なくともこういう大勢の人の目に触れる場では、
TCHAR szHoge[]; wsprintf(szHoge, ...);
char szHoge[]; sprintf(szHoge, ...);
の違いを意識してお話をしましょう、という話。
684は論外。
>>688 int scanf( const char *format [,argument]... );
int wscanf( const wchar_t *format [,argument]... );
TCHARを使うなら_tscanf
間違えたAPI系だった int wsprintf( LPTSTR lpOut, // pointer to buffer for output LPCTSTR lpFmt, // pointer to format-control string ... // optional arguments ); ということでTCHARで正しい
691 :
( ´∀`)さん :2001/04/20(金) 21:54
アセンブラじゃなく 1行で 0x000080番地(関数のポインタ)に飛ぶ方法教えてください。
692 :
デフォルトの名無しさん :2001/04/20(金) 21:58
((void *())0x00000080)(); か?
693 :
通りすがり :2001/04/20(金) 22:09
>>692 それを言うなら、
((void(*)(void))0x00000080)();
>>691 の質問
どっかのゲーム屋の試験に出たとか出ないとか・・・
C言語の最初は、 #include <stdio.h> void main(void) ですか? main () とかなっている本が大半なのですが、学校で習っているのは、 void main(void) なんですが、どうしてなのでしょうか?
何度も話が出てるが、ANSI C の規格 (C89) に従う限り int main(void) int main(int argc, char **argv) int main(int argc, char *argv[]) (ただし argc, argv の変数名は何でもいい) が正解。規格では関数定義において型を省略した場合には int、 引数を省略した場合には void と仮定されることになっているの で main() は int main(void) と同じで、これも規格準拠。 void main(void) で動く処理系も多いと思うが、これは規格違 反。別の ANSI C 準拠の処理系でコンパイルすると、終了時に プログラムが誤動作するかもしれないし、コンパイル時に鼻から 悪魔が出てくるかもしれない(このような処理系の動作は規格準 拠)。 まぁ標準規格はあくまで指針の一つに過ぎないが、従っておくと 良いこともある。特に ANSI C (C89) は大部分の処理系が準拠 している規格なので、この規格に従ってコードを書けば、自動的 に大半の処理系で動作が保証される点が大きい。 必要なら規格に違反しても構わないが、その場合には処理系のド キュメントを調べて動作を確認し、また移植性が落ちるというデ メリットを受容すること。
698 :
仕様書無しさん :2001/04/21(土) 16:25
>>694 CP/Mでは((void *())0)();って良くやってたな。
699 :
通りすがり :2001/04/21(土) 18:17
>引数を省略した場合には void と仮定されることになっているの >で main() は int main(void) と同じで、これも規格準拠。 それは C++の話で、Cの場合は引数の型と個数を一切チェックしない。 C++で言えば、int main(...)と同じ。
700 :
デフォルトの名無しさん :2001/04/21(土) 18:20
1さん、うちの妹が「ありがとうございました」って言ってました。
>>697 家で学校で習ったことを復習するときは、
int main(void)
って打ってやることにします。
void main(void)って先生間違っているんですね。
きちんとしたやつで教えて欲しい。
ありがとうございました。
702 :
( ´∀`)さん :2001/04/22(日) 00:53
>>694 はい。そうです。K社(だったと思う)で出てました。
関数を変数と見たてて代入とか、いろいろやって見たのですが
結局わからなかったので、聞いてみました。
692,693の答え聞いても完全に理解できなかったです。
詳しく教えてもらえますか?
C始めて3年経つ(まぁ、学生なのでマターリやってた)のですが、
今回ので、自分の未熟さを知らされました。
K&Rの本探して勉強して見ます。
703 :
692 :2001/04/22(日) 12:05
>>702 692を書いたヴァカだが(普段こんなの使わないよね)
typedef void (*func)(void);
((func)0x00000080)();
これでもわかんないか?
関数型にキャストしてるわけ。
704 :
ど素人 :2001/04/22(日) 12:46
Visual C++6.0でプログラムの勉強を始めて3日目の者です。 --------------------構成: test - Win32 Debug----------- リンク中... LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/test.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー が出て、コンパイルは出来てもビルド、実行が出来ません。 これはどうすれば解決できるのでしょうか?
>>704 1の書き込みをちゃんと見た?
VC++は別のスレで。
>関数型にキャストしてるわけ。 なるほろ、キャストでしたか。 わかりました。 ありがとうです
709 :
デフォルトの名無しさん :2001/04/23(月) 23:55
フリーのCのコンパイラで良いのはどれですか?
710 :
>>709 :2001/04/24(火) 00:01
gcc
turboC/C++>709 コンパイル速度メチャ速 これより速いのあったら教えてくれ
712 :
名無しさん :2001/04/24(火) 16:35
いきなりですみません。 質問です。 Windowsでソケット通信をしたいのですが、 Lanボード(カード)が複数ある場合、各々のIPアドレスやNetMaskの取得の仕方 を教えてください。 コンパイラは、MicroSoft VisualC++ 6.0です。
713 :
デフォルトの名無しさん :2001/04/24(火) 18:06
>>712 WSAIoctl()でSIO_GET_INTERFACE_LISTを使う。
ただしWinSock2以上が必要。
WinSock1.1だとどうしらいいのかは僕も教えて欲しいです。
714 :
名無しさん :2001/04/24(火) 19:59
>>712 です。
コマンドラインから route print
で何やらとれるみたいですが、よくわかりません。
詳しい人いますか?
>>711 Turbo Cって今フリーなの?
だいたいあれってメモリモデルがあるんじゃなかったっけ。
だとするといまどきちょっと勧められないような。
716 :
713 :2001/04/24(火) 21:14
717 :
デフォルトの名無しさん :2001/04/24(火) 21:55
>>712 WinSock1.1 で、古いWindows98でも動かす必要があるなら
snmp API でとるしか公開されている方法は無い。
SNMP API の使い方は Platform SDK かなんかのサンプルでも
見て。
718 :
デフォルトの名無しさん :2001/04/24(火) 22:20
#define TEISUU '12' と言う場合の定数('12')を char HENSUU; に入れるにはどうしたらいいんですかね?
719 :
通りすがり :2001/04/24(火) 22:26
>>718 処理系によっては代入できるけど、原則的には不可能。
そもそも、'12'がどんな値になるかも分からなければ、何ビットを必要とするのかも分からない。
確実に言えるのは、int型のサイズ以下だということだけ。(文字定数はint型だから)
720 :
デフォルトの名無しさん :2001/04/24(火) 22:44
>>719 ありがとうございます。
今日、上司に「やり方考えといて」とか言われたんですけど
やっぱできないですよね・・・。
ボーランドのサイトにあります ライセンスの詳細はよくわかりませんが自由に落とせます。 TurboC++1.01/C2.0/TurboPascal5.5など DOS版なので当然セグメントやらの制限はありますよ
722 :
デフォルトの名無しさん :2001/04/24(火) 23:58
>>718 '12'が定数になるんか?"12"でなくて。
ども。 昔はよく使ったけどねぇ。 あの限られた環境としてはよくできてたと思うけど、今やもう。
724 :
デフォルトの名無しさん :2001/04/25(水) 00:20
>718 定数('12')ってのが、何を表現したいのかわかんない。 char型(-125〜126)の整数12って意味なら、 #define TEISUU 12 char HENSUU = TEISUU; でいいけど。
725 :
通りすがり :2001/04/25(水) 11:32
>>724 >char型(-125〜126)の整数12って意味なら、
何か別の言語の話ですか?
#define TEISUU '12' <- const int char HENSUU; <- char HENSUU が1バイトしかなくて良いわけないじゃん。
727 :
デフォルトの名無しさん :2001/04/25(水) 12:44
初めてのCからDUMPプログラムより int cc; long count=0; while(((CC=getchar()!=EOF){ if(count&0x0f1==0x001) printf("\n%06lx : ",count&~0x0fl); count++; } } この本何も解説ないんだけど。何でDUMPできるの。 if(count&0x0f1==0x001)てなんでこんなことするの。 count&~0x0flてなんでこんなことするの。 単にprintf("%x",cc)だけでいいような気がするのに。 わからん。初めてのC
>>726 '12'はconst intですらないぞ。
729 :
通りすがり :2001/04/25(水) 13:07
>>727 CCがハード的にダンプしてくれる出力ポートを表すんじゃないの?
>if(count&0x0f1==0x001)てなんでこんなことするの。
きっとprintfを実行させたくないので、コメントアウトの代わりに使ったんじゃない。
730 :
通りすがり :2001/04/25(水) 13:22
>>727 なぜダンプできるのかわかりました。
きっと上の方でこんな定義があるのでしょう。
#define CC *(char*)0
これならコアダンプを出力できます。
731 :
デフォルトの名無しさん :2001/04/25(水) 14:22
printf("%x",cc)だけでいいような気がするのですが。 初めてのC不親切すぎ。あまり評判よくない。 DUMPの解説したプログラムないのかな?
732 :
デフォルトの名無しさん :2001/04/25(水) 14:35
>>726 HENSUU が1バイトしかなくて良いわけない
という理由(あと日本語も)がよくわからない
白痴?
733 :
デフォルトの名無しさん :2001/04/25(水) 16:12
簡単なDUMPプログラムの作り方おしえて
734 :
デフォルトの名無しさん :2001/04/25(水) 16:44
735 :
デフォルトの名無しさん :2001/04/25(水) 18:11
簡単なDUMPプログラムの作り方おしえて 簡単なDUMPプログラムの作り方おしえて 簡単なDUMPプログラムの作り方おしえて 簡単なDUMPプログラムの作り方おしえて 簡単なDUMPプログラムの作り方おしえて 簡単なDUMPプログラムの作り方おしえて 簡単なDUMPプログラムの作り方おしえて
>>735 #include<stdio.h>
int main(void);
{
printf("うんこたれ\n");
return(1);
}
737 :
デフォルトの名無しさん :2001/04/25(水) 19:06
736 市ね
>>735 #include <stdio.h>
#include <fcntl.h>
main(int argv,char *argc[])
{
int fd,ad=0;
unsigned char c;
fd=open(argc[1],O_RDONLY);
while(read(fd,&c,1)>0)
{
if(ad%16 == 0)printf("\n%04x: ",ad);
printf("%02x ",c);
ad++;
}
printf("\n");
}
>>737 ゴメソ
じゃあ真面目に。
1.ファイル開く
2.ファイルからデータを読み込む
3.読み込んだデータを16進数で出力
4.データがなくなるまで2〜3を繰り返す
5.ファイルを閉じる
>>741 $ man od
OD(1)
名前
od - ファイルを 8 進数、または他の形式にダンプする
743 :
デフォルトの名無しさん :2001/04/26(木) 00:07
>>727 目ぇ付いてるか? '1'と'l'は違う字だぞ。
オドー
745 :
ウォーフ :2001/04/26(木) 00:21
オドーめ!
746 :
デフォルトの名無しさん :2001/04/26(木) 00:24
>>746 <常識>
PATHは大丈夫か〜〜〜???
748 :
デフォルトの名無しさん :2001/04/26(木) 12:37
738>>#include <io.h>が抜けていたみたいだけどありがとう。
749 :
746 :2001/04/26(木) 17:13
PATHとはなんです? どのようにすればいいのですか?
任意の複素数を要素に持つ2*2の行列Aと行列Bを用意て、 AB-BAを求めるプログラムを書きこシテチョ!
任意の複素数を要素に持つ2*2の行列Aと行列Bを用意て、 AB-BAを求めるプログラムを書きこシテチョ!
752 :
デフォルトの名無しさん :2001/04/26(木) 21:27
中級者用のC言語関連のサイトでいいのある?
754 :
デフォルトの名無しさん :2001/04/27(金) 05:58
ねえねえ。(1)と(2)どっちが速いと思う? (1) strcpy( char * p, const char * q) { char * r = p; while( (*r++ = *q++) != '\0'); return p; } (2) strcpy( char * p, const char * q) { register size_t c = 0; while( (p[c] = q[c]) != '\0') ++c; return p; }
755 :
デフォルトの名無しさん :2001/04/27(金) 06:03
なんていうかあれやね。Cも長生きやね。POSIX ThreadやらBerkley APIでなんでもかんでもてえっかんじかね。
756 :
デフォルトの名無しさん :2001/04/27(金) 07:56
age
758 :
通りすがり :2001/04/27(金) 09:12
759 :
デフォルトの名無しさん :2001/04/27(金) 11:57
>>754 そんなもん測ってみりゃいいじゃん。人に聞いてどうするの?
760 :
通りすがり :2001/04/27(金) 12:55
>>759 デバッガも表示装置もタイマもない環境がある。
(1)と(2)の実行速度が響いてくるのは、むしろそういった
環境の方が多い。
逆アセンブルして、実行サイクル数を数えるのが一番確実。
>>754 うちのペンティアム3の機械でgccでO2つけてやってみたら
whileの中は(2)の方が1命令分短かった。
ただ、将来最適化のアルゴリズムがもっと賢くなったら
多分(1)のが速いと思う。
763 :
通りすがり :2001/04/27(金) 21:15
>>754 R4000系のような純粋なRISCの場合は、おそらく(1)の方が速いよ。(試してないけど)
(1)はループあたり加算が2回なのに対して(2)は3回必要になるからね。
strcpyじゃなくて、wcscpyとかならもっと顕著になるはず。
CPUのアドレッシングモードにどんなのがあるかでほぼ決まってくると思うけど。
ペンティアム3の機械は関係ねえじゃん(w 命令数とスピードは直接繋がらないよ
>>760 そんなにキビシイ環境もあるのか。
そしたら10^5回くらいループで回して腕時計で計ったらダメ?
命令コード数で測るのは有効だと思うし、この例ならそれで充分だと
思う。でもキャッシュの効き方とかで速度変わったりすることも多いから、
何らかの形で実測するべきだと思うよ。
766 :
760 :2001/04/27(金) 22:56
>>765 腕時計やストップウォッチで計ろうにも、表示装置(最悪の場合はLEDすら)
なかったりするから、どこからどこまで計ったらいいのかさっぱりわからない。
そういう環境の場合は、大抵キャッシュもなければバス調停もないから命令
サイクル数が即実行速度になる。
767 :
760 :2001/04/27(金) 23:05
少し補足。 キャッシュの効き方とかはリンクする際のモジュールの配置順序とか、 関数をキャッシュラインに整列させるかどうかといったリンク時の問題 がほとんど。あとはできるだけ少ないキャッシュラインで済ませること ぐらいだけど、C言語レベルのコーディングとはそもそも直接関係が ないと思うけど。
769 :
デフォルトの名無しさん :2001/04/28(土) 05:43
パス(path)設定できました。ありがとう。」
770 :
754 :2001/04/28(土) 06:11
みなさんありがとうです P6系のCPUならアドレス計算のペナルティが何故か無いので(2)のほうが クロック数が少なくて済むのですが,レジスタを一本使うしchar型でなく 何らかの構造体ならアドレス計算に乗算が必要なので(1)のほうが良いかも なぜこんな質問なのかというとstrcpyとstrlenとひとつにした 関数を書いていて while( (*p++ = *q++) != '\0' ) ++c; p++, q++ を削れないかとふと思ったからです(^-^; 素直に書いたほうが良いのですね 最近は命令よりもL1,L2キャッシュに収めるほうが重要ですが...
考えてみたら (1) だって inc di // p++ u-pipe inc si // q++ v-pipe でペナルティ 0 ですね (藁 アホだ..
772 :
通りすがり :2001/04/28(土) 08:31
>>770 標準ではないけどstpcpyっていう関数があるよ。(Borlandだけかな)
'\0'の格納位置を返すので、長さが欲しいのなら引き算するだけ。
そもそもP6系でなぜそんなにシビアになるのかがわからない。
それに、P6系ってレジスタ少なすぎ。旧式アーキテクチャのポンコツCPUと
しか思えないよね。
773 :
ど素人 :2001/04/30(月) 14:29
構造体を格納した配列の各要素(構造体)を削除するにはどうしたら いいでしょうか? ↓の状態にハマって抜け出せません。 4つのchar型配列をメンバに持つ構造体。各メンバ(配列型)の 先頭[0]に0x00を入れることで既存データを削除しようとする と実行中エラーが出て終了になる。 help me...
>>766 ぐはぁ、組み込み環境をちと甘くみてましたよ。LEDすら無い場合もあるのね。
勉強になりました。解説ありがとう。
遅レスさげ。
K&Rの演習が殆ど解らん 鬱だ死のう。
776 :
766 :2001/04/30(月) 18:19
>>774 出力ポートだけでもあれば、最悪の場合、ロジックアナライザとかで
計るという手はあるけどね。
777 :
759 :2001/04/30(月) 18:39
>>766 もしよろしければ、出力ポートもない場合のデバッグ手法を教えて
いただけないでしょうか。
778 :
デフォルトの名無しさん :2001/04/30(月) 19:15
>733 メンバの先頭に0x00を入れるのは間違ってないけど、エラーになるのはやり方が悪いんじゃない。 それだけじゃわからん。
strcmpやmemcmpは、unsigned char、signed charのどっちかで 比較するのか決まってるんですか? 日本だとunsigned charの方が都合がいいと思うけど、 英語版コンパイラのstrcmpがsignedで比較されてたらと思うと、 夜も眠れません。
練習用に2chのdatファイルをhtmlに変換するプログラム書いてるんだけど
「>>半角数字」の書き換えとリンク張りの実装がみっともないのしか出来ない・・
bufにレスの本文を読み込んであって
1. >>の部分のタグをメモリ上で置換(<a name="レス番号">みたいなのを全レスに貼り付けてある)
2. リンク貼りは書き込みながらタグを付加
って感じになってる。
int WriteRes(char *writing, FILE* htmlfp)
{
char ch;
char *start_url, *end_url;
if(!ReplaceRef(writing)) {
return 0;
}
end_url = writing;
start_url = strstr(end_url, "
http:// ");
while (start_url!=NULL) {
*(start_url++) = '\0'; //文字列を普通の文とURLとに分割、httpのhに'\0'を上書きしてる
fputs(end_url, htmlfp); //URLの手前まで出力
end_url = FindEndUrl(start_url);//urlの終端の次の文字を探索
ch = *end_url; //その文字をchに一時保存
*end_url = '\0'; //URLを抽出、頭のhは抜けてる。hは↓で手で出力
fprintf(htmlfp, "%s%s%s%s%s","<A HREF=\"h",start_url,"\" TARGET=\"_blank\">h",start_url,"</A>");
if (ch=='\0') { //文末がURLだとカンマ置換したときに上書きされなかったのがくっつくから
break;
}
fputc(ch,htmlfp);
start_url = strstr(++end_url, "
http:// ");
}
fputs(end_url, htmlfp);
return 1;
}
int ReplaceRef(char *writing) { char *StartTag, *EndTag, *StartRefResNo, *EndRefResNo; char buf[MAX_SIZE_RES]; StartTag = strstr(writing, "<a"); while(StartTag != NULL) { if((StartRefResNo = strstr(StartTag, "&st="))==NULL) return 0; StartRefResNo += 4; EndRefResNo = StartRefResNo; while(isdigit(*EndRefResNo)) EndRefResNo++; *EndRefResNo = '\0';//ResNoの切り出し buf[0] = '#'; strcpy(buf+1, StartRefResNo); if((EndTag = strstr(EndRefResNo+1, "\">"))==NULL) return 0; *(StartTag + 9) = '\0'; strcat(buf, EndTag); strcat(writing, buf); StartTag = strstr(EndRefResNo, "<a"); } return 1; }
1と2の処理を同時進行でやりたいし、メタメタなコードになってるから 書き直したいんだけど、どっから手を付けるべきか分かんない。。
783 :
デフォルトの名無しさん :2001/04/30(月) 20:10
>>780 -783
errorのチェックいい加減だし。。
>>779 > strcmpやmemcmpは、unsigned char、signed charのどっちかで
> 比較するのか決まってるんですか?
charです。
charがsignedかunsignedかどうかはコンパイラに聞いてください。
785 :
通りすがり :2001/04/30(月) 20:53
>>779 > strcmpやmemcmpは、unsigned char、signed charのどっちかで
> 比較するのか決まってるんですか?
strcmp, strncmp, memcmpは各バイトをunsigned charとして比較します。
>>784 ネタにしてはたちが悪いです。
786 :
デフォルトの名無しさん :2001/04/30(月) 21:01
#include <stdio.h> #define X_SIZE 40 #define Y_SIZE 60 char graphics[X_SIZE / 8][Y_SIZE]; #define SET_BIT(x,y) graphics[(x) / 8][y] |= (0x80 >> ((x) % 8)) int main(){ int loc; void print_graphics(void); for(loc = 0; loc < X_SIZE; ++loc) SET_BIT(loc,loc); print_graphics(); return 0; } void print_graphics(void) { int x,y; unsigned int bit; for(y=0; y < Y_SIZE; ++y){ for(x = 0; x < X_SIZE / 8; ++x){ for(bit = 0x80; bit > 0; bit = (bit >> 1)){ if((graphics[x][y] & bit) != 0) printf("x"); else printf("."); } } printf("\n"); } } //意味不明、理解不能、俺厨房
788 :
766 :2001/04/30(月) 22:22
>>777 出力ポートも何もない場合、まずはPC上で(PC用のコンパイラを使って)ロジック
の検証をする。後は、そのハードが備えている周辺デバイスの振る舞いを調べるのと
並行して、必要ならロジックアナライザでアドレスバスとデータバスのログをとって
頭の中でオペコードを同時通訳しながらデバッグしたこともあったっけ。
基板の引き回しとの相性とかで、実機で起こらない現象を調べるときとかは、ICE
も何も使えないので、こんな方法を使うしかない。それでもロジアナをつなげられれば
ましな方。
789 :
デフォルトの名無しさん :2001/05/01(火) 00:20
どなたか、C言語でつくられたテトリスのソースのある場所 をご存知でしょうか? 探しても見つからないんです。
>>788 うおーん。ソフトのデバッグというよりは、ほとんどハードのデバッグみたいですね。
ロジアナがつながらないときは... 一つ一つ仮説を積み上げていって作業するんでしょうね。
当方ゲームプログラマで「PS2でアセンブラコーディングしてるから、ずいぶん組み込みより
だよネ」とか勝手に思ってたんですが、全然認識が甘かったです。
貴重な体験談をどうもありがとう。
791 :
デフォルトの名無しさん :2001/05/01(火) 05:34
>>754 (770)
p=q+1 とかだと楽しそう…。(^^;
あと、(1)だけど、「const char」て、
インクリメントして、いいんでしたっけ…?
って、ネタなので、あまり気にしないで下さい。
> あと、(1)だけど、「const char」て、 > インクリメントして、いいんでしたっけ…? ネタだよね…? > って、ネタなので、あまり気にしないで下さい。 って、ほんとにネタかい!
793 :
デフォルトの名無しさん :2001/05/01(火) 07:41
>>770 もう少し、無駄を省けそうな気もしますが、こんな感じです。
int strcpy ( char *p , char *q ) {
int i , j ;
char *r ;
for ( r = q ; *r ; r++ ) ;
j = i = r - q ;
for ( p = p + j++ ; j ; j-- ) {
*p-- = *r-- ; }
return ( i ) ; }
ついでに、本当は
size_t strcpy ( char *p , const char *q ) {
size_t n ;
n = strlen ( q ) ;
memcpy ( p , q , n + 1 ) ;
return ( n ) ; }
これで、ほとんどロスはないですし、環境依存もなく綺麗です。(^^;
って、またネタなので、以下同文。
下げるの忘れてました。m(_ _)m
795 :
通りすがり :2001/05/01(火) 08:20
>>794 文字列を二回も走査するのにどこがロスがないというの?
それに後の方は関数を呼び出す際のロスがかなり大きい。関数呼び出しの際のコストを
甘く見てない?
796 :
通りすがり :2001/05/01(火) 08:20
ごめん、ネタだったのか。
797 :
通りすがり :2001/05/01(火) 08:26
>>790 ゲーム機でもロット依存性を評価するときとかは実機でないとできない
ので、似たようなことやるでしょう。
64にロジアナをつないだときはさすがにめげたけどね。
>>770 何となく、自分がアホっぽく見えたので、マジレス。
size_t strcpy ( char *s1 , const char *s2 ) {
size_t n = 0 ;
while ( *s1++ = *s2++ ) n++ ;
return ( n ) ; }
環境依存もあるけど、strcpyを延長したものなら、これでOK。
799 :
anonimity :2001/05/03(木) 22:02
#include<stdio.h> int Coins[]={500,100,50,10,5,1}; #define ASIZE(sizeof Coins/Coins[0]) main() { int NoOfCoins[ASIZE]; int Price,Payment,Change, i; void CompChange(int, int[]); while(scanf("%d %d",&Price,&payment)==2) { Change=Payment-Price; if(Change>0) { CompChange(Change,NoOfCoins); printf("turisen ha %d yen\n",Change); for (i=0;i<ASIZE;i++) if (NoOfCoins[i]>0) printf("%4d yen kouka:%4d mai\n",Coins[i],NoOfCoins[i]); } else if(Change<0) printf("%d yen fusoku\n",-Change); else printf("tyoudo \n"); } } void CompChange(int Rem,int NC[]) { int i; for (i=0; Rem>0; i++) { NC[i] =Rem / Coins[i]; Rem %= Coins[i]; } for ( ; i<ASIZE; i++) NC[i] =0; } Would you mind telling me the reason of compile error in 5 line? error message; badly punctuated parameter list in '#define'
>>799 You need a whitespace between ASIZE and (sizeof Coins/Coins[0]) , I think.
Tte, nande eigo nanja goruaa!!
801 :
anonimity@799 :2001/05/03(木) 23:25
You must have a chinco.
803 :
sage :2001/05/05(土) 12:51
これダメ?ハード屋と結果が合いません CCITT-CRC16なんだけど・・・ #define DAT_BIT_SIZE ( 8) #define CRC_BIT_SIZE (16) /* CCITT-CRC = X16+X12+X5+1 */ #define GENERATION_POLYNOMIAL ((0x01L<<(16))|(0x01L<<(12))|(0x01L<<( 5))|(0x01L<<( 0))) unsigned short int CalculationOfCRC16( unsigned char *SourceBuffer, unsigned char DataSize){ unsigned short int ResultData = 0xFFFF; unsigned char SourceData = 0; unsigned short int i; int j; for(i=0; i<DataSize; i++){ SourceData = *SourceBuffer++; for(j=(DAT_BIT_SIZE-1); j>=0; j--){ if(((ResultData>>(CRC_BIT_SIZE-1))^(SourceData>>(DAT_BIT_SIZE-1))) & 0x0001){ SourceData=SourceData<<1; ResultData=ResultData<<1; ResultData^=GENERATION_POLYNOMIAL; }else{ SourceData=SourceData<<1; ResultData=ResultData<<1; } } } return ResultData; }
804 :
デフォルトの名無しさん :2001/05/05(土) 23:20
struct node { struct node *left; /* 左枝 */ struct node *right; /* 右枝 */ char *word; /* ノードに対する単語 */ }; とした場合のツリー構造の単語を表示する以下の関数 void print_tree(struct node *top) { print_tree(top->left); printf("%s\n", top->word); print_tree(top->right); } この再帰の表現がイメージできません。 誰か教えてください。
>>804 イメージできんて言われても。。
実際にtreeの図を書いて辿ってみれば?
そのコードは停止条件が書かれて無いので暴走します。
807 :
804 :2001/05/06(日) 05:25
あ、すいません。書き直しました。 void print_tree(struct node *top) { if(top == NULL) return; print_tree(top->left); printf("%s\n", top->word); print_tree(top->right); }
808 :
デフォルトの名無しさん :2001/05/06(日) 11:18
このプログラムを実行すると、普通に入力しているにも関わらず、入力エラーを返してきます。 配列も0,1,2に格納されないで、0,2,4に格納されます。 どなたか、解決方法教えてください。 #include <stdio.h> #define N 5 void main(void) { int j; int point[N]; char po; for(j=0; j<N; j++){ point[j]=0; printf("%d番は?a:40ポイント b:35ポイント c:30ポイント",j); scanf("%c",&po); switch(po){ case 'a': point[j]+=40; break; case 'b': point[j]+=35; break; case 'c': point[j]+=30; break; default: /* 変な文字を入力した場合 */ printf("\n入力エラー!\n"); break; } } printf("1 番の合計ポイント %d\n",point[0]); printf("2 番の合計ポイント %d\n",point[2]); printf("3 番の合計ポイント %d\n",point[4]); }
>>808 >scanf("%c",&po);
scanfの使い方が間違っている。入力には改行文字も含まれるので
aを入力すると"a\n"がバッファに入る。scanfで一文字しか
取り出していないから、次のループでpoに改行文字が入り
配列1,3,5が入力エラーとなっている模様。
poをchar po[256];としてscanf("%s",po);でとりあえずいい。
あとswitch(po[0])で参照。ずいぶんアバウトなコードだが。
>>804 ツリー構造がわからないの?再帰が分からないの?
>>809 お答えありがとうございます。
うまくいきました。
>>809 分からかったのは再帰のほうです。しばらく考えて
みてなんとなく分かりました。再帰ってのは便利な
ものですねえ。
812 :
たけ :2001/05/07(月) 00:32
C言語のプログラムで自分で英語の大文字を何文字か入力して その入力頻度(A=1文字、B=1文字・・・)というふうに表示させる プログラムの作り方わからないのですがどなたか教えて下さい。 まだC言語の知識がまだ乏しいので・・・。 どうか、お願いします。
813 :
デフォルトの名無しさん :2001/05/07(月) 00:34
Cの文字列で、16進拡張[\x]の後に[0〜F]の文字が続く場合、 どういった書き方をするのが良いのでしょうか? とりあえず、自分は以下の方法で回避したのですが char *test_menu[] = { "x7fSELECT", // "x7fAUTO LOAD", /* これだと'x7fA'と認識されてwarningが出る */ "x7f" "AUTO LOAD", // とりあえずこれで回避 "x7fTEST", }; /* x7fは特殊記号扱いのオリジナルの文字 */ この""の連続をコンパイラが受け付けてくれる環境だったので、 上記の書き方で回避できたのですが、普通はこういった場合 どういった記述をしますか。
814 :
デフォルトの名無しさん :2001/05/07(月) 00:39
こんにちは。 ちょっとお聞きしたいのですが、 例えば以下のような配列があったとして・・ char array[100]; array[0] = 'a'; array[1] = 'b'; array[2] = 'c'; array[3] = '\0'; この配列を全部消してまったくの初期の状態(配列を宣言しただけの状態) に戻したい場合どうしたらよろしいのでしょうか? こんな感じ ↓ array[0] = 不定; array[1] = 不定; array[2] = 不定; array[3] = 不定; なんか特別な関数でもあるのでしょうか?
>>813 隣接する文字列リテラルは連結されるってのは標準化されてるんだから
気にしなくてオケ。
すみません、
>>813 の文字列の "x7f〜" は、
全て"\x7f〜" の書き間違いでした。(痛
>>815 さん、どうもです。
とりあえず上記のやり方でいってみます。
ところで、ここからは余談になりますが、
隣接する文字列を連結してくれない環境の場合、
他にどういった記述方法が考えらるでしょうか?
817 :
デフォルトの名無しさん :2001/05/07(月) 00:51
質問の本質が良く分からんが、array[3]='\0'という事なので 一度使用した文字列 char array[100] を再利用するために 空の状態にしたい、という質問だと解釈します。 ならば array[0]='\0'; で array は空の文字列になりprintf しても何も出力されません。 本当に不定にするのなら rand() でも使いなされ。 用途が思い浮かばないが。
818 :
814 :2001/05/07(月) 00:56
>>817 なるほど! さっそく試してみます。 ありがとうございました。
>>816 Aも16進で書く。適切とは思えんけど。
820 :
デフォルトの名無しさん :2001/05/07(月) 01:12
>>816 815氏の言う通り、標準化されているのでほぼ問題ないはずだけど、
万が一連結不能なCで書く場合、私なら普通に見えるアスキーコード
を使っちゃう。見やすさ命。
\x7f はメニューのカーソルに見えるが、
そのまんま '>' とかに当てておき、表示ルーチンで '>' を
本来の文字とかグラフィックに置き換えて作画するとか。
821 :
820 :2001/05/07(月) 01:15
修正。\x7f はカーソルじゃなくてMS-Wordの箇条書きシンボルかな。
#define GAIJI \x7fじゃ駄目なんだっけ?
823 :
デフォルトの名無しさん :2001/05/07(月) 02:13
>814 配列や構造体の初期化は memset(array,0,sizeof(array)); としてゼロを並べるのがいいよ。 この方が汎用性が高いから。 int a[10]; char b[5][10]; struct AAA c; の場合でも、それぞれ memset(a, 0,sizeof(a)); memset(b, 0,sizeof(b)); memset(&c,0,sizeof(c)); と書ける。
824 :
>816 :2001/05/07(月) 02:25
古い処理系ならそもそも\xが使えない場合もあるから "\177AUTOLOAD"とか。
for(i=0; i<N; i++) printf(" %d %d\n",i,a[i]); sort(point); for(i=0; i<N; i++) printf(" %d %d\n",i,a[i]); } sort(昇順に並び替え)した時に、 a[i]の値は昇順になるのですが、iの値もそれと対比させて、 出力するにはどうすればよいのでしょうか?
826 :
デフォルトの名無しさん :2001/05/07(月) 20:56
>825 例えば、構造体 struct{ int a; int index; }b[N]; を作って、メンバaに配列a[]の値を、メンバindexには0,1,2,3・・・を入れていく。 b[0].a = a[0]; b[0].index = 0; b[1].a = a[1]; b[1].index = 1; ・ ・ ・ b[N].a = a[N]; b[N].index = N; それで、配列b[]をメンバaでソートする。 メンバindexには元の順番が残っている。
827 :
デフォルトの名無しさん :2001/05/07(月) 21:46
Cのソース中に、定数の値を2進数で書きたい場合はどうすればよいでしょう? 言語仕様上書けないようなのですが、 どうしても書きたいんです。 トリッキーな書き方でも良いので教えてください。
828 :
デフォルトの名無しさん :2001/05/07(月) 22:07
>>827 マクロでいいんでは。#define B00010010 0x12 とか。
829 :
827 :2001/05/07(月) 22:24
0x12のところは、人手ではなく、自動でやらせたいです。 どうすればよいでしょう?
830 :
通りすがり :2001/05/07(月) 22:43
>>829 とりあえず8進表記にして、シフト演算と論理演算で2進数に変換すれば?
例えば、話を簡単にするために2桁にすると、
#define B(n) ((0##n
>>2 )&2|(0##n&1))
のようにすれば、B(00), B(01), B(10), B(11)という書き方で2進数が使える
ようになるよ。8進数にするのは少しでも桁数を多く使えるようにするため。
もちろん使い方を間違って、B(12)とかしてもエラーにならないので危険だけど。
>>829 自動的に
#define B00000000 0x0
#define B00000001 0x1
#define B00000010 0x2
#define B00000011 0x3
:
:
というヘッダファイルを出力するプログラムを書いて、それをincludeする。
832 :
827 :2001/05/07(月) 22:51
うーん。830,831とも なかなかおもしろいですが、 実は32bitくらいの2進数を書きたいんです。^^;) 無理かなぁ。
>>832 別に831のやり方でいいんじゃない?(藁
ほんの120Gのinclude fileで
834 :
通りすがり :2001/05/07(月) 23:02
>>832 830の方法だとニブル単位かバイト単位に区切って引数を渡すしかないですね。
B(10000000,10101000,00110000,00000001)という感じで。むしろこの方が
見やすいかも。
831の方法の場合、翻訳限界さえ許せば原理的には何ビットでもできそうだけど、
すごいヘッダファイルになりますね。
>>828 -834
アホかおまえら・・・(w
ふつーawkやperlかなんかでプリプロセスするだろ。
836 :
デフォルトの名無しさん :2001/05/07(月) 23:17
>>835 それだと827の希望通りにはならない。
じゃあ文字列の中に書いて自分でパースすれ>836 hextoi("0xabcd_ef01") -> 0xabcdef01 bintoi("b0000_0100_1000") -> 72
838 :
827 :2001/05/08(火) 00:05
なるほど。 B(10000000,10101000,00110000,00000001) これ結構イケてますね。確かに区切ったほうが見やすいです。 bintoi("b0000_0100_1000") -> 72 これだと、関数になっちゃう? 重いのはヤダなぁ。 マクロ内でパースするとなると、上と同じになるかな?
#define B1(a) ((0##a
>>2 )&2|(0##a&1))
#define B2(b,a) ((B1(b)<<8)|B1(a))
#define B3(c,b,a) ((B1(c)<<16)|B2(b,a))
#define B4(d,c,b,a) ((B1(d)<<24)|B3(c,b,a))
#define B(n) ( (0##n
>>30 )&32768 | (0##n
>>28 )&16384 | (0##n
>>26 )&8192 | (0##n
>>24 )&4096 \
| (0##n
>>22 )&2048 | (0##n
>>20 )&1024 | (0##n
>>18 )&512 | (0##n
>>16 )&256 \
| (0##n
>>14 )&128 | (0##n
>>12 )&64 | (0##n
>>10 )&32 | (0##n
>>8 )&16 \
| (0##n
>>6 )&8 | (0##n
>>4 )&4 | (0##n
>>2 )&2 | (0##n&1) )
で、16bitまでOKですね。
8進定数は、何bitまで書けるんだろう?
841 :
デフォルトの名無しさん :2001/05/08(火) 06:58
>>827 831さんの応用(と言うか、そのまんま)
自動的に ヘッダファイルを出力するプログラムを書いて、
#define B32(s1,s2,s3,s4) (long)((B16(s1,s2)<<16)|B16(s3,s4))
#define B16(s1,s2) (int)((B8(s1)<<8)|B8(s2))
#define B8(s1) (char)(B##s1)
#define B00000000 0x0
#define B00000001 0x1
#define B00000010 0x2
#define B00000011 0x3
:
:
出てきたファイルに、最初の三行を挿入し、include。
これで、B8(n) B16(n,n) B32(n,n,n,n) の3種類はOK。(n=8bit)
キャストは、某試食版で上手く行かなかった為(手抜き)。(^^;
842 :
841 :2001/05/08(火) 07:02
もちろん、841をB16→B32のように拡張すれば、もっといけます。
843 :
841&842 :2001/05/08(火) 08:06
840さんの応用(と言うか、これも、そのまんま)
#define B32(s1) ((B16(0##s1
>>32 &0xffffffffffff00000000)<<16)|(B16(0##s1&0xffffffff)))
#define B16(s1) ((B8(0##s1
>>16 &0xffffff0000)<<8)|(B8(0##s1&0xffff)))
#define B8(s1) ((0##s1
>>14 )&128|(0##s1
>>12 )&64|(0##s1
>>10 )&32|(0##s1
>>8 )&16|(0##s1
>>6 )&8|(0##s1
>>4 )&4|(0##s1
>>2 )&2|(0##s1&1))
12バイト長の数字を扱えれば、
B8(8bit) B16(16bit) B32(32bit)の3種類はOKのはず。
でも、試せないので…。(^^;
訂正。
#define B32(s1) ((B16(0##s1
>>32 &0xffffffffffff0000)<<16)|(B16(0##s1&0xffffffff)))
#define B16(s1) ((B8(0##s1
>>16 &0xffffff00)<<8)|(B8(0##s1&0xffff)))
#define B8(s1) ((0##s1
>>14 )&128|(0##s1
>>12 )&64|(0##s1
>>10 )&32|(0##s1
>>8 )&16|(0##s1
>>6 )&8|(0##s1
>>4 )&4|(0##s1
>>2 )&2|(0##s1&1))
何かおかしいと思ったら、ゼロの数をミスってました…。m(_ _)m
さら訂正。
#define B32(s1) ((B16(0##s1
>>48 )<<16)|(B16(0##s1&0xffffffff)))
#define B16(s1) ((B8(0##s1
>>24 )<<8)|(B8(0##s1&0xffff)))
#define B8(s1) ((0##s1
>>14 )&128|(0##s1
>>12 )&64|(0##s1
>>10 )&32|(0##s1
>>8 )&16|(0##s1
>>6 )&8|(0##s1
>>4 )&4|(0##s1
>>2 )&2|(0##s1&1))
眠くて頭が働かないので、まだ、間違ってたら、他の人に期待。(^^;
846 :
デフォルトの名無しさん :2001/05/08(火) 11:56
char sz1[100]; char *psz1 = "12345"; char *psz2 = "67890"; sprintf(sz1, psz1, psz2); この時のpsz2って何の意味が有るの?
847 :
デフォルトの名無しさん :2001/05/08(火) 13:41
意味ないですね。psz1の指す文字列の中に%sとかあったら 別ですけど。
848 :
デフォルトの名無しさん :2001/05/08(火) 20:52
実行ファイルのある位置を知りたいのですが。 fp=fopen(file,"w"); とやると、自分の今いるディレクトリのfileを開こうとしますよね? それを、実行ファイルのあるディレクトリの、fileを開くようにしたいのですが・・・
849 :
デフォルトの名無しさん :2001/05/08(火) 21:13
% gcc -o test.c -lm とやると、test.cが無くなってしまうのですが、なぜなんでしょう? -lm を付けないと、ちゃんとしたエラーを返してくれるのですが・・・
>>825 さん
int j[N] ;
for(i=0;i<N;i++){
j[i]=i;
printf(" %d %d\n",i,a[i]);}
sort(point);
for(i=0;i<N;i++)
printf(" %d %d\n",j[i],a[j[i]]);
※sort(a[j[i]]の結果で、jをsortする)
分かり辛いかも知れませんが、こんな感じで…。(^^;
>>827 さん
根本的に間違ってたので訂正。(何を寝ぼけてるんだ>自分)
#define B32(s) ((B16(s
>>48 )<<16)|B16(s))
#define B16(s) ((B8(s
>>24 )<<8)|B8(s))
#define B8(s) ((0##s
>>14 )&128|(0##s
>>12 )&64|(0##s
>>10 )&32|(0##s
>>8 )&16|(0##s
>>6 )&8|(0##s
>>4 )&4|(0##s
>>2 )&2|(0##s&1))
12バイト整数が使えれば、B8(n) B16(nn) B32(nnnn) でOK。(n=8bit)
でも、今は扱える整数なら全て使える841の方法をお勧め。
852 :
デフォルトの名無しさん :2001/05/08(火) 21:59
自己参照構造体のソートが、理解できません。分かりやすい本か、 ホームページがあれば教えてください。お願いします。
854 :
デフォルトの名無しさん :2001/05/08(火) 23:54
>>853 gcc -o test.c
だと、ちゃんとエラーが出るんです、出力ファイル名入れろって。
でも
gcc -o test.c -lm
だとtest.cが消えてしまうんです。
何故なんでしょう?
855 :
デフォルトの名無しさん :2001/05/09(水) 00:06
>854 gcc -otest.c -lm と解釈されてるんじゃない。
856 :
デフォルトの名無しさん :2001/05/09(水) 00:26
-Oと勘違いしてんだろ?
857 :
848 :2001/05/09(水) 00:29
>>853 argv[0]だと、その実行ファイル名も含まれてしまいませんか?
859 :
848 :2001/05/09(水) 10:21
>>858 その方法を教えていただきたいのですが。
>>859 ファイル名を含むフルパスからファイル名以下を取り除く。
デリミタとかは処理系依存なので自分で調べれ。
861 :
デフォルトの名無しさん :2001/05/09(水) 11:30
gcc -E test.c --> preprocess only gcc -c test.c --> test.o gcc -o test test.c --> test
862 :
848 :2001/05/09(水) 12:19
あ、あと、pathの通っているところに置かれているコマンドを実行した場合、
argv[0]にはコマンド名しか入っていませんよね?
この場合はどうすれば良いのでしょう?
>>860 デリミタと言うのは、区切り文字、みたいな理解で良いんでしょうか?
WINなら"\",UNIXなら"/" ということでしょうか。
863 :
仕様書無しさん :2001/05/09(水) 12:27
>>854 は、-lmが無いとちゃんとエラーになるのに
-lmがあるとエラーにならないのは何故か、
と言ってるんじゃないかな。
854の最初のコマンドラインは、「出力ファイル名を入れろ」ではなくて
「入力ファイル名が無い」と言うはずだよ。
入力が無いからgccはエラーをだして何もしない。
ところが次の(-lmが付いている方)は、libmという入力ファイルがあるから
リンカが起動する。それで出力先が指定されているから(-o test.c)
test.cを先ず消すんだが、libm以外に入力が無いためmainが無く
リンクには失敗するので結果として test.c が無くなって終わり、
というわけだ。
864 :
861 :2001/05/09(水) 12:37
>>862 フルパスなのかコマンド名だけなのか調べて場合分け。
ヒントはもーここまで。デリミタがなんなのか知ってるなら、フルパス名の時と
コマンド名だけの時を切り分ける条件くらい自分で考えれ。
867 :
デフォルトの名無しさん :2001/05/09(水) 14:42
>>865 UNIXの場合execveに渡すファイル名は幾らでもでっちあげ
られるので、プログラム側から自分自身のファイル名を
確実に得る方法はありません。
~~~~
どうでもいいレスですけど。
868 :
デフォルトの名無しさん :2001/05/09(水) 16:20
SORT関数が呼び出せません。 SORTを呼び出して、降順にしたいのですが。アドバイスお願いします。 #include <stdio.h> #define N 3 typedef struct{ int a; }b; void sort(int *); void swap(int *x,int *y); void main(void) { b std[3]; int i; for(i=0;i<3;i++){ printf("番号?");scanf("%d",&std[i].a); } sort(std[i].a); for(i=0;i<3;i++){ printf("%4d\n",std[i].a); } } void sort(int *a) { int i,j; for(i=0;i<N-1;i++){ for(j=i+1;j<N;j++){ if(*(a+i)<*(a+j)) swap(a+i,a+j); } } } void swap(int *x,int *y) { *x = *y - *x; *y -= *x; *x += *y; }
void get_path(char* path, int len, BOOL print) { char p[MAX_PATH * 2]; memset(path, 0, len); ::GetModuleFileName(NULL, p, MAX_PATH * 2); CString s = p; int pos = s.ReverseFind('\\'); s = s.Left(pos); memcpy(path, s, len - 1); if(print) printf("%s\n", path); }
>>868 void hoge_sort()
{
b p[N];
int i = 0;
int j = 0;
int x = 0;
/* input */
for(i = 0; i < N; i++)
{
printf("number");
scanf("%d", &(p[i].a));
}
/* sort */
for(i = 0; i < N; i++)
{
for(j = i; j < N; j ++)
{
if(p[i].a < p[j].a)
{
x = p[i].a;
p[i].a = p[j].a;
p[j].a = x;
}
}
}
/* print */
for(i = 0; i < N; i++)
{
printf("%4d\n", p[i]);
}
}
871 :
デフォルトの名無しさん :2001/05/09(水) 18:09
>>863 そうです、私の質問はそういう事を言いたかったわけです。
文章下手で申し訳ない。
>854の最初のコマンドラインは、「出力ファイル名を入れろ」ではなくて
>「入力ファイル名が無い」と言うはずだよ。
これもその通りです。私の勘違いでした。
872 :
868 :2001/05/10(木) 00:48
>>870 アドバイスありがとうございます。
sort(条件文)→swap(交換)を呼び出すのはどうしたらいいのでしょうか?
かなり質問の系統が違うのですが、お願いします 求人欄でよく見る、Cができる人とか、VBができる人とかいうのは、 どの程度のレベルの事を指しているのですか? 漠然としすぎてて分かりません。 また、初心者がそのレベルに達するまでにはどれくらいの時間が必要ですか?
874 :
デフォルトの名無しさん :2001/05/10(木) 02:32
>1 C言語とC++の違いは何? 全く違う言語と考えていいの?
最低でも実務経験2年以上>873 本読め>874
876 :
ヒロト :2001/05/10(木) 12:57
自分のノートパソコンにcプログラミングの環境を作りたいのですが、 良く分かりません。 シグナスはフリーで落ちているのではないかと聞いたので、 色々と調べましたが訳が分かりません。 只では無理なのでしょうか?
>>872 #define N (10)
#include <stdio.h>
typedef struct
{
int a;
}b;
void hoge_input(b p[], int num)
{
int i = 0;
for(i = 0; i < num; i++)
{
printf("[%d] = ", i);
scanf("%d", &(p[i].a));
}
}
void hoge_swap(int* a, int* b)
{
int x = 0;
x = *a;
*a = *b;
*b = x;
}
void hoge_sort(b p[], int num)
{
int i = 0;
int j = 0;
for(i = 0; i < num; i++)
{
for(j = i; j < num; j++)
{
if(p[i].a < p[j].a)
{
hoge_swap(&(p[i].a), &(p[j].a));
}
}
}
}
void hoge_print(b p[], int num)
{
int i = 0;
printf("----------\n");
for(i = 0; i < num; i++)
{
printf("[%d] = %d\n", i, p[i].a);
}
}
int main()
{
b p[N];
hoge_input(p, N);
hoge_sort(p, N);
hoge_print(p, N);
return 0;
}
879 :
ヒロト :2001/05/11(金) 13:48
>>877 ありがとうございます。色々奮闘したいと思います。
880 :
デフォルトの名無しさん :2001/05/11(金) 15:43
つまらない質問で恐縮なのですがfopenでファイルを開けて テキストて書き込むのとバイナリで書き込むのとは差があるのでしょうか char a='A'; をテキスト形式で書き込むと.10進で バイナリで書き込むと16進で書き込まれると考えていいものなのでしょうか。
>>880 そもそも肝心なところを勘違いしていると思われ。
>>880 とりあえず
int main(void)
{
printf("%c %c %c \n", 'A', 0x41, 65);
printf("%d %d %d \n", 'A', 0x41, 65);
printf("%x %x %x \n", 'A', 0x41, 65);
}
これを実行してみて、結果を報告してみてくれ。
今学校でC言語を習っているんですが、 あんまりよくわかりません。 何かお勧めの参考書ありますか??
今学校でC言語を習っているんですが、 あんまりよくわかりません。 何かお勧めの参考書ありますか??
今学校でC言語を習っているんですが、 あんまりよくわかりません。 何かお勧めの参考書ありますか??
886 :
デフォルトの名無しさん :2001/05/11(金) 16:40
すべて同じ結果がでますね。 C初心者なのでいまいちピントきません。 バイナリファイルて16進ですか?
>886 プログラマ板にもマルチポストしてやがるな。 C言語以前の問題なので、自分でいろいろお調べなさい。
888 :
デフォルトの名無しさん :2001/05/11(金) 16:51
>>886 あなたの持っている本やドキュメントの "fopen" の説明には、
なんて書いてありますか?
いぢわるしないで教えてやれよ(w
>>866 まず、10進で書き込まれるとか、16進で書き込まれる、という考え方が
間違っています。
'A'を書き込んだのなら、十進表記で65がファイルに書き込まれます。
これを16進で表示すると0x41となり、キャラクタで表示させると'A'と
なるのです。
テキストモードとバイナリモードの大きな違いは、改行コードをどう扱うか、
に差があります。
しかし、このことを知る前に、上記'A' = 0x41 = 65という考え方が
わかるようになりましょう。
890 :
デフォルトの名無しさん :2001/05/11(金) 17:51
889ありがとうございます。というと、ファイルは65で 書き込まれてあとは表示の違いと考えて良いのですよね。
>>890 >ファイルは65で書き込まれて
この考え方がまちがいです。
892 :
デフォルトの名無しさん :2001/05/11(金) 18:11
2進の65すなわち00000110(6)00000101(5) ですよね。
893 :
デフォルトの名無しさん :2001/05/11(金) 18:35
>>891 -892
どうでもいいじゃん、そんなこと。
>>891 違うと言うんなら、説明してやれよ。
ヤレヤレ
896 :
デフォルトの名無しさん :2001/05/11(金) 18:39
本当はどうなんですか?
>>896 だから、65、0x41、'A'で書かれる。
どの辺までハードよりに考えるかは、その人の自由だが、
初心者にはこれでOKだろう。
つーか、俺も詳しくはしらんが(w
898 :
通りすがり :2001/05/11(金) 23:19
>>896 -897
プログラマ板の方に書いておいたから、それを見るように。
899 :
デフォルトの名無しさん :2001/05/11(金) 23:25
>>896 例え話なんだが、
○○○○○○○○○○○○○
「この丸は幾つある?」って答えは
「10進数の13」
「16進数のD」
「2進数1101」
のどれもが正しい。
ファイルに書き込まれてる情報も同じ。
"13"を書き込むんじゃなくて○○○○○○○○○○○○○が書き込まれてると思ってくれ。
13、D、2と表現が変わっても、結局同じ量を指している。
'A'=65=0x41 これを細かく説明すると ASCII文字の'A'はASCII CODE '65' 番で65の16進表記は''0x41' ってこと。 ファイル上のデータはビット列だけど、便宜上1byte( =8bit)を最小 単位として扱う。だから、 0x41 = 0010 0001 と書きこまれている。 >65すなわち00000110(6)00000101(5) これだと 0x06 0x05 の2bytesデータを表現したことになる。 16進数の一桁は4bitである事に留意せよ!
1、1、一、T、@ どれも1 2、2、二、U、A どれも2 65, 'A', 0x41 どれも65 65, 'A', 0x41 どれも'A' ※機種依存スマン ところで、新スレは先頭にC FAQへのリンクきぼん
902 :
デフォルトの名無しさん :2001/05/12(土) 12:46
900>> Thanks.
904 :
デフォルトの名無しさん :2001/05/12(土) 18:28
コンビニで弁当買ってきてくれ。>903
age
age
911 :
どりす :2001/05/13(日) 05:01
void mona(int &a); の&aみたいな、参照演算子って C++ですか?
912 :
どりす 911 :2001/05/13(日) 05:03
↑これは、普通に使ってもよろしいのでしょうか? goto みたいな、禁じ手(最終手段)みたいなものなのでしょうか? また、アセンブラレベルだと push popやってるのでしょうか?
913 :
通りすがり :2001/05/13(日) 08:02
>>911 -912
int mona(int &a)の&はaが参照型であることを示しますが、演算子では
ありません。
参照渡しは禁じ手ではありませんが、最近はconst参照以外を嫌う傾向も
あるようです。それと、gotoは何も禁じ手ではありません。
機械語レベルの話ですが、これはどんなプロセッサを使っているかや、
どういう局面で使っているかに依存します。
例えばインライン関数の場合にはスタック操作が全くない場合も考えられ
ますし、多くのプロセッサは最初にいくつかの引数をレジスタで渡すので、
やはりスタック操作は発生しません(mona関数の中で他の関数を呼び出し
たり、複雑な処理を行う場合には、mona関数の内部でスタックに詰まれる
と思います)。
914 :
通りすがり :2001/05/13(日) 08:03
肝心なことを書き忘れていました。 &による参照型を使えるのはC++です。
915 :
通りすがり :2001/05/13(日) 08:19
>>912 もしかして、push popって値をスタックに積むと思っていませんか?
スタック渡しであれ、レジスタ渡しであれ、実際に引数として渡すのは
アドレスです。念のため。
C++だと 参照は int& mona(int) なかんじで使うことはおおい
917 :
どりす :2001/05/13(日) 09:33
>>913 -915
やっぱりC++でしたか。
Cの本しか持ってないので、分かりませんでした。
&aは、眠い時にこびとさんがかってにやってて、さっき気づいたです。
インラインアセンブラ(x86)紹介していたHP(どこかわすれた)では
関数の引数の渡し方に何通りかあって
fast型だっけ、それが、レジスタで
他の方法が スタックとか(push popするタイミングが違う)聞いたです。
>実際に引数として渡すのはアドレスです。
おわ、知らんかった。
ということは、関数呼び出し側で使用されていた変数アドレスが
わたされて、そのアドレスの中の数値を使うのが
mona(int a) とか mona(int *a)で、
そのまま アドレス使うのがmona(int &a)?
そんなかんじですか?
なんか混乱してきた。
アセンブラの出力でも見れ>917
919 :
どりす :2001/05/13(日) 09:38
あっ >gotoは何も禁じ手ではありません わかっておりますが、嫌われてる傾向にあるので "禁じ手(最終手段)"って書きました。 たくさんのループから抜け出すにはこれが速いし。
920 :
どりす :2001/05/13(日) 09:41
>>918 みてみます。それが一番早かった。すんまそん。
921 :
通りすがり :2001/05/13(日) 09:45
>>917 >関数の引数の渡し方に何通りかあって
>fast型だっけ、それが、レジスタで
__fastcallのことですか?Windowsの処理系ではそういうのが多いですね。
他のプラットフォームの処理系では、何も指定しなくてもレジスタ渡しに
なるものが結構あります。
参照渡しは(実現方法は何でもいいのですが)実際にはポインタ渡しと同様の
方法で実現されています。インライン関数の場合は敢えてアドレスを渡して
操作する必要がないので、マクロのような展開が行われると思います。
LEAやってた。返事すぐきて、うれしかったけど、 ちょっと出かけなければならいのでまた今度。ありがたう。
923 :
デフォルトの名無しさん :2001/05/14(月) 06:27
f(x)=x-exp1/x でf(x)=0となるようなxをみつけるプログラムをつくりたいのですが 誰かお願いします。なんか2分法を使うらしいのですが。
924 :
デフォルトの名無しさん :2001/05/14(月) 07:43
>>923 randdouble()をdoubleの乱数を返す関数として、
double solve_f() {
double x, y;
do {
x = randdouble();
if (x == 0.0) continue;
y = x - exp(1.0 / x);
} while (y != 0.0);
return x;
}
925 :
825 :2001/05/14(月) 13:21
>>850 さん
j[i]=i;
って事は、
printf(" %d %d\n",i,a[i]);}と
printf(" %d %d\n",j[i],a[j[i]]);
は、同じ意味になるのではないでしょうか?
うまくいきません。
926 :
デフォルトの名無しさん :2001/05/14(月) 14:38
「C言語お勉強コンパイラ」みたいなやつで勉強してるんですけど、 #include以外の関数使おうとすると、 「定義されていません」ってなります。なんでですか?
>>926 >「C言語お勉強コンパイラ」みたいなやつ
と言われても解らないので、正確な名前を書くこと。
なお、#includeは関数ではありません。
928 :
↑ :2001/05/14(月) 14:45
ごめんなさい。#includeで呼び出せる関数以外を・・・ これでいいですか?
929 :
↑ :2001/05/14(月) 14:46
ごめんなさい。#includeで呼び出せる関数以外を・・・ これでいいですか? ちなみにCマシン ってやつです。
930 :
デフォルトの名無しさん :2001/05/14(月) 15:06
>>929 #includeは関数呼び出しのための(プリプロセッサ)命令ではない
っつーお決まりの煽りは置いといて、
最新のCの規格だと確かプロトタイプ宣言が必須なんじゃなかったっけ?
たいていの処理系だと互換性とか利便性とかのために標準関数くらいなら
無くても通ってしまうけど。
本来なら標準関数もプロトタイプ宣言を記述したヘッダファイルをインクルードすべき。
931 :
デフォルトの名無しさん :2001/05/14(月) 15:08
int型配列Aの内容をint型配列Bに逆さまに格納するプログラム を作成して下さい。 ただし、 ・ポインタpaを定義し配列Aの先頭アドレスを格納する。 ・ポインタpbを定義し配列Bの先頭アドレスを格納する。 ・2重ポインタdpaを定義し、ポインタpaのアドレスを格納する。 ・2重ポインタdpbを定義し、ポインタpbのアドレスを格納する。 ・配列の内容は添字を使って参照しない。 ・配列Bに値を格納する際に、dpa、dpbの少なくともどちらかを 利用すること。
932 :
デフォルトの名無しさん :2001/05/14(月) 15:34
動作しません。どこが違ってますか?指摘してください。お願いします。 #include <stdio.h> main() { HANDLE hText; char *pText; OpenClipboard(NULL); hText = GetClipboardData(CF_TEXT); if(hText == NULL) { printf("クリップボードにテキストデータはない。\n"); } else { pText = GlobalLock(hText); printf("%s\n", pText); GlobalUnlock(hText); } CloseClipboard(); }
>>931 #include <stdio.h>
#define N (5)
int main(int argc, char* argv[])
{
int a[N], b[N], *pa = a, *pb = b, **dpa = &pa, **dpb = &pb, i = 0;
/* set */
for(i = 0; i < N; i++) *(pa + i) = i;
/* reverse */
for(i = 0; i < N; i++) *((*dpb) + (N - i - 1)) = *((*dpa) + i);
/* print */
for(i = 0; i < N; i++) printf("a[%d] = %d, b[%d] = %d\n", i, *(pa + i), i, *(pb + i));
return 0;
}
>>932 #include <stdio.h>
#include <windows.h>
int main(int argc, char* argv[])
{
HANDLE hText;
char *pText;
OpenClipboard(NULL);
hText = GetClipboardData(CF_TEXT);
if(hText == NULL)
{
printf("クリップボードにテキストデータはない。\n");
}
else
{
pText = (char*)GlobalLock(hText);
printf("%s\n", pText);
GlobalUnlock(hText);
}
CloseClipboard();
return 0;
}
935 :
デフォルトの名無しさん :2001/05/14(月) 16:46
Cのrandはいつも同じ値を返しますよね。 同じ値を返さないようにするにはtime使う以外に何がありますか? 以上。教えて厨房でした。
936 :
名無しさん@Emacs :2001/05/14(月) 18:04
#include <stdio.h> main() { int a=5; int b = (a++) * (--a); printf( "%d\n", b); } コンパイラによって数値が違うのですが、 どうすればいいのでしょうか。 目をつぶるべきでしょうか。
>>936 どんな動作を期待してるの?
int b = (a-1) * (a-1);
じゃだめ?
>>936 というか結果が16にならないコンパイラなんてあるか?
>>936 その計算結果は未定義だからです。
副作用完了点までに同一のオブジェクトを複数回更新すると、結果は未定義です。
b = 5 * 6と計算させないならば
int a = 5;
int work, b;
work = a++;
b = a * work;
とでも書き直してください。
s/計算させないならば/計算させたいならば/
>>937 お返事ありがとうございます。20になるコンパイラ、
ちょっと書き換えるだけで30や25になるコンパイラなど、
いろいろありました。
一つの式に(インクリ||デクリ)メント演算子を共存させるな
ということでしょうか。
調べてみたところ、「コンパイラ依存だゴルァ」ということ
でした。
942 :
デフォルトの名無しさん :2001/05/14(月) 23:25
>>935 >同じ値を返さないようにするにはtime使う以外に何がありますか?
・いつもフリーランで動いているハードウェアが載っていれば、
そのポートを読む。(timeもこれの一種)
・ユーザの入力待ちのあるプログラムならば、Runした後初めて
入力があるまでの、待ちループの回数を利用する。
・FDDがある環境なら、スピンドルを回してみて、
index信号が入力されるまでの時間をカウントする。
・本当にハードウェアで乱数を発生させるデバイスを載せる。
(抵抗の熱雑音や同位元素の分裂などを発生源とする。)
などなど。
943 :
デフォルトの名無しさん :2001/05/14(月) 23:40
>>933 >#define N (5)
さすがにその括弧は不要だと思うが。
重箱の隅でごめんね。
944 :
新米ジェダイの騎士 :2001/05/15(火) 01:16
コンパイルしたところエラーになりました。 どこが間違っているのでしょう? #include<stdio.h> main() { int days[12] = { 31,28,31,30,31,30, 31,31,30,31,30,31 } ; int i ; for(i=1; i<=12; i++) { printf("%d月は、%d日まであります。\n" , i , days[i-1]) ; } }
>944 全角スペースが2つ入ってるから。 全角スペースを表示してくれるエディタを使おう。
946 :
デフォルトの名無しさん :2001/05/15(火) 01:45
>>942 HDDでも、ファイルを読んでみて、読むのにかかった時間をseedに
使うと、けっこうランダムです。そのときのHDDのヘッドの位置、
ディスクの角度などが、とても不確定だからね。
947 :
デフォルトの名無しさん :2001/05/15(火) 08:34
>>942 >>946 参考になりました。
問題は、漏れがそれを利用したプログラムが書けるかどうかだ。(藁
>>944 コンパイルエラーしたときの表示も書いた方が何処が悪いか分かりやすいと思うが。
srand((unsigned int)time(NULL));
time以外の時もこのような使い方なのだろうか?
950 :
デフォルトの名無しさん :2001/05/15(火) 20:31
while( *p++ != 0 || 式1 ) 式2; 文法書を見ると、後置のインクリメントは 式全体を評価してから行なうと書いてありました。 その式全体とはどれの事ですか?
951 :
デフォルトの名無しさん :2001/05/15(火) 20:39
*p++ != 0
952 :
950 :2001/05/15(火) 20:51
有り難う御座います。
953 :
デフォルトの名無しさん :2001/05/15(火) 21:04
| ̄| ̄| ̄| | ̄| ̄| ̄| ̄| ̄| Cで; |3|8|4| |4|23|17|11|10| | ̄| ̄| ̄| → | ̄| ̄| ̄| ̄| ̄| ・・・・の様な配列のソースはどの様に |5|@|9| |6|5|24|18|12| 書けばいいのでしょうか? | ̄| ̄| ̄| | ̄| ̄| ̄| ̄| ̄| |7|6|2| |13|7|@|25|19| 条件:@は必ず真ん中に来る。  ̄  ̄  ̄ | ̄| ̄| ̄| ̄| ̄| 枠(Y,X)は、奇数。 |20|14|8|2|21| 最大の枠数_29枠まで | ̄| ̄| ̄| ̄| ̄| (scanfで,枠数の指定が、 |22|16|15|9|3| できる様にする。)  ̄  ̄  ̄  ̄  ̄ 確か、このパズル問題は、以前何かの雑誌に載っていたと思います。 自分には、解けなかったのでお願いします。
954 :
デフォルトの名無しさん :2001/05/15(火) 21:05
| ̄| ̄| ̄| | ̄| ̄| ̄| ̄| ̄| Cで; |3|8|4| |4|23|17|11|10| | ̄| ̄| ̄| → | ̄| ̄| ̄| ̄| ̄| ・・・・の様な配列のソースはどの様に |5|@|9| |6|5|24|18|12| 書けばいいのでしょうか? | ̄| ̄| ̄| | ̄| ̄| ̄| ̄| ̄| |7|6|2| |13|7|@|25|19| 条件:@は必ず真ん中に来る。  ̄  ̄  ̄ | ̄| ̄| ̄| ̄| ̄| 枠(Y,X)は、奇数。 |20|14|8|2|21| 最大の枠数_29枠まで | ̄| ̄| ̄| ̄| ̄| (scanfで,枠数の指定が、 |22|16|15|9|3| できる様にする。)  ̄  ̄  ̄  ̄  ̄ 確か、このパズル問題は、以前何かの雑誌に載っていたと思います。 自分には、解けなかったのでお願いします。
>>954 #include<stdio.h>
int main(void){
int p[29][29];
int i,j,n,m,x,y;
printf("? 1〜29の奇数 ");
n = 0;
scanf("%d",&n);
if(n%2==0||n < 0||29 < n){
printf("不正な値\n");
return 0;
}
m = n * n;
for(i=0;i<m;i++){
p[i/n][i%n] = -1;
}
for(i=0;i<m;i++){
if(i==0){
x = n / 2;
y = n / 2;
}
else{
if(p[(x + 1) % n][(y + 1) % n]==-1){
x = (x + 1) % n;
y = (y + 1) % n;
}
else{
x = (x+n-1) % n;
y = y;
}
}
p[x][y] = i;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%4d",p[j][i]+1);
}
printf("\n\n");
}
return 0;
}
958 :
デフォルトの名無しさん :2001/05/15(火) 23:31
>956 参考になる情報アリガトウ >957 ソースを書き込んでくれて感謝
こっちのスレはsage進行でおねがいします。
>>958 & ALL
960 :
デフォルトの名無しさん :2001/05/31(木) 00:28
>>88 VC++環境で使えるTrue Time 使ったらどぉ。
numegaだっけ?
>>960 5ヶ月と14日前の書きこみにレスするなんて、親切ですね。
963 :
デフォルトの名無しさん :2001/05/31(木) 20:09
64ビットと128ビットの CRCを作りたいんですが、独自でもかまいません。 規格が存在するか、参考になるURLなどはありませんか? 16ビットならその辺にありました。 #C言語です。
私の学校で出ている課題について教えてください。できれば、コード記述でお願いします。 課題 文字列操作 <処理概要> 入力ファイルに入っているランダムな文字列を読み込んで編集する。 入力ファイル名 \public\C言語応用\課題02\input.txt 入力ファイルの内容 io4@5ovgiq@w340 9tn@q0mikanb924 rwijra;o4 aestrawberryut@90 240strawberry9t animikanrja ddg fvbananaxjfringogqworiadf; amomolkjtcwieroutstrawberry34t7vv dsgfoiuto sdrgovq@4r q0awitflksjd;f laumikanwett errgt thhbcvbasf fitu@qo4rfachocolateaaarffvnxdkjfq23 sdfgi oq34itu aqeurgvksjd q9bananau4 tue ggsjdgoiumomoq349tifvk asrgmomoio uweringoorigporegf asdmomofg sjd;fmikanligurin@qa94it kwjegfr:bananaa ergtqaegr dfgi oeoitgu;fldkgj b9wu44tlgkjjlksvdjgfsmikanadfg oiupqoi34 ta;lkdf j;lakjdfg0987 bjlhbxcvblkj ;lkjchocolateroigeurrgssdmomoffkjahljhringoglar+ j;lkj4rti <詳細仕様> 入力ファイルの内容は、ランダムな小文字のアルファベット文字列からなり、 1行の文字数は揃っていない。これを1行ずつ読み取り、次の編集を加えて 1行を20文字に揃えて標準出力する。加える編集項目は、以下の通り。 1.文字列"ringo"を発見したら、"APPLE"に変換し、発見回数を数える。 2.文字列"mikan"を発見したら、"ORANGE"に変換し、発見回数を数える。 3.文字列"momo"を発見したら、"PEACH"に変換し、発見回数を数える。 4. 文字列"banana"を発見したら、後ろに"cake"を付ける。 5. 文字列"strawberry"を発見したら、後ろに"cake"を付ける。 6. 文字列"chocolate"を発見したら、後ろに"cake"を付ける。 7. 1〜6以外の文字列の場合は、"."(ピリオド)を出力する。 例えば、入力ファイルの1行目にq0mikanb924という文字列があるが、 この"mikan"の部分が"ORANGE"に変わる。他の文字はピリオドになる。 【結果の表示例】 ・・・・・・・・・・・・・APPLE・・ ・・・・・ORANGE・・・・・・・PE ACH・・・・・・bananacake・ ・・・・・ ringoの出現回数は、1回 mikanの出現回数は、1回 momoの出現回数は、 1回 bananaの出現回数は、1回 以上が課題の内容です。ご託宣お願い致します。
バッファ確保と、ポインタ制御だけじゃん。
>>965 あちこちに同じ書き込みすんな
宿題は自分でやれ
いやならそんな単位落としてしまえ
>>965 俺がその課題やってやろうか?
ただし、150万円戴くが…。
とか、ブラックジャック風に言ってみるテスト
…まじで150万くれるんだったら 頑張ってやっちまうな俺。
>>965 当方なら100万で引き受けますYO! 競合他者より50万もお得Death!(藁
>>965 学校でわざわざプログラムを教わっている奴ほど、
この程度の問題すら自力で解けない。
矛盾した世の中だよな。
>>965 暇だったから只でくれてやるよ。可哀想だしな(藁
---- t.dat ----
# [0] fromstr [1] tostr [2] appear count
$map_text = [
["ringo" , "APPLE" ,0],
["mikan" , "ORANGE",0],
["momo" , "PEACH" ,0],
["banana", "bananacake",0],
["strawberry" , "strawberrycake",0]
["chocolate" , "chocolatecake" ,0]
]
def hittest( str , index )
$map_text.each { | i |
next if str[index, i[0].length] != i[0]
i[2] += 1
return [true, i[1], i[0].length]
}
return [false]
end
out = "";
while (ARGF.gets)
chop!
i=0
while( i < $_.length )
ret = hittest($_, i)
if ret[0]
then
out += ret[1]
i += ret[2]
else
i+=1;
out += '.'
end
end
end
i=0
while( i < out.length )
print out[i, 20],"\n"
i += 20
end
$map_text.each{ |i|
print i[0],":",i[2],"\n"
}
--- main.c ---
#include <stdlib.h>
int main()
{
system("ruby t.dat input.txt");
return 0;
}
system関数が不満なら、#include "ruby.h"でevalれよ(藁
>>973 さんありがとうございます。ただ、$とかend等が私には初めて
見るものだし、理解できず、説明もできません。
誠に申し訳ないのですが、もう少し判りやすいソースでお教え願えないでしょうか?
1000ゲット。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。