C言語なら俺に聞け! Part 75

このエントリーをはてなブックマークに追加
1v(^o^i)d
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

コンパイラを探しているなら >>2-13 を。
上記を逸した場合の結果は激しく未定義だYO!

C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンクは>>3-20あたり(誰か適当に貼って)

C言語なら俺俺に聞け! Part 74
http://pc2.2ch.net/test/read.cgi/tech/1078147042/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2scanf名無しさん:04/03/15 15:15
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsoft C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
3デフォルトの名無しさん:04/03/15 15:48
乙うんこ
scanf厨やgets厨がいるので、なるべくscanf getsは使用しないように。
わからない人は↓を参考に。

int x,y;
char buf[16];
fgets(buf,sizeof(buf),stdin);
if(sscanf(buf,"%d %d",&x,&y) != 2) エラー処理
>>4
入力行がバッファサイズより大きい場合はどうするんですか?
その例ではintだからたまたま溢れませんが。
fgetsした文字数より多いことはないので溢れないことを保証したコードが書ける。
で、fgetsが一行丸々読み込めたかどうかをどうやって保証するんですか?
if(文字数が一杯でない || 最後の文字が改行)
 一行全部読み込めた
else
 まだ残りがある
では>>4はバグがありますね。
しかもgets||scanfと違って素通りする分非常に悪質ですね。
gets||scanfで素通りできるコード書いてくれぇ
>>10
その前に>>4のバグ修正をしたらどうでしょう?
仕様もわからないのに、どんなバグがあるというのでしょう?
初心者スレの初心者レベルの質問で逃げますか・・・
しようがないですね。
if(2 != scanf("%d %d", &x, &y))
>>14
くだらなくても、しようもないと答えてやれ
16デフォルトの名無しさん:04/03/15 19:41
■お題
標準入力から単語二つからなる行を読み込み
辞書順で若い方を標準出力に表示しろ。
入力行の形式は"WORD1,WORD2\n"とする。
形式的におかしい行はエラーを出力しろ。
単語の長さに制限はないものとする。
入力は複数行あるものとする。
構造体のメンバが4つあって、それの3つが構造体で、その中の一つの中にまた構造体があって、
関数ポインタも共用体もまじってて、defineで色々名前変えてるし
C言語1ヶ月の俺にはほとんど理解できないコードを今一生懸命解読してます。

まいる。
>>18
ドライバでは、そんな複雑な構造体がよく出て来るけどな。
データ構造を空間的に頭に思い描くことができるような
イメージトレーニングすればそんなの直ぐになれるよ。
右脳ですか?
よく出ている質問でしたらすみません。
その場合は解説しているページに誘導して頂けたらうれしいです。

BASICの「RIGHT$」「MID$」「LEFT$」と、
同じような動作をさせるには、
どうプログラミングしたらよいのでしょうか?

よろしくお願いします。m(_ _)m
>>22
多バイト文字も考慮するわけ?エンコードはどうする?
>>23
デフォルトは自動選別でお願いします。
IEの設定で選択できるくらいの種類だけでかまいません。
25デフォルトの名無しさん:04/03/15 22:02
fgets() + strtok()を使ってるんだがだめか?
>>25
なに?それ
27デフォルトの名無しさん:04/03/15 22:24
ポインタが全然理解できません。 だれかわかりやすく教えて(;´д⊂)
>>25
普通です。
ポインタは考えるんじゃない、感じるんだ!
ポインタ王を探すのだ・・・
3227:04/03/15 22:39
>29,30
うー感じてきます、読んできます\n;
>27さんではないですが、

>はじめに
>C言語は、現在広く使用されている言語である。
しかし、Cは、より良い言語を開発しようという目的の下に開発された言語ではなく、
UNIXを開発するために、いわば「いきあたりばったり」で開発された言語である。
ゆえに、ダーティな構文や、コンパイラの実装を容易にするために手を抜いた部分が存在する。

>本文では、そのような「Cの暗部」のうち、「配列とポインタ」について述べる。

>対象読者は、Cをそれなりに習得しており、かつ、以下のような疑問を感じる人である。

>・Cの宣言では、[] は* よりも優先順位が高い。 ゆえに、char *s[10]; という宣言は、
「char へのポインタの配列」を意味する ---逆じゃないか?

いきなりここで躓きました・・・orz
>>33
実際に動かしてみれば分かるよ
ついでにアセンブラも覚えれば腕も上がる
コンパイルでアセンブラソースを吐かせてどんな動きしてるかとかな
>>18
>defineで色々名前変えてるし

この一文から、何か良からぬ事をやってそうな印象を受けるのはオレだけか?
>>22
>BASICの「RIGHT$」「MID$」「LEFT$」と、
>同じような動作をさせるには、
>どうプログラミングしたらよいのでしょうか?

1.それぞれの関数がどの様な処理を行っているのか?
  を紙などに自分が理解できる言語(日本人の場合はおそらく日本語)で書く。
2.1で書いたものをCに翻訳する。
>>36
いや、単純に #define を見慣れていないだけだろ。
stdin だって #define で色々名前変えていると言えなくもない。
3918:04/03/15 23:48
何でわざわざ名前を変えるんだよ。最初に決めた名前のまま使えよカスが。
まぁそれなりの理由があるんだろうけど、今の俺にはその理由とやらは理解出来ない。
>>39
そこまでいうのなら、ソースをうpしてみな。
皆がお前と同じ意見かどうかが分かる。
4118:04/03/15 23:56
でもこの言語を使いこなす事が出来たら、大きなパワーを手に入れることが出来るような気がする。
今までJavaを多少やってたけど、Cの方が全然難しいと思うから
その難解さが上記のような気持ちを、錯覚か?を起こさせてるのかもしれない。
4218:04/03/16 00:01
正直うpしたい気持ちは山々なんですが、守秘義務が有るので無理です。
後ヘッダファイルが8つ程と、Cファイルが30個程有るので大きすぎるし。
抜粋汁
>>41
>言語を使いこなす事が出来たら、大きなパワーを手に入れることが出来る
>Cの方が全然難しいと思うから

別に難しくないし、大きなパワーも手に入らないと思うよ。
うかつに C やるとおなかが大きくなるかも。。。
今やってる仕事で使っているデータ構造、
構造体のメンバ12個全て構造体で、その中には更に構造体の配列が入ってるものが多数。
全体で6KBほどだけど、どこにどうStubが入るのやらぱっと見じゃもう、全然わからねぇよ。
こんなもん、そのままバイナリファイルに落とすんだもんなぁ…
47デフォルトの名無しさん:04/03/16 02:43
f() * g()
この式の関数の呼び出し順序は規定されていないようですが、
f() && g()
この式の場合はどちらの関数が先に呼び出されるのでしょうか?

