C言語なら俺に聞け(入門篇) Part 34at TECH
C言語なら俺に聞け(入門篇) Part 34 - 暇つぶし2ch127:デフォルトの名無しさん
08/08/14 12:41:09
足し算と補数があれば引き算掛け算割り算を実装できるというのは理解したんですが
そのおおもとの、足し算ってどうやって実装してるんでしょうか?


128:デフォルトの名無しさん
08/08/14 12:43:38
>>127
CPUにそういう命令があって内部で計算してるの
C言語なんかはコンパイルのときにCPUがわかるように変換してる。


129:デフォルトの名無しさん
08/08/14 12:44:55
じゃあそのCPUは・・・といわれるとトランジスタを使った足し算用回路が
組まれてて計算してる。

130:デフォルトの名無しさん
08/08/14 12:55:38
>>127
半加算器、全加算器でぐぐるといいよ

131:デフォルトの名無しさん
08/08/14 13:35:26
HOGE data[200]={0};

132:デフォルトの名無しさん
08/08/14 13:41:19
>>131
構造体だとそれなんか警告でるんだけど全部初期化されるのは保証されてるの?

133:デフォルトの名無しさん
08/08/14 13:43:22
>>132
それ以前にポインター抱えてる構造体でそんな初期化って

134:デフォルトの名無しさん
08/08/14 13:51:15
>>132
警告の意味くらい、理解しなさいよ。
HOGE data[200] = {{0}};

135:デフォルトの名無しさん
08/08/14 13:53:21
>>133
ゼロクリアではなく、きちんとヌルポインタで初期化されるよ。

136:デフォルトの名無しさん
08/08/14 13:58:05
>>134
それでもでるんですけど

137:1
08/08/14 13:58:48
いやむしろ悪化してコンパイルすら通らなくなるんですがw
試してから言ってくださいよw

138:デフォルトの名無しさん
08/08/14 14:09:51
>>136
--
% cat foo.c
typedef struct{
double a;
char *mozi;
}HOGE;

HOGE data[200] = {0};

% gcc -c -Wall foo.c
foo.c:9: warning: missing braces around initializer
foo.c:9: warning: (near initialization for `data[0]')

% sed -e 's/{0}/{{0}}/' foo.c > fooz.c

% !g:s/foo/fooz
gcc -c -Wall fooz.c

% gcc --version
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
--
警告でなくなるけど。

139:デフォルトの名無しさん
08/08/14 14:20:22
あれだっけ

初期化の指定が少ない場合コンパイラが勝手にやるんだっけ?

140:デフォルトの名無しさん
08/08/14 14:26:12
-W とかつけてんじゃね?それでも警告ですむと思うんだけど

141:デフォルトの名無しさん
08/08/14 14:36:58
>>140
>138では-Wallで警告が消えているね。

>>139
コンパイラがっていうか、0で補うのが仕様ですが。

142:140
08/08/14 14:53:48
>>141
いや>>138踏まえて言ったんだが

143:デフォルトの名無しさん
08/08/14 15:00:14
>>132
されてるよ
全部のメンバに対して=0;と書いたように初期化されるから
浮動小数点数でもポインタでも正しく0.0やヌルポインタになる

144:デフォルトの名無しさん
08/08/14 15:04:55
>>136-137があほなだけだろ
次の質問どーぞ


145:デフォルトの名無しさん
08/08/14 22:36:59
C言語撃退講座 ~K&Rは置いて、俺の話を聞け

この本ってどう?

146:デフォルトの名無しさん
08/08/14 22:41:47
推薦図書/必読書のためのスレッド 41
スレリンク(tech板)
ここで聞けばいいんじゃね

147:デフォルトの名無しさん
08/08/15 01:46:50
linuxでwin用のアプリをコンパイルすることはできるの?

148:デフォルトの名無しさん
08/08/15 02:14:01
理屈の上では可能だが、現実問題としてありえない

149:デフォルトの名無しさん
08/08/15 03:54:01
いや、結構普通だろw

150:デフォルトの名無しさん
08/08/15 03:55:08
クロスプラットフォームだっけ?
コンパイラがあればできるんじゃね?
というかlinux上で動くwinコンパイラなんてあるの?

151:デフォルトの名無しさん
08/08/15 03:58:51
それは可能だろ
機械語を生成するだけだからな
でも使った事はないし知らない
32bitPCで64bitや携帯の機械語が生成できるのと同じ

152:デフォルトの名無しさん
08/08/15 03:58:56
Cygwinターゲットのクロスgccはなんか聞いたことがある。

153:デフォルトの名無しさん
08/08/15 04:02:15
MinGW

154:デフォルトの名無しさん
08/08/15 04:02:22
>>147
とりあえず答えておくとmingwとか使えばできます

155:デフォルトの名無しさん
08/08/15 04:04:44
こういうケースだとJavaや.NETはいいな

156:デフォルトの名無しさん
08/08/15 11:57:51
typedef union _BYTE{
unsigned char byte;
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
} BYTE;



sizeof(BYTE)がどうしても1になってくれないんですけど、どうすりゃいいんでしょう?

157:デフォルトの名無しさん
08/08/15 12:05:14
>>156
つーかbitをくくれよ

158:デフォルトの名無しさん
08/08/15 12:06:31
忘れてたよ
で、これ1byteにできないの?

159:デフォルトの名無しさん
08/08/15 12:08:13
あ、なんか自己解決したわ
unsigned char bitn:1;にすればよかったのね

160:デフォルトの名無しさん
08/08/15 12:08:48
つーかそんなので悩むなら普通に

byte に対してビット演算しろよ

byte | 0x01
byte ^ 0x01

とかすればいいだけだろ?


161:デフォルトの名無しさん
08/08/15 12:50:01
共用体でビットフィールド使っても無意味じゃないの?

162:デフォルトの名無しさん
08/08/15 12:52:20
ビットフィールド操作は大抵のコンパイラで糞なコードに展開されるわー
もうちっと最適化できないもんかね

163:デフォルトの名無しさん
08/08/15 12:56:01
糞だとおっしゃるだけの英知をお持ちならそのご自分の能力でなんとかなさっては?

164:デフォルトの名無しさん
08/08/15 12:57:29
そもそもワードを任意のビットで区切ろうという発想が糞 は言いすぎとしても処理効率なんぞ求めんな

165:デフォルトの名無しさん
08/08/15 12:57:57
英知というほどの物じゃないけど、アセンブラでビット操作を書いたら
こういう風には書かないだろうなあというコードになる。

C言語の仕様なので我慢して使ってるけど。

166:デフォルトの名無しさん
08/08/15 13:00:22
そこまで文句を言うならなぜ自分でアセンブらないの?

で、それに対する答えがそのまま>>162への答えだよ

167:デフォルトの名無しさん
08/08/15 13:02:15
インラインアセンブラは時々使うけど可読性が・・・

168:デフォルトの名無しさん
08/08/15 13:10:52
宿題で世界のナベアツプログラムがでたんですが
3の倍数はいいとして
3のつく数の判定はどうすればいいんでしょう

169:デフォルトの名無しさん
08/08/15 13:15:27
非標準だがitoa()を使って文字列に変換しstrchr()で判定する

170:デフォルトの名無しさん
08/08/15 13:18:34
>>168
それ、私が新人研修で出した課題だw
sprintf()で文字列にしてから、strchr()で探すのが一番手っ取り早い。
真面目にやるなら、一桁ずつ10で割った余りをチェックすればいい。

171:168
08/08/15 13:39:07
なるほど、ありがとうございます
あまりを出して調べるやり方でやってみます。
ああ、でもそれだと32とか321は無理ですよね

一桁ずつというのは、
1、3を引く
2、10で割ってあまりが0か調べる
3、違うなら1へ

って感じですかね

ちなみに学校の宿題ですw

172:デフォルトの名無しさん
08/08/15 13:55:02
12345

12345%10 = 5
12345/10 = 1234

1234%10 = 4
1234/10 = 123

123%3 = さぇぁ~ん!

173:デフォルトの名無しさん
08/08/15 13:55:37
%3じゃなくて%10ね

174:デフォルトの名無しさん
08/08/15 13:56:41
321と言う数字があったとする
321 ÷ 10 = 32 … 1
32 ÷ 10 = 3 … 2
3 ÷ 10 = 0 … 3
余りに3が出たのでこの数字は3が含まれていると言う事がわかる
と言うこと

175:デフォルトの名無しさん
08/08/15 13:57:59
>>170
そのやり方だと3の時に3を足さないと結果変わるね。
170の最後の行は
1 0かどうかチェック
2 %3の結果が0かどうかチェック
3 10で割った商と余りを別々に保存
4 余りが3かどうか
5 違うなら商を使って3へ
てことだろうから32でも321でも対応できるよ。
ただsprintf使った方がラク。

176:デフォルトの名無しさん
08/08/15 14:00:57
C言語質問じゃなくてアルゴリズム質問だからスレ違い

177:デフォルトの名無しさん
08/08/15 14:45:08
cursesを使ってブロック崩しのプログラムを作っているんですが、
return関数やscanfなどの標準入力関数を使うと、
なぜかprintfやmvaddstr関数などを飛ばしてしまい、ハイスコアの名前入力が作れません。
名前入力はどのようにすればいいでしょう?
メイン関数は下のようになってます

int main(int argc, char **argv){
int score;
char tmp[7];
initscr(); /* 画面の初期化 */
noecho(); /* エコーなし */
cbreak(); /* 一度に1文字入力をON */
keypad(stdscr,TRUE);; /* 矢印キーが使える */

if(LINES>MinY&&WCOLS>MinX){
window(); /* 画面描画 */
}
else{
printf("Windou size is too small!!!");
// return 0;
}
score = go(); /* ゲームを実行 */
GameEnd(score);
endwin(); /* ウィンドウ終了 */
return 0;
}

GameEnd関数では、mvaddstrで「GameOver」と出した後、
scoreの値とファイルの値を比較し、ハイスコアであれば
mvaddstrで「HighScore!put your name」と書いた後に
scanfで名前を受け取ろうとしたのですが、mvaddstrが抜かされてしまう感じです。

178:デフォルトの名無しさん
08/08/15 15:11:06
cursesを使ったこと無いから的外れのことを言うかも知れないが
scanwを使っちゃ駄目なのか?

179:デフォルトの名無しさん
08/08/15 15:16:08
fflush(stdout)とか?

180:デフォルトの名無しさん
08/08/15 15:19:28
その肝心の部分を張らずに質問とはいい度胸だ

181:デフォルトの名無しさん
08/08/15 15:21:17
環境依存すぎる
まずinitscrやらnoechoやらの仕様を詳細にチェックしなおすこと
モードを変えた後で元に戻さないとならないとかないか?

182:デフォルトの名無しさん
08/08/15 15:22:31
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください

183:デフォルトの名無しさん
08/08/15 15:27:15
>>179ぐぐってみますた。バッファフラッシュですね。ちょっとやってっます。
>>178
使ってみましたが無視されてしまいました。
GameEndのソースファイルは今こんな感じです(いろいろ注釈にして試したりしてるのでごちゃごちゃしてますが…
endwin()を実行後に、注釈部のscanfなどをやってみてもだめでした・・・
void GameEnd(int score)
{
int i,j,k;
char tmp[7]=" ",file[10][7];
FileRead(file);
mvaddstr(LINES/2-2,WCOLS/2-5," GameOver!! ");
for(i=0;i<5;i++){
if(score>=atoi(file[1+2*i])){
for(j=4;j>i;j--){
strcpy(file[j*2], file[2*(j-1)]);
strcpy(file[2*j+1],file[2*j-1]);
}

mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");
mvscanw(LINES/2+1,COLS/2-15,tmp);
FileWrite(file);
break;
}
}
return;
}

184:デフォルトの名無しさん
08/08/15 15:36:34
本当にちゃんとハイスコア出してるか?
あとbreakはそこ一箇所だけでいいのか?

185:デフォルトの名無しさん
08/08/15 15:37:46
>>180,182
すいません、ごちゃごちゃしてたので貼り忘れてました。
>>179
やってみましたがその部分になると凍結してしまいました…
mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");
fflush(stdout);
fflush(stdin);
scanf("%s",tmp);
こういう順番でやってみたのですが

>>181
やはりそうですよね… 学校の夏休み課題なんですが、cursesについての詳しい内容をほとんど教えられず
書き方だけしか教わってなかったのでさっぱりでした。

最悪カーセスモードを終了してからのscanfでやろうかと思ってるんですが、モードの終了の仕方もわからないで苦戦してます

186:184
08/08/15 15:37:54
あ、breakはいいのか
見間違えた

187:デフォルトの名無しさん
08/08/15 15:44:26
>fflush(stdout);
cursesは標準出力じゃないから意味がない。
>fflush(stdin);
入力のフラッシュ動作は環境依存。
>scanf("%s",tmp);
%6sにしてバッファオーバフローを避けよう。

188:デフォルトの名無しさん
08/08/15 15:45:19
>>185
fflush(stdin) は環境によっては segmentation fault になるんじゃなかったっけ?
curses で入力がある限り読み飛ばせば大丈夫そうな気はする

curses 使ったこと無いのでちゃんとかけないけど
こんな感じかと

while(キーボードバッファに何か残っている) 読み込む;

189:デフォルトの名無しさん
08/08/15 15:54:59
>>187,188
ふむふむ。勉強になります

こんな感じに書き換えてみましたがどうしてもここで凍結してしまいます。
scanfをなくすだけでちゃんとmvaddstrの文が表示されて正常終了するのですが…

mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");
while(fgetc(stdin)!=EOF)
echo();
scanf("%6s",tmp);


190:デフォルトの名無しさん
08/08/15 15:59:25
>>189
それは駄目だ
fgetc(stdin)==EOF になった時点以降は stdin から入力することはできない

dos (conio.h) でいうところの
while(kbhit()) getch();
っていうのがあるはず

191:デフォルトの名無しさん
08/08/15 16:02:47
あーそうそう、curses使っているときに標準入力を使おうとすると、想定外の場所にカーソルが出たり
標準入力の端末動作で画面が崩れたりするからそもそも標準入力は使えないと思う。

192:デフォルトの名無しさん
08/08/15 16:05:28
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

193:デフォルトの名無しさん
08/08/15 16:09:02
うおおおお、奥が深い
getch()ですね、ラケット移動などのカーソル受付をそれでやってます。
ただ、kbhit()にあたる方が分かりません。

仕様では「ゲーム終了時にTOP5に入っていたら名前を入力してもらう」と書いてあったのであれなんですが
友達はウィンドウモードにする前に、一番最初に名前入れてもらってやったと言っていました。
最悪自分もそうしようかなと思っていますが、、何か腑に落ちない感じがします。

194:デフォルトの名無しさん
08/08/15 16:14:42
良く分からないけどバッファを読み飛ばすなら
while(getch() != '\r') 的な感じでどうだろうか?

195:デフォルトの名無しさん
08/08/15 16:17:45
>>193
ググってみた
while(getch()!=ERR);
でよさげ

196:デフォルトの名無しさん
08/08/15 16:22:41
>>191
なんと。
授業では入力方法は標準入力しか習ってないので…やはり一番最初に聞くしかない感じですかね

>>193
すいません初心者で。以後気をつけます
環境は学校の端末(ice環境)を外部環境(PodeRosa)で動かしてます。

>>194、195
行の左端に戻る…と。ERRも始めてみました。勉強になります
どちらも標準入力は受け付けなかったんですが、mvaddstrは表示されるようになりました!

mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");


while(getch()!=ERR);
echo();
scanf("%6s",tmp);
今はこんな感じです

197:デフォルトの名無しさん
08/08/15 16:26:10
そこでscanfじゃなくてcursesでの入力受付使えばなんか出来るんじゃないかな?

198:デフォルトの名無しさん
08/08/15 16:32:20
おお、早速以下のコードでやってみました!
…が、出ませんでしたorz
mvaddstr(LINES/2,COLS/2-22,"HighScore!!Put your name!!(Max 5 ch\
ars)");


while(getch()!=ERR);
echo();
mvscanw(LINES/2+2,COLS/2-22,tmp);
+------------------------------------------------------+
| |
| |Time 1
| #### #### #### #### #### #### #### |Level 1
| |Score 10
| GameOver!! |HighS
| #### #### #### #### #### #### |Name
| HighScore!!Put your name!!(Max 5 chars) |
| |
| |
| |
| |
| |
ssh{*********}262: |

199:デフォルトの名無しさん
08/08/15 16:43:00
すいません、大分レス引っ張ってしまって。
いろいろアドバイスくださってありがとうございます。勉強になりました。
とりあえずは期限もあとわずかなので仕様とは少しずれてしまいますが以下のソースで提出だけしておきます
ただ、自己満足になりますが悔しいのでいちおう現段階のソースも残しておきたいと思います。

int main(int argc, char **argv){
int score;
char tmp[7];
printf("Hello,put your Name!(Max 5 Chars)\n");
fgets(tmp,6,stdin);
printf("Let's play!!\n");
sleep(1);

initscr(); /* 画面の初期化 */ noecho(); /* エコーなし */
cbreak(); /* 一度に1文字入力をON */
keypad(stdscr,TRUE);; /* 矢印キーが使える */

if(LINES>MinY&&WCOLS>MinX){
window(); /* 画面描画 */
}
else{
printf("Windou size is too small!!!"); // return 0;
}
score = go(); /* ゲームを実行 */
GameEnd(score);
endwin(); /* ウィンドウ終了 */
return 0;
}


200:デフォルトの名無しさん
08/08/15 16:56:44
fgets()の常道では、第2パラメータは第1パラメータのサイズだ。
つまり、fgets(tmp, sizeof(tmp), stdin)でいい。
それから、(文字数オーバーじゃない場合に)末尾に改行文字が残ることにも注意。


201:デフォルトの名無しさん
08/08/15 18:01:18
>>85
win32プロジェクトでやってもエラーが出ました。
ちなみに拡張子を.cppでやるとコンパイルできます。
Cなんですけど。

202:デフォルトの名無しさん
08/08/15 18:05:30
>>201
それが出るとき、プロジェクトのプロパティの全般の共通言語サポートはどうなってる?

203:デフォルトの名無しさん
08/08/15 18:15:29
>>201
共通言語ランタイム サポートのことですよね。
共通言語ランタイム サポートを使用しないになってました。

204:デフォルトの名無しさん
08/08/15 18:23:13
これ以上はVC++あたりかな。
/clr のオプションがつくとCとしてはコンパイルできなくなる。
/clrをつけるのが、共通言語ランタイムサポート。
つまり、キミの状態はあきらかにおかしい。
同じ症状を持った人じゃないとわからんな。

205:デフォルトの名無しさん
08/08/16 09:52:03
なにかオススメのコンパイラはありますか?

206:デフォルトの名無しさん
08/08/16 10:59:01
>>205
LSI C-86

207:デフォルトの名無しさん
08/08/16 12:23:44
>>205
私はgcc(cygwin)を使っています。

208:デフォルトの名無しさん
08/08/16 14:34:52
ギャップバッファのサンプルコード等ありましたら教えて下さい

209:デフォルトの名無しさん
08/08/16 14:42:31
>>208
URLリンク(www.amazon.co.jp)

この本に載ってるけど、見てみたらすごい値段になってるな。

210:デフォルトの名無しさん
08/08/16 15:20:02
>>209
凄く・・・高いです。
どこかのサイトにCで書かれたサンプルコードは無いのでしょうか

211:デフォルトの名無しさん
08/08/16 17:11:22
URLリンク(aibm4.main.eng.hokudai.ac.jp)
ほれ。つーか自分でぐぐれよ

まー俺もテキストはいじるので研究させもらうわ

212:デフォルトの名無しさん
08/08/16 17:26:47
>>211
すまん、それは昨日見たんだが、
C++はどうも・・・
ありがとうございます。

213:デフォルトの名無しさん
08/08/16 17:59:15
>>212
おいおい、100行ちょっとのソースも駄目なのかよw

214:デフォルトの名無しさん
08/08/16 19:20:38
本が高かったら図書館に行けばいいじゃない

215:デフォルトの名無しさん
08/08/16 19:25:22
>>213
うん、駄目なのよ、C++分からないのよ
>>214
既に取り寄せ連絡したから問題無い

216:デフォルトの名無しさん
08/08/16 19:33:43
そのソースを解析できないようじゃあ洋書を翻訳したのなんて厳しいんじゃね?

ちなみにグーグルにはこんなのもあって
URLリンク(books.google.co.jp)



217:デフォルトの名無しさん
08/08/16 19:41:10
>>216
書籍だが、C++使える事前提で解説されてるの?

218:デフォルトの名無しさん
08/08/16 20:44:06
100行くらいならCに書き直してやろうかと思って>>211見にいったら
死ぬほど丁寧に解説されててワロタ
あの解説文でわからないなら本読んでも無駄じゃない?

219:デフォルトの名無しさん
08/08/16 20:47:24
つーかギャップバッファの代替ロジックもおおよそ浮かんだけどなあ。

イメージはファイルシステムの情報管理の方法だよ

220:デフォルトの名無しさん
08/08/16 21:08:41
K&Rみたいな有名本ってほかになんかある?

221:デフォルトの名無しさん
08/08/16 21:16:13
>>218
Cに書き直して下さい

222:デフォルトの名無しさん
08/08/16 21:21:46
>>218
死ぬほど、とかそんな次元じゃなくて、
STL?template?operator?T& x?ってなんぞ?ってな感じでして、
C言語スレでC++のソースコード見せられるとは予想外でした。
C++じゃ全く読めなくて、すみません

223:デフォルトの名無しさん
08/08/16 21:23:28
これってさ双方向リストとかやってればすぐに応用かけそうだよな。

ギャップって呼ばれるのは特に説明がかかれてなかったけど1ギャップ=1バイトではなく
1ギャップ=nバイトの塊だよな?

224:デフォルトの名無しさん
08/08/16 21:25:02
>>222
ソースは見ないで、下の解説文だけ読めばいいと思う
あれだけ丁寧に解説してあればサンプルソースなんかよりもずっと理解しやすいと思う

225:デフォルトの名無しさん
08/08/16 21:31:13
>>223
図をみたら、nバイトとしか解釈しようがないと思うけど。

226:デフォルトの名無しさん
08/08/16 21:35:39
テキストエディタで考えると1ギャップ=64バイトから128バイトくらい間が理想か。

227:デフォルトの名無しさん
08/08/16 21:51:30
ネタではなく。

かなり前にMicrosoft Visual C++ 2005 Express Editionってのを
やってみたんだけど、何をどうやっていかわからずいくつかくだらない
ソフトを作って終わってしまいました。

やってみたいことは、ブラウザなどの操作を自動でやらしたい。
メールを受信して、本文中にある一部が定型のアドレスを
抽出し指定時間ごとにブラウザで開きブラウザに定型の文が
表示されたらタブを閉じる。

アプリケーションを操作する。などです。

こんなことできますか?できるなら何の勉強が必要なのか
または近道なのか詳細お願いします。

228:デフォルトの名無しさん
08/08/16 21:59:39
>>227
C#でやったほうがいいんじゃね?

ブラウザの操作は知らんけど、コンポーネントでIEの機能を使えるから、同様のことができると思う。
メールを受信してどうこうは、ググれば簡単に分かると思う。

229:デフォルトの名無しさん
08/08/16 22:00:02
>>227
ネットワーク系かな

230:デフォルトの名無しさん
08/08/16 22:32:48
スロットのプログラムみたいね~

231:デフォルトの名無しさん
08/08/16 23:20:29
URLリンク(homepage3.nifty.com)

すいません、上記サイトを眺めて勉強しているのですが、
C言語を業務で行うっていうレベルはどの程度なのでしょうか。

単に数の受け渡しをトレースできれば、
業務に就いたとき問題ないですか。


232:デフォルトの名無しさん
08/08/16 23:30:08
>>231
そのリンク先の内容が理解できるなら、
業務に問題ないレベルだろうと思う。

>数の受け渡しをトレース
ってのはよく解らんのだけど。

233:デフォルトの名無しさん
08/08/16 23:32:24
ぴんきり

234:デフォルトの名無しさん
08/08/16 23:37:46
>>231
> 単に数の受け渡しをトレースできれば
データフローのことだと思うよ

データフローはプログラミングの基本、いやシステム設計の基本でもある

235:デフォルトの名無しさん
08/08/16 23:38:27
>>231
ちょっと古くなってる部分もあるけど、C FAQくらいは目を通しておくとか。
URLリンク(www.kouno.jp)

Cを使っている職業プログラマでもC FAQレベルに達してないのはいっぱいいるけど。

236:デフォルトの名無しさん
08/08/16 23:52:56
C言語やっててトレースなんて単語言った時点でたぶん減点。
ollyでもやってんのか?

237:デフォルトの名無しさん
08/08/17 00:49:53
>>232-236
ありがとです。
引き続きサイトで勉強してみます。

238:デフォルトの名無しさん
08/08/17 01:30:09
文字コードの相互変換をサポートする関数とかってありましたっけ?

S-JIS->EUCとか

239:デフォルトの名無しさん
08/08/17 01:32:48
sjistoeuc関数
使っている環境にあればの話

なければ自作

240:デフォルトの名無しさん
08/08/17 06:50:04
ちょっと相談させてください。

本格的にc言語を勉強したいと思い下記のサイトをよんだりしていたのですが
やっぱり1から勉強するとしても情報が古すぎますか?
URLリンク(www9.plala.or.jp)
URLリンク(homepage3.nifty.com)

今まで子供の頃から端々でプログラムを書いて利用する事はあったのですが
例題の文章を適宜加工して使っていた程度です。
本格的にc言語を学ぶにはどのサイトを参考にするのが現在お勧めなのでしょうか?

そもそもビジュアルベーシックとか他の学ぶ方が現在では無難なんでしょうか?

241:デフォルトの名無しさん
08/08/17 07:36:51
本格的にC言語を学ぶのはよくないですよ。
本格的にアセンブラやっても利用されるのはほんの一部なのと同じような物です。
C言語は生産効率が良くありません。
C++言語からにして、それで不足分があればC言語を勉強したほうがいいですよ

242:デフォルトの名無しさん
08/08/17 08:04:59
そうなんですか

音楽でいうところのピアノやクラッシックと同じで
基本として完全に把握しておけばその分将来有利だと考えたのですが・・・・

そもそもflashうまくなればcはむしろ必要ない言語なのでしょうか?

それでも基本は抑えておいた方が良いのかな? 
オブジェクト指向プログラムしか扱えない人間はなにかしら欠点抱えるようにおもって勉強しようかと思ったのですが・・・・

苦しんで覚えるc言語でいうとどの程度までかじる価値があるのでしょうか?
それともオブジェクト指向メインでやるなら完全に必要ないとか・・・・・

243:デフォルトの名無しさん
08/08/17 08:16:20
芸術ではないのでやりたい事が簡単に実現できれば良いんです。
ピアノは演奏自体が大事ですが、プログラムは生産物が大事です。
コードに芸術性を求めても良くないです。
生産性はC++の方が上です。 
オブジェクト指向は、プログラムを簡単にするやり方なだけで
C++だからといって必ずしも使う必要はありません。

244:デフォルトの名無しさん
08/08/17 08:23:01
ここがいいですよ。 C言語もC++言語も。 
あと日本語を読み書きするのに文法の勉強が必ずしも必要ないように
動かして体験して動作が確認できればいいんです。
とくにC++(の実用面)で重要な点はSTLと思います。

URLリンク(www5c.biglobe.ne.jp)
URLリンク(www.geocities.jp)


245:デフォルトの名無しさん
08/08/17 08:23:46
いくらC言語を習得、熟練しようとも
基礎学力がないと、大作は作れないような気がするのですが
どうでしょうか?

246:デフォルトの名無しさん
08/08/17 08:29:30
マシンに近いという意味で、基本といえるのはアセンブラと思います。
C言語も、C++言語も、結局はアセンブラに変換されるので、最も基本だと思います。

247:デフォルトの名無しさん
08/08/17 08:45:08
そうなんですか
アセンブラ+flashあたりが私にとっての理想の組み合わせなのかなぁ
とりあえずちょっと位さわりの部分程度は学んでc使える人と会話くらいはできるようになりたいので
苦しんで覚えるc言語をちょこっとやってみようとしたのですが問題が
URLリンク(hp.vector.co.jp)

きときとCPadの一番重要なC/C++開発環境用だけが何故かリンク切れしてます。
どうすればこのエディタが手に入るでしょうか?


248:デフォルトの名無しさん
08/08/17 08:46:28
>>245
もし私への質問でしたら、大作をつくる気はないです。

249:デフォルトの名無しさん
08/08/17 11:36:36
素人はrubyでもやってろってこった

250:デフォルトの名無しさん
08/08/17 12:30:13
>>249
Ruby の方が100倍難しいぞ
環境設定とか
環境設定とか
環境設定とか

251:デフォルトの名無しさん
08/08/17 12:36:11
>>245
大作を作るためのノウハウを修得、熟練しましょう。
特に、C言語の取扱いだけに固執するのではなく、
上流工程と呼ばれるもの(要求分析と設計)も含めて学習を進めるといいでしょう。
ER図やDFDが書けるだけでも世界が変わってくるはずです。

252:デフォルトの名無しさん
08/08/17 12:52:10
>>250
環境設定でなんか難しいところがあったっけ?

253:デフォルトの名無しさん
08/08/17 12:55:04
>>252
素人はパス通す事も難しいんだ察してやれ

254:デフォルトの名無しさん
08/08/17 12:59:31
環境変数ってなに?パスって?
ってことだろうなあ。

255:デフォルトの名無しさん
08/08/17 13:05:07
Linux、Windows 両刀なんだ
まんどくさい

256:デフォルトの名無しさん
08/08/17 13:10:22
でもwindowsならrubyのインストーラでインストールしたら一発じゃないのかな?
コンソールで対話的にどうとかいう辺りで挫折しそうだけど

257:デフォルトの名無しさん
08/08/17 13:19:15
うるせー
オブジェクト指向なのか、構造体指向なのか
ハッキリわかりにくいんだよ
うんこRuby
しかもスレ違いじゃちんこ

258:デフォルトの名無しさん
08/08/17 13:47:05
こりゃまたわかりやすいのが続いたな

259:デフォルトの名無しさん
08/08/17 13:49:16
頭悪い人はプログラム勉強するより、世渡りを勉強してプログラマを使う仕事に就いたほうがいいよ

260:デフォルトの名無しさん
08/08/17 13:52:12
ボインちゃんを集めてプロのグラマーたちを使うことにしますた!

261:デフォルトの名無しさん
08/08/17 16:28:12
初歩的な質問なんですが
BMP画像を読み込む際に
画像にアルファチャンネルが含まれているかいないかの判断は
どうやってやるのでしょうか?

現在の自分のやり方ははヘッダから画像サイズと深度を計算して
ファイル総容量と比較しています。

あまりにもアレなやり方なので
他に方法があると思うのですが
ヘッダにもそれらしい情報もなく
皆さんはどのように判別されているのでしょうか?

よろしくお願いします。

262:デフォルトの名無しさん
08/08/17 16:30:20
>>261
ヘッダにカラーフォーマットの情報なかったっけ?

263:デフォルトの名無しさん
08/08/17 16:33:00
bmpにαチャンネルなんてあったっけ?

264:デフォルトの名無しさん
08/08/17 16:34:09
>>263
一応
32bitなんかだともたせれる

265:デフォルトの名無しさん
08/08/17 16:38:46
URLリンク(www.kk.iij4u.or.jp)
ほれbmpフォーマットの解説

場所はあるけどリザーブ状態なんで既存のツールでは拾ってくれないかもね。
つーかPNG使え

266:デフォルトの名無しさん
08/08/17 17:00:32
>>262
>>265

あ~biBitCountって色深度じゃなくて1画素あたりの
RGBA総データサイズなんですね。
勘違いしてました。

ありがとうございますた!
おかげさまで
もう少しスマートにやれそうです。

267:デフォルトの名無しさん
08/08/17 21:38:28
char はどの環境でも1byteが保障されてるんですか?

268:デフォルトの名無しさん
08/08/17 22:22:57
>>267
Cの世界だと、常にcharは1バイト。
ただ、1バイトが8bitとは限らない。

269:デフォルトの名無しさん
08/08/17 22:29:25
1バイトを16ビットにしてlongを128ビットにすればよかったのに・・・

270:デフォルトの名無しさん
08/08/17 22:43:54
>>268
現在稼働中で 1byte≠8bitな環境ってどんぐらい残ってんだろ?

271:デフォルトの名無しさん
08/08/18 02:35:30
switch+caseを使って分岐させると、プログラム自体は遅くなってしまうのでしょうか?
言葉など間違ってたらすみません。

272:デフォルトの名無しさん
08/08/18 02:44:24
>>271
足し算や引き算だって遅くなるぞ

273:デフォルトの名無しさん
08/08/18 02:47:27
if else if else if else if ... で同じような分岐をするのと比べてならswitch caseが遅いということはないはず

274:デフォルトの名無しさん
08/08/18 03:05:08
>>271
最適化のこともあるので分かりません

275:デフォルトの名無しさん
08/08/18 06:56:05
符号有/無の変数同士の四則演算についての質問です。

long hoge1=-101;
ulong hoge2=100;
printf("%d",(hoge1+hoge2));
とすると、「-1」が、
if( (hoge1 + hoge2)>0){printf("和が0以上\n")}
とすると、「和が0以上」と表示されました。
結果として、printfは正常、if文は異常な動作をしています。
if( (hoge1 + (long)hoge2)>0)・・・のように
if文中で使用している変数を型を揃えた場合、if文も正常に動作しました。
おそらく、if文中では変数の型を揃えないといけないものと勝手に理解しましたが、
これはC言語の仕様によるものでしょうか?

276:デフォルトの名無しさん
08/08/18 07:14:31
符号付きと符号無しで演算すると有効範囲の絶対値が大きいほうが優先されるのか…知らんかった

277:デフォルトの名無しさん
08/08/18 07:17:42
>>275
%dはintに型変換されるから。

278:デフォルトの名無しさん
08/08/18 08:32:52
>>275
printfでは実際の数値はわからない
フォーマット指定でいかようにも変わる
printf("%d",(hoge1+hoge2));
printf("%u",(hoge1+hoge2));
printf("%hu",(hoge1+hoge2));


279:デフォルトの名無しさん
08/08/18 09:37:22
>>271
switch case はgccとかなら最適化で速くなるぜ。
使用しているコンパイラで色々試してみるのも一興

280:デフォルトの名無しさん
08/08/18 10:47:45
>>271
入門レベルで気にするほどは変わりません。最適化で同じになる可能性もあることは既に指摘の通り。

281:デフォルトの名無しさん
08/08/18 15:37:11
添え字でアクセスできる多次元の配列の動的確保ってだいたい下みたいな感じでいいのか?
もっとクールでスパーハッカー的なやりかたってある?

a = (int **) malloc(sizeof(int *)*A);
for(i = 0; i < A; i++) a[i] = (int *) malloc(sizeof(int)*B);


282:デフォルトの名無しさん
08/08/18 15:40:44
>>281
スレリンク(tech板:133番)


283:デフォルトの名無しさん
08/08/18 15:43:12
>>282
半分動的だけど、半分静的じゃん

284:デフォルトの名無しさん
08/08/18 15:44:53
>>283
AもBもコンパイル時には確定しない値(変数)にしたいなら、簡便法はない。

285:デフォルトの名無しさん
08/08/18 15:46:33
>>284
C99に足をつっこむという簡単な方法が!

286:デフォルトの名無しさん
08/08/18 15:51:29
>>281
要求する領域全体が、メモリ上に連続で確保できる程度の大きさなら、
一遍に割り付けたほうがmallocのコストが低い。

a = (int **) malloc(sizeof(int *)*A);
a[0] = (int *) malloc(sizeof(int)*A*B);
for(i = 1; i < A; i++) a[i] = a[i-1] + B;

もちろんどっちがいいかは場合による。

287:デフォルトの名無しさん
08/08/18 15:53:16
>>286
志村、その論点ならmallocもう1個減らせるよ

288:デフォルトの名無しさん
08/08/18 16:14:26
質問者じゃないが、なるほど。

289:デフォルトの名無しさん
08/08/18 18:22:32
cygwin環境でgccを使っています。
<ncurses.h>のprintwを使って全角文字を表示しようと文字化けします。
同じ書式で標準出力でprintfを使った場合は、全角文字が表示されているので、
端末などの設定は正しいと思います。
リアルタイムでキー入力を受け付けるgetch()が使いたいので、ncursesは必要です。
解決方法ないでしょうか。

290:デフォルトの名無しさん
08/08/18 18:48:10
>>289
エディタぽいのつくってるのかな。
全角に半角上書き処理してるんじゃないかとエスパー。

291:289
08/08/18 18:56:28
>>290
#include <ncurses.h>
#include <locale.h>
int main(void){
setlocale(LC_ALL,"");
initscr();
printw("ほげほげ");
refresh();
usleep(1000000);
endwin();
}
ここまで短くしても文字化けしてしまいます。

292:デフォルトの名無しさん
08/08/18 19:48:33
>>286,287
a = (int **) malloc(sizeof(int)*A*B);
for(i = 1; i < 20; i++) a[i] = a[i-1] + B;
つまりこういうこと?
こっちのほうがfreeも一回でいいから便利そうだね㌧!

293:デフォルトの名無しさん
08/08/18 19:58:22
>>292
それは明らかにおかしい。

294:デフォルトの名無しさん
08/08/18 20:06:05
よく分からんが
malloc(sizeof(int)*A*B + sizeof(int*)*A);
って事かな

295:デフォルトの名無しさん
08/08/18 20:12:23
無難に
a = (int **)malloc(sizeof(int *)*A);
for(int i = 0; i < A; i++)
a[i] = (int *)malloc(sizeof(int)*A);

296:デフォルトの名無しさん
08/08/18 20:41:11
a = (int **)malloc(sizeof(int) * A * B + sizeof(int *) * A);
for(i = 0; i < A; i++) a[i] = (int *)a + A + i * B;



free(a);

なんどもサーセン
これで正解じゃなかったらあきらめる

297:デフォルトの名無しさん
08/08/18 21:24:01
おかしいです^q^

298:デフォルトの名無しさん
08/08/18 21:36:32
スレ違いだと思うんですが、system関数でぶち当たった問題なんで質問させてください。
現在、system関数で一行に複数のコマンドを打つ必要に迫られているのですが…ウィンドウズのプロンプトでの命令の区切文字ってあるのでしょうか? 
unix系だと「;」だったんですが、ウィンドウズの場合は一行一命令という絶望的な解説しか見当たりません。
一応「;」「,」「:」等を試してみましたがダメでした。
知っている方がいらしたら、よろしくお願いします。

299:デフォルトの名無しさん
08/08/18 21:40:18
スレ違いです。

300:デフォルトの名無しさん
08/08/18 21:48:44
スレ違いだと思うなら質問しないでください。

301:デフォルトの名無しさん
08/08/18 21:51:11
この>>300はおかしい

302:ym
08/08/18 22:02:21
チェック文字列で渡された文字列が全てアルファベットのA~Zの文字で構成されているかをチェックして
正常終了値;0 異常終了値;-1で判定するプログラムを誰か教えてください。
お願いします。


303:デフォルトの名無しさん
08/08/18 22:05:12
>>296
だから無難に
a = (int **)malloc(sizeof(int *)*A);
for(int i = 0; i < A; i++)
a[i] = (int *)malloc(sizeof(int)*B);
てして
for(int i = 0; i < A; i++)
free(a[i]);
free(a);
ってすればいいじゃん

304:デフォルトの名無しさん
08/08/18 22:12:56
>>302
#include <ctype.h>
int CheckFunc(char *str)
{
int i;
int check;
for(i = 0; str[i]; i++){
if((check = isalpha(str[i])) == 0)
return -1;
}
return 0;
}

305:デフォルトの名無しさん
08/08/18 22:13:29
>>298
NT系限定だけどこれはだめか?
cmd.exe /c hoge & foo

306:デフォルトの名無しさん
08/08/18 22:21:05
>>302
static int
checkstrA_Z(const char *str);

int
main(int argc, char *argv[])
{
if ( argc < 1 ) {
return -1;
}

return checkstrA_Z(argv[1])
}

static int
checkstrA_Z(const char *str)
{
for ( ; *str; str++ ) {
if ( !(('A' <= *str) || (*str <= 'Z')) ) {
return -1;
}
}

return 0;
}

/* EOF */
適当に作った、遅かったか。しかも試してないのでサーセン。

307:304
08/08/18 22:36:29
修正
>>302
#include <ctype.h>
int CheckFunc(char *str)
{
int i;
int check;
for(i = 0; str[i]; i++){
if((check = isupper(str[i])) == 0)
return -1;
}
return 0;
}

308:デフォルトの名無しさん
08/08/18 22:38:49
>>306
なんで素直に
{
while(*str++){
if (('A' > *str) || (*str > 'Z')) {
return -1;
}
return 0;
}
としない?
無意味に複雑にするから案の定、バグってるじゃん。


309:298
08/08/18 22:40:55
>>305
できました!!
すれ違いな質問なのに、答えていただきありがとうございました!
他の皆さんにもご迷惑をお掛けしてすみませんでしたm(_ _)m
ほいでは。

310:308
08/08/18 22:41:56
あー全然だめだ308もバグってる。突っ込み歓迎。寝る。

311:デフォルトの名無しさん
08/08/18 22:44:55
('A')

312:デフォルトの名無しさん
08/08/18 22:51:40
if文while文for文の条件の中に色々詰め込んでとにかくソース短くしようとする人って何なの?

313:デフォルトの名無しさん
08/08/18 22:55:52
while('A' <= *str && 'Z' >= *str) str++;
return *str == '\0' ? 0 : -1;


314:デフォルトの名無しさん
08/08/18 23:02:28
>>312
一般的に言って、短いほうが間違いがおきにくい。
複数の処理を一箇所にまとめて書くことはソースを縦に縮める効果がある。
一方で大抵の場合は同時に横に広がることでもあるので、
どちらを選ぶかはバランス感覚と好みの問題。

どっちがいいとか悪いとかいうことは、ない。

315:デフォルトの名無しさん
08/08/18 23:10:32
画面は一般的に縦より横に長い、つまりはそう言うこと
と、どこかで見た記憶があるけど忘れた

316:デフォルトの名無しさん
08/08/18 23:12:41
「短くしようとする時期がある」とかいう反応が返ってくると思ったのに

317:デフォルトの名無しさん
08/08/18 23:12:57
長く書いてバグを紛れ込ますには馬鹿と相場が決まっている

318:デフォルトの名無しさん
08/08/18 23:14:24
313 - 314 はその調子で何Step組んだことあるの?


319:デフォルトの名無しさん
08/08/18 23:17:16
そして>>317はたった1行の日本語ですら間違えてしまう。


320:デフォルトの名無しさん
08/08/18 23:19:35
文法ミスはコンパイラがエラーを出してくれるから許されるのさ

321:デフォルトの名無しさん
08/08/18 23:19:55
Step数(大爆笑

322:デフォルトの名無しさん
08/08/18 23:20:19
日立さん乙ですw

323:デフォルトの名無しさん
08/08/18 23:21:11
ステップ数ってあーた・・・・・
ロートルですか?

324:デフォルトの名無しさん
08/08/18 23:23:22
ごめん。たしかにロートルだ。
他にソースの長さを測る単位教えて若い人。


325:デフォルトの名無しさん
08/08/18 23:24:15
ソース長

326:デフォルトの名無しさん
08/08/18 23:24:50
自分で考えろジジイ

327:デフォルトの名無しさん
08/08/18 23:25:54
行数のことをステップ数いうのがアレなんだろ。

328:デフォルトの名無しさん
08/08/18 23:27:38
メインフレーム時代の名残だろうな

329:デフォルトの名無しさん
08/08/18 23:29:33
昔は、行数でプログラムの値段を算出していたんだろ。

330:デフォルトの名無しさん
08/08/18 23:30:23
ソースの長さを測る意味がわからん
同じ仕事をやる100行のソースAと1000行のソースBで偉いのはどっち?


331:デフォルトの名無しさん
08/08/18 23:31:06
>>330
だから、>>329

332:デフォルトの名無しさん
08/08/18 23:34:17
>>331
ということは、長くだらだらと書く奴の方が簡潔に書く奴より高給を貰ってた訳か
狂ってるな


333:デフォルトの名無しさん
08/08/18 23:34:18
可読性の話をしてると思ってたのだが。


334:デフォルトの名無しさん
08/08/18 23:35:49
>>332
正直者はいつも馬鹿を見るのがこの世です

335:デフォルトの名無しさん
08/08/18 23:36:21
>>332
まー実際は予算も決まってるし、新規で行数書けばその分テスト件数も増やさないといけないとか
いろいろあるのよ>日立の場合。

336:デフォルトの名無しさん
08/08/18 23:44:00
>>302
n = strspn(s, "ABCDEF・・・XYZ");
if (s[n] == '\0') return 0;
else return -1;

とすれば、ループもなくなるなと一瞬思ったけど、やっぱ"ABCDEF・・・"と書くのがダサいな。
isupperでまわしたほうがいいか。

あと、正常が0で、異常終了で-1ってのも、出題者のセンスが・・・

337:デフォルトの名無しさん
08/08/18 23:45:35
>>332
つか、メインフレームの作業体制は極度に分業が進んでいて
コーダーという人は詳細フローを言語のコードに一行ずつ落とすだけ。

そういう環境だから、ステップ単価というのは有効だったんだよ

338:デフォルトの名無しさん
08/08/18 23:49:20
>>336
正常0は理にかなってるよ
正常は一通りしかないが、異常にはいろんなケースがある
だから正常は0を返し、エラー時はエラーコードを返すほうがいい


339:デフォルトの名無しさん
08/08/18 23:53:14
>>338
だからウゼーって
独り言はチラシの裏にでも書いてろ

340:デフォルトの名無しさん
08/08/18 23:54:30
>>338
この場合は、エラーは一通りしかないじゃん。
bool値のかわりで、0と0以外のほうがいい。

それに、そういう思想だったら、-1じゃなくて、0とマイナス値としておかないとダメ。

341:デフォルトの名無しさん
08/08/18 23:56:05
多分この問題の次ではアルファベットじゃなかった文字数を返すようにしましょうって続くんだよ
きっとそうだよ

342:デフォルトの名無しさん
08/08/18 23:58:21
>>339
完全に反論の余地がない時は黙ってた方がいいですよ


343:デフォルトの名無しさん
08/08/18 23:59:58
どう見ても初学者用の問題なのにstrspnとかisupperつかってかえって混乱させようとしてるやつなんなの?

344:デフォルトの名無しさん
08/08/19 00:00:11
入力がヌル文字列の場合はどっち?


345:デフォルトの名無しさん
08/08/19 00:04:42
>>343
ああ、そういえば再帰とかつかって、面白い回答にするの忘れてたな。

346:デフォルトの名無しさん
08/08/19 00:05:54
今からでも遅くないからさっさとやれよ

347:デフォルトの名無しさん
08/08/19 00:12:35
>>343
標準ライブラリ関数を使うことの何が問題なんだかわからん
string.hに定義されてるような車輪の再発明をやらせる方がよっぽど問題だ


348:デフォルトの名無しさん
08/08/19 00:13:05
>>342
反論の余地とかそういう問題じゃなくてお前がうざいの

349:デフォルトの名無しさん
08/08/19 00:14:15
>>348
しーっ!これ以上書くと頭が悪いことがばれますよ!

350:デフォルトの名無しさん
08/08/19 00:15:18
Cだと文字列の理解はC言語自体の理解にも多少は
繋がる気がするから再発明も完全に無駄だとは思わない俺

351:デフォルトの名無しさん
08/08/19 00:16:29
文字列じゃなくて文字配列か

352:デフォルトの名無しさん
08/08/19 00:16:34
>>349
お前がな

353:304
08/08/19 00:22:21
>>302
じゃ初学者用に書くよ
int CheckFunc(char *str)
{
int i;
for(i = 0; str[i]; i++){
if ('A' > str[i] || str[i] > 'Z')
return -1;
}
return 0;
}

>>344
0が返る

354:デフォルトの名無しさん
08/08/19 00:25:07
>>353
○strがNULLだと落ちる
○iは無くても書ける


355:デフォルトの名無しさん
08/08/19 00:26:59
文字列に大文字以外が含まれているかどうか調べる関数って、どういう関数名が適切だと思う?

356:デフォルトの名無しさん
08/08/19 00:27:27
>>352
しーっ!これ以上書くと頭が悪いことがばれますよ!


357:デフォルトの名無しさん
08/08/19 00:28:01
>>354
引数にNULLを渡してはいけないという仕様です。

358:デフォルトの名無しさん
08/08/19 00:29:43
>>313でおk

359:デフォルトの名無しさん
08/08/19 00:29:59
>>357
君の世界ではそれでいいのかもしれないが、俺の世界では文字列のNULLチェックを怠ったばかりに
落ちてしまうソフトが後を絶たないんだなこれが

360:デフォルトの名無しさん
08/08/19 00:32:54
ポインタを渡す関数はnullかどうかひかくしなくてはいけないのですか?それが一般的ナのですか?

361:デフォルトの名無しさん
08/08/19 00:43:45
>>359
あなたの世界では、たとえばstrcat()にNULLを渡したときに、落ちずに正常に動作してますか?
strcat()がNULLを渡しても動作するとしたら、どう動作すればいいですか?

362:デフォルトの名無しさん
08/08/19 01:04:20
パルプンテ

363:デフォルトの名無しさん
08/08/19 01:14:15
そうだな、システムコールとかは異常が-1、正常がそれ以外だったりするしね。

364:デフォルトの名無しさん
08/08/19 02:40:04
>>361
顔が真っ赤ですよ

365:デフォルトの名無しさん
08/08/19 03:04:33
>>364
しーっ!これ以上書くと頭が悪いことがばれますよ!

ってもう遅いけど

366:デフォルトの名無しさん
08/08/19 04:02:45
ポインタを渡された側がNULLかどうかをチェックしてもあまり役に立つとは思わないけど。
無効なポインタは別にNULLだけじゃないから、無効なポインタは渡す側の責任でしか回避できない。
もちろん渡された側でのNULLチェックで回避できる問題もある。
でも渡される側でNULLチェックを怠ったばかりにおちてしまうような関数の使い方をしているようなプロジェクトなら、
他にも無効なポインタを渡してしまうような潜在的な危険があったりするおそれも。
>>357の人も引数に渡してはいけないのはNULLとせず、無効なポインタとすべきだったと思う。

367:デフォルトの名無しさん
08/08/19 09:43:53
NULLは呼んだほうの責任だからな。
まあassert入れといてもバチはあたらんと思うが。

368:デフォルトの名無しさん
08/08/19 11:44:22
Visual Studio 2005とかだと、sprintfの代わりにsprintf_sを使えと警告をされるのですが、いちいち書き換えたくありません。
sprintf_sは、Visual Studioの独自の関数で、2番目に、文字列のサイズを引数に取ります
マクロとかで解決できないでしょうか

369:デフォルトの名無しさん
08/08/19 11:46:23
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

370:デフォルトの名無しさん
08/08/19 11:50:42
>>369
 ありがとうございます。まさにそれを探してました。

371:デフォルトの名無しさん
08/08/19 12:30:24
#include <stdio.h>

#ifdef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
#undef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
#endif
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

int main( void )
{
char fname[256];

// this causes 4996 warning
sprintf( fname, "%s", "hogehoge" );

// this is safe version
// sprintf_s( fname, sizeof(fname), "%s", "hogehoge" );

return true;
}

こんなシンプルなものでもまだwarningでるんですが。。。

372:デフォルトの名無しさん
08/08/19 12:32:15
#define _CRT_NON_CONFORMING_SWPRINTFS

というかMSDN嫁

373:デフォルトの名無しさん
08/08/19 12:32:37
すいません。
#include <stdio.h>を後にしたらできました。

374:デフォルトの名無しさん
08/08/19 12:34:47
あ。悪い
>>372は関係ないわ

#pragma warning(disable : 4996)

375:デフォルトの名無しさん
08/08/19 12:35:56
>>372
どうもありがとうございます。
MSDNは嫁にしたんですが、気づきませんでした。

376:デフォルトの名無しさん
08/08/19 12:41:29
初心者の底辺なんですがおすすめの開発環境はありますか?

それとNetbeansでCをやろうとするとコンパイラが見つからないとエラー吐くんですが、
コンパイラってどこからDLするんでしょうか?

両方ググってはみたものの分かりませんでしたのでお願いします。

377:デフォルトの名無しさん
08/08/19 12:42:37
>>6

378:デフォルトの名無しさん
08/08/19 12:56:19
やはり、>>371でうまくいかない理由がわかりません。


379:デフォルトの名無しさん
08/08/19 13:00:12
>>378
ヘッダの位置変えたらうまくいくんでしょ?

コンパイラだって機械だからねえ。
機械的、要するにソースの上から解釈するってことだけでしょ。

380:デフォルトの名無しさん
08/08/19 13:06:01
プロトタイプ宣言の意味とか、プロトタイプ宣言をしない場合はmainより中で使ってる
関数がソースに前に来るとか理解できてるんだろうか?

381:デフォルトの名無しさん
08/08/19 13:12:34
>>379
そのとおりです。ヘッダをトップに持ってきたらうまくいきました。

>>380
理解できているつもりが、宣言の順番を変えるとうまくいかなくなる説明が解釈できません。


382:デフォルトの名無しさん
08/08/19 13:21:26
>>381
コンパイラの仕組み勉強してこい。


383:デフォルトの名無しさん
08/08/19 13:25:32
>>382
 的確なアドバイス、どうもありがとうございます。
不毛な気がしますが、VCのコンパイラがどのタイミングでCRTライブラリにしてくれるのか、調べてみます。

384:デフォルトの名無しさん
08/08/19 13:30:49
たぶんヘッダを解析した段階でコンパイラがリンクするライブラリを決定してしまってるのに
後でスイッチ置かれても切り替えができなってことかな?



385:デフォルトの名無しさん
08/08/19 13:52:31
_CRT_NON_CONFORMING_SWPRINTFS をgrepしてそのあたり見てみりゃわかる

386:デフォルトの名無しさん
08/08/19 13:53:35
コピペ元間違った
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
こっちな

387:デフォルトの名無しさん
08/08/19 13:59:33
あと、、defineはコンパイラ等に直接指示するわけじゃないから
切り替えたいときはincludeの前に置くのは常識なんだけどな。
コンパイラ等に指示出せるのはpragma

388:デフォルトの名無しさん
08/08/19 14:23:05
C言語の入門書を理解したレベルで取れそうな資格ってなにかありますか?

389:デフォルトの名無しさん
08/08/19 14:28:15
英検3級

390:デフォルトの名無しさん
08/08/19 14:33:19
>>388
「C言語プログラミング能力認定試験」という、クソの役にも立たない資格があるぞ。
3級とか、C言語をほとんど知らなくても取れる。2級はプログラムが組めなくても取れる。

が、入門レベルがわかるだけの資格持ってて何の役にたつと思う? やめとけ。

391:デフォルトの名無しさん
08/08/19 15:30:31
>>387
 なるほど。みなさん、よくわかりました。

おそらく、
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESがデフォルトでゼロになっていて、その値をマクロの引数にとって何かを展開しているのでだめなんでしょうね。
先手を取って1で定義してあげればよい、と。
#undefの使い方の間違えの典型であることがわかりました。

以上踏まえて、既に定義されているマクロを再定義する場合は#undefを使わないで、そのマクロが定義されている#includeの前におけばよいってことですかね。


392:デフォルトの名無しさん
08/08/19 15:50:55
>>388
そこから頑張って2種とか取れば良い。
ていうか、会社に理解してもらえない資格は時間の無駄、金の無駄。
CG検定、シスアドとか取ったけど糞の役にもたたねぇ。

393:ym
08/08/19 16:06:37
#include <stdio.h>
#include <ctype.h>
#define RET_OK    0
#define RET_NG -1
int N60901D01(const char *psChkString
{
int i;

for(i = 0;psChkString[i]!='\0';i++){
if(isupper(psChkString[i])!=0){
return RET_OK;
} else{
return RET_NG;
}
}
return RET_OK;
}
int main(void)
{
char str[256];

int chk;

gets(str);
chk = N60901D01(str);
printf("\n戻り値は%dです\n",chk);
}
アルファベットをチェックするプログラムなんですけど、
コンパイルをしたら1文字分しかチェックされませんでした。
どこが間違っているか教えてください。
お願いします。

394:デフォルトの名無しさん
08/08/19 16:09:22
>>393
>if(isupper(psChkString[i])!=0){
の中で必ず一回目でreturnしてる。

395:デフォルトの名無しさん
08/08/19 16:11:53
>>393
for文の中で1文字目チェックした後、真でも偽でもreturnしてるだろう。
そこは最後まで回さないと。最後がRET_OKってことは、if文のRET_OKの行を消せばいいような気がする。

396:ym
08/08/19 16:11:55
必ず1回目でreturnしないためにはどうしたらいいですか?

397:デフォルトの名無しさん
08/08/19 16:16:59
>>396

>>395の言うように、
if(isupper(psChkString[i])!=0){
の下の
return RET_OK;
を消してみ。

398:デフォルトの名無しさん
08/08/19 16:17:12
return文を消せばいいと思うよ

399:ym
08/08/19 16:26:09
if文のreturn RET_OKを消したらコンパイル成功しました。
ありがとうございました。

400:デフォルトの名無しさん
08/08/19 16:37:48
え、コンパイル失敗してたの?そういう話?

401:デフォルトの名無しさん
08/08/19 16:43:41
>>400
3つめのreturn文にいくことはありませんエラーか。

402:デフォルトの名無しさん
08/08/19 17:43:19
処理開始から処理終了まで何秒経過したかを調べる方法を探しているのですが、

#include <stdio.h>
#import <time.h>
#include <unistd.h>

int main (int argc, const char * argv[]) {
clock_t start, end;
start = clock();
printf("start:%ld¥n",start);
sleep(1);
end = clock();
printf("end:%ld¥n",end);
printf("CLOCKS_PER_SEC:%ld¥n",CLOCKS_PER_SEC);
printf("%ld秒経過しました。¥n", (end - start) / CLOCKS_PER_SEC);
return 0;
}
これを実行すると
start:6464
end:6580
CLOCKS_PER_SEC:1000000
0秒経過しました。
こんな結果が帰ってきました。
CLOCKS_PER_SECは1秒あたりのクロック数では無いのでしょうか。


403:デフォルトの名無しさん
08/08/19 17:46:26
整数型で出力しちゃあ駄目だろ

404:デフォルトの名無しさん
08/08/19 17:49:15
printf("%f秒経過しました。\n", (float)(end - start) / CLOCKS_PER_SEC);

405:デフォルトの名無しさん
08/08/19 17:52:29
>>404
ありがとうございます。
start:6894
end:7011
CLOCKS_PER_SEC:1000000
0.000117秒経過しました。
こうなりました。sleep(1)が0.00017秒?なわけ無いんだが…
CLOCKS_PER_SECはあてにならないってことなのかな


406:デフォルトの名無しさん
08/08/19 17:55:17
TimeGetTimeか QueryPerformanceCounter使えよ
1秒単位とか精度が悪すぎる(この場合はな)

407:デフォルトの名無しさん
08/08/19 17:55:40
int a[4];
int b[4];
int c[4];
:
:


といった感じに、int型配列が大量に存在している場合に、配列内の数字でソートしたいのですが、
int型配列の数字の大小比較がうまくできません。どなたかご教授お願いします
単純に int(a[0] > b[0]){ってやっていくと死ねる・・・orz

408:デフォルトの名無しさん
08/08/19 18:00:09
qsort

409:デフォルトの名無しさん
08/08/19 18:01:15
>TimeGetTimeか QueryPerformanceCounter
Winの独自実装ですか…
残念ながらWindowsでは無いです

410:デフォルトの名無しさん
08/08/19 18:04:02
それだけだとほとんど0になるはずだよね。
どんな環境でやってるの?

411:デフォルトの名無しさん
08/08/19 18:06:11
sleepかけてる間クロックとまってんじゃないの

412:デフォルトの名無しさん
08/08/19 18:07:19
sleepで0.00017秒も食ってるから、おかしいと思ってるんじゃないの?

413:デフォルトの名無しさん
08/08/19 18:07:50
>>411
だろーね
こういうやり方してもテストにならないってこった

414:デフォルトの名無しさん
08/08/19 18:08:41
>>412
printf挟んどいてそれはないだろ

415:402
08/08/19 18:11:16
>>410
gcc 4.0.1
Mac OS 10.5.4
Intel Core Duo 2.4GHz
2GB 667MHz DDR2 SDRAM
です。


416:402
08/08/19 18:13:05
>>411,413
sleepするとクロック止まるんですか…、ありがとうございます。

417:デフォルトの名無しさん
08/08/19 18:20:39
>>407
何がしたいのかよくわからないが、たぶん配列を大量に作るのがもうおかしいんだろう。
ソートしたいもの全部を一つの配列に入れましょう。

418:デフォルトの名無しさん
08/08/19 18:25:55
>>407
はもうちょっとくやしく

419:デフォルトの名無しさん
08/08/19 18:32:50
>>418
int a[4] ; a[0] =1 a[1]=2 a[2]= 3 a[3]= 4
int b[4] ; b[0] =2 b[1]=2 b[2]= 3 b[3]= 4
として、a自体を1234、bを2234と考えて、大小比較を行いたいわけなんです
この場合はb>aみたいな感じで・・・

420:デフォルトの名無しさん
08/08/19 18:34:33
memcmpとかでいいのとちがうん?
配列で連続してればcharで見てやって

421:デフォルトの名無しさん
08/08/19 18:38:18
>>419

if ((a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3]) < (b[0] * 1000 + b[1] * 100 + b[2] * 10 + b[3])) {
// bが大きい
} else {
// aが大きい
}

とかじゃ駄目なの?

422:デフォルトの名無しさん
08/08/19 18:38:42
>>420
今調べてみましたが
buf1 と buf2 を先頭から n バイト分比較します。比較はunsigned char として行われます
とあるのですが、int型でも関係なくできるものなんですか?
intとcharじゃバイト数が全然違うので、なんか変なことになりそうな気もするのですが・・・

423:デフォルトの名無しさん
08/08/19 18:39:43
>>421
配列が何個もあるんです・・・
んで、バブルソートみたいなことをやりたいので、そのように書くととんでもないことになるんですorz
関数として何か簡単に比較できるものがないかな~という感じで探してたのですが、いいのがなくて('A`

424:デフォルトの名無しさん
08/08/19 18:40:28
>>422
同じCPU環境化でメモリに入れちゃえばcharだろうがなんだろうがw
長ささえ同じなら問題ないよ。
エンディアンの問題も関係ないし。

425:デフォルトの名無しさん
08/08/19 18:41:45
4桁固定?例えば0030とか0111とか。
それなら1桁目からソートしていけば良さそうだけど。

426:デフォルトの名無しさん
08/08/19 18:43:56
>>424
なるほど・・・。ためしにちょいと動かしてみます~

427:デフォルトの名無しさん
08/08/19 18:46:24
int a[4]={1,2,3,6}, b[4]={1,2,3,5};
int i = 0,c = 0;
while(!(b[i]-a[i]) && c < 3)i++, c++;
if(b[i]-a[i]==0)puts("同じ");
else if(b[i]-a[i]>0) puts("bのがおおきい");
else puts("aのがおおきい");


428:デフォルトの名無しさん
08/08/19 18:52:21
>>419
のサンプルでいけば

ビッグエンディアン系だとメモリに格納された場合はこんな感じ
a 00000001 00000002 00000003 00000004
b 00000002 00000002 00000003 00000004

で格納する元も両方intで比べる際もcharでもいいしunsigned charでもいいし両者の条件さえ同じなら比較する桁もあうので問題ない

リトルエンディアン系でも同じ
ビッグエンディアン系だとメモリに格納された場合はこんな感じ
a 01000000 02000000 03000000 04000000
b 02000000 02000000 03000000 04000000

intをレジスタ上で扱う場合は①②③④(<-バイトの並びね)だったらメモリには④③②①とアドレスの最初から格納されるけど
通信でほかに渡したしりなければ同じエンディアン系で処理されるので結果memcmpであろうが比較する桁はいっしょなので
問題ない



429:デフォルトの名無しさん
08/08/19 18:53:30
↑で書いた数字は全部16進数ね

430:こうならないの?
08/08/19 18:57:27
ビッグエンディアン
a 00000F01 00000002 00000003 00000004 
b 00000002 00000002 00000003 00000004 
(a > b)

リトルエンディアン
a 010F0000 02000000 03000000 04000000 
b 02000000 02000000 03000000 04000000 
(b < a)


431:デフォルトの名無しさん
08/08/19 18:59:01
例を見る限り、配列に入ってるのは一桁の10進数だろ

432:デフォルトの名無しさん
08/08/19 18:59:11
>>430
エンディアン系を意識すればいいだけだろw

433:デフォルトの名無しさん
08/08/19 19:02:00
>>432
memcmpが意識してくれるの?

434:デフォルトの名無しさん
08/08/19 19:04:58
memcmpの結果を意識しろよw
大きいか小さいかイコールでくれるんだろw
そんなことも考えれないようなら素直にループで1つ1つやれw

435:デフォルトの名無しさん
08/08/19 19:17:40
>>434
こういうのは?

リトルエンディアン 
a 01010000 02000000 03000000 04000000  
b 00020000 02000000 03000000 04000000  
memcmpの結果 (a > b) 

リトルエンディアン 
a 00010000 02000000 03000000 04000000  
b 00020000 02000000 03000000 04000000  
memcmpの結果 (b < a) 

でも実際は、どちらも b > a にならなければおかしい


436:デフォルトの名無しさん
08/08/19 19:36:17
誰か、いまだにエンディアンについてよくわかってない俺に図解!マンガでわかるエンディアンを頼む

437:デフォルトの名無しさん
08/08/19 19:42:35
>>436
数字があるとするじゃん。
一番上の位から読む?(ビッグエンディアン)
それとも一番下の位から読む?(リトルエンディアン)
って話。

438:デフォルトの名無しさん
08/08/19 19:44:20
>>437
いやそれは違う・・・

メモリ上に複数バイトで構成される数字を格納した際の
格納のされ方の違いだよ。



439:デフォルトの名無しさん
08/08/19 19:50:02
エンディアン糞フカナイ

440:デフォルトの名無しさん
08/08/19 20:45:12
>>439
汚ぇなぁ、おい。

>>435
>431

>>416
unix系なら、gettimeofday()がそこそこ使える。こいつは実時間だ。
既に指摘の通り、clock()はCPU時間だから要注意だ。

441:デフォルトの名無しさん
08/08/19 21:00:10
>>423
比較する関数を作ればいいだけなんじゃないの?
エンディアンを意識してどうこうするよりよほど楽だと思うんだけど

442:デフォルトの名無しさん
08/08/19 21:06:39
>>423
こんなんとか
int cmp(int a[4], int b[4]){
int i, ret;

for(i=0;i<4;i++){
ret=a[i]-b[i];
if(ret) break;
}
return ret;
}

443:デフォルトの名無しさん
08/08/19 21:38:42
いつのことだったか、ガリバーという人が訪ねたある国の人々が、
卵を大きい方の端から割る派閥(ビッグエンディアン)と、
卵を小さい方の端から割る派閥(リトルエンディアン)とに分かれて
争っていたんだそうな(とある国の政治家の風刺でもあるんだが)。
それにちなんで、MSBから先に格納するのをビッグエンディアン、
LSBから先に格納するのをリトルエンディアンと呼ぶんじゃよ。


444:デフォルトの名無しさん
08/08/19 21:46:40
扱う数値の範囲によっては>>442だとオーバーフローして逆の符号を返す可能性もある

445:デフォルトの名無しさん
08/08/19 21:48:34
計算結果がオーバーフローorアンダーフローしてるかどうかを調べることってできる?

446:デフォルトの名無しさん
08/08/19 21:50:30
>>445
標準Cの範囲内では無理じゃないかな?

447:デフォルトの名無しさん
08/08/19 22:11:52
>>440
ちょw
条件後付

448:440
08/08/19 22:38:10
>>447
私に言うな。

449:デフォルトの名無しさん
08/08/19 22:53:17
ふつうに計算じゃなくてビット演算組み合わせればオーバーフローもチェックできるんじゃね?って思った

450:デフォルトの名無しさん
08/08/19 23:01:45
>>445,446,449
できるよ。
符号付きとなしとで微妙に変わるけど、加減算なら二つの数値の
最上位ビット見ればいい。
乗除算もちょっと手間かかるけどできなくはない。


451:デフォルトの名無しさん
08/08/19 23:09:23
具体的にどうやんの
加算でもいいから教えてくだちい

452:デフォルトの名無しさん
08/08/19 23:16:07
符号付での二つでの足し算で言うと
負と負なら答えは負なので最上位ビットは普通はずっと1、 オーバー フローすると0になる
負と正ならそもそもオーバーフローしない
正と正ならオーバーフローすると最上位は1になる

そんな感じ

453:デフォルトの名無しさん
08/08/19 23:17:01
桁あふれか

加算なら結果からもう一回引いてみればいいんじゃね?
元の数字に復元できれば桁あふれ無し。
元の数字にもどら無ければ桁あふれあり

454:デフォルトの名無しさん
08/08/19 23:26:06
オーバーフローした結果から引いたらアンダーフローして元に戻ると思うよ
・・・アンダーフローって意味違うような気がした

455:デフォルトの名無しさん
08/08/19 23:27:45
半分のビット数ごとに分けて計算する

456:デフォルトの名無しさん
08/08/19 23:31:35
>>453
お戯れを。

457:デフォルトの名無しさん
08/08/19 23:33:35
logで計算する

458:デフォルトの名無しさん
08/08/19 23:38:17
logで足し算できるものなら教えて欲しい。

459:デフォルトの名無しさん
08/08/19 23:39:47
指でも折って数えるんだ
足りなくなったら隣の人の借りろ
マイナスなど知らん

460:デフォルトの名無しさん
08/08/19 23:44:17
>>445
そもそも、どんなデータなんだよ。
そのオーバーフローやアンダーフローを気にしなくてはいけないデータというのは。

461:デフォルトの名無しさん
08/08/19 23:51:07
int add(int a, int b, int *p_is_overflow){
int chk_type, result, is_over_flow=0;

chk_type=(a<0)*2+(b<0);
result=a+b;
switch(chk_type){
case 0: if(result>0) is_over_flow=1; break; // a, b ともに 0 以上なので解も 0 以上になるべき
case 3: if(result<0) is_over_flow=1; break; // a, b ともに 0 未満なので解も 0 未満になるべき
}
if(p_is_over_flow) *p_is_over_flow=is_over_flow;

return result;
}

462:デフォルトの名無しさん
08/08/19 23:52:00
>>461 case の 0 と 3 間違えた

463:デフォルトの名無しさん
08/08/20 01:01:39
>>460
ちょっとした計算を代わりにやってもらうのプログラムなんですが
計算過程を式としては理解しているのですが、
計算途中の値がどの程度の大きさになっているのは知りません
知らないうちにオーバーフローしてるんじゃないかと少し不安なんです
もちろん値が狂ったら答えも大抵はおかしくなるでしょうからそうそう困ることはないのですが

464:デフォルトの名無しさん
08/08/20 01:04:47
出た答えが正常かおかしいかは判断できるのか?
方程式の解とかで元の式に代入して検算とかできるのなら困らないけど

465:デフォルトの名無しさん
08/08/20 01:37:58
>>461 の修正版
int add(int a, int b, int *p_is_overflow){
int chk_type, result, is_overflow=0;

chk_type=(a<0)*2+(b<0);
result=a+b;
switch(chk_type){
case 0: if(result<0) is_overflow=1; break; // a, b ともに 0 以上なので解も 0 以上になるべき
case 3: if(result>=0) is_overflow=1; break; // a, b ともに 0 未満なので解も 0 未満になるべき
}
if(p_is_overflow) *p_is_overflow=is_overflow;

return result;
}

掛け算は a*b/b==a をチェックすればいい

整数同士の除算は一つの例外を除いてオーバーフローしない (0div はあるけど)

466:デフォルトの名無しさん
08/08/20 01:57:37
その例外は・・・?


467:デフォルトの名無しさん
08/08/20 02:00:18
ヒント・大抵正の最大値より負の最少値のほうが絶対値が大きい

468:デフォルトの名無しさん
08/08/20 02:02:27
>>466
読みたくば●を買え

C言語なら俺に聞け(入門篇) Part 12
スレリンク(tech板:951-952番)

469:デフォルトの名無しさん
08/08/20 02:04:57
951 名前:デフォルトの名無しさん[sage] 投稿日:2007/05/15(火) 14:28:25
これでダメな場合って lop==0 の時以外にあるかな?
result=lop*rop;
if(result/lop!=rop) オーバーフロー

952 名前:デフォルトの名無しさん[sage] 投稿日:2007/05/15(火) 14:54:12
>>951
っ lop=-1 rop=INT_MIN

470:402
08/08/20 09:34:26
>>440
ありがとうございます。
今作っている物は1秒ごとの判断で良かったので最終的にtime()関数を使うことにしました。
gettymeofday();も今度試してみます。

471:デフォルトの名無しさん
08/08/20 10:39:41
このプログラムなら正常に動くんですが、main関数内のnibai関数を
scanf("%d",&a);
nibai(a);
printf("二倍した数値は%d\n",a);
と書くと2倍してくれないんですが、何故でしょうか?
-----------------------------------------------------------
#include<stdio.h>
int nibai(int x);
int main(void){
int a;
printf("数値を入力してください:");
scanf("%d",&a);
printf("二倍した数値は%d\n",nibai(a));

return 0;}
int nibai(int x){
int wk;
wk=x*2;

return wk;}

472:デフォルトの名無しさん
08/08/20 10:59:39
a = nibai(a);

473:デフォルトの名無しさん
08/08/20 11:00:37
あーなるほど!!
ありがとうございます。

474:ym
08/08/20 13:43:00
受け渡された文字列が'0000'~'2359'の時刻範囲内かをチェックする
プログラムを教えてください。お願いします。
チェック内容は以下の通りです。
1. 受け渡された文字列が全て数値であること。
2. 受け渡された文字列の先頭2文字が'00'~'23'の範囲であること。
3. 受け渡された文字列の3文字目~4文字目が'00'~'59'の範囲であること。
正常終了時:return 0
異常終了時:return -1(時刻範囲外)


475:デフォルトの名無しさん
08/08/20 13:45:10
教えて欲しいのではなく宿題を丸投げしたいだけなら
宿題スレへ行ってください。


476:デフォルトの名無しさん
08/08/20 13:48:49
なんか最近範囲内チェックの質問多いな。全部同じやつか?

477:ym
08/08/20 13:57:04
char hh[3];
char mm[3];
int h;
int m;
hh[0]=pstime[0];
hh[1]=pstime[1];
hh[2]='\0';
mm[0]=pstime[2];
mm[1]=pstime[3];
mm[2]='\0';
h=atoi(hh);
m=atoi(mm);
if((h >= 0 && h <= 23)&& (m >= 0 && m <= 59)){
return RET_OK;
}else{
return RET_NG;
}
}
int main(void)
{
char str[256];
int chk;

gets(str);
chk = N60901D04(str);
printf("\nreturn=%d\n",chk);
}
受け渡された文字列が'0000'~'2359'の時刻範囲内かをチェックするプログラムなんですけど、コンパイルをしたら、
アルファベット4文字を入力してもreturn 0(正常)で判定されてしまったん
ですけど、プログラムの中のどこが悪かったのか、教えてください。お願いします。


