C言語なら俺に聞け(入門篇) Part 20at TECH
C言語なら俺に聞け(入門篇) Part 20 - 暇つぶし2ch2:デフォルトの名無しさん
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
これか?
URLリンク(ja.uncyclopedia.info)

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するとか

185:デフォルトの名無しさん
07/10/18 22:44:34
しかし、STLはC++という罠。

>>181
ようするにMAX_SIZE以上pushしようとしたときと、
空の時にpopしようとしたときにまずい。

186:デフォルトの名無しさん
07/10/18 22:48:17
「危ない、の意味」をボカしてるのは、自分で考えさせようという親心?
なら俺も黙っとく。

187:デフォルトの名無しさん
07/10/18 22:48:19
>>181,182
pushする時にはオーバーフローしないか(配列から溢れないか)、
popの時にはスタックが空でないかチェックするのは鉄則
pushなら
if(sp < MAX_SIZE)
popなら
if(sp > 0)でチェックすればいい

188:186
07/10/18 22:50:08
∑(´д`;)

189:181
07/10/18 22:58:36
皆さんありがとうございます。
危ない、ってそれのことだったんですね。
push関数で最大値以上にpushしたらどうなるのか、エラー出てないし
まあ良いかと思ってたんですが、油断していました。
(181の最後で「空かどうか判定」の部分は省略しましたが、
そこのことだと思ってました。)
自分でちょっと直してみます。

190:デフォルトの名無しさん
07/10/19 06:02:19
#include<stdio.h>

int main(){
char *str="test";

str[1]='s';

printf("%s\n",str);

return 0;
}

これを試してみたのですが、何も表示されません。
どこが問題なのでしょうか?

191:デフォルトの名無しさん
07/10/19 06:10:36
釣りにしか見えない

192:デフォルトの名無しさん
07/10/19 06:27:51
>>190
ポインタや配列に関する知識が中途半端な証拠

193:デフォルトの名無しさん
07/10/19 06:37:35
char str[]="test";

194:デフォルトの名無しさん
07/10/19 06:42:43
>>190
それは処理系によって動作が異なる。
何も表示されないどころかエラー吐いて止まる場合もあるし、
>>190の望みと思われるtsstを表示して正常終了する場合もある。
つまり、コンパイルできるからといって書いてはいけないコード。

195:デフォルトの名無しさん
07/10/19 06:43:49
明らかに欠陥だな

196:デフォルトの名無しさん
07/10/19 06:45:17
でも、とりあえずstr[1]='s'をコメントアウトして
printf("%c",str);
とした場合には、ちゃんとeが表示されます。
これってつまりstr[1]には文字が入っているということですよね。
では何故そこに代入することができないのでしょうか?

197:デフォルトの名無しさん
07/10/19 06:59:28
>では何故そこに代入することができないのでしょうか?
そこってどこだと思う?

198:デフォルトの名無しさん
07/10/19 07:11:28
文字列の先頭アドレスからsizeof(char)一つ分進んだ所ではないのですか?
そこにsを代入しようと思うのですが。

199:デフォルトの名無しさん
07/10/19 07:26:45
とあるビルの2階に手紙を届けたいが届けることが出来ない。なぜだろう?
→そのビルへは階数に関わらず手紙を届ける事が禁止されている

200:デフォルトの名無しさん
07/10/19 07:32:38
こういう回りくどく説明してるのは傍から見てうざい

201:デフォルトの名無しさん
07/10/19 07:34:31
ポインタに代入した文字列はconstなんですか?では何故コンパイルエラーが出ないのでしょう?
出ないにしても、代入が無効になるだけだと思うのですが、表示すら何もされなくなるのは何故なのでしょうか。

202:デフォルトの名無しさん
07/10/19 08:46:11
文法的に正しくても配列のメモリ格納形式が処理系異存だから
うまくいかない環境もあり,うまくいく環境もある

203:デフォルトの名無しさん
07/10/19 08:48:31
>>201
配列とポインタが同じように扱える保証はないからな

204:デフォルトの名無しさん
07/10/19 10:52:15
プログラムの勉強を始めようと思って、分りやすい教科書を
探しているんですが、何かおすすめの本てありますか?
今手元にあるのはメディックエンジニアリングの「これから
はじめるC言語基礎の基礎」という本なんですが・・・・

205:デフォルトの名無しさん
07/10/19 10:58:28
nai

206:デフォルトの名無しさん
07/10/19 11:50:24
>>202-203
いやでもやってることは、文字列の先頭から2バイト目に文字を代入する、ってことですよね?
配列で宣言してもポインタで宣言しても、データがメモリに連続で格納される、という点は変わらないはずです。
いくら処理系依存と言っても、配列だけ何故か1KBごとに飛び飛びで格納する、
なんてトリッキーなことはしていないと思うのですが、しているのですか?
もしそうならば、わざわざ配列の格納方式だけ処理系依存にする意味なんてあるんですか?

207:デフォルトの名無しさん
07/10/19 12:04:51
>>206
文字列リテラルと配列の区別をつけよう。

208:デフォルトの名無しさん
07/10/19 12:05:18
とりあえずさ、
>>190のコードで実際にどんな値が入ってるか、確認してみれば?
printf("%d" , str[1]);
%cじゃなく%dで
もし代入失敗してるなら代わりに何が入ってるか確認できるし

209:デフォルトの名無しさん
07/10/19 12:12:01
>>207
機能として違うのはわかりますが、メモリの格納方式まで別々にする意味は何でしょう?
単に不便にしているだけとしか思えないのですが。

>>208
同じ値が入っていました。さすがにこれはおかしいと思い、VCのモードをReleaseに変えたら動きました。
しかし根本的な問題解決にはなっていません。何故こう無駄に不安定なのか…

210:デフォルトの名無しさん
07/10/19 12:27:50
無駄じゃないだろ

211:デフォルトの名無しさん
07/10/19 12:30:35
>>209
「このモジュールはデバッグモードでコンパイルして
こっちはリリースモードでコンパイルしないとダメだからな」

嫌すぎる…

212:デフォルトの名無しさん
07/10/19 13:22:06
>>209
文字列リテラルを使うときに、メモリを節約できるから。
つまり、次のコードは、同じ値を出力するかもしれない。
# コンパイラとオプションによって変わる
--
void exsample()
{
const char * foo = "abcde";
const char * bar = "abcde";
printf("%p, %p\n", foo, bar);
}
--
勿論、次のコードは只の配列だから違う値が出力される。
void exsample2()
{
char foo[] = "abcde";
char bar[] = "abcde";
printf("%p, %p\n", foo, bar);
}

213:デフォルトの名無しさん
07/10/19 13:23:23
げ、どうでもいいけど関数名がtypoだ _/ ̄|◯

214:デフォルトの名無しさん
07/10/19 13:29:26
自分が間違ってんのに仕様の方に文句をつけるやつは、Cどころか学習自体に向いてないよ

215:デフォルトの名無しさん
07/10/19 13:56:58
新しい言語作ればいいと思うよ

216:デフォルトの名無しさん
07/10/19 15:42:13
#include <stdio.h>
int main (void){
double a,b,c,x;
printf("Please type 1st Number >> ");
scanf("%xf",&a);
printf("Please type 2nd Number >> ");
scanf("%xf",&b);
printf("Please type 3rd Number >> ");
scanf("%xf",&c);
x=(a+b+c)/3;
printf("Average = %xf\n",x);

return 0;
}

なぜか、計算結果が違う・・・ %f が違うんでしょうか?

217:デフォルトの名無しさん
07/10/19 15:46:25
>>216
%xf を %lf にしてみたらどうかな?

218:215
07/10/19 16:07:13
>216
 ありがとうございました。

219:デフォルトの名無しさん
07/10/19 20:17:42
>>201
文字列リテラルの内容を書き替えるプログラムの挙動は未定義。

文字列リテラルの型はchar配列となっているが、これは過去との互換性のため。
蛇足だがC++ではconst charの配列となっている。
(ただし、またも互換性のためchar*への型変換は定義さらている)

>>206
組み込みではROMに配置できるようになる。

Windowsなど高水準なOSでは、規格の規定から
文字列リテラルの書換はするべきでないと
認知されているため、文字列リテラルが
格納されている辺りを読取専用にする。

220:デフォルトの名無しさん
07/10/19 21:09:41
まぁ結局ROMに配置すんのもメモリの節約だし、
「メモリの節約のため」でまとめちゃってもいい気もするけどね。

なんかメモリの節約以外の理由で文字列リテラルはROMのが良い理由があったら、
後学のために教えたって欲しいかも。

221:デフォルトの名無しさん
07/10/19 21:39:11
まぁROMは遅いから結局実行時にRAMにコピーしちゃったりるすんだけどね

222:デフォルトの名無しさん
07/10/19 22:18:08
開いたりしていないファイルポインタを
fclose(fp); とすると、どうなるのでしょうか?

223:デフォルトの名無しさん
07/10/19 22:21:13
fclose関数でエラーが返されると思います。

224:デフォルトの名無しさん
07/10/20 12:19:02
>>222
詳しく言うと、エラー時にはEOFが返される。
成功時は0が返される。

225:デフォルトの名無しさん
07/10/20 13:31:04
その前に開いてない fp ってどっから持ってくるんだ
NULLかゴミ値じゃねぇの?

226:デフォルトの名無しさん
07/10/20 13:47:34
FreeBSD系だとfcloseにNULLを渡したら例外が起きるらしい。
以下はMac OS X Tigerのfclose(3)から引用

> The fclose() function does not handle NULL arguments; they will result in
> a segmentation violation. This is intentional - it makes it easier to
> make sure programs written under FreeBSD are bug free. This behaviour is
> an implementation detail, and programs should not rely upon it.

実際にfcloseにNULLを渡してみたらsegvが発生した。
おっしゃるとおりの御利益はあるかもしらんが、ちゃんと規格に準拠しようぜ…

227:デフォルトの名無しさん
07/10/20 18:16:47
例えば
const char test[] = {"abcdef"};

cとdの間に0x04を入れたい場合どう書けばよいのでしょうか


228:デフォルトの名無しさん
07/10/20 18:31:08
"abc\x04def"

229:227
07/10/20 18:42:47
了解


230:デフォルトの名無しさん
07/10/20 19:12:41
"abc\04def"とも書けなっかったかな。
\04は8進表記。


231:デフォルトの名無しさん
07/10/20 20:04:00
doble型の変数をprintfで表示するときには整数で表示するにはどうしたらいいですか?


232:デフォルトの名無しさん
07/10/20 20:08:21
double x = 1;
printf("%d\n", (int)x);
こうか?

233:デフォルトの名無しさん
07/10/20 20:08:42
>>231
%.0f

234:デフォルトの名無しさん
07/10/20 20:09:56
>>232
>>233
どちらでもできました!ありがとうございました

235:デフォルトの名無しさん
07/10/20 20:30:34
今までCとC++は同じものだと思っていたけれど、
MFCを使ったC++プログラミングは、C言語と似ているようで
似ていないですね。

236:デフォルトの名無しさん
07/10/20 20:36:52
C++はCの拡張だから、Cと同じように書くこともできる
単にC++をCとして使ってただけだろ

237:デフォルトの名無しさん
07/10/20 20:37:27
BetterC

238:デフォルトの名無しさん
07/10/20 20:40:47
CとC++は全然違う言語だと思ってもいいよ
クラス、例外処理、テンプレート、新たに覚えることはたくさんある

239:デフォルトの名無しさん
07/10/20 21:02:21
>>238 の言うとおり、別物と認識した方がいい。
同じだと思っている人と一緒に仕事するとよーっくその事を実感することになる。

240:デフォルトの名無しさん
07/10/20 23:10:59
引数の数が可変の関数の作り方を勉強したのだが、
printfって、%fでdouble型もfloat型も受けるよな?

それが、よく分らなくなった。

double型とfloat型って、サイズが違うはずだから、
引数から取り出すとき、区別がつかなくて、おかしくならないか?


241:デフォルトの名無しさん
07/10/20 23:13:34
URLリンク(www.kijineko.co.jp)

というわけで、可変引数だと暗黙的にfloatはdoubleに変換されるらしい


242:デフォルトの名無しさん
07/10/20 23:13:52
可変引数では int以下→int、float→double になる

243:デフォルトの名無しさん
07/10/20 23:50:12
>>240
でもそういうのってコンパイラによって違うのでは?
それってANSI Cで決められてたっけ?

244:デフォルトの名無しさん
07/10/21 00:07:10
>>243
ANSIというか規格で決まっている。
floatは受ける型がわからない関数に渡されるときはdoubleに格上げされる。
これはプロトタイプの与えられていない関数の引数、あるいは可変引数のときに起こる。

なので、printfに渡すときはfloatもdoubleもどちらもdoubleとして渡されることになる。

似たようなことがcharにも言えて、これはintに格上げされる。

245:デフォルトの名無しさん
07/10/21 01:21:25
ちょっと聞きたいんだけど
#include "myheader.h"

int main(){

int list_num[100];
FILE *fp;
int i;
char buf[100][30];

というプログラムの最初の部分において

gcc -c main.c
main.c: 関数 `fgword' 内:
main.c:3: error: 文法エラー before '{' token
main.c:9: error: 文法エラー before "fp"
make: *** [main.o] エラー 1

main関数内でいきなりこういうエラーがでるんだけど
どういうことなんでしょうか?
main関数内にfgwordは使ってないんですけど


246:デフォルトの名無しさん
07/10/21 01:22:49
たぶん myheader.h の中がおかしい

247:デフォルトの名無しさん
07/10/21 01:35:24
myheader.hの中身のプロトタイプの
int fgword(int);
にセミコロンがなかったからこういうエラーがでたようです。
ありがとうございます。

突然こんなエラーでてきてびびった。


248:デフォルトの名無しさん
07/10/21 03:41:30
デスクトップパソコンで
処理させるのと
ノートパソコンで処理
させるのと
音が違うな。
デスクトップはうるさくてやってられない。
実行に10分くらいかかるプログラムを動かしてるとき
デスクトップだとかなり沸いてくるし。

249:デフォルトの名無しさん
07/10/21 03:45:40
URLリンク(videointroplayer.web.fc2.com)

250:デフォルトの名無しさん
07/10/21 12:38:50
1bitのファイルはつくれるんでしょうか?
charだと8bitになってしまいます

251:デフォルトの名無しさん
07/10/21 12:39:12
char* ch;
ch = "test1";
ch = "test2";

↑で"test2"を代入した時点でメモリリークしてますか?

252:デフォルトの名無しさん
07/10/21 13:11:01
>>251
メモリリークの意味を考えてください
確保したメモリを使用後も開放せずにいることですよ
で、それは該当すると思いますか?
そもそも領域確保していないのに

253:デフォルトの名無しさん
07/10/21 13:13:03
>>251
「動的に」が抜けてた

静的に確保されたものは終了後、自動的に開放されます


254:デフォルトの名無しさん
07/10/21 13:59:07
スレッドが開始される前に、mainで全ての処理を終えてしまうようです
そのためスレッド稼働中の判定がうまくいきません どうしたらいいですか?

#include <process.h>
#include <stdio.h>
#include <windows.h>

void fnc(void *p){
int m=(int) p;
Sleep(m*400);
printf("%d end\n",m);}

main(){
HANDLE m[10]; DWORD tp[10];
int n=0,k;
for(k=0;k<10;k++)tp[k]=0;k=0;
while(n<100){
GetExitCodeThread(m[k], &tp[k]);
if(tp[k]!= STILL_ACTIVE){
m[k]=reinterpret_cast<HANDLE>(_beginthread(fnc, 0, (void *)n));n++;}
k++;}
Sleep(10000);}

255:254
07/10/21 14:04:27
まちがえました

256:254
07/10/21 14:11:11
HANDLE m;
DWORD flg;

m=reinterpret_cast<HANDLE>(_beginthread(fnc, 0, NULL));
このようにスレッドを開始したとき、スレッドが終わると次の関数を終了コードを返すはずですよね?
GetExitCodeThread(m, &flg);

なんかいつまでもアクティブのままなんですが

257:254
07/10/21 14:18:10
_beginthreadは終了しても終了コード返しませんか?

258:デフォルトの名無しさん
07/10/21 14:20:02
なんかクリエイトスレッドは、不都合があるってかいてあったんですけどこっちのほうがいいですか?

259:デフォルトの名無しさん
07/10/21 14:29:28
URLリンク(msdn2.microsoft.com)(VS.80).aspx

>start_address で起動されるルーチンは、__cdecl 呼び出し規約を使用する必要があり、戻り値を持つことはできません。

260:デフォルトの名無しさん
07/10/21 14:36:49
_beginthreadexを使ったらうまくいきました

261:デフォルトの名無しさん
07/10/21 14:56:09
質問なんですけど、全てのスレッドが終了したら停止したいんですけど、最後の部分の判定は駄目なんでしょうか?
なんか作業が終わる前に停止してしまいます

#include <process.h>
#include <stdio.h>
#include <windows.h>
#define ThreadNum 100

unsigned __stdcall fnc(void* p){
int m=(int) p;
Sleep((m%10)*10);
printf("%d end\n",m);}

main(){
HANDLE m[ThreadNum];
DWORD tp[ThreadNum];
int n=0,k;
for(k=0;k<ThreadNum;k++)tp[k]=100;k=0;
while(n<100){
GetExitCodeThread(m[k], &tp[k]);
if(tp[k]!= STILL_ACTIVE){
m[k]=reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL));n++;}
k++;if(k>=ThreadNum)k=0;}

do{n=0;
for(k=0;k<ThreadNum;k++){
GetExitCodeThread(m[k], &tp[k]);
if(tp[k]!= STILL_ACTIVE)n++;}
}while(n>=ThreadNum);
}

262:デフォルトの名無しさん
07/10/21 14:57:22
すべてのスレッドがアクティブでは無いとすれば、作業が全てすんでいると思うのですが

263:デフォルトの名無しさん
07/10/21 14:57:52
いい加減スレ違いだって気づけ

264:デフォルトの名無しさん
07/10/21 14:58:41
すみません 解決しました
一番最後は
while(n<ThreadNum);
でした

265:デフォルトの名無しさん
07/10/21 15:19:53
停止を待つなら
for(n=0; n<ThreadNum; n++)
{
if(m[n]) WaitForSingleObject(m[n], INFINITE);
}

というかreinterpret_castってC++じゃねーかww

266:デフォルトの名無しさん
07/10/21 15:30:27
>>265
それはEXではない方の場合でしょうか?

267:デフォルトの名無しさん
07/10/21 15:34:46
マルチスレッドという時点でVisual C++依存
よってCの範疇ではないのでスレ違い

268:デフォルトの名無しさん
07/10/21 15:46:23
マルチスレッドなんて素人が無理に使うもんじゃないよ。


269:デフォルトの名無しさん
07/10/21 16:16:06
こういう簡単なポインタに関するプログラムがあるんですが、
実行するマシンによって(無論コンパイルはそのコンピュータ上でやり直している)
値が変動したりしなかったりします。
どうしてでしょうか?
---------------------------------------------------
#include <stdio.h>
main(){
int i,*x;
x=&i;
*x=1;
printf("x=%o *x=%d\n",x,*x);
}
---------------------------------------------------
コンパイルコマンドは gcc hoge.c
以下は4回分の出力を横に並べたもの

Fedora7
x=27775464634 *x=1, x=27747676054 *x=1, x=27773760474 *x=1, x=27764163514 *x=1

Vine
x=27767545704 *x=1, x=27770645104 *x=1, x=27777542624 *x=1, x=27775054324 *x=1

OS X(10.3)
x=27777776240 *x=1, x=27777776240 *x=1, x=27777776240 *x=1, x=27777776240 *x=1

HP-UX
x=17777772540 *x=1, x=17777772540 *x=1, x=17777772540 *x=1, x=17777772540 *x=1


270:デフォルトの名無しさん
07/10/21 16:19:54
*xの値が変わってないんならどうでもいいことじゃね?

271:デフォルトの名無しさん
07/10/21 16:21:56
OSのメモリ管理法にもよるだろ。

272:デフォルトの名無しさん
07/10/21 16:24:15
>>269
xは変数iのアドレス(スタック上の)
OSによって異なるだろうし、同じOSでもコンパイラによっても異なる

273:デフォルトの名無しさん
07/10/21 16:27:19
質問があるんですが

int input(char *pstr1)
{
char *ppstr1;

fgets(pstr1,SIZE_ARR,stdin);
fflush(stdin);
ppstr1=strchr(pstr1,'\n');
if(ppstr1!=NULL){
*ppstr1='\0';}
return 0;
}

このコードは、fgets関数で読み込んだ文字列から改行記号を探し
ヌル文字と改行文字を入れ替えをするということをしてるんですが
「*ppstr1='\0';」は、なぜ間接演算子抜きの「ppstr1='\0';」ではダメなんでしょうか
ご教示ください

274:デフォルトの名無しさん
07/10/21 16:30:24
>>270-272
なるほど、ありがとうございました。

275:デフォルトの名無しさん
07/10/21 16:39:43
>>273
strchrは見つかった場所へのポインタを返すから、char *型のppstr1で受け取ってるだろ?
char *型、つまりアドレスを表してるわけだから、ppstr1だけだと、その見つかった場所のアドレスになるんだ。
だから、アドレスを書き換えても意味がない。
ここでやりたいのは改行をヌル文字に変える作業だから、ppstr1というポインタを介して値を変更しないといけない。
だから、間接参照演算子を使って代入作業を行わないと駄目ってこと。

276:デフォルトの名無しさん
07/10/21 16:43:25
>>273
ところでstdinからfgetsで取得したデータの改行は\0に変換されていなかったっけ?
まちがっていたらソマソ

277:デフォルトの名無しさん
07/10/21 16:45:34
>>276
変換というより、最後に\0を付加するんだよ。

278:デフォルトの名無しさん
07/10/21 16:49:55
>>276
そいつは多分getsと勘違いしてるとオモ。
getsは最後の改行コードを文字列に含まない。
fgetsは改行コードを文字列に含む。

279:276
07/10/21 16:54:10
>>278
なるほど納得

280:273
07/10/21 16:56:00
>>275
なるほど・・・
易しい説明どうもありがとうございました!

281:デフォルトの名無しさん
07/10/21 16:58:54
地銀はマーチが多いよ

282:デフォルトの名無しさん
07/10/21 17:00:34
↑誤爆

283:デフォルトの名無しさん
07/10/21 17:00:41
大文字か小文字かどっちだ?

284:デフォルトの名無しさん
07/10/21 17:34:01
一般的に、スレッドの関数はインライン展開できますか?

285:デフォルトの名無しさん
07/10/21 17:40:37
>>284
日本語でおk

286:デフォルトの名無しさん
07/10/21 17:41:03
for ( k=0; k<10; k++ ) x+=f(k); というのはインライン展開しませんか?

x= f(0) + f(1) + ・・・ だとインライン展開しますか?

287:デフォルトの名無しさん
07/10/21 17:46:41
内部でfor, while, switchを使った関数はinllineの指定をしてもinline展開されないみたいだよ

288:デフォルトの名無しさん
07/10/21 17:48:40
それならprintfを使っても駄目ですよね

289:デフォルトの名無しさん
07/10/21 20:17:10
初歩的な問題ですみません。

等比数列の初項aと公比rを入力し、格項の値とn項までの総和を計算し出力せよ。ただし、r!=1とする。(for文を使用する)

等比数列: a, ar, ar^2,・・・・・ar^(n-1)
等比数列の和:Sn=a+ar+ar^2+・・・・+ar^(n-1)


for文の部分だけでもお願いします。

290:デフォルトの名無しさん
07/10/21 20:18:41
それは質問じゃないだろ
宿題スレ行け

291:デフォルトの名無しさん
07/10/21 20:22:34
>>288

printfは非inlineな関数だから関係ないような気がするけど…。

292:デフォルトの名無しさん
07/10/21 20:22:44
>>290
申し訳ない。宿題スレの存在しらなかったっす

293:名無し
07/10/21 21:58:06
配列名のsumって何?

294:デフォルトの名無しさん
07/10/21 22:01:21
英和辞書にでも聞け

295:名無し
07/10/21 22:12:13
なるほど。

296:デフォルトの名無しさん
07/10/22 15:14:45
void add1(int i);
int add2(int i);
void add3(int *p);
int main(void)
{
int n; /* n の値の変化に注目する */
    printf("Input integer: ");
scanf("%d", &n);
printf("Original: %d \n", n);

???????; /* 関数add1 に nを適用する */
printf("After Add1: %d \n", n); /* 関数add1 を適用した後の nを表示する */
printf("Add2: %d \n", ???????); /* nを適用した関数add2 の値を表示する */
printf("After Add2: %d \n", n); /* 関数add2 を適用した後の nを表示する */
     ???????; /* 関数add3 に nを適用する */
printf("After Add3: %d \n", n); /* 関数add3 を適用した後の nを表示する */
return 0;
}
void add1(int i) /* i に1を加えて,表示する */
{
???????}

int add2(int i) /* i に1を加えた値を返す */
{
???????
}
void add3(int *p) /* ポインタの指す値に1を加えて,表示する */
{
???????
}
????の部分を埋めてください。

297:デフォルトの名無しさん
07/10/22 15:17:57
そういうのは宿題スレへ
スレリンク(tech板)

298:デフォルトの名無しさん
07/10/22 16:09:03
VS2005でC言語の勉強をしています。

char str[]="日本語";

のような感じで、文字列リテラルとしてUTF-8を指定することは可能でしょうか?
ソースの文字コードをUTF-8にしても、strにはSJISのコードが入ります。

299:デフォルトの名無しさん
07/10/22 18:15:23
wchar_t str[] = L"日本語";

で UNICODE が使える。文字コードは処理系依存
どうしても UTF8 が必要なら変換するしかないと思う。

300:デフォルトの名無しさん
07/10/22 18:27:11
配列を大量に使ってプログラム書いてるときに気をつけないといけないことはなに?
領域こえたらセグメンテーションでるのはわかる。

301:デフォルトの名無しさん
07/10/22 18:29:18
>>300
全然分かってないじゃん

302:それはセグメンテーションフォルトだろう
07/10/22 18:30:41
>>300
おまえは何か勘違いしている。領域を越えたらセグメンテーションが出ると言うわけではない。

303:デフォルトの名無しさん
07/10/22 18:40:05
わかってないからきいてんじゃん

304:デフォルトの名無しさん
07/10/22 18:42:01
配列を大量に使うプログラムにろくなのが無いこと

305:デフォルトの名無しさん
07/10/22 18:43:36
あれをリストで実装はできない

306:デフォルトの名無しさん
07/10/22 18:46:45
どんなアルゴリズム?

307:デフォルトの名無しさん
07/10/22 20:18:18
配列好きだけど

総素数の最大数が分かっているときはリストなどより配列を使ったほうが
プログラムは簡単になるし、性能もいいのができる。

ただし、以下のことは注意しなくてはいけない。
1.要素数の最大値が決まっていないとき
  最大数を超えたときにリアロケートするという手もあるが、そういう時はリストにする。
2.中身がスカスカの配列
  メモリーの無駄。メモリーが十分あればそれでも良い。
3.配列が確保できない
  スタック上に配列を作成するときはよくある。
  こういうときはヒープは外部変数にとる。

308:デフォルトの名無しさん
07/10/22 22:40:56
fgetsで入力のおわりを'\0'にする方法ってありますか?
scanfだと空入力したとき結果が出ないし
getsは禁止らしいので
fgetsしか使う方法がないのですが・・・

309:デフォルトの名無しさん
07/10/22 22:43:06
>>308 >>273

310:デフォルトの名無しさん
07/10/22 23:40:50
>>308
fgetsで読み込まれた文字列の改行文字の後は'\0'です。
改行文字を含めたくないなら 273 の方法です…。

311:デフォルトの名無しさん
07/10/22 23:48:13
fgetsは自動的に\0で終わる
改行文字が付いてるのを気にしないなら何もする必要なし

312:デフォルトの名無しさん
07/10/23 01:06:28
img_data = (HOGE)malloc( sizeof( GEHO ) * img_height );
for ( int i = 0; i < img_height; i++ ) {
img_data[i] = (HOGE)calloc( sizeof( GEHO ), 3 * img_width );
}
とメモリを確保した場合、どのようにメモリを開放したらいいのでしょうか?

313:デフォルトの名無しさん
07/10/23 01:45:44
for ( int i = 0; i < img_height; i++ )
free(img_data[i]);

free(img_data);

314:デフォルトの名無しさん
07/10/23 01:53:37
>>312
img_dataの型がよく分からないのだが……
img_dataもimg_data[i]も両方HOGE型てなんなん

int **ar,i;
ar = (int**)malloc(sizeof(int*)*HEIGHT);
for(i=0; i<HEIGHT; ++i) ar[i] = (int*)malloc(sizeof(int)*WIDTH);
こういうのをイメージしてるなら、こう↓
for(i=0; i<HEIGHT; ++i) free(a[i]);
free(ar);

315:デフォルトの名無しさん
07/10/23 02:12:47
>>307
ありがとう。
種類の違うデータを二次元配列にいれたりしてるんだけど、
printfで表示させてもあっているのに、
あるアルゴリズムをかけると変な値がでるんだよなー。

ある空白の二次元配列の1行ずつに、違う二次元配列の1行ずつを代入して
足し算していくような感じのプログラムなんだけど。
計算が対数計算だから場合わけが非常に精密にしないとだめなんだよね。



316:312
07/10/23 02:13:07
ありがとうございます。
img_dataを開放しても、img_data[i]は開放されないんですね。



317:プリンがー
07/10/24 00:15:56
1から10の2乗を3桁で表示するプログラムを作れ。

#include<stdio.h>
void main (void)
{
int x i;
double y;

for(i=0;i<=9;i++){
printf("数値を入力して下さい");
scanf("%d",&x);

y=x*x;

printf("y=%3lf\n",y);

}
return0;

}




であってますか?


318:デフォルトの名無しさん
07/10/24 00:24:43
>>317
10の二乗は?
というか、実行すればいいだろ

319:デフォルトの名無しさん
07/10/24 00:28:55
>>312
exit(0);

320:318
07/10/24 00:29:56
>>317
ごめ 間違えた
#include<stdio.h>
int main(void)
{
int i, x;
for(i=1;i<=10;i++){
printf("%d の二乗を入力して下さい : ", i);
scanf("%d", &x);
printf("%3d\n", x);
}
return 0;
}

321:デフォルトの名無しさん
07/10/24 01:00:02
printf("%3d\n", x);
printf("%3d\n", x);
printf("%3d\n", x);

322:デフォルトの名無しさん
07/10/24 02:18:57
コマンドプロンプトでコンパイルするような
無償コンパイラが欲しいんですがないですか?

323:デフォルトの名無しさん
07/10/24 02:20:05
問題に反してるだろ?1~10の二乗を表示なのに、11以上の二乗も表示できるようになっとるぞ?フローチャートなどで考えたらどうだ?ただプログラムを組むだけでは、上達しないよ。

324:318
07/10/24 06:12:02
>>322
MinGW
Visual C++ 2005 Express
Lcc
cint
LSI-C86 評価版

325:318
07/10/24 06:13:11
printf("%d の二乗を入力して下さい : ", i);
scanf("%d", &x);

x=i*i;

326:デフォルトの名無しさん
07/10/24 10:29:58
>フローチャートなどで考えたらどうだ?
なるほど、>323のようになれると。

327:デフォルトの名無しさん
07/10/24 12:04:28
>>322
Turbo-C 2.01
URLリンク(bdn.borland.com)
お薦め。

328:プリンがー
07/10/24 12:29:22
プログラム演習の初心者からできるいい問題集ありませんかね?
大学生協は置いてなくて・・・
講義では問題解くってことはしないのでorz

329:318
07/10/24 12:41:42
>>328
推薦図書/必読書のためのスレッド 37
スレリンク(tech板)

330:デフォルトの名無しさん
07/10/24 12:42:28
Boland C++ Compiler
が抜けてるな

331:プリンがー
07/10/24 12:53:45
>>318
プログラムってどこで実行できるんすか??


332:デフォルトの名無しさん
07/10/24 12:54:43
NG

333:takumi
07/10/24 14:13:59
XPでvisualstudioを使ってます。
問題:長さ100のint型配列 int a[100]がある。a[0]~a[99]には整数が収められているする。
この100個の中で一番小さい数を求め、画面に出力するプログラムを作成せよ。
出力形式は「ans.=???」とせよ。???の部分は答え。

なんですが、全くわからないので教えて下さい。。

334:デフォルトの名無しさん
07/10/24 15:08:21
宿題スレへ
スレリンク(tech板)l50

335:デフォルトの名無しさん
07/10/24 16:24:03
コテ付目欄空欄…
どこの中学生掲示板だよ

336:デフォルトの名無しさん
07/10/24 17:59:26
つか入力がわかっているのになぜscanfを使う必要あるんだよ。

