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;