漏れは32才。22年間、父SHOW-Aにプログラムを叩き込まれてきた。
いろいろな言語を極めたが、一番漏れになじんだのはCだった。
Cのことなら父をも超えた。疑問な点があったら漏れに聞け。
便所とメシ食ってる時以外は暇だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。あと、至急父に仕事を与えてやってください。
コンパイラ、過去ログなどのリンクは
>>2-5 あたり
乙〜
zuza
お前らちゃんと寝たのか?
11 :
デフォルトの名無しさん :02/09/07 09:35
新スレage
12 :
デフォルトの名無しさん :02/09/07 09:44
二次元配列の先頭ポインタを返す関数はどう書けばよいのですか? 引数ならvoid h(int (*i)[5])のように書きますが。
13 :
デフォルトの名無しさん :02/09/07 09:52
14 :
デフォルトの名無しさん :02/09/07 10:12
>>13 それを見ながら色々試してみましたができませんでした。
できないものだとあきらめます。
15 :
デフォルトの名無しさん :02/09/07 10:27
わーい、WinMeのクラシックソリティアで300秒切ったー!!
>>12 出来たような気がする・・・↓
----------------------------------------------
typedef int D2[][2];
D2 d2_a = {{1,2},{3,4},{5,6}};
D2 *
get_d2_a () {
return &d2_a;
}
main () {
D2 *d2 = get_d2_a ();
int i;
for (i = 0; i < 3; i++) {
printf ("%d,%d\n", (*d2)[i][0], (*d2)[i][1]);
}
}
----------------------------------------------
C:\WINDOWS\デスクトップ\aa>gcc a.c
C:\WINDOWS\デスクトップ\aa>a
1,2
3,4
5,6
C:\WINDOWS\デスクトップ\aa>
----------------------------------------------
17 :
デフォルトの名無しさん :02/09/07 14:38
コメントをプロプロセッサが取り除いてもいいんですか?
プロプロでいいんですか?
きちんと変換されたから気づかなかった(-_-;) プリプロセッサ
int a=100; if(!a) とやると,ifはどう言うふうな条件になるの?
21 :
デフォルトの名無しさん :02/09/07 15:05
>>20 どうって・・・aが偽なら真だろ?
具体的に言うとaの値が0なら。
>>21 ありがとん
if(!a && !b && c => d)
とかも可能?
memset(array,1==2,sizeof array/sizeof array[0]);
無意味なもの書いたうえに間違っているな・・・ sizeof arrayだけだ。わっちゃまずい。
if(!a && !b && c >= d) の間違いだった
c => d ここは? 下げ進行?
文法上OKじゃないな =>を見落とした^^;
>>17 「取り除いてもいいんですか?」って言うけど、
じゃあ逆に取り除かれると、まずいの?
むしろ、取り除かれなくてもいいの?
typedef enum { false = 0, true = (!false) } boolean; とかやると幸せになれるだろうか…。
31 :
デフォルトの名無しさん :02/09/07 15:55
>>30 なんで(!false)と括弧で括っているんだろう?
#defineならわかるが。
というかtrue=1でいいのでは? !0は必ず1を返すって聞いたよ。
33 :
デフォルトの名無しさん :02/09/07 16:21
ていうか、 if(?)のとき?が 0なら偽、それ以外は真と考えろといわれたんだが、 この考え方で危ないと切ってある?
35 :
デフォルトの名無しさん :02/09/07 16:37
>>33 それで正しい。でも!0のとき必ず1が帰ってくる仕様はとても便利
36 :
デフォルトの名無しさん :02/09/07 16:43
>>34-35 それが仕様であるわけですね?
if()以外でも、たとえば A ? B : C でもこの考え方でOKでつか?
37 :
デフォルトの名無しさん :02/09/07 16:48
int a = 10; if ( 9 < a < 10) printf("9 < a < 10"); else printf("!(9 < a < 10"); これを実行したら, 9 < a < 10 と表示されました。 これはコンパイラのバグでしょうか?
>>37 それ、ちゃうねん…。
そういうコトがしたい時はこうする。
int a = 10;
if ( a < 9 && a > 10 ) {
printf("9 < a < 10\n");
} else {
printf("!(9 < a < 10)\n");
}
9 < a && a < 10
>>39 ああ、そっちの方が分かりやすいな。無意識にやっちまったよ。
9 < a < 10 これは↓こんな感じ? 9 < a <10 ↓ 1(true) < 10 ↓ 1(true)
9 < a < 10 って左から結合するのかな (9 < a) < 10 まぁ常に真だわな
うわ、遅れカブタ
あ…条件式間違ってるんだね…欝死。
なるほど、わかりました。 a = 10 として 9 < a && a < 10 って書くと (9 < a) -> 1(true) (a < 10) -> 0(false) ってなって、 (9 < a && a < 10) -> (true && false) -> true ってことですね。
>>46 ちょっとまて、なんでtrue&&falseがtrueになるんだよ(笑)
いや、間違えた。 (9 < a) && a -> 1(true) ((9 < a) && a) < 10 -> (1 < 10) -> true でいいんですね? これでレベルが少し上がったかな。
本物の37は俺じゃー オブ戦スレからコピーしてきただけ。
オブ船ってなに? ヒーローものか?
52 :
デフォルトの名無しさん :02/09/07 17:11
オブ戦なんて言われてるんだ。
本物の37です。このスレに投稿したつもりがオブ戦にいっていましたか。 時間を置いてみたらちゃんとあったのでちゃんとC俺に書き込んだと思っていたんですが。 ちなみに48は偽者です。
C俺 と来たか
まあまあ、新しい略語もわかったことだし
じゃあ、本当の質問ね。 1 < a < 10 のときって左から順番に処理していくのって仕様なの? 本当はこれがききたかったの。
仕様です。
>>36 OK。
if か ? : かは関係ない。
>>60 実際に処理(評価)される順序と結合順はまた別の話。
結合という意味で書いたのなら、左から順番でOK。
むしろ、a < b <= c = d < ... < z みたいな 複合的な多項演算子?を許す言語ってあんのかしら
65 :
デフォルトの名無しさん :02/09/07 18:11
Cを実務で使ってる方はやはり基本情報程度のC言語の問題なら10分少々で解けたりするんですか? 漏れは2か月前くらいからCを勉強しはじめて、一問解くのに1時間以上かかる事もあるのですが、、、、
>>65 2ヵ月で抱く疑問じゃないよそれ。1年やっても私これだけなんですがって
いうならわかるが。。。
基本情報のCの問題は実際にコンピュータ上で動かすのが難しいところが難点。
基本情報ってどんなの?
できないって言っているわけじゃないよ。 同じ機能を持った実在する関数を探すのが大変ってこと。
C言語自体はずぶの素人だったのですが去年まではFortranを多少かじった程度とはいえ使っていたので プログラミング自体は全くの素人ではないんです。それに2か月間けっこう勉強したから、それでもこれだけ時間かかってしまうのは センスないのかなー って思ってしまいます。
再帰処理の問題ならクイックソートでも出せばいいのに、なんで図形描画なんだか・・・
ワイルドカードってなに?
*
75 :
デフォルトの名無しさん :02/09/07 19:32
ワイルドアームってなに?
76 :
デフォルトの名無しさん :02/09/07 19:35
Javaの質問もOKですか?
ファイルって,どのくらい分割している? 一つのファイルに関数15個以上って,おかしいかな?
>78 類似機能単位に分けるべし。 関数の数が多い少ないだけで判断するのはイクナイ!
80 :
デフォルトの名無しさん :02/09/07 20:41
CPUがPen3の750MHzなんですが、こんなへぼマシンでもC言語を使えますか?
81 :
デフォルトの名無しさん :02/09/07 20:43
82 :
デフォルトの名無しさん :02/09/07 20:43
extern HDC hDC;
void func(){
//....................
}
ってな感じで分割コンパイルでの外部クラスでデバイスコンテキストを指定すると
エラーになるんですが、対処方法を教えてください。
お願いします神様
>>1
84 :
デフォルトの名無しさん :02/09/07 20:54
>>83 何がどうエラーになるんだよ・・・
ネタならもっと上手く書け
>84 いいからやってみ
bakaaho.c bakaaho.c(1) : error C2061: 構文エラー : 識別子 'hDC' がシンタックスエラーを起こしました。 bakaaho.c(1) : error C2059: 構文エラー : ';'
構文エラー';'がhDCの前に必要です。 予期せぬEOFが検出
88 :
デフォルトの名無しさん :02/09/07 21:09
前スレがあがってるので。
だめだ。消えた。そりゃそうか。 includeするように。
91 :
デフォルトの名無しさん :02/09/07 21:35
プログラムのサイズをできるだけ小さくしたいのですが、何かこれは!ってのありませんか〜
>89 インクルードしたらまともに動いた。 サンクス! 2chも役に立つもんだw
プログラム本体から付属ファイルを呼べるだけ呼ぶ。 あとは念力。
96 :
デフォルトの名無しさん :02/09/07 22:16
>>91 余計な機能付けない。
GUIに凝らない。
コメントつけない 空白作らない
>>91 初期化コードなど二度と実行されない領域をワークエリアに
使うテクニックは試されましたか?
>91 それは簡単。機能を最小のサブセットに限定する。
>91 それは簡単。七行プログラミングスレに行く。
>91 PCのスペックをあげて相対的に小さくする。 つーか今時Cごときのコードを肥大化させる方が難しいよ。
毎回少しずつreallocを使って,サイズを増やしていく方法と, 連結方式をとる方法どっちがいいですか?
memcpyって処理が重いですか?
105 :
デフォルトの名無しさん :02/09/07 23:17
>>103 内容による。毎回ってどのぐらいの頻度?
>>104 なにと比べて重いといっているの?
同じことを実現するのにこれ以上早い方法はCにはない
106 :
デフォルトの名無しさん :02/09/07 23:18
取引先の会社でメチャメチャ長い変数名を使っている人がいるんですけど、 そういう人はエディターが特殊なんでしょうか? 変数名が FromOracleSequelToOffice とか そういう変数名使ってるんで、わかりやすいといえばこれ以上無いくらいわかりやすいんですけど ちょっと手直しするときにも、すごいめんどくさいんです。 こういうのってヒストリー機能付きのエディターとか使っているのでしょうか? 何かVCでも使えるいいアイディアがあったら教えてください。
107 :
デフォルトの名無しさん :02/09/07 23:19
>>106 ネタ?
Ctrl-Space押してみろ
>>106 VCならCtrl+Spaceで補完が使えるはずだけど。
カブ-タ
悲しい・・・・ ネタじゃなかったですよぉ。
うーむ。106は前スレの野球ゲーム君ほどのインパクトがないなぁ。 神降臨キボンヌ
共用体がいまいちよくわかりません。 tp://www.ncad.co.jp/~komata/c-kouza7.htm を見たんですが,なんで100じゃなくて,300になるのかとか, どういう状態で共有しているのか等がわかりません。
共用体は各フィールドのメンバの先頭アドレスを揃えるだけのことしか しません。エンディアンの問題はコンパイラが一切関知しませんので ユーザの責任において使用する必要があります。
>>112 1つづつ増えていくとすると300回realloc呼ぶ可能性があると?
それはリストにして追加していったほうがいい。
素人は(C歴1年半),手を出さない方がイイ? バグったらいやだしなぁ
117 :
デフォルトの名無しさん :02/09/07 23:34
アルゴリズムのお勧めの本は? (初心者向きの)
>>115 最大で300回。
しんどそうですが,リスト構造習います。
2時間ぐらいでなんとかなるか。
>> 118 最大値が決まっているならポインタの配列にすれば?
>>118 それらのデータは順次参照のみ?
途中への追加や削除はあるの?
>>119 次サイズ変えるときとかに,汎用性が・・・
まー配列にすればいいことはいいんだけどね
でもこれだと,いつ動的に配列確保を使うの?
1つが1Mのビットマップなのですが
123 :
デフォルトの名無しさん :02/09/07 23:47
char A=0; A = A+1; これは、 まず Aがint型にキャストされ、 int型で計算され、そのあと char型にキャストされるの? それとも 1が(char)にキャストされchar型で計算されるの? まさか実装依存なんてことは無いと思うが。
>>120 ないです。
配列として,for分とかで参照していきます。
>123 (・Α・)私のキヲクが確かならばぁ〜 計算時は器の大きいほうで計算。 代入時は左辺に合わせる。
>>113 > なんで100じゃなくて,300になるのかとか,
作者が間違っているような気が...。
この作者、構造体の代入で...
> 多くのCコンパイラは代入は構造体のメンバー1つ1つをコピーします。
なんて書いてるぐらいだから、よほど古い処理系を使っているか、昔の知
識のままでとまっているか、Web の更新をしてないかのどれかだろうね。
128 :
デフォルトの名無しさん :02/09/07 23:59
void *pData; pData = (void*)"test data"; if(pData) printf("%s\" , (char*)pData); これはなにをやっているのでしょうか? こんなの文法的に間違ってますよね。
>>121 BITMAP *list[300];
int cur = 0;
// 追加
list[cur] = malloc( size );
++cur;
// 削除
free( list[n] );
--cur;
list[n] = list[cur];
順番が変わったら困るなら、リスト調べてくれ
ちょっと工夫すれば変わらないように出来るから。
>>129 かなりイイですね
でも300回も別々に確保してたんじゃあ,マズーじゃあ?
>>128 文法的に間違ってるのは "%s\" ← ここだけだな。
>>128 うん、間違ってる。printf() のフォーマット文字列が閉じれてない。
ちなみに、printf("%s\n", (char*)pData); と修正して、実行すると
うちの処理系 (VC++6) では、"test data" と表示されたが、あなたの
処理系でどうなるかはわからない。
133 :
デフォルトの名無しさん :02/09/08 00:16
>>128 なにをやってるって・・・みたまんまですが?
>>130 すまん、言ってることが見えん
> 次サイズ変えるときとかに,汎用性が・・・
毎回サイズ変わるんだよな?
realloc はコピーコストが掛かるのを問題にしているんじゃないのか?
>>134 > 次サイズ変えるときとかに,汎用性が・・・
これは,今は300だけどそのうち500になるかもしれないしという事
>realloc はコピーコストが掛かるのを問題にしているんじゃないのか?
しちょります
情報隠蔽(カプセル化)をしたいのですが, いまいち感覚がつかめません。 例えば,mapというファイルに, static char map[100]; void InitMap(void); void GetMapAdr(char *); というふうにして,毎回呼び出し側の関数で,GetMapAdrでmapのアドレスを 得ながらやっていくのでしょうか? こういう考えでいくと,5つの変数を使うときなどは,その関数の最初に 5回もアドレスを得なくてはいけません。
>>135 > これは,今は300だけどそのうち500になるかもしれないしという事
そういうことか、
> でも300回も別々に確保してたんじゃあ,マズーじゃあ?
から読めんかったよ、ただあれは
> 最大で300回。
とあったから、サンプルとして書いただけで、、
つか、103=112=121=130=135 で合ってますか?
138 :
デフォルトの名無しさん :02/09/08 00:47
140 :
デフォルトの名無しさん :02/09/08 00:55
>>103 そのわりにはいっていることが微妙に変わっている気がするのは...
142 :
デフォルトの名無しさん :02/09/08 00:58
というより
>>103 は何をしたくて、そういう処理を考えてるのか
説明汁。
大きいのがほしくなったら 大きいのを取得して コピーして 古くて小さいのを消す
144 :
デフォルトの名無しさん :02/09/08 01:02
>>143 それはちょっと避けたくないか? パフォーマンスが悪すぎる.
関数をメンバにいれるには,どのようにすればいいのでしょうか?
147 :
デフォルトの名無しさん :02/09/08 01:06
>>146 1.クラス内に追加する。
2.関数を追加したいクラスを継承して追加する。
よそから提供されてcppファイルのないクラスなら2しかできない。
自分で作ったクラスなら1でいいと思う
>>146 typedef struct{
void (*a);
}c;
いつからC++相談室になったんだ?
これで実装できない? c.a=func; だめか?
152 :
デフォルトの名無しさん :02/09/08 01:25
単純に、 struct{ void (*func)(); }tag_str; でいいだろ。
typedef structの場合は? typedef struct{ }c; だった場合,c.func()ってなるの? 戻り値の型が違ったりしているのも,メンバに含んでもイイのかな?
int calc(int x) { return x * x; } typedef struct { int (*func)(int x); } crass; int main(int argc, char **argv) { crass t; t.func = calc; printf("%d\n", t.func(3)); } こうかな。
>>154 これって、インスタンス毎に初期化するの?
Cだと構造体のメンバをstaticに出来ないんだね、今知ったよ。
>>154 ありがとう
普通は,そういうプログラム組む人いないよね?
VC++ 6.0では10KBくらいのDLLを作ることって、できますか? 小さなコードをDLLにしても、20KB以上の容量になるんで、 バイナリエディタで覗いたらNULLがいっぱい… このNULL文字の列は何か意味があるんでしょうか? MFCはスタティックライブラリを使用する設定になっています。
void showA(struct Monna *a, char* *id, int* position, char* *name) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ こういう 文字列リテラルの参照渡しっこんな感じでいいんすかね? つーか、やっていいのかな?
ズレた(`・ι・´) はぁ・・・
>>160 つまり、
void showA(char **name)
{
*name = "sage";
}
こういうことをやっても問題ないだろうか
ってこと?
そうなら、別に問題ない。
>162 えっと、 void showA(char **name); void showA(chae **name){ printf("%s\n",(*name)) } void Main(){ char *name="microsystems"; showA(name); } みたいな感じです。よさそうっすね。 (゚∀゚)サンクスコ !
#include<stdio.h> void showA(char* *name,int* age); void showA(char* *name,int* age){ printf("name:%s\nage:%d",(*name),(*age)); } int main(){ int age=43; char *name="microsystems"; showA(&name,&age); return 0; } ちょっと上違ったけど、できました。 これって値渡しより、関数呼び出し時に、新しい変数領域が確保されないので 効率的なんすよね?
char* *name とかって、普通に使われてるものなんでしょうか。 素朴な疑問なんですけども。
163も164も、ポインタにして渡す必要はまったくない。 (ついでに 163 はうっかりミスが2ヶ所あるよ) > これって値渡しより、関数呼び出し時に、新しい変数領域が確保されないので > 効率的なんすよね? 渡すのが構造体/共用体ならともかく、整数では 効率が下がることはあっても、上がることは (通常の処理系では)考えられない。 それどころか、呼び出し側の最適化を邪魔することに なるので、ほとんどの場合、処理が遅くなってしまうはず。 Cの場合、参照渡しと言うよりも「ポインタの値渡し」なんだから、 引数用の領域(それがスタックであれレジスタであれ)が使われる ことには変わりない。
>167 >164が修正版っす。 やっぱり意味ないのですか〜 処理の負荷は上がって、メモリ効率はよいような気が。 引数の部分で(呼び出し元の変数がコピーされて)無駄に消費 されるのではないかな、と考えたわけですが。 上のようにポインタの値渡しをすれば、 引数用の領域には呼び出し元の変数へのpointerが格納されるのかと。 違うのかなぁ^^;そこら辺はコンパイラの最適化の範疇なんでしょうか。
>165 呼び出し先で、呼び出し元の変数の値を変更(同期)したい場合 なんかによく使われるのでは。あ、コーディングスタイルの問題?
>>164 のコードは何でダブルポインタ使ってるのか分からん。const char* で十分でそ?
intがポインタになってるのも分からん。何なんだよ?
>>168 > 上のようにポインタの値渡しをすれば、
> 引数用の領域には呼び出し元の変数へのpointerが格納されるのかと。
これだけは合ってるよ。
だから、(元の変数の領域とは別の) 引数用の領域に
char** と int* が入るか、
char* と int が入るか
の違いでしかない。
どちらも引数用の領域を必要とすることには変わりない。
その領域のサイズは処理系に依存するが、たとえば
UnixとかWin32なら 前者でも後者でも4*2バイトだね。
> そこら辺はコンパイラの最適化の範疇なんでしょうか。
最適化というより、呼び出し規則が決まってるのが普通。
実際のところ、どんな処理系を使ってるの?
>171 Linuxでgcc3.2っす。
>>172 だったら使われる引数用の領域のサイズにも違いはないよ。
32ビット整数で表現できるのに、それをわざわざポインタに
して渡してもメリットはない。
結論として、ポインタの値渡しを使う場面は、 1.配列、構造体などのサイズのでかいものを渡す時 2.呼び出し先で引数として受け取った変数を、呼び出し元と 同期させたい時 ということで宜しいのかな。まぁ、細かいとこでは他にもありそうだけど。
>>175 当たり前の事を何を偉そうに結論しておるのかと小一時間
>176 ううY(>_<、)Y 175みれば当たり前なんでハマってました。 他にも巧妙な使い方があるのかと、期待もして書いたわけですが。
178 :
デフォルトの名無しさん :02/09/08 08:23
いつからこのスレはポインタスレになったんだ?
>>152 関数を追加するのと関数ポインタを追加するのは全然違うじゃない。
素直にできないと言いなよ
180 :
デフォルトの名無しさん :02/09/08 10:52
>>179 言っている事が全然分からんが?
もし、関数の "実体" を構造体内に入れる事が出来たとして、
それが関数のポインタで代用(?)する場合と
実用上どういう風に「全然違う」のか是非説明してくれ。
(もしかして初期化するのが面倒だなんていいたいのか?
本当にそうならば、そんな事する前にその関数を構造体に
入れる "必要性" を教えてくれ)
もしかしてC++のメンバ関数なんかもナイーブに
class 内に "コピー" する事で実現されているなんて
思っちゃってるの? (プ
>>180 はいはい、くだらないことをいってるしったか君、ごくろーさま
>>180 が正論。
>>179 が無知。
> もしかしてC++のメンバ関数なんかもナイーブに
> class 内に "コピー" する事で実現されているなんて
> 思っちゃってるの? (プ
そんなことになったら sizeofの結果が恐ろしいな。
>>180 > もしかしてC++のメンバ関数なんかもナイーブに
> class 内に "コピー" する事で実現されているなんて
> 思っちゃってるの? (プ
そんなこと一言も言っていないが?
もしかして実体をコピーしなければいれることにはならないと思っているのか?
構造体には関数は追加できない。だから関数ポインタで擬似的なことをする。 C++のクラスの場合はその実体が関数ポインタだとしても言語の仕様上関数を追加できるだろ?
C言語もメンバをstaticに出来れば、そんなことにはなりませんな。
>>180 関数へのポインタって変数だよ。分かっている?
188 :
デフォルトの名無しさん :02/09/08 11:52
>>184 >もしかして実体をコピーしなければいれることにはならないと思っているのか?
お前の言う「いれる」の意味を問いたい。問い詰めたい。小1時間問い詰めたい。
お前、ただ "struct{void f(void){}}" って書きたいだけちゃうんかと。
Cの構造体に関数を追加できるなんて言ったら大恥書くぞ。
ところで、C++のインライン関数ってまさに実体をコピーするんじゃないの?C++はよくしらないんだけど。 スレ違いでスマン。
>>190 「大恥 "書く" ぞ」
「C++のクラスの場合はその実体が関数ポインタだ」
なんて言う方がもっと恥をかくと思うが。。。
193 :
デフォルトの名無しさん :02/09/08 12:02
int main __P((int, char *[])); ↑ これはいったい何?
>>193 #define _P
なんで括弧が二重なんだ?(^_^;)
言う(話す)時は文字は使いません。と言ってみるテスト。
「言ってみる」という罠
197 :
デフォルトの名無しさん :02/09/08 12:14
ポインタ変数の値をアドレスというと叩かれるけど、&ooの&はアドレス演算子っていいますよね? なんでですか?
>>185 あんたの言ってることも間違っちゃいないさ。
でもな、そういうのを世間一般では
「単なる揚げ足取り」とか「無知」と呼ぶのさ。
Q) Cで文字列を表示するにはどうすればいいですか?
普通のA)
一例としては、stdio.hをincludeして printf を使え。
185のA)
C言語の仕様上の話では、文字列という概念はない。
よって不可能だ。
Cで文字列を扱えるなんて言ったら大恥かくぞ。
ごめんなさい。 そう決まっているんだからしかたないですよね。
Cならなんでもできる。
世界お金持ちクラブの歌 歌:ヘドロ おカネ おカネ おカネ おカネ おカネ おカネ おカネ おカネ お金さえあれば 何でも手に入る ドレス イヤリング 真珠の首飾り マンション 別荘 建て売りマイホーム 車飛行機自家用潜水艦キャビアフォアグラ松茸に数の子 お金さえあれば 幸せになれる 我ら世界お金持ちクラブ
>>200 どっちもどっちって、他方は誰のことを指してるの?
185が揚げ足取ってるだけに見えるが。
>>191 全然違うよ。
>>193 古いコンパイラでもコンパイルできるように
プロトタイプ宣言を使い分ける時の方法だね。
前もって
#define __P(x) x
と宣言すれば、
int main (int, char *[]);
と展開され、
#define __P(x)
と宣言すれば、
int main ();
と展開される。
204 :
デフォルトの名無しさん :02/09/08 12:28
指定したディレクトリ内にあるファイル名を参照したいです。 どうすればいいですか?WinMeです。
>>203 すごく分かり易い解説、ありがとうございまふ。
206 :
デフォルトの名無しさん :02/09/08 12:30
>>203 たった一行を書き換えるためにわざわざマクロを使うの?
コンパイルオプションでマクロを定義して使うの?
よく考えてみたらたった一行とかそういう問題じゃないか・・・ 俺なら#if使うかな。
208 :
デフォルトの名無しさん :02/09/08 12:36
>>202 師匠!
たった1分足らずの時間で
その様な素晴らしいレスを見つけ出す秘術を
是非とも僕に伝授してください。
209 :
194です :02/09/08 12:38
>>203 なるほどねー
だから括弧が二重なんだ。
二重にしないとint main int,char *[];になっちゃうな。
210 :
デフォルトの名無しさん :02/09/08 12:44
double data; int dummy = 10; dummy /= 50; data = (double)dummy printf("%f\n",data); としても0が表示されます。なんで? コンパイラのバグですか?
>>206 たくさんの関数宣言がある時でないと意味がないね。
それらの宣言をすべて
int func __P((...));
のような形式で記述しておいて、
コンパイルする環境によってマクロだけを切り換える。
普通は、公開ソースで色々なプラットフォームに
対応したい時に使うものだと思う。
zlibなんかもこの方法を使ってるから、見てみるといいかもね。
ttp://www.gzip.org/zlib/
>>209 それ以前に、マクロ __P() の引数の数がおかしいと怒られるから、面倒だけど
二重括弧は必要。
>>210 0と表示されたらライブラリのバグ(藁
0.000000と表示されないと(藁
216 :
デフォルトの名無しさん :02/09/08 13:27
alloc系でメモリを取得取得取得開放取得開放開放取得開放取得ってやってたら ヒープがこまぎれずたずたになっちゃう気がするけど OSはガーベッジコレクションとかちゃんとやってくれてるのかな? とりあえずWinとかLinuxとかでの例を教えてほしいかも。
int a=0x10; if ( a&0x10 == 0x10 ) printf("a==0x10\n"); としてもa==0x10が表示されてません。なんで? コンパイラのバグですか?
昔、幼稚園児だったころ友達に「わかってることを聞く奴は馬鹿だ」 と言われたんですけど、僕は馬鹿だったんですかね
>>217 & より == の方が優先度高いから
if ( a & (0x10 == 0x10 ) )
と同義。キミのバグ。
>>218 馬鹿じゃなくてむかつくだけ。
人を試すってことだろ?
222 :
デフォルトの名無しさん :02/09/08 13:36
・・・・・できません。なんで? コンパイラのバグですか? が今のはやりですか? 昨日の9<a<10とかさ。
教えてください. int Q = 41; Q -= 4 * 9 - 4 - 1; なぜ結果が Q = 10 になるのでしょうか ? 私は今まで Q = Q - 4 * 9 - 4 - 1; と同じだと思っていたのですが ...
>> 222 ネタでしょ >> 223 Q = Q - (4*9-4-1);
226 :
たけ☆地球の王子♪ :02/09/08 13:39
>>223 小学校からやり直せや
それとも小学生か?(稿
dummy /= 50; ここで整数除算して桁落ち(0.0〜とかではなく、0としか入らない)、 小数点以下が切り捨てられてデータが残らない。 つまりdummyに0が入ってその後に、別のところでキャストしても0は0(復元不可能)。
229 :
たけ☆地球の王子♪ :02/09/08 13:41
>>228 *から先に計算するって事は小学校で習いますです。はい。
>>229 問題はそこじゃない。
a-=bはbを先に計算してからaから引く。
すみません, 途中で間違って投稿してしまいました. なぜ Q = 10 になるのでしょうか ? なんで ? コンパイラのバグですか ?
(4*9-4-1)=31
もうちょっとマトモなネタキボーン
int i; for(i=0;i<10;i++) ; 無限ループになります。なんで? コンパイラのバグですか?
>> 235 それはコンパイラのバグ そういやIntelのコンパイラで short i,j; for(i=0;i<10;i++) { for(j=0;j<10;j++) { printf("%d%d\n, i,j ); } } とやると、外側のループが1回しか実行されないバグがあったな
>>235 無限ループならコンパイラのバグです。
もうちょっとマトモなネタキボーン
238 :
デフォルトの名無しさん :02/09/08 13:54
ハード屋がつくるソフトってだめね。 Sunのあれとか。
>>236 short で、インクリメントできないってこと?
>> 240 いや、2重ループが実行されない。 int なら平気。
short使う人の性格にバグが。
>>239 ソフト屋の作るソフトも人のことは言えないと思うが...
>>204 意味がよくわからんが、
とりあえずFindFirstFileでも使っとけ。
>>216 まずはCランタイムのヒープ管理ルーチンとよく相談しろ。
OS側の話はそれからだ。
>> 242 俺は使ってねーよ。 コーデック系のプログラムだと、作ってんの学者だから 訳わかんねー事やってんのよ。 変数や関数名も数式のまんまだし。
246 :
デフォルトの名無しさん :02/09/08 14:12
unsigned intをunsignedと略すのはやめた方がいいですか?
というのもlong intは略してもunsigned intは略さない人が多いみたいですから。 面倒な人はtypedefでもするんでしょうが。
>>246 かまわん。
俺個人的にはuintでtypedefする方が好みだが。
>>248-249 うー、、、どっちにすべきなんだろう・・・・
typedefがベストですか?uintなら誰でも分かりそうですし。
>>251 いや、俺はunsignedでもかまわんと思う。個人的な好みを言っただけ。
じゃあ今まで通りunsignedでいきます。
礼を忘れました・・・ ありがとうございました。
255 :
デフォルトの名無しさん :02/09/08 14:52
>>236 以前無限ループになってしまって原因がわからなかったのですが、これもコンパイラのバグだったんですね。
もっとちゃんとしたコンパイラ買わないとだめかな。
unsigned char counter;
for(counter = 0; counter < 300 ; counter++) {
処理
}
もうネタはいいよ せめて、ちょっとマシなやつにしてくれ void f( unsigned int i ) { if ( i < -1 ) printf( "i<-1\n" ); } int main() { f( 1 ); } とか
「unsigned char が300まではないだろ」 って言ったら、 「俺のコンパイラはcharが9ビットなんだよ」 って返される見え見えのオチだな。 もうちょっとマトモなネタキボーン
×if ( i < -1 ) printf( "i<-1\n" ); ○if ( i < -1 ) printf( "%d<-1\n", i );
260 :
デフォルトの名無しさん :02/09/08 15:07
261 :
エディタ製作中@クソ初心者 :02/09/08 15:37
すみません、質問いいですか? 懲りずにエディタ作ってる者です(汗 えっと、お聞きしたいんですけど、 文字列配列を、完全に初期化する方法ってありますか? たとえば、配列すべてに\0で初期化したい場合はどうすればいいでしょう? for文で配列一つ一つに\0を代入とか考えたんですが、 配列が1000とか2000になると、すごい処理効率が悪くなりますよね・・・。 何か、良い方法はないでしょうか・・・? よろしくお願いします。
>>261 bzeroがあればその方が速いと聞いたことあるけど、素直にループかmemset使おうよ。
263 :
エディタ製作中@クソ初心者 :02/09/08 15:46
>>262 う〜ん、やっぱり普通にループ処理などでしかできないんでしょうかね・・・。
bzero・・? 関数ですか・・・?
うん、それでは素直にループで処理することにします。
ありがとうございました。
memsetって書いてるじゃん。 コンパイラによってはループを勝手に memsetに置き換えてくれるかも知れんが。
>>261 文字列配列って書いてるけど、「文字列用の文字配列」の間違いじゃないか?
それはともかく、そんな'\0'埋め処理なんか、どういう状況で
必要になるのか全く想像できない。
266 :
エディタ製作中@クソ初心者 :02/09/08 15:54
>>264 あ、すみません!
memset関数っていう便利なのがあったんですね(汗
memset関数を使って初期化することにします。
ありがとうございました。
>>265 俺も。
単に長さ0に初期化しておきたいだけなら、文字配列の先頭の要素に'\0'を入れておけばいいだけだしね。
>>265 えっと、今作ってるエディタの仕様だと、
たとえば、改行すると、先頭文字に\0が入ります。
で、右にスクロールする時に先頭文字が切れて
\0がなくなりゴミが表示されてしまうのです・・・。
で、\0で埋めれば簡単に問題解決できるかな?と思いました。
とりあえず、FAQではこうなってるぞ↓
http://www.catnet.ne.jp/kouno/c_faq/c13.html#24 13.24:
古いプログラムを移植しようとしている。なぜ「未定義の外部シンボ ル」というエラーが出るのか。
A:
これから(左側に)挙げるルーチンはそれぞれ時代遅れである。代わり に右側のルーチンを使え。
index? strchrを使え。
rindex? strrchrを使え。
bcopy? 一番目の引数と二番目の引数を入れ替えてmemmoveを使え(質問11.25も参照のこと)。
bcmp? memcmpを使え。
bzero? 二番目の引数を0にしてmemsetを使え。
逆に、右側の列の関数が載っていない古いシステムを使っているのな ら、左側の関数を右側の関数を使って実装、あるいは代用することが できるかもしれない。
>>268 ごみは放って置いて、ごみの前に\0を入れるだけでいいんじゃないの?
文字配列としてではなく文字列として扱うだけなんでしょ?
>>268 なんじゃそりゃ。
つまり、いちいちstrlenして、表示開始桁と比較するのが面倒だっていうことか?
もしそうなら、一行の長さを管理したほうがいいに決まってる。
どうせ、5文字しかない行(char *)lineの6桁目から表示させようってときに、 (line + 6)からヌル終端まで表示、とかやってんじゃないのか?
スマソ、6桁目じゃなくて7桁目だな
>>269 ありがとうございます。
bzero関数ってのは、古い関数だったんですね。
その代わりとなるのが、memset関数だったってことですか。
>>270 >>271 あッ!そっか!
今までが、文字列の最後か調べるためには、
for文のループなどで調べないといけないから処理効率が悪いと思ってましたが・・・
言われてみれば、そうですね・・・
strlenで、どこが文字列の最後かわかりますね・・・(汗
プログラム中にも、所々でstrlen関数使ってるのに、何故気づかなかったんだろ・・・(滝汗
すみませんでした。 ありがとうございました。
ごみが表示されるって、きっと\0がないんだよね? それってprintf("%s\n",str);とかやったら場合によってはまずいことになるんじゃないか?(汗
>>272 そうです。そんな感じです。
う〜ん、ちょっとボケてました(汗
すみませんでした。
ごめん、今さらだけど、俺間違ってるじゃん。 #define __P(x) x ともう1つは × #define __P(x) ○ #define __P(x) () だね。
>>275 はい。その辺の対策は・・・
いちよう、配列の一番最後に\0を入れてるので、
配列超えて何か表示されるってことは一応ないです。
279 :
デフォルトの名無しさん :02/09/08 18:06
>>エディタ製作中@クソ初心者 仕様書をアップしてくれ
>>279 そういえば、一部はフローチャートになってた。
まじめまじめ。おりこうおりこう。
(でも、書かないと検証できないというのは実際いかがなものか)
282 :
エディタ製作中@クソ初心者 :02/09/08 18:24
>>279 し・・・仕様書ッスか?
えっと、そんな大した物は作ってないです(汗
仕様は、いつもいつも、良い案があればコロコロ変わります・・・。
あまり良い作り方ではないとは思いますが、一応勉強のつもりで作り出したので、
仕様など考えず、こんな感じで作ればどうだろ?って感じでプログラムを打ち始めました。
仕様書はありませんが、ソースならあります(w
http://www.geocities.co.jp/SiliconValley-SanJose/9640/ ここに今現在の最新のソースを上げました。
再描写の新仕様のバグや、カーソル制御新仕様のバグなどを修正したばかりです。
読みにくいソースですが、こんなのでしたらどーぞ。
>>281 ええ、新仕様に変えようとしてフローチャート組んで考えたのですが・・・
かなり複雑な処理になってしまいました・・・。
もう少し修正できますので、修正してみます。
283 :
デフォルトの名無しさん :02/09/08 18:32
>>282 SVGならzipで固めないでよ(ToT)
しかもきちんとhtmlファイルまで入っているじゃない・・・・ なぜそれにリンクを貼らないんだろう。
285 :
エディタ製作中@クソ初心者 :02/09/08 18:35
>>283 すみませ〜ん(汗
それが、ジオサーバは、怪しげな拡張子ファイルを上げさせてもらえないんです(涙
最初、そのまま上げようとしたのですが・・・
拡張子SVGは、サーバに上がりませんでした・・・
やむなく、ZIP圧縮で上げる形になりました・・・。
それと、かなりスレ違い&私的な質問なんですが・・・
プログラムの開発は、Win2kで行ってます。
Win2k以外のOSでエディタ動かせます・・・?
>>285 ああそういうことか。なるほど。
ジオ逝ってよし!
Win95だが、動いたぞ。(マジ)
WinMeで動いたよ。
みんなが一致団結している
290 :
エディタ製作中@クソ初心者 :02/09/08 18:45
>>287 >>288 あ、動きました?
よかった・・・。
NT系OS以外は動かなかったりしたら、ちょっと悲しかったです。(w
教えてくれてありがとうございました。
がんばって、標準でついてるエディタを超えるようなエディタを作ります。
291 :
デフォルトの名無しさん :02/09/08 18:47
>>290 変数の外部参照(extern int xとか)はヘッダーファイルに書いた方がよくないか?
あ、もしかして変数宣言と外部参照宣言が同一ファイル内にあるとまずいと思っている? それは大丈夫だよ。
293 :
エディタ製作中@クソ初心者 :02/09/08 18:57
>>292 あれ?
グローバル変数って、全部のファイルで宣言しててもいいんですか?
多重宣言とかって、エラーが出そうとか思ってました・・・(汗
もし、ヘッダーファイルに収めるなら、
別ヘッダーファイルに作ってそれに入れないとって思ってました・・・
・・・これも、基本的な事ですね・・・
もう少し入門書を読んで復習しなおす必要がありますね・・・(汗
294 :
デフォルトの名無しさん :02/09/08 18:58
>>293 変数宣言はだめ。
外部参照宣言(extern int xみたいなやつ)はOK というかしないとそのファイル内で参照できない。
ところで、外部参照宣言と言う言葉は正しいのかしら?(^_^;) 今まで当たり前のように使ってきたけど。
>>295 あ、それじゃ・・・
extern修飾子が付いてるのと、
普通のグローバル変数宣言との2つのヘッダーファイルを作って、
それで適切にインクルードするってことですね。
わかりました。 グローバル変数の所を整理してみます。
訂正。 異なる値で初期化した同名のstaticでないグローバル変数の宣言は不可能。 初期化しなければOKだ。
>>296 違うって。
externなんとかってのをヘッダーファイル(あなたの場合はhead.h)に書いて、変数の宣言はどれかひとつのソースファイルに書くの。
>>295 extern宣言、外部宣言、外部変数宣言+外部関数プロトタイプ宣言
とかかな?
「変数宣言」というのはたぶんよくなくて、
「(グローバル)変数定義」だと思う。
>>299 変数定義ですか。
ありがとうございます。これからはその言葉を使わせていただきます。
ヘッダファイルをこんな風にしておいて、 #ifdef DEFINE_GLOBAL int global; #else extern int global; #endif ソースファイル一つだけ #define DEFINE_GLOBAL #include "head.h" なんてすればよいのでは?
動作報告。 Linuxでgccだと、conio.hがないからコンパイルできんかった。 WinXP+VC6.0(SP済)では動いたよ。
>>298 なるほど。
すみません、今度こそ理解しました(汗
アドバイスありがとうございます。
>>301 えっと、またプリプロセッサ処理は、
includeと、defineの2つ以外はちゃんと覚えてないんです(汗
一度どこかで定義されてたら、
それ以降定義しないようにしたりできるってことは知ってますが・・・
その辺も、もう少し本見て勉強しておきます。
------------------------------------------------ extern char message[]; extern char message[]; extern char message[]; extern char message[]; extern char message[]; extern char message[]; char message[] = "Hello, extern declarations!"; main() { puts (message); } ------------------------------------------------ C:\WINDOWS\デスクトップ\c-test>gcc a.c C:\WINDOWS\デスクトップ\c-test>a Hello, extern declarations! C:\WINDOWS\デスクトップ\c-test> ------------------------------------------------
>>303 ありがとうございます!
Linuxで動くか?っていうのは俺も少し考えてました・・・。
う〜ん、やっぱりコンパイルできないッスか・・・。
Linuxでなら、コンソールアプリも活躍できそう・・・。
>>305 extern修飾子が付いてる変数宣言は、
全部のファイルで宣言してても大丈夫ってことッスね。
グローバル変数宣言は、本体のedit.cで宣言して、
後はヘッダーからインクルードする事にします。
>>308 ありがとうございます。
う〜ん、ANSI C規格以前のコンパイラでもOKとありました。
一般的な事だったんですね(汗
改めて再度入門書から読み直した方が良いと思いました・・・(滝汗
教えてくれてありがとうございました。
310 :
OPENFILENAME ofn :02/09/09 00:12
char s[]; s=ofn.lpstrFile; 'char *' から 'char []' に変換することはできません。(新しい動作 ; ヘルプを参照) と怒られるんですが,いろいろキャストしてもダメ. sへ代入するにはどうしたら?
312 :
デフォルトの名無しさん :02/09/09 00:15
>>310 char s[];
のsのさしている先を書き換えてはいけない。
値をコピーしたいなら配列のsのサイズをきちんととっておいて
strcpyでもしとけ。
313 :
OPENFILENAME ofn :02/09/09 00:20
ありがと
314 :
デフォルトの名無しさん :02/09/09 00:21
数字の全角表示ってありましたっけ?? 例. 1→1 ASCIIコードにのってなかったんですけど・・・。
>>310 自分で読んでてもわかりずらいから一応補足。
char s[100];
とかの配列で確保しているメモリの位置は固定されている。
s = ofn.lpstrFile;
見たいにsのさしているアドレスの先を書き換えるような真似はできない。
コピーしたいのがlpstrFileの文字列ならstrcpyを使えばいいし、
ポインタをコピーしたいなら、
char *s;
でポインタで宣言して代入しなきゃいけない。
そりゃASCIIコードには全角文字なんて載ってないだろうな。
>>310 そもそもchar s[];なんてかけるの?関数の仮引数ならchar *sと同じ意味でかけるけど。
318 :
デフォルトの名無しさん :02/09/09 00:28
>316 どうすればいいのですか??
>>316 そうなんですか?
じゃああれはジャパンオリジナル?
>>319 つか、そもそもgccですらコンパイルできないんだけど…。
>>317 俺も疑問に思ったんでコンパイルしてみた。↓って言われた。
error C2133: 'test' : サイズが不明です。
全然ダメじゃねーかよゴルァ!!
>320 ただ数字の全角表示をしたいのれす。
>>322 だよねぇ。
もし関数の仮引数なら*sと同じ意味だから代入できるはずだし(もちろん文字列のコピーにはならないけど)。
325 :
デフォルトの名無しさん :02/09/09 00:36
>>323 printf("1");
これじゃだめ?
>>323 char *double_byte_number = "0123456789";
>325 scanfで数値を入力して printfで全角数字出力で お願いします。
>>327 switch(i){
case 1:
printf("1");
case 2:
printf("2");
}
からあげうまうまって人がもっとうまいコードを書いていたな・・・
たしかstrchrを使う方法で・・・
breakわすれた(^_^;)
>328 え〜!こんな面倒くさいんですか!? でもありがとう。。
326じゃ、面倒だな。 char *dbn[] = {"0","1","2","3","4","5","6","7","8","9"}; 使い方は自分で考えよう。
>>318 ただ半角数字→全角数字にしたいだけならそういう関数作れば?
数値になっているから文字コードがどうとかなんて気にする必要はないか。 printf("%s",dbn[i]);ってとこか。
>>323 void print(int n){
if (n < 0)
printf("−"), n = -n;
if ((unsigned) n >= 10U)
print((unsigned) n / 10U);
printf("%.2s", "0123456789" + ((unsigned) n % 10U * 2U));
}
要するにswich文使うわけですね。 scnaf("%d",&su); su += ??; みたいのでできると思ってましたぁ。
void zenkakusuji(int n){ char buf[30]; char *dbn[] = {"0","1","2","3","4","5","6","7","8","9"}; int i=0; sprintf(buf,"%d",n); if(buf[i]=='-'){ printf("−"); i++; } for(;buf[i];i++) printf("%s",dbn[buf[i]]); }
>334 そんな関数が作れるほどスキルないんで・・・。 つーかそれの意味わかんないし。
×printf("%s",dbn[buf[i]]); ○printf("%s",dbn[atoi(buf[i])]);
違う違う(汗 もういいや・・・
>>338 atoiでもダメだろ。buf[i] - '0' じゃないか?
ASCIIコードならbuf[i]-'0'でいけるかも・・・どうでもいいけど
>>337 関数記述できる程度をスキルとは言わんぞ。
君はもう少し色々と勉強してきなさい。
>>340 えぇ、そうです・・・
恥ずかしい・・・
>>340 ASCIIとかの文字コード限定なら○
もっと具体的には文字モードじか書き。
345 :
エディタ製作中@クソ初心者 :02/09/09 02:14
すみません、また質問いいでしょうか・・・?(汗 今、一文字削除の機能を付けてるのですが・・・ 不思議な警告で悩まされてます・・・。 内容は、「符号付き値と符号なし値の比較」という警告なんですが・・・ どこをunsignedでキャストしてやれば良いのか分らないんです・・・(涙 エラーが出る行は、98行目で、内容は・・・ 98: for (i=1; (txt[sy+i] != '\0'); i++) 99: strcpy(txt[sy+i], txt[sy+i+1]); こんな感じです。 型は、iがunsigned intで定義。最初int型で定義してたのですが変更しました。 で、txt配列が2次元配列の、型がunsigned char型です。 ・・・さっぱり意味不明です・・・(涙 よろしくお願いします。
'\0'はchar型でborland c++は標準でcharがsigned char
347 :
エディタ製作中@クソ初心者 :02/09/09 02:18
>>346 ええッ!?
そうなんですか!?
今まで、こんな警告出なかったのに・・・・
・・・でも一応、(unsigned)'\0' こんなやり方ですけどキャストしてみました。
それでも、警告でます・・・
キャストの仕方が悪いですか・・・?
>>エディタ製作中@クソ初心者 いきなりエディタ作成って無茶やなぁ。けど必ず身に付くものがあるから、最後まで頑張りなよ。 # で、実力付いたら反省を兼ねて作り直せば2度勉強できる、と。
>>347 がんばれ。失敗から学ぶことは多い。
signed / unsigned char 関係は、コンパイラオプションでごにょごにょできんかな?
350 :
エディタ製作中@クソ初心者 :02/09/09 02:25
>>348 そうなんです・・・
初心者がいきなりエディタ作るのって、結構無茶ありますね(汗
S-JISという文字コード規格に、どれだけ泣かされたか・・・(涙
再描写処理作るのに、どれだけイライラしたか・・・
考えると、泣けてきます・・・
でも、今作ってる一文字削除機能が付くと、
最初に思い描いていた機能すべてが付きます!
一応完成となります!
・・・がんばりました。
ここから、さらに機能を追加して行こうと思ってます。
>>347 unsignedはunsigned int
352 :
エディタ製作中@クソ初心者 :02/09/09 02:27
>>349 あ・・・コンパイラの設定で回避しないとダメなんですか・・・?
でも、おかしいですよね・・・
こんな比較、他でもしてるのに、それらは警告が出ない・・・
・・・なんだか、納得行かないです・・・(汗
353 :
エディタ製作中@クソ初心者 :02/09/09 02:29
>>351 ありがとうございます!
警告がなくなりました!
そうですね・・・unsignedだけだとint型になりますね・・・
これも、俺の不注意でした・・・
ありがとうございました。
>>353 どう見ても、型が違うのだが。strcpyに渡してるってことは、
txt[sy+i]はchar*だろ?
>>345 つーか、そもそもロジックが変だろ。
一文字削除なら、strcpy(&txt[sy][sx], &txt[sy][sx + 1]);
だけでできると思うのだが。
356 :
60cm浮き上がるストレート :02/09/09 02:56
>>327 ShowZenkakuSuuzi(scanf("%d",suuti),space);
void ShowZenkakuSuuzi(int suuti,int space)
{
int waru=10000;
int showAtta=0;
int absuuti=0;
absuuti=abs(suuti);
for(waru=10000;waru>0;waru/=10)
&ndsp;if(absuuti/waru==0 && showAtta==0)
&ndsp; if(space>=waru) printf(" ");
&ndsp; else printf("");
&ndsp;else
&ndsp;{
&ndsp; if(showAtta==0) if(suuti<=-1) printf("−");
&ndsp; printf("%c%c",(absuuti%(waru*10)/waru+0x824f)
>>8 ,absuuti%(waru*10)/waru+0x824f);
&ndsp; &ndsp;showAtta=1;
&ndsp;}
}
357 :
60cm浮き上がるストレート :02/09/09 03:01
ndsp>>nbsp
ShowZenkakuSuuzi(scanf("%d",suuti),space);
void ShowZenkakuSuuzi(int suuti,int space)
{
int waru=10000;
int showAtta=0;
int absuuti=0;
absuuti=abs(suuti);
for(waru=10000;waru>0;waru/=10)
if(absuuti/waru==0 && showAtta==0)
if(space>=waru) printf(" ");
else printf("");
else
{
if(showAtta==0) if(suuti<=-1) printf("−");
printf("%c%c",(absuuti%(waru*10)/waru+0x824f)
>>8 ,absuuti%(waru*10)/waru+0x824f);
showAtta=1;
}
}
┐(´ー`)┌
360 :
エディタ製作中@クソ初心者 :02/09/09 03:09
>>354 すみませんでした・・・
後々、その辺がバグとなって、それに気づきました・・・(汗
ご迷惑おかけしました。
>>355 あ・・・それでできますね・・・。
・・・う〜ん、もっとがんばって経験積みます(汗
なにぶん、クソ初心者ですんで・・・・(涙
一応、一文字削除機能も付いて当初の目的を果たしました。
またサーバにバイナリ&ソースを上げてますので・・・
もし、よかったら覗いてやってください。
また、何かお気づきの点やバグなどありましたら、
教えていただけるとありがたいッス・・・。
ここまで作れたのも、みなさんのおかげッス!
本当に感謝してます。沢山勉強になりました!
ありがとうございました!
>>357 > ShowZenkakuSuuzi(scanf("%d",suuti),space);
この呼び方だと-1,0,1のどれかしか表示されないわけだが。
ネタにマジレス カコワルイ
>60cm だからお前のコードはゴミ水準だとあれほど。。。。
int main () { char ch; char ch2[3]; scanf("%c", &ch); ch += 0x1f; ch2[0] = 0x82; ch2[1] = ch; ch2[2] = '\0'; printf("%s", ch2); return 0; } ・・・・・。
>>364 間違えた・・・
×ch += 0x1f;
○ch = 0x1f;
366 :
60cm浮き上がるストレート :02/09/09 05:30
>>357 の訂正など
suutiは-32768~32767、spaceは0,10,100,1000,10000。
spaceはスペース。suutiが整数3桁でspaceが1000なら一桁分スペースが入る。
scanf("%d",&suuti);
ShowZenkakuSuuzi(suuti,space);
void ShowZenkakuSuuzi(int suuti,int space)
{
int waru=10000;
int showAtta=0;
int absuuti=0;
absuuti=abs(suuti);
for(waru=10000;waru>0;waru/=10)
if(absuuti/waru==0 && showAtta==0)
if(space>=waru) printf(" ");
else printf("");
else
{
if(showAtta==0) if(suuti<=-1) printf("−");
printf("%c%c",(absuuti%(waru*10)/waru+0x824f)
>>8 ,absuuti%(waru*10)/waru+0x824f);
showAtta=1;
}
}
ゴミを増やすな!
>>355 重なり合う領域のstrcpyの結果は
保証されてなかったような気がするのだが。
間違ってたらごめんよ。
369 :
60cm浮き上がるストレート :02/09/09 05:47
>>366 の訂正
spaceは0,10,100,1000,10000。
↓
spaceは1,10,100,1000,10000。
if(absuuti/waru==0 && showAtta==0)
にさらに
&& waru!=1
を追加。0オンリーを表示するためです。
・・・ch=0x1fって要らないです。 もう間違えまくりだ・・・鬱
ZeroMemoryされた構造体が 本当に空(0で埋め尽くされている)かどうか 調べるにはどうしたらいいのでしょう・・・?
みんなテンパってるな…おつけち。
>>371 なんでそんなことする必要があるの?
ZeroMemoryはmemsetのマクロとして定義されている
のが普通だと思うが、このライブラリ関数が
信用できないとでも?
C言語45秒クッキング int check_zero( const void *source, size_t size) { const char *p = (const char *)source; while( size-- > 0 ) { if( *p++ != 0 ) return 0; } return 1; }
>373 コンストラクタでZeroMemoryした構造体に もし何も代入されていなければ 即座にfalseを返すメンバ関数を作りたいんです
ゴメン、読み落とし >374 それって構造体が8bitアライメントされてないと おかしなことになりません? というか、やっぱり自前で走査しないとダメなんですか・・・ ポインタとサイズ渡したらゼロクリアされてるか調べる 関数(マクロ)くらいあると思ってた・・・
>それって構造体が8bitアライメントされてないと >おかしなことになりません? 8bitアライメントって何。新語か?
>>376 それくらい自分で調べられないならC言語やめたほうがいいんでは?
┌─┐ |も.| |う | │来│ │ね│ │え .| │よ .| バカ ゴルァ │ !!.│ └─┤ プンプン ヽ(`Д´)ノ ヽ(`Д´)ノ (`Д´)ノ ( `Д) | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U 〜 〜  ̄◎ ̄ . ̄◎ ̄  ̄◎ ̄ ◎−>┘◎
381 :
デフォルトの名無しさん :02/09/09 13:15
ANSIが標準規格を策定する以前はvoidというキーワードはなかったんですよね? 値を返さない関数はどう書いていたのですか?void *はchar *で代用していたらしいですが。
初心者丸出しな質問ですが、 なぜCの標準ライブラリ関数やシステムコールやソケットなどの関数は 引数の並び方やエラーの場合の戻り値に統一性がないのですか? 途中で追加するにしても、たとえばエラーが-1なら-1で通すとか…
ソレが後方互換性というものです。 Javaマンセー(W
>>383 > なぜCの標準ライブラリ関数やシステムコールやソケットなどの関数は
> 引数の並び方やエラーの場合の戻り値に統一性がないのですか?
CはANSI-Cの規格が策定される前はC言語には仕様がないため乱立状態であった。
それをANSI-Cで互換性をもたしつつ、ある程度の統一性を持たしたある意味妥協の産物だ。
また、正確にはシステムコール、ソケットなどの仕様はPOSIXでありCの仕様ではない。
これもUnix乱立期に制定された仕様であり、多少の統一性がないのは仕方がない。
そしてこの仕様を変更するとそれに伴う混乱や過去の資産の変更が大きすぎる
残念ながら、マニュアルを注意深く読む習慣をつけるしかない。
>>385 とりあえずおいらは関数使うたびにmanしています。
387 :
デフォルトの名無しさん :02/09/09 14:47
1?1?1?1?1?1?1?1?1?1?0:1:0:1:0:1:0:1:0:1:0;
>>385 ありがとうございました。
それぞれに、実は深い意味があるのかなと思っていたので、助かりました。
>>386 それしかないのですか…残念。
>>386 たまに「この関数こんな戻り値返してたんだ」と新鮮な驚きを得ることあるよな。
>>389 分かる分かるw フッと細かい仕様が気になっていつもテキトーに使ってる関数とか見たりすると
謎の返値が….
関数名書くと、下の方にニョロっと引数と戻り値が出るエディタって 無かったっけ?? VBはできたよね...
IntelliSense?
ちなみにprintf()の返り値はintですが、 返り値を見ているプログラムは見たことありません。 lintで警告が出てきますが無視です。
394 :
デフォルトの名無しさん :02/09/09 17:07
>>393 (void)printf("はろーわーるど\n");
こうすれば出なくなるかもしれないけど阿呆みたいだよな。
fprintfなら戻り値を見ることがあるかも。ないかも。
自分の始めての仕事は、lintに怒られないようにひたすらコード中に キャスト入れてくって仕事でした。
#define printf (void)printf
>395 有用なようで無用な仕事だなそれ。 ちなみにマヌケなキャストをしてたところを憶えてたら公開キボンヌ
399 :
デフォルトの名無しさん :02/09/09 20:57
以前、サンプルプログラム見ていて int v1, a; : /* 中略 */ v1 = !!(a == 100); という式を見たときは唸ってしまった。
C++なら、operator!しか定義してなくて、 if( !!object ) みたいな事態が、、
以前、サンプルプログラム見ていて for(;!!!!! ~~~~~~ !!!! ~~~~~~!!!!i;) { } というループを見たときはちびってしまった。
>387 #include <stdio.h> main(){ printf("%d",1?1?1?1?1?1?1?1?1?1?0:1:0:1:0:1:0:1:0:1:0); return 0; } ============ OUTPUT : 0
>>400 #define if(expr) if(!!(expr))
#define unless(expr) if(!(expr))
まともなエディタ作るには1年はかかる
>>402 一々プログラム書かなくてもパッと見て分かるじゃん。三項演算子の条件式、全部真だよ?
ハンガリー記法でcharをcNumとかにしてもいいですか?
C南無。
>>406 ここはC言語のスレなので、ハンガリー記法の事を教えるスレではないと思われ。
410 :
デフォルトの名無しさん :02/09/09 23:32
C言語はどのくらいできればマスターしたといっていいのでしょうか。 僕は結構いい線いっていると思うのですが。
>>410 C言語の関数をすべて覚えて、
すべての関数の挙動を把握していればマスター。
あくまで、C言語マスター。
C言語マスターしたからって、プログラムがうまく作れるとは限らない。
>僕は結構いい線いっていると思うのですが。 と言う時点で痛いヤシ。一人でOS作れるくらいなら流石にマスターかと思うが(藁 # ネタニマジレス…カナ
>v1 = !!(a == 100); って何やってるの? v1 = (a == 100); と、どう違うのかマジ分からん v1 = ((!!a) ^ (!!b)); なら分かるが
414 :
あ〜、わかりません・・・ :02/09/09 23:40
「2002年の月と日を入力して、2002年1月1日から、 入力された月日までの日数を求めるプログラムを作成しなさい」 という問題で、 各月の日数でグループにわける 入力された月の前の月までは、各月の日数を1月から順に全部加えたら いいのかな・・・と思ったんですが・・・・ 思ったっだけで肝心のプログラムを書けませぬTT こんな複雑な問題、if文とwhile文ぐらいしか習ってない 私にはとけやしないよう〜と泣き叫びたいっす。 簡単ですか?これ?我が儘をいわせて頂ければ、 プログラムを書いて貰って・・・参考書片手に研究したい・・・。
416 :
あ〜、わかりません・・・ :02/09/09 23:50
417 :
デフォルトの名無しさん :02/09/09 23:52
>>414 time()で通し秒数を求めて、3600で割ればいいだろ?
2002年1月1日からの。
localtime()とかこのへん使えば簡単にできる。
419 :
あ〜、わかりません・・・ :02/09/10 00:02
>>418 418さん、ヒントどうもです。
・・・しかしヒントを全く理解出来ていない私が情けない・・・。
time()localtime()とかってのは今まで見たことなくて。
なんせ週1の一時間授業では・・・12回しかしてないし。
とりあえずは「簡単にできる」もんなんすね。
ブチブチ愚痴ってる間に調べようよ(笑) 何の為にインターネットへ繋いでるのよ まぁたぶん>419はプログラマに向いてないよ
> time()で通し秒数を求めて、3600で割ればいいだろ? 24*3600の間違いですだ。ハイ。
422 :
あ〜、わかりません・・・ :02/09/10 00:57
>>420 さん
あい、言えてます。全く不向きでした。
自分が、英語アレルギーな時点で気づくべきでした。
しかしこの授業を取ってしまったからには、
最低の成績でも単位をもらいたい・・・。
421さん
あ、わざわざどうもです
>>414 int nissuu2002(int m, int d)
{
const int t[] = {0,31,59,90,120,151,181,212,243,273,304,334};
return t[m-1]+d-1;
}
こんなので我慢しとけ。残りの処理は自分で作れ。
激しくスレ違いを承知で聞きたいんですが エディタ作成者さんみたいにフローチャート描こうと思うと やっぱりSVG対応ドロー系だと思うんですが、フリーで良いのないっすか? 調べてみたんですがビューワしか見つけられませんでした。
>>424 何もSVG対応が必須ではないと思われ。もちろん、可搬性の高いデータ形式だからSVG対応なのに越した事はないけど。
大抵のメジャーなソフトならプラグインあるから問題ないっしょ。多分一人で使うんだろうし。それよりも使い勝手を
重視する方が良いかと思われ。
# ドロー系ツールは使わないので具体的な意見が言えなくて申し訳ない
427 :
デフォルトの名無しさん :02/09/10 01:16
>>424 俺が使ってるツールは、すんごく使いやすいッス。
ヘルプ読まなくても、直感で使えますよ。
ただ、ちょっとキツイバグがいくつかありますが・・・
9月の中旬にバグを一掃したバージョンを公開予定らしいので・・・
かなり、お勧めです。
・・・ここで、URL公開すると作者さんに迷惑かな・・・?
3元連立一次方程式をGauss-Jordan法で解けという問題がありまして、一応プログラムは書いたんですが、対角成分が0の時に他の行と入れ替える操作をがどうしてもできません。 どうしたらいいのでしょうか。ぜひ教えてくださいっ!!!
むずい あと宿題スレではない
日本語の処理法について詳しく解説しているサイト教えてくれー 「c言語 日本語 処理」とかのキーワードで検索かけても 出版社の書籍紹介ページばかりヒットしやがる
> 日本語の処理法について詳しく解説しているサイト教えてくれー このスレじゃ不満なのか?
>>432 「日本語の処理」て何だ?
構文解析なのか、形態素解析なのか、コード変換なのか、
マルチバイト文字列の扱いなのか、その他なのか?
皆さん、ありがとうございます。
>>426 ドロー系を使うときは花子を使っているんですが、
簡単な立体図はこれでOKなんですが・・・。
>>427 ダウンしてみました。かなり良い感じです。
ありがとうございました。
>>428 「h」抜きで・・・はダメっすかね(w
何か検索のヒントとなるようなものを・・・。
436 :
デフォルトの名無しさん :02/09/10 02:13
fwriteを使って配列をファイルに書きこむ、26番目の要素から変な値が入ってしまいます。 8年ほど前、MSDOSとMS-Cを使用していたときにも、全く同じことがありました。 その時は、配列の値全てに0を入れていたはずなのに、書き込まれたファイルを見ると 26番目から謎の値が入っていました。2徹しても原因がつかめず、 あきらめてfprintfとループを使いました。 それ以降fwriteを使う機会がなかったのですが、今回8年ぶりに使ってみて 同じことが発生しました。
>>434 マルチバイト文字列の扱い かな
プログラミングをするにあたって一般的に(?)使われている単語が身についていないんで
疑問、質問をうまく表現できないっつーか、なんと言うか
>>436 使い方を間違えているか、プログラムがバグっている。
>>437 「マルチバイト文字 先頭バイト」あたりでぐぐってみ。
>>435 俺のエディタ置いてるHPに、何かあるかもしれません・・・(w
>>440 さんきゅう
google先生に聞いて見ます
443 :
プログラム歴2ヵ月 :02/09/10 02:53
Cから始めたんですが難しすぎっす ポインター理解不可能 誰か教えてくれまつか? 頭わるい、むいてないはなしで
始めて2ヶ月なら理解できなくても不思議はない。 良い入門書でも読んで理解を深めてくれ。
char *h[26]={"a","b", ... ,"y","z"}; printf( h[i] );
formatでないものをprintfのformat部分に 渡すのは問題あるな。
printf関数は、char型ポインタを取ります。
>>446 が正しい。
>>445 を正しく動かしたければフォーマットをしていする。
printf("%c", h[i]);
ネタにマジレスですか?(w
いや、ちょっと待て。 ポインタで定義してるじゃん・・・ 漏れが悪かった。
450 :
プログラム歴2ヵ月 :02/09/10 03:22
最初に、VisualC++入門を買って意味解らずすてますた 探しまくって現在、初めてのC言語って本をなんとか読んでます 他に超簡単な入門書おしえて(ρ_;)
単に"%s", h[i]にしる、ってことでわ。
452 :
デフォルトの名無しさん :02/09/10 03:50
ポインタで定義?format?いったい何の話なんだよ 漏まえらなんかきらいだー。・゚(≧Д⊂;゚・。
配列を一気に全部書き込まずに、ループで一個ずつfwriteしても 同じでした。書き込みは正常に行われているみたいですが、 feofを使って調べてみた結果、26回目以降のfreadは ファイル終端に達したと判断されて読み込んでいないみたいです。 なぜだ・・・
>>447 自分の参加しているプロジェクトのチームリーダー(30代後半)のプログラムをこの間覗いたんです。
そしたら・・
function(CString l_cstr)
{
CString cstr;
cstr.Format("%s", l_cstr);
何とか言ってやってください。
>>453 じれったい。
ネタはいいから早くタネを明かしてくれよ。
ネタじゃないなら該当のソースを見せろ。
456 :
デフォルトの名無しさん :02/09/10 07:54
教えて下さい 以下のように宣言した場合 #define MAX 100 struct field{ int data; struct field *pt; }node[MAX],*head; 上記において、node[MAX]という変数はstruct fieldという型だとわかるんですが、 では *head はどういう型を持つ事になるんでしょう?これも同じ型ですか?
457 :
デフォルトの名無しさん :02/09/10 07:55
>>454 なにがだめなの?
constの参照私じゃないから?
ちょく代入しないから?
たいした問題じゃないよ
458 :
デフォルトの名無しさん :02/09/10 08:05
>>456 *headはただのポインタ。
char *pStr
と同じ。
>>456 char c, *p;
というふうに続けて書くと、
char c;
char *p;
と同じ意味になる。
struct field {...} node[MAX], *head;
の場合は、
struct field {...};
struct field node[MAX];
struct field *head;
と同じ。こういう省略はC言語特有のスタイルなのだが、嫌う人も多いと思う。
>>457 Cで言えば、strcpyを使うべき所で、
わざわざsprintf("%s", ...)してるという事ではないか
おっとsprintfの引数が。まいっか
464 :
デフォルトの名無しさん :02/09/10 11:19
typedef struct{ char a1[3][3]; int a2; int a3; }A; という構造体のサイズをsizeofを使って調べると20になってしまう。 本来なら17になると思うのですが。。(私の環境ではintは4バイト) どなたかよきアドバイスを!
>>464 構造体のアライメント、で検索するよろし
>>464 パディングやアラインメント
をキーワードに今すぐgo!
>>464 俺の環境だとsizeof(A)は256になるね(sizeof(int)は4)
469 :
デフォルトの名無しさん :02/09/10 11:29
>>465 ,466
産休!気になってしょうがなかった
470 :
デフォルトの名無しさん :02/09/10 11:30
>>468 末尾に詰め物がされることはあっても、メンバー間に詰め物がされることはないんだっけ?
>>470 んなことはない。ネタだったらごめんよ。
472 :
デフォルトの名無しさん :02/09/10 11:33
>>471 いや、マジ質問・・・
どこに詰め物がされても実際にプログラミングするうえでは困らないんだけど、ちょっと興味あるから。
たぶん、ビットフィールドにすればキッチリ詰まるのかな?
ビットフィールドか・・・ なんか構造体みたいな形だったような・・・それとマルチバイト文字のところは全然勉強していないな-_-;
>>472 たとえば、464 の構造体の場合、
コンパイラのデフォルト設定では
char a1[3][3];
の直後に3バイトとか7バイトの隙間ができる方が
俺的な世界においては一般的だと思う。(もちろん処理系にもよる)
なんか配列はビットフィールドにならないぽ
詰めたいと思う動機がサパーリわからんのですが
>464 (char)(char)(char)(----) (char)(char)(char)(----) (char)(char)(char)(----) ( int ) ( int ) char : 1バイト int : 4バイト (----)の部分が埋められカウントされて20になるのでしょ。 (int)の長さに合わせる為になる。 というか、一番長い部分に合わせなかったっけ?(char,int longのレベルで) 構造体の大きさの計算はこんな感じになるはずだと思ったけれどね。 charのサイズを[2][4],[5][5],[4],[8],[9]とか替えてみれば 大体の法則性と言うものが見えてくると思うけれどね。 結果はsizeof(A)/sizeof(char)で出しているかな? 今回は悩むことも無いけれど、sizeof(int)で 割った数値を使ったりすることもあるからね。
>>479 > (----)の部分が埋められカウントされて20になるのでしょ。
ネ、ネタだと言ってくれ。頼む。
> 結果はsizeof(A)/sizeof(char)で出しているかな? ネ、ネ 以下略。
>>479 配列の内部は断片にならないと思うぞ。マジレス
参考までに、MinGWのgccでchar a1[3][3]をsizeofしたら9と出た。
464さん、激サンクス
gcc で x86 なら4バイトアラインメントだから、 (char)(char)(char)(char) (char)(char)(char)(char) (char)(--------------) (------- int --------) (------- int --------) こうでしょ。 で、構造体を直接操る必要があって、かつプラットフォーム非依存にしたいときは、 typedef struct { char a1[3][3]; char padding[3]; /* unused */ int a2; int a3; } A; とかしておく。 ............で、あってる?
>............で、あってる? AAの部分だけは合ってるよ。他は×。
>485 >AAの部分だけは合ってるよ。他は×。 まじ?......(´・ω・`)ショボ-ン
487 :
デフォルトの名無しさん :02/09/10 14:32
ファイルからgetcで一文字ずつ読み込んで,読んだ文字によってifで処理を変更させる プログラムを書いているんですけど,改行文字の直前に謎の文字が入っており, 処理がうまくいきません.printf等で表示させても何も見えません. この謎の文字の正体は一体何なのですか??
488 :
デフォルトの名無しさん :02/09/10 14:33
>>486 あ、ごめん。
>gcc で
の箇所を見落としてたので謹んで訂正する。
前半は合ってるよ。
後半は×。
その方法ではプラットフォーム依存の解決にはならない。
ソースじゃなくて読み込むファイルの中身か。。。
\r\n
>>491 ということはあいつ、バイナリモードで開いているのか・・・
つりし?
printfで数字列にすれば分かると思う。
>>487
> printf等で表示させても何も見えません. 書式指定して数値で確かめろよ。 そうすれば13って表示されるよ。
>>462 ありがとうございます!!!
8年越しの謎が解けました!!
大解決です!!
499 :
デフォルトの名無しさん :02/09/10 15:44
srand()の種に、WindowsAPIのtimeGetTime()のようなミリ秒単位の値 をLinux上で使いたいのですが、代わりのようなものはあるでしょうか?
gettimeofday
502 :
デフォルトの名無しさん :02/09/10 18:42
Rubyは?
504 :
デフォルトの名無しさん :02/09/10 20:04
MICROSOFTのVC++6.0のPROには、 最適化できる機能がありましたが、 VC++NETのStandard Editionには 最適化の機能がありますか?
そんな事知りませんよ。マイクロソフトに聞いて下さい。
Standardには常に無い
507 :
デフォルトの名無しさん :02/09/10 20:29
関数の戻りを無視する時、 (void)foo(); とvoidにキャストするのは正義ですか?悪ですか?好みの問題ですか? コードレビュー時に、後輩にどうアドバイスするか決めかねているので 仕様ではこうなってるなど、なにか良い根拠があれば教えてくださいませ。
>>508 俺も嫌いな書き方なんだけど、例えばsplintは(void)つけないと警告出してくるので、
俺が悪なのかなぁと。
で、どうなの?
510 :
Musasi :02/09/10 20:34
仕事がんばって見つけてください age
何日か目を離しただけで、もう500オーバーしとる…
lintにかけるのはやめようよ・・
>>507 memsetやstrcpyも戻り値は存在するけどその返り値を見てますか?
ふだんsplintなんて使ってられないけど、明日は指導するフリをしなきゃいけないんで………
>>513 なんか煽られ気味だなぁ。じゃぁ(void)なんて書くなヴォケ、死ねDQNと言っておきます。
>>513 strcat(s1,strcat(s2,s3));ってのがあったらしいぞ w
素直にsprintf使えって w
>>517 snprintf (or equivalent) 使え
lispっぽくていいじゃん。おれもそうやって書くことにします!
lispっぽいとイイのか。へえ
522 :
デフォルトの名無しさん :02/09/10 21:43
すみません、ちょっと教えて欲しいんですが。
523 :
デフォルトの名無しさん :02/09/10 21:52
うんこがでません。どうしてですか?
すみません。そろそろ質問してもいいでしょうか?
駄目
まんこって実在するの?
そろそろ質問してもいいでしょうか?
530 :
デフォルトの名無しさん :02/09/10 22:48
すみませ〜ん、誰かいますか?
(-1: 荒らし)
「質問してもいいか」という質問が再帰的に行われ、 その先には進めなくなると言ってみる。
536 :
デフォルトの名無しさん :02/09/10 23:00
main関数の戻りはexitとreturnで返すのでは何か違いがあるんでしょうか?
537 :
デフォルトの名無しさん :02/09/10 23:10
>>536 exitを使えばプログラムないのどこからでも強制的に終了できる。
return でexeを終了するにはmain関数からしかできない。
多田それだけ。
>>536 C-FAQでは基本的に違いは無いと言っている。
/bin/ladin
>>536 abortっつーのあるぞ。興味があれば調べれ。
raise()でSIGTERM送っても終了するんだったかな。
544 :
デフォルトの名無しさん :02/09/10 23:55
オーバーロードってどうやるんですか?
>>544 オーバーロード自体を知って訊いてるのかと小一時間
上書き?
オーバーマインドってどうやるんですか?
プリプロセッサで、言語自体が拡張できるとは、どういう意味でしょうか? C言語はどんなに拡張してもC言語だと思うのですが。 C++はなしでお願いしますm(_ _)m
>>548 その話は忘れろ。
無かったことにしろ。
>>548 Pascalみたいにみせるマクロ群とか・・・
拡張しているわけではないけど。
552 :
デフォルトの名無しさん :02/09/11 00:09
ま た 林 晴 比 古 か
>>548 そういうことに興味持つ香具師はちょっと勉強してC++でテンプレートメタプログラミング汁。
いまのところだれもテンプレートの悪用だとかなんだとか言ってないからよ(w
俺には理解できないのでsage
>>554 俺だけ無視かよ!
いいよもう!
教えてやんないから!
VBよりも遅いから。
おまえらにはりかいふのうだから
while(1) { if( num[pos[cnt].y][pos[cnt].x] == 0 ) return; else{ cnt++; if( cnt == max ) break; } } while文の中で,returnをするとやばいでしょうか? どういう動作をするのでしょうか?
>>561 別にやばくない、関数の呼び出し元へ返るだけ
breakで抜けなくてもいいんだ。 うーむ。 他に問題があるようです。 がんばります。
バグの原因ハケーン。 &&じゃなくて,||だった。 これでも年収120万円もらってるのに・・・。
日本人の平均の1/3以下だ。気にスンナYO!>564
>564 ごめん、漏れ安心しちゃった(藁) まだ下がいた
年収120万ってバイトだよね?
「0一つ抜けてた1200マソです」 という釣りではないか?
学生なら120マソでもいいと思うけどな。んま、漏れは学生んときでも3-400万は 貰ってた気がするが。
いや、実は 564はShowA師で、有名になって仕事が来たので 早速自慢してみた。
572 :
60cm浮き上がるストレート :02/09/11 04:04
僕はゲームで、<conio.h>のgetch()とkbhit()を使い 2468でカーソル移動、+で決定、-でキャンセルを行えるようにしています。 そこで質問です。カーソルが →名前の入力 の時決定ボタンの+を押すとscanf()かgets()を使ってゲームユーザーに 名前の入力をさせるのですが、scanf()やgets()に入るときに前に入力した +が入力するところに入ってしまっています。 解消する方法を教えてください。
>>572 おまいは「2chで得た知識だけでゲームを作れるか」という壮大なネタを展開してるのか?
// ヘッダ [hoge.h] struct Data_monna_tag { char showa[100]; int age; } // グローバル領域 [hoge.c] static struct Data_monna_tag Data_monna={"",-1}; hoge(){ --- --- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ エントリポイントがhoge.cにない場合(hoge.c->hoge.soとかで)で、 functionの中でなく、char *showaを初期化する方法ってこれしかないですか? できれば文字列リテラル""による静的記憶域の消費を抑える為に showa[0]に'\0'入れたいんですけど。
576 :
デフォルトの名無しさん :02/09/11 09:57
↓これ、動く環境と動かない環境があるんですけど。
__,,,,_ /´  ̄`ヽ, / 〃 _,ァ---‐一ヘヽ i /´ リ} | 〉. -‐ '''ー {! | | ‐ー くー | ヤヽリ ´゚ ,r "_,,>、 ゚'} ヽ_」 ト‐=‐ァ' ! ゝ i、 ` `二´' 丿 r|、` '' ー--‐f´ _/ | \ /|\_ / ̄/ | /`又´\| |  ̄\
578 :
デフォルトの名無しさん :02/09/11 10:10
↑つまり環境は、都内でも緑に囲まれて静かなところ。
>>575 > char showa[100];
文字列リテラル""による静的記憶域の消費は気にするのに
静的記憶域に配置した構造体変数のサイズは気にしないのは何故?
>>575 この場合、初期化されたData_monnaが用意されるだけで、それとは別に
文字列リテラル""が用意されることはないと思うんだが。
>>572 ちゃんとgetchして + を検出したのなら、
余計な + は入力バッファに残らんと思うのだが?
例:
if (kbhit() && getch() == '+') { ... }
582 :
60cm浮き上がるストレート :02/09/11 15:33
>>581 こんな感じのコードです。
#include <stdio.h>
#include <conio.h>
void ShowCursol(int *,int *,int,int,int,int,int,int,int);
void MakeInputName(void);
void main(void)
{
int y=0,x=0,get=0;
printf("\x01b[2J\x01b[>1h\x01b[>5h");
printf("\x1b[3;1H→");
printf("\x1b[23;73H終了");
printf("\x1b[13;33H名前入力");
printf("\x1b[14;33H<=16Bite");
printf("\x1b[1;31H名前:名無し");
printf("\x1b[25;27Hカーソル移動12346789 決定+");
for(;;)
{
if(kbhit()!=0) get=getch();
else get=-1;
if(get>='1' && get<='9')
ShowCursol(&y,&x,5,10,3,1,4,7,get);
if(get=='+' && y==2 && x==3)
MakeInputName();
if(get=='+' && y==4 && x==7) return;
}
}
583 :
60cm浮き上がるストレート :02/09/11 15:34
>>582 の続き
void ShowCursol(int *y,int *x,int yUp,int xUp,int yBasis,int xBasis,int yMax,int xMax,int get)
{
printf("\x1b[%d;%dH ",*y*yUp+yBasis,*x*xUp+xBasis);
*y+=1-(get-49)/3;
*x+=(get-49)%3-1;
if(*y<=-1) *y=yMax;
if(*y>yMax) *y=0;
if(*x<=-1) *x=xMax;
if(*x>xMax) *x=0;
printf("\x1b[%d;%dH→",*y*yUp+yBasis,*x*xUp+xBasis);
}
void MakeInputName(void)
{
static char name[17]="名無し";
printf("\x1b[2;31H入力:");
printf("\x1b[>5l");
scanf("%s",name);
printf("\x1b[>5h");
printf("\x1b[1;37H ");
printf("\x1b[1;37H%s",name);
printf("\x1b[2;31H ");
}
カーソルはcursor
586 :
デフォルトの名無しさん :02/09/11 15:57
>>582 たしかにそういう現象が出た。(MinGWのgccのなんちゃってconio.h)
なんか、10年くらい前にも似たような状況に出くわした記憶があるような
気もするのだが、わからん。
それはそうと、荒いコードだな。
589 :
デフォルトの名無しさん :02/09/11 18:35
DWORDの定義は typdef unsigned long DWORD; こんなカンジですか?
WORDはintより6倍遅い と言ってみるテスト
> DWORDの定義は 何のDWORDの定義よ? Win32ならそれでいいんじゃないの。
592 :
DQN初心者2号 :02/09/11 19:12
すみません。もし良かったらアドバイスください(´・ω・`)ショボーン ノードによるリスト構造で、入力した数字を末尾に追加していく プログラムを作ってみますた。そこで、数字を追加するたびに malloc関数で領域を確保していくようにしますた。 実行してみると、動作は問題ないのですが NULL pointer assignment (ポインターがNULLを指し示している??????) とかいうメッセージが実行後に出ます。 これは、何か問題があるのでしょうか? うまくメモリが解放されていないということなのでしょうか? もしよろしければ、おしえてください・・
longのサイズは環境依存、ワードサイズも環境依存
free(NULL);
>>592 > これは、何か問題があるのでしょうか?
リスト構造の解体をしてる箇所がおかしいのに1票
free()してる箇所をコメントアウトして
変なメッセージが出てこなくなるか試して見ろ。
599 :
DQN初心者2号 :02/09/11 19:31
>>592 のソースです。おながいします
前略
struct node{
int num;
struct node *next;
};
typedef struct node NODE;
NODE *start =NULL;
int main(void){
int data;
while(1){
printf("数字をにゅうりょくしてください\n");
scanf("%d",&data);
if(data == 0)break;
writ(data);
disp();
}
delpointer();
return 0;
}
600 :
DQN初心者2号 :02/09/11 19:31
void writ(int data){ NODE *new,*p=start; while(p->next != NULL){ p=p->next; } new= (NODE *)malloc(sizeof(NODE)); new->next=NULL; new->num=data; p->next = new; if(start == NULL)start=new; } void disp(void){ NODE *p = start; while(P != NULL){ printf("%d-",p->num); p = p->next; } printf("\n"); } void delpointer(void){ NODE *next,*p = start; while( p != NULL){ next = p->next; free(p); p=next; } }
601 :
DQN初心者2号 :02/09/11 19:34
> while(P != NULL){ なぜ大文字 P ?
void writ(int data){ NODE *new,*p=start; while(p->next != NULL){ p=p->next; } ... if(start == NULL)start=new; start == NULLなら、最初の p->nextで ぬるぽ。
うむ。たしかにページ違反が出るな。 コンパイル時に警告もわんさか
605 :
DQN初心者2号 :02/09/11 19:47
えっと・・・ (´・ω・`)ショボーン
そっか、警告はプロトタイプ宣言がなかったからだ。スマソ
607 :
DQN初心者2号 :02/09/11 19:56
前略した部分は #include<stdio.h> #include<stdlib.h> void writ(int data); void disp(void); void delpointer(void); としますた・・・
まあ、いろいろ考え方はあるけど、startの前にひとつダミーの要素を くっつけとくとか、ポインタのポインタを使うとか
609 :
デフォルトの名無しさん :02/09/11 19:59
NODE *start =NULL; ・ ・ ・ NODE *new,*p=start; while(p->next != NULL) ここだすね
普通は「末尾の要素へのポインタ」とかを持っておくものだと思うが、 そのへんはいーのか
611 :
DQN初心者2号 :02/09/11 20:03
うーんと・・・ アドバイスいただいたところを中心にもう一回やってみます。 夕飯時に有難うございますた。
ダミー要素を使う例: NODE root = {-1, NULL}; ... void writ(int data){ NODE *new,*p = &root; ... void disp(void){ NODE *p = root.next; ... void delpointer(void){ NODE *next,*p = root.next; ...
ポインタのポインタを使う例: void writ(int data){ NODE *new,**pp=&start; while(*pp != NULL){ pp = &(*pp)->next; } new = (NODE *)malloc(sizeof(NODE)); new->next = NULL; new->num = data; *pp = new; }
ちなみに、関数writは効率が悪いので、もし宿題ならやめたほうがいい。 末尾へのポインタを持っとけ
>>614 有難うございます。
大変参考になりますた。
追伸
宿題ではないです。perlを覚えたのでステップアップして
C言語勉強してます。只今、就職浪人中です(´・ω・`)ショボーン
616 :
デフォルトの名無しさん :02/09/11 21:44
質問です。 エキスパートCプログラミング 知られざるCの深層 p321ページで、変数が符号付かどうかをチェックするプログラム (マクロ)を書けというのがあります。 #define ISUNSIGNED(a) (a >= 0 && ~a >= 0) では駄目みたいなのですが、正しいプログラムを 教えてください。
>>616 基本的には、ちゃんと動いたぞ?
まあ、マクロの書き方としては不十分だが。
--------------------------------------------------
#define ISUNSIGNED(a) (0 <= (a) && 0 <= ~(a))
main () {
signed int s = 123;
unsigned int u = 123;
printf ("signed %d\n", ISUNSIGNED(s));
printf ("unsigned %d\n", ISUNSIGNED(u));
}
--------------------------------------------------
signed 0
unsigned 1
--------------------------------------------------
618 :
デフォルトの名無しさん :02/09/11 22:06
>>617 本文によると、K&R Cでしか動作せず、
ANSI Cでは新しい格上げ規則が適用されるため、
これではうまくいかない、とのことです。
ちなみに、ANSI Cではcharは符号付き、符号無し
どちらでもかまわないことになっているので、
そういったものを判定する際に用いるとのことです。
619 :
デフォルトの名無しさん :02/09/11 22:10
>>616 なんのために使うマクロかさっぱりわからん。
同感
>>618 char だけなら...
#include <limit.h>
#define ISCHARSIGNED (CHAR_MIN != 0)
622 :
デフォルトの名無しさん :02/09/11 22:18
CとC++だったらどっちをやったほうがいいですか? 自分的にはC++だと思うんですけど…
なら C++ やれば?
>>622 このスレではその質問にフェアな答えは出るまい
C++に逝ってきます
フェアな答えはあるのだろうか、と。
C++の本ってCくらい分かっているものとして書かれているものが多いね。 CマガジンのC++講座もそうだし。
NOTがダメならXORでやればばよさそうだが。 #define ISUNSIGNED(a) ((a) >= 0 && ((a) ^ (unsigned)-1) >= 0)
あ、超マヌケだ俺。 氏んできます。ごめんなさい。
お前ら、6chの投票で祭やらんのですか?
632 :
デフォルトの名無しさん :02/09/12 00:10
仕事で必要なんですが、C言語を使って、Oracle,DB2,SQLserverに接続する仕方を知ってる方いらっしゃいましたら教えていただきたいのですが。
それぞれのベンダがインターフェース提供してるだろ。 OracleならPro*C/C++
oo4o
>>635 つながりました!
ありがとうございます
これで今週末の納期に間に合うよ
a=0; b=0; c=2; ( a == 0 || ( b == 1 || c == 2 ) ) この時の, ( x1 || ( x2 ) ) のx1,x2の評価はどういうふうに評価されますか? x2がTRUEの場合,a == 0 || TRUE という事?
>>637 評価順に依存しないような素直なコードを書けばそんなのどうでもいい。
x2は評価されないんじゃ?
>>637 左から評価されて、true || x2 となる。
これはx2と関係なく常にtureなので、x2は評価されない。
>>637 &&と||は左オペランドから評価され、それにより真偽が判定される場合、
右オペランドは評価されない。らすぃ
>>637 > ( a == 0 || ( b == 1 || c == 2 ) )
aが0じゃなかったら(b == 1 || c == 2)が評価される。
> x2がTRUEの場合,a == 0 || TRUE という事?
なんかそのまま書き換えただけのように見えるが、何を考えてる?
>>643 そうッスか?
俺は多少大量になってもifをネストします。
ifの長文の条件式の方が見にくくて嫌いッスけど・・・。
言うまでもないが、実用上はこういう意義がある↓ int l = light(); // 軽い判定処理 int h = heavy(); // 重い判定処理 if (l && h) {...} とやるよりは if (light() && heavy()) {...} のほうが、heavy を無駄に呼ばない分、効率的。 ただし、副作用がある場合には注意が必要。もちろん || でも同じ事。
>>646 あと、int同士でも
if(a && b && c){}
で、c(右)に行くほどfalseになることが滅多にない変数すると効率いいね。
>>647 普段はそっちのほうが重要な。
このへんはさすがにコンパイラ任せには(今のところ)できない。
しかし
>>646 はふつう if の入れ子にするかもしれない罠
sprintfで変数の中身表示するときに 8bitは255までだからmax3桁 16bitは65535までだからmax5桁 ・・・ と決め打ちしてchar temp[4];とかしてもOKですか? (4なのは'\0'分余計に取ってるつもり)
>649 マイナスは考慮しなくていいの? 素直に snprintf 使った方がいいんじゃないかな?
>650 snprintfを知りませんでした。ありがとう。
653 :
デフォルトの名無しさん :02/09/12 09:55
char a=255; a++; としたら、aが0になることは仕様として保証されてますか?
>>653 オーバーフローしてマイナスになるんじゃなかったっけ?
って言うか、signedのcharは、255まで行かない・・・。
って言うか、オーバーフローを期待する処理って見たことない・・・。
655 :
デフォルトの名無しさん :02/09/12 10:13
>>653 いない。
char型が8bitである保証はない。
>>654 おっと、unsigned char の間違いでした。
その場合は255の次は必ず0になりますかね?
>>655 K&Rを見たらchar型は1バイトと書いてあったから
(対してintは「自然な大きさ」と書かれている)
charのバイト数は省略して書かなかったんですが……。
一応char型が1byteだと仮定して話してます。
>>656 1byte = 8bit
とは規定されてないんじゃなかったっけ?
658 :
プレゼント :02/09/12 10:49
661 :
デフォルトの名無しさん :02/09/12 12:11
>>656 ,657
ANSI C言語辞典第一版の付録?のハードウェア特性一覧によれば
Hoheywell 600 のCHAR_BITマクロつまり1バイトのビット数は9だったそうな。
ANSIでCHAR_BITなんてマクロが定義されている以上は可変なんだろやっぱ。
int a; としたとき sizeof(int) と sizeof(a) は 意味・処理ともに違いますか?
>>655 > char a=255;
char型に255の代入結果がどうなるかは処理系定義
コンパイラのマニュアルに聞け
>>662 結果は同じだが意味は
a += 1; a = a + 1;
と同じぐらい違う
664 :
デフォルトの名無しさん :02/09/12 13:29
#include <stdio.h> #define num 5 int main(void) { FILE *fp; int num,i; fp=fopen("test1.bin","rb"); if(fp==NULL){ printf("ファイルをオープンできませんでした\n"); return 1; } printf("何番目のデータを読み込みますか?(1〜5)\n"); scanf("%d",&i); fseek(fp,(i-1)*sizeof(int),SEEK_SET); fread(&num,sizeof(int),1,fp); printf("%d番目のデータは%dです。\n",i,num); fclose(fp); return 0; } ある参考書にのってるソースなんですが、 コンパイル全然できません。何がおかしいんでしょうか? 厨房ですがお願いしますだ。
>>664 使用しているOS、コンパイラ、それに
どのような方法でコンパイルしてみて
どのような結果になるのかを書け。
>>664 #define num 5
を削除。
ど ん な エ ラ ー が 出 た の か く ら い 書 け よ 。
>>664 1. コンパイラが入っていない。
2. ソースを入力していない。
3. コンパイルの仕方が判らない。
のどれかでしょう。つか、
> コンパイル全然できません。
だけで何が起こっているのか他人に判るとお思いか?
と思ったら何なのこれ? >#define num 5 >int num,i; ネタだったのか、くそ!
669 :
デフォルトの名無しさん :02/09/12 13:43
いやネタじゃないっす。リア中です。 LSI-cで、コンパイルしたっす。 OSはウインドウズっす。 iが未定義と山ほどでたっす。 でも解決しました。 アホみたいなこと書いてすんません。 参考書のソース>ネタw
670 :
デフォルトの名無しさん :02/09/12 14:31
突然ですが、質問があります。 C言語のプログラムで、キー認証を行うためのプログラムは、どのようにして組めばよいのでしょうか? お答えいただければ幸いです。
char s[256]; puts("キーを入力してください >"); fgets(s,sizeof s, stdin); if (strcmp(s,"1234")!=0) { puts("キーが不正です"); exit(1); }
672 :
デフォルトの名無しさん :02/09/12 16:47
依存関係を示すインクルード文はどこに書いてる? ヘッダ? ボディ?
#includeならコメントを除けば一番上に書いているけど。
実際そういう場合 sizeof(型) 派と sizeof(変数) 派ではどちらが多いのだろう。
>>676 俺は型だな。
でも配列の要素数を求める時はsizeof 先頭の要素で割っている。
ソケットとか、Windowsの構造体とか、 ライブラリやAPIが要求する場合は型のサイズ、 それ以外は変数
そういえば型だと変数の型をintからshort intに変えた時などにsizeofのところも変えないといけなくなるな・・・
>ソケットとか、Windowsの構造体とか よろしければ理由も教えてもらえますか?
なるほどその場合は明らかに両者の結果が違ってしまうケースなので 仕方がないですよね。基本的には sizeof(変数) ってことですね。
>>682 つられんなよ。ポインタでも sizeof *pでOKだろ。
684 :
デフォルトの名無しさん :02/09/12 17:34
質問です。 横に40個並んだ数値データの列が100行あるデータファイルがあります。 データの一つ一つは5桁の整数で、これを配列に格納したいのです。 1 2 3 1 1.............(40個) (100行) いったいどうすればいいのでしょうか? fscanf(fp,"40%5d" a[i][j] j=1,40); なんていうのは無理なようですが......。 どなたかお助けを。
変数というか式になりますかその場合。
686 :
デフォルトの名無しさん :02/09/12 17:36
>>684 一行に確実に40個数字があるの?それぞれの区切り文字は半角スペース?
というか、どちらでもいい。つまらん論争だな。
688 :
デフォルトの名無しさん :02/09/12 17:42
>>686 数字は確実にあります。Fortranから吐かれたでーたで、半角スペースも
1桁とかぞえて、5桁です。
^^^24^^^12^^^^1.......
(^は半角スペースのつもり)
fscanf(fp,"%d%d%d%d.........(40個ならべ、それぞれ変数に格納しる)
というしかてがないのでしょうか?
>>684 俺ならfreadを使う。それとatoi系の関数。
>>689 fgetsとstrtolの方がよくない?多分strtolは数字のあとの空白で変換を終えてくれるとおもうから。
strtolの第二引数をうまく使えばいいと思うんだよね。
>>690 ありがと。書き込み時刻からわかると思うけど、
俺のレスは 684を読んだ時のものです。
>>689 なぜfreadを薦めたのかわかった。
なるほどね(笑) よく
>>688 を読んだら分かった。
>>688 for(i = 0; i < 100; i++) {
fgets(buf, sizeof buf, fp);
for(j = 0; j < 40; j++) {
sscanf(buf,"%d", a[i][j]);
}
}
じゃ駄目なの?
>>693 皆様、レスありがとうございます。
でもfreadを使う方がいいのか分からない........。
>>695 何桁だろうとスペースで補って5文字なんだろ?
ならfread使えばいい。
>>696 fread使ったことがないですが、やってみます。
>>694 こちらの線も試してみます。
(Fortranはこういう時だけ便利なんだけどなあ。)
freadで5バイトずつ読みとってからatoiで数値にして変数に格納。これを40回繰り返してから改行文字を読み飛ばす。 という作業を100回繰り返せばよいのかな。
×5バイトずつ ○5バイト
>>698 改行文字を読み飛ばすのはどうするんですか?
>>700 fgetsとか・・・
まあ改行文字数分fseekしてもいいけど。
あ、そうだ。 5バイト読みとったあとに終端に\0をつけないと。 最初にbuf[5]に\0を入れておいてもいいかな。
退屈です。仕事をください。
externのプロトタイプ宣言ってつけた場合とつけない場合とどう違うのですか? extern宣言の場合、とあるプロジェクトのソース見たら引数が違ったのですが。 こんな感じで・・・ ↓ ---a.c--- extern int hoge(); --------- ---b.c--- int hoge( int hoge ){...} ---------
706 :
デフォルトの名無しさん :02/09/12 22:16
memsetをつかうと警告で”プロトタイプ宣言の無い関数の呼び出し” といわれてしまうのですが.........。
707 :
デフォルトの名無しさん :02/09/12 22:19
>>705 デフォルトでexternだからつけてもつけなくても同じ
>>706 string.hをインクルード
あくまでも「extern」を。だからね。
709 :
デフォルトの名無しさん :02/09/12 22:22
いくら欲しい?
ちなみにプロトタイプ宣言の引数リストが省略されると関数呼び出しでどんな引数リストにしてもコンパイルでひっかからないはず。
712 :
bloom :02/09/12 22:34
714 :
デフォルトの名無しさん :02/09/12 22:54
おれの能力を100とすれば710の能力は30ぐらいだな。
C++厨がいる模様。
freadの使い方はなんとなくわかったのですが....。 横40、縦126に並んだ5桁ずつのデータをmallocで動的に確保 した3次元配列に格納しようとしています。 イメージとしてはx[i][j][k]です。 for(i=0 ; j<1 ; i++) { for (j=0; j < 128 ; j++ ){ // セクター範囲ループ fread(x,sizeof(int),40,fp1); // レーダー雨量の読み込み printf("%d\n",x); } } メモリの確保は成功しているようなのですが、読み込むときに ”メモリがreadになることは出来ませんでした"といわれます。 なぜでしょうか(T_T)。
>>716 コメント消し忘れた...鬱欝....。
> fread(x,sizeof(int),40,fp1) fread(x[i][j],sizeof(int),40,fp1); int x[2][128][40]; と仮定
あれ? int x[1][128][40]; か?
718は25くらいか
C++厨は可及的速やかに去ってください。
723 :
デフォルトの名無しさん :02/09/12 23:36
>>720 本当は、i=720,j=128,k=40のデータなのです。
今は簡単のため、i=1にしています。
あっ!
>>716 は
for(i=0 ; j<1 ; i++) {
になってた。
これ
for(i=0 ; i<1 ; i++) {
欝鬱蔚....。
もしかして、xってint型? freadの第一引数はvoid *だよ(^_^;)
>>716 一番外のループの判定はi使ってるよね?
多分freadの機能を勘違いしているんだと思う。
>>725 あ、私の勘違い。(xのデータの意味を聞かれているのかとおもった。)
え、ということは、型キャストかなにかしなければいけないのですか?
ネットで調べたら
double data[256];
fread( data, sizeof(double), 256, stream );
というように使ってあったのですが。
>>726 はい。iです。
>>729 いや、ポインタならいいんだけど、printfで%dなんてやっているからint型かと思った。
int x[720][128][40]; fread(x, sizeof(int), 720 * 128 * 40, fp1); ひょっとしてこうか?
732 :
デフォルトの名無しさん :02/09/12 23:49
#include <stdio.h> int count_bits(unsigned int x){ int count = 0; while (x){ if (x & 1U) count++; x>>=1; } return (count); } int int_bits(void){ return (count_bits(~0U)); } void print_bits(unsigned int x){ int i; for (i=int_bits() - 1;i >= 0; i--) putchar(((x>>i) & 1U) ? '1' : '0'); } int main (void){ unsigned int nx; printf("非負の整数を入力してください:"); scanf("%u",&nx); print_bits(nx); putchar('\n'); return 0;} // -------------------------------- 上記のプログラムでunsigned なら動くのですが unsigned int を全て int に変えると動きません。 エラーメッセージも出ないので無限ループか何かに入ってるようです なぜだかわかりますか?
↓なんか、やってること変わってない? 684 :デフォルトの名無しさん :02/09/12 17:34 質問です。 横に40個並んだ数値データの列が100行あるデータファイルがあります。 データの一つ一つは5桁の整数で、これを配列に格納したいのです。 1 2 3 1 1.............(40個) (100行)
ちなみに入力にはいづれの場合も正の整数を入力しています 環境は コンパイラ:Borland C++ OS: Win2k です
>>732 処理系によっては論理シフトが算術シフトになるから?
・・・・きっと的はずれなこと言っているな・・・・
>>730 ありがとう。
>>731 え、そうなるんですか?
改行されているのですが、freadは無視して読み込んでゆくのですか?
>>733 データの列は100⇒128になりました。
freadがよいというのでやって見ているのですが.....どうも
うまくゆきません。
>>736 freadで5文字分をchar型の配列に読み込んでからatoiで変換するんだってば。
>>735 多分そう。
>>732 count_bits() のループ内で、x の値がどう変わっていくか調べると判ると思う。
最初にfreadを薦めた人の考えは、 「一行の構造が決まっているから、改行文字以前の部分は 一気に固定長の文字配列に読み込んでから変換すればいい」 って事だと思う。 それがなぜか、intの多次元配列に直接読み込んでる。 ご冗談を。。
>>737 >>739 ああ、ワカリマスタ.....。
有難う、やってみます。
当方Fortran厨だったもので、Cの文字列の扱いがどうにも
苦手です。ただただ、データファイルの整数値を読みたいだけ
なのですが(涙)Fortranなら
read(fp1,'40d5') a[i][i][k] k=1,40
でスミマスのに.......。
741 :
デフォルトの名無しさん :02/09/13 00:07
C の 無 能 さ が ま た 証 明 さ れ ま し た
739は28だな。
char buf[40 * 5 + 1]; buf[40 * 5] = '\0'; // 末尾に車止め ... for (i =... for (j =... fread(buf, sizeof(char), 40 * 5, fp1); // 5桁が40個 for (k = 0; k < 40; k++) x[i][j][k] = atoi(buf[k * 5]); ... こういう意味だよね?
間違えた > x[i][j][k] = atoi(buf[k * 5]); x[i][j][k] = atoi(buf + k * 5); または x[i][j][k] = atoi(&buf[k * 5]);
でもまてよ、5桁の最上位が必ず空白であると仮定しているんだけど、 これって本当かな
改行の読み飛ばしは適当にやってね
>>748 仮定してないでしょ?
10000以上の数だったら空白はないはず。
>>750 そか、じゃあ、5文字ずつやんなきゃ駄目だね。
でも正直、「何も考えずにscanf(系)を使え」が正解だと思うのだが
>>752 ん?ということはある数をxとして、0 <= x <=9999か?
>>752 ありゃそうなのか。じゃああとは、改行の読み飛ばしだけか。
>>752 「車止め」というか null terminator とか何とかいうんだけど、
C言語の文字列は、末尾に 0 コードが入っていないといけない
757 :
デフォルトの名無しさん :02/09/13 00:27
753は10ってとこだな。
>>753 私も初めは
fscanf(fp,"%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d\n",a[i][j][1],a[i][j][2].....);
考えましたが、これはあまりにも......。
>>754 整数値はせいぜい3桁どまりです。
車止め・・・・、初めて聞いた。 どこか地方の方言?
761 :
デフォルトの名無しさん :02/09/13 00:31
番兵ちゃうのん?
あんまり関係ないけど、 char (*token)[5] = buf; という、5文字単位に切り直したポインタを使うと、 > x[i][j][k] = atoi(&buf[k * 5]); これが x[i][j][k] = atoi(token[k]); となって、見やすいかもしれない。。。けどどうでもいいな、こりゃ scanfマンセー
763 :
デフォルトの名無しさん :02/09/13 00:43
東京は雨が降ってきたみたいです。 このスレは雨天休業です。
>761 ちゃう
いややっぱり違うっぽいです #include <stdio.h> int main (void){ int x; printf("非負の整数を入力してください:"); scanf("%d",&x); x >>=5; int i; for (i=32-1 ;i >= 0; i--) // intは32bit putchar(((x>>i) & 1U) ? '1' : '0'); putchar('\n'); return 0; } これを実行してみたところ(値は5ぐらいを代入) 全て0になりました。算術シフトはされていないようです。
766 :
デフォルトの名無しさん :02/09/13 00:47
764は8か
intの右シフトが算術シフトなら 上位ビットは1になるはずですよね? しかも代入している値は正の数ばかりですので 最上位ビットも1ではありません。 どなたか間違いのわかるかた よろしくお願いします
>765 たぶんそこじゃなくて count_bits() 関数のことを言ってたんだと思うけど......
>>767 いくつかあるループのうち、どこで無限ループになるのか書いてくれればバグの発見も早いわけだが。
> scanf("%d",&x); > x >>=5; えっと、32より小さな値は無視?
あ、64かな
773 :
デフォルトの名無しさん :02/09/13 00:51
LEAVE命令とFPOデータではどのくらい処理速度が変わってくるのでしょうか。 概算でいいので教えていただけないでしょうか。
>>769 x>>=1; の部分ですか?
それならこの方法でもわかると思いますが違うのでしょうか?
>>770 ちょっと試してみます
>>771 右シフトすると上位が1になるか確かめるためです
とりあえず右にシフトしたかっただけで
5自体に特別な意味はありません
>>732 ↓これの
int count_bits(unsigned int x){
int count = 0;
while (x){
if (x & 1U) count++;
x>>=1;
}
int cout_bits(unsigned int x)
を
int count_bits(int x)
にすると無限ループになるって話じゃないのかな(わかんないけど)?
>>769 count_bits 関数のことでした
なぜここだけint にすると問題が出るのでしょう?
わからないです
FILE *fp; int i,j,k; int x[1][128][40]; fp = fopen("filename", "r"); for(i=0; i<1; i++) for(j=0; j<128; j++) for(k=0; k<40; k++) fscanf(fp, "%d", &x[i][j][k]); fclose(fp);
>>777 そうです。そのとおりですが何がおかしいのかわかりません
算術シフトって、 「シフトすると最上位ビットが1になる」んじゃなくて、 「シフトしても最上位ビットは変わらない」だと思うが。 「算術シフトはされていない」という言葉の意味がわからなかったので、 よく読まずに書いてみるテスト
int型を受け取るcount_bitsにINT_MAXよりも大きな値を渡したら無限ループにならない?
>732
>>777 だけど、
x には 111.....111 が渡されるから
これをいくら算術シフトしても111....111のままで無限ループ
確か算術シフトは最上位ビットで
シフトして動かした部分が埋め尽くされることだったと思います
>>777 での unsigned を除くとエラーがでることが不明です。。
>>784 算術シフトじゃなくて算術"右"シフトな。
どちらにしろ最上位ビット(符号ビット)は変わらないだろ。
>>784 なるほど、完全にわかりました。
ありがとうございました
(-1 >> 1) == -1 であることを踏まえると、 x = -1 から初めて x >>= 1 を何度か繰り返しても、 決して x == 0 にはならない。 よって↓は無限ループに陥る while (x){ if (x & 1U) count++; x>>=1; }
オソカッタ
ビット数が分かっているのなら指定回数ループすればいいのに。
いや、この場合はきっと可変か・・・
つっこまれそうなんで一応・・・ 11000と1011000などで桁数が違うってこと。
なんで三重配列なんだろう。
fread()のやりかたで結構うまくいっているのですが データがずれて読み込まれています...。 (ああ、明日までに終わるか) for (i=0 ; i < t ; i++){ buf[40 * 5] = '\0'; // 末尾に車止め for (j=0; j < 128 ; j++ ){ fread(buf, sizeof(char), 40*5, fp1); // 5桁が40個 for (k = 0; k < 40; k++){ x[i][j][k] = atoi(&buf[k*5]); dummy = x[i][j][k]; if( dummy > 0 ){ printf("%d %d %d\n",j,k,dummy); } } } }
>>796 だから「改行を読み飛ばしなさい」とあれほど。。。
fscanf(fp1, "\n"); とかでできるような気がする。嘘かもしれないが
あくまでもfreadなどの低レベルな関数に拘るなら、 fseek(fp1, 1, SEEK_CUR); または fseek(fp1, 2, SEEK_CUR); で、改行コードの分だけ送り出す
>>796 freadで一行を一気に読み込んでどうするのよ。freadで5バイトずつ読めって言ったでしょ。
一行を一気に読み込むのならばfgetsでいいと思う。
正確に言えば「freadで改行文字を除いた一行を一気に」だな。
> freadで5バイトずつ それはどういう御利益があるのか
>>801 省メモリー
というかその方がわかりやすいでしょ・・・
> その方がわかりやすい fscanfの方がわかりやすいもんねっ
>>803 それはまた別の話だよ。
freadを使った場合に限って。
200バイトを省メモリーって、ネタですよね?
関数呼び出しがけっこう増えるぞ
一行読み込んでもいいけれど、fgetsにしろっての。
混乱してきました......。 とりあえず、freadの線でやっています。 改行を読み飛ばすすべを教えてください。 (fscanf(fp1, "\n"); では駄目でした)
>>809 freadじゃなくてfgetsで読めば改行の読み飛ばしなんて考えなくていい。
ただしバッファはもう少し多く取ること。
>>809 bufを少し大きくして、fread を fgets(buf, sizeof(buf), fp1) に置き換える
>>810 わかりました。
fgetでやってみます。(もういわれるがまま.......。)
あと、みなさんも有難う。
fgetsでタイムアウトってねーの?
fgets(buf,sizeof(buf),fp1)じゃなくてfgets(buf,40*5+2,fp1)の方がいいかも。 確かバッファはmallocで獲得しているとか言っていたし・・・
fgetsで1行読み込み。 読み込んだ文字列に対して strtokで文字列切り出し。 切り出した文字列を atolなどで数字に変換。 を行数分繰り返す。 が楽だと思うけど。
Perlを使うのが楽だと思うけど。
while (x){ xだけは危険。 とか書いてみる。 strtok で、区切りは空白?
>>817 だね。\nを入れてもいいけど。意味無いけど。
>>818 !!いけました.....ああ。
(なんということだ)
でも色々勉強になりました。
これを機に、文字列の扱いも勉強してみます。
有難うございます。
> strtok 切り出さなくても桁がそろってるそうだから、 atoi(&buf[k * 5])でいいらしい
(でも、まだ終わりじゃないんです。)
823 :
デフォルトの名無しさん :02/09/13 02:22
int main(void) { int *p, rt; rt = fnc_1(p); // その後fnc_1()で入った値を使う } int fnc_1(int *p) { int i; // 毎回iに違う値が入る....... p = (int *)malloc(i * sizeof(int)); // pに適当な値が入る。 *p = 1;*(p + 1) = 2;..... return 1; } の場合、fnc_1()が終わった時点でmalloc()で確保した領域は開放されて しまって、後でmainのほうでは値を見ることができないのでしょうか?
結論=やっぱり正義(scanf)は勝つ
>>823 > fnc_1()が終わった時点でmalloc()で確保した領域は開放
んなことはない。が、
> int i; // 毎回iに違う値が入る.......
> p = (int *)malloc(i * sizeof(int));
i を初期化せずに使って大丈夫なのか?
>823 static i=0; i++; とかにしないと・・・ mainのpとfnc_1のpは別物だからね。 fnc_1内のそれらは、毎回初期化される。 iは使い物にならないと思うよ。
>>828 あーなるほど、そういう話だとすれば辻褄があうな
てか思いっきりメモリリーク
>>830 必ずしもそうではないと思うけど、議論は長くなりそうなので略。
>>830 俺も初めそれ疑ったけど、省略してあるので何ともいえん
833 :
デフォルトの名無しさん :02/09/13 02:42
わかった。int **pp だ
int main(void) { int *p, rt; rt = fnc_1(&p); // その後fnc_1()で入った値を使う } int fnc_1(int **pp) { int i; // 毎回iに違う値が入る....... *pp = (int *)malloc(i * sizeof(int)); // ..... return 1; }
もし引数によってアドレスを返したいなら、 「受け皿のポインタpへのポインタpp」が渡らなければならない
訂正:「受け皿のポインタpのアドレスpp」
837 :
デフォルトの名無しさん :02/09/13 03:43
mod_cってなんですか?
俺は放置プレイですか?
774を放置してるからでない?
774を見逃していた。 アセンブラの命令の話です。これもここでいいんだよね。
誰がそんなことを?
>>820 fgetsを使うくらいなら freadを使っておけ。
つーか、fgetsをすすめる奴らは
とりあえず動けばそれでいいのか?
例外時のケースも少しは考えろ。
それから、fseekは効率が悪いので、
fgetcで改行コードを確かめる方がベター。
はあ、昨日は退屈すぎて寝ちまったんだよ。仕事をください。
初歩的な質問で申し訳ないのですが 48330000,山田川,59,129,177.0,3971.5,0.0,0.0 というデータを読み込むのに fscanf(fp2,"%d,%s,%d,%d,%f,%f,%f,%f\n",&mesh,&sdummy,&range,§or,&fdummy,&fdummy,&fdummy,&fdummy);でだめなのはどうしてでしょう? printf("%d\n",range); とやると 4251844 という値が出てきてしまいます。
>>845 rangeじゃなくてsdummyの内容を確認してみれば、理由が分かると思う。
>>846 printf("%s\n",sdummy);
とすると
山田川,59,129,177.0,3971.5,0.0,0.0
ということは.....。
>>844 こちらのやり方も今度マスターしてみます。
(いまのところ私にはむずかしすぎるようです)
自己レスfscanf(fp2,"%d,%6s,%d,%d,%f,%f,%f,%f\n",&mesh,&sdummy,&range,§or,&fdummy,&fdummy,&fdummy, &fdummy); としてできました。ありがとう。
if(a != 0 && (b != 0 && c != 0) ) continue; の時に, aがTRUEで, bかcがFALSEの時は,continueが実行されません continueが実行されるようにするためにはどうしたらいいのでしょうか?
%s で、読み取る時に、','以降まで、読みとって整合性が無くなるのはよくある話し。
真理値表書いてどの時、continueしたいのか書いたほうがいいかもしれないけど、 &&=>||でいいんじゃない? aがTRUEって、a!=0がTRUEのこと?
a!=0がTRUEのことです
(b!=0,c!=0) が (T,T)(T,F)(F,T)(F,F)[T:TRUE,F:False] の、どの時、continueしたいの? さらに、A!=0がTRUEの時は、常にcontinueを、実行したいの?
if(a != 0 && !(b == 0 && c == 0) )
continue;
で無理やり解決しました
>>851-852 ありがとう
>>854 a!=0がTRUEの時でも,
b == 0 と c == 0の片方がTRUEになった時に抜けるんじゃなく,
b == 0 と c == 0の両方がTRUEになった時に抜けるようにしたかったんです
!(b == 0 && c == 0) は ( b != 0 || c != 0 ) と等価なんだが。
↓まあまあ、そうツッコむなよ。
くそ、一歩遅かった。
>>857 ってことは,
b == 0 と c == 0の両方がTRUEになった時でも
FALSEになると?
if(a == 0 || (b == 0 && c == 0) ) の条件にならない時に,continueしたかったんですが
if(a == 0 || (b == 0 && c == 0) ); else continue; や、 if(!(a==0 || (b == 0 && c == 0) ) )continue; if( a!=0 && !(b== 0 && c == 0) )continue; if( a!=0 && (b != 0 || c != 0) )continue; などが等価だと思われます。
すべてのデータが 39341725,山田川,66,83,198.0,4584.3,0.0,0.0 と思っていたら、ところどころ 39341726,-該当なし-,-,-,-,-,-,- というデータが入っていました。 "-該当なし-"のデータは飛ばしたいのですが 上手い判定の仕方がわかりません。 予めbufに読み込んでから長さを測るのですか? (カンマも含めて一行のデータの長さは固定です。) 結構膨大なデータなので時間がかかりそうな....。
>>844 freadで一行を一気に読むコードを書いたやつに言えよ。
俺はfreadで一行を一気に読むくらいならfgetsを使えと言ったんだ。
ところで、例外ってどんな例外?
>>864 if(*dat[1]=="-該当なし-")
continue;
じゃなくて?
該当なしの時、その後のデータにも'-'が入っているのなら
if(*dat[2]=='-')
continue;
で、出来ないの?
その前に取りこんでから、isdigit等を使うのかもしれないけれど。
やっぱ、strtokがいいんじゃないの?
char *p; gets(in); p=strtok(in,","); for(i=0; i<8; i++){ 〜〜〜〜 &nbswpp=strtok(NULL,","); }
869 :
デフォルトの名無しさん :02/09/13 13:37
int i; *(&i)=0; というコードがあったんですけど、i=0;とどう違うんですか・・・?
>>844 fread/fgets論は興味ないので見てないけど、
いまどき、これくらいの処理で効率を気にするか?
例外云々もこれがどういうところで使われるのかによるし。
数回手動で動かせばいい、問題あったらその場で手直しできる
ようなプログラムなら、とりあえず動けば全く問題なし。
871 :
デフォルトの名無しさん :02/09/13 13:39
標準入力から読み込まれた テキストの最初の12行だけを表示するのを作りたいんだけど 何かヒント下さい…。さっぱり分かりません…。
見た目と書く奴の神経が違うだけ。
873 :
デフォルトの名無しさん :02/09/13 13:41
>>869 見た感じ同じだと思うが、
書いた本人に意図を確認するのが一番確実だと思う。
>>870 お前の書いたプログラムはせいぜい学習用だけに
使ってくれ。間違っても外部に公開するな。
877 :
デフォルトの名無しさん :02/09/13 13:43
なるほど…。 有り難うございます。
自分用の使い捨てプログラムにわざわざ様々なエラー処理を施すやつもあまりいないと思うよ(笑)
>自分用の使い捨てプログラム 誰もそんなことは言ってないが?
882 :
デフォルトの名無しさん :02/09/13 13:48
あれだけしっかりとフォーマットの決まっているファイルなら、エラー処理なんていらないと思うんだが・・・
えっとたびたびすいません、では、 実行プログラムの名前が myhead でそれがカレントディレクトリに存 在するとすると, myhaed < ~/.cshrc というコマンドの出力結果が head -12 < ~/.cshrc の出力結果と同じになるようなプログラム. の場合はどうしたら良いでしょうか…?
885 :
デフォルトの名無しさん :02/09/13 13:51
strが指す文字列が空かどうか判断するには、 if(*str=='\0') /* 空 */ ; else /* 空でない */ ; これが一番効率がいいですか? コードのわかりやすさではif(strlen(str)==0)だと思うんですけど。
>>883 だめだ、お前ら話にならん。
初心者スレで実用を仮定した話をすること自体が
無理なんだろうな。
まあいいわ。俺が困るわけでもない。
>>883 他人が使うモノなら、正しいフォーマットが入ってくることを期待
するのはかなり危険(仕様外だとつっぱねることができるとしても)。
>>884 一文字ずつよみ取り表示しながら、\nを12回検知するかファイルの終端に達したら終わりにすれば?
889 :
デフォルトの名無しさん :02/09/13 13:54
>>887 やつの最初の方の書き込みをよく見ろよ・・・
>>888 なるほど、どうもありがとうございます、
さっそくやってみます!
>>886 無理というか、わざわざここでそういう話をする意味があるのか?
まぁ、注意を促すのは悪いことではないと思うけど。
限りなき初心者ですみませんが、 typedef struct { int index; char name[NAME_SIZE]; } Data; というような構造体があったとして、main()の中で Data array[ARRAY_MAX]; for(i = 0; i < ARRAY_MAX; i++) { array[i].index = 0; array[i].name = NULL; } ってやって初期化しよとしたら駄目でした。書き込んではいけないところに書き込もうとしたんでしょうか? もしそうなら、どうやって初期化したらいいでしょうか? お願いします。
この場合、正しいフォーマットを期待しなければfreadなんて使えないだろ(ワラ
> 無理というか、わざわざここでそういう話をする意味があるのか? あるに決まってるだろ。
895 :
デフォルトの名無しさん :02/09/13 13:58
>>894 じゃぁ、どこまで作り込めばいいと思う?
>>897 はぁ?
じゃあ5桁じゃなくてもfreadを使ってうまく動くのか?
>>898 freadでバッファに取り込んで、1文字ずつ自分で処理していくんじゃない?
ばかばかしいけど。
Perlを使え。 ということで684ネタはここで終了。
>>899 ファイルサイズを調べてからファイルの内容を全部ってことか・・・?
あほらしい。
902 :
デフォルトの名無しさん :02/09/13 14:10
>>885 strlenも、すぐにループが終わるのでそんなに効率悪くないと思う。
>>898 固定長で読み込めば仮にファイルの途中が破損しても
破損していないデータはすべて読み込むことができる。
fgetsでは破損個所以降のデータがすべてずれてしまう
可能性がある。この違いは大きい。
多分お前ファイル操作を根本的にわかってないよ。
>>903 で、破損していないデータだけ読み込んでどうしようってんだ?
getsにつづいてfgetsまでたたかれるようになったのね。 じゃあこれからは標準入力から読むときもfread使おう。
バッファを満たすまで入力が終わらないと思うけど、それは仕様ということで。
>>904 じゃあお前だけデータを全部失っとけ。
そしたらバックアップがどうとか書くんだろうな (プ
読んだだけでファイルって壊れるものなのか・・・知らなかった!!
だからfscanfを使えと
>892 array[i].*name = NULL; は?
じゃあそろそろこの辺でまとめてよろしいか。 少しでも堅牢なプログラムの方がよいと思う人は freadを使え。 自分用の使い捨てと学校の課題レベルのプログラムしか 書いたことがない人、 または 1行が可変長のフォーマットを処理する時は fgetsを使え。 以上。
>>903 途中で余計な空白文字が入ってレコード長が変わっちゃったとかいう
場合にはfgetsのほうが融通きくと思うけど?
>>895 なるほど。ありがとうございました。
>>911 あ、そうするのか…それでarray[i].nameの値がからっぽになればいいのかな?
ありがとうございました。
>>913 あんたファイルの仕組みを理解してないよ。
>>913 安全よりも融通を優先するのか?(プ
まあお前はデータを全部失っとけ。
apacheもfgets使っているな・・・ これからは怖くて使えないや。
ところで、なぜfreadの方が安全なの?
>>919 破損したファイルをfgetsで読むとデータをすべて失うから。
>>921 あんたファイルの仕組みを理解してないよ。
ファイルの途中が破損しているわかった場合、 そのファイルの中のデータは既に信用ならないものに なっていると思うが。
>あんたファイルの仕組みを理解してないよ。 このセリフは聞き飽きた どうせならもっと建設的な意見述べてさっさとこの議論終わらせてくれよ
fgetsを使ったソフトなんていくらでもあると思うんだが。。。 それはみんな危険なんだろうか。
誤りのないバイナリデータの入力はfread、 何か誤りがありそうでテキスト入力ならfgets -> sscanf ってやってたけど間違ってたのか。
>>924 じゃあそろそろこの辺でまとめてよろしいか。
少しでも堅牢なプログラムの方がよいと思う人は freadを使え。
自分用の使い捨てと学校の課題レベルのプログラムしか
書いたことがない人、
または 1行が可変長のフォーマットを処理する時は fgetsを使え。
以上。
たとえばさ、一行100バイト(改行コード含む)という仕様のデータ ファイルを処理するときに、fgetsで一行読み込んで途中で100バイ ト以外の行があれば、とりあえずその行は捨てて、次の行から処理 を継続してるんだけど。何かまずい? freadで100バイトづつ決めうちで読み込んだら途中でずれそうで恐い。 #1バイトずつ自分でパースしろって?
でもなんで読んだだけでデータを失うことになるのかなぁ? ファイルってそんなにもろいのかなぁ?
>>928 コピペは建設的ではないよぉぅ ・゚・(ノД`)・゚・。ウワァァン
903 がファイルの仕組みを理解してないってことでよろしいか。
>>929 そのデータの作成方法にもよるだろ。
> fgetsで一行読み込んで途中で100バイト以外の行があれば、
これが破損によるものなら、
> とりあえずその行は捨てて、次の行から処理
> を継続してるんだけど。
fgetsだとこの時点でデータがずれる。
が、破損でなくて、人間がエディタで直接作成したデータ
(作成時にその行の長さを間違えた、つまり可変長になっている)
だとしたらfgetsの方がいい。
一様乱数を作りたいんですが。 randでは無理ですよね?
array[i].name[0] = '\0';
>>933 ずれたとして、なんでそれだけでデータが失われるの?
そこが一番の疑問だYO!
>>936 データを取得するために新たにプログラムを作る必要がある。
だったら初めからそうしておけばいい話。
>>928 全然違う
テキストデータを1行ずつ処理したい場合はfgetsを使え。
固定長のバイナリデータを処理したい場合はfreadを使え。
少しでも堅牢なプログラムの方がよいと思う人はさらにferror()でチェックしろ。
freadの方がfgetsより堅牢と思いたい奴は気休めのためにfreadを使え。
>>933 ああ、各行に関連性はないってことを書き忘れてた。
つまり、どこか行が抜けても、行の順番が入れ替わってても問題はない
データね。
extern a; int a=10; を同じファイル内に書いてもOK?
941 :
デフォルトの名無しさん :02/09/13 15:20
>>940 もっちろん♪
でもextern int a;でしょ。
>>938 全然違う。テキストかバイナリかは直接関係ない。
書き直してみると↓こうなる。
可変長のテキストデータを1行ずつ処理したい場合はfgetsを使え。
固定長のデータを処理したい場合はfreadを使え。
少しでも堅牢なプログラムの方がよいと思う人はさらにferror()でチェックしろ。
テキストなら何でもfgetsの方がいいと思いこんでる奴は
気休めのためにfgetsを使え。
>>903 みたいな人とは一緒に仕事したくないです! (;_;)
>>940 問題ない。
というか、大抵の場合は(*.hと*.cに分けて書いていても)おなじ
コンパイル単位に入ってる。
少しでも堅牢なプログラムのほうがよいと思う人は、読み込んだデータ は全て疑え。
>>942 固定長のテキストデータを扱うプログラムを書いて、データを失うのがおち。
>>943 つーかお前俺の部下だろ。まだ叩き込まれ足りないようだな。
>>943 多分お前 俺の部下だろ。今さらやめたいってか?
ところでそろそろ950ゲットだ。
質問 FtpPutFileやFtpGetFileを使ってファイルをアップロード、ダウンロードする時に プログレスバーに処理状況を表示したいのですが、方法がわからないので教えて下さい。 また、FtpPutFile等を途中で中断する方法も教えて下さい、。
>>950 スレ違う。ここはファイル処理の堅牢性について話すスレだよ!!
おまいら、fgetsとかfreadとかで破損とかずれるとか、、 f g e t c で 1 文 字 づ つ 処 理 し ろ よ
↓もうその話は飽きたよう。
>>942 Cの知識も煽りのレベルも低いな。
テキストなら何でもfgetsの方がいいと思いこんでる奴は
馬鹿の一つ覚えのfgetsを使え。
この方が的確な煽りだろ?
確かにfreadは読み出し途中でエラーが発生すると読み込みを中断し、
fgetsは途中でエラーが発生しても中断はしない。
特に読み込みエラーになった場合にエラー場所から
リトライとかを行いたい場合、fgetsでは無理。
が、そんなケースの発生は希だし、今回のケースの場合は
せいぜいできることは何行目が読めないとかいうエラーメッセージを
出してプログラムを終了するぐらいだろ?
よって無理にfreadは使う必要など無い。
おいおい 上司 VS 部下 でもって2chかよ おめでてーな
>>952 atoiのかわりにstrtolで。
そんなに面倒じゃないから、もっとstrtol利用していいと思うけど。マジで。
>>955 はあ?
お前はファイル内容が破損すると必ず読み込みエラーが
発生するとでも思ってんのか?
ファイル破損=メディアからの読み出しエラー
とは限らないんだが。
知ったかぶって書いた割にはレベルが低かったな。
たとえばバイト化けして'\0'が混じったらどうなる?
そういうことに対処するなら最初からfreadを使った方がマシ。
fgetsと比べてコーディングの手間がかかるわけでもない。
> 今回のケースの場合は
> せいぜいできることは何行目が読めないとかいうエラーメッセージを
> 出してプログラムを終了するぐらいだろ?
これも読み出しエラーしか想定してないのでボツ。
>>903 とかはよっぽど上から流れてくるデータが酷いプロジェクトばっかり
携わってたんだろうな。言わばテロに必要以上に怯えている今のアメリカみたいなもんか。
あの....お取込中すみませんが、どなたかそろそろパート<32> を立てませんか?(私は" 俺に聞け!"というレベルじゃないので立てれません。)
>>959 こいつ自分の使ってるブラウザにさえデータ破損を
考慮した処理が入ってることを知らないんだろうな (プ
次スレはShow-A孫でたのむ。
おや?俺は別に煽ったつもりはなかったんだけどなぁ・・気に障ったか?スマソ
んじゃ、最終結論を出してよろしいか。 どうぞお前ら fgetsでもfreadでもfgetcでもfscanfでも 好きなのを使ってください。 それでどうなろうが俺の知ったことか。 あと、仕事をください。
>>965 意味がわかりませんでした。
このスレを立てたのは私のせがれだと聞いてます。それが何か?
>>684 sscanfの書式に注目。
----------------------------------------------------
#include <stdio.h>
main () {
char buf[1024];
while (NULL != fgets (buf, sizeof (buf), stdin)) {
char name[1024];
int id, a, b;
float c, d, e, f;
int count = sscanf (buf, "%d,%[^,],%d,%d,%f,%f,%f,%f",
&id, name, &a, &b, &c, &d, &e, &f);
if (count != 8) continue;
printf ("id=%d name=%s (%d %d %f %f %f %f)\n",
id, name, a, b, c, d, e, f);
}
}
----------------------------------------------------
39341725,山田川,66,83,198.0,4584.3,0.0,0.0
39341726,-該当なし-,-,-,-,-,-,-
39341725,アイウエオ,66,83,198.0,4584.3,0.0,0.0
----------------------------------------------------
C:\WINDOWS\デスクトップ\c-test>a < str.txt
id=39341725 name=山田川 (66 83 198.000000 4584.299805 0.000000 0.000000)
id=39341725 name=アイウエオ (66 83 198.000000 4584.299805 0.000000 0.000000)
----------------------------------------------------
s c a n f マ ン セ ー !
>>958 > たとえばバイト化けして'\0'が混じったらどうなる?
freadと同じ動作をしますが何か?少なくともbccのfgetsは'\0'を読む。
お前、教えて君やってないで自分で試してみろよ。
ところでお前は'\0'が混じってるデータをテキストデータと呼ぶのか?
あんたファイルの仕組みを理解してないよ。
> fgetsと比べてコーディングの手間がかかるわけでもない。
1行のバイト数が変わってしまった場合は?
例えばftpでしくじって\r\nが\nに化けた場合。
> これも読み出しエラーしか想定してないのでボツ。
他のエラーって何?バイト化けして'\0'が混じったデータなら
freadでも文字列のチェックは必要だろ?
> 知ったかぶって書いた割にはレベルが低かったな。
お前がな、捨てハン付けてまで、馬鹿丸出しの発言するなよ。
新スレ立てるけどファイル入力の話はこっちで完結させろよな<一部の粘着クン
>>968 なるほど。sscanf一本でもいけるのですね。
しかしこんな書式知らなかった。
勉強になります。
>>970 > <一部の粘着クン
俺については了解。あっちではこの話題は出さない。
というかあの知ったか君の完全敗北で完結してるけどね。
なんだかんだ行ってもム板の顔だね、このスレは。 最近は1週間で使い切るし。
そうだよね〜。2、3日忙しくて目通せないと、すげーレスついてるし。
>>978 SHOW-Aのカリスマ性が関係してるとかしてないとか…
いや、関係はないわ ごめん
980 :
デフォルトの名無しさん :02/09/13 17:56
\ │ / / ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ─( ゚ ∀ ゚ )< えふりどえふりど! \_/ \_________ / │ \ ∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< えふりどえふりどえふりぃどぉ〜〜! えふりぃど〜〜! >( ゚∀゚ )/ | / \__________ ________/ | 〈 | | / /\_」 / /\」  ̄ / /
>>969 ぎゃはは。全然意味がわかってないよお前。
> freadと同じ動作をしますが何か?少なくともbccのfgetsは'\0'を読む。
'\0'が混じった時に、どこまでが読み込んだデータの終端なのかを
どうやって判断するんだ?という意味なんだが。
(初心者が陥りそうな罠がまだ残ってるから反論には気をつけてね)
しかも'\0'というのは一例を挙げただけで、
もっと深刻な事態になる文字もあるわな。わかると思うけど。
だから
> そういうことに対処するなら最初からfreadを使った方がマシ。
> fgetsと比べてコーディングの手間がかかるわけでもない。
と書いてるんだよ。
> ところでお前は'\0'が混じってるデータをテキストデータと呼ぶのか?
> あんたファイルの仕組みを理解してないよ。
これはお話にならん。エラー時の話をしていたはずだが。
お前のところのテキストファイルは壊れようが何しようが
テキストデータしか存在しないのかもしれんが。
> 1行のバイト数が変わってしまった場合は?
> 例えばftpでしくじって\r\nが\nに化けた場合。
お前やっぱりファイルの仕組みを理解してないよ。
ファイルの破損とお前がftpを操作をしくじって
ファイル内容を書き換えるのでは意味が違う。
しくじった後のファイルは、あらかじめ決められた長さ
の固定長ファイルとは言えない。
freadならどこが終端なのかわかるのかな・・・
903とその信者は自分のつくったソフト以外は使うなってことだよな。 他人のつくったソフトにfgetsを使っているところがあって、データを失うようなことになったら困るもんな(藁
UNICODE(UTF16)テキストなら'0'が大量に入るわけだが。
俺が作ってるテキストエディタは、fgets関数を使用しております。 ・・・今のままでいいのか、fread関数に変えるべきか・・・。
だめだ俺、これ以上付き合うと
自分の性格が歪んでしまいそうなので辞退する。
>>969 ごめん。
この件について俺からはもう書くことは無いけど、
俺が間違ってたよ。
ところで「さいたまさいたまさいたま」の意味が良くわからん。 誰か教えれ。
>>986 fread厨の言うことを真に受けるなよ。
>>989 その辺は大丈夫です。
ちゃんと、メモリ資源がつづく限りテキストを読めるよう改造する予定ッス。
どんなに改造しても、
自分の窓を持たないエディタなんて他の人に使ってもらえそうにないですけど・・・(涙
それでも、勉強のつもりで自分の限界まで改造してみます。
>>990 う〜ん、fgetsで大丈夫なんですかね〜・・・。
上の方で、ファイルを読み込んだだけでファイルが壊れる事があるってありますけど・・・
マジッスか!?
うっかりバイナリとかをfgetsで読みに行ってファイル壊れるってことありませんよね?(汗
読み込んだデータを書き込まなきゃ大丈夫
>>992 ですよね!
うん、安心しました・・・。
ありがとうございます。
1000!
1000?
fread派はもう言い残すことは何もありませんか? 1000逝く前に言いたいことがあればどうぞ。
struct res buf[1000]; fread (buf, sizeof (struct res), 1001);
あ、FILE*忘れた
999
>>982 > '\0'が混じった時に、どこまでが読み込んだデータの終端なのかを
> どうやって判断するんだ?という意味なんだが。
どこまでが読み込んだのかを判断する必要はない。
正しく読めたかを判断できればよい。
どっちにしろ堅牢なプログラムを作る必要があるのなら、
読み込んだデータは正しいフォーマットかどうかのチェックをするんだから
フォーマットのチェックで引っかかる。
> もっと深刻な事態になる文字もあるわな。
'\n'か?ところで、コントロール文字が化けるケースってあまり思いつかないんだけど
何するとコントロール文字が化けるの?
お前の作った糞プログラムを動かしたりするとか
> これはお話にならん。エラー時の話をしていたはずだが。
了解、テキストファイルが壊れてバイナリになってしまったケースだな
それならばなぜ
> しくじった後のファイルは、あらかじめ決められた長さ
> の固定長ファイルとは言えない。
とかぬかすんだ?自分で矛盾していること言ってることに気づいてないのか?
テキストファイルがバイナリファイルに化ける可能性は考慮して、
固定長ファイルの1レコード長が変わる可能性は考慮しないのか?
固定長ファイルの1レコード長が変わる可能性の方が遙かに高いと思うが?
freadの方が堅牢なんて恥ずかしい無知を晒した上に、
今度は自分の考えの浅さを露呈して楽しいか?
まぁ、世の中にはそういう変態がいることは知っているけどね。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。