関数の呼び出しも&&演算子のの評価順と同じく左から呼び出されるのでしょうか?
それとも関数の呼び出しはコンパイラ依存で戻り値の評価が左からなのでしょうか?
>>47
f() が先に呼ばれる。
f() が 0(偽)を返せばその式の真偽が決定されるため、
g() は評価されない。
これをショートサーキットという。
4947:04/03/16 03:00
>>48
右からor規定されて無いだったらプログラミング言語Cを燃やしてる所でした。
ありがとう。
>>49
おまいは本よりも2chを信じるのか?
それは阿呆のすることだぞ。
自分でちゃんと規格なりコンパイルしてみるなりして
確認する癖をつけたほうがいいぞ。
コンパイルしてみるだけでは確認にはまったくならんが
ANSI Cの規格書を読んだことがあるのは俺を除いて日本に34人しかいないけどな。
君を入れても34人だったりして。
#include<stdio.h>
#define char_ int
#define int_ char
char* main( void ){
char_ char__ = (int_)'\0';
int_ int__ = (char_)char__;
int__ ^= 1;
printf(char__?"%d%d%d%d":"%#X+%#X=%#x",char__,int__,char__+int__);
}
5547:04/03/16 17:50
結局どっちなんでつかヽ(`∧´)丿
f(){exit(1);return 1;}g(){return 1;}main(){printf("%d",f()&&g());}
f(){exit(1);return 1;}g(){puts("@")return 1;}main(){printf("%d",f()&&g());}
f(){put("f");return 1;}g(){puts("g")return 1;}main(){printf("%d",f()&&g());}
>>55
いや >>48 で合ってるよ、規格上。
int*******************
**********************
**********************
**********main()
{putchar("*********"[sizeof("*****")]);}

なかなかいいプログラムができました。
BCCでコンソールアプリを作ってるんだけど、
起動時にDOS窓をアクティブにしないようにするにはどうすりゃいいの?
さっきからググってるけど関係ないサイトばっかりだ…欝
bcc /?
>>61
これ?
bcc32 -laa
6561:04/03/16 21:03
ゴメソ…もうちょっと丁寧に書いたらよかった…
外部アプリから自作アプリ(CUI)を起動するとき、コマンドラインで
-hoge が渡されたらDOS窓を表示するけど、外部アプリのウィンドウフォーカスを持っていかれないようにする
っていう処理をしたいんだ。

外部アプリが固定なら、SetActiveWindowとかで戻してやればいいんじゃない?
外部プログラムも自作のものなら
CreateProcessする時に、ウインドウを表示しないようにすればいいかと。
6861:04/03/16 22:11
>>66-67
外部アプリは固定でないし、自作でもないんですよ。
それにSetActiveWindowだと(外部アプリが)一瞬フォーカスが奪われません?
まだ続くようならスレ違いなので環境依存スレかどっかへどうぞ
7061:04/03/16 22:12
×外部アプリが
○外部アプリの
7161:04/03/16 22:14
スレ違いでしたか…
それではどっかへ逝ってきます。
ありがとうございました。
72デフォルトの名無しさん:04/03/16 23:06
jpegを表示するソース落ちてませんか?
ウィンでお願いします
73デフォルトの名無しさん:04/03/16 23:09
74デフォルトの名無しさん:04/03/16 23:34
int main()
{
(***********************printf)("hello world\n");

return 0;
}

なかなかいいプログラムができました。
Cygwinで、VCをエディタとして使いたいのですが可能ですか?
>>75
VisualStudioをエディタとして使うことならできるんでないかい?
詳しくはスレ違いなどでVCスレなどでどうぞ。
77デフォルトの名無しさん:04/03/17 00:11
>>75
alias VC=vi
>>76-77
藻前ら優しすぎ

>>75
スレ違い

で十分だろ?
79デフォルトの名無しさん:04/03/17 00:17
っていうか、わざわざ使いにくいエディターつかってどうするよ。
viにしろ
80デフォルトの名無しさん:04/03/17 03:05
梃子で。
>>74を見てて思ったんだが…

((printf+1)-1)("hello world\n");
は規格上NGでいいんだよね?
配列の一個オーバーは可能だけれども…これ、配列じゃないし
>>81
それ以前に、関数ポインタに加減算をすることは出来ない。
関数の大きさっていくつか分かるか?
83デフォルトの名無しさん:04/03/17 10:30
>>82
>>81じゃないが、そういえばそうだ。
84デフォルトの名無しさん:04/03/17 10:31
おまえら...だめすぎ。
8581:04/03/17 17:36
「関数自体の大きさ」は意味がわからないが
「関数へのポインタの大きさ」ならば意味はわかる

関数ポインタに加減算することが出来ないとすると
void (*arr[10])(void); みたいな
関数ポインタの配列は作れないことになる
なぜならarr[i]は*(arr+i)と等価だから
ってことはやっぱり関数ポインタに加減算は可能になる

ISO/IEC 9899:1999
6.3.2.3の8 関数ポインタ自体の説明
6.5.6の8と9 ポインタの加算と減算の説明

この二つを読んでみた結果そう解釈したんだけど…ちがう?
8681:04/03/17 17:44
こういうときの引用ってOKなんだよね?たしか…

6.3.2.3の8
A pointer to a function of one type may be converted to a pointer to a function of another
type and back again; the result shall compare equal to the original pointer. If a converted
pointer is used to call a function whose type is not compatible with the pointed-to type,
the behavior is undefined.

6.5.6の8抜粋
If the pointer operand points to an element of
an array object, and the array is large enough, the result points to an element offset from
the original element such that the difference of the subscripts of the resulting and original
array elements equals the integer expression.

この解釈、ちがう?(英語苦手で自信なし)
printf+1は.objで定義されたprintfの次の関数へのポインタに決まってるだろ。
ただし、次にどの関数が来るかは完全に処理系依存になってしまうが。
8881:04/03/17 17:57
>printf+1は.objで定義されたprintfの次の関数へのポインタに決まってるだろ
これ自体が処理系依存のような気がするんですが…
どこに書かれているか教えていただけますか?
>>88
ネタをネタと(ry
http://sikaku.gr.jp/nj/index4.html

ここのC三級とるにはどのくらいできればいいのでしょうか?
http://sikaku.gr.jp/nj/232.html
ここの3級のとこ見て、知らない用語があったらあきらめろ。
あと歴史もいるぞ。
>出題範囲 ライブラリ関数 char *gets(char *s);
これ試験に出るからよく覚えとけよ
>>92
2級の範囲だし
94デフォルトの名無しさん:04/03/17 20:16
そんなヘボい検定受かったところで、役に立たん。
と日下部先生がおっしゃってましたよ。
95デフォルトの名無しさん:04/03/17 21:16
Braian W. Kernighan and Dennis M.Ritchie The C Programming Language Second Editoin
を持っている人っています?
一部では糞本って言われているけど・・
>>95
恥ずかしながら原書を読んだことはないけど、
日本語訳の『プログラミング言語C 第2版』は糞で間違いない。

訳本の改訂版がだいぶ前にでたみたいだけど、そっちは知らん。
聞くところによるとそっちも糞らしい。
確か原本は1988年くらいに出た15年以上前の本だから、
もうさすがに古いだろうね・・・
関数の引数に、構造体で宣言したものを持っていくことはできるのでしょうか?
>>98
できる
main内で構造体の宣言して、関数funcにそれを(複数)持っていきたいのですが、
何がいけないのかできません
_| ̄|○
コードさらせ
もしかして、引数の中で、もう一度構造体の宣言をするのでしょうか?
>>102
しないしない。とっととコード晒せ。
struct yourst{};

void yourfunc(struct youst st){};
必要な部分だけ?でも何処が間違ってるか分からないから全部でしょうか?
なんなに長くはないですが
struct yourst{};
はmainの外に書け
>>105
問題が起こったらその問題を検証する最小限の別のサンプル作る習慣をつけるべし。
ここで質問するかどうかに関係なくね。
#include ~~~省略

typedef struct
{
int n1;
int n2;
}N;

func(abc.n1,abc.n2)
{
//省略
}
int main()
{
N abc;
abc.n1=1;
abc.n2=2;
int BB;
BB=func(abc.n1,abc.n2);
}

こんな感じです。
構造体以前の問題だな。関数funcの定義が変。
#include <stdio.h>

/*typedef struct
{
int n1;
int n2;
}N;*/

int func(int n1,int n2)
{
int BB;
BB=n1+n2;
return BB;
}
int main()
{
/*N abc;*/
int n1=1;
int n2=2;
int BB;
BB=func(n1,n2);
printf("%d\n",BB);
}

これが構造体を使う前のものです。
この状態ならばエラーは出ません。
N abc;
のNはintに相当し、
abcはn1に相当する
>>110
ところで
int func(int n1,int n2)
{
int BB;
BB=n1+n2;
return BB;
}

int func(int nnnnn,int mmmmm)
{
int BB;
BB=nnnnn+mmmmm;
return BB;
}
に変えてもちゃんと動くことは理解してる?
何がやりたいのかよく判らんが
↓これじゃだめなの?

typedef struct
{
int n1;
int n2;
}N;

func(int n1, int n2)
{
int BB;
BB=n1+n2;
return BB;
}
int main()
{
N abc;
abc.n1=1;
abc.n2=2;
int BB;
BB=func(abc.n1,abc.n2);
}
>>112さん
なるほど、知りませんでした。つまり型があってさえいれば変数名は変えてもいいのですね。
なんか解決できそうです。

>>113さん
ここでは最低限のものしかないてないので分かりずらかったですが、func内で
N abc意外にN defや N ghiと複数使う予定なのでこれだと
変数名が重なっちゃいます

もう一度頑張ってみます
115デフォルトの名無しさん:04/03/17 23:34
>>113
int main()
(プ
>変数名が重なっちゃいます
どこに重なるんだろう?
問題ないと思うが。

typedef struct
{
int n1;
int n2;
}N;

func(int n1, int n2)
{
int BB;
BB=n1+n2;
return BB;
}
int main()
{
N abc, def, ghi;
abc.n1=1;
abc.n2=2;
def.n1=3;
def.n2=4;
ghi.n1=5;
ghi.n2=6;

int BB, CC, DD;
BB=func(abc.n1,abc.n2);
CC=func(def.n1,def.n2);
DD=func(ghi.n1,ghi.n2);
}
普通
void main()
だろ?
defやghiはfunc内で宣言して、使う予定です。main内ではabcのみとなります。
119デフォルトの名無しさん:04/03/18 02:34
>>94
でも受けさせられたんだろ?
120デフォルトの名無しさん:04/03/18 02:36
>>107
それ以前に、こんな基本的な文法の質問がでるってことは、
参考にしている本にそれが出てないってことでしょ?
その本の名前をまず書かせたほうが今後のためだぞ。
func(N abc)
{
N def, ghi;
int BB;
BB=abc.n1+abc.n2;
return BB;
}


abc.n1=1;
abc.n2=2;
BB=func(abc);
122デフォルトの名無しさん:04/03/18 02:42
>>119
いや、それは学校の方針で受けることに決まってたので...。
合格率は前年度に比べて2倍にアップしましたよ!
123デフォルトの名無しさん:04/03/18 02:52
ふつう、こんなダサイ書き方はしないよな。
> abc.n1=1;
> abc.n2=2;
> def.n1=3;
> def.n2=4;
> ghi.n1=5;
> ghi.n2=6;
常識的に、以下のように書く。
abc = {.n1=1, .n2=2};
def = {.n1=3, .n2=4};
ghi = {.n1=5, .n2=6};

格段に見やすい!
124デフォルトの名無しさん:04/03/18 02:54
>>123
また、どうせ関数に渡すためだけにやってるんだったら、
わざわざ、
abc.n1=1;
abc.n2=2;
def.n1=3;
def.n2=4;
ghi.n1=5;
ghi.n2=6;
func(abc.n1,abc.n2);
func(def.n1,def.n2);
func(ghi.n1,ghi.n2);
などと書くのはまぬけ。
ふつうのまっとうなCプログラマーなら以下のように書く。
func((N){.n1=1, .n2=2});
func((N){.n1=3, .n2=4});
func((N){.n1=5, .n2=6});

おまえられヴぇるひくすぎ!
125デフォルトの名無しさん:04/03/18 02:56
> 変数名は変えてもいいのですね。

「仮引数」と「実引数」という言葉ぐらい覚えろ!
あと、おまえの参考にした本の名前を言え!
126デフォルトの名無しさん:04/03/18 02:56
>>124
その構文はきもすぎて嫌
127デフォルトの名無しさん:04/03/18 02:58
>>124
いいえ。常識的にはこう書きます。
おまえがダメすぎなだけ。
128デフォルトの名無しさん:04/03/18 03:00
常識ならN abc={1,2}, def={3,4}, ghi={5,6};じゃなかろうか。
Cを一昨日始めたばっかりなんだけど、Cでファイルの読み書きってどうやるの?
130デフォルトの名無しさん:04/03/18 03:01
>>128
いや、変数に入れる必要ないだろ?
関数に渡すだけなら。
131128:04/03/18 03:01
いやこうだな。構造体なんていらない。
BB=func(1,2);
CC=func(3,4);
DD=func(5,6);
132128:04/03/18 03:02
>>130
うん。
133デフォルトの名無しさん:04/03/18 03:02
>>129
「はじめたばかり」は何の言い訳にもなりません。
はじめたばかりのひとも10年やってるひとも使う関数は同じです。
また、質問の態度に関しても同じものが適用されます。

で、まずオマエの参考にしている書籍やWebの名前を書け!
そしたらおしえてやる。
134デフォルトの名無しさん:04/03/18 03:03
>>129
stdin,stdoutをfreopenしてprintfやscanfを使う。
135デフォルトの名無しさん:04/03/18 03:03
つかうなよぼけ > scanf
136デフォルトの名無しさん:04/03/18 03:04
>>128
そのやり方は初期化では使えても代入では使えない。
137デフォルトの名無しさん:04/03/18 03:05
>>136
そうなんだけど、初期化でいいと思ったんで。
138デフォルトの名無しさん:04/03/18 03:09
おまえら、日下部先生の本でも読んで出直してこい。

構造体もちゃんと説明していない本読んでるのか?
そうして一日中噛り付いてるんだな
>>139
営業に必死なんでしょうかね。
C言語というかプログラム全般についてですが、スキルを上げる
道順 なんてありますか?

やらせたい処理の順序、使う手法、必要になるであろう文等、概要は
頭では分かっていますが、実際書こうとするとくだらない細かい所、
データのやりとりのやり方等で頭が混乱することが多いです。
(今日も配列からデータを取り出して処理し、再配列するプログラムを
追加するだけで一日使ってしまいました・・。

ある程度必要になる文章を憶えるしかないんだろうか、と思ってますが、
他の人はどうなんでしょうか。
とにかく使う。これしかない。
>>141
みんな最初はそうだよ。
例えば初めて英語を勉強するところを想像してみな。
最初はくだらない一言を話すのにも苦労するだろうけど、上達すると
もっと簡単に、もっと複雑な会話が出来るでしょ。

だから、ひたすら書いて読むこと。
読む方に関しては、お気に入りのプログラムを見つけて、それをゆっくり
読み進めるのが良いと思う。
144デフォルトの名無しさん:04/03/18 07:54
> みんな最初はそうだよ。
そうでもない。
scanfを使っているような本で勉強するからそうなるだけ。
145デフォルトの名無しさん:04/03/18 07:54
>>140
営業ってことは、どこかの出版社の人間?
そして2chを過信しすぎないこと
void main(void)だろうがint main()だろうがscanfだろうがたいした問題ではない
147141:04/03/18 08:29
>>142,143
どうもありがとうございます。
やはり憶えるのが大事なんですね。
配列の扱いが特に苦手なんで、そういうプログラムを
探して勉強します。
大した知識ないやつに限って
void main(void)やら int main()やら
scanf やら if(n>0)とかつまらんところにケチつけたがるんだよな。
叩きたいけど、それだけの知識しかないから。
もういいじゃん。
その手の話題は過去ログに腐るほどあるし。
>>148
奥が深い症候群 だな
151デフォルトの名無しさん:04/03/18 14:05
質問お願いいたします。
memmoveとmemcpyですが、memmove
だけで事足りると思うのですが、となると
memcpyの存在意義はなんなのでしょう?
また、文字列用にstrcpy等の関数がありますが
これもmem〜系関数で十分間に合うと
思うのですが。。。
>>151
あなたの存在意義も謎ですね
memcpy の方が速い。

strcpy の代わりに memcpy を使うためには
文字列の長さ+1を先に計算しておかないといけない。
>>151
memmove(d,s,n);
 まずsから空いているメモリtにコピーしてから、tをdにコピーするので遅い。
memcpy(d,s,n);
 いきなりsからdにコピーするので速い。
strcpy(d,s);
 memcpyのnの代わりに、sの0x00を検出してからdにコピーする。
155151:04/03/18 14:36
>>153-154さん
レスありがとうございます。
すごくよくわかりました。一長一短というか
ちゃんと用途がある(特化してる)のですね。

ところで今VC6.0を使っているのですが、
memcpyの実装(memcpy.c)を見てみると、x86でないときは
RtlMoveMemoryというAPIを使っているのですが、
x86では1バイトずつしこしこコピっているようです。
どう考えてもAPIの方が最適化されていて早いような
気がするのですがなんででしょう。。。
156デフォルトの名無しさん:04/03/18 14:51
>>154
> 空いているメモリtにコピーしてから、
本当か?
場合によって前からコピーするか後ろからコピーするか切り替えるように実装しないか?
>>155
ソース見る限り確かにそうだな。
しかし、x86の場合ならストリング転送に最適化されるはず。
確認はしてないが。
実装依存
159151=155:04/03/18 15:09
>>157
その上x86のリリースビルドのときにはレジスタで処理するように極度に最適化
されったぽいアセンブラコード(memset.asm)とリンクするようになっている
みたいなのですが、デバッグビルドではAPI使わずに1バイトずつコピって、
リリースビルドではAPIどころか自身(C)のライブラリも使ってないって
どういうことなんですかネ。。。
>>159
Microsoft Corporationに聞けば。
>>155
ネタじゃなかったのか
そんなこと気にしてどうするんだろう
アセンブラ時代で、C覚えたての頃は気にしたな。
そら速度が要求されたら気になるだろ。
つか速度が要求されないのにC使ってる奴は(ry
> また、文字列用にstrcpy等の関数がありますが
> これもmem〜系関数で十分間に合うと
> 思うのですが。。。
>>164
速度を要求されないときは何使えばいいですか?
>>166
C#に決まってるだろ。
>>167
Win以外の環境で使えるのあったっけ?
>>168
Win以外に使いものになる環境あったっけ?
#include<stdio.h>


int func(int *z)
{
*z=55;
return 0;
}
main()
{
int a;
a=5;
func(&a);
printf("%d",a);

return 0;



}
55と表示したいのですが・・・
ですが?
>170
ちゃんと省略せずに「何も表示されない」と書けや
173>>170:04/03/18 22:26
改行またはfflush(stdout)
main()
{
char buf[256];
int a;
a=5;
func(&a);
printf("%d\n",a);
gets(buf);
return 0;



}
CからDOSに命令を送るにはどうしたらよいのですか?
>>175
BIOSを呼ぶ。スレ違いなので詳しい情報は割愛。
>>176
やや、レスサンクスです。
詳しく載ってるようなサイトとか無いですかね?
>>177
int86x とか REGS とかでググッてみたら?
179デフォルトの名無しさん:04/03/18 23:53
int86のコードよかったよな。
ライブラー中で、自己変更コードかいてるのはあそこだけだった。
180デフォルトの名無しさん:04/03/18 23:53
>>148は自分の存在意義がなくなってしまってこまってるボケ
>>177
スレ違いと指摘されつつ、何故更に問う?
182デフォルトの名無しさん:04/03/18 23:59
っていうか、scanf()やgets()を使ったプログラムの質問している時点でだめだめ。
そんな人間はもともと見込みがないです。
質問するだけ無駄。
183デフォルトの名無しさん:04/03/19 00:01
>>182
推薦書スレと日下部スレの他にもいたんですね-;)
184デフォルトの名無しさん:04/03/19 00:11
「こわい人」はみんな同一人物ナノか!
>>169
Winが動く環境ってPCだけじゃん
scanfマンセー
187デフォルトの名無しさん:04/03/19 03:17
getsまんせー
今日も二回使っちゃったYO
gets一回2万円
>>188
一回20円じゃなかったっけ?
190デフォルトの名無しさん:04/03/19 08:15
void mainも禁止
main() {

}は?
int main(void)は?
@echo off
>>182
そうか?Cが最初の言語だったら質問する人もいるんじゃないか?
おまえの一番最初の言語を覚えたときはどうだったんだ?
>>194
いつまでもつまらん話を続けてんじゃねえよ
196デフォルトの名無しさん:04/03/19 23:32
>>194
ようするに、194は「初心者だからしかたない」と思い込んでいる馬鹿。
「初心者のうちはscanfやgetsを使ってもよい」と思い込んでいる馬鹿。

実際には、初心者にこそすすめてはいけないからこそ問題になっている。
熟練者なら問題点も把握しているから使うことができるか、熟練者は使う用事がない。
つまり、だれも使う用事がないわけだ。
197デフォルトの名無しさん:04/03/19 23:34
>>193
ださい。
いまどきWindowsは、プロンプト出したら、
vi .cshrcして
set nobeep
から始まるのがふつう。
198デフォルトの名無しさん:04/03/19 23:36
>>190
こわがりすぎー
(特定の単語をさけているだけでは? ^^;)
199194:04/03/20 01:25
>>196
そんなこと言ってないし
scanfやgetsなんかの話題は相手にしてない
200デフォルトの名無しさん:04/03/20 10:34
typedef struct
{
int i ; char c ;
} Kouzou ;

Kouzou GetKouzou ( void )
{
Kouzou kouzou ;
kouzou.i = 1 ; kouzou.c = '1' ;
return kouzou ;
}

int main ( void )
{
printf ( "%d\n" , GetKouzou().i ) ;
return 0 ;
}

VC6なんですが、「'.i':左側が構造体、共用体でない」とでてしまいます。
関数を書いたあとに.を押すとメンバーが表示される(VCの機能)ので、
正しい書き方だと思ったのですが。動かせるようにお願いします。
201デフォルトの名無しさん:04/03/20 10:43
>>200
VC6(SP5)でコンパイルできたぞ。
他の部分が間違っているんだろう。
Kouzou kouzou ;
この書き方やめとけ
203200:04/03/20 10:50
すいません。>>200は例文として作ったのですが通りました。
だから別の所に問題があるか調べていた所、元のソースではファイル分割していて
プロトタイプ宣言が無かったので通らなかったようです。すいません。
204200:04/03/20 10:52
>>201
その通りでした。

>>202
例文用というのもあるのですが、どんな感じが良いでしょう。
205デフォルトの名無しさん:04/03/20 12:29
>>199
> そんなこと言ってないし

ふふ..ごまかそうとしてもだめです。
206デフォルトの名無しさん:04/03/20 12:33
> Kouzou GetKouzou ( void )

この書き方やめとけ。なんで括弧の内側に空白あける?
せっかくちょうどよく接するように括弧をデザインしたフォントデザイナーに申し訳ないとおもわないのか?

> typedef struct
> {
> int i ; char c ;
> } Kouzou ;

なんで、1行に2文書くようなせこい真似してるくせに、
「{」だけで独立した行にするんだ? おまえアホか?
ちゃんと書けよ。

> Kouzou kouzou ;
> kouzou.i = 1 ; kouzou.c = '1' ;

ここも1行に2文わざわざ書くし...。だったら複合定数で初期化しろよ。ぼけ
あと、宣言文をブロックの先頭にまとめて書くなら、それと最初の実行文の間には
1つ空行あけろよ ぼけ。


207デフォルトの名無しさん:04/03/20 12:34
> printf ( "%d\n" , GetKouzou().i ) ;
return 0 ;

函数名と括弧の間に空白あけるなよ。ぼけ。よみにくいぞ。
208デフォルトの名無しさん:04/03/20 12:36
>>207
ぼけ、ぼけ言うだけより、
書いたやつに「どんな本を参考にして勉強したらこんなひどい書き方になった」かを
質問しろよ。答えてもらえれば、そのほうがよほど有益な情報だ。
>>207
お前うざいって。
いいかげん消えて。
210デフォルトの名無しさん:04/03/20 12:41
>>209
よく見かける人なんですか?
211200:04/03/20 12:47
>せっかくちょうどよく接するように括弧をデザインした
>フォントデザイナーに申し訳ないとおもわないのか?
>「どんな本を参考にして勉強したらこんなひどい書き方になった」か
int kansuuA(BvoidC)D;
前にスペースを空けろといわれた事があって、
なんでAとDだけ?スペースを空けるのか分からなかったので
B、Cの方も空けていたのですが、A、Dだけ空けるのが正しいのですか?
>>211
どこも開けないのが普通。
int kansuu(void);
関数名を行頭に持ってくるのが普通。
int
kansuu(void)
{
}
214200:04/03/20 13:03
>>212
int hensuu(int i,char *str,char c);
voidの場合は要らないのですね。ではこれの場合はどう空けるのでしょう。

>>213
doxygenを使うとき引数にコメントを付けるために、引数の方の行を
変える事はあったのですが、戻り値の方にもやるのですね。
215デフォルトの名無しさん:04/03/20 13:26
>>214
べつにvoidの場合にかぎらず、括弧の内側は絶対にあけないんだよ。
あと、カンマの後ろ詰めるなよ ぼけ。
216デフォルトの名無しさん:04/03/20 13:27
>>213
いや、ちっとも「ふつう」ではない。
そういう流儀もある、程度。

だが、括弧の内側に空白あけたり、カンマの後ろを詰めたりするのは「流儀」でさえないのだ。
217デフォルトの名無しさん:04/03/20 13:35
>>207
なぜバックスラッシュを全角にするんだ?
218デフォルトの名無しさん:04/03/20 13:39
>>216
たしかに「流儀」程度だな。
tgrind は、函数名が行頭からはじめてったほうが (つまり型名で改行したほうが)、
つごうよかったのだが、あれは、そういう流儀の人がつくったのかな。
219200:04/03/20 13:58
>括弧の内側は絶対にあけないんだよ。
これは>>206さんが言ったフォントデザイナー説ですかね。

>カンマの後ろ詰めるなよ
左側だけ空ける定義はどこにあるのでしょう。
ポインタは char *p と変数側にくっつけますが、
これは char c , *p とあったとき、まずcharであってその後に、
普通のcharであるか、ポインタであるかがあるから、そうなるみたいですが。
220200:04/03/20 14:05
>>219
>左側だけ空ける定義はどこにあるのでしょう。
逆です。右側だけです。猫もそうなってますね。
>>219
何を言ってるんだ??
誰もポインタの話はしてないよ。
『  カ  ン  マ  の  後  ろ  に  ス  ペ ー  ス  を  入  れ  ろ  』と言っているのだよ>>214は。
かぶった?
223デフォルトの名無しさん:04/03/20 14:11
> これは char c , *p とあったとき、まずcharであってその後に、

っていうか、いっしょに定義するなよ。おまえみたいなボケが勘違いするから、
わざわざ1行で書くな。
もっと勘違いしやすいのは char* i, j; とかかいて、iとjが同じ型の変数だとおもっちゃうやつ。

とにかくカンマの後ろ詰めるな。
224デフォルトの名無しさん:04/03/20 14:12
> これは char c , *p とあったとき、まずcharであってその後に、

カンマの前あけるなよ。ぼけ。
225デフォルトの名無しさん:04/03/20 14:13
>>219
その前に、おまえが今までに参考にした書籍の名前を言え。
もし、複数読んでいるんだったら、一番影響を受けたやつか、最初に読んだやつだけでいいから。
十年一日の如く、この時期になると書式偏執狂が現れてくるな・・・

文句つけてる暇があったら、自分で書式整形ツールでもつくれよ。
その方がよっぽど世の中の為だ。
indent
228200:04/03/20 14:25
>>224
理由は何なのでしょう。()の時みたいな理由があればよいのですが。

>>225
書籍は複数読んだのですが、特にスペースは気にしないで
通ればよいと思い詰めて書いていました。
よく読んだ本でエイ・エス・ティシステム・アカデミが出している
C PROGRAMING I と言う本があるのですが、見てみると
void main( void )
{
}
scanf( "%d" , &num ) ;
とかとなっている所もありました。
void mainに括弧の内側明け、コンマの前明けにscanf・・
全てそろってますね。
ただ誤字だらけの本なのでなんともいえませんが。
>>228
>理由は何なのでしょう。()の時みたいな理由があればよいのですが。
常識。
括弧の前後とかカンマの前にスペース入れるのは
履歴書を色鉛筆で書くのと同じぐらい非常識。
ドットとカンマが混在するような時や、何かの都合で
プロポーショナルフォントで表示するような時以外は、
どうでも良いんじゃない?<カンマの後のスペース

必要ならいつでも変換出来るし。
231200:04/03/20 14:35
>>229
スペースのつけ方についていろいろ調べていたのですがみつからず、
演算子の優先順位で○○ではないか、権威ある人が書いた書き方が
そうでそうなったとかいろいろ想像していたのですが、
そういう風に言い切ってもらえてすっきりしました。
カンマの後にスペースを入れるのは、プログラムソース
というより、英文一般の風習だな。
233200:04/03/20 14:39
>>230
了解しました。
234200:04/03/20 14:43
>>232
これは核心を突く意見です。了解しました。
全角のカンマを使えば、スペースを入れなくても見やすいぞ。
コーディングスタイルで検索しろ
>>235
バーカ<・A・>バーカ
238デフォルトの名無しさん:04/03/20 15:06
低レベルな議論しかできない人達ですねw
>>238
だって、ここでほざいてる香具師みんな
似非プログラマですからね。
240デフォルトの名無しさん:04/03/20 15:31
エー
241デフォルトの名無しさん:04/03/20 15:45
C言語チャットルームへようこそ
242デフォルトの名無しさん:04/03/20 22:27
すいません。質問させてください。
これから私はC言語勉強するつもりなんですけど、初っ端のコンパイルが
旨く出来ません。原因わかる人がいたら教えて頂たいんです。
具体的には「インクルードファイル’stdio.h’をオープンできない。」
と表示されるんです。エラーはこれだけだと思われます。1errorsinCompile
と出てるので。よろしくお願いします。
243デフォルトの名無しさん:04/03/20 22:35
誰かこの質問答えてあげて
http://pc2.2ch.net/test/read.cgi/tech/1078325423/650
>>242
コンパイラは何?
ありがちな原因として、該当するファイルを削除してしまった、
そうでなければ、ファイルを見つけられないことが考えられる。

必要であれば、インクルードファイルが置いてあるディレクトリを
コンパイラに知らせる必要がある。

ttp://www.google.com/search?hl=ja&ie=UTF-8&oe=UTF-8&q=%22C%E8%A8%80%E8%AA%9E%22+%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%89+%E3%83%91%E3%82%B9%E3%82%92%E9%80%9A%E3%81%99&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
247デフォルトの名無しさん:04/03/20 23:06
242です。244さん>コンパイラはborland5.5です。
bcc32というのかな?
245さん>ディレクトリの指定は出来てると思います。
指定できてないときはファイルが見つからないとでてるので。
C言語を始めようでも使え。
春だね
>>247
特定の環境の話題はスレ違い
>>247
スレ違いなのでこっちに移動しましょう。
http://pc2.2ch.net/test/read.cgi/tech/1054390397/l50
>>252
氏ね
検索しない初心者はウザイが、
その初心者を叩く自称上級者はもっとウザイ
>>254
初心者を叩く奴なんていたか?
256デフォルトの名無しさん:04/03/21 00:46
245です。度々申し訳ない。
ディレクトリの設定とかパスとかしてるのに
コンパイルできません。何故だー
252はメモ町ではないエディタの使用なんですね。
考えられる原因をどなたかお教えください。お願いします
欝だ・・・。
>>256
bcc32.cfg
ilink32.cfg
>>256
エラーメッセージ全部見なきゃわかんない。
マルチイクナイ。
>>256
スレ違い
260デフォルトの名無しさん:04/03/21 01:39
本当申し訳ないです。
エラーは以下の文章です。
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample1.c:
エラー E2209 sample1.c 1: インクルードファイル 'stdio.h' をオープンできない
警告 W8065 sample1.c 4: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 mai
)
*** 1 errors in Compile ***
261デフォルトの名無しさん:04/03/21 01:45
main()
main(void)
void main()
void main(void)

コレどう違うの?何か意味あるの?
main() 戻り値の型 int 。引数は不定だが、特に問題はない。
main(void) 戻り値の型 int で引数なし。
void main() 戻り値なしで、引数は不定。C では文法違反。
void main(void) 戻り値なしで、引数はなし。C では文法違反。
264デフォルトの名無しさん:04/03/21 01:54
>>261
なんでvoidなんだよ ぼけ
265デフォルトの名無しさん:04/03/21 01:56
> main(void) 戻り値の型 int で引数なし。

いいや。型宣言を省略した関数が「int」を返す保証はない。
標準規格でそう決まってる。それぐらいおぼえとけぼけ。

(89年にはそういうのがあったが、あれは過去との互換性のため)
266デフォルトの名無しさん:04/03/21 01:57
> ディレクトリの設定とかパスとかしてるのに

いいえ。してません。
C と言えばまだ C89 だろー。
268デフォルトの名無しさん:04/03/21 02:00
> エイ・エス・ティシステム・アカデミが出しているC PROGRAMING I

さっさと捨てて、まともな本買えよ。
戻り値ってint以外認められないの?
270269:04/03/21 02:01
mainの戻り値ね
271デフォルトの名無しさん:04/03/21 02:03
ふるい処理系だと、
int a=10, b=20;
a=-1;
b=1;
でprintf("%d\n", a); すると、
答えが「9」になる処理系もある。(いまどき絶対残ってないですが。いまの標準規格には適合しないので)

そんな処理系で、
int a = 10, b = 20;
a = -1;
b = 1;
だとprintf("%d\n", a); で「-1」になる。
272デフォルトの名無しさん:04/03/21 02:04
>>267
C99です。常識。
>>270
少なくとも規格上は認められません。
void にしたせいで何が起こっても文句は言えません。
>>271
bは何のためにあるの?
275デフォルトの名無しさん:04/03/21 02:23
>>271
それは、いまの「-=」演算子が、まだ木下藤吉郎だったころのなごり。
いまどき関係ない。
276デフォルトの名無しさん:04/03/21 02:24
> エイ・エス・ティシステム・アカデミが出しているC PROGRAMING I

書名からしてミススペルしてるような本は買うなよ。
277デフォルトの名無しさん:04/03/21 02:25
278デフォルトの名無しさん:04/03/21 02:25
> というより、英文一般の風習だな。

いいえ。フランスでもドイツでもそうですよ。
Mは一個でもよい。
280デフォルトの名無しさん:04/03/21 02:28
>>229
たしかに常識だわな。
つまり231が読んだその本は、そんな常識もわかってないような著者が書いたってことでOK?
281デフォルトの名無しさん:04/03/21 02:29
>>279は極度の知ったかぶり。
実際には1個ではだめなので、よいこは真似しないように。(本気にするやつがいるかもしれないので)
ANSIってのはアメリカの規格だから、日本人は従わなくてもいいよな?
ちなみにピリオドの後はスペース二つです。

kouzou.  i
>>282
ANSI C を基にした国際規格 ISO C や日本規格 JIS C には従ってもらおう!
もはや恥じらいを感じないほどの初心者なので、質問させていただきます
できたファイルをコンパイルするためにMS−DOSを開いて A>*****.c と入力するそうですが、
そのMS−DOSをどうやって開くのでしょうか

関係あるかどうかわかりませんが、windows2000です
システムツール→アクセサリ→コマンドプロンプト

今後もCとは関係ない疑問がたくさん出てくるだろうが
わからないことが出てきたら、まず
http://www.google.co.jp/
に聞け。
>>285
PC98エミュレータをインストールして、MS-DOSをインストールする。
288デフォルトの名無しさん:04/03/21 07:34
>>271
標準規格に適合しないから残ってないって? をいをい・・・
289デフォルトの名無しさん:04/03/21 07:38
>>282
アメリカ製の処理系を使う場合は参考にせざるをえまい
ただし、こういうところで ANSI, ANSI と喚いている香具師の
大部分は ANSI の規格票なんか持ってない
何ページの何行目? って聞けば判別できる
290デフォルトの名無しさん:04/03/21 07:43
>>289
聞いた方すら持っていないから適当に答えてもいいんだけどね。
ANSIをキーワードに検索かけたら
【yahoo!チャット女神】 a_ranransilva_a 20030513(美人,スレンダー巨乳)[XviD].avi
こんなのしかなかったよ。落としたけど。
292デフォルトの名無しさん:04/03/21 08:10
みんなISOの9899のマニュアルを買って読んでるの?
C++の14882のPDFみたいにどこかに落ちてないかな
293デフォルトの名無しさん:04/03/21 09:28
> 標準規格に適合しないから残ってないって? をいをい・・・

じゃあ残ってるとでも? ;-)
私がその手のコンパイラーを最後に見かけたのは1983年のことですので、
もう20年以上前のことです。
294デフォルトの名無しさん:04/03/21 09:29
> ANSI C を基にした国際規格 ISO C や日本規格 JIS C には従ってもらおう!

それは89年の話。(15年前!)
いまのISOのはANSIを元にしてなどいない。
295デフォルトの名無しさん:04/03/21 09:30
> MS−DOSを開いて

そんなものはありません。
296デフォルトの名無しさん:04/03/21 09:33
>>287
いまどきのWindowsはそんなことしない。> DOSプロンプト
ふつうは、
スタートメニューから、[すべてのプログラム]->[Windows Services for UNIX]->[C Shell]
もしくは[Korn Shell] だ。
297デフォルトの名無しさん:04/03/21 09:44
>>293
論点を逸らそうったってそうはイカのキンタマ

規格に合致しないことを「絶対に現存しない」と断言する根拠とした
アフォ発言は消えない (削除依頼しても無駄だろう)
>>293
> じゃあ残ってるとでも? ;-)

残ってるよ。
20年前に開発した機器の開発環境として動態保存してる。

「今時まず使われていないだろう」ぐらいにしとき。
世の中は、あんたの想像力をはるかに超えてるから、「絶対○○」なんて軽軽しく使うと「井の中の○○」と思われるのがオチだよ。
299デフォルトの名無しさん:04/03/21 09:52
>>298
その二番目の○○には何が入るのでしょうか。
C と言えばまだ C89 だろー。
301デフォルトの名無しさん:04/03/21 10:27
302デフォルトの名無しさん:04/03/21 10:32
だからISO9899の規格書はどこにあんのよ?
303デフォルトの名無しさん:04/03/21 10:35
乞食根性まるだししてねえで買えよヴォケ!
http://www.jsa.or.jp
304デフォルトの名無しさん:04/03/21 10:47
>>303
金ねえよ!
305デフォルトの名無しさん:04/03/21 10:51
306デフォルトの名無しさん:04/03/21 10:53
>>298
耄碌したおっさんをあんまり苛めるもんじゃないよw
これで普通に検索できるな。買う必要はなかった。
http://www.google.co.jp/search?q=9899+ISO+filetype%3Apdf&hl=ja&ie=UTF-8&oe=UTF-8&c2coff=1
309デフォルトの名無しさん:04/03/21 11:15
> イメージベースのPDF(データを画像で取り込んだPDF)でのご提供です。

これってもしや検索できないということでは・・・
ビットパターンなら容易に検索出来る。
ベクトルデータだと少し手間だが。
311285:04/03/21 14:18
>>286
はい、確かにに出ました
でもこれからどうしたらいいのかよくわからない・・・これはさすがにgoogleでもうちょっと粘ってみますが
今度来る時はポインタってなんですかくらいのレベルになっているだろうと思います

>>287
ありがとうございます。でもPC98を入手できるサイトが潰れてました

>>296
よくわかりませんが[すべてのプログラム]がありませんでした。すいません
312デフォルトの名無しさん:04/03/21 14:55
すいません。セグメンテーション違反ってなんでしょーか・・・。
普通に動いてたプログラムが、突然そんなこといって動かなくなりました。
313デフォルトの名無しさん:04/03/21 15:04
>>312
例えば
int *p;
/*ここで忘れ物*/
*p = 0;

あるいは
*ぬるぽ = ガッ;
314312:04/03/21 15:10
>>313
申し訳ないです、全然意味がわからないです。
混じれすすると一行入力はgetsでもfgetsでもなくreadline使え。
316デフォルトの名無しさん:04/03/21 15:42
>>312
例えば配列の範囲外アクセスや
代入も初期化もしていない(不定の)ポインタが指し示す先へのアクセス
これらの結果は「未定義の動作」なので何が起きても、若しくは何も起こらなくてもおかしくはない

未定義の動作のうち、よくあるのがSegmentation FaultとBus Error
多くのメモリ制御回路にはMMUというアドレス変換をする回路がついていて
CPUが指定した論理アドレスと物理アドレスが対応していないと例外処理を開始する
この他read禁止もしくはwrite禁止に対する違反を検出した場合や
物理アドレスにデバイスが実装されていなかった場合にも例外処理を開始する
例外処理とは具体的にはCPUへエラー信号を送り処理を委ねること
317デフォルトの名無しさん:04/03/21 16:17
せぐふぉはガッに相当すると。
318312:04/03/21 17:02
>>313-317
ありがとうございます。やっと解決しました。
どうやら配列外のアクセスをしてしまっていたようです。
マカー臭がする。
320デフォルトの名無しさん:04/03/21 20:02
>>319
おいらNEWS使いだい
321デフォルトの名無しさん:04/03/21 21:44
自然数xのlog2(x) + 1(小数点以下切り上げ)を求めたい。
で、今こんなの考えたんだけどこれより速いのがあったら教えて。

for (i=0; x >> i; i++) ;

xが自然数でiがlogね。
簡単に言うと1になったビットで最上位のものを速く求めたいって事。
言い換えるとxを越えない2^iのiを求めたい。
for (i=0; x >> i; i+=4) ;
for (i-=3; x >> i; i++) ;

最初は4じゃ無くても良い。
好きにしなされ。
>>321
x が 0 〜 2^n - 1 の一様乱数なら半分の確率で最上位ビットが1だから、上位ビットからテストした方が速いかもしれない。

各ビットが独立しているようなデータなら、真中のビットから二分探索した方が速いかもしれない。
>>321
>言い換えるとxを越えない2^iのiを求めたい。
xを越える最小の2^iのiに見えるんだが
>>324
log2(x) + 1 をお忘れですよ。小数点以下切り上げ。
    ~~~~~
元がシフトとインクリメントだから、下手にいじらない方が早いかもね。
処理系とCPUに依存しそうだが、落しどころは>>322あたりかな。

>>324あ、ほんとだ。
327デフォルトの名無しさん:04/03/21 22:18
> 20年前に開発した機器の開発環境として動態保存してる。

そりゃ明らかにウソだね。
そのコンパイラーの名前言ってみろよ ;-)
328貧乏紙:04/03/21 22:19
よーーし!
おじさんが今から、仮想記憶管理を説明しちゃうぞ!!!いいのか?えっ



仮想記憶システムのアドレス方式には2種類あり、ページング方式と、セグメント方式だ。
ページング方式とは論理的な構造とは関係なく一定の大きさに分割する。
セグメント方式では論理的な構造に基づいて分割するのでセグメントの入れ替えが
最小に抑えられるのだ。
しかし、メモリのフラグメンテーション(主記憶の断片化)が発生するので、リロケーション(主記憶上のメモリを先頭から記憶しなおす)が
発生しOSのオーバーヘッドが増大するのだ。
329デフォルトの名無しさん:04/03/21 22:19
> C と言えばまだ C89 だろー。

「何度も言えば、そうだということになる(かもしれない)」という思い込みほど
かっこわるいものはありません。

ふつうC99ですね。(常識)
330デフォルトの名無しさん:04/03/21 22:22
> 普通に動いてたプログラムが、突然そんなこといって動かなくなりました。

ふつうにうごいてた「と思い込んでた」だけだろーが。
たまたま運良くうごいてただけだ。そんなものは。
不安定な場所にたまたま運良く都合のいいデータがはいってただけ。
じゃ、
b=sizeof(x)*2;
for (i=1; x >> i; i+=b) ;
for (i-=b-1; x >> i; i++) ;
332デフォルトの名無しさん:04/03/21 22:24
> for (i=0; x >> i; i+=4) ;
> for (i-=3; x >> i; i++) ;
おい、比較演算子の両側はあけるくせに、代入演算子はあけないのか?
(逆はたまにみるが)
333デフォルトの名無しさん:04/03/21 22:26
>>328
でも、ページング方式の仮想メモリーのOSでも、
「Segmantation fault」ってのがでるのはなんでですかー!? ;-)
比較演算子?
xはiよりずっと大きいってか?
>>333
「Paging fault」というメッセージがないからです。
336デフォルトの名無しさん:04/03/21 22:32
>>334
シフト演算子のことがいいたかったのだとおもわれ。

(だが、おれもあけるなあ > 代入演算子の両側。つめるとしろーとくさいので)
ページング方式と、セグメント方式を気にするより、
スタックとヒープを気にした方が実益があるぞ。
338デフォルトの名無しさん:04/03/21 22:33
for (i=1; x >> i; i+=b) ;
for (i-=b-1; x >> i; i++) ;

空文の「;」を同じ行に書いちゃうやつは、ぜったい1回はハマる。
ちゃんと独立した行にインデントして書け。常識!
339デフォルトの名無しさん:04/03/21 22:35
じゃ
b = sizeof(x) * 2;
for (i = 1; x >> i; i += b)
;
for (i -= b - 1; x >> i; i++)
;
そこの上げてるキミ、もう少し考えてから書き込むように。
341デフォルトの名無しさん:04/03/21 22:36
どれのことだろう?
342貧乏紙:04/03/21 22:38
>>333
Segmantation faultってなに?
ページフォルトのメモリー版?
キミのことだよ。
上げてるのは何人も居ないだろ?
>>321
表引き。これ最速。
345デフォルトの名無しさん:04/03/21 22:41
わたしはあげてないからなあ。でも数人いそうだ > あげてるやつ
346デフォルトの名無しさん:04/03/21 22:42
>>344
そういって8087のときみたいにバグをいれるのですね!
347貧乏紙:04/03/21 22:44
Segmantation fault
わかった、セグメントがないという割り込みが発生している。
しかも、その割り込みは優先度が高い。
ページング方式でページがないというメッセージのつもりじゃない。
ハードのエラッタは容易に回避されるからタチがいいよん。
386でインラインアセンブラ使っていいならbsrとかは?
#include <stdio.h>
int main(void){
int i, x;
for (i = 0;i < 100;i++){
for (x = i;x;x >> =1) printf("@");
puts("");
}
return 0;
}
351デフォルトの名無しさん:04/03/21 22:49
> for (i = 0;i < 100;i++){

なんでセミコロンの後ろあけない? カンマといっしょだろ?立場は。
中括弧の前もこれだし...
>>327
Microware C Compiler Ver. 1.0 ですが何か ?
その機械まだ動いてるし。

>>329
「お前の」 常識な。
この件についてたぶん世間の総意は得られていないと思う。

>>330
もう解決してるみたいだし、そんな誰でも知ってること書き込んで楽しい ?

>>333
OS がプロセスに与えたメモリ領域 (セグメント) を超えてアクセスしてるから。
(普通の OS では) Segmentation Fault は直接 CPU が発生するんじゃなくて、CPU からの Page Fault で起動された仮想記憶管理でプロセスがメモリーセグメント外のアクセスをしているとわかった時点でソフト的に例外を発生させる。
このページ処理中に IO エラーが発生すると Page I/O error となるよ。
353デフォルトの名無しさん:04/03/21 22:52
> 「お前の」 常識な

この言い返しがいかにも中学生レベル ;-)
354デフォルトの名無しさん:04/03/21 22:55
> その機械まだ動いてるし。

で、その機械の名前いえますか? ;)
355デフォルトの名無しさん:04/03/21 22:56
#include <stdio.h>
int main( void ){
int i,x;
for( i=0;i<100;i++ ){
for( x=i;x;x>>=1 ) printf( "@" );
puts( "" );
}
return 0;
}
>>354
何顔真っ赤にしてんだ?w
>>356
相手すんな。つか自作自演か?
だったらウザイので消えろ。
>>357
相手すんな。つか自作自演か?
だったらウザイので消えろ。
359デフォルトの名無しさん:04/03/21 23:09
>>359
相手すんな。つか自作自演か?
だったらウザイので消えろ。
360デフォルトの名無しさん:04/03/21 23:12
>>356
恥かかされてるからだろ (ゲラゲラ
361321:04/03/21 23:13
うおー、さすが2ch、レスが速い。

>>322
なるほど、分割するのですか。
やってみます。
>>323
分布は小さい数ほど多い逆比例分布なのです。
>>324-325
すいません、説明のしかたが悪かったみたいです。
>321のコードで期待した結果が得られています。
>>326
処理系、CPU共に不明なのですが言語はC又はJavaです。
>>331
なるほど汎用的ですね。
勉強になります。
>>338
for (i=0; x >> i; ) i++;
こ、これでいいれすか?
i = 0;
while (x >> i) i++;
こっちの方が分かりやすいかな?
>>344
255以下についてテーブルを持っておけば、いいですかね?
でも今どきのシステムなら殆ど変わらない気がします。
362デフォルトの名無しさん:04/03/21 23:13
いっぱい書きましたね。
ようするに、言えないのですね? > 昔の機種名
363321:04/03/21 23:13
32bitだと仮定して、
unsigned int i, x = func(seed);
for (i=31; !(x & (1 << i)); ) i--;

最上位から検索するとこんな感じでしょうか。
というか(x >> i)の真偽判定ってどうやっているんだろう?
ビットシフトなしで特定のビットを狙い撃ちして判定できれば
上位からテストしていけば最大32回の走査で済むから速くなりそう。
>>353
で、その下の行には突っ込まないのか ? (藁

>>354, >>362
言ってもわからんと思う。
基盤から内作してる設備だから。
一応 6809 + 6801 で、6809 側は C で組んでいた。(6801 側はフルアセンブラ。)
当時としては、ちょっとした冒険だったと思う。
まあ、ダメだったらアセンブラで組めばいいやと言う考えだったらしい。

>>359
なかなか謙虚な奴だな。(藁
>363
最上位から検索するなら、毎回notするより、
最初にnotしてから判定するよろし。
366デフォルトの名無しさん:04/03/21 23:23
基盤 -> 基板
367デフォルトの名無しさん:04/03/21 23:24
> 一応 6809 + 6801 で、6809 側は C で組んでいた。(6801 側はフルアセンブラ。)

やーい > 組んで
産業スパイっぽいのが暴れてるな
369デフォルトの名無しさん:04/03/21 23:30
ほんとに温存しているなら、
そのコンパイラーのcharが符号付きか符号なしか、
「# define ...」と、「#」の後ろに空白あけることができたかどうかが言えるはず。

対応していないはずのregister宣言を書いた場合にどういうバグがでるかもな!

(覚えている自分が怖い!)
>>369
シッタカ確定
>>369
質問者は、聞きたい内容をはっきり書くように。
あと、上げないように。
372デフォルトの名無しさん:04/03/21 23:33
>>369
なるほど、当時厨だったわけね(w
373デフォルトの名無しさん:04/03/21 23:35
ようするに答えられないわけだな.
どっちも ;-)
すいませんC書くためのエディタ、何がいいか助言下さい。
これからもsakuraかなとは思っているのですが、
もしCに特化されたエディタなどがあれば、教えて頂きたいです。
>>371
質問はage、回答はsage
勝手にルールを変えないように
376デフォルトの名無しさん:04/03/21 23:37
>>347
viがおすすめです。

Windowsだったら、プロンプトだして、
vi foo.c
と打ってください。
っていうか、単にお友達が欲しいだけのジジイだろ?
妙に懐かしい話題が出たので煽ってみた。と。
きっと、PETとかTRSとか昔の機種名を出すともっと反応するぞ。
でもな、スレ違いだ。

OSも CP/M とかな。角度とか。
378デフォルトの名無しさん:04/03/21 23:40
sakuraエディターは、開発のしかたのコンセプトはいいのですが、
外部仕様のコンセプトがだめすぎです。
379デフォルトの名無しさん:04/03/21 23:40
>>377
CP/M って OSだったのかー
MW-Cとか言ってたから、OS/9だな。
秀丸でいいのでは?
学生なら無料よ。
382デフォルトの名無しさん:04/03/21 23:44
ひでまるもよくないなあ。
とくに金はらう場合は。
悪いことはいわん。viかEmacsにしとけ。
383デフォルトの名無しさん:04/03/21 23:46
日下部先生の授業では、全員viでした。
384デフォルトの名無しさん:04/03/21 23:46
>>382
おい犬厨、比較になってないぞ
>>369
悪いけど、覚えてない。

組込みだから、char は全て unsigned char でしか使わんし、# の後ろに空白を空けたことはない。
(これは、今でもそうだから覚えているけど。)

register は、記憶がない。(つーか、そのあとの 68020 版の奴とごっちゃになってる。)

動態保存 (= FD で保管) してるけど、今使ってるわけじゃないからな。
386デフォルトの名無しさん:04/03/21 23:48
> 動態保存 (= FD で保管) してるけど

それは動態保存とはいわん。
387デフォルトの名無しさん:04/03/21 23:50
ちなみに、いま試してみたら、「=-」はきかんかったぞ!
388おこちゃまヘルパー:04/03/21 23:50
#define 動態保存 今でも担当から外れていないこと
389デフォルトの名無しさん:04/03/21 23:52
手足や頭部は切り離して食べてしまった場合でも、残りを保存。
390デフォルトの名無しさん:04/03/22 00:08
>>387
なんだ、けっきょくないんじゃん。いまどきそんなコンパイラー
>>387, >>390
ちょっと、コンパイル時のメッセージ書いてみてくれ。
そしたら、本物かどうかわかるから。
392デフォルトの名無しさん:04/03/22 00:21
>>390
俺は持ってないってば。
>>392
悪い。 >>387 に対してだ。
394デフォルトの名無しさん:04/03/22 00:23
でも、387は最初にかみついてたやつ本人なのかな?
なぜそんなに必死なんだろう…
396おこちゃまヘルパー:04/03/22 00:26
old fashion
で、あおってたやつはどこ行ったの?
結局1人だったの?
398デフォルトの名無しさん:04/03/22 01:10
unsigned long → ポインタ
あるいはその逆のキャストをするとどういう危険なことが
起こり得るのでしょう?
>>398
キャストした値をどう使うかで危険さが違うと思うが。
400おこちゃまヘルパー:04/03/22 01:17
>>398
まず規格票を嫁
話はそれからだ
401デフォルトの名無しさん:04/03/22 01:27
Cの規格ってどうして有料なの?
質問です。
GNUのHello,world!(メール確認機能とかあるやつ)のソースを読んでいて思ったんですけど、
オプションで"sailor"と指定すると"Nothing happens here."と表示されるのはイースターエッグなのでしょうか?
板違い・スレ違いなどはご容赦下さい。
403おこちゃまヘルパー:04/03/22 01:28
>>401
俺らがなぜ無料で回答してるのかは聞いてくれんのか
404デフォルトの名無しさん:04/03/22 01:31
>>403
楽しいから、だと思ってますた
405デフォルトの名無しさん:04/03/22 01:35
どんなプラットフォームでもぱぱっと手軽に使える .c と .h
だけのハッシュテーブルライブラリ知りませんか?
std::map
std::set
std::multiset
407デフォルトの名無しさん:04/03/22 01:39
>>406
もちろんそれが使えればいいんですけどCなので
おお、Cスレでした。ごめん。
>どんなプラットフォームでも
410おこちゃまヘルパー:04/03/22 01:42
extern "C"
411デフォルトの名無しさん:04/03/22 01:42
【緊急】ネット投票の協力
CNNのネット投票に協力してください。
今回の台湾総統選挙は公正と思いますか
ぜひ台湾に「Yes」を
http://www.cnn.com/2004/WORLD/asiapcf/03/20/taiwan.elections/index.html
QUICKVOTE
Was Taiwan's presidential vote fair?
Yes ●
No
宋楚瑜氏が先程、このネット投票の結果を利用して、選挙無効を群衆に訴えて
います。宋氏に悪用されないようにしましょう。
「台湾の声」編集長 林建良(りんけんりょう)拜
412デフォルトの名無しさん:04/03/22 01:47
>>409
どんなC言語環境でも、に訂正します
413デフォルトの名無しさん:04/03/22 01:56
>>405
汎用的なものは見たこと無いですな。
誰かくれ、にもう一票。
こういう小さなのは?
ttp://www.mnet.ne.jp/~tnomura/C.html
とりあえず、コンパイラのことをコンパイラーと言っていると
恥ずかしい上に自作自演がばればれだぞ
416デフォルトの名無しさん:04/03/22 02:23
>>410の反対で C++ の機能として STL だけ使いたいときに

extern "C++" {
#include <map>
}

とかできないもんですかね。
#include <stdio.h>
#include <stdlib.h> /* malloc( ) を使うのに必要 */
#define BUFFSIZE 100
void Func1(void);
void Func2(char *str2);
char *Func3(void);
char *BuggyFunc(void);
void main(void);
static char str1[BUFFSIZE];
void Func1(void)
{
static int n = 1;
sprintf(str1, "%d Func1( )", n);
n++;
}
void Func2(char *str2)
{
static int n = 1;
sprintf(str2, "%d Func2( )", n);
n++;
}
418417:04/03/22 02:26
char *Func3(void)
{
static int n = 1;
char *s;
s = (char *)malloc(BUFFSIZE * sizeof(char));

sprintf(s, "%d Func3( )", n);
n++;

return (s);
}

char *BuggyFunc(void)
{
static int n = 1;
char str[BUFFSIZE];
sprintf(str, "%d BuggyFunc( )", n); n++;

return (str); }
419417:04/03/22 02:28
void main(void)
{
int i;

char *s;
char str2[BUFFSIZE];

for (i = 0; i < 4; i++) {
Func1( );
puts(str1);

Func2(str2);
puts(str2);

s = Func3( );
puts(s);
free(s);

s = BuggyFunc( );
puts(s);
printf("\n");
}
}

()をうめてこれ実行させるとPCクラッシュや、シャットダウン
420417:04/03/22 02:29
//mskzow.c
421デフォルトの名無しさん:04/03/22 02:29
おききしたいのですが
time_t timer;
time(&timer);

printf("%f\n", timer);
printf("%s\n", ctime(&timer));

この場合ctimeから今の時間に変換して表示できるのですが
変換する前の秒数?(1970年になったときからの秒数)が見たい場合はどうしたらいいのでしょうか?
上のやり方だと決まった数字だけでて来て 今の秒数は出て来ませんでした
よろしくお願いします
422デフォルトの名無しさん:04/03/22 02:31
>>421
> printf("%f\n", timer);

%l じゃないの?
[MSC]time()関数の戻り値,および VC++のtime_t型
ttp://support.microsoft.com/default.aspx?scid=kb;ja;401928
>>422
%ld
425デフォルトの名無しさん:04/03/22 02:39
int i = 0;
unsigned int ui = 0;

if (i < ui)

というコードを gcc -Wall でコンパイルすると何も言われず、
同バージョンの g++ -Wall でコンパイルすると
warning: comparison between signed and unsigned integer expressions
と言われます。

これは GCC のクセでしょうか?
それとも C++ の場合だけ警告するちゃんとした理由があるのでしょうか。
426デフォルトの名無しさん:04/03/22 02:40
ちなみに
gcc version 3.2 20020927
というやつです。
427421:04/03/22 02:50
皆さんありがとうございました
始めは%dでやったのですがマイナスだったので違うと思って他のやつでやってました
もう一つ聞きたいのですが
これって秒数じゃないんですか?
実行したら
[root@localhost test_3]# ./a.out
Su Mo Tu We Th Fr St
-1073750308
Mon Mar 22 02:50:49 2004

[root@localhost test_3]# ./a.out
Su Mo Tu We Th Fr St
-1073747236
Mon Mar 22 02:50:55 2004

[root@localhost test_3]# ./a.out
Su Mo Tu We Th Fr St
-1073749028
Mon Mar 22 02:50:58 2004
のように 増えたり減ったりしています
すいませんが もしよろしければ教えてください よろしくお願いします
特定のキーを繰り返し入力するプログラムはどう書けばいいのでしょうか?
キーボードのキーを指定して実行させるコマンドが分かりません
>>428
そんなものは無い。
入力してその特定のキーかどうかチェックする

現在、そのキーが押されているかどうかのチェックは環境依存になるぞ
>>427
difftime()を使ってみては?

time_t timer;
time(&timer);

printf("%.0f\n", difftime(timer, 0));
432421:04/03/22 03:31
>>431
ありがとうございます
これで思っていた結果が出せたのですが 結局time(&timer)は何を得ているのかが分かりません
説明して頂けないでしょうか?
私もしらべたのですが分かりませんでした

まだdifftimeはなにか分からないのですが 今日はすいませんが寝ます
どうもありがとうございました
433デフォルトの名無しさん:04/03/22 07:35
> とりあえず、コンパイラのことをコンパイラーと言っていると

え、「コンパイラー」だとだめなんですか?
プログラマーは末尾のーを省略して通ぶるのが一般的です。
435デフォルトの名無しさん:04/03/22 07:43
>>434
あのー。じゃあその「プログラマ」にはならないのですか?
掲示板で末尾のーにこだわる香具師を見て、
「すごい。彼は通だな。」と思うかい?
437デフォルトの名無しさん:04/03/22 08:20
で、どっちがいいんですか?
知らん。
>>437
プログラマー表記に絡んでくる自称通の馬鹿が多いから
どちらがいい、正しいに関係なくーを省略したほうが無難。
>>376
>>382
ありがとうございます。
非常ーーに申し上げにくいんですが・・・
当方、WindowsXPなのですが、コマンドプロンプトでもファイルを指定して実行でも
「vi foo.c」では何も起きないんです・・・。
どうすればvi使えるのでしょうか・・・・
441デフォルトの名無しさん:04/03/22 09:29
>>439
「ドライバ」と「ドライバー」で話が通じなかったことを思い出した

「動かすにはドライバーが必要なんだよ」
(゚Д゚;)?
443デフォルトの名無しさん:04/03/22 10:24
エコーをエコと言ったら通じないな。
3文字以上というオキテがあるそうだ。
>>440
viはWindowsXPにインストールされていないので
notepad foo.cと打てばいい。ちなみにvi, emacsはUNIXのエディタ。
446デフォルトの名無しさん:04/03/22 11:28
リクエストがきた時にキーを自動で削除する方法が分かりません
00000001というキーがあったとします
00000001というキーが発行されました
00000001というキーはこの時点で必要ありません
次にリクエストがあった時に00000001というキーがそのまま残っていてはまた発行されるかもしれません
どう処理すれば良いでしょうか?
発行済みキーが無くなるまで取得する。
一括でフラッシュする関数も探してみれ。
レスありがとうございます

発行キーはTIME関数を利用して20億以上用意してあり
その中の00000001なので1/20億です
で・発行は00000002,00000003...と続いていくのです
その発行済みキーは20億以上用意してあるので無くなりません
だから一行ずつ消したいです よろしくお願いします
>>444
エコー
Echo

どちらも3文字以上だが?
>>449
省略後に3文字以上。
発行済み00000001キーが無くなるまで取得する。
ではだめなん?
C言語をマスターしたいです。
まず何をすればいいですか?
453デフォルトの名無しさん:04/03/22 14:14
マ板がずっと落ちたママになてるのはどうして?
454デフォルトの名無しさん:04/03/22 14:25
for(int i=0; i<10; i++)
とかやったときのiのスコープってどこまでなんでしょうか。
gccだとforループを抜けた後は無効なんですが、
VisualCだとループ後も有効になります。
>>454
それC++じゃなくて?
前者の動作は新しい仕様、後者は古いもの。
VC++はfor文のスコープを標準にするオプションなかったっけ?
スコープとブロックが1対1対応の方がわかりやすいなあ。
458446.448:04/03/22 16:17
言葉足らずでしたな(汗

FILELIST
------------------
00000001
00000002
〜ほぼ無限(何故無限なのかと言うとリクエストも無限にあるから無限にあるから)
------------------
というFileが既に作られておりリクエストがあると00000001がまず発行され
次に00000002が発行されます
そんな感じに動くけれど発行された00000001は必要無い
ので発行されたキー:この場合00000001から順にファイルから消したい
キーは一つしかないです
ListFileからリクエストがある度に一行自動削除がしたいという事(^^;
メモリマップドファイルにしてその都度書き直す。
ファイルポインタで対処し、プロセスの終了時に書き直す。
ファイルポインタを別ファイルに書込んでおく。

最初のは、あらかじめファイル分割が必要かな。
みんな頭いいなぁ
俺は>>458が何をしたいかわからん
>>454 >>457
forループスコープの強制準拠だね
/Zc:forScope

分かりにくい名前のオプションだよなぁ
強制準拠って…

>>455
C99からはCでもOKになったんよ。確か。
>>461
でも奴はそれに準拠していないコンパイラを使っているはず。
973 名前:おさかなくわえた名無しさん メェル:sage 投稿日:04/01/09 22:08 ID:hOsI679G
ウデムシでヒットしたやつ・・・そんなにきもくないよ。裏からのはなかったけど

478 名前:ピロシキ次郎 ◆EVH/Kw0M :02/08/14 02:42 ID:???
番組の途中ですがここでウデムシ普及委員会から少し宣伝させて頂きます
皆さんもウデムシを知り、その素晴らしさを世界に広めましょう。

アフリカ産ウデムシ
http://www.geocities.co.jp/HeartLand-Namiki/3684/photo/ude0025.jpg
エイリアンな顔
http://www.geocities.co.jp/HeartLand-Namiki/3684/photo/ude0024.jpg
3.22 脱皮。脚が抜けきらない不全。
http://www.geocities.co.jp/HeartLand-Namiki/3684/photo/ude0000.jpg
http://www.geocities.co.jp/HeartLand-Namiki/3684/photo/ude0004.jpg
翌々日死亡。
http://www.geocities.co.jp/HeartLand-Namiki/3684/photo/ude0005.jpg

974 名前:おさかなくわえた名無しさん メェル:sage 投稿日:04/01/09 23:37 ID:ZX1eMQcM
>>973

どうしよう。今日寝れないかもしれない…
怖いよー。
。・゚・(ノД´)・゚・。  ウワァァァァァァアソ
>>445
> ちなみにvi, emacsはUNIXのエディタ。

vi はまあいいとして、emacs が UNIX のエディタとか言うと、ちょっと素人っぽいな。
465デフォルトの名無しさん:04/03/22 21:38
kterm万歳
466デフォルトの名無しさん:04/03/22 22:05
emacsは糞、xyzzy万歳
467デフォルトの名無しさん:04/03/22 22:10
メモ帳でコーディングするやつが真の勝ち組。
468おこちゃまヘルパー:04/03/22 22:22
>>464
俺もそう思う
randを使って0からRAND_MAXまでの乱数を発生させるとき、
最大値をRAND_MAXではなく100にしたいのですが、
この際、rand%101としたとき、
発生される0から100の間の数字には微妙な偏りが生じてしまうと思うのですが、
このような偏りを生じさせず、きちんとランダムに0から100の間で乱数を発生させる方法はありますでしょうか。
>>470
>>471
どうもありがとうございました。
あとセキュリティにかかわるなら/dev/random
474デフォルトの名無しさん:04/03/22 23:55
rand % 101よりは↓


(double)rand() / (RAND_MAX+1) * 101
475デフォルトの名無しさん:04/03/23 03:34
> メモ帳でコーディングするやつが真の勝ち組。

cat > foo.c でデバイスドライバー書いちゃうBill Joyぐらいにならないと...。

Windows(DOS)ならさしずめ、copy con foo.c ってとこか。
476デフォルトの名無しさん:04/03/23 03:36
> 前者の動作は新しい仕様、後者は古いもの。

それはC++の場合だろ。
Cの場合は、使えるようになった当初(もう5年も前だ!)から、同じ仕様のまま。
477デフォルトの名無しさん:04/03/23 03:38
> 発生される0から100の間の数字には微妙な偏りが生じてしまうと思うのですが、
> このような偏りを生じさせず、きちんとランダムに0から100の間で乱数を発生させる方法はありますでしょうか。

for (i = 0; i <= 100; i++) すれば均等 ;-)
478デフォルトの名無しさん:04/03/23 03:39
> > ちなみにvi, emacsはUNIXのエディタ。
> vi はまあいいとして、emacs が UNIX のエディタとか言うと、ちょっと素人っぽいな。

どっちもちがうだろ。まあEmacsはUnixに移植されてから有名になったわけだが。
479デフォルトの名無しさん:04/03/23 04:18
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>

#define MAX 11
#define OCC 1
#define EMP (-1)

int a[MAX];

main()
{
time_t seed;
int i, j;
int g;

time(&seed);
srand(seed % UINT_MAX);

for (i = 0; i < MAX; i++) {
g = rand() % MAX;
printf("%d ", g);
}
printf("\n");
}
480デフォルトの名無しさん:04/03/23 04:19
その中心部分を以下のようにかえれば均等に。

for (i = 0; i < MAX; i++)
a[i] = EMP;
for (i = 0; i < MAX; i++) {
do {
g = rand() % MAX;
} while (a[g] != EMP);
a[g] = OCC;
printf("%d ", g);
}
printf("\n");
481デフォルトの名無しさん:04/03/23 04:24
>>480
それだと遅くなるだろ。10000回ぐらいに増やしてやってみれば一目瞭然。

こうすればいいのでは?

for (i = 0; i < MAX; i++)
a[i] = EMP;
for (i = 0; i < MAX; i++) {
do {
g = rand() % MAX;
} while (a[g] != EMP);
a[g] = i;
}
for (i = 0; i < MAX; i++) {
for (j = 0; j < MAX; j++) {
if (a[j] == i)
printf("%d ", j);
}
}
printf("\n");
482デフォルトの名無しさん:04/03/23 09:30
>>481
そんなに律儀に変数の「もとの意味」を尊重しなくても、
せっかく連続した整数になってるのだから、

以下のように、どう流用しようと正しく出ればいいのでは?
for (i = 0; i < MAX; i++)
a[i] = EMP;
for (i = 0; i < MAX; i++) {
do {
g = rand() % MAX;
} while (a[g] != EMP);
a[g] = i;
}
for (i = 0; i < MAX; i++)
printf("%d ", a[i]);
printf("\n");
if(MANKO_CHINKO == 100){
printf("MANKO%d" ,MANKO_CHINKO\n);
}
else
{
printf("MANKO%d" ,MANKO_CHINKO\n);
}
484は ◆cplnFO9T0I :04/03/23 10:46
オブジェクトファイルからライブラリの作るのにはどうしたらいいですか?
開発環境はBCC5.5です。
>>458
>リクエストがあると00000001がまず発行され
>発行された00000001は必要無い
>ので発行されたキー:この場合00000001から順にファイルから消したい

キーの発行の処理でファイルを削除するべきじゃないの?
>>479-482
MAX-1回目が終わった時に、次回に出る数が予測できてしまうが、そんなんで良いの?
全部ネタです。
ネタだったのか。それじゃ、マジレス。
このやり方はannealingとか呼ばれてる。
50年前から提案されていたが、この20年で急速に普及した。

#define RMAX 100

int avrand()
{
 int r,s;
 static unsigned int count[RMAX+1];
 static unsigned int cnt;

 r=rand()%(RMAX+1);
 s=(r+1)%(RMAX+1);
 r=count[r]<count[s] ? r : s;
 count[r]++;
 cnt++;
 if(cnt>(RMAX+1)*2){
  for(r=0;r<=RMAX;r++){
   count[r]>>=1;
  }
 }
 return r;
}
演算子にスペースを付けるとか付けないとかのご指摘は遠慮申し上げる。
490489:04/03/23 14:16
if(cnt>(RMAX+1)*2)のブロックで、
cnt-=(RMAX+1)*2するのが抜けてた。すまん。
491458:04/03/23 14:27
>>486
それはどうやるんですか?
486さんは、00000001をファイル名だと思ってるに500ウォン。
俺はC以前にビットとか16進数とか意味不明。
やっぱ、自己研鑽できない奴がいるんだな。
うれしいよ。俺もそうだったし。
なんだ。みんなそうだったのか。

すげー安心した。
嬉しがってる暇があったら、
ちったぁ試行錯誤すれ。
理解は試行錯誤の先にあるものだ。
>>496の言うとおりだ。
俺も16進数とか意味不明だが、試行錯誤の末に5進数まで理解できた。

年内に10進数、来年には16進数に到達する勢いだ。
継続は力なり。
5進数まで理解できれば、
一般のN進数まで理解できるだろうに...。
5進は右手で足りるけど、6進からは両手が必要。
11進からは右足を使うか左足を使うかは検討中。
ち(ry
今時16進数なんて使ってる香具師がいるとは・・・
そろそろ32進数に切り替えないとやばいよ・・・
>500
11進数が心地良いな。
俺はこれで十分だ。
503デフォルトの名無しさん:04/03/23 20:51
>>499
ちんこをつかえ
>>501
16=2の(2の2乗)乗ということも分かんねーのかよー。
やばすぎるぜー。
そうか!次は256進数だったか。
表記には\0とか\rとか総動員だな。
対応エディタ作ってひとヤマ当てるか・・・
>>505
絶対作れよなw
507デフォルトの名無しさん:04/03/23 21:46
>>504
プ
割り込み失礼します
breakは構造化プログラミングを破壊するので
breakを使わずswitch文をあらわす一般的な方法を示せ
という問題がでたのですがどうすればいいのかわからずてんてこ舞いです。
教えてください。
えぇ〜俺なんか片手で0から31まで数えられるYo
>>508
>breakを使わずswitch文をあらわす一般的な方法を示せ
日本語ワカリマセーン

>breakは構造化プログラミングを破壊するので
ハァ?
家を壊すぜ
ビルを壊すぜ
橋を壊すぜ
512デフォルトの名無しさん:04/03/24 00:10
>>490
それ以前にforを通ったらrは壊れちゃうでしょ?
それに、cntは念のため初期化したほうが教育上いいのでは?
513デフォルトの名無しさん:04/03/24 00:26
>>512
じゃあ、こうか?
#define RMAX 101

int avrand()
{
  static int count[RMAX];
  static int kt = 0;
  int s1, s2;
  int r;
  int i;

  s1 = rand() % RMAX;
  s2 = (s1 + 1) % RMAX;
  r = (count[s1] < count[s2]) ? s1 : s2;
  count[r]++;
  if (++kt > RMAX * 2) {
    kt -= RMAX * 2;
    for (i = 0; i < RMAX; i++)
      count[i] /= 2;
  }
  return r;
}
514デフォルトの名無しさん:04/03/24 00:41
>>508
int k = 0;

switch (n) {
case '3':
 ++k;
case '2':
 ++k;
case '1':
 ++k;
}

...なわけない。
515デフォルトの名無しさん:04/03/24 00:45
* を使って7セグメントLED風のデジタル時計を出すプログラムで、時間情報を取得してから
どうやって表示に反映させたらいいでしょうか?
516デフォルトの名無しさん:04/03/24 00:48
ふつうに > どうやって
> breakを使わずswitch文をあらわす一般的な方法を示せ
else ifのことか?
519デフォルトの名無しさん:04/03/24 01:39
>>517
たぶん出題者はそれを答えさせたいんだろうね。
でも、switchよりもっと汎用だよな。
if (i > 2) ...ってののあとに else if (x == 0) っても書いてもいいわけだし。
(switch文でそんな判定できるか!)

それに、そのやり方を使うのはべつに「breakを使いたくないから」なわけではない。
(delphiのswitchにはもともとbreakないもんなあ)

そもそもbreakは構造化プログラミングを破壊するので、っていいぐさが「大うそ」
その講師は「しったかぶり」してるのがばれちゃってるじゃん。
ここに名前をさらせよ!

そこで、汎用の「goto」しかないようなFortranだと、どこにでもgotoできちゃうので、
構造化プログラミングに反するコードもかけちゃうわけだが、そういうgotoをつかわなく
てもループを脱出できるようにしたのが、Cのbreakであり、VBのExit Forなわけ。
なので、breakはむしろ「構造化プログラミングのため」のものであり、
breakの濫用を恐れるってのは、かなりすじちがい。(そう濫用できるものでもないし、
かなりむずかしくつかって混乱させようとおもっても(gotoみたいには)できないのだ。

とにかくその課題出した講師の名前をここに書け!
520デフォルトの名無しさん:04/03/24 01:45
>>519

漢なら算術IF文だろ!? だって、コードが面白くなるじゃん。

(上記の文を英訳せよ。5点)
If you are guy, then use arithmatic if. because, code is become to fun.
冠詞が
523デフォルトの名無しさん:04/03/24 02:06
キッシュイーターは、goto文など最初から存在しない言語を使うべきなんです。
逆に、硬派の男は、そんなものを使ってはいけません。
ちょっとまちがえれば手を切ってしまうような、fool-proofがないかわりに、
その道具本来の性能をフルに発揮するようなそんなプロ用の道具、アセンブラーか
Fortranを使うべきです。
本物のプログラマハケーン
525おこちゃまヘルパー:04/03/24 07:28
>>519
大ウソだあ? 冗談も休み休み言え
処理本体の中に制御の一部を持ち込むんだぞ
少なくとも構造化定理に出てくる制御のどれにもあたらないぜ
そういうあなたこそ「そういうgoto」とはどういうgotoかを
全然説明できてないようだが?
宗教戦争が始まりまつた
527デフォルトの名無しさん:04/03/24 08:28
おいしいのにー > キッシュ・ロレーヌ
何でこんなくだらない話で盛り上がれるんだろう・・・
宿題スレ逝ったら?
>>508
関数へのポインタ使えばできるだろ。
この際一般的かは置いといて。
チャットルームですから
そんな話はちゃっちゃとおわれ
532デフォルトの名無しさん:04/03/24 14:08
#include <stdio.h>

char *strcat(char *str1,const char *str2){

int i=0,length;

for(i=0;*(str1+i);i++);length=i;
for(i=0;*(str1+length+i)=*(str2+i);i++);

return &str1[0];

}


int main(void){

char str[128]="aaa";
char *str2=strcat("ABCDE",str);

printf("%s\n",str);
getchar();

return 0;

}


上のコードを書いてみました。予想では「ABCDEaaa」と表示されるはずなんですが、
うまくいきません。どうしたらいいでしょうか。
532はどうしてそんなのがしりたいんでしょうか
534デフォルトの名無しさん:04/03/24 14:15
#include <stdio.h>

char *strcat(char *str1,const char *str2){

int i=0,length;

for(i=0;*(str1+i);i++);length=i;
for(i=0;*(str1+i+length) = *(str2+i);i++);

return &str1[0];

}


int main(void){

char str[128]="aaa";
char *str2=strcat(str,"ABCDE"); //ここ逆じゃないとだめじゃない?

printf("%s\n",str);
getchar();

return 0;

}
>>532
「"ABCDE"」にくっつけようとしてるから
そこに「"aaa"」をつけようとしても、そんな領域あるわけないでしょ
>>534
おぃおぃ。逆にしたら結果変わるだろw

あ、あとそれやっても"aaa"と出るだろうな。
printfの引数がstrだし。
537デフォルトの名無しさん:04/03/24 14:22
>>536
いや、それはわかってるが・・・
まあこうか?
char *str = "aaa";
char str2[128] = "ABCDE";
strcat(str2, str);
printf("%s\n", str2);
>>532
printf("ABCDEaaa\n");
俺天才。
>>534
いまだにそんなに汚いコード書く奴がいるのか・・・
540デフォルトの名無しさん:04/03/24 14:31
main関数の内容を変えないままできないでしょうか。
>>540
バグってるから駄目。
>>539
俺にいうな。
>>540
strcatの引数str2にくっつけるようにすればOK
>>540
バグにあわせて修正か。すごいな。
>>544
何言ってんのお前?
546デフォルトの名無しさん:04/03/24 20:48
typedefって何の略なんでしょうか?
type definition
548デフォルトの名無しさん:04/03/24 20:51
>>547 なるほど 即レスサンクスです。
549デフォルトの名無しさん:04/03/24 21:08
int で入力した文字をchar型に変換したいのですが、どうやればよいのですか?
550デフォルトの名無しさん:04/03/24 21:10
>>549
キャスト
>>549
ん?
int型整数をchar型整数に変換したいのならキャストで、
int型整数を文字列に変換したいのならitoa関数
552デフォルトの名無しさん:04/03/24 21:18
sprintf
553デフォルトの名無しさん:04/03/24 22:42
* を使って7セグメントLED風のデジタル時計を出すプログラムで、時間情報を取得してから
どうやって表示に反映させたらいいでしょうか?
配列の要素を指すポインタについてなんですが、

int arr[N], *p;
p = arr-1;  //(a)
p = arr+N;  //(b)
p = arr+N+1; //(c)

この場合(b)だけが合法で、(a)(c)はアドレスを計算ようとしするだけで
まずいんでしたっけ?
>>554
うん。まずい。
>>555
さんくすです。

>計算ようとしする× ==> 計算しようとする○
スマソ。
*** *** ***
*   *    *
*** ***   *
  *   *   *
*** ***   *
lsic試食版を使いはじめて3日ほどになります
ゲームとしてサンプルのソースファイルをコピー、コンパイルしようとしたところ、
「can't open: el.h」と表示されました
質問1  このel(easy link library)は、C言語界の中ではどういった評判なのでしょうか?

でまあ結局DLしてみたわけですが、今度は「can't open: window.h」「can't open: windowsx.h」を始め、
winnls32.h ddraw.h dsound.h dinput.hなどが開けませんでした

質問2  これらはどこで手に入れることができるのでしょうか?

見た感じの印象としては、なんだか基本そうなものなのであせっております
ヘタレな質問で申し訳ないです
なんだこの文章・・・

ゲームとしてサンプルのソースファイルをコピー、コンパイルしようとしたところ、
→サンプルのゲームのソースファイルをコピーし、コンパイルしようとしたところ、
lsicはマジやめとけ。
せめてBCCかcygwinのgccにしとけ。いや、ほんとに。
金があるならVC++.net買っとけ。
>>559
質問 そのサンプルのソースファイルは何?
>>561
さすがに1行目を否定されたのは意外でした
「フリー コンパイラ」でググって手に入れたlsicですが、結構2ch評判よさそうだったので・・・
BCCとgcc、調べてみます。ありがとうございます

>>562
ブロック崩しです
http://ponk.jp/el/block/block.cpp
ここにありました
564一星 ◆Cppn/.YI3. :04/03/25 00:54
>>563
 あんな制限され過ぎのコンパイラーではやってけないぞ。
>>561の言う様に、BCCかCygwinのgccがいいと思うな。
elライブラリをインストールできてないっぽいな
vc++以外だと少しの手間と知識が必要
bccはやり方書いてあっただろ
DirectXSDKもインスコしてなさそうだし

lsicからは使えないと思うぞ
なぜLIS-Cがいけないかというと
LIS-Cがメインで使われていたOSは現在主流のWindowsXPの
6世代前(Windows2000->Me,98,95,32s,3.1,DOS)という無茶苦茶古い時代の話だから。
567デフォルトの名無しさん:04/03/25 01:09
>>554
(a)はいいだろ?
>>567
ダメだろ
>>567
その理由は?
570デフォルトの名無しさん:04/03/25 01:12
> 6世代前(Windows2000->Me,98,95,32s,3.1,DOS)という無茶苦茶古い時代の話だから。

Windows2.0や1.0はシカトですか?
(XPがはいってないのが不思議)
571デフォルトの名無しさん:04/03/25 01:14
>>568
(a)と(b)がOK、
(c)だけがだめ。
>>571
(a)がOKな理由がわからないなあ。添え字がマイナス方向の
一個はみ出しはCでは認めてないよ。
プラス方向の一個はみ出し、つまり(b)のみ可だよね?
>>573
その通り。C++のSTLのイテレータもそれと同様の考え方に
基づいて作られている。
>>564
いいHNですね。星新一氏の父親のようだ
ありがとうございます、そうしてみます

>>565
>elライブラリをインストールできてないっぽいな
確かにel.hをINCLUDEフォルダに入れただけです。そうかもしれません
>bccはやり方書いてあっただろ
とりあえずbccをDLしてみます
>DirectXSDKもインスコしてなさそうだし
SDKと言う単語が良くわからないので、きっとそうでしょうね。すいません
ありがとうございます

>>566
勉強になります。ありがとうございます
576デフォルトの名無しさん:04/03/25 02:12
> Cでは認めてないよ。

まるで他の言語だとみとめてるみたいに聞こえますが...
>>576
そういう風にひねくれた受け取り方をする人の方が少ないと
思いますが・・・・・
>>554
アドレスの計算だけなら何やっても問題ない
全部大丈夫だ
int arr[N], *p;
p = arr-1;
このままの流れならマズイ結果になるだけで、

int arr[N], *p;
arr++;
arr++;
p = arr-1;
これなら大丈夫じゃないの。

まあ、
"アドレスの計算だけなら何やっても問題ない全部大丈夫だ"
と同じ理論だけど。
コンパイラも何も言わないと思うよ。

それから
"添え字がマイナス方向の一個はみ出しはCでは認めてないよ。"
配列とポインタ演算をごっちゃにしないように。
arr-1
はポインタ演算
配列で確保したアドレスが不連続だと困っちゃう。
ポインタの配列に格納されたアドレスと
配列の物理アドレスをごっちゃにしないように。
配列の物理アドレスは連続した領域を確保するでしょ。
582デフォルトの名無しさん:04/03/25 03:03
> int arr[N], *p;
> arr++;
> arr++;
> p = arr-1;

2行めでエラー...ってのが0.1秒以内にわからないと
>>579
あのさ、
>int arr[N], *p;
>arr++;
>arr++;
>p = arr-1;
これ本当にコンパイル試してから書いてるの?arrは定数なので
コンパイルエラーが出るはずだよ。
584デフォルトの名無しさん:04/03/25 03:04
> 配列で確保したアドレスが不連続だと困っちゃう。

そんなのは配列とはいわん。
>>579
>配列とポインタ演算をごっちゃにしないように。

気になったので一言。

例えポインタ演算であっても、それが配列内のオブジェクトを
指していた場合は、演算によって配列内及び配列の最後尾
の一つ後ろ以外のアドレスを指した場合は結果は不定となる。

不定とは、動作が停止するなどの重大な影響を与える事は
ないが、ポインタの内容が無意味となる事を指している。

だから論点は、「不定が果たして問題ないのか、それとも
問題があるのか」という点に集約される。
配列は、配列としてアクセスされる限りは連続だけど、
物理的に連続した領域である保証は無いよん。
参照さえしなければ、演算すること自体(arr-1, arr+N+1)は
問題はないってことかな? ただ配列要素(末尾+1を含む)の外を
指しているので、演算結果が予測できない値になるかもしれない、
ということですかね。
>>586
例えば配列の真ん中当たりでスワップアウトされていたりな。
アクセスの際に初めて物理的に連続な位置に置かれるな。
>>587
たぶんそういう意味でしょう。
極端な話、ポインタが32ビットで、配列の先頭アドレスが0x00000004
で、オブジェクトのサイズが8バイトだとすると、ポインタを-1すると
0xfffffffcになり、多くのOSでは明らかに連続とは言えなくなります。
(ラップアラウンドを許可しているOSならいいのかもしれないが、少なく
ともアドレス0は有効なデータであるはずがない)

もっとも0をポインタとして扱う場合はコンパイラがその処理系に有効
なnull pointerに変換するので、必ずしも0x00000000とは限りませんが。

演算そのものは実行しても害はないが、例えば arr - 1 + 1 とやっても
arrに戻る保証は仕様では規定されていないという事ですね。実際には
ほとんどの処理系ではarrに戻ると思うけど、それを当てにしたプログラム
は書いちゃまずいという事でしょう。
>>587
いやあの、たとえば配列が物理的に番地0から配置される場合、
-1しちゃったらどうなるとかいう問題が。

こういうのが起こりそうな例だとx86のリアルモードしか
おれには思いつかんのだけど、ありうることはありうる。
たとえばDS:0から配列が配置される可能性はありうるんで。

このスレ的には規格から外れてるから配列の先頭アドレス-1なんて
アドレスを生成しちゃいかんてことでおわりなんだけど、
それは上に書いたような実装のことが念頭にあったのだと思う。

ちなみに、配列の末尾アドレス+1が合法ってのは、K&Rにでてくるstrcpyのループ、

while (*p++ = *q++)
;

のようなコードを救うためだったと本で読んだ覚えがある。
無論アドレスの生成のみが合法で、デリファレンスしちゃいかん。
純粋なCって今でも手に入るんですか?
今も昔も手に入らんよ
GCC -ansi -pedantic
gcc だった...。なぜか大文字にしてしまった。
595デフォルトの名無しさん:04/03/25 07:38
へえー知らなかった。
じゃあこういうの厳密にはダメなの?
良く見るけど。

struct hoge {
 size_t len;
 char data[1];
};

struct hoge *pHoge = malloc(sizeof(*pHoge) + 10);
char *ptr = pHoge->data;

*(ptr + 5) = '\0'; // 配列の添字を超えたアドレスは未定義?
596デフォルトの名無しさん:04/03/25 08:02
signed intで負の数を、そのままunsigned intの変数に代入したとき、
その数は、単純にバイナリ値として扱われ、正の数になると考えてよいのでしょうか?
>>586
>配列は、配列としてアクセスされる限りは連続だけど、
>物理的に連続した領域である保証は無いよん。
これってつまり、C言語から見るとすれば必ず連続しているってことですよね?
599デフォルトの名無しさん:04/03/25 12:13
>>598
そういうこと。
ソースレベルでは、配列もポインタも連続した領域にアクセスするように見える。
入門書によく書いてあるメモリの配置そのままになっている。
ただし、実際にはCPUにとって、アクセスしやすいように、メモリ上に配置されている。
たとえば、char型の配列でも、16ビットCPUなら2バイトおき、32ビットなら4バイトおきに配置されることもあり得る。
600デフォルトの名無しさん:04/03/29 10:35
ファイル入出力なんですが既にファイルの中にある数字(%ld)と文字列(%s)を
何かその数字や文字列を消すような要求があった時に、
別のファイルに手動ではなく自動で保存する方法(プログラム)って無いですか?
601デフォルトの名無しさん:04/03/29 12:41
>>600
日本語で話せ
602600:04/03/29 14:07
ファイル内にある数字や文字列を
管理者による手は加えずに、別のファイルに保存する方法でつ。
一行読み取って消すやつは消して別ファイルにコピー
を繰り返して、初めのファイルを消去、そして別ファイルの名前を
初めのファイルの名前に変える。
>603
コード示してもらうと助かります。
質問が曖昧すぎる。
>>602
他人に伝わる日本語で話せ
中身は同じで、名前だけ違うファイルを作りたいということなのか?
608これで分かるかな?:04/03/29 16:41
-------------------------
12345  あいうえお
12346  かきくけこ
12347  さしすせそ 
12348  たちつてと
-------------------------

というファイルがあったとして、
例えば一行目(12345  あいうえお)←の登録者から、
「消したい」という要求があった時に
この行をデリート済みファイルとして他のファイルに保存したいでつ。
プログラムの結果は
-------------------------
12346  かきくけこ
12347  さしすせそ 
12348  たちつてと
-------------------------

このファイルと

-------------------------
12345  あいうえお
-------------------------

このファイルの二つになります お願いします
>>608
それでもわかりません。

登録者って誰?つーか登録とは?
「消したい」という要求はどうやって出す?
デリート済みファイルって何?
管理者、登録者ってのは何なんだよ。
OS? それともこのプログラムだけの概念?
>>608-609
母国語で書いてみな。分かる人が見てるかもしれないから。
一行目が誰かから登録されたIDで、その誰かはそのIDは使わないので消してくれと。
んじゃ、消すけど別のファイルに消したIDはとっておきますよ。
と言った感じで。
>管理者ってのは何なんだよ。
自動でやってもらいたいので「管理者など人の手は加えずプログラムだけで処理しきる
>>613は釣り師か。
やっと気づいた。
>>614
これだけ書いても分からない喪前はアフォなのか?
あー、一応忠告しとくとだな。
おまいさんの説明は質問されたことには触れずに他の妙なとこ説明してるんだよ。
それじゃ誰もわからん。下手すりゃ、釣り師扱いだ。
>>616
これだけ書いても分からない喪前はアフォでつね。
>>611が書いた「管理者、登録者ってのは何なんだよ。」には>>613で答えただろ
>>613

>>登録者って誰?つーか登録とは? (>>610)
>一行目が誰かから登録されたIDで、…

>>管理者、登録者ってのは何なんだよ。(>>611)
>自動でやってもらいたいので「管理者など人の手は加えず…

いわゆる再帰ですね。
終了条件が無いから無限ループですね。
ファイルの中身をメモリに読み込んで消したい行だけ他のファイルに書き込み、残りは元のファイルに上書き。
あとの細かいことはしらん。
終了条件はありません。登録者がいるって事はサーバプログラムだろ
あるわけないし。
>>621
>>619が言ってるのは

「登録」って何?って質問に
>一行目が誰かから「登録」された…
って「登録」という単語を使ってることを再帰といってるんだろ。
だから登録って何なんだ。

「管理者」も同じ。
登録はユーザーリクエストがあった時作られたID 作られたと言う表現を登録と言った。
管理者でもそのファイルに手を加えず、
プログラムだけでファイルの中にある文字列処理をしてほしいと言う事。
的外れな受け答えは釣りの基本でつね
>>624
和姦ねーヤツは釣りといってごまかす(www

626デフォルトの名無しさん:04/03/29 17:23
hosh
#include <stdio.h>
#include <string.h>
#define FILENAME "test.txt"

int main(void){
FILE *fin, *fout1, *fout2;
char pat[16], buf[1024], *p;
fin = fopen(FILENAME, "r");
fout1 = fopen("temp.txt", "w");
fout2 = fopen("damelist.txt", "a");
printf("番号 >");
fgets(pat, sizeof pat, stdin);
(p=strchr(pat, '\n'))?(*p = '\0'):(pat[15] = '\0');
while (fgets(buf, sizeof buf, fin) != NULL){
if ((p=strstr(buf, pat)) != NULL){
fputs(buf, fout2);
} else {
fputs(buf,fout1);
}
}
fclose(fin);
fclose(fout1);
fclose(fout2);
remove(FILENAME);
rename("temp.txt",FILENAME);

return 0;
}
ちょっと違うが、こんな感じか。(エラーチェックもしてない。)
ソレだ!でも printf("番号 >"); コレは何でしょう?
629デフォルトの名無しさん:04/03/29 17:58
いや別に文章のほうでもいいんだが。
それだとpatの大きさが小さいからふやすべきだな。
630デフォルトの名無しさん:04/03/29 18:04
まあ、現実の仕事では>>608日本語を話せない馬鹿が仕様を
書いたりリクエストを出したりするからちょうどいい練習だろ(笑)
話し言葉で掲示板に書き込むとこういう事になってしまう
という分かりやすい例を見てしまった気がします。
春休みももう少しで終わるな…
633デフォルトの名無しさん:04/03/29 20:33
javaとC++
いまから覚えるならどっち??????
>>633
どの言語がいいか(不毛な)議論をしてるスレなら他に腐るほどある。他池。
>>633
コイン投げでもして適当に決めなさい
どっちを選んでもどうせ五年後には勉強しなおすときが来る
636デフォルトの名無しさん:04/03/30 00:32
>>627をネットワークにつなげるとどうなる?
リクエストがあるってことは、ネットワークプログラミングだろ。
637デフォルトの名無しさん:04/03/30 01:02
画面制御にcursesを使い、getchでキーボードから文字を取ってるんですが、
取った文字をwprintsで表示すると自分の思う文字が表示されません。
ここで現われる文字はキーボードに対応するアスキーコードではないのですか?
エロイ人アドバイスお願いします。
>>637
スレ違い。
他のスレで質問するときはソースも一緒に書けよ。
-0001  あいうえお
12346  かきくけこ
12347  さしすせそ 
12348  たちつてと
とかしておいて、暇なときにバッチで縮小する。

というのは、今時はしないの?
640デフォルトの名無しさん:04/03/30 08:53
>>639
へえーなるほど。
今時の人間なので参考になります。
>>639
どういう意味?
642デフォルトの名無しさん:04/03/30 14:25
すみません。チョット質問が有るので聞いてください。
会計系の処理のところで、NPV法の為の算出式を作っています。
NPV法の基本式というのが、

NPV = - i + FCF1/r + FCF2/r**2 + FCF3/r**3 ・・・FCFn/r**n
但し i = 投下資本、 FCFn = n期のFCF、 r = 割引率、とする。
r**n というのが、rのn乗と理解してください。

こういった式をC言語で記述する場合、
i[n] = n期のFCF、time = 算出期間n、out = 投下資本

for( i = 1 ; i <= time ; i++){

  pv = in[i];

  for( j = 1 ; j <= i ; j++){
    pv = pv / r;
  }

npv += pv;

}

npv = npv - out;

といった式を作ったのですが、こういう記述以外での
記述方法は有りますか?
このままでもきちんと動くのですが、他の記述方法も
知りたいなと思いまして。

識者のかたよろしくお願いします。
643デフォルトの名無しさん:04/03/30 15:29
識者まだー?
>>642
識者ではないが、普通ならこんな感じでいいんじゃないの?
(何のテストもしてないけど)

double NPV(double out, double in[], int time, double r)
{
double u;

out = -out;
for(u = r ; time -- ; u *= r)
out += *in ++ / u;
return out;
}
>>642
べき乗なら、
#include <math.h> しておいて、
pv = pv / pow(r,i);
とすれば j をつかった for 文は不要。
fgetsで読み込んだものって'\0'付加されないが
それに大してstrlenやstrstrをつかうのって問題ないのかな
よくそういうコードみるけど
>>646
え。されますよ。以下は規格じゃないけど、一応ISO/IEC 9899:1990に準拠してると
謳ってるFreeBSDのfgets(3)から抜粋。

The fgets() function reads at most one less than the number of characters
specified by size from the given stream and stores them in the string
str. Reading stops when a newline character is found, at end-of-file or
error. The newline, if any, is retained. If any characters are read and
there is no error, a `\0' character is appended to end the string.

エラーが起きたときは'\0'がつかないみたいね…。
エラーじゃないときは'\0'がつきます。
fgets()はヌル終端がつく。fread()はヌル終端がつかない。
どこかで記憶違いしたのでしょう。
そうだったのか、ずっと勘違いしてますた・・・(恥)
650デフォルトの名無しさん:04/03/30 16:38
教えてください。
ある文字列と文字列の大小比較をしたいのですが
どうすればいいでしょうか?

char hoge[32];
char hage[32];

strcpy(hoge, "123");
strcpy(hage, "789");

if (hoge < hage) {
printf("Good!");
}

という感じです。よろしくお願いします。






652デフォルトの名無しさん:04/03/30 16:45
strcmpで比較。
>>652
それだ!
>>650
やりたいのは"文字"じゃなくて"数字"の比較じゃないのか?
655642:04/03/30 17:19
>>644,645

ありがとうございます。

644さんのfor文がどういう意味になるのか分かりづらいのですが
チョット試してみます。

645さん、そうやって使える関数が有るのですね。
そうやるほうがシンプルになりそうなのでそうしてみます。

どもどもです。
void main(viod)
って書き方良くないの?
>>656
#define viod void
658貧乏紙:04/03/30 20:41
殿!
voidは予約キーワードに指定されているためエラーが出ますぞ。
>>658
エラー出ないよ。

っていうか、
#define for if(0);else for
とかも出来るし。
660657:04/03/30 21:04
>>658
ハァ?
661デフォルトの名無しさん:04/03/30 21:05
>>658
プリプロセッサには関係ないし。
つーか関係あってもシンボルになるのはviodの方だから問題ないだろ。
>>656
それをCスレで書くと面白いことが起きるよって
どこかに案内でもあるのか?w

それともバカの一つ覚えなのかw
663貧乏紙:04/03/30 21:17
しらななっか・・・
664デフォルトの名無しさん:04/03/30 21:38
scanfって使っては(ry
665656:04/03/30 21:39
viod…_| ̄|〇
で、結局void main(void)って良くないの?
どっかのスレでダメみたいなこと言ってたもんで…
666デフォルトの名無しさん:04/03/30 21:40
>>665
動けばいいんじゃない?
ですよね〜!
ではvoid main(void)を愛用していきます。
釣られないぞ
愛用は止めとけ。
カニハンリッチはmain()
これに習うのがまっとうな人間。
670デフォルトの名無しさん:04/03/30 22:14
public static void main(String args[])
>>670
#define public
#define String char*
672我ながら厨房くさ〜:04/03/30 22:45
#include <stdio.h>

int g_int = 1234;

int *bar(void)
{
  return &g_int;
}

int ((*foo(void))(void))
{
  return (void*)bar;  /* ←気持ち悪い */
}

int main()
{
  int (*(*(*hoge)(void))(void)) = foo;
  int (*(*geho)(void)) = hoge();

  return printf("%d\n" *(,geho()));
}

上のプログラムを関数ポインタの勉強がてら作ってみたのですが、
コメント部のキャストを行わないと、
「式は引数リストのない関数に対して評価します」
という warning が出ます。でも void* にキャストするのも気持ち悪い。
かといって関数ポインタ型へのキャストは不正とされます。
なにか他の(キャスト?)方法はあるのでしょうか?
それともなんか変なことやってんのかな?
673デフォルトの名無しさん:04/03/30 23:07
>>672
bar を (*foo) に置き換えた宣言を作ってみれ
>>672
#include <stdio.h>

int g_int = 1234;

int *bar(void)
{
  return &g_int;
}

int *((*foo(void))(void))
{
  return bar;
}

int _tmain(int argc, _TCHAR* argv[])
{
  int(*(*(*hoge)(void))(void)) = foo;
  int(*(*geho)(void))      = hoge();

  return printf("%d\n", *geho());
}

fooがint *(*)(void)を返していないことが原因
ちなみに関数ポインタはvoid *にキャストできない
急いで書いたからミスが多いな訂正する

#include <stdio.h>

int g_int = 1234;

int *bar(void)
{
  return &g_int;
}

int *(*foo(void))(void)
{
  return bar;
}

int main(void)
{
  int *(*(*hoge)(void))(void) = foo;
  int *(*geho)(void)      = hoge();

  return printf("%d\n", *geho());
}

fooがint *(*)(void)を返すと定義されていないことが原因
ちなみに関数ポインタはvoid *にキャストすることは出来るが
元に戻るとは限らない
(sizeof(void *)とsizeof(void (*)(void))を要比較、大体の処理系では異なる)
>667
ANSI C では void main(...) は許容されないから、
プロならやめといたほうがいいでしょう。
ホビープログラミングの場合はお好きなように。
677デフォルトの名無しさん:04/03/31 00:06
>>676
プロなら納期までに動けば認めてもらえるんです

趣味ならプライド持ってこだわらなきゃ
えーとmain()の戻り値の話だよね?
679デフォルトの名無しさん:04/03/31 00:14
>>677
氏ね
680672:04/03/31 00:45
訂正
× int ((*foo(void))(void))
○ int (*(*foo(void))(void))

でした、すみません。
>>675
ちなみに上の書き方はなんかおかしいですね。
確かに、 int *(*foo(void))(void) のほうが正しそうです
(厳密にはどうなのか分からないところが悲しい・・・調べます。
・・・でも自分のは間違ってないか?動いてたけど)。
しかし 675 のをコンパイルしても、同じエラーが出ます。

「式は引数リストのない関数に対して評価します」って warning は
「関数実行しようとしてんのに、引数がねぇんだよ!!」
ってことだと思うので、(とかいいながら実行すると関数のアドレスを返してくれるから謎)
「ちがうよ、関数のアドレスを返してるだけなんだよ」
っていうキャストが必要なんじゃないかと思うのですが、
考えてみると、foo 関数の宣言から明確にそのことが分かるから・・・
つまり自分の認識が間違ってる?それともコ(ry

>>673
多重定義になるのでは?というか多分良く分かってません。どういうことでしょう?

void* にキャストするのは非常に嫌なのですが、
ぐぐったらそれっぽい記述があったのでしてみました
(スレ違いですが、VC6に関してはOKなのかな)。
個人的にはこっちのほうが warning じゃない?と思ってしまいます。
とりあえず頭の中を整理する意味で
typedef int* (*FUNC)(void);
とか書いてみるのは如何?
682675:04/03/31 01:01
683672:04/03/31 01:11
#include <stdio.h>

typedef int *(*pFunc)(void);
intg_Int= 1234;

int *bar(void)
{
return &g_Int;
}

pFunc foo(void)
{
return (pFunc)bar;
}

int main(void)
{
pFunc(*hoge)(void)= foo;
pFuncgeho= hoge();

return printf("%d\n",*(geho()));
}

で出来ました。(インデントは許して)
関数ポインタ型にキャストすればよかったんですか。
ちなみに 672 の「関数ポインタ型」→「(関数ポインタを返す)関数の型」ですた。
いろいろ知識不足でご迷惑をおかけしました。
これで寝れそうです。
684675:04/03/31 01:15
>>680
VC7.1でコンパイルとおったよ。コンパイルのバグの可能性も疑うべし。
もしくはプリプロセッサが悪さをしているか…

察しのとおり関数ポインタのvoid*キャストはVCの拡張機能、
warningを出したいのなら言語拡張機能をOFFにするとよい

関数呼び出しをする演算子は()であって、関数名自体は関数を示す関数ポインタだよ
ちょうど配列のarrと[]演算子のarr[0]の関係かな?

関数宣言の外側の括弧はあっても無くてもいいよ、両方とも合法(BNF参照のこと)
やとうとおもえば((printf))("Hello");みたいなことも出来るしね

ちなみに動いてたから間違ってないはずと言うのは危険だよん
685デフォルトの名無しさん:04/03/31 01:17
グローバル変数のアドレスを返して何がしたいんだろう。
おまいにはオブジェクト指向を勉強することをお勧めする

キーワード「隠蔽」
687デフォルトの名無しさん:04/03/31 01:21
>>686
staticもつけないでか?
隠蔽なら値を返す関数を作ると思うけどな。
672は静的変数を知らないと予想。
>>687
そのうちつくだろ

>>688
そのうち構造体になるんだろ

第一テストコードに文句言うな
>>688
値返しだと読み込み専用になっちまう
Set関数を作れってことになると思うんだけど
operator関数みたいなことがしたくて仕方が無いから妥協
さらにはそのうち配列になる可能性があったりして
そんな妥協の産物といってみるテスト

さすがにstaticがついていない理由は思いつかなかった
staticがついていない理由

車内に代々伝わる呪いのコード
そのコードのメンテナンスをした者は必ず三日以内にバグまみれで発狂して死ぬ
いつしか「あのコードは決していじってはいけない」そんな決まりが生まれる
しかしあなたは上司からそのコードのメンテナンスを命じられた!
グローバル変数地獄のコードを直接いじらず外部に修正を加えるためには…
そう!グローバル変数のアドレスを関数の戻り値で公開するしかない!
これぞ差分プログラミング!

to be continued...
>683
何のためにやっているのか、はさておいて、
pFunc foo(void)
{
return (pFunc)bar;
}
この無駄なキャストはやめろ。激しく危険だ。
694デフォルトの名無しさん:04/03/31 03:04
プログラムやったことがない初心者が、簡単なゲームとかを作りながらCを学んでいけるように作られているサイトってありますか?
695デフォルトの名無しさん:04/03/31 03:05
ゲームとC
苦しい将来につながる呪いのキーワード
有名どころでは「猫でもわかる」ところかな。
>>695
じゃあ、アプリを作りながら学べるところ。
>>696
いいサイトですね。ありがとうございます。
>>697
アプリやゲームを作らずに学ぶ方法は漏れには思いつきません
699 :04/03/31 16:15
−−−−−−−−−−−−−−−−−−−−−−−−−−
俺様用しおり
  ∧_∧   
 ( ´∀`)< 今日はここまで読んだ      
−−−−−−−−−−−−−−−−−−−−−−−−−−
どうも、今日も質問を持ってまいりました
check関数にすでに宣言された配列のデータを渡したかったので、

void main(){
   .............................
   check(numbers[]);
}

check(int numberscheck[]){
  ....................
}

このように書きました
こうすれば、numbers[0],[1],[2]・・・を全部numberscheckに渡せると思ったからです

しかし、 error C2059: 構文エラー : ']' と言われてしまいました
いかがいたしましょう
渡し方が悪い
check(numbers);
704700:04/04/02 00:04
>>701
ポインタ・・・
後ほどじっくりゆっくり見てみます。今はもうちょっと基本的なことをやるべきレベルだと思うので
ありがとうございました

>>702
すいません、できれば良い渡し方を教えていただきたかったです

>>703
「'check' : 関数が不正な 1 個の実引数をともなって呼び出されました。」と、出ます
705デフォルトの名無しさん:04/04/02 00:08
>>704
じゃあそのnumbersの型に問題があるんだろ。
配列かポインタなんだろうな?
706700:04/04/02 00:12
>>705
質問の答えになるか不安ではありますが、main関数の最初で、
int numbers[4];
こう宣言しています
707デフォルトの名無しさん:04/04/02 00:16
>>706
それなら>>703で良いのだが。

プロトタイプ宣言が間違っているなら実際の定義と食い違ってエラーになるし、
宣言がないならそもそも型チェックでエラーになることはないし。
708700:04/04/02 00:23
おぉう
プロトタイプ宣言を消して、check関数をmainより上にもってきたら、>>703ですんなり通りました
その問題のプロトタイプ宣言ですが、
void check():
だけでした

もうひとつ恥ずかしいことですが、配列を渡す時のプロトタイプ宣言はどのようにすればよいのでしょうか?
一行目をコピーして末尾に ; をつけろ

それと、おまえ、C++でやってるだろ?
710デフォルトの名無しさん:04/04/02 00:27
ついでにいうとcheck(int numberscheck[])だと戻り値はvoidじゃなくてintだぞ
>>700

int check(int numberscheck[]);

int main()
{
check(numbers);
return EXIT_SUCCESS;
}

int check(int numberscheck[])
{
return 0;
}
たぶんVC++つかってて拡張子が.cppなのかな。
そうすると勝手にC++として処理されるらしい。
だからCとして扱ってほしければ拡張子を.cに汁。
713700:04/04/02 00:36
>>709
すいません、ソースにはきちんと void check(); と書いてました。素直にコピペしたらよかった
そして、またも質問の答えになるかわからないけど、VC++使ってます
ついでにまたまた恥ずかしい話ですが、CとC++の違いがわかりません。ごめんなさい

>>710
戻り値はいらないのでvoidかなとか思ってました
そういうものなんですね

>>711
おお。なるほど
そのプロトタイプ宣言の書き方と、>>710のとおり戻り値を書き換えると、すべてが思い通りにいきました
本当にありがとうございました

>>712
よくわかりませんが、その通りです
そしてよくわかりませんが、またよくわからなくなったら.cにしてみます
ありがとうございます
>>713
>戻り値はいらないのでvoidかなとか思ってました
おいおい。戻り値いらないんだったら
void check(int numberscheck[]);

void check(int numberscheck[])
{
...
}

だろ。
715700:04/04/02 00:44
>>714
なるほどう。その通りです
試しに両方のintをvoidに書き換えてみたら、
  関数は 'void' 型として宣言されていますが、値を返しました。
と言われました。すごい丁寧ですね。嬉しくなってきます

そして今日は return 0; でも値を返していると学びました
知りませんでした。何もかもが新鮮です
ちなみに0消して return; にするとコンパイルできました・・・なんて報告はいりませんか
716デフォルトの名無しさん:04/04/02 00:46
初めて書いたものが動いたときのことを思い出すな。
hello world?
718デフォルトの名無しさん:04/04/02 02:02
というか、初めてのCプログラミングをVC++環境でするという
ことが信じられないのだが、今の世の中これが普通なのか?
C以前に学ぶべきことが多くて混乱するだけの気が・・・
初めてプログラミングをする人は、コマンドラインを知らないというご時世だからな・・。
720700:04/04/02 02:31
できたー!・・・といっていいのかな・・・ソースがどうもごちゃごちゃしすぎて・・・
それでもきちんと動作するようになりました。4桁の数当てゲームです
ランダムの数字を選ぶのと、今回の関数のことは人様の力を借りましたが、
1人でできたというのはやはり嬉しいものです。本当にありがとうございました!

>>718
その環境は、“弟の特権”と言うヤツかもしれません
意味のわからない単語は多いですが、とりあえず後でいいやと目をつぶってます
「コマンドライン」も意味はわかりません。きっとそれじゃダメなんでしょうね。でも今は許してください
わーおあまさがぜんぜんちがーう
722721:04/04/02 03:00
すまねぇ、HSPに書くつもりが誤爆った(T_T)
>>722
ドンマイ
やっぱGUIじゃないと、人に「すごー」と言ってもらえないからねー。<初めてでVC
皆さんCを勉強してどれくらいでGIUに手を伸ばしましたか?
>>725
GIUって何だよ。
>>726
すまん。察して
彼は私の股間に手を伸ばし、GIUっと握った。
「ぼ、ぼく、まだCの勉強はじめたばかりなんです。GIUっなんて出来ません」
さらに彼は手を動かしながら、不安に怯える私に「やらないか」と言った。
729デフォルトの名無しさん:04/04/02 23:51
>>728
親衛隊か? こいつ(藁
「ほら、もうこんなに」
「いや、GIUしないで」
GraphicalInterfaceUnit?

冗談さておき、自前でグラフィック画面にボタンを描画するような処理なら
結構すぐに始めたが。
#つーか、その頃手軽なGUIライブラリなんてなくってね。
>>731
そしてオブジェクト指向を覚えた後には
泥沼設計地獄が待っている

いや、楽しいんだけどさ
733デフォルトの名無しさん:04/04/03 00:55
池沼設計の間違い? と言ってみる。
734デフォルトの名無しさん:04/04/03 09:54
『プログラム板の方々への挑戦状』
これで一位とってくれー!なかなかとれん。。。もうだめぽ。
フローチャートの高速化のコツがわからん。
ttp://game5.2ch.net/test/read.cgi/game/1080879039/48-
735デフォルトの名無しさん:04/04/03 12:33
質問です。

数値データをテキスト(CSV)から読みこんで処理するということを良くやるのですが、
データが大きいのでバイナリ化(?)でもして高速に処理したいんですが、
どうやったら良いのでしょうか?
CSVのファイルをソースにコピペして、どうにかしようかとも考えたんだけど、
もっと賢い方法があるような気がする。
教えて下さい。
>>735
生のデータを見ずに圧縮方法を考え出せる奴などこの世にはいない。
>>735
CSVを読み込んだら構造体の配列にでも入れるのだろうから、
そいつをバイナリイメージのままファイルに出力、
以降はそのファイルを読めばCSVを読むより多少は速いかも知らん。

だが、ファイルサイズとデータにもよるが、高速化すべきポイントが
そこかどうかはなんともいえないのが実情だがな。
>>735
とりあえず言えることは
テキストの数値データをバイナリデータに変換(文字列型を整数型に変換)
という処理がボトルネックになっているのならばすさまじいパフォーマンスアップが望める
しかし、テキストのデータのほとんどが文字列だった場合、それをバイナリにしたところで
それはテキストデータなのだから意味が無い、むしろ構造体を直接書き出すとかやった場合は
固定長文字列の場合はファイルサイズが大きくなり、可変長文字列だった場合は
処理に時間がかかるようになる

さあ、どっち?
ファイル分割ソフトをゴホッゴホッ
医者んとこ行って頭が悪いんで直してくれと頼んで来い。
「数値データ」と言ってるから、確実に高速コンパクトになるのでは?
ソースにコピペする覚悟があるようだから、バイナリファイルに書き出して、
(配列で有る必要は無い。int等の数値をsizeof(int)だけ順次書き込めば桶。ただ、charとかshortとか
を併用するなら構造体が便利)カスタムリソースとしてリンクすればよろし。
Win32なら、必要なAPIはLoadResource()、FindResource()
>>735
お歴々の言う通り、数値をバイナリ化しちまえば速くなると思う。
が、その数値ってのはCSVで管理してるくらいだから頻繁に書き換えるんじゃないのか?
そうなると今度は人の手で書き換える時が面倒になってしまうが。
なるほど。
スタティックリンクは諦めて、CSV<->バイナリの
変換フィルタを作るのが得策かね。
>>741
Win32以外で環境依存せずにカスタムリソースとしてリンクする手法があるなら教えてくれ。
リソースと聞いてひらめいた。

バイナリデータを24bitRGBの画像としてDIBで扱えば、フォーマットを忘れる事も無いし
グラフィックエディタで編集出来るぞ。
数値の全体観がヴィジュアルに把握出来るから何か良い事があるかもしれん。
ランレングス圧縮は標準だが、PNGで圧縮と洒落込むのも一興。
アングラの香りがするのも単調な日常業務にあってはスパイスだ。

ただし、16bitRGBはお勧めしない。
>>745
実際、8ビットや16ビットのデータをグレイ画像に落とす応用は結構ある。
問題はだ、16ビットグレイを扱えるツールが少ないことだな。
sizeof()の使い方を教えてください。
初心者向けCの本にはちっとも書いてないし、
関数でもないから(?)コンパイラの説明書にも
書いてないっす。
749747:04/04/03 18:57
サンキュー
MSDNって何ですか?
なんか解説サイト見たら
MSDNライブラリを参照してください
と説明されていたのですが
>>750
http://www.microsoft.com/japan/msdn/library/
これくらいはぐぐれ。
752735:04/04/03 23:39
みなさま、いろいろレスありがとうございます。
データは完全な数値データなので、高速化できるということですね。

>スタティックリンクは諦めて、CSV<->バイナリの
>変換フィルタを作るのが得策かね。

CSV->バイナリ、この作業がよくわからんのですが、、、
バイナリ化したデータ、これはobjファイルですよね?
で使うときはこれをリンクして使うわけですよね。

で、変換フィルターってのはどうやって作るんでしょうか?
とにかく、テキストデータを読み込んで、どうにかコンパイルして、
objファイルを生成するのかと思ってましたが、どんなもんなんでしょうか?

ちなみに環境はlinux gccです。
753貧乏紙:04/04/04 00:10
データの形式には2種類あります。
テキストデータとバイナリデータです。
テキストデータはASCIIテキストを扱いOSによる文字変換の差を吸収します。

Windowsシステムでは改行と復帰を2文字(CR,LF)であらわしますが、Cでは\nの1文字ですので1文字に変換します。

バイナリデータとはどんなデータでも扱えます。バイナリデータはファイルのデータ
と文字が1:1で対応します。
>>735さんに質問ですが
本当にテキストデータでファイルがかかれてますか?
普通にfopen,fwrite,freadを使っていればバイナリデータで処理されるはずですが。。。
754デフォルトの名無しさん:04/04/04 00:11
658 :貧乏紙 :04/03/30 20:41
殿!
voidは予約キーワードに指定されているためエラーが出ますぞ。
755貧乏紙:04/04/04 00:12
16bitRGBって1bit余りでない?パリティーかなんか?
3色しかないから3の倍数だと思うんだけど。。。
756貧乏紙:04/04/04 00:13
yakamashiii!!
>735
ソースリスト中で、配列の初期化にCSVテキストそのものをコピペすれば、
実行ファイル中ではデータはバイナリになっとる。
dat[4]={1,2,3,4};みたいなかんじ。
ただ、これではデータを変更する度にビルドする事になるし、
メモリが一括で確保出来る保証が無い。
>>743で言ってるのは、データはデータファイルのまま残すが、
CSVからバイナリファイルに変換して使用するという意味だと思われ

>753
CSVはテキストだけだと思ってたが、バイナリもあるのか?

>755
16bitRGBのRGBは、{0x1f, 0x3e0, 0x7c00}または{0x1f, 0x7e0, 0xf800}
のビットフィールドだね。
前者ではgの解像度だけが2倍で、後者では1bit余る。
もっと自由にビットを割振れる処理系もある。
758735:04/04/04 00:41
>本当にテキストデータでファイルがかかれてますか?
はい。テキストです。
>普通にfopen,fwrite,freadを使っていればバイナリデータで処理されるはずですが。。。

読み込みは ifstream でやってます。

>データの形式には2種類あります。
>テキストデータとバイナリデータです。

その辺のことを良く知らないのです。
今、調べてたら、ifstream にもバイナリモードというのがあって、
これを使ったら良いのかなと考えてたところです。
少し勉強してみます。
>753
>普通にfopen,fwrite,freadを使っていればバイナリデータで処理されるはずですが。。。
誤解を招く表現だな。
普通にfwrite,freadを使ってれいれば、第一オペランドの場所にデータが有り、
そこを数値型でアクセスすれば数値になるし、文字型でアクセスすれば文字型になる。
というより、数値型と文字型の区別自体、文字列を扱う関数以外では意味が無いのでは?
760デフォルトの名無しさん:04/04/04 01:17
おい、C++じゃないか
761デフォルトの名無しさん:04/04/04 01:23
ライブラリ関数の_beginthread _endthread とか使ったときに
セマフォとかミューテックス使いたいんだけどどうすればいい?
そういうのを書いてる本は手元に置いとけ。
同期関係はこの本が良かった。
ttp://www.amazon.co.jp/exec/obidos/ASIN/4774108022/250-1842761-3041806
>>761
_beginthread()ってことはWinだよな。CreateThread()とかと一緒。
戻り値がスレッドのハンドルになってるので必要ならAPIに渡してやればOK。
>>735
C/C++室 Ver.5スレに行け。ここはCのスレだ。
その上で、もっと具体的にやりたいことを書け。

>>761
環境依存なら該当スレに行け。例えばWin32APIなら専用スレがある。
>数値データをテキスト(CSV)から読みこんで処理するということを良くやるのですが、
>データが大きいのでバイナリ化(?)でもして高速に処理したいんですが、

扱うデータが大量なのでファイル読み込み処理に時間がかかる
のであれば、RAMディスクを使う手もあるが。
>752

>バイナリ化したデータ、これはobjファイルですよね?
>で使うときはこれをリンクして使うわけですよね。

...だめだこりゃ
(逝ってみよう)

objファイルってtgifのファイルですよね?
tajiriをスイクトすればいいんじゃないか
処理が遅く感じるほどの大きなCSVを丸ごとメモリに読み込むのはお勧めしないよ。
バイナリ化もいいが、>>738も触れてたようにランダムアクセスを念頭に置くべきだよ。
固定長
キー
インデックス
昇順
772デフォルトの名無しさん:04/04/04 08:03
地震キター!
地震オワッター!
地震age!!
>>753
>データの形式には2種類あります
>テキストデータとバイナリデータです
はっきり言うが、二種類など無い
テキストデータはバイナリデータの一種だ
存在するのは「テキストモード」と「バイナリモード」だ

初心者向けのWindows解説本ならまあただしい表記だが、
プログラマ向けの解説でのこの表現はただ誤解を産むだけ
>>775でめでたく>>759に戻ったわけだが、
このループからはどうやって抜けるのだ?
というか、>775は自分が頓珍漢であることに気付いてないんだろうなぁ。
>770
例えばだ、ある項目のトータルを計算したい場合などは
ランダムアクセスなぞ無意味
ちなみにファイルの読み書きでバイナリとテキストの区別をするのは
MSのローカルルールなわけだが
CP/M由来だから、MSのみというわけではないだろ。
現状はMSのOS以外では使われていない仕様だとしても。
つーか、TTY由来だよね。
770だが、

>>778
>ある項目のトータルを計算したい場合などは
>ランダムアクセスなぞ無意味

ランダムアクセスを想定したファイルの読み書きで
シーケンシャルなアクセスが遅いとは限らないと思う。
シーケンシャルに読みたい場合は、いちいちポインタを動かさず
適当な大きさの構造体なり配列に読み込めば、デリミタのない分
むしろ高速ではないか?
(続き)
固定長によるデータサイズの無駄を指してるなら、異存は無いです。
99%のデータが0..255だが最大値は100億、なんて場合は可変長だろうね。
>>782
だからあんたも頓珍漢だ。
正しいことを言うだけが能ではあるまい。

#まぁ、質問者が出てこないことにはこの調子で続くんだろうな。
785700:04/04/04 13:26
質問に答えるだけではつまらないじゃないか。
>782
>シーケンシャルなアクセスが遅いとは限らないと思う

だからそーゆーことじゃねーよ
ランダムアクセスしなくてすむなら、無意味だっつーの
>>785
あなたはレス番号を間違えている
>783
ランダムアクセス&固定長って、
あぁそうか n番目を 先頭+(n-1)*サイズ でアクセスするのか

もまえは既に死んでいるぞ(w
7892ch初心者:04/04/04 14:09
 ものすごく基本的な事かもしれないのですが
わからないので質問させてください。

FILE *fp;
char c,str[50];
int i;

if((fp = fopen("test.txt","r+"))==NULL){
  printf("error");
  exit(0);
}
while((c = fgetc(fp))!=EOF){
  str[i]=c;
  i++;
}
str[i]='\0';

rewind(fp);
fprintf(fp,"test");

fclose(fp);

こんな感じの事をしたいのですが、"test.txt"が"test"という文字列より
大きい場合(この場合は4バイト)"test"の後ろに元のデータが残ってしま
います。

ファイルを読み込み、書き込みモードで2回開けばすむ事ですが、出来たら
一回で済ませてしまいたいのです。

 ファイルをクリアする関数とかあれば教えてください。
どのみちオープンを一回で済ませる意味がないがな。
たぶん望む動作は実現できない。
ってゆーか、rewind() するくらいなら freopen() 使え
7922ch初心者:04/04/04 14:33
そうですか
freopen()の存在自体しりませんでした(汗

freopen()で十分便利そうなので使いたいと思います。
ありがとうございました。
>>792
ファイルを切り詰める機種依存しない関数はない。
単純に削除するにはremove()。
空のファイルを作るにはfopen()で第二パラメータに"w"か"w+"。

>>791
どっからそんな発想が出てくるんだ?
794791:04/04/04 14:51
>>793 何か?
>>794 まぁまぁ

俺様が推理するに
>791が r で読んで w でリオープン って意図を
>793 がアフォなので「はぁ?何逝ってんの」
って事だな
>>795 (w
俺様の超好意的な解釈によると
「>791は神!」って事では?
>>793-796
つまり
>どっからそんな発想が出てくるんだ?
(解釈1)はぁ?お前何一点の?(侮蔑)
(解釈2)私みたいな低脳には思いつきませんでした。(感嘆)
ということかな。
798793:04/04/04 15:16
すまん、言い方が悪かった。

>>791
どっから「rewind()するくらいなら」なんて発想が出てくるんだ?
「fclose()してfopen()するくらいなら」なら判るんだがな。
いづれにしろ>793は低脳
800800:04/04/04 15:28
>>799
ずとづの区別がついてから言おうな。
ひっしだな
いずれ(いづ‥)【何れ・孰れ】
||||||||||||||||||||
|||||||||||||||||||||||||||
||||@||||||||||@|||
|||||||||||||||||||||||
|||||||||▽||||||||||| >>ぬるぽ!
|||||||||||||||||||||
|||||||||
>802 九かな使いは認めません(w
ふぇらしてよ
ひっしだな
Cコンパイラは何をつかえばいいでしょうか?
自分の持ってる本にはVisual C++、もう一冊にはVisual C++は
上級者向けと書いてあるんです。初心者でも使えるコンパイラを教えてください。
コンパイルするだけなら何使っても川欄だろ
むしろ統合環境なVC++は難しいかも
class ex {
public static void main(String args[]) {
ex app = null;
app.hoge();
}
void hoge() {
}
}
それはCでないと小一時間(ry
>>807
とりあえずCの勉強始めようか、ってんならフリーのコンパイラダウンロードしてやって見れ。
わかりました。Borland C++ あたりを使ってみます
813デフォルトの名無しさん:04/04/04 17:32
>>812
カエレ!
いや
まずはこちらをご覧下さい
http://www.uploda.net/anonymous/etc2/upload22465.c

二次元配列と言うものの勉強のため、1,3,5,2を押すと上下左右に、
冒頭で設定したwsizex × xsizeyの長方形の範囲内で動くプログラムを作ってみました
一見普通に動くのですが、偶然発見したことで、wsizexがwsizeyより2以上大きくなると異変が生じるのです
2時間くらい粘りましたが、このバグのもとが全然わからなかったわけです

めんどくさければ「どこがおかしいか」まで見つけてもらわなくても結構ですから、
「なぜバグるのかわからないときは、こうしている」という経験談を教えてください
char map[wsizex][wsizey]
で定義しつつ、使うときは
map[mapy][mapx]
なのはなぜだ?
817815:04/04/04 17:44
>>816
ゴージャス!
すごい!早いですね。よく見つけてくれました
ありがとうございました。全部直りました
818デフォルトの名無しさん:04/04/04 20:40
アホか
819デフォルトの名無しさん:04/04/04 21:30
PrograM #00sER?YS

かっこいいトリップを見つけたので使ってください。
820デフォルトの名無しさん:04/04/04 21:34
sizeofってなんか使い勝手わるいよな
>>820
おまえ用にできてないってことだ
822デフォルトの名無しさん:04/04/04 21:52
>>821
あらそう??
つかAPIとかつかったりVBでリンクとったり
するときsizeofでいつもド壷にはまる
>>822
やっぱりそうじゃん
sizeof が「何を」返してるのか
根っこが見えてない
それは配列とポインタの違いを理解してないか
ポインタが型をもっていることを理解してないか
どちらかが原因の気がする
825デフォルトの名無しさん:04/04/04 22:01
>>823
ではあなたのオツムで伝授してください。
ヨロオネ
>>825
受信側のプロトコルは? レイヤ1から公開しる
827デフォルトの名無しさん:04/04/04 22:09
>>826
TCPアンスコIP
>>827
なるほど、おまいの脳にはつながってないわけか
自爆自演?
830デフォルトの名無しさん:04/04/04 22:13
>>827
TCP_IP?
エーテルネット
832デフォルトの名無しさん:04/04/04 22:44
正直おまいら相手してっと楽しい
これマジスレ
正直おまいら相手してっと勃起する
これマジレス
うっほ!
835デフォルトの名無しさん:04/04/05 19:03
ファイルにCOBOLのパック型で書かれた数値を
を符号をつけてCHARのファイルに出力したい
(パック型とはバイナリ下位一ビットで符号を表しており
(Cは+ Dは-)で 100C なら 100 010D なら -10
符号をつけてCHARでファイルに出力したいです。

元ファイルがバイナリで 100C010D という形であれば
100-10 とテキストエディタで開いて見えるようにしたいです。

ソースを作ってみたのですが我ながらもう少し良い方法はないかと思っております
ご意見をいただけないでしょうか?
わかりにくい文章で申し訳ないのですが。宜しくお願いします
836835:04/04/05 19:08
835続き ソース
typedef struct { unsigned char read_str[2];} INPUT_DATA ;
typedef struct { unsigned char out_str[4]; } OUTPUT_DATA ;
int main(argc,argv){
FILE *read_fp; FILE *write_fp; INPUT_DATA input_data; INPUT_DATA *p_input_data;
OUTPUT_DATA output_data;
  int i_count; long data1 ; char buf{sizeof("0000")};
p_input_data=&input_data;
fread(p_input_data,sizeof(input_data),1,read_fp);
for ( i_count=0 ; i_count < 3 ; i_count++){
if( 0x0f & p_input_data->read_str[i_count] == 0x0c ) {
data1 = ( 10 * str[0] + 0.1 * str[4] - 0x0c ) ;
} else if ( 0x0f & p_input_data->read_str[i_count] == 0x0d ) {
data1 = (-1) * ( 10 * str[0] + 0.1 * str[4] - 0x0d ) ;
} }
if ( 0< data1 && data1 < 10 ) {
sprintf( buf , "%i" , 0 ) ;
sprintf( buf + 1 , "%i" , 0 ) ;
sprintf( buf + 2 , "%i" , 0 ) ;
sprintf( buf + 3 , "%i" , data1 ) ;
}
else if ( -10< data1 && data1 < 0 ) {
sprintf( buf , "%i" , - ) ;
sprintf( buf + 1 , "%i" , 0 ) ;
sprintf( buf + 2 , "%i" , 0 ) ;
sprintf( buf + 3 , "%i" , data1 ) ;
} else if ( 10 <= data1 && data1 < 100 ) { ・・・ }
else if ( ・・・ それぞれの場合を出力 }
memcpy(output_data.out_str, buf, sizeof(buf));
fwrite(&output_data,sizeof(OUTPUT_DATA),1,write_fp);
; }
見づらくてもうしわけないです宜しくお願いします
837835:04/04/05 19:13
なんどもすみません

10 * str[0] + 0.1 * str[4] - 0x0c
の str[4] は str[1]の間違いです。

838デフォルトの名無しさん:04/04/05 19:15
> (パック型とはバイナリ下位一ビットで符号を表しており
情報処理試験を思い出した。
839838:04/04/05 19:20
836を斜め読みしただけで判断するけど、
> 元ファイルがバイナリで 100C010D という形であれば
これはint型の変数をそのまま書き出したものということ?
840838:04/04/05 19:22
でもそれじゃパック型は関係ないし、「ファイルにCOBOLのパック型で書かれた数値を」に反するし。
841838:04/04/05 19:25
悪いw
sizeof(input_data)をなぜかsizeof(int)と読み間違えていたw
>>836
数値の入り方のルールがよくわからないんだけど、
少なくともdata1の計算がおかしい。
data1からbufに変換するところは無駄だらけ、
memcpy()も不要。
bufに変換するところは、

sprintf(buf, "%04d", data1);

でいいんでない?
>>836
ちょっと調べてみた。
パック型は、一桁4ビットなので1バイトで二桁ってことになる。
なので、変換関数はこんな感じ。
/* const char * pc はデータの先頭、4bitがa-fなら終端とする */
int pack2bin(const unsigned char * pc)
{
  int data = 0;
  while (*pc >= 0x0a) {
    data = data * 100 + (*pc >> 4) * 10 + (*pc & 0xf);
  }
  if (*pc == 0x0d) {
    data = -data;
  }
  return data;
}
845fd:04/04/05 22:12
無料のC言語のプログラミングソフトないですか?
borland C++ compiler
プログラミングソフトってなんですか?
エディタのことかもしれない。
>>845
C言語のプログラムに最低限必要なのは、コンパイラとエディタ
コンパイラとは、人間がわかりやすく書いたプログラムを、コンピューターが理解できるように翻訳する通訳さんみたいなもので、
エディタとは、人間が書くためのもの。これは最低メモ帳でもできる

両方の機能を兼ね揃えたソフトはあるけど、無料でやりたいのならとりあえず個別に揃えよう
コンパイラは>>846がお勧めだよ
850デフォルトの名無しさん:04/04/05 23:41
1.プログラムやったこと無い人が、毎日1〜2時間、本と猫でもわかるを参考にしながら勉強した場合、
どのくらいでバイトで使えるレベルのプログラマになれますか?

2.プログラミングのために、ノートかポケットPC、もしくはPalmのような手軽に起動できるタイプのPCを買おうと思っています。
スペックはどの程度あればいいでしょうか?
プログラマはデジタルガッテン
852デフォルトの名無しさん:04/04/05 23:55
>>850
CやるならNECのパソコンがいいYO!
べつに社員とバイトで期待される技術に差はないと思うぞ。
むしろ教育しにくいバイトの方が、最初から高い能力を求められるかも。
854デフォルトの名無しさん:04/04/06 00:03
東大生ならプラネットコンピュータでバイトとして採用してくれるよ。
855デフォルトの名無しさん:04/04/06 00:34
>>851-854
バイトというのは一種の目安という意味で出しただけで、バイトになる気は今のところ無いです。(そもそも募集してない)
だいたいどの程度の期間を見ればいいのかと思いまして。

NECのパソコンですか。検討してみます。
機種より、CPUとかメモリのスペックを教えていただきたいのですが・・・
>>855
プログラミングをするだけなら、
メモリやCPUはコンパイラの推奨スペックさえあれば十分だと思う。
むしろ、画面のサイズや解像度の方が重要かと。

>>849
「通訳」というアナロジはインタプリタのために取っておいて欲しかったな、
という突っ込みが心に浮かんだ春の夜。
>>856
けっこう低いスペックでできますね。ノートの中古のほうが安そうですね。
ありがとうございます。

一応書いときます。
C++Builder 5 Enterprise

Pentium/90(推奨Pentium/166以上)のCPU
日本語Windows 98、Windows 95、Windows NT 4.0(SP3以降)、Windows 2000
48MBのメモリ(推奨64MB以上)
200MBのハードディスク(推奨500MB以上)
CD-ROMドライブ
マウスなどのポインティングデバイス

期間については・・・やっぱ人それぞれですかねえ・・・
Unix系のOSをインスコして、Unixのshellやtoolを勉強しながらCもやるといいかもよ。
windowsでもいいけど、言語だけじゃなく処理系とはどういうことなのか、理解すると応用的な能力がつく。

そもそもそのスペックだとwindowsは厳しかろ。いまどきwindwos95 や98はお勧めできないしな・・・。
俺はCPU 230MHz memory 64Mのノートwindows2000でよくプログラミングするが、このスペックだと統合開発環境は厳しいぞ。
>>850
人によって相当答えが変わると思うが、漏れの場合は十年かかった
環境が無かった、周りに出来る香具師がいなかった

ちなみに2chに来るようになってからのレベルアップはすさまじかった
最初はプログラム板で話していることがちんぷんかんぷんだったが、
いまでは理解できるようになった。2chっていいぞ、マジで
2chのいいところは、優良なサイトへのリンクを教えてもらえるところかな。
862デフォルトの名無しさん:04/04/06 09:14
>>850
マジレスすると
1.その程度の心構えでは使えるレベルにならない

2.素直にディスクトップ買え
そして姉はバック転を失敗する
「ディスクトップ」がネタですかな…
>>850
まあ、2chには>>862みたいなのがいると言ういい例で砂
ま、こういう香具師は無視しとき
866デフォルトの名無しさん:04/04/06 10:26
850=865
867デフォルトの名無しさん:04/04/06 10:58
>>850
みたいに毎日少しずつ継続的にって考え方する人はある意味立派だと思うがね。
まあ>>862の言うことも一理あって、プログラムやる人ってのは基本的に
凝り性なんだよ。プラモ作るのに、ずっと完成するまで時間を気にしない
のと一緒。
個人的には、SYCOM辺りのショップブランドで安いの適当に買えばいいと思う。
しかし、学校とかへ持っていったり、空き時間にちょこちょこいじりたい
というのならば、やはり、普通のノートだろうね。
>>856の言うように、それなりの作業をするので、画面は広いのにこした
ことはない。ポケットPCとパームは駄目だと思うな。
ノートはメーカーのもののほうがいいので、中古でなるべく新しい予算に
あったものを買うといいと思う。それなりにいいのあるよ。
868デフォルトの名無しさん:04/04/06 12:07
すいません、今からデカイ本屋行ってきます
何かオススメのC/C++基礎勉強の本がありましたら、教えて下さい
と思ったら別スレあるんでしたね。ごめんなさい本屋行く前に吊ってきます
ファイルの行を読み込む際に改行までのバイト数をあらかじめ
取得する方法はありますか?
871デフォルトの名無しさん:04/04/06 15:49
>>861
2chのいいろころは、漏れがいるということ。
>>870
付加的な情報を別に用意するのでなければ、ない
873835:04/04/06 19:53
皆さん回答ありがとうございます

>>843 さん うまくできました

>>844 さん
そのまま関数に組み込んで利用してみたのですがうまくいきませんでした。
101d という入力ファイルに対して 0 が帰ってきてしまいました。
まだまだ、改良の余地がありますのでいじってみます。
874844:04/04/06 23:58
>>873
すまん、1バイト一桁と勘違いしていた頃の名残で
ループの終端条件がおかしい。
適当に直してくれ。
875貧乏紙:04/04/07 00:26
>>870
こういうの作ってみました。。。

#include <stdio.h>
#include <string.h>

void main(){
FILE *fp;
char *ch;
long int f_size[128];
int i=0,k=0,j=0;

fread(&ch,sizeof(ch),1,fp);
while(sizeof(ch)>i++,k++,ch++){
if(*ch == '\n'){
f_size[j] = k*sizeof(char);
k=0;
j++;
}
}
}
ネタはよそでやってくれ(-_-;)
c++でgotoxy()のような動作をする命令はないですか?
878デフォルトの名無しさん:04/04/07 01:56
>>877
ここはCのスレだぞ。
そのgotoxy()がCの関数ならC++からでも呼び出せるだろ。
>>860
>>865
>>867
結構かかるもんですね。
腰を据えてじっくりがんばっていきます。
凝り性っていうのには気づきませんでした。考えてみればそうですね。

どうもありがとうございました。将来、フリーソフトで恩返ししたいと思います。
ttp://www.kumei.ne.jp/c_lang/intro/no_26.htm
win2kでエスケープ・シーケンスってできますか?
>>880
すれ違い、かつ、日本語がおかしい
882デフォルトの名無しさん:04/04/07 14:57
うまく作動しません。

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

main(){
int coin;
int head;
int tail;
int i;

srand(time(NULL));

printf("コイン投げ\n");

for(i=0;i<3;i++){
coin=rand()%2+1;
if(coin==1){printf("コインは表\n");head++;}
else{printf("コインは裏\n");tail++;}
}
printf("表が%d回・裏が%d回\n",head,tail);

return;
}
int head = 0;
int tail = 0;
return 0;
リスト操作はどういう事に使うんですか
会社に愛想が尽きたとき
>>885
リスト操作をリストの操作以外に使えるなら教えてホスィ。

質問の意味が曖昧だとかいう前にスレ違いクサイが。
888デフォルトの名無しさん:04/04/07 22:18
>>875
つっこみどころ満載
889デフォルトの名無しさん:04/04/08 06:13
うまく作動しません。

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

main(){
int coin;
int head=0;
int tail=0;
int kou[6];
int i;

int n;

srand(time(NULL));

for(n=0;n<6;n++){
for(i=0;i<3;i++){
coin=rand()%2+1;
if(coin==1){head++;}
else{tail++;}
}

kou[n]=(head*2)+(tail*3);
if(kou[n]==6||kou[n]==8){printf("陰コウ== ==\n");}
else{printf("陽コウ=====\n");}
}
return 0;
}
for(n=0;n<6;n++){
head=0; tail=0; //ここ追加
for(i=0;i<3;i++){
>>882==>>889
質問になってない。
892デフォルトの名無しさん:04/04/08 07:58
>>891
質問ではなく独り言なんですが。
893デフォルトの名無しさん:04/04/08 09:06
質問です。次のような構造体と関数があったとします。
typedef struct _POINT {
  int x;
  int y;
} POINT;
void SetPoint(const POINT point);

この関数を呼び出すとき、引数の構造体を即値で記述する方法はないでしょうか。
  SetPoint((const POINT*)(&POINT(4,5)));// ※イメージです、コンパイルは通りません

値をスタック領域にコピーするようなCPUコストが発生しないように、
以下のコードと同様のコンパイル結果が得られるようにしたいと考えています。
(1) static const POINT point = {4,5};
  SetPoint(&point);
(2) SetPoint((const POINT*)"\x04\x00\x00\x00\x05\x00\x00\x00");// ※Win32環境用
894デフォルトの名無しさん:04/04/08 09:10
>>893
定数といえ定数と。
C99に準拠しているコンパイラを使っているのなら可能だが、そうでないなら不可能。
http://seclan.dll.jp/c99d/c99d07.htm#dt19991101
895デフォルトの名無しさん:04/04/08 09:19
>>883>>884>>890
ありがとうございました。
896893:04/04/08 09:50
>>894
複合リテラルという機能ですね。
VisualC++6.0をコンソールで使っていましたが、対応していようです。
コンパイルオプションを変えれば使えるのかもしれませんが・・・

C言語に手をつけて5年ほどになりますが、その場で必要なことしか覚えてきませんでした。
まじめな本で基本的な用語から勉強しなおした方がよさそうです。
ありがとうございました。
まだC99に準拠したコンパイラというのは少数派だからな。
フリーコンパイラとか、みんな準拠していないから、C99の新しい仕様は
コンパイラのヴァージョンを確認したうえで使わないと。
>>893
>値をスタック領域にコピーするようなCPUコストが発生しないように、

定数だとスタックに積まれない、と思っているのか?
>>898
コンパイラの最適化で詰まれなくなる可能性が上がる
ってことじゃない?
「呼ぶ側」のローカル変数領域とそのコピーコストを節約したいってことだろ
901X:04/04/08 17:27
Cで電卓のプログラムを作ってください。
902デフォルトの名無しさん:04/04/08 17:28
ソースコードがたくさんあるサイトってありませんか?
sourceforgeとかは嫌です。
何が嫌なのか分からんとお勧めしようが無いが。
www.gnu.org


……に行ったらストライキしてるしw
906デフォルトの名無しさん:04/04/08 19:16
>>905
はぁ?主張してるだけでしょ。 www.gnu.org/home.html
Join the web strike from April 5 -> April 14, 2004!
908デフォルトの名無しさん:04/04/08 20:50
>>893
そもそも
SetPoint((const POINT*)"\x04\x00\x00\x00\x05\x00\x00\x00");
みたいなひどい処理をせざるを得ない時点で設計が下手くそなんだと思うよ。
そんなわけの分からん新機能使う前に設計を考え直したほうがよくね?
5年もやってるとは思えない
#include <stdio,h>

void main() {
char arra[1];

gets(arra + 2);

return 1.2;
}
>>908
たまにいるよな、一時変数確保のCPU負荷がどうこう言うヤシ。
でもってそういうヤシに限って他のことが高負荷な処理になってたりする。
可読性を低くすることで請負の仕事の独占を図ってたりするわけだが。
プロマネは、そういう輩を見抜かないとねw
911デフォルトの名無しさん:04/04/08 21:26
>>899
>コンパイラの最適化で詰まれなくなる可能性が上がる
>ってことじゃない?

最適化でスタックに積まれなくなるわけないじゃんw
処理系によってはスタックに積まずに渡すこともある。
大抵__fastcallみたいなものつきで関数を宣言しとかんとならんけど。

こういうのがついたら可能な限りレジスタで渡すようにする処理系はある。

最適化オプションによってすべての関数にこういった物がついてると
仮定してコンパイルさせることも可能なため、「最適化オプションによって」は
スタックに積まれなくなることもある。

「最適化で」積まなくなることもありうる。static関数の場合ですな。
あと、inline関数なんかの場合もね
SH-Cコンパイラはデフォルトでレジスタ渡しだし。
915sage
> (1) static const POINT point = {4,5};
>   SetPoint(&point);
これなら{4,5}は実行初期化時からメモリに常駐され
スタックに詰まれることもないと思うが
関数側にもconst付いてるし