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

このエントリーをはてなブックマークに追加
1v(^o^i)d
まず問題を冷静に吟味して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
ι(´Д`υ)アツィー
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
ははは
論理学の試験問題みたくなってきたな
105:03/07/21 12:07
>6

早速のレスありがとうございます。
よく分かりました。
115:03/07/21 12:08
>8の方もありがとうございます。
>>10
よかったな。>>8は間違い>>6が正しいから釣られるなよ。
13デフォルトの名無しさん:03/07/21 12:21
>>6
> char* string,string2;
> として書いたとき、string,string2両方ともポインタになるが、

ならないよ。
>>10
・・・自分で確かめるのがよろしいと思われ。 >>6 が嘘こいてる。

ってかこのやりとり全てがネタ?
if (x) と if( x ) で意味が違ったら面白いことになりそうだな
16デフォルトの名無しさん:03/07/21 12:27
>>15
何いってるんだ?
アフォですか?
>16
#define M(x) xと#define M (x) xは意味が違うけど、これはプリプロセッサの話だからな。
藻前ら釣られ杉
ばかばっかーーーーーーーーーー
21↑MVP(´∀`):03/07/21 13:01
 
>>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;
>>26
それでもエラーがでます。
28sage:03/07/21 17:22
>>27
char (*pId)[256];
>>28
おお、なるほど
これで配列のエイリアスがつくれるということですか。
>>24
何をしたいのかわからん。
ネタ?
32デフォルトの名無しさん:03/07/21 17:55
>>31
まだ起きてるよ
>>22
>基本は
>型名 変数名;

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


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




理由も書かずに否定するだけでそれが有効となる。
楽な世の中だな。
>>34
K&R(邦訳)のP.150近傍を嫁
>>35
int main(argc,argv)
int argc;
char *argv[];
{
printf("今時K&Rでつか。");
}
K&Rって何だ?
>>36
では、あなたの言う「基本」とは何か?
発明者の説明以上に説得力のある「基本」があるならそれを示せば済むはず。
>>38
私は何も言っていません。
>>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
};
>>39
年齢=レス番
こんぐらっちれいしょん!
>>22 みたいなのは、ありがちなCの初心者。
つーか俺もCを触った当初はそんな風に考えたこともあった。

「基本は、『型名 変数名』」と言うなら、基本形じゃないケースが
あることを忘れるな。そしてそれがポインタの場合。
ポインタは全てtypedefしているから問題なし。
基本ってのは、typedef された型を使うときのが基本って気がする。
「型名 変数名」って考え方は、何処から出てくるのだろうか…
一体、配列や関数ポインタの事を、どう解釈しているのだろうか…
とても気になる、今日この頃…
配列や関数ポインタは全てtypedefしているから問題なし。
基本ってのは、typedef された型を使うときのが基本って気がする。
50デフォルトの名無しさん:03/07/22 03:41
「型名 変数名」か・・・
int* hoge; は整数ポインタ型のhogeと解釈するのかな
俺は整数型のポインタhogeとしてint *hoge;って書くけど
「型名 変数名」になってないのは
ポインタと配列(typedef されたものを除く)だ。
じゃぁ、そうなってるのは何か?
それを「基本」と呼ぶのは悪いことではない気がする。
なぜなら、ポインタでも配列でもない変数を一番よく使うからだ。

って、そもそも規格でも整数型と浮動小数点型を合わせて
「基本型」って呼んでるでしょー。
52v(^o^i)d:03/07/22 03:49
voidも
void の変数なんか作れるか!
>>51
【「基本」と言うのは、「応用」と組み合わせて使うべきだ】
【「例外」と組み合わせて使うべきではない】
と思う。
つまり、
【宣言方法は例外を除いて「型名 変数名」しかない】
と言うなら分かるが(↑が正しいかを別にして)、
「応用」が無いのに「基本」を使うのは、何か違うと思う
55デフォルトの名無しさん:03/07/22 04:47
なんでsizeof(void)ができるの?(´・ω・`)
>>55
出来ません
ここCスレなのにC++と混同してる奴が多すぎ。
>>56
出来ます。
>>55
型だから
何となく分かったかも
「型名 変数名」って考えてる人は、「型名 変数名 修飾子」で考えてて
「型名 → 修飾子 → 変数名」って解釈してるのかな…?

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 規格
お前らまだやってんのか。
62結果発表:03/07/22 07:03
int *hensuu; /* ジジイ、ダサい */
int* variable; // 若者、オサレ
63これからの時代:03/07/22 07:33
int i=3;
int*PI=&i; // およそ3
>>60
この場合コンパイルされるか?されないか?の話かと。
>>64
手元にあるのでコンパイル出来るのはgccのみだが
まともな処理系ならエラーが出て当然(その他のコンパイラはエラーが出る)
>>65
vc7でもコンパイルされるぞ。
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文を実行する方法ありませんか?上手く行きません。
7372:03/07/22 18:15
あげます
もらいます
75デフォルトの名無しさん:03/07/22 18:23
なにがしたいの?
>>72
2^n回ループしたいということ?
>>76 違います。
関数内で引数として渡した数だけ、forを実行したいのです。
例は(引数+1)になってますけど。
実際には他にも配列へのポインタ引数をとり。その配列長がnです。
for内の i[] は各々の配列に操作を加えるとき、パラメータとして使います。
>>77
再帰じゃ駄目なのか?
>>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重ループしたいんだろ
釣り?
8472:03/07/22 19:17
>>79
おぉ〜、再帰で出来ますね。
理解するのに少し時間がかかりました。
ありがとうございます。

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

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

>>81
すみませんが、それは全然違います。
なんかものすごいことをしようとしているヨカーン
うん千重ものループかΣ( ̄□ ̄;)
n^1000 じゃなくて 1000^n や x^n ≒ 1000 のことであって欲しいわけだが。
解法を根本から見直したほうがよさそうだな
>>72
十重ループってすごいね
9072:03/07/22 19:44
ちなみにうん千回関数を実行するって事ですよ。
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週目以降
何を入力しても前回選択したラベルにジャンプするというエラーですた
訳を教えれ
9372:03/07/22 21:28
>>79>>91さん、他のかた、
ありがとうございます。

C++のテンプレートはまださわったことないんですが、やってみるかなぁ・・・。
一番簡単な例とか出してほしい。
何の?>>94
9692: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:に飛ぶ) 
こんな感じです。
間違えた・・
aじゃなくて数値だった

> 1
キーを入力
> 10
挿入完了
> d            (適当に入力)
キーを入力 (何故かcase 1:に飛ぶ) 
>>96
なんだか読む気がしない。
めちゃくちゃ

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

その辺をはっきりさせて統一しないと
10092:03/07/22 23:06
分かりますた。
>>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
いいえ。
やってくれません
>>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;
>>106
年二回。
109102:03/07/22 23:28
ありがとうございました。
11092: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がプリントされるのは何故ですか
どうせ読み込ませなくても1がプリントされるとかいう落ちじゃないか
>>110
int hoge = 100 ; としてみれ。
>>110
sscanf() の戻り値を調べて出直してこい。
>>110
int hoge=0;
にして、実行してみたら?
115110:03/07/22 23:53
みなさんのご指摘どおり初期値が1でした
変換が失敗すると、読み込まないのか・・
>>115
むしろ、どう読み込むのか?と(ry
117デフォルトの名無しさん:03/07/23 00:27
めちゃくちゃ簡単ですが、理解できない俺に教えて下さい。
scanfで文字列を取り込みそれは何だったかを表示するプログラムです。
配列とかがもう・・
>>117
めちゃくちゃ簡単なら自分でやれよ
出来ないなら簡単とかぬかすな
119117:03/07/23 00:33
#include <stdio.h>
int main(){
char a[];
scanf("%s",&a);
printf("入力されたのは%c",a);
}
こんな感じでいいのかなぁとか思ったんですが。
OK
121117:03/07/23 00:43
#include <stdio.h>
int main(){
char a[10];
scanf("%s",&a);
printf("入力されたのは%s",a);
}

これなら問題なく実行できるのですが、
入力される文字数を無制限にできないでしょうか?
無理
123117:03/07/23 00:45
配列の要素数は最初に必ず指定しなければ
ならないということですか?
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
>>128
問題なし。予約語じゃないから。
>>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;
}
134132:03/07/23 02:21
ごめんちゃい。
135131&133:03/07/23 02:22
>>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出身か?
139137:03/07/23 04:17
累乗ってなんだ。べき乗だろ
>>138
何故BASIC使いをVB使いと決め付ける?
N88やMSXかもしれんだろう?
同じ数を何個かかけて得られる積を,その数の累乗または
べき(巾,冪)といい,かけた個数をその累乗の指数といいます。
142137:03/07/23 04:21
>>141
累乗でもよかったんだ。
ショウガッコウカラヤリナオシテキマス
143_:03/07/23 04:42
144136:03/07/23 04:45
>>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);
148146:03/07/23 14:10
>>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
すげぇ、そんな考え及びもしなかったぜ・・・
>>152
NULLじゃないだろう
>>154
すまそ、Cから数年離れてるもので・・・
a[5]='\0';
なのかな
156150:03/07/23 14:42
>>152
じゃあ、初期化してないとどうなるんですか?
むかし
char str[BUFSIZ]を初期化しないで表示してみるスレ
なんてのがあったな
>>156
static な変数なら 0 で初期化されるが、
自動変数の場合はどうなってるか分からない。
毎回違う値が入ってる可能性も大きい。
>>156
「変化しない」って言葉がわからない?
初期化してようがしてなかろうが今は関係ない。
160_:03/07/23 14:50
>>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 と一致する行だけ抜き出したいのですが上手くいきません。
どこを直したらよいか教えていただけませんか?
165164: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);
}
}


}
>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);
      }
    }
  }
}
169164:03/07/23 20:36
>>166
>・fgetsで得た文字列がどうなってるか
>・file2が終端に達した後どうなるか

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

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

うーん。まだよくわからないです。すみません。
while(FILE1が終端まで行ってるか?){
 FILE1から読み込み
 while(FILE2が終端まで行ってるか?){
   FILE2から読み込み
 }
}
FILE1から1つめのデータを読み込んで、FILE2上の全てのデータで含まれているかどうかチェックする
(この時点でFILE2上にはデータが残っていない)

FILE1から2つめのデータを読み込むと、FILE2には「もうデータが無い」と判断し誤動作する、というわけで。
rewindがポイント
172170:03/07/23 20:52
厳密には、「誤動作」じゃないので。

>>171がいってるとおり、rewind manpageで検索して見てくれ。
173164:03/07/23 20:56
>>170
なるほど。
2つ目の while は一回終端まで行ったので
次のループでは既にストリームが終わってしまっているわけですね。
と、なると>>167で教示していただいたループも上手くいかなそうに見えるのですが...
strstrでのチェックの場合、改行を取り去っても
buf1が"1 10 5"
buf2が"1 1"

buf1が"2 21 1"
buf2が"1 1"
等で、問題が発生する
従って>>168のように数値でチェックした方が良いだろう
数値とは一言も書いてない
176164:03/07/23 21:25
なるほどよくわかりました。
レスしてくれたみなさん、どうもありがとうございます。
とても勉強になりました。
はいはい。お疲れさまでした >> 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足しても値が増えなくなる。
>>187
どういう意味?
>>185の言う初期化は、宣言時に初期値を指定することだと思われ
>>188
あ、そこまでループするのか。
pow の中身見てなかった。
なるほど。そのうち精度が悪くなって足しても d の値が変わらなくなるな。
>>188,191
doubleの上限じゃない。
1足して値が変わる上限。
>181
その値の場合においては問題ない
194181:03/07/24 01:54
>>183-193
返事が遅れて、ごめんなさい。
何か、とても書き方が悪かったようで…
>>193さんが、問題ないと言われてますが、念の為、もう1度、お願いします。
ようするに、知りたい事は、3つ程あるのですが、
「doubleの初期値を0.0にして、1.0ずつ足せば、仮数部も1ずつ増えるのか?」
と言う事と、
「仮数部を意図的に1ずつ増やした場合、
 仮数部の限界がくるまで指数部の値が、かわる事はないのか?」
と言う事と、
「指数部に余裕がある時に、
 仮数部の限界の値と、仮数部の限界に1を足した値を比較しても
 (FLT_ROUNDS等に関係なく)正しい結果が得られるのか?」
と言う事の3つです
知ってる方は宜しく、お願いします。
doubleの表現形式って仕様で決まってたっけ?
>>194
仮数部って整数じゃないよね?
IEEE754の浮動小数は仮数部が0.5<=x<1を満たすんじゃなかったかな?
指数部の値によっては上記の条件を満たさないかもしれないが
>>196
はい、仮の数です。
だから、単純に1.0を足しても仮数部の内部が1増えるとは限りません
が、>>194に書いた事は、1つ目と2つ目は、出来そうな気がするし、
計算精度的に、出来なければ、おかしい気もします。
また、3つ目は、出来ても、出来なくても、何となく納得出来るので、
仕様上、どのように決まってるのかなと思いまして…。
199181:03/07/24 03:14
>>198は自分が書いたものです

>>197
と言う事は、どう言う事になるのでしょうか?
200ゲット
C言語なら俺に聞け!
>>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++)の違いを教えてください
>>202
なんでここで聞くの?
>>202
スレ違いです。
205sage:03/07/24 03:30
すまん
206181:03/07/24 04:00
>>201
分かりませんでした…。(T_T)
最初の方に、指数部が同じなら
仮数部の値は保証されるような事が書いてありましたが、
それが、途中のIEEE754や、最後の方に書いてあった、
C99の仕様と、どのような関係があるのか、全然分かりませんでした…。
誰か、英語の出来る人、教えて下さいませ。m(_ _)m
207181:03/07/24 04:07
時間が時間なので寝ますが、
それでも宜しければ、レスお願いします。
>>179
壊れます
>180の答えは無視してもいいです
>>207>>181
なぜ自分で実験しないのかと小一(jr
210デフォルトの名無しさん:03/07/24 15:48
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 |  次でボケて!!!   |
 |________|
    ∧∧ ||
    ( ゚д゚) ||
    / づΦ
よしこさんや。メシはまだかい?
あのー、CRC16/CRC32/MD5鍵のアルゴリズムを解説したページ
ご存じでしたら教えてください。

出来れば、概要だけではなく、アルゴリズムと実装の両方が記載されてる
ページをお願いいたします。
213デフォルトの名無しさん:03/07/24 18:46
C言語のプログラムからシステム日付を設定する方法は
あるのでしょうか?
あるのなら教えていただきたい。
システム日付設定関数とかあるのかな???ネットで検索したが
見つからなかったので。
214デフォルトの名無しさん:03/07/24 18:46

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

http://alink3.uic.to/user/angeler.html
216215:03/07/24 18:59
ごめん、日付の取得じゃなくて設定か。
それは、システムによって違うな。
プラットフォーム依存する話題はヤメレ!!

まあ、どうしても設定したいのであれば、
system("date -s 2003-07-28");
という手もある(windows/linuxどっちでも動くかもね)
あ、ただしlinuxの場合、管理者権限が必要という罠が...
dateをrootにsui(ry
220デフォルトの名無しさん:03/07/24 21:07
JPEGファイルをコピーする方法を教えてください。

ファイルをfopenでバイナリモードで開き
fgetcで元のファイルを読み込んで、fputcでコピーして閉じたのですが
テキストファイルはうまくコピーできたものの
JPEGファイルはファイルだけが出来て中身がありません。
具体的にはどうすればいいんでしょうか?
>>220
"rb"
222221:03/07/24 21:14
書き込むんだから"wb"も必要か。
>int hoge ; fgets(buffer , sizeof(buffer) , stdin) ; sscanf(buffer , "%c" , &hoge) ;

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

scanf「だけは」使わないくせに
scanfより悪いことを平気でする低脳
>>220
具体的にはどうやったのでしょうか?
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 も無駄。
231225:03/07/24 22:11
>>229
間違ってますでしょうか?

>>230
malloc() に void で確保させても結果に変化はないと思うのですが。
>>231
実際に、printfではどう表示されているの?
それと本来ならどう表示されるはずなの?
>>229
言うだけ無駄な相手だったな
endianは大丈夫なのか。
つーか、ちゃんとタグの解析してるのかな?
236225:03/07/24 22:37
>>232
実行結果は、
0 0 43
0 1 68
:
:
という感じで、一見すると正しい値が得られているようなんですが、
画像の輝度を全て得てからグラフツールでプロットすると
ただランダムな値が出力されているようにしか見えないんです。

>>234
endian がおかしいのでしょうか。
未熟で判断できません。すみません。
237225: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;
}
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';
これ。
243181:03/07/24 23:21
やはり、レスが無い…
>>194の質問に答えられる方、
もしくは、>>201の先が書いてある事が分かる方は、
分かるように説明して下さい。お願いします。m(_ _)m

>>209
知りたいのは、自分の環境での動作ではなくて、
規格上での動作だからです
244238:03/07/24 23:28
解決しました、有難うございます!
main関数で文字列を入力する前に
str=(char *)malloc(BUFSIZ*sizeof(char));
とすると上手くいきいました。
あと、それに加えて>293さんの処理も必要だったみたいです。

>240
私はポインタと配列の違いが良く分かってないDQNなんです
245240:03/07/24 23:32
>>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
ヘー
ポインタの理解は値を代入するところまでで止まってまつ
どうもありがとうです
252181:03/07/25 00:20
>>250
レスありがとうございます。m(_ _)m

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

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

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

>と2chで回答されて、それを信じるのか(w
うむ…そう言われると…。
>>252
「浮動小数点 正規化」辺りで検索しなはれ
254181:03/07/25 00:44
>>250==253?
ありがとうございます。
後は、その辺と、その辺りを中心に、
Cの規格が含まれる記述等を調べてみます。m(_ _)m
>>249
p はポインタ(アドレス+型)で、
i は整数、ということで。
256デフォルトの名無しさん:03/07/25 11:57
> > ans と &ans[0] が等価だ。
>
> 配列と、配列の先頭要素へのポインタが等価なのは、
> 引数として渡された場合に限る。ねんのため。

引数として渡されてなくても、普通に等価のような気がするけどなぁ?
258 :03/07/25 12:11
>>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
http://pc2.2ch.net/test/read.cgi/tech/1058283913/510
これって本当なの?
gccじゃ何の警告も出ないんだけど?
int a[5];
int (*p)[5]=&a;
264_:03/07/25 14:50
>>262
嘘。
&ans は配列ポインタを与える。
>>262
ANSI C 以前の仕様では、&ans と書くと警告を招いたらしい。
CFAQ→ http://www.catnet.ne.jp/kouno/c_faq/c6.html#12
基本的なことで質問
条件式で
(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
プログラムによる数値演算のベンチマーク
http://www001.upp.so-net.ne.jp/y_yutaka/labo/math_algo/calcbench.html
VC++6.0は整数除算の最適化が苦手?
286デフォルトの名無しさん:03/07/26 08:53
>>285
スレ違い
かな
287_:03/07/26 08:54
>>286
まあそうだが・・・
>>284を見てのコメントなので。
>>288
じゃあ初めからそう書けよ。
>>284
>※「最適化あり」の比較は、 最適化によって無駄なループがまとめられてしまっている
>可能性があります。 そのため、純粋な比較にはならないかもしれません。

こいつアセンブラ読めねーアフォだなw
最適化という言葉が出るたびにそこで思考停止する香具師の
頭ん中がせいぜいその程度ということをよく現している秀逸な標本だな。
292デフォルトの名無しさん:03/07/26 10:40
restrict 修飾子についてわかりやすい解説をしている日本語のサイトってありませんか?

> restrict
はつみみです。
ヘ_ヘ ----------------------------
ミ・・ ミ ねこみみです
( )〜
295C初心者: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
それはいくらなんでも勉強不足でつ。
しぇるからよぶ
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
>>301
xとyの値を入れ替える
308301:03/07/26 11:53
レスありがとうございました>>302,303,306,307

たしかにおっしゃるとおりです、書き込んだ直後にやってしまったと思いました
>>306
309292: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(の中身)を代入。
312311:03/07/26 17:59
*textのアドレスでもOK(ひねくれているが)
313たく:03/07/26 22:02
>>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を使うものだ
318314:03/07/26 22:36
>>317
fread,fwriteはどういうふうに使えばいいんですか?
引数が足りないとエラーが出たのですが
319無料動画直リン:03/07/26 22:38
>>318
自分で調べる気がないなら putc/getc でも使っとけ。
>>319
うむ、やっぱりそう説明するのがわかりやすいか。fprintfについても説明があっていいサイトだな。
          _
  .曰    ,.'´ ィ 、 ヽ
  .| |    │ノノリ )) 〉
 ノ__丶   ,{{i(!l´∀`ノ!i  ヘェー
 ||幹||  | | lj|ヽ、ノ! リ
 ||古||  |i!/ ! ノ  〉つ))
 ||雲||  |!\)    l | ̄| ヘェーヘェー
(´∀`)ハハハ
>>321
ワラタ
325デフォルトの名無しさん:03/07/27 04:38
MS-DOS上で、プログラムの動作を確認してるんですが、
例えば、入力したものに応じて結果を出すプログラムの場合、
どうやってその結果を表示させるのかわかりません。
たま〜に「Ctrl+C」で出てくるけど、一回出てきたらそれで終わり。
他のものはエンターキーだけでいけるのだが。
326325:03/07/27 04:41
ちょっと分かりにくいから例を挙げますと、例えば、
「入力した単語の数を数えるプログラム」とかだったら、
MS-DOSのコマンドに単語を適当に打つじゃないですか。
それから、Enterを押しても、改行されるだけで、プログラムの結果
の「単語の数」が出てこないんですよ。
それをたま〜に「Ctrl+C」で成功できるんだが、ほとんどのばあい、
「^C」が出てくるだけ。いってることわかるよね?
327325:03/07/27 04:42
だれか、便利な方法とか、コマンドを知ってたら教えてください。
EXIT
>>325
もしやMS-DOS 1.25か?
言ってること分かんない。
>>326
およそ推測で答えるが、改行が来たら集計結果を表示するように作ってないのでは?
そのプログラムのソース晒してみて。
>>326
とりあえずWindows98やWindowsMeを使うのはやめる。
>>331
^Cを押して強制終了すると以降のものが表示されない環境があるんだよ。
334333:03/07/27 05:16
違う。^ZでEOFだ・・・
>>333
^C じゃなくて改行で出て欲しいんじゃないの?
しかも、たまに ^C で出てくるって言ってるし。
336333:03/07/27 05:18
>>326
強制終了したら表示されなくて当然でしょう(笑)
SIGINTキャッチしているのならまだしも。
その環境ならCtrl+Zだよ。
337333:03/07/27 05:19
>>326
setvbuf(stdout,NULL,_IONBF,0);を追加してみてもだめ?
338333:03/07/27 05:20
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
(´∀`) ハハハ・・
>>345
http://gcc.gnu.org/
これの方がいい
348325: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上で表示させることで、解決できました。
乱数取得する関数を作って、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
ああ、一秒以内にループが実行されたのか。納得。
>>355
お前はなんか解ってない予感。
>>325
Ctrl+Zを2回とか
Ctrl+Zの後でEnterとか
そっち系か?
359デフォルトの名無しさん:03/07/27 14:54
mallocで正常にメモリ確保を行って、その結果を先頭として配列と同じ
ように使っていく(アドレスを++して行く方法)をつかって、どんどん先ま
で使っていくと、パソコンが落ちてしまいます。なぜでしょうか?そういう
物なんでしょうか?(メモリ確保が少ないと問題なく動きます)
>>359
確保した以上に++しとらんか?
そういうもんでしょ。
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;
}
370_:03/07/28 00:23
371デフォルトの名無しさん:03/07/28 00:26
void switch(int* c,int* d){
int temp;
temp=*c;
*c=*d;
*d=*c;
}
>>369 これ、コンパイルできるの?
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
>>375
strchr
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
>>381
intとtempの間の*はいらん
384デフォルトの名無しさん:03/07/28 00:55
for分の,は;に直しました。
385369:03/07/28 00:58
正解を教えてくれたら
中谷美紀丸秘エロ画像をアップします。
memcpy
こういういい加減なやつはまじキエロ
388デフォルトの名無しさん:03/07/28 01:04
>>387
市ね!
お、369の書き込みから1時間以上経ったか。
じゃあ答えを教えてやる。
「switch は予約語」
for もポインタもやってて switch を知らないというのは、
どういう順番で勉強してるのやら興味があるな。
しかもfor{(,,)だしな
一瞬switchの使い方も解らんのかって思った
言うとおりに直してもa[0]、b[0]だけしか交換行なわれななくない?
スマンよく見てなかったm(_ _)m
395369:03/07/28 02:19
>>389様アンドその他
皆様ありがとうございました。
お礼の中谷美紀エロ画像です。

ttp://anan.magazine.co.jp/issue/index.jsp?gosu=1374
3次元には興味はない。
397デフォルトの名無しさん:03/07/28 02:27
>>393
するどい!
398369:03/07/28 02:28
いやー、
みなさんなんで優秀なのに2chなんかやってんですか?
>>397
やりゃわかる
>>381
400_:03/07/28 02:30
401デフォルトの名無しさん:03/07/28 04:41
ttp://www5c.biglobe.ne.jp/~MOGI/algorithm/algorithm02.htm#SEC1
ここの練習問題8-2のサンプルプログラムをC言語で作りたいのですが
うまく見れません。
サンプルプログラムひらいてそこのJavaのソ-スを見ながら真似て
C言語で書いてみたのですが,Javaの知識が無いためかうまくいきません。
どこがおかしいか指摘してもらえないでしょうか?
402401: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");
}
}
403401: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;

}
>>403
randを使う前にsrandで初期化。
randとMath.randomでは値域が違う
406デフォルトの名無しさん:03/07/28 14:28
char*型の文字列をバイナリ形式で保存すると4Byteで
何文字も保存できるんですけど、これって、4Byteで最大
何文字保存できるんですか?
失礼ながら大爆笑
408デフォルトの名無しさん:03/07/28 14:34
告白したいけど、自分に自信がない。それでも胸の奥が苦しくて・・・
そのような方、諦めないで。
ここでは、異性に効果を発揮する香水、合法ドラッグなどがおかれています。
小売価格一万円以上の品が、半額以下の値段で取引されています。
是非ここでゲットして、貴方の気持ちを打ち明けて下さい。
相手の方も、きっとそれを待っていますよ。

http://www.adultshoping.com/index.cgi?id=1057809839
ぇぇっ!
大爆笑ってなんで?
>>409
>>400のリンク先があまりにもおもしろかったから。
>>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
同一プロセスで動かすなよ。
>>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));

ってか、ポインタってのが何なのか勉強しる。
住所でしょ?
マウスポインタ=ねずみの住所=デズニーランド
>>422
勉強汁!
こんな所でポインタ定義論始めんなアフォ
技術評論社 新ANSI C言語辞典 著:平林雅英より

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

住所じゃないの?
演説です
>>426
じゃあ、友達や知人の住所や連絡先を書き記しておくものは、
ポイント帳とでも呼んでいるのですか?
>>426
住所を格納する「変数」
て意味合いで取る場合もあるし、アドレスを指す言葉でもある。
「さんきゅう」と発音すると、「thank you」「産休」「三級」いろんな言葉の意味があるが
前後のやり取りにより、一発で意味わかるやろ?
例えが変でスマソ
まあふつうは「さんきゅう」といったら地下鉄なわけだが。
「さんきゅう」≠「thank you」
>>426
配列の添え字も一種のポインタなのだが、
それもアドレスだと言うのですか?
「さんきゅう」=「sank you」(あなたを沈めた)
内容の存在するメモリへの アドレスのエイリアスじゃないのか。
>>434
じゃあ、マウスポインタはメモリ上のどのアドレスのエイリアスなんですか?
レーザーポインタはどうするんだよ
矢印
ポイントするのにアドレスを使ってんだぼけ
マウスポインターはマウス用のポイントするもの(er)だ





変な説明だ。。。もうやめましょうYO!
それは最近のOSならOSが管理してるんじゃないの?
Pointer とは↓これの事
http://pointer.s12.xrea.com/
ポインは〜赤ちゃんが吸うためにあるんやで〜
(テキストに保存でコピペしたら長すぎたので、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
そうですか。
446442:03/07/28 17:42
どうってことは無いケアレスミスですが、APPの構造体で
「int freeFlg」の宣言は意味がありません。すいませんでしたm(__)m
どうでもいいけど、_1とか_2なんて名前はやめようよ。
448442:03/07/28 17:51
>>447
はい。p1とp2でいいですね。すいません。
>>443
無限ループになりそうだけど、/*様々な処理*/ってところにreturnがあるの?
450デフォルトの名無しさん:03/07/28 17:59
こんなに見えちゃってヤバクない???
http://yahooo.s2.x-beat.com/linkvp2/linkvp2.html
451442:03/07/28 18:02
はい。そのように考えていただいて結構です。
whileの中をグルグル周り、ESCを押され等、ユーザーがイベント操作することで
whileを抜けるようになっています。
452442:03/07/28 18:08
大変すいません。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 回見直すべし。
>>456
80回にまけてくれ。
458442:03/07/28 18:49
>>454
ループ条件が分かりにくかったですね。すいませんでした。
>>456
>ここには書かれていないどこかで・・・
>・・・厄介だな
その可能性があると思い、関係あるソースを洗っていきましたが、見つかりませんでした。
探し方が足りない&開発者による盲点 の症状が出てるかもしれませんがσ(^_^;)

Ps. 
グローバルについては四苦八苦している最中ですので、これから精進いたします。
>>455-456
すまん。
460442: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
>>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! (←ここ注目)

でしたね^^;
ごめんなさい。
ありがとうございます〜
そこで質問してきますね。
467442: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関数は
468442: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・・・( ´ ・ ω ・  ` )
>>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
471442:03/07/28 21:16
>>469さんの用に扱うことはできません(´・ω・`)
ポインタを必ず扱うようにしなくちゃならない関数になってるんでσ(^_^;)
ポインタを渡さない場合、添え字にする i 変数を
色々変化させないと好きなAPPを指すことができないんですよ(´・ω・`)
>>471
& が見えない?

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



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

は、上のだと pApp が変更される恐れがあることを除いて
等価なコードだぞ(C++ だとまた話は違うが)。
>>468
実際にそのバグが出るソースを見ないことには
「どっかで値を壊してるんじゃないの?」としか言えない。

まあソース出されてもたぶん読まないけど…
とりあえず Pyon の引数の型を
PAPP から const App* に変えてみてはどうだろう。
比較関数なら内容を変えることはないでしょ?
475442:03/07/28 21:39
>>472さん。
うんうん。それは分かってるんだけど
Pyonに渡すのは、&App[i]とか、「i」で渡すと不便なんです。
実際は、pApp = App + i; したあとに、多くの処理をして
pAppが保持しているアドレスを#defineで書かれた定数を使い、
変化させてるんです。ちなみに定数はMAX未満です。

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

## 結構大きめなソフトなんで、こちらも説明しずらい部分がありました。
で、問題点となるものを新しく簡潔にしましたので、そちらをお願いしますm(__)m
442の出した質問は無かったことに(´・ω・`)
476442:03/07/28 21:43
>>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]の場所になる可能性はありますか?ここが非常に知りたいんです・゚・(つД`)・゚・

説明が分からないって方いません?σ(^_^;)アセアセ...
481百済 ◆jrisyb5rl6 :03/07/28 22:08
                               ミ     
                       ミ  ( ,,,,,, ∧,,∧   
                    ∧,,∧   η ミ,,゚Д゚彡  
           ミ __    ミ,,゚Д゚彡   (/(/     ミ  /)    
            て"  ミ   ミ つつ     彡      ミ `つ 
             ⊂   ミ    ミつつ 彡          ⊂  つ   
            彡"  ミ                   彡"。γ。ミ  
       ∧,,∧    ∨"∨ 彡                   ∨"∨ 彡   ∧,,∧     / ̄ ̄ ̄ ̄ ̄
   ( ,,,,,ミ,,゚Д゚彡                                   ミ,,゚Д゚彡  < 百済参上! 
  ⊂,,,,,,,,,,,,,,,つつ                                    ミ  ,つ    \_____
 彡                                          〜ミ ,ミつ  スタッ !
  ピョン!                                         (/         
482百済 ◆jrisyb5rl6 :03/07/28 22:09
>>480
> 101個分連続した空き箱を作るんですよね?

100個分だぞ。
483_:03/07/28 22:09
>>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を増やしても、大丈夫になったんですが、
なんでだろーって詳しくわからないんです。

で、ついさっき久々に出て、またエラーなくなりましたσ(^_^;)
486百済 ◆jrisyb5rl6 :03/07/28 22:24
>>485
char Str[100]ならStr[0]からStr[99]まで確保されるはずだけど・・・
487百済 ◆jrisyb5rl6 :03/07/28 22:25
×まで確保
○までの100個分が確保
>百済
あれ。。。そうなんだ

。。。って、試したらそうやったー。何考えてるんやろ俺・゚・(つД`)・゚・
>>488
VBの仕様と混同していたとか
490デフォルトの名無しさん:03/07/28 23:03
printfで " を表示させたいのですがエラーがでます
解決方法はありますか?


printf(" "CENTER" ");
>>490
拡張表記
printf(" "CENTER" ");

printf(" \\\b\"\\\b\\\\\b\\\b\bCENTER\\\b\"\\\b\\\\\b\\\b\b \b");
>>490
\"使って
こう書けば(・∀・)イイ!!
printf(" \"CENTER\" ");
そう言えばこの間、仕事で別会社のヤシが、
>>490と同じ事オレに聞いてきたな…。

プロのクセにそんな初歩的なこともわからないのか?
と小一時間問い詰めてやりたかったが仕事の関係上やめておいた…。
495401: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
496401: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]++;
}
497401: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);

}
>>495 たぶん >>351
っておもいっきり誤読してた
>>497
%d で double 型を表示させようとしてるから
501401:03/07/29 01:13
ヒストグラムがうまくでないのが問題なのですが、どこがおかしいのでしょうか?
502デフォルトの名無しさん:03/07/29 01:17
☆無修正画像&サンプルムービーをどうぞ!!☆
http://yahooo.s2.x-beat.com/linkv/linkv.html
503405:03/07/29 01:19
>>501
randは0〜RAND_MAXまで。
Math.randomは0〜1まで。
乱数の範囲が違う。
sqrtの中に-2があるので、虚数がでないように0〜1の範囲にする。
log(0)は-∞となるので、特別な処理が必要。
504401:03/07/29 01:34
どうも具体的にどうプログラムを書けばいいかわからないのですが・・
教えてもらえないでしょうか?
505401: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
できたー みなさんどうもありがとう 
507405: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」
↑のようにいろいろあるわけだけど、一番上のヤツをダウンロードして
間違いないよな?だれかこれらの違いを説明してくれ。
クソして寝ろ
510508: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
515_:03/07/29 04:41
>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系を使ってやれってこと。
521517: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
わざわざそんなに書いてもらってありがとうございます。
しかし、私にはまだ理解できませんので、少しずつ理解できるように読んで行きます。
できたら、簡単な流れを教えていただけるとありがたいです。
よろしくお願いします。

>>521
PN = 0;の場所が違う
n<=(1/2)が違う
これ、終了するまでどれくらい時間がかかるんだろう。
524522:03/07/29 19:02
1/2じゃないi/2だった
n<=(i/2)が違う
525517: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等無意味な数字も表示されてしまいます。
このソースのどこがおかしいのでしょうか?
>>525
2個目のif文の場所
527517:03/07/29 19:37
>>526
ありがとうございました。
しっかり動くようになりました。

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

達人はこんなのよりもっともっと高速なプログラムを組むんだろうなぁ・・・
>>527
高速な判定法が知りたかったら「メルセンヌ素数」あたりで
検索して見るとよいかと。
ageてしまった。
吊ってくる
>>529
他の人がageにくくなるからそういう書き込みはやめよう。
531517:03/07/29 20:04
>>528
あ、知ってます。
(2^p)-1が素数になる場合、{(2^p)-1}{2(p-1)}が完全数になるやつですよね?
メルセンヌ数を探す方法で完全数を探すのと今見たいに探すのどっちが速いだろう・・・
532デフォルトの名無しさん:03/07/29 20:30
C++ では
 アンダースコアで始まり次に大文字が続く識別子と、
 アンダースコアを2つ連続で含む識別子は、
 処理系や標準ライブラリのために予約されていて、
 また、グローバル名前空間に属す識別子は
 アンダースコアで始まる識別子全般も予約されている
んだけど、C ではどうなってるんですか?
教えて規格博士!
533519: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つ連続で含む識別子は、
>  処理系や標準ライブラリのために予約されていて、
これはおなじ
>>532
規格博士じゃないけど、きいたところによるとアンダースコア二つで
始まる識別子は処理系のために予約されてるんだと思った。
>>534
つまり、アンダースコア全般で始まる識別子までは予約されてない、ってことですね。
ありがとうございました。
>>535
あなたもありがd。
538デフォルトの名無しさん:03/07/29 20:38
__FILE__
犬阪犬
を連想してしまった
すまん>>538
540517:03/07/29 22:33
色々弄ってこんな風になりました。
http://no.m78.com/up/data/up029959.zip
これを、もう少し高速に計算させたいのですができますでしょうか?
それと、このプログラムの出来を評価してもらえると嬉しいです。
>>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を作るにはどうしたら良いのですか
オプションのヘルプを探す。
>>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倍は軽くかかりそうだ
548517:03/07/30 00:07
>>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 系関数)があるので、
それを使ってみてはどうだろう。
それでも凝った検索アルゴリズム使う場合には
どこまで使えるか分かんないけどね。
55872: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;
  }
}
>>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]を使った処理 */
  }
}

で良いと思われるが?
>>558
やっぱりn重ループじゃねーか。
56172: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 ではないんで。
56272:03/07/30 19:24

配列のパラメータのとりうる組み合わせを全て評価関数で評価して、
最も良いものを探すって感じのプログラムなんです。
だからこの場合は 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言語ですし
検索しても見つけられませんでしたし
お願いしますよ〜
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だ
>>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からも使える
>>580
もっと簡単な方法が(スレ違いの為略)
>>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に乗り換えてください
>>592
(ry
>>592
オマエハナー
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 がネタにマジレス権を行使しました。
>>101-604
βακα..._〆(゚▽゚*)
( ´,_ゝ`) プッ >>605
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)
  /* ほにゃらら */

と書くような技法を何ていうんでしたっけ?知ってる人教えてください。
>>610
技法?
技法じゃないが論理積か?
>>610
ショートサーキット
普通後者でかかないか?
614610:03/07/31 22:24
>>611
反応してくれて有難うございます。
>>612
ショートサーキットでした。有難うございました。
ショートサーキット(短絡評価)って技法じゃなくて&&や||の性質では。
>>609
大抵の場合、この程度の時間で処理できればOKという線がある。
で、再帰ではそれを満たさなかったの?という話だと思う。

あと関数呼び出しのオーバーヘッドをなくすよりも
i[0〜n]を使った処理の方を見直した方が余程速度に影響する。
どうせそこでループがしてるんだろうし。
>>609
double をループカウンタに使うのは
数値誤差があるんでやめた方がいいと思うが...。
ループカウンタには int を使って、
同時にそれに対応する double 値が得られる工夫をするべし。

再帰が問題になるかは、実際に再帰してみてから考えれ。
それほど関数呼び出しのオーバーヘッドが問題にならないかもしれないし。
>>617
実際、doubleを制御変数にしていると速度低下を招く罠。
619デフォルトの名無しさん:03/07/31 23:52
最小化をするとタスクバーにアイコン化されるようにする
コードを教えて下さい
>>619
Del厨はDel厨らしくDelスレに帰れ。
http://www.kurims.kyoto-u.ac.jp/~ooura/pi_fft-j.html

typedefを知らない人。#defineでやっちゃっています。
>>619
MFC だけど、MFC じゃなくてもやることは大体一緒。
http://www.kab-studio.com/Programing/Codian/MFCTips/01.html
623619:03/08/01 00:25
>>622
私が聞きたいのはWindowsじゃないんですけど・・・・
香ばしくなってきました。
>>619
>>1
> GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
windowsを購入しようと思うのですが
C言語って使えるんですか?
それとよく聞く「コンパイラ」って何ですか?教えて下さい
627626:03/08/01 01:41
あぁん、釣れない人たちね
628626:03/08/01 01:50
機種はVAIOです。
そんくらいググれ。
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;
}
>>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
祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り

ニーノさんのホームページ作り2
http://ex.2ch.net/test/read.cgi/entrance/1059029010/
ニーノ ◆p9GipySMGk によってラウンジにたてられたこのスレで、

http://page.freett.com/ninogumi/
【ニーノさんのホームページ】
というサイトが作られた。(現在もコンテンツは爆発的に増えてるよ。)

さぁ、君もアイディアを出して、2CHネラーだけの最強サイトをつくろう!

祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り祭り
>>633
わはは。腕がなまってるな、オレ。
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はエスパー
641_:03/08/01 14:04
http://.rarPqQS5byCtf 9,654,651 e1b30988f7a4a9cb0f5495d0731c7878
http://www.rarPqQS5byCtf 9,654,651 e1b30988f7a4a9cb0f5495d0731c7878
いや、あるよ。両方が同じ結果になる事(というか、
argc!=2のときのstrcmpが実行されるかどうか)を、
保証しているのが、ショートサーキット。
ショートサーキットってなんですか?
>>644
短絡、ショート
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コンパイラ作る木はないのん?
652けん ◆gZE4xJJ95c :03/08/01 15:42
>>651
能力、時間、、その他の問題で私一人で作るのは到底無理です。
ソース公開して終わりにするとか、反応があれば
sourceforgeにでもつっこんで終わりにしたら?
654けん ◆gZE4xJJ95c :03/08/01 15:48
>>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の世界で広まりました。しかし、その勢いは全くとどまらず、次第に大型コンピュータやパーソナルコンピュータの世界にも普及していったのです。
659:03/08/01 19:23
B言語には組み込みの型がないんだっけ?とスレ違いな質問をしてみる。
Digital Mars C++をダウンロードしたのですが、それにはMFCが付いていると
聞いたのですが、それをBCC55で使うことはできるのでしょうか?
>>659
extrn mona, wara[], KuSo300t();
みたいな型はあったな
いや、ない。
extrn mona, wara, KuSo300t;
>>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]);
}

こんな感じなんですけど、よろしくです
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

回転数は表示されます。
回転数
の後に変な数字が表示されて終了。

どうしてでしょう???
>>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
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/
このサイトを参考にしているのですが..勉強します
文字列にしたいんだったら、むしろ C 的に言えば
テキストに直したいってことだよな。
そういうことなら sprintf を使えばいいかと。
683悩んでます:03/08/02 03:46
>>680
違うかも^^;あんがと
もとからバイナリなのにそれをさらにバイナリにしろと言われても分からん。
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
>>692
ですね--;
kaiten ってはどう定義してる?
696デフォルトの名無しさん:03/08/02 05:44
>>695
char kaiten[1000];
です!
うーん。
gets 呼んでも入力が来ない、というのは、

1. 既に前にあった入力の内容が残っていた。
2. メモリ内容が何らかの操作で壊されておかしくなってる。
3. gets にバグがある。

の 3 つの可能性があるけど...。

とりあえず kaiten を
char kaiten[1000] = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
って初期化して、
これ以外のが表示されたら 1. の可能性が高いかな?
698_:03/08/02 06:11
699_:03/08/02 06:16
700デフォルトの名無しさん:03/08/02 06:24
>>697
ありがとうございます!!
コンパイルに問題は無いんですけど、
回転数と出た後に変な数が・・・・。

やっぱおかしいんですかね??

でも、独習Cのサンプルコードで試すとちゃんとできるのに・・・。
普通Getsすると、入力を待ってくれるじゃないですか?
それさえもせずに終了してしまう・・・。
とりあえず明日試してまた報告します!
今回の話とは関係ないと思うけど、gets より
fgets(kaiten, sizeof kaiten, stdin);
を使った方が安全。
702_:03/08/02 07:22
703_:03/08/02 08:09
>>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の場合で、この場合、ナルキャラが見つかるまで出力しつづけることになる。
#或いは容易にメモリ領域を突破して異常終了する。
>>704
混乱って?
>>706
混乱とは、gets()を使う選択肢を残している香具師の状態のことだ。
708デフォルトの名無しさん:03/08/02 09:15
C言語においてgets()ほど邪悪な関数は無い。
それでも懲りずに(σ´∀`)σゲッツ!!
バッファがあふれるからgetsが嫌いって奴
得てしてデータとりこぼす関数は平気で使う
データとりこぼす関数ってなに?
http://www.catnet.ne.jp/kouno/c_faq/c12.html#18

scanfとgetsを混ぜるべきではないというのはC FAQにも書かれていることだね。
gets関数ってコンパイラのオプションによっては警告出る?
そういうコンパイラも、広い世の中にはあるかも知れない。
>>712
使用するとってことか?
うちのgccはデフォルトででるね。あぶねーから使うなと。

scanfやprintfでフォーマットと引数の対応がおかしいと警告してくれるのがうれしい。
それlibcが出してるだけじゃあ……
>>715
んん。コンパイル時に警告が出るからlibcは関係ないような。
と思って確認してみたらリンカが出してる模様。
>>716
前半に突っ込んでるだけど……
>>715
細かいところにつっこむねー
>>712はそういう意味で聞いたのか?
>>715は「コンパイルしても動かないんですけど。」という質問に「コンパイルしただけでは動かないでしょうね。」と答えそう。
>>718
libcが出す警告にコンパイラは関係ない
721715:03/08/02 13:41
明らかに勘違いしてるようだから突っ込んであげだら、
何か必死なレスが返ってきた。(´・ω・`)ショボーン
>>720
ldじゃなくて?
>>722
ldがlibcの警告を見てるだけ
スレ違いですが質問させてください。
rc=ランコマンドって何ですか?
起動時に実行するコマンド
726724:03/08/02 15:24
>>725
すいませんそれは例えばどんなことですか?
あるプログラムが自動的に最初に読み込んで実行する、設定用のファイル。
たとえばbashの~/.bashrcなど。
728724:03/08/02 17:09
>>727
じゃrcはないよりあったほうがいいのですね。
729693:03/08/02 17:46
>>704
自分も学校に入ってgccでやってるんですけど、getsは使うな見たいな警告が出ます。
ご指摘されたとおりにやってみようと思います!!

また後ほど!
【徹底的】プログラマーが語るviとemacs 4【バトル】
http://pc.2ch.net/test/read.cgi/prog/1059814696/
浦東戸新鳩南川赤志王王西駒本東後飯市四永溜六麻白高五戸荏旗長洗石雪御久千池蒲京糀大穴天羽羽
和川塚井が鳩口羽_子_が_駒大楽田がつ田池本布金輪反越原の_足川谷嶽が鳥__浜_鳥守空田田
美口安宿谷が元岩_神_原_込前園橋谷谷町山木十高台田銀中台_池台大山原町__蒲_居稲橋空西
園_行__谷郷淵茂谷子_込_______王一番輪__座延_原__塚___上田田谷_荷_港タミ


●――――――●――――――――●●●●●――――●―――――――――――●―――――●●空特
●――――――●――――●―――●――●―――――●――●――――――――●―――――●●特快
●●――●――●――●―●――●●●●●●●―●―●――●―――●――――●●―――●●●快速
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●各停

←――――――→←――――――――――――――→←→←――――――――――→・←――――→
.     ↑                 ↑           ↑         ↑        ↑    ↑    
.     埼                 営           営         東        京    京    
.     玉                 団           団         急        急    急    
.     高                 南           池         池        蒲    空    
.     速                 北           上         上        田    港    
.     線                 線           線         線        線    線    
                                               
fgetsしてatoiだあ? 恥を知れ低脳
>>732
じゃあ高脳なやり方キボンヌ。
scanfでいいじゃんって感じ?
ふつー strtol
atoi はクソ
736今日のトリビア:03/08/02 19:29
C言語のgetsはダンディ坂野が作った関数である
読み方は「ゲットエス」でも「ゲットストリング」でもなく「ゲッツ」である

実際に聞いてみた。
(σ´∀`)σゲッツ!!(σ゚Д゚)σゲッツ!!
確かにゲッツであった。
んで、なんでatoi()はダメなの?
atoi() はエラーを返さないから。
>>738
strtol()ってエラー返したっけ?
どこまで読んだか、オーバーフロウやアンダーフロウを起こしたかどうかを知ることはできる。
オーバーフロウ→下呂
アンダーフロウ→
742693:03/08/03 03:49
とりあえずgetsはあきらめました。
scanf で全てやるとうまくいきました!
743デフォルトの名無しさん:03/08/03 04:51
あのぉ、cと関係ないかもしれないのですが、コマンドプロンプトとかなんでもいいですが
EXEを実行するときにコマンドラインから日本語を入力する事ってできるんですか??
745デフォルトの名無しさん:03/08/03 05:22
>>744
ググッてみるべきでした!
どうもですm(__)m
Alt+
定義した構造体型の実行コードは、仮想記憶上
関数の実行コードと同じ場所(コード領域)に置かれるんですか?
「構造体型の実行コード」って何?
「構造体型の実行コード」
サパーリわからん
750749:03/08/03 09:52
などというと不勉強だと言われるな。
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だべ!!でも、比較結果で左辺の方が小さい
とかもあるんだけど、文字コードで比較してんのかな〜
>>759
ウソを教えるな!!
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との違いのせいかな?それとも根本的に使い方
間違ってる?どなたか教えてくれやさい。
へー
766751:03/08/03 11:43
>>753
ありがとうございます
さっそくWin32SDK探してきます
>>764
ごめん。これもc=func(a,b)じゃなくてstrcpy(c,func(a,b))だね。
>>754のおかげで気づいた。ありがとう>>754
そいつはすげーや
>>767
cの定義はなおさないのか?
>>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型の配列
>>786
追加・左辺は配列じゃなくていいや。
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になってしまう
何でですか?
>>789
aに2を代入していたあとに表示しているから。
791:03/08/03 17:23
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;
}
793:03/08/03 17:36
>>792 サンクス!
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
非常に申し訳ない事に・・・・・出来た。てへ、ごめんよ
>>802
人間として、ね
805:03/08/03 19:14
>>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が大文字小文字を区別しないならまた話は別だが。
>>804
ま〜ま〜


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
>>812
試してみます!
>>811
数字を文字列にしたいんです。
>>811 がいいと思うけど
>>813
数字=数を表す字⊂文字
816_:03/08/03 22:10
817デフォルトの名無しさん:03/08/03 23:28
int2strってどうやって使うんですか??
818813: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

と表示されて、一向に前にすすみません。
どうすればいいのでしょうか?教えてください。
>>820
コンパイラはな〜に?
822初心者:03/08/04 02:17
>>821

LSICです。

とにかくhttp://www.lsi-j.co.jpからダウンロードしました

よろしくお願いします。
パスが通ってないだけじゃ…
>>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
      ↑          ↑          ↑
826813:03/08/04 02:35
すみません。また質問です。sprintfでint型の物はchar型に変換できたのですが、double型の物をchar型にどうやって変換するのでしょう??
>>826
sprintf
828813:03/08/04 02:45
>>827
どうやればいいのですか??

例えばa=100.1234123131213131・・・・・・のようなdouble型で
char b[100000];

sprintf(b,"%f",a);
コレで出来るのでしょうか??
doubleなら%lfとかだな
うそ教えちゃダメ
831813:03/08/04 03:20
大まかできたのですが、

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");
}
}
836813: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が入力されてしまいます。
どうすれば・・・。

837813: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
とあるのですがどう対処したら良いのかわかりません
宜しくお願いします。
static int conp(char *, int, int, lcomposition *);
削って宣言してみては
840これは一体..:03/08/04 05:38
>>839
やってみましたが状況変わらずです;;
定義じゃなくて宣言だよね。どうでもいいけど。
842これは一体..:03/08/04 05:52
>>841
正しい呼び方が分かりました^^
conpがtypedefで再定義されていないか
21行目以前の構文は正しいか(;を付け忘れていないか)
漏れが思いつくのはこれくらい
844845:03/08/04 06:09
放置ですか?
845_:03/08/04 06:16
first, that's your business.
847これは一体..:03/08/04 06:21
>>843
結論がまだでていないのでまたこのスレで報告します。
848_:03/08/04 06:36
>>838
トラブったときの基本
1つずつ外してチェック
1つずつ単体でチェック
850これは一体..:03/08/04 06:58
>>849
はい 今回は冒険しすぎました><
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);
→改行されない
853初心者:03/08/04 11:15
>>824-825

本当にありがとうございます。試してみます。
854初心者:03/08/04 11:18
>>824-825

無事できました。
2ちゃんねるにもこのような心優しいお方がいることに感動しますた。

普段はニュー速にいるからあまり感じないですが・・・・
855デフォルトの名無しさん:03/08/04 11:21
>>852
つまり何にもしないってことですか?
#ifdef hoge
こいつを通すために、
#define hoge
とすることはよくある。
ま、別に適当な値を放り込んでもいいんだけどサ。
857852:03/08/04 11:32
>>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と同じだけど。
>>854
無意味に喧嘩腰の奴もいるからな。
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回目かよ。もうちょっと勘を使えよ。");

}


868_:03/08/04 16:51
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でなければ)
>>873
10の倍数で割った余り。
876875:03/08/04 17:05
ちょっと違うか。
int i=45678;
printf("%d\n",i/1000%10); /* 5と表示されるはず */
変数をvoidで宣言するとどんないい事があるんですか?
>>877
できるのか!?と思って試してしまったじゃないか。
あ、スンマセン、構造体でのポインタ変数の事です。
>>879
ああ、void *か。
どんなポインタでも代入できるので、よく汎用的な配列を扱う関数で使う。
memmove,memcmp,qsortなど。
これらの関数の引数がもしも特定の型のポインタ(int *とか)だとしたら、呼び出し側でキャストしないといけなくなる場合がある。
あとmallocの戻り値もvoid *だね。
881873:03/08/04 17:20
>>876
ありがとうございました。できました。
余りを求める「%」って今まで使ったことなかったです。
>>880
どうもありがとうございました。
最初脊髄反射的な質問してしまってすみませんでした。
883デフォルトの名無しさん:03/08/04 17:51
forループ内で、forの初期設定部の値を変化させることはできるんでしょうか?

たとえば、for( i = 0 ; i < 11 ; i++);

とかなっているところに、for関数内のコードブロックで、i=0
に戻して永遠とループさせることとかってできますか?
>>883
出来るけどさ
無限ループならwhile文使おうよ・・・
885883:03/08/04 17:57
>>883
あっと、初期設定部ではなくて、何回かループした
ところで、i=0に戻してもう一度最初からループさせることは
できますかということでした。
>>883
やればわかるkと聞くなよ
887_:03/08/04 18:01
888883:03/08/04 18:08
やってみてできないんだけど、
宿題でforループを使ってやりなさいって
指令が下ってるもんで。

しいませんでした。
iに-1代入すれば?
890ヽ(´ー`)ノ:03/08/04 19:05
単に for(;;) すればいいとかそういう話か?
単にwhile(1)にすればいいとかそういう話か?
>>891
利用されない定数があります。
>>883
>永遠とループさせる

永遠にループさせることはできるかもしれませんが、
永遠とループさせることはできないと思われます。
>>883

for (i = 0; i < 11; i++) {
i = 0;
}
お待ちなさい。

>宿題でforループを使ってやりなさいって
>1
896883:03/08/04 19:51
使えない奴ばっか
for(;;) {
printf("永遠\n");
}
MinGWのソースってダウンロードできるの?
通報しました
VC++じゃコンパイルできないんだよね
902デフォルトの名無しさん:03/08/04 21:46
iconvの使用方法を教えていただきたく質問させていただきます。
iconvでEUCからSIJSに変換したい

unsigned char *ps; *EUCのデータが入ったバッファの先頭アドレス
chardst[48]; *変換後のデータを格納するcharの配列

こんな条件でやりたいのですがご指導お願い致します。
904898:03/08/04 21:57
>>900
すいませんがそのどれですか?
>>902
iconv使ってるソースをパクって...いや参考にすれば?
iconv では役不足です。
>>902
マニュアルくらい読めよ。
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
>>918
戻り値と言っているのにわからないの?
921質問age:03/08/05 01:05
>>920
受け取った側っつー事け?
質問の仕方が厨房すぎ
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 */
>>926
そんな便利な事できんの?
>>927
int a[10]={0};は最初のa[0]に0を入れて、後、入れてないとろは勝手に0になるってことですね
ありがとうございました
>>927
そういう事ってmallocとかで配列用のメモリ確保した時にもできれば
便利なんだけどな〜
calloc
nullpo
あのさー、ハードディスクの上に仮想メモリってあるじゃん?じゃあさ、
メモリを超える量確保しようとしたり、腸デカイ配列とか宣言したらさ、
勝手にハードディスクの上を使おうとするのかな?
あと、自分からハードディスクをメモリとして使えたりするの
934デフォルトの名無しさん:03/08/05 02:04
  ∧_∧
 ( ´∀`)
>>933
それはC言語とは関係ない。
  ∧_∧
 ( ´∀`) < nullpo
>>935
そうなの?
どっちかってーとOSの話ですな
OSの話かな。
>>937
mmapとかで検索してみろ。
941898:03/08/05 15:19
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
>>943
gets()なんか使うな!
947デフォルトの名無しさん:03/08/05 20:58
>>943さんありがとうございます
すみませんまだよくCについて理解してないんで・・・
strcmp()って何ですか?

>>945さんありがとうございます
まだちょっと試してないんですけど
それは文字列でもできますか?

>>946さんありがとうございます
gets()以外でほかにありますか?
今自分が知ってるのはscanf()とgetchar()とgets()
くらいしかないんですけど・・・
948943,947:03/08/05 21:00
943=947です。

それと947での発言で943って書いたところ944です。
すみません
>947
gets() を使うなら fgets() の方が良いよ。
http://www.bohyoh.com/CandCPP/C/Library/index.html
>>947
文字列の比較を行うのがstrcmp
Cは文字列の比較も関数を使う。


新スレ立ててくるか。
>>947
>>1のリンクにある、C FAQ 日本語訳 は目を通しましょう。今は分からなくても。
聞く前に試しましょう。わからないことがあったら調べましょう。
952デフォルトの名無しさん:03/08/05 21:19
953944:03/08/05 21:36
>>947
>>950がすでに言ってるけど、参考までに。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strcmp.3.html
954947:03/08/05 21:54
>>949さん
>>950さん
>>951さん
>>952さん
>>953さん
ありがとうございました。
いろいろなサイトに回ったり、家にあった本などの索引など利用して
どうにかできました。
結局strcmp()使って解決しました!
知らないいろいろなキーワードからいろいろな世界が広がりました!
ためになることなど知れたので、ありがとうございました!
955デフォルトの名無しさん:03/08/05 23:02
任意の文字(アルファベト)を発生する関数ってなんか
ありましたか?
956デフォルトの名無しさん:03/08/05 23:05
 ∧_∧  ∧_∧
ピュ.ー (  ・3・) (  ^^ )(^ё ^)<これからも僕たちを応援して下さいね(^^)。
  =〔~∪ ̄ ̄ ̄∪ ̄ ̄ ̄ ̄〕
  = ◎――――――――◎                      山崎渉&ぼるじょあ&みんちぇ
>>955
よくわからん。
ランダムにアルファベットを発生させたいのか?
958957:03/08/05 23:08
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[(int)((double)rand() / ((double)RAND_MAX + 1) * 52)];
こうか?
959GET! 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      
★☆                       
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
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")とかでどうなんだろう。

詳しい人よろしく
>>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

>>975 は30代
981976:03/08/06 10:13
皆さん勉強になりますM(__)M
ありがとうございました、もう少し勉強してみます!
982976:03/08/06 10:20
結局、
scanf("%s",&f);
s=atoi(f);

でバグらくなりました。
>>982
scanf("%d",&d); でゼロが帰ってきたら他のものが入ってるってことになる。
scanf("%s",&s); しとけば、%dでとれなかった文字列がとれる。
そしてバッファオーバーラン。
985次スレ案内:03/08/06 11:25
C言語なら俺に聞け! Part 63
http://pc2.2ch.net/test/read.cgi/tech/1060085935/l50
うんち
uma-
ume-
989次スレ案内:03/08/06 22:37
C言語なら俺に聞け! Part 63
http://pc2.2ch.net/test/read.cgi/tech/1060085935/l50
なんかエラーが厳しいぞ
カウントダウン開始

10
9
8
7
8
6
9
7
1000!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。