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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

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

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

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

C言語なら俺に聞け! Part 109
http://pc8.2ch.net/test/read.cgi/tech/1119435171/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:2005/07/06(水) 06:09:46
夢の2ゲト!
ムマー。
3デフォルトの名無しさん:2005/07/06(水) 06:42:42
C言語で作成されたクイックソートについて悩んでるのですけど。
クイックソートなのに交換回数がN^2になる並び替えってどんなの
ですかね?
4デフォルトの名無しさん:2005/07/06(水) 06:46:37
javaとc言語併用で勉強するのってどう?ありえないすか?
5デフォルトの名無しさん:2005/07/06(水) 07:15:43
>>3
実装時のピボットの選び方による。
ピボットが常に最小値または常に最大値になる場合にO(N^2)になる。
交換回数をE、要素数をNとすると、
E(N) = cN + E(N - 1), N > 1, E(1) = 0 (cは定数)
=> E(N) = cN(N - 1)/2 + E(1) = O(N^2)

ピボットが常にど真ん中の値になる場合が最良でO(N log N)。
E(N) = cN + 2 E(N / 2), N > 1, E(1) = 0 (cは定数)
=> E(N) = N(c log N + E(1)) = O(N log N)
6デフォルトの名無しさん:2005/07/06(水) 08:52:58
C言語をはじめたばかりであまりわからないのですが、 
ビッ
7デフォルトの名無しさん:2005/07/06(水) 08:58:39
クカメラでC言語は買えますか?
8デフォルトの名無しさん:2005/07/06(水) 09:07:40
かえる
9デフォルトの名無しさん:2005/07/06(水) 09:08:26
なにこのすれ?
誰が立てたの? ただ質問がしたい奴?
10デフォルトの名無しさん:2005/07/06(水) 09:50:53
>>9
2ちゃんねるではpart 30を超えるスレは自動で立つ様になってるんだ。
わかったらさっさとネギを紫のシールで束ねる仕事に戻るんだ
11デフォルトの名無しさん:2005/07/06(水) 11:15:22
質問させてただきます

char *tmp;
tmp = 'aiueo';

これはどうなっているのでしょうか?
char型のポインタをtmpにいれるんですよね?
そして、[aiueo]をそのポインタのさきに入れると考えると
6つのcharのスペースがいるわけですよね?

ですが、char *tmp;では、サイズまでは指定していません
オーバーフローとかではないのですか?
12デフォルトの名無しさん:2005/07/06(水) 11:32:22
>>11
×: tmp = 'aiueo';
○:tmp = "aiueo";
と仮定して答えさせて貰うと
> 6つのcharのスペースがいるわけですよね?
コンパイラが勝手にその領域を確保して、"aiueo"で初期化している。
その確保した「場所」をtmpに代入しているだけなので無問題。
1311:2005/07/06(水) 11:36:16
>>12
ありがとうございます

ですが、その場合は初期化できるとしても
引数によって変わる場合等はコンパイラが初期化できないと思うのですがどうなっているのでしょうか?
14らら:2005/07/06(水) 11:44:04
【お願いします。他の板で友達が同じ質問しているかもしれませんが
一人一人違うプログラムでなければならないので迷惑かけますがお願いいたします。 】
[1] 授業単元:
データ構造をアルゴリズムでC言語のプログラミング
[2] 問題文(含コード&リンク):
配列のデータ構造を実現するプログラムを作成する。
●データの挿入削除表示が可能であること
●配列に代入するデータは整数型とする
●プログラムの仕様(関数への入出力表示方法など)は各自で決めること
[3] 環境
 [3.1] OS:Windows/Linux/等々
Windows
bcpadで授業しています。
 [3.2] コンパイラ(バージョン):
Borland c++ Compiler5.5
 [3.3] 言語:C/C++/どちらでも可 のいずれか
可。
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか
2005.9.4
[5] その他の制限:どこまで習っているか、等々

特に制限ありません。一人一人違うプログラムを作成する必要があるのでできるかぎり多くのパターンのプログラムがほしいです。 お願いいたします。
15らら:2005/07/06(水) 11:46:03
板間違いました^^;すいません。
16デフォルトの名無しさん:2005/07/06(水) 11:51:24
>>13
コンパイラが出来ませんって言ってくる
1711:2005/07/06(水) 11:53:10
gcc 3.3.3
なんですけど、 -Wall にしてもワーニングもだしません
今まで数年間実行してきたコードなんですがセグフォもおこしたこともありません
18デフォルトの名無しさん:2005/07/06(水) 11:56:29
warning: suggest parentheses around assignment used as truth value
って、どういう意味ですか?
自分解釈だと、括弧がおかしいみたいにかんじるのですが
括弧はおかしくないと思います
ですので、私の解釈が間違っていると思うのですがどうなのでしょうか?
19デフォルトの名無しさん:2005/07/06(水) 11:59:52
>>17
問題にしたいコードを貼ってくれ。
>11(>12)じゃ、何の問題もあるわけがない。

>>18
自分解釈しないで、ちゃんと英語を理解しろ。ダメなら翻訳サイトへ。
2018:2005/07/06(水) 12:28:50
infoseekの翻訳をしたら
>真実価値として使用される割り当てのまわりの括弧を示唆します。
となりました、
やはり、括弧だとおもうのですが・・・
21デフォルトの名無しさん:2005/07/06(水) 12:49:14
>>18
warning:警告
22デフォルトの名無しさん:2005/07/06(水) 12:51:45
>>18
> 自分解釈だと、括弧がおかしいみたいにかんじるのですが

ごめん。笑わせてもらた。
たぶん == って書くべきであることが多いところ(ifのカッコなど)で = による代入をしちゃってるけど、
「本当にいいの?カッコでもつけたらどう?」
と提案してくれている。

suggest 提案する
parentheses カッコ(←これだけわかってたみたいねw)
around 〜のまわりに
assignment 代入
used 使われてる
as 〜として
truth value 真や偽の値(trueかfalse)
23ぼるじょあ ◆yBEncckFOU :2005/07/06(水) 12:52:52
>>18
gccか?
確かif(a=kansu(b))とかやると出たような。
無視していいよ。
2418:2005/07/06(水) 12:56:45
ごめんなさい、ありがとう
出かける前に解決できて本当によかった、、

while( tmp_1 = *tmp++){
ってやってたのが原因でした
エラーはワーニングも全て埋めたんですけど
これだけどうしても、うまらなかった
でもまあこれは、意図してこうしてる(他にいい方法が思い浮かばない・・・)ので
このワーニングは放っておくとするか・・・
25デフォルトの名無しさん:2005/07/06(水) 13:01:03
while((tmp_1 = *tmp++)) != 0) {
って書けば warninng は消えるんでない?
26ぼるじょあ ◆yBEncckFOU :2005/07/06(水) 13:01:51
>>25
閉じ括弧が一つ余計
27デフォルトの名無しさん:2005/07/06(水) 13:13:37
NLSをenableにして
コンパイラをコンパイルすると
ぅをーにんぐが日本語になる

しかし、その場合
> 警告: 互換性のない引数3個のポインタを渡しますです

のように、ときどき
英語よりもわかりにくい日本語が出現
2825:2005/07/06(水) 13:15:12
ごめん warninng は消えるが error は出るね。
正しくは: while((tmp_1 = *tmp++) != 0) {
29デフォルトの名無しさん:2005/07/06(水) 13:15:36
例えば、
FILE * fp = fopen(...);
if (fp = NULL) {
...;
}
なんて書いてしまったときには大変助かる警告だね。
30デフォルトの名無しさん:2005/07/06(水) 13:16:27
>>28
黙らせる目的なら、
while ((tmp_1 = *tmp++)) {
...;
}
でもいい気もする。
31デフォルトの名無しさん:2005/07/06(水) 13:19:12
>>30
昔の msc6 だったかは、それでも消えなかった経験があって、いちいち >>28 表記してた。
コンパイラの賢さ次第かもね。
32デフォルトの名無しさん:2005/07/06(水) 13:32:55
>>18のwarningは>>30のようにすれば?という意味
33デフォルトの名無しさん:2005/07/06(水) 13:48:43
>>32
寧ろ、
if (fp = fopen(...) == NULL) ...;
と書いたときに
if ((fp = fopen(...)) == NULL) ...;
としないといけないってことかと。
34デフォルトの名無しさん:2005/07/06(水) 14:04:47
あるプログラムで2×2行列を計算してその結果を
i j data[i][j]
という形式でデータファイルに書き出しました。
そのデータファイルを別のプログラムで読み込ませたい
(新しいプログラムでの2次元配列の初期値として使いたい)のですが、
どうやってデータを読み込めばよいのでしょうか?
fgetsとかsscanfとか検索しましたがよくわかりませんでした。
35デフォルトの名無しさん:2005/07/06(水) 14:16:38
scanf("%d %d %f", &i, &j, &d);
data[i][j] = d;
36デフォルトの名無しさん:2005/07/06(水) 14:16:53
>>34
書き出した方法が判らないと読み込みようがない。
37デフォルトの名無しさん:2005/07/06(水) 14:18:13
>>前スレ969
search(void) の中の、
while(top > 0){
top--;
s = space[top];
を、

for( ; top > front; front++){
/* top--;   いらない */
s = space[front];
に修正。
38デフォルトの名無しさん:2005/07/06(水) 14:30:35
>>35
これちょっといじったらできましたorz

>>36
書き出した方法というのはどう説明すればいいんでしょうか?

プログラム上では
fprintf(fout, "%d %d %f\n", i, j, data[i][j]);

データファイルは
# i j data[i][j]
0 0 1.20
0 1 2.33
0 2 4.22
1 0 5.33
1 1 3.33
1 2 1.11

・・・って感じで書いてますが。
3934:2005/07/06(水) 14:31:09
あ、>>38>>34です。
40デフォルトの名無しさん:2005/07/06(水) 14:59:41
>>38
型も書いてないからよく判らんが、
char buf[十分な長さ];
int row;
int col;
double data[適当な列数][適当な桁数];
FILE * fp = fopen("...", "r");
while (fgets(buf, sizeof(buf), fp) != NULL) {
double val;
if (buf[0] != '#') {
continue;
}
sscanf("%d%d%lf", & row, & col, val);
data[row][col] = val;
}
かな。
しかし、冗長なファイルフォーマットだな。
4134:2005/07/06(水) 15:25:40
>>40
sscanf内で「問題のあるポインタの変換」ってwarning出る上に
すごい値が出てくるんですが。@bcc32
valでも&valでも。
4240:2005/07/06(水) 15:37:04
あぁ、& valだね。
つーか、
sscanf(buf, "%d%d%lf", & row, & col, & val);
だ。
ちっとは調べてくれよぉ。
4334:2005/07/06(水) 15:43:45
valでも&valにしても正しく読んでくれないんですが。
&valだとwarningはなくなりますけど。
44デフォルトの名無しさん:2005/07/06(水) 15:51:53
>>43
ちゃんとコピペしている?
>42は「パーセントエルエフ」だよ。
#あと、double val;ね。
45デフォルトの名無しさん:2005/07/06(水) 15:56:02
予想

なんとなく>>34
sscanf(buf, ←コレ
をまだ入れ忘れてるんだと思う。
4634:2005/07/06(水) 16:06:07
どこがおかしいんだよヽ(`Д´)ノ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char buf[10000];
int row;
int col;
double data[5][5];
FILE * fp;
if ((fp = fopen("aa.dat", "r")) !=NULL) {
while (fgets(buf, sizeof(buf), fp) != NULL) {
double val;
if (buf[0] != '#') continue;
sscanf(buf, "%d %d %lf", &row, &col, &val);
data[row][col] = val;
}
for (row=0; row<5; row++) {
for (col=0; col<5; col++) {
printf("%d %d %f\n", row, col, data[row][col]);
}
}
}
return 0;
}

本題が進まない・・・
47デフォルトの名無しさん:2005/07/06(水) 16:12:48
使ってるコンパイラが bcc32 ってのは判るから ( >>41 )
コンパイラが吐き出すエラーを正確にコピペすりゃ 誰かが答えてくれるかもしれん。

答えてもらえる為に必要な情報を提示する方法を知るのも一興
4834:2005/07/06(水) 16:24:12
>>47 そうですね、失礼しました。

val の場合
>bcc32 -w d.c
警告 W8013 d.c 16: 'val' は、おそらく値が代入される前に使われている(関数 main )
(16行目がsscanfの行)

>>41のエラーとちがうのはなんでだろ・・・

&val の場合 warningなし
49デフォルトの名無しさん:2005/07/06(水) 16:26:18
%lfで読んでるんだったら%lfで出力しないの?
50デフォルトの名無しさん:2005/07/06(水) 16:28:28
if (buf[0] != '#') continue;
^^?
51デフォルトの名無しさん:2005/07/06(水) 16:29:13
空白入んないんだ…!=であってる?
continueしたら次の行いくよ?
5234:2005/07/06(水) 16:37:32
>>50-51
あ、でけた・・・
sscanfとdata[][]=をelseではさむのと、ifの中は==ですね。
ご迷惑おかけしました。

>>49
そうなんですか?
53デフォルトの名無しさん:2005/07/06(水) 16:39:24
>>49
しない
5440:2005/07/06(水) 16:44:07
だから初心者は回答書くなと。

>>49
printf()系の変換指定子とscanf()系のそれは互換性がありそうでないから要注意。

>>34
いや、単純に
if (buf[0] == '#') {
continue;
}
だけでいい。
55デフォルトの名無しさん:2005/07/06(水) 16:48:45
>>38でできたんじゃないのか。
5634:2005/07/06(水) 16:53:41
そうですね、>>35でも一応できてます。
ただ本当は頭に#ついてたりするので40氏の方法のほうが使えます。

>>40
ifが1行ですんでるから{}いらないかなと思って勝手に省いていました。

やっと本題移れる・・・
5749:2005/07/06(水) 16:58:27
すいません勉強してきますーorz
5840:2005/07/06(水) 16:58:41
>>56
あぁ>54では、ブロック化しないのは勝手だがcontinue;しているのだからelseは要らんと言いたいだけだ。
59デフォルトの名無しさん:2005/07/06(水) 19:58:08
てかdata[i][j]だけを出力すればいいじゃん。
なんでi,jまで必要なんだよ。
60デフォルトの名無しさん:2005/07/06(水) 20:01:33
うるせえな
61デフォルトの名無しさん:2005/07/06(水) 20:36:15
関数の引数は調べたほうがいいですか?

ssize_t strlen(const char *s) {
if (!s) return -1; //こういうことはどの程度したほうがいいの?
62デフォルトの名無しさん:2005/07/06(水) 20:52:44
このスレはもうテンプレ貼ってないのな
63前スレ989:2005/07/06(水) 21:02:28
残りレス少なくて流されてしまったのですが以下
何卒よろしくお願いいたします

printf( "ファイルの大きさ : %ld\n", FileSt.st_size );

上記で表示される結果(数値)を
char strLine[MAX_PATH];で定義したシンボルに格納したいのですが
どうすればよいでしょうか?
64デフォルトの名無しさん:2005/07/06(水) 21:04:33
sprintf(strLine, "ファイルの大きさ : %ld\n", FileSt.st_size);
65デフォルトの名無しさん:2005/07/06(水) 21:04:53
ん?
標準出力を読み込んでstrLineに格納するってことですか?
66デフォルトの名無しさん:2005/07/06(水) 21:05:29
数値のみ
sprintf( strLine, "%ld", FileSt.st_size );
67デフォルトの名無しさん:2005/07/06(水) 21:10:37
そういう意味すか・・・。orz
68前スレ989:2005/07/06(水) 21:12:49
非常にありがとうございました。すんなり行きました。
69デフォルトの名無しさん:2005/07/06(水) 21:13:44
変な日本語
70デフォルトの名無しさん:2005/07/06(水) 21:15:51
うるせえな
71デフォルトの名無しさん:2005/07/06(水) 22:39:59
C言語で標準偏差ってどうやって求めるの?
72デフォルトの名無しさん:2005/07/06(水) 22:44:57
>>71
まず、標準偏差を求める式はわかるよな?
73デフォルトの名無しさん:2005/07/06(水) 22:48:44
>>61
必要だと思えばやればいい。
74デフォルトの名無しさん:2005/07/06(水) 22:57:02
たとえば
if( option -> window_grid == 1){ 、や
option -> window_grid_x = value; 、等の
コードが含まれる関数があるとします
それは、"option -> window_grid"等の部分を変えて数百個作っているのですが
増やす際に、コードが莫大におおきくなっていきます
これを、関数の引数から変更することはできないのでしょうか?

上の場合だと
if( hoge == 1){
hogeの部分を、関数の引数によってかえることはできないのでしょうか?
75デフォルトの名無しさん:2005/07/06(水) 22:59:05
>>72
見たけどΣとか難しい記号がいっぱいあってよくわかんなかった
76デフォルトの名無しさん:2005/07/06(水) 23:04:04
>>75
標準偏差=sqrt(分散)

あとは自分で調べろ
つーかCじゃないし
77デフォルトの名無しさん:2005/07/06(水) 23:27:28
>>74
hogeを引数に持つ関数を作ればいいんじゃないの?
7874:2005/07/06(水) 23:36:44
すいません、説明が悪いみたいですね
どうも、説明と言うものが下手なものですいません

もう少し考え直してみます
79デフォルトの名無しさん:2005/07/07(木) 02:04:51
教えてください。
バイナリファイルに指定長(2バイト)でintを書き込む際に、
例えば数値を255としたときに0xff00ではなく0x00ff、256としたときに0x0100というように
書き込みするにはどうしたらいいでしょうか?
8079:2005/07/07(木) 02:10:16
事故解決しました><
8179:2005/07/07(木) 02:14:09
>>80は煽りです。
小一時間考えてもわからなかったので教えてください。
82デフォルトの名無しさん:2005/07/07(木) 02:18:15
>>79
htons()
83デフォルトの名無しさん:2005/07/07(木) 02:25:44
>>79
#include <stdio.h>
#include <limits.h>

int main(void) {
    FILE *fp = fopen("test.dat", "wb");
    int i;
    unsigned int hoge = 255;
    unsigned char temp;
    for (i = sizeof(unsigned int) - 1; i >= 0; i--) {
        temp = (hoge >> i * CHAR_BIT) & 0xff;
        fwrite(&temp, 1, 1, fp);
    }
    fclose(fp);
}
84デフォルトの名無しさん:2005/07/07(木) 02:28:57
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main() {
int k;
double b[2000];
srand((unsigned int ) time(NULL)*4876465);
for(k=0;k<2000;k++) b[k]=rand();
for(k=0;k<2000;k++) printf("%f",b[k]);
}

配列の一つ一つに異なる乱数を代入したいのですが、
以上のようにやるとすべて同じ値が代入されてしまいます。
for文の中にsrandを入れても同様の結果になってしまいました。
原因を教えていただきたいです・・
85デフォルトの名無しさん:2005/07/07(木) 02:30:13
>>79
void writeRev2(FILE * fp, unsigned a)
{
fputc((a >> 8) & 0xff, fp);
fputc((a & 0xff, fp);
}
86デフォルトの名無しさん:2005/07/07(木) 02:31:39
>>84
全て同じ値とは?
8779:2005/07/07(木) 02:33:17
>>83
>>85
ビットシフトすればいいんですかね。
やってみます。
ありがとう。
8884:2005/07/07(木) 02:37:14
すいません、自己解決しました
89デフォルトの名無しさん:2005/07/07(木) 10:37:55
需要があるホームページのコンテンツを提案する
http://pc8.2ch.net/test/read.cgi/hp/1112585832/51

を作ってみようと思うんだがどうよ?
90デフォルトの名無しさん:2005/07/07(木) 12:01:22
JMがあるからいいや。
91デフォルトの名無しさん:2005/07/07(木) 12:19:30
>>89
スレ違い
9274:2005/07/07(木) 12:24:44
無限をメモリを喰い続けるコードってどうなんですか?

#include<stdio.h>

int main(void){
int *mem;
while(1){
malloc(10000);
}

return 0;
}

だと、だめでした
93デフォルトの名無しさん:2005/07/07(木) 12:26:51
>>92
> 無限をメモリを喰い続ける

意味不明
94デフォルトの名無しさん:2005/07/07(木) 12:27:45
>>92
「どうですか」って何が知りたいんだ?
「だめでした」って、何を期待してるんだ?
95デフォルトの名無しさん:2005/07/07(木) 12:29:05
ヒント:釣り
96デフォルトの名無しさん:2005/07/07(木) 12:31:01
名前と一部のコードが間違ってましたすいません
int *memはコピーミスです

無限にメモリを悔い続けると言うのは
マシン上のメモリを確保し続けるということです
メモリを使い果たしたらどうなるかと言うてすとがしたいのです
97デフォルトの名無しさん:2005/07/07(木) 12:37:39
>>96=92
まず、日本語を勉強してくれ。
98デフォルトの名無しさん:2005/07/07(木) 12:43:33
99>>92:2005/07/07(木) 12:48:53
int main(void){
size_t *mem,i=0;
while(1){
mem = (siz_t*)malloc(sizeof(size_t));
*mem = i++;
}
return 0;
}

リソース見ながらこれでも試してみろ。
何が起きても知らんがな。
100デフォルトの名無しさん:2005/07/07(木) 12:54:10
>>96
テストすれば良いのではないでしょうか?
101デフォルトの名無しさん:2005/07/07(木) 12:56:23
あほなのか?
それをテストするためにコード書いてたんだろ
102デフォルトの名無しさん:2005/07/07(木) 12:58:37
>>96
前述のコードでテストできてると思うぞ?
最終的には、malloc()がNULLを返すようになるだけ。
今日びのOSなら、遅くはなってもOSが落ちたりすることはないだろう。
103デフォルトの名無しさん:2005/07/07(木) 12:59:35
>>96のコードだとならなくないか?
104デフォルトの名無しさん:2005/07/07(木) 13:22:44
>>103
なににならないのか。
105デフォルトの名無しさん:2005/07/07(木) 14:26:07
malloc()等がNULLを返すのは、メモリがなくなった時とは限らない。
106デフォルトの名無しさん:2005/07/07(木) 14:36:17
>>105
便乗質問。
メモリ不足以外の時ってどんな時ですか?
107デフォルトの名無しさん:2005/07/07(木) 14:40:49
つフラグメント
108デフォルトの名無しさん:2005/07/07(木) 14:43:52
work=num[i]; i++;

work=num[i++];
って同じこと?
109デフォルトの名無しさん:2005/07/07(木) 14:46:46
ちがう
110デフォルトの名無しさん:2005/07/07(木) 15:15:13
>>108
その行を見る限り、ほぼ同じ。
111デフォルトの名無しさん:2005/07/07(木) 15:16:10
work=num[i++];

i++; work=num[i];
ってことか
112デフォルトの名無しさん:2005/07/07(木) 15:17:20
やべリロードしてなかった。同じでいいのかな?
113デフォルトの名無しさん:2005/07/07(木) 15:21:47
>>111
違うだろ。>>108の方がより正しい
114デフォルトの名無しさん:2005/07/07(木) 15:27:33
i++ は 値を渡してから 加算。
++i は 加算してから 値を渡す。
num[i++] は num[ 値くれ ]、i++ の値ってなによ? と読めるから 加算前の値になるべ。

int a = 0;
int b = 0;
int a1 = a++;
int b1 = ++b;

とやって違いを見るべし
115デフォルトの名無しさん:2005/07/07(木) 15:30:44
ある関数が構造体の中の要素を変えて複数個あるのですが
これを1つの関数で要素を変えて実行したいのですがどうすればいいのでしょうか?

typedef struct{
char *a;
int b;
int c;
int d;
} TYPE;

void hoge(){
}

int main(void){
hoge ()
}

と言う感じで、hogeの引数として構造体の要素を渡したいと思うのですが
どういうふうに渡しどういうふうに受け取ればいいのでしょうか?
116デフォルトの名無しさん:2005/07/07(木) 15:55:16
>>115
日本語は正しく

typedef struct{
char *a;
int b;
int c;
int d;
} TYPE;

void hoge( TYPE *hoge ){
 /* hogeを使ってあれこれ */
}

int main(void){
TYPE foo;
hoge( &foo );
}

こういう事?
117デフォルトの名無しさん:2005/07/07(木) 15:56:21
言っている意味がよく分からん
118デフォルトの名無しさん:2005/07/07(木) 16:03:06
まさか offsetof とか使うような特殊なことしようとしてるのか?
やりたいことをちゃんと伝えられるような訓練したほうが良いぞ…
119デフォルトの名無しさん:2005/07/07(木) 16:11:34
>>114
理解できたあああああああああああああああああああ
120デフォルトの名無しさん:2005/07/07(木) 16:18:24
>>115
hoge_int(int a){
}

int main(){
TYPE a;
hoge_int(a.a);
...
}

のような事をやりたいのか?
121デフォルトの名無しさん:2005/07/07(木) 16:25:23
あ。MASM の 繰り返し展開マクロみたいなのを期待してるんか?
※ たしかにそういうのが欲しい時もあるけど…

#define IMP_HOGE(a) hage->a = 0;
として
 IMP_HOGE( <foo, bar> )

 hage->foo = 0;
 hage->bar = 0;
にプリプロセスされる っていう都合の良いものは C言語の枠組みには無い (よね?
122デフォルトの名無しさん:2005/07/07(木) 16:25:40
linux C で
メモリの空き容量を取得したいのですが
どのような方法があるでしょうか教えていただけないでしょうか。
よろしくお願い致します。
コンパイラはgccです。
123デフォルトの名無しさん:2005/07/07(木) 16:36:21
/proc/meminfo
つか、スレ違い。
124デフォルトの名無しさん:2005/07/07(木) 16:49:02
>123
すみませんC言語ならいいかと思って。

125デフォルトの名無しさん:2005/07/07(木) 17:36:25
>>124
>1くらい読んでから書きましょう。

>>121
既に>118でキーワードが出てるんだから調べてから回答しいや。
126118=121:2005/07/07(木) 17:39:24
>>125
121=118 なんだけど ID ないから判らないわな。 半端回答スマン。
127115:2005/07/07(木) 19:34:45
説明が下手ですいません

>>116
それだと複数個の関数を用意しなければなりませんよね?

>>120
はい、そのようなことをしたいのですが
それだと、hoge_int内でaが変更されても実際にはa.aは変更されませんよね?
それが変更できるように使いたいです

typedefは >>115のままだとして

void hoge(char temp, int temp_1){
temp = &temp_1;
}

int main(void){
TYPE a;
hoge(a.a, a.b);
hoge(a.a, a.c);
}

のようなことがやりたいのです
hoge内で変更されたないようはa構造体の中身の変更になるようにはできないでしょうか?
128デフォルトの名無しさん:2005/07/07(木) 19:39:49
それって

int main(void){
TYPE a;
a.a = a.b;
a.a, = a.c;
}

でいいじゃねーの?
129デフォルトの名無しさん:2005/07/07(木) 19:43:56
>>127
a.b と a.c の型は異なる場合があるってこと?
どっちもintとかなら、hoge(int *b, int *c)
でいいんじゃない?
130115:2005/07/07(木) 19:56:25
>>128
例で書いただけですのでhogeの中の実際の処理とは違います

やはり説明が悪いみたいですね

実際のTYPEは数百の要素があり、hoge関数は数百回呼び出されます
ですので、hogeをひとつ書いておき それに渡す引数で計算を変えたいのです

例えば
hoge_1(TYPE *a){
a->a = a->b;
}

hoge_2(TYPE *a){
a->a = a->c;
}

void main(void){
TYPE a;
hoge_1(&a);
hoge_2(&a)
}

これだと、a.aに次々入れると言うだけの単調な処理なのにhoge_iのiが増えるだけコードも関数も増えていきます
131115:2005/07/07(木) 19:59:36
ですので、

void hoge(char temp, int temp_1){
temp = &temp_1;
}

int main(void){
TYPE a;
hoge(a.a, a.b);
hoge(a.a, a.c);
}

この例えのように、すれば関数の数を増やさなくてもいいと思うのですが
こういうことはできないのでしょうか?
132デフォルトの名無しさん:2005/07/07(木) 20:03:10
>>130
言いたいことがさっぱり分からんが

hoge(int *n) { *n = ... }
main() { TYPE a; hoge(&a.a); }

ではだめなのか。
133デフォルトの名無しさん:2005/07/07(木) 20:06:35
>>131
それなら
hoge(char* a, char *b) { *a = *b; }
main() { TYPE a; hoge(&a.a, &a.b); hoge(&a.a, &a.c); }
でいいだろ
134デフォルトの名無しさん:2005/07/07(木) 20:09:18
>>131
そもそも

>void hoge(char temp, int temp_1){
>temp = &temp_1;
>}

はコンパイルできないぞ。
temp と、&temp_1 は型が違う。

135デフォルトの名無しさん:2005/07/07(木) 20:21:37
>>134
たとえだっていってるじゃん
136デフォルトの名無しさん:2005/07/07(木) 20:23:24
char* a
これってどういう意味なの?
137デフォルトの名無しさん:2005/07/07(木) 20:30:55
char 型変数へのポインタ変数 a
138デフォルトの名無しさん:2005/07/07(木) 20:39:19
>>130
そもそも、構造体が数百の要素を持つというのが異常な気がするが。
配列で持つことはできないのか?
139デフォルトの名無しさん:2005/07/07(木) 20:45:43
>>138
禿同。
事業主に似たようなケースのソースを修正してくれと頼まれたことがある。
「ソースのバイト量で見積もりが高かった頃の名残ですね」
と言ったら苦笑してたよ。
140デフォルトの名無しさん:2005/07/07(木) 21:02:59
構造体を配列でもつってどういうこと?
141デフォルトの名無しさん:2005/07/07(木) 21:13:50
struct hoge{int i1, i2, i3, i4....};
みたいになってるhogeのi1〜iNに対して同じ関数を適用したい、みたいな話だなぁ。
配列を展開しておきました、みたいな。
142デフォルトの名無しさん:2005/07/07(木) 22:28:00
>140
あえてマジレス。
構造体の「要素」を配列でもつ、だ。>141 なら struct hoge { int i[4]; }; みたいな感じ。
文字通り構造体を配列でもつなら struct hoge boke[4]; なだけだが。
143デフォルトの名無しさん:2005/07/07(木) 22:38:38
C言語よりこのスレの日本語が難しいと感じる今日この頃。
144デフォルトの名無しさん:2005/07/07(木) 22:41:51
145デフォルトの名無しさん:2005/07/07(木) 23:16:10
>>115
今、問題になっているソースを晒した方がいいと思われ。
146デフォルトの名無しさん:2005/07/07(木) 23:18:02
構造体の要素が数百個だぞ
147115:2005/07/08(金) 00:02:43
皆様ありがとうございました
もう少し自分で考えてみるとします
どうも本当にすいませんでした
148デフォルトの名無しさん:2005/07/08(金) 00:28:49
>>115
>>118 だろ?
行数が多いって怒られちゃったよ...orz

/* C FAQ 2.14, 2.15 */
#include <stddef.h>
#include <stdio.h>
#ifndef offsetof
#define offsetof(type, mem) ((size_t) \
((char *)&((type *)0)->mem - (char *)(type *)0))
#endif /* !offsetof */
typedef struct TYPE {
char *a;
int b;
int c;
int d;
} TYPE;
void hoge(TYPE* type, size_t offset) {
type->a = ((char*)type) + offset;
}
int main() {
TYPE a = { NULL, 3, 2, 1 };
hoge(&a, offsetof(TYPE, b));
printf("%d\n", (int)*a.a);
hoge(&a, offsetof(TYPE, c));
printf("%d\n", (int)*a.a);
hoge(&a, offsetof(TYPE, d));
printf("%d\n", (int)*a.a);
}
149デフォルトの名無しさん:2005/07/08(金) 00:33:18
>>148
offsetof って無いこともあるの?
150148:2005/07/08(金) 00:35:58
自分はそんな処理系を使ったことがないけれど、
C FAQ には無いこともある、と書いてある。
調べて >> 149
151115:2005/07/08(金) 00:50:55
>>148
いや、わたしは>>115です・・・
152デフォルトの名無しさん:2005/07/08(金) 00:52:35
ダメだこりゃ。
153デフォルトの名無しさん:2005/07/08(金) 00:53:18
>>149
C99には、規格として規定されている。しかしながら、C89しか考慮して
いない、またはC99の新機能の一部しか考慮していない処理系が大部分を
占めると考えられる現状においては、ない可能性が十分にある。
154デフォルトの名無しさん:2005/07/08(金) 03:44:48
C FAQには、「ANSI Cなら用意されている」と書いてあるだろ(2.14)。
つまり、C89準拠なら確実にあるんだよ。
FAQで「ない場合」というのは、俗に言うK&R時代のCのこと。
(プロトタイプやvoidの無いやつ)

だから、>>153は、1行目の前半以外は大嘘。

誰でも安心して使って良いし、再defineなどは絶対にしてはならない。
(これは、同2.14の最後に触れているように、0番地のキャスト、及びそのアドレスを取ることを
認めないコンパイラというのも規格上存在する可能性があり、
その場合にはコンパイラが内部機能としてoffsetofの計算を行っているため)
155デフォルトの名無しさん:2005/07/08(金) 10:39:40
typedef struct{
int a;
int b;
int c;
} TEST;

という、構造体を初期化するときはどうするのでしょうか?

typedef struct{
int a=0;
int b=0;
int c=0;
} TEST;

とかくのでしょうか?
156デフォルトの名無しさん:2005/07/08(金) 10:52:00
>>155
頼むから余りに初歩的な質問は初心者スレへ行ってくれ。
で、初期化は実体を定義するときに行なう。
つまり、
typedef struct {...} TEST;
のときではなく、
TEST foo = {0, 0, 0};
というように。
どうせあんたのレベルだといろいろ判っていないだろうから、
これに頼らず初心者向けの資料でちゃんと調べておくといい。
157デフォルトの名無しさん:2005/07/08(金) 10:54:25
このレスは相当親切で自分の利益になった取るのが吉
158デフォルトの名無しさん:2005/07/08(金) 11:06:59
>>156 >初期化は実体を定義するとき

'定義'じゃなくて'宣言'ね。
159デフォルトの名無しさん:2005/07/08(金) 11:09:55
>>156
気にくわないならスルーすれないいじゃん
あほなの?
160デフォルトの名無しさん:2005/07/08(金) 11:10:56
161デフォルトの名無しさん:2005/07/08(金) 11:11:26
どうして、struct内で初期化したらダメなの?
162デフォルトの名無しさん:2005/07/08(金) 11:15:57
>>161
そういう風に言語ができてるから。

>>159
スルーできない人が言える事じゃない。
163デフォルトの名無しさん:2005/07/08(金) 11:17:42
べつにやってもいいんじゃないの?
できるし
164デフォルトの名無しさん:2005/07/08(金) 11:19:20
できるからやりたければやればいいじゃない
不便だという人がいる事を念頭においておけばいつかそれが役に立つかもしれないじゃない
165デフォルトの名無しさん:2005/07/08(金) 11:19:26
いや、できないね ごめん
ってか、おっきめの構造体を0で初期化しようとおもったら

TEST hoge = {0, 0, 0, 0, 0, ....}
って、百個ちかく書かなくちゃいけないね
166デフォルトの名無しさん:2005/07/08(金) 11:20:10
>>164
できないでしょ
167デフォルトの名無しさん:2005/07/08(金) 11:20:17
ほらなんで不便か直に教えてもらえたじゃない
168デフォルトの名無しさん:2005/07/08(金) 11:27:40
ほとんどゼロなら
TEST hoge = {0};
でいいじゃん・・・。
169156:2005/07/08(金) 11:57:17
>>165
>どうせあんたのレベルだといろいろ判っていないだろうから、
>これに頼らず初心者向けの資料でちゃんと調べておくといい。
170デフォルトの名無しさん:2005/07/08(金) 12:25:44
>>168
それだとポインタがはいってたらできないでしょ
171デフォルトの名無しさん:2005/07/08(金) 12:31:13
>>170
だ か ら 「0なら」だと言っとるだろうが。
誰もNULLとは言ってない。
殆ど0なら、0で埋めてから任意に初期化すればいい。
172デフォルトの名無しさん:2005/07/08(金) 12:34:18
>>170
ポインタならNULL、浮動小数点数なら0.0に初期化されるはずだが?
173デフォルトの名無しさん:2005/07/08(金) 12:34:40
特に面白いと思ったわけではないが軽い半ネタにマジレスされてマジで返さなきゃいけなくなった時の辛さ
174デフォルトの名無しさん:2005/07/08(金) 12:38:04
>>172
どっちも保証はされてない。
少なくとも、普及してるパソコン上ではそうなるけどね。
組込みだとそうはいかんってだけ。
175デフォルトの名無しさん:2005/07/08(金) 12:38:55
構造体のなかで構造体は定義できますか?
176デフォルトの名無しさん:2005/07/08(金) 12:39:34
できます。さようなら。
177デフォルトの名無しさん:2005/07/08(金) 12:39:45
>>175
できる
178デフォルトの名無しさん:2005/07/08(金) 12:39:48
できるよ!どんどんするといいよ!
179デフォルトの名無しさん:2005/07/08(金) 12:59:30
>>174
されてるだろ。
calloc や memset で 0 埋めしても 0 で初期化したことにはならないけど。
180デフォルトの名無しさん:2005/07/08(金) 13:03:24
struct stat
とはどういう意味ですか?
181デフォルトの名無しさん:2005/07/08(金) 13:05:56
エキサイトの翻訳で調べたら structスタット だそうだ
エキサイト便利だね
182デフォルトの名無しさん:2005/07/08(金) 13:09:40
>>179
組込みなら保証されないよ。
char unko[256]={0};
とやったときに残りを0埋めするのは「自分」ですから。
市販ライブラリをぶち込む分には大丈夫だと思うけど。
183デフォルトの名無しさん:2005/07/08(金) 13:16:31
>>182
組込みの話なんか誰もしてないから
184デフォルトの名無しさん:2005/07/08(金) 13:29:28
おれはしてる
185デフォルトの名無しさん:2005/07/08(金) 13:31:36
素敵
186デフォルトの名無しさん:2005/07/08(金) 13:33:32
>>183
>>174でしてる
187デフォルトの名無しさん:2005/07/08(金) 13:36:49
>>182の言ってる例(unko)はNULLと浮動小数点について
保証されてる云々の話とは違う。

C++ではNULLは0であると保証されているが、
C言語では保証されていない(これは勘違い野郎が多い)。
C言語ではNULLが偽のなることだけが保証されている。
それにC言語の浮動小数点はIEEE754にするなどと規定していないし、
0-fillした時に0.0になるなどとも規定していない。
ただ、実用上はそのような前提にしても問題なかろう、という話だ。

以上。
188180:2005/07/08(金) 13:38:14
おしえていただけませんかね?
189デフォルトの名無しさん:2005/07/08(金) 13:48:23
>>188
statという構造体
190デフォルトの名無しさん:2005/07/08(金) 13:51:32
>>187
0-fillとかそういう話でなくて、
初期化子のない静的変数や初期化子の足りない構造体、配列は
0で初期化されるが、この場合0で初期化するというのは、
ポインタならNULL、浮動小数点数なら0.0で初期化される
ということが保証されてるのかどうかって話。
191180:2005/07/08(金) 13:52:29
statの実体はどこにあるんですか?
192デフォルトの名無しさん:2005/07/08(金) 13:52:58
unsigned char に入っている16進数(0〜f)を
10進数(0〜15)に直すにはどうしたらよいのですか?
簡単な質問で申し訳ないですが、よろしくお願いします。
193デフォルトの名無しさん:2005/07/08(金) 13:55:08
16進数を10進数に計算しなおせばいい
194デフォルトの名無しさん:2005/07/08(金) 13:55:13
>>192
ヒント:どうもしない
195デフォルトの名無しさん:2005/07/08(金) 13:56:47
だから余りに初歩的な質問は……
>>188
statというタグ名のついた構造体。
sys/stat.hを見るなりman statするなりして調べましょう。
196デフォルトの名無しさん:2005/07/08(金) 13:57:32
unsigned char c = 0xf;
printf("%d", c);
197192:2005/07/08(金) 14:07:21
ありがとうございます。
大変申し訳ないんですが、質問を微妙に間違えてしまいました。
unsigned char には16進数としてではなく、文字列として0〜fまで入ってます。
unsigned char c = 'f';のように。
スレ違いでしたら、初心者歓迎のスレを見つけたので、そこで聞いてみます。。。
198デフォルトの名無しさん:2005/07/08(金) 14:12:36
すれ違いじゃないけどきみは意味がわかっていない
0-fなら16進数でしょ
どこかにかきだしたいんならprintfでいいじゃん
199デフォルトの名無しさん:2005/07/08(金) 14:14:16
>>187
Cのソース上で「0」と書かれたものが、
ポインタとして解釈される場合、それはNULLポインタを意味する。
これはCの仕様。
ただし、NULLポインタのビットパターンがAll0である保証がないだけ。
200198:2005/07/08(金) 14:14:24
ちょっとまってあんた
俺が読み違えてた
頭使ってちょっと考えてみ
きみがいいたいのは fなら15にしたいとかでしょ?
例えば ffだとすると1515こんなもんにしてどうするの?
ffと1515の意味はまったく違うよ?
201デフォルトの名無しさん:2005/07/08(金) 14:16:26
多分16進数とか10進数がなにかがわかってないんだろうね
202デフォルトの名無しさん:2005/07/08(金) 14:20:53
>>192
取り敢えず、これでどうだろう。
unsigned char foo = 'f';
printf("%d\n", foo >= '0' && foo <= '9' ? foo - '0' : foo >= 'a' && foo <= 'f' ? foo - 'a' + 10 : -1);
203192:2005/07/08(金) 14:21:37
最初の説明が足りませんでした。
自分がしたいのは、
4つの文字列を16ビットの数字に変換したいのです。
00ffときたら、0000 0000 1111 1111
というふうに。
この場合ですと、256ですね。
0〜fまでの文字列を0〜15に変換できれば
あとはビット演算で計算しようと思ってたのです。
204デフォルトの名無しさん:2005/07/08(金) 14:22:07
>>202
そんなことしなくても
man printfみたらもっと便利な方法があると思うよ
205デフォルトの名無しさん:2005/07/08(金) 14:23:04
情報の小出しはやめとけ
206デフォルトの名無しさん:2005/07/08(金) 14:23:24
>>203
それなら、これでいいっしょ。
unsigned char foo[] = "00ff";
printf("%d\n", strtol(foo, NULL, 16));
207デフォルトの名無しさん:2005/07/08(金) 14:23:42
>>192
int x;
char str[] = "deadbeef";
sscanf(str, "%x", &x);
sprintf(str, "%d", x);
208デフォルトの名無しさん:2005/07/08(金) 14:24:14
>>203
まったくもってなにがしたいのかがわからない
209デフォルトの名無しさん:2005/07/08(金) 14:29:57
よく考えたら
struct stat hoge;
って不便だな

なんでstat型をつくらないんだろう
210デフォルトの名無しさん:2005/07/08(金) 14:31:35
>>209
なんでだろうね
構造体を自分で宣言するときは必ずtypedefしてるけど
211デフォルトの名無しさん:2005/07/08(金) 14:33:51
>>210
俺もしてる
その方が楽っていうかやりやすいし
わかりやすいと思うのに
212デフォルトの名無しさん:2005/07/08(金) 14:35:27
昔のコンパイラはそれほど賢く作られていなかったのですよ。
C++のように、struct stat {...};でstat foo;と書けるようにするとparseが面倒でしょ。
213デフォルトの名無しさん:2005/07/08(金) 14:41:26
そういうことを訊いてるんじゃないと思う。>>212
「エキスパートCプログラミング」の著者が
構造体をtypedefすると構造体であることがわかりにくいからすんなって主張してた。
わかりにくくて困ることが何かあるのか?って思った。
214デフォルトの名無しさん:2005/07/08(金) 14:43:23
>>213
ああ、なるほど
確かにそれはあるかもね。

いや、無いか。いまさら。
215デフォルトの名無しさん:2005/07/08(金) 14:49:48
漏れは外部向け構造体はtypedefして、
モジュール内部でしか使わない構造体はstructのままにしてる。
FILEのように、使う側が構造体メンバにアクセスする必要が無いなら
typedefしてもいいんじゃないかな。
216デフォルトの名無しさん:2005/07/08(金) 15:07:07
statってC99の範囲外だったんだ
217デフォルトの名無しさん:2005/07/08(金) 15:20:11
(space) = (cast)malloc((u_long)(size), type, flags)
なぜ、mallocはキャストしなければならないのでしょうか?
218デフォルトの名無しさん:2005/07/08(金) 15:23:05
Cではキャスト不要
C++では型を合わせるために必要になる。
int *ip;
char *cp = ip;
こういううっかりバグを防ぐために。
219デフォルトの名無しさん:2005/07/08(金) 15:27:22
Cでもキャストしてるコードをよく見るけど
あれは確認の意味を込めて見たいな感じ?
220デフォルトの名無しさん:2005/07/08(金) 15:30:49
もしかしてfreadの(void *)も不要?
221デフォルトの名無しさん:2005/07/08(金) 15:51:42
fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
キャストする必要があるの?
222デフォルトの名無しさん:2005/07/08(金) 16:27:52
void *「へ」のキャストは、C++でも不要
void *「から」のキャストは、C++では必要
Cでは、両方不要
もちろん、データのポインタ型に限る
223デフォルトの名無しさん:2005/07/08(金) 16:32:14
>ポインタキャスト
コンパイラによってはデフォルトでエラーになるから悲しい。
特にSGI(IRIX)のとかね。
224デフォルトの名無しさん:2005/07/08(金) 16:43:02
>>219
lintを黙らせる為に使うことはある
225デフォルトの名無しさん:2005/07/08(金) 16:56:23
すいません… 学校の課題ででたんですけど・・・(´・ω・`)/
ポインタで入力した文字列をその配列の中で逆転するのはどうやったら
いいんですか??
問題が、課題2において、文字列へのポインタstr1を
入力し、その文字列を逆順にしたものを改めて
str1が指す文字列に格納する関数reverse_str_2を
作成したうえでプログラムJuly17.cに追加し、これを
完成させなさい。
なんです。 
プログラムuly17.cが
#include<stdio.h>
/* プロトタイプ宣言は考えること・・・ヒント:呼び出し部分を見ればわかる */
main(){
char string[100]; /* 入力する文字列(99文字までOK(なぜ99文字なのか考えること) */
printf("文字列を入力してください:");
gets(string); /* 文字列を入力 */
reverse_str2(string); /* 文字列を逆に並べる */
printf("\n\n"); /* 少しあける */
printf("逆にしたら: %s\n", string);
}
/* この下に関数 reverse_str2 を書いてください */
なんです。 おねがいします(><)
226デフォルトの名無しさん:2005/07/08(金) 16:59:57
>>225
宿題は宿題スレへ。
227デフォルトの名無しさん:2005/07/08(金) 17:03:17
>>213-214
おもしろいことにC++を作ったBjarneはユーザ定義型の差別だとD&Eに書いた。
228デフォルトの名無しさん:2005/07/08(金) 19:45:10
>>225
char* reverse_str2(char *string) {
static int i,j;
char geriunko = string[i];

if ( string[i++] )
reverse_str2( string ), string[j] = geriunko, j++;
else
string[--i] = '\0';

return string;
}
229デフォルトの名無しさん:2005/07/08(金) 20:24:19
m(int x,int y,int k){
int j;
if(x<y){
for(j=x;j>0;J--){
if(x % j ==0){
k=j;
if(y %k ==0){
printf("%d\n",k);
j=0;
}
}}}
if(x>y){
for(j=y;j>0;J--){
if(y % j ==0){
k=j;
if(y %k ==0){
printf("%d\n",k);
j=0;
}
}}}
}
を再帰で書くとどうなりますか?
230デフォルトの名無しさん:2005/07/08(金) 20:28:01
よみづらい
名前ちゃんと付けてこいや
231デフォルトの名無しさん:2005/07/08(金) 20:28:44
そのコードでほんとにあってるのか?
Jってなんだ?
232デフォルトの名無しさん:2005/07/08(金) 20:32:10
k 要らなくね?
233デフォルトの名無しさん:2005/07/08(金) 20:33:50
kいらないです。
234デフォルトの名無しさん:2005/07/08(金) 20:38:27
m(int x,int y){
int j;
if(x<y){
for(j=x;j>0;j--){
if(x % j ==0){
if(y %j ==0){
printf("%d\n",j);
j=0;
break;
}
}}}
if(x>y){
for(j=y;j>0;j--){
if(y % j ==0){
if(x % j ==0){
printf("%d\n",j);
j=0;
}
}}}
}
少しだけ簡潔にしましたが、動きませんorz
235デフォルトの名無しさん:2005/07/08(金) 20:41:01
簡潔ツーか、ロジック変わってるやん。
それに動かないものを再帰にさせようとしているのか?
再起不能。
236デフォルトの名無しさん:2005/07/08(金) 20:43:10
>>234
今度は、二つのifブロックの中身がまったく同じになったぞ。
237デフォルトの名無しさん:2005/07/08(金) 20:43:32
ごめん、微妙に違った。
238デフォルトの名無しさん:2005/07/08(金) 20:44:12
何をしたいかを日本語で書いて宿題スレへ持っていく方が早そうな予感。
ただし「まともな」日本語を229==234が書けることを前提とする。
239デフォルトの名無しさん:2005/07/08(金) 20:44:15
gccではうごいたんです。
240デフォルトの名無しさん:2005/07/08(金) 20:44:19
一から書き直したほうがいいと思うよ
241デフォルトの名無しさん:2005/07/08(金) 20:47:32
動かないわけではないですけど、x,y何を代入しても4が帰ってきます。
242デフォルトの名無しさん:2005/07/08(金) 20:54:00
最大公約数計算っぽいな
#include <stdio.h>
//ロジックの整理
void m(int x,int y){ 
  int j; 
  if(x<y){ 
    for(j=x;j>0;j--){ 
      if(x % j ==0 && y %j ==0){ 
        printf("%d\n",j); 
        break; 
      } 
    }
  }
  
  if(x>y){ 
    for(j=y;j>0;j--){ 
      if(y % j ==0 && x % j ==0)
      { 
        printf("%d\n",j); 
        break;
      } 
    }
  }
243デフォルトの名無しさん:2005/07/08(金) 20:54:16
//再帰版
void r(int x,int y,int j)
{
if( j == 0 ) return;
if( y % j || x % j) r(x,y,--j);
else printf("%d\n", j);
}

void m2(int x, int y)
{
if( x == y ) return;
if( x < y ) r( x, y, x);
else r( x, y, y);
}

//動作確認
int main()
{
int x = 111, y = 99;
m(x,y);
m2(x,y);
return 0;
}
244デフォルトの名無しさん:2005/07/08(金) 21:04:25
というか、何でコマンドプロンプトはすぐに計算終了後閉じるんですか?
245デフォルトの名無しさん:2005/07/08(金) 21:05:09
処理が終わったから。
246デフォルトの名無しさん:2005/07/08(金) 21:08:39
結果が見えないじゃないですか。
247デフォルトの名無しさん:2005/07/08(金) 21:08:51
>>244
それはCの問題じゃない。
248デフォルトの名無しさん:2005/07/08(金) 21:09:49
DOSの問題ですけど、ターミナルしか使ったことないんで。
249デフォルトの名無しさん:2005/07/08(金) 21:13:42
ターミナルなら、./a.out > t.t
で、出来るるんですけど、それと同じこと出来ませんか?
250デフォルトの名無しさん:2005/07/08(金) 21:15:38
スタートメニュー > ファイル名を指定して起動 > cmd.exe と入力。
251デフォルトの名無しさん:2005/07/08(金) 21:18:07
それで?
252デフォルトの名無しさん:2005/07/08(金) 21:18:12
>>249
もっと基本的な所から勉強しろ。
253デフォルトの名無しさん:2005/07/08(金) 21:20:22
>>251
format c:/
254デフォルトの名無しさん:2005/07/08(金) 21:20:24
いや、もうウインドウズ使う機会ないんで。
255デフォルトの名無しさん:2005/07/08(金) 21:21:14
>>253
それで?
256デフォルトの名無しさん:2005/07/08(金) 21:21:40
「ターミナルなら」だってよ、馬鹿は帰れ。
257デフォルトの名無しさん:2005/07/08(金) 21:22:43
258デフォルトの名無しさん:2005/07/08(金) 21:29:07
意味不明
259デフォルトの名無しさん:2005/07/08(金) 21:31:22
Mac(Unix)やLINUX使ったことないんですか?
260デフォルトの名無しさん:2005/07/08(金) 21:34:22
>>259
使ってる人間に馬鹿にされていることをわからないと
261デフォルトの名無しさん:2005/07/08(金) 21:37:06
そ れ で !
262デフォルトの名無しさん:2005/07/08(金) 21:39:08
>>261
回線切って首吊って寝ろ。 600秒くらい。
それで十分だろ。
263デフォルトの名無しさん:2005/07/08(金) 21:39:33
小学生をいじめちゃいかんよ!
264デフォルトの名無しさん:2005/07/08(金) 21:49:01
>>256-260
F3は普段使いませんよね? (・∀・)ニヤニヤ
265デフォルトの名無しさん:2005/07/08(金) 21:49:49
F3ってgoto文が入ってたんだっけ?
266デフォルトの名無しさん:2005/07/08(金) 21:50:59
>>265
デフォルトでは。(w
267デフォルトの名無しさん:2005/07/08(金) 21:53:12
>>266
ありがとう
268デフォルトの名無しさん:2005/07/08(金) 21:54:31
てめーらいちいちパンチラ見えた小学生みたいにはしゃいでんじゃねえよ
269デフォルトの名無しさん:2005/07/08(金) 21:56:13
>>268
お前が一番だがな
270266:2005/07/08(金) 21:57:25
>>267
同年代だろうか?(w
271デフォルトの名無しさん:2005/07/08(金) 21:57:57
>>268
>265はパンチラか?
272デフォルトの名無しさん:2005/07/08(金) 21:59:56
273たすけて:2005/07/09(土) 01:28:09
コンパイルは出来るのに「問題が発生したため***.exeを終了します。ご不便をおかけして申し訳ありません。」というウィンドウが出て実行できません。なぜですか??誰か教えてください!
274デフォルトの名無しさん:2005/07/09(土) 01:30:33
コンパイルが通ったらバグのないコードなら
世の中に流通してるほぼ全てのバイナリはバグ0だネ
275デフォルトの名無しさん:2005/07/09(土) 01:31:42
>>273
プログラムのコードに問題があるから。
"コンパイルできればエラーがない"ということにはならないよ。
276デフォルトの名無しさん:2005/07/09(土) 01:33:08
>>273
コンパイルできたというのは
そのソースコードがシンタクス的に正しい
というそれだけのことです

コンパイラはプログラムの意味や処理が正しいか、なんてことは判断できませんし
しません
あなたのプログラムがメモリを壊そうがHDDを初期化しようが
全世界に向けてラブレターを振りまこうが、知ったことではないのです
277デフォルトの名無しさん:2005/07/09(土) 01:40:27
>>274
ソレダッ!!
278デフォルトの名無しさん:2005/07/09(土) 02:01:36
コンパイルが通れば動いてくれればいいのにな
今書いてるコード制作期間は2週間なのに
なぜかセグフォる、デバッグにもう10日はかけてる
しにたくなってくるな
279デフォルトの名無しさん:2005/07/09(土) 04:40:04
>>273
これって、確実に関係ないメモリ破壊してるよね
メッセージが出るってことは、=被害大きいってことなの?
280デフォルトの名無しさん:2005/07/09(土) 08:18:48
だた単にファイルオープンぬrぽなんてこともあるし。。
281デフォルトの名無しさん:2005/07/09(土) 11:18:19
>>280
ごめん。
282デフォルトの名無しさん:2005/07/09(土) 11:28:11
10日もかけてわからんのかよ・・・
283デフォルトの名無しさん:2005/07/09(土) 14:26:04
for( int i = 1; i <= 10; i++ )

ってC言語でも書けるの?
284デフォルトの名無しさん:2005/07/09(土) 14:28:17
>>283
C99から可
285デフォルトの名無しさん:2005/07/09(土) 14:38:20
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/689.lzh
ファイル分割の勉強を始めたのですが、エラーが出てしまって動きません。

エラー:未解決の外部シンボル_maxが関数_mainで参照されました

本見ながらだから間違えてはないはずなんですけど・・・
286デフォルトの名無しさん:2005/07/09(土) 14:41:51
mystrndupというのがでてきたので検索してみたのですが
説明が見当たりません
わかるかたいましたら説明していただけないでしょうか?
287デフォルトの名無しさん:2005/07/09(土) 14:44:35
Makefile?
288285:2005/07/09(土) 15:14:35
事故解決しますた
289デフォルトの名無しさん:2005/07/09(土) 15:15:14
示談キター
290日本道路公団:2005/07/09(土) 15:15:22
複数ファイルのコンパイル、リンクの仕方教えてください。
LSI C-86 v3.30c 試食版を使ってます。この説明書みたいのには
載ってませんでした。
291デフォルトの名無しさん:2005/07/09(土) 15:25:16
>>290
makeの使い方でも見れ
292日本道路公団:2005/07/09(土) 15:32:03
makeとは?
293デフォルトの名無しさん:2005/07/09(土) 15:33:44
>>292
説明書読め
294日本道路公団:2005/07/09(土) 15:40:27
書いてねーよw
295デフォルトの名無しさん:2005/07/09(土) 15:46:06
>>294
はいはい。こちらでどーぞ
http://pc8.2ch.net/test/read.cgi/tech/1119793525/l50
296デフォルトの名無しさん:2005/07/09(土) 15:47:44
日本道路公団って喧嘩売ってる名前だなw
297日本道路公団:2005/07/09(土) 15:48:48
てか悪いけど俺典型的な量産型厨房で自分で探すとか無理なんだ。そのスレのどこらへんですか
298286:2005/07/09(土) 15:49:23
わかるかたいませんでしょうか?
299デフォルトの名無しさん:2005/07/09(土) 15:50:07
>>294
ちゃんとLSIC86.MANに書かれてある
300デフォルトの名無しさん:2005/07/09(土) 15:50:08
>>297
そこでふたたび聞けってことじゃないの?
301デフォルトの名無しさん:2005/07/09(土) 15:50:59
まぁNGワード登録できるだけ良心的だな。
302デフォルトの名無しさん:2005/07/09(土) 15:51:43
>>286 ググればいくつかでてきたけど。ほんとに検索したの?
303デフォルトの名無しさん:2005/07/09(土) 15:51:54
>>290
lcc a.c b.cでできないのか?
304デフォルトの名無しさん:2005/07/09(土) 15:52:46
>>302
してたらこんな質問してないよ。
まー釣られて楽しもうでは内科医。
305日本道路公団:2005/07/09(土) 15:54:06
>>299 教えてくれてありがたいんだけど、俺のフォルダ拡張子とかでめちゃくちゃで
よくわかんねーや。>>303詳しく
306デフォルトの名無しさん:2005/07/09(土) 15:57:59
>>305
断る
307日本道路公団:2005/07/09(土) 16:00:17
>>306 そこをなんとか。意地悪しないで。これわかんないと先進めない。
308デフォルトの名無しさん:2005/07/09(土) 16:00:41
>>286
strndupで探してみろ
309デフォルトの名無しさん:2005/07/09(土) 16:01:42
>>307
こちらは十分情報を与えた
意地悪なんてしていない
310デフォルトの名無しさん:2005/07/09(土) 16:02:19
>>305
そもそも単一ファイルでもコンパイルできてねーだろ。
311日本道路公団:2005/07/09(土) 16:02:26
>>309 兄さんお願いします
312デフォルトの名無しさん:2005/07/09(土) 16:02:58
>>307
ここでしつもんするのはスレちがいだから、いかのスレッドでしつもんしてね
http://pc8.2ch.net/test/read.cgi/tech/1119793525/l50
313日本道路公団:2005/07/09(土) 16:06:55
例えば
Sample1.h・・・関数プロトタイプ宣言
Sample2.c・・・関数の定義
Sample3.c・・・プログラム本体
だったら
lcc Sample1.Sample3 Sample2.Sample3 ってこと?
314デフォルトの名無しさん:2005/07/09(土) 16:09:46
>>313
lcc Sample2.c Sample3.c
315デフォルトの名無しさん:2005/07/09(土) 16:11:57
.hのファイルは.c内にインクルードするの
316デフォルトの名無しさん:2005/07/09(土) 16:14:19
>>313
ソースファイルに 
#include   <con.h>
#include   <nul.h>
が必要
317日本道路公団:2005/07/09(土) 16:15:21
>>314さん ありがとうございます。
今からポインタです。ここがやっかいと聞きました。
ここでつまづいたら煮るなり焼くなりしてください。
318デフォルトの名無しさん:2005/07/09(土) 16:22:14
調査能力に問題ありだな
319デフォルトの名無しさん:2005/07/09(土) 16:32:46
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
int test = 9;
char a[256], b[256];

itoa( test, b, 10 );

if ( test < 10 )sprintf( a, "0%s" ,b );// 1
else strcpy( a, b );//

( test < 10 ) ? sprintf( a, "0%s" ,b ):// 2 (※)
strcpy( a, b );//
printf( a );
}

2 の部分でエラーが出るのはどうしてですか?
ほぼ同じ処理をしているはずだと思っていたのですが。
戻り値の問題かなぁ、と思って、strcpy( a, b ),0; としてみても、結果は同じでした。
コンパイラはVC6.0です。
320デフォルトの名無しさん:2005/07/09(土) 16:33:13
>>290=日本道路公団
もう来なくていいよ。
321デフォルトの名無しさん:2005/07/09(土) 16:34:36
>>319
> エラーが出る

ならエラーメッセージくらい貼れ。
322デフォルトの名無しさん:2005/07/09(土) 16:35:51
>>319
sprintf( a, "%02d", test );
323デフォルトの名無しさん:2005/07/09(土) 16:39:56
>>322
やべっ・・・この時間馬鹿しかいないみたい・・・問題はそこじゃねーだろが

一応エラーメッセージは張っとくけどさ・・・
つchar *' 型から 'int' 型への変換ができません。
324デフォルトの名無しさん:2005/07/09(土) 16:41:00
この時間の質問者は(略
325デフォルトの名無しさん:2005/07/09(土) 16:42:22
ま、教えてやっている奴の意図は、狭量な質問者には伝わらん罠
326デフォルトの名無しさん:2005/07/09(土) 16:43:33
stdio.hってスタジオ・エッチって読むんですよね?
中黒の発音がポイントって聞いたんですが…?
327デフォルトの名無しさん:2005/07/09(土) 16:43:37
>>323
ヒント:char *strcpy( char *, const char * );
328デフォルトの名無しさん:2005/07/09(土) 16:44:58
>>319
正直、何をしたいのかわからない。
329デフォルトの名無しさん:2005/07/09(土) 16:45:04
>>326
はい。そのとおりです。
330デフォルトの名無しさん:2005/07/09(土) 16:45:32
>>326
正しくはストゥディオ・ドット・エッチだ
331デフォルトの名無しさん:2005/07/09(土) 16:45:46
>>328
釣り餌ですからねw
332デフォルトの名無しさん:2005/07/09(土) 16:46:17
質問です。

reallocでメモリ割り当てサイズを縮小した場合、割り当てエリアの再配置(移動)が発生しないという保障はありますか?
333デフォルトの名無しさん:2005/07/09(土) 16:46:40
>>332
ない
334デフォルトの名無しさん:2005/07/09(土) 16:46:52
if ( test < 10 ) sprintf( a, "%02d", test );
else sprintf( a, "%2d", test );

こうしとけと言いたいんだろうけど、俺が聞きたいのはそこじゃないっすよ。
>>319
これで読み取れないんなら邪魔なレスしてんじゃねぇよw
335デフォルトの名無しさん:2005/07/09(土) 16:46:56
あは〜んアハ〜ン
336デフォルトの名無しさん:2005/07/09(土) 16:47:25
>>333
そうですか。ありがとうございました。
337デフォルトの名無しさん:2005/07/09(土) 16:48:04
あせって自分にレスしてらっしゃるw
338デフォルトの名無しさん:2005/07/09(土) 16:49:04
もうちょっとマシなコードが見たいなぁ。
339デフォルトの名無しさん:2005/07/09(土) 16:49:19
>>337>>319 で読み取れない一人だったそうな・・・
340デフォルトの名無しさん:2005/07/09(土) 16:50:04
>char *' 型から 'int' 型への変換ができません。
これで読み取れないんなら邪魔なレスしてんじゃねぇよw
341デフォルトの名無しさん:2005/07/09(土) 16:50:05
>>339 えっ?
342デフォルトの名無しさん:2005/07/09(土) 16:50:40
>>338
いや、コードとかの問題じゃなくてさ、
俺が聞きたいなんでの部分に答えれているやつはいないみたいだけど?

ほんっっっと失敗した^^
最近煽るだけのやつが多いのな
343デフォルトの名無しさん:2005/07/09(土) 16:51:26
正解を提示してみてください
あなたあおりながら、画面の前でハテナが浮かんでますよ
344デフォルトの名無しさん:2005/07/09(土) 16:52:24
あ、あんたに言ったつもりではなくスレッドを読み流して
思っただけだったのでキニスンナw
345デフォルトの名無しさん:2005/07/09(土) 16:52:37
>>319 >>323 >>334 >>339 >>340 >>342 >>343
そんな横暴な聞き方じゃ答えてもらえないっすよ
必死になるだけ無駄
346デフォルトの名無しさん:2005/07/09(土) 16:54:01
横暴になっているのも馬鹿が多いと判断したからです。
>>319 >>323 >>334 >>339 >>340 >>342 >>343
こんなアンカーならべる暇人にまともな回答期待しちゃいねぇよw
もうここで正解きくの諦めてる状態だから^^
347デフォルトの名無しさん:2005/07/09(土) 16:55:44
ボク、今は煽ってるだけです〜
てこと?
348デフォルトの名無しさん:2005/07/09(土) 16:55:48
>>346
ぼくはもとから回答する気はありませんよ
ただ他の良心的な方々からも答えてもらえませんよ?ってこと
349デフォルトの名無しさん:2005/07/09(土) 16:58:57
みてみてー、コンパイルできたよー

( test < 10 ) ? sprintf( a, "0%s" ,b ) : 0,strcpy( a, b );
350デフォルトの名無しさん:2005/07/09(土) 16:59:49
>>346
どうして三項演算子について調べようとしない?
351デフォルトの名無しさん:2005/07/09(土) 17:00:16
>>349
うほっ
352デフォルトの名無しさん:2005/07/09(土) 17:01:32
誰も答えられないのか・・・
このスレアホの巣窟だな
353デフォルトの名無しさん:2005/07/09(土) 17:02:04
>>319
? : の条件演算子は真のときと偽のときとで式の型が一致している必要がある。
なぜならを条件演算子は演算子だから結果を出す必要があるため。
たとえばこんなこともできる。
int n;
n = test < 10 ? 0 : 10;
sprintfはint、strcpyはchar *を返すので型を合わせようにも変換できないのでエラーになる。
354デフォルトの名無しさん:2005/07/09(土) 17:02:31
あほがあほにあほって
355デフォルトの名無しさん:2005/07/09(土) 17:03:41
356日本道路公団:2005/07/09(土) 17:04:36
アドレスという言葉があるんだな
357デフォルトの名無しさん:2005/07/09(土) 17:04:39
空気嫁よ…
358デフォルトの名無しさん:2005/07/09(土) 17:05:41
>>356
お前はいちいち学習内容を報告しに来る気かw
359デフォルトの名無しさん:2005/07/09(土) 17:08:49
360デフォルトの名無しさん:2005/07/09(土) 17:11:05
Cのコード最低30万行は書いてないとこのスレで答える資格はないと思うよ。
ちょっとレベル低すぎ。
361日本道路公団:2005/07/09(土) 17:11:30
int型へのポインタpA 意味わかんね
362デフォルトの名無しさん:2005/07/09(土) 17:12:05
>>319 は、これまで書いてきた行数には関係ないと思うけどなw
363デフォルトの名無しさん:2005/07/09(土) 17:16:28
>>319
> 戻り値の問題かなぁ、と思って、strcpy( a, b ),0; としてみても、結果は同じでした。

?: と , の優先順位。
364デフォルトの名無しさん:2005/07/09(土) 17:20:34
だらだららだだら づぁららららだあらあらら

これな〜んだ?
365デフォルトの名無しさん:2005/07/09(土) 17:22:14
つまんね
366デフォルトの名無しさん:2005/07/09(土) 17:24:07
>>360
30万行書いてもヘボいやつはヘボいぞ。








漏れや藻前みたいにな。
367デフォルトの名無しさん:2005/07/09(土) 17:26:05
これでいいだろ。
test < 10 ? (void)sprintf(a, "0%s", b) : (void)strcpy(a, b);
368デフォルトの名無しさん:2005/07/09(土) 17:26:08
だめなやつはいくらやってもダメ?
369デフォルトの名無しさん:2005/07/09(土) 17:26:35
行数で語る奴ってどーなのかね。皆までは言わないが。
370デフォルトの名無しさん:2005/07/09(土) 17:28:12
そういう奴に限って、グローバル変数100行、関数内フラグ30行、関数500行とかなw
371日本道路公団:2005/07/09(土) 17:30:13
30万行作るのにどれくらいかかるの?
372デフォルトの名無しさん:2005/07/09(土) 17:31:34
int i=0;
i = (i==0) ? printf("1:%d\n",i),printf("2:%d\n",i): printf("dummy");
printf("3:%d",i);

これの printf("2:%d\n",i) が 4 にならないのはどうしてですか?
faq ですか?
373デフォルトの名無しさん:2005/07/09(土) 17:32:23
>>371
人月が?
374デフォルトの名無しさん:2005/07/09(土) 17:35:58
>>372
環境は?
375デフォルトの名無しさん:2005/07/09(土) 17:36:03
>>372
なんで4になると思ったの?
376デフォルトの名無しさん:2005/07/09(土) 17:41:49
>>363
>>367
>>>353
ありがとうございました
377デフォルトの名無しさん:2005/07/09(土) 17:45:06
strndup と言う関数がどこにも見付からないのですが
どのヘッダに入っているのでしょうか?
string.h にもなかったです
378デフォルトの名無しさん:2005/07/09(土) 17:48:51
そういうインチキ関数は使わない方がいい
379デフォルトの名無しさん:2005/07/09(土) 17:53:09
すいません
自分で作った方が早いですね
お手数をお掛けしました
380デフォルトの名無しさん:2005/07/09(土) 18:11:41
まあ信頼がおけるなら使ってもいいけどね
381日本道路公団:2005/07/09(土) 18:46:20
ポインタむずい
382デフォルトの名無しさん:2005/07/09(土) 19:37:14
ポインタ自体は難しくもなんともない。
Cのポインタがいろいろと面倒なだけ。
383デフォルトの名無しさん:2005/07/09(土) 19:58:28
リストから削除する、関数del_listを作成する。
という事なのですが、実行できたものの削除したと出たのに
実際削除されませんでした。★で囲まれてる場所があやしいので
もしよろしければ、ご教授お願いします。

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

typedef struct list{
char name[100];
struct list *next;//自己参照構造体
}NODE;
void list_out(NODE *);
void add_list(NODE);//リストの登録
NODE *del_list(NODE);//リストの削除
NODE *head;//先頭ポインタ

void main(void)
{
NODE adddata;
NODE deldata,*p;

printf("***文字列の昇順に登録***\n");
printf("文字列入力 (CTRL+Zで終了)\n");
384デフォルトの名無しさん:2005/07/09(土) 19:59:05
Display *display;
と言う変数があるのですが
これを違う関数にわたし、その関数で変更したら元の関数でも変更されているように渡したいのですが
どういうふうに渡したらいいのでしょうか?
違う関数での受け方も教えていただけるとうれしいです
385デフォルトの名無しさん:2005/07/09(土) 19:59:30
head = NULL;
while(printf("->"),gets(adddata.name) !=NULL){
add_list(adddata);
}
printf("***リストの削除***\n");
list_out(head);

printf("\n*** リストの削除 ***\n");
printf("削除文字列入力\n");
while(printf("->"),gets(deldata.name) !=NULL){
if((★p=del_list(deldata)★) ==NULL)
printf("未発見\n");
else
printf("%p番地のノードを削除\n",p);
}
printf("***リストの内容***\n");
list_out(head);
}
void list_out(NODE *p)
{
while(p != NULL){
printf("%p番地:%s\n",p,p->name);
p=p->next;
386デフォルトの名無しさん:2005/07/09(土) 19:59:56
}
/*ポイントのつなぎ替え*/
new->next= p;
back->next=new;
}
}
NODE *del_list(NODE deldata)
{
NODE *p,*back;

if★(head == NULL)★return NULL;//リストが空なら、NULLを戻す
if★(strcmp(deldata.name,head->name)){★//リストの先頭なら
/*ポインタのつなぎ換え*/
back = head;
★head = head->next;★
return ★head;★
}
else{
p=head;//削除するノードを探す
while(★p != NULL && strcmp(deldata.name,p->name) >= 0★){
back=p;
p=p->next;
}
/*pポインタの繋ぎ換え*/
if(p != NULL)★head->next= p;★
return p;
}
}
387デフォルトの名無しさん:2005/07/09(土) 20:19:44
for(i = 1; i <= 5; i++){
sleep(10);
kill(pid[i], SIGTERM);
waitpid(pid[i], &status, 0);
}
これだと10秒毎にpid[i]が終了されるのですが,
10秒でpid[1]からpid[5]を一度に終わらせるにはどうすればいいのでしょうか?
vine linuxで gccです
388デフォルトの名無しさん:2005/07/09(土) 20:20:44
あの、ちょっといいでしょうか。最近Cはじめたのですが関数のとこになり少し疑問が生じたので質問させて頂きます。
ある本には最初にmain関数がありその下にint date(int x)とありますが、ある本には
int date(int x)の下にmain関数があります。プログラムは答えが出れば正解らしいですが
一般的にはmain関数は上にあるのでしょうか、下にあるのでしょうか。
389デフォルトの名無しさん:2005/07/09(土) 20:21:19
sleep(10);
for(i = 1; i <= 5; i++){
kill(pid[i], SIGTERM);
waitpid(pid[i], &status, 0);
}
390デフォルトの名無しさん:2005/07/09(土) 20:23:06
>>388
下じゃないとプロトタイプ宣言がひつよう
上に書く場合でもプロトタイプ宣言がその上に必要
391デフォルトの名無しさん:2005/07/09(土) 20:24:40
>>388
ベテランは下に書く。
392デフォルトの名無しさん:2005/07/09(土) 20:25:45
>>388
関数を書く順番は任意。好きにすればいい。
ただし、関数を呼び出すためにはその関数のプロトタイプを知る必要がある。
関数コールするよりも前(上)に関数定義があれば、その定義から関数仕様は明確になるが、
関数コールよりも後(下)に関数定義がある場合、その関数が見えていないので、引数や戻り値の方が不明になる。
こういう場合は、関数コールする位置よりも前にプロトタイプ宣言を書けば、コールできる。
393デフォルトの名無しさん:2005/07/09(土) 20:27:53
Cコンパイルは前方参照だからね。
394384:2005/07/09(土) 20:31:03
わかるかたいませんでしょうか?
395デフォルトの名無しさん:2005/07/09(土) 20:32:14
ポインタ渡しすればいいだろ。
396デフォルトの名無しさん:2005/07/09(土) 20:32:58
>>384
Cではできない。
397デフォルトの名無しさん:2005/07/09(土) 20:40:42
>>389
ちょっと変えるだけでよかったんですねorz
ありがとうございました。
398384:2005/07/09(土) 20:56:51
>>396
根本的にできないんですか・・・
では、みなさんはこのようなときどうしてるんですかね?
399デフォルトの名無しさん:2005/07/09(土) 21:03:45
>>384
Display *display の指している先の構造体かなんかの中身を書き換えることは出来るが、
displayの値そのものを書き換えることは出来ない。
400デフォルトの名無しさん:2005/07/09(土) 21:04:50
>>834
ポインタのポインタじゃだめ?
401デフォルトの名無しさん:2005/07/09(土) 21:10:48
>>390〜392 ありがとうございます。392さんの言う事は少しだけわからないとこありますが、
(すみません。もっと勉強します。)にベテランじゃないので上書くことにしておきます。

!!!
愛用の本である解きながら学ぶC言語という本はベテラン志向でした。。
まあ両方ともやってみますね。本当にありがとうございました。
402デフォルトの名無しさん:2005/07/09(土) 21:12:39
プロトタイプ宣言が無かった頃の(ry
403384:2005/07/09(土) 21:16:56
ありがとうございます
Display型はWindowのポインタを入れる型です

void hoge(Display *display){
display = XOpenDisplay( NULL);
}

main(){
Display *display;
hoge( display);
}

だと、hogeで格納してもmainにかえってきたときに変更されていません
404デフォルトの名無しさん:2005/07/09(土) 21:20:56
>>403
素直に

Display *hoge() {
return XOpenDisplay(NULL);
}

main() {
 Display *display = hoge();
}

じゃ駄目なんか?
405デフォルトの名無しさん:2005/07/09(土) 21:22:29
ポインタを入れる型へのポインタを使って渡せ。
406384:2005/07/09(土) 21:22:56
>>404
ありがとうございます

ここにかかさせていただくので実際の処理は省いたのですが
hogeの中では他にもいろいろな処理をしています
407デフォルトの名無しさん:2005/07/09(土) 21:24:14
>>406
Display *hoge() {

  //他の処理いろいろ


return XOpenDisplay(NULL);
}

main() {
 Display *display = hoge();
}
408デフォルトの名無しさん:2005/07/09(土) 21:25:17
もとい、こうか。

Display *hoge() {

Display * pDsp = XOpenDisplay(NULL);

  //他の処理いろいろ


return pDsp;
}

main() {
 Display *display = hoge();
}
409デフォルトの名無しさん:2005/07/09(土) 21:26:32
void hoge(Display **display) {
 Display *d = *display;
 // いろいろ処理
}

main() {
 Display *display;
 hoge(&display);
}
410409:2005/07/09(土) 21:27:45
上、ちと失敗。
void hoge(Display **display) {
 Display *d = *display;
d = XOpenDisplay(NULL);
 // いろいろ処理
}

main() {
 Display *display;
 hoge(&display);
}
411デフォルトの名無しさん:2005/07/09(土) 21:30:55
>>410
ローカル変数いらないジャン
412デフォルトの名無しさん:2005/07/09(土) 21:39:24
それじゃできないでしょ
413デフォルトの名無しさん:2005/07/09(土) 21:49:25
だから初心者は回答するなと……

>>410
* display = XOpenDisplay(NULL);
414デフォルトの名無しさん:2005/07/09(土) 21:50:01
どうでもよいけど
char hoge[256];
while(gets(hoge) !=NULL); が無限ループになっちゃうのは自分の環境の所為nano?
415デフォルトの名無しさん:2005/07/09(土) 21:51:38
while(fgets(hoge,stdin) !=NULL);
にしとけ
416デフォルトの名無しさん:2005/07/09(土) 21:51:47
本当にどうでもいいな
417デフォルトの名無しさん:2005/07/09(土) 21:52:05
while(fgets(hoge,sizeof(hoge),stdin) !=NULL);
だった
418デフォルトの名無しさん:2005/07/09(土) 21:54:40
>>417
無限ループになったと判断した根拠は?
ただ単に、入力を終えたつもりになっているだけなら以下の点について調べよ。

・リダイレクトでファイルを入力しても無限ループになるか。
・端末エミュレータで入力のクローズは行なえているのか。
#一般的にUnixなら^D、DOS系なら^Z
419384:2005/07/09(土) 21:57:09
みなさまありがとうございます
どれをやってもうまくいかないです・・・
420414:2005/07/09(土) 22:04:16
Enter押したら終わるって思い込んでた・・~Z で終えてくれまひた
レベル低い自分はスルーで、以下何事もなかったかのように(ry
421デフォルトの名無しさん:2005/07/09(土) 22:33:07
>>419
void f(Display **);
f(&display);
こうでもだめか?
422デフォルトの名無しさん:2005/07/09(土) 22:36:24
渡す渡せないの問題じゃないんじゃねーの?
他のとこでミスってるとか、ミスってると思い込んでいるとか。
423デフォルトの名無しさん:2005/07/09(土) 22:38:42
こう書けたらいいっていうような脳内拡張Cのコードでも書いてくれれば伝わりやすいかもね>384
424デフォルトの名無しさん:2005/07/09(土) 22:38:57
いきなり質問してもいいですか?
425384:2005/07/09(土) 22:39:41
void hoge(Display *display){
printf("%p\n", display);
display = XOpenDisplay( NULL);
printf("%p\n", display);
}

main(){
Display *display;
printf("%p\n", display);
hoge( display);
printf("%p\n", display);
}

とこのようにして、中身を確認しているのですが
display = XOpenDisplay( NULL);
の、後と前では変わるのですが hoge( display);の後ではまたもどっています

今まで教えていただいた方法を使ってやってみたのですが
変わるものはありませんでした

>>421
すいませんが、それをどうすればいいかがわかりません
どうすればいいのでしょうか?
426デフォルトの名無しさん:2005/07/09(土) 22:40:06
>>424
すでに質問されたからイイよ
427デフォルトの名無しさん:2005/07/09(土) 22:41:42
>>425
引数で渡さなくて、戻り値で返せばいい。
428デフォルトの名無しさん:2005/07/09(土) 22:43:19
すんません。板違いだったらごめんなさい
「C/C++ Users Journal」って年間購読とは別に一冊買えるようなとこってないんですかね?
429デフォルトの名無しさん:2005/07/09(土) 22:45:45
>>428
ない
あきらめれ
430デフォルトの名無しさん:2005/07/09(土) 22:46:47
>>492
どうもです。
431デフォルトの名無しさん:2005/07/09(土) 22:47:20
>>429
ごめんなさい。 >>492は429の間違い
432デフォルトの名無しさん:2005/07/09(土) 22:48:26
>>425
これで確認できたよ(>>421の方法)
--------------------------------------
struct Display{
 int x;
};

void f(Display** display)
{
 *display = new Display;
 (*display)->x = 10;
}

int main(int argc, char* argv[])
{
 Display* display = NULL;
 f(&display);

 if(display){
  printf("D:%d\n",display->x);
 }
 return 0;
}

433デフォルトの名無しさん:2005/07/09(土) 22:49:55
こっちの方が、使いやすいと思うけどな。
Display* hoge(void){
  Display *pDisp;
  printf("%p\n", display); 
  pDisp = XOpenDisplay( NULL); 
  printf("%p\n", display);
  return pDisp;


main(){ 
  Display *display; 
  printf("%p\n", display); 
  display = hoge(); 
  printf("%p\n", display); 

434デフォルトの名無しさん:2005/07/09(土) 22:52:51
>>425
intをDisplay *に読み替えれば425のコードと同じようなもんだ。
void f(int n)
{
  n = 10;
}

int main()
{
  int n = 0;
  f(n);
  printf("%d", n);
  return 0;
}
435デフォルトの名無しさん:2005/07/09(土) 22:54:12
ぉぃ
436デフォルトの名無しさん:2005/07/09(土) 23:26:20
>>435
何だよ負け犬(w
437デフォルトの名無しさん:2005/07/09(土) 23:32:20
だだすだすだだ だだすだすだだ

これな〜んだ?
438デフォルトの名無しさん:2005/07/09(土) 23:51:28
1101011 1101011
439デフォルトの名無しさん:2005/07/10(日) 01:08:57
ううまま うままう うまう うままう?
440デフォルトの名無しさん:2005/07/10(日) 01:32:18
ああんあんああ ああんあんああ
441384:2005/07/10(日) 01:36:33
みなさまありがとうございます
returnで返す方法以外はありませんでしょうか?
別の値を返すのにreturnは使っているのでできれば使いたくありません
442デフォルトの名無しさん:2005/07/10(日) 01:44:41
>>441
関数内でポインタに入れればよくね?
443デフォルトの名無しさん:2005/07/10(日) 01:47:39
Display **display;
って何個か前のは読めなかったのか?
444デフォルトの名無しさん:2005/07/10(日) 02:14:07
>>441
氏ね、バカ。
>>432がわざわざコードにまで起こしてくれてるだろうが。
自分で考える能力が無いならせめてレスくらいちゃんと確認しろ。
445デフォルトの名無しさん:2005/07/10(日) 02:38:58
>>441
最初からそういえよ。情報小出しはこっとも嫌われると言うことを理解したら、もううくるな。
446デフォルトの名無しさん:2005/07/10(日) 02:41:37
#include<stdio.h>
#define NINZU 10
#define KAMOKU 5

struct student
{
char name[8];
int en,ma,la,sc,so;
int sum,mean,max;
};

sub_sum(int n,struct student d[])
{
int i;

for(i=0;i<n;i++){
d[i].sum=d[i].en+d[i].ma+d[i].la+d[i].sc+d[i].so;
d[i].mean=d[i].sum/KAMOKU;

d[i].max=d[i].en;
if(d[i].max<d[i].ma) d[i].max=d[i].ma;
if(d[i].max<d[i].la) d[i].max=d[i].la;
if(d[i].max<d[i].sc) d[i].max=d[i].sc;
if(d[i].max<d[i].so) d[i].max=d[i].so;
}
}
447デフォルトの名無しさん:2005/07/10(日) 02:41:56
↑の続き

main()
{
int i;

struct student data[NINZU];

FILE *fp;

fp=fopen("seiseki.txt","r");
for(i=0;i<NINZU;i++)
fscanf(fp,"%s %d %d %d %d %d",
&data[i].name,&data[i].en,&data[i].ma,&data[i].la,&data[i].sc,&data

[i].so);
fclose(fp);

sub_sum(NINZU,data);

for(i=0;i<NINZU;i++)
printf("(%d) %-3s 総点:%d 平均点:%d 最高点:%d\n",
i,data[i].name,data[i].sum,data[i].mean,data[i].max);
}

上記のプログラムを、科目ごとの総点・平均点・最高点も
求めれるように改造したいのですが、どうしたら良いでしょうか?
448デフォルトの名無しさん:2005/07/10(日) 02:42:22
↑の追記。
ちなみに「seiseki.txt」の中身は下記の通り。

A 70 56 66 45 88
B 66 85 68 55 73
C 55 65 53 67 55
D 85 72 76 58 65
E 92 70 45 73 55
F 56 57 52 62 82
G 72 62 33 85 95
H 46 95 48 72 34
I 83 42 88 92 56
J 68 65 91 82 66
449デフォルトの名無しさん:2005/07/10(日) 02:46:48
宿題スレは無くなったのか?
450384:2005/07/10(日) 02:52:14
わからないんだったらレスしないで
451384:2005/07/10(日) 02:52:50
ここはおまえらの家じゃねぇ
気にくわないんだったらお前が来るな
452デフォルトの名無しさん:2005/07/10(日) 03:04:29
こういうのが一番ウザい、愚痴まで小出しにしやがる。
一生小出しでふんばってろ教えて君。
453デフォルトの名無しさん:2005/07/10(日) 03:07:24
死ね糞
454デフォルトの名無しさん:2005/07/10(日) 04:47:14
どなたか教えてください。
Cで数値計算をしているのですが、2台のパソコンで
同じプログラムを走らせたところ
 パソコンA:最後まで計算できるが、gdbである変数を
        printコマンドで見ようとするとセグメントエラー
 パソコンB:特定の場所でセグメントエラー、挙動もおかしい
        その場所は、ある関数内で、
        {
        計算
         printf("計算結果");
          printf("バグ取り");
        }
        このprintとfprintfの間でセグメントエラーを吐きます。
        しかも「計算結果」を表示した後、2秒位たって、「バグ取り」を
        表示せずに落ちてしまいます。
まったく原因が分からず困っています。よろしくお願いします。
455デフォルトの名無しさん:2005/07/10(日) 04:51:20
>>454
ここはそういう質問をするスレじゃないんだ
456デフォルトの名無しさん:2005/07/10(日) 04:56:54
最近はキレやすい子供が多いらしいからな・・・
近い将来は大人まで・・・
457デフォルトの名無しさん:2005/07/10(日) 05:45:21
>454
とりあえずどっかのメモリを破壊してる可能性が高い。
458デフォルトの名無しさん:2005/07/10(日) 06:03:39
windowsならめもりくり〜なあたりを行使してみ
459デフォルトの名無しさん:2005/07/10(日) 06:05:49
だから初心者は回答するなと……
460デフォルトの名無しさん:2005/07/10(日) 06:11:41
どこからネタなのかわからなくてつい…
461454:2005/07/10(日) 12:24:04
>>457,458
やっぱりそうですか。
もう一度、メモリ破壊を疑ってデバッグしてみます。
ありがとうございました。
462デフォルトの名無しさん:2005/07/10(日) 12:40:43
printf挟むと挙動が変わるのはスタック破壊の可能性が高い
463454:2005/07/10(日) 12:53:38
>>462
printfとprintfの間の2秒間も、スタック破壊が
原因でしょうか?
464デフォルトの名無しさん:2005/07/10(日) 13:06:21
C言語の開設HPを見てて、
#include <stdio.h>


void main()
{
  int   val;

  val = 5;

  printf( "今、変数の中身は、%dです\n", val );

  val = val + 1;

  printf( "今、変数の中身は、%dです\n", val );

  val ++;

  printf( "今、変数の中身は、%dです\n", val );
}
というプログラムを組んでコンパイルしたのですが、
エラー E2048 test_3.c 1: 認識できないプリプロセッサ指令: 'inclube'
警告 W8065 test_3.c 9: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
警告 W8065 test_3.c 13: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
警告 W8065 test_3.c 17: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main
)
*** 1 errors in Compile ***
というエラーが出ます、どこがおかしいのでしょうか?
465デフォルトの名無しさん:2005/07/10(日) 13:08:44

  printf( "今、変数の中身は、%dです\n", val );

  val = val + 1;

  printf( "今、変数の中身は、%dです\n", val );
466デフォルトの名無しさん:2005/07/10(日) 13:11:27
>#include <stdio.h>
>エラー E2048 test_3.c 1: 認識できないプリプロセッサ指令: 'inclube'
(・3・) エェー
467デフォルトの名無しさん:2005/07/10(日) 13:11:36
>>464
inclube
468464:2005/07/10(日) 13:15:08
馬鹿なミスでした。
すいませんでした。
469デフォルトの名無しさん:2005/07/10(日) 13:15:19
いくるぅーべ
470デフォルトの名無しさん:2005/07/10(日) 13:16:51
>>469
煽ってんじゃねえよクソッタレ!
471デフォルトの名無しさん:2005/07/10(日) 13:21:05
煽ってんじゃねえよクソッタレ!
472デフォルトの名無しさん:2005/07/10(日) 14:03:21
餅ついていこうよクソッタレ!
473デフォルトの名無しさん:2005/07/10(日) 14:25:27
>>1-1001
くせぇな
屁こいてんじゃねえぞコラ!
474デフォルトの名無しさん:2005/07/10(日) 16:01:49
count1とcount2という2つをint型で定義して、
1秒ごとにsleepでカウントしていって、
count1とcount2が両方10になったら終了する。という
ソースを作りたいのですが、


for( count1=1; ; count1++){
for( count2=1; ★;count2++){
sleep( 1 );

printf("count1=%d\n", count1);
printf("count2=%d\n", count2);
}
if( count1==10 && count2==10){
break;
}


という風に、for2重ループで作ってみたのですが、
この場合は★になんと宣言したらいいでしょうか?
forループの2重目は毎回脱出する…という風にしたいのです。
よろしくお願いします。
475デフォルトの名無しさん:2005/07/10(日) 16:03:53
なにがしたいのか意味不明だな。
476デフォルトの名無しさん:2005/07/10(日) 16:13:30
>>474
毎回抜けたいなら、0 を書くといい
477474:2005/07/10(日) 16:17:38
>476
ありがとうございます!
毎回脱出は0なんですね…知らなかった…
478デフォルトの名無しさん:2005/07/10(日) 16:35:08
>>477
ねぇねぇ、おかしいと思わない?
479デフォルトの名無しさん:2005/07/10(日) 16:39:04
毎回ぬけたら、count2は永遠に10にならない悪寒。
480デフォルトの名無しさん:2005/07/10(日) 16:40:34
>>478
叙述トリック
481デフォルトの名無しさん:2005/07/10(日) 16:55:15
ソフトバンク社の明解C言語の80P〜81Pにある演習4−17と演習4−18の問題の解答が分かりません・・・。
よろしくお願いします。
482デフォルトの名無しさん:2005/07/10(日) 17:01:30
>>481
ちゃんとその本読んで、明解に解けるようにせれ。
そうでもなければ冥界送り。

というか、そんな本持ってる人限定で質問する時点で冥界だ。
483デフォルトの名無しさん:2005/07/10(日) 20:01:13
以前、この板のどこかのスレで
for (int i=0 ; i<strlen(str) ; i++ )
文字列 str の長さを変えない処理;
という書き方は、一般的には毎回 strlen を呼ぶので遅いが、
どこぞの処理系では一度しか呼ばないように最適化する、という
話があったようななかったような気がするんですが、どなたか
ご存知でしょうか。
484デフォルトの名無しさん:2005/07/10(日) 20:08:56
すれ違い

485デフォルトの名無しさん:2005/07/10(日) 20:10:12
どのスレがいいの?
486デフォルトの名無しさん:2005/07/10(日) 20:12:08
>>483
今手元のgcc(3.3.3 cygwin special)で試したら、strが固定長であることが明らかなときのみstrlen()が省略された。
つまり、
int main()
{
int i;
char str[] = "Whee!";
for (i = 0; i < strlen(str); ++i) {
printf("%c", str[i]);
}
return 0;
}
のような場合。
しかし、char *str = argv[0]; としたら毎回strlen()を呼び出していた。
487デフォルトの名無しさん:2005/07/10(日) 20:14:06
>>485
このスレッドの名前を読んでみ
「忘れた会話を思い出すための質問スレッド」
ってかいてあっか?
488デフォルトの名無しさん:2005/07/10(日) 20:15:37
ワロタ
489483:2005/07/10(日) 20:19:01
お前馬鹿だろ。知らないなら黙ってろ。何か書きたけりゃ
 「忘れた会話を思い出すための質問スレッド」
を立ててからにしろ。な?

>>486
ありがとう。さらに調べてみたら、gcc-3.3.3 で -O つければ
argv でも strlen は呼ばず、自前で 0 かどうかの比較だけやってた。
-fno-builtin を付けたら strlen 呼んでくれたよ。

gcc がそういう処理系だったんだね。
490デフォルトの名無しさん:2005/07/10(日) 20:20:40
残念ながらあほだな
491デフォルトの名無しさん:2005/07/10(日) 20:22:29
ここまでカスなやつってなかなかいないよね
現実じゃ、ものすっごい下手でさ
そんなやつでもこんな発言んができるって恐いね
492483:2005/07/10(日) 20:25:23
もう解決したから帰っていいよ。
今度来るときは句点打てるようになってるんだぞ。
493デフォルトの名無しさん:2005/07/10(日) 20:26:10
この手の質問も答えてくれる人いるんだし、
それくらいの寛大さと融通は効いても毒ではないだろう。
逆に噛み付いて荒れるよりは遥かにいい。
494デフォルトの名無しさん:2005/07/10(日) 20:26:52
区点がうててないのは>>483だと思うけどな
495デフォルトの名無しさん:2005/07/10(日) 20:27:39
あからさまに >>489 の区点のほうがひどく感じるのだがw
496デフォルトの名無しさん:2005/07/10(日) 20:28:21
日本語が明らかにおかしい奴はいるが、
日本語を指摘を捨て台詞にする奴はい
やな奴にしか見えない。
497デフォルトの名無しさん:2005/07/10(日) 20:28:36
>もう解決したから帰っていいよ
帰るのは君では?
498デフォルトの名無しさん:2005/07/10(日) 20:29:53
職場でもよくいるよね。
たいした技術の話も出来ないくせに、やたらと「日本語大丈夫〜?」
とか言って新人君に苦笑されている奴。
499デフォルトの名無しさん:2005/07/10(日) 20:31:54
そうやって揚げ足をとることしかできない人間なんだからしかたがない
放っといてあげなさい
500デフォルトの名無しさん:2005/07/10(日) 20:31:59
>>489
とりあえずドキュメント読め。
501デフォルトの名無しさん:2005/07/10(日) 20:35:05
gccがそういう処理をするからといって、
以前の会話で出てきた処理系がgccであるとは限らないと思うのだが。
502デフォルトの名無しさん:2005/07/10(日) 20:35:34
スルーしとけって
こういう必死君は今に暴れ出すぞ
503483:2005/07/10(日) 20:45:16
>>502
ただの通りすがりだけどさ、もういいかげんにほじくるのはやめなよ
見てて痛々しいよ
504デフォルトの名無しさん:2005/07/10(日) 21:39:14
以下のコードを実行してみたのですが、なぜrefとstructのサイズが違うのでしょうか?

void main(void)
{
  typedef struct {
    char str1;
    int digit1;
    double dot1;
  } TEST1;
  typedef union {
    char str2;
    int digit2;
    double dot2;
  } TEST2;
  TEST1 s;
  TEST2 u;
  char str;
  int digit;
  double dot;
  printf("ref:%d\nstruct:%d\nunion:%d\n",sizeof(str)+sizeof(digit)+sizeof(dot),sizeof(s),sizeof(u));
505デフォルトの名無しさん:2005/07/10(日) 21:44:10
バウンダリ 構造体アライメント で検索汁
506デフォルトの名無しさん:2005/07/10(日) 21:44:54
>>504
structには境界調整を合わせるための隙間が入っている。
合っていないとメモリアクセスに余計な時間がかかったり、下手すると落ちる環境も存在する。

あと、sizeofには括弧でくくれば型名も直接指定できる。
507デフォルトの名無しさん:2005/07/10(日) 21:57:15
>>505
すいません。
検索が下手なので有用な情報が得られませんでした。

>>506
ありがとうございます。納得しました。
sizeofの使い方についても勉強になりました。
508デフォルトの名無しさん:2005/07/10(日) 22:09:11
通りすがりが名前欄を・・・
509デフォルトの名無しさん:2005/07/10(日) 22:15:50
切角みんながスルーしてんのに突っ込むなよ
あまりにも痛々しくて可哀想だからだまってたのに
510デフォルトの名無しさん:2005/07/10(日) 22:22:39
>>508
2chで「通りすがり」って言ってる時点で以下略
511デフォルトの名無しさん:2005/07/10(日) 22:52:52
クッキーって残酷ね
512デフォルトの名無しさん:2005/07/10(日) 23:07:55
このスレのレベルってもはや底辺な。
513デフォルトの名無しさん:2005/07/10(日) 23:13:38
そういえば、そろそろ夏休みなのか?
514デフォルトの名無しさん:2005/07/10(日) 23:15:40
>>511
激しくワロタ
515デフォルトの名無しさん:2005/07/11(月) 00:31:05
>>513
そうだよね。はやくID制にならないかな。
516デフォルトの名無しさん:2005/07/11(月) 00:36:17
まぁこの板はそれ程アラシ等も激しくないので、IDでなくてもいいんでないの?
たまにある自作自演は2ch名物みたいなもんだし。
517デフォルトの名無しさん:2005/07/11(月) 00:38:23
>>516
下手にID制になって自作自演が見れなくなるのもさびしいしな。
518デフォルトの名無しさん:2005/07/11(月) 00:38:40
このスレを見る限り、俺が思っていた以上に自作自演が行われてそうだな。
ID制賛成だな。
519デフォルトの名無しさん:2005/07/11(月) 01:07:46
そなの?
今まで、まじめに答えてたのに...
520デフォルトの名無しさん:2005/07/11(月) 02:03:33
if(no == 0)
puts("その数は0です。");
else if(no > 0)
puts("その数は正です。");
else
puts("その数は負です。");

これの最後のelse を else if( no < 0)にしても大丈夫ですか?
521デフォルトの名無しさん:2005/07/11(月) 02:09:28
>>520
どうぞ。
522デフォルトで名無しさん:2005/07/11(月) 02:30:06 BE:282408858-
C言語覚えるのにどんな本買えばいい?
お勧めなのあったらおせーて
523デフォルトの名無しさん:2005/07/11(月) 02:33:37
main(){
char *file;
load(file);
}

load(char *file){
file = malloc(file_status.st_size);
fp = fopen( file_name, "r");
fread( file_data, file_status.st_size, 1, fp);
}

と言う処理では、load関数が終わった時点で中身がおかしくなっています(Segmentation fault (core dumped))
ファイルネームとファイルステータスの処理は割愛しています
mallocの処理が問題だと思うのですがどのようにしたら対処できるでしょうか?
524デフォルトの名無しさん:2005/07/11(月) 02:34:35
>>522
おまえが本屋にいって適当に何冊か見てみて
これだったら最後迄ようめそうだと思った本
525デフォルトで名無しさん:2005/07/11(月) 02:38:30 BE:254167294-
ふむ。。
そっか
了解>524
526デフォルトの名無しさん:2005/07/11(月) 02:44:50
>>523
fopenに失敗しているかもしれない。
mallocに失敗してるかもしれない。
いきなり出てきたfile_dataってなに?
mallocで確保した領域はmainでは使えないけどいいの?
527デフォルトの名無しさん:2005/07/11(月) 02:51:46
>>521
どうぞって大丈夫って意味ですか?
528523:2005/07/11(月) 02:57:36
すいません
file_dataはfileの間違いです
割愛していますが、fopenとmallocのエラー処理はしています
>mallocで確保した領域はmainでは使えないけどいいの?
これがどうしてもわからないのですが、どうしてなのでしょうか?
実際には、mainで使えるようにしたいです
すいませんが教えていただけると助かります
529デフォルトの名無しさん:2005/07/11(月) 02:57:54
>>527
>>521 じゃないけど、大丈夫ってことだよ。
ちょっと特殊な場合では大丈夫じゃないかもしれないけど。
ちなみに、なんでそうしたいの?
530デフォルトの名無しさん:2005/07/11(月) 02:58:43
>>527
どうしてそんな無駄なことをしたがるの?
531527:2005/07/11(月) 03:04:20
場合わけで、0か正かそれ以外か、っていうのに違和感?を感じるわけです。
高校数学の影響ですかね・・・
532デフォルトの名無しさん:2005/07/11(月) 03:06:22
数学ができたらそんなむだなことしなくてもいいことがわかるでしょ
算数で止まってるひとなら「やっとかないとまずくない?」って思うかもしれないけど
533デフォルトの名無しさん:2005/07/11(月) 03:06:54
>0か正かそれ以外

その他どんな場合があるというんだ?
534デフォルトの名無しさん:2005/07/11(月) 03:07:23
>場合わけで、0か正かそれ以外か、っていうのに違和感?を感じるわけです。
場合分けなら、正か負かそれ以外でしょ
535デフォルトの名無しさん:2005/07/11(月) 03:08:22
0は正じゃなかったっけ?
んなこと忘れたよ
536デフォルトの名無しさん:2005/07/11(月) 03:08:24
0かそれ以外だろ?
537デフォルトの名無しさん:2005/07/11(月) 03:12:09
>>527
noって型は何?
独自定義w
538デフォルトの名無しさん:2005/07/11(月) 03:12:39
>>528
load(char** file)
詳細はこのスレか前スレでdisplayがどうとかいう議論があったと思うのでそれ参照。
539デフォルトの名無しさん:2005/07/11(月) 03:13:54
>これがどうしてもわからないのですが、どうしてなのでしょうか?
煽るようで悪いけど、基本がわかって無いと思われ

変数の有効範囲と関数の戻り値に付いて調べてみたら?

この辺きちっと押さえておかないと、なんとなく動くようになっても
メモリリークしまくるようなプログラムにしかならないと思う
540デフォルトの名無しさん:2005/07/11(月) 03:18:21
>>538
それだと呼んでる方と呼ばれたほうで型違いになるでしょ
541デフォルトの名無しさん:2005/07/11(月) 03:36:53
こうかな?
----
#include <stdio.h>
#define SIZE 123 /* 適当 */
#define file_name "hoge.txt" /* 適当 */
extern char* load(void);
int main(void) {
char* file = load();
/* Segmentation fault の在った位置 */
return 0;
}
char* load(void) {
char* file = malloc(SIZE);
FILE* fp = fopen(file_name, "r");
fread(file, SIZE, 1, fp);
return file;
}
542541:2005/07/11(月) 03:38:42
fclose()呼んでないけど、いいか?
543デフォルトの名無しさん:2005/07/11(月) 03:43:41
お前、根本的にかえてやんなよ
変数宣言と関数の呼出と受取でどうにかすべし
returnで値を渡すなんて言語道断
544デフォルトの名無しさん:2005/07/11(月) 03:47:09
うむ
割愛してるっていってるんだから実際はもっと処理をしてるんだろ
それを根本的に作りなおさせるのはどうかと
545デフォルトの名無しさん:2005/07/11(月) 03:48:22
>>531
こうするといくらかマシな気分になったりする?

if(no == 0) {
 puts("その数は0です。");
}
else {
 if(no > 0) {
  puts("その数は正です。");
 }
 else {
  puts("その数は負です。");
 }
}

ちなみにこのケースだと、ゼロの時には判定が一回、それ以外は二回になるわけだ。
もしあらかじめ no の取る値が、ゼロと正負で確率的に偏ることがわかっているならば、最も高い確率の値の判定の時に
一回で済むように構成すると、ちょっぴり処理効率がいいよ。
546541:2005/07/11(月) 04:02:20
>>543
引数から戻り値にしたのは悪かったけど、
return でポインタ(char*)の値返すのが言語道断って、何で?
547デフォルトの名無しさん:2005/07/11(月) 04:12:37
>>545
三項演算子使いたくなってくる
548デフォルトの名無しさん:2005/07/11(月) 04:14:23
三項演算子って一項にコンマ演算子いくつでも使えるの?
549デフォルトの名無しさん:2005/07/11(月) 04:21:39
親亀の上に小亀載せて孫亀乗せればいいじゃない
550デフォルトの名無しさん:2005/07/11(月) 04:36:25
>>531
おれは
else /* if(no<0) */
的なことを書くことがある。「その他の場合」と「つまりno<0なら」を両方言いたいとき。
こんなのは文芸の世界だと思うけどね。
必要なことしか書いてない無口なプログラムのほうがかっこいいんだけど
ついついよけいなことを言いたくなる。
551デフォルトの名無しさん:2005/07/11(月) 04:44:49
>>520
無駄なif文増やすな。
>>550
無駄なコメント書くな。
552デフォルトの名無しさん:2005/07/11(月) 04:57:00
>>550
俺も以前はそうだったが、最近は if-else if-else の行数を短くして、
コメントしないようにしている。
後は、保守する側の責任ってことで。

>>551
理由も書かんと、分からんがな。
553デフォルトの名無しさん:2005/07/11(月) 09:38:35
>>550 >>551
そのくらいは自明だけど、とり得る値が x==a , x==bの限定的な場合だったら、
if(x==a){
} else /*if(x==b)*/{
}
ってやるよ。整数の範囲という普遍性のあるものではなくて、
人為的な条件だからこうした方が後々無難。条件が増える
場合もあるし、コーディングを増設するときのガイドにもなって
作業効率が上がる
554デフォルトの名無しさん:2005/07/11(月) 09:42:59
>>545
>もしあらかじめ no の取る値が、ゼロと正負で確率的に偏ることがわかっているならば、
最近はガイドオプティマイズというのもあるね。

テストプレーしなきゃいけないのが面倒だが、手作業では
とても無理な大量の条件の偏りを調べて判定順序を入れ
替えてくれる。

マジで性能アップするよ>VS2005のPGO最適化
555デフォルトの名無しさん:2005/07/11(月) 09:55:28
>>553
その場合に限って言うなら、
switch (x) {
case a:
...;
break;
case b:
default:
...;
break;
}
とでもしておく方が保守性は高いんジャマイカ。
556デフォルトの名無しさん:2005/07/11(月) 10:20:04
>>555
例が簡略すぎたか
条件が==とは限らない。strcmpだったり範囲c<=x<dだったり
と、caseでは対応できないケースも多々あり
557527:2005/07/11(月) 10:21:00
回答が難しくて理解できない部分があるとです('A`)
558デフォルトの名無しさん:2005/07/11(月) 10:22:07
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
559デフォルトの名無しさん:2005/07/11(月) 10:32:33
>>558
符号を拡張するのに使う。たとえば、
符号付12ビット数とかが必要なときに
signed int に取り合えずぶちこんで
a << 20 >> 20 とかやると符号が復活
560デフォルトの名無しさん:2005/07/11(月) 10:37:36
>>557
書き方は2ch的っつーかあれだけど、決して難しいことは書いてない。

今の527さんのレベルだとmallocは早いんじゃないか? おそらく
ポインタやメモリの概念も理解して無い感じだし。

まず大き目の固定バッファに読み込んで、処理内容を自分の
思い通りに書ける様になってから、その過程で固定バッファ
では限界だと自然に思うようになったら、メモリ動的確保を勉強
すればいいと思う。

それまでには変数スコープや戻り値に関しても身に付いてると思われ。
561デフォルトの名無しさん:2005/07/11(月) 10:42:06
>>558
もっと簡単な例だと、

2倍4倍8倍16倍したいとき
1/2倍1/4倍1/8倍1/16倍したいとき

というか、この機能があるから何かに使いたい、は逆。
これこれこうしたいけど、どういう機能を組み合わせるのか、でしょ。

それともテストの問題か? ビットシフトの用例を上げよ、みたいな
562デフォルトの名無しさん:2005/07/11(月) 10:45:16
>>553
漏れの場合は
if(x==a){
} else if(x==b) {
} else {
assert(0);
}
ってするな。
前提条件が成立してることは信用しない。
563デフォルトの名無しさん:2005/07/11(月) 10:51:05
>>562
否定はせんけど、パフォーマンスを重視したい場合もある
564デフォルトの名無しさん:2005/07/11(月) 10:58:01
>>563
assert絡みは最適化スイッチをONにすると
消えるから、最適化かかってパフォーマンスも
>>553とまったく同じになるということは期待しても
問題ないレベルだと思う
565デフォルトの名無しさん:2005/07/11(月) 11:18:12
>>564
} else if(x==b) {
があっても?
566デフォルトの名無しさん:2005/07/11(月) 11:30:33
>>565
パフォーマンスを考えるなら、
} else {
  assert(x==b); ...
567デフォルトの名無しさん:2005/07/11(月) 11:50:53
ポインタに[]をつけるとどうなるんだっけ?
int *p;
p = new int;
p[3]=???
568デフォルトの名無しさん:2005/07/11(月) 11:53:27
>>566
了解。

でも、前提条件が成立してることは信用できないケースだと、
リリースビルドでその判定を取っちゃってもいいのかな?

話がそれてきたけどw
569デフォルトの名無しさん:2005/07/11(月) 11:54:24
>>567
その書き方だと吹き飛ぶ
570デフォルトの名無しさん:2005/07/11(月) 11:56:47
>569
いらないことしてすまんかった。
どうすれば吹き飛ばない?
571デフォルトの名無しさん:2005/07/11(月) 12:01:24
ポインタの指すメモリからの配列になるんじゃないっけ?あれ?
572デフォルトの名無しさん:2005/07/11(月) 12:02:15
>>567
> p[3]

*(p+3)と同義
573デフォルトの名無しさん:2005/07/11(月) 12:08:12
>>567
参考までに。
char str[] = "abc"
str[0] == *(str + 0) == *(0 + str) == 0[str] == 'a'
574デフォルトの名無しさん:2005/07/11(月) 12:08:53
>>570
即時的な解決なら

p = new int[4];
p[3]=???

で済むけど、どうしてこうなるのかは理解した方がいいと思うよ。
質問からは、アドレスやメモリの概念がつかめて無い感じを受ける
575デフォルトの名無しさん:2005/07/11(月) 12:21:15
おまいらありがとう。
>572の答えが知りたかったです。助かった。
576デフォルトの名無しさん:2005/07/11(月) 12:21:38
それ以前に、CとC++の区別をつけたほうがいい。
577デフォルトの名無しさん:2005/07/11(月) 12:25:08
>>571
解決したようだけど一応指摘

>ポインタの指すメモリからの配列になるんじゃないっけ?
ポインタの指す先のことなど考えずに配列としてアクセスする、が正確

先がNULLだったり領域外だったら当然吹き飛ぶよ
578デフォルトの名無しさん:2005/07/11(月) 12:32:01
つまり
int x[3];
int *p;

p = x; /* p[1] == x[1] */

ってこと?
579デフォルトの名無しさん:2005/07/11(月) 12:42:24
>>559
それだと負数を2の補数で表現し、なおかつ算術シフトする処理系じゃないと復活しない。
a | -1U << 12
の方が確実
580デフォルトの名無しさん:2005/07/11(月) 12:46:43
>>578
その場合はxが有効な期間内なら問題ないです
581デフォルトの名無しさん:2005/07/11(月) 12:49:40
>>579
よく検証したわけじゃないんだけど、それだとaが+でも上が
埋められないか?
582デフォルトの名無しさん:2005/07/11(月) 12:57:13
>>578
> p = x; /* p[1] == x[1] */

違う。

p= x; /* p = &(x[0]);*/
583デフォルトの名無しさん:2005/07/11(月) 12:59:45
>>582
それが>>578の望んでる答えかぁ?
584デフォルトの名無しさん:2005/07/11(月) 12:59:47
>>560
入門編の本のまだ最初の部分ですorz
585デフォルトの名無しさん:2005/07/11(月) 13:06:15
>>584
学生?
ガンガレ
今のうちにいじり倒してプログラムが何たるものか肌で理解しとくといいよ

入門編の本のとおりにやったら動くと思うから、どうしてそう書かないと
いけないのか考えてみるといい。で、自分の動かないプログラムと
どこが違うのか検討汁
586579:2005/07/11(月) 13:06:30
>>581
あ、そうだね。orz

a | -((unsigned)(a >> 11) << 12)
587デフォルトの名無しさん:2005/07/11(月) 13:22:58
>>565
うん
588デフォルトの名無しさん:2005/07/11(月) 13:28:56
>>568
信用できないなら取っちゃだめだと思う。
「信用できない」がプログラマの勘違いなら、コンパイラが最適化して取ってくれると思う。
ま、>>562でも同じことがいえそうだけど。
589デフォルトの名無しさん:2005/07/11(月) 14:18:29
>「信用できない」がプログラマの勘違いなら、コンパイラが最適化して取ってくれると思う。

書かれた有意なコードをコンパイラは取らないでしょ。人間が見て
不要と思われるものもコンパイラには判断付かないから
590デフォルトの名無しさん:2005/07/11(月) 14:21:10
>>589
横から首突っ込むけど、
assert はりリースビルドの時に取り除かれるから、
それに繋がる if も最適化されて消滅する、っていう話ではなかったの?
591デフォルトの名無しさん:2005/07/11(月) 14:27:44
>>590
たぶん>>562の場合は最後のelse節は消えるけど、} else if(x==b) {
は消えない。結論は>>566で出ているけど、すでに話は違っている模様
592デフォルトの名無しさん:2005/07/11(月) 14:38:11
>>589
「人間が見て不要と思われるもの」の指してるものが曖昧で良くわからんが、
翻訳単位全体を見た上で論理的に明らかに不要なものを消すぐらいのことは今の技術で十分可能。

可能だからって実際に実装してるとは限らんが、そういうのもあるんじゃないの?
と、微妙にトーンダウンするおれガイル。
593デフォルトの名無しさん:2005/07/11(月) 14:55:15
>>592
確かにトーンダウン(^^;)
目の前で話したらまた違うだろうけど、あまり有意な話でも
無くなりつつあるし、この辺で御開きに
594デフォルトの名無しさん:2005/07/11(月) 14:55:37
引数で渡された値が不正な時にassertしてるようなケースでは、
信用できる値が渡されるかどうかまでコンパイラはチェックできないんじゃ?
595523:2005/07/11(月) 15:06:59
結局誰もできないんですね
596デフォルトの名無しさん:2005/07/11(月) 15:10:41
Cじゃできないでしょ
597デフォルトの名無しさん:2005/07/11(月) 15:16:41
int (*pf[10])(int, void(*)(char *));
まったくもってこれの意味がわからないんですけど解説していただけませんか?
598デフォルトの名無しさん:2005/07/11(月) 15:20:38
>>594
コンパイラが(性能上の問題でなく)原理的にチェックできないようなケースでは
assertを消すのもまずいんじゃない?
599デフォルトの名無しさん:2005/07/11(月) 15:30:49
>>597
pf is array[0..9] of pointer to function(int, pointer to function(pointer to char) returning void) returning int.
600デフォルトの名無しさん:2005/07/11(月) 15:30:59
>>597
pfは、「引数が2つ(※)で戻り値がint型の関数」へのポインタで、配列宣言されている。

(※)2つの引数
・int型
・引数char*型で、戻り値無しの関数へのポインタ

601デフォルトの名無しさん:2005/07/11(月) 16:01:24
>>597
まず、関数はわかるか?そりゃわかるか。
関数ポインタはわかるか?
#include <stdio.h>
int main(void) {
  int (*f)(const char *, ...) = printf;
  f("Hello World.\n");
  return 0;
}
なんてポインタ変数を使って関数を呼び出したりできる。
あとは自分で考えるなり調べるなりすれば、わかると思う。
602デフォルトの名無しさん:2005/07/11(月) 16:13:04
意味わかんね
俺にもわかるように説明しろよ
603デフォルトの名無しさん:2005/07/11(月) 16:27:20
>>595 >>523
仕方ないな。みんな答えないみたいだから、オレが。

ファイルを"r"で開いてるだろ。それをfreadで読んだら
ファイルのサイズより若干多く読み込まれることがある。
(改行を変換して読み込むから)

mallocは正味のサイズしか確保されていないから、増えた分で
バッファオーバー起こして吹き飛んでんじゃねーの?
604デフォルトの名無しさん:2005/07/11(月) 16:28:29
じゃんけんをするプログラムを下のように作ったんですが、
終了を宣言するまで繰り返し実行させたい場合は、どうしたらいいんでしょうか。
一応5回繰り返すことになってるんですが。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int i,m,e,w[3]={0},j;
char h[][9] = {"グー","チョキ","パー","勝ち","負け","あいこ"};
srand((unsigned)time(0));
for(i=0;i<5;i++){
printf("%s:0 %s:1 %s:2\n",h,h+1,h+2);scanf("%d",&m);
++w[j=(m==(e=(double)rand()/RAND_MAX*3)?2:(m+1)%3==e?0:1)];
printf("YOU:%s,PC:%s,%s\n\n",h+m,h+e,h+j+3);
}
printf("%s:%d,%s:%d,%s:%d,勝率:%d%%",h+3,*w,h+4,w[1],h+5,w[2],*w*100/5);
}
605デフォルトの名無しさん:2005/07/11(月) 16:34:09
>>604
自分で作ったの?
606デフォルトの名無しさん:2005/07/11(月) 16:35:22
>>604
for(i=0;i<5;i++) → for(;;)
にしてみな。無限回繰り返すから。
あとは終了条件でbreakすればいい。
607デフォルトの名無しさん:2005/07/11(月) 17:20:32
誰か教えてください!
入力した数字(最大8行)を、「*」を用いて花文字で表示するプログラム
(例)数字を入力してください:56
***** *****
* *
***** *****
* * *
***** *****
608デフォルトの名無しさん:2005/07/11(月) 17:21:28
↑ミスった
609デフォルトの名無しさん:2005/07/11(月) 17:25:08
>>607
何がわからないのか、具体的に。

# 全部はなしだぞ。
610デフォルトの名無しさん:2005/07/11(月) 17:25:44
>>603
> ファイルを"r"で開いてるだろ。それをfreadで読んだら
> ファイルのサイズより若干多く読み込まれることがある。

もしかして、本気でそう思ってる?
611デフォルトの名無しさん:2005/07/11(月) 17:44:02
>>610
ちがうのか? それ以外の理由があったらご教示お願い
612デフォルトの名無しさん:2005/07/11(月) 17:49:47
>>611
Cでは改行の内部表現は常に'\n'1文字。
どうやっても外部表現だってそれより短くはできないだろ。
613デフォルトの名無しさん:2005/07/11(月) 17:50:45
>>611
fread()の件に関しては、ファイルサイズより若干余計に*読むことができる*が、
決してパラメータで渡したよりも余計に*読み込む*訳ではない。
>523は別の原因だろ。
614デフォルトの名無しさん:2005/07/11(月) 17:52:39
615デフォルトの名無しさん:2005/07/11(月) 17:53:24
あれ? \n->\n\rへの変換って出力時?
616デフォルトの名無しさん:2005/07/11(月) 17:54:47
>>611
読み込みの改行変換でサイズが増える環境は現存しない。

>>523に対して解決策が示されていないのは、挙げてあるコード
だけでは情報量が少なくてどこが間違っているのかわからないから。
617デフォルトの名無しさん:2005/07/11(月) 17:56:00
>>616
了解、俺の間違いスマソ
618デフォルトの名無しさん:2005/07/11(月) 17:59:41
619デフォルトの名無しさん:2005/07/11(月) 18:00:38
620デフォルトの名無しさん:2005/07/11(月) 18:05:12
ひどいコードだなおい
621デフォルトの名無しさん:2005/07/11(月) 18:28:27
>>615
出力先っつーかまあ大体はターミナルがそう変換してる
だから\r\nとかきちんと書かないとダメなパターンも
それなりにある
622607:2005/07/11(月) 18:42:45
どなたか綺麗なコードでお願いします
623デフォルトの名無しさん:2005/07/11(月) 18:44:09
自分で書け
624デフォルトの名無しさん:2005/07/11(月) 18:44:16
>>622
おまえのきれいなコードとやらを書いてくれよ
625デフォルトの名無しさん:2005/07/11(月) 18:44:49
>>622
スレ違い
626デフォルトの名無しさん:2005/07/11(月) 18:48:16
汚いコードだとは思わないけどな
627デフォルトの名無しさん:2005/07/11(月) 19:39:16
せめてstaticつけとけ
628デフォルトの名無しさん:2005/07/11(月) 21:25:50
ファイル出力をするのですが、出力のたびに名前を変えるにはどうしたらよいですか?

FILE *fp;
fp=fopen("c:/data.txt","w");
if(fp==NULL){
 printf("open error");
 exit(0);
}

ここの部分でたとえばファイル名をdata1.txt/data2.txt/data3.txt・・・と自動で変化させることはできますか?
629デフォルトの名無しさん:2005/07/11(月) 21:26:51
>>628
できる。
文字列定数じゃなくて、文字列配列で、sprintfとかつかえばよろし。
630628:2005/07/11(月) 21:29:41
ファイル関係については参考書を写しただけなのでちょっと知識に乏しいです
もしよろしければ文例など教えてもらえませんか?
631デフォルトの名無しさん:2005/07/11(月) 21:33:58
>>630
直書きだが。

char filename[64];
FILE *fp;
int i;

for (i = 0; i < 10; i++) {
sprintf(filename, "c:\\data%d.txt", i);
fp = fopen(filename, "w");
....
}
632628:2005/07/11(月) 21:40:14
ありがとうございます
後だしで申し訳ないんですが、実行毎に名前が変わってほしいのが目的なんですがぁ・・・

>>631
だとファイル呼び出しの度に・・・ってことだと理解したんですが

なんていうか
1回目実行・・・ファイル作成した・・・終了
数値ちょっと変えてリビルドして実行・・・ファイル作成・・・終了
の時に毎回違うファイル名になるようにってことなんですが
すいませんわけわかんなくて
633デフォルトの名無しさん:2005/07/11(月) 21:42:14
perlとかスクリプト使ってファイル名defineしたヘッダ吐いて、
それをmakefileに組み込めばできる。
けど、それを細かく説明する気は起きない。
すまんな。
634デフォルトの名無しさん:2005/07/11(月) 21:44:24
あ、必ず一回実行するんなら、番号をファイルに吐き出して
それを元に+1した数値を使えばいいんかな。
ビルド毎だとめんどいと思う。
635デフォルトの名無しさん:2005/07/11(月) 21:44:34
意味わからん。

sprintf(filename, "c:\\data%d.txt", rand());
636628:2005/07/11(月) 21:44:50
プログラムで処理するくらいなら手動で
実行・終了・ファイル作成
手動でファイル名変えておく
また実行・・・・ファイル作成
としたほうが面倒じゃないということですね

ありがとうございました
637デフォルトの名無しさん:2005/07/11(月) 21:54:43
>>632
001が存在すれば002、
002が存在すれば003
っていう風に変化させればいいじゃん。
fopenでは読み取りで開こうとしたときにファイルが存在しなければ失敗するからファイルがあるか判定できる。
638デフォルトの名無しさん:2005/07/11(月) 21:59:47
ファイル名に時刻を入れとけばいいんじゃないの?
639628:2005/07/11(月) 22:00:47
自己解決しておいていまさらなんでsage

>>635
を少し変えて
sprintf(filename, "c:\\data%d.txt",time(NULL));
にすれば毎度違うファイルが出来るのに気づきました
640デフォルトの名無しさん:2005/07/11(月) 22:09:24
キーボードから英文を読み込み、英文に現れる異なる単語の数を求めるプログラムってどうすればいいんでしょうか?
strcmpを使うようなのですが。
641デフォルトの名無しさん:2005/07/11(月) 22:11:25
>>640
宿題なら宿題スレへ
642デフォルトの名無しさん:2005/07/11(月) 22:13:16
>>640
まず、キーボードから英文を読む
この時点で英文かどうかのチェックを済ませておいたほうがいいな

つぎに、英文を単語に分割する
スペースかなんかで区切ればいいな
再利用なんか考えずに元英文は破壊してもいいよな
区切ったらポインタの配列に放り込んでいこう

その後、最初の単語から順に異なってないか調べる
もし一致してたら面倒だからその単語はぬるぽしとこう

最後に、集計結果を表示だ
643デフォルトの名無しさん:2005/07/11(月) 23:24:12
名前呼びを用いると、ある式eに対してD,ρ├ e ⇒ A kとなる数字kが存在するけれども、値呼びを用いると、D,ρ├ e ⇒ A kとなる数字が存在しない宣言の例ってありますか?
644デフォルトの名無しさん:2005/07/11(月) 23:27:40
Cのコンパイラってどこに置いてありますかね・・・?
645デフォルトの名無しさん:2005/07/11(月) 23:29:56
/bin
646日本道路公団:2005/07/11(月) 23:31:11
今日もさぼちまった
647デフォルトの名無しさん:2005/07/11(月) 23:31:34
>>644
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin
648デフォルトの名無しさん:2005/07/11(月) 23:31:44
>>644
そこらへん
649デフォルトの名無しさん:2005/07/11(月) 23:47:23
>>647
へー。VCバージョン7って名前ついてんだ
650デフォルトの名無しさん:2005/07/12(火) 00:32:02
煽るならもうちょっと面白いこと言えよな…
651デフォルトの名無しさん:2005/07/12(火) 00:55:00
二次元配列を利用するとなぜかSegmentation faultがでるのはどうしてでしょうか?
プログラムは間違っていないんですが。
652デフォルトの名無しさん:2005/07/12(火) 00:56:32
プログラムが間違ってないならメモリのハードウェアエラーだな。
PCの修理をすれば直る。
653デフォルトの名無しさん:2005/07/12(火) 00:56:59
ハード不良
654651:2005/07/12(火) 01:01:08
どうも。調べてみます。
655デフォルトの名無しさん:2005/07/12(火) 01:01:32
>>639
前にそのコード書いて
「OSの時刻戻されたらどうすんだよ。」と言う上司と
1時間もめたことがあるw
656デフォルトの名無しさん:2005/07/12(火) 01:09:12
>>651
プログラムが正しいと判断した理由教えて
657デフォルトの名無しさん:2005/07/12(火) 01:10:49
>>655
もちろん上司が正しかったわけだよな?
658デフォルトの名無しさん:2005/07/12(火) 01:44:57
大きい配列を取るときは、エラーチェックすべきですか?
例えば、

static double f[10][100][1000];  とか書くときです。
659デフォルトの名無しさん:2005/07/12(火) 01:48:15
何の?
660デフォルトの名無しさん:2005/07/12(火) 01:52:11
はみ出てるかでてないかの?
661デフォルトの名無しさん:2005/07/12(火) 02:02:22
すいません、確保できたかどうかのです。
662デフォルトの名無しさん:2005/07/12(火) 02:04:14
どうやって?
663デフォルトの名無しさん:2005/07/12(火) 02:06:12
main()
{
static double f[10][100][1000];
puts("succ");
}
で文字が出たら成功でなかったら失敗。
664デフォルトの名無しさん:2005/07/12(火) 02:06:31
普通に宣言したならコンパイル時にチェックじゃないの?
665デフォルトの名無しさん:2005/07/12(火) 02:08:02
>>664
本当に確保できるかどうかは実行時にしかわからないだろ。
OS側の問題。
666デフォルトの名無しさん:2005/07/12(火) 02:10:51
ああ、そうだな…ボケてた。
667デフォルトの名無しさん:2005/07/12(火) 02:12:09
>>663
ありがとうございます。試してみます。
>>664
コンパイラが自動でチェックしてくれるということですか?
668デフォルトの名無しさん:2005/07/12(火) 02:14:01
>>667
ごめん、>>665の言うとおり。
実行するごとに結果は変わる可能性があるよ
669667:2005/07/12(火) 02:15:07
要するに 663を試せってことですよね?
670デフォルトの名無しさん:2005/07/12(火) 02:17:08
>>658
グローバル変数とかなら、コンパイルした実行ファイルが起動できれば確保は成功してると思っていいと思う。
こういう変数の領域は、プログラム起動時からメモリ中に居座るから、もし確保できなければプログラムが起動しない。
だから、コードでそれを検出する必要は無い。

スタック上に取る auto な変数なら、その関数に入った段階でメモリ(スタック)が足りなくなれば、stack overflow で落ちる。
コードでそれを検出することはできない。

malloc 等で確保するならば、確保が失敗したら NULL が返ってくるから、それで判断できる。
ただし環境によっては、広大なメモリ領域をリクエストした段階では確保に成功したかのごとく返ってきて(アドレス空間だけ
確保する)、実際にメモリを使っていくと突然メモリが足りなくなって意図しないことが起こる、なんてこともある(Linux の
楽観的メモリ配置)。
これはコードで検出できるのかな?
671デフォルトの名無しさん:2005/07/12(火) 02:23:34
>>670
じゃあstaticしてるから検出必要なし?
672670:2005/07/12(火) 02:25:56
>>671
うん。
書き忘れたけど、static な変数もグローバルな変数と同じで、起動時に確保されちゃう(はず)。
だから、プログラムが起動できるかできないかのいづれしかないから、コードで検出する必要は無い。
673デフォルトの名無しさん:2005/07/12(火) 02:49:07
そもそも、馬鹿でかい配列はmallocなどで確保するようにすればいい
674デフォルトの名無しさん:2005/07/12(火) 02:52:25
あんちゃん、それを言っちゃあ(ry
675デフォルトの名無しさん:2005/07/12(火) 03:09:20
#include <stdio.h>
#include <limits.h>
int main(void)
{
int i = 1;
while(i < INT_MAX) {
printf("%d\n", i);
i *= 2;
}
return 0;
}
これを実行すると0がずっと表示されるのですが何故でしょうか
(i < 1073741824)までは正常に表示されるのですが
gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
676デフォルトの名無しさん:2005/07/12(火) 03:10:33
i *= 2;
printf("%d\n", i);
に順番変えて実行してみなー
677デフォルトの名無しさん:2005/07/12(火) 03:11:58
mallocはしょきかがむずかしいじゃん
678デフォルトの名無しさん:2005/07/12(火) 03:21:29
>>677
コードで書けばいいじゃん
CPUにとってはやってるステップ数さほどかわらんよ
679デフォルトの名無しさん:2005/07/12(火) 03:36:34
>>677
calloc()使えば?
実際には実メモリ以上のメモリを確保したときに、calloc()は不利なわけだが。
680デフォルトの名無しさん:2005/07/12(火) 03:51:21
>>675
int が 32bit な環境だと、INT_MAX は 0x7fffffff = 2145483647 になる。
i*=2 を繰り返していくと、いずれ i は 0x40000000 = 1073741824 になる。
この状態でさらに i*=2 をすると、i は 0x80000000 になるが、これは符号付整数では -2147483648 になってしまう。
だから while の i < INT_MAX で終了できない。
さらに i*=2 をすると、i は 0x100000000 になり、32bit の範囲を超えてしまい、結果の下 32bit = 0x00000000 = 0 が
残り、以降 i = 0 のままループを繰り返す。

681デフォルトの名無しさん:2005/07/12(火) 04:16:09
まず符号付のしくみから教えないといけないヨカーン
682デフォルトの名無しさん:2005/07/12(火) 07:19:00
>>680
詳しい説明ありがとうございました。
符号付整数は多分こんな感じになっているのですね。
0xffffffff = -1
0xc0000000 = -1073741824
0x80000000 = -2147483648
0x7fffffff = 2145483647
0x40000000 = 1073741824
0x00000000 = 0
それで0x80000000の2倍は0x1(00000000)で
この括弧の部分が32bit分なので0になるってことなのかな。
勉強になりました。ほかの人たちもありがとう。
683デフォルトの名無しさん:2005/07/12(火) 10:46:41
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

double a_init(double a) {
int i;
srand(time(NULL));
a = rand();
return a;
}

double a_rms(double a) {
double s = 0.0;
s += a + a;
return (s);
}

int main() {
double x, y;
printf("X = %lf\n", a_rms(a_init(x)));
printf("Y = %lf\n", a_rms(a_init(y)));
return 0;
}

これで実行しても、同じ秒数の間に実行されちゃって、XとYの値が同じになっちゃいますよね?
どう変えたらXとYに別々の乱数を読み込めますか?
684デフォルトの名無しさん:2005/07/12(火) 10:57:17
srand()はmain()の頭で一回のみ呼べば良い。
685デフォルトの名無しさん:2005/07/12(火) 11:59:49
「宣言に型が多すぎる」てエラーが出ました
エラー行は「void main()」です

どうしたらよいでしょうか?
686デフォルトの名無しさん:2005/07/12(火) 12:09:46
なんで最近の若者はtimeで乱数をつくろうとするの?
687デフォルトの名無しさん:2005/07/12(火) 12:10:57
スレ違い
688デフォルトの名無しさん:2005/07/12(火) 12:12:03
int main(short argc, char **argv)
で、宣言すると なんで
warning: first argument of `main' should be `int'
って怒られんの?

引数の数なんてcharでも足りるでしょ
ちゃんとした理由知ってるひといます?
689デフォルトの名無しさん:2005/07/12(火) 12:13:40
規格でそう定められてるから。
690デフォルトの名無しさん:2005/07/12(火) 12:27:11
>>688
呼ぶ側の事も考えれ
691デフォルトの名無しさん:2005/07/12(火) 12:30:31
>>686
じゃあ昔の人は何で初期化したんだよ
692デフォルトの名無しさん:2005/07/12(火) 12:32:32
初期化?
693デフォルトの名無しさん:2005/07/12(火) 12:33:08
>>688
マルチすなや。
694デフォルトの名無しさん:2005/07/12(火) 12:36:31
>>691
フレームカウンタとか、ユーザからの入力とか。
695デフォルトの名無しさん:2005/07/12(火) 12:37:59
プ
696デフォルトの名無しさん:2005/07/12(火) 12:39:10
timeのほうがよっぽど汎用的じゃねぇか。>>686が何を非難しようとしてるのか分からん。うらやましいだけか?
697デフォルトの名無しさん:2005/07/12(火) 12:39:39
>>686
1. 手っ取り早い
2. よく使われている例を丸写ししただけ
3. 他の方法を考えるのが面倒

こんな感じでは?
698デフォルトの名無しさん:2005/07/12(火) 12:45:12
そもそも、昔は乱数表だろ。
699デフォルトの名無しさん:2005/07/12(火) 12:46:00
C/C++でスレッドプールを扱うための標準ライブラリってあるんですか?
700デフォルトの名無しさん:2005/07/12(火) 12:46:48
ない。
701683:2005/07/12(火) 13:03:42
>>684
int main()
srand(time(NULL));


ってことですか?
コンパイルするとここでは宣言できないって言われるですが
702デフォルトの名無しさん:2005/07/12(火) 13:05:43
>>701
コンパイラが古いんじゃないかと。
703684じゃないけど:2005/07/12(火) 13:06:43
>>701
int main()
{
 srand(time(NULL));
 :
}

ただ、main の頭でやるというか、他で rand を使うに先立って一度だけ srand をすればいい。
だから別に main でやらなくてもいいよ。
704デフォルトの名無しさん:2005/07/12(火) 13:16:29
>>701
「mainの頭」と言われて、srandを変数宣言よりも前に置いたのかw
愉快な奴だなw
705683:2005/07/12(火) 13:16:38
>>684
>>703
サンクス。おかげで上手い事できました。
706683:2005/07/12(火) 13:19:56
>>704
それ早くいってくれよorz
707デフォルトの名無しさん:2005/07/12(火) 13:27:01
>>706
言わなくても分かれよ。
基本だろ?
708デフォルトの名無しさん:2005/07/12(火) 13:31:23
c99なら無問題。
709デフォルトの名無しさん:2005/07/12(火) 13:34:20
まぁ、mainの頭といったら
srand(time(NULL));
int main
とかするよりもマシだろう。

# ソースを「実行」しようとした奴もいたし...Cはスクリプトじゃねーよ
710デフォルトの名無しさん:2005/07/12(火) 13:34:53
>>708
いくらなんでも関数本体のブロックに入る前じゃダメだろ
711デフォルトの名無しさん:2005/07/12(火) 15:15:30
慎重を期してrandの直前で呼ぶのがいいよ
712デフォルトの名無しさん:2005/07/12(火) 15:36:01
整数nを入力し,下記の数列の和を計算するプログラムを作成しなさい.
 8/(1×3)+8/(5×7)+ ‥‥ +8/{(4n-3)×(4n-1)}
ただし,nは1以上とする

#include<stdio.h>
void main()
{
int i,n,kou,wa=0;

printf("1以上の整数nは?\n");
scanf("%lf",&n);

for (i = 1;i <= n; i++) {
wa += kou;
kou = (double) 8 / (4 * i - 3) * ( 4 * i - 1);
}
printf("和=%lf\n",wa);
}

すいません・・・ずっと考えているんですがどこが違っているのか
わかりません。どなたか教えてください。
713デフォルトの名無しさん:2005/07/12(火) 15:43:22
>>712
int は整数の型ってことに注意。
少数を扱いたいなら float か double。
ソースを見たところ i と n は int で構わないだろうけど、それ以外は少数なんでないかい?
714デフォルトの名無しさん:2005/07/12(火) 15:45:34
wa
kou
が逆だろ。ゆとりありすぎ
715デフォルトの名無しさん:2005/07/12(火) 15:50:14
蛇足ながらもう一点。
浮動小数点型においてたくさんの数値を足し込むときには、値の小さいものから足していくと誤差が少なくなるよ。
とどのつまり上記問題では、i を 1 から n に向かってループさせるのではなく、n から 1 に向かってループさせると
精度が良くなるってこと。

これは C固有のテクニックではないけどね。
716712:2005/07/12(火) 15:52:23
みなさんどうもありがとうございました
717デフォルトの名無しさん:2005/07/12(火) 15:53:21
>>712
>713の注意と、scanf()の型指定子にも注意。
それと、>714の言いたいことはwaに加算する順序が違うだろうと言うことだな。
718デフォルトの名無しさん:2005/07/12(火) 16:49:26
カッコが足りんような気するのはオレだけか?
<kou = (double) 8 / (4 * i - 3) * ( 4 * i - 1);
>kou = (double) 8 / ((4 * i - 3) * ( 4 * i - 1));
719デフォルトの名無しさん:2005/07/12(火) 16:53:06
>>718
括弧より、お前の知識が足りない。小学校からやり直せ
720718:2005/07/12(火) 17:05:43
小学校にはなれませんね、残念ながら。
721デフォルトの名無しさん:2005/07/12(火) 17:06:34
なんだか凄い流れだな
722デフォルトの名無しさん:2005/07/12(火) 17:07:12
俺も括弧足りない気がする
>>719
解説よろ
723デフォルトの名無しさん:2005/07/12(火) 17:33:17
>>718 だけじゃないようだ。よかったね。

  だが気のせいだ。何を気にしているのか知らんが。
724デフォルトの名無しさん:2005/07/12(火) 17:34:07
fflush(stdin);のもっと行儀のいいポータブルな書き方ってないの?
725デフォルトの名無しさん:2005/07/12(火) 17:37:48
処理系依存
726724!=712:2005/07/12(火) 17:45:19
じゃあ712でscanfの入力でリトライ機能入れようと思ったらどう書くの?

for(;;){
printf("1以上の整数nは?\n");
if(scanf("%d",&n)==1 && n>=1) break;
*ここで行末まで読み捨てる。
}
727デフォルトの名無しさん:2005/07/12(火) 17:46:42
>>724
素直に読み捨てろ。
728デフォルトの名無しさん:2005/07/12(火) 17:47:27
scanf("%*[^\n]%*c");
729デフォルトの名無しさん:2005/07/12(火) 17:48:21
そもそもscanfは使わない希ガス
730デフォルトの名無しさん:2005/07/12(火) 17:49:36
>>726
scanf()を捨てろ。
731デフォルトの名無しさん:2005/07/12(火) 17:59:58
.。o sscanfとfgetsが相談しているようです。
732デフォルトの名無しさん:2005/07/12(火) 18:08:20
やっぱり括弧が足りない気がする。
733726:2005/07/12(火) 18:14:51
>>728
なるほど。
でもEOFも検出しないと無限ループだからこんな感じか。ショッペー
for(;;){ int c = getchar(); if(c==EOF) return 0; if(c=='\n') break; }
734デフォルトの名無しさん:2005/07/12(火) 18:16:27
バッファをフラッシュするのとEOFまで読み捨てるのとでは意味が違う
735デフォルトの名無しさん:2005/07/12(火) 18:25:47
>>732
いったいどういう仕組みなんだろう、何で括弧入らないんだ?
割り算が先に評価されると思うのだが
736デフォルトの名無しさん:2005/07/12(火) 18:27:38
>>735
サンプルソース
int i=1;
printf("%f\n", (double)8 / (4*i-3)*(4*i-1));
printf("%f\n", (double)8 / ((4*i-3)*(4*i-1)));

実行結果
 24.000000
 2.666667

どっちが正しいの?
737デフォルトの名無しさん:2005/07/12(火) 18:30:44
いやだから>>712のニ行目を(ry
738デフォルトの名無しさん:2005/07/12(火) 18:32:15
fgetsとgetcharとstrchrで自作関数だ!
739デフォルトの名無しさん:2005/07/12(火) 18:35:08
今頃Cなんてやってどうするの?バカジャネーノ
740デフォルトの名無しさん:2005/07/12(火) 18:35:19
>>734
フラッシュする代わりに読み捨てちゃダメなの…?
741736:2005/07/12(火) 18:36:26
>>737
あ、ちなみにおれは括弧が必要だと思ってるよ。
小学校に入れるものなら入ってやり直して女友達をいっぱい作りたい。
742デフォルトの名無しさん:2005/07/12(火) 18:41:46
あれ、1行目と2行目がつながりませんよ
743デフォルトの名無しさん:2005/07/12(火) 18:47:07
>>742
どういうこと、つながってないとは、一連の問題文に読めるが?
744デフォルトの名無しさん:2005/07/12(火) 18:48:10
double f(int n)
{
return (n<1) ? 0 : f(n-1) + (8.0 / ((4*n-3) * (4*n-1)));
}
745デフォルトの名無しさん:2005/07/12(火) 18:48:42
>>738
最近C言語の解説本、増えてるよね? 流行ってんじゃねーの
746デフォルトの名無しさん:2005/07/12(火) 18:49:48
>>744
括弧あるじゃん
747デフォルトの名無しさん:2005/07/12(火) 18:50:54
>>745
>>738>>739 orz
748デフォルトの名無しさん:2005/07/12(火) 18:52:31
今更なんだけど、
>8/(1×3)+8/(5×7)+ ‥‥ +8/{(4n-3)×(4n-1)}
これさ
>8/(1×3)+8/(5×7)
>8/{(4n-3)×(4n-1)}
おかしくね?
749デフォルトの名無しさん:2005/07/12(火) 18:53:19
お前ら頭悪すぎ
750デフォルトの名無しさん:2005/07/12(火) 18:59:05
>>748
さすがにそれは違う
8/(1×3)+8/(5×7)
これはn=1 , n=2を連続して書いてるだけだ。代入してみなよ
751デフォルトの名無しさん:2005/07/12(火) 18:59:39
>>743
ごめん。おれの読み間違いみたいだ。
小学校に入って女友達作ってくる
752デフォルトの名無しさん:2005/07/12(火) 18:59:57
>>750
ありがとう。早とちりした。
753デフォルトの名無しさん:2005/07/12(火) 19:00:16
>>749
だから何で括弧が要らないのか教えてくれ。気になって仕事に戻れんw
754デフォルトの名無しさん:2005/07/12(火) 19:03:31
割るは÷だろ
/は分数
だから8/(4n-3)×(4n-1)は
    8
−−−−−−
(4n-3)×(4n-1)
なんだよ。小学校から出直せ。
755デフォルトの名無しさん:2005/07/12(火) 19:05:47
C2005では分数がサポートされます。
756デフォルトの名無しさん:2005/07/12(火) 19:07:22
>>754
なんだネタかツマラン
757デフォルトの名無しさん:2005/07/12(火) 19:07:32
>>754
a/b*c+d って書いたらどうなるんだい?

   a
−−−−
b * c + d

とか言っちゃう?
758デフォルトの名無しさん:2005/07/12(火) 19:18:28
759デフォルトの名無しさん:2005/07/12(火) 19:23:55
char Buf[480][640];

こういう2次元配列用のポインタって宣言出来ましたっけ?
760デフォルトの名無しさん:2005/07/12(火) 19:29:36
できるけどちょっと難しいよね。typedef組み合わせればわかりやすくなるかも
761デフォルトの名無しさん:2005/07/12(火) 19:29:38
char (*bufp)[640];
762759:2005/07/12(火) 19:48:37
thx>>760-761

上手くいきました。

>char (*bufp)[640];
どう読むのか難しいでつね。
763デフォルトの名無しさん:2005/07/12(火) 19:48:45
「FFZ→C言語
 FF[→アセンブラ言語」
764デフォルトの名無しさん:2005/07/12(火) 20:38:18
>>762
bufp is pointer to array[0..639] of char.
結びつきの強いものから順に。英語で読む。

bufpはcharの配列[0..639]へのポインタ
765デフォルトの名無しさん:2005/07/12(火) 21:38:07
みんなクイックソートって何に使う?
自力で組めるようになった?

おれは自力で行ったのはマージソート。そのあと基数ソートにたどり着い
ちゃってクイックソートイラネ
766デフォルトの名無しさん:2005/07/12(火) 22:10:17
#include <stdio.h>

int is_prime(int n)
{
int i;
if (n < 2)
return 0;
for (i = 2; i < n; i++)
if ((n % i) == 0)
return 0;
return 1;
}

int main(void)
{
int i;
for (i = 2; i < 500; i++) {
if (is_prime(i) && is_prime(1000-i))
printf("%d %d\n", i, 1000-i);
}
return 0;
}
このプログラムで各々が何をしているのかわかりません。
教えてくれないでしょうか?
767デフォルトの名無しさん:2005/07/12(火) 22:16:46
それC言語の話題じゃない。
768デフォルトの名無しさん:2005/07/12(火) 22:18:54
関数名だけ見て。
素数かどうかチェックする関数だろ。
769デフォルトの名無しさん:2005/07/12(火) 22:25:35
if は条件分岐で、 for は条件ループで、returnは変数からのリターンで
is_primeは素数判定で、printfは標準出力への文字列表示です。
770デフォルトの名無しさん:2005/07/12(火) 22:42:58
771デフォルトの名無しさん:2005/07/12(火) 22:55:03
ファイルを開くとき、ファイル名に~/とか../を使いたいんですが、
fopenではファイル名にこういうのを入れられない。
フルパスに展開する関数とかあるんでしょうか。
772デフォルトの名無しさん:2005/07/12(火) 22:56:41
ないよ。環境変数のHOMEとか取得するしかないかな。
いずれにせよ、環境依存のコードになるだろうな。
773デフォルトの名無しさん:2005/07/12(火) 23:04:49
../って使えないの?
774デフォルトの名無しさん:2005/07/12(火) 23:08:59
>>773
775デフォルトの名無しさん:2005/07/12(火) 23:09:42
>>771
Winなら GetFullPathName とかなかったっけ? ~ ならUNIX系か
>>773
Winなら使えた記憶がある
776デフォルトの名無しさん:2005/07/12(火) 23:11:48
はー?
777デフォルトの名無しさん:2005/07/12(火) 23:12:21
#include <stdio.h>

int main(void)
{
int i, j;
int ma[2][3] = { {1, 2, 3}, {4, 5, 6} };
int mb[3][2] = { {1, 5}, {5, 3}, {8, 1} };

for (i = 1; i < 2; i++)
for (j = 1; j < 2; j++)
mc[1][1] = ma[i][j]*mb[i][j] + ma[i+1][j]*mb[i][j+1] + ma[i+2][j]*mb[i][j+2];
mc[1][2] = ma[i][j]*mb[i+1][j] + ma[i+1][j]*mb[i+1][j+1] + ma[i+2][j]*mb[i+1][j+2];
mc[2][1] = ma[i+1][j]*mb[i][j] + ma[i+1][j+1]*mb[i][j+1] + ma[i+1][j+2]*mb[i][j+2];
mc[2][2] = ma[i+1][j]*mb[i+1][j] + ma[i+1][j+1]*mb[i+1][j+1] + ma[i+1][j+2]*mb[i+1][j+2];

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++)
printf("%3d", mc[i][j]);
putchar('\n');
}

return (0);
}
2行3列と3行2列の積をもとめるプログラムなんですが
mcを求める演算を簡単にするにはどうしたらいいのでしょうか。

しかもこれさえまともに動かない・・orz
778デフォルトの名無しさん:2005/07/12(火) 23:13:49
>>777
まともに動かないのは、forの括弧が抜けてるから
779778:2005/07/12(火) 23:15:10
それだけじゃ、ないみたい・・・w
780デフォルトの名無しさん:2005/07/12(火) 23:18:10
まるでループ不要
781デフォルトの名無しさん:2005/07/12(火) 23:20:56
ループ意味をなしてないですよねw

かなり強引につくったんですが
782デフォルトの名無しさん:2005/07/13(水) 00:08:37
783デフォルトの名無しさん:2005/07/13(水) 00:23:02
double a, b, c;
a = 0.509;
b = 1.501;
c = a ^ b;

↑こんな感じで書くとビルドエラーになるんですが、小数同士の
Xorを取るにはどうすればいいんでしょう?
"^"の左右オペランドが間違いとか言われます。
784デフォルトの名無しさん:2005/07/13(水) 00:28:35
小数のXORって……一体どんな値が出ることを期待しているのかなぁ。
785デフォルトの名無しさん:2005/07/13(水) 00:33:12
>>783
C のビット演算は整数専用なんだけど。
786デフォルトの名無しさん:2005/07/13(水) 00:36:43
整数、というか概念的には、ビット集合だよねぇ。
論理演算が使えるのは。
787デフォルトの名無しさん:2005/07/13(水) 00:54:41
SSE2レジスタに浮動小数イメージのままxorする命令があった
788デフォルトの名無しさん:2005/07/13(水) 00:56:56
命令サポートするって事は用途があるって事なんだろうけど
何に使うんだろう
789デフォルトの名無しさん:2005/07/13(水) 01:03:38
>>782
参考になりました。ありがとうございます

790デフォルトの名無しさん:2005/07/13(水) 01:10:15
Cとかwプッw
791デフォルトの名無しさん:2005/07/13(水) 01:11:17
>>790
なんだとー!
792ガラハド:2005/07/13(水) 02:10:48
なにをするきさまらー
793デフォルトの名無しさん:2005/07/13(水) 02:17:13
ここはゲーム板じゃねえんだよ。
腐りきったロマサガネタなんぞ書くなバカモノ。
794ぬるぽ:2005/07/13(水) 02:50:57
なにをするきさまらー
795ルート:2005/07/13(水) 03:19:48
Borland C++コンパイラをダウンロードしたんですけど、これってダウンロードしただけで使えるんですか?
ダウンロードしたファイルからインストールするものとかあるんでしょうか?
あと、Borland C++コンパイラの命令コマンドって何ですか?
796デフォルトの名無しさん:2005/07/13(水) 03:28:37
くだらんネタ続けるなよ
797デフォルトの名無しさん:2005/07/13(水) 05:22:51
#include<stdio.h>

int sub(int x,int *y)
{
x = x + *y;
*y= x + *y;
}

main()
{
int a,b;

a = 3;
b = 2;

printf("a=%d b=%d",sub(a,b));

return 0;
}
798デフォルトの名無しさん:2005/07/13(水) 05:29:17
情報処理試験の問題をCで書き直してみたのですが、

追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。
という警告が出ます

仮引数xは値呼出し、yは参照呼出しにしたいんですけど。。

すいませんが、詳しい方、ちょっと手伝って下さい
799デフォルトの名無しさん:2005/07/13(水) 05:31:52
>>798
そか。がんがれ。
800デフォルトの名無しさん:2005/07/13(水) 05:43:08
訂正です
printf("a=%d b=%d",sub(a,&b));
に、変更したのですが まだうまくいきません

最終的に、a = 3, b = 7 にしたいのですが
801デフォルトの名無しさん:2005/07/13(水) 05:49:02
「うまくいきません」じゃなくてさ…
802デフォルトの名無しさん:2005/07/13(水) 05:49:27
>>799
できました
sub(a,&b);
printf("a=%d b=%d",a,b);

有難うございました
803デフォルトの名無しさん:2005/07/13(水) 05:49:37
情報処理試験の問題作成者って楽な仕事だな。
俺もやりたい。
804デフォルトの名無しさん:2005/07/13(水) 05:50:40
お前は試験官
805デフォルトの名無しさん:2005/07/13(水) 07:11:56
>>788
例えば最上位ビットを切り捨てれば絶対値が取れるのは割りと有名
最上位だけ1でxorしたら符号反転したことになる

もっとも>>783の質問の意図はわからん。そういうことがしたいのかな?
806デフォルトの名無しさん:2005/07/13(水) 09:36:51
>>783
double サイズ分、char に見立てて xor かければいいだけだろ?
807東海大学前:2005/07/13(水) 10:11:42
プログラミング初心者なのですが、「別に保存してあるデータから、数の総和とそれぞれの平均を計算し、表示する。という問題で二つの数字のどちらも60のを合格者として、
その人数を表示し、60以上の数字を合格者として、その人数を表示する。」という問題が教科書にあったのですが、まだ始めたばかりなのでよく分からないのでよかったら教えてください。
808デフォルトの名無しさん:2005/07/13(水) 10:14:14
>>807
ぼるじょあがC/C++の宿題を片づけますYO! 47代目
http://pc8.2ch.net/test/read.cgi/tech/1120522752/
809デフォルトの名無しさん:2005/07/13(水) 12:00:51
>>805
最上位ビットを反転すると符号反転になる?
int でそれやるとぜんぜん違う値になるんだけど、浮動小数点ってそうなの?
810デフォルトの名無しさん:2005/07/13(水) 12:03:04
>>809
そう、なる。だから浮動小数にはマイナスゼロ(0x800000…)がある。
811デフォルトの名無しさん:2005/07/13(水) 12:06:47
普通に演算子使ってもそういうコードが吐かれるんじゃないの?
812デフォルトの名無しさん:2005/07/13(水) 12:12:47
>>811
符号反転なら浮動小数命令が使われる場合もある(not a number例外がほしいなど)
絶対値だとCに演算子が無いんだな、これが
813409:2005/07/13(水) 12:13:42
>>807
宿題スレへ行け。
814デフォルトの名無しさん:2005/07/13(水) 12:21:52
>>812
そっか絶対値か。なるほど。
815デフォルトの名無しさん:2005/07/13(水) 12:26:57
>>810
なるほどおもしろいな。
たしかに浮動少数は、固定長の値みたいに2の補数表記にしたからといって演算上のメリットは乏しいもんな。
816デフォルトの名無しさん:2005/07/13(水) 12:31:33
Cで浮動小数の絶対値取りたいなら、IEEEのフォーマットに合わせた
ビットフィールドとの共用体を定義して、最上位に代入する形で
実現できる。これもよくやる手だよ
union{
float f;
struct{
int s:1;
int e:8;
int n:23;
};
};
sを消せばfの絶対値が取れる
817デフォルトの名無しさん:2005/07/13(水) 12:33:17
>>810
データとしてはあり得るが、値としてはないんじゃないか。
IEEE754では-0.0は+0.0にされちゃうんじゃなかったっけ?
818デフォルトの名無しさん:2005/07/13(水) 12:35:25
>>816
処理系依存だし・・・普通にfabs使えよ・・・。
819デフォルトの名無しさん:2005/07/13(水) 12:36:11
そのへんはよく知らないが、実際マイナスゼロをプロセッサに
突っ込んでもおかしくならない。
820デフォルトの名無しさん:2005/07/13(水) 12:39:29
>>818
float f;
if(f<0)f=-f;
と書くと fabs使ってくれるコンパイラと処理系もあるかもしれん。

まあ、Cでやるならビットフィールド使うにしても、もう一枚マクロ着せるか
821デフォルトの名無しさん:2005/07/13(水) 12:43:11
>>820
fabsは浮動小数ASM命令の方ね
822デフォルトの名無しさん:2005/07/13(水) 12:45:43
>>820
でも memcpy とか memset とかは、扱うサイズが小さい場合は関数呼出にもかかわらず最適化されて
インライン展開(というかストレートライン展開?)されることもあるよ。
そういったことも全て処理系依存なんだから、極力見やすいコードを書く方がいいと思われ。
# テクニックとして知っていることはいいことだけど
823デフォルトの名無しさん:2005/07/13(水) 12:49:21
そだね
824デフォルトの名無しさん:2005/07/13(水) 16:17:12
>>809
負整数の表現方法は3つ規定されている。
・2の補数
・1の補数
・符号と絶対値
最後の方法を採ってる処理系なら符号反転するが、そんな処理系は滅多にない。

浮動小数は普通は上位から順に符号ビット、指数ビット(列)、仮数ビット(列)となってるから
最上位を反転させれば符号が逆になる。
825デフォルトの名無しさん:2005/07/13(水) 18:34:10
void test1( int limit, ... ) {
va_list ptr;
va_start( ptr, limit ); // 間違ってるかも
test2( 2, ??? );
}
void test2( int limit, ... ) {
// 4. 5 と表示
}
main() {
test( 2, 4, 5 );
}
意味だけ汲み取っていただけると幸いです。
こんな感じで可変長引数を宣言したとして、test1 の 可変長引数を test2
に引き継ぐにはどうすればいいのでしょうか?
826デフォルトの名無しさん:2005/07/13(水) 18:38:21
>>825
CFAQへ。
827デフォルトの名無しさん:2005/07/13(水) 18:38:46
>>825
できるのか?
インラインアセンブラ使ってjmpするくらいしか思いつかん。

例えばprintfなら展開された後の配列を受け取るvsprintfみたいなのに
処理を引き渡すけど、そういうんじゃ駄目なのかな?
828デフォルトの名無しさん:2005/07/13(水) 18:43:42
C言語をはじめたばかりであまりわからないのですが、 
ビットシフトはなんの役に立つのでしょうか? 
829デフォルトの名無しさん:2005/07/13(水) 18:47:39
>>828
友達いないの?そんなにさびしい人生おくってるの?
氏ねば?
830デフォルトの名無しさん:2005/07/13(水) 18:51:38
>>829
よっぽどストレスのたまる人生をおくってるようで。
831デフォルトの名無しさん:2005/07/13(水) 18:52:02
まったく同じことどっかに書いてるけど、自動書き込みロボットとか
832デフォルトの名無しさん:2005/07/13(水) 19:39:02
>>828
画面イメージをビットパターンで持っているとき
横スクロールに使える
833デフォルトの名無しさん:2005/07/13(水) 19:59:50
暇つぶしに FAQ 日本語訳呼んでたけど、

15.10:
よって va_arg(argp, float);と書くのは常に誤りである。
かわりに va_arg(argp, float)と常に書かなければならない。

ってあったけど、どう違うの??
834デフォルトの名無しさん:2005/07/13(水) 20:10:32
それ見ただけでクオリティーが分かろうってもんだ
835デフォルトの名無しさん:2005/07/13(水) 20:11:47
836デフォルトの名無しさん:2005/07/13(水) 20:43:28
>>833
可変長引数にfloatは無い。
値はdoubleに成り上がってスタックに取り付くのだよ。
837デフォルトの名無しさん:2005/07/13(水) 23:12:58
【蓋を空け】ROLEX究極のコピー【確認せよ】
http://hobby8.2ch.net/test/read.cgi/watch/1121261135/l50
838デフォルトの名無しさん:2005/07/14(木) 01:30:23
aが入力されると1が出力されて
bが入力されると2がしゅ(ry

これはどうやればいいのかご伝授願います
839デフォルトの名無しさん:2005/07/14(木) 01:34:52
>>838
main() { int c; while((c = getchar()) != EOF) putchar(c - 'a' + '1'); }
840デフォルトの名無しさん:2005/07/14(木) 01:47:09
>>839
即レスthxです
aが入力されるとプログラム上ではc=1と入力されてるはずですが
if (c==1) printf ("てst");
これを付け加えてみた所、正しく表示されませんでした

また、aを入力すると 1レ と表示されましたがこれでよろしいのでしょうか?
841デフォルトの名無しさん:2005/07/14(木) 01:49:18
>>840
あれじゃ所詮数文字しか出せないからな。
842デフォルトの名無しさん:2005/07/14(木) 02:51:28
>>840
レは多分LFが化けたんだろう
a->1という仕様は>>839で満たされている。
他に要求があるんならもっと仕様をはっきりさせろ。
843デフォルトの名無しさん:2005/07/14(木) 02:59:07
イタタタ
844デフォルトの名無しさん:2005/07/14(木) 08:35:15
>aが入力されるとプログラム上ではc=1と入力されてるはずですが
? そうなのか? c=='a'じゃないの?
845デフォルトの名無しさん:2005/07/14(木) 18:38:12
C言語の事で聞きたいのですが。
スタック構造を使って逆ボーランド記法をプログラムして、プッシュとポップを
それぞれ関数で書くのは、どうやってやったらいいですか?
教えてください〜
846デフォルトの名無しさん:2005/07/14(木) 18:41:23
>>845
何がわからないのか、もっと具体的に。
と言うか、他の言語ならわかるのか?と小一時間(ry
847デフォルトの名無しさん:2005/07/14(木) 18:45:16
もしかして:逆ポーランド記法
848デフォルトの名無しさん:2005/07/14(木) 19:37:28
>>845
マルチ乙。宿題スレで回答があるようだぞ。
849デフォルトの名無しさん:2005/07/14(木) 20:41:07
                         .,Å
                      .r-‐i'''''''''''i''''‐-、
                    o| o! .o  i o !o
                    .|\__|`‐´`‐/|__/|
                     |_, ─''''''''''''─ ,、 /
                    、-'      u   -、  
                  / U          0 \
                 /          /     i
                 |   ● ,,.   .,, ●      | 
      __   .      !    (_人__)        ノ
  /´ ̄       `!.      丶_   u        U ノ
  |  `にこ匸'_ノ .       '-、、,,,,,,_______,,,,,,、、-'
  ノ u  {                 _.. -―| :{   ,/ /   \
. / l   | __  / ̄ ̄`>'´   ノ'    ´ {、    \
/ |/     {'´    `ヽ. " ̄\ U `ヽ.    __,,.. -‐丶 u  ヽ
| / ヾ、..  }      u' 〉、    }    `ー''´  /´ ̄ `ヽ '" ̄\
! :}  )「` ノ、     ノ l\"´_,,ニ=-― <´  ヽ{  ノ(   `、  |
l   、_,/j `ー一''"   },  ノ ,  '''''""  \   ヽ ⌒ヾ      v  |
ヽ   _         /   } {. { l ┌n‐く  ヽ/ ``\        ノ
  `¨´    `¨¨¨¨´ ̄`{ 0  `'^┴'ー┘|ヾ    }、 u'   `  --‐r'′ キングヤッタス!!

850デフォルトの名無しさん:2005/07/15(金) 00:21:53
ほとんど同じような処理を行う関数を作る場合、
ふつうに二つ関数を定義するのと、引数とかによって条件分岐させて一つの関数ですませた方がいいのか、
分からないので教えてください。もしかして、好みとか気分の問題になってくるんでしょうかね?
851デフォルトの名無しさん:2005/07/15(金) 00:28:11
>>850
状況による
852デフォルトの名無しさん:2005/07/15(金) 00:37:54
int main(){



return 0; ←の意味を教えてください
}

0を返す、というのは分かるんですが、
返すことでどうなるのか、そこが気になるのです
853デフォルトの名無しさん:2005/07/15(金) 00:42:19
バッチファイルやMakefileで使う
854デフォルトの名無しさん:2005/07/15(金) 00:44:40
>>852
そのCで作ったアプリ・ツールを呼び出す側で使う。
0なら正常終了でエラーがでたら1, 2, 3と数字を増やして返すのが一般的。
855デフォルトの名無しさん:2005/07/15(金) 00:54:23
>>850
実装上の都合で考えるのではなく、その関数を利用する立場で考えるのがいいかと。
例えば利用する側が双方を交互に呼ぶようなら一つの関数で引き数で分けるのがいいし、
同一対象を片方は読み片方は書くなど利用する目的が異なるなら関数を分けるべき。
前者は例えばstrtok()、後者はfread()/fwrite()など。
856デフォルトの名無しさん:2005/07/15(金) 01:10:01
>>850
引数の個数が違うなら素直に分ければいいし
int foo(int flag, BOOL use_flag); // みたいに無理にまとめるのはバカっぽい。
個数が同じならモードや引数の解釈に関する引数をもう一つ追加するのもあり。
どっちでもいいと思えるなら処理が同じということでまとめてしまってもいいか。
857デフォルトの名無しさん:2005/07/15(金) 01:15:41
「実装」ではなく関数の「意味」から考えるべき。
858856:2005/07/15(金) 01:25:01
意味がかけ離れてないってのが前提だけどな。
856はC++のoverloadか分割か程度の判断基準。
さすがにfread/fwriteみたいなのをまとめるかで迷ってはいないだろ。
859デフォルトの名無しさん:2005/07/15(金) 02:15:01
>>850
引数で処理を分ける関数と、それを呼び出す入り口関数を用意するって方法もあるよ。

/* 関数の実装 mode によって処理を分ける */
int FuncImpl(int arg1, int arg2, int mode)
{
 :
}

/* 関数の入り口A */
int FuncA(int arg1, int arg2)
{
 return FuncImpl(arg1, arg2, 0); /* mode=0 で処理本体を呼出 */
}

/* 関数の入り口B */
int FuncB(int arg1, int arg2)
{
 return FuncImpl(arg1, arg2, 1); /* mode=1 で処理本体を呼出 */
}

入り口関数の代わりにマクロを定義してもいいと思うけど、共通ではない処理の一部を入り口関数に追い出すことにより
FuncImpl の実装が完結になったりするから、状況に応じて検討すればいい。
860デフォルトの名無しさん:2005/07/15(金) 03:13:11
>ほとんど同じような処理を行う関数

使う側の都合による
a.ある場所からそれぞれ使う
b.まったく別の場所から呼び出す

a.ならパラメータにより1関数内部で分岐
b.なら別関数
861デフォルトの名無しさん:2005/07/15(金) 03:24:51
>855が書いたことを、自分流に言い直すスレはここですか?
862デフォルトの名無しさん:2005/07/15(金) 03:59:12
>855が書いたことを、自分流に言い直すスレはここです
863デフォルトの名無しさん:2005/07/15(金) 09:22:23
すいません。C言語の変数の宣言と代入式の質問なのですが
char型の一次元配列の内容をコピーして二次元配列に格納したいんですけども
char toranp[13] = {"A","2","3","4","5","6","7",
"8","9","10","J","Q","K"};

char toranp[13][4] = {{"A","2","3","4","5","6","7",
"8","9","10","J","Q","K"},{}};
864デフォルトの名無しさん:2005/07/15(金) 09:27:09
皆さんのような優秀なプログラマは、トランプのカードを配列に入れたいときどのような方法を取られますか?
865デフォルトの名無しさん:2005/07/15(金) 09:39:16
>>864
0〜nまで、順番に選んだカードをランダムに選んだカードと交換していく。
これが完全シャッフルになるという証明もどっかにあった希ガス。
for (i = 0; i < n; i++) {
swap_card(&card[i], &card[rand()%n]);
}
866デフォルトの名無しさん:2005/07/15(金) 09:45:32
>>865
それは値を入れてからの話しで、>>864が訊きたいこととは違うンで無いかい?
867デフォルトの名無しさん:2005/07/15(金) 09:48:46
>>865
投稿してから気づいたよ。
むしゃくしゃしてやった。
いまは反省してる。
868デフォルトの名無しさん:2005/07/15(金) 10:54:20
初心者です。
エラーE2209 インクルードファイル'stdio.h'をオープンできない
どなたか対処法お願い致します。
869デフォルトの名無しさん:2005/07/15(金) 10:54:57
>>850
関数をそれぞれ作って、共通部分だけを別関数にする。
と言う方法もある。
870デフォルトの名無しさん:2005/07/15(金) 10:57:10
>>868
メモ帳で stdio.h というファイルを作れば
そのエラーは解決
871デフォルトの名無しさん:2005/07/15(金) 11:01:54
>>868
コンパイラのインストールに失敗してるんだろ。
ちゃんと環境設定しろ。
872デフォルトの名無しさん:2005/07/15(金) 11:06:50
>>870
サンクス!

873デフォルトの名無しさん:2005/07/15(金) 11:13:35
マイコンとかh8とかに使うCソースをvcでコンパイルしようとしてそんなエラーが出たことがある
874デフォルトの名無しさん:2005/07/15(金) 11:34:51
>>873
半年ROMってからレスしような。
875デフォルトの名無しさん:2005/07/15(金) 12:03:33

2から100までの階乗を計算するプログラムを作れと言われました。
ヒントとして、
「1桁ずつ配列にして考える。
100!でも、高々200桁なので、配列を200個用意して考える。」
というのが与えられている。
ヒントの意味がわかる人は解説してください。
876デフォルトの名無しさん:2005/07/15(金) 12:07:29
>>875
宿題は宿題スレへ。
つーか、ヒントの意味が判らないんだったらプログラミング止めたら?
877デフォルトの名無しさん:2005/07/15(金) 13:17:27
878デフォルトの名無しさん:2005/07/15(金) 15:41:30
>>865
×完全シャッフル
○ランダムシャッフル

完全シャッフルは↓
{0,1,2,3,4,5,6,7,8,9} ---> {0,5,1,6,2,7,3,8,4,9}
879デフォルトの名無しさん:2005/07/15(金) 16:43:06
>配列を200個
>配列を200個
880デフォルトの名無しさん:2005/07/15(金) 16:57:03
出題した教師がアホなだけ。
881デフォルトの名無しさん:2005/07/15(金) 16:59:05
このぐらいのことでアホアホ言ってやんなよ
なんにも出来ない無能だっているんだからな
882デフォルトの名無しさん:2005/07/15(金) 17:31:08
再帰関数が何回呼ばれたかを知るために
関数内でstaticで宣言した変数を使ってるのですが、

その再帰関数が一度結果を出した後、別の機会に再び使うと
前回呼ばれた回数+今回呼ばれた回数になってしまいます

今回の回数だけを知るために
staticで宣言した関数を再び初期化するにはどうしたらよいのでしょうか?
883デフォルトの名無しさん:2005/07/15(金) 17:33:39
再帰から抜けるときにクリアすれば?
884デフォルトの名無しさん:2005/07/15(金) 17:34:52
>>882
関数内static な再帰カウンタを関数外staticに追い出す & カウンタ初期化関数つくる
885デフォルトの名無しさん:2005/07/15(金) 17:39:44
>>883
関数内でクリアしようとすると毎回クリアされてしまう気がするのですが?
と思ったんですがif文使えばできそうな気も。
試してみます。

>>884
ありがとうございます。関数外で宣言すればいいんですね。ちょっとやってみます。

ひょっとしてものすごく馬鹿な質問しましたか?orz
886884:2005/07/15(金) 17:41:59
よーく考えたら 関数内static だから、その値は関数外で利用されないんだよな…
だったら >>883 でいいんでねーの?

入り口で ++ しといて 出口で -- すりゃ 自分自身の再帰のネストが ?段目か判断できるっしょ

# 再帰関数の引数にネスト値ぶっこむのも手か?
# foo(int nest) {
#  ....
#  foo(nest+1);
# }
887デフォルトの名無しさん:2005/07/15(金) 17:42:47
>>882
こういうこと?

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

int fact(int x) {
  static int level = 0;
  int ans;
  ++ level;
  printf("--> %d\n", level);   /* 確認用 */
  if (x <= 0) {
    -- level;
    return 1;
  } else {
    ans = x * fact(x - 1);
    -- level;
    printf("<-- %d\n", level); /* 確認用 */
    return ans;
  }
}

int main() {
  printf("%d\n", fact(10));
  printf("%d\n", fact(10));
}
888デフォルトの名無しさん:2005/07/15(金) 18:18:42
再帰関数の初期化について解決しました。皆様ありがとうございました。
889デフォルトの名無しさん:2005/07/15(金) 18:45:23
>>888
どう解決したのか詳しく。
890デフォルトの名無しさん:2005/07/15(金) 18:53:14
関数内のstatic変数はポインタを返せば外からアクセス出来る。
BoyoのC++本に練習問題で載ってた。解答ページに
「この問題が解けなかった人は本書を読む資格がありません」
て書いてあって、俺は解けたけどむかついた。
891デフォルトの名無しさん:2005/07/15(金) 21:57:38
2次限のx、yの点の集合を与えられて、
その淵を取るようなコードはどうやって書けばいいんでしょうか?
言葉では伝わりにくいのですが、点が大量にあって、
その点の輪郭を取るのです・・・
輪郭の凹凸は不明です。
どうぞよろしくお願いします。
892デフォルトの名無しさん:2005/07/15(金) 22:07:42
>>891
最もy座標の大きい点(P0)を通り、x軸と平行な直線を求める。
直線をP0で固定して、この直縁の傾きを増加させていくと直線がどこか別の点(P1)に触れる。
これで外周の2点が取得できたことになる。
こんどはP1で直線を固定して、さらに傾きを増やしていくと、別の点P3に触れるので、これを次の支点とする。
これを繰り返して、P0まで一周すれば、すべての外周点が取得できるはず。
893デフォルトの名無しさん:2005/07/15(金) 22:09:17
長さ30の数列で0〜4の数を並べるのですが、隣り合う数字の差が1以内というものを作るにはどうすればいいですかね?
例えば100012344343443
みたいなのです。
簡単な質問ですいません
894893:2005/07/15(金) 22:10:20
あ、それを全部探したいんです。
895デフォルトの名無しさん:2005/07/15(金) 22:11:54
なんでそんなもんが探したいんだ?
896デフォルトの名無しさん:2005/07/15(金) 22:20:17
>>893
5進数でインクリメントしながら隣接する桁をチェックして該当するものをストックしていく。
897デフォルトの名無しさん:2005/07/15(金) 22:23:46
5^30の数を調べるには途方も無い時間が掛かりそうだが。
898デフォルトの名無しさん:2005/07/15(金) 22:26:16
>>892
すばやい回答ありがとうです。

それだと凹凸に対応しきれないと思います・・
傾きの増加を正と負にわけてやった場合も、PiのxがPi+1のxと大きい場合と小さい場合で区別がつかなくなるかと・・・
一回やってみます。
899デフォルトの名無しさん:2005/07/15(金) 22:35:41
>>893
0〜4が輪になっていると考え、それが、そのまま、右、左の3命令で数列を動いて行く。
これをSim。すればよい。
900デフォルトの名無しさん:2005/07/15(金) 22:53:32
>>891
例えば与えられた点が
p1(0,0) p2(0,2) p3(2,2) p4(2,0) p5(1,1) だとすると、

p1-p2-p3-p4-p1
p1-p2-p3-p4-p5-p1
p1-p2-p3-p5-p4-p1
p1-p2-p5-p3-p4-p1
p1-p5-p2-p3-p4-p1
の何れも答えになりうる。条件を追加しなければ解答不能だと思われ。
901デフォルトの名無しさん:2005/07/15(金) 23:03:46
>>900
点の集合を全て含む面積最小の直線で出来た図形でどうじゃ。
902デフォルトの名無しさん:2005/07/15(金) 23:07:36
K&Rって、読まないといけないのかな?
簡単な入門書から難しい技術書まで、
C言語関係の本は腐るほどたくさん読んできたが、
なぜかK&Rだけは読んだことがない。

C言語厨のあいつに怒られたよ・・・
903デフォルトの名無しさん:2005/07/15(金) 23:08:20
>>898
凹の形を含めると一意に決まらないんじゃね?
904デフォルトの名無しさん:2005/07/15(金) 23:09:51
>>902
読んだ方が良い。読まなくてもよい。
K&R は ANSI な内容だから
規格書を読んだ方が得るものが多いかも
905デフォルトの名無しさん:2005/07/15(金) 23:11:26
>>902
>C言語関係の本は腐るほどたくさん読んできた
なら別に読まなくてもいいだろ

そいつに借りてよめばいいんじゃまいか
906デフォルトの名無しさん:2005/07/15(金) 23:11:40
891です。返答ありがとうです。

>>900
すいません・・・条件の加え方がわかりません・・・
補足で与えられる点は1万点以上で、できあがる輪郭は一個のみです。

>>901
考えてみます。よさげです
907デフォルトの名無しさん:2005/07/15(金) 23:15:45
>>893  30桁だとメチャクチャ多いぞ。 10桁で4万弱だった。30桁は今処理中だが、なかなか終わらん。
#include <stdio.h>
#define LEN 30
#define NUMMAX 4
void r(int *a, int index, int end)
{
  int i;
  if( index == end )
  {
    for(i = 0; i != end; ++i) printf("%d",a[i]);
    putchar('\n');
  }
  else
  {
    int left = a[index-1];
    for(i = 0; i < NUMMAX+1; ++i)
    {
      if( index != 0 && 1 < (left > i ? left - i : i - left)) continue;
      a[index] = i;
      r(a, index+1, end);
    }
  }
}

int main()
{
  int a[LEN] ={0};
  r(a,0,LEN);
  return 0;
}
908デフォルトの名無しさん:2005/07/15(金) 23:18:51
891です

>>903
人目にみて、形を作れるので、できないことはないと思うのですが・・・
ちょっと困惑してます、すいません。。。
909デフォルトの名無しさん:2005/07/15(金) 23:19:34
腐るほど読む機械があったのに、未だに読んだことがないというのはもはや運命
これからも読まない方がいいかと思われ
910907:2005/07/15(金) 23:20:45
10桁で、約4万件
15桁で、約100万件
でした、30桁だと何件になるんだ? まだ終わらん。
911デフォルトの名無しさん:2005/07/15(金) 23:25:26
>>908

輪郭だよな?

・  ・
 ・
・  ・

これに対しては
┌─┐
| ・ |
└─┘

┌─┐
| <
└─┘

のどっちも会になるんじゃないか?
さらに回転したものも解になるよな?
912デフォルトの名無しさん:2005/07/15(金) 23:27:46
さらに、911の例を発展させて、内部の点を増やしたら、
輪郭の「へこませ方」はいくらでも増えていく。
913デフォルトの名無しさん:2005/07/15(金) 23:28:31
解は
×
だけですが?
914デフォルトの名無しさん:2005/07/15(金) 23:29:52
>>913
輪 郭 !
915デフォルトの名無しさん:2005/07/15(金) 23:32:17
解は
×
だけですが?
916デフォルトの名無しさん:2005/07/15(金) 23:34:39
>>915
すべての点を結んだときの線分の長さの合計が最小になるものを求めよ。
なら、それだね。
917デフォルトの名無しさん:2005/07/15(金) 23:36:28
適当に考えた。
1. 適当な三点を選んで三角形を作って三角形の集合に入れる。
2. 三角形の集合と頂点の集合から、「一番近い」三角形と頂点の組を求める。
3. 求めた三角形と頂点から新しい三角形を作って三角形の集合に入れる。
全ての頂点を使い切るまで、2-3を繰り返す。
918デフォルトの名無しさん:2005/07/15(金) 23:37:06
馬鹿ですね。
919デフォルトの名無しさん:2005/07/15(金) 23:51:05
>>911
それの解は上かと・・・
もっと点があるもので考える方向でして・・・

>>912
意味がよくわかりません。点を増やせばパターンはしぼれませんか?
・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
・・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
・・ ・ ・ ・ ・ ・ ・ ・
・ ・ ・ ・ ・ ・ ・・ ・ ・
・   ・ ・ ・ ・・・・
・ ・ ・ ・ ・
・ ・ ・

なら解はでませんか?

>>917
思考します・・
920デフォルトの名無しさん:2005/07/15(金) 23:52:27
スペースが_no

面積が最小の方法も募集中・・・
921デフォルトの名無しさん:2005/07/15(金) 23:56:51
>>919
お前の文章からは何が解なのか理解できない。
922デフォルトの名無しさん:2005/07/15(金) 23:58:18
>>919
数学板にでも行ってくれ
はっきりいって迷惑だ
923デフォルトの名無しさん:2005/07/15(金) 23:59:15
っていうかやりたいことの定義をはっきりさせてから質問してほしいな。
924デフォルトの名無しさん:2005/07/16(土) 00:01:12
>>919
何故上なのだ?
じゃぁ、☆を構成する10の点が与えられたときは、
外周の五角形が解なのか?
それとも星形が解なのか?

こういう単純な例で、理論的に解を導いて見せて
くれないと、この問題は回答不能だ。

上だと思います、じゃ分からん。
925デフォルトの名無しさん:2005/07/16(土) 00:02:14
数学板ですか、すいません。
Cのプログラムの課題だったので・・・
お騒がせしました。
926デフォルトの名無しさん:2005/07/16(土) 00:02:43
数学板行っても同じだと思うがな。
927デフォルトの名無しさん:2005/07/16(土) 00:04:10
宿題は宿題スレへ。
つか、課題なら授業中にやり方教えてもらってるだろ。
928デフォルトの名無しさん:2005/07/16(土) 00:09:21
初心者質問スマソ

char **array=(char**)malloc(sizeof(char *)*a);

for(i=0;i<a;i++){

array[i]=malloc(sizeof(char)*a);

}

このように動的に2次元配列を得たとき、
割り当てた全てのメモリを開放するには
free(array);でいいのですか?
(このように書かれたページがあったのですが)
929デフォルトの名無しさん:2005/07/16(土) 00:10:10
>>928
ダメだ
930デフォルトの名無しさん:2005/07/16(土) 00:10:34
>>924
☆なら☆が答えです。
正方形の例は、あまりに点が少なすぎて、自分でもよくわかりませんでした。
点は1万点以上用意されます・・・

>>927
やり方はスネーク法と言われたのですがぐぐってもわからなかったので
自前でやろうかと思いました・・・
931デフォルトの名無しさん:2005/07/16(土) 00:11:51
>>930
うわぁ、方法を出されてるくせに情報後だしかよ
あまりにも酷すぎる
932デフォルトの名無しさん:2005/07/16(土) 00:12:11
>>930
だから、何故そうなのかを言えといっているだろうが・・・・
なぜ五角形ではなく星なんだ? 直観か? お前の直感を表示するプログラムなのかあぢえうぃdがwふじこわヴぇ
933デフォルトの名無しさん:2005/07/16(土) 00:19:34
>>925
これ良い問題だと思うが。
差し支えない範囲でいいから
学年、専攻、科目名を教えてくれないか?
934デフォルトの名無しさん:2005/07/16(土) 00:22:33
>>930
なんとなく言わんとしていることは分かる気もする。"が"、もう少し他人に
間違いなく自分の質問を理解してもらえる文章を書くべきだな。
なお、数学的には簡単だけど、効率よくそれをやるための質問ならこの
板で問題ない。"が"、宿題スレ向きかな。
935デフォルトの名無しさん:2005/07/16(土) 00:26:25
>>931
すいません・・・忘れてました・・・

>>932
ああっと・・・すいません
直感ではなく輪郭で考えたんですが・・・・

>>933
2年、専攻?ってよくわかりません、科目はC言語です
です。

>>934
でなおします。。。
936デフォルトの名無しさん:2005/07/16(土) 00:28:26
いいから輪郭の定義をくれ。
937デフォルトの名無しさん:2005/07/16(土) 00:29:42
それより、sageることを覚えて。
938デフォルトの名無しさん:2005/07/16(土) 00:30:32
いままでのやりとり見ればわかるだろ
本人が一番わかってない事を。
いつまでたっても矛盾した定義しか出てこない。
939デフォルトの名無しさん:2005/07/16(土) 00:35:20
>>930
http://upld2.x0.com/data/upld7960.gif
解を求めるための条件づけをしなければ、解はいくらでもあるでしょ
940郵政公社:2005/07/16(土) 00:38:11
構造体まで終わりました
941デフォルトの名無しさん :2005/07/16(土) 00:39:29
実験で使う器具名、その製造会社・型番・製造番号を入力し
それをループさせて器具名でexitと入力されたらそこで終了というプログラムを作りたいのですが
どうやって終了させれば良いのか分かりません。
どなたか教えてもらえないでしょうか?

char data[4][20];
while(data[0] != "exit"){
printf("器具名を入力してください(exitで終了)->");
scanf("%s",data[0]);
printf("製造会社を入力してください->");
scanf("%s",data[1]);
printf("型番を入力してください)->");
scanf("%s",data[2]);
printf("製造番号を入力してください->");
scanf("%s",data[3]);
printf("\n");
}
942デフォルトの名無しさん:2005/07/16(土) 00:42:49
宿題をここで聞くな。
943デフォルトの名無しさん:2005/07/16(土) 00:43:57
マルチなので放置
944933:2005/07/16(土) 00:57:32
2年って大学か高校かでずいぶん違うが、、、、専攻がわからないって事は高校かな。
んで、>>933を書いた時点で>>930を見落としてた。
ただ授業中に出されたヒントを聞き落としているだけ、のように思えてきた。
945デフォルトの名無しさん:2005/07/16(土) 01:03:07
質問に聞いた時は輪郭を取る具合で、スネーク法っていう例から調べてみてと。
凸とは限らないとも言われました。
忙しいらしく、詳しくは聞けませんでした・・・

>>936
自分でも不明になってきましたごめんなさい・・・

>>939
そうですね・・・わからないので質問にいきますね・・・

>>942
ごめんなさい・・・
946デフォルトの名無しさん:2005/07/16(土) 01:15:00
w関数の外に出して事前にクリアするか
depthをみてクリアする

int foo(int depth)
{
 if(depth==0) counter=0;
 ...
 foo(depth+1);
}

main(){ foo(0); }
947デフォルトの名無しさん:2005/07/16(土) 01:28:15
>>893,907
1桁 5件
2桁 13件
3桁 35件
4桁 95件
5桁 259件
6桁 707件
7桁 1931件
8桁 5275件
9桁 14411件
10桁 39371件
11桁 107563件
12桁 293867件
13桁 802859件
14桁 2193451件
15桁 5992619件
16桁 16372139件
17桁 44729515件
18桁 122203307件
19桁 333865643件
20桁 912137899件
21桁 2492007083件
22桁 6808289963件
23桁 18600594091件
24桁 50817768107件
25桁 138836724395件
26桁 379308985003件
27桁 1036291418795件
28桁 2831200807595件
29桁 7734984452779件
30桁 21132370520747件
948デフォルトの名無しさん:2005/07/16(土) 05:52:18
CSVファイルなのですが、うまく読み込ませるにはどうしたらよいのでしょうか?
fscanf()系だと','は区切り記号と認識してくれないのですが・・・
949デフォルトの名無しさん:2005/07/16(土) 06:11:26
一文字ずつパースしとけ
950デフォルトの名無しさん:2005/07/16(土) 08:05:55
>>948
fgets()で読み込んでから、strtok()なりsscanf("%[^,]s")なりを駆使してばらせ。
間違っても>949みたいなアプローチから入るな。
#とは言っても、csvの仕様によっては結局一文字ずつ解釈する必要があるんだけどね。
951デフォルトの名無しさん:2005/07/16(土) 10:04:30
>>948
ttp://cm.bell-labs.com/cm/cs/tpop/code.html
の2ndのやつ。
マルチスレッド非対応。大域変数使いまくり(こら)
一文字ずつパースの分類になると思う。
952デフォルトの名無しさん:2005/07/16(土) 13:10:20
63 :csv ◆d4Q1dM/8Ps :04/04/11 15:21
作ってみた(age)
/* CSVデータ(数値)分割 */
/* ・maxItem迄、item[]に格納 */
/* ・分割できた個数を返す / -1は分割NG */
int divCSV(const char *src, int *item, int maxItem)
{
char *p;
int n,itemNum=0;
if(src==NULL || item==NULL || maxItem<1) return -1;
do{
if((p=strchr(src,','))) *p='\0';
n=sscanf(src, "%d", (item+itemNum)); if(p) *p=',';
if(n<1) return itemNum;
++itemNum;
src=p+1;
}while(p && itemNum<maxItem);
return itemNum;
}


こんなの見つけたけどsrc書き換えちゃってるねw
953デフォルトの名無しさん:2005/07/16(土) 13:12:04
長い処理の待ち時間の間にコマンドプロンプトの画面上に
\→-→/→| みたいにくるくる回るのを表示したり、プログレス
バーみたいなのを描画したりしてるのはどうやってるのでしょうか。
stdoutに書き出すのと違って、前に出力したやつの上に重ねて(?)
出力してるような感じなんですが、うまくいえなくてスイマセン
954>>928:2005/07/16(土) 13:31:53
こんな質問しといて遅レス真にスマソ

>>929

やっぱだめですか
一つ一つ開放していくしかないのですね
ありがとうございました。
955デフォルトの名無しさん:2005/07/16(土) 13:50:56
>>953
windowsXPでコマンドプロンプトの場合は
先頭行にいく\r使えばよろし。
\nは改行だからね。
956デフォルトの名無しさん:2005/07/16(土) 14:01:35
>>955
>先頭行にいく\r使えばよろし。
できれば日本語で説明してください。
957デフォルトの名無しさん:2005/07/16(土) 14:52:57
配列の配列を動的に確保するのはどうすればいいのでしょうか?
いろいろ調べたのですがわからなくて、、1次元配列の確保ならわかるのですが。
958デフォルトの名無しさん:2005/07/16(土) 15:04:24
>>957
int * * alloArray2(int size1, int size2)
{
int * * tmp = malloc(sizeof(int *) * size1);
for (int i = 0; i < size1; ++i) {
tmp[i] = malloc(sizeof(int) * size2);
return tmp;
}

void freeArray2(int * * arr2, int size1)
{
for (int i = 0; i < size1; ++i) {
free(arr2[i]);
}
free(arr2);
}
959デフォルトの名無しさん:2005/07/16(土) 15:28:28
>>957-958
こうすると、組み込みの配列みたいに要素が連続し、
freeも戻り値のポインタに対してだけ実行すればいいのでやや楽。
ただし要素数があまりにも多ければ無理かもしれないが。

void **SquareAlloc(size_t size, size_t x, size_t y)
{
    size_t offset = sizeof (void*) * x;
    void **pp = malloc(offset + size * x * y);
    if (pp)
    {
        void **ppIndex = pp;
        size_t i;
        for (i = 0; i < x; i++)
            ppIndex[i] = (char *)pp + offset + size * y * i;
    }
    return pp;
}
960デフォルトの名無しさん:2005/07/16(土) 15:47:52
malloc(sizeof(int *) * size1); とか malloc(sizeof(int) * size2); がアホ
961デフォルトの名無しさん:2005/07/16(土) 16:07:34
第1引数で読み込んだテキストファイルの「半角スペース」「全角スペース」「タブ」「改行」を取り除いて
第2引数で指定したファイルに保存するプログラムなんですが
最後にどうしても変な一文字が入ってしまいます。
whileがいけないと思い、do-whileにしたのですがだめでした。
どうやれば消えるでしょうか?どなたか教えてください。

#include<stdio.h>
int main(int argc, char *argv[])
{
int txt;
FILE *before, *after;
before = fopen(argv[1], "r");
after = fopen(argv[2], "w");
do
{
txt = fgetc(before);
if(txt == ' ' || txt == ' ' || txt == '' || txt == '\n') continue;
fputc(txt, after);
fputc(txt, stdout);
}
while(!feof(before));
fclose(before);
fclose(after);
return 0;
}
962デフォルトの名無しさん:2005/07/16(土) 16:24:12
>>961
ところで全角スペースは1バイト文字じゃないからそれでは判定できない。
963958:2005/07/16(土) 16:29:25
>>961
ストリームからの入力は、fgetc()がEOFを返すまでループするのが常道。
feof()を調べるまでもない。

>>960
アホでない例を所望します。
964961:2005/07/16(土) 16:34:50
>>962
早速の返信ありがとうございます。
全角は判定しませんでした。

全角なしでお願いします
965961:2005/07/16(土) 16:43:46
>>963
feof()を取り除いて作り直したらできました。

ありがとうございました。
966デフォルトの名無しさん:2005/07/16(土) 18:14:06
>>959
それdoubleの配列でも大丈夫か?整列しない気がするんだが
967デフォルトの名無しさん:2005/07/16(土) 18:15:50
>>952
""での引用やカラム中の改行にも対応してないのに無駄に長く汚い
ま、糞ソースだな
968デフォルトの名無しさん:2005/07/16(土) 18:25:41
class Class{
public:
  void method(int (*array)[10] ){}
}



class Class{
public:
  void method(int ???);
}

void Class::method(int (*array)[10]){}

のように書き換えたいのですが???部分はどのように書いたらよいのでしょうか?
969デフォルトの名無しさん:2005/07/16(土) 18:28:52
>>968
好きなように書いてください。???部分をどのように書いてもコンパイルできませんから。
970デフォルトの名無しさん:2005/07/16(土) 18:31:40
>>969
セミコロンを2つほど書き忘れたのは気がつきましたが、
他にもまずいところがありますか?
971デフォルトの名無しさん:2005/07/16(土) 18:33:31
>>970
>1
972デフォルトの名無しさん:2005/07/16(土) 18:45:11
   〃∩ ∧_∧
   ⊂⌒(  ・ω・)  はいはいわろすわろす
     `ヽ_っ⌒/⌒c     
        ⌒ ⌒

(´〜`;)ああ、イヤダイヤダ。
夏厨が湧き出しちゃったよ。
これから9月まで2ch全体が
つまらなくなるだよな。さっさと
夏終われ。ガキは学校でクセエ
汁垂らして部活でもやってろ。
あーあー、ウザイウザイw
973デフォルトの名無しさん:2005/07/16(土) 19:15:10
2chぐらいしか楽しみのないニートって大変だな……
ガキ相手に「ボクの遊び場を荒らすな〜!」ってか?
974デフォルトの名無しさん:2005/07/16(土) 19:18:19
void method(int ???);
void method(int (*array)[10]){}
と書けば答えてもらえたんですかね?

>>969
>>971
的確なアドバイスをありがとうございました。
>>972
笑いを提供できて幸いです。
975デフォルトの名無しさん:2005/07/16(土) 19:28:45
>まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう

C++とCは違う
976ikaikaikajika:2005/07/17(日) 00:52:48
以下のプログラムはお茶運びロボットのプログラムなのですが、これを
改良してほしいんです。 これは お茶を置いたら タッチセンサーが感知して
ロボット発進、そしてお茶を持ってるときに 障害物を 光センサーが感知
すると 止まり、お茶を取られると、180度回転して、帰るのですが、帰る途中に
障害物を光センサーが感知すると 避けて行くように してほしいんですが?
どうでしょうか?



977デフォルトの名無しさん:2005/07/17(日) 00:56:02
int main()
{
return 0;
}
978デフォルトの名無しさん:2005/07/17(日) 01:59:36
>>955
ありがとうございます。なんとかできました。
979デフォルトの名無しさん:2005/07/17(日) 04:35:36
>>976 >>977
久々にワロタ
980デフォルトの名無しさん:2005/07/17(日) 17:08:11
カンマで区切られたデータを構造体に格納するプログラムってどうすればいいんでしょうか?
abc,def,ghi,jikl
mno,ofi,jik,ji,
.
.
以下延々という感じなのですが

リダイレクションを使って標準入力としていいようなのですが、格納の仕方がわかりません。
981デフォルトの名無しさん:2005/07/17(日) 17:15:49
scanf
982デフォルトの名無しさん:2005/07/17(日) 17:56:56
>>980
fgets() + sscanf() w/ "%[^,]"
983980:2005/07/17(日) 18:03:42
>>982
ありがとうございます。あのW/ってどういう意味でしょうか?
984デフォルトの名無しさん:2005/07/17(日) 18:47:31
>>983
with
985デフォルトの名無しさん:2005/07/17(日) 19:01:52
T
986デフォルトの名無しさん:2005/07/17(日) 20:19:00
>>980
>982
関数fgetsと、"%[^,]"を伴った関数sscanf。
987デフォルトの名無しさん:2005/07/17(日) 23:10:36
配列の初期化で0クリアする場合に
a[5] = { } とするのはベテランの人から見てどうなんでしょうか。

ネットで検索したところ a[5] = { 0 }
988987:2005/07/17(日) 23:12:48
ネットで検索したところ a[5] = { 0 } と書くのはよく見かけたんですが
専門学校の先生には「見た目がよくない」と言われました。
普通に使う書き方なんでしょうか。
989デフォルトの名無しさん:2005/07/17(日) 23:14:06
memset
990デフォルトの名無しさん:2005/07/17(日) 23:21:03
先生に訊き返せよ
金払ってんだろ?
991デフォルトの名無しさん:2005/07/17(日) 23:25:08
>>987
a[5] = { }; は規格で認められているのか?
a[5] = {0}; で通してきたぞ俺は。

>>989
memse は初期化と言いません
992デフォルトの名無しさん:2005/07/17(日) 23:28:30
俺ならaがchar/wchar_t配列ならchar a[5] = ""; wchar_t a[5] = L"";にする。
ほかはしかたないから{0}にするけど。
993デフォルトの名無しさん:2005/07/17(日) 23:28:56
memse t⊂(`Д´)
994987:2005/07/17(日) 23:33:52
今慌てて試したら = { } は動きませんでした、勘違いしてたみたいです。
= {0} のほうは普通に使われるみたいですね。
将来人に見せることになると考えると「見た目が悪い」という言葉が気になったので。
995デフォルトの名無しさん:2005/07/17(日) 23:42:55
見た目が悪いと言った人間に聞くのが一番かと
996デフォルトの名無しさん:2005/07/17(日) 23:47:10
>>987
適所適材。
「見た目が良い初期化」なんか見たことない。
その教員は鏡でも見てたんだろう。
997デフォルトの名無しさん:2005/07/17(日) 23:48:45
1000ならC滅亡
998デフォルトの名無しさん:2005/07/17(日) 23:49:18
>>994
君は先生に質問し、どのような方法であれば見た目が良い方法なのか
ここに報告する義務がある
このスレが終わるまでに報告しなければならない
これは命令だ
999デフォルトの名無しさん:2005/07/17(日) 23:59:39
gccは={}通るぞ
1000デフォルトの名無しさん:2005/07/18(月) 00:01:45
gcc拡張かよ
1000get
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。