478:デフォルトの名無しさん
08/08/20 13:59:57
たぶん、数字以外で数値に変更できなかったから0になって0時0分は有効だから、じゃない?
isdigit とかで先にチェックするとか。

479:デフォルトの名無しさん
08/08/20 14:00:28
>>474
int main(int argc, char *argv[])
{
  char *p;
  int n;

  for(p=argv[1] ; *p ; p++)
    switch(*p)
    {
      case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break;
      default: return -1;
    }

  switch(argv[1][0])
  {
    case '0': case '1': break;
    case '2':
      switch(argv[1][1])
      {
        case '0': case '1': case '2': case '3': break;
      }
    default: return -1;
  }

  switch(argv[1][2])
  {
    case '0': case '1': case '2': case '3': case '4': case '5': break;
    default: return -1;
  }

  return 0;
}

480:デフォルトの名無しさん
08/08/20 14:01:42
>>477
atoiで変換は失敗すると0を返すからじゃね

481:デフォルトの名無しさん
08/08/20 14:02:11
あ、n消し忘れた

482:デフォルトの名無しさん
08/08/20 14:03:47
>>479
4桁目のチェックが抜けてないか?

483:デフォルトの名無しさん
08/08/20 14:05:20
>>482
必要あるか?

484:デフォルトの名無しさん
08/08/20 14:05:42
>>482
あーそうだね

  switch(argv[1][2])
  {
    case '0': case '1': case '2': case '3': case '4': case '5': if(argv[1][3]) break;
    default: return -1;
  }

こうか

485:デフォルトの名無しさん
08/08/20 14:07:05
>>483
ある
[3]が\0のときも無視して通してしまう

486:デフォルトの名無しさん
08/08/20 14:09:08
2桁目も

  switch(argv[1][0])
  {
    case '0': case '1': if(argv[1][1]) break;

だな

487:デフォルトの名無しさん
08/08/20 14:22:21
int check_time(const char *hhss)
{
    int i, hour, second;
    if (strlen(hhss) != 4) return -1;
    for (i = 0; i < 4; i++) if (!isdigit(hhss[i])) return -1;
   
    hour = (hhss[0] - '0') * 10 + (hhss[1] - '0');
    second = (hhss[2] - '0') * 10 + (hhss[3] - '0');
   
    return (0 <= hour && hour < 24 && 0 <= second && second < 60) ? 0 : -1;
}

488:デフォルトの名無しさん
08/08/20 14:29:42
教えてください

int型の2次元配列の先頭のポインターだけをもらってくる関数があります。
配列のサイズはわかっているんですが関数内で見る際にはどう記述すればいいでしょうか?

これを関数内でいじりたい
unsigned int hoge2div[100][200];

関数を呼ぶ前に連絡用構造体の所定のエリアに2次元配列のポインターを格納してます。
(unsigned int* )hoge->ptr = hoge2div;


関数内の定義(ここを直したい。)
unsigned int* 2div = (unsigned int* )2div->ptr;

489:デフォルトの名無しさん
08/08/20 14:30:40
>関数を呼ぶ前に連絡用構造体の所定のエリアに2次元配列のポインターを格納してます。
>(unsigned int* )hoge->ptr = hoge2div;
こっちが正解です
hoge->ptr = hoge2div;

490:デフォルトの名無しさん
08/08/20 14:36:52
unsigned int (*p)[DIV1_SIZE]=(unsigned int (*)[DIV1_SIZE])hoge->ptr;


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch