[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 11:53 / Filesize : 185 KB / Number-of Response : 845
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 15



1 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:14:52 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 14
pc11.2ch.net/test/read.cgi/tech/1181735298/


教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 91代目
pc11.2ch.net/test/read.cgi/tech/1182607405/

129 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:13:40 ]
unsigned char にキャストして sprintf で %%%02X すりゃいいと思うけど、
sprintf を使う場合はバッファオーバーフローに注意だな。
別にこの程度なら自前で変換してもいいんだけどね。

130 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:32:11 ]
>>126-129
ありがとうございます、>>128さんの言うとおりでした
>>129さんを参考にしてやってみます

131 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:47:25 ]
質問です。
C言語って色々命令作れる前に、最初からhファイルを読み込んで使える、
いわばインストール時に標準搭載されている命令ってあるじゃないですか。studio.hのprintfやmath.hのsqrtとか
ああいう命令を分かりやすくどんな用法で使えばいいのかが全て網羅してある
本またはサイトはありますか?

132 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:49:28 ]
>>131
標準ライブラリ関数でぐぐれ

133 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:53:42 ]
>>131
JIS

134 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 15:15:53 ]
>>131
命令て。
まず入門書くらい買え。

135 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 15:16:24 ]
ああ、「本または」って書いてあるね。すまんすまん。
じゃ、「作ってわか(ry

136 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 17:01:07 ]
>>132-135
ありがとうございます。参考になりました

137 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:05:46 ]
文字列の数字を消したいプログラム(例えばAB1C9をABC)をつくりたいんですけど
下のソースではうまく消えません。もしよければどのようにすればいいか指導お願いします。
#include <stdio.h>

void kesi(char *str){
char c;

while(*str!='\0') {
c=*str;
if(c<'0'||c>'9'){ //数字でないならば
*str=c;
}
str++;
}
}
int main(void){
char str[100];

scanf("%s",str);

kesi(str);
printf("%s",str);

return 0;
}



138 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:12:34 ]
消した分だけ後ろの文字列を前に詰めないといけない。
void kesi(char *str) {
  char *to = str;
  while (*str != '\0') {
    char c =*str;
    if (!isdigit(c)) {
      *to = c;
      to++;
    }
    str++;
  }
  *to = '\0';
}

139 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:23:48 ]
138さん返信ありがとうございます。 char *toとしてますが、
またポインタ宣言しなければ、ダメなんでしょうか??
あと初心者なのでisdigitとかまだよくわからないです…。もしよければアドバイスおねがいします

140 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:27:42 ]
宣言しなきゃコンパイルできないし、isdigitはググれば山ほど出てくる

141 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:30:57 ]
137のソースではただのchar c; としてポインタで宣言しないでも
コンパイルは通ったんですけど…なぜポインタを使うのかよくわからなくて…。

142 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:32:55 ]
138では、詰める前の文字を指すのにstrを使い、
詰めた後の文字を指すのにtoを使っている。

143 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:39:59 ]
ポインタを使わないと、どこに文字をいれていいかわからないから

144 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:42:04 ]
>>142さん、わかりやすかったです!ポインタの理由が理解できました!

145 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 21:15:37 ]
>>98
でも有名な話ですよね。

146 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:02:40 ]
キューのプログラムで
#define QUEUE 5
static int i = 0;
i = (i+1)%QUEUE;
で次の添字が得られる
とか書いてあるんですが、よくわかりません。
常にiは0である気がするんですが、どこが間違っています?

147 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:13:33 ]
(0+1) % 5 == 1
(1+1) % 5 == 2
(2+1) % 5 == 3
(3+1) % 5 == 4
(4+1) % 5 == 0
(0+1) % 5 == 1



148 名前:デフォルトの名無しさん [2007/06/28(木) 00:16:59 ]
初期化とキーボード入力以外で文字列を一回で代入する場合はstrcat()しかないですよね?


149 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:21:51 ]
そんなことないよ

150 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:22:37 ]
>>147
ありがとうございます。
ですがもう少し。
a%bってあったら「aをbで割った余り」ですよね?
だとすると、
(0+1)%5 = 1%5 = 0?
ではないのですか?

151 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:23:13 ]
>>149
何がありますか?
教えてください


152 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:23:30 ]
って書いたらわかりました。
スレ汚しごめんなさい。

153 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:23:51 ]
1÷5
1は5で割り切れないので終了。余り 1

154 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:24:31 ]
strcpyとか

155 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:27:32 ]
>>151
strncat,strcpy,ctrncpy,sprintf,sscanf
ざっと思いつくのでこの程度。
あと、可変個引数使うときにある、printfのやつ。
あんま使ったこと無いから忘れたけど、vsprintfだっけ?

156 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:28:03 ]
>>152
どちらさまですか?

157 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:28:28 ]
>>150
おぬしは間違いなくstaticについて理解していない。
なぜstaticが付いているのかを考えるのじゃ



158 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:02:20 ]
質問です。
BASICのgotoみたいな命令はないのでしょうか?

159 名前:デフォルトの名無しさん [2007/06/28(木) 01:02:33 ]
Cで書いてコンパイルしたファイルを人に送ってもその人は実行できないんですか?
というかできなかったのです。一瞬だけ実行されてすぐ消えてしまいます。
どうすればいいかわかりますか?

160 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:05:29 ]
>>158
gotoというそのまんまの命令がある
loop:
printf("test");
goto loop;
みたいに使う

>>159
コマンドプロンプト経由で使えばおk

161 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:06:30 ]
あ、ちなみにif文で条件を満たしていなかったらmainの一番上まで戻るというのがやりたいのですが・・・・

162 名前:デフォルトの名無しさん [2007/06/28(木) 01:10:52 ]
>>160
そのファイル名のみを相手のコマンドプロントでコマンドさせるってことですか?

163 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:12:28 ]
構造体とポインタはどちらのほうが理解するのが難しい?

164 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:13:18 ]
>>161
int main(void){
start:
〜いろいろな処理〜
if(条件を満たしていない) goto start;


多分普通の人であれば
int main(void){
do{
〜いろいろな処理〜
}while(条件を満たしていない);

165 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:13:31 ]
おつむのレベルによる。

166 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:14:04 ]
>>162
渡したファイルはexe?
コマンドプロントで、exeのあるディレクトリに移動して実行すればオケ。

167 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:15:06 ]
>>163
一般的にはポインタが難しいと言われる。



168 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:16:06 ]
>>162
1.コマンドプロンプトを起動してもらう
2.コマンドプロンプトにexeファイルをドラッグアンドドロップしてもらう
3.Enterキーを押してもらう

これが一番手軽だと思う

169 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:17:32 ]
>>167
ポインタって何に便利なの?

170 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:18:24 ]
何に便利とか言い出すから一向に理解できないんだろ。

171 名前:デフォルトの名無しさん [2007/06/28(木) 01:19:15 ]
>>166
>>168
ありがとうございました

172 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:20:43 ]
>>169
必要にならないと分かりにくいと思う

173 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:24:36 ]
>>169
Nバイトの構造体配列をソートして並び替えることを考える。
このとき、Nバイトのコピーが頻繁に発生することになる。
構造体に対するポインタの配列として保存していた場合、ポインタのソートで済むことになる。
例えばポインタが4バイト、構造体が100バイト超とかで配列が1000超とかだとすれば
どちらが効率的かはわかるよね?

174 名前:デフォルトの名無しさん [2007/06/28(木) 01:24:45 ]
Cpad for Borland...ってやつで書いてるんですけどexeファイルがありません。
どうすればいいですか?
171と同一人物です

175 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:29:33 ]
>>170
お前がその便利さを知らない、説明できないだけだろ?えせプログラマは
こんなところで質問者をたぶらかしてないで、へちょいプログラマで満足してろよ?

176 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:29:34 ]
>>174
ファイルを保存している場所と同じ場所にexeファイルがあると思われ

177 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:30:55 ]
>>175
へちょくないあなたがへちょい>>170の代わりに答えてあげてください



178 名前:デフォルトの名無しさん [2007/06/28(木) 01:34:22 ]
>>176
あるにはあるのですが、ドラッグアンドドロップはできませんし、
そのディレクトリに移動して 〜.exe と打っても実行されません

179 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:40:02 ]
>>178
コマンドプロンプトって何かわかってるか?

180 名前:デフォルトの名無しさん [2007/06/28(木) 01:42:45 ]
なんか全体的に黒いやつですよね?
わかってるつもりです

181 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:43:02 ]
ja.wikipedia.org/wiki/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88

182 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:45:17 ]
>>180
「notepad」って打ってメモ帳が起動するか?
ドラッグアンドドロップでフルパスが表示されて、エンター押して実行できると思ったんだけどなぁ

183 名前:デフォルトの名無しさん [2007/06/28(木) 01:48:14 ]
>>182
メモ帳はでてきます。
でもファイルをドロップしようとすると○の中に×が入ってるようなのが出てきて
できません

184 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:49:57 ]
もしかしてvistaか?

185 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:50:51 ]
>>183 ちょっwwwwwww伏字エロいwwwwwwwww
ティ○ポの中にオ×コが入ってるようなので とか妄想しちゃうぞwwwww

186 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:51:04 ]
>>183
xpとかだとドラッグアンドドロップできないようになってるのかな?
じゃぁあきらめてフルパス(c:\cpad\test.exeみたいなやつ)を打って実行するべし
入力面倒だけど。

187 名前:デフォルトの名無しさん [2007/06/28(木) 01:54:18 ]
>>186
Vistaですよ。
かなりめんどいってことですね〜〜…
ありがとうございました



188 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:55:23 ]
VistaはD&Dできないのか・・・ ひとつ勉強になった。

189 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:56:12 ]
セキュリティ云々でできなくなったそうだ

190 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 01:57:04 ]
なぁ〜〜に、こうすりゃええがな。XPを仮想PCにインストール。仮想PCでプログラミング
あっ武勇伝、武勇伝、武勇でんでんででんでんっ♪

191 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 02:41:46 ]
ポインタが無かったらprintfすら・・・

192 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 02:43:50 ]
ファイル操作も出来ないね

193 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 03:03:13 ]
そもそもポインタって何?実体は?それが理解できていないとダメ。
ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF

194 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 07:10:08 ]
2つの文字列を指すポインタ(例えばs1はABC、s2はABを指してる)で
下のソースコードだと2つの文字列が改行にいくまで繰り返すって言う意味ですかね?
while((*s1 != '\n') || (*s2 != '\n'))
{〜〜
s1++;
s2++}

195 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 07:12:03 ]
(;^ω^)恐ろしいコード

196 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 07:18:58 ]
すいません、ちょっと適当に書き込んだんで…。
ホワイルの中身の意味が知りたくて。

197 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 07:21:18 ]
>>194
そのロジックだと、s1、s2の改行文字の位置が揃っていないと誤動作しそうだが。
#つーか、>194自身が挙げたサンプルで死亡確定だな。



198 名前:デフォルトの名無しさん [2007/06/28(木) 07:57:55 ]
>>194
s1にもs2にも改行コードないからプログラム起動して即吹っ飛ぶ。
s1がABC\n、s2がAB\nだったとしても一致しないのでやっぱり吹っ飛ぶ。
そのコードはs1とs2の改行コード位置が一致した場合にループ抜ける。

199 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 08:00:03 ]
〜〜の中にきっとbreakが含まれてるんだ

200 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 08:45:23 ]
C言語の精度って小数点以下いくつなんでしょうか??

201 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 08:49:39 ]
そういう精度の決まり方じゃない。
これの IEEE 方式。
ttp://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

202 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 08:50:57 ]
言葉が足りなかった。
IEEE 方式のマシンが多い、と。
別にエクセス 64 のマシンでも C は使える。

C かどうかで決まるものではなく、
CPU が何かによって決まるもの。

203 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 10:07:58 ]
うん、それで、小数点以下いくつなんでしょうか??

204 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 11:11:40 ]
>>203
>>201に書いてあるだろ

205 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 11:14:24 ]
>>203
だから小数点以下いくつという形の精度じゃないと。
「浮動」小数点ってのは、そういう事だ。

206 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 12:07:34 ]
有効桁数って、確か中学で習うよな…?

207 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 14:02:25 ]
10進数だとIEEEの64ビット浮動小数点は小数点以下15桁ぐらいかな。
但しそれに掛ける10のn乗という指数が付くわけだが。




208 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 14:16:16 ]
有効桁数15〜16桁あたりだな。
本当は2進数で考えないといけないんだけど。

209 名前:207 mailto:sage [2007/06/28(木) 14:21:03 ]
#include <stdio.h>
#include <values.h>

int main(void)
{
printf("%d, %Lg, %Lg\n", sizeof(long double), LDBL_MAX, LDBL_MIN);
printf("%d, %g, %g\n", sizeof(double), DBL_MAX, DBL_MIN);
printf("%d, %g, %g\n", sizeof(float), FLT_MAX, FLT_MIN);

return 0;
}

gcc 4.1.1 (i386-redhat-linux) で上記のソースをコンパイルして
動かすと結果はこう出る。

12, 1.18973e+4932, 3.3621e-4932
8, 1.79769e+308, 2.22507e-308
4, 3.40282e+38, 1.17549e-38

e から後ろの部分が指数で「掛ける10のn乗」を表す。
3.3621e-4932 は 3.3621 掛ける10の -4932 乗だ。

但し上記の結果は環境依存で、同じ gcc でもコンパイルオプションに
よっては変わってしまう。だから全てについてこうであるという保証は
できない。(values.h も gcc 独自のヘッダかも知れない)。ただ大雑把に
言えることは float よりは double、また double よりは long double
の方が多くの範囲をカバーできるかも知れないというだけだ。
(コンパイラによっては long double はないかも知れないが)。


210 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:00:08 ]
ISO準拠の処理系ならlong doubleは必ずある。
209が使っている定数は<float.h>で提供されている。

211 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:01:51 ]
long double は必ずある。
しかし、double と同じサイズのこともある。

212 名前:デフォルトの名無しさん [2007/06/28(木) 17:10:52 ]
putchar関数の意味がよくわかりません。
質問が抽象的すぎてごめんなさい

213 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:12:06 ]
標準出力に文字(char)を一文字出力(put)する

214 名前:デフォルトの名無しさん [2007/06/28(木) 17:42:10 ]
…?
putchar('\n')
ってのはどういうことですか?

215 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:48:00 ]
標準出力はわかるか?
 通常は画面だと思っていい。
\n はわかるか?
 改行コードをあらわすエスケープシーケンスだ

つまり、画面上で改行する、ということ

216 名前:デフォルトの名無しさん [2007/06/28(木) 17:50:19 ]
それは
printf("\n")
とは違うんですか?

217 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:07:45 ]
printf は文字列を扱う
たまたまprintfで1文字出力するなら、putchar と同じ様になるな。
でも、printf の第一引数の文字列は % とか入ると違ってくるけどな。



218 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:08:09 ]
"\n" は文字列
'\n' は文字


219 名前:デフォルトの名無しさん [2007/06/28(木) 18:31:55 ]
でもこの場合では意味することは同じなんですよね?
というか、putcharでできることはprintfでもできるんですか?


220 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:32:55 ]
できるけど、効率は悪い。

221 名前:デフォルトの名無しさん [2007/06/28(木) 18:35:29 ]
それは打つ文字数が多くなるとかいうレベルの話ですか?
プログラムの内容には関係ないですよね?

222 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:36:12 ]
あります。

223 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:40:48 ]
printf は文字列を解析して
% が出てきたらどうするかとかいう処理を行ってる。
ま、出力自体のコストに比べりゃ微々たる差だがね。

224 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:41:45 ]
適材適所だ
printfで全部まかなうのもいいし、使い分けるのもいい。
同じことができるなら、片方はまったく無駄だと思ってるなら
それはキミが初心者だから。