337:デフォルトの名無しさん
07/10/24 21:19:58
未経験ということでソフトウェア開発企業に入社したんだけど、whileのところで早速詰まった('A`
0~9 までの数字を、0 から1個ずつ増やしながら 10行表示しなさいっていうプログラムを作るんだけど、
0
01
012
0123
01234
012345・・・
とはならずに
0
1
2
3
4
ってなっちゃいます。というかそういう風に書いてるのもわかるんですが、
#include <stdio.h>
int main(void)
{
int a = 0;

a = 0;
while(a < 10)
{
printf("%d\n" ,a);
a++;
}

return 0;
}
↑whileの中をどうすればいいんでしょう・・・。

338:デフォルトの名無しさん
07/10/24 21:26:55
while(a < 10)
{
int b = 0;
while(b <= a)
{
printf("%d", b);
b++;
}
printf("\n");
}

339:デフォルトの名無しさん
07/10/24 21:29:01
#include <stdio.h>
int main(void)
{
int a,b;

for(a=0;a<10;a++)
{
for(b=0;b<=a;b++)printf("%d" ,b);
printf("\n");
}

return 0;
}

340:デフォルトの名無しさん
07/10/24 21:32:40
>>338
ああああありがとうございます!
whileの中にwhile使うとは盲点。
流れも理解できましたありがとうございます!

341:デフォルトの名無しさん
07/10/24 21:35:51
>>340 for文を使ったほうがベター

342:デフォルトの名無しさん
07/10/24 21:38:14
そこまで出来ないでよく仕事になるな 入って2週間以内とかか? それならいい

343:デフォルトの名無しさん
07/10/24 21:38:43
>>341
そうなんですよね。
他にもwhileを使って、2個入力した文字列が、同じ文字列かどうか判断するプログラムを作ったんですが、
ifelse使った方が手っ取り早かったり、一応基本中の基本ということで頑張ってますが、
とりあえずとことん覚えてみようと思います。

344:デフォルトの名無しさん
07/10/24 21:40:48
>>342
まだ3日目です('A`)('A`)('A`)
初日はOSインスコとかパソコンに関する事を教わって(というか何回もやってきた事なので余裕でした)
二日目は%dやらfloat=小数点やら、long=スゲーでかい数とか、配列とかを覚えて
本日三日目でif else for を覚えたんですが、whileがなんかスゴイ曲者というか、問題がクセものでてんてこ舞いです。。。

345:デフォルトの名無しさん
07/10/24 21:44:45
>>343
実戦力高めるならSTLだな
たとえば2つの文字列比較するならこうやればいい

#include <iostream>
#include<string>
using namespace std;

main(){
string a,b;
a="こんにちは"; b="こんばんわ";
cout<<a<<" と "<<b<<"は ";
if(a==b)cout<<"一致"; else cout<<"違う";
}

346:デフォルトの名無しさん
07/10/24 21:59:46
行列を計算するときにライブラリって使えるの?
固有値を求めたいんだけど。

347:デフォルトの名無しさん
07/10/24 22:09:40
>>345
初心者(それも++じゃなくてCっぽい)にそんなこと教えたら、
同じ文字列が入ったchar配列を==比較して「あれ? 同じのはずなのに……」てことになるぞ

348:デフォルトの名無しさん
07/10/24 22:16:49
>>346
標準ライブラリーにはない
特殊な科学技術計算用のライブラリーを手に入れるか、自作するか

349:デフォルトの名無しさん
07/10/25 08:26:44
>>346
clapack

350:デフォルトの名無しさん
07/10/25 22:25:22
typedef struct{
int hoge;
int hage;
int hige;
int huge;
} HOGE;
と言う構造体があるとして、hoge = 1; hage = 0; hige = 1; huga = 1;となっているとします。
その構造体の中で、値が"1"になっている物を見付けたいのですが、そういうことはできないですか?
構造体内の変数の値を調べ、それが条件にあっていれば別々の処理をしたいです。


351:デフォルトの名無しさん
07/10/25 22:28:28
Cじゃムリ。
リフレクションのある言語ならできる。

352:デフォルトの名無しさん
07/10/25 22:39:37
意味がわからんぽ

メンバ名で参照したくないって事?
構造体先頭からのオフセットでアクセスするとかかな

353:デフォルトの名無しさん
07/10/25 22:50:11
>>350
配列にしない(できない)理由はあるの?

typedef union{
struct{
int hoge;
int hage;
int hige;
int huge;
}
int array[4];
} HOGE;

354:350
07/10/25 22:57:44
>>353
なんですかそれは…
始めてみました。 意味がちょっとわかりません…
その形にしておいて、
HOGE u_hoge;
....
u_hoge.array[0]にしたら、hogeにアクセスできるって事ですかね?

355:デフォルトの名無しさん
07/10/25 22:58:37
共用体でググってくるんだ!

356:デフォルトの名無しさん
07/10/25 23:55:24
だんだんと解ってくると、プログラム書くのが面白くなってくるなぁと思った超初心者な俺。

357:デフォルトの名無しさん
07/10/26 00:26:59
fgetsで入力した後'\n'を消す方法はありますか?
あまりポインタは使いたくないんですが・・・

358:aho
07/10/26 00:29:26
>>350
構造体のポインタを利用してみました。

#include <stdio.h>

typedef struct{
int hoge;
int hage;
int hige;
int huge;
}HOGE;

int main(){
HOGE* hogep = NULL;
try{
hogep = new HOGE();
}catch(...){
printf("new error!\n");
}
/* メンバ変数の初期化 */
hogep->hoge = 1;
hogep->hage = 0;
hogep->hige = 1;
hogep->huge = 1;

printf("%d\n", hogep->hoge);

return 0;
}

359:デフォルトの名無しさん
07/10/26 00:40:51
>>357
fgets(buf, n, fp);
if (buf[strlen(buf) - 1] == '\n') {
buf[strlen(buf) - 1] = '\0';
}

・・・?

360:デフォルトの名無しさん
07/10/26 00:44:21
>>357
fgets(buff, sizeof buff, stdin);
for(i=0; buff[i]; i++) if(buff[i]=='\n') { buff[i] = '\0'; break;}

361:デフォルトの名無しさん
07/10/26 01:39:24
C++Compiler / Turbo Debugger をzipから解凍したらフォルダに何も入ってなかったんだけど・・・
どこでパス入力するの?

362:教えてください
07/10/26 03:23:34
C言語についての質問です。
下記の素数か素数でないか調べるコードで、
①変数名にis_primeとありますが、isは何を意味しているのですか?
②is_prime = 1;とするのがわかりません。
③以下、return 0; まで、どういう流れかわかりません
よろしければ1行ずつ教えてもらえるとうれしいです。

#include <stdio.h>

int main(void)
{
int num, i, is_prime;

printf("判定したい数を入力してください: ");
scanf("%d", &num);

/* 約数があるかどうか調べる */
is_prime = 1;
for(i=2; i<=num/2; i=i+1)
if((num%i)==0) is_prime = 0;

if(is_prime==1 && num > 1) printf("素数です");
else if (num > 1) printf("素数ではありません");

return 0;
}

363:デフォルトの名無しさん
07/10/26 03:44:59
num is_prime なんだろ

364:デフォルトの名無しさん
07/10/26 08:08:18
>>362
適当な数字入れて処理追いかけてみろよ。

365:デフォルトの名無しさん
07/10/26 08:13:38
なんにもわかってないってことかよw

366:デフォルトの名無しさん
07/10/26 11:02:57
>>362
You is fool.

367:デフォルトの名無しさん
07/10/26 11:26:14
>>361
解凍しなおしてみたら?

368:デフォルトの名無しさん
07/10/26 12:54:26
You are Shock!

369:デフォルトの名無しさん
07/10/26 13:24:17
atofとか解読できなさそうだな

370:デフォルトの名無しさん
07/10/26 13:55:39
数値計算において
不等号の>>と>の判別ってプログラム的にどうすべきですかね?

計算は対数でするんだけど。

371:デフォルトの名無しさん
07/10/26 14:35:43
差が閾値を越えるかどうかで判定
もしくは比が閾値を越えるかで判定

372:デフォルトの名無しさん
07/10/26 15:09:54
その問題では>>と>=で計算方法違うんだよ。
今計算してみると対数の値をexpかけてみて値をみていくと
値がかわってくるのが差が10から15あたりのときみたいだから
閾値を15で計算をかえてみることにするわ。


373:デフォルトの名無しさん
07/10/26 15:49:02
for(;loc<100;loc++){
if(loc<100){
 printf("氏名を入力して下さい(空白で終了):\n");
 fgets(data[loc].namae,39,stdin);←この行
 if(!*data[loc].namae)break;
 printf("電話番号を入力して下さい:\n");
 fgets(data[loc].denwa,39,stdin);
 printf("市外局番を入力して下さい:\n");
 fgets(str,9,stdin);
 data[loc].sigai=atoi(str);
}
}
上の行のfgetsをgetsに変えるとEnterでbreakするんですけど
fgetsのままでは動作しません。どうすればfgetsのままで動作しますか?

374:デフォルトの名無しさん
07/10/26 16:10:04
>>367
何回解凍しなおしてもダウンロードしなおしても空…
zipファイルはちゃんと容量あるのに解答してできたフォルダには容量が全くなくなる。

375:デフォルトの名無しさん
07/10/26 16:15:36
>>374
解凍ソフトは何?
パス付きに対応してないやつなんじゃね?

376:デフォルトの名無しさん
07/10/26 16:17:32
>>373
fgetsは改行も取り込むから、

fgets(data[loc].namae,39,stdin);
if(data[loc].name[0] == '\n') break;
これでおk

377:デフォルトの名無しさん
07/10/26 16:26:35
>>376
出来ました。ありがとうございます。

378:デフォルトの名無しさん
07/10/26 16:30:47
fgetsの解説ですが
URLリンク(ohmoriws1.ms.kagu.tus.ac.jp)
ここは間違ってる?もしくは誤解される様な感じなのですか・・?

一度参考にしたんですが・・。

379:デフォルトの名無しさん
07/10/26 16:46:34
>>378
'\n'を取り除くとも書いてないから間違いとは言えない。
しかし、その直後のfputs()の説明が間違っているから信用できない。

380:デフォルトの名無しさん
07/10/26 17:20:43
すいません超絶初心者な僕に教えて頂きたいことがあるます

1行64バイトのファイル(行数可変)のデータに何回も文字列の検索を行ういアウトプットするプログラムを作っています。
fgetsを使い何回もファイルを読み込んで一行ずつ比較するというようにできたにはできたのですが、
行数可変で多い場合100000行超えたりするファイルに対してはえらい時間がかかります。

メモリにぶちこんでそこから何回も検索を行いたいと思うのですが、どう組んだらいいでしょうか。

381:これ参考に
07/10/26 17:37:47
#include <stdio.h>
#include <time.h>
#include <string.h>
int N;
void serch(char* x,char* str,int* adr){
char t[256];int n,M,k,su=0;
for(M=0;;M++)if(str[M]=='\0')break;
for(n=0;n<256;n++)t[n]=M;
for(n=1;n<=M;n++){k=(unsigned char)str[M-n];if(t[k]==M)t[k]=n;}
n=0;while(1){
for(k=0;k<M;k++)if(str[k]!=x[n+k]) break;
if(k==M){adr[su]=n;su++;n+=M;}
else {k=(unsigned char)x[n+M];n+=t[k];}
if(n+M>=N){adr[su]=-1;return;}}}

main(){
N=18000000;char *x=new char[N];N=0;
char buf[120],k,n;
FILE *fp=fopen("2ch.txt","rb");
while(k=fread( buf,1,100,fp)){
for(n=0;n<k;n++)x[N+n]=buf[n];N+=k;}
fclose(fp);
printf("データロード完了!\n測定中です・・・\n");
int adr[30000];
char str[]="名無し";
serch(x,str,adr);
}

382:デフォルトの名無しさん
07/10/26 18:07:20
>>381
変数の使い方、変数の名前が気持ち悪い

>>380
malloc,realloc使うべし

383:デフォルトの名無しさん
07/10/26 18:08:40
あ、いや、バイナリならftellとfseekでサイズが分かるから、
reallocはいらないやも

384:デフォルトの名無しさん
07/10/26 18:24:22
>>381さん
ありがとうございます

>>382さん
mallocを使った場合どのように組めばいいでしょうか?

385:デフォルトの名無しさん
07/10/26 18:35:14
一番簡単な方法おしえてやる

386:デフォルトの名無しさん
07/10/26 18:36:04
>>375
ありがとう。
解凍ソフト変えたらできた。

387:デフォルトの名無しさん
07/10/26 18:53:06
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main()
{
fstream fp("test.txt");
string str,buf;
do{
fp >> buf;
str+=buf;
}while((!fp.eof()));
int n=str.find("会議");
cout << n;
}

388:デフォルトの名無しさん
07/10/26 18:53:49
>>381
だからその入力ロジックを何とかしろって

389:デフォルトの名無しさん
07/10/26 19:06:04
>>384
適当に書いた例だけど

FILE *fp;
char *data;
... //省略
data = (char*)malloc(sizeof(char) * 128); /とりあえずchar128個分確保
if(data==NULL) return 1; //エラー処理
int i=0,size=128;
while((data[i] = getchar()) != EOF){
if(++i >= size){
char *tmp;
tmp = realloc(data,sizeof(char) * (size + 50)); //50ずつ拡張
if(tmp == NULL){
/* reallocは元の領域を解放するが、失敗時は解放せずにNULLを返す
そのため、失敗時に解放できるように、別変数で一度戻り値を受けてから、エラーチェックする */
free(data); //mallocやreallocで確保した領域は必ず解放する
return 1;
} else {
data = tmp;
size += 50;
}
}
}
free(data) //必ず解放

390:デフォルトの名無しさん
07/10/26 20:26:58
#include<stdio.h>

int A;
int B;
void X(int a[],int b[]){
printf("%d",a);
printf("%d",b);
}

void main(void){

//省略

X("A","B");

質問させてください
変数A Bを引数使って表示させたいんですけど、コマンドプロンプト?で実行させると警告がでてちゃんと表示されません。
どうすればいいでしょうか?

説明不足ですみませんがよろしくお願いします

391:デフォルトの名無しさん
07/10/26 20:29:39
関数の引数としてポインタを渡して、そのポインタの変数に値をいれているのですが、
関数を呼び出す時によって、値をいれる必要が無いときがあります。
不要な値のために変数を宣言したくないのですが、変数を宣言しないでいい方法などはありませんか?

hoge( &x, &y, &height, &width);
と呼び出すのですが、&heightと&widthの結果を使わないときもあるので、
int x, y; だけ宣言して、heightとwidthは変数宣言したくないと思っています。


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