C言語なら俺に聞け(入門篇) Part 5

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 4
http://pc8.2ch.net/test/read.cgi/tech/1162999861/l50
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/

関連スレ
C/C++の宿題を片付けます 77代目
http://pc8.2ch.net/test/read.cgi/tech/1164079451/l50
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/l50
【初心者歓迎】C/C++室 Ver.33【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1164376287/l50


2デフォルトの名無しさん:2006/12/02(土) 10:25:47
2げっとずざー
3デフォルトの名無しさん:2006/12/02(土) 13:06:06
ズサーc⌒っ・ω・)っ
4ぴゅあ:2006/12/02(土) 15:25:35
前スレ#987,#988
http://pc8.2ch.net/test/read.cgi/tech/1162999861/987-988

好みと言ってしまえば好みでもあるのだろうし
レスするまでのものでもないと思うけど
for (i = 0; i < 15; i++) {
 if (i > 0)
  fputc('\t',output2);
 fprintf(output2, "%d", bin[i]);
}
とかの方がやりたいことがスッキリ読めるような気もする…
5デフォルトの名無しさん:2006/12/02(土) 15:30:03
>>4
最後に改行打たないとだめらしいお
6ぴゅあ:2006/12/02(土) 15:51:52
(>>5より)
じゃあそれも追加しといて
forの中の話だけ挙げたので
7デフォルトの名無しさん:2006/12/02(土) 16:03:04
毎回ifで判定するのって無駄じゃない?
8デフォルトの名無しさん:2006/12/02(土) 16:24:59
数値を繰り返し入力し、合計、平均をその都度表示する
ただし、0を入力すると終了する
っていうプログラムを作りたいんですけど
0を入力すると終了ってとこはわかるのですが、
平均を出すときにどうやって今まで入力した回数を
指定するかがよくわかりません

#include<stdio.h>
int main(void){
int goukei=0;
int tokuten;
scanf("%d",&tokuten);
while(tokuten!=0){
goukei=goukei+tokuten;
printf("goukei=%d\n",goukei);
scanf("%d",&tokuten);
}
return 0;
}

ここからどうすればいいんでしょうか
よろしくお願いします
9デフォルトの名無しさん:2006/12/02(土) 16:30:44
#include<stdio.h>
int main(void)
{
  int goukei;
  int tokuten;
  int cnt; // ここ追加、カウンターを追加
  goukei = tokuten = cnt = 0;
  do {
    scanf("%d",&tokuten);
    if (!tokuten) break;
    goukei += tokuten; // 追加の場合これでおk
    cnt++;
    printf("goukei=%d, heikin = %d\n",goukei, goukei / cnt;);
  }
  return 0;
}
10デフォルトの名無しさん:2006/12/02(土) 16:35:33
>    printf("goukei=%d, heikin = %d\n",goukei, goukei / cnt;);
>  }
の部分修正、whileつけて
    printf("goukei=%d, heikin = %d\n",goukei, goukei / cnt;);
  }while (1);

またはdo〜whileの部分を
  scanf ("%d", &tokuten);
  for (cnt = 1; tokuten; cnt++)
  {
    goukei += tokuten;
    printf ("合計=%d, 平均=%d\n", goukei, goukei / cnt);
  }
でもいいと思うよ

数字を入力する部分を
  char str[64]; // 文字入力を数字に変える
  gets (str); // 文字入力を受け付ける
  tokuten = atoi (str); // ここで文字列をintに変える
としてもいいと思う
11デフォルトの名無しさん:2006/12/02(土) 16:36:49
>>9
ありがとうございます

それで、教えてもらってる身でこんな事言うのは
非常にあつかましいと思うのですが、
あんまり高度な事やっちゃうと先生に変な期待もたれそうで怖いので、
もし、もうちょっと簡単な方法ってありますでしょうか?
本当にすみません我侭言ってしまって・・・
12デフォルトの名無しさん:2006/12/02(土) 16:39:41
大丈夫。平均値を整数で出してるから。
あと、心理学の実験によると期待されているほうが成績がよくなるらしいぞ。
13デフォルトの名無しさん:2006/12/02(土) 16:40:00
>>10
すみません、リロードしてませんでした
これまた難しい方法なんですねorz
授業だとcntとか習ってないのでたぶんもっと簡単な方法でやるんだと思うんですが、
もしかしたら先生の意地の悪い宿題かもしれないです・・・
14デフォルトの名無しさん:2006/12/02(土) 16:43:15
>>11,13
スレ違い
 C/C++の宿題を片付けます 77代目
 http://pc8.2ch.net/test/read.cgi/tech/1164079451/


入力を文字列でして、数字に変える方法は便利、というかエラーになりにくい。

俺も良く分からんがバッファに関して優しいのかな。

表面上は些細な違いだが、内部の事を考えると高度な違いになるんで、
これやらなければ目をつけられる事無いでしょ

cntはcount(カウント)で良く略字として使われてる
なので、この部分を初心者っぽく"kaunto"とすればバレないぜ
15デフォルトの名無しさん:2006/12/02(土) 16:46:20
>>14
C/C++っていう言語のスレかと思ってましたorz
スレ違いすみませんでした・・・
16ぴゅあ:2006/12/02(土) 16:48:01
>>11
>あんまり高度な事やっちゃうと先生に変な期待もたれそうで怖いので
>>9(>>10の訂正付き)でいいんじゃないかと思いますよ
後は提出までにコードを理解しておくこと

1個穴があるだろうと思うけど

>scanf("%d",&tokuten);
の前で"tokuten = 0;"とかするのがよかったりするんじゃないのかなとか思ったりするけど
そこんところはそのまま穴にしておいてもいいんだろうけど(先生からの指摘を待つ?)
「そこは人から教わりました」(理解できてたなら)でもOKだろうと思いますよ
17デフォルトの名無しさん:2006/12/02(土) 16:51:53
>>16
そうですね・・教えて頂いた方法でやってみようと思います
とても助かりました
本当にありがとうございました
18デフォルトの名無しさん:2006/12/02(土) 16:53:34
cnt → kaisu
cnt++ → kaisu = kaisu + 1
ってすれば初心者っぽく見えるよ。
19ぴゅあ:2006/12/02(土) 17:01:43
>>17 (追記)
>数値を繰り返し入力し、合計、平均をその都度表示する
>ただし、0を入力すると終了する
という課題を満足させるなら
>>9(+>>10)のコードは最低必要になるだろうし
或いはそうでないなら"解りませんでした"になるのかも

>平均を出すときにどうやって今まで入力した回数を
>指定するかがよくわかりません
の"指定"とは、外から回数を与えたりするのではなく
"平均値を求めるために必要とする回数を得るにはどうすればいいのか"
と解釈しました
20デフォルトの名無しさん:2006/12/02(土) 17:02:09
>>16
ごめん、穴がどこだか俺じゃ分からない
訂正キボン
21デフォルトの名無しさん:2006/12/02(土) 17:10:23
>>8です

↓無事作る事ができました

#include<stdio.h>
int main(void){
int goukei=0,heikin=0;
int a,kaisu=0;
scanf("%d",&a);
while(a!=0){
goukei+=a;
printf("合計=%d\n",goukei);
kaisu++;
heikin=goukei/kaisu;
printf("平均=%d\n",heikin);
scanf("%d",&a);
}
return 0;
}

たくさんの助言ありがとうございました
本当に助かりました
22デフォルトの名無しさん:2006/12/02(土) 17:12:00
>>21
実に上手い
これほど初心者っぽくはなかなか作れまい
23ぴゅあ:2006/12/02(土) 17:15:14
>>20
2回目以降"scanf("%d",&tokuten);"に来たときのtokutenの値って
前回入力された値が入っているじゃないですか

たぶん…
そこでEnterキーだけ押したら前の値が入力されるかも?

・・・と思ったけど"%d"によってそうはならないみたいでした
なので一応>>16の後半は無視かも

ただ、(追求してみないと原因は判ってないけど)
適切な数値を入力→無効な文字(英字の文字列とか)
とするとループになってしまうようですけど
ここが対処できてしまったりするのは
宿題の答えとしては理解でき過ぎになるかも
24ぴゅあ:2006/12/02(土) 17:20:02
>>22
というか…

自身が示した>>8のコードに対して
>kaisu++;
>heikin=goukei/kaisu;
>printf("平均=%d\n",heikin);
が必要と解ったみたいなので
理解できたということだと思う
25デフォルトの名無しさん:2006/12/02(土) 17:20:07
>>23
あぁ、それそれ
直接的には覚えてなかったけどscanfよりgets&atoi使った方がいいってのはそういう事だったんだな
ループ懐かしいな
26デフォルトの名無しさん:2006/12/02(土) 17:23:40
#include<stdio.h>
int main(void)
{
 int goukei = 0,heikin;
 int a=1,kaisu;
 for(kaisu=1;a!=0;kaisu++)
 {
   printf("数値を入力してください。\n>");
   scanf("%d",&a);
   goukei+=a;
   heikin=goukei/kaisu;
   printf("合計=%d\t平均=%d\n",goukei,heikin);
 }
 return 0;
}
27デフォルトの名無しさん:2006/12/02(土) 17:31:34
任意の整数の約数(ただしその整数自体は含めない)の総和を表示するプログラムってどうやるんですか?
28デフォルトの名無しさん:2006/12/02(土) 17:35:40
1から順に余り求めて0なら、割った数を足す。整数自身のときはカウンタ回して飛ばす
29デフォルトの名無しさん:2006/12/02(土) 17:51:37
>26
それだと0のときも合計と平均出すことになるんだけど。
30デフォルトの名無しさん:2006/12/02(土) 17:54:47
#include<stdio.h>
int main(void)
{
 int goukei = 0,heikin;
 int a=0,kaisu;
 for(kaisu=1;;kaisu++)
 {
   printf("数値を入力してください。\n>");
   scanf("%d",&a);
   if(a==0) break;
   goukei+=a;
   heikin=goukei/kaisu;
   printf("合計=%d\t平均=%d\n",goukei,heikin);
 }
 return 0;
}
31デフォルトの名無しさん:2006/12/02(土) 17:57:24
>27
int i, n, sum=0;
for(i=0; i<n; i++) if(n%i==0) sum += i;
32デフォルトの名無しさん:2006/12/02(土) 17:58:12
for(i=0; → for(i=1;
33デフォルトの名無しさん:2006/12/02(土) 18:09:56
>>27
#include <stdio.h>
int add(int a, int b){return a+b;}
int mod(int a, int b){return a%b;}
int func(int n, int d){
if(!d)return 0;
return add(mod(n,d)?0:d,func(n,d-1));
}
int funct(int n){return func(n,n-1)}
int main(void)
{
return printf("%d\n", funct(atoi(gets(malloc(256)))));
}
34デフォルトの名無しさん:2006/12/02(土) 18:53:45
>>25>>26
うるおぼえだけど
int a;
do { scanf("%d",&a); } while( a != 0 );
として入力が 10G みたいになるとscanfは10だけ読んで終了する.
入力バッファに G だけ残るが次のscanfはバッファにはデータがあるけど読めないものだから 0 返して終了しちゃう(バッファもクリアされない)
結果延々ループになる

scanf の後に fflush 入れてバッファクリアすればいい
でも fflush って処理依存だったような気がするけど
3534:2006/12/02(土) 18:54:36
まちがえた
>>23>>25
36デフォルトの名無しさん:2006/12/02(土) 19:03:09
fflushじゃなくてrewindだろ。
fflushは出力に対して使うもの。
37デフォルトの名無しさん:2006/12/02(土) 19:15:45
やりたいことは、stdioバッファに蓄積された(解析できない)データを
行末まで読み飛ばすことだろ。

それなら、
scanf("%*[^\n]");
でいい。
fflush()にしろrewind()にしろ、stdinに対して使った場合の挙動は
移植性が無い。
38デフォルトの名無しさん:2006/12/02(土) 19:21:09
うる覚えじゃなくてうろ覚えだっていうツッコミはナッシング?
39デフォルトの名無しさん:2006/12/02(土) 19:23:51
scanf・・・




┐(´ー`)┌
40デフォルトの名無しさん:2006/12/02(土) 19:29:50
freopen(stdin でOK
41デフォルトの名無しさん:2006/12/02(土) 19:42:29
ポインタはわざと意味不明なこと言ってるんですよね?
42デフォルトの名無しさん:2006/12/02(土) 19:43:29
2択の日本語クイズでやってたな
ナイナイの番組
43デフォルトの名無しさん:2006/12/02(土) 21:35:54
vprintf関数やvsprintf関数は、例えばこれらを中に含んだ関数を作って
出力先が同じ場合に毎回指定する手間を省いたり、独自の関数名を使うことで
出力先を分かりやすくして間違いを少なくするのに利用するんでしょうか?
44デフォルトの名無しさん:2006/12/02(土) 21:43:40
>>43
vprintfの存在意義を確認してるって事でおk?
4543:2006/12/02(土) 21:48:47
>>44
あ、はいそうです
って良く考えなくてもvprintfは出力先標準出力に固定されてますね…
46デフォルトの名無しさん:2006/12/03(日) 02:23:52
>>43
本当に必要になるまで関数の存在意義は分からないもんさ
47デフォルトの名無しさん:2006/12/03(日) 02:27:48
「2つの整数 x と y の全ての公約数を求めて配列 d に格納する関数」
を作りたいのですが、
「2つの整数 x と y の全ての公約数を求める関数」が既にある場合、
その関数を配列dに格納する関数を新しく作るのと
関数を増やさずに作り変えて配列dに入れるのとどっちが楽ですかね?
48デフォルトの名無しさん:2006/12/03(日) 02:28:58
関数でsleepと言うのがあるらしいのですが、
本屋でいくつかC言語の書籍に目を通してもそれに関する記述も無く、
どういった働きなのか、どう使うのか、そもそもC言語で使用する関数なのかどうか
詳しい内容がわからず困っています、
sleepについてお願いします。
49デフォルトの名無しさん:2006/12/03(日) 02:39:51
>>47
1.「二つの整数 x と y の公約数全てを含めた”配列を返す関数”」を作るといいよ
2.既に安定した状態の関数を弄るよりは、それを使った方が可読性が上がる。
  より公約数を割り出す関数を利用する関数を作って配列を返すのがいい、と俺は思う。

ただ公約数って、全部求めちゃった方が楽だよな…
だから、コピって別の名前つけて弄っちゃってもいいと思うよ

>>48
システムコール
50デフォルトの名無しさん:2006/12/03(日) 03:44:11
すみません。
srand(time(NULL));
使ってて、今まではちゃんとした結果を出してくれたのですが、
今同じプログラムを作動してみると、50%ぐらいの割合で、
めちゃくちゃな結果を出します。
どうしたら良いでしょうか?
srand(time(NULL)); 使ったらやばい時間なのですか?
51デフォルトの名無しさん:2006/12/03(日) 03:49:01
>>50
一応キャストして(unsigned)使った方がいいけどそこはあんまり問題じゃないと思う
そんなに大きいソースじゃなければ該当のソースを貼ってみてくれ
52デフォルトの名無しさん:2006/12/03(日) 03:54:37
めちゃくちゃな結果が何を意味しているのかさっぱり見当がつかん。
疑似乱数の初期化なんだから乱数列はめちゃくちゃで当たり前だが。
53デフォルトの名無しさん:2006/12/03(日) 03:55:14
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#include "janken.h"
#include "boardfunc.h"

extern int p_i,p_j;//直前にマークしたx,y座標

//○×ゲーム
main(){
int p_turn;//プレイヤーのターンの時は1
char p_get[10]; //プレイヤーの入力値
int r;//プレイヤーが揃ったか否かを判定結果

srand(time(NULL));

printf("【○×ゲーム】"\n);
do{p_turn = janken();} while(p_turn < 0);
if(p_turn){writeBoard();}

for(;; p_turn = !p_turn){
if(p_turn){ //プレイヤーターン
do{
printf("場所を指定して下さい(例:a2) > ");
scanf("%s",&p_get);
}
while(!writeMark(p_get));

54デフォルトの名無しさん:2006/12/03(日) 03:56:17
}
else{ //コンピュターターン
writeCompMark();
printf("コンピュターは・・・ %c%d\n",p_j+96,p_i);
}

writeBoard();
r = judge();
if(r != 0){break;}
}

printf("\n==========ゲーム終了=========\n);
if(r == -1){printf("\あいこですn");}
else{
if(p_turn{printf("プレイヤーの勝ち!\n");}
else{printf("プレイヤーの負け!\n");}
}

return 0;
}


55デフォルトの名無しさん:2006/12/03(日) 03:58:15
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
10-4.c:
エラー E2209 10-4.c 5: インクルードファイル 'janken.h' をオープンできない
エラー E2209 10-4.c 6: インクルードファイル 'boardfunc.h' をオープンできない
エラー E2206 10-4.c 18: 不正な文字 '\' (0x5c)(関数 main )
エラー E2121 10-4.c 18: 関数呼び出しに ) がない(関数 main )
警告 W8065 10-4.c 19: プロトタイプ宣言のない関数 'janken' の呼び出し(関数 main )

警告 W8065 10-4.c 20: プロトタイプ宣言のない関数 'writeBoard' の呼び出し(関数 ma
in )
警告 W8065 10-4.c 28: プロトタイプ宣言のない関数 'writeMark' の呼び出し(関数 mai
n )
警告 W8065 10-4.c 32: プロトタイプ宣言のない関数 'writeCompMark' の呼び出し(関数
main )
警告 W8065 10-4.c 36: プロトタイプ宣言のない関数 'writeBoard' の呼び出し(関数 ma
in )
警告 W8065 10-4.c 37: プロトタイプ宣言のない関数 'judge' の呼び出し(関数 main )
エラー E2380 10-4.c 41: 文字列または文字定数が閉じていない(関数 main )
エラー E2121 10-4.c 42: 関数呼び出しに ) がない(関数 main )
警告 W8070 10-4.c 49: 関数は値を返すべき(関数 main )
*** 6 errors in Compile ***

こうエラーが表示されてしまいます。
誤り箇所など、ご指摘お願い致します。
行数を見ても、何処がどう違っているか、わかりません。
56デフォルトの名無しさん:2006/12/03(日) 04:00:24
エラー E2209 10-4.c 5: インクルードファイル 'janken.h' をオープンできない
エラー E2209 10-4.c 6: インクルードファイル 'boardfunc.h' をオープンできない

janken.hとboardfunc.hが無いから、ちゃんと読めるように同じ階層に入れてあげて
5753-55:2006/12/03(日) 04:02:02
すみません、分割しているので
訂正箇所が
エラー E2206 10-4.c 18: 不正な文字 '\' (0x5c)(関数 main )
エラー E2121 10-4.c 18: 関数呼び出しに ) がない(関数 main )
エラー E2380 10-4.c 41: 文字列または文字定数が閉じていない(関数 main )
エラー E2121 10-4.c 42: 関数呼び出しに ) がない(関数 main )
警告 W8070 10-4.c 49: 関数は値を返すべき(関数 main )
*** 6 errors in Compile ***

だけになります。
5853-55:2006/12/03(日) 04:03:47
>>56
今のところ、#include "janken.h"
#include "boardfunc.h"

はまだ書いていません。
59デフォルトの名無しさん:2006/12/03(日) 04:04:41
>>58
そかそか、分かった、着眼点が違ったようでスマソ
>printf("【○×ゲーム】"\n);
""の外に\nを書いちゃだめよ
60デフォルトの名無しさん:2006/12/03(日) 04:07:42
C言語の少数に関して質問があります。

小数をバイナリ化した値 "0x40133333" (10進で2.3)
をunsigned intに代入して次のようにして、2.3と表示
されるのを期待しています。

#include<stdio.h>

int main(void){
unsigned int integ = 0x40133333;
printf("%f\n", (float)(integ) ) ;
}
としたのですが、結果はとんでもない値(1075000115.00000)に
なってしまいます。どうしてでしょう??
もともとはバイトオーダの変換をしていてうまくいかず調べ始めたのですが、
ここに行き着いてしまいました。。。orz
61デフォルトの名無しさん:2006/12/03(日) 04:09:25
>>60
printf("%f\n", (double)(integ) ) ;
6253-55:2006/12/03(日) 04:12:04
できました!ありがとうございました。
63デフォルトの名無しさん:2006/12/03(日) 04:12:22
>>51
137行ですが、宜しいですか?
>>52
2次元粒子のシミュレーションです。
10*10の箱に20個の粒子を少しでたらめに配置し、
時間が立った後で20個それぞれのスピードを計算する、というプログラムです。
最初は20個の粒子のスピードを1に設定してるのですが、
マクスウェルボルツマンによればそんなにスピードが速い粒子は無いはずです。
が、自分のプログラムは時たまとてつもでかいスピードの粒子が存在するのです。
64デフォルトの名無しさん:2006/12/03(日) 04:13:34
>>63
それはプログラムがバグっています。
65デフォルトの名無しさん:2006/12/03(日) 04:15:02
>>60
中々いい事してるね
浮動小数点の由来を調べてみるといいかも


詳しくは知らんし俺の推測からだけど
小数点の部分もfloatは格納してるから、
内部をそのまま写すと小数点の部分も整数として評価されるので、おかしくなる
66デフォルトの名無しさん:2006/12/03(日) 04:16:51
>>50>>53-55は別人かよ…全然気づかなかった
67デフォルトの名無しさん:2006/12/03(日) 04:18:38
>>65に追加で丸め誤算が何故起こるかとかも調べるもっと賢くなれる
68デフォルトの名無しさん:2006/12/03(日) 04:22:44
>>60
printf("%f\n", *(float *)(&integ));

ちなみにdoubleは64ビット
69デフォルトの名無しさん:2006/12/03(日) 04:23:24
整数と少数の違いは置いとくとしても
(float)(integ)でどうして2.3が出ると思うのか?
integには整数しか入らないからキャストしても小数点以下は0しか出ない。
70デフォルトの名無しさん:2006/12/03(日) 04:28:19
>>68
なるほど、そんな手が
ってか普通に思いつかない俺があかんな
しかしこの用法が一体何に結びつくのだろう
71デフォルトの名無しさん:2006/12/03(日) 04:30:39
すみません、C言語に於けるマクロの意味を教えて下さい
機械語に変換される前に通るのと置き換えができると
入門書には書かれていますが、いまいちイメージが掴めません
ですので、何か他の物に喩えて、簡単にイメージが掴める様に
説明お願いします。
72デフォルトの名無しさん:2006/12/03(日) 04:41:57
>>71
ここに書いてあるけど;(セミコロン)を書いてはいけないもの
ttp://www.kouno.jp/home/c_faq/c10.html
だってさ

#includeや#define
VBSみたいに特に特殊な意味合いは無いと思う、マクロウィルス?とかみたいなね

ちなみにマクロで良く出てくる((a)?(b):(c))は三項演算という
73デフォルトの名無しさん:2006/12/03(日) 04:41:58
>>71
萌え画像ー>(脳内変換)ー>興奮
           ↑
         このへん
74デフォルトの名無しさん:2006/12/03(日) 04:43:03
>>71
変換される前に通る、って何?
通る=変換だと思うんだが
75デフォルトの名無しさん:2006/12/03(日) 04:45:24
>>74
お前のコンパイラ系は
プリプロセスで機械語に変換しているのか・・よかったな
76デフォルトの名無しさん:2006/12/03(日) 04:47:54
今の流れを満足させるページはこれか
マクロについても書いてある
ttp://mikata.curiocube.com/hello/ch19_comment.html
7771:2006/12/03(日) 05:05:00
ありがとうございます、難しいですね…
マクロウィルス?とかも確かにマクロと付きますね。
なんとなーくはイメージを掴めました。

通るが変換ですた、すんまそ
78ぴゅあ:2006/12/03(日) 05:22:42
>>71
他のものに例えてみるのは考えるのが面倒なのでそのまま書きますけど

>>72が示したページにあるように「機械語に変換される前に」というより
大抵のコンパイラにはコンパイルの段階の前にプリプロセッサによる処理というものがあって
(概ね:プリプロセッサ→コンパイラ→アセンブラ→リンカ)
そのひとつのマクロ処理はソースコードから文字列(トークン)の置き換えを行うもの
(飽くまで文字列(トークン)を文字列のまま扱って置き換えする)
そうそう、エディタで言えば置換機能
その結果として出てきたソースコードがコンパイラに掛けられます

例えば(いい例書けるか自信ないけど)
#define ARRAY_SIZE (5*10)
int array[ARRAY_SIZE];
と書いておくと
int array[(5*10)];
と書いてあったものとしてコンパイラに掛けられる(これのことを"通す"と言っているのかな?)ことになります

>>72
#include,#define等はプリプロセッサディレクティブ
Cで言うところのマクロ処理については#defineディレクティブになるのでは?
これらのディレクティブ(擬似命令)を使って書いたものがマクロであるとかはまず言わないような気も…?
79デフォルトの名無しさん:2006/12/03(日) 05:25:21
質問者が例を言って去った後なのが悲壮感を誘う
感動した
80ぴゅあ:2006/12/03(日) 05:26:27
>>71
ついでにもうちょっと知ってみる材料として
「マクロ #define」辺りでググッてみるとか

取り敢えず最初の方に出てきたりした
http://wisdom.sakura.ne.jp/programming/c/c40.html
http://www.geocities.jp/ky_webid/c/039.html
辺りでも見てみるとかいいかも
8171:2006/12/03(日) 05:33:49
>>78
ありがとうございます!
しかしながら本当に難しいです
特に例を書いて頂いた辺りが、もう一度頭を冷やしてから考え直しますノシ
82ぴゅあ:2006/12/03(日) 05:59:56
>>81
焦らずジックリやってみることですね

>>78に挙げた例とかは実際見てみるまでもなくそうなってるんですけど
例えばVC++なら(今持ってる最新はVC7で)プロパティページで
構成プロパティ→C/C++→プリプロセッサの"プリプロセスファイルの生成"で生成するようにすると
コンパイラに掛ける前のソースコードファイル(拡張子.iのテキストファイル)が得られるので本当にそうなるか見てみるとか
gccなら-Eオプションかな

#includeとか含まれていると見るのが大変になるので
まずは先の例だけ書いてみるとか
更に色々書き替えてみてどうなるかとか

もしかしたら実際にやってみたりする方が感触つかめたりするのかも?
83デフォルトの名無しさん:2006/12/03(日) 07:41:05
邪悪なCコードとか見るとマクロの異常さがよく解る
ただし間違っても自分が書くコードの参考にしないように
マジで
84デフォルトの名無しさん:2006/12/03(日) 08:45:03
>>63
srandがおかしいと言ってるんなら
srandを使用した最小限のプログラムを晒すべき
それでおかしくならないのなら、srand以外のバグだろ
85デフォルトの名無しさん:2006/12/03(日) 09:26:17
#include <stdio.h>
double carnell(double a,double b,double *c,double *d,double *e,double *f){
double bak1;

bak1 = a;
a += b;
*c = a;

a = bak1;
a -= b;
*d = a;

a = bak1;
a *= b;
*e = a;

a = bak1;
a /= b;
*f = a;
return 0;
}
8685:2006/12/03(日) 09:26:49
int main(void){
double c,d,e,f;
double b[2];

c = d = e = f = 0;
printf("数値入力");
scanf("%lf",&b[0]);
printf("数値入力");
scanf("%lf",&b[1]);

carnell(b[0],b[1],&c,&d,&e,&f);
printf("和:%d\n",c);
printf("差:%d\n",d);
printf("積:%d\n",e);
printf("商:%d\n",f);
return 0;
}
8785:2006/12/03(日) 09:28:10
上のはコンパイルはできるんですが
実行しても最後に出てくる数字が0ばっかなんです
初心者なんで良くわかりません
どこが悪いのか教えてください
88デフォルトの名無しさん:2006/12/03(日) 09:35:57
printfの%d
8985:2006/12/03(日) 09:39:14
うはwdクス!!
俺だめじゃんwwwww
90デフォルトの名無しさん:2006/12/03(日) 10:18:08
>>50
srand(time(NULL))は、rand()が返す乱数の種として、そのプログラムの実行時の時刻を使うということ。
(これをやらないと、プログラムを実行するたびに毎回同じ乱数列が生成される。)

君の環境が何かは知らないが、srandやrandにバグがあるとは思えない。
srandはその後のrandの結果に影響するだけ。randは0〜RAND_MAXの任意の値を返すだけ。
rand()が返す値が0〜RAND_MAXであることを確認できれば、
問題は君のプログラムの別の部分にあるはず。

これまで正しく動作していて、ソースを何もいじっていないのに急に動かなくなったなら、
これまでに動かしたときに生成された乱数の列が、たまたま上手く動く(ように見える)パターンだった
というだけだと思う。

ソースをさらしたとして、指摘できるのはC言語の使い方としての誤りだけだ。
そのシミュレーションのロジックが正しく実装できているかは判断しかねるから期待するな。
9150:2006/12/03(日) 10:45:48
みんな、ありがとうございました。
やっぱり、プログラム事態おかしかったみたいです。部分、
   int i,j;
double dx,dy,r_ij,f_ij,fx[N],fy[N];
double x_new[N],y_new[N];
double t=0;
while(t<T_MAX){
t=t+dt;
と書いてあったのを
double t=0;
while(t<T_MAX){
t=t+dt;
int i,j;
double dx,dy,r_ij,f_ij,fx[N],fy[N];
double x_new[N],y_new[N];
と、ループの中で宣言したら書いたらオッケーでした。(でもなんでかわからん)
92デフォルトの名無しさん:2006/12/03(日) 10:53:00
>>91
srand(time(NULL));
がおかしいと思った時はsrandを用いた最小限のプログラムでテストするべき、
それで問題なければ他のところがおかしいとわかる

変数の宣言する場所で結果が変わるなら、
変数のスコープというのについて調べればいいと思うよ。
93デフォルトの名無しさん:2006/12/03(日) 11:02:07
>>91
思いつくのをあげてみると、
・Nがかなり大きな値なら、スタックがあふれているのかもしれない。
 大きな配列はローカル変数ではなく staticをつけて宣言するかmallocで確保すべき。
・原因は他のところにある。初期化していない領域を参照しているとか。
 スタックの配置が変わってたまたま正しい結果が返ってくるようになっただけ。

ちょっとだけESP発動。
10×10の配列の部分てどうやってる?
>>91の中には2次元配列とか、(double *)の配列がないから、
もしかしてdouble x_new[N],y_new[N]; 辺りが10×10のデータを格納するためのもの?
9450:2006/12/03(日) 11:34:03
別スレからロダ借りてきました。正常に起動していると思われます。
vの分布が右にちょっと傾いた山型でピーク時のvが1ぐらいです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3073.c
95デフォルトの名無しさん:2006/12/03(日) 12:08:36
>>94
>vの分布が右にちょっと傾いた山型でピーク時のvが1ぐらいです。
そんな説明で何をやっているのか分かるわけないだろう。
人にソースを見せるなら、せめて各関数の意味と変数の意味ぐらいコメントで書け。
お前はこんなソースを人から見せられて、何をやっているのか理解できるか?
質問をするなら、それを受け取った相手に何が伝わるかくらいの配慮はしろ。

で。
>for(i=1;i<=N;i++){
> fx[i]=0;
fx[N]で宣言したなら、f[0]〜f[N-1]のみが使える。
f[N]にはアクセスするな。
他の配列も同様。
9650:2006/12/03(日) 12:51:17
ごめんなさい。

下のはコメント付けました。
でも日本語だと文字化けしちゃったので、英語です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3075.c
97デフォルトの名無しさん:2006/12/03(日) 13:19:12
>>78
ちょっと難しく書きすぎてないか?
全然読む気が起きない
98デフォルトの名無しさん:2006/12/03(日) 13:20:29
>>96
>>95はシカトか
9950:2006/12/03(日) 13:59:11
>>98
なんかただ小うるさいだけなんですよね。
もう答えてもらわなくていいです。
100デフォルトの名無しさん:2006/12/03(日) 14:15:41
60です。
68の方! 本当に有難うございました。
できましたよー!

ポインタの型変換ではうまくいくのに
どうして(float)(integ)では駄目なのかな。。
10150:2006/12/03(日) 14:21:24
>>99は俺じゃ無いです。

>>99
修正中。。。
10250:2006/12/03(日) 14:23:11
間違え
>>99は俺じゃ無いです。

>>98
修正中。
103デフォルトの名無しさん:2006/12/03(日) 14:28:53
>>100
昇華してWin32まで使うようになる頃になるぐらいになれば理由は分かる

すれ立てるまでもない質問はここで 第79刷
http://pc8.2ch.net/test/read.cgi/tech/1160751859/598,611

これがどうして複製できるのか理解できたら、おまいの疑問に思ってることも解決するだろう
104デフォルトの名無しさん:2006/12/03(日) 14:33:30
>>100
逆に>>60のようにキャストしたい数字の内部表現を知らなかったらキャストできないってことになったら不便だよね

ちなみにわかってると思うけど
1075000115 = 0x40133333
105ぴゅあ:2006/12/03(日) 14:46:01
>>100
キャストとポインタがシッカリ理解できるようになれば解るようになるだろうと思います

"(float)(integ)"はintであるものを"floatに変換"している
"*(float *)(&integ)"はintの領域(4バイト)に格納されているものを"強引にfloatとして格納されたものだ"として取り出している

ということがいずれ解るようになれば

直ぐに解らなくても色々やっているうちに解る時がくるだろうと思いますよ
まだよく解らないと思ったら、これが理解できるまでここで止まってるようなことをしないで
取り敢えず先へ進んでおいて後で戻ってみるのがいいと思います
シッカリ進めていっていれば、あのときなんで解らなかったんだろうと思っている自分が居たりするだろうと思う
106デフォルトの名無しさん:2006/12/03(日) 14:50:22
俺よりも知識あるんだろうし頑張ってるの分かるんだけど
ぴゅあは質問者の事をあんまり考えられないんだな
107ぴゅあ:2006/12/03(日) 15:04:04
>>100
補足
# "*(float *)(&integ)"は…
これはintである(intとして格納されている)ことを無視して、強引にfloatとして格納しているとしているわけで
floatとして格納できるメモリ域さえあれば別にchar[4]だろうが、より大きいメモリ域を取るdouble等なんでもいいわけです
(malloc()で取ったvoid *状態からキャストしても可)

逆に元々のintであることとかを無視してしまっているので、今回の例のように明確に理由がある場合以外では滅多に使うものではないです(というより、使ってはいけません)

この悪い例としては
ポインタを使っているコードで、キャストの部分でエラー(警告)が出るからということで、闇雲にキャストしてエラーを消すということ
エラーは消えたけど、真の意味を無視しているので動くわけないです
意外とプログラマとして仕事している人の中にもポインタを理解している人が少ないチームではやってしまっているのを多く見掛けるようです
ポインタを理解した後でもいいので、気に留めておくといいと思います
10850:2006/12/03(日) 15:06:36
for(i=1;i<=N;i++)の所を
for(i=0;i<N;i++)に変え、

gx[i]=((i-1)/5)*2+2;
gy[i]=((i-1)/1)*2+1 - ((i-1)/5)*10;
の所を

gx[i]=(i/5)*2 + 2;
gy[i]=i*2+1 - (i/5)*10;

に変えました、これでファイナルアンサーで良いですか?
109デフォルトの名無しさん:2006/12/03(日) 15:19:31
>>108
それは知らん。お前のプログラムの仕様はお前にしか分からない。

コンパイルでエラーが無く、プログラムを実行したときに正常終了すれば
プログラムが正しく動いたといえるわけではない。
実行した結果が正しいかを確認する方法くらいは自分で考えたら?
110デフォルトの名無しさん:2006/12/03(日) 15:21:47
>>107
>floatとして格納できるメモリ域さえあれば別にchar[4]だろうが、より大きいメモリ域を取るdouble等なんでもいいわけです
>(malloc()で取ったvoid *状態からキャストしても可)
アーキテクチャによっては、floatとしてアクセスする領域のアドレスがsizeof(float)の境界にあってないと
いけないということも気にしたほうがいい。
111デフォルトの名無しさん:2006/12/03(日) 16:08:02
>>107
何歳だよ…
少しは日本語勉強してくれ
112デフォルトの名無しさん:2006/12/03(日) 17:11:28
>>100
もう見てないかもしれないけど
そんなときには union 使うと便利
union{
float dat_f;
long dat_l;
}integ;
とか
113デフォルトの名無しさん:2006/12/03(日) 17:21:49
>>60,100
ぶっちゃけ、>>110にもあるように、アーキテクチャによっては境界に沿ってない
floatアクセスするとバスエラーになったりするので、こういう目的には
union使うとよろし。

ま、そもそもsizeof(int) != sizeof(float)なら論外なコードなわけだから
その辺突っ込んでも仕方が無い気はするが。

sizeof(int) == sizeof(float)なら、

union U { int ival; float fval; };
とでもしておいて、

u.ival = ....;
printf("%f\n", u.fval);
で大丈夫。

sizeof(int) != sizeof(float)なら、

union U { char bval[sizeof float]; float fval; }
とでもして、intの代わりにバイト配列使えばヨシ。
114デフォルトの名無しさん:2006/12/03(日) 18:00:09
unionの使い道を始めて知った…
115デフォルトの名無しさん:2006/12/03(日) 18:27:08
>>114
どっちかというと邪道な使い方ですから。
116デフォルトの名無しさん:2006/12/03(日) 18:38:03
寧ろ、正道な使い方だと思う。
117デフォルトの名無しさん:2006/12/03(日) 19:51:56
初心者学習のお勧めページとかないですか?
118デフォルトの名無しさん:2006/12/03(日) 19:55:22
ま、↑のはunion使う一番の典型例でないことは確かかな。
といって、邪道というほどでもない。

malloc()の実装などで、境界あわせ目的でunionが使われたりする。
後は、バイト配列と整数型のunionで、バイトアクセス、ワードアクセス両方
可能にするとか。こういうコードは思いっきりエンディアン依存になるけどな。

この類は低水準のコード以外では出て来にくいのは確か。
119デフォルトの名無しさん:2006/12/03(日) 21:59:12
元ネタを書いた60デス。

>(float)(integ)でどうして2.3が出ると思うのか?
>integには整数しか入らないからキャストしても小数点以下は0しか出ない。
ごもっとも。あ゛〜くやしいー。完全に勘違いです。


>u.ival = ....;
>printf("%f\n", u.fval);
>で大丈夫。
スマート! これいいですね!

ぴゅあさんはじめ丁寧な説明有難う御座いました。m(__)m

お礼になぜこんな質問をしたか、を書いておきます。(読み飛ばし可)
X-Planeというフライトシミュレータがありまして、そのソフトにある設定を
するとUDP通信で飛行速度や、飛行している方向を他のPCに転送できる、
というマニアックな機能があります。UDPでのデータ受信は苦労の末できた
のですが、それをfloatに変換するのにてこずって先の質問をさせて頂きました。
しかも送ってくるのがビッグエンディアンで、しかも少数のバイトオーダ変換
について詳しく書いてあるページを探し出せなかったのです。
本来はPerlのunpack関数で出来ると思っていたのですが、、、、あ、これはスレ違い?
120デフォルトの名無しさん:2006/12/03(日) 23:03:42
>>119
バイナリ通信プロトコルなら、ASN.1みたいな規格が参考になるんじゃないかな。
ぐぐってみそ。

んでも通信っつーことなら、そのやり方はあまりよろしくない。
浮動小数点数の表現形式は思いっきりアーキテクチャ依存だから。

それと、エンディアン無視すれば、単にfloatの変数にmemcpy()って手もあるよ。
121ぴゅあ:2006/12/03(日) 23:04:44
>>119
http://pc8.2ch.net/test/read.cgi/tech/1162999861/852
とかに繋がってたんでしょうか
エンディアンが違うだけでfloatで扱えると判っているという前提で
float data;
char *pdata = (char *)&data;
でもよかったかも知れませんね

機会があったらまた見てみるのもいいかも
122デフォルトの名無しさん:2006/12/04(月) 00:34:20
wsprintf と sprintf の違いって何なんでしょうか
wsprintfだと浮動小数点が使えないんですけど、wsprintfに

何か利点があるんでしょうか
素朴な疑問です
123デフォルトの名無しさん:2006/12/04(月) 02:26:15
sprintfはchar型の文字列、wsprintfはwchar_t型の文字列を扱う。
wsprintfが浮動小数点を扱えないのではなく、君のプログラムでの文字列の扱いがおかしい。
とりあえずマニュアル、規格書、ネット、何でもいいからwsprintfが何者かくらいのことは調べたのか?
124デフォルトの名無しさん:2006/12/04(月) 03:30:51
>>123
嘘を教えないように。

wsprintf()はWin32API。
charではなくTCHARを扱う。仕様は標準のsprintf()のサブセットといったところで
機能が貧弱。
VC++は同じくTCHARベースの_stprintf()という関数を提供しており、これは
sprintf()と同等の機能を提供している。

wchar_t系の標準関数は、wsprintf()ではなくswprintf()ね。

wsprintf()を使うべき理由はあまり無いだろうね。強いて言えば、Cランタイムに
依存したくないといったケースかな。
125デフォルトの名無しさん:2006/12/04(月) 10:24:14
>>124
wsprintf は (cdecl 呼び出しできれば) 他言語でも利用可能だね。
126デフォルトの名無しさん:2006/12/04(月) 11:43:46
>>123
調べてない男カックイイ
127デフォルトの名無しさん:2006/12/04(月) 15:27:47
先日面接で仕事の内容はC言語による画像処理だと言われたのですが
これは具体的にどういった作業で、どういった事を知っておくべき仕事なの
でしょうか。イメージがわきません。
ご助言のほど宜しくお願い致します。
128デフォルトの名無しさん:2006/12/04(月) 15:28:01
wavファイルを読み込んで、wavファイル中の音が一番強い部分の時間を
表示させるプログラムが組みたいのですが、どのようにすればいいですか?

音が強い部分をどうやって判定していいかよくわかりません。
129デフォルトの名無しさん:2006/12/04(月) 15:32:29
>128
マルチすんな
130デフォルトの名無しさん:2006/12/04(月) 15:35:22
>>127
仕事先に訊けよw
画像処理と言ったっていろいろあるんだし
131デフォルトの名無しさん:2006/12/04(月) 15:41:06
面接受けた会社が即戦力を求めていれば
訊けば無知なやつだと思われて
落とされる可能性があると思ったのかな
132127:2006/12/04(月) 17:25:18
まさにその通り!>>131
まさか担当の人このスレ見てたらやばいから多くは語るまいぞ。
133デフォルトの名無しさん:2006/12/04(月) 17:32:18
>>132
逆に まーったく適正外の仕事を押し付けられる可能性もある ってことだぜ?
134デフォルトの名無しさん:2006/12/04(月) 18:20:31
>>132
例えば、具体的なキーワードを出されて「そんなのは知りません」ってのはまずいと思うが、
「画像処理」などという抽象的な事前情報しかないのなら、
具体的にどんなことやっているのかを聞くのは悪いことではないだろう

まあ面接前に聞くなり調べるなりしろよって感じはするが
135デフォルトの名無しさん:2006/12/04(月) 18:33:30
>>127
どんな会社かによって全然変わるわけだが。
フレーム間差分オブジェクト抽出とか特徴点検出とかオプティカルフローとか
そういった応用の利く基本的な技術を身に付けておく(車輪の最発明をしておく)といいよ。
136デフォルトの名無しさん:2006/12/04(月) 18:34:55
再発明を一発で変換してくれないMSIMEはやっぱ糞だな。ATOK買うか・・・
137127:2006/12/04(月) 19:22:02
レスありがとうございます。
まあ業界未経験なもんで、どんな仕事でも入り込めれば儲けものと
いうかww
キーワードはぐぐってみます。
もう一度、面接あるのでその時は多少分かっているような
口をきくつもりです。まあ今回で落ちた可能性も大だがwww
138デフォルトの名無しさん:2006/12/04(月) 19:31:50
#if defined

#if def
の違いを教えてくれ。
どう使い分ければいいんだ?
139デフォルトの名無しさん:2006/12/04(月) 20:02:11
140デフォルトの名無しさん:2006/12/04(月) 20:10:18
VC++のMFCはVC++ExpressEditionには付いてないようですが
ExpressEditionを使えるからといってVC++出来ますといって
いいものでしょうか。
141デフォルトの名無しさん:2006/12/04(月) 20:16:23
>>140
VC++ExpressEdition出来ますと言えばいいじゃまいか
142デフォルトの名無しさん:2006/12/04(月) 20:37:55
>>140
普通にMFCやった事ありませんでおk。
もしかしてExpressEditionってSTLもないのか?
143デフォルトの名無しさん:2006/12/04(月) 20:49:26
標準ライブラリはきちんとある。
144デフォルトの名無しさん:2006/12/04(月) 20:51:18
> VC++出来ます
日本語でおk
145デフォルトの名無しさん:2006/12/04(月) 21:00:25
>>143
じゃあいいんじゃね。
俺はMFC嫌い。
146デフォルトの名無しさん:2006/12/04(月) 21:04:11
あんま技術に関係ないトークはマ板でやれよ。
ココはあくまでC言語の話をするスレだろ。
147デフォルトの名無しさん:2006/12/04(月) 22:23:51
どなたかわかるかたお願いします。

const char str[]="sumple-string.";
char buf[strlen(str)];
の定義があり、先頭から5バイトまでを切り出したいので
strncpyで切り出すことを考えています。

strncpy(buf,str,length);

しかしながら、\0が入っていないため、printfが正常に出来ません。
この場合、どのようにしてNULL文字を後部にセットすればよいでしょうか?
もしくは、先頭からxbyteを切り出すのにもっと効率の良い方法がありますか?
尚、lengthにはsize_t で5になっています。

よろしくお願いします。
148デフォルトの名無しさん:2006/12/04(月) 22:27:18
>>147
buf[5] = '\0';
149デフォルトの名無しさん:2006/12/04(月) 22:49:43
すみません、どうもうまくいかないです。。

str:あいうえお len:10
buf:あいうU len:7

こんな感じになってしまいます。
buf:あいう len:6
という出力を期待しているのですが、、

const char str[]="あいうえお";
size_t bytes = 6;

printf("str:%s len:%d",str,strlen(str));

char buf[bytes];

strncpy(buf,str,bytes);

buf[bytes] = "\0";

printf("buf:%s len:%d",buf,strlen(buf));
150デフォルトの名無しさん:2006/12/04(月) 23:03:08
>>149
>char buf[bytes];
サイズが足りない
char buf[bytes+1];
151デフォルトの名無しさん:2006/12/04(月) 23:06:38
>>149
あと
buf[bytes] = "\0";
¥0 はシングルで囲む
'\0'

152デフォルトの名無しさん:2006/12/04(月) 23:13:07
できました!
シングルクオートで囲むのがポイントだったみたいです。

ありがとうございました。
153デフォルトの名無しさん:2006/12/04(月) 23:40:59
strncpy()は仕様が変態的だからなぁ。

strncpy(dst, src, n);
において、
strlen(src) >= n の時、dstはヌル終端されない。
strlen(src) < n の時は、n byteまではヌルで埋められる。
よって、↑の後は、お約束として
dst[n] = '\0'; とすべし。

代わりにstrncat()を使うという手もある。
dst[0] = '\0';
strncat(dst, src, n);
でオッケーだ。strncat()はヌル終端を保障するし、余計なヌル埋めもしない。
154デフォルトの名無しさん:2006/12/05(火) 00:13:46
>139
サンキュウ。
155ぴゅあ:2006/12/05(火) 00:18:08
>>149
目的通りに解決したってことなんでしょうか…

(>>147より)
>先頭から5バイトまでを切り出したい

(>>149より)
>すみません、どうもうまくいかないです。。
>>147とは別の話?

>buf:あいう len:6
>という出力を期待しているのですが、、
で、やりたいことが変わっているような気がするし・・・

全角/半角の意識とかなくてOK?
なんかやりたいことが今一つ見えない気がしたりですけど。。。

いいのかな
156デフォルトの名無しさん:2006/12/05(火) 00:43:22
>147とは別の話?
>やりたいことが変わっているような気がする
おそらく同じ。どちらも、「先頭からnバイトを切り出して別の配列に入れたいが、最後に\0が入らない(printfが正常に働かない)」という内容。しかもstrとbufの使い方が同じ。

>全角/半角の意識とかなくてOK?
「buf:あいう len:6」とか書いてるって事は全角/半角を意識している証拠。

>なんかやりたいことが今一つ見えない気がしたりですけど
日本語で頼む。

>いいのかな
いいんだよ。
157デフォルトの名無しさん:2006/12/05(火) 02:28:19
多重ループの脱出にはgoto文を使うべきですか
for(){
for(){
if(){
goto label;
}
}
}
label:
こういうのをgoto文を使わずに簡単に書くにはどうしたらいいですか
158デフォルトの名無しさん:2006/12/05(火) 02:37:25
ループだけを別の関数に閉じこめてreturnとか?

ま、そこは通常gotoを使うべき珍しいケースの一つだと思うけど。
159デフォルトの名無しさん:2006/12/05(火) 03:02:24
まあ設計ミスだよな。
160デフォルトの名無しさん:2006/12/05(火) 04:20:25
内側のfor文が終わった直後に
おんなじ条件判定かますとか。
若干もったいない気がするけど。
161デフォルトの名無しさん:2006/12/05(火) 04:33:35
ifの中で条件判定を2つとも満たしちゃうとか?
ちと無理やりだが。
162デフォルトの名無しさん:2006/12/05(火) 04:40:35
signed char c=0x0000ff;
としても
printf("c = %x",c);
とすると結果には"c = ffffff"と表示されます
cをunsigned charで定義すればちゃんと"c = ff"となるのですが、どういう違いがあるんでしょうか?
163162:2006/12/05(火) 05:04:41
すみません、WindowsXPでVC++でコンパイルした時の結果でした
164デフォルトの名無しさん:2006/12/05(火) 05:11:07
>>162
cがcharのときはprintfに渡すときはintに格上げされる。
0x0000ffはcharに入れたときは10進で-1だから、
intに格上げされたときの-1の値が入る。それが0xffffffffだ。

# fが2個足りないんじゃないか?

cがunsigned charのときは0x0000ffは10進で255だ。
それがintに格上げされたとして255の値が入る。
そいつは16進で0xffだ。お望みの通りの結果になる。

なぜcharやunsigned charがintに格上げになるのかは、
まあそういう規則だからと思っておけ。
詳しくは関数のプロトタイプの解説をどっかで見つけて読めばいいと思う。
165162:2006/12/05(火) 05:19:33
>>164
確かにfが二つ足りなかったです、すみません
これがintより小さい型は演算を効率よくする為にintにキャストする、とかいうやつですか
単一の引数でも式とみなして処理しちゃうんですね
すっきり理解できました、ありがとうございます
166デフォルトの名無しさん:2006/12/05(火) 05:24:29
>>165
>これがintより小さい型は演算を効率よくする為にintにキャストする、とかいうやつですか

まあその名残だ。今ではそういうルールだからとしか言えないけど。
167ぴゅあ:2006/12/05(火) 07:50:16
>>157
その程度ならまだgotoを使うほどのものでもないと思う
>>159の言っているのに近いというのか、実際に入るロジックからどう練るかによると思うけど
168デフォルトの名無しさん:2006/12/05(火) 09:49:45
>>165
>166の解説はこの場合ちょっと違う。
この場合、式だからintに格上げされるのではなく、可変長引き数だからintに格上げされる。
169デフォルトの名無しさん:2006/12/05(火) 10:15:35
>157
gotoを使うのがベストだと思うな。
170デフォルトの名無しさん:2006/12/05(火) 10:19:02
俺もCなら教条主義的にgoto否定することはないと思うぜよ。
言語が貧弱なんだからしょうがない。

少なくとも多重ループからスマートに脱出する手段をCは提供していないし、
エラー処理もgoto使ったほうがすっきりする場合がある。
171デフォルトの名無しさん:2006/12/05(火) 10:43:05
gotoについては教条的に否定すべきものではないのは同意。
同意の上で、gotoを排除するように努力はすべきだと思う。
その努力の結果、コードがわかりづらくなるのであれば、
それはあなたがまだまだ精進すべきだったか、
あるいはそこにgotoがあるべき場所だったかのどちらかだ。

なんにしろgotoを排除する努力は怠るべからず。
ただし必要とあれば堂々と使うべし。
172デフォルトの名無しさん:2006/12/05(火) 13:21:31
なんで偉そうなの?w
173デフォルトの名無しさん:2006/12/05(火) 13:44:56
テキストファイルをアップして質問をしたいんですけど、どうすればいいですか?
174デフォルトの名無しさん:2006/12/05(火) 13:49:22
BASE64で変換してここに貼ればOK
175173:2006/12/05(火) 13:56:52
I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8dGltZS5oPg
0KDQppbnQgbWFpbih2b2lkKQ0Kew0KICBpbnQgaSxqLHhbNF0seVs0XSxoaXQsYmxvdyxudW1iZXI7
DQogIGludCB0cmlhbHM9MDsNCg0KICBzcmFuZG9tKCh1bnNpZ25lZCl0aW1lKE5VTEwpKTsNCiAgIH
doaWxlKDEpew0KICAgICBmb3IoaT0wO2k8NDtpKyspew0KICAgICAgIHhbaV09cmFuZG9tKCkgJSAx
MDsNCiAgICAgfQ0KICAgICBpZih4WzBdIT14WzFdICYmIHhbMV0hPXhbMl0gJiYgeFsyXSE9eFszXS
AmJiB4WzJdIT14WzBdICYmIHhbM10hPXhbMF0gJiYgeFsxXSE9eFszXSl7DQogICAgIGJyZWFrOw0K
ICAgICB9DQogICB9DQoNCg0KICB3aGlsZShoaXQhPTQpew0KICAgIHByaW50ZigiQ2hvb3NlIGZvdX
IgbnVtYmVycyA6Iik7DQogICAgc2NhbmYoIiVkIiwmbnVtYmVyKTsNCiAgICB5WzNdID0gIG51bWJl
ciAlIDEwOw0KICAgIHlbMl0gPSAobnVtYmVyIC8gMTApICUgMTA7DQogICAgeVsxXSA9IChudW1iZX
IgLyAxMDApICUgMTA7DQogICAgeVswXSA9IChudW1iZXIgLyAxMDAwKSAlIDEwOw0KICAgIA0KICAg
IGhpdD0wOw0KICAgIGZvcihpPTA7aTw0O2krKyl7DQogICAgICBpZih4W2ldPT15W2ldKXsNCiAgIC
AgICAgaGl0Kys7DQogICAgICB9DQogICAgfQ0KIA0KICAgIGJsb3c9MDsNCiAgICBmb3IoaT0wO2k8
NDtpKyspew0KICAgICAgZm9yKGo9MDtqPDQ7aisrKXsNCglpZihpIT1qICYmIHhbaV09PXlbal0pIH
sNCgkgIGJsb3crKzsNCgl9DQogICAgICB9DQogICAgICANCiAgICB9DQogICAgdHJpYWxzKys7IA0K
ICAgIHByaW50ZigiSGl0cyA6ICVkICwgQmxvd3MgOiAlZFxuIiwgaGl0LCBibG93KTsNCiAgfQ0KIC
BwcmludGYoIlRyaWFscyA6JWRcbiIsdHJpYWxzKTsNCiAgIHByaW50ZigiwLWy8qTPIik7DQogIGZv
cihpPTA7aTw0O2krKykNCiAgICBwcmludGYoIiVkIix4W2ldKTsNCiAgcHJpbnRmKCKkx6S3pL+ho1
xuIik7DQogIHJldHVybiAwOw0KfQ0K

上はBASE64で変換したものです。
このプログラムのアルゴリズムを説明しなければならないのですが、よく理解できません。
特に15行目が何をしているのか理解できていません。
このプログラムのアルゴリズムを説明していただけないでしょうか?
176デフォルトの名無しさん:2006/12/05(火) 14:31:46
>>175
15行目は、x[0]〜x[3]に同じものが入っていないかを検査している。
互いに異なるランダムな数字(0〜9)が入っていれば次に進んでいる。
177173:2006/12/05(火) 14:44:01
>>176
ありがとうございます。
この部分だけがどうしても分からなかったので、
ここさえ分かれば後は大体自分でも理解できそうです。
本当にありがとうございました。
178デフォルトの名無しさん:2006/12/05(火) 14:59:14
windowsのマシンからlinuxのマシンにソケット通信で
データを送りたいのですができますか?
179デフォルトの名無しさん:2006/12/05(火) 15:07:40
できるだろ。
180デフォルトの名無しさん:2006/12/05(火) 15:39:30
>>173-176
ワロス
おいおい
181162:2006/12/05(火) 15:41:22
>>166,168
どうもです、色々ルールがあるんですね
182178:2006/12/05(火) 16:03:13
windows側はWinsockで、linux側はどうすれば?
ちなみにwindows側から、linux側に簡単な整数のデータを送りたいのですが
183デフォルトの名無しさん:2006/12/05(火) 16:04:32
BSD socket あるだろ。
ところで、両方のコードを書くのか?
184178:2006/12/05(火) 16:10:45
プログラム始めたばかりの初心者なんでよくわからないんですけど
送信側、受信側で両方のコード書かなきゃだめなんですよね?
185デフォルトの名無しさん:2006/12/05(火) 16:14:04
初心者とか関係ないだろw
送信側のコードだけ書いて送信したら、あとは>>178の脳内で勝手に受信するのか?
186デフォルトの名無しさん:2006/12/05(火) 16:18:38
Linux側にデータを送らなければいけない理由次第。

既に稼動している何かにデータを転送するつもりなら 送信側だけだし
そういうシステムを構築する って話なら Linux鯖 & Windows クライアント 両方書くことになるし
初心者に手が出せる規模でもないような気がする…

1対1接続の Windows(鯖のようなピア) ⇔ Windows(クラ) からじゃね?
C言語はできて当然の前提でネットワークは別の難しさがあるかなな

具体的に詰まってからはコッチだな
ネットワークプログラミング相談室 Port18
http://pc8.2ch.net/test/read.cgi/tech/1159692799/
187178:2006/12/05(火) 16:32:12
linuxサーバのほうで送られたデータをもとに、phpで処理する感じです
ソケットしかないのかなと思ってるんですが、どうなんでしょう・・・
初心者には難しいですかorz
どうしても、学校の製作実験でwindowsからlinuxのほうに
データ送るという処理をやらなければいけなくて
188デフォルトの名無しさん:2006/12/05(火) 16:40:22
わからんならinetdでも使っとけよ
189デフォルトの名無しさん:2006/12/05(火) 16:42:00
Linux側がPHPだと、もしかして通信はHTTPだったりしないか?

プロトコルが何にせよ、Windows側はCよりもC#やJavaの方がかなり楽だ
と思うよ。学校の実験関係だと言語は選べないかもしれないが。
190デフォルトの名無しさん:2006/12/05(火) 17:19:44
HTTPならいくらでもサンプル転がってるだろ
191デフォルトの名無しさん:2006/12/05(火) 17:37:14
Linuxの受け側がPHPってことは、Windows側のクライアントは確実にHTTP。
とすれば、Perl/Ruby/Pythonあたりのスクリプト言語を使うのが
一番手軽だと思う。JavaやC#も可。

まぁ、「整数値を一個渡したい」だけなら、一々クライアントなんぞ手書きせずに
wget http://linux-server/foo.php?number=5
とかでいいんだが、流石にこれじゃダメだよなw

どーしてもCでHTTPクライアント書かないといけないんなら、
WinInet API使うのが比較的楽。
192デフォルトの名無しさん:2006/12/05(火) 21:39:17
自作のヘッダファイル(a.h)と関数のためのファイル(b.cpp)と本体ファイル
(c.cpp)をコマンドプロンプトから実行ファイルにするにはどうすればいいの
でしょうか。
bcc32 a.h b.cpp c.cpp
でいいんでしょうか?
193デフォルトの名無しさん:2006/12/05(火) 21:47:29
>>192
includeしたものは必要ない
194デフォルトの名無しさん:2006/12/05(火) 22:05:55
質問です。
文字列があり、2という文字があったら、8という文字があるまで文字を飛ばしたいと考えています。
(2,8の間と、2,8自体を含まない文字列を返したい)

char[] = "0123456789";
char2[] = "0987654321";
とあり、
charの場合は"019"
char2の場合は"09876543"
と戻して、strcpyしたいのですが、やり方がわかりません。。

strspnでCとEを見つけて、strcatしようと思ったのですが、思ったより効率が悪く、
charのポインタを一つずつ動かしてチェックしようにもその動かし方と比較の方法がわからなくて、、

どなたかわかる方いたら、教えてください。。
195デフォルトの名無しさん:2006/12/05(火) 22:08:46
>>194
別にポインタ使わなくても
i文字目はstr[i]で表せるし、比較したいならif(str[i] == '2')でOK
196も。:2006/12/05(火) 22:11:53
『定数 \n を宣言するコードを記述して表示しなさい』とはどのようにするのですか?
教えてください!
197デフォルトの名無しさん:2006/12/05(火) 22:15:48
>>192
Cコンパイラ(bcc32.exe)の内部処理

1. #XXXXXの処理
2. 構文解析
3. コード生成
4. リンケージ処理

cppファイルのなかで
#include "a.h"
と書かれていたら、コンパイラは上の1.の処理でファイルa.hを読み込み
#include "a.h"の部分にa.hの内容を展開する。

ファイルa.hの検索は次のようにして行われる。
1. 現在の作業ディレクトリのファイル.\a.hを開く。
2. 1.で.\a.hがなかったら、-Iオプションで指定したディレクトリ(IDIRとする)下の
 a.hファイルを探す(IDIR\a.h)。
3. 2.でIDIR\a,hがなかったら「ヘッダーファイルが見つかりません」のメッセージを
 出して処理を中止する。

198デフォルトの名無しさん:2006/12/05(火) 22:17:00
\nって改行を表すエスケープシーケンスだから、其の定數を宣言しろって云うのが先ず意味分からん。
\nの文字コードを表す定數って事ですかな?
199デフォルトの名無しさん:2006/12/05(火) 22:19:50
>>194
この程度は手書きでいいんじゃね?
↓のような感じで。

void foo(char *dst, const char *src)
{
  char c;
  int in = 0;

  while (c = *src++) {
    if (c == '2') in = 1;
    else if (c == '8') in = 0;
    else if (!in) *dst++ = c;
  }
  *dst = 0;
}
200mo.:2006/12/05(火) 22:21:16
わかりました。ありがとうございました(^^)
201194:2006/12/05(火) 22:22:10
ありがとうございます。
int main( void ){
const char word[] = "0123456789";
size_t i;
for (i=0;i < strlen(word); i++) {
printf("%s\n",word[i]);
}
return 0;
}
まずこんな感じで、比較する前に1文字ずつ出力してみようと思ったのですが、SEGVしてしまいました。。
printfでこけているようなのですが、理由がわかりません。なぜなのでしょうか?…
202デフォルトの名無しさん:2006/12/05(火) 22:23:17
>>198
たぶん'\n'の文字コードを数値で表示しろということなんだろうけど、
宿題スレにでも行ってもらったほうがいいと思う。
203デフォルトの名無しさん:2006/12/05(火) 22:23:35
>>201
%sじゃなくて%cにしる
204194:2006/12/05(火) 22:24:12
>>199
ありがとうございます。
最後の*dst = 0;は、どういう動作をするのでしょうか?
205デフォルトの名無しさん:2006/12/05(火) 22:24:17
>>201
%s -> %c
206デフォルトの名無しさん:2006/12/05(火) 22:24:18
wordは、char型の配列。
word[i]は、char型。
char型の変数の中身を表示する時は、printfの変換書式は%c
207デフォルトの名無しさん:2006/12/05(火) 22:26:50
>>204
文字列をヌル終端させるために必要。
208デフォルトの名無しさん:2006/12/05(火) 22:28:27
>>204
そうしないと、其の文字列を表示した時、
メモリ上に'\0'が見つかる迄表示し続けてしまう。
209194:2006/12/05(火) 22:29:30
わかりました。
ありがとうございました。頑張ってみます。
210デフォルトの名無しさん:2006/12/05(火) 22:30:24
>>202
そう云う事ならこうなるな。
const int newline = '\n';
211194:2006/12/05(火) 23:19:15
すみません、もう一つ質問です。
>>199さんの関数の場合、呼び出すときに
string[20]
foo(string,"0123456789")
のようにする必要がありますが、
stringの配列の量を定義することが出来ない場合(const charに来る量が不定)、どうすればよいのでしょう?

上記の関数で言えば、char stringを初期化し、dstのアドレスを取得して代入すればstringの配列の量を指定しなくても良いと考えたのですが…
212デフォルトの名無しさん:2006/12/05(火) 23:28:23
>>211
char *dst;
dst = malloc(strlen(src)+1);
とでもしる。
213デフォルトの名無しさん:2006/12/05(火) 23:29:44
>>211
malloc
214194:2006/12/05(火) 23:46:26
わかりました。ありがとうございました。
215192:2006/12/06(水) 07:41:30
gcc bmp.c test0.c -o test0
レス有難うございました。
ちなみに
上記のような場合、-oとは何を意味するのでしょうか。
216デフォルトの名無しさん:2006/12/06(水) 07:56:18
おまえ馬鹿か? 少しはマニュアルみろよ。man gccとかさ。
あまえてんじゃねえよ。糞が。


-o: 出力ファイル名の指定

217デフォルトの名無しさん:2006/12/06(水) 07:57:26
>>215
ファイル名指定

gccで検索したら一番上にくる
http://www.linux.or.jp/JM/html/GNU_gcc/man1/gcc.1.html
218215:2006/12/06(水) 11:35:33
厳しいお言葉でもきっちり教えて頂き有難うございました!
219デフォルトの名無しさん:2006/12/06(水) 12:54:21
K&Rのfopen関数の説明ではファイルとファイルポインタを結びつける時に、空きがあるかどうかは
fp->flagを参照してフラグが立っているかどうか調べているようなんですが、
最初にFILE構造体の中身は0で埋まっていることがコンパイラかOSで保証されているんでしょうか?
220デフォルトの名無しさん:2006/12/06(水) 13:28:35
>>219
OSや標準ライブラリのバグを心配してますか?
221デフォルトの名無しさん:2006/12/06(水) 13:54:30
>>219
そうだ、と答えれば満足するのか?
その方法は実装依存だが。

一番単純な実装だと、FILE構造体の配列はstaticに取っておく。
そして(実初期化の)staticなオブジェクトは0で初期化されるのが、
C言語の仕様だ。

実際にはそういうオブジェクトは実行ファイル中のBSSセグメントに配置され、
実行時にローダによって0埋めされたり、といったことが行われる。
222219:2006/12/06(水) 14:07:57
>>220
たまたまファイルオープンする前からフラグが立っていて困ることはないのかなと思って
そこまでは書かれていなかったので気になったんです
>>221
詳しい説明ありがとうございます、納得できました
223デフォルトの名無しさん:2006/12/06(水) 15:50:32
でもまあ今時staticな配列で実装していることはないと思うけどな。
224デフォルトの名無しさん:2006/12/06(水) 16:14:25
>>223
少なくともVC7.1(VS2003.NET)までは_iob[]っていうstatic配列だよ。
VC8.0はどうだか知らないが、多分同じだろう。
225デフォルトの名無しさん:2006/12/06(水) 20:16:45
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3100.txt

上記のリングバッファのプログラムで最初のエンキューの後のデキューや先頭の表示がうまくいきません。
エンキューの関数内でキューが空の場合の処理が問題だと思うのですがよくわかりません。

どのようにすればいいのでしょうか。
どなたかご指摘よろしくお願いします。 
226ぴゅあ:2006/12/06(水) 21:20:00
>>219
違うと思うので…

fp->flagのfpが指すものって誰が作ってます?
fopenがFILE構造体のポインタを返すとき
適切に設定されて渡されるのではないのかな
227デフォルトの名無しさん:2006/12/06(水) 21:47:18
>>226
えーと。
>>219が言ってるのは、fopen()時に、FILE構造体配列の中の空きスロットを
探す処理のことだろ。
開きスロットかどうかを判断するのにflagメンバが非ゼロかどうかで判断している
ので、どっかで配列全体の少なくともflagメンバは、ゼロに初期化されていなければ
ならないという話。
228219:2006/12/06(水) 22:08:58
>>226
>>227さんの言うとおりです、質問が下手ですみません
229ぴゅあ:2006/12/06(水) 23:36:03
>>227-228
ライブラリの中の話ってことね

ならば、実装依存と言えば実装依存ですけど
初期化されてないと困るのはライブラリなので
保証されてるということを信じていいのでは?

実際何処がやっているかはライブラリと一緒に付いてくるスタートアップコードでしょう
(ライブラリに必要な初期化を行う)
>>221とかが言っている辺りは例えOSがそれをやってくれていてもライブラリがやってくれていると思いますよ
(スタートアップのソースコードを見てみればいい)
230デフォルトの名無しさん:2006/12/06(水) 23:50:54
問題集Wikiみたいなのなかったっけ?
231デフォルトの名無しさん:2006/12/07(木) 00:04:47
質問です。総合開発環境(BCデベロッパー)からボタン一つのメイクで
作られた実行ファイルは問題なく正常動作するのですが、コマンドプロンプト
から bcc32 4char.cpp という形で作られた実行ファイルは正常動作して
くれません。
一体何が原因なのでしょうか。
232デフォルトの名無しさん:2006/12/07(木) 00:06:17

コマンドプロンプトの表示はこんな感じです。

C:\4char>bcc32 4char.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
4char.cpp:
警告 W8004 4char.cpp 100: 'num' に代入した値は使われていない(関数 main() )
警告 W8004 4char.cpp 100: 'j' に代入した値は使われていない(関数 main() )
警告 W8004 4char.cpp 14: 'no' に代入した値は使われていない(関数 main() )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
233デフォルトの名無しさん:2006/12/07(木) 00:10:21
そんなんで分かるわけがない
234デフォルトの名無しさん:2006/12/07(木) 00:10:22
>>232
正常動作してる
警告は問題ない
実際exeが作成されているはず
「エラー」ならコンパイル失敗
235デフォルトの名無しさん:2006/12/07(木) 00:15:10
#include <stdio.h>
#define MAX 500
int main(){
FILE *fp;
int ch,chx[MAX]={0};
int i=0,j=0;
int num=0;
int no=0;
int chy[MAX]={0};
static int xxx=0;
char fname[30];
puts("4つ並んだ数字のみを抜き出します。");
puts("対象のファイルを実行ファイルと同じ\n"
"フォルダに置いてください。");
236231:2006/12/07(木) 00:16:24
printf("対象のファイル名を入力してください\n"
"---> ");
scanf("%s",fname);
if((fp=fopen(fname,"r"))==NULL)
puts("読出しオープン失敗");
else{
puts("ファイル内容表示");
while((ch=fgetc(fp)) !=EOF){
chx[i++]=ch;
putchar(ch);
}
}
fclose(fp);
237デフォルトの名無しさん:2006/12/07(木) 00:17:07
for(i=0;i<MAX;i++)
if(!(chx[i] >='0'&& chx[i] <='9'))
chx[i]=' ';
printf("\n\n\n");
puts("数字と空白のみのはず");
for(i=0;i<MAX;i++)
putchar(chx[i]);
i=0;
while(chx[i] != '\0'){
no=0;
if(chx[i]==' ')
i++;
else{
while(chx[i]!=' '){
no++;
i++;
}
if(no==4){
for(i=i-4;chx[i]>='0'&&chx[i]<='9';i++)
chy[xxx++]=chx[i];
chy[xxx++]='\n';
}
}
}
238デフォルトの名無しさん:2006/12/07(木) 00:17:43
chy[xxx]='\0';
putchar('\n');
printf("xxxは%dです。\n",xxx);
putchar('\n');
puts("4文字の数字のみ");
putchar('\n');

for(i=0;chy[i]!='\0';i++)
putchar(chy[i]);
puts("書き込んだ筈の内容");
if((fp=fopen(fname,"w"))==NULL)
puts("書き込みオープン失敗");
239デフォルトの名無しさん:2006/12/07(木) 00:19:00
else{
for(i=0; chy[i]!='\0' ;i++){
fputc(chy[i],fp);
putchar(chy[i]);
}
fclose(fp);
}
puts("処理は成功しました。");
scanf("%d",&i);
getchar();
return 0;
}
240231:2006/12/07(木) 00:24:37
アップローダーの使い方が分からず申し訳ありません。
ボタン一つのメイクで作った実行ファイルからは"処理は成功しました"
の部分まで行くのですが、コマンドプロンプトで作ったものは
"数字と空白のみのはず"のところまでしか行かず、途中で
終了してしまいます。
241231:2006/12/07(木) 00:36:10
四つ連続している数字のみを残すようにファイルを
書き換える処理です。
三つ連続数字や英文字などは削除します。
コマンドプロンプトで作られた実行ファイルではファイルの内容は
まったく変化しません。
242デフォルトの名無しさん:2006/12/07(木) 01:04:12
>>231
indentぐちゃぐちゃだな……
ちゃんと読んでないが、
>>237の先頭のforループによって、chx[]の中身は'0'〜'9'か' 'のみになっており、
\0は含まれない状態になっている。

にもかかわらず、
>>237の9行目のwhileループは、chx[]が\0で終端されていることを期待している
だろ。これではループが正常に終了しない。実際にはchx[]から続くアドレスを
読み続けて、たまたま'\0'があった地点で終了するわけだが、バグだな。

IDEでコンパイルした時は、最適化オプション等の差で、「たまたま」上手く
動いているように見えただけだろう。
243デフォルトの名無しさん:2006/12/07(木) 01:04:53
>for(i=0;i<MAX;i++)
> if(!(chx[i] >='0'&& chx[i] <='9'))
> chx[i]=' ';

これってMAXまでだから0クリアしたところもスペースに置きかえられてるよね
それなのに
>while(chx[i] != '\0'){
こんな条件にしてるのが問題では
244デフォルトの名無しさん:2006/12/07(木) 03:12:19
#include <stdio.h>
#include <stdlib.h>

#define MTX 3/*升目の数(縦横)最大9まで*/

static int board[MTX][MTX];//ボード配列
int p_i,p_j;//直前にマークしたマスの座標x,y
extern int p_maru;//プレイヤーが〇の時は1、×の時は2

245224:2006/12/07(木) 03:12:56
/*ボードを表示する関数*/
void writeBoard(void){
int i,j;
int maru;//2次元配列から順に出した値を入れておく変数

printf(" ");
for(i = 1; i <= MTX; i++){
printf("[%d]",i);
}
printf("\n");
for(j = 97; j <= 97+MTX-1; j++){
printf("[%c]",j);
for(i = 1; i <= MTX; i++){
maru = board[j-1-96][i-1];
switch(maru){
case2: printf(" ×"); break;
case1: printf(" 〇"); break;
case0: printf(" "); break;
default: break;
}
}
printf("\n");
}
}
246224:2006/12/07(木) 03:14:15
/*プレイヤーの選択した位置にマークをする関数
引数str*プレイヤーが指定したマークの位置文字列
戻り値 r1:正常な値だったのでマーク完了
0:不正な値だったのでマークできなかった
*/
int writeMark(char str*){
int r = 1;

int i = str[1] - 48;
int j = str[0] - 96;
if((i < 1 || i > MTX) || (j < 1 || j > MTX)){r = 0;}
else{
if(board[j-1][i-1] == 0){
board[j-1][i-1] = p_maru;
p_i = i; p_j = j;
}
else{r = 0;}
}
return r;
}

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
boardfunc.c:
エラー E2293 boardfunc.c 39: ) が必要
*** 1 errors in Compile ***

と表示されてしまます、この39行目の ) がわかりません
付いてるはずなのですが、エラーを起こしてしまいます。
ご指摘お願いします。
247最初からになります:2006/12/07(木) 04:26:34
include <stdio.h>
#include <stdlib.h>

#define MTX 3/*升目の数(縦横)最大9まで*/

static int board[MTX][MTX];//ボード配列
int p_i,p_j;//直前にマークしたマスの座標x,y
extern int p_maru;//プレイヤーが〇の時は1、×の時は2

248最初からになります:2006/12/07(木) 04:28:02
/*ボードを表示する関数*/
void writeBoard(void){
int i,j;
int maru;//2次元配列から順に出した値を入れておく変数

printf(" ");
for(i = 1; i <= MTX; i++){
printf("[%d]",i);
}
printf("\n");
for(j = 97; j <= 97+MTX-1; j++){
printf("[%c]",j);
for(i = 1; i <= MTX; i++){
maru = board[j-1-96][i-1];
switch(maru){
case2: printf(" ×"); break;
case1: printf(" 〇"); break;
case0: printf(" "); break;
default: break;
}
}
printf("\n");
}
}
249最初からになります:2006/12/07(木) 04:28:54
/*プレイヤーの選択した位置にマークをする関数
引数str*プレイヤーが指定したマークの位置文字列
戻り値 r1:正常な値だったのでマーク完了
0:不正な値だったのでマークできなかった
*/
int writeMark(char* str){
int r = 1;

int i = str[1] - 48;
int j = str[0] - 96;
if((i < 1 || i > MTX) || (j < 1 || j > MTX)){r = 0;}
else{
if(board[j-1][i-1] == 0){
board[j-1][i-1] = p_maru;
p_i = i; p_j = j;
}
else{r = 0;}
}
return r;
}


250最初からになります:2006/12/07(木) 04:29:52
/*コンピュターの選択した位置にマークする関数*/
void writeCompMark(void){
int count = 0;
int m_maru = 1;
int i,j;
int r;
int player;
int computer;
int b;

int bmtx_i[100];
int bmtx_j[100];

if(p_maru == 1){m_maru = 2;}
251最初からになります:2006/12/07(木) 04:30:46
//横方向
for(j = 1; j <= MTX; j++){
//〇の数と×の数をチェック
for(i = 1, player = 0, computer = 0, b =0; i <= MTX; i++){
if(board[j-1][i-1] == p_maru){player++;}
else if(board[j-1][i-1] == m_maru){computer++;}
else{b = i;}
}

//プレイヤーがリーチだった場合阻止する
if((player+1 == MTX) && computer == 0){
board[j-1][b-1] == m_maru;
p_i = b; p_j = j;
return;
}
}
//縦方向
for(i = 1; i <= MTX; i++){
for(j = 1, player = 0, computer = 0, b =0; j <= MTX; j++){
if(board[j-1][i-1] == p_maru){player++;}
else if(board[j-1][i-1] == m_maru){computer++;}
else{b = j;}
}

if((player+1 == MTX) && computer == 0){
board[j-1][b-1] == m_maru;
p_i = i; p_j = b;
return;
}
}
252最初からになります:2006/12/07(木) 04:40:59
/*マークが揃ったかどうかチェックする関数
戻り値 r 1:マークが揃っているか
0:マークはまだ揃っていない
-1:全てのボードが埋まったか、まだ揃っていない
*/
int judge(void){
int i,j;
int r;
int j_maru = board[p_j-1][p_i-1]; //揃ったかどうか判定するマーク

//横方向チェック
for(i = 1, r = 1; i <= MTX; i++){
if(board[p_j-1][i-1] != j_maru){r = 0; break;}
}
if(r){return 1;}

//縦方向チェック
for(j = 1, r = 1; j <= MTX; j++){
if(board[j-1][p_i-1] != j_maru){r = 0; break;}
}
if(r){return 1;}
253最初からになります:2006/12/07(木) 04:42:26
//斜めチェック
if(p_j == p_i){
for(i = 1, r = 1; i <= MTX; i++){
if(board[i-1][i-1] != j_maru){r = 0; break;}
}
}
if(r){return 1;}

if(p_j+p_i == MTX+1){
for(i = 1, r = 1; i <= MTX; i++){
if(board[i-1][MTX-i] != j_maru){r = 0; break;}
}
}
if(r){return 1;}

//あいこ
for(j = 1, r = -1; j <= MTX; j++){
for(i = 1; i <= MTX; i++){
if(board[j-1][i-1] == 0){return 0;}
}
}

return r;
}
254最初からになります:2006/12/07(木) 04:43:55
警告 W8019 boardfunc.c 81: コードは効果を持たない(関数 writeCompMark )
警告 W8019 boardfunc.c 95: コードは効果を持たない(関数 writeCompMark )
警告 W8019 boardfunc.c 112: コードは効果を持たない(関数 writeCompMark )
警告 W8019 boardfunc.c 127: コードは効果を持たない(関数 writeCompMark )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

これらが、どうしても、解決しないので誤り箇所を指摘お願いします。
長々、すんまそ。これらを数時間もかけて書きました。
255ぴゅあ:2006/12/07(木) 08:01:03
>>254
長々お疲れさま(貼り付けただけ?)ですけど
81,95,112,127行がどれかをしてしてくれた方がありがたい気がするなぁ。。。

2つは確かに指摘されてる通りのものがあるだけど
あと2つは見つけられない。。。

>コードは効果を持たない

>board[j-1][b-1] == m_maru;
は何をしたいと考えたコード?
256デフォルトの名無しさん:2006/12/07(木) 09:06:22
>81,95,112,127行がどれかをしてしてくれた方がありがたい気がするなぁ。。。
してしてくれた

>2つは確かに指摘されてる通りのものがあるだけど
あるだけど

日本語でどうぞ。
257231:2006/12/07(木) 11:00:08
レスくだすった方、誠にありがとうございました。
これは自力ではとても解決できない問題でした。
サンキュウベルマッチです。
258デフォルトの名無しさん:2006/12/07(木) 14:33:36
1. 二つの文字列s1,s2 をキーボードから入力し,それぞれの文字列の長さ(NULL 文字は含まな
い)を画面表示し,さらに文字列s1 の後ろに文字列s2 を連結して画面表示するプログラムを
作成しなさい.ただし,文字列s1 と文字列s2 を連結したものを一度文字列s1 に格納してから
表示を行うこと.また,strlen(),strcat()等の関数を使ってはならない.
提出物: プログラム,実行結果(3 回分以上)
2. 以下の処理を行うプログラムを作成しなさい.ただし,文字列s,t の要素数は50 とすること.
strlen(),strcmp()等の関数を使ってはならない.
(1) キーボードから文字列を入力し,文字列s に格納する.
(2) 文字列sを逆順に並べ替えたものを文字列t に格納する.
(3) 文字列sと文字列t が同一であるかどうかを比較し,その結果を画面表示する.
提出物: プログラム,実行結果(3 回分以上)
259デフォルトの名無しさん:2006/12/07(木) 14:34:33
何回目だこの問題
260デフォルトの名無しさん:2006/12/07(木) 14:46:11
>>258
宿題は宿題スレへ。
261デフォルトの名無しさん:2006/12/07(木) 14:57:37
>>258
if文の中に記号をごちゃごちゃ入れられると見づらいので
よっぽどな事が無い限りは、適当な変数に値を入れ
それで比較してくれると可読性が良いので助かる。
262デフォルトの名無しさん:2006/12/07(木) 15:26:11
double *a, *b;

double* a,b;
の違いを教えてください。
263デフォルトの名無しさん:2006/12/07(木) 15:31:26
>>262
前者は、b の型は double*
後者は、b の型は double
264ど初心者:2006/12/07(木) 16:34:49
スレ違いかもだけど、どこで聞いて良いか分からないので、ここで質問させていただきます。
見やすい仕様書の書き方(見やすい例があると嬉しいです)や読み方、見やすいフローチャートの書き方(見やすい例があると嬉しいです)、
入門書理解し終えた人向けへの演習(言語はC)が豊富なサイト等、ご存じの方いらっしゃったら、教えてください。
レベル的には:
紙媒体は入門書なんとか読破、
ポインタ本読破しましたが、ちゃんと理解できてないので四苦八苦しながら演習中、
アルゴリズムの本を、考えた人の頭の良さに脱帽しながら四苦八苦しながら一つずつ理解しようと読み途中
な感じです。
紙媒体は高いので、今月はもう買えないですが、「これは読んどけ!!」的なものも有りましたら、お教え戴ければ幸いです。
265デフォルトの名無しさん:2006/12/07(木) 16:44:55
>>264
仕様書に関しては、W3C仕様書やRFCでも見て参考にしたら?
W3C仕様書の日本語訳は
ttp://www.w3.org/Consortium/Translation/Japanese
で見れる。

フローチャートは、はっきり言って今時使わない過去の遺物なので
UMLでも勉強しなされ。「C言語」向きではないがな。
266264:2006/12/07(木) 16:59:02
>>265
UML初耳です。帰ったら調べてみます。
仕様書サイトも、ありがとうございます。
助かりました。
267デフォルトの名無しさん:2006/12/07(木) 20:12:18
>>254
これでどう?
代入演算の場所だと思うけど比較演算になってた
コンパイル通しただけでコード自体のチェックはして無いよ
http://sa-wiki.com/upload/src/up0069.txt
268デフォルトの名無しさん:2006/12/07(木) 21:47:18
http://sa-wiki.com/upload/src/up0070.txt
ごめんなさい、ちょっとテスト
269デフォルトの名無しさん:2006/12/07(木) 21:56:32
>>268
なにしたいんだ?
http://sa-wiki.com/upload/index.html
270デフォルトの名無しさん:2006/12/07(木) 23:08:47
ソースの編集に秀丸エディタ使ってるんだけど、
みんなはどんなの使ってるの?
271デフォルトの名無しさん:2006/12/07(木) 23:21:01
【エディタ】ソース何で書いてる? 1スレ目
http://pc8.2ch.net/test/read.cgi/tech/1164154920/
272デフォルトの名無しさん:2006/12/07(木) 23:26:42
文字列を入力して、その中に0-9と特定の許可する文字以外が入力されたら弾きたい場合、
単純に許可してる文字か聞いていっちゃえば良いの?
isdigitとif使うとかそんな方法しか思い浮かばない・・・(´・ω・`)
273デフォルトの名無しさん:2006/12/07(木) 23:58:25
>>272
単純に許可してる文字か聞いていっちゃえば良いです

特定の許可する文字の種類、数によってisxxxxを使うかifで比較するか
方法は異なると思うけど

ちなみに、「特定の許可する文字」ってなに?

※isxxxxはこれだけあります
isalnum 英数字 (A〜Z,a〜z,0〜9)
isdigit 10進数 (0〜9)
isxdigit 16進数 (A〜F,a〜f,0〜9)
isalpha 英字 (A〜Z,a〜z)
isupper 英大文字 (A〜Z)
islower 英小文字 (a〜z)
ispunct 記号 (!"#$%&'()*+,- /:;<=>?@^_`{|}~)
isspace スペース (0x09〜0x0D,0x20)
274デフォルトの名無しさん:2006/12/08(金) 01:21:25
stdarg.hを使って、
可変個の引数をさらに次の関数へ渡すことはできますか?

例えば、hogeという関数を作ったとして、
int hoge(const char *format, ...)
{
int ret = sscanf(format, ...); // hogeの可変個引数をで、sscanfに渡したい
// 何か他の処理
return ret;
}

のようにしたいんです。
man stdargしても分かりませんでした。
sscanfした後に、得られた変数がおかしくないかどうかのcheckをしたいのですが、
それが何度も何度も出てくるのでこういう関数が必要です。
275デフォルトの名無しさん:2006/12/08(金) 01:24:38
>>274
っ vsscanf
276デフォルトの名無しさん:2006/12/08(金) 01:36:40
>>275
あざっす。
ttp://www.kouno.jp/home/c_faq/c15.html#5
検索を続けたらここを発見できました。

int hoge(const char* str, const char* format, ...)
{
va_list argp;
va_start(argp, format);
vsscanf(str, format, argp);
va_end(argp);
}

つか、>>274の引数が書き足りてなかったorz
277264:2006/12/08(金) 01:46:46
264です。
>>265
W3C仕様書は、まるで理解できませんでしたorz
いつか理解できるようになるよう、努力してみます。
UML、大変役に立つ言語(?)のようですね。
色々調べて、勉強してみます。
改めて、ありがとうございました。


278最初からになります:2006/12/08(金) 02:06:01
>>255
//横方向
for(j = 1; j <= MTX; j++){

//縦方向
for(i = 1; i <= MTX; i++){

//斜め
player = 0;
computer = 0;
b =0;
for(i = 1; i <= MTX; i++){ ←

player = 0;
computer = 0;
b =0;
for(j = 1; j <= MTX; j++){ ←


ここになります。
参考書の見本と比べても間違いはないはずです。

>コードは効果を持たない

>board[j-1][b-1] == m_maru;

すみません。これ自体、意味がわからなく自分でも考えてます。
279デフォルトの名無しさん:2006/12/08(金) 02:14:51
アルゴリズムを考えるのが非常に苦労してます。
応用が利かないっていう感じです。
コレはよいよ、と言う本ありますか?〜の絵本シリーズでしょうか。
280最初からになります=278:2006/12/08(金) 02:25:31
//横方向
for(j = 1; j <= MTX; j++){
//〇の数と×の数をチェック
for(i = 1, player = 0, computer = 0, b = 0; i <= MTX; i++){
if(board[j-1][i-1] == p_maru){player++;}
else if(board[j-1][i-1] == m_maru){computer++;}
else{b = i;}
}

//プレイヤーがリーチだった場合阻止する
if((player+1 == MTX) && computer == 0){
board[j-1][b-1] == m_maru;
p_i = b; p_j = j;
return;
}
}
//縦方向
for(i = 1; i <= MTX; i++){
for(j = 1, player = 0, computer = 0, b = 0; j <= MTX; j++){
if(board[j-1][i-1] == p_maru){player++;}
else if(board[j-1][i-1] == m_maru){computer++;}
else{b = j;}
}

if((player+1 == MTX) && computer == 0){
board[b-1][i-1] == m_maru;
p_i = i; p_j = b;
return;
}
}

281最初からになります=278:2006/12/08(金) 02:26:10
//斜め
player = 0;
computer = 0;
b =0;
for(i = 1; i <= MTX; i++){
if(board[i-1][i-1] == p_maru){player++;}
else if(board[i-1][i-1] == m_maru){computer++;}
else{b = i;}
}

if((player+1 == MTX) && computer == 0){
board[b-1][b-1] == m_maru;
p_i = b; p_j = b;
return;
}

player = 0;
computer = 0;
b =0;
for(j = 1; j <= MTX; j++){
if(board[j-1][MTX-j] == p_maru){player++;}
else if(board[j-1][MTX-j] == m_maru){computer++;}
else{b = j;}
}

if((player+1 == MTX) && computer == 0){
board[b-1][MTX-b] == m_maru;
p_i = b; p_j = MTX-b+1;
return;
}

282最初からになります=278:2006/12/08(金) 02:26:58
//プレイヤーのリーチがなかつたのでランダムにマークする
for(j = 1; j <= MTX; j++){
for(i = 1; i <= MTX; i++){
if(board[j-1][i-1] == 0){
bmtx_i[count] = i;
bmtx_j[count] = j;
count++;
}
}
}

r = rand()%count;
board[bmtx_j[r]-1][bmtx_i[r]-1] = m_maru;
p_i = bmtx_i[r]; p_j = bmtx_j[r];
}

やはり、誤っている箇所を訂正しましたが
警告が出ます。。。ORZ
283デフォルトの名無しさん:2006/12/08(金) 15:28:09
行列
ma[2][3] = { {1, 2, 3}, {4, 5, 6} };
mb[2][3] = { {6, 3, 4}, {5, 1, 2} };
を足すという例題
http://eggrice.no.land.to/up/src/tohoh0078.txt
を改変して
行列
ma[2][3] = { {1, 2, 3}, {4, 5, 6} };
mb[3][2] = { {1, 5}, {5, 3}, {8, 1} };
をかける
という問題をやってみたんですが、
http://eggrice.no.land.to/up/src/tohoh0079.txt

変数を増やさずにやることはできないでしょうか?
284デフォルトの名無しさん:2006/12/08(金) 16:38:27
>283
無理だと思うよ
285283:2006/12/08(金) 16:55:36
>>284
お返事ありがとうございます。
ムリですか〜
286デフォルトの名無しさん:2006/12/08(金) 17:15:05
#include<stdio.h>
intmain(void)

{
printf("%f\n",10.0+3.0);
printf("%f\n",10.0-3.0);
printf("%f\n",10.0*3.0);
printf("%f\n",10.0/3.0);
printf("%f\n",10.0%3.0);
return0;
}

VC++ 2005 Express Editionでエラーが発生するのですが、エラーを検索してもよくわかりません。
error C2296: '%' : 無効です。左オペランドには型 'double' が指定されています。
printfはdouble型じゃないみたいだし。
287デフォルトの名無しさん:2006/12/08(金) 17:17:42
>>286
> printf("%f¥n",10.0%3.0);

こいつが変。浮動小数点を割った余りって何? って話だ。
288デフォルトの名無しさん:2006/12/08(金) 17:19:37
>>286
%は整数同士で計算するもの
浮動小数点ならfmodとかいうのがあった気がする
289286:2006/12/08(金) 17:21:53
>>287
>>288
ああ〜。納得しました。
確かに余りは整数にならないと変ですよね。
ありがとうございました。
290デフォルトの名無しさん:2006/12/08(金) 21:31:39
typedef struct _tag{
typedef struct _tag2{
int x;
int y;
}TAG2;
TAG2 rc1;
typedef struct _tag3{
int xx;
int yy;
}TAG3;
TAG3 rc2;
}TAG;
このような記述は好ましくないでしょうか?
291デフォルトの名無しさん:2006/12/08(金) 23:18:01
>>290
識別子名さえ何とかすれば特に問題なしと思われ
292デフォルトの名無しさん:2006/12/09(土) 00:30:39
たとえば
42.30000→42.3
といったように小数0以下を表示しない方法ってありますか?
293デフォルトの名無しさん:2006/12/09(土) 00:57:39
>>290
少なくともほかでも使うヘッダファイルではやめたほうがいいと思う。
その書き方だとC++ではCと違う扱いになるから。
294デフォルトの名無しさん:2006/12/09(土) 01:12:36
>>292 自分で削ってやるしかない。こんなの書いてみたがいかがか。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char *FloatToChar(char *buf, char width, double d)
{
char *base = buf, *p;
sprintf(base, "%.*f", width, d);
while(isdigit(*base))
base++;
if(*buf == '.')
base++;
p = base;
if(*base == '0')
base++;
while(*p)
p++;
while(--p >= base)
{
if(*p == '0')
*p = '\0';
else
break;
}
return buf;
}
int main(void)
{
char buf[256];
printf("%s\n", FloatToChar(buf, 10, 123.45));
return 0;
}
295デフォルトの名無しさん:2006/12/09(土) 01:15:39
>>294
このスレでそんな高度な要求すると思うのか?

>>292
というわけで、"%.1f"や"%.3g"を試してみたまえ。
296デフォルトの名無しさん:2006/12/09(土) 04:45:28
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#include "janken.h"
#include "boardfunc.h"

extern int p_i,p_j;//直前にマークしたx,y座標

//○×ゲーム
main(){
int p_turn;//プレイヤーのターンの時は1
char p_get[10]; //プレイヤーの入力値
int r;//プレイヤーが揃ったか否かを判定結果

srand(time(NULL));

printf("【○×ゲーム】\n");
do{p_turn = janken();} while(p_turn < 0);
if(p_turn){writeBoard();}

for(;; p_turn = !p_turn){
if(p_turn){ //プレイヤーターン
do{
printf("場所を指定して下さい(例:a2) > ");
scanf("%s",&p_get);
}
while(!writeMark(p_get));
297デフォルトの名無しさん:2006/12/09(土) 04:47:00

}
else{ //コンピュターターン
writwCompMark();
printf("コンピュターは・・・ %c%d\n",p_j+96,p_i);
}

writeBoard();
r = judge();
if(r != 0){break;}
}

printf("\n==========ゲーム終了=========\n");
if(r == -1){printf("\あいこです\n");}
else{
if(p_turn){printf("プレイヤーの勝ち!\n");}
else{printf("プレイヤーの負け!\n");}
}

return 0;
}


警告 W8065 10-4.c 32: プロトタイプ宣言のない関数 'writwCompMark' の呼び出し(関数
main )
janken.c:
boardfunc.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_writwCompMark' が未解決(C:\BBB\10-4.OBJ が参照)

どうか、ご助言お願いいたします。
298デフォルトの名無しさん:2006/12/09(土) 04:54:07
帰れ。
299デフォルトの名無しさん:2006/12/09(土) 10:29:46
writwCompMarkという関数は一体どこにあるのかな?
300290:2006/12/09(土) 10:55:18
>>291
識別子名了解しました。

>>293
違う扱いとはどのようなことでしょうか?
また、上記と同じような意味合いを持つコードを簡潔に
書けるのであればご教授いただきたい。
301デフォルトの名無しさん:2006/12/09(土) 12:41:25
290のコードだと、TAGの外で構造体TAG2を単独で使いたい場合、
Cでは単にTAG2と書くが、C++ではTAG::TAG2と書くという違いが生じる(TAG3も同じ)。

その差をなくすには、構造体の宣言を外に出せば良い。こうするとC/C++で同じ扱いになる。
typedef struct _tag2 {
  int x;
  int y;
} TAG2;
typedef struct _tag3 {
  int xx;
  int yy;
} TAG3;
typedef struct _tag {
  TAG2 rc1;
  TAG3 rc2;
} TAG;
302290:2006/12/09(土) 18:22:17
>>301
なるほど、有難うございます。
303デフォルトの名無しさん:2006/12/09(土) 22:54:44
100桁1000桁と変数が扱える範囲を超えても
演算結果が算出出来るようなプログラムを作りたいんですが、
どこかにこの手の解説って無いでしょうか(´・ω・`)
304デフォルトの名無しさん:2006/12/09(土) 22:58:44
>>303
1000桁の変数?
πでも計算するのか
305デフォルトの名無しさん:2006/12/09(土) 23:12:29
>>303
多倍長整数とか多倍長演算でぐぐれ
306デフォルトの名無しさん:2006/12/09(土) 23:38:22
関数内で構造体配列を参照するにはどうすればいいでしょうか?
構造体配列は
typedef struct 2d {
double c[2];
} 2D;
として
2D *p_A; 2D *p_B;
p_A.c[0]=100; p_A.c[1]=6; p_B.c[0]=200; p_B.c[1]=8;
そして関数func内でp_A.c[0]やp_B.c[1]を扱いたいのですが
func(2D *p_A,2D *p_B)で試してみたんですが駄目です。
307デフォルトの名無しさん:2006/12/09(土) 23:47:17
>>306
p_A->c[0]
308デフォルトの名無しさん:2006/12/09(土) 23:47:59
>>306
なにをしたいのかよくわからんけど、
p_A->c[0]
とか
(*p_A).c[0]
で参照できると思うけど。ちなみにどちらも同じ意味。
念のためにきくけどp_Aとかp_Bは実体をさしているんだろうな?
309306:2006/12/09(土) 23:54:36
スイマセン、実体ってどういうことですか?
初心者なもので申し訳ないです。
310デフォルトの名無しさん:2006/12/10(日) 00:14:04
p_Aとかはポインタ型であくまで「2D型の何かを指すもの」でしかない。
その何かが何処かに存在していなければならない。

(staticでない)変数を定義しただけだとその値は不定だというのは知ってるよね。
ポインタもそれは同じ。どこを指しているのか不定。
もしかすると非常に重要なデータのアドレスを指しているかもしれないし、
あるいは次に実行しようとしているコードのアドレスを指しているかもしれない。
なんにしろ、ポインタは初期化しないとならない。

たとえば初期化はこういう風にやる。

2D *p_A;
2D A;

p_A = &A;

Aは2D型の実体としてコンパイラによって領域が確保される。
&Aはそのアドレスだ。
311306:2006/12/10(日) 00:58:44
2D *p_A,*p_B;
2D A,B;
p_A=&A; p_B=&B;
p_A.c[0]=100; p_A.c[1]=6; p_B.c[0]=200; p_B.c[1]=8;
として
func(&A->c[0],&B->c[0])でしょうか?
312デフォルトの名無しさん:2006/12/10(日) 01:04:08
うーん、微妙にいろんなところが間違っている。全部書き直すと、

2D *p_A,*p_B;
2D A,B;
p_A=&A; p_B=&B;
p_A->c[0]=100; p_A->c[1]=6; p_B->c[0]=200; p_B->c[1]=8;
func(p_A,p_B);

になる。あるいはもっと簡単に、

2D A,B;
A.c[0]=100; A.c[1]=6; B.c[0]=200; B.c[1]=8;
func(&A,&B);

かな。
313306:2006/12/10(日) 01:26:02
わかりました、ちょっと試して頑張ってみます。
本当にありがとうございます。
314デフォルトの名無しさん:2006/12/10(日) 01:33:31
まずさ、なぜわざわざポインタ使ってるの?
315デフォルトの名無しさん:2006/12/10(日) 02:22:01
>>294
助かりました!
316ぴゅあ:2006/12/10(日) 10:46:22
>>314
コピーを渡したいのではないからじゃないの?
317デフォルトの名無しさん:2006/12/10(日) 11:06:41
うっわだめだこりゃ
318デフォルトの名無しさん:2006/12/10(日) 13:14:26
>>314-317の流れがわからない。
ソートでもしたいんじゃないの?
関数内で書き換えさせたいなら、参照渡ししかないと思ってるんだけど…違うのかな?
319317:2006/12/10(日) 13:22:27
え、なんで俺まで?
320デフォルトの名無しさん:2006/12/10(日) 13:24:26
317さんのレスは316さんへのじゃなかったのか
勘違いスマソ
321デフォルトの名無しさん:2006/12/10(日) 13:26:25
質問なのですが、
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3135.txt
出力されるnaの値を連続して++したいんですが再帰処理をしたので上手くいきません。
問題の部分とその出力ををうpしたのでお願いします。
322デフォルトの名無しさん:2006/12/10(日) 13:58:59
リンク先を全く見ずにstaticでも使ったら?と答えてみる
323デフォルトの名無しさん:2006/12/10(日) 14:20:19
static int i=0にしたら上手くいきました。
ただ、enum_multi_perm関数が全て完了してまた使う場合、i=0はどこに入れればよいでしょうか?
324デフォルトの名無しさん:2006/12/10(日) 14:29:27
スイマセン、
>ただ、enum_multi_perm関数が全て完了してまた使う場合、i=0はどこに入れればよいでしょうか?
ではなく
5 5 5 5となってenum_multi_perm関数が終了したあと、またこの関数を使うときにiをまた0から始めて
0 0 0 0
range_y[0]=295.000000,prob_y[0]=1.123596e-002 0 0 0 0
range_y[0]=590.000000,prob_y[0]=1.262467e-004 0 0 0 0
range_y[0]=885.000000,prob_y[0]=1.418502e-006 0 0 0 0
range_y[0]=1180.000000,prob_y[0]=1.593823e-008 0 0 0 0
と計算したいのですが、その場合はi=0という記述をどこに入れればよいのでしょうか?
rangeとprobのデータは別のものへ変えて、この関数を使いたいもので・・・。
325デフォルトの名無しさん:2006/12/10(日) 14:33:03
strchr等で、検索文字を"0では無い文字"といったような指定の仕方は出来ないのでしょうか?
326デフォルトの名無しさん:2006/12/10(日) 14:37:26
>>324
iはどこからきたの?naの話ではなかったの?

>>325
そんな関数あったかなぁ
C++ならstd::stringが使えるけど
327デフォルトの名無しさん:2006/12/10(日) 14:39:16 BE:159754548-2BP(294)
>>325
strspn("0", str)
328デフォルトの名無しさん:2006/12/10(日) 14:57:59
>324
最後に関数を抜けるときにi=0入れたら?
329ぴゅあ:2006/12/10(日) 15:02:08
>317さんのレスは316さんへのじゃなかったのか
え!?そうなの?

>>318
そういったところも含められるかも
とかもありとかでだろうと思うけど

たぶん>>314はそういうこととかはあるのか?とか
聞きたかったんだろうと思う
330デフォルトの名無しさん:2006/12/10(日) 15:02:42
ジョークプログラムなのですが、デスクトップにdummy.txtを出力する物を作りました。
ただ、実行してみたところで分かったのですが、生成されるtxtはどうやら上書きされてしまうらしく、さらにログインユーザ名も取得し生成先のパスに組み込まなくてはなりません。

どうしたらよいか知恵を貸していただけませんでしょうか?
また、何かおかしな点がございましたら何なりとご指導くださいませ。。。

int main(void)
{

int i;

for(i=0;i<3;i++){
FILE *file;
file = fopen("C:\\Documents and Settings\\ユーザ名\\デスクトップ\\dummy.txt","w");
fprintf(file,"Lei incorse nella volonta malata di una certa persona, e fu installato dati terribili. \n
Sono agitato molto ed appaio e lo porta sulla Sua schiena? \n Ma sara tale uomo di agio dove? \n Puo essere all'improvviso la Sua persona imminente.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");


fprintf(file,"C:Documents and Settings\\ユーザ名\\スタートメニュープログラム\\スタートアップ\\sys.exeを削除してください。問題が解決します。");
fclose(file);
}
return 0;
}
331デフォルトの名無しさん:2006/12/10(日) 15:07:51
>>330
追記したいなら"w"->"a"
332デフォルトの名無しさん:2006/12/10(日) 15:11:38
>何かおかしな点
知識もないのにジョークプログラムを作ろうなんて考えるあんたの頭
333デフォルトの名無しさん:2006/12/10(日) 15:15:46
"w"を"a"に変えてコンパイルしてみましたが、やはりdummy.txt一つしか出力されませんでした。。。

もう少し教えていただけないでしょうか?
334デフォルトの名無しさん:2006/12/10(日) 15:22:55
同じ名前のファイルは一つしか作れないだろ。
335デフォルトの名無しさん:2006/12/10(日) 15:25:18
>>333
>332
336デフォルトの名無しさん:2006/12/10(日) 16:22:30
>>327
strcspn()の間違いじゃないか?
337デフォルトの名無しさん:2006/12/10(日) 17:01:44
>>336
「0ではない文字を探す」だから、strspn()でいいんじゃないの?

>>327は、引数の順序を間違えた。
strspn(str, "0") こうだね。
338デフォルトの名無しさん:2006/12/11(月) 01:06:30
 自作のCプログラムの実行速度を計るのに困ってます。
 二通りの方法で実装された、等しい結果を吐く二者に
優劣をつけたいんですが、time()を使った自作の計測器だと
値が細かく(e-300以上)比較になりません。
 何かいいアイディアはないでしょうか?
339デフォルトの名無しさん:2006/12/11(月) 01:11:37
そんなものの実行速度を測る必要があるのか?
まあとりあえず消費したクロック数にすればいいと思うよ
rdtscとかでググってみそ
340デフォルトの名無しさん:2006/12/11(月) 01:25:58
 レスさんくすです。
 ググって使えそうなものに辿り着きました。
 ありがとうございました。
341338, 340:2006/12/11(月) 01:33:03
>>339
CLOCKS_PER_SECで割るの忘れてました…
こんなんにレスさせてすいませんでした…
吊ってきます…
342デフォルトの名無しさん:2006/12/11(月) 18:27:39
質問です。C言語で負の十進数を二進数に変換して表示させるには
どういう風にすればよいのでしょうか。
例えば-10を負の二進数に変換するなどです。
ご回答いただけると助かります。
343デフォルトの名無しさん:2006/12/11(月) 19:06:11
>>342
標準関数には無いのでそういう処理を自分で作る。
「ソース書いてクレクレ」なら宿題スレへ。
344デフォルトの名無しさん:2006/12/11(月) 20:13:52

構造体を作る時にアライメントは8バイトバウンダリとすることと
の指定があるのですが、これはいったいどういう意味なのでしょうか。
スレ違いならすみません。
345デフォルトの名無しさん:2006/12/11(月) 20:24:04
>>344
ttp://www.log10jp.com/materials/tips/ccpp1.htm
あたりでも読め。

処理系依存だが、#pragma pack(8) みたいなので指定できることが多い。
手動で詰め物をする手もあるが、あんまりお勧めはしない。
346344:2006/12/11(月) 20:56:52
有難うございます。そこをちょっと読んでみます。
347デフォルトの名無しさん:2006/12/11(月) 21:02:54
http://sa-wiki.com/upload/src/up0076.txt
この内容で式の構文エラーと出てしまい、コンパイルできません。
各構造体変数に三人分ずつ初期化したいのですが。
間違っている部分をご指摘お願い致します。
348デフォルトの名無しさん:2006/12/11(月) 21:23:23
×WORKER_INFO JIGYOU1[3],JIGYOU2[3],JIGYOU3[3];
×JIGYOU1[0]={"sato",33,1973,2,14,"M",2000,4,1,"12345","98765","eigyou"};

WORKER_INFO JIGYOU1[3]={{"sato",33,1973,2,14,"M",2000,4,1,"12345","98765","eigyou"},
{"sato",33,1973,2,14,"M",2000,4,1,"12345","98765","eigyou"},
{"sato",33,1973,2,14,"M",2000,4,1,"12345","98765","eigyou"}};

初期化は定義時に行う
349347:2006/12/11(月) 21:28:24
>>348
そうなるんですか。全然わかりませんでした。
有難うございます。助かりました。
350デフォルトの名無しさん:2006/12/11(月) 21:50:52
>>347=349

C/C++では「代入」と「初期化」ってのが構文的に別物なンですよ。
そのように覚えてください。
int a[] = { 0, 1, 2 }; みたいに、宣言と値の設定を同時に行うのが「初期化」
a = 2; みたいに、そうでないのは「代入」

>>348みたいに構造体や配列の初期設定を行うのは「初期化」でのみ許される
構文で、「代入」では出来ないンです。
351デフォルトの名無しさん:2006/12/11(月) 22:07:38
N88以外いこもプログラムしたことない俺は何から始めたらいいか教えてください;;
352デフォルトの名無しさん:2006/12/11(月) 22:14:32
http://sa-wiki.com/upload/src/up0078.txt
九々のプログラムなんですがうまく行きません。
関数のvoid kuku(int calc(int,int));という関数の中に
また関数が入っているようなやっかいなものを使わないといけません。
この関数は九々の加算と乗算を表示する関数です。
どうか宜しくご教授ください。
353デフォルトの名無しさん:2006/12/11(月) 22:20:27
kukuには
「2つのintを引数に取り、intを返す関数」と
「int型の整数」と
「int型の整数」の
3つの引数を渡さないといけない


354デフォルトの名無しさん:2006/12/11(月) 22:21:56
>>352
>void kuku(int calc(int,int)){
> printf("%d\n",calc(int,int));
>}
なんだこれ

宣言の部分の int calc(int,int) はイランだろ
void kuku(int x , int y){
printf("%d\n",calc(x , y ) );
}
355デフォルトの名無しさん:2006/12/11(月) 22:24:59
>>352
関数ポインタを使う練習?
356352:2006/12/11(月) 22:29:20
九々の加算と乗算を表示するプログラムを作成しなさい。
1) メイン関数
2) 2値の加算関数
3) 2値の乗算関数
4) 九々の加算と乗算を表示する関数

【関数インターフェース】
intsum ( int x1, int x2 ) ;/* 加算関数 (関数値:計算結果)   */
intmul (int x1, int x2 ) ;/* 乗算関数 (関数値:計算結果 */
/* 九々の加算と乗算を表示する関数 */
voidkuku ( int calc( int, int ) ) ;

このような形の課題です。この関数を使う必要あるのかと悪戦苦闘しています
宿題スレじゃなくてすみません。

357352:2006/12/11(月) 22:33:14
とりあえずなんとか解決させました。
レスくれた方々、有難うございます!!!
358デフォルトの名無しさん:2006/12/11(月) 22:34:27
>>356
関数ポインタ入れんのか

void kuku( int x , int y , int (*calc)( int , int )){
printf("%d\n",calc(x,y));
}

これじゃダメか?
359デフォルトの名無しさん:2006/12/11(月) 22:35:02
なんとか解決させました=お友達に教えてもらいました
360デフォルトの名無しさん:2006/12/11(月) 22:35:54
ワーオー
361デフォルトの名無しさん:2006/12/11(月) 23:24:13
変数valueの12ビット目〜15ビット目(4ビット)をチェック(ビットテスト)して、
ゼロであれば上位2バイトに1を代入、ゼロ以外であれば、2を代入する文を示しなさい。
(32bitのデータです)
この処理をビットフィールドでするにはどうすれば良いでしょうか。
ご教授いただけませんか。
362デフォルトの名無しさん:2006/12/11(月) 23:25:25
ttp://3rd.geocities.jp/as_rmter/stage_k6.htm

ここのstage6-3と6-4の四則演算をするにはどうしたらいいか助言いただけないでしょうか?
363352:2006/12/11(月) 23:26:21
とりあえずこの形で良しとしました。関数ポインタとかは
ちょい現状では手に負えないっぽかったのでw
#include <stdio.h>

int sum(int x1,int x2){
return (x1+x2);
}

int mul(int x1,int x2){
return (x1*x2);
}

void kuku(int x,int y){
printf("%d + %d = %d\n",x,y,sum(x,y));
printf("%d * %d = %d\n",x,y,mul(x,y));
}

int main(void){

int no1=5,no2=10;
kuku(no1,no2);
return 0;
}
364デフォルトの名無しさん:2006/12/11(月) 23:33:22
>>363
多分想定されてたのはこんなプログラムだと思われ

#include <stdio.h>

int sum(int x1, int x2) { return x1 + x2; }
int mul(int x1, int x2) { return x1 * x2; }
void kuku(int (*fn)(int, int), const char *op)
{
    int i, j;
    for (i = 1; i < 10; ++i)
        for (j = 1; j < 10; ++j)
            printf("%d %s %d = %d\n", i, op, j, (*fn)(i, j));
}
main()
{
    printf("たしざん\n");
    kuku(sum, "+");
    printf("\nかけざん\n");
    kuku(mul, "*");
}
365デフォルトの名無しさん:2006/12/11(月) 23:36:03
366デフォルトの名無しさん:2006/12/11(月) 23:41:27
>>363
>>364
外部からスマソ
それだと選択画面がないんじゃない?
だからたぶんcaseが入るとは思うんだが漏れのない頭じゃ無理す
367364:2006/12/11(月) 23:44:44
>>366
選択画面てナニ?
意味わがんね。
そんな仕様あった?
368366:2006/12/12(火) 00:02:49
なんか書き込めない
369366:2006/12/12(火) 00:07:47
演算の種別を選択後、実数の四則演算の計算式を入力して結果を表示するプログラムを作成。
問題の問はコンパイルしてから実行すると6−3のような画面にならないとだめってことじゃないのか?
370デフォルトの名無しさん:2006/12/12(火) 00:12:25
>>369
アンカーぐらい付けろ
誰に言ってんだ?
371366:2006/12/12(火) 00:48:53
>>369
流れでわからない頭の持ち主なのか?
>>367にだよ
372366:2006/12/12(火) 00:49:32
バーロwwwwwwwwww
自分にアンカーしちまったじゃねーか
>>369→x
>>370→○
373デフォルトの名無しさん:2006/12/12(火) 00:51:01
>>352が示してる仕様は>>356だろ。
「6-3のような画面」云々なんて言われても知らんよ。
つーかアンタ誰って感じ。
374デフォルトの名無しさん:2006/12/12(火) 01:02:27
実況とかでよく見る2chのスレのIDの出現回数をカウントするプログラムを作っています
Janeのログだと、ID有りの板の書き込みのテンプレートは一行ごとに

名前<>メル欄<>日付 ID:xxxxxxxxx<>本文(<>スレタイ)

となっていますが、名前やメル欄、本文やスレタイにID:xxxxxxxxxがある場合にも
確実にそのレス番で書き込んだ人のIDを選別するにはどうすればいいでしょうか?
そうそう出現することはないと開き直れば、strchr()やstrstrでも十分なのですが…
375デフォルトの名無しさん:2006/12/12(火) 01:29:33
376247-253:2006/12/12(火) 01:57:44
度々、質問で申し訳ありません。
その都度は自分でも混乱していたので、巧く質問ができませんでした。
なので、再度質問に答えて戴ければ幸いです。

例えば、この中のソースではよく
>>board[j-1][b-1] ようなものが出てきますが
この-1 とは配列からの-1で宜しいのでしょうか?
或るいわ ○×の 1 で - は移動の - なのでしょうか?
377デフォルトの名無しさん:2006/12/12(火) 02:14:32
>>351
日本語。
378デフォルトの名無しさん:2006/12/12(火) 06:42:52
>376
配列の添え字は0から要素数-1までだけど、そのプログラムはforをi=1から回してるからずれる。
それを修正するために-1してるわけ。

forで配列を回すときは0からの方がいいと思うけどね。
379173:2006/12/12(火) 13:53:56
突然で申し訳ありませんが、
y[3] = number % 10;
y[2] = (number / 10) % 10;
y[1] = (number / 100) % 10;
y[0] = (number / 1000) % 10;
の(number / 1000) % 10;が何をしているのか分かりません。
どなたか教えていただけないでしょうか?
380デフォルトの名無しさん:2006/12/12(火) 13:59:38
>>379
1000で割ってから、10で割った余りを計算

y[1]までわかって、y[0]だけわからない理由が謎
381デフォルトの名無しさん:2006/12/12(火) 14:00:06
numberを1000で割って(余りは捨てて)
その商を10で割った余りを求める。
382379:2006/12/12(火) 14:01:25
>>380
y[2] = (number / 10) % 10;
y[1] = (number / 100) % 10;
y[0] = (number / 1000) % 10;
の3つが分からなかったのですが、代表でy[0]を書いたのです。

ありがとうございました。
383デフォルトの名無しさん:2006/12/12(火) 14:02:28
y[3]にはnumberの一の位
y[2]にはnumberの十の位
y[1]にはnumberの百の位
y[0]にはnumberの千の位
の数字が入る
384379:2006/12/12(火) 14:07:45
>>381
ありがとうございました。
385デフォルトの名無しさん:2006/12/12(火) 14:28:32
なぜC++言語はC言語ではないの?
386デフォルトの名無しさん:2006/12/12(火) 14:32:34
違う言語だから
ラテン語ベースの違う言語は、何故ラテン語じゃないの?と聞いてるようなもんだ
歴史や名前や成立過程気にしなきゃ、似た部分がある違う言語ってだけ
387名前:2006/12/12(火) 15:32:45
コンパイルって何
388デフォルトの名無しさん:2006/12/12(火) 15:34:12
389デフォルトの名無しさん:2006/12/12(火) 19:14:29
数列{1/(n*n)}の (1) n=1からnterm迄の和を求めよ
という問題で
ちょっと作ったのですがnを何を入れてもInfintyになってしました。
どこがおかしいのでしょうか教えてください


#include<stdio.h>

main()
{
int i,n;
float s;
printf("n="); scanf("%d",&n);
i=0; s=0;
while (i<=n){
s+=1/(i*i);
++i;
}
printf(n=%d s=%f|n",n,s);
}
390デフォルトの名無しさん:2006/12/12(火) 19:21:40 BE:23292926-2BP(202)
>>389
i=0
391389:2006/12/12(火) 19:27:23
i=1
にしましたがやはりInfintyでした
なんでだろう・・・
392デフォルトの名無しさん:2006/12/12(火) 19:37:23 BE:23292443-2BP(202)
infinityにはならんと思うがs+=(double)1/(i*i)でないと除算は整数でしか行われない。
393389:2006/12/12(火) 19:44:55
#include<stdio.h>

main()
{
int i,n;
double s;
printf("n="); scanf("%d",&n);
i=1; s=0;
while (i<=n){
s+=(double)1/(i*i);
++i;
}
printf(n=%d,s=%f|n",n,s);
}

N=2を代入しようとすると
n=2 s=Inf|n
と出ました・・・
394デフォルトの名無しさん:2006/12/12(火) 19:47:59
>393
それちゃんとコピペできてる?
printfに"が足りてないみたいだけど。
395デフォルトの名無しさん:2006/12/12(火) 19:50:01 BE:34938836-2BP(202)
どこの糞コンパイラだそれ。
試しにやってみたら動いたぞ。VS.NET2003で。
396389:2006/12/12(火) 19:56:21
”を足したら動きました。
ありがとうございました。


もしよければあと1つ教えてくれないでしょうか
上の問題の続きなのですが
(2)ntermからn=1迄の和を求めることを考える。
なんですけど、上のをどういじればいいのでしょうか。
397デフォルトの名無しさん:2006/12/12(火) 20:01:03
ntermって何?
398389:2006/12/12(火) 20:02:18
すいません
入力としてこれから計算する和の項数がntermでした
399デフォルトの名無しさん:2006/12/12(火) 20:07:31
i=n; s=0.0;
while (i>0){
s+=1.0/(i*i);
--i;
}
ループを逆から回すってこと?
400389:2006/12/12(火) 20:13:49
はい
401389:2006/12/12(火) 20:28:12
たびたびすいません。
399のを参照に該当部分を変えたところ
Nに何を入れてもSが1.000・・・
となってしまいます。
なぜでしょうか?
402デフォルトの名無しさん:2006/12/12(火) 20:33:52
>>401じゃあ今のソースをコピペしてみて。
403389:2006/12/12(火) 20:36:32
#include<stdio.h>

main()
{
int i,n;
double s;
printf("n="); scanf("%d",&n);
i=n; s=0.0;
while (i>0){
s+=1.0/(i*i);
--i;
}
printf("n=%d,s=%f|n",n,s);
}


これです
404デフォルトの名無しさん:2006/12/12(火) 20:36:39
(double)がないから
405デフォルトの名無しさん:2006/12/12(火) 20:37:58
と思ったけど1.0だから違うか
406デフォルトの名無しさん:2006/12/12(火) 20:46:57
>>403
gccで普通に動いたぞ。
>>395じゃないけどどこの糞コンパイラだそれ。
407389:2006/12/12(火) 20:51:51
あれ、さっきまで1.000だったのに・・・

これでできました。

みなさん本当にありがとうございました。
408デフォルトの名無しさん:2006/12/12(火) 20:53:21
ちょっとまて。
コンパイラ名を教えろ。
409389:2006/12/12(火) 20:54:24
gccです。
410247-253:2006/12/12(火) 21:00:51
>>378
ご返答、ありがとうございます。

>>>配列の添え字は0から要素数-1までだけど、そのプログラムはforをi=1から回してるからずれる。
それを修正するために-1してるわけ。

自分なりの解釈なのですが、これは [] の中は0から始まり・・・
参照などする時に1から数えて余るのと、ほぼ意味は同じでしょうか?
>>要素数-1
これが、難しいのですが、今上で述べた事でしょうか?
411デフォルトの名無しさん:2006/12/12(火) 21:02:34
じゃあ操作に間違いがあったのかな?
コンパイル前に変更したソースを保存してなかったとか?
よくわからんけどお疲れ。
412デフォルトの名無しさん:2006/12/12(火) 21:02:56
>>410
a[5]だったらa[0]〜a[4]まで使える
それさえ知っていれば自ずと全てがわかるはず
413389:2006/12/12(火) 21:08:00
2つの違い(1からnとnから1)
がわかりました。

どうやら操作を間違っていたようです^^
どうもありがとうございました。
414247-253:2006/12/12(火) 21:28:14
>>412
5でa[0],a[1],a[2],a[3],a[4]ですね。

あと、もう一つわからないのが
>>245->>246に出てくる96や94等です。

これで、何故いきなり97や96が出てくるのかです
入門書に依れば、二次元配列のx方向、y方向それぞれの
位置に変換します。これはどちらも文字列なので、
x方向は1となっていれば数値の1としたいところですが、
文字の「1」なので数値に変換します。
y方向のa,b,c・・・・はそれぞれ数値で表せるので-96を行えば
二次元配列のy方向を表す数値1,2,3に変換できます。
ついでなので、x方向も同じ方法で直します。
文字の「1」は数値で表すと49です。
よって、-48を行えば文字「1」「2」「3」・・・数値1,2,3・・に変換できます。

と記されていますが、突然1は49とか意味が全くわかりません
ご助言、お願い致します。
415デフォルトの名無しさん:2006/12/12(火) 21:39:54
http://hp.vector.co.jp/authors/VA008536/data/ascii.html
  ・
  ・
48(10進) = 30(16進) = '0'
49(10進) = 31(16進) = '1'
  ・
  ・
96(10進) = 60(16進) = 'a'
  ・
  ・
416247-253:2006/12/12(火) 21:48:39
>>415
ありがとうございます。
本にはこれらの事が一切触れられていなかったので
わかりませんでした。
417デフォルトの名無しさん:2006/12/12(火) 21:53:34
'0'を引いたり'a'を引けばいいよ。
int i = str[1] - '0';
int j = str[0] - 'a';
これだと見やすいし数字覚えなくてもいいし。
418247-253:2006/12/12(火) 22:32:39
>>417
int i = str[1] - '0';
int j = str[0] - 'a';
は、>>414と同じ事なのでしょうか?
419デフォルトの名無しさん:2006/12/12(火) 22:55:18
>>246
int i = str[1] - 48;
int j = str[0] - 96;
の部分と>>417
int i = str[1] - '0';
int j = str[0] - 'a';
は同じことです。
'0'は数値の48として、'a'は96として使えます。
printf("%c %c\n",'0','a');//0 a
printf("%c %c\n",48,96);//0 a
printf("%d %d\n",'0','a');//48 96
printf("%d %d\n",48,96);//48 96
420418:2006/12/13(水) 00:56:42
ありがとうございます!しっくり来ました!
こう考えた方が原理の方も理解し易いです。
421デフォルトの名無しさん:2006/12/13(水) 04:37:21
Cやろうとおもう
422デフォルトの名無しさん:2006/12/13(水) 06:36:31
文字を16進数に直して配列に格納するにはどうすれば良いでしょうか?
423デフォルトの名無しさん:2006/12/13(水) 06:53:16
16進数ってのは表記上の問題だから、文字列にするということだな。
charの配列に格納すると解釈していいんだよな。ならばsprintfを使う。

char buf[16];
sprintf(buf, "%x", 'a');

とかやればbufに文字aの16進表記("61")が格納される。
424デフォルトの名無しさん:2006/12/13(水) 08:41:11
間違ってもitoaなんて使うなよ!使うなよ!
425qqqq:2006/12/13(水) 10:52:33
アルファベットのAからZまでの文字列に対して,
実行例のように表示できるプログラムをポインタを
用いて作成,確認せよ.
参考:参考書「基礎C言語」p.115
426qqqq:2006/12/13(水) 10:55:15
abcde
bcde
cde
de
e
427qqqq:2006/12/13(水) 10:56:21
お願いします。
428デフォルトの名無しさん:2006/12/13(水) 10:59:18
int a=2,b=5;
double d;

d=a/b;
みたいにするdが0になっちゃうんですが、直し方を教えて下さい。
429992:2006/12/13(水) 11:00:11
double a = 2.0,b = 5.0;
double d;
d = a/b;
430デフォルトの名無しさん:2006/12/13(水) 11:06:07
>>425
宿題なら宿題スレへ
431デフォルトの名無しさん:2006/12/13(水) 11:07:44
>>429
a,bのint型は変えられないんですが、どうしたらいいでしょうか?
dは0.2みたいな値になることが多いので、int型だと0になってこまります
432qqqq:2006/12/13(水) 11:07:48
わかりました。
433429:2006/12/13(水) 11:08:28
intは整数型だから割り算すると小数以下は切り捨て。
d=a/b;// 2/5 = 0.4 -> 0が代入される
aとbをintのままにしたければ代入してdouble型にしてから演算。
d = a;// 2を代入(自動でdouble型の2.0に変換)
d /= b;// 2.0/5 = 0.4 が代入される
434デフォルトの名無しさん:2006/12/13(水) 11:09:52
>>431
「キャスト」を調べれば幸せになれるよ
435デフォルトの名無しさん:2006/12/13(水) 11:11:34
>>433
できました
ありがとうございました。
436429:2006/12/13(水) 13:23:51
>>435
>>434の言うキャストは調べた?
aをdoubleの2.0に変換(キャスト)してからbで割る
d = (double)a/b;
ちなみに double/int は double/double に自動で変換される。
(double)2/5 -> 2.0/5 -> 2.0/5.0 てな具合。
この辺は大事な基礎だからがんばれ。
437デフォルトの名無しさん:2006/12/13(水) 13:39:46
質問です。補数の意味とはなんでしょうか。
438デフォルトの名無しさん:2006/12/13(水) 13:42:48
利点
基数の補数を負の数の表記法として採用すると、最上位桁からの桁上がり(オーバーフロー)を無視すれば、通常の加算処理で負の数の加算(つまり正の数の減算)が行えることになる。

この利点のため、2の補数は多くのコンピュータで負の数の内部表現に採用されている。
439デフォルトの名無しさん:2006/12/13(水) 14:29:19
32ビットデータで12〜15ビット目(4ビット)をチェック(ビットテスト)して、
ゼロであれば上位2バイトに1を代入、ゼロ以外であれば2を代入する式を
ビットフィールドを使って作成したいのですがうまく行きません。
おかしな点をご指摘頂ければとても有り難いです。
http://sa-wiki.com/upload/src/up0080.txt
440デフォルトの名無しさん:2006/12/13(水) 14:33:32
441437:2006/12/13(水) 14:36:06
>>438
そういう意味でしたか。
ご解答有難うございます!!!
442デフォルトの名無しさん:2006/12/13(水) 14:37:12
>>439
コンパイルが通らない
443439:2006/12/13(水) 14:46:05
え、ほんとですか。自分のIDE環境(BCデベロッパー)では
出来るんですが、、、。でも値は全然変わらなくて
初期設定どおりに値が表示されてしまいますTT
444デフォルトの名無しさん:2006/12/13(水) 14:54:46
>>443
たぶんエンディアンを理解していない
リトルエンディアンとビッグエンディアンについて調べてみた方がいい

void dump(void *p, int n)
{
int i;
for(i=0;i<n;i++)
printf("%02x", *((unsigned char*)p+i));
printf("\n");
}
↑メモリ上での配置を確認できる関数。以下のように使う
dump(&nValue, sizeof(int));
dump(&xyz, sizeof(xyz));
445デフォルトの名無しさん:2006/12/13(水) 15:17:31
引数使った関数の中で使った関数に、最初の引数をそのまま渡す事できますか?

つまり、
void nantoka1(double hikisu);
void nantoka2(double hikisu);
main(){
double hikisu;
......
nantoka1(hikisu);
}
void nantoka1(double hikisu){
.....
void nantoka2(double hikisu);
}
446デフォルトの名無しさん:2006/12/13(水) 15:24:02
>>445
できるけど書き方が違う。
関数を呼び出すときは型は指定しない。
void nantoka1(double hikisu){
.....
nantoka2(hikisu);
}
447439:2006/12/13(水) 15:28:05
メモリ上の配置を確認したら構造体は意図した通りの順番
なのですがnValueに関してはff0f ffffとなっています。これは、、、
バイトとしては逆の順番で、そのバイトの中での4ピットについても
逆の順番で格納されているということなのでしょうか。nValueはffff 0fff
と意図していたのですが。
448デフォルトの名無しさん:2006/12/13(水) 15:32:36
>>446

即答ありがと
449デフォルトの名無しさん:2006/12/13(水) 15:46:00
>>447
リトルエンディアンの環境だとバイトが逆順になる
http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3
上に書かれている通り、
1byte(8bit)ごとの順番は逆にはならない(12 34 AB CD => CD AB 34 12)
だからソース上で0xffff0fffとしたものは、メモリ上ではff0fffffと格納される

そういえば>>439の12〜15ビット目というのが上位から数えるのか下位からなのかが書いてないからわからん
450439:2006/12/13(水) 15:58:49
すみません、上位から数えて12〜15ビット目で、変更するのは上位2ビット
です。
451デフォルトの名無しさん:2006/12/13(水) 16:14:48
マスク処理の易しいサイト教えてください
452デフォルトの名無しさん:2006/12/13(水) 16:17:42
>>450
変更は2バイトじゃなかった?
453439:2006/12/13(水) 16:19:03
間違えました2バイトです。
454デフォルトの名無しさん:2006/12/13(水) 16:37:54
>>453
上位12〜15bitと上位2byteは領域がかぶっているから共用体も使った
typedef struct st_hoge{

unsigned zero :8;
unsigned set :8;
union {
struct {
unsigned n4Bits : 4;
unsigned n12Bits : 12;
}foo;
unsigned short s;
}n16;
}ST_HOGE;

void Func(int *pValue)
{
ST_HOGE *p = (ST_HOGE *)pValue;
if( p->n16.foo.n4Bits ==0 )
{
p->n16.s = 1;
}
else
{
p->n16.s = 2;
}
}

あと上位12〜15bitってことは
int nValue = 0xfff0ffff;
ではないかい?
455デフォルトの名無しさん:2006/12/13(水) 16:39:53
>>454
#pragma pack(push, 1)をincludeの下にでも書いておいて
BCCでは動くはず
VCだとどうだったかな
456453:2006/12/13(水) 17:05:51
>>454
ありがとうございます。また間違えました。下から数えて12〜15bit
でした。0xffffffffだと0x0002ffffになって、0xffff0fffだと0x00010fff
の形になります。
457デフォルトの名無しさん:2006/12/13(水) 17:20:36
>>456
しっかりしてくれよ、無駄に苦労したじゃねーか
でもそうなると話は簡単だ
上の方のエンディアンの話を理解していれば構造体を少し書き換えるだけで動くはず
458デフォルトの名無しさん:2006/12/13(水) 18:19:44
http://eggrice.no.land.to/up/src/tohoh0083.txt
1000までの素数を表示するプログラムの第五版のコードを理解しようとしてるんですが、
15行目のcounter++, prime[i] * prime[i] <= no
がどういったことをするのか教えて頂けないでしょうか。

counterをインクリメントするだけの処理なんでしょうか?
459デフォルトの名無しさん:2006/12/13(水) 18:21:39
条件判定の中でも乗算してるからそれもカウントしてるのかな?
460458:2006/12/13(水) 18:31:46
アッー!
確かに最後の表示は"乗除"を行った回数ですね。

第四版まではなんとか理解できたけど第五版は理解するのに時間かかりそうです。。。

ありがとうございます。
461デフォルトの名無しさん:2006/12/13(水) 19:33:07
>>458
第4版とか第5版って何だ?
462デフォルトの名無しさん:2006/12/13(水) 20:04:37
2個の値を返す関数ってつくれますか?
463デフォルトの名無しさん:2006/12/13(水) 20:08:31
>>462
戻り値に構造体使う
464デフォルトの名無しさん:2006/12/13(水) 20:12:12
>>463
同時に返すんじゃなくて、
for文の中にif文があってそのなかで1つを返して、
for文終了後にもう一つ返したいんですが、if文のなかで値を返すとそこで処理が終わってしまうんで、困ってます
465デフォルトの名無しさん:2006/12/13(水) 20:13:12
>>464
マルチスレッド?
466デフォルトの名無しさん:2006/12/13(水) 20:17:04
>>465
マルチスレッドというのがわからないですが、ある条件の時のfor文のiの値と
for文の中で加算していったsumの値をmain関数で使いたいんですが
467デフォルトの名無しさん:2006/12/13(水) 20:17:20
>>464
for( i=0 ; i< 100 ; i++ )
{
if( 条件) return 戻り値1  …@
}
return 戻り値2 …A

@で戻すとAが戻せない
@で戻した後Aも戻したい
ということか?
468デフォルトの名無しさん:2006/12/13(水) 20:18:46
>>467
そのとおりです
469デフォルトの名無しさん:2006/12/13(水) 20:22:58
>>468
提案1
以下の構造体を宣言する
struct return_value
{
戻り値A;
戻り値B;
};

for( i=0 ; i< 100 ; i++ )
{
if( 条件){
return_value.戻り値A = main に返したい値A
この条件が成立したらforを終了させたいなら break をここに入れる
}
}
return_value.戻り値B = main に返したい値B

return return_value; 戻り値Aと戻り値Bが入った構造体を返す

470デフォルトの名無しさん:2006/12/13(水) 20:32:55
>>469
できそうですね。ありがとうございます
471デフォルトの名無しさん:2006/12/13(水) 20:56:04
>>469
構造体を返そうとすると互換でない型変換ってなってコンパイルできません・・・・
472デフォルトの名無しさん:2006/12/13(水) 21:08:11
char str[]="9104021385231";
char op1[100];
char *p1=str;
int i;

for(;*p1;p1++);
(中略)

printf("!!:%s\n",p1);         //!!:104021385231
for(i=0;str<p1 && i<4;i++,p1--);
printf("!!:%s\n",p1);         //!!:9104021385231
strncpy(op1,p1,i);
printf("!%s\t\t%d\n",op1,i);    //!9040 1


p1が配列strの先頭を差すか、繰り返しが4回起こると終了。
p1が指しているアドレスからi個の文字列を、配列op1にコピー・・・のつもり。

strncpy(op1,p1,i)には"9"だけがコピーされると思っているのですが、
何故か"9040"と入ってしまいます。
1文字だけコピーしてくれない所か、
何故2番目の文字を飛ばしてしまうんでしょうか?

それまでは
52312138
1040
473デフォルトの名無しさん:2006/12/13(水) 21:09:20
途中で送信しちゃいましたorz

それまでは
5231
2138
1040
という風にコピーされています。
474デフォルトの名無しさん:2006/12/13(水) 21:10:27
>>471
上のソース(?)をそのまま使っちゃダメだぞ
型宣言
struct return_value
{
int a;
int b;
};

ソース
int main()
{
return_value rv;
rv = func(引数)
}
return_value func(引数)
{
return_value rv;
rv.a = 10;
rv.b = 20;
return rv;
}
のようにしたか?
475デフォルトの名無しさん:2006/12/13(水) 21:13:44
>472
9だけだコピーされたから1040が9040になったんじゃないの?
476458:2006/12/13(水) 21:16:44
>>461
柴田望洋の参考書で素数を表示するプログラムがだんだん難しくなっていくんです。
最初は乗除する回数が78022回で77423、38678、14622、
そしてさっきの第五版では3774回まで乗除する回数が減っていくんですけど
ギリギリ理解してる程度なので第五版を理解するのを頑張ってます。
477デフォルトの名無しさん:2006/12/13(水) 21:23:53
>>475
理解しました。
コピーって9\0じゃ無かったんですねorz
478デフォルトの名無しさん:2006/12/13(水) 21:25:59
>>474
そうしてるんですが。エラーがでます
479デフォルトの名無しさん:2006/12/13(水) 21:32:32
>>478
じゃアドレスわたす
struct return_value
{
int a;
int b;
};
return_value func( return_value *rv )
ソース
int main()
{
return_value rv;
func(&rv);
・・・・・・
}
void func(return_value *rv)
{
rv->a = 10;
rv->b = 20;
}
480デフォルトの名無しさん:2006/12/13(水) 23:02:59
>>479
関数の型structにしたらできました
481デフォルトの名無しさん:2006/12/13(水) 23:08:19
>>480
乙サソ
482デフォルトの名無しさん:2006/12/13(水) 23:39:37
rand関数で発生させる数の上界は% 100 +1とかできるのはわかるんですが下界はどうやってきめますか?
483デフォルトの名無しさん:2006/12/13(水) 23:44:15
>>482
下界の分だけ上乗せすればいい
484デフォルトの名無しさん:2006/12/14(木) 00:01:11
>>479
このスレではあんたが馬鹿。
485デフォルトの名無しさん:2006/12/14(木) 01:24:07
>>484
このスレだけなのか
486デフォルトの名無しさん:2006/12/14(木) 01:30:35
>>485
C++スレならOKだから。
487デフォルトの名無しさん:2006/12/14(木) 11:31:44
突然すみません
カーソルハンドルの
HCURSOR GetCursor(VOID); を
C言語で書きたいのですが、まったく書き方が分りません。
どなたか、教えてください。
初心者です。
488デフォルトの名無しさん:2006/12/14(木) 12:52:26
文字コードを繋げるにはどうすれば良いでしょうか?
例えば0x01と0x02を繋げて0x12にするといった感じです

具体的には、2つの領域をもつ文字型配列があって、中には1と2が格納されています。
この文字数値をコードとみなして連結するという処理です。
それぞれから'0'を引き、1の方を4ビット左シフトして双方を足せば良いのかなと思ったのですがうまくいかないので違うのでしょう。

どうすればよいのか途方に暮れています。
どなたかお力添えお願い致します。
489デフォルトの名無しさん:2006/12/14(木) 13:04:18
>>488
うまくいかないというならソースを見せろ
あと文字の1は'1'と書いた方がよい。
490デフォルトの名無しさん:2006/12/14(木) 13:20:38
携帯からなので書き間違い等あるかもしれませんが・・・

#lnclude<stdio.h>
maln()
{
char b, a[2]={'1','2'};
b=(a[0]-'0')<<4;
b+=a[1]-'0';
printf("%c",b);
}
491デフォルトの名無しさん:2006/12/14(木) 13:34:55
すみません、書き忘れです・・・
この方法で4バイト文字を表現するのが目的なので実際は4つの領域の配列に入った数字を二つずつまとめてコードにしたいのです。

例えば(コードは適当です)
a['1','2','3','4'];
これを
b[0x01,0x02,0x03,0x04];
このようにするのが最終的な目的です。
492デフォルトの名無しさん:2006/12/14(木) 13:36:05
>>490
どういう結果を期待しているんだ?
'1'=0x31, '2'=0x32
printf("%x",b);
と確認したら0x12になるよ
493デフォルトの名無しさん:2006/12/14(木) 13:40:12
おっとリロードしてなかった。まだよくわからない。
>>491をみると
for(i=0;i<4;i++)
b[i] = a[i]-'0';
こうしたいように思える
494デフォルトの名無しさん:2006/12/14(木) 14:00:02
度々申し訳ない、間違いがたくさんありました。

4バイト文字ではなく2バイト文字ですね。
それから、先に書いたb配列は間違いで、こちらが正しいです。
1と2と3と4が格納されたa配列から、以下のようなb配列を最終的には用意したいのです。
b[0x12,0x34];
a配列の先頭から2つずつ、'0'を引いて合体させて1つの16進コードを作ってb配列に格納するのが目的です。
495デフォルトの名無しさん:2006/12/14(木) 14:04:55
>>494
それなら>>490であってるよ。あえて書くと
char b[2], a[4]={'1','2','3','4'};
for(i=0;i<2;i++) {
b[i]=(a[2*i]-'0')<<4;
b[i]+=a[2*i+1]-'0';
}
496デフォルトの名無しさん:2006/12/14(木) 21:23:54
>>487
HCURSOR型がwindows.hで定義されてるから、C言語の呼び出し規約に従って
書けばOKじゃないんでしょうか?
497デフォルトの名無しさん:2006/12/14(木) 22:42:40
>>496
マルチして回答貰ってるみたいだからレス返ってこないかと
498496:2006/12/15(金) 00:20:34
ふぁあああああああっく!
499デフォルトの名無しさん:2006/12/15(金) 07:38:16
UNIX環境での質問です。

ccコマンドで複数ソースファイルをコンパイルした後に
オブジェクトファイルをリンクさせて実行ファイルを作るときに

リンカーは何を参照して、(incluleしていない)別のソースファイルから作成したオブジェクトファイルを紐付けているのですか?
関数名?
だとしたら全く他のアプリで同じ関数名を使用していたらどうなるのですか?
よろしくお願いします。
500デフォルトの名無しさん:2006/12/15(金) 07:41:58
捕捉です。
オブジェクトファイルはアーカイブにまとめて入れています。
501デフォルトの名無しさん:2006/12/15(金) 10:21:14
>>499
何と何を紐付けるはなしかな?
リンカーがやることは、
・与えられたオブジェクトファイルをくっつける
・それでもまだ未定義なシンボルがあれば、そのシンボルを持つ
オブジェクトをライブラリからひっぱってきてくっつける

「他のアプリ」とやらが出てくる余地はないと思うですよ。
502デフォルトの名無しさん:2006/12/15(金) 11:03:36
質問です。オプションで-lを使用したいのですが、プログラムにはどのような記述をしたらいいのでしょうか?
503デフォルトの名無しさん:2006/12/15(金) 11:15:50
504デフォルトの名無しさん:2006/12/15(金) 12:24:06
「token1<TAB>token2<TAB>token3<TAB>token4<TAB>........token6」
と、6つの単語がタブで分けられているテキストファイルを読み込み、
char* []の形で単語を順に代入していくプログラムを作りたいのですが、どうすればいいのでしょうか
505デフォルトの名無しさん:2006/12/15(金) 13:23:35
>>504
fscanfでググれ
506デフォルトの名無しさん:2006/12/15(金) 13:49:05
>501
レスありがとうございます

具体的に述べると
aaa1.o …main
bbb1.o …main
アーカイブのライブラリに
aaa2.o …sub
bbb2.o …sub
が入っているとします。

aaa1.oとアーカイブからaaaという実行ファイルを作りたいときに
aaa1.cから呼び出している関数と同名の関数が
aaa2.c内でもbbb2.c内でも定義されていたらリンカーはアーカイブ内のどちらを参照するのでしょうか?


507デフォルトの名無しさん:2006/12/15(金) 13:56:39
見つけた順
508デフォルトの名無しさん:2006/12/15(金) 14:49:29
>>506
ふつうは、同じシンボルを提供している複数のオブジェクトを一つのラ
イブラリに入れたりしない。リンカーはライブラリ内で最初に見付けた
オブジェクトを採用するだけでしょう。




509デフォルトの名無しさん:2006/12/15(金) 15:18:12
>506
>507
ありがとうございます
なるほど。やっぱり一緒にしないですよね…
助かりましたー
510デフォルトの名無しさん:2006/12/15(金) 16:40:55
複数ファイルからなる数千行規模のプログラムの作り方を学びたいんですけどどうしたらいいですか
511デフォルトの名無しさん:2006/12/15(金) 16:42:43
もっと小規模なプログラムなら作れると言うのであれば、後は経験あるのみ。
512デフォルトの名無しさん:2006/12/15(金) 18:47:07
機能を関数に分割するときにどういう観点から分割を行うべきなのかとか
プログラムにある機能を追加するときにどういう設計にしておと容易に追加しやすくなるのかとか
プログラムの一部を変更したときに他の変更箇所をできるだけ少なくするにはどうしたらいいのかとか
いうことを学びたいんですどうしたらいいですか
513デフォルトの名無しさん:2006/12/15(金) 18:48:40
>>512
経験あるのみ
514デフォルトの名無しさん:2006/12/15(金) 18:49:43
>>512
とりあえず何か作ってみる
完成
もう一度作りなおす
完成
もう一度作りなおす
完成

の繰り返しでおk
515デフォルトの名無しさん:2006/12/15(金) 22:40:19
scanfって入力を待ってくれないんですか?
前回入力した値を保持してスルーしてしまうんですが。

yes,noを入力してループから抜け出すかどうか判断するプログラムを書こうとしてます。
516デフォルトの名無しさん:2006/12/15(金) 22:45:13
早く返事くれー!
517デフォルトの名無しさん:2006/12/15(金) 22:45:41
1. 入力書式がバッファの内容と合わない
2. バッファの中身をそのままにしてscanfから呼出元へ戻る
3. その後さらにscanfを呼ぶと、残っているバッファから再び読み込もうとする
4. 1へ戻る。
518デフォルトの名無しさん:2006/12/15(金) 22:45:45
>>515
>>1-50の間に答えがあります
519デフォルトの名無しさん:2006/12/15(金) 22:53:35
>>517
>>518

変数が数字だと上手くいくようです。yやnと言うような文字変数では上記のような
症状が出ます。なぜでしょうか?
520デフォルトの名無しさん:2006/12/15(金) 22:55:42
>>519
うまくいかないコードを貼ってください
521デフォルトの名無しさん:2006/12/15(金) 22:56:11
>>519
入力文字列にスペースが含まれているとか
522デフォルトの名無しさん:2006/12/15(金) 22:57:00
あっ>>521は流して
523デフォルトの名無しさん:2006/12/15(金) 23:00:53
書式指定子の使い方を間違えてるとか?
524デフォルトの名無しさん:2006/12/15(金) 23:04:29
なにはともあれ
まずはソースを!
525デフォルトの名無しさん:2006/12/15(金) 23:07:21
>>520

char ch='y';

do {
 for(i=0; i<10; i++){
  str_div[i]=str[k];
  k++;
 }
 str_div[i]='\0';

 printf("%s",str_div);
 printf("\n続きを表示しますか?(y/n)?\n");
 scanf("%c",&ch);
} while(ch=='y');

int型だと上手く行きます。
526デフォルトの名無しさん:2006/12/15(金) 23:14:30
>>525
y\n を入力

yを読みこむ

\nを読みこむ

終了
527デフォルトの名無しさん:2006/12/15(金) 23:23:14
>>525 こんな感じに変更してみては?
#include<stdio.h>

int main(void){
  char ch[2]="y";

  do{
    printf("\nPrint next ? (y/n) :");
    scanf("%1s", ch);
  }while(ch[0]=='y');

  return 0;
}
528デフォルトの名無しさん:2006/12/15(金) 23:25:28
>>526

ループから抜けないんですが。
529デフォルトの名無しさん:2006/12/15(金) 23:30:10
>>526

失礼しました。その理屈で当たってます。
[ch!='n'にするとループが抜けないんですが]と言う意味です。
530デフォルトの名無しさん:2006/12/15(金) 23:33:06
>>527

配列を用いるのはなぜでしょうか?
とりあえず変更してトライしてみます。
531デフォルトの名無しさん:2006/12/15(金) 23:34:53
ヒープソートの命令実行回数で、500、1000、…でずっと同じ値になってしまうんですが、どこがいけないかみてください。

#include<stdio.h>
#include<stdlib.h>
#define A 100000

void Open();
void Heap();
void DownHeap();
void swap();
void Print();
int length[A];
double ct;

int main(int argc, char *argv[]){
int jk;
if(argc<3){
printf("miss\n");
return(-1);
};
ct=0.0;

jk=atoi(argv[2]);
Open(argv[1]);
Heap(length, jk);
Print(argv[2]);
printf("ct = %.0f\n", ct);
return(0);
};
532デフォルトの名無しさん:2006/12/15(金) 23:36:17
/*ファイルをオープン*/
void Open(char *file){
int i;
FILE *fp;
fp=fopen(file,"r");
if(fp==NULL){
printf("ファイルをオープンできない\n");
};
/*ファイルの読み込み*/
for(i=0; i<A; i++){
fscanf(fp,"%d",&length[i]);
};
/*ファイルをクローズ*/
fclose(fp);
};
/*Heap Sort*/
void Heap(int n){
int leaf, root;
leaf=n;ct++;
root=n/2;ct++;
ct++;
while(root>0){
DownHeap(leaf, root);ct++;
root--;ct++;
};
ct++;
while(leaf>0){
swap(0, leaf);ct++;
leaf--;ct++;
DownHeap(leaf, 0);ct++;
};
};
533デフォルトの名無しさん:2006/12/15(金) 23:36:35
>>527

成功しました。美しい
534デフォルトの名無しさん:2006/12/15(金) 23:38:35
void DownHeap(int leaf, int root){
int i;
i=root*2;ct++;
ct++;
while(i<=leaf){
ct++;
if(i<leaf && length[i+1]>length[i]){
i++;ct++;
};
ct++;
if(length[root]>=length[i]){
break;ct++;
};
swap(root, i);ct++;
root=i;ct++;
i=root*2;ct++;
};
};

void swap(int i, int j){
int temp;
temp=length[i];ct++;
length[i]=length[j];ct++;
length[j]=temp;ct++;
};
535デフォルトの名無しさん:2006/12/15(金) 23:39:35
/*表示*/
void Print(char *sm){
int i;
int an;
/*char型をint型に変換*/
an=atoi(sm);
for(i=0; i<an; i++){
printf("%d\n", length[i]);
};
};

以上です。
ソートの部分がおかしいと思うのですが、よくわかりません。
おねがいします。
536デフォルトの名無しさん:2006/12/15(金) 23:45:43
>>527

%1sってどんな意味があるのでしょうか?
ちなみに自分が逆の立場なら教えませんがW
537デフォルトの名無しさん:2006/12/15(金) 23:47:12
538デフォルトの名無しさん:2006/12/15(金) 23:57:43
>>537

親切なのかな?W
539デフォルトの名無しさん:2006/12/16(土) 00:01:58
>>536
1文字の読み取り
540デフォルトの名無しさん:2006/12/16(土) 00:08:26
>>539

了解。これから頑張って勉強して行きます。

皆さんありがとうね
541デフォルトの名無しさん:2006/12/16(土) 01:29:20
素数を表示させるようにしたいんですけど、うまくいきません。
どこがおかしいか教えていただけないでしょうか?

#include <stdio.h>
void main(void)
{
int a,i,j,n;
double b;
printf("整数aを入力してください\na=");
scanf("%d",&a);
n=0;
printf("整数a以下のすべての素数は\n");
for(i=1;i<=a;i++){
for(j=1;j<=i-1;j++){
b=i/j;
if(i==b*j){
n=n+i;}
}
if(n==2){
printf("%d\n",j);}
}
}
542デフォルトの名無しさん:2006/12/16(土) 01:36:28
そっすね
543デフォルトの名無しさん:2006/12/16(土) 01:43:15
>541
n=0の位置
n=n+iじゃなくてn=n+1
j<=i-1じゃなくてj<=i
544デフォルトの名無しさん:2006/12/16(土) 01:43:25
>>541
色々突っ込み所はあるが…
まず、1は含めちゃ駄目だ。
それと、キャストについての話はおいとくとして、%演算子って知ってる?
それ使うと楽だよ。
545デフォルトの名無しさん:2006/12/16(土) 01:50:16
うまくいきません。
どうしてか教えていただけませんか?


#include <stdio.h>
void main(void)
{
int a,i,j,n;
double b;
printf("整数aを入力してください\na=");
scanf("%d",&a);
printf("整数a以下のすべての素数は\n");
n=0;
for(i=1;i<=a;i++){
for(j=1;j<=i;j++){
b=i/j;
if(i==b*j){
n=n+1;}
}
if(n==2){
printf("%d\n",j);}
}
}

C言語習い始めたばかりで、よく知らないんですが
ifとforだけを使っていい方法はないですか
546デフォルトの名無しさん:2006/12/16(土) 01:52:49
547デフォルトの名無しさん:2006/12/16(土) 01:54:33
for(j=1;j<=i;j++) →or(j=1,n=0;j<=i;j++){

nで割り切れる数を数えてるんだろ?
だったら数が変わるごとに0に戻してやらなきゃ
548デフォルトの名無しさん:2006/12/16(土) 01:55:54
>>541
その素数判定アルゴリズムがわからん。
32ビット以上の素数判定とかしないんなら
素直に2〜(判定する数-1)までのmodが
どれも0にならなきゃ素数でいいんじゃないの。こんな感じに。
#include <stdio.h>
int isprime(int s)
{
int i=2;
while(i<s){
if(!(s%i))
return 0;
i++;
}
return 1;
}
void main(void)
{
int a,i,j,n;
double b;
printf("整数aを入力してください\na=");
scanf("%d",&a);
printf("整数a以下のすべての素数は\n");
for(i=1;i<=a;i++)
if(isprime(i))printf("%d ",i);
}
549デフォルトの名無しさん:2006/12/16(土) 02:10:52
nって約数の数?
約数の数が2だったら素数ってことかな。
1とその数自身で割った場合だけインクリメントすれば2になる。
550デフォルトの名無しさん:2006/12/16(土) 02:16:24
#include <stdio.h>
void main(void)
{
int a,i,j,n;
double b;
printf("整数aを入力してください\na=");
scanf("%d",&a);
n=0;
printf("整数a以下のすべての素数は\n");
for(i=1;i<=a;i++){
n = 0;
for(j=1;j<=i;j++){
b=i/j;
if(i==b*j){
n=n+1;}
}
if(n==2){
printf("%d\n",i);}
}
}
もとのをできるだけ尊重すればこうか。
b=i/j;
if(i==b*j){
のところは
if(i%j==0){
ってするのが普通。
%は剰余演算子って言って余りを求めるから割り切れるかどうか判定するときには便利。
551デフォルトの名無しさん:2006/12/16(土) 02:30:59
ありがとうございます。わかりました。
printf("%d\n",j);→printf("%d\n",i);とnの位置
の間違えでした。
552デフォルトの名無しさん:2006/12/16(土) 20:15:22
a[1]++;
a[3]++;
a[5]++;

a[]という配列があって↑のように1、3、5だけ+1したい時、
もっと簡単に記述する方法はありますか?
553デフォルトの名無しさん:2006/12/16(土) 20:20:51
i=0からとして
(*(a+1+i*2))++とでもしてまわせばいいのではないか
554デフォルトの名無しさん:2006/12/16(土) 20:34:34
>>552
1,3,5だけならそのままの方がいいだろ
奇数番目を、というなら>>553
555デフォルトの名無しさん:2006/12/16(土) 20:37:34
>>552

>>553の頭の悪い記述を直してあげると

    a[i*2+1]++;

これでOK
556デフォルトの名無しさん:2006/12/16(土) 20:38:31
ループ変数自体を奇数で回したほうがイイ
557デフォルトの名無しさん:2006/12/16(土) 20:38:40
そう書いたら分かりやすくなっちゃうじゃないか
558デフォルトの名無しさん:2006/12/16(土) 20:39:39
>>556
うん、たしかにその通りだね
559デフォルトの名無しさん:2006/12/16(土) 20:52:11
a[i<<2&1]++;
560デフォルトの名無しさん:2006/12/16(土) 20:53:54
>>559
i<<1&1だよpugya-
561もしかして釣られた?:2006/12/16(土) 20:57:57
&でいいのか?
562デフォルトの名無しさん:2006/12/16(土) 21:03:01
演算子の優先順位に注意
563デフォルトの名無しさん:2006/12/16(土) 21:03:51
>>559
馬鹿すぎる
564デフォルトの名無しさん:2006/12/16(土) 21:22:39
a[(i<<1)+1]++;
565デフォルトの名無しさん:2006/12/16(土) 21:42:31
そこでわざわざシフト演算子を使う辺りが馬鹿すぎる。
566デフォルトの名無しさん:2006/12/16(土) 22:09:43
だなw
567デフォルトの名無しさん:2006/12/16(土) 22:10:37
というか間違いじゃね?
でもまあたぶんネタだろうな
というわけでひっかかっちゃったおw
568デフォルトの名無しさん:2006/12/16(土) 22:29:02
>>560ならおk。優先順位はシフト>ANDだし、
i<<1の最下位ビットは0だから1とANDを取れば+1と同じになる。

まあコンパイラの最適化の方が賢かろう。
569デフォルトの名無しさん:2006/12/16(土) 22:33:08
といったわけで次の質問どうぞ。
570やっぱり釣りなのか?:2006/12/16(土) 22:33:57
>>568
いや、1とANDをとると常に0になると思うんだ。
571デフォルトの名無しさん:2006/12/16(土) 22:35:27
ORかXORでないと
572デフォルトの名無しさん:2006/12/16(土) 22:43:59




    次  の  質  問  ど  う  ぞ




 
573デフォルトの名無しさん:2006/12/16(土) 23:15:50
では質問です。

ビット演算子を使って奇数を生成する方法を教えてください。
574デフォルトの名無しさん:2006/12/16(土) 23:17:07
|1
575デフォルトの名無しさん:2006/12/17(日) 00:58:51
資格のセキュアドは10ヵ月あれば独学で取れますか?
576デフォルトの名無しさん:2006/12/17(日) 01:18:33
>>575
その10ヶ月間をどう使うかによるだろうけど、真面目に勉強するなら十分すぎる時間じゃないか?
577576:2006/12/17(日) 01:21:11
おっとすまん、すれ違いだったorz
578デフォルトの名無しさん:2006/12/17(日) 01:43:23
サンクス

独学で真面目に努力するつもりです。
難易度的には如何でしょうか?すれ違いですた、すんまそ。
579デフォルトの名無しさん:2006/12/17(日) 11:23:27
(√(1+x)-1)÷√(1+x) , (x≒0)

↑これを桁落ちしないように計算するにはどうしたらいいのでしょうか?
教えてください。おねがいします。
580デフォルトの名無しさん:2006/12/17(日) 12:06:08
なるべく絶対値の近い値どうしで計算して頑張る
581579:2006/12/17(日) 13:24:04
色々計算式を変形したけどうまくいきません・・・
変形するだけではだめなのでしょうか・・・?
582デフォルトの名無しさん:2006/12/17(日) 13:33:19
分子を100^2倍とかして後で割るのはダメ?
583デフォルトの名無しさん:2006/12/17(日) 13:44:31
CでやるよりC++でSTL使ってやった方が早いような
つーかFortranの分野じゃね?
584579:2006/12/17(日) 13:55:37
C言語の課題でこの問題がでたんです。
そもそも正しい答えがわからないので答えを確かめたいのですが、
ウィンドウズの電卓では桁落ちしない正しい答えがでてるのでしょうか?

>>582
その方法を使わせてもらいます。有難うございます!
585デフォルトの名無しさん:2006/12/17(日) 14:07:56
>>579
普通に分子の有理化をしろということではないのか。
√(1 + x) - 1 = x / (√(1 + x) + 1)から、
(√(1 + x) - 1) / √(1 + x) = x / (1 + x + √(1 + x))
586デフォルトの名無しさん:2006/12/17(日) 15:43:39
シフト演算子って実際は結構使うの?
587デフォルトの名無しさん:2006/12/17(日) 16:24:22
>>586
用途は限られるが使う場面はそれなりにある。
少なくともビットフィールドほどには要らない子ではない。
588デフォルトの名無しさん:2006/12/17(日) 17:56:45
ある数値を渡されると、その数値の 2 乗を求め、
その値を return する関数 pow を作る。


main 関数において、1 から 10 までの数値の
2 乗を pow 関数を呼び出して求め、それぞれの値とその合計を表示する。

この上のソースコード教えてください。;;;
589デフォルトの名無しさん:2006/12/17(日) 17:57:37
ある数値を渡されると、その数値の 2 乗を求め、
その値を return する関数 pow を作る。


main 関数において、1 から 10 までの数値の
2 乗を pow 関数を呼び出して求め、それぞれの値とその合計を表示する。

この上のソースコード教えてください。;;;
590デフォルトの名無しさん:2006/12/17(日) 17:59:05
宿題スレにいきな。
591デフォルトの名無しさん:2006/12/17(日) 18:36:57
入門スレとはいえこれはひどい
592デフォルトの名無しさん:2006/12/17(日) 19:15:25
datファイルを読み込むにはどうすればいいのですか?
593デフォルトの名無しさん:2006/12/17(日) 19:19:54
>>592
fopen, fclose, fread, fscanf, fgets, fseek
これらの関数の使い方を調べて、自分に必要そうなものを選んで使って。
594デフォルトの名無しさん:2006/12/17(日) 19:54:50
C++なんですが、coutで2350000と表示したいんですが、
どうしても2.35e+06と表示されるんですが、どうしたらいいでしょうか?
595デフォルトの名無しさん:2006/12/17(日) 19:57:05
>594
つ スレタイ
596デフォルトの名無しさん:2006/12/17(日) 21:24:42
初心者です。
教えてください

番号  国語  数学  英語  合計
1
2
:    :     :    :
:    :     :    :


2次元配列で合計を出して、合計の降順にテーブルを並び替える方法を教えてください。

597デフォルトの名無しさん:2006/12/17(日) 21:57:44
598123:2006/12/17(日) 22:31:52
いきなりすいません。
エスケープシーケンスを使って、コンソール画面の文字色を変えたり
したいのですが思ったように動きません。
タイプミスではないことを確認するために、
http://www.kumei.ne.jp/c_lang/intro/no_28.htm
猫でも分かる、のサンプルを入力してもダメでした。
実行環境がおかしいのだと思います。

実行時、←↓ この2つの矢印を合わせたような矢印が表示されています。
(たぶん改行を表す矢印)

どこを変更すればいいのでしょうか?
実行環境は、Visual C++で、
OSはXPで、
コンソール画面右上にはC:\WINDOWS\system32\cmd.exeと表示されています。
599デフォルトの名無しさん:2006/12/17(日) 23:13:29
>>598
それの前の章で
> エスケープ・シーケンスを受けたときMS-DOSが処理してくれる
ってある通り、MS-DOSではないXPでは処理してくれない
600123:2006/12/17(日) 23:33:47
599さんありがとうございます。
コンソール画面が出てるのでこれがMS-DOSだと思ってました。
XPは違うんですね。

関連してもう1つ聞きたいのですが、
どうやればエスケープシーケンスのように、
短いコードで文字色を変えたりできますか?

windows.hのSetConsoleTextAttributeなどを使って、
文字色を変えることには成功しているのですが、
コード量が多いため大変です。
エスケープシーケンスのように短く済ませる方法はありませんか?
(SetConsoleTextAttributeをマクロで短くするしかない?)
601デフォルトの名無しさん:2006/12/17(日) 23:47:43
自分で、エスケープシーケンスを認識してWindows APIの関数呼出を行う
アプリケーションなりライブラリなりを書けばいいんだよ。
602デフォルトの名無しさん:2006/12/18(月) 00:00:34
>>598
一番楽なのはcygwin入れてgcc使うことかな
603123:2006/12/18(月) 00:17:51
601さん、602さん、ありがとうございます。
ここからは自分で進んでいけそうです。
ありがとうございました。
604デフォルトの名無しさん:2006/12/18(月) 14:49:31
main()
{
  doublea[4][4];
  
// sub(a)      ; 'double [4][4]' から 'double ** ' に変換できません。
  sub((double**)a) ;とエラー出たので、こうしてみたらコンパイルできた。

void sub(double **a)
{

}
これは正しいですか?
605デフォルトの名無しさん:2006/12/18(月) 14:58:12
正しくない。
Tの配列型を実引数に受け取れるのは、Tへのポインタ型の仮引数。
その例ではTにdouble [4]が当てはまる。

typedef double hoge_t[4];

void sub(hoge_t *a);
/* double (*a)[4]と同じ(優先順位の問題で括弧が必要)。仮引数だからdouble a[][4]でも良い */

int main(void)
{
    hoge_t a[4]; /* double a[4][4]; と同じ */
    sub(a);
}

void sub(hoge_t *a)
{
}
606デフォルトの名無しさん:2006/12/18(月) 15:03:13
fseek(in, 0L, SEEK_END);

0Lってどういう意味でしょうか?ゼロですか?
607デフォルトの名無しさん:2006/12/18(月) 15:03:54
Lはlong型を表す接尾辞
608デフォルトの名無しさん:2006/12/18(月) 15:10:51
test
609デフォルトの名無しさん:2006/12/18(月) 15:11:52
>>607
long 0
これと等価と考えていいでしょうか?
610デフォルトの名無しさん:2006/12/18(月) 15:42:58
>605
サンキュウ。
611デフォルトの名無しさん:2006/12/18(月) 15:47:39
数当てゲーム


プレーヤーが入力した数と正解を比べて表示しろ
@正解:正解ですと表示し終了
A不正解:大きいです。か、小さいです。をし表示を繰り返す

正解は0〜9までの整数一桁 整数には乱数生成を利用しゲーム毎に正解が変化するように


お願いします。どう打てばいいですか?ソースを教えて下さい
612デフォルトの名無しさん:2006/12/18(月) 15:50:22
>>611
丸投げなら宿題スレ行け
613デフォルトの名無しさん:2006/12/18(月) 16:11:07
ツカエネー
614デフォルトの名無しさん:2006/12/18(月) 17:02:36
自分でソース書く練習も兼ねて>>611を書いてみた。
宿題スレに貼ってくる。
615デフォルトの名無しさん:2006/12/18(月) 17:04:07
関数へのポインタってどう使うのか分かりません。
int gf[4]={0,1,2,3},count;
int f1(int x,int y){
int f;
f=gf[mlt(x,y)]^gf[x]^1;
if(f==0) count++;
return count;
}
int f2(int x,y){...}
int f3(int x,y){...}
...
int f100000(x,y){...}

main(){
int x,y;
for(x=0;x<4;x++){for(y=0;y<4;y++)f1(x,y)}
print("%d\n",count);
count=0;
for(...){ for(...) f2(...) }
print("%d\n",count);
}
.......
for....{ f100000 }
print(...);
}
こんな書き方してますが、これを関数を要素にもつ配列と定義できないでしょうか?
またこのとき関数に値を渡す方法が分からないのですがどなたか教えてくださいませ。
616デフォルトの名無しさん:2006/12/18(月) 17:10:28
typedef で一旦抽象化してしまえば気が楽になれる

typedef int (*MyFuncPtr_t)(int x, int y);

int main(void)
{
 MyFuncPtr_t fncArray[] = { f2, f3, .... (略), ... f1000 };
 int i, x, y;
 /* x, y を適当に設定 */
 for (i=0; i<sizeof(fncArray)/sizeof(fncArray[0]); i++)
  (*fncArray[i])(x, y);
 return 0;
}
617デフォルトの名無しさん:2006/12/18(月) 17:16:47
さっすが先輩・・・!
618デフォルトの名無しさん:2006/12/18(月) 17:25:41
今、ファイルの入出力の勉強してるんですが・・・
この先、シリアルポートを使ってハードウェアを動かす為には
どのくらい掛かるでしょうか?時間的に。
619デフォルトの名無しさん:2006/12/18(月) 17:29:29
その勉強が終わればすぐにできるでしょう。
620デフォルトの名無しさん:2006/12/18(月) 17:55:57
diffと正反対に二つのファイルで一致する行だけ表示するにはどうすれば良いでしょう?
621デフォルトの名無しさん:2006/12/18(月) 17:58:05
>>620
strcmp
622デフォルトの名無しさん:2006/12/18(月) 18:06:24
>>620
diffを作るとの同じぐらい面倒な処理が必要で、期待される結果もアル
ゴリズムも一意に決まらない。

623デフォルトの名無しさん:2006/12/18(月) 18:42:45
>>619

どうもありがとうございます。
624デフォルトの名無しさん:2006/12/18(月) 18:58:24
間接参照のレベル という語の意味がわかりません
教えてください
625デフォルトの名無しさん:2006/12/18(月) 19:03:29
>>620
diffの出力を使って加工する。
diff -D NAME(または--ifdef=NAME)した出力から #else /* NAME */を削って
cpp -D NAMEすればいいんだが、
cのソースとかだと#includeとかが処理されちゃうんで工夫して。
626デフォルトの名無しさん:2006/12/18(月) 19:40:21
>>624

ポインタとかじゃない、とシッタカぶってみる。
大体、型が合わない場合にエラーが出るね、とシッタカぶってみる。
627デフォルトの名無しさん:2006/12/18(月) 20:45:48
main(int argc,char *argv[]){}

このコードを引数なしで実行した時、argv[1][0]に'\0'が格納される事は保障されますか?
628デフォルトの名無しさん:2006/12/18(月) 20:48:06
>>627
コンパイラの実装依存
629デフォルトの名無しさん:2006/12/18(月) 20:55:56
即レスありがとうございます
三項演算子でも使うかね・・・
630デフォルトの名無しさん:2006/12/18(月) 21:43:13
<<627
というか、引数なしならargv[0]までしかないわけで、
argv[1]なんて参照したらやばくないか?
631デフォルトの名無しさん:2006/12/18(月) 21:54:59
>>627
引数 int argc で判断してください

>>629
どちら様?
632デフォルトの名無しさん:2006/12/18(月) 23:17:33
system()関数で実行した結果、コンソールに表示される内容を取得したいのですが、
どうすればいいですか?
Linuxです。

具体的には、pidofで返されるpidを取得したいです。
633デフォルトの名無しさん:2006/12/19(火) 01:12:18
strtokを使って2次元配列の文字列を","で分解してるのですが
文字列(moji[X][Y])の1行目は、strtok(*moji, ",")で一度抜き出した後
NULLを使って全て摘出出来たのですが、2行目以降(moji[X+1][Y])は
何を対象にstrtokを用いたら良いですか?間接参照じゃ上手くいかなくて・・・
634デフォルトの名無しさん:2006/12/19(火) 04:35:55
>>632
system()ではなくpopen()を使いなされ
635デフォルトの名無しさん:2006/12/19(火) 06:16:19
スレ違いかもしれませんが教えてください。

ソースみたいなものを出力したいのですが、インデントを入れる際

printf("\t");

でタブを出力したら半角8文字分開くのを4文字分にしたいのですが
方法が分かりません。

こういう時ってどうするのが一般的なんでしょうか?
636デフォルトの名無しさん:2006/12/19(火) 06:31:02
それはCの問題じゃない。タブをどう解釈するかはCの問題ではない。
637デフォルトの名無しさん:2006/12/19(火) 07:48:57
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3218.txt

これを理解しないと次の授業からついてこれなくなるといわれたのですが、
何をしているのかが全くわかりません。どなたかコメントで解説つけていただけないでしょうか。
638デフォルトの名無しさん:2006/12/19(火) 08:16:34
>>637
マルチ
639632:2006/12/19(火) 08:41:31
>>634
おはようございます。
恥ずかしながらマニュアルを読んでもよく分からないので
帰宅したら書いて試してみます。
ありがとうございました!
640デフォルトの名無しさん:2006/12/19(火) 09:56:51
FILE * fp = popen("/bin/ls", "r");
char buf[100];
while (fgets(buf, sizeof(buf), fp)) {
printf("%s", buf);
}
pclose(fp);
641デフォルトの名無しさん:2006/12/19(火) 16:58:52
独習C終わったら次何すればいいでしょうか?
642デフォルトの名無しさん:2006/12/19(火) 17:25:13
CUIの電卓作ってみろ
643デフォルトの名無しさん:2006/12/19(火) 17:30:50
それは難しそうです><
644デフォルトの名無しさん:2006/12/19(火) 17:55:55
>>643
じゃあまた読み直そう。
645デフォルトの名無しさん:2006/12/19(火) 18:56:01
schemeパーサにチャレンジ
646HELP:2006/12/19(火) 20:24:43
すまん、
core 解析してたら、この記述にぶちあたってしまた、
俺も、こんな記述したことないから C++ の拡張 にでもあるかな?
とオモって、調べたがわからなかった。。。

たぶん、core の 最初のトリガは

int func( int im char * cp)
{
 char cData[i];

で、 cData に 文字 iバイト転送 & ヌルバイト を書いて
その NULLバイト が cData[i+1] を壊し、それが めぐりめぐって
core となったようなかんじなのだが
そもそも auto 変数のサイズを 動的に 変数で指定OK?????????
647デフォルトの名無しさん:2006/12/19(火) 20:26:50
Uzeeeeeeeeeeeeeeeeeee!!
648デフォルトの名無しさん:2006/12/19(火) 20:27:27
小学生みたいな日本語だな
C99で可能だけど
649デフォルトの名無しさん:2006/12/19(火) 20:28:24
>>648
それは何度も言った
650HELP:2006/12/19(火) 20:29:02
そう、ちょっと今
おおあせり中、、、
そうなんだ、これ C99でおkなんだ

とりあえず Thanks,Thanks,Thanks,Thanks,
651デフォルトの名無しさん:2006/12/19(火) 20:34:08
母国語で書いたほうがまだ通じるんじゃね?
652デフォルトの名無しさん:2006/12/19(火) 23:01:53
>>650
無理して日本語で書いてるのか?余計わかんねーよ。
英語でおk。
653632:2006/12/20(水) 00:28:41
>>634
>>640
最高です。
ばっちり期待通りいけました!
ありがとうございました。
654デフォルトの名無しさん:2006/12/20(水) 10:53:15
>>642
#include <stdio.h>
main(){return system("perl -ne 'print eval($_).qq(\n)'");}
655デフォルトの名無しさん:2006/12/21(木) 00:18:51
独学でCを学ぶのに
一番いい参考書は 何がお勧めですか? 教えて下さいm(_ _)m
656デフォルトの名無しさん:2006/12/21(木) 00:53:53
C実践プログラミングは素晴らしい
どんな本にも書いてあるようなCの文法的なことだけでなく
プログラミングスタイルやコメントの付け方デバッガの使い方
makefileの作り方まで書かれている。
この本で学べば天才ハッカーになれること間違いなし今すぐ10冊程注文しなさい
657デフォルトの名無しさん:2006/12/21(木) 01:01:58
おまえは岩谷宏か
658デフォルトの名無しさん:2006/12/21(木) 03:07:33
>>655
ネットで十分じゃないのか?
ネットで独学しながら、アマゾンのコメントを参考にたまに本屋で立ち読みして
良書、悪書もわかってくるよ
入門用サイトも10個以上はあるし、自分が読んでみて、理解しやすいサイトをメインに
わからない考え方、使い方は他の入門用サイトで補いながら勉強するぐらいで十分だよ

あと日本語だけに限定しないで、翻訳サイトを駆使して英語のサイトも考慮入れれば
解決できない問題はないと思う
659デフォルトの名無しさん :2006/12/21(木) 05:33:23
>>655
http://wisdom.sakura.ne.jp/で基本身に付く
あとは、本も買ったけど、入門書なら技術評論社の「c言語入門本物志向が身に付く」
ってのが、入門書としては良いできと思う。技術評論社の本はあんまりはずれない。
あと、K&Rは、持ってないと馬鹿にされるが、もう今じゃ、別に持っててももって無くても
どっちでも良い。
まぁ、何にしても、ソースを書きまくるしか身にはつかんね。
俺も、結局どうやって身に付いていったのか自分でもわからん。
だから、これっていう本も知らん。
660デフォルトの名無しさん:2006/12/21(木) 11:59:13
K&Rって、今はANSI C準拠に改訂されてるの?
661デフォルトの名無しさん:2006/12/21(木) 12:29:56
Cの課題で商品の品名、価格、数量、代価(価格*数量)、総計を
計算するプログラムを作っているのですが、表示がズレてうまくいきません。
分からないなりにTabやらで色々試してみたのですがやはりダメな様です。
入門者な上に計画的に作ってないので変数など分かりにくいかもしれませんが、
私が書いたプログラムは以下

ttp://up.spawn.jp/file/up59981.txt

最後の表?というか一覧がズレずにきれいに表示される様にするにはどんな工夫が必要なのでしょうか?
加えて入力の終了条件も苦し紛れに数量0にしましたが、
よくありそうなqの入力で終了という様にした場合は
if(a[i].hinmei == 'q')
とかではおかしいでしょうか?さっき試した時にはよく分からないエラーが出たのですが
構文的におかしいという事ですかね・・・
どなたかアドバイスお願いします。
662デフォルトの名無しさん:2006/12/21(木) 12:49:09
>>661
文字列(%s)も長さ指定できる。%10s とか、 %-10sとか
そしてタブは使わずに数えて入れればそろうべ
663デフォルトの名無しさん:2006/12/21(木) 13:17:11
>>661
>if(a[i].hinmei == 'q')
if( strcmpi(a[i].hinmei,"p") == 0) か if(strcmp(a[i].hinmei,"p")==0)
664デフォルトの名無しさん:2006/12/21(木) 13:17:52
>>663
p と q 間違えた
if( strcmpi(a[i].hinmei,"q") == 0) か if(strcmp(a[i].hinmei,"q")==0)
665664:2006/12/21(木) 13:19:12
>>661
自分にアンカーしちゃった
666デフォルトの名無しさん:2006/12/21(木) 15:11:36
何らかの値を返すサブルーチンを作成する時に
引数でデータ格納先アドレスをもらいそこに格納する方法と、
returnで値を返す方法とありますが、
みなさんはどのように使い分けていますか?
667デフォルトの名無しさん:2006/12/21(木) 15:15:35
returnで値を返す方法で済むときはreturnで値を返す
668デフォルトの名無しさん:2006/12/21(木) 15:23:14
簡単な値だったり比較目的だったりするなら代入で
代入するのが大変そうなデータだったりするなら参照で
669デフォルトの名無しさん:2006/12/21(木) 15:25:05
複数の値を返す必要があるときはアドレスをもらうってことですかね。
670デフォルトの名無しさん:2006/12/21(木) 16:12:44
>>669
うん
一つしか返せないからね
671デフォルトの名無しさん:2006/12/21(木) 16:21:44
特に使い道は無いのですが
「オン状態の最上位ビットを探しそこ以下をオンにする」という一つ式を書くとすると
どういうのがあるのだろうかと気になって考えています。
一応自分はこう作ってみましたが、他にはどのようなものがあるでしょうか。

a=0x2c; //00101100
(a&0x80==0x80)*0x80
+(a&0x80==0x80)|(a&0x40==0x40)*0x40
+(a&0x40==0x40)|(a&0x20==0x20)*0x20
+(a&0x20==0x20)|(a&0x10==0x10)*0x10
+(a&0x10==0x10)|(a&0x08==0x08)*0x08
+(a&0x08==0x08)|(a&0x04==0x04)*0x04
+(a&0x04==0x04)|(a&0x02==0x02)*0x02
+(a&0x02==0x02)|(a&0x01==0x01)*0x01;
//00111111

冗長すぎますね…
672デフォルトの名無しさん:2006/12/21(木) 16:54:42
即席だから何か問題があるかも試練が

b=0x80;
for(i=0;i<8;i++){
if((a&b)!=0)break;
b>>1;
}
for(;i<8;i++){
a|=b;
}
673デフォルトの名無しさん:2006/12/21(木) 16:57:52
ぅぁ、早速問題発見
b>>1;

b>>=1;


「オン状態の最上位ビットを探し」と「そこ以下をオンにする」を分けただけ
ビット演算は使い方違うかもしれないけど、流れを汲んでもらえれば
674デフォルトの名無しさん:2006/12/21(木) 17:07:19
for (b = 1; a > b; b<<=1)
;
b -= 1;
675デフォルトの名無しさん:2006/12/21(木) 17:54:17
>>671
8bit程度であれば、テーブルを用意しておくのがベターかも。
676デフォルトの名無しさん:2006/12/21(木) 19:19:09
>>671
こういうプログラミングが楽しくなってきたらこっちにもおいで。

【高速化】ビット演算 0x02
http://pc8.2ch.net/test/read.cgi/tech/1158367586/
677デフォルトの名無しさん:2006/12/21(木) 19:20:47
*pointer++だと、
(*pointer)++と*(pointer++)のどっちになりましたっけ?
678デフォルトの名無しさん:2006/12/21(木) 19:28:36
>>677
前者。
679678:2006/12/21(木) 19:29:59
じゃなくてポインタの参照先がインクリメントされるんじゃなくて
ポインタの先が参照されたあとポインタがインクリメントされる。
680デフォルトの名無しさん:2006/12/21(木) 19:43:48
びっくりしたぁ
681デフォルトの名無しさん:2006/12/21(木) 21:16:06
Cで電卓作ってたんだけど、()のなかにまた()がある場合の書き方がわからずに挫折してしまいました。
再帰でやろうとしてたんですがうまくいかず。
実際のところはどういったアルゴリズムで動いてるんですか?
682デフォルトの名無しさん:2006/12/21(木) 21:18:03
再帰
683ぼるじょあ ◆yBEncckFOU :2006/12/21(木) 21:27:57
(・3・) エェー 再帰って・・・w
          >>681 後置記法(または逆ポーランド記法)、スタックでぐぐれお
684デフォルトの名無しさん:2006/12/21(木) 21:28:02
文字列で後の方から'('を探して、その直後にある')'を探す。
これが後の方にある項で最も内側にある括弧部分。
ループでできると思う。
685デフォルトの名無しさん:2006/12/21(木) 21:29:30
>>681
http://fxp.hp.infoseek.co.jp/arti/parser.html
がんばって検索すれば、こういうのがちょくちょく見つかる。
686ぼるじょあ ◆yBEncckFOU :2006/12/21(木) 21:30:41
(・3・) エェー 大沢あかねたんととアナ○セックスしたいなあ・・・切実だお
          最低で250万までなら余裕で出せるお
          肛○のなかに発射してしばらく挿入したままで余韻を味わって
          最後に中に放尿して引き抜いたそれをあかねたんの口できれいに
          掃除して貰いたいお・・・はあ・・・。
687デフォルトの名無しさん:2006/12/21(木) 21:30:58
いや、再帰でいいから。
688ぼるじょあ ◆yBEncckFOU :2006/12/21(木) 21:32:01
(・3・) エェー >>686誤爆だお、すまんお
          >>685 パーズw
689デフォルトの名無しさん:2006/12/21(木) 21:33:40
誤爆か。
おかしい人かと思った。
690デフォルトの名無しさん:2006/12/21(木) 21:34:02
俺の教科書はsetjmpを駆使したりして電卓ってた
691デフォルトの名無しさん:2006/12/21(木) 21:36:51
ちなみにオーム社の本

続版では消えてんのかな
692デフォルトの名無しさん:2006/12/21(木) 21:38:40
誤爆でもおかしい人であることにかわりはなく…
693デフォルトの名無しさん:2006/12/21(木) 21:40:31
どのぼるじょあか分からないけど
この板内ならコピペとして使えるな
694デフォルトの名無しさん:2006/12/21(木) 21:57:05
>最低で250万までなら余裕で出せるお
日本語変だな
最低で 〜までなら 余裕で
結局250万は上限なのか下限なのか
695デフォルトの名無しさん:2006/12/21(木) 21:57:40
OSがLinuxでエディタがemacsでコンパイラがgccなんですが
ディレクトリにある画像ファイルを出力するプログラムはどう書けばいいのでしょうか
簡単そうなのに調べても全然見つかりませぬ
696デフォルトの名無しさん:2006/12/21(木) 22:00:50
250万までなら余裕だけどそれ以下に減額されると厳しいらしい
697デフォルトの名無しさん:2006/12/21(木) 22:02:08
画像ファイルの定義を述べよ。
出力するとは具体的に何をすることか説明せよ。
698デフォルトの名無しさん:2006/12/21(木) 22:04:59
strtolってエラーの場合は0を返すけど
本当に0が入力された場合とエラーの場合ってどうやって見分けるの?
699デフォルトの名無しさん:2006/12/21(木) 22:12:06
errno
700デフォルトの名無しさん:2006/12/21(木) 22:16:16
>>697
xpeintというもので描いた画像です
その画像を他のテキストファイルに書き込んで、
そのテキストファイルを開いて出力したいです
701デフォルトの名無しさん:2006/12/21(木) 22:16:37
ありがとう
ググってみた
こんな変数があったんですね
702デフォルトの名無しさん:2006/12/21(木) 22:18:33
>>696
実に滑稽だな
ム板にきたかいがある
703デフォルトの名無しさん:2006/12/21(木) 22:30:55
>>671
とりあえず8bit決めうち
a |= a>>1;
a |= a>>2;
a |= a>>4;
bit演算の基礎テクニックだから覚えておくと役に立つかもよ
704デフォルトの名無しさん:2006/12/21(木) 22:37:06
最上位ビット以下をすべて1にする別の式を思いついた

a|a>>1|a>>2|a>>3...
これだけでわかる人も多いでしょうが一応…

aが10100の場合
 10100
  1010
  101
   10
   1
   0
   ...
を論理積するので最上位ビットがシフトダウンして一つずつ当てはまっていきます
705デフォルトの名無しさん:2006/12/21(木) 22:38:17
被った…
706デフォルトの名無しさん:2006/12/21(木) 22:49:40
>704
大丈夫、君の方が効率悪いから被ってない。
707デフォルトの名無しさん:2006/12/21(木) 22:58:30
しかもORは論理和だが
・・・まあ誰しも疲れている日があるさ
708デフォルトの名無しさん:2006/12/21(木) 23:29:11
void func(int n){
printf("%02d",n);
}
int main(){
func(2);
}

これのコードを実行すると02と表示されるじゃないですか
ここで表示されている文字列と同一の(変数は変数として受け取る)文字列を作成するマクロ関数ってできますか?

#define FUNC(n) #n

ここまでは書けたんですけど、0で埋める処理のやり方がよくわかりません
教えてください
709デフォルトの名無しさん:2006/12/21(木) 23:47:56
#define FUNC(n) printf("%02d",n)
710デフォルトの名無しさん:2006/12/22(金) 00:04:43
終端まで読まないと大きさがわからないデータファイルを
メモリ上に配列としてロードしたくてreallocを使おうと思ったのですが
(mallocしてreallocで領域を拡張しまくる)
reallocがうまく動きません
たとえば、
char *str = (char *)malloc(sizeof(char) * 8);
str = "foo";
printf("%s\n", str);
str = (char *)realloc(str, sizeof(char) * 16);
str = "foobarbaz";
printf("%s\n", str);

fatalerror - called with threadlist_ix -1
Hangup
となってしまいます…gdbで調べたらSIGSEGVとかで
セグメンテーションフォールトのようです

質問1:reallocの使い方はこれで合っていますか?(環境はCygwin + gccです)

質問2:プログラムの最初において
大きさのわからないファイルを全部メモリ上にロードしておいて、
実行終了までfreeする可能性が全く無い場合、
しかもメモリ上には配列で持っておきたい場合に
reallocで領域を拡張するほかに
良い方法があればご教授いただけませんか?
以前mallocの実装を習ったときに聞いた
sbrkというシステムコールが使えそうなんですが…

以上二点、教えてください。お願いします。
711デフォルトの名無しさん:2006/12/22(金) 00:36:12
>>710
大間違い。2行目のstr="foo";で、メモリリークしてる。
mallocで確保したポインタが失われている。
さらに、文字列リテラルのアドレスに対して、
reallocしたら、そりゃあ何が起こるかわからない。
SEGVも当然。
712デフォルトの名無しさん:2006/12/22(金) 00:37:44
>>710
質問2に答えてなかったな。
通常reallocを使うのがいいと思う。
sbrkはシステムコールというだけあって、移植性が低い。
どうせsbrkを下請けに使うんだからmalloc系を使うべし。
713デフォルトの名無しさん:2006/12/22(金) 00:53:28
>>711
即レスありがとうございます!

質問1について:strcpyしないとだめですよね…忘れてました
しょうもない質問してすいませんでした

質問2について:やっぱりreallocですか。
プログラム中で一番最初にmallocで得たポインタを
reallocし続けると、同じ先頭番地から
どんどんヒープが伸びていく
(つまりreallocしても全く同じポインタが返される)
と思っていたのですが、試してみるとそうでもありませんでした。
というわけでreallocするとメモリのフラグメンテーションが
起こりまくるのではないかと思っていたのですが
しょうがないですね…

ありがとうございました。
714デフォルトの名無しさん:2006/12/22(金) 01:09:11
>>713
ちょっと厄介だが、realloc()でサイズを増やすときにちまちま増やさずに多めに増やすといい。
C++のvectorの戦略も参考になるかもしれない。
715デフォルトの名無しさん:2006/12/22(金) 01:14:48
質問です。
とある関数Aで文字列定数のアドレスをポインタAに代入した後、
他の関数BやCでポインタAを参照した場合、文字列定数のアドレスが
有効だということは保障されていますか?
716デフォルトの名無しさん:2006/12/22(金) 01:17:39
>>715
// こういう使い方?
static inline const char * func() {return "ABC";}
void someFunc()
{
printf("%s\n", func());
}
// 全く問題ない。
717715:2006/12/22(金) 01:24:50
>>716
そんな感じです。
有難うございました。
718デフォルトの名無しさん:2006/12/22(金) 02:59:28
ハッシュ関数の意味は違う喩えを使って簡単に教えてください
人間のウンチでしょうか?
719デフォルトの名無しさん:2006/12/22(金) 08:06:07
>>709
説明のしかたが悪かったですね
「表示される文字列と同等の文字列」へのポインタがほしかったんです
お手数をかけてしまって申し訳ないのですが、なにとぞ
720デフォルトの名無しさん:2006/12/22(金) 08:26:06
>>719
sprintf()って話か?
721デフォルトの名無しさん:2006/12/22(金) 09:27:59
すいません教えてください

いきなりですが学校の課題で年賀状のあたり番号をチェックするという
プログラムを作っています。
そこで当選番号の数字を数字を入力するという作業が必要になるのでそのプログラムを
作成しようとしているのですが作れませんOTL

具体的に言うと

1等は6桁の数字なんですが文字も打てるようになってしまっています
文字を打つとはじくようにしたいです。
あと6桁という限定が上手くいかないですOTL
5桁でも通過してしまうし・・・・
722デフォルトの名無しさん:2006/12/22(金) 09:32:24
>>721
宿題スレ行ってみれば?
723721:2006/12/22(金) 09:33:42
変数が何かはいちいち説明するのは面倒なので書きませんが当選番号を入力する
ところだけ書き出しておきますのでどこが悪いか見ていただけると幸いです

/*年賀状の当選番号を入力*/
for(i=0;i<=3;i++){
printf("%d等の年賀状当選番号を入力してください。\n",i+1);
if(i<3)
printf("%d等は%d桁です。\n",i+1,6-i);
if(i==3)
printf("4等は2桁です。\n");
while(rank==0){
scanf("%ld",&tousen[i]);
if(tousen[i]<=999999 && i==0 && tousen[i]>=100000)/*1等の当選番号を入力(*指定されるべきである*/
rank=1;
else if(tousen[i]<=99999 && i==1 && tousen[i]>=10000)/*2等の当選番号を入力*/
rank=1;
else if(tousen[i]<=9999 && i==2 && tousen[i]>=1000)/*3等の当選番号を入力*/
rank=1;
else if(tousen[i]<=99 && i==3 && tousen[i]>=10)/*4等の当選番号を入力*/
rank=1;
else
printf("桁数が違いますねぇ\n");/*桁数が違った時ははじくようにする*/
}
rank=0;
}
724デフォルトの名無しさん:2006/12/22(金) 10:01:19
if(i==0 && tousen[i]<=999999 && tousen[i]>=100000)
と書いた方が分かりやすい
上限と加減の間に別の差し込んで、わざととしか思えない
725デフォルトの名無しさん:2006/12/22(金) 10:05:37
ctype.hのisalphaで文字型にアルファベットが入ってるかわかるから、
forでも使って全部チェックしてみたら〜?
726721:2006/12/22(金) 10:26:18
isdigitだとダメっぽいですか?
isalphaだとうまく書けません・・・
727デフォルトの名無しさん:2006/12/22(金) 10:40:21
こんな単純なのにアドバイスしようがない。
どうやってるのか書いてくれれば指摘できるが・・・
728デフォルトの名無しさん:2006/12/22(金) 10:54:17
>scanf("%ld",&tousen[i]);
この時点でisdigitなんかは意味ないわけだが
729デフォルトの名無しさん:2006/12/22(金) 10:54:40
>>727
scanfの%ldで読み込んでるところに文字列が入力されると
文字列は読み込まれずそのままバッファに残ってしまう。
次のscanfの呼び出しの時も残った文字列バッファを読み込もうとしてエラーを起こすから
半永久的な無限ループを起こす。(scanfが糞だと言われる所以の1つ)
文字列の入力をはじきたいならscanfの返り値を読んでちゃんと読み込めてなかったら
バッファ内のデータをいったん全部読み飛ばす(scanf("%s",tmp)とかで)か、
scanfの入力を一度%sで読み込んで、文字列がすべて数値列ならatoiで数値に変換するとかすればいい。
730721:2006/12/22(金) 11:52:37
なかなか上手く出来ないですね・・・
731デフォルトの名無しさん:2006/12/22(金) 12:06:59
だから、こうしたくてこういうコードを書いてみましたがこうなってしまって
期待通り動きません、とか書けよ。
732デフォルトの名無しさん:2006/12/22(金) 12:09:32
お前の頭の中だけな…
ここに出てるヒントで俺なら作れる

けど宿題スレじゃないんで教えてあげない

悔しかったら自分で調べろ
733ぼるじょあ ◆yBEncckFOU :2006/12/22(金) 12:13:34
>>730
(・3・)b エェー ここにソースをうpするといいお
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
           まじめに答えて欲しいときはこちらへ
http://pc8.2ch.net/test/read.cgi/tech/1165718021/
           親切な回答者がいっぱいいるお
           マルチしないようにここでの質問を取り下げることをおすすめするお
734デフォルトの名無しさん:2006/12/22(金) 12:13:43
IOバッファを理解させた方が早そう
735デフォルトの名無しさん:2006/12/22(金) 12:17:22
すでに>>721はマルチなわけだが
736デフォルトの名無しさん:2006/12/22(金) 12:26:06
マルチ先はどこ?
737デフォルトの名無しさん:2006/12/22(金) 12:32:01
http://pc8.2ch.net/test/read.cgi/tech/1165943509/504
期限過ぎてるので別人かもしれないが
738721:2006/12/22(金) 12:32:20
>>733
ありがとうございます
そちらに質問を書き込みます

ほかの皆様
おさわがせしてすいませんでした
739ぼるじょあ ◆yBEncckFOU :2006/12/22(金) 13:28:42
>>738
(・3・) エェー ヒントだけど>>733のスレに書いてやったお
>>731
頭悪すぎ
740デフォルトの名無しさん:2006/12/22(金) 13:30:31
頭良さそう>>686
741デフォルトの名無しさん:2006/12/22(金) 20:45:30
>>740
プッ…

>>719
マクロにしてポインタを返すのか…
でも文字列を格納するバッファはどうする?
たとえばあらかじめ出力先のバッファを静的に確保しておいて使用するとか…

char macro_str[MACRO_STR_MAXSIZE];
#define FUNC(n) (sprintf(macro_str,"%02d",n),macro_str)

思いついたのはこれかな
742デフォルトの名無しさん:2006/12/22(金) 23:02:33
struct_tag
の_tagとアンダースコアを使う技法を何と呼ぶのでしょうか。
うーん…思い出せない…
743デフォルトの名無しさん:2006/12/22(金) 23:08:06
プログラマーってオナニーすんの?
744デフォルトの名無しさん:2006/12/22(金) 23:09:28
誰が得するんだよそのレスは
745デフォルトの名無しさん:2006/12/22(金) 23:38:24
グラマ女が悦ぶ
746デフォルトの名無しさん:2006/12/22(金) 23:59:55
女プログラマー
略してグラメス
747デフォルトの名無しさん:2006/12/23(土) 01:20:40
メスグラマ
748デフォルトの名無しさん:2006/12/23(土) 01:30:29
未だにC言語を使ってるなんて、
なんて気の毒な環境なんだろう・・・
C++でさえお断りなのに・・・・
749デフォルトの名無しさん:2006/12/23(土) 01:32:39
>>748
きみは何を使っているの?
750デフォルトの名無しさん:2006/12/23(土) 01:53:37
JAVAとか言い出しそう
751デフォルトの名無しさん:2006/12/23(土) 02:25:52
VBとかw
752デフォルトの名無しさん:2006/12/23(土) 03:46:44
折角だから俺はRubyを選ぶぜ
753デフォルトの名無しさん:2006/12/23(土) 06:05:57
PEヘッダからバイナリエディタでゴリゴリ書いてます
754デフォルトの名無しさん:2006/12/23(土) 07:37:33
ゴリゴリってレベルじゃねーぞ!
755デフォルトの名無しさん:2006/12/23(土) 10:56:30
C言語使わなきゃならないようなシーンて何があるの?
756デフォルトの名無しさん:2006/12/23(土) 11:00:22
>>708
sprintf
757デフォルトの名無しさん:2006/12/23(土) 12:27:18
>>755
君にはそれを理解する必要はない。
758デフォルトの名無しさん:2006/12/23(土) 13:50:59
>>721
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define BUF_SIZE 1024

int get_digit(int digit){
char buf[BUF_SIZE];

while(1)
{
fflush(stdin);
printf("%d 桁の数値を入力して下さい :", digit);
fscanf(stdin, "%[0-9]", buf);
if(strlen(buf)==digit) break;
printf("\n再入力 ");
}
return atoi(buf);
}

int main(void){
printf("\n入力された数値は %06d です\n", get_digit(6));
return 0;
}
759デフォルトの名無しさん:2006/12/23(土) 14:26:23
>>708
sprintf(format,"%%%0dd",2);
printf(format,1);
760デフォルトの名無しさん:2006/12/23(土) 18:25:37
printf("%0*d", 2, 1);
761デフォルトの名無しさん:2006/12/23(土) 20:12:52
関数は一画面に収まるぐらいの行数で、とか聞きますが
1ファイルあたりの行数というのはどのくらいが限界だと思われますか?

長すぎるとお目当ての関数を探すのがめんどくさいし
ファイルを分割しすぎると、それはそれでめんどくさいです
762デフォルトの名無しさん:2006/12/23(土) 20:21:30
>>761
関数を探し出すのに困るほど長くなく、分割するのに困るほど短くないくらい。
私の場合は500行を越えるとそわそわし始めて、1000行を越える辺りまでには強行している。
勿論、まとまりがいい場合には300行だろうが100行だろうが迷わず打ち止めにする。
763デフォルトの名無しさん:2006/12/23(土) 21:39:38
stat関数をつかってディレクトリの存在チェックをしたいのですが、
うまくいきません

struct stat st;
if(stat( "/tmp/フォルダ名", &st) == 0 ){
switch (st.st_mode & S_IFMT) {
case S_IFDIR:
// ディレクトリ有り
break;
}
}else{
// ディレクトリなし
}

どこが悪いのでしょうか?
764デフォルトの名無しさん:2006/12/23(土) 21:45:44
>>763
S_IFDIR以外のビットが立ってたら判定できない。

if (st.st_mode & S_IFDIR) ...
とかで、判定するとか。
765デフォルトの名無しさん:2006/12/23(土) 22:35:54
>>761
Cではファイルスコープ以外にモジュール性を表現する手段が無いので
行数だけで機械的に判断するのはどうかな。

1ファイル内に収めてるうちはstaticで済むものを
分割によってグローバルにしてしまうのも、どうか、というわけだ。

まぁそんでも、あまりにデカくなると考え物ではあるがな。
766デフォルトの名無しさん:2006/12/23(土) 22:45:53
>>761
> 関数は一画面に収まるぐらいの行数で、とか聞きますが

そんなの本気にすんなよ。
767デフォルトの名無しさん:2006/12/23(土) 22:48:16
>>766
ぶーーーーーー
1つの関数が馬鹿でかい糞プログラムを書く香具師メッケ
768デフォルトの名無しさん:2006/12/23(土) 22:53:36
>>767
ぶーーーーーー
関数を分割し過ぎて階層が深すぎる糞プログラムを書く香具師メッケ
769デフォルトの名無しさん:2006/12/23(土) 22:54:21
コードコンプリートって本に載ってたIBMの調査だと、200行以下のサブルーチンでは、
行数が少ないほど、一行あたりのエラー数が多いという結果になったらしい。

つまり200行の関数ひとつより、20行の関数10個のほうが不具合が多いということ。

だいたい「画面に収まる行数」って、環境でぜんぜんちがってくるじゃん。

770デフォルトの名無しさん:2006/12/23(土) 22:59:25
>>764 あ、なるほど
そういうことですか〜
ありがとうございます。
771デフォルトの名無しさん:2006/12/23(土) 23:02:50
なわけねーだろ
関数の行数が多い=その関数でやりたい処理がわかりにくい=問題点を見つけにくい=バグが多い
っていうか、未だにC言語を使っている香具師と生産性の話をすること自体がナンセンスかw
772デフォルトの名無しさん:2006/12/23(土) 23:03:16
>>769
画面に収まるっていうのは、初学者に
巨大な関数は書くなって言いたいだけで、
本気で一画面に納めろと言っているわけでは
ないと思う。
773デフォルトの名無しさん:2006/12/23(土) 23:05:19
>>772
じゃ、単純に「巨大な関数書くな」って言えばいいのに。
774デフォルトの名無しさん:2006/12/23(土) 23:07:33
目安が無いとどれくらいが巨大なのかわかりにくいだろ。
775デフォルトの名無しさん:2006/12/23(土) 23:09:13
いや、「1画面に納めろ」というのは指標として正しい
関数の処理が一望できるようなサイズの方が、問題点を見つけやすいからね
1画面でなくてもせいぜい3画面までだろうな
ココで逝ってる画面サイズは、個々の開発環境の画面サイズと思ってもらっていいと思うぞ
776デフォルトの名無しさん:2006/12/23(土) 23:10:22
単に「画面に収まる行数で」って言い方でも、その通りに受け取るやつがいそう。
777デフォルトの名無しさん:2006/12/23(土) 23:12:16
それでいいと思うけど・・・
778デフォルトの名無しさん:2006/12/23(土) 23:13:44
どんなにでかくても200行も一度の表示できるようなディスプレイで開発することはあるまい
779デフォルトの名無しさん:2006/12/23(土) 23:15:03
じゃあ200行未満っていえばいいじゃん
調査で分かったんしょ?

むしろひとつのサブルーチンで200行もかけない人は、
関数を作る目的意識が低くて200行まで書けなかったり、脳内整理が下手だったり
単に実力のない人なんではないかな

だからがんばって200行はかけるようにしようぜ
780デフォルトの名無しさん:2006/12/23(土) 23:19:27
>>778
いや、昔「プリンタで60行だせるから、60行以内で」とか言ってるやつを見たことあるから、
一ページ240行だせるから、240行とか言うやついるかもよ。
781762:2006/12/23(土) 23:29:44
確かに行数なんて恣意的なものなんだから何行までって線引きはおかしいと思うよ。
まぁ、私は自分の限界知っているから200行の関数なんて書かないけれど、
長大な関数を作りたがる香具師は大抵それを全部把握しきれないことにも気付かないから問題なんだけどね。

実際に2000行ものmain()を書く香具師の例だけれど、ローカル変数を全部関数の先頭で宣言しているから
未使用変数は山のようにあるし同じ変数の使い回しはあるし、悉くバグの温床になっている。
仮令(99以前の)Cでもブロック内で変数を宣言すれば未だ見通しがよくなるというのにね。

要は、自分のキャパに合わせて関数を作れ。
自分のキャパが判らないなら取り敢えず、目の前の画面内に関数の主要部が収まるように作れ。
って話じゃないの。
782デフォルトの名無しさん:2006/12/23(土) 23:29:53
>>779

200行もかけないんじゃなくて、書かないんだよw
でも確かにC言語で関数のネストが深くなるのはあまり見やすいとはいえないけどな
バグの少ないプログラムを書きたかったらC言語のような言語は使わないほうが良いということだなw

>>780
未だにコードを印刷してチェックするような原始人を基準にされても困るよねw
783デフォルトの名無しさん:2006/12/23(土) 23:33:36
>>781
作ってるプログラムが、個人の趣味のプログラムならそれでも良いけど
仕事で作ってるプログラムなら自分の基準で作るのはよろしくないだろう
プログラムは作った人以外もメンテナンスできなければならない
よく、「あのプログラムは誰それが作ったから、その人がいないとメンテできない」
なんて状況があるが、それは好ましくない状況だから、何らかの
基準を設けることは必要だろう
784デフォルトの名無しさん:2006/12/23(土) 23:36:54
>>779
>むしろひとつのサブルーチンで200行もかけない人は、
>単に実力のない人なんではないかな

いや、実力のないやつがでかい関数を書いてる。
(数百行とか数千行とか、そういう単位で)

785デフォルトの名無しさん:2006/12/23(土) 23:41:06
コードコンプリートだと>>769のことを書いたあとに、行数じゃなくて別の尺度で、
サブルーチンの複雑さをとらえよう、みたいなことが書いてあったな。
786デフォルトの名無しさん:2006/12/23(土) 23:43:59
プログラムを複雑にするのは、if文やfor文などの
ブロックのネストの深さと大きさだな
787デフォルトの名無しさん:2006/12/24(日) 00:11:07
行数オンリーで会話が進んでるけど
コメントの質は無視してないよな
788デフォルトの名無しさん:2006/12/24(日) 00:16:56
>>769
でかい関数の作者は馬鹿の比率が低いからじゃないの
789デフォルトの名無しさん:2006/12/24(日) 00:21:45
VC2005を使用中で、
UNICODEを使用した状況で、__FILE__ , __DATE__などを使いたいと思っています。

マクロ定義で
#define CONV2WIDE(X) (L ## X )
と定義して、

int main() {
wchar_t test[] = CONV2WIDE( __FILE__ );
return 0;
}

としても、マクロ展開後のソースは L__FILE__ となっており、
__FILE__が展開されていませんでした。
仮に、__FILE__ではなく、 "hoge" としてみると正常にLサフィックスが付いて
正常コンパイル出来ました。

__FILE__でもうまく展開できる方法って無いでしょうか?
マクロ中で扱いたいので、変換関数とかは呼びたくないのです。
790デフォルトの名無しさん:2006/12/24(日) 00:22:35
関数を作る前に仕様書がきちんとしてるから、関数をデカくしても大丈夫
調査対象となってるのはアマグラマではない事を理解しとかないと
791デフォルトの名無しさん:2006/12/24(日) 00:25:44
>>789 これでおk
#define CONV2WIDE(X) _CONV2WIDE(X)
#define _CONV2WIDE(X) (L ## X )
792デフォルトの名無しさん:2006/12/24(日) 00:31:59
参考までに、DirectX付属のサンプルだと100〜150行の関数がざらにある
もちろん20行ぐらいの関数がほとんどだけども
793デフォルトの名無しさん:2006/12/24(日) 00:33:37
>>791
ぉぉ。
2段構えでやることでうまくできました。さんくす!
しかし、__FILE__などが置き換えられるタイミングの問題でこうしないとダメなのでしょうか?
794デフォルトの名無しさん:2006/12/24(日) 00:49:07
>>791
何でこうなるんだろ…
795デフォルトの名無しさん:2006/12/24(日) 00:51:42
この手の二段展開マクロは過去との互換性から仕方ないっちゃ仕方ないけどなんとかならんかなぁ。
796デフォルトの名無しさん:2006/12/24(日) 00:59:14
>>787
コメントの質も重要だが、ダラダラと長い関数はそれだけで読解性が悪いので
幾らコメントが充実してても肝心なコードを把握しにくくなるから意味が無い。

>>790
仕様書がそのままコードになるならそれでも良いが、
問題は仕様書どおりに出来てるかどうかの検証がしにくいって事。
少なくとも、でかい関数を作るやつはプロじゃない
797デフォルトの名無しさん:2006/12/24(日) 01:06:55
関数の大きさが、その人の質とは限らん
100%否定されたらそうとしか答えられん…

でかい関数を作る奴はプロでないやつばかりだ、とかなら分かる
意図して少しサイズの膨れた関数を作る事も

システマチックになりすぎると、肝心の中身がな…
798デフォルトの名無しさん:2006/12/24(日) 01:09:50
ではプロ意識が低いと言い換えようかw
799デフォルトの名無しさん:2006/12/24(日) 01:11:17
それだな
800デフォルトの名無しさん:2006/12/24(日) 01:14:36
人それぞれだと思うがなぁ…
200行程度でぐだぐだ言ってたら2万行のソースとか書けないべ
801デフォルトの名無しさん:2006/12/24(日) 01:19:04
どっちにしろ長くやってりゃ2万行のソースを書くことは出来るだろうが、
バグの発生率やメンテナンスコストはまるで違うものになるだろうね
802デフォルトの名無しさん:2006/12/24(日) 01:20:03
必要な処理だけを関数にすればいいだけの話だと思うが
というよりその関数に必要な処理だけを書くのがいいだろう
結果的に大きなサイズになってもそれが必要ならいいと思うし
本来少ない行数ですむものをだらだら書くのはダメだろう
可読性やメンテナンス、汎用性を考えれば…
803デフォルトの名無しさん:2006/12/24(日) 01:33:21
ポインタに関する質問です。

#include<stdio.h>

main(){
int a[2]={0},*pa;
pa=&a[1];

a[0]++;
*pa++;

printf("a[0]=%d,a[1]=%d\n",a[0],a[1]);

return 0;
}
実行結果(a[0]=1,a[1]=0)

とすると、a[0]が1になるのは当たり前なんですが、
何でa[1]は0になるんですか?
CPad for Borland C++Compilerでコンパイルしました。
804デフォルトの名無しさん:2006/12/24(日) 01:36:30
>>803
演算子の優先順位の問題
(*pa)++;
が御希望か?
805デフォルトの名無しさん:2006/12/24(日) 01:43:13
main(){
int a[2]={0},*pa; ←この時点でa[1]にpaの中身を代入してるからだろ?

しかもその時点ではpaにはまだa[1]のアドレスは入ってないし。
806803:2006/12/24(日) 01:50:29
>>804
*はポインタ'演算子'でしたね。
ありがとうございました。解決しました。

>>805
言ってる事がよくわからないんですが、
*pa++がどうして足されないのか知りたかっただけです。

807デフォルトの名無しさん:2006/12/24(日) 01:52:50
>>805
詳しく
808805:2006/12/24(日) 01:59:21
気にしないで
なんか勘違いしてたw
809デフォルトの名無しさん:2006/12/24(日) 08:49:21
コンパイルに時間がかかるコードって、例えばどんなものがありますか?
コードの量じゃなくて内容的なものでお願いします
810デフォルトの名無しさん:2006/12/24(日) 09:29:23
マクロを駆使すればコンパイル(というよりプリプロセス)に時間がかかるようにできると思う。
811デフォルトの名無しさん:2006/12/24(日) 10:26:22
int operate(int a,int opr,int b){
return a opr b;
}
int main(){
operate(4+6);
}

これができないことはわかるんですが、これでやろうとしているような
「関数に演算子を渡す」
ということはできますか?
とりあえず文字コードを渡して内部で switch-case で場合分けして凌いでいるんですが、どうにも見栄えが悪くて
812デフォルトの名無しさん:2006/12/24(日) 10:29:46
int plus(int lhs, int rhs) {
  return lhs + rhs;
}

int minus(int lhs, int rhs) {
  return lhs - rhs;
}
とこういう感じに1つ1つ関数にしていくくらいしかないと思う。

C++なら、こういう関数が予めある程度標準ライブラリで用意されているし、
ほかにも色々技巧を駆使してやる方法もあるのだが。
813デフォルトの名無しさん:2006/12/24(日) 10:31:42
>>811
#define operate(a, opr, b) ((a)opr(b))
814デフォルトの名無しさん:2006/12/24(日) 11:01:54
>>812
ありがとうございます
やっぱり冗長な表現になってしまうんですね

>>813
最初はそれも考えたんですが実際に使用しようと考えている場所では計算が多く、
1行にすると横に200文字近く伸びてしまうんです
それで関数に演算子を渡せないかな、と
815デフォルトの名無しさん:2006/12/24(日) 11:08:32
C++になら演算子オーバーロードがあるけど…
ここはC限定スレだし。
そのためだけにC++にするわけにもいかんのだろう。
816デフォルトの名無しさん:2006/12/24(日) 11:10:12
>>814
文字列で渡して解析
817デフォルトの名無しさん:2006/12/24(日) 11:34:30
char *p;
p=getenv("QUERY_STRING");
で取得したpをパースする関数のサンプルを探しています。
&と=の部分に\0を入れる方法のものです。

よろしくお願いします。
818デフォルトの名無しさん:2006/12/24(日) 12:17:23
よろしくオナガイシマス
一つの関数からの型の違う戻り値を(charとintのような感じで)
取得する事は出来るのでしょうか?
fooはchar型、hogeはint型の戻り値
return(foo, hoge)
こんなことは出来ないので、このような場合のテクニックを教えてください。
819デフォルトの名無しさん:2006/12/24(日) 12:21:27
型が違うと長さも違うから、その辺を解決したうえで
void* で受け取ってはどうか
820デフォルトの名無しさん:2006/12/24(日) 12:22:14
って複数受けたいってことか?
構造体使ったら
821デフォルトの名無しさん:2006/12/24(日) 12:26:42
結局ポインタ変数って変数のスコープを広げるだけでグローバル変数使用の弊害と同じことが
起こるわけだし、グローバル変数の使用を極力避けるのと同様にポインタ変数の使用も極力
避けるべきだと兄の長男の友達の妹が言ってた
822デフォルトの名無しさん:2006/12/24(日) 12:30:00
>>818です
早速のアドバイスありがとうございます
>>819さんの方法は関数を呼出す方と呼出される方が同じポインタを参照して
渡す方法と理解していいですか?
>>820さんの方法ですが、忘れてました構造体で戻り値を受ければいいと言う事でOK?
823デフォルトの名無しさん:2006/12/24(日) 12:31:47
>>818です
>>821さんのお勧めは、構造体の方がGJということですか?
824デフォルトの名無しさん:2006/12/24(日) 12:43:16
>>818
struts FooHoge{
  char foo;
  int hogel
825デフォルトの名無しさん:2006/12/24(日) 13:25:55
>>821
入門スレなんで難しいことよく分りません。こっちで話してください。
ttp://pc8.2ch.net/test/read.cgi/tech/1164376614/l50
826デフォルトの名無しさん:2006/12/24(日) 14:41:37
>>818
struct funcReturnValue {
char foo;
int hoge;
};

struct funcReturnValue func()
{
struct funcReturnValue ret = {'a', 818};
return ret;
}

>>817
環境変数はいいとして、"&と=の部分"とはなんぞや。
例えば環境変数LANGを取得するにはgetenv("LANG")とするわけだが、
その場合は"ja"へのポインタが得られるからパースもへったくれもないのだが。
827デフォルトの名無しさん:2006/12/24(日) 16:06:52
>>817
パースして\0をいれるというと、strtok() のことか?
もしそうなら、strtok でググればサンプルくらいあると思う
828デフォルトの名無しさん:2006/12/24(日) 16:21:46
>>826
これってまずいんじゃね?
構造体retはスタックに取られるから、リターンしたらretの領域は保証されないんじゃね?
829デフォルトの名無しさん:2006/12/24(日) 16:24:14
>>828
もらった側もコピーして受け取るからかまわんだろ
830デフォルトの名無しさん:2006/12/24(日) 16:31:18
>>829
大丈夫、C89以前の糞コンパイラでもない限りちゃんとコピーされる。
831デフォルトの名無しさん:2006/12/24(日) 16:33:42
>>829-830
そうでしたかw
832デフォルトの名無しさん:2006/12/24(日) 16:43:25
まずいのはretのアドレスを返したとき。
833デフォルトの名無しさん:2006/12/24(日) 17:14:27
>>818です
年賀状作ってる間に有意義なご回答ありがとうさんです
>>826さん
struct funcReturnValue ret = {'a', 818};
こんな書き方もあるんですね初めて見ました
勉強になります。

834デフォルトの名無しさん:2006/12/24(日) 17:25:17
普通の構造体の初期化にしか見えないが。
何か特別な点でもあるのか?
835sage:2006/12/24(日) 19:05:00
WinXP SP2,VC++6.0(_UNICODE指定)
GetUserNameを使ってUNICODEで現在ログインしているユーザ名を取得しようとしてるんだけど、下のソースでは「retcd = GetUserName(username,&nSize);」でコンパイルエラーになってしまう。
_MBCS指定では、正常にコンパイル及び実行できた。
どのように修正したらよいのでしょうか?
御存知の方、教えて下さい。

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

main()
{
TCHAR username[20];
BOOL retcd;
DWORD nSize;
DWORD lasterr;

nSize = sizeof(username);
memset(username,0x00,sizeof(username));
retcd = GetUserName(username,&nSize);
if (retcd == 0)
{
lasterr = GetLastError();
}

}
836デフォルトの名無しさん:2006/12/24(日) 19:08:31
UNICODEは定義したか?
<windows.h>以下などWindows APIのヘッダは_UNICODEではなく、UNICODEが定義されているかを見る。
837835:2006/12/24(日) 19:10:04
間違えた。
あげてすいません。
838デフォルトの名無しさん:2006/12/24(日) 19:14:49
>>836
UNICODEを定義したのは、プロジェクトの設定のプリプロセッサの定義で「_UNICODE」と指定しただけ。
><windows.h>以下などWindows APIのヘッダは_UNICODEではなく、UNICODEが定義されているかを見る。
これは、どこを見ればよいの?
839デフォルトの名無しさん:2006/12/24(日) 19:31:20
C言語はじめてみたいと思っていますが、
CとC++ってどちらを選んでよいのかわからないのですが、
どういった違いがあるのでしょうか。
840デフォルトの名無しさん:2006/12/24(日) 19:58:47
C言語をはじめたいのならCじゃない?
841デフォルトの名無しさん:2006/12/24(日) 20:31:49
C言語かC++をはじめてみたいと思っていますが、
CとC++ってどちらを選んでよいのかわからないのですが、
どういった違いがあるのでしょうか。
842デフォルトの名無しさん:2006/12/24(日) 21:12:53
C言語をはじめたいのならCじゃない?
843デフォルトの名無しさん:2006/12/24(日) 21:21:09
C#(ry
844デフォルトの名無しさん:2006/12/24(日) 21:25:15
>>838
> プロジェクトの設定のプリプロセッサの定義で「_UNICODE」と指定しただけ。
ならそこにUNICODEも書き加えろ。

そもそももしVisual C++の話なら、プロジェクトの設定の全般に文字セットの指定があるから、
そっちで選択するのが確実。
845デフォルトの名無しさん:2006/12/24(日) 22:00:22
>>844
コンパイルうまく出来た。実行もできた。
ありがとう。
846デフォルトの名無しさん:2006/12/24(日) 22:24:05
Obj(中略)C
847デフォルトの名無しさん:2006/12/24(日) 23:24:58
scanfで指定したファイル(○○.cファイル)を
(○○.html)に直すのにはどうすればよくて?
848デフォルトの名無しさん:2006/12/24(日) 23:27:16
>>847
ファイル名を変換するだけ?
それとも html フォーマットに変換するの?
849デフォルトの名無しさん:2006/12/24(日) 23:34:30
>>848
言葉足らずだった。
○○.cファイルを"r"で読み込まして、
そのファイルの内容ばーと、コピーするところまでは完成してるけど、

そのコピーしたものを、こんどは"w"モードで
新規ファイル(○○.html)をつくりたいわけです。
850デフォルトの名無しさん:2006/12/24(日) 23:38:02
>>849
うpしる
851デフォルトの名無しさん:2006/12/24(日) 23:45:47
#include <stdio.h> #include <stdlib.h> #define STR_MAX 256
int main(void){
FILE *ReadFP, *WriteFP;
char Rfname[100], Wfname[100];
char buff[STR_MAX], *pp;

printf("ファイル名 : ");
gets(Rfname);

ReadFP = fopen(Rfname, "r");
if(ReadFP == NULL){
printf("ファイルの読み込みに失敗しました\n");
exit(1);
}
WriteFP = fopen(○○○, "w"); ←ここの指定の方法がわかりません

while(1){
pp = fgets(buff, STR_MAX, ReadFP);
if(pp == NULL){
break;
}
fprintf(WriteFP, "%s", buff);
}
fclose(WriteFP); fclose(ReadFP);
return 0;}
852デフォルトの名無しさん:2006/12/24(日) 23:54:27
>>851 エスパー回答 コピペしてみてちょ
WriteFP = fopen(○○○, "w"); ←ここの指定の方法がわかりません

{
char *ext;
strcpy(Wfname, Rfname);
ext=strrchr(Wfname, '.');
if(ext!=NULL) strcpy(ext, ".html");
else strcat(Wfname, ".html");
}
WriteFP = fopen(Wfname, "w");
853デフォルトの名無しさん:2006/12/25(月) 00:01:10
>>852

WriteFP = fopen("test.html", "w"); ←ここの指定の方法がわかりません

これでいいのでFA?
854デフォルトの名無しさん:2006/12/25(月) 00:05:01
>>852
おお、動きました。 ありがとうございます
まだまだ<string.h>の勉強が足りないかも

>>853
したい事は、同じファイル名がよかったんです
855デフォルトの名無しさん:2006/12/25(月) 00:06:23
>>854
その前に日本語の勉強をしろ
856852:2006/12/25(月) 00:10:45
やった!エスパー回答成功!
857デフォルトの名無しさん:2006/12/25(月) 00:17:58
さすがです〜(><)
858デフォルトの名無しさん:2006/12/25(月) 01:51:50
数字だけを並べたファイルを読み込んでから、
読み込んだ数字の最大値と平均値を求めて出力したいんだけど
最大値ってどうやって計算すればいいでしょうか?

if(*fp >= max_num)
{
max_num = *fp;
}

これを使うといけないらしいのですが
859858:2006/12/25(月) 01:53:47
int max_num;

FILE *fp;

と上の方で宣言してあるので片方だけがintなのが原因かな
と自分では思っています。
いろいろ試したけど解決できてないので、アドバイス下さい
860デフォルトの名無しさん:2006/12/25(月) 03:18:11
>数字だけを並べたファイルを読み込んでから
君はファイルから数字を読み込むことはできるの?
861858:2006/12/25(月) 03:30:22
txtファイルから読み込んで
平均値だけを出力させることはできました。
862デフォルトの名無しさん:2006/12/25(月) 03:47:54
maxnum = *fp; で読み込むことができたのかw
863858:2006/12/25(月) 03:49:33
>>862
それ無しで><
それ入れるとエラーが出ますが、平均値や合計の計算などはできるので
問題は 最大値 の出し方なのですが
864デフォルトの名無しさん:2006/12/25(月) 04:02:12
>>863
1.最初に読み込んだ値をmax_numに入れる
2.その後読み込んだ値を一つ一つmax_numと比較し、より大きければmax_numに代入
3.数字を全部読み終えたら、最大値がmax_numに入っている
865デフォルトの名無しさん:2006/12/25(月) 04:03:21
もし最初に読み込んだ値を、という特別な処理が面倒であれば、
max_numにINT_MINを入れておく。<limits.h>をインクルード。
866デフォルトの名無しさん:2006/12/25(月) 12:43:12
char *hoge[] = {
"あいうえお"
,"かきくけこ"
,"さしすせそ"
,"たちつてと"
,"なにぬねの"
};

これってどういう意味ですか?char型の配列を各々指しているポインタ配列?
867デフォルトの名無しさん:2006/12/25(月) 13:08:51
char *hoge;
の集合体
868858:2006/12/25(月) 13:15:17
>>864
それは>>858でやったような

if(*fp >= max_num)
{
max_num = *fp;
}

ではないのでしょうか?
869デフォルトの名無しさん:2006/12/25(月) 13:20:15
とりあえず平均値のソースうp
870858:2006/12/25(月) 14:01:13
>>869

int main(void)
{
int val;
int sum=0;
int cnt;
int max_num,i;

FILE *fp;

for(cnt=0;;cnt++)
{
fscanf(fp,"%d",&val);
if(val==0)
{
break;
}
sum+=val;
}

if(cnt>0)
{
printf("平均値=%g\n",(double)sum/cnt);
}

fclose(fp);

return EXIT_SUCCESS;
}
871デフォルトの名無しさん:2006/12/25(月) 14:11:28
max_numは初期化済みとして

if(val >= max_num)
{
  max_num = val;
}

ではだめということなの?
872デフォルトの名無しさん:2006/12/25(月) 14:25:03
>>870
fopen() やってないが、ただの書き忘れか?
873デフォルトの名無しさん:2006/12/25(月) 14:43:46
>>858
どこをどうやったらmaxnum に * fpを代入すると言う発想が出てくるのか是非教えていただきたい。
874858:2006/12/25(月) 14:46:48
>>872
書き忘れです。


if((fp=fopen("indata.txt","r"))==NULL)
{
printf("ファイルが見つかりません。---indata.txt\n");
exit(EXIT_FAILURE);
}

>>873
教えてもらいにきたのに教えないといけないなんて><
875858:2006/12/25(月) 14:50:34
>>871
前それやった記憶があるんだけどもう1回試してきます。
初期化してなかったかもしれない。
876858:2006/12/25(月) 16:04:56
>>871
すんません、余裕で出来ました。
ありがとうございます。
877デフォルトの名無しさん:2006/12/25(月) 16:50:54
ファイル削除はどうやったらいいんですか?
処理中にtemp.datでも一時的に作って、
処理が終わればそれを削除したいんだけど。
878デフォルトの名無しさん:2006/12/25(月) 17:45:25
>>877
C言語標準の方法ではファイルの削除はできないから、
あなたの環境が分かれば教えられるかも。
879デフォルトの名無しさん:2006/12/25(月) 17:55:28
一応そういう目的にはremove()が使える筈なんだが。
880デフォルトの名無しさん:2006/12/25(月) 21:40:09
>>877
Unix-likeなOSなら、正しいやり方は以下のような感じ。

fp = fopen("temp.dat", "w+");
remove("temp.dat");
  :
fclose(fp);

オープンファイルの削除が出来ないOSでは、remove()はfclose()の
後に持ってくるしかないが、その場合、プロセスが途中でコケたりした
場合に、temp.datが残る可能性がある。
881デフォルトの名無しさん:2006/12/25(月) 21:52:44
C的にはこっちのほうが良くね。
fp = tmpfile();
    :
fclose(fp);
882デフォルトの名無しさん:2006/12/25(月) 21:55:41
異常終了したときには、残された一時ファイルの内容を見て
途中から処理を再開する可能性も考えられる
883デフォルトの名無しさん:2006/12/25(月) 22:22:03
ファイルオープンしてその中身をある文字列に書き換えたら削除してくれるようにしてくれればいいじゃない
884ぼるじょあ ◆yBEncckFOU :2006/12/25(月) 23:15:55
(・3・) エェー 最近ここをのぞくようになったけど
          ぬるい質問には元気よく回答(でもレスの終わりには何故か嫌味もw)
          して質問に関係ないレスをして馬鹿でも知ってる知識自慢をしてるけど
          ちょっと手間な質問には嫌味や煽りばっかりで
          回答できてないのが気になるお
          このスレの回答者は頭悪いのが多いお、というわけで質問者は
          こちらに質問をなげるようにしてください
ぼるじょあがC/C++の宿題を片づけますYO! 67代目
http://pc8.2ch.net/test/read.cgi/tech/1165718021/
          優しいぼるじょあと名無しさんがきみたちの質問に答えるお

885デフォルトの名無しさん:2006/12/26(火) 17:09:56
宣伝うざい
886デフォルトの名無しさん:2006/12/26(火) 17:41:13
>>885
事実。このスレッドに次スレッドは不要。
887デフォルトの名無しさん:2006/12/26(火) 20:52:23
宣伝うざいに、事実、てか…
もう少し接続詞の勉強しな
888デフォルトの名無しさん:2006/12/26(火) 21:12:32
いやそれは接続詞ではないと思うぞ。
889デフォルトの名無しさん:2006/12/26(火) 22:12:57
>>887
日本語でおk
890デフォルトの名無しさん:2006/12/26(火) 22:27:39
"事実。"の前に接続詞を入れないと意味が通らないから勉強しろってことだろ、何の不思議もないと思うが…
そもそも引きずることなのか
891デフォルトの名無しさん:2006/12/26(火) 22:54:00
くだらない質問ですみませんm(_ _)m
C言語を1から勉強したいのですが お勧めの本はありますか?
なんか書店にはいろいろな本がありすぎて どれを選んだらいいか分からなくて
初心者でも 独学で分かりやすい本って 何かありますか?
くだらない質問でほんとすいませんm(_ _)m
892デフォルトの名無しさん:2006/12/26(火) 22:57:56
やさしいC
893デフォルトの名無しさん:2006/12/26(火) 23:55:36
猫Cとか
894デフォルトの名無しさん:2006/12/27(水) 00:04:28
アンダースコアをつける技法についてしつもゎした者ですが、解決しました
プレフィックスでした。

もし回答者がいたらありがとうございました。
携帯からなので確認が大変なので…
895デフォルトの名無しさん:2006/12/27(水) 00:06:48
>>892
痛く…しないでね…
896デフォルトの名無しさん:2006/12/27(水) 00:37:54
よく読んだらプレフィックスじゃないかも…
すみません、もう少し調べてみます
897デフォルトの名無しさん:2006/12/27(水) 00:39:05
やっぱ やさしいCが一番分かりやすいのかぁ
898デフォルトの名無しさん:2006/12/27(水) 00:41:43
C実践プログラミングが一番素晴らしい
どんな本にも書いてあるようなCの文法的なことだけでなく
プログラミングスタイルやコメントの付け方デバッガの使い方
makefileの作り方まで書かれている。
この本で学べば天才ハッカーになれること間違いない今すぐ10冊程注文しなさい
899デフォルトの名無しさん:2006/12/27(水) 01:06:28
今までJavaばっかりやってきたんですが、
仕事でCをいじることになりました。

関数レベルの単体テストってCだとどうやるのが一般的なんでしょうか?
(つーか内部関数の単体検証は無理?)
職場の皆さんはそもそもNUnitの類での単体テストと言う文化が無いようで
プリント文見たりとかデバッガで止めて確認して完了とかで戦慄を覚えました・・・
900:2006/12/27(水) 02:55:52
C言語の問題点を教えていただけませんか?
901デフォルトの名無しさん:2006/12/27(水) 02:58:40
・宣言まわりの文法がクソ
・配列とポインタの妙な互換性
・構造化された例外処理がない
902:2006/12/27(水) 03:07:31
>>901の方ありがとうございます。
解決法とかありますか?
903デフォルトの名無しさん:2006/12/27(水) 03:23:54
>>899
C++でさえなくCか。ご愁傷様。

ま、テストファーストなんてのはCが流行ってた頃よりずっと後に出てきた
文化だからなー。

C++用だが、CppUnitの使用を検討してみては?
904デフォルトの名無しさん:2006/12/27(水) 03:31:39
>>902
前2者の解決法はない。仮に解決したとすると、それはCではない何か別のものになってしまう。

最後のやつは言語仕様に後付けできるから、やろうと思えばできるだろうけど、
ISOに提案して規格になって実装が出てきて、とうまくいったとしても
10年以上かかるんじゃないかな。
905:2006/12/27(水) 03:40:53
>>904ありがとうございます。もう一つお聞きしたいのですが、オブジェクト指向とはどうゆう意味なんでしょうか?
906デフォルトの名無しさん:2006/12/27(水) 03:52:51
>>905
それは難しい問題だ。というか簡単に一言で述べることはちょっとできない。

一般的にオブジェクト指向言語が備えている、備えているべきといわれる機能は

・多態
・継承
・カプセル化

だ。それぞれの意味はぐぐってみてほしいけど、
たぶんちんぷんかんぷんじゃないかという気がするし、
だいたいスレ違いだw

おれ自身は多態さえあればオブジェクト指向と呼んで差し支えないとは
思っているが、これに異を唱える人は多いと思う。
簡潔に述べるのなら以上のようになるんだけど、
こんな答で納得してもらえるとはちょっと思えないなw
907デフォルトの名無しさん:2006/12/27(水) 04:11:40
オブジェクト指向はオブジェクト化による(ry
哲学とか入ってくるからなぁ
門外漢だろ、普通のプログラマは
908:2006/12/27(水) 04:13:00
>>906色々親切にありがとうございます。
確かに今の僕ではよく解りません(TT)もう少し調べてみたいと思います。
909デフォルトの名無しさん:2006/12/27(水) 07:41:16
コーディングする対象をひとつのオブジェクト(物体)と見なして
それを固有情報(メンバ変数)と付属関数(メソッド)で表現する手法

と思ってる。俺は。
910デフォルトの名無しさん:2006/12/27(水) 12:31:24
英語の文法S+V+O、命令形だとV+Oだ
これをひっくり返してO+V
これがオブジェクト指向だと思っているよ、俺は
911デフォルトの名無しさん:2006/12/27(水) 12:54:35
O(オブジェクト)をV(動詞)の前にもってくることで
VをOの内在・従属させることができるし(カプセル化)
Oがシンプルになる(多態)
912デフォルトの名無しさん:2006/12/27(水) 12:58:42
C実践プログラミングは 初心者にも分かりやすいですかね?
超初心者なんですが...
913デフォルトの名無しさん:2006/12/27(水) 13:14:31
オープンソースのプログラムをそのまま改造し、商用に転用したり
再配布したりするのは著作権侵害なのでしょうか?下のサイトには違うと書いているのですが
本当の所をお教え頂きたいです。因みに私が転用したいのはC言語のものなのでここで聞かせて頂きます

http://www.orca.med.or.jp/orca/outline/opensource/img/img1.gif
914デフォルトの名無しさん:2006/12/27(水) 13:19:04
そのオープンソースプログラムのライセンス読め
915デフォルトの名無しさん:2006/12/27(水) 13:39:26
>>913
オープンソースといっても君がしたいことの可・不可が一律に決まってるわけじゃないよ。
せめてプログラム名とかライセンス名は書こうね。
916デフォルトの名無しさん:2006/12/27(水) 14:52:59
>>912
C言語によるプログラミング基礎編とC言語によるプログラミング応用編がお勧め
宣伝くさくなるから出版社は控えるけど、ちょっと品揃えのある書店に行けば楽に見つけられると思う。

基礎編は注訳をとにかく読みまくる事が大事。
分からない事は、そういう事なんだと理解する事も大事。

配列とかどうしても理屈が分からなければ人に聞く事。
分かるまで聞く事も大事。
”人に”聞いてね、ネットじゃなくて。
黒板やホワイトボードなんかがあるところで尋ねるのがベスト。
無ければ紙と鉛筆は忘れずに。

後はやる気があれば何でもできる。
30歳超えてたらしんどいと思うけど、できるだけ右脳を活用してあげて。
917デフォルトの名無しさん:2006/12/27(水) 16:04:27
どっかにソケット通信のサンプルおいてあるとこない?
918デフォルトの名無しさん:2006/12/27(水) 16:19:11
C実践プログラミングが最強、なんといってもオライリーだし
オライリーの本を買っとけば間違いない今すぐ10冊程注文しなさい
919デフォルトの名無しさん:2006/12/27(水) 17:05:14
>>913
オープンソースといってもライセンスが沢山ある。

代表的なもののうちの一つに GPL v2 があるが、これの場合はユーザの側の
改変再配布の自由を妨げることを禁じており、コンパイル済みバイナリを
受け取った人はそのソースも受け取る権利が発生する(ソースを受け取る
ことを妨げてはいけない)。また再配布の際は同じ GPL v2 のライセンスで
配布しなければならない。結果としてソースを隠して独占する行為は不可能に
なる。またその結果 GPL のソフトウェアのみを販売する行為もほぼ不可能に
なるのだが、これは特に禁じられてはいない。(Linux ディストリビューションの
RedHat などは一見これができているように見えるかも知れないが、あれは
ソフトそのもので金を取っているのではなくてサポートで金を取っている)。
920デフォルトの名無しさん:2006/12/27(水) 17:39:18
スマソ 今txtファイルから、 p = fgets(buff, 256, fp); と
順に上から一行ずつ読み込ませて、処理を行っています。

で、そこの読み込んだ一行の中に
"ABCDEFGHIJKLMN"という文字列があったとして、

そこの"FGHIJ"という部分を、"GHFJI"と置換をしたいのですが、
それがさっぱり分からないので、誰か助けてください。
921デフォルトの名無しさん:2006/12/27(水) 17:43:26
>>920
strstrで検索して文字間でスワップかけるだけ?
922デフォルトの名無しさん:2006/12/27(水) 17:59:34
置換前後で文字列数が同じなら自身書き換えでいけるだろうけど
置換前後での文字列数が異なる場合はバッファわけないと無理だよな。

>>920 の例はたまたま 検索文字数=置き換え文字数なので
置換操作前後で文字列数かわらないけど
923デフォルトの名無しさん:2006/12/27(水) 19:36:38
>>921
ごめんなさい、スワップをかけるだけじゃないです。
"あかさたな"という文字列が゙あったらなら
全部"はまやらわ"に置換してみたいのです。

一応自分が考えたのは、一文字ずつ読み込む方法で
"ABCD"の文字を"あいうえ"にして、完全一致でないなら
そのまま表示していくというものです。 こんな感じ↓
c = fgetc(fp);
if(c == 'A') {
c = fgetc(fp);
if(c == 'B') {
c = fgetc(fp);
if(c == 'C') {
c = fgetc(fp);
if(c == 'D') {
printf("あいうえ");  ←置換したい文字
} else {
printf("ABC%c", c);
}
} else {
printf("AB%c",c);
}
以下省略で、頭悪い方法です。
924デフォルトの名無しさん:2006/12/27(水) 19:37:36
>>916
本に関しては人によるので否定しないがも肯定もしない。

人に学ぶのが一番なのは同意。
教えて君にならない程度に聞きまくるのがいい。
必死に学んでれば、無碍に断れもしないだろうし。
925デフォルトの名無しさん:2006/12/27(水) 19:51:48
>>923
>>921>>922が言っていること理解しちょる?

というより「〜みたいな」とか「〜だとしたら」という微妙な表現しかないのは・・・
もういいや
926デフォルトの名無しさん :2006/12/27(水) 20:52:46
>>920の仕様のソースを書いてみた
#include <stdio.h>
#include <string.h>
void ReWord(char c[], const unsigned Size);
int main()
{
char Word[] = "FGHIJ";
char *GetWord,*TakeWord;
char buff[1024] = {'\0'};

while(GetWord = fgets(buff,sizeof(buff),stdin)){
TakeWord =strpbrk(GetWord, Word);
ReWord(TakeWord, strlen(Word));
}
printf(buff);


return 0;
}
void ReWord(char c[], const unsigned Size)
{
unsigned i;
unsigned size = Size -1;
char temp;
for(i=0; i <= size/2;i++){
temp = c[i];
c[i] = c[size -i];
c[size -i] = temp;
}
}
927デフォルトの名無しさん:2006/12/27(水) 21:24:19
>>923
基本的に文字列Aを表示するが、Aの中に文字列Bが存在したらその部分を文字列Cに置き換える
こういうことだよな?
仮にそうだとして、文字列Cは任意の文字列?それとも何か変換規則がある?

>>926
strpbrk()じゃなくてstrstr()じゃないか?
これだと*GetWord が"G"とかの時も変換しようとするはず
928デフォルトの名無しさん:2006/12/27(水) 21:26:37
>>919
んなもん幾らでもあるだろうが、とりあえず

故R.Stevensのページ
ttp://www.kohala.com/start/
929デフォルトの名無しさん:2006/12/27(水) 22:01:28
C言語によるプログラミング も
C実践プログラミング も 超初心者にはレベル高過ぎませんかねぇ... そんなことはないですかね?
C言語によるプログラミング は コロナ社のやつですか?
930デフォルトの名無しさん:2006/12/27(水) 22:05:51
ファイル名に変数入れたいんですがどのようにかけばいいのでしょうか?
fp = fopen("C:Proguram File\\○○.txt","a");
丸のところに変数を入れたいんです
931デフォルトの名無しさん:2006/12/27(水) 22:12:00
sprintf 使おう
932ぼるじょあ ◆yBEncckFOU :2006/12/27(水) 23:12:18
(・3・) エェー 相変わらずお薦めの本とかCとC++の特徴に関する質問とか
          超簡単で手間のかからない質問には
          回答者の諸君も長文で返して元気だね




          こいしらの実践レベルが疑わしいお
933デフォルトの名無しさん:2006/12/27(水) 23:55:47
っていうかスレタイ見れ
934デフォルトの名無しさん:2006/12/28(木) 01:08:31
>>932
レベルの高いレスきぼん
935デフォルトの名無しさん:2006/12/28(木) 01:18:56
つまり、回答者にとって入門編なんだな。
936デフォルトの名無しさん:2006/12/28(木) 01:19:14
>>934
そいつには無理だ
937デフォルトの名無しさん:2006/12/28(木) 01:41:27
>>934
無理無理、だって言ってることに内容がほとんどないもの。
「CとC++」を置き換えればどこに持って行ったって一見煽りになるだろ。
PerlとかPythonとかMySQLとかVCとか漢字書き取りとかwinnyとかなんとか。
どれを入れても通じるだろ。その程度の意味しか持たない。

実にワイルドカードでマヌケな煽りなわけです。
938デフォルトの名無しさん:2006/12/28(木) 01:42:01
>>929
パソコン初めて3、4ヶ月ぐらいの時に友達に勧められたんで読み始めた。
その前に2ヶ月目ぐらいの時にもっとレベルが低い、
ソフトバンクパブリッシュ?とかのCビギナー読んで入出力程度までは扱えるようにした。
C言語によるプログラミング読んでも理屈なんてわからんしUNIXのシステムコール使う部分とか読み飛ばした。
世の中にはこういうのも分かる天才もいるんだろう、とか思いつつな…

2千とか3千とか安い安い
一つの本でマスターしようとは思わずに
俺みたいに驚くほど簡単な本から初めてみな。

でもおまい実は玄人?
939デフォルトの名無しさん:2006/12/28(木) 01:45:29
本の話題なら書籍スレ行った方がいいぞ
テンプレでも見てこい
940デフォルトの名無しさん:2006/12/28(木) 11:09:41
こんな感じですがバスエラーになってgdbでも追いきれません。
何が悪いのか教えてください。よろしくお願いします。
int main(int argc, char *argv[]){
省略
mpz_init_set_str(a,"282578800148737",10); mpz_init_set_str(b,"0",10);
mpz_init_set_str(key,"10000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000001",2);
mpz_init_set_str(k2,"100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100011111",2);
for(i=1;i<1000;i++){if(mpz_probab_prime_p(key,2)==2){ gmp_printf("\n%Zd\n",key); break; mpz_add_ui(key,key,1); }
fg=fopen("an.txt","wb"); gmp_randseed_ui(0,123456);
while(1){
// bc= fread(s,sizeof(unsigned char),15,f);
for(i=0;i<15;i++){ mpz_inp_str(bb,f,0); mpz_mul_ui(bb,bb,256); }
if(bc<15 && bc!=0){ for(i=bc;i<15;i++) s[i]=0; }
if(bc==15){ mpz_mul(b,key,bb); mpz_urandomb(a,0,(long unsigned int)120); mpz_urandomb(d,0,(long unsigned int)256); mpz_add(c,b,a); mpz_xor(c,c,d); mpz_out_raw(ff,c);
// fwrite(m,sizeof(unsigned int),8,ff);
mpz_xor(c,c,d); mpz_mod(d,c,key); mpz_sub(c,c,d); mpz_div(e,c,key); mpz_out_raw(fg,e);
// fwrite(k,sizeof(unsigned char),15,fg); }
/* padding
if(bc<15 && feof(f)==1){ while(1){ if(bc<15)
// ...
break; } }
*/
fclose(f); fclose(ff); fclose(fg);
}
941デフォルトの名無しさん:2006/12/28(木) 12:13:40
何がしたいのか教えてください。よろしくお願いします。
942デフォルトの名無しさん:2006/12/28(木) 12:23:38
秘密鍵暗号で秘密鍵と平文を巨大整数としてファイルから読み込んで
四則演算でアフィン暗号を作る練習をしてます。
今ひとつGMPライブラリの使い方がわからず、ファイルからNバイト整数
を読み込むという部分もこれでいいのかわかりません。
今の時点では暗号文が2倍になってしまいますが、下位ビットを反転させて
上位ビットにXORしてから更に秘密鍵でXORした後でS-BOXのような非線形
変換を行えば普通の秘密鍵暗号と同じ仕組みになるはずですが、算術誤り
訂正符号を使っているのでエラーが発生しても訂正できるというのが
メリットです。
943デフォルトの名無しさん:2006/12/28(木) 12:40:49
暗号化:C=(P*M+R1)^R2
復号化:M=((c^R2)-(c^R2)%P)/P
key=PとR1のseed
key=key+1を素数になるまで続ける。
k2=R2のseed
bb=Mに平文120ビットを読み込む。
見つかった素数PとMをかけて、乱数R1を足してR2をXORする。
256ビット暗号文を書き込む。
こんな感じです。

改良案としては暗号文Cを分割してC(256bit)=C'=(C1'||C2')とします。
C1'^(~C2')=C"(128bit)
(C"^(~C"))=C2
C"^C2=C1
となることを期待しているんですがあってますでしょうか?
944デフォルトの名無しさん:2006/12/28(木) 12:48:03
>>940
どこまで正常に進んでいるか fprintf() なりでログ出すと良いと思うヨ。
多分 mpz_xxx の使い方が、想定している作法と異なるんじゃないかな
945デフォルトの名無しさん:2006/12/28(木) 14:24:24
よくわからないのに改良案があるなんてまるで卒論研究みたいだな
946デフォルトの名無しさん:2006/12/28(木) 15:13:56
>>940
バスエラーってのはデータアラインメントが合ってない時のエラー
long 型なら 4byte 境界に合わせるとか、
short 型なら 2byte 境界に合わせるとかしないといけない。

無理矢理にキャストしてる部分があるのかもしれない。

char data[10];
long *ptr;
ptr=&data[2];
*ptr=1234; ← 4byte境界でないのでここでバスエラー
947デフォルトの名無しさん:2006/12/28(木) 16:07:33
%-10sてのはどんな感じに出力するん?
948デフォルトの名無しさん:2006/12/28(木) 16:13:25
文字列を左詰めで10文字
949デフォルトの名無しさん:2006/12/28(木) 18:57:46
>>937
煽りと言うより事実のような希ガス
デヴィ夫人みたいに朝ズバッと言うタイプなんやね
950デフォルトの名無しさん:2006/12/28(木) 19:15:00
レベルの高いレスきぼん
951デフォルトの名無しさん:2006/12/28(木) 19:30:54
>>950
k&rの話でもしてれ
952デフォルトの名無しさん:2006/12/28(木) 20:19:18
古い規格の話って、初心者に良いとは思えないがな。
K&Rの、何がレベルが高いんだ?
著者のスキルは高いとは思うが、昔の規格や昔の仕様語るのは、ただの懐かし話。
953デフォルトの名無しさん:2006/12/28(木) 20:31:32
K&Rが書いたプログラミング言語Cの今の版はANSI C準拠のはず。
954デフォルトの名無しさん:2006/12/28(木) 20:50:42
質問があるまでだまっとれ
955デフォルトの名無しさん:2006/12/28(木) 21:14:18
初めまして。よろしくお願いします。
K&Rの演習5-10「コマンド行からの逆ポーランド式を計算するプログラムexprを書け。
各演算子あるいは被演算数は引数として分離されているものとする。例えば
expr 2 3 4 + *
なら,2×(3+4)を計算するようにせよ」の問題の「*」文字の
取り扱いについて教えてください。
「アンサーブック」のプログラムで試してみましたところ,
コマンド引数にワイルドカードの「*」が含まれているためか,
「\*」のようにエスケープしないと不定値として取り扱われてしまいます。
問題の条件は,「例えば expr 2 3 4 + * なら,2×(3+4)を
計算するようにせよ」なので,このコマンド引数の形式を忠実に守ろうと
した場合,どのような変更が必要になってくるのでしょうか。
ワイルドカードやエスケープシーケンスは,シェルでの評価に依存する可能性もあるかなあと
今のところ考えているのですが,そうだとすると,環境依存(処理系依存?)ということに
なってくるのでしょうか。
956952:2006/12/28(木) 21:56:37
>>953
なるほど。
レスありがとう。
957デフォルトの名無しさん:2006/12/28(木) 22:21:17
>>955
「外側でどうやって 2 3 4 + * の列を用意するかは様々」の一言で片付いてしまうわけだが
958デフォルトの名無しさん:2006/12/28(木) 22:44:14
シェルを変えてみればわくるかもよ
959955:2006/12/28(木) 22:49:18
>>957
レスありがとうございます。
同じ処理内容(逆ポーランド計算機)に対する引数を
ファイルにしておいた列からパイプで受け取ったり,
実行後に標準入力から受け取ったりする方法は,
K&Rではその該当演習問題の少し前のところ(邦訳で92ページ付近)で取り扱っています。
その流れからして,演習5-10ではコマンド引数を取り扱うことに
焦点が当てられていると思うのです。
コマンド引数としての「*」を,エスケープシーケンスを使わずに
不定値としてではなく,うまく受け取る方法があるものかなあという意味合いの質問です。
よろしくお願いします。
960デフォルトの名無しさん:2006/12/28(木) 22:52:35
""で囲め、 man すれ
961955:2006/12/28(木) 22:53:40
>>958
Visual Studio 2005コマンドプロンプトでcl使ってコンパイルして
やってみたところ,「*」がそのまま適切に受理されました。
ありがとうございます。
(やっぱり,何とか依存というやつなのかなあ...)
962デフォルトの名無しさん:2006/12/28(木) 22:57:52
ポインタで少数を間接参照するにはどうすればいいですか?
963955:2006/12/28(木) 23:01:45
>>960
それも手,,,と思ったりもするのですが,
やっぱり前述の問題の条件からはずれてくるような気がして。
(気分の問題かもしれませんが)

ちなみに,「アンサーブック」の解答例のルーチンですと,”op1 op2 op3”のような囲みで
複数の引数を与えると,きちんと複数個の引数には分けてくれませぬ。。。
””囲みで与えることを考えるのであれば,
「アンサーブック」よりもうちょっと手の込んだルーチンを書かねばならぬような感じが
いたします。
964デフォルトの名無しさん:2006/12/28(木) 23:03:17
いみわかんね
965デフォルトの名無しさん:2006/12/28(木) 23:03:51
>>962
意味がわからん、もうちょっと具体的に
966デフォルトの名無しさん:2006/12/28(木) 23:07:26
>>955
シェルの多くは * を合致するファイル名に展開する
シェルのオプションで * をファイル名に展開する機能を抑制するか、
エスケープシーケンスなどを使うことでシェルがファイル名に展開しないように指示する必要がある。

また、コンパイラによっては引数として * を受け取るとスタートアップルーチン内でファイル名に展開して、
main(int argc, char **argv) の引数として渡すものもある
967962:2006/12/28(木) 23:12:45
失礼いたしました・・

キーボードから入力した整数と少数をプラスした結果をポインタによる
間接参照をしようして入力、乗算、表示部分すべてでポインタを用いる
プログラムを作ろうと思うのですが
少数をポインタに代入する方法がわかりません
968デフォルトの名無しさん:2006/12/28(木) 23:12:58
>>940
人に質問したいのに、どうして
その質問に関わる一番肝心な部分を省略するのかなぁ・・・

そういえば、このスレにソースコードを貼り付ける奴って、
いつもそんな感じだな。

必ずといっていいほど、一番肝心な部分が「省略」されている。
969デフォルトの名無しさん:2006/12/28(木) 23:19:23
>>967
中途半端に専門用語が混ざるとわけわからん文章になる典型

それと小数、な
970デフォルトの名無しさん:2006/12/28(木) 23:20:38
彼はポインタの意味がわかっちょらんのだろ
971デフォルトの名無しさん:2006/12/28(木) 23:20:42
>>967
少数とはなにかって辺りから説明してくれたまえ。
972962:2006/12/28(木) 23:26:52
>>中途半端に専門用語が混ざるとわけわからん文章になる典型
課題プリントの文章ちょこっと削ったらこんな文章になりました。
>>少数とはなにかって辺りから説明してくれたまえ
少数じゃなくて小数でした
973955:2006/12/28(木) 23:30:01
>>966
ということは,やっぱりコンパイラやシェルの影響をかぶってしまう訳ですね。
「シェルのオプションで * をファイル名に展開する機能を抑制」できることは
初めて知りました。ありがとうございます。
974デフォルトの名無しさん:2006/12/28(木) 23:38:54
>>972
意味が分からんが言いたいことはこんな感じ?

***************************
キーボードから入力した整数と少数を加算した結果を出力する.
で、入力、乗算、表示部分すべてでポインタを行うプログラムを作りたい
しかし小数をポインタに代入する方法がわかりません
***************************

で、聞くけどまずポインタが何かは分かってるのか?
>入力、乗算、表示部分すべてでポインタを行う
この部分がどうしたいのかがよくわからん
それぞれを関数として実装して値はポインタ渡しってことか?
975974:2006/12/28(木) 23:39:44
アンカー間違えた

>>972じゃなくて>>967宛て

976962:2006/12/28(木) 23:51:00
レスありがとうございます。
ポインタの理解度は初心者程度です。
小数をポインタに代入する方法が分かりません。(まさにその通りです

先生が作った課題プリントですので推測で述べさせていただくと
ポインタとは別の変数を用意してそこに小数を代入し、
その変数をポインタに代入してポインタから代入、乗算、表示をする
という意味だと思います。ちなみに、関数はつかわなくておkです。
977デフォルトの名無しさん:2006/12/28(木) 23:55:27
文字列を一文字だけ書き換えたいのですが
ポインタを用いずに、配列で
char month[] = "January";
month[4] = 'E';
とすれば正常に動くのですが
ポインタを用いて 
  char *month = "January";
*(month+4) = 'E';
とするとエラーがでてしまいます。やっていることは同じだと思うのですが、
配列だけの場合とどう違うのでしょうか?
978デフォルトの名無しさん:2006/12/28(木) 23:58:47
>>977
書き換えてはいけない領域を書き換えようとしたのが原因と思われる。

次のようにすればおk
char buf[]="January";
char *month;
month=buf;
*(month+4)='E';
979974:2006/12/29(金) 00:00:42
>>976
>先生が作った課題プリント
これをうpしろ
うp出来ないなら出来るだけ原文を…
それと宿題をマル投げならするつもりならこっちな
http://pc8.2ch.net/test/read.cgi/tech/1166969820/
ポインタってのは実体のある場所をしめすものだ
double d; ←こっちが実体
double *p; ←こっちがポインタ
p = &d; ←dのある場所の情報を p に入れる
*p と d の内容は同じものとなる
つまり*p = 1.02 とすると d も1.02になる
980977:2006/12/29(金) 00:07:29
>>978
うまくいきました。ありがとうございます!
981ぼるじょあ ◆yBEncckFOU :2006/12/29(金) 00:11:11
>>952
(・3・) エェー おまい馬鹿じゃないかお? まさかそんなことを言って
          回答者やってるんじゃないだろうな、それともただの通りすがりの入門者かお?
982962:2006/12/29(金) 00:12:20
>>979
ありがとうございます!
すいませんポインタはint型じゃないと宣言できないと思い込んでいました(汗
丸投げするつもりはなかったのですが、とりあえずポインタに小数を
代入する方法を教えてもらいたくて・・・

ちなみに原文ですが僕がアップした内容とたいして変わりません
キーボードから入力した整数と小数(それぞれ一つずつ)を加算した結果を
表示するプログラムを、ポインタによる間接参照を用いて、作成せよ
(入力、数値変換、表示部分すべてでポインタを用いる)

なにはともあれありがとうございました!
983974:2006/12/29(金) 00:16:51
>>981
オマエのスレ見たけどえらそーなこと言うほど回答してないな
しかも変態だし…

686 名前:ぼるじょあ ◆yBEncckFOU [sage] 投稿日:2006/12/21(木) 21:30:41
(・3・) エェー 大沢あかねたんととアナ○セックスしたいなあ・・・切実だお
          最低で250万までなら余裕で出せるお
          肛○のなかに発射してしばらく挿入したままで余韻を味わって
          最後に中に放尿して引き抜いたそれをあかねたんの口できれいに
          掃除して貰いたいお・・・はあ・・・。
984ぼるじょあ ◆yBEncckFOU :2006/12/29(金) 00:23:37
(*>3<*) エェー もいらの誤爆レスをコピペしないでお
             ここで回答するつもりはないしお




             質問者はこちらへGOだお!ぼるじょあと名無しが
             親切ていねいに君たちの質問に答えるお!

ぼるじょあがC/C++の宿題を片づけますYO! 67代目
http://pc8.2ch.net/test/read.cgi/tech/1165718021/
985デフォルトの名無しさん:2006/12/29(金) 00:24:25
>>984
要するに宣伝かよw
986974:2006/12/29(金) 00:31:45
>>982
じゃあこんな感じかな?
int a,*pa;
double d,*pd;
double x,*px;
pa=&a;
pd=&d;
px=&x;
printf("整数値=");
scanf("%d",pa);
printf("実数値=");
scanf("%lf",pd);
*px = *pd + *pa;
printf("出力=%lf",*px);

987デフォルトの名無しさん:2006/12/29(金) 00:43:26
>>981
(・з・) エェー
なんで馬鹿と思ったか書かなきゃ訳わからないお
988962:2006/12/29(金) 01:00:02
>>986
回答まで教えて頂いてありがとうございます!
989デフォルトの名無しさん:2006/12/29(金) 01:01:17
次スレはどこですか?
990デフォルトの名無しさん:2006/12/29(金) 01:33:09
>>987
友達いないと構ってもらうためにこんなに必死になれるんだね
991デフォルトの名無しさん:2006/12/29(金) 01:43:08
元になる数『n個』から『m個』取り出す時の
組み合わせをだすプログラムなんですが、

自分で階乗も使ってつくってみましたが
おかしい結果になってしまいました。
ヒントをくれませんか?


#include <stdio.h>


int kaijo(int s);
int ncm(int n,int m);

int main()
{
/*num1 = 元になる数,num2 = 取り出す数*/
/*初期化*/
int num1 = 0,num2 = 0;

/*データの取得*/
printf("n= ");
scanf("%d",&num1);
printf("m= ");
scanf("%d",&num2);
/*結果表示*/
printf("x = %d",ncm(num1,num2));

}

続きます・・
992991 (2):2006/12/29(金) 01:44:44
上の続きです。

int ncm(int n,int m)
{
/*元になる数nと取り出す数mが同じ場合と、取り出す数が0の場合は組み合わせは1になる*/
if(n == m || m == 0)
{
return 1;
}
else
{
return ((kaijo(n-1) * kaijo(m-1)) + (kaijo(n-1) * kaijo(m)));
}
}

よろしくお願いします!
int kaijo(int s)
{
if(s < 0)
{
return 1;
}
else (s * kaijo(s-1));

}
993デフォルトの名無しさん:2006/12/29(金) 01:54:44
なにこのスレ文字化けだらけじゃん
994デフォルトの名無しさん:2006/12/29(金) 01:54:56
>>991
ヒント:

#include <stdio.h>

iint kaijo(int s)
{
if(s < 0)
{
return 1;
}
else (s * kaijo(s-1));
}

int main()
{
int i;
for (i=0; i<6; i++) {
printf("%d, %d\n", i, kaijo(i));
}
return 0;
}
995デフォルトの名無しさん:2006/12/29(金) 01:56:58
>>993
ちみだけじゃまいか?
996デフォルトの名無しさん:2006/12/29(金) 02:05:22
次スレたてておきました

C言語なら俺に聞け(入門篇) Part 6
http://pc8.2ch.net/test/read.cgi/tech/1167325490/
997デフォルトの名無しさん:2006/12/29(金) 02:06:31
あらあら
998デフォルトの名無しさん:2006/12/29(金) 02:14:52
おやおや
999デフォルトの名無しさん:2006/12/29(金) 02:19:07
>>993
自分の環境くらい整えとけよ
1000デフォルトの名無しさん:2006/12/29(金) 02:19:49
1000ごっと
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。