225 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:42:18 ]
最近のコンパイラは賢いから、>>216なんかはputchar('\n');に最適化されるけどな。

226 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:43:47 ]
そこまでするのか! っていう最適化が
意外とされてるんだなあ。

227 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:48:02 ]
gccは printf("%s\n", "hoge"); を puts にしてくれたりするよね。



228 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:52:36 ]
>>227
こういうのってどうやって知るんですか?
○は□に最適化されるとか

229 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:55:28 ]
逆アセンブルしてもいいし、
両方のパターンを書いてコンパイルして
バイナリ比較して等しくなるかどうか確認したのでも。

230 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 18:57:45 ]
すごい!

231 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 19:08:41 ]
普通に gcc -S

232 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 19:31:12 ]
特徴的なものは宣伝していたりマニュアルに書いてあったりもする。

233 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 20:31:57 ]
スーパーハカーは自分で逆アセして知る。
一般人は掲示板で知る。

234 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:16:58 ]
確かに。
普通のハッカーなら掲示板でヒントを読んで自分で試して知るだろうな。

235 名前:ぴっころ [2007/06/28(木) 21:32:59 ]
突然お邪魔致します。ぴっころです。
2進数で表した時、2の倍数は最下位ビットが0になる事が分かりました。
では3の倍数は何かこのような決まりはあるのでしょうか?

236 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:33:54 ]
3進数で3の倍数は最下位ビットが0

237 名前:ぴっころ [2007/06/28(木) 21:36:37 ]
言葉足らずで申し訳ありません。
2進法で表した時です。



238 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:37:00 ]
ぴっころって誰だよ。

239 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:38:42 ]
>>235
ヒント1 : 2の倍数とは偶数のこと
ヒント2 : 3の倍数を並べてみよう

240 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:45:18 ]
2 進法では別に 3 (11) の倍数に特徴はないなあ。
3 (11) で割ったら余りが 0 になるということくらいだな。

241 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:45:44 ]
>>235
数学の問題だなあ。

3で割ると余り0

なんてのはあまり意味ないか・・・。

10進数で表した時に各桁を足して3の倍数ならそれは3の倍数
(123は1+2+3=6なので3の倍数)なんてのもあるが、関係ないね。


242 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:51:23 ]
3の倍数を2進法で表したものは、正規表現/(0|1(00)*1)*/にマッチする。

243 名前:ぴっころ [2007/06/28(木) 21:51:33 ]
>>238 ドラゴンボールのぴっころから取らせて頂きました。
>>239
   11
  110
 1101
 1100
 1111
10101
11000
11011
繰り返しもあるような無いような・・・。
ちょっと僕のキャパでは厳しいです・・・。

244 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:53:59 ]
>>243
18はどこへ消えた

245 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:54:19 ]
>>242
発想はいいがちょっと惜しいな。

1000000001の間に11を入れて1011000001も3の倍数だ。

246 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:55:49 ]
>>243
うそだ!
NHKのじゃじゃまる、ぴっころ、ぽろりのぴっころだろ?

247 名前:デフォルトの名無しさん [2007/06/28(木) 22:06:53 ]
bccってのをXPで使ってたんですが、vistaに変えたんですが環境設定ソフトでPATHの設定が出来ませんってのが出るんですが・・・・
vista出使える環境設定ソフトかPATHの設定方法を教えてください。



248 名前:ぴっころ [2007/06/28(木) 22:08:04 ]
   11
  110
 1101
 1100
 1111
10010
10101
11000
11011
11110
11→10→01→00
・・・。
ちょっときついです。
教えてもらえると助かります。

249 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:09:42 ]
1101のどこが3の倍数なんだよ。

250 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:11:40 ]
 1101
 1100

数が減ってるな
まぁ1001の書き間違いだろうからそれくらい勘弁してやれ

251 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:12:59 ]
>>247
マイコンピュータのプロパティの中にない?
XP/2003まではそこにあるんだけど。

252 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:23:37 ]
6bitでカルノー図書いてみたんだが一切簡単化できねーから周期性は無い臭い

253 名前:デフォルトの名無しさん [2007/06/28(木) 22:30:16 ]
>>251
システムのプロパティの中に環境変数でpathってのは見つけましたが違います?
マイコンピュータでプロパティやるとシステムのプロパティかCドライブのプロパティあたりしか出てきません。

254 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:31:30 ]
3の倍数で偶数に該当するものをリストアップしてやんよ
6 000000110
12 000001100
18 000010010
24 000011000
30 000011110
36 000100100
42 000101010
48 000110000
54 000110110
60 000111100
66 001000010
72 001001000
78 001001110
84 001010100
90 001011010
96 001100000

255 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:32:08 ]
>>253
たぶんそれでおk。

256 名前:デフォルトの名無しさん [2007/06/28(木) 22:35:43 ]
>>255
それをどうすればいいかわかります?

257 名前:デフォルトの名無しさん [2007/06/28(木) 22:39:43 ]
すみません、学校の電卓プログラム問題で、わからない事があるので教えてください。

char *get_int(char *b, char *i)
{
int sign, num = 0;
if(*b == '-')
{
sign = -1;
b++;
}
else sign = 1;

/*初期値*/
*i = 0;
/*スペーススキップ*/
SKIP(b);
/*十進数文字である間繰り返し*/
while (isdigit(*b)) {
num++;
/*これまでに得た整数の位取りアップ*/
*i *= 10;
*i += (*b - '0');
b++;
}
/*十進数文字がなければエラーリターン*/
if (num == 0) b = NULL;
return b;
}

上記は自分がわかる範囲でマイナス演算子を付け加えたのですが、
これからどうしていいのかわからないので、
どなたか教えてください。よろしくお願いします。



258 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:42:35 ]
> これからどうしていいのかわからない
だったら、それはお前のわかる範囲ではない。

259 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:43:02 ]
>>257
その一部じゃさっぱり。うpロダ使って全体をうpせい。それから実行結果の例も書いてくださいな

260 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:44:16 ]
(*b == '-')

かわいい

     ∧∧
〜(*b == '-') <ニャー
  >>  >>

261 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:46:19 ]
>>248
全ての3の倍数は、その数を3で割っても最下位ビットは変わらない。

262 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:46:26 ]
x = ( 'A'); やる気ねぇ〜顔

263 名前:ぴっころ [2007/06/28(木) 22:47:09 ]
>>254
なるほど。
6 00 00001 10
12 00 00011 00
18 00 00100 10
24 00 00110 00
30 00 00111 10
36 00 01001 00
42 00 01010 10
48 00 01100 00
54 00 01101 10
60 00 01111 00
66 00 10000 10
72 00 10010 00
78 00 10011 10
84 00 10101 00
90 00 10110 10
96 00 11000 00
下二桁 00→10の繰り返し、
下二桁より上 1ずつ増えているのは分かりました。 
ですが、これで1000000001の間に11を入れて1011000001も3の倍数だ。
が何故言えるのでしょう?あと、3の倍数に偶数が入ってくる理由も・・・。

264 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:47:21 ]
+= (*b - '0'); < 私を置いていくにゃ〜

265 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:48:53 ]
>>263
それは3の倍数じゃなくて6の倍数でわ?

3の倍数 かつ 偶数 = 6の倍数ですよ

266 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:49:05 ]
ファイルを指定した場所へ移動するにはどうしたらいいですか?

267 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:49:48 ]
>>256
BCCをインストールしたディレクトリのBinディレクトリとかのフルパスをPATHとかに追記する(セミコロンでつなげる)



268 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:51:18 ]
>>263
それ6の倍数並べてるだけじゃん

269 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:53:36 ]
>>263
単にそれは、例えば10進法で、15の倍数を並べたら一の位に0と5が交互に現れる、

ってことを言ってるのと同じだよ

270 名前:デフォルトの名無しさん [2007/06/28(木) 22:54:11 ]
>>267
どもです。
やってみます。

271 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:57:07 ]
3の倍数、偶数抜き。何か法則がある?
3 000011
9 001001
15 001111
21 010101
27 011011
33 100001
39 100111

272 名前:デフォルトの名無しさん [2007/06/28(木) 22:59:31 ]
A(n) = A(n-1) + 6

273 名前:デフォルトの名無しさん [2007/06/28(木) 23:13:28 ]
>>235
3の倍数は、奇数ビット目の1の数と、偶数ビット目の1の数の差が、3の倍数になる。
ただし、差が3の倍数といっても数が小さいうちはずっと0。

例:39
100111、奇数ビット目=2、偶数ビット目=2、差=0

274 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 23:25:45 ]
分からないなら、10進数で同じコトを考えてみればいいよ

10進数だと、10の倍数は1の位が0だということが分かりました。
では11の倍数は、何か特徴があるのですか?

11
22
33


1の位が1ずつ増えていくことが分かりました!


…この結果で何か得られることはあると思うか?

275 名前:デフォルトの名無しさん [2007/06/28(木) 23:49:23 ]
unsigned char型の配列にbmpの画素の値を読みます。
これをソートするんですが、
ソートする関数の引数のところを
void quicksort(char *array,int lower, int upper)
とするとソートが正しくないことがあります。
void quicksort(unsigned char *array,int lower, int upper)にするとうまくいくようなきがするんですが、
あってますか?

276 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 23:51:59 ]
とりあえず関数のシグネチャをプロトタイプにちゃんとあわせなさい

277 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 23:54:41 ]
すいません。よくわからないです。
学校の課題なんですが、unsigned char型は問題ですでにつくられていて、
それを改造してるんです



278 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 23:59:43 ]
それはきっとcharが符号付だからということなのだろう。

279 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 00:03:08 ]
なるほど。
void quicksort(unsigned char *array,int lower, int upper)にすれば
ソートはちゃんとうごいてますか?

一応実際の画像のソート状況を確認したら平気っぽかったですが

280 名前:ぴっころ [2007/06/29(金) 00:40:39 ]
ぴっころです。答えて下さった方々ありがとうございました。
失礼します。

281 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 00:44:19 ]
3の倍数は1が常に偶数個

282 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:02:45 ]
定数はdefine, const, enumのどれで指定するのが定跡でしょうか?


283 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:08:23 ]
定数じゃないのばっかじゃん

284 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:09:18 ]
?

285 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:12:54 ]
て・・・定石なんてないのさ

286 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:23:21 ]
テキストファイルをよみこんでたとえばファイルに
cccchaa
というのがかいてあったら下のような感じで画面に表示したいんですけど
どんなソースコードですかね?アルゴリズムがピンとこないのでお願いします。
c→4 h→1 a→2

#include <stdio.h>

int main(void){
FILE *fp,*fut;
char sfn[80];
char yomi[256],mawasi[256];
int i;

scanf("%s",sfn);

if((fin=fopen(sfn,"r"))==NULL)return -1;
fout=fopen("comp","w");
i=0;
while((yomi[i]=fgetc(sfn))!='\0'){

i++;
}
fclose(fp);
fclose(fut);
return 0;
}

287 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 01:29:15 ]

・読んだ文字が前回と異なっていたら
カウンタをリセット(0にする)。読んだ文字を覚えておき、カウンタをインクリメント
・読んだ文字が前回と同じならそのままカウンタをインクリメント



288 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 02:33:50 ]
>>281
10101 (10進数で21)の時点で既に違うんだが。

一般的には、>>273が正解
もうこの話題終わってるけどね

289 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 03:16:46 ]
構造体のint型の要素と、構造体外のchar型の変数とstrcmpで比較したいのですが
int型の要素をどうchar型に変換するのかわかりません。
何か良い方法はありますか?変換は逆でも構いません。

290 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 03:18:17 ]
atoi とか sprintf とか

291 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 03:24:59 ]
先日C言語の勉強をしていたら以下のプログラムがありました。
なんで、プログラムを実行して、この結果が出てくるのか全く
わかりません。プログラムの結果がなぜそうなるのか内容を出
来るだけ詳しく教えてください。初心者なのでなるべく丁寧に
お願いします。もし、プログラムのタイプミスがあったらすい
ません。

#include<stdio.h>
#include<string.h>
main(){
char c[3];
char s1[]="abcdefghijklmnopqrstuvwxyz"
char s2 [100];
s2[0]='\0';
printf("s1 inital value:\"%s\"\n",s1)
printf("s2 inital value:\"%s\"\n",s2)
if cstrcmp(s1,s2)==0){
printf("s1==s2\n");}
else{printf("s!=s2\n");}
printf("Push ENTER to proceed.");
fgets(c,2,stdin);
strcpy(s2,s1);
printf("s1 current value:\"%s\"\n",s1);
printf("s2 current value:\"%s\"\n",s2);
if(strcmp(s1,s2)==0)
{
printf("s1==s2\n");}
else{prinf("s1!=s2\n");}
}




292 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 03:48:27 ]
この結果ってどの結果

293 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 05:51:18 ]
「この」結果

294 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 06:07:23 ]
sayonara

295 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 07:43:16 ]
さよならbyebye〜元気でいてね
年に二回くらいのクソレスならキャッチするよ〜

296 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 09:46:49 ]
2の倍数はある数を2倍したもの
2倍するとは、2進数だと左に1ビットシフトしたもの
ゆえに、一番下のビットは必ず0になる。

3の倍数もこれに習ってやってみ。

297 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 10:40:10 ]
291です
なんでENTERを押すと次の実行結果が表示されるのな何でですか?

↑のも質問ですがこのような感じの内容を教えてください



298 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 10:56:41 ]
>>297
s1 inital value:"abcdefghijklmnopqrstuvwxyz"
s2 inital value:""
s!=s2
Push ENTER to proceed.
s1 current value:"abcdefghijklmnopqrstuvwxyz"
s2 current value:"abcdefghijklmnopqrstuvwxyz"
s1==s2

これのどこがわからないの

299 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 11:56:31 ]
>>291
stdio.h には、C標準ライブラリのコンソール出力関数のプロトタイプ宣言があり、
そこで宣言されているprintfを使っているから、結果が出力されるんです。

300 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 12:32:32 ]
>>291
学生?俺もだけど
何の関数を使うためにstring.hをインクルードしているか?
strcmp(),strcpy関数はどういう関数か?
fgetsはどういう関数か?

を調べればたぶんわかると思うよ。
if構文とか'\0'とかprintf()とかエスケープ文字とか
文の終わりに;をつけるとか(付け忘れが多すぎたからあえて指摘)
くらいは知っているだろうし、人にきくほど難しいものではないとおもう。

301 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 12:43:42 ]
>>291
>char c[3];
>fgets(c,2,stdin);
こんな阿呆なコード、誰が書いたんだ?

302 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 12:46:17 ]
本質的じゃないトコにつっこむのもなんだかなー

303 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 13:11:38 ]
だって、阿呆なんですもの

304 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:09:38 ]
その程度のことを見つけてアホアホ得意気になる香具師は痛々しい。

305 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:21:40 ]
まあ、fgets のサイズ指定は
ヌルターミネータ込みのバッファサイズを指定することくらいは
ちゃんと知っておいた方がいいとは思う。

306 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 14:32:10 ]
しぜおf使おうぜ?

307 名前:デフォルトの名無しさん [2007/06/29(金) 17:55:27 ]
#include <stdio.h>
int main(void)
{
int x,y,z,s;
printf("何cmから:"); scanf("%d",&x);
printf("何cmまで:"); scanf("%d",&y);
printf("何cmごと:"); scanf("%d",&z);
s = (x - 100)*0.9;
x = x + z;
for (; x <= y; s)
printf("%dcm %.2fkg\n",x ,(double)s);
return 0;
}

これだと x+5 についての場合のみ永久にブァーッと出てきます。
x〜yの範囲内にするにはどうしたらいいですか?



308 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:02:10 ]
for (; x <= y; x += z) {
double s = (x - 100) * 0.9;
printf("%d cm %.2f kg\n", x, s);
}

309 名前:デフォルトの名無しさん [2007/06/29(金) 18:12:13 ]
>>308
ありがとうございました。
この場合繰り返しが行われてる式は
x += z と double s =(x - 100)*0.9 と printf("%dcm %.2fkg\n",x,s)
の3つですよね?繰り返したい式が2つ以上あるときは
forの()の中に1つ書いて、()を閉じてから残りの繰り返したい式を書くということでいいんですか?



310 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:14:42 ]
procedure a: Integer
var
int C;
beigin
a := 0;
end;
がうまくイカなんだがなんだろ

311 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:22:01 ]
beigin → begin
つーかこれPASCAL・・・

312 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:44:38 ]
Pascal って人間は考える葦とかいっていた人か?

313 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:47:07 ]
さつま芋とか水で洗って食う動物じゃね?

314 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:52:22 ]
int* p; /*ポインタのデータ*/

int a = b/*p; /*b÷(pの先のデータ)→a*/;

割り算ができね

315 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:53:22 ]
アライグマパスカル、うが

316 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:53:39 ]
/ と * の間に空白開ければいいじゃん。

317 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 18:55:18 ]
今でも、糞つまんないCPUのロジックは大方割り算なのは確かだw



318 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 19:24:53 ]
今までで、プログラムって訳に起つよな(^^って思えたのは
perlとrubyとMLとエクセルで使うVBAくらい。
C++とかJavaは嫌な思いしかさせてくれない。

319 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 19:32:41 ]
で、Cはどこ?

320 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 19:34:11 ]
here

321 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 19:38:48 ]
Cは昔のアセンブラみたいなもん。
良いも悪いもない

322 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 20:28:23 ]
ガウシアンフィルタを作りたいんですが、質問させてください

フィルタをかけたい画素を中心に3×3のマスクをつくるとします。

teo.sourceforge.jp/doc/TeoProgrammingGuide/img/gaussian_kernel2.png
みたいなガウシアンフィルタを作って、この行列の各要素の数値を
マスクの行列の同じ場所の画素値にかけて、
その合計で中心画素の値を割ればいいんですか?

マスクがとしたら
1 3 3
4 6 2
1 2 3

1×0.07 + 3×0.12+・・・+3×0.07=SUM

6/SUMがフィルタをかけた後の値ですか?


323 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 20:32:30 ]
>>321
アセンブラに昔も今もあるのかよ

324 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 20:38:06 ]
>>323
Cの話でしょ?w

325 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 21:52:45 ]
>>322
そうだと思うけど、まずはやってみればいいんでね?

326 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 22:33:26 ]
>>322
そのコーディング方法が分からないんで無ければ
画像処理スレかどっかで聞いた方がいいんでね?

327 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:14:23 ]
最近ちょっとさわり始めたのですが、
memcpyのように引数にvoid*をとるとき、どうやってvoid*の中の物を
取り出すんですか?普通に配列のように[0]とかってやってもエラーになるし…



328 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:14:47 ]
適当なポインタ型にキャストすればいい。

329 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:48:34 ]
>>328
その場合、中身が構造体などの場合にはどうしたらいいんでしょうか?
char*などにキャストした後から戻せるのでしょうか?

330 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:54:00 ]
構造体でキャストすればいいんじゃ

331 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 00:57:58 ]
>>330
該当する構造体でキャストすればいいのはわかるのですが、
memcpyのようになんでもコピーできるようにするにはどうしたら
いいのかなと思ったのですが、これはあまりmemcpyを
使わない方がいいと言われるのと何か関係があるのでしょうか?

332 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 01:01:30 ]
そんなもんchar*にキャストして1バイトずつ読み書きしているだけと思っていればいい。
実際には高速化するため複数バイトずつ読み書きするなど工夫しているいるけど。

333 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 01:51:53 ]
>>332
参考になりました!
ありがとうございます。

334 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:08:51 ]
まぁ、間違っても構造体のコピーにmemcpy()なんて使うなよ。

335 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:09:15 ]
表示した画像を消すときはどんな関数を使いますか?

336 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:11:56 ]
CLS 3

337 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:15:50 ]
>>336
それってBASICじゃないですかw



338 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:18:01 ]
あ、Cで表示した画像を消すときはどんな関数を使いますか?

339 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:20:43 ]
画像を表示するのにどんな関数使ってますか?

340 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:21:15 ]
>>338
真っ白な画像を用意して、消したい画像の代わりに表示してはいかがでしょう。

341 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 02:35:45 ]
もはやCのスレではなくなったな

342 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 03:05:44 ]
exit(1);

343 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 03:36:59 ]
goto >>343;

344 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:38:21 ]
教えてください。
main関数から、ある関数に引数を渡す場合は、次のような
感じで渡してもOKですか?ダメみたいなんすが、その理由が
わからないです。
もちろん、実行する場合は引数を指定します。 a.out A.txt のように。

extern int p(char *filename)

int main(int argc, char*argv[])
{

p(argv[1]);

}


345 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:41:09 ]
&argv[1]
argv

346 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:51:38 ]
>>344
どうダメなの? それでいけると思うのだけど。

>>345
プロトタイプ宣言と型が合いません。

347 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:52:44 ]
単にダメって言うんじゃなくて具体的にどんなエラーがでたとかさ・・・



348 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 07:58:13 ]
パス指定なしのファイル名だけ書いていて、起動ディレクトリと違うところにあって見つからないとか。

349 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:04:09 ]
申し訳ないです。
セグメンテンションフォルトです。

350 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:09:50 ]
問題があるのはp()の方だろ

351 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:13:32 ]
>>350
なるほど、呼び出す先のp関数がわるのかなぁ。
引数でわたってきたファイル名をfopen()を呼んでいるだけなんですが。

352 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:19:35 ]
微妙に日本語がおかしいのが気になる

353 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 08:21:27 ]
どうもあがとうございました。
呼び出す先のp関数が悪いみたいです。
if (f=fopen(filename,"f"))

"f" -> "r" ですね。すいませんでした。

このようなif文で代入はOKなのかなぁ?

354 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 09:05:16 ]
>>353
間違ってはいないがお勧めしない。
Cのエキスパートを自称するロートルは、しばしば「代入と比較を一行で書けるのがCらしさだ」とのたまうが、
バグの混入の原因になりかねないし、第一必ずしも読み易くない。

355 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 10:55:48 ]
ifの中で代入すると大抵警告が表示されるしな。
if ((f = fopen()) != NULL)とするやつもいるが俺は好きになれない。

356 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:02:07 ]
80カラムに収まるならついやっちゃうな・・・

f=NULL;
f=fopen("ようじょ", "w");
if(f==NULL){
 puts("ひゃぅん?");
}
ここまでするとクドイ感じもするが・・・

357 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:03:31 ]
fopenって失敗したらNULL返すんだからf=NULL;は要らなくね?



358 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:14:05 ]
我が家ではこうしてますね・・・
基本的に使う前と使った後はクドクドと初期化

359 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:17:27 ]
よくこういうふうにやる
FILE* fp = fopen();
if (f)

360 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:20:07 ]
FILE* fp;
FILE *fp;

この二つの違いって何かあるの?
単なるコーディング流儀の違い?

361 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:22:46 ]
流儀の違い

362 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:22:50 ]
そう、流儀の違い。
構文上は、FILE*fp;もFILE * fp;も可能。

363 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:23:41 ]
FILE
*
fp
;
だっていいZE

364 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:23:58 ]
>>360
前者はC++使いに多く、後者はC使いに多い。
両方使う私は、だからと言うわけではないがFILE * fp = fopen(...);と書く。

365 名前:デフォルトの名無しさん [2007/06/30(土) 11:33:59 ]
for文とwhile文の明確な違いって何ですか?
たとえばfor文ではできるけどwhile文ではできないこととか・・・。

366 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:38:13 ]
continue 時にも for(A;B;C) の C が実行されるってのが
while だと実現が面倒。

367 名前:デフォルトの名無しさん [2007/06/30(土) 11:41:46 ]
バッファの割当の数とか数字を#defineしてしまうのは、なぜですか?マジックナンバーを使いたくないのはわかるのですが、
その都度malloc、もしくはreallocしてはいけないのですか?

または、そのバッファの割当の数はどうやって決まるのですか?

どうもCを書いていると全部mallocしたくなるのですが、C言語のハッカーさん教えてください。



368 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:41:58 ]
for文の括弧内の式はどれも省略可能。
while文の括弧内の式は省略不可能。

369 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:42:12 ]
forは式を省略できるがwhileは省略できない。
なので、無限ループはwhile (1) {...;}ではなくfor (;;) {...;}を使う。

370 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:47:09 ]
もうしわけないです、コーディングは以下の理解でよいでしょうか。

だめ:×
if (f=fopen(filename,"r"))

よい:○
f=fopen(filename,"r");
if(f!=NULL)


371 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:47:14 ]
>>367
malloc したら free しないとダメじゃん。
管理の手間が増えるからなるべくやりたくない。
必要な時はするがね。

ガベコレのある言語と一緒に考えない方がいいよ。

372 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:48:39 ]
>>370
「だめ」ではなくて、「好ましくない」程度で。
他人が書いたものを読むときに、「だめ」と思わずに許容してあげましょう。

373 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 11:48:56 ]
>>370
文法上の問題はないが推奨されない:△
if (f=fopen(filename,"r"))

よい:○
f=fopen(filename,"r");
if(f!=NULL)

374 名前:デフォルトの名無しさん [2007/06/30(土) 11:50:26 ]
whileでは無限ループはできないんですか?

375 名前:367 mailto:sage [2007/06/30(土) 11:54:14 ]
>371

どもです。なるほど。確かにガベコレある言語でしかマジメに開発したことがないので、納得できていませんでした。
別物ですね。別物。

でも、その際に使用するMAX_BUF_NUMとかは一般的に1024とか使用されているのですが、何ゆえその数字が決まるのですか?
質問ばかりですいません。

376 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:07:15 ]
1KB程度でいいんじゃねって感じじゃね?

377 名前:367 mailto:sage [2007/06/30(土) 12:15:56 ]
> 376
サンクス

しかし、1KBにするか4KBにするかといったことに悩むんですよね。
作りたいアプリの仕様が1KB程度だから、ここは1KBにするか、と考えるのは普通のような気もするのですが、
アプリを作りたいのではなくて、自分用の便利ライブラリを作成する際にどの数字を採用するか、
と考えるのが非常につらい。

つか、こんな考え方の俺ってガベコレ言語を使いすぎですか。



378 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:20:37 ]
ライブラリならバッファの大きさなんてユーザから指定を受け付けるものに決まっているだろ。

379 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:23:07 ]
C が嫌なら C++ で string とか vector とか使えばいいよ。

380 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:23:59 ]
>>369
for(;;) は可読性が乏しいから while(1) の方が好きだな。

381 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:25:18 ]
>>372 373
ありがとうございました。

382 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:33:22 ]
>>377
Cでライブラリ作るときは内部でバッファを抱えない。
(char *buf, size_t bufsize)
で受けるのがお約束。
高級にやりたいならmalloc, freeでやってバッファがあふれたらreallocで拡張。
手を抜きたいなら#defineで固定バッファであふれたらASSERTでとめるか放置してバッファオーバーフロー。
大体この三種類だな。重要度とパフォーマンスを秤にかけて好きにしとけ。
1kbと4kbのどっちが妥当かなんて答えようがない。

383 名前:367 mailto:sage [2007/06/30(土) 12:45:56 ]
>> 382, 379, 378
どうもありがとうございました。

後は、自分で考えることができそうです。

ついでにもう一つ聞いてもいいですか?
文字列の配列を作るときに、
ダブルポインタを採用するのがいいか、リンクリストを採用するのがいいか迷っています。

どちらがお勧めですか?

384 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:48:35 ]
それは定数か? それとも実行中に作りたいのか?

385 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:50:49 ]
>>383
使い方によるだろ
よくわからないならダブルポインタの方が扱いやすいかな?

386 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 12:55:20 ]
リストなんて糞なもん使わずにchar**な配列作っとけ

387 名前:367 mailto:sage [2007/06/30(土) 13:02:55 ]
>>385, 384

ありがとうございます。

構造体でどちらで定義しようかな、と考えていました。
typedef struct {
char *dstr;
int dlen;
} DATUM;

typedef struct {
DATUM *ptr;
int size;
} DATUMLIST;
とするか、

typedef struct _DATUMLIST {
char *dstr;
char dlen;
struct _DATUMLIST *next;
} DATUMLIST;

とするか迷っていたのです。まぁ、迷わずに実装してしまえば、どちらでもいいような気がしますが。




388 名前:367 mailto:sage [2007/06/30(土) 13:06:07 ]
>>386
それも考えました。
無駄に考えるのがよくないのですかね。
この際、char**な配列の方が楽のような気がしてきた。

389 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:08:33 ]
int型を指すポインタ int* p;
一次元ポインタ配列 int** p;
二次元ポインタ配列 int*** p;
三次元ポインタ配列 int**** p;

って風にスターを増やしていってもいいの?

390 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:09:42 ]
#include <stdio.h>
int multiple(int, int);

main()
{

}
int multiple(int x, int y)
{
if(y%x == 0)
return 1;
else
return 0;
}

multiple関数を使って二つの整数を比較し
二つ目の整数が一つ目の整数なら1(真)、
それ以外なら2(偽)を返すというプログラムを作りたいのですが
main関数をどうすればいいのかわかりません

391 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:11:44 ]
>>389
int** p; は int* 型を指すポインタだ。
それが必要になれば使う。普通に使う。

392 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:12:34 ]
>>390
main 関数で何がしたいのか分からないので
こちらにもどうすればいいのか分かりません。

393 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:14:28 ]
>>389
スターじゃなくてアスタリスクじゃね?

394 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:16:08 ]
普通にどちらも使う。
フォントによっては実際に星型なってることもあるし。

395 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:16:22 ]
>>391
ありがとう

>>390
if(y%x == 0)
ってyに0が入ってきたらy%xは必ず0になって比較にならないんじゃね?

396 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:20:45 ]
>>395
0 はあらゆる数の倍数(0 倍)だから動作的に問題ない。

397 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:23:12 ]
xが0の時のほうがまずいよな。



398 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:30:47 ]
まあ、どこまでエラー処理するかは状況次第だな。
assert するだけにしておくか、
それともエラー時に何か特別な処理をしてエラー復帰するか。

399 名前:390 mailto:sage [2007/06/30(土) 15:24:33 ]
main関数では、変数を二つスキャンして
それをmultiple関数に渡し、multipleでの結果を
main関数に返してプリント
というふうにしたいです

400 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 15:27:56 ]
そう書けばいいんじゃないかな。

401 名前:390 mailto:sage [2007/06/30(土) 16:26:43 ]
その書き方がわからなくて困ってます

402 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 16:30:21 ]
そうですか。

403 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 16:30:50 ]
エラー出てもいいからとりあえず書いてみれ。
それでも分からなければ、
自分でどうやってみたかをここにコピペしてみれ。

404 名前:390 mailto:sage [2007/06/30(土) 17:12:58 ]
どうしてこんなにお願いしているのに教えてくれないんですか。
もったいぶらないで今すぐに教えてください。

405 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:20:13 ]
#include <stdio.h>
int multiple(int, int);

int main(void)
{
int x, y;
scanf("%d %d",&x,&y);
if(x == 0) return 1;
printf("%d\n",multiple(x,y));
return 0;
}
int multiple(int x, int y)
{
return (y%x!=0)+1;
}
二つ目の整数が一つ目の倍数なら1 と解釈してやってみた
つかここ宿題スレだっけ?

