C言語ならあたしに聞け! Part 68

このエントリーをはてなブックマークに追加
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 67
http://pc2.2ch.net/test/read.cgi/tech/1068464309/
【コンパイラ】
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
【コンパイラ】
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
4デフォルトの名無しさん:03/11/23 11:05
あたCに訊けー!
6デフォルトの名無しさん:03/11/23 11:47

#define CONST_DATA 200

で定義されている、CONST_DATAを実行中に変更させることってできます?
7デフォルトの名無しさん:03/11/23 11:52
ふざけたすれたてんな!!
削除依頼だしといたぞ
>>6
その餌じゃ釣れないな。
9デフォルトの名無しさん:03/11/23 12:37
いや、今度の回答者は女みたいだ
とりあえず画像うpしてもらって
それからでも削除以来は遅くない

とりあえず>>1の画像うpまで、体育座りで待て
10デフォルトの名無しさん:03/11/23 12:52
ボーランドのHP見れねえ
コンパイラどうしよ・・・
>>6
ビルド時にプリプロセッサがソースファイルに出てくるCONST_DATAと言う文字列を200に変換してから
コンパイルを書けているのでもちろん無理です。

不可能はありません。実行時コード書き換えを使用しなさい。
13デフォルトの名無しさん:03/11/23 14:34
新しい言語の作りたいのですが
コンパイルはどのように作れますか?

14デフォルトの名無しさん:03/11/23 14:46
コンパイルを作るには、まず魔道物語を買い戻す必要があります。
int main(int argc, char* argv[]){
printf("hello");
}

等のスクリプトをコンパイルして実行形式に
変換させるにはどうすればよかんべ?
1713:03/11/23 15:22
>>16
参考にしてみます。
あらがとう。
>>12
ほう...

#define CONST_DATA 200
char a[CONST_DATA]

なんてのもできるんだな。
まあがんばれよ。(藁
>>18
出来ない理由がない。プリプロセッサの動きを真鍋。
実行中にコードを書き換えるのだからできますね。
馬鹿ばっかり。
とりあえず、>>19-20は、二度と来るな。
学校はまじめにいけ。はやくドーテー捨てれるといいな(w
>>21
て言うか、ネタにたいするレスにしては >>19-20 は全然面白くない。
煽りにも低脳ぶりが表れてるな。
>>23
なんだ?

セミコロンがないからコンパイルエラーです。

とかそう言うコメントが欲しかったのか?

何を守りたくてそんなに必死になっているのかよく分からない。
>>24
いや、レスがつまらんだけだが ?
ひねりも何もないし。
ネタにそんなレスして楽しいの ?
>>25
まぁ、なんにせよ>>24の最終行に答えてくれ。
それによってはお前にとって有利な態度を俺が取る可能性もある。
ワイド文字ってどんな時に使用するのでしょうか。
>>26
はぁ ?
ネタって言ってるのが理解できてないのか...。

お前が取れる俺にとって有利な態度は、回線切って早く寝ることだ。
即実行してくれ。
>>27
ワイド文字を扱いたいときとしか...。
>>27
unicodeを使いたいときだね。
>>28
>ネタって言ってるのが理解できてないのか...。

/*
ほう...

#define CONST_DATA 200
char a[CONST_DATA]

なんてのもできるんだな。
まあがんばれよ。(藁
*/

皮肉ったつもりが自爆したようにしか見えないが。
で、それを隠そうとやっきになっていると理解している。
>>29
そうなんですけど、何のために用意されているのかがイマイチよく分かりませんでした。
大抵、必要になったら分かりますみたいな説明しかされておらず、こんな時に使いました
的な解説が見つからなかったもので。
例えば UNICODE で書かれたファイルを弄ったり、
UNICODE を使う必要のある API を使ったりするときに
必要になる。
使い道を知らないでワイド文字を知ってるとは面白い奴やな
>>34
Win32APIのヘルプでも眺めてりゃいやでも目にはいるかと。

MessageBoxA()とMessageBoxW()は同じページにあるわけで。
>>35
そこで解ると思うんだけど…
>>31
はぁ ?
まあ、自己書き換えを拡大すりゃプログラム全体の書き換えも可と解釈できるから、何でもできるよ。

それを自己書き換えって言うか普通 ? って言う皮肉だがそれがどうかしたのか ?
それに対して、>>20 の笑いどころがわからんだけだよ。

あと、>>19 の「プリプロセッサの動きを真鍋」に至っては、意味不明だし。
またこれか・・・
>>37は放置
39デフォルトの名無しさん:03/11/24 00:17
て言うか>>38って向こうのスレのスレッドセーフ厨だろ?
>>39
確かに向こうのスレにはいたけどROMってた人だよ
なんか文章多くて面倒くさくて全然読んでなかったけどね
元レス
>#define CONST_DATA 200
>で定義されている、CONST_DATAを実行中に変更させることってできます?
から書き換えたいのはCONST_DATAだとわかる

>実行中に変更させたい
とのことからすでに実行ファイルであることがわかる

#define CONST_DATA 200はプリプロセッサにより処理される

これにより実行ファイルにはCONST_DATAを識別する情報は残らない

結論 不可能
うわー、すっげぇ粘着やね
4311:03/11/24 00:44
>>41
と、俺が約12時間前にその結論を出しているわけだが。
4427:03/11/24 00:55
レスいただいた皆様どうもありがとうございます。

>>30,33
UNICODE ですか。UNICODE は使った事がありませんが、char のままだと
バックスラッシュ等がそのままプログラムに渡されてしまうからという事です
よね。

>>35
Windows でプログラミングはした事はありませんでした。
>>41
CONST_DATAはなくなっても、200という情報は残るだろ。
それを書き換えるってことだろ。
>>45
#define CONST_DATA 200
#define HOGE_DATA 200

200がCONST_DATAだと確認する方法は?
>>46
どこでCONST_DATAを使ったか探す。
>>47
その方法は?
逆アセンブルすりゃええやろ。
↓じゃあやってみろよwとレス
VC++ の混合モードで万事解決
しねぇなぁ。最適化しちまうとソースの順序が保存されないから。
粘着厨と、それを執拗に叩く椰子、どっちもウザい。
>>49
逆アセンブルしてもCONST_DATAじゃなく200としかわからないが?
>>49
逆アセしてわかる理由を教えてよ。
マクロは保存されるの?
お前ら落ち着け。

>>6 が望んでいるのは、実行中に #define CONST_DATA 200 が書いてあるヘッダファイルを書き換えることだ。

これだったら、宿題レベルだろ ?
>>56
>>6 が望んでいるのは、実行中に #define CONST_DATA 200 が書いてあるヘッダファイルを書き換えることだ。

それになんの意味があるというのか。
>>6の質問自体無意味だしぃ。
>>55
アホか。プリプロセッサの動きを真鍋。
>>57
そんなことは、>>6 に聞けよ。

専用のヘッダファイル書き換えツールかなんかなんだろ。(藁

>>59
またお前か...。
>>38-40
ププッ、そんなに悔しかったのか。
久々に知ったか厨が大量に釣れて楽しかったよ。(ケケッ
かをりたんハァハァ
>>61
久しぶりに知ったか房を釣ってると言ってる知ったか坊を釣れて楽しかったぜ(プゲラ
>>63
無限ループですか?


>>62
「ケケッ」ってのは小学生の時読んだ漫画以来だな。ちょっとこころ暖まった。
へけけっ
66また遊ばれたいのか ?:03/11/24 13:52
>>63
おやおや君は、i++ がアトミックだとか自信満満に言ってた奴か ?
それとも、「マルチプロセッサならコードを二重に実行するとか思ってんのか」と間抜けな突っ込みいれてた奴か ?
まあ、何もわからずに周りで騒いでた厨房なんだろうな。
どうせ結論も理解できなかったんだろ。(ケケッ
>>66
友達のいない理系大学2年生と言ったところか。
お前、社会に出たらこれほど遊べる時間なん無いんだぞ。
もうちょっと外に出てぱーっと遊ばんと一生後悔するぞ。
>>67
こういう話題だと食いつきいいね。(藁
>>66
やっぱお前各地で荒らしてる奴だな?

>>66の奴もなんか荒れてきたからROMってたけどそのときも荒らしてたろ?>>66おまえ
>>69
各地ってどこよ。
その時っていつよ。

アフォは、おとなしくしとけよ。
freadについて質問させてください。
freadの引数は(ptr, サイズ, 読み込む個数, stream)だと思うんですが、
fread(ptr, sizeof(型), 1, stream)を fread(ptr, 1, sizeof(型), stream)
というふうに書いてるソースを見かけました。
結果は同じになるんですけど、この記述のしかたに何か利点はあるんですか?
それとも単に間違ってるだけ?
戻り値が違うんだよな。一応。
読み込み失敗の場合に1byteずつ読み込んだ個数を表示させて
どこまで読み込みに成功したかを知るためとかですか?
74デフォルトの名無しさん:03/11/24 18:37
>>73
空気読め低脳君(ケケッ
75デフォルトの名無しさん:03/11/24 18:41
>>73
そういうこと。
ok、>>74は放置で
なるほど。ありがとうございます。
教えて君ですまないです。 
あのーPrintScreenキーを押してデスクトップ画面を取得できますよね。
それが共有メモリ内に入るのはわかっているのですが、できれば格納さ
れているメモリアドレスを知りたいのです。どうすればいいのでしょうか?
WinAPIで解決できるのか、それともポインタで解決できるのか 
皆様教えてください。
> あのーPrintScreenキーを押してデスクトップ画面を取得できますよね。

できません! 何度押してもできません!
8078:03/11/24 20:44
すみません 開発環境はVC++6.0です。
>>78
クリップボードに何が入ってるか調べてみた?
8278:03/11/24 21:10
>>81さん
 Win2kで作成していますが、コマンドラインで"clipbrd"と打ち込んで
クリップボードの内容を確認はしました。これはBitMap形式での画像が
入っているのでは?と思っているのですが・・・。違うのですか?
>>82
clipbrd って、クリップボードビューアだよ。
クリップボードとは違うよ。
(クリップボードの内容を取り込んだりすることはできるが。)

スレ違いだから、

Win32API質問箱 Build15
http://pc2.2ch.net/test/read.cgi/tech/1069339866/

で質問した方がいいよ。
8478:03/11/24 21:16
 ご親切のどうもです。スレ違いでしたね。
あちらで同じく聞いてきます。
配列の要素数を求めるにはどうしたらいいでしょうか?

たとえば
int a[]={1,2,3,4,5};
としたときは、5つの要素がありますが、
5という数字を求めるにはどうしたらいいでしょうか?
sizeof a / sizeof (int)
もしくは sizeof a /sizeof a[0]
#include <stdio.h>

#define ELEMOF(array) (sizeof (array) / sizeof *(array))

int main() {
 int a[]={1,2,3,4,5};
 printf("%d\n", ELEMOF(a));
 return 0;
}
8985:03/11/25 00:57
>>86-88
ありがとうございます。
バイト数から求めればよかったんですね。
90デフォルトの名無しさん:03/11/25 06:27
-0.90以上0.90以下のdoubleの乱数を発生させたいのですが
どうすればいいでしょうか?
>>90
分解能はどれ位?
9290:03/11/25 06:36
>>91
分解能の意味がわかりませんil||li _| ̄|○ il||li
>>92
整数なら話は早いわけだ。
0〜5なら取りうる値は0 1 2 3 4 5の6個しかない。

でも、実数になると、

0.0〜0.5とすると0.499もそうだし0.499999999も該当するわけで

事実上無限のサンプルが存在してしまう。

だから「少数第何位の精度で」みたいな分解能がいると思ったんだ。
三流大学出の俺は。
rand() は 0〜RAND_MAX までの乱数を与える。
これを加工して -0.90〜0.90 の値になるよう調整すればよい。
9590:03/11/25 06:45
出来ました
サンクス
96デフォルトの名無しさん:03/11/25 10:27
#define MAX_POINTS 1600

typedef struct{
double u, v;
double x, y, z;
}POINT;

typedef struct{
POINT point[MAX_POINTS];
int count;
}DOM;


void main(){
DOM domain[16];//DOMAIN型の配列を宣言する
POINT newpoint;//POINT型の変数を宣言する
                ・
                ・
                ・
                ・



VC++6.0でこういう宣言文で実行するとMAX_POINTSが1600なら動くけど
1700以上に書き換えると止まるんです。メモリは足りてます。何故だかわかる人教えてください
>>96
スタックオーバーフローが疑われる。
newで確保してみてOKならソレ。
>>97以外に理由さがせってのが難しいね
>>97
mallocだろ・・・
staticつけるってのも手か。あくまでも原因追及のためなら。
10096:03/11/25 10:39
即レスありがとう
スタックオーバーフローってなんですか?
>>100
コンパイラオプションでスタックサイズを変えられたはず
>>102
まじで?

>>100
「アッカーマン」と検索してみましょう
>>103
VC++6.0ならまじ。
105デフォルトの名無しさん:03/11/25 11:50
Windows95のDOS窓 + TurboC++5(hugeモデル)で以下のコードが
memset実行時にハングアップしてしまう。
その瞬間、画面が乱れて固まるから、どこかVIDEO関係の領域に
書き込んでいるらしいが、ソースを見ても問題ないように思えるのだが。

#include <stdio.h>

#define BUFSZ(0x2000)

static char *bufp;

int main() {
if ((bufp = (char *)malloc(BUFSZ)) == NULL) {
printf("malloc fail\n");
return -1;
}
memset(bufp, 'A', BUFSZ);
}
106デフォルトの名無しさん:03/11/25 11:54
>>105
それ以前にエラーになるが
BUFSZと(0x2000)の間は開ける。
mallocを使うならstdlib.hをインクルードする。
さらにmemsetを使うわけだからstring.hも必要だな。
10896:03/11/25 12:02
みんなの言うとおりコンパイラの問題だった。ありがとう!
>>105
far ポインタとか huge ポインタとかなかったっけ?
関係ないか、もはや記憶が薄れてるな…
110105 凡ミス:03/11/25 12:20
悪い。ヘッダをインクルードし忘れてた。
しかし、この程度でDOS窓はおろかWindows本体がフリーズしてしまうのか。
DOSプログラミングって大変だったんだな。
16ビットポインタでは64KBを超えるメモリをアドレス
できないから、セグメント:オフセットの変則的なポインタを
導入する・・だっけ
farとかnearポインタの使い方が解らないです・・・
あれって出来たほうがいいの?
113デフォルトの名無しさん:03/11/25 13:09
2次元配列のポインタを渡すにはどうしたらいいのでしょうか?

hoge(int aho[ ][ ]){
int a;
a = aho[1][2];
}
main(){
int aho[10][10];
hoge(aho);
}

とかだとダメですか?
>>113
この質問何回目だろう・・・

hoge(int aho[][10])
それと戻り値の方を省略したらintと見なされるから整数を返す。
115113:03/11/25 13:17
すみません自己解決しました

hoge(int aho[10][10]){
〜以下略〜

とかにしました。
この場合hogeに渡されるのはahoのアドレスで、hoge()内でもう一つintの10*10の配列の領域を作って確保するってことですよね?
一次元の時のようにわざわざhoge()内で新しくahoの領域を作らないでやるって事は2次元配列では出来ないでしょうか?
>farとかnearポインタの使い方が解らないです・・・

VRAMとかアクセスするときに
unsigned char far *vram_ptr = 0xXXXXXXXX;
って使ってた気がする。
スモールで作ってるぶんにはあまり必要なかったような
みんな115はネタだと悟ったのかな
>>115
hoge に渡されるのは aho のアドレスで、
hoge 内で配列が作られることは無い。
C言語の字だけで野球ゲームを作ってみようと思うんだが
バットが当たって角度の計算とか数学の知識が載ってるホームページ知りませんか?
質問です

動的二次元配列作りたいんですけど、これって問題ないですかね?

double **d;
int n = 4, i, j;
d = (double **)calloc(n, sizeof(double));
for(i = 0;i < n;i ++)
d[i] = (double *)calloc(n, sizeof(double));

for(i = 0;i < n;i ++)
{
for(j = 0;j < n;j ++)
printf("%lf ", d[i][j]);
putchar('\n');
}
d = (double **)calloc(n, sizeof(double*));
>>120
それは、ポインタの配列であって二次元配列じゃない。
123デフォルトの名無しさん:03/11/25 19:39
y              x
144.734630943.5366044
144.734630943.53666032
144.73462743.53672098
144.734626243.53677836
144.734622843.5368377
   
というような数値の組が40個あって、これらをプロットすると長方形が傾いた形になります。
これを以下の式で回転させてプロットしてみたところ、ものすごくいびつな形になりました。
x1が回転前の数値で、x2が回転後です。

x2 = x1 * cos(-A) - y1 * sin(-A)
y2 = x1 * sin(-A) + y1 * cos(-A)

同じ計算をエクセルで行うとちゃんと回転できました。
何が悪いのでしょうか?
数値はdouble型で、c言語でVC6.0++使ってます。

どなたか意見ください。
124123:03/11/25 19:40
y        x
144.7346309 43.5366044
144.7346309 43.53666032
144.734627  43.53672098
144.7346262 43.53677836
144.7346228 43.5368377

です。見苦しくなってしまった。
>>123
ソースが無いと(漏れには)コメントできないっすね
とりあえずx1,y1,x2,y2を出力して
エクセルの結果と照合して問題のありそうな
部分を絞ってみては。
>>123
いびつになったということは計算の桁オチかなにかが起こっただけだろ。

>>123
プロットには何を使ったの?
128デフォルトの名無しさん:03/11/26 00:00
質問です。
BCCでの設定なんですが、bcc32.cfgファイルの中身を

-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"

にしたときに

-H
-Hs
を後ろに追加しておくことをおすすめしますといわれましたが、

どう追加すればいいんですか?
お願いします。
129123:03/11/26 00:00
>>125
照合したんですけど、すべての値が変で、変な形になっちゃうんですよ。

>>126
桁落ちですか…、防ぐ方法はあるんですか?

>>127
プロットはプログラム走らせてx2,y2をcsvファイルに出力した後にエクセルを使いました。

何回も見直したけどプログラムに変なとこはなさそうなんです。
丸め誤差かな?
130128:03/11/26 00:13
すいません、わかりました。
>>129
どうしてもバグが見つからない時は、自分では絶対間違って無いと思ってるところでミスってることが多いよ

FLOATをINTで計算してたりね
0から任意の整数nまでの乱数を発生させたいとき、
nをRAND_MAX以上にしたい場合にはどうすればよいのでしょうか。
srandで初期化する。
別の疑似乱数ジェネレータをつかいましょう。
135123:03/11/26 01:27
>>131
ほかの人にも見てもらったんですけど、特に
間違ってそうなところはないんですよ。
各点の距離はすごい小さいんで、
丸め誤差がかなり影響するのかな…?
>>123
自分で言ってる内容に間違いが無いなら他人が分かる訳ないでしょ?

だから、コードを晒しなさいよ。
理屈と式を言うだけで、
それでそれを実行するコードに見落としや間違いがあるかなんて他人に分る訳?
例えば、
二つの数字の組があって(1,1)(2,2)…
それぞれを足すと、単体の数字の二倍になります。
でも二倍に為らないんです。下の式を使ってます。
ans1 = 1 + 1;
ans2 = 2 + 2;
どうだ?こんなんで、そのプログラムの問題点をアドバイス出来るか?
>>134
ありがとうございました。
MTってのを使ってみます。
確かにメルセンヌツイスターが妥当やね
139123:03/11/26 02:36
>>136
それもそうですね。
問題の回転する関数部分をさらしてみます。

{
int i;
double rad; /*ラジアン*/

FILE *fp;
fp=fopen("a.csv","w");

rad= ; /*回転させたいラジアンを入力*/

for (i=0; csv[i].Longitude!=-1; i++){

csv[i].Longitude = ((csv[i].Longitude-csv[0].Longitude) * cos(rad)) - ((csv[i].Latitude-csv[0].Latitude) * sin(rad)) + csv[0].Longitude;
csv[i].Latitude = ((csv[i].Longitude-csv[0].Longitude) * sin(rad)) + ((csv[i].Latitude-csv[0].Latitude) * cos(rad)) + csv[0].Latitude;
fprintf(fp,"%lf,%lf\n",csv[i].Longitude,csv[i].Latitude);

}
fclose(fp);
}

Longitudeが>>123で言うxで、Latitudeがyです。
どちらもdouble型です。40組のデータがこの構造体に入っていて、41番目に-1が入っていて
ループの終了条件としています。
ループの中は、i=0番目のデータを基準としてほかのデータをradだけ左回りに回転させます。
ではすみませんが、意見よろしくお願いします。
csv[i].Longitude = ((csv[i].Longitude-略
↑で書き換えたものを↓で使うが良いのか?
csv[i].Latitude = ((csv[i].Longitude-略
for (i=0; ←いきなり基準点がズレテルラ
csv[i].Latitude = の行で使ってる csv[i].Longitude が上の行で書き換えられとる
>>139
math.h はインクルードしているか?
Longitude, Latitude は double 型か?
配列 csv には正しい値が格納されているか?(全く回転させずにプロットしたら歪まないのか?)
fprintf の変換指定は %lf ではなく %f
変換指定で精度を指定してみたか?(デフォルトでは精度が低いことがある)
極点へ近づくほど経度あたりの距離が小さくなる.その手の問題はあるか?
>>140
>>141
これが正解っぽいな
>>139
まさか航空機の管制システムとかに関わってないよな?
もしそうなら手を引いてくれ
怖えよ
>>139
一時変数などを使って、愚直にわかりやすく書いたほうがいいと思う。
(Make it simple and stupid!)

const double rd = -(...);
const double xb = csv[0].Longitude;
const double yb = csv[0].Latitude;

for( i = 0 ; csv[i].Longitude! = -1; i++ ) {
 const double x1 = csv[i].Longitude - xb;
 const double y1 = csv[i].Latitude - yb;
 const double x2 = x1 * cos(rd) - y1 * sin(rd) + xb;
 const double y2 = x1 * sin(rd) + y1 * cos(rd) + yb;
 csv[i].Longitude = x2;
 csv[i].Latitude = y2;
 ...
}
>>123
この辺参考にしてみれば?

http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.1.html
147123:03/11/26 09:34
みなさんどうもありがとうございます。
さらしてみて正解でした。

>>144
一介の学生です。たまたまこういうデータいじってるだけです。
>>139
あとあと使いまわすなら
関数にしたほうがすっきりするかもね

void kaiten(double *dx, double *dy, double x, double y, double ox, double oy, double rad) {
 double rcos = cos(rad), rsin = sin(rad);
 double x1 = x - ox, y1 = y - oy; /* 原点に移動して回転 */
 *dx = x1 * rcos - y2 * rsin + ox;
 *dy = x1 * rsin + y2 * rcos + oy;
}

/* 原点(origin_x,origin_y)を中心にして回転します */
kaiten( &(csv[i].Longitude), &(csv[i].Latitude),
    csv[i].Longitude, csv[i].Latitude,
    origin_x, origin_y, radian);
149デフォルトの名無しさん:03/11/26 19:20
関数正常終了とエラー終了の場合って、普通はなにをリターンすんの?
私はいま、
正常:return 0;
エラー:return -1;
だけど、これって、ふつーなん?
150デフォルトの名無しさん:03/11/26 19:23
>>149
普通
ポインタならエラーはNULLかな
exit (2)
とかとは違う?
152デフォルトの名無しさん:03/11/26 20:03
失敗で0の時もある
>>152
そーなんだ!

今度からはこれが流行します
その関数の呼出し元に必要とされている戻り値を返しとけばいいの
mainの事いってるんじゃないの?
156154:03/11/26 20:38
メイン関数の話か・・それは失礼でした。
int mainはUNIX互換OSでプログラム組んでる人で
void mainはそれ以外だと聞いたけど
結局のところ return 0 の意味を理解してない俺…
ここにいる人でもわかってない人っているのかなぁ?
無知から有知に逝くために return 0 の意味しらべてきまつ
>>156
納得するなよ
>>157
ノシ
>>157
気になるなら EXIT_SUCCESS でも返しとけ
return 0 の意味って実に調べにくいですね。。。
「"return 0" main C」と検索したけど出てこないですねぇ・・・
もちっと粘ってみます。

でなかなかC入門でいいサイト発見
ttp://village.infoweb.ne.jp/~fwjh9404/MMGames/c_guide/index.html
どうぞです。
解りました。
お邪魔しちゃってすみませんでした

・EXIT_SUCCES
・EXIT_FAILURE
の二つがあるんですね。
成功したときは上で、終了が失敗なら下なんですね。

参考資料
   ttp://mikata.curiocube.com/hello/ch01_mainprototype.html
UNIXはコマンドが成功した時は0、失敗した時は0以外を返すしきたりがある
紛らわしいけどな
結局のところ !0 とすればいいのかな
>>164
結局 1 じゃねえか
二重否定はわかりにくい表現の常套手段
>>165

>UNIXはコマンドが成功した時は0、失敗した時は0以外を返すしきたりがある
となってるらしいからしょうがないよ…
偽は0だけど、真は0以外でヨシとされてるから
>>157

>int mainはUNIX互換OSでプログラム組んでる人で
>void mainはそれ以外だと聞いたけど

ほう、windowsはUNIX互換OSというのか。
っておい、根本的に間違ってるぞ。

http://www.catnet.ne.jp/kouno/c_faq/c11.html#0
の12,14,15は読んでおけ。
>>168
そういう性質があるって意味ね
>>169
もしかして「傾向」と言いたいんですか?
>>170
TTるる〜
そうですそうです

いつも言葉が足りなかったりして…
文才無いから小説読もうかなって思うんですけどなかなか行動できなくて...
>文才無いから小説読もうかなって思うんですけどなかなか行動できなくて...

こんなもんに勇気とかなんか色々いるのか?

人生なめんな。
やる気と金が要る。
ここにいる奴らはアセンブラのCPUレジスタの0フラグに対する比較命令という物もしらんのか。
まさか

#define true 1
#define false 0
if(flg == true)

とかやってんじゃないだろうな。

if(flg != false)

としろ。
>>172
・・・勝手に勇気とか文章変えないでくださいよ
人生をなめてるわけじゃないけど、やる気が起きないですので動けないです

>>173
そうなんですよ、やる気が必要なんです
小説って400円とかそれぐらいじゃないんですか?
>>174
そのまえに
flg = true
flg = false のみにしておけば問題にならないかな?

言ってること違うかな
>>174
bool 値なら if(flg) でええやん。
>>177
一見正しいこと言ってるけど
boolはC++からだよね…残念
_Boolはどうした。
>>178
bool 型の値じゃなくて一般的な bool 値のことを言ったんだが。
>>180
言葉つけてオクレ・・・
>>177
s/bool/スカラ/
フリースタンディング環境なら void main もありうる、とか今さら乗り遅れたネタで混ぜっ返してみる。

main の返値に付いては正常終了、異常終了だけじゃなくて、多くの環境で異常時のエラー種別も
返したいという要求があるから、正常終了が 0 になるのは致し方ないところと思われ。
>>182
それだと、一般的な値の0かそうでないかを比較したいと思ってるように見える。
たとえば、if(count) みたいに、個数が 0 かそうでないかで分岐するとか。
こういう書き方は分かりにくいので俺は嫌いだ。

あくまで「真偽にみせかけた整数値」の場合のみ
このような if(flg) といった表記を使うのだということで、
「bool 値」と言ったわけだ。
>>184

=====================
int *i = NULL;
(色々処理)
if (i) printf ("%d", *i);
=====================
とかって方法は嫌い?
>>185
ほんとどうでもいいことだから>>184さん無視しちゃってもいいですよ
>>183
漏れは1つのmain関数で無数の実行環境に対応する方が無理があると思っている
ここだけ条件コンパイルしない風習は馬鹿げている

>>186
どっちにでも取れる玉虫色だな
void main(void)にしておけば無数の環境で動いてくれて
(゚д゚)ウマー
dane
>>188
そうやってできたプログラムは
シェルスクリプトやバッチファイルから使いにくくなるので
(゚д゚)マズー
今までc言語でBMPとRAWしか扱ってこなかったんですけど、
JPGを扱えるようにするにはどうしたらよいですか?
JPGのしくみを学んで1からプログラム作るしかないんですか?
>>188
お前も>>168はマジで読んどけ。
今さらネタにもジョークにもならんよ?
>>191
JPGを扱うフリーのライブラリくらいあるだろ
194デフォルトの名無しさん:03/11/27 02:22
次のスレタイは

「C言語ならあしたに聞け」

にしませんか?なんか文学を感じます
訊けだろ。
やっほ〜、僕だよ〜。
ほっちゃんとセクース出来たら死んでも良いよ。
C言語というか
H8マイコンスレってある?
探しても見つからん(´・ω・`)
よかったら教えてください
>>198
制御系なら俺に聞け
聞けじゃなくて聞いてもいいぞか
http://pc2.2ch.net/test/read.cgi/tech/1068869894/
>>187
>>185=>>186でして、>>184さんが>>185の内容は本当にどうでもいいことだったので無視してもらっても構わないといいたかったのです。
すみません><
202デフォルトの名無しさん:03/11/27 21:18
hosh
hash
204デフォルトの名無しさん:03/11/27 23:10
205デフォルトの名無しさん:03/11/27 23:15
>>174の違いなんですけど、if(flg == true)と書いても
if(flg != false)と書いても、コンパイルしたら一緒
ってなことはないでしょうか。
>>205
実際に試すしかないだろ
>>205
最適化コンパイラならきっと良きに計らってくれるでしょうね。
アレ賢くてびっくりするよ。ほんと。
>>205
一般的に、trueと比較する場合は定数との比較なので律儀にそれに見合ったコードが作られる。
falseの場合は0との比較なので、比較以外の手頃なニモニックを使うコードが作られる場合もある。
なので、falseと比較する方をお勧め。
#つーか、flg == true とか flg != false なんて書かずに単純に flg でいいと思うのだが。
そもそも
if(flg == true)

if(flg != false)

はなにが違うの?
flg は int なんだから、0, 1 以外の何かが入ってても構わんわけだ。
たとえば isalpha とかの is 系は 0 or 1 の2値を返すんじゃなくて、
0 か「それ以外」を返すことが多い。
この「それ以外」は 1 以外のものも含んでいる。
だから、flg = isalpha((unsigned char)c); みたいなことしていた場合、
if(flg == true) としてしまうと判定漏れしてしまう。
関係ないけど、isxxx系のマクロって何で!=0でdefineしないのかな?
#define isalpha(c) (_ctype+1[(c)])
ではなく、
#define isalpha(c) ((_ctype+1[(c)]) != 0)
にしておけば
if (isalpha('A'))
のようなbooleanな文脈なら普通の条件判断に、
int chartype = isalpha('A');
のような文脈なら1or0が得られるのに。
212205:03/11/28 00:05
205です。皆さん、ありがとうございます。
自分の環境(旧M社マイコン)では違いがなかったものですから、質問してみました。

自分は、この辺のこと意識してなかったので、>>210さんの書いたようなことで
はまったかもしれませんね。
>>210
そもそもBOOLとして定義された機能ではない。
そんな物にfalseだのtrueだのを適用してはいけない。
言語の処理上可能だとしても。

>>213
制御構造と論理系演算子を使うな。と言うことですね。
215デフォルトの名無しさん:03/11/28 01:48
forkで作成した子プロセスpidを強制終了させるには
どうしたらよいのでしょうか?
windows板で質問したのですが、答えてくれないかもしれないのでこちらで質問します。

C言語でプログラム作成しようと思ってコマンドプロンプトからEDITエディタを
立ち上げようとしたのですができませんでした。
XPからはEDITエディタが付属されなくなったのでしょうか?
また、それに変わるエディタが付属されているのでしょうか?
のてぱdつかえ
>>216
>また、それに変わるエディタが付属されているのでしょうか?
そりゃあるけどさ・・・

お前、そもそもどこから "EDITエディタ" なる単語を見つけてきたんだ?
edlinエディタwがありませんか
>>215
UNIX の場合なら答えられるんだがな
>>216
メモ帳で十分ではないか。
222216:03/11/28 02:45
>>217
何ですかそれは?

>>218
知っているのでしたら教えてくださいよ〜
「EDITエディタ」は某本から見つけますた。

>>219
ありました。ありがとうございます!
と言いたいところですが・・・
EDITエディタと違って行頭に'*'が付くし、改行するとヘンな番号が出てきます。
それに終了する時(途中も含めて)はどのコマンドを使えばよろしいのでしょうか?

>>220
残念、Windowsでつ。将来的にはRed Hatでも使いたいと思うのですが。

>>221
できるかもしれませんが、ややこしくなりませんか?
C言語と関係ないし。消えろよウザい。
>>215
unixならunixスレへ。その他の場合も環境に準じたスレへ。
>>216
いい加減にしておけ。
>>224
環境問わないCスレもあっただろう。
特定の環境に依存しないCなんて何十年二もわたって語り尽くされた分野だろう。
となるとここはいらないクソスレと言うことになる。


解らないなら素直に解りませんと書くか出てくるなや。
ププ
>>226
ププ
>>225
このスレはC言語の基本的な部分を質問するスレだろ。
何か嫌なことでもあったのか?
++と--は汚いから使用禁止。
>>229
阿呆ハケーン。
for (int i = 0; i < n; i += 1)
とでも書くつもりかね。
そう書いていますが。
むしろ for (int i = 0; i < n; i = i+1) だろう。
何気にC99とは
Cなのにfor文の初期化式で変数宣言ですかそうですか
>>234
いい加減 C99 ぐらい押さえとけよ、オールドタイプ。
C99完全準拠のコンパイラほすぃ。
そういえばVC6.0で

for( int i=0; i<8; ++i ){}
for( int i=0; i<8; ++i ){}

こう書くとエラーになるんだけど・・・
環境依存は専用スレへ
「Microsoft 言語拡張機能を無効にする」にチェックすればOK
int i=strcmp("moji","retsu");
なぜかiが0になる。
>>239
-1になったが・・
#define for if(0) ; else for
for を置き換える事ができないんじゃね?
>>242
(゚Д゚) ハァ?
むしろ唐突にそんなことを書く>>241に(゚Д゚) ハァ?
237に反応しているのでは?
C言語についての質問です。 プログラムの実行開始位置のmain関数の書き方は、int main(),main(),int main(void),int main(int argc, char* argv[])
など本によっていろいろですが、その違いを教えていただきたい。
int main(),main()...OSに戻り値を求めるか求めないか
int main(int argc, char* argv[]),int main(void)...コマンドライン引数を受け取るか受け取らないか
>247
main()はint main()の省略版で意味は同じだが。
>>246
1.int main() → 引数は任意,戻り値は int
2.main() → 引数は任意,戻り値は int (C では型を省略すると int 扱いになる)
3.int main(void) → 引数はなし,戻り値は int
4.int main(int argc, char* argv[]) → 引数はコマンドラインから取得,戻り値は int

C の仕様では3か4.
2は説明の手間を惜しんでいるのか
1は C++ と勘違いしているのかも(引数省略時,C では任意の引数,C++では引数なし)
>>249
他から呼び出すことがないために、int main()でもint main(void)でも実質変わらないからでは?
C++では、mainの呼び出しは禁止。Cでは容認されていたはず。
252デフォルトの名無しさん:03/11/28 19:00
#include <stdio.h>
FILE *main(void){return stdout;}
>>251
いや、容認されていても呼び出すことはまずないでしょ?
>>246
ネタでしょ?
基本知識的な物は自分で調べてみなよ
int main(){
static int i = 0;
if ( i < 5 ) main(i++);
return i;
}
無理矢理だが一応呼べる
256デフォルトの名無しさん:03/11/28 19:05
0x100ゲット
257246:03/11/28 19:06
よくわかりました。どうもありがとうございました。

>254
すみませんが、ネタではありません。以後、自分で調べるようにいたします。
そこで、C言語について、お勧めのサイトがありましたら、教えていただきたいのですが。
258宣伝です:03/11/28 19:07
260デフォルトの名無しさん:03/11/28 19:10
>>259
知らないサイトがひとつ・・・
ちょっと見てみよう
>>259
嫌がらせだなw
あまり多くても困るっしょ

あと>>257の文才も尊敬するな。
気兼ねなく教えたくなるような感じだ。

んで俺が言えることは、それも自分で調べたらどうよ?って事
あと本買いな。本についてはそのスレがあるから、そのスレを参考にするといいよ
コンパイルしたら

Fatal: Error detected (LME279)
Fatal: Error detected (LME347)
Warning: Failed to create state file ファイル名.tds (error code 0)

と出るのですが・・・
>>262
開発環境ぐらい書いたら?
264262:03/11/28 20:04
>>263
bcc32です。
265246、257:03/11/28 20:26
私の拙い質問に親切に答えてくださった皆様方、どうもありがとうございました。
>>249
>2は説明の手間を惜しんでいるのか

坊やにはわかんなくていいの


>>250
>実質変わらないからでは?

仕様と実装を混同する痛厨にえさをやらないで下さい
>>266
> 仕様と実装を混同する痛厨
( ´,_ゝ`)
          || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
          || 荒らし煽りは 。   Λ_Λ  いいですね。
          ||   無視!  \ (゚ー゚*)  http://www.2ch.net/accuse2.html
          ||________⊂⊂ |
  ∧ ∧    ∧ ∧    ∧ ∧    | ̄ ̄ ̄ ̄|
  (  ∧ ∧ (   ∧ ∧ (  ∧ ∧ |      |
〜(_(  ∧ ∧ __(  ∧ ∧__(   ∧ ∧ ̄ ̄ ̄
  〜(_(  ∧ ∧_(  ∧ ∧_(   ∧ ∧  は〜い、先生。
    〜(_(   ,,)〜(_(   ,,)〜(_(   ,,)
      〜(___ノ  〜(___ノ   〜(___
>>267
せいぜい笑ってろ、それが似合いだ
270デフォルトの名無しさん:03/11/28 21:45
コンパイラ作りたいんだけど、もしかしてマシン語も理解しないといけないの?
271初心者:03/11/28 21:53
[directshow]って何だすか???関数け???
272デフォルトの名無しさん:03/11/28 21:55
273初心者:03/11/28 22:00
、kkjhg
274初心者:03/11/28 22:01
>>272
読んだけどわからないっす・・・すいやせん。
DirectXのビデオ関係のコンポーネント
276初心者:03/11/28 22:23
DirectXのビデオ関係のコンポーネント????またよくわからない言葉が・・・
printfのような関数とは違うみたいですね。じゃあ何だべ?ごめんなさい。
>>269
オマエモナー
>>276
C言語とは無関係
悪い夢を見たと思って忘れろ
>>270
当然だろ。
アセンブラが別にあればアセンブリ言語まででもOK
コンパイラは面倒いので
まずインタプリタを作るといいと思うよ。
CインタプリタならC言語で作れそうだね
質問いいですか?とあるサイトで見た先頭に要素を追加していくリスト構造なんですが、
以下のプログラムで、while文を終えたときに先頭の要素(top)は一番高い値のアドレスなんですが、
for文でp=p->nextとすると、pが指すアドレスの値が低くなっていくのが分かりません。
なぜなんでしょうか?
typedef struct list{
char *str;
struct list *next;
}LIST;
main()
{
char strbuf[BUFSIZE];
LIST *top = NULL; /* リストの先頭要素 */
LIST *p;

while( gets( strbuf ) ){
p = malloc( sizeof( LIST ) );

p->str = malloc( strlen(strbuf)+1 );
strcpy( p->str, strbuf );

if( top == NULL ){ /* 先頭が空なら、次の要素も空 */
p->next = NULL;
}else{
p->next = top;
}
top = p;
}
for( p=top; p; p=p->next ){
printf( "%s\n", p->str );
}
}
順番に追っていくと、

1. top=NULL
2. top=list1->NULL
3. top=list2->list1->NULL
4. top=list3->list2->list1->NULL

となるから、別におかしくない。
286デフォルトの名無しさん:03/11/29 05:37
ね〜フォームの値を変数に入れるのってどうやるの?
Web言語しか知らないから良く分からないの。
submitされたらどう処理すれば変数に入れられる?
(質問の仕方が違うかも:))
>>286
死ね
>>287の反応があたりまえ

>>288>>289はいい人
291デフォルトの名無しさん:03/11/29 17:14
あたしに聞け!
292デフォルトの名無しさん:03/11/29 17:17
オラが聞く!
c?C++のスレのが流れがいいなw
むこうは必死な香具師が多いからな
なんでグローバル変数は必ず0で初期化されるのに
ローカル変数は不定なの?
>>295
単に実行時の効率の問題だと思うが。
グローバル変数は変数領域を使うけど、変数領域はmain()実行前に初期化される。
ローカル変数はスタック領域を使から、そこにはゴミが残ってる。
ローカルのほうは呼び出されるたびに何度も初期化されるというのも
関係あるのでせうか?
>>297
答えになっていない(w
>>298
そうでないと不便だろ?
毎回初期化したくないならstaticにすればいいわけだし。
>>295
int a=5;とすれば5に初期化されるから「必ず」ではないですね。
>>300
そうですか?
>>302
おいおい
>>297
>main()実行前に初期化
     ^^^^
ダウト!
しかしまだいいが

>>300
これは痛杉
氏ね
はいはい、それで?
Q地球に大気があるのはなぜでしょう?
A便利だから
>>306
大気(おおき)君がいると授業中に黒板が見えません。
大気君はもう少し身長をさげてください
FILEよりSTREAMの方がかっこうよかったのにぃ
309デフォルトの名無しさん:03/11/30 10:46
C言語ってソースが上から順に実行されますよね。
それを同時に動かす事はできませんか?
例えばCで絵を書く場合とかです。
時間を使って考えることは分かるんですけど。
>>309
マルチプロセスにするか、マルチスレッドにするか…
どちらにしても、このスレでの範疇は超えてますね。
>>309
GUIアプリの場合はWin32APIを勉強しましょう。
んでそれぐらいの質問をするとマジぎれするので

ttp://web.kyoto-inet.or.jp/people/ysskondo/
ここを読むと、絵の描き方がわかるでしょう
313309:03/11/30 10:55
書き忘れましたが、GUIアプリじゃなくて関数を使って
絵を書きたいんです。そんな関数あったと思うんですけど。
>>312
文章読解力0だな。
>>314
スマソな
コンソールでどっと単位で絵を描くってこと?
317309:03/11/30 11:07
環境に依存するのかもしれませんが、線を引く関数や円を書く関数があって、
それを使って無理やり絵のように見せるといったほうが正しいでしょうか。
情報の小出しになってすいません。ソースをコピペしたほうがいいですか?
>>317
BASIC時代のLINE絵って感じか。
319デフォルトの名無しさん:03/11/30 11:18
すみません 質問させてください。
・mallocなどを使用し確保した領域に対して、入出力ストリームを任意に割り当てることは可能でしょうか?
つまり、メモリ上に展開したファイル(の中身)に対して、seekを行いたいのです。
(テンポラリに一度書き出せば簡単にできるわけですが、メモリ上で全て行いたいのです)

よろしくお願いします。
>>319
無理
つーかそんなもの添え字やポインタを操作するだけでしょ?
>>319
環境によるだろうな。
UNIX系であればioctl使えば出来るだろうけど。
322309:03/11/30 11:25
ありがとうございました。もうちょっと自分で考えてみます。
>>319
mallocで確保しなくても「一時ファイル」を作成する関数があるよ
>>320
アホがいます。
>>324
じゃあ聞くけど、seekってなに?
>>324
むしろ俺>>323をアホと呼んでくれ、(テンポラリ使いたくない)といってるのに書いてしまった…鬱
>>319
ファイル全体のサイズでmallocしておいて
そこへfreadかなんかで全部読んでおく
あとは煮るなり焼くなり犯すなり
終わったらwriteで書き戻す

ってだけのことか?

でなくてファイルマッピングのようなことがしたいなら
特定OSスレへ逝ったほうがいい
mmapのことならmallocなんか呼ばないわな
329デフォルトの名無しさん:03/11/30 12:12
strdup()という標準関数がありますが、
char *p;
p=strdup("Hello,world");
printf("%s\n,p);
とした場合、
free(p)をする必要はあるのでしょうか?

必要がある場合、
printf("%s\n",strdup("hello,world\n");
などとした場合、どうしたらいいのでしょうか?
330デフォルトの名無しさん:03/11/30 12:14
>>329
標準関数にはstrdupなんてありません(多分C99にも)
必要かどうかはマニュアルに書いてあるでしょう。
331330:03/11/30 12:15
> printf("%s\n",strdup("hello,world\n");
> などとした場合、どうしたらいいのでしょうか?

どうしようもない。
もしstrdupがNULLを返すこともあるならこれは危険だよ。
>>329
>printf("%s\n",strdup("hello,world\n");
>などとした場合、どうしたらいいのでしょうか?

しないで下さい。マジレスです。
333デフォルトの名無しさん:03/11/30 12:18
printf("%s\n", "hello,world\n");
334デフォルトの名無しさん:03/11/30 12:24
(; ・`д・´) !? (`・д´・ (`・д´・ ;)
>>334
どういう感情表現よ?
ファイル->メモリへのマップ(つまり、mmapだな)じゃなくて、
メモリ->ファイルへのマップが欲しいんじゃないの?
>>336
違いある?
338319:03/11/30 12:29
みなさんありがとうございます。
自分の書き方が理解しづらくすみません。

自分がやりたいのは
・ファイル全体のサイズでmalloc
・そこへファイルポインタAからfreadで持ってきたデータを流し込む
・流し込まれたデータを煮たり焼いたり
・ファイルポインタAは閉じてしまう
・煮たり焼いたりしたデータをライブラリに渡す
 (seekableなファイルポインタを渡さなければいけない。だからファイルポインタが欲しい)
非常に回りくどいやり方ですが・・・。
こんなライブラリは嫌だ! スレでも立てて晒しとけ。
>>338
malloc
mmap
memcpy

>>338
それは普通は一時ファイルを作るしかないと思われ。
一時ファイルをメモリ上に作成できるかどうかはOS次第。
嫌がらないでtmpfileを使うのが得策だと思うけどなぁ。
一時ファイルを使いたくない理由が知りたいですね。
>>343
メモリより遅くていやーーーー!とか?
気になるほど巨大なファイルとも思えないけど。
345323:03/11/30 12:46
おぉっと
>>341-342俺はアホではなかった?
346323:03/11/30 12:46
もしかしたら 16ビット OSつかってるかもしれないぞ!
347319:03/11/30 12:52
やはりテンポラリを作らねばならないのですね。
ありがとうございました。

>一時ファイルを使いたくない理由
理由は以下の通りです。
・煮たり焼いたりした後のデータをユーザに見られたくない
・遅くなる(サイズは5MB前後です)

ライブラリのソースがあるので、そちらを書き換えることもできないことも
ないのですが。しかし、ライブラリが多少複雑であるのと、バージョンアップに
対応できなくなると大変なので・・・。
5Mのメモリを確保するのは結構気分悪いな・・・
>>347
> 煮たり焼いたりした後のデータをユーザに見られたくない

環境によってはそれは大丈夫かも
(うちの環境ではファイルcreate直後にunlinkでもしているのか、tmpfile()から戻ってくる時には名前が消えている)
350349:03/11/30 12:57
名前が無くてもアクセスする方法があるかもしれないけど(^_^;)
>>347
・一時ファイルをユーザに見せない方法なんて、いくらでもあるぞ。
・一時ファイルをメモリ上に置く方法もOSによっては用意されている。

だから、後はOS次第なんだからUnixスレなりWin32APIスレなりでどうぞってば。
352あすたりすく:03/11/30 12:58
ここのループなんだけど教えて{
srand((unsigned)time(NULL));
a=rand()%4+1;

do{
printf("\n\n\n\n\n%d\n",a);
printf("↑の数字を覚えましたか\n1.はい\n");
gets(str);
o=atoi(str);
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
}while(o!=1);

printf("\n\n全て出力された数を入力してください\n");
gets(str);
ran[i].data=atoi(str);
if(ran[i].data!=a)
{
printf("残念入力ミス\n");
return;

userが何けた覚える自信がありますかで
入力された数になったら終了という問題なんですけど
どうしたらいいのでしょうか教えてくださいお願いします。

>>352
宿題なら宿題スレへ
宿題じゃないならもっと詳しく書け
ここのループ・・・どこのループ?コメントでも入れて教えてくらはい
355デフォルトの名無しさん:03/11/30 14:00
ここのループなんだけど教えてってところのループじゃないの?
ループがないYO!
357356:03/11/30 14:02
「ここのループなんだけど」のところにはないという意味で。
do-while
気になる点をいくつか。
・乱数の系列の初期化は毎回行なってはいけない。
・gets()は危険なのでfgets()を使用するべき。
・ソースを張るときは中途半端な張り方をせず、関数単位など判りやすい張り方をすること。
分割コンパイルをして構造体をextern で共有したいのですがどうすればいいでしょうか?

main.c
def.h
func.c

というようにソースが分かれています

構造体はdef.hで定義して main.c と func.c の両方でインクルードしています。
しかし、
---------------
main.cで
extern GenreList_t *gList_cur;
---------------
func.cで
extern GenreList_t *gList_cur;
---------------
とすると
main.obj : error LNK2001: 外部シンボル ""struct _genre * gList_cur" (?gList_cur@@3PAU_genre@@A)" は未解決です
といわれてしまいます。
どのようにすれば解決するか教えてください。
本体を書け。
>>360
main.c か func.c のどちらかで
GenreList_t *gList_cur = NULL;
としろ
>>362
ありがとうございます!
直りました。感謝ですm_ _m
>>363
理由は分かったか?

extern *** とやったらそのソースファイルをコンパイルするとき
*** がそのソースファイル外にあると期待する

*** を使用するすべてのソースファイルで extern *** とやったら
どこにも *** が定義されない

どこか一カ所で *** を定義する必要がある
>>364
>extern *** とやったらそのソースファイルをコンパイルするとき
>*** がそのソースファイル外にあると期待する
なるほどです、だからどこでも初期化をしなかった場合はおかしくなるんですね。
わかりやすい説明ありがとうございます。
例外として、明示的に初期化してるときは、
extern 付いてても定義されるけどね。
空の定義ができない処理系だな
int func(int a[])

int func(int *a)
は、同じものと考えていいんでしょうか?
369デフォルトの名無しさん:03/11/30 18:31
>>368
うん
370368:03/11/30 18:37
>>369
どうも。
371デフォルトの名無しさん:03/11/30 22:08
皆さんに質問です。
別のファイルで int hoge[] = {1,2,3];と定義した配列をexternした場合、
sizeofでバイト数を取得する事が出来ません。
どのようにしたら取得できますでしょうか。
372デフォルトの名無しさん:03/11/30 22:11
sizeof hoge でいいんじゃないの?
373デフォルトの名無しさん:03/11/30 22:14
>>371
どうしようもない。
マクロかなんかを定義しておけば??
374371:03/11/30 22:22
>>373
同じファイルないで変数を定義してそいつに代入すればいいですかね。
375デフォルトの名無しさん:03/11/30 22:23
>>374
それでもいい。もちろんそれもextern
>>371
hogeを定義した翻訳単位内にサイズ取得関数を定義すれ
377デフォルトの名無しさん:03/11/30 22:25
char から const charへ型変換できないのですか?



378デフォルトの名無しさん:03/11/30 22:26
>>377
一体なんの意味が?
char *からconst char *ならまだしも。
379371:03/11/30 22:33
皆さんどうもありがとうございました。
この辺の事って本見てもなかなか書いてないですよね。
少し、工夫してみます。
本に書いてあることができても、ちょっとした応用が難しいと感じる17の冬。
・・・もうすぐC言語のテストだ。
Cのテストってぇ?(・ω・`)
382デフォルトの名無しさん:03/11/30 22:43
printfつかうと一気にファイルサイズが10倍に?!
383デフォルトの名無しさん:03/11/30 22:46
char *からconst char *
でいいので教えてください

char *a[]={"1","2","3"};
fputs(a,fp);
とするとconst char*でないと駄目だと怒られます
384デフォルトの名無しさん:03/11/30 22:48
>>383
a(を評価した結果)はchar *じゃなくてchar **でしょ・・・
型が**なので *aとか *(a+1) などとしましょう

もしくはa[0] a[1] などなど
a[i] = "sine";
のようなことをする予定がないなら
const char * const a[] = { "1", "2", "3" };
>>386
cosine
>>380
うらやましい
その若さで正規の訓練が受けられるなんて・・・
>>388さん

オラにもトレーニングをお願いしたい!
>>389
エロいな
391380:03/11/30 23:23
>>381
>>388
そんなたいしたものじゃありませんです。
ただ高校で数学演習っていう授業があって、C言語のさわりをやっているに過ぎませんから。
数学A,B,Cだね
393デフォルトの名無しさん:03/12/01 09:48
C言語の歴史について詳しく載ってるHPありますか?
394デフォルトの名無しさん:03/12/01 09:51
395デフォルトの名無しさん:03/12/01 09:56
396デフォルトの名無しさん:03/12/01 10:09
>>395
英文キタ━━━━━(゚∀゚)━━━━━!!!!
翻訳ソフト準備するか・・・ありがとうございます。
397393:03/12/01 11:16
日本語のページでC言語の歴史について詳しく載ってるHPがなかなかみつかりません・・・
歴史の紹介が簡単なものばかりで詳しく載ったところがない・・・
どこかにありませぬか・・・?
>>397
学校に通ってるなら図書館に行くことをお勧めする。
おっとうちの学校は図書館って言ってて普通は図書室って呼ぶね

市立図書館とか県立図書館に技術書は期待できない(クソ本しか置いてない
C言語の歴史とかだったらおいてあるかも知れないね

コンピュータ、とか情報 とかそこら辺の本棚にあるとおもわれ
>>397
こんなんどう?
ttp://anshun1.fjct.fit.ac.jp/kougi/PDF_files/kiso1_03_04.pdf

pdfなんでめんどくさくて読んでないけど。
>>399
パスワード求められたぞ・・・
>>400
おや、それは失礼。
ではGoogleで検索してHTMLバージョンをどうぞ。
質問です。ファイル入出力でアルファベットを
大文字のアルファベットに変えて出力するプログラムをつくったのですが、

#include<stdio.h>
#include<ctype.h>

main( int argc, char *argv[] )
{
FILE *fp;
char *p;
char strbuf[1000];

fp = fopen( argv[1], "rb" );
if( fp == NULL ){
fprintf( stderr, "ファイルオープン失敗\n" );
}

while( fgets( strbuf, 1000, fp ) ){
for( p=strbuf; *p; p++ ){
if( isalpha(*p) ){
toupper(*p);
}
}
printf( "%s", strbuf );
}

fclose( fp );
}
上記のプログラムを実行しても
大文字に変換されません。これはどうしてでしょうか?
403デフォルトの名無しさん:03/12/01 16:37
>>402
まず、isalphaによる検査は必要ない。
そして、toupperの戻り値を*pが受けなければ*pの内容が変わることはない。
*p=toupper(*p);
>>402
とりあえず設計段階ではコマンドラインからファイル名の取得はやめてみよう。
あと2chブラウザ用にスペース入れてソース参照用に自分を参照していただければありがたいです

*p = toupper (*p);
としましょう
405ゴメス:03/12/01 16:47
メニューを作っているのですが質問です。

まず、abc・・・から選択させます。
その後その下に11 12 13・・・と言うメニューを作ってあります。
そこをピックアップするとのような感じです。
しかし、これだと11しか読み込んでくれません!それ以外は、デフォルトに飛びます。
誰かお返事お願いします。
406ゴメス:03/12/01 16:50
switch(mno) {
case 11 :
textattr(14);
cprintf("あなたが知りたい人の、任意の科目を表示します。\r\n") ;
no = gno() ;
kno = subjectno() ;
printf("学籍番号%dの%4sの成績は", no, subj[kno]) ;
printf("%d点です。\n", G[no][kno]) ;
break ;
case12 :
textattr(14);
cprintf ("あなたが知りたい人の、合計点を表示します。\r\n");
no = gno();
printf("学籍番号%dの合計点は %d点です。", no, total[no]) ;
break ;
default :
(・・・省略)※入力が間違っていますので再入力してください※\r\n\n") ;
     break ;
}
メニューってメニューバー?ポップアップメニューのことだよね?
408ゴメス:03/12/01 16:51
switch(mno) {
case 11 :
textattr(14);
cprintf("あなたが知りたい人の、任意の科目を表示します。\r\n") ;
no = gno() ;/*90行目*/
kno = subjectno() ;
printf("学籍番号%dの%4sの成績は", no, subj[kno]) ;
printf("%d点です。\n", G[no][kno]) ;
break ;

case12 :
textattr(14);
cprintf ("あなたが知りたい人の、合計点を表示します。\r\n");
no = gno();
printf("学籍番号%dの合計点は %d点です。", no, total[no]) ;
break ;

case13 :
/*略*/
break ;

default :
i = 1;
textattr(13) ;
cprintf("※入力が間違っていますので再入力してください※\r\n\n") ;


break ;
}
409デフォルトの名無しさん:03/12/01 16:52
>>405
何を読み込まないの?
410ゴメス:03/12/01 16:53
ポップアップでは無いです。
携帯電話のメニューとかみたいな感じです!!

二重書き込みすいません。タブは反応しないのですね、、、
>>409
スイッチが分岐してくれないって意味じゃない?
case の後に空白を入れとけ。
413ゴメス:03/12/01 16:54
>>411
そういうことです!
scanで11を入力するとcase11に行ってくれるのですが、
12を入力すると、デフォルトに飛ばされてしまいます。
414デフォルトの名無しさん:03/12/01 16:55
見る限り、mnoの値が11から13だったらそれぞれの文を実行するはずだけどなぁ。
とりあえずdefaultがあるから何かは表示されるはずだ。
>>412さすがだなあにじゃ
416414:03/12/01 16:56
>>412
そういえば空白がないな・・・・
空白がないとgoto用のラベルだとコンパイラに判断されてしまう。
417414:03/12/01 16:58
defaultのスペリングを間違えてもエラーにならないという有名な話に似ているね。
キーワードの色を変えて表示してくれるエディタを使うことをすすめるよ。
418ゴメス:03/12/01 16:59
(´・ω・`)ゴメンナサイ。
出来ました。
419ゴメス ◆oJjvkz7VeA :03/12/01 17:02
あ、ありがとうございました!
>>418は偽か?w
421ゴメス ◆oJjvkz7VeA :03/12/01 17:51
本物っすー!!w
お礼を言うの忘れてましたから帰ってきました。(´・ω・`)
>>421
突然トリップをつけたりするからだw
423デフォルトの名無しさん:03/12/01 21:43
わかっていること。
元のプログラムはinetd をつかったサーバで、
ファイルやネットワークの読み書きは標準入出力を使っています。

これをwinxp + borland c++ 5 で動くようにしたい。
自分の開発環境にはflock や lockf や fcntlはありまえん。

とりあえずファイルの排他処理をやろうと思っています。
io.h の中にそれらしき関数を見つけました。
lock, locking, unlock。
lockとunlockを使えばうまく処理できそうなのですが。
代案はありますか? よろしくお願いします。
次の質問どうぞ
425423:03/12/01 22:37
解決しました。お騒がせしました。
426デフォルトの名無しさん:03/12/01 23:30
一回のfor文で三つのループを処理する事って可能ですか?
100個でも1000個でも可能。
100000個でも1000000でも可能。
>>426
質問が的を射てないな

for を一回というのは微妙だ、何か意味でもあるのかぃ?
なぞなぞチックだなぁ。本当の質問者とはとても思えん。
forを何重にもネストしても良いかって事なのかなぁ
while
433デフォルトの名無しさん:03/12/01 23:38
for(a;b;c){
for(d;e;f);
whil(g);
do{;}while(h);
}

こういうことです。
まだ2重でそ
>>426 = >>433 なの?
こういうことですといわれても意味不明です。
そりゃ>>431だろ
というか出来ますかっていう前にやってみろそんくらい
>>436
1000個もネストする奴はいないだろ・・・w
438デフォルトの名無しさん:03/12/02 00:14
あ、しつれいしました。
例えば1〜100までの和と200〜300までの和をまとめる
と言ったものを1つのforで処理できますか?

と訊きたかったのです。
>>437
ああ?
どこに1000個って?
質問者は3個のループを実装したいようだが。

>>438
実際どうなのかしらんけど、その例なら1つのforで可能。
とんでもなく複雑でない限り、適当に変数やっとけばなんぼでもできるが、
できれば分けて書いたほうがいい。
>>438
意味的には分けるべきじゃないかと思うが、できる。
但し、片方は100回ループでもう片方は101回ループなのでループ内で分岐する必要がある。
#やっぱり分けるべきだ。
>>426 から
>>438 の意味合いを想像できた奴がいたら神認定。
#include <stdio.h>

int main(void)
{
inti, j, k;
intl = 2, m = 3, n = 4;

for(i=j=k=0; k < n; ++i < l || (i=0, ++j < m) || (j=0, ++k))
printf("i=%d, j=%d, k=%d\n", i, j, k);

return 0;
}
443438:03/12/02 00:24
分ける以外に方法があったんですね。
よろしければ簡単に教えていただきたいのですが・・・。
>>442
そんなの動かないよwwww
1〜n までの和は定数時間で求められるのになぜ for ループを使うのか
446デフォルトの名無しさん:03/12/02 00:27
>>438

int i,total=0;
for(i=1;i<=300;i++){
if(i>100&&i<200)
continue;
total+=i;
}
>>444
( ゚Д゚)ハァ?
448438:03/12/02 00:28
ガッコの課題です。
a=0;b=200;
for(i=1;i<=100;i++){
a+=i;
b+=i+200;
}
>>445
もっとも。
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
>>449
1-100はいいとして、201-300になってるじゃん。
200-300だってよ。
#妙な課題だ。
>>451
最後に b に 200 足す
>>447
ネタニマジレストハ
454402:03/12/02 00:32
>403,404
即レスしてくれたのに、
遅レスで申し訳ございません。
toupperはパラメータがポインタでなく、
整数型だから、返値を受けなければならないんですね。
ありがとうございました。
>>444
( ´,_ゝ`)
>>451
(☉◇☉)Σ
>>451
bの初期値を見よ。
int i, j;
int sum1 = 0, sum2 = 0;

for(i=1, j=200; i<=100 && j<=300; i++, j++)
{
sum1 += i;
sum2 += j;
}
うへー、気色悪ー
#いや、見落としてた・・・_/ ̄|○
巧くいきそうに見えて巧くいかない>458
>>458
(☉◇☉)Σ
>>461
激しく笑い死にました
463デフォルトの名無しさん:03/12/02 02:31
mainから呼び出された関数中でエラーが発生した場合に、
プログラム全体を終了させることを考えました。
exit()、abort()のどちらを使えばいいんでしょうか?
そもそも、プロの方はこの2つの関数をどのように
使い分けているんでしょうか?
a=0;b=0;
for(i=0;i<=100;i++){
a+=i;
b+=i+200;
}
>>463
exit - 正常なプログラムの終了
abort - プログラムの異常終了を生じさせる
というわけで、exit()でしょう。
466デフォルトの名無しさん:03/12/02 03:39
465さんが書いてるように、よくCの参考書なんかで
abort - プログラムの異常終了を生じさせる、ってのをみかけるんだけど、
”異常終了を生じさせる”ってなんか、イメージ的に危険な香りがしませんか?
もう少しわかりやすいabort()の説明を求む!!(・∀・)
abortするとFILEに書き込もうとした内容が反映されてなかったり
終了時に変なメッセージが表示されたりcoreを吐いたり
もちろんatexitで登録した関数も実行されないし
あと、C++なら呼ばれるべきデストラクタが実行されてなかったり。

malloc失敗等、回復不能の致命的なエラー時に全てをあきらめて強制終了。
>>464
( ´,_ゝ`)
>>464
(?◇?)Σ
struct A{
char *a[];
};

int main(){

struct A A;

A.a[0]="C言語";
A.a[1]="Java";
A.a[2]="C++";
return 0;
}

この記述って間違っている?


>>470
a の領域が確保されていない
[ ][ ][ ][ ][ ][ ][ ][ ][ ]と仮に領域を確保したとしよう








でも無理
char に char* を代入できないってエラーが帰ってくると思うよ
473デフォルトの名無しさん:03/12/02 11:08
abortは使わないなぁ。
まあ、assertを使ったときに間接的に使うけど。

>>470
struct A{
char *a[3];
};
こうでしょ。
>>472
どーでもいいが、 char *a[] と書いてるぞ?
>>474
・・・(゚д゚;

・・・・まことに申し訳ございませんでした。心より深くお詫び申し上げます
476470:03/12/02 11:45
*a[3];

ポインタに配列って無理なの?

なんか俺馬鹿な質問をしていますか?
>>476
>ポインタに配列って無理なの?

無理じゃないが

>struct A{
>  char *a[];
>};

では、「a」のサイズが不定だろ?
配列の宣言は、コンパイラに配列のサイズを教えなければいけない。
[]が*と同じこともあるが ***違うのが普通*** であることを
多くの初心者が忘れ、そしてドツボへ直行する

教える立場の者が ***違うのが普通*** と思っていない
まことに痛ましいケースもたいへん多い
仮引数でそう書けるようにした人が愚か
ウザい書き込むなカス
シンタックス砂糖だよ
>>478
s/ケース/事故/
>>483
あれか、



いや、やめた。

やめんな
486470:03/12/02 22:24
>>478
よく話つかめないけど

char *a[10];

こう書くのはいいんだよね?
487デフォルトの名無しさん:03/12/02 22:34
>>486
もちろん。
char *a[]なんて書けるのは仮引数と外部参照宣言の時だけ(だよね?)。
>>487
これに回答してはならない
連係編集時のセマンティクスについて
自分なりの解釈を持つ機会を奪うことになる
>>487
char *a[] は **a と同等の威力を持ちます
>>489
そして初心者がはまります
>>487
いやブロックの中でも書けるよ
ついでに混乱させとくか…

char *a[];

char (*a)[];
は違う
>>491
外部参照するための宣言を、でしょ?
>>492
右から読んでくからだっけ?

配列を指すポインタと
ポインタを持つ配列の違いだよね
495492:03/12/02 23:14
>>494
まあ領域が確保されないから実質同じなんだけどな
>>494
ネタですよね
>>493
( ゚Д゚)ハァ?
>>496
逆だよな
>>497
( ゚Д゚)ハァ?
>>492
ワラタ

で、続きは?
501487:03/12/02 23:21
>>491
ブロックの中で書けないとは一言も言っていないよ??
>>499
#include <stdio.h>

int main(void)
{
char *a[];

return 0;
}
試してみろ,コンパイラ通らんから
#include <stdio.h>

int main(void)
{
extern char *a[];

return 0;
}
これは通るがな
>>502
は?そんなもんとおるわけ無いですが。
>>502
それは>>497に言うべきなんじゃないか?
>>503
はい。そんなもんはとおります。>>497 で言っているとおり。
507デフォルトの名無しさん:03/12/02 23:26


 ハ
○○る

>>502
マジだ
char a[];
でも通らないね
初期化子つきはこの範疇に入らないのかと言ってみるテスト。
いや、漏れは割とよく使うんで。

char *a[] = { "foo", "bar", "zot" };
>>493 ですが、漏れ>>491 に反論した覚えは無いけど、なんでもめるの?
>>508
あたりまえすぎ
>>509
入らない。
>>493 ですが、>>497は日本語ちゃんと嫁
>>511
[]は*と同じだとずっと思ってました
もう一度出直さなきゃ・・・
結局[]が何で通らないかわからないや。
宣言時の[]はメモリを割り当てるという意味があるのか。
配列はホンマもんで配列だったんだなぁ
>>514
そうそう。そうでないとコンパイラは困り果てます。
>>512
そのこころは領域が割り当てられてるか否かってことで OK?
「指し示すもの」をつくるのと
「そこに配列を用意する」のと
「配列があるように見立てる」の違い
>>514
仮引数だと(一番目は)そうなるだけ(例え添え字を書いたとしても無視される)。
一種の構文糖ってやつだね。

ここでの一番目というのはint func(char a[これのこと][20])
>>515さん
char a[] = "今日は良い天気ッダ!";
とやっても
char *a = "今日は悪い天気ッダ!";
と両方コンパイルしてみましたが両方通りました(当たり前ですが)

[] の方は関数内で宣言された配列として処理をして
* の方は自由領域から得た場所を指すポインタという意味になるのでしょうか?
>>519
上は"今日は良い天気ッダ!"が丁度入るだけの大きさの配列を作って中身をその文字列で初期化する。
下はポインタをどこかにつくった"今日は悪い天気ッダ!"の先頭アドレスで初期化する。
ゆえに上は書き換え可、下は不可。
>>519
ごめん、説明うまくないから実装絡めて話すね

その a が自動変数だとしたら
a[] はスタック上に一時的に配列の実体が確保されるし、
*a はどこかの文字列リテラルを指し示している、ってことです。

なので、*a の場合に中身をイジってもROMで内容が変わらなかったり、
変更できたとしても近辺データを壊しちゃったりする可能性が高い。

基本的に *a は const な領域を指してると考えたほうがいいかも。
>>1のリンク先を読んだ事あるんだろ?みんな。
>>523
これを読んだことがないかも
"C言語なら俺様に聞け! Part 67"
>>523
ねーよ
>>520-521
ありがとうございます
難しいです^^;

文字列リテラルという言葉すら知りませんでした...(今調べましたけど
>a[] はスタック上に一時的に配列の実体が確保されるし、
>*a はどこかの文字列リテラルを指し示している、ってことです。
a[]は関数が始まった時にスタックメモリを使用して領域を確保するんですね
*a の場合はプログラムが起動したときでしょうか?

ずっと疑問に思っていたままにしておいたのがまずかったですね^^;
プログラム内で決めた文字列についてはどのように領域を確保するのか全然知りませんでした。
ポインタや配列の項目はすごい不思議な世界ですね

見つけたページ
  ttp://www9.plala.or.jp/sgwr-t/c/sec10-2.html
>>526
だから、>1のリンク先を見れ、と。
>>1のリンク先?
http://www.catnet.ne.jp/kouno/c_faq/c6.html
これのことか・・・・これのことかああああああ(ry
>>526
>a[]は関数が始まった時にスタックメモリを使用して領域を確保するんですね
はい。関数内で宣言したときの話ですけどね。

char *a = "...." ;
と関数の内部でやれば、「指し示す」ための領域がスタック上に一時的に
確保される。

"...." の部分のデータはプログラムのどこかにあらかじめ用意されていて
そこを指し示しているってことです。
(・3・)エェー? ここまできて釣。。。。?
>>527-529
ありがとうございます。

int a[40]で宣言して
sizeof a とやると120が変えるのに

int *b = malloc (40 * sizeof (int));で
sizeof b とやると4が帰ってくるか謎がわかりました。

配列は
a:[][][][][]...となっていて
b:*=> [][][][]...となっているんですね。

引数の[] と * が同じだと言われていた気がして同じものだとばかり思ってました
>>531
>>527氏の言うそこのFAQは一通り目を通しておくといいかもね
>>532
ハイ、多分無知全快でのカキコなのでレスのしようがないのかなと思ってました。すみませんでした
今も読んでいます

ところでやはりCのバイブルと言われるぐらいだからK&Rは買ったほうがいいでしょうか?
534デフォルトの名無しさん:03/12/03 00:15
http://pc2.2ch.net/test/read.cgi/php/988918264/
ここで俺(723他)が言っていることは間違っている??
NULLpo論争やるなら向こうでやってね > ALL
536デフォルトの名無しさん:03/12/03 00:18
ポインタの配列がよくわかりません・・・

#include<stdio.h>
void main()
{
int i;
char *parray[]={"童貞","不細工","貧乏","低学歴"};

for(i=0;i<=3;i++)
printf("%s\n",parray[i]);
}

配列parray[0〜3]には、文字列のアドレスが格納されてると思うのですが
printf("%s\n",parray[i])でなぜ文字列がプリントされるのでしょうか

もしや、parray[]はポインタの添字表記法なのですか?
0 == NULL にならないなんて初めて聞いた…
>>533
正直K&Rは言語の思想を知る意味合いならいいかな、と思うけど…どうなんだろう?
と言うことを分かるためにも読んでみたら?
>>536
printfの%sは文字列へのポインタを受けてそれを表示するから。
>>536
あなたは自分で問題を解決できている。
parray-parray[0]→"童貞"
    -parray[1]→"不細工"
    -parray[2]→"貧乏"
    -parray[3]→"低学歴"

という事で良いでしょうか?
>>541
はい〜。
NULLといえば、可変個の引数を取る関数の可変の部分には渡してはいけないんだな。
(void *)0と書かないと、NULLが0と定義されている環境では整数の0が渡ってしまう。
NULL粘着
>>543
( ゚Д゚)ハァ?
546536:03/12/03 00:32
みなさま、どうもありがとうゴザイマス(ペコリ
>>545
たのむ、そのエサには食いつかないでくれ!
>>543
キャストしていない 0 はヌルポインタに変換される
覚えておけルーキー
>>548
...だから関数が求める型がなんなのか判断できない。
>>548
可変個の引数って言ってるから、型は不明なはず。
ただし>>543よ、杞憂って言葉を知っているか?
>>550
実際問題が起きることは滅多にないだろうけどね(^_^;)
C FAQ読んでいて気づいたの。
>>543は稀有ってことか
( ゚Д゚)ハァ?
可変引数の使い方を理解してるのか?
可変引数を使うには事前に可変な部分の型や個数を知っておく必要があるだろうが
>>553
ではprintfの引数の個数はいくつなんですか?
個数を知っておく必要があるんですよね?
>>555
ハァ・・・
553==556は、一体何を勘違いしているんだ?
すまん、>>556>>553 だった。
>>557
呼び出し側はいくつの引数を渡したか、そしてそれらはどんな型なのか知っているということじゃない?
確かにそうだけど、ここではそんなことは問題じゃないんだよね。
引数型のプロトタイプが無いんだから、コンパイラはintの“0”を積んじまうだろ。
NULLポインタのビットパターンとしてオール0以外を使っている場合に拙い。
そもそもsizeof(char *)!=sizeof(int *)!=sizeof(int)かもしれない。
>>555
おまいはprintfでフォーマット指定をしないのですか?
>>561
脊髄反応しないで、どういったことが語られているのかを読め。
わからんなら、すっこんでろ。
可変引数の関数を自身が使う場合をいってるのね。
つまり、コードを書く時に個数や型をってことね。

…関数を実装する場合の時としか取れない流れのタイミングで…
>>563
自分で可変引数の関数を実装するときでも何らかの形で型を指定するだろ
型の指定をしないのは型が全て同じ(例えば全て文字列)ときだ
つまり、可変長引数の関数には NULLがつかえないって言ってるんですか?
>>565
定数としてのNULLを可変の部分に書くと、様々な条件がそろったごく稀な環境で不具合が生じる可能性がある((void *)0と書くことで回避可能)。
char *p=NULL;のpを渡すのは問題ない。
>>565
まぁ>>554のリンク先でも読め。話はそれからだ。
その条件ってのが、
・NULLが#define NULL 0と定義されている
・整数の0とヌルポインタの大きさかビットパターンが異なる
の両方を満たしている。
実装上定数としてのNULLを可変長引数部分に書いたとしても、
可変長引数をもつ関数の内部ではそれをポインタにキャストして見ればいいと
思うんですが。
>>569
キャストは「関数の内部」がするものではなく、コンパイラがするもの。OK?
>>567
みたよ〜。

>>570
おけ!

ども!
定数の0をポインタにキャストすればヌルポインタになるけど、
int a=0;のaをポインタにキャストしてもヌルポインタになると決まっていたっけ?
const int a=0; ならなりそう…


だけど、なんか不安ですね。
>>572
規格を知らなくとも実装を思い浮かべれば気づく。
コンパイラにはaの値を知らない(関知しない)ので無理。

>>573
それは定数のふりをした、値の変更できない変数だからな。姑息な手段を使えば変更できちゃうし。
C++だったら最適化により、文字通りの定数になり得るかも。
>>574
だよね。じゃあ>>569の意見はダメだね。
無理だって。
誰かも書いてるけど、intとポインタのサイズが等しいことは保証されてないでしょ?
例えば64bitだとLP64でもLLP64でもsizeof(int)!=sizeof(void*)だし
DOS時代のcompact/mediumモデルとかも。

int型の0とヌルポインタのサイズが違う以上、相互変換は絶対に不可能。
保証されているのは、「ソース上に現れる整定数0」が
ポインタが必要な場面ではヌルポインタに変換されること、これだけ。
どうでもいいけどlargeモデルだった
はー、おまえらまたNULLぽのはなしですか?
そうだ。大きさが違う場合も問題だ。
>>578
可変個の引数とぬるぽの関係の話は初めてじゃない?
C FAQにあるほどだから無駄話と言われれば言い返せないけど。
>>580
そうか。かんばってくれ。
眠いので寝るぽ

おやすみ
582デフォルトの名無しさん:03/12/03 15:38
この行から型名が必要と言うエラーが出るのですがどういう意味でしょう?

float average(int no,G[no][kno]);
>>582
そのままの意味。
Gの型名が必要だ。
584デフォルトの名無しさん:03/12/03 15:45
あの、型名ってなんですか?
検索してもうまくひっかからないっすT_T
585デフォルトの名無しさん:03/12/03 15:45
>>583
#define G int aとしているので型名はあるはずなんですが。
氏ね
>>585
そんな事までこっちが知ると思うか?
どっか行け
588デフォルトの名無しさん:03/12/03 16:12
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
res = write(sockfd, buf, n);

凄く省略しましたが、上記の手順で
res(writeの返り値)が-1になり送信に失敗します。
TCP/IPで通信すると成功するのですが(SOCK_DGRAMでなく、SOCK_STREAMを使用)
UDPではwrite()は使えないものなのですか?
それとも何か間違ってます?
589デフォルトの名無しさん:03/12/03 16:18
>>588
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.18
これとsendのマニュアルを見る限り、writeは使えない。sendtoやsendmsgを使う。
それと、スレ違い。
接続されていないんだから使えるわけないし。
>>588
スレ違いだが、UDPの場合には送信先を指定する必要がある。
よって、sendto()辺りを使用汁。
SOCK_DGRAMでもconnectしたらwrit使えるんでないかい?
>>592
藻前はコネクションレス型を(ry
594592:03/12/03 16:56
>名称
> connect - ソケット上で接続を開始する
>解説
>引数はソケットです。このタイプが SOCK_DGRAM の場合、
>この呼び出しはソケットが結び付けられる通信相手を指定します。

で、コネクションレス型がどうしたって?
>>594
正直、スマンかった…
>>588
どうでもいいうえにスレ違いだけど、TCP/IPといったらUDPも含まれるよね。
広義の意味としてはそうだね。
>>588は「/IP」が余計
599588:03/12/03 17:31
>589-598
みなさんありがとうございました。
sendto()にします。
ちなみにここはC言語質問スレじゃないんですか?
>>599
> 標準Cではできない事の質問は・・・・・

これ。そういう質問は http://pc2.2ch.net/test/read.cgi/tech/1063035045/ ここで
601588:03/12/03 17:52
>600
了解しました。
arigatougozaimasita。
602デフォルトの名無しさん:03/12/03 17:58
ヘッダファイルについての質問です。

全体で
hoge1.c、hoge2.c、func1.c、func2.c、func3.c
という5つのファイルがあったとします。
hoge1.c では func1.c、func2.c 中で定義されている関数を、
hoge2.c では func2.c、func3.c 中で定義されている関数を、
それぞれ呼び出しているとします。

この場合、
func1.h、func2.h、func3.h
という3つのヘッダファイルを作成し、その中で
func1.c、func2.c、func3.cで定義されていて、かつ外部に公開する
関数のプロトタイプ宣言をし、
hoge1.c 中でfunc1.h、func2.hをインクルード、
hoge2.c 中でfunc2.h、func3.hをインクルード、
とした方がよいのでしょうか?

それとも、全体で1つのヘッダファイル: common.h のようなヘッダを作り、
その中で func1.c、func2.c、func3.cで定義されていて、かつ外部に公開する
関数のプロトタイプ宣言をすべてし、
hoge1.c の中でcommon.hをインクルード、
hoge2.c の中でcommon.hをインクルード、
とした方がよいのでしょうか?

長くなってすんませんが、どなたか的確なアドヴァイスをおねがいしまつ。

603デフォルトの名無しさん:03/12/03 18:01
>>602
ソースファイルごとにヘッダーファイルを作るのが理想なんだろうが・・・それほどソースファイルが多くない時はcommon.hをつくっちゃうかな。
>>602
どっちでもいいじゃん。何を悩んでいるのだ?
>>602
とりあえず
func1.h, func2.h, func.3を作り
common.hの中でfunc?.hをインクルード汁

hoge1.cのようにfunc3を必要としないソースや
hoge2.cのようにfunc1を必要としないソースが
ばんばん出てくると「肛門逝ってよし!!」と思える日がすぐ来るよ
>>602
取りあえず
hoge1.h で func1.h,func2.h をインクルードし
hoge2.h で func2.h,func3.h をインクルードし

hoge1.c で hoge1.h をインクルードし
hoge2.c で hoge2.h をインクルード汁

hoge3.c で hoge1.h,hoge2.h をインクルードしても大丈夫な#defineのおまじないを忘れるなよ
5×5くらいの大きな連立方程式をcで解くとき、もっとも精度の出る方法は何なのでしょうか?時間はかかっても良いので。
LAPACK で逆行列求める
609607:03/12/04 20:49
LAPACKですか、よく分からないですが、これはunixで使用できるライブラリですか?できればvisualC++で直接ソース書いてやりたいんですが…。
3.13.6 ガウス・ジョルダン法を使った逆行列の計算
http://www.asahi-net.or.jp/~uc3k-ymd/Lesson/Section03/section03_13.html
611デフォルトの名無しさん:03/12/05 16:05
char型の変数に50000とかの数値を入れたらどうなるのでしょう?

次のメモリにあふれた数値が書かれる?
それとも切り捨て?
>>611
自分でやってみれば。
>>611
50000 & ((1 << CHAR_BIT) - 1) になるよ。
>>613
自分で試せもしないやつに、そんなこと理解できるわけも無し。
615611:03/12/05 16:33
>>612
こういうのって処理系に依存しないの?
次のメモリの数値がどうなるのか知りたかった。

#define HOGE (volatile unsigned char *)(0x400000 + 0x800)

HOGE = x + 0x20 * 256;

ってソースがあるんだけどこういう場合って0x20*256はどこにいくのかな?って思って。
このHOGEの次のメモリにコマンド用のメモリがあって
ここに0x20を入れる処理なんだけど
これって正しいのか?って思って。

試したいんだがH8なんでちょっと時間がかかるんだな。
616611:03/12/05 16:34
間違った。
#define HAGE (*(HOGE + 0x06))

HAGE = x + 0x20 * 256;

だ。
charが2byteあってもC的には合法でつヨ。
>>615
char a='A';の'A'がint型だということを知っている?
'A'A'はchar型に収まるだろうけど、上位桁の0が他の領域を壊すことはないよね。
>>617
Cの規格には反するが。charは1バイト
620618:03/12/05 16:39
'A'A'になっとる・・・'A'の間違い。
621611:03/12/05 16:39
>>618
わお!サンクス。

ってことはこのソースだとHOGE+1には何も書き込まれないって事ね。
>>617は何にレスしてるの?
>>621
自分で確かめろよって何度も言ってるだろ?
おっと。合法なのは、charが16bitの場合か。
>>624
charは8bitでそ?
charが16bit環境ってあるの?おせーて
char c=50000;でcにどんな値が入るかは処理系依存だろうが、cが示す領域を超えて書き込むってことは絶対にない。
00000000 + 1
=
00000001

11111111 + 1
=
00000000
>>625
もし8bitと決まっているならCHAR_BITマクロは存在しないよ。
charもintもみな32bitという環境で開発したと言っていた人がこのスレにいたね。
>628
32bit環境というのはCPUの事じゃねーの?
>>629
話の流れと書き込み内容から見て、勘違いとは思えない。
>>630
確かにそうかもしれないし
なにより>>628さんが言ってたわけじゃないらしいから、真偽がつかめないぽいなぁ・・・

マルチバイトcharがあるからとは考えられない?
>>628
9 bits の環境がある、という話はよく聞くね。
7.5ビットって無い?
13+3/4ビットならある。
1ビットで 0 1 2 をあらわせる環境なら知ってるよー
3進コンピュータか...。
638デフォルトの名無しさん:03/12/05 17:09
某所で二進じゃないとbit(binary digit)とは言わないとつっこまれた。。。。
trit
シリアル転送じゃないんだからあるわけないじゃん。<7.5ビット
8 bits なんだけど、偶数しか扱えないとか。
>>637
量子コンピュータってうまくやれば3通り使えるよね
643デフォルトの名無しさん:03/12/05 17:24
http://seclan.dll.jp/c99d/c99d08.htm

これを見て思ったんだけど、string.hにはなんの変更もないのね(;_;)
もうちょっと文字列処理関数を増やしてくれてもいいのにさ(;_;)
>>643
そこんところはD言語がカバーしてるから大丈夫
別言語じゃん!
二次元配列を渡す関数の引数の
↓のように書いたらだめなの?

void morehatensaidetune(int unco[][]){

unco[0][0] = 3;
}

int main(void){

int syonben[10][10];
morehatensaidetune(syonben);

return 0;
}






またかよ。

>>113 から嫁。
ドイツ語を読み込んで出力するには、どうすればいいんですか?
getchar()だと全部でてこないです…
コンソールがドイツ語に対応してないだけの気が。
Unicodeを習いましょう。

ところでさ、自分がやりたい事が凄いレベルが高いけどやりたいって時みんなどうする?
気長にやる
カップ麺食べる
えぇ〜・・・
でもさ。文字コード 23 を呼んだときに EOF 返されたときは困った
結局バイナリで開いたらうまく行ったけどアレのせいで一週間ぐらいあれこれやってたなぁw

結構時間かかっちゃうじゃんね
どうなのよ?
> 文字コード 23 を呼んだ
(´Д`)?
質問があります。
ポインタを使った、二次方程式の解法を示すプログラムがよくありますよね。
あれはなぜポインタを使わなければならないのか教えてください。
ないです。
>>656
www

>>654
えと '\n' = 10
のように改行を文字コードで表すなら10ですよね。呼んでは読んでです。
ファイルから文字コードで言う23を読み取るとそれをEOFに置き換えるぽいんですよね。
で、バイナリ用にファイルを開くときちんとデケターヽ(´ー`)ノです
>>650 Unicodeですか…

いろいろ調べてみます!ありがとうございました。
>>655
べつに二次方程式で
ポインタを使う必然性はない。

ポインタのない、、、たとえばCOBOLでも二次方程式の解法は示せる。

Cではポインタは「あって当然」「使えて当たり前」のものなので
例題の作者も無意識に使ってるだけだろう。
二次方程式を解くのにポインタなんか使うか?
解が二つあったり、なかったりするからポインタ引数で返すとか?
ていうか、そのよくあるというプログラムをさらせ
662655:03/12/05 19:36
すみません。今、手元にないのでさらせません。

そうですか、使う必然性はないのですか。本の中でポインタの項にあった
ものですから、そうしなければならないのかなぁ、と思っただけです。
どうもありがとうございました。
>>661
あぁ、そうか。そういやそうだな。
こんな感じかな。

int quadratic_eq(double a, double b, double c, double* x, double* y) {
 const double d = b * b - 4 * a * c;
 if(d < 0) {
  return 0;
 } else {
  const double denom = 2 * a;
  *x = - b / denom;
  *y = sqrt(d) / denom;
  return 1;
 }
}
>>662
ポインタ抜きのCなんて投げ技のない柔道みたいなもんだ。

ポインタ抜き(に見える)のCのソースなんて
入門書のポインタの章より前のページでしか
お目にかかれないと思った方がいい。

つーか例を一つしか知らないのに「よくありますよね。」
とか一般化するのはいかがなものか。
>>664
でも一般的なんでそ?w
666デフォルトの名無しさん:03/12/06 00:01
>>664
たとえがいまいち
柔道だと、最初から投げられて受身の練習するわけで

息継ぎしない水泳みたいなもんだ
でどう?
紐の無いバンジー
靴なしで砂利道を歩くって感じじゃね?
無理すれば歩けるけど効率悪い
669デフォルトの名無しさん:03/12/06 00:13
スレッド数が合っていないので同期を取ります。
670デフォルトの名無しさん:03/12/06 00:19
ポインタなし:3りんしゃ
乗りやすいけど遅すぎ(´・ω・`)

ポインタあり:普通のチャリンコ
練習いるけど速い(・∀・)
671デフォルトの名無しさん:03/12/06 00:20
俺様の三輪車はモーターつきだから速い
三輪バイク〜
673デフォルトの名無しさん:03/12/06 00:32
ポインタだから速いというのは迷信
ポインタなかったらC言語成り立たんよ
675デフォルトの名無しさん:03/12/06 00:35
>>673
速いとか遅いとかってのは効率の問題だろ。
プログラムで言えば分かりやすいけどめんどくさい、もしくは実装不可能なのか
分かりづらいけど分かったら簡単で効率いいってことで。
今更三輪車乗ったらオレらが遅いと思い、さらに乗りづらいと思うはずだ。
>>673>>670の自転車は速いに突っ込んでるの?

あくまでたとえの話だからポインタが速いとは一言も言って無いように見えるけど
>>674
正解。
ポインタなけりゃ、配列定義しても渡せないし
mallocも無理。文字列もなくなるわけだ。
効率悪いとかいうレベルじゃないんだけどな。
678デフォルトの名無しさん:03/12/06 00:38
>>673
プ
>>677
加えて関数も起動できんな
起動じゃねー呼び出しだー
681デフォルトの名無しさん:03/12/06 00:40
結局Cは今や低水準言語だよな。
プログラミング言語は確実にメモリへの直接アクセスを許可しない方向に進んでる。
この辺の話は何年も前から問題にされてきてそうなったんだろうけど、
>>680
ナウなヤングは起動と言うな
>>665
そう、たしかに一般的だ。

プログラマーに目が二つあるのと同じくらい一般的だ。
function call -> function boot
>>681
Cに対して誤解があるようだ。
まず、「今や」ではない。
元々アセンブラに移植性を持たせたものが出発点なので当然。
決して高級言語ではなっかのだ。
だから、Cに対してはその点を誰も問題にしていない。
他の言語を作るときには問題にするかもしれないがな。
686デフォルトの名無しさん:03/12/06 00:48
質問です。以前ほかのスレで質問したのですが、答が得られませんでした。
下にあるソースをgccでコンパイルする際、
gcc -Wall test.c とすると以下の警告が14行目に対して出ます。

警告: 互換性のないポインタ型からの引数 1 個の `func1' を渡しますです
1.これはどうしてですか?
2.14行目に出て15行目に出ないのはなぜですか?
3.どうしたら警告をなくせますか?

OSはredhat8.0でgccのバージョンは3.2です。
面倒な質問ですがぜひ教えてください。お願いします。

---以下ソース---
1: #include <stdio.h>
2:
3: void func1(const int a[4][4]){
4: 処理
5: }
6:
7: void func2(const int b[4]){
8: 処理
9: }
10:
11: int main(){
12: int a[4][4]={{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},};
13: int b[4]={1,2,3,4};
14: func1(a);
15: func2(b);
16: return 0;
17: }
687デフォルトの名無しさん:03/12/06 00:51
>>686
constを取れ
>>686
constが原因。確かそうだったと思う。はずしてみ。
689デフォルトの名無しさん:03/12/06 00:53
「int **」と「int [4][4]」じゃ、そりゃ互換性ない罠
691デフォルトの名無しさん:03/12/06 00:54
int []*
>>689
意味不明。何言ってるんだ?

問題は、constがどこにかかっているか、だ。
int *[4]だろ・・・
694691:03/12/06 00:59
鬱死・・・言い残す事はなっすぃん。
ばいばいみんな・・・。
695デフォルトの名無しさん:03/12/06 01:00
>>686
過去ログに二次元配列の渡し方について書いてあったと思うから過去ログ読んだ方がいいよ。
>>694
ガンガレ
697デフォルトの名無しさん:03/12/06 01:02
>>695
それはきっと分かっているんだろ。
関数内で配列の要素へ書き込みできなくする方法を知りたいんだと思う。
698697:03/12/06 01:04
それは・・・>>686でいいのか。
VC++6.0では警告レベルを最高にしてもでないなぁ。
700686:03/12/06 01:12
ありがとうございます。
こんなにすぐ返事がもらえるとは・・・

>>687,688,695,696
すいません。質問が不十分でした。697さんのおっしゃるとおり、
「関数内で配列の要素へ書き込めなくする方法」が知りたいです。
行列の演算などを行おうと思っているのですが、ここでつまづきました。

>>689-693
すいません。ちょっと高度すぎて自分には理解できません。ただ、おそらく
692さんの言うとおりconstのかかる範囲の問題だと思います。
それを調べる方法と解決法までは思いつきませんでした。
>>699
6.0はC++に非ず・・・は言いすぎだが、問題ありすぎ。
もちろん6.0を使用すること事態は問題じゃないが、こういう話のとき
「6.0では・・・」といっても「6.0じゃあね・・・」と返すしかない。
最低でも7.0、出来れば7.1(.NET2003)を使用しないと、この手の話に加わるのは無理。
>>701
Cだし・・・
>>700
constはお守りのようなもので、書き込めなくする方法ではない。
正しく言うなら、関数内で書き込めないようにconstを使うのではない。
関数を呼び出す側に、安全を宣言するために使うのだ。
無理せず、const外すだけにしておけ。それで何の問題もない。
704686:03/12/06 01:22
ちなみに拡張子をcppにしてgcc -Wall test.cppするとエラーは何も
出ませんでした。
これはcとc++の仕様の違いかもしれないですが・・・
(当方c++未経験)
void func1(int const a[4][4]){
処理
}
>>705
それじゃ同じ。
int (*const a)[4]を期待しているのかも知れないけど、それはaに代入できなくなるだけ。
707686:03/12/06 01:41
ありがとうございます。

>>703
研究で A×B=C のような行列の演算をよく用いるのですが、もうすでに
何度か間違えてAやBに値を代入しました。
コンパイルの時点で間違いを減らせるようにしたいのです。

>>705,706
コンパイルが通りませんでした・・・。エラーは686のものと同じでした。
↑エラーと警告は意味が違うので混同しないように。
709686:03/12/06 02:54
>>708
失礼しました。警告です。
func1( (const int (*)[4])a );
>>686
>何度か間違えてAやBに値を代入しました。

プログラムはコード通りにしか動かない。
つまり、4x4の行列計算すら記述出来ないのが問題であって
値を書き込む恐れとかのレベルじゃないかと?
712デフォルトの名無しさん:03/12/06 03:21
おしえてください。おながいします

演習
年齢氏名を要素とする構造体を利用し各自のデータを保存する
@main関数外で、年齢(文字列:age)と氏名(文字列:name)を
要素として持つ構造体Gakuを宣言します。
A次に、main関数内で、自分の年齢と氏名を初期値として持つ
構造体Gaku型変数mygakuを定義します。
B最後に年齢と氏名を表示します。

#include <stdio.h>
struct Gaku { int age; char name[80]; };
int main(void) { struct Gaku mygaku = {3, "hoge"};
printf("%d, %s", mygaku.age, mygaku.name); return 0; }
714686:03/12/06 03:32
>>710
だめでした。関数の定義の部分に構文解析エラーが出ます。

>>711
はい。その通り。だからと言って止めるわけには行かないのですよ。


他の演算子の優先順位みたいに、constにも優先順位ってないんでしょうか?
intよりも上だとか。
void func1(const int *a[4]){
処理
}

func1( (const int **)a );
716712:03/12/06 03:40
713先生。どうもありがとうございましたぁ
>>686
constあろうが、なかろうが問題は其処じゃないって言われてるのに気が付かない?

次の質問は、constのデータに書き込もうとしてエラーが出ます。
行列の計算を教えてクレクレってなるのか?

計算が普通に出来てれば、constなんてあろうがなかろうが関係無い。
718686:03/12/06 04:49

>>715
ありがとうございます。
コンパイルは通りました。ただその関数内で配列にアクセスする際に
エラーが出ます。

たぶんint a[m][n]が渡されたとき、nの部分が分からないためどこに
アクセスしていいかわからないため起きる問題だと思います。

試しにいろいろなアドレスを表示してみました。
(&(a[0][0])) => 1
(&(a[0][1])) => 5
(&(a[0][2])) => 9
(&(a[1][0])) => 2
(&(a[2][0])) => 3
だいぶ変な出力が得られました。

通常a[m][n]と定義されたものにa[i][j]とアクセスする場合
(a + n*j + i)のアドレスにアクセスするはずです(間違ってるかも)。
しかし今回は(n*i + j)にアクセスしようとしているようです。

これはこれで興味深いのですが、とりあえずこれではだめそうです。
#include <stdio.h>
typedef const int const4array[4];
void disp(const4array *const array)
{
  int i, j;
  for (i = 0; i < 4; i++) {
    for(j = 0; j < 4; j++)
      printf("%d ", array[i][j]);
    printf("\n");
  }
}
int main(void)
{
  int array[4][4];
  int i, j;
  for (i = 0; i < 4; i++)
    for (j = 0; j < 4; j++)
      array[i][j] = i * 4 + j;
  disp((const4array *const)array);
  return 0;
}
718で686が全く解って無いレベルだって証明された。
>>718
ポインタと配列を混同しないように。

int *a[N] の場合、
a[i][j] = (a[i])[j] = (*(a + i))[j] = *((*(a + i)) + j)

int a[M][N]の場合、
a[i][j] = *(a + N * i + j)
722715:03/12/06 05:35
うぁぁ、すまん、俺が悪かった。

ところで、>710は14行目の関数呼び出し部分への
キャストなんだが、だめだった?
723686:03/12/06 05:36
>>719
コンパイル通りました!代入しようとするとエラーもきちんと出ます!
これなら始めに少し手を加えるだけなので、理想的です。ありがとうございます。
それにしてもこんなやり方があるとは・・・。

>>720
どこが分かっていないのかも分からないレベルです。今後のためにも
どの辺がおかしかったか教えてもらえますか?
724686:03/12/06 05:55
>>721
なるほど。勘違いしていました。これで、iとjが逆になっている理由が
分かりました。
ただ、あと1つ疑問があります。なぜこんな小さな値しか出てこないのでしょう?
アドレスを表示するのなら、aのアドレスを足したもっと大きな値が
表示されると思うのですが・・・。

>>722
ごめんなさい!
710は関数定義の方を変えるのだと勘違いしました。
できました!これを求めていました!ありがとうございます!
こんな書き方があるなんて全く思いつきませんでした。


みなさん親切に答えて頂きありがとうございました。
725686:03/12/06 06:01
>>721
すいません。724の疑問は無視してください。
ちゃんと考えていませんでした。
726デフォルトの名無しさん:03/12/06 11:44
メモリーの解放ってどうしますか?以下を含む関数をループで回すと
メモリーサイズがどんどん増加していってるのですがどうして?

const char* str = "ABC";
char *buf1;
char *p;

buf1 = malloc(strlen(str)*sizeof(char*));
p = buf1; *p = 0;

free(buf1);
buf1=0;

きのせいです
ライブラリのmalloc/freeがバグってるから
で、なんでsizeof(char*)で、個数はヌル文字の分抜き?
729726:03/12/06 12:09
>>728
バグなんですか???

>で、なんでsizeof(char*)で、個数はヌル文字の分抜き?
すみません、質問の意味が分かりません。
(strlen(str) + 1) * sizeof(char) とか言いたいんじゃない?
while(1) {
const char* str = "ABC";
char *buf1;
char *p;

buf1 = malloc(strlen(str)*sizeof(char*));
p = buf1; *p = 0;

free(buf1);
buf1=0;
}

だとしたら珍妙だよなぁ・・・何してるかわからない
ただのテストじゃないの?
733726:03/12/06 12:38
delete []

ならうまく開放できてるんだけどなぁ。
バグなのか・・な?

>delete []
なにこれ?
そのコンパイラおかしいんじゃない?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
const char* str = "ABC";
char *buf1;
char *p;
while(1) {

buf1 = (char*) malloc(strlen(str)*sizeof(char*));
p = buf1; *p = 0;

free(buf1);
buf1=0;
}
}
で俺創ったらメモリ使用量は792KBでずっと一定だった
736726:03/12/06 12:56
>>735
わざわざありがとう。
一から見直してみます。
取り合えず環境書けボケ。
>>737
うるせーよ
書く必要ねーな
(・∀・)カエレ!!




_| ̄|○
enum foo {hoge,fuga,fuge,hare};
enum foo bar;
で、getoptの、optargを代入するにはどうすればいいですか?
sprintf ("bar,optarg);
bar=*optarg;
bar=optarg;
strcpy(bar,optarg);
どれも駄目でした。
何をしたいのか理解できる人は手を上げてください。
enum foo bar

foo barではない?
char *optargが、例えばfugaだったとします。
そのとき、barに2を入れたいのです。
ヒソ(´Д)ヒソ(´Д`)ヒソ(Д`)ヒソ
optargがfugaってなにさ。
もしかして、コマンドラインからfugaって文字列を渡したいとでもいうのかな?
>>741 は C++ 使い
はい。-t fuga
とすれば、
switch(bar){
...
case 2: do_something();break;
................
としたいのです。

if(strcmp(optarg, "fuga") == 0) {
 bar = fuga;
} else if( ...
>>747
ありがとうございます。しかし、これをcaseなどで置き換えられませんか?
>>748
テメェでやれよ、ボケ。
文字列っていうのは配列なんだ。
文字列変数と文字列定数の比較は配列同士の比較であって、
Cには配列の比較を一気にやる手段は用意されていない。
したがって、switch/caseでは文字列による分岐はできない。
追記
 Dではできる
>>751
そんなことでDマンセーとでも言うと思ったか
このウスノロがっ!
>>750
あらかじめ文字列に対応した整数のテーブルを作れば出来無い事は無い。
>>753
8bit チェックサムでも 256 通りの case 分岐
>>754
は?何でcase分岐する必要があんの?
あるバイト数のデータを加算して
sum &= 0xff した物とおしりのデータと
比較するだけだろ。

その比較に対しては真か偽しか意味がないはずだが。
>>755
case 分岐の話だろ?
757デフォルトの名無しさん:03/12/06 16:20
if-elseの羅列も、caseの羅列も書く労力はさほど変わらないと思うんだけど。
決まったところはコピペできるし。
C言語って何で C99 になっても namespace 使えないんだ。
enum とかもうだめぽ。
Dマンセー!
うるせー馬鹿
PHPでもできるわアホ
マルチバイト識別子なんていらねー。
typedef long long int うんこちんこまんこ;
>>750
switch 〜 caseによる分岐
保守性を考えればこの処理の方が望ましいな。
ただ、文字列が多くなるにつれて遅くなるけどな。


#define STR_HOGE 0
#define STR_HAGE 1
#define STR_MAGE 2
char *str[3]={"hoge","hage","mage"};


int key;
char *instr;



for(i = 0; i < 3; i++){
 if(strcmp(instr, str[i]) == 0){
  key = i;
 }
}

switch(key){
 case STR_HOGE:
 case STR_HAGE:
 case STR_MAGE:
}
enumを使ってください。
コロンとdefaultは必須でつ
ハッ!! コロンツイテタ・・・
文字列が多けりゃハッシュ使うだろふつう
>>766
何回も検索するのならばね。
for(i = 0; i < 3; i++){
 if(strcmp(instr, str[i]) == 0){
  key = i;
 }
}
key = i;

switch(key){
 case STR_HOGE:
 case STR_HAGE:
 case STR_MAGE:
 default:
}

だな。breakが無いとか言うなよ。
breakが無い
↑サイヤ人
↑ナメック星人
ナメック星人てナメクジからきてるの?
いいえ、枝豆から出来ています
なめこ
セミコロンは必須です。
777デフォルトの名無しさん:03/12/06 17:07
get(777);
>>777
error LNK2001: 外部シンボル "_get" は未解決です
fatal error LNK1120: 外部参照 1 が未解決です。
#include <2ch.h>
#include <2c.h>
>>778
gccなら-l2chをつけろ。
782デフォルトの名無しさん:03/12/06 18:26
無限ループ、永久ループ、永遠ループ
さああなたならどれ。
783782:03/12/06 18:27
誤爆ったスマソ
ありきたりだが、デッドループ
785781:03/12/06 18:33
ど〜みても〜VC++だし〜♪(泣)
ループで名高い清水トンネル
C言語コンパイルするとexeとかできるけど
そのexeは実行ファイルとして使えるの?
何いってんのこのデムパはとか思う人
がいるかもしれないけど、つまり言いたいのは
簡単なじゃんけんプログラムとかつくったとして
コンパイルしてできたexeで、どっか他の
パソコンとかで普通にじゃんけんできるのか
ということです。
>>782
デッドロック
>>787
OS と CPU が同じなら
>>787
OSが同じならば・・・
>>787
OSが同じならば・・・
>>787
OS と CPU が同じなら
793787:03/12/06 19:23
どっちなんでつか〜
>>782
デッドロック
>>787
開発系のソフトじゃなきゃ無理なんじゃないの。
>>787
デッドロック
OS が同じならいいのでは?
各 CPU アーキテクチャ向けの OS を別物と考えるなら
>>796
きもっ
800デフォルトの名無しさん:03/12/06 22:16
(*^o^*)
'`,、('∀`) '`,、
>>799
きもー
803787:03/12/06 23:33
つまり、98でコンパイルしてつくったexeを
xpの人に送ってテストプレイしてもらうということは
普通にはできないってことでつね。
>>803
普通にできます。
805787:03/12/06 23:45
一体どっちなんだ・・・・・
_| ̄|◎
C言語のポインタに関して、アセンブラをやっとくと解かり易いって聞いたんですが、
もしかしてアセンブラ命令の
LAD GR1,A
とかそんな感じの事でしょうか?
確かにポインタと酷似してるんですが・・・
807806:03/12/06 23:48
ごめんなさい
スレ間違えました・・・・
>>805
やれば分かる。
>>787
OSとCPUに互換性があれば
>>806
スレ違いというわけじゃないと思うけど、
アセンブラのスレはとりあえず↓だ。

アセンブラ… (゚д゚)ウマー
http://pc2.2ch.net/test/read.cgi/tech/1060928704/

アセンブラやらんでもポインタ分かると思うけど、
アセンブラをやって損は無いと思うかな。
WindowsのCって型が異常に多いですよね。
charみたいなネイティブな型じゃなくって、LPSTRとかDWORD使ったり、
特にLPSTRとかwchar_tを使う切り分けってどうしてます?
charでも十分日本語処理もできますしね。
VC系って型がありすぎて判断に迷うんですよ。
今は特にMFCで開発してるんですけど、人によってchar使ったり、LPCSTR使ったり、CString使ったりと
バラバラなんで。
#include <tchar.h>
813デフォルトの名無しさん:03/12/07 00:44
int (*func)();
これは「関数」を宣言しているのではなく、(関数への)「ポインタ」を定義しているんですよね?
int (*hoge)[3];
これは「intへのポインタの配列」ではなく、「intの配列へのポインタ」ですよね?
はい?
>>813
そうだよ。
こりゃ何しとるのかね?
f = (*(int (*)(int))f)(f);
>>816
全然わからん
>>816
int f を int(*)(int) にキャストして、
f を引数として呼んで、
その戻り値を f に代入している。
>>816
だれかを混乱させようとしている。
自爆かも。
>>816
ベースはこれでいいのか?
int f(int *)

>>805
C言語と関係ないことだけど
98とXPは理屈の上では同じWindowsのバージョン違いってことで
一応上位互換があることになってるから
98で動くように作ればXPでも動くはず

細かいこと言うといろいろ問題有るけど
Cの入門書程度の簡単なプログラムならまず問題無いよ。
WindowsならIntelとその互換CPUしか今は考えなくていいし。

同じOSに対する違うOSってのは
MacとLinuxとWindowsみたいな場合を想定しているのだわさ。

LinuxとかUNIX系OSは実際同じOSでもIntel以外にも色んなCPUのバージョンがあって
実行ファイルもそれぞれCPU用に再コンパイルしないと互換性がないんだわさ。
822 ◆ENiyTz8WZ6 :03/12/07 03:58
プログラム開始後に、配列の要素の数を任意に決めることってできる?
例えば
scanf("%d",&num);
for(i=0;i<=num;i++)
{
  box[i]=i+1;
}
みたいな感じ。
この"num"をユーザーの入力で任意に決められないかなと、、、
823 ◆ENiyTz8WZ6 :03/12/07 04:00
配列を定義するときって、要素の数を入れないとコンパイルできないっしょ?
何かいい方法はないかね?
・・・・・・・・・・・・・
それじゃできないけど、入門書を最後まで読めば
やり方が載ってるよ、きっと。
もし、載ってなかったら、3冊買って全部読めばきっと載ってるはずだから。
826デフォルトの名無しさん:03/12/07 04:48
alloc()
new
っくらい教えてやれよ。。。
>>826
1行目、それはなんだ?
2行目、スレタイを穴が開くほど読んでこい。
>>826
alloc はスタックの問題があるからお勧めしない
>>828
ネタニマジレスカコワ ・・・ちょっと待て、おまいのはネタちゃうやろw
alloca()と勘違いしている?
malloc
wとかワラとか恥ずかしいぞ
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
ワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラ

期待に答えてみました。
int main() {
 for(; ;) { printf("w ワラ "); }
 return 0;
}
835デフォルトの名無しさん:03/12/07 11:01
*a, a[]がどうなのかとか、議論するのもいいけど、
オブジェクトファイルを勉強すれば、一発で内部構造がわかるわけだが。

「linker & loader」という本をお勧めする.
複数形だそうですよ
>>835
最適化されてて結局よくわからない罠。
メモリ上に一体どんなデータが置いてあるのかを
紙に書いてみると良く分かる。
最適化しないと、機械的におきかえた無駄分岐だらけのコードで、
結局よくわからないしな
>>838
あれれ?メンバとメンバの間に変な隙間が空いてるよ。お姉さん。
このスレPart68ってそんなに歴史あるんか・・・
駄レスでメモリ大量消費
>>842
うるさいバカ!!
844デフォルトの名無しさん:03/12/07 14:03
v(^o^i)d
845デフォルトの名無しさん:03/12/07 14:03
v(^・^)v
g(^o^t)o
何か中指おっ立ててるみたいに見えるな...。 >goto
co(^nti^n)ue;
駄レスでメモリリーク発生
>>847
ほんとだw
851デフォルトの名無しさん:03/12/07 15:27
free((void *)849);
852デフォルトの名無しさん:03/12/07 15:36
とある空間内に点を100個発生させたいのですが、条件がありまして、
その空間がいくつかの四角形に分割されており
四角形ごとに何かしらの値が決められており、
その値が大きい四角形ほど点が多く発生するプログラムを
作りたいのですが、どうすればいいでせう?
>>852
矩形群の面積の比=点の数の比
*(char*)rand() = 0;
Linuxのkterm上のカーソルをC言語で制御するような関数はありませんか。
コンパイラが言うことを聞いてくれない。もうだめぽ。
>>855
とりあえず curses とかはどうでしょう?
man curses
858852:03/12/07 16:12
>>853
サンクス
>>856
基本的にコンパイラはいうことを聞いてくれる。
ダメなのは基本的に喪前のソースだ。
てへ♪
861新人:03/12/07 16:39
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


void main()
{
char str[20];
int i,a;

srand((unsigned)time(NULL)); //ランダム
a=rand()%100+1;
printf("よそうゲーム\n\n");
printf("\n1〜100の数字よそうして入れてください");

while(1){
gets(str);
i=atoi(str);
if(i==a)
{
printf("\n正解\n");
return;
}
else if(i<a)
printf("\n低いですもっと高い数字を入力してください");
else if(i>a)
printf("\n高いですもっと低い数字を入力してください");
}
}
これでいいんですか?
だめです
>>857
出来ました。有難うございます。
gets はバッファサイズの指定がなく危険なので、
gets を使おうとするだけで警告を出すコンパイラもある。
fgets を使いたまへ。

あと、void main じゃなくて int main で
return; は return 0; にすべし。

あとは、printf を2つ書いてる理由が分からん。
printf("よそうゲーム\n\n\n"
    "1〜100の数字よそうして入れてください");
fflush(stdout); /* これやらないと出力されないこともある */
で良い。
>>864
コンパイラが警告を出すんだ。
>>864
getsの問題を喚起するのは結構なことだが
ただfgetsを使えばいいってものじゃない
余ったデータを次の処理まで保持するなら
fgetcとungetcもしくはfscanfの方がきれいに書ける

mainの戻りなんてくだらねえことだ
必要としないアプリにまで難癖付けるのは厨

>printf("よそうゲーム\n\n\n"
>    "1〜100の数字よそうして入れてください");
>fflush(stdout); /* これやらないと出力されないこともある */
どこの処理系でだ?
JIS X3010 7.9.6.1と7.9.6.3にはffulshが必要とは書いていない
7.9.2 には\nでコミットと書いてある
\nがなくてもコミットか否かを処理系定義としている

以上3点に共通すること:
教える立場で発言するときに受け売りはやめれ
864ではないが…
>>866
>fgets
同意。
>mainの戻りなんてくだらねえことだ
>必要としないアプリにまで難癖付けるのは厨
void mainは規格違反。必要・不要の問題じゃない。
不要ならint mainと宣言して不定値を返せば(returnを省略する)いいだけだ。
>教える立場で発言するときに受け売りはやめれ
何か問題があるのか?
868867:03/12/07 19:43
自己レス。
>不要ならint mainと宣言して不定値を返せば(returnを省略する)いいだけだ。
新しい規格だとreturnを省略した時0を返すんだったスマソ。
>>867
>不要ならint mainと宣言して不定値を返せば(returnを省略する)いいだけだ。

別にランタイム上で動いている環境でもないし、
自分でmainの呼び出しまでも記述している場合、
そんなものは全く持って無意味。
そりゃランタイムがmainの戻り値を処理している場合は
一応返すけどね。
つーか「くだらねえこと」とかいう理由で規格を無視してるのに
その後で規格をもちだすのはどーゆーことよ。
だからランタイムがそういうプロトタイプで
mainを呼んでいるからだろ。
俺が言っているのはmainの呼び出しも自分で記述する場合。
文章読解力を疑われるぞ。
867はCRTの存在を知らないに100カノッサ。
>>871
ホスト環境において処理系はmainの関数原形を与えない
>>870
だから受け売りはやめれっつーの
ちゃんとてめえで考えろ
規格との付き合い方まで含めてな
久しぶりにC言語スレ覗いたらmainのプロトタイプ論争か。
プロセス終了前にfreeするべき/しないでよい論争もついでにやっとくか?
4〜5月くらいに出てくるなら仕方が無いかと思うが・・・
なんで今の時期だろう
GCC だと警告出すから鬱陶しいんだよ! > void main
>>866
昔 Turbo C++ 1.0 ではまったことがあった気が...。 >どこの処理系でだ?
void main() と書くような奴は exit() に引数なんて指定しません。
exitって引数いれなくちゃいけないんじゃないの?
そもそも exit なんか殆ど使わん。
ああ、いつも abort() するもんな。
883デフォルトの名無しさん:03/12/07 20:53
tmp = realloc (ptr, 100);
if (!tmp)
error;
ptr = tmp;

ここでtmpがNULLでなかった場合ptrはtmpを代入する前にfreeしなくていいんでしたっけ?
freeをすると逆に使えなくなります

tmp => [][][][][][](メモリ確保したといいたい

free => ( tmp => [][][][][][] )

tmp => ??????

です
>>884
free (tmp);ではなくて
free (ptr);もいけないんですか?
reallocが成功してptrが指していたアドレスとは違うアドレスが返ってきたとき
ptrが指していた元のアドレスの方は既に解放されているということですか?
>>885
そうです
>>886
どうもです。
ちょっとお茶飲んでくるねw
つ担~
おちゃどぞー
ほのぼの感を出そうたってそうはいかないぞ。
どうせこのスレももう少しだ。きにしなさんな
892デフォルトの名無しさん:03/12/07 21:54
( `_ゝ´)
freeしたら必ずmallocすること。
変数使ったら必ず宣言すること。
定義と宣言の区別をすること。
うんこしたら必ずしょんべんもすること。
>>896はうんこ先行型人間
しょんべんしたら必ずうんこもすること。
しゃせえしたら必ずゴムをつけること。
なぜかわかんないけど「う○こ」を打つとロックされるんだけど
しょうがないから「うんち」って言います
うんちの方が環境に良い。
うんことうんちの違いを4文字熟語で表せ。
はくちょう座はデブネ
ベンベンベガベガこと座が鳴るよ
さそり座はアンタデス
こんな覚え方してた。
相思相愛
子供の頃の話だが、うんこしたら卵焼きが二つ出てきたことある。
906 ◆5mZOPhPlP6 :03/12/08 04:38
文字入力に関して質問なんですが、C言語って scanf で
文字列入力した場合は標準入力から来る終端って、
null  ではなくて
null + キャリッジリターン(0xA0)  ですよね?
うんこうんこうるせーぞうんこども
908デフォルトの名無しさん:03/12/08 07:40
その前にscanfは使わないことだ
>>908
んまぁ、そうだろうけどよ
質問ぐらい答えないのかよ

だったらこんなうんちについて語ってるクソスレには誰もこねーぞ
>>908
( ゚Д゚)ハァ?
素人は scanf を使うな,だろ?
>>910
いや、素人は使っていい別に
ただ上達してからscanfを使うとレベルが低く見られる恐れがあるわけだ
>>906
nullじゃないの
int i=0;
char buf[20];
scanf("%s",buf);
while(i<20) printf("%02x ",buf[i++]&0xff);
>>911
ばか?
もまえのレベルが低いだけだ。scanfを使っただけでレベル低いと思ってんの?
gets() の様にオーバーランするとか思ってたりして。
>>913
俺は使うなとは言ってないんだがなぁ
使うべきところは使うし、無理して使うべきところでなければ使わない

scanfを使うとレベルが低く”見られる恐れがある”とはそういう意味だ
上手に使えばうまく見えるし、無駄に使えば下手に見えると言う事

お前がわからないって言うなら俺はお前の中でバカのまんまでいいから無理に理解しなくていいぞ
>>915
じゃあ上達すると scanf の代わりに何を使うの?
>>915==911

>>913は「使うなと言っている」とは言ってない
>>910は「素人は使うな」とは言っているが

>>915で突然「使うべきところは使うし...」と言っている

やっぱりもまえのレベルが低い
>>915
馬鹿が他人に教えようとするなよ
関係ないけど、レベル = ドラクエだな、FFじゃなくて。
レベルアップの効果音とか好き。
LV = Wizardry
↑ハッカー
↑ファッカー
923ヽ(´ー`)ノ:03/12/08 11:46
>>916
fgets + sscanf。

使っていいかどうかは素人とか玄人とかは関係なくて、
要は入力が信用できるものかどうか、じゃないの?
924910:03/12/08 11:52
>>923
> fgets + sscanf。
それなら同意

素人にお勧めできないのは
素人は戻り値チェックや最大フィールド幅指定などの最低限をやらないから
>>923
その fgets が単なる EOF 判定のためだけだったら同意しかねるがな
このスレpart68にもなっているのに
scanfの問題で盛り上がるのは恒例行事なのか
なぜならば、それがお約束であるから。










ようするにネタ切れ。
>>924
あぁ sscanf はOKか
てっきり俺は sscanf も使うなといってると勘違いしていた
>>906
>キャリッジリターン(0xA0)
には誰も突っ込まないのか?
>>929
osによって違うからじゃない。たぶん。
正確にはコンパイラーかな
>>930-931
無理するな。知らないことに答えようとするな。
アホかバカかとおまえに小一時間突っ込みたいよ。
大きいの突っ込んで。。もうじゅるじゅる
× A0
○ 0D

0A はラインフィード。
A0 は全然違う。
#include <stdio.h>
main()
{
char str[] = "abc";
printf("%c\n", *(str+1)); /* bと表示 */
printf("%c\n", *(str++)); /*コンパイルエラー、何で? */
}
936930:03/12/08 14:53
許してね&heart;
937930:03/12/08 14:54
>>935
配列だから♥
atanの使い方がいまいち分かりません。
引数がラジアンだとどっかに書いて有りましたが、
本来はtanの値をいれてそのtanのラジアンを計算するものじゃないんですか?
俺がおかしいのかな…?
                         /⌒〜Y⌒"""ヘ   ヘ∨ ∨
                         /⌒/   へ    \|\
            /           /  /   /( ∧  ) ヘ ヘ      
           く           // ( /| | V )ノ( ( (  ヘ\   教  て
    ┘/^|    \         (  | |ヘ| レ  _ ヘ|ヘ ) _ヘ    し  め
    /|   .|              |  )) )/⌒""〜⌒""   iii\    え |
     .|  α  _          ヘ レレ  "⌒""ヘ〜⌒"  ||||>   て  |
          _∠_       イ |  |  /⌒ソi   |/⌒ヘ  <    や  |
     _     (_        ) ヘ  | ‖ () ||  || () ||  _\   ん に
     /               (  ) ヘ |i,ヘゝ=彳  入ゝ=彳,i|\    ね  は
    /ー               ( /  """/   ー""""   >   |
      _)   |          ヘ(||ii    ii|||iiii_/iii)ノヘ|||iiiii<    !!!!! 
          |          ( ヘ|||||iiii∠;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;     フ  
    /////   ヘ_/       ) ヘ|||""ヘ===二二二===7フ / ム/∧ ∧ ∧
    /////              (  | ii  | |LL|_|_LLL// |    )( ∨| ∨)
   ・・・・・                ) )| || | |||||||||||||||||||||||| | |   ( ヘ | ヘ ) (
          ___        | | /| .| |||/⌒/⌒ヘ | | |  iiiiヘ ( | ( | /
            /         / (|.| | |       | | |  iii  ) | ヘ )( )
            (          ( /..|  | |_____/ | |  iii  ( )( // /
            \         ) )..|  |ヘL|_|_L/ / /  ,,,,--(/Vヘ)(/
>>938
貴方はあっています。
atan(tan(x)) は(数値誤差を無視すれば)
x + nπ([-π/2,π/2] の範囲内にずらされる)になります。

atan2 というのもあって、
atan2(y, x) は atan(y/x) とほぼ同じですが、
x と y の符号によって結果が変わり、
結果は [-π,π] の範囲内におさまります。
分かりやすく言えば、atan2(y, x) は
直交座標 (x, y) を極座標で表した時の角度を返します。
>>939
だれ?
942938:03/12/08 16:39
>>940
ありがとうございます!やっぱりそうですよね。
>>940
atan()がうかつなパラメータだと0割りであぼーんするからatan2()なんだろ?
0割なら可能性が全くないと言うことじゃん。なら大丈夫じゃん。
・・・・とぼけてみる(^-^)/
(´・д・`)バーカ
(´・д・`)アーホ
'`,、('∀`) '`,、
948デフォルトの名無しさん:03/12/08 20:25
先輩から貰ったプログラムに

void 関数名(int *func1,int func2)
{
 int i;
 for(i = 0; i < 5; i++)
test[i] = func0(&(func1->func2[i * 10]), 10);
}

という部分があったのですが,{}はなくてもいいのか教えて下さい.
激しく気になります.
949デフォルトの名無しさん:03/12/08 20:28
どこの{}だ?
>>943
でも、atan2(-y, x) != atan2(y, -x) で、
atan(-y/x) == atan(y/(-x)) なんですよね。
確かに分母が 0 になる可能性がある場合は atan2 を使いますが、
それだけで区別するものでもないような気がします。
たとえ絶対に分母が 0 にならないと仮定できるときでも、
極座標にしたときの角度を求めたいような場合には atan2 しか使えないわけですし。
951デフォルトの名無しさん:03/12/08 20:45
>>949

for(){}

てなるはずの括弧です
よろしくお願いします
>>951
 for(i = 0; i < 5; i++) {
  test[i] = func0(&(func1->func2[i * 10]), 10);
 }
ということか?
1文なら { } で囲まなくても大丈夫だけど、

まぁ、一応 { } で囲む癖をつけておいた方がいいという人もいるけどね。
文を追加しやすい & 追加するときに { } を付け忘れる危険性がない 、ってことで。
953デフォルトの名無しさん:03/12/08 20:53
なくていい。
>>951
それより&の次の無駄な括弧が必要ない。
955デフォルトの名無しさん:03/12/08 20:56
>>952さん>>953さん

1文なら大丈夫なんですか・・・微妙になんで大丈夫なのかが気になります,とりあえず後のことも考えて括弧で囲む方向でやってきます.
ありがとうございます.
>>924
>> fgets + sscanf。
>それなら同意

scanf系の最悪な使い方だ
ループの途中に飛び込むgotoに匹敵
ココの住人ってクソばっかだよな
時々いいやついるけどさ、話になんね

相手に同意するときは同意する理由
相手を批判するときは批判する理由ぐらい述べないと永遠に続くからやめれ
958デフォルトの名無しさん:03/12/08 21:26
標準入力から文字列をfgetsで読み込む場合、バッファはどれくらいとっておけばいいのでしょうか?
このプログラムはcatなどのように、途中で切れたらまずい場合を想定しています。

このようなばあい、fgetsを使うべきではないのでしょうか?
お願いします。
#include<unko.h>
#define N 5
unko main(void)
{
unko geri;
int n, m;

while (!geri) {
for (n = 0; n < N; n++) {
printf("ブリッブリ\a\a\n");
for (m = 0; m < N; m++) {
printf("ブリュ\a\n");
}
}
}
return unko;
}

>>957
あわてる乞食はもらいが少ない(ケケケ
>>960
解りました、そういうすごい考えをもってココの人たちは話していたんですね!
はっきり逝って感動しました
初心者だがポインタで頭が混乱してしまった。
>>962
じゃあ次スレを立ててください
char*buf,tmp[256];
int i;
for(;fgets(tmp,sizeof tmp,stdin);){
buf=malloc(i=strlen(tmp)+1);
strcpy(buf,tmp);
while(!strchr(tmp,'\n'))fgets(tmp,sizeof tmp,stdin),buf=realloc(buf,i+=strlen(tmp)),strcat(buf,tmp);
/* 適当な処理 */
free(buf);
}
>>958
好きなサイズにしていいよ。
・読み込んだ後、バッファの最後が改行文字なら1行読み込み成功。
・改行文字でないならそれはファイル終端か行が継続している可能性あり。
いずれにしても、バッファのサイズに関係なく巧く処理すればよい。
#まぁ、勿論バッファが2バイトなんて阿呆なことを言われても困るが。
>>965
なるほど、わかりました。
ありがとうございます。
>>964さんもありがとうございます。
次スレも「あたし」でいいの?
麿
あした
このスレにバカがいるって言うだけで
見たくもないな。まともな人だけ書いて欲しい。
嫌ならまともな掲示板に池
975デフォルトの名無しさん:03/12/09 00:14
んだんだ
976ぼるじょあ ◆yBEncckFOU :03/12/09 00:15
(・3・)エェー
C言語ならぼるじょあに聞け!というタイトルで立ててくるYO!
(・3・)エェー 次スレだYO!
http://pc2.2ch.net/test/read.cgi/tech/1070896646/
>>956
> scanf系の最悪な使い方だ
> ループの途中に飛び込むgotoに匹敵
根拠を示せ
それともおまえの頭がループしてるのか?
>>978
>>956はfgets+sscanfと同程度の頻度で
ループの途中に飛び込むgotoを使うって意味だろ
>>956はループの途中に飛び込むgotoを頻繁に使うアフォってこと?
>>935 ++演算子って難しいね。私もよくわかりません。
main(){
char str[4] = "abc";
char *p;
p = str;
printf("%c,%c\n", *p, *(p+1)); // a,b
printf("%c,%c\n", *p, *p++); // b,a(?)
}
引数の評価順序がコンパイラ依存ということを知ってのネタか?
>>982
それ以前に、>>935の問題点がわからん低脳なんだ。
笑って許してやろうや。
朝からトゲトゲしすぎですよ
では、さわやかに >>981はスルーということで。
ループ途中に飛び込むgotoは、使い方によっては便利かもしれないわね。
>>986
五月蝿い
>>978
fgets+sscanfで取りこぼしこいてるアフォの救済用にfscanfがある
ここまで来るとfは本当はいらんがそれはおいといてやる

fgetsにバッファサイズを渡して安心してるボンクラどもは
そのサイズをどうやって決めたかを小一時間問い詰めてろ自分に
>>988
fscanf なら取りこぼさないのかと小一時間…
>>989
あー、fscanfてめえで書いてみたことねえな( ゚д゚)ペッ
fscanf の戻り値を...
scanf って最大フィールド幅で切りつめられても分からないんだよね
993デフォルトの名無しさん:03/12/09 22:15
記念カキコ v(^-^*)
>>993
ほいアク禁
自分で指定しておいて「分からない」とかほざいているどスカタンにCは向かん
おっと失礼
どスカタン が Cには向かん
(; ・`д・´) !? (`・д´・ (`・д´・ ;)
998
999
           /` ー 、 ___ ,. - ' ヽ
.           / ,. ‐ ' ´    ` ヽ 、 !
          l/   ィ ,、,i ,、 ,、 ,、ヽ,!
         /   iv':::'::::':`':::`:::V レi. ヽ
         /   ,! :::::::::::::::::::::::::ノ( 'ヘ,.i
.         i   .i|. ヽ:::::::::::::::::;:-:⌒  l:|
        l.   l|-ー`=;::::::::シ-─-.、 l::!
        |   l:|    ヽ::/     ヾス
        l   l:|    ,H      l(. l
.         l   l:|   ノ::::ヽ、  __,.イ'ノ゙
         l   l|' ー '´ f ̄!  ̄,/ !
         ヽ;ハ |T'::ー-r'=f─ ;´ , |    ∩
             ヾi i,;;ィ^ヽ/ヽ;:::: ハ/    | |
           ,ィ:!´ l /oヽ !`t、    (|^ ^^)
FUCK YOU
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。