C言語なら俺に聞け( ..
2:デフォルトの名無しさん
07/10/15 22:35:19
Part 1 スレリンク(tech板)
Part 2 スレリンク(tech板)
Part 3 スレリンク(tech板)
Part 4 スレリンク(tech板)
Part 5 スレリンク(tech板)
Part 6 スレリンク(tech板)
Part 7 スレリンク(tech板)
Part 8 スレリンク(tech板)
Part 9 スレリンク(tech板)
Part 10 スレリンク(tech板)
Part 11 スレリンク(tech板)
Part 12 スレリンク(tech板)
Part 13 スレリンク(tech板)
Part 14 スレリンク(tech板)
Part 15 スレリンク(tech板)
Part 16 スレリンク(tech板)
Part 17 スレリンク(tech板)
Part 18 スレリンク(tech板)
3:デフォルトの名無しさん
07/10/15 22:37:06
>>1
乙
>>2
Part 18 スレリンク(tech板)
4:デフォルトの名無しさん
07/10/15 22:48:13
前スレのこれお願いします。
行数はいくつかの行数の違うファイルを取り入れるので
違いますが、列数は同じファイルです。Mとでもしましょうか
996 :デフォルトの名無しさん:2007/10/15(月) 21:50:49
ファイルから数値を読み取るとき、
その数値をに二次元配列にいれるとして
そこの二次元配列の最初の領域確保はどうするべきですか?
できるだけ領域を使わないとすると。
5:デフォルトの名無しさん
07/10/15 22:55:37
>>4
ファイルのサンプルうp!
6:デフォルトの名無しさん
07/10/15 22:57:13
適当に100行分くらい確保しといてもいいんじゃない
最後にreallocで縮小すれば
7:デフォルトの名無しさん
07/10/15 22:58:48
>>4
その数値は整数?小数?
それととりうる値の範囲がわかればどの型を使えばいいか決まる
あとファイルの先頭に列数や行数が書かれていれば領域確保が楽になるけどそういうのは無いんだよね?
8:4
07/10/15 23:08:18
0: -20.903 -0.245 -0.851 5.156 8.659 12.120 1.665 -2.565 0.404 -2.526
0.322 -0.025 -0.120 0.521 0.237 0.490 -0.202 -2.928 -4.003 1.254
0.634 -1.119 1.177 0.601 -0.482 -0.007
1: -18.858 1.046 -1.616 4.023 1.857 4.207 6.451 0.989 -3.807 0.744
2.020 -0.532 -0.124 0.566 0.415 0.174 -0.942 -3.092 -3.921 0.331
0.705 0.091 0.528 -0.378 -0.225 -0.009
2: -19.319 0.295 1.983 4.715 -2.581 -3.939 5.541 -1.169 -3.084 1.723
2.476 -2.182 -0.151 0.387 0.489 0.140 -0.311 -1.611 -3.145 -2.083
-0.260 0.625 -0.204 -0.429 0.494 -0.009
こういうファイルを取り入れて
小数点だけ取り入れる。「1:」とか「2:」とかが行の番号にしてるつもり
1行ごとに26個の数値がある。
ちなみにこのファイルは横に広げれば26個小数点の数値が並んでます
9:4
07/10/15 23:09:27
でこの行数が違うファイルをどんどん取り入れるというわけです。
26というのは変わりません
10:デフォルトの名無しさん
07/10/15 23:10:41
floatでいいな
11:4
07/10/15 23:15:29
floatは使いません。
正直floatは使う価値なしだと思います
12:デフォルトの名無しさん
07/10/15 23:16:42
なんだ釣りか
13:デフォルトの名無しさん
07/10/15 23:20:48
>>11
float の有効桁数を知っているの?
できるだけ領域を使わないんじゃないの?
14:デフォルトの名無しさん
07/10/15 23:20:56
じゃあ文字列として読み込むんだろうな
15:4
07/10/15 23:21:57
大体110〜140くらいのファイルばかりだから150くらいでいいか
とも思うんですけど。
一般的に>>8みたいな数値多いファイルは
どのように取り込むのがいんでしょうか?
16:デフォルトの名無しさん
07/10/15 23:26:55
>>11
ほう
理由言ってみ?
17:4
07/10/15 23:29:21
自分で計算するのは対数でだけど
検算するときには少数で計算するんだがその時に
floatでは表せなくなるから
18:4
07/10/15 23:33:30
あと計算はdoubleのほうが早いと聞いたから
19:デフォルトの名無しさん
07/10/15 23:35:20
m9(^Д^)プギャー
20:デフォルトの名無しさん
07/10/15 23:39:07
doubleの方が速いとか何時の時代ですか
21:4
07/10/15 23:44:03
どっちにしろfloatじゃ検算不可能だから使わない
22:デフォルトの名無しさん
07/10/15 23:46:06
浮動小数点数で検算とな?
23:デフォルトの名無しさん
07/10/15 23:51:23
検算できる。
計算途中や計算結果を入れる変数までfloatを使えとは言って無いだろうが。
それはdoubleでやればいい。
今問題になってるのはファイルから読み込んだ値を保持する方法だろ。
24:デフォルトの名無しさん
07/10/16 00:04:09
新スレ開始早々こんなアホが来るとは
25:4
07/10/16 00:04:22
そうですね。
まーfloatを使ってあるアルゴリズムの処理をしてて
その計算をfloatじゃ表示できなくなるのでdoubleで計算してたんすよ。
あとでその計算はlogでやるんだと聞かされて。
検算のためにdouble、logで処理するから処理はfloatで行えるように
変更してみます。
26:4
07/10/16 00:06:50
で聞きたいのは>>20
どっちが速いの?
ぐぐったら大体doubleのほうが速いし正確だと書いてある。
どっちが信用できるんですか?
27:デフォルトの名無しさん
07/10/16 00:08:15
ベンチマークの基本は実測
28:デフォルトの名無しさん
07/10/16 00:12:07
できるだけ精度が欲しいって場合は、double型を、
できるだけ計算速度が欲しいって場合は、float型を取り扱う
float型を使う理由は、ズバリいってメモリの節約です。
また、メモリ転送量が少なくすむので、データ量が膨大なときは高速になることもあります。
と書いてある
29:デフォルトの名無しさん
07/10/16 00:13:50
doubleのほうが速いし正確
floatの計算はdoubleに変換される 計算後元に戻すから鈍い
利点は半分のメモリで住む
30:デフォルトの名無しさん
07/10/16 00:17:39
>>29
そんなの鵜呑みにせず実測しろ
したのなら環境とソースコードを晒せ
31:デフォルトの名無しさん
07/10/16 00:18:42
つまりアーキテクチャに依存するわけですよ
32:デフォルトの名無しさん
07/10/16 00:19:49
>>31が全て
ということで自分の環境で測れ>>4
33:デフォルトの名無しさん
07/10/16 00:25:05
今ならながらほとんどをlogで処理するのにdoubleで計算ってどうなんだって思った。
ただ扱うファイルが非常に多いからfloatでいいかなー。
あるファイルを入力
2500個のファイルで検査、その出力結果が一番高いものが
入力のファイルと一致するかを見る。
それを3000回だよ。
ちなみに2500個のファイルの中身にまたファイル名が書かれてて
その中身のファイルの数値を取り入れるんだけどね。
34:デフォルトの名無しさん
07/10/16 00:27:45
floatの方がSSEの最適化が効く
35:デフォルトの名無しさん
07/10/16 00:36:12
最近makeを見飽きてきた。
make,make,make,make
36:デフォルトの名無しさん
07/10/16 00:40:28
一瞬化粧の濃い人を思い浮かべてしまった
37:デフォルトの名無しさん
07/10/16 00:50:31
C言語の浮動小数点はライブラリの関数がすべてdoubleで
かかれているという罠があるのは有名な話だな……
Cのfloatは遅いという話の出所。
もう昔の話だったか……
38:デフォルトの名無しさん
07/10/16 01:06:31
Cには暗黙の昇格ルールというものがあってだな。float=float+floatはfloadt=(float)((double)float+(double)float)なのよ。
C++ではルールが違うけれども。
39:デフォルトの名無しさん
07/10/16 01:08:06
かなりの初心者で悪いが、質問させてくれ
最近C言語をやりはじめたんだが、gccを入力するとバッチファイルとして認識されてないって出るんだ
環境変数もいじってみたがよくわからない
教えてくださいエロい人
40:デフォルトの名無しさん
07/10/16 01:13:22
OSは?「gccを入力すると」を具体的に。
41:デフォルトの名無しさん
07/10/16 01:14:40
ファイルが多くなってくると分割コンパイルちょっと時間かかるよね。
あれがちょっといや。
コンパイルされたのはわかったけどダラダラと書きやがってと。
エラーでるときはcc -c file.cとかと一緒にでるし。
42:デフォルトの名無しさん
07/10/16 01:15:24
察するにWindows環境?
環境変数PATHを直せば良いんじゃないか?
43:デフォルトの名無しさん
07/10/16 01:17:45
ググレカス
44:デフォルトの名無しさん
07/10/16 01:22:06
これか?
Uncyclopedia項目リンク
45:デフォルトの名無しさん
07/10/16 01:23:05
>>40
詳しいこと書かなくてごめん
OSはWindowsXP
gccはそのままだよ。コマンドプロンプト開いて、gccでファイル実行しようとすると
“gcc”は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。ってでる
そんでググってみて環境変数のpathに含まれてないからってでたからちょこちょこ環境変数いじってみたけど駄目だった
説明下手くそですまん
46:デフォルトの名無しさん
07/10/16 01:26:17
シグインでいいじゃん
47:デフォルトの名無しさん
07/10/16 01:26:46
>>45
ちょこちょこじゃなくてしっかりいじってこい
そうしてhelloworldくらい実行できるようになってからこのスレにこい
48:デフォルトの名無しさん
07/10/16 01:29:57
いじるのめんどいんだったら
10GB削ってLINUXいれたら
すぐ使えます
49:デフォルトの名無しさん
07/10/16 01:34:58
>>47
そうだよな…ありがとう
でもググッてみてもいじり方がよくわからないんだ
何十回も変更してみたけど駄目だった
もうちょっと頑張ってみる
>>48
ありがとう
それも試してみる
50:デフォルトの名無しさん
07/10/16 01:36:58
どうみても48が一番時間かかるとおもうけど
51:デフォルトの名無しさん
07/10/16 01:55:13
>>46が真実
52:デフォルトの名無しさん
07/10/16 03:43:10
@rem gcc.bat
@echo off
del /F /Q %*
53:デフォルトの名無しさん
07/10/16 03:44:27
>>49
もしかしてUNIXバイナリをWindowsに持って来て動かそうとしてないか?
Windowsネイティブでgcc動かすのは結構敷居が高いぞ?
おとなしくCygwin使うか、Windows限定で良いならMSVC++2005Expressやbccのほうがラク。
54:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/16 12:19:16
CPUでハードウェア的に計算可能なのはdoubleだときいた だからfloatは鈍いと 違うのか
58:デフォルトの名無しさん
07/10/16 12:21:45
ハードウェアとして浮動小数点演算が組み込まれているはずだ
すると今のCPUは、doubleもfloatも入っているのか?
59:デフォルトの名無しさん
07/10/16 12:42:15
>>55
素朴な疑問だが、最適化掛けるとループの中身が消えそうだがコンパイラとオプションは?
# まぁ、floatが速いと言うことには同意だが。
>>56
うーん、こっちは辻褄が合わないなあ。コンパイラとオプションはどうなっている?
# 関数を適切に呼び出しているなら、float ⇔ doubleの変換が頻繁に入るから遅くなる筈なんだ。
>>57
大丈夫、今時のCPUはfloatでも計算可能だ。
>>58
そそ、そういうこと。
実際、加減算、乗算は速度的にビット幅は余り影響しない。まして除算はビット幅が広いほど確実に遅くなる。
60:デフォルトの名無しさん
07/10/16 13:08:44
一つ発見。>56をgccでコンパイルしたら、log()ではなくlogf()、exp()ではなくexpf()を呼び出していたよ。
それならそれで、floatの方が速いのも納得。尤も、初期のXeonでは有意差が得られなかったけれど。
# gcc(3.4.6)使用。オプションは -O3 -msse2 -lm、-msse2は事実上影響なかった。
61:デフォルトの名無しさん
07/10/16 14:04:37
C言語を勉強しようと思ってるんですけど、
普通のエディタじゃできないんですか?
コンパイラがよく分からなくて何かできないんですけど。
62:デフォルトの名無しさん
07/10/16 14:08:19
>>61
コードを書くだけならどんなエディタでも構わないと言えば構わない。
コンパイラにVisualStudioのような統合環境を使うのなら、ビルトインのエディタを使うのが無難だと思う。
コンパイラにbccやlsicを使うのはよした方がいい。
コンパイラにgccを使うのならコマンドライン環境そのものの使い方にも慣れる必要がある。
まぁもっとも、一部の天才のように読むだけで勉強できるのならエディタもコンパイラも要らないわけだが。
63:デフォルトの名無しさん
07/10/16 14:09:09
普通のエディタでかける
でも初心者は、BCC developerつかっとけ
64:BCC Developer導入法
07/10/16 14:15:01
BCC Developer導入法
URLリンク(www.codegear.com)
へ行って
Borland C++Compiler / Turbo Debugger Windows 5.5 8.85 MB
をクリックして、必要事項を記入してファイルを落とす
落としたら、メールで送られてきたパスワードを入力してインストールする
デバッガをインストールするときのパスワードは ReadmeInstall.txt に書いてある
つぎに BCC Developerをインストールする 下をダウンロードする
URLリンク(www.vector.co.jp)
URLリンク(www.cmagazine.jp)
解凍したフォルダを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:デフォルトの名無しさん
07/10/16 14:26:23
今MKEditorを使ってるんですけど、
これじゃできませんか?
66:デフォルトの名無しさん
07/10/16 14:27:24
それとBCC Developerって無料ですか?
67:デフォルトの名無しさん
07/10/16 14:29:28
>>66
>62は無視ですか?
68:デフォルトの名無しさん
07/10/16 14:32:08
MKEditorで書けるが、コンパイルは自分でやる必要あり
BCC Developerは無料で簡単
69:デフォルトの名無しさん
07/10/16 14:34:09
BCC Developerなら、今ならの導入でわからないところを教えてやるよ
70:デフォルトの名無しさん
07/10/16 14:40:53
>>67
すみません、よく分からなくて。
71:デフォルトの名無しさん
07/10/16 14:41:45
とりあえず >>64 をやってみ
72:デフォルトの名無しさん
07/10/16 14:42:33
どうしてもBCCDeveloperを勧めたい香具師がいるらしいから、一緒に地獄に落ちておけばいいと思うよ。
73:デフォルトの名無しさん
07/10/16 14:46:26
じゃあどれか良くて、BCCDE
74:デフォルトの名無しさん
07/10/16 14:46:57
URLリンク(www.sgnet.co.jp)
このサイトの勉強をしたいんですけど。
できますか?
75:デフォルトの名無しさん
07/10/16 14:46:59
じゃあどれか良くて、BCCDevloperのどこが悪い?
76:デフォルトの名無しさん
07/10/16 14:49:16
>>74
BCC Developerでできるが、そのサイトは勉強にむいていない 質が良くない
77:デフォルトの名無しさん
07/10/16 15:04:36
ここは初心者向きの勉強サイト ある程度わかったらSTLへ進むと良い
URLリンク(hp.vector.co.jp)
URLリンク(effy.ldw.jp)
78:デフォルトの名無しさん
07/10/16 15:08:28
>>74
できますか?って…自分の頭のことを他人に聞くなよw
79:デフォルトの名無しさん
07/10/16 15:12:38
まずはBCC Developerをダウンロードすればいいんですよね?
80:デフォルトの名無しさん
07/10/16 15:12:42
>>77
後者は兎も角、前者はLSI-C86を使っている時点でアナクロに過ぎると思う。
81:デフォルトの名無しさん
07/10/16 15:13:29
>>79 >>64の順序どおりにやってみて
82:デフォルトの名無しさん
07/10/16 15:14:56
>>80 そこは見なかったことにすれば初心者向き
83:デフォルトの名無しさん
07/10/16 15:15:35
わかりました。
皆さんありがとうございます。
84:デフォルトの名無しさん
07/10/16 15:23:01
>74のサイトは他のスレでダメ出しされていた。
私も間違いを指摘するメールを出したが改めるどころか返事もなかった。
85:デフォルトの名無しさん
07/10/16 16:06:18
>>54
C++でもISO/IEC 14882:2003 (X3014:2003)では、
float版とlong double版がdouble版の関数名で多重定義されている。
ほげfとかほげlみたいな関数はないことになっているだろうけど。
86:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/16 16:55:17
C/C++の宿題を片付けます 97代目
スレリンク(tech板)l50
89:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/16 17:33:35
汎用性を重視しているのですが、DLLを使う場合に一般的なのは、
LIBファイルを使って最初からリンクしてしまうパターンでしょうか?
それともLoadLibraryで随時リンクするパターンでしょうか?
91:89
07/10/16 17:37:31
あ、書き忘れ
cut==0のとき(n==1のとき)、samp_leftとかが宣言されてないからmerge関数を呼び出すとこでエラーが出る
とりあえずの対処法としては、mergeをifブロックに押し込んで、
n==1 (cut==0)の時はdata2にそのままデータを入れる
92:デフォルトの名無しさん
07/10/16 17:38:22
>>90
スタティックリンクだとDLLのバージョンで悩まなくて済む
93:デフォルトの名無しさん
07/10/16 17:44:33
てか宣言されていないとか以前の問題か
スコープが……
94:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/16 18:01:43
>>94
Windowsアプリを作るなら、コンパイルオプション設定する必要があるんじゃないか。
VCは知らんが、例えばBorlandなら「-W」とか。
96:デフォルトの名無しさん
07/10/16 18:05:53
>>95
プロジェクトの設定を変えたら動きました。ありがとうございます
97:デフォルトの名無しさん
07/10/16 18:23:12
なんてスレ違いのやつなんだ
98:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/16 22:57:09
INT_MAX + 1 とすると、オーバーフローを起こすのですが
INT_MAX + 1.0 にすると、2147483648.000000 と出て、エラーが出ません。
double型はどこまで値を扱えるのか誰か教えてくださいませんか?
100:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/16 22:58:54
ごめんなさい誤爆しました
102:デフォルトの名無しさん
07/10/16 23:08:42
>>99
DBL_MAX まで
DBL_MAX は float.h で定義されている
103:デフォルトの名無しさん
07/10/16 23:29:39
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458
953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304
583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
こんな数が得られましたw
ありがとうございます
104:デフォルトの名無しさん
07/10/17 03:18:10
あるコンパイラで作ったC言語のライブラリを
別のコンパイラから利用できることってあるんですか?
105:デフォルトの名無しさん
07/10/17 03:21:06
あります
106:デフォルトの名無しさん
07/10/17 03:28:42
ありがとうございました。
107:デフォルトの名無しさん
07/10/17 05:49:34
XP使ってるんですが、どうもコンパイラをうまく設定できません。
LSI C-86というのの設定がわからず、Borland C++ Compiler 5.5 ってのも
落とせるところのリンクが死んでます・・・手っ取り早くコンパイルするにはどうすればいいでしょうか
108:デフォルトの名無しさん
07/10/17 07:38:10
>>107
URLリンク(www.forest.impress.co.jp)
VC2005ExpressかTurboC++ExpressをDLすればよし。どちらもコマンドラインでコンパイル可能。
109:デフォルトの名無しさん
07/10/17 08:40:31
>>107
Borland C++Compiler 5.5
URLリンク(www.borland.com)
ここのダウンロード、まったく反応ありませんね〜。
昨日からC言語をはじめた者ですが、どこかにミラーサーバ
ありませんか??
110:デフォルトの名無しさん
07/10/17 08:53:02
>>109
URLリンク(www.codegear.com)
111:デフォルトの名無しさん
07/10/17 13:41:44
うーんBorland C++Compiler 5.5って落とせたけどコンパイル、実行の仕方がわからない・・・
インストールしても実行ファイルがなくてどうすればいいのやら
112:BCCはこれよめ
07/10/17 14:02:15
BCC Developer導入法
URLリンク(www.codegear.com)
へ行って
Borland C++Compiler / Turbo Debugger Windows 5.5 8.85 MB
をクリックして、必要事項を記入してファイルを落とす
落としたら、メールで送られてきたパスワードを入力してインストールする
デバッガをインストールするときのパスワードは ReadmeInstall.txt に書いてある
つぎに BCC Developerをインストールする 下をダウンロードする
URLリンク(www.vector.co.jp)
URLリンク(www.cmagazine.jp)
解凍したフォルダを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:デフォルトの名無しさん
07/10/17 14:09:45
入門編ってのはあくまでC言語の入門であってPC入門じゃない
コンパイラ自体はただのソフトなんだからそれぐらい自分で解決できるようになっておけ
114:デフォルトの名無しさん
07/10/17 15:37:49
>>110
ありがとうございました!
無事Win95で起動させました!
このPCの余生の用途が決まりました。
115:デフォルトの名無しさん
07/10/17 15:50:58
>>111
実行ファイルが無いって……
インストール先をちゃんと見てみたのか?
116:デフォルトの名無しさん
07/10/17 15:52:05
というか別に実行ファイルを探す必要は無いんだよ
PATHを通せば
117:998
07/10/17 19:19:02
前スレでfopenでセグメンテーション違反が出て、
ポインタの取り扱いミスとの指摘を受けたものです。
ポインタ勉強したのですが、イマイチ分かりません。
数値計算用プログラムで配列の要素をかなりたくさん使っているのですが、
それも原因として挙げられますか?
118:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/17 19:22:56
数値の符号を反転させるにはどうしたらいいですか?
120:デフォルトの名無しさん
07/10/17 19:30:34
>>118
文字列を'\0'で終わらせてないから。
121:119
07/10/17 19:33:10
すみませんつけたしです。
反転の他に、(+)にする、(-)にする方法もあれば教えて頂きたいです。
数値は signed前提です。
122:119
07/10/17 19:42:44
連投すみません。
なんとか解決できたかも知れません。
符号を反転させるには、
x *= -1;
でき、
if( x < 0){
x *= -1;
}
------------
if( x > 0){
x *= -1;
}
で、できそうです。
もっとスマートな方法があれば教えて頂きたいです。
よろしくお願いします。
123:デフォルトの名無しさん
07/10/17 19:43:33
>>120
ありがとうございます。
解決できました。
124:デフォルトの名無しさん
07/10/17 19:51:30
符号をプラスにするなら
x = x * x / x;
とかでできるんでない?多分
125:124
07/10/17 19:52:50
やべ、何言ってんだ俺w
今の無しにしてorz
126:デフォルトの名無しさん
07/10/17 19:56:38
>>117
ソースうp!
127:124
07/10/17 19:58:37
改めて……
>>122
x = -x;
128:デフォルトの名無しさん
07/10/17 19:59:27
>>119
数値計算の速度がシビアじゃないところなら >>122 よりも
x=-x;
x=abs(x);
x=-abs(x);
が分かりやすい (オレはね)
129:デフォルトの名無しさん
07/10/17 20:08:56
高速さがシビアに要求されるなら、
むしろ乗算を使わない128のほうが速い気がする。
130:デフォルトの名無しさん
07/10/17 20:11:47
誰か測れ
131:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/17 20:20:20
この範囲でランダムの数値を取るってどうすればいいんでしょうか?
a = rand() これをいじって10以下でランダムとかにしたいのですが・・
133:デフォルトの名無しさん
07/10/17 20:27:08
ヒント:剰余算
134:デフォルトの名無しさん
07/10/17 20:34:22
>>132
rand()%10 // 0〜9 までの乱数
rand()%11 // 0〜10 までの乱数
135:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/17 20:55:26
>>135
誤解しそうな関数
rand_xtoy( 9 , 10 ) が返す値の範囲は?
137:デフォルトの名無しさん
07/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
07/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
07/10/17 23:01:00
>>126
ごめんなさい。
ソースはうpできないんです。
140:デフォルトの名無しさん
07/10/17 23:17:53
>>139
バッファオーバーフローにより、
書き換えてはいけないところが書き換えられているか、
未初期化のポインタを操作している可能性が高いです
141:デフォルトの名無しさん
07/10/17 23:43:32
>>139
「fopenでエラーが出る」と判明しているのなら、
ファイルオープンに失敗したNULLポインタを使ってるんじゃないの?
142:デフォルトの名無しさん
07/10/18 00:55:45
分割コンパイルでなんかもうファイルの数がすげー多くなってきて
makeかけたら結構の行いくんだよね。
1つのファイルに2、3個の関数書くもの?
143:デフォルトの名無しさん
07/10/18 01:18:25
myheader.h:20: error: 配列の型が不完全要素型を持っています
20行めの関数プロトタイプ
void fileinput(char [][],int );
どういうエラーですか?
144:デフォルトの名無しさん
07/10/18 01:30:44
>>143
配列の要素数を省略できるのは最初の [ ] だけ。
void fileinput(char [][10],int );
とかにする必要がある。10 かどうかは知らんが。
145:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/18 02:06:50
>>122
1ライナーな符号変転(整数限定、マクロで書いてみた)
#define NEGATIVE(x) (~x+1)
これは有名だと思う。
148:デフォルトの名無しさん
07/10/18 02:42:08
>>142
1ファイルに関数1つなんて規則はない。
ある程度同じ関連のものは1ファイルにまとめた方が管理もしやすいと思う。
そのあたりは書いた人のセンスだろうが…。
1ファイル1関数にすると1関数の行数が多くなりがちと読んだことがあるが
本当なのかなぁ
149:デフォルトの名無しさん
07/10/18 02:44:13
関数を始める時に
int kansuu(int a, int b, char *c){
という風に書きますよね。
これを
int kansuu(a, b, c)
int a;
int b;
char *c;
{
と書き換えることができると聞いたのですが、コンパイルが通りません。
後者の書き方は一般的ではないのでしょうか?
150:デフォルトの名無しさん
07/10/18 02:46:31
>>149
Cでは出来るがC++では無理だったかと
151:デフォルトの名無しさん
07/10/18 02:51:30
ということは古い書き方ってことですか。前者を使う方が良さそうですね。
152:デフォルトの名無しさん
07/10/18 07:13:56
フリーのリンクソフトってある?
あったら教えてくれ
153:デフォルトの名無しさん
07/10/18 07:30:13
>>55のソースで予想通りの結果が出ません。
現在の時刻: 7:28:12.80
新しい時刻を入力してください:_
と表示されます。
154:デフォルトの名無しさん
07/10/18 07:33:05
>>153
.\time
.\time.exe
155:デフォルトの名無しさん
07/10/18 07:53:16
>>154
ありがとうございます。実行できました。
156:デフォルトの名無しさん
07/10/18 08:48:38
関数内に関数を書く方法は、いつできたのでしょうか?
C言語作成当初からあったのでしょうか?
(自分の環境がC99な為、C89等他の環境でもビルドできるか知りたいです)
157:デフォルトの名無しさん
07/10/18 08:50:57
C89じゃできないよ
158:デフォルトの名無しさん
07/10/18 14:17:05
>>156
大丈夫、C99でもできない。恐らくgccの拡張だろ。
159:デフォルトの名無しさん
07/10/18 14:38:12
>>関数内に関数を書く方法
C++でなおかつ関数じゃなくてクラスor構造体or共同体なら宣言できるが…。
gcc拡張使ってないから分らない…
(ヲイヲイ)
160:998
07/10/18 16:03:26
>>139
>>140
ありがとうございます!!
スタックサイズを無制限にしたら解決しました。
161:デフォルトの名無しさん
07/10/18 16:04:49
>>156
gccの拡張。
また、gccでも、CではできるがC++ではできない。
例:
void func(int x[], int y[], int n)
{
int i;
double average(int x, int y){
return (x + y) / 2;
}
for(i = 0;i < n;i++)
printf("%d\n", average(x[i], y[i]));
}
みたいな感じで使う(例が悪くてすまん)
162:デフォルトの名無しさん
07/10/18 16:25:47
始めて知ったが、果てしなく謎だな。
カプセル化したいんならC++でやるべきだろ
163:デフォルトの名無しさん
07/10/18 19:29:20
pascalはふつーに関数を入れ子にできたから、昔はCにもあればいいのにって思ってたよ。
164:デフォルトの名無しさん
07/10/18 19:36:17
double a,b;
if(b==0.0 || a%b!=0.0)
{
}
がコンパイル通らないんですが、doble型の%演算は
165:デフォルトの名無しさん
07/10/18 19:36:48
ミスりました
double a,b;
if(b==0.0 || a%b!=0.0)
{
}
がコンパイル通らないんですが、double型の%演算はできないんですか?
166:デフォルトの名無しさん
07/10/18 19:41:08
つ fmod
浮動小数点数の比較で ==, != を使うのはどうかと思うがな。
167:デフォルトの名無しさん
07/10/18 19:41:19
>>165
ないです。fmod関数を使ってください
168:デフォルトの名無しさん
07/10/18 19:43:20
わかりました!
169:デフォルトの名無しさん
07/10/18 19:46:27
どらえもんは何言語でできてるんですか?
170:デフォルトの名無しさん
07/10/18 19:49:21
>>169
Fortran
171:デフォルトの名無しさん
07/10/18 20:22:15
#include <stdio.h>
int main (void)
{
int a=0xFFFA;
printf("%d,%p",a,&a);
return 0;
}
仮に&aのアドレスが0012FF88だった場合に
1バイト目(FA)は0012FF88ですが、
int aの2バイト目(FF)のアドレス 0012FF89を
得るにはどうしたらいいでしょうか?
172:デフォルトの名無しさん
07/10/18 20:32:35
>>171
#include<stdio.h>
int main(void){
int a=0xFFFA;
printf("%d,%p\n", a, &a);
printf("%p\n", (char*)&a+1);
return 0;
}
173:デフォルトの名無しさん
07/10/18 20:37:14
intのバイトオーダーはCPUによって異なる
Windows(Intel)の場合はこうでなかったかな?
0012FF88 00
0012FF89 00
0012FF8A FA
0012FF8B FF
174:デフォルトの名無しさん
07/10/18 20:39:01
>>171
#include <stdio.h>
struct int_filter{
char byte[sizeof(int)/psizeof(char)];
};
int main (void)
{
int a=0xFFFA;
struct int_filter *f;
f = (struct int_filter *)&a;
printf("a:value->%d,address->%p",a,&a);
printf("filter:[0]->%p,[1]->%p,[2]->%p,[3]->%p"f->byte,f->byte+1,f->byte+2,f->byte+3)
return 0;
}
175:デフォルトの名無しさん
07/10/18 20:41:14
何故わざわざ構造体を……
176:173
07/10/18 20:42:23
まちがえたみたいね
無視してくださいw
177:171
07/10/18 20:48:12
>>172
できた〜〜〜ありがとうございます。
>>174
174さんのコピーして貼り付けたんですが、
コンパイルできませんでした。
初心者なのでソースが難しすぎてどこを直せばうごくかさっぱりですが
どうもありがとうです。
178:デフォルトの名無しさん
07/10/18 20:56:25
>>173
sizeof(int)==4なら
0x00FFFAは
FA,FF,00,00 でしょIntel系なら。
00,00,FF,FA の順ががモトローラ系(スペル忘れちった)
179:デフォルトの名無しさん
07/10/18 21:21:57
エンディアンの違いはいい迷惑。
180:デフォルトの名無しさん
07/10/18 21:51:54
>>177
>>174のヤツ。
psizeof→sizeofのタイプミス
2つ目のprintf、閉じる方の「"」の後ろに「,」が無い。文の最後に「;」がない。
ミス自体は初心者レベルのモンだな。
まぁどうでも良いけどな・・・
181:デフォルトの名無しさん
07/10/18 22:35:06
スタックとキューの初歩を勉強してるんですが。
#include <stdio.h>
#define MAX_SIZE 30
int stack[MAX_SIZE];
int sp = 0;
void push( int x )
{ stack[sp] = x;
sp++;}
int pop(void)
{ int x;
x = stack[sp-1];
sp--;
return x;}
〜スタックが空か判定(省略)〜
182:デフォルトの名無しさん
07/10/18 22:36:16
void show( void )
{ int i;
printf( "size = %2d:", sp );
for( i = 0; i < sp; i++ ){
printf( " %4d", stack[i] );
}
printf( "\n" );
}
int main()
{
push( 1 ); show();
push( 2 ); show();
push( 3 ); show();
printf( "pop: %4d\n", pop() );
printf( "pop: %4d\n", pop() );
printf( "すべてpopします...\n" );
while( !is_empty() ){
printf( " %4d", pop() );
}
return 0;
}
スタックの内容を少しずつ表示していくものなんですが、
これだとpush関数とpop関数の所は場合によっては危ないよ、と言われました。
ポインタとか使ったほうが良いんでしょうか?
危ない、の意味すらわかりません。分かる人居たら教えてください。
183:デフォルトの名無しさん
07/10/18 22:39:55
すたっくはSTLつかっとけ
184:デフォルトの名無しさん
07/10/18 22:40:20
たぶんpushやpopする前にバッファが残ってるかチェックしてないからじゃね
たとえばpushしてないのにいきなりpopするとか
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5139日前に更新/251 KB
担当:undef