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


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

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



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

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

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

49 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:34:58 ]
>>47
そうだよな…ありがとう
でもググッてみてもいじり方がよくわからないんだ
何十回も変更してみたけど駄目だった
もうちょっと頑張ってみる

>>48
ありがとう
それも試してみる


50 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:36:58 ]
どうみても48が一番時間かかるとおもうけど

51 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:55:13 ]
>>46が真実

52 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 03:43:10 ]
@rem gcc.bat
@echo off
del /F /Q %*

53 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 03:44:27 ]
>>49
もしかしてUNIXバイナリをWindowsに持って来て動かそうとしてないか?
Windowsネイティブでgcc動かすのは結構敷居が高いぞ?
おとなしくCygwin使うか、Windows限定で良いならMSVC++2005Expressやbccのほうがラク。

54 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 11:06:11 ]
>>29
>floatの計算はdoubleに変換される 計算後元に戻すから鈍い
>>38
>Cには暗黙の昇格ルールというものがあってだな。float=float+floatはfloadt=(float)((double)float+(double)float)なのよ。
真っ赤な嘘乙。
整数型の場合と違って、実数型は(c89ですら)単精度同士の演算が認められている。

>>34
>floatの方がSSEの最適化が効く
常にそうではないが、可能性が高いとはいえるね。

>37
>C言語の浮動小数点はライブラリの関数がすべてdoubleで
>かかれているという罠があるのは有名な話だな……
C99にはmath.hの全ての関数にfloat版が用意されている。そのお蔭か、本来ない筈のC++でも使えることが多い。
>Cのfloatは遅いという話の出所。
いや、藤原の翁によると、あくまで関数は副次的としていて、実数演算がdoubleで実装されているのが理由だとしているようだ。

55 名前:デフォルトの名無しさん [2007/10/16(火) 12:10:15 ]
セレロンだがfloatが速い

#include<stdio.h>
#include<time.h>
#define N 50000000
floatloop(){
int i,c=clock();float r=1.0;
for( i=0 ; i<N ; i++ ){r *= 2.5;r/=2.5;r+=1.001;r-=1.001;}
c=clock()-c;printf( "float %dmsec value %f\n", c ,r);}


doubleloop(){
int i,c=clock();double r=1.0;
for( i=0 ; i<N ; i++ ){r *= 2.5;r/=2.5;r+=1.001;r-=1.001;}
c=clock()-c;printf( "double %dmsec value %f\n", c, r);}

main(){ floatloop();doubleloop();}

56 名前:デフォルトの名無しさん [2007/10/16(火) 12:16:41 ]
math.hもfloatの方が速い

#include<stdio.h>
#include<time.h>
#include<math.h>
#define N 5000000
floatloop(){
int i,c=clock();float r=10.0;
for( i=0 ; i<N ; i++ ){r=log(r);r=exp(r);r=pow(r,2);r=sqrt(r);}
c=clock()-c;printf( "float %dmsec value %f\n", c ,r);}

doubleloop(){
int i,c=clock();double r=10.0;
for( i=0 ; i<N ; i++ ){r=log(r);r=exp(r);r=pow(r,2);r=sqrt(r);}
c=clock()-c;printf( "double %dmsec value %f\n", c, r);}

main(){ floatloop();doubleloop();}

57 名前:デフォルトの名無しさん [2007/10/16(火) 12:19:16 ]
CPUでハードウェア的に計算可能なのはdoubleだときいた だからfloatは鈍いと 違うのか



58 名前:デフォルトの名無しさん [2007/10/16(火) 12:21:45 ]
ハードウェアとして浮動小数点演算が組み込まれているはずだ
すると今のCPUは、doubleもfloatも入っているのか?

59 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 12:42:15 ]
>>55
素朴な疑問だが、最適化掛けるとループの中身が消えそうだがコンパイラとオプションは?
# まぁ、floatが速いと言うことには同意だが。

>>56
うーん、こっちは辻褄が合わないなあ。コンパイラとオプションはどうなっている?
# 関数を適切に呼び出しているなら、float ⇔ doubleの変換が頻繁に入るから遅くなる筈なんだ。

>>57
大丈夫、今時のCPUはfloatでも計算可能だ。

>>58
そそ、そういうこと。
実際、加減算、乗算は速度的にビット幅は余り影響しない。まして除算はビット幅が広いほど確実に遅くなる。

60 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:08:44 ]
一つ発見。>56をgccでコンパイルしたら、log()ではなくlogf()、exp()ではなくexpf()を呼び出していたよ。
それならそれで、floatの方が速いのも納得。尤も、初期のXeonでは有意差が得られなかったけれど。
# gcc(3.4.6)使用。オプションは -O3 -msse2 -lm、-msse2は事実上影響なかった。

61 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:04:37 ]
C言語を勉強しようと思ってるんですけど、
普通のエディタじゃできないんですか?
コンパイラがよく分からなくて何かできないんですけど。

62 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:08:19 ]
>>61
コードを書くだけならどんなエディタでも構わないと言えば構わない。
コンパイラにVisualStudioのような統合環境を使うのなら、ビルトインのエディタを使うのが無難だと思う。
コンパイラにbccやlsicを使うのはよした方がいい。
コンパイラにgccを使うのならコマンドライン環境そのものの使い方にも慣れる必要がある。

まぁもっとも、一部の天才のように読むだけで勉強できるのならエディタもコンパイラも要らないわけだが。

63 名前:デフォルトの名無しさん [2007/10/16(火) 14:09:09 ]
普通のエディタでかける
でも初心者は、BCC developerつかっとけ

64 名前:BCC Developer導入法 [2007/10/16(火) 14:15:01 ]
BCC Developer導入法
www.codegear.com/jp/downloads/free/cppbuilder
へ行って
Borland C++Compiler / Turbo Debugger  Windows  5.5  8.85 MB
をクリックして、必要事項を記入してファイルを落とす

落としたら、メールで送られてきたパスワードを入力してインストールする
デバッガをインストールするときのパスワードは ReadmeInstall.txt に書いてある

つぎに BCC Developerをインストールする 下をダウンロードする
www.vector.co.jp/soft/dl/win95/prog/se180695.html
www.cmagazine.jp/download/setbcc15b.exe


解凍したフォルダをbccdevに名前を変更して、C:\borlandへ移動する
一方でsetbcc.exeを起動して、すすむを5回押して設定を押す
その後、C:\borland\をbccdev\BccDev.exeを起動して

コンパイラ C:\borland\bcc55\Bin\bcc32.exe
デバッガ C:\borland\bcc55\Bin\TD32.EXE

を入力して設定ボタンを押す

ファイル→新規作成 を選んで、ディレクトリは、C:\borland\bccdev、プロジェクト名はtestとしokボタンを押す
再び、ファイル→新規作成 を選び、ファイル名のところへhello.cppを入力してokボタン

#include<stdio.h>
int main( ){
printf( "Hello world!\n" );
return 0;}
をコピペして、プロジェクト→メイクしてMake End!!が出ればコンパイル成功
次に実行→実行してHello world!がDOS画面に出れば成功

65 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:26:23 ]
今MKEditorを使ってるんですけど、
これじゃできませんか?

66 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:27:24 ]
それとBCC Developerって無料ですか?

67 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:29:28 ]
>>66
>62は無視ですか?



68 名前:デフォルトの名無しさん [2007/10/16(火) 14:32:08 ]
MKEditorで書けるが、コンパイルは自分でやる必要あり
BCC Developerは無料で簡単

69 名前:デフォルトの名無しさん [2007/10/16(火) 14:34:09 ]
BCC Developerなら、今ならの導入でわからないところを教えてやるよ

70 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:40:53 ]
>>67
すみません、よく分からなくて。


71 名前:デフォルトの名無しさん [2007/10/16(火) 14:41:45 ]
とりあえず >>64 をやってみ

72 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:42:33 ]
どうしてもBCCDeveloperを勧めたい香具師がいるらしいから、一緒に地獄に落ちておけばいいと思うよ。

73 名前:デフォルトの名無しさん [2007/10/16(火) 14:46:26 ]
じゃあどれか良くて、BCCDE

74 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:46:57 ]
www.sgnet.co.jp/c/
このサイトの勉強をしたいんですけど。
できますか?

75 名前:デフォルトの名無しさん [2007/10/16(火) 14:46:59 ]
じゃあどれか良くて、BCCDevloperのどこが悪い?

76 名前:デフォルトの名無しさん [2007/10/16(火) 14:49:16 ]
>>74
BCC Developerでできるが、そのサイトは勉強にむいていない 質が良くない

77 名前:デフォルトの名無しさん [2007/10/16(火) 15:04:36 ]
ここは初心者向きの勉強サイト ある程度わかったらSTLへ進むと良い

hp.vector.co.jp/authors/VA001944/c-begin/text01.html
effy.ldw.jp/c/index.html



78 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 15:08:28 ]
>>74
できますか?って…自分の頭のことを他人に聞くなよw

79 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 15:12:38 ]
まずはBCC Developerをダウンロードすればいいんですよね?

80 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 15:12:42 ]
>>77
後者は兎も角、前者はLSI-C86を使っている時点でアナクロに過ぎると思う。

81 名前:デフォルトの名無しさん [2007/10/16(火) 15:13:29 ]
>>79  >>64の順序どおりにやってみて

82 名前:デフォルトの名無しさん [2007/10/16(火) 15:14:56 ]
>>80  そこは見なかったことにすれば初心者向き

83 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 15:15:35 ]
わかりました。
皆さんありがとうございます。

84 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 15:23:01 ]
>74のサイトは他のスレでダメ出しされていた。
私も間違いを指摘するメールを出したが改めるどころか返事もなかった。

85 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 16:06:18 ]
>>54
C++でもISO/IEC 14882:2003 (X3014:2003)では、
float版とlong double版がdouble版の関数名で多重定義されている。
ほげfとかほげlみたいな関数はないことになっているだろうけど。

86 名前:デフォルトの名無しさん [2007/10/16(火) 16:35:58 ]
[1] 授業単元:プログラミング2(C言語)
[2] 問題文(含コード&リンク):マージソート
merge(data1,n1,data2,n2,data3)を使い,merge_sort(data1,n,data2)を作成せよ。
関数の再帰的定義(?)というものを使って作成するみたいです。注:nへはdata1の要素数(整数型)を代入する。
注:data2はdata1を整列した配列とする。
用意された整数値データ int data[20]={9,10,8,7,6,20,-4,8,9,11,5,15,-7,12,23,3,24,-11,30,6}
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:? 学校ではktermでcc [ファイル名]とやっています
 [3.3] 言語:C
[4] 期限: ([200?年10月17日24:00まで]
[5] その他の制限:merge()は自分で作りました。
#define N 10
void merge(int data1[], int n1, int data2[], int n2, int data3[]){
int index1, index2, index3, i;
index1 = index2 = index3 = 0;
while(index1 < n1 || index2 < n2){
if(index1 < n1 && index2 < n2){
(data1[index1] >= data2[index2])?(data3[index3++] = data1[index1++])
:(data3[index3++]=data2[index2++]);
for (i=0; i<(2*N) ;i++)
printf("%d,", data3[i]);
printf("\n");}
else if(index1 < n1){
for (;index1 < n1 ;index1++)
data3[index3++] = data1[index1]; }
else {for( ; index2 < n2 ; index2++)
{data3[index3++] = data2[index2];}}
}
}

87 名前:デフォルトの名無しさん [2007/10/16(火) 16:39:32 ]
自力で頑張ろうとしてたんですがどうしてもうまくできません。。
提出期限は明日までですが、ここまで頑張ったならしっかり理解して終わりたいです。
期限すぎてからでもいいのでどなたかお願いします。。
コンパイルエラーが出るので使えませんが一応自分の作り書けたものも載せておきます。
もし構想みたいなのはよければどこがダメなのか教えてもらえれば明日頑張って続き作ります><
void merge_sort(int data1, int n, int data2)
{
int i,j, cut = n / 2;

if ( cut > 0 ){

int samp_left[cut],samp_right[n - cut];

for( i = 0 ; i < cut ; i++)
samp_left[i] = data1[i];

for( i = cut ; i > n ; i++ )
samp_right[i]=data1[i];
if( n != 2 ){
merge_sort(samp_left,cut,data2);
merge_sort(samp_right,n - cut ,data2);
}
}

merge(samp_left,cut,samp_right,(n - cut),data2);
}



88 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 16:55:17 ]

C/C++の宿題を片付けます 97代目
pc11.2ch.net/test/read.cgi/tech/1191937213/l50


89 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 17:27:20 ]
>>87
とりあえずぱっと見ておかしいところ……

>void merge_sort(int data1, int n, int data2)
data1とdata2は配列だから、int data1[]とかint *data2とかやらないと。

>for( i = cut ; i > n ; i++ )
継続条件の不等号が逆だと思う
>samp_right[i]=data1[i];
iがcutから始まってるから、samp_rightの添え字がずれちゃうね
足し引きして調整しないと
>meege_sort(samp_left,cut,data2);
>merge_sort(samp_right,n - cut ,data2);
merge_sortの第三引数は結果を受け取る変数だから、
双方ともにdata2に受け取ったら上書きされちゃうと思う。
meege_sort(samp_left,cut,samp_left);みたいにして同じ配列で受け取るか、
sorted_leftとかの配列を新たに宣言して、それを第三引数に指定すべき。

>merge(samp_left,cut,samp_right,(n - cut),data2);
もしsorted_leftとかを新たに作るんだったら、ここの引数も直す
そうでないならこのままでいい

大筋としては特に考え方が間違ったりはしてないと思うよ
今は携帯だからこれ以上無理


>>88
丸投げしたいわけでもないみたいだし、いんじゃね
何で宿題スレのテンプレ使ってるのか知らんけど

90 名前:デフォルトの名無しさん [2007/10/16(火) 17:33:35 ]
汎用性を重視しているのですが、DLLを使う場合に一般的なのは、
LIBファイルを使って最初からリンクしてしまうパターンでしょうか?
それともLoadLibraryで随時リンクするパターンでしょうか?

91 名前:89 mailto:sage [2007/10/16(火) 17:37:31 ]
あ、書き忘れ

cut==0のとき(n==1のとき)、samp_leftとかが宣言されてないからmerge関数を呼び出すとこでエラーが出る
とりあえずの対処法としては、mergeをifブロックに押し込んで、
n==1 (cut==0)の時はdata2にそのままデータを入れる

92 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 17:38:22 ]
>>90
スタティックリンクだとDLLのバージョンで悩まなくて済む

93 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 17:44:33 ]
てか宣言されていないとか以前の問題か
スコープが……

94 名前:デフォルトの名無しさん [2007/10/16(火) 17:57:32 ]
VCExpress2008Beta2で以下のような最小Winプログラムを実行しようとしたのですが、
ビルドに失敗してしまいます。何故なのでしょうか?

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
return 0;
}


エラー 1 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup  MSVCRTD.lib
エラー 2 fatal error LNK1120: 1 unresolved externals C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\test\Debug\test.exe


95 名前:デフォルトの名無しさん [2007/10/16(火) 18:01:43 ]
>>94
Windowsアプリを作るなら、コンパイルオプション設定する必要があるんじゃないか。
VCは知らんが、例えばBorlandなら「-W」とか。

96 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 18:05:53 ]
>>95
プロジェクトの設定を変えたら動きました。ありがとうございます

97 名前:デフォルトの名無しさん [2007/10/16(火) 18:23:12 ]
なんてスレ違いのやつなんだ



98 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 20:02:52 ]
>>87

marge関数内ではdata1[],data2[]は読み込みしかしていないから
>merge_sort(samp_left,cut,data2);
>merge_sort(samp_right,n - cut ,data2);

merge_sort(data1,cut,samp_left);
merge_sort(data1 + cut,n - cut ,samp_right);
としてもいいと思う。
(merge関数がブラックボックスなら宣言にconstついてない時点で却下だけど)

あとC言語だと配列宣言時の要素数指定に変数が使えないから
>int samp_left[cut],samp_right[n - cut];
はだめだと(C++では通ってしまう)
int *samp_left,*samp_right;
samp_left = malloc(cut*sizeofint));
samp_right = malloc((n-cut)*sizeofint));
として当然merge呼び出した後
free(samp_left);free(samp_right);
とする。

99 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 22:57:09 ]
INT_MAX + 1 とすると、オーバーフローを起こすのですが
INT_MAX + 1.0 にすると、2147483648.000000 と出て、エラーが出ません。

double型はどこまで値を扱えるのか誰か教えてくださいませんか?

100 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 22:58:10 ]
struct node{
 T data;
 node *left;
 node *right;
};

void deletetree(node *t){
 if(t==NULL)return;
 deletetree(t->left);
 deletetree(t->right);
 delete t;
}

void deletetree(node *t){
 node *route[1024];
 node *p,q;
 int n=0;
 for(p=t;){
  while(q=t->left;q!=NULL;q=q->left){route[n]=p;n++}

  delete p;
  
 }
}


101 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 22:58:54 ]
ごめんなさい誤爆しました

102 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 23:08:42 ]
>>99
DBL_MAX まで
DBL_MAX は float.h で定義されている

103 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 23:29:39 ]
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458
953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304
583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000

こんな数が得られましたw
ありがとうございます

104 名前:デフォルトの名無しさん [2007/10/17(水) 03:18:10 ]
あるコンパイラで作ったC言語のライブラリを
別のコンパイラから利用できることってあるんですか?

105 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 03:21:06 ]
あります

106 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 03:28:42 ]
ありがとうございました。

107 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 05:49:34 ]
XP使ってるんですが、どうもコンパイラをうまく設定できません。
LSI C-86というのの設定がわからず、Borland C++ Compiler 5.5 ってのも
落とせるところのリンクが死んでます・・・手っ取り早くコンパイルするにはどうすればいいでしょうか



108 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 07:38:10 ]
>>107
www.forest.impress.co.jp/lib/stdy/program/progdevenv/
VC2005ExpressかTurboC++ExpressをDLすればよし。どちらもコマンドラインでコンパイル可能。


109 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 08:40:31 ]
>>107
Borland C++Compiler 5.5
www.borland.com/jp/products/cbuilder/freecompiler.html

ここのダウンロード、まったく反応ありませんね〜。
昨日からC言語をはじめた者ですが、どこかにミラーサーバ
ありませんか??

110 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 08:53:02 ]
>>109
ttp://www.codegear.com/jp/downloads/free/cppbuilder

111 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 13:41:44 ]
うーんBorland C++Compiler 5.5って落とせたけどコンパイル、実行の仕方がわからない・・・
インストールしても実行ファイルがなくてどうすればいいのやら

112 名前:BCCはこれよめ [2007/10/17(水) 14:02:15 ]
BCC Developer導入法
www.codegear.com/jp/downloads/free/cppbuilder
へ行って
Borland C++Compiler / Turbo Debugger  Windows  5.5  8.85 MB
をクリックして、必要事項を記入してファイルを落とす

落としたら、メールで送られてきたパスワードを入力してインストールする
デバッガをインストールするときのパスワードは ReadmeInstall.txt に書いてある

つぎに BCC Developerをインストールする 下をダウンロードする
www.vector.co.jp/soft/dl/win95/prog/se180695.html
www.cmagazine.jp/download/setbcc15b.exe


解凍したフォルダをbccdevに名前を変更して、C:\borlandへ移動する
一方でsetbcc.exeを起動して、すすむを5回押して設定を押す
その後、C:\borland\をbccdev\BccDev.exeを起動して

コンパイラ C:\borland\bcc55\Bin\bcc32.exe
デバッガ C:\borland\bcc55\Bin\TD32.EXE

を入力して設定ボタンを押す

ファイル→新規作成 を選んで、ディレクトリは、C:\borland\bccdev、プロジェクト名はtestとしokボタンを押す
再び、ファイル→新規作成 を選び、ファイル名のところへhello.cppを入力してokボタン

#include<stdio.h>
int main( ){
printf( "Hello world!\n" );
return 0;}
をコピペして、プロジェクト→メイクしてMake End!!が出ればコンパイル成功
次に実行→実行してHello world!がDOS画面に出れば成功

113 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 14:09:45 ]
入門編ってのはあくまでC言語の入門であってPC入門じゃない
コンパイラ自体はただのソフトなんだからそれぐらい自分で解決できるようになっておけ

114 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 15:37:49 ]
>>110
ありがとうございました!

無事Win95で起動させました!
このPCの余生の用途が決まりました。


115 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 15:50:58 ]
>>111
実行ファイルが無いって……
インストール先をちゃんと見てみたのか?

116 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 15:52:05 ]
というか別に実行ファイルを探す必要は無いんだよ
PATHを通せば

117 名前:998 [2007/10/17(水) 19:19:02 ]
前スレでfopenでセグメンテーション違反が出て、
ポインタの取り扱いミスとの指摘を受けたものです。
ポインタ勉強したのですが、イマイチ分かりません。
数値計算用プログラムで配列の要素をかなりたくさん使っているのですが、
それも原因として挙げられますか?



118 名前:デフォルトの名無しさん [2007/10/17(水) 19:20:13 ]
質問させてください
数字、文字、それ以外の1つの文字列を入力し入力後に
その文字列を数字、文字、それ以外の各配列に分けそれぞれの内容を
表示するプログラムなのですが

int i, suji_cnt = 0, moji_cnt = 0 ,kigou_cnt =0;
char str[NUM],suji[NUM],moji[NUM],kigou[NUM];

printf("Input:");
scanf("%s",&str);

for(i=0; str[i] != '\0';i++){
if(str[i]>='0' && str[i]<='9'){
suji[suji_cnt++] = str[i];
}
else if(str[i]>='a' && str[i]<='z'){
moji[moji_cnt++] = str[i];
}
else{
  kigou[kigou_cnt++] = str[i];
}
}
printf("数字: %s Input Length : %d\n", suji,suji_cnt);
printf("文字: %s Input Length : %d\n", moji,moji_cnt);
printf("それ以外: %s Input Length : %d\n", kigou,kigou_cnt);

return 0;
}
と書くと表示されるとき最後のほうで変な記号?
みたいなものも表示されるのですがどこがおかしいのでしょうか?
よろしくお願いします。

119 名前:デフォルトの名無しさん [2007/10/17(水) 19:22:56 ]
数値の符号を反転させるにはどうしたらいいですか?

120 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 19:30:34 ]
>>118
文字列を'\0'で終わらせてないから。

121 名前:119 mailto:sage [2007/10/17(水) 19:33:10 ]
すみませんつけたしです。

反転の他に、(+)にする、(-)にする方法もあれば教えて頂きたいです。
数値は signed前提です。

122 名前:119 mailto:sage [2007/10/17(水) 19:42:44 ]
連投すみません。

なんとか解決できたかも知れません。
符号を反転させるには、
x *= -1;
でき、
if( x < 0){
x *= -1;
}
------------
if( x > 0){
x *= -1;
}
で、できそうです。

もっとスマートな方法があれば教えて頂きたいです。
よろしくお願いします。

123 名前:デフォルトの名無しさん [2007/10/17(水) 19:43:33 ]
>>120
ありがとうございます。
解決できました。

124 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 19:51:30 ]
符号をプラスにするなら
x = x * x / x;
とかでできるんでない?多分

125 名前:124 mailto:sage [2007/10/17(水) 19:52:50 ]
やべ、何言ってんだ俺w
今の無しにしてorz

126 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 19:56:38 ]
>>117
ソースうp!

127 名前:124 mailto:sage [2007/10/17(水) 19:58:37 ]
改めて……

>>122
x = -x;



128 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 19:59:27 ]
>>119
数値計算の速度がシビアじゃないところなら >>122 よりも
x=-x;
x=abs(x);
x=-abs(x);
が分かりやすい (オレはね)

129 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:08:56 ]
高速さがシビアに要求されるなら、
むしろ乗算を使わない128のほうが速い気がする。

130 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:11:47 ]
誰か測れ

131 名前:デフォルトの名無しさん [2007/10/17(水) 20:18:07 ]
#include <iostream>
#include <time.h>
#include <math.h>
#define N 500000000
using namespace std;

f0(){int x=10,n,c;
c=clock();for(n=0;n<N;n++)x=-x;c=clock()-c;
cout << x<<" "<<c<<endl;}

f1(){int x=10,n,c;
c=clock();for(n=0;n<N;n++)x=abs(x);c=clock()-c;
cout << x<<" "<<c<<endl;}

f2(){int x=10,n,c;
c=clock();for(n=0;n<N;n++)if(x>0)x=-x; else x=-x;c=clock()-c;
cout << x<<" "<<c<<endl;}

main(){
f0();f1();f2();}

132 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:20:20 ]
この範囲でランダムの数値を取るってどうすればいいんでしょうか?
a = rand() これをいじって10以下でランダムとかにしたいのですが・・

133 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:27:08 ]
ヒント:剰余算

134 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:34:22 ]
>>132
rand()%10 // 0〜9 までの乱数
rand()%11 // 0〜10 までの乱数

135 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:45:02 ]
1〜10の範囲で乱数を得たい場合。

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

int main() {
  int lower = 1, upper = 10;

  srand((unsigned int)time());
  fprintf(stdout, "%d", rand_xtoy(lower, upper));

  return 0;
}

int rand_xtoy(int lower, int upper) {
  return rand() / (INT_MAX + 1.0) * upper + lower;
}

136 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:55:26 ]
>>135
誤解しそうな関数
rand_xtoy( 9 , 10 ) が返す値の範囲は?

137 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 21:12:55 ]
>>136
サッカー見ながら書いたら間違ったw

int rand_xtoy(int lower, int upper) {
  return rand() / (INT_MAX + 1.0) * (upper - lower + 1) + lower;
}



138 名前:137 mailto:sage [2007/10/17(水) 22:02:12 ]
なんか寝ぼけてるようだ…orz

int rand_xtoy(int lower, int upper) {
  return rand() / (RAND_MAX + 1.0) * (upper - lower + 1) + lower;
}

139 名前:998 [2007/10/17(水) 23:01:00 ]
>>126
ごめんなさい。
ソースはうpできないんです。

140 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:17:53 ]
>>139
バッファオーバーフローにより、
書き換えてはいけないところが書き換えられているか、
未初期化のポインタを操作している可能性が高いです

141 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:43:32 ]
>>139
「fopenでエラーが出る」と判明しているのなら、
ファイルオープンに失敗したNULLポインタを使ってるんじゃないの?

142 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 00:55:45 ]
分割コンパイルでなんかもうファイルの数がすげー多くなってきて
makeかけたら結構の行いくんだよね。

1つのファイルに2、3個の関数書くもの?

143 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:18:25 ]
myheader.h:20: error: 配列の型が不完全要素型を持っています

20行めの関数プロトタイプ
void fileinput(char [][],int );

どういうエラーですか?


144 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:30:44 ]
>>143
配列の要素数を省略できるのは最初の [ ] だけ。
void fileinput(char [][10],int );
とかにする必要がある。10 かどうかは知らんが。

145 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:40:41 ]
>>143
>void fileinput(char [][],int );
二次元配列を受け取る時は、一次元目の要素数を指定しなければならない

void catch_two_dimensions_array(char s[][5] , int n){
int i;
for(i=0; i<n; i++) printf("%s",s[i]);
}

int main(){
char str[3][5] == {"hoge" , "hage" , "func"};

catch_two_dimensions_array(str , 3);
return 0;
}

なお、
void catch_two_dimensions_array(char (*s)[5] , int n);
としてもおk(結局同じこと)

146 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:47:52 ]
>>122

分岐しないで絶対値をとる方法です。(普通使いません)

int abs(int x) /* |x| */
{
int mask = x >>(CHAR_BIT*sizeof(int)-1);
return (x + mask)^mask;
}

int minus_abs(int x) /* -|x| */
{
int mask = x >>(CHAR_BIT*sizeof(int)-1);
mask = ~mask;
return (x + mask)^mask;
}

147 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 02:06:50 ]
>>122

1ライナーな符号変転(整数限定、マクロで書いてみた)

#define NEGATIVE(x) (~x+1)

これは有名だと思う。



148 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 02:42:08 ]
>>142

1ファイルに関数1つなんて規則はない。
ある程度同じ関連のものは1ファイルにまとめた方が管理もしやすいと思う。
そのあたりは書いた人のセンスだろうが…。

1ファイル1関数にすると1関数の行数が多くなりがちと読んだことがあるが
本当なのかなぁ

149 名前:デフォルトの名無しさん [2007/10/18(木) 02:44:13 ]
関数を始める時に

int kansuu(int a, int b, char *c){

という風に書きますよね。
これを

int kansuu(a, b, c)
int a;
int b;
char *c;
{

と書き換えることができると聞いたのですが、コンパイルが通りません。
後者の書き方は一般的ではないのでしょうか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<251KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef