1 :
ジョブス3.1世 :
2001/06/12(火) 23:49
2 :
ジョブス3.1世 :2001/06/12(火) 23:51
さあ、どうぞ
お疲れ様>1
次はジョブス3.14世になるのだろうか・・・
んで、どうなの?偶数に丸め込むのが正しいの? 信号処理でも0近傍は0に丸め込んだほうが量子化ノイズが抑え られるので正しいような気がするが…
>>6 正しい正しくないは無い。
自分の作成するプログラムにとって必要と思えば採用すればいい。
組み込み系で、細かいデータの集積が必要とかいうなら入れればいいし、
一回一回のデータは単発で累積してどうこうってわけでもないなら入れなくてもいいし、
統計的に誤差を無くす手法なわけだから、そこらへんは設計者として判断しろ。
8 :
たっくん :2001/06/13(水) 00:18
質問します。 DIBのデータ構造はウインドウズでもリナック巣でもマックでも 同じ構造をしているのでしょうか?
>>8 意味が分からない。
何のデータ構造?ファイル?
>>1 のFAQってリンク切れてない?
ところで日本語FAQに載っている曜日を計算するサンプルの
アルゴリズムが理解できない。誰か解説キボンヌ。
dayofweek(y, m, d) /* 0 = Sunday */
int y, m, d; /* 1 <= m <= 12, y > 1752 or so */
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
12 :
デフォルトの名無しさん :2001/06/13(水) 01:11
>>11 ツェラーの公式を少し手抜きしたものでしょう
こういうの(y,m,d,wはint型で)
if(m<2){y--;m+=12;}
w = ( y+y/4-y/100+y/400+(13*m+8)/5+d ) % 7;
>>13 まちがえた!!m<2 じゃなくて m<3ね
if(m<3){y--;m+=12;}
w = ( y+y/4-y/100+y/400+(13*m+8)/5+d ) % 7;
15 :
デフォルトの名無しさん :2001/06/13(水) 04:03
三点からなる集合X={x,y,z}においていくつの位相を定めることができるか? この問題を解くプログラム誰か作ってください。
16 :
デフォルトの名無しさん :2001/06/13(水) 07:04
ファイルのサイズを調べるにはどうしたらいいでしょうか? fp = fopen( hogehoge, "rb"); fseek( fp, 0, SEEK_END); ftell( fp); 簡単に思いつくのはこれなんですが unix 以外では正しくないんだとか 古いのはみんな切り捨ててもいいんですけども stat か GetFileInformationByHandle ... めんどうくさいです
17 :
デフォルトの名無しさん :2001/06/13(水) 07:20
>>16 DOSでもWinでもその方法やってきた。
正しくないことはないだろ、原始的だけど
WinだったらAPI使えよ
19 :
デフォルトの名無しさん :2001/06/13(水) 10:39
C言語の現在の需要ってどのくらいあるのでしょうか? それと、C言語の仕事ってどんなものがあるのでしょうか?
20 :
初めての・・・ :2001/06/13(水) 10:57
スレ違いだったらすいません。 「C/C++できる人」というのは、 CとC++、両方できる人のことですか? 確かCとC++は別物だったハズ・・・ 将来のためにC始めようと思うのですが。 良かったら教えてください。
>>20 > 将来のためにC始めようと思うのですが。
とてもいいことです
まともな物が書けるようになるまでは
C++は触らないほうが無難です。
22 :
デフォルトの名無しさん :2001/06/13(水) 11:13
>>16 stat(2)のstat構造体にファイルサイズがそのままあるだろ
>>23 補足
> ftell()はバイナリーファイルを除いては正しくバイト数を返すとは限らない。
>>16 の例は
バイナリモードで開いているので正しいバイト数を返してくれる
すなわちファイルサイズを返してくれる。
と期待して良いと思う。
25 :
デフォルトの名無しさん :2001/06/13(水) 11:35
26 :
デフォルトの名無しさん :2001/06/13(水) 11:41
>>23 POSIX.1にはあるんで、現状WinNTやフツーのUnixなら問題無いんでは?
27 :
とし :2001/06/13(水) 12:01
memsetを高速化するにはどうしたら良いですか?
28 :
デフォルトの名無しさん :2001/06/13(水) 12:16
29 :
デフォルトの名無しさん :2001/06/13(水) 21:01
age とこう。にしても part 3 は速かったなぁ
30 :
デフォルトの名無しさん :2001/06/13(水) 21:02
memset memmove memcpy strcpy strcmp これを関数使わずにCで書ける人、やってみてください。
31 :
デフォルトの名無しさん :2001/06/13(水) 21:03
>>30 #pragma intrinsic( memset, memcpy, strcpy, strcmp)
ほら、4/5はできたぞ。あとはmemmoveだけだな(ワラ
33 :
デフォルトの名無しさん :2001/06/13(水) 21:19
>>20 CとC++の間にJavaを入れとくといいと思う
34 :
デフォルトの名無しさん :2001/06/13(水) 21:52
関数atoiを使わずに『数字→数値』変換するのに一番適しているのは、 for&ifかswitchかmemcmpのどれがいいと思いますか? >1 前回から一ヶ月も経っていないのに4かぁ〜。 がんばれ
37 :
デフォルトの名無しさん :2001/06/13(水) 22:30
int main() { int a = 10; int b = 12; cout << a << b << endl; return 0; } エラーがでるのですがどうしてでしょう? 本に書いてあるとうりに打ち込んだのですが。
38 :
デフォルトの名無しさん :2001/06/13(水) 22:32
再帰を用いたプログラムと再帰を用いないプログラムでは、 プログラムの読みやすさや、計算にかかる手間などは どう違うんでしょうか?
39 :
デフォルトの名無しさん :2001/06/13(水) 22:34
2つの n 次正方行列の積って、 /***** c[n][n] は予め0で初期化 *****/ for (i = 0; i < n; ++i) for (j = 0; j < n; ++j) c[i][j] += a[i][j] * b[i][j]; こんなんでいいの?? 無い頭をどう捻ってもこれで行列の積が求まるとは 思えないんだけど…
>>15 ていうかお前位相の定義わかってるか?
わかってないならその単位はあきらめろ。
位相がわかってないやつに数学科を卒業させてやるわけにはいかない。
わかってるならそれをちゃんと説明して、
プログラムでどう実装すればいいか聞いてみろ。
#純粋数学やってないひとに単に位相って言うと、波の位相だと
#思われるのがオチ。
41 :
15 :2001/06/13(水) 22:42
>>40 おまえに卒業させてもらうわけじゃないぞ
こたえる気ないのならだーってろ!!
>>37 #include <iostream.h>
43 :
デフォルトの名無しさん :2001/06/13(水) 22:42
>>39 b[i][j]をb[j][i]と間違ってるか
bがあらかじめ転置行列にしてあるのかどっちかじゃない?
44 :
37 :2001/06/13(水) 22:46
>>42 それは入れてます。でもエラーがでるんですが...
>>44 とりあえず、どんなエラーが出たか、書けや。
>>41 残念ながらここはCのスレッドであって数学の専門家はあまりいないんだな。
その一言はきっと数学知識のある貴重なプログラマの反感を買ったのだな。
48 :
デフォルトの名無しさん :2001/06/13(水) 23:23
>>11 fj.comp.lang.c で訊けば、坂本氏本人が教えてくれるかもね。
ライブラリのqsort,bsearchとかってvoid型ポインタから どうやってポインタが指す内容を操作してるの? voidのままではポインタ操作できないのでキャストしなければ いけないと思うけど、キャストする型が判別できないし・・・
50 :
へたれ :2001/06/13(水) 23:37
>>37 >>44 本の通りに打ち込んだということから言語に触れて間もないと思う。
インクルードファイルのフォルダ指定が間違ってるとか・・・。
使ってるソフトとかは何かな?VC++とか使ってるならそれは無いと思うけど。
で、endl って何?C++はほとんど知らんし・・・。
一応うつしてやってみたけど問題なく終了。実は;が:になってるとか・・・。
何はともあれエラーがわからなければ、何がおかしいかわかんないよ。
>>38 連結リスト(であってると思う)を使う時は
再帰使ったほうが解放させるときの処理が簡単に書けるから再帰使ってる。
俺の意見は参考にならんと思うけど一応。
51 :
sage :2001/06/13(水) 23:41
>>49 三番目の引数と四番目の引数が
なにを意味するか考えてみるべし < qsort
>>37 Cには、そんな命令(関数)はありません。
もし、あなたの環境がCなら出来なくて当然ですし、
C++なら、スレ違いなので、そっちに行って聞いて下さい。
>>39 += なの? ただの = でいいんじゃない。
54 :
16 :2001/06/14(木) 02:49
>>17 ,18,22,23
レスありがとうございます。statつかえばいいのですけど system-depend な
定義に少し食傷気味といいますか、、なんとか C 標準で書けないものかと
お知恵拝借いたしました次第です。
C の規格自体がもう古いので何かしようとするとキツイ制限にはまって
しまいますが、かといって広い環境でサポートされて高速に動くのは C
くらいしかないかなとジレンマに陥ります。
>>24 バイナリストリームなら期待したように動作するのでしょうか?
それなら解決です。でも何やら気になる一文があるのですが...
これってバイナリやステート依存なストリームには SEEK_END は undefined
behavior なのでしょうか...? (英文は苦手です・涙)
>>26 やはり POSIX を標準として書くべきでしょうか..
スレッドもマップトファイルも C 標準ではもはや無理ですし..
規格書の気になる一文(ISO-C99N896 302p)
>211Setting the file position indicator to end-of-file, as
> with fseek(file, 0, SEEK_END), has undefined behavior for
> a binary stream (because of possible trailing null
> characters) or for any stream with state-dependent
> encoding that does not assuredly end in the initial shift
> state.
>>54 一般のストリームと言うことになるとSEEK_ENDは未定義かもしれんが、
まぁファイルなら大丈夫だろう、と言ってみるけどよく知らん。
56 :
デフォルトの名無しさん :2001/06/14(木) 11:10
ファイルに書かれた数字を行ごとに2次元配列に読み込むには どうすればいいのでしょう? ファイルは 12,45,30,11,0,..... 2,6,4,100,55... 3,41,67.... こんな形で、カンマがあってうまくいきません。 たすけて。
>>56 > ファイルに書かれた数字を行ごとに2次元配列に読み込むには
> どうすればいいのでしょう?
次元数が決まっているなら
fscanf(fp, "%d,%d,%d\n", ary[n][0], ary[n][1], ary[n][2]);
決まっていないなら
fgets, strtok, atoiなどを駆使して自分で書け
>>56 どんな風に格納するかわからんが
fscanf(fp,"%d,%d,・・・",&a[0][0],&a[0][1]・・・);
が一番簡単
59 :
デフォルトの名無しさん :2001/06/14(木) 11:32
>57,>58 解決しそうです ありがとうございます
60 :
57 :2001/06/14(木) 11:41
>>57 しくじった。初歩的なミスだ(;_;)
> ary[n][0]
&ary[n][0]
鬱だ、今日は調子が悪い
61 :
デフォルトの名無しさん :2001/06/14(木) 14:16
そんな簡単なカンマの読み方が!!!! Cを5年やってて気付かなかったYO・・・ 死なないとダメかな? でも今死ぬと3億のプロジェクトが・・・・うみゅー
62 :
荒らし :2001/06/14(木) 14:45
荒らすぞ
63 :
荒らし :2001/06/14(木) 14:45
ああ
64 :
荒らし :2001/06/14(木) 14:45
ああ
65 :
荒らし :2001/06/14(木) 14:45
ああ
66 :
荒らし :2001/06/14(木) 14:45
ああ
67 :
荒らし :2001/06/14(木) 14:45
ああ
68 :
荒らし :2001/06/14(木) 14:45
ああ
69 :
荒らし :2001/06/14(木) 14:45
ああ
プログラムなんかつくてるやつ しねや
プログラムなんかつくてるやつ しねや
プログラムなんかつくてるやつ しねや
プログラムなんかつくてるやつ しねや
プログラムなんかつくてるやつ しねや
課題丸投げ厨が逆ギレか。わかりやすいぞ
>>62 -74=15
76 :
15 :2001/06/14(木) 15:46
うるせーぞ わりーかよー やめてほしかったら問題とけよー
おもしろいからもっとヤレ
80 :
15 :2001/06/14(木) 16:14
>>79 うっせーなー
おめーなんかにきーてねーよ
>>85 うっせーなー
おめーなんかにようはねーよー
もーくんなよー
たんいおとしてくびになっちまえよー
C++について聞いたら怒る?
85 :
デフォルトの名無しさん :2001/06/14(木) 21:15
86 :
15 :2001/06/14(木) 23:47
このスレのやつは自分のわからないことにや答えられないときは 怒ってごまかすからむかつく。 自分もできないって素直に言えないのかなー
>>86 ごめんなさい
できないです
だから ここにこなくてもいいです
サヨウナラ
>>86 答えが返ってこない=わからない
としか考えられない想像力の欠如した人間はこの板には不要です。
さっさと回線切って首吊ってください。
>>86 1.簡単すぎて答えるまでもない
2.答えを書いてしまうとネタとして面白くない
3.課題を他人にやってもらうような奴に単位をやる必要はない
90 :
デフォルトの名無しさん :2001/06/15(金) 01:25
91 :
デフォルトの名無しさん :2001/06/15(金) 01:41
数値を文字定数/文字列に変換するのってどうやるんでしょうか? いや、ASCIIコードとかでなくて、7→'7'/"7"みたいな。 厨房な質問ですんまそん
man sprintf
>>91 int i = 7;
char c = '0' + i; /* あまり行儀はよくない */
char s[2];
sprintf(s, "%d", i);
どもっす!助かりました〜
>>93 2つの方法っすよね?
両方覚えといて使ってみます〜
どもです
96 :
デフォルトの名無しさん :2001/06/15(金) 05:30
>>93 >char c = '0' + i; /* あまり行儀はよくない */
なぜこれが行儀良くないの?普通では?
>>96 文字コード体系に依存するから。
'0'の次が'1'であることは言語仕様としては保証できっこない。
char numbers[] = "0123456789abcdef..."; char c = numbers[i];
99 :
96 :2001/06/15(金) 06:35
>>97 ------------- X3010 5.2.1 文字集合 (一部抜粋)---------
10個の10進数字, 0 1 2 3 4 5 6 7 8 9 について
0の右側に並んでいる各文字の値は,一つ左側にある文字の値に
比べ1だけ大きくなければならない。
------------------------------------------------------
ってなことが規格で決まってるよ。つまり数字の値は連続している
と決め付けていい。
ただし、アルファベットは連続しているとは限らない。
たとえばEBCDICではアルファベットは切れている。でも
数字はやはり連続している。
K&Rの28pにも「幸いこれはどの文字セットにも当てはまる」
と書いてある。
>>91 ざっと見た所では、98が1番良いように見える。
これなら、10進数以外にも適用出来るし…。
ただ、一度でも、printf系を使用しているプログラムで、
それ程、高速性を求めないのなら、sprintfでも良いかと…。
101 :
96 :2001/06/15(金) 07:10
#define quote(n) #n でいいんじゃないの? 98のは10進数なら const char numbers[10] = "0123456789"; だな。
102 :
デフォルトの名無しさん :2001/06/15(金) 10:31
すぐ機種依存だからダメとか言うやついるけど、 相手が特別な環境を指定してない限り そこまでこだわらなくてもいいと思うんだが? 個人が趣味や勉強、仕事でちょこっとやる程度のもので 環境依存をごちゃごちゃ言うのはみっともないと思うのは俺だけか? ・・間違ってはいないとは思うが、そこまで言う必要はないと思うということでね
>>102 > 個人が趣味や勉強、仕事でちょこっとやる程度のもので
> 環境依存をごちゃごちゃ言うのはみっともないと思うのは俺だけか?
趣味や勉強が高じてプログラマとなった場合、
環境依存を考慮しないプログラマ、動けば良いと考えるプログラマは困る。
また、ある質問から議論が派生するのは有意義だとは思わないかい?
# 議論はスレッドを分離すべきだとかいう意見はともかく
104 :
デフォルトの名無しさん :2001/06/15(金) 10:53
意見ありがとうー 有意義だとは思うし、将来のためではあると思うけど、 なんか全体に「考えないやつはダメ人間」みたいな口調が 多い気がして・・・考えすぎか? 意見交換になっている部分は勉強になるし、俺知らなかった!と いうのもあるから嬉しいんだけど
105 :
デフォルトの名無しさん :2001/06/15(金) 11:10
【質問】 Linuxで標準入力バッファをクリア(破棄)する方法をご存知の方が いればアドバイスをお願いします。
char c; scanf("%*c", &c);
107 :
デフォルトの名無しさん :2001/06/15(金) 11:48
コード領域に読み込まれたコードを書き換える事はどうやっても出来ませんか?
109 :
デフォルトの名無しさん :2001/06/15(金) 13:32
>個人が趣味や勉強、仕事でちょこっとやる程度のもので >環境依存をごちゃごちゃ言うのはみっともないと思うのは俺だけか? 普段の生活でズボラなコードを書いているからこそ、こういう オープンな場で話したりするときくらいはしっかり高尚にやるべき、 って気がする。個人の趣味(MFCの好き嫌い)とかはともかく、規格に 書かれてることとかはさ。
110 :
20 :2001/06/15(金) 13:40
>>21 ,33
レスどうもです。
C→Java→C++の順が理想みたいですね、ありがとうございます。
ところで、賛否両論ありそうですが、ソフトは何を使った方がいいんでしょうか?
VC++買えばCとC++両方できるって聞いたんですが・・・
教えていただけるとありがたいです。
・・・Javaをやるなら、それも買わなきゃいけないんですねぇ・・・金が・・・
111 :
デフォルトの名無しさん :2001/06/15(金) 13:47
>>104 の主張もわかる。
オレが仕事で関わっている環境も、至れり尽くせりなので
ここで論じられている慎重で繊細なコードも参考程度に過ぎ
ない。でも、未知の世界を知る上で重宝しているし勉強になる。
また、2chでの投げやりでツッケンドンな発言は、方言のような
感覚で慣れてしまった。メールアドレスを原則的に公開する掲
示板ならもっと紳士的なところもある。
>>110 BCCかGCCならタダだよ。
CもC++もできる。
Javaもタダでできますよ。
113 :
20 :2001/06/15(金) 15:09
>>112 GCCってなんですか?
聞いたことがないのですが
114 :
デフォルトの名無しさん :2001/06/15(金) 15:13
C言語のお手本のようなソースってどこかにありませんか? こーゆー書き方こそ理想だって感じの
いや考えないやつはダメだろう、やっぱ。 少なくともプログラマとしては。
116 :
デフォルトの名無しさん :2001/06/15(金) 15:23
宗教論争開始の予感...
117 :
デフォルトの名無しさん :2001/06/15(金) 15:31
でもほんと言うと、ソースコードを大量に読みまくる中で 自然に (経験的に) 良いコードと悪いコードを見分けられる ようになるのが理想だったりしますか?
120 :
デフォルトの名無しさん :2001/06/15(金) 20:31
ProCもわかる? ワカルなら教えて!!
121 :
デフォルトの名無しさん :2001/06/15(金) 21:01
良いコードと悪いコードを見分けられるとそりゃ嬉しいかもしれんが、 本当に参考にしたい情報に選択肢が無いこともある。 MSのSDKのサンプルも、ものによって設計思想やら書き方やらが違うので、 調べたい件についてのサンプルが自分とは根本的に違うスタイルだったりして、 泣きそうになりつつもそれを解析する羽目になったり。
>113 GlobalComunicationClub >114 #include<stdio.h> int main() { printf("aho\n"); return 0; }
123 :
デフォルトの名無しさん :2001/06/16(土) 16:08
getchar()について質問します。 stdin ストリームからの 1 バイトの取得 とのことなんですが、 以下のプログラムではa,bの値を入力からとって、その和をcに入れ、 リターンを入力してからcを表示させ、リターンを入力させて終了させたいのですが、 getchar()がそのように動いてくれないのは何故ですか? それからこれを回避するにはどうすればよいでしょうか? main(){ int a,b,c; printf("Input a b "); scanf("%d %d",&a,&b); c = a + b; getchar(); printf("%d + %d = %d\n",a,b,c); getchar(); printf("end\n"); }
scanfしても\nはバッファ残っているので c=a+b の下に fflush(stdin); を入れましょう。
125 :
デフォルトの名無しさん :2001/06/16(土) 17:46
stdinとstdoutはどう違うのでしょうか 厨房な質問ですいません
>>125 スタンダードインプット?
スタンダードアウトプット?
みたいな?
て感じ?
stdinが標準入力で stdoutが標準出力です 何も指定していなければ、 stdinはキーボード、stdoutは画面をさす事が多いです。 組み込み系は……とかいう話はおいといて。
128 :
デフォルトの名無しさん :2001/06/16(土) 20:47
>>124 fflush()は出力ストリームに対して使うものであり,
入力ストリームには使えません. 規格では, 入力ストリームに
対するfflush()の動作は未定義になっています.
(完全征覇79ページ)
…ってことらしい。
>>128 入力ストリームに対しては,その効果は不定である。
プログラミング言語C 第2版 より
131 :
sage :2001/06/16(土) 23:41
>>123 scanf("%d %d",&a,&b);
じゃなく
scanf("%d %d ",&a,&b);
にしとこうね
132 :
名無し :2001/06/16(土) 23:46
>>123 1回目のgetcharはこれで代替できるでしょ?
scanf("%d %d\n",&a,&b);
2回目のは・・・
カッコ悪いけど 2回getcharしておいたら? ちなみに、VC++だとfflushはstdin でもOKのはず。ヘルプ見たけどちゃんと 定義されてた。 BCCでも試したけどこれもOKだった。
134 :
デフォルトの名無しさん :2001/06/17(日) 01:23
前に出たのと同じ質問なんですけど、 入門書を読み終わった後に読むのに適した ソースコードってどっかにありませんかね? 入門書にのってるやつはちょっと短すぎる気が・・・
135 :
sage :2001/06/17(日) 01:30
>>134 良い心行きだね。
libcあたりのコードでも読んでみるといいかも。
精読は無理だし無駄だから、
自分の理解できそうなコードを探して読もう。
それぞれの関数の仕様は、infoなりmanなりMSDNなりに
載っているから、あとは、コードを読むだけだよ。
136 :
>39 :2001/06/17(日) 01:36
/***** c[n][n] は予め0で初期化 *****/ for (i = 0; i < n; ++i) for (j = 0; j < n; ++j) for (k =0; k < n; ++k) c[i][j] += a[i][k] * b[k][j]; じゃなかったっけ?
googleあたりで、 ゲーム ソース C とか ゲーム ソース トランプ とか 適当に検索するとソース付きのが結構あるよ。 カードゲームとか簡単なのを見つけて、 ちょっとずついじってみるのが楽しいと思う。 実際に動かせるってのは何より楽しいから。
138 :
134 :2001/06/17(日) 03:37
>>135 素早い解答ありがとうございます。
しかし、libcあたりのコードといわれてもよくわからんのですが・・・
googleで検索かけてみたんですけどイマイチです。
厨房ですみません。
>>137 どうも。確かにけっこうありますね。
こんなの見てるとテトリスでも作ってみたくなりました。
でも何を勉強すればいいんだろうか。
139 :
123 :2001/06/17(日) 09:05
で、結局どうすればいいんでしょう? fflush(stdin)がscanfの入力にかかわらずきちんと動いてくれるのですが…
140 :
デフォルトの名無しさん :2001/06/17(日) 14:19
#define N 5 を使わずに、入力して、5を入れるのは、どうすればよいのでしょう? int N;っているのかな?
141 :
sage :2001/06/17(日) 15:06
そうなると *BSD をインストールする方が早いかも
143 :
デフォルトの名無しさん :2001/06/17(日) 15:34
>>138 カーネルのソースを読んでみよう。
そんなに難しい、ものでもない
ソースの入手も簡単だし。
144 :
デフォルトの名無しさん :2001/06/17(日) 15:46
カーネル?
145 :
sage :2001/06/17(日) 15:49
>>143 マジレス。
kernel のソースを読むためには、計算機アーキテクチャに関する
知識と OS 一般の知識が必要。MMU ってなんですか、って人間に
は仮想記憶サブシステムは読めないし、例外発生時の CPU の動
作を知らないとプロセス管理サブシステムは読めない。
それに kernel は処理の流れが一様ではなくて、非同期にいろいろ
なイベントが発生するのが前提だから、慣れないと読むのは大変だ
と思う。
あと、最近の *BSD や Linux kernel のように規模が大きいプログラ
ムだと「実装」から「設計」を把握するのは辛いも。コードを読む前に、
適当な書籍やら論文やらで「設計」を知らないと、見通し悪くて挫折
するよ。
個人的には kernel 読むのが初めてって人間には *BSD, Linux の
kernel は勧めない。まずは計算機アーキテクチャを勉強して、次に
小規模な kernel (UNIX V6, MINIX, L4) を読むのがお勧め。
ちょっと気になったんだが
>>143 >>145 って、ホントに kernel のソース
コード読んだことあるの?
152 :
sage=144 :2001/06/17(日) 22:24
>>150 Linux, FreeBSD, WinCEのカーネルなら実際に読んだよ
得るものは余りなし。
キャラクタデバイスのとこなら大体読んだ。 あと、init起動するところとか。
ごめん、144じゃない、145だった。 カーネルコードを実際に読むより、 カーネルに関する解説書を読むほうがためになるよ
155 :
デフォルトの名無しさん :2001/06/17(日) 22:37
>おれは26才、4年間プログラムを一生懸命作ってきた。 >C言語しか知らないがC言語なら誰にも負けない... ってどんなシステムのどんなプログラム作ってきたわけ? デバイスドライバとかか?
156 :
デフォルトの名無しさん :2001/06/17(日) 22:43
>>155 4年間 って短いな・・・
長くやってりゃいいって訳でもないけど、期間だけで言ったら
オレは30歳で20年間プログラムを書き続けてるんだけど・・・
157 :
デフォルトの名無しさん :2001/06/17(日) 23:02
いいスレだ
>>155 過去スレのC言語なら俺に聞けをみればわかる
ジョブスが何者なのかも
なぜ3.1世なのかも
>>155 -156
デバドラもやったし、μITRONをフルスクラッチもした。
データベースも構築したぞ。
俺にとり4年は十分過ぎる年月だ。
お前らには負けない。
160 :
デフォルトの名無しさん :2001/06/17(日) 23:29
>>159 >μITRONをフルスクラッチ
すなおにすごいと思う。尊敬できるかもしれない。
うん、すごいすごい かないません
162 :
デフォルトの名無しさん :2001/06/17(日) 23:41
>>159 参考までに、μITRONの勉強をしたいんだけど
いいサイトがあったら教えてくれないか?
今度作らされそうなんだが、とっかかりが全然つかめない。
一を聞いて十知るつもりなんで一だけ教えてほしい。
>>162 なぜ作る?俺の時とは違い、今時μITRONが実装されていない
CPUを探す方が難しかろう。そんなに徹夜したいのか?
今あるか知らんが、パソコン用のNORTiがソースコードつきで
配布されているんでキーワードを頼りに検索しろ。
じゃ無ければ買え。
164 :
デフォルトの名無しさん :2001/06/18(月) 18:46
Win+C言語でグラフィックを学びたいです。どうすれば?
165 :
デフォルトの名無しさん :2001/06/18(月) 18:47
デスクトップに三角形を書くプログラムを教えてください。
油性ペンを買ってくる。 画面に向かう。 三角を書く。
>>164 書店に行って「プログラミング Windows 第五版」買ってきて読め。
>>166 ありがとうございます。苦労しましたが、何とかできました
次は、画面に描いた三角を消したいんですが、どうすればいいですか?
>>168 お好み焼きかなにかで使うヘラで削りましょう。
それでもだめなときは
シンナーに浸した布で拭くと落ちるそうです。
171 :
デフォルトの名無しさん :2001/06/19(火) 10:53
>>169 画面のスイッチを切るほうが早いと思われ
172 :
デフォルトの名無しさん :2001/06/19(火) 11:01
>>171 油性ペンで書いたものは、スイッチを切っても消えません(藁
173 :
デフォルトの名無しさん :2001/06/19(火) 11:23
揮発性ペンで書かれた不揮発な記録。
174 :
デフォルトの :2001/06/19(火) 12:27
DLLからメモリアーロック、フリーするソフト(C++、malloc)なんですが Win95/NT/2000では正常終了するのですが、98だけが異常終了します。 OSにもどる情報を書き換えてしまっているようなんですが。 なぜ98だけで起こるのでしょうか。 開発環境は、VS6(S3)です。
>>174 > DLLからメモリアーロック、フリーするソフト(C++、malloc)
ネタか?俺の知ってるmallocは
「DLL」からメモリを「アーロック」しないし、
「ソフト」でもないぞ。
mallocの機能をまともに言えん奴はmallocなぞ使うな。
176 :
>174 :2001/06/19(火) 13:35
177 :
デフォルトの名無しさん :2001/06/19(火) 14:06
>>175 偉そうなことは何かアドバイスしてから言っとけ
このバカ
>>177 > 偉そうなことは何かアドバイスしてから言っとけ
オマエモナー
# 目糞、鼻糞を煽る
179 :
デフォルトの名無しさん :2001/06/19(火) 14:33
>>1 自分の能力の高さを自慢したいだけの人に
聞くのって、聞いた方がバカをみるよね。
181 :
デフォルトの名無しさん :2001/06/19(火) 16:19
>>179 情報源なんてなんでもいいさ。
使えるものは犬でも使うさ。
182 :
デフォルトの名無しさん :2001/06/19(火) 16:24
>>179 C言語なら俺に聞けの初代スレをみればギャグだってわかるのに。
184 :
デフォルトの名無しさん :2001/06/20(水) 11:36
すいませんがお聞きします。 配列などを初期化するとき for(i = 0;i < 255;i++ ) counts[i] = 0; } ってやるのと memset(counts,0,sizeof(counts)); ってやるのとどちらがいいのですか?
>>184 どっちも何もmemsetしかないじゃん
forを固定回数でまわすなよ。わら
むかし、countがfloatとかdoubleとかだとmemset では問題かも〜 ってきいたことがあるよ。個人的には、 double counts[128] = {0}; とかかな。
187 :
:2001/06/20(水) 11:52
#if defined individual #pragma #if!defined #use unsigned using std::FILE; template <class charT,class traits> #undef Struct using NAMA std; class NAMA1 :public locale::facet class NAMA2 :public NAME1{ Static size_t rand_ =0; Static struct tm* tmb=0; #define NAME1 (NAME2) #define NAME (NAME | PARAMETER) int _RTLENTRY _EXPFUNC printf(const char * __format,...); typedef wchar_t #define FOPEN_MAX (_NFILE_) extern "C"{ 各々わかんない、.libファイルと.hファイルの関係と作り方トLCCLIB.EXEのありか
188 :
デフォルトの名無しさん :2001/06/20(水) 12:29
>>186 >double counts[128] = {0};
これだと、counts[0]以外は未定義状態だなあ
189 :
デフォルトの名無しさん :2001/06/20(水) 12:38
>>184 普通はmemsetの方が速い。
>>186 全ビット0が0.0にならない処理系の場合。
IEEE形式なら問題なし。
最初の要素は0.0が代入されると思われるが、
それ以降はmemset相当のコードになるはず。
>>189 普通は memset の方が早いが、たいていは初期化部分のコードよ
りも実際に配列を操作する部分のコードの方が実行時間に効いてく
る。初期化部分がボトルネックになっていることが明確でない限り、
わざわざ移植性を落としてまで初期化部分で時間稼がなくて良し。
ただし移植性がそもそもない場合、たとえば Win32 only の構造体
を初期化するような場合は、どっちでも良い。構造体の要素を個別
に初期化してると、定義が変わったときに初期化漏れが出る可能性
もあるしね。
191 :
デフォルトの名無しさん :2001/06/20(水) 13:19
>構造体の要素を個別 >に初期化してると、定義が変わったときに初期化漏れが出る可能性 >もあるしね。 わしこれでチョンボやった経験あり。
192 :
デフォルトの名無しさん :2001/06/20(水) 13:52
printf("input to count file name : ");fflush(stdin); fgets(filename,256,stdin); fp = fopen(filename,"rb"); if(fp == NULL) { printf("can't open file : %s",filename); exit(-1); } ちゃんと存在しているファイルなのに開いてくれません。 なぜでしょうか? }
filenameの宣言が見たい
>>192 > fgets(filename,256,stdin);
こんなふうにした場合、おしまいにリターンが付いてきそうな気がする。
fflush()については
>>128 -129参照
ってなんでfflush()?
196 :
デフォルトの名無しさん :2001/06/20(水) 14:14
C言語
197 :
デフォルトの名無しさん :2001/06/20(水) 14:18
TestDlg.obj : error LNK2001: unresolved external symbol "void __stdcall・・・" このエラーの意味って何?
>>192 ここを
> printf("can't open file : %s",filename);
printf("can't open file : [%s]",filename);
こう修正後に実行してみて、
can't open file : [filename
]
と表示されるようなら
>>194 が理由。
199 :
デフォルトの名無しさん :2001/06/20(水) 14:33
200 :
197 :2001/06/20(水) 14:38
201 :
197 :2001/06/20(水) 14:44
>>199 宿題じゃなく仕事なんだ。
先に進めなくて・・・納期が・・・。
202 :
197 :2001/06/20(水) 14:49
っていうかスレ違いだった。 VC++でのエラーだった。
204 :
197 :2001/06/20(水) 14:54
はーい
205 :
192 :2001/06/20(水) 14:59
みなさま、アリガトウございました。 ご指摘のとうりリターンがついてました。
俺だったら、納品するプログラムで > fgets(filename,256,stdin); こんな入力方法とる奴はクビにするね。
>>206 > こんな入力方法とる奴はクビにするね。
理由書けや。
どーせ256みたいな定数でなくsizeof(filename)とか
エラーチェックしろとか細かいツッコミだろ?
>>209 fool proofについて考慮されてないって事だよ。
あー。もう面倒だから、辞表提出してきた。 これでもおれ、チーフだったから、開発メンバー みんなめちゃくちゃ混乱してた。ワハハノハ。
213 :
192 :2001/06/20(水) 16:48
>俺だったら、納品するプログラムで >> fgets(filename,256,stdin); >こんな入力方法とる奴はクビにするね。 たびたびすいません。なにがいけないのでしょうか? 勉強中なのでおしえてもらえませんか
>>213 プログラム中に「定数」をばらまいてはいけない。
Cならマクロ、C++ならばconstを使うべし。
215 :
デフォルトの名無しさん :2001/06/20(水) 16:58
>>214 そうか?
時と場合によるんじゃないのか?一回しかでないもので
絶対変更のないものならいいんじゃないの?
この場合はどうかしれんが
>>211 ネタにしても寒いな。
マジだったら、そんな奴をチーフにしてる会社はさっさとつぶれてくれた方が社会のためだ。
217 :
デフォルトの名無しさん :2001/06/20(水) 19:18
--1-- 1本100円のボールペン 10本以上買うと、 A店 10%OFF B店 8本ごとに1本おまけ 購入数を入力して 単価の安いほうを出力 例 9 同じ 15 A店 30 B店 --2-- 価格を入力してポイントを出力する 100円以上の商品に対して 10円ごとに1ポイント 例 80 0 100 1 110 2 200 11 --3-- 駐車場の使用時間を入力して料金を出力 基本料金 500円 (1時間) 1時間超えると、10分につき100円課金 53 500 62 600 70 600 71 700 コーディングしてください。
>コーディングしてください。 あまりの大胆さにちょっとワロタ
>>217 > それに勘違いするな、俺は貴様の宿題を解いてやるほど暇じゃない。
220 :
217 :2001/06/20(水) 20:03
#include <stdio.h> void main(void) { int ne,kazu,a,b,g; printf("購入数="); scanf("%d",&kazu); ne=100; a=0; b=0; g=kazu*ne; if (kazu>=10) { a=g*0.1/kazu; b=g/(kazu+kazu/8); } if (a<b) { printf("A"); } else if (a>b) { printf("B"); } else { printf("同じ"); } }
(゜д゜)<宿題は別スレでやれ
222 :
217 :2001/06/20(水) 20:20
ここはプログラム作成ウィザードスレではないのですか?
>>220 バグリスト
・kazuが0の場合、多分プログラムが落ちる
・kasuが1〜9の場合、「同じ」と表示される。
・どんなkazuを入力しても「A」と表示される。
下記の計算部分がバグっている。
> g=kazu*ne;
> if (kazu>=10) {
> a=g*0.1/kazu;
> b=g/(kazu+kazu/8);
> }
224 :
整数定数 :2001/06/20(水) 20:32
>>214 整数定数なら enum を使えと,カーニハン先生はおっしゃってました.
enum { BUFSIZ=4096 };
225 :
217 :2001/06/20(水) 20:57
小数点が使えないのかなあ?
>>217 激しくスレ違い。麻衣ちゃんに頭下げて教えて貰え。
229 :
デフォルトの名無しさん :2001/06/20(水) 21:59
(゜д゜)<age
だがしかし、思わずチャレンジしたくなる宿題は許可したいぞ。
231 :
デフォルトの名無しさん :2001/06/20(水) 22:52
>>226 こんなの見ちゃっていいのかしら・・・
わあ! これなんて intのCですよ、先輩
いや、だからチャレンジするのはかまわないけど宿題スレでやれよって話。 やるなとは言ってない。
233 :
麻衣 :2001/06/20(水) 22:55
待ってるわよ
>>231 おお 懐かしい
随分マニアなシーン持ってくるね(笑)
235 :
224 :2001/06/21(木) 02:14
カーニハン先生って何?
>>235 をい。
今すぐgoogleへ逝ってこい。
ゴーグル
ガグル
ガーゴイル
ゴール
241 :
デフォルトの名無しさん :2001/06/22(金) 01:43
void のポインタの並びを動的に確保したいんですけど、 void ** が出てきて困るんです。 void **storage = calloc (capacity, sizeof (void *)); で、こうしようと思うんですが、 void *p, *q; /* p にどこかで値を入れる */ char **storage= calloc (capacity, sizeof (char *)); storage[n] = (char *) p; q = (void *) storage[n]; これは合法なんでしょうか?
242 :
デフォルトの名無しさん :2001/06/22(金) 01:51
go for
>>241 char**はよくてvoid**が困る理由が分からんが、
void*へ/からの代入はキャストも不要だろ。
244 :
デフォルトの名無しさん :2001/06/23(土) 02:03
> char**はよくてvoid**が困る理由が分からんが、 C FAQ 日本語訳を読んでいると、4.9 で void ** はダメっぽいふうに 書いてあるので困りました。いろんな型へのポインタの並びを 管理しようとして、const void * で引数をもらっています。 それならと、void ** 以外で処理することにしたんですが、 他の環境に持っていった時に、異なる型へのポインタでは サイズが変わるかも、と考えて書き込みました。 けれど考えてみたら、ポインタをキャストできるんだから、 どんな型へのポインタでもサイズは変わらないんですよね? ということで、 void *p, **storage = calloc (capacity, sizeof (void *)); storage[n] = 何らかの void *; p = storage[n]; を使ってもいいものかどうかについてお願いします。 ダメなら、char ** などを使ってみようと思います。 > void*へ/からの代入はキャストも不要だろ。 7.7 に書かれているようなコードで覚えたので、 void * もキャストするものと思っていました。 でも、読んですぐなものでまだ癖が抜けません。
>>244 規格上ポインタのサイズが同じであることは要求されてなかったと思うけど、
そういう処理系ではchar**でもやっぱりダメだろうからvoid**使っとけば。
> void *p, **storage = calloc (capacity, sizeof (void *));
> storage[n] = 何らかの void *;
> p = storage[n];
>
> を使ってもいいものかどうかについてお願いします。
いいもなにも、このコードは暗黙のキャストもまったくないじゃん。
「何らかの void *」とpが他の型へのポインタなら話は分かるけど、
やっぱり正しいコード。C++だとキャストが必要だけど。
>>245 C FAQ 4.9 の
> C 言語には汎用のポインターへのポインター型は存在しない。
を誤解していたようです。
void ** を使ってデータ操作すること自体が、ダメなんだと思ってしまいました。
void sample (void **arg);
int *p;
sample (&p); /* p をなんとかしてほしい */
のようなことがダメだと言っているんですよね?
私の場合は、既に void * でもらっているポインタの値を出し入れするだけなので、
関係なかったんですね。
それは void のサイズが分からないからだめなのでは? void array[10]; と同じ理屈。
248 :
C初心者 :2001/06/23(土) 10:30
初心者な質問で申し訳ないのですが……。 標準関数の読み方って、なにか決まりがありますか? strcpy ストリングコピー? エスティーアールコピー? ストルコンプ? strcmp ストリングコンプ? ストリングコンペア? 熟練プログラマの皆さん方、どう発音されてますか?
249 :
デフォルトの名無しさん :2001/06/23(土) 10:48
すとらこぴー。すとらこんぷ。 何て呼んでもいいと思うけど?変な読み方だとおもろいし(笑)
250 :
デフォルトの名無しさん :2001/06/23(土) 12:49
strcpy → スーピー strcmp → スープー strcat → スッチー
251 :
デフォルトの名無しさん :2001/06/23(土) 12:52
stdio → スタイオ stdlib → スタリブ string → スリン stderr → スァ
読み方と命名規則は一ヶ月に一度は話題になるな。 ローカルルールに追加しない?
253 :
デフォルトの名無しさん :2001/06/23(土) 16:29
人に言うときは stdio → スタンダードアイオー っていったほうがいいけど心の中ではなんでもいいと思う
心の中ではスタジオ でも、口に出すときはエスティーディーアイオー なんでもいいよ。もう。
255 :
デフォルトの名無しさん :2001/06/23(土) 18:47
そういや、たまに本当にスタジオって言ってるおっさんいるよなー
256 :
デフォルトの名無しさん :2001/06/23(土) 18:49
俺もスタジオヘッダに一票。 スタンダードアイオーなんて知ったかぶりっ子っぽくてイヤン。
257 :
デフォルトの名無しさん :2001/06/23(土) 18:54
どうせstudioと勘違いしてるなら、「すてゅーでぃおう」と言ってほしいね。 そういえば、マイクロソフトの製品で ビジュアル・スタディオ というのがあったな。変なの。
258 :
デフォルトの名無しさん :2001/06/23(土) 19:52
>>256 知ったかぶりじゃなくて、そのものなんだが・・・
余程昔辛い目にあったんだろうねえ
259 :
デフォルトの名無しさん :2001/06/23(土) 22:31
独学でやっている人にはスタンダードインプットアウトプットが 正式だと知らない人がまれにいる。でもプログラマーとしての 技術は十分あるのでバカにもできない。 だから好きによんでいいと思うよ。実力さえあれば。
260 :
マジレスさん :2001/06/23(土) 23:36
下のプログラムを、実行すると答えの桁数の所に、 整数どうしの足し算でも 小数点が付き、.0000となりますが、 .0000を消すにはどこに何を付け加えればいいですか? #include <stdio.h> int main(void) { float var1,var2,answer; int op,flg; printf("値1\n"); scanf("%f",&var1); printf("値2\n"); scanf("%f",&var2); printf("1、足し算 2、引き算 3、掛け算 4,割り算\n"); scanf("%d",&op); if(op == 1){ answer = var1 + var2; flg = 0; } else if(op == 2){ answer = var1 - var2; flg = 0; } else if(op == 3){ answer = var1 * var2; flg = 0; } else if(op == 4){ answer = var1 / var2; flg = 0; } else{ flg = -1; } if(flg == 0){ printf("答え %f",answer); } else{ printf("計算方法の指定が間違っています"); } return 0; }
モットprintfシラベロ
262 :
デフォルトの名無しさん :2001/06/23(土) 23:40
>>259 独学だとしてもstdioがstandard input/outputの略だと気付かない
奴はバカでしょ。他にstdlibとかstdargとか、stdがstandardと
気付くためのヒントはいくらでもあるし。
263 :
デフォルトの名無しさん :2001/06/23(土) 23:42
>>260 キミの頭にC言語に関する基礎知識を加えればいいですよ
264 :
マジレスさん :2001/06/24(日) 00:16
>>262 そうなんだけどどう呼んでてもプログラムができれば
かまわないというはなしで
267 :
デフォルトの名無しさん :2001/06/24(日) 00:36
char* ps = (char*)malloc(100); memset(ps, '\0', 100); ps = "50,50,50,50,50"; siri.SendHexNumber( ps ); free(ps); こういうやり方は、やっぱり違反なのでしょうか? 教えてください
>>267 oioi
>ps = "50,50,50,50,50";
>free(ps);
自分でなにしてるかわかってる?
270 :
デフォルトの名無しさん :2001/06/24(日) 00:54
intはなんて読めばいいの?
>>267 free(ps)のときにはpsはスタティックな領域を指しているので、
おそらくSEGVかなんかで落ちる環境も多い。
ps = "..."じゃなくてstrcpy(ps, "...")ってしたいんじゃないの。
272 :
デフォルトの名無しさん :2001/06/24(日) 00:57
>>267 strcpy
VBとかから入った人はこんなの書くね
273 :
デフォルトの名無しさん :2001/06/24(日) 00:59
>>270 1. イント
2. インテ
3. インテジャ
エラボウ
>>267 malloc&freeは、もう少しポインタの事を勉強して、
そのコードが何を意味するか、分かってから使った方が良いかと…。
275 :
デフォルトの名無しさん :2001/06/24(日) 01:34
(i)インター(n)ネット(t)テクノロジー
277 :
デフォルトの名無しさん :2001/06/24(日) 01:50
mallocの使い方まずいの? ps = "50,50,50,50,50"; が違法というか、一般的かどうかを聞きたかったんだけど
278 :
デフォルトの名無しさん :2001/06/24(日) 01:54
私が得をする情報をタダでください。 それによって私は大変な恩恵に預かりますが、あなたには何の メリットもありません。 でも、いいじゃないですか? どうせ情報なんてタダでしょ? とても困っているので、情報を知っている人は私を助けなければ いけません。これは義務です。 初心者にも分かるように説明してください。 私は、ごく普通の人間なので、パソコンのわけの分からない知識は ありません。勉強するつもりもありません。時間の無駄です。 検索するなんて面倒です。どうしてそんな面倒な事するの? 知ってる人に聞けばいいじゃん。どうせタダだし。 マルチとか質問スレというのはヲタクのルールです。 私は普通の人間なのでヲタクのルールなど知ったこっちゃありません。 早く教えてください! 早く教えろ! 早く! これだけ言ってもまだ教えねーのか?!
>>277 malloc/freeを使う意味が無い。
文字列コピーでもしたかったのか?
280 :
デフォルトの名無しさん :2001/06/24(日) 01:59
ソースから、抜き出したんで、あまり的確じゃなかったかも すまん
282 :
デフォルトの名無しさん :2001/06/24(日) 02:16
漏れは今、独学でCやってるんよ。 それで、先日「独習C」って本買ったんだけど この本の内容は何日(何ヶ月)くらいでマスターできるんかな? すでに、初級本の「C言語〜はじめてのCプログラミング〜」はマスター済みです。 現在は学校には行ってません。 あと、「独習C」マスターしたらC++に進んじゃって大丈夫やろか?
言語だけマスターしても意味がないんじゃ・・・ 一つの言葉を覚えたら徹底的に使うことが大事だと思うよ
>>277 mallocの使い方と
ps = "50,50,50,50,50";
は、それ程、問題無いが、その後の、
free(ps);
が問題がありすぎる。
その為、そのコードが合法か聞かれた場合は、
それしか目が行かない。
ちなみに、freeが無い場合、大抵の処理系では合法で、
(見た事はありませんが、(聞いた事ならある))
exit時にメモリを開放しない処理系では、違法。
>>282 野球のルールを知ってるだけじゃ、甲子園には行けないぞ。
286 :
282 :2001/06/24(日) 02:23
>>283 マスターってのは
その本の内容を理解したって意味で使いましたっす。
C++を勉強しようとしたら全く解らんのでCから始めたんやけど…
287 :
282 :2001/06/24(日) 02:29
>>285 とりあえず今は、勉強するしかないかな〜と思ってます。
まだ、独学で始めて1ヶ月なんですよ。
実践で使いこまなきゃ話にならんで〜
…ってことは勉強してると良くわかります。
だって、問題出されたり質問されたりしても全然答えられんもん。
288 :
デフォルトの名無しさん :2001/06/24(日) 02:29
>>284 あるクラスのメンバー関数の中の一部なんだけど
freeしちゃだめなの?
289 :
282 :2001/06/24(日) 02:31
ちなみに、趣味でゲーム作ろう思ったのが勉強始めたきっかけっす。
>>284 あんまり問題なくないぞ。
何の為にmallocしてんのかわからん。
291 :
デフォルトの名無しさん :2001/06/24(日) 02:53
>>290 mallocはもういいんで、他にいろんな処理してる関数の抜き出しなんで
適切じゃなかった、
で、なんでfreeしちゃだめなの?
>>291 あっはっは。
freeの引数にはmallocで確保した領域の先頭アドレス
(つまり、最初にmallocしたときのpsだな)を入れなきゃ。
いまのままじゃ"50.・・・"の文字列の先頭アドレスだから
狂っちゃうよ。
>>291 malloc(), realloc() を介して確保したメモリ以外は free() してはいけない。
そういう前提で free() は書いてあるので、文字列定数へのポインタを渡す
と、困った事態になる。
たいていはメモリアクセス保護違反で異常終了するが、環境によっては
その時にはエラーが出ずにメモリ上のデータを壊す(そして後で変数の
値がおかしくなっていることに気づく)かもしれないし、OS が暴走するか
もしれない。
相も変わらずアホな議論をしておるな
これは議論なのか??
>>293 がC言語のイロハを厨房に教えている教室かと思った。
296 :
デフォルトの名無しさん :2001/06/24(日) 09:14
298 :
デフォルトの名無しさん :2001/06/24(日) 09:53
>>293 >malloc(), realloc() を介して確保したメモリ以外は free() してはいけない。
では、callocで確保したメモリはどうやって解放するの?
299 :
デフォルトの名無しさん :2001/06/24(日) 10:08
初歩的な質問ですみません。 ゲームを高速化するために、VC++6.0Pro で、MMX命令を使った プログラムを書きたいのですが、インラインアセンブラ 以外の方法で画像のスプライト処理などをする ライブラリなどはありませんでしょうか。 どなたか教えてください。
300 :
デフォルトの名無しさん :2001/06/24(日) 10:17
301 :
デフォルトの名無しさん :2001/06/24(日) 10:39
>>267 の話題で
>>292 >>293 は親切すぎてダメダメ。そんなの267以外は分かってるちゅうねん。
コンパイルでエラーが出ないからっていって、やっていいことと悪いことがある。
それまでのヒントで、自力で調べるくらいじゃないとな。
>>298 callocは中でmallocを出してるって、MSDNにも書いてあるだろ。
それくらいも見ないのか?
303 :
デフォルトの名無しさん :2001/06/24(日) 12:42
ソープってなんですか? 気持ちいいんですか?
304 :
デフォルトの名無しさん :2001/06/24(日) 12:45
ソープ? 石鹸のことだよね。 気持ちいいって・・・まあ、そりゃあ身体や顔洗えばスッキリするけどさあ。
SOAPのことと思われ
306 :
デフォルトの名無しさん :2001/06/24(日) 13:50
Hop Soap Proffecer
307 :
デフォルトの名無しさん :2001/06/24(日) 16:35
if (条件) { } else { } か、 if (条件) else ですか? { } はいりますか?
309 :
デフォルトの名無しさん :2001/06/24(日) 16:53
>>307 308に同意。
しかし、
if( a == 0 ) {
a++
}
else {
continue;
}
とかする馬鹿はすぐ殺せ。
そもそも、不用意にcontinue使う奴はクビ。
continueっていかんの?
313 :
デフォルトの名無しさん :2001/06/24(日) 18:48
if (p != NULL) debug_printf("fclose シヨーヨ\n"); fclose(fp); 「なんか、NULL pointer assignment とかいって止まるんですけど、 コンパイラがバグってるんでしょうか?」
314 :
デフォルトの名無しさん :2001/06/24(日) 18:49
同様の理由でreturn乱用も死罪だ。
315 :
デフォルトの名無しさん :2001/06/24(日) 18:49
316 :
デフォルトの名無しさん :2001/06/24(日) 19:38
318 :
デフォルトの名無しさん :2001/06/24(日) 20:33
なんでcontinueがだめなの? 使い方しだいだと思うけど。 そんなふうに硬直した思考してると 世の中から置いてきぼりを食っちゃうぞ
319 :
学生 :2001/06/24(日) 20:33
KL展開のプログラムを作っているのですが、 固有ベクトル以外に作らなければならないプログラムがわかりません。 画像の入出力はできます。教えてください。
320 :
デフォルトの名無しさん :2001/06/24(日) 20:37
>>318 ”不用意に”って書いてあるじゃん。煽りたいだけ?
321 :
デフォルトの名無しさん :2001/06/24(日) 21:08
>>318 使い方しだい、か。例を挙げてくれないか?
今まで、continueを使ってたソースで「こいつ何考えてんだ?」と
思わなかったことが無いのでな。
>321 同じく。おれもcontinueは必要だと思うが。
>>318 そう、使い方次第だよ。だから
>>312 と書いた。gotoだって使い方次第だ。
gotoでは多重ループから一気に抜けるときとかの例があるだろ。
continueが有効な例てのをあげてくれ。
324 :
デフォルトの名無しさん :2001/06/24(日) 22:31
あーあ、みんなムキになっちゃって。 あたま弱いんだね
どれがお好み? while (fgets(buf, sizeof(buf), fp) != NULL) { if (buf[0] == ';') { // skip comment line goto continue_loop; } /* normal task */ continue_loop: ; } while (fgets(buf, sizeof(buf), fp) != NULL) { if (buf[0] == ';') { // skip comment line continue; } else { /* normal task */ } } while (fgets(buf, sizeof(buf), fp) != NULL) { if (buf[0] != ';') { // skip comment line /* normal task */ } } while (fgets(buf, sizeof(buf), fp) != NULL) { if (buf[0] == ';') { // skip comment line continue; } /* normal task */ }
326 :
デフォルトの名無しさん :2001/06/24(日) 22:52
>>323 gotoだと、コピペが難しくなるのが問題なんじゃないか?
>>325 2番目のは continue が要らない典型的な例だと思う。
インデントの深さと真偽のわかり易さによって3か4のどちらか
330 :
デフォルトの名無しさん :2001/06/24(日) 23:20
個人的にはcontinueを使った人のプログラムを引き継ぐのは嫌かも。 continueを多用する人はループの記述にwhileを好む傾向にあると思う。 反対にforの方を好む人はcontinueを嫌うのかな? どちらにしろ宗教だからあまり熱く語らないほうが良いと思うよ。
ああ、二番目、馬鹿だね、これ。 if (buf[0] == ';') { /* skip */ } else { : : の間違い。
333 :
デフォルトの名無しさん :2001/06/24(日) 23:44
で、どれがcontinueが要る例なんだ? 選ばせるんじゃなくてお前が必要だと思うのを書けっつってんだよ
4だろ。あほ?
よけいな部分外してるけど、
>>325 が何をやりたいコードかわかるよね?
にもっと複雑な処理を加えていったときにどうなるか
適当に想像してみよう。
こういうのを定型的に書くとき、1, 2, 3 番で書くのがもっともスマートだと思うなら
止めないから、それでやってね。
何かCのバーチャルマシンって有りませんでしょうか? 処理系とstdio.h程度で良いのですけれど。 あれば弄って遊びたいのです。教えてください。
>>336 インタプリタか?
CINTで検索してみ。
338 :
333 :2001/06/25(月) 02:30
>>334 キミ、バカ? != 使えばいいじゃないか。
必要性のあるものを書け、と言ったんだよ。
やっても意味ねーことを書いてどうするんだよ? バカ。
339 :
デフォルトの名無しさん :2001/06/25(月) 02:37
>>338 それは
>>325 の 3 番目のコードを使え、という意味だよね? 4 番目を
忌避する理由って何?
>>339 ネストマニアなんだよ。
括弧が10段くらいついてるとカコイイと思ってるんだ
continueもbreakもgotoも全部やってるこた同じじゃ! 制御構文破綻してしまった時の対処療法。
>>338 空行読み飛ばしのロジックを追加したくなったとき
やっぱり、
if(!(buf[0]==';' || buf[0]=='\n')) {
なんですか?
カコイイ!
343 :
デフォルトの名無しさん :2001/06/25(月) 02:44
>>343 忘れてた!thanx
関数がまだ途中なのに出てくる、
頭クラクラしてくるアレね。
>>341 使っていいのは for, while, do - while, if (else) のみという主張? 根拠
を示してくれよ。
continue の使い途については
>>342 が代表的なところだが、ほかでも
「原則として処理するが例外的にスキップする」というロジックには、非常
に相性が良い。条件式が単純なものではなくて、副作用のある複数の
操作を途中で挟む場合には 3 のパターンは使いにくいし。
346 :
デフォルトの名無しさん :2001/06/25(月) 02:51
>>341 破綻するような設計ダサイよ
それいうなら、
while, do while, for, if goto
ループ構造書く意味ではどれも同じだよ
で、ifとgotoで制御構造書いても怒らないの?
347 :
341 :2001/06/25(月) 03:10
なるべく簡単な制御構文の関数を沢山作るように設計していけば、 自然と処理手順のワープは無くせるって意味だよ。 制御構文こねくり回して複雑にして、破綻の恐怖に怯えながら 仕事するのは嫌だからね。 人に薦められてこういう作り方に変えていったんだけど、 とりあえず簡単な制御構文だけで10年以上メシ食ってるから、 騙されてはいなかったかなと思っている。 まあ、先にいっとくけど、必ず解のある方法論じゃないんだけどね。 仕様によっては、設計の段階でかなり悩むこともあるが、 後で苦しむよりは正解と思う。
fflush(stdio); を使うとエラーになってしまうんですけど、なんで? エラー E2451 chotto.c 117: 未定義のシンボル stdio(関数 input_file ) エラー E2451 chotto.c 131: 未定義のシンボル stdio(関数 input_line )
349 :
ズバット解決! :2001/06/25(月) 03:13
350 :
デフォルトの名無しさん :2001/06/25(月) 03:14
>>349 本のやつを丸写ししたんだけど、本のやつはstdio定義してないんだよね
352 :
デフォルトの名無しさん :2001/06/25(月) 03:20
>>352 アスキー・ラーニングシステム実習C言語 三田典玄著
ISBN4-7561-1787-2
354 :
デフォルトの名無しさん :2001/06/25(月) 03:23
355 :
デフォルトの名無しさん :2001/06/25(月) 03:25
その本ダメだってバヨ Cの参考書はK&Rにはじまり、ANSI/ISO企画書に移り、 そしてまたK&Rに終わるのだ。 その他の本はすべてK&Rの劣悪な焼き直し。
357 :
338 :2001/06/25(月) 03:31
ifとgotoさえありゃ何でもできるんじゃボケ while()もfor()もdo{} whlie()も必要ねーんだよ! returnなんか無駄だ 全部mainで書けばいいだろ? バカ
358 :
デフォルトの名無しさん :2001/06/25(月) 03:34
で結局僕が悪いんでしょうか。それとも、本?
360 :
デフォルトの名無しさん :2001/06/25(月) 03:39
>>359 誰もが一度はやるミスなんで、悪くないですよ。
asciiの本に間違いが載ってるのはあたりまえなんです。
361 :
デフォルトの名無しさん :2001/06/25(月) 03:41
>>357 生産性と保守性を考えないなら、それでもいいですね。
でもどうせならアセンブラでやってください。
362 :
デフォルトの名無しさん :2001/06/25(月) 03:43
>>357 mainはどうやって呼ばれるんだろう・・・
363 :
デフォルトの名無しさん :2001/06/25(月) 03:44
>>356 sed.exe というテキスト変換ツールのコマンドだとおもう。
>s/stdio/stdout/
stdioをstdoutに置き換えるコマンド(だったかな?)
昔やった記憶がある。
>>360 そうですか。ありがとうございました。それにしてもこの本、改訂3版って書いてあるのに...
365 :
デフォルトの名無しさん :2001/06/25(月) 03:58
>>364 C言語の仕様が何度かかわっているので
それにあわせて何カ所か書き換えてるんだと思います。
決して、誤字脱字を直すための改訂はしてないと思います。
>>365 「決して」ですか?(ワラ
それって出版社の方針?
>>357 > ifとgotoさえありゃ何でもできるんじゃボケ
> while()もfor()もdo{} whlie()も必要ねーんだよ!
> returnなんか無駄だ
> 全部mainで書けばいいだろ? バカ
素晴らしい、その信念を貫きとおしてくれ。
ただし、そのソースは俺に見せるなよ。
猥褻物陳列罪で射殺するかもしれないから。
368 :
真338 :2001/06/25(月) 12:25
>>357 偽者を名乗るなら、せめて話の流れが通じるようにしてくれ
369 :
デフォルトの名無しさん :2001/06/25(月) 14:25
関数の最初に必要のある処理かどうかを判定して、 必要なければreturnで返しちゃうのってだめなんですか?
>>369 状況わかんないしな・・・。
オーバーヘッドとか気になるなら先に判定して呼べばいいんでは。
・・・とかって、一概には言えないと思うけれども。
インライン展開されたら関係ないし(笑)
それか、もっと別の問題を言ってるのかな。
いちおあげ
俺は好きだが。 「複数のリターンはいかん!」と言う人は、 foo(args) { if (is_argument_error(args)) { return ARGUMENT_ERROR; } if (!need_this_func(args)) { return CONDITION_ERROR; } /* 通常処理 */ return SUCCESS; } みたいなコードも拒否するのかな?
373 :
369 :2001/06/25(月) 15:38
>>372 僕もそういう書き方をよくします。
でも上のほうの書き込みをよむと、
だめのような感じだったので聞いてみたのですが
他の人はどうなんでしょうか?
構造化プログラミングの主張に、「関数の出口は一つにする」がある。
>>374 それを守ると、一体どういう御利益があるのでしょう?
良く、int return_codeとかの変数を使って、無理やり関数の最後でリターンする
ようなものを見ますけど(しかもインデントが深い)、そのような構造より
>>372 の
ようなコードの方が見やすいと思いますけど。
376 :
デフォルトの名無しさん :2001/06/25(月) 16:26
>>375 賛成
関数の出口を一つにするなんてのはよっぽどのばかしかやってないよ
377 :
デフォルトの名無しさん :2001/06/25(月) 16:33
上の方であったエラーの場合の処理も含んで…
トラップとか、アボートとかを目的にした場合は、その方が分かりやすいと思う。
仕様変更とかでごちゃごちゃになることも考えにくいし。
ただ、それを前提とした設計の是非が問われるところだが、
代替案があればってところでしょう。
要求された仕様を実現するためにまず制御構文から設計するような手法だと、
仕様変更の度に制御構文を設計し直すハメになりやすい。
仕様を満たす手法をなるべく一般化する方向で設計し、
制御構文はその手法を満たす単なる手段でしかないと思っておけば
今日も安心して眠れるってことでしょう。
それこそ
>>357 =偽338のいう冗談じゃないけど、if文だけで実現したって
いいんじゃないすか?趣味の範囲内にはして欲しいけど。
あと、誰も触れなかったけど、switch()中のbreak;を書くなという突っ込みなら、
少し話しが違う。
ちゃんとコメント入れれば複数の制御分岐でもいけると思うけどな。 というか複雑なアルゴリズムを実現するには、多少の制御分岐は 必要になるわけで、函数の階層化&分散 と 函数当りの制御分 岐数 は反比例な関係にあるわけで、どちらも度が過ぎれば可読 性は極端に落ちる。 あと、複雑なコードを書く必要性がでたらC++への移行も考えてい いんじゃないかな。
379 :
デフォルトの名無しさん :2001/06/25(月) 17:42
int a[3][5]; a[0][0] = data; ・ ・ ・ みたいに int **p; p[0][0] = data; ・ ・ ・ で実現したいんですけど、どうやってメモリを確保してやればいいんでしょう?
>>379 **じゃなく*でいい
malloc(sizeof(int)*3*5)
>>379 本屋に走ってCMagazineを買いなさい。
と思ったけど 実現できました。失礼しました。
384 :
デフォルトの名無しさん :2001/06/25(月) 18:26
>>382 今月号はポインタ特集らしいからじゃないの
385 :
デフォルトの名無しさん :2001/06/25(月) 18:43
>>372 今の職場、
int hogehoge( int a )
{
a = get_nanka();
switch( a )
{
case 0: return( 0 );
case 1: inc( a ); return( a );
case 2: return( 2 );
}
b = get_nanika();
for( i = 0; i < MAX_VALUE; i++ )
{
if( b == 100 ) return( -1 );
b += check_nantoka();
}
return( 0 );
}
みたいなことをする人が山のようにいるのだが
これは問題ないと思いますか?
returnに カッコをつけるなYO!!
>>385 渡された引数を局所変数に転用するのはいただけない。
>>385 たかがループ変数をグローバルで定義すんなYO!!
390 :
385 :2001/06/25(月) 20:12
どうやらここには、読解力のないバカしかいなかったようだな・・・ 今の職場がどれだけ恵まれているかわかったよ! パパ!ママ!僕はこの腐った職場で花を咲かせるよう!!
>>385 そのコードで開発・保守をやってて
利益がでてるなら、それでいいんじゃない?
でもね、最初に書くときに一般化とわかりやすさのための工夫をすることで
後に発生するであろう様々な無駄な工程が、今よりも、圧縮できるってことを
君が偉くなったときに思い出してね。
そのための手法は、広く公開されているし、特別な投資がいるわけでもないよ。
>>372 その書き方は、昔からよくあるパターンだし、別にいいんでないの?
でも、新規で書くときは使わないな。
emacsとかのマクロで、関数入り口, 出口にどかっと
enter/leaveログを吐くコードとか書き足せるほうが楽でしょ。
395 :
デフォルトの名無しさん :2001/06/25(月) 23:42
教えてぇ〜 どうすれば、PCIバスの情報取得できるの? 本屋立ち読みしたけど、わからな〜い
396 :
デフォルトの名無しさん :2001/06/25(月) 23:43
ユーザーに入力させた文章を、ある関数で受け取り、また他の関数に渡すなんて処理をするとき 一般的な、常識のあるプログラマはどのようにするのでしょうか? 受け取るとき何で受け取り、渡すとき何で渡すのか教えてください。
ポインタたらい回しは、あくまで見せる、だけだから気をつけてね んじゃ!
399 :
385(本物) :2001/06/25(月) 23:59
>>393 いや、これじゃあダメだと今年入った新卒の僕らが反論しているんですが
先輩は「社会ではこれが常識だ、趣味の世界と一緒にするな」と言ってくるんですよ。
ですから、これが社会で常識のコードなのか知りたくて・・・
>>399 すごい会社だね。辞表の書き方は本屋さんに行けば
わかるから明日有給とって買いにいこう。
401 :
デフォルトの名無しさん :2001/06/26(火) 00:20
ここはC言語のスレだからかもしれないけど、 ここ数年はthrowで飛ばしてcatchで受けるっつうプログラムばっか書いてたから、 385みたいなプログラムは、凄く懐かしい香りがするよ。 復帰値はエラーコードっていうのが、なんだかなつかしいよ。
<4>も早えぇな。議題は相変わらず不毛だが…
#include <stdio.h> main(void) { printf("氏ねや"); }
#include <stdio.h> main(void) { int a,b; { printf("input number n!\n"); b=1; for(a=1;a<=10;a++) { b=b*a; printf("kekka%2d=%10d\n",a,b); } } }
405 :
デフォルトの名無しさん :2001/06/26(火) 02:09
これをお願いします。別のスレでも聴いたのでですが、 分からなかったので…。 学校の授業で以下のプログラムを説明せよという宿題が出たのですが、 病気で休学していたので、さっぱりです。 どなたか簡単にせつめいしていただけないでしょうか。 まことにぶしつけなのは承知ですがどうかお願いします 分かっていることは、ペイントソフトのプログラムみたいです。 void_fastcall TForm1::BtnCLsClick(TObject *Sender) { Image1->Picture->Bitmap->Width=320; Image1->Picture->Bitmap->Height=240; Image1->Picture->Bitmap->Canvas->Pen->Color=clWhite; Image1->Picture->Bitmap->Canvas->Brush->Color=clWhite; Image1->Picture->Bitmap->Canvas->Rectangle(0,0,320,240); PaintBox1->Canvas->CopyRect(ClientRect,Image1->Picture->Bitmap ->Canvas,ClientRect); }
学校でマルチポストは好まれないと教えるべき。
>>405 全ての行を日本語にしてみればすぐわかるよ。
>>408 ネタ?
引数のSenderは何しとるん?
410 :
日本語化バッチ :2001/06/26(火) 10:09
空_急いで呼ぶ TForm1::ボタン消しクリック(TObject*送信器) { 1つ目の絵>-絵>-ビットマップ>-幅=320; 1つ目の絵>-絵>-ビットマップ>-高さ=240; 1つ目の絵>-絵>-ビットマップ>-キャンバス>-ペン>-色=clWhite; 1つ目の絵>-絵>-ビットマップ>-キャンバス>-ブラシ>-色=clWhite; 1つ目の絵>-絵>-ビットマップ>-キャンバス>-長方形(0、0,320,240); 1つ目の塗る箱->キャンバス->CopyRect(ClientRect、1つ目の絵―絵>>-ビットマップ>-キャンバス、ClientRect); }
411 :
ハジメテミタ :2001/06/26(火) 10:29
piped = errno==ESPIPE; errno29のilligal seekですが、この記述の意味がわかりません。。 if(errno==ESPIPE) piped = ESPIPE; って意味? piped は int です。
>>411 piped = (errno==ESPIPE ? 1 : 0);
または
if(errno==ESPIPE)
piped = 1;
else
piped = 0;
>>411 piped = ( errno == ESPIPE );
414 :
411 :2001/06/26(火) 10:49
>>412 ,413
ありがとうございます。
UNIXのコマンドのソースを読んでみたら、こんな記述が出てきて戸惑いました。。
もうひとつ教えてください。
char stdbuf[SIZEBUF];
setbuf(stdout, stdbuf);
なのですが、
ストリームのバッファリングがいまいちわかりません。。。
というより、バッファリングがいまいちわからないのですが、簡単に教えていただけますか?
あと、この記述のあと、stdbufは使われていませんが、
ここでは何をやってるのでしょうか?
415 :
411=414 :2001/06/26(火) 10:51
標準出力のときstdbufに格納してから、出力しているってことでしょうか?
>>414 > setbuf(stdout, stdbuf);
通常ストリームはBUFSIZ分のバッファを用意しているが、
それを変えたい場合、上記の関数を使用する。
> バッファリングがいまいちわからないのですが、簡単に教えていただけますか?
例えば、ベルトコンベアから次々と荷物が送られてくるとする。
荷物を運ぶコストが非常に大きい場合、1個1個荷物を運ぶよりも
ある程度まとまった荷物を一気に運んだ方が効率が良い。
その荷物を格納しておく場所をバッファといい、手法をバッファリングという。
418 :
デフォルトの名無しさん :2001/06/26(火) 13:29
、下のCプログラムを書き換えてpivot=0やとても小さい数でもちゃんと計算できる ように下のプログラムを完全なものに したいのですが・・・ どうやったらいいのですか? ここをこうかえる、というように具体的に教えて下さい。 マジでお願いします。 #include <stdio.h> #define IMAX 3 #define JMAX 4 double array[IMAX][JMAX]={ { 2, 1,-1, 5 }, {-3, 3, 2, 1 }, { 1,-2,-2,-1 }, }; void PrintMat(void){ int i,j; for(i=0;i<IMAX;i++){ for(j=0;j<JMAX;j++){ printf("%5.2f ",array[i][j]); } putchar('\n'); } putchar('\n'); } void SweepOut(void){ int i,j,axis; double pivot,aik; for(axis=0;axis<IMAX;axis++){ pivot=array[axis][axis]; for(j=axis;j<JMAX;j++){ array[axis][j]/=pivot; } for(i=0;i<IMAX;i++){ if(i!=axis){ aik=array[i][axis]; for(j=0;j<JMAX;j++){ array[i][j]-=array[axis][j]*aik; } } } } } main(){ PrintMat(); SweepOut(); PrintMat(); }
419 :
1 :2001/06/26(火) 14:05
age
420 :
411=414 :2001/06/26(火) 14:11
>>416 ,417
ありがとうございます。
理解できました。
421 :
デフォルトの名無しさん :2001/06/26(火) 14:14
ホンをよんでいたら strName = "test"; って感じで文字列を代入していたのですが こんなことが許されるのでしょうか?
424 :
新米PG :2001/06/26(火) 14:46
シリアル通信がうまくいかない! VC6.0でデータ受信がうまくいっていません 調査した所、ReadFileの読み込みで1024バイト以降のデータ が異常なデータになっていました。 なにか設定が足りないのだと思いますがわかりません。。。 熟練の皆様お願いします。
>424 ネタ? たったそれだけ書いて何をどうしろと?
426 :
デフォルトの名無しさん :2001/06/26(火) 15:11
>>425 1を聞いて10を知る練習をしろ、と言っているのでは?
実際こういう質問をしやがるプログラマは多いからな。
427 :
デフォルトの名無しさん :2001/06/26(火) 15:20
>>425 わからないのところは創造で補うべし。創造だぞ。
428 :
新米PG :2001/06/26(火) 15:38
>>425 すみません、素人さんにはわからない説明をしてるので
ごめんなさい。
429 :
デフォルトの名無しさん :2001/06/26(火) 15:41
文字列を右端と左端の空白部分を計算する ことで、中央にそろえるプログラムを勉強 しますが、本には下のように書いて いました。しかし、これだとrigのほうが 上手くいきません。(printfで調べました。) この記述は間違っているのでしょうか? n=strlen(s);// for(i=0;i<n;i++) if(! isspace(s[i])) break; lef=i; for(i=n-1;i>=0;i--) if(! isspace(s[i])) break rig=n-i-1 ; k=(lef+rig)/2; (C言語集中ゼミ softbank刊 P174)
>>428 あんまなめんな。
素人じゃなくたってわかんねーよ。
せめてCreateFileのパラメータくらい全部かいとけやゴルァ!
431 :
民生 :2001/06/26(火) 16:14
S−JIS ⇔ EUC の変換をするにはどうすればいいですか?
432 :
デフォルトの名無しさん :2001/06/26(火) 16:18
>>431 Winなら秀丸に食わせて、s-jisで保存したりeucで保存したりします
Linux/Unixならnkfに食わせます
system関数を使うとよいでしょう
>>431 system("nkf -S -e <sjisfile >eucfile");
system("nkf -E -s <eucfile >sjisfile");
434 :
新米PG :2001/06/26(火) 16:39
>>430 すみません、ちょっとかじった人にもわからない説明をしてるので
ごめんなさい。
435 :
民生 :2001/06/26(火) 16:45
>>433 まじ助かります。ありがとうございます。
436 :
民生 :2001/06/26(火) 16:47
>>433 変数レベルで変換するにはどうしたらいいですか?
437 :
デフォルトの名無しさん :2001/06/26(火) 16:48
>>434 再現可能な情報をくれ。
5W1Hって知ってるか?
厨房じゃなきゃ意味わかるよな?
Read時ってことは送られてくる情報が1024bytesで切れてて、
あとはゴミッちゅう可能性もあるが、相手にもよるよな。
>>434 少なくともお前より経験も実績もあるが何か?
「設定が足りないんだと思います」とか書いておきながらその肝心の設定を
何一つ書いてなけりゃ答えようがねえよ。
441 :
デフォルトの名無しさん :2001/06/26(火) 17:26
>>439 経験と実績だけの方ですね、なんの実績だか・・・(冷汗)
経験豊富なあなたもごめんなさい。
>>440 >428の理由により、ごめんなさい。
たまに出来る人が混じってる2ちゃんですが
今回はみんなはずれみたいなので、終了します。
なんだ真厨か。
443 :
デフォルトの名無しさん :2001/06/26(火) 18:24
const int MAX = 100 ; const int * pMAX = &MAX ; int i = 50 ; pMAX = &i ; のとき、*pMAXの値は何か? プログラムせずに答えよ。 と言われて困っています。 pMAX が const だから pMAX = &i ;は出来ないんじゃないかと思うので *pMAXは 100だと思うんだけどあってる?
444 :
デフォルトの名無しさん :2001/06/26(火) 18:30
445 :
デフォルトの名無しさん :2001/06/26(火) 18:33
なぜでしょうか? pMAX = &i ; がどうして可能なのか分かりません。const指定してるのに。
>>445 int const* pMAX =&MAX;
なら、
pMAX = &i;
はできない。
447 :
デフォルトの名無しさん :2001/06/26(火) 18:36
448 :
445 :2001/06/26(火) 18:37
?>446 どこが違うのでせう!?
449 :
445 :2001/06/26(火) 18:40
constキーワード指定の場合、派生の順序がよくわかっていません。>俺
int * const p; // const な 「intへのポインタ」 const int * p; // 「const int」へのポインタ
451 :
新米PG :2001/06/26(火) 18:43
追記 直りました、やはりあの書き込みで説明不足って事はなかったみたいです。 他の掲示板にも意見を求めたらあっさり解決。 ちょっと2ちゃんにはがっかり。
452 :
厨房PG :2001/06/26(火) 18:44
>>451 何が原因だったの?
僕も同じようなことをやるかもしれないから
参考までに教えてほしいです
454 :
445 :2001/06/26(火) 18:52
>int * const p; // const な 「intへのポインタ」 >const int * p; // 「const int」へのポインタ うーん、では const * int p と int const * p はどうよむのでしょうか(日本語訳!?すると)?
455 :
sage :2001/06/26(火) 18:55
>>454 K&R読んで勉強しとけ
int main()
{
int a = 0;
const int *p1 = &a; /* 変更不可能な, intを指すポインタ */
int const *p2 = &a; /* 変更不可能な, intを指すポインタ */
int * const p3 = &a; /* intを指す, 変更不可能なポインタ */
*p1 = 1; /* error */
*p2 = 1; /* error */
*p3 = 1;
p1++;
p2++;
p3++; /* error */
return 0;
}
456 :
445 :2001/06/26(火) 18:59
>>455 446さんは
*p1 = &a; /* ok */
*p2 = &a; /* error */
と言ってるのですが!?
const int *p1 = &a; /* 変更不可能なintを指すポインタ */ int const *p2 = &a; /* 変更不可能なintを指すポインタ */ int * const p3 = &a; /* intを指す変更不可能なポインタ */ のほうがわかりやすいか。 おまけ const int * const p4 = &a; /* 変更不可能なintを指す変更不可能なポインタ */
458 :
新米PG :2001/06/26(火) 19:01
459 :
445最後の質問 :2001/06/26(火) 19:04
>>457 有難うございました。「おまけ」で納得できました。
最後に
const int
int const
どっちを先に書いても同じなのですね?質問ばかりですいません。
同じだとすると446さんは間違えたのだろうか。
>>458 痛い煽り(w
DCBなのはわかりきってるだろ。DCBのどのメンバだよ(w
知ってる単語並べりゃいいってもんじゃねえだろ(プ
462 :
デフォルトの名無しさん :2001/06/26(火) 19:40
>>460 いや、ご回答頂いただけでも感謝してます。マジで。
でもsage.
465 :
デフォルトの名無しさん :2001/06/26(火) 20:37
画像処理での、「輪郭線(境界線)追跡」を行うプログラムが書けません。 誰か教えて下さい。お願いします。
>>465 追跡か?
ある点から周りを見渡して現在の点と最も近い値を持つ点に移動。
これを繰り返す。
「ある点」は輪郭抽出とかであらかじめ探しておく。
467 :
465 :2001/06/26(火) 23:09
>>467 とりあえず、この板の住人はマルチポストするような厨房に教えてくれるほどお人好しでも暇人でもないって事だ。
>>468 マルチポストに対する注意はマルチポストしていいの?
放置しとけ
474 :
デフォルトの名無しさん :2001/06/27(水) 10:10
2次元配列を動的に用意するのはどうすればよいのよ!
下記のソースがまともに動きません。なぜでしょうか? コンパイラはエラー0,警告0で通ります。 Nを1000にすると問題なく動くのですが。 sizeof(int)は2です。 #include <stdio.h> #include <stdlib.h> #define N 10000 main() { int i,d[N]; for ( i=0 ; i<N ; i++ ) { printf ( "%d ",d[i]=rand() ); } return 0; } 環境:Duron800/128M/HD60G/Windows98SE(DOS窓) 言語:LSI-C86試食版
>476 スタックがあふれているから。int d[N]をmainの上に持っていくと動くはず。
478 :
よお :2001/06/27(水) 11:11
AIXでは、動いてるぞ おそらくLSI-C86の何らかの制限に引っ掛かってると思うけど
ありがとうございます。 int d[N]をmain()の上に持っていくと動きました。 Nを30000にしても動きました。 スタックがあふれるなんて、再帰的なことをしない限り 気にすることないと思っていたのですが、勉強不足でした。
>>479 > スタックがあふれるなんて、再帰的なことをしない限り
> 気にすることないと思っていたのですが、勉強不足でした。
LSIC86はかなり古いコンパイラだからな。
# intが2byteだし、near, farポインタがあるし...
LSIC86ではSモデルでは2500byteのスタックをデフォルトで用意する。
必要なスタックを確保したい場合、コンパイルオプションに
-k'-s 2000'を追加する。これで8kのスタックが確保できる。
詳しい話はマニュアルLSIC86.manの3.9 スタックの大きさ
を見てみよう。
481 :
デフォルトの名無しさん :2001/06/27(水) 12:12
関数でmemset関数とmemcpy関数の機能がついてないのでmemsetとmemcpyの サブルーチンを作らなくてはいけないのですが、ソースは具体的にいうとどのようになるのでしょうか? 初心者なので難しいです。 void *memset(void *s,int c,size_t) { void *a[size_t]; int b = 0; strcpy(a,b); return(a); } まさかこんなソースになるわけないし。。。
482 :
>481 :2001/06/27(水) 12:16
システムコール使っていいのか?
483 :
デフォルトの名無しさん :2001/06/27(水) 12:24
>>481 新卒で、先輩から
「Cの勉強がてら、memsetとmemcpyを自力で作ってみ」
と言われたとかいうことじゃないよな?
484 :
デフォルトの名無しさん :2001/06/27(水) 12:25
>>481 memcpyがなくてstrcpyがある・・・どういう環境だ?
>>481 /* ネタ用memset */
void *memset(void *s,int c,size_t n)
{
return memmove(s, c, n);
}
/* 先輩が予期しているmemset */
void *memset(void *s,int c,size_t n)
{
unsigned char *p = s;
int i;
for(i = 0; i < n; n++) {
p[i] = c;
}
return s;
}
memcpyはこれを参考にして自分で作れ
486 :
デフォルトの名無しさん :2001/06/27(水) 12:43
お前は次に 「K&Rってなに?」 と言う!
488 :
デフォルトの名無しさん :2001/06/27(水) 13:02
481さん、ありがとうございます。 大変恥ずかしいっす。。。
490 :
デフォルトの名無しさん :2001/06/27(水) 13:12
K&Rってなに?
491 :
デフォルトの名無しさん :2001/06/27(水) 13:16
ちなみに for(i = 0; i < n; i++) { ですよね?
492 :
デフォルトの名無しさん :2001/06/27(水) 13:30
VCのプログラムを高速化をしたいので ソースのどの部分がオーバーヘッドになっているのかを調べたいです 確か、各関数の実行時間を調べる関数があったと思いますが・・・ 教えて下さい
493 :
デフォルトの名無しさん :2001/06/27(水) 13:32
void *memset(void *s,int c,size_t n) { unsigned char *p = s; int i; for(i = 0; i < n; i++) { p[i] = c; } return p; }
495 :
デフォルトの名無しさん :2001/06/27(水) 14:05
戻り値は、 return p; ではないのですか?
498 :
デフォルトの名無しさん :2001/06/27(水) 14:14
499 :
デフォルトの名無しさん :2001/06/27(水) 23:11
会社でボーナス査定システムを作成することになりました。今年のボーナスは ボーナス=(基本給*2.3)+能力給+ボーナスポイント という計算で求める。基本給とボーナスポイントは下の通り。 勤務年数 基本給 ボーナスポイント 0−5年 80000 10000 6−10年 100000 12000 10−15年 120000 15000 16年以上 150000 18000 ランク 能力給 A 基本給*3 B 基本給*2.5 C 基本給*2 D 基本給*1 という問題があるんですが、自分で作ったプログラムが下にあるのですが、 エラーが1つあるのですが、どこかわかりません。自分では完璧だと思うですが。 だれか、教えてください。 基本給=kihon 能力給=nou ボーナスポイント=point 勤務年数=nennsu ランク=rank ボーナス(答え)=answer #include <stdio.h> int main(void) { int nennsu,kihon,nou,point,answer; char rank; printf("勤務年数は?"); scanf("%d",&nennsu); printf("ランクは?"); scanf("%s",rank); if(nennsu>=16){ kihon = 150000; point = 18000; } else if(nennsu>=11){ kihon = 120000; point = 15000; } else if(nennsu>=6){ kihon = 100000; point = 12000; } else{ kihon = 80000; point = 10000; } if(rank= 'a'){ nou = kihon * 3; } else if(rank = 'b'){ nou = kihon * 2.5; } else if(rank = 'c'){ nou = kihon * 2; } else (rank = 'd'){ nou = kihon * 1; } answer = (kihon * 2.3) + nou + point; printf("あなたのボーナスは、%dです",answer); return 0; }
>>499 エラーは2点
・ifがいっかしょぬけてる
・ださいこーどかくな
501 :
デフォルトの名無しさん :2001/06/27(水) 23:45
どこ?抜けてないよ。 初心者なの、ださくてごめん
502 :
デフォルトの名無しさん :2001/06/27(水) 23:46
503 :
デフォルトの名無しさん :2001/06/27(水) 23:48
>>502 うまく動かないのならだめってことだよ。
504 :
デフォルトの名無しさん :2001/06/27(水) 23:58
505 :
デフォルトの名無しさん :2001/06/28(木) 00:05
要素数が100の整数型配列aを定義し、for文を利用して配列の要素を すべて0にする文を示しなさい。 こんな問題があるんですけど、配列の要素をすべて0にするという意味がわかりません。 わかる方いたら何方か教えてください。
>>505 int a[100],i;
for(i=0;i<100;i++)a[i]=0;
>>499 ifの中の代入式って…。
それとswitch使おうね。
というか、Cの教科書読もう。
int a[100]; bzero((sizeof int)*100);
>>509 int a[100];
bzero(a,(sizeof int)*100);
512 :
504 :2001/06/28(木) 00:33
>>511 int a[100];
for (a[0]=1;a[0];){
bzero(a,(sizeof int)*100);
}
int a[100]; for(a[0]=1;;a++){ if(a[0]==99){ a[0]=0; break; } a[a[0]]=0; }
int a[100]; for (bzero(a,(sizeof int)*100);0;);
sのなかみが長さゼロの文字列の時何が起こる?
>>512
517 :
デフォルトの名無しさん :2001/06/28(木) 00:55
>>507 技術評論社の「C言語によるはじめてのプログラムレッスン1」の一番最後の問題
なんだけど、問題集の答えだと、たくさん行があり、この一冊をやった知識で
自分で作成したプログラム。だから、答えが無いし、初心者だから、エラーになって
しまう理由を教えて。
typedef struct sHOGE{ int a[100]; }HOGE; HOGE i={0}; int a[100]; *(HOGE*)a=i;
typedef struct sHOGE{ int a[100]; }HOGE; HOGE i={0}; int a[100]; for(*(HOGE*)a=i;0;);
520 :
512 :2001/06/28(木) 01:08
>>516 (?_?;)
長さが0だとlefもrigも0でいいのかなぁ・・・?
>>514 配列宣言した a を a++ は違うだろ
むかしZ80のコードでいかにして64Kすべてをクリアするかという
問題があった。プログラム自信も消してしまうのだ
こういうの書いたことあるなあ。 とりあえず、コンパイラのエラーと警告文をすべて読んで、理由を調べてみること。 がんばれ。
もしかして strlen("")が返す値は未定義(._ .;?
んなわけないか(;^_^
527 :
デフォルトの名無しさん :2001/06/28(木) 01:46
じゃ、n==0だと、 n=strlen(s); for(i=0;i<n;i++) if(! isspace(s[i])) break; lef=i; for(i=n-1;i>=0;i--) if(! isspace(s[i])) break rig=n-i-1 ; k=(lef+rig)/2; ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ for(i=0;i<0;i++) if(! isspace(s[i])) break; lef=i; for(i=0-1;i>=0;i--) if(! isspace(s[i])) break rig=0-i-1 ; k=(lef+rig)/2;
>>524 とくに、sがNULLの時以外は平気みたいだね。
s = " "; /* 空白三つ */
のとき
lef, rig が共に3にならない?
529 :
デフォルトの名無しさん :2001/06/28(木) 01:50
nが0でもいいと思うけどな〜 for(i=0;i<0;i++) if(! isspace(s[i])) break; lef=i; // i == 0 なので lef == 0 for(i=0-1;i>=0;i--) if(! isspace(s[i])) break; rig=0-i-1; // i == -1 なので rig == 0 k=(lef+rig)/2;
530 :
デフォルトの名無しさん :2001/06/28(木) 02:06
>>528 sが空白3つの時、lefとrigは3になりますが、
それは意図した動きだと思います。
sがNULLだと駄目ですね。
>>429 strlenで失敗するから、rig以前の問題・・・?
429さんは何の文字列でチェックしたのかな〜(・_・ )
fgetでとってきてて \r\nがついてるのに一票
532 :
デフォルトの名無しさん :2001/06/28(木) 02:51
c言語の質問ってわけではないですが・・・。 再帰を解説する書籍やページにはよく、クイックソートがのっていますよね。 だいたいの本は「これを再帰を使わずに書くとかなり厄介なことになるので・・・」 などと書いていますが、実際にどんなプログラムになるのか書いているのはすくないです。 そこで、自分で繰り返し版に直してみようと思ったんですが玉砕しました。 どう書けばいいんでしょう?また、どこかにソースがのっているページってありますか?
>>532 その時点で目的は達成されてるんじゃないのか?
「かなり厄介なことになる」というのは体感できたんだろ?
534 :
デフォルトの名無しさん :2001/06/28(木) 03:14
>>533 532はどんなプログラムになるのかを知りたいのであって、
どんな結果になるのかを知りたいのじゃないから
目的は達成されてないだろ・・
535 :
デフォルトの名無しさん :2001/06/28(木) 03:27
>>532 そういえば俺も見たことないなあ。
ゼロから作るとしたら、元データと同量のワークエリアを
確保していいのならすぐできそうだけどね。
>>532 厄介でもないよ。
int *quick_sort(int *a, int n)
{
int pivot, h, l, *high, *low, sp;
high = (int*)malloc(sizeof(int)*stack_size(n));
low = (int*)malloc(sizeof(int)*stack_size(n));
high[0] = n - 1;
low[0] = 0;
sp = 1;
while(sp > 0){
sp--;
h = high[sp];
l = low[sp];
if(h <= l)
;
else{
pivot = partition(a, h, l);
high[sp++] = h;
low[sp++] = pivot + 1;
high[sp] = pivot - 1;
low[sp] = l;
}
}
}
partition()とかは自分で作れ。バグあったらごめん。
>>532 ちゃんと書こうとすると多少やっかいかな。
再帰で引き渡す引数を保管しとかないといけないですから。
引数になる値を配列なんかに入れてとすれば
あとはオーバーフローさせないようにすればいいだけか。
一日悩めば出来るでしょう。
どっかの本で見たような記憶もあるけど何だったか忘れた。
538 :
532 :2001/06/28(木) 04:22
>>533 - 537
いろいろ、ありがとうございます。
ただ、c言語(というよりプログラミング)を勉強しつつやっているもんで
あんまりややこしいことはまだできないですが・・・。がんばって、やってみます。
アルゴリズムの勉強っておもしろいですね。文法覚えるよりずっと楽しいです。
C言語の入門書は山ほどあるのに、アルゴリズムの本って少ないようなきがしますが、
いいのはありますか?(っていうのはスレ違いかな)
>538 おすすめなのかはよく分からんけど アルゴリズム辞典(奥村晴彦著)だとバグフィックスされたソースが ネット上ですべて手に入るからいいかもしれない。
return a; 忘れたよ……。
541 :
デフォルトの名無しさん :2001/06/28(木) 06:51
542 :
532 :2001/06/28(木) 07:00
543 :
532 :2001/06/28(木) 07:02
544 :
デフォルトの名無しさん :2001/06/28(木) 08:56
>>539 アルゴリズム事典は初心者にはだめだろ。
あれは説明がわかりずらいぞ。
Cプログラマのためのアルゴリズムとデータ構造
SOFTBANK
から始めるのがいいんじゃないの
545 :
デフォルトの名無しさん :2001/06/28(木) 09:48
C言語でURLエンコード・デコードする関数を教えてちょ
546 :
デフォルトの名無しさん :2001/06/28(木) 10:14
自分で作れ。
547 :
デフォルトの名無しさん :2001/06/28(木) 11:34
char input[256]; char output[256]; int enUML(char* MOTO,char* HENKANGO){      write(1,"後は任せた!!\n",13); }
548 :
デフォルトの名無しさん :2001/06/28(木) 12:01
bitset関数とbitget関数の環境がないので自作するように言われてるけど アルゴリズムが・・・ void *bitset(A,bit) { int *d=A; int i = d + bit; int m; while(*d>0){ m = (*d)%2; *d=m; if(i==d) *d++; d++; } } これだと、駄目な気がします。誰か教えてください。
>>548 int bitset( int A, int bit )
{ return A | 1<<bit ; }
int bitget( int A, int bit )
{ return A>>bit | 1 ; }
550 :
けろ :2001/06/28(木) 12:24
>>549 int bitset( int A, int bit )
{ return A | (1<<bit) ; }
優先度注意。
欝だ。あってた。氏のう。
554 :
デフォルトの名無しさん :2001/06/29(金) 02:43
>>549 bitset(int A, int bit)
が A の bit目のビットを1にするってのなら
int bitset(int A, int bit)
{ return A | (1<<bit-1); }
じゃないんですか?
(bit-1)
556 :
shige :2001/06/29(金) 03:01
通常の表現: ブッ殺してやる! ↓ ていねい語表現: 死にますよ〜
557 :
shige :2001/06/29(金) 03:20
まだCなんて使ってるんですか (嘲笑) 君らにはrubyなんて理解も出来ないと思うけどね。
自爆だね(w
>>552 <<,>>の方が | よりも優先度が上。覚えとこう。
だけど、誤解を招かない、という意味で括弧を記述するのなら良し。
>>557 大抵のRubyユーザはUNIX野郎なのでCをカリカリ書きますよう。
大体RubyのソースはCで書かれているし……
562 :
shige :2001/06/29(金) 06:38
熊ヒゲの誘惑・触れ合う体毛モンゴル相撲の巻
563 :
デフォルトの名無しさん :2001/06/29(金) 08:59
何? 職場でいじめられたの?
564 :
865 :2001/06/29(金) 10:02
>>559 MLBって何?MSBの間違いでしょ。
それにどっちが0かはエンディアンネス次第。
リトルエンディアンだと普通はLSBが0ビットだよ。
>>564 いや、エンディアンに関わらずLSBが0だろ。
566 :
564 :2001/06/29(金) 12:13
>>565 ビッグエンディアンだとMSBが0ビットって書いてある事多いよ。
567 :
デフォルトの名無しさん :2001/06/29(金) 12:22
バイトを反転させて受け取るdatget関数と反転させてセットするdatset関数を 作っているけど他の型に対応させるのが難しいです。 char *datget(char *d,int n) { int i; char *dd; dd = d; for (i = 0; i < n; i++) dd[i] = d[n-i-1]; dd[n] = '\0' return(dd); } じゃ、違うと思うし・・・。誰かわかりますか?
568 :
デフォルトの名無しさん :2001/06/29(金) 12:38
こんなとこか? char *datget(char *d, int n) { int i; for(i=0; i<n/2; i++) { char dd; dd = d[i]; d[i] = d[n-i-1]; d[n-i-1] = dd; } return dd; }
鬱だ。 誤 return dd; 正 return d;
>>567 > 他の型に対応させるのが難しいです。
void *datget(void *d,int n)
にして、関数内部ではunsigned char *で扱え。
> dd[i] = d[n-i-1];
2つの値(a, b)の交換を行う為にはもう一つ変数(t)がいる。
xorとか変なテクニックを使わない限り
t = a; a = b; b = t;
としないと交換できない。
また、d = "1234567", n = 7の場合
dの0番目とdの4番目を交換d = "7234561"
dの1番目とdの3番目を交換d = "7634521"
dの2番目とdの4番目を交換d = "7654321"
dの3番目以降は交換する必要はない。
ヒントは以上、検討を祈る
571 :
デフォルトの名無しさん :2001/06/29(金) 13:32
void ludcmp(float **a,int n,int *indx,float *d) をmain関数で呼出したいのですが、引数をどのようにしたら いいのか、わかりません。多分 a は配列だと思うのですが、 どなたか分かる方よろしくお願いします。
>>571 float **a,*d;
int n,*indx;
ludcmp(a,n,indx,d);
573 :
デフォルトの名無しさん :2001/06/29(金) 13:52
>>567 datgetとdatset何が違うの?同じでいいと思うんだが
ソースを見る限りだと汎用のbyteswap関数作れば事足りる
>>570 void *は賛成だけどunsigned char *にする必要はないと思われ
つーか、どっちでもいいと思う
>>566 手元にある数種類のプロセッサのマニュアル見てみた。
ちなみにMC68000、SH3、H8/300、TMS320DSPすべてビッグエンディアンだが
MSBが0になってるのはひとっつも無いぞ。。
>>573 > void *は賛成だけどunsigned char *にする必要はないと思われ
void *dだとd[i]とするとは文法エラー。
dはなんらかの型にcastする必要がある。
byte単位に処理を行う仕様なのでchar *, unsigned char *が適切。
unsigned char *としたのは俺の趣味
576 :
デフォルトの名無しさん :2001/06/29(金) 16:50
567ですが、これでは無理でしょうか? char *datget(void *d, int n) { int i; unsigned char *dd; for(i=0; i<=(n-i-1); i++) { dd = d[i]; d[i] = d[n-i-1]; d[n-i-1] = dd; } return d; }
577 :
573 :2001/06/29(金) 17:28
>>575 言葉不足でした。unsigned char *にする必要ないってのは
無駄に長くなるから、char *でも大丈夫ってこと。
結果はどっちでも一緒でしょ?
>>576 とりあえずコンパイル*だけ*は通すようにする
論理的なエラーは自分で見つけよう
> char *datget(void *d, int n)
char *datget(void *d, int n)
> unsigned char *dd;
char dd;
上記2個所を修正し、さらに
int main(void){
char s[] = "123456789";
char *p;
p = dataset(s, strlen(s));
printf("%s\n", p);
}
を付けて自分の思っている通りに動くかどうか確認しろ。
"987654321"と出力できれば正常だろう。
他の型に対応するのはまずこれができてからだ。
579 :
573 :2001/06/29(金) 17:48
>>576 要素数が奇数の時に一回無駄にループする。
void *datget(void *d, int n)
{
char *p1 = (char *)d;
char *p2 = (char *)d + n;
while (p1 < p2) {
char t = *p1;
*p1++ = *--p2;
*p2 = t;
}
return d;
}
580 :
デフォルトの名無しさん :2001/06/29(金) 18:30
>>564 MLBは間違えた。LSBだな。Least Bit。
エンディアンは関係ないよ。メモリとレジスタをごっちゃにしないこと。
581 :
デフォルトの名無しさん :2001/06/29(金) 18:53
>>576 void *datget(void *d, int n)
{
char *p1 = (char *)d;
char *p2 = (char *)d + n;
while (p1 < p2) {
*p1 ^= *--p2;
*p2 = *p1^*p2;
*p1++ ^= *p2;
}
return d;
}
とか。
583 :
デフォルトの名無しさん :2001/06/29(金) 19:38
配列で宣言の時に要素数を指定せずにその最大値を 途中で変更したりしたいのですがどうしたらいいですか。
584 :
デフォルトの名無しさん :2001/06/29(金) 19:56
>>583 こうやればいい
#include <stdlib.h>
int main()
{
int i;
int* p;
p = (int*)malloc( sizeof(int) * 10 );
if( p == NULL )return 1;
for( i=0; i<10; i++ ){
p[i] = i;
printf( "p[%d]=%d\n", i, p[i] );
}
p = (int*)realloc( p, sizeof(int) * 20 );
if( p == NULL )return 1;
for( i=0; i<20; i++ ){
p[i] = i;
printf( "p[%d]=%d\n", i, p[i] );
}
free( p );
return 0;
}
585 :
デフォルトの名無しさん :2001/06/29(金) 20:53
すいません。下のダイクストラのアルゴリズムで最短経路を始点から表示させる方法が どうしても解りません。どうか教えてください。すいません。 include <stdio.h> #define s 10000 #define v 30 #define YES 1 #define NO 0 int main(void); int Min(int, int); int MinSearch(int l[v], int c[v],int); int n; int main(void) { int i, j,k; int sel[v], chk[v], distance[v]; int weight[v][v]; printf("頂点の数を入力せよ"); scanf("%d",&n); printf("各頂点間の距離を入力せよ\n"); for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ printf("%d-%d:\n",i,j); scanf("%d",&weight[i][j]); } } for(i=1;i<=n;i++){ chk[i] = NO; distance[i] = s; } printf("始点となる頂点を入力せよ : \n", n ); scanf("%d", &sel[0]); chk[sel[0]] = YES; distance[sel[0]] = 0; for (i = 1; i<=n; i++) { for (j =1 ; j<=n; j++) { if(chk[j] == NO){ distance[j] = Min(distance[j], distance[sel[i-1]] + weight[sel[i-1]][j]); } } sel[i] = MinSearch(distance, chk,n); chk[sel[i]] = YES; } for (i = 1; i <=n; i++) { printf("頂点%dから頂点%dまでの最短距離は%d \n", sel[0], i, distance[i]); } }
586 :
デフォルトの名無しさん :2001/06/29(金) 20:54
続きです int Min(int a, int b) { if (a < b) return(a); else return(b); } int MinSearch(int l[v], int c[v],int n) { int i, min, num; min = s; for (i = 1; i <= n; i++) { if (c[i] == NO && l[i] < min) { min = l[i]; num = i; } } return(num); }
587 :
583 :2001/06/29(金) 20:58
さんくす。 2次元以上の配列はどうしたらいいでしょうか?
588 :
デフォルトの名無しさん :2001/06/29(金) 20:59
587は584に対してです。
>>587 #include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int i,j;
int**p,**q;
q=p=(int**)malloc(sizeof(int)*10);
for (i=0;i<10;i++){
q[i]=p[i] = (int*)malloc( sizeof(int) * 10);
if( p == NULL )return 1;
}
for( i=0; i<10; i++ ){
for( j=0; j<10; j++ ){
p[i][j] = i*10 +j;
printf( "p[%d][%d]=%d\n", i, j, p[i][j] );
}
}
p=(int**)malloc(sizeof(int)*20);
for (i=0;i<20;i++){
p[i] = (int*)malloc( sizeof(int) * 20);
if( p == NULL )return 1;
}
for( i=0; i<20; i++ ){
for( j=0; j<20; j++ ){
p[i][j] = i*20 +j;
printf( "p[%d][%d]=%d\n", i, j, p[i][j] );
}
}
for (i=0; i<10;i++){
free(q[i]);
}
free( q );
for (i=0; i<20;i++){
free(p[i]);
}
free( p );
return 0;
}
590 :
デフォルトの名無しさん :2001/06/30(土) 01:31
>>589 ご苦労さま。でもメモリリークしてるよ。
n次元配列に対応できる記述ってあるのかな?
591 :
shige :2001/06/30(土) 01:41
ハハハ ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ^∀^)< あほか ( つ ⊂ ) \_________ .) ) ) (__)_) (^∀^)ゲラゲラ ruby >>>>>>>>>>>>>>>>>>>>>>> C
592 :
564 :2001/06/30(土) 02:02
>>580 説明しにくいんだけど、MSB FirstとLSB Firstってのは、普通はバイト
の並び順だけど、実際にはビットの並び順とも考えられると思う。
もしメモリをバイト配列じゃなくて、ビット配列として扱えたとすると、
例えば32ビットの値はリトルエンディアンならLSBが0番目でMSBが31番目、
ビッグエンディアンならMSBが0番目でLSBが31番目という感じになる。
俺はこんな風に解釈してるんだけど、どんなもんでしょ?
こんな風にして文字列入れるの邪道かな。 char str[100]; int i = 0; while((str[i++] = "sage"[i]) != 0); すなおに char str[100] = "sage"; って書けって。 そりゃそうだ。
>>593 正道じゃない?
最初から入れたい文字列が決定しているわけじゃないときは
それなりに有効だと思う。
!=0 はいらないけど
>>593 そうですね。
!= 0
いりませんね。
邪道かなと思ったのは
"sage"[i]とするのはどうなのかなと。
596 :
デフォルトの名無しさん :2001/06/30(土) 03:55
#include<stdio.h> #include<string.h> #define SIZE 256 int main(void) { char buf[SIZE]; printf("input?"); while( fgets(buf, SIZE, stdin) != NULL){ buf[strlen(buf)-1] = '\0'; printf("]%s\n", buf); printf("input?"); } printf("end"); return 0; } とするして、input?Ctr+Z を入力すると最後のendが表示されません。 どうしてなんでしょう? printf("\nend"); にすると input?end printf("\n\nend"); にすると input? end になりました。
strcpy 使わないのが邪道ってこと? それとも "sage"[i] のこと? 後者なら、 char hex[9]; for ( int lpc = 0; 8 > lpc; lpc++, i >>= 4 ) hex[ 7 - lpc ] = "0123456789ABCDEF"[ i % 16 ]; hex[8] = 0; という程度なら邪道とは言えないのでは? より邪道っぽいのは以下。 char mes[100]; int i = 0; while ( i++[mes] = i["test"] );
>>592 世の中広いから、もしかしたら MSB が 0 番目ってマニュアルに書いてある
CPUがあるかもしれないけど、ふつーは、LSB が 0 じゃない?
8 ビットや 16 ビットで考えたとき、1 にしたいなら
MSB が 0 だと 8 ビットで 7, 16 ビットで 15 を指定しないといけない。
だけど、LSB が 0 なら CPU のビット数に関係なく 0 を指定できるし。
ちなみに MSB が 0 ではビットの重みと番号が一致しないのでばらばらに
なってしまう。
まず、レジスタでそう定義すると (MSB 31 .... 0 LSB )
エンディアンは関係しないのです。
勿論、メモリ上に読み書きするとエンディアンに応じたビットパターンが
書き出されるけど、それは別の話。レジスタに出し入れする段階で
自動的に処理されるから問題ないよね。
>>592 ビッグエンディアンはデータバスの最下位ビットがより上位のアドレスにマッピング
されるのでやっぱりLSBは0なのよ。
>>597 どうでも良いけど、[ i % 16 ]; は [ i&0x0f ]; にした方が良さげ。
>>600 iをunsigned intにするとi % 16と書いても出てくるコードが
i & 0xfになるコンパイラはあります。
16は0x10なのでわ?
>>602 あほらしすぎて突っ込む気にもなれん…
15 & 16はいくつだ?
15 % 16はいくつだ?
>>601 >>597 だけど、
>>600 はマイナスの場合を恐れていると思われ。
だからつまり、unsigned にすることで解決なのであってるんだけど。
もちろんコンパイルテストの時は unsigned にしたさ。
宣言部が落ちたのは申し訳も無し。
605 :
デフォルトの名無しさん :2001/06/30(土) 11:41
フルカラーを256色にきれいに減色する方法をおしえてください。 急いでいます。お願いします。
607 :
605 :2001/06/30(土) 13:32
>>606 カラーのままきれいにしたいのですが。
お願いします。
>>605 減色用アルゴリズムはいくらでも手にはいるし
ライブラリだって多く市販されている。
Cの話題じゃないからどっかいけ
610 :
605 :2001/06/30(土) 15:28
>>605 よし、じゃあ1から教えてやるから必ず実行しろ。
1.丈夫なヒモを用意する。長さは2〜3m程度でよい。
2.直径50cm程度の輪を作る。
3.輪が地上2mくらいになるよう、高いところから吊す。
4.輪の中に自分の頭を突っ込んで思いきりぶら下がる。
これでお前が抱えているすべての問題は解決する。
612 :
デフォルトの名無しさん :2001/06/30(土) 16:23
>iをunsigned intにするとi % 16と書いても出てくるコードが >i & 0xfになるコンパイラはあります。 intでもi%16uだったらOK?
613 :
デフォルトの名無しさん :2001/06/30(土) 16:27
>>601 それは最適化がかかってるだけ。勘違いしない方がいい
614 :
605 :2001/06/30(土) 16:35
615 :
デフォルトの名無しさん :2001/06/30(土) 16:41
>>605 フルカラーな色データをRGBそれぞれ上位ビットだけ取り出して
616 :
デフォルトの名無しさん :2001/06/30(土) 16:51
>>605 マジメにやるなら色ヒストグラム出して代表色にク
ラスタ分け。が時間がないなら 615 の単純量子化で
緑に重みがけくらいが一番よいかな?
>>613 何も指示しなくてもこの程度の最適化はやってくれる、という例なんだけど。
>>614 教えて君のくせに偉そうな口を叩くな。死ね。
619 :
デフォルトの名無しさん :2001/06/30(土) 17:23
>>593 str[5]からstr[99]の内容が、
・前者のやり方だと、ごみ
・後者のやり方だと、'\0'
になるんじゃなかったっけ。
あんまり意味ない領域だから、別にどうでもいいけど…。
>>618 611がネタ振ったつもりだったら煽られたくらいで乗るなバカ。
本気で言ってたんなら俺からも言わせて貰う。他人の苦しみを
理解できないおまえは生きてる資格がない。氏ね。
>>611 何も起こらんじゃねーか、どーしてくれる
>>621 あなたの場合は、充分太いワイヤーで直径80cmほどの輪を作り、
地上4m位の高さに吊す必要があります。
もちろん充分に頑丈な梁か枝に吊しましょう。
>>597 そうですね。
while(str[i++] = *("sage" + i));
なんてのも考えたんですけど、
そちらのほうが邪道っぽいですね。
>>619 そのとおりです。
まあ、メモリが0でクリアされてないとダメなときって
そう無いでしょうから。
あったらあったで0で埋めてからやればいいんだし。
626 :
デフォルトの名無しさん :2001/06/30(土) 22:04
argc, argvの読み方がわかりません。
オーグシー オーグブイ
あーぐしー あーぐぶい
630 :
デフォルトの名無しさん :2001/06/30(土) 23:13
argc,argvって何の略?
argument counter argument vector
632 :
NANASI :2001/06/30(土) 23:21
[0.0, 1.0) の非負 倍精度 浮動小数点実数の乱数返す関数教えてください。 drand48( )以外でおねげーしますだ。
>>632 そんなこと人に聞かないでマニュアル読め。
634 :
632 :2001/06/30(土) 23:49
マニュアルにあるか? 標準関数ではないでしょ。 double drand48(void){ double ans; ans=((double)(rand()))/32768; return(ans); } とりあえず自分ではこのくらいしか思いつかん。
635 :
デフォルトの名無しさん :2001/06/30(土) 23:52
> ans=((double)(rand()))/32768; 即値32768は何とかなりませんか。
下記のソースを実行すると、 Welcome to the real world. 27 Welcome to the real world. 4 と表示されます。なぜでしょうか? 文字数+'\0'=27ですから2行目の27は納得できますが 関数にポインタ渡しをすると配列のサイズが4になってしまいます??? Visual C++6です。 #include <stdio.h> void Sub ( char *Text ); int main( void ) { char Text[] = "Welcome to the real world."; printf ( "%s\n", Text ); printf ( "%d\n\n", sizeof Text ); Sub ( Text ); return 0; } void Sub ( char *Text ) { printf ( "%s\n", Text ); printf ( "%d\n\n", sizeof Text ); }
637 :
632 :2001/07/01(日) 00:49
>>635 なりますね・・・。
double drand48 ( void ) {
double ans;
ans = ( (double ) ( rand( ) ) ) / ( RAND_MAX + 1 );
return ( ans );
}
どうでしょう?
638 :
デフォルトの名無しさん :2001/07/01(日) 00:51
コールバック関数というものがよく理解できません。 こういうプログラムがあった場合、prt関数はコールバック関数といえるのでしょうか? 全然違う? #include <stdio.h> void function( void (*p) ( void ) ) { p(); } void prt( void ) { printf( "hello, world" ); } int main() { function( prt ); return 0; }
>>636 char *Text は配列ではありません。
char型データをさすポインタです。
だから、char *Textと宣言されているときのsizeof Textは、
VCのポインタのサイズである4になったのでしょう。
char Text[] = "xxxxx"
は、charの配列 "xxxxx"を初期値として持つ配列型変数です。
配列型変数に対して sizeof 演算子を適用すると、
配列の要素数*配列の要素のサイズ が得られることが決まっています。
配列と、ポインタ変数は、似て異なるものです。
641 :
>639 :2001/07/01(日) 01:02
636です。 詳しいレスありがとうございます。 しかし、Cは奥が深いですね・・・。 勉強し直します。
>>638 通常あるイベントに対し呼び出されるためにポインタとして登録される、
関数をコールバック関数といいます。以下典型的な例。
#include <stdio.h>
#include <stdlib.h>
void hehe(void){
printf("hehe\r\n");
}
void huhu(void){
printf("huhu\r\n");
}
void hihi(void){
printf("hihi\r\n");
}
void (*function[])(void)={
hehe,
huhu,
hihi,
NULL
};
int main(int argc, char* argv[]){
int i;
for(i=0;*function[i]!=NULL;i++){
(function[i])();
}
return 0;
}
>>641 君が浅いだけです.K&R全然薄いジャン.
645 :
638 :2001/07/01(日) 01:32
>>640 、642
レスありがとうございます。
でも642さんのプログラムって関数ポインタを使って関数を呼んでるだけですよね?
そういうのをコールバック関数っていうんですか?
たとえばWindowsの世界でいうコールバック関数でも やっぱり関数ポインタを使って関数を呼び出しているだけです。 引数、戻り値、リンケージのタイプなどに取り決めがあって、 実行時に呼び出し先を登録、変更したりできるものを コールバックといいます。 C言語的にいえば、ただの関数ポインタを使った関数よびだし になる場合が多いと思います。
>>645 もう少し具体的に書くと下のサンプルのようになります。
hoge()は0,1のイベントに対応する関数を登録すると引数に指定した
方の関数をコールバックします。
これらの応用でステートマシン等が簡単に記述できます。
#include <stdio.h>
void hehe(void){
printf("hehe\r\n");
}
void huhu(void){
printf("huhu\r\n");
}
void hoge(int i,void (*function1)(void),void (*function2)(void)){
printf("event=%d ",i);
if(i) (*function1)();
else (*function2)();
}
int main(int argc, char* argv[]){
hoge(0,hehe,huhu);/*イベントに0を与える*/
hoge(1,hehe,huhu);/*イベントに1を与える*/
return 0;
}
648 :
デフォルトの名無しさん :2001/07/01(日) 05:45
↓のヲ教えてくだされ!! 全体的にわかりません #include <setjmp.h> #include <signal.h> #include <stdio.h> #include <unistd.h> extern void jump_to_toplevel(int); jmp_buf toplevel; main(int argc, char *argv[]) { void (*sig)(int); if (setjmp(toplevel) == 0) { sig = signal(SIGINT, jump_to_toplevel); printf("You have five seconds.\n"); sleep(5); } else { signal(SIGINT, sig); printf("Inturrupted!\n"); return 1; } printf("Done!\n"); return 0; } void jump_to_toplevel(int x) { longjmp(toplevel, 1); }
649 :
デフォルトの名無しさん :2001/07/01(日) 05:49
>>648 ざっと見た感じだと、たとえばCtrl+Cのようなシグナルを受けたら
割り込み入ったら教えてくれるようなものかな?
実行すればわかるだろうけど・・・
大域jumpだな setjumpを呼ぶと0が帰ってくるので SIGINT割り込みのハンドラにjump_to_toplevelをセット、 その後五秒待機する。 何も起こらなければ5秒後に、Done!を表示して終わり。 SIGINTが発生すれば、 jump_to_toplevelが呼ばれる。 ここで、longjumpで、setjumpを呼んだところまで制御を戻し、 setjumpが0でない値を返したように振る舞う。 で、SIGINTを元の割り込みハンドラに戻して、 mainが1を返して終了する。
651 :
638 :2001/07/01(日) 12:37
>>646 ,647
レスありがとうございます。
関数のポインタを渡すことによって、渡した先でその関数を呼べるようなものと理解しました。
イベントによって呼ばれる関数のような、自分が直接呼ばない関数を記述するのに向いているわけですね。
652 :
デフォルトの名無しさん :2001/07/01(日) 12:50
あの・・・ コールバック関数は、OSから呼び出される ユーザープログラムと教わったのですが、 たとえば、Cではmain関数で、Windowsプログラミングでは WinMainとウィンドウプロシージャが コールバックだと・・・・ あれは嘘だったんですね?
653 :
638 :2001/07/01(日) 13:18
>>652 コールバック関数の使い道として「OSから呼びださせる」というのがあると理解すればいいのではないでしょうか。
654 :
デフォルトの名無しさん :2001/07/01(日) 13:21
MFCなどのフレームワークからも、でしょうね。
OSからだろうがライブラリからだろうが、(擬似)非同期で処理をする 時に使うもんだよ。 あ、でも非同期ってのも分からないんだろうな…
656 :
638 :2001/07/01(日) 13:50
どちらかというと、「非同期で処理をさせるのに向いている」だと思うのですが。
657 :
ただのばか :2001/07/01(日) 13:53
イメージ的には「○×が起こったら、このボタン押してね」って 感じですね。ボタンがコールバック関数にあたります。
>>ただのばか あたらねーよ.ボタンにつけるハンドラがソレだろ.
659 :
shige :2001/07/01(日) 14:21
ばーかばーか
661 :
デフォルトの名無しさん :2001/07/01(日) 14:36
>>658 -660
初心者が読むんだから少しは自重しろボケ
ビット演算、シフト演算がいまいちピンときません。 2進数、16進数などの良い参考書をご存知でしたら教えて下さい。 初心者なお願いで申し訳ないです。
664 :
デフォルトの名無しさん :2001/07/01(日) 16:09
86でもいいからアッセンブラを使って プログラムしてみる。そうするとイメージが湧く。
665 :
663 :2001/07/01(日) 16:49
>>664 すいません。アセンブラできません。
10進数や16進数を2進数(0と1の並び)で表示する関数を
自作して、それで勉強していますが、何かわかりやすい解説の載っている
本があればと思いまして。
>>665 自分でいろいろ試す、それが一番わかりやすいよ。
~,^,|,&,>>,<<
ビット演算子はこれで全部と思うよ
667 :
デフォルトの名無しさん :2001/07/01(日) 17:08
>>665 n 進法で l 桁の数 α = a_l a_(l-1) ..... a_1 a_0 は
l
α=Σ a_k * n^i
k=0
これじゃあかんの?
668 :
デフォルトの名無しさん :2001/07/01(日) 17:09
間違えた n^i -> n^k です。 激しく鬱。
669 :
デフォルトの名無しさん :2001/07/01(日) 22:47
いや、付随して覚えることも多いでしょ。 例えば2の補数表現とか、データ型によって シフト演算の意味が違うとか。 情報処理の問題集で練習ってのもありかな。 その辺は、クリアしてたらゴメン。
670 :
デフォルトの名無しさん :2001/07/02(月) 00:37
その内自然にできるようになるっしょ。
671 :
:2001/07/02(月) 20:31
キーボードから文字をCtrl-Dで終了するまで読み取り、 アルファベット、数字、その他に分類してそれぞれの数を数えて、 表示するプログラムを作る方法を教えてください。 改行文字も「その他」で数えてください。
>>671 >>1 をよく読めタコ
>だが、FAQに載ってる質問すると煽るぞ、ゴラア!!
>それに勘違いするな、俺は貴様の宿題を解いてやるほど暇じゃない。
while((c=getchar())!=EOF)isalpha(c)?a++:isdigit(c)?d++:e++; ほれ。もう来るなよ。
674 :
デフォルトの名無しさん :2001/07/02(月) 21:42
邪悪なCソースコンテストみたい。
675 :
デフォルトの名無しさん :2001/07/02(月) 22:16
>>675 そのスレ見て思ったんだけど。。。
2ch って思ったより優しいオニイタマが多いのね。
そうね、いろいろ(間違ったのもあるけど)ヒント あるのに自分でやる気一切なし、って感じ。 環境聞いても答えないし。
678 :
デフォルトの名無しさん :2001/07/02(月) 22:36
友達がintは4バイトではないとか言っているんですが ばかですよね。sizeofで調べても4バイトになるのに。 笑い飛ばしてもいいですか?
int はそのマシンで処理するのに最も適したサイズになります。 従って自分を笑い飛ばしなさい。
ネタですか? そうでないとしたら、 環境すっ飛ばしてintのサイズってわからないです。
わしがわかいころはのー int っていったら 2bytes だったんだがのー、さいきんのやつはせちがらいのー
682 :
678 :2001/07/02(月) 22:42
知らなかった。
おいおい
C++BuilderでPaintのプログラムを打ってるんですが、 Imageコンポーネントって具体的に言って、どういう働きをして どういうことができるんですか? あと、ビットマップとはなんですか?
686 :
初必者 :2001/07/03(火) 00:11
64bit処理系でgcc 使ってるのですが、ビットシフト演算は 32 以上は無理なんでしょうか? 対象はlong longです。 asm で書くしかない?
>>686 やり方はいくらでもあると思われ。
一例
#include <stdio.h>
#include <math.h>
long shiftleft(long long i,long j){
return i*(long long)(pow(2.0,(double)j));
}
long shiftright(long long i,long j){
return i/(long long)(pow(2.0,(double)j));
}
int main(int argc, char* **argv){
long long x=0xaa55ff00aa55ff00;
printf ("num=%x result=%x\r\n",x,shiftleft(x,45));
printf ("num=%x result=%x\r\n",x,shiftright(x,45));
return 0;
}
>>687 腕立て何回やれば....
じゃなくてやっぱり inline で asm で作るのが正解でしょうか?
げ、バグだらけ。これでどだ。 #include <stdio.h> #include <math.h> long long shiftleft(long long i,long j){ return i*(long long)(pow(2.0,(double)j)); } long long shiftright(long long i,long j){ return i/(long long)(pow(2.0,(double)j)); } int main(int argc, char **argv){ long long x=0xaa55ff00aa55ff00; printf ("num=%x result=%x\r\n",x,shiftleft(x,45)); printf ("num=%x result=%x\r\n",x,shiftright(x,45)); return 0; }
遅そう。
見掛け上、べき乗計算と乗除になってるけど コンパイラは、ちゃんとシフト演算にしてくれ るのですか?
>>692 なりません。関数なんだから。
それと細かいことですが、printf内部は %Lx にしておかない
と64bit表示にならないかと。
>>692 そのような最適化はしてくれません。
pow()はこの場合2のべき乗の整数演算ですので64個の配列による
ルックアップテーブルで高速化できます。
他にもlongのシフト演算に分けて計算する方法もあります。
インラインasmもモチロン選択肢に入れてよいでしょう。
つまり、そう言う最適化はコンパイラには期待できない ってことですね。ありがとうございました。
速度要求が厳しいので inline になりそうです。 やっぱ楽は出来ませんね。
こうやってPerlユーザが馬鹿にされて、コケにされて、侮辱されて、(当然のことだ) 顔を真っ赤にして耐えている姿を想像するだけで俺の気分は爽快になる。 Ruby万歳。俺にこんな快楽を与えてくれたRubyに幸いあれ。
とことん呆れた。Rubyユーザは板から出ていけ。
ローカルの配列の確保できる大きさの限界を知りたいのですが、どうしたらよい でしょうか?
>>699 おそらくそのマシンの機械語命令のディスプレースメント値
の上限次第だろうが、ローカル配列はスタック上に取られる
ので、あんまりデカイの使うのは感心しない。
という書き方は不親切だろうか?
701 :
デフォルトの名無しさん :2001/07/03(火) 13:09
>>699 allocaで確保し続けてSEGV捕らえてサイズを計算
702 :
デフォルトの名無しさん :2001/07/03(火) 13:25
alloca で割り当てられるサイズはマシン依存するので、 増分(いや減分か)をちゃんとしらべてな。 というかアドレスを表示すればいいのか。 それと、大抵はSEGVまでやらんでも alloca が NULL 返 すはず。
703 :
701 :2001/07/03(火) 13:49
>>702 allocaってきちんとNULL返すの?少なくともVC++の_allocaは
例外飛ばすって書いてあるよ。UNIX系の方は処理系依存でしょ
サイズも4KBずつとかで失敗するまで確保し続ければわかる
俺の若い頃はintは4bitだった。
705 :
:2001/07/03(火) 16:23
.libファイルってなんですか?
706 :
:2001/07/03(火) 16:24
.hファイルで関数作れると言っておきながら .libはどうなるんだよぉん〜
707 :
違 :2001/07/03(火) 16:32
>>704 つまり、アナタはもうすぐ米寿ってことですね?
708 :
デフォルトの名無しさん :2001/07/03(火) 16:36
質問。C言語の文法について。 externは「外部ファイルで定義されてるよ」という宣言。 グローバルスコープにあるstaticは「内部ファイルでのみ参照するよ」という宣言。 で、俺の認識は間違ってないでしょうか? 詳しい定義を知っている人は教えて下さい。 #どうでもいいがC言語の予約語の使い回しは何とかならないものか
>>708 間違ってないと思う。
予約語を使い回したいの?
>>709 レスサンクス。
>予約語を使い回したいの?
ではなくて、同じ予約語が複数の意味を持つのが嫌だ。
void func()と(void*)とか、今回のstaticとか。
>>708 C言語ではメモリも演算子も使い回しです
i = 10 * 10;
*p = &i;
とか
つまり、そーゆものだと割り切りましょう。
712 :
デフォルトの名無しさん :2001/07/03(火) 21:19
>>708 C++ではさらにstaticの意味が増えてるぞ。
予約語に振り回されるのが嫌ならlisp使いなさい
なにげにexternとか、ある用法を知らない人がいそうだ。
int i=3;
void func(){extern int i;printf("%d==3",i);}
>>712 クラスのstatic変数/関数、という意味?
他にもC++でstaticって拡張されたっけ
715 :
デフォルトの名無しさん :2001/07/03(火) 22:44
>>714 関数の中でexternを使うのは意見Cと互換性がありそうだけど、必ずextern "C++"
になってしまうんだよね。extern "C"とかやろうと思ってもエラーになってしまう。
>715 ごめん、詳しく教えて。 extern "C"って外部のアセンブラプログラムを 宣言するときの、「おまじない」程度にしか知らないので
>>716 extern "C"は見てのとおりリンケージをCの規則にするよ、ってことだべ.
なんで仕様書を参照せんのだ.
おい殺すな(汗)
>>717 いや全然見ての通りじゃないと思うのですが。
まぁ自分で調べますけど、その説明でexternを
知らない人が解るはずがないと思います。
>>718 仕様書を見た上での話じゃないのか?
まぬけだな。
722 :
デフォルトの名無しさん :2001/07/04(水) 13:38
連結リストをソートするのにいい方法ってありませんか? ソートは一通りわかるんですが、連結リストだとなんか大変なんで。
723 :
デフォルトの名無しさん :2001/07/04(水) 13:54
> 722 ケースによっては2分木にデータ構造を変更する。 ソートの必要がなくなる。
725 :
715 :2001/07/04(水) 22:38
>>719 仕方ないので少しコメントするよ。
C++の外部リンケージはデフォルトではextern "C++"になる。このリンケージでは、
リンカに渡すことになるシンボルが、関数の引数情報を処理系依存の方法で関数名
に追加した形式になるのに対して、C言語との互換のためにあるextern "C"では、
そうした型情報がシンボルに反映されない。
関数内でextern宣言した場合、extern "言語"のような宣言をすることが許されな
いので、C++式の型情報を含んだシンボルしか参照することができない。
通常、extern "C"とextern "C++"の違いは関数に対するものだけど、処理系はオブジ
ェクト型に対しても、その型情報をシンボルに含めることができる。実際Visual C++
などではそうなっているような感じ。
つまり、extern "C++"以外のリンケージについては、必ず関数の外で宣言しないと
いけないということ。namespaceについても似た状況がある。
Cスレでなにいってんの、このひと?
727 :
725 :2001/07/04(水) 22:55
>>726 Cで作成した成果物を有効利用するために必要なノウハウだよ。
Cスレでなにいってんの、このひと?
729 :
デフォルトの名無しさん :2001/07/05(木) 00:35
725 の内容はCスレだからこそ大切なことだと思う。 #何故かわからない人はシステムの include ファイルの中を見てみよ #う。見ても「こんなのC++のためだろが!」とか言ってる奴はこ #の世では既に必要とされない人間だ。 古巣のいごごちの良さに味をしめ、巣を飛び出せない弱虫カコワルイ。 目を覚ませ。
730 :
デフォルトの名無しさん :2001/07/05(木) 01:04
signed int の値 n を b ビット右シフトした 値を 0 に向かって丸める式を教えて下さい。 例えば、n = -1, b = 1 ans = 0 n >> b; じゃだめみたいです。
731 :
デフォルトの名無しさん :2001/07/05(木) 01:07
わかりづらいのでもうすこし。 1 ビット右シフトするということは 2 で割ることに近似するので -1 / 2 = -0.5。 -0.5 は 0 に向かって丸めると 0。 答えは 0。 綺麗な式になるんでしょうか?うーん…
あ、でもこんなのはナシです。 return (signed int)( (float)n / (float)pow(2,b) );
733 :
フツー :2001/07/05(木) 01:22
これでいいかな? return (n + (n < 0)) >> b;
>733 ありがとうございます。えっと…これでいいのかな。 ちょっと検算しています。(^^;
b=1のときはいいのですが b=0 や b=2 以上になったとき
ちょっと合わないみたいです。
n=-32767 b=2 ans = -32767/4= -8191.75= -8191
(n+(n<0))
>>2 =-8192
なかなか難しいです…。
736 :
デフォルトの名無しさん :2001/07/05(木) 05:03
n / (1 << b) じゃだめなの?
>>735 こんなんは、どうや?
return ( (n<0) ? ((signed int)-((unsigned int)-n>>b)) : (n>>b) ) ;
738 :
デフォルトの名無しさん :2001/07/05(木) 07:05
0に向かって丸める方法
正なら単に右算術シフトだけすればいい
負数なら 色々あると思う。
思いついたのは
1)符号反転して処理した後符号反転する
if(n<0) return -(-n>>b); else n>>b;
2) (1<<b)-1を加算してから右算術シフトする
retur ( n +( (1<<b) -1 )&(n
>>32 ) )>>b;
>>715 externの使用方法がextern "C", extern "C++"しかない知らん厨房逝ってよし!
C++でも
>>714 の書き方は正当な書き方で、もちろん
int i=3;
int main(void) { extern int i; cout << i; return 0; }
と書いても正当だ。
また、ここでexternを省略し、
int i=3;
int main(void) { int i; cout << i; return 0; }
とすると動作が変わってしまう。
結論:715は知ったか厨房 なんか反論ある?
>>739 凄く恥ずかしいよ、君。あれリンケージタイプの話だぞ。
extern の仕組みがわかってない消防逝って良し! と言われないように、謝るか、釈明するかしてくれ。
>>740 > あれリンケージタイプの話だぞ。
確かに
>>725 はリンケージタイプの話であり特にこちらも異存はないが、
C++ではexternはリンケージタイプの指定だけに使われる予約語ではないし、
Cではexternはリンケージタイプの指定に使われる予約語ではない。
ここまで言えば
>>715 は
> 凄く恥ずかしいよ、
ってゆーのがわかるだろ?
わからんな。
>>715 が言ってるのはローカルスコープではリンケージタイプが
選べんので賛否両論あるだろうと言う話で、別に
>>714 を否定して
いる訳ではない(思いっきりtypoってるので真意は測れないが)。
キーワードはローカルでの関数の extern 宣言だ。mangled-name
にならんように出来んって話だと思う。
まあ715が舌足らずなのは確かだが、プログラマならそれくらい
理解できんか?
744 :
デフォルトの名無しさん :2001/07/05(木) 11:37
C/C++習得度の問題というより日本語習得度の問題になってるね。 何故彼らは相手を攻撃するだけが目的の自分の幼稚な文章自体が、一番 厨房臭く見えてしまうことに気付かないんだろう?
>>744 真実よりも勝ち負けを優先するのは受験戦争を勝ち抜くための
鉄則です(w
>>743 >
>>715 が言ってるのはローカルスコープではリンケージタイプが
> 選べんので賛否両論あるだろうと言う話で、別に
>>714 を否定して
> いる訳ではない
うん、否定はしていないが飛躍はしている
Cでは通常externとは外部参照を指定する予約語なのに
何故、C++のリンケージの指定というものを言い始めたのだろう。
話が飛躍しすぎ
この疑問の仮説として思い浮かんだのが
「externの使用方法がextern "C", extern "C++"しかない知らん厨房」
>>744 > 何故彼らは相手を攻撃するだけが目的の自分の幼稚な文章自体が、一番
> 厨房臭く見えてしまうことに気付かないんだろう?
同意。ところで、1バイト情報の無い書込みをageる奴も厨房臭くない?
# 厨房って自分の厨房臭さに気づかないから厨房でいられるんだね。
こりゃだめだ。全然わかってない。 相手にするな>初必者
750 :
744 :2001/07/05(木) 12:28
>>746 なにが「同意」だ。あほか。おまえのこと言ったんだよ。
>>748 ,他以下の疑問に答えてくれ
int foo(void) { return 1; }
int main(void) { extern int foo; cout << i; return 0; }
上記の場合
>>725 の理由により駄目だろう。が、
int i = 3;
int main(void) { extern int i; cout << i; return 0; }
の場合、extern宣言したのは関数でもないし、構造体でもない。
それでも駄目なのか?その場合、何故駄目なのか?
>>750 > あほか。おまえのこと言ったんだよ。
何故
>>750 は相手を攻撃するだけが目的の幼稚な文章をageるんだい?
やっぱりオヤジ臭と一緒で自分の厨房臭って解らないみたいだね。
752 :
学生 :2001/07/05(木) 14:54
ちょっと話がそれちゃうけどいいですか? CマガにC++入門講座って言うアセンブラのコードも 眺めながら学んでいこうって感じで連載やってるんですが、 このアセンブラのコードを自分で見たいときはどうやって見るんですか? コンパイラはbccしか持ってないです。
753 :
デフォルトの名無しさん :2001/07/05(木) 15:06
マニュアル読め. どうせこぴ物で持ってねーんだろ.
754 :
735 :2001/07/05(木) 15:09
>>736 単純な割算なので可能なら除算は…
>>737 -738
-(-n>>b) は INT_MIN あたりの挙動が難しいのでキャストが
必要になりそうです。分岐はちょっとネックになるかもしれないです。
キャストや(1<<b)-1をあらかじめ加算するのはテクニカルですよね。
これ以上高速な方法は…ないですね、たぶん。(^^;)
脳に汗かきました。(^^;) ありがとうございます。
>>753 つか、フリーの bcc の話でしょ?
>>752 -S
つーか、引数無しで起動すると option の説明でるやん。
756 :
初必者 :2001/07/05(木) 15:18
>>752 bcc についてるのかどうか知らないんだけどデバッカが
あればそれで動作を追っかけると非常に勉強になります。
良かったらお試しあれ。
757 :
デフォルトの名無しさん :2001/07/05(木) 15:30
ちなみに何に使うの?ホントにINT_MINとかMAXも必要なの?
758 :
学生 :2001/07/05(木) 15:52
>>755 >>756 ありがとー。出来たよー。
それと、4月号のこの連載のFig.1っておかしくないんでしょうか。
759 :
デフォルトの名無しさん :2001/07/05(木) 16:20
どんな絵?どっかに上げてよ.
760 :
デフォルトの名無しさん :2001/07/05(木) 17:06
>>751 int i = 3;
int main(void) { extern "C" int i; cout << i; return 0; }
って書けたらいーねってことじゃね?
>上記の場合
>>725 の理由により駄目だろう。が、
へ?
761 :
学生 :2001/07/05(木) 17:18
int foo; int bar; これをgccでC++としてコンパイルすると 上の方省略 .globl foo .bss .align 4 .type foo,@object .size foo,4 foo: .zero 4 .globl bar .type bar,@object .size bar,1 どこがおかしいと思ったかは、一番下はsize bar,4じゃないの?かです。 アセンブラは全く分からないので.bss .align .zero あたりも 怪しい気がするけど、こんなもんかな程度に気に止めてます。
>>760 > int main(void) { extern "C" int i; cout << i; return 0; }
> って書けたらいーねってことじゃね?
もし可能ならば
int main(void) { extern "C"{ int i; } cout << i; return 0; }
だろうな。
C/C++では関数内で関数が定義できないんで別に関数内でリンケージ指定の
externはできなくとも違和感は感じない。
763 :
初必者 :2001/07/05(木) 18:09
>>760 腹立ったのだろうがエサをやるな。
762を見れば程度はわかるだろう。
764 :
760 :2001/07/05(木) 18:21
>>762 extern "C"とかってのが、以前のexternの拡張ってのは理解してる?
例えば、
extern void f();
ってのは、
extern {
void f();
}
と等価。書き方のスタイルの問題といわれればそれまでだけども。
Cで言う
extern [型宣言文];
ってのがC++では、
extern "言語りてらる" [型宣言文];
って書けるようになったの。
つまり、externでいままでどおり外部リンケージを指定すると共に、
"C"などを指定することで名前解体をしないことをコンパイラに教えてるの。
だから、もし可能ならextern "C" int i;でへーきだと思うけろも。
この場合の{}は複文を一度にextern宣言する意味しかないよ。
例えばC++での
extern "C" int i;
は、Cで
extern int i;
と書いた場合と同様のリンケージ動作を期待して書くの。
たぶん、この辺でわからなくなってるんだと思うけど。。。
>>763 だって、かわいそうで見てられないのよ、なんか(笑
766 :
初必者 :2001/07/05(木) 18:24
>760 やめとけ。何度かやったが、その度に自分に都合の良いように 意見を変えるタイプだから、また君の発言から得た情報で頓珍 漢な反論をしてくるだけだぞ。
ちなみに、 >"C"などを指定することで名前解体をしないことをコンパイラに教えてるの。 って書いてるけど、 もちろん"C++"って書くと名前解体されるよ。突っ込まないでね(++
769 :
初必者 :2001/07/05(木) 18:34
>>761 余計なことでゴチャゴチャしちゃってゴメンね。
.size bar 1 がメモリ確保のディレクティブなのかな?
なら確かに変ですね。.align に付いてはプロセッサが
大きなデータを読むときの境界を指定するものです。
データ・アラインメントとかのキーワードで調べてみて
下さい。
770 :
デフォルトの名無しさん :2001/07/05(木) 21:37
Ada、BCPL、C、C++の次はDelphiか…
だからあんたたち、Cスレで何書いてるの? つっこみどころ多すぎて笑える
どうも 739 は理論で勝てなくなると必死になってこの手を使うようだ。 そういえば上のほうにもあったな。
739じゃないよ。 でも上の人たち739と同じくらい勘違いしてるって気づかない?
気付かないからちゃんとどこが勘違いか書けよ。 場合によっては認めるから。
C++の話題はスレ違いだっていってるんだけどな。 いいや、今からここはC++スレだ。
>>776 あのさあ、ちゃんとこのスレ読んでる?適当にこの辺だけ読んでるのか?
ちゃんと1からこのスレ読んでる? いや、でもいいよ。C++スレだから。
やっぱおまえ739だろ。
780 :
デフォルトの名無しさん :2001/07/06(金) 01:14
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | extern "C"とextern "C++"はリンク時に影響するからな \__ _________________ ━━━∨━━━━━━━━━━━━━ _Mona Mona@ItteyoshiChubodomo iii■∧ / ━ (,,゚Д゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ ( ゚Д゚) (゚Д゚; ) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | Cスレでなにいってんの、この人 \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ . ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 引っ込みつかなくなってんだよ、きっと \_______________________
はぁ。。。AA出した時点で負けを認めたようなものだよ。
782 :
デフォルトの名無しさん :2001/07/06(金) 01:17
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | やっぱおまえ739だろ \__ _________________ ━━━∨━━━━━━━━━━━━━ _Mona Mona@ItteyoshiChubodomo iii■∧ / ━ (,,゚Д゚) / ━━━━━ ∧∧━━ ∧∧ | つ ∇ ( ゚Д゚) (゚Д゚; ) | |┌─┐ /⊂ ヽ /⊂ ヽ 〜| ||□| √ ̄ (___ノ〜 √ ̄ (___ノ〜 ∪∪ | | || ━┳┛ || ━┳┛  ̄ ̄ ̄ ̄| | ====∧========== / ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | まるで野獣だよ \____ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ . ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 氷魚が休みだからなあ。今日は。 \_______________________
あら、図星でしたか。これは失礼。
784 :
デフォルトの名無しさん :2001/07/06(金) 02:20
確かにここはCスレだけど、 間違ってることほったらかしたままでいいわけがない。 いろんな人が読むのよ。 まぁ、スレ移動して続けるのも手だけれども、もう終わってるけど(笑) モナー貼ってイヤミ言うくらいなら、だまってろ。スペースが無駄。
786 :
学生 :2001/07/06(金) 08:12
>>769 親切に答えてくれてありがとー。
スレ違いみたいだしまた来ますね。
分類学的にいえばC++は、Cから派生したものでCであるといえるが、 CはC++であるとはいえない。 よってCに関わるC++の話題は良し。
>>714 , >>初必者
> extern "C"とかってのが、以前のexternの拡張ってのは理解してる?
知らなかった...。
> externの使用方法がextern "C", extern "C++"しかない知らん厨房逝ってよし!
> C++ではexternはリンケージタイプの指定だけに使われる予約語ではないし、
> Cではexternはリンケージタイプの指定に使われる予約語ではない。
この発言は撤回する。
また、自分が無知なのを気づかず
>>714 を厨房呼ばわりしたことを謝罪する。m(_ _)m スイマセン
あと、初必者に無礼な口を利いていたことを謝罪する。m(_ _)m モウシマセン
あっ、
>>750 には無礼な口を利くのは当然なので謝らない。
あと、C++の話題はスレ違いだっていってる奴とかAA貼り付けてる奴と
同一人物だと思われているようだが人違いだ。
で、これからの話題は議論ではない、純粋な質問。
(続く)
>>788 > あっ、
>>750 には無礼な口を利くのは当然なので謝らない。
君さ、そんなことだから何時までたっても”厨房”なんて呼ばれるんだよ。
文体からしてかなり若そうだけど、君が言われるのは「精神が厨房」なんだ。
純粋な質問などと能天気なことしようと思ってるらしいけどさ、態度を
改めるのがさきじゃないか?
>>788 > 714は
>>715 の誤り
>>789 > 態度を改めるのがさきじゃないか?
俺が先に無礼な口を利いた人には謝罪し、態度を改めた(と自分では思っている)
煽り目的に無礼な口を利いた奴には謝る必要がない(と自分では思っている)
715や初必者には謝る必要があると思ったが、750には謝る必要性が感じられない。
やはり、質問しようとしていろいろ調べてみたが、
C++全体に関する自分の知識不足を痛感した。
もう少し調べる時間が欲しいので今回のやりとりはこれで終わりにしたい。
>>789 750について謝る必要があるかどうか、
まだ続けたいんだったらその話題は別スレッドにしてくれ。
多分、スレ違いなので...。
>>790 > 715や初必者には謝る必要があると思ったが、750には謝る必要性が感じられない。
だから餓鬼だって言われるんだ。
そう感じられないんだったら口に出すな(これくらいのことも分からんのか)。
>>792 おいおい。あんたももうやめんさい。彼も少しは成長したんだから
いいじゃん。
>>793 情けないねぇ。
俺が739をやりこめようとしてるとでも思ったのか?
俺は「技術板の利用方法」などという大それた議論をやりたいわけじゃない。 表面上反省したかに見える(こう言われてもしかたないのだぞ)739のような 書き込みを放っておくべきではないと思ったから、忠告しただけだ。 トリガーとなる発言さえ少なくなればよいのだ。
おいおい、ガキの喧嘩はよそでやってくれ。 技術問題で、お互いの思想をぶつけ合った喧嘩は たとえその思想が幼稚なものであってもそれなりに面白いけど、 単なる口喧嘩はここでやる必要は無し。
798 :
デフォルトの名無しさん :2001/07/06(金) 14:50
ギャハハハハ、煽りうまいね、チミ。
自作自演
248,663で質問した者です。みなさんありがとうございました。
801 :
C初心者その2 :2001/07/08(日) 01:08
Win2000のDOS窓用ソフトを動かすのに バックスラッシュ、|、/、を同じ場所で連続表示させて、くるくる回ってるみたいな ものを表示してみたいのですが、どんな方法があり得ますか?
>>801 ちょっとウェイトした後バックスペースで消して表示、を繰り返す
>>801 サンプル
#include <stdio.h>
int main(int argc, char** argv){
long i,j;
char c[4]={'|','/','-','\\'};
for(i=0;1;printf("%c\b",c[i=(i++)%4]))for(j=0;j<10000000;j++);
return 0;
}
>>803 えーん
最適化最強にしたら空ループが消えちゃったよ〜
805 :
デフォルトの名無しさん :2001/07/08(日) 02:22
>>803 はんぱじゃないくらいバグバグだね...
#include <stdio.h>
int main()
{
for (int i = 0; ; i++) {
putchar("|/-\\"[i % 4]);
for (volatile int j = 0; j < 10000000; j++)
;
putchar('\b');
fflush(stdout);
}
}
806 :
デフォルトの名無しさん :2001/07/08(日) 02:23
あぁ、fflush()と\b逆だな...
807 :
デフォルトの名無しさん :2001/07/08(日) 02:24
/**/#include <stdio.h> /**/ /**/int main() /**/{ /**/ for (int i = 0; ; i++) { /**/ putchar("|/-\\"[i % 4]); /**/ fflush(stdout); /**/ for (volatile int j = 0; j < 10000000; j++) /**/ ; /**/ putchar('\b'); /**/ } /**/}
808 :
デフォルトの名無しさん :2001/07/08(日) 02:25
くそっ、タコのこと胃炎な…鬱 /**/#include <stdio.h> /**/ /**/int main() /**/{ /**/ for (int i = 0; ; i++) { /**/ putchar("|/-\\"[i % 4]); /**/ fflush(stdout); /**/ for (volatile int j = 0; j < 10000000; j++) /**/ ; /**/ putchar('\b'); /**/ } /**/}
809 :
デフォルトの名無しさん :2001/07/08(日) 02:26
/**/#include <stdio.h> /**/ /**/int main() /**/{ /**/ for (int i = 0; ; i++) { /**/ putchar("|/-\\"[i % 4]); /**/ fflush(stdout); /**/ for (volatile int j = 0; j < 10000000; j++) /**/ ; /**/ putchar('\b'); /**/ } /**/}
810 :
デフォルトの名無しさん :2001/07/08(日) 02:26
a b <pre> a b </pre>
>>809 forの中に変数宣言をするのは止めて・・・
812 :
デフォルトの名無しさん :2001/07/08(日) 02:32
ヤダ
>>809 intが16bitで無限ループになると見た。
>>813 int main()で書くなら戻り値を書くべき。
ワーニングが出るぞ。
失礼。814は809へ。
816 :
デフォルトの名無しさん :2001/07/08(日) 03:44
817 :
デフォルトの名無しさん :2001/07/08(日) 03:54
>>814 カタカナで書くならウォーニングだぞ…
CDワークマンでもいいのか?
まったく恥ずかしいな.
プレイステーションアワードも同じくらい恥ずかしいが.
>>817 いまだにそんなこと言ってる君のほうが100倍恥ずかしいんだけど
823 :
801 :2001/07/08(日) 06:19
801です。 DOSプログラミングな本を見たら座標が云々で、点を打つ関数がどーのこーのと書いてあってサパーリ でしたが、こんな方法で実現できたんですね。 そもそもなんでこんなことを思ったかといえば、Linuxの起動時にスキャンディスク の様なのがはじまって、パーセント表示と共に、この棒がくるくる回っててどうやって ルンダろうと思ったのです。 コードの量から些細なことみたいですが感動しました。
>>817 は、ウォークマンをwarkmanと思っている厨房。
>>822 あぁ、814もその程度のレベルがあればいんだけどね…
>>824 warkならワークでいーだろがボケ.辞書くらい轢いてからにしろ.
827 :
初級者 :2001/07/08(日) 15:44
あの、上の方にあったんですが、 i = (i++) % 4 ってiの値は変わりませんよね? それとも仕様上不貞なのでしょうか?
828 :
デフォルトの名無しさん :2001/07/08(日) 15:47
(1) % 4 = 1 (2) % 4 = 2 (3) % 4 = 3 (4) % 4 = 0 (1) % 4 = 1 : :
830 :
デフォルトの名無しさん :2001/07/08(日) 15:52
>>827 仕様上は不定なので、
なにが起こるかわかりません。
んなわけはないんだけど
たとえばそのコードでプログラムが止まっちゃうようなコンパイラがあったとしても
よいことになってます。
>>830 だから辞書くらい引いてからにしろって.
ホントにバカ丸出しだな.
>>809 iがオーバーフローして負数になった時表示が不正になるとみた。
>>826 ウォークマンはworkmanだろ(w
意味わかってんのか? ボーケ
warsman の方が強いと思われ
840 :
デフォルトの名無しさん :2001/07/08(日) 17:05
>>827 アセンブラレベルまで考えれる人間には何の問題もないのは一目
瞭然。言語論で遊んでるトイプログラマ達は勝手にやってて、っ
て感じ。
でも自分はそーゆーコードは書かない、ってとこだな。
841 :
デフォルトの名無しさん :2001/07/08(日) 17:38
>>sage warkなんて単語うちの辞書には載ってないぞ。 だから意味を教えてくれ。
842 :
初級者 :2001/07/08(日) 17:51
>>836 とりあえずANSI C的には未定義のようですね。
バカなアセンブラ上がりのまぬけなコードにぶつからないように
祈るバカりですね…
843 :
デフォルトの名無しさん :2001/07/08(日) 17:56
いつの間にか目的と手段が入れ替わるバカが多いな。
844 :
ふぇ :2001/07/08(日) 17:58
ANSIバカはCの歴史を思い出せ
845 :
初級者 :2001/07/08(日) 18:01
>>844 う〜ん、複数のコンパイラでマトモに動くものを作るには
ANSI等の標準規格に依存するしかないと思うのですが?
どんな歴史ですか?
>>827 1行にコードを集積する事が良い訳ではない。
??? それを言うにはちと例題が悪いのでは?
>>840 そういうコードは書かないという根拠が、
ANSI/ISO規格なんじゃないの?
>>805 -からこっち書いてある事がでたらめばかりじゃないの?
24時間常駐している奴が約1名居るようだしな。
ANSIの規格がどーたらと言った難しい話の前に、早くwarkの意味を書けよ。
850 :
デフォルトの名無しさん :2001/07/08(日) 22:40
854 :
rms :2001/07/08(日) 23:06
855 :
デフォルトの名無しさん :2001/07/08(日) 23:09
>>854 ピンぼけだねぇ。
それとも最近のautoconfはi=i++をどこでも同じに動くことを保証して
くれんのか?
>>855 i=i++;
と
i++;
って、たいていの場合は同じだよな。
でも、そんなの書くな。
i++,i=i と同じ場合もあるし、そうでない場合もあるんだってば
>>851 >>804 辺りからあげ足の取り合いスレになっているから自然な
流れなのでは?
>>852 Warkmanという人名はあるみたいだね。
でもwalkやworkと間違えているお間抜けな人が凄くHITするのは
気のせい?
>>853 良く判らないけれど、そのサイトの高校生はSONYのwalkmanを
warkmanと間違ってるんじゃないの?
SONYのサイトで検索してもwarkmanはヒットしないし。
まぁバッタもので有るかも知れないね。
859 :
デフォルトの名無しさん :2001/07/08(日) 23:34
>>855 >>857 そんなコード書かなきゃいいだろ
i=i++の結果を保証して欲しけりゃJavaに逝け
860 :
C初心者 :2001/07/08(日) 23:38
auto型char配列 char str[10]; があるとします。この時、以下のコードは全て同じ意味(結果)になりますか? A: memset( str, 0x00, strlen(str)); B: memset( str, '\0', strlen(str)); C: memset( str, 0, strlen(str)); D: str[0] = '\0'; E: str[0] = 0; F: str[0] = NULL; G: strcpy( str, ""); 要は初期化です。 また、AからGまでどれも同じ結果が得られる場合、一般的に どれが良いコードでしょうか。 それとも、auto型は初期化しないのが普通ですか? 初心者な質問ですみません。よろしくお願いします。
>>860 A-Cはそもそも初期化されていない配列に対する strlenが未定義なので
同じかどうか以前にダメ。
D-Gはおなじ。
どっちかっつーと Dがまともな書き方。
E, FはUNIX系に多いタイプ量を減らした書き方。
Gはたぶん馬鹿にされるからやめとけ。
>>860 これに答えたらまたあげあし取りする気?
最近のこのスレのパターンだしね。
マジに知りたいのなら初心者スレで聞く事をお勧めする。
>>860 結果は同じには、ならない。
使う時は、どんな初期化が必要化考えてから、
好きに初期化すれば良い。
864 :
デフォルトの名無しさん :2001/07/08(日) 23:44
Gはなんで馬鹿にされるんですか?
865 :
デフォルトの名無しさん :2001/07/08(日) 23:46
Fもダメだろ。
866 :
デフォルトの名無しさん :2001/07/08(日) 23:48
>>860 strlenじゃなくsizeofならば、A−Cの中ではBが一番まともかな。
全クリアでね。
DはA−Cとはまた違う意味で初期化。
Fは厳密に言うと間違い。
Gは無駄。
>>860 結果は同じになる。
行頭に全角文字があるから全てコンパイルエラー。
エラーメッセージが違うけどな。
Gは効率は悪いけど読みやすい。俺は良く使う。
>>865 Fは、厳密にはいいみたい。
でも、かっこわるいから、やめといた方がいいね。
870 :
C初心者 :2001/07/08(日) 23:59
すばやい回答ありがとうございます。
>>861 >A-Cはそもそも初期化されていない配列に対する strlenが未定義なので
>同じかどうか以前にダメ。
つまり、変数に何か入れる前には strlen は使えない、と言う事でしょうか?
strlen の戻り値が10になる保証は無い、という意味ですか?
Fはまれに NULL が ((void *)0) と定義されている場合があるようですが……。
Gは他人のコードに書いてあった記述なのですが、
見た時ちょっと違和感があったので。
やはりDが無難でしょうか。
>>862 そのような気は毛頭ありません。本当に初心者です。以前にもこのスレで
お世話になりました。
860は何処に行った?
そゆこと。
862だが申し訳ない。疑心はよくないね。 strを文字列として使う限りGは不正じゃないですよ。 Fは#define NULL -1である処理系も有り得ますからNGです。 866の言うように全初期化が紛れがなくて良いと思います。
>>870 >つまり、変数に何か入れる前には strlen は使えない、と言う事でしょうか?
strlenが、どのような関数なのか考えて下さい。
>Fはまれに NULL が ((void *)0) と定義されている場合があるようですが……。
それを知っているなら、使うべきではない。
>Gは他人のコードに書いてあった記述なのですが、
>見た時ちょっと違和感があったので。
問題はない。ただ、そんな事で関数を使うべきでもない。
>やはりDが無難でしょうか。
Dか、strlen(str)をsizeof(str)に換えたB。
使う時は、どちらが必要なのかを考えて。
揚げ足取るつもりじゃないけど、 NULL != 0な処理系ってどんなの?
>>873 >Fは#define NULL -1である処理系も有り得ますからNGです。
その、処理系がNGだと思うのは俺だけ?
処理系に依存せずNULLポインタは常に0だよね。 その上で NULL という名前のマクロを 0 以外に定義する処理系は NGだとおもう
>>875 0番地付近にレジスタをアサインしている処理系は保護のため
NULL=-1として逃げている場合が多いようです。
NULLポインタの実体(アドレス値)が0でなくてもいいのはしってたけど 実際の定義が0でないのは初耳。 thx
880 :
デフォルトの名無しさん :2001/07/09(月) 00:20
Gの場合は""という文字列が確保され、その文字列がstrにコピー されると思うのですが、確保された""はどうなるのでしょうか?
>>878 それは、コンパイル後のコードの問題であって、
Cの中で、NULLポインタが0でないものは、NGだと思う。
>>877 整数として評価されたときに0になるだけだよ。
883 :
C初心者 :2001/07/09(月) 00:22
>>873 ありがとうございます。
結論としては、
memset( str, 0x00, sizeof(str));
これがベストということでOKですか?
「全初期化が紛れがなくて良い」とおっしゃるのは、str[0]からstr[9]までの
10バイトがすべて0になるから、先頭だけ0にするより安全、と
いうことですよね。
プログラムの静的領域に "" の形で置かれます。 動的に確保されるわけじゃなくて、プログラムのデータ領域をロードしたときに すでにそこにある、と思ってください。
正数として評価というのが果てしなく謎なんだけど、 ポインタが 0 と等しいかどうか比較する ポインタが 0 と等しくないことを比較する ポインタに 0 を代入する だけ、Cは特別扱いしてるだけだよ? 中に何の数字が入っているかどうかは、処理系依存。 でも、上に上げた比較の都合で、不定ポインタをNULLという 名前で定義してるわけだから、 0以外の値になってるってのは、その処理系がおかしいと思うなあ。 ダメプログラマが勝手に定義した値じゃなくて?
>>883 個人的には、「0x00」ではなく、「'\0'」の方が良いと思う…。
ついでに、「0x00」を使うなら、「0」と等価なので、
他の定数を使ってるなら、それらと合わせた方が、見やすいかも…。
おもしろいからマターリ論議しようね。
889 :
C初心者 :2001/07/09(月) 00:53
訂正します。 memset( str, '\0', sizeof(str)); これがベストのようですね。 皆さん、ありがとうございました。 >888 とても勉強になるので、マターリしたいのはやまやまなのですが、 眠くなってまいりました……。
890 :
デフォルトの名無しさん :2001/07/09(月) 01:11
returnで帰ってくる値を日本語で表す場合、 ポピュラーなのは「返り値」「戻り値」「リターン値」のどれですか。 上にない他の言い方でもOKですので、教えて下さい。
返り血 戻り血 痢痰血
(・∀・)血でソースを検索するとイパーイ出てくるよ!
>>890 どれでもいいんでないの?
あまり一般的ではないけど「関数値」という言い方もあるね。
895 :
デフォルトの名無しさん :2001/07/09(月) 01:39
>>891 -895
こうやってみると、呼び方は沢山あるようですが、
ポピュラーな呼び方は、ないようですね。
これからは、周りに合わせて適当に呼ぶようにします。(日本人的考え)
どうもありがとうございました。
>>896 まぁその3つがその順でポピュラーじゃないか?
それ以外は業界の変人だ!
業界の変人は、世の中では普通の人間?
>>898 いいえ。もっと変人です。さらにその中の変人が天才と呼ばれます。
漏れの上司はリータンヴァリュウといいます。 聞こえるたびに思考が途切れて困ります。
903 :
デフォルトの名無しさん :2001/07/09(月) 10:55
クイックソートを作るって課題がでました。ちょっとわからないので 皆さんお願いします。 さー、みんなで考えよー
>>903 次スレッドに持ち越しだな。
新スレ立ててくれたら考えてあげるよ
>>849 英辞郎 on the Webにはエントリーがありました。発音は不明。
http://www.alc.co.jp/ wark
【名】 痛み
【自動】 痛む
アメリカのOn line dictionaryのサイトをいくつかわまってみましたが、
エントリーのあるdictionaryは見つからず。
ただ、大物のOxfordが会員制(無料?)のため調べることができず。
906 :
デフォルトの名無しさん :2001/07/09(月) 13:46
質問があるのですが 4(1-1/3+1/5-1/7+・・・・・・・) を求めるプログラムで()の中を つくろうとしたのですが #include<stdio.h> int i; double a,b; main() { a=1; b=1; for (i=1;i<100;i++){ b = b+2; a = a + 1/b * pow(-1,i-1); } printf("a= %d",a); } じゃうまくいきいません。 どこがいけないのでしょうか?
908 :
デフォルトの名無しさん :2001/07/09(月) 15:35
じゃあ何をつかえばいいんですか??
910 :
デフォルトの名無しさん :2001/07/09(月) 15:42
項ごとに符号がかわるとこがよくわかんなくて・・・・
(i%2)*2-1
i&1?1:-1
913 :
デフォルトの名無しさん :2001/07/09(月) 15:51
powのかわりに(i%2)*2-1でいいんですか? 超初心者ですいません。
>>910 動くかな?
double a=0,b,f=1;
for(b=1;b<200;b=b+2)
{
a=a+1/b*f;
f=-f;
}
a=a*4;
printf("a=%f\n",a);
あー、どういう仕組みか解らんのなら使わん方が良いよ c=1 と置いてループ中に c=c*-1 するも良し 偶数項と奇数項でループをわけるでも良し
a=0,b=1; for(i=1;i<100;i++){ a=a+1/b-1/(b+2); b=b+4; } とかね
age
918 :
デフォルトの名無しさん :2001/07/10(火) 22:38
偶数か奇数の判定をしたいのですがどのような方法がありますか? 2で割ったあまりを調べる以外に。
920 :
918 :2001/07/10(火) 22:42
>>919 大量に調べる場合はそっちの方が早いんでしょうか?
他になんか手あるの?
>>920 つまり、 if(a%2) と if(a&1) とどっちが速いか?
>>923 オレが測るの? たぶん a&1 の方が速い?
>>924 ごめん、誤爆。
俺もbit演算だと思うけど、結局どっちも同じになる環境ってあるかもね。
実際にやって、はかって、納得してみるのがいいよ
>>920
926 :
ひよこ :2001/07/10(火) 23:20
ふと疑問に思ったので質問させていただきます。 関数を作る時、 sample(int a, int b); のように 引数を作ると思うのですが printf(); 関数などは引数が使用者によっていくらでも増やすことが できますよね? このような関数はどうしたら作れるのでしょうか
... だっけ?
>>926 K&R本の可変引数リストの項を読めばいいんじゃない?
#include <stdarg.h> int monaprintf(char *p, ...) { int rc; va_list ap; va_start(ap, p); rc = vprintf(fmt, p); va_end(ap); return rc; } int main() { }
930 :
918 :2001/07/11(水) 00:36
ありがとうございました。 計測してみます。
931 :
デフォルトの名無しさん :2001/07/11(水) 22:29
int main() { int i; double data[10]; for(i = 0;i < 10;i++) { printf("%d番目の数字を入力してください : ",i+1); scanf("%f",&data[i]); } printf("\n入力されたデータは以下になります。\n"); for(i = 0;i < 10;i++) printf("%f\n",data[i]); printf("\n"); return 0; } 実行して数字を入力すると、変な数字が表示されるのですが なにが悪いのでしょうか?
932 :
デフォルトの名無しさん :2001/07/11(水) 22:35
どっか悪いところあるか?チキショウ! #include <stdio.h> #define MAX_NUM_DATA 100 #define MAX_NUM_HIST 10 #define FILENAME "prog8_d.txt" int read_data( char *filename, int *data, int N); void print_hist( int n ); main(){ int data[MAX_NUM_DATA]; int hist[MAX_NUM_HIST]; int n; int i; int idx; n = read_data( FILENAME, data, MAX_NUM_DATA ); for( i=0 ; i<10 ; i++ ){ hist[i]=0; } for( i=0 ; i<n ; i++ ){ idx=data[i]/10; if(idx==10)idx=9; hist[idx]=hist[idx]+1; } for( i=0 ; i<MAX_NUM_HIST ; i++ ){ print_hist(hist[i]); } } int read_data( char *filename, int *data, int max_data ){ FILE *fp; int n; int d; if( ! (fp=fopen(filename, "rb")) ){ fprintf(stderr,"could not open file %s\n", filename); return(-1); } n = 0; while( n<max_data && fscanf(fp,"%d",&d)==1 ) data[n++] = d; return(n); } void print_hist( int n ){ int i; for( i=0 ; i<n ; i++ ) putchar('*'); putchar('\n'); }
>>931 float data[10];
にしてみよ。さすれば汝救われれれれ.
934 :
デフォルトの名無しさん :2001/07/11(水) 22:55
>>932 一応つっこんでおこう
#define MAX_NUM_HIST 10
の意味がないところがあるぞ…
936 :
932@研修期間 :2001/07/11(水) 23:46
くっそ〜…それだけですか? なんか、prog8_d.txt読み込めないぜ! クビがかかってるからアセるぜ〜…
937 :
デフォルトの名無しさん :2001/07/11(水) 23:49
>>936 というか、社会人が宿題以下の問題を持ち込んだのは
あんたがはじめてだよ。(大爆笑)
938 :
デフォルトの名無しさん :2001/07/11(水) 23:53
あのー、ちょっとおたずねしたいのですが、 -- qwe.h -- typedef struct QWE { : } Qwe; -- asd.h -- typedef struct QWE Qwe; struct ASD { Qwe *pQwe; : } -- asd.c -- #include "qwe.h" #include "asd.h" : -- any.c -- #include "asd.h" : とかやると、asd.c では、同じtypedefを二回やることに なりますよね。 今使っているコンパイラでは全然警告も出ずに、 これでいけてるんですけど、これって規格上でも おっけーなんでしょうか。
939 :
デフォルトの名無しさん :2001/07/11(水) 23:55
940 :
932@研修期間&鬱 :2001/07/11(水) 23:57
>>937 くっそぉ〜…!!
営業で入射したんだけどね…
いつのまにか、プログラマーの新人に回されたのさ!
自分はメールくらいしか出来ないんだけど、何でやねん!
とりあえず、第一関門でクビになったら給料半月分しか出ないッスよ。(泣)
941 :
デフォルトの名無しさん :2001/07/11(水) 23:58
fp=fopen("0.txt","r"); 0.txt〜29.txtまでをランダムで開きたいのですがどうすれば良いでしょうか? i=rand()%30 fp=fopen(%d".txt","r",i); これじゃだめですよねぇ どうすればいいのでしょうか?
942 :
デフォルトの名無しさん :2001/07/12(木) 00:00
943 :
デフォルトの名無しさん :2001/07/12(木) 00:02
sprintf ってもんがあるでしょー
>>941
944 :
932@研修期間&鬱 :2001/07/12(木) 00:04
このスレの人達は 漏れに半月分の給料で ガマンしろとおっしゃっている。ああ、おっしゃっているとも! エラー0だけど、何で読み込めないんだ〜!!
945 :
デフォルトの名無しさん :2001/07/12(木) 00:06
946 :
デフォルトの名無しさん :2001/07/12(木) 00:06
sprintfですか? Cやり始めて3ヶ月でまだ使ったことがない文ですが 早速今から試してみようと思います ありがとうございます
>>944 prog8_d.txt
の中身がわからんのに答えられるか。
scanfは実務じゃ使わないがな。
948 :
932@研修期間&鬱 :2001/07/12(木) 00:12
>>947 ぐお!すいません!
12
46
76
23
65
34
9
57
4
…(中略)
20
63
数字の間は「・」みたいので区切られてる。
コピペしたら改行された…くっそ〜!
949 :
デフォルトの名無しさん :2001/07/12(木) 00:15
>>948 >数字の間は「・」みたいので区切られてる。
それが原因だよ(大爆笑)
950 :
デフォルトの名無しさん :2001/07/12(木) 00:16
>>948 ファイルを一括で読みこんでstrtokで「・」を抜け
952 :
932@研修期間&鬱 :2001/07/12(木) 00:18
>>949 え?じゃあどうすれば…
爆笑されまくってるな…くそ!営業マンはつらいヨ
953 :
デフォルトの名無しさん :2001/07/12(木) 00:21
i=rand()%30 sprintf(motxt,"%d.txt",i); これで1〜30.txtをランダムで出せるようになりましたが ファイルオープンの仕方が良く分かりません 自分ではこうしてみましたが fp=fopen(%s,"r",motxt); コンパイルできません 何処が間違ってるのでしょうか?
954 :
932@研修期間&鬱解消ぎみ :2001/07/12(木) 00:23
しがない営業マンに やさしくしてくれたみなさん、ありがとうございます。 ドキュソな私にも理解できそうな 気がしてきたので、あとは自力でがんばります。 (くっそ〜…あと、9問もあるぜ〜。もっと難しいのが)
956 :
デフォルトの名無しさん :2001/07/12(木) 00:27
>>953 それだと0〜29.txtだね(大爆笑)
958 :
デフォルトの名無しさん :2001/07/12(木) 00:28
>>955 ぎゃあ
fp=fopen(motxt,"r");
良く見たらこうでした
この先不安だ(ポインタとか)
959 :
デフォルトの名無しさん :2001/07/12(木) 00:29
>>957 i=rand()%30+1
すんまそん
>>932 でも、チミのコードは比較的素直で読みやすい
961 :
修士一年 :2001/07/12(木) 04:02
さあ問題 int i; int b[90]; for(i=0;i<10;i++) b[i]=i*10; さあ,b[0]〜b[9]までの数字を文字化けせずに どうディレクトリ内の"result.dat"に書き込むにはどうすればよいか? 簡単すぎるよな。やっぱり。
962 :
デフォルトの名無しさん :2001/07/12(木) 04:42
>>961 「文字化けせずに」というのが分かりません。
普通にテキストファイルで書き出せばいいの?
「ディレクトリ内」というのはカレントディレクトリですよね?
963 :
デフォルトの名無しさん :2001/07/12(木) 05:20
>>961 copy con result.dat
0
10
20
30
40
50
60
70
80
90
^D
>>962 「自分でやってみたら文字化けした(しかも自分では理由はわかっていない)」に1500カノッサ
自分でやってみたがうまくいかなかった、はよい傾向。 age
>>961 &963-965
文字列ではないものに対して、文字化けするって、どういうことだ?
おおかた値を直接書き出したんだろう
fprintfでも使え
>>961