トップページ⇒tech
1001コメント299KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/09/21(金) 11:43:13
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

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

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 96代目
http://pc11.2ch.net/test/read.cgi/tech/1190331997/
0652デフォルトの名無しさん2007/10/09(火) 15:26:35
>>651
fputc()はそもそも何のために使うんですか?
0653デフォルトの名無しさん2007/10/09(火) 15:32:10
バイトをファイルに書き込むため
0654デフォルトの名無しさん2007/10/09(火) 15:44:54
下位バイトしか書き込まないのに何で「文字」が
全部書き込めるんですか?
0655デフォルトの名無しさん2007/10/09(火) 15:59:43
文字が全部書き込めると言った覚えはないけど。

アルファベットや数字のような1バイト文字なら、
1バイトを書き込むだけで文字全体を書き込める。
ひらがなや漢字のようなマルチバイト文字は無理だ。
必要なバイト数の分だけ繰り返し fputc を使う必要がある。
0656デフォルトの名無しさん2007/10/09(火) 16:18:43
UTF-16は、半角系文字も16ビット固定だから
つまり文字位置インデックスが高速なんです
0657デフォルトの名無しさん2007/10/09(火) 16:24:27
でも基本多言語面以外の文字はサロゲートペアで32ビットだから
つまりUTF-16って可変長なんです
0658デフォルトの名無しさん2007/10/09(火) 16:34:52
とっても初歩的な質問です。
ポインタ変数の大きさについてなのですが、
int型やchar型は、例えばそれぞれ4バイト、1バイトの大きさですが、
それらを指すポインタ変数、int*型やchar*型の大きさはどうなるんでしょうか?
予想だと、ポインタ変数はアドレス入れるだけなので一定の大きさだとは思うのですが。
32bitCPUなら4バイト(32bit)固定、とかなんでしょうか?
0659デフォルトの名無しさん2007/10/09(火) 16:38:15
>>658
まぁ普通はそう。
確認したければ sizeof を使ってみるといい。
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(int*));
0660デフォルトの名無しさん2007/10/09(火) 16:51:49
>>658
アーキテクチャによって違うが、
一般的な32bitCPUなら、どの型のポインタも4byte
0661デフォルトの名無しさん2007/10/09(火) 16:54:06
このスレでバイナリエディタの扱いに慣れてる人いてる?
0662デフォルトの名無しさん2007/10/09(火) 17:00:23
http://proforceone.web.fc2.com/ ⇒ Processed input data

zzztv[247]
yoshimotokogyo[141]

http://proforceone.web.fc2.com/ ⇒ Calculation processing

d=$.split("\n");for(j=0;d.length>j;j++){s=d[j].substring(0,l=d[j].indexOf("["));
n=eval(d[j].substring(l+1,d[j].indexOf("]")));n=(n-n%20)/20+(n%20>0);br();
for(i=0;n>i;i++){write("http"+"://youtube.com/results?search_query=");
write(s+"&search_sort=video_date_uploaded&page="+(i+1));br();}}br();
0663デフォルトの名無しさん2007/10/09(火) 17:05:18
>>659-660
なるほど、そうですか。
スッキリしました。
ありがとうございました。
0664デフォルトの名無しさん2007/10/09(火) 17:48:01
C言語で何秒間停止させるみたいな関数ってありますか?
0665デフォルトの名無しさん2007/10/09(火) 17:57:45
>>664
Sleep()ではだめって事?
0666デフォルトの名無しさん2007/10/09(火) 17:57:51
UTF-32 UTF-16 UTF-8
http://ja.wikipedia.org/wiki/Unicode
0667デフォルトの名無しさん2007/10/09(火) 18:00:38
http://ja.wikipedia.org/wiki/UTF-32
http://ja.wikipedia.org/wiki/UTF-16
http://ja.wikipedia.org/wiki/UTF-8
0668デフォルトの名無しさん2007/10/09(火) 18:04:01
エンディアン (endian)
http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3
06696642007/10/09(火) 18:12:40
すいませんできれば使い方まで教えてください。
0670デフォルトの名無しさん2007/10/09(火) 18:13:06
UTF-16は、WindowsXPなど多くのOSで、内部表現に使われている。
Microsoft Windowsでは、リトルエンディアンのUTF-16が使われている。
内部表現ではBOMなし、ファイルなどではBOMありが主である。BOMなしのものはUTF-16LE、BOMありのものはUTF-16符号化形式(BOMありのリトルエンディアン)ということになる。
TCP/IPネットワークでは、ビッグエンディアンに決められている。
0671デフォルトの名無しさん2007/10/09(火) 18:16:35
>>669
http://www.bohyoh.com/CandCPP/FAQ/FAQ00071.html
0672デフォルトの名無しさん2007/10/09(火) 18:19:27
UTF-16は、WindowsXPなど多くのOSで、内部表現に使われている。
Microsoft Windowsでは、リトルエンディアンのUTF-16が使われている。
内部表現ではBOMなし、ファイルなどではBOMありが主である。
BOMなしのものはUTF-16LE、BOMありのものは
UTF-16符号化形式(BOMありのリトルエンディアン)ということになる。
TCP/IPネットワークでは、ビッグエンディアンに決められている。
06736642007/10/09(火) 18:21:32
>>671
ありがとうございます
やってみます
0674デフォルトの名無しさん2007/10/09(火) 18:24:33
英語出来なきゃだめ?
おまいらの勉強法
0675デフォルトの名無しさん2007/10/09(火) 18:27:14
日本語でおk
0676デフォルトの名無しさん2007/10/09(火) 18:45:39
http://proforceone.web.fc2.com/ ⇒ Processed input data

エンタ[263.]
お笑い[4,010]
zzztv[247]
yoshimotokogyo[141]

http://proforceone.web.fc2.com/ ⇒ Calculation processing

d=$.split("\n");for(j=0;d.length>j;j++){s=d[j].substring(0,l=d[j].indexOf("["));
s=encodeURIComponent(s);n=d[j].substring(l+1,d[j].indexOf("]")).split(".");
n=eval(n[0].split(",").join(""));n=(n-n%20)/20+(n%20>0);br();
for(i=0;n>i;i++){write("http"+"://youtube.com/results?search_query=");
write(s+"&search_sort=video_date_uploaded&page="+(i+1));br();}}br();
0677デフォルトの名無しさん2007/10/09(火) 18:58:21
以下のようなテスト用プログラムを組んだのですが、引数が存在しない場合に
if(fp == NULL){}内が実行されず、何も表示されずに終了してしまいます。
引数が存在すればscanfまでちゃんと行くのですが、何がいけないのでしょう?

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

#define PROGRAM_NAME patch.exe

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

  FILE *fp;
  char answer;

    fp = fopen(argv[1],"r");
    if(fp == NULL){
       printf("ファイルがありません\n");
       printf("PROGRAM_NAME 書き換え元ファイル パッチデータ\n");
       exit(1);
    }

    printf("%sにパッチを当てますか?(y/n) ->",argv[1]);
    scanf("%c",&answer);

    return 0;

}
0678デフォルトの名無しさん2007/10/09(火) 19:12:58
引数がないときは argv[1] が NULL になるから、 NULL を渡された fopen が落ちる
argc を見て引数の数を確認しる
0679デフォルトの名無しさん2007/10/09(火) 19:17:28
おお、そんなからくりが!引数チェックをしたらちゃんと動くようになりました。ありがとうございます。
0680デフォルトの名無しさん2007/10/09(火) 19:52:25
argcね

argc=1 実行プログラムの絶対パス
arg=2 +引数1
arg=3 +引数2
・・・・・・・・・・・
0681デフォルトの名無しさん2007/10/09(火) 20:15:24
>argc=1 実行プログラムの絶対パス
絶対パスでは無かったような。
シェルが解釈した後のパースされたコマンドラインの文字列が入ってるだけでない?
06826802007/10/09(火) 20:20:35
>>681 まちがえたかな?そうかも。
0683デフォルトの名無しさん2007/10/09(火) 20:40:16
>>681
それは処理系依存。
[0]に何も入ってない場合もある。
0684デフォルトの名無しさん2007/10/09(火) 21:01:34
>>683
を、マジか。
フォローさんくす。それは知らなんだ。
ちょっと触ってみたいんで、参考までに何も入ってない環境を知ってたら教えて欲しい。

軽くググってみたけど、CFAQに「何も入っていないかも知れない」って
記述があるぐらいしか分からんかった。
0685デフォルトの名無しさん2007/10/09(火) 21:16:19
#include <unistd.h>
main(int argc, char *argv[]) {
if(argv[0]) exec(argv[0], NULL);
else puts("argv[0] is null.");
}

とかでいいんでね?
0686デフォルトの名無しさん2007/10/09(火) 21:20:58
unsigned (int)は0〜4294967295の範囲を扱えますが
144115188075856000という数字を扱いたい場合どうすればいいでしょうか?
0687デフォルトの名無しさん2007/10/09(火) 21:26:12
一般的にunsigned intのあらわせる範囲は0 ~ 65,535

そのような巨大な整数を扱いたいならば、
C99から追加されたunsigned long long int (0 ~ 2^64-1)を使うか、
コンパイラが独自に実装している超長整数型を使う必要がある。
0688デフォルトの名無しさん2007/10/09(火) 21:27:34
>>686
多倍長演算とかでぐぐるんだ
0689デフォルトの名無しさん2007/10/09(火) 21:35:49
>>685
おぉ・・・なるほど。気づかんかった。
重ねてありがとう。
0690デフォルトの名無しさん2007/10/09(火) 21:37:39
おめーらなんでそんなに詳しいんだよ!!!
ちくしょうちくしょう!!
0691デフォルトの名無しさん2007/10/09(火) 22:01:58
8の平方根をsqrt(8)とかやって計算すると2.828とかが出てくると思うんですが、
8の平方根として2√2を出したい場合もあると思います。
8ならば
x[2]={1,8};
for(i=2; i*i <= x[1]; i++)
if(!x[1]%(i*i)){
x[0] *= i;
x[1] /= i*i;
}
printf("square root of 8 = %d",x[0]);
if(x[1]!=1) printf("√%d",x[1]);
これでいいとは思いますが、
例えば√0.02=0.1√2だとか、√1.6=0.4√10などの式変形をしたい場合、
どのようにすればよいのでしょうか。

変形が一意的に定まらない場合もありますが(0.4√10=4√0.1とか)、
とりあえずはルートの中身が平方数でない整数、という条件でお願いします。
(もしくは他の規則でも構いませんが)
0692デフォルトの名無しさん2007/10/09(火) 22:06:43
>>655
遅レスすみません。

char str[80] = "ファイルシステムのテスト\n";
FILE *fp;
char *p;

p = str;
while(*p) {
if(fputc(*p, fp) == EOF) {
printf("ファイル書き込みエラー\n");
exit(1);
}
p++;
}

と教科書にあるんですがこの場合
"ファイルシステムのテスト"
が2バイト文字だから
フの下位バイト、ァの下位バイト、イの下位バイト、・・・
という風に書き込まれていくんですか?
0693デフォルトの名無しさん2007/10/09(火) 22:14:22
>>692
そういう場合はstr[0] にフの上位バイト、str[1]にフの下位バイトというふうに入ってる。
0694デフォルトの名無しさん2007/10/09(火) 22:31:04
フフフフフフフフ
0695デフォルトの名無しさん2007/10/09(火) 22:33:25
(^^)
0696デフォルトの名無しさん2007/10/09(火) 23:00:41
>>691
√0.02を0.1√2に変形するとき、お前さんは何を考えた?

それをそのままコードにすればいい。
0697デフォルトの名無しさん2007/10/09(火) 23:16:01
>>696
そういう考え方をすればいいんですね
ありがとうございます
0698デフォルトの名無しさん2007/10/09(火) 23:37:50
>>691
整数の奴もそれじゃだめだろ
0699デフォルトの名無しさん2007/10/10(水) 00:12:20
16進数の値が書かれた文字列を、
10進数の数値に直すにはどうすればいいのでしょう?

"0012FF" → 4863