406 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:20:22 ]
うわ・・・

407 名前:390 mailto:sage [2007/06/30(土) 17:21:03 ]
#include <stdio.h>
int multiple(int, int);
main()
{
int a,b;
scanf("%d%d\n", &a, &b);
printf("%d\n", multiple(a,b));

return 0;
}
int multiple(int x, int y)
{
if(y%x == 0)
return 1;
else
return 0;
}

このプログラムだと一応実行できるのですが
整数を二つ入力しても動かず、もう一つてきとうに整数を入れると
最初の二つの整数について判断します。
例えば

4←ここで4は2の倍数なので1が返ってくる
  はずなのですがそこでは処理がされず
5←さらに適当に整数を入力する
1←すると結果が返ってくる
と、こんな感じです
整数を二つ入力した時点で処理結果を返したいのですが
いいでしょうか?



408 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:22:14 ]
>>404
>main関数をどうすればいいのかわかりません
>というふうにしたいです
>その書き方がわからなくて困ってます

一度もお願いなんかされてないんだが。

409 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:25:25 ]
>>408
行間も読めないんですか? とか言われそうだなw

>>407
scanf()とprintf()のフォーマット文字列は互換性がないと思ったほうがいい。
あんたのコードは明らかにscanf()のフォーマット文字列が間違っているぞ。

410 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:26:28 ]
>>409
お前こそ行間が読めてないなw

411 名前:409 mailto:sage [2007/06/30(土) 17:30:06 ]
>>410
大丈夫、初めから読もうとしてないから。

412 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:37:36 ]
これはひどい

413 名前:390 mailto:sage [2007/06/30(土) 17:43:19 ]
>>409
助言ありがとうございます

それと404は私ではないのであしからず

414 名前:390 mailto:sage [2007/06/30(土) 17:57:37 ]
main()
{
int a,b;
printf("整数1:"); scanf("%d", &a);
printf("整数2:"); scanf("%d", &b);
printf("%d\n", multiple(a,b));

return 0;
}

407のmain部分を上のようにしたら理想通りに実行されたのですが
なぜ上手くいったのかがよくわかりません。
誰かその理由を説明してください。

415 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 17:59:15 ]
>>414
>>409の最後の行

416 名前:390 mailto:sage [2007/06/30(土) 18:02:29 ]
間違っていることはわかりましたが
407のscanf()はどういけないんですか?

417 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 18:02:51 ]
\n



418 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 18:03:23 ]
>>416
\n

419 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 21:07:21 ]
もし A、B、C、Dのいずれかを満たしたら、、、と出力
それ以外なら。。。と出力

とするにはどうやればいいですかね?

420 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 21:20:02 ]
>>419ですけど自己解決しますたー

421 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:23:30 ]
#include<stdio.h>
#include<string.h>
main(){
char c[3];
char s1[]="abcdefghijklmnopqrstuvwxyz"
char s2 [100];
s2[0]='\0';
printf("s1 inital value:\"%s\"\n",s1)
printf("s2 inital value:\"%s\"\n",s2)
if cstrcmp(s1,s2)==0){
printf("s1==s2\n");}
else{printf("s!=s2\n");}
printf("Push ENTER to proceed.");
fgets(c,2,stdin);
strcpy(s2,s1);
printf("s1 current value:\"%s\"\n",s1);
printf("s2 current value:\"%s\"\n",s2);
if(strcmp(s1,s2)==0)
{
printf("s1==s2\n");}
else{prinf("s1!=s2\n");}
}
のプログラムのfgets(c,2,stdin); ってなんですか?なんの役割ですか?

422 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:29:26 ]
>>421
どうでもいいけどそれ、そろそろtypo直そうな

× if cstrcmp(s1,s2)==0){
○ if (strcmp(s1,s2)==0){

423 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:29:57 ]
pc11.2ch.net/test/read.cgi/tech/1182607405/607-644
解決したんじゃなかったのか

424 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:34:01 ]
fgets(c,2,stdin); がわかないんですよ

タイプミスはすいません

425 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:37:27 ]
>>421
stdinからcに1文字読み込む。

426 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:38:03 ]
流れも他スレも読まずに回答。

>>421
>のプログラムのfgets(c,2,stdin); ってなんですか?なんの役割ですか?
入力処理。改行を入力させるために使っているわけだ。

427 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:41:15 ]
>>424
Push ENTER to proceed を表示したところで止まるだろう
エンターキーを押すと次に進む
ようはポーズさせているんだろう



428 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:42:16 ]
>>428
なんでENTERを押すと次が表示されるんでしょうか?

429 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:44:23 ]
>>428
自己レスかよ

fgets(c,2,stdin);
で標準入力からの入力待ちで止まっている
エンターキーで入力されたので次に進むだけ
cのデータ自体はいらないもの

430 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 23:51:30 ]
わかりました。ありがとうございます

431 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 00:54:39 ]
プログラムとか全くなんにもやった事ないんですけど、最初になにを用意したらいいものなんでしょう?
ここのサイトをまず読めとか入門にいい本とかってありませんかね?
仕事では2D/3Dのデザイン系やってるんですけど、プログラムにもちょっと興味があるんで、
まずはCから勉強していこうと思っているんですが。

432 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 00:55:43 ]
まず、コンパイラとリンカを用意します

433 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 00:57:21 ]
最初に用意すべきものは、
何を用意すればいいかを自力で探せる能力だな
とマジレス

いや、マジでプログラマにとって最重要な能力は、情報収集力だよ

434 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:00:07 ]
もうちょい広範囲に言うと「自己解決能力」

435 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:02:58 ]
応用力。>>428なんかは将来心配

436 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:10:50 ]
俺も>>431に何かレスしようと思ったが
>>433-434に全て持っていかれた

437 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:11:17 ]
やる気。



438 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:12:20 ]
やる気は大切だが、やる気だけの子も困ったり。

439 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:13:12 ]
叩かれても泣かない。むしろ悦ぶ方向で。

440 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:15:15 ]
四大欲求をフルに使いこなせる体力。

441 名前:431 mailto:sage [2007/07/01(日) 01:16:58 ]
そうっすねぇまずは色々情報探してみます。

入門出来たらまた相手にしてください。

442 名前:デフォルトの名無しさん [2007/07/01(日) 01:56:16 ]
#include <stdio.h>
int main(void)
{
int min,max,x,y,i,j;
puts("長方形を作りましょう");
printf("一辺(その1)"); scanf("%d",x);
printf("一辺(その2)"); scanf("%d",y);
min = x;
if (y < x)
min = y;
max = y;
if (y < x)
max = x;
for (i=1; i<=max; i++) {
for (j=1; j<=min; j++)
putchar('*');
putchar('\n');
}
return 0;
}


何がおかしいスかねぇ
*が表示されないんですよねぇ

443 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 01:59:59 ]
>>442
printf("一辺(その1)"); scanf("%d",&x); < & が抜けてるよ
printf("一辺(その2)"); scanf("%d",&y);

444 名前:デフォルトの名無しさん [2007/07/01(日) 02:04:09 ]

なんということ…ありがとうございます

445 名前:デフォルトの名無しさん [2007/07/01(日) 02:08:54 ]
ちなみにこのプログラムは順番的には
for (i=1; i<=min; i++)→for (j=1; j<=max; j++)→putchar('*')
→for (j=1; j<=max; j++)→putchar('*')→for (j=1; j<=max; j++)→putchar('*')
…→putchar('\n')→for (i=1; i<=min; i++)→…
みたいな感じで実行されてるのですか?

446 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 02:20:10 ]
>>445
それであってるよ。実行して確認してみればいい。

447 名前:デフォルトの名無しさん [2007/07/01(日) 13:00:50 ]
>>446
ありがとうございました



448 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:37:35 ]
四大欲求とは三大欲求に知的探究心を加えたものか

449 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:45:08 ]
ノッてくれ〜Ha〜Ha〜♪

450 名前:449 mailto:sage [2007/07/01(日) 14:45:40 ]
素で誤爆しました
すみません

451 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:51:42 ]
Gnuplotを扱うC言語用のライブラリとか無いでしょうか?

popen()関数を使って自分で作る事は出来るのですが
もし優れたライブラリがあるならそっちを使いたいです
C++では駄目でCでおながいします

452 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:06:59 ]
例えば

foo(cahr*p)
{
char *my_ptr = MyGetInnerParameter("内部パラメータを文字列で返す関数");
strcpy(p,my_ptr);
}

var()
{
char *ptr;
foo(ptr);
}

こうすると、落ちるんだけど、どうして?


453 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:09:22 ]
foo(char** p)
にしないと

454 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:15:07 ]
いやそれ以前のはなしか

455 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:21:54 ]
どこ指してるかわからないpにstrcpyしちゃだめだろ

456 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:23:24 ]
char* a[8]をlongに直すにはどうしたらいいでしょうか?
>>で1つずつやっていくしかないですかね?

457 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:25:03 ]
じゃあ

foo(cahr*p)
{
char *my_ptr = MyGetInnerParameter("内部パラメータを文字列で返す関数");
strcpy(p,my_ptr);
}

var()
{
char ptr[8];
foo(ptr);
}

こうしてみたんだけど、やっぱりダメだった。
どうして?



458 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:25:29 ]
cahr

459 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:28:38 ]
>>458
そういうケアレスミスは置いといて^^

460 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:30:00 ]
コードを見る限り問題はなさそうな気がする。
MyGet(ryの戻り値がおかしいんじゃないのか。
戻り値になるバッファをスタックに取ってるとか。

461 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:31:06 ]
コピーされる文字数が1024バイトだったとかってオチだろ。

462 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:37:26 ]
デバッグとしてmy_ptr表示させてみたりとか、自分でしないの?

463 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:41:43 ]
そもそも、呼ぶ側で領域確保が必要な関数の場合、
最初に用意する容量を問い合わせてから領域を確保して初めて呼び出せるんだろうに。
領域サイズの確認関数が無いなら、十分なサイズを用意してあげないとダメ。
そして、サイズに満たない領域にコピーしちゃダメ。



464 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:38:52 ]
bregexp.dllのラッパーライブラリ内ですか?

465 名前:デフォルトの名無しさん [2007/07/01(日) 22:45:56 ]
サブ関数内でmalloc()でメモリ確保した領域ってメイン関数に帰るときに解放されないの?

466 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:46:46 ]
>>465
free()かrealloc()で解放しない限り、されません。

467 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:50:23 ]
>>465
解放されると困らないかい?

malloc() 〜 free() の作法としては、使う人が確保と解放の責任を持つって暗黙のルールなんだけど、サービス関数の中には、確保だけして解放は使う側でやってね。なんてローカルルールもあるしな。

解放されると思い込むくらいなら、仕様確認をした方がいいよ。



468 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:56:05 ]
>>465
自動変数とごっちゃになってない?

469 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:14:22 ]
alloca なら開放されるな。
環境依存だが。

470 名前:465 mailto:sage [2007/07/01(日) 23:22:00 ]
あざーす

471 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:25:21 ]
>>464
たいした手間じゃないから自分で書いたらいいよ

472 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:37:38 ]
木構造の二分探索木において
ルートの下にノードがあるとします。
その2つのノードからそれぞれ2本ずつ枝がでていて、
1本は別々のノードにつながっている。もう一本は同じノードにつながっている。
これをあらわすには数字の割り当て方はどうすべきですかね?

   0
 1   2
3 4 5 6

とあれば、2のleftが4をさすようにする。
5は捨てるって感じですかね?



473 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:43:04 ]
よく意味が分からない。

474 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:47:29 ]
データ数400の二次元配列でかつ小数点

それと木構造と組み合わせて計算とか地獄だな。。。

475 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:58:36 ]
    0
   /\
  1   2
 /\ /\
3   4   5

みたいな感じにしたいのか?

476 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:09:47 ]
>>475
はい、そうです。
各枝に確率をつけて、0のところを1.0と設定して
0から1、2への枝の確率をかけて1と2のノードにおいての確率をだす。
その次に1と2の下の3、4、5への枝に確率をつけて
3、4、5のノードにおいての確率を出す感じにしたいんですけど。
1つのノードに3つの確率がはいるようにしないといけないなーとは思ってます。

この計算を木でやるか配列でやるか迷ってます。

477 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:58:38 ]
      0
     /\
    1   2
   /\ /\
  3   4   5
 /\ /\ /\
6   7   8   9

となっていくんだったら、別に配列でもいい気がするな。
配列というか、三角行列?



478 名前:デフォルトの名無しさん [2007/07/02(月) 01:14:04 ]
#include <stdio.h>
int main(void)
{ /*左上*/
int a,b,c;
printf("何段ですか:");
scanf("%d",&a);
for (b = 1; b <= a; b++) {
for (c = a; c >= 1; c--)
putchar('*');
putchar('\n');
}
return 0;
}


左上が直角になる三角形を作りたいのですが・・・何か四角形になります

479 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:18:38 ]
>>478
for (c = a; c >= 1; c--)

for (c = a; c >= b; c--)

480 名前:デフォルトの名無しさん [2007/07/02(月) 01:25:48 ]
>>479
できました!ありがとうございました!

481 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 03:05:47 ]
>>456
8つのchar*が指し示している内容が分からないと何とも。

482 名前:デフォルトの名無しさん [2007/07/02(月) 11:56:07 ]
数人でCでプログラム開発しているのだけれど、
ソースコード中の各関数の前に、
// 関数名:
// 作者:
// 機能:
// 
みたいな説明を付けたいのだけれど、どこかにカッチョいいサンプルないですか?

483 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 12:07:11 ]
>>482
つ[doxygen]

484 名前:デフォルトの名無しさん [2007/07/02(月) 12:53:35 ]
>483
ありがとうございます。でも、
そういう高度なのは使いこなせそいうにないので、
具体的なサンプルを探しています。よろしく。

485 名前:デフォルトの名無しさん [2007/07/02(月) 12:58:04 ]
#include <stdio.h>
int main(void)
{
int a,b,c;
printf("ピラミッドを作りましょう");
printf("何段ですか:"); scanf("%d",&a);
for (b = 1; b <= a; b++) {
for (c = a; c > 1; c--)
putchar(' ');
for (c = 1; c < 2b; c++)
putchar('*');
putchar('\n');
}
return 0;
}

何が変なんですかね

486 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 12:59:39 ]
使いこなさなくてもいいから、Doxygenスタイルで書いて置いたらいいんでね?
もし>484がロートル、コボラの気に入りそうな「枠に填まった」コメントが好きならサンプル出してもいいけど。
#コメントを書くのに手間が掛かるのなんて論外だと思うんだがね。

487 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 13:00:23 ]
>>485
エラーメッセージくらい読め



488 名前:2b mailto:sage [2007/07/02(月) 13:00:50 ]
>>485
あんたの頭。コンパイルエラーが出たのなら、その内容くらい書くのが当然だ。

489 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 13:01:36 ]
2b

490 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 13:03:19 ]
>>488
これは間違いなくツンデレ

491 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 13:04:29 ]
ついでにピラミッドにするためには c > 1 じゃなくて c > b だと思われる

492 名前:デフォルトの名無しさん [2007/07/02(月) 13:06:36 ]
エラー E2378 4-18.cpp 10: For文に ; がない(関数 main() )
エラー E2379 4-18.cpp 10: ステートメントにセミコロン(;)がない(関数 main() )

493 名前:デフォルトの名無しさん [2007/07/02(月) 13:11:00 ]
>>489
できました。
ありがとうございました

494 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 13:22:53 ]
488をスルーするとは酷い奴だ

495 名前:488 mailto:sage [2007/07/02(月) 13:34:56 ]
べ、べつに気づいてもらいたくて名前に仕込んだわけじゃないからね。
「意味のないレスするな」って言われないための予防策なんだから。

496 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 17:03:31 ]
死ねよ

497 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 17:13:50 ]
山岡来た



498 名前:デフォルトの名無しさん [2007/07/02(月) 19:37:41 ]
2から5までとか指定するのってどう書けばよかったっけ?

499 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 19:39:44 ]
日本語を正しく書いてください

500 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 19:40:37 ]
さすがにこれはエスパーじゃないと解読不能だな

501 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 19:42:14 ]
for(i=2; i<=5; i++) printf("%d")

switch(n)
{
case 2:
case 3:
case 4:
case 5:
  printf("2..5");
}

if(2 <= n && n <= 5) printf("2..5");

502 名前:デフォルトの名無しさん [2007/07/02(月) 19:42:33 ]
変数iにおいて iが2から5という条件 文書くときに
if(???)
の中身はどう書けばよいですか?

503 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 19:43:47 ]
if (i >= 2 && i <= 5) ...

504 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 19:56:35 ]
>>482
こういうのってめっちゃ素人くさいな。

505 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 19:58:12 ]
しかるべきところで職につけばお前も目にすることがあるかもしれないよ

506 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:00:14 ]
関数ヘッダクラスヘッダはあったほうがソース見やすい。
どうせ引数説明とか入れるんだし。
もちろブロックコメントでな。ラインコメントをいくつも並べるのはカッコワル。

507 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:01:54 ]
あと、関数ヘッダコメントに、その関数名をいちいち入れてるのってカコワルイ
おまえ、それ何の意味があるんだと。



508 名前:デフォルトの名無しさん [2007/07/02(月) 20:23:01 ]
質問があるので宜しくお願い致します。

どうして、128バイトは1,024ビットになるのかわかりません
どういう計算をすれば、そうなるのでしょうか?

509 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:31:06 ]
>>508
ほとんどの環境で1バイト=8ビット

510 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:36:25 ]
>>482
そういうのがある時点でかっこ悪いよ…

511 名前:デフォルトの名無しさん [2007/07/02(月) 20:46:27 ]
>>509
ん〜考えても、どうして128バイトは1,024ビットになるのかわかりません
何の何階乗をすれbいいのでしょうか?

512 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:47:49 ]
128 * 8 = 1024

513 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:47:55 ]
8 * 128 = 1024

514 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:56:34 ]
>>511
みなさんからいっぱいのレスだけども
も〜ちょっと分かりやすく書くと

128バイト×8ビット/バイト=1024ビット

515 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:59:17 ]
1バイト=8ビット
ってのを知らないだけなんじゃね

516 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:00:23 ]
かけ算ができないだけだろ

517 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:07:17 ]
容量換算の1(M)=2^10(K)=1024(K)とかとごっちゃになっているんじゃない?



518 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:08:26 ]
いちいちゴミ撒かんと気が済まんのかこのスレは・・・

519 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:09:32 ]
どっちがビットでどっちがバイトだっけ?
そんな時期が私にもありました(AA略

520 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:16:43 ]
そもそも1バイト=8ビットと決まってるわけじゃねーし。
厳密に8ビットというなら1オクテットと表現すべき。

521 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:20:50 ]
じゃ1バイト=9bitなんていういかれた環境があるのかよ!
と思っていた時期が私にもありました

本当にあったんだね

522 名前:511 [2007/07/02(月) 21:21:02 ]
サンクスです

ですが、どうして128 * 8 して出すのかが
納得できません。。。

523 名前:511 [2007/07/02(月) 21:21:52 ]
なんとなくわかりました
サンクスでした

524 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:30:20 ]
なんとなくかよw
じゃあ君が大好きなタコを例にして分かりやすく解説しよう。

「タコには足が8本あります。ここにタコが128匹います。全部で足は何本でしょう?」

タコ→バイト、足→ビット、に置き換えるとあら不思議。

525 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:34:05 ]
128匹のタコ全部が足8本だとは限らないだろ

526 名前:390 mailto:sage [2007/07/02(月) 22:45:49 ]
#include <stdio.h>

main()
{
int a;
float b;

for(a=0; a<=100; a++)
printf("セ氏温度:%d カ氏温度:%.2f\n",a ,fahrenheit(a,b));
}

int fahrenheit(int x,int y)
{
y = (float)(9/5)*x+32;
return y;
}

セ氏温度0〜100℃に対してカ氏温度を出したいのですが
出力の際、カ氏温度が0.00になってしまします。
間違っているところの指摘をお願いします。

527 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:46:43 ]
例の一匹の足の1本はすでに俺は食べた



528 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:50:20 ]
>>526
fahrenheit()の第2引数はint型なのにfloat型のbを渡している
fahrenheit()の戻り値の型はint型なのに%.2fを指定している

529 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:53:38 ]
もうひとつ。どっちにしろint型で返すことになってるが、
y = (float)(9/5)*x+32;
は意図したのと違くなっていると思う

530 名前:526 mailto:sage [2007/07/02(月) 23:04:50 ]
>>fahrenheit()の戻り値の型はint型なのに

この部分はどう直せばいいのですか?

531 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:08:52 ]
戻り値をfloatに変えるとか、%dに変えるとか

532 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:19:45 ]
struct abc{
char a;
}

main()
{
char b, c;

c = ((struct abc)b).a;
c = ((struct abc *)b)->a;
}

c = ((struct abc)b).a;がダメで
c = ((struct abc *)b)->a;が良い理屈を教えて下さい。


533 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:22:10 ]
>>532
それって良いのか?
コンパイルは通るだろうが、実行したら間違いなくSegmentFaultだぞ

534 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:22:17 ]
((struct abc *)b)->a;
は偶然うまく動くかもしれないが、よくない。

535 名前:526 mailto:sage [2007/07/02(月) 23:23:06 ]
エラーで「初期化されていないローカル変数"b"が使用されます」
と出るのですがこれが原因ですか?

536 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:24:31 ]
>>533
aのoffsetが0ならうまく動くだろ。

537 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:25:19 ]
>>532
(struct abc *)b はbで示される何らかの値をstruct abc のポインタに変換している

で b の値はポインタか?
どっちもよろしくない



538 名前:536 mailto:sage [2007/07/02(月) 23:29:11 ]
てっきり、&bかと思ってたわ・・・

539 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:34:58 ]
>>535
a はfor文で値が入るが b には初期かも代入もされていない
b に値を入れろ

540 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:38:15 ]
>>536

c = ((struct abc *)&b)->a;

なら、aのoffsetが0ならうまく動くかも知れん。
が、>>532はそうはなっていないので間違いなく保護違反

541 名前:532 mailto:sage [2007/07/02(月) 23:58:38 ]
ほんと、すいません。
c = ((struct abc *)&b)->a;
でした。

542 名前:535 mailto:sage [2007/07/02(月) 23:58:55 ]
>>539
bに値を入れたら結果が変わりませんか?

543 名前:532 mailto:sage [2007/07/03(火) 00:04:41 ]
素人目にはc = ((struct abc)b).a;でも
問題ないように思えるのですが、
なにがダメなのでしょうか。

544 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:09:44 ]
そう思えるから素人なんです。

545 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:52:50 ]
すげえ正論だが質問の答えにはなってないな

546 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:55:00 ]
>>543
何でって言われても、言語仕様でそのようなキャストは認められていないから、としか。

547 名前:511 [2007/07/03(火) 00:56:08 ]
>>524
8~128でしょうか?



548 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:57:13 ]
タコ釣りか?

549 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:57:38 ]
~ ってなんだよ

550 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:59:48 ]
ティルデ

551 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:03:41 ]
ニョロ

552 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:05:08 ]
0 1ビット
01 2ビット
010 3ビット
0101 4ビット
01010 5ビット
010101 6ビット
0101010 7ビット
01010101 1バイト

553 名前:デフォルトの名無しさん [2007/07/03(火) 01:08:27 ]
>>547
例題がタコだからといって、演算子までタコにするのはやめような。

554 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:10:35 ]
いつか 1byte != 1octet の時代は来るのだろうかー・・・

555 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:11:49 ]
ヽ (゚o゚)∫
 ノ川ル

556 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:12:40 ]
>>554
1byte == 1octet の時代なんて一度も来た事がないんだが。

557 名前:デフォルトの名無しさん [2007/07/03(火) 01:21:37 ]
まだC言語とかやってたんだ。
懐かしいなー



558 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 02:01:19 ]
今でも、36ビットワードマシンとかでは1バイト=9ビットだね

UTF−9とかもあるし

559 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 02:04:28 ]
UTF-9 はエイプリルフールのネタじゃなかったっけ?

560 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 07:16:54 ]
scanfやfgetsで文字を入れて
文字列を比較する場合、どうすればいいんでしょうか?

char* str;
fgets(str,100,stdin);
if(str=="start"){
なんとかかんとか;
}

これ、うまく動かないんですが

561 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 07:18:20 ]
strcmp

562 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 07:33:18 ]
>>560
1. str の指す領域を確保する
2. 文字列の比較には strcmp を使う
3. 比較する文字列を "start\n" にする

563 名前:526 mailto:sage [2007/07/03(火) 08:27:43 ]
#include <stdio.h>

main()
{
int a;
int b=0;

for(a=0; a<=100; a++)
printf("セ氏温度:%d カ氏温度:%d\n",a ,fahrenheit(a,b));
}

int fahrenheit(int x, int y)
{
y = (9/5)*x+32;
return y;
}

誰かこのプログラムをカ氏温度が小数点まで
出力されるように改ざんしてください;

564 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:29:25 ]
>>563
double型の変数でも使えばええやん・・・

565 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:48:21 ]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct list{
char *name;
struct list* next;
};

int main(void){
struct list *head,*ume;
char *str;
head=NULL;
str=(char*)malloc(100*sizeof(char));
printf("名前を入力(endで終了)>");
fgets(str,100,stdin);
while(strcmp(str,"end\n")!=0){
ume=(struct list*)malloc(sizeof(struct list));
ume->name=str;
ume->next=head;
head=ume;
printf("名前を入力(endで終了)>");
fgets(str,100,stdin);
}
printf("%s%p\n",head->name,head);
return 0;
}
リスト構造体のテストやってみたんですが
これ実行して、taro、hanako、endと入力したら
endが表示されるんだけどどこがおかしいんですかね?
endと入力した時点でwhileから抜け出し、head->nameがendになると思えないんですが・・・

566 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:54:24 ]
>>565
> head->nameがend
ume->next=head;
head=ume;
↑そりゃなるだろw

567 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:05:44 ]
>>565
おかしいっていうのは、期待した動作と違うって事だろうけど
何をしたいのか分からんのに、答えられるわけ無いだろ



568 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:16:49 ]
>>565
エスパー回答
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct list{
char *name;
struct list *next;
};
int main(void){
struct list *head, *ume;
char *str;
head = NULL;
str = (char *) malloc(100 * sizeof(char));
for(;;){
printf("名前を入力(endで終了)>");
fgets(str, 100, stdin);
if(strcmp(str, "end\n") == 0) break;
ume = (struct list *) malloc(sizeof(struct list));
ume->name = strdup(str);
ume->next = head;
head = ume;
}
ume=head;
while(ume!=NULL){
printf("%s", ume->name);
ume=ume->next;
}
return 0;
}

569 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:21:00 ]
>565
ume->nameは常にstrを指していて、最後にendになってんだから当たり前だろ。

570 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:45:41 ]
>>565
まあ大体察しはつくが・・・

「おかしい」って言う以前に、どういう動作を期待しているのかちゃんと書こうな

571 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:54:45 ]
どのくらいの変数が必要なのかよくわからないときは
とりあえず多めに変数宣言用意しておいてもいい?
int i,j,k,l;
double a,b,c,d,e;
char f[1000],g[1000],e[1000];

とか・・・
変数○○は使われていませんって警告がでるけど
多くしたら実行速度下がるとかエラーでるとかこまったことがおきるとかありますか?

572 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:54:56 ]
struct list{
char *name; < いっ、いいんかい?
struct list *next;
};

573 名前:デフォルトの名無しさん [2007/07/03(火) 09:59:25 ]
571
困ったことが起こるよ
new だといい

574 名前:デフォルトの名無しさん [2007/07/03(火) 10:02:14 ]
571
使ったことないけど
std::vector, std::string
がいいみたいだよ

575 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 10:08:31 ]
C++とSTLの世界へご招待〜

576 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 10:14:18 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。

577 名前:デフォルトの名無しさん [2007/07/03(火) 10:16:25 ]
576
C言語専用の環境使っているやつがいるか?



578 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 10:21:31 ]
そりゃいるでしょ

579 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 10:25:00 ]
>>571
一応ありはありだが
・万一配列のサイズを超えたときにそれをはじくようなチェックを入れておく。
・スタックにあまり大きな配列を取らない(char *f, *g, *eにして領域をmallocする)。
あたりは注意しておいたほうがいい。
速度はメモリ浪費でスワップしない限りさほど落ちない。

580 名前:デフォルトの名無しさん [2007/07/03(火) 10:30:04 ]
今日はじめてSTLググってみたけど、これは使うべきだな
初心者こそ使うべきだな
コーディングが楽になるな

581 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:45:36 ]
charの配列の[0]から[3]の4バイトにデータがあります。
これを一つのintの変数に入れたいのですが、どうやればいいですか?

582 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:48:29 ]
>>581
過去ログを読む気がないのなら、やりたいことを具体的に書け。
どんなデータをどう入れたいのか判らんことには答えようがない。

583 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:48:39 ]
*(int*)配列名

584 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:49:50 ]
>>583
バスエラーの可能性ががが

585 名前:デフォルトの名無しさん [2007/07/03(火) 11:55:18 ]
c[0]+(c[1]<<8)+(c[2]<<16)+(c[3]<<24)

586 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:56:39 ]
union使うとか

587 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:57:53 ]
>584
配列の0から3でもバスエラーって発生するもんなの?



588 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 12:00:28 ]
>>587
char配列がint安全な場所に作られる保証はない。
その点ではunionの方がまし。
しかし、unionには言語仕様的に実装依存の罠が。
そういう意味では>585でいいのだがエンディアンの問題が残る。

まぁ、最近のコンパイラならどれで書いても同じようなコードを吐くしね。

589 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 12:11:23 ]
>>588
そういやこういう場合かもしれんしな。

#include <stdio.h>
#include <stddef.h>

int main() {
struct A {
char a;
char b[4];
};

printf("%ld\n", offsetof(struct A, b));
}

590 名前:581 mailto:sage [2007/07/03(火) 12:30:43 ]
>>583
一番簡潔なのですがかなり難解です。これから考えます。
>>585
一番分かり易いです。

unionの使い方に悩みましたがcharの配列と一つのintのメンバ変数を用意して
charの配列にデータを入れてintのメンバ変数でアクセスすればいいのですね。面白い。

591 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 12:36:02 ]
GCC で試した所、
-O (最適化レベル1か、それ以上)
-funroll-loops (ループ展開最適化)
フラグを立てると >>585 みたいなコードを吐いてくれるみたいだ。

int toInt(const char* ch) {
union {
char ch[sizeof (int)];
int i;
} endian;

int i;
int shift, dshift;
int n = 0;

endian.i = 0;
shift = *endian.ch ? 0 : (sizeof (int) - 1) * CHAR_BIT;
dshift = *endian.ch ? CHAR_BIT : -CHAR_BIT;
for(i = 0; i < sizeof (int); i++) {
n |= ch[i] << shift;
shift += dshift;
}
return n;
}

592 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:59:59 ]
最近、関数のメモリの場所をポインタで取得できることを知ったのですが、
これを利用してデリゲートまがいなことってできませんかね?

593 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 15:00:37 ]
qsort() とか使ったことない?

594 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 15:41:43 ]
int a, b;
があって両者の絶対値の大きさを比較したいとき
自乗した値を比較するのとabs()を使うのではどちらが速いのでしょう?
自乗してもintの範囲を超えないことは保証されているという前提で。

またこういったベンチマークテストはどうやって行うのでしょう?

595 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:02:53 ]
数百万回〜数億回くらい実行して、速度を比較する。

596 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:15:19 ]
>>594
こんなコードを書いてみる。
#include <stdio.h>
#include <stdlib.h>

int main()
{
volatile int a;
volatile int b;
for (int ic = 0; ic < 100 * 1000 * 1000; ++ic) {
#if 1
volatile int c = abs(a) > abs(b);
#else
volatile int c = a * a > b * b;
#endif
}
return 0;
}
こいつをこんな感じで実行してみる。
$ gcc foo.c -std=c99 -O3 ; time ./a
foo.c: In function `main':
foo.c:11: warning: unused variable `c'

real 0m0.734s
user 0m0.687s
sys 0m0.047s
意外にも、abs()の方が遅かった。

597 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:18:21 ]
abs は条件判定が必要だからな。



598 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:34:10 ]
あー、volatile宣言のお蔭で、参照回数の影響も出ちゃった。
よって一部訂正。
#if 0
int aa = a; int bb = b;
volatile int c = abs(aa) > abs(bb);
#else
int aa = a; int bb = b;
volatile int c = aa * aa > bb * bb;
#endif
今回は大勢に影響はなかったけど。
で、ついでに-Sでアセンブリ出力を眺める。二乗版はこんだけ。
movl -4(%ebp), %eax
movl -8(%ebp), %edx
imull %eax, %eax
imull %edx, %edx
cmpl %edx, %eax
setg %dl
movb %dl, -9(%ebp)
abs()版はどうしても条件分岐しないためにビット操作であれこれ捻り過ぎ。
movl -8(%ebp), %edx
movl -12(%ebp), %eax
movl %edx, %ecx
sarl $31, %ecx
xorl %ecx, %edx
subl %ecx, %edx
movl %eax, %ecx
sarl $31, %ecx
xorl %ecx, %eax
subl %ecx, %eax
cmpl %eax, %edx
setg %dl
movb %dl, -13(%ebp)

599 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:50:59 ]
バイナリーサーチというものをやる場合
データが小さい順もしくは大きい順に並んでなかったらできない?
つまりめちゃくちゃなデーターがあったら一旦それをバブルソートなどで整列させないとダメってことですか?

600 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:51:52 ]
そう。

601 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:52:21 ]
わざわざバブルソートを選択する理由も無いけどな

602 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:52:46 ]
>>599
その通りです
バブルソートである必要はありませんが…

603 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:00:04 ]
バブルソート突っ込まれ過ぎワロタ

604 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:19:51 ]
>>599
揃っているからこそのバイナリサーチじゃないか。
って、仕組み見たら一目瞭然だと思うが・・・・・

で、バブルソートである意味はない。

でも、ふと思ったのは、必要なものをすべて見つける必要はなくて
一つ見つければいいというのであれば、動的に必要な部分だけ
ソートしながら利用するっていう使い方もあるのかな、と思った。

レイトバインディングのように、対象要素が大きくて
ソートの初期化コストが大きかったり頻繁に要素が追加されるという状況で使えないかな?
それともそういう場合はB-Treeとかを使っておくべき?(追加のコストによるのかな?)

605 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 19:08:21 ]
#include いろいろ
struct list{
int data;
struct list *next;
};
void showlist();
int main(void){
int indata,i,j;
struct list *head,*test;
head=NULL;
while(1){
printf("数を入力(終了は0)>");scanf("%d",&indata);
if(indata==0)
break;
test=(struct list*)malloc(sizeof(struct list));
test->data=indata;
test->next=head;
head=test;
}
showlist();
return 0;
}
void showlist(){
struct list *now;
while (now!=NULL){
printf("%d ",now->data);
now=now->next;
}
};

構造ポインタで次々入力しshowlistで表示するというのを作ったんだけど
これ実行したら、mainのreturn 0の上のshowlistがプロトタイプ宣言が無いと警告でるんですがどうしたらいいですか?

606 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 19:25:05 ]
void showlist(void);
         ↑型を入れる

607 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:14:24 ]
#include <stdio.h>

void inputdata(int data[],int n);

int main(void){
int x[10];
inputdata(x,10);
return 0;
}

void inputdata(int data[],int n){//inputdata関数
int i;
for(i=0;i<n;i++){
printf("Input data>");
scanf("%d",&data[i]);
}
for(i=0;i<n;i++){
printf("data[%d]=%d",i,*data[i]);
}
}

C言語について質問です
配列x[0]〜x[9]のそれぞれに値を入れて表示するというinputdata関数を作ってみたいんですが
これ動きません。どのように関数を直せばよいのでしょうか?



608 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:19:42 ]
int *data[]

609 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:34:33 ]
printf("data[%d]=%d",i,*data[i]);

printf("data[%d]=%d",i,data[i]);

610 名前:デフォルトの名無しさん [2007/07/03(火) 20:55:02 ]
2^8は65,536でしょうか?

611 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:58:26 ]
それくらいぐぐれよ
www.google.co.jp/search?q=2%5E8

612 名前:デフォルトの名無しさん [2007/07/03(火) 21:09:46 ]
さんkyさう

613 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:15:15 ]
つーかプログラミング勉強してる奴が電卓の使い方も(その存在も?)和歌ランとは・・・

614 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:19:11 ]
小学生なんだろ。

615 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:47:58 ]
2^8 = 16^2 = 0xFF

616 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:52:29 ]
二次元配列で構造体を使って
その中身の計算に
違う二次元配列の中身を用いないといけないんだけど
すげーキレそう

617 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:57:59 ]
ゆとりは相変わらずキレやすいな。



618 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:03:50 ]
トイレに行くと血が・・・ orz

619 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:04:52 ]
>>618
今日あの日だろ

620 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:14:14 ]
>>618
肛門様を大事に

621 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:25:36 ]
cdっていう配列があったとして
&cd[0]

cd
は全く同じ意味ですか?

622 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:27:05 ]
ほぼ同じ意味

623 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:27:28 ]
>>621
「2*2」と「1*4」は同じですか?
という質問と同じです。

値も型も同じですが、意図が違います

624 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:27:32 ]
cdとブルーレイくらいしか変わらない

625 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:28:25 ]
sizeofの引数にしてみそ

626 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:47:34 ]
void型の関数でwhileやifの途中で関数を終わらせるにはどうしたらいいでしょうか?
int型とかなら
if(x==1)
return 0;
とかやれば関数から抜け出せるけど
void型はどうやるんですか?

627 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:48:33 ]
return;



628 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 00:02:09 ]
だが、ループの途中からリターンするのはあんまり気持ちのいいもんじゃないよ。

629 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 00:05:51 ]
そして、じゃあbreakはどうなんだ?というような宗教論争に

630 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 00:12:35 ]
ネストされたループとか考えるとループ中のreturnはやむを得ない気がする。

631 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:03:33 ]
10GBぐらいある巨大なテキストデータの中のある1行を
書き換えたいんだけどどうやればできますか。
普通にやると,また10GB書き出さないと出来ないような。

632 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:10:57 ]

双方向リストに関する質問です。

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4492.txt

双方向リストの先頭と末尾へ要素を追加する関数と、
先頭と末尾の要素を削除する関数を書いてみたのですが、
末尾要素を削除する関数 DelTail() が思うように動いてくれません。

free()する対象が悪いのではないかと推測していますが、
検討もつかないというのが実際のところです。

他の関数についてもツッコミいただければと思います。


633 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:11:06 ]
>>621
int cd[10]; として、

&cd[0] の型は int* で、
cd の型は int [10] だな。

全く同じではない。

634 名前:デフォルトの名無しさん [2007/07/04(水) 01:18:05 ]
632

www.geocities.jp/ky_webid/cpp/library/003.html

●C++編(標準ライブラリ) 第3章 list
listは双方向リストを構築したテンプレートクラスです。


635 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:18:07 ]
>>631
ファイルでもメモリーでもどっちでもいいが、書き換えサイズが同じなら、読んで書いて閉じればそれで終わり。
挿入や削除ならそこでちょん切ってリスト構造で繋ぎ直す。


636 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:43:20 ]
>>634
そのページのC編のほうのも参考にしてみたのですが、
できればグローバル変数を使わずに、
かつ、リスト操作関数の引数も、リストへのポインタだけにしたいのです。

逆に、関数内で作業用の変数が増えるのはあまりこだわりません。
もちろん、良識のある範囲で少ないほうがいいのですが。


637 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:44:58 ]
Add系の関数の引数はデータもあるので、
増やす方は2コ(リストと要素)、減らす方は1コ、というのが正しいですね。




638 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:45:03 ]
>>631
ファイルをリスト構造にする。
ところどころにダミーデータをいれておいて、そこをバッファに使う。
書き換えたい所を含んだクラスタを別のクラスタに繋ぎなおす。
別のファイルにパッチ情報として〜行目はこの内容に置き換わりました、のような情報を入れてセットで扱う。
直した所から後ろをそっくり書き直す


639 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:11:46 ]
fgets(hoge, 64, stdin);
みたいにしたとき、入力が64文字以上あるとどうなりますか?
63文字目までがhogeに入って後は無視されるんでしょうか?

640 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:14:48 ]
63文字だけ stdin から読み込む、だけ。
後は次の読み込みがあれば、その時に読み込まれる。

641 名前:639 mailto:sage [2007/07/04(水) 03:07:44 ]
では、64文字目以降の改行までを無視することはできますか?
fflush(stdin);
してしまうと、リダイレクトされてきた時に
改行以降も全て捨てられてしまうのでは?

642 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 03:16:35 ]
hoge[62] = 0;
hoge[63] = 1;
fgets(hoge, 64, stdin);
if(hoge[63] == 0 && hoge[62] != '\n') {
scanf("%*[^\n]s");
getchar();
}

643 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 08:40:22 ]
int *p,a;
p=&a;
ってやったら
*pはaと同じ(*p=a)になるんでしょ
でも@=&aとやらず*p=aはなんでダメなの?


644 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 08:43:50 ]
*p==a
p==&a

645 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 08:48:28 ]
int *p,a;
p=&a;
*p = 10;
printf("%d\n",a);
a = 20;
printf("%d\n",*p);

646 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 08:50:31 ]
pが未初期化だとどこさしてるかわからんのに
その先に値を書き込もうとするか

647 名前:デフォルトの名無しさん [2007/07/04(水) 12:10:01 ]
STL勉強してるんだけど

vector<string>とかできるの?



648 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:10:52 ]
スレタイ読めないの?

649 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:42:43 ]
試せば分かることをわざわざ聞きにくるやつに
スレタイを正しく読むのは難しいだろ

650 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:05:10 ]
試して出来ないから聞いてんじゃないの? 
少しは予測しろよw

651 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:16:20 ]
それは有り得ない話だ。

652 名前:デフォルトの名無しさん [2007/07/04(水) 13:20:44 ]
STL勉強してるんだけど

vector<vector>とかできるの?
vector<vector<int>>とか
vector<vector<vector>>
とかできるの?

653 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:25:34 ]
これはひどい

654 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:31:33 ]
スレタイくらい読め

655 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:58:39 ]
STLはC言語では使えん

vector<vector<int> >
vector<vector<vector<int> > >
で試せ

656 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:34:52 ]
つ[名前空間]
まあスレタイも読めないおばかさんは一生悩んでろ。

657 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:09:49 ]
switch( uMsg )

case WM_CREATE:
test1=1;
test2=2;
break;

case WM_CREATE:
{
test1=1;
test2=2;
}
break;

case WM_CREATE:
{
test1=1;
test2=2;
}
return;

case WM_CREATE:
{
test1=1;
test2=2;
return;
}


どれ使ってもOK?



658 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:11:06 ]
OK

659 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:11:26 ]
{}で囲むのは途中で変数宣言したいとき。
breakとreturnは意味が違う。

660 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:16:09 ]
別に変数宣言しなくても囲ってもいい

661 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:09:43 ]
switch、caseに関わらず、別にスコープは好きなところで使って構わない。


662 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:14:36 ]
関数内ならね。

663 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:16:27 ]
>>641
fflushは入力バッファに対してどう作用するか定められていない
(出力バッファを吐き出すことだけが規定されている)ので、
このスレとしては知らないという答えになる。

664 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:50:24 ]
{ }は見やすくするためにつけたけど、どこでも使ってOKなのね。
breakとreturnはよく考えるとぜんぜん意味が違う事に気づいた
なぜreturnが入ってたんだろうw

665 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:07:30 ]
関数と定義するとき、プロトタイプ宣言が必要って言われてますよね?
プロトタイプ宣言って必要なんですか?
なくても動くと思うのですが・・・

666 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:13:08 ]
なくても動きますし、必須でもありません。
あなたがいらないと思うなら必要ではないでしょう・

667 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:16:40 ]
なくても必ず正しく動くわけじゃないぞ。



668 名前:デフォルトの名無しさん [2007/07/04(水) 19:20:45 ]
自前の関数を関数内で使うときじょんじょが大事になる

669 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:35:19 ]
例えばいつもおなじみのstdio.hという標準入出力ライブラリのヘッダファイルには
printf関数やらfopen関数やらのプロトタイプ宣言がずらずらと並んでる
stdio.hにはプロトタイプ宣言だけが書かれてて,printf関数やfopen関数の実装はstdio.cに記述されている

ライブラリってのはヘッダファイルとソースファイルが対になっていて
ヘッダファイルに「このライブラリはこんな機能を提供しますよ〜」っと目次みたいなもんを書いてるわけだ
それがプロトタイプ宣言

なんでこんなことを分けるするかってのはソースを分割して機能別にライブラリ化するため
1個だけのソースファイルでプログラミングしてる時は必要無いけど普通はプロトタイプ宣言も書いておく
main関数の前にずらずら別の関数の実装が並んでいると,どこがmainの始まりか探すのが大変なのもある


670 名前:デフォルトの名無しさん [2007/07/04(水) 20:18:02 ]
年と月を入力して
2007 7
sun mon tue wed thu fri sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

みたいな万年カレンダーを作りたいんですけど、アルゴリズムを詳しく教えてほしいです。
よろしくおねがいします。

671 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:19:53 ]
あ、数字がずれてる…。
sunのnの下に1がきてmonのnのしたに2がくる感じです

672 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:38:15 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4502.txt

上のプログラムは、入力した文字を逆向きにプリントしちゃうはずの
自分でゆうのもなんですが、優れものなんです。が
実行すると、何故か変な文字列が入っちゃいます><
こんな感じ↓(testと入力した場合)
www.uploda.org/uporg888409.jpg.html

どなたか、原因を教えてくださいな
教えてくれた方に、僕のケツ穴差し上げます><


673 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:42:44 ]
ソース見た瞬間意識が朦朧としてきた

674 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:49:51 ]
>672
文字列の終端は'\n'じゃない
てめえの汚えケツ穴なんぞ誰がいるかってんだ

675 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:05:09 ]
>>673
朦朧としてると、こっちから押し倒しちゃうze(はぁと

>>674
ありがちんこ☆
\0か!


676 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:09:59 ]
あえて断言しよう

>>674は絶好のチャンスを失った、と。


677 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:12:21 ]
>>670
#include <unistd.h>
int main(int argc, char *argv[]){return execlp("cal", "cal", argv[2], argv[1], NULL);}




678 名前:デフォルトの名無しさん mailto:age [2007/07/04(水) 21:14:37 ]
例えば、以下のような4つの要素からなる列が複数あるものに対して、
次のような処理:
(1)1番目の要素が同一の場合、後から出現したものを採用する
(2)3番目の要素でソートする
を行いたいのですが、どのようなアルゴリズムになりますか?

例)
0010 ABC 60 70
0022 BCD 56 76
0010 EFG 85 34
0003 HIJ 70 98



0010 EFG 85 34
0003 HIJ 70 98
0022 BCD 56 76


679 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:15:51 ]
普通に配列につめてソートします。

680 名前:678 mailto:age [2007/07/04(水) 21:50:09 ]
>>679
普通に配列からソートする場合、
どのように(1)の条件をクリアしますか?
そこで困っています。

681 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:59:03 ]
同じものが出てきたら上書きする

682 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:25:35 ]
1番目の要素が同一かどうか調べて、同一なら上書きすればいい(例だと、消去してる?)

683 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:29:19 ]
>>680
0000番から9999番までの箱を用意してそれぞれの箱に入れていく。
で、既に入ってる場合は入ってるものを捨てて代わりを入れる。

全部入れ終わったらソート。

無駄だらけだけど分かりやすい考え方だとこんな感じ?

684 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:30:50 ]
int i, j, k, n;
for(i=n-1; i> 0; i--) {
   for(j=i-1; j>=0; j--) {
      if(a[j]==a[i]) {
         for(k=j; k<n-1; k++) a[k] = a[k+1];
         n--;
         i--;
      }
   }
}
こんな感じで同じものを消去すりゃいいんじゃね?

685 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:31:14 ]
ソートしてからの方が効率いいだろ・・・

686 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:34:55 ]
>>685
ソートしちゃうとどれが先にでてきたか分からなくならない?
いや、マージソートとかならいいけど

687 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:38:45 ]
>>686
そのための安定ソートだろ
入門篇ならバブルソートだろう



688 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:44:16 ]
>>685
ソートは3番目の要素でするんだぞ?

689 名前:678 mailto:age [2007/07/04(水) 22:45:58 ]
>>683
それ考えたんですけど、
実際は0000000000番から9999999999番まで(10桁)あり、
番号も全部あるわけじゃないからやっぱり効率悪いですよね。
はやさも求められているんで・・・

ハッシュとか2分探索とか使うんですかね?

690 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:50:51 ]
>688
一番目の要素で安定ソート
一番目の要素でのかぶりを削除
三番目の要素でソート
ってことだろ。

691 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:53:29 ]
インデックス情報を付加しといて qsort という手もある。

692 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:05:49 ]
標準ライブラリに無いのが難点だけど
重複してるかどうか調べるのはハッシュ使うのがいいと思う

693 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:08:01 ]
インデックス用の配列mallocしてqsortが一番楽だろ

694 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 09:38:27 ]
>>672
それどっかの入門書に載ってたぞ

695 名前:デフォルトの名無しさん [2007/07/05(木) 15:50:14 ]
CからつかえるフリーのXMLライブラリないですか?

696 名前:デフォルトの名無しさん [2007/07/05(木) 15:53:13 ]
何方か標準関数のプログラムの作り方教えてください

697 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 15:54:07 ]
日本語でもう一度



698 名前:デフォルトの名無しさん [2007/07/05(木) 15:55:33 ]
>>672見たらmain内で関数宣言してるけど、これはなに?
そういう手法があるの?関数の内容よりそっちに目がいった。
こんなことしたことないけど、どうなの?

699 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 15:58:24 ]
そりゃキミが知らないだけだろ

700 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:06:00 ]
プロトタイプ宣言くらい関数内でできる。

701 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:41:17 ]
次のような関数を作りました。
Vertices isMaxNoVer(Vertices R[]){
  Vertices max;
  int i, count=0;

  max.num = 0;
  max.deg = 0;
  max.no = 0;

  count = countVer(R);

  for(i=0; i<count-1; i++){
    if(max.no < R[i].no){
      max = R[i];
    }
  }

  return max;
}


この関数を、次の再帰関数を使って二度目に呼び出した時、
動作がおかしくなり、以下のようなおかしな値が入ります。
test expand 1, 8 -1073747304 134516287
更にその後2度目のtest expand 3に入る前に
セグメントエラーを起こして止まってしまいます。
これだけの情報でわかって頂けるかわかりませんが、
誰か助けてください。

702 名前:701 mailto:sage [2007/07/05(木) 16:42:43 ]
void expand(Vertices R[]){
  Vertices p, buf[N], Rp[N];

  while(countVer(R) != 0){
    p = isMaxNoVer(R);

    printf("test expand 1, %d %d %d\n", p.num, p.deg, p.no);
 
    if((countVer(Q) + p.no) > countVer(Qmax)){
      syokikaVer(buf);
      mataha(Q, p);
      printf("test expand 2\n");
      syokikaVer(buf);
      ganma(buf, p.no, G);
      printf("test expand 3\n");
      syokikaVer(Rp);
      katu(Rp, buf, R);
      printf("test expand 4\n");

703 名前:701 mailto:sage [2007/07/05(木) 16:44:38 ]
      if(countVer(Rp) != 0){
numberSort(Rp);
expand(Rp);
      }
      else if(countVer(Q) > countVer(Qmax)){
copyVer(Qmax, Q);
      }
      hiku(p, Q);
    }
    else return;
    hiku(p, R);
  }
  return;
}

QやQmax、Gはグローバル変数です。

704 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:03:30 ]
>>701
それだけだと分からんなぁ〜
katu(Rp, buf, R);
numberSort(Rp);
このへんの関数に問題ありそうだけど

705 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:29:52 ]
質問です。
今、以下のような関数と構造体を作ったのですが、

typedef struct
{
    int Length, Maximam, ValueSize;
    void* Array;
} ArrayList;

char* GetValue(ArrayList* list, int index)
{
    char* data = (char*)list->Array, item = malloc(list->ValueSize);
    int i = 0;
    unsigned int p = index * list->ValueSize;
    if(list->Length > index && item != NULL) {
        for(; i < list->ValueSize; i++) {
            item[i] = data[p + i];
        }
        return item;
    } else {
        return NULL;
    }
}

以下続く

706 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:33:11 ]
item

707 名前:705 mailto:sage [2007/07/05(木) 18:33:11 ]
void AddRange(ArrayList* list, const void* values, int length)
{
    char* data = (char*)list->Array, item = (char*)values;
    unsigned int i = 0, itemlength = length * list->Maximam, index = list->Length * list->ValueSize;
    if(list->Length + length >= list->Maximam) {
        list->Maximam += length * 2;
        list->Array = realloc(list->Array, list->ValueSize * list->Maximam);
    } for(; i < itemlength; i++) { data[index + i] = item[i]; }
    list->Length += length;
}

void main (void)
{
    ArrayList list = { 0, 4, sizeof(int), malloc(sizeof(int) * 4) };
    int i = 0;
    int s[10] = { 0, 1, 2, 3, 4, 5, 6 ,7 ,8 ,9 };
    AddRange(&list, s, 10); AddRange(&list, s, 10);
    for(; i < list.Length; i++) { printf("%d\n", *((int*)GetValue(&list, i))); }
}

どうしてもGetValueのchar* itemの領域が確保できないんです。
他にも、listのArrayをいじってもヒープが壊れてますとか言われるのですが…
なにかやってはいけないことでもやってしまっているのでしょうか?
行数圧縮しているため読みにくいとは思いますが、よろしくお願いします。



708 名前:705 mailto:sage [2007/07/05(木) 18:34:36 ]
ちなみに、元のソースではすべて

int i = 0;
int j = 0;

のように宣言しています。

709 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:38:04 ]
itemはchar型変数として宣言されてる
*itemで宣言しなきゃダメだろ

710 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 18:41:16 ]
>>709
元ソースでは
char*になってたんですが…
削りすぎた orz

711 名前:705 mailto:sage [2007/07/05(木) 19:07:04 ]
いろいろ試してみたのですが、
AddRange(&list, s, 10);を
連続でなくとも2回使用するとGetValueのitemの中がNULLに、
3回目からはAddRange(&list, s, 10);で行われるreallocで
ヒープが壊れているというエラーが出てくるようです。

何が悪いんだろ orz

712 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:09:20 ]
AddRangeの2回目でヒープ壊してる
itemlengthとreallocのサイズが乖離してる

713 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:17:30 ]
つーかGetValue()って範囲チェック除けば
char *GetValue(ArrayList list, int index)
{
return (char*)list.Array + index * list.ValueSize;
}
これで十分じゃね?

714 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:24:04 ]
itemlength = length * list->Maximam → itemlength = length * list->ValueSize
でいけるかな?


715 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:29:48 ]
>>712
itemlength = length * list->Maximam
のMaximamが原因でした。ValueSizeにするはずだったのに…
1回の使用だけだとエラーが出なかったので問題ないと思い込んで
気づかなかった orz

>>713
そんなやり方もあったんですか…
void*だとサイズわかんねぇよって怒られるのでchar*にして
コピーする方法しか知りませんでした。

>>714
全くその通りです。
まともにコードかけるようになるのは時間がかかりそうだ orz

ありがとうございました!

716 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 19:34:00 ]
素直に型を限定すればいいのに

717 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 21:55:47 ]
int型の数字を文字列に変換するのってどうやるん?
具体的に言うと
int n = 34;
char* nStr = intToStr( n ); /* nStr = "34" */
という風にしたいのだけれど。



718 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:03:14 ]
char *buf;
int n=34;
buf=メモリ確保
ssprintf(buf,"%d",n);

719 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:05:12 ]
>>717
sが一個多かった
sprintf


720 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:35:49 ]
>>718
サンキュ!
inline char* int2str( int n )
{
char *buffer;
buffer = malloc( sizeof( char ) );
sprintf( buffer, "%d", n );
return buffer != NULL ?
buffer:
"FAULT!!";
}
一応こういう感じで。

721 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:43:17 ]
>>720
>buffer = malloc( sizeof( char ) );
1バイトしか確保できないよ
'\0'しか格納できない
もう少し多めに確保して
>return buffer != NULL ? buffer:"FAULT!!";
buffer の確保が失敗した場合 sprintf( buffer, "%d", n ); でエラーが出る
buffer = malloc( sizeof( char ) );
if(buffer){
sprintf( buffer, "%d", n );
return buffer;
}
else {
return "FAULT!!";
}
のほうがいい気がする

722 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 22:57:49 ]
>>721
せっかくならmallocも直してやれよw
11桁くらい確保すれば十分の気がする

723 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:16:28 ]
>>720
んじゃ buffer = malloc(sizeof( char ) *12);
または buffer = malloc(12);

>>722
符号付の場合、'\0'いれると12文字になる

724 名前:デフォルトの名無しさん [2007/07/05(木) 23:40:25 ]

最強の関数教えてください


725 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:42:07 ]
VIPでやれ

726 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:42:25 ]
どう考えても main だろ。

727 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:43:51 ]
>>724
abort



728 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:49:33 ]
exit

729 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:35:39 ]
buffer = (char*)malloc(sizeof( char ) *12);
        ↑これは?

730 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:36:56 ]
bufferの型にあわせてあるんだろ。
C++じゃ必須の書き方だがCじゃいらん。

731 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:47:14 ]
CとかC++の問題じゃねーだろ・・・知ったかの初心者がレスしてんのか、ここは?
キャスト演算子とか知ってなさそうだな・・・平気で型の違う変数をキャスト演算子なしで
代入しちゃうようなヘボプログラマーかw

732 名前:デフォルトの名無しさん [2007/07/06(金) 01:48:12 ]
配列の添え字に変数を指定することは可能でしょうか?


733 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:54:01 ]
コンパイラが自動的にやってくれるのを当てにして失敗するプログラマー(プ

734 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:56:50 ]
>>730 (・∀・)ニヤニヤ
> bufferの型にあわせてあるんだろ。
> C++じゃ必須の書き方だがCじゃいらん。

735 名前:732 mailto:sage [2007/07/06(金) 01:57:25 ]
自己解決しました
可能っぽいですね

736 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:01:26 ]
>>730 (・∀・)y-~~~ ヤニヤニ

737 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:01:26 ]
C だと void* から別のポインタ型への変換は暗黙にできるだろ・・・常識的に考えて。



738 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:04:22 ]
void*が無かった頃のCならmallocはchar*を返したから
キャストしないと警告もんだとか言い出してみる。

739 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:04:47 ]
>>730 (・∀・)ニヤニヤ ヘボプログラマー必死だな

740 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:08:16 ]
>>738
malloc で気を使っても、
どっかで void* 使ってたらそれだけでアウツだけどな。
その環境なら。

741 名前:732 ◆L/nntMgEC6 [2007/07/06(金) 02:11:36 ]
>>735
可能なんですか?

742 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:12:01 ]
>>730 (・∀・)ニヤニヤ あるんだろ。Cじゃいらん。

743 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:24:21 ]
>>738 (・∀・)ニヤニヤ
> void*が無かった頃のCなら

744 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:27:29 ]
>>732
char a[10];
int i;

でa[i]ってことですか?
もちろん可能。

添え字は整数の値をとる式ならなんでもおkだぞ。

745 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:29:22 ]
>>744 (・∀・)ニヤニヤ
> 添え字は整数の値をとる式ならなんでもおkだぞ。

(VIPPERのAA略)<常識的に考えて配列の要素番号の範囲内だろ

746 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:33:49 ]
アホが常駐しとるな

747 名前:744 mailto:sage [2007/07/06(金) 02:34:12 ]
>>745
おまい!大丈夫か!
>>732は文法的に許されるかと質問しているんだろ!



748 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:34:50 ]
よい子がC言語の勉強実況してるからみてやろうぜ
WMPのファイル→URLを開く→matoinu.orz.hm:30000をコピペ→OK

実況スレ
何でも実況V なんでも実況フリーダム
live24.2ch.net/test/read.cgi/livevenus/1183654888/

面白いぜwwwwww



749 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:38:25 ]
範囲外まで指定できちゃうのがエラーの温床になってるしな。

750 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:40:29 ]
とりあえず (・∀・)ニヤニヤ を NG にした。

751 名前:732 ◆L/nntMgEC6 [2007/07/06(金) 02:42:37 ]
>>744さん
回答有難う御座います。

int i;
char a[]="abc";
i=strlen(a);
char b[i];

のような感じで使いたいのですが、可能でしょうか?

752 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:44:57 ]
>>747 (・∀・)ニヤニヤ 適切と不適切がわからないプログラマーワロスw
キャストは不要でつか〜〜〜?

753 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:46:39 ]
746 名前:デフォルトの名無しさん 投稿日:2007/07/06(金) 02:33:49
アホが常駐しとるな

(VIPPERのAA略) < 常識的に考えて知ったかぶって初心者にありもしないことを言う方がおかしいだろ
どう考えて配列を適切に参照できる、要素番号の範囲内の値をとる式ならって話ならわかるけどw

754 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:48:03 ]
とりあえず (VIPPERのAA略) を NG にした

755 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:49:35 ]
>>744 (^∀^) ニタニタ
> 添え字は整数の値をとる式ならなんでもおkだぞ。
整数の値をとる式ならなんでも 整数の値をとる式ならなんでも
こやつは要素数と参照できる範囲外の値をとってもおkなんだぞぉーーー!

756 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:50:28 ]
>>744 m9(^д^)9m プププ、(ダブル)プギャー

757 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:53:33 ]
文体変えてAA使っても、いつものアホだってことはバレバレ



758 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:53:52 ]
>>754
all right, I will use AA that's not for short.

759 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:54:34 ]
>>757
> いつものアホ
アホとか言っちゃってるよぉ〜〜〜、お前がアホのくせして初心者に大嘘教えているくせにw
お前みたいな奴にアホ言われたくね〜〜なぁ。俺は間違ってねーし。お前は不適切。

760 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:56:01 ]
VIPPER の AA 略 < 常識的に考えて、文法的におkってことを持ち出して
不十分な(というか間違っている)説明の言い訳をするかぁ?
んじゃお前は a[10] の配列の10番目を参照するときは a[10] とでもやってろよ

761 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:56:21 ]
>>751
それはダメ。
配列変数の宣言文には変数は使えない。
それをするなら

nt i;
char a[]="abc";
char *b;
i=strlen(a);
b=(char*)malloc(sizeof(char)*i);

762 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:56:51 ]
>>751
int i;
char a[]="abc";
char *b;
i=strlen(a);
b = (char*)malloc(sizeof(char)*i);

free(b);

スレの流れからすればこんな感じ
bにaと同じ長さの文字列を入れるなら+1しないと駄目だけど。

763 名前:732 ◆L/nntMgEC6 [2007/07/06(金) 02:58:25 ]
>>761さん
有難う御座います。おかげで疑問が解けました。

764 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:00:43 ]
 |    ( ●)(●)   いい加減な説明をしていることを指摘されて
. |     (__人__)   指摘した相手をアホとか言う方がアホだろ
  |     ` ⌒´ノ   常識的に考えて・・・

765 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:01:22 ]
>>761
C99ならできるというのは禁句かい?

766 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:03:23 ]
回答者が書く補足としては、ありだとおもう。
突っ込みとしては、ちょっと弱い。

767 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:04:15 ]
 / ノ  ⌒ \  文法的にも間違っていることを言う奴が
 |  (●)(●) |  間違っていない奴にアホって言うアホだろ
. |  (__人__)  | 常識的に考えて。ちゃんとキャストしろよ



768 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:05:15 ]
常考常考うるせーよ

貶し合ってないで意味のある話をしろ

769 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:08:42 ]
>>763
VBだとそれができるんだよね。

それはVBなどのインタープリター言語は実行時に変数宣言文も実行文もおなじように上から処理してゆくから。

Cのようなコンパイラ言語はコンパイル時に変数宣言文を処理してゆく。
だからコンパイル時に配列変数のサイズがわかっていないと処理ができない。

JavaもVBと同じだと思う。

770 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:09:22 ]
ここは初心者が鼻息を荒くして入門書読みながらレスしてるのが多くて注意が必要

771 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:09:45 ]
>>765
C99ならできるの?

772 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:10:54 ]
 |    ( ●)(●)   お前みたいな奴は、たとえドラマの役者として
. |     (__人__)   起用されても、まともなキャスティングもされずに
  |     ` ⌒´ノ   脇役かエキストラに決まってんじゃん>アホ言うたアホ

773 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:12:15 ]
AA厨も早く寝ろ
今日はお開きだ

774 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:15:42 ]
>>773 (・∀・)キャスキャス

775 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:17:05 ]
いまさらやらない夫のAA貼り付けて喜んでんのかよw

776 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:27:41 ]
>>771
余裕

777 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 03:27:46 ]
いまさら やらない か?っつか、いまさらキャストも適切に出来ない奴が
初心者相手にいい加減な説明、笑えねぇ〜〜〜〜〜。お前、指導者に向いてねーよ。



778 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 04:13:51 ]
キャストすると型によってアドレスが変わるプロセッサの話をすると、へんなのを召喚しちゃいますか?

779 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 04:41:39 ]
それがどうかしたのか?
printf に渡すときの話とはわけが違うぞ?

780 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 06:14:06 ]
1バイト文字と2バイト文字が混在してる文字列を
ループ使って1バイトずつputchar()で画面に表示しても
ちゃんとどちらも表示されるのは、シェルやプロンプトの方で
何バイト文字か確認して1バイト文字じゃない時は
一度バッファに溜める、とかしてるからですか?

781 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 06:21:01 ]
ものによるとしか

782 名前:780 mailto:sage [2007/07/06(金) 06:49:14 ]
>>781
例えばどうやって処理してるんですか?

783 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 07:35:00 ]
>>780
いいえ、シェルプログラムはそんなことはしません。

784 名前:780 mailto:sage [2007/07/06(金) 07:52:43 ]
>>783
あ、コンパイラがやってくれてるんですか?

785 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:09:19 ]
>>784
いいえ、勿論コンパイラの知ったこっちゃありません。

もしかしたら、画面表示はシェルプログラムがやっていると思っているんですか?
例えば他のPCにリモートログインしたときには相手先のシェルプログラムが動くわけですが、
そのシェルプログラムが自分の使っているPCの画面を直接アクセスするなんて夢でも見ているんですか?

786 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:23:14 ]
>>780
マルチバイト文字などに関係なく、標準入出力は
行単位バッファリングされていることが多い。

バッファリングなしにしても、まあ正しいマルチバイト文字列になった時点で
正しく表示されると仮定していいと思う。

787 名前:780 mailto:sage [2007/07/06(金) 08:24:22 ]
>>785
ということはOSの画面表示を担当するプログラムが
putchar()で2バイト文字の一部を出力しようとした時に
2バイト文字の一部だと判断し表示を一時中断して
次に送られてくるputcharの引数と組み合わせて
それに対応する2バイト文字を出力していているんでしょうか?



788 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:26:31 ]
2バイト文字で、1バイト目単体で文字としてなりたっているようなのってなんかあったっけ?

789 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:28:46 ]
>>788
iso-2022-jpの1バイト目はASCII文字と同じコード。

790 名前:780 mailto:sage [2007/07/06(金) 08:30:47 ]
>>786
行単位でバッファリングするんですね
それで予め2バイト文字があるかないか調べるわけですか、なるほど

791 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:39:37 ]
>>789
Shift_JISしか考えてなかった。参考になった
ありがとう

792 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:41:44 ]
文字コードの体系もしっかり管理しときゃ良い。

793 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 09:11:21 ]
型で区別するんじゃない?
char型ならその分のデータを受け取るまで待つ

794 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 09:18:02 ]
ASCIIコード体系でなければ左へ受け流すぅ〜

795 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 11:50:43 ]
1: 3.2 2.6 3.4 2.1 5.2 3.4 5.2
2.4 4.2 4.1 0.2 4.2 5.3

2: 3.2 2.4 3.4 2.2 5.2 3.4 5.2
2.4 4.2 4.3 0.2 4.2 5.3

3: 3.1 2.6 3.4 2.1 6.2 3.4 5.2
2.4 4.2 4.0 0.2 4.2 5.3

っていうデータがあるとして
10個目(つまり4.3 4.1 ,4.0)だけを抜き出すプログラムをつくれといわれると
float型でやりますか?char型でやりますか?

796 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 12:26:17 ]
「作れ」っつった本人に仕様を確認する。

797 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 13:03:17 ]
とりあえず float は使わない。
使うなら double 。



798 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 13:51:36 ]
つーか、計算もしないし区切りもはっきりしてるなら
文字列のままで通しちゃったほうがいいべ

799 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 14:01:23 ]
>>793
それはない。そんなことしたら、ファイルにリダイレクトできない。

>>791
iso-2022-jpの場合、KanjiInが来た後は2バイト文字、そうでなければAsciiという分け方。
だから2バイト文字の後にKanjiOutが来ないと文字化けする。

>>790
バッファリングはするかもしれないが、出力の判断とは直接的には無縁。
でなければエスケープシーケンスでの制御ができない。

800 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 15:41:47 ]
>>799
>KanjiInが来た後は
>KanjiOutが来ないと
そんなコード/シーケンスはありません。

801 名前:デフォルトの名無しさん [2007/07/06(金) 18:09:25 ]
Windows2000で作られたソフトはWindowsXPではうまく動作しないことが
あるのですか。LSI C-86を使ってC言語を学ぶという趣旨の本を5年前に
買ったのを今になって勉強しようとしてインストールしたという次第です。
最初のコマンドプロンプトがC:\>になるはずのところ、C:Documents and
Settings□□>となりエラーと表示されました。□□は、再起動時に
アカウント指定を要求され、自分の名前を入れたものです。
別な場所へインストールすればよいのですか。よろしくお願いします。

802 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 18:15:05 ]
>>801
LSI-C86は遺物なので、特殊性を理解できていないなら使ってはいけない。
MSのVisualStudioでもgccでも、無料で手に入るほかのコンパイラを使うことをお勧めする。

803 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 18:18:59 ]
まあコマンドプロンプトをC:\>にしたいなら、cd \ でいいけどな。
本と同じになるだけで、役には立たないだろうけど。

804 名前:デフォルトの名無しさん [2007/07/06(金) 18:26:59 ]
>802 responseありがとうございます。早速入手しようと思います。

805 名前:デフォルトの名無しさん [2007/07/06(金) 18:43:58 ]
ソーカcd¥−enterで続けられるのか。

806 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 18:59:38 ]
>>800 の意図が気になる。

807 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:03:18 ]
>>804
たぶん電子メールのレスと2ちゃんのレスは同じ意味を持ってると思うんだが、
だとしたら君が使ってるresponseはレスという意味とは違うぞ



808 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:06:00 ]
>>807
ja.wikipedia.org/wiki/%E3%83%AC%E3%82%B9

809 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:37:26 ]
nullponceというのを提案しまnce

810 名前:723 mailto:sage [2007/07/06(金) 19:39:17 ]
>>729
忘れてた

811 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 19:43:03 ]
英語版ウィキペには

Reply. Its abbreviation followed by colon (Re:) is prepended to e-mail subject lines when answering a received message

って書いてるんだよな。
まあ、スレ違いだからどうでもいいが。

812 名前:デフォルトの名無しさん [2007/07/06(金) 20:22:37 ]
A)入力装置に関する記述のうち,適切なものはどれか。
1 ジョイスティックは,画面上に透明なセンサを取り付けたものであり,画面に指などを押し付けて座標を指示する。
2 タブレットは,ペンのような装置と板状の装置を組み合わせた入力機器であり,ペンのような装置を押し付けて座標を指示する。
3 ディジタイザは,人間のもつ静電気を利用して指の位置を検出するポインティングデバイスであり,操作面を指して座標を指示する。
4 トラックパッドは,球の一部分が装置の上面に出ているポインティングデバイスであり,球を指で直接回転させて,その変化量で座標を指示する。

すみません、質問なのですが今上の問題がハードウエアの組み込みの
参考書の問題がわかりませんので、教えてはいただけないでしょうか?

813 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:25:09 ]
>>812
2

814 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:26:34 ]

1はジョイスティックの説明ではない事は明らかだから×
2は正しいと思うから○
3は知らんから知らん
4はトラックパッドじゃなくてトラックボールの説明だから×

815 名前:デフォルトの名無しさん [2007/07/06(金) 20:29:48 ]
ありがとうございました。

これで先に行けます。

816 名前:デフォルトの名無しさん [2007/07/06(金) 20:32:06 ]
制御系といえば、C言語だけど
Cのすごい所って何?

817 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:38:01 ]
体にぴったり張り付くスク水の用に、ハードウェアに貼り付ける所



818 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:38:40 ]
>>816
おまえの方がすごいと思う。

819 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:38:58 ]
3はタッチセンサとか、タッチスクリーンとか言われている物のうちの1種だね

820 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:41:36 ]
>>812
3の説明がトラックパッドっぽいな

821 名前:デフォルトの名無しさん [2007/07/06(金) 20:42:36 ]
C言語にできることは、C++にもできるって聞いたんだけど、
C++も体にぴったり張り付くスク水のように、
ハードウェアに貼りつけるの??

822 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:43:22 ]
Cと同じようにできる。

823 名前:デフォルトの名無しさん [2007/07/06(金) 20:44:46 ]
C++もC言語と同じように最強ならば、
C++も制御系によく使われるの?
それともC++はオープン系(WEB系も含む)?

824 名前:デフォルトの名無しさん [2007/07/06(金) 20:47:10 ]
質問です。年月日を入力してツェラーの公式を利用して曜日を表示するプログラム
をつくりたいんですけど、BCCでコンパイルしたら公式のところでエラー
「浮動小数点の不正な使用」ってでるんですけど、どうしてだかわかりますかね?
#include <stdio.h>

int main(void){
int year,month,day;
char youbi[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int i;

printf("Year?");
scanf("%d",&year);
printf("Month?");
scanf("%d",&month);
printf("Day?");
scanf("%d",&day);

i=(year + (year/4) - (year/100) + (year/400) + (2.6*month +1.6) + day)%7;
printf("It's %s.",youbi[i]);
return 0;
}

825 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:49:26 ]
>>821
C++の場合スク水フェチのオジサンが自分で着る用に作ったものもあるので注意

826 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:56:27 ]
>>824
(2.6*month +1.6)を(int)(2.6*month +1.6)にしろ。
ここが整数でないから、%の左側全体が整数型でなくなっている。
剰余演算子は浮動小数点数を演算対象にできないので、件のエラーになる。

827 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:57:13 ]
>>823
Cが制御系で使われるのは「最強」だからではなく「高級アセンブラ」だから。
C++も制御系で使われるよ。C++として使われるかはともかく。

つか、最強ってなんだよ。



828 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:58:38 ]
>>824
剰余演算子%というオペランドは整数同士でないとダメ

演算してる行の型がごっちゃになってるから明示的にキャストしたり読みやすくすべき
基本的にコメント文とかで説明もなしに実数を整数に叩き込んだりしちゃだめ

829 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:19:14 ]
なるほど。できました、ありがとうございます。

830 名前:デフォルトの名無しさん [2007/07/06(金) 21:30:26 ]
スレ違いかもだけど、ここの人達他のスレより頼りになりそうなので。。。
基本情報の午後問をCで受かりたいのですが、なんの本を読めばいいですか?
当方、C言語はよくわかりません。COBOLは少しできます。
ただCで受けたいのです。

831 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:32:10 ]
>>830
試験は慣れたものでやるべき

832 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:58:20 ]
>>830
アセンブラがオススメ
例年一番簡単

833 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 21:59:06 ]
C言語ってeclipceかbolandか、
それともvisual basic かどれでやればいいですか?

834 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:04:13 ]
その質問おもしろい?

835 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:10:25 ]
visual studioだっけ?

836 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:12:46 ]
>>833
Linuxでもできるよ。

837 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:14:19 ]
整数型配列は
int iarray[10];
memset(iarray, 0, sizeof(array));
ですべて0で初期化できると知ったのですが、

実数型配列を
double darray[10];
memset(darray, 0.0, sizeof(array));
のように初期化してもかまいませんか?
つまり実数型配列の全ての要素を0.0にしたいのです



838 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:16:31 ]
>>837
いいんじゃね?
DirectXとか、そういう方法で、実数やらポインタやらバリバリクリアしてたな。
移植性は無くなる。

839 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:17:55 ]
> memset(darray, 0.0, sizeof(array)); 

あ、これは、警告かエラーになるな。
sizeof のところはミスだよね?


840 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:19:54 ]
>>837
ANSI/ISO Cへの移植性を望むなら避けるべき。
浮動小数点数がIEEE 754に則っていることを仮定してよいなら構わない。

841 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:21:17 ]
>>833
ほとんどにアルゴリズムの問題
ポケコンのCインタプリタでおk

842 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:26:29 ]
>>839
あと、0.0 は 0 だな。

843 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:27:49 ]
>>839
すみません sizeof(darray) です
あとmanページでmenset関数を調べてみると
#include <string.h>
void *memset(void *buf, int ch, size_t n);
となっていたので
int ch に0.0と渡してもだめなんですね

ということは関数の仕様上は
memset(darray, 0, sizeof(darray));
と書くのが正しくて、
しかもCコンパイラの浮動小数点がIEEE754前提での使い方なので

結局は配列の要素数の分だけループで回して初期化するのが
一番いちゃもん言われにくいということでよろしいでしょうか?
ありがとうございました

844 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:29:23 ]
エクセス64で 0 ってどうなるの?






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<185KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef