C言語質問スレ【激初心者】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
・ココは他のスレでは煽られてスルーされるような質問をするスレです。
・最低でもC言語が何か分かってる人でお願いします。
・質問者は自分の環境をわかる範囲で書きましょう。

優しい方々が答えてくれることを期待してます。
2デフォルトの名無しさん:2005/10/12(水) 00:10:06
またか・・・
3デフォルトの名無しさん:2005/10/12(水) 00:11:28
うんこー
4デフォルトの名無しさん:2005/10/12(水) 00:21:13
環境:WINDOWS SEXP 64BIT EDITIONE
コンパイラ(ぷよぷよ):VISUAL STDIO 20003

#include<studio.h>

int main(void)

   printf(”hello,work”);
5デフォルトの名無しさん:2005/10/12(水) 06:56:04
C言語の標準ライブラリをJavadocのような形式で読みたいんですけど、doxygenみたいなソフトウェアを使えばできるんですか?
6デフォルトの名無しさん:2005/10/12(水) 10:34:19
      _━━━━━━_                           _━━━━━━_
    _━           ━_                     _━            ━_ 
 _━                ━_               _━                 ━_
━          ○         ━              ━          ○         ━
  ̄━                ━ ̄                ̄━                 ━ ̄
    ̄━           ━ ̄                      ̄━            ━ ̄
      ̄━━━━━━ ̄                            ̄━━━━━━ ̄
                               ┃
                              ┃ ┃
                              ┃  ┃
                              ┃  ┃
                              ┃ ┃                   
                               ━ 


        ━━ __                              __ ━━      
          ̄━   ━━__                  __━━    ━ ̄
            ̄━        ━__        __━         ━ ̄
              ̄━          ━━━━━━          ━ ̄
                 ̄━                        ━ ̄
                    ̄━_               _━ ̄
                        ̄━_        _━ ̄
                             ̄━━━ ̄
7デフォルトの名無しさん:2005/10/12(水) 21:27:13
あのー。。。ネットで知り合って友達になったひとにC言語始めようと思ってると言ったら
なんかこんなファイルくれました。その人がいうにはそれあればほとんどのものがつくれるとか。
でも使おうにも意味不なもんなのでコレがなにか誰か教えてください。コンバイルっていってたかも・・?

http://www4.pf-x.net/~what/
8デフォルトの名無しさん:2005/10/12(水) 22:12:06
>>7
Microsoft Visual C++ 6.0 Professional Edition (Japanese)
9デフォルトの名無しさん:2005/10/12(水) 22:15:18
今日、C言語の試験があった
絶望を感じた・・・
10デフォルトの名無しさん:2005/10/12(水) 23:33:45
戻り値と引数がよくわかりません!
11デフォルトの名無しさん:2005/10/13(木) 00:06:27
>>8
マジデスカ; 使い方っていうかコレ開いて使うものなのかコマンドプロントとかでアレをするのか分かんないんですが;
誰か教えてください orz

ちょっとなんかヤバそうなので一旦7のを外しときます
12デフォルトの名無しさん:2005/10/13(木) 10:07:27
複数の任意の文字数の単語を出力として辞書順に並べるプログラミングを教えてください。
13デフォルトの名無しさん:2005/10/13(木) 10:09:54
まずは単語の定義から
14デフォルトの名無しさん:2005/10/13(木) 17:33:12
すいません,文字列とポインタについて教えてください.

char word[32] = "hello, world!";
char *ptr;

ptr = word;

printf("%s\n", word);
printf("%s\n", &ptr);

printfの上はふつうに表示されるのに下は文字化けします.
数値(%d),一つの文字(%c)では正常に表示されます.
文字列の場合は単純に先頭のアドレスをprintfに渡してもダメならば
どう扱うべきなのでしょうか?
15デフォルトの名無しさん:2005/10/13(木) 17:40:42
>>14
ptrはポインタだから、printf("%s\n", ptr);でいい。
1614:2005/10/13(木) 18:21:49
>>15

あ,できました!
ありがとうございました.
17デフォルトの名無しさん:2005/10/13(木) 18:43:32
>>12
int main(){
 set<string> in(istream_iterator<string>(cin), istream_iterator<string>());
 copy(in.begin(), in.end(), ostream_iterator<string>(cout));
}
1817:2005/10/13(木) 18:44:22
しまったC++スレじゃなかったスマソ
19デフォルトの名無しさん:2005/10/13(木) 23:16:27
C言語を基礎の本を買って勉強したのですが、計算ツールくらいしか作れません。
なにをどう勉強すればよいのでしょうか?
だれか教えてください。
20デフォルトの名無しさん:2005/10/13(木) 23:26:38
一生計算ツール作ってろよ
21デフォルトの名無しさん:2005/10/13(木) 23:42:52
ひでぇ・・・!
22デフォルトの名無しさん:2005/10/14(金) 10:05:59
>>19
気軽に「こんなソフトありませんか?」 22
ttp://pc7.2ch.net/test/read.cgi/software/1129190874/
23デフォルトの名無しさん:2005/10/18(火) 23:39:14
すいません。質問です。

ある駐車場があって、そこでは一時間駐車すると500円とられ
それから30分ごとに料金が200円追加される。
分単位で時間を入力したときにそのときの料金を表示させる。

このようなプログラムを作りたいのですが、どのようにすればいいか考え付きません。
めっちゃ基礎の範囲ですが、どなたか教えてください。
24デフォルトの名無しさん:2005/10/18(火) 23:55:20
#include <stdio.h>
int Ryokin(int hun){
  if(hun <= 60) return 500;
  else return ((hun - 31) / 30) * 200 + 500;
}
int main(void){
  int n;
  printf("時間を入力してください(分)\n");
  scanf("%d",&n);
  printf("%d円になります。\n",Ryokin(n));
  return 0;
}

どちらかというと良心的な駐車場
25デフォルトの名無しさん:2005/10/19(水) 00:26:53
>>24
ありがとうございます!感謝感激です。
26デフォルトの名無しさん:2005/10/19(水) 00:36:01
プログラムを実行したら、起動中のテキストやワードなどに、指定しおいた文字や数字を
入力するプログラムを作りたいのですが、できますか?
27デフォルトの名無しさん:2005/10/19(水) 00:51:42
>>26
できますが初心者向けではありません。
28デフォルトの名無しさん:2005/10/19(水) 01:14:58
>>13
日本語で言う単語です。
29851:2005/10/19(水) 01:39:52
>>28
言う
単語

です
日本語
30デフォルトの名無しさん:2005/10/19(水) 15:04:10
超初心者ですいません。
大学のプログラミングの授業でC言語をならいはじめたんですが、講義形式の授業なのでさっぱりわけがわかりません。
自分でプログラム打って動かしたら理解ができそうなんですけど、
C言語をプログラミングできるソフトってネット上で手にはいりますか?
31デフォルトの名無しさん:2005/10/19(水) 15:05:51
>>30
講師に聞けよ。金払ってるんだろ?
32デフォルトの名無しさん:2005/10/19(水) 15:08:28
現実世界では面と向かって人間と会話できない駄目人間なんだよきっと
33デフォルトの名無しさん:2005/10/19(水) 15:17:09
役たたね
34デフォルトの名無しさん:2005/10/19(水) 15:22:54
たちたくもない(君の役には)
35デフォルトの名無しさん:2005/10/19(水) 15:32:03
小学生でも予習復習ぐらいするぞ
36デフォルトの名無しさん:2005/10/19(水) 15:38:04
それがどうした?
37デフォルトの名無しさん:2005/10/19(水) 16:22:49
ぐぐったらこんなのあった
ttp://homepage3.nifty.com/mmgames/c_guide/
38デフォルトの名無しさん:2005/10/19(水) 20:26:15
学校の宿題なんですけどまったくわかりませんorz
どなたか教えてくださいm( __ __ )m

@円柱の体積を求めるプログラムを作りなさい
 ただし半径と高さはキーボードから入力する(変数の型をfloatにする)
A時速(km/時)をキーボードから入力し、時速(m/秒)に変換して出力するプログラム作りなさい
 (変数の型をfloatにする)

以上の2問でつ
お願いします
39デフォルトの名無しさん:2005/10/19(水) 20:35:25
>>38
宿題スレへ池
40Ω:2005/10/19(水) 20:54:25
program cal_vol
real r,h,v
write(6,*) 'radius?'
read(5,*) r
write(6,*) 'hight?'
read(5,*) h
v=3.14159264*r*r*h
write(6,*) 'Volume=',v
stop
end


program convert_from_km/h_to_m/s
real s1,s2
write(6,*) 'speed? [km/s]'
read(5,*) s1
s2=s1/3.6
write(6,*) s2,'[km/h=',s,'[m/s]'
stop
end
41デフォルトの名無しさん:2005/10/19(水) 20:56:18
ぁ,ミスってらww
後はこれをC言語に変えるだけwww
>>38
4238:2005/10/19(水) 21:17:08
>>40
余計わからない…
43デフォルトの名無しさん:2005/10/19(水) 22:11:42
そりゃそうだFortranなんか教えているところが残っているのかどうかw
4438:2005/10/19(水) 22:29:53
Fortran?
聞いたことがないでつorz
上の2個の問題はなんとか自分で解けました
45デフォルトの名無しさん:2005/10/19(水) 23:29:17
>>38
> 時速(m/秒)

秒速だろ?
46デフォルトの名無しさん:2005/10/19(水) 23:39:34
いまでもスパコンはFORTRANだろ
まああれをFORTRANと呼ぶのが正しいのかどうかは疑問だが
47デフォルトの名無しさん:2005/10/20(木) 00:05:53
すみません、本気で誰か助けてください…。
「0〜1の擬似乱数を30000個ずつ3行発生させるプログラム」がどうしてもできません…。
誰か教えてください…。

「1〜100の擬似乱数を10個ずつ10行」はできたのですが、それを変えてもうまくいきません。
一応、これがそのプログラムです
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
int i,j;

/* 乱数系列の変更 */
srand((unsigned) time(NULL));

/* 1〜100の擬似乱数を10個ずつ10行発生 */
for (i=1; i<=10; i++) {
for (j=0; j<10; j++) {
printf("%3d ",rand()%100+1);
}
printf("\n");
}
return 0;
}
どうかよろしくオナガイシマス……。
ちなみに富士通Fortranを使っています。
48デフォルトの名無しさん:2005/10/20(木) 00:37:23
しかし面白く無いネタだなぁ。
49デフォルトの名無しさん:2005/10/20(木) 00:54:52
>>47
何がどう駄目なのか、それを書かないと誰も回答できんよ?
5047:2005/10/20(木) 01:29:47
いきなりの質問ですいませんでしたm(_ _)m゛

私は>>47に書いた「1〜100の擬似乱数を10個ずつ10行発生」のプログラムを書き換えたら、「0〜1の擬似乱数を30000個ずつ3行発生」もできるような気がしてるんですが…
どこをどう書き換えたらうまくいくのかわかりません…。
それとも、書き換えるだけでは駄目ですか??

すみません、よろしくお願いします…。
51デフォルトの名無しさん:2005/10/20(木) 02:25:30
>>50
そもそも >>47 のプログラムを理解してないんじゃない?
なんかの丸写しだろ?
それじゃあ教えようすらないよ
52デフォルトの名無しさん:2005/10/20(木) 03:10:47
しっかし面白く無いネタだよなぁ。
53デフォルトの名無しさん:2005/10/20(木) 11:39:05
富士通FortranってCもできるの?
54デフォルトの名無しさん:2005/10/20(木) 11:42:00
Fortran&Cってのがある
55デフォルトの名無しさん:2005/10/20(木) 12:45:13
>>47
2つの問題の違いを見ていけば、自然と答えが出るのでは。
「10」個を「30000」個に、「10」行を「3」行に、「「1〜100」を「0〜1」にっていう部分しか違わないじゃない。
プログラム中に出てくる数字も限られてるんだし、どこを書き換えればいいかはわかるでしょう。

for文とrand、srandがわかってないなら入門サイトなり授業だか研修だかで使ってる本なりを見れば
載ってるかと。
ちなみに rand()%5 の%は剰余(割ったあまり)を計算するものだから、0〜4の値になります。
56デフォルトの名無しさん:2005/10/20(木) 12:57:17
>>55
実は整数値でなくなるので若干の質的な変更も必要な罠。
57デフォルトの名無しさん:2005/10/22(土) 17:08:17
質問です。。
どうしても大文字に変換したものと小文字に変換したものが表示されません。
data.inというファイルがあるというものとして教えてください。
分割して書き込みます
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int capital(int);
int small(int);

int main(void)
{
int i;
FILE *inp,*outp;

/*入力ファイルのオープン*/
if((inp=fopen("data.in","r"))==NULL)
{
printf("can't open -- data.in\n");
exit(EXIT_FAILURE);
}

/*出力ファイルのオープン*/
if((outp=fopen("prog02.out","w"))==NULL)
{
printf("can't open -- prog02.out");
exit(EXIT_FAILURE);
}

58デフォルトの名無しさん:2005/10/22(土) 17:09:03
/*ファイルへ出力*/

fprintf(outp,"通常データ\n");
while((i=fgetc(inp))!=EOF)
{
putc(i,outp);
}
fprintf(outp,"\n大文字に変換\n");
while((i=fgetc(inp))!=EOF)
{
putc(capital(i),outp);
}
fprintf(outp,"\n小文字に変換\n");
while((i=fgetc(inp))!=EOF)
{
putc(small(i),outp);
}


/*ファイルのクローズ*/
if(fclose(inp))
{
printf("\nfailed to close a file\n");
}

if(fclose(outp))
{
printf("\nfailed to close a file\n");
}
return EXIT_FAILURE;
}
59デフォルトの名無しさん:2005/10/22(土) 17:12:06
/* 小文字 → 大文字 */
int capital(int moji)
{
int diff,i;

diff='a'-'A';
if('a'<=moji && moji<='z')
{
return moji-diff;
}

return moji;
}

/* 大文字 → 小文字 */
int small(int moji)
{
int diff;
diff='a'-'A';

if('A'<=moji && moji<='Z')
{
return moji+diff;
}

return moji;
}
60デフォルトの名無しさん:2005/10/22(土) 17:22:33
以上です。
宜しくお願いします。
61デフォルトの名無しさん:2005/10/22(土) 17:24:44
>>57
最初の「通常データ」のループで入力ファイルを終端まで読み込んでいるので、
その後巻き戻さない限りもう読めるものがないという状況になっているだけ。
62デフォルトの名無しさん:2005/10/22(土) 17:25:15
>>57
fseekを使いましょう
63デフォルトの名無しさん:2005/10/22(土) 17:26:14
いや寧ろ、素直に巻き戻し(rewind())
64デフォルトの名無しさん:2005/10/22(土) 17:29:07
もちっと親切に書くと
a. クローズして再オープンする
or
b. fseek()を調べろ
65デフォルトの名無しさん:2005/10/22(土) 17:30:35
>64
rewind()の立場は?
6657:2005/10/22(土) 17:36:53
色々ありがとうございます!!
巻き戻しの作業について調べたいと思います!
6757:2005/10/22(土) 17:52:28
>>57です!
今コンパイルして実行してみたら、ちゃんと思い通りに動いてくれました!!
本当にありがうございました!!
物凄い悩んでいたから本当にうれしい。
68デフォルトの名無しさん:2005/10/22(土) 19:32:52
すいません質問です。
nを入力させて
1+3=4=2^2
1+3+5=9=3^2
…というようにn番目の奇数までを足していって
上のように表示させるのって出来ますか?forかwhileで
69デフォルトの名無しさん:2005/10/22(土) 19:44:58
>>68
//sum = 0 ;
for (i = 1; i <= n ; i ++)
{
// sum += 1 + 2 * (i - 1) ;
printf ("%d", 1 + 2 * (i - 1)) ;
(i != n) ? putchar ('+') : putchar ('=') ;
}
printf ("%d^2\n", n) ;
これでどうです?
7068:2005/10/22(土) 20:00:26
>>69さんどうもです。実行したところ
nを4として
1+3+5+7=4^2とでました。
しかし自分はn=4としたら
1=1^2
1+3=2^2
1+3+5=3^2
1+3+5+7=4^2
というように設定したnより小さかった場合も
表示したいのですがこういうのはできませんかね?
71デフォルトの名無しさん:2005/10/22(土) 20:13:45
>>70
そのぐらい自分で書けないでどうしますか。

方針:
・>69を関数にする。
・1からnまでのループを作り、その中で上記関数を呼ぶ。
72デフォルトの名無しさん:2005/10/22(土) 20:19:11
>>71関数つかわないでやるのはむりですか?基本的にforとwhileだけで。
73デフォルトの名無しさん:2005/10/22(土) 20:23:45
>>72
んじゃ、関数化しないで変数名が競合しないように気をつけて書きな。
74デフォルトの名無しさん:2005/10/22(土) 20:24:25
// m = 4
for(n = 1; n <= m; n++){
for (i = 1; i <= n ; i ++)
{
printf ("%d", 1 + 2 * (i - 1)) ;
(i != n) ? putchar ('+') : putchar ('=') ;
}
printf ("%d^2\n", n) ;
}
75デフォルトの名無しさん:2005/10/22(土) 20:28:12
まあ、スレッドがスレッドだし.....。
7672:2005/10/22(土) 20:58:59
>>74すいません。実行してみたんですがエラーメッセージでないのになにも動かなかったです。
もう一回やってみます。
//m=4ていうのはmが4までやるってことですよね?
77デフォルトの名無しさん:2005/10/22(土) 23:09:12
>>76
単に変数名変えるのがめんどうだっただけ

#include <stdio.h>
int main(void){
int i,n,m = 4;

for(n = 1; n <= m; n++){
for (i = 1; i <= n ; i ++)
{
printf ("%d", 1 + 2 * (i - 1)) ;
(i != n) ? putchar ('+') : putchar ('=') ;
}
printf ("%d^2\n", n) ;
}
return 0;
}
7876:2005/10/22(土) 23:33:55
出来ました!皆さん有難うございました。
今後はもっとちゃんと勉強します。
79デフォルトの名無しさん:2005/10/23(日) 12:56:13
すいません、かなり低レベルな質問なんですが、よろしくお願いしますm(_ _)m

#include<stdio.h>

int GetBekijyou(int, int);

void main(void)
{
int number1, number2;
int kekka;

number1=5;
number2=3;

kekka=GetBekijyou(number1,number2);

printf("%d no %d jyo=%d\n", number1, number2, kekka);
}

int GetBekijyou(int x, int y)
{
int z;

if(y==1)
return(x);

z = x*GetBekijyou(x, y-1);

return(z);
}
結果:5 no 3 jyo=125
8079:2005/10/23(日) 12:57:45
続きです

これの再帰呼び出しの部分がよく分かりません・・・
xに関数GetBekijyouを掛けてるのかな、とか色々考えたんですが、それじゃおかしくなってしまって・・・
因みに、自分は中学、高校とも全くと言っていいほど数学が出来なかったんですが
これじゃC言語を学ぶのは厳しいでしょうか?orz
81デフォルトの名無しさん:2005/10/23(日) 13:08:03
>>80
> xに関数GetBekijyouを掛けてるのかな
そのとおりだけど何か。
8279:2005/10/23(日) 15:24:25
>>81
やっぱそうですか。でもその後、return(x); で125をどこに返してるのか
分からないです・・・
83デフォルトの名無しさん:2005/10/23(日) 15:40:14
質問です。

配列に文字列を入力から受け取ってそれを別の
配列にコピーするプログラムなんですが、配列
から配列に代入する部分でエラーが出ます。
どなたか原因がわかるかたがいらっしゃいましたら
お願いしますm(..)m

環境はredhatlinuxの8です。
----------ソース----------

1 #include <stdio.h>
2
3 int main(){
4 char name1[100];
5 char name2[100];
6
7 printf("input your name\n");
8 scanf("%s",name1);
9 printf("name1=%s\n",name1);
10
11 name2 = name1;
12 printf("name2=%s\n",name2);
13
14 return 0;
15 }

----------結果----------
# gcc test1.c
test1.c: 関数 `main' 内:
test1.c:11: 代入 に互換性のない型
84デフォルトの名無しさん:2005/10/23(日) 16:16:59
>>83
Cには文字列型は存在しない。
アドレスをアドレスには代入できない。
文字列のコピーには、strcpyを使う。

ってなところでどう?
85デフォルトの名無しさん:2005/10/23(日) 16:17:00
>>83
Cでは配列を配列に代入することはできません。素直にstrcpy()でも使ってください。
8683:2005/10/23(日) 21:52:13
84さん85さんありがとうございました。
strcpyで解決しました!
87デフォルトの名無しさん:2005/10/23(日) 22:09:25
c言語の勉強を始めて2ヶ月ぐらいのド素人です。
プログラムとは直接関係ありませんが、
コンソールアプリケーションで作った実行ファイルのアイコンを変換する方法
もしくはツールを知ってる方いたら、教えてもらえないでしょうか?
88デフォルトの名無しさん:2005/10/23(日) 22:25:14
>>87
ショートカットを作ってプロパティダイアログでアイコンの変更。
89デフォルトの名無しさん:2005/10/23(日) 22:28:45
>>87
リソースをくっつければEXEのアイコンを指定できる。
90デフォルトの名無しさん:2005/10/24(月) 00:21:22
83で質問させていただいた者です。
たびたびすいません、もうひとつ質問よろしいでしょうか。

次のソースなんですが、関数に構造体のアドレスを渡して
scanfで入力した値を構造体のメンバに入れて、その値をmain
で表示するというプログラムです。

コンパイルは通ったのですが、実行すると落ちることがあります。
具体的にはscanfで入力する文字が半角英字で3文字までなら
ちゃんと表示してくれるのですが、4文字以上入れると表示せずに
"セグメンテーション違反です"とでます。

ちなみに、9,10行目を
struct Seito seito1;
startup(&seito1);
とした場合は4文字以上入れてもちゃんと表示してくれます。

どこがおかしいかわかる方いらっしゃいましたらよろしくお願いします。

環境はRedHatLinux8です。
91デフォルトの名無しさん:2005/10/24(月) 00:22:23
これがソースです

#include <stdio.h>
#include <string.h>
struct Seito{
char name[100];
};

int main(){
struct Seito * seito1;
startup(seito1);
return 0;
}

int startup(struct Seito * seito1);

int startup(struct Seito * seito1){

char name[100];
/* get name */
printf("input your name\n");
scanf("%s",name);
/* set struct player status */
strcpy(seito1->name,name);

printf("seito1 name is %s\n",seito1->name);
return 0;
}
92デフォルトの名無しさん:2005/10/24(月) 00:40:33
>>91
struct Seitoのメモリが確保されていない。
というわけでこうしてみな。
int main() {
    struct Seito seito1;
    startup(&seito1);
    return 0;
}
93デフォルトの名無しさん:2005/10/24(月) 00:53:02
>>92
ありがとうございます。
92さんのやり方だとうまくいきます。

構造体変数をいきなりポインタ型で宣言しても領域は確保して
くれないんですね。(て認識であってますよね?)

理由がわかって助かりましたー。
94デフォルトの名無しさん:2005/10/24(月) 07:19:46
問.二分木を使ったソートの特徴を述べよ。
という課題が出ました、200字程度で書けって言われたけど全然分かりません
どのように答えれば良いのか教えてください
95デフォルトの名無しさん:2005/10/24(月) 08:43:11
計算量がO(logn)で安定
また、あまりデータの偏りによらず、性能が劣化しない
96デフォルトの名無しさん:2005/10/24(月) 09:20:32
あれ、でもお馬鹿な二分探索木は、データが初めからソートされてるとO(N)になっちゃうんじゃ・・・
全てのノードが左方向だけ(or右方向だけ)につながって、それって線形リストと一緒やん状態
97デフォルトの名無しさん:2005/10/24(月) 10:01:52
要素数がnoであるint型の配列vcの並びを逆順にする関数

void rev_intary(int vc[],int no) {/*・・・*/}

を作成しなさい。

このプログラムの作成方法がまったく分かりません・・・。const型修飾子と関係あるんですか?
よろしければ、教えてください。お願いします。
98デフォルトの名無しさん:2005/10/24(月) 10:07:35
関係ないね!
99デフォルトの名無しさん:2005/10/24(月) 10:08:40
>>98
関係ないんですか・・・。このプログラムはどう作成すればいいんでしょうか・・?
100デフォルトの名無しさん:2005/10/24(月) 10:13:16
>>99
安直に
void rev_intary(int vc[], int no)
{
 int i, t;
 for (i=0; i<no/2; i++) {
  t = vc[i]; vc[i] = vc[no-i-1]; vc[no-i-1] = t;
 }
}
101デフォルトの名無しさん:2005/10/24(月) 10:18:07
>>100
ありがとうございます。しかしこのプログラムで翻訳するとエラーになるんですが・・・。
102デフォルトの名無しさん:2005/10/24(月) 10:21:48
全角スペースを半角スペースに置き換えれ
103デフォルトの名無しさん:2005/10/24(月) 10:22:15
>>101
エラーが起きたときはエラーメッセージを貼りましょう。
104デフォルトの名無しさん:2005/10/24(月) 10:35:04
すいません。解決しました。ありがとうございました。
もう1つよろしいでしょうか?
一応自分でプログラム作ったのですが(2行3列の行列と3行2列の行列の積)
エラーが出てしまいます。
エラー:不適合なポインタが指定されています。
エラーが出るのはmul(ma,mb,mc);の所です。

105デフォルトの名無しさん:2005/10/24(月) 10:35:34
プログラム:
#include <stdio.h>

void mul(const int ma[2][3],const int mb[3][2],int mc[2][2])
{
int i,j;

for(i=0;j<2;i++)
for(j=0;j<2;j++)
mc[i][j]=ma[i][j]*mb[i][j];
}

int main(void)
{
int i,j;
int ma[2][3]={{1,2,3},{4,5,6}};
int mb[3][2]={{5,6},{8,2},{1,3}};
int mc[2][2]={0};

mul(ma,mb,mc);

for(i=0;i<2;i++){
for(j=0;j<2;j++)
printf("%3d",mc[i][j]);
putchar('\n');
}


return(0);
}
106デフォルトの名無しさん:2005/10/24(月) 10:41:09
>>105
const外せ
107デフォルトの名無しさん:2005/10/24(月) 10:42:24
>>106
はずしていいんですか?一応問題文と例題(類題)ではconstを使用するようにと書いてあるんですが、、。
108デフォルトの名無しさん:2005/10/24(月) 11:01:26
>>105
別にエラー出ないけど。どうしてもエラー出るならmainの中のmaとmbにもconstつけてみたら?
ちなみにmulの中てきとーすぎw
どっちが行でどっちが列か知らないが勘でやるとこんな感じか

for(i=0; i<2; i++)
  for(j=0; j<3; j++)
    for(k=0; k<2; k++)
      mc[i][k] += ma[i][j] * mb[j][k];
109デフォルトの名無しさん:2005/10/24(月) 11:04:49
>>108
エラー出て、いろいろいじったんですが結局計算結果が0になってしまいました。
一応、このプログラムは本の類題を自分で打ったんですけどおかしいんですか、、、orz
110デフォルトの名無しさん:2005/10/24(月) 11:07:52
>>108
一応、2行3列×3行2列の計算です。
111デフォルトの名無しさん:2005/10/24(月) 11:11:12
類題では2行3列の行列の和になってて、ここではmulの部分が

mat_add(ma,mb,mc);になってるんですよ。そして解説のはma,mbの和をmcに格納と書いてあります。
112デフォルトの名無しさん:2005/10/24(月) 11:20:04
>for(i=0;j<2;i++) ←IじゃなくてJになってるぞ

それに行列の積は各要素をかけたものじゃないわけだが・・・
113デフォルトの名無しさん:2005/10/24(月) 11:22:55
何度やってもエラーになってしまいます、、、、。
もうわけわからない・・・・。
114デフォルトの名無しさん:2005/10/24(月) 11:23:38
どういうエラーが出るのよ
115デフォルトの名無しさん:2005/10/24(月) 11:28:04
警告:実引数渡し:不適合なポインタが指定されています。const int(*)[3]とint(*)[3]の指定です。:第1引数 mul
116デフォルトの名無しさん:2005/10/24(月) 11:31:58
>>105
もしかして、それって柴田望洋先生の本じゃない?
117デフォルトの名無しさん:2005/10/24(月) 11:32:57
>>116
そうだよ。明解C言語入門編
118デフォルトの名無しさん:2005/10/24(月) 11:42:16
>>117
ちなみにどんな環境でやってまつか?
119デフォルトの名無しさん:2005/10/24(月) 11:46:25
環境っていうことは、開発ソフトのことですか?

開発マネージャというのを使っています。OSはXPです。

みなさん、質問に答えていただきありがとうございました。もう1回自分で考えてみます。
また不明な点があったら質問したいと思いますのでその時はど素人ですがよろしくお願いします。
120デフォルトの名無しさん:2005/10/24(月) 11:54:26
> 開発マネージャ
ものすごい気になる。何だそれ。
121デフォルトの名無しさん:2005/10/24(月) 11:54:36
>>119
#include <stdio.h>

void mul(const int ma[2][3],const int mb[3][2],int mc[2][2]){
int i,j,k;

for(i=0;i<2;i++)
for(j=0;j<3;j++)
for(k=0;k<3;k++)
mc[i][j]+=ma[i][k]*mb[k][j];

}

int main(void){
int i,j;
int ma[2][3]={{1,2,3},{4,5,6}};
int mb[3][2]={{5,6},{8,2},{1,3}};
int mc[2][2]={0};

mul(ma,mb,mc);

for(i=0;i<2;i++){
for(j=0;j<2;j++)
printf("%3d",mc[i][j]);
putchar('\n');
}
return(0);
}

一応こんなじゃだめかな
122デフォルトの名無しさん:2005/10/24(月) 11:55:53
>開発マネージャ
Fujitsu Fortran&Cか
123デフォルトの名無しさん:2005/10/24(月) 11:57:33
拡散方程式を陰解法で解いたソースが入手できるサイト知りませんか?
124デフォルトの名無しさん:2005/10/24(月) 13:32:09
>>121
いちおう細かいことつっこんでおくと、mulの中の
for(j=0;j<3;j++)
のところ、3じゃなくて2じゃね?
125デフォルトの名無しさん:2005/10/24(月) 14:16:07
>>124
そでした。スマソ。
126デフォルトの名無しさん:2005/10/24(月) 17:19:56
すみません、次のようなソースを理解したいのですが、
その為に有用な本やサイトはありますか?
手元にある入門書には載ってなくて、さっぱり分からないんです。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "tdc.hh"

int main(int argc, char **argv){
class TDC tdc;

if(argc != 3){
fprintf(stderr,"Invalid argument\n");
fprintf(stderr,"Usage: tdcana <target name (data file)> <destination name (root file)>\n");
exit(1);
}

tdc.Init(argv[1],argv[2]);

tdc.Analyze();

tdc.End();

return 0;
}
127デフォルトの名無しさん:2005/10/24(月) 17:21:28
>>126
classというのはC++のもの。
だからまずはC++の勉強をしてみな。
128デフォルトの名無しさん:2005/10/24(月) 17:28:31
質問です。
ビットマップを入出力するため、下のサイトからソースを借りて使っているのですが、
2枚画像を読み込むと2枚目が正常に入力できていないようなのです。
メモリを確保できていないためかと思い、malloc関数などを調べましたがよく分かりませんでした。
具体的にはimage[480][640][3]のように三次元の配列での使い方がわかりませんでした。
それとも原因は別にあるんでしょうか?よろしくお願いします。

ttp://www.fit.ac.jp/elec/7_online/lu/tanosigazou.htm
129デフォルトの名無しさん:2005/10/24(月) 17:46:05
>>128
そのサイトを書いたらしい三国人に聞けばいいだろう。
130デフォルトの名無しさん:2005/10/24(月) 18:19:54
>>127
ずっとCだと思ってました……
ありがとうございます
131デフォルトの名無しさん:2005/10/24(月) 19:33:32
なんでネタで立てたスレがこんなに伸びてるんだ
132デフォルトの名無しさん:2005/10/24(月) 22:22:22
>>120
>>121
>>122

>>121さんありがとうございます。一応、エラーが出たんですが開発マネジャーでやると必ずエラーが出るそうでそれを無視して翻訳すればOKだそうです。
とても助かりました。本当にありがとうございます。
>>120さん、>>122さんのおっしゃるとおりです。
133help me:2005/10/24(月) 23:01:21
/* 曜日構造体 */
typdef struct{
char weekend[7];
char week[7];
}WEEK;
という構造体のchar week[7];に、“月火水木金土”をコピーします。
(あるソースファイルで)

他の出力専用のソースファイルで、for文でprintfの%cを使って出力します。

すると、途中までしか表示されません。

何故??

ちなみにOSはUNIX。
134デフォルトの名無しさん:2005/10/24(月) 23:08:33
>>133
月火水木金土だけのファイルをエディタで作ってファイルサイズを見て味噌。
135デフォルトの名無しさん:2005/10/24(月) 23:09:04
"月 "を1バイトで表現する文字エンコーディングは有りません。
wchar week[7]として%wcを使うか、char week[14]にして%c%cで2文字づつ出すかのどっちかが簡単
136デフォルトの名無しさん:2005/10/24(月) 23:24:00
>>135
この世のどこかにはcharにUTF-16を使うリッチな環境があるかもしれないw。
137デフォルトの名無しさん:2005/10/24(月) 23:24:42
>>136
UnicodeじゃないけどTRONとかな
138デフォルトの名無しさん:2005/10/24(月) 23:26:53
そういえばMSXかPC-98の1バイトコードには「年月日」みたいな漢字も
入ってたな
139デフォルトの名無しさん:2005/10/24(月) 23:44:09
MSXはグラフィックコードといって年月日と曜日の漢字は2バイトだったはず。
140デフォルトの名無しさん:2005/10/24(月) 23:46:29
void AAA(){
}

void *func;
func = AAA;
このfuncからAAA関数の実行の仕方を教えてください。
141デフォルトの名無しさん:2005/10/24(月) 23:48:04
>>140
void *funcで受けたらダメだろ
void (*func)()で受けないと
142デフォルトの名無しさん:2005/10/24(月) 23:48:45
func();

じゃないの?
143デフォルトの名無しさん:2005/10/24(月) 23:49:49
>>140
func();
144デフォルトの名無しさん:2005/10/24(月) 23:50:49
C言語の.exe実行ファイルを自分の書いたアイコンに変更したいですが
どうすればいいのですか?
145デフォルトの名無しさん:2005/10/24(月) 23:53:05
>>144
そりゃWindowsの機能。
146デフォルトの名無しさん:2005/10/24(月) 23:56:38
147デフォルトの名無しさん:2005/10/25(火) 00:25:59
int work;
scanf( "%d",work );

で、間違って"8a"を入力したら、無限ループになりました。
148デフォルトの名無しさん:2005/10/25(火) 00:50:31
4で割り切れるか割り切れないかの判断プログラムを教えてください
149デフォルトの名無しさん:2005/10/25(火) 01:00:14
イ`
150デフォルトの名無しさん:2005/10/25(火) 01:56:21
またすいません・・・
int m, n;

printf( "整数は?" );
scanf("%d,&n);
scanf("%d,&m);
printf( "%d %d は", n, m );
if(m=1 || n>0 );
{ printf( "真 " );
}
else
{ printf( "偽 ");
}
是どこか変ですか?
151デフォルトの名無しさん:2005/10/25(火) 02:46:47
>>150
おまえの頭

エラーが出たのか思い通りの出力が出ないのか
ああもう何でもいいから何をしたらどうなったか書いてくれ
152デフォルトの名無しさん:2005/10/25(火) 02:49:34
>>150
とりあえず
× if(m=1 || n>0 );
○ if(m=1 || n>0 )
153デフォルトの名無しさん:2005/10/25(火) 03:21:34
>>150
おまえの頭

仮にC言語だとしても (m=1||n>0)なんて、代入式とで何を判定したいんだか…
154デフォルトの名無しさん:2005/10/25(火) 17:41:59
VisualC++6.0使ってます。
double d[1000][1000]のように大きな配列を宣言するとプログラムが落ちます。
double d[100][100]くらいなら問題無いのですが・・・
メモリは512MBなので十分のはずなのですが、なにか設定があるのでしょうか?
155デフォルトの名無しさん:2005/10/25(火) 17:46:48
あるよ
156デフォルトの名無しさん:2005/10/25(火) 17:47:30
>>140
void AAA(){
}

void *func;
func = AAA;
((void *())AAA)();
157デフォルトの名無しさん:2005/10/25(火) 17:49:41
仕事が無いんです。能力は十分のはずなのですが、なにか問題があるのでしょうか?
158デフォルトの名無しさん:2005/10/25(火) 17:50:14
あるよ
159デフォルトの名無しさん:2005/10/25(火) 18:14:48
>>157
どんだけの能力持ってるのか知らんが,いまどきCだけ出来てもな・・・
160デフォルトの名無しさん:2005/10/25(火) 18:38:29
>>157
人間性に問題があるのでは?



と、釣られてみるテスト
161デフォルトの名無しさん:2005/10/25(火) 18:44:05
営業力が足りない
162デフォルトの名無しさん:2005/10/25(火) 18:50:57
プログラム(実行ファイル)の絶対パスを取得するにはどうすればいいですか?
163デフォルトの名無しさん:2005/10/25(火) 18:52:12
>>161
ワラタ
164デフォルトの名無しさん:2005/10/25(火) 18:55:27
>>162
そんなもの取得するな
165162:2005/10/25(火) 18:56:48
取得したいんだよ。
カレントディレクトリにないファイルを実行するときとか困るんだよ
166デフォルトの名無しさん:2005/10/25(火) 18:58:10
>>165
そんなクソ仕様を見直せ
167デフォルトの名無しさん:2005/10/25(火) 18:59:04
質問です。以下のプログラムのコメントを添えた所で止まってしまいます。
なぜでしょうか(C++のコンパイラを使っているから?)。
#include <stdio.h>

int main ( void )
{
char *w[] = { "sun", "mon", "tue", "wed", "thu", "fri", "sat", };
int k;

printf(" %s ", w[1] );
printf(" %s ", *(w+1) );

printf(" %s ", w[1][0] );/*これは、うまく”m”が出ない。プログラムが止まる*/
printf(" %s ", *(w[1]+1) );/*これも、うまく”o”が出ない。プログラムが止まる*/
return 0;

}
168デフォルトの名無しさん:2005/10/25(火) 19:01:35
>167
コンパイラを疑う前に、自分で書いたソース疑えよ。
169デフォルトの名無しさん:2005/10/25(火) 19:07:30
>>167
下二つのprintfの%sを%cにしてみそ
170162:2005/10/25(火) 19:35:09
取得できないんでしょうか?
argv[0]はコンパイラによってちがうし
171デフォルトの名無しさん:2005/10/25(火) 19:52:10
カンキョウイゾン
172デフォルトの名無しさん:2005/10/25(火) 20:17:37
windows2000, VisualStudio6Pro の環境です。
SJIS<->Ucs2の相互変換をするにはどうしたらいいでしょうか。
173デフォルトの名無しさん:2005/10/25(火) 20:18:43
>>172
MultiByteToWideChar
174デフォルトの名無しさん:2005/10/25(火) 21:18:59
>>172
C標準ライブラリの範囲ではmbstowcs()。
予めsetlocale(LC_ALL, "Japanese");を行うと入力元がShift JISとして扱われるようになる。
175デフォルトの名無しさん:2005/10/25(火) 22:41:49
ちょっと便乗して質問です。

私も以前、実行ファイルの絶対パスを知る方法を聞いたとき、設計を見直せといわれました。
では、それを知ることなく外部ファイルのデータを読み込むにはどうすればいいんでしょうか。

例えば、Windows 上で動作するプログラム hoge.exe は、
同じディレクトリにある aaa.txt からデータを読み込み、表示するとします。
このとき、ファイルのオープンを fopen("aaa.txt", "r") などとします。

ところが、例えば Windows 上で hoge.exe を、外部ファイルの D&D で起動したときなど、
カレントディレクトリの位置が環境依存で変更されてしまうことがあります。
(XP の場合、C:\Document and Setting\(ユーザ名)\ になります)

このとき、上記の fopen は、aaa.txt を見つけられず失敗します。
これを防ぐには、実行ファイルの絶対パスを取得し、
実行ファイルのあるディレクトリをカレントディレクトリにする以外の方法が見つかりません。

ご教授よろしくお願いします。
176デフォルトの名無しさん:2005/10/25(火) 22:44:18
環境変数って無いの?
177デフォルトの名無しさん:2005/10/25(火) 22:46:59
>>175
ウィンドウアプリだったらファイル選択ダイアログ
コマンドラインだったらパラメータでパス指定
ってとこ。
178デフォルトの名無しさん:2005/10/25(火) 22:51:24
>>175
別に実行ファイルの絶対パスを知ってどうにかすること自体はそんなに変なことではない。
標準Cだけを扱うスレではスレ違いだというだけのこと。
Win32APIスレにでもいけばいい。
179デフォルトの名無しさん:2005/10/25(火) 23:08:31
>>175
アプリケーションと常に対に存在する必要のあるデータなら、インストール時に確定すればいい。
設定ファイルのようにプログラム中で書き込むような場合は各ユーザのホームにでも書けばいい。
いずれにしろ、アプリケーションのある場所を動的に確保するような設計は望ましくない。
180175:2005/10/26(水) 02:07:50
>>177-179
ありがとうございます。
インストール時に決定するというのは目から鱗でした。
また、確かにデータを My Documents や Common Files に書き込むアプリもありますね。
スレ違いにもかかわらず、ありがとうございました。
181デフォルトの名無しさん:2005/10/26(水) 09:12:16
>>180
むしろ、ユーザ毎の「Application Data」に入れる方がいいんでない?
182デフォルトの名無しさん:2005/10/26(水) 15:17:40
c言語って累乗計算はpow関数ですよね。
BASICの2^1.5みたいに簡単な表現ってできないんですか?
183デフォルトの名無しさん:2005/10/26(水) 15:24:26
184風来坊:2005/10/26(水) 16:34:37
openglでは光源の数が限られてると聞いたんですが実際何個くらいなんでしょうか??
GLで線光源と面光源を実現したいんですけど・・・
185デフォルトの名無しさん:2005/10/26(水) 16:36:09
>>184
16個
186風来坊:2005/10/26(水) 16:38:00
ありがとうございますた!!
てことは二つとも難しいですかねぇ・・・
187風来坊:2005/10/26(水) 16:40:24
あ、板間違ってました・・・申し訳m(__)m
188デフォルトの名無しさん:2005/10/26(水) 16:50:20
2〜100までの数字で素数を表示するプログラムを授業の課題でC言語を作るように言われたんですが、
ヒントをベースにして次まで作って見たんですが…

#include<stdio.h>
#include<math.h>
main()
{
int a,i,flag;

for(a=2 ; a<=100 ;a++){


flag=0;
for(i=2 ;i<=a-1;i++){
if( (a%i) == 0 ){;
flag=1;
break;
}
}

}

if(flag){
printf("%d is a prime number.\n",a);

最後から二行目の if(flag〜)の〜に何か付け加えないと
うまくプログラムが働いてくれないのですが…
何を入れればよいか全く分かりません…。
教えてください。
189デフォルトの名無しさん:2005/10/26(水) 16:53:24
>>188
宿題スレでやれ
190デフォルトの名無しさん:2005/10/26(水) 16:56:33
すみません。了解しました
191172:2005/10/26(水) 19:54:19
>>173-174
ありがとうございました。
192デフォルトの名無しさん:2005/10/26(水) 23:09:52
インクルードファイル stdio.hをオープンできない。
警告 W8065 sample.c 5 :プロトタイプ宣言のない関数 printf の呼び出し(関数 main)


と出てきたのですが、どうすればなおるかわかる方いませんか?
193デフォルトの名無しさん:2005/10/26(水) 23:12:23
>>192
Bccを使っているのならおそらくbcc32.cfgが適切な内容でない。
あるいは<stdio.h>のインクルードが正しく書かれていない。
194デフォルトの名無しさん:2005/10/26(水) 23:39:14
>>192
コンパイラを変えろ
195デフォルトの名無しさん:2005/10/26(水) 23:47:05
>>193
まじ感謝!!!
俺あほだからすんげぇ時間かかって最後の難関だった。
ほんとありがとう!
196デフォルトの名無しさん:2005/10/27(木) 11:19:49
すいません、お助け下さい…

LinuxでC言語を扱ってます。ソケットを使ってプロセス間通信を行っているのですが、
タイムアウトの設定方法が解りません。
ファイルディスクリプタを使用してRead・Writeを行っているのですが、
サーバ側でWriteの必要が無い間、クライアントがReadでブロックしない様にする為に
タイムアウトを設定したいのです。

ネット上を探しても今一ぴんと来るものが無かったもので…
どうぞご助力下さいませ…
197デフォルトの名無しさん:2005/10/27(木) 11:38:08
198デフォルトの名無しさん:2005/10/27(木) 13:03:23
要素の個数が不定である配列を読み込んで、
その中から最大の要素と最小の要素を発見する場合、どうすればいいんでしょうか。

もし個数が決まっていれば、forとかでその個数までで考えればできるというのはわかるのですが、
個数が不定の場合、どうやって存在する個数までで打ち切るかがわかりません。
199デフォルトの名無しさん:2005/10/27(木) 13:20:09
>>198
何がわかっていないかをわかっていない事を如実に示した質問だな。
まず「存在する個数を取得する方法」の有無を示してもらわないと回答不能だ
200デフォルトの名無しさん:2005/10/27(木) 13:23:03
>>198
番兵おくしかないだろ
201デフォルトの名無しさん:2005/10/27(木) 13:32:16
存在する個数を取得する方法は、私にはわかりません。
その配列の末端の要素が常に一致(例えば-1になる)するとかいうわけでもなく、常にバラバラです。
おまけに個数もバラバラなので、どうも無理なんじゃないかと勝手に結論付けつつあるのですが、
何分まだ知識が少ないものではっきりとは判断しかねます…。

>>200
ぐぐってみましたが、番兵とは上に書いたような手法で判断する方法ってことで大体良いでしょうか。
そうでない場合においては、要素の個数の取得は不可能なのでしょうか。
202デフォルトの名無しさん:2005/10/27(木) 13:35:26
>>201
配列と言うがそのデータはどこにあるのか?
203デフォルトの名無しさん:2005/10/27(木) 13:40:44
配列はいつもみんなの心の中にあります!^^
204200:2005/10/27(木) 13:53:55
>>201
番兵についてはそうだよ。

要素の個数が不定である配列ってのをちょっとCで書いてみ。
205デフォルトの名無しさん:2005/10/27(木) 14:03:42
配列やめてリンクリスト使えばいい。
206デフォルトの名無しさん:2005/10/27(木) 14:17:38
>>198
個数を貰うか、終端を判断できるI/Fを設け、
個数が判る様にしなければ無理。
207まだ見てるかな?:2005/10/27(木) 14:48:55
>>167
ヒント:変数wへのアクセスが十分に理解できていない。

【問題1】 printf(" %s ", w[1][0] );/*これは、うまく”m”が出ない。プログラムが止まる*/

 このソースでw[1][0]は、char* w[1]("mon")の[0]なので、char型の'm'を指している。
 この'm'の値(文字コード値)をそのままprintf関数へ渡しているので、アウト!

 ※ printf( " %s ", 'm'の文字コード ); と解釈されてしまうため

 "mon"を表示させたく、w[1][0]を指すポインタ値としてアドレスを渡すには、
 printf(" %s ", &(w[1][0]) ); と記述する。


【問題2】 printf(" %s ", *(w[1]+1) );/*これも、うまく”o”が出ない。プログラムが止まる*/

 これもchar型の'o'をそのまま文字コード値としてprintf関数へ渡しているので、アウト!

 "on"を表示させたく、アドレスを渡すには、printf(" %s ", w[1]+1 ); と記述すればOK。

P.S.
 あとwを初期化する部分の"sat"の後ろのカンマは念のため消しておきましょう。
208196:2005/10/27(木) 15:39:56
>>197 返信ありがとうございます。
やはりそこでしたか…一度目を通したのですが、少々理解に苦しみまして(汗)

int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
恐らくこれを使うのだとは思います。頂いたURLを見る限り、
「s」にはソケットのディスクリプタを、「level」は指示された通りSOL_SOCKETを。
「optname」にはSO_RCVTIMEOを入れるのは解るのですが、後ろ2つが解りません。

感覚的にはvalにこの場合タイムアウト長を設定した変数アドレスかな?
と思うのですが、一番最後は本当に何を入れたら良いのか…
試してみるにも見当自体つけられない有様でして、面目ないです。

もし宜しければ、簡単にでも教えて頂けませんか?
209デフォルトの名無しさん:2005/10/27(木) 15:43:33
2つの整数m、nについてのプログラミングで
m>nならばmとnを交換する
m←m-n
m=0であればアルゴリズムを終了する このときnが最大公約数であるみたいなプログラム組んでもらえませんか?
210デフォルトの名無しさん:2005/10/27(木) 15:44:27
>>209
それは質問ではなく課題やってくれってことだろ
スレ違い
211デフォルトの名無しさん:2005/10/27(木) 16:05:25
C言語を1から始めようと思っています。
プログラミングに関しては全くの素人です。

これからC言語を始める初心者にお勧めの本がありましたら、
是非教えて下さい。
よろしくお願いします。
212デフォルトの名無しさん:2005/10/27(木) 16:37:03
>>211
最近のはよく知らないけど、入門C言語あたりかな。
古いK&R本は勘違いなまま覚える危険がある。

どこかWebで良い参考書がダウンロードできてたんだが、失念。
213197:2005/10/27(木) 17:00:24
>>208
struct timeval tv;
tv.tv_sec = 10; // 10sec
tv.tv_usec = 0; // 0μsec

// タイムアウトを10秒に設定
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));


これで分かるよね?
214デフォルトの名無しさん:2005/10/27(木) 17:01:02
>>211
「明解C言語 入門編」がオススメ。
初心者向けで凄く分かりやすい。
踏み台としては最適じゃなかろうか。
215デフォルトの名無しさん:2005/10/27(木) 17:18:36
柴田望洋か
216デフォルトの名無しさん:2005/10/27(木) 17:22:46
何か恨みでも?
217デフォルトの名無しさん:2005/10/27(木) 17:23:59
>>216
何か恨みでも?
218デフォルトの名無しさん:2005/10/27(木) 17:32:17
C++で質問です。

引数つきのコンストラクタを持つクラス
class A
{
A(int);
};
を、別のクラスのメンバ変数として持つとき、
class B
{
A a;
};
引数はどのようにして渡せばいいのでしょうか?

219デフォルトの名無しさん:2005/10/27(木) 17:41:15
>>218
Bのコンストラクタで初期化リストを使う。

B(int n) : a(n)
220デフォルトの名無しさん:2005/10/27(木) 18:11:24
なんにせよスレ違い
221218:2005/10/27(木) 19:15:08
>>219
ありがとうございました
>>220
質問だったのでここでよいと思ったのですが…
失礼しました。
222デフォルトの名無しさん:2005/10/27(木) 19:31:11
CとC++の区別もつかんとは
223196:2005/10/28(金) 09:18:51
>>197 日付を挟みまして報告です。
当然ですが、動きました〜ありがとうございます!
条件分岐でReadの返り値が-1の時はソケット読みをbreakする様にしたので解決です。

ありがとうございます、助かりました。これからtimevalの中覗いて来ようと思います。

>>211
参考書を買う前に、サイトで学ぶ手もある気もします(本は有った方が当然良いですが。
○でもわかるプログラミング、ってサイト様があるんですが…言って良いのかな?(; ̄- ̄)
224デフォルトの名無しさん:2005/10/28(金) 13:09:53
>>223
書いても良いけど、サイトで見て理解できる奴はすでにぐぐって見つけてると思う
ようするにこういうところで「初心者です。本教えてください」ってのは本のような紙媒体から始めないとしっくり来ない奴ら
225デフォルトの名無しさん:2005/10/28(金) 19:38:53
C言語入門インターネット版(初心者にお勧め)
ttp://homepage1.nifty.com/toshio-k/
猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/
BirdPort
http://www.birdport.jp/
結構、C言語を解説してるサイトがあるんだよね。
226デフォルトの名無しさん:2005/10/28(金) 22:30:09
すいません、malloc()ってどういう場面で使うんでしょうか?
初心者なんですが、メモリを確保しても使うような場面が見当たりません
227デフォルトの名無しさん:2005/10/28(金) 22:45:24
>>226
必要な場面がくるまで使わなくていいですよ
228デフォルトの名無しさん:2005/10/28(金) 22:47:45
>>227
ありがとうございます
229デフォルトの名無しさん:2005/10/29(土) 14:38:09
>>226
固定の配列だけでは"にっちもさっちも"いかなくなったら使う羽目になるよ。

ある時はbuf[20]、ある時はbuf[2048]、そしてある時はbuf[????]のように
実行時にbufサイズを決めないといけない場合に使う。
230デフォルトの名無しさん:2005/10/29(土) 16:24:26
>>229
たとえば要素数Nが変化する配列が欲しくなったら
buf = (char *) malloc(sizeof(char)*N)
のようにするってことでしょうか?
231デフォルトの名無しさん:2005/10/29(土) 16:45:05
>>230
どうでもいいが、sizeof(char)と書くのは不条理。
232デフォルトの名無しさん:2005/10/29(土) 19:47:46
>>230
そんな感じ。
あと固定でも巨大配列が一時的に必要な場合、スタック領域からでなくヒープ領域
から確保する場合にも使うね。

int func_1( void )
{
  int buf[1024][1024]; // スタック領域やばす!の判定がアプリでは原則ムリ orz
      ・
      ・
      ・
  return OK;
}

int func_2( void )
{
  int **buf; // ヒープ領域から確保するYO。ワクワク

  buf = (int**)malloc( sizeof(int) * 1024 * 1024 );
  if ( buf == NULL )
    return ERR;  // ヒープ領域やばす!

      ・     // 大丈夫ダッタ (・∀・)
      ・
      ・
  free( buf );
  return OK;
}
233デフォルトの名無しさん:2005/10/31(月) 00:39:09
なんつーか、C言語の練習してる風景がわかんない。
例えば、エディタ(ひでまる)とVisual C++でC言語練習しようと
してるけど。

秀丸でソース書いて、VisualC++で開いてコンパイル→実行でやっとソースを動かせるんでしょ。
もっと簡単にできるやりかたあったよね。たしか。
エディタはVisualC++にもあるけど、秀丸の方が使いやすいんだっけな?
234デフォルトの名無しさん:2005/10/31(月) 00:42:02
Visual C++は背景を簡単に黒にできないから、目痛いし。(背景黒にできるが文字の色もいっぺんにかわらない)
26才になろうとしてるけど、今からC言語でも覚えようとしてるよ。一般教養に。そのうち使えれば便利だと思って。
235デフォルトの名無しさん:2005/10/31(月) 00:45:41
プロの人とかってどういう環境でプログラミングしてるのかな。ウィンドウとか。配色とか。フォントとか。
ってか、プログラミング以前の問題ですけど。。
236デフォルトの名無しさん:2005/10/31(月) 01:23:06
>copy con hoge.c
237デフォルトの名無しさん:2005/10/31(月) 01:43:35
>>235
俺がプロでやってた頃、UNIXではターミナルでviかemacsだけ。
DOS環境ではFILMTNやFDにVZエディタ、コンパイルツールを組み合わせて
擬似IDE(統合開発環境)化していた。そしてWindowsNT3.1ではVCが今一つで
Borland C/C++ 4.0が便利に使えるレベルだったな。エディタだけは秀丸。

そのころのエディタの設定は、背景色:紺、文字色:白or黄、タブ:4文字。
ただVZエディタは行数の多いソースを書き出すと、テキストの一部を欠損する
致命傷があった。以降はずーっとWindowsで秀丸ユーザです。
238デフォルトの名無しさん:2005/10/31(月) 12:57:50
>>235
> ウィンドウとか。配色とか。フォントとか。

そんなもの、個人の趣味の領域でプロ/アマ関係ないだろ。
そもそも、それはプログラミングの環境じゃないし。
239デフォルトの名無しさん:2005/10/31(月) 13:37:22
VZエディタの使いやすさは革命的だったな・・・
Windows環境に移行してからもしばらくはVZ使ってたよ。
240点・点・点」:2005/10/31(月) 14:20:05
JAVAにはJADといわれる逆コンパイラがありますが、
Cにはありますでしょうか?
241デフォルトの名無しさん:2005/10/31(月) 14:25:04
いくつか存在はしますが、実用的な物はありません。
242点・点・点」:2005/10/31(月) 14:30:44
ありがとうございます。
例えばどのようなものでしょうか。
日本語対応版はありますでしょうか。
243点・点・点:2005/10/31(月) 15:45:30
stdbool.hをインクルードしたいのですが、
使うためのライブラリはどこにありますでしょうか。
http://www.delorie.com/pub/djgpp/current/v2gnu/gcc342s.zip
こちらにはありませんでした。
244点・点・点:2005/10/31(月) 16:09:43
http://ip-sol.jp/download/spartan2/h8devel_src/gcc-3.4.0/gcc/ginclude/
ここにありました。
しかし、下記のような結果がでてコンパイルがとおりません。
エラー E2141 VOLID.C 36: 宣言の構文エラー

下記のような記述をしました。
#include <stdbool.h>

bool Flg;

ソフトは borland のフリーのBorland C++ 5.5です。

落としてきたファイルは、
同ソフトの Includeフォルダ に格納しました。
245デフォルトの名無しさん:2005/10/31(月) 17:54:43
ポインタとアドレスの違いがわからない
246点・点・点:2005/10/31(月) 18:17:16
stdbool.hの中身は下記です。
#ifndef _STDBOOL_H
#define _STDBOOL_H

#ifndef __cplusplus

#define bool_Bool
#define true1
#define false0

#else /* __cplusplus */

/* Supporting <stdbool.h> in C++ is a GCC extension. */
#define _Boolbool
#define boolbool
#define falsefalse
#define truetrue

#endif /* __cplusplus */

/* Signal that all the definitions are present. */
#define __bool_true_false_are_defined1

#endif/* stdbool.h */
247デフォルトの名無しさん:2005/10/31(月) 18:39:21
プリプロセッサでコンパイル範囲を限定させたいのですが、
*.cファイル中ではプリプロセッサは効かないんでしょうか?
そうだとしたら*.hに実装も含めなくてはいけないんでしょうか?
よろしくです。
248247:2005/10/31(月) 18:40:20
続き...
#pragma message(">>test.c\n")の部分が出力されません…。

// main.c
#define DEFINED
#include "test.h"
int main(void) { return 0; }
249247:2005/10/31(月) 18:40:55
続き...
// test.h
#ifndef __DEFINE_TEST_H__
#define __DEFINE_TEST_H__
#ifdef DEFINED
#pragma message(">>test.h\n")
#endif
#endif

// test.c
#include "test.h"
#ifdef DEFINED
#pragma message(">>test.c\n")
#endif
250デフォルトの名無しさん:2005/10/31(月) 18:43:23
「ヘッダー」の意味を調べてこいや
251デフォルトの名無しさん:2005/10/31(月) 18:52:37
zip32j.dllを使用して圧縮するだけのちょっとしたプログラムを書いているのですが
圧縮するファイル名に[]が含まれているとき圧縮に失敗してしまいます
よろしければ回避方法をご教授ください
252247:2005/10/31(月) 19:03:33
>>250
ファイル間で共有される定義や宣言を記述するファイルですよね?
まだ他に重要な意味があるんでしょうがまだ初めて間もないので
もしよかったら今回の質問に関係する所だけでも教えてもらえませんか?
253デフォルトの名無しさん:2005/10/31(月) 21:55:43
>>244
#define bool _Bool
をtypedef char _Bool;か何かに書き換えてみろ。
BorlandはC99非対応だから_Bool型は存在しない。

そもそも拡張子cppでコンパイルすればstdbool.hなんて要らないよ。
254233:2005/10/31(月) 23:45:26
秀丸とVC++だとどうやって連携するのだか。
まえできたけど、今ググッてもわからないんだよね。

気軽にプログラム書ける環境教えてください。
255デフォルトの名無しさん:2005/11/01(火) 00:54:25
>>254
cygwin+xyzzy
或いは
linux+mule
256デフォルトの名無しさん:2005/11/01(火) 00:55:26
あ?mule?
257点・点・点:2005/11/01(火) 10:04:28
>>253
ありがとうございました。
出来ました。
258デフォルトの名無しさん:2005/11/01(火) 11:45:10
あ、Meadow
259点・点・点:2005/11/01(火) 15:27:59
突然ですが、ボリュームシリアルを書き換える方法はありますでしょうか。
260デフォルトの名無しさん:2005/11/01(火) 16:06:49
>>259
ボリュームシリアルとは何でしょうか。
261点・点・点:2005/11/01(火) 16:10:03
>>260
フォーマットされたディスクに自動的に付加される番号です。
262デフォルトの名無しさん:2005/11/01(火) 16:33:39
>>261
それは書き換えられるかもしれませんし書き換えられないかもしれません。
少なくとも、ボリュームシリアルと言う概念のないOSでは書き換えられません。
263点・点・点:2005/11/01(火) 16:46:24
MS-DOS Ver.4 以降のOSになります。
Windowsでもフォーマットされたドライブには付加されます。
264デフォルトの名無しさん:2005/11/01(火) 16:59:28
BCPadを利用してCを学んでいるのですが、ちょっと躓いてしまったところが出てきたので、教えてください。

二次元配列を用意し、それをソートするだけのプログラムなんですが、
なんかうまいこと動作しません。

/* -- ソース -- */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXDATA 3
#define MAXSTR 256
int cmp(const char * , const char *);

int main(void){
char (*data)[MAXSTR];
int i;

data = malloc(sizeof(*data) * MAXDATA);

for(i = 0 ; i < MAXDATA ; i++)
printf("%d人目の名前 -> " , i + 1);  scanf("%s" , data[i]);

qsort(data , MAXDATA , sizeof(char *) , (int(*)(const void * , const void *))cmp);

for(i = 0 ; i < MAXDATA ; i++)printf("%s\n" , data[i]);

return 0;
}
int cmp(const char *s1 , const char *s2){
return strcmp(s2 , s1);
}
265デフォルトの名無しさん:2005/11/01(火) 17:00:25
>>263
MS-DOS/Windowsの話なら、MSDNを「ボリューム シリアル」で検索すればすむ話だとは思いませんか?
266デフォルトの名無しさん:2005/11/01(火) 17:02:42
>>264
それは二次元配列ではなく、ポインタの配列にしかなっていませんね。
また、qsort()呼び出し時にキャストするのではなく、関数の型はqsort()の仕様にあわせ、
関数内でポインタをキャストした方が毎回キャストしないですむので適当だと思われます。
267点・点・点:2005/11/01(火) 17:10:35
>>265
しらべたのですが、
VC++にはボリュームラベルを書き換える関数しかありませんでした。
Cで出来るようですが、やり方が分かりません。
268デフォルトの名無しさん:2005/11/01(火) 17:26:58
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXDATA 3
#define MAXSTR 256
int cmp(const void * , const void *);

int main(void){
char data[MAXDATA][MAXSTR];
int i;

for(i = 0 ; i < MAXDATA ; i++)
printf("%d人目の名前 -> " , i + 1);  scanf("%s" , data[i]);

qsort(data , MAXDATA , sizeof(char *) , (int(*)(const void * , const void *))cmp);

for(i = 0 ; i < MAXDATA ; i++)printf("%s\n" , data[i]);

return 0;
}
int cmp(const void *s1 , const void *s2){
return strcmp(*(char **)s2 , *(char **)s1);
}

このように変更してみましたが、やっぱりうまく動きません・・・。
qsortの比較関数を最初のままにし、二次元配列の宣言をこの状態にしたときには、
なぜかdata[0]の中身が変化してしまいました・・・。
269デフォルトの名無しさん:2005/11/01(火) 17:54:33
>>268
だからqsort()の呼び出してキャストするなって。
で、配列の配列とポインタの配列の区別がついていないようだからその辺りを勉強汁。
構造体は判るのかな?
それなら、struct foo {char data[MAXSTR];} data[MAXDATA];とでもしてソートしたら?
270デフォルトの名無しさん:2005/11/01(火) 18:06:28
>>245
> ポインタとアドレスの違いがわからない

ポインタ = アドレス(ポイント)を指すという意味
ポインタ変数 = (他の変数などの)アドレスを指す変数
アドレス = メモリ上にある変数の場所を示す番地のこと

char ch;  // これはchar型変数のch。変数chのアドレスは&chで表す。
char* pch; // 他のchar型変数のアドレスを指すポインタ変数pch。
       // これに他のchar型変数のアドレスを代入してから使う。
       // 例
       //  pch = &ch;
       //
       // アドレス代入後にポインタ先の値を*pchとして参照する。
       // 例
       //  *pch = '\n';
       //
       // あとは*pchをchar型変数chのように扱える。
       //

int val;   // int型変数のval。変数valのアドレスは&valで表す。
int* pval;  // 他のint型変数のアドレスを指すポインタ変数pval。
       // これに他のint型変数のアドレスを代入してから使う。
       // 例
       //  pval = &val;
       //
       // アドレス代入後にポインタ先の値を*pvalとして参照する。
       // 例
       //  *pval = 65535;
       //
       // あとは*pvalをint型変数valのように扱える。
       //
271デフォルトの名無しさん:2005/11/01(火) 18:45:04
本当に初心者なんですけど、VC++.NETのMFC使ってますが構築コードを追加って何をすればいいんですか?
272デフォルトの名無しさん:2005/11/01(火) 18:56:07
あなたのしたいことを書けばよいのです。
273デフォルトの名無しさん:2005/11/01(火) 20:23:46
>>264
cmp関数は要らんと思う
ポインタ無しでforでグルグル回せばソートできると思うが
274デフォルトの名無しさん:2005/11/01(火) 21:12:07
>>268
せめて期待する動作くらい書こうな。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXDATA 3
#define MAXSTR 256
int cmp(const void * , const void *);

int main(void){
char data[MAXDATA][MAXSTR];
int i;

for(i = 0 ; i < MAXDATA ; i++) {
printf("%d人目の名前 -> " , i + 1);
scanf("%s" , data[i]);
}

qsort(data, MAXDATA, MAXSTR, cmp);

for(i = 0 ; i < MAXDATA ; i++) printf("%s\n" , data[i]);
return 0;
}
int cmp(const void *s1 , const void *s2)
{
return strcmp((char *)s2, (char *)s1);
}
275デフォルトの名無しさん:2005/11/01(火) 21:58:58
>>259
ブートセクタの内容
http://www.fdi.fujitsu.com/products/eFILE/j1_4.html

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpfileio/html/_win32_getvolumeinformation.asp
GetVolumeInformation
LPDWORD lpVolumeSerialNumber, // ボリュームのシリアル番号

デジタルコピーの著作権保護に使われるということなので、
もし変更すれば著作権がらみのファイルはコピーとみなされ、
開けなくなることになりますね。

276デフォルトの名無しさん:2005/11/01(火) 23:30:24
>>266
>>264のは「配列へのポインタ」

>>268
既に答えは出ているが、qsortの第3パラメータが間違っている。
277デフォルトの名無しさん:2005/11/02(水) 09:18:55
>>270
> ポインタ = アドレス(ポイント)を指すという意味
> ポインタ変数 = (他の変数などの)アドレスを指す変数
> アドレス = メモリ上にある変数の場所を示す番地のこと

いい加減な事言うな。


ポインタ:プログラム上で使用するオブジェクト(変数など)を指し示す値
ポインタ変数:ポインタ値を格納する為のオブジェクト
メモリアドレス:記憶領域上の位置を示す値

# ちなみに、ポインタ値=アドレス値ではない
278デフォルトの名無しさん:2005/11/02(水) 10:25:24
ポインタとポインタ変数とポインタ値とアドレスってごっちゃだよね
概念さえわかってればそんなにいきりたって区別するほどのもんでもないと思うけど
279デフォルトの名無しさん:2005/11/02(水) 14:00:52
この流れに便乗して聞いてみる。

いまいちqsort関数の引数があやふやなんだ。
第三引数に指定するのは、sizeofで求めるやつじゃないのか?

配列の型によって様々な表記をしてるから、理解するのが難しい・・・
280デフォルトの名無しさん:2005/11/02(水) 14:31:14
>>277
そこまできたら何で直接ポインタと間接ポインタの説明をしないのか?
ついでにハンドルなんかも教えてやりゃ良いのに
281デフォルトの名無しさん:2005/11/02(水) 15:24:15
main.exe - C:\DOCUME~1\*****\LOCALS~1\Temp\run.bat
NTVDM CPU は不正命令を検出しました。
とコンパイルしようとすると出ます。誰かげんいんがわかるかたいますか? 
282270:2005/11/02(水) 15:31:14
>>277
> いい加減な事言うな。
それ、ほぼ同じことを言い換えてるだけにしか思えないが、変数とオブジェクトってどう違うの?

ポインタ = アドレス(ポイント)を指すという意味 = プログラム上で使用するオブジェクト(変数など)を指し示す値
ポインタ変数 = (他の変数などの)アドレスを指す変数 = ポインタ値を格納する為のオブジェクト
アドレス = メモリ上にある変数の場所を示す番地のこと = 記憶領域上の位置を示す値

> # ちなみに、ポインタ値=アドレス値ではない
ポインタ=アドレス ではないが、C言語ではポインタが持つ値としてアドレス値に限定ではないか?

>>280
それじゃ277に代わって・・・
ハンドルは、平たく言うと特定の処理システム内で規定されたルールによって割り
振られた値でして、それをプログラム内で識別や参照に用いる方法ですな。
だからハンドルの値そのものは、ただユニークに割り振られた番号だったり、或る
ハッシュ値そのものだったり、ポインタのようにアドレス値だったりもする。
ポインタのように言語仕様の規定で決められているのではなく、多くはライブラリの
仕様として決められているのが違いかな。
283デフォルトの名無しさん:2005/11/02(水) 15:51:33
>>282
> ほぼ同じことを言い換えてるだけにしか思えないが

明らかに違うだろ。


> C言語ではポインタが持つ値としてアドレス値に限定ではないか?

オフセットの場合もあるし、Windowsだと仮想アドレスだったりする。
284デフォルトの名無しさん:2005/11/02(水) 16:08:07
> オフセットの場合もあるし、Windowsだと仮想アドレスだったりする。
それがアドレスでそ?

アドレスという言葉の意味をすごーく狭く解釈していない?
285デフォルトの名無しさん:2005/11/02(水) 17:11:27
こういう人は定義がだーい好きなんだよ

>Windowsだと仮想アドレスだったりする。
(´・∀・`)ヘー
286デフォルトの名無しさん:2005/11/02(水) 17:37:22
Win32アプリならフラットメモリモデルを使っているので仮想アドレスでなく、セグメント内での仮想メモリの位置を表すオフセットアドレス
あとそもそもx86アーキテクチャにおいてレジスタ1本で物理アドレスを指定ことは出来ない
287デフォルトの名無しさん:2005/11/02(水) 18:11:57
WindowsでC言語使ってどれぐらいの範囲のアドレスにアクセスできるの?
そのプログラム内で確保したメモリだけ?
288デフォルトの名無しさん:2005/11/02(水) 18:41:04
windowsというより、むしろ、x86プロセッサ自体が、
リアルモードからプロテクトモードに移るとリアルモードには戻れない。
これが何を意味するかというと、windows上で動くプログラムのアドレスは、
基本的に、論理アドレスだということ。
基本的に、というのは、抜け道もあるということ、デバイスドライバとか
289デフォルトの名無しさん:2005/11/02(水) 18:58:12
>287
Windowsがメモリ管理しているから、積んでるメモリで決まると思うんだけど。
足りなければ、Windowsが仮想メモリ使ってくれるか、マが仮想メモリを確保もできるでしょう。
ただ、Lattice-CとかのDOSプログラミングだと1M制限に掛かると思うけど、現在、仮想86モードがどうなっているのか知らない。
290デフォルトの名無しさん:2005/11/02(水) 19:28:17
>>278
じゃなく概念わかって無い奴ほど区別つけられないままなのが間違いの元で…
せっかくオブジェクトという概念で説明できる(してある)のに、
わざわざアドレスとか混同する必要も無いわな。
(オブジェクトと変数も混同するなよな)
object: region of data storage in the execution environment,
the contents of which can represenvalues

>C言語ではポインタが持つ値としてアドレス値に限定ではないか?
古のワードマシン(?ワード境界にないバイト境界からはアクセスできない)
での実装で word境界のポインタ値 2Nの次の値が 2N+1じゃなかったりするのも
あったなあ。例外が発生するような特殊な印(?tag)付だったか、
まあそんなものまでアドレスと強弁してもしょうがなかろうし。
291デフォルトの名無しさん:2005/11/02(水) 20:37:31
>>288
x86でもプロテクトモードからリアルモードへ戻れますよ。(戻れないのは286だけ)
292デフォルトの名無しさん:2005/11/02(水) 21:25:34
286はリセット回路使うんだっけ?
293デフォルトの名無しさん:2005/11/02(水) 21:31:06
>>292
それ、良く覚えてたねw
リセットして切り替えるから、コンテキストも外部で自己管理という・・・
無駄にコストの掛かる方法だったな。

ってアーキテクチャはスレ違いだ。
294デフォルトの名無しさん:2005/11/02(水) 21:51:11
>291
特権レベルによってWINDOWSがメモリ管理してるから、
プロテクトモードからリアルモードにするドライバの中でOS落としてやらないと無理(OSが正常に動かない)と思うんですけど、違ってたらごめんなさい
あと、特権命令については、ぶつかるかどうかの要因としては、関係ないと思います
295デフォルトの名無しさん:2005/11/02(水) 21:59:53
>>294
Windowsの中からリアルモードに行こうと考えているとは思わなかった。
俺はDOSへ戻る16bit Windowsの終了とかを考えていた。
296デフォルトの名無しさん:2005/11/02(水) 22:04:54
>295
なるほど。
それなら、一昔前(いや二、三昔)のパソコンなら普通に使ってましたね。
たしかにw
297デフォルトの名無しさん:2005/11/02(水) 22:46:12
ポインタ値ってなに?
298デフォルトの名無しさん:2005/11/02(水) 23:05:30
>>297
ポインタ型になっている値。
299デフォルトの名無しさん:2005/11/02(水) 23:09:54
intでキャストとかすればintになんのかな。試すか。
300デフォルトの名無しさん:2005/11/03(木) 00:27:05
FreeBSD5.4のccまたはgccで
コンパイルすると
○ printf("aiueo");
× printf("あいうえお");
なんですけど
どうしたら日本語もできるようになりますか?
301デフォルトの名無しさん:2005/11/03(木) 00:36:24
お前は俺を怒らせた
302デフォルトの名無しさん:2005/11/03(木) 00:45:23
#include <stdio.h>

int main(void){
int i;
double d;
i=1; //平気
i=&i; //怒られる
d=i; //平気
return 0;
}

なぜ?
303デフォルトの名無しさん:2005/11/03(木) 01:39:57
K&Rなら誰も怒れない
304デフォルトの名無しさん:2005/11/03(木) 02:15:31
>>302
ポインタ値と整数値は相互代入可能でないから、キャストで無理やり変えるか何かしないとダメ
305デフォルトの名無しさん:2005/11/03(木) 08:06:52
関数strcpyの定義例を読んでいて不思議に思ったのですが、
なぜコピー先の位置を保存しなければならないんでしょうか。

// strcpy
int strcpy(const char *s1 , const char *s2){
char *p = s1; // 位置保存
while(*p++ = *s2++);
return *s1;
}

ちょっとうろ覚えなので、あってるかどうかは自信がないですけど・・・
306デフォルトの名無しさん:2005/11/03(木) 08:15:41
>>305
最後にreturn s1;としている。
strcpy()は最初の引数を返すと定められている。
307デフォルトの名無しさん:2005/11/03(木) 10:20:22
>>305
保存といいながらpを使ってs1を使ってないから、温存というよね?

でもって返すのはchar *
308デフォルトの名無しさん:2005/11/03(木) 20:00:54
C言語で文字列処理を極めようと勉強するのと、とっととC++に移行するのは
どちらがオススメですか?
309デフォルトの名無しさん:2005/11/03(木) 20:22:52
>>308
フランス語とドイツ語を比べるようなものだ
310デフォルトの名無しさん:2005/11/03(木) 21:01:35
>>308
東北弁と茨城弁を比べているようだ
311デフォルトの名無しさん:2005/11/03(木) 21:13:03
>>308
極めるとまでは行かなくとも、
人並みにポインタを使いこなせるようになるくらいはCをやった方がいいと思う。
312デフォルトの名無しさん:2005/11/04(金) 01:43:03
ポインタがNULLか否か調べる際、
NULLをポインタの型に合わせてキャストするべきですか?

つまりこんな風に
  char *buf;
  buf = (char *)malloc(num);
→ if (buf == (char *)NULL)
    return;

また、returnでNULLを返す場合はどうすべきですか?
313デフォルトの名無しさん:2005/11/04(金) 01:50:31
前者
すべきでない。
後者
素直にNULLを返せ。
314312:2005/11/04(金) 02:02:47
>>313
分かりました。即レスありがとうございます。
315デフォルトの名無しさん:2005/11/04(金) 02:04:12
コンパイルは出来たのに、実行したら何も表示されないのはどのような原因が考えられるでしょうか?
○○が原因で、○○.exe にエラーが生じましたとなるのですが。
3次元問題を差分法で解くために、時間と含めて4次元配列をつくりましたが、メモリのことも考慮して、時間の配列要素は2つにしました。
つまり3次元分の必要メモリ数*2だけのメモリが必要なのですが。。。


316デフォルトの名無しさん:2005/11/04(金) 02:20:29
>>315
氏ねマルチ野郎
317デフォルトの名無しさん:2005/11/04(金) 02:25:32
>>316
すみません。ただ、何か少しでもいい方法がないかと思いまして。。
幾分若輩者でして...
318デフォルトの名無しさん:2005/11/04(金) 02:28:33
一つのスレで質問してるなら答えたのに。
319デフォルトの名無しさん:2005/11/04(金) 02:42:52
>>315
メモリ不足なんじゃない?
アロケートをWindowsAPIでやったら?
320点・点・点:2005/11/04(金) 11:02:11
コンパイルすると、
外部シンボル 'absread(int, int, int, unsigned char)' が未解決
が出てしまいます。どうしてでしょう。
#include <dos.h>は記述してあります。
ちなみに-Wでコンパイルすると、
WinMainが未解決になります。
コンパイラはborland C++ 5.5です。
321デフォルトの名無しさん:2005/11/04(金) 11:57:27
>>320
コンパイルじゃなくて未解決ならリンク時だろ
コンパイルとリンクの違いを勉強して来い
そして、absreadが入っているライブラリファイル(〜.libって名前のファイル)をリンクしろ
322点・点・点:2005/11/04(金) 14:31:17
abswrite、absread という関数はどのようなものでしょうか。
323デフォルトの名無しさん:2005/11/04(金) 14:37:11
情報検定2級おちますた。
何か良い勉強方法ありませんか・・・?
問題用紙下のほうのでかい問題の考え方が
いまいちわからないのですが・・・。
324点・点・点:2005/11/04(金) 15:41:04
関数が、Borland C++ Version 3.1 にあって、
borland C++ 5.5でなくなる、
ことってありますか?
325点・点・点:2005/11/04(金) 15:50:47
例えば、abswrite、absreadという関数。
326デフォルトの名無しさん:2005/11/04(金) 16:10:14
>>324-325
そりゃありえる。
Borland C++ 5.5はWindowsで動くプログラムを作るからDOS用の関数はなくなって当然。
327デフォルトの名無しさん:2005/11/04(金) 16:15:44
>>315
リンカの設定でスタックサイズを大きくしてみたらどうだ。
328点・点・点:2005/11/04(金) 16:18:45
329点・点・点:2005/11/04(金) 17:23:52
>>326

予想通り、関数、古いバージョンにはありました!

下記のサイトにて、Borland C++ Version 3.1 を手に入れました。
http://www.mmg.tu-sofia.bg/bookhtml/web-sites/download.htm
330点・点・点:2005/11/04(金) 18:36:16
しかし、解凍をしてファイルを見ることは出来たのですが、
先ほどから、インストールが出来ません。
installとタイプするように書いてありますが、
うまくいきません。
だいたい、DOSでカレントをどこにおいていいのやら、、。
331デフォルトの名無しさん:2005/11/04(金) 18:40:14
BC++3.1ならDOSかWin3.1上で動かせや
というか、absreadを入れたアプリ使って何するつもりだ?Win95ですら動かないAPIを使って
332yu:2005/11/04(金) 23:03:10
typedef struct t_list
{
struct t_list** g_ptr ;
struct t_list* next_list ;
} T_LIST;

typedef struct c_table
{
struct t_list*compressible_t ;
struct c_table*another_t ;
} C_TABLE ;


と、宣言をした構造体を使っています。
T_LIST型の構造体AからC_TABLE型の構造体へポインタを指定して、
そこから異なる構造体Bを指すように設計しているのですが、
うまく値を参照できません。
g_ptrの型はT_LISTなのでしょうか??

いろいろ調べたんですが、上手くできません。
どなたか、教えて下さい。お願いします
333デフォルトの名無しさん:2005/11/04(金) 23:05:04
>>332
そのg_ptrは何に使おうと思ってるの?
334yu:2005/11/04(金) 23:28:48
>>333さん

レスありがとうございます!
g_ptrが指す対象がいくつあるかわからないので、C_TABLE型のリストを
動的につくって、そこからつなげたいんです。

g_ptrは同じ型の(自分とは違う)構造体を指させたいんです。

335デフォルトの名無しさん:2005/11/04(金) 23:36:31
>>334
どう説明すると判ってもらえるかが難しいんだが、値自体の型とか構造体ってのを別に考えた方が良いな
手っ取り早くやるならvoid *g_ptr;にしてしまうとか
336デフォルトの名無しさん:2005/11/04(金) 23:42:04
Windowsで使えるフリーのプロファイラってないですか?
337yu:2005/11/04(金) 23:44:25
>>335さん

値自体の型とか構造体を別に・・・・・ですか?

でも void *g_ptr だと指定する先がvoid型の物になってしませんか??

338デフォルトの名無しさん:2005/11/04(金) 23:47:49
>>337
vod *は特別で、指している先がどんな型か問われない(== どんなものでも指せる)ポインタ型ということになっている。
339yu:2005/11/04(金) 23:49:32
>>338さん

そんなんあるんですか?!
初めて知りました・・・・・。

ありがとうございます! これから試してみます
340yu:2005/11/04(金) 23:55:15
>>338さん

'$S1' と 'void' の記述が不正です
(';' で区切られていない可能性があります)。
と出てエラーになってしまいました・・・・。

構造体ではポインタのポインタなので
指定する先の型をT_LISTとしていますが、
直接指定しているのはC_TABLEなので
そこは修正すべきなんでしょうか??
341デフォルトの名無しさん:2005/11/05(土) 02:55:16
質問です!

stdio.h や stdlib.h をインクルードしていなくても
rand() で呼び出せるこの rand() 関数はどこで定義されているんですか?
342デフォルトの名無しさん:2005/11/05(土) 08:54:24
>>341
Cでは(プロトタイプ)宣言無しでも関数を呼び出すコードは書ける。
後はその関数の実体をリンクすればいい。
勿論、一部を除いて標準関数は暗黙的にリンクさせる。
343デフォルトの名無しさん:2005/11/05(土) 13:49:04
割れ鍋にとじぶた
344デフォルトの名無しさん:2005/11/05(土) 18:23:52
マイク入力から音階、音量読み取って画像をそれに連動させろって言われても…
教授のぶぉけ(;o;)))))))))
345デフォルトの名無しさん:2005/11/05(土) 18:26:15
FFTのライブラリをどこぞから持ってくればすぐ作れるぞ
346デフォルトの名無しさん:2005/11/05(土) 23:46:11
while (scanf("%d", &int1) != 1) {
hoge...
}

こんな感じで有効な入力がなされるまで受けるようにしたいんですが
最初になされた無効な入力がstdinに残っているため無限ループに陥ってしまいます
fflush(stdin)やrewind(stdin)で自分なりにやっては見たのですが上手くいきません
どなたかご教示願います
347デフォルトの名無しさん:2005/11/05(土) 23:58:50
>>346
たとえばscanf("%*s");で次の空白類文字まで読み捨てられる。
ほかにはscanf("%*[^\n]%*c");で改行文字までを読み捨てられる。
348デフォルトの名無しさん:2005/11/06(日) 00:02:07
349デフォルトの名無しさん:2005/11/06(日) 00:11:18
>>347-348
レスどうもです
読み飛ばしはすっかり失念してました・・・_| ̄|○
fgets+sscanfも良さそうですね。参考にしてやってみます
350デフォルトの名無しさん:2005/11/06(日) 00:34:17
Webサーバ上で動くCGIをC言語で製作しております。
そこで、サーバ上にあるテキストァイルの中身全部を、ブラウザへ出力したいのですが、どの関数を使うべきなのか判断出来ません。
fgets・fputsか、fread・fwriteのどちらかを使おうと思っているのですが、どちらが良いのでしょうか。
また、fgetc・fputc関数での1文字ずつの入出力ではアクセス速度が低下するのでしょうか。
351デフォルトの名無しさん:2005/11/06(日) 00:36:52
>>350
出力をまとめられる fwrite でいいんでは?
まとめられないなら fputc でも fputs でも使えば?
352デフォルトの名無しさん:2005/11/06(日) 00:37:07
>>350
自分で試せボケ
353デフォルトの名無しさん:2005/11/06(日) 00:38:15
>>352
おまえ優しいな
354デフォルトの名無しさん:2005/11/06(日) 01:14:00
charのポインタ配列について教えてください。

char name[5][30];と宣言したものを
ポインタの配列で別の関数に渡したいとき
p[0] = name[0];
p[1] = name[1];
p[n] = name[n];
のようにポインタの配列に
ひとつずつ代入して、pを渡す?
もっとスマートな方法がありそうな…。
355デフォルトの名無しさん:2005/11/06(日) 01:20:12
void func(char *pname[]);

char name[5][30];
func(name);

こういうこと?
356354:2005/11/06(日) 01:32:36
あれ?そうやって書いてもいいの?
質問の意図はまさにその通りです。
以前その方法でコンパイラに怒られた記憶があったので
だめなのかと思っていました。
もう一度試してみます。
357デフォルトの名無しさん:2005/11/06(日) 01:49:58
1000の2乗とか3乗とかの作り方が分かりません。
(1000)^2とか(1000)^3で実行しても1002とか1003となってしまう。。。
誰か教えてくださいまし。
358デフォルトの名無しさん:2005/11/06(日) 01:53:20
pow()
359354:2005/11/06(日) 02:55:26
やっぱりよくわかりません;;
もしかしてfunc内ではnameの各要素の先頭アドレスは
わからないということですか?
360デフォルトの名無しさん:2005/11/06(日) 03:01:14
>>359
>>355ではないが

char func(char arg[][30])
{
 ...
}

じゃダメ?
361デフォルトの名無しさん:2005/11/06(日) 03:02:16
わかるわけがない
エスパーじゃないんだから
362354:2005/11/06(日) 03:12:38
皆様レスありがとうございます。
どうしてもポインタの配列がほしかったら、どっかで
pname[0] = name[0];
pname[1] = name[1];
pname[n] = name[n];
とかやるの?
363デフォルトの名無しさん:2005/11/06(日) 03:21:36
まず配列の要素数を渡す、ということを導入してみろ
364354:2005/11/06(日) 03:29:02
>>363

func(char *[], int);
のような関数にする、という意味ですか?
365デフォルトの名無しさん:2005/11/06(日) 03:37:44
オウム返しに質問するな!
366デフォルトの名無しさん:2005/11/06(日) 03:41:29
>>362
あー、必要ならやるとも。
でもそういうコードになったら負けかな、と思っている
367デフォルトの名無しさん:2005/11/06(日) 04:56:05
C言語で外部コマンドを実行して、その結果を文字列で受け取るってどんな方法でやるのいいんですか?
例えば、"ls" とか "dir" を実行して、その結果を文字列で得たいんです。
368デフォルトの名無しさん:2005/11/06(日) 09:21:54
>>367
C言語標準ではないが、
ttp://www.ncad.co.jp/~komata/c-kouza3.htm
このあたりを読むと幸せになれるかも。
369367:2005/11/06(日) 12:40:00
>>368
Linux でプログラミングしているので、まさにこの方法でできそうです。
ありがとうございました。
370デフォルトの名無しさん:2005/11/06(日) 20:10:09
Bisonで構築する構文解析器において
標準入力から入力を待ち受けるのではなく
直接文字列を渡すテクニックの概要を教えてください
371デフォルトの名無しさん:2005/11/06(日) 21:31:16
質問です。
負の数に対しても、除算に対する商と余りを正確に出す簡単な方法はないでしょうか。

C言語: -3 / 10 == 0、-3 % 10 == -3
数学: -3 / 10 = -1、-3 % 10 = 7

つまり、数学において除算の余り r は、割る数を x として、
必ず 0 <= r < x となります。

よろしくお願いします。
372デフォルトの名無しさん:2005/11/06(日) 21:35:05
スレの質くらい選べよ
373371:2005/11/06(日) 21:36:42
えと、C の標準関数か何かでそういったものが何かないかな、と思って聞きました。
374デフォルトの名無しさん:2005/11/06(日) 21:44:21
スレの質くらい選べよ
375デフォルトの名無しさん:2005/11/06(日) 22:21:52
>>371
http://seclan.dll.jp/c99d/c99d05.htm#dt19990607
最新のC99ではこのように定められているが、
ほとんどのコンパイラはこのC99に対応していないので、どのような結果になるかは処理系依存。
ちなみに標準関数div()とldiv()が返す商と余りは以前からこのC99の除算・剰余演算子と同じ挙動となるように定められている。

そして数学の定義にどうやって合わせるかに答えられるような高度な話が出来るやつはこのスレにはいない。
376デフォルトの名無しさん:2005/11/06(日) 22:26:45
>>371
0は0
-1は0
-3は111
7は111
2進法に直せばおのずとどうすれば良いかわかるだろ(俺は2進法のアルゴ知らんが)
割られる数が正のとき〜負のとき〜とすれば良いんじゃないかな
377デフォルトの名無しさん:2005/11/06(日) 22:46:09
>>371
先を越されたが、C99規格(ISO/IEC 9899:1999)には

When integers are divided, the result of the / operator is the algebraic
quotient with any fractional part discarded. 87)
-----------------------------------------------------------
87) This is often called “truncation toward zero”.

とある(>>375の仰る通り)。と言う事だから、次のようにするのが分かりやすい
かも知れない。高速かどうかは別にすれば。

#include <math.h>
int math_quotient(int a, int b) {return floor((double)a / b);}
int math_mod(int a, int b) {return a - b * math_quotient(a, b);}

余談だが、C++規格(ISO/IEC 14882:1998)ではオペランドが共に非負数で
あるとき以外はimplementation-definedになっている。
378デフォルトの名無しさん:2005/11/06(日) 23:11:38
cはじめたんですが
コンパイラは何を使えばいいのでしょうか?

+初心者講座のHPも知りたい

379367:2005/11/06(日) 23:20:43
>>378
Linux なら、gcc。
Windows なら、MinGW か BCC。

ググったら、↓がトップだったからそれでいいんじゃね?

ttp://www.kumei.ne.jp/c_lang/
380379:2005/11/06(日) 23:21:50
以前、質問させてもらった時のレス番が残ってしまった・・・。
381デフォルトの名無しさん:2005/11/06(日) 23:23:56
thx
382デフォルトの名無しさん:2005/11/06(日) 23:28:58
cでオンラインゲーム作りたいんですが
ネットワークプラグインとかってあるんですか?
383デフォルトの名無しさん:2005/11/06(日) 23:33:14
追加
c言語ではプラグインの事をライブラリって言うんですか?
384デフォルトの名無しさん:2005/11/06(日) 23:35:35
>>382
「プラグイン」という概念はC言語のものではなく、「プラグイン」と
「ライブラリ」は異なる。
385デフォルトの名無しさん:2005/11/06(日) 23:36:36
>>382
いいえ。
>>383
いいえ。
386デフォルトの名無しさん:2005/11/06(日) 23:40:12
プラグイン≠ライブラリ
ってことですね。

ライブラリは一体何者・・・・・?まぁ、どうでもいいや。


3Dゲーム作りたいのですが、
この↓ライブラリを使えばいいのですかぁ?
ttp://www5d.biglobe.ne.jp/~ochikko/easy3d.htm
387デフォルトの名無しさん:2005/11/06(日) 23:45:20
君には無理だからあきらめましょう
388デフォルトの名無しさん:2005/11/06(日) 23:49:29
あきらめました
389デフォルトの名無しさん:2005/11/07(月) 00:03:33
>>386
好きなライブラリ使ってもいいし、自前で書いてもいいし。
390デフォルトの名無しさん:2005/11/07(月) 19:31:29
三次元の配列で、各要素の数が100の計算をしたいのですが、各配列要素の数を50より大きくすると、実行時にエラーが表示されます。
おそらくメモリの関係だと思うのですが、三次元の配列で100*100*100の計算ってメモリが限界に達するほど大きな計算でしょうか?
何か効率よくする方法があれば教えてください。
ちなみに、配列の型はdoubleです。
391デフォルトの名無しさん:2005/11/07(月) 19:37:38
>>390
doubleが4バイトの環境だと仮定しても高々4MB
392デフォルトの名無しさん:2005/11/07(月) 19:40:18
>>391
自分でもそんなに大した量の計算ではないと思っているのに、どの計算機で試してもエラーが帰ってきます。
試しにソースアップするのでどこが悪いか見ていただけませんか?
393デフォルトの名無しさん:2005/11/07(月) 19:41:49
>>392
とりあえず貼ってみれ
394392:2005/11/07(月) 19:43:30
#include <stdio.h>

#define N 50 /*立方体である3次元の系のそれぞれの辺の長さに値する*/



int main(void)
{
int t,tmax,j,k,l;
float T0[N][N][N],T1[N][N][N];

FILE *output;
output=fopen("output.data","w");

/*時間的にどれくらい経過させるかを最大繰り返し回数として入力。*/
printf("最大繰り返し回数を入力。\n");
scanf("%d",&tmax);

/*初期条件として全体の温度100*/
for(j=0;j<N;j++) {
for(k=0;k<N;k++){
for(l=0;l<N;l++){
T0[j][k][l]=100.0;
}
}
}
395392:2005/11/07(月) 19:44:12
上の続き

for(t=0;t<tmax;t++) {

/*境界条件として回りの温度0*/
for(j=0;j<N;j++) {
T0[j][j][0]=0.0;
T0[j][j][N-1]=0.0;
T0[0][j][j]=0.0;
T0[N-1][j][j]=0.0;
T0[j][0][j]=0.0;
T0[j][N-1][j]=0.0;


}

for(j=1;j<N-1;j++) {
for(k=1;k<N-1;k++){
for(l=1;l<N-1;l++) {
T1[j][k][l]=T0[j][k][l]+0.25*(T0[j+1][k][l]+T0[j-1][k][l]+T0[j][k+1][l]+T0[j][k-1][l]
+T0[j][k][l+1]+T0[j][k][l-1]-6.0*T0[j][k][l]);
}
}
}
396392:2005/11/07(月) 19:45:25
上の続き(最後)

for(t=0;t<tmax;t++) {

/*境界条件として回りの温度0*/
for(j=0;j<N;j++) {
T0[j][j][0]=0.0;
T0[j][j][N-1]=0.0;
T0[0][j][j]=0.0;
T0[N-1][j][j]=0.0;
T0[j][0][j]=0.0;
T0[j][N-1][j]=0.0;


}

for(j=1;j<N-1;j++) {
for(k=1;k<N-1;k++){
for(l=1;l<N-1;l++) {
T1[j][k][l]=T0[j][k][l]+0.25*(T0[j+1][k][l]+T0[j-1][k][l]+T0[j][k+1][l]+T0[j][k-1][l]
+T0[j][k][l+1]+T0[j][k][l-1]-6.0*T0[j][k][l]);
}
}
}
397392:2005/11/07(月) 19:48:39
>>396は間違えました。正しくは↓です。

for(k=1;k<N-1;k++) {
/*時間的に過去の情報は破棄するためと、この時間的forループの計算のために配列Tのデータ処理*/
for(j=1;j<N-1;j++) {
for(l=1;l<N-1;l++){
T0[j][k][l]=T1[j][k][l];
}
}

}
}

398392:2005/11/07(月) 19:49:31
続き(ラスと)

/*最終結果には境界条件である温度0の情報がはいってないため、ここで計算する。*/
for(j=0;j<N;j++) {
T1[j][j][0]=0.0;
T1[j][j][N-1]=0.0;
T1[0][j][j]=0.0;
T1[N-1][j][j]=0.0;
T1[j][0][j]=0.0;
T1[j][N-1][j]=0.0;
}

for(j=0;j<N;j++) {
for(k=0;k<N;k++) {
for(l=0;l<N;l++){
fprintf(output,"%d %d %d %f\n",j,k,l,T1[j][k][l]);
}

}

}
fprintf(output,"\n");



return 0;
}

399デフォルトの名無しさん:2005/11/07(月) 19:51:35
とりあえず繰り返し回数に10を入れてみたが
0 0 0 0.000000
0 0 1 0.000000
0 0 2 0.000000
(中略)
43 47 41 -81.906128
43 47 42 329.925537
こんな感じのファイルが出力されて正常終了したぞ
400392:2005/11/07(月) 19:57:33
>>399
はい、その通りなのですが、Nの値を51以上にすると、実行時にエラーが出てくるのですが...
401デフォルトの名無しさん:2005/11/07(月) 19:58:19
>float T0[N][N][N],T1[N][N][N];
とりあえずstatic floatにしてみたら?
402392:2005/11/07(月) 20:01:09
>>401
出来ました!! staticは、関数内の情報が保存されるくらいの知識しかなくて、このmain関数内には別の関数を用意していないのに、staticを加えただけで実行できたのはなぜでしょうか!?
403デフォルトの名無しさん:2005/11/07(月) 20:02:32
この手の問題はコンパイラスイッチでスタックサイズを指定するか、
動的確保(malloc)に帰結する。
404392:2005/11/07(月) 20:04:30
>>403
ただ、後になってメモリの解放を忘れていますとのメッセージが表示されたのですが、
static関数を用いる以外に何かプログラムに書き込む必要があるのでしょうか?
405デフォルトの名無しさん:2005/11/07(月) 20:10:06
mallocしたらfree関数を忘れない。
staticな変数は静的データ領域に、そうでない変数はスタックに蓄えられる。
406デフォルトの名無しさん:2005/11/07(月) 20:16:37
ちなみに動的確保した変数はヒープ領域
407392:2005/11/07(月) 20:19:14
>>406
>>401のようにただ単にstaticを加えるだけでは駄目なのでしょうか?
メモリの解放という操作が必要なのでしょうか?
408デフォルトの名無しさん:2005/11/07(月) 20:35:06
>>407
いつまでもうるせえよ
409デフォルトの名無しさん:2005/11/07(月) 20:53:55
>>407
メモリの解放は動的メモリに対して必要。
staticは静的という意味でメモリの解放とは無縁。
410392:2005/11/07(月) 21:11:42
>>409
本当に何回もすみません。
では、main関数内でstatic変数を指定すると(上の例でいうと、static float...)、メモリが解放されないから、
結局staticを使わない場合と変わらないような気もするんですが、実際にはstaticを加えることにより、Nの値を大きくして計算が出来るようになったのはなぜでしょうか?
411デフォルトの名無しさん:2005/11/07(月) 21:13:49
>>410
ヒント:セグメント
412デフォルトの名無しさん:2005/11/07(月) 21:16:10
>>410
静的変数はローカル変数が使うスタックとは別領域に置かれる。
だからスタックの大きさとは無縁になれる。
413デフォルトの名無しさん:2005/11/07(月) 23:56:10
>>410
そしてstatic変数の寿命は、プロセスと一緒だからプログラム上で
管理しなくていい。
414デフォルトの名無しさん:2005/11/08(火) 00:03:56
mallocの寿命もプログラムと一緒だから
管理しなくていい。
415デフォルトの名無しさん:2005/11/08(火) 01:02:26
>>414
おい
416デフォルトの名無しさん:2005/11/08(火) 01:05:19
>>415
まぁいまどきのたいていのOSではそのとおりではある
だからといって管理しなくていいかどうかは別問題なのだが(そしてフレーム合戦へ)
417デフォルトの名無しさん:2005/11/08(火) 01:21:11
知らぬ間に裏でリソースを食い潰していくdaemonなんて大嫌いです
418デフォルトの名無しさん:2005/11/08(火) 11:15:55
freeするかしないかの私的判断基準。
コードレビューあり→する
次回リリースも付き合う→する
今回でサヨナラ→しない
419デフォルトの名無しさん:2005/11/09(水) 12:26:27
すみません
char a[]="abcdef";
char b[10];

void cpy(char *a,char *b)
{
while(*a != 0x00){
*b=*a;
a++;
b++;
}
*b=0x00;
}
ポインタを使ってBにAをコピーするのですが
bcdefと(a[1])からb(b[0])にコピーするにはどうすればいいでしょうか
(*a)++ではなく
420デフォルトの名無しさん:2005/11/09(水) 12:34:41
cpy( a+1, b );
421デフォルトの名無しさん:2005/11/09(水) 12:34:52
>>419
cpy(a+1,b);
422デフォルトの名無しさん:2005/11/09(水) 12:57:38
>>420
>>421
ありがとう
423デフォルトの名無しさん:2005/11/09(水) 13:32:39
二つの実数をキーボードから入力し、二つの実数が
等しくなければ、
z = x(x+y) / y(x-y)
の値を計算し、二つの実数が等しければ、
z = y / x(x+y)
を計算するようなプログラムを書きなさい。

と言う宿題がでてとりかかったんですが、なんどやってもエラーが起きます。
どなたか添削お願いします。

#include <stdio.h>

main()
{
int x,y,z;

printf("x=> "); scanf("%d",&x);
printf("y=> "); scanf("%d",&y);
if (x != y){
z = x*(x+y) / y*(x-y);
printf("z= %d\n",z);
}
else{
z = y / x*(x+y);
printf("z= %d\n",z);
}
return(0);
}
424デフォルトの名無しさん:2005/11/09(水) 13:43:13
zをdouble?
425デフォルトの名無しさん:2005/11/09(水) 13:43:54
>二つの実数をキーボードから入力
426デフォルトの名無しさん:2005/11/09(水) 13:59:49
>>423
>なんどやってもエラーが起きます。
エラー名くらいかいてください。

>x*(x+y) / y*(x-y)
→x*(x+y) / (y*(x-y))
427デフォルトの名無しさん:2005/11/09(水) 14:17:00
>424 >425 >426
無事解決しました。ありがとうございます。
428デフォルトの名無しさん:2005/11/09(水) 19:47:01
多次元配列のメリットはなんですか?
共用体の存在価値は?
429デフォルトの名無しさん:2005/11/09(水) 19:52:48
>>428
いつかわかるときがくる。
そのときにでも思い出せばいい。
430デフォルトの名無しさん:2005/11/09(水) 20:37:47
>>429
しかし共用体の存在価値はどうしても知りたい
431デフォルトの名無しさん:2005/11/09(水) 23:17:30
>>430
バカとハサミは使いよう。
そう思ってる限り、藻前にとって役に立つ事はない。
432デフォルトの名無しさん:2005/11/10(木) 00:07:26
A[x][y]の値を2次元のマトリクス形式で出力するにはprintfの部分をどのようにすればよいでしょうか?
因みにx,yはint型で、要素数は、A[5][5]です。
433デフォルトの名無しさん:2005/11/10(木) 00:10:46
1 2 3 4 5
6 7 8 略

こんな感じか?それなら↓
for (int i=0;i<5;i++)
printf("%d %d %d %d %d\n", a[i][0], a[i][1], 略, a[i][4]);

要C99、ANSI-Cなら何処かでカウンタを宣言してくれ
434デフォルトの名無しさん:2005/11/10(木) 05:07:47
for(x=0;x<5;x++){
for(y=0;y<5;y++){
printf("%2d ",A[x][y]);
}
printf("\n");
}
435デフォルトの名無しさん:2005/11/11(金) 17:55:10
>>428
多次元配列:モデル化した結果が多次元行列だった場合に1:1に実装できる
共用体:あるアルゴリズムではA、別のアルゴリズムではBと言う様に用途によって変わるデータ構造を実現する場合につかう。
メモリにマッピングして使うようなI/Oデバイスの場合、モードによって制御レジスタの構成が変わる時がある。そういう状態をそのまま実装できる。
他の言語と違い、自由にポインタが扱え、またキャストで比較的別の型への行き来が楽なC言語ではあまりメリットは感じないが、そうでない言語は共用体が無いとそういうデータ構造を実現できない。


     
436デフォルトの名無しさん:2005/11/11(金) 19:32:46
参考書には載ってなかったんですが
自作関数の中で自作関数を作ることはできますか?
437デフォルトの名無しさん:2005/11/11(金) 19:38:32
>>436
できない。
他のファイルから見えないstatic関数で我慢しろ。
438デフォルトの名無しさん:2005/11/11(金) 19:39:27
バイナリファイルを読み込んで改造するにはどうすればいいですか?
439デフォルトの名無しさん:2005/11/11(金) 20:04:07
>>437
そうですか。ありがとうございます。
440デフォルトの名無しさん:2005/11/11(金) 20:21:03
BorlandのBCC Developerでファイル入力でEOFを入れるにはどうしたらいいですか?
UnixだとCtrl+Dですが・・・
441デフォルトの名無しさん:2005/11/11(金) 22:43:11
C言語で配列じゃなくてリスト構造を使ってシェルソートするプログラムって難しい?
442デフォルトの名無しさん:2005/11/11(金) 23:49:16
>>441
別に難しくはないけど、無駄に時間がかかるだろ。
数個先の要素にすぐにアクセスとかできないし。
443デフォルトの名無しさん:2005/11/11(金) 23:59:08
じゃあ配列で作ったのほうがいいのか?
444デフォルトの名無しさん:2005/11/12(土) 00:08:51
↓OSでこんな課題でました。C言語もってないのでだれかやって

無限に走り続けるプログラムtest.c というものを作り,
実行可能なプログラムにtest という名前をつけ,これをバックグ
ラウンドで走らせ,そのプロセスを殺すこと.必ず,実行結果を
書くこと.プログラムを示すことは必要でない.
445京子:2005/11/12(土) 00:34:32
チェックボックスのチェックされたの数によって、
ジャンプするページを変えるには、
どのようなプログラムを組めば良いのでしょうか?

例えば、
チェックが0〜5個だと、Aページへジャンプ。
チェックが、6〜10個だと、Bページへジャンプとか、
そういう感じです
446デフォルトの名無しさん:2005/11/12(土) 00:38:21
VC?
447441:2005/11/12(土) 05:13:02
ゴメン聞き方が悪かったかな

普通はシェルソートって配列を使ってつくるもの?
448デフォルトの名無しさん:2005/11/12(土) 11:57:21
>>447
シェルソートは番号で指定された要素へ参照する際のコストがO(1)なのを前提とした場合にO(n^2)にしてる
要素への参照がO(n)だとするとO((2n)^2)になるって考え方で合ってるかな?
449デフォルトの名無しさん:2005/11/12(土) 14:32:24
>>448
O((2n)^2)=O(n^2)
450デフォルトの名無しさん:2005/11/12(土) 19:51:34
自作の掲示板を作りたいんですが
知識とかまったくないんです。
なにかまずこの本で基本勉強しろ!ってのあったら教えてください
451デフォルトの名無しさん:2005/11/12(土) 20:06:10
>>450
cgiをCでならここでもいいかもしれない。

掲示板を設置なら板違い。
ネット関係 web制作管理

cgi全般なら
ネット関係 webプログラミング

以上知らない単語があればググレ
452デフォルトの名無しさん:2005/11/12(土) 21:16:34
コマンドプロンプト開いて
とりあえず command prompt
って入力してみたら
なんかヘンになった。
だいじょぶかこりゃ。
453デフォルトの名無しさん:2005/11/13(日) 19:12:01
C言語のライブラリ関数を Javadoc みたいに見れるサイトってありますか?
454デフォルトの名無しさん:2005/11/13(日) 19:13:31
>>453
ttp://www.linux.or.jp/JM/index.html

一覧で見たけりゃK&Rの巻末付録に付いてる
455デフォルトの名無しさん:2005/11/14(月) 01:59:13
トランプとかのシャッフルに関する質問なんですが、

乱数を使って配列の中身を交換して上から引いていく
乱数で一枚選んできて、使用済みならもう一回乱数を使う

この二つに違いはあるんでしょうか

456デフォルトの名無しさん:2005/11/14(月) 02:20:21
>>455
数学板にでも行け。
457デフォルトの名無しさん:2005/11/14(月) 02:48:42
>>455
速度とか無視して乱数のみに関する話なら、違いは無い
458デフォルトの名無しさん:2005/11/14(月) 03:40:36
>>455
C言語的に考えると、上はカードの配列かindexの配列をソートする事になりカード枚数分の記憶領域が必要だが、下の場合はビット演算を使う事で必要な記憶領域を減らす事が出来る。
制限のある環境で作成する場合はそういうやり方もあると知っていると役に立つ事もある。
459デフォルトの名無しさん:2005/11/14(月) 11:44:11
質問なんですけど、

#include<stdio.h>
void main(){
int i;
for(i=0;i<10;i++){
printf("%d",i);

}
}



#include<stdio.h>
void main(){
int i;
for(i=0;i<10; ){
printf("%d",i);
i++;
}
}
ってぇのはどー違うんですか?
何で下のプログラムはi++が外に出てるのでしょうか?
お願いします(ペコリ
460デフォルトの名無しさん:2005/11/14(月) 11:46:23
>>459
特に違いはない
ただ「普通は上の書き方だけど、下の書き方もできるよ」程度
461デフォルトの名無しさん:2005/11/14(月) 11:47:13
>>459
for(i=0;i<10;i++){
printf("%d",i);

}
は、
i = 0;
for (; i < 10;) {
printf("%d", i);
++i;
}
と同じ。
#余計混乱してもしらね。
462デフォルトの名無しさん:2005/11/14(月) 13:20:41
>>457-458
参考になりました
ありがとうございます
463デフォルトの名無しさん:2005/11/14(月) 13:57:49
>>460>>461
ご親切にありがとうございます。
464デフォルトの名無しさん:2005/11/14(月) 21:05:43
すいません、またお聞きします。

最初のトコに
#include<stdio.h>
void main(){
って書いてある場合と
#include<stdio.h>
int main(void){
って書いてある場合がありますが、これも同じような意味なんでしょうか?
本にはコンパイラが云々って書いてあったんですけどよくわからなくて。。
宜しくお願いします。
465デフォルトの名無しさん:2005/11/14(月) 21:17:26
>>464
後者は規格で定められた形式の1つなので、
他のコンパイラでも動くという保障がある。
つまり移植性がある。
というわけでint main(void)の方が一般的。
466デフォルトの名無しさん:2005/11/14(月) 21:53:09
画面に文字を表示させるだけの簡単なプログラムを作ろうとしてコンパイラまでは出来たのですが、
exeファイルを実行すると一瞬だけ画面に現れて消えてしまいます。何が原因でしょうか?
467デフォルトの名無しさん:2005/11/14(月) 22:05:35
>>466
コマンドプロンプトの中で動かすプログラムだから。
スタートメニューの中のコマンドプロンプトを起動して、
その中でEXEを呼び出せ。
468デフォルトの名無しさん:2005/11/14(月) 22:17:27
>>467
ありがとうございます!おかげで解決しました。
469デフォルトの名無しさん:2005/11/14(月) 22:41:16
>>465
成る程、ありがとうございます!!!(*´∀`)
470デフォルトの名無しさん:2005/11/15(火) 10:53:12
C言語で無料のものってボーランドから出ていませんでしたっけ?
471デフォルトの名無しさん:2005/11/15(火) 11:02:46
さぁ?C++ならあったような気がするが
472デフォルトの名無しさん:2005/11/15(火) 11:04:54
turbo c?
確かまだ配布してたような
473デフォルトの名無しさん:2005/11/15(火) 12:21:24
visual C ってC言語なの?
474デフォルトの名無しさん:2005/11/15(火) 13:37:49
>>473
コンパイラです。つーか寧ろ、IDEです。
475デフォルトの名無しさん:2005/11/15(火) 13:53:24
IDEってケーブルのこと?
476デフォルトの名無しさん:2005/11/15(火) 14:03:19
>>475
IDEってケーブルがあるんですか?
477デフォルトの名無しさん:2005/11/15(火) 14:07:16
ハードディスクとかにつけるケーブルってIDEじゃなかった?
478デフォルトの名無しさん:2005/11/15(火) 14:09:27
>>477
それはケーブルの名前ではありません。ハードディスクを制御するための規格の名前です。
479デフォルトの名無しさん:2005/11/15(火) 14:50:16
でvisual Cはその規格なの?
480デフォルトの名無しさん:2005/11/15(火) 15:03:01
んなこたーない。
481デフォルトの名無しさん:2005/11/15(火) 15:08:56
IDEってなんですか?
教えて!

検索してもハードディスクのことしか出てこない。。。
482デフォルトの名無しさん:2005/11/15(火) 15:17:17
統合開発環境 IDE
でググれ
483デフォルトの名無しさん:2005/11/15(火) 15:43:08
なるほど、でvisual CはC言語でいいんですよね?
C言語の勉強に買おうと思っているんですけど。
484デフォルトの名無しさん:2005/11/15(火) 16:13:10
ボーランド+Cパッドで良いんじゃね
485デフォルトの名無しさん:2005/11/15(火) 16:18:39
それはいくらくらいでしょうか?
486デフォルトの名無しさん:2005/11/15(火) 16:31:16
>>485
目的を最初から書けば回答に素早く辿り着けたものを……

おまいら!今日からC言語を学んでいくぞー!パート2
http://pc8.2ch.net/test/read.cgi/tech/1128637438/275

freeでいいコンパイラあったら書き込むスレ1
http://pc8.2ch.net/test/read.cgi/tech/1103285844/35
487デフォルトの名無しさん:2005/11/15(火) 16:40:35
>>486
回りくどくてすいません。
でも優しく応対してくれて感謝しています。
今日この板初めてきたもので助かります。
ありがとうございます。、
488デフォルトの名無しさん:2005/11/15(火) 17:02:03
インストール完了しました。
ありがとうございました。
489デフォルトの名無しさん:2005/11/15(火) 18:25:47
コンパイラのダウンロードサイト
http://pc8.2ch.net/test/read.cgi/gamedev/1005038080/
490デフォルトの名無しさん:2005/11/15(火) 19:00:06
[問題4/中級]文字列 MOJI に代入されている文字の中から、数字(0から9)だけ
を取り出して、それを小さい順に表示するプログラムを作りなさい。
例えば、MOJI[]="9B2C3ADC31" ならば 12339 と表示する。

「問題6/上級]次の問題の中から、どれか1つを選び、プログラムを作成して答えを
求めなさい。
(問題6−1)太郎君が9歳になるまで,花子さんの年齢が太郎君の年齢の整数倍にな
る年がちょうど7回ある。このとき、太郎君と花子さんの年齢差はいくつか?
 
解答ヨロシクお願いします。自分お手上げです(泣
491デフォルトの名無しさん:2005/11/15(火) 19:02:58
>>490
問4) ctype.hとstdlib.h使え
492デフォルトの名無しさん:2005/11/15(火) 19:25:18
またマルチか
493デフォルトの名無しさん:2005/11/15(火) 20:51:11
問6)太郎:2歳 花子:2歳
494デフォルトの名無しさん:2005/11/15(火) 21:15:41
途中で死んだら計算狂うじゃないか
うるう年に生まれてたら年齢は普通の人の1/4になるし
495デフォルトの名無しさん:2005/11/15(火) 21:20:20
>>494
>うるう年に生まれてたら年齢は普通の人の1/4になるし
ネタ乙。
496デフォルトの名無しさん:2005/11/15(火) 21:34:30
うるう年に生まれてる人間が1/4になるわけないだろ。
2月29日生まれの人が普通の人の1/4しか年を取らない。
497デフォルトの名無しさん:2005/11/15(火) 21:50:13
2/29生まれは、うるう年以外は2/28と3/1の境目で年を取る、と
何かで定めていなかったっけ。

某ゲームじゃ、2/30が誕生日のやつとかいるし。
498デフォルトの名無しさん:2005/11/15(火) 22:01:54
>>497
何で定められてるの?
499デフォルトの名無しさん:2005/11/15(火) 22:08:32
日本の法律では、誕生日の前の日の24時に歳をとることになっている。
従って、2/29生まれは2/28の24時に歳をとることになる。

このため、4/1生まれは3/31に就学年齢に達することになるので、早生まれとなる。
500デフォルトの名無しさん:2005/11/15(火) 22:35:54
ネタ乙。
501デフォルトの名無しさん:2005/11/15(火) 23:07:14
502デフォルトの名無しさん:2005/11/16(水) 00:12:01
参考書にソースファイルはwebで落とせますということで、こちらの http://www.cmagazine.jp/books/assyuku/index.htmlweb
でDLして早速コンパイルしてみると、どれをやっても
エラー E2268 hahuman3.cpp 19: 未定義の関数 'exit' を呼び出した(関数 main(int,char * *) )
と出てしまいます。なぜ、exitが関数扱いされているかわからず動かないので困りました。
どうすれば、直るのでしょうか?
503デフォルトの名無しさん:2005/11/16(水) 00:33:41
>>502
exit()は明らかに関数
504502:2005/11/16(水) 00:59:55
>>503
そうだったんですか。なんとなく終了させたいときにexit使ってましたが関数なのですね。
でも、他のexit含んだプログラムではこんなエラーがでないんですがなぜなのでしょうか?
505デフォルトの名無しさん:2005/11/16(水) 01:01:50
そのソースは見てないけどINCLUDEしてないだけちゃうん?
506デフォルトの名無しさん:2005/11/16(水) 01:02:28
stdlib.hはインクルードしたか?
507デフォルトの名無しさん:2005/11/16(水) 01:22:50
>>505,506
お二方の言うとおり、#include<stdlib.h>のし忘れだったようです。無事コンパイルできました。
後はコマンドプロンプトで起動するようなので、そちらの使い方を学んでから使ってみます。
ありがとうございましたm(_ _"m)
508デフォルトの名無しさん:2005/11/16(水) 08:54:33
某C言語学習本に

引用開始

float型の変数に値を代入する時

float a;
a = 1.5;

とすると、コンパイラが警告を発します。
これは、単に「1.5」と書くとdouble型の1.5であると解釈されるからです。
float型の変数よりも大きなサイズのdouble型の数値を代入しようとしているとコンパイラが判断して
「おい、おい、危ないぞ!」と警告を発しているのです。

引用ここまで

の記述があるのですが、

float a;
a = 1.5;

のどこに問題があるのか理解できません。
わかりやすく教えてください。
509デフォルトの名無しさん:2005/11/16(水) 09:41:34
>float型の変数よりも大きなサイズのdouble型の数値を代入しようとしているとコンパイラが判断して 
>「おい、おい、危ないぞ!」と警告を発しているのです。 

って書いてあるじゃん

こちとら、そんなの分かってて代入するんだい!
という場合は、

a = (float)1.5;
a = 1.5f;
510デフォルトの名無しさん:2005/11/16(水) 10:32:02
ヘッダファイルとソースファイルを分けて書くときって
インクルードするヘッダはどっちに書くべきなんでしょうか?
511デフォルトの名無しさん:2005/11/16(水) 10:42:06
後10分後にテストです。誰か助けてくださいーー^^
512デフォルトの名無しさん:2005/11/16(水) 10:50:39
>>510
ごめん、それだけじゃ助けようがない。
513デフォルトの名無しさん:2005/11/16(水) 11:21:32
ヘッダに置かんでいいものはヘッダには置かない。
514デフォルトの名無しさん:2005/11/16(水) 12:24:40
>>510
includeの動作から勉強し直せ。
Cソースをincludeすることも可能だぞ。
515デフォルトの名無しさん:2005/11/16(水) 15:13:44
>>511
ハハ、私は来週の月曜にテスト 
C言語難しいよ〜
516デフォルトの名無しさん:2005/11/16(水) 15:25:03
VC++ .Netで構造体の配列作って、
値を入れようとするとエラーになります。
なぜでしょうか?

__gc struct ts{
int num;
}*pTs[];

pTs = new ts*[64];
pTs[0]->num=1;
517デフォルトの名無しさん:2005/11/16(水) 15:26:35
>>516
文法がおかしいから
518デフォルトの名無しさん:2005/11/16(水) 15:36:33
>517
文法がおかしいの?
コンパイラではエラーでないけど・・・orz

デバッグでみるとpTs[0]->numは存在しませんになる。
確保できてないのか?
519デフォルトの名無しさん:2005/11/16(水) 15:46:43
Cを勉強したんだが、次に何をすればいいのか全くわからん・・・・。
一応アルゴリズムの本は読んでるんだが・・・。
520デフォルトの名無しさん:2005/11/16(水) 15:50:40
自分が組む分野の学習。
他人の書いたプログラムを読んでみる。
設計法を学ぶ(仕様書)
521デフォルトの名無しさん:2005/11/16(水) 15:59:44
一応WindowsではなくてLinuxとかUnixでプログラミングを組んでみたいとは思ってるんだが
522デフォルトの名無しさん:2005/11/16(水) 16:02:34
Unix/Linuxのフリーソフトは大概Cで書いてあるのが多いから。それ読め。
523デフォルトの名無しさん:2005/11/16(水) 16:59:08
ITRONでマルチタスクの設計、開発。
C言語でプログラミングという課題を預かってますが、どうしたらよいのかさっぱりわかりません。

開発環境はWindowsなんですけど・・・
524初心者C:2005/11/16(水) 17:54:08
関数 A() 関数 B() があり、内容はほとんど同じです。
なので、#ifdef等でコンパイル時に切り分けをして、ソースを共通にできればよいなと考えたのですが
どうにもうまいやり方がわかりません。
ソースを別ファイルにして、#include すればできそうですが、それだと可視性がわるくなるので気が進みません。
以下のような感じで、記述する方法はあるでしょうか。

void A(){

}
void B(){
 ?
}

共通のソース
{
#ifdef AAA
・・・
#endif

#ifdef BBB
・・・
#endif
}
525デフォルトの名無しさん:2005/11/16(水) 18:25:23
>>524
手続きを見直して可能な限り共通の処理を1か所にまとめ、
別関数に切り分ける。
526デフォルトの名無しさん:2005/11/16(水) 20:06:43
getchar()が挙動不振です・・・
527デフォルトの名無しさん:2005/11/16(水) 20:08:08
>>518
516のコードではポインタの配列を確保してpTsへ代入しているだけ。
pTs[0]〜pTs[63]までの個々の要素はどこも指していない。

単にts型の配列を作りたいだけなら、
ts *pTs;
pTs = new ts[64];
pTs[0].num = 1;
本当にポインタの配列が欲しいのなら、
ts *pTs[] = new ts*[64];
pTs[0] = new ts;
pTs[0]->num = 1;
(こっちだとC#でいうジャグ配列を再現できる)
528デフォルトの名無しさん:2005/11/16(水) 20:27:13
質問です
fflush()を使うようなプログラムは望ましいものではないと思うんですが
そうでしょうか?
529デフォルトの名無しさん:2005/11/16(水) 20:31:04
んなこたぁない
530デフォルトの名無しさん:2005/11/17(木) 00:02:11
>fflush()を使うようなプログラムは望ましいものではないと思うんですが
根拠を書け。
#まぁ、反駁するだけだが。
531デフォルトの名無しさん:2005/11/17(木) 00:09:51
fflushではなくてfflush(stdin)です
処理系に依存するので移植性がないのではないでしょうか?
532デフォルトの名無しさん:2005/11/17(木) 00:13:01
最初からそう書けよ
533デフォルトの名無しさん:2005/11/17(木) 00:13:54
うるせーはげ師ね
534デフォルトの名無しさん:2005/11/17(木) 00:15:30
もう絶対教えてやんね
535デフォルトの名無しさん:2005/11/17(木) 00:16:57
おまえには死んでも教えてもらわない
536デフォルトの名無しさん:2005/11/17(木) 01:47:46
getchar
getc
fgetc
などで文字が入力バッファにたまってしまって、
fflush(stdin)でもフラッシュできないときってどうしたらいいんでしょうか?
537デフォルトの名無しさん:2005/11/17(木) 01:51:59
>>536
前に俺が何処かのスレで似たようなこと聞いたときに教えて貰った方法だが
scanf("%*[^\n]");で次の改行文字直前まで捨てる
scanf("%*c");で改行文字を含めて1文字捨てる
もしくは適当なバッファ確保してfgetsで放り込む
538デフォルトの名無しさん:2005/11/17(木) 01:52:27
書き忘れたが入力バッファに対するfflushは処理系依存
使うべきではない
539デフォルトの名無しさん:2005/11/17(木) 01:52:28
読み捨てれば?
540デフォルトの名無しさん:2005/11/17(木) 01:57:57
printf("_gadad ←下だけ読め");

C言語超ムズい。いやだいやだ。
541デフォルトの名無しさん:2005/11/17(木) 02:04:44
>>537-538
ども。配列とかでバッファを確保しないやり方だと、scanfと代入抑止文字使うしかないんですね。d
542デフォルトの名無しさん:2005/11/17(木) 02:19:59
while(getchar()!='\n');
別にこれでもいいと思うが・・・
543デフォルトの名無しさん:2005/11/17(木) 02:36:36
>>542
whileの中だったのでwhile使うことまで思いつきませんでしたd
544デフォルトの名無しさん:2005/11/17(木) 04:33:51
そして途中でEOFが来て死亡っと
545デフォルトの名無しさん:2005/11/17(木) 08:21:31
while(!feof(stdin) && getchar()!='\n');
こうしなきゃダメか
546デフォルトの名無しさん:2005/11/17(木) 14:31:45
不定形のボクセルデータの表面抽出の仕方を教えてください><
547デフォルトの名無しさん:2005/11/17(木) 17:31:32
関数のstatic変数ってどのタイミングでメモリに確保されるのですか?
548デフォルトの名無しさん:2005/11/17(木) 17:39:32
>>547
プログラムがロードされた辺りじゃないかな?
549デフォルトの名無しさん:2005/11/17(木) 18:32:02
OSはwindouwsXPで、DOSで時計を表示するプログラムでエスケープシーケンスが動きません。
「device=%SystemRoot%\system32\ANSI.SYS」をconfig.NTに追加して、
system32の方のプロンプトに直接エスケープシーケンスを書き込んで機能させるところまでできたのですが・・・。

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

main()
{
time_t timee;
struct tm *timee2;
char *timee3;


while(!kbhit()){
time(&timee);
timee2 = localtime(&timee);
timee3 = asctime(timee2);
printf("\x1b[4;1H");
printf("現在時刻:%s", timee3);

}

return 0;
}

ESC部分は、¥0x1b、¥x1b、で試しました。
よろしくお願いします。
550デフォルトの名無しさん:2005/11/17(木) 18:39:41
>>549
config.ntは16bit DOSプログラム用。
32bit プログラムではconfig.ntは使われない。
代わりにWinAPIでやるしかない。
551デフォルトの名無しさん:2005/11/17(木) 19:26:45
質問です。
rand関数って同一値が生成されることってあるんですか?
552デフォルトの名無しさん:2005/11/17(木) 19:28:01
うん。
553549:2005/11/17(木) 19:33:50
即レスありがとうございます。
winAPIについて少し調べたのですが、これはDOSではなくWINDOWSプログラミングですか?
まだDOSプログラムもロクにできませんが、
WINDOWSプログラムの勉強に切り替えても大丈夫ですか?
知識のレベルは、基本情報取得程度で、
Cについては猫サイトを40まで読み、簡単な用語を理解している程度です。
554デフォルトの名無しさん:2005/11/17(木) 19:37:47
>>553
Win32APIはCとは全くの別物と考えた方がいい
とりあえず推薦図書スレ見てこい
555549:2005/11/17(木) 19:46:57
Cとは別物なんですか・・・?
けど、Cを勉強する上で必要な知識なんですよね?
ありがとうございました!
早速見てきます。
556デフォルトの名無しさん:2005/11/17(木) 20:01:47
>>555
いや、そういうわけではない。
単にWindows固有のことを行いたければWinAPIが必要というだけ。
猫でもを読んでいるのなら、エスケープシーケンスの章は飛ばしてしまえ。
どうせエスケープシーケンスもDOS固有のものであってCとは全く関係ない。

#ちなみに猫では後の章でWinAPIで文字色を変える方法が出てくるから、待っていろ。
557549:2005/11/17(木) 21:36:57
>556
レスありがとうございます。
迷走してきました。
正直よくわからなかったんですけど、
日本人の本より洋書の翻訳版のほうがいいみたいですね。
立ち読みしてて、読みづらかったんで却下してましたよ・・・。
原書が存在してる以上、英語も覚えないといけないんでしょうね・・・。
マジメに勉強しておけばよかった・・・。

猫にあるんですか?
それならそれを今からやってから、明日本屋にいくことにします。
推薦に出てたやつを中心にして、2時間ほど嫌がらせを。
ジュンク堂なんで、誰も文句言いませんけど。
558549:2005/11/17(木) 22:09:25
猫のwinAPIの章っていうのは、コンソールAPIのことでよかったんでしょうか?
見たことのあるDOSで使ってた関数とwindouwsで使うはずの謎のtypedefされたデータ型がならんでますね・・・。
今自分がなんのプログラミングしてるのかわからなくなりそうですよ・・・。
SDKっていうのも必要みたいですし・・・。

けど、調べるべきことは絞れました。
本屋にはいい感じで行けそうです。
ありがとうございました!できたら報告しにきます。
559デフォルトの名無しさん:2005/11/17(木) 22:50:24
>>558
そうそう、それそれ。
そこらへんまでくると、もはやC言語編というのは名前だけで、
実態は単なるWinAPI編(ウィンドウなどが絡まないもの)となっている。
560デフォルトの名無しさん:2005/11/17(木) 22:52:07
>>558
ちなみにSDKというのはVC++(製品版)やBCB/BCC(無料版)などなら付属しているので、改めて入手する必要はない。
561デフォルトの名無しさん:2005/11/17(木) 23:23:21
http://wisdom.sakura.ne.jp/programming/index.html
のC言語入門とC++入門でC→C++と勉強しようと思うんだけど、
ここで勉強するのってお薦め?それとも推奨しない?
562デフォルトの名無しさん:2005/11/18(金) 00:23:00
グローバル変数は少なく!というのは通説ですが、このグローバル変数というのは
1.いわゆるファイルスコープを持つ変数
2.1に加えてヘッダファイルにextern宣言し、ファイルをまたいで使える変数
のどちらでしょうか。
私は多分1のことだと思うのですが(つまり2はさらに罪が深い)、グローバル
変数を使わないようにする方法がわからないのです。
ソースファイル分割をまとまった機能ごとに行う場合、機能として保持する必要のある
情報はどうしてもグローバルにせざるを得ないと思うのですが。
例えば、通信で受け取った受信フレームの内容や機能のステータスなどです。
まあ2については、extern関数でラップして受け渡せばいいので完全になくせる
とは思いますけど。
563デフォルトの名無しさん:2005/11/18(金) 00:23:24
またいつもの奴懲りずにきた
564デフォルトの名無しさん:2005/11/18(金) 00:27:10
>>http://wisdom.sakura.ne.jp/programming/index.html より
>CとC++はプログラマを目指す人には憧れであり、絶対に通らなければならない言語です

うわぁ〜…、のっけからイっちゃってるよ…。
565デフォルトの名無しさん:2005/11/18(金) 00:30:48
憧れではないかもしれんが、「プログラマ」ならCやC++が必要になるがな。
程度にもよるけど。
566デフォルトの名無しさん:2005/11/18(金) 00:40:53
>>562
グローバル変数は通常後者。
前者は、関数外でstatic指定された変数だろ。

> ソースファイル分割をまとまった機能ごとに行う場合、機能として保持する必要のある
> 情報はどうしてもグローバルにせざるを得ないと思うのですが。
> 例えば、通信で受け取った受信フレームの内容や機能のステータスなどです。

そんなことはない。
567デフォルトの名無しさん:2005/11/18(金) 00:43:33
>>562
それは設計が悪い。
568デフォルトの名無しさん:2005/11/18(金) 15:59:13
たとえば共通インクルードファイルcommon.hがあったとします。
そのcommon.hを50本のCソース(それぞれ個別実行プログラム)が参照しています。
今までcommon.h内にあるシンボル(define固定値)を共通で利用していたのですが
このシンボルでdefineにより決まっていた固定値が、今後変動する値を扱うようになります。
そこで一番影響が少なくテスト本数を最小限にとどめる事を目的として
修正ファイル、リコンパイルソースも極力少なく対応したいと考えます。
どのような方法が有効でしょうか?今考えているのは一つの実行プログラムを追加して
一番最初に動くように作りこみ
ヘッダーに持っているシンボルを自由自在な値に塗り替えるように作成すれば
可能な気がしますが、考え方としてはどうでしょうか?
569デフォルトの名無しさん:2005/11/18(金) 16:02:07
>>568
結論:ダメ。

何故ならば、defineシンボルはコンパイル時に使用されるだけだから。
実行モジュール中には、最適化の影響もあるから影も形も残ってないと思う。
570デフォルトの名無しさん:2005/11/18(金) 16:03:49
あー、そのdefine定数が文字列ならば、バイナリパッチと言う手も無くは無いけど。
#例えば端末名やユーザ名が固定で埋まっている蛸なプログラムをバイナリパッチで救出したことはある。
571デフォルトの名無しさん:2005/11/18(金) 16:09:47
C言語のことで質問なんですけど
正整数を二つ入力して、それらの公約数を小さい順に表示してください
って問題やってるんですが
公約数を小さい順に表示ってどうやるんでしょうか?
572デフォルトの名無しさん:2005/11/18(金) 16:15:21
分かりやすいご指摘ありがとうございます。
defineはコンパイル時のみに使用されてるのですね。勉強になりました。
50本のソースに対して極力少ない影響範囲の修正ということで
define定義をグローバル変数(char型)に変えるとまた違う問題点など出てきますでしょうか?
おっしゃる通り、ユーザー名とかそのあたりのchar型の値を取り扱っています。
バイナリパッチという方法もあるのですね、初めて聞くキーワードです。
ちょっとぐぐってまいります。
573デフォルトの名無しさん:2005/11/18(金) 16:16:00
>>571
qsort

公約数の求め方が分からないという質問なら氏ね
574デフォルトの名無しさん:2005/11/18(金) 16:16:27
>>571
公約数を小さい順に求めて表示して行けば、
必然的に小さい方から表示されるだろ。
575デフォルトの名無しさん:2005/11/18(金) 16:19:43
>>572
横から細かいこと言うと、コンパイル時っていうよりはプリコンパイル時な
リテラル以外でdefineに一致するのが全て置き換えられる


/* defineって#defineの事だよな? */
576デフォルトの名無しさん:2005/11/18(金) 16:23:45
>>575
> プリコンパイル

プリプロセスの方が一般的だね。
プリコンパイルだとプリコンパイルヘッダを連想してしまう…orz
577569:2005/11/18(金) 16:47:50
>>576
面倒だから説明を端折った。別に後悔していない。

>>572
ユーザー名なら文字列リテラルだろ?
50本ものモジュールの文字列をバイナリパッチするのは保守上、著しい問題があるので激しくお勧めできない。
#漏れの場合は一本だけだったし手作業だからできたわけで。

まぁ、文字列リテラルへのポインタを返す関数を用意するのがましかな。
どっちみち、50本の修正は避けられないけど。
578569:2005/11/18(金) 16:53:17
念のため補足。
・グローバルな文字配列をもつ方法
common.h内で、
extern const char * UserName;
common.cなどのソース内で、
const char * UserName = "名無しの名";

・静的な文字配列をもつ方法
common.h内で、
static const char * UserName = "名無しの名";

・ポインタを返す関数を使う方法
common.h内で、
const char * GetUserName(void);
common.cなどのソース内で、
const char * GetUserName(void) {return "名無しの名";}
579デフォルトの名無しさん:2005/11/18(金) 17:09:47
>>569さま
親身なご指導ありがとうございます。非常に分かりやすかい説明です。

>>578であげていただいたように、対応する事にします。
他のみなさまもありがとうございました。非常に勉強になりました。
580デフォルトの名無しさん:2005/11/18(金) 19:37:36
x86 CPUのキャッシュに入っているデータを
直接読む方法はありますか?
例えば、キャッシュの0番地から100番地までを
読み出すとか。
581デフォルトの名無しさん:2005/11/18(金) 19:40:20
あるよ。
582デフォルトの名無しさん:2005/11/18(金) 20:25:01
現在高一です。
今日初めてC言語を勉強しました。
授業で「二つの整数a=45,b=1の和と差を求めるプログラム」として次の文章をノートに書きました。

/*例題6-1和と差を求める2005.11.18
高校名1年名前*/
#include<stdio.h>
int main(void)
{
  int a,b,wa,sa;
  a=45;
  b=1;
  wa=a+b;
  sa=a-b;
  printf("a+b=%d\n",wa);
  printf("a-b=%d\n",sa);
}

これを実行すると画面上に
a+b=46
a-b=44
と出力されるそうです。

ファイル.cをコンパイルしないといけないと言われたのですが、どう言う事でしょうか?
583デフォルトの名無しさん:2005/11/18(金) 20:33:21
こんなところで質問しても役に立ちそうな意見なんて出てきやしないから質問するの止めとこう。
584デフォルトの名無しさん:2005/11/18(金) 20:35:29
.cは実行ファイルじゃないので
コンパイラでコンパイルしないといけない
無料コンパイラ http://www.borland.co.jp/cppbuilder/freecompiler/ (要ユーザ登録)
585デフォルトの名無しさん:2005/11/18(金) 20:43:15
ある二つの数の最大公倍数と最小公約数を求めるプログラムを教えてください
586デフォルトの名無しさん:2005/11/18(金) 20:46:20
>最大公倍数と最小公約数

最大公約数と最小公倍数だろプ
587585:2005/11/18(金) 20:47:38
>>586うっさいボケ
誰か教えてください
588デフォルトの名無しさん:2005/11/18(金) 20:55:43
>>585
氏ね
589デフォルトの名無しさん:2005/11/18(金) 21:08:22
標準入力から下限と上限を入力して素数を求めるプログラムを作っています。
main関数で下限から上限まで数値を動かして別関数に値を渡して素数か調べ、素数だった場合別関数内にて
printfしています。

これを1行に5個ずつ出力させ桁も揃えたいのですが、やりかたがわかりません。教えて下さい。
590デフォルトの名無しさん:2005/11/18(金) 21:14:24
>>589
漠然としすぎてどうしようもないが
frintf("%3d %3d %3d %3d %3d\n", num[i],num[i+1], num{i+2],num{i+3],num[i+4]);
i+=5
これをforかなんかで回せ
591デフォルトの名無しさん:2005/11/18(金) 21:22:46
ある二つの数の最大公約数と最小公倍数を求めるプログラムを教えてください
592591:2005/11/18(金) 21:30:01
急ぎです 早く
593591:2005/11/18(金) 21:36:45
遅いよ
594デフォルトの名無しさん:2005/11/18(金) 21:41:11
595デフォルトの名無しさん:2005/11/18(金) 21:47:50
マクロで
#define SCORE_CUL(x, y) ( ( (x) / (y) ) * 100 ) を作って、

int score_A = (int)SCORE_CUL(correct, count)   //correct と count はintで変数

これでデバッグで score_Aの値みたら 異常な値になっちゃったけどなんで?
なんかマイナス8億くらいなんだけどw
596デフォルトの名無しさん:2005/11/18(金) 21:55:43
>>595
countが0だったんじゃねーの?
597デフォルトの名無しさん:2005/11/18(金) 21:55:53
#defineの所を(double)(x) / (y)にしてみたら、と初心者が言ってみる
598デフォルトの名無しさん:2005/11/18(金) 21:57:15
当然コレクトとカウントはスコアAの前に定義してるよな
599591:2005/11/18(金) 22:01:49
自決しました
600595:2005/11/18(金) 22:07:53
報告
>>596
countが0のときはSCORE_CUL()の前にアラート出すようにチェックしてあるよw
>>597
とりあえずやってみたけど変わらず。 マクロでdoubleにキャストするなら それをまた(int)でキャストするのは無駄じゃね?
いや、俺もよくわかんないんだけどもね
>>598
correct と count は定義済みです。

ちなみに 表示させてみたのは
correct = 1 , count = 1 の時  score_A = 100
correct = 2 , count = 2 の時  score_A = 100
correct = 2 , count = 3 の時  score_A = 0 ('A`)
601デフォルトの名無しさん:2005/11/18(金) 22:11:35
>>600
当たり前
2 / 3 = 0

(((double)(x) / (y)) * 100)
602デフォルトの名無しさん:2005/11/18(金) 22:13:12
>>581
嘘はイクナイ!
603デフォルトの名無しさん:2005/11/18(金) 22:18:38
掛算(*100)を割算の前に汁
604600:2005/11/18(金) 22:19:02
>>601
解決しました。 そうでした。 そもそもint だから 2 / 3 = 0 でつね。。。。
>>597 合ってました。ごめんなさい。

分子がdouble なら分母はdoubleにキャストしなくても、それは自動でやってくれるんですか?
605デフォルトの名無しさん:2005/11/18(金) 22:25:43
606600:2005/11/18(金) 22:30:41
>>605
どうもありがとうございます。 よく分かりました。 4番にやろうとしたことがそのまま書いてありましたね。
607589:2005/11/18(金) 22:32:49
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1111.txt

ここまで作ったんですが、標準出力の場合はうまくいくんですが、ファイルに書き出すと最後の素数しか書かれません。
どうすればいいですか?
608デフォルトの名無しさん:2005/11/18(金) 22:41:23
ある二つの数の最小公約数と最大公倍数を求めるプログラムを教えてください
609607:2005/11/18(金) 22:58:42
解決しました
610608:2005/11/18(金) 23:45:55
解決しました。もう来ません。お騒がせしました
611611:2005/11/19(土) 02:26:07
解決しました
612デフォルトの名無しさん:2005/11/19(土) 04:48:21
static struct nmlist member[] = {  //構造体変数が配列
{"田中一朗", 'M', 20}, //このような配列の初期化は
{"田中次郎", 'M', 16}, //staticで
{"田中花子", 'F', 18}
};

ただの構造体の初期化なんですが、サンプルプログラムには
”このような配列の初期化はstaticで” とそうするのがあたりまえのように書いてあるんですが、
この理由はなんでなんですか?

[引用元] 猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/intro/no_28.htm
613デフォルトの名無しさん:2005/11/19(土) 06:33:33
これでfatal error が返されてしまうのですが
なぜでしょうか?
激初心者です
つД`)・゚・。・゚゚・*:.。

#include <iostream>
using namespace std;

int main()
{
cout << " bool:" sizeof( bool) << '\n';
getchar();
return 0;
}
614613:2005/11/19(土) 06:51:58
警告は
eh.h is only for C++!
です。
615デフォルトの名無しさん:2005/11/19(土) 06:59:48
>612
 {;;;;;;ゝ T辷iフ i    f'辷jァ  !i;;;;;   autoの構造体は初期化できない
  ヾ;;;ハ    ノ       .::!lリ;;r゙  
   `Z;i   〈.,_..,.      ノ;;;;;;;;>  そんなふうに考えていた時期が
   ,;ぇハ、 、_,.ー-、_',.    ,f゙: Y;;f    俺にもありました

ANSI C以前の時期だか
616デフォルトの名無しさん:2005/11/19(土) 06:59:53
>>613
cout << " bool:" << sizeof( bool) << '\n';
617613:2005/11/19(土) 07:51:10
<<615様
<<616様
ご解答ありがとうございます!
少し前進しました^^
でも依然としてeh.h is only for C++!
のエラーが一つ出てしまい実行出来ません。
ググってみますとiostreamのところに問題があるようなのですが…
どなたかお願いします。m(_ _)m
618613:2005/11/19(土) 07:53:31
上の617で
<<615様はミスでした。
すみません
619デフォルトの名無しさん:2005/11/19(土) 07:56:54
getcharってiostreamだったっけ?
620613:2005/11/19(土) 07:59:02
<<619様
出力画面保持のため使用してるのですが…
621デフォルトの名無しさん:2005/11/19(土) 09:02:40
>>617
そもそも613のソースファイルの拡張子はcppなどになっているか?

>>620
getchar()を使うには<cstdio>のインクルードが必要。
<iostream>だけで行いたいのならcin.get()が代替になる。
622デフォルトの名無しさん:2005/11/19(土) 09:22:52
>>612
あいまいな質問だな
623613:2005/11/19(土) 10:08:15
>>621
ありがとうございます!
言われた通りにしたらエラーが消えました!
cppになってませんでした。cでやってました。
ほんとうに感謝です!

実行してみたのですが画面出力が真っ黒で
何も出力されていません。
たまに出力される時もあるのですが…
原因わかる方いらっしゃいますか?


自分でも鬱陶しいなって思ってます。
すみません。
624613:2005/11/19(土) 10:12:35
環境はvisual C++ 6.0
OSはwin98です
つД`)・゚・。・゚゚・*:.。
625デフォルトの名無しさん:2005/11/19(土) 11:02:05
C言語勉強するならこの本買っとけ!
って言う本ありますか?
626デフォルトの名無しさん:2005/11/19(土) 11:06:26
K&Rで検索
627デフォルトの名無しさん:2005/11/19(土) 11:09:05
K&R

C言語逆引き大全500の極意
では、どちらがオススメですか?
628デフォルトの名無しさん:2005/11/19(土) 11:19:47
K&R
629デフォルトの名無しさん:2005/11/19(土) 11:20:43
何故でしょうか?
630デフォルトの名無しさん:2005/11/19(土) 11:29:38
http://www.cbook24.com/bm_detail.asp?sku=4798006475
C言語の本としては冗長だ
文法を勉強してとにかくソースを読め
631デフォルトの名無しさん:2005/11/19(土) 11:29:54
まあ、よみくらべてみ・・・

632デフォルトの名無しさん:2005/11/19(土) 12:00:29
>>613
ここはC言語激初心者スレ、C++はスレ違い。

>>612
autoの配列は、初期化処理が入るため無駄が多い。
但し、その場合はstatic struct nmlistではなくstatic const struct nmlistにするべきかもしれない。
633613:2005/11/19(土) 13:18:53
>>632
すみません。
そっちのスレに逝きます。
634デフォルトの名無しさん:2005/11/19(土) 15:13:26
ある二つの数の最小公約数と最大公倍数を求めるプログラムを教えてください
635デフォルトの名無しさん:2005/11/19(土) 15:38:34
Linuxでenterのコードってなにになりますか?
636デフォルトの名無しさん:2005/11/19(土) 15:45:19
http://www.kumei.jp/c_lang/bcc/bcc_03.htm

>コマンドラインでカレントディレクトリをwin01.cppのあるディレクトリにしておきます。そこで、
>bcc32 -W -eRelease\win01.exe win01.cpp
>と打ち込みます。

次に、指示通り-w-8057を打ち込みましたが
Releaseフォルダの中にwin01.exeは現れませんでした。
637デフォルトの名無しさん:2005/11/19(土) 16:01:54
>>636
そのコマンドを打って何かメッセージは出るだろ。それを書き写せ。
638636:2005/11/19(土) 16:10:21
bcc32 -W -eRelease\win01.exe win01.cppを打ち込んだ後↓

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
エラー E2075: コマンドライン オプションの間違い : -W -eRelease\win01.exe
639デフォルトの名無しさん:2005/11/19(土) 16:16:38
>>634
ヒント

while (tmp = (x % y)) {
x = y;
y = tmp;
}
return y;
640デフォルトの名無しさん:2005/11/19(土) 16:18:14
>>638
全角空白を使うな。
641636:2005/11/19(土) 16:52:36
>>640
出来ました。
本当にありがとうございました。
642デフォルトの名無しさん:2005/11/19(土) 17:00:27
とある事情から、有効桁数が30桁である拡張倍精度実数型を使いたいのですが、
long double型の使用方法で大変困窮しております。

変数に小数点の値を代入して%.30lfで表示させても-0.000(以下略 と表示されてしまうのです。
また、long doubleがdouble型と同等の有効桁数しか扱わないという話も聞きます。

C言語における確実な有効桁数30桁レベルの拡張倍制度実数型を使う方法をご教示下さい。
643デフォルトの名無しさん:2005/11/19(土) 17:13:08
>>642
少なくとも型の大きさは処理系定義,つまりコンパイラ次第。
たとえばVC++でのlong doubleとdoubleは同一の大きさ(64bit倍精度)という場合もある。
644デフォルトの名無しさん:2005/11/19(土) 17:22:07
現在使用しているのはボーランドのc++ 5.5です。
doubleは確実に15桁程度なので、もしlong doubleが15桁程度であるのなら、
確実に30桁ある拡張倍精度実数型を使用する方法をご教示いただきたく思います。
645デフォルトの名無しさん:2005/11/19(土) 17:47:42
>>644
こういった浮動小数点数型の情報は<float.h>を見ればある程度はわかる。
仮数部の桁数はXXX_DIGの定義を見ればわかる。(XXXにはFLT/DBL/LDBLを当てはめる)
俺もBCCを持っているので見てみると、こうなっている。
#define DBL_DIG             15
#define FLT_DIG             6
#define LDBL_DIG            18
……。はい残念でした。ちなみにBorlandのlong doubleは80bit。
x86の浮動小数点数のメモリ読み書きの命令は32, 64, 80bitを受け付けて、レジスタ上では全て80bitで保持している。
(だからほとんどのx86用の処理系ではfloat/double/long doubleの大きさは32/64/80bitになっている)

つまりCPUに頼らず自分でどうにかするしかない。
646デフォルトの名無しさん:2005/11/19(土) 17:56:39
ご教示いただき有難う御座いました。
自分なりの解決方法を模索してみます。
647636:2005/11/19(土) 17:59:40
http://www.kumei.jp/c_lang/bcc/bcc_04.htm
>これで、プログラムができあがりです。テストランするには、メニューの「実行」「実行」を選択します。

実行が灰色になってて選択できません。
それまでは手順どおりにやったので大丈夫かと思います。
648636:2005/11/19(土) 18:50:27
>>647
自己解決しました。
649デフォルトの名無しさん:2005/11/19(土) 19:01:10
ex1は落ちないのにex2で落ちます。bCC32です。gccなんかだと落ちません。
トレースするとreturn d;で落ちてるようです。
原因が分かりません。
NANやINFだとしても、returnで落ちることは無いと思うんですが。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double ex1(void)
{
return pow(3.4, 567) * pow(10, 10);
}
double ex2(void)
{
double a, b, c, d;

a = 3.4;
b = 567;
c = pow(a, b);
d = c * pow(10, 10);

return d;
}
int main(void)
{
printf("ex1:\n");
ex1();
printf("ex2:\n");
ex2();
return EXIT_SUCCESS;
}
650デフォルトの名無しさん:2005/11/19(土) 19:13:16
整数の引数を文字列に変えてくれるCの標準関数はありませんか?
atoi()の逆のことがやりたいのです。

fprintf()の最初の引数が FILE* でなくて char* になってるようなのを
探しているのですが。
651デフォルトの名無しさん:2005/11/19(土) 19:16:42
sprintf
652デフォルトの名無しさん:2005/11/19(土) 19:19:53
>>651
ありがとうございました。
653デフォルトの名無しさん:2005/11/19(土) 20:54:41
>>634
それって1と無限大を返せばいいんじゃねぇの?
654デフォルトの名無しさん:2005/11/19(土) 22:07:26
scanf の format部分についてなんですけど、
scanf("%d%d",&a,&b);
としたときに入力をホワイトスペースで区切らなきゃいけないのはなんで?

感覚的にはそうじゃなきゃ入力から代入できないなとは思うんだけど、
scanf("%d%c%d",&a,c,&b);
ではホワイトスペースで区切らなくても代入できる。
これはformatで変換指定で%cとされてるから次に来るのが文字と
内部的に判断されてるからなんですかね?
655デフォルトの名無しさん:2005/11/19(土) 22:07:36
returnはシステムに値を返すだけだッ
656デフォルトの名無しさん:2005/11/19(土) 22:08:11
scanf("%d%c%d",&a,c,&b);
→scanf("%d%c%d",&a,&c,&b)でした
657デフォルトの名無しさん:2005/11/19(土) 22:29:04
>>656
%c(とたしか%[]系)は空白類文字も読み込む仕様。
その他の書式指定は空白類文字を読み飛ばす仕様。
658デフォルトの名無しさん:2005/11/19(土) 22:35:13
int test(int a,int b)
{
int c=1;
while (c)
{
c=a%b;
a=b;b=c;
}


このプログラムなんですが。while(c)とはどういう意味ですか?
659デフォルトの名無しさん:2005/11/19(土) 22:37:04
>>658
c
という式が真(0以外)か偽(0)を評価して、
真ならば{}内を実行、偽ならば実行しない。
この場合cに1が代入されてるから実行する。
660デフォルトの名無しさん:2005/11/19(土) 22:43:34
>>659
分かりましたありがとうございます
661デフォルトの名無しさん:2005/11/19(土) 23:07:35
//暗号キーの入力
printf("暗号キーを入力してください>");
scanf("%s",key);
keylen=strlen(key);

//原文ファイル(入力ファイル)オープン
fp=fopen(filename,"rb");
if(!fp){
printf("エラー1ファイルオープンエラー\n");
exit(1);
}
printf("原文ファイルオープン完了\n");

662デフォルトの名無しさん:2005/11/19(土) 23:09:02
//暗号化ファイル(出力ファイル)オープン
strcpy(outfilename,filename);
strcat(outfilename,"_");
if(!wfp){
printf("エラー2ファイルオープンエラー\n");
exit(1);
}
printf("暗号化ファイルオープン完了\n");

//暗号化
while (fread(&ch,sizeof(char),1,fp)==1){
printf("ステップ1完了\n");
ch=ch+key[i++];
printf("ステップ2完了\n");
if(i>=keylen){i=0;}
printf("ステップ3完了\n");
fwrite(&ch,sizeof(char),1,wfp);
}
printf("暗号化完了\n");

fclose(wfp);
printf("wfpクローズ完了\n");
fclose(fp);
printf("ファイル%sを暗号化しました\n",filename);
printf("作成ファイル:%s\n",outfilename);
return 0;
}

ステップ3完了のところでエラーがでるので
fwrite(&ch,sizeof(char),1,wfp);が悪さをしているのはわかったのですがそこからがわかりません。
よろしくおねがいします。
663誤爆してしまましたこれが一番上にきます:2005/11/19(土) 23:09:50
ファイルを暗号化するプログラムを書いているんですがコンパイルして実行してみると
問題が発生したためとの趣旨で終了させられます。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<dir.h>

main(int argc,char*argv[]){
char ch;
FILE *fp;
FILE *wfp;
char filename[256];
char outfilename[256];
char key[128];
int keylen;
int i=0;

//原文ファイル名の決定
if(argc > 1){
strcpy(filename,argv[1]);
}else{
printf("ファイル名を入力してください>");
scanf("%s",filename);
}
664デフォルトの名無しさん:2005/11/19(土) 23:15:12
wfpにfopenしてなくないか?
665デフォルトの名無しさん:2005/11/19(土) 23:21:33
してます
666デフォルトの名無しさん:2005/11/19(土) 23:22:24
どこで?
667デフォルトの名無しさん:2005/11/19(土) 23:45:09
if(!wfp){
printf("エラー2ファイルオープンエラー\n");
exit(1);
}
668デフォルトの名無しさん:2005/11/19(土) 23:46:25
なんだネタか
669デフォルトの名無しさん:2005/11/19(土) 23:53:00
fopenはどこ?
てか、誤爆した挙句ネタなのかよ
670デフォルトの名無しさん:2005/11/20(日) 09:42:25
>>664
ありがとうございます。
strcpy(outfilename,filename);
strcat(outfilename,"_");
wfp=fopen(outfilename,"wb");
if(!wfp){
でおkみたいです。fopenし忘れる初歩的なミスでスレを汚してしまいました。
すいませんでした。
671デフォルトの名無しさん:2005/11/20(日) 20:17:53
printf( "\\ is escape letter\n");

などと書いた場合に、エスケープシーケンスの部分\\の解釈
はプリプロセッサが行うのでしょうか?
672デフォルトの名無しさん:2005/11/20(日) 20:19:44
いいえ
673デフォルトの名無しさん:2005/11/20(日) 20:20:44
ビルゲイツが行います
674671:2005/11/20(日) 20:21:53
コンパイラが行うのでしょうか?
675デフォルトの名無しさん:2005/11/20(日) 20:24:41
はい
676デフォルトの名無しさん:2005/11/20(日) 20:25:58
いいえ
677デフォルトの名無しさん:2005/11/20(日) 20:26:04
ウインドウを表示するプログラムをコンパイルしたのですが、
外部シンボル ’_main’が未解決 (C:\borand\bcc55\lib\cox32.obj が参照)
っていうエラーがでます。
どういう意味ですか?
678デフォルトの名無しさん:2005/11/20(日) 20:30:06
WinMain()がスタートアップだったら、コンパイラオプションでなんか指定してやらんといかんかったはず。
当該スレへ。
679677:2005/11/20(日) 20:32:33
難しいですね・・・。
とりあえずCスレではないのですね。ありがとうございました。
それでは逝ってきます。
680デフォルトの名無しさん:2005/11/20(日) 21:06:09
すみません。ある文字列を配列に入力してenterキーが入力されたらそこに!
をいれて表示するっていうプログラムを関数つかって作ったんですけどSegmentation faultってでてしまうんです。ちなみにLinuxです。
悪いところを教えてください。
#include <stdio.h>
char ho(char ho[20])
{
int i;
while(ho[i]=11)
{
ho[i]=33;
}
return ho[20];
}
int main()
{
int i;
char na[20],s[20];
for(i=0;i<20;i++)
{
na[i]=0;
}
printf("文字列を入力->");
scanf("%s",na);
s[20]=ho(na);
printf("%s",&s);
}
681デフォルトの名無しさん:2005/11/20(日) 21:08:55
まあ・・・きちんと本を読むのがいいぞ。うん。
682デフォルトの名無しさん:2005/11/20(日) 21:12:43
20文字確保したら、インデックスは0-19しか使えないよ。
683デフォルトの名無しさん:2005/11/20(日) 21:15:30
なんか日曜の夜に激しい釣りを見ているキガス。

とりあえず、return ho[20]は何のために書いた?
s[20]=ho(na)も。
684680:2005/11/20(日) 21:18:12
Linuxでenterキーのアスキーコードは72でいいんですよね?
Segmentation faultってことは
メインと関数の間で受け渡しがうまくいってないってことですか?
685デフォルトの名無しさん:2005/11/20(日) 21:21:40
ホント釣り名人だね680は
Segmentation fault の直接の原因は ho関数先頭の int i の初期化忘れ。
686680:2005/11/20(日) 21:35:08
s[20]=ho(na)ってのはna配列についてho関数を使うってことで
return ho[20]ってのはho関数の結果として返してるってことですよね?
あと初期化したら入力の時点で回り続けるようになりました。
687デフォルトの名無しさん:2005/11/20(日) 21:48:42
s[20]=ho(na)ってのはna配列についてho関数を使うってことで
return ho[20]ってのはho関数の結果として返してるってことですよね?

s[20]=ho(na)ってのは20要素確保されたsの21番目にhoの返り血を代入するってことで
return ho[20]ってのは引数hoの21番目の要素を返すってことです。

>入力の時点で回り続けるようになりました。
要するに無限ループに陥ったと。= と == の違いについて調べたまへ。
688デフォルトの名無しさん:2005/11/20(日) 22:05:50
16進数を2進数に変換して文字列として格納するんですが、
0x12341234 => 00010010 00110100 00010010 00110100
のようにバイトに区切って1バイト毎に格納するプログラムを作りたいんです。
単純に2進数に変換するだけならできるんだけど区切る方法が思いつかなくて・・・お願いします
689デフォルトの名無しさん:2005/11/20(日) 22:08:28
このスレの激初心者は飾りか?
激初心者を誘っといて釣り呼ばわりしてストレス解消とはたちの悪い奴らだな。
690680:2005/11/20(日) 22:10:34
配列として受け取るにはchar ho(char ho[])ってすればいいんですか?
でもそうするとreturnがわかりません。あとメイン側もs=ho(na);に
してみましたがこれでよいのでしょうか?
691デフォルトの名無しさん:2005/11/20(日) 22:13:09
変換したい数をxとして、
単純に1バイトを2進文字列にする関数を引数(x >> 24) & 0xffで呼ぶ
末尾に空白を追加
単純に1バイトを2進文字列にする関数を引数(x >> 16) & 0xffで呼ぶ
末尾に空白を追加
単純に1バイトを2進文字列にする関数を引数(x >> 8) & 0xffで呼ぶ
末尾に空白を追加
単純に1バイトを2進文字列にする関数を引数x & 0xffで呼ぶ
692デフォルトの名無しさん:2005/11/20(日) 22:13:46
>>690
とりあえず言っておくと、配列を返すことは出来ない
693688:2005/11/20(日) 22:14:33
>>691
激サンクス!
694デフォルトの名無しさん:2005/11/20(日) 22:23:09
配列を引数で受け取ることもできない。
引数で渡しているのは、配列先頭を指すポインタ。
695680:2005/11/20(日) 22:24:09
>>692じゃあ配列の中身を返すのを回すのですか?
あとho関数の最初のiの初期化ですがi=1を加えると無限ループになってしまうのですがこれはまちがっているんですか?
696デフォルトの名無しさん:2005/11/20(日) 22:34:18
別の配列に入れたいんなら、その配列も一緒に渡すようにすれば?
ho(na, s)って言う感じに
697デフォルトの名無しさん:2005/11/20(日) 22:47:07
>>689
680みたいなコード見ると昔の自分を思い出して恥ず〜で「釣り」って書いちゃうんだよ
サポートはサポートでやってるんだからそう怒るんって。

>>695
C言語では配列は0から始まる。char na[20]; と宣言したなら、
na[0] から na[19] までが有効な範囲だ。

while(ho[i]=11) というのは ho[i] に 11 を代入した上で
ho[i] がゼロであるかどうかを判別しているので無限ループになる

以前は ho[i] が例えば ho[-38234] とかになってたせいで
Segmentation fault になってたわけだわな。
698688:2005/11/20(日) 22:51:38
すまん、いざ作ってみようと思ったが全然ダメだった・・・
軽くでいいからヒントお願いします・・orz
699680:2005/11/20(日) 22:57:14
もうなにがなんだかわかんなくなったので具体的にどうすりゃいいか
答えおしえてください。ごめんなさい
700デフォルトの名無しさん:2005/11/20(日) 22:59:52
あきらめろ。
701デフォルトの名無しさん:2005/11/20(日) 23:05:05
>680 まあ、誉められた方法ではないが。
int main(void) {char buf[100]; while (gets(buf)) printf("%s!\n", buf); return 0;}
702680:2005/11/20(日) 23:11:35
Linuxとg++だとgetsでエラーがでます。
配列と関数では無理ってことですか
703デフォルトの名無しさん:2005/11/20(日) 23:13:50
>>702
getsはバッファオーバーランなどの危険が伴うから。
fgets使え。
704デフォルトの名無しさん:2005/11/20(日) 23:15:25
あー。エラーちゅうか警告な。メンドイんで、書いてしまった。
int main(void) {char buf[100]; while (fgets(buf, 100, stdin)) printf("%s!\n", buf); return 0;}
705680:2005/11/20(日) 23:18:11
せっかく教えてもらったのにあれだけど>>680をなおしてもらえませんか?
706680:2005/11/20(日) 23:44:30
Linuxのenterってアスキーコードでなにですか?
707デフォルトの名無しさん:2005/11/20(日) 23:55:44
>>706
LF
ただしCではどんな環境でも改行文字は'\n'と定められている。
(たとえばWindowsでは入出力時に\r\nと\nの変換が行われている)
708デフォルトの名無しさん:2005/11/20(日) 23:59:18
バッファオーバーランってなんですか?
具体的にそれがどういうことをされると、どういった危険が伴うんですか?
709デフォルトの名無しさん:2005/11/21(月) 00:05:55
まずはぐぐれ
710デフォルトの名無しさん:2005/11/21(月) 00:07:24
>>708
バッファオーバーランとは本来実行するコードやそこへのアドレスが書かれたメモリにデータが書き込まれてしまうこと。
華麗に悪用されるとクラッカーにプログラムの実行を乗っ取られてしまう。
ウィルスを仕込んだり機密データを読み取ったりその気になれば自由自在。
711デフォルトの名無しさん:2005/11/21(月) 00:20:06
説明が逆だな。間違っちゃいないけど。
712デフォルトの名無しさん:2005/11/21(月) 01:11:15
2つの文字列が同じなら〜を実行っていうプログラムを書きたいんですが
char str1[] = "aaa";
char str2[] = "aaa";
if(str1 == str2){
・・・・

ではうまくいきません
どうすればいいんでしょう
713デフォルトの名無しさん:2005/11/21(月) 01:13:22
>>712
入門書でも読めば?
そんなレベルの質問をずっと続けるつもりですか?
714デフォルトの名無しさん:2005/11/21(月) 01:20:09
ごめんなさい
715デフォルトの名無しさん:2005/11/21(月) 01:33:51
そして誰も来なくなった
716デフォルトの名無しさん:2005/11/21(月) 01:43:32
ここは激初心者にやさしくないスレですね。
717デフォルトの名無しさん:2005/11/21(月) 01:44:33
バッファーオーバーランはどうやって埋め込んだコードを実行するのか知らなかったので
調べたらこれが分かりやすかった
http://www.ipa.go.jp/security/awareness/vendor/programming/b06_01.html
スタックの構造知ってたら当たり前のことなのね・・・

>>712
ヒント:strcmp
718デフォルトの名無しさん:2005/11/21(月) 01:45:58
>>712
char str1[ ] = {aaa};
以下同様に...
719デフォルトの名無しさん:2005/11/21(月) 01:51:27
>>717
ありがとうございます。
一文字ずつ比べてたorz
720デフォルトの名無しさん:2005/11/21(月) 22:24:20
文字列の入力でEOF文字が入力されると処理を終了するってのを作りたいんだけど、
判定文って
scanf("%s" , str ) == EOF
じゃだめなの?
721デフォルトの名無しさん:2005/11/21(月) 23:35:43
scanf は引数の解析がワヤなねんの意味でEOFを返すんで
終了させたかったら CTRL+Z なり CTRL+D なり打ってってね、
という了解の上ならそれで良いんじゃないの。
722デフォルトの名無しさん:2005/11/22(火) 00:52:51
止めた方がいいと思うなぁ。
723デフォルトの名無しさん:2005/11/22(火) 10:02:20
#defineで定義するマクロに、配列を引数として使うにはどうしたらいいんですか?
724デフォルトの名無しさん:2005/11/22(火) 10:50:04
先ずは初心者らしく、やりたいことを具体的に書きなさい。
725デフォルトの名無しさん:2005/11/22(火) 14:02:46
先生方すいません、質問です。
計算結果を出力しようとしたら
1.#QNANO
って出るんですが↑ってどうゆうことですか?
726デフォルトの名無しさん:2005/11/22(火) 14:06:14
先ずは初心者らしく、問題のプログラムを貼りなさい。
727デフォルトの名無しさん:2005/11/22(火) 14:11:31
printf("1.#QNANO\n");
728デフォルトの名無しさん:2005/11/22(火) 14:21:47
すいません。
プログラムがかなり長いので‥w
printf("%3f %f\n",s,ins[i]);
↑でsの値とins[i]に格納した値を出力しようとしたら
0.001000 1.#QNANO
と出力されてしまいましたw
729デフォルトの名無しさん:2005/11/22(火) 15:09:20
>>728
恐らく、ins[i]がfloat型かdouble型じゃないか、配列の中身が壊れているんジャマイカ。
直前にins[i] = 0;すれば0が出力されるはずだ。
或いは、ins[i] + ins[i]を出力しようとしてみても何かわかるかも知らん。
730728:2005/11/22(火) 15:25:24
>>729
レスありがとうございます!
ins[i]はdouble型です。
ins[i]=0;を直前にいれると
0.001000 0.0000000
と出力しました。
ins[i]+ins[i]を出力しようとすると
0.001000 1.#QNANO
と出力されてしまいました。。
731デフォルトの名無しさん:2005/11/22(火) 15:43:36
>>730
そうなると、配列の中身が壊れている。
壊れている原因はこんなもんかな。
・0割り算した結果が格納された
・初期化されていない
・他の配列操作か何かで上書きされた
732デフォルトの名無しさん:2005/11/22(火) 16:22:36
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>

#define LINE_BUF 80
#define LOG_ARRAY 1000

using std::cin;
using std::cout;
using std::endl;

int space(char*src){
int n;
if(src==NULL){
return 0;
}
for(n=0;n<strlen(src);n++){
if(src[n]==' '){
return n+1;
}
else if(src[n]=='\t'){
return n+1;
}
}
return 0;
}

int comp(const void *p1, const void *p2){
return( *(int *)p1 - *(int *)p2 );
}
733デフォルトの名無しさん:2005/11/22(火) 16:23:58
int main(){
char src[LINE_BUF];
int line,z,n;
FILE* fp=fopen("AHO.txt","r");
n=sizeof(src)/sizeof(src[0]);
if(!fp){
printf("File open error\n");
return 0;
}
for(line=0;fgets(src,sizeof src,fp)!=NULL;line++){
z = space(src);
qsort(z,81,sizeof(src[0]),comp);
cout << z <<endl;
}
fclose(fp);
return 0;
}

このプログラムをコンパイルしようとすると,test.cpp:44: error: invalid conversion from `int' to `void*'というエラーが出ます。
どこを手直しすればよろしいのでしょうか?よろしくお願いします。
734デフォルトの名無しさん:2005/11/22(火) 16:32:30
>>733
>どこを手直しすればよろしいのでしょうか
該当個所だけでなく、あちらこちら。
配列について勉強しなおせ。
735デフォルトの名無しさん:2005/11/22(火) 16:56:38
printf()のような可変個数の引数をとる関数のラッパー関数の
作り方を教えてください。例えば Wprintf()というものを

int Wprintf(int a, const char *format,...)
{
if(a < 0) return -1; /* もし第1引数が負ならば即終了 */
else printf(format,...); /* ここで第2引数以下全てをprintf()に渡したい */

return 0;
}

な感じにしたいんですが printfにどうやって第2引数以下全ての引数を渡せばいいんでしょうか。
736デフォルトの名無しさん:2005/11/22(火) 16:57:25
>>735
つ[vprintf()]
737デフォルトの名無しさん:2005/11/22(火) 17:16:12
>>733
第1パラメータ。
なんだけど、どうやら数値と文字列の区別がついてない模様。
738728:2005/11/22(火) 17:19:39
>>731
台形公式を使った定積分の数値計算なので
式のどこかで0で割ってしまっているかもしれません。
初期化、上書きは問題ないようなので
もう一度式を洗い直してみます。
ご教授ありがとうございました!
739デフォルトの名無しさん:2005/11/22(火) 17:35:01
IPを収得する方法がわかりません
どなたか教えてください
740デフォルトの名無しさん:2005/11/22(火) 17:42:33
>>736
ありがとうございます。解決しました。
741伝説新人タクシ:2005/11/22(火) 18:19:20
>>739
MSDOSでnslookupと打てばわかる。もしくは、教えてくれるサーバに行く。
マジレスすると、DNSサーバに問い合わせる。
ポート番号は・・・・。
742デフォルトの名無しさん:2005/11/22(火) 19:02:39
>>741
すみません言葉不足でした。
自PCのIPアドレスを収得したいのですが?
743デフォルトの名無しさん:2005/11/22(火) 19:08:29
前回のリターン入力から今回のリターン入力までの経過時間を測定したいのですが
リターンをそれぞれ読み込むにはどのようにすればいいでしょうか。
744デフォルトの名無しさん:2005/11/22(火) 19:17:56
>>742
必ず127.0.0.1と決まっています。
745739:2005/11/22(火) 19:27:01
解決しました、
本当にありがとうございました
746デフォルトの名無しさん:2005/11/22(火) 21:06:18
>>743
getchar 使うのが一番わかりやすいかな?
int c;
while ((c = getchar()) != EOF) {
if (c == '\n') {
/* ここで時間を計る */
}
}
747伝説新人タクシ:2005/11/22(火) 21:15:50
>>739
Cプログラムでないなら、板違い。質問すれをすすめます。
127.0.0.1も間違ってはないが>>739はなんで知りたかったんだろう。
748デフォルトの名無しさん:2005/11/22(火) 21:28:39
728さんは納得して去っていったみたいだけど・・・
QNANDって "Quiet Not A Number Division" 例外のことで合ってますよね?
749デフォルトの名無しさん:2005/11/22(火) 23:35:32
2次元配列で文字列を出力したいのですが
printfで確かめてる最中、変な事が起きました

#include <stdio.h>
#include <string.h>
int main(void) {
int i;
char s1[999][999];
for( i = 0; i < 10;i++ ) {
scanf("%s\n",s1[i]);
printf("%s\n",s1[i]);
}
return(0);
}

これで実行してみると、最初に文字列を入力しても出力しないで、次の文字列を入力すると
一個前の文字列が出力されてしまいます。
scanfをgetsに変えたら順次出力されたのですが、これはなんででしょうか
750デフォルトの名無しさん:2005/11/22(火) 23:45:59
>>749
・scanf()の仕様をよく読んでください。
#改行コードは何のためにつけているのですか?
・gets()は使ってはいけません。
#代わりにfgets()が使えます。
・配列の要素数が999個というのは何のメリットもありません。
#判りやすく1000個としてみては如何でしょうか。
751デフォルトの名無しさん:2005/11/22(火) 23:49:44
>・scanf()の仕様をよく読んでください
ごめんなさい、よくわかりません

>・gets()は使ってはいけません。
今のところ学校でscanfとgetsしか習ってないもので

>・配列の要素数が999個というのは何のメリットもありません。
解りました、1000にしてみます
752デフォルトの名無しさん:2005/11/22(火) 23:56:30
>>751
scanf( 書式指定文字列 , アドレス);
753デフォルトの名無しさん:2005/11/22(火) 23:58:50
>751は天然なのか、意図的に>750の#行を読み飛ばしているかのようだ。
754デフォルトの名無しさん:2005/11/23(水) 00:03:41
scanfって仕様が難しいのによく最初に教えるもんだな
755デフォルトの名無しさん:2005/11/23(水) 15:01:19
CとC++って何か違うのですか?
Borland C++ Compiler というのでCのコンパイルはできますか?
756デフォルトの名無しさん:2005/11/23(水) 15:14:15
WindowsXPでバックスラッシュの半角がだせません。誰か教えてくれませんか?
757デフォルトの名無しさん:2005/11/23(水) 15:21:23
\
758デフォルトの名無しさん:2005/11/23(水) 16:11:06
たとえばn=4と入力した時に

*
**
***
****

↑このように出力するプログラムはどうやって作ればいいんでしょう。どなたか教えてください('A`)
759デフォルトの名無しさん:2005/11/23(水) 16:25:25
>>758
それを他人に図を使わずに説明しようと試みてください。
ほぼそれがプログラムになります。
760758:2005/11/23(水) 16:31:01
>>759
自己解決しました。ありがとうございます。
761デフォルトの名無しさん:2005/11/23(水) 16:31:34
fgets(buf, 256, stdin);
sscanf(buf, "%d %d %d %d %d %d", &a[0],&a[1],&a[2],&a[3],&a[4],&a[5]);

こんな風にfgetsで1行取り込んだあとbufから多くの数字を取り出したいときに配列の添え字を直接数字でなく
for(i=0;i<MAX; i++) func(buf, "%d ", &a[i]); 
のような形で取り出す方法あります?
上記func部をsscanfにしてみてもbufの最初の数字を何回も配列に放り込んでいくだけにしかならないんですが。
762デフォルトの名無しさん:2005/11/23(水) 16:55:11
>>761
strtok でトークンを切り出して atoi で変換というのが方法の一つですね。
それから質問は揚げていきましょう。
763デフォルトの名無しさん:2005/11/23(水) 16:56:52
>>761
sscanfだと無理なんじゃないかな。
数値のみならstrtolでループ回せば出来る。
764デフォルトの名無しさん:2005/11/23(水) 16:58:25
>>761

int a[20];
int idx;
int cnt;
char buf[100];
char * str;
str = fgets(buf, sizeof(buf), stdin);
do {
cnt = sscanf(str, "%d%n", & a[ic], & idx);
if (cnt > 0) {
++ic;
}
str += idx;
} while (cnt > 0);
765デフォルトの名無しさん:2005/11/23(水) 16:59:02
初心者相手だからって、随分程度低いのが多いなぁ。
766761:2005/11/23(水) 17:20:55
>>762-764
ありがとうございます。
試してみます。
767デフォルトの名無しさん:2005/11/23(水) 19:11:24
757に補足すると日本語フォントでは半角バックスラッシュの位置に半角円記号が搭載されているから\で良いということになる。

>>755
できる。拡張子cだとCとしてコンパイルされて、拡張子がcppなどだとC++としてコンパイルされる。
けれどCの勉強をするのであっても基本的には拡張子cppにしてC++コンパイルにするほうが良い。
なぜならC++のほうがエラーチェックが厳しくなっているから。
768デフォルトの名無しさん:2005/11/23(水) 20:32:36
>>767
馬鹿に馬鹿な事を言うな馬鹿
769デフォルトの名無しさん:2005/11/23(水) 21:21:25
#include <stdio.h>

main [] {
printf["c programming"];
return 0;
}

↑これを実行すると
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample.c:
エラー E2141 sample.c 3: 宣言の構文エラー
*** 1 errors in Compile ***

とエラーがでます
どうすればいいのでしょうか?
770デフォルトの名無しさん:2005/11/23(水) 21:22:44
下のようなプログラムを作りました。

#include<stdio.h>
#include<math.h>
#define N 100
void main()
{
int i,n;
double s,ss,average,variance,sigma,w;
double a[N+1];
/*データの個数の入力*/
printf("データの個数を入力してください\n");
printf("n=");
scanf("%d",&n);
/*安全装置*/
if (n>N)
exit(1);
/*データの入力*/
for (i=1; i<=n; ++i) {
printf("a[%d]=",i);
scanf("%lf",&a[i]);
}
s=0.0;
771デフォルトの名無しさん:2005/11/23(水) 21:23:11
>>769
[]を()に置き換えろ。
772デフォルトの名無しさん:2005/11/23(水) 21:23:18
コンパイルの仕方がわからん?
773770:2005/11/23(水) 21:23:23
(770の続き)
/*データの和の計算*/
for (i=1; i<=n; ++i)
s+=a[i];
average=s/n;
printf("平均値 %lf \n",average);
for (i=1; i<=n; ++i) {
w=a[i]-average;
ss+=w*w;
}
variance=ss/n;
printf("分散 %lf \n",variance);
sigma=sqrt(variance);
printf("標準偏差 %lf \n",sigma);
}
774770:2005/11/23(水) 21:26:04
実行すると、分散と標準偏差が+NANと表示されてしまいます。
何かプログラムに問題があると思うんですが・・・どなたかご指摘よろしくお願いします。
775デフォルトの名無しさん:2005/11/23(水) 21:31:00
>>774
多分入力時の改行コードの問題。
配列をクリアもしてないからわけわからん値での計算になる。
776デフォルトの名無しさん:2005/11/23(水) 21:31:33
>>771
できました、ありがとうございます
半角入力の時に()を打つときはどうすばいいのでしょうか?
さっきはコピペで済ませましたが・・・
777デフォルトの名無しさん:2005/11/23(水) 21:35:46
>>776
IMEをOFFにしてShift+8や9でできるだろ。全角と何か違いがある?
778デフォルトの名無しさん:2005/11/23(水) 21:37:28
>>777
8と9に()があるのに気づきませんでした('A`)
全角括弧にしたらエラーがでたので
どうもありがとうございます
779デフォルトの名無しさん:2005/11/23(水) 22:30:11
ソースファイル自動整形ツールでいいのありませんか?
780デフォルトの名無しさん:2005/11/23(水) 22:44:11
>>774 doubleは%fだッ
781デフォルトの名無しさん:2005/11/23(水) 23:13:15
すみません。急遽仕事でC++をやることになって最近勉強を開始した
初心者です。いくつか疑問点に教えていただけないでしょうか。
派生クラスのメソッドが基本クラスのメソッドを呼び出せるのは分かるのですが
逆はできるのでしょうか?
あるメソッド内で宣言されたオブジェクトはそのメソッドを抜けたら自動的に消えるのですか?
消えるとしたらオブジェクトのメンバのデータも一緒に消失するのですか?
あるメソッド内でnewで動的に取得された構造体配列を他のメソッドから参照できるようにすることは
可能ですか?
以上、どうか宜しくお願いいたします。
782デフォルトの名無しさん:2005/11/23(水) 23:19:45
>>781
virtualメソッドでオーバーライドすればいい。
ローカル定義は消える、ヒープだと消えない。
クラスの定義次第だが、普通デストラクタで消す。
可能。っつーか、できなきゃ何のためにクラス変数があるのかわからん。
783デフォルトの名無しさん:2005/11/23(水) 23:26:27
>>781
(1)限られた状況で可能。
(2)(3)オブジェクトは関数などのスコープを抜けると、クラスで
あればデストラクタが呼び出されて、そのオブジェクトによって
静的に確保された領域が開放される。
(4)あるメソッド内で動的に確保された領域へのポインタを保存して
おけば、できる。ただし、デストラクタでの開放を忘れないように。

スレ違い。
784デフォルトの名無しさん:2005/11/23(水) 23:33:44
>>782
すばやいお返事ありがとうございました。調べてみたいと思います。
最後の質問についてなんですが、クラス変数に構造体配列を設定できる
ということでしょうか。
その場合配列の大きさはメソッドから動的に定められるのですか?
定められるとしたらキーワードだけでもいいので方法を教えて
いただけないでしょうか。
この点だけお願いいたします。
785デフォルトの名無しさん:2005/11/23(水) 23:45:02
>>783
時間差でレスしていただいたんですね。
ありがとうございました。調べてみます。
786デフォルトの名無しさん:2005/11/24(木) 00:14:27
>>784
配列の大きさは配列の大きさを持つ変数を別途用意する。
787デフォルトの名無しさん:2005/11/24(木) 03:49:32
厨がツクールでやりがちなこと3
http://game10.2ch.net/test/read.cgi/gameama/1132046031/832-
ここID:HS4B3ahIの言ってる事ってC言語使い的にどんなかんじ?

871 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2005/11/24(木) 03:40:45 ID:HS4B3ahI
>>867
あんなぁ、ゲーム会社ならミドルウェアとか買うのが今デフォらしいが
趣味ゲー作りの奴がそんなん買うかよ。
使うにしてもフリーのもん使うに決まってるだろ。

>>869
ウゼー、ホレ

#include <stdio.h>
int main(){ printf("ID:HS4B3ahI\n"); return 0; }
788デフォルトの名無しさん:2005/11/24(木) 16:03:33
すいません、質問です。
PDFファイルを開いて、VC++で作った画面に表示をさせたいのです。
そのためには、Acrobat SDKを使用すれば可能でしょうか?
それとも、Acrobat SDKを使用しないでAPIみたいのがあるのでしょうか?
789デフォルトの名無しさん:2005/11/24(木) 16:40:50
そもそもAcrobat SDKには何が入っているかは知らないけど、
少なくともPDFはオートメーションサーバになっているはずだから、
その気になればVC++付属のPratform SDKだけでもできる。
790デフォルトの名無しさん:2005/11/24(木) 17:28:56
>>788
まず、PDFのファイル構造を理解しているのか?と問いたい。


# 後、自力で解析すればどうにでもなる。
791デフォルトの名無しさん:2005/11/24(木) 18:24:43
scanfを使って数字を代入すると勝手に改行してしまうんですけど
改行させない方法があれば誰か教えてください。
792デフォルトの名無しさん:2005/11/24(木) 19:45:12
int *p = NULL;
p = new int[0];
とするとpはどうなるんでしょうか
793デフォルトの名無しさん:2005/11/24(木) 20:31:09
>>792
要素のない配列が割り付けられる。By X 3014:2003 (ISO/IEC 14882 :2003)
だからC++はスレ違いっだってば!
794デフォルトの名無しさん:2005/11/24(木) 23:19:50
二次元配列で
new[5000][5000]くらいのでっかいの作りたいのですが、どうもうまくいきません
intやdoubleで宣言して

どうやったら大きな配列が確保できるでしょうか
795デフォルトの名無しさん:2005/11/24(木) 23:22:12
リンカオプションでスタックサイズを変えるか、
malloc等で動的確保。
796デフォルトの名無しさん:2005/11/24(木) 23:30:47
#include <stdio.h>
int main(void){
char c; int i; long l; float f; double d;
char ac[5000][5000];/* Array of Char */
int ai[100][200];/* Array of Int */
double ad[120][200];/* Array of Double */

printf("# Basic Type\n");
printf("char:\t%d\n",sizeof(c));
printf("int:\t%d\n",sizeof(i));
printf("long:\t%d\n",sizeof(l));
printf("float:\t%d\n",sizeof(f));
printf("double:\t%d\n",sizeof(d));

printf("# Array\n");
printf("char array:\t%d\n",sizeof(ac));
printf("int array:\t%d\n",sizeof(ai));
printf("double array:\t%d\n",sizeof(ad));

printf("# Array Number\n");
printf("char array #:\t%d\n",sizeof(ac)/sizeof(char));
printf("int array #:\t%d\n",sizeof(ai)/sizeof(int));
printf("double array #:\t%d\n",sizeof(ad)/sizeof(double));
}

こういうので仮に2次元配列の容量を見ようとしたらとまって
797デフォルトの名無しさん:2005/11/24(木) 23:34:16

だから、でかすぎるんだよ
798デフォルトの名無しさん:2005/11/24(木) 23:37:39
#include <stdio.h>
#include <stdlib.h>
#define SIZE (100)
int main(void) {
int a[1000][1000];
int i;
int *k;

k=(int *)malloc(SIZE*sizeof(a));
if(a==NULL) exit(-1);

for(i=0;i<SIZE;i++){
printf("[%2d]%d\n",i,k[i]);
if(i%10==9)
printf("\n"); }

free(k);
}

これだと落ちます
どうにかしてでかい配列扱いたいのですが
799デフォルトの名無しさん:2005/11/24(木) 23:38:42
>>796
関数内で宣言した変数のために使えるメモリは意外と小さい。(通常1MiBytes程度)
動的確保するのが理想だが,とりあえずは796の配列変数を全て静的変数にしてみろ。
char ac[5000][5000];→static char ac[5000][5000];
800デフォルトの名無しさん:2005/11/24(木) 23:40:47
>>798
> int a[1000][1000];

どうしてこれ残してるんだよ。
801デフォルトの名無しさん:2005/11/24(木) 23:42:16
>>799
できたできたー
今まで悩んでいたのがウソのようだ
助かりました、ありがとぅ〜
ありがとありがとありがと
802デフォルトの名無しさん:2005/11/25(金) 03:54:44
C言語は 独学で学べますか? 独学では限界がありますか? よく本屋にいろいろありますが 読んでもあまりよく分かんないです やっぱり独学は難しいですかね
803デフォルトの名無しさん:2005/11/25(金) 06:05:05
お前には無理だ
804伝説新人タクシ:2005/11/25(金) 13:24:12
坊やだからさ。
Aはふつう教えてないけど、でも学校で教えるのはBまでさ。
Cは自分でしなさい。Dは・・・・。っと
ここにもゆとーり教育の成果物が出てるな。
自分でしねえ、できねえヤシができるようになるわけねぇだろが。バカwww
そのコメントは「独学じゃあ無理ですよね!」って言いたげだな、ヲイ。
貴様が理解できない理由は 独 学 の せい じゃ な い。
あまり分からないだって?実際はまったく分からないんだろう。
学校とかで教えている内容のほうが屑だぞ。
まあ、勉強でも何でもして視野を広げられるようにしたほうがいいよ。
805デフォルトの名無しさん:2005/11/25(金) 13:28:49
どこが 激初心者スレ なんだよ 結局叩くやつしかいないじゃん 典型2ちゃんって感じ
806デフォルトの名無しさん:2005/11/25(金) 13:30:36
>>802
無理ですから、専門学校に行って下さいね。
807伝説新人タクシ:2005/11/25(金) 13:45:53
>>805
勉強することは自信が持てたり、視野が広がったり、
多くのものを得られるのは事実だろう。
しかし、だからこそ教えてやらねばならんのだが扱いが>>802のように
難しいリアル厨などがいる。
彼らは勉強の方法すらその前にして自分も世界も若さゆえに知らんのだ。
2chとて礼節を弁え、スレを尊ばんとする者も居る。
さりとて、住人もリアルに生きているし、>>802のような若人には
厳しさも肝要。知らずにマルチもするだろう。
君も何れ大人になれば分かるときがくる。
808デフォルトの名無しさん:2005/11/25(金) 16:50:18
>>802
独学でも出来る
とりあえず、Linuxとかgnuのソースでも持ってきて何か一つ解析してみれば?
それが終ったら自分でそれのコピーを自分で書いてみる
これが出来れば大丈夫

809デフォルトの名無しさん:2005/11/25(金) 18:17:47
こらこら,みんな大げさすぎる。
810半人前:2005/11/25(金) 23:37:49
初めてのCとかCの絵本とか買え。
とりあえず初心者向け。
それと解らないのは読んでるからだ。
プログラムなんかやったことないやつが読んで理解できるわけないだろ。
ある程度基礎積んでるから他の言語の本読んでもわかる人いるけど
まるっきり初心者なら本買ってきて実際ににやりなさい。
ただ気をつけてほしいのは本に書いてるのをやると実際動く。
それで理解した気にならないでほしい。本のは正解、動いて当然。
それよりもどこがどうなって動いたのか、読み解けるようになれ。
まぁ、それが解析と言うやつだ。それが出来るようになったら、別の本を買え。
君がどこまでマスターしたいのか知らんがC言語における一般的なマスターと言うのは
プログラミング言語C ANSI規格準拠 第2版
を読み解けることだと私は思っている。

最後に二言、美しいプログラムを書け。
見てごちゃごちゃしてるプログラムは動くかどうかもわからない。
デバックもしにくい。
そして、コメントを書け。
自分だけでなく他の人が読んでも解るようにな。
コメントを書けば自分でも理解しながら書ける。

健闘を祈る。
811デフォルトの名無しさん:2005/11/25(金) 23:40:07
自分じゃできないことを他人に薦める人が多いな
俺は除いて
812デフォルトの名無しさん:2005/11/25(金) 23:41:18
嘘つけ
813半人前:2005/11/25(金) 23:51:17
うぃ、まだ私は読みきれない。
814デフォルトの名無しさん:2005/11/26(土) 06:38:19
とある5次方程式の解の一つを求めたいのですが、接線がべたーっとx軸に水平に
なってしまうため、ニュートン法などが使えません。ちなみに関数の形は
y=x*((x+0.01214)^2)*((0.98786-x)^2)*(0.0000000000667*1.0123)-((0.98786-x)^2)*0.0000000000667*1+((0.01214+x)^2)*0.0000000000667*0.0123
というものです(ラグランジュポイントのL1を求める式です)。
y=0となるxを求めるために、何か良い方法は無いでしょうか。
815デフォルトの名無しさん:2005/11/26(土) 08:56:51
>>814
無い
816デフォルトの名無しさん:2005/11/26(土) 09:35:58
>>814
y2 = y*2.0e-10/3.0 なる y2 の解を求めればええんじゃないの?
817デフォルトの名無しさん:2005/11/26(土) 10:18:00
>>814
ニュートン法が使えないって事はないが、二分法で。
#include <stdio.h>
#include <math.h>

double fn(double x){
return x*pow(x+0.01214,2)*pow(0.98786-x,2)*(0.0000000000667*1.0123)\
- pow(0.98786-x,2)*0.0000000000667*1 \
+ pow(0.01214+x,2)*0.0000000000667*0.0123;
}

int main(){
double x1=0.5, x3=1.0, x2,y;
double eps=0.000000000000001;

for(;;){
x2=(x1+x3)/2.0;
y=fn(x2);
if ((y==0) || fabs(x1-x3)<eps)
break;
else if (y < 0)
x1 = x2;
else
x3 = x2;
}
printf("%.15f\n",x2);
return 0;
}
818814:2005/11/26(土) 11:26:34
>>816
すみません、どうしてそれを求めればよいのかが分かりません・・・。
教えていただけないでしょうか。

>>817
ありがとうございます、完璧に出ました!
自分でプログラムした時にはそこまで小さなepsにするとエラーが出てしまったのですが、
このプログラムだと華麗に動きますね。感動しました、ありがとうございます。
819814:2005/11/26(土) 11:59:29
>>817
プログラムを参考にさせていただいた結果、ニュートン法でも結果を得ることができました。
本当にありがとうございました。勉強になりました。
820816:2005/11/26(土) 13:53:26
>>818
すでに解決済みのようだが意図としては右辺全項に 0.0000000000667 が掛かってるんで
これを消去した式で解を求めれば速度と精度と両方向上するよねってことですた。
y と y2 が逆だな。ちゃんと確認しろよ >>俺
821814:2005/11/26(土) 14:52:07
>>820
仰る通りですね(^^;
そんな単純なことに今まで気が付きませんでした・・・。
的確なご指摘、ありがとうございます。
822デフォルトの名無しさん:2005/11/26(土) 16:50:40
>三つの整数35,88,154を変数a,b,cにそれぞれ代入して、
>a+b+cおよびa-b-cを計算するプログラムを作りなさい。

出力結果は
a+b+c=277
a-b-c=-207
にしたいのですが、どうすればいいでしょうか?
823デフォルトの名無しさん:2005/11/26(土) 17:02:09
a = 35;
b = 88;
c = 154;

printf("a+b+c=%d\n", a+b+c);
printf("a-b-c=%d\n", a-b-c);
824822:2005/11/26(土) 17:07:04
>>823
これでいいのでしょうか?

#include<stdio.h>
int main(void)
{
  int a,b,c,a+b+c,a-b-c;
  a=35;
  b=88;
  c=154;
  a+b+c=a+b+c;
  a-b-c=a-b-c;
  printf("a+b+c=%d\n",wa);
  printf("a-b-c=%d\n",sa);
  return 0;
}
825デフォルトの名無しさん:2005/11/26(土) 17:12:58
>>824
いいえ
826822:2005/11/26(土) 17:15:15
>>825
なぜですか?
827デフォルトの名無しさん:2005/11/26(土) 17:55:36
1.a+b+cおよびa-b-cという変数は宣言できない
2.waとsaと言う変数が宣言されていないし値の代入が行われていない

828822:2005/11/26(土) 18:10:19
>>827
2.は分りましたが、1.はどう宣言すれば良いのでしょうか?
829デフォルトの名無しさん:2005/11/26(土) 18:12:33
830デフォルトの名無しさん:2005/11/26(土) 18:20:50
すみません、質問させてください。
sscanfとfgetsを使って、例えば「I am student.」
と入力したとき、
I   → word[0]に1
am   → word[1]に2
student→ word[2]に6
と配列に文字数を格納するにはどう
書けばいいのでしょうか・・。
831822:2005/11/26(土) 18:22:28
こうですか?

#include<stdio.h>
int main(void)
{
  int a,b,c;
  a=35;
  b=88;
  c=154;
  printf("a+b+c=%d\n",a+b+c);
  printf("a-b-c=%d\n",a-b-c);
  return 0;
}
832830:2005/11/26(土) 18:38:34
すみません、sscanf内では%sの使用は一度で済ませたいのです。
%s%s%s・・・というのはやはり美しくないので
833デフォルトの名無しさん:2005/11/26(土) 18:39:30
>>830
#include<string.h>
char s[64];
printf("%s",strlen(fgets(s,64,stdin));
834830:2005/11/26(土) 18:54:14
>>833様のをもとに書いてみたのですが
#include<stdio.h>
#include<string.h>

char s[64];
int word[];
int main(void){
fgets(s,64,stdin);
sscanf(s,"%d",&word[]);
printf("%s",strlen(word[]));
return 0;
}
うまくいきません、配列の使い方がおかしいのでしょうか?
835デフォルトの名無しさん:2005/11/26(土) 18:57:29
#include <stdio.h>
#include <string.h>
int main()
{
  int i, j;
  char buf[1024];
  char *word[256] = {0};
  if( ! fgets(buf, sizeof(buf), stdin)) return 1;
  if( ! (word[0] = strtok(buf, " "))) return 2;
  for(i = 1; i < sizeof(word)/sizeof(word[0]); ++i) word[i] = strtok(NULL, " ");
  for(j = 0; j < i; ++j) puts(word[j]);
  return 0;
}
836830:2005/11/26(土) 19:19:53
>>835
strokの使い方は大体わかりました。
whileで回せば区切りは出来そうです。
sizeof()という関数は別に設定する必要は
ありますか?そのままだとデバックエラーに
なってしまいますので・・・。
837830:2005/11/26(土) 19:21:05
sscanfでは出来ないのでしょうか?
838デフォルトの名無しさん:2005/11/26(土) 19:26:46
>>830
例外処理は考慮してない。

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

char s[64];
int word[64];

int main(void){
char tmp[64];
int i, offset;
fgets(s,64,stdin);

for(i = offset = 0; sscanf(s+offset,"%[^ .\n]%*c",tmp) == 1; i++) {
word[i] = strlen(tmp);
offset += word[i] + 1;
}
return 0;
}
839830:2005/11/26(土) 19:46:51
>>838様。
ありがとうございました!
最後に一つだけ教えてください。scanf中の
sは配列、offsetはint型関数でsscanfの第一引数は
配列型の指定が必要ですが、これは配列のアドレス
に+offsetしているのですか?
このsscanfは戻り値を返す判定のみでの使用ですよね?
840デフォルトの名無しさん:2005/11/26(土) 20:05:04
荒れる前に、去れ。
お前に必要なのは、とりあえず入門書だ。
841デフォルトの名無しさん:2005/11/27(日) 01:37:34
>>836
sizeofは関数ではなく演算子だ。
842デフォルトの名無しさん:2005/11/27(日) 06:43:00
昨日からウェブを回りながら独学でC言語のことを勉強し始めたのですが、
初心者におすすめのC言語入門書というのはないでしょうか?
まだfor if辺りまでしか読んでません
843デフォルトの名無しさん:2005/11/27(日) 08:27:26
ローカルルールも読めない人にすすめられる本は知らんよ
844デフォルトの名無しさん:2005/11/27(日) 16:23:34
ビューア使ってるんでローカルとか読んでなかった
明日帰りによさそうなの適当に買ってみる
845デフォルトの名無しさん:2005/11/27(日) 17:04:27
どうぞご自由に無駄金使って自己満足してください。
846デフォルトの名無しさん:2005/11/27(日) 17:22:56
何で無駄に煽るかな
847デフォルトの名無しさん:2005/11/27(日) 22:02:32
心が狭いから
848デフォルトの名無しさん:2005/11/28(月) 00:14:55
やさしいC
Cの絵本

プログラミング言語C ANSI規格準拠 第2版(読めるならな)
849デフォルトの名無しさん:2005/11/28(月) 15:38:11
Visual Studio theSpoke Premium ver.2003って今でも買い?
2003って古い気がしてならないんだけど
850デフォルトの名無しさん:2005/11/28(月) 15:42:27
>>849
2005Proがタダでもらえます(要登録
851デフォルトの名無しさん:2005/11/28(月) 18:10:30
なんでこのスレで聞くんだろうな
852デフォルトの名無しさん:2005/11/28(月) 18:13:22
作成したプログラムの計算量を比較したいのですが、
ループの回数がマチマチで単純にオーダーを取ることでは比較しづらい
という現状です。

コンパイラのコマンドやソフトウェアで計算量を測れませんか?
853デフォルトの名無しさん:2005/11/28(月) 18:17:31
>>852
測れる環境があるデバッガはありますよ。
854852:2005/11/28(月) 18:34:13
>>853
すみませんが、そのデバッガは何処で手に入るか、
もしくは名称を教えていただけませんか?
855デフォルトの名無しさん:2005/11/28(月) 18:46:15
>>854
あなたの環境もわからないのに教えても無意味ですよ。
856デフォルトの名無しさん:2005/11/28(月) 18:58:40
普通はプロファイラを使うと思うんだが?
デバッガでそんな事出来るのあるのか?
857デフォルトの名無しさん:2005/11/28(月) 19:06:00
>>856
ありますが何か?
858852:2005/11/28(月) 20:28:10
お二方共コメントありがとうございます。
無知で申し訳ありません。
どちらにせよcygwinにプラグインする形をとることはできるのでしょうか?
859デフォルトの名無しさん:2005/11/28(月) 21:39:05
どなたかエロイ人、お足得手下さい。
中一のがきんちょがゲームばかりやって、テストで2点とか
超パープリンな点数をとってきます。
で、ピアノが弾けるので芸無関係の業界へ進ませようと思ってます。
そこでCなんですが、VISUAL以外のただのCって売っているんで
しょうか?何処で買えば?それともVisualCが主流なんですか?
また、厨房向けの入門書もいいのがあったらご教授下さいませ。
860デフォルトの名無しさん:2005/11/28(月) 21:48:15
>> 858
「cygwin gcc gprof」でぐぐれ

>>859
質問するときは奇を衒わず真っ当な文章を書こうな。
とりあえず ピアノが弾ける→ゲーム関係 ってのが意味不明。
861デフォルトの名無しさん:2005/11/28(月) 21:49:24
>>859
ピアノが弾けるのならピアニストになれよ。
862デフォルトの名無しさん:2005/11/28(月) 22:02:06
>>859 ピアノマンになれwwwwww
863伝説新人タクシ:2005/11/28(月) 22:04:51
>>859
自己紹介"己"。
低脳人間を設定することで別の人間に仕立て上げる。
最低ではないが最悪だ。
言の端、普く全ての尽くが裏目に出る。
864859:2005/11/28(月) 22:07:42
>>860
>とりあえず ピアノが弾ける→ゲーム関係 ってのが意味不明。
ゲーム音楽の作曲アレンジとかをやればと思って。
>>861 >>862
いじめちゃいやん。
あふんばかん。
狂言はダメですらい。
865デフォルトの名無しさん:2005/11/28(月) 22:09:19
・・・ゴクリ
866伝説新人タクシ:2005/11/28(月) 22:10:50
もちろん普通にデジタル作曲・編集はできるだろ?
867デフォルトの名無しさん:2005/11/28(月) 22:13:47
>>864
いや、だからゲーム音楽と絞っているか理解できない。なんの作曲家でも演奏家でもいいだろうに。
それはともかく音楽とプログラミング言語Cにはなんの関係もない。
料理人とレストラン経営の違いと同じぐらいの違いがある。
868デフォルトの名無しさん:2005/11/28(月) 22:32:50
while Q≠0 do
はQが0でないとき繰り返すんですよね?
では、Q≠0から一度Q=0になり、再びQ≠0になったとき
終了させるにはどうすればいいですか?
869デフォルトの名無しさん:2005/11/28(月) 22:38:30
>>868
while (Q != 0) {
if (Q == 0) {
while (Q == 0) {
hoge;
}
break;
}
}

これでどうよ
ってかwhile ~ doってpascalの構文じゃね?
870デフォルトの名無しさん:2005/11/28(月) 23:00:22
>>859
876の言う通りゲーム業界に作曲系で入りたいのならCの知識は不要。
が、音屋さんの仕事って最初はループ再生用のカットとかノイズ低減とかで、
作曲アレンジなんておいしい仕事がくることは下手すると一生ないぞ。

音大くずれのゲーオタ連中と張り合っていける自信があるならどうぞいらっしゃいな。
871870:2005/11/28(月) 23:39:34
*おおっと*
未来の876さん失礼いたしました。867さんの間違いでしゅ。
872デフォルトの名無しさん:2005/11/29(火) 00:08:38
バブルソートの計算量を削減するプログラムらしいのですが、★に何が入るか分かりません。
ご教授お願いします。

for(i=n-1;i>=2;i--){
sentinel=0;
for(j=0;j<i;j++)
if(a[j]<a[j+1]){
swap(&a[j],&a[j+1]);
sentinel=1;
}
if(★) break;
}
873デフォルトの名無しさん:2005/11/29(火) 00:09:25
for(i=n-1;i>=1;i--){
sentinel=0;
for(j=0;j<i;j++)
if(a[j]<a[j+1]){
swap(&a[j],&a[j+1]);
sentinel=1;
}
if(★) break;
}

でした;
874デフォルトの名無しさん:2005/11/29(火) 01:10:49
>>869
ありがとうございます。明日先生に見せてきます!
hogeって何ですか?すいません。これってpascalなんですか?!
875デフォルトの名無しさん:2005/11/29(火) 05:18:49
はてなダイアリーより hoge

日本の情報処理技術者が替え玉記号のように利用することが多い文字列。情報処理の技術ではメタ構文変数(Metasyntactic variable)とも呼ばれる。
つまり「hoge」と書いてあったら「必要なほにゃらかに置き換えて使ってください」というちょめちょめになる。


876デフォルトの名無しさん:2005/11/29(火) 10:08:52
>>873
sentinel == 0 じゃねーの。
877デフォルトの名無しさん:2005/11/29(火) 15:23:42
        ∧_∧
       (´・∀・`)  ハーイ
       ( ⊃┳⊃ 
       ..(_)/⌒ヽ
   ⊂二二二( ^ω^)二⊃
        |    /       ブーン
         ( ヽノ
         ノ>ノ 
     三  レレ
878デフォルトの名無しさん:2005/11/29(火) 18:47:02
アンケートみたいに質問の答えをまた質問にする方法教えてください!
激初心者ですみません
879デフォルトの名無しさん:2005/11/29(火) 18:52:47
>>878
質問の答えをまた質問にすればOK。
880デフォルトの名無しさん:2005/11/29(火) 21:20:09
>>873
そういうのはsentinelとは言わないと思うのだが、その問題出したのはどこのどいつだ。
881デフォルトの名無しさん:2005/11/30(水) 00:05:08
linuxでプログラミングを勉強しようと思ってるのですが、
CとC++どちらにすれば良いか迷っております。

どなたかアドバイス下さい。
882デフォルトの名無しさん:2005/11/30(水) 00:17:39
>>881
藻前にはどちらも無理
883デフォルトの名無しさん:2005/11/30(水) 13:31:08
質問します。
ブルートフォースクラックとかプログラムはどういう仕組みで動いてるのか勉強したくて質問しました。
たとえば
パスワードが34ieの四文字英数字だったとします。

1から順に4文字を生成してるのはどういう仕組みなんでしょうか?
ただ単にそのまま四個のfor文でくるくる回してるんでしょうか?
具体例とかあったらうれしかです。
884デフォルトの名無しさん:2005/11/30(水) 13:35:52
>>883
つ[John the ripper]
885デフォルトの名無しさん:2005/11/30(水) 13:38:54
スタックのLIFOとFILOってのは同じですか?
886デフォルトの名無しさん:2005/11/30(水) 13:41:43
スタックですらないのかよ!
887デフォルトの名無しさん:2005/11/30(水) 13:42:48
>>886
それはFIFA
888デフォルトの名無しさん:2005/11/30(水) 14:28:56
>>887
World Cup?
889デフォルトの名無しさん:2005/11/30(水) 15:35:53
オブジェクト指向って何?
クラスって何?
メソッドって何?

↑調べるとなんかループするし・・・orz
890デフォルトの名無しさん:2005/11/30(水) 16:26:12
>>889
C言語のスレよりふさわしい所で聞けやボケ
891デフォルトの名無しさん:2005/11/30(水) 18:40:45
出力結果をテキストファイルに保存する方法を教えてください。
よろしくお願いします。
892デフォルトの名無しさん:2005/11/30(水) 19:58:29
>>891
その出力が標準出力ならばリダイレクトでできる。
その出力がGUI上ならばコピペでできるかもしれない。
いずれにしろ、環境がわからなくては詳しくはかけない。

尚、ファイルに出力したいならばfopen()、fprintf()、fclose()などを調べよ。
893デフォルトの名無しさん:2005/11/30(水) 19:59:04
>>891
リダイレクト
894デフォルトの名無しさん:2005/11/30(水) 20:39:28
>>892
>>893
解答ありがとうございます。
コマンドプロンプトに標準出力しています。
リダイレクトで調べてみます。
895デフォルトの名無しさん:2005/11/30(水) 21:02:17
キーボードから文字列を受け取り、改行のみが入力された場合に、
ループを抜けるようにプログラムしたいのですがうまくいきません。

buffer[20];
while(buffer[0]!='\n) {
scanf("%s",buffer);
}
このようなプログラムを作ってみましたが、
これではscanfが改行だけの入力だけでは、受け付けてくれないですし、
getche()とforループの組み合わせでもよい方法が浮かびません。

何かよい方法があれば教えてください。よろしくお願いします。




896デフォルトの名無しさん:2005/11/30(水) 21:07:40
>>894
リダイレクトは大抵のOSで "> ファイル名"と書く。
つまり、"プログラム名 > ファイル名"と書けばいい。
OSによっては'%'だったり'|'だったりする希ガス。
897デフォルトの名無しさん:2005/11/30(水) 21:08:33
>>895
fgets()で入力し、sscanf()で変換するのが常套手段。
#あ、その例ではsscanf()するまでもないや。
898デフォルトの名無しさん:2005/11/30(水) 21:29:02
>>896
|はパイプ
899デフォルトの名無しさん:2005/11/30(水) 21:32:04
>>895
返答ありがとうございます。

恐縮なんですが、fgets()で入力し、sscanf()で変換するというのがいまいちわかりません^^;
fgets()は、ファイルから1行呼び出してくる関数だったと思うんですが、
詳しく教えてもらえないでしょうか・・・。
900デフォルトの名無しさん:2005/11/30(水) 21:39:22
すみません。
>>897でした^^;
901デフォルトの名無しさん:2005/11/30(水) 21:41:11
>>898
だからそういうOSがあるんだってばさ。

>>899
fgets()でもstdinを指定すれば標準入力から読める。
902デフォルトの名無しさん:2005/11/30(水) 22:19:22
>>899while(scanf("%s",buf)!=1);で十分だろ
903デフォルトの名無しさん:2005/11/30(水) 22:31:47
>>896
出力結果を保存することができました。
ありがとうございました。
904デフォルトの名無しさん:2005/11/30(水) 23:40:58
883ですが
ジョンザリッパーがどんな感じか聞いているんです。
905デフォルトの名無しさん:2005/11/30(水) 23:50:14
>>904
ソースを読め
906デフォルトの名無しさん:2005/12/01(木) 00:08:13
バックスラッシュの出し方、教えてください。
907デフォルトの名無しさん:2005/12/01(木) 00:09:31
\\
908デフォルトの名無しさん:2005/12/01(木) 00:17:06
正の整数を入力し、その個数だけ*を連続して横に並べて出力するプログラムを作成せよ。
ただしwhile文を用いること。
というプログラムはどうやって作ればいいのでしょうか。。。
909!omikuji:2005/12/01(木) 00:17:07
おみくじなら
910デフォルトの名無しさん:2005/12/01(木) 00:21:54
>>907
ダメでしたorz
911デフォルトの名無しさん:2005/12/01(木) 00:24:28
>>910
フォントを欧州のやつに変えてみれ。
日本語の\はバックスラッシュと同じ文字コード。
912デフォルトの名無しさん:2005/12/01(木) 00:26:06
>>908
入力された整数の分だけ、While回せ
ループの中でprintf("*");
913デフォルトの名無しさん:2005/12/01(木) 00:35:15
srand()で初期乱数を時間から持っていた数字で決めて、
rand()で初期乱数から乱数を引っ張る っていう結構一般的な
乱数発生関数を作ったんですが、もっと 散り散りになる乱数の作り方って
ないでしょうか?
914デフォルトの名無しさん:2005/12/01(木) 00:37:20
>>913
つ[Mersenne Twister]
915デフォルトの名無しさん:2005/12/01(木) 00:37:49
>>905
初心者スレじゃないんかよ!!
ったくわからないならわからんって言えよww
916デフォルトの名無しさん:2005/12/01(木) 00:41:22
>>912
ありがとうございます!!なんとなくできました!!
917デフォルトの名無しさん:2005/12/01(木) 00:44:42
>>883 >>904 >>915
(ここはジョンザリッパーの初心者スレじゃないですよ。
ブルートのアルゴリズム解析スレでもないですよ。
質問者の態度っていうものもあると思いますよ。
回答者が出てくれるまで、気長に待ったほうが得策だと思いますよ。
それが待てないのならば、)ソースを読め
918デフォルトの名無しさん:2005/12/01(木) 00:50:13
>>914
おぉ なかなか面白そうな。
ヒントありがとうございます。
919デフォルトの名無しさん:2005/12/01(木) 02:11:44
なんとか空白で文字幅を調節して
掲示板に書き込む時に見栄えを良くしたいのですが
そのようなアルゴリズム(プログラム)はありますか?

左側の文字列は共に9文字で単純に6文字の空白を
入れただけでは次のようになってしまいます・・・
【例】
あっいaIU++幅      ここに書く
tkahuanたl      ここに書く
920デフォルトの名無しさん:2005/12/01(木) 02:17:18
>>919
フォントによって違うだろ
921デフォルトの名無しさん:2005/12/01(木) 02:22:43
>>919
固定長フォントで全角のみを使うwww

まあ実際、文字の位置あわせというのは簡単なようで、結構難しい。
922919:2005/12/01(木) 03:03:50
>>920
いや例えばこの掲示板に書き込むだけなら同じフォントですよね?

>>921
そうですか・・・
左側の列は予め決まった単語ではないので
どうしても計算してだす必要があるんです・・・
923デフォルトの名無しさん:2005/12/01(木) 03:33:34
>>922
プログラム言語はなんですか?
924919:2005/12/01(木) 03:59:30
>>923
C言語です
925デフォルトの名無しさん:2005/12/01(木) 04:04:31
AA関連のサイトにでも行って、定番フォントの幅を調べて文字ごとの画素数のテーブルを作り、
それを使って計算すればやってできないことはない。
が、かなり面倒だとは思う。
926919:2005/12/01(木) 04:23:18
>>925
やっぱりそこまでしないとできないものですか・・・
ヤフーで検索してもそれらしきものがでてこないし・・・

あ 1
あ11

↑今気づいたけど、半角スペースと半角数字の1の幅が違うんですよね・・・
正直これには参った・・・
やっぱり完璧にするのは無理かなぁ
927デフォルトの名無しさん:2005/12/01(木) 04:33:18
>>926
プロポーショナルフォントは、すべての文字の文字幅は異なると思ったほうがよい。
だから計算できたとしても、ぴったりではなくて近似なんだよね。

WinAPIのGetCharacterPlacementやGetTextExtentPoint32という関数で文字列の幅の計算が
できるようです。HDCを渡さなくてはいけないんですけど。
928デフォルトの名無しさん:2005/12/01(木) 05:51:57
http://www.geocities.jp/file_file_file_aaa/guide/glinedot.html
漢字全て16pxなので3〜15pxのリストを保持するだけでいい。
それはともかく「半角SPは行頭に来れず、連続することもできない」という条件で整形するアルゴリズムを考えるのは楽しそうだ
929デフォルトの名無しさん:2005/12/01(木) 08:19:35
しかも、 があったりね。
930デフォルトの名無しさん:2005/12/01(木) 10:23:41
>>922
フォントはブラウザの設定で変し、
掲示板で書き込みできるのは文字情報のみで、
表示されるフォントの情報など存在しない。

そんなに位置合わせをしたいなら、
タグ入力可能な掲示板でtableタグで合わせろ。
931デフォルトの名無しさん:2005/12/01(木) 10:55:44
夢がねぇ香具師だなぁ。
つーか、AAを否定されてもねw
932デフォルトの名無しさん:2005/12/01(木) 11:25:54
Z1=2.5+3.2i
Z2=1.3+0.4i

この和と積を求めて、結果を打ち出すプログラムはどうなりますか?
自分でやってみたんですが、うまくいきません。
誰かわかる方教えてください。
933デフォルトの名無しさん:2005/12/01(木) 11:45:36
折角回答しようとも思ったがマルチにつき放置。
http://pc8.2ch.net/test/read.cgi/tech/1132102992/982
934デフォルトの名無しさん:2005/12/01(木) 15:19:43
ttp://hp.vector.co.jp/authors/VA018359/

このサイトの、DISWINでAPIリストを作るという項目をやってるんですが
このサイトのOSは98で自分はXPなのでディレクトリの指定が分かりませんorz

色々試してるんですがMKLISTをどこに指定していいのでしょうか。。

スレ違いだったらごめんなさい
935デフォルトの名無しさん:2005/12/01(木) 15:39:50
936デフォルトの名無しさん:2005/12/01(木) 17:06:15
mallocが理解できないのでお聞きします。

char *z;
int a;

z = (char *)malloc(a * 2 + 1);

の様に使うみたいですが
(char *)の部分がわかりません。(a * 2 + 1)の部分はa×2+1バイト用意するってことですか?
937デフォルトの名無しさん:2005/12/01(木) 17:16:36
>>936
mallocはvoid*型の値を返すから、char*型にキャストしてからzに入れないと
コンパイラに怒られる。
そんでもって(a * 2 + 1)バイト確保してる
938デフォルトの名無しさん:2005/12/01(木) 17:18:14
>>937
イマイチわかりませんが、取りあえず書いておけということですね
939デフォルトの名無しさん:2005/12/01(木) 17:19:05
>>936
(型名)式
は式を指定した型に変換します。
この場合はchar*型(charへのポインタ型)に変換しているわけですね。

mallocはvoid*型を返し、void*型は代入時に自動的に(左辺のポインタ型に)型変換されるのでこのようなキャストは必要ありません。

可読性や安全性を考えると、むしろやめておいた方がいいでしょう

>>937の2行目と3行目はC++の仕様です
940デフォルトの名無しさん:2005/12/01(木) 17:34:03
>>934
その際とのどこにDISWINとやらがあるのか教えてくれ。
941934:2005/12/01(木) 17:50:18
ttp://hp.vector.co.jp/authors/VA018359/

ごめんなさいページのURL貼ったんですがTOPが表示されるっぽいですね

お手数ですが
下のタブの解析・考察(Hacking)→キーディスクチェック解析
→上から10行目の改造講座→初級05の「逆アンセブラを使ってみる2」です

めちゃくちゃ面倒くさいですね・・・すいませんorz

そこにあるAPIリストの作成なんですがXPではどこを指定したらいいのやら・・・
942デフォルトの名無しさん:2005/12/01(木) 18:09:57
>>941
2kもXPも同じNT系。
だけどXPのデフォルトのインストールフォルダはC:\WINDOWS。
ということでC:\WINDOWS\SYSTEM32
943デフォルトの名無しさん:2005/12/01(木) 18:15:42
質問です。
コンパイルをすると下のようなエラーメッセージが出てきます。
どうしたらいいのでしょうか?

―――――――エラーメッセージ―――――――
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: ファイル C0X32.OBJ が開けません
――――――――――――――――――――――
と出てきます。
944デフォルトの名無しさん:2005/12/01(木) 18:22:47
>>941
スレ違いになるけど、そういうフレームを使ったページは目的の場所で右クリックメニューから
プロパティを出すと中身のアドレスが得られるよ。
で、XPは知らんけどWin2Kと同じなんで内科医?
まぁ、どうなっても私ゃ知らんが。
945デフォルトの名無しさん:2005/12/01(木) 18:25:32
>>943
BCCスレで聞くといいと思うよ。
946934:2005/12/01(木) 18:47:01
>>941
ありがとうございます!出来ました!

>>944
そんな方法あったんですね。次からそうします!

あとはdd拍子にいけるはずです。わざわざありがとうございましたm(_ _)m
947デフォルトの名無しさん:2005/12/01(木) 18:47:37
魑魅魍魎
948:2005/12/01(木) 18:48:49
× >>941
>>942

興奮してアンカーミスりました。連投すいません。
949デフォルトの名無しさん:2005/12/01(木) 20:04:23
//演習3.6
#include<stdio.h>
void main()
{
intmonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
intyy,mm,dd;
intmonc,con=0;

printf("Please input date (yyyy.mm.dd) ==> ");
scanf("%d.%d.%d",&yy,&mm,&yy);

if(mm > 0 && mm < 13)
if((month[mm-1]+1)>dd){
for(monc=1;monc!=mm;monc++){
//printf("%d\n",con);
con+=month[monc-1];
}
con+=dd;
}
else
printf("ERROR\n");
else
printf("ERROR\n");
printf("Total %d days",con);
}
で//printf("%d\n",con);行のコメントをはずすと正常に動作するのですが、
コメントにしたり行を消したりすると正常に動作しません。
超初歩的な質問かも知れませんがよろしくお願いします。
開発環境はBorland C++ 5.5です。
950デフォルトの名無しさん:2005/12/01(木) 20:25:36
//演習3.6
#include<stdio.h>
void main()
{
int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int yy,mm,dd;
int monc,con=0;

printf("Please input date (yyyy.mm.dd) ==> ");
scanf("%d.%d.%d",&yy,&mm,&yy);

if(mm > 0 && mm < 13)
if((month[mm-1]+1)>dd){
for(monc=1;monc!=mm;monc++){
//printf("%d\n",con);
con+=month[monc-1];
}
con+=dd;
}
else
printf("ERROR\n");
else
printf("ERROR\n");

printf("Total %d days",con);
}
見にくくてすみません。
951デフォルトの名無しさん:2005/12/01(木) 20:27:51
よく見てないけど
>scanf("%d.%d.%d",&yy,&mm,&yy);
yy がふたつ。
952デフォルトの名無しさん:2005/12/01(木) 20:34:05
ああああああぁぁぁぁぁぁ.....orz
やってしまった・・・見落とし・・。orz
次からは注意します。
953デフォルトの名無しさん:2005/12/02(金) 00:35:30
で、そのプログラムは結局なにがしたいのさ
年数を入力する必要はないし、仮に元日からの日数を求めるんであれば、
1月31日を指定したら62日と帰ってきそうなんだが。
954デフォルトの名無しさん:2005/12/02(金) 09:14:26
//演習3.6
#include<stdio.h>
void main()
{
int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int yy,mm,dd;
int monc,con=0;

printf("Please input date (yyyy.mm.dd) ==> ");
scanf("%d.%d.%d",&yy,&mm,&dd);

if(mm > 0 && mm < 13)
if((month[mm-1]+1)>dd){
if(yy%4==0 && yy%100!=0)
month[1]=29;
for(monc=1;monc!=mm;monc++){
con+=month[monc-1];
}
con+=dd;
}
else
printf("ERROR\n");
else
printf("ERROR\n");
printf("Total %d days",con);
}
完成しました。
入力した年月日を入力し、元日からの日数を求めるプログラムです。
年を入力する必要があったのは閏年の判定をする為です。
955デフォルトの名無しさん:2005/12/02(金) 09:24:40
>>954
100年判定入れるなら400年判定入れないと2000年がおかしくなる。
956デフォルトの名無しさん:2005/12/02(金) 09:27:07
細かいけどこうね
if(yy%400==0 || (yy%4==0 && yy%100!=0))
957956:2005/12/02(金) 09:27:52
かぶった・・・
958デフォルトの名無しさん:2005/12/02(金) 09:36:36
if(mm > 0 && mm < 13){
if(yy%400==0 || (yy%4==0 && yy%100!=0))
month[1]=29;
if((month[mm-1]+1)>dd){
for(monc=1;monc!=mm;monc++){
con+=month[monc-1];
}
con+=dd;
}
}
お早いレスありがとうございます。判定の位置もおかしかったので修正
しました。これからも精進します。
959デフォルトの名無しさん:2005/12/02(金) 10:28:54
>>955
過去は振り返らないのさ。
960デフォルトの名無しさん:2005/12/02(金) 22:29:32
>>959
長い未来を見据えず、mktime()で算出するのはいかが?(w
961デフォルトの名無しさん:2005/12/03(土) 10:44:15
FreeBSDで下の式のグラフを書いて表示させたい。どうすりゃいいんだ
f(x) = x*x ( x=-4, -3, ..., 0, 1, ..., 4)
962デフォルトの名無しさん:2005/12/03(土) 10:50:29
gnuplot
963デフォルトの名無しさん:2005/12/03(土) 11:07:20
ありがとう
964国士:2005/12/03(土) 14:18:55
僕もどしろうとなんですけど代入演算子ってなにかわかりますか?
965デフォルトの名無しさん:2005/12/03(土) 14:22:25
もちろんだ
966デフォルトの名無しさん:2005/12/03(土) 14:42:42
char a = '+'
とかやったときのaが代入演算子。ようするに演算子を代入するもののことだ
967デフォルトの名無しさん:2005/12/03(土) 14:51:28
>>966
ワロタ
968デフォルトの名無しさん:2005/12/03(土) 16:20:50
任意の関数f(x)の x=n における微分係数を求めるにはどのような方法がありますか

f(x),g(x),h(x)とあれば、diff_fx(float x),diff_gx( float x),diff_hx( float x)みたいに3つ作るくらいしか考えられませんでした
diff_fx( float x) の内容は、手計算でf(x)の導関数を求めて、それを書き込んでというどうしようもない状態です(ノд`)
969デフォルトの名無しさん:2005/12/03(土) 16:30:53
>>968
あらかじめ関数が決まっているなら精度的にはそれが一番いい方法。
970デフォルトの名無しさん:2005/12/03(土) 16:39:25
>>968
関数決まってないなら
f'(c) = lim[h→0]{(f(h+c) - f(c))/h}
を使って、h=0.000000001とでもしてやるしかないんじゃまいか?
971デフォルトの名無しさん:2005/12/03(土) 16:48:51
>>969
確かにこれでも問題なく動くのですが、汎用性が全くないなぁと思いまして
関数変える度に、導関数も求め直すのも結構手間ですし

>>970
定義に従って微分していくということですか
試してみます

ありがとうございました
972デフォルトの名無しさん:2005/12/03(土) 16:51:38
>>970
それは小さすぎ。普通の多項式でもひどい誤差になる。
中心差分でも10の-5乗くらいが限度かと。
973デフォルトの名無しさん:2005/12/03(土) 16:54:10
近似式ってもんを知らない馬鹿しかいないんだな
974デフォルトの名無しさん:2005/12/03(土) 16:54:46
>>972
hは適当に書いてみた。スマンカッタ
975デフォルトの名無しさん:2005/12/03(土) 16:57:17
>>973
>>1を読んで出直したら?
976デフォルトの名無しさん:2005/12/03(土) 17:00:19
これがCの質問だと思ってる奴の脳味噌じゃその程度か。
977デフォルトの名無しさん:2005/12/04(日) 15:45:41
キーボードから「c」を入力した時に「OK!」、それ以外の時には「NG!」と出力するプログラムはどう書けばいいですか?
978デフォルトの名無しさん:2005/12/04(日) 16:02:01
if( キーボードから入力された文字 == 'c' ) puts("OK!");
else puts("NG!");
979977:2005/12/04(日) 16:17:46
else if文でお願いしますorz

自分ではこう書きましたがダメでした。
#include<stdio.h>
int main(void)
{
  int x;
  scanf("%c",&x);
  if(x=='c'){
   printf("OK!\n");
  }
  else{
   printf("NG!\n");
  }
  return 0;
}
980デフォルトの名無しさん:2005/12/04(日) 16:38:07
>>979
intで宣言して%cで受けるのはおかしいだろがッ
とりあえずchar xに汁
981977:2005/12/04(日) 16:58:59
>>980
出来ました。
でも、「cc」でも「OK!」と出てしまいます。
982デフォルトの名無しさん:2005/12/04(日) 17:25:52
>>981
・・・・scanfが何してるか考えてるか?
983977:2005/12/04(日) 17:30:52
>>982
キーボードから数値を取り込む関数?
すみません。激初心者ですorz
984デフォルトの名無しさん:2005/12/04(日) 17:33:00
985977:2005/12/04(日) 17:42:37
char x;
scanf("%c",&x);
if(a=='c')

この辺が間違ってる様な希ガス
986977:2005/12/04(日) 17:47:33
char x;
scanf("%c",&x);
if(x=='c')

こうか
987デフォルトの名無しさん:2005/12/04(日) 17:48:43
988デフォルトの名無しさん:2005/12/04(日) 17:52:24
char型は文字一文字が入るサイズのデータ型です。所謂1バイト。これは全処理系共通です。
scanfの%cは文字一文字を受け取ることを示します。
つまり

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

は標準入力からcに一文字入れるということです。
989977:2005/12/04(日) 17:55:26
#include<stdio.h>
int main(void)
{
  char x;
  scanf("%c",&x);
  if(x=='c'){
   printf("OK!\n");
  }
  else{
   printf("NG!\n");
  }
  return 0;
}

ccと入力してもON!にするにはどうしたら?
990977:2005/12/04(日) 17:56:16
↑NG!ですorz
991デフォルトの名無しさん:2005/12/04(日) 18:09:51
>>990
fgetsぐらい使え」
992デフォルトの名無しさん:2005/12/04(日) 18:33:30
#include <stdio.h>
#include <string.h>

int main(void){
char c[3];

fgets(c,sizeof(c),stdin);
if(c[strlen(c)-1]=='\n')
c[strlen(c)-1]='\0';
else{
puts("NG");
return 0;
}

if(!strcmp(c,"c")) puts("OK");
else puts("NG");

return 0;
}

冗長だと思ったら改行文字除去削って比較文字列に改行文字加えれ
993977:2005/12/04(日) 18:40:46
>>991-992
すいません。そこまで習っていません。
習ったのは
printf関数
scanf関数
if文
else if文
for文
等です。
これらで>>977は出来るはずなんだけどなぁ
994デフォルトの名無しさん:2005/12/04(日) 18:48:39
>>993
配列は習った?
習っていないなら2文字以上の入力は考えなくてもいいはずだ
995977:2005/12/04(日) 19:17:21
>>994
習っていません。
996デフォルトの名無しさん:2005/12/04(日) 19:18:19
>>987

でも,そしたら993のような香具師はスルーされるかもな
初心者は2chじゃなくて,K&R読んで勉強汁ってことか
997デフォルトの名無しさん:2005/12/04(日) 19:19:05
>>995は薬師ね
998デフォルトの名無しさん:2005/12/04(日) 19:20:34
>>997
薬師?
999デフォルトの名無しさん:2005/12/04(日) 19:25:37
>>993
これでおk
#include<stdio.h>
int main(void)
{
  char x,y;
  if((scanf("%c%[^\n]%*c",&x,&y)==1)&&(x=='c'){
   printf("OK!\n");
  }
  else{
   printf("NG!\n");
  }
  return 0;
}
1000デフォルトの名無しさん:2005/12/04(日) 19:28:04
次スレ

C言語なら俺に聞け! Part 117
http://pc8.2ch.net/test/read.cgi/tech/1131282679/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。