2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C言語なら俺に聞け! Part 62

1 :v(^o^i)d:03/07/21 11:31
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

コンパイラを探しているなら >>2-13 を。
C machineはCに非ず
上記を逸した場合の結果は激しく未定義だYO!

C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

C言語なら俺に聞け! Part 61
http://pc2.2ch.net/test/read.cgi/tech/1057677056/

2 :デフォルトの名無しさん:03/07/21 11:32
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html

3 :デフォルトの名無しさん:03/07/21 11:41
>>3


4 :デフォルトの名無しさん:03/07/21 11:57
ι(´Д`υ)アツィー

5 :デフォルトの名無しさん:03/07/21 11:57
ポインタの表記に付いて教えて下さい。

1. char* string と
2. char *string では何が違うのでしょうか。

1.のほうは通常のポインタだと思うのですが2.のほうはどう言う内容を示してるのでしょうか。
御存知の方よろしくお願いします。

6 :デフォルトの名無しさん:03/07/21 12:03
>>5
1だと、
char* string,string2;
として書いたとき、string,string2両方ともポインタになるが、
2だと、
char *string , string2;
として書くと、stringのみがポインタで、string2は普通のchar型になる。

7 :デフォルトの名無しさん:03/07/21 12:03



























8 :デフォルトの名無しさん:03/07/21 12:06
>>5
全く同じ
char* mona,giko;
と書いてもgikoがポインタになったりゃ1000

9 :デフォルトの名無しさん:03/07/21 12:07
ははは
論理学の試験問題みたくなってきたな

10 :5:03/07/21 12:07
>6

早速のレスありがとうございます。
よく分かりました。

11 :5:03/07/21 12:08
>8の方もありがとうございます。

12 :デフォルトの名無しさん:03/07/21 12:11
>>10
よかったな。>>8は間違い>>6が正しいから釣られるなよ。

13 :デフォルトの名無しさん:03/07/21 12:21
>>6
> char* string,string2;
> として書いたとき、string,string2両方ともポインタになるが、

ならないよ。

14 :デフォルトの名無しさん:03/07/21 12:26
>>10
・・・自分で確かめるのがよろしいと思われ。 >>6 が嘘こいてる。

ってかこのやりとり全てがネタ?

15 :デフォルトの名無しさん:03/07/21 12:26
if (x) と if( x ) で意味が違ったら面白いことになりそうだな

16 :デフォルトの名無しさん:03/07/21 12:27
>>15
何いってるんだ?
アフォですか?

17 :デフォルトの名無しさん:03/07/21 12:31
>16


18 :デフォルトの名無しさん:03/07/21 12:35
#define M(x) xと#define M (x) xは意味が違うけど、これはプリプロセッサの話だからな。

19 :デフォルトの名無しさん:03/07/21 12:45
藻前ら釣られ杉

20 :デフォルトの名無しさん:03/07/21 12:50
ばかばっかーーーーーーーーーー

21 :↑MVP(´∀`):03/07/21 13:01
 

22 :デフォルトの名無しさん:03/07/21 16:45
>>5
基本は
型名 変数名;
だから
char* string;
と書くことをオススメします。
ついでに同じ行で複数の変数を宣言しない事をオススメします。

ただし年上の方から睨まれるという罠。

23 :デフォルトの名無しさん:03/07/21 16:47
C の人は char *string; の方を使う人が心もち多い。
俺は char* string; 使うがなー。
>同じ行で複数の変数を宣言しな
ければ、紛らわしいこともないし。

24 :デフォルトの名無しさん:03/07/21 16:59
配列へのポインタを宣言して代入できるものってなんですか?

char id[256];
char (*pId)[];
pId = id;

このままだとidは単にchar型のポインタなので
エラーでるのはあたりまえっちゃあたりまえなんですけど
配列の先頭アドレスなら代入できるのかなと思ってました。

25 :デフォルトの名無しさん:03/07/21 17:09
意味がわからん。

26 :デフォルトの名無しさん:03/07/21 17:13
pId = &id;

27 :デフォルトの名無しさん:03/07/21 17:18
>>26
それでもエラーがでます。

28 :sage:03/07/21 17:22
>>27
char (*pId)[256];

29 :デフォルトの名無しさん:03/07/21 17:30
>>28
おお、なるほど
これで配列のエイリアスがつくれるということですか。

30 :デフォルトの名無しさん:03/07/21 17:31
>>24
何をしたいのかわからん。

31 :デフォルトの名無しさん:03/07/21 17:34
ネタ?

32 :デフォルトの名無しさん:03/07/21 17:55
>>31
まだ起きてるよ

33 :デフォルトの名無しさん:03/07/21 19:29
>>22
>基本は
>型名 変数名;

誤り。
よって、これに立脚する話はすべて無効。


>>5よ、>>22のような主張は周りとの摩擦を起こしてまで
強情はっちゃだめだよ。>>22のような不勉強に陥るし、
何と言っても「解りやすく書くこと」はオナニーになったら
意味がない。1人で決めちゃだめなんだ。

34 :デフォルトの名無しさん:03/07/21 19:38
>>33
は誤り。




理由も書かずに否定するだけでそれが有効となる。
楽な世の中だな。

35 :デフォルトの名無しさん:03/07/21 19:46
>>34
K&R(邦訳)のP.150近傍を嫁

36 :デフォルトの名無しさん:03/07/21 19:54
>>35
int main(argc,argv)
int argc;
char *argv[];
{
printf("今時K&Rでつか。");
}

37 :デフォルトの名無しさん:03/07/21 20:04
K&Rって何だ?

38 :デフォルトの名無しさん:03/07/21 20:14
>>36
では、あなたの言う「基本」とは何か?
発明者の説明以上に説得力のある「基本」があるならそれを示せば済むはず。

39 :デフォルトの名無しさん:03/07/21 20:15
>>38
私は何も言っていません。

40 :デフォルトの名無しさん:03/07/21 20:24
>>36
main(argc,argv)
char *argv[];
{
extern char wara[];
puts(wara);
}

char wara[] = {
0x83,0x6f,0x83,0x4a,0x82,0xc9,0x82,0xb7,
0x82,0xe9,0x91,0x4f,0x82,0xc9,0x91,0x8a,
0x8e,0xe8,0x82,0xf0,0x92,0x6d,0x82,0xe8,
0x82,0xc8,0x3a,0x2d,0x70,0
};

41 :デフォルトの名無しさん:03/07/21 20:52
main() {
extern char giko[];
puts(giko);
exit(0);
}
char giko[] = {
0063,0065,0202,0252,0214,0276,0202,0301,
0202,0304,0202,0351,0202,0314,0202,0315,
0304,0327,0303,0336,0250,0274,0256,0305,
0331,0103,0202,0305,0202,0315,0202,0310,
0202,0255,0226,0173,0202,0314,0202,0261,
0202,0306,0202,0276,0202,0353,0077,0040,
0315,0337,0260,0274,0336,0202,0334,0202,
0305,0217,0221,0202,0242,0202,0304,0202,
0240,0202,0351,0202,0266,0202,0341,0202,
0310,0202,0242,0202,0251,0201,0102,0061,
0065,0060,0225,0305,0202,0301,0202,0304,
0202,0261,0202,0306,0202,0315,0221,0346,
0062,0224,0305,0202,0276,0202,0310,0201,
0102,0
};


42 :デフォルトの名無しさん:03/07/21 21:03
>>37

>>1

43 :デフォルトの名無しさん:03/07/21 23:47
>>39
年齢=レス番
こんぐらっちれいしょん!

44 :デフォルトの名無しさん:03/07/22 01:33
>>22 みたいなのは、ありがちなCの初心者。
つーか俺もCを触った当初はそんな風に考えたこともあった。

「基本は、『型名 変数名』」と言うなら、基本形じゃないケースが
あることを忘れるな。そしてそれがポインタの場合。


45 :デフォルトの名無しさん:03/07/22 01:37
ポインタは全てtypedefしているから問題なし。

46 :デフォルトの名無しさん:03/07/22 02:20
基本ってのは、typedef された型を使うときのが基本って気がする。

47 :デフォルトの名無しさん:03/07/22 03:25
「型名 変数名」って考え方は、何処から出てくるのだろうか…
一体、配列や関数ポインタの事を、どう解釈しているのだろうか…
とても気になる、今日この頃…

48 :デフォルトの名無しさん:03/07/22 03:27
配列や関数ポインタは全てtypedefしているから問題なし。

49 :デフォルトの名無しさん:03/07/22 03:31
基本ってのは、typedef された型を使うときのが基本って気がする。

50 :デフォルトの名無しさん:03/07/22 03:41
「型名 変数名」か・・・
int* hoge; は整数ポインタ型のhogeと解釈するのかな
俺は整数型のポインタhogeとしてint *hoge;って書くけど

51 :デフォルトの名無しさん:03/07/22 03:47
「型名 変数名」になってないのは
ポインタと配列(typedef されたものを除く)だ。
じゃぁ、そうなってるのは何か?
それを「基本」と呼ぶのは悪いことではない気がする。
なぜなら、ポインタでも配列でもない変数を一番よく使うからだ。

って、そもそも規格でも整数型と浮動小数点型を合わせて
「基本型」って呼んでるでしょー。

52 :v(^o^i)d:03/07/22 03:49
voidも

53 :デフォルトの名無しさん:03/07/22 04:13
void の変数なんか作れるか!

54 :デフォルトの名無しさん:03/07/22 04:38
>>51
【「基本」と言うのは、「応用」と組み合わせて使うべきだ】
【「例外」と組み合わせて使うべきではない】
と思う。
つまり、
【宣言方法は例外を除いて「型名 変数名」しかない】
と言うなら分かるが(↑が正しいかを別にして)、
「応用」が無いのに「基本」を使うのは、何か違うと思う

55 :デフォルトの名無しさん:03/07/22 04:47
なんでsizeof(void)ができるの?(´・ω・`)

56 :デフォルトの名無しさん:03/07/22 04:50
>>55
出来ません

57 :デフォルトの名無しさん:03/07/22 06:01
ここCスレなのにC++と混同してる奴が多すぎ。

58 :デフォルトの名無しさん:03/07/22 06:26
>>56
出来ます。
>>55
型だから

59 :デフォルトの名無しさん:03/07/22 06:36
何となく分かったかも
「型名 変数名」って考えてる人は、「型名 変数名 修飾子」で考えてて
「型名 → 修飾子 → 変数名」って解釈してるのかな…?

int i ;
俺的思考 → 「i」は「int型」
 よって → 「int型」の「i」
型的思考 → 「int型」の「i」
int * p ;
俺的思考 → 「p」は「ポインタ」その指す先は「int型」
 よって → 「int型」への「ポインタ」の「p」
型的思考 → 「intへのポインタ型」の「p」
int * p [4] ;
俺的思考 → 「p」は「サイズが4の配列」その配列は「ポインタ」その指す先は「int型」
 よって → 「int型」への「ポインタ」の「サイズが4の配列」の「p」
型的思考 → 「intへのポインタ型」の「サイズが4の配列」の「p」
int ( * p ) [4] ;
俺的思考 → 「p」は「ポインタ」その指す先は「サイズが4の配列」その配列は「int型」
 よって → 「int型」の「サイズが4の配列」への「ポインタ」の「p」
型的思考 → 「int型」の「サイズが4の配列」への「ポインタ」の「p」
int f ( char ) ;
俺的思考 → 「f」は「char型を引数とする関数」その返り値は「int型」
 よって → 「int型」の「char型を引数とする関数」の「f」
型的思考 → 「int型」の「char型を引数とする関数」の「f」
int ( * f ) ( char ) ;
俺的思考 → 「f」は「ポインタ」その指す先は「char型を引数とする関数」その返り値は「int型」
 よって → 「int型」の「char型を引数とする関数」への「ポインタ」の「f」
型的思考 → 「int型」の「char型を引数とする関数」への「ポインタ」の「f」

これ以上複雑にならなければ、こんな感じで、結構、楽に解釈できるのかも…

60 :デフォルトの名無しさん:03/07/22 06:41
>>58
出来ません
sizeof演算子は、関数型とvoid型以外のオペランドのサイズを返します
by 規格

61 :デフォルトの名無しさん:03/07/22 06:46
お前らまだやってんのか。

62 :結果発表:03/07/22 07:03
int *hensuu; /* ジジイ、ダサい */
int* variable; // 若者、オサレ

63 :これからの時代:03/07/22 07:33
int i=3;
int*PI=&i; // およそ3

64 :デフォルトの名無しさん:03/07/22 07:36
>>60
この場合コンパイルされるか?されないか?の話かと。

65 :デフォルトの名無しさん:03/07/22 07:41
>>64
手元にあるのでコンパイル出来るのはgccのみだが
まともな処理系ならエラーが出て当然(その他のコンパイラはエラーが出る)

66 :デフォルトの名無しさん:03/07/22 07:57
>>65
vc7でもコンパイルされるぞ。

67 :デフォルトの名無しさん:03/07/22 08:04
VC++6.0でもコンパイルできた。

68 :デフォルトの名無しさん:03/07/22 08:39
>>54
日本語を勉強し直してきませう。
対義語は1種類しか無いとは限らない。

69 :デフォルトの名無しさん:03/07/22 09:20
どれも違う。

基本⇔発展
応用⇔基礎
例外⇔原則

が正解。54も68も勉強が足りない。

70 :デフォルトの名無しさん:03/07/22 09:31
「基本的に」に対応する言葉は
普通「〜の場合は」だと思うが。

71 :デフォルトの名無しさん:03/07/22 12:39
だれも対義語の話なんかしてない

72 :デフォルトの名無しさん:03/07/22 18:14
#include <stdio.h>
void nfor(unsigned int n)
{
inti[10], j=0;
switch(n){
case 9: for(i[9]=0; i[9]<=1; ++i[9])
case 8: for(i[8]=0; i[8]<=1; ++i[8])
case 7: for(i[7]=0; i[7]<=1; ++i[7])
case 6: for(i[6]=0; i[6]<=1; ++i[6])
case 5: for(i[5]=0; i[5]<=1; ++i[5])
case 4: for(i[4]=0; i[4]<=1; ++i[4])
case 3: for(i[3]=0; i[3]<=1; ++i[3])
case 2: for(i[2]=0; i[2]<=1; ++i[2])
case 1: for(i[1]=0; i[1]<=1; ++i[1])
case 0: for(i[0]=0; i[0]<=1; ++i[0]){
printf("j:%3d\n",j++);
}
break;
default: return;
}
}
引数で渡した数だけfor文を実行する方法ありませんか?上手く行きません。

73 :72:03/07/22 18:15
あげます

74 :デフォルトの名無しさん:03/07/22 18:18
もらいます

75 :デフォルトの名無しさん:03/07/22 18:23
なにがしたいの?

76 :デフォルトの名無しさん:03/07/22 18:28
>>72
2^n回ループしたいということ?

77 :デフォルトの名無しさん:03/07/22 18:43
>>76 違います。
関数内で引数として渡した数だけ、forを実行したいのです。
例は(引数+1)になってますけど。
実際には他にも配列へのポインタ引数をとり。その配列長がnです。
for内の i[] は各々の配列に操作を加えるとき、パラメータとして使います。


78 :デフォルトの名無しさん:03/07/22 18:49
>>77
再帰じゃ駄目なのか?

79 :デフォルトの名無しさん:03/07/22 18:52
>>72
void nfor(int limit, int *i, unsigned int size, unsigned int depth)
{
 if(depth == size) {
  /* i を使って何やらしてちょうだい */
 } else {
  int *j = &i[depth];
  for(*j = 0; *j < limit; ++*j) {
   nfor(limit, i, size, depth + 1);
  }
 }
}

80 :デフォルトの名無しさん:03/07/22 18:54
二重ループじゃ駄目なのか?


81 :デフォルトの名無しさん:03/07/22 19:11
>>72
汚いソースだな。iがなぜ配列なのか、jに何を入れたいのかさっぱりわからん。
これってj=1にしかならない気がするが。
何がしたいんだ?Σiとかn!とか求めるのか?
>引数で渡した数だけfor文を実行する方法ありませんか
引数で渡した数だけfor文を実行すれば良いじゃないか。forの比較の部分で。

#include <stdio.h>
void nfor(unsigned int n)
{
int i, j=0;

for(i=1;i<n;i++) j += i;
printf("j:%3d\n", j);
}



82 :デフォルトの名無しさん:03/07/22 19:17
n重ループしたいんだろ

83 :デフォルトの名無しさん:03/07/22 19:17
釣り?

84 :72:03/07/22 19:17
>>79
おぉ〜、再帰で出来ますね。
理解するのに少し時間がかかりました。
ありがとうございます。

ただ多分うん千回繰り返すのと、なるべく早い方がいいので、
関数呼び出しオーバーヘッド?が心配です。
この場合 while 等で再帰をなくすことは無理のようですね。

>>80
いまいちどういうことか分かりません。
よろしければ、もう少しだけ詳しく教えていただけませんか?

>>81
すみませんが、それは全然違います。

85 :デフォルトの名無しさん:03/07/22 19:23
なんかものすごいことをしようとしているヨカーン

86 :デフォルトの名無しさん:03/07/22 19:24
うん千重ものループかΣ( ̄□ ̄;)

87 :デフォルトの名無しさん:03/07/22 19:30
n^1000 じゃなくて 1000^n や x^n ≒ 1000 のことであって欲しいわけだが。

88 :デフォルトの名無しさん:03/07/22 19:34
解法を根本から見直したほうがよさそうだな

89 :デフォルトの名無しさん:03/07/22 19:37
>>72
十重ループってすごいね

90 :72:03/07/22 19:44
ちなみにうん千回関数を実行するって事ですよ。
nはいっても20、大抵は3、4、5ってところです。

実はスレ違いになってしまうんですが、あるクラスのメンバ関数なんです。
だから、汎用性のある関数にしなくちゃと思って・・・
実際ケースごとに関数足していくのもきついですし。
スレ違いですが、C++だともっといい方法があるのでしょうか?

>>72の怪しいプログラムが上手く走ったら悦に浸れるところだったんですが。
こんなことを考えているようじゃ、まだまだ厨房ですね。


91 :デフォルトの名無しさん:03/07/22 19:57
>>90
値の変わらない引数をメンバ変数に入れておくくらいはできるけど。

n が変数でなければ再帰テンプレートでどうこうできるかもしれんが、
inline にしてても inline 展開されるとは限らないので
面倒になったわりには大して変わらん気も。

92 :デフォルトの名無しさん:03/07/22 21:27
char hoge ;
fgets(buffer , sizeof(buffer) , stdin) ; 
sscanf(buffer , "%c" , &hoge) ;
while(hoge != 'z') {
 switch(hoge) {
    case '+':
     〜略〜break ;
    case '-':
     〜略〜break ;
    default :
     〜略〜break ;
 }
 fgets(buffer , sizeof(buffer) , stdin) ; 
 sscanf(buffer , "%c" , &hoge) ;
}
これは普通に走りますが
最初、int hoge ;でラベルをcase 1: case 2:にしてた時は、2週目以降
何を入力しても前回選択したラベルにジャンプするというエラーですた
訳を教えれ

93 :72:03/07/22 21:28
>>79>>91さん、他のかた、
ありがとうございます。

C++のテンプレートはまださわったことないんですが、やってみるかなぁ・・・。

94 :デフォルトの名無しさん:03/07/22 22:23
一番簡単な例とか出してほしい。

95 :デフォルトの名無しさん:03/07/22 22:24
何の?>>94

96 :92:03/07/22 22:45
>>94
もしかして俺ッスか?
int hoge ; fgets(buffer , sizeof(buffer) , stdin) ; sscanf(buffer , "%c" , &hoge) ;
while(hoge != 3) {
 switch(hoge) {
    case 1':
     printf("キーを入力\n> ") ;
     fgets(buffer , sizeof(buffer) , stdin) ;sscanf(buffer , "%d" , &key) ;
     result = insertnode(key) ;
     if(result == 1 )printf("挿入完了\n") ;
     else printf("キーが重複\n") ; break ;
    case 2': 〜略〜break ;
    default : 〜略〜break ;
 }
 fgets(buffer , sizeof(buffer) , stdin) ; 
 sscanf(buffer , "%c" , &hoge) ;
}
これで
> 1
キーを入力
> a
挿入完了
> d            (適当に入力)
キーを入力 (何故かcase 1:に飛ぶ) 
こんな感じです。

97 :デフォルトの名無しさん:03/07/22 22:48
間違えた・・
aじゃなくて数値だった

> 1
キーを入力
> 10
挿入完了
> d            (適当に入力)
キーを入力 (何故かcase 1:に飛ぶ) 

98 :デフォルトの名無しさん:03/07/22 22:54
>>96
なんだか読む気がしない。


99 :デフォルトの名無しさん:03/07/22 22:54
めちゃくちゃ

hogeはcharにしたいのかintにしたいのか
文字定数'1'を判定したいのか、数値1を判定したいのか

その辺をはっきりさせて統一しないと

100 :92:03/07/22 23:06
分かりますた。

101 :デフォルトの名無しさん:03/07/22 23:07
>>96
%c には char 変数のアドレスを対応させるべし。

102 :デフォルトの名無しさん:03/07/22 23:18

円周率を計算するプログラム。

#include <stdio.h>

int main(void)
{
float pi=0.0;
int s=1;
int n;

for(n=1;;n++)
{
s=-1*s;
pi=pi+1/(2*n-1)*s;

printf("%d回目:%f\n",n,4*pi);

}

return 0;
}

試行錯誤の上に1/2の前に(float)を入れたら正しく動作したんですが,
なんで(float)が必要なのかわからないので教えてください。
型の昇格で型をint→floatと勝手に変えてくれるんじゃないんですか?

103 :デフォルトの名無しさん:03/07/22 23:20
>>102
いいえ。

104 :デフォルトの名無しさん:03/07/22 23:20
やってくれません

105 :デフォルトの名無しさん:03/07/22 23:21
>>102
pi+1/(2*n-1)*s
があったら演算子の優先順位から
1/(2*n-1)*sが先に計算されるだろ。

106 :デフォルトの名無しさん:03/07/22 23:21
じゃあどういうときに昇格してくれるんですか?

107 :デフォルトの名無しさん:03/07/22 23:26
pi=pi+1/(2.0*n-1)*s;

108 :デフォルトの名無しさん:03/07/22 23:27
>>106
年二回。

109 :102:03/07/22 23:28
ありがとうございました。


110 :92:03/07/22 23:38
int main(void)
{
char buf[256] ;
int hoge ;
printf("\n> ") ;
fgets(buf , sizeof(buf) , stdin) ;
sscanf(buf , "%d" , &hoge) ;
printf("%d" , hoge) ;
return 0 ;
}
何度もすいません。
これで文字を読み込ませると、1がプリントされるのは何故ですか

111 :デフォルトの名無しさん:03/07/22 23:41
どうせ読み込ませなくても1がプリントされるとかいう落ちじゃないか

112 :デフォルトの名無しさん:03/07/22 23:42
>>110
int hoge = 100 ; としてみれ。

113 :デフォルトの名無しさん:03/07/22 23:44
>>110
sscanf() の戻り値を調べて出直してこい。

114 :デフォルトの名無しさん:03/07/22 23:44
>>110
int hoge=0;
にして、実行してみたら?

115 :110:03/07/22 23:53
みなさんのご指摘どおり初期値が1でした
変換が失敗すると、読み込まないのか・・

116 :デフォルトの名無しさん:03/07/22 23:58
>>115
むしろ、どう読み込むのか?と(ry

117 :デフォルトの名無しさん:03/07/23 00:27
めちゃくちゃ簡単ですが、理解できない俺に教えて下さい。
scanfで文字列を取り込みそれは何だったかを表示するプログラムです。
配列とかがもう・・

118 :デフォルトの名無しさん:03/07/23 00:29
>>117
めちゃくちゃ簡単なら自分でやれよ
出来ないなら簡単とかぬかすな

119 :117:03/07/23 00:33
#include <stdio.h>
int main(){
char a[];
scanf("%s",&a);
printf("入力されたのは%c",a);
}
こんな感じでいいのかなぁとか思ったんですが。

120 :デフォルトの名無しさん:03/07/23 00:36
OK

121 :117:03/07/23 00:43
#include <stdio.h>
int main(){
char a[10];
scanf("%s",&a);
printf("入力されたのは%s",a);
}

これなら問題なく実行できるのですが、
入力される文字数を無制限にできないでしょうか?

122 :デフォルトの名無しさん:03/07/23 00:44
無理

123 :117:03/07/23 00:45
配列の要素数は最初に必ず指定しなければ
ならないということですか?

124 :デフォルトの名無しさん:03/07/23 00:46
scanf()を自分で定義して再構築汁

125 :デフォルトの名無しさん:03/07/23 00:46
#include <stdio.h>
int scanf( const char *format, ... )
{
/* 文字数無制限に読み込めるような実装をここに書く */
}
int main(){
以下略

でできる


126 :デフォルトの名無しさん:03/07/23 00:48
ケコーン(*´д`*)

127 :デフォルトの名無しさん:03/07/23 00:52
C++ なら
std::string str;
std::getline(std::cin, str);
だな。
ただし、VC6 ではバグってる罠。

128 :デフォルトの名無しさん:03/07/23 01:00
>>125
標準ライブラリと同じ名前の関数を書くのって許されてたっけ?

129 :デフォルトの名無しさん:03/07/23 01:27
できるよ

130 :デフォルトの名無しさん:03/07/23 01:29
>>128
問題なし。予約語じゃないから。

131 :デフォルトの名無しさん:03/07/23 02:18
>>121=117
どこかで誰かが作っていたソース。
STRSIZE (ここでは4) より大きい入力が来ても平気、らしいよ。これ使えば何とかなるかも!?
#include <stdio.h>
#include <stdlib.h>
#define STRSIZE 4

typedef struct _Data{
char string[STRSIZE];
struct _Data *next;
} Data;

main(){
int i;
Data *start=NULL, *now, *temp;

while( 1 ){
if( ( temp = (Data *)malloc( sizeof( Data ) ) ) == NULL ){
printf( "memory run out!\n" );
break;
}


132 :デフォルトの名無しさん:03/07/23 02:19
標準ライブラリをインクルード and/or リンクしさえしなければ

133 :デフォルトの名無しさん:03/07/23 02:19
temp->next = NULL;
fgets( temp->string, STRSIZE, stdin );
if( start == NULL ) start = temp;
else now->next = temp;
now = temp;
for( i = 0; i < STRSIZE; i++ ){
if( temp->string[i] == '\n' ){
for( now = start; now != NULL; now = now->next ) printf( "%s", now->string );
break;
}
}
if( temp->string[i] == '\n' ) break;
}
for( now = start; now != NULL; now = temp ){
temp = now->next;
free( now ); }
return 0;
}

134 :132:03/07/23 02:21
ごめんちゃい。

135 :131&133:03/07/23 02:22
>>132
気にしない、気にしない。というわけで、131->133と続いてるよ。

136 :デフォルトの名無しさん:03/07/23 04:03
()の中を1/3乗したいのですが、
不正なオペランドというエラーがでてしまいます。
'^'では駄目なんでしょうか。
どなたかご指導お願いします。
言語はCです。

xyz2lab[i][j][0] =
116 * ((rgb2xyz[i][j][1] / y0) ^ 0.333 -
16 * (rgb2xyz[i][j][1] / y0));

137 :デフォルトの名無しさん:03/07/23 04:12
>>136
^はビット毎の排他的論理和
累乗はpow関数を使う。pow(n,-3.0);

138 :デフォルトの名無しさん:03/07/23 04:13
vb出身か?

139 :137:03/07/23 04:17
累乗ってなんだ。べき乗だろ

140 :デフォルトの名無しさん:03/07/23 04:18
>>138
何故BASIC使いをVB使いと決め付ける?
N88やMSXかもしれんだろう?

141 :デフォルトの名無しさん:03/07/23 04:19
同じ数を何個かかけて得られる積を,その数の累乗または
べき(巾,冪)といい,かけた個数をその累乗の指数といいます。

142 :137:03/07/23 04:21
>>141
累乗でもよかったんだ。
ショウガッコウカラヤリナオシテキマス

143 :_:03/07/23 04:42
http://homepage.mac.com/hiroyuki44/jaz10.html

144 :136:03/07/23 04:45
>>137
こんなに早くありがとうございました。
なんとかできそうです。


145 :デフォルトの名無しさん:03/07/23 04:50
おいおい何でBASICと決め付ける
mathematicaだったらどうする

146 :デフォルトの名無しさん:03/07/23 13:48
関数のポインタ引数書く時
long func(char* pData);
long func(char *pData);
long func(char * pData);
空白の位置が違うのですが
どれが良いのでしょうか?


147 :デフォルトの名無しさん:03/07/23 13:49
これ
long func(char*pData);

148 :146:03/07/23 14:10
>>147
空白を使わない、理由も教えて欲しいです。(どうせ茶化してるだけと思われますが)

私は、
char* pData
だと、char*型の pDataオブジェクトっぽく見えて良い感じだと思うのですが
標準ヘッダなどは、char *pDataが目立ちます。
古いCの規格に準拠とか
何か理由があるのでしょうか?



149 :デフォルトの名無しさん:03/07/23 14:11
>>148
*はcharにではなくpDataに付いているものだから

150 :デフォルトの名無しさん:03/07/23 14:25
char 型の配列 a[10] があるとして、その配列に
1+2*3 を代入したら、 a[9] の値はNULLなんですか?
それとも処理系に依存するんですか?


151 :デフォルトの名無しさん:03/07/23 14:30
解読不能

152 :デフォルトの名無しさん:03/07/23 14:37
>>150
"1+2*3"をa[10]に入れるってわけだろ?
a[0]='1';

a[4]='3';
a[5]=NULL;
てなわけで、a[9]の値は変化しない。

153 :デフォルトの名無しさん:03/07/23 14:38
>>152
すげぇ、そんな考え及びもしなかったぜ・・・

154 :デフォルトの名無しさん:03/07/23 14:39
>>152
NULLじゃないだろう

155 :デフォルトの名無しさん:03/07/23 14:42
>>154
すまそ、Cから数年離れてるもので・・・
a[5]='\0';
なのかな

156 :150:03/07/23 14:42
>>152
じゃあ、初期化してないとどうなるんですか?


157 :デフォルトの名無しさん:03/07/23 14:43
むかし
char str[BUFSIZ]を初期化しないで表示してみるスレ
なんてのがあったな

158 :デフォルトの名無しさん:03/07/23 14:46
>>156
static な変数なら 0 で初期化されるが、
自動変数の場合はどうなってるか分からない。
毎回違う値が入ってる可能性も大きい。

159 :デフォルトの名無しさん:03/07/23 14:47
>>156
「変化しない」って言葉がわからない?
初期化してようがしてなかろうが今は関係ない。

160 :_:03/07/23 14:50
http://homepage.mac.com/hiroyuki44/jaz08.html

161 :デフォルトの名無しさん:03/07/23 15:18
>>148
>char* pData
>だと、char*型の pDataオブジェクトっぽく見えて良い感じだと思うのですが
確かにその通り。
でも、複数宣言する場合はそうはいかないよね。
char *pData, *pData2; の方が見栄えがいい。
まあ、typedef char* pchar; で型定義して
pchar pData, pData2; にすればいいんだけど。
これは個人の好みの問題だね。

162 :デフォルトの名無しさん:03/07/23 15:30
>150はその程度のことをなぜ自分で試さないんだ?
数行で済む話だろ。


163 :デフォルトの名無しさん:03/07/23 15:42
>>161
複数宣言なんて殆どしないなぁ。
どうしても複数宣言したくなった時のみするけど、
その場合は確かに * は変数にくっつけて書く。

164 :デフォルトの名無しさん:03/07/23 20:03
こんばんわ。
ちょっとわからない事があったので、ご意見を聞かせてください。

data1.txt に例えば
x y z
1 1 10
1 2 12
1 3 17
:
:
のようなn行3列のテキストデータがあったとします。
ここでdata2.txtには
x y
1 3
1 5
3 9
6 41
:
:
と n行2列のデータがあったとします。ここで私は data1.txt から
data2.txt の x y と一致する行だけ抜き出したいのですが上手くいきません。
どこを直したらよいか教えていただけませんか?

165 :164:03/07/23 20:04
ちなみにこれがためしに書いてみたソースですが
実行しても一行も出力されませんでした。


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

main(int argc,char *argv[])
{
FILE *file1;
FILE *file2;

char buf1[BUFSIZ];
char buf2[BUFSIZ];
char *p;

file1 = fopen(argv[1],"r");
file2 = fopen(argv[2],"r");

while(fgets(buf1,sizeof(buf1),file1)!=NULL){
while(fgets(buf2,sizeof(buf2),file2)!=NULL){
if( ( p = strstr(buf1,buf2)) !=NULL) {
puts(buf1);
}
}


}


166 :デフォルトの名無しさん:03/07/23 20:18
>165
・fgetsで得た文字列がどうなってるか
・file2が終端に達した後どうなるか

167 :デフォルトの名無しさん:03/07/23 20:23
同じxyの組合せが1組しかなくて、それぞれのファイルが同じようにソートされてる場合
while(fgets(buf2,sizeof(buf2),file2)!=NULL){
while(fgets(buf1,sizeof(buf1),file1)!=NULL){
if(strncmp(buf1,buf2,strlen(buf2)-1) == 0) {
fputs(buf1, stdout);
break;
}
}
}

168 :デフォルトの名無しさん:03/07/23 20:36
#include <stdio.h>
#include <string.h>

main(int argc,char *argv[]){
  FILE *file1;
  FILE *file2;

  char buf1[BUFSIZ];
  char buf2[BUFSIZ];

  file1 = fopen(argv[1],"r");
  file2 = fopen(argv[2],"r");

  fgets(buf1,sizeof(buf1),file1);// 最初のx yの行を読み飛ばす

  while(fgets(buf1,sizeof(buf1),file1)!=NULL){
    int x1,y1,z1;
    sscanf(buf1,"%d %d %d",&x1,&y1,&z1);
    rewind (file2); // file2を最初から読み直す
    fgets(buf2,sizeof(buf2),file2); // 最初のx yの行を読み飛ばす
    while(fgets(buf2,sizeof(buf2),file2)!=NULL){
      int x2,y2;
      sscanf(buf2,"%d %d",&x2,&y2);
      if( (x1 == x2) && (y1 == y2) ){
        printf("%s",buf1);
      }
    }
  }
}


169 :164:03/07/23 20:36
>>166
>・fgetsで得た文字列がどうなってるか
>・file2が終端に達した後どうなるか

え〜と、
fgetsで得た文字列には改行コードがある。
よって改行コードも文字列の判定に入ってきてしまうから、
改行コードをはずさないと意図した通りにならない、ってことでしょうか?

file2が終端に達すると...?
え〜と、file2のwhileが終わってfile1の次の行を読み込んだ後、
またfile2を読み始めると思うのですが。

うーん。まだよくわからないです。すみません。

170 :デフォルトの名無しさん:03/07/23 20:40
while(FILE1が終端まで行ってるか?){
 FILE1から読み込み
 while(FILE2が終端まで行ってるか?){
   FILE2から読み込み
 }
}
FILE1から1つめのデータを読み込んで、FILE2上の全てのデータで含まれているかどうかチェックする
(この時点でFILE2上にはデータが残っていない)

FILE1から2つめのデータを読み込むと、FILE2には「もうデータが無い」と判断し誤動作する、というわけで。


171 :デフォルトの名無しさん:03/07/23 20:42
rewindがポイント

172 :170:03/07/23 20:52
厳密には、「誤動作」じゃないので。

>>171がいってるとおり、rewind manpageで検索して見てくれ。

173 :164:03/07/23 20:56
>>170
なるほど。
2つ目の while は一回終端まで行ったので
次のループでは既にストリームが終わってしまっているわけですね。
と、なると>>167で教示していただいたループも上手くいかなそうに見えるのですが...

174 :デフォルトの名無しさん:03/07/23 21:18
strstrでのチェックの場合、改行を取り去っても
buf1が"1 10 5"
buf2が"1 1"

buf1が"2 21 1"
buf2が"1 1"
等で、問題が発生する
従って>>168のように数値でチェックした方が良いだろう

175 :デフォルトの名無しさん:03/07/23 21:20
数値とは一言も書いてない

176 :164:03/07/23 21:25
なるほどよくわかりました。
レスしてくれたみなさん、どうもありがとうございます。
とても勉強になりました。

177 :デフォルトの名無しさん:03/07/23 21:26
はいはい。お疲れさまでした >> 175

178 :デフォルトの名無しさん:03/07/23 21:30
やり方自体がショボ杉

179 :デフォルトの名無しさん:03/07/23 23:30
夏房的しつもんですが、
sprintf()で渡したエリア以上に文字列を出力させた場合、
エリアを壊しますよね??


180 :デフォルトの名無しさん:03/07/23 23:32
>>179
さぁ。直後がmallocで正当に確保された領域だったりメモリマップドファイルだったりすることも考えられる。

181 :デフォルトの名無しさん:03/07/23 23:36
double d;
for(d=0.0;d<pow(FLT_RADIX,DBL_MANT_DIG);d+=1.0){}
とあった時、pow(FLT_RADIX,DBL_MANT_DIG)回だけループするのでしょうか?
それとも、途中で、丸められてしまう事も、あるのでしょうか?

182 :フラウボウ:03/07/23 23:39
http://life.fam.cx/a008/





183 :デフォルトの名無しさん:03/07/24 00:02
>>181
1. double をループカウンタにしないのが吉。
  数値誤差が溜まって、正確にループできないことが頻繁にある。

2. 関数の結果を一時変数に入れて、それをループのリミットとすること。
  何度も pow を呼ぶのは非効率。

pow の結果が整数なら、

int i;
int limit = (int)(pow(...) + 0.5);
for(i = 0; i < limit; i++) { ... }

とするべし。

184 :デフォルトの名無しさん:03/07/24 00:11
>>161
関数の引き数で複数宣言出来たか?

# 関数の引き数の場合と書いてあるが?

185 :デフォルトの名無しさん:03/07/24 00:11
掘り出してすまんが、>>150 は代入と初期化を混同していると思われ。
そもそも C だと文字列の代入なんて普通には出来ない。
初期化の指定なら a[9] は '\0' になる。

186 :デフォルトの名無しさん:03/07/24 00:18
>>184
関数の引数と、そうで無い場合で使い分けるのはもっと気持ち悪いよ

187 :デフォルトの名無しさん:03/07/24 00:18
文字列の初期化なんてどうせ動作環境決まっているから
memset(str,0,sizeof(str));
ですましてる。

188 :デフォルトの名無しさん:03/07/24 00:26
文字列の初期化なんて、str[0] = '\0';で充分。

>>183
doubleの上限までループしようと言う無茶な181なんだから
精度云々以前にintが使えない罠。
で、doubleの有効桁数は10進で20桁もないので途中で1足しても値が増えなくなる。

189 :デフォルトの名無しさん:03/07/24 00:26
>>187
どういう意味?

190 :デフォルトの名無しさん:03/07/24 00:29
>>185の言う初期化は、宣言時に初期値を指定することだと思われ

191 :デフォルトの名無しさん:03/07/24 00:45
>>188
あ、そこまでループするのか。
pow の中身見てなかった。
なるほど。そのうち精度が悪くなって足しても d の値が変わらなくなるな。

192 :デフォルトの名無しさん:03/07/24 00:58
>>188,191
doubleの上限じゃない。
1足して値が変わる上限。

193 :デフォルトの名無しさん:03/07/24 00:59
>181
その値の場合においては問題ない

194 :181:03/07/24 01:54
>>183-193
返事が遅れて、ごめんなさい。
何か、とても書き方が悪かったようで…
>>193さんが、問題ないと言われてますが、念の為、もう1度、お願いします。
ようするに、知りたい事は、3つ程あるのですが、
「doubleの初期値を0.0にして、1.0ずつ足せば、仮数部も1ずつ増えるのか?」
と言う事と、
「仮数部を意図的に1ずつ増やした場合、
 仮数部の限界がくるまで指数部の値が、かわる事はないのか?」
と言う事と、
「指数部に余裕がある時に、
 仮数部の限界の値と、仮数部の限界に1を足した値を比較しても
 (FLT_ROUNDS等に関係なく)正しい結果が得られるのか?」
と言う事の3つです
知ってる方は宜しく、お願いします。

195 :デフォルトの名無しさん:03/07/24 02:31
doubleの表現形式って仕様で決まってたっけ?

196 :デフォルトの名無しさん:03/07/24 02:46
>>194
仮数部って整数じゃないよね?

197 :デフォルトの名無しさん:03/07/24 02:59
IEEE754の浮動小数は仮数部が0.5<=x<1を満たすんじゃなかったかな?
指数部の値によっては上記の条件を満たさないかもしれないが

198 :デフォルトの名無しさん:03/07/24 03:08
>>196
はい、仮の数です。
だから、単純に1.0を足しても仮数部の内部が1増えるとは限りません
が、>>194に書いた事は、1つ目と2つ目は、出来そうな気がするし、
計算精度的に、出来なければ、おかしい気もします。
また、3つ目は、出来ても、出来なくても、何となく納得出来るので、
仕様上、どのように決まってるのかなと思いまして…。

199 :181:03/07/24 03:14
>>198は自分が書いたものです

>>197
と言う事は、どう言う事になるのでしょうか?

200 :デフォルトの名無しさん:03/07/24 03:17
200ゲット
C言語なら俺に聞け!

201 :デフォルトの名無しさん:03/07/24 03:19
>>199
What Every Computer Scientist Should Know About Floating-Point Arithmetic
http://docs.sun.com/source/806-3568/ncg_goldberg.html

202 :デフォルトの名無しさん:03/07/24 03:25
構造体とクラス(C++)の違いを教えてください

203 :デフォルトの名無しさん:03/07/24 03:27
>>202
なんでここで聞くの?

204 :デフォルトの名無しさん:03/07/24 03:27
>>202
スレ違いです。

205 :sage:03/07/24 03:30
すまん

206 :181:03/07/24 04:00
>>201
分かりませんでした…。(T_T)
最初の方に、指数部が同じなら
仮数部の値は保証されるような事が書いてありましたが、
それが、途中のIEEE754や、最後の方に書いてあった、
C99の仕様と、どのような関係があるのか、全然分かりませんでした…。
誰か、英語の出来る人、教えて下さいませ。m(_ _)m

207 :181:03/07/24 04:07
時間が時間なので寝ますが、
それでも宜しければ、レスお願いします。

208 :デフォルトの名無しさん:03/07/24 13:11
>>179
壊れます
>180の答えは無視してもいいです

209 :デフォルトの名無しさん:03/07/24 14:44
>>207>>181
なぜ自分で実験しないのかと小一(jr

210 :デフォルトの名無しさん:03/07/24 15:48
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 |  次でボケて!!!   |
 |________|
    ∧∧ ||
    ( ゚д゚) ||
    / づΦ

211 :デフォルトの名無しさん:03/07/24 15:57
よしこさんや。メシはまだかい?

212 :デフォルトの名無しさん:03/07/24 17:28
あのー、CRC16/CRC32/MD5鍵のアルゴリズムを解説したページ
ご存じでしたら教えてください。

出来れば、概要だけではなく、アルゴリズムと実装の両方が記載されてる
ページをお願いいたします。

213 :デフォルトの名無しさん:03/07/24 18:46
C言語のプログラムからシステム日付を設定する方法は
あるのでしょうか?
あるのなら教えていただきたい。
システム日付設定関数とかあるのかな???ネットで検索したが
見つからなかったので。

214 :デフォルトの名無しさん:03/07/24 18:46

期間限定!もうお目にかかれない!

http://alink3.uic.to/user/angeler.html

215 :デフォルトの名無しさん:03/07/24 18:57
>>213
これ全部見た?
http://www.google.com/search?hl=ja&ie=UTF-8&oe=UTF-8&q=C%E8%A8%80%E8%AA%9E%E3%80%80%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%80%80%E6%97%A5%E4%BB%98%E3%80%80%E9%96%A2%E6%95%B0&lr=lang_ja

216 :215:03/07/24 18:59
ごめん、日付の取得じゃなくて設定か。
それは、システムによって違うな。

217 :デフォルトの名無しさん:03/07/24 19:05
プラットフォーム依存する話題はヤメレ!!

まあ、どうしても設定したいのであれば、
system("date -s 2003-07-28");
という手もある(windows/linuxどっちでも動くかもね)

218 :デフォルトの名無しさん:03/07/24 19:07
あ、ただしlinuxの場合、管理者権限が必要という罠が...

219 :デフォルトの名無しさん:03/07/24 19:09
dateをrootにsui(ry

220 :デフォルトの名無しさん:03/07/24 21:07
JPEGファイルをコピーする方法を教えてください。

ファイルをfopenでバイナリモードで開き
fgetcで元のファイルを読み込んで、fputcでコピーして閉じたのですが
テキストファイルはうまくコピーできたものの
JPEGファイルはファイルだけが出来て中身がありません。
具体的にはどうすればいいんでしょうか?

221 :デフォルトの名無しさん:03/07/24 21:07
>>220
"rb"

222 :221:03/07/24 21:14
書き込むんだから"wb"も必要か。

223 :デフォルトの名無しさん:03/07/24 21:21
>int hoge ; fgets(buffer , sizeof(buffer) , stdin) ; sscanf(buffer , "%c" , &hoge) ;

char hoge ; scanf("%c" , &hoge) ;

scanf「だけは」使わないくせに
scanfより悪いことを平気でする低脳

224 :デフォルトの名無しさん:03/07/24 21:26
>>220
具体的にはどうやったのでしょうか?

225 :デフォルトの名無しさん:03/07/24 21:32
すいません、16bitの配列について質問させて下さい。
今、tiff画像の各ピクセルあたりの輝度を
取り出すプログラムを書いているのですがどうも値が間違ってるようなんです。
ちゃんと16bitの値を取り出して出力できているでしょうか?
コードは次のようになっています。



226 :デフォルトの名無しさん:03/07/24 21:32
#include <stdio.h>
#include <tiffio.h>
main(int argc ,char *argv[])
{
TIFF *tiff;
uint32 width,height,row,x;
unsigned short int *buffer;
unsigned long int result;

tiff = TIFFOpen(argv[1],"r");

/*画像の幅と高さを取得*/
TIFFGetField(tiff,TIFFTAG_IMAGEWIDTH,&width);
TIFFGetField(tiff,TIFFTAG_IMAGELENGTH,&height);

buffer = (unsigned short int *)malloc(TIFFScanlineSize(tiff));

for (row = 0; row < height; row++) {

/*tiff から一行読み出して buffer に格納る。row で何行目かを指定。0は画像の番号。*/
/*読み出した配列は 16bit の整数データを要素に持つ */

TIFFReadScanline(tiff, buffer, row, 0); 

for(x=0;x<width;x++){
result = * ((unsigned short int *)(buffer + x));
printf("%d %d %u \n",row,x,result);
}
}
}

227 :デフォルトの名無しさん:03/07/24 21:40
フローチャートを作るとき、四角の中身の処理はC言語で書くんですか?
それとも、日本語で説明するんですか?

228 :デフォルトの名無しさん:03/07/24 21:43
JISで標準形式が決まっている

229 :デフォルトの名無しさん:03/07/24 21:49
result = * ((unsigned short int *)(buffer + x));
これは
result = * ((unsigned short int *)(buffer) + x);
でないの?

230 :デフォルトの名無しさん:03/07/24 21:50
そもそも buffer が unsigned short int * だろう。
malloc の cast も無駄。

231 :225:03/07/24 22:11
>>229
間違ってますでしょうか?

>>230
malloc() に void で確保させても結果に変化はないと思うのですが。

232 :デフォルトの名無しさん:03/07/24 22:14
>>231
実際に、printfではどう表示されているの?
それと本来ならどう表示されるはずなの?

233 :デフォルトの名無しさん:03/07/24 22:15
>>229
言うだけ無駄な相手だったな

234 :デフォルトの名無しさん:03/07/24 22:15
endianは大丈夫なのか。

235 :デフォルトの名無しさん:03/07/24 22:31
つーか、ちゃんとタグの解析してるのかな?

236 :225:03/07/24 22:37
>>232
実行結果は、
0 0 43
0 1 68
:
:
という感じで、一見すると正しい値が得られているようなんですが、
画像の輝度を全て得てからグラフツールでプロットすると
ただランダムな値が出力されているようにしか見えないんです。

>>234
endian がおかしいのでしょうか。
未熟で判断できません。すみません。

237 :225:03/07/24 22:44
>>235
TIFFGetField(tiff,TIFFTAG_BITSPERSAMPLE,&cps);
TIFFGetField(tiff,TIFFTAG_SAMPLESPERPIXEL,&bpc);

別のプログラムで、この2行を加えて画像のbitは確認しています。

238 :デフォルトの名無しさん:03/07/24 23:04
最初の文字をxに変えるプログラムなんですが、
何処がおかしいか教えて下さい。
//includeは省略
char *mutation(char *str){
char *str1;int l;int i;

l=strlen(str);
str1=(char *)malloc(l*sizeof(char));
*str1='x';
for(i=1;i<l;i++){
*(str1+i)=*(str+i);
}
return str1;
}

int main(){
char *str;char *str1;

puts("文字列を入力して下さい!");
gets(str);
str1=mutation(str);
puts(str1);
return 0;
}

239 :デフォルトの名無しさん:03/07/24 23:06
mallocのサイズが\0の分だけ足りない
\0を移してない

240 :デフォルトの名無しさん:03/07/24 23:07
>*(str1+i)=*(str+i);

str1[i] = str[i];

で済むものを、なんでそんなにひねくる?

241 :デフォルトの名無しさん:03/07/24 23:09
>239
レス有難うございます
mallocの行をl+1に変えたけど上手くいきませんでした・・・

242 :デフォルトの名無しさん:03/07/24 23:14
>>241
*(str1+strlen(str)+1) = '\0';
これ。

243 :181:03/07/24 23:21
やはり、レスが無い…
>>194の質問に答えられる方、
もしくは、>>201の先が書いてある事が分かる方は、
分かるように説明して下さい。お願いします。m(_ _)m

>>209
知りたいのは、自分の環境での動作ではなくて、
規格上での動作だからです

244 :238:03/07/24 23:28
解決しました、有難うございます!
main関数で文字列を入力する前に
str=(char *)malloc(BUFSIZ*sizeof(char));
とすると上手くいきいました。
あと、それに加えて>293さんの処理も必要だったみたいです。

>240
私はポインタと配列の違いが良く分かってないDQNなんです

245 :240:03/07/24 23:32
>>244
漏れも高卒だから別にいいんだけどよ、
ポインタと配列は違うってとこはコンドーさんつけないほうが気持ちいいぞ。
忘れるな。

246 :デフォルトの名無しさん:03/07/24 23:49
俺は逆に、ポインタが配列見たく使えるのがよく分かってない

247 :デフォルトの名無しさん:03/07/24 23:54
>>246
こう言うのか?
(A+1)->B == A[1].B ;

248 :デフォルトの名無しさん:03/07/24 23:55
>>246
p[i] は *(p + i) のシンタックスシュガー。
両方等価。

249 :デフォルトの名無しさん:03/07/25 00:01
>>248
これか?
p[n][m] == m[n[p]] ;

250 :デフォルトの名無しさん:03/07/25 00:02
>243
・仮数部は整数値ではない為、1を加算しても仮数部は1ずつ増えない
・仮数部は正規化された小数値なので、指数部は絶対値によって変化する
・overflow等が発生しない限り、指数に応じたEPSILONの加算では計算誤差は発生しない

と2chで回答されて、それを信じるのか(w

251 :デフォルトの名無しさん:03/07/25 00:03
>>247
そーそー
>>248
ヘー
ポインタの理解は値を代入するところまでで止まってまつ
どうもありがとうです

252 :181:03/07/25 00:20
>>250
レスありがとうございます。m(_ _)m

>仮数部は整数値ではない為、1を加算しても仮数部は1ずつ増えない
はい、最初は、自分も、そう思ったのですが、
良く考えると、基数が幾つであれ、整数を加算した場合は、指数部が0(基数^0)になり、
仮数部も、その整数と同じになるのではないかと思い質問しました
でも、規格上は、1ずつ増えるとは限らないと言う事なのですね。

>・仮数部は正規化された小数値なので、指数部は絶対値によって変化する
なるほど、絶対値で変わる事のですね

>・overflow等が発生しない限り、指数に応じたEPSILONの加算では計算誤差は発生しない
絶対値で指数部が変化すると言う事は、3つ目は大丈夫と言う事ですね

>と2chで回答されて、それを信じるのか(w
うむ…そう言われると…。

253 :デフォルトの名無しさん:03/07/25 00:22
>>252
「浮動小数点 正規化」辺りで検索しなはれ

254 :181:03/07/25 00:44
>>250==253?
ありがとうございます。
後は、その辺と、その辺りを中心に、
Cの規格が含まれる記述等を調べてみます。m(_ _)m

255 :デフォルトの名無しさん:03/07/25 00:50
>>249
p はポインタ(アドレス+型)で、
i は整数、ということで。

256 :デフォルトの名無しさん:03/07/25 11:57
http://pc2.2ch.net/test/read.cgi/tech/1058283913/514

よくわからん

257 :デフォルトの名無しさん:03/07/25 12:10
> > ans と &ans[0] が等価だ。
>
> 配列と、配列の先頭要素へのポインタが等価なのは、
> 引数として渡された場合に限る。ねんのため。

引数として渡されてなくても、普通に等価のような気がするけどなぁ?

258 : :03/07/25 12:11
>>198

198 の 181 の人は、仮数部、指数部の意味がわかってないと思いますよ。
数論的な捕らえ方をしている様ですが、そうではなくって、たとえばIEEE
なりの正規化処理が行われた well defined な「仮数部」「指数部」を仮定
して話さないと話が通じなかったり遠回りになったりします。


259 :デフォルトの名無しさん:03/07/25 12:13
>>255
即ち、*(i + p)とi[p]は等価ということやね。
>>249
なので、
3["abcd"]とか1[strchr("abcd", 'c')]もできるわけだよ。
#両方とも結果は'd'に等しい。

260 :デフォルトの名無しさん:03/07/25 13:31
>>257
ans の型は char [2] で、
&ans[0] の型は char* だ。

だから、sizeof ans は 2 で、
sizeof (&ans[0]) は sizeof (char*) だ。

261 :デフォルトの名無しさん:03/07/25 14:31
あ、なるほどねー


262 :デフォルトの名無しさん:03/07/25 14:40
http://pc2.2ch.net/test/read.cgi/tech/1058283913/510
これって本当なの?
gccじゃ何の警告も出ないんだけど?

263 :デフォルトの名無しさん:03/07/25 14:47
int a[5];
int (*p)[5]=&a;

264 :_:03/07/25 14:50
http://homepage.mac.com/hiroyuki44/hankaku08.html

265 :デフォルトの名無しさん:03/07/25 15:03
>>262
嘘。
&ans は配列ポインタを与える。

266 :デフォルトの名無しさん:03/07/25 15:24
>>262
ANSI C 以前の仕様では、&ans と書くと警告を招いたらしい。
CFAQ→ http://www.catnet.ne.jp/kouno/c_faq/c6.html#12

267 :デフォルトの名無しさん:03/07/25 16:49
基本的なことで質問
条件式で
(a == 5 || a == 8)と書けば
aが5か8である場合ってことですが
(a != 5 || a != 8)と書くと
日本語として、どういう場合と表現されますか?

268 :デフォルトの名無しさん:03/07/25 16:51
aが5でないか8でない場合

269 :デフォルトの名無しさん:03/07/25 16:55
常に

270 :デフォルトの名無しさん:03/07/25 17:02
int a;
if(a!=5||a!=8);
else printf("コンパイラのバグか?\n");


271 :デフォルトの名無しさん:03/07/25 17:08
結局
(a != 5 && a != 8)
だと、aが5と8でない場合で
(a != 5 || a != 8)
だとaが何であっても常に真ということですか?


272 :デフォルトの名無しさん:03/07/25 17:12
ああ分かりました!
aが5でない ・・・234x6789・・・
aが8でない ・・・234567x9・・・
てことだから、「常に」ってことになるわけか

273 :デフォルトの名無しさん:03/07/25 18:54
floatって必要?

274 :デフォルトの名無しさん:03/07/25 20:36
>>273
あったほうがよい。大量の浮動小数点を処理する場合でさほど精度が必要ないとき。
とはいえメモリは安くなってきてるし、処理速度考えたらFPUネイティブ(な場合が多い)の
doubleで処理するほうがいいかも。存在意義はなくなりつつあるね。

275 :デフォルトの名無しさん:03/07/25 20:42
>>273-274
参考にこれもどうぞ。
htttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html

276 :デフォルトの名無しさん:03/07/25 20:50
>>275
さっきそこちらっと見てた
参考になりまつ

277 :デフォルトの名無しさん:03/07/25 22:11
>>274
にゃんでや? メモリ容量2倍になるのにどんくらい松よ

278 :デフォルトの名無しさん:03/07/25 23:09
float は普通は必要ないけど、
3D 関係のライブラリは float を引数にとるものが多いので、
そういう場合は必要になる。
でも、そういう時以外はやっぱり必要ない。

大量に扱う場合って演算回数も多くなる傾向があって、
それらの演算で出てくる数値誤差も大きくなるから、
結局精度がいる場合が多いんじゃないかと。
よっぽどメモリをギチギチに使わないといけなかった時代ならともかく、
今は float の価値は低いよ。

279 :デフォルトの名無しさん:03/07/25 23:19
XFORM?

280 :デフォルトの名無しさん:03/07/26 00:26
floatは倍精度以上の浮動小数点演算ハードウェアが使えない環境ではまだ意味があると思われ。


281 :デフォルトの名無しさん:03/07/26 00:56
少なくとも、特殊な場合にしか使わないということには変わりはないね。

282 :デフォルトの名無しさん:03/07/26 01:45
うに

283 :デフォルトの名無しさん:03/07/26 05:04
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html

284 :デフォルトの名無しさん:03/07/26 05:12
プログラムによる数値演算のベンチマーク
http://www001.upp.so-net.ne.jp/y_yutaka/labo/math_algo/calcbench.html

285 :デフォルトの名無しさん:03/07/26 05:20
VC++6.0は整数除算の最適化が苦手?

286 :デフォルトの名無しさん:03/07/26 08:53
>>285
スレ違い
かな

287 :_:03/07/26 08:54
http://homepage.mac.com/hiroyuki44/

288 :デフォルトの名無しさん:03/07/26 08:59
>>286
まあそうだが・・・
>>284を見てのコメントなので。

289 :デフォルトの名無しさん:03/07/26 09:19
>>288
じゃあ初めからそう書けよ。

290 :デフォルトの名無しさん:03/07/26 09:45
>>284
>※「最適化あり」の比較は、 最適化によって無駄なループがまとめられてしまっている
>可能性があります。 そのため、純粋な比較にはならないかもしれません。

こいつアセンブラ読めねーアフォだなw

291 :デフォルトの名無しさん:03/07/26 10:23
最適化という言葉が出るたびにそこで思考停止する香具師の
頭ん中がせいぜいその程度ということをよく現している秀逸な標本だな。

292 :デフォルトの名無しさん:03/07/26 10:40
restrict 修飾子についてわかりやすい解説をしている日本語のサイトってありませんか?



293 :デフォルトの名無しさん:03/07/26 10:46
> restrict
はつみみです。

294 :デフォルトの名無しさん:03/07/26 10:55
ヘ_ヘ ----------------------------
ミ・・ ミ ねこみみです
( )〜


295 :C初心者:03/07/26 11:10
WindowsXPを使ってCを勉強しているのですが、コンパイラはネットで
ダウンロードした無料C++Builderで、MS-DOSで動作しています。
普通はどうやってプログラムを動作させるのですか?なんかのソフトかなんか?

296 :ヽ(´ー`)ノ:03/07/26 11:12
>>292
この説明でOK?
http://www.renesas.com/jpn/products/mpumcu/toolhp/features/nc30wa_5/index_j.htm

>>293
それはいくらなんでも勉強不足でつ。


297 :デフォルトの名無しさん:03/07/26 11:12
しぇるからよぶ

298 :デフォルトの名無しさん:03/07/26 11:13
>>292
こことか
http://seclan.dll.jp/c99d/c99d07.htm#dt19991018

299 :デフォルトの名無しさん:03/07/26 11:14
C99なのか・・・
俺もCのトリビアであるC99を勉強するか。

300 :デフォルトの名無しさん:03/07/26 11:18
int i;
restrict int *p1=&i;
int *p2=&i;
こういうことができないってことか。

301 :デフォルトの名無しさん:03/07/26 11:32
板違いかもしれないけどこれどう解けばいい?↓

二つの整数変数x,yを宣言して,以下の3つの代入操作を連続して行なう.
x := x-y;
y := x+y;
x := y-x;
この操作の結果,xとyの値はどうなるのか,考察せよ.
具体的にプログラムを作成して,適当な値を入れて実行してみる
手でいろいろな値を入れて紙の上で計算してみる
のどちらの方法でもよい. この一連の操作は,何を目的としているのか,答えよ.


302 :デフォルトの名無しさん:03/07/26 11:36
x=3 y=2
x := 3-2 = 1
y := 1+2 = 3
x := 3-2 = 2
入れ替え。

303 :デフォルトの名無しさん:03/07/26 11:38
x := 3-1 = 2
最後の訂正。

304 :無料動画直リン:03/07/26 11:38
http://homepage.mac.com/miku24/

305 :デフォルトの名無しさん:03/07/26 11:40
http://seclan.dll.jp/c99d/c99d07.htm#dt19991101
キモー!

306 :デフォルトの名無しさん:03/07/26 11:42
x' := x-y;
y' := x'+y := (x-y) + y = x
x'' := y'-x' = x - (x - y) = y

…つーか、
> ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

307 :デフォルトの名無しさん:03/07/26 11:46
>>301
xとyの値を入れ替える

308 :301:03/07/26 11:53
レスありがとうございました>>302,303,306,307

たしかにおっしゃるとおりです、書き込んだ直後にやってしまったと思いました
>>306

309 :292:03/07/26 15:07
>>296
>>298
ありがd。一応理解できたような気がします。
(多分実際に理解するのはある程度使ってからだと思うけど)

310 :たく:03/07/26 17:54
すみません、わからないことがあるので教えてください。

struct WORD
{
char str[10];
int count;
struct WORD *next;
struct WORD *prev;
};

struct WORD *word;
struct WORD *text;
と定義した場合

word = text;
word->next = text;
としたら、*word もしくは word->nextに
*textの先頭アドレスを代入したと考えればよいのでしょうか?


311 :デフォルトの名無しさん:03/07/26 17:56
>>310
「*textの先頭アドレス」ではなく、text(の中身)を代入。

312 :311:03/07/26 17:59
*textのアドレスでもOK(ひねくれているが)

313 :たく:03/07/26 22:02
>>311,312
レスありがとうございます。
では、word->next = text = word;ということですか?
wordとwordのなかのnextが同じというのも少し変な気がするのですが。


314 :デフォルトの名無しさん:03/07/26 22:08
>>313
気のせいです。

僕のお父さんがおじいちゃんの子供だったなんて嘘だ!

と叫んでいるようなものです。

315 :デフォルトの名無しさん:03/07/26 22:22
jpegファイルをコピーする方法を教えてください。
具体的には

fin=fopen(jpeg1,"rb");
fout=fopen(jpeg2,"wb");

while(s=fgets(fin)!=NULL){
fputs(s,fout);
}
fclose(fin);
fclose(fout);

バイナリモードで開いてコピーしたのですが
うまく中身がコピーされていないようです。
どうすればうまくいくでしょうか?

316 :デフォルトの名無しさん:03/07/26 22:28
>>315
そのコードをコンパイルしてから出直してくださいませ。

317 :デフォルトの名無しさん:03/07/26 22:28
fgetsの使い方がおかしいが、書式なしはfread,fwriteを使うものだ

318 :314:03/07/26 22:36
>>317
fread,fwriteはどういうふうに使えばいいんですか?
引数が足りないとエラーが出たのですが

319 :無料動画直リン:03/07/26 22:38
http://homepage.mac.com/miku24/

320 :デフォルトの名無しさん:03/07/26 22:39
>>318
自分で調べる気がないなら putc/getc でも使っとけ。

321 :デフォルトの名無しさん:03/07/26 22:40
>>319
うむ、やっぱりそう説明するのがわかりやすいか。fprintfについても説明があっていいサイトだな。

322 :デフォルトの名無しさん:03/07/26 22:40
          _
  .曰    ,.'´ ィ 、 ヽ
  .| |    │ノノリ )) 〉
 ノ__丶   ,{{i(!l´∀`ノ!i  ヘェー
 ||幹||  | | lj|ヽ、ノ! リ
 ||古||  |i!/ ! ノ  〉つ))
 ||雲||  |!\)    l | ̄| ヘェーヘェー

323 :デフォルトの名無しさん:03/07/26 22:47
(´∀`)ハハハ

324 :デフォルトの名無しさん:03/07/27 03:05
>>321
ワラタ

325 :デフォルトの名無しさん:03/07/27 04:38
MS-DOS上で、プログラムの動作を確認してるんですが、
例えば、入力したものに応じて結果を出すプログラムの場合、
どうやってその結果を表示させるのかわかりません。
たま〜に「Ctrl+C」で出てくるけど、一回出てきたらそれで終わり。
他のものはエンターキーだけでいけるのだが。

326 :325:03/07/27 04:41
ちょっと分かりにくいから例を挙げますと、例えば、
「入力した単語の数を数えるプログラム」とかだったら、
MS-DOSのコマンドに単語を適当に打つじゃないですか。
それから、Enterを押しても、改行されるだけで、プログラムの結果
の「単語の数」が出てこないんですよ。
それをたま〜に「Ctrl+C」で成功できるんだが、ほとんどのばあい、
「^C」が出てくるだけ。いってることわかるよね?

327 :325:03/07/27 04:42
だれか、便利な方法とか、コマンドを知ってたら教えてください。

328 :デフォルトの名無しさん:03/07/27 04:51
EXIT

329 :デフォルトの名無しさん:03/07/27 04:58
>>325
もしやMS-DOS 1.25か?

330 :デフォルトの名無しさん:03/07/27 05:01
言ってること分かんない。

331 :デフォルトの名無しさん:03/07/27 05:12
>>326
およそ推測で答えるが、改行が来たら集計結果を表示するように作ってないのでは?
そのプログラムのソース晒してみて。

332 :デフォルトの名無しさん:03/07/27 05:12
>>326
とりあえずWindows98やWindowsMeを使うのはやめる。

333 :デフォルトの名無しさん:03/07/27 05:12
>>331
^Cを押して強制終了すると以降のものが表示されない環境があるんだよ。

334 :333:03/07/27 05:16
違う。^ZでEOFだ・・・

335 :デフォルトの名無しさん:03/07/27 05:16
>>333
^C じゃなくて改行で出て欲しいんじゃないの?
しかも、たまに ^C で出てくるって言ってるし。

336 :333:03/07/27 05:18
>>326
強制終了したら表示されなくて当然でしょう(笑)
SIGINTキャッチしているのならまだしも。
その環境ならCtrl+Zだよ。

337 :333:03/07/27 05:19
>>326
setvbuf(stdout,NULL,_IONBF,0);を追加してみてもだめ?

338 :333:03/07/27 05:20
337以外は俺の勘違いなので無視してください。

339 :デフォルトの名無しさん:03/07/27 05:22
フラッシュされてない悪寒。

340 :デフォルトの名無しさん:03/07/27 05:50
C言語以前の問題なのですが、
色々調べてみたのですが、
どうしても原因がまったく分からないので、
よろしかったら教えていただけないでしょうか。

C言語の本(「C言語で学ぶプログラミング基礎の基礎」)を買ってきて、
付属のCDでコンパイラをインストールしようとしたのですが、
「C:WINDOWS\SYSTEM32\CONFIG.NT.システムファイルは
MS-DOSおよびMICROSOFT WINDOWSアプリケーションを実行するのに
適していません」
とでて、インストールをさせてもらえません。
これの原因はどこにあるのでしょうか。
OSはXPで、特にいじった覚えもありません。

よろしくお願いします。

341 :デフォルトの名無しさん:03/07/27 06:09
>>340
何のコンパイラを入れようとしたわけで?

342 :デフォルトの名無しさん:03/07/27 06:17
>>341
おはようございます。
LSI C-86 Ver 3.30試食版です。

343 :デフォルトの名無しさん:03/07/27 06:38
C言語だけは俺に聞くな!

344 :デフォルトの名無しさん:03/07/27 06:39
Part 62.1.3

345 :デフォルトの名無しさん:03/07/27 06:49
>>342
http://www.borland.co.jp/cppbuilder/freecompiler/
これの方がいい

346 :デフォルトの名無しさん:03/07/27 07:06
(´∀`) ハハハ・・

347 :デフォルトの名無しさん:03/07/27 07:10
>>345
http://gcc.gnu.org/
これの方がいい

348 :325:03/07/27 07:32
325です。返事がおくれてすみません。
>>333
Ctrl+Zをためしてみましたが、ダメでした。

>>332
つかってるOSはWin XP Home Ediです。
プログラム組むにはVS.NETかなんか買ってこないとダメですか?
Linuxとかに変えたい場合はどうしたらいいんですか?
今のパソコンはWinで占領されていて市販のRed Hatをインストールだけでは
できないみたいなことをいわれたことがありました。新しいパソコンを買わないとダメ?

>331 :デフォルトの名無しさん :03/07/27 05:12
>>326
>およそ推測で答えるが、改行が来たら集計結果を表示するように作ってないのでは?
>そのプログラムのソース晒してみて。
そういうことだと思います。ソースは長いし、2chだとみにくいので載せません。

349 :デフォルトの名無しさん:03/07/27 07:35
っていうか、325の質問は新たな入力ファイルを作って、それをプログラムに読み込ませて
集計結果をMS-DOS上で表示させることで、解決できました。

350 :デフォルトの名無しさん:03/07/27 07:36
乱数取得する関数を作って、for文回す毎に違う値を得たいのですが
下のプログラムを実行するとfor文を回っても同じ値になってしまいます。

実行結果
40
40
40
(続く)

なぜでしょうか?どうすればいいでしょうか?どうかご指南お願いします。

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

//乱数取得関数
int get_rand(max){
int temp,ransu;
srand((unsigned int)time(NULL));
ransu=rand() % max;
return(ransu);
}

main(){
int i,ransu;

for(i=0;i<12;i++){
ransu=get_rand(128);
printf("%d\n",ransu);
}
}

351 :デフォルトの名無しさん:03/07/27 07:38
>>350
srandは初期値設定のための関数。何度も呼んではいけません。
mainで最初に一度だけ呼ぶ。

352 :デフォルトの名無しさん:03/07/27 07:40
>>351
早速試してみたところ成功でした。超即レスありがとうございました。

実行結果
15
7
88
108
9
84
1
123
126
84
36
105


353 :デフォルトの名無しさん:03/07/27 10:01
>>351
なぁ、でもseedが変われば出てくる値も変わるだろ?
time指定してんのになんで?

354 :デフォルトの名無しさん:03/07/27 10:04
[time()関数とは]
time()関数はUNIX由来の関数で、世界標準時の1970年1月1日0時0分0秒から現在の時刻までの
経過秒数を返す関数です。例えば、日本時間の2001年1月1日 0時0分0秒は、978274800となります。


355 :デフォルトの名無しさん:03/07/27 10:20
すごろくでいうと毎回振り出しに戻るを実行してから(ry

356 :デフォルトの名無しさん:03/07/27 10:35
>>354
ああ、一秒以内にループが実行されたのか。納得。


357 :デフォルトの名無しさん:03/07/27 10:36
>>355
お前はなんか解ってない予感。

358 :デフォルトの名無しさん:03/07/27 11:44
>>325
Ctrl+Zを2回とか
Ctrl+Zの後でEnterとか
そっち系か?

359 :デフォルトの名無しさん:03/07/27 14:54
mallocで正常にメモリ確保を行って、その結果を先頭として配列と同じ
ように使っていく(アドレスを++して行く方法)をつかって、どんどん先ま
で使っていくと、パソコンが落ちてしまいます。なぜでしょうか?そういう
物なんでしょうか?(メモリ確保が少ないと問題なく動きます)

360 :デフォルトの名無しさん:03/07/27 15:02
>>359
確保した以上に++しとらんか?

361 :デフォルトの名無しさん:03/07/27 15:03
そういうもんでしょ。
mallocで確保した領域以外に踏み込んじゃいけません。

362 :デフォルトの名無しさん:03/07/27 15:05
char *p1=malloc(1000);
p1 += 1000;
*p1 = 0; //どかーん

int *p2=(int *)malloc(1000);
p2 += 500;
*p2 = 0; //ちゅどーん

char *p3=malloc(1000);
p3++;
free(p3); //オカーサーン

363 :デフォルトの名無しさん:03/07/27 15:24
malocでメモリ確保をしなくても、普通に配列でflag[てきとうな数]みたに
宣言しても、落ちてしまいます。もしflag[1000000]みたいな感じに宣言
したら、エラーはどのタイミングで出るのですか?私の場合、宣言の時
にはエラーじゃないみたいなんですけど

364 :デフォルトの名無しさん:03/07/27 15:26
追加
と言うか、普通のパソコンならChar型で配列の大きさは、どれくらいまで
宣言できるのでしょうか?ウチだと10000ぐらいで落ちるんですけど

365 :デフォルトの名無しさん:03/07/27 15:29
パソコンとOSによる

366 :デフォルトの名無しさん:03/07/27 15:31
スタック増やすかstatic付けれ

367 :デフォルトの名無しさん:03/07/27 15:36
>>362よ、mallocのプロトタイプを今一度チェック汁
漏れよりじじいなら許す

364=342か?

368 :デフォルトの名無しさん:03/07/27 15:37
スタック・ヒープ・static領域が使用するメモリを、実行時に、
誰が何時どのようにしてOSから貰ってくるのかを考えれ。

369 :デフォルトの名無しさん:03/07/28 00:23
配列の要素をポインタで交換するプログラム
バグがとれません。どなたか教えてけろ。

#include<stdio.h>
void switch(int* c,int* d);

int main(void){
int a[ ]={1,2,3,4,5,6,7,8,9},b[ ]={9,8,7,6,5,4,3,2,1};
int* a_ptr=a;
int* b_ptr=b;
int i;
for (i=0,i<9,i++){
printf("a[%d]=%d, b[%d]=%d\n",i,a[i],i,b[i]);
}

switch(a_ptr,b_ptr);

for (i=0,i<9,i++){
printf("a[%d]=%d, b[%d]=%d\n",i,a[i],i,b[i]);
}

}

void switch(int* c,int* d){
int* temp;
temp=c;
c=d;
d=c;
}


370 :_:03/07/28 00:23
http://homepage.mac.com/hiroyuki44/hankaku04.html

371 :デフォルトの名無しさん:03/07/28 00:26
void switch(int* c,int* d){
int temp;
temp=*c;
*c=*d;
*d=*c;
}

372 :デフォルトの名無しさん:03/07/28 00:26
>>369 これ、コンパイルできるの?

373 :デフォルトの名無しさん:03/07/28 00:30
switch を 100 万回くらい見なおせ。
ついでに関数名を swap になおせ。

374 :デフォルトの名無しさん:03/07/28 00:32
ではまた来週。

375 :デフォルトの名無しさん:03/07/28 00:39
数字と文字の混じった文字配列から、特定の記号を見つけるには
どうしたらよいのでしょうか?
例えば
str="abcdefg,hijklmna"
の中からコンマを数えたり、aが二個あることを判定する処理をしたいのですが
strcmpy等を使っても動いてくれないんです・・・

376 :デフォルトの名無しさん:03/07/28 00:40
>>371
それは違うかと。
配列の先頭アドレスを交換するじゃないでしょうか。
>>372
もちろんできません。
>>373
100万回見直しました。
けどわかりません。


377 :デフォルトの名無しさん:03/07/28 00:42
>>375
strchr

378 :デフォルトの名無しさん:03/07/28 00:44
>>376
あのさぁ、ポインタ以前にtempにいれた値を使っていないことに気づかないの?

379 :デフォルトの名無しさん:03/07/28 00:49
>>378
うっかりしておりました。これは修正いたしました。









で、そろそろ誰か答えを!

380 :デフォルトの名無しさん:03/07/28 00:50
>>378
気付いてないから放置してあるんですよ。アホか。

381 :デフォルトの名無しさん:03/07/28 00:51
void swap(int* c,int* d){
int* temp;
temp=*c;
*c=*d;
*d=temp;
}
これをループでまわせ。

382 :デフォルトの名無しさん:03/07/28 00:51
>>379
とりあえずコンパイルが通るようにしましょうね。


383 :デフォルトの名無しさん:03/07/28 00:52
>>381
intとtempの間の*はいらん

384 :デフォルトの名無しさん:03/07/28 00:55
for分の,は;に直しました。

385 :369:03/07/28 00:58
正解を教えてくれたら
中谷美紀丸秘エロ画像をアップします。

386 :デフォルトの名無しさん:03/07/28 01:00
memcpy

387 :デフォルトの名無しさん:03/07/28 01:02
こういういい加減なやつはまじキエロ

388 :デフォルトの名無しさん:03/07/28 01:04
>>387
市ね!

389 :デフォルトの名無しさん:03/07/28 01:38
お、369の書き込みから1時間以上経ったか。
じゃあ答えを教えてやる。
「switch は予約語」

390 :デフォルトの名無しさん:03/07/28 01:42
for もポインタもやってて switch を知らないというのは、
どういう順番で勉強してるのやら興味があるな。

391 :デフォルトの名無しさん:03/07/28 01:47
しかもfor{(,,)だしな

392 :デフォルトの名無しさん:03/07/28 01:51
一瞬switchの使い方も解らんのかって思った

393 :デフォルトの名無しさん:03/07/28 02:14
言うとおりに直してもa[0]、b[0]だけしか交換行なわれななくない?

394 :デフォルトの名無しさん:03/07/28 02:16
スマンよく見てなかったm(_ _)m

395 :369:03/07/28 02:19
>>389様アンドその他
皆様ありがとうございました。
お礼の中谷美紀エロ画像です。

ttp://anan.magazine.co.jp/issue/index.jsp?gosu=1374

396 :デフォルトの名無しさん:03/07/28 02:20
3次元には興味はない。

397 :デフォルトの名無しさん:03/07/28 02:27
>>393
するどい!

398 :369:03/07/28 02:28
いやー、
みなさんなんで優秀なのに2chなんかやってんですか?

399 :デフォルトの名無しさん:03/07/28 02:29
>>397
やりゃわかる
>>381

400 :_:03/07/28 02:30
http://homepage.mac.com/hiroyuki44/

401 :デフォルトの名無しさん:03/07/28 04:41
ttp://www5c.biglobe.ne.jp/~MOGI/algorithm/algorithm02.htm#SEC1
ここの練習問題8-2のサンプルプログラムをC言語で作りたいのですが
うまく見れません。
サンプルプログラムひらいてそこのJavaのソ-スを見ながら真似て
C言語で書いてみたのですが,Javaの知識が無いためかうまくいきません。
どこがおかしいか指摘してもらえないでしょうか?


402 :401:03/07/28 04:42

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

void boxrnd(double m,double sig);
double x=0,y=0;

main()
{
int i,j;
int hist[100];
int x2,y2;

for(i=0;i<100;i++)
hist[i]=0;
for(i=0;i<1000;i++){
boxrnd(2.5,10);
x2=fabs(x);
y2=fabs(y);
hist[x2]++;
hist[y2]++;
}

for(i=0;i<=20;i++){
printf("%2d :",i);
for(j=0;j<hist[i]/10;j++)
printf("*");
printf("\n");
}
}


403 :401:03/07/28 04:42


void boxrnd(double m,double sig)
{
int r1,r2;

r1=rand();
r2=rand();
x =sig*sqrt(-2*log(r1))*cos(2*3.14159*r2)+m;
y =sig*sqrt(-2*log(r1))*sin(2*3.14159*r2)+m;

}


404 :デフォルトの名無しさん:03/07/28 09:32
>>403
randを使う前にsrandで初期化。

405 :デフォルトの名無しさん:03/07/28 09:51
randとMath.randomでは値域が違う

406 :デフォルトの名無しさん:03/07/28 14:28
char*型の文字列をバイナリ形式で保存すると4Byteで
何文字も保存できるんですけど、これって、4Byteで最大
何文字保存できるんですか?

407 :デフォルトの名無しさん:03/07/28 14:34
失礼ながら大爆笑

408 :デフォルトの名無しさん:03/07/28 14:34
告白したいけど、自分に自信がない。それでも胸の奥が苦しくて・・・
そのような方、諦めないで。
ここでは、異性に効果を発揮する香水、合法ドラッグなどがおかれています。
小売価格一万円以上の品が、半額以下の値段で取引されています。
是非ここでゲットして、貴方の気持ちを打ち明けて下さい。
相手の方も、きっとそれを待っていますよ。

http://www.adultshoping.com/index.cgi?id=1057809839


409 :デフォルトの名無しさん:03/07/28 14:39
ぇぇっ!
大爆笑ってなんで?

410 :デフォルトの名無しさん:03/07/28 14:41
>>409
>>400のリンク先があまりにもおもしろかったから。

411 :デフォルトの名無しさん:03/07/28 14:41
>>406
char *sを保存しても無意味だぞ。
char (s[0],s[1],s[2],…)を保存したいんだろう?

412 :デフォルトの名無しさん:03/07/28 14:45
>>406
>char*型の文字列

文字列は char*型 ではなく、
文字(char型)データが連なったものだが?


413 :デフォルトの名無しさん:03/07/28 14:50
{
  int hfile;
char *A;
hfile=FileCreate("E:\\Project\\char.txt");
FileWrite(hfile,&A.str,sizeof(char*));
FileClose(hfile);
}
↑これで保存して

↓これで読み直してるんだけど
{
int hfile;
char *B;
hfile=FileOpen("E:\\Project\\char.txt",0);
FileRead(hfile,&B.str,sizeof(char*));
FileClose(hfile);
}
普通にBにはAで保存した内容が入ってるんですけど…
PC内のメモリが初期化されてないからですか?

414 :デフォルトの名無しさん:03/07/28 14:52
>>413
同一プロセスで動かすなよ。

415 :デフォルトの名無しさん:03/07/28 14:53
>>413
プログラムを分離して別に実行したらどうなる

416 :デフォルトの名無しさん:03/07/28 15:04
今、再起動してAを実行せず、Bを実行したんですが、正常に読めました。
これはどういうことでしょう?

ついでに、別にプログラム作ったら、ファイル名が表示されました。
なんで?

417 :デフォルトの名無しさん:03/07/28 15:05
気のせいです。

418 :デフォルトの名無しさん:03/07/28 15:17
>>413
> char *A;
> FileWrite(hfile,&A.str,sizeof(char*));

なんだこれわ。

419 :デフォルトの名無しさん:03/07/28 15:24
FileCreate 系の関数ってMSDNにないわな?
その関数の仕様見たいかも

420 :デフォルトの名無しさん:03/07/28 15:26
ごめん、FileWrite(hfile,&A,sizeof(A));でした。

ちなみに、スレ違いであることに気がつきました。
FileWriteはC++Builderの関数です。Delphi6にあるのと同じです。


421 :デフォルトの名無しさん:03/07/28 15:48
FileWrite(hfile, A, strlen(A));

ってか、ポインタってのが何なのか勉強しる。

422 :デフォルトの名無しさん:03/07/28 15:49
住所でしょ?

423 :デフォルトの名無しさん:03/07/28 15:59
マウスポインタ=ねずみの住所=デズニーランド

424 :デフォルトの名無しさん:03/07/28 16:00
>>422
勉強汁!

425 :デフォルトの名無しさん:03/07/28 16:08
こんな所でポインタ定義論始めんなアフォ

426 :デフォルトの名無しさん:03/07/28 16:18
技術評論社 新ANSI C言語辞典 著:平林雅英より

◆ポインタ ( pointer,指標,指針 ) 被参照型の実体を間接参照可能なオブジェクト。
オブジェクト(のアドレス)を指すオブジェクトであり…
ポインタのポインタとは、オブジェクト(のアドレス)を指すポインタ(のア
ドレス)を指すオブジェクトのことである。
ポインタは一種のアドレスであるが、…

住所じゃないの?

427 :デフォルトの名無しさん:03/07/28 16:25
演説です

428 :デフォルトの名無しさん:03/07/28 16:28
>>426
じゃあ、友達や知人の住所や連絡先を書き記しておくものは、
ポイント帳とでも呼んでいるのですか?

429 :デフォルトの名無しさん:03/07/28 16:31
>>426
住所を格納する「変数」
て意味合いで取る場合もあるし、アドレスを指す言葉でもある。
「さんきゅう」と発音すると、「thank you」「産休」「三級」いろんな言葉の意味があるが
前後のやり取りにより、一発で意味わかるやろ?
例えが変でスマソ

430 :デフォルトの名無しさん:03/07/28 16:32
まあふつうは「さんきゅう」といったら地下鉄なわけだが。

431 :デフォルトの名無しさん:03/07/28 16:33
「さんきゅう」≠「thank you」

432 :デフォルトの名無しさん:03/07/28 16:36
>>426
配列の添え字も一種のポインタなのだが、
それもアドレスだと言うのですか?

433 :デフォルトの名無しさん:03/07/28 16:37
「さんきゅう」=「sank you」(あなたを沈めた)

434 :デフォルトの名無しさん:03/07/28 16:37
内容の存在するメモリへの アドレスのエイリアスじゃないのか。

435 :デフォルトの名無しさん:03/07/28 16:40
>>434
じゃあ、マウスポインタはメモリ上のどのアドレスのエイリアスなんですか?

436 :デフォルトの名無しさん:03/07/28 16:43
レーザーポインタはどうするんだよ

437 :デフォルトの名無しさん:03/07/28 16:43
矢印

438 :デフォルトの名無しさん:03/07/28 16:44
ポイントするのにアドレスを使ってんだぼけ
マウスポインターはマウス用のポイントするもの(er)だ





変な説明だ。。。もうやめましょうYO!

439 :デフォルトの名無しさん:03/07/28 16:44
それは最近のOSならOSが管理してるんじゃないの?

440 :デフォルトの名無しさん:03/07/28 16:46
Pointer とは↓これの事
http://pointer.s12.xrea.com/

441 :デフォルトの名無しさん:03/07/28 17:38
ポインは〜赤ちゃんが吸うためにあるんやで〜

442 :デフォルトの名無しさん:03/07/28 17:38
(テキストに保存でコピペしたら長すぎたので、3回に分けます。)
たまに発生するエラーです。環境はVC++6.0 WinXP Windowsプログラミングですが、「C言語」に関することと思います。
解決方法がさっぱりわからないので、みなさんのお力を拝借したいと思っておりますm(__)m
まずはソースをご覧ください。お手元でコンパイルできるように大幅な編集をしております。
(Pyon関数内で、構文に関しエラーが発生しますが、ご了承ください)
が、このソースを実行しても問題のエラーは発生しないと思われます。
どういったアプローチをしているかが分かれば十分と思い、割愛させて頂きますm(__)m
#include <stdio.h>

#define MAX100

typedef struct _APP{
/*
いろいろ
*/
int freeFlg;
}APP;

typedef APP* PAPP;

APP App[MAX];
int g_Count=0;

bool Pyon( PAPP _1, PAPP _2 );/* 二つの構造体を様々に比較しようとしてる関数 */


443 :デフォルトの名無しさん:03/07/28 17:39

int main( void )
{
int i;
PAPP pApp;
while(1){
g_Count++;

for( i=0; i+1<MAX; i++ ){
pApp = App+i;
if( !Pyon( pApp, pApp+1 ) ) continue;
/*
様々な処理
*/
}
}

return 0;
}

bool Pyon( PAPP _1, PAPP _2 )
{
return/* いろいろ */? false:true;
}
以下、問題点を記述します。

444 :デフォルトの名無しさん:03/07/28 17:39
Pyon関数内の処理でエラーが発生。ソフトが落ちます。
pAppポインタ変数に本来あるべきではないアドレス(APP構造体以外のアドレス)が保持されます。
そのアドレスは、10行後ぐらいに宣言している、int g_Countのアドレスです。
これは、VCのデバック機能で分かりました。例えを挙げますと、一度コンパイルして実行します。すると、
for文の i が64のとき、pAppにg_Countのアドレスが保持され、Pyon関数内で参照するときにエラーと言った具合です。
また、この場合MAX定数を50等変更すると、エラーはおきません。当然かな?σ(^_^;)アセアセ...
さらに、イメージとしては理解できるのですが、「g_Countを宣言する箇所を変更」した場合にも、エラーは直る場合があります。

コーディングを進めていく度に発生するので、どうにかして解決策が欲しいところです。
みなさま。どうかよろしくお願い致しますm(__)m

445 :デフォルトの名無しさん:03/07/28 17:41
そうですか。

446 :442:03/07/28 17:42
どうってことは無いケアレスミスですが、APPの構造体で
「int freeFlg」の宣言は意味がありません。すいませんでしたm(__)m

447 :デフォルトの名無しさん:03/07/28 17:48
どうでもいいけど、_1とか_2なんて名前はやめようよ。

448 :442:03/07/28 17:51
>>447
はい。p1とp2でいいですね。すいません。

449 :デフォルトの名無しさん:03/07/28 17:54
>>443
無限ループになりそうだけど、/*様々な処理*/ってところにreturnがあるの?

450 :デフォルトの名無しさん:03/07/28 17:59
こんなに見えちゃってヤバクない???
http://yahooo.s2.x-beat.com/linkvp2/linkvp2.html


451 :442:03/07/28 18:02
はい。そのように考えていただいて結構です。
whileの中をグルグル周り、ESCを押され等、ユーザーがイベント操作することで
whileを抜けるようになっています。

452 :442:03/07/28 18:08
大変すいません。449さんの欲しい答えではない&ソースミスでした。
for文中ではなく、
/*
様々な処理
*/
は、for文を抜け、while文の中に実装しております。
真に申し訳ないm(__)m

453 :デフォルトの名無しさん:03/07/28 18:09
初心者はデバガなんか使わないで printf デバグしてみれ。

454 :デフォルトの名無しさん:03/07/28 18:22
>>443
> for( i=0; i+1<MAX; i++ ){
> pApp = App+i;
> if( !Pyon( pApp, pApp+1 ) ) continue;
APP App[MAX];なら0..MAX-1まで。
i=MAX-1までループしたらApp[i+1]は範囲外。


455 :デフォルトの名無しさん:03/07/28 18:26
しないし。

456 :デフォルトの名無しさん:03/07/28 18:28
>>442-444
ここには書かれてないところで i か pApp かが
書き換えられてる予感がする。
明示的に書き換えられてると分かりやすいけど、
別の何かの配列の書き換えで
添字が変になってる場合だったりすると厄介だな。

あと、今回の話とは関係ないと思うけど、
グローバル変数使う前には
本当にそれがグローバル変数であるべきか
100 回考えるべし。

>>454
ループ条件を 100 回見直すべし。

457 :デフォルトの名無しさん:03/07/28 18:31
>>456
80回にまけてくれ。

458 :442:03/07/28 18:49
>>454
ループ条件が分かりにくかったですね。すいませんでした。
>>456
>ここには書かれていないどこかで・・・
>・・・厄介だな
その可能性があると思い、関係あるソースを洗っていきましたが、見つかりませんでした。
探し方が足りない&開発者による盲点 の症状が出てるかもしれませんがσ(^_^;)

Ps. 
グローバルについては四苦八苦している最中ですので、これから精進いたします。

459 :デフォルトの名無しさん:03/07/28 18:49
>>455-456
すまん。


460 :442:03/07/28 19:00
補足します。
>>444で、エラーがどうすれば直るか。ということを述べている場所で
>「g_Countを宣言する箇所を変更」した場合にも
>エラーは直る場合があります。

とあります。どういった事か分かりにくかったと思い、具体例を出します。

>>442のソースで、
APP App[MAX];
int g_Count=0;
これを、
int g_Count=0;
APP App[MAX];
や、
APP App[MAX];
char str[255]; // この行は意味がありません。エラーをなくす為にです。
int g_Count=0;

とした場合、iの値が32の時g_Countのアドレスが保持されたり
MAX定数を100000にすると、iが798の時g_Countのアドレスが保持されたり
(↑の場合、当然MAX定数が従来の100としてあるときはエラーになりません)
といった、現象が起きます。
補足を終わりますm(__)m

461 :デフォルトの名無しさん:03/07/28 19:32
>>460
pApp と i の値を
pApp = App + i; の時と
Pyon の呼ばれる直前とで調べて、
値が違ってたらその間で変なことが起こっている。

462 :デフォルトの名無しさん:03/07/28 20:36
EXEファイルの最後に別データを埋め込んで取り出す、という
自己解凍書庫のようなことをやりたいのですが
WindowsのEXEファイルのファイルサイズ(EXE部分)を取得するにはどうすれば良いでしょうか?

DOSであれば
02〜03H 最後のページに入っているバイト数
04〜05H 512バイト単位のファイルの大きさ(ヘッダも含む)。
らしいのですが、Windows上で動く32bitEXEの場合
常に同じ値になってしまいファイルサイズが取得出来ません。

463 :デフォルトの名無しさん:03/07/28 20:39
>>462
>>1

464 :デフォルトの名無しさん:03/07/28 20:43
>>GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)

でしたね^^;
ごめんなさい。

465 :デフォルトの名無しさん:03/07/28 20:45
Win32API 質問箱 Build12
http://pc2.2ch.net/test/read.cgi/tech/1056033645/l50

466 :デフォルトの名無しさん:03/07/28 20:47
ありがとうございます〜
そこで質問してきますね。

467 :442:03/07/28 20:50
大変申し訳ありません。初めに、
>まずはソースをご覧ください。お手元でコンパイルできるように大幅な編集をしております。
と書きましたが、461さんの発言で、
編集しすぎてしまい処理内容にすれ違いが起こっていると思いました。
その違いはごく単純なもので、main関数の3,4行目に
int i;
PAPP pApp;
と、二つの変数が宣言されていますが、実際のソースではmainでは行われません。
main関数は 、whileでぐるぐる回しており、
この様に変更します。
int main( void )
{
while(1){
g_Count++;
Hit();
}
return 0;
}
そして、新たにHit関数も設けます。定義は、void Hit( void ); です。
そして、Hit関数の中で、以前のmain関数の内部処理が行われます。
が、以前のmain関数でのwhileループは削除してください。
その結果、Hit関数は

468 :442:03/07/28 20:51
void Hit( void )
{
int i;
PAPP pApp;
for( i=0; i+1<MAX; i++ ){
pApp = App + i;
if( !Pyon( pApp, pApp+1 ) ) continue;
// 様々な処理
}
}
です。
この違いで何が変更されるかといいますと、PAPP pAppの宣言が、一度行われるのではなく、mainのwhile関数によって
毎回行われているということ。そして、pAppへアドレスを保持する箇所は、Hit関数の
pApp = App + i;
でしか、行われていないことです。

ツギハギの説明なので、ややこしく理解に苦しむかと思われます。
うぜーとか不快に思われた人が多数いるなら、もうこれで終了にします。
出来れば、助けてくd・・・( ´ ・ ω ・  ` )

469 :デフォルトの名無しさん:03/07/28 21:02
>>468
Pyon(&App[i], &App[i + 1])
にしてもだめなの?

470 :名無し@沢村:03/07/28 21:13
おまいらよ、C言語でTVウェアをつくらないか?

http://pc2.2ch.net/test/read.cgi/tech/1059262203/l50


471 :442:03/07/28 21:16
>>469さんの用に扱うことはできません(´・ω・`)
ポインタを必ず扱うようにしなくちゃならない関数になってるんでσ(^_^;)
ポインタを渡さない場合、添え字にする i 変数を
色々変化させないと好きなAPPを指すことができないんですよ(´・ω・`)

472 :デフォルトの名無しさん:03/07/28 21:22
>>471
& が見えない?

pApp = App + i;
Pyon(pApp, pApp + 1)



Pyon(&App[i], &App[i + 1])

は、上のだと pApp が変更される恐れがあることを除いて
等価なコードだぞ(C++ だとまた話は違うが)。

473 :デフォルトの名無しさん:03/07/28 21:24
>>468
実際にそのバグが出るソースを見ないことには
「どっかで値を壊してるんじゃないの?」としか言えない。

まあソース出されてもたぶん読まないけど…

474 :デフォルトの名無しさん:03/07/28 21:29
とりあえず Pyon の引数の型を
PAPP から const App* に変えてみてはどうだろう。
比較関数なら内容を変えることはないでしょ?

475 :442:03/07/28 21:39
>>472さん。
うんうん。それは分かってるんだけど
Pyonに渡すのは、&App[i]とか、「i」で渡すと不便なんです。
実際は、pApp = App + i; したあとに、多くの処理をして
pAppが保持しているアドレスを#defineで書かれた定数を使い、
変化させてるんです。ちなみに定数はMAX未満です。

>>473
ソースコード全部で67kbytesありました。ちょい多いっすねσ(^_^;)

## 結構大きめなソフトなんで、こちらも説明しずらい部分がありました。
で、問題点となるものを新しく簡潔にしましたので、そちらをお願いしますm(__)m
442の出した質問は無かったことに(´・ω・`)

476 :442:03/07/28 21:43
>>474
うん。比較関数なので、その形でいいです。
ですが、エラーになったとき、Pyon関数へ引数として渡される前に、
pAppにはg_Count を指すアドレスが入ってるので、Pyon関数自体は意味がなかったり^^;


477 :デフォルトの名無しさん:03/07/28 21:45
で、>>467のソースでも同様の問題は起きているの?

478 :デフォルトの名無しさん:03/07/28 21:48
>>475
やっぱり pApp 変えとったんかい!
その pApp を変化させるところで
App[MAX - 1] より大きいところを指すようになってるとしか
考えられない。
pApp は App にある数足してるんだから
定数が MAX 未満でも、pApp[MAX - 1] を越えてしまうこともあるやろ。

479 :デフォルトの名無しさん:03/07/28 22:02
>>477
いえ。あくまでも模型なだけで、このソースでそういったエラーはおきていませんσ(^_^;)アセアセ...
>>478
うんうん。確かに俺もそう考えました。エラーが起きた当初はね。
でも、VCでのデバックモードで、
pApp = App + i;
この時点で、pAppに保持されている値は、App関連のアドレスではなくて(0x0012ff1c等)
「g_Count」って名前と、そのアドレスが入っていたんですよ。
それも478さんのでありえる話なのかな?・゚・(つД`)・゚・

480 :デフォルトの名無しさん:03/07/28 22:07
元442です。>>475の最後辺りの文章を読んだ上で、ご覧くださいm(__)m

char Str[100]="ABCDEFGHIJK";
char *p;
p = Str + 4;
double Syousu = 0.0;

です。
Str[100]を宣言した瞬間、メモリにはchar型のサイズで101個分連続した空き箱を作るんですよね?
そして、p には、Str[4]のアドレスが保持される。であってますよね?

で、double型の変数Syousuのアドレスは、
char Str[100]の場所になる可能性はありますか?ここが非常に知りたいんです・゚・(つД`)・゚・

説明が分からないって方いません?σ(^_^;)アセアセ...

481 :百済 ◆jrisyb5rl6 :03/07/28 22:08
                               ミ     
                       ミ  ( ,,,,,, ∧,,∧   
                    ∧,,∧   η ミ,,゚Д゚彡  
           ミ __    ミ,,゚Д゚彡   (/(/     ミ  /)    
            て"  ミ   ミ つつ     彡      ミ `つ 
             ⊂   ミ    ミつつ 彡          ⊂  つ   
            彡"  ミ                   彡"。γ。ミ  
       ∧,,∧    ∨"∨ 彡                   ∨"∨ 彡   ∧,,∧     / ̄ ̄ ̄ ̄ ̄
   ( ,,,,,ミ,,゚Д゚彡                                   ミ,,゚Д゚彡  < 百済参上! 
  ⊂,,,,,,,,,,,,,,,つつ                                    ミ  ,つ    \_____
 彡                                          〜ミ ,ミつ  スタッ !
  ピョン!                                         (/         

482 :百済 ◆jrisyb5rl6 :03/07/28 22:09
>>480
> 101個分連続した空き箱を作るんですよね?

100個分だぞ。

483 :_:03/07/28 22:09
http://homepage.mac.com/hiroyuki44/hankaku04.html

484 :デフォルトの名無しさん:03/07/28 22:11
>>479
pApp = App + i;
の時点で pApp に保持されてる値が
g_Count のアドレスで、
かつ、i の値は MAX より小さい、
ということで?
もう一度確認してもそうなる?

ウォッチで
App[i], i, App, pApp, g_Count の 5 つを見て、
値に矛盾が出る?

485 :デフォルトの名無しさん:03/07/28 22:21
>>482
0も含めると100個分だよね?リアル個数だと101個だと思うんだけど、俺はここから間違ってるか?(つД`)
>>479
今確認できないんです。すごく調子よくてエラー起きてないんでσ(^_^;)
前述しているように、g_Countを宣言する箇所が変化すると、エラーが起きなくなったりしてるんです。
そのせいで、どんどんコーディングしてるうちに、エラーが消滅しました。
今はMAXを4323111123ぐらいでしたっけ?保持できる場所を越えて@@@@APP _CODECなんたらかんたら
ってエラーが出るぐらいMAXを増やしても、大丈夫になったんですが、
なんでだろーって詳しくわからないんです。

で、ついさっき久々に出て、またエラーなくなりましたσ(^_^;)


486 :百済 ◆jrisyb5rl6 :03/07/28 22:24
>>485
char Str[100]ならStr[0]からStr[99]まで確保されるはずだけど・・・

487 :百済 ◆jrisyb5rl6 :03/07/28 22:25
×まで確保
○までの100個分が確保

488 :デフォルトの名無しさん:03/07/28 22:29
>百済
あれ。。。そうなんだ

。。。って、試したらそうやったー。何考えてるんやろ俺・゚・(つД`)・゚・

489 :デフォルトの名無しさん:03/07/28 22:39
>>488
VBの仕様と混同していたとか

490 :デフォルトの名無しさん:03/07/28 23:03
printfで " を表示させたいのですがエラーがでます
解決方法はありますか?


printf(" "CENTER" ");

491 :デフォルトの名無しさん:03/07/28 23:05
>>490
拡張表記

492 :デフォルトの名無しさん:03/07/28 23:08
printf(" "CENTER" ");

printf(" \\\b\"\\\b\\\\\b\\\b\bCENTER\\\b\"\\\b\\\\\b\\\b\b \b");

493 :デフォルトの名無しさん:03/07/28 23:08
>>490
\"使って
こう書けば(・∀・)イイ!!
printf(" \"CENTER\" ");

494 :デフォルトの名無しさん:03/07/28 23:46
そう言えばこの間、仕事で別会社のヤシが、
>>490と同じ事オレに聞いてきたな…。

プロのクセにそんな初歩的なこともわからないのか?
と小一時間問い詰めてやりたかったが仕事の関係上やめておいた…。

495 :401:03/07/29 00:47
遅くなりましたが返信ありがとうございまいした。

初期化をするとrandで乱数を発生させることには成功しました。


しかしその後がどうもうまくいきません。。。。

printfで確認したところrandで乱数は発生しているのですが、

x,yの計算結果が固定されてしまっています。。。

結果の一部はこんなかんじです。



r1=2084180332 r2= 510239677 x= 0 y=-524288

r1=1662509978 r2= 76901842 x= 0 y=-524288

r1=1183502636 r2=1564379174 x= 0 y=-524288

r1=1395037916 r2=1734631552 x= 0 y=-524288


496 :401:03/07/29 00:49
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>

void boxrnd(double m,double sig);
double x=0,y=0;
main()
{
int i,j;
int hist[100];
int x2,y2;
srand((unsigned)time(NULL));
for(i=0;i<100;i++)
hist[i]=0;
for(i=0;i<1000;i++){
boxrnd(2.5,10);
x2=fabs(x);
y2=fabs(y);
hist[x2]++;
hist[y2]++;
}


497 :401:03/07/29 00:49
void boxrnd(double m,double sig)
{
int r1,r2;
r1=rand();
r2=rand();
printf("r1=%10d r2=%10d ",r1,r2);
x =sig*sqrt(-2*log(r1))*cos(2*3.14159*r2)+m;
y =sig*sqrt(-2*log(r1))*sin(2*3.14159*r2)+m;
printf("x=%7d y=%7d\n",x,y);

}


498 :デフォルトの名無しさん:03/07/29 00:50
>>495 たぶん >>351

499 :デフォルトの名無しさん:03/07/29 00:55
っておもいっきり誤読してた

500 :デフォルトの名無しさん:03/07/29 00:59
>>497
%d で double 型を表示させようとしてるから

501 :401:03/07/29 01:13
ヒストグラムがうまくでないのが問題なのですが、どこがおかしいのでしょうか?

502 :デフォルトの名無しさん:03/07/29 01:17
☆無修正画像&サンプルムービーをどうぞ!!☆
http://yahooo.s2.x-beat.com/linkv/linkv.html

503 :405:03/07/29 01:19
>>501
randは0〜RAND_MAXまで。
Math.randomは0〜1まで。
乱数の範囲が違う。
sqrtの中に-2があるので、虚数がでないように0〜1の範囲にする。
log(0)は-∞となるので、特別な処理が必要。

504 :401:03/07/29 01:34
どうも具体的にどうプログラムを書けばいいかわからないのですが・・
教えてもらえないでしょうか?

505 :401:03/07/29 02:28
rand()/(RAND_MAX+0.1)としたら乱数を0から1に収めることができたのですが、
結果がこのサイト ttp://www5c.biglobe.ne.jp/~MOGI/algorithm/algorithm02.htm#SEC1 
のようにきれいにでません。なぜでしょうか?

506 :アナ・コッポラ:03/07/29 02:38
できたー みなさんどうもありがとう 

507 :405:03/07/29 03:33
>>505
boxrndの引数がそのサイトのJavaScriptのものと違っている。

508 :デフォルトの名無しさん:03/07/29 03:39
http://www.metrowerks.com/MW/download/default.asp
↑の「CodeWarrior Development Studio for ColdFire Architectures」
ってヤツをダウンロードしたんだけど、WinXPでも大丈夫だよな?

ダウンロードは無料で使用するにはライセンスが必要って書いてるけど、
べつにライセンス買わなくたって誰にもバレやしないじゃないの?

「CodeWarrior Development Studio for ColdFire Architectures」
「CodeWarrior Development Studio for HC08 Microcontrollers」
「CodeWarrior Development Studio for HC12 Microcontrollers」
「CodeWarrior Development Studio for PowerPC ISA」
「CodeWarrior Development Studio for PowerPC DSP」
↑のようにいろいろあるわけだけど、一番上のヤツをダウンロードして
間違いないよな?だれかこれらの違いを説明してくれ。


509 :デフォルトの名無しさん:03/07/29 03:46
クソして寝ろ

510 :508:03/07/29 03:58
だれか質問に答えてくれ。
答えないなら答えるまでage続けます。

511 :デフォルトの名無しさん:03/07/29 04:14
まだか、ゴルぁ!

512 :デフォルトの名無しさん:03/07/29 04:29
またか、ゴルぁ!

513 :デフォルトの名無しさん:03/07/29 04:32
またか、ゴルぁ!

514 :_:03/07/29 04:40
http://homepage.mac.com/hiroyuki44/jaz09.html

515 :_:03/07/29 04:41
http://homepage.mac.com/hiroyuki44/

516 :デフォルトの名無しさん:03/07/29 05:21
>508
どうせなら
CodeWarrior for PalmOS
がいいんじゃないか?(’’

517 :デフォルトの名無しさん:03/07/29 17:45
初心者です。
今学習のために、完全数を探すプログラムを作ろうとしてます。
任意の数字までループさせ、そのそれぞれの数字の約数を表示させることには成功したのですが、
その約数を配列に代入する方法がわかりません。
約数の数はいくつあるかわからないので、いくつ配列を用意したらいいか等が
理解できません。
どなたか教えていただけないでしょうか?

unsigned int i,n;
   for(i=2;i<4000000000; i++)
      {
         for(n=1;n<=(i/2);n++)
            {
               if((i%n)==0)
                  {
                     printf("%dの約数は%dです。\r\n",i,n);
                  }
            }
       }

main関数の中身です。unsigned int は40億位まで扱えるらしいので、それまでループさせ、
約数を表示させるまではできたんですが・・・。
どなたかよろしくお願いします。

518 :デフォルトの名無しさん:03/07/29 18:21
>>517
配列を用意する必要は無い。
変数を用意して約数を見付けるごとに加算すればよい.


519 :デフォルトの名無しさん:03/07/29 18:36
>>517
正攻法だと、intを溜めるための構造体を作って、
その構造体を管理する関数群を実装し利用するってことになるかね。

#define UNIT_ALLOCATE 256
typedef struct {
 unsigned int *data;
 size_t allocated;
 size_t end;
} uintarray;
uintarray *ianew(void) {
 uintarray *ia = malloc(sizeof(uintarray));
 if (!ia) return NULL;
 ia->data = NULL; ia->allocated = 0; size_t end = 0;
 return ia;
}
uintarray *iaappend(uintarray *ia, unsigned int i) {
 if (allocated <= end) {
  unsigned int *tmp = ia->data;
  ia->data = realloc(ia->data, ia->end + UNIT_ALLOCATE);
  if (!ia->data) {
   ia->data = tmp;
   return NULL;
  }
  ia->end += UNIT_ALLOCATE;
 }
 ia->data[ia->end++] = i;
 return ia;
}
こんな感じで。行数収めるのにちょっとヘンな表記してるけど。

520 :デフォルトの名無しさん:03/07/29 18:40
むむバグが。コンパイルもとおらねえなw
まあいいや。その辺は練習問題w
intをためるならこんな感じでmalloc系を使ってやれってこと。

521 :517:03/07/29 18:54
>>518
新たな変数PNを用意して、こんな風にしてみたんですがどうでしょうか?
main関数の中身です。

unsigned int i,n;
unsigned int PN;
PN = 0;
for(i=2;i<4000000000; i++){
   for(n=1;n<=(i/2);n++){
      if((i%n)==0){
         PN=PN+n;
         if(PN==n)//完全数かどうかを調べる
         {
             printf("%dは完全数です。\r\n",PN);
}}}}

行数節約のため変になってて申し訳ありません。
自分としてはこれが精一杯です。
しかもコンパイルしたら予想通りには動きませんでした・・・。

>>519
わざわざそんなに書いてもらってありがとうございます。
しかし、私にはまだ理解できませんので、少しずつ理解できるように読んで行きます。
できたら、簡単な流れを教えていただけるとありがたいです。
よろしくお願いします。



522 :デフォルトの名無しさん:03/07/29 18:59
>>521
PN = 0;の場所が違う
n<=(1/2)が違う

523 :デフォルトの名無しさん:03/07/29 19:01
これ、終了するまでどれくらい時間がかかるんだろう。

524 :522:03/07/29 19:02
1/2じゃないi/2だった
n<=(i/2)が違う

525 :517:03/07/29 19:12
とりあえず改良してここまでやってみました。
unsigned int i,n;
unsigned int PN;
for(i=2;i<10000; i++){
   PN = 0;
   for(n=1;n<=i;n++){
      if((i%n)==0){
         PN=PN+n;
            if(PN==2*i){
               printf("%d\r\n",(PN/2));
}}}}

なんとか動き、6や28等は表示されるんですが120等無意味な数字も表示されてしまいます。
このソースのどこがおかしいのでしょうか?

526 :デフォルトの名無しさん:03/07/29 19:21
>>525
2個目のif文の場所

527 :517:03/07/29 19:37
>>526
ありがとうございました。
しっかり動くようになりました。

ためしに動かしてみたんですけど、8128まではすぐ表示されたんですが
次の完全数は何分たっても表示されません(笑

達人はこんなのよりもっともっと高速なプログラムを組むんだろうなぁ・・・

528 :デフォルトの名無しさん:03/07/29 19:58
>>527
高速な判定法が知りたかったら「メルセンヌ素数」あたりで
検索して見るとよいかと。

529 :デフォルトの名無しさん:03/07/29 20:01
ageてしまった。
吊ってくる

530 :デフォルトの名無しさん:03/07/29 20:02
>>529
他の人がageにくくなるからそういう書き込みはやめよう。

531 :517:03/07/29 20:04
>>528
あ、知ってます。
(2^p)-1が素数になる場合、{(2^p)-1}{2(p-1)}が完全数になるやつですよね?
メルセンヌ数を探す方法で完全数を探すのと今見たいに探すのどっちが速いだろう・・・

532 :デフォルトの名無しさん:03/07/29 20:30
C++ では
 アンダースコアで始まり次に大文字が続く識別子と、
 アンダースコアを2つ連続で含む識別子は、
 処理系や標準ライブラリのために予約されていて、
 また、グローバル名前空間に属す識別子は
 アンダースコアで始まる識別子全般も予約されている
んだけど、C ではどうなってるんですか?
教えて規格博士!

533 :519:03/07/29 20:33
>>521
構造体uintarrayには、unsigned intを溜めておく領域へのポインタ(data)と、
確保した領域の大きさ(allocated)と配列の末尾(end)が含まれている。
実際のデータとその領域を管理するための情報があるといってよい。

ianewは、uintarrayの確保をして初期化して返す。
配列領域は確保してない。

iaappendは配列(data)の末尾に整数を一個付け加えるけど、
配列の領域が足りなかったら領域を確保しなおしてる(realloc)。

確保すべき領域のサイズの指定にバグあり。

他にも、確保したuintarrayを開放する関数やら、
uintarrayから値を取り出す関数やらが必要になるだろうね。
その辺全部関数に閉じ込めちゃえば作るのが楽よ。
ってこと。特に難しいことは何もやってないはず(でもバグ入れちゃった)。

534 :デフォルトの名無しさん:03/07/29 20:34
>>532
>  アンダースコアで始まり次に大文字が続く識別子と、
>  アンダースコアを2つ連続で含む識別子は、
>  処理系や標準ライブラリのために予約されていて、
これはおなじ

535 :デフォルトの名無しさん:03/07/29 20:34
>>532
規格博士じゃないけど、きいたところによるとアンダースコア二つで
始まる識別子は処理系のために予約されてるんだと思った。

536 :デフォルトの名無しさん:03/07/29 20:35
>>534
つまり、アンダースコア全般で始まる識別子までは予約されてない、ってことですね。
ありがとうございました。

537 :デフォルトの名無しさん:03/07/29 20:37
>>535
あなたもありがd。

538 :デフォルトの名無しさん:03/07/29 20:38
__FILE__

539 :デフォルトの名無しさん:03/07/29 22:01
犬阪犬
を連想してしまった
すまん>>538


540 :517:03/07/29 22:33
色々弄ってこんな風になりました。
http://no.m78.com/up/data/up029959.zip
これを、もう少し高速に計算させたいのですができますでしょうか?
それと、このプログラムの出来を評価してもらえると嬉しいです。


541 :デフォルトの名無しさん:03/07/29 22:56
>>540
すぐ思いついたのはこんなの。たいして速さは変わらんけど。
表示部分は省略。

for(i=2;i<4000000000; i++)
{
int max = sqrt(i);
PN = 1;
for(n=2;n<=max;n++)
{
if((i%n)==0)
{
PN+=n+i/n;
}
}
if (i == max * max) {
PN-=max;
}

if(i==PN)


542 :デフォルトの名無しさん:03/07/29 23:07
素数を求めるプログラムを
forなどの繰り返し使う、エラトステネスの篩いを使う、
配列を使う、線形リストを使う、
この4種類のやりか方で作ったときに、
それぞれの計算量、メモリの使用量はどうちがうのですか?


エラトステネスの篩いを使うと
カウント変数ない分、配列のほうが変数の数は少なくなる。
繰り返し処理が多いと計算量が増えるので、
配列使ったほうがすっきりする場合多いからその分計算量減る。
線形リストではよりメモリの使用量は多くなる。

このくらいが思いつくのですがあってますか?
また、他にどういう違いがありますか

543 :デフォルトの名無しさん:03/07/29 23:09
そんなのは数学的に計算できることだろ
自分のしていることを把握していない真性アフォは
プログラムを作るな 社会悪だ

544 :デフォルトの名無しさん:03/07/29 23:11
s/把握していない/把握する気のない/

545 :デフォルトの名無しさん:03/07/29 23:39
フリーのコンパイラでDLLを作るにはどうしたら良いのですか

546 :デフォルトの名無しさん:03/07/29 23:44
オプションのヘルプを探す。

547 :デフォルトの名無しさん:03/07/29 23:57
>>540
これで俺のマシン(Celeron650)で5番目の完全数まで340秒かかった。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=126&fi=no

540だと10倍は軽くかかりそうだ

548 :517:03/07/30 00:07
>>547
( д )   ゚ ゚

ハヤー

世の中は広いなぁ。
漏れが作ったやつじゃ40分ほど計算させても5番目は出ませんでした。
いやいや、スゲー。
俺もそんなプログラムが組める様になりたいなぁ。
いや、ほんとに凄杉。
うん。凄い。

549 :デフォルトの名無しさん:03/07/30 00:14
文字列検索のプログラムを作っているんですが
2バイト文字の検索はどうやったらできますか?
ASCUコードからシフトJISコードへの変換とか。
漢字やひらがなも検索できるようにしたいんですけど。
どうしたらいいんでしょうか?
よろしくおながいします。

550 :デフォルトの名無しさん:03/07/30 00:16
ASCU

551 :デフォルトの名無しさん:03/07/30 02:05
天然?

552 :デフォルトの名無しさん:03/07/30 03:04
ASCII

553 :デフォルトの名無しさん:03/07/30 08:38
>>551
おそらくASCIIの半角英数からSJISの全角英数に変換したいんだろう。

554 :デフォルトの名無しさん:03/07/30 10:08
perl使え。

555 :デフォルトの名無しさん:03/07/30 10:54
>>554
jcodeなけりゃ何も出来ないんですか?

556 :デフォルトの名無しさん:03/07/30 11:12
ある物は使えばいい、再発明する必要は無い
しかしここはC言語スレなんでperl使えはスレ違い

557 :デフォルトの名無しさん:03/07/30 14:06
>>549
ASCII(アスキー)コード
文字を 7 ビット(0x00〜0x7F)で表現する文字コード。
当然のことながら表現できる文字の種類は少ない。

シフト JIS コード
文字を1バイトと2バイトの混合で表現する日本語用文字コード。
1バイト文字のうち、0x00〜0x7F は ASCII コードと同じで、
0xA0〜0xDF は半角カナである。
2バイト文字は 0x81〜0x9F, 9xE0〜0xFC で始まり、0x40〜0x7E, 0x80〜0xFC で終わる。

シフト JIS コードを採用している OS でも、
標準 C でシフト JIS コードを扱える関数(mb 系関数)は
そんなになかったと思う。
標準 C を使う限りは細かい判定は自分でする必要がある。

VC++ 使ってるならそれなりの関数(_mb 系関数)があるので、
それを使ってみてはどうだろう。
それでも凝った検索アルゴリズム使う場合には
どこまで使えるか分かんないけどね。

558 :72:03/07/30 18:20
今ごろ思いつきました。これでいけそうです。bcc32,VC++で確認。
しかし、これは動作が保障されているのかな?

# 今までforループを考えうる n の最大数分書いて
# いらない部分のループは continue で逃げる方法をとっていました。

void nfor(unsigned int n)
{
  int  i[10], j=0;
  switch(n){
    case 9: for(i[9]=0; n>=9 && i[9]<2; ++i[9])
    case 8: for(i[8]=0; n>=8 && i[8]<2; ++i[8])
    case 7: for(i[7]=0; n>=7 && i[7]<2; ++i[7])
    case 6: for(i[6]=0; n>=6 && i[6]<2; ++i[6])
    case 5: for(i[5]=0; n>=5 && i[5]<2; ++i[5])
    case 4: for(i[4]=0; n>=4 && i[4]<2; ++i[4])
    case 3: for(i[3]=0; n>=3 && i[3]<2; ++i[3])
    case 2: for(i[2]=0; n>=2 && i[2]<2; ++i[2])
    case 1: for(i[1]=0; n>=1 && i[1]<2; ++i[1])
    case 0: for(i[0]=0; n>=0 && i[0]<2; ++i[0]){
        /* i[0〜n]を使った処理 */
      }
      break;
    default: return;
  }
}


559 :デフォルトの名無しさん:03/07/30 18:44
>>558
>case 9: for(i[9]=0; n>=9 && i[9]<2; ++i[9])

ここは 9 以上の時しか来ないため、

 case 9: for(i[9]=0; i[9]<2; ++i[9])

でよい。
その他も同じ。
また、「i[n]」は 0 〜 1 の間でしか値が変化しない。
よって

for( n=0; n<=9; n++ )
{
  for( i[n]=0; i[n]<2; i[n]++ )
  {
    /* i[0〜n]を使った処理 */
  }
}

で良いと思われるが?

560 :デフォルトの名無しさん:03/07/30 18:49
>>558
やっぱりn重ループじゃねーか。

561 :72:03/07/30 19:07
>>case 9: for(i[9]=0; n>=9 && i[9]<2; ++i[9])
>ここは 9 以上の時しか来ないため、
> case 9: for(i[9]=0; i[9]<2; ++i[9])
>でよい。
>その他も同じ。

この場合、9 の時はそれでいいかもしれませんが。
コンパイラは意図したコードを吐きません。で、悩んでたんです。

77 読んだら分かるでしょうか?
それではダメなんですよ。実際は 0〜1 ではないんで。

562 :72:03/07/30 19:24

配列のパラメータのとりうる組み合わせを全て評価関数で評価して、
最も良いものを探すって感じのプログラムなんです。
だからこの場合は 1024通りの中から選ぶって感じにならないといけないわけです。

561がなんかえらそうですんません。

563 :デフォルトの名無しさん:03/07/30 19:26
>>561
って言うか、何をしたいのか書いてみろ。
他の解決方法がありそうだが?

564 :デフォルトの名無しさん:03/07/30 19:48
>>562
1重ループ版。逆に遅くなってそうだけど…
  j = n;
  i[j] = 0;
  for (;;) {
    if (i[j] < 2) {
      if (j == 0) {
        /* i[0〜n]を使った処理 */
        ++i[j];
      } else {
        j--;
        i[j] = 0;
      }
    } else {
      j++;
      if (j > n) break;
      ++i[j];
    }
  }

565 :デフォルトの名無しさん:03/07/30 20:59
どうしても
readlineライブラリを使えないのです。

-lreadline

オプションだけではダメなのですか?

566 :デフォルトの名無しさん:03/07/30 23:29
保障されている。
ついでに言えばこっちの方が比較回数が減って良好。
void nfor(unsigned int n)
{
  int i[10], j;
  for(j = 0; j < 10; ++j)
    i[j] = 2;
  switch(n){
    case 9: for(i[9]=0; i[9]<2; ++i[9])
    case 8: for(i[8]=0; i[8]<2; ++i[8])
    case 7: for(i[7]=0; i[7]<2; ++i[7])
    case 6: for(i[6]=0; i[6]<2; ++i[6])
    case 5: for(i[5]=0; i[5]<2; ++i[5])
    case 4: for(i[4]=0; i[4]<2; ++i[4])
    case 3: for(i[3]=0; i[3]<2; ++i[3])
    case 2: for(i[2]=0; i[2]<2; ++i[2])
    case 1: for(i[1]=0; i[1]<2; ++i[1])
    case 0: for(i[0]=0; i[0]<2; ++i[0]){
        /* i[0〜n]を使った処理 */
      }
      break;
    default:
      /* エラー吐いた方がいいんじゃないかしらん */
  }
}
でも、あんたもトリッキーなことするね。再帰じゃダメなことでもあったの?

>>559
それじゃダメ。
例えば n が 3 の時、
例えば i[0] は常に 2 でしかない。

567 :デフォルトの名無しさん:03/07/30 23:34
あ、switch(n - 1) やね。

568 :デフォルトの名無しさん:03/07/30 23:35
って、コメントを信じるなら
n には既に -1 されたのを渡すのか。

569 :デフォルトの名無しさん:03/07/30 23:36
何が起こってるか分かりやすく書いたバージョン。

void nfor(unsigned int n)
{
  int i[4], j;
  for(j = 0; j < 4; ++j)
    i[j] = 2;
  switch(n){
  case 3:
    for(i[3]=0; i[3]<2; ++i[3]) {
    case 2:
      for(i[2]=0; i[2]<2; ++i[2]) {
      case 1:
        for(i[1]=0; i[1]<2; ++i[1]) {
        case 0:
          for(i[0]=0; i[0]<2; ++i[0]){
            /* i[0〜n]を使った処理 */
          }
        }
      }
    }
    break;
  default:
    /* エラー吐いた方がいいんじゃないかしらん */
  }
}

switch は n の値を評価して、goto みたいに case ラベルの位置にジャンプする。
case/default ラベルは普通のラベルと同じように書けて、
もちろん for ループの中にも書くことができる。
変数の初期化に気をつけないといけないけど、
それをしているのが最初の for ループね。

570 :デフォルトの名無しさん:03/07/30 23:49
0 or 1 しかないんならループは一つにしちゃってビットマスク使えない?

571 :デフォルトの名無しさん:03/07/30 23:58
>>565
libreadline.a にライブラリ用のパス通ってる?

572 :デフォルトの名無しさん:03/07/31 02:50
「WindowsXP Cygwin gcc」
で、コンパイルしたのですが、
undefined reference to `_scntrl'
undefined reference to `_strol'
undefined reference to `_strcm'
と帰ってきます。
コンパイル時にオプション指定が何か足りないのでしょうか?
stdio.h、string.h、stdlib.h、ctype.h、errno.hをincludeしています。

573 :デフォルトの名無しさん:03/07/31 03:03
>>572
scntrl, strol, strcm ... か。
iscntrl, strtol, strcmp の typo(タイプミス)では?

574 :デフォルトの名無しさん:03/07/31 03:19
572です。
そうでした。ありがとうございます。

575 :デフォルトの名無しさん:03/07/31 03:30
C++ ならコンパイルの時点でエラーが来るんだけどねぇ。
まぁ、C でも gcc を C99 モード(-std=c99)で使えば警告出してくれるけど。

576 :デフォルトの名無しさん:03/07/31 04:02
Windows2000 VC++を使用しているんですが
ウインドウ ハンドルだけ分かってる状態で、そのウインドウがアクティブかどうか
確認する方法はありますでしょうか?
どうか教えてください

577 :デフォルトの名無しさん:03/07/31 04:10
>>576
>>1

578 :デフォルトの名無しさん:03/07/31 04:33
>>577
そんなぁ〜 (ToT
Windowsって言ってもC言語ですし
検索しても見つけられませんでしたし
お願いしますよ〜

579 :デフォルトの名無しさん:03/07/31 04:49
http://websearch.yahoo.co.jp/bin/query?p=%a5%a6%a5%a4%a5%f3%a5%c9%a5%a6++%a5%a2%a5%af%a5%c6%a5%a3%a5%d6%a1%a1%a5%cf%a5%f3%a5%c9%a5%eb&hc=0&hs=0
この辺見てだめなのか?
それとスレ違いだからVCスレかwin32apiスレいったほうが誰か答えてくれるぞ
ぽまえがいってるのは、C言語ではなくwin32apiだ

580 :デフォルトの名無しさん:03/07/31 04:54
>>579
わぉ〜 (^O^)
すみません、windowsはすれ違いでしたね
それはそうと、教えてくださってありがとうございます

リンク先の一番上にあった、GetActiveWindowでHANDLEと
比較すれば分かりそうです
ありがとう〜 (^o^)/^^^^

581 :デフォルトの名無しさん:03/07/31 04:55
>>578
どのあたりがC言語の質問なのか50字以内で答えよ

582 :デフォルトの名無しさん:03/07/31 09:21
>>581
ANSI C 準拠ではないけど
定義方法、書き方、コンパイラ、などは、どう考えても、C言語だと思う
C++じゃないかと言われると、確かに使ってるところもあるからC++かなって思う
(MFCは完全にC++だけど…)

Win32APIがC言語で作られたから、C言語だとは思わないけど
(C言語で他の言語も作れるから…)
でも、今のWin32APIはC言語の拡張関数、ライブラリだと思います
だからC言語です
C言語が書けなかったり、書き方やコンパイラが変わった時
それはC言語ではなくなると思います

583 :デフォルトの名無しさん:03/07/31 09:23
VBからも使える

584 :デフォルトの名無しさん:03/07/31 09:25
>>580
もっと簡単な方法が(スレ違いの為略)


585 :デフォルトの名無しさん:03/07/31 09:45
>>582
>今のWin32APIはC言語の拡張関数、ライブラリだと思います

激しく違います。

586 :デフォルトの名無しさん:03/07/31 11:34
激しく電波飛ばしてるな

587 :デフォルトの名無しさん:03/07/31 13:08
>>562 >72
>
> 配列のパラメータのとりうる組み合わせを全て評価関数で評価して、
> 最も良いものを探すって感じのプログラムなんです。
> だからこの場合は 1024通りの中から選ぶって感じにならないといけないわけです。

int limit = 1 << n;
for (int k = 0; k < limit; ++k) {
for (int j = 0; j < n; ++j) {
i[j] = (k >> j) & 1;
}
/* i[0〜n]を使った処理 */
}

こういうことか?


588 :デフォルトの名無しさん:03/07/31 13:53
電波キタ------------------------ ( ゜γ ゜) ----------------------------

まず、もちついて>>1のこれを嫁。
>GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)

> でも、今のWin32APIはC言語の拡張関数、ライブラリだと思います
> だからC言語です
「○○だと思います(自分勝手な解釈)。だから××です(断定形)」という時点でご愁傷。それ以前に50字超えてるし。

と夏休み最初の1日目、派手に釣堀で戯れる。

589 :デフォルトの名無しさん:03/07/31 13:59
相手する奴も厨

590 :デフォルトの名無しさん:03/07/31 15:37
デルファイでプログラム作るのはどうするの?

591 :デフォルトの名無しさん:03/07/31 15:40
     ///////
    ///////____________
    ///////  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄
   ///////              (~) チリンチリン
   ///////              ノ,,
  ///////     ∧_∧         / ̄ ̄ ̄ ̄ ̄ ̄
  ///////     ( ´∀`)( 厨 ) )) <  夏だなあ〜
 ///////      (つ へへ つ      \______
///////   //△ ヽλ  ) ) 旦
//////  l ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l
/////    ̄| .| ̄ ̄ ̄ ̄ ̄ ̄ ̄| .| ̄
////     ^^^          ^^^

         厨房の夏。2chの夏。

592 :デフォルトの名無しさん:03/07/31 16:21
すみません、Linuxを利用してるんですが
LinuxじゃC言語なんて使えないですよね?

593 :デフォルトの名無しさん:03/07/31 16:24
あっと驚くためごろう

594 :デフォルトの名無しさん:03/07/31 16:25
つ 釣られないぞ!

595 :デフォルトの名無しさん:03/07/31 16:33
>>592
使えません
C言語が使いたければWindowsに乗り換えてください

596 :デフォルトの名無しさん:03/07/31 16:33
>>592
(ry

597 :デフォルトの名無しさん:03/07/31 16:37
>>592
オマエハナー

598 :デフォルトの名無しさん:03/07/31 17:29
Linux こそ C ぢゃないか。

599 :デフォルトの名無しさん:03/07/31 18:11
598 がマジレス権を行使しました。

600 :デフォルトの名無しさん:03/07/31 18:11
>>595
Linuxを含めたUNIXプラットフォームで最も多く用いられているのが
C/C++言語です。
WindowsでコンパイルしたものはWindowsでしか使えません。
Linuxで使うためにはLinuxでコンパイルする必要があります。
592-597は自作自演ですか???

601 :デフォルトの名無しさん:03/07/31 18:15
クロスコンパイルしたことないのだろうか・・・。

602 :デフォルトの名無しさん:03/07/31 18:16
超頭固いおまいなんか、豆腐の角に頭ぶつけて氏ね >>600

603 :デフォルトの名無しさん:03/07/31 18:16
>>600
嘘は書くな。
Windows環境で動くクロスコンパイラは
Windows以外で使うものを作るのが目的だぞ。

604 :デフォルトの名無しさん:03/07/31 18:16
600 がネタにマジレス権を行使しました。

605 :デフォルトの名無しさん:03/07/31 18:47
>>101-604
βακα..._〆(゚▽゚*)

606 :デフォルトの名無しさん:03/07/31 18:51
( ´,_ゝ`) プッ >>605

607 :デフォルトの名無しさん:03/07/31 20:58
C言語とjava言語で作ったプラグラム比べるとCのほうが動作軽いですか?

608 :デフォルトの名無しさん:03/07/31 21:23
>>607
処理系、動作環境依存

あと、プラグラムはやめれ。

609 :デフォルトの名無しさん:03/07/31 21:39
>>587 >>570
0 or 1ならそれでおっけーですね。勉強になります。
でも for で使うのは実際は double 型なんです。

>>566
そうできるんですね。なら、
for(j=n; j<10; ++j)
と、ここをしてもいいわけですね?そこまで気にしなくても、って感じですが。

>でも、あんたもトリッキーなことするね。再帰じゃダメなことでもあったの?
速度を優先するなら再帰はよくないかと思いまして。

610 :デフォルトの名無しさん:03/07/31 22:17
if (argc == 2)
  if (strcmp(argv[1], "--help") == 0)
    /* ほにゃらら */

これを

if (argc == 2 && strcmp(argv[1], "--help") == 0)
  /* ほにゃらら */

と書くような技法を何ていうんでしたっけ?知ってる人教えてください。

611 :デフォルトの名無しさん:03/07/31 22:20
>>610
技法?
技法じゃないが論理積か?


612 :デフォルトの名無しさん:03/07/31 22:21
>>610
ショートサーキット

613 :デフォルトの名無しさん:03/07/31 22:22
普通後者でかかないか?

614 :610:03/07/31 22:24
>>611
反応してくれて有難うございます。
>>612
ショートサーキットでした。有難うございました。

615 :デフォルトの名無しさん:03/07/31 22:25
ショートサーキット(短絡評価)って技法じゃなくて&&や||の性質では。

616 :デフォルトの名無しさん:03/07/31 22:39
>>609
大抵の場合、この程度の時間で処理できればOKという線がある。
で、再帰ではそれを満たさなかったの?という話だと思う。

あと関数呼び出しのオーバーヘッドをなくすよりも
i[0〜n]を使った処理の方を見直した方が余程速度に影響する。
どうせそこでループがしてるんだろうし。

617 :デフォルトの名無しさん:03/07/31 23:19
>>609
double をループカウンタに使うのは
数値誤差があるんでやめた方がいいと思うが...。
ループカウンタには int を使って、
同時にそれに対応する double 値が得られる工夫をするべし。

再帰が問題になるかは、実際に再帰してみてから考えれ。
それほど関数呼び出しのオーバーヘッドが問題にならないかもしれないし。

618 :デフォルトの名無しさん:03/07/31 23:32
>>617
実際、doubleを制御変数にしていると速度低下を招く罠。

619 :デフォルトの名無しさん:03/07/31 23:52
最小化をするとタスクバーにアイコン化されるようにする
コードを教えて下さい

620 :デフォルトの名無しさん:03/07/31 23:55
>>619
Del厨はDel厨らしくDelスレに帰れ。

621 :デフォルトの名無しさん:03/07/31 23:57
http://www.kurims.kyoto-u.ac.jp/~ooura/pi_fft-j.html

typedefを知らない人。#defineでやっちゃっています。

622 :デフォルトの名無しさん:03/08/01 00:23
>>619
MFC だけど、MFC じゃなくてもやることは大体一緒。
http://www.kab-studio.com/Programing/Codian/MFCTips/01.html

623 :619:03/08/01 00:25
>>622
私が聞きたいのはWindowsじゃないんですけど・・・・

624 :デフォルトの名無しさん:03/08/01 00:27
香ばしくなってきました。

625 :デフォルトの名無しさん:03/08/01 00:32
>>619
>>1
> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)

626 :デフォルトの名無しさん:03/08/01 01:32
windowsを購入しようと思うのですが
C言語って使えるんですか?
それとよく聞く「コンパイラ」って何ですか?教えて下さい

627 :626:03/08/01 01:41
あぁん、釣れない人たちね

628 :626:03/08/01 01:50
機種はVAIOです。

629 :デフォルトの名無しさん:03/08/01 01:51
そんくらいググれ。

630 :あき:03/08/01 06:57
コンパイルは通るのですが、実行がうまくいきません。
縦書きに






というふうに表示させたいのですが、どこが間違っていいるのでしょうか?

#include <stdio.h>
main()
{
int i;
char str[30] = "はじめてのCプログラム";
for(i = 0; i < 11; i++)
{
printf("%c\n", str[i]);
}
return 0;
}

631 :デフォルトの名無しさん:03/08/01 07:14
>>630
#include <stdio.h>
main()
{
int i;
char str[30] = "はじめてのCプログラム";
for(i = 0; i < 11; i+=2)
{
printf("%c%c\n", str[i],str[i+1]);
}
return 0;
}



632 :デフォルトの名無しさん:03/08/01 07:21
修正
#include <stdio.h>
#include <string.h>
main() {
int i;
char str[] = "はじめてのCプログラム";
for(i = 0; i < strlen(str); i+=2)
printf("%c%c\n", str[i],str[i+1]);
return 0;
}
1バイト文字と2バイト文字にご注意と言う事。

633 :デフォルトの名無しさん:03/08/01 07:39
>>632
おいおい、ループ終了判定で毎回strlen()呼ぶのか?

634 :デフォルトの名無しさん:03/08/01 07:52
祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り

ニーノさんのホームページ作り2
http://ex.2ch.net/test/read.cgi/entrance/1059029010/
ニーノ ◆p9GipySMGk によってラウンジにたてられたこのスレで、

http://page.freett.com/ninogumi/
【ニーノさんのホームページ】
というサイトが作られた。(現在もコンテンツは爆発的に増えてるよ。)

さぁ、君もアイディアを出して、2CHネラーだけの最強サイトをつくろう!

祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り

635 :デフォルトの名無しさん:03/08/01 07:53
>>633
わはは。腕がなまってるな、オレ。

636 :デフォルトの名無しさん:03/08/01 10:47
int array[10];にarray={1,2,3,4,5,6,7,8,9,10};と代入することはできないんですか?

637 :デフォルトの名無しさん:03/08/01 10:58
やってみれば?

638 :デフォルトの名無しさん:03/08/01 11:31
>>636
初期化は可能だが、代入はできない。
「仕 様 で す」

639 :デフォルトの名無しさん:03/08/01 13:42
>>610の書き方の違いって、ショートサーキットとかと関係あることでしたっけ?
どちらの書き方してもコンパイルしたら同じ結果になりますよね。



640 :デフォルトの名無しさん:03/08/01 14:03
>>639
ない。
あれで「ショートサーキット」という言葉が出てくる612はエスパー

641 :_:03/08/01 14:04
http://homepage.mac.com/hiroyuki44/

642 :デフォルトの名無しさん:03/08/01 14:05
http://.rarPqQS5byCtf 9,654,651 e1b30988f7a4a9cb0f5495d0731c7878
http://www.rarPqQS5byCtf 9,654,651 e1b30988f7a4a9cb0f5495d0731c7878

643 :デフォルトの名無しさん:03/08/01 14:28
いや、あるよ。両方が同じ結果になる事(というか、
argc!=2のときのstrcmpが実行されるかどうか)を、
保証しているのが、ショートサーキット。

644 :デフォルトの名無しさん:03/08/01 14:33
ショートサーキットってなんですか?

645 :デフォルトの名無しさん:03/08/01 14:38
ショートサーキット
http://www1.kcn.ne.jp/~robe/cpphtml/html03/cpp03002.html

646 :デフォルトの名無しさん:03/08/01 15:15
>>644
短絡、ショート

647 :けん ◆gZE4xJJ95c :03/08/01 15:23
>>1
まあ、そういわないでくださいよ。(しょうがないですけど。。)
もうメンテナンス半分放棄してるから、C machine公開
終了しようと思ってます。
文法的にでも完全なANSI仕様にするのはかなり大変だったです。


648 :デフォルトの名無しさん:03/08/01 15:26
ずいぶん前から書かれているのに何で今頃?

649 :けん ◆gZE4xJJ95c :03/08/01 15:26
>>647
>文法的にでも完全なANSI仕様にするのはかなり大変だったです。
結局、完全なANSI仕様にする前に力尽きた、というか、
本業が忙しくて、それどころじゃない状態になってしまい
開発ほとんど中止状態になっちゃったんですよね。

っと、言い訳はこれくらいにして、自分もひさびさにこのスレッド
でも見てC言語思い出してみようかな。。(ここ2年くらいC言語
から離れちゃってるんですよね。C++で開発してた時とかあったけど、
仕様の理解と実装はそれとはまた全く違う話ですからね。。)


650 :けん ◆gZE4xJJ95c :03/08/01 15:29
>>648
自分宛ての意見ですか?
それはたまたま今見たからですよ。

プログラム板ってほとんど見ませんし。

651 :デフォルトの名無しさん:03/08/01 15:36
C99コンパイラ作る木はないのん?

652 :けん ◆gZE4xJJ95c :03/08/01 15:42
>>651
能力、時間、、その他の問題で私一人で作るのは到底無理です。


653 :デフォルトの名無しさん:03/08/01 15:43
ソース公開して終わりにするとか、反応があれば
sourceforgeにでもつっこんで終わりにしたら?

654 :けん ◆gZE4xJJ95c :03/08/01 15:48
>>653
ソース公開は難しいですね。たぶんしないと思います。
そのまま消滅ですね


655 :デフォルトの名無しさん:03/08/01 16:57
>>654
消滅つうても、宿題スレとかを観察してると学校の授業で使ってるところがあるっぽいのよね。
多分ずーっと使われつづけるよ…。
未だにN88BASICとかの授業やってるところもあるみたいだし、
一度慣れちゃったものにしがみつく教師は多いと思う。

晒してるようで(実際晒してるんだけど)申し訳ないんだが、
質問がなくなることはないだろうから言いつづける事になるだろうと思う。
>>1に書くかどうかは別としてね。

いやま、あのCの複雑怪奇な文法のパーザを書いた(少なくとも挑戦した)
ということは敬服いたしております。真面目にね。

656 :デフォルトの名無しさん:03/08/01 18:11
さあー
来い!!!
俺様が何でも答えてやる。

657 :デフォルトの名無しさん:03/08/01 18:51
C言語ってなんですか?
基本から教えて下さい。

658 :デフォルトの名無しさん:03/08/01 19:15
C言語のルーツは、Martin Richardsが開発したBCPL言語であるといわれています。Ken Thompsonは、この言語を参考にして1970年にB言語という言語を開発しました。
 B言語の後継となったのが、1972年頃にDennis M. Ritchieが開発したC言語です。
 当時Ritchieは、Ken Thompsonらと共同で、ミニコンピュータのオペレーティングシステムであるUNIXの開発に携わっていました。このOSは、初期の段階ではアセンブリ言語を用いて開発されましたが、その後、C言語で書き直されました。
 初期のUNIXを移植するために開発されたのがC言語ですから、ある意味では
    「C言語はUNIXの副産物である。」
ということになります。
 そのUNIX本体だけでなく、その上で動作する多くのアプリケーションも、C言語で開発されることになります。
 そのため、C言語は、まずUNIXの世界で広まりました。しかし、その勢いは全くとどまらず、次第に大型コンピュータやパーソナルコンピュータの世界にも普及していったのです。


659 ::03/08/01 19:23
B言語には組み込みの型がないんだっけ?とスレ違いな質問をしてみる。

660 :デフォルトの名無しさん:03/08/01 21:10
Digital Mars C++をダウンロードしたのですが、それにはMFCが付いていると
聞いたのですが、それをBCC55で使うことはできるのでしょうか?

661 :デフォルトの名無しさん:03/08/01 21:57
>>659
extrn mona, wara[], KuSo300t();
みたいな型はあったな

662 :デフォルトの名無しさん:03/08/01 21:58
いや、ない。
extrn mona, wara, KuSo300t;

663 :デフォルトの名無しさん:03/08/01 23:30
>>660
激しくスレ違い。

664 :山崎 渉:03/08/02 02:04
(^^)

665 :デフォルトの名無しさん:03/08/02 02:31
超超超初心者です。やさしく教えてくださいな。

練習用にプログラムを作ったのですが、getsがうまく動いてくれません。
if文の外で使うとうまくいくのですが、if文の中で使うと入力を待たずにif文を抜けてしまいます。
なぜでしょう??

if(s==1){
printf("回転数\n");
gets(kaiten);
for(i=0;kaiten[i];i++) printf("%c",kaiten[i]);
}

こんな感じなんですけど、よろしくです

666 :デフォルトの名無しさん:03/08/02 02:33
ifが成立してないんだろ。

667 :デフォルトの名無しさん:03/08/02 02:34
「回転数」は表示されるのか?

668 :悩んでます:03/08/02 02:53
10進数で48 16進数だと0x30という数値をバイナリに変換するには
どうすれば良いですか?ASN.1でやりたいのですがCでの処理ルーチンが
分かりません。宜しくお願いします


669 :デフォルトの名無しさん:03/08/02 02:55
48 や 0x30 というのはどういう風な形で提供されるのじゃ?

670 :悩んでます:03/08/02 02:56
668の補足ですが
例えばint i=48;
としてこれをバイナリに変換してchar *b;
に格納するケースでお願いします。

671 :悩んでます:03/08/02 02:57
>>669
0x30は
unsigned long l = 0x30;
といった具合です。

672 :デフォルトの名無しさん:03/08/02 02:58
最初っからバイナリじゃん。

673 :悩んでます:03/08/02 02:59
>>672
という事はlongからchar *に変換すればいいという事ですか?

674 :デフォルトの名無しさん:03/08/02 03:06
char* に変換ってのが分からん。
b には何が入ってるの?

675 :悩んでます:03/08/02 03:13
>>674
えとイメージとしてはテキストエディタでバイナリファイルを開くと
意味不明な文字の羅列が char *b;に入ります。
ここからは予想ですがlong の lに格納された 0x30
00110000という文字コードがそのまま出力されているのではないかと
思います。
多分BorlandC++でいうHexToBinにあたると思います。

676 :デフォルトの名無しさん:03/08/02 03:16
>>675
「バイナリ」「文字」「文字コード」についての定義を言ってくれ。
どうもその辺に混乱があるように思えてならない。

677 :悩んでます:03/08/02 03:25
>>676
ごめんなさいすごく混乱してるのです--;
ASN.1で定義されたタグを出力する為のものです。
既に定義されたlong型(HEX)をバイナリとして変換したいのです。

私もlong型をバイナリへという概念は理解できるのですが
具体的にどうすればいい分からないのです;;

678 :デフォルトの名無しさん:03/08/02 03:28
>>666
>>667

回転数は表示されます。
回転数
の後に変な数字が表示されて終了。

どうしてでしょう???

679 :デフォルトの名無しさん:03/08/02 03:34
>>675
「バイナリ」ってのが ASN.1 における「バイナリ」を表してるわけかな?
ASN.1 ってのをよー知らんので何ともいえないけど、このページはどうかな?
http://www.geocities.co.jp/SiliconValley-SanJose/3377/

他のページはここら辺で調べてちょ。
http://www.google.com/search?num=50&hl=ja&inlang=ja&ie=Shift_JIS&c2coff=1&q=ASN.1+%83o%83C%83i%83%8A&lr=lang_ja

680 :デフォルトの名無しさん:03/08/02 03:36
int i = 123;
char buffer[10];
sprintf(buffer, "%d", i);
printf(buffer);
単に数値を文字列にしたいんだと解釈してみる

681 :悩んでます:03/08/02 03:42
>>679
http://www.geocities.co.jp/SiliconValley-SanJose/3377/
このサイトを参考にしているのですが..勉強します

682 :デフォルトの名無しさん:03/08/02 03:45
文字列にしたいんだったら、むしろ C 的に言えば
テキストに直したいってことだよな。
そういうことなら sprintf を使えばいいかと。

683 :悩んでます:03/08/02 03:46
>>680
違うかも^^;あんがと

684 :デフォルトの名無しさん:03/08/02 03:49
もとからバイナリなのにそれをさらにバイナリにしろと言われても分からん。
char a[10];
unsigned long l = 0x30;
a[0] = l;
ということじゃないのか?

685 :悩んでます:03/08/02 03:56
>>684
これが正解だと思います。

少し試しますの しばし時間を..

686 :デフォルトの名無しさん:03/08/02 03:56
>>682

何をしようとしたかと言うと、文字列として読み込んで、他の文字列とくっつけてファイルに出力したい。

しかし、それを数字としても認識したい為後でatoiを使って計算したい。

だったのですが・・・。
sprintfですか、調べてみます。

687 :デフォルトの名無しさん:03/08/02 03:57
テクニカルな方法あるけどもう必要ないかな?

688 :デフォルトの名無しさん:03/08/02 03:59
0x30←私はこれがバイナリだと思いまーす。

689 :悩んでます:03/08/02 04:04
>>684
この書き方でできましたありがとうございましたm(_._)m
本当にありがとう

690 :デフォルトの名無しさん:03/08/02 04:29
うーん。
((unsigned long*)a)[0] = l;

a[0] = (l >> 24) & 0xFF;
a[1] = (l >> 16) & 0xFF;
a[2] = (l >>  8) & 0xFF;
a[3] = (l    ) & 0xFF;
とは別だと考えていいの?

691 :悩んでます:03/08/02 04:46
>>690
はい違うと思います(多分ですが..)
charの配列で格納して これをなんらかの方法で
char *に連結して格納すれば完了です。
サンプルらしきものにmemmoveが使用してあり
また悩んでいますががんばってみます

692 :デフォルトの名無しさん:03/08/02 04:48
asn.1がどうとか言う前に一般的なデータの取り扱いについて勉強した方がいいと思われ。

693 :デフォルトの名無しさん:03/08/02 04:55
先程の件なんですがscanfで無理やりやると出来て、getsでは出来ません。どうしてなのですかねぇ??

       case 1:
printf("回転数\n");
scanf("%s", ss);
printf("%s", ss);
break;

コレだと出来て。

case 1:
printf("回転数\n");
gets(kaiten);
printf(kaiten);
break

コレだと出来ません。
めちゃちゃ基本的なミスをしてるような気がしてならないのですが・・・。;

694 :悩んでます:03/08/02 05:02
>>692
ですね--;


695 :デフォルトの名無しさん:03/08/02 05:05
kaiten ってはどう定義してる?

696 :デフォルトの名無しさん:03/08/02 05:44
>>695
char kaiten[1000];
です!

697 :デフォルトの名無しさん:03/08/02 05:53
うーん。
gets 呼んでも入力が来ない、というのは、

1. 既に前にあった入力の内容が残っていた。
2. メモリ内容が何らかの操作で壊されておかしくなってる。
3. gets にバグがある。

の 3 つの可能性があるけど...。

とりあえず kaiten を
char kaiten[1000] = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
って初期化して、
これ以外のが表示されたら 1. の可能性が高いかな?

698 :_:03/08/02 06:11
http://homepage.mac.com/hiroyuki44/

699 :_:03/08/02 06:16
http://homepage.mac.com/hiroyuki44/hankaku09.html

700 :デフォルトの名無しさん:03/08/02 06:24
>>697
ありがとうございます!!
コンパイルに問題は無いんですけど、
回転数と出た後に変な数が・・・・。

やっぱおかしいんですかね??

でも、独習Cのサンプルコードで試すとちゃんとできるのに・・・。
普通Getsすると、入力を待ってくれるじゃないですか?
それさえもせずに終了してしまう・・・。
とりあえず明日試してまた報告します!

701 :デフォルトの名無しさん:03/08/02 06:33
今回の話とは関係ないと思うけど、gets より
fgets(kaiten, sizeof kaiten, stdin);
を使った方が安全。

702 :_:03/08/02 07:22
http://homepage.mac.com/hiroyuki44/

703 :_:03/08/02 08:09
http://homepage.mac.com/hiroyuki44/jaz10.html

704 :デフォルトの名無しさん:03/08/02 08:24
>>696
scanfとgetsを両方使うと、内部で混乱が起きるので、どちらかに統一すべき。
どうしても混在させたい場合は、作業領域を確保してgets/fgetsのみを使い、
sscanfを利用する方法。

char buf[1000], ss[80];
fgets(buf, 1000, stdin);
sscanf(buf, "%s", ss);


あと、printfの第1引数はフォーマット指定だから、
printf("%s", kaiten);
の方が安全。printf(kaiten)の場合、実行時に%dなどと打ち込まれてしまった場合、
次のint型引数を読み込もうとするが、そんなものはないのでクラッシュしてしまう。

705 :デフォルトの名無しさん:03/08/02 08:55
>>704
蛇足な補足。

%dの場合は大抵クラッシュしないでごみ数字が出る。
寧ろ問題は%sの場合で、この場合、ナルキャラが見つかるまで出力しつづけることになる。
#或いは容易にメモリ領域を突破して異常終了する。

706 :デフォルトの名無しさん:03/08/02 08:55
>>704
混乱って?


707 :デフォルトの名無しさん:03/08/02 08:57
>>706
混乱とは、gets()を使う選択肢を残している香具師の状態のことだ。

708 :デフォルトの名無しさん:03/08/02 09:15
C言語においてgets()ほど邪悪な関数は無い。
それでも懲りずに(σ´∀`)σゲッツ!!

709 :デフォルトの名無しさん:03/08/02 10:05
バッファがあふれるからgetsが嫌いって奴
得てしてデータとりこぼす関数は平気で使う

710 :デフォルトの名無しさん:03/08/02 10:48
データとりこぼす関数ってなに?

711 :デフォルトの名無しさん:03/08/02 12:54
http://www.catnet.ne.jp/kouno/c_faq/c12.html#18

scanfとgetsを混ぜるべきではないというのはC FAQにも書かれていることだね。

712 :デフォルトの名無しさん:03/08/02 13:07
gets関数ってコンパイラのオプションによっては警告出る?

713 :デフォルトの名無しさん:03/08/02 13:08
そういうコンパイラも、広い世の中にはあるかも知れない。

714 :デフォルトの名無しさん:03/08/02 13:10
>>712
使用するとってことか?
うちのgccはデフォルトででるね。あぶねーから使うなと。

scanfやprintfでフォーマットと引数の対応がおかしいと警告してくれるのがうれしい。

715 :デフォルトの名無しさん:03/08/02 13:14
それlibcが出してるだけじゃあ……

716 :デフォルトの名無しさん:03/08/02 13:24
>>715
んん。コンパイル時に警告が出るからlibcは関係ないような。
と思って確認してみたらリンカが出してる模様。

717 :デフォルトの名無しさん:03/08/02 13:26
>>716
前半に突っ込んでるだけど……

718 :デフォルトの名無しさん:03/08/02 13:30
>>715
細かいところにつっこむねー
>>712はそういう意味で聞いたのか?

719 :デフォルトの名無しさん:03/08/02 13:36
>>715は「コンパイルしても動かないんですけど。」という質問に「コンパイルしただけでは動かないでしょうね。」と答えそう。

720 :デフォルトの名無しさん:03/08/02 13:41
>>718
libcが出す警告にコンパイラは関係ない

721 :715:03/08/02 13:41
明らかに勘違いしてるようだから突っ込んであげだら、
何か必死なレスが返ってきた。(´・ω・`)ショボーン

722 :デフォルトの名無しさん:03/08/02 13:42
>>720
ldじゃなくて?

723 :デフォルトの名無しさん:03/08/02 14:31
>>722
ldがlibcの警告を見てるだけ

724 :デフォルトの名無しさん:03/08/02 14:56
スレ違いですが質問させてください。
rc=ランコマンドって何ですか?

725 :デフォルトの名無しさん:03/08/02 14:57
起動時に実行するコマンド

726 :724:03/08/02 15:24
>>725
すいませんそれは例えばどんなことですか?

727 :デフォルトの名無しさん:03/08/02 16:37
あるプログラムが自動的に最初に読み込んで実行する、設定用のファイル。
たとえばbashの~/.bashrcなど。

728 :724:03/08/02 17:09
>>727
じゃrcはないよりあったほうがいいのですね。

729 :693:03/08/02 17:46
>>704
自分も学校に入ってgccでやってるんですけど、getsは使うな見たいな警告が出ます。
ご指摘されたとおりにやってみようと思います!!

また後ほど!

730 :デフォルトの名無しさん:03/08/02 18:10
【徹底的】プログラマーが語るviとemacs 4【バトル】
http://pc.2ch.net/test/read.cgi/prog/1059814696/

731 :デフォルトの名無しさん:03/08/02 18:14
浦東戸新鳩南川赤志王王西駒本東後飯市四永溜六麻白高五戸荏旗長洗石雪御久千池蒲京糀大穴天羽羽
和川塚井が鳩口羽_子_が_駒大楽田がつ田池本布金輪反越原の_足川谷嶽が鳥__浜_鳥守空田田
美口安宿谷が元岩_神_原_込前園橋谷谷町山木十高台田銀中台_池台大山原町__蒲_居稲橋空西
園_行__谷郷淵茂谷子_込_______王一番輪__座延_原__塚___上田田谷_荷_港タミ


●――――――●――――――――●●●●●――――●―――――――――――●―――――●●空特
●――――――●――――●―――●――●―――――●――●――――――――●―――――●●特快
●●――●――●――●―●――●●●●●●●―●―●――●―――●――――●●―――●●●快速
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●各停

←――――――→←――――――――――――――→←→←――――――――――→・←――――→
.     ↑                 ↑           ↑         ↑        ↑    ↑    
.     埼                 営           営         東        京    京    
.     玉                 団           団         急        急    急    
.     高                 南           池         池        蒲    空    
.     速                 北           上         上        田    港    
.     線                 線           線         線        線    線    
                                               

732 :デフォルトの名無しさん:03/08/02 18:17
fgetsしてatoiだあ? 恥を知れ低脳

733 :デフォルトの名無しさん:03/08/02 18:19
>>732
じゃあ高脳なやり方キボンヌ。


734 :デフォルトの名無しさん:03/08/02 18:20
scanfでいいじゃんって感じ?

735 :デフォルトの名無しさん:03/08/02 18:25
ふつー strtol
atoi はクソ

736 :今日のトリビア:03/08/02 19:29
C言語のgetsはダンディ坂野が作った関数である
読み方は「ゲットエス」でも「ゲットストリング」でもなく「ゲッツ」である

実際に聞いてみた。
(σ´∀`)σゲッツ!!(σ゚Д゚)σゲッツ!!
確かにゲッツであった。


737 :デフォルトの名無しさん:03/08/02 19:53
んで、なんでatoi()はダメなの?

738 :デフォルトの名無しさん:03/08/02 20:07
atoi() はエラーを返さないから。

739 :デフォルトの名無しさん:03/08/02 20:11
>>738
strtol()ってエラー返したっけ?

740 :デフォルトの名無しさん:03/08/02 21:36
どこまで読んだか、オーバーフロウやアンダーフロウを起こしたかどうかを知ることはできる。

741 :デフォルトの名無しさん:03/08/02 23:17
オーバーフロウ→下呂
アンダーフロウ→

742 :693:03/08/03 03:49
とりあえずgetsはあきらめました。
scanf で全てやるとうまくいきました!

743 :デフォルトの名無しさん:03/08/03 04:51
あのぉ、cと関係ないかもしれないのですが、コマンドプロンプトとかなんでもいいですが
EXEを実行するときにコマンドラインから日本語を入力する事ってできるんですか??

744 :デフォルトの名無しさん:03/08/03 04:57
>>743
Google Search: コマンドプロンプトで日本語
http://www.google.com/search?lr=lang_ja&q=%83R%83%7D%83%93%83h%83v%83%8D%83%93%83v%83g%82%C5%93%FA%96%7B%8C%EA

745 :デフォルトの名無しさん:03/08/03 05:22
>>744
ググッてみるべきでした!
どうもですm(__)m

746 :デフォルトの名無しさん:03/08/03 08:29
Alt+

747 :デフォルトの名無しさん:03/08/03 09:28
定義した構造体型の実行コードは、仮想記憶上
関数の実行コードと同じ場所(コード領域)に置かれるんですか?

748 :デフォルトの名無しさん:03/08/03 09:45
「構造体型の実行コード」って何?

749 :デフォルトの名無しさん:03/08/03 09:51
「構造体型の実行コード」
サパーリわからん

750 :749:03/08/03 09:52
などというと不勉強だと言われるな。
C99より前しか知らない俺にとってはサパーリわからん

751 :デフォルトの名無しさん:03/08/03 09:58
そろそろWinアプリを作成したいのだがフリーでSDK扱える環境ってありますか?
諸先輩方教えてくださいm(__)m
ちなみに現在はborlandを使っています OSはWinXPです

752 :デフォルトの名無しさん:03/08/03 10:01
スレ違いですm(__)m

753 :デフォルトの名無しさん:03/08/03 10:19
>>751
Borland C++ + Win32SDKで問題なし

754 :デフォルトの名無しさん:03/08/03 10:57
マジくそ質問ですまん。
char a[20],b[20];
strcpy(a,"ほげほげ");
strcpy(b,"ほげほげ");
if(a==b){
っていう風に比較ってできる?


755 :デフォルトの名無しさん:03/08/03 11:13
比較はできるが、おそらく君の意図とは違う。

756 :デフォルトの名無しさん:03/08/03 11:14
>>755
マジで?じゃあ文字列全部を比較するのってどうすればいい?

757 :デフォルトの名無しさん:03/08/03 11:17
>>756
strcpyを知っているのなら、もう少し勉強を進めれば分かるでしょう。

758 :デフォルトの名無しさん:03/08/03 11:20
>>757
関数探したけど、それっぽいのないし、お願い教えて


759 :デフォルトの名無しさん:03/08/03 11:21
>>754
if(a==b) ってすると、a[0]の示すポインタとb[0]の示すポインタの比較となるから
for文で20個比較でいいんじゃね?

760 :デフォルトの名無しさん:03/08/03 11:22
>>757
ごめん。あった、strcmpだべ!!でも、比較結果で左辺の方が小さい
とかもあるんだけど、文字コードで比較してんのかな〜


761 :デフォルトの名無しさん:03/08/03 11:23
>>759
ウソを教えるな!!


762 :デフォルトの名無しさん:03/08/03 11:24
K&R 5.4
「同じ配列のメンバーを指していないポインタ同士の演算や比較を行うと、
結果は不定となる」

不定じゃなく未定義だったと記憶してるんだけど、未定義なら
比較することも駄目の様。

763 :デフォルトの名無しさん:03/08/03 11:27
(文字列を代入するにも関数を呼ばないといけないんだって!!)
K&Rより

本当に文字列の扱いが苦手だよなぁ。

764 :デフォルトの名無しさん:03/08/03 11:41
質問なんだけど、VCを使ってて、

char a[200],b[200],c;

strcpy(a,,"ふげふげ");
strcpy(b,"ほがほが");
c=func(a,b);

関数

char *func(char *strone,char *strtwo){

ってすると、
error C2440: '=' : 'char *' から 'char [200]' に変換することはできません。(新しい動作 ; ヘルプを参照)
配列型への変換はありませんが、参照またはポインタから配列への変換があります。

ってなる。手元の「C」言語の本ではOKなのに、VCではだめっぽい。
ただのC言語とのVCとの違いのせいかな?それとも根本的に使い方
間違ってる?どなたか教えてくれやさい。

765 :デフォルトの名無しさん:03/08/03 11:42
へー

766 :751:03/08/03 11:43
>>753
ありがとうございます
さっそくWin32SDK探してきます

767 :デフォルトの名無しさん:03/08/03 11:45
>>764
ごめん。これもc=func(a,b)じゃなくてstrcpy(c,func(a,b))だね。
>>754のおかげで気づいた。ありがとう>>754


768 :デフォルトの名無しさん:03/08/03 11:48
そいつはすげーや

769 :デフォルトの名無しさん:03/08/03 11:51
>>767
cの定義はなおさないのか?

770 :デフォルトの名無しさん:03/08/03 11:57
>>769
手元のソースはC[200]って宣言してた!!
説明不足スマソ


771 :デフォルトの名無しさん:03/08/03 12:53
どうでも良い質問なのでさげ
みなさんは、ある変数に1プラスしたiを代入するのにどんな表現方法を使ってますか?
int i=0,j=0;
i++;
j=i;

自分は
j=i+1;
ってやってます。
j++i;
は、あえて使ってません。

772 :デフォルトの名無しさん:03/08/03 12:54
あ、イコールが抜けた。
j=++i;

773 :デフォルトの名無しさん:03/08/03 12:56
へー

774 :デフォルトの名無しさん:03/08/03 13:01
j = i + 1 と j = ++i って結果違うし

775 :デフォルトの名無しさん:03/08/03 13:11
ループでの話をしたわけではないので、今回は見逃してください。

776 :デフォルトの名無しさん:03/08/03 13:43
いや、ループ関係ないし。

777 :デフォルトの名無しさん:03/08/03 14:00
>ある変数に1プラスしたiを代入する

「1プラスしたi」がどういう意味かによるな。
「iに1プラスした値」ならj = i + 1だろうし、
「iを1プラスしてその値」ならi++; j = i;だろう。

778 :デフォルトの名無しさん:03/08/03 14:49
質問です。
double a[5]={21,21,43,54,65} ←適当

char b[20]="はひふへほ〜"
cha c[20];
となっていて、
はひふへほ〜の後ろに、a[3]とかの中の数字をくっつけるにはどうすれ
ばいいのでしょうか?イメージ的には
strcpy(c,strcat(a,b[3]);
みたいな感じでやりたいんだけど、型が合わないし、文字列の扱いが
あまりよく分かりません。どなたか教えてください。


779 :デフォルトの名無しさん:03/08/03 14:52
>>777
後者なら普通 j=++i; ってするんじゃないの?

780 :デフォルトの名無しさん:03/08/03 15:34
j = i + 1;
ならi自体は変化しないな

781 :デフォルトの名無しさん:03/08/03 15:40
>はひふへほ〜の後ろに、a[3]とかの中の数字
sprintf(c, "%s%4.2f", b, a[3]);
かな


782 :デフォルトの名無しさん:03/08/03 15:45
>>781
なるへそ!!そんな手があったか〜、サンキョウ!!もといサンキュー
!!


783 :デフォルトの名無しさん:03/08/03 15:54
ちなみに sprintf より snprintf のほうが安全。

784 :デフォルトの名無しさん:03/08/03 16:32
何度も質問して申し訳ないんだけど、
さっきの逆で、char a[20]="7943798734834"
みたいに宣言したものを、それぞれの要素ごとに文字として代入する
にはどうすればいいの?(strtodとか使ってみたけどうまくできない。)
b=a[1]で左辺に9が代入されるみたいにやりたいんだけど、
誰か教えて!!

785 :デフォルトの名無しさん:03/08/03 16:37
b[0] = a[1]; b[1] = '\0';

786 :デフォルトの名無しさん:03/08/03 16:46
>>785
本当にごめん!!上の質問書き間違えた、"数値として代入する"
だった、左辺はdouble型の配列

787 :デフォルトの名無しさん:03/08/03 16:48
>>786
追加・左辺は配列じゃなくていいや。

788 :デフォルトの名無しさん:03/08/03 16:48
b = a[1] - '0';

789 ::03/08/03 17:15
/* Exercise2.c */
#include <stdio.h>

int main(void)
{
int a;
int b;

a = 1;
b = a;
a = 2;

printf("a = %d\n",a);
printf("b = %d\n",b);
printf("a = %d\n",a);
return 0;
}

これをa=1 b=1 a=2にしたいんだけど,a=2 b=1 a=2になってしまう
何でですか?

790 :デフォルトの名無しさん:03/08/03 17:17
>>789
aに2を代入していたあとに表示しているから。


791 ::03/08/03 17:23
790>> ありがとございます。どうやら本が間違えてるみたいです
a = 1;
b = a; 変数Aの値を変数Bに代入
a = 2; 変数Aに新たな値”2”を代入
と書いてあった!
本の間違いっぽいですに

792 :デフォルトの名無しさん:03/08/03 17:31
/* Exercise2.c */
#include <stdio.h>

int main(void)
{
int a;
int b;

a = 1;

printf("a = %d\n",a);
b = a;
printf("b = %d\n",b);
a = 2;
printf("a = %d\n",a);
return 0;
}

793 ::03/08/03 17:36
>>792 サンクス!

794 :デフォルトの名無しさん:03/08/03 18:02
http://www.shitamachi.net/ranking/cgi23/ranklink/ranklink.cgi?id=23top



.

795 :デフォルトの名無しさん:03/08/03 18:06
>>788
本当にこれで出来んの?試したけどダメだったよ。


796 :デフォルトの名無しさん:03/08/03 18:09
具体的にどうやったらどうダメだったのか書け

797 :デフォルトの名無しさん:03/08/03 18:11
>>791
その本のタイトルキボンヌ。










なんて言ったらマズイかな……。

798 :デフォルトの名無しさん:03/08/03 18:30
>>796
char a[20]="07211919";
double b[20];

double b[1]=char[1]-'0';
printf("%d",char[1]-'0'); ←確かめ(期待通りなら7が出力されるはず
                   でもだめだったポ


799 :デフォルトの名無しさん:03/08/03 18:32
>>798
ごめん上の式の中にdoubleとか,charとか式に入ってるけど無視で、
正しくは
b[1]=a[1]-'0';


800 :デフォルトの名無しさん:03/08/03 18:33
char[1] ってなによ。

801 :デフォルトの名無しさん:03/08/03 18:33
>>798
printf("%d",char[1]-'0'); も直せ

802 :デフォルトの名無しさん:03/08/03 18:35
「だめ」ってのは具体的にどういうことよ。

803 :デフォルトの名無しさん:03/08/03 18:56
>>802
非常に申し訳ない事に・・・・・出来た。てへ、ごめんよ


804 :デフォルトの名無しさん:03/08/03 18:59
>>802
人間として、ね

805 ::03/08/03 19:14
>>797 『世界でいちばん簡単なC言語のe本』 秀和システム
俺はモロ初心者なんだけど一冊目にはいいかも

806 :デフォルトの名無しさん:03/08/03 20:15
>>791に書いてあるのは間違ってはいないが、記述の順番が考慮されていない。
こんな本、あり得ません。
C言語を知らなすぎ、作者は恐らく

a = 1;
b = a; 変数Aの値を変数Bに代入
a = 2; 新たな変数Aに値”2”を代入

とでも思ったんでしょう。
記述された順番にどおりに変数を参照されたらたまったもんじゃねーよ
3回目に呼び出したときはどうなるんだ(w

807 :デフォルトの名無しさん:03/08/03 20:19
>>779
i++;//iに1を足す

こんなコメントを書くようなプログラマが居るから
間違えないようにレベルを合わせてやらないと。

808 :デフォルトの名無しさん:03/08/03 20:20
>>805
変数「A」や変数「B」なんてどこにもないだろ?
そんな本がいいわけないよ。
#仮に、Cが大文字小文字を区別しないならまた話は別だが。

809 :デフォルトの名無しさん:03/08/03 20:54
>>804
ま〜ま〜




810 :デフォルトの名無しさん:03/08/03 21:05
すごい初歩的な事教えてください!
int型の数字をchar型に変換する事は出来ないのでしょうか?

逆はatoiで出来ますよね?

何がしたいかというと、strcatで繋げてファイルに出力したいのですが・・。
やり方がわかりません

811 :デフォルトの名無しさん:03/08/03 21:12
>>810
数値を数字列にしたいってことか?
sprintfで。

812 :デフォルトの名無しさん:03/08/03 21:13
char c = (int)i + '0';

813 :デフォルトの名無しさん:03/08/03 22:06
>>812
試してみます!
>>811
数字を文字列にしたいんです。

814 :デフォルトの名無しさん:03/08/03 22:09
>>811 がいいと思うけど

815 :デフォルトの名無しさん:03/08/03 22:10
>>813
数字=数を表す字⊂文字


816 :_:03/08/03 22:10
http://homepage.mac.com/hiroyuki44/2ch.html

817 :デフォルトの名無しさん:03/08/03 23:28
int2strってどうやって使うんですか??

818 :813:03/08/03 23:36
ありがとうございます!sprintfで試してみます!

819 :デフォルトの名無しさん:03/08/04 00:35
C処理系には具体的に何が含まれるんですか?

820 :初心者:03/08/04 01:46
何度も試したのですが、うまくいかないので質問します。。。

#include <stdio.h>

int main()
{
printf("hello c");

return 0;
}

というプログラムをコマンドプロンプトでコンパイルしようとすると、

can't open: stdio.h No such files or directory

と表示されて、一向に前にすすみません。
どうすればいいのでしょうか?教えてください。

821 :デフォルトの名無しさん:03/08/04 01:52
>>820
コンパイラはな〜に?

822 :初心者:03/08/04 02:17
>>821

LSICです。

とにかくhttp://www.lsi-j.co.jpからダウンロードしました。

よろしくお願いします。

823 :デフォルトの名無しさん:03/08/04 02:20
パスが通ってないだけじゃ…

824 :デフォルトの名無しさん:03/08/04 02:30
>>820
プログラムは間違ってない。(ちょっと気になる所もあるが)
includeファイル stdio.h がみつからないと言われている。
LSICはしばらく使っていないけど、lcc.exeがあるディレクトリに
設定ファイルがあったと思う。(確かbinの中)
その中の include ファイルのディレクトリを正しく書き換えれば多分OK。

825 :デフォルトの名無しさん:03/08/04 02:32
コンパイラ設定ファイルの書き換え
LSI C-86試食版をインストールしたディレクトリに bin\_lcc という小さなファイルがあるはずです。
これはコンパイラの設定ファイルです。これをエディタで読み込んで下さい。
次のようになっていると思います。

# LSI C-86 compiler's configuration file

-DLSI_C
-XA:\LSIC86\BIN -LA:\LSIC86\LIB -IA:\LSIC86\INCLUDE -T -O
-acdos.obj $LSICOPTS
& #Command line argument will be inserted here
-lknjlib -ldoslib -v

この中に A:\LSIC86 と書いてある行があります。
LSI C-86試食版をインストールしたドライブ・ディレクトリが a:\lsic86 ならこのままでかまいませんが,
そうでないなら,この A:\LSIC86(3個所)を書き換えます。

-XA:\LSIC86\BIN -LA:\LSIC86\LIB -IA:\LSIC86\INCLUDE -T -O
      ↑          ↑          ↑


826 :813:03/08/04 02:35
すみません。また質問です。sprintfでint型の物はchar型に変換できたのですが、double型の物をchar型にどうやって変換するのでしょう??

827 :デフォルトの名無しさん:03/08/04 02:38
>>826
sprintf

828 :813:03/08/04 02:45
>>827
どうやればいいのですか??

例えばa=100.1234123131213131・・・・・・のようなdouble型で
char b[100000];

sprintf(b,"%f",a);
コレで出来るのでしょうか??


829 :デフォルトの名無しさん:03/08/04 02:52
doubleなら%lfとかだな

830 :デフォルトの名無しさん:03/08/04 03:03
うそ教えちゃダメ

831 :813:03/08/04 03:20
大まかできたのですが、

sprintf(b,"%4f",a);
としても何にも変わらないのですけどどうすればいいのですか??

4桁だけchar型に変えたいのですが・・・。


832 :デフォルトの名無しさん:03/08/04 03:26
sprintf (MATLAB Function Reference)
http://shakosv.sk.tsukuba.ac.jp/jdoc/MATLAB5/jhelp/techdoc/ref/sprintf.html

833 :デフォルトの名無しさん:03/08/04 03:30
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
って出力させたいんですけど・・・


834 :デフォルトの名無しさん:03/08/04 03:32
>>831
やりたいことを具体的に書こうや。
もしくはsprintf()のマニュアルを読むことと
Cの文字列取り扱い全般について調べることを薦める。

835 :デフォルトの名無しさん:03/08/04 03:36
>>833
/* 一例を提示 */
int ic;
for (ic = 1; ic <= 40; ic++) {
printf("%d ", ic);
if (ic % 10 == 0) {
printf("\n");
}
}


836 :813:03/08/04 03:38
すみません。やりたい事を言います。
今 double aに浮動小数点型の数字が入っています。
コレを別の文字列とstrcatで結合してファイルに出力しようとしています。
このaには例えば

100.123456という数が入るわけですが、
コレを文字列にした時、
100.12としたいのです。そこでsprintfを使って、

double a;
char b[1000];
sprintf(b,"%6f",a);

とか

double a;
char b[1000];
sprintf(b,"%3.2f",a);

とかやっても。
元の100.123456が入力されてしまいます。
どうすれば・・・。



837 :813:03/08/04 03:42
すみません。

double a;
char b[1000];
sprintf(b,"%3.2f",a);

でうまく行きました!!
違うファイルをコンパイルしていて変更が反映されていなかったという落ちでした・・・。
すみません、単純ミスです。

838 :これは一体..:03/08/04 05:17
[C++ エラー] Unit2.cpp(21): E2176 宣言に型が多すぎる
BorlandC++Builderを使ってます。
21行目に
static int conp(char *addr, int lint, int vint, lcomposition *lc);

として関数を定義しています。
ヘルプを読んだのですが
宣言に複数の基本型を指定することはできません。次に基本型を示します。

char

class
int
float
double
struct
union
enum
typedef
とあるのですがどう対処したら良いのかわかりません
宜しくお願いします。


839 :デフォルトの名無しさん:03/08/04 05:36
static int conp(char *, int, int, lcomposition *);
削って宣言してみては

840 :これは一体..:03/08/04 05:38
>>839
やってみましたが状況変わらずです;;

841 :デフォルトの名無しさん:03/08/04 05:46
定義じゃなくて宣言だよね。どうでもいいけど。

842 :これは一体..:03/08/04 05:52
>>841
正しい呼び方が分かりました^^

843 :デフォルトの名無しさん:03/08/04 05:58
conpがtypedefで再定義されていないか
21行目以前の構文は正しいか(;を付け忘れていないか)
漏れが思いつくのはこれくらい

844 :845:03/08/04 06:09
放置ですか?

845 :_:03/08/04 06:16
http://homepage.mac.com/hiroyuki44/jaz05.html

846 :デフォルトの名無しさん:03/08/04 06:17
first, that's your business.

847 :これは一体..:03/08/04 06:21
>>843
結論がまだでていないのでまたこのスレで報告します。


848 :_:03/08/04 06:36
http://homepage.mac.com/hiroyuki44/

849 :デフォルトの名無しさん:03/08/04 06:45
>>838
トラブったときの基本
1つずつ外してチェック
1つずつ単体でチェック

850 :これは一体..:03/08/04 06:58
>>849
はい 今回は冒険しすぎました><

851 :デフォルトの名無しさん:03/08/04 10:48
#define
ってマクロって聞いたんですが
#define hoge 123
とかは意味わかるんですけど
#define hoge
ってのが意味わかりません
誰か親切な方教えてくださいお願いします

852 :デフォルトの名無しさん:03/08/04 11:09
>>851
空の文字列への置き換え。

取り敢えず思いついたサンプルを。

#define NEW_LINE "\n"
printf("foo" NEW_LINE);
→改行される

#define NEW_LINE
printf("foo" NEW_LINE);
→改行されない


853 :初心者:03/08/04 11:15
>>824-825

本当にありがとうございます。試してみます。

854 :初心者:03/08/04 11:18
>>824-825

無事できました。
2ちゃんねるにもこのような心優しいお方がいることに感動しますた。

普段はニュー速にいるからあまり感じないですが・・・・

855 :デフォルトの名無しさん:03/08/04 11:21
>>852
つまり何にもしないってことですか?

856 :デフォルトの名無しさん:03/08/04 11:23
#ifdef hoge
こいつを通すために、
#define hoge
とすることはよくある。
ま、別に適当な値を放り込んでもいいんだけどサ。

857 :852:03/08/04 11:32
>>855
「何もしない」ではなく、「空になる」。
先程の例では、
printf("foo" NEW_LINE);

printf("foo" );
に展開されるわけ。

なお、>>856の言うように値が必要ない応用も多い。

典型的な例。
標準インクルードのstdio.hを覗くと、
次のようなマクロの使い方をしていると思う。
#コンパイラによってはpragmaで代用しているかもしれない。

#ifndef STDIO_H
#define STDIO_H
...
#endif


858 :デフォルトの名無しさん:03/08/04 11:34
コンパイル環境によって定義を微妙に変えたい場合に使ったりする。

#if WIN16
#define FAR __far
#else
#define FAR
#endif

const char FAR *vram;

WIN16が定義されていない場合は FAR は何も指定しなかったのと同じになる。
結局852と同じだけど。


859 :デフォルトの名無しさん:03/08/04 11:38
>>854
無意味に喧嘩腰の奴もいるからな。

860 :デフォルトの名無しさん:03/08/04 11:42
>>856-858
まだよくわかんないですが
なんとなくイメージがつかめました
ありがとうございました

861 :デフォルトの名無しさん:03/08/04 13:39
#if defined(__STDC_VERSION__)&&__STDC_VERSION__==199901L
#define RESTRICT restrict
#else
#define RESTRICT
#endif

int func(int * RESTRICT p1,int * RESTRICT p2);

862 :デフォルトの名無しさん:03/08/04 16:03
>>608
遅くなりましが、どうも、ありがd
プラグラム・・・ハズイ・・・

863 :デフォルトの名無しさん:03/08/04 16:39
すみません

最近プログラムをはじめたんですが、bccでコンパイルすると1行目に
左辺値が必要です。となるんですが、何が足りないのかわからないので
教えてください。そして、2行目が不正な代入となるんですが何が
不正なのかわからないです。

for(i = 1 ; i < 5 && magic = num2 ; i++){
if(magic = num2) {
if(i==1) printf("すごいね、正解だよ!");
if(i==2) printf("2回目ならまぁまぁかな。");
if(i==3) printf("3回目かよ。もうちょっと勘を使えよ。");

}


よろしくお願いします。

864 :デフォルトの名無しさん:03/08/04 16:44
iとmagicとnum2の定義はどこだ?

865 :デフォルトの名無しさん:03/08/04 16:48
>>863
ダウト!
for(i = 1 ; i < 5 && magic = num2 ; i++){
magic = num2 ×
magic == num2 ○

866 :デフォルトの名無しさん:03/08/04 16:49
あるいは(magic = num2 )とする

867 :デフォルトの名無しさん:03/08/04 16:50
>>864
最初からのせるとこんな風になります。

#include<stdio.h>

int main(void)
{

int magic, num1, num2, i ;

printf("数当てゲームです。あなたの入力した整数をある一桁の数に変換します。\nその変換された数を当ててください。\n");

printf("整数を入力してください: ");
scanf("%d", &num1);

magic = (num1*num1)%10;

printf("変換された数はいくつでしょうか?:");
scanf("%d", &num2);

for(i = 1 ; i < 5 && magic = num2 ; i++){
if(magic = num2) {
if(i==1) printf("すごいね、正解だよ!");
if(i==2) printf("2回目ならまぁまぁかな。");
if(i==3) printf("3回目かよ。もうちょっと勘を使えよ。");

}




868 :_:03/08/04 16:51
http://homepage.mac.com/hiroyuki44/jaz06.html

869 :デフォルトの名無しさん:03/08/04 16:58
>>867
mainの戻り値がありません。
JavaならコンパイルエラーだがCでは平気なんだな・・・
---------------------------------------------------------
このプログラムでは1回目だけしか判定できません。
main関数と判定関数を分離して、mainから何回も判定関数を呼べるように
しないと意図しているプログラムはできません!

870 :デフォルトの名無しさん:03/08/04 16:59
>>865
”=”と、”==”の違いがはっきりと分からないのですが、

”=”は代入する
”==”は実際に同一かどうか

とか理解しているんですが、

magic == num2

(magic = num2)

のどちらかでいいというところが理解できないんですが・・・。
ちなみに、下のほうでやったら通りました。ありがとうございます。

871 :デフォルトの名無しさん:03/08/04 17:00
>>869
mainの一部しか書いていないだけだろ

872 :デフォルトの名無しさん:03/08/04 17:00
>>869
この後もまだまだ続くんです。
867だけだとmain関数が閉じられてないのでエラーがでるはずです。

873 :デフォルトの名無しさん:03/08/04 17:02
10進数の数値のそれぞれの桁の数字を取り出したいのですがどうやればいいんでしょう?
16進数ならandとビットシフトでできますが、
1桁目:a & 0x0F
2桁目:(a & 0xF0) >> 8
10進数ではどうやるんでしょう?

874 :デフォルトの名無しさん:03/08/04 17:02
> if(magic = num2) {

magicにnum2の値を代入し、その値が真であれば(0でなければ)

875 :デフォルトの名無しさん:03/08/04 17:03
>>873
10の倍数で割った余り。

876 :875:03/08/04 17:05
ちょっと違うか。
int i=45678;
printf("%d\n",i/1000%10); /* 5と表示されるはず */

877 :デフォルトの名無しさん:03/08/04 17:08
変数をvoidで宣言するとどんないい事があるんですか?

878 :デフォルトの名無しさん:03/08/04 17:10
>>877
できるのか!?と思って試してしまったじゃないか。


879 :デフォルトの名無しさん:03/08/04 17:13
あ、スンマセン、構造体でのポインタ変数の事です。

880 :デフォルトの名無しさん:03/08/04 17:17
>>879
ああ、void *か。
どんなポインタでも代入できるので、よく汎用的な配列を扱う関数で使う。
memmove,memcmp,qsortなど。
これらの関数の引数がもしも特定の型のポインタ(int *とか)だとしたら、呼び出し側でキャストしないといけなくなる場合がある。
あとmallocの戻り値もvoid *だね。

881 :873:03/08/04 17:20
>>876
ありがとうございました。できました。
余りを求める「%」って今まで使ったことなかったです。

882 :デフォルトの名無しさん:03/08/04 17:25
>>880
どうもありがとうございました。
最初脊髄反射的な質問してしまってすみませんでした。

883 :デフォルトの名無しさん:03/08/04 17:51
forループ内で、forの初期設定部の値を変化させることはできるんでしょうか?

たとえば、for( i = 0 ; i < 11 ; i++);

とかなっているところに、for関数内のコードブロックで、i=0
に戻して永遠とループさせることとかってできますか?

884 :デフォルトの名無しさん:03/08/04 17:56
>>883
出来るけどさ
無限ループならwhile文使おうよ・・・

885 :883:03/08/04 17:57
>>883
あっと、初期設定部ではなくて、何回かループした
ところで、i=0に戻してもう一度最初からループさせることは
できますかということでした。

886 :デフォルトの名無しさん:03/08/04 17:57
>>883
やればわかるkと聞くなよ

887 :_:03/08/04 18:01
http://homepage.mac.com/hiroyuki44/

888 :883:03/08/04 18:08
やってみてできないんだけど、
宿題でforループを使ってやりなさいって
指令が下ってるもんで。

しいませんでした。

889 :デフォルトの名無しさん:03/08/04 18:48
iに-1代入すれば?

890 :ヽ(´ー`)ノ:03/08/04 19:05
単に for(;;) すればいいとかそういう話か?

891 :デフォルトの名無しさん:03/08/04 19:12
単にwhile(1)にすればいいとかそういう話か?

892 :デフォルトの名無しさん:03/08/04 19:35
>>891
利用されない定数があります。

893 :デフォルトの名無しさん:03/08/04 19:36
>>883
>永遠とループさせる

永遠にループさせることはできるかもしれませんが、
永遠とループさせることはできないと思われます。

894 :デフォルトの名無しさん:03/08/04 19:36
>>883

for (i = 0; i < 11; i++) {
i = 0;
}

895 :デフォルトの名無しさん:03/08/04 19:46
お待ちなさい。

>宿題でforループを使ってやりなさいって
>1

896 :883:03/08/04 19:51
使えない奴ばっか

897 :デフォルトの名無しさん:03/08/04 20:47
for(;;) {
printf("永遠\n");
}


898 :デフォルトの名無しさん:03/08/04 20:50
MinGWのソースってダウンロードできるの?

899 :デフォルトの名無しさん:03/08/04 20:53
通報しました

900 :デフォルトの名無しさん:03/08/04 21:09
>>898
Mingw: File Download http://www.mingw.org/download.shtml

901 :デフォルトの名無しさん:03/08/04 21:11
VC++じゃコンパイルできないんだよね

902 :デフォルトの名無しさん:03/08/04 21:46
iconvの使用方法を教えていただきたく質問させていただきます。
iconvでEUCからSIJSに変換したい

unsigned char *ps; *EUCのデータが入ったバッファの先頭アドレス
chardst[48]; *変換後のデータを格納するcharの配列

こんな条件でやりたいのですがご指導お願い致します。

903 :デフォルトの名無しさん:03/08/04 21:53
http://pc2.2ch.net/test/read.cgi/tech/1055110889/

904 :898:03/08/04 21:57
>>900
すいませんがそのどれですか?

905 :デフォルトの名無しさん:03/08/04 21:57
>>902
iconv使ってるソースをパクって...いや参考にすれば?

906 :デフォルトの名無しさん:03/08/04 22:03
iconv では役不足です。

907 :デフォルトの名無しさん:03/08/04 22:40
>>902
マニュアルくらい読めよ。

908 :デフォルトの名無しさん:03/08/04 22:42
iconvのiってなに?international?

909 :デフォルトの名無しさん:03/08/04 22:46
Iscandal

910 :質問age:03/08/05 00:37
質もんもんもん〜
関数が終われば、mallocとかcallocとかで確保したメモリをわざわざ
freeとかで開放する必要ってないの、それとも、そういった事はプログ
ラムが終了する時だけ?


911 :デフォルトの名無しさん:03/08/05 00:38
>>910
少なくとも関数を抜けただけでは解放されない。

912 :質問age:03/08/05 00:48
>>911
じゃあさ、returnで文字配列を返してたとする。その文字配列は動的に
確保されていました。さて、これはどうやって開放すればよろしいので
しょうか?(その文字配列はローカル変数)
returnって来たらその後のは実行されず戻っちゃうんでしょ?


913 :デフォルトの名無しさん:03/08/05 00:50
>>912
> その文字配列は動的に確保されていました。
> その文字配列はローカル変数

どっちなんだ?

914 :デフォルトの名無しさん:03/08/05 00:50
>>912
char *foo()
{
 char buf[BUFSIZ];
 ...
 return buf;
}
てことか?





氏ね。

915 :デフォルトの名無しさん:03/08/05 00:51
>>912
文字列を返すってことは、その文字列の先頭のアドレスを返すってことだろ

916 :質問age:03/08/05 00:56
>>915
うんそういう事。わかりにくかったかな。ローカル変数ってのはポインタ
をローカルで宣言したって事。だから
char *buf;
〜〜〜〜←動的に確保
returan buf;
とこんな感じ

917 :デフォルトの名無しさん:03/08/05 00:57
>>916
その戻り値をどこかでfreeすればよいのでは。
UNIXのstrdupみたいに。

918 :質問age:03/08/05 00:58
>>917
どこかとは?あと、strdupってのは悪いけど知らないな〜、unix使い
じゃないから


919 :質問age:03/08/05 01:00
>>914
あっ!!くそ!下の方になんか書いてありやがった。
お、おまえが氏ね〜、ウェーン


920 :デフォルトの名無しさん:03/08/05 01:00
>>918
戻り値と言っているのにわからないの?

921 :質問age:03/08/05 01:05
>>920
受け取った側っつー事け?


922 :デフォルトの名無しさん:03/08/05 01:08
質問の仕方が厨房すぎ

923 :デフォルトの名無しさん:03/08/05 01:09
>>921
そう。専用の解放関数をつくってその中でfreeしてもいいけど。

924 :デフォルトの名無しさん:03/08/05 01:10
>>916
その誤字だらけを何とかしろ。
で、面倒だから一例を。


char *func(void);

char *p = func();
free(p);

...

char *func(void)
{
return malloc(ANY_SIZE);
}


925 :デフォルトの名無しさん:03/08/05 01:15
>>924
なんだかんだ言って優しいね。ありがとう!!


926 :デフォルトの名無しさん:03/08/05 01:22
配列の初期化で
a[10]={0};
だと全部0が代入されますが、
a[10]={-1};
だとa[0]のみ-1が代入されてa[1〜9]に0が代入されるのは
仕様なんでしょうか?

927 :デフォルトの名無しさん:03/08/05 01:28
>>926
仕様です。
int a[10]; /* 自動変数では何が入るか分からない(静的変数なら全て0) */
int a[10]={0}; /* 全て0 */
int a[10]={3,-9}; /* 3,-9,あとは0 */

928 :デフォルトの名無しさん:03/08/05 01:30
>>926
そんな便利な事できんの?


929 :デフォルトの名無しさん:03/08/05 01:34
>>927
int a[10]={0};は最初のa[0]に0を入れて、後、入れてないとろは勝手に0になるってことですね
ありがとうございました

930 :デフォルトの名無しさん:03/08/05 01:38
>>927
そういう事ってmallocとかで配列用のメモリ確保した時にもできれば
便利なんだけどな〜

931 :デフォルトの名無しさん:03/08/05 01:44
calloc

932 :デフォルトの名無しさん:03/08/05 01:48
nullpo

933 :デフォルトの名無しさん:03/08/05 02:01
あのさー、ハードディスクの上に仮想メモリってあるじゃん?じゃあさ、
メモリを超える量確保しようとしたり、腸デカイ配列とか宣言したらさ、
勝手にハードディスクの上を使おうとするのかな?
あと、自分からハードディスクをメモリとして使えたりするの

934 :デフォルトの名無しさん:03/08/05 02:04
  ∧_∧
 ( ´∀`)

935 :デフォルトの名無しさん:03/08/05 02:05
>>933
それはC言語とは関係ない。

936 :デフォルトの名無しさん:03/08/05 02:06
  ∧_∧
 ( ´∀`) < nullpo

937 :デフォルトの名無しさん:03/08/05 02:27
>>935
そうなの?

938 :デフォルトの名無しさん:03/08/05 02:28
どっちかってーとOSの話ですな

939 :デフォルトの名無しさん:03/08/05 02:28
OSの話かな。

940 :デフォルトの名無しさん:03/08/05 09:01
>>937
mmapとかで検索してみろ。

941 :898:03/08/05 15:19
MinGWのソースって公開されていないのですか?

942 :デフォルトの名無しさん:03/08/05 18:52
保守

943 :デフォルトの名無しさん:03/08/05 20:33
ちょっと聞きたいことがあるんですけど。
文字の入力待ちで何か文字を打ち込み(getsにより)
あらかじめ指定しといた文字とあたったらその処理をおこなう
というプログラムを組みたいんですけど何かいい方法ありますか?
if文かswitch文でお願いします

944 :デフォルトの名無しさん:03/08/05 20:34
>>943
if文でstrcmp()じゃダメなの?

945 :デフォルトの名無しさん:03/08/05 20:35
>>943
gets(a);
if(*a=='H')
・・・
switch(*a){
case 'A':
・・・
case 'B':
・・・
}


946 :デフォルトの名無しさん:03/08/05 20:36
>>943
gets()なんか使うな!

947 :デフォルトの名無しさん:03/08/05 20:58
>>943さんありがとうございます
すみませんまだよくCについて理解してないんで・・・
strcmp()って何ですか?

>>945さんありがとうございます
まだちょっと試してないんですけど
それは文字列でもできますか?

>>946さんありがとうございます
gets()以外でほかにありますか?
今自分が知ってるのはscanf()とgetchar()とgets()
くらいしかないんですけど・・・

948 :943,947:03/08/05 21:00
943=947です。

それと947での発言で943って書いたところ944です。
すみません

949 :デフォルトの名無しさん:03/08/05 21:03
>947
gets() を使うなら fgets() の方が良いよ。
http://www.bohyoh.com/CandCPP/C/Library/index.html

950 :デフォルトの名無しさん:03/08/05 21:11
>>947
文字列の比較を行うのがstrcmp
Cは文字列の比較も関数を使う。


新スレ立ててくるか。

951 :デフォルトの名無しさん:03/08/05 21:12
>>947
>>1のリンクにある、C FAQ 日本語訳 は目を通しましょう。今は分からなくても。
聞く前に試しましょう。わからないことがあったら調べましょう。


952 :デフォルトの名無しさん:03/08/05 21:19
http://pc2.2ch.net/test/read.cgi/tech/1060085935/
新スレ

953 :944:03/08/05 21:36
>>947
>>950がすでに言ってるけど、参考までに。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strcmp.3.html

954 :947:03/08/05 21:54
>>949さん
>>950さん
>>951さん
>>952さん
>>953さん
ありがとうございました。
いろいろなサイトに回ったり、家にあった本などの索引など利用して
どうにかできました。
結局strcmp()使って解決しました!
知らないいろいろなキーワードからいろいろな世界が広がりました!
ためになることなど知れたので、ありがとうございました!

955 :デフォルトの名無しさん:03/08/05 23:02
任意の文字(アルファベト)を発生する関数ってなんか
ありましたか?


956 :デフォルトの名無しさん:03/08/05 23:05
 ∧_∧  ∧_∧
ピュ.ー (  ・3・) (  ^^ )(^ё ^)<これからも僕たちを応援して下さいね(^^)。
  =〔~∪ ̄ ̄ ̄∪ ̄ ̄ ̄ ̄〕
  = ◎――――――――◎                      山崎渉&ぼるじょあ&みんちぇ


957 :デフォルトの名無しさん:03/08/05 23:05
>>955
よくわからん。
ランダムにアルファベットを発生させたいのか?

958 :957:03/08/05 23:08
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[(int)((double)rand() / ((double)RAND_MAX + 1) * 52)];
こうか?

959 :GET! DVD:03/08/05 23:10
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
☆★☆★☆★ 新商品 ゾク・ゾク 入荷 ☆★☆★☆
★☆                       
☆★ 送料激安!!  送料激安!!  送料激安!!
★☆      http://www.get-dvd.com.tw      
☆★  激安アダルトDVDショップ        
★☆    お買い得!! 1枚500円〜 急げ!   
☆★    インターネット初!「きたぐに割引」  
★☆    北海道・東北の皆様は送料も激安!   
☆★      http://www.get-dvd.com.tw      
★☆        スピード発送!        
☆★      http://www.get-dvd.com.tw      
★☆        商品が豊富!         
☆★      http://www.get-dvd.com.tw      
★☆                       
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆

960 :デフォルトの名無しさん:03/08/06 00:40
C言語の場合は、
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[rand()%52];
が普通かな。


961 :デフォルトの名無しさん:03/08/06 00:43
http://www.catnet.ne.jp/kouno/c_faq/c13.html#16

962 :デフォルトの名無しさん:03/08/06 00:46
そうでもないよ

963 :デフォルトの名無しさん:03/08/06 01:35
アスキーコードから呼び出すってことはできないの?

964 :デフォルトの名無しさん:03/08/06 01:35
どういう意味?

965 :デフォルトの名無しさん:03/08/06 01:53
Aのコードは41でZは5a
aのコードは61でzは7a
41〜5a、61〜7aの乱数が作れれば、アスキーコード→英文字に変換→ランダムで英語の表示
みたいなことはできないのでしょうか?

966 :デフォルトの名無しさん:03/08/06 01:59
英語の表示?

967 :デフォルトの名無しさん:03/08/06 02:06
char ch = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[(int)((double)rand() / ((double)RAND_MAX + 1) * 52)];
の代わりに、
int tmp = (double)rand() / ((double)RAND_MAX + 1) * 52;
char ch = tmp >= 26 ? 'a' + tmp - 26 : 'A' + tmp;
としたいということかな?

複数文字出力したいならこれをループさせればいい。

968 :デフォルトの名無しさん:03/08/06 02:06
表示じゃなくて発生ですね

969 :デフォルトの名無しさん:03/08/06 02:13
>>967
多分そんな感じです
ありがとうございましたm(_ _)m

970 :デフォルトの名無しさん:03/08/06 05:39
わからないので教えてください

again:
printf("big(1),reg(2),end(3)を入力しEnterを押してください(半角で入力)\n");
scanf("%d",&s);

if(s!=1&&s!=2&&s!=3){
printf("1,2,3のいずれかを押してください!\n");
}


switch(s){
case 1:


case 2:


case 3:

}
goto again;

こんな感じになってるんですが、1,2,3を押したときはもちろん、4,5など数字を押すとちゃんと働くのですが、
aとかbとか打つと永遠にループしてうまく働いてくれません。
どうしてなのでしょう?

971 :デフォルトの名無しさん:03/08/06 05:50
>>970
scanf が永遠に数字を探し続けるから。

972 :デフォルトの名無しさん:03/08/06 05:52
どうすればいいのでしょう??

あとなぜアルファベットが押されたときにだけバグるのでしょう?

教えてください!M(__)M

973 :デフォルトの名無しさん:03/08/06 06:02
エラーの回復など面倒なことせずにここでexitしなさい
if(s!=1&&s!=2&&s!=3){
printf("1,2,3のいずれかを押してください!\n");
}


974 :デフォルトの名無しさん:03/08/06 06:04
とりあえずそうします・・。

どうにかして回復させる方法はないものでしょうか???

975 :デフォルトの名無しさん:03/08/06 06:07
簡単に言うと
WHILE INKEY$<>"" : WEND
だな

976 :デフォルトの名無しさん:03/08/06 06:12
>>975
どうもっす。もっと勉強します(何かいてあるのか分からないから(^_^;))

それって割り込みとかですか??

977 :デフォルトの名無しさん:03/08/06 06:23
BASICなんだが…

978 :デフォルトの名無しさん:03/08/06 06:47
>>976
俺もそのゴミ捨て方法の決定版は知らん
とりあえずscanfの戻り値をチェックして正しく
変換されたかどうかを見る。次にstdinがEOFでなければ
ゴミ捨てだが、見たことがあるのはfflush(stdin) (未定義っぽい)
rewind(stdin) (うまく行く理由が特にない)とかで俺の使っている
処理系では確かにこれでできるのだがいまいち納得がいかない。
scanf("%*s")とかでどうなんだろう。

詳しい人よろしく

979 :デフォルトの名無しさん:03/08/06 07:05
>>976
文字列を打ち込む可能性があるので、
int i;
scanf("%d",&i);
ではなく、
char s[256];
scanf("%s",s);
を使う。
そして返ってきた文字列を数値に変換する。"a"とかは失敗するので
エラー処理とか0を返すようにするのがいいかと思われ。

しかし、もっといい方法はそもそもscanfは糞なので使わない方がいい。
下の12.20あたりを参照されたし。
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/c/C-faq/C-faq-12.html



980 :デフォルトの名無しさん:03/08/06 07:37
>>975 は30代

981 :976:03/08/06 10:13
皆さん勉強になりますM(__)M
ありがとうございました、もう少し勉強してみます!

982 :976:03/08/06 10:20
結局、
scanf("%s",&f);
s=atoi(f);

でバグらくなりました。

983 :デフォルトの名無しさん:03/08/06 10:57
>>982
scanf("%d",&d); でゼロが帰ってきたら他のものが入ってるってことになる。
scanf("%s",&s); しとけば、%dでとれなかった文字列がとれる。


984 :デフォルトの名無しさん:03/08/06 11:21
そしてバッファオーバーラン。

985 :次スレ案内:03/08/06 11:25
C言語なら俺に聞け! Part 63
http://pc2.2ch.net/test/read.cgi/tech/1060085935/l50

986 :デフォルトの名無しさん:03/08/06 13:31
うんち

987 :デフォルトの名無しさん:03/08/06 17:45
uma-

988 :デフォルトの名無しさん:03/08/06 17:55
ume-

989 :次スレ案内:03/08/06 22:37
C言語なら俺に聞け! Part 63
http://pc2.2ch.net/test/read.cgi/tech/1060085935/l50

990 :デフォルトの名無しさん:03/08/06 23:31
なんかエラーが厳しいぞ

991 :デフォルトの名無しさん:03/08/06 23:40
カウントダウン開始

10

992 :デフォルトの名無しさん:03/08/07 00:43
9

993 :デフォルトの名無しさん:03/08/07 01:02
8

994 :デフォルトの名無しさん:03/08/07 04:29
7

995 :デフォルトの名無しさん:03/08/07 04:40
8

996 :デフォルトの名無しさん:03/08/07 04:40
6

997 :デフォルトの名無しさん:03/08/07 04:40
9

998 :デフォルトの名無しさん:03/08/07 04:40
7

999 :デフォルトの名無しさん:03/08/07 04:40


1000 :デフォルトの名無しさん:03/08/07 04:41
1000!

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

222 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)