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

このエントリーをはてなブックマークに追加
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 71
http://pc2.2ch.net/test/read.cgi/tech/1074091602/
2デフォルトの名無しさん:04/01/31 16:07
【コンパイラ】
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/

【ライセンスや機能などに問題あり】
Microsot 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
>>1-2
もつ
(>>1乙)&&(>>1氏ね)
オレオレスレでつか……………………………………………………………………。
C言語なら感感俺俺!
オレオレはまずいだろ。
++もまずい。
i=i++;
--i++=++i--;
  ./:;:;:;:;:;:;:;/:::..   |
 /:;:;:;:;:;:;:;:/;;;;;;;;;,,,, .|
 l:;:;:;:;:;:;:;/""  ""|
 i:;:;:;:;:;/.,,ぇzv、..,::;:.|
 l:;:;:;:i′.`'':::.:;;'`::.; |
 i:;:;:/      ::. |
 l:;:;i::.....    .;''  |
 i:;:;:;ト;;;;;;;;.......'ヾ :|
 .\;l';;;`':::;'    ,|
   l:.   ヽ.'',,,,::;;|
   ヽ:. .... ヾ;i;f"|
    ヽ;:::   .ヾ';;|
    ,,ヽ;.    |, -─-、
 ._./''';;iiヾ;;,,,  / ,.-─'´
ノ    (l ~`''‐( ζ___
        /   __:_冫
       (   (____
       (    _:_冫
        (   く__
        `ヽ、___`>
          |
          |
13デフォルトの名無しさん:04/01/31 19:40
Cプログラミングの落とし穴とC FAQがまた復活したんだ・・・
C勉強中
こんなもん理解できる奴は頭が狂ってる!
オレも彼女とCの勉強中

パンパン!!
>>11
>--i++=++i--;
分かっていてやったのなら申し訳ないが、これは文法エラー
--i++は(--i)++と解釈され、--iの結果は左辺値ではないが、
i++のiは左辺値である必要があるため文法エラー
>>16
マジレス帰ってくるとはさすがに予想してなかったぞ…
>>17
へぇ、、、勉強になるなぁ、とか思ってた俺はいったい、、、
19教えてください:04/02/01 12:03
お願いします。

Func_read関数のstrcmp をmemcmpを利用して書き換える
という問題なのですが、よくわかりません2つのレコードを
置き換えとかなんとか初心者ですみません

int Func_read(void)
{
char *prtn1;
char *prtn2;
char szdat1[81];
char szdat2[81];
int nrtn;

prtn1 = fgets(szdat1,81,Fp1);
prtn2 = fgets(szdat2,81,Fp2);
if(prtn1==NULL||prtn2==NULL)
return(9);

nrtn=strcmp(szdat1,szdat2);
if(nrtn!=0)
return(-1);
return(0);
}
>>19
宿題の丸投げは宿題スレへどうぞ。
2121:04/02/02 21:05
#include<stdio.h>
#include<math.h>
#define N 4096
int func(char x, char y);
int main(void)
{
char r;
char x[N];
char y[N];

printf("Yの値をいれるのじゃ");
fgets(y,N,stdin);
printf("Xの値を入力してくださいませ");
fgets(x,N,stdin);
r=func(x,y);
printf("おぬしもワルよのお。値は%dじゃ!",&r);
return 0;
}

int func(char a, char b)
{
char z;
z=sqrt(pow(a,2)+pow(b,2));
return(z);
}
2221:04/02/02 21:05
エラーがとれないんですがどこがおかしいんでしょうか??
配列渡そうとしてませんか?
fgetsの”f”ってなーんだ?
>>21-22
x,yは配列なので型は
char
ではなく
char []
なので引数宣言と一致しません
あと、結果として値のアドレスを%dで出力してますが
これも意味ないでしょう
sqrt()への与え方もおかしいでしょう
2621:04/02/02 21:23
うー頭が破裂しそうだ、、、
これほど目的のわからないコードも珍しいな・・・
つっこみどころが多すぎるが、
入力した値は文字列なので、atof()関数でdoubleに変換してから
関数に投げればいいよ。

あとはわかるだろ、大体。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 4096
double func(double x, double y);
int main(void)
{
double r;
char x[N];
char y[N];
printf("Yの値をいれるのじゃ"); //Xから入力したい気分だが。
fgets(y,N,stdin);
printf("Xの値を入力してくださいませ");
fgets(x,N,stdin);
r=func(atof(x),atof(y));
printf("おぬしもワルよのお。値は%fじゃ!",r);
return 0;
}

double func(double a, double b)
{
return ( sqrt(pow(a,2)+pow(b,2)) );
}
atof より strtod つかおうよ。
>>30
strtodなんて使うな、アフォが。C初心者か?
strtod()なんてマジ初めて知ったよ。

でもこれ、末尾の文字のポインタが必要なのね。
安全かもしれないが、そこまでのプログラムでもないような。
>>32
必要じゃないよ。NULLを与えればよい。
でもそれじゃatofと変わらないかな?(自信なし)
3433:04/02/02 21:55
http://www.bohyoh.com/CandCPP/C/Library/atof.html
errnoを見ない限りは一緒らしい。
35SSS:04/02/02 22:06
こんばんは、今年中学2年になります。最近C言語に興味を持ち初めて
二日前BORLANDのC++コンパイラを入れて簡単なプログラムを早速コンパイル
にようとしたんですが、インクルードファイル’stdio.h'をオープンできません。
というメッセージが出てコンパイルできないんです。誰が教えてもらえないんでしょうか?
よろしくお願いします。
あはっw冗談だろうとおもって初めて覗いて見たけど想像を絶するねw
実務やってるPGはここに本当にいるの?www
あはっw実務やってるPGはここに本当にいるよwww
何がやりたいんだ?
>>39
HTTPサーバをつくってみたいです。
41SSS:04/02/02 22:36
36さん本当にありがとうございました。うまくコンパイルできました。
>>40
セキュリティとか安定性とかを考えず、1対1で単純に通信するだけなら、そんなに難しくないよ。
でも、スレ違い。
おもしろいなぁ
4421:04/02/02 23:13
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 4096

double func(double x, double y);
int main(void)
{
double r;
char *x;
char *y;

x=y=(char*)malloc(sizeof(char)*(N+1));

printf("Yの値をいれるのじゃ");
fgets(y,N,stdin);
printf("Xの値を入力してくださいませ");
fgets(x,N,stdin);
r=func(atof(x),atof(y));
printf("おぬしもワルよのお。値は%sじゃ!",r);
return 0;
}

double func(double a,double b)
{
double z;
z=sqrt(pow(a,2)+pow(b,2));
return(z);
}
4521:04/02/02 23:14
これじゃだめですか?
やっぱ最後のところがおかしそうなんですが
>>44
それじゃ二回目のfgetsの呼び出しで書き換えられちゃうよ。
あとsizeof(char)は無意味。
4721:04/02/02 23:35
2回目のfgetsの呼び出しで書き換えられるってのはどういういみですか?
4821:04/02/02 23:37
最後のdouble func(double a,double b)のところが
やっぱおかしいんでしょうか
printf("Yの値をいれるのじゃ");
fgets(z,N,stdin);
printf("Xの値を入力してくださいませ");
fgets(z,N,stdin);

なぜ2回目に書き換えられないと思うのですか?
>>47
x=y=(char*)malloc(sizeof(char)*(N+1));

xとyが指す先は同じ。
>>44
>x=y=(char*)malloc(sizeof(char)*(N+1));

近年まれに見る珍コードだ。

charは静的配列でかまわないよ。
どうせ最大文字数がfgets()で指定してあるんだからオーバーフローはしないはず。
ていうかscanf("%lf",&x)で直接doubleの変数に入力させちゃえば変換の苦労もいらないわけだが。

あと、どっから持ってきたのかしらないが
malloc()とfree()はセットで使えよ。
お兄ちゃんとの約束だぞ。
scanfでいいじゃん!
5321:04/02/02 23:58
scanf は禁止されてるんですよ
ダメ
getch
ヴァカ?
mallocって何よ
m を alloc する
getchって何よ
getのch
ch(ar) を get
printf、scanfのfって何よ
>>44
x,yはmalloc()された同じ値なので
同じメモリを示すだけです
yに入力された後、xへの入力のつもりで上書きされます

対策を幾つか挙げてみます
・x,y個別にmalloc()を呼ぶ
・そもそも、比較的小さいので元のような配列で十分
・上書きされる前に数値に変換し、それを保存しておく
 この場合、入力文字列バッファはひとつで済みます
 応用もきくので、通常はこの手法です
>>62
「fuck you!」のf
このスレはラベルが高いなぁ
ラベルがその人の値打ちを決めるのです。
fomated だNe
r 抜け(age)
6969:04/02/03 00:44
 
7070:04/02/03 00:46
↑ヤラシイ
>>69
ウホッ!いい69・・・
72デフォルトの名無しさん:04/02/03 00:46
>>68
多分tも。
formatted
format c
74デフォルトの名無しさん:04/02/03 00:48
format c#
format amrof
サルgetch!
77デフォルトの名無しさん:04/02/03 08:23
ダイクストラ法で最短路を決定していく上で、
目的地まで決定した最短路を記憶させて、それを
表示させるプログラムってどうやって作るんですか?
78デフォルトの名無しさん:04/02/03 08:24
どうやらスレ違いでした。
すいません。
1分で気付いたなら、書いてる途中で気づかなかったのかとw
ご苦労様です。
80デフォルトの名無しさん:04/02/03 23:16
文字列リテラルで、
"ABC (改行)
DEF"
って書いたらなんで駄目なの?
ANSI-C規格のどこにこれがダメだなんて書いてあるんだろう。
ほとんどのコンパイラでエラーになってしまう。
JIS X 3010でよければ、
6.4.5「文字列リテラル」の最初の方にはっきり書いてある
82デフォルトの名無しさん:04/02/04 00:37
あ、構文規則の中に書いてあるじゃないか・・・

s文字:
二重引用符”,逆斜線\及び改行文字を除くソース文字集合中の任意の要素
拡張表記

やっとわかった。ありがとう。
この項は何度も読んだのに。構文規則は流し読みしてしまったか。
ファイル内スコープで関数を定義しようとして、ファイルの先頭の方で
static type hoge( ... );
とプロトタイプ宣言をしておいて、
だらだら関数を書いて、いざhoge()を書くときに、
extern type hoge( ... ){
}
と定義してしまったんですが、警告も無く元気にコンパイル・実行と出来てしまいました。
これは意味的にはどうなるんでしょう?
こういうことをすると個人的には
1、static type hoge( ... )が定義されていない
2、定義やら宣言のコンフリクト
になると思ってたのでそのへんを交えて教えていただけないでしょうか。
ある面接で、「printf関数をc言語で作れますか?」とか聞かれたんだが、
なかなかいいアイデアがその時思いつかなかった・・・

いくつか方法あると思いますが、皆さんはどんなの思いつきます?
#include <stdio.h>
#include <stdarg.h>

int printf (const char * fmt, ...)
{
int r;
va_list ap;
va_start(ap, fmt);
r = vfprintf(stdout, fmt, ap);
va_end(ap);
return r;
}
>>84
「作る」の意味する内容に応じて、いろいろ。
vprintf() で OK かも知れないし、
浮動小数点を直にいじれ、ということかも知れない。
書式指定を自力でパースしろと言われたら辛いかもなあ。
昔フルアセンブラで printf っぽいものを作った事があるなぁ。
全部の書式をカバーするのは面倒だったのでやらなかったけど。
難しいというよりは、単に面倒なだけだな。
あの書き出した文字数を返すってのがなかなか面倒くさそう。
どこがだよw
浮動小数点数の変換が難関かな。あとはそうでもない。
92デフォルトの名無しさん:04/02/05 00:02
>>88
単に面倒なだけで、うまいPGと、ヘボPGの差がしっかり出るんだよ。
組み込みやってたときに、必要な型だけ対応したprintfは作ったなあ
必要になったらその場でcase文で拡張してた
>>93
ライブラリのソースを改造したの?
つーか組み込みのライブラリにprintfがなかった
あ、ああそういえばフリースタンディング向けだとprintfとかがあるとは限らないんだっけ。
97デフォルトの名無しさん:04/02/05 01:14
rand関数でアスキーコードの0x41〜0x5Aの数字を発生させたいんですが言いやり方ありますか?
教えてください。
0x5A以下はこれで表せると思うんですが rand() % 0x5B;
0x41以上からっていうやり方が思い浮かびません。
98デフォルトの名無しさん:04/02/05 01:17
こうかな?
0x41 + rand() % (0x5B - 0x41)
9997:04/02/05 01:22
>>98
ありがとうございます。よくこんなすぐ思いつきますね。
思いつかない方がアホなだけだと思う
そんなさ、年季の違いがあるのに感覚を一緒にするのはアホらしいと思うが
>>101
まあ、そりゃそうだけど、>>98 は割りと誰でも思いつくかと。
経験と知識の部分と、考え付く力を混同するのは危険。
98は明らかに後者。
rand関数使って乱数を得られる事を知ってるなら、後は発想。
足し算と負の数を知っているのに、
足し算だけで引き算相当の計算を思いつかないのと同じ。

その辺りが、プログラマの資質とかにも関係するかと。
104デフォルトの名無しさん:04/02/05 13:42
C言語 フリーで揃えられるって聞いたんですがどうするんですか?
105デフォルトの名無しさん:04/02/05 13:46
李抜くすにフリーのcあり。
>>104
>どうするんですか?

いや、別にどうもしないが・・・
困るのはコンパイラ作成を生業にしている奴だけだろ。
まあ、どんなスレでも書き込む前に>>1を読むことから始めることだな
>>106 ワラタ
109デフォルトの名無しさん:04/02/05 15:03
char *p;
p = new char [];
とするのと
普通に
char p[];

宣言するちがいがよくわかりません、普通に宣言すると
プログラム終了後もpがメモリーから消えないんですか?
自分の使ってる言語の名前とスレタイを見比べろ
111デフォルトの名無しさん:04/02/05 15:15
char p[n]は
プログラムの状態によらず一定のサイズのメモリしか確保出来ない
(サイズはコンパイル時に決定される)
p=new char[n]
プログラムの状態により必要な分だけ(限度はあるが)メモリを確保できる
(サイズはプログラムの実行時に決定される)
112デフォルトの名無しさん:04/02/05 15:16
>>109
>>111
おいおい、そんな説明だけでいいのかよ
微妙に違ってるし
115デフォルトの名無しさん:04/02/05 20:17
オレはそんなに詳しくないんですが、char p[n]のサイズはコンパイル時に決定されるんですか?
C89 ならそうだけど
(つまり n にはコンパイル時に決定される値しか入れられない)、
C99 なら動的に決定できる。
117115:04/02/05 20:52
>>116
サンクス
それって静的変数にも適用しますか?(コンパイル時とプログラムがメモリにロードされた瞬間)
リンカはそのn、ロードされた瞬間の値を知っているわけで、
静的に決定できるようにも思うけれど。
int func(int n )
{ static p[n];}
なんてのは論外だが。
サイズよりも、どこにできるのか注目したほうがいいかと・・
>>117
/* OK */
int a[10];

#define N 10
int a[N];

/* Error */
int n = 10;
int a[n];

static const int n = 10;
int a[n]; /* C++ なら OK */

void foo(const int n) {
 int a[n]; /* C++ でも Error */
}

void foo(const int n) {
 int a[n]; /* C++ でも Error */ //C99ならOK。
}
int n;
nに関する何らかの計算
int a[n];

みたいにしたい時ってどうするのが普通なの?
int* a = malloc(n * sizeof (int));
if(a == NULL) { エラー処理 }
  :
  :
free(a);


n の取り得る最大値が小さい場合は
その最大値の長さの配列を作って、
必要なところだけ使う。
そうかmallocか
125デフォルトの名無しさん:04/02/05 22:03
>122
alloca
>>125
> 標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)

あと、
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/alloca.3.html
> alloca 関数は、機種とコンパイラに依存する。
> 多くのシステムでは実装にバグがあるので、この関数の使用は推奨されない。
らしいけど、実際どうなの?
文字列を探索するとき、文字列を入力するときこういう処理があるとするじゃないですか。
char = key[256];
gets(key);
この場合って本格的に書くとしたらエラー処理とかしなくていいんですかね?
257の文字列をいれたら領域破壊がおこるし、配列を1024にしても1025字入れたら一緒だし・・。
なんかいいやり方ありますか?

fgets(key, sizeof key, stdin);
危うくケコーンするところだったぜ
130デフォルトの名無しさん:04/02/05 22:22
>>127

 本 当 に 1 0 2 5 字 の デ ー タ

を、どう扱うつもりなのかによる。
1024で切ったら意味ない場合ね。
何度も fgets すりゃええだけ。
そうやって読み込んだ文字列をどう扱うかはケースバイケース。
何文字読み込んだかのチェックは怠るべからず。
132デフォルトの名無しさん:04/02/05 22:26
>>131
何度もfgetcする方が簡単じゃね? 最適化には2以上より1のが都合いいし
>>132
読み戻し不要で、さらに低速になってもいいんなら別にそれでもいいけど。
134デフォルトの名無しさん:04/02/05 22:30
>>133
まさか1バイトずつって読み?
>>134
バッファに貯めるんなら fgets でいいわけでしょ?
136デフォルトの名無しさん:04/02/05 22:38
>>135
案の定だな
fgetc 遅くない?
138デフォルトの名無しさん:04/02/05 22:45
( ´_ゝ`)< ふーん、そうナノ
というか、何がしたいのかさっぱり分からん。
140デフォルトの名無しさん:04/02/05 23:20
c大体わかったがWinddowで動くやつはどうやるんじゃ?
141名無し@沢村:04/02/05 23:22
きんたまのぉ〜おっちゃんがぁ〜くそ屁をこいた〜糞こいたぁ〜

http://hp.vector.co.jp/authors/VA015412/
>>140
わかってないじゃん
143名無し@沢村:04/02/05 23:35
>>140
Cの入門書のコードを書いてコンパイルすれば動くぞ。
コンソールだが、ちゃんとWinddowで動く。最後にscanf()を書くのを忘れるな。
忘れると、プログラムが一瞬で終わって確認できないぞ。
ワラタ
>>140
「猫でもわかる」でググれ
Winddow
ちなみにwidowなら未亡人だ(;´Д`)ハァハァ
148デフォルトの名無しさん:04/02/05 23:45
i++;
printf("%d",i);

printf("%d",++i);
どっちが早い?
アセンブラ出力して確かめれ
150デフォルトの名無しさん:04/02/05 23:52
>>148
どっちが速いかは実測しろ、結果が全てだ
>>148
様々な環境で、その二つのプロファイルを取って、
平均時間を求めればわかります。

# もちろんコンパイラオプションも複数試せよ
>>148
速さが気になるのなら、
printf の代わりに独自の出力関数を用意した方が
よっぽど効果があると思われ。
そんなもん気にするより
おまいのへたなアルゴリズムを
向上させろ。
>>153
禿同
激しく同意って意味だよ♪
156デフォルトの名無しさん:04/02/06 00:18
>>153
そんなもん気にすることと、
アルゴリズムを向上させることの
客観的な境界を述べよ。
>>156
アルゴリズムを向上させて、かつそれでも速度が遅く、かつ測定によってその i++ だか ++i が遅いとなった場合にはじめて「そんなもんを気にするんだ」。
(まずないだろうが...。)

境界じゃなくて、順序だよ。
というか、printf 使ってる時点で
I/O のオーバーヘッドに埋もれて、
少々のことは気にならないと思うんだが...。
159127:04/02/06 01:01
皆さんありがとうございました。
>>157
順序は「まず測定」だろ。
測定によってアルゴリズムが原因だとわかった場合に
はじめてアルゴリズムを向上させることができる。
>>160
測定するためには、プログラムの作成が必要で、プログラムを作成するにはアルゴリズムの検討が必要。

趣味とかで適当に作ってる奴なら >>160 でいいんだろうけど、それでは手戻りがおお杉。

もちろん、人は常に完璧じゃないから測定によって「アルゴリズムがよくない」と言うことがわかる可能性はあるけどな。
>>161
異存は無いが、
>{i++;printf("%d",i);} と {printf("%d",++i);} どっちが早い?
のような断片に興味を持ったときに、実験してみる好奇心は無駄にならない。

一方、「聞くは一時の恥。聞かぬは一生の恥。」というのも真理。
実験するか、誰かに聞くか、どちらかはしなくては。
>>148は太公望だな。馬鹿がよく釣れる。w
>>162
まあ同意だな。
汗と恥は若い内にかいとけってな。
165From:160 :04/02/06 17:13
>>161
>  測定するためには、プログラムの作成が必要で、プログラムを作成するにはアルゴリズムの検討が必要。
そのとおりだが、>>160となにも矛盾しない。

>>157へのレスとして、アルゴリズムを「向上」させることについて>>160
書いてある。つまり、既にプログラムは書かれている。

例えばそれには何かデータを検索する処理が含まれているとして、
「他の処理も含めて全体として」のパフォーマンスを向上させたいとしよう。
あなたは、測定もせずに、検索処理をハッシュにしてみたりキャッシュ機能を付け加えたりと、
まずアルゴリズムを「向上」させるのか?

それは無駄な工数とバグを産むだけだ。最初に測定して原因を調べろ。
Cの話しとは直接関係ないですが、測定ってどうやってます?
>>166
はなしし?
>>166
プロファイラ
>>167
最近これに絡んでくる奴が多いんだが、同一人物 ?
何でこんなことに一生懸命レスするのか不思議でしょうがない。
不思議ということにしたいのですね :)
あまりにその誤字が多いからじゃないか?
誤字ということにしたいのですね :)
>>169
一生懸命?一所懸命!と突っ込んでみたりするテスト。
おまいらみんなC言語も良いけど日本語もちゃんとやっとけ。
>>174
> はなし 3 【話/▼咄/▼噺】

って言いたいのか ?

それとも左側の

> はなし-あい ―あひ 0 【話し合い】
> はなし-あいて ―あひ― 4 【話し相手】
> はなしあ・う ―あふ 4 【話し合う】
> はなしか・ける 5 0 【話し掛ける】
> はなし-かた 4 5 【話し方】
> はなし-くち 0 【話し口】
> はなし-ことば 4 【話し言葉】
> はなしこ・む 4 0 【話し込む】
> はなし-ごえ ―ごゑ 4 【話し声】

を言いたいのかはっきりしろよ。

>>173
ttp://dictionary.goo.ne.jp/search.php?MT=%B0%EC%BD%EA%B7%FC%CC%BF&kind=jn&mode=0&jn.x=27&jn.y=9

両方あるから突っ込まれることも無いと思うが。
一生懸命も一所懸命も話も話しも全部正しいだろ
話は名詞として単独では話しとはならない、といいたいのでは。
voidが昔、自動投稿スクリプトで指摘させてた記憶がある。
179(・△・):04/02/07 11:01
バイナリデータ入出力の事で質問があるのですが、以下のプログラムを実行しても
正常に数値が表示されます。(プログラムは独習Cの261ページのものです)
4バイトではなく2バイトで処理をしているのですが、なぜか正常に読み込めてしまい
ます。(1234567890の値も)
どうして2バイトで処理しているのに上手くいくのでしょうか?
理由を知りたいです。

Visual C++ .net Version 2002 Academic を使用しています。
180(・△・):04/02/07 11:02
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
 FILE *fp;
 int i;
 /* 書き込みのためにファイルを開く */
 if((fp = fopen("myfile", "wb"))==NULL) {
  printf("ファイルを開くことができません\n");
  exit(1);
 }
 i = 100;
 //i = 1234567890; //←の値でも正常に表示される(試しに実行)
 if(fwrite(&i, 2, 1, fp) != 1) {
  printf("書き込みエラーが起こりました\n");
  exit(1);
 }
 fclose(fp);
 /* 読み込みのためにファイルを開く */
 if((fp = fopen("myfile", "rb"))==NULL) {
  printf("ファイルを開くことができません\n");
  exit(1);
 }
 if(fread(&i, 2, 1, fp) != 1) {
  printf("読み込みエラーが起こりました\n");
  exit(1);
 }
 printf("iは %d です", i);
 fclose(fp);
 return 0;
}
書き込みのfcloseをしたあと、i=0;でも入れてみろ。
あとはi=0;をi=-1;にでもしたあと、エンディアンでも勉強しとけ。
初々しい質問じゃないか (´∀`)
>>177
釣りっぽいけど、一応
一生懸命と言うと、元の意味が説明できません
一所懸命から派生した勘違いに過ぎません
広まってしまったので辞書では「一所〜の転」と
していますが、苦々しい限りです
話し、話はどちらも可
myfileの中身をみれば
2バイトでしか記録されていないのは
わかるだろう。
つまり・・・
すまんうんこしてた。
再読み込みの部分は
ファイルに記録された2バイト分
0x02D2
がiに上書きされてるだけ。
iに元の値が残ってるから
同じ数値になってるだけ。
>>184
ご自分の知識をひけらかしたいんだろうけど、うざいから「言語学板」でも行ってくれ。
>>187
あっちじゃ今更って言われるだけなんだろ。
文字列に自動的に終端(\0)を入れる関数も多いからな。
混乱するのも無理は無いな。
文字列といったらnul文字終端のことだから
文字列を扱うなら入れるでしょ。
メモリ、バッファを扱うならこの限りにあらず
大抵はいれる。strncpyのように入れるとは限らないものもある。
192デフォルトの名無しさん:04/02/08 13:49
>>1
>GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)

C言語では簡単なウィンドウを表示するのも無理なんでしょうか?
すべての環境で同じコードで表示するのは無理では
純粋にCの質問だけということなんだろう。
APIとかはすスレ違い
【初心者歓迎】C/C++室 Ver.4【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1073473867/
こちらをお勧めする。
>>187
間違えてたら指摘するだろ?
流れ上誰か一人は指摘しないと変だろ
このスレ、板のレベルが知れる
日本語はどうでもいいのか?
これがばかの壁か?
純粋にCの質問だけということなんだろう。
日本語とかはスレ違い。
>>196
おそらくその通りだ。
お前のようなバカと、このスレの人たちの間に
どうやら越えられない壁があるようだ。

このスレは、C言語の話をするところで日本語の話をするところではない。
この板は、プログラミング技術の話をするところでそれ以外の話をするところではない。
このサイトは、誤字に非常に寛容な独特の文化がある。
要するに、お前の居場所はどこにもない。自分でサイト作ってそこで吠えてろ。
199デフォルトの名無しさん:04/02/08 15:12
vc++6ですが、

*.c(284) : fatal error C1088: コンパイラの中間生成物 ファイルのバッファを書き込めません。
'C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\a01028ex': No space left on device
cl.exe の実行エラー

となります。
・・・
puts("...全ての前処理が終了しました");
return 0;
} ←ココが284行目

ググってもわかりません、よろしくおながいします。
>>199
ディスクが一杯なんじゃないか?
>>199
文字通り、ディスクに書き込めないだけだろ?

とりあえずはディスクの空き容量を確認しろ。
おそらくその他の原因だろうが。
203199:04/02/08 15:23
C:は50%の使用です。残り1.5GB
問題のTempフォルダには0ファイル。(もちろん隠しファイルも)
なぜ・・・
204192:04/02/08 15:36
スレ違いだったらすんません。
C言語で簡単な二次元のウィンドウ(例えば、Y=aX+bの直線)
を表示させるには、OpenGLってのを勉強するのが普通ですか?
>>203
じゃオブジェクトファイルを一回全部消してからビルド
VC6ならビルド→クリーンで消せる
207199:04/02/08 15:53
>206
fatal error C1082: コンパイラの中間生成物 ファイルがクローズできません。'': No space left on device
cl.exe の実行エラー
エラーコードがチョト変わりますた・・・。
今までコンパイルしたことあるの?
もしかして作業領域とユーザー違うんで書けないとか?
>>199
まず、そこのフォルダに適当なファイルをコピーしてみれ。
それも出来ないんじゃないの?
210199:04/02/08 15:59
常にad権限で、もいっこVC起動してほかのソースコンパイルしたら正常動作しますた・・・。
211199:04/02/08 16:00
>209
ファイル操作可能です。確認しますた。
>>199
最後の行を改行してないだろ?
213199:04/02/08 16:14
>212
いや、実は
puts("...全ての前処理が終了しました");
return 0;
}

int Close(FILE *fp)
{
fclose(fp);
return 0;
}
で終わるので大丈夫だと思うんですけども・・・。
ヘッダファイル作ったりしてる?
215199:04/02/08 16:31
>214
いえ、#include は<stdio.h><math.h><string.h>のみです。
また11時杉に来ます。
いい加減スレ違いなんだから適当に誘導しろよ。
つーか、見当違いな>212うざすぎ。
再起動してみ。
>>199
[ctrl]+[alt]+[del]で、見慣れないプロセス
が走ってないか確認してみては?
>>216
あんたごときにタメ口きかれるほど落ちぶれちゃいないさ
220192:04/02/08 17:01
>>205
遅くなってすみません。そこで聞いてみます。
あんなエラー見たこと無いぞ
実行ファイルを終了せずにコンパイルしたときとか
そういうメッセージでなかったっけ?
>>222
LINK : fatal error LNK1104: ファイル "Debug/a.exe" を開けません。
a=b=c; は、次のどちらになるか決まってますか?
(1) b=c; a=b;
(2) b=c; a=c;

今使ってるコンパイラは(2)のアセンブリを吐くのですが。。。
>>224
register r = c;
b = r; a = r;
ではなくてか?
>>224
代入演算子は右結合と決まっている。
ttp://www9.plala.or.jp/sgwr-t/c/sec14.html
227199:04/02/08 23:34
>217
再起動しても変化ナシです・・・。
>218
確認しました。

う〜ん・・・。
あ、スレ違いですか?
>>225
char a,b,c;で、なんですが、変数の自動レジスタ割り付けはONにしてます。
それでも
register r = c;
b = r; r = b; a = r;
になって欲しいような気もします(あんまり意味ないけど)
>>226
ほんとだ。これってスレ違いというか、最適化の話になりそうですね。。。
>>228
r = <lvalue>;
の必要はなかろう?
= がどっちのオペランドの値を返すか決まってなかったっけ?
ANSI C言語辞典には書いてたような気がするが、いま手元に無いので
確認できん。
>>199
210で解決したんじゃないの?
>>232
それおかしい
確かに。
rtn=hoge();
if(rtn) break;

if((rtn=hoge())) break;

下のだとBCCで警告が出るのですが、ダメなんですかね。
rtn に代入するんなら、
素直に2文に分けた方がいいと思う。
警告出ないし。
(´-`).oO(警告ってどんなメッセージなんだろう・・
>>236
if 内で = を使ってますって類の警告でしょ?
BCCは細かい事にうるさいからな。
if((rtn=hoge()) != 0) break;
こんな感じにすると出なかったと思う。
でも、そうするくらいなら
2文に分けた方が分かりやすい肝。
#define TOBOOL(b) (1 && (b))

if(TOBOOL(rtn = hoge())) break;
警告抑止オプションを使え
多用しすぎは禁物だけどな
>>241
頼むからそれだけはやめてくれ。
本当の typo まで警告出なくなるから。

#pragma で囲むにしても不恰好だしナ。
そこまでしてわざわざ if 内で代入する必要も無いし。
==を=と書いてしまう人のための警告なのかな。
245デフォルトの名無しさん:04/02/09 03:40
C言語で配列の要素数を動的に変化させるにはどうすればいいのですか?
例えばint data[10];と定義したらデータは10個までですよね。
そこで、配列に入るデータの値が処理の途中で変わっていき、
最終的には要素が分からない場合はどうすればいいのでしょうか?
よろしくお願いします。
>>245
malloc使え。

int *data;
data = malloc(10 * sizeof(int));

増やすときはrealloc
消すときはfree
248234:04/02/09 04:30
分かりました。どうもです。

>>235>>239
ちょびっとくやしいというか。

>>236
「おそらく不正な代入」です。

>>238
行けました。

>>241
ausはよく使います。win98系だから、ドス窓をスクロールできなくて
警告が出まくるとエラーの部分が見えなくなるから。
249234:04/02/09 04:35
>>240
同じ警告が出ました。後、難しくて分からないです。
250名無し@沢村:04/02/09 06:47
>>246
mallocを使うと「ヒップ領域」という特殊なメモリ領域が確保されるんだ。
「ヒップ領域」とはその名のとおりwindowsの「お尻」にあたる領域のことだ。
251デフォルトの名無しさん:04/02/09 10:16
シェルソートについて勉強してるんですが
アルゴリズムについての大体のイメージは理解できるんですが
下のプログラムがまったく理解できません
誰か解説お願いします

shellsort(int a[],int N)
{
int i,j,h,v;
for (h=1;h<=N/9;h=3*h+1); ←特にここはどういう意味なのか具体的におしえてください
for(;h>0;h/=3)
for (i=h+1;i<=N;i+=1)
{
v=a[i];j=i;
while(j>h && a[j-h]>v)
{a[j]=a[j-h];j-=h;}
a[j]=v;
}
}
>>249
なら、
#define TOBOOL(b) ((b) != 0)
で。
>>251
N より小さい、3 で割り続けると最終的に 1 になる数を
求めてるんだろうな。
254デフォルトの名無しさん:04/02/09 12:18
>>253
まったくわかりません・・・
ああ  どうしよ・・・・
>>251
>for (h=1;h<=N/9;h=3*h+1); ←特にここは・・・
こうなら判るかい?

i=0;
while(h<=N/9){ h=3*h+1; }


>>253
間違ってはいないが・・・
256255:04/02/09 12:42
間違えた
h=1;
while(h<=N/9){ h=3*h+1; }
>>251
ひでー書き方だな
そんなソースは捨ててしまえ
258!251:04/02/09 12:48
>>255
それで分かるなら、アルゴリズム云々以前の問題であろう…
何気に 1 オリジンじゃね?
プログラミングは性格がひねくれてるから嫌いだ。
>>260 は日本語が壊れてるから嫌いだ。
>>251
たぶん俺の持ってる本と同じやつだ(w
大学の講義で使ったやつで、
教授曰く「この本は内容は良いがソースが腐ってる」

シェルソートは「適当に間隔をあけて挿入ソート」を繰り返すっていうのは分かる?
> for (h=1;h<=N/9;h=3*h+1);
は、その最初の間隔を求めるもの。
この間隔の求め方は経験から出たもので、厳密な根拠はないそうだ。
深く考えないで良い。

このプログラムでは
... 121 40 13 4 1
という間隔で挿入ソートを繰り返す
263gets房:04/02/09 17:16
typedefの効果をファイル内のみにしたいのですが、どうしたらええでしょう
もともとファイル内のみだが。
>>263
そのファイルを他からincludeしない。
>>264
多分、ヘッダファイル内のみってことなんだろう。

結論から言うと無理。
でも、外から使って欲しくない識別子に
共通の命名規則を適用しておけば、
こういう名前の識別子は外から使わないで欲しい、
という風に要求する事はできる。
>>263-266
--myheader.h
#define TYPDEF_LOCAL(a, b)  typdef a b
TYPDEF_LOCAL(int, myint)
...
myint a = 0;
#define typedef_local(a, b)
--eof
とかできないか?
>>267
は?
>>267
基地害?
>>267
C++だと似たようなことができないでもないが、
Cでは不可能。
271ぬるぽ:04/02/09 19:46
ぬるぽ
267 降臨まーだぁ?ギャハ
>>266
>多分、ヘッダファイル内のみってことなんだろう。
typedefをヘッダファイル内のみで使うって、どんな利点があるのだろう…?
274デフォルトの名無しさん:04/02/09 20:51
ねーよ
インライン関数を作成するときには意味があるんじゃないの?
長すぎてstaticなだけのinlineとかな
成歩堂…inlineナリカ…
>>1は 俺俺詐欺
>>275
関数内で typedef すればいいんでは?
>>279
引数で使えん。
>>280
引数に使うなら外部からも参照できる型にすべきだと思うが。
>>281
関数ポインタでも?
関数ポインタこそtypedef
いや、外部で参照する必要性があるかどうかということであって...。
285get房:04/02/10 00:34
なんか勘違いしてました

お騒がせしました。
264-286はムダだったということか
>>283
氏ね
288デフォルトの名無しさん:04/02/10 07:18
問題:標準入力から読み込んだ文章の文字の頻度を
   調べるプログラムを作ってみましょう。
   ただし、日本語の文字は考えないこととします。

問題はこうなっているのですがどうすればいいのかわかりません。
よろしくお願いします。
289デフォルトの名無しさん:04/02/10 07:29
>>288
何が分からないのか分からないことには答えようがない。
>>288
宿題は宿題スレへ
>>282
そりゃそうだろ。
>>288
aからzまで数えるんだよ。続きは宿題スレでな
素数を数えて落ち着くんだ……
-1+2^20996011
20996010
296288:04/02/10 11:38
すみません
書く板を間違えてました
>293は神父さん?
誰か過去ログの1〜4持ってませんか?
以前全てのログをあげてくれた方がいるのですが
1〜4だけは入って無くて手に入らないんです。(ログを辿ってみたけど落ちてました。)
よろしければお願いします。
299デフォルトの名無しさん:04/02/10 22:15
>>298
これだけは見つかった。他は現在捜索中。
Part4 http://piza2.2ch.net/tech/kako/992/992357382.html
300298:04/02/10 22:43
>>299
おおっこんな所に…

残り1〜3が集まれば
1〜72までをアーカイブしてインデックスも付けて
順番に整理してうpしますんでお願いします。
>>300
おぉ、同じようなことをしている人が・・。

って、漏れ、htmlにしたやつ最近公開したんだよね。
datも置いた方がいいかな。
ttp://nssearch.hp.infoseek.co.jp/clang/
おお凄え。
次スレからテンプレに追加してもいいかな?
303300:04/02/10 23:03
>>301
すげぇ…
あなたのページを丸ごと持って帰りたいです。
…ダメすか?
>>303
datも置いたのでドゾ
305300:04/02/10 23:08
>>304
アリガd。
これで全部そろったよ。
あとはヒマがあったら質疑応答集と良く出る話題、良く来る質問とかもまとめてみるよ
306デフォルトの名無しさん:04/02/10 23:13
すいません、ちょいと教えてください。
下のようなコードを書いたら何故かbufとpのアドレスが重なってしまったんだけど
何故なんでしょう?
Uchar **p = (Uchar **)calloc(len, sizeof(Uchar));
if (p==NULL) exit(1);
Uchar *buf = (Uchar *)calloc(len*2, sizeof(Uchar));
if (buf==NULL) exit(1);
for (int i=0; i<len; i++) printf("%d ", buf+i);
printf("\n");
for (int i=0; i<len; i++) printf("%d ", p+i);
307306:04/02/10 23:17
ちなみに自作関数内のコードで、mainから呼び出して使っています。
Uchar **p = (Uchar **)calloc(len, sizeof(Uchar*));
>>306
ポインタ算術演算は,ポインタの指示先の型サイズでスケーリングされるため.
310306:04/02/10 23:24
>>308
神!!
ありがとうございますた。
大事なところが抜けてたようです。
311306:04/02/10 23:25
>>309
良く分かりますた。
ありがd
>>301
Part1の1〜100番あたりがめっさおもろい。
K&Rか…ビル・ジョブスすげぇな…
>>301html版の,が@`に化けて見えるのは俺だけ?
>>314
あー、何か化けてますな修正努力してみます。
昔のdatは<>でなく,で区切ってた為、文章中の,を@`で記述してた
それをhtml化する時に再変換してないだけだろ
出遅れた(w
318デフォルトの名無しさん:04/02/11 02:54
俺はケツの穴で口笛が吹ける
口笛を定義しろ
320デフォルトの名無しさん:04/02/11 12:47
俺はケツの穴でお湯がわかせる
俺はケツの穴で食事して口から出せる。
322デフォルトの名無しさん:04/02/11 12:52
俺はケツの穴に洋子と名づけている
お前俺のケツの中でションベンしろ
お前俺のケツの中で射精しろ
>>325
そ、そんな根拠があったとは尻間栓でした。お見それいたしました。
327質問です:04/02/11 13:39
質問です。
#include<stdio.h>
void main(void)
{
FILE *opt;
int c;
opt=fopen("C:\Program Files\bcpad231\BackupB\input.txt","r");
c=fgetc(opt);
putchar(opt);
fclose(opt);
}
これをコンパイルしようとすると、
エラー E2034 test1.cpp 9: 'FILE *' 型は 'unsigned char' 型に変換できない(関数 main() )
のような、文がでます。 何がおかしいのでしょうか?

コンパイラは、Borland C++ 5.5.1 for Win32
OSは、windows2000です。
328327:04/02/11 13:41
失礼しました。
上の質問は無視してくださいm(_ _)m
329デフォルトの名無しさん:04/02/11 13:58
putc(c,opt);
エラーメッセージもよめないのか・・・
331デフォルトの名無しさん:04/02/11 16:49
俺はケツの穴で割り箸が握れる
332デフォルトの名無しさん:04/02/11 17:11
LINUX環境でファイル書き込みをしようと以下のプログラムを書いたのですがopenの戻り値が0のため
標準入力にwriteされてしまいます。
どこかおかしな箇所があれば教えてください。

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
int fd;

fd = open("filename", O_RDWR | O_CREAT, S_IRWXU)<0)
write(fd, s_send_data, strlen(s_send_data)
close(fd);
}
>fd = open("filename", O_RDWR | O_CREAT, S_IRWXU)<0)
ここ。
>332
正確にコピペしないと、返事のしようがないよ。
335332:04/02/11 17:16
すいません間違えました・・・
  fd = open("filename", O_RDWR | O_CREAT, S_IRWXU)<0)
ではなくて、↓です
fd = open("filename", O_RDWR | O_CREAT, S_IRWXU)
336デフォルトの名無しさん:04/02/11 17:18
セミコロンがない。
returnがない。
セミコロンが無い
338デフォルトの名無しさん:04/02/11 17:20
これでお願いします。

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
 int fd;
 fd = open("filename", O_RDWR | O_CREAT, S_IRWXU);
 write(fd, s_send_data, strlen(s_send_data);
 close(fd);
 return 0;
}
339デフォルトの名無しさん:04/02/11 17:22
>>338
なんかネタっぽいが・・・・
そもそもそれじゃ括弧の対応がおかしくてコンパイルが通らないだろ。
セミコロンも全角だし・・・
s_send_dataがどこにもないし

まあどうせアクセス権だと思うけどな
何度もすいません・・・
ネタじゃなくて、以下のopen関数の戻り値がなぜ0になるのかわからなくて困ってます
ちなみに、rootでやってるんですけど。

fd = open("filename", O_RDWR | O_CREAT, S_IRWXU);
なんでerrno を調べないの
343デフォルトの名無しさん:04/02/11 17:39
変な構文で0を代入しているに400ウォン
344343:04/02/11 17:40
fd = open("filename", O_RDWR | O_CREAT, S_IRWXU)<0;
とかな。
>>343
ファイルをコピペしないでわざわざ打ってるんだから
そうとしか思えないよな
346デフォルトの名無しさん:04/02/11 17:52
質問です。
#ifdef #elif #endifで、Linux、MacOS X、OpenBSD、FreeBSDを判断したいのですが、
MacやBSDでは、なんというマクロが定義されているのでしょうか?
Mac: #define kogakureki
>>346
処理系に依存
349346:04/02/11 18:03

>>348
処理系というのはコンパイラのことですか?
gccでいいのですが、なにかないでしょうか。
Linux、BSD系は実はできたのですが、MacOSがわからないのです。

>>338
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main()
{
int fd;
char data[] = "foo";
 if ((fd = open("./filename", O_WRONLY | O_CREAT, S_IRWXU)) == -1) {
perror("open");
return -1;
}
 write(fd, data, strlen(data));
 close(fd);
 return 0;
}
1〜100までの数字を足していくプログラムを作ってみたんですけど、
もっとソースをスリムにできませんか?

#include<stdio.h>

main()
{
int a,b;
int c=0;
for(a=1;a<101;++a)
{
b=a+c;
printf("%d\t%d\n",a,b);
c=b;
}
return 0;
}
そしてコピペは全角が入る。
b = 100 * (100 + 1) / 2;
353デフォルトの名無しさん:04/02/11 18:08
>>350
変数がひとつ余分。
>>352
1〜100までの数字を足していくという過程がない
ソースがスリムってなに?
main()
{
int a,b;
for(a=1;a<101;++a)
{
c+=a;
printf("%d\t%d\n",a,c);

}
return 0;
}
357350:04/02/11 18:11
言葉足らずでした。
1〜100までの数を順に足していって、一回足すごとに数字を表示するプログラムです。
>>356
cをbに置き換えてくれ・・・
1〜100までの数字を足していくプログラム != 1〜100までの合計を求めるプログラム
てことっすか
1〜100ならせめて、for (a=1; a <= 100; ++a) にしようぜ。
361346:04/02/11 18:18
>>357 こんな感じでどうだ
#include <stdio.h>
int main()
{
int i = 0, sum = 0;
while(i++ != 100) printf("%d\t%d\n", i, (sum += i));
return 0;
}

どなたか、まじでMac OS Xのgccで定義されているマクロ知りませんか。
int main(){
return 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30\
+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59\
+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88\
+89+90+91+92+93+94+95+96+97+98+99+100;
}
>>361
ダメ。
MacOSが手元にあるんなら、gcc -v でもしたら?
>>363
なんで?
>>362
あんさん、Cはフリーフォーマットですぜ。\はいらない。
367350:04/02/11 18:22
>>359
>!= 1〜100
え〜と、よく意味がわからないです。
とりあえず、実行結果が>>350と同じになるようにしたいんですけど。

>>360
あ、その方がいいですね。

>>361
なるほど、whileを使った方がスリムになるのか・・・

みなさん、ありがとうございました。
もっと勉強します。
368346:04/02/11 18:28
>>364
書き方変えただけだからね、、
>>364
あ、どうもです。
specsというのがgccが標準で読む設定ファイルみたいなものでしょうか。
__APPLE_CC__ってのでいけました。
369346:04/02/11 18:29
>>363
書き方変えただけだからね、、

でした
370350:04/02/11 18:33
>>369
ちなみに>>363は私じゃないです。

for()のときは{}を使わないとダメなんですけど、
while()のときは{}を使わなくてもいいんですよね。
>>370
forでもwhileでもブロックありもなしも書けるが、そんなスリムかどうかを気にするよりもやることはある。
ブロック化しない代償として関数のパラメータ部に副作用の起きかねないコードを書くのはやめるべきだ。
体型もそうだね、無理なダイエットは却って体型を崩しちゃう。
ブロック化が必要なのは関数だけだよな?
374346:04/02/11 18:40
>>370
forもifもwhileもdoも{ }内で実行する命令が1行だった場合は、
{}なくていいんじゃない?

>>__APPLE_CC__
調べてみたら __APPLE__ ってのを普通使うみたいでした。
375346:04/02/11 18:46
>>370
見た目が短くなっても、アセンブラレベルでみると変わってなかったり、
逆に専用の変数を1つ多く作ったほうが速いこともあるので、
特に無駄なことをしていないのなら、それ以上短くしなくてもいいと思う。
無理やり短くした結果、読みにくいコードになることも多いし。
一行でもブロック化しないと、自動インデントが狂うIDEが有る。
>>355
こんな奴のことだろ。

#include<stdio.h>
main
(
)
{
int
a
,
b
;
int
c
=
0
;
for
(
a
=
1
;
a
<
101
;
++a
)
(...以下略...)
#include<stdio.h>
が長くてバランスが悪いな。
こういう時はインライン展開すべきだな。
#include <stdio.h>
@
int main(void){
double a;
a = sin(1);
printf("%f\n",a);
return 0;
}
ってやるとコンパイルエラーになるんですが
@にdouble __cdecl sin(double abababa);
って書くとちゃんとsin1が計算されます
double __cdecl sin(double abababa);
はいったいどのような意味を持っているのか
どうやってsin関数を計算しているのか教えてください
380デフォルトの名無しさん:04/02/11 21:35
>>379
質問の答えにはなっていないが、#include <math.h>を#include <stdio.h>の下に書け。
>>379
環境依存だ。
コンパイルエラーなのは、sinの入っているライブラリがリンクされないからだろう。
えー、プロトタイプ宣言が強制されているだけでしょ。
>>381
多分警告をエラーと勘違いしたんじゃないかと。
それともC++としてコンパイルしたか。
384デフォルトの名無しさん:04/02/11 21:43
>>381
環境依存とはコンパイラの方でしょうか
>>384
「どうやってsin関数を計算しているのか」
386デフォルトの名無しさん:04/02/11 21:45
>>383
エラーとでます
コンパイルは通りますが
値はむちゃくちゃです
>>386
とりあえず値がおかしいのは、プロトタイプがないとsin関数がint sin();とみなされるから。
>>386
メッセージを正確に書かない理由は何?
〜というメッセージが出ましたと書くだけで終わる事だろ?
英語だから読めませんというオチか?
プロトタイプ無しで int 型の値を渡してるから、
sin に int 型の 1 が渡されて変になってるんだ。

あと、コンパイル通るんならエラーじゃなくて警告だ。
>>389
あと関数側はdoubleを返しているのに受け取り側はintと見なしているのも問題だよな。
>>379はプロトタイプ宣言について勉強し直してください。
GCC だと sin は double sin(double) だとみなしてくれるっぽ。
とは言え、そんなもん期待しちゃいけんけどな。
393デフォルトの名無しさん:04/02/11 22:47
入力された文字がyかn以外の時回るdo〜whileループの中でgetcharで文字を読み込んで、
yかn以外だと「yかnを入力せい」という表示が出るようにしたのですが、
入力する文字によっては何回も「yかnを入力せい」と表示されてしまいます。
どんな時も一回ずつだけメッセージを表示させたいのですが、どなたかいい解決法御教授願います。
394デフォルトの名無しさん:04/02/11 22:50
scanfをつかう
>>393
#include <stdio.h>
int main(){
    char buff[100];
    while (fgets(buff, sizeof(buff), stdin))    {
        if (buff[0] == 'y' || buff[0] == 'n') break;
        fprintf(stderr, "Input y/n!\n");
    }
    printf("%c\n", buff[0]);
    return 0;
}
396393:04/02/11 23:21
>>393-394
ありがとうございます!
両方ともうまくいきました。


ちなみに
do{
a=getchar();
}while(a!=EOF);
を試してしまった私は勉強し直しですか?(^^;)
397396:04/02/11 23:23
スイマセン。
>>394-395 の間違いですね。逝ってきやす。。。
398デフォルトの名無しさん:04/02/11 23:36
>>397
おい、俺はケツの穴でジャンケンができるが
俺と勝負するか
>>398
どうしてもこのスレを「けつの穴スレ」にしたいらしいな。w
>>398
形状で? グーとパーなら音でなんとか表現できそうなんだが
401デフォルトの名無しさん:04/02/11 23:54
400
402401:04/02/11 23:54
(-_-;)
(; ・`д・´) !? (`・д´・ (`・д´・ ;)
>>393
普通は改行が入力されるまでよみこまれず行毎の入力になるので、
getchar()でやるなら、改行までスキップして改行後の先頭をみたりしないといけない。
405398:04/02/12 00:18
>>400

実際チョキは気合を入れないと難しいんです
すいません
406デフォルトの名無しさん:04/02/12 01:41
下記のようなプログラムがあるのですが、静的領域で確保している
main_dat[5]を要素ごとに動的メモリを確保するようにするには
どのように改造すればよいのでしょうか?
動作環境は32bitCPUです。
条件としては、init_datはmain関数の内部で
宣言し、init関数も使用しなければなりません。
分かる方、教えてください。
407デフォルトの名無しさん:04/02/12 01:42
#include<stdio.h>

typedef struct dat
{
char dat1;
int dat2;
char dat3[3];
int dat4;
} DAT;

DAT  main_dat[5];

void ini(DAT);
int main(void)
{
DAT init_dat = {5,6,{7,8,9},1};
init(init_dat);
return 0;
}
void ini(DAT da)
{
int i;
for(i=0; i<5; i++)
{
main_dat[i].dat1 = i;
main_dat[i].dat2 = da.dat2;
main_dat[i].dat3[0] = da.dat3[0];
main_dat[i].dat3[1] = da.dat3[1];
main_dat[i].dat3[2] = da.dat3[2];
main_dat[i].dat4 = da.dat4;
}
}
408デフォルトの名無しさん:04/02/12 01:47
>>406
要素ごとに確保しなければならないのか?
一気に確保してはいけないのか?
コンパイルが通らない予感
memcpyでよさそうな予感。
つか構造体は代入できるじゃんよ。
関数iniのforループの中は

main_dat[i] = da;
main_dat[i].dat1 = i;

でいいでしょ。

んで動的に、というのならば、main_datはDAT *で定義してどっかでmallocして、
その要素数をmain_datを使う関数に渡す or グローバル変数に保持、でいいんじゃないかな。

つかグローバル変数を使わなきゃならない理由あるの?
積極的な理由がないならローカルで定義して、
各々の関数に渡してやったほうがいいと思うけど。

# いちいちmain_datを受け渡すのが面倒、
# ってのが理由であれば積極的な理由には、
# おれは思わんけど。
DAT *pda = (DAT*)malloc(sizeof(DAT) * 5);
413デフォルトの名無しさん:04/02/12 04:27
a[5][5]という配列を0で初期化した後
a[1][1]=1と値を代入したところ
if(a[1][1]==1)が偽になり
if(a[1][1]!=0)が真になりました
なぜa[1][1]に1が入ってないのでしょうか?

初心者なので説明の仕方がわかりずらいかもしれませんがよろしくおねがいします
短いサンプルコード書いて、ここに貼り付けて
415413:04/02/12 04:57
int syougaibutu[640/16][480/16];

int i,h;
for (i=0;i<20;i++)
{
for (h=0;h<20;h++)
{
syougaibutu[i][h]=0;
}
}

syougaibutu[4][4]=1;

if (syougaibutu[4][4]==1)
{

g_FrameNo = START_INIT;

     }

こんな感じです
上の例だとg_FrameNo = START_INIT;が実行されてないみたいなんです

if (syougaibutu[4][4]==1) ここをif (syougaibutu[4][4]!=0) に変えると
g_FrameNo = START_INIT;が実行されるみたいです
0 クリアは memset(syougaibutu, 0, sizeof syougaibutu); がよい。
というか、40×30 なのに 20 までしか回してないのはなじぇ?

あと、このコードだけでは g_FrameNo には START_INIT が入る。
他のところで変なことをしてるとしか考えられない。
417デフォルトの名無しさん:04/02/12 05:15
失礼します、質問させてください。
C言語の参考書を見ると、「処理系」という言葉が出てくるのですが
あまり詳しく解説されてないのです。
「処理系」というのは具体的にはどのようなものなのでしょうか。
Visual C++などの開発ソフトを指しているのでしょうか?
コンパイラやインタプリタ全般を指す言葉。
419413:04/02/12 05:28
int syougaibutu[640/16][480/16];

//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: スタート処理初期化
//-----------------------------------------------------------------------------
int i,h;
for (i=0;i<40;i++)
{
for (h=0;h<30;h++)
{
syougaibutu[i][h]=0;
}
}

syougaibutu[4][4]=1;

//-----------------------------------------------------------------------------
// 関数名 : StartFrame()
// 機能概要: 画面更新処理
//-----------------------------------------------------------------------------
if (syougaibutu[4][4]==1)
{

g_FrameNo = START_INIT;

     }

こんな感じで二つの関数にまたがって書かれてました
420413:04/02/12 05:30
int syougaibutu[640/16][480/16];

//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: スタート処理初期化
//-----------------------------------------------------------------------------
int i,h;
for (i=0;i<40;i++)
{
for (h=0;h<30;h++)
{
syougaibutu[i][h]=0;
}
}



//-----------------------------------------------------------------------------
// 関数名 : StartFrame()
// 機能概要: 画面更新処理
//-----------------------------------------------------------------------------
syougaibutu[4][4]=1;

if (syougaibutu[4][4]==1)
{

g_FrameNo = START_INIT;

     }

>>419を上のように書き換えるとうまくいきました
なんでこんなことになるんでしょうか?
GameInit の呼び出しと
StartFrame の呼び出しの間で
syougaibutu[4][4] の値を操作してるんだろ。
422413:04/02/12 06:01
>>416
>>421
アドバイスありがとうございました
うまいこといきました
( ゜д゜) ポカーン
424デフォルトの名無しさん:04/02/12 07:30
( ゜o゜) ポカーン
425413:04/02/12 08:51
>>416
>memset(syougaibutu, 0, sizeof syougaibutu); 
の中のsizeof syougaibutuはsizeof(syougaibutu)という形でなくてもいいのでしょうか
あと、
>宣言時に初期化するのでかまわなければ、
>int data[100] = {0}; のようにすると、全ての要素に{0}を設定できますよ。
と調べたら出てきたのですが、上のようなやり方で2次元配列の場合はどのように宣言したらいいのでしょうか?
>>425
>という形でなくてもいいのでしょうか
return 0;
と書くか
return(0);
と書くかのようなものだ

>2次元配列の場合
聞く前に手を動かせ
427デフォルトの名無しさん:04/02/12 09:06
>>426
レスありがとうございます

コンソールで作ったプログラムを実行すると一瞬で実行が終わって結果を見る
暇がないくらい一瞬でウインドが閉じてしまいます
勝手に閉じないようにするにはどうしたらいいのですか?
>>427
そんなもの標準Cには関係ない。
コマンドプロンプトで実行するか設定見直せ。
429デフォルトの名無しさん:04/02/12 09:18
>>428
何処いじったらいいのかわからないです
Cの解説をしてるサイトとか見てたら実行結果として
ウインド内に結果が出ている画像がはってあったりするってことは
どこかの設定弄れば勝手に閉じないようになるんでしょうね
難しいな…
>>429
君の環境がわからんのでどこ弄らせたらいいかわからんのです。
ま、環境依存の話は適当なスレ行くべきだがな。

当スレ的には終了する前にキー入力でも待てばいいんだよと。
431デフォルトの名無しさん:04/02/12 09:48
>>430
ありがとうございました
やってみます
432デフォルトの名無しさん:04/02/12 10:10
>>430
できました


void ShowMyText(HWND hWnd)
{
HDC hdc;
PAINTSTRUCT paint;
char *str = "こんにちは";

hdc = BeginPaint(hWnd, &paint);
TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str));
EndPaint(hWnd, &paint);
return;

}

上のは文字しか表示できないのですが
printf("a + b = %d\n", a + b);
みたいに数字を表示させるにはどうしたらいいのですか?
       ヽ(・ω・)/   ズコー
      \(.\ ノ
    、ハ,,、  ̄
     ̄´´
>>432
このスレがどういうスレかわかってないようだな。
sprintfでも使ってなさい
クマー(AA略
void*型に加算や減算をすると、
アドレスがByte単位で操作できると思ってたんですが、
あってませんか?
実は未定義でたまたま動いているような気がしてきました。
今まで使っていたコンパイラから別のコンパイラに変えたら警告されたもので…
まぁ警告された時点であってないことはほぼ確実なわけでしょうが…
うずうずうずうず・・・
>>436
書き込むスレすらあってねえよ
>>436
void*に対する加減算はgccの独自拡張。
>>436
charは1バイトなので、char*を使いましょう。
>>427
VCならCtrl+F5
他のは知らん。
442デフォルトの名無しさん:04/02/12 14:04
>>439
アホみたいな拡張だな
GCC 使ってたら、普通 -pedantic
0〜Nまでの良質な乱数を得たいときはどうすればよいのでしょう?
rand() % N では Nが大きくなると出る頻度が偏ってきてしまうらしいですが。
>>444
Mersenne Twister
>>444
Mersenne Twister 法を使い、さらに
MTRand() * N / (MTRAND_MAX + 1)
ただし、必ずオーバーフローを考慮する事。
447444:04/02/12 15:59
レスありがとうございます。
恐らく
http://www.math.keio.ac.jp/~nisimura/random/int/mt19937int.c
このソースでいいと思うんですけど
このソースの場合
MTRAND_MAX に対応する値はどれなんでしょうか?
448444:04/02/12 16:05
すいません。この場合それは考えなくてよさそうですね。
MTRAND_MAX は ~0u に相当。
>>442
しかし、実行環境のハードウェアに於ける最小の記憶単位は欲しいことあるよ?
アドレッシングできる最小単位はcharがあるだろ
452デフォルトの名無しさん:04/02/13 00:10
ポインタを整数にキャストするのは未定義でつか?
>>452
そうでつ。
>>451
charには最低8ビット以上という制約がある。
その制限を受けない「最小単位」が欲しいわけだが、
まあ気にならない人にいくら言っても水掛け論だな。

>>453
嘘を言ってはいけません。未定義になるのは条件つきです。
JIS X3010 6.3.4 キャスト演算子
455デフォルトの名無しさん:04/02/13 00:42
charが7ビットの処理系ってなかったっけ。
最小ってビットじゃないの?
>>456
あるか知らんけど
取りあえず規格には準拠してないので
そんな処理系は(このスレでは)無視してok
てか規格では、1バイトのビット数は処理系定義じゃなかった?

1番地あたり8ビットと決めた人の名を言ってみろぉ
         ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
                ./ l|i^ヽ /|
          /\ /\ ((@ヽ三l/ .|
          / /\  \ ヾjjjj///../
        ())ノ__ ⊂二⊂二⌒/../
       / /||(二ニニ)(__ ./../フ几l
   γ ⌒ /|V||彡Vミ/⌒_ノ二二ノl0
   l| (◎).|l |((||((゚ )/⌒/||三三三・) ||  (´⌒(´
__ ゝ__ノ     ̄(___) ̄  ゝ__ノ≡≡≡(´⌒;;;≡≡≡
        ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄(´⌒(´⌒;;
>>459
1バイトのビット数は8ビット以上と定義されている
C89以降ね。7bitのはそれ以前にあった
言語は、それを使う人が何を考えることができるかを、決めてしまう
>>463
あなたは無能なんですね
>>464
ほう、見所ある若者だな。
あの本に噛み付いてるよ。
がんばれ!
void関連の話題は書籍スレでどうぞ
>>466
そっちかよ
いきなり飛んだな
468デフォルトの名無しさん:04/02/13 02:56
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
ここいらで話題を替えてみなさんのケツ毛の思い出を聞かせてください
charは8bitだが、バイトも8bitなのか?
>>469
C言語の話題であるなら1Byte=8bitでも良いんじゃないかな?
通信関連だとそうでもないことがあるらしいけど( (1 Octal == 8 bit) != 1 Byte )

気になってsizeofの定義を見てみたら「必要なバイト数を返す」となっていて、
「sizeof(char)は1を返す」となっていた
ここで、「charは8bit」がただしいとすれば、「1Byte=8bit」は真になるんじゃないかな?
>>470
1char==1Byte、sizeof(char)==1 は成り立つが、1Byte==1Octal は成り立つとは限らない。
> C言語の話題であるなら1Byte=8bitでも良いんじゃないかな?

だめです。
で、>>450 は結局何がほしいんだ?
>>470
8 か 9 が存在する。
でも、8 以上であれば C の規格上何であってもよい...筈。
誰かC言語でJavを作る方法を教えてください
>>473
気にならない人にいくら言っても無駄
char==short==int==long==1
でも1バイトが32bit以上あれば規格上OK
おくてっと
おくとぱす
481デフォルトの名無しさん:04/02/14 02:17
>>476

教えない  ばぁぁか  市ね
482デフォルトの名無しさん:04/02/14 04:18
>>472
いいって書いてあったもん。
94ページの一番最後の段落ね。
483475 :04/02/14 08:52
(つд`)
Jav って何?
噂の Java-- か?
486デフォルトの名無しさん:04/02/14 09:23
二次元配列で 3×10 と 10×3 ってどっちが効率いいんですか?
>>486
このスレ的には、試してみて良かった方、だな。
488デフォルトの名無しさん:04/02/14 09:39
>>486
面白い質問だな。

二重ループさせるとき、[10][3] より [3][10] の方が
ほんの少し効率よさげな気がする。
他に利点はあるだろうか。
メモリーの消費量はかわらないよな
メモリーとか言うなYO!
>>489
多分、ほんのわずかだが [3][10] の方が実行速度が上がる。
根拠を書けや
>>492
for(i=0;i<10000;i++) for(j=0;j<1;j++) k[i][j]=0;
より
for(i=0;i<1;i++) for(j=0;j<10000;j++) k[i][j]=0;
の方が効率がいい事ぐらいは分かるだろ?
jから先に回さなければならないという理由はない。
CPUのキャッシュに入りきるぐらいの大きさならね。
>>494
>CPUのキャッシュに入りきるぐらいの大きさならね。
実行環境を特定していない以上、この条件は大きな足かせとなるだろ。
>>493
> for(i=0;i<10000;i++) for(j=0;j<1;j++) k[i][j]=0;
                   ~~~
> for(i=0;i<1;i++) for(j=0;j<10000;j++) k[i][j]=0;
      ~~~~

ネタか ?

と言うのは、別にして for(j = 0; j < 3; j++) k[i][j] = 0; ぐらいならループアンローリングするコンパイラもあるかもしれないし。
どっちが効率的かは、処理系次第。
つーか、>>487 で既出だったな。
497デフォルトの名無しさん:04/02/14 11:19
ヴェクター機能のあるCPUで、それ用のコードを出すコンパイラーだったら
当然どっちがいいかわかるよね? > ループのどっちを内側にするか。
でも、そういうコンパイラーはたいがい、どっちで書いても勝手に
オプチマイズしちゃうからなあ。
をいをいintの後置++が遅いって?
>>498
ずれちゃったんだよ。
「j<1」を指摘したかっただけ。
なんだ残念
3*10=3+3+3+3+3+3+3+3+3+3
10*3=10+10+10
502デフォルトの名無しさん:04/02/14 13:20
A言語とB言語はどこにいったのでしょうか??
>>502
さっき3丁目のタバコ屋のところで見かけたよ
ひねりが足りない。 15点
C言語の’C'の中には何が格納されているのでしょうか。
でもって、operator ++はどのように実装されているのでしょうか。
506デフォルトの名無しさん:04/02/14 14:11
> C言語の’C'の中には何が格納されているのでしょうか。

連結器です

> operator ++はどのように実装されているのでしょうか。

レーダーが入っています。
do分とwhile文って似てますけど、
どっち使ったほうがいいですかね?
>>507
動く前に考える人はwhile、動いてから考える人はdoを使いたまへ。
1回以上動くことがわかっていて、スピード重視ならdo
例のマクロをつくるときはdo
511デフォルトの名無しさん:04/02/14 18:15
どっちでも書ける場合はかならず「while」にしてください。
「0回回る」があり得ない、必ず1回実行されてほしい場合、
(ユーザーに入力を促す場合など)はdo-whileがしっくり来ますが、
それ以外の場合はすべてwhile、と覚えておいて間違いありません。
512デフォルトの名無しさん:04/02/14 18:16
>>509
スピードは無関係。
よって、509は知ったか。
一回余計な条件分岐されるからその分遅くなるんじゃないの?
514デフォルトの名無しさん:04/02/14 18:20
そこに「速度」問題は発生しません。
その外にループがある場合で、
かつ、内側のが「たかだか1回」しか実行されないような場合でもないかぎり。
515デフォルトの名無しさん:04/02/14 18:21
C++はしってますがC--はどこいった??
>>514
無関係、と言い切っておいてあとから「でもないかぎり」かよ。
いい加減なことを言っているのはお前じゃないか?
517デフォルトの名無しさん:04/02/14 18:32
> 無関係、と言い切っておいてあとから「でもないかぎり」かよ。

あたりまえでしょう。
ループ1回分の実行に10秒かかるとして、条件判定に0.001秒かかるとし、
いつも1回だったら、10.001と10.002秒の差なので0.01%ぐらいは差はあるが、
100回回るループなら1000.1と1000.1001の差。
そういうのを「速度問題」とは言わない
当然「速度重視ならどっち」とかいうのはマヌケ。

周りにループがあって多く実行されるところだとしても、
やはり同様。
518デフォルトの名無しさん:04/02/14 18:34
> C++はしってますがC--はどこいった??

++Cも知らないひとにC--はまだ早すぎます。

C♯とD♭は違う音なんですから。
>>517
だから「無関係」と断言して「知ったか」とレッテルを貼る自信はどこから来るのかと。
"通常は問題にならない"と"無関係"は当然区別されるべきだと思うが?
520デフォルトの名無しさん:04/02/14 18:40
> だから「無関係」と断言して「知ったか」とレッテルを貼る自信はどこから

どこからもくそもなく、じょーしきだろ。
おまえそんなことも知らずにC使ってるのか?
そこまで自信ないのか?
だめすぎ
521デフォルトの名無しさん:04/02/14 18:41
「通常」もどころか、問題になるときなんかねーだろ > ぼけ
522デフォルトの名無しさん:04/02/14 18:43
初心者相手に「速度優先なら」と知ったかかましたのを指摘されて、
みっともなく防戦してる図...か!

まあ指摘するやつもするやつだ。ここは、そういう知ったかぶりOKの場所なの!
無粋な真似はやめな!
523デフォルトの名無しさん:04/02/14 18:46
>>522
> そういう知ったかぶりOKの場所なの! 無粋な真似はやめな!

だが、それでは、信じてしまうかもしれない初心者があまりにもかわいそうでは?
>>517
>条件判定に0.001秒かかるとし

その数字に何の "根拠" があるのか、小一時間問い詰めたい。
条件判定に1時間かかるプログラムがあっても全然おかしくないと思うが。
525デフォルトの名無しさん:04/02/14 18:47
> その数字に何の "根拠" があるのか
測ってみろよ > ぼけ
もっと差は大きいぞ
526デフォルトの名無しさん:04/02/14 18:49
whileとdo-whileの差で「速度」なんて言う出すやつがいるあたりで
もうすでにだめだめだなあ。
本気でそう思い込んでいるのか? もしくはどこっかでウソ教えられてたり。
void f ();
int a[] = {1, 2, 3, 0};
void g (int i) {}

int main ()
{
int i;
for (i = 0; i < 1000000000; i++)
f ();
return 0;
}
-------------------------------------
void g (int);
extern int a[];

void f ()
{
int i = 0, j;
//while ((j = a[i++]))
//g (j);
do
g (a[i++]);
while (a[i]);
}
これdoとwhileで4秒程差がでるよ。
528デフォルトの名無しさん:04/02/14 19:00
ひでー
いったいどんなコンパイラーだ?
>>525
計るって、一体どのコードを?
条件判定に1時間かかるプログラムを計れば、
明らかに1時間の処理時間の違いがでると思うが?
>>527
条件文を 1000000000 回省略してようやく4秒か。
くだらね。
531デフォルトの名無しさん:04/02/14 19:03
>>527
それ、doも使えるってことは、
a[0]に'\0'はあり得ない、つまり空文字列はない前提ってことよね?

現実的にそんなソースあり得ないのでは?
(バグならともかく)
>>509見苦しいな。

極めて例外的な状況でしかdo/whileの条件文一回の省略が
速度的に有意な違いをもたらすことはない。

したがって、一般的な命題としては
>  1回以上動くことがわかっていて、スピード重視ならdo
は誤り。
>>529
do-while ループ脱出時の条件判定で1時間かかることはない
という前提で?
>>531
そういうこと。
doで十分のときにわざわざ遅くなる可能性のあるwhileにする必要はないって話しでしょ?
>>534
whileで十分のときにわざわざdoを使う必要はないって話だが。
>>527
1回あたり 4ns か。
1箇所あたりってのもコード書いてるときの内心にはあるな。
4ns ずつ遅れるコードから、これまた 4ns ずつ遅れる関数を呼び出し・・・
>>535
>>509には一回以上動くことがわかっているって書いてあるじゃん。
>>531
gets に食われてるよこいつ (プ
スプリンター
靴や走法を研究するのが勝ち組。
髪の毛が靴についた泥を払うのに気を取られたやつは負け組み。
>>537
>>511が普通だ。一人でやるんなら好きに書けばいいがな。

それから、
> 一回以上動くことがわかっているって書いてあるじゃん。
これをいちいちドキュメントしとかないといけないし
誤使用にも注意する必要がある。

これらのコストにたった4nsはみあわない。
>>540
見合うかどうかを、問題とコストを定量的に検討せずに、何がわかった気になってるんだ?
別にさ、4ns が万事に重大って言いたいわけじゃないんだよ。
何と比べてるのかをはっきりさせずに、頭から決めてかかる
その非科学的な態度が問題だって言ってるのがどうしてわからんかね。
>>540
同意。

ただし、技術者として >>512 のように、「無関係」なんて言い切るのも問題だと思う。
まったく関係ないことと、実用上関係を無視して良いこととは区別した方が良いと思う。

まあ、そもそも >>509 が一番アフォだとは思うけどな。

>>541
心配なら君が定量的に検討すればいいと思う。
ここでぐたぐた言ってても、科学的な態度とはなりえないからな。
実際問題、初回必ず真になるwhileならコンパイラがdo-whileのごとく最適化し得る。
よって、速度云々ではなく文脈で決定するべきでは?
たとえば、

do{
  処理1;
  if (ほかの処理の軽い条件式) break;
  処理2;
}while(データベース問い合わせ処理の結果を参照する関数を用いためちゃ重い条件式);

なんて場合だってありえる訳だ。
中の条件式で抜けるケースがほとんどなら、かなりの速度差がでることになる。

まあ、最適化の時に考えればいい話ではある。
>>543
> 実際問題、初回必ず真になるwhileならコンパイラがdo-whileのごとく最適化し得る。

条件式が初回に必ず真になるだけじゃダメ。
その条件式の副作用も考慮しないといけないから、簡単なループカウンタぐらいでないとなかなか難しい。
>>544
中の条件式で抜けるケースがほとんどなら、こんなコードは書かないけどな。
547デフォルトの名無しさん:04/02/14 21:03
>>533
> do-while ループ脱出時の条件判定で1時間かかることはない
「判定1回に1時間かかるかもしれない」とか言い出してまで「時間優先ならdo」は
かなりまぬけだぞ。まだみっともなく暴れるのかな?
548デフォルトの名無しさん:04/02/14 21:05
>>527
1000000000回も繰り返すループ(つまり何度も実行される)コードにおいて
たったの4秒ってのは「速度の問題」とはいわんし、
1000000000回も繰り返されるループの中だったら、関数を1段呼び出すコストのほうが
よほど大きい。(fからgを呼び出さずに構造を見直すほうがよほどいい)
なので、もしそういうコードがあったとしても、「速度の問題でwhileよりdoにしたほうが」
とかいうやつがいたらかなりマヌケなことは間違いない。
549デフォルトの名無しさん:04/02/14 21:07
> 極めて例外的な状況でしかdo/whileの条件文一回の省略が
> 速度的に有意な違いをもたらすことはない。
これも変だな。さきほどあった例でさえ「速度的に有利」なわけではなく、
「1回判定を省ける」にすぎない。1回判定を省くことが「速度的に有利」につながる
例など「極めて特殊」なのではなく、実際には「ない」わけ。
550533:04/02/14 21:07
>>547
何を勘違いしているんだ。
551デフォルトの名無しさん:04/02/14 21:07
> ただし、技術者として >>512 のように、「無関係」なんて言い切るのも問題だと思う。

いいや、そう言いきるその彼のほうが、技術者として「正しい」。
(数学者だったらどうかしらんが)
なにこのスレ・・・
553デフォルトの名無しさん:04/02/14 21:08
> 別にさ、4ns が万事に重大って言いたいわけじゃないんだよ。

いまさらじたばたしたって見苦しいだけ。
554533:04/02/14 21:08
誰彼の見境が無くなってるな。
555デフォルトの名無しさん:04/02/14 21:11
だったら最初からifとgotoで書けばいいじゃん ;-)
どうでもいいけどあの例を書いたの>>509じゃないから。
意味があるないは別として速度に差が出ないとは言い切れないのではということで。
557デフォルトの名無しさん:04/02/14 21:15
「速度に差がでない」ではなく
「速度的な問題はない」だろ?
あと
「速度優先ならほげ、は無意味」と
558From:532 :04/02/14 21:19
>>549
> > 極めて例外的な状況でしかdo/whileの条件文一回の省略が
> > 速度的に有意な違いをもたらすことはない。
>  これも変だな。さきほどあった例でさえ「速度的に有利」なわけではなく、
>  「1回判定を省ける」にすぎない。1回判定を省くことが「速度的に有利」につながる
>  例など「極めて特殊」なのではなく、実際には「ない」わけ。

条件判定が極めて重い場合は一回判定を省けると速度的に有意な違いがでるんだが。
509以外にもいろんなひとがいるなぁ…
こいつら新手の荒らしか?
560デフォルトの名無しさん:04/02/14 21:31
> 条件判定が極めて重い場合は一回判定を省けると

そういう場合は「0回もありうる」パターンだけでしょ。
少し頭を使えばわかるのに。
561デフォルトの名無しさん:04/02/14 21:33
>>506
っていうか、1回の条件判定の差がそれほど決定的に速度問題になるのだったら、
「1回はかならず実行してしまう」ループより「必要なければ0回で済む」ループ組むほうが
賢いじゃん。
>>548
だからあんたは非科学的だと言うんだよ。
4秒が「たったの」と、全体量を聞きもせずになぜわかるんだ?

いまさら全体量を出してきて「たったの」と言い直しても遅いんだよ、
既成事実の中にある何が問題かわかるよね?
これも今更どうでもいいけどfからg呼んだりしてるのは
単に最適化でコードが消えないようにと思ってしただけ。
一ヶ月前に書いたコードを読み直してみたがわけわからん。どうしよう。
565デフォルトの名無しさん:04/02/14 22:42
ちゃんと書いてなかったからでしょう。
きちんと解りやすくかけば、あとでみてもわかります。
「1か月後の自分は他人」だということです。
「他人に解りやすいコード」は、「未来の自分」にも読みやすい。
566デフォルトの名無しさん:04/02/14 22:43
> 4秒が「たったの」と、全体量を聞きもせずになぜ
こいつぼけ。
1000000000回繰り返しての4秒だろ?
1回あたり何秒かわかるか?
早くこいつら出てってくれないかなぁ・・・
>>566
じゃ、お前言ってみろ。ぼけじゃなきゃ、実測せずにわかるんだろう?
int f(void){return f();}

void TEST_do_while(){do{break;}while(f());}

void TEST_while(){while(f()){break;}}

do_while の圧勝だな。
「条件式は軽い処理」という前提でモノを考えていい場合と
悪い場合がある。
いやしくもCの技術者だったら、その辺の違いはわかるだろう。

極端な話、C++で比較演算子をオーバーロードすれば、
いくらでも重くすることができる。

言っておくが、ぜんぜん特殊なケースじゃないぜ。
>>569
頭の悪さがうかがい知れる。
お前らの喧嘩が結構勉強になったりもするんだよなー
>>572
聖戦と呼んでくれ
574デフォルトの名無しさん:04/02/15 00:40
ポインタと参照はどうちがうんでつか?
C言語としては、参照という概念の実装が、
ポインタの一部分を構成しているといえる。
(; ・`д・´) !? (`・д´・ (`・д´・ ;)
気にしてない人が多いと思うけど
次の様なカウンタの場合、速度にwhile()とdo{}while()で、差が出る
(コンパイラは、そこまで最適化してくれない)

while(i--){…}
if(i)do{…}while(--i);i--;//i--は必要ない場合が多いが…

まぁ、コンパイル後のアセンブラのソースを思い浮かべれば
その理由は一目瞭然なんだけどね…
といっても、ループ内に使われる変数の数や種類を調整したり
処理する順番を入れ替えたりした方が、効果的だけど…
(大前提として、アルゴリズムは、徹底的に見直しておく)

まぁ、本来は、ループの頻度の高い関数は
一度、コンパイラで最適化&アセンブリ言語に変換してから
それを、参考に、ループの部分を書き直すのが一番楽だったりするけど…
うああああ
やっとプログラム完成したあああ!
ふぅ、寝ます。
579デフォルトの名無しさん:04/02/15 02:33
#include<stdio.h>
typedefstructdat
{
unsigned int dat1;
unsigned int dat2;
}DAT;
int main(void)
{
DAT src_dat={1,22};
DAT copy_dat;
copy_dat=src_dat;
}

#include<stdio.h>
typedefstructdat
{
unsigned int dat1;
unsigned int dat2;
}DAT;
int main(void)
{
DAT src_dat={1,22};
DAT copy_dat;
copy_dat.dat1=src_dat.dat1;
copy_dat.dat2=src_dat.dat2;
}

上のプログラムと下のプログラムでは、処理内容が同じだと思いますが、
下のプログラムの方が(プログラム領域の)メモリの消費量が多い
のでしょうか?
メモリの使い方について、最近、勉強しています。分かる方、教えてください。
>>579
なわけない
コンパイラに訊くしかないだろ。
582579:04/02/15 02:52
メモリの使い方が分かりやすいページなんてありませんかね。
        / ̄ ̄ ̄\
       i'___{_ノl|_|i_トil_|i
      |,彡 ┃ ┃{.i|
      》|il(_, ''' ヮ''丿|      ファサッ
      ノリ i/つ( ̄`ヽO_ノ⌒ヽ
      /ノ l|ノ   )        \ ))
       (__丿\ヽ ::    ノ:::: )
           丿        ,:'  ))
        (( (___,,.;:-−''"´``'‐'


          / ̄ ̄ ̄\
          i'___{_ノl|_|i_トil_|i
          |,彡 -‐ ‐-{.i|  < おやすみ〜
         》|il(_, ''' ヮ''丿|       
         ノリ i/  _ノ⌒⌒⌒`〜、_
        ( ̄⊂人 //⌒   ノ  ヽ)
584デフォルトの名無しさん:04/02/15 03:12
C言語はA言語とB言語に比べてスケベ度がDEEPなのでしょうか??
>>579
コード領域に差がでる「かもしれない」程度なので、
さほどメモリには効いてこないと思うが。

ただ、ループの中でコードがキャッシュに入りきるかどうか、
なんて状況では考慮する価値はあると思うけど、
昨今のプロセッサはキャッシュでけえしw

こういうのはコンパイラの最適化オプションによっても変わってくるし、
勉強だと思ってアセンブラコードを吐き出させて見てみたら?

とはいえ、その知識はそのコンパイラの同じバージョンでしか
通用しないと思ったほうがいいけどね。
もちろん性能にクリティカルに効いてくるのなら考慮すべし、なんだけど、
一般的な答えは「気にするな」だw
小数点以下20桁くらいを表示する方法というのは無いでしょうか?
>>586
あるが、何のために必要なのかを先に書いたほうがいいぞ
588586:04/02/15 07:40
>>587
自分の勉強のためです。(宿題とかではないです。)

調べて見ましたが分かりませんでしたので。
589デフォルトの名無しさん:04/02/15 07:44
表示できるかどうかではなく、
そもそもそんなに値が保持されているかどうかを
考えろよ! ぼけ
590デフォルトの名無しさん:04/02/15 07:52
> C++で比較演算子をオーバーロードすれば、いくらでも重くすることができる

また、往生際悪くごまかそうとしてるし...
ふつうそこまでみっともないことしたくないと思うのがふつうだけどなあ
>>589
なに言ってるんだ?こいつ。浮動小数点演算を使わなければできるだろ?
%fにしたら6位までしか表示されなかったから教えてということじゃないのか。
593586:04/02/15 08:45
>>592
はい、そういうことです。

>>591
>浮動小数点演算を使わなければ
どうすればいいでしょうか?
初心者なので自分では思いつかないんですが。。。
>>593
%.20f
>>593
多倍長演算という物も知っておくといい
596586:04/02/15 09:27
>>594
やってみます。

>>595
検索したらいろいろ出てきました。
しばらく自分でやってみることにします。
http://www.asahi-net.or.jp/~RP9H-TKHS/kakuri01.htm
これ見たらやべえ、今まで乱数の使い方まちがってたかも・・・・
ショック_| ̄|○
>>597
内容ワラタ
>>593
一般的なdoubleは精度が高々16-17桁しかない。
従って、それ以上の精度が必要ならlong doubleやその他の手段を検討する必要がある。
>>597
>1個ずつ投げて300回目まで投げたときに6が100個出ていたとしよう。

そもそもこいつの理論では起こりえない事象を持ち出して何をかいわんや
>>597
ネタをネタと見抜ける人でないと(ry
亀を追い越せないアキレスの話くらいの練りが欲しい
>>597
>サイコロをふって6が出たとき次も6が出る確率
>6が2回続けて出る確率

同じ意味じゃないと思う俺は逝ってよし?
_| ̄|○ 釣られた・・・
>>601
ネタとして面白くない

>>602
禿同。そこからのひねりが何パターンも思いつかない香具師は
ネタは書かない方が良い。
>>606
>ネタとして面白くない

この一文、ネタに騙された悔しさがにじみ出ているな。(w
なんで1つのネタでケンカするの?
609デフォルトの名無しさん:04/02/15 12:44
ポインタですが、

(*p+1) == (*p)+1

であってますよね?
>>609
そのくらい自分で調べろ!
#include<stdio.h>
int main(void){
int s[]={1,5};
int *p=s;
printf("%d",*p+1);
return 0;
}
#include<stdio.h>
void main(void){
int a = 10;
int *p= &a;
printf("%d %d",*p+1,(*p)+1);
}
612デフォルトの名無しさん:04/02/15 13:27
C言語はなんでこんなに扱いづらいんですか?
長くなるとデバッグ大変だし、プログラムの整合性がとれなくなるし・・・

あ、俺がヘタレだからか!
>>597
あぁ・・・、HP 隠してあげたい気分だよ。
自己のプログラムのファイル名とパスを知るにはどう書けばいいのでしょうか
argv[0]
>>614
>1のリンクのC FAQくらいは見ておけよ
>>616
そこに目を通しているはずの君なら即答できるとおもうのだが、「argv[0]に自己のプログラムの
ファイル名とパスが渡される」と言う記述はどこにあるのだろうか。
>>617
あんた馬鹿か?文盲か?
>>618
ははは、8分かかって回答なしか。確かに19に記述はあるのだが。。。
まぁ君がどれくらい低脳かは良く分かったよ。それだけバカだと手っ取り早くここで回答を
得ようとする人間をやっかむのも無理はないことだな。
ただ、君は回答もできない低脳だと言うことだけは自覚して残りの人生を生きろ。(藁
>>619
もう帰っていいよ。
19章_システム依存
http://www.catnet.ne.jp/kouno/c_faq/c19.html

19.31:
どうすればプログラムが起動されたときの絶対パスを知ることができ るか。
A:
argv[0]に絶対パスやパスの一部が入っているかもしれないし、何も 入っていないかもしれない。
argv[0]にパス名が入っているが完全で ないときは、シェルのようなコマンド行を解釈する
ソフトがコマンド を探す筋道を真似ればいい。しかしながら確実な方法は存在しない。
622614:04/02/15 14:39
ちなみに614!=619
釣りみたい
FAQちゃんと読んでないのに質問したうちが悪かった
>>617がどうして616にからんでるのか理解できないのだが、誰かプロファイルよろしく。
馬鹿で文盲だからです
小さい頃のトラウマが原因だと思われる。
幼少期の虐待や、虐めです
くどい!よっぽど悔しかったみたいだな。
include <stdio.h>

void main()
{
int a=1,b=2
printf("1たす2は%d\n",a+b);
}
完璧?
>>628
include <stdio.h>
int main()
{
int a=1,b=2;
printf("1たす2は%d\n",a+b);
return 0;
}
>>629
#include <stdio.h>
631デフォルトの名無しさん:04/02/15 16:30
# はそんなに嫌い?

わたしは日立や東芝のほうが嫌いだが
>>628
#include <wchar.h>

int main(void)
{
int a=1,b=2
printf(L"1たす2は%lc\n",L"0123456789"[a+b]);
}
633デフォルトの名無しさん:04/02/15 16:32
printf("%dたす%dは%d\n", a, b, a + b);
634632:04/02/15 16:33
pintfじゃなくてwprintfだった。
635デフォルトの名無しさん:04/02/15 16:36
wprintf の意味をわかってないボケ
636632:04/02/15 16:36
#include <wchar.h>

int main(void)
{
    int a=1,b=2;
    wprintf(L"1たす2は%lc\n", L"0123456789"[a+b]);
}
637デフォルトの名無しさん:04/02/15 16:38
#defineswap(a, b)((a) ^= (b), (b) ^= (a), (a) ^= (b))

これをもっとスマートにできないでしょうか?
(2津の変数の内容を取り替えたいだけなんですが...)
#define swap(type,a,b) { type t; t=(a); (a)=(b); (b)=t: }
>>637
^=を使用したSWAPは注意しないとデータが消える
int x;
x = 1;
swap(x,x);
printf("%d",x);
スマートにやることにどんな意味が?
641638:04/02/15 16:55
Ouch! 最後がコロンになってやがる
642デフォルトの名無しさん:04/02/15 17:09
> Ouch! 最後がコロンになってやがる

ひろってきたやつなんで...
#define swap(a, b) b = a - b; a-=b; b+=a;
644デフォルトの名無しさん:04/02/15 17:11
>>639
> ^=を使用したSWAPは注意しないとデータが消える

試してみましたが、ちゃんとうごいてますよ? > swap(x, x);
特殊用途以外では、妙な方法に拘るべきではないけどな。
>>644
うちで試したら消えたな
Borland C++ 5.5.1
647デフォルトの名無しさん:04/02/15 17:25
消えるって、0になるってことですか?
そもそも何で消えるんだろ?
xorだから
>>647
そりゃあ計算追って行けばわかるでしょう
650デフォルトの名無しさん:04/02/15 17:40
>>647

消火器を使ったからではないでしょうか
妙な技法に拘らず、こうするのが安全。

#define SWAP(a, b, type) do { type c = (a); (a) = (b); (b) = c; } while(0)

XOR のは別なマクロを定義して、状況に応じて使い分ければいい。

#define XOR_SWAP(a, b) do { (a) ^= (b); (b) ^= (a); (a) ^= (b); } while(0)
652デフォルトの名無しさん:04/02/15 17:57
>>649
計算追っていったら消えないことになるのでは?
>>652
なんでよ
まずaが0になって、bが変わらないで、最後にaがbになるんじゃないの。
試してないから間違ってるかも知れないけど。
655デフォルトの名無しさん:04/02/15 18:03
do-whileや
{ ; ; } だと関数の実引数に書けないよね?
( , , ) にするほうがふつうでは?
要注意マクロの典型じゃねえか
大文字なのがせめてもの気休めだ

643 なんざ for のブレースを省略しただけですごいことになるぞ
for(pi = array;
>>654
そのaとbに同じものを指定した場合は?
>>657
マクロでaとbになってるから錯覚してた。
>>655
普通じゃない。関数の引数にする意味もない。
xorでの交換なんて、大昔にレジスタの値を交換するのに
使ってたヤツだろ。大抵の変数はメモリに有るから素直に
一時変数使った方が速いと思うが。
>>660
俺が習った当時は文字列の交換だったぞ
662デフォルトの名無しさん:04/02/15 18:31
> 関数の引数にする意味もない。

えー...したいのにー
>>662はバグとりに四苦八苦するタイプ
>>662
swapを関数の引数にする状況ってどんなのだ?
665デフォルトの名無しさん:04/02/15 18:40
しないの?
するからこそ、「式の値」を持ってないと困るのに。
swapの返値って一体……ずっと、void swap(...)だと思っていたが。
swap(a,b)として、a,bのどっちになるのが正しい?
例えば、
hoge(int,int,int);
とかあって、swapがどのような値かはどうでもいいとして、
hoge(a,b,swap(c,d));
とかするか?
>>662
釣ったね 親父にも釣られたことn (ry
const char *swap(int *a, int *b)
{
  static const char *ret = "スワップしました";
  int temp = *a;
  *a = *b;
  *b = temp;
  return ret;
}
#include<stdlib.h>
const char *swap (int *a, int *b, const char *msg) {
const char mymsg[] = "なにかをスワップして、";
char *newmsg = malloc(strlen(msg) + sizeof(mymsg));
int temp = *a;
*a = *b;
*b = temp;
return strcat(strcpy(newmsg, msg), mymsg);
}

const char *plus (int *a, int *b, const char *msg) {
const char mymsg[] = "なにかに1足して、";
char *newmsg = malloc(strlen(msg) + sizeof(mymsg));
(*a)++;(*b)++;
return strcat(strcpy(newmsg, msg), mymsg);
}

int main() {
int a = 0, b = 1;
printf("最初はa = %d, b = %d\n", a, b);
printf("%sおわりました\n", swap(&a, &b, plus(&a, &b, swap(&a, &b, ""))));
printf("結果はa = %d, b = %d\n", a, b);
}
同時にする意味無いしw
%3dのことをはじめて知った俺
それは、ちょっとやばいね。
ついでに、%03d のことも覚えておくといいかも。
674デフォルトの名無しさん:04/02/15 22:12
>>623
FAQ読めとか過去ログ読めと言う人に辟易していたとか
675デフォルトの名無しさん:04/02/15 22:27
%3dって何でつか?正に聞こうと思ってた。
676デフォルトの名無しさん:04/02/15 22:28
%3サーバ
677デフォルトの名無しさん:04/02/15 22:37
>>672
ついでに "%*d"のことも覚えといたほうがいいかも。
1、 char a[ ][3]={"ab","cd"};

2、 char b[2][3]={"ab","cd"};
ってどっち使っても同じですかね?
1のほうが使いやすいんですけど。
しかしFAQ読めとか言ってマナーについてうるさいわりには下らないレスを延々とつけてるね。
そんなレスつけるくらいならFAQに答えろよ。バカども。
680デフォルトの名無しさん:04/02/15 22:49
>>679
> うるさいわりには下らないレスを延々とつけてるね。
はげどう

で、どの質問だ?
>>678 同じ。
2という数字に何か意味があるなら強調するために2と書いて
そうでないなら好きにしるって感じじゃない?
>>678
要素を増減させる予定があるなら 1 の方が便利だし、
固定するつもりなら 2 の方が
何かの間違いで要素を増減させてしまった時に
警告が出るだろうからいいかも。
>>683
「増」ならエラーじゃねーの?
>>684
そだね。
686デフォルトの名無しさん:04/02/16 03:38
> ついでに、%03d のことも覚えておくといいかも。
とか言ってるやつは、
printf(""%-*d"", -6, 123); で右詰めになる処理系と左詰めになる処理系で
どっちが正しいか知ってるのだろうか?
687デフォルトの名無しさん:04/02/16 03:52
>>685
っていうか「減」でウォーニングでるコンパイラーなんかあるか?
(lintでさえ出ない)
688デフォルトの名無しさん:04/02/16 03:53
基本的なことをお尋ねしますが
C言語って何ですか??
>>688
クリームの入ったお菓子
中級言語
>>687
GCC は出るぞ。
692デフォルトの名無しさん:04/02/16 06:32
>>686
コンパイルエラーになる処理系が正しいだろうな。
>>692
コンパイル時にエラーにしようがないと思うんだけど…
694692:04/02/16 07:03
あ、>>686じゃコンパイルエラーだ、スマン。
>>678
決定的に違うのはsizeof(a)が返す値
>>695
すまん、関数の引数と勘違いしてた
駄目すぎ・・・>漏れ
strcatって第1引数のケツに第2引数を結合させるけど、第1引数の頭に第2引数を結合させる関数ってない?
sprintf
>>697
大して難しくもないし、自作すれば?
配列をひっくり返すrev()を作れ
A'==rev(A), B'==rev(B) とすると

strcat(A,B)
->[A][B]
 -> [rev(A)][rev(B)] -> [A'][B']
 -> [rev(A'B')] -> [B][A]


無駄すぎ。
/* 第2引数の頭に第1引数をつける */
char* strrcat(const char* str1, char* str2) {
 size_t len1 = strlen(str1);
 size_t len2 = strlen(str2);
 memmove(str2 + len1, str2, len2 + 1);
 return strncpy(str2, str1, len1);
}
703デフォルトの名無しさん:04/02/16 20:33
素直にsprintf使えや
このおたんこなす!
strlen,strcmp,stacpy,strcatを駆使して苦労して
いろいろ書いたのにsprintfを知ったらそれがほとんどいらなくなった

てのはけっこう通る道かも
>>703
具体的にどうするか書いてみ。
ただし、別にバッファを用意しちゃだめよ。
do while()文の例としては不適切な問題のような気もするが。

do while( (sum += a++) <= b)
誤爆(´・ω・`)
>>697
お前以前他のスレで聞かなかったか?
その時つくってやっただろう。
709質問:04/02/16 21:19
strcmpで二次元の文字型配列と文字型変数の比較は出来ないのでしょうか?
”関数呼び出し時、キャストなしで汎整数型からポイント型への引数受け渡しがありました。”
と表示されて上手くいきません。strcmpは文字型配列と文字型配列の比較時
のみ比較できるのでしょうか?
710質問:04/02/16 21:20
のみ比較できるのでしょうか→のみ使用できるのでしょうか?
711デフォルトの名無しさん:04/02/16 21:21
>>709
文字型変数ってのはchar変数のことか?
それならstring[0]==cこうやればいいと思うんだけど。
712質問:04/02/16 21:26
>>711
char変数の事です。
string[0]==cってどのあたりに書き込めばいいのでしょうか?
それ2次元じゃないじゃん
ちょっと食い違ってる気がする2人であった
>>712
どのあたりって、比較したいところでだよ(^_^;)
ああそうそう、string[0]==c&&string[1]=='\0'だね。
分かっていると思うけどstringがchar配列、cがchar変数。
>>713
ああ二次元か。
じゃあstring[n][0]==c&&string[n][1]=='\0'
716質問:04/02/16 21:31
>二次元の文字型配列と、(普通の)char変数
ですよ。
717質問:04/02/16 21:35
>>714
あぁ、少しやってみます。
ご返答どうもでした。
718貧乏紙:04/02/16 22:49
まったくどいつもこいつもCのポインターがまるでわかってないな。
俺様が暇つぶしに教えてやろう!
#include "stdio.h"
#include "string.h"

void main(){
/*ポインターとはその変数や関数のメモリ上のアドレスの先頭番地である。
配列もまたポインターで管理されている。つまり*/
char *ch_1,ch_2[128][128] = {"C/C++","java"},ch_3[128] = {"C/C++"};
/*と宣言すると*ch_1,ch_2[0][0],ch_3[0]はどれもその変数の先頭番地のアドレスが入る。*/

ch_1 = "C/C++";
if(strcmp(ch_3,ch_2[0]) == 0)
printf("OK!\n");
if(strcmp(ch_1,ch_2[0]) == 0)
printf("OK!\n");
}
つっこみどころいっぱいだけど、めんどうだからやめた
> ch_2[128][128] = {"C/C++","java"}
贅沢だな…
>>718
ちょっとだけつっこんでやる。
"stdio.h" → <stdio.h> /* カレントディレクトリに stdio.h があれば許す */
"stdlib.h"→ <stdlib.h> /* カレントディレクトリに stdlib.h があれば許す */
void main() → int main(void)
ch_2[0][0] == 'C'
ch_3[0] == 'C'
return 0; も知らんのか。
C FAQ 6章 配列とポインター
http://www.catnet.ne.jp/kouno/c_faq/c6.html
723貧乏紙:04/02/16 23:00
>>721
>>return 0; も知らんのか。
知ってるよ。
システムに0で正常終了を知らせる。
>>721
こいつ三流
>>721
>ch_2[0][0] == 'C'
>ch_3[0] == 'C'
このへんが三流
ポインタなんて入門書読んだ後に
トライ&エラーを48回くらい繰り返せば覚える。
ちょっと話が反れちゃうかも知れないけど、ごめんね。

よく、>>721のようにvoid mainのコード例が書かれると決まって int main に直してreturnするように
修正する香具師がいるんだけど、そんなに重要?ごく一部のコマンドが実装してればいいことじゃ
ないの?
>>721
stdlib.hなんで書いてないよ。三流。

>>718
ch_3[128] = {"C/C++"} と ch_3[128] = "C/C++"
ってちがうの?
>>727
g++だと void main じゃコンパイルできない。
error: `main' must return `int'
っていわれる。
今の状況・・・
      _
      ミ ∠_)
         /
         /   \\
 ウイーン  Γ/了     | |
  ウイーン  |.@|    | | ガッガッガッ
       | / | .     人
       |/ |    <  >_Λ∩
      _/  | //. V`Д´)/>>721   
      (_フ彡           /
>>729
あ、そうなんだ。知らなかったよ、ありがと。
>>721
> "stdio.h" → <stdio.h> /* カレントディレクトリに stdio.h があれば許す */
> "stdlib.h"→ <stdlib.h> /* カレントディレクトリに stdlib.h があれば許す */
このへんも三流。
" " で囲まれたファイルがカレントディレクトリになければ
(厳密には処理系定義の検索方法で見つからなければ)、
デフォルトディレクトリを検索に行く。
だから、むしろ stdio.h とかがない方が良い。
尤も、< > を使うべきなのは当然だが。
733デフォルトの名無しさん:04/02/16 23:19
""より<>の方が格好良いしね。
734デフォルトの名無しさん:04/02/16 23:20
> void main() → int main(void)

わざわざ「void」とかいてるし :-)

やーい > しったか
>>729
こいつも三流
736729:04/02/16 23:24
>>735
g++使っちゃだめ?
>>735
どこが?
>>729
g++ だとエラーだけど、
gcc だとウォーニングだな。
warning: return type of `main' is not `int'
739デフォルトの名無しさん:04/02/16 23:26
>>737
なんのスレか分かっていないことじゃないの。
>>734
C での (void) と ( ) の違いを知らない?
>>727
極端な話、返り値がある(int)か無い(void)かの差で
スタック等が狂う環境があっても、文句は言えないね
742729:04/02/16 23:29
>>739
なるほど。なっとくした。
ごめんなさい。
オレ三流。
>>741
おまえは黙っていた方がよさそうだぞ。(藁
>>727
bash の if で分岐できない。
>>744
固定で0を返すようなコーディングをするプログラムの終了コードを参照する方がバカでしょ。
だからそう言うツールを作るときには必要だといってるわけで、全てが必要なわけじゃない。
intにしたほうがソースファイルのサイズが減ってうれしい。
>>745
makeで使おうとして嵌りそうだな。
748貧乏紙:04/02/16 23:36
>>ch_3[128] = {"C/C++"} と ch_3[128] = "C/C++"
同じです。
>>732
>>尤も、< > を使うべきなのは当然だが。
C++さっきまで使ってたのでつい・・・
「尤も」なんてよむの?
>>746
いや、return文書くからサイズ増える。
>>745 想像力なさすぎ。
0が返ると保証されていなければ、
foo && bar
のfooのようなこともできないし、困りまくる。
>>748
もっとも
最もとは違う・・のはわかるか
(・∀・)ジサクジエーン
>>749
C++さっきまで使ってたのでつい・・・
>>754
なんちゅう例文だ。
ずいぶんの叩きあってまつね。
757貧乏紙:04/02/16 23:40
>>753
今、内税方式の消費税と本体価格を分離してそれを.txtとして出力するものを
作ってます。Serialize(CArchive& ar) 関数がいうことを聞いてくれなくて困って
一時休憩中です。
>>748
そんな漢字も読めないんじゃしょうがかないな。
>>750
実際にはそんなことは保証されていないんだけどね。(藁
760貧乏紙:04/02/16 23:46
グローバル変数に入力値とそれを分解して税の配列、本体の配列に格納までは
できたのですが、出力すると空っぽのファイルが出てきます。配列にはちゃんと
数値が格納されていますが、どうもSerialize(CArchive& ar) 関数から見えて
いないようです。
Serialize(CArchive& ar) ってグローバル変数が見れないの?
誰か教えて!
>>759
正常終了か異常終了かを呼び出し元(シェルとか)がどう扱うかが未定義なのは
ここの議論では重要なことではない。
>>760
スレ違いもいいところだ。
というか、グローバル変数なんかほいほい使うなよ。
>>761
では何が重要なの?
>>763
呼び出し元に正常終了と異常終了を判別する手段がある場合、
main の戻り値の型を void にしてしまうと
それが利用できなくなるという点が問題なのだ。
>>764
全然違う。
>>765
なんだとゴルァ
>>765
では何が重要なの?
768761:04/02/16 23:57
>>764
俺は何もいってないぞ、前のレスは他の香具師だ。
もう少し具体例をあげてくれないか?
仕様に準拠してないことが問題である!
>>769
なんの仕様?
>>770
Windows バグともいう
>>771
おまえも黙ってろ。
仕様の理由に言及せずに「仕様だから」とか
言えない人って頭悪そう。
以上、main 談義終了。
仕様の理由が何であろうと、
仕様に背いたコードの移植性が低下するという事実は変えようがない。
# 楽しそうにネタの応酬してるところすみませんよ。

規格でmainはintを返すことと規定されてるから、
ってのがこのスレ的にはもっとも正しい答じゃないかな。
>>774
とか -> としか
void *とか; //?
voidは「C言語」という言葉が嫌いなようだが、そのわりには以前このスレを荒らしていたな。
おっと、s/を荒らして/に書き込んで/
>>774
かってに決めつけんじゃねーハゲ!
>>774
「仕様の理由」ってなに?
>>783
バカは命令されればその通りに動くんだよ。理由なんてない。
11.14:
void main()と宣言してうまくいかないわけがないと思う。なぜなら main()から戻る代わりに、exit()を呼んでいるから。だいたい今使っ ているO/Sはプログラムのexit値/戻り値を無視する。

A:

main()から戻ってくるかどうかは関係ないし、そのステータスを見る かどうかも関係ない。問題はmain()の宣言がおかしいと、呼び出し側 (実行時のスタートアップのコード)がmain()を正しく呼び出すことす らできないかもしれないことにある。

君が使っているO/Sは終了時のステータスを無視して、void main()で もうまく動くかもしれない。しかし、このやりかたは移植性が低いし、 正しくもない。

786741:04/02/17 01:02
風呂に入ってる間に伸びてるね…
まぁ、取りあえず、ココはC言語のスレなんだから、規格に楯突くのはヤメレ
例え、どんなに無意味に見えても、それなりに理由はあるんだから
実際>>769が正しいよ。
決められてることを守れないやつは話しにならない。
ヤンキーの厨房みたいなもんだ。
788デフォルトの名無しさん:04/02/17 01:31
またvoidかよ。
789デフォルトの名無しさん:04/02/17 01:33
>>788、それネタ?
(だったら、「また、intかよ」にしないと...)
void氏の取り巻きだったら、
>>787に「はなしし?」とつっこまないわけがないし、
>>786に「そんなものはありません > 例え」って必ず言いますので!
790学生Cグラマー:04/02/17 01:55
WindowsXPとLinuxの両方で動くマルチプラットフォームのアプリを作ってるんですが、
実行バイナリはもちろん別ですが、データファイルは共通の物を使いたいんです。
で、そのデータの中に日本語が含まれるんですが、
文字コードはS-JISとEUC(FedoraのUTF-8はとりあえず置いといて、)のどちらに統一すべきでしょうか?
791デフォルトの名無しさん:04/02/17 01:57
>>790
スレ違いだがEUC-JP
792デフォルトの名無しさん:04/02/17 02:03
#include<stdio.h>
typedefstructdat
{
unsigned char dat1;
unsigned char dat3[3];
unsigned int dat2;
unsigned int dat4;
}DAT;
void init(const DAT*);
int main(void)
{
const DAT init_dat = {0,{2,3,4},1,5};
init(&init_dat);
return 0;
}
void init(const DAT *dat)
{
int i;
DATmain_dat[5];
for(i=0; i<5; i++)
{
main_dat[i] = *dat;
main_dat[i].dat1 = i;
}
}
793デフォルトの名無しさん:04/02/17 02:04
792のプログラムをメモリの消費量を減らすように
改造してほしいのですが、
お願いします
何か最近見たような気が。
795790:04/02/17 02:27
>>791
どもです。したらWindows側で変更するようにします。
あとスレ違い申し訳ないです(^^;) 他に見当たらないもんで…
796デフォルトの名無しさん:04/02/17 02:33
>>793
main_dat[]はどこからも参照されてないから削除。
init()も使わなれなくなるから削除。
init_datも必要なくなるから削除。
結果はこうなる。
#include <stdio.h>
int main(void) { return 0; }
>>796
int main() {return 0;}
shortにしる!
>>797が正解
>>798
仕様によりint
このうんこソースは何をしたかったんだ?
int main(void) { return 0; }
#include <stdio.h>

typedef struct _Dat {
int x;
int y;
} Dat;

int main ()
{
char *x ;
Dat a,b={44,55}; /* ←これはダメ */

x="hoge hoge"; /* ←これはダメ */
a=b; /* ←これはダメ */
printf("x:%s\n",x);
printf("a.x:%d a.y:%d\n",a.x,a.y);
return 0;
}

あんまり憶えてないけど。
カーニハンの本だとポインタに直接文字列入れるな
mallocしてstrcpy使えって書いてあるんだっけ?
あと「=」で構造体を代入するのは確かダメ。



チャレンジャーだなあ
>>803
自分はDat b={44,55};とa=b;バリバリ使ってる。なんでダメなんですか?
806デフォルトの名無しさん:04/02/17 07:25
シフトJISのほうにしたらたしかに馬鹿だな
807デフォルトの名無しさん:04/02/17 07:26
>>803
K&Rにそんなこと書いてねーよ ぼけ
808デフォルトの名無しさん:04/02/17 07:34
>>793
> 792のプログラムをメモリの消費量を減らすように

typedef structdat {
unsigned char dat1;
unsigned char dat3[3];
unsigned int dat2;
unsigned int dat4;
} DAT;

のメンバーの順序を変えて、
typedef structdat {
unsigned int dat2;
unsigned int dat4;
unsigned char dat3[3];
unsigned char dat1;
} DAT;
にすればいいですね。
Linux/gccあたりで実験してみなさい。

809朝から申し訳ありませんが:04/02/17 07:40
すみません教えて下さい。
絶対パスが実行できないのです。

c:\windows>cd \fonts

と入力してもディレクトリが違いますってエラーになるのです。
もちろんwindowsフォルダの下にフォントファルダはちゃんとあるのです。

c:\windows>cd \

と入力すれば
c:\>
とディレクトリのチェンジはされます。

OSがMeなので絶対パスが実行できないという事はありますか?
よろしくお願いします。
>>809
PC初心者板へどうぞ
>>810
初心者板ですね。
やはりその程度の質問ですよね。。
すみませんですた。

ヒントだけ頂けませんか?
やりたいことは
cd \windows\fonts
ですか?
どこがC言語の質問なんだ
ありがとうございます!

昨日10日で覚えるC言語ってのを買ってきました。
そしたら初めの方に相対パスと絶対パスってのがありまして、
相対パスの理屈はわかったのですが、

絶対パスの実行が本のとうりに実行しても
私の環境だと本のとうりに実行されず、
ディレクトリの指定が正しくありませんと出ます。

やりたいのは
c:\windows>cd \temp
だけなのですが、
このコマンドでエラーになるって事はありえますか?
>>814
PC初心者板でやれ。
md \temp
しとけ
cd \windows\fonts
と、入力すれば
C:\windows\fonts>
となるのですが、

本には絶対指定なので、カレントディレクトリがどこにあろうと関係ありません。
と書いてあります。

cd \windows\fonts
ではなくて
cd \fonts
でも
windowsの直下にあるディレクトリならば直接コマンド入力をしても大丈夫ですよって意味だと
解釈しているのですが違うのでしょうか?

あ、非難のレスが。。
そうですよね。分かりますた。帰ります。
ありがとうございました。
ディレクトリのツリー構造を分かっているのかと子一時間
> windowsの直下にあるディレクトリならば直接コマンド入力をしても大丈夫ですよって意味だと
> 解釈しているのですが違うのでしょうか?
ハゲしく違う。どうすればこんなスゴイ誤解ができるのか謎
とにかく言えることは

 プ ロ グ ラ ミ ン グ 以 前 の 問 題

だから、板違いは放置しろってこった
質問です。

int型の二次元配列a[5][10]を作って、それを引数として関数に渡したいのですが
どのように指定したらいいのでしょうか?
例えば
main () {

int a[5][10];

function(???);

}
の???の部分です。
プロトタイプの引数指定の仕方もわからないです。

一次元配列だとa[5]とかでfunction(a);で
うまくいくのですが二次元配列だとうまくいきません…
誰か教えていただけませんでしょうか?
>>821
void function(int str[][10]){

}

main () {

int a[5][10];

function(a);

}
>>821
a[5]をaで*aに渡せて、a[5][10]をaで*aに渡せないというのはあるが、
a[5]をaでa[5]、a[5][10]をaでa[5][10]は両方いける。
つーか、>>1のFAQ嫁
この質問は頻繁に出るよな。
826821:04/02/17 11:00
>>822 >>823
ありがとうございました!
>>824 >>825
以後気をつけます
827デフォルトの名無しさん:04/02/17 11:07
WinMainのlpCmdLineのコマンドライン引数をCommandLineToArgvWで
argv形式に変換した場合

lpCmdLine (NULL)c:\document and settings\(いろいろ...)
argv[0] c:\document(NULL)
argv[1] and(NULL)
argv[2] settings\(いろいろ...)
みたいな感じで分けられてしまうんですがどうしたらいいでしょう?
"c:\doc... setting\.."のように"で括れ。
829デフォルトの名無しさん:04/02/17 11:20
ファイルから"1ビットだけ"読み書きする方法はないでしょうか?
今のところ、freadで1バイト読み出して、そこをゴニョゴニョと加工しているんですが、
なんだかめんどくさくて・・・
830デフォルトの名無しさん:04/02/17 11:24
>>829
ない。
どこが面倒なんだよ。
ワロタ
832614&&827:04/02/17 11:35
>>828
今気づいたけど
lpCmdLine++;
wcscpy(my_path,lpCmdLine);ってやると大体出せる
けどなぜかコマンドプロンプトで引数付きで呼び出すと自分のパスが取り出せない
WinMainとは違ってなんかややこしいね

>>829
int b=(読み込み)
b&0x00000001

そもそもファイルはセクタサイズで読み込んでいる気がする
>>827
>WinMainのlpCmdLineの

明らかにスレ違い
834デフォルトの名無しさん:04/02/17 14:42
C:\source>bcc32 sample1.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample1.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: オプションの間違い : Lc:\Borland\Bcc55\lib

コンパイルでエラーがでるのですが、
Fatalってなんでしょうか?
英和辞典って言葉、聞いたことあります?
さすが教えて君だね。当然お礼は無しでシカトだよ。(藁
838834:04/02/17 15:21
>>837
あなた性格悪いですね。

>>834
のレスを読んでFatalそのものの意味を聞いた訳ではない、
って事くらい分かりますよね?
質問しておいて、でかい口叩くなって言われてもしょうがないですが、
あなたは私をオチョクリ杉だし、性格悪いですよ。(藁
839デフォルトの名無しさん:04/02/17 15:22
fatalかそんなこと聞くやつは致命的
                  ~~~~~~~
やれやれなんでお前らは漏れが
ちょっとでも目を離すとすぐけんかするんだw
>>838
>>834のレスを読んでも、Fatalそのものの意味を聞いたとしか思えないが
>>841
禿同

>>834は典型的な教えて君。
質問の仕方がわかってない。
何でエラーが出るか教えてほしければ
おのれのソースをさらせ。
>>838
>>834のレスを読んでFatalそのものの意味を聞いた訳ではない、って事くらい分かりますよね?

誰もわからないと思うよ。もう少し説明してみ。
>>834>>838
>>837はまとも
>>834のほうが性格悪いと思われ
>>842
>Fatal: オプションの間違い : Lc:\Borland\Bcc55\lib
    ~~~~~~~~~~~~~~~~~~~~~~~
よって、>>834はヘルプも読まないバカ。
846834:04/02/17 15:41
>>841
そうですね。
分からない事と彼女に振られた事と嫌なことばかりで
少し感情が高ぶっていました。

>>837さん申し訳ありませんでした。


>>838
>>834のレスを読んでFatalそのものの意味を聞いた訳ではない、
>って事くらい分かりますよね?
Fatal Error: 未定義の暗黙の了解。
848846:04/02/17 15:42
マターリしようや
849848:04/02/17 15:43
あらら846とられちまった。
>>834 を読んだら、10人中10人がFatalの意味を聞いてると捉えるだろう。

「オプションの間違い」という「日本語」を無視して
「Fatalってなんでしょうか?」と聞いているのだから。
彼もあやまったことだし終わりにしようや。(w
自分の性格が悪いことも>>838で認めてるしな。
ところで>>834でオプション指定して無いようだが
何でこんなリンクエラーが出るの?ハイフンが無いって言ってるように見えるけど

って思い切り環境依存してるな、、オレBCC持ってないしな
そんなんだから彼女にふられ(ry
>>853
設定ファイルの内容が間違っているとか
856697:04/02/17 16:12
>>698
サンクスコ。
上手く逝けますた。
#include <stdio.h>
...
#pragma ごにょごょ
...

たぶん↑のようになってなってんだろ。
ilink32.cfg(だったかな?)が間違ってたりして
ぬるぽ
          _
      ミ ∠_)
         /
         /   \\
 ウイーン  Γ/了     | |
  ウイーン  |.@|    | | ガッガッガッ
       | / | .     人
       |/ |    <  >_Λ∩
      _/  | //. V`Д´)/ >>859
      (_フ彡           /
>>859
ガッ
862859:04/02/17 20:55
     ___       _―― = ̄    ̄`:,
  . /⌒___ \    /  _  __― _ノ'
  /_/     \ \ /  /  ∩  ∩ ̄  ̄ ̄  
           \ \ '    (・∀・| | ウヒョー
           ((   |      |     |
           |  ∩    ⊂⊂____ノ
           |  | |        彡
           |  | | 
           |  / |  
           /   / 
           ~^~^~^~  
main の関数原型を1つに限定しろ言うだけなら、おいらも納得だけどね。
だったら引数の2通りの解釈もやめるべきだろ。
int を返すように外部参照されている関数を戻り値なしで定義したら不具合の可能性がない事を証明(悪魔の証明)できないと言いながら、
2引数とるように外部参照されている関数を引数なしで定義しても不具合の可能性がないとか言ってるあたり、
従うに値しないアホルールじゃん。もうひとつ、そんなのしかでしゃばる場面のないアホPGに餌をやらないで欲しいし。
>>863
何か勘違いしてるヲカン
main()はintを戻り値とし、(適切な型の)0個か2個の引数 を持つと定義しなければならない。
引数は3個
アホPGでも何でもいいんだが、せめてC-FAQくらい一通り読んでから言ってくれ。
http://www.catnet.ne.jp/kouno/c_faq/c11.html
>>867
あと1こはなんでつか
870デフォルトの名無しさん:04/02/17 22:21
> だったら引数の2通りの解釈もやめるべきだろ。

もともと1通りしかありませんよ?
int main(void) と使えば0引数の main を呼び出すスタートアップがリンクされ、
int main(int, char**) と使えば2引数の(以下略)る。
両者のスタートアップが同じ可能性もあるが、処理系依存。
872デフォルトの名無しさん:04/02/17 22:36
>>871
かなりのしったかぶり
873デフォルトの名無しさん:04/02/17 22:39
C++やJavaやCで、

たとえば、
for (int i = 0; i < MAX; i++) {
...
}
と書いた場合のiのスコープはどういう範囲が理想だと思いますか?
(実際の文法と違ってもいいので)
for 文内のみだろ。
875デフォルトの名無しさん:04/02/17 22:42
文内
876デフォルトの名無しさん:04/02/17 22:43
いや、実際どうかじゃなくて、
「どうだと便利か」という質問です。
877デフォルトの名無しさん:04/02/17 22:44
>>876
for文内のみ
文内のみじゃなくなったら不便じゃない?
879デフォルトの名無しさん:04/02/17 22:45
たとえばCで、
for (int i = 0; i < MAX; i++) {
if (a[i] != 0)
break;
}
とかすることよくあるじゃん。
そんなときに他の変数つかいたくないしー
>>879
ない。
VC++6.0ではfor文抜けても生きてた気がするけど
.netではこのバグ治ってるの?
>>879
>for (int i = 0; i < MAX; i++) {
きっとANSI C規格外
883デフォルトの名無しさん:04/02/17 22:49
C++は途中で文法変わったじゃん。スコープに関して。

Cはforの中で使えるようになってからはずっと一緒だけど。
>>881
直ってる。
VC++ 6.0 でも
#define for if(0) ; else for
とすることで対処できる。
>>882
C99 では OK だったはず。
886デフォルトの名無しさん:04/02/17 22:51
forループ内のみで十分…
forループに絶対必要なループ変数(i,j,k...)が
ループ外で参照されないこともあるんだし
887デフォルトの名無しさん:04/02/17 22:52
ANSIでもISOでもOKですね。
そんなのはC使いの常識。
>>879
i を外で定義すれば言いだけの話。
889デフォルトの名無しさん:04/02/17 22:56
定義じゃなくて宣言だろ?
宣言と定義の違いもわからんぼけか。こいつは。

外で宣言したらつまんないじゃーん。ふつうすぎ。
せっかく実行文よりあとでも宣言できるのに。
>>881
バグじゃない! 確信犯的な仕様だよ、オプションあるし。
客相手の商売を知らない坊やに判らないのも無理ないけどね。
891デフォルトの名無しさん:04/02/17 22:58
for (i = 0; i < MAX; i++) {
int i;
...
}
ができる(ループがちゃんと回る)のはどの言語かわかるひとー!?

また、Java、C++、C、Objective-Cでのふるまいの違いを延べよ。
892882:04/02/17 22:59
>>885
そうですね。
このスレで漏れは必要とされているらしい。
>>889
宣言は以下の場合を除いて定義と同義。

1. 関数のプロトタイプ宣言。
2. extern がついていて、初期化や関数の本体がついていない。
3. typedef 宣言。
>>890
仕様が変われば、バグでなかったものもバグになるのさ。実質的に。
896881:04/02/17 23:09
>>884
治ってるんですか。意外だ。
>#define for if(0) ; else for
>とすることで対処できる。
なるほど。
{ }で囲むぐらいしか思いつかなかった。
まあオレはVC使ってないが。

>>890
仕様のバグですな。
オプションあるなんて知らんかった。
VC++ のバグは

for(int i=0; i<10; ++i)
;

for(int i=0; i<10; ++i)
;

とやると2回目に「既に定義してんだろゴルァ」って
898デフォルトの名無しさん:04/02/17 23:18
> 宣言は以下の場合を除いて定義と同義
いいえ、ぜんぜんちがってます。
>>898
ソースキボンヌ
>>898
どうちがんですか
定義ってのは変数で言えば
実体の生成を伴う宣言のことだよ。
902デフォルトの名無しさん:04/02/17 23:23
じぶんでとってくださいな。おーとさん。
(と、いいつつコロッケ食べる)
そんなことより、do-while の中で宣言した変数を
その while の条件式内で使いたい。
おたふく?
今、力作のボロネーゼを煮込み中だぜ。
do{
int i=0;
++i
}while(i<10);

何か?
>>906
error: `i' undeclared (first use in this function)
>>898 は脳内仕様に染まっているようです。
レベル低すぎ
リンカわかってないヒヨッ子はしばらくROMってろ
>>894 は C++ の仕様票から(C に関係するとこだけ)抜粋したんだが、
C の仕様だと違ってくるのか?
>>894
4. 中身のない構造体型、共用体型、列挙体型の宣言。

以下、ANSI C/C++ 辞典より抜粋:
■定義
識別子によって名前付けられたオブジェクト(変数)や関数のために
記憶域の確保を行う宣言。
前処理指令ではマクロ名に対する置換の並びを定めること。
912906:04/02/17 23:44
ダメぢゃん

{ int i;
 do{
  ++i;
  :
 }while(i<10);
}
とか。
今日、会社でCのソースをみていたら、
構造体の代入をけなげにもメンバ同士で一つ一つmemcpyしている部分に
出くわしました。

そこで一応確認ですが、=でまとめて代入できるって、規格ですよね?
>>912
今の仕様ではそうせざるを得ないんだよね。
何とかして欲しいよ。まったく。
>>913
規格。
ただ、メンバにポインタがある場合は注意。
といっても、memcpy してるだけのものなら大丈夫だけどね。
struct t a,b;
って時の
a=b ?

なら問題ない
あと、struct Hoge { ... ; char str[1]; } とかも要注意。
>>914

でもよく考えたら
{ int i;
 :
}
の後ろで i が使えたら困る
>>918
つかえないからこまらないでしょ
>>916
a = b; は memcpy(&a, &b, sizeof (t)); と「実質的に」同じ。

ポインタで注意すべきってのは、
例えば
 struct t { int a; int* b; } a, b;
 b.a = 0;
 b.b = &b.a;
としたときに、
 a = b;
だけでは a.b が &a.a にはならないってところ。
>>919 いや do while()で、って話
922913:04/02/17 23:59
やっぱり規格ですよね。了解しました。

あ、struct同士の代入が行われた場合、実際の動作はmemcpyと
同様とみなしていいんでしょうか?
つまり、ヌル文字列のメンバのような、使われていない部分のメモリも
コピーされているんでしょうか。
923913:04/02/18 00:00
>>920
あ、時間差で了解しました。
ありがとうございます
>>922
そら当然。
まぁ、パディングの部分までコピーされるかどうかは知らんがね。
>>917
何に注意すんの?

int main(void)
{
  struct hoge {
    char c[1];
  } a, b;

  a.c[0] = 'a';
  b = a;
  printf("%c, %c\n", a.c[0], b.c[0]);

  a.c[0] = 'b';
  printf("%c, %c\n", a.c[0], b.c[0]);

  return 0;
}

実行結果
a, a
b, a
>>925
可変長配列メンバ
927デフォルトの名無しさん:04/02/18 00:14
>>922
メンバーをいちいちコピーしているソースがあったのは、
「ちょっと前まで構造体の代入はできなかった」という事情のため。
C89のちょっと前あたりからできるようになってきた
printf()とかputs()とかで表示する文字列に日本語使うのはよくないってほんとですか?
929デフォルトの名無しさん:04/02/18 00:24
>>926
だったら[1]はダサいから[0]にすればいいのにー

>>928
イタリア語ならOKですよ。
>>928
wprintf(L"にほんご");
みたいなのはよくみますね。
>>928
日本語を表示するだけでよくないとか言われるような言語を使うな。
そういうこと気にする場面でリテラル使うなアフォ
>>929
> だったら[1]はダサいから[0]にすればいいのにー
処理系独自の拡張機能だな。
C99 でも [ ] だし。
934913:04/02/18 00:35
>>927
なるほど、やはり使えない時代もあったんですね。
会社の人が「構造体の代入?ムリだろ」とかいうので不思議でした。

たぶん会社で使っている某トランザクション処理システムのマニュアルに
載っているサンプルが古いせいで、みんなそれに合わせて作ってるんだと思います。
標準Cでない場合のプリプロセッサマクロが書いてあったりするので・・・。

>>928
printf/puts自体には問題はありませんが、
プログラム中に日本語文字列をうめこむのはよくないともいえます。
>>935
コメントはいいけどね。
リテラルもコンパイラ固定でいいなら問題ない
(もちろん、日本語に対応したコンパイラで、ね)。

リテラルを直接 printf とかに渡すことに対する是非は
また別のお話。
937デフォルトの名無しさん:04/02/18 00:57
>933
えー、C99でも[0]もつかえるでしょ?
>>937
warning: ISO C forbids zero-size array `c'
>>937

>>933 は C99 より前では [0] は使えない(=処理系独自)という意味だろ?
>>937
>>939
使えない。
>>939
C99 でも [0] じゃなくて [ ] だって言ってるのに。
http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
942ニュー速帰りの928:04/02/18 01:09
皆さん、いろいろと意見ありがとうございます。
お礼に迫撃砲一人一本ずつどうぞ。

やっぱり日本語埋めはあんまりお薦めなことではないんですね〜
エラー日本語で出したり、データファイルから読み込んだのを
そのまま表示したかったんですが…
自分はCしか使えないので、頑張ってみます(^^;)
時と場合によるということで。
>>942
> エラー日本語で出したり、
これは可能な限りすべき。

> データファイルから読み込んだのを
> そのまま表示したかったんですが…
それに関しては特に問題ないが、
文字コードには気をつけるべし。
>> エラー日本語で出したり、
> これは可能な限りすべき。

そうやって甘やかすから、gccの出すエラーメッセージを読みもしないで、
動きませんといってくる初心者ばかり増えるんだ。
というネタは置いておいて。
ミンゲンヒ〜ナ〜
948928:04/02/18 01:41
>>943-944
はい。データEUCで保存→Winで動かすときはS-JISにコンバートして表示って流れにしたいんで、
S-JISで扱うときにうっかり八べえ、ってことの無いように気を付けますです。

>>945
gccのエラーメッセージくらい読めますよ…(^^;)
>>948
半角カナは SJIS と EUC とでバイト数が違うから注意ナ。
といっても、使ってないとは思うが。
>>948
お前のことを言っているわけではないと思うぞ。
951デフォルトの名無しさん:04/02/18 08:45
> やっぱり日本語埋めはあんまりお薦めなことではないんですね〜
いいえ、ごくふつうのことですよ。fputsでもprintfでも。
Cygwin の gcc は SJIS に対応してないのが悲しい。
puts("表示"); が変になってしまう。
puts("表\示"); なんて嫌だー。
953デフォルトの名無しさん:04/02/18 09:30
っていうか、せっかくcygwin使うのにSJIS使うなよ。ぼけ。
ふつうcygwinいれたらEUCにして改行はLFにするんだよ。

「表示」だけでなく「圭子」も「カーソル」も「記録機能」も
954928:04/02/18 11:20
開発は基本的にLinuxでやってるんで、ソースはEUC+LFで書いとります。
WindowsでビルドするときとLinuxでビルドするときで、
エラーメッセージの文字列を定義するヘッダファイルを分けようと思ってます。
gettextを使うという選択肢はないの?
956デフォルトの名無しさん:04/02/18 11:47
元々悲惨な1のいるスレだったんだねー。
なんか感慨深いなぁ
>953
ぜひcygwinでbashでeucでふつーに使える環境の作り方を教えてください。
某家電(量販)店が無償で配布されているオープンソースソフトウェアを自社開発と称して
自店商品の機能向上を謳って抱合せ販売していた模様。
また、この店ではオープンソースソフト単独でも販売し利益を得ていたようです。
開発元には、クレーム等の連絡先として開発者のメールアドレスを勝手に表記されていた為、
問い合わせメールが殺到し開発者のWebページが閉鎖に追い込まれています。(2004/2/16現在)
【店の身勝手で阿呆な言い分】
「これで有名になったんだから良かったと思ったほうがいい」
「ユーザーサポートの費用払ってやってもいい。
 その代わりソフトの権利はウチの会社でもらう。月1000円」
「所詮タダで配ってるソフトだから誰の著作権も何もない、
 ウチでつくってるといえばウチのもんだよ。」
詳しくは下記スレにて熟知せよ。
http://news4.2ch.net/test/read.cgi/news/1077067632/
959デフォルトの名無しさん:04/02/18 18:48
次俺俺スレ
http://pc2.2ch.net/test/read.cgi/tech/1077095949/
まだだ。まだ終わらんよ。
960デフォルトの名無しさん:04/02/18 19:06
っていうか、ほとんどが「入門書を読んだんだけどよくわかりません、
次は何をよむべきですか?」っていうまぬけの質問ばかりじゃん。
それはこのスレにかぎった事ではないな
962デフォルトの名無しさん:04/02/18 19:24
ええええ、このスレッド特有では?
そもそも「わかった気になるだけ」の本なんか何冊読んでも無意味なんだよ。
そうか。あなたがまぬけなのはよくわかった。
964デフォルトの名無しさん:04/02/18 19:44
つまり、自分がわからないのは本のせいだと? ;)
965928:04/02/18 22:39
>>955
使い方がよくわからないんで、それでバグを出すのもアホらしいかな、と(^^;)
> それでバグを出すのもアホらしいかな、と(^^;)

こわがりすぎー
今更そのネタかよ。
968デフォルトの名無しさん:04/02/19 14:00
そもそも本読んでるだけじゃまったく意味が無い事を教えてヤレ
>>960-968
話題が技術的なトコロから離れると
とたんに雄弁になりますね。
970デフォルトの名無しさん:04/02/19 16:22
>>969
煽ってないでその技術的な話題を振れよ
Cってint a;としたら、aには必ず0が入る?
>>971
no
973デフォルトの名無しさん:04/02/19 16:34
はいらないのが、Cの い い と こ ろ!

(でもJavaでもあえて初期化しちゃう)
974デフォルトの名無しさん:04/02/19 17:14
まじめな質問

デバッグ用にfprintfのラッパ関数でも書こうと思ったんだけど
可変引数の関数で、その引数の可変引数を
内部で呼び出す可変引数の関数にそのまま渡すには
どうしたらいい? っていうかvprintf系を呼べって?

具体的に言うと debug_printf( char *f, ... ) を作ってて
中で printf を呼ぶのは無理。 vprintfなら良しッ て感じ?
>>974
vprintf 系を呼ぶ。
自作の可変個引数の関数でも、
va_list を引数に取るバージョンを用意すると Good 。
そのためのvfprintf



じゃないか?
fprintfも内部でvfprintfを呼んでるかもしれない。
struct構造体をつかって。
ヘッダーをつくり、独自形式のファイルに書き込みたいんですけど。
パディング問題とかあるんですよね?。
どうやったら問題なく本来の構造体メンバーのサイズでファイルに書き込めるんでしょう
なんか、プリプロセッサありませんでしたっけ?
教えてください
>>978
パック1にすればいい。方法は処理系依存
fwrite(ptr,sizeof(*ptr),1,fp);
>>979
Intel 系 CPU ならそれで問題ないけど、
ハード側の制限からパック1にできないこともある。
1つ1つ書き込むのが一番安全ではあるけど、
Windows 専用ソフトならパック1にしたんで十分。
>>978
つーか、独自形式ならパディング有っても構わないだろ。
そのまま書いて読め。
>>982
もし移植するのであれば、
コンパイラによってパディングが変わる可能性もある。
その間でデータの互換性を保ちたいなら...
って、よく考えたらその場合エンディアンもちゃんとしないといけないから、
結局1つ1つ読み書きする必要があるな。
984978:04/02/19 18:32
処理系に依存するんですね。
わかりました、今のところはターゲットはWindowsだけなので。問題ないんですね
ありがとうございました
>>983
そうすると1バイトが8ビットとは限らないから
まず、その処理から始める必要があるな
まずは正規表現、話はそれからだ。
パディングの調整は #pragma で行うのが普通だと思う。
VC++ なら #pragma pack を調べるべし。
VC++ なら Zp では?
>>985
もうちょっとよく考えてから発言しれ。
どうして8ビットとは限らないことが、ファイルに書き込むときに
問題になってくるんだ?
書いた後、別のアーキテクチャのマシンで読む場合、だろ

8bit以外はしょうがないけど、パック1にして自分でパディングするのが
制御しやすい。
>>988
コンパイラオプションだと
全部パディングなしになっちゃうでしょ?
>983 名前: デフォルトの名無しさん [sage] 投稿日: 04/02/19 18:27
>>>982
>もし移植するのであれば、
>コンパイラによってパディングが変わる可能性もある。
>その間でデータの互換性を保ちたいなら...

>985 名前: デフォルトの名無しさん [sage] 投稿日: 04/02/19 18:32
>>>983
>そうすると1バイトが8ビットとは限らないから

だからもうちょっとよく考えてから発言しれって。
そのようなマシンで読み書きする可能性があるコードが
1バイト==8ビットに依存したデータを
ファイルに書き込む訳無いだろ?

データの書式の移植性とコード自体の移植性は、全く別次元の話だ。

では、この「そうすると」とは一体何よ?
993983:04/02/19 19:54
>って、よく考えたらその場合エンディアンもちゃんとしないといけないから、
>結局1つ1つ読み書きする必要があるな。
そうするとは、↑にかかってる
時間がないから、これ以上文句があるなら、また後で
終りポ
もうダメポ
int get1000(char *mes);

1000はこの関数実行汁こと。
997
998
try {
get1000("999get");
} catch(ぬるぽ) {
ガッ
}
(・3・) エェー 1000!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。