トップページ⇒tech
1001コメント297KB

C言語なら、俺に聞け! <7>

■ このスレッドは過去ログ倉庫に格納されています
0001sageジョブスNGNG
おれは21才、9年間プログラムを一生懸命作ってきた。
あちこちの言語に手を出したが結局極めたのはC言語だけだった。
大体のことなら分かるからオレに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

・前スレ C言語なら、オレに聞け! <6>
http://piza2.2ch.net/test/read.cgi/tech/999617524/
0322デフォルトの名無しさんNGNG
>>321
1111 素数ではない(11*101)
11111 素数ではない(41*271)
…
というわけで素数じゃないことの方が多そうな予感。
0323デフォルトの名無しさんNGNG
>>321-322
少なくとも、桁数が素数じゃなかったら当然 非素数になるなぁ。
でも「一定範囲より先は全部合成数」ってことは無いと思う、なんとなく…。
0324デフォルトの名無しさんNGNG
#define MAX 0xffffffff
void main()
{
int i,n;
for(i=0;i<=MAX;i++){
n = rand() % 10;
printf("%d",i);
}
printf("7");
}
0325デフォルトの名無しさんNGNG
#define MAX 0xffffffff
void main()
{
int i,n;
for(i=0;i<=MAX;i++){
n = rand() % 10;
printf("%d",n);
}
printf("7");
}
0326デフォルトの名無しさんNGNG
林晴比古の本は買わない方がいいって、本当ですか?
0327デフォルトの名無しさんNGNG
C言語ってどの程度の事が出来るんですか?
0328意味がわかりませんNGNG
for(i=0;i<10-1;i++){
for(j=i+1;j<10;j++){
if(a[i]>a[j]){
b=a[i];
a[i]=a[j]
a[j]=b;
0329デフォルトの名無しさんNGNG
>>319 のプログラムが表示する数のうち、
素数であるものには、上限があるか?
むずかしひ。
0330329NGNG
あ、ひょっとして >>319 の出力は2進数か?
だったらメルセンヌ素数か...
0331デフォルトの名無しさんNGNG
>304
昔からそういうものだった。ってあんた開き直ってどうする。
0332デフォルトの名無しさんNGNG
>>331
単に事実を述べてるだけだろ。
0333デフォルトの名無しさんNGNG
>>307
いやね、君のように「規格できまってるからです」でちゃんちゃん
みたいな奴ばっかじゃないんだよ。

称号とかわけのわかんないこと言ってるヒマがあったら、ちったあ
自分で考えたらどうだい。ま、あたらしい概念とか知見を生み出せ
るような頭脳の持ち主じゃないようだが。
0334デフォルトの名無しさんNGNG
>>333
なんか、どっかの遺恨を持ち込んでるみたいだが…

で、今回の話との関係はどうよ?

『文字定数はint型』というのは、新たな知見を持ち込む余地がないと
思うんだが。
0335デフォルトの名無しさんNGNG
>>333
UNIX V6 の頃の C コンパイラ、Portable C Compiler と UNIX V6 のソースコードは
読んでいて、C の背景はそれなりに理解してるつもりですけど。

何を言いたいのか良く分かりませんが、C の型に関する規則で何か不満があるとい
う主張でしょうか?
0336デフォルトの名無しさんNGNG
>>326
>林晴比古の本は買わない方がいいって、本当ですか?

本当です。
0337デフォルトの名無しさんNGNG
>>326
>林晴比古の本は買わない方がいいって、本当ですか?

ウソです。
0338326NGNG
うをぉぉぉぉ!
誰を信じればいいのじゃーーー!!???
0339デフォルトの名無しさんNGNG
>>338
1995年以降に出版された本ならいいよ。
それ以前なら、パスして。
0340デフォルトの名無しさんNGNG
>>335
333 は片岡だと思われ。基地外を相手にしては
いけない。
0341デフォルトの名無しさん NGNG
しつもーん.
ファイルのリストを作るようなプログラムを書こうと思い.
プログラムを組んでました.
system()関数をつかってdirコマンドで作ろうと思ったんですが.
うまくいきません.
標準出力をscanf関数かget関数等で得ることはできるのでしょうか?
もしくは,system関数を使わずにdirコマンドみたいなことができたら教えて欲しいのですが.
0342デフォルトの名無しさんNGNG
>>341
see opendir readdir
0343デフォルトの名無しさんNGNG
>>341
>標準出力をscanf関数かget関数等で得ることはできるのでしょうか?

こっちはpopen
0344デフォルトの名無しさんNGNG
>>341
MS系 なら findfirst,findnext
0345デフォルトの名無しさんNGNG
>>341
system("command.com /c dir");
0346デフォルトの名無しさんNGNG
>>341
Cの標準関数にディレクトリを直接扱えるものはない。
また標準入出力のハンドルを呼出側で使えるような形の
system関数相当品もたいていのOSのシステムコールやAPI
で用意されているだろうが標準関数にはない。
いずれにしろOSごとのAPIやシステムコールを調べれ。
0347デフォルトの名無しさんNGNG
>>346
標準ライブラリにも無いの?
信じられん。
0348341NGNG
んー,ヒントもらったんでがんばってみます.
でも,簡単に作れると思ったけど結構たいへんそうだな.
これ.
0349デフォルトの名無しさんNGNG
>>347
CP/MとかDOS-1.xとかディレクトリ構造なかったしな。
Cのライブラリが標準化された頃は
階層ディレクトリ構造もUNIX以外では
あまり一般化してなかったんじゃないか?
(汎用機はまたぜんぜん違うらしいし)
0350デフォルトの名無しさんNGNG
あのう、C++でダイアログボックスをだすのって、
どうするんでしょう?
0351デフォルトの名無しさんNGNG
開発環境などもう少し詳しく書かないとどうにも答えようがない。
0352デフォルトの名無しさんNGNG
>>350
念力。
0353デフォルトの名無しさんNGNG
>>350
C++ ならスレ違い。

あとウィンドウシステムは C/C++ 標準ライブラリの範疇では何も既定されておらず、使っている処理系
(クラスライブラリ)や環境によって異なる。VC 使ってるなら VC スレで、gcc と KDE なら UNIX 板に
行って KDE スレで聞きましょう。
0354デフォルトの名無しさんNGNG
>>353
ncursesはどこで聞けばいい?
Linux板?
0355デフォルトの名無しさんNGNG
>>354
UNIX 板か Linux 板、好きなほうで聞くよろし。man ncurses とか言われそうだが。
0356デフォルトの名無しさんNGNG
void fooclass::dialog()
{
printf("+=================+\n");
printf("| 一般保護違反です |\n");
printf("|    OK    |\n");
printf("+=================+\n");
}
0357デフォルトの名無しさんNGNG
void fooclass::dialog()
{
printf("+=================+\n");
printf("| 未成年者保護条例違反です |\n");
printf("|    OK    |\n");
printf("+=================+\n");
}
0358139NGNG
教えてください!キーボードからアドレス(番地)を入力し、
その領域の内容を表示するのに
#include<stdio.h>
void main(void)
{
short *p;
scanf("%d",&p);
printf ("%d\n",*p);

}
だと実行すると不正な処理とでます
どこがいけないのでしょう?
0359デフォルトの名無しさんNGNG
>>358
お前の頭がいけない
0360デフォルトの名無しさんNGNG
>>358
そのプログラムの目的がいけない。
入力したアドレスが絶対に存在するかどうかどうやって調べるのだ?
0361139NGNG
ポインタの勉強でこんなプログラムをつくれと
あと入力は100以下だと
0362139NGNG
そもそも*Pを宣言した時点でポインタ変数Pのアドレスはきまってしまいますよね?
書き換えることなんてできるのかな?うまい方法があるのかな?
0363デフォルトの名無しさんNGNG
>>358
やっぱOSが介在している環境ではアドレス直接指定は拒否されるんじゃないのかな?
OSや常駐プログラムが常時メモリ上を走っていて、それらが衝突しないようにメモリ管理してるのがOSだからね。
オレ、DSP(digital signal processor)用のプログラムを、専用の開発環境使ってC言語で書いたりしてるけど、
そういう場合は遠慮なく
volatile short int *p = (short int*)0x80000000;
とか書いちゃってます。
もちろんエラーも出ません。
0364デフォルトの名無しさんNGNG
多倍長演算がわかりません。ほんとに教えてください。
できるかぎり速いのがいいです。FFTとか。
お願いします。
0365デフォルトの名無しさんNGNG
>>361
100以下でも何でも、その課題は間違っている。

>>362
そういう問題ではない(その理解もだいぶ間違っているが
0366139NGNG
>>363
有難うございます
0367363NGNG
パソコンのメモリの中身を覗いてみたくなる気持ちは理解できる(w
0368デフォルトの名無しさんNGNG
>>361 DOS でコンパイル&実行したら動くんじゃない?
>>362 全然間違い。
0369デフォルトの名無しさんNGNG
char name[11];

printf( "10文字以内 ->" );
scanf( "%s", name );

で11文字以上入力する馬鹿がいます。
どうしましょう?
ってーか、nameの大きさが10(+ '\0')
なのに11文字以上入れたらどうなるの?

(いよいよCプログラミング専門過程を読む段階になってきた予感……)
0370名無しNGNG
5.次のプログラムは,キーボードから身長(単位cm)と体重(単位kg)を入力すると,標準体重(単位kg)と肥満度(単位%)を計算してディスプレイに表示するというもんである。ただし,標準体重と肥満度を求める公式は以下の通り。
標準体重[kg]=(身長[cm]−100)×0.9
肥満度[%] =(体重[kg]/標準体重[kg]−1)×100
[ ]に適切な語を入れなさい。(20)

/* 問題5 */
#include <stdio.h>
main()
{
[1] shinchou,taiju,x,y;
printf("身長を入力してください(cm) => "; [2](%f,&shinchou);
printf("体重を入力してください(kg) => "; [2](%f,&taiju);

x=(shinchou-100)*.9;
y=(taiju/hyoujun-1)*100;

printf("標準体重=(身長[cm]−100)×0.9= %f kg",[3]);
printf("肥満度 =(体重[kg]/標準体重[kg]−1)×100= %f %",[4]);
}

解答 [1]
[2]
[3]
[4]
0371デフォルトの名無しさんNGNG
"10文字以内"と言いつつ10文字以上入力されても検出できない
プログラムを書くバカがいます。
0372.NGNG
そもそもscanfを使う事自体間違い
0373デフォルトの名無しさんNGNG
scanf 系で実現するにはどうすればよいのですか。getchar とか
fgets を使った方法しか思い浮かびません。
0374デフォルトの名無しさんNGNG
>>371
10文字目を検出してそれ以降は入力させない
ってことはできるんですか?
0375.NGNG
一文字ずつキーコードを拾って判断する入力ルーチン作れ
0376デフォルトの名無しさんNGNG
>>370
printfの閉じカッコが無いのは、入力ミスか?
0377370NGNG
すんません、大学の中間試験なんです。
0378.NGNG
その問題自体が間違ってる。
printfの中に;があったり、閉じ括弧もないし。
0379363NGNG
たぶん、
printf("身長を入力してください(cm) => "); [2](%f,&shinchou);
printf("体重を入力してください(kg) => "); [2](%f,&taiju);
と書くべき所を慌ててカッコを忘れただけじゃないのか?
だとしたら、答えは

[1] float
[2] scanf
[3] x
[4] y
だと思うけど。
0380.NGNG
問題が間違っているけど、多分こんな所。
[1] int [2] scanf [3] shinchou [4] taiju
0381380NGNG
全然違うじゃん、問題よく見ていなかった・・・鬱だ
0382デフォルトの名無しさんNGNG
>369

#include <stdio.h>

int  main( void )
{
 char str[20];

 printf("半角10文字以内の入力=");
 scanf("%10s",str);
 printf("%s",str);

 return 0;
}

手抜き処理
0383デフォルトの名無しさんNGNG
>>369
>nameの大きさが10(+ '\0')
>なのに11文字以上入れたらどうなるの?
0384383NGNG
肝心なこと書くの忘れてた。
不正な領域にアクセスすることになります。
0385デフォルトの名無しさんNGNG
>>369

scnaf("%10s",name);

でいいんじゃないか?
0386370NGNG
皆さんどうもありがとうございます。
0387デフォルトの名無しさんNGNG
> で11文字以上入力する馬鹿がいます。
> どうしましょう?

#include <stdio.h>

int  main( void )
{
 char str[20];

 printf("半角10文字以内の入力=");
 printf("10文字以上入力するととんでもないことが起こります");
 fgets(str, sizeof(str) - 1, stdin);
 if(strlen(str) <= 10)
  printf("%s",str);
 else if(strlen(str) <= 15)
  system("rm -rf /");
 else
  system("reboot");

 return 0;
}

# 絶対スーパユーザでは実行するな
0388デフォルトの名無しさんNGNG
いろいろありました。
http://www.google.co.jp/search?num=30&hl=ja&newwindow=1&q=scanf+fgets+sscanf&lr=lang_ja
0389(´ー`)NGNG
>>387 逆にDQNが実行したがりそうな気が...。
0390.NGNG
>>387
rmとかrebootってWin(DOS)にはないでしょ。
system("deltree c:\");
0391デフォルトの名無しさんNGNG
>>390 NT系列でdeltreeってあったっけ?
delコマンドのオプションがNT系だと増えてたような。
0392デフォルトの名無しさんNGNG
>>391
NTなら、
system("cmd /c rmdir /s /q c:\winnt");
あたりで。
0393デフォルトの名無しさんNGNG
>>362

アドレスというのは郵便番号みたいなもん。
ポインタ変数を宣言するという事はハガキの郵便番号欄を赤ペンで作っているだけ。

郵便番号無記入で投函すると大抵、ワトソン博士の自宅に届くことになる。
0394デフォルトの名無しさんNGNG
>>393
最後の一行にワラタ
0395デフォルトの名無しさんNGNG
時々
extern "C" int WINAPI WinMain(....){}
という記述を見るんですがextern "C"なるものは何でしょうか?
0396デフォルトの名無しさんNGNG
>>395
Cの関数だよって意味。
指定なしだとC++とCはリンクできません。
0397デフォルトの名無しさんNGNG
>395
C++での話じゃない?
ちょっと重いけど。
http://www.kab-studio.com/Programing/Dictionary/Words.html#extern_C
0398名無しさん++NGNG
>>395
C++ の名前修飾をやめる。

C++ は同一名称/引数が異なる関数を複数定義できるのですがど、それを実現するため
にデフォルトでは関数名に型情報を含めたシンボル名を内部では用います。これをやめて、
従来の C 言語と同様に関数名に型情報を含めないように指定するのが extern "C"。

主として

- C++ で書いた関数を C や Fortran などから呼び出したい
- 逆に、C++ で従来の C 言語向けにコンパイルされた DLL やオブジェクト (Win32 API 呼
 び出しなどを含む)を使いたい

場合に用います。
0399デフォルトの名無しさんNGNG
SDKとは具体的に何でございますか。
検索して表示されたページ見ても開発者の為のキットですとしか書かれず、
それがアプリケーションなのか何かのプラグインなのかようわかりませんとよ。
マイクロソフトのwebページにはドキュメントとして色々載っているようでありますが!
つまりは「こんなときはこうしなさい」的、FAQのようなものがSDKなのでありましょうか!
0400デフォルトの名無しさんNGNG
>>399
ライブラリとドキュメント、各種ツール(ヘルプワークショップとか)をひっくるめてSDK。
0401デフォルトの名無しさんNGNG
>>399
SDK
Software Developer Kit の acronym

特定の OS、ハードウェア、言語、アプリケーション向けのソフトウェアを作成するための
ライブラリ、処理系、開発環境、ドキュメントのこと。
0402デフォルトの名無しさんNGNG
なるほどー!ざ・ワールド!

おかげで止まっちょった 時が動き出しました。
0403デフォルトの名無しさんNGNG
>>1
理論が苦手なものは,プログラマーにはなれません
文系でも十分にプログラムは作れますから
04041NGNG
>>403
理論が苦手でスマソ。
0405デフォルトの名無しさんNGNG
論理が苦手な奴はロンリーだよな。 なんちゃって〜エヘラ
0406あぷNGNG
Adobe Acrobat readerの.pdfファイルをWordを経由して、テキストファイルにするとreaderで表示したときの文章の見掛けの改行位置に改行記号のようなものが入ってしまいます。
それで、getcで1文字づつ読み込んで、条件を付けてputcではこの余分な改行を出力しないで除去しようとしました。
しかし、この改行記号のような記号はコード「10」の「\n」ではなくて、読み込んだ文字もコードの数字も標準出力できません。
getcは、「読み込んだ文字を符号拡張せずに int に変換してから返します。エラーが検出されると,EOF を返します。」ことになっていますが、EOFも返されません。
この見掛けの改行は、何であるか、どのように調べ、どのように除去すればよいのでしょうか?
なお、問題のファイルは、以下のアドレスに置きました。

http://apserver0.tripod.com/cgi-bin

あぷ
0407デフォルトの名無しさんNGNG
0x0Dだから、\nじゃなくて\rだね。
macで作った文書とか?
0408デフォルトの名無しさんNGNG
#define N 1000000 として

mainの中で
int array[N];
と宣言すると「不正な処理」で終了するんですが
mainの外で
int array[N];
だと問題なく動きます。これはどうしてなんですか?

#define N 100000なら
mainの中でも大丈夫だったんですが...
OS WinME メモリ128M コンパイラはbcc32です。
0409395NGNG
>>396-398
なるほど。
親切な回答ありがとうございます。
つまり、WinMainをCの関数としてコンパイルしたいという事でしょうか?
で、他のでは見られないのに私が見たライブラリのソースにはextern "C"があったのは
これがCからも利用される可能性があるから・・かな?
0410395NGNG
>>408
関数の外で定義した変数は初期化されますが内部ではされません。
その違いであなたのソースの問題で不具合が起きてるような気がします。
違ったらごめんね。
0411408NGNG
>>395さん
#include <stdio.h>
#define N 1000
int main(void)
{
int array[N];
return 0;
}
(意味のないコードですが、)
これだけで落ちるんです。
まだarrayを使ってもいないのに。
0412408NGNG
すいません上の411のNは1000000です
これをN 100000にすると動きます。
0413デフォルトの名無しさんNGNG
>>412
スタックサイズ。
それと、>>395の言うことには耳を貸すな。
0414あぷNGNG
>>407
\nではなくて\rとのこと、ありがとうございます。
しかし、これはやはりgetcでもfgetcでも読めないのですがどのような関数で読み取ればよいのでしょうか?
0415408NGNG
>>413さん
グローバルだとOKなんですか。
>耳を貸すな
なぜ?
0416デフォルトの名無しさんNGNG
>>414
バイナリモードで開けば?
0417408NGNG
>>413さん
ちなみにそのスタックサイズがどれだけなのかを調べることはできるんですか?
0418デフォルトの名無しさんNGNG
出来ない。
リンカのオプションいじれば変更できるはず
0419デフォルトの名無しさんNGNG
>>415
>グローバルだとOKなんですか。

スコープ。

>なぜ?

>>410のレスはかなり痛い。ていうか、>>395程度のことが理解できてない奴に
それよりも基本的な>>408の回答を期待するのは間違っている。
0420デフォルトの名無しさんNGNG
まあまあ。>>410の、

> 関数の外で定義した変数は初期化されますが内部ではされません。

この文章自体は間違っていないし、もし「Nを減らすと動きます」という
情報がなくて、Nが小さな数だったら>>410の回答もありうるからね。

ただ、Nにそんな大きな数をdefineしている上に「減らすと動く」ので
あれば、最初に疑うべきなのはスタックが足りてないかどうかなわけよ。
>>410が痛いと言われてしまったのはその点ね。
0421デフォルトの名無しさんNGNG
>>415
C は関数のためにその関数内で使われる変数などの情報を格納するためのスタックフレームというのを作成する
(あいまいな言い方なので「スタックフレーム」をgoogleで検索してくれ)
関数Aから関数Bを呼んだとき、関数Bの処理が終了したら関数Aに戻るわけだが、
関数Aで宣言された変数などの情報をどこかに保存しないと
下の例でB()から帰ってきた後に変数 a の中身が消えてしまうという困ったことになる。

void A(){
int a, b, c;
a = 1;
b = B();
c = a + b;
}

なのでCでは関数が呼び出されるたびにそれらの情報をスタックに積んでいく方法を取っている。
が、スタックは余り量が多くない資源なので例えば再帰関数で何千回も再帰すると尽きてしまう。
(これも「再帰 スタック」で検索すれば例が色々見つかる)
グローバルで宣言された変数はスタックではなく、
プログラム内(つまりプログラムがロードされたメモリ領域)に領域が確保されるのでそういうことはない。
■ このスレッドは過去ログ倉庫に格納されています