1 :
v(^o^i)d :
03/07/21 11:31
2 :
デフォルトの名無しさん :03/07/21 11:32
ι(´Д`υ)アツィー
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型になる。
>>5 全く同じ
char* mona,giko;
と書いてもgikoがポインタになったりゃ1000
ははは 論理学の試験問題みたくなってきたな
>6 早速のレスありがとうございます。 よく分かりました。
>8の方もありがとうございます。
13 :
デフォルトの名無しさん :03/07/21 12:21
>>6 > char* string,string2;
> として書いたとき、string,string2両方ともポインタになるが、
ならないよ。
>>10 ・・・自分で確かめるのがよろしいと思われ。
>>6 が嘘こいてる。
ってかこのやりとり全てがネタ?
if (x) と if( x ) で意味が違ったら面白いことになりそうだな
16 :
デフォルトの名無しさん :03/07/21 12:27
>16
#define M(x) xと#define M (x) xは意味が違うけど、これはプリプロセッサの話だからな。
藻前ら釣られ杉
ばかばっかーーーーーーーーーー
>>5 基本は
型名 変数名;
だから
char* string;
と書くことをオススメします。
ついでに同じ行で複数の変数を宣言しない事をオススメします。
ただし年上の方から睨まれるという罠。
C の人は char *string; の方を使う人が心もち多い。 俺は char* string; 使うがなー。 >同じ行で複数の変数を宣言しな ければ、紛らわしいこともないし。
24 :
デフォルトの名無しさん :03/07/21 16:59
配列へのポインタを宣言して代入できるものってなんですか? char id[256]; char (*pId)[]; pId = id; このままだとidは単にchar型のポインタなので エラーでるのはあたりまえっちゃあたりまえなんですけど 配列の先頭アドレスなら代入できるのかなと思ってました。
意味がわからん。
pId = &id;
>>28 おお、なるほど
これで配列のエイリアスがつくれるということですか。
ネタ?
32 :
デフォルトの名無しさん :03/07/21 17:55
>>22 >基本は
>型名 変数名;
誤り。
よって、これに立脚する話はすべて無効。
>>5 よ、
>>22 のような主張は周りとの摩擦を起こしてまで
強情はっちゃだめだよ。
>>22 のような不勉強に陥るし、
何と言っても「解りやすく書くこと」はオナニーになったら
意味がない。1人で決めちゃだめなんだ。
>>33 は誤り。
理由も書かずに否定するだけでそれが有効となる。
楽な世の中だな。
>>35 int main(argc,argv)
int argc;
char *argv[];
{
printf("今時K&Rでつか。");
}
K&Rって何だ?
>>36 では、あなたの言う「基本」とは何か?
発明者の説明以上に説得力のある「基本」があるならそれを示せば済むはず。
>>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
};
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 };
>>22 みたいなのは、ありがちなCの初心者。
つーか俺もCを触った当初はそんな風に考えたこともあった。
「基本は、『型名 変数名』」と言うなら、基本形じゃないケースが
あることを忘れるな。そしてそれがポインタの場合。
ポインタは全てtypedefしているから問題なし。
基本ってのは、typedef された型を使うときのが基本って気がする。
「型名 変数名」って考え方は、何処から出てくるのだろうか… 一体、配列や関数ポインタの事を、どう解釈しているのだろうか… とても気になる、今日この頃…
配列や関数ポインタは全てtypedefしているから問題なし。
基本ってのは、typedef された型を使うときのが基本って気がする。
50 :
デフォルトの名無しさん :03/07/22 03:41
「型名 変数名」か・・・ int* hoge; は整数ポインタ型のhogeと解釈するのかな 俺は整数型のポインタhogeとしてint *hoge;って書くけど
「型名 変数名」になってないのは ポインタと配列(typedef されたものを除く)だ。 じゃぁ、そうなってるのは何か? それを「基本」と呼ぶのは悪いことではない気がする。 なぜなら、ポインタでも配列でもない変数を一番よく使うからだ。 って、そもそも規格でも整数型と浮動小数点型を合わせて 「基本型」って呼んでるでしょー。
voidも
void の変数なんか作れるか!
>>51 【「基本」と言うのは、「応用」と組み合わせて使うべきだ】
【「例外」と組み合わせて使うべきではない】
と思う。
つまり、
【宣言方法は例外を除いて「型名 変数名」しかない】
と言うなら分かるが(↑が正しいかを別にして)、
「応用」が無いのに「基本」を使うのは、何か違うと思う
55 :
デフォルトの名無しさん :03/07/22 04:47
なんでsizeof(void)ができるの?(´・ω・`)
ここCスレなのにC++と混同してる奴が多すぎ。
何となく分かったかも 「型名 変数名」って考えてる人は、「型名 変数名 修飾子」で考えてて 「型名 → 修飾子 → 変数名」って解釈してるのかな…? 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」 これ以上複雑にならなければ、こんな感じで、結構、楽に解釈できるのかも…
>>58 出来ません
sizeof演算子は、関数型とvoid型以外のオペランドのサイズを返します
by 規格
お前らまだやってんのか。
int *hensuu; /* ジジイ、ダサい */ int* variable; // 若者、オサレ
int i=3; int*PI=&i; // およそ3
>>60 この場合コンパイルされるか?されないか?の話かと。
>>64 手元にあるのでコンパイル出来るのはgccのみだが
まともな処理系ならエラーが出て当然(その他のコンパイラはエラーが出る)
VC++6.0でもコンパイルできた。
>>54 日本語を勉強し直してきませう。
対義語は1種類しか無いとは限らない。
どれも違う。 基本⇔発展 応用⇔基礎 例外⇔原則 が正解。54も68も勉強が足りない。
「基本的に」に対応する言葉は 普通「〜の場合は」だと思うが。
だれも対義語の話なんかしてない
#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文を実行する方法ありませんか?上手く行きません。
あげます
もらいます
75 :
デフォルトの名無しさん :03/07/22 18:23
なにがしたいの?
>>76 違います。
関数内で引数として渡した数だけ、forを実行したいのです。
例は(引数+1)になってますけど。
実際には他にも配列へのポインタ引数をとり。その配列長がnです。
for内の i[] は各々の配列に操作を加えるとき、パラメータとして使います。
>>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);
}
}
}
二重ループじゃ駄目なのか?
>>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);
}
n重ループしたいんだろ
釣り?
>>79 おぉ〜、再帰で出来ますね。
理解するのに少し時間がかかりました。
ありがとうございます。
ただ多分うん千回繰り返すのと、なるべく早い方がいいので、
関数呼び出しオーバーヘッド?が心配です。
この場合 while 等で再帰をなくすことは無理のようですね。
>>80 いまいちどういうことか分かりません。
よろしければ、もう少しだけ詳しく教えていただけませんか?
>>81 すみませんが、それは全然違います。
なんかものすごいことをしようとしているヨカーン
うん千重ものループかΣ( ̄□ ̄;)
n^1000 じゃなくて 1000^n や x^n ≒ 1000 のことであって欲しいわけだが。
解法を根本から見直したほうがよさそうだな
ちなみにうん千回関数を実行するって事ですよ。
nはいっても20、大抵は3、4、5ってところです。
実はスレ違いになってしまうんですが、あるクラスのメンバ関数なんです。
だから、汎用性のある関数にしなくちゃと思って・・・
実際ケースごとに関数足していくのもきついですし。
スレ違いですが、C++だともっといい方法があるのでしょうか?
>>72 の怪しいプログラムが上手く走ったら悦に浸れるところだったんですが。
こんなことを考えているようじゃ、まだまだ厨房ですね。
>>90 値の変わらない引数をメンバ変数に入れておくくらいはできるけど。
n が変数でなければ再帰テンプレートでどうこうできるかもしれんが、
inline にしてても inline 展開されるとは限らないので
面倒になったわりには大して変わらん気も。
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週目以降 何を入力しても前回選択したラベルにジャンプするというエラーですた 訳を教えれ
>>79 、
>>91 さん、他のかた、
ありがとうございます。
C++のテンプレートはまださわったことないんですが、やってみるかなぁ・・・。
一番簡単な例とか出してほしい。
>>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:に飛ぶ)
こんな感じです。
間違えた・・ aじゃなくて数値だった > 1 キーを入力 > 10 挿入完了 > d (適当に入力) キーを入力 (何故かcase 1:に飛ぶ)
めちゃくちゃ hogeはcharにしたいのかintにしたいのか 文字定数'1'を判定したいのか、数値1を判定したいのか その辺をはっきりさせて統一しないと
分かりますた。
>>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と勝手に変えてくれるんじゃないんですか?
やってくれません
>>102 pi+1/(2*n-1)*s
があったら演算子の優先順位から
1/(2*n-1)*sが先に計算されるだろ。
106 :
デフォルトの名無しさん :03/07/22 23:21
じゃあどういうときに昇格してくれるんですか?
pi=pi+1/(2.0*n-1)*s;
ありがとうございました。
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がプリントされるのは何故ですか
どうせ読み込ませなくても1がプリントされるとかいう落ちじゃないか
>>110 int hoge = 100 ; としてみれ。
>>110 sscanf() の戻り値を調べて出直してこい。
>>110 int hoge=0;
にして、実行してみたら?
みなさんのご指摘どおり初期値が1でした 変換が失敗すると、読み込まないのか・・
117 :
デフォルトの名無しさん :03/07/23 00:27
めちゃくちゃ簡単ですが、理解できない俺に教えて下さい。 scanfで文字列を取り込みそれは何だったかを表示するプログラムです。 配列とかがもう・・
>>117 めちゃくちゃ簡単なら自分でやれよ
出来ないなら簡単とかぬかすな
#include <stdio.h> int main(){ char a[]; scanf("%s",&a); printf("入力されたのは%c",a); } こんな感じでいいのかなぁとか思ったんですが。
OK
#include <stdio.h> int main(){ char a[10]; scanf("%s",&a); printf("入力されたのは%s",a); } これなら問題なく実行できるのですが、 入力される文字数を無制限にできないでしょうか?
無理
配列の要素数は最初に必ず指定しなければ ならないということですか?
scanf()を自分で定義して再構築汁
#include <stdio.h> int scanf( const char *format, ... ) { /* 文字数無制限に読み込めるような実装をここに書く */ } int main(){ 以下略 でできる
ケコーン(*´д`*)
C++ なら std::string str; std::getline(std::cin, str); だな。 ただし、VC6 ではバグってる罠。
>>125 標準ライブラリと同じ名前の関数を書くのって許されてたっけ?
できるよ
130 :
デフォルトの名無しさん :03/07/23 01:29
>>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;
}
標準ライブラリをインクルード and/or リンクしさえしなければ
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; }
ごめんちゃい。
>>132 気にしない、気にしない。というわけで、131->133と続いてるよ。
()の中を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);
vb出身か?
累乗ってなんだ。べき乗だろ
>>138 何故BASIC使いをVB使いと決め付ける?
N88やMSXかもしれんだろう?
同じ数を何個かかけて得られる積を,その数の累乗または べき(巾,冪)といい,かけた個数をその累乗の指数といいます。
>>141 累乗でもよかったんだ。
ショウガッコウカラヤリナオシテキマス
>>137 こんなに早くありがとうございました。
なんとかできそうです。
おいおい何でBASICと決め付ける mathematicaだったらどうする
146 :
デフォルトの名無しさん :03/07/23 13:48
関数のポインタ引数書く時 long func(char* pData); long func(char *pData); long func(char * pData); 空白の位置が違うのですが どれが良いのでしょうか?
これ long func(char*pData);
>>147 空白を使わない、理由も教えて欲しいです。(どうせ茶化してるだけと思われますが)
私は、
char* pData
だと、char*型の pDataオブジェクトっぽく見えて良い感じだと思うのですが
標準ヘッダなどは、char *pDataが目立ちます。
古いCの規格に準拠とか
何か理由があるのでしょうか?
>>148 *はcharにではなくpDataに付いているものだから
150 :
デフォルトの名無しさん :03/07/23 14:25
char 型の配列 a[10] があるとして、その配列に 1+2*3 を代入したら、 a[9] の値はNULLなんですか? それとも処理系に依存するんですか?
解読不能
>>150 "1+2*3"をa[10]に入れるってわけだろ?
a[0]='1';
〜
a[4]='3';
a[5]=NULL;
てなわけで、a[9]の値は変化しない。
>>152 すげぇ、そんな考え及びもしなかったぜ・・・
>>154 すまそ、Cから数年離れてるもので・・・
a[5]='\0';
なのかな
>>152 じゃあ、初期化してないとどうなるんですか?
むかし char str[BUFSIZ]を初期化しないで表示してみるスレ なんてのがあったな
>>156 static な変数なら 0 で初期化されるが、
自動変数の場合はどうなってるか分からない。
毎回違う値が入ってる可能性も大きい。
>>156 「変化しない」って言葉がわからない?
初期化してようがしてなかろうが今は関係ない。
>>148 >char* pData
>だと、char*型の pDataオブジェクトっぽく見えて良い感じだと思うのですが
確かにその通り。
でも、複数宣言する場合はそうはいかないよね。
char *pData, *pData2; の方が見栄えがいい。
まあ、typedef char* pchar; で型定義して
pchar pData, pData2; にすればいいんだけど。
これは個人の好みの問題だね。
>150はその程度のことをなぜ自分で試さないんだ? 数行で済む話だろ。
>>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 と一致する行だけ抜き出したいのですが上手くいきません。 どこを直したらよいか教えていただけませんか?
ちなみにこれがためしに書いてみたソースですが 実行しても一行も出力されませんでした。 #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); } } }
>165 ・fgetsで得た文字列がどうなってるか ・file2が終端に達した後どうなるか
同じ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; } } }
#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); } } } }
>>166 >・fgetsで得た文字列がどうなってるか
>・file2が終端に達した後どうなるか
え〜と、
fgetsで得た文字列には改行コードがある。
よって改行コードも文字列の判定に入ってきてしまうから、
改行コードをはずさないと意図した通りにならない、ってことでしょうか?
file2が終端に達すると...?
え〜と、file2のwhileが終わってfile1の次の行を読み込んだ後、
またfile2を読み始めると思うのですが。
うーん。まだよくわからないです。すみません。
while(FILE1が終端まで行ってるか?){ FILE1から読み込み while(FILE2が終端まで行ってるか?){ FILE2から読み込み } } FILE1から1つめのデータを読み込んで、FILE2上の全てのデータで含まれているかどうかチェックする (この時点でFILE2上にはデータが残っていない) FILE1から2つめのデータを読み込むと、FILE2には「もうデータが無い」と判断し誤動作する、というわけで。
rewindがポイント
厳密には、「誤動作」じゃないので。
>>171 がいってるとおり、rewind manpageで検索して見てくれ。
>>170 なるほど。
2つ目の while は一回終端まで行ったので
次のループでは既にストリームが終わってしまっているわけですね。
と、なると
>>167 で教示していただいたループも上手くいかなそうに見えるのですが...
strstrでのチェックの場合、改行を取り去っても
buf1が"1 10 5"
buf2が"1 1"
や
buf1が"2 21 1"
buf2が"1 1"
等で、問題が発生する
従って
>>168 のように数値でチェックした方が良いだろう
数値とは一言も書いてない
なるほどよくわかりました。 レスしてくれたみなさん、どうもありがとうございます。 とても勉強になりました。
はいはい。お疲れさまでした >> 175
やり方自体がショボ杉
179 :
デフォルトの名無しさん :03/07/23 23:30
夏房的しつもんですが、 sprintf()で渡したエリア以上に文字列を出力させた場合、 エリアを壊しますよね??
>>179 さぁ。直後がmallocで正当に確保された領域だったりメモリマップドファイルだったりすることも考えられる。
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
>>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 関数の引き数で複数宣言出来たか?
# 関数の引き数の場合と書いてあるが?
掘り出してすまんが、
>>150 は代入と初期化を混同していると思われ。
そもそも C だと文字列の代入なんて普通には出来ない。
初期化の指定なら a[9] は '\0' になる。
>>184 関数の引数と、そうで無い場合で使い分けるのはもっと気持ち悪いよ
文字列の初期化なんてどうせ動作環境決まっているから memset(str,0,sizeof(str)); ですましてる。
文字列の初期化なんて、str[0] = '\0';で充分。
>>183 doubleの上限までループしようと言う無茶な181なんだから
精度云々以前にintが使えない罠。
で、doubleの有効桁数は10進で20桁もないので途中で1足しても値が増えなくなる。
>>185 の言う初期化は、宣言時に初期値を指定することだと思われ
>>188 あ、そこまでループするのか。
pow の中身見てなかった。
なるほど。そのうち精度が悪くなって足しても d の値が変わらなくなるな。
>>188 ,191
doubleの上限じゃない。
1足して値が変わる上限。
>181 その値の場合においては問題ない
>>183-193 返事が遅れて、ごめんなさい。
何か、とても書き方が悪かったようで…
>>193 さんが、問題ないと言われてますが、念の為、もう1度、お願いします。
ようするに、知りたい事は、3つ程あるのですが、
「doubleの初期値を0.0にして、1.0ずつ足せば、仮数部も1ずつ増えるのか?」
と言う事と、
「仮数部を意図的に1ずつ増やした場合、
仮数部の限界がくるまで指数部の値が、かわる事はないのか?」
と言う事と、
「指数部に余裕がある時に、
仮数部の限界の値と、仮数部の限界に1を足した値を比較しても
(FLT_ROUNDS等に関係なく)正しい結果が得られるのか?」
と言う事の3つです
知ってる方は宜しく、お願いします。
doubleの表現形式って仕様で決まってたっけ?
IEEE754の浮動小数は仮数部が0.5<=x<1を満たすんじゃなかったかな? 指数部の値によっては上記の条件を満たさないかもしれないが
>>196 はい、仮の数です。
だから、単純に1.0を足しても仮数部の内部が1増えるとは限りません
が、
>>194 に書いた事は、1つ目と2つ目は、出来そうな気がするし、
計算精度的に、出来なければ、おかしい気もします。
また、3つ目は、出来ても、出来なくても、何となく納得出来るので、
仕様上、どのように決まってるのかなと思いまして…。
200ゲット C言語なら俺に聞け!
202 :
デフォルトの名無しさん :03/07/24 03:25
構造体とクラス(C++)の違いを教えてください
すまん
>>201 分かりませんでした…。(T_T)
最初の方に、指数部が同じなら
仮数部の値は保証されるような事が書いてありましたが、
それが、途中のIEEE754や、最後の方に書いてあった、
C99の仕様と、どのような関係があるのか、全然分かりませんでした…。
誰か、英語の出来る人、教えて下さいませ。m(_ _)m
時間が時間なので寝ますが、 それでも宜しければ、レスお願いします。
>>179 壊れます
>180の答えは無視してもいいです
210 :
デフォルトの名無しさん :03/07/24 15:48
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | 次でボケて!!! | |________| ∧∧ || ( ゚д゚) || / づΦ
よしこさんや。メシはまだかい?
あのー、CRC16/CRC32/MD5鍵のアルゴリズムを解説したページ ご存じでしたら教えてください。 出来れば、概要だけではなく、アルゴリズムと実装の両方が記載されてる ページをお願いいたします。
213 :
デフォルトの名無しさん :03/07/24 18:46
C言語のプログラムからシステム日付を設定する方法は あるのでしょうか? あるのなら教えていただきたい。 システム日付設定関数とかあるのかな???ネットで検索したが 見つからなかったので。
214 :
デフォルトの名無しさん :03/07/24 18:46
ごめん、日付の取得じゃなくて設定か。 それは、システムによって違うな。
プラットフォーム依存する話題はヤメレ!! まあ、どうしても設定したいのであれば、 system("date -s 2003-07-28"); という手もある(windows/linuxどっちでも動くかもね)
あ、ただしlinuxの場合、管理者権限が必要という罠が...
dateをrootにsui(ry
220 :
デフォルトの名無しさん :03/07/24 21:07
JPEGファイルをコピーする方法を教えてください。 ファイルをfopenでバイナリモードで開き fgetcで元のファイルを読み込んで、fputcでコピーして閉じたのですが テキストファイルはうまくコピーできたものの JPEGファイルはファイルだけが出来て中身がありません。 具体的にはどうすればいいんでしょうか?
書き込むんだから"wb"も必要か。
>int hoge ; fgets(buffer , sizeof(buffer) , stdin) ; sscanf(buffer , "%c" , &hoge) ; char hoge ; scanf("%c" , &hoge) ; scanf「だけは」使わないくせに scanfより悪いことを平気でする低脳
225 :
デフォルトの名無しさん :03/07/24 21:32
すいません、16bitの配列について質問させて下さい。 今、tiff画像の各ピクセルあたりの輝度を 取り出すプログラムを書いているのですがどうも値が間違ってるようなんです。 ちゃんと16bitの値を取り出して出力できているでしょうか? コードは次のようになっています。
#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言語で書くんですか? それとも、日本語で説明するんですか?
JISで標準形式が決まっている
result = * ((unsigned short int *)(buffer + x)); これは result = * ((unsigned short int *)(buffer) + x); でないの?
そもそも buffer が unsigned short int * だろう。 malloc の cast も無駄。
>>229 間違ってますでしょうか?
>>230 malloc() に void で確保させても結果に変化はないと思うのですが。
>>231 実際に、printfではどう表示されているの?
それと本来ならどう表示されるはずなの?
endianは大丈夫なのか。
つーか、ちゃんとタグの解析してるのかな?
>>232 実行結果は、
0 0 43
0 1 68
:
:
という感じで、一見すると正しい値が得られているようなんですが、
画像の輝度を全て得てからグラフツールでプロットすると
ただランダムな値が出力されているようにしか見えないんです。
>>234 endian がおかしいのでしょうか。
未熟で判断できません。すみません。
>>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; }
mallocのサイズが\0の分だけ足りない \0を移してない
>*(str1+i)=*(str+i); str1[i] = str[i]; で済むものを、なんでそんなにひねくる?
241 :
デフォルトの名無しさん :03/07/24 23:09
>239 レス有難うございます mallocの行をl+1に変えたけど上手くいきませんでした・・・
>>241 *(str1+strlen(str)+1) = '\0';
これ。
やはり、レスが無い…
>>194 の質問に答えられる方、
もしくは、
>>201 の先が書いてある事が分かる方は、
分かるように説明して下さい。お願いします。m(_ _)m
>>209 知りたいのは、自分の環境での動作ではなくて、
規格上での動作だからです
解決しました、有難うございます! main関数で文字列を入力する前に str=(char *)malloc(BUFSIZ*sizeof(char)); とすると上手くいきいました。 あと、それに加えて>293さんの処理も必要だったみたいです。 >240 私はポインタと配列の違いが良く分かってないDQNなんです
>>244 漏れも高卒だから別にいいんだけどよ、
ポインタと配列は違うってとこはコンドーさんつけないほうが気持ちいいぞ。
忘れるな。
俺は逆に、ポインタが配列見たく使えるのがよく分かってない
>>246 こう言うのか?
(A+1)->B == A[1].B ;
>>246 p[i] は *(p + i) のシンタックスシュガー。
両方等価。
>>248 これか?
p[n][m] == m[n[p]] ;
>243 ・仮数部は整数値ではない為、1を加算しても仮数部は1ずつ増えない ・仮数部は正規化された小数値なので、指数部は絶対値によって変化する ・overflow等が発生しない限り、指数に応じたEPSILONの加算では計算誤差は発生しない と2chで回答されて、それを信じるのか(w
>>247 そーそー
>>248 ヘー
ポインタの理解は値を代入するところまでで止まってまつ
どうもありがとうです
>>250 レスありがとうございます。m(_ _)m
>仮数部は整数値ではない為、1を加算しても仮数部は1ずつ増えない
はい、最初は、自分も、そう思ったのですが、
良く考えると、基数が幾つであれ、整数を加算した場合は、指数部が0(基数^0)になり、
仮数部も、その整数と同じになるのではないかと思い質問しました
でも、規格上は、1ずつ増えるとは限らないと言う事なのですね。
>・仮数部は正規化された小数値なので、指数部は絶対値によって変化する
なるほど、絶対値で変わる事のですね
>・overflow等が発生しない限り、指数に応じたEPSILONの加算では計算誤差は発生しない
絶対値で指数部が変化すると言う事は、3つ目は大丈夫と言う事ですね
>と2chで回答されて、それを信じるのか(w
うむ…そう言われると…。
>>252 「浮動小数点 正規化」辺りで検索しなはれ
>>250 ==253?
ありがとうございます。
後は、その辺と、その辺りを中心に、
Cの規格が含まれる記述等を調べてみます。m(_ _)m
>>249 p はポインタ(アドレス+型)で、
i は整数、ということで。
256 :
デフォルトの名無しさん :03/07/25 11:57
> > ans と &ans[0] が等価だ。 > > 配列と、配列の先頭要素へのポインタが等価なのは、 > 引数として渡された場合に限る。ねんのため。 引数として渡されてなくても、普通に等価のような気がするけどなぁ?
>>198 198 の 181 の人は、仮数部、指数部の意味がわかってないと思いますよ。
数論的な捕らえ方をしている様ですが、そうではなくって、たとえばIEEE
なりの正規化処理が行われた well defined な「仮数部」「指数部」を仮定
して話さないと話が通じなかったり遠回りになったりします。
>>255 即ち、*(i + p)とi[p]は等価ということやね。
>>249 なので、
3["abcd"]とか1[strchr("abcd", 'c')]もできるわけだよ。
#両方とも結果は'd'に等しい。
>>257 ans の型は char [2] で、
&ans[0] の型は char* だ。
だから、sizeof ans は 2 で、
sizeof (&ans[0]) は sizeof (char*) だ。
あ、なるほどねー
262 :
デフォルトの名無しさん :03/07/25 14:40
int a[5]; int (*p)[5]=&a;
>>262 嘘。
&ans は配列ポインタを与える。
基本的なことで質問 条件式で (a == 5 || a == 8)と書けば aが5か8である場合ってことですが (a != 5 || a != 8)と書くと 日本語として、どういう場合と表現されますか?
aが5でないか8でない場合
常に
int a; if(a!=5||a!=8); else printf("コンパイラのバグか?\n");
結局 (a != 5 && a != 8) だと、aが5と8でない場合で (a != 5 || a != 8) だとaが何であっても常に真ということですか?
ああ分かりました! aが5でない ・・・234x6789・・・ aが8でない ・・・234567x9・・・ てことだから、「常に」ってことになるわけか
273 :
デフォルトの名無しさん :03/07/25 18:54
floatって必要?
>>273 あったほうがよい。大量の浮動小数点を処理する場合でさほど精度が必要ないとき。
とはいえメモリは安くなってきてるし、処理速度考えたらFPUネイティブ(な場合が多い)の
doubleで処理するほうがいいかも。存在意義はなくなりつつあるね。
>>275 さっきそこちらっと見てた
参考になりまつ
>>274 にゃんでや? メモリ容量2倍になるのにどんくらい松よ
float は普通は必要ないけど、 3D 関係のライブラリは float を引数にとるものが多いので、 そういう場合は必要になる。 でも、そういう時以外はやっぱり必要ない。 大量に扱う場合って演算回数も多くなる傾向があって、 それらの演算で出てくる数値誤差も大きくなるから、 結局精度がいる場合が多いんじゃないかと。 よっぽどメモリをギチギチに使わないといけなかった時代ならともかく、 今は float の価値は低いよ。
XFORM?
floatは倍精度以上の浮動小数点演算ハードウェアが使えない環境ではまだ意味があると思われ。
少なくとも、特殊な場合にしか使わないということには変わりはないね。
うに
283 :
デフォルトの名無しさん :03/07/26 05:04
VC++6.0は整数除算の最適化が苦手?
286 :
デフォルトの名無しさん :03/07/26 08:53
>>284 >※「最適化あり」の比較は、 最適化によって無駄なループがまとめられてしまっている
>可能性があります。 そのため、純粋な比較にはならないかもしれません。
こいつアセンブラ読めねーアフォだなw
最適化という言葉が出るたびにそこで思考停止する香具師の 頭ん中がせいぜいその程度ということをよく現している秀逸な標本だな。
292 :
デフォルトの名無しさん :03/07/26 10:40
restrict 修飾子についてわかりやすい解説をしている日本語のサイトってありませんか?
> restrict はつみみです。
ヘ_ヘ ---------------------------- ミ・・ ミ ねこみみです ( )〜
WindowsXPを使ってCを勉強しているのですが、コンパイラはネットで ダウンロードした無料C++Builderで、MS-DOSで動作しています。 普通はどうやってプログラムを動作させるのですか?なんかのソフトかなんか?
しぇるからよぶ
C99なのか・・・ 俺もCのトリビアであるC99を勉強するか。
int i; restrict int *p1=&i; int *p2=&i; こういうことができないってことか。
板違いかもしれないけどこれどう解けばいい?↓ 二つの整数変数x,yを宣言して,以下の3つの代入操作を連続して行なう. x := x-y; y := x+y; x := y-x; この操作の結果,xとyの値はどうなるのか,考察せよ. 具体的にプログラムを作成して,適当な値を入れて実行してみる 手でいろいろな値を入れて紙の上で計算してみる のどちらの方法でもよい. この一連の操作は,何を目的としているのか,答えよ.
x=3 y=2 x := 3-2 = 1 y := 1+2 = 3 x := 3-2 = 2 入れ替え。
x := 3-1 = 2 最後の訂正。
304 :
無料動画直リン :03/07/26 11:38
x' := x-y; y' := x'+y := (x-y) + y = x x'' := y'-x' = x - (x - y) = y …つーか、 > ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
307 :
デフォルトの名無しさん :03/07/26 11:46
レスありがとうございました
>>302 ,303,306,307
たしかにおっしゃるとおりです、書き込んだ直後にやってしまったと思いました
>>306
>>296 >>298 ありがd。一応理解できたような気がします。
(多分実際に理解するのはある程度使ってからだと思うけど)
すみません、わからないことがあるので教えてください。 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(の中身)を代入。
*textのアドレスでもOK(ひねくれているが)
>>311 ,312
レスありがとうございます。
では、word->next = text = word;ということですか?
wordとwordのなかのnextが同じというのも少し変な気がするのですが。
>>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); バイナリモードで開いてコピーしたのですが うまく中身がコピーされていないようです。 どうすればうまくいくでしょうか?
>>315 そのコードをコンパイルしてから出直してくださいませ。
fgetsの使い方がおかしいが、書式なしはfread,fwriteを使うものだ
>>317 fread,fwriteはどういうふうに使えばいいんですか?
引数が足りないとエラーが出たのですが
319 :
無料動画直リン :03/07/26 22:38
>>318 自分で調べる気がないなら putc/getc でも使っとけ。
>>319 うむ、やっぱりそう説明するのがわかりやすいか。fprintfについても説明があっていいサイトだな。
_ .曰 ,.'´ ィ 、 ヽ .| | │ノノリ )) 〉 ノ__丶 ,{{i(!l´∀`ノ!i ヘェー ||幹|| | | lj|ヽ、ノ! リ ||古|| |i!/ ! ノ 〉つ)) ||雲|| |!\) l | ̄| ヘェーヘェー
(´∀`)ハハハ
325 :
デフォルトの名無しさん :03/07/27 04:38
MS-DOS上で、プログラムの動作を確認してるんですが、 例えば、入力したものに応じて結果を出すプログラムの場合、 どうやってその結果を表示させるのかわかりません。 たま〜に「Ctrl+C」で出てくるけど、一回出てきたらそれで終わり。 他のものはエンターキーだけでいけるのだが。
ちょっと分かりにくいから例を挙げますと、例えば、 「入力した単語の数を数えるプログラム」とかだったら、 MS-DOSのコマンドに単語を適当に打つじゃないですか。 それから、Enterを押しても、改行されるだけで、プログラムの結果 の「単語の数」が出てこないんですよ。 それをたま〜に「Ctrl+C」で成功できるんだが、ほとんどのばあい、 「^C」が出てくるだけ。いってることわかるよね?
だれか、便利な方法とか、コマンドを知ってたら教えてください。
EXIT
言ってること分かんない。
>>326 およそ推測で答えるが、改行が来たら集計結果を表示するように作ってないのでは?
そのプログラムのソース晒してみて。
>>326 とりあえずWindows98やWindowsMeを使うのはやめる。
>>331 ^Cを押して強制終了すると以降のものが表示されない環境があるんだよ。
違う。^ZでEOFだ・・・
>>333 ^C じゃなくて改行で出て欲しいんじゃないの?
しかも、たまに ^C で出てくるって言ってるし。
>>326 強制終了したら表示されなくて当然でしょう(笑)
SIGINTキャッチしているのならまだしも。
その環境ならCtrl+Zだよ。
>>326 setvbuf(stdout,NULL,_IONBF,0);を追加してみてもだめ?
337以外は俺の勘違いなので無視してください。
フラッシュされてない悪寒。
340 :
デフォルトの名無しさん :03/07/27 05:50
C言語以前の問題なのですが、 色々調べてみたのですが、 どうしても原因がまったく分からないので、 よろしかったら教えていただけないでしょうか。 C言語の本(「C言語で学ぶプログラミング基礎の基礎」)を買ってきて、 付属のCDでコンパイラをインストールしようとしたのですが、 「C:WINDOWS\SYSTEM32\CONFIG.NT.システムファイルは MS-DOSおよびMICROSOFT WINDOWSアプリケーションを実行するのに 適していません」 とでて、インストールをさせてもらえません。 これの原因はどこにあるのでしょうか。 OSはXPで、特にいじった覚えもありません。 よろしくお願いします。
>>340 何のコンパイラを入れようとしたわけで?
342 :
デフォルトの名無しさん :03/07/27 06:17
>>341 おはようございます。
LSI C-86 Ver 3.30試食版です。
C言語だけは俺に聞くな!
Part 62.1.3
(´∀`) ハハハ・・
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上で表示させることで、解決できました。
乱数取得する関数を作って、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で最初に一度だけ呼ぶ。
>>351 早速試してみたところ成功でした。超即レスありがとうございました。
実行結果
15
7
88
108
9
84
1
123
126
84
36
105
>>351 なぁ、でもseedが変われば出てくる値も変わるだろ?
time指定してんのになんで?
[time()関数とは] time()関数はUNIX由来の関数で、世界標準時の1970年1月1日0時0分0秒から現在の時刻までの 経過秒数を返す関数です。例えば、日本時間の2001年1月1日 0時0分0秒は、978274800となります。
すごろくでいうと毎回振り出しに戻るを実行してから(ry
>>354 ああ、一秒以内にループが実行されたのか。納得。
>>325 Ctrl+Zを2回とか
Ctrl+Zの後でEnterとか
そっち系か?
359 :
デフォルトの名無しさん :03/07/27 14:54
mallocで正常にメモリ確保を行って、その結果を先頭として配列と同じ ように使っていく(アドレスを++して行く方法)をつかって、どんどん先ま で使っていくと、パソコンが落ちてしまいます。なぜでしょうか?そういう 物なんでしょうか?(メモリ確保が少ないと問題なく動きます)
そういうもんでしょ。 mallocで確保した領域以外に踏み込んじゃいけません。
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ぐらいで落ちるんですけど
パソコンとOSによる
スタック増やすかstatic付けれ
>>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; }
371 :
デフォルトの名無しさん :03/07/28 00:26
void switch(int* c,int* d){ int temp; temp=*c; *c=*d; *d=*c; }
switch を 100 万回くらい見なおせ。 ついでに関数名を swap になおせ。
ではまた来週。
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
378 :
デフォルトの名無しさん :03/07/28 00:44
>>376 あのさぁ、ポインタ以前にtempにいれた値を使っていないことに気づかないの?
379 :
デフォルトの名無しさん :03/07/28 00:49
>>378 様
うっかりしておりました。これは修正いたしました。
で、そろそろ誰か答えを!
>>378 気付いてないから放置してあるんですよ。アホか。
void swap(int* c,int* d){ int* temp; temp=*c; *c=*d; *d=temp; } これをループでまわせ。
>>379 とりあえずコンパイルが通るようにしましょうね。
383 :
デフォルトの名無しさん :03/07/28 00:52
384 :
デフォルトの名無しさん :03/07/28 00:55
for分の,は;に直しました。
正解を教えてくれたら 中谷美紀丸秘エロ画像をアップします。
memcpy
こういういい加減なやつはまじキエロ
388 :
デフォルトの名無しさん :03/07/28 01:04
>>387 市ね!
お、369の書き込みから1時間以上経ったか。 じゃあ答えを教えてやる。 「switch は予約語」
for もポインタもやってて switch を知らないというのは、 どういう順番で勉強してるのやら興味があるな。
しかもfor{(,,)だしな
一瞬switchの使い方も解らんのかって思った
言うとおりに直してもa[0]、b[0]だけしか交換行なわれななくない?
スマンよく見てなかったm(_ _)m
3次元には興味はない。
397 :
デフォルトの名無しさん :03/07/28 02:27
いやー、 みなさんなんで優秀なのに2chなんかやってんですか?
401 :
デフォルトの名無しさん :03/07/28 04:41
#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"); } }
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; }
>>403 randを使う前にsrandで初期化。
randとMath.randomでは値域が違う
406 :
デフォルトの名無しさん :03/07/28 14:28
char*型の文字列をバイナリ形式で保存すると4Byteで 何文字も保存できるんですけど、これって、4Byteで最大 何文字保存できるんですか?
失礼ながら大爆笑
408 :
デフォルトの名無しさん :03/07/28 14:34
ぇぇっ! 大爆笑ってなんで?
>>406 char *sを保存しても無意味だぞ。
char (s[0],s[1],s[2],…)を保存したいんだろう?
>>406 >char*型の文字列
文字列は char*型 ではなく、
文字(char型)データが連なったものだが?
{ 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内のメモリが初期化されてないからですか?
>>413 プログラムを分離して別に実行したらどうなる
今、再起動してAを実行せず、Bを実行したんですが、正常に読めました。 これはどういうことでしょう? ついでに、別にプログラム作ったら、ファイル名が表示されました。 なんで?
気のせいです。
>>413 > char *A;
> FileWrite(hfile,&A.str,sizeof(char*));
なんだこれわ。
FileCreate 系の関数ってMSDNにないわな? その関数の仕様見たいかも
ごめん、FileWrite(hfile,&A,sizeof(A));でした。 ちなみに、スレ違いであることに気がつきました。 FileWriteはC++Builderの関数です。Delphi6にあるのと同じです。
FileWrite(hfile, A, strlen(A)); ってか、ポインタってのが何なのか勉強しる。
住所でしょ?
マウスポインタ=ねずみの住所=デズニーランド
こんな所でポインタ定義論始めんなアフォ
技術評論社 新ANSI C言語辞典 著:平林雅英より ◆ポインタ ( pointer,指標,指針 ) 被参照型の実体を間接参照可能なオブジェクト。 オブジェクト(のアドレス)を指すオブジェクトであり… ポインタのポインタとは、オブジェクト(のアドレス)を指すポインタ(のア ドレス)を指すオブジェクトのことである。 ポインタは一種のアドレスであるが、… 住所じゃないの?
演説です
>>426 じゃあ、友達や知人の住所や連絡先を書き記しておくものは、
ポイント帳とでも呼んでいるのですか?
>>426 住所を格納する「変数」
て意味合いで取る場合もあるし、アドレスを指す言葉でもある。
「さんきゅう」と発音すると、「thank you」「産休」「三級」いろんな言葉の意味があるが
前後のやり取りにより、一発で意味わかるやろ?
例えが変でスマソ
まあふつうは「さんきゅう」といったら地下鉄なわけだが。
「さんきゅう」≠「thank you」
>>426 配列の添え字も一種のポインタなのだが、
それもアドレスだと言うのですか?
「さんきゅう」=「sank you」(あなたを沈めた)
内容の存在するメモリへの アドレスのエイリアスじゃないのか。
>>434 じゃあ、マウスポインタはメモリ上のどのアドレスのエイリアスなんですか?
レーザーポインタはどうするんだよ
矢印
ポイントするのにアドレスを使ってんだぼけ マウスポインターはマウス用のポイントするもの(er)だ 変な説明だ。。。もうやめましょうYO!
それは最近のOSならOSが管理してるんじゃないの?
ポインは〜赤ちゃんが吸うためにあるんやで〜
(テキストに保存でコピペしたら長すぎたので、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 );/* 二つの構造体を様々に比較しようとしてる関数 */
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
そうですか。
どうってことは無いケアレスミスですが、APPの構造体で 「int freeFlg」の宣言は意味がありません。すいませんでしたm(__)m
どうでもいいけど、_1とか_2なんて名前はやめようよ。
>>447 はい。p1とp2でいいですね。すいません。
>>443 無限ループになりそうだけど、/*様々な処理*/ってところにreturnがあるの?
450 :
デフォルトの名無しさん :03/07/28 17:59
はい。そのように考えていただいて結構です。 whileの中をグルグル周り、ESCを押され等、ユーザーがイベント操作することで whileを抜けるようになっています。
大変すいません。449さんの欲しい答えではない&ソースミスでした。 for文中ではなく、 /* 様々な処理 */ は、for文を抜け、while文の中に実装しております。 真に申し訳ないm(__)m
初心者はデバガなんか使わないで printf デバグしてみれ。
>>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]は範囲外。
しないし。
>>442-444 ここには書かれてないところで i か pApp かが
書き換えられてる予感がする。
明示的に書き換えられてると分かりやすいけど、
別の何かの配列の書き換えで
添字が変になってる場合だったりすると厄介だな。
あと、今回の話とは関係ないと思うけど、
グローバル変数使う前には
本当にそれがグローバル変数であるべきか
100 回考えるべし。
>>454 ループ条件を 100 回見直すべし。
>>454 ループ条件が分かりにくかったですね。すいませんでした。
>>456 >ここには書かれていないどこかで・・・
>・・・厄介だな
その可能性があると思い、関係あるソースを洗っていきましたが、見つかりませんでした。
探し方が足りない&開発者による盲点 の症状が出てるかもしれませんがσ(^_^;)
Ps.
グローバルについては四苦八苦している最中ですので、これから精進いたします。
補足します。
>>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
>>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の場合 常に同じ値になってしまいファイルサイズが取得出来ません。
>>GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目) でしたね^^; ごめんなさい。
ありがとうございます〜 そこで質問してきますね。
大変申し訳ありません。初めに、 >まずはソースをご覧ください。お手元でコンパイルできるように大幅な編集をしております。 と書きましたが、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関数は
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・・・( ´ ・ ω ・ ` )
>>468 Pyon(&App[i], &App[i + 1])
にしてもだめなの?
470 :
名無し@沢村 :03/07/28 21:13
>>469 さんの用に扱うことはできません(´・ω・`)
ポインタを必ず扱うようにしなくちゃならない関数になってるんでσ(^_^;)
ポインタを渡さない場合、添え字にする i 変数を
色々変化させないと好きなAPPを指すことができないんですよ(´・ω・`)
>>471 & が見えない?
pApp = App + i;
Pyon(pApp, pApp + 1)
と
Pyon(&App[i], &App[i + 1])
は、上のだと pApp が変更される恐れがあることを除いて
等価なコードだぞ(C++ だとまた話は違うが)。
>>468 実際にそのバグが出るソースを見ないことには
「どっかで値を壊してるんじゃないの?」としか言えない。
まあソース出されてもたぶん読まないけど…
とりあえず Pyon の引数の型を PAPP から const App* に変えてみてはどうだろう。 比較関数なら内容を変えることはないでしょ?
>>472 さん。
うんうん。それは分かってるんだけど
Pyonに渡すのは、&App[i]とか、「i」で渡すと不便なんです。
実際は、pApp = App + i; したあとに、多くの処理をして
pAppが保持しているアドレスを#defineで書かれた定数を使い、
変化させてるんです。ちなみに定数はMAX未満です。
>>473 ソースコード全部で67kbytesありました。ちょい多いっすねσ(^_^;)
## 結構大きめなソフトなんで、こちらも説明しずらい部分がありました。
で、問題点となるものを新しく簡潔にしましたので、そちらをお願いしますm(__)m
442の出した質問は無かったことに(´・ω・`)
>>474 うん。比較関数なので、その形でいいです。
ですが、エラーになったとき、Pyon関数へ引数として渡される前に、
pAppにはg_Count を指すアドレスが入ってるので、Pyon関数自体は意味がなかったり^^;
で、
>>467 のソースでも同様の問題は起きているの?
>>475 やっぱり pApp 変えとったんかい!
その pApp を変化させるところで
App[MAX - 1] より大きいところを指すようになってるとしか
考えられない。
pApp は App にある数足してるんだから
定数が MAX 未満でも、pApp[MAX - 1] を越えてしまうこともあるやろ。
>>477 いえ。あくまでも模型なだけで、このソースでそういったエラーはおきていませんσ(^_^;)アセアセ...
>>478 うんうん。確かに俺もそう考えました。エラーが起きた当初はね。
でも、VCでのデバックモードで、
pApp = App + i;
この時点で、pAppに保持されている値は、App関連のアドレスではなくて(0x0012ff1c等)
「g_Count」って名前と、そのアドレスが入っていたんですよ。
それも478さんのでありえる話なのかな?・゚・(つД`)・゚・
元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]の場所になる可能性はありますか?ここが非常に知りたいんです・゚・(つД`)・゚・
説明が分からないって方いません?σ(^_^;)アセアセ...
ミ ミ ( ,,,,,, ∧,,∧ ∧,,∧ η ミ,,゚Д゚彡 ミ __ ミ,,゚Д゚彡 (/(/ ミ /) て" ミ ミ つつ 彡 ミ `つ ⊂ ミ ミつつ 彡 ⊂ つ 彡" ミ 彡"。γ。ミ ∧,,∧ ∨"∨ 彡 ∨"∨ 彡 ∧,,∧ / ̄ ̄ ̄ ̄ ̄ ( ,,,,,ミ,,゚Д゚彡 ミ,,゚Д゚彡 < 百済参上! ⊂,,,,,,,,,,,,,,,つつ ミ ,つ \_____ 彡 〜ミ ,ミつ スタッ ! ピョン! (/
>>480 > 101個分連続した空き箱を作るんですよね?
100個分だぞ。
>>479 pApp = App + i;
の時点で pApp に保持されてる値が
g_Count のアドレスで、
かつ、i の値は MAX より小さい、
ということで?
もう一度確認してもそうなる?
ウォッチで
App[i], i, App, pApp, g_Count の 5 つを見て、
値に矛盾が出る?
>>482 0も含めると100個分だよね?リアル個数だと101個だと思うんだけど、俺はここから間違ってるか?(つД`)
>>479 今確認できないんです。すごく調子よくてエラー起きてないんでσ(^_^;)
前述しているように、g_Countを宣言する箇所が変化すると、エラーが起きなくなったりしてるんです。
そのせいで、どんどんコーディングしてるうちに、エラーが消滅しました。
今はMAXを4323111123ぐらいでしたっけ?保持できる場所を越えて@@@@APP _CODECなんたらかんたら
ってエラーが出るぐらいMAXを増やしても、大丈夫になったんですが、
なんでだろーって詳しくわからないんです。
で、ついさっき久々に出て、またエラーなくなりましたσ(^_^;)
>>485 char Str[100]ならStr[0]からStr[99]まで確保されるはずだけど・・・
×まで確保 ○までの100個分が確保
>百済 あれ。。。そうなんだ 。。。って、試したらそうやったー。何考えてるんやろ俺・゚・(つД`)・゚・
490 :
デフォルトの名無しさん :03/07/28 23:03
printfで " を表示させたいのですがエラーがでます 解決方法はありますか? 例 printf(" "CENTER" ");
printf(" "CENTER" "); ↓ printf(" \\\b\"\\\b\\\\\b\\\b\bCENTER\\\b\"\\\b\\\\\b\\\b\b \b");
>>490 \"使って
こう書けば(・∀・)イイ!!
printf(" \"CENTER\" ");
そう言えばこの間、仕事で別会社のヤシが、
>>490 と同じ事オレに聞いてきたな…。
プロのクセにそんな初歩的なこともわからないのか?
と小一時間問い詰めてやりたかったが仕事の関係上やめておいた…。
遅くなりましたが返信ありがとうございまいした。 初期化をすると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
#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]++; }
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); }
っておもいっきり誤読してた
>>497 %d で double 型を表示させようとしてるから
ヒストグラムがうまくでないのが問題なのですが、どこがおかしいのでしょうか?
502 :
デフォルトの名無しさん :03/07/29 01:17
>>501 randは0〜RAND_MAXまで。
Math.randomは0〜1まで。
乱数の範囲が違う。
sqrtの中に-2があるので、虚数がでないように0〜1の範囲にする。
log(0)は-∞となるので、特別な処理が必要。
どうも具体的にどうプログラムを書けばいいかわからないのですが・・ 教えてもらえないでしょうか?
506 :
アナ・コッポラ :03/07/29 02:38
できたー みなさんどうもありがとう
>>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」
↑のようにいろいろあるわけだけど、一番上のヤツをダウンロードして
間違いないよな?だれかこれらの違いを説明してくれ。
クソして寝ろ
だれか質問に答えてくれ。 答えないなら答えるまでage続けます。
511 :
デフォルトの名無しさん :03/07/29 04:14
まだか、ゴルぁ!
512 :
デフォルトの名無しさん :03/07/29 04:29
またか、ゴルぁ!
513 :
デフォルトの名無しさん :03/07/29 04:32
またか、ゴルぁ!
>508 どうせなら CodeWarrior for PalmOS がいいんじゃないか?(’’
初心者です。 今学習のために、完全数を探すプログラムを作ろうとしてます。 任意の数字までループさせ、そのそれぞれの数字の約数を表示させることには成功したのですが、 その約数を配列に代入する方法がわかりません。 約数の数はいくつあるかわからないので、いくつ配列を用意したらいいか等が 理解できません。 どなたか教えていただけないでしょうか? 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億位まで扱えるらしいので、それまでループさせ、 約数を表示させるまではできたんですが・・・。 どなたかよろしくお願いします。
>>517 配列を用意する必要は無い。
変数を用意して約数を見付けるごとに加算すればよい.
>>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;
}
こんな感じで。行数収めるのにちょっとヘンな表記してるけど。
むむバグが。コンパイルもとおらねえなw まあいいや。その辺は練習問題w intをためるならこんな感じでmalloc系を使ってやれってこと。
>>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 わざわざそんなに書いてもらってありがとうございます。
しかし、私にはまだ理解できませんので、少しずつ理解できるように読んで行きます。
できたら、簡単な流れを教えていただけるとありがたいです。
よろしくお願いします。
>>521 PN = 0;の場所が違う
n<=(1/2)が違う
これ、終了するまでどれくらい時間がかかるんだろう。
1/2じゃないi/2だった n<=(i/2)が違う
とりあえず改良してここまでやってみました。 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 ありがとうございました。
しっかり動くようになりました。
ためしに動かしてみたんですけど、8128まではすぐ表示されたんですが
次の完全数は何分たっても表示されません(笑
達人はこんなのよりもっともっと高速なプログラムを組むんだろうなぁ・・・
>>527 高速な判定法が知りたかったら「メルセンヌ素数」あたりで
検索して見るとよいかと。
ageてしまった。 吊ってくる
>>529 他の人がageにくくなるからそういう書き込みはやめよう。
>>528 あ、知ってます。
(2^p)-1が素数になる場合、{(2^p)-1}{2(p-1)}が完全数になるやつですよね?
メルセンヌ数を探す方法で完全数を探すのと今見たいに探すのどっちが速いだろう・・・
532 :
デフォルトの名無しさん :03/07/29 20:30
C++ では アンダースコアで始まり次に大文字が続く識別子と、 アンダースコアを2つ連続で含む識別子は、 処理系や標準ライブラリのために予約されていて、 また、グローバル名前空間に属す識別子は アンダースコアで始まる識別子全般も予約されている んだけど、C ではどうなってるんですか? 教えて規格博士!
>>521 構造体uintarrayには、unsigned intを溜めておく領域へのポインタ(data)と、
確保した領域の大きさ(allocated)と配列の末尾(end)が含まれている。
実際のデータとその領域を管理するための情報があるといってよい。
ianewは、uintarrayの確保をして初期化して返す。
配列領域は確保してない。
iaappendは配列(data)の末尾に整数を一個付け加えるけど、
配列の領域が足りなかったら領域を確保しなおしてる(realloc)。
確保すべき領域のサイズの指定にバグあり。
他にも、確保したuintarrayを開放する関数やら、
uintarrayから値を取り出す関数やらが必要になるだろうね。
その辺全部関数に閉じ込めちゃえば作るのが楽よ。
ってこと。特に難しいことは何もやってないはず(でもバグ入れちゃった)。
534 :
デフォルトの名無しさん :03/07/29 20:34
>>532 > アンダースコアで始まり次に大文字が続く識別子と、
> アンダースコアを2つ連続で含む識別子は、
> 処理系や標準ライブラリのために予約されていて、
これはおなじ
>>532 規格博士じゃないけど、きいたところによるとアンダースコア二つで
始まる識別子は処理系のために予約されてるんだと思った。
>>534 つまり、アンダースコア全般で始まる識別子までは予約されてない、ってことですね。
ありがとうございました。
538 :
デフォルトの名無しさん :03/07/29 20:38
__FILE__
>>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種類のやりか方で作ったときに、 それぞれの計算量、メモリの使用量はどうちがうのですか? エラトステネスの篩いを使うと カウント変数ない分、配列のほうが変数の数は少なくなる。 繰り返し処理が多いと計算量が増えるので、 配列使ったほうがすっきりする場合多いからその分計算量減る。 線形リストではよりメモリの使用量は多くなる。 このくらいが思いつくのですがあってますか? また、他にどういう違いがありますか
そんなのは数学的に計算できることだろ 自分のしていることを把握していない真性アフォは プログラムを作るな 社会悪だ
s/把握していない/把握する気のない/
フリーのコンパイラでDLLを作るにはどうしたら良いのですか
オプションのヘルプを探す。
>>547 ( д ) ゚ ゚
ハヤー
世の中は広いなぁ。
漏れが作ったやつじゃ40分ほど計算させても5番目は出ませんでした。
いやいや、スゲー。
俺もそんなプログラムが組める様になりたいなぁ。
いや、ほんとに凄杉。
うん。凄い。
549 :
デフォルトの名無しさん :03/07/30 00:14
文字列検索のプログラムを作っているんですが 2バイト文字の検索はどうやったらできますか? ASCUコードからシフトJISコードへの変換とか。 漢字やひらがなも検索できるようにしたいんですけど。 どうしたらいいんでしょうか? よろしくおながいします。
ASCU
天然?
ASCII
>>551 おそらくASCIIの半角英数からSJISの全角英数に変換したいんだろう。
perl使え。
>>554 jcodeなけりゃ何も出来ないんですか?
ある物は使えばいい、再発明する必要は無い しかしここはC言語スレなんでperl使えはスレ違い
>>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 系関数)があるので、
それを使ってみてはどうだろう。
それでも凝った検索アルゴリズム使う場合には
どこまで使えるか分かんないけどね。
今ごろ思いつきました。これでいけそうです。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; } }
>>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]を使った処理 */
}
}
で良いと思われるが?
>>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 ではないんで。
配列のパラメータのとりうる組み合わせを全て評価関数で評価して、 最も良いものを探すって感じのプログラムなんです。 だからこの場合は 1024通りの中から選ぶって感じにならないといけないわけです。 561がなんかえらそうですんません。
>>561 って言うか、何をしたいのか書いてみろ。
他の解決方法がありそうだが?
>>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 オプションだけではダメなのですか?
保障されている。
ついでに言えばこっちの方が比較回数が減って良好。
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 でしかない。
あ、switch(n - 1) やね。
って、コメントを信じるなら n には既に -1 されたのを渡すのか。
何が起こってるか分かりやすく書いたバージョン。 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 ループね。
0 or 1 しかないんならループは一つにしちゃってビットマスク使えない?
>>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しています。
>>572 scntrl, strol, strcm ... か。
iscntrl, strtol, strcmp の typo(タイプミス)では?
574 :
デフォルトの名無しさん :03/07/31 03:19
572です。 そうでした。ありがとうございます。
C++ ならコンパイルの時点でエラーが来るんだけどねぇ。 まぁ、C でも gcc を C99 モード(-std=c99)で使えば警告出してくれるけど。
Windows2000 VC++を使用しているんですが ウインドウ ハンドルだけ分かってる状態で、そのウインドウがアクティブかどうか 確認する方法はありますでしょうか? どうか教えてください
>>577 そんなぁ〜 (ToT
Windowsって言ってもC言語ですし
検索しても見つけられませんでしたし
お願いしますよ〜
>>579 わぉ〜 (^O^)
すみません、windowsはすれ違いでしたね
それはそうと、教えてくださってありがとうございます
リンク先の一番上にあった、GetActiveWindowでHANDLEと
比較すれば分かりそうです
ありがとう〜 (^o^)/^^^^
>>578 どのあたりがC言語の質問なのか50字以内で答えよ
>>581 ANSI C 準拠ではないけど
定義方法、書き方、コンパイラ、などは、どう考えても、C言語だと思う
C++じゃないかと言われると、確かに使ってるところもあるからC++かなって思う
(MFCは完全にC++だけど…)
Win32APIがC言語で作られたから、C言語だとは思わないけど
(C言語で他の言語も作れるから…)
でも、今のWin32APIはC言語の拡張関数、ライブラリだと思います
だからC言語です
C言語が書けなかったり、書き方やコンパイラが変わった時
それはC言語ではなくなると思います
VBからも使える
>>582 >今のWin32APIはC言語の拡張関数、ライブラリだと思います
激しく違います。
激しく電波飛ばしてるな
>>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]を使った処理 */
}
こういうことか?
電波キタ------------------------ ( ゜γ ゜) ----------------------------
まず、もちついて
>>1 のこれを嫁。
>GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
> でも、今のWin32APIはC言語の拡張関数、ライブラリだと思います
> だからC言語です
「○○だと思います(自分勝手な解釈)。だから××です(断定形)」という時点でご愁傷。それ以前に50字超えてるし。
と夏休み最初の1日目、派手に釣堀で戯れる。
相手する奴も厨
590 :
デフォルトの名無しさん :03/07/31 15:37
デルファイでプログラム作るのはどうするの?
/////// ///////____________ ///////  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ /////// (~) チリンチリン /////// ノ,, /////// ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ /////// ( ´∀`)( 厨 ) )) < 夏だなあ〜 /////// (つ へへ つ \______ /////// //△ ヽλ ) ) 旦 ////// l ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l /////  ̄| .| ̄ ̄ ̄ ̄ ̄ ̄ ̄| .| ̄ //// ^^^ ^^^ 厨房の夏。2chの夏。
すみません、Linuxを利用してるんですが LinuxじゃC言語なんて使えないですよね?
あっと驚くためごろう
つ 釣られないぞ!
>>592 使えません
C言語が使いたければWindowsに乗り換えてください
Linux こそ C ぢゃないか。
598 がマジレス権を行使しました。
600 :
デフォルトの名無しさん :03/07/31 18:11
>>595 Linuxを含めたUNIXプラットフォームで最も多く用いられているのが
C/C++言語です。
WindowsでコンパイルしたものはWindowsでしか使えません。
Linuxで使うためにはLinuxでコンパイルする必要があります。
592-597は自作自演ですか???
クロスコンパイルしたことないのだろうか・・・。
超頭固いおまいなんか、豆腐の角に頭ぶつけて氏ね
>>600
>>600 嘘は書くな。
Windows環境で動くクロスコンパイラは
Windows以外で使うものを作るのが目的だぞ。
600 がネタにマジレス権を行使しました。
C言語とjava言語で作ったプラグラム比べるとCのほうが動作軽いですか?
>>607 処理系、動作環境依存
あと、プラグラムはやめれ。
>>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 反応してくれて有難うございます。
>>612 ショートサーキットでした。有難うございました。
ショートサーキット(短絡評価)って技法じゃなくて&&や||の性質では。
>>609 大抵の場合、この程度の時間で処理できればOKという線がある。
で、再帰ではそれを満たさなかったの?という話だと思う。
あと関数呼び出しのオーバーヘッドをなくすよりも
i[0〜n]を使った処理の方を見直した方が余程速度に影響する。
どうせそこでループがしてるんだろうし。
>>609 double をループカウンタに使うのは
数値誤差があるんでやめた方がいいと思うが...。
ループカウンタには int を使って、
同時にそれに対応する double 値が得られる工夫をするべし。
再帰が問題になるかは、実際に再帰してみてから考えれ。
それほど関数呼び出しのオーバーヘッドが問題にならないかもしれないし。
>>617 実際、doubleを制御変数にしていると速度低下を招く罠。
619 :
デフォルトの名無しさん :03/07/31 23:52
最小化をするとタスクバーにアイコン化されるようにする コードを教えて下さい
>>619 Del厨はDel厨らしくDelスレに帰れ。
>>622 私が聞きたいのはWindowsじゃないんですけど・・・・
香ばしくなってきました。
>>619 >>1 > GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
windowsを購入しようと思うのですが C言語って使えるんですか? それとよく聞く「コンパイラ」って何ですか?教えて下さい
あぁん、釣れない人たちね
機種はVAIOです。
そんくらいググれ。
コンパイルは通るのですが、実行がうまくいきません。 縦書きに は じ め て ・ ・ というふうに表示させたいのですが、どこが間違っていいるのでしょうか? #include <stdio.h> main() { int i; char str[30] = "はじめてのCプログラム"; for(i = 0; i < 11; i++) { printf("%c\n", str[i]); } return 0; }
>>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;
}
修正 #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バイト文字にご注意と言う事。
>>632 おいおい、ループ終了判定で毎回strlen()呼ぶのか?
634 :
デフォルトの名無しさん :03/08/01 07:52
636 :
デフォルトの名無しさん :03/08/01 10:47
int array[10];にarray={1,2,3,4,5,6,7,8,9,10};と代入することはできないんですか?
やってみれば?
>>636 初期化は可能だが、代入はできない。
「仕 様 で す」
>>610 の書き方の違いって、ショートサーキットとかと関係あることでしたっけ?
どちらの書き方してもコンパイルしたら同じ結果になりますよね。
640 :
デフォルトの名無しさん :03/08/01 14:03
>>639 ない。
あれで「ショートサーキット」という言葉が出てくる612はエスパー
いや、あるよ。両方が同じ結果になる事(というか、 argc!=2のときのstrcmpが実行されるかどうか)を、 保証しているのが、ショートサーキット。
ショートサーキットってなんですか?
647 :
けん ◆gZE4xJJ95c :03/08/01 15:23
>>1 まあ、そういわないでくださいよ。(しょうがないですけど。。)
もうメンテナンス半分放棄してるから、C machine公開
終了しようと思ってます。
文法的にでも完全なANSI仕様にするのはかなり大変だったです。
ずいぶん前から書かれているのに何で今頃?
649 :
けん ◆gZE4xJJ95c :03/08/01 15:26
>>647 >文法的にでも完全なANSI仕様にするのはかなり大変だったです。
結局、完全なANSI仕様にする前に力尽きた、というか、
本業が忙しくて、それどころじゃない状態になってしまい
開発ほとんど中止状態になっちゃったんですよね。
っと、言い訳はこれくらいにして、自分もひさびさにこのスレッド
でも見てC言語思い出してみようかな。。(ここ2年くらいC言語
から離れちゃってるんですよね。C++で開発してた時とかあったけど、
仕様の理解と実装はそれとはまた全く違う話ですからね。。)
650 :
けん ◆gZE4xJJ95c :03/08/01 15:29
>>648 自分宛ての意見ですか?
それはたまたま今見たからですよ。
プログラム板ってほとんど見ませんし。
C99コンパイラ作る木はないのん?
>>651 能力、時間、、その他の問題で私一人で作るのは到底無理です。
ソース公開して終わりにするとか、反応があれば sourceforgeにでもつっこんで終わりにしたら?
>>653 ソース公開は難しいですね。たぶんしないと思います。
そのまま消滅ですね
>>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の世界で広まりました。しかし、その勢いは全くとどまらず、次第に大型コンピュータやパーソナルコンピュータの世界にも普及していったのです。
B言語には組み込みの型がないんだっけ?とスレ違いな質問をしてみる。
Digital Mars C++をダウンロードしたのですが、それにはMFCが付いていると 聞いたのですが、それをBCC55で使うことはできるのでしょうか?
>>659 extrn mona, wara[], KuSo300t();
みたいな型はあったな
いや、ない。 extrn mona, wara, KuSo300t;
(^^)
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]); } こんな感じなんですけど、よろしくです
ifが成立してないんだろ。
「回転数」は表示されるのか?
668 :
悩んでます :03/08/02 02:53
10進数で48 16進数だと0x30という数値をバイナリに変換するには どうすれば良いですか?ASN.1でやりたいのですがCでの処理ルーチンが 分かりません。宜しくお願いします
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;
といった具合です。
最初っからバイナリじゃん。
673 :
悩んでます :03/08/02 02:59
>>672 という事はlongからchar *に変換すればいいという事ですか?
char* に変換ってのが分からん。 b には何が入ってるの?
675 :
悩んでます :03/08/02 03:13
>>674 えとイメージとしてはテキストエディタでバイナリファイルを開くと
意味不明な文字の羅列が char *b;に入ります。
ここからは予想ですがlong の lに格納された 0x30
00110000という文字コードがそのまま出力されているのではないかと
思います。
多分BorlandC++でいうHexToBinにあたると思います。
>>675 「バイナリ」「文字」「文字コード」についての定義を言ってくれ。
どうもその辺に混乱があるように思えてならない。
677 :
悩んでます :03/08/02 03:25
>>676 ごめんなさいすごく混乱してるのです--;
ASN.1で定義されたタグを出力する為のものです。
既に定義されたlong型(HEX)をバイナリとして変換したいのです。
私もlong型をバイナリへという概念は理解できるのですが
具体的にどうすればいい分からないのです;;
678 :
デフォルトの名無しさん :03/08/02 03:28
>>666 >>667 回転数は表示されます。
回転数
の後に変な数字が表示されて終了。
どうしてでしょう???
int i = 123; char buffer[10]; sprintf(buffer, "%d", i); printf(buffer); 単に数値を文字列にしたいんだと解釈してみる
681 :
悩んでます :03/08/02 03:42
文字列にしたいんだったら、むしろ C 的に言えば テキストに直したいってことだよな。 そういうことなら sprintf を使えばいいかと。
683 :
悩んでます :03/08/02 03:46
もとからバイナリなのにそれをさらにバイナリにしろと言われても分からん。 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ですか、調べてみます。
テクニカルな方法あるけどもう必要ないかな?
0x30←私はこれがバイナリだと思いまーす。
689 :
悩んでます :03/08/02 04:04
>>684 この書き方でできましたありがとうございましたm(_._)m
本当にありがとう
うーん。 ((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が使用してあり
また悩んでいますががんばってみます
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
kaiten ってはどう定義してる?
696 :
デフォルトの名無しさん :03/08/02 05:44
>>695 char kaiten[1000];
です!
うーん。 gets 呼んでも入力が来ない、というのは、 1. 既に前にあった入力の内容が残っていた。 2. メモリ内容が何らかの操作で壊されておかしくなってる。 3. gets にバグがある。 の 3 つの可能性があるけど...。 とりあえず kaiten を char kaiten[1000] = "XXXXXXXXXXXXXXXXXXXXXXXXXX"; って初期化して、 これ以外のが表示されたら 1. の可能性が高いかな?
700 :
デフォルトの名無しさん :03/08/02 06:24
>>697 ありがとうございます!!
コンパイルに問題は無いんですけど、
回転数と出た後に変な数が・・・・。
やっぱおかしいんですかね??
でも、独習Cのサンプルコードで試すとちゃんとできるのに・・・。
普通Getsすると、入力を待ってくれるじゃないですか?
それさえもせずに終了してしまう・・・。
とりあえず明日試してまた報告します!
今回の話とは関係ないと思うけど、gets より fgets(kaiten, sizeof kaiten, stdin); を使った方が安全。
>>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型引数を読み込もうとするが、そんなものはないのでクラッシュしてしまう。
>>704 蛇足な補足。
%dの場合は大抵クラッシュしないでごみ数字が出る。
寧ろ問題は%sの場合で、この場合、ナルキャラが見つかるまで出力しつづけることになる。
#或いは容易にメモリ領域を突破して異常終了する。
>>706 混乱とは、gets()を使う選択肢を残している香具師の状態のことだ。
708 :
デフォルトの名無しさん :03/08/02 09:15
C言語においてgets()ほど邪悪な関数は無い。 それでも懲りずに(σ´∀`)σゲッツ!!
バッファがあふれるからgetsが嫌いって奴 得てしてデータとりこぼす関数は平気で使う
データとりこぼす関数ってなに?
gets関数ってコンパイラのオプションによっては警告出る?
そういうコンパイラも、広い世の中にはあるかも知れない。
>>712 使用するとってことか?
うちのgccはデフォルトででるね。あぶねーから使うなと。
scanfやprintfでフォーマットと引数の対応がおかしいと警告してくれるのがうれしい。
それlibcが出してるだけじゃあ……
>>715 んん。コンパイル時に警告が出るからlibcは関係ないような。
と思って確認してみたらリンカが出してる模様。
>>715 は「コンパイルしても動かないんですけど。」という質問に「コンパイルしただけでは動かないでしょうね。」と答えそう。
>>718 libcが出す警告にコンパイラは関係ない
明らかに勘違いしてるようだから突っ込んであげだら、 何か必死なレスが返ってきた。(´・ω・`)ショボーン
スレ違いですが質問させてください。 rc=ランコマンドって何ですか?
起動時に実行するコマンド
>>725 すいませんそれは例えばどんなことですか?
あるプログラムが自動的に最初に読み込んで実行する、設定用のファイル。 たとえばbashの~/.bashrcなど。
>>727 じゃrcはないよりあったほうがいいのですね。
>>704 自分も学校に入ってgccでやってるんですけど、getsは使うな見たいな警告が出ます。
ご指摘されたとおりにやってみようと思います!!
また後ほど!
浦東戸新鳩南川赤志王王西駒本東後飯市四永溜六麻白高五戸荏旗長洗石雪御久千池蒲京糀大穴天羽羽 和川塚井が鳩口羽_子_が_駒大楽田がつ田池本布金輪反越原の_足川谷嶽が鳥__浜_鳥守空田田 美口安宿谷が元岩_神_原_込前園橋谷谷町山木十高台田銀中台_池台大山原町__蒲_居稲橋空西 園_行__谷郷淵茂谷子_込_______王一番輪__座延_原__塚___上田田谷_荷_港タミ ●――――――●――――――――●●●●●――――●―――――――――――●―――――●●空特 ●――――――●――――●―――●――●―――――●――●――――――――●―――――●●特快 ●●――●――●――●―●――●●●●●●●―●―●――●―――●――――●●―――●●●快速 ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●各停 ←――――――→←――――――――――――――→←→←――――――――――→・←――――→ . ↑ ↑ ↑ ↑ ↑ ↑ . 埼 営 営 東 京 京 . 玉 団 団 急 急 急 . 高 南 池 池 蒲 空 . 速 北 上 上 田 港 . 線 線 線 線 線 線
fgetsしてatoiだあ? 恥を知れ低脳
scanfでいいじゃんって感じ?
ふつー strtol atoi はクソ
C言語のgetsはダンディ坂野が作った関数である 読み方は「ゲットエス」でも「ゲットストリング」でもなく「ゲッツ」である 実際に聞いてみた。 (σ´∀`)σゲッツ!!(σ゚Д゚)σゲッツ!! 確かにゲッツであった。
んで、なんでatoi()はダメなの?
atoi() はエラーを返さないから。
>>738 strtol()ってエラー返したっけ?
どこまで読んだか、オーバーフロウやアンダーフロウを起こしたかどうかを知ることはできる。
オーバーフロウ→下呂 アンダーフロウ→
とりあえずgetsはあきらめました。 scanf で全てやるとうまくいきました!
743 :
デフォルトの名無しさん :03/08/03 04:51
あのぉ、cと関係ないかもしれないのですが、コマンドプロンプトとかなんでもいいですが EXEを実行するときにコマンドラインから日本語を入力する事ってできるんですか??
745 :
デフォルトの名無しさん :03/08/03 05:22
>>744 ググッてみるべきでした!
どうもですm(__)m
Alt+
定義した構造体型の実行コードは、仮想記憶上 関数の実行コードと同じ場所(コード領域)に置かれるんですか?
「構造体型の実行コード」って何?
「構造体型の実行コード」 サパーリわからん
などというと不勉強だと言われるな。 C99より前しか知らない俺にとってはサパーリわからん
そろそろWinアプリを作成したいのだがフリーでSDK扱える環境ってありますか? 諸先輩方教えてくださいm(__)m ちなみに現在はborlandを使っています OSはWinXPです
スレ違いですm(__)m
>>751 Borland C++ + Win32SDKで問題なし
マジくそ質問ですまん。 char a[20],b[20]; strcpy(a,"ほげほげ"); strcpy(b,"ほげほげ"); if(a==b){ っていう風に比較ってできる?
比較はできるが、おそらく君の意図とは違う。
>>755 マジで?じゃあ文字列全部を比較するのってどうすればいい?
>>756 strcpyを知っているのなら、もう少し勉強を進めれば分かるでしょう。
>>757 関数探したけど、それっぽいのないし、お願い教えて
>>754 if(a==b) ってすると、a[0]の示すポインタとb[0]の示すポインタの比較となるから
for文で20個比較でいいんじゃね?
>>757 ごめん。あった、strcmpだべ!!でも、比較結果で左辺の方が小さい
とかもあるんだけど、文字コードで比較してんのかな〜
K&R 5.4 「同じ配列のメンバーを指していないポインタ同士の演算や比較を行うと、 結果は不定となる」 不定じゃなく未定義だったと記憶してるんだけど、未定義なら 比較することも駄目の様。
(文字列を代入するにも関数を呼ばないといけないんだって!!) K&Rより 本当に文字列の扱いが苦手だよなぁ。
質問なんだけど、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との違いのせいかな?それとも根本的に使い方 間違ってる?どなたか教えてくれやさい。
へー
>>753 ありがとうございます
さっそくWin32SDK探してきます
>>764 ごめん。これもc=func(a,b)じゃなくてstrcpy(c,func(a,b))だね。
>>754 のおかげで気づいた。ありがとう
>>754
そいつはすげーや
>>769 手元のソースはC[200]って宣言してた!!
説明不足スマソ
どうでも良い質問なのでさげ みなさんは、ある変数に1プラスしたiを代入するのにどんな表現方法を使ってますか? int i=0,j=0; i++; j=i; 自分は j=i+1; ってやってます。 j++i; は、あえて使ってません。
あ、イコールが抜けた。 j=++i;
へー
j = i + 1 と j = ++i って結果違うし
ループでの話をしたわけではないので、今回は見逃してください。
いや、ループ関係ないし。
>ある変数に1プラスしたiを代入する 「1プラスしたi」がどういう意味かによるな。 「iに1プラスした値」ならj = i + 1だろうし、 「iを1プラスしてその値」ならi++; j = i;だろう。
質問です。 double a[5]={21,21,43,54,65} ←適当 で char b[20]="はひふへほ〜" cha c[20]; となっていて、 はひふへほ〜の後ろに、a[3]とかの中の数字をくっつけるにはどうすれ ばいいのでしょうか?イメージ的には strcpy(c,strcat(a,b[3]); みたいな感じでやりたいんだけど、型が合わないし、文字列の扱いが あまりよく分かりません。どなたか教えてください。
>>777 後者なら普通 j=++i; ってするんじゃないの?
j = i + 1; ならi自体は変化しないな
>はひふへほ〜の後ろに、a[3]とかの中の数字 sprintf(c, "%s%4.2f", b, a[3]); かな
>>781 なるへそ!!そんな手があったか〜、サンキョウ!!もといサンキュー
!!
ちなみに sprintf より snprintf のほうが安全。
何度も質問して申し訳ないんだけど、 さっきの逆で、char a[20]="7943798734834" みたいに宣言したものを、それぞれの要素ごとに文字として代入する にはどうすればいいの?(strtodとか使ってみたけどうまくできない。) b=a[1]で左辺に9が代入されるみたいにやりたいんだけど、 誰か教えて!!
b[0] = a[1]; b[1] = '\0';
>>785 本当にごめん!!上の質問書き間違えた、"数値として代入する"
だった、左辺はdouble型の配列
b = a[1] - '0';
/* 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になってしまう 何でですか?
>>789 aに2を代入していたあとに表示しているから。
790>> ありがとございます。どうやら本が間違えてるみたいです a = 1; b = a; 変数Aの値を変数Bに代入 a = 2; 変数Aに新たな値”2”を代入 と書いてあった! 本の間違いっぽいですに
/* 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; }
794 :
デフォルトの名無しさん :03/08/03 18:02
>>788 本当にこれで出来んの?試したけどダメだったよ。
具体的にどうやったらどうダメだったのか書け
>>791 その本のタイトルキボンヌ。
なんて言ったらマズイかな……。
>>796 char a[20]="07211919";
double b[20];
double b[1]=char[1]-'0';
printf("%d",char[1]-'0'); ←確かめ(期待通りなら7が出力されるはず
でもだめだったポ
>>798 ごめん上の式の中にdoubleとか,charとか式に入ってるけど無視で、
正しくは
b[1]=a[1]-'0';
char[1] ってなによ。
801 :
デフォルトの名無しさん :03/08/03 18:33
>>798 printf("%d",char[1]-'0'); も直せ
「だめ」ってのは具体的にどういうことよ。
>>802 非常に申し訳ない事に・・・・・出来た。てへ、ごめんよ
>>797 『世界でいちばん簡単なC言語のe本』 秀和システム
俺はモロ初心者なんだけど一冊目にはいいかも
>>791 に書いてあるのは間違ってはいないが、記述の順番が考慮されていない。
こんな本、あり得ません。
C言語を知らなすぎ、作者は恐らく
a = 1;
b = a; 変数Aの値を変数Bに代入
a = 2; 新たな変数Aに値”2”を代入
とでも思ったんでしょう。
記述された順番にどおりに変数を参照されたらたまったもんじゃねーよ
3回目に呼び出したときはどうなるんだ(w
>>779 i++;//iに1を足す
こんなコメントを書くようなプログラマが居るから
間違えないようにレベルを合わせてやらないと。
>>805 変数「A」や変数「B」なんてどこにもないだろ?
そんな本がいいわけないよ。
#仮に、Cが大文字小文字を区別しないならまた話は別だが。
810 :
デフォルトの名無しさん :03/08/03 21:05
すごい初歩的な事教えてください! int型の数字をchar型に変換する事は出来ないのでしょうか? 逆はatoiで出来ますよね? 何がしたいかというと、strcatで繋げてファイルに出力したいのですが・・。 やり方がわかりません
811 :
デフォルトの名無しさん :03/08/03 21:12
>>810 数値を数字列にしたいってことか?
sprintfで。
char c = (int)i + '0';
813 :
デフォルトの名無しさん :03/08/03 22:06
817 :
デフォルトの名無しさん :03/08/03 23:28
int2strってどうやって使うんですか??
ありがとうございます!sprintfで試してみます!
819 :
デフォルトの名無しさん :03/08/04 00:35
C処理系には具体的に何が含まれるんですか?
何度も試したのですが、うまくいかないので質問します。。。 #include <stdio.h> int main() { printf("hello c"); return 0; } というプログラムをコマンドプロンプトでコンパイルしようとすると、 can't open: stdio.h No such files or directory と表示されて、一向に前にすすみません。 どうすればいいのでしょうか?教えてください。
パスが通ってないだけじゃ…
>>820 プログラムは間違ってない。(ちょっと気になる所もあるが)
includeファイル stdio.h がみつからないと言われている。
LSICはしばらく使っていないけど、lcc.exeがあるディレクトリに
設定ファイルがあったと思う。(確かbinの中)
その中の include ファイルのディレクトリを正しく書き換えれば多分OK。
コンパイラ設定ファイルの書き換え 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 ↑ ↑ ↑
すみません。また質問です。sprintfでint型の物はchar型に変換できたのですが、double型の物をchar型にどうやって変換するのでしょう??
>>827 どうやればいいのですか??
例えばa=100.1234123131213131・・・・・・のようなdouble型で
char b[100000];
sprintf(b,"%f",a);
コレで出来るのでしょうか??
doubleなら%lfとかだな
うそ教えちゃダメ
大まかできたのですが、 sprintf(b,"%4f",a); としても何にも変わらないのですけどどうすればいいのですか?? 4桁だけchar型に変えたいのですが・・・。
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 って出力させたいんですけど・・・
>>831 やりたいことを具体的に書こうや。
もしくはsprintf()のマニュアルを読むことと
Cの文字列取り扱い全般について調べることを薦める。
>>833 /* 一例を提示 */
int ic;
for (ic = 1; ic <= 40; ic++) {
printf("%d ", ic);
if (ic % 10 == 0) {
printf("\n");
}
}
すみません。やりたい事を言います。 今 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が入力されてしまいます。 どうすれば・・・。
すみません。 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 とあるのですがどう対処したら良いのかわかりません 宜しくお願いします。
static int conp(char *, int, int, lcomposition *); 削って宣言してみては
840 :
これは一体.. :03/08/04 05:38
定義じゃなくて宣言だよね。どうでもいいけど。
842 :
これは一体.. :03/08/04 05:52
conpがtypedefで再定義されていないか 21行目以前の構文は正しいか(;を付け忘れていないか) 漏れが思いつくのはこれくらい
放置ですか?
first, that's your business.
847 :
これは一体.. :03/08/04 06:21
>>843 結論がまだでていないのでまたこのスレで報告します。
>>838 トラブったときの基本
1つずつ外してチェック
1つずつ単体でチェック
850 :
これは一体.. :03/08/04 06:58
851 :
デフォルトの名無しさん :03/08/04 10:48
#define ってマクロって聞いたんですが #define hoge 123 とかは意味わかるんですけど #define hoge ってのが意味わかりません 誰か親切な方教えてくださいお願いします
>>851 空の文字列への置き換え。
取り敢えず思いついたサンプルを。
#define NEW_LINE "\n"
printf("foo" NEW_LINE);
→改行される
#define NEW_LINE
printf("foo" NEW_LINE);
→改行されない
>>824-825 無事できました。
2ちゃんねるにもこのような心優しいお方がいることに感動しますた。
普段はニュー速にいるからあまり感じないですが・・・・
855 :
デフォルトの名無しさん :03/08/04 11:21
#ifdef hoge こいつを通すために、 #define hoge とすることはよくある。 ま、別に適当な値を放り込んでもいいんだけどサ。
>>855 「何もしない」ではなく、「空になる」。
先程の例では、
printf("foo" NEW_LINE);
が
printf("foo" );
に展開されるわけ。
なお、
>>856 の言うように値が必要ない応用も多い。
典型的な例。
標準インクルードのstdio.hを覗くと、
次のようなマクロの使い方をしていると思う。
#コンパイラによってはpragmaで代用しているかもしれない。
#ifndef STDIO_H
#define STDIO_H
...
#endif
コンパイル環境によって定義を微妙に変えたい場合に使ったりする。 #if WIN16 #define FAR __far #else #define FAR #endif const char FAR *vram; WIN16が定義されていない場合は FAR は何も指定しなかったのと同じになる。 結局852と同じだけど。
860 :
デフォルトの名無しさん :03/08/04 11:42
>>856-858 まだよくわかんないですが
なんとなくイメージがつかめました
ありがとうございました
#if defined(__STDC_VERSION__)&&__STDC_VERSION__==199901L #define RESTRICT restrict #else #define RESTRICT #endif int func(int * RESTRICT p1,int * RESTRICT p2);
>>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回目かよ。もうちょっと勘を使えよ。"); } よろしくお願いします。
iとmagicとnum2の定義はどこだ?
865 :
デフォルトの名無しさん :03/08/04 16:48
>>863 ダウト!
for(i = 1 ; i < 5 && magic = num2 ; i++){
magic = num2 ×
magic == num2 ○
あるいは(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回目かよ。もうちょっと勘を使えよ。");
}
869 :
デフォルトの名無しさん :03/08/04 16:58
>>867 mainの戻り値がありません。
JavaならコンパイルエラーだがCでは平気なんだな・・・
---------------------------------------------------------
このプログラムでは1回目だけしか判定できません。
main関数と判定関数を分離して、mainから何回も判定関数を呼べるように
しないと意図しているプログラムはできません!
870 :
デフォルトの名無しさん :03/08/04 16:59
>>865 ”=”と、”==”の違いがはっきりと分からないのですが、
”=”は代入する
”==”は実際に同一かどうか
とか理解しているんですが、
magic == num2
と
(magic = num2)
のどちらかでいいというところが理解できないんですが・・・。
ちなみに、下のほうでやったら通りました。ありがとうございます。
>>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進数ではどうやるんでしょう?
> if(magic = num2) { magicにnum2の値を代入し、その値が真であれば(0でなければ)
ちょっと違うか。 int i=45678; printf("%d\n",i/1000%10); /* 5と表示されるはず */
変数をvoidで宣言するとどんないい事があるんですか?
>>877 できるのか!?と思って試してしまったじゃないか。
あ、スンマセン、構造体でのポインタ変数の事です。
>>879 ああ、void *か。
どんなポインタでも代入できるので、よく汎用的な配列を扱う関数で使う。
memmove,memcmp,qsortなど。
これらの関数の引数がもしも特定の型のポインタ(int *とか)だとしたら、呼び出し側でキャストしないといけなくなる場合がある。
あとmallocの戻り値もvoid *だね。
>>876 ありがとうございました。できました。
余りを求める「%」って今まで使ったことなかったです。
>>880 どうもありがとうございました。
最初脊髄反射的な質問してしまってすみませんでした。
883 :
デフォルトの名無しさん :03/08/04 17:51
forループ内で、forの初期設定部の値を変化させることはできるんでしょうか? たとえば、for( i = 0 ; i < 11 ; i++); とかなっているところに、for関数内のコードブロックで、i=0 に戻して永遠とループさせることとかってできますか?
>>883 出来るけどさ
無限ループならwhile文使おうよ・・・
>>883 あっと、初期設定部ではなくて、何回かループした
ところで、i=0に戻してもう一度最初からループさせることは
できますかということでした。
やってみてできないんだけど、 宿題でforループを使ってやりなさいって 指令が下ってるもんで。 しいませんでした。
iに-1代入すれば?
単に for(;;) すればいいとかそういう話か?
単にwhile(1)にすればいいとかそういう話か?
>>883 >永遠とループさせる
永遠にループさせることはできるかもしれませんが、
永遠とループさせることはできないと思われます。
>>883 for (i = 0; i < 11; i++) {
i = 0;
}
お待ちなさい。 >宿題でforループを使ってやりなさいって >1
使えない奴ばっか
for(;;) { printf("永遠\n"); }
MinGWのソースってダウンロードできるの?
通報しました
VC++じゃコンパイルできないんだよね
902 :
デフォルトの名無しさん :03/08/04 21:46
iconvの使用方法を教えていただきたく質問させていただきます。 iconvでEUCからSIJSに変換したい unsigned char *ps; *EUCのデータが入ったバッファの先頭アドレス chardst[48]; *変換後のデータを格納するcharの配列 こんな条件でやりたいのですがご指導お願い致します。
>>902 iconv使ってるソースをパクって...いや参考にすれば?
iconv では役不足です。
iconvのiってなに?international?
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 > その文字配列は動的に確保されていました。
> その文字配列はローカル変数
どっちなんだ?
>>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
921 :
質問age :03/08/05 01:05
質問の仕方が厨房すぎ
923 :
デフォルトの名無しさん :03/08/05 01:09
>>921 そう。専用の解放関数をつくってその中でfreeしてもいいけど。
>>916 その誤字だらけを何とかしろ。
で、面倒だから一例を。
char *func(void);
char *p = func();
free(p);
...
char *func(void)
{
return malloc(ANY_SIZE);
}
>>924 なんだかんだ言って優しいね。ありがとう!!
配列の初期化で 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 */
>>927 int a[10]={0};は最初のa[0]に0を入れて、後、入れてないとろは勝手に0になるってことですね
ありがとうございました
>>927 そういう事ってmallocとかで配列用のメモリ確保した時にもできれば
便利なんだけどな〜
calloc
nullpo
あのさー、ハードディスクの上に仮想メモリってあるじゃん?じゃあさ、 メモリを超える量確保しようとしたり、腸デカイ配列とか宣言したらさ、 勝手にハードディスクの上を使おうとするのかな? あと、自分からハードディスクをメモリとして使えたりするの
934 :
デフォルトの名無しさん :03/08/05 02:04
∧_∧ ( ´∀`)
∧_∧ ( ´∀`) < nullpo
どっちかってーとOSの話ですな
OSの話かな。
MinGWのソースって公開されていないのですか?
942 :
デフォルトの名無しさん :03/08/05 18:52
保守
943 :
デフォルトの名無しさん :03/08/05 20:33
ちょっと聞きたいことがあるんですけど。 文字の入力待ちで何か文字を打ち込み(getsにより) あらかじめ指定しといた文字とあたったらその処理をおこなう というプログラムを組みたいんですけど何かいい方法ありますか? if文かswitch文でお願いします
>>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
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です。 すみません
>>947 文字列の比較を行うのがstrcmp
Cは文字列の比較も関数を使う。
新スレ立ててくるか。
>>947 >>1 のリンクにある、C FAQ 日本語訳 は目を通しましょう。今は分からなくても。
聞く前に試しましょう。わからないことがあったら調べましょう。
952 :
デフォルトの名無しさん :03/08/05 21:19
>>949 さん
>>950 さん
>>951 さん
>>952 さん
>>953 さん
ありがとうございました。
いろいろなサイトに回ったり、家にあった本などの索引など利用して
どうにかできました。
結局strcmp()使って解決しました!
知らないいろいろなキーワードからいろいろな世界が広がりました!
ためになることなど知れたので、ありがとうございました!
955 :
デフォルトの名無しさん :03/08/05 23:02
任意の文字(アルファベト)を発生する関数ってなんか ありましたか?
956 :
デフォルトの名無しさん :03/08/05 23:05
∧_∧ ∧_∧ ピュ.ー ( ・3・) ( ^^ )(^ё ^)<これからも僕たちを応援して下さいね(^^)。 =〔~∪ ̄ ̄ ̄∪ ̄ ̄ ̄ ̄〕 = ◎――――――――◎ 山崎渉&ぼるじょあ&みんちぇ
>>955 よくわからん。
ランダムにアルファベットを発生させたいのか?
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[(int)((double)rand() / ((double)RAND_MAX + 1) * 52)]; こうか?
C言語の場合は、 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[rand()%52]; が普通かな。
そうでもないよ
アスキーコードから呼び出すってことはできないの?
どういう意味?
Aのコードは41でZは5a aのコードは61でzは7a 41〜5a、61〜7aの乱数が作れれば、アスキーコード→英文字に変換→ランダムで英語の表示 みたいなことはできないのでしょうか?
英語の表示?
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; としたいということかな? 複数文字出力したいならこれをループさせればいい。
表示じゃなくて発生ですね
>>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とか打つと永遠にループしてうまく働いてくれません。 どうしてなのでしょう?
>>970 scanf が永遠に数字を探し続けるから。
972 :
デフォルトの名無しさん :03/08/06 05:52
どうすればいいのでしょう?? あとなぜアルファベットが押されたときにだけバグるのでしょう? 教えてください!M(__)M
エラーの回復など面倒なことせずにここでexitしなさい if(s!=1&&s!=2&&s!=3){ printf("1,2,3のいずれかを押してください!\n"); }
974 :
デフォルトの名無しさん :03/08/06 06:04
とりあえずそうします・・。 どうにかして回復させる方法はないものでしょうか???
簡単に言うと WHILE INKEY$<>"" : WEND だな
976 :
デフォルトの名無しさん :03/08/06 06:12
>>975 どうもっす。もっと勉強します(何かいてあるのか分からないから(^_^;))
それって割り込みとかですか??
BASICなんだが…
>>976 俺もそのゴミ捨て方法の決定版は知らん
とりあえずscanfの戻り値をチェックして正しく
変換されたかどうかを見る。次にstdinがEOFでなければ
ゴミ捨てだが、見たことがあるのはfflush(stdin) (未定義っぽい)
rewind(stdin) (うまく行く理由が特にない)とかで俺の使っている
処理系では確かにこれでできるのだがいまいち納得がいかない。
scanf("%*s")とかでどうなんだろう。
詳しい人よろしく
皆さん勉強になりますM(__)M ありがとうございました、もう少し勉強してみます!
結局、 scanf("%s",&f); s=atoi(f); でバグらくなりました。
>>982 scanf("%d",&d); でゼロが帰ってきたら他のものが入ってるってことになる。
scanf("%s",&s); しとけば、%dでとれなかった文字列がとれる。
そしてバッファオーバーラン。
うんち
uma-
ume-
なんかエラーが厳しいぞ
カウントダウン開始 10
9
8
7
8
6
9
7
0
1000!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。