という感じです
0700デフォルトの名無しさん2007/10/10(水) 00:18:23
>>699
つstrtol
0701デフォルトの名無しさん2007/10/10(水) 00:34:30
int main(){
char hex[256];
int dec=0 , i;

printf("hex?>");
fgets(hex,256,stdin);

for(i=0; hex[i] != '\n' && hex[i] != '\0'; i++){
dec *= 16;
if(hex[i] >= '0' && hex[i] <= '9') dec += hex[i]-'0';
else if(hex[i] >= 'a' && hex[i] <= 'f') dec += 10 + hex[i] - 'a';
else if(hex[i] >= 'A' && hex[i] <= 'F') dec += 10 + hex[i] - 'A';
else break;
}

printf("%s->%d" , hex , dec);
return 0;
}
0702デフォルトの名無しさん2007/10/10(水) 00:35:41
>>700-701
ありがとうございます
0703デフォルトの名無しさん2007/10/10(水) 01:07:07
共用体ってなにが便利なのか全然分かりません

07046912007/10/10(水) 01:43:20
>>698
あ、ほんとですね
√16とか

iをsqrt(x)から始めて減らしてくか、
インクリメントするのに条件を設けるか……

ありがとうございます
0705デフォルトの名無しさん2007/10/10(水) 01:56:05
if(!x[1]%(i*i)) を while(!(x[1]%(i*i))) にすればok
0706デフォルトの名無しさん2007/10/10(水) 09:49:47
>>702
int n;
sscanf("0012F", "%x", &n);;
0707デフォルトの名無しさん2007/10/10(水) 10:22:34
scanfってなんで使っちゃだめなの?
0708デフォルトの名無しさん2007/10/10(水) 10:29:44
>>707
使っていいですよ
0709hj2007/10/10(水) 13:50:32
【政治】政府、"お金をつくる"造幣局や印刷局など独立法人20以上を民営化へ−機密性の保持も絡み様々な意見も★

4
http://news22.2ch.net/test/read.cgi/newsplus/1191932873/

【民営化】造幣局・印刷局など、独立行政法人20以上を民営化へ:政府方針 [07/10/07]
http://news21.2ch.net/test/read.cgi/bizplus/1191727281/


政府は6日、現在進めている独立行政法人(独法)の整理合理化に関連し、
101ある独法のうち、予算に占める国からの財政支出の割合(財政依存度)が低い
20法人以上の民営化を目指す方針を固めた。

2007年末に整理合理化計画を策定し、閣議決定する予定だ。
民営化の対象には、造幣局や国立印刷局、日本万国博覧会記念機構などがあがっている。
今後、独法の民営化推進を目指す渡辺行政改革相らの方針に対し、
事業の公共性の高さなどを主張する関係省庁の巻き返しが本格化しそうだ。

貨幣や紙幣を造る造幣局や国立印刷局については、機密性の保持なども絡み、
是非をめぐって様々な意見が出そうだ。

http://headlines.yahoo.co.jp/hl?a=20071007-00000002-yom-pol
0710デフォルトの名無しさん2007/10/10(水) 18:45:27
『各辺が確率的に結ばれるグラフ(ランダムグラフ)を
 確率ごとに100個ずつ作りファイルに入れる』
という課題がでました。誰か助けて下さい
0711デフォルトの名無しさん2007/10/10(水) 18:55:01
そんなことより鼻くそがめちゃくちゃ硬くて無理やりとったら
めっちゃ鼻血が出てきたんだがどうすればいい?
0712デフォルトの名無しさん2007/10/10(水) 18:56:50
>>711
鼻血が出ているスレッドに対して TerminateThread でおk
0713デフォルトの名無しさん2007/10/10(水) 18:57:04
ファイルにパッチを当てるプログラムを作ったのですが、うまく動きません。
指定と全く違うデータがファイルの先頭に入るだけで終わってしまいます。どこがいけないのでしょう?

パッチの書式は アドレス:データ です。例えば
00000001:FF34AB
0000F:35
のように、アドレス先頭のゼロの連続は無視、データ長はほぼ自由で、
指定したアドレスから順にデータを書き込んでいく、という感じです。

ソースをアップロードしたので、見ていただけませんでしょうか。
http://ranobe.com/up/src/up229162.txt
0714デフォルトの名無しさん2007/10/10(水) 18:59:13
>>713
ソースコードの文字コードがShift-JIS → MS-Windows

おそらく fopen の時に バイナリモード で開いていないのが原因
07157142007/10/10(水) 19:02:28
ごめん 嘘でした orz
0716デフォルトの名無しさん2007/10/10(水) 19:06:03
>>713
適当にざっと見ただけだが、

>sprintf(data_numtemp,"%lb",data_num);

%lb って何?

>fwrite(data_numtemp,sizeof(data_numtemp),1,fp_src);

sizeof(data_numtemp) って BUF_MAX のことだと思うんだが
0717デフォルトの名無しさん2007/10/10(水) 19:21:25
>%lb って何?
long型の2進数になるかと思ったんですが、この書き方は変でしたか。
でも%bに直してもバグは変わらず…

>sizeof(data_numtemp) って BUF_MAX のことだと思うんだが
sizeof(data[count])に直してみましたが、それでもまだバグは変わらず…
07187142007/10/10(水) 19:28:10
>>717
勉強の邪魔になるならやめるけど
お詫びに作ってみたけど見てみる?
0719デフォルトの名無しさん2007/10/10(水) 19:30:44
>>718
邪魔だなんてとんでもないです。
普通はどうやって実現するのか気になるので、是非見せてください
07207142007/10/10(水) 19:31:36
>>719
#include<stdio.h>

int exec_patch(FILE *fp_dest, FILE *fp_patch){
unsigned long address_num;
int value;
char buf[2+1];

while(1){
if(fscanf(fp_patch, "%lx%1[:]", &address_num, buf)!=2) break;
fseek(fp_dest, address_num, SEEK_SET);
while(fscanf(fp_patch, "%2[0-9A-Fa-f]", buf)==1){
if(buf[1]=='\0') return 0;
sscanf(buf, "%x", &value);
fputc(value, fp_dest);
}
}
return feof(fp_patch);
}

int main(void){
FILE *dest, *patch;

dest=fopen("src.dat", "r+b");
patch=fopen("patch.dat", "r");
if(dest==NULL || patch==NULL) return 1;
if(!exec_patch(dest, patch)) fprintf(stderr, "\nError: patch failed.\n");

return 0;
}
0721デフォルトの名無しさん2007/10/10(水) 19:59:08
>>692
どうでもいいがひどい教科書だな。
その文章なら動くかもしれんが、下位バイトに00が入る文字を含んだ途端尻切れ確定。
0722デフォルトの名無しさん2007/10/10(水) 19:59:19
>>713
82行目
>if(file_patchdata_line[count][last] = '\n') file_patchdata_line[count][last] = '\0';
== の間違い?

124行目
>sprintf(data_numtemp,"%lb",data_num);
???

文字列 address および data の最後に '\0' が無い
0723デフォルトの名無しさん2007/10/10(水) 20:24:11
%5.1f の5.1ってどういう意味ですか?
0724デフォルトの名無しさん2007/10/10(水) 20:25:01
小数点の左側が五桁、右が一桁。
0725デフォルトの名無しさん2007/10/10(水) 20:25:11
>>720
変換指定子ってそんなに細かい使い方ができるんですね。
fscanfと組み合わせるといろいろ応用が効きそうです。ありがとうございます

>>722
=='\n'に直して、%lbは%bにしました。
また、count--の前に
address[count][last + 1] = '\0';
data[count][last - lasttemp + 1] = '\0';
をそれぞれ追加しました。
しかし一向に改善してくれません。一体どこが問題なのでしょう…?
0726デフォルトの名無しさん2007/10/10(水) 20:45:49
>>725
sprintfに%bなんて変換指定子は存在しない。
0727デフォルトの名無しさん2007/10/10(水) 20:46:04
Cのprintfに%bなんかないっちゅうねん。
07287232007/10/10(水) 20:50:13
>>724
ありがとうございます
0729デフォルトの名無しさん2007/10/10(水) 20:54:41
>>725
>>713 のソースコードを次のように変更したらいけたっぽい

82c82
< if(file_patchdata_line[count][last] = '\n') file_patchdata_line[count][last] = '\0';
---
> if(file_patchdata_line[count][last] == '\n') file_patchdata_line[count][last] = '\0';
96a97
> address[count][last] = '\0';
111a113
> data[count][last - lasttemp] = '\0';
122,124d123
< /* データを2進数の文字列に変換 */
< data_num = strtoul(data[count],NULL,16);
< sprintf(data_numtemp,"%lb",data_num);
125a125,134
> {
> int i, value;
> /* 16進数文字列を対応するデータ列に変換 */
> for(i=0,data_num=0;data[count][i]!='\0' && data[count][i+1]!='\0';i+=2)
> {
> sscanf(&data[count][i], "%2x", &value);
> data_numtemp[data_num++]=value;
> }
> }
>
127c136
< fwrite(data_numtemp,sizeof(data_numtemp),1,fp_src);
---
> fwrite(data_numtemp,data_num,1,fp_src);
0730デフォルトの名無しさん2007/10/10(水) 21:09:59
>>729
おお、すごい!ちゃんと指定したデータが書き込まれるようになりました。
ただアドレスにA〜Fが無い場合は動作しないようで、ファイル先頭が少し変ですが、かなりの進歩です。
どうもありがとうございます。
0731デフォルトの名無しさん2007/10/10(水) 21:42:02
VisialCで実行した時に出力結果といっしょに
フフフフフフフとか』とか出てくるのはどこがおかしいからですか?
0732デフォルトの名無しさん2007/10/10(水) 21:43:48
>>731
デバッグビルドだからです
リリースビルドなら不定です
0733デフォルトの名無しさん2007/10/10(水) 21:47:34
>>731
"それが期待した動作ならそれでいいんじゃないかな\0"
0734デフォルトの名無しさん2007/10/11(木) 00:32:43
float変数の整数部のみをBYTE変数に高速にコピーするにはどうすれば良いでしょうか?

float a;
BYTE b;

a = 何かしらの浮動小数点演算;
b = a;  ←このコピーが非常に遅い

0735デフォルトの名無しさん2007/10/11(木) 00:41:12
>>734
BYTEが整数型であるという前提で。
実数を整数にする(=整数部を取り出す)処理はどうしても時間が掛かる。
しかし、今時のCPUなら問題になるほどではないと思うのだが。
そこでポイントは、「そこがボトルネックになっているのか?」と
「どうしても高速化したいならその周辺も含めて考えるべき」ということ。
0736デフォルトの名無しさん2007/10/11(木) 00:42:56
>>734
速いPCに買い換える
0737デフォルトの名無しさん2007/10/11(木) 00:52:25
アドバイス有り難うございます。

BYTE型はunsigned charで整数型です。
動画(VGA)を表示するソフトを作っているのですが、
実数から整数へのコピーがない場合には画面のフレームレートで約45fpsでています。
これが実数から整数へのコピーがあると23fps程度まで一気に落ちてしまいます。
ですのでこの部分がボトルネックである事は間違いありません。
1画素辺りRGBの3回のコピーが必要で、これが一画面分となると922K回コピーが発生する計算になります。

float変数の整数部を直接参照できないかなぁとか考えているのですが無理なんでしょうか?

0738デフォルトの名無しさん2007/10/11(木) 01:01:55
それなら固定小数点数使うしかないね
0739デフォルトの名無しさん2007/10/11(木) 01:11:49
>>737
>float変数の整数部を直接参照

整数部って。 指数部と仮数部と符号しかないよ。
http://ja.wikipedia.org/wiki/IEEE_754

処理系依存で直接各ビットを参照してむにゃむにゃすれば整数値を取り出せるとは思うけど、速いかどうかは知らない。
0740デフォルトの名無しさん2007/10/11(木) 01:18:26
c言語覚え初めて3日目です。

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

int main(void)
{
char namae[256],namae1[] = "arashi",namae2[] = "arasi",namae3[] = "Arashi",namae4[] = "Arasi",namae5[] = "ARASHI",namae6[] = "ARASI";


printf("お名前を教えてください:");
scanf("%s",namae);

if ((strcmp(namae,namae1)==0)||(strcmp(namae,namae2)==0)||(strcmp(namae,namae3)==0)||(strcmp(namae,namae4)==0)||(strcmp(namae,namae5)==0)||(strcmp(namae,namae6)==0)) {
printf("%sアホ\n",namae);
} else {
printf("%s様天才\n",namae);
}

return 0;
}
0741デフォルトの名無しさん2007/10/11(木) 01:19:13
もっとコンパクトに書けないでしょうか?
0742デフォルトの名無しさん2007/10/11(木) 01:22:13
C++とそのライブラリであるSTLとboostを使ってください
0743デフォルトの名無しさん2007/10/11(木) 01:24:14
>>740
配列を使うか、内部的には小文字で比較するかすれば?

ANSI標準でなくていいならstrcasecmp()とかあるが?
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strcasecmp.3.html
07447402007/10/11(木) 01:27:27
ありがとうございます。
大昔、小学生時代にBASICちょっとだけ触って以来のプログラム勉強です。
こんにちはマイコンに740と同じようなプログラムがあったように思うので、練習に書いてみました。
0745デフォルトの名無しさん2007/10/11(木) 01:35:19
>>740
少しはスマートかな?
#include <stdio.h>
#include <string.h>
int main(void) {
    char name[256], *names[] = {"arashi", "arasi", "Arashi", "Arasi", "ARASHI", "ARASI"};
    int i;
    printf("お名前を教えてください:"); scanf("%s", name);
    for (i = 0; i < sizeof(names) / sizeof(names[0]); i++)
        if (!strcmp(name, names[i])) {
            printf("%sアホ\n", name);
            return 0;
        }
    printf("%s様天才\n", name);
    return 0;
}
07467402007/10/11(木) 01:41:46
どうもありがとうございます。
もっと勉強します。
0747デフォルトの名無しさん2007/10/11(木) 02:37:19
>>737
普通に考えて、「何かしらの浮動小数点演算」の方が「整数部の抽出」より遅いと思うのだが。
そうでないとしたら、「何かしらの浮動小数点演算」を(整数化するとか)なにか考えた方がいい。
例えば、値域が限定できるのなら固定小数点数として演算するとか。

>>739
今時のCPUなら変換処理をCPU内部で行える筈。それより速く抽出できるとは考えにくい。
0748デフォルトの名無しさん2007/10/11(木) 02:49:41
>>740
入力文字列を小文字変換して、
arashi,arasiと比較すればいい
0749デフォルトの名無しさん2007/10/11(木) 03:59:37
>>734
基本的にfloat型はdouble型より遅い。
最近のCPU内部では結局double型に逐次変換して処理を行ってるから、その分がオーバーヘッドになる。
特に理由が無いのならfloatはやめてdoubleにすればいい。
0750デフォルトの名無しさん2007/10/11(木) 05:38:28
今だにそれを信じてる人が居るのか
0751デフォルトの名無しさん2007/10/11(木) 07:08:12
グラフィックでfloatが使われるのは精度が求められないこと、メモリの節約、SIMDとの相性の良さ、
グラフィックライブラリやハードがfloat前提の設計になっているなどの理由かな。

byteじゃなくてlongへの変換だけどちょっと作ってみた。遅そうだ(笑
long hage(float f) {
  long *b = (long *) &f;
  int sign = (*b >> 31) & 0x00000001;
  int exp = (*b >> 23) & 0x000000ff;
  long frac = *b & 0x007fffff;
  if ((exp == 0) && (frac == 0)) return 0;
  if (exp == 0) return 0; // 非正規化数
  if (exp == 255) return -1; // 無限大 NaN
  // 正規化数
  char tmp = (exp - 127 - 23) & 0x0ff;
  exp = tmp; // 符号拡張
  frac |= 0x00800000;
  if (exp > 0) frac <<= exp;
  else frac >>= -exp;
  if (sign) frac = -frac;
  return frac;
}
■ このスレッドは過去ログ倉庫に